Version 1.6.0-dev.0.0

svn merge -r 36978:37722 --accept theirs-full https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@37743 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/analysis_server/lib/driver.dart b/pkg/analysis_server/lib/driver.dart
index 911cbc6..78d198f 100644
--- a/pkg/analysis_server/lib/driver.dart
+++ b/pkg/analysis_server/lib/driver.dart
@@ -82,6 +82,7 @@
       if (serve_http) {
         httpServer.close();
       }
+      exit(0);
     });
   }
 
diff --git a/pkg/analysis_server/lib/src/analysis_manager.dart b/pkg/analysis_server/lib/src/analysis_manager.dart
index 2c4ad01..0a5dc85 100644
--- a/pkg/analysis_server/lib/src/analysis_manager.dart
+++ b/pkg/analysis_server/lib/src/analysis_manager.dart
@@ -121,7 +121,7 @@
       return channel.close().then((_) => false);
     }
     return channel
-        .sendRequest(new Request('0', METHOD_SHUTDOWN))
+        .sendRequest(new Request('0', SERVER_SHUTDOWN))
         .timeout(new Duration(seconds: 2), onTimeout: () {
           print('Expected shutdown response');
         })
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index db5be05..3ddb9f7 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -5,6 +5,7 @@
 library analysis.server;
 
 import 'dart:async';
+import 'dart:collection';
 
 import 'package:analysis_server/src/analysis_logger.dart';
 import 'package:analysis_server/src/channel.dart';
@@ -14,6 +15,8 @@
 import 'package:analysis_server/src/operation/operation_analysis.dart';
 import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/operation/operation_queue.dart';
+import 'package:analysis_server/src/package_map_provider.dart';
+import 'package:analysis_server/src/package_uri_resolver.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/resource.dart';
 import 'package:analyzer/src/generated/ast.dart';
@@ -24,6 +27,7 @@
 import 'package:analyzer/src/generated/sdk_io.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/index.dart';
 
 
 /**
@@ -35,18 +39,36 @@
 class AnalysisServerContextDirectoryManager extends ContextDirectoryManager {
   final AnalysisServer analysisServer;
 
+  /**
+   * The default options used to create new analysis contexts.
+   */
+  AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl();
+
   AnalysisServerContextDirectoryManager(this.analysisServer, ResourceProvider resourceProvider)
       : super(resourceProvider);
 
-  void addContext(Folder folder, File pubspecFile) {
+  @override
+  void addContext(Folder folder) {
+    Map<String, List<Folder>> packageMap =
+        analysisServer.packageMapProvider.computePackageMap(folder);
     ContextDirectory contextDirectory = new ContextDirectory(
-        analysisServer.defaultSdk, folder, pubspecFile);
+        analysisServer.defaultSdk, resourceProvider, folder, packageMap);
     analysisServer.folderMap[folder] = contextDirectory;
-    analysisServer.schedulePerformAnalysisOperation(contextDirectory.context);
+    AnalysisContext context = contextDirectory.context;
+    context.analysisOptions = new AnalysisOptionsImpl.con1(defaultOptions);
+    analysisServer.schedulePerformAnalysisOperation(context);
   }
 
+  @override
   void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) {
-    analysisServer.folderMap[contextFolder].context.applyChanges(changeSet);
+    AnalysisContext context = analysisServer.folderMap[contextFolder].context;
+    context.applyChanges(changeSet);
+    analysisServer.schedulePerformAnalysisOperation(context);
+  }
+
+  @override
+  void removeContext(Folder folder) {
+    analysisServer.folderMap.remove(folder);
   }
 }
 
@@ -62,12 +84,23 @@
   final ServerCommunicationChannel channel;
 
   /**
+   * The [Index] for this server.
+   */
+  final Index index;
+
+  /**
    * [ContextDirectoryManager] which handles the mapping from analysis roots
    * to context directories.
    */
   AnalysisServerContextDirectoryManager contextDirectoryManager;
 
   /**
+   * Provider which is used to determine the mapping from package name to
+   * package folder.
+   */
+  final PackageMapProvider packageMapProvider;
+
+  /**
    * A flag indicating whether the server is running.  When false, contexts
    * will no longer be added to [contextWorkQueue], and [performOperation] will
    * discard any tasks it finds on [contextWorkQueue].
@@ -88,7 +121,8 @@
   /**
    * A table mapping [Folder]s to the [ContextDirectory]s associated with them.
    */
-  final Map<Folder, ContextDirectory> folderMap = <Folder, ContextDirectory>{};
+  final Map<Folder, ContextDirectory> folderMap =
+      new HashMap<Folder, ContextDirectory>();
 
   /**
    * A queue of the operations to perform in this server.
@@ -102,13 +136,14 @@
   /**
    * A set of the [ServerService]s to send notifications for.
    */
-  Set<ServerService> serverServices = new Set<ServerService>();
+  Set<ServerService> serverServices = new HashSet<ServerService>();
 
   /**
    * A table mapping [AnalysisService]s to the file paths for which these
    * notifications should be sent.
    */
-  Map<AnalysisService, Set<String>> analysisServices = <AnalysisService, Set<String>>{};
+  Map<AnalysisService, Set<String>> analysisServices =
+      new HashMap<AnalysisService, Set<String>>();
 
   /**
    * True if any exceptions thrown by analysis should be propagated up the call
@@ -126,24 +161,17 @@
    * running a full analysis server.
    */
   AnalysisServer(this.channel, ResourceProvider resourceProvider,
-      {this.rethrowExceptions: true}) {
+      this.packageMapProvider, this.index, {this.rethrowExceptions: true}) {
     operationQueue = new ServerOperationQueue(this);
     contextDirectoryManager = new AnalysisServerContextDirectoryManager(this, resourceProvider);
     AnalysisEngine.instance.logger = new AnalysisLogger();
     running = true;
-    Notification notification = new Notification(NOTIFICATION_CONNECTED);
+    Notification notification = new Notification(SERVER_CONNECTED);
     channel.sendNotification(notification);
     channel.listen(handleRequest, onDone: done, onError: error);
   }
 
   /**
-   * Schedules analysis of the given context.
-   */
-  void schedulePerformAnalysisOperation(AnalysisContext context) {
-    scheduleOperation(new PerformAnalysisOperation(context, false));
-  }
-
-  /**
    * Schedules execution of the given [ServerOperation].
    */
   void scheduleOperation(ServerOperation operation) {
@@ -155,6 +183,81 @@
   }
 
   /**
+   * Schedules analysis of the given context.
+   */
+  void schedulePerformAnalysisOperation(AnalysisContext context) {
+    scheduleOperation(new PerformAnalysisOperation(context, false));
+  }
+
+  /**
+   * Send the given [notification] to the client.
+   */
+  void sendNotification(Notification notification) {
+    channel.sendNotification(notification);
+  }
+
+  /**
+   * Set the priority files to the given [files].
+   */
+  void setPriorityFiles(Request request, List<String> files) {
+    Map<AnalysisContext, List<Source>> sourceMap =
+        new HashMap<AnalysisContext, List<Source>>();
+    List<String> unanalyzed = new List<String>();
+    files.forEach((file) {
+      AnalysisContext analysisContext = _getAnalysisContext(file);
+      if (analysisContext == null) {
+        unanalyzed.add(file);
+      } else {
+        List<Source> sourceList = sourceMap[analysisContext];
+        if (sourceList == null) {
+          sourceList = <Source>[];
+          sourceMap[analysisContext] = sourceList;
+        }
+        sourceList.add(_getSource(file));
+      }
+    });
+    if (unanalyzed.isNotEmpty) {
+      StringBuffer buffer = new StringBuffer();
+      buffer.writeAll(unanalyzed, ', ');
+      throw new RequestFailure(new Response.unanalyzedPriorityFiles(request,
+          buffer.toString()));
+    }
+    folderMap.forEach((Folder folder, ContextDirectory directory) {
+      AnalysisContext context = directory.context;
+      List<Source> sourceList = sourceMap[context];
+      if (sourceList == null) {
+        sourceList = Source.EMPTY_ARRAY;
+      }
+      context.analysisPriorityOrder = sourceList;
+    });
+  }
+
+  /**
+   * Use the given updaters to update the values of the options in every
+   * existing analysis context.
+   */
+  void updateOptions(List<OptionUpdater> optionUpdaters) {
+    //
+    // Update existing contexts.
+    //
+    folderMap.forEach((Folder folder, ContextDirectory directory) {
+      AnalysisContext context = directory.context;
+      AnalysisOptionsImpl options = new AnalysisOptionsImpl.con1(context.analysisOptions);
+      optionUpdaters.forEach((OptionUpdater optionUpdater) {
+        optionUpdater(options);
+      });
+      context.analysisOptions = options;
+    });
+    //
+    // Update the defaults used to create new contexts.
+    //
+    AnalysisOptionsImpl options = contextDirectoryManager.defaultOptions;
+    optionUpdaters.forEach((OptionUpdater optionUpdater) {
+      optionUpdater(options);
+    });
+  }
+
+  /**
    * Adds the given [ServerOperation] to the queue, but does not schedule
    * operations execution.
    */
@@ -166,6 +269,7 @@
    * The socket from which requests are being read has been closed.
    */
   void done() {
+    index.stop();
     running = false;
   }
 
@@ -177,6 +281,23 @@
     running = false;
   }
 
+// TODO(brianwilkerson) Add the following method after 'prioritySources' has
+// been added to InternalAnalysisContext.
+//  /**
+//   * Return a list containing the full names of all of the sources that are
+//   * priority sources.
+//   */
+//  List<String> getPriorityFiles() {
+//    List<String> priorityFiles = new List<String>();
+//    folderMap.values.forEach((ContextDirectory directory) {
+//      InternalAnalysisContext context = directory.context;
+//      context.prioritySources.forEach((Source source) {
+//        priorityFiles.add(source.fullName);
+//      });
+//    });
+//    return priorityFiles;
+//  }
+
   /**
    * Handle a [request] that was read from the communication channel.
    */
@@ -250,11 +371,7 @@
    * 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(NOTIFICATION_STATUS);
+    Notification notification = new Notification(SERVER_STATUS);
     Map<String, Object> analysis = new Map();
     if (contextId != null) {
       analysis['analyzing'] = true;
@@ -297,6 +414,10 @@
   void updateContent(Map<String, ContentChange> changes) {
     changes.forEach((file, change) {
       AnalysisContext analysisContext = _getAnalysisContext(file);
+      // TODO(paulberry): handle the case where a file is referred to by more
+      // than one context (e.g package A depends on package B using a local
+      // path, user has both packages open for editing in separate contexts,
+      // and user modifies a file in package B).
       if (analysisContext != null) {
         Source source = _getSource(file);
         if (change.offset == null) {
@@ -325,10 +446,22 @@
           List<AnalysisError> errors = analysisContext.getErrors(source).errors;
           sendAnalysisNotificationErrors(this, file, errors);
         }
-        if (service == AnalysisService.HIGHLIGHTS) {
-          CompilationUnit dartUnit = test_getResolvedCompilationUnit(file);
+        // Dart unit notifications.
+        if (AnalysisEngine.isDartFileName(file)) {
+          CompilationUnit dartUnit = getResolvedCompilationUnitToResendNotification(file);
           if (dartUnit != null) {
-            sendAnalysisNotificationHighlights(this, file, dartUnit);
+            switch (service) {
+              case AnalysisService.HIGHLIGHTS:
+                sendAnalysisNotificationHighlights(this, file, dartUnit);
+                break;
+              case AnalysisService.NAVIGATION:
+                // TODO(scheglov) consider support for one unit in 2+ libraries
+                sendAnalysisNotificationNavigation(this, file, dartUnit);
+                break;
+              case AnalysisService.OUTLINE:
+                sendAnalysisNotificationOutline(this, file, dartUnit);
+                break;
+            }
           }
         }
       }
@@ -359,6 +492,33 @@
   }
 
   /**
+   * Returns the [CompilationUnit] of the Dart file with the given [path] that
+   * should be used to resend notifications for already resolved unit.
+   * Returns `null` if the file is not a part of any context, library has not
+   * been yet resolved, or any problem happened.
+   */
+  CompilationUnit getResolvedCompilationUnitToResendNotification(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;
+    }
+    // if library has not been resolved yet, the unit will be resolved later
+    Source librarySource = librarySources[0];
+    if (context.getLibraryElement(librarySource) == null) {
+      return null;
+    }
+    // if library has been already resolved, resolve unit
+    return context.resolveCompilationUnit2(unitSource, librarySource);
+  }
+
+  /**
    * Return the [CompilationUnit] of the Dart file with the given [path].
    * Return `null` if the file is not a part of any context.
    */
@@ -386,13 +546,6 @@
   }
 
   /**
-   * Send the given [notification] to the client.
-   */
-  void sendNotification(Notification notification) {
-    channel.sendNotification(notification);
-  }
-
-  /**
    * Schedules [performOperation] exection.
    */
   void _schedulePerformOperation() {
@@ -428,30 +581,32 @@
  */
 class ContextDirectory {
   /**
+   * The root [ResourceProvider] of this [ContextDirectory].
+   */
+  final ResourceProvider _resourceProvider;
+
+  /**
    * 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) {
+  ContextDirectory(DartSdk sdk, this._resourceProvider, this._folder,
+      Map<String, List<Folder>> packageMap) {
     // 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(),
-    ]);
+    List<UriResolver> resolvers = <UriResolver>[new DartUriResolver(sdk),
+        new ResourceUriResolver(_resourceProvider),
+    ];
+    if (packageMap != null) {
+      resolvers.add(new PackageMapUriResolver(_resourceProvider, packageMap));
+    }
+    _context.sourceFactory = new SourceFactory(resolvers);
   }
 
   /**
@@ -460,6 +615,7 @@
   AnalysisContext get context => _context;
 }
 
+typedef void OptionUpdater(AnalysisOptionsImpl options);
 
 /**
  * An enumeration of the services provided by the server domain.
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 06a3db4..f1cf201 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -4,6 +4,7 @@
 
 library computer.highlights;
 
+import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/scanner.dart';
@@ -263,7 +264,7 @@
   }
 
   void _addRegion(int offset, int length, HighlightType type) {
-    _regions.add({'offset': offset, 'length': length, 'type': type.name});
+    _regions.add({OFFSET: offset, LENGTH: length, TYPE: type.name});
   }
 
   bool _addRegion_node(AstNode node, HighlightType type) {
@@ -510,8 +511,5 @@
 
   final String name;
 
-  @override
-  String toString() => name;
-
   const HighlightType(this.name);
 }
diff --git a/pkg/analysis_server/lib/src/computer/computer_navigation.dart b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
index d329425..27aca2b 100644
--- a/pkg/analysis_server/lib/src/computer/computer_navigation.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
@@ -4,11 +4,14 @@
 
 library computer.navigation;
 
+import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/source.dart';
 
+import 'element.dart' as computer;
+
 
 /**
  * A computer for navigation regions in a Dart [CompilationUnit].
@@ -16,7 +19,7 @@
 class DartUnitNavigationComputer {
   final CompilationUnit _unit;
 
-  List<Map<String, Object>> _regions = <Map<String, Object>>[];
+  final List<Map<String, Object>> _regions = <Map<String, Object>>[];
 
   DartUnitNavigationComputer(this._unit);
 
@@ -34,12 +37,24 @@
       return;
     }
     _regions.add({
-      'offset': offset,
-      'length': length,
-      'targets': [target]
+      OFFSET: offset,
+      LENGTH: length,
+      TARGETS: [target]
     });
   }
 
+  void _addRegionForNode(AstNode node, Element element) {
+    int offset = node.offset;
+    int length = node.length;
+    _addRegion(offset, length, element);
+  }
+
+  void _addRegionForToken(Token token, Element element) {
+    int offset = token.offset;
+    int length = token.length;
+    _addRegion(offset, length, element);
+  }
+
   void _addRegion_nodeStart_nodeEnd(AstNode a, AstNode b, Element element) {
     int offset = a.offset;
     int length = b.end - offset;
@@ -58,18 +73,6 @@
     _addRegion(offset, length, element);
   }
 
-  void _addRegionForNode(AstNode node, Element element) {
-    int offset = node.offset;
-    int length = node.length;
-    _addRegion(offset, length, element);
-  }
-
-  void _addRegionForToken(Token token, Element element) {
-    int offset = token.offset;
-    int length = token.length;
-    _addRegion(offset, length, element);
-  }
-
   /**
    * Returns the JSON for the given [Element], maybe `null` if `null` was given.
    */
@@ -94,10 +97,10 @@
     }
     // return as JSON
     return {
-      'file': source.fullName,
-      'offset': offset,
-      'length': length,
-      'elementId': element.location.encoding
+      FILE: source.fullName,
+      OFFSET: offset,
+      LENGTH: length,
+      ELEMENT: new computer.Element.fromEngine(element).toJson()
     };
   }
 }
@@ -131,7 +134,8 @@
         lastNode = firstNode;
       }
       if (firstNode != null && lastNode != null) {
-        computer._addRegion_nodeStart_nodeEnd(firstNode, lastNode, node.element);
+        computer._addRegion_nodeStart_nodeEnd(firstNode, lastNode,
+            node.element);
       }
     }
     return super.visitConstructorDeclaration(node);
@@ -175,13 +179,15 @@
 
   @override
   visitPartDirective(PartDirective node) {
-    computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, node.element);
+    computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri,
+        node.element);
     return super.visitPartDirective(node);
   }
 
   @override
   visitPartOfDirective(PartOfDirective node) {
-    computer._addRegion_tokenStart_nodeEnd(node.keyword, node.libraryName, node.element);
+    computer._addRegion_tokenStart_nodeEnd(node.keyword, node.libraryName,
+        node.element);
     return super.visitPartOfDirective(node);
   }
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index 3609759..d997f8c 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -4,8 +4,10 @@
 
 library computer.outline;
 
+import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart' as engine;
 
 
 /**
@@ -20,11 +22,11 @@
    * Returns the computed outline, not `null`.
    */
   Map<String, Object> compute() {
-    _Outline unitOutline = _newUnitOutline();
+    Outline unitOutline = _newUnitOutline();
     for (CompilationUnitMember unitMember in _unit.declarations) {
       if (unitMember is ClassDeclaration) {
         ClassDeclaration classDeclaration = unitMember;
-        _Outline classOutline = _newClassOutline(unitOutline, classDeclaration);
+        Outline classOutline = _newClassOutline(unitOutline, classDeclaration);
         for (ClassMember classMember in classDeclaration.members) {
           if (classMember is ConstructorDeclaration) {
             ConstructorDeclaration constructorDeclaration = classMember;
@@ -35,9 +37,11 @@
             VariableDeclarationList fields = fieldDeclaration.fields;
             if (fields != null) {
               TypeName fieldType = fields.type;
-              String fieldTypeName = fieldType != null ? fieldType.toSource() : "";
+              String fieldTypeName = fieldType != null ? fieldType.toSource() :
+                  '';
               for (VariableDeclaration field in fields.variables) {
-                _newVariableOutline(classOutline, fieldTypeName, _OutlineKind.FIELD, field, fieldDeclaration.isStatic);
+                _newVariableOutline(classOutline, fieldTypeName,
+                    ElementKind.FIELD, field, fieldDeclaration.isStatic);
               }
             }
           }
@@ -52,15 +56,16 @@
         VariableDeclarationList fields = fieldDeclaration.variables;
         if (fields != null) {
           TypeName fieldType = fields.type;
-          String fieldTypeName = fieldType != null ? fieldType.toSource() : "";
+          String fieldTypeName = fieldType != null ? fieldType.toSource() : '';
           for (VariableDeclaration field in fields.variables) {
-            _newVariableOutline(unitOutline, fieldTypeName, _OutlineKind.TOP_LEVEL_VARIABLE, field, false);
+            _newVariableOutline(unitOutline, fieldTypeName,
+                ElementKind.TOP_LEVEL_VARIABLE, field, false);
           }
         }
       }
       if (unitMember is FunctionDeclaration) {
         FunctionDeclaration functionDeclaration = unitMember;
-        _newFunctionOutline(unitOutline, functionDeclaration);
+        _newFunctionOutline(unitOutline, functionDeclaration, true);
       }
       if (unitMember is ClassTypeAlias) {
         ClassTypeAlias alias = unitMember;
@@ -74,7 +79,7 @@
     return unitOutline.toJson();
   }
 
-  void _addLocalFunctionOutlines(_Outline parent, FunctionBody body) {
+  void _addLocalFunctionOutlines(Outline parent, FunctionBody body) {
     body.accept(new _LocalFunctionOutlinesVisitor(this, parent));
   }
 
@@ -125,149 +130,209 @@
     return new _SourceRegion(prevSiblingEnd, endOffset - prevSiblingEnd);
   }
 
-  _Outline _newClassOutline(_Outline parent, ClassDeclaration classDeclaration) {
+  Outline _newClassOutline(Outline parent, ClassDeclaration classDeclaration) {
     SimpleIdentifier nameNode = classDeclaration.name;
     String name = nameNode.name;
     _SourceRegion sourceRegion = _getSourceRegion(classDeclaration);
-    _Outline outline = new _Outline(
-        _OutlineKind.CLASS, name,
-        nameNode.offset, nameNode.length,
-        sourceRegion.offset, sourceRegion.length,
-        classDeclaration.isAbstract, false,
-        null, null);
+    Element element = new Element(ElementKind.CLASS, name, nameNode.offset,
+        nameNode.length, Identifier.isPrivateName(name), _isDeprecated(
+        classDeclaration), isAbstract: classDeclaration.isAbstract);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
     return outline;
   }
 
-  void _newClassTypeAlias(_Outline parent, ClassTypeAlias alias) {
+  void _newClassTypeAlias(Outline parent, ClassTypeAlias alias) {
     SimpleIdentifier nameNode = alias.name;
     String name = nameNode.name;
     _SourceRegion sourceRegion = _getSourceRegion(alias);
-    _Outline outline = new _Outline(
-        _OutlineKind.CLASS_TYPE_ALIAS, name,
-        nameNode.offset, nameNode.length,
-        sourceRegion.offset, sourceRegion.length,
-        alias.isAbstract, false,
-        null, null);
+    Element element = new Element(ElementKind.CLASS_TYPE_ALIAS, name,
+        nameNode.offset, nameNode.length, Identifier.isPrivateName(name), _isDeprecated(
+        alias), isAbstract: alias.isAbstract);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
   }
 
-  void _newConstructorOutline(_Outline parent, ConstructorDeclaration constructor) {
+  void _newConstructorOutline(Outline parent,
+      ConstructorDeclaration constructor) {
     Identifier returnType = constructor.returnType;
     String name = returnType.name;
     int offset = returnType.offset;
     int length = returnType.length;
     SimpleIdentifier constructorNameNode = constructor.name;
+    bool isPrivate = false;
     if (constructorNameNode != null) {
       String constructorName = constructorNameNode.name;
-      name += ".${constructorName}";
+      isPrivate = Identifier.isPrivateName(constructorName);
+      name += '.${constructorName}';
       offset = constructorNameNode.offset;
       length = constructorNameNode.length;
     }
     _SourceRegion sourceRegion = _getSourceRegion(constructor);
     FormalParameterList parameters = constructor.parameters;
-    String parametersStr = parameters != null ? parameters.toSource() : "";
-    _Outline outline = new _Outline(
-        _OutlineKind.CONSTRUCTOR, name,
-        offset, length,
-        sourceRegion.offset, sourceRegion.length,
-        false, false,
-        parametersStr, null);
+    String parametersStr = parameters != null ? parameters.toSource() : '';
+    Element element = new Element(ElementKind.CONSTRUCTOR, name, offset, length,
+        isPrivate, _isDeprecated(constructor), parameters: parametersStr);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
     _addLocalFunctionOutlines(outline, constructor.body);
   }
 
-  void _newFunctionOutline(_Outline parent, FunctionDeclaration function) {
+  void _newFunctionOutline(Outline parent, FunctionDeclaration function,
+      bool isStatic) {
     TypeName returnType = function.returnType;
     SimpleIdentifier nameNode = function.name;
     String name = nameNode.name;
     FunctionExpression functionExpression = function.functionExpression;
     FormalParameterList parameters = functionExpression.parameters;
-    _OutlineKind kind;
+    ElementKind kind;
     if (function.isGetter) {
-      kind = _OutlineKind.GETTER;
+      kind = ElementKind.GETTER;
     } else if (function.isSetter) {
-      kind = _OutlineKind.SETTER;
+      kind = ElementKind.SETTER;
     } else {
-      kind = _OutlineKind.FUNCTION;
+      kind = ElementKind.FUNCTION;
     }
     _SourceRegion sourceRegion = _getSourceRegion(function);
-    String parametersStr = parameters != null ? parameters.toSource() : "";
-    String returnTypeStr = returnType != null ? returnType.toSource() : "";
-    _Outline outline = new _Outline(
-        kind, name,
-        nameNode.offset, nameNode.length,
-        sourceRegion.offset, sourceRegion.length,
-        false, false,
-        parametersStr, returnTypeStr);
+    String parametersStr = parameters != null ? parameters.toSource() : '';
+    String returnTypeStr = returnType != null ? returnType.toSource() : '';
+    Element element = new Element(kind, name, nameNode.offset, nameNode.length,
+        Identifier.isPrivateName(name), _isDeprecated(function), parameters:
+        parametersStr, returnType: returnTypeStr, isStatic: isStatic);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
     _addLocalFunctionOutlines(outline, functionExpression.body);
   }
 
-  void _newFunctionTypeAliasOutline(_Outline parent, FunctionTypeAlias alias) {
+  void _newFunctionTypeAliasOutline(Outline parent, FunctionTypeAlias alias) {
     TypeName returnType = alias.returnType;
     SimpleIdentifier nameNode = alias.name;
     String name = nameNode.name;
     _SourceRegion sourceRegion = _getSourceRegion(alias);
     FormalParameterList parameters = alias.parameters;
-    String parametersStr = parameters != null ? parameters.toSource() : "";
-    String returnTypeStr = returnType != null ? returnType.toSource() : "";
-    _Outline outline = new _Outline(
-        _OutlineKind.FUNCTION_TYPE_ALIAS, name,
-        nameNode.offset, nameNode.length,
-        sourceRegion.offset, sourceRegion.length,
-        false, false,
-        parametersStr, returnTypeStr);
+    String parametersStr = parameters != null ? parameters.toSource() : '';
+    String returnTypeStr = returnType != null ? returnType.toSource() : '';
+    Element element = new Element(ElementKind.FUNCTION_TYPE_ALIAS, name,
+        nameNode.offset, nameNode.length, Identifier.isPrivateName(name), _isDeprecated(
+        alias), parameters: parametersStr, returnType: returnTypeStr);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
   }
 
-  void _newMethodOutline(_Outline parent, MethodDeclaration method) {
+  void _newMethodOutline(Outline parent, MethodDeclaration method) {
     TypeName returnType = method.returnType;
     SimpleIdentifier nameNode = method.name;
     String name = nameNode.name;
     FormalParameterList parameters = method.parameters;
-    _OutlineKind kind;
+    ElementKind kind;
     if (method.isGetter) {
-      kind = _OutlineKind.GETTER;
+      kind = ElementKind.GETTER;
     } else if (method.isSetter) {
-      kind = _OutlineKind.SETTER;
+      kind = ElementKind.SETTER;
     } else {
-      kind = _OutlineKind.METHOD;
+      kind = ElementKind.METHOD;
     }
     _SourceRegion sourceRegion = _getSourceRegion(method);
-    String parametersStr = parameters != null ? parameters.toSource() : "";
-    String returnTypeStr = returnType != null ? returnType.toSource() : "";
-    _Outline outline = new _Outline(
-        kind, name,
-        nameNode.offset, nameNode.length,
-        sourceRegion.offset, sourceRegion.length,
-        method.isAbstract, method.isStatic,
-        parametersStr, returnTypeStr);
+    String parametersStr = parameters != null ? parameters.toSource() : '';
+    String returnTypeStr = returnType != null ? returnType.toSource() : '';
+    Element element = new Element(kind, name, nameNode.offset, nameNode.length,
+        Identifier.isPrivateName(name), _isDeprecated(method), parameters:
+        parametersStr, returnType: returnTypeStr, isAbstract: method.isAbstract,
+        isStatic: method.isStatic);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
     _addLocalFunctionOutlines(outline, method.body);
   }
 
-  _Outline _newUnitOutline() {
-    return new _Outline(
-        _OutlineKind.COMPILATION_UNIT, "<unit>",
-        _unit.offset, _unit.length,
-        _unit.offset, _unit.length,
-        false, false,
-        null, null);
+  Outline _newUnitOutline() {
+    Element element = new Element(ElementKind.COMPILATION_UNIT, '<unit>',
+        _unit.offset, _unit.length, false, false);
+    return new Outline(element, _unit.offset, _unit.length);
   }
 
-  void _newVariableOutline(_Outline parent, String typeName, _OutlineKind kind, VariableDeclaration variable, bool isStatic) {
+  void _newVariableOutline(Outline parent, String typeName, ElementKind kind,
+      VariableDeclaration variable, bool isStatic) {
     SimpleIdentifier nameNode = variable.name;
     String name = nameNode.name;
     _SourceRegion sourceRegion = _getSourceRegion(variable);
-    _Outline outline = new _Outline(
-        kind, name,
-        nameNode.offset, nameNode.length,
-        sourceRegion.offset, sourceRegion.length,
-        false, isStatic,
-        null, typeName);
+    Element element = new Element(kind, name, nameNode.offset, nameNode.length,
+        Identifier.isPrivateName(name), _isDeprecated(variable), returnType: typeName,
+        isStatic: isStatic, isConst: variable.isConst, isFinal: variable.isFinal);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
   }
+
+  /**
+   * Returns `true` if the given [element] is not `null` and deprecated.
+   */
+  static bool _isDeprecated(Declaration declaration) {
+    engine.Element element = declaration.element;
+    return element != null && element.isDeprecated;
+  }
+}
+
+
+/**
+ * An element outline.
+ */
+class Outline {
+  static const List<Outline> EMPTY_ARRAY = const <Outline>[];
+
+  /**
+   * The children of the node.
+   * The field will be omitted in JSON if the node has no children.
+   */
+  final List<Outline> children = <Outline>[];
+
+  /**
+   * A description of the element represented by this node.
+   */
+  final Element element;
+
+  /**
+   * The length of the element.
+   */
+  final int length;
+
+  /**
+   * The offset of the first character of the element.
+   */
+  final int offset;
+
+  Outline(this.element, this.offset, this.length);
+
+  factory Outline.fromJson(Map<String, Object> map) {
+    Element element = new Element.fromJson(map[ELEMENT]);
+    Outline outline = new Outline(element, map[OFFSET], map[LENGTH]);
+    // add children
+    List<Map<String, Object>> childrenMaps = map[CHILDREN];
+    if (childrenMaps != null) {
+      childrenMaps.forEach((childMap) {
+        outline.children.add(new Outline.fromJson(childMap));
+      });
+    }
+    // done
+    return outline;
+  }
+
+  Map<String, Object> toJson() {
+    Map<String, Object> json = {
+      ELEMENT: element.toJson(),
+      OFFSET: offset,
+      LENGTH: length
+    };
+    if (children.isNotEmpty) {
+      json[CHILDREN] = children.map((child) => child.toJson()).toList();
+    }
+    return json;
+  }
 }
 
 
@@ -276,98 +341,22 @@
  */
 class _LocalFunctionOutlinesVisitor extends RecursiveAstVisitor {
   final DartUnitOutlineComputer outlineComputer;
-  final _Outline parent;
+  final Outline parent;
 
   _LocalFunctionOutlinesVisitor(this.outlineComputer, this.parent);
 
   @override
   visitFunctionDeclaration(FunctionDeclaration node) {
-    outlineComputer._newFunctionOutline(parent, node);
+    outlineComputer._newFunctionOutline(parent, node, false);
   }
 }
 
 
-
 /**
  * A range of characters.
  */
 class _SourceRegion {
-  final int offset;
   final int length;
+  final int offset;
   _SourceRegion(this.offset, this.length);
 }
-
-
-/**
- * Element outline kinds.
- */
-class _OutlineKind {
-  static const _OutlineKind CLASS = const _OutlineKind('CLASS');
-  static const _OutlineKind CLASS_TYPE_ALIAS = const _OutlineKind('CLASS_TYPE_ALIAS');
-  static const _OutlineKind COMPILATION_UNIT = const _OutlineKind('COMPILATION_UNIT');
-  static const _OutlineKind CONSTRUCTOR = const _OutlineKind('CONSTRUCTOR');
-  static const _OutlineKind GETTER = const _OutlineKind('GETTER');
-  static const _OutlineKind FIELD = const _OutlineKind('FIELD');
-  static const _OutlineKind FUNCTION = const _OutlineKind('FUNCTION');
-  static const _OutlineKind FUNCTION_TYPE_ALIAS = const _OutlineKind('FUNCTION_TYPE_ALIAS');
-  static const _OutlineKind LIBRARY = const _OutlineKind('LIBRARY');
-  static const _OutlineKind METHOD = const _OutlineKind('METHOD');
-  static const _OutlineKind SETTER = const _OutlineKind('SETTER');
-  static const _OutlineKind TOP_LEVEL_VARIABLE = const _OutlineKind('TOP_LEVEL_VARIABLE');
-  static const _OutlineKind UNKNOWN = const _OutlineKind('UNKNOWN');
-  static const _OutlineKind UNIT_TEST_CASE = const _OutlineKind('UNIT_TEST_CASE');
-  static const _OutlineKind UNIT_TEST_GROUP = const _OutlineKind('UNIT_TEST_GROUP');
-
-  final String name;
-
-  const _OutlineKind(this.name);
-}
-
-
-/**
- * An element outline.
- */
-class _Outline {
-  static const List<_Outline> EMPTY_ARRAY = const <_Outline>[];
-
-  final _OutlineKind kind;
-  final String name;
-  final int nameOffset;
-  final int nameLength;
-  final int elementOffset;
-  final int elementLength;
-  final bool isAbstract;
-  final bool isStatic;
-  final String parameters;
-  final String returnType;
-  final List<_Outline> children = <_Outline>[];
-
-  _Outline(this.kind, this.name,
-           this.nameOffset, this.nameLength,
-           this.elementOffset, this.elementLength,
-           this.isAbstract, this.isStatic,
-           this.parameters, this.returnType);
-
-  Map<String, Object> toJson() {
-    Map<String, Object> json = {
-      KIND: kind.name,
-      NAME: name,
-      NAME_OFFSET: nameOffset,
-      NAME_LENGTH: nameLength,
-      ELEMENT_OFFSET: elementOffset,
-      ELEMENT_LENGTH: elementLength,
-      IS_ABSTRACT: isAbstract,
-      IS_STATIC: isStatic
-    };
-    if (parameters != null) {
-      json[PARAMETERS] = parameters;
-    }
-    if (returnType != null) {
-      json[RETURN_TYPE] = returnType;
-    }
-    if (children.isNotEmpty) {
-      json[CHILDREN] = children.map((child) => child.toJson()).toList();
-    }
-    return json;
-  }
-}
diff --git a/pkg/analysis_server/lib/src/computer/element.dart b/pkg/analysis_server/lib/src/computer/element.dart
new file mode 100644
index 0000000..9b23a75
--- /dev/null
+++ b/pkg/analysis_server/lib/src/computer/element.dart
@@ -0,0 +1,286 @@
+// 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 computer.element;
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:analyzer/src/generated/element.dart' as engine;
+import 'package:analyzer/src/generated/utilities_dart.dart' as engine;
+
+
+/**
+ * Information about an element.
+ */
+class Element {
+  static const List<Element> EMPTY_ARRAY = const <Element>[];
+
+  static const int FLAG_ABSTRACT = 0x01;
+  static const int FLAG_CONST = 0x02;
+  static const int FLAG_DEPRECATED = 0x20;
+  static const int FLAG_FINAL = 0x04;
+  static const int FLAG_PRIVATE = 0x10;
+  static const int FLAG_STATIC = 0x08;
+
+  final bool isAbstract;
+  final bool isConst;
+  final bool isDeprecated;
+  final bool isFinal;
+  final bool isPrivate;
+  final bool isStatic;
+
+  /**
+   * The kind of the element.
+   */
+  final ElementKind kind;
+
+  /**
+   * The length of the name of the element.
+   */
+  final int length;
+
+  /**
+   * The name of the element. This is typically used as the label in the outline.
+   */
+  final String name;
+
+  /**
+   * The offset of the name of the element.
+   */
+  final int offset;
+
+  /**
+   * The parameter list for the element.
+   * If the element is not a method or function then `null`.
+   * If the element has zero parameters, then `()`.
+   */
+  final String parameters;
+
+  /**
+   * The return type of the element.
+   * If the element is not a method or function then `null`.
+   * If the element does not have a declared return type, then an empty string.
+   */
+  final String returnType;
+
+  Element(this.kind, this.name, this.offset, this.length, this.isPrivate,
+      this.isDeprecated, {this.parameters, this.returnType, this.isAbstract: false,
+      this.isConst: false, this.isFinal: false, this.isStatic: false});
+
+  factory Element.fromEngine(engine.Element element) {
+    String name = element.displayName;
+    int nameLength = name != null ? name.length : 0;
+    String elementParameters = _getParametersString(element);
+    String elementReturnType = _getReturnTypeString(element);
+    return new Element(ElementKind.valueOfEngine(element.kind), name,
+        element.nameOffset, nameLength, element.isPrivate, element.isDeprecated,
+        parameters: elementParameters, returnType: elementReturnType, isAbstract:
+        _isAbstract(element), isConst: _isConst(element), isFinal: _isFinal(element),
+        isStatic: _isStatic(element));
+  }
+
+  factory Element.fromJson(Map<String, Object> map) {
+    ElementKind kind = ElementKind.valueOf(map[KIND]);
+    int flags = map[FLAGS];
+    return new Element(kind, map[NAME], map[OFFSET], map[LENGTH], _hasFlag(
+        flags, FLAG_PRIVATE), _hasFlag(flags, FLAG_DEPRECATED), parameters:
+        map[PARAMETERS], returnType: map[RETURN_TYPE], isAbstract: _hasFlag(flags,
+        FLAG_ABSTRACT), isConst: _hasFlag(flags, FLAG_CONST), isFinal: _hasFlag(flags,
+        FLAG_FINAL), isStatic: _hasFlag(flags, FLAG_STATIC));
+  }
+
+  int get flags {
+    int flags = 0;
+    if (isAbstract) flags |= FLAG_ABSTRACT;
+    if (isConst) flags |= FLAG_CONST;
+    if (isFinal) flags |= FLAG_FINAL;
+    if (isStatic) flags |= FLAG_STATIC;
+    if (isPrivate) flags |= FLAG_PRIVATE;
+    if (isDeprecated) flags |= FLAG_DEPRECATED;
+    return flags;
+  }
+
+  Map<String, Object> toJson() {
+    Map<String, Object> json = {
+      KIND: kind.name,
+      NAME: name,
+      OFFSET: offset,
+      LENGTH: length,
+      FLAGS: flags
+    };
+    if (parameters != null) {
+      json[PARAMETERS] = parameters;
+    }
+    if (returnType != null) {
+      json[RETURN_TYPE] = returnType;
+    }
+    return json;
+  }
+
+  static String _getParametersString(engine.Element element) {
+    // TODO(scheglov) expose the corresponding feature from ExecutableElement
+    if (element is engine.ExecutableElement) {
+      var sb = new StringBuffer();
+      String closeOptionalString = '';
+      for (var parameter in element.parameters) {
+        if (sb.isNotEmpty) {
+          sb.write(', ');
+        }
+        if (closeOptionalString.isEmpty) {
+          if (parameter.kind == engine.ParameterKind.NAMED) {
+            sb.write('{');
+            closeOptionalString = '}';
+          }
+          if (parameter.kind == engine.ParameterKind.POSITIONAL) {
+            sb.write('[');
+            closeOptionalString = ']';
+          }
+        }
+        sb.write(parameter.toString());
+      }
+      sb.write(closeOptionalString);
+      return '(' + sb.toString() + ')';
+    } else {
+      return null;
+    }
+  }
+
+  static String _getReturnTypeString(engine.Element element) {
+    if ((element is engine.ExecutableElement)) {
+      return element.returnType.toString();
+    } else {
+      return null;
+    }
+  }
+
+  static bool _hasFlag(int flags, int flag) => (flags & flag) != 0;
+
+  static bool _isAbstract(engine.Element element) {
+    // TODO(scheglov) add isAbstract to Element API
+    if (element is engine.ClassElement) {
+      return element.isAbstract;
+    }
+    if (element is engine.MethodElement) {
+      return element.isAbstract;
+    }
+    if (element is engine.PropertyAccessorElement) {
+      return element.isAbstract;
+    }
+    return false;
+  }
+
+  static bool _isConst(engine.Element element) {
+    // TODO(scheglov) add isConst to Element API
+    if (element is engine.ConstructorElement) {
+      return element.isConst;
+    }
+    if (element is engine.VariableElement) {
+      return element.isConst;
+    }
+    return false;
+  }
+
+  static bool _isFinal(engine.Element element) {
+    // TODO(scheglov) add isFinal to Element API
+    if (element is engine.VariableElement) {
+      return element.isFinal;
+    }
+    return false;
+  }
+
+  static bool _isStatic(engine.Element element) {
+    // TODO(scheglov) add isStatic to Element API
+    if (element is engine.ExecutableElement) {
+      return element.isStatic;
+    }
+    if (element is engine.PropertyInducingElement) {
+      return element.isStatic;
+    }
+    return false;
+  }
+}
+
+
+/**
+ * An enumeration of the kinds of elements.
+ */
+class ElementKind {
+  static const CLASS = const ElementKind('CLASS');
+  static const CLASS_TYPE_ALIAS = const ElementKind('CLASS_TYPE_ALIAS');
+  static const COMPILATION_UNIT = const ElementKind('COMPILATION_UNIT');
+  static const CONSTRUCTOR = const ElementKind('CONSTRUCTOR');
+  static const FIELD = const ElementKind('FIELD');
+  static const FUNCTION = const ElementKind('FUNCTION');
+  static const FUNCTION_TYPE_ALIAS = const ElementKind('FUNCTION_TYPE_ALIAS');
+  static const GETTER = const ElementKind('GETTER');
+  static const LIBRARY = const ElementKind('LIBRARY');
+  static const METHOD = const ElementKind('METHOD');
+  static const SETTER = const ElementKind('SETTER');
+  static const TOP_LEVEL_VARIABLE = const ElementKind('TOP_LEVEL_VARIABLE');
+  static const UNIT_TEST_CASE = const ElementKind('UNIT_TEST_CASE');
+  static const UNIT_TEST_GROUP = const ElementKind('UNIT_TEST_GROUP');
+  static const UNKNOWN = const ElementKind('UNKNOWN');
+
+  final String name;
+
+  const ElementKind(this.name);
+
+  @override
+  String toString() => name;
+
+  static ElementKind valueOf(String name) {
+    if (CLASS.name == name) return CLASS;
+    if (CLASS_TYPE_ALIAS.name == name) return CLASS_TYPE_ALIAS;
+    if (COMPILATION_UNIT.name == name) return COMPILATION_UNIT;
+    if (CONSTRUCTOR.name == name) return CONSTRUCTOR;
+    if (FIELD.name == name) return FIELD;
+    if (FUNCTION.name == name) return FUNCTION;
+    if (FUNCTION_TYPE_ALIAS.name == name) return FUNCTION_TYPE_ALIAS;
+    if (GETTER.name == name) return GETTER;
+    if (LIBRARY.name == name) return LIBRARY;
+    if (METHOD.name == name) return METHOD;
+    if (SETTER.name == name) return SETTER;
+    if (TOP_LEVEL_VARIABLE.name == name) return TOP_LEVEL_VARIABLE;
+    if (UNIT_TEST_CASE.name == name) return UNIT_TEST_CASE;
+    if (UNIT_TEST_GROUP.name == name) return UNIT_TEST_GROUP;
+    if (UNKNOWN.name == name) return UNKNOWN;
+    throw new ArgumentError('Unknown ElementKind: $name');
+  }
+
+  static ElementKind valueOfEngine(engine.ElementKind kind) {
+    if (kind == engine.ElementKind.CLASS) {
+      return CLASS;
+    }
+    if (kind == engine.ElementKind.COMPILATION_UNIT) {
+      return COMPILATION_UNIT;
+    }
+    if (kind == engine.ElementKind.CONSTRUCTOR) {
+      return CONSTRUCTOR;
+    }
+    if (kind == engine.ElementKind.FIELD) {
+      return FIELD;
+    }
+    if (kind == engine.ElementKind.FUNCTION) {
+      return FUNCTION;
+    }
+    if (kind == engine.ElementKind.FUNCTION_TYPE_ALIAS) {
+      return FUNCTION_TYPE_ALIAS;
+    }
+    if (kind == engine.ElementKind.GETTER) {
+      return GETTER;
+    }
+    if (kind == engine.ElementKind.LIBRARY) {
+      return LIBRARY;
+    }
+    if (kind == engine.ElementKind.METHOD) {
+      return METHOD;
+    }
+    if (kind == engine.ElementKind.SETTER) {
+      return SETTER;
+    }
+    if (kind == engine.ElementKind.TOP_LEVEL_VARIABLE) {
+      return TOP_LEVEL_VARIABLE;
+    }
+    return UNKNOWN;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index 32f5d8a..1e1f4fc 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -4,75 +4,120 @@
 
 library constants;
 
-
 //
 // Server methods
 //
-const String METHOD_GET_VERSION =              'server.getVersion';
-const String METHOD_SHUTDOWN =                 'server.shutdown';
-const String METHOD_SET_SERVER_SUBSCRIPTIONS = 'server.setSubscriptions';
-
-//
-// Analysis methods
-//
-const String METHOD_GET_FIXES =                  'analysis.getFixes';
-const String METHOD_GET_MINOR_REFACTORINGS =     'analysis.getMinorRefactorings';
-const String METHOD_SET_ANALYSIS_ROOTS =         'analysis.setAnalysisRoots';
-const String METHOD_SET_PRIORITY_FILES =         'analysis.setPriorityFiles';
-const String METHOD_SET_ANALYSIS_SUBSCRIPTIONS = 'analysis.setSubscriptions';
-const String METHOD_UPDATE_CONTENT =             'analysis.updateContent';
-const String METHOD_UPDATE_OPTIONS =             'analysis.updateOptions';
-const String METHOD_UPDATE_SDKS =                'analysis.updateSdks';
+const String SERVER_GET_VERSION = 'server.getVersion';
+const String SERVER_SHUTDOWN = 'server.shutdown';
+const String SERVER_SET_SUBSCRIPTIONS = 'server.setSubscriptions';
 
 //
 // Server notifications
 //
-const String NOTIFICATION_CONNECTED  = 'server.connected';
-const String NOTIFICATION_STATUS =     'server.status';
+const String SERVER_CONNECTED = 'server.connected';
+const String SERVER_ERROR = 'server.error';
+const String SERVER_STATUS = 'server.status';
+
+//
+// Analysis methods
+//
+const String ANALYSIS_SET_ANALYSIS_ROOTS = 'analysis.setAnalysisRoots';
+const String ANALYSIS_SET_PRIORITY_FILES = 'analysis.setPriorityFiles';
+const String ANALYSIS_SET_SUBSCRIPTIONS = 'analysis.setSubscriptions';
+const String ANALYSIS_UPDATE_CONTENT = 'analysis.updateContent';
+const String ANALYSIS_UPDATE_OPTIONS = 'analysis.updateOptions';
+const String ANALYSIS_UPDATE_SDKS = 'analysis.updateSdks';
 
 //
 // Analysis notifications
 //
-const String NOTIFICATION_ERRORS =     'analysis.errors';
-const String NOTIFICATION_HIGHLIGHTS = 'analysis.highlights';
-const String NOTIFICATION_NAVIGATION = 'analysis.navigation';
-const String NOTIFICATION_OUTLINE =    'analysis.outline';
+const String ANALYSIS_ERRORS = 'analysis.errors';
+const String ANALYSIS_HIGHLIGHTS = 'analysis.highlights';
+const String ANALYSIS_NAVIGATION = 'analysis.navigation';
+const String ANALYSIS_OUTLINE = 'analysis.outline';
 
+//
+// Code Completion methods
+//
+const String COMPLETION_GET_SUGGESTIONS = 'completion.getSuggestions';
 
+//
+// Code Completion notifications
+//
+const String COMPLETION_RESULTS = 'completion.results';
+
+//
+// Search methods
+//
+const String SEARCH_FIND_ELEMENT_REFERENCES = 'search.findElementReferences';
+const String SEARCH_FIND_MEMBER_DECLARATIONS = 'search.findMemberDeclarations';
+const String SEARCH_FIND_MEMBER_REFERENCES = 'search.findMemberReferences';
+const String SEARCH_FIND_TOP_LEVEL_DECLARATIONS =
+    'search.findTopLevelDeclarations';
+
+//
+// Search notifications
+//
+const String SEARCH_RESULTS = 'search.results';
+
+//
+// Edit methods
+//
+const String EDIT_APPLY_REFACTORING = 'edit.applyRefactoring';
+const String EDIT_CREATE_REFACTORING = 'edit.createRefactoring';
+const String EDIT_DELETE_REFACTORING = 'edit.deleteRefactoring';
+const String EDIT_GET_ASSISTS = 'edit.getAssists';
+const String EDIT_GET_FIXES = 'edit.getFixes';
+const String EDIT_GET_REFACTORINGS = 'edit.getRefactorings';
+const String EDIT_SET_REFACTORING_OPTIONS = 'edit.setRefactoringOptions';
+
+//
+// Property names
+//
 const String ADDED = 'added';
+const String CHILDREN = 'children';
 const String CONTENT = 'content';
+const String CORRECTION = 'correction';
 const String DEFAULT = 'default';
+const String ELEMENT = 'element';
 const String EXCLUDED = 'excluded';
+const String ERROR_CODE = 'errorCode';
 const String ERRORS = 'errors';
 const String FILE = 'file';
 const String FILES = 'files';
 const String FIXES = 'fixes';
+const String FLAGS = 'flags';
+const String ID = 'id';
 const String INCLUDED = 'included';
+const String IS_ABSTRACT = 'isAbstract';
+const String IS_STATIC = 'isStatic';
+const String KIND = 'kind';
 const String LENGTH = 'length';
+const String MESSAGE = 'message';
+const String NAME = 'name';
 const String NEW_LENGTH = 'newLength';
 const String OFFSET = 'offset';
 const String OLD_LENGTH = 'oldLength';
 const String OPTIONS = 'options';
 const String OUTLINE = 'outline';
+const String PARAMETERS = 'parameters';
+const String PATTERN = 'pattern';
 const String REFACTORINGS = 'refactorings';
 const String REGIONS = 'regions';
 const String REMOVED = 'removed';
+const String RETURN_TYPE = 'returnType';
 const String SUBSCRIPTIONS = 'subscriptions';
+const String TARGETS = 'targets';
+const String TYPE = 'type';
 const String VERSION = 'version';
 
-
-// TODO(scheglov) remove it with ContextDomain
-const String APPLY_CHANGES_NAME = 'context.applyChanges';
-const String GET_FIXES_NAME = 'context.getFixes';
-const String SET_OPTIONS_NAME = 'context.setOptions';
-const String SET_PRIORITY_SOURCES_NAME = 'context.setPrioritySources';
-const String CHANGES_PARAM = 'changes';
-const String CONTEXT_ID_PARAM = 'contextId';
-const String MODIFIED_PARAM = "modified";
-const String SOURCES_PARAM = 'sources';
-const String CACHE_SIZE_OPTION = 'cacheSize';
-const String GENERATE_HINTS_OPTION = 'generateHints';
-const String GENERATE_DART2JS_OPTION = 'generateDart2jsHints';
-const String PROVIDE_ERRORS_OPTION = 'provideErrors';
-const String PROVIDE_NAVIGATION_OPTION = 'provideNavigation';
-const String PROVIDE_OUTLINE_OPTION = 'provideOutline';
+//
+// Analysis option names
+//
+const String ANALYZE_ANGULAR = 'analyzeAngular'; // boolean
+const String ANALYZE_POLYMER = 'analyzePolymer'; // boolean
+const String ENABLE_ASYNC = 'enableAsync'; // boolean
+const String ENABLE_DEFERRED_LOADING = 'enableDeferredLoading'; // boolean
+const String ENABLE_ENUMS = 'enableEnums'; // boolean
+const String GENERATE_DART2JS_HINTS = 'generateDart2jsHints'; // boolean
+const String GENERATE_HINTS = 'generateHints'; // boolean
diff --git a/pkg/analysis_server/lib/src/context_directory_manager.dart b/pkg/analysis_server/lib/src/context_directory_manager.dart
index cadbb0f..9fc3c92 100644
--- a/pkg/analysis_server/lib/src/context_directory_manager.dart
+++ b/pkg/analysis_server/lib/src/context_directory_manager.dart
@@ -5,6 +5,7 @@
 library context.directory.manager;
 
 import 'dart:async';
+import 'dart:collection';
 
 import 'package:analysis_server/src/resource.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -25,7 +26,7 @@
    * Map from full path to the [Source] object, for each source that has been
    * added to the context.
    */
-  Map<String, Source> sources = <String, Source>{};
+  Map<String, Source> sources = new HashMap<String, Source>();
 }
 
 /**
@@ -34,11 +35,16 @@
  */
 abstract class ContextDirectoryManager {
   /**
+   * File name of pubspec files.
+   */
+  static const String PUBSPEC_NAME = 'pubspec.yaml';
+
+  /**
    * [_ContextDirectoryInfo] object for each included directory in the most
    * recent successful call to [setRoots].
    */
   Map<Folder, _ContextDirectoryInfo> _currentDirectoryInfo =
-      <Folder, _ContextDirectoryInfo>{};
+      new HashMap<Folder, _ContextDirectoryInfo>();
 
   /**
    * The [ResourceProvider] using which paths are converted into [Resource]s.
@@ -54,7 +60,7 @@
   void setRoots(List<String> includedPaths,
                 List<String> excludedPaths) {
     // included
-    Set<Folder> includedFolders = new Set<Folder>();
+    Set<Folder> includedFolders = new HashSet<Folder>();
     for (int i = 0; i < includedPaths.length; i++) {
       String path = includedPaths[i];
       Resource resource = resourceProvider.getResource(path);
@@ -73,30 +79,46 @@
       throw new UnimplementedError(
           'Excluded paths are not supported yet');
     }
-    Set<Folder> excludedFolders = new Set<Folder>();
+    Set<Folder> excludedFolders = new HashSet<Folder>();
     // diff
     Set<Folder> currentFolders = _currentDirectoryInfo.keys.toSet();
     Set<Folder> newFolders = includedFolders.difference(currentFolders);
     Set<Folder> oldFolders = currentFolders.difference(includedFolders);
-    // remove old contexts
+    // destroy old contexts
     for (Folder folder in oldFolders) {
-      // TODO(scheglov) implement
+      _destroyContext(folder);
     }
-    // add new contexts
+    // create 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);
+      _createContext(folder);
     }
   }
 
+  /**
+   * Create a new context associated with the given folder.
+   */
+  void _createContext(Folder folder) {
+    _ContextDirectoryInfo info = new _ContextDirectoryInfo();
+    _currentDirectoryInfo[folder] = info;
+    info.changeSubscription = folder.changes.listen((WatchEvent event) {
+      _handleWatchEvent(folder, info, event);
+    });
+    File pubspecFile = folder.getChild(PUBSPEC_NAME);
+    addContext(folder);
+    ChangeSet changeSet = new ChangeSet();
+    _addSourceFiles(changeSet, folder, info);
+    applyChangesToContext(folder, changeSet);
+  }
+
+  /**
+   * Clean up and destroy the context associated with the given folder.
+   */
+  void _destroyContext(Folder folder) {
+    _currentDirectoryInfo[folder].changeSubscription.cancel();
+    _currentDirectoryInfo.remove(folder);
+    removeContext(folder);
+  }
+
   void _handleWatchEvent(Folder folder, _ContextDirectoryInfo info, WatchEvent event) {
     switch (event.type) {
       case ChangeType.ADD:
@@ -105,7 +127,6 @@
           // there is a pubspec.yaml?
           break;
         }
-        // TODO(paulberry): handle adding pubspec.yaml
         if (_shouldFileBeAnalyzed(event.path)) {
           ChangeSet changeSet = new ChangeSet();
           Resource resource = resourceProvider.getResource(event.path);
@@ -122,7 +143,6 @@
         }
         break;
       case ChangeType.REMOVE:
-        // TODO(paulberry): handle removing pubspec.yaml
         Source source = info.sources[event.path];
         if (source != null) {
           ChangeSet changeSet = new ChangeSet();
@@ -132,7 +152,12 @@
         }
         break;
       case ChangeType.MODIFY:
-        // TODO(paulberry): handle modification events
+        Source source = info.sources[event.path];
+        if (source != null) {
+          ChangeSet changeSet = new ChangeSet();
+          changeSet.changedSource(source);
+          applyChangesToContext(folder, changeSet);
+        }
         break;
     }
   }
@@ -181,11 +206,9 @@
   }
 
   /**
-   * 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.
+   * Called when a new context needs to be created.
    */
-  void addContext(Folder folder, File pubspecFile);
+  void addContext(Folder folder);
 
   /**
    * Called when the set of files associated with a context have changed (or
@@ -193,4 +216,9 @@
    * changes that need to be applied to the context.
    */
   void applyChangesToContext(Folder contextFolder, ChangeSet changeSet);
-}
\ No newline at end of file
+
+  /**
+   * Remove the context associated with the given [folder].
+   */
+  void removeContext(Folder folder);
+}
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 129ac81..c153735 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -4,6 +4,9 @@
 
 library domain.analysis;
 
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
@@ -27,21 +30,17 @@
   Response handleRequest(Request request) {
     try {
       String requestName = request.method;
-      if (requestName == METHOD_GET_FIXES) {
-        return getFixes(request);
-      } else if (requestName == METHOD_GET_MINOR_REFACTORINGS) {
-          return getMinorRefactorings(request);
-      } else if (requestName == METHOD_SET_ANALYSIS_ROOTS) {
+      if (requestName == ANALYSIS_SET_ANALYSIS_ROOTS) {
         return setAnalysisRoots(request);
-      } else if (requestName == METHOD_SET_PRIORITY_FILES) {
+      } else if (requestName == ANALYSIS_SET_PRIORITY_FILES) {
         return setPriorityFiles(request);
-      } else if (requestName == METHOD_SET_ANALYSIS_SUBSCRIPTIONS) {
+      } else if (requestName == ANALYSIS_SET_SUBSCRIPTIONS) {
         return setSubscriptions(request);
-      } else if (requestName == METHOD_UPDATE_CONTENT) {
+      } else if (requestName == ANALYSIS_UPDATE_CONTENT) {
         return updateContent(request);
-      } else if (requestName == METHOD_UPDATE_OPTIONS) {
+      } else if (requestName == ANALYSIS_UPDATE_OPTIONS) {
         return updateOptions(request);
-      } else if (requestName == METHOD_UPDATE_SDKS) {
+      } else if (requestName == ANALYSIS_UPDATE_SDKS) {
         return updateSdks(request);
       }
     } on RequestFailure catch (exception) {
@@ -50,16 +49,9 @@
     return null;
   }
 
-  Response getFixes(Request request) {
-    // TODO(scheglov) implement
-    return null;
-  }
-
-  Response getMinorRefactorings(Request request) {
-    // TODO(scheglov) implement
-    return null;
-  }
-
+  /**
+   * Implement the 'analysis.setAnalysisRoots' request.
+   */
   Response setAnalysisRoots(Request request) {
     // included
     RequestDatum includedDatum = request.getRequiredParameter(INCLUDED);
@@ -72,37 +64,51 @@
     return new Response(request.id);
   }
 
+  /**
+   * Implement the 'analysis.setPriorityFiles' request.
+   */
   Response setPriorityFiles(Request request) {
-    // TODO(scheglov) implement
-    return null;
+    // files
+    RequestDatum filesDatum = request.getRequiredParameter(FILES);
+    List<String> files = filesDatum.asStringList();
+    server.setPriorityFiles(request, files);
+    return new Response(request.id);
   }
 
+  /**
+   * Implement the 'analysis.setSubscriptions' request.
+   */
   Response setSubscriptions(Request request) {
     // parse subscriptions
     Map<AnalysisService, Set<String>> subMap;
     {
       RequestDatum subDatum = request.getRequiredParameter(SUBSCRIPTIONS);
       Map<String, List<String>> subStringMap = subDatum.asStringListMap();
-      subMap = new Map<AnalysisService, Set<String>>();
+      subMap = new HashMap<AnalysisService, Set<String>>();
       subStringMap.forEach((String serviceName, List<String> paths) {
-        AnalysisService service = Enum2.valueOf(AnalysisService.VALUES, serviceName);
+        AnalysisService service = Enum2.valueOf(AnalysisService.VALUES,
+            serviceName);
         if (service == null) {
-          throw new RequestFailure(
-              new Response.unknownAnalysisService(request, serviceName));
+          throw new RequestFailure(new Response.unknownAnalysisService(request,
+              serviceName));
         }
-        subMap[service] = new Set.from(paths);
+        subMap[service] = new HashSet.from(paths);
       });
     }
     server.setAnalysisSubscriptions(subMap);
     return new Response(request.id);
   }
 
+  /**
+   * Implement the 'analysis.updateContent' request.
+   */
   Response updateContent(Request request) {
-    var changes = new Map<String, ContentChange>();
+    var changes = new HashMap<String, ContentChange>();
     RequestDatum filesDatum = request.getRequiredParameter(FILES);
     filesDatum.forEachMap((file, changeDatum) {
       var change = new ContentChange();
-      change.content = changeDatum[CONTENT].asString();
+      change.content = changeDatum[CONTENT].isNull ? null :
+          changeDatum[CONTENT].asString();
       if (changeDatum.hasKey(OFFSET)) {
         change.offset = changeDatum[OFFSET].asInt();
         change.oldLength = changeDatum[OLD_LENGTH].asInt();
@@ -114,12 +120,73 @@
     return new Response(request.id);
   }
 
+  /**
+   * Implement the 'analysis.updateOptions' request.
+   */
   Response updateOptions(Request request) {
-    // TODO(scheglov) implement
-    return null;
+    // options
+    RequestDatum optionsDatum = request.getRequiredParameter(OPTIONS);
+    List<OptionUpdater> updaters = new List<OptionUpdater>();
+    optionsDatum.forEachMap((String optionName, RequestDatum optionDatum) {
+      if (optionName == ANALYZE_ANGULAR) {
+        bool optionValue = optionDatum.asBool();
+        updaters.add((AnalysisOptionsImpl options) {
+          options.analyzeAngular = optionValue;
+        });
+      } else if (optionName == ANALYZE_POLYMER) {
+        bool optionValue = optionDatum.asBool();
+        updaters.add((AnalysisOptionsImpl options) {
+          options.analyzePolymer = optionValue;
+        });
+      } else if (optionName == ENABLE_ASYNC) {
+        // TODO(brianwilkerson) Uncomment this when the option is supported.
+//        bool optionValue = optionDatum.asBool();
+//        updaters.add((AnalysisOptionsImpl options) {
+//          options.enableAsync = optionValue;
+//        });
+      } else if (optionName == ENABLE_DEFERRED_LOADING) {
+        bool optionValue = optionDatum.asBool();
+        updaters.add((AnalysisOptionsImpl options) {
+          options.enableDeferredLoading = optionValue;
+        });
+      } else if (optionName == ENABLE_ENUMS) {
+        // TODO(brianwilkerson) Uncomment this when the option is supported.
+//        bool optionValue = optionDatum.asBool();
+//        updaters.add((AnalysisOptionsImpl options) {
+//          options.enableEnums = optionValue;
+//        });
+      } else if (optionName == GENERATE_DART2JS_HINTS) {
+        bool optionValue = optionDatum.asBool();
+        updaters.add((AnalysisOptionsImpl options) {
+          options.dart2jsHint = optionValue;
+        });
+      } else if (optionName == GENERATE_HINTS) {
+        bool optionValue = optionDatum.asBool();
+        updaters.add((AnalysisOptionsImpl options) {
+          options.hint = optionValue;
+        });
+      } else {
+        throw new RequestFailure(new Response.unknownOptionName(request,
+            optionName));
+      }
+    });
+    server.updateOptions(updaters);
+    return new Response(request.id);
   }
 
+  /**
+   * Implement the 'analysis.updateSdks' request.
+   */
   Response updateSdks(Request request) {
+    // added
+    RequestDatum addedDatum = request.getRequiredParameter(ADDED);
+    List<String> added = addedDatum.asStringList();
+    // removed
+    RequestDatum removedDatum = request.getRequiredParameter(REMOVED);
+    List<String> removed = removedDatum.asStringList();
+    // default
+    RequestDatum defaultDatum = request.getRequiredParameter(DEFAULT);
+    String defaultSdk = defaultDatum.asString();
     // TODO(scheglov) implement
     return null;
   }
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
new file mode 100644
index 0000000..cfb6881
--- /dev/null
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -0,0 +1,49 @@
+// 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 domain.completion;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+
+/**
+ * Instances of the class [CompletionDomainHandler] implement a [RequestHandler]
+ * that handles requests in the search domain.
+ */
+class CompletionDomainHandler implements RequestHandler {
+  /**
+   * The analysis server that is using this handler to process requests.
+   */
+  final AnalysisServer server;
+
+  /**
+   * Initialize a newly created handler to handle requests for the given [server].
+   */
+  CompletionDomainHandler(this.server);
+
+  @override
+  Response handleRequest(Request request) {
+    try {
+      String requestName = request.method;
+      if (requestName == COMPLETION_GET_SUGGESTIONS) {
+        return getSuggestions(request);
+      }
+    } on RequestFailure catch (exception) {
+      return exception.response;
+    }
+    return null;
+  }
+
+  Response getSuggestions(Request request) {
+    // file
+    RequestDatum fileDatum = request.getRequiredParameter(FILE);
+    String file = fileDatum.asString();
+    // offset
+    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
+    int offset = offsetDatum.asInt();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/domain_edit.dart b/pkg/analysis_server/lib/src/domain_edit.dart
new file mode 100644
index 0000000..4a415b4
--- /dev/null
+++ b/pkg/analysis_server/lib/src/domain_edit.dart
@@ -0,0 +1,200 @@
+// 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 domain.edit;
+
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+
+/**
+ * Instances of the class [EditDomainHandler] implement a [RequestHandler]
+ * that handles requests in the edit domain.
+ */
+class EditDomainHandler implements RequestHandler {
+  /**
+   * The analysis server that is using this handler to process requests.
+   */
+  final AnalysisServer server;
+
+  /**
+   * Initialize a newly created handler to handle requests for the given [server].
+   */
+  EditDomainHandler(this.server);
+
+  @override
+  Response handleRequest(Request request) {
+    try {
+      String requestName = request.method;
+      if (requestName == EDIT_APPLY_REFACTORING) {
+        return applyRefactoring(request);
+      } else if (requestName == EDIT_CREATE_REFACTORING) {
+        return createRefactoring(request);
+      } else if (requestName == EDIT_DELETE_REFACTORING) {
+        return deleteRefactoring(request);
+      } else if (requestName == EDIT_GET_ASSISTS) {
+        return getAssists(request);
+      } else if (requestName == EDIT_GET_FIXES) {
+        return getFixes(request);
+      } else if (requestName == EDIT_GET_REFACTORINGS) {
+        return getRefactorings(request);
+      } else if (requestName == EDIT_SET_REFACTORING_OPTIONS) {
+        return setRefactoringOptions(request);
+      }
+    } on RequestFailure catch (exception) {
+      return exception.response;
+    }
+    return null;
+  }
+
+  Response applyRefactoring(Request request) {
+    // id
+    RequestDatum idDatum = request.getRequiredParameter(ID);
+    String id = idDatum.asString();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response createRefactoring(Request request) {
+    // kind
+    RequestDatum kindDatum = request.getRequiredParameter(KIND);
+    String kind = kindDatum.asString();
+    // file
+    RequestDatum fileDatum = request.getRequiredParameter(FILE);
+    String file = fileDatum.asString();
+    // offset
+    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
+    int offset = offsetDatum.asInt();
+    // length
+    RequestDatum lengthDatum = request.getRequiredParameter(LENGTH);
+    int length = lengthDatum.asInt();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response deleteRefactoring(Request request) {
+    // id
+    RequestDatum idDatum = request.getRequiredParameter(ID);
+    String id = idDatum.asString();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response getAssists(Request request) {
+    // file
+    RequestDatum fileDatum = request.getRequiredParameter(FILE);
+    String file = fileDatum.asString();
+    // offset
+    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
+    int offset = offsetDatum.asInt();
+    // length
+    RequestDatum lengthDatum = request.getRequiredParameter(LENGTH);
+    int length = lengthDatum.asInt();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response getFixes(Request request) {
+    // errors
+    RequestDatum errorsDatum = request.getRequiredParameter(ERRORS);
+    List<AnalysisError> errors = errorsDatum.asList((RequestDatum datum) {
+      return _createAnalysisError(request, datum);
+    });
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response getRefactorings(Request request) {
+    // file
+    RequestDatum fileDatum = request.getRequiredParameter(FILE);
+    String file = fileDatum.asString();
+    // offset
+    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
+    int offset = offsetDatum.asInt();
+    // length
+    RequestDatum lengthDatum = request.getRequiredParameter(LENGTH);
+    int length = lengthDatum.asInt();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response setRefactoringOptions(Request request) {
+    // id
+    RequestDatum idDatum = request.getRequiredParameter(ID);
+    String id = idDatum.asString();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  /**
+   * Convert the given data from a request into an analysis error.
+   */
+  AnalysisError _createAnalysisError(Request request, RequestDatum datum) {
+    String file = datum[FILE].asString();
+    String errorCodeName = datum[ERROR_CODE].asString();
+    int offset = datum[OFFSET].asInt();
+    int length = datum[LENGTH].asInt();
+    String message = datum[MESSAGE].asString();
+    String correction;
+    if (datum.hasKey(CORRECTION)) {
+      correction = datum[CORRECTION].asString();
+    }
+    ErrorCode errorCode = convertErrorCode(errorCodeName);
+    if (errorCode == null) {
+//      throw new RequestFailure(new Response.invalidErrorCode(request));
+    }
+    // TODO(brianwilkerson) Implement this.
+//    return new AnalysisError.con2(
+//        server.sourceFromFile(file),
+//        offset,
+//        length,
+//        errorCode,
+//        null);
+    return null;
+  }
+
+  /**
+   * Return the error code corresponding to the given [errorCodeName], or `null`
+   * if the given name is not a valid error code.
+   */
+  ErrorCode convertErrorCode(String errorCodeName) {
+    // TODO(brianwilkerson) Implement this.
+//    Enum2 errorCode = Enum2.valueOf(AngularCode.values, errorCodeName);
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(CompileTimeErrorCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(HintCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(HtmlWarningCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(ParserErrorCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(PolymerCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(PubSuggestionCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(ResolverErrorCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(ScannerErrorCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(StaticTypeErrorCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(StaticWarningErrorCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(TodoCode.values, errorCodeName);
+//    }
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/domain_search.dart b/pkg/analysis_server/lib/src/domain_search.dart
new file mode 100644
index 0000000..8b1a2b2
--- /dev/null
+++ b/pkg/analysis_server/lib/src/domain_search.dart
@@ -0,0 +1,82 @@
+// 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 domain.search;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+
+/**
+ * Instances of the class [SearchDomainHandler] implement a [RequestHandler]
+ * that handles requests in the search domain.
+ */
+class SearchDomainHandler implements RequestHandler {
+  /**
+   * The analysis server that is using this handler to process requests.
+   */
+  final AnalysisServer server;
+
+  /**
+   * Initialize a newly created handler to handle requests for the given [server].
+   */
+  SearchDomainHandler(this.server);
+
+  @override
+  Response handleRequest(Request request) {
+    try {
+      String requestName = request.method;
+      if (requestName == SEARCH_FIND_ELEMENT_REFERENCES) {
+        return findElementReferences(request);
+      } else if (requestName == SEARCH_FIND_MEMBER_DECLARATIONS) {
+        return findMemberDeclarations(request);
+      } else if (requestName == SEARCH_FIND_MEMBER_REFERENCES) {
+        return findMemberReferences(request);
+      } else if (requestName == SEARCH_FIND_TOP_LEVEL_DECLARATIONS) {
+        return findTopLevelDeclarations(request);
+      }
+    } on RequestFailure catch (exception) {
+      return exception.response;
+    }
+    return null;
+  }
+
+  Response findElementReferences(Request request) {
+    // file
+    RequestDatum fileDatum = request.getRequiredParameter(FILE);
+    String file = fileDatum.asString();
+    // offset
+    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
+    int offset = offsetDatum.asInt();
+    // includePotential
+    RequestDatum includePotentialDatum = request.getRequiredParameter(LENGTH);
+    bool includePotential = includePotentialDatum.asBool();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response findMemberDeclarations(Request request) {
+    // name
+    RequestDatum nameDatum = request.getRequiredParameter(FILE);
+    String name = nameDatum.asString();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response findMemberReferences(Request request) {
+    // name
+    RequestDatum nameDatum = request.getRequiredParameter(FILE);
+    String name = nameDatum.asString();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response findTopLevelDeclarations(Request request) {
+    // pattern
+    RequestDatum patternDatum = request.getRequiredParameter(FILE);
+    String pattern = patternDatum.asString();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index 9f9867b..6c0126c 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -23,15 +23,24 @@
    */
   ServerDomainHandler(this.server);
 
+  /**
+   * Return the version number of the analysis server.
+   */
+  Response getVersion(Request request) {
+    Response response = new Response(request.id);
+    response.setResult(VERSION, '0.0.1');
+    return response;
+  }
+
   @override
   Response handleRequest(Request request) {
     try {
       String requestName = request.method;
-      if (requestName == METHOD_GET_VERSION) {
+      if (requestName == SERVER_GET_VERSION) {
         return getVersion(request);
-      } else if (requestName == METHOD_SET_SERVER_SUBSCRIPTIONS) {
+      } else if (requestName == SERVER_SET_SUBSCRIPTIONS) {
           return setSubscriptions(request);
-      } else if (requestName == METHOD_SHUTDOWN) {
+      } else if (requestName == SERVER_SHUTDOWN) {
         return shutdown(request);
       }
     } on RequestFailure catch (exception) {
@@ -112,13 +121,4 @@
     Response response = new Response(request.id);
     return response;
   }
-
-  /**
-   * Return the version number of the analysis server.
-   */
-  Response getVersion(Request request) {
-    Response response = new Response(request.id);
-    response.setResult(VERSION, '0.0.1');
-    return response;
-  }
 }
diff --git a/pkg/analysis_server/lib/src/generated/service_interfaces.dart b/pkg/analysis_server/lib/src/generated/service_interfaces.dart
index 07643a9..86b32f0 100644
--- a/pkg/analysis_server/lib/src/generated/service_interfaces.dart
+++ b/pkg/analysis_server/lib/src/generated/service_interfaces.dart
@@ -9,21 +9,20 @@
 
 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/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 `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
diff --git a/pkg/analysis_server/lib/src/get_handler.dart b/pkg/analysis_server/lib/src/get_handler.dart
index ce8ad00..f0f577f 100644
--- a/pkg/analysis_server/lib/src/get_handler.dart
+++ b/pkg/analysis_server/lib/src/get_handler.dart
@@ -6,9 +6,6 @@
 
 import 'dart:io';
 
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_engine.dart' show CaughtException;
-
 import 'package:analysis_server/src/socket_server.dart';
 
 /**
@@ -67,57 +64,57 @@
           ['Context', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
           true);
       // TODO(scheglov) replace with using folder based contexts
-      _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
-        AnalysisContentStatistics statistics =
-            (context as AnalysisContextImpl).statistics;
-        int errorCount = 0;
-        int flushedCount = 0;
-        int inProcessCount = 0;
-        int invalidCount = 0;
-        int validCount = 0;
-        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
-          errorCount += row.errorCount;
-          flushedCount += row.flushedCount;
-          inProcessCount += row.inProcessCount;
-          invalidCount += row.invalidCount;
-          validCount += row.validCount;
-        });
-        _writeRow(response, [
-            '<a href="#context_$key">$key</a>',
-            errorCount,
-            flushedCount,
-            inProcessCount,
-            invalidCount,
-            validCount]);
-      });
+//      _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
+//        AnalysisContentStatistics statistics =
+//            (context as AnalysisContextImpl).statistics;
+//        int errorCount = 0;
+//        int flushedCount = 0;
+//        int inProcessCount = 0;
+//        int invalidCount = 0;
+//        int validCount = 0;
+//        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
+//          errorCount += row.errorCount;
+//          flushedCount += row.flushedCount;
+//          inProcessCount += row.inProcessCount;
+//          invalidCount += row.invalidCount;
+//          validCount += row.validCount;
+//        });
+//        _writeRow(response, [
+//            '<a href="#context_$key">$key</a>',
+//            errorCount,
+//            flushedCount,
+//            inProcessCount,
+//            invalidCount,
+//            validCount]);
+//      });
       response.write('</table>');
-      _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
-        response.write('<h2><a name="context_$key">Analysis Context: $key</a></h2>');
-        AnalysisContentStatistics statistics = (context as AnalysisContextImpl).statistics;
-        response.write('<table>');
-        _writeRow(
-            response,
-            ['Item', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
-            true);
-        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
-          _writeRow(
-              response,
-              [row.name,
-               row.errorCount,
-               row.flushedCount,
-               row.inProcessCount,
-               row.invalidCount,
-               row.validCount]);
-        });
-        response.write('</table>');
-        List<CaughtException> exceptions = statistics.exceptions;
-        if (!exceptions.isEmpty) {
-          response.write('<h2>Exceptions</h2>');
-          exceptions.forEach((CaughtException exception) {
-            response.write('<p>${exception.exception}</p>');
-          });
-        }
-      });
+//      _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
+//        response.write('<h2><a name="context_$key">Analysis Context: $key</a></h2>');
+//        AnalysisContentStatistics statistics = (context as AnalysisContextImpl).statistics;
+//        response.write('<table>');
+//        _writeRow(
+//            response,
+//            ['Item', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
+//            true);
+//        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
+//          _writeRow(
+//              response,
+//              [row.name,
+//               row.errorCount,
+//               row.flushedCount,
+//               row.inProcessCount,
+//               row.invalidCount,
+//               row.validCount]);
+//        });
+//        response.write('</table>');
+//        List<CaughtException> exceptions = statistics.exceptions;
+//        if (!exceptions.isEmpty) {
+//          response.write('<h2>Exceptions</h2>');
+//          exceptions.forEach((CaughtException exception) {
+//            response.write('<p>${exception.exception}</p>');
+//          });
+//        }
+//      });
     }
     response.write('</body>');
     response.write('</html>');
diff --git a/pkg/analysis_server/lib/src/index/b_plus_tree.dart b/pkg/analysis_server/lib/src/index/b_plus_tree.dart
new file mode 100644
index 0000000..f4b52d7
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/b_plus_tree.dart
@@ -0,0 +1,774 @@
+// 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 index.b_plus_tree;
+
+import 'dart:collection';
+
+
+/**
+ * A simple B+ tree (http://en.wikipedia.org/wiki/B+_tree) implementation.
+ *
+ * [K] is the keys type.
+ * [V] is the values type.
+ * [N] is the type of node identifiers using by the [NodeManager].
+ */
+class BPlusTree<K, V, N> {
+  /**
+   * The [Comparator] to compare keys.
+   */
+  final Comparator<K> _comparator;
+
+  /**
+   * The [NodeManager] to manage nodes.
+   */
+  final NodeManager<K, V, N> _manager;
+
+  /**
+   * The maximum number of keys in an index node.
+   */
+  final int _maxIndexKeys;
+
+  /**
+   * The maximum number of keys in a leaf node.
+   */
+  final int _maxLeafKeys;
+
+  /**
+   * The root node.
+   */
+  _Node<K, V, N> _root;
+
+  /**
+   * Creates a new [BPlusTree] instance.
+   */
+  BPlusTree(this._comparator, NodeManager<K, V, N> manager)
+      : _manager = manager,
+        _maxIndexKeys = manager.maxIndexKeys,
+        _maxLeafKeys = manager.maxLeafKeys {
+    _root = _newLeafNode();
+    _writeLeafNode(_root);
+  }
+
+  /**
+   * Returns the value for [key] or `null` if [key] is not in the tree.
+   */
+  V find(K key) {
+    return _root.find(key);
+  }
+
+  /**
+   * Associates the [key] with the given [value].
+   *
+   * If the key was already in the tree, its associated value is changed.
+   * Otherwise the key-value pair is added to the tree.
+   */
+  void insert(K key, V value) {
+    _Split<K, N> result = _root.insert(key, value);
+    if (result != null) {
+      _IndexNode<K, V, N> newRoot = _newIndexNode();
+      newRoot.keys.add(result.key);
+      newRoot.children.add(result.left);
+      newRoot.children.add(result.right);
+      _root = newRoot;
+      _writeIndexNode(_root);
+    }
+  }
+
+  /**
+   * Removes the association for the given [key].
+   *
+   * Returns the value associated with [key] in the tree or `null` if [key] is
+   * not in the tree.
+   */
+  V remove(K key) {
+    _Remove<K, V> result = _root.remove(key, null, null, null);
+    if (_root is _IndexNode<K, V, N>) {
+      List<N> children = (_root as _IndexNode<K, V, N>).children;
+      if (children.length == 1) {
+        _manager.delete(_root.id);
+        _root = _readNode(children[0]);
+      }
+    }
+    return result.value;
+  }
+
+  /**
+   * Writes a textual presentation of the tree into [buffer].
+   */
+  void writeOn(StringBuffer buffer) {
+    _root.writeOn(buffer, '');
+  }
+
+  /**
+   * Creates a new [_IndexNode] instance.
+   */
+  _IndexNode<K, V, N> _newIndexNode() {
+    N id = _manager.createIndex();
+    return new _IndexNode<K, V, N>(this, id, _maxIndexKeys);
+  }
+
+  /**
+   * Creates a new [_LeafNode] instance.
+   */
+  _LeafNode<K, V, N> _newLeafNode() {
+    N id = _manager.createLeaf();
+    return new _LeafNode<K, V, N>(this, id, _maxLeafKeys);
+  }
+
+  /**
+   * Reads the [_IndexNode] with [id] from the manager.
+   */
+  _IndexNode<K, V, N> _readIndexNode(N id) {
+    IndexNodeData<K, N> data = _manager.readIndex(id);
+    _IndexNode<K, V, N> node = new _IndexNode<K, V, N>(this, id, _maxIndexKeys);
+    node.keys = data.keys;
+    node.children = data.children;
+    return node;
+  }
+
+  /**
+   * Reads the [_LeafNode] with [id] from the manager.
+   */
+  _LeafNode<K, V, N> _readLeafNode(N id) {
+    _LeafNode<K, V, N> node = new _LeafNode<K, V, N>(this, id, _maxLeafKeys);
+    LeafNodeData<K, V> data = _manager.readLeaf(id);
+    node.keys = data.keys;
+    node.values = data.values;
+    return node;
+  }
+
+  /**
+   * Reads the [_IndexNode] or [_LeafNode] with [id] from the manager.
+   */
+  _Node<K, V, N> _readNode(N id) {
+    if (_manager.isIndex(id)) {
+      return _readIndexNode(id);
+    } else {
+      return _readLeafNode(id);
+    }
+  }
+
+  /**
+   * Writes [node] into the manager.
+   */
+  void _writeIndexNode(_IndexNode<K, V, N> node) {
+    _manager.writeIndex(node.id, new IndexNodeData<K, N>(node.keys, node.children));
+  }
+
+  /**
+   * Writes [node] into the manager.
+   */
+  void _writeLeafNode(_LeafNode<K, V, N> node) {
+    _manager.writeLeaf(node.id, new LeafNodeData<K, V>(node.keys, node.values));
+  }
+}
+
+
+/**
+ * A container with information about an index node.
+ */
+class IndexNodeData<K, N> {
+  final List<N> children;
+  final List<K> keys;
+  IndexNodeData(this.keys, this.children);
+}
+
+
+/**
+ * A container with information about a leaf node.
+ */
+class LeafNodeData<K, V> {
+  final List<K> keys;
+  final List<V> values;
+  LeafNodeData(this.keys, this.values);
+}
+
+
+/**
+ * An implementation of [NodeManager] that keeps node information in memory.
+ */
+class MemoryNodeManager<K, V> implements NodeManager<K, V, int> {
+  final int maxIndexKeys;
+  final int maxLeafKeys;
+  Map<int, IndexNodeData> _indexDataMap = new HashMap<int, IndexNodeData>();
+  Map<int, LeafNodeData> _leafDataMap = new HashMap<int, LeafNodeData>();
+
+  int _nextPageIndexId = 0;
+  int _nextPageLeafId = 1;
+
+  MemoryNodeManager(this.maxIndexKeys, this.maxLeafKeys);
+
+  @override
+  int createIndex() {
+    int id = _nextPageIndexId;
+    _nextPageIndexId += 2;
+    return id;
+  }
+
+  @override
+  int createLeaf() {
+    int id = _nextPageLeafId;
+    _nextPageLeafId += 2;
+    return id;
+  }
+
+  @override
+  void delete(int id) {
+    if (isIndex(id)) {
+      _indexDataMap.remove(id);
+    } else {
+      _leafDataMap.remove(id);
+    }
+  }
+
+  @override
+  bool isIndex(int id) {
+    return id.isEven;
+  }
+
+  @override
+  IndexNodeData<K, int> readIndex(int id) {
+    return _indexDataMap[id];
+  }
+
+  @override
+  LeafNodeData<K, V> readLeaf(int id) {
+    return _leafDataMap[id];
+  }
+
+  @override
+  void writeIndex(int id, IndexNodeData<K, int> data) {
+    _indexDataMap[id] = data;
+  }
+
+  @override
+  void writeLeaf(int id, LeafNodeData<K, V> data) {
+    _leafDataMap[id] = data;
+  }
+}
+
+
+/**
+ * A manager that manages nodes.
+ */
+abstract class NodeManager<K, V, N> {
+  /**
+   * The maximum number of keys in an index node.
+   */
+  int get maxIndexKeys;
+
+  /**
+   * The maximum number of keys in a leaf node.
+   */
+  int get maxLeafKeys;
+
+  /**
+   * Generates an identifier for a new index node.
+   */
+  N createIndex();
+
+  /**
+   * Generates an identifier for a new leaf node.
+   */
+  N createLeaf();
+
+  /**
+   * Deletes the node with the given identifier.
+   */
+  void delete(N id);
+
+  /**
+   * Checks if the node with the given identifier is an index or a leaf node.
+   */
+  bool isIndex(N id);
+
+  /**
+   * Reads information about the index node with the given identifier.
+   */
+  IndexNodeData<K, N> readIndex(N id);
+
+  /**
+   * Reads information about the leaf node with the given identifier.
+   */
+  LeafNodeData<K, V> readLeaf(N id);
+
+  /**
+   * Writes information about the index node with the given identifier.
+   */
+  void writeIndex(N id, IndexNodeData<K, N> data);
+
+  /**
+   * Writes information about the leaf node with the given identifier.
+   */
+  void writeLeaf(N id, LeafNodeData<K, V> data);
+}
+
+
+/**
+ * An index node with keys and children references.
+ */
+class _IndexNode<K, V, N> extends _Node<K, V, N> {
+  List<N> children = new List<N>();
+  final int maxKeys;
+  final int minKeys;
+
+  _IndexNode(BPlusTree<K, V, N> tree, N id, int maxKeys)
+      : super(tree, id),
+        maxKeys = maxKeys,
+        minKeys = maxKeys ~/ 2;
+
+  @override
+  V find(K key) {
+    int index = _findChildIndex(key);
+    _Node<K, V, N> child = tree._readNode(children[index]);
+    return child.find(key);
+  }
+
+  _Split<K, N> insert(K key, V value) {
+    // Early split.
+    if (keys.length == maxKeys) {
+      int middle = (maxKeys + 1) ~/ 2;
+      K splitKey = keys[middle];
+      // Overflow into a new sibling.
+      _IndexNode<K, V, N> sibling = tree._newIndexNode();
+      sibling.keys.addAll(keys.getRange(middle + 1, keys.length));
+      sibling.children.addAll(children.getRange(middle + 1, children.length));
+      keys.length = middle;
+      children.length = middle + 1;
+      // Insert into this node or sibling.
+      if (comparator(key, splitKey) < 0) {
+        _insertNotFull(key, value);
+      } else {
+        sibling._insertNotFull(key, value);
+      }
+      // Prepare split.
+      tree._writeIndexNode(this);
+      tree._writeIndexNode(sibling);
+      return new _Split<K, N>(splitKey, id, sibling.id);
+    }
+    // No split.
+    _insertNotFull(key, value);
+    return null;
+  }
+
+  @override
+  _Remove<K, V> remove(K key, _Node<K, V, N> left, K anchor, _Node<K, V,
+      N> right) {
+    int index = _findChildIndex(key);
+    K thisAnchor = index == 0 ? keys[0] : keys[index - 1];
+    // Prepare children.
+    _Node<K, V, N> child = tree._readNode(children[index]);
+    _Node<K, V, N> leftChild;
+    _Node<K, V, N> rightChild;
+    if (index != 0) {
+      leftChild = tree._readNode(children[index - 1]);
+    } else {
+      leftChild = null;
+    }
+    if (index < children.length - 1) {
+      rightChild = tree._readNode(children[index + 1]);
+    } else {
+      rightChild = null;
+    }
+    // Ask child to remove.
+    _Remove<K, V> result = child.remove(key, leftChild, thisAnchor, rightChild);
+    V value = result.value;
+    if (value == null) {
+      return new _Remove<K, V>(value);
+    }
+    // Do keys / children updates
+    bool hasUpdates = false;
+    {
+      // Update anchor if borrowed.
+      if (result.leftAnchor != null) {
+        keys[index - 1] = result.leftAnchor;
+        hasUpdates = true;
+      }
+      if (result.rightAnchor != null) {
+        keys[index] = result.rightAnchor;
+        hasUpdates = true;
+      }
+      // Update keys / children if merged.
+      if (result.mergedLeft) {
+        keys.removeAt(index - 1);
+        N child = children.removeAt(index);
+        manager.delete(child);
+        hasUpdates = true;
+      }
+      if (result.mergedRight) {
+        keys.removeAt(index);
+        N child = children.removeAt(index);
+        manager.delete(child);
+        hasUpdates = true;
+      }
+    }
+    // Write if updated.
+    if (!hasUpdates) {
+      return new _Remove<K, V>(value);
+    }
+    tree._writeIndexNode(this);
+    // Perform balancing.
+    if (keys.length < minKeys) {
+      // Try left sibling.
+      if (left is _IndexNode<K, V, N>) {
+        // Try to redistribute.
+        int leftLength = left.keys.length;
+        if (leftLength > minKeys) {
+          int halfExcess = (leftLength - minKeys + 1) ~/ 2;
+          int newLeftLength = leftLength - halfExcess;
+          keys.insert(0, anchor);
+          keys.insertAll(0, left.keys.getRange(newLeftLength, leftLength));
+          children.insertAll(0, left.children.getRange(newLeftLength, leftLength
+              + 1));
+          K newAnchor = left.keys[newLeftLength - 1];
+          left.keys.length = newLeftLength - 1;
+          left.children.length = newLeftLength;
+          tree._writeIndexNode(this);
+          tree._writeIndexNode(left);
+          return new _Remove<K, V>.borrowLeft(value, newAnchor);
+        }
+        // Do merge.
+        left.keys.add(anchor);
+        left.keys.addAll(keys);
+        left.children.addAll(children);
+        tree._writeIndexNode(this);
+        tree._writeIndexNode(left);
+        return new _Remove<K, V>.mergeLeft(value);
+      }
+      // Try right sibling.
+      if (right is _IndexNode<K, V, N>) {
+        // Try to redistribute.
+        int rightLength = right.keys.length;
+        if (rightLength > minKeys) {
+          int halfExcess = (rightLength - minKeys + 1) ~/ 2;
+          keys.add(anchor);
+          keys.addAll(right.keys.getRange(0, halfExcess - 1));
+          children.addAll(right.children.getRange(0, halfExcess));
+          K newAnchor = right.keys[halfExcess - 1];
+          right.keys.removeRange(0, halfExcess);
+          right.children.removeRange(0, halfExcess);
+          tree._writeIndexNode(this);
+          tree._writeIndexNode(right);
+          return new _Remove<K, V>.borrowRight(value, newAnchor);
+        }
+        // Do merge.
+        right.keys.insert(0, anchor);
+        right.keys.insertAll(0, keys);
+        right.children.insertAll(0, children);
+        tree._writeIndexNode(this);
+        tree._writeIndexNode(right);
+        return new _Remove<K, V>.mergeRight(value);
+      }
+    }
+    // No balancing required.
+    return new _Remove<K, V>(value);
+  }
+
+  @override
+  void writeOn(StringBuffer buffer, String indent) {
+    buffer.write(indent);
+    buffer.write('INode {\n');
+    for (int i = 0; i < keys.length; i++) {
+      _Node<K, V, N> child = tree._readNode(children[i]);
+      child.writeOn(buffer, indent + '    ');
+      buffer.write(indent);
+      buffer.write('  ');
+      buffer.write(keys[i]);
+      buffer.write('\n');
+    }
+    _Node<K, V, N> child = tree._readNode(children[keys.length]);
+    child.writeOn(buffer, indent + '    ');
+    buffer.write(indent);
+    buffer.write('}\n');
+  }
+
+  /**
+   * Returns the index of the child into which [key] should be inserted.
+   */
+  int _findChildIndex(K key) {
+    int lo = 0;
+    int hi = keys.length - 1;
+    while (lo <= hi) {
+      int mid = lo + (hi - lo) ~/ 2;
+      int compare = comparator(key, keys[mid]);
+      if (compare < 0) {
+        hi = mid - 1;
+      } else if (compare > 0) {
+        lo = mid + 1;
+      } else {
+        return mid + 1;
+      }
+    }
+    return lo;
+  }
+
+  void _insertNotFull(K key, V value) {
+    int index = _findChildIndex(key);
+    _Node<K, V, N> child = tree._readNode(children[index]);
+    _Split<K, N> result = child.insert(key, value);
+    if (result != null) {
+      keys.insert(index, result.key);
+      children[index] = result.left;
+      children.insert(index + 1, result.right);
+      tree._writeIndexNode(this);
+    }
+  }
+}
+
+
+/**
+ * A leaf node with keys and values.
+ */
+class _LeafNode<K, V, N> extends _Node<K, V, N> {
+  final int maxKeys;
+  final int minKeys;
+  List<V> values = new List<V>();
+
+  _LeafNode(BPlusTree<K, V, N> tree, N id, int maxKeys)
+      : super(tree, id),
+        maxKeys = maxKeys,
+        minKeys = maxKeys ~/ 2;
+
+  @override
+  V find(K key) {
+    int index = _findKeyIndex(key);
+    if (index < 0) {
+      return null;
+    }
+    if (index >= keys.length) {
+      return null;
+    }
+    if (keys[index] != key) {
+      return null;
+    }
+    return values[index];
+  }
+
+  _Split<K, N> insert(K key, V value) {
+    int index = _findKeyIndex(key);
+    // The node is full.
+    if (keys.length == maxKeys) {
+      int middle = (maxKeys + 1) ~/ 2;
+      _LeafNode<K, V, N> sibling = tree._newLeafNode();
+      sibling.keys.addAll(keys.getRange(middle, keys.length));
+      sibling.values.addAll(values.getRange(middle, values.length));
+      keys.length = middle;
+      values.length = middle;
+      // Insert into the left / right sibling.
+      if (index < middle) {
+        _insertNotFull(key, value, index);
+      } else {
+        sibling._insertNotFull(key, value, index - middle);
+      }
+      // Notify the parent about the split.
+      tree._writeLeafNode(this);
+      tree._writeLeafNode(sibling);
+      return new _Split<K, N>(sibling.keys[0], id, sibling.id);
+    }
+    // The node was not full.
+    _insertNotFull(key, value, index);
+    return null;
+  }
+
+  @override
+  _Remove<K, V> remove(K key, _Node<K, V, N> left, K anchor, _Node<K, V,
+      N> right) {
+    // Find the key.
+    int index = keys.indexOf(key);
+    if (index == -1) {
+      return new _Remove<K, V>(null);
+    }
+    // Remove key / value.
+    keys.removeAt(index);
+    V value = values.removeAt(index);
+    tree._writeLeafNode(this);
+    // Perform balancing.
+    if (keys.length < minKeys) {
+      // Try left sibling.
+      if (left is _LeafNode<K, V, N>) {
+        // Try to redistribute.
+        int leftLength = left.keys.length;
+        if (leftLength > minKeys) {
+          int halfExcess = (leftLength - minKeys + 1) ~/ 2;
+          int newLeftLength = leftLength - halfExcess;
+          keys.insertAll(0, left.keys.getRange(newLeftLength, leftLength));
+          values.insertAll(0, left.values.getRange(newLeftLength, leftLength));
+          left.keys.length = newLeftLength;
+          left.values.length = newLeftLength;
+          tree._writeLeafNode(this);
+          tree._writeLeafNode(left);
+          return new _Remove<K, V>.borrowLeft(value, keys.first);
+        }
+        // Do merge.
+        left.keys.addAll(keys);
+        left.values.addAll(values);
+        tree._writeLeafNode(this);
+        tree._writeLeafNode(left);
+        return new _Remove<K, V>.mergeLeft(value);
+      }
+      // Try right sibling.
+      if (right is _LeafNode<K, V, N>) {
+        // Try to redistribute.
+        int rightLength = right.keys.length;
+        if (rightLength > minKeys) {
+          int halfExcess = (rightLength - minKeys + 1) ~/ 2;
+          keys.addAll(right.keys.getRange(0, halfExcess));
+          values.addAll(right.values.getRange(0, halfExcess));
+          right.keys.removeRange(0, halfExcess);
+          right.values.removeRange(0, halfExcess);
+          tree._writeLeafNode(this);
+          tree._writeLeafNode(right);
+          return new _Remove<K, V>.borrowRight(value, right.keys.first);
+        }
+        // Do merge.
+        right.keys.insertAll(0, keys);
+        right.values.insertAll(0, values);
+        tree._writeLeafNode(this);
+        tree._writeLeafNode(right);
+        return new _Remove<K, V>.mergeRight(value);
+      }
+    }
+    // No balancing required.
+    return new _Remove<K, V>(value);
+  }
+
+  @override
+  void writeOn(StringBuffer buffer, String indent) {
+    buffer.write(indent);
+    buffer.write('LNode {');
+    for (int i = 0; i < keys.length; i++) {
+      if (i != 0) {
+        buffer.write(', ');
+      }
+      buffer.write(keys[i]);
+      buffer.write(': ');
+      buffer.write(values[i]);
+    }
+    buffer.write('}\n');
+  }
+
+  /**
+   * Returns the index where [key] should be inserted.
+   */
+  int _findKeyIndex(K key) {
+    int lo = 0;
+    int hi = keys.length - 1;
+    while (lo <= hi) {
+      int mid = lo + (hi - lo) ~/ 2;
+      int compare = comparator(key, keys[mid]);
+      if (compare < 0) {
+        hi = mid - 1;
+      } else if (compare > 0) {
+        lo = mid + 1;
+      } else {
+        return mid;
+      }
+    }
+    return lo;
+  }
+
+  void _insertNotFull(K key, V value, int index) {
+    if (index < keys.length && comparator(keys[index], key) == 0) {
+      values[index] = value;
+    } else {
+      keys.insert(index, key);
+      values.insert(index, value);
+    }
+    tree._writeLeafNode(this);
+  }
+}
+
+
+/**
+ * An internal or leaf node.
+ */
+abstract class _Node<K, V, N> {
+  /**
+   * The [Comparator] to compare keys.
+   */
+  final Comparator<K> comparator;
+
+  /**
+   * The identifier of this node.
+   */
+  final N id;
+
+  /**
+   *  The list of keys.
+   */
+  List<K> keys = new List<K>();
+
+  /**
+   * The [NodeManager] for this tree.
+   */
+  final NodeManager<K, V, N> manager;
+
+  /**
+   * The [BPlusTree] this node belongs to.
+   */
+  final BPlusTree<K, V, N> tree;
+
+  _Node(BPlusTree<K, V, N> tree, this.id)
+      : tree = tree,
+        comparator = tree._comparator,
+        manager = tree._manager;
+
+  /**
+   * Looks for [key].
+   *
+   * Returns the associated value if found.
+   * Returns `null` if not found.
+   */
+  V find(K key);
+
+  /**
+   * Inserts the [key] / [value] pair into this [_Node].
+   *
+   * Returns a [_Split] object if split happens, or `null` otherwise.
+   */
+  _Split<K, N> insert(K key, V value);
+
+  /**
+   * Removes the association for the given [key].
+   *
+   * Returns the [_Remove] information about an operation performed.
+   * It may be restructuring or merging, with [left] or [left] siblings.
+   */
+  _Remove<K, V> remove(K key, _Node<K, V, N> left, K anchor, _Node<K, V,
+      N> right);
+
+  /**
+   * Writes a textual presentation of the tree into [buffer].
+   */
+  void writeOn(StringBuffer buffer, String indent);
+}
+
+
+/**
+ * A container with information about redistribute / merge.
+ */
+class _Remove<K, V> {
+  K leftAnchor;
+  bool mergedLeft = false;
+  bool mergedRight = false;
+  K rightAnchor;
+  final V value;
+  _Remove(this.value);
+  _Remove.borrowLeft(this.value, this.leftAnchor);
+  _Remove.borrowRight(this.value, this.rightAnchor);
+  _Remove.mergeLeft(this.value) : mergedLeft = true;
+  _Remove.mergeRight(this.value) : mergedRight = true;
+}
+
+
+/**
+ * A container with information about split during insert.
+ */
+class _Split<K, N> {
+  final K key;
+  final N left;
+  final N right;
+  _Split(this.key, this.left, this.right);
+}
diff --git a/pkg/analysis_server/lib/src/index/file_page_manager.dart b/pkg/analysis_server/lib/src/index/file_page_manager.dart
new file mode 100644
index 0000000..55c2c75
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/file_page_manager.dart
@@ -0,0 +1,84 @@
+// 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 index.file_page_manager;
+
+import 'dart:io';
+import 'dart:typed_data';
+
+import 'package:analysis_server/src/index/page_node_manager.dart';
+
+
+/**
+ * A [PageManager] that stores pages on disk.
+ */
+class FilePageManager implements PageManager {
+  final int pageSizeInBytes;
+
+  RandomAccessFile _file;
+  File _fileRef;
+  List<int> _freePagesList = new List<int>();
+  Set<int> _freePagesSet = new Set<int>();
+  int _nextPage = 0;
+
+  FilePageManager(this.pageSizeInBytes, String path) {
+    _fileRef = new File(path);
+    _file = _fileRef.openSync(mode: FileMode.WRITE);
+  }
+
+  @override
+  int alloc() {
+    if (_freePagesList.isNotEmpty) {
+      int id = _freePagesList.removeLast();
+      _freePagesSet.remove(id);
+      return id;
+    }
+    int id = _nextPage++;
+    Uint8List page = new Uint8List(pageSizeInBytes);
+    _file.setPositionSync(id * pageSizeInBytes);
+    _file.writeFromSync(page);
+    return id;
+  }
+
+  /**
+   * Closes this [FilePageManager].
+   */
+  void close() {
+    _file.closeSync();
+  }
+
+  /**
+   * Deletes the underlaying file.
+   */
+  void delete() {
+    if (_fileRef.existsSync()) {
+      _fileRef.deleteSync();
+    }
+  }
+
+  @override
+  void free(int id) {
+    if (!_freePagesSet.add(id)) {
+      throw new StateError('Page $id has been already freed.');
+    }
+    _freePagesList.add(id);
+  }
+
+  @override
+  Uint8List read(int id) {
+    Uint8List page = new Uint8List(pageSizeInBytes);
+    _file.setPositionSync(id * pageSizeInBytes);
+    int actual = 0;
+    while (actual != page.length) {
+      actual += _file.readIntoSync(page, actual);
+    }
+    return page;
+  }
+
+  @override
+  void write(int id, Uint8List page) {
+    _file.setPositionSync(id * pageSizeInBytes);
+    _file.writeFromSync(page);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/index.dart b/pkg/analysis_server/lib/src/index/index.dart
new file mode 100644
index 0000000..023cfc9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/index.dart
@@ -0,0 +1,115 @@
+// 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 index;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:analysis_server/src/index/store/codec.dart';
+import 'package:analysis_server/src/index/store/separate_file_manager.dart';
+import 'package:analysis_server/src/index/store/split_store.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/html.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+Index createLocalFileSplitIndex(Directory directory) {
+  var fileManager = new SeparateFileManager(directory);
+  var stringCodec = new StringCodec();
+  var nodeManager = new FileNodeManager(fileManager,
+      AnalysisEngine.instance.logger, stringCodec, new ContextCodec(),
+      new ElementCodec(stringCodec), new RelationshipCodec(stringCodec));
+  return new LocalIndex(nodeManager);
+}
+
+
+/**
+ * A local implementation of [Index].
+ */
+class LocalIndex extends Index {
+  SplitIndexStore _store;
+
+  LocalIndex(NodeManager nodeManager) {
+    _store = new SplitIndexStore(nodeManager);
+  }
+
+  @override
+  String get statistics => _store.statistics;
+
+  @override
+  void clear() {
+    _store.clear();
+  }
+
+  @override
+  void getRelationships(Element element, Relationship relationship,
+      RelationshipCallback callback) {
+    // TODO(scheglov) update Index API to use asynchronous interface
+    callback.hasRelationships(element, relationship, Location.EMPTY_ARRAY);
+  }
+
+  /**
+   * Returns a `Future<List<Location>>` that completes with the list of
+   * [Location]s of the given [relationship] with the given [element].
+   *
+   * For example, if the [element] represents a function and the [relationship]
+   * is the `is-invoked-by` relationship, then the locations will be all of the
+   * places where the function is invoked.
+   */
+  Future<List<Location>> getRelationshipsAsync(Element element,
+      Relationship relationship) {
+    return _store.getRelationshipsAsync(element, relationship);
+  }
+
+  @override
+  void indexHtmlUnit(AnalysisContext context, HtmlUnit unit) {
+    if (unit == null) {
+      return;
+    }
+    if (unit.element == null) {
+      return;
+    }
+    new IndexHtmlUnitOperation(_store, context, unit).performOperation();
+  }
+
+  @override
+  void indexUnit(AnalysisContext context, CompilationUnit unit) {
+    if (unit == null) {
+      return;
+    }
+    if (unit.element == null) {
+      return;
+    }
+    new IndexUnitOperation(_store, context, unit).performOperation();
+  }
+
+  @override
+  void removeContext(AnalysisContext context) {
+    _store.removeContext(context);
+  }
+
+  @override
+  void removeSource(AnalysisContext context, Source source) {
+    _store.removeSource(context, source);
+  }
+
+  @override
+  void removeSources(AnalysisContext context, SourceContainer container) {
+    _store.removeSources(context, container);
+  }
+
+  @override
+  void run() {
+    // NO-OP if in the same isolate
+  }
+
+  @override
+  void stop() {
+    // NO-OP if in the same isolate
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/lru_cache.dart b/pkg/analysis_server/lib/src/index/lru_cache.dart
new file mode 100644
index 0000000..82dfeb5
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/lru_cache.dart
@@ -0,0 +1,69 @@
+// 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 index.lru_cache;
+
+import 'dart:collection';
+
+
+/**
+ * This handler is notified when an item is evicted from the cache.
+ */
+typedef EvictionHandler<K, V>(K key, V value);
+
+/**
+ * A hash-table based cache implementation.
+ *
+ * When it reaches the specified number of items, the item that has not been
+ * accessed (both get and put) recently is evicted.
+ */
+class LRUCache<K, V> {
+  final LinkedHashSet<K> _lastKeys = new LinkedHashSet<K>();
+  final HashMap<K, V> _map = new HashMap<K, V>();
+  final int _maxSize;
+  final EvictionHandler _handler;
+
+  LRUCache(this._maxSize, [this._handler]);
+
+  /**
+   * Returns the value for the given [key] or null if [key] is not
+   * in the cache.
+   */
+  V get(K key) {
+    V value = _map[key];
+    if (value != null) {
+      _lastKeys.remove(key);
+      _lastKeys.add(key);
+    }
+    return value;
+  }
+
+  /**
+   * Removes the association for the given [key].
+   */
+  void remove(K key) {
+    _lastKeys.remove(key);
+    _map.remove(key);
+  }
+
+  /**
+   * Associates the [key] with the given [value].
+   *
+   * If the cache is full, an item that has not been accessed recently is
+   * evicted.
+   */
+  void put(K key, V value) {
+    _lastKeys.remove(key);
+    _lastKeys.add(key);
+    if (_lastKeys.length > _maxSize) {
+      K evictedKey = _lastKeys.first;
+      V evictedValue = _map.remove(evictedKey);
+      _lastKeys.remove(evictedKey);
+      if (_handler != null) {
+        _handler(evictedKey, evictedValue);
+      }
+    }
+    _map[key] = value;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/page_node_manager.dart b/pkg/analysis_server/lib/src/index/page_node_manager.dart
new file mode 100644
index 0000000..e03374a
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/page_node_manager.dart
@@ -0,0 +1,461 @@
+// 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 index.page_node_manager;
+
+import 'dart:collection';
+import 'dart:typed_data';
+
+import 'package:analysis_server/src/index/b_plus_tree.dart';
+import 'package:analysis_server/src/index/lru_cache.dart';
+
+
+/**
+ * A [NodeManager] that caches a specified number of index and leaf nodes.
+ */
+class CachingNodeManager<K, V, N> implements NodeManager<K, V, N> {
+  final NodeManager<K, V, N> _delegate;
+  LRUCache<N, IndexNodeData<K, N>> _indexCache;
+  LRUCache<N, LeafNodeData<K, V>> _leafCache;
+
+  CachingNodeManager(this._delegate, int indexNodeCacheSize,
+      int leafNodeCacheSize) {
+    _indexCache = new LRUCache<N, IndexNodeData<K, N>>(indexNodeCacheSize,
+        _delegate.writeIndex);
+    _leafCache = new LRUCache<N, LeafNodeData<K, V>>(leafNodeCacheSize,
+        _delegate.writeLeaf);
+  }
+
+  @override
+  int get maxIndexKeys => _delegate.maxIndexKeys;
+
+  @override
+  int get maxLeafKeys => _delegate.maxLeafKeys;
+
+  @override
+  N createIndex() {
+    return _delegate.createIndex();
+  }
+
+  @override
+  N createLeaf() {
+    return _delegate.createLeaf();
+  }
+
+  @override
+  void delete(N id) {
+    _indexCache.remove(id);
+    _leafCache.remove(id);
+    _delegate.delete(id);
+  }
+
+  @override
+  bool isIndex(N id) {
+    return _delegate.isIndex(id);
+  }
+
+  @override
+  IndexNodeData<K, N> readIndex(N id) {
+    IndexNodeData<K, N> data = _indexCache.get(id);
+    if (data == null) {
+      data = _delegate.readIndex(id);
+      _indexCache.put(id, data);
+    }
+    return data;
+  }
+
+  @override
+  LeafNodeData<K, V> readLeaf(N id) {
+    LeafNodeData<K, V> data = _leafCache.get(id);
+    if (data == null) {
+      data = _delegate.readLeaf(id);
+      _leafCache.put(id, data);
+    }
+    return data;
+  }
+
+  @override
+  void writeIndex(N id, IndexNodeData<K, N> data) {
+    _indexCache.put(id, data);
+  }
+
+  @override
+  void writeLeaf(N id, LeafNodeData<K, V> data) {
+    _leafCache.put(id, data);
+  }
+}
+
+
+/**
+ * A [Codec] encodes and decodes data.
+ */
+abstract class Codec<E> {
+  /**
+   * The size of the value in bytes.
+   */
+  int get sizeInBytes;
+
+  /**
+   * Returns the value decoded from [buffer].
+   *
+   * The given [buffer] has exactly [sizeInBytes] bytes length.
+   */
+  E decode(ByteData buffer);
+
+  /**
+   * Encodes [value] into [buffer].
+   *
+   * The given [buffer] has exactly [sizeInBytes] bytes length.
+   */
+  void encode(ByteData buffer, E value);
+}
+
+
+/**
+ * A [Codec] for strings with a predefined maximum length.
+ */
+class FixedStringCodec implements Codec<String> {
+  final int maxLength;
+  final int sizeInBytes;
+
+  const FixedStringCodec(int maxLength)
+      : maxLength = maxLength,
+        sizeInBytes = 2 + 2 * maxLength;
+
+  @override
+  String decode(ByteData buffer) {
+    int length = buffer.getUint16(0);
+    int offset = 2;
+    List<int> codeUnits = new List<int>(length);
+    for (int i = 0; i < length; i++) {
+      codeUnits[i] = buffer.getUint16(offset);
+      offset += 2;
+    }
+    return new String.fromCharCodes(codeUnits);
+  }
+
+  @override
+  void encode(ByteData buffer, String value) {
+    int length = value.length;
+    if (length > maxLength) {
+      throw new ArgumentError(
+          'String $value length=$length is greater than allowed $maxLength');
+    }
+    buffer.setUint16(0, length);
+    int offset = 2;
+    List<int> codeUnits = value.codeUnits;
+    for (int i = 0; i < length; i++) {
+      buffer.setUint16(offset, codeUnits[i]);
+      offset += 2;
+    }
+  }
+}
+
+
+/**
+ * A [PageManager] that keeps all [Uint8List] pages in memory.
+ */
+class MemoryPageManager implements PageManager {
+  final int pageSizeInBytes;
+  int _nextPage = 0;
+  final Map<int, Uint8List> _pages = new HashMap<int, Uint8List>();
+
+  MemoryPageManager(this.pageSizeInBytes);
+
+  @override
+  int alloc() {
+    int id = _nextPage++;
+    Uint8List page = new Uint8List(pageSizeInBytes);
+    _pages[id] = page;
+    return id;
+  }
+
+  @override
+  void free(int id) {
+    Uint8List page = _pages.remove(id);
+    if (page == null) {
+      throw new StateError('Page $id has been already freed.');
+    }
+  }
+
+  @override
+  Uint8List read(int id) {
+    Uint8List page = _pages[id];
+    if (page == null) {
+      throw new StateError('Page $id does not exist.');
+    }
+    return page;
+  }
+
+  @override
+  void write(int id, Uint8List page) {
+    if (!_pages.containsKey(id)) {
+      throw new StateError('Page $id does not exist.');
+    }
+    if (page.length != pageSizeInBytes) {
+      throw new ArgumentError('Page $id has length ${page.length}, '
+          'but $pageSizeInBytes is expected.');
+    }
+    _pages[id] = page;
+  }
+}
+
+
+/**
+ * [PageManager] allows to allocate, read, write and free [Uint8List] pages.
+ */
+abstract class PageManager {
+  /**
+   * The size of pages provided by this [PageManager].
+   */
+  int get pageSizeInBytes;
+
+  /**
+   * Allocates a new page and returns its identifier.
+   */
+  int alloc();
+
+  /**
+   * Frees the page with the given identifier.
+   */
+  void free(int id);
+
+  /**
+   * Reads the page with the given identifier and returns its content.
+   *
+   * An internal representation of the page is returned, any changes made to it
+   * may be accessible to other clients reading the same page.
+   */
+  Uint8List read(int id);
+
+  /**
+   * Writes the given page.
+   */
+  void write(int id, Uint8List page);
+}
+
+
+/**
+ * A [NodeManager] that keeps nodes in [PageManager].
+ */
+class PageNodeManager<K, V> implements NodeManager<K, V, int> {
+  static const int _INDEX_OFFSET_DATA = 4;
+  static const int _INDEX_OFFSET_KEY_COUNT = 0;
+  static const int _LEAF_OFFSET_DATA = 4;
+  static const int _LEAF_OFFSET_KEY_COUNT = 0;
+
+  final Set<int> _indexPages = new HashSet<int>();
+  Codec<K> _keyCodec;
+  final Set<int> _leafPages = new HashSet<int>();
+  PageManager _pageManager;
+  Codec<V> _valueCodec;
+
+  PageNodeManager(this._pageManager, this._keyCodec, this._valueCodec);
+
+  @override
+  int get maxIndexKeys {
+    int keySize = _keyCodec.sizeInBytes;
+    int childSize = 4;
+    int dataSize = _pageManager.pageSizeInBytes - _INDEX_OFFSET_DATA;
+    return (dataSize - childSize) ~/ (keySize + childSize);
+  }
+
+  @override
+  int get maxLeafKeys {
+    int keySize = _keyCodec.sizeInBytes;
+    int valueSize = _valueCodec.sizeInBytes;
+    int dataSize = _pageManager.pageSizeInBytes - _INDEX_OFFSET_DATA;
+    return dataSize ~/ (keySize + valueSize);
+  }
+
+  @override
+  int createIndex() {
+    int id = _pageManager.alloc();
+    _indexPages.add(id);
+    return id;
+  }
+
+  @override
+  int createLeaf() {
+    int id = _pageManager.alloc();
+    _leafPages.add(id);
+    return id;
+  }
+
+  @override
+  void delete(int id) {
+    _pageManager.free(id);
+    _indexPages.remove(id);
+    _leafPages.remove(id);
+  }
+
+  @override
+  bool isIndex(int id) {
+    return _indexPages.contains(id);
+  }
+
+  @override
+  IndexNodeData<K, int> readIndex(int id) {
+    Uint8List page = _pageManager.read(id);
+    // read header
+    int keyCount;
+    {
+      ByteData data = new ByteData.view(page.buffer);
+      keyCount = data.getInt32(_INDEX_OFFSET_KEY_COUNT);
+    }
+    // read keys/children
+    List<K> keys = new List<K>();
+    List<int> children = new List<int>();
+    int keySize = _keyCodec.sizeInBytes;
+    int offset = _INDEX_OFFSET_DATA;
+    for (int i = 0; i < keyCount; i++) {
+      // read child
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset);
+        int childPage = byteData.getUint32(0);
+        children.add(childPage);
+        offset += 4;
+      }
+      // read key
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset, keySize);
+        K key = _keyCodec.decode(byteData);
+        keys.add(key);
+        offset += keySize;
+      }
+    }
+    // read last child
+    {
+      ByteData byteData = new ByteData.view(page.buffer, offset);
+      int childPage = byteData.getUint32(0);
+      children.add(childPage);
+    }
+    // done
+    return new IndexNodeData<K, int>(keys, children);
+  }
+
+  @override
+  LeafNodeData<K, V> readLeaf(int id) {
+    Uint8List page = _pageManager.read(id);
+    // read header
+    int keyCount;
+    {
+      ByteData data = new ByteData.view(page.buffer);
+      keyCount = data.getInt32(_LEAF_OFFSET_KEY_COUNT);
+    }
+    // read keys/children
+    List<K> keys = new List<K>();
+    List<V> values = new List<V>();
+    int keySize = _keyCodec.sizeInBytes;
+    int valueSize = _valueCodec.sizeInBytes;
+    int offset = _LEAF_OFFSET_DATA;
+    for (int i = 0; i < keyCount; i++) {
+      // read key
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset, keySize);
+        K key = _keyCodec.decode(byteData);
+        keys.add(key);
+        offset += keySize;
+      }
+      // read value
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset);
+        V value = _valueCodec.decode(byteData);
+        values.add(value);
+        offset += valueSize;
+      }
+    }
+    // done
+    return new LeafNodeData<K, V>(keys, values);
+  }
+
+  @override
+  void writeIndex(int id, IndexNodeData<K, int> data) {
+    Uint8List page = new Uint8List(_pageManager.pageSizeInBytes);
+    // write header
+    int keyCount = data.keys.length;
+    {
+      ByteData byteData = new ByteData.view(page.buffer);
+      byteData.setUint32(PageNodeManager._INDEX_OFFSET_KEY_COUNT, keyCount);
+    }
+    // write keys/children
+    int keySize = _keyCodec.sizeInBytes;
+    int offset = PageNodeManager._INDEX_OFFSET_DATA;
+    for (int i = 0; i < keyCount; i++) {
+      // write child
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset);
+        byteData.setUint32(0, data.children[i]);
+        offset += 4;
+      }
+      // write key
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset, keySize);
+        _keyCodec.encode(byteData, data.keys[i]);
+        offset += keySize;
+      }
+    }
+    // write last child
+    {
+      ByteData byteData = new ByteData.view(page.buffer, offset);
+      byteData.setUint32(0, data.children.last);
+    }
+    // write page
+    _pageManager.write(id, page);
+  }
+
+  @override
+  void writeLeaf(int id, LeafNodeData<K, V> data) {
+    Uint8List page = new Uint8List(_pageManager.pageSizeInBytes);
+    // write header
+    int keyCount = data.keys.length;
+    {
+      ByteData byteData = new ByteData.view(page.buffer);
+      byteData.setUint32(PageNodeManager._LEAF_OFFSET_KEY_COUNT, keyCount);
+    }
+    // write keys/values
+    int keySize = _keyCodec.sizeInBytes;
+    int valueSize = _valueCodec.sizeInBytes;
+    int offset = PageNodeManager._LEAF_OFFSET_DATA;
+    for (int i = 0; i < keyCount; i++) {
+      // write key
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset, keySize);
+        _keyCodec.encode(byteData, data.keys[i]);
+        offset += keySize;
+      }
+      // write value
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset);
+        _valueCodec.encode(byteData, data.values[i]);
+        offset += valueSize;
+      }
+    }
+    // write page
+    _pageManager.write(id, page);
+  }
+}
+
+
+/**
+ * A [Codec] for unsigned 32-bit integers.
+ */
+class Uint32Codec implements Codec<int> {
+  static const Uint32Codec INSTANCE = const Uint32Codec._();
+
+  const Uint32Codec._();
+
+  @override
+  int get sizeInBytes => 4;
+
+  @override
+  int decode(ByteData buffer) {
+    return buffer.getUint32(0);
+  }
+
+  @override
+  void encode(ByteData buffer, int element) {
+    buffer.setUint32(0, element);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/store/codec.dart b/pkg/analysis_server/lib/src/index/store/codec.dart
new file mode 100644
index 0000000..20a66fd
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/store/codec.dart
@@ -0,0 +1,216 @@
+// 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 index.store.codec;
+
+import 'dart:collection';
+
+import 'package:analysis_server/src/index/store/collection.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/index.dart';
+
+
+/**
+ * A helper that encodes/decodes [AnalysisContext]s from/to integers.
+ */
+class ContextCodec {
+  /**
+   * A table mapping contexts to their unique indices.
+   */
+  Map<AnalysisContext, int> _contextToIndex = new HashMap<AnalysisContext, int>(
+      );
+
+  /**
+   * A table mapping indices to the corresponding contexts.
+   */
+  Map<int, AnalysisContext> _indexToContext = new HashMap<int, AnalysisContext>(
+      );
+
+  /**
+   * The next id to assign.
+   */
+  int _nextId = 0;
+
+  /**
+   * Returns the [AnalysisContext] that corresponds to the given index.
+   */
+  AnalysisContext decode(int index) => _indexToContext[index];
+
+  /**
+   * Returns an unique index for the given [AnalysisContext].
+   */
+  int encode(AnalysisContext context) {
+    int index = _contextToIndex[context];
+    if (index == null) {
+      index = _nextId++;
+      _contextToIndex[context] = index;
+      _indexToContext[index] = context;
+    }
+    return index;
+  }
+
+  /**
+   * Removes the given [context].
+   */
+  void remove(AnalysisContext context) {
+    int id = _contextToIndex.remove(context);
+    if (id != null) {
+      _indexToContext.remove(id);
+    }
+  }
+}
+
+
+/**
+ * A helper that encodes/decodes [Element]s to/from integers.
+ */
+class ElementCodec {
+  /**
+   * A list that works as a mapping of integers to element encodings (in form of integer arrays).
+   */
+  List<List<int>> _indexToPath = [];
+
+  /**
+   * A table mapping element locations (in form of integer arrays) into a single integer.
+   */
+  IntArrayToIntMap _pathToIndex = new IntArrayToIntMap();
+
+  final StringCodec _stringCodec;
+
+  ElementCodec(this._stringCodec);
+
+  /**
+   * Returns an [Element] that corresponds to the given location.
+   *
+   * @param context the [AnalysisContext] to find [Element] in
+   * @param index an integer corresponding to the [Element]
+   * @return the [Element] or `null`
+   */
+  Element decode(AnalysisContext context, int index) {
+    List<int> path = _indexToPath[index];
+    List<String> components = _getLocationComponents(path);
+    ElementLocation location = new ElementLocationImpl.con3(components);
+    return context.getElement(location);
+  }
+
+  /**
+   * Returns a unique integer that corresponds to the given [Element].
+   */
+  int encode(Element element) {
+    List<int> path = _getLocationPath(element);
+    int index = _pathToIndex[path];
+    if (index == null) {
+      index = _indexToPath.length;
+      _pathToIndex[path] = index;
+      _indexToPath.add(path);
+    }
+    return index;
+  }
+
+  List<String> _getLocationComponents(List<int> path) {
+    int length = path.length;
+    List<String> components = new List<String>();
+    for (int i = 0; i < length; i++) {
+      int componentId = path[i];
+      String component = _stringCodec.decode(componentId);
+      if (i < length - 1 && path[i + 1] < 0) {
+        component += '@${(-path[i + 1])}';
+        i++;
+      }
+      components.add(component);
+    }
+    return components;
+  }
+
+  List<int> _getLocationPath(Element element) {
+    List<String> components = element.location.components;
+    int length = components.length;
+    if (_hasLocalOffset(components)) {
+      List<int> path = new List<int>();
+      for (String component in components) {
+        int atOffset = component.indexOf('@');
+        if (atOffset == -1) {
+          path.add(_stringCodec.encode(component));
+        } else {
+          String preAtString = component.substring(0, atOffset);
+          String atString = component.substring(atOffset + 1);
+          path.add(_stringCodec.encode(preAtString));
+          path.add(-1 * int.parse(atString));
+        }
+      }
+      return path;
+    } else {
+      List<int> path = new List<int>.filled(length, 0);
+      for (int i = 0; i < length; i++) {
+        String component = components[i];
+        path[i] = _stringCodec.encode(component);
+      }
+      return path;
+    }
+  }
+
+  bool _hasLocalOffset(List<String> components) {
+    for (String component in components) {
+      if (component.indexOf('@') != -1) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+
+/**
+ * A helper that encodes/decodes [Relationship]s to/from integers.
+ */
+class RelationshipCodec {
+  final StringCodec _stringCodec;
+
+  RelationshipCodec(this._stringCodec);
+
+  Relationship decode(int idIndex) {
+    String id = _stringCodec.decode(idIndex);
+    return Relationship.getRelationship(id);
+  }
+
+  int encode(Relationship relationship) {
+    String id = relationship.identifier;
+    return _stringCodec.encode(id);
+  }
+}
+
+
+/**
+ * A helper that encodes/decodes [String]s from/to integers.
+ */
+class StringCodec {
+  /**
+   * A table mapping names to their unique indices.
+   */
+  final Map<String, int> nameToIndex = {};
+
+  /**
+   * A table mapping indices to the corresponding strings.
+   */
+  List<String> _indexToName = [];
+
+  /**
+   * Returns the [String] that corresponds to the given index.
+   */
+  String decode(int index) => _indexToName[index];
+
+  /**
+   * Returns an unique index for the given [String].
+   */
+  int encode(String name) {
+    int index = nameToIndex[name];
+    if (index == null) {
+      index = _indexToName.length;
+      nameToIndex[name] = index;
+      _indexToName.add(name);
+    }
+    return index;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/store/collection.dart b/pkg/analysis_server/lib/src/index/store/collection.dart
new file mode 100644
index 0000000..3c29445
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/store/collection.dart
@@ -0,0 +1,116 @@
+// 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 index.store.collection;
+
+import 'dart:collection';
+import 'dart:typed_data';
+
+
+/**
+ * A hash map with `List<int>` keys and [int] values.
+ */
+class IntArrayToIntMap {
+  final Map<Int32List, int> map = new HashMap<Int32List, int>(equals:
+      _intArrayEquals, hashCode: _intArrayHashCode);
+
+  /**
+   * Returns the value for the given [key] or null if [key] is not in the map.
+   */
+  int operator[](List<int> key) {
+    Int32List typedKey = _getTypedKey(key);
+    return map[typedKey];
+  }
+
+  /**
+   * Associates the [key] with the given [value].
+   *
+   * If the key was already in the map, its associated value is changed.
+   * Otherwise the key-value pair is added to the map.
+   */
+  void operator[]=(List<int> key, int value) {
+    Int32List typedKey = _getTypedKey(key);
+    map[typedKey] = value;
+  }
+
+  /**
+   * Returns an [Int32List] version of the given `List<int>` key.
+   */
+  static Int32List _getTypedKey(List<int> key) {
+    if (key is Int32List) {
+      return key;
+    }
+    return new Int32List.fromList(key);
+  }
+
+  static bool _intArrayEquals(List<int> a, List<int> b) {
+    int length = a.length;
+    if (length != b.length) {
+      return false;
+    }
+    for (int i = 0; i < length; i++) {
+      if (a[i] != b[i]) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  static int _intArrayHashCode(List<int> key) {
+    return key.fold(0, (int result, int item) {
+      return 31 * result + item;
+    });
+  }
+}
+
+
+/**
+ * A table mapping [int] keys to sets of [int]s.
+ */
+class IntToIntSetMap {
+  final Map<int, Int32List> _map = new HashMap<int, Int32List>();
+
+  /**
+   * The number of key-value pairs in the map.
+   */
+  int get length => _map.length;
+
+  /**
+   * Adds the [value] to the set associated with the given [value].
+   */
+  void add(int key, int value) {
+    Int32List values = _map[key];
+    if (values == null) {
+      values = new Int32List(1);
+      values[0] = value;
+      _map[key] = values;
+    }
+    if (values.indexOf(value) == -1) {
+      int length = values.length;
+      Int32List newSet = new Int32List(length + 1);
+      newSet.setRange(0, length, values);
+      newSet[length] = value;
+      _map[key] = newSet;
+    }
+  }
+
+  /**
+   * Removes all pairs from the map.
+   */
+  void clear() {
+    _map.clear();
+  }
+
+  /**
+   * Returns the set of [int]s for the given [key] or an empty list if [key] is
+   * not in the map.
+   */
+  List<int> get(int key) {
+    List<int> values = _map[key];
+    if (values == null) {
+      values = <int>[];
+    }
+    return values;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/store/separate_file_manager.dart b/pkg/analysis_server/lib/src/index/store/separate_file_manager.dart
new file mode 100644
index 0000000..143fb5e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/store/separate_file_manager.dart
@@ -0,0 +1,59 @@
+// 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 index.store.separate_file_mananer;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:analysis_server/src/index/store/split_store.dart';
+import 'package:path/path.dart' as pathos;
+
+
+/**
+ * An implementation of [FileManager] that keeps each file in a separate file
+ * system file.
+ */
+class SeparateFileManager implements FileManager {
+  final Directory _directory;
+
+  SeparateFileManager(this._directory) {
+    clear();
+  }
+
+  @override
+  void clear() {
+    List<FileSystemEntity> entries = _directory.listSync();
+    for (FileSystemEntity entry in entries) {
+      entry.deleteSync(recursive: true);
+    }
+  }
+
+  @override
+  void delete(String name) {
+    File file = _getFile(name);
+    try {
+      file.deleteSync();
+    } catch (e) {
+    }
+  }
+
+  @override
+  Future<List<int>> read(String name) {
+    File file = _getFile(name);
+    return file.readAsBytes().catchError((e) {
+      return null;
+    });
+  }
+
+  @override
+  Future write(String name, List<int> bytes) {
+    return _getFile(name).writeAsBytes(bytes);
+  }
+
+  File _getFile(String name) {
+    String path = pathos.join(_directory.path, name);
+    return new File(path);
+  }
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/index/store/split_store.dart b/pkg/analysis_server/lib/src/index/store/split_store.dart
new file mode 100644
index 0000000..ccb6bd9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/store/split_store.dart
@@ -0,0 +1,898 @@
+// 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 index.split_store;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:io';
+import 'dart:typed_data';
+
+import 'package:analysis_server/src/index/store/collection.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analysis_server/src/index/store/codec.dart';
+
+
+/**
+ * A manager for files content.
+ */
+abstract class FileManager {
+  /**
+   * Removes all files.
+   */
+  void clear();
+
+  /**
+   * Deletes the file with the given name.
+   */
+  void delete(String name);
+
+  /**
+   * Read the entire file contents as a list of bytes.
+   */
+  Future<List<int>> read(String name);
+
+  /**
+   * Write a list of bytes to a file.
+   */
+  Future write(String name, List<int> bytes);
+}
+
+
+/**
+ * A [FileManager] based [NodeManager].
+ */
+class FileNodeManager implements NodeManager {
+  static int _VERSION = 1;
+
+  final ContextCodec contextCodec;
+
+  final ElementCodec elementCodec;
+
+  final StringCodec stringCodec;
+
+  final FileManager _fileManager;
+
+  int _locationCount = 0;
+
+  final Logger _logger;
+
+  Map<String, int> _nodeLocationCounts = new HashMap<String, int>();
+
+  final RelationshipCodec _relationshipCodec;
+
+  FileNodeManager(this._fileManager, this._logger, this.stringCodec,
+      this.contextCodec, this.elementCodec, this._relationshipCodec);
+
+  @override
+  int get locationCount => _locationCount;
+
+  @override
+  void clear() {
+    _fileManager.clear();
+  }
+
+  @override
+  Future<IndexNode> getNode(String name) {
+    return _fileManager.read(name).then((List<int> bytes) {
+      if (bytes == null) {
+        return null;
+      }
+      _DataInputStream stream = new _DataInputStream(bytes);
+      return _readNode(stream);
+    }).catchError((e, stackTrace) {
+      _logger.logError2('Exception during reading index file ${name}',
+          new CaughtException(e, stackTrace));
+    });
+  }
+
+  @override
+  IndexNode newNode(AnalysisContext context) => new IndexNode(context,
+      elementCodec, _relationshipCodec);
+
+  @override
+  Future putNode(String name, IndexNode node) {
+    // update location count
+    {
+      _locationCount -= _getLocationCount(name);
+      int nodeLocationCount = node.locationCount;
+      _nodeLocationCounts[name] = nodeLocationCount;
+      _locationCount += nodeLocationCount;
+    }
+    // write the node
+    return new Future.microtask(() {
+      _DataOutputStream stream = new _DataOutputStream();
+      _writeNode(node, stream);
+      var bytes = stream.getBytes();
+      return _fileManager.write(name, bytes);
+    }).catchError((e, stackTrace) {
+      _logger.logError2('Exception during reading index file ${name}',
+          new CaughtException(e, stackTrace));
+    });
+  }
+
+  @override
+  void removeNode(String name) {
+    // update location count
+    _locationCount -= _getLocationCount(name);
+    _nodeLocationCounts.remove(name);
+    // remove node
+    _fileManager.delete(name);
+  }
+
+  int _getLocationCount(String name) {
+    int locationCount = _nodeLocationCounts[name];
+    return locationCount != null ? locationCount : 0;
+  }
+
+  RelationKeyData _readElementRelationKey(_DataInputStream stream) {
+    int elementId = stream.readInt();
+    int relationshipId = stream.readInt();
+    return new RelationKeyData.forData(elementId, relationshipId);
+  }
+
+  LocationData _readLocationData(_DataInputStream stream) {
+    int elementId = stream.readInt();
+    int offset = stream.readInt();
+    int length = stream.readInt();
+    return new LocationData.forData(elementId, offset, length);
+  }
+
+  IndexNode _readNode(_DataInputStream stream) {
+    // check version
+    {
+      int version = stream.readInt();
+      if (version != _VERSION) {
+        throw new StateError(
+            'Version ${_VERSION} expected, but ${version} found.');
+      }
+    }
+    // context
+    int contextId = stream.readInt();
+    AnalysisContext context = contextCodec.decode(contextId);
+    if (context == null) {
+      return null;
+    }
+    // relations
+    Map<RelationKeyData, List<LocationData>> relations =
+        new HashMap<RelationKeyData, List<LocationData>>();
+    int numRelations = stream.readInt();
+    for (int i = 0; i < numRelations; i++) {
+      RelationKeyData key = _readElementRelationKey(stream);
+      int numLocations = stream.readInt();
+      List<LocationData> locations = new List<LocationData>();
+      for (int j = 0; j < numLocations; j++) {
+        locations.add(_readLocationData(stream));
+      }
+      relations[key] = locations;
+    }
+    // create IndexNode
+    IndexNode node = new IndexNode(context, elementCodec, _relationshipCodec);
+    node.relations = relations;
+    return node;
+  }
+
+  void _writeElementRelationKey(_DataOutputStream stream, RelationKeyData key) {
+    stream.writeInt(key.elementId);
+    stream.writeInt(key.relationshipId);
+  }
+
+  void _writeNode(IndexNode node, _DataOutputStream stream) {
+    // version
+    stream.writeInt(_VERSION);
+    // context
+    {
+      AnalysisContext context = node.context;
+      int contextId = contextCodec.encode(context);
+      stream.writeInt(contextId);
+    }
+    // relations
+    Map<RelationKeyData, List<LocationData>> relations = node.relations;
+    stream.writeInt(relations.length);
+    relations.forEach((key, locations) {
+      _writeElementRelationKey(stream, key);
+      stream.writeInt(locations.length);
+      for (LocationData location in locations) {
+        stream.writeInt(location.elementId);
+        stream.writeInt(location.offset);
+        stream.writeInt(location.length);
+      }
+    });
+  }
+}
+
+
+/**
+ * A single index file in-memory presentation.
+ */
+class IndexNode {
+  final AnalysisContext context;
+
+  final ElementCodec _elementCodec;
+
+  Map<RelationKeyData, List<LocationData>> _relations =
+      new HashMap<RelationKeyData, List<LocationData>>();
+
+  final RelationshipCodec _relationshipCodec;
+
+  IndexNode(this.context, this._elementCodec, this._relationshipCodec);
+
+  /**
+   * Returns number of locations in this node.
+   */
+  int get locationCount {
+    int locationCount = 0;
+    for (List<LocationData> locations in _relations.values) {
+      locationCount += locations.length;
+    }
+    return locationCount;
+  }
+
+  /**
+   * Returns the recorded relations.
+   */
+  Map<RelationKeyData, List<LocationData>> get relations => _relations;
+
+  /**
+   * Sets relations data. This method is used during loading data from a storage.
+   */
+  void set relations(Map<RelationKeyData, List<LocationData>> relations) {
+    this._relations.clear();
+    this._relations.addAll(relations);
+  }
+
+  /**
+   * Return the locations of the elements that have the given relationship with the given element.
+   *
+   * @param element the the element that has the relationship with the locations to be returned
+   * @param relationship the [Relationship] between the given element and the locations to be
+   *          returned
+   */
+  List<Location> getRelationships(Element element, Relationship relationship) {
+    // prepare key
+    RelationKeyData key = new RelationKeyData.forObject(_elementCodec,
+        _relationshipCodec, element, relationship);
+    // find LocationData(s)
+    List<LocationData> locationDatas = _relations[key];
+    if (locationDatas == null) {
+      return Location.EMPTY_ARRAY;
+    }
+    // convert to Location(s)
+    List<Location> locations = <Location>[];
+    for (LocationData locationData in locationDatas) {
+      Location location = locationData.getLocation(context, _elementCodec);
+      if (location != null) {
+        locations.add(location);
+      }
+    }
+    return locations;
+  }
+
+  /**
+   * Records that the given element and location have the given relationship.
+   *
+   * @param element the element that is related to the location
+   * @param relationship the [Relationship] between the element and the location
+   * @param location the [Location] where relationship happens
+   */
+  void recordRelationship(Element element, Relationship relationship,
+      Location location) {
+    RelationKeyData key = new RelationKeyData.forObject(_elementCodec,
+        _relationshipCodec, element, relationship);
+    // prepare LocationData(s)
+    List<LocationData> locationDatas = _relations[key];
+    if (locationDatas == null) {
+      locationDatas = <LocationData>[];
+      _relations[key] = locationDatas;
+    }
+    // add new LocationData
+    locationDatas.add(new LocationData.forObject(_elementCodec, location));
+  }
+}
+
+
+/**
+ * A container with information about a [Location].
+ */
+class LocationData {
+  final int elementId;
+  final int length;
+  final int offset;
+
+  LocationData.forData(this.elementId, this.offset, this.length);
+
+  LocationData.forObject(ElementCodec elementCodec, Location location)
+      : elementId = elementCodec.encode(location.element),
+        offset = location.offset,
+        length = location.length;
+
+  @override
+  int get hashCode {
+    return 31 * (31 * elementId + offset) + length;
+  }
+
+  @override
+  bool operator ==(Object obj) {
+    if (obj is! LocationData) {
+      return false;
+    }
+    LocationData other = obj;
+    return other.elementId == elementId && other.offset == offset &&
+        other.length == length;
+  }
+
+  /**
+   * Returns a {@link Location} that is represented by this {@link LocationData}.
+   */
+  Location getLocation(AnalysisContext context, ElementCodec elementCodec) {
+    Element element = elementCodec.decode(context, elementId);
+    if (element == null) {
+      return null;
+    }
+    return new Location(element, offset, length);
+  }
+}
+
+
+/**
+ * A manager for [IndexNode]s.
+ */
+abstract class NodeManager {
+  /**
+   * The shared {@link ContextCodec} instance.
+   */
+  ContextCodec get contextCodec;
+
+  /**
+   * The shared {@link ElementCodec} instance.
+   */
+  ElementCodec get elementCodec;
+
+  /**
+   * A number of locations in all nodes.
+   */
+  int get locationCount;
+
+  /**
+   * The shared {@link StringCodec} instance.
+   */
+  StringCodec get stringCodec;
+
+  /**
+   * Removes all nodes.
+   */
+  void clear();
+
+  /**
+   * Returns the {@link IndexNode} with the given name, {@code null} if not found.
+   */
+  Future<IndexNode> getNode(String name);
+
+  /**
+   * Returns a new {@link IndexNode}.
+   */
+  IndexNode newNode(AnalysisContext context);
+
+  /**
+   * Associates the given {@link IndexNode} with the given name.
+   */
+  void putNode(String name, IndexNode node);
+
+  /**
+   * Removes the {@link IndexNode} with the given name.
+   */
+  void removeNode(String name);
+}
+
+
+/**
+ * An [Element] to [Location] relation key.
+ */
+class RelationKeyData {
+  final int elementId;
+  final int relationshipId;
+
+  RelationKeyData.forData(this.elementId, this.relationshipId);
+
+  RelationKeyData.forObject(ElementCodec elementCodec,
+      RelationshipCodec relationshipCodec, Element element, Relationship relationship)
+      : elementId = elementCodec.encode(element),
+        relationshipId = relationshipCodec.encode(relationship);
+
+  @override
+  int get hashCode {
+    return 31 * elementId + relationshipId;
+  }
+
+  @override
+  bool operator ==(Object obj) {
+    if (obj is! RelationKeyData) {
+      return false;
+    }
+    RelationKeyData other = obj;
+    return other.elementId == elementId && other.relationshipId ==
+        relationshipId;
+  }
+}
+
+
+/**
+ * An [IndexStore] which keeps index information in separate nodes for each unit.
+ */
+class SplitIndexStore implements IndexStore {
+  /**
+   * The [ContextCodec] to encode/decode [AnalysisContext]s.
+   */
+  ContextCodec _contextCodec;
+
+  /**
+   * Information about "universe" elements.
+   * We need to keep them together to avoid loading of all index nodes.
+   *
+   * Order of keys: contextId, nodeId, Relationship.
+   */
+  Map<int, Map<int, Map<Relationship, List<LocationData>>>>
+      _contextNodeRelations = new HashMap<int, Map<int, Map<Relationship,
+      List<LocationData>>>>();
+
+  /**
+   * The mapping of library [Source] to the [Source]s of part units.
+   */
+  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToLibraryToUnits =
+      new HashMap<AnalysisContext, Map<Source, Set<Source>>>();
+
+  /**
+   * The mapping of unit [Source] to the [Source]s of libraries it is used in.
+   */
+  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToUnitToLibraries =
+      new HashMap<AnalysisContext, Map<Source, Set<Source>>>();
+
+  int _currentContextId = 0;
+
+  IndexNode _currentNode;
+
+  String _currentNodeName;
+
+  int _currentNodeNameId = 0;
+
+  /**
+   * The [ElementCodec] to encode/decode [Element]s.
+   */
+  ElementCodec _elementCodec;
+
+  /**
+   * A table mapping element names to the node names that may have relations with elements with
+   * these names.
+   */
+  IntToIntSetMap _nameToNodeNames = new IntToIntSetMap();
+
+  /**
+   * The [NodeManager] to get/put [IndexNode]s.
+   */
+  final NodeManager _nodeManager;
+
+  /**
+   * The set of known [Source]s.
+   */
+  Set<Source> _sources = new HashSet<Source>();
+
+  /**
+   * The [StringCodec] to encode/decode [String]s.
+   */
+  StringCodec _stringCodec;
+
+  SplitIndexStore(this._nodeManager) {
+    this._contextCodec = _nodeManager.contextCodec;
+    this._elementCodec = _nodeManager.elementCodec;
+    this._stringCodec = _nodeManager.stringCodec;
+  }
+
+  @override
+  String get statistics =>
+      '[${_nodeManager.locationCount} locations, ${_sources.length} sources, ${_nameToNodeNames.length} names]';
+
+  @override
+  bool aboutToIndexDart(AnalysisContext context,
+      CompilationUnitElement unitElement) {
+    context = _unwrapContext(context);
+    // may be already disposed in other thread
+    if (context.isDisposed) {
+      return false;
+    }
+    // validate unit
+    if (unitElement == null) {
+      return false;
+    }
+    LibraryElement libraryElement = unitElement.library;
+    if (libraryElement == null) {
+      return false;
+    }
+    CompilationUnitElement definingUnitElement =
+        libraryElement.definingCompilationUnit;
+    if (definingUnitElement == null) {
+      return false;
+    }
+    // prepare sources
+    Source library = definingUnitElement.source;
+    Source unit = unitElement.source;
+    // special handling for the defining library unit
+    if (unit == library) {
+      // prepare new parts
+      HashSet<Source> newParts = new HashSet<Source>();
+      for (CompilationUnitElement part in libraryElement.parts) {
+        newParts.add(part.source);
+      }
+      // prepare old parts
+      Map<Source, Set<Source>> libraryToUnits =
+          _contextToLibraryToUnits[context];
+      if (libraryToUnits == null) {
+        libraryToUnits = new HashMap<Source, Set<Source>>();
+        _contextToLibraryToUnits[context] = libraryToUnits;
+      }
+      Set<Source> oldParts = libraryToUnits[library];
+      // check if some parts are not in the library now
+      if (oldParts != null) {
+        Set<Source> noParts = oldParts.difference(newParts);
+        for (Source noPart in noParts) {
+          _removeLocations(context, library, noPart);
+        }
+      }
+      // remember new parts
+      libraryToUnits[library] = newParts;
+    }
+    // remember library/unit relations
+    _recordUnitInLibrary(context, library, unit);
+    _recordLibraryWithUnit(context, library, unit);
+    _sources.add(library);
+    _sources.add(unit);
+    // prepare node
+    String libraryName = library.fullName;
+    String unitName = unit.fullName;
+    int libraryNameIndex = _stringCodec.encode(libraryName);
+    int unitNameIndex = _stringCodec.encode(unitName);
+    _currentNodeName = '${libraryNameIndex}_${unitNameIndex}.index';
+    _currentNodeNameId = _stringCodec.encode(_currentNodeName);
+    _currentNode = _nodeManager.newNode(context);
+    _currentContextId = _contextCodec.encode(context);
+    // remove Universe information for the current node
+    for (Map<int, dynamic> nodeRelations in _contextNodeRelations.values) {
+      nodeRelations.remove(_currentNodeNameId);
+    }
+    // done
+    return true;
+  }
+
+  @override
+  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement) {
+    context = _unwrapContext(context);
+    // may be already disposed in other thread
+    if (context.isDisposed) {
+      return false;
+    }
+    // remove locations
+    Source source = htmlElement.source;
+    _removeLocations(context, null, source);
+    // remember library/unit relations
+    _recordUnitInLibrary(context, null, source);
+    // prepare node
+    String sourceName = source.fullName;
+    int sourceNameIndex = _stringCodec.encode(sourceName);
+    _currentNodeName = '${sourceNameIndex}.index';
+    _currentNodeNameId = _stringCodec.encode(_currentNodeName);
+    _currentNode = _nodeManager.newNode(context);
+    return true;
+  }
+
+  @override
+  void clear() {
+    _contextNodeRelations.clear();
+    _nodeManager.clear();
+    _nameToNodeNames.clear();
+  }
+
+  @override
+  void doneIndex() {
+    if (_currentNode != null) {
+      _nodeManager.putNode(_currentNodeName, _currentNode);
+      _currentNodeName = null;
+      _currentNodeNameId = -1;
+      _currentNode = null;
+      _currentContextId = -1;
+    }
+  }
+
+  @override
+  List<Location> getRelationships(Element element, Relationship relationship) {
+    // TODO(scheglov) make IndexStore interface async
+    return <Location>[];
+  }
+
+  Future<List<Location>> getRelationshipsAsync(Element element,
+      Relationship relationship) {
+    // special support for UniverseElement
+    if (identical(element, UniverseElement.INSTANCE)) {
+      List<Location> locations = _getRelationshipsUniverse(relationship);
+      return new Future.value(locations);
+    }
+    // prepare node names
+    String name = _getElementName(element);
+    int nameId = _stringCodec.encode(name);
+    List<int> nodeNameIds = _nameToNodeNames.get(nameId);
+    // prepare Future(s) for reading each IndexNode
+    List<Future<List<Location>>> nodeFutures = <Future<List<Location>>>[];
+    for (int nodeNameId in nodeNameIds) {
+      String nodeName = _stringCodec.decode(nodeNameId);
+      Future<IndexNode> nodeFuture = _nodeManager.getNode(nodeName);
+      Future<List<Location>> locationsFuture = nodeFuture.then((node) {
+        if (node == null) {
+          // TODO(scheglov) remove node
+          return Location.EMPTY_ARRAY;
+        }
+        return node.getRelationships(element, relationship);
+      });
+      nodeFutures.add(locationsFuture);
+    }
+    // return Future that merges separate IndexNode Location(s)
+    return Future.wait(nodeFutures).then((List<List<Location>> locationsList) {
+      List<Location> allLocations = <Location>[];
+      for (List<Location> locations in locationsList) {
+        allLocations.addAll(locations);
+      }
+      return allLocations;
+    });
+  }
+
+  @override
+  void recordRelationship(Element element, Relationship relationship,
+      Location location) {
+    if (element == null || location == null) {
+      return;
+    }
+    // special support for UniverseElement
+    if (identical(element, UniverseElement.INSTANCE)) {
+      _recordRelationshipUniverse(relationship, location);
+      return;
+    }
+    // other elements
+    _recordNodeNameForElement(element);
+    _currentNode.recordRelationship(element, relationship, location);
+  }
+
+  @override
+  void removeContext(AnalysisContext context) {
+    context = _unwrapContext(context);
+    if (context == null) {
+      return;
+    }
+    // remove sources
+    removeSources(context, null);
+    // remove context information
+    _contextToLibraryToUnits.remove(context);
+    _contextToUnitToLibraries.remove(context);
+    _contextNodeRelations.remove(_contextCodec.encode(context));
+    // remove context from codec
+    _contextCodec.remove(context);
+  }
+
+  @override
+  void removeSource(AnalysisContext context, Source source) {
+    context = _unwrapContext(context);
+    if (context == null) {
+      return;
+    }
+    // remove nodes for unit/library pairs
+    Map<Source, Set<Source>> unitToLibraries =
+        _contextToUnitToLibraries[context];
+    if (unitToLibraries != null) {
+      Set<Source> libraries = unitToLibraries.remove(source);
+      if (libraries != null) {
+        for (Source library in libraries) {
+          _removeLocations(context, library, source);
+        }
+      }
+    }
+    // remove nodes for library/unit pairs
+    Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
+    if (libraryToUnits != null) {
+      Set<Source> units = libraryToUnits.remove(source);
+      if (units != null) {
+        for (Source unit in units) {
+          _removeLocations(context, source, unit);
+        }
+      }
+    }
+  }
+
+  @override
+  void removeSources(AnalysisContext context, SourceContainer container) {
+    context = _unwrapContext(context);
+    if (context == null) {
+      return;
+    }
+    // remove nodes for unit/library pairs
+    Map<Source, Set<Source>> unitToLibraries =
+        _contextToUnitToLibraries[context];
+    if (unitToLibraries != null) {
+      List<Source> units = new List<Source>.from(unitToLibraries.keys);
+      for (Source source in units) {
+        if (container == null || container.contains(source)) {
+          removeSource(context, source);
+        }
+      }
+    }
+    // remove nodes for library/unit pairs
+    Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
+    if (libraryToUnits != null) {
+      List<Source> libraries = new List<Source>.from(libraryToUnits.keys);
+      for (Source source in libraries) {
+        if (container == null || container.contains(source)) {
+          removeSource(context, source);
+        }
+      }
+    }
+  }
+
+  String _getElementName(Element element) => element.name;
+
+  List<Location> _getRelationshipsUniverse(Relationship relationship) {
+    List<Location> locations = <Location>[];
+    _contextNodeRelations.forEach((contextId, contextRelations) {
+      AnalysisContext context = _contextCodec.decode(contextId);
+      if (context != null) {
+        for (Map<Relationship, List<LocationData>> nodeRelations in
+            contextRelations.values) {
+          List<LocationData> nodeLocations = nodeRelations[relationship];
+          if (nodeLocations != null) {
+            for (LocationData locationData in nodeLocations) {
+              Location location = locationData.getLocation(context,
+                  _elementCodec);
+              if (location != null) {
+                locations.add(location);
+              }
+            }
+          }
+        }
+      }
+    });
+    return locations;
+  }
+
+  void _recordLibraryWithUnit(AnalysisContext context, Source library,
+      Source unit) {
+    Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
+    if (libraryToUnits == null) {
+      libraryToUnits = new HashMap<Source, Set<Source>>();
+      _contextToLibraryToUnits[context] = libraryToUnits;
+    }
+    Set<Source> units = libraryToUnits[library];
+    if (units == null) {
+      units = new HashSet<Source>();
+      libraryToUnits[library] = units;
+    }
+    units.add(unit);
+  }
+
+  void _recordNodeNameForElement(Element element) {
+    String name = _getElementName(element);
+    int nameId = _stringCodec.encode(name);
+    _nameToNodeNames.add(nameId, _currentNodeNameId);
+  }
+
+  void _recordRelationshipUniverse(Relationship relationship,
+      Location location) {
+    // in current context
+    Map<int, Map<Relationship, List<LocationData>>> nodeRelations =
+        _contextNodeRelations[_currentContextId];
+    if (nodeRelations == null) {
+      nodeRelations = new HashMap<int, Map<Relationship, List<LocationData>>>();
+      _contextNodeRelations[_currentContextId] = nodeRelations;
+    }
+    // in current node
+    Map<Relationship, List<LocationData>> relations =
+        nodeRelations[_currentNodeNameId];
+    if (relations == null) {
+      relations = new HashMap<Relationship, List<LocationData>>();
+      nodeRelations[_currentNodeNameId] = relations;
+    }
+    // for the given relationship
+    List<LocationData> locations = relations[relationship];
+    if (locations == null) {
+      locations = <LocationData>[];
+      relations[relationship] = locations;
+    }
+    // record LocationData
+    locations.add(new LocationData.forObject(_elementCodec, location));
+  }
+
+  void _recordUnitInLibrary(AnalysisContext context, Source library,
+      Source unit) {
+    Map<Source, Set<Source>> unitToLibraries =
+        _contextToUnitToLibraries[context];
+    if (unitToLibraries == null) {
+      unitToLibraries = new HashMap<Source, Set<Source>>();
+      _contextToUnitToLibraries[context] = unitToLibraries;
+    }
+    Set<Source> libraries = unitToLibraries[unit];
+    if (libraries == null) {
+      libraries = new HashSet<Source>();
+      unitToLibraries[unit] = libraries;
+    }
+    libraries.add(library);
+  }
+
+  /**
+   * Removes locations recorded in the given library/unit pair.
+   */
+  void _removeLocations(AnalysisContext context, Source library, Source unit) {
+    // remove node
+    String libraryName = library != null ? library.fullName : null;
+    String unitName = unit.fullName;
+    int libraryNameIndex = _stringCodec.encode(libraryName);
+    int unitNameIndex = _stringCodec.encode(unitName);
+    String nodeName = '${libraryNameIndex}_${unitNameIndex}.index';
+    int nodeNameId = _stringCodec.encode(nodeName);
+    _nodeManager.removeNode(nodeName);
+    // remove source
+    _sources.remove(library);
+    _sources.remove(unit);
+    // remove universe relations
+    {
+      int contextId = _contextCodec.encode(context);
+      Map<int, Object> nodeRelations = _contextNodeRelations[contextId];
+      if (nodeRelations != null) {
+        nodeRelations.remove(nodeNameId);
+      }
+    }
+  }
+
+  /**
+   * When logging is on, [AnalysisEngine] actually creates
+   * [InstrumentedAnalysisContextImpl], which wraps [AnalysisContextImpl] used to create
+   * actual [Element]s. So, in index we have to unwrap [InstrumentedAnalysisContextImpl]
+   * when perform any operation.
+   */
+  AnalysisContext _unwrapContext(AnalysisContext context) {
+    if (context is InstrumentedAnalysisContextImpl) {
+      context = (context as InstrumentedAnalysisContextImpl).basis;
+    }
+    return context;
+  }
+}
+
+
+class _DataInputStream {
+  ByteData _byteData;
+  int _byteOffset = 0;
+
+  _DataInputStream(List<int> bytes) {
+    ByteBuffer buffer = new Uint8List.fromList(bytes).buffer;
+    _byteData = new ByteData.view(buffer);
+  }
+
+  int readInt() {
+    int result = _byteData.getInt32(_byteOffset);
+    _byteOffset += 4;
+    return result;
+  }
+}
+
+
+class _DataOutputStream {
+  BytesBuilder _buffer = new BytesBuilder();
+
+  Uint8List getBytes() {
+    return new Uint8List.fromList(_buffer.takeBytes());
+  }
+
+  void writeInt(int value) {
+    _buffer.addByte((value & 0xFF000000) >> 24);
+    _buffer.addByte((value & 0x00FF0000) >> 16);
+    _buffer.addByte((value & 0x0000FF00) >> 8);
+    _buffer.addByte(value & 0xFF);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index ed8cfd8..7af044d 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -4,18 +4,79 @@
 
 library operation.analysis;
 
-import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/computers.dart';
+import 'package:analysis_server/src/computer/computer_highlights.dart';
+import 'package:analysis_server/src/computer/computer_navigation.dart';
+import 'package:analysis_server/src/computer/computer_outline.dart';
 import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/protocol.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/html.dart';
+import 'package:analyzer/src/generated/index.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 
+Map<String, Object> errorToJson(AnalysisError analysisError) {
+  // TODO(paulberry): move this function into the AnalysisError class.
+  ErrorCode errorCode = analysisError.errorCode;
+  Map<String, Object> result = {
+    FILE: analysisError.source.fullName,
+    // TODO(scheglov) add Enum.fullName ?
+    ERROR_CODE: '${errorCode.runtimeType}.${(errorCode as Enum).name}',
+    OFFSET: analysisError.offset,
+    LENGTH: analysisError.length,
+    MESSAGE: analysisError.message
+  };
+  if (analysisError.correction != null) {
+    result[CORRECTION] = analysisError.correction;
+  }
+  return result;
+}
+
+
+void sendAnalysisNotificationErrors(AnalysisServer server, String file,
+    List<AnalysisError> errors) {
+  Notification notification = new Notification(ANALYSIS_ERRORS);
+  notification.setParameter(FILE, file);
+  notification.setParameter(ERRORS, errors.map(errorToJson).toList());
+  server.sendNotification(notification);
+}
+
+
+void sendAnalysisNotificationHighlights(AnalysisServer server, String file,
+    CompilationUnit dartUnit) {
+  Notification notification = new Notification(ANALYSIS_HIGHLIGHTS);
+  notification.setParameter(FILE, file);
+  notification.setParameter(REGIONS, new DartUnitHighlightsComputer(
+      dartUnit).compute());
+  server.sendNotification(notification);
+}
+
+
+void sendAnalysisNotificationNavigation(AnalysisServer server, String file,
+    CompilationUnit dartUnit) {
+  Notification notification = new Notification(ANALYSIS_NAVIGATION);
+  notification.setParameter(FILE, file);
+  notification.setParameter(REGIONS, new DartUnitNavigationComputer(
+      dartUnit).compute());
+  server.sendNotification(notification);
+}
+
+
+void sendAnalysisNotificationOutline(AnalysisServer server, String file,
+    CompilationUnit dartUnit) {
+  Notification notification = new Notification(ANALYSIS_OUTLINE);
+  notification.setParameter(FILE, file);
+  notification.setParameter(OUTLINE, new DartUnitOutlineComputer(
+      dartUnit).compute());
+  server.sendNotification(notification);
+}
+
+
 /**
  * Instances of [PerformAnalysisOperation] perform a single analysis task.
  */
@@ -50,10 +111,9 @@
     if (notices == null) {
       return;
     }
-    // TODO(scheglov) remember known sources
-    // TODO(scheglov) index units
-    // TODO(scheglov) schedule notifications
+    // process results
     sendNotices(server, notices);
+    updateIndex(server.index, notices);
     // continue analysis
     server.addOperation(new PerformAnalysisOperation(context, true));
   }
@@ -75,55 +135,35 @@
         if (server.hasAnalysisSubscription(AnalysisService.NAVIGATION, file)) {
           sendAnalysisNotificationNavigation(server, file, dartUnit);
         }
+        if (server.hasAnalysisSubscription(AnalysisService.OUTLINE, file)) {
+          sendAnalysisNotificationOutline(server, file, dartUnit);
+        }
       }
       if (!source.isInSystemLibrary) {
         sendAnalysisNotificationErrors(server, file, notice.errors);
       }
     }
   }
-}
 
-void sendAnalysisNotificationErrors(AnalysisServer server,
-                                    String file, List<AnalysisError> errors) {
-  Notification notification = new Notification(NOTIFICATION_ERRORS);
-  notification.setParameter(FILE, file);
-  notification.setParameter(ERRORS, errors.map(errorToJson).toList());
-  server.sendNotification(notification);
-}
-
-void sendAnalysisNotificationHighlights(AnalysisServer server,
-                                        String file, CompilationUnit dartUnit) {
-  Notification notification = new Notification(NOTIFICATION_HIGHLIGHTS);
-  notification.setParameter(FILE, file);
-  notification.setParameter(
-      REGIONS,
-      new DartUnitHighlightsComputer(dartUnit).compute());
-  server.sendNotification(notification);
-}
-
-void sendAnalysisNotificationNavigation(AnalysisServer server,
-                                        String file, CompilationUnit dartUnit) {
-  Notification notification = new Notification(NOTIFICATION_NAVIGATION);
-  notification.setParameter(FILE, file);
-  notification.setParameter(
-      REGIONS,
-      new DartUnitNavigationComputer(dartUnit).compute());
-  server.sendNotification(notification);
-}
-
-Map<String, Object> errorToJson(AnalysisError analysisError) {
-  // TODO(paulberry): move this function into the AnalysisError class.
-  ErrorCode errorCode = analysisError.errorCode;
-  Map<String, Object> result = {
-    '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
-  };
-  if (analysisError.correction != null) {
-    result['correction'] = analysisError.correction;
+  void updateIndex(Index index, List<ChangeNotice> notices) {
+    if (index == null) {
+      return;
+    }
+    for (ChangeNotice notice in notices) {
+      // Dart
+      {
+        CompilationUnit dartUnit = notice.compilationUnit;
+        if (dartUnit != null) {
+          index.indexUnit(context, dartUnit);
+        }
+      }
+      // HTML
+      {
+        HtmlUnit htmlUnit = notice.htmlUnit;
+        if (htmlUnit != null) {
+          index.indexHtmlUnit(context, htmlUnit);
+        }
+      }
+    }
   }
-  return result;
 }
diff --git a/pkg/analysis_server/lib/src/package_map_provider.dart b/pkg/analysis_server/lib/src/package_map_provider.dart
new file mode 100644
index 0000000..4324a3c
--- /dev/null
+++ b/pkg/analysis_server/lib/src/package_map_provider.dart
@@ -0,0 +1,111 @@
+// 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 package.map.provider;
+
+import 'dart:convert';
+import 'dart:io' as io;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/engine.dart';
+
+/**
+ * A PackageMapProvider is an entity capable of determining the mapping from
+ * package name to source directory for a given folder.
+ */
+abstract class PackageMapProvider {
+  /**
+   * Compute a package map for the given folder, if possible.
+   *
+   * If a package map can't be computed, return null.
+   */
+  Map<String, List<Folder>> computePackageMap(Folder folder);
+}
+
+/**
+ * Implementation of PackageMapProvider that operates by executing pub.
+ */
+class PubPackageMapProvider implements PackageMapProvider {
+  static const String PUB_LIST_COMMAND = 'list-package-dirs';
+
+  /**
+   * [ResourceProvider] that is used to create the [Folder]s that populate the
+   * package map.
+   */
+  final ResourceProvider resourceProvider;
+
+  PubPackageMapProvider(this.resourceProvider);
+
+  @override
+  Map<String, List<Folder>> computePackageMap(Folder folder) {
+    // TODO(paulberry) make this asynchronous so that we can (a) do other
+    // analysis while it's in progress, and (b) time out if it takes too long
+    // to respond.
+    String executable = SHARED_SDK.pubExecutable.getAbsolutePath();
+    io.ProcessResult result;
+    try {
+      result = io.Process.runSync(
+          executable, [PUB_LIST_COMMAND], workingDirectory: folder.path);
+    } on io.ProcessException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Error running pub $PUB_LIST_COMMAND\n${exception}\n${stackTrace}");
+    }
+    if (result.exitCode != 0) {
+      AnalysisEngine.instance.logger.logInformation(
+          "pub $PUB_LIST_COMMAND failed: exit code ${result.exitCode}");
+      return null;
+    }
+    try {
+      return parsePackageMap(result.stdout);
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError(
+          "Malformed output from pub $PUB_LIST_COMMAND\n${exception}\n${stackTrace}");
+    }
+
+    return null;
+  }
+
+  /**
+   * Decode the JSON output from pub into a package map.
+   */
+  Map<String, List<Folder>> parsePackageMap(String jsonText) {
+    // The output of pub looks like this:
+    // {
+    //   "packages": {
+    //     "foo": "path/to/foo",
+    //     "bar": ["path/to/bar1", "path/to/bar2"],
+    //     "myapp": "path/to/myapp",  // self link is included
+    //   },
+    //   "input_files": [
+    //     "path/to/myapp/pubspec.lock"
+    //   ]
+    // }
+    Map<String, List<Folder>> packageMap = <String, List<Folder>>{};
+    Map obj = JSON.decode(jsonText);
+    Map packages = obj['packages'];
+    processPaths(String packageName, List paths) {
+      List<Folder> folders = <Folder>[];
+      for (var path in paths) {
+        if (path is String) {
+          Resource resource = resourceProvider.getResource(path);
+          if (resource is Folder) {
+            folders.add(resource);
+          }
+        }
+      }
+      if (folders.isNotEmpty) {
+        packageMap[packageName] = folders;
+      }
+    }
+    packages.forEach((key, value) {
+      if (value is String) {
+        processPaths(key, [value]);
+      } else if (value is List) {
+        processPaths(key, value);
+      }
+    });
+    return packageMap;
+  }
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/package_uri_resolver.dart b/pkg/analysis_server/lib/src/package_uri_resolver.dart
new file mode 100644
index 0000000..2aaaca9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/package_uri_resolver.dart
@@ -0,0 +1,94 @@
+// 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 resolver.package;
+
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+
+
+/**
+ * A [UriResolver] implementation for the `package:` scheme that uses a map of
+ * package names to their directories.
+ */
+class PackageMapUriResolver extends UriResolver {
+  /**
+   * The name of the `package` scheme.
+   */
+  static const String PACKAGE_SCHEME = "package";
+
+  /**
+   * A table mapping package names to the path of the directories containing
+   * the package.
+   */
+  final Map<String, List<Folder>> packageMap;
+
+  /**
+   * The [ResourceProvider] for this resolver.
+   */
+  final ResourceProvider resourceProvider;
+
+  /**
+   * Create a new [PackageMapUriResolver].
+   *
+   * [packageMap] is a table mapping package names to the paths of the
+   * directories containing the package
+   */
+  PackageMapUriResolver(this.resourceProvider, this.packageMap);
+
+  @override
+  Source fromEncoding(UriKind kind, Uri uri) {
+    if (kind == UriKind.PACKAGE_URI) {
+      Resource resource = resourceProvider.getResource(uri.path);
+      if (resource is File) {
+        return resource.createSource(kind);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Source resolveAbsolute(Uri uri) {
+    if (!isPackageUri(uri)) {
+      return null;
+    }
+    // Prepare path.
+    String path = uri.path;
+    // Prepare path components.
+    String pkgName;
+    String relPath;
+    int index = path.indexOf('/');
+    if (index == -1 || index == 0) {
+      return null;
+    } else {
+      // <pkgName>/<relPath>
+      pkgName = path.substring(0, index);
+      relPath = path.substring(index + 1);
+    }
+    // Try to find an existing file.
+    List<Folder> packageDirs = packageMap[pkgName];
+    if (packageDirs != null) {
+      for (Folder packageDir in packageDirs) {
+        if (packageDir.exists) {
+          Resource result = packageDir.getChild(relPath);
+          if (result is File && result.exists) {
+            return result.createSource(UriKind.PACKAGE_URI);
+          }
+        }
+      }
+    }
+    // Return a NonExistingSource instance.
+    // This helps provide more meaningful error messages to users
+    // (a missing file error, as opposed to an invalid URI error).
+    // TODO(scheglov) move NonExistingSource to "source.dart"
+    return new NonExistingSource(uri.toString(), UriKind.PACKAGE_URI);
+  }
+
+  /**
+   * Returns `true` if [uri] is a `package` URI.
+   */
+  static bool isPackageUri(Uri uri) {
+    return uri.scheme == PACKAGE_SCHEME;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index 9efbf64..fa0d50e 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -4,6 +4,7 @@
 
 library protocol;
 
+import 'dart:collection';
 import 'dart:convert' show JsonDecoder;
 
 /**
@@ -77,7 +78,7 @@
   /**
    * A table mapping the names of request parameters to their values.
    */
-  final Map<String, Object> params = new Map<String, Object>();
+  final Map<String, Object> params = new HashMap<String, Object>();
 
   /**
    * A decoder that can be used to decode strings into JSON objects.
@@ -137,8 +138,7 @@
    * if there is no such parameter associated with this request.
    */
   RequestDatum getParameter(String name, defaultValue) {
-    Object value = params[name];
-    if (value == null) {
+    if (!params.containsKey(name)) {
       return new RequestDatum(this, "default for $name", defaultValue);
     }
     return new RequestDatum(this, name, params[name]);
@@ -150,11 +150,10 @@
    * such parameter associated with this request.
    */
   RequestDatum getRequiredParameter(String name) {
-    Object value = params[name];
-    if (value == null) {
+    if (!params.containsKey(name)) {
       throw new RequestFailure(new Response.missingRequiredParameter(this, name));
     }
-    return new RequestDatum(this, name, value);
+    return new RequestDatum(this, name, params[name]);
   }
 
   /**
@@ -212,26 +211,19 @@
    * a [RequestDatum] containing the corresponding value.
    */
   RequestDatum operator [](String key) {
-    if (datum is! Map) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "be a map"));
-    }
-    if (!datum.containsKey(key)) {
+    Map<String, Object> map = _asMap();
+    if (!map.containsKey(key)) {
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "contain key '$key'"));
     }
-    return new RequestDatum(request, "$path.$key", datum[key]);
+    return new RequestDatum(request, "$path.$key", map[key]);
   }
 
   /**
    * Return `true` if the datum is a Map containing the given [key].
    */
   bool hasKey(String key) {
-    if (datum is! Map) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "be a map"));
-    }
-    return datum.containsKey(key);
+    return _asMap().containsKey(key);
   }
 
   /**
@@ -239,11 +231,7 @@
    * each key/value pair in the map.
    */
   void forEachMap(void f(String key, RequestDatum value)) {
-    if (datum is! Map) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "be a map"));
-    }
-    datum.forEach((String key, value) {
+    _asMap().forEach((String key, value) {
       f(key, new RequestDatum(request, "$path.$key", value));
     });
   }
@@ -285,6 +273,42 @@
   }
 
   /**
+   * Determine if the datum is a list.  Note: null is considered a synonym for
+   * the empty list.
+   */
+  bool get isList {
+    return datum == null || datum is List;
+  }
+
+  /**
+   * Validate that the datum is a list, and return it in raw form.
+   */
+  List _asList() {
+    if (!isList) {
+      throw new RequestFailure(new Response.invalidParameter(request, path,
+          "be a list"));
+    }
+    if (datum == null) {
+      return [];
+    } else {
+      return datum;
+    }
+  }
+
+  /**
+   * Validate that the datum is a list, and return a list where each element in
+   * the datum has been converted using the provided function.
+   */
+  List asList(elementConverter(RequestDatum datum)) {
+    List result = [];
+    List list = _asList();
+    for (int i = 0; i < list.length; i++) {
+      result.add(elementConverter(new RequestDatum(request, "$path.$i", list[i])));
+    }
+    return result;
+  }
+
+  /**
    * Validate that the datum is a string, and return it.
    */
   String asString() {
@@ -296,13 +320,14 @@
   }
 
   /**
-   * Determine if the datum is a list of strings.
+   * Determine if the datum is a list of strings.  Note: null is considered a
+   * synonym for the empty list.
    */
   bool get isStringList {
-    if (datum is! List) {
+    if (!isList) {
       return false;
     }
-    for (var element in datum) {
+    for (var element in _asList()) {
       if (element is! String) {
         return false;
       }
@@ -311,14 +336,15 @@
   }
 
   /**
-   * Validate that the datum is a list of strings, and return it.
+   * Validate that the datum is a list of strings, and return it.  Note: null
+   * is considered a synonym for the empty list.
    */
   List<String> asStringList() {
     if (!isStringList) {
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a list of strings"));
     }
-    return datum;
+    return _asList();
   }
 
   /**
@@ -338,16 +364,40 @@
   }
 
   /**
-   * Determine if the datum is a map whose values are all strings.
+   * Determine if the datum is a map.  Note: null is considered a synonym for
+   * the empty map.
+   */
+  bool get isMap {
+    return datum == null || datum is Map;
+  }
+
+  /**
+   * Validate that the datum is a map, and return it in raw form.
+   */
+  Map<String, Object> _asMap() {
+    if (!isMap) {
+      throw new RequestFailure(new Response.invalidParameter(request, path,
+          "be a map"));
+    }
+    if (datum == null) {
+      return {};
+    } else {
+      return datum;
+    }
+  }
+
+  /**
+   * Determine if the datum is a map whose values are all strings.  Note: null
+   * is considered a synonym for the empty map.
    *
    * Note: we can safely assume that the keys are all strings, since JSON maps
    * cannot have any other key type.
    */
   bool get isStringMap {
-    if (datum is! Map) {
+    if (!isMap) {
       return false;
     }
-    for (var value in datum.values) {
+    for (var value in _asMap().values) {
       if (value is! String) {
         return false;
       }
@@ -363,20 +413,21 @@
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a string map"));
     }
-    return datum;
+    return _asMap();
   }
 
   /**
-   * Determine if the datum is a map whose values are all string lists.
+   * Determine if the datum is a map whose values are all string lists.  Note:
+   * null is considered a synonym for the empty map.
    *
    * Note: we can safely assume that the keys are all strings, since JSON maps
    * cannot have any other key type.
    */
-  bool isStringListMap() {
-    if (datum is! Map) {
+  bool get isStringListMap {
+    if (!isMap) {
       return false;
     }
-    for (var value in datum.values) {
+    for (var value in _asMap().values) {
       if (value is! List) {
         return false;
       }
@@ -390,16 +441,18 @@
   }
 
   /**
-   * Validate that the datum is a map from strings to string listss, and return
+   * Validate that the datum is a map from strings to string lists, and return
    * it.
    */
   Map<String, List<String>> asStringListMap() {
-    if (!isStringListMap()) {
+    if (!isStringListMap) {
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a string list map"));
     }
-    return datum;
+    return _asMap();
   }
+
+  bool get isNull => datum == null;
 }
 
 /**
@@ -438,7 +491,7 @@
    * A table mapping the names of result fields to their values. The table
    * should be empty if there was an error.
    */
-  final Map<String, Object> result = new Map<String, Object>();
+  final Map<String, Object> result = new HashMap<String, Object>();
 
   /**
    * Initialize a newly created instance to represent a response to a request
@@ -509,6 +562,22 @@
     : this(request.id, new RequestError(-10, 'Unknown analysis service: "$name"'));
 
   /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a `analysis.setPriorityFiles` [request] that includes one or more files
+   * that are not being analyzed.
+   */
+  Response.unanalyzedPriorityFiles(Request request, String fileNames)
+    : this(request.id, new RequestError(-11, "Unanalyzed files cannot be a priority: '$fileNames'"));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a `analysis.updateOptions` [request] that includes an unknown analysis
+   * option.
+   */
+  Response.unknownOptionName(Request request, String optionName)
+    : this(request.id, new RequestError(-12, 'Unknown analysis option: "$optionName"'));
+
+  /**
    * Initialize a newly created instance based upon the given JSON data
    */
   factory Response.fromJson(Map<String, Object> json) {
@@ -646,7 +715,7 @@
   /**
    * A table mapping the names of notification parameters to their values.
    */
-  final Map<String, Object> data = new Map<String, Object>();
+  final Map<String, Object> data = new HashMap<String, Object>();
 
   /**
    * Initialize a newly created [Error] to have the given [code] and [message].
@@ -765,7 +834,7 @@
   /**
    * A table mapping the names of notification parameters to their values.
    */
-  final Map<String, Object> params = new Map<String, Object>();
+  final Map<String, Object> params = new HashMap<String, Object>();
 
   /**
    * Initialize a newly created [Notification] to have the given [event] name.
diff --git a/pkg/analysis_server/lib/src/resource.dart b/pkg/analysis_server/lib/src/resource.dart
index e3df8af..5659eb6 100644
--- a/pkg/analysis_server/lib/src/resource.dart
+++ b/pkg/analysis_server/lib/src/resource.dart
@@ -5,6 +5,7 @@
 library resource;
 
 import 'dart:async';
+import 'dart:collection';
 import 'dart:io' as io;
 
 import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
@@ -245,15 +246,16 @@
 
   @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;
+    if (!_provider._pathToWatchers.containsKey(path)) {
+      _provider._pathToWatchers[path] = <StreamController<WatchEvent>>[];
+    }
+    _provider._pathToWatchers[path].add(streamController);
     streamController.done.then((_) {
-      _provider._pathToWatcher.remove(path);
+      _provider._pathToWatchers[path].remove(streamController);
+      if (_provider._pathToWatchers[path].isEmpty) {
+        _provider._pathToWatchers.remove(path);
+      }
     });
     return streamController.stream;
   }
@@ -265,11 +267,12 @@
  * Use `/` as a path separator.
  */
 class MemoryResourceProvider implements ResourceProvider {
-  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>>{};
+  final Map<String, _MemoryResource> _pathToResource =
+      new HashMap<String, _MemoryResource>();
+  final Map<String, String> _pathToContent = new HashMap<String, String>();
+  final Map<String, int> _pathToTimestamp = new HashMap<String, int>();
+  final Map<String, List<StreamController<WatchEvent>>> _pathToWatchers =
+      new HashMap<String, List<StreamController<WatchEvent>>>();
   int nextStamp = 0;
 
   @override
@@ -323,9 +326,11 @@
   }
 
   void _notifyWatchers(String path, ChangeType changeType) {
-    _pathToWatcher.forEach((String watcherPath, StreamController<WatchEvent> streamController) {
+    _pathToWatchers.forEach((String watcherPath, List<StreamController<WatchEvent>> streamControllers) {
       if (posix.isWithin(watcherPath, path)) {
-        streamController.add(new WatchEvent(changeType, path));
+        for (StreamController<WatchEvent> streamController in streamControllers) {
+          streamController.add(new WatchEvent(changeType, path));
+        }
       }
     });
   }
@@ -454,3 +459,49 @@
   @override
   Context get pathContext => io.Platform.isWindows ? windows : posix;
 }
+
+
+/**
+ * A [UriResolver] for [Resource]s.
+ */
+class ResourceUriResolver extends UriResolver {
+  /**
+   * The name of the `file` scheme.
+   */
+  static String _FILE_SCHEME = "file";
+
+  final ResourceProvider _provider;
+
+  ResourceUriResolver(this._provider);
+
+  @override
+  Source fromEncoding(UriKind kind, Uri uri) {
+    if (kind == UriKind.FILE_URI) {
+      Resource resource = _provider.getResource(uri.path);
+      if (resource is File) {
+        return resource.createSource(kind);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Source resolveAbsolute(Uri uri) {
+    if (!_isFileUri(uri)) {
+      return null;
+    }
+    Resource resource = _provider.getResource(uri.path);
+    if (resource is File) {
+      return resource.createSource(UriKind.FILE_URI);
+    }
+    return null;
+  }
+
+  /**
+   * Return `true` if the given URI is a `file` URI.
+   *
+   * @param uri the URI being tested
+   * @return `true` if the given URI is a `file` URI
+   */
+  static bool _isFileUri(Uri uri) => uri.scheme == _FILE_SCHEME;
+}
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 7d673b4..d6b7f1d 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -4,12 +4,41 @@
 
 library socket.server;
 
+import 'dart:io' as io;
+
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
+import 'package:analysis_server/src/domain_completion.dart';
+import 'package:analysis_server/src/domain_edit.dart';
+import 'package:analysis_server/src/domain_search.dart';
 import 'package:analysis_server/src/domain_server.dart';
+import 'package:analysis_server/src/index/index.dart';
+import 'package:analysis_server/src/package_map_provider.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:path/path.dart' as pathos;
+
+
+/**
+ * Creates and runs an [Index].
+ */
+Index _createIndex() {
+  String tempPath = io.Directory.systemTemp.path;
+  String indexPath = pathos.join(tempPath, 'AnalysisServer_index');
+  io.Directory indexDirectory = new io.Directory(indexPath);
+  if (indexDirectory.existsSync()) {
+    indexDirectory.deleteSync(recursive: true);
+  }
+  if (!indexDirectory.existsSync()) {
+    indexDirectory.createSync();
+  }
+  Index index = createLocalFileSplitIndex(indexDirectory);
+  index.run();
+  return index;
+}
+
 
 /**
  * Instances of the class [SocketServer] implement the common parts of
@@ -37,9 +66,12 @@
       });
       return;
     }
+    PhysicalResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
     analysisServer = new AnalysisServer(
         serverChannel,
-        PhysicalResourceProvider.INSTANCE,
+        resourceProvider,
+        new PubPackageMapProvider(resourceProvider),
+        _createIndex(),
         rethrowExceptions: false);
     _initializeHandlers(analysisServer);
   }
@@ -51,7 +83,9 @@
     server.handlers = [
         new ServerDomainHandler(server),
         new AnalysisDomainHandler(server),
+        new EditDomainHandler(server),
+        new SearchDomainHandler(server),
+        new CompletionDomainHandler(server),
     ];
   }
-
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index eb003a9..0979e2b 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -6,12 +6,11 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analysis_services: any
-  analyzer: '>=0.15.1 <0.16.0'
+  analyzer: '>=0.16.1 <0.17.0'
   args: any
   logging: any
   path: any
-  typed_mock: any
+  typed_mock: '>=0.0.4'
   watcher: any
 dev_dependencies:
   mock: '>=0.10.0 <0.11.0'
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 2ea2e1d..923129d 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -15,6 +15,7 @@
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
+import 'package:analyzer/src/generated/index.dart';
 
 
 /**
@@ -23,6 +24,7 @@
 class AbstractAnalysisTest {
   MockServerChannel serverChannel;
   MemoryResourceProvider resourceProvider;
+  MockPackageMapProvider packageMapProvider;
   AnalysisServer server;
   AnalysisDomainHandler handler;
 
@@ -43,15 +45,21 @@
   void setUp() {
     serverChannel = new MockServerChannel();
     resourceProvider = new MemoryResourceProvider();
-    server = new AnalysisServer(serverChannel, resourceProvider);
+    packageMapProvider = new MockPackageMapProvider();
+    Index index = createIndex();
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, packageMapProvider, index);
+    server.defaultSdk = new MockSdk();
     handler = new AnalysisDomainHandler(server);
     // listen for notifications
     Stream<Notification> notificationStream = serverChannel.notificationController.stream;
     notificationStream.listen((Notification notification) {
       processNotification(notification);
     });
-    // create an empty project
-    _createEmptyProject();
+  }
+
+  Index createIndex() {
+    return null;
   }
 
   void addAnalysisSubscription(AnalysisService service, String file) {
@@ -63,7 +71,7 @@
     }
     files.add(file);
     // set subscriptions
-    Request request = new Request('0', METHOD_SET_ANALYSIS_SUBSCRIPTIONS);
+    Request request = new Request('0', ANALYSIS_SET_SUBSCRIPTIONS);
     request.setParameter(SUBSCRIPTIONS, analysisSubscriptions);
     handleSuccessfulRequest(request);
   }
@@ -183,11 +191,11 @@
 //  }
 
   /**
-   * Creates an empty project `/project/`.
+   * Creates a project `/project`.
    */
-  void _createEmptyProject() {
+  void createProject() {
     resourceProvider.newFolder(projectPath);
-    Request request = new Request('0', METHOD_SET_ANALYSIS_ROOTS);
+    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
     request.setParameter(INCLUDED, [projectPath]);
     request.setParameter(EXCLUDED, []);
     handleSuccessfulRequest(request);
diff --git a/pkg/analysis_server/test/analysis_notification_highlights_test.dart b/pkg/analysis_server/test/analysis_notification_highlights_test.dart
new file mode 100644
index 0000000..012bb7d
--- /dev/null
+++ b/pkg/analysis_server/test/analysis_notification_highlights_test.dart
@@ -0,0 +1,769 @@
+// 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.domain.analysis.notification.highlights;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/computer/computer_highlights.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/unittest.dart';
+
+import 'analysis_abstract.dart';
+import 'reflective_tests.dart';
+
+
+main() {
+  group('notification.highlights', () {
+    runReflectiveTests(_AnalysisNotificationHighlightsTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class _AnalysisNotificationHighlightsTest extends AbstractAnalysisTest {
+  List<_HighlightRegion> regions;
+
+  void assertHasRawRegion(HighlightType type, int offset, int length) {
+    for (_HighlightRegion region in regions) {
+      if (region.offset == offset && region.length == length && region.type ==
+          type.name) {
+        return;
+      }
+    }
+    fail('Expected to find (offset=$offset; length=$length; type=$type) in\n'
+        '${regions.join('\n')}');
+  }
+
+  void assertHasRegion(HighlightType type, String search, [int length = -1]) {
+    int offset = findOffset(search);
+    length = findRegionLength(search, length);
+    assertHasRawRegion(type, offset, length);
+  }
+
+  void assertNoRawRegion(HighlightType type, int offset, int length) {
+    for (_HighlightRegion region in regions) {
+      if (region.offset == offset && region.length == length && region.type ==
+          type.name) {
+        fail(
+            'Not expected to find (offset=$offset; length=$length; type=$type) in\n'
+            '${regions.join('\n')}');
+      }
+    }
+  }
+
+
+  void assertNoRegion(HighlightType type, String search, [int length = -1]) {
+    int offset = findOffset(search);
+    length = findRegionLength(search, length);
+    assertNoRawRegion(type, offset, length);
+  }
+
+  int findRegionLength(String search, int length) {
+    if (length == -1) {
+      length = 0;
+      while (length < search.length) {
+        int c = search.codeUnitAt(length);
+        if (length == 0 && c == '@'.codeUnitAt(0)) {
+          length++;
+          continue;
+        }
+        if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) || c >=
+            'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) || c >= '0'.codeUnitAt(0) && c <=
+            '9'.codeUnitAt(0))) {
+          break;
+        }
+        length++;
+      }
+    }
+    return length;
+  }
+
+  Future prepareHighlights(then()) {
+    addAnalysisSubscription(AnalysisService.HIGHLIGHTS, testFile);
+    return waitForTasksFinished().then((_) {
+      then();
+    });
+  }
+
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_HIGHLIGHTS) {
+      String file = notification.getParameter(FILE);
+      if (file == testFile) {
+        regions = [];
+        List<Map<String, Object>> regionsJson = notification.getParameter(
+            REGIONS);
+        for (Map<String, Object> regionJson in regionsJson) {
+          regions.add(new _HighlightRegion.fromJson(regionJson));
+        }
+      }
+    }
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+  }
+
+  test_ANNOTATION_hasArguments() {
+    addTestFile('''
+class AAA {
+  const AAA(a, b, c);
+}
+@AAA(1, 2, 3) main() {}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.ANNOTATION, '@AAA(', '@AAA('.length);
+      assertHasRegion(HighlightType.ANNOTATION, ') main', ')'.length);
+    });
+  }
+
+  test_ANNOTATION_noArguments() {
+    addTestFile('''
+const AAA = 42;
+@AAA main() {}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.ANNOTATION, '@AAA');
+    });
+  }
+
+  test_BUILT_IN_abstract() {
+    addTestFile('''
+abstract class A {};
+main() {
+  var abstract = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'abstract class');
+      assertNoRegion(HighlightType.BUILT_IN, 'abstract = 42');
+    });
+  }
+
+  test_BUILT_IN_as() {
+    addTestFile('''
+import 'dart:math' as math;
+main() {
+  p as int;
+  var as = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'as math');
+      assertHasRegion(HighlightType.BUILT_IN, 'as int');
+      assertNoRegion(HighlightType.BUILT_IN, 'as = 42');
+    });
+  }
+
+  test_BUILT_IN_deferred() {
+    addTestFile('''
+import 'dart:math' deferred as math;
+main() {
+  var deferred = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'deferred as math');
+      assertNoRegion(HighlightType.BUILT_IN, 'deferred = 42');
+    });
+  }
+
+  test_BUILT_IN_export() {
+    addTestFile('''
+export "dart:math";
+main() {
+  var export = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'export "dart:');
+      assertNoRegion(HighlightType.BUILT_IN, 'export = 42');
+    });
+  }
+
+  test_BUILT_IN_external() {
+    addTestFile('''
+class A {
+  external A();
+  external aaa();
+}
+external main() {
+  var external = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'external A()');
+      assertHasRegion(HighlightType.BUILT_IN, 'external aaa()');
+      assertHasRegion(HighlightType.BUILT_IN, 'external main()');
+      assertNoRegion(HighlightType.BUILT_IN, 'external = 42');
+    });
+  }
+
+  test_BUILT_IN_factory() {
+    addTestFile('''
+class A {
+  factory A() => null;
+}
+main() {
+  var factory = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'factory A()');
+      assertNoRegion(HighlightType.BUILT_IN, 'factory = 42');
+    });
+  }
+
+  test_BUILT_IN_get() {
+    addTestFile('''
+get aaa => 1;
+class A {
+  get bbb => 2;
+}
+main() {
+  var get = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'get aaa =>');
+      assertHasRegion(HighlightType.BUILT_IN, 'get bbb =>');
+      assertNoRegion(HighlightType.BUILT_IN, 'get = 42');
+    });
+  }
+
+  test_BUILT_IN_hide() {
+    addTestFile('''
+import 'foo.dart' hide Foo;
+main() {
+  var hide = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'hide Foo');
+      assertNoRegion(HighlightType.BUILT_IN, 'hide = 42');
+    });
+  }
+
+  test_BUILT_IN_implements() {
+    addTestFile('''
+class A {}
+class B implements A {}
+main() {
+  var implements = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'implements A {}');
+      assertNoRegion(HighlightType.BUILT_IN, 'implements = 42');
+    });
+  }
+
+  test_BUILT_IN_import() {
+    addTestFile('''
+import "foo.dart";
+main() {
+  var import = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'import "');
+      assertNoRegion(HighlightType.BUILT_IN, 'import = 42');
+    });
+  }
+
+  test_BUILT_IN_library() {
+    addTestFile('''
+library lib;
+main() {
+  var library = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'library lib;');
+      assertNoRegion(HighlightType.BUILT_IN, 'library = 42');
+    });
+  }
+
+  test_BUILT_IN_native() {
+    addTestFile('''
+class A native "A_native" {}
+class B {
+  bbb() native "bbb_native";
+}
+main() {
+  var native = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'native "A_');
+      assertHasRegion(HighlightType.BUILT_IN, 'native "bbb_');
+      assertNoRegion(HighlightType.BUILT_IN, 'native = 42');
+    });
+  }
+
+  test_BUILT_IN_on() {
+    addTestFile('''
+main() {
+  try {
+  } on int catch (e) {
+  }
+  var on = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'on int');
+      assertNoRegion(HighlightType.BUILT_IN, 'on = 42');
+    });
+  }
+
+  test_BUILT_IN_operator() {
+    addTestFile('''
+class A {
+  operator +(x) => null;
+}
+main() {
+  var operator = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'operator +(');
+      assertNoRegion(HighlightType.BUILT_IN, 'operator = 42');
+    });
+  }
+
+  test_BUILT_IN_part() {
+    addTestFile('''
+part "my_part.dart";
+main() {
+  var part = 42;
+}''');
+    addFile('/project/bin/my_part.dart', 'part of lib;');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'part "my_');
+      assertNoRegion(HighlightType.BUILT_IN, 'part = 42');
+    });
+  }
+
+  test_BUILT_IN_partOf() {
+    addTestFile('''
+part of lib;
+main() {
+  var part = 1;
+  var of = 2;
+}''');
+    addFile('/project/bin/my_lib.dart', '''
+library lib;
+part 'test.dart';
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'part of', 'part of'.length);
+      assertNoRegion(HighlightType.BUILT_IN, 'part = 1');
+      assertNoRegion(HighlightType.BUILT_IN, 'of = 2');
+    });
+  }
+
+  test_BUILT_IN_set() {
+    addTestFile('''
+set aaa(x) {}
+class A
+  set bbb(x) {}
+}
+main() {
+  var set = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'set aaa(');
+      assertHasRegion(HighlightType.BUILT_IN, 'set bbb(');
+      assertNoRegion(HighlightType.BUILT_IN, 'set = 42');
+    });
+  }
+
+  test_BUILT_IN_show() {
+    addTestFile('''
+import 'foo.dart' show Foo;
+main() {
+  var show = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'show Foo');
+      assertNoRegion(HighlightType.BUILT_IN, 'show = 42');
+    });
+  }
+
+  test_BUILT_IN_static() {
+    addTestFile('''
+class A {
+  static aaa;
+  static bbb() {}
+}
+main() {
+  var static = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'static aaa;');
+      assertHasRegion(HighlightType.BUILT_IN, 'static bbb()');
+      assertNoRegion(HighlightType.BUILT_IN, 'static = 42');
+    });
+  }
+
+  test_BUILT_IN_typedef() {
+    addTestFile('''
+typedef A();
+main() {
+  var typedef = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'typedef A();');
+      assertNoRegion(HighlightType.BUILT_IN, 'typedef = 42');
+    });
+  }
+
+  test_CLASS() {
+    addTestFile('''
+class AAA {}
+AAA aaa;
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.CLASS, 'AAA {}');
+      assertHasRegion(HighlightType.CLASS, 'AAA aaa');
+    });
+  }
+
+  test_CLASS_notDynamic() {
+    addTestFile('''
+dynamic f() {}
+''');
+    return prepareHighlights(() {
+      assertNoRegion(HighlightType.CLASS, 'dynamic f()');
+    });
+  }
+
+  test_CLASS_notVoid() {
+    addTestFile('''
+void f() {}
+''');
+    return prepareHighlights(() {
+      assertNoRegion(HighlightType.CLASS, 'void f()');
+    });
+  }
+
+  test_CONSTRUCTOR() {
+    addTestFile('''
+class AAA {
+  AAA() {}
+  AAA.name(p) {}
+}
+main() {
+  new AAA();
+  new AAA.name(42);
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.CONSTRUCTOR, 'name(p)');
+      assertHasRegion(HighlightType.CONSTRUCTOR, 'name(42)');
+      assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA() {}');
+      assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA();');
+    });
+  }
+
+  test_DYNAMIC_TYPE() {
+    addTestFile('''
+f() {}
+main(p) {
+  print(p);
+  var v1 = f();
+  int v2;
+  var v3 = v2;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.DYNAMIC_TYPE, 'p)');
+      assertHasRegion(HighlightType.DYNAMIC_TYPE, 'v1 =');
+      assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v2;');
+      assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v3 =');
+    });
+  }
+
+  test_FIELD() {
+    addTestFile('''
+class A {
+  int aaa = 1;
+  int bbb = 2;
+  A([this.bbb = 3]);
+}
+main(A a) {
+  a.aaa = 4;
+  a.bbb = 5;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.FIELD, 'aaa = 1');
+      assertHasRegion(HighlightType.FIELD, 'bbb = 2');
+      assertHasRegion(HighlightType.FIELD, 'bbb = 3');
+      assertHasRegion(HighlightType.FIELD, 'aaa = 4');
+      assertHasRegion(HighlightType.FIELD, 'bbb = 5');
+    });
+  }
+
+  test_FIELD_STATIC() {
+    addTestFile('''
+class A {
+  static aaa = 1;
+  static get bbb => null;
+  static set ccc(x) {}
+}
+main() {
+  A.aaa = 2;
+  A.bbb;
+  A.ccc = 3;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 2');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'bbb;');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'ccc = 3');
+    });
+  }
+
+  test_FUNCTION() {
+    addTestFile('''
+fff(p) {}
+main() {
+  fff(42);
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.FUNCTION_DECLARATION, 'fff(p) {}');
+      assertHasRegion(HighlightType.FUNCTION, 'fff(42)');
+    });
+  }
+
+  test_FUNCTION_TYPE_ALIAS() {
+    addTestFile('''
+typedef FFF(p);
+main(FFF fff) {
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF(p)');
+      assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF fff)');
+    });
+  }
+
+  test_GETTER_DECLARATION() {
+    addTestFile('''
+get aaa => null;
+class A {
+  get bbb => null;
+}
+main(A a) {
+  aaa;
+  a.bbb;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.GETTER_DECLARATION, 'aaa => null');
+      assertHasRegion(HighlightType.GETTER_DECLARATION, 'bbb => null');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'aaa;');
+      assertHasRegion(HighlightType.FIELD, 'bbb;');
+    });
+  }
+
+  test_IDENTIFIER_DEFAULT() {
+    addTestFile('''
+main() {
+  aaa = 42;
+  bbb(84);
+  CCC ccc;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'aaa = 42');
+      assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'bbb(84)');
+      assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'CCC ccc');
+    });
+  }
+
+  test_IMPORT_PREFIX() {
+    addTestFile('''
+import 'dart:math' as ma;
+main() {
+  ma.max(1, 2);
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma;');
+      assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma.max');
+    });
+  }
+
+  test_KEYWORD_void() {
+    addTestFile('''
+void main() {
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.KEYWORD, 'void main()');
+    });
+  }
+
+  test_LITERAL_BOOLEAN() {
+    addTestFile('var V = true;');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.LITERAL_BOOLEAN, 'true;');
+    });
+  }
+
+  test_LITERAL_DOUBLE() {
+    addTestFile('var V = 4.2;');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.LITERAL_DOUBLE, '4.2;', '4.2'.length);
+    });
+  }
+
+  test_LITERAL_INTEGER() {
+    addTestFile('var V = 42;');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.LITERAL_INTEGER, '42;');
+    });
+  }
+
+  test_LITERAL_STRING() {
+    addTestFile('var V = "abc";');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.LITERAL_STRING, '"abc";', '"abc"'.length);
+    });
+  }
+
+  test_LOCAL_VARIABLE() {
+    addTestFile('''
+main() {
+  int vvv = 0;
+  vvv;
+  vvv = 1;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.LOCAL_VARIABLE_DECLARATION, 'vvv = 0');
+      assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv;');
+      assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv = 1;');
+    });
+  }
+
+  test_METHOD() {
+    addTestFile('''
+class A {
+  aaa() {}
+  static bbb() {}
+}
+main(A a) {
+  a.aaa();
+  a.aaa;
+  A.bbb();
+  A.bbb;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.METHOD_DECLARATION, 'aaa() {}');
+      assertHasRegion(HighlightType.METHOD_DECLARATION_STATIC, 'bbb() {}');
+      assertHasRegion(HighlightType.METHOD, 'aaa();');
+      assertHasRegion(HighlightType.METHOD, 'aaa;');
+      assertHasRegion(HighlightType.METHOD_STATIC, 'bbb();');
+      assertHasRegion(HighlightType.METHOD_STATIC, 'bbb;');
+    });
+  }
+
+  test_METHOD_bestType() {
+    addTestFile('''
+main(p) {
+  if (p is List) {
+    p.add(null);
+  }
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.METHOD, 'add(null)');
+    });
+  }
+
+  test_PARAMETER() {
+    addTestFile('''
+main(int p) {
+  p;
+  p = 42;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.PARAMETER, 'p) {');
+      assertHasRegion(HighlightType.PARAMETER, 'p;');
+      assertHasRegion(HighlightType.PARAMETER, 'p = 42');
+    });
+  }
+
+  test_SETTER_DECLARATION() {
+    addTestFile('''
+set aaa(x) {}
+class A {
+  set bbb(x) {}
+}
+main(A a) {
+  aaa = 1;
+  a.bbb = 2;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.SETTER_DECLARATION, 'aaa(x)');
+      assertHasRegion(HighlightType.SETTER_DECLARATION, 'bbb(x)');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
+      assertHasRegion(HighlightType.FIELD, 'bbb = 2');
+    });
+  }
+
+  test_TOP_LEVEL_VARIABLE() {
+    addTestFile('''
+var VVV = 0;
+main() {
+  print(VVV);
+  VVV = 1;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'VVV = 0');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'VVV);');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'VVV = 1');
+    });
+  }
+
+  test_TYPE_NAME_DYNAMIC() {
+    addTestFile('''
+dynamic main() {
+  dynamic = 42;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic main()');
+      assertNoRegion(HighlightType.IDENTIFIER_DEFAULT, 'dynamic main()');
+      assertNoRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic = 42');
+    });
+  }
+
+  test_TYPE_PARAMETER() {
+    addTestFile('''
+class A<T> {
+  T fff;
+  T mmm(T p) => null;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.TYPE_PARAMETER, 'T> {');
+      assertHasRegion(HighlightType.TYPE_PARAMETER, 'T fff;');
+      assertHasRegion(HighlightType.TYPE_PARAMETER, 'T mmm(');
+      assertHasRegion(HighlightType.TYPE_PARAMETER, 'T p)');
+    });
+  }
+}
+
+
+class _HighlightRegion {
+  final int length;
+  final int offset;
+  final String type;
+
+  _HighlightRegion(this.type, this.offset, this.length);
+
+  factory _HighlightRegion.fromJson(Map<String, Object> map) {
+    return new _HighlightRegion(map[TYPE], map[OFFSET], map[LENGTH]);
+  }
+}
diff --git a/pkg/analysis_server/test/analysis_notification_navigation_test.dart b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
index 0268147..f66e657 100644
--- a/pkg/analysis_server/test/analysis_notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
@@ -7,63 +7,50 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:unittest/unittest.dart';
 
-import 'analysis_abstract_test.dart';
+import 'analysis_abstract.dart';
 import 'reflective_tests.dart';
 
 
+main() {
+  group('notification.navigation', () {
+    runReflectiveTests(_AnalysisNotificationNavigationTest);
+  });
+}
+
+
 @ReflectiveTestCase()
-class AnalysisNotificationNavigationTest extends AbstractAnalysisTest {
-  List<Map<String, Object>> regions;
-  Map<String, Object> testRegion;
-  List<Map<String, Object>> testTargets;
-
-  void processNotification(Notification notification) {
-    if (notification.event == NOTIFICATION_NAVIGATION) {
-      String file = notification.getParameter(FILE);
-      if (file == testFile) {
-        regions = notification.getParameter(REGIONS);
-      }
-    }
-  }
-
-  Future prepareNavigation(then()) {
-    addAnalysisSubscription(AnalysisService.NAVIGATION, testFile);
-    return waitForTasksFinished().then((_) {
-      then();
-    });
-  }
+class _AnalysisNotificationNavigationTest extends AbstractAnalysisTest {
+  List<_NavigationRegion> regions;
+  _NavigationRegion testRegion;
+  List<_NavigationTarget> testTargets;
+  _NavigationTarget testTarget;
 
   /**
-   * Finds the navigation region with the given [offset] and [length].
-   * If [length] is `-1`, then it is ignored.
-   *
-   * If [exists] is `true`, then fails if such region does not exist.
-   * Otherwise remembers this it into [testRegion].
-   * Also fills [testTargets] with its targets.
-   *
-   * If [exists] is `false`, then fails if such region exists.
+   * Validates that there is a target in [testTargets]  with [file], at [offset]
+   * and with the given [length].
    */
-  void findRegion(int offset, int length, [bool exists]) {
-    for (Map<String, Object> region in regions) {
-      if (region['offset'] == offset &&
-          (length == -1 || region['length'] == length)) {
-        if (exists == false) {
-          fail('Not expected to find (offset=$offset; length=$length) in\n'
-               '${regions.join('\n')}');
-        }
-        testRegion = region;
-        testTargets = region['targets'];
+  void assertHasFileTarget(String file, int offset, int length) {
+    for (_NavigationTarget target in testTargets) {
+      if (target.file == file && target.offset == offset && target.length ==
+          length) {
+        testTarget = target;
         return;
       }
     }
-    if (exists == true) {
-      fail('Expected to find (offset=$offset; length=$length) in\n'
-           '${regions.join('\n')}');
-    }
+    fail(
+        'Expected to find target (file=$file; offset=$offset; length=$length) in\n'
+        '${testRegion} in\n' '${regions.join('\n')}');
+  }
+
+  void assertHasOperatorRegion(String regionSearch, int regionLength,
+      String targetSearch, int targetLength) {
+    assertHasRegion(regionSearch, regionLength);
+    assertHasTarget(targetSearch, targetLength);
   }
 
   /**
@@ -90,6 +77,15 @@
   }
 
   /**
+   * Validates that there is an identifier region at [regionSearch] with target
+   * at [targetSearch].
+   */
+  void assertHasRegionTarget(String regionSearch, String targetSearch) {
+    assertHasRegion(regionSearch);
+    assertHasTarget(targetSearch);
+  }
+
+  /**
    * Validates that there is a target in [testTargets]  with [testFile], at the
    * offset of [search] in [testFile], and with the given [length] or the length
    * of an leading identifier in [search].
@@ -99,48 +95,7 @@
     if (length == -1) {
       length = findIdentifierLength(search);
     }
-    for (Map<String, Object> target in testTargets) {
-      if (target['file'] == testFile &&
-          target['offset'] == offset &&
-          target['length'] == length) {
-        return;
-      }
-    }
-    fail('Expected to find target (offset=$offset; length=$length) in\n'
-         '${testRegion} in\n'
-         '${regions.join('\n')}');
-  }
-
-  /**
-   * Validates that there is a target in [testTargets]  with [file], at [offset]
-   * and with the given [length].
-   */
-  void assertHasFileTarget(String file, int offset, int length) {
-    for (Map<String, Object> target in testTargets) {
-      if (target['file'] == file &&
-          target['offset'] == offset &&
-          target['length'] == length) {
-        return;
-      }
-    }
-    fail('Expected to find target (file=$file; offset=$offset; length=$length) in\n'
-         '${testRegion} in\n'
-         '${regions.join('\n')}');
-  }
-
-  /**
-   * Validates that there is an identifier region at [regionSearch] with target
-   * at [targetSearch].
-   */
-  void assertHasRegionTarget(String regionSearch, String targetSearch) {
-    assertHasRegion(regionSearch);
-    assertHasTarget(targetSearch);
-  }
-
-  void assertHasOperatorRegion(String regionSearch, int regionLength,
-                               String targetSearch, int targetLength) {
-    assertHasRegion(regionSearch, regionLength);
-    assertHasTarget(targetSearch, targetLength);
+    assertHasFileTarget(testFile, offset, length);
   }
 
   /**
@@ -169,6 +124,87 @@
     findRegion(offset, length, false);
   }
 
+  /**
+   * Finds the navigation region with the given [offset] and [length].
+   * If [length] is `-1`, then it is ignored.
+   *
+   * If [exists] is `true`, then fails if such region does not exist.
+   * Otherwise remembers this it into [testRegion].
+   * Also fills [testTargets] with its targets.
+   *
+   * If [exists] is `false`, then fails if such region exists.
+   */
+  void findRegion(int offset, int length, [bool exists]) {
+    for (_NavigationRegion region in regions) {
+      if (region.offset == offset && (length == -1 || region.length == length))
+          {
+        if (exists == false) {
+          fail('Not expected to find (offset=$offset; length=$length) in\n'
+              '${regions.join('\n')}');
+        }
+        testRegion = region;
+        testTargets = region.targets;
+        return;
+      }
+    }
+    if (exists == true) {
+      fail('Expected to find (offset=$offset; length=$length) in\n'
+          '${regions.join('\n')}');
+    }
+  }
+
+  Future prepareNavigation(then()) {
+    addAnalysisSubscription(AnalysisService.NAVIGATION, testFile);
+    return waitForTasksFinished().then((_) {
+      then();
+    });
+  }
+
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_NAVIGATION) {
+      String file = notification.getParameter(FILE);
+      if (file == testFile) {
+        regions = [];
+        List<Map<String, Object>> regionsJson = notification.getParameter(
+            REGIONS);
+        for (Map<String, Object> regionJson in regionsJson) {
+          var regionOffset = regionJson[OFFSET];
+          var regionLength = regionJson[LENGTH];
+          List<_NavigationTarget> targets = [];
+          for (Map<String, Object> targetJson in regionJson[TARGETS]) {
+            var targetFile = targetJson[FILE];
+            var targetOffset = targetJson[OFFSET];
+            var targetLength = targetJson[LENGTH];
+            var elementJson = targetJson[ELEMENT];
+            targets.add(new _NavigationTarget(targetFile, targetOffset,
+                targetLength, new Element.fromJson(elementJson)));
+          }
+          var region = new _NavigationRegion(regionOffset, regionLength,
+              targets);
+          regions.add(region);
+        }
+      }
+    }
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+  }
+
+  test_afterAnalysis() {
+    addTestFile('''
+class AAA {}
+AAA aaa;
+''');
+    return waitForTasksFinished().then((_) {
+      return prepareNavigation(() {
+        assertHasRegionTarget('AAA aaa;', 'AAA {}');
+      });
+    });
+  }
+
   test_constructor_named() {
     addTestFile('''
 class A {
@@ -242,6 +278,20 @@
     });
   }
 
+  test_instanceCreation_implicit() {
+    addTestFile('''
+class A {
+}
+main() {
+  new A();
+}
+''');
+    return prepareNavigation(() {
+      assertHasRegionString('new A');
+      assertHasTarget('A {');
+    });
+  }
+
   test_instanceCreation_named() {
     addTestFile('''
 class A {
@@ -410,11 +460,41 @@
 //      assertNoRegionString('part "test_unit.dart"');
 //    });
   }
+
+  test_targetElement() {
+    addTestFile('''
+class AAA {}
+main() {
+  AAA aaa = null;
+}
+''');
+    return prepareNavigation(() {
+      assertHasRegionTarget('AAA aaa', 'AAA {}');
+      Element element = testTarget.element;
+      expect(element.kind, ElementKind.CLASS);
+      expect(element.name, 'AAA');
+      expect(element.isAbstract, false);
+      expect(element.parameters, isNull);
+      expect(element.returnType, isNull);
+    });
+  }
 }
 
 
-main() {
-  group('notification.navigation', () {
-    runReflectiveTests(AnalysisNotificationNavigationTest);
-  });
-}
\ No newline at end of file
+class _NavigationRegion {
+  final int offset;
+  final int length;
+  final List<_NavigationTarget> targets;
+
+  _NavigationRegion(this.offset, this.length, this.targets);
+}
+
+
+class _NavigationTarget {
+  final String file;
+  final int offset;
+  final int length;
+  final Element element;
+
+  _NavigationTarget(this.file, this.offset, this.length, this.element);
+}
diff --git a/pkg/analysis_server/test/analysis_notification_outline_test.dart b/pkg/analysis_server/test/analysis_notification_outline_test.dart
index 49011ef..54c9aff 100644
--- a/pkg/analysis_server/test/analysis_notification_outline_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_outline_test.dart
@@ -5,9 +5,10 @@
 library test.domain.analysis.notification.outline;
 
 import 'dart:async';
-import 'dart:mirrors';
 
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/computer/computer_outline.dart';
+import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:unittest/unittest.dart';
@@ -18,24 +19,14 @@
 
 main() {
   group('notification.outline', () {
-    runReflectiveTests(AnalysisNotificationOutlineTest);
+    runReflectiveTests(_AnalysisNotificationOutlineTest);
   });
 }
 
 
 @ReflectiveTestCase()
-class AnalysisNotificationOutlineTest extends AbstractAnalysisTest {
-  _Outline outline;
-
-  void processNotification(Notification notification) {
-    if (notification.event == NOTIFICATION_OUTLINE) {
-      String file = notification.getParameter(FILE);
-      if (file == testFile) {
-        Map<String, Object> json = notification.getParameter(OUTLINE);
-        outline = new _Outline.fromJson(json);
-      }
-    }
-  }
+class _AnalysisNotificationOutlineTest extends AbstractAnalysisTest {
+  Outline outline;
 
   Future prepareOutline(then()) {
     addAnalysisSubscription(AnalysisService.OUTLINE, testFile);
@@ -44,6 +35,39 @@
     });
   }
 
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_OUTLINE) {
+      String file = notification.getParameter(FILE);
+      if (file == testFile) {
+        Map<String, Object> json = notification.getParameter(OUTLINE);
+        outline = new Outline.fromJson(json);
+      }
+    }
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+  }
+
+  test_afterAnalysis() {
+    addTestFile('''
+class AAA {
+}
+class BBB {
+}
+''');
+    return waitForTasksFinished().then((_) {
+      expect(outline, isNull);
+      return prepareOutline(() {
+        Outline unitOutline = outline;
+        List<Outline> outlines = unitOutline.children;
+        expect(outlines, hasLength(2));
+      });
+    });
+  }
+
   test_class() {
     addTestFile('''
 class A {
@@ -62,334 +86,149 @@
 }");
 ''');
     return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> topOutlines = unitOutline.children;
+      Outline unitOutline = outline;
+      List<Outline> topOutlines = unitOutline.children;
       expect(topOutlines, hasLength(2));
       // A
       {
-        _Outline outline_A = topOutlines[0];
-        expect(outline_A.kind, _OutlineKind.CLASS);
-        expect(outline_A.name, "A");
-        expect(outline_A.nameOffset, testCode.indexOf("A {"));
-        expect(outline_A.nameLength, 1);
-        expect(outline_A.parameters, null);
-        expect(outline_A.returnType, null);
+        Outline outline_A = topOutlines[0];
+        Element element_A = outline_A.element;
+        expect(element_A.kind, ElementKind.CLASS);
+        expect(element_A.name, "A");
+        expect(element_A.offset, testCode.indexOf("A {"));
+        expect(element_A.length, 1);
+        expect(element_A.parameters, null);
+        expect(element_A.returnType, null);
         // A children
-        List<_Outline> outlines_A = outline_A.children;
+        List<Outline> outlines_A = outline_A.children;
         expect(outlines_A, hasLength(10));
         {
-          _Outline outline = outlines_A[0];
-          expect(outline.kind, _OutlineKind.FIELD);
-          expect(outline.name, "fa");
-          expect(outline.parameters, isNull);
-          expect(outline.returnType, "int");
+          Outline outline = outlines_A[0];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.FIELD);
+          expect(element.name, "fa");
+          expect(element.parameters, isNull);
+          expect(element.returnType, "int");
         }
         {
-          _Outline outline = outlines_A[1];
-          expect(outline.kind, _OutlineKind.FIELD);
-          expect(outline.name, "fb");
-          expect(outline.parameters, isNull);
-          expect(outline.returnType, "int");
+          Outline outline = outlines_A[1];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.FIELD);
+          expect(element.name, "fb");
+          expect(element.parameters, isNull);
+          expect(element.returnType, "int");
         }
         {
-          _Outline outline = outlines_A[2];
-          expect(outline.kind, _OutlineKind.FIELD);
-          expect(outline.name, "fc");
-          expect(outline.parameters, isNull);
-          expect(outline.returnType, "String");
+          Outline outline = outlines_A[2];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.FIELD);
+          expect(element.name, "fc");
+          expect(element.parameters, isNull);
+          expect(element.returnType, "String");
         }
         {
-          _Outline outline = outlines_A[3];
-          expect(outline.kind, _OutlineKind.CONSTRUCTOR);
-          expect(outline.name, "A");
-          expect(outline.nameOffset, testCode.indexOf("A(int i, String s);"));
-          expect(outline.nameLength, "A".length);
-          expect(outline.parameters, "(int i, String s)");
-          expect(outline.returnType, isNull);
-          expect(outline.isAbstract, isFalse);
-          expect(outline.isStatic, isFalse);
+          Outline outline = outlines_A[3];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.CONSTRUCTOR);
+          expect(element.name, "A");
+          expect(element.offset, testCode.indexOf("A(int i, String s);"));
+          expect(element.length, "A".length);
+          expect(element.parameters, "(int i, String s)");
+          expect(element.returnType, isNull);
+          expect(element.isAbstract, isFalse);
+          expect(element.isStatic, isFalse);
         }
         {
-          _Outline outline = outlines_A[4];
-          expect(outline.kind, _OutlineKind.CONSTRUCTOR);
-          expect(outline.name, "A.name");
-          expect(outline.nameOffset, testCode.indexOf("name(num p);"));
-          expect(outline.nameLength, "name".length);
-          expect(outline.parameters, "(num p)");
-          expect(outline.returnType, isNull);
-          expect(outline.isAbstract, isFalse);
-          expect(outline.isStatic, isFalse);
+          Outline outline = outlines_A[4];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.CONSTRUCTOR);
+          expect(element.name, "A.name");
+          expect(element.offset, testCode.indexOf("name(num p);"));
+          expect(element.length, "name".length);
+          expect(element.parameters, "(num p)");
+          expect(element.returnType, isNull);
+          expect(element.isAbstract, isFalse);
+          expect(element.isStatic, isFalse);
         }
         {
-          _Outline outline = outlines_A[5];
-          expect(outline.kind, _OutlineKind.CONSTRUCTOR);
-          expect(outline.name, "A._privateName");
-          expect(outline.nameOffset, testCode.indexOf("_privateName(num p);"));
-          expect(outline.nameLength, "_privateName".length);
-          expect(outline.parameters, "(num p)");
-          expect(outline.returnType, isNull);
-          expect(outline.isAbstract, isFalse);
-          expect(outline.isStatic, isFalse);
+          Outline outline = outlines_A[5];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.CONSTRUCTOR);
+          expect(element.name, "A._privateName");
+          expect(element.offset, testCode.indexOf("_privateName(num p);"));
+          expect(element.length, "_privateName".length);
+          expect(element.parameters, "(num p)");
+          expect(element.returnType, isNull);
+          expect(element.isAbstract, isFalse);
+          expect(element.isStatic, isFalse);
         }
         {
-          _Outline outline = outlines_A[6];
-          expect(outline.kind, _OutlineKind.METHOD);
-          expect(outline.name, "ma");
-          expect(outline.nameOffset, testCode.indexOf("ma(int pa) => null;"));
-          expect(outline.nameLength, "ma".length);
-          expect(outline.parameters, "(int pa)");
-          expect(outline.returnType, "String");
-          expect(outline.isAbstract, isFalse);
-          expect(outline.isStatic, isTrue);
+          Outline outline = outlines_A[6];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.METHOD);
+          expect(element.name, "ma");
+          expect(element.offset, testCode.indexOf("ma(int pa) => null;"));
+          expect(element.length, "ma".length);
+          expect(element.parameters, "(int pa)");
+          expect(element.returnType, "String");
+          expect(element.isAbstract, isFalse);
+          expect(element.isStatic, isTrue);
         }
         {
-          _Outline outline = outlines_A[7];
-          expect(outline.kind, _OutlineKind.METHOD);
-          expect(outline.name, "_mb");
-          expect(outline.nameOffset, testCode.indexOf("_mb(int pb);"));
-          expect(outline.nameLength, "_mb".length);
-          expect(outline.parameters, "(int pb)");
-          expect(outline.returnType, "");
-          expect(outline.isAbstract, isTrue);
-          expect(outline.isStatic, isFalse);
+          Outline outline = outlines_A[7];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.METHOD);
+          expect(element.name, "_mb");
+          expect(element.offset, testCode.indexOf("_mb(int pb);"));
+          expect(element.length, "_mb".length);
+          expect(element.parameters, "(int pb)");
+          expect(element.returnType, "");
+          expect(element.isAbstract, isTrue);
+          expect(element.isStatic, isFalse);
         }
         {
-          _Outline outline = outlines_A[8];
-          expect(outline.kind, _OutlineKind.GETTER);
-          expect(outline.name, "propA");
-          expect(outline.nameOffset, testCode.indexOf("propA => null;"));
-          expect(outline.nameLength, "propA".length);
-          expect(outline.parameters, "");
-          expect(outline.returnType, "String");
+          Outline outline = outlines_A[8];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.GETTER);
+          expect(element.name, "propA");
+          expect(element.offset, testCode.indexOf("propA => null;"));
+          expect(element.length, "propA".length);
+          expect(element.parameters, "");
+          expect(element.returnType, "String");
         }
         {
-          _Outline outline = outlines_A[9];
-          expect(outline.kind, _OutlineKind.SETTER);
-          expect(outline.name, "propB");
-          expect(outline.nameOffset, testCode.indexOf("propB(int v) {}"));
-          expect(outline.nameLength, "propB".length);
-          expect(outline.parameters, "(int v)");
-          expect(outline.returnType, "");
+          Outline outline = outlines_A[9];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.SETTER);
+          expect(element.name, "propB");
+          expect(element.offset, testCode.indexOf("propB(int v) {}"));
+          expect(element.length, "propB".length);
+          expect(element.parameters, "(int v)");
+          expect(element.returnType, "");
         }
       }
       // B
       {
-        _Outline outline_B = topOutlines[1];
-        expect(outline_B.kind, _OutlineKind.CLASS);
-        expect(outline_B.name, "B");
-        expect(outline_B.nameOffset, testCode.indexOf("B {"));
-        expect(outline_B.nameLength, 1);
-        expect(outline_B.parameters, null);
-        expect(outline_B.returnType, null);
+        Outline outline_B = topOutlines[1];
+        Element element_B = outline_B.element;
+        expect(element_B.kind, ElementKind.CLASS);
+        expect(element_B.name, "B");
+        expect(element_B.offset, testCode.indexOf("B {"));
+        expect(element_B.length, 1);
+        expect(element_B.parameters, null);
+        expect(element_B.returnType, null);
         // B children
-        List<_Outline> outlines_B = outline_B.children;
+        List<Outline> outlines_B = outline_B.children;
         expect(outlines_B, hasLength(1));
         {
-          _Outline outline = outlines_B[0];
-          expect(outline.kind, _OutlineKind.CONSTRUCTOR);
-          expect(outline.name, "B");
-          expect(outline.nameOffset, testCode.indexOf("B(int p);"));
-          expect(outline.nameLength, "B".length);
-          expect(outline.parameters, "(int p)");
-          expect(outline.returnType, isNull);
-        }
-      }
-    });
-  }
-
-  test_sourceRange_inClass() {
-    addTestFile('''
-class A { // leftA
-  int methodA() {} // endA
-  int methodB() {} // endB
-}
-''');
-    return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> outlines = unitOutline.children[0].children;
-      expect(outlines, hasLength(2));
-      // methodA
-      {
-        _Outline outline = outlines[0];
-        expect(outline.kind, _OutlineKind.METHOD);
-        expect(outline.name, "methodA");
-        {
-          int offset = testCode.indexOf(" // leftA");
-          int end = testCode.indexOf(" // endA");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // methodB
-      {
-        _Outline outline = outlines[1];
-        expect(outline.kind, _OutlineKind.METHOD);
-        expect(outline.name, "methodB");
-        {
-          int offset = testCode.indexOf(" // endA");
-          int end = testCode.indexOf(" // endB");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-    });
-  }
-
-  test_sourceRange_inClass_inVariableList() {
-    addTestFile('''
-class A { // leftA
-  int fieldA, fieldB, fieldC; // marker
-  int fieldD; // marker2
-}
-''');
-    return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> outlines = unitOutline.children[0].children;
-      expect(outlines, hasLength(4));
-      // fieldA
-      {
-        _Outline outline = outlines[0];
-        expect(outline.kind, _OutlineKind.FIELD);
-        expect(outline.name, "fieldA");
-        {
-          int offset = testCode.indexOf(" // leftA");
-          int end = testCode.indexOf(", fieldB");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // fieldB
-      {
-        _Outline outline = outlines[1];
-        expect(outline.kind, _OutlineKind.FIELD);
-        expect(outline.name, "fieldB");
-        {
-          int offset = testCode.indexOf(", fieldB");
-          int end = testCode.indexOf(", fieldC");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // fieldC
-      {
-        _Outline outline = outlines[2];
-        expect(outline.kind, _OutlineKind.FIELD);
-        expect(outline.name, "fieldC");
-        {
-          int offset = testCode.indexOf(", fieldC");
-          int end = testCode.indexOf(" // marker");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // fieldD
-      {
-        _Outline outline = outlines[3];
-        expect(outline.kind, _OutlineKind.FIELD);
-        expect(outline.name, "fieldD");
-        {
-          int offset = testCode.indexOf(" // marker");
-          int end = testCode.indexOf(" // marker2");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-    });
-  }
-
-  test_sourceRange_inUnit() {
-    addTestFile('''
-class A {
-} // endA
-class B {
-} // endB
-''');
-    return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> topOutlines = unitOutline.children;
-      expect(topOutlines, hasLength(2));
-      // A
-      {
-        _Outline outline = topOutlines[0];
-        expect(outline.kind, _OutlineKind.CLASS);
-        expect(outline.name, "A");
-        {
-          int offset = 0;
-          int end = testCode.indexOf(" // endA");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // B
-      {
-        _Outline outline = topOutlines[1];
-        expect(outline.kind, _OutlineKind.CLASS);
-        expect(outline.name, "B");
-        {
-          int offset = testCode.indexOf(" // endA");
-          int end = testCode.indexOf(" // endB");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-    });
-  }
-
-  test_sourceRange_inUnit_inVariableList() {
-    addTestFile('''
-int fieldA, fieldB, fieldC; // marker
-int fieldD; // marker2
-''');
-    return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> outlines = unitOutline.children;
-      expect(outlines, hasLength(4));
-      // fieldA
-      {
-        _Outline outline = outlines[0];
-        expect(outline.kind, _OutlineKind.TOP_LEVEL_VARIABLE);
-        expect(outline.name, "fieldA");
-        {
-          int offset = 0;
-          int end = testCode.indexOf(", fieldB");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // fieldB
-      {
-        _Outline outline = outlines[1];
-        expect(outline.kind, _OutlineKind.TOP_LEVEL_VARIABLE);
-        expect(outline.name, "fieldB");
-        {
-          int offset = testCode.indexOf(", fieldB");
-          int end = testCode.indexOf(", fieldC");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // fieldC
-      {
-        _Outline outline = outlines[2];
-        expect(outline.kind, _OutlineKind.TOP_LEVEL_VARIABLE);
-        expect(outline.name, "fieldC");
-        {
-          int offset = testCode.indexOf(", fieldC");
-          int end = testCode.indexOf(" // marker");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // fieldD
-      {
-        _Outline outline = outlines[3];
-        expect(outline.kind, _OutlineKind.TOP_LEVEL_VARIABLE);
-        expect(outline.name, "fieldD");
-        {
-          int offset = testCode.indexOf(" // marker");
-          int end = testCode.indexOf(" // marker2");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
+          Outline outline = outlines_B[0];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.CONSTRUCTOR);
+          expect(element.name, "B");
+          expect(element.offset, testCode.indexOf("B(int p);"));
+          expect(element.length, "B".length);
+          expect(element.parameters, "(int p)");
+          expect(element.returnType, isNull);
         }
       }
     });
@@ -413,110 +252,329 @@
 }
 ''');
     return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> topOutlines = unitOutline.children;
+      Outline unitOutline = outline;
+      List<Outline> topOutlines = unitOutline.children;
       expect(topOutlines, hasLength(2));
       // A
       {
-        _Outline outline_A = topOutlines[0];
-        expect(outline_A.kind, _OutlineKind.CLASS);
-        expect(outline_A.name, "A");
-        expect(outline_A.nameOffset, testCode.indexOf("A {"));
-        expect(outline_A.nameLength, "A".length);
-        expect(outline_A.parameters, null);
-        expect(outline_A.returnType, null);
+        Outline outline_A = topOutlines[0];
+        Element element_A = outline_A.element;
+        expect(element_A.kind, ElementKind.CLASS);
+        expect(element_A.name, "A");
+        expect(element_A.offset, testCode.indexOf("A {"));
+        expect(element_A.length, "A".length);
+        expect(element_A.parameters, null);
+        expect(element_A.returnType, null);
         // A children
-        List<_Outline> outlines_A = outline_A.children;
+        List<Outline> outlines_A = outline_A.children;
         expect(outlines_A, hasLength(2));
         {
-          _Outline constructorOutline = outlines_A[0];
-          expect(constructorOutline.kind, _OutlineKind.CONSTRUCTOR);
-          expect(constructorOutline.name, "A");
-          expect(constructorOutline.nameOffset, testCode.indexOf("A() {"));
-          expect(constructorOutline.nameLength, "A".length);
-          expect(constructorOutline.parameters, "()");
-          expect(constructorOutline.returnType, isNull);
+          Outline constructorOutline = outlines_A[0];
+          Element constructorElement = constructorOutline.element;
+          expect(constructorElement.kind, ElementKind.CONSTRUCTOR);
+          expect(constructorElement.name, "A");
+          expect(constructorElement.offset, testCode.indexOf("A() {"));
+          expect(constructorElement.length, "A".length);
+          expect(constructorElement.parameters, "()");
+          expect(constructorElement.returnType, isNull);
           // local function
-          List<_Outline> outlines_constructor = constructorOutline.children;
+          List<Outline> outlines_constructor = constructorOutline.children;
           expect(outlines_constructor, hasLength(1));
           {
-            _Outline outline = outlines_constructor[0];
-            expect(outline.kind, _OutlineKind.FUNCTION);
-            expect(outline.name, "local_A");
-            expect(outline.nameOffset, testCode.indexOf("local_A() {}"));
-            expect(outline.nameLength, "local_A".length);
-            expect(outline.parameters, "()");
-            expect(outline.returnType, "int");
+            Outline outline = outlines_constructor[0];
+            Element element = outline.element;
+            expect(element.kind, ElementKind.FUNCTION);
+            expect(element.name, "local_A");
+            expect(element.offset, testCode.indexOf("local_A() {}"));
+            expect(element.length, "local_A".length);
+            expect(element.parameters, "()");
+            expect(element.returnType, "int");
           }
         }
         {
-          _Outline outline_m = outlines_A[1];
-          expect(outline_m.kind, _OutlineKind.METHOD);
-          expect(outline_m.name, "m");
-          expect(outline_m.nameOffset, testCode.indexOf("m() {"));
-          expect(outline_m.nameLength, "m".length);
-          expect(outline_m.parameters, "()");
-          expect(outline_m.returnType, "");
+          Outline outline_m = outlines_A[1];
+          Element element_m = outline_m.element;
+          expect(element_m.kind, ElementKind.METHOD);
+          expect(element_m.name, "m");
+          expect(element_m.offset, testCode.indexOf("m() {"));
+          expect(element_m.length, "m".length);
+          expect(element_m.parameters, "()");
+          expect(element_m.returnType, "");
           // local function
-          List<_Outline> methodChildren = outline_m.children;
+          List<Outline> methodChildren = outline_m.children;
           expect(methodChildren, hasLength(1));
           {
-            _Outline outline = methodChildren[0];
-            expect(outline.kind, _OutlineKind.FUNCTION);
-            expect(outline.name, "local_m");
-            expect(outline.nameOffset, testCode.indexOf("local_m() {}"));
-            expect(outline.nameLength, "local_m".length);
-            expect(outline.parameters, "()");
-            expect(outline.returnType, "");
+            Outline outline = methodChildren[0];
+            Element element = outline.element;
+            expect(element.kind, ElementKind.FUNCTION);
+            expect(element.name, "local_m");
+            expect(element.offset, testCode.indexOf("local_m() {}"));
+            expect(element.length, "local_m".length);
+            expect(element.parameters, "()");
+            expect(element.returnType, "");
           }
         }
       }
       // f()
       {
-        _Outline outline_f = topOutlines[1];
-        expect(outline_f.kind, _OutlineKind.FUNCTION);
-        expect(outline_f.name, "f");
-        expect(outline_f.nameOffset, testCode.indexOf("f() {"));
-        expect(outline_f.nameLength, "f".length);
-        expect(outline_f.parameters, "()");
-        expect(outline_f.returnType, "");
+        Outline outline_f = topOutlines[1];
+        Element element_f = outline_f.element;
+        expect(element_f.kind, ElementKind.FUNCTION);
+        expect(element_f.name, "f");
+        expect(element_f.offset, testCode.indexOf("f() {"));
+        expect(element_f.length, "f".length);
+        expect(element_f.parameters, "()");
+        expect(element_f.returnType, "");
         // f() children
-        List<_Outline> outlines_f = outline_f.children;
+        List<Outline> outlines_f = outline_f.children;
         expect(outlines_f, hasLength(2));
         {
-          _Outline outline_f1 = outlines_f[0];
-          expect(outline_f1.kind, _OutlineKind.FUNCTION);
-          expect(outline_f1.name, "local_f1");
-          expect(outline_f1.nameOffset, testCode.indexOf("local_f1(int i) {}"));
-          expect(outline_f1.nameLength, "local_f1".length);
-          expect(outline_f1.parameters, "(int i)");
-          expect(outline_f1.returnType, "");
+          Outline outline_f1 = outlines_f[0];
+          Element element_f1 = outline_f1.element;
+          expect(element_f1.kind, ElementKind.FUNCTION);
+          expect(element_f1.name, "local_f1");
+          expect(element_f1.offset, testCode.indexOf("local_f1(int i) {}"));
+          expect(element_f1.length, "local_f1".length);
+          expect(element_f1.parameters, "(int i)");
+          expect(element_f1.returnType, "");
         }
         {
-          _Outline outline_f2 = outlines_f[1];
-          expect(outline_f2.kind, _OutlineKind.FUNCTION);
-          expect(outline_f2.name, "local_f2");
-          expect(outline_f2.nameOffset, testCode.indexOf("local_f2(String s) {"));
-          expect(outline_f2.nameLength, "local_f2".length);
-          expect(outline_f2.parameters, "(String s)");
-          expect(outline_f2.returnType, "");
+          Outline outline_f2 = outlines_f[1];
+          Element element_f2 = outline_f2.element;
+          expect(element_f2.kind, ElementKind.FUNCTION);
+          expect(element_f2.name, "local_f2");
+          expect(element_f2.offset, testCode.indexOf("local_f2(String s) {"));
+          expect(element_f2.length, "local_f2".length);
+          expect(element_f2.parameters, "(String s)");
+          expect(element_f2.returnType, "");
           // local_f2() local function
-          List<_Outline> outlines_f2 = outline_f2.children;
+          List<Outline> outlines_f2 = outline_f2.children;
           expect(outlines_f2, hasLength(1));
           {
-            _Outline outline_f21 = outlines_f2[0];
-            expect(outline_f21.kind, _OutlineKind.FUNCTION);
-            expect(outline_f21.name, "local_f21");
-            expect(outline_f21.nameOffset, testCode.indexOf("local_f21(int p) {"));
-            expect(outline_f21.nameLength, "local_f21".length);
-            expect(outline_f21.parameters, "(int p)");
-            expect(outline_f21.returnType, "");
+            Outline outline_f21 = outlines_f2[0];
+            Element element_f21 = outline_f21.element;
+            expect(element_f21.kind, ElementKind.FUNCTION);
+            expect(element_f21.name, "local_f21");
+            expect(element_f21.offset, testCode.indexOf("local_f21(int p) {"));
+            expect(element_f21.length, "local_f21".length);
+            expect(element_f21.parameters, "(int p)");
+            expect(element_f21.returnType, "");
           }
         }
       }
     });
   }
 
+  test_sourceRange_inClass() {
+    addTestFile('''
+class A { // leftA
+  int methodA() {} // endA
+  int methodB() {} // endB
+}
+''');
+    return prepareOutline(() {
+      Outline unitOutline = outline;
+      List<Outline> outlines = unitOutline.children[0].children;
+      expect(outlines, hasLength(2));
+      // methodA
+      {
+        Outline outline = outlines[0];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.METHOD);
+        expect(element.name, "methodA");
+        {
+          int offset = testCode.indexOf(" // leftA");
+          int end = testCode.indexOf(" // endA");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // methodB
+      {
+        Outline outline = outlines[1];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.METHOD);
+        expect(element.name, "methodB");
+        {
+          int offset = testCode.indexOf(" // endA");
+          int end = testCode.indexOf(" // endB");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+    });
+  }
+
+  test_sourceRange_inClass_inVariableList() {
+    addTestFile('''
+class A { // leftA
+  int fieldA, fieldB, fieldC; // marker
+  int fieldD; // marker2
+}
+''');
+    return prepareOutline(() {
+      Outline unitOutline = outline;
+      List<Outline> outlines = unitOutline.children[0].children;
+      expect(outlines, hasLength(4));
+      // fieldA
+      {
+        Outline outline = outlines[0];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FIELD);
+        expect(element.name, "fieldA");
+        {
+          int offset = testCode.indexOf(" // leftA");
+          int end = testCode.indexOf(", fieldB");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // fieldB
+      {
+        Outline outline = outlines[1];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FIELD);
+        expect(element.name, "fieldB");
+        {
+          int offset = testCode.indexOf(", fieldB");
+          int end = testCode.indexOf(", fieldC");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // fieldC
+      {
+        Outline outline = outlines[2];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FIELD);
+        expect(element.name, "fieldC");
+        {
+          int offset = testCode.indexOf(", fieldC");
+          int end = testCode.indexOf(" // marker");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // fieldD
+      {
+        Outline outline = outlines[3];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FIELD);
+        expect(element.name, "fieldD");
+        {
+          int offset = testCode.indexOf(" // marker");
+          int end = testCode.indexOf(" // marker2");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+    });
+  }
+
+  test_sourceRange_inUnit() {
+    addTestFile('''
+class A {
+} // endA
+class B {
+} // endB
+''');
+    return prepareOutline(() {
+      Outline unitOutline = outline;
+      List<Outline> topOutlines = unitOutline.children;
+      expect(topOutlines, hasLength(2));
+      // A
+      {
+        Outline outline = topOutlines[0];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.CLASS);
+        expect(element.name, "A");
+        {
+          int offset = 0;
+          int end = testCode.indexOf(" // endA");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // B
+      {
+        Outline outline = topOutlines[1];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.CLASS);
+        expect(element.name, "B");
+        {
+          int offset = testCode.indexOf(" // endA");
+          int end = testCode.indexOf(" // endB");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+    });
+  }
+
+  test_sourceRange_inUnit_inVariableList() {
+    addTestFile('''
+int fieldA, fieldB, fieldC; // marker
+int fieldD; // marker2
+''');
+    return prepareOutline(() {
+      Outline unitOutline = outline;
+      List<Outline> outlines = unitOutline.children;
+      expect(outlines, hasLength(4));
+      // fieldA
+      {
+        Outline outline = outlines[0];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.TOP_LEVEL_VARIABLE);
+        expect(element.name, "fieldA");
+        {
+          int offset = 0;
+          int end = testCode.indexOf(", fieldB");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // fieldB
+      {
+        Outline outline = outlines[1];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.TOP_LEVEL_VARIABLE);
+        expect(element.name, "fieldB");
+        {
+          int offset = testCode.indexOf(", fieldB");
+          int end = testCode.indexOf(", fieldC");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // fieldC
+      {
+        Outline outline = outlines[2];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.TOP_LEVEL_VARIABLE);
+        expect(element.name, "fieldC");
+        {
+          int offset = testCode.indexOf(", fieldC");
+          int end = testCode.indexOf(" // marker");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // fieldD
+      {
+        Outline outline = outlines[3];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.TOP_LEVEL_VARIABLE);
+        expect(element.name, "fieldD");
+        {
+          int offset = testCode.indexOf(" // marker");
+          int end = testCode.indexOf(" // marker2");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+    });
+  }
+
   test_topLevel() {
     addTestFile('''
 typedef String FTA(int i, String s);
@@ -530,152 +588,86 @@
 set propB(int v) {}
 ''');
     return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> topOutlines = unitOutline.children;
+      Outline unitOutline = outline;
+      List<Outline> topOutlines = unitOutline.children;
       expect(topOutlines, hasLength(9));
       // FTA
       {
-        _Outline outline = topOutlines[0];
-        expect(outline.kind, _OutlineKind.FUNCTION_TYPE_ALIAS);
-        expect(outline.name, "FTA");
-        expect(outline.nameOffset, testCode.indexOf("FTA("));
-        expect(outline.nameLength, "FTA".length);
-        expect(outline.parameters, "(int i, String s)");
-        expect(outline.returnType, "String");
+        Outline outline = topOutlines[0];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
+        expect(element.name, "FTA");
+        expect(element.offset, testCode.indexOf("FTA("));
+        expect(element.length, "FTA".length);
+        expect(element.parameters, "(int i, String s)");
+        expect(element.returnType, "String");
       }
       // FTB
       {
-        _Outline outline = topOutlines[1];
-        expect(outline.kind, _OutlineKind.FUNCTION_TYPE_ALIAS);
-        expect(outline.name, "FTB");
-        expect(outline.nameOffset, testCode.indexOf("FTB("));
-        expect(outline.nameLength, "FTB".length);
-        expect(outline.parameters, "(int p)");
-        expect(outline.returnType, "");
+        Outline outline = topOutlines[1];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
+        expect(element.name, "FTB");
+        expect(element.offset, testCode.indexOf("FTB("));
+        expect(element.length, "FTB".length);
+        expect(element.parameters, "(int p)");
+        expect(element.returnType, "");
       }
       // CTA
       {
-        _Outline outline = topOutlines[4];
-        expect(outline.kind, _OutlineKind.CLASS_TYPE_ALIAS);
-        expect(outline.name, "CTA");
-        expect(outline.nameOffset, testCode.indexOf("CTA ="));
-        expect(outline.nameLength, "CTA".length);
-        expect(outline.parameters, isNull);
-        expect(outline.returnType, isNull);
+        Outline outline = topOutlines[4];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.CLASS_TYPE_ALIAS);
+        expect(element.name, "CTA");
+        expect(element.offset, testCode.indexOf("CTA ="));
+        expect(element.length, "CTA".length);
+        expect(element.parameters, isNull);
+        expect(element.returnType, isNull);
       }
       // fA
       {
-        _Outline outline = topOutlines[5];
-        expect(outline.kind, _OutlineKind.FUNCTION);
-        expect(outline.name, "fA");
-        expect(outline.nameOffset, testCode.indexOf("fA("));
-        expect(outline.nameLength, "fA".length);
-        expect(outline.parameters, "(int i, String s)");
-        expect(outline.returnType, "String");
+        Outline outline = topOutlines[5];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FUNCTION);
+        expect(element.name, "fA");
+        expect(element.offset, testCode.indexOf("fA("));
+        expect(element.length, "fA".length);
+        expect(element.parameters, "(int i, String s)");
+        expect(element.returnType, "String");
       }
       // fB
       {
-        _Outline outline = topOutlines[6];
-        expect(outline.kind, _OutlineKind.FUNCTION);
-        expect(outline.name, "fB");
-        expect(outline.nameOffset, testCode.indexOf("fB("));
-        expect(outline.nameLength, "fB".length);
-        expect(outline.parameters, "(int p)");
-        expect(outline.returnType, "");
+        Outline outline = topOutlines[6];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FUNCTION);
+        expect(element.name, "fB");
+        expect(element.offset, testCode.indexOf("fB("));
+        expect(element.length, "fB".length);
+        expect(element.parameters, "(int p)");
+        expect(element.returnType, "");
       }
       // propA
       {
-        _Outline outline = topOutlines[7];
-        expect(outline.kind, _OutlineKind.GETTER);
-        expect(outline.name, "propA");
-        expect(outline.nameOffset, testCode.indexOf("propA => null;"));
-        expect(outline.nameLength, "propA".length);
-        expect(outline.parameters, "");
-        expect(outline.returnType, "String");
+        Outline outline = topOutlines[7];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.GETTER);
+        expect(element.name, "propA");
+        expect(element.offset, testCode.indexOf("propA => null;"));
+        expect(element.length, "propA".length);
+        expect(element.parameters, "");
+        expect(element.returnType, "String");
       }
       // propB
       {
-        _Outline outline = topOutlines[8];
-        expect(outline.kind, _OutlineKind.SETTER);
-        expect(outline.name, "propB");
-        expect(outline.nameOffset, testCode.indexOf("propB(int v) {}"));
-        expect(outline.nameLength, "propB".length);
-        expect(outline.parameters, "(int v)");
-        expect(outline.returnType, "");
+        Outline outline = topOutlines[8];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.SETTER);
+        expect(element.name, "propB");
+        expect(element.offset, testCode.indexOf("propB(int v) {}"));
+        expect(element.length, "propB".length);
+        expect(element.parameters, "(int v)");
+        expect(element.returnType, "");
       }
     });
   }
 }
-
-
-/**
- * Element outline kinds.
- */
-class _OutlineKind {
-  static const _OutlineKind CLASS = const _OutlineKind('CLASS');
-  static const _OutlineKind CLASS_TYPE_ALIAS = const _OutlineKind('CLASS_TYPE_ALIAS');
-  static const _OutlineKind COMPILATION_UNIT = const _OutlineKind('COMPILATION_UNIT');
-  static const _OutlineKind CONSTRUCTOR = const _OutlineKind('CONSTRUCTOR');
-  static const _OutlineKind GETTER = const _OutlineKind('GETTER');
-  static const _OutlineKind FIELD = const _OutlineKind('FIELD');
-  static const _OutlineKind FUNCTION = const _OutlineKind('FUNCTION');
-  static const _OutlineKind FUNCTION_TYPE_ALIAS = const _OutlineKind('FUNCTION_TYPE_ALIAS');
-  static const _OutlineKind LIBRARY = const _OutlineKind('LIBRARY');
-  static const _OutlineKind METHOD = const _OutlineKind('METHOD');
-  static const _OutlineKind SETTER = const _OutlineKind('SETTER');
-  static const _OutlineKind TOP_LEVEL_VARIABLE = const _OutlineKind('TOP_LEVEL_VARIABLE');
-  static const _OutlineKind UNKNOWN = const _OutlineKind('UNKNOWN');
-  static const _OutlineKind UNIT_TEST_CASE = const _OutlineKind('UNIT_TEST_CASE');
-  static const _OutlineKind UNIT_TEST_GROUP = const _OutlineKind('UNIT_TEST_GROUP');
-
-  final String name;
-
-  const _OutlineKind(this.name);
-
-  static _OutlineKind valueOf(String name) {
-    ClassMirror classMirror = reflectClass(_OutlineKind);
-    return classMirror.getField(new Symbol(name)).reflectee;
-  }
-}
-
-
-/**
- * An element outline.
- */
-class _Outline {
-  static const List<_Outline> EMPTY_ARRAY = const <_Outline>[];
-
-  final _OutlineKind kind;
-  final String name;
-  final int nameOffset;
-  final int nameLength;
-  final int elementOffset;
-  final int elementLength;
-  final bool isAbstract;
-  final bool isStatic;
-  final String parameters;
-  final String returnType;
-  final List<_Outline> children = <_Outline>[];
-
-  _Outline(this.kind, this.name,
-           this.nameOffset, this.nameLength,
-           this.elementOffset, this.elementLength,
-           this.isAbstract, this.isStatic,
-           this.parameters, this.returnType);
-
-  factory _Outline.fromJson(Map<String, Object> map) {
-    _Outline outline = new _Outline(
-        _OutlineKind.valueOf(map[KIND]), map[NAME],
-        map[NAME_OFFSET], map[NAME_LENGTH],
-        map[ELEMENT_OFFSET], map[ELEMENT_LENGTH],
-        map[IS_ABSTRACT], map[IS_STATIC],
-        map[PARAMETERS], map[RETURN_TYPE]);
-    List<Map<String, Object>> childrenMaps = map[CHILDREN];
-    if (childrenMaps != null) {
-      childrenMaps.forEach((childMap) {
-        outline.children.add(new _Outline.fromJson(childMap));
-      });
-    }
-    return outline;
-  }
-}
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index b3c11f6..3fb4e27 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -5,7 +5,6 @@
 library test.analysis_server;
 
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analysis_server/src/analysis_server.dart';
@@ -26,6 +25,7 @@
   AnalysisServerTestHelper({bool rethrowExceptions: true}) {
     channel = new MockServerChannel();
     server = new AnalysisServer(channel, PhysicalResourceProvider.INSTANCE,
+        new MockPackageMapProvider(), null,
         rethrowExceptions: rethrowExceptions);
   }
 }
@@ -71,7 +71,7 @@
     test('shutdown', () {
       AnalysisServerTestHelper helper = new AnalysisServerTestHelper();
       helper.server.handlers = [new ServerDomainHandler(helper.server)];
-      var request = new Request('my28', METHOD_SHUTDOWN);
+      var request = new Request('my28', SERVER_SHUTDOWN);
       return helper.channel.sendRequest(request)
           .then((Response response) {
             expect(response.id, equals('my28'));
diff --git a/pkg/analysis_server/test/computer/element_test.dart b/pkg/analysis_server/test/computer/element_test.dart
new file mode 100644
index 0000000..ba83c65
--- /dev/null
+++ b/pkg/analysis_server/test/computer/element_test.dart
@@ -0,0 +1,263 @@
+// 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.computer.element;
+
+import 'package:analysis_server/src/computer/element.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analyzer/src/generated/element.dart' as engine;
+import 'package:analyzer/src/generated/utilities_dart.dart' as engine;
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../index/store/typed_mocks.dart';
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('Element', () {
+    runReflectiveTests(_ElementTest);
+  });
+  group('ElementKind', () {
+    test('toString', test_ElementKind_toString);
+    test('valueOf', test_ElementKind_valueOf);
+    test('valueOfEngine', test_ElementKind_valueOfEngine);
+  });
+}
+
+
+void test_ElementKind_toString() {
+  expect(ElementKind.CLASS.toString(), 'CLASS');
+  expect(ElementKind.COMPILATION_UNIT.toString(), 'COMPILATION_UNIT');
+}
+
+
+void test_ElementKind_valueOf() {
+  expect(ElementKind.valueOf(ElementKind.CLASS.name), ElementKind.CLASS);
+  expect(ElementKind.valueOf(ElementKind.CLASS_TYPE_ALIAS.name),
+      ElementKind.CLASS_TYPE_ALIAS);
+  expect(ElementKind.valueOf(ElementKind.COMPILATION_UNIT.name),
+      ElementKind.COMPILATION_UNIT);
+  expect(ElementKind.valueOf(ElementKind.CONSTRUCTOR.name),
+      ElementKind.CONSTRUCTOR);
+  expect(ElementKind.valueOf(ElementKind.FIELD.name), ElementKind.FIELD);
+  expect(ElementKind.valueOf(ElementKind.FUNCTION.name), ElementKind.FUNCTION);
+  expect(ElementKind.valueOf(ElementKind.FUNCTION_TYPE_ALIAS.name),
+      ElementKind.FUNCTION_TYPE_ALIAS);
+  expect(ElementKind.valueOf(ElementKind.GETTER.name), ElementKind.GETTER);
+  expect(ElementKind.valueOf(ElementKind.LIBRARY.name), ElementKind.LIBRARY);
+  expect(ElementKind.valueOf(ElementKind.METHOD.name), ElementKind.METHOD);
+  expect(ElementKind.valueOf(ElementKind.SETTER.name), ElementKind.SETTER);
+  expect(ElementKind.valueOf(ElementKind.TOP_LEVEL_VARIABLE.name),
+      ElementKind.TOP_LEVEL_VARIABLE);
+  expect(ElementKind.valueOf(ElementKind.UNIT_TEST_CASE.name),
+      ElementKind.UNIT_TEST_CASE);
+  expect(ElementKind.valueOf(ElementKind.UNIT_TEST_GROUP.name),
+      ElementKind.UNIT_TEST_GROUP);
+  expect(ElementKind.valueOf(ElementKind.UNKNOWN.name), ElementKind.UNKNOWN);
+  expect(() {
+    ElementKind.valueOf('no-such-kind');
+  }, throws);
+}
+
+
+void test_ElementKind_valueOfEngine() {
+  expect(ElementKind.valueOfEngine(engine.ElementKind.CLASS),
+      ElementKind.CLASS);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.COMPILATION_UNIT),
+      ElementKind.COMPILATION_UNIT);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.CONSTRUCTOR),
+      ElementKind.CONSTRUCTOR);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.FIELD),
+      ElementKind.FIELD);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.FUNCTION),
+      ElementKind.FUNCTION);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.FUNCTION_TYPE_ALIAS),
+      ElementKind.FUNCTION_TYPE_ALIAS);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.GETTER),
+      ElementKind.GETTER);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.LIBRARY),
+      ElementKind.LIBRARY);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.METHOD),
+      ElementKind.METHOD);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.SETTER),
+      ElementKind.SETTER);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.TOP_LEVEL_VARIABLE),
+      ElementKind.TOP_LEVEL_VARIABLE);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.ANGULAR_COMPONENT),
+      ElementKind.UNKNOWN);
+}
+
+
+@ReflectiveTestCase()
+class _ElementTest {
+  void test_fromElement_CLASS() {
+    engine.ClassElement engineElement = new MockClassElement();
+    when(engineElement.kind).thenReturn(engine.ElementKind.CLASS);
+    when(engineElement.nameOffset).thenReturn(1);
+    when(engineElement.displayName).thenReturn('MyClass');
+    when(engineElement.isAbstract).thenReturn(true);
+    when(engineElement.isDeprecated).thenReturn(true);
+    when(engineElement.isPrivate).thenReturn(true);
+    // create notification Element
+    Element element = new Element.fromEngine(engineElement);
+    expect(element.kind, ElementKind.CLASS);
+    expect(element.name, 'MyClass');
+    expect(element.offset, 1);
+    expect(element.length, 'MyClass'.length);
+    expect(element.flags, Element.FLAG_ABSTRACT | Element.FLAG_DEPRECATED |
+        Element.FLAG_PRIVATE);
+  }
+
+  void test_fromElement_CONSTRUCTOR() {
+    engine.ConstructorElement engineElement = new MockConstructorElement();
+    when(engineElement.kind).thenReturn(engine.ElementKind.CONSTRUCTOR);
+    when(engineElement.nameOffset).thenReturn(1);
+    when(engineElement.displayName).thenReturn('myConstructor');
+    when(engineElement.isConst).thenReturn(true);
+    when(engineElement.isDeprecated).thenReturn(false);
+    when(engineElement.isPrivate).thenReturn(false);
+    when(engineElement.isStatic).thenReturn(false);
+    when(engineElement.parameters).thenReturn([]);
+    {
+      engine.ParameterElement a = new MockParameterElement('int a');
+      engine.ParameterElement b = new MockParameterElement('String b');
+      when(b.kind).thenReturn(engine.ParameterKind.POSITIONAL);
+      when(engineElement.parameters).thenReturn([a, b]);
+    }
+    {
+      engine.DartType returnType = new MockDartType('Map<int, String>');
+      when(engineElement.returnType).thenReturn(returnType);
+    }
+    // create notification Element
+    Element element = new Element.fromEngine(engineElement);
+    expect(element.kind, ElementKind.CONSTRUCTOR);
+    expect(element.name, 'myConstructor');
+    expect(element.offset, 1);
+    expect(element.length, 'myConstructor'.length);
+    expect(element.parameters, '(int a, [String b])');
+    expect(element.returnType, 'Map<int, String>');
+    expect(element.flags, Element.FLAG_CONST);
+  }
+
+  void test_fromElement_FIELD() {
+    engine.FieldElement engineElement = new MockFieldElement();
+    when(engineElement.kind).thenReturn(engine.ElementKind.FIELD);
+    when(engineElement.nameOffset).thenReturn(1);
+    when(engineElement.displayName).thenReturn('myField');
+    when(engineElement.isConst).thenReturn(true);
+    when(engineElement.isFinal).thenReturn(true);
+    when(engineElement.isDeprecated).thenReturn(false);
+    when(engineElement.isPrivate).thenReturn(false);
+    when(engineElement.isStatic).thenReturn(true);
+    // create notification Element
+    Element element = new Element.fromEngine(engineElement);
+    expect(element.kind, ElementKind.FIELD);
+    expect(element.name, 'myField');
+    expect(element.offset, 1);
+    expect(element.length, 'myField'.length);
+    expect(element.parameters, isNull);
+    expect(element.returnType, isNull);
+    expect(element.flags, Element.FLAG_CONST | Element.FLAG_FINAL |
+        Element.FLAG_STATIC);
+  }
+
+  void test_fromElement_GETTER() {
+    engine.PropertyAccessorElement engineElement =
+        new MockPropertyAccessorElement();
+    when(engineElement.kind).thenReturn(engine.ElementKind.GETTER);
+    when(engineElement.nameOffset).thenReturn(1);
+    when(engineElement.displayName).thenReturn('myGetter');
+    when(engineElement.isAbstract).thenReturn(false);
+    when(engineElement.isDeprecated).thenReturn(true);
+    when(engineElement.isPrivate).thenReturn(false);
+    when(engineElement.isStatic).thenReturn(false);
+    when(engineElement.parameters).thenReturn([]);
+    {
+      engine.DartType returnType = new MockDartType('String');
+      when(engineElement.returnType).thenReturn(returnType);
+    }
+    // create notification Element
+    Element element = new Element.fromEngine(engineElement);
+    expect(element.kind, ElementKind.GETTER);
+    expect(element.name, 'myGetter');
+    expect(element.offset, 1);
+    expect(element.length, 'myGetter'.length);
+    expect(element.parameters, '()');
+    expect(element.returnType, 'String');
+    expect(element.flags, Element.FLAG_DEPRECATED);
+  }
+
+  void test_fromElement_METHOD() {
+    engine.MethodElement engineElement = new MockMethodElement();
+    when(engineElement.kind).thenReturn(engine.ElementKind.METHOD);
+    when(engineElement.nameOffset).thenReturn(1);
+    when(engineElement.displayName).thenReturn('myMethod');
+    when(engineElement.isAbstract).thenReturn(false);
+    when(engineElement.isDeprecated).thenReturn(false);
+    when(engineElement.isPrivate).thenReturn(false);
+    when(engineElement.isStatic).thenReturn(true);
+    {
+      engine.ParameterElement a = new MockParameterElement('int a');
+      engine.ParameterElement b = new MockParameterElement('String b');
+      when(b.kind).thenReturn(engine.ParameterKind.NAMED);
+      when(engineElement.parameters).thenReturn([a, b]);
+    }
+    {
+      engine.DartType returnType = new MockDartType('List<String>');
+      when(engineElement.returnType).thenReturn(returnType);
+    }
+    // create notification Element
+    Element element = new Element.fromEngine(engineElement);
+    expect(element.kind, ElementKind.METHOD);
+    expect(element.name, 'myMethod');
+    expect(element.offset, 1);
+    expect(element.length, 'myMethod'.length);
+    expect(element.parameters, '(int a, {String b})');
+    expect(element.returnType, 'List<String>');
+    expect(element.flags, Element.FLAG_STATIC);
+  }
+
+  void test_fromJson() {
+    var flags = Element.FLAG_DEPRECATED | Element.FLAG_PRIVATE |
+        Element.FLAG_STATIC;
+    var json = {
+      KIND: 'METHOD',
+      NAME: 'my name',
+      OFFSET: 1,
+      LENGTH: 2,
+      FLAGS: flags,
+      PARAMETERS: '(int a, String b)',
+      RETURN_TYPE: 'List<String>'
+    };
+    Element element = new Element.fromJson(json);
+    expect(element.kind, ElementKind.METHOD);
+    expect(element.name, 'my name');
+    expect(element.offset, 1);
+    expect(element.length, 2);
+    expect(element.flags, flags);
+    expect(element.isAbstract, isFalse);
+    expect(element.isConst, isFalse);
+    expect(element.isDeprecated, isTrue);
+    expect(element.isFinal, isFalse);
+    expect(element.isPrivate, isTrue);
+    expect(element.isStatic, isTrue);
+  }
+
+  void test_toJson() {
+    var json = {
+      KIND: 'METHOD',
+      NAME: 'my name',
+      OFFSET: 1,
+      LENGTH: 2,
+      FLAGS: Element.FLAG_DEPRECATED | Element.FLAG_PRIVATE |
+          Element.FLAG_STATIC,
+      PARAMETERS: '(int a, String b)',
+      RETURN_TYPE: 'List<String>'
+    };
+    Element element = new Element.fromJson(json);
+    expect(element.toJson(), equals(json));
+  }
+}
diff --git a/pkg/analysis_server/test/computer/test_all.dart b/pkg/analysis_server/test/computer/test_all.dart
new file mode 100644
index 0000000..2badfdf
--- /dev/null
+++ b/pkg/analysis_server/test/computer/test_all.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.
+
+library test.computer.all;
+
+import 'package:unittest/unittest.dart';
+
+import 'element_test.dart' as element_test;
+
+
+/**
+ * Utility for manually running all tests.
+ */
+main() {
+  groupSep = ' | ';
+  group('index', () {
+    element_test.main();
+  });
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/test/context_directory_manager_test.dart b/pkg/analysis_server/test/context_directory_manager_test.dart
index 283dd63..ac149fc 100644
--- a/pkg/analysis_server/test/context_directory_manager_test.dart
+++ b/pkg/analysis_server/test/context_directory_manager_test.dart
@@ -15,29 +15,47 @@
 class TestContextDirectoryManager extends ContextDirectoryManager {
   TestContextDirectoryManager(MemoryResourceProvider provider) : super(provider);
 
+  /**
+   * Source of timestamps stored in [currentContextFilePaths].
+   */
+  int now = 0;
+
   final Set<String> currentContextPaths = new Set<String>();
-  final Map<String, String> currentContextPubspecPaths = <String, String>{};
-  final Map<String, Set<String>> currentContextFilePaths = <String, Set<String>>{};
+
+  /**
+   * Map from context to (map from file path to timestamp of last event)
+   */
+  final Map<String, Map<String, int>> currentContextFilePaths = <String, Map<String, int>>{};
 
   @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>();
+  void addContext(Folder folder) {
+    String path = folder.path;
+    currentContextPaths.add(path);
+    currentContextFilePaths[path] = <String, int>{};
   }
 
   @override
   void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) {
-    Set<String> filePaths = currentContextFilePaths[contextFolder.path];
+    Map<String, int> filePaths = currentContextFilePaths[contextFolder.path];
     for (Source source in changeSet.addedSources) {
       expect(filePaths, isNot(contains(source.fullName)));
-      filePaths.add(source.fullName);
+      filePaths[source.fullName] = now;
     }
     for (Source source in changeSet.removedSources) {
       expect(filePaths, contains(source.fullName));
       filePaths.remove(source.fullName);
     }
-    // TODO(paulberry): handle source.changedSources.
+    for (Source source in changeSet.changedSources) {
+      expect(filePaths, contains(source.fullName));
+      filePaths[source.fullName] = now;
+    }
+  }
+
+  @override
+  void removeContext(Folder folder) {
+    String path = folder.path;
+    currentContextPaths.remove(path);
+    currentContextFilePaths.remove(path);
   }
 }
 
@@ -61,7 +79,6 @@
       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));
     });
 
@@ -71,7 +88,6 @@
       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));
     });
 
@@ -97,6 +113,26 @@
       expect(filePaths, contains(filePath));
     });
 
+    test('remove 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>[]);
+      manager.setRoots(<String>[], <String>[]);
+      expect(manager.currentContextPaths, hasLength(0));
+      expect(manager.currentContextFilePaths, hasLength(0));
+    });
+
+    test('remove folder without pubspec', () {
+      String projPath = '/my/proj';
+      provider.newFolder(projPath);
+      manager.setRoots(<String>[projPath], <String>[]);
+      manager.setRoots(<String>[], <String>[]);
+      expect(manager.currentContextPaths, hasLength(0));
+      expect(manager.currentContextFilePaths, hasLength(0));
+    });
+
     test('ignore files in packages dir', () {
       String projPath = '/my/proj';
       provider.newFolder(projPath);
@@ -105,7 +141,7 @@
       String filePath1 = posix.join(projPath, 'packages', 'file1.dart');
       provider.newFile(filePath1, 'contents');
       manager.setRoots(<String>[projPath], <String>[]);
-      Set<String> filePaths = manager.currentContextFilePaths[projPath];
+      Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
       expect(filePaths, hasLength(0));
       String filePath2 = posix.join(projPath, 'packages', 'file2.dart');
       provider.newFile(filePath2, 'contents');
@@ -124,7 +160,7 @@
 
       test('Add file', () {
         manager.setRoots(<String>[projPath], <String>[]);
-        Set<String> filePaths = manager.currentContextFilePaths[projPath];
+        Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
         expect(filePaths, hasLength(0));
         String filePath = posix.join(projPath, 'foo.dart');
         provider.newFile(filePath, 'contents');
@@ -136,7 +172,7 @@
 
       test('Add file in subdirectory', () {
         manager.setRoots(<String>[projPath], <String>[]);
-        Set<String> filePaths = manager.currentContextFilePaths[projPath];
+        Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
         expect(filePaths, hasLength(0));
         String filePath = posix.join(projPath, 'foo', 'bar.dart');
         provider.newFile(filePath, 'contents');
@@ -150,12 +186,26 @@
         String filePath = posix.join(projPath, 'foo.dart');
         provider.newFile(filePath, 'contents');
         manager.setRoots(<String>[projPath], <String>[]);
-        Set<String> filePaths = manager.currentContextFilePaths[projPath];
+        Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
         expect(filePaths, hasLength(1));
         expect(filePaths, contains(filePath));
         provider.deleteFile(filePath);
         return pumpEventQueue().then((_) => expect(filePaths, hasLength(0)));
       });
+
+      test('Modify file', () {
+        String filePath = posix.join(projPath, 'foo.dart');
+        provider.newFile(filePath, 'contents');
+        manager.setRoots(<String>[projPath], <String>[]);
+        Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
+        expect(filePaths, hasLength(1));
+        expect(filePaths, contains(filePath));
+        expect(filePaths[filePath], equals(manager.now));
+        manager.now++;
+        provider.modifyFile(filePath, 'new contents');
+        return pumpEventQueue().then((_) => expect(filePaths[filePath], equals(
+            manager.now)));
+      });
     });
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/analysis_server/test/declarative_tests.dart b/pkg/analysis_server/test/declarative_tests.dart
deleted file mode 100644
index dadc680..0000000
--- a/pkg/analysis_server/test/declarative_tests.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-library declarative_tests;
-
-import 'dart:mirrors';
-
-import 'package:unittest/unittest.dart' show group, test;
-
-/**
- * Use [runTest] annotation to indicate that method is a test method.
- * Alternatively method name can have the `test` prefix.
- */
-const runTest = const _RunTest();
-
-class _RunTest {
-  const _RunTest();
-}
-
-/**
- * Creates a new named group of tests with the name of the given [Type], then
- * adds new tests using [addTestMethods].
- */
-addTestSuite(Type type) {
-  group(type.toString(), () {
-    addTestMethods(type);
-  });
-}
-
-/**
- * Creates a new test case for the each static method with the name starting
- * with `test` or having the [runTest] annotation.
- */
-addTestMethods(Type type) {
-  var typeMirror = reflectClass(type);
-  typeMirror.staticMembers.forEach((methodSymbol, method) {
-    if (_isTestMethod(method)) {
-      var methodName = MirrorSystem.getName(methodSymbol);
-      test(methodName, () {
-        typeMirror.invoke(methodSymbol, []);
-      });
-    }
-  });
-}
-
-bool _isTestMethod(MethodMirror method) {
-  if (method.parameters.isNotEmpty) {
-    return false;
-  }
-  var methodSymbol = method.simpleName;
-  // name starts with "test"
-  var methodName = MirrorSystem.getName(methodSymbol);
-  if (methodName.startsWith('test')) {
-    return true;
-  }
-  // has @testMethod
-  return method.metadata.any((annotation) {
-    return identical(annotation.reflectee, runTest);
-  });
-}
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 4e1fa97..caae294 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -8,59 +8,46 @@
 
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
-import 'package:analysis_server/src/computers.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/engine.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
+import 'analysis_abstract.dart';
+import 'reflective_tests.dart';
 
 
 main() {
   groupSep = ' | ';
 
+  runReflectiveTests(AnalysisDomainTest);
+
   MockServerChannel serverChannel;
+  MemoryResourceProvider resourceProvider;
   AnalysisServer server;
   AnalysisDomainHandler handler;
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
 
   setUp(() {
     serverChannel = new MockServerChannel();
-    server = new AnalysisServer(serverChannel, resourceProvider);
+    resourceProvider = new MemoryResourceProvider();
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
+    server.defaultSdk = new MockSdk();
     handler = new AnalysisDomainHandler(server);
   });
 
   group('notification.errors', testNotificationErrors);
-  group('notification.highlights', testNotificationHighlights);
-  group('notification.navigation', testNotificationNavigation);
   group('updateContent', testUpdateContent);
   group('setSubscriptions', test_setSubscriptions);
 
   group('AnalysisDomainHandler', () {
-    test('getFixes', () {
-      var request = new Request('0', METHOD_GET_FIXES);
-      request.setParameter(ERRORS, []);
-      var response = handler.handleRequest(request);
-      // TODO(scheglov) implement
-      expect(response, isNull);
-    });
-
-    test('getMinorRefactorings', () {
-      var request = new Request('0', METHOD_GET_MINOR_REFACTORINGS);
-      request.setParameter(FILE, 'test.dart');
-      request.setParameter(OFFSET, 10);
-      request.setParameter(LENGTH, 20);
-      var response = handler.handleRequest(request);
-      // TODO(scheglov) implement
-      expect(response, isNull);
-    });
-
     group('setAnalysisRoots', () {
       Request request;
 
       setUp(() {
-        request = new Request('0', METHOD_SET_ANALYSIS_ROOTS);
+        request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
         request.setParameter(INCLUDED, []);
         request.setParameter(EXCLUDED, []);
       });
@@ -92,32 +79,72 @@
       });
     });
 
-    test('setPriorityFiles', () {
-      var request = new Request('0', METHOD_SET_PRIORITY_FILES);
-      request.setParameter(
-          FILES,
-          ['projectA/aa.dart', 'projectB/ba.dart']);
-      var response = handler.handleRequest(request);
-      // TODO(scheglov) implement
-      expect(response, isNull);
+    group('setPriorityFiles', () {
+      test('invalid', () {
+        var request = new Request('0', ANALYSIS_SET_PRIORITY_FILES);
+        request.setParameter(FILES, ['/project/lib.dart']);
+        var response = handler.handleRequest(request);
+        expect(response, isResponseFailure('0'));
+      });
+
+      test('valid', () {
+        resourceProvider.newFolder('/p1');
+        resourceProvider.newFile('/p1/a.dart', 'library a;');
+        resourceProvider.newFolder('/p2');
+        resourceProvider.newFile('/p2/b.dart', 'library b;');
+        resourceProvider.newFile('/p2/c.dart', 'library c;');
+
+        var setRootsRequest = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
+        setRootsRequest.setParameter(INCLUDED, ['/p1', '/p2']);
+        setRootsRequest.setParameter(EXCLUDED, []);
+        var setRootsResponse = handler.handleRequest(setRootsRequest);
+        expect(setRootsResponse, isResponseSuccess('0'));
+
+        void setPriorityFiles(List<String> fileList) {
+          var request = new Request('0', ANALYSIS_SET_PRIORITY_FILES);
+          request.setParameter(FILES, fileList);
+          var response = handler.handleRequest(request);
+          expect(response, isResponseSuccess('0'));
+          // TODO(brianwilkerson) Enable the line below after getPriorityFiles
+          // has been implemented.
+          // expect(server.getPriorityFiles(), unorderedEquals(fileList));
+        }
+
+        setPriorityFiles(['/p1/a.dart', '/p2/b.dart']);
+        setPriorityFiles(['/p2/b.dart', '/p2/c.dart']);
+        setPriorityFiles([]);
+      });
     });
 
-    test('updateOptions', () {
-      var request = new Request('0', METHOD_UPDATE_OPTIONS);
-      request.setParameter(
-          OPTIONS,
-          {
-            'analyzeAngular' : true,
-            'enableDeferredLoading': true,
-            'enableEnums': false
-          });
-      var response = handler.handleRequest(request);
-      // TODO(scheglov) implement
-      expect(response, isNull);
+    group('updateOptions', () {
+      test('invalid', () {
+        var request = new Request('0', ANALYSIS_UPDATE_OPTIONS);
+        request.setParameter(OPTIONS, {'not-an-option' : true});
+        var response = handler.handleRequest(request);
+        expect(response, isResponseFailure('0'));
+      });
+
+      test('valid', () {
+        AnalysisOptions options = server.contextDirectoryManager.defaultOptions;
+        bool analyzeAngular = !options.analyzeAngular;
+        bool enableDeferredLoading = options.enableDeferredLoading;
+        var request = new Request('0', ANALYSIS_UPDATE_OPTIONS);
+        request.setParameter(
+            OPTIONS,
+            {
+              'analyzeAngular' : analyzeAngular,
+              'enableDeferredLoading': enableDeferredLoading,
+              'enableEnums': false
+            });
+        var response = handler.handleRequest(request);
+        expect(response, isResponseSuccess('0'));
+        expect(options.analyzeAngular, equals(analyzeAngular));
+        expect(options.enableDeferredLoading, equals(enableDeferredLoading));
+      });
     });
 
     test('updateSdks', () {
-      var request = new Request('0', METHOD_UPDATE_SDKS);
+      var request = new Request('0', ANALYSIS_UPDATE_SDKS);
       request.setParameter(
           ADDED,
           ['/dart/sdk-1.3', '/dart/sdk-1.4']);
@@ -183,21 +210,23 @@
   AnalysisTestHelper() {
     serverChannel = new MockServerChannel();
     resourceProvider = new MemoryResourceProvider();
-    server = new AnalysisServer(serverChannel, resourceProvider);
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
+    server.defaultSdk = new MockSdk();
     handler = new AnalysisDomainHandler(server);
     // listen for notifications
     Stream<Notification> notificationStream = serverChannel.notificationController.stream;
     notificationStream.listen((Notification notification) {
-      if (notification.event == NOTIFICATION_ERRORS) {
+      if (notification.event == ANALYSIS_ERRORS) {
         String file = notification.getParameter(FILE);
         List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS);
         filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList();
       }
-      if (notification.event == NOTIFICATION_HIGHLIGHTS) {
+      if (notification.event == ANALYSIS_HIGHLIGHTS) {
         String file = notification.getParameter(FILE);
         filesHighlights[file] = notification.getParameter(REGIONS);
       }
-      if (notification.event == NOTIFICATION_NAVIGATION) {
+      if (notification.event == ANALYSIS_NAVIGATION) {
         String file = notification.getParameter(FILE);
         filesNavigation[file] = notification.getParameter(REGIONS);
       }
@@ -221,7 +250,7 @@
     }
     files.add(file);
     // set subscriptions
-    Request request = new Request('0', METHOD_SET_ANALYSIS_SUBSCRIPTIONS);
+    Request request = new Request('0', ANALYSIS_SET_SUBSCRIPTIONS);
     request.setParameter(SUBSCRIPTIONS, analysisSubscriptions);
     handleSuccessfulRequest(request);
   }
@@ -309,7 +338,7 @@
    */
   void createEmptyProject() {
     resourceProvider.newFolder('/project');
-    Request request = new Request('0', METHOD_SET_ANALYSIS_ROOTS);
+    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
     request.setParameter(INCLUDED, ['/project']);
     request.setParameter(EXCLUDED, []);
     handleSuccessfulRequest(request);
@@ -323,7 +352,7 @@
     this.testCode = _getCodeString(code);
     resourceProvider.newFolder('/project');
     resourceProvider.newFile(testFile, testCode);
-    Request request = new Request('0', METHOD_SET_ANALYSIS_ROOTS);
+    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
     request.setParameter(INCLUDED, ['/project']);
     request.setParameter(EXCLUDED, []);
     handleSuccessfulRequest(request);
@@ -349,6 +378,17 @@
     server.done();
   }
 
+  /**
+   * Send an `updateContent` request for [testFile].
+   */
+  void sendContentChange(Map contentChange) {
+    Request request = new Request('0', ANALYSIS_UPDATE_CONTENT);
+    request.setParameter('files', {
+      testFile: contentChange
+    });
+    handleSuccessfulRequest(request);
+  }
+
   static String _getCodeString(code) {
     if (code is List<String>) {
       code = code.join('\n');
@@ -394,1146 +434,6 @@
 }
 
 
-class NotificationHighlightHelper extends AnalysisTestHelper {
-  List<Map<String, Object>> regions;
-
-  Future prepareRegions(then()) {
-    addAnalysisSubscriptionHighlights(testFile);
-    return waitForOperationsFinished().then((_) {
-      regions = getTestHighlights();
-      then();
-    });
-  }
-
-  void assertHasRawRegion(HighlightType type, int offset, int length) {
-    for (Map<String, Object> region in regions) {
-      if (region['offset'] == offset && region['length'] == length
-          && region['type'] == type.name) {
-        return;
-      }
-    }
-    fail('Expected to find (offset=$offset; length=$length; type=$type) in\n'
-         '${regions.join('\n')}');
-  }
-
-  void assertNoRawRegion(HighlightType type, int offset, int length) {
-    for (Map<String, Object> region in regions) {
-      if (region['offset'] == offset && region['length'] == length
-          && region['type'] == type.name) {
-        fail('Not expected to find (offset=$offset; length=$length; type=$type) in\n'
-             '${regions.join('\n')}');
-      }
-    }
-  }
-
-  void assertHasRegion(HighlightType type, String search, [int length = -1]) {
-    int offset = testCode.indexOf(search);
-    expect(offset, isNot(-1));
-    length = findRegionLength(search, length);
-    assertHasRawRegion(type, offset, length);
-  }
-
-  void assertNoRegion(HighlightType type, String search, [int length = -1]) {
-    int offset = testCode.indexOf(search);
-    expect(offset, isNot(-1));
-    length = findRegionLength(search, length);
-    assertNoRawRegion(type, offset, length);
-  }
-
-  int findRegionLength(String search, int length) {
-    if (length == -1) {
-      length = 0;
-      while (length < search.length) {
-        int c = search.codeUnitAt(length);
-        if (length == 0 && c == '@'.codeUnitAt(0)) {
-          length++;
-          continue;
-        }
-        if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) ||
-              c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) ||
-              c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) {
-          break;
-        }
-        length++;
-      }
-    }
-    return length;
-  }
-}
-
-
-testNotificationHighlights() {
-  Future testRegions(String code, then(NotificationHighlightHelper helper)) {
-    var helper = new NotificationHighlightHelper();
-    helper.createSingleFileProject(code);
-    return helper.prepareRegions(() {
-      then(helper);
-    });
-  }
-
-  group('ANNOTATION', () {
-    test('no arguments', () {
-      var code = '''
-const AAA = 42;
-@AAA main() {}
-''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.ANNOTATION, '@AAA');
-      });
-    });
-
-    test('has arguments', () {
-      var code = '''
-class AAA {
-  const AAA(a, b, c);
-}
-@AAA(1, 2, 3) main() {}
-''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.ANNOTATION, '@AAA(', '@AAA('.length);
-        helper.assertHasRegion(HighlightType.ANNOTATION, ') main', ')'.length);
-      });
-    });
-  });
-
-  group('BUILT_IN', () {
-    test('abstract', () {
-      var code = '''
-abstract class A {};
-main() {
-  var abstract = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'abstract class');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'abstract = 42');
-      });
-    });
-
-    test('as', () {
-      var code = '''
-import 'dart:math' as math;
-main() {
-  p as int;
-  var as = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'as math');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'as int');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'as = 42');
-      });
-    });
-
-    test('deferred', () {
-      var code = '''
-import 'dart:math' deferred as math;
-main() {
-  var deferred = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'deferred as math');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'deferred = 42');
-      });
-    });
-
-    test('export', () {
-      var code = '''
-export "dart:math";
-main() {
-  var export = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'export "dart:');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'export = 42');
-      });
-    });
-
-    test('external', () {
-      var code = '''
-class A {
-  external A();
-  external aaa();
-}
-external main() {
-  var external = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'external A()');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'external aaa()');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'external main()');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'external = 42');
-      });
-    });
-
-    test('factory', () {
-      var code = '''
-class A {
-  factory A() => null;
-}
-main() {
-  var factory = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'factory A()');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'factory = 42');
-      });
-    });
-
-    test('get', () {
-      var code = '''
-get aaa => 1;
-class A {
-  get bbb => 2;
-}
-main() {
-  var get = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'get aaa =>');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'get bbb =>');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'get = 42');
-      });
-    });
-
-    test('hide', () {
-      var code = '''
-import 'foo.dart' hide Foo;
-main() {
-  var hide = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'hide Foo');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'hide = 42');
-      });
-    });
-
-    test('implements', () {
-      var code = '''
-class A {}
-class B implements A {}
-main() {
-  var implements = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'implements A {}');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'implements = 42');
-      });
-    });
-
-    test('import', () {
-      var code = '''
-import "foo.dart";
-main() {
-  var import = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'import "');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'import = 42');
-      });
-    });
-
-    test('library', () {
-      var code = '''
-library lib;
-main() {
-  var library = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'library lib;');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'library = 42');
-      });
-    });
-
-    test('native', () {
-      var code = '''
-class A native "A_native" {}
-class B {
-  bbb() native "bbb_native";
-}
-main() {
-  var native = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'native "A_');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'native "bbb_');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'native = 42');
-      });
-    });
-
-    test('on', () {
-      var code = '''
-main() {
-  try {
-  } on int catch (e) {
-  }
-  var on = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'on int');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'on = 42');
-      });
-    });
-
-    test('operator', () {
-      var code = '''
-class A {
-  operator +(x) => null;
-}
-main() {
-  var operator = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'operator +(');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'operator = 42');
-      });
-    });
-
-    test('part', () {
-      var helper = new NotificationHighlightHelper();
-      var code = '''
-part "my_part.dart";
-main() {
-  var part = 42;
-}''';
-      helper.createSingleFileProject(code);
-      helper.setFileContent('/project/bin/my_part.dart', 'part of lib;');
-      return helper.prepareRegions(() {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'part "my_');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'part = 42');
-      });
-    });
-
-    test('part', () {
-      var helper = new NotificationHighlightHelper();
-      var code = '''
-part of lib;
-main() {
-  var part = 1;
-  var of = 2;
-}''';
-      helper.createSingleFileProject(code);
-      helper.setFileContent('/project/bin/lib.dart', '''
-library lib;
-part 'test.dart';
-''');
-      return helper.prepareRegions(() {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'part of', 'part of'.length);
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'part = 1');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'of = 2');
-      });
-    });
-
-    test('set', () {
-      var code = '''
-set aaa(x) {}
-class A
-  set bbb(x) {}
-}
-main() {
-  var set = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'set aaa(');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'set bbb(');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'set = 42');
-      });
-    });
-
-    test('show', () {
-      var code = '''
-import 'foo.dart' show Foo;
-main() {
-  var show = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'show Foo');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'show = 42');
-      });
-    });
-
-    test('static', () {
-      var code = '''
-class A {
-  static aaa;
-  static bbb() {}
-}
-main() {
-  var static = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'static aaa;');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'static bbb()');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'static = 42');
-      });
-    });
-
-    test('typedef', () {
-      var code = '''
-typedef A();
-main() {
-  var typedef = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'typedef A();');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'typedef = 42');
-      });
-    });
-  });
-
-  group('CLASS', () {
-    test('CLASS', () {
-      var code = '''
-class AAA {}
-AAA aaa;
-''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.CLASS, 'AAA {}');
-        helper.assertHasRegion(HighlightType.CLASS, 'AAA aaa');
-      });
-    });
-
-    test('not dynamic', () {
-      var code = '''
-dynamic f() {}
-''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertNoRegion(HighlightType.CLASS, 'dynamic f()');
-      });
-    });
-
-    test('not void', () {
-      var code = '''
-void f() {}
-''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertNoRegion(HighlightType.CLASS, 'void f()');
-      });
-    });
-  });
-
-  test('CONSTRUCTOR', () {
-    var code = '''
-class AAA {
-  AAA() {}
-  AAA.name(p) {}
-}
-main() {
-  new AAA();
-  new AAA.name(42);
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.CONSTRUCTOR, 'name(p)');
-      helper.assertHasRegion(HighlightType.CONSTRUCTOR, 'name(42)');
-      helper.assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA() {}');
-      helper.assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA();');
-    });
-  });
-
-  test('DYNAMIC_TYPE', () {
-    var code = '''
-f() {}
-main(p) {
-  print(p);
-  var v1 = f();
-  int v2;
-  var v3 = v2;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.DYNAMIC_TYPE, 'p)');
-      helper.assertHasRegion(HighlightType.DYNAMIC_TYPE, 'v1 =');
-      helper.assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v2;');
-      helper.assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v3 =');
-    });
-  });
-
-  test('FIELD', () {
-    var code = '''
-class A {
-  int aaa = 1;
-  int bbb = 2;
-  A([this.bbb = 3]);
-}
-main(A a) {
-  a.aaa = 4;
-  a.bbb = 5;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.FIELD, 'aaa = 1');
-      helper.assertHasRegion(HighlightType.FIELD, 'bbb = 2');
-      helper.assertHasRegion(HighlightType.FIELD, 'bbb = 3');
-      helper.assertHasRegion(HighlightType.FIELD, 'aaa = 4');
-      helper.assertHasRegion(HighlightType.FIELD, 'bbb = 5');
-    });
-  });
-
-  test('FIELD_STATIC', () {
-    var code = '''
-class A {
-  static aaa = 1;
-  static get bbb => null;
-  static set ccc(x) {}
-}
-main() {
-  A.aaa = 2;
-  A.bbb;
-  A.ccc = 3;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 2');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'bbb;');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'ccc = 3');
-    });
-  });
-
-  test('FUNCTION', () {
-    var code = '''
-fff(p) {}
-main() {
-  fff(42);
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.FUNCTION_DECLARATION, 'fff(p) {}');
-      helper.assertHasRegion(HighlightType.FUNCTION, 'fff(42)');
-    });
-  });
-
-  test('FUNCTION_TYPE_ALIAS', () {
-    var code = '''
-typedef FFF(p);
-main(FFF fff) {
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF(p)');
-      helper.assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF fff)');
-    });
-  });
-
-  test('GETTER_DECLARATION', () {
-    var code = '''
-get aaa => null;
-class A {
-  get bbb => null;
-}
-main(A a) {
-  aaa;
-  a.bbb;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.GETTER_DECLARATION, 'aaa => null');
-      helper.assertHasRegion(HighlightType.GETTER_DECLARATION, 'bbb => null');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'aaa;');
-      helper.assertHasRegion(HighlightType.FIELD, 'bbb;');
-    });
-  });
-
-  test('IDENTIFIER_DEFAULT', () {
-    var code = '''
-main() {
-  aaa = 42;
-  bbb(84);
-  CCC ccc;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'aaa = 42');
-      helper.assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'bbb(84)');
-      helper.assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'CCC ccc');
-    });
-  });
-
-  test('IMPORT_PREFIX', () {
-    var code = '''
-import 'dart:math' as ma;
-main() {
-  ma.max(1, 2);
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma;');
-      helper.assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma.max');
-    });
-  });
-
-  test('KEYWORD void', () {
-    var code = '''
-void main() {
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.KEYWORD, 'void main()');
-    });
-  });
-
-  test('LITERAL_BOOLEAN', () {
-    var code = 'var V = true;';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.LITERAL_BOOLEAN, 'true;');
-    });
-  });
-
-  test('LITERAL_DOUBLE', () {
-    var code = 'var V = 4.2;';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.LITERAL_DOUBLE, '4.2;', '4.2'.length);
-    });
-  });
-
-  test('LITERAL_INTEGER', () {
-    var code = 'var V = 42;';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.LITERAL_INTEGER, '42;');
-    });
-  });
-
-  test('LITERAL_STRING', () {
-    var code = 'var V = "abc";';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.LITERAL_STRING, '"abc";', '"abc"'.length);
-    });
-  });
-
-  test('LOCAL_VARIABLE', () {
-    var code = '''
-main() {
-  int vvv = 0;
-  vvv;
-  vvv = 1;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.LOCAL_VARIABLE_DECLARATION, 'vvv = 0');
-      helper.assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv;');
-      helper.assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv = 1;');
-    });
-  });
-
-  test('METHOD', () {
-    var code = '''
-class A {
-  aaa() {}
-  static bbb() {}
-}
-main(A a) {
-  a.aaa();
-  a.aaa;
-  A.bbb();
-  A.bbb;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.METHOD_DECLARATION, 'aaa() {}');
-      helper.assertHasRegion(HighlightType.METHOD_DECLARATION_STATIC, 'bbb() {}');
-      helper.assertHasRegion(HighlightType.METHOD, 'aaa();');
-      helper.assertHasRegion(HighlightType.METHOD, 'aaa;');
-      helper.assertHasRegion(HighlightType.METHOD_STATIC, 'bbb();');
-      helper.assertHasRegion(HighlightType.METHOD_STATIC, 'bbb;');
-    });
-  });
-
-  test('METHOD best type', () {
-    var code = '''
-main(p) {
-  if (p is List) {
-    p.add(null);
-  }
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.METHOD, 'add(null)');
-    });
-  });
-
-  test('PARAMETER', () {
-    var code = '''
-main(int p) {
-  p;
-  p = 42;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.PARAMETER, 'p) {');
-      helper.assertHasRegion(HighlightType.PARAMETER, 'p;');
-      helper.assertHasRegion(HighlightType.PARAMETER, 'p = 42');
-    });
-  });
-
-  test('SETTER_DECLARATION', () {
-    var code = '''
-set aaa(x) {}
-class A {
-  set bbb(x) {}
-}
-main(A a) {
-  aaa = 1;
-  a.bbb = 2;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.SETTER_DECLARATION, 'aaa(x)');
-      helper.assertHasRegion(HighlightType.SETTER_DECLARATION, 'bbb(x)');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
-      helper.assertHasRegion(HighlightType.FIELD, 'bbb = 2');
-    });
-  });
-
-  test('TOP_LEVEL_VARIABLE', () {
-    var code = '''
-var VVV = 0;
-main() {
-  print(VVV);
-  VVV = 1;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'VVV = 0');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'VVV);');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'VVV = 1');
-    });
-  });
-
-  test('TYPE_NAME_DYNAMIC', () {
-    var code = '''
-dynamic main() {
-  dynamic = 42;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic main()');
-      helper.assertNoRegion(HighlightType.IDENTIFIER_DEFAULT, 'dynamic main()');
-      helper.assertNoRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic = 42');
-    });
-  });
-
-  test('TYPE_PARAMETER', () {
-    var code = '''
-class A<T> {
-  T fff;
-  T mmm(T p) => null;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T> {');
-      helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T fff;');
-      helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T mmm(');
-      helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T p)');
-    });
-  });
-}
-
-
-
-
-class NotificationNavigationHelper extends AnalysisTestHelper {
-  List<Map<String, Object>> regions;
-
-  Future prepareRegions(then()) {
-    addAnalysisSubscriptionNavigation(testFile);
-    return waitForOperationsFinished().then((_) {
-      regions = getTestNavigation();
-      then();
-    });
-  }
-
-  void assertHasRegion(String regionSearch, String targetSearch) {
-    var regionOffset = findOffset(regionSearch);
-    int regionLength = findIdentifierLength(regionSearch);
-    var targetOffset = findOffset(targetSearch);
-    var targetLength = findIdentifierLength(targetSearch);
-    asserHasRegionInts(regionOffset, regionLength, targetOffset, targetLength);
-  }
-
-  void asserHasOperatorRegion(String search, int regionLength, int targetLength) {
-    var regionOffset = findOffset(search);
-    var region = asserHasRegionInts(regionOffset, regionLength, -1, 0);
-    if (targetLength != -1) {
-      expect(region['targets'][0]['length'], targetLength);
-    }
-  }
-
-  asserHasRegionInts(int regionOffset, int regionLength,
-                          int targetOffset, int targetLength) {
-    Map<String, Object> region = findRegion(regionOffset, regionLength);
-    if (region != null) {
-      List<Map<String, Object>> targets = region['targets'];
-      if (targetOffset == -1) {
-        return region;
-      }
-      var target = findTarget(targets, testFile, targetOffset, targetLength);
-      if (target != null) {
-        return target;
-      }
-    }
-    fail('Expected to find (offset=$regionOffset; length=$regionLength) => '
-         '(offset=$targetOffset; length=$targetLength) in\n'
-         '${regions.join('\n')}');
-  }
-
-  Map<String, Object> findRegionString(String search, [bool notNull]) {
-    int offset = findOffset(search);
-    int length = search.length;
-    return findRegion(offset, length, notNull);
-  }
-
-  Map<String, Object> findRegionAt(String search, [bool notNull]) {
-    int offset = findOffset(search);
-    for (Map<String, Object> region in regions) {
-      if (region['offset'] == offset) {
-        if (notNull == false) {
-          fail('Not expected to find at offset=$offset in\n'
-               '${regions.join('\n')}');
-        }
-        return region;
-      }
-    }
-    if (notNull == true) {
-      fail('Expected to find at offset=$offset in\n'
-           '${regions.join('\n')}');
-    }
-    return null;
-  }
-
-  Map<String, Object> findRegionIdentifier(String search, [bool notNull]) {
-    int offset = findOffset(search);
-    int length = findIdentifierLength(search);
-    return findRegion(offset, length, notNull);
-  }
-
-  Map<String, Object> findRegion(int offset, int length, [bool notNull]) {
-    for (Map<String, Object> region in regions) {
-      if (region['offset'] == offset && region['length'] == length) {
-        if (notNull == false) {
-          fail('Not expected to find (offset=$offset; length=$length) in\n'
-               '${regions.join('\n')}');
-        }
-        return region;
-      }
-    }
-    if (notNull == true) {
-      fail('Expected to find (offset=$offset; length=$length) in\n'
-           '${regions.join('\n')}');
-    }
-    return null;
-  }
-
-  Map<String, Object> findTarget(List<Map<String, Object>> targets,
-                                 String file, int offset, int length) {
-    for (Map<String, Object> target in targets) {
-      if (target['file'] == file &&
-          target['offset'] == offset &&
-          target['length'] == length) {
-        return target;
-      }
-    }
-    return null;
-  }
-
-  void assertNoRegion(String regionSearch) {
-    var regionOffset = findOffset(regionSearch);
-    var regionLength = findIdentifierLength(regionSearch);
-    for (Map<String, Object> region in regions) {
-      if (region['offset'] == regionOffset && region['length'] == regionLength) {
-        fail('Unexpected (offset=$regionOffset; length=$regionLength) in\n'
-             '${regions.join('\n')}');
-      }
-    }
-  }
-}
-
-
-int findIdentifierLength(String search) {
-  int length = 0;
-  while (length < search.length) {
-    int c = search.codeUnitAt(length);
-    if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) ||
-          c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) ||
-          c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) {
-      break;
-    }
-    length++;
-  }
-  return length;
-}
-
-
-testNotificationNavigation() {
-  Future testNavigation(String code, then(NotificationNavigationHelper helper)) {
-    var helper = new NotificationNavigationHelper();
-    helper.createSingleFileProject(code);
-    return helper.prepareRegions(() {
-      then(helper);
-    });
-  }
-
-  group('constructor', () {
-    test('named', () {
-      var code = '''
-class A {
-  A.named(int p) {}
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        // has region for complete "A.named"
-        helper.asserHasRegionInts(
-            helper.findOffset('A.named'), 'A.named'.length,
-            helper.findOffset('named(int'), 'named'.length);
-        // no separate regions for "A" and "named"
-        helper.assertNoRegion('A.named(');
-        helper.assertNoRegion('named(');
-        // validate that we don't forget to resolve parameters
-        helper.asserHasRegionInts(
-            helper.findOffset('int p'), 'int'.length,
-            -1, 0);
-      });
-    });
-
-    test('unnamed', () {
-      var code = '''
-class A {
-  A(int p) {}
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        // has constructor region for "A()"
-        helper.asserHasRegionInts(
-            helper.findOffset('A(int p)'), 'A'.length,
-            helper.findOffset('A(int p)'), 0);
-        // validate that we don't forget to resolve parameters
-        helper.asserHasRegionInts(
-            helper.findOffset('int p'), 'int'.length,
-            -1, 0);
-      });
-    });
-  });
-
-  group('identifier', () {
-    test('resolved', () {
-      var code = '''
-class AAA {}
-main() {
-  AAA aaa = null;
-  print(aaa);
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.assertHasRegion('AAA aaa', 'AAA {}');
-        helper.assertHasRegion('aaa);', 'aaa = null');
-        helper.assertHasRegion('main() {', 'main() {');
-      });
-    });
-
-    test('unresolved', () {
-      var code = '''
-main() {
-  print(noo);
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.assertNoRegion('noo);');
-      });
-    });
-  });
-
-  test('fieldFormalParameter', () {
-    var code = '''
-class A {
-  int fff = 123;
-  A(this.fff);
-}
-''';
-    return testNavigation(code, (NotificationNavigationHelper helper) {
-      helper.assertHasRegion('fff);', 'fff = 123');
-    });
-  });
-
-  group('instanceCreation', () {
-    test('named', () {
-      var code = '''
-class A {
-  A.named() {}
-}
-main() {
-  new A.named();
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.asserHasRegionInts(
-            helper.findOffset('new A.named'), 'new A.named'.length,
-            helper.findOffset('named()'), 'named'.length);
-      });
-    });
-
-    test('unnamed', () {
-      var code = '''
-class A {
-  A() {}
-}
-main() {
-  new A();
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.asserHasRegionInts(
-            helper.findOffset('new A'), 'new A'.length,
-            helper.findOffset('A()'), ''.length);
-      });
-    });
-  });
-
-  group('operator', () {
-    test('int', () {
-      var code = '''
-main() {
-  var v = 0;
-  v - 1;
-  v + 2;
-  -v; // unary
-  --v;
-  ++v;
-  v--; // mm
-  v++; // pp
-  v -= 3;
-  v += 4;
-  v *= 5;
-  v /= 6;
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.asserHasOperatorRegion('- 1;', 1, 1);
-        helper.asserHasOperatorRegion('+ 2;', 1, 1);
-        helper.asserHasOperatorRegion('-v; // unary', 1, -1);
-        helper.asserHasOperatorRegion('--v;', 2, 1);
-        helper.asserHasOperatorRegion('++v;', 2, 1);
-        helper.asserHasOperatorRegion('--; // mm', 2, 1);
-        helper.asserHasOperatorRegion('++; // pp', 2, 1);
-        helper.asserHasOperatorRegion('-= 3;', 2, 1);
-        helper.asserHasOperatorRegion('+= 4;', 2, 1);
-        helper.asserHasOperatorRegion('*= 5;', 2, 1);
-        helper.asserHasOperatorRegion('/= 6;', 2, 1);
-      });
-    });
-
-    test('list', () {
-      var code = '''
-main() {
-  List<int> v = [1, 2, 3];
-  v[0]; // []
-  v[1] = 1; // []=
-  v[2] += 2;
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.asserHasOperatorRegion(']; // []', 1, 2);
-        helper.asserHasOperatorRegion('] = 1', 1, 3);
-        helper.asserHasOperatorRegion('] += 2', 1, 3);
-        helper.asserHasOperatorRegion('+= 2', 2, 1);
-      });
-    });
-  });
-
-  test('partOf', () {
-    var helper = new NotificationNavigationHelper();
-    var code = '''
-part of lib;
-''';
-    helper.createSingleFileProject(code);
-    var libPath = helper.setFileContent('/project/bin/lib.dart', '''
-library lib;
-part 'test.dart';
-''');
-    return helper.prepareRegions(() {
-      var region = helper.findRegionString('part of lib', true);
-      var target = region['targets'][0];
-      expect(target['file'], libPath);
-    });
-  });
-
-  group('string', () {
-    test('export', () {
-      var code = '''
-export "dart:math";
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.findRegionString('export "dart:math"', true);
-      });
-    });
-
-    test('export unresolved URI', () {
-      var code = '''
-export 'no.dart';
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.findRegionAt('export ', false);
-      });
-    });
-
-    test('import', () {
-      var code = '''
-import "dart:math" as m;
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.findRegionString('import "dart:math"', true);
-      });
-    });
-
-    test('import no URI', () {
-      var code = '''
-import ;
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.findRegionAt('import ', false);
-      });
-    });
-
-    test('import unresolved URI', () {
-      var code = '''
-import 'no.dart';
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.findRegionAt('import ', false);
-      });
-    });
-
-    test('part', () {
-      var helper = new NotificationNavigationHelper();
-      var code = '''
-library lib;
-part "my_part.dart";
-''';
-      helper.createSingleFileProject(code);
-      var unitPath = helper.setFileContent('/project/bin/my_part.dart', '''
-part of lib;
-''');
-      return helper.prepareRegions(() {
-        var region = helper.findRegionString('part "my_part.dart"', true);
-        var target = region['targets'][0];
-        expect(target['file'], unitPath);
-      });
-    });
-
-    test('part unresolved URI', () {
-      // TODO(scheglov) why do we throw MemoryResourceException here?
-      // This Source/File does not exist.
-//      var helper = new NotificationNavigationHelper();
-//      var code = '''
-//library lib;
-//part "my_part.dart";
-//''';
-//      helper.createSingleFileProject(code);
-//      return helper.prepareRegions(() {
-//        helper.findRegionAt('part ', false);
-//      });
-    });
-  });
-}
-
-
 testUpdateContent() {
   test('full content', () {
     AnalysisTestHelper helper = new AnalysisTestHelper();
@@ -1543,16 +443,9 @@
       List<AnalysisError> errors = helper.getTestErrors();
       expect(errors, isEmpty);
       // update code
-      {
-        Request request = new Request('0', METHOD_UPDATE_CONTENT);
-        request.setParameter('files',
-            {
-              helper.testFile : {
-                CONTENT : 'library lib'
-              }
-            });
-        helper.handleSuccessfulRequest(request);
-      }
+      helper.sendContentChange({
+        CONTENT: 'library lib'
+      });
       // wait, there is an error
       return helper.waitForOperationsFinished().then((_) {
         List<AnalysisError> errors = helper.getTestErrors();
@@ -1569,19 +462,12 @@
       List<AnalysisError> errors = helper.getTestErrors();
       expect(errors, isEmpty);
       // update code
-      {
-        Request request = new Request('0', METHOD_UPDATE_CONTENT);
-        request.setParameter('files',
-            {
-              helper.testFile : {
-                CONTENT : 'library lib',
-                OFFSET : 'library '.length,
-                OLD_LENGTH : 'A;'.length,
-                NEW_LENGTH : 'lib'.length,
-              }
-            });
-        helper.handleSuccessfulRequest(request);
-      }
+      helper.sendContentChange({
+        CONTENT: 'library lib',
+        OFFSET: 'library '.length,
+        OLD_LENGTH: 'A;'.length,
+        NEW_LENGTH: 'lib'.length,
+      });
       // wait, there is an error
       return helper.waitForOperationsFinished().then((_) {
         List<AnalysisError> errors = helper.getTestErrors();
@@ -1589,8 +475,54 @@
       });
     });
   });
-}
 
+  test('change on disk, normal', () {
+    AnalysisTestHelper helper = new AnalysisTestHelper();
+    helper.createSingleFileProject('library A;');
+    return helper.waitForOperationsFinished().then((_) {
+      // There should be no errors
+      expect(helper.getTestErrors(), hasLength(0));
+      // Change file on disk, adding a syntax error.
+      helper.resourceProvider.modifyFile(helper.testFile, 'library lib');
+      // There should be errors now.
+      return pumpEventQueue().then((_) {
+        return helper.waitForOperationsFinished().then((_) {
+          expect(helper.getTestErrors(), hasLength(1));
+        });
+      });
+    });
+  });
+
+  test('change on disk, during override', () {
+    AnalysisTestHelper helper = new AnalysisTestHelper();
+    helper.createSingleFileProject('library A;');
+    return helper.waitForOperationsFinished().then((_) {
+      // update code
+      helper.sendContentChange({
+        CONTENT: 'library B;'
+      });
+      // There should be no errors
+      return helper.waitForOperationsFinished().then((_) {
+        expect(helper.getTestErrors(), hasLength(0));
+        // Change file on disk, adding a syntax error.
+        helper.resourceProvider.modifyFile(helper.testFile, 'library lib');
+        // There should still be no errors (file should not have been reread).
+        return helper.waitForOperationsFinished().then((_) {
+          expect(helper.getTestErrors(), hasLength(0));
+          // Send a content change with a null content param--file should be
+          // reread from disk.
+          helper.sendContentChange({
+            CONTENT: null
+          });
+          // There should be errors now.
+          return helper.waitForOperationsFinished().then((_) {
+            expect(helper.getTestErrors(), hasLength(1));
+          });
+        });
+      });
+    });
+  });
+}
 
 void test_setSubscriptions() {
   test('before analysis', () {
@@ -1624,3 +556,41 @@
     });
   });
 }
+
+
+@ReflectiveTestCase()
+class AnalysisDomainTest extends AbstractAnalysisTest {
+  Map<String, List<AnalysisError>> filesErrors = {};
+
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_ERRORS) {
+      String file = notification.getParameter(FILE);
+      List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS);
+      filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList();
+    }
+  }
+
+  test_setRoots_packages() {
+    // prepare package
+    String pkgFile = '/packages/pkgA/libA.dart';
+    resourceProvider.newFile(pkgFile, '''
+library lib_a;
+class A {}
+''');
+    packageMapProvider.packageMap['pkgA'] =
+        [resourceProvider.getResource('/packages/pkgA')];
+    addTestFile('''
+import 'package:pkgA/libA.dart';
+main(A a) {
+}
+''');
+    // create project and wait for analysis
+    createProject();
+    return waitForTasksFinished().then((_) {
+      // if 'package:pkgA/libA.dart' was resolved, then there are no errors
+      expect(filesErrors[testFile], isEmpty);
+      // packages file also was resolved
+      expect(filesErrors[pkgFile], isEmpty);
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
new file mode 100644
index 0000000..cfe203b
--- /dev/null
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -0,0 +1,43 @@
+// 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.domain.completion;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/domain_completion.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;
+  MemoryResourceProvider resourceProvider;
+  AnalysisServer server;
+  CompletionDomainHandler handler;
+
+  setUp(() {
+    serverChannel = new MockServerChannel();
+    resourceProvider = new MemoryResourceProvider();
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
+    server.defaultSdk = new MockSdk();
+    handler = new CompletionDomainHandler(server);
+  });
+
+  group('CompletionDomainHandler', () {
+    test('getSuggestions', () {
+      var request = new Request('0', COMPLETION_GET_SUGGESTIONS);
+      request.setParameter(FILE, null);
+      request.setParameter(OFFSET, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+  });
+}
diff --git a/pkg/analysis_server/test/domain_edit_test.dart b/pkg/analysis_server/test/domain_edit_test.dart
new file mode 100644
index 0000000..14f838b
--- /dev/null
+++ b/pkg/analysis_server/test/domain_edit_test.dart
@@ -0,0 +1,97 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.domain.edit;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/domain_edit.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;
+  MemoryResourceProvider resourceProvider;
+  AnalysisServer server;
+  EditDomainHandler handler;
+
+  setUp(() {
+    serverChannel = new MockServerChannel();
+    resourceProvider = new MemoryResourceProvider();
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
+    server.defaultSdk = new MockSdk();
+    handler = new EditDomainHandler(server);
+  });
+
+  group('EditDomainHandler', () {
+    test('applyRefactoring', () {
+      var request = new Request('0', EDIT_APPLY_REFACTORING);
+      request.setParameter(ID, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('createRefactoring', () {
+      var request = new Request('0', EDIT_CREATE_REFACTORING);
+      request.setParameter(KIND, null);
+      request.setParameter(FILE, null);
+      request.setParameter(OFFSET, null);
+      request.setParameter(LENGTH, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('deleteRefactoring', () {
+      var request = new Request('0', EDIT_DELETE_REFACTORING);
+      request.setParameter(ID, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('getAssists', () {
+      var request = new Request('0', EDIT_GET_ASSISTS);
+      request.setParameter(FILE, null);
+      request.setParameter(OFFSET, null);
+      request.setParameter(LENGTH, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('getFixes', () {
+      var request = new Request('0', EDIT_GET_FIXES);
+      request.setParameter(ERRORS, []);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('getRefactorings', () {
+      var request = new Request('0', EDIT_GET_REFACTORINGS);
+      request.setParameter(FILE, 'test.dart');
+      request.setParameter(OFFSET, 10);
+      request.setParameter(LENGTH, 20);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('setRefactoringOptions', () {
+      var request = new Request('0', EDIT_SET_REFACTORING_OPTIONS);
+      request.setParameter(ID, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+  });
+}
diff --git a/pkg/analysis_server/test/domain_search_test.dart b/pkg/analysis_server/test/domain_search_test.dart
new file mode 100644
index 0000000..46b8cfa
--- /dev/null
+++ b/pkg/analysis_server/test/domain_search_test.dart
@@ -0,0 +1,121 @@
+// 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.domain.search;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/domain_search.dart';
+import 'package:analysis_server/src/index/index.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:unittest/unittest.dart';
+
+import 'analysis_abstract.dart';
+import 'index/store/memory_node_manager.dart';
+import 'mocks.dart';
+import 'reflective_tests.dart';
+
+main() {
+  groupSep = ' | ';
+  group('SearchDomainHandler', () {
+    runReflectiveTests(SearchDomainTest);
+  });
+
+  MockServerChannel serverChannel;
+  MemoryResourceProvider resourceProvider;
+  AnalysisServer server;
+  SearchDomainHandler handler;
+
+  setUp(() {
+    serverChannel = new MockServerChannel();
+    resourceProvider = new MemoryResourceProvider();
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
+    server.defaultSdk = new MockSdk();
+    handler = new SearchDomainHandler(server);
+  });
+
+  group('SearchDomainHandler', () {
+    test('findElementReferences', () {
+      var request = new Request('0', SEARCH_FIND_ELEMENT_REFERENCES);
+      request.setParameter(FILE, null);
+      request.setParameter(OFFSET, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('findMemberDeclarations', () {
+      var request = new Request('0', SEARCH_FIND_MEMBER_DECLARATIONS);
+      request.setParameter(NAME, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('findMemberReferences', () {
+      var request = new Request('0', SEARCH_FIND_MEMBER_REFERENCES);
+      request.setParameter(NAME, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('findTopLevelDeclarations', () {
+      var request = new Request('0', SEARCH_FIND_TOP_LEVEL_DECLARATIONS);
+      request.setParameter(PATTERN, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+  });
+}
+
+@ReflectiveTestCase()
+class SearchDomainTest extends AbstractAnalysisTest {
+  LocalIndex index;
+
+  @override
+  Index createIndex() {
+    return new LocalIndex(new MemoryNodeManager());
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    index = server.index;
+    createProject();
+  }
+
+  Future test_findTopLevelDeclarations() {
+    // TODO(scheglov) replace this temporary Index test with an actual
+    // SearchEngine and SearchDomainHandler test.
+    addTestFile('''
+class AAA {
+  AAA() {}
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return index.getRelationshipsAsync(UniverseElement.INSTANCE,
+          IndexConstants.DEFINES_CLASS).then((List<Location> locations) {
+        bool hasClassFunction = false;
+        bool hasClassAAA = false;
+        for (var location in locations) {
+          if (location.element.name == 'Function') {
+            hasClassFunction = true;
+          }
+          if (location.element.name == 'AAA') {
+            hasClassAAA = true;
+          }
+        }
+        expect(hasClassFunction, isTrue, reason: locations.toString());
+        expect(hasClassAAA, isTrue, reason: locations.toString());
+      });
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index cb726d4..a4a1012 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -20,13 +20,14 @@
   setUp(() {
     var serverChannel = new MockServerChannel();
     var resourceProvider = PhysicalResourceProvider.INSTANCE;
-    server = new AnalysisServer(serverChannel, resourceProvider);
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
     handler = new ServerDomainHandler(server);
   });
 
   group('ServerDomainHandler', () {
     test('getVersion', () {
-      var request = new Request('0', METHOD_GET_VERSION);
+      var request = new Request('0', SERVER_GET_VERSION);
       var response = handler.handleRequest(request);
       expect(response.toJson(), equals({
         Response.ID: '0',
@@ -39,7 +40,7 @@
     group('setSubscriptions', () {
       Request request;
       setUp(() {
-        request = new Request('0', METHOD_SET_SERVER_SUBSCRIPTIONS);
+        request = new Request('0', SERVER_SET_SUBSCRIPTIONS);
       });
 
       test('invalid service name', () {
@@ -66,7 +67,7 @@
     test('shutdown', () {
       expect(server.running, isTrue);
       // send request
-      var request = new Request('0', METHOD_SHUTDOWN);
+      var request = new Request('0', SERVER_SHUTDOWN);
       var response = handler.handleRequest(request);
       expect(response, isResponseSuccess('0'));
       // server is down
diff --git a/pkg/analysis_server/test/index/b_plus_tree_test.dart b/pkg/analysis_server/test/index/b_plus_tree_test.dart
new file mode 100644
index 0000000..a3abcce
--- /dev/null
+++ b/pkg/analysis_server/test/index/b_plus_tree_test.dart
@@ -0,0 +1,686 @@
+// 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.index.b_plus_tree;
+
+import 'dart:math';
+
+import 'package:analysis_server/src/index/b_plus_tree.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('BTree', () {
+    runReflectiveTests(BPlusTreeTest);
+  });
+}
+
+
+void _assertDebugString(BPlusTree tree, String expected) {
+  String dump = _getDebugString(tree);
+  expect(dump, expected);
+}
+
+
+_TestBTree<int, String> _createTree(int maxIndexKeys, int maxLeafKeys) {
+  return new _TestBTree<int, String>(maxIndexKeys, maxLeafKeys, _intComparator);
+}
+
+
+String _getDebugString(BPlusTree tree) {
+  StringBuffer buffer = new StringBuffer();
+  tree.writeOn(buffer);
+  return buffer.toString();
+}
+
+
+int _intComparator(int a, int b) => a - b;
+
+
+@ReflectiveTestCase()
+class BPlusTreeTest {
+  BPlusTree<int, String, dynamic> tree = _createTree(4, 4);
+
+  test_NoSuchMethodError() {
+    expect(() {
+      (tree as dynamic).thereIsNoSuchMethod();
+    }, throwsA(new isInstanceOf<NoSuchMethodError>()));
+  }
+
+  void test_find() {
+    _insertValues(12);
+    expect(tree.find(-1), isNull);
+    expect(tree.find(1000), isNull);
+    for (int key = 0; key < 12; key++) {
+      expect(tree.find(key), 'V$key');
+    }
+  }
+
+  void test_insert_01() {
+    _insert(0, 'A');
+    _assertDebugString(tree, 'LNode {0: A}\n');
+  }
+
+  void test_insert_02() {
+    _insert(1, 'B');
+    _insert(0, 'A');
+    _assertDebugString(tree, 'LNode {0: A, 1: B}\n');
+  }
+
+  void test_insert_03() {
+    _insert(2, 'C');
+    _insert(0, 'A');
+    _insert(1, 'B');
+    _assertDebugString(tree, 'LNode {0: A, 1: B, 2: C}\n');
+  }
+
+  void test_insert_05() {
+    _insertValues(5);
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 3: V3, 4: V4}
+}
+''');
+  }
+
+  void test_insert_09() {
+    _insertValues(9);
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7, 8: V8}
+}
+''');
+  }
+
+  void test_insert_innerSplitLeft() {
+    // Prepare a tree with '0' key missing.
+    for (int i = 1; i < 12; i++) {
+      _insert(i, "V$i");
+    }
+    _assertDebugString(tree, '''
+INode {
+    LNode {1: V1, 2: V2}
+  3
+    LNode {3: V3, 4: V4}
+  5
+    LNode {5: V5, 6: V6}
+  7
+    LNode {7: V7, 8: V8}
+  9
+    LNode {9: V9, 10: V10, 11: V11}
+}
+''');
+    // Split and insert into the 'left' child.
+    _insert(0, 'V0');
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1, 2: V2}
+      3
+        LNode {3: V3, 4: V4}
+      5
+        LNode {5: V5, 6: V6}
+    }
+  7
+    INode {
+        LNode {7: V7, 8: V8}
+      9
+        LNode {9: V9, 10: V10, 11: V11}
+    }
+}
+''');
+  }
+
+  void test_insert_innerSplitRight() {
+    _insertValues(12);
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1}
+      2
+        LNode {2: V2, 3: V3}
+      4
+        LNode {4: V4, 5: V5}
+    }
+  6
+    INode {
+        LNode {6: V6, 7: V7}
+      8
+        LNode {8: V8, 9: V9, 10: V10, 11: V11}
+    }
+}
+''');
+  }
+
+  void test_insert_replace() {
+    _insert(0, 'A');
+    _insert(1, 'B');
+    _insert(2, 'C');
+    _assertDebugString(tree, 'LNode {0: A, 1: B, 2: C}\n');
+    _insert(2, 'C2');
+    _insert(1, 'B2');
+    _insert(0, 'A2');
+    _assertDebugString(tree, 'LNode {0: A2, 1: B2, 2: C2}\n');
+  }
+
+  void test_remove_inner_borrowLeft() {
+    tree = _createTree(10, 4);
+    for (int i = 100; i < 125; i++) {
+      _insert(i, 'V$i');
+    }
+    for (int i = 0; i < 10; i++) {
+      _insert(i, 'V$i');
+    }
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1}
+      2
+        LNode {2: V2, 3: V3}
+      4
+        LNode {4: V4, 5: V5}
+      6
+        LNode {6: V6, 7: V7}
+      8
+        LNode {8: V8, 9: V9, 100: V100, 101: V101}
+      102
+        LNode {102: V102, 103: V103}
+      104
+        LNode {104: V104, 105: V105}
+      106
+        LNode {106: V106, 107: V107}
+      108
+        LNode {108: V108, 109: V109}
+      110
+        LNode {110: V110, 111: V111}
+    }
+  112
+    INode {
+        LNode {112: V112, 113: V113}
+      114
+        LNode {114: V114, 115: V115}
+      116
+        LNode {116: V116, 117: V117}
+      118
+        LNode {118: V118, 119: V119}
+      120
+        LNode {120: V120, 121: V121}
+      122
+        LNode {122: V122, 123: V123, 124: V124}
+    }
+}
+''');
+    expect(tree.remove(112), 'V112');
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1}
+      2
+        LNode {2: V2, 3: V3}
+      4
+        LNode {4: V4, 5: V5}
+      6
+        LNode {6: V6, 7: V7}
+      8
+        LNode {8: V8, 9: V9, 100: V100, 101: V101}
+      102
+        LNode {102: V102, 103: V103}
+      104
+        LNode {104: V104, 105: V105}
+    }
+  106
+    INode {
+        LNode {106: V106, 107: V107}
+      108
+        LNode {108: V108, 109: V109}
+      110
+        LNode {110: V110, 111: V111}
+      112
+        LNode {113: V113, 114: V114, 115: V115}
+      116
+        LNode {116: V116, 117: V117}
+      118
+        LNode {118: V118, 119: V119}
+      120
+        LNode {120: V120, 121: V121}
+      122
+        LNode {122: V122, 123: V123, 124: V124}
+    }
+}
+''');
+  }
+
+  void test_remove_inner_borrowRight() {
+    tree = _createTree(10, 4);
+    for (int i = 100; i < 135; i++) {
+      _insert(i, 'V$i');
+    }
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {100: V100, 101: V101}
+      102
+        LNode {102: V102, 103: V103}
+      104
+        LNode {104: V104, 105: V105}
+      106
+        LNode {106: V106, 107: V107}
+      108
+        LNode {108: V108, 109: V109}
+      110
+        LNode {110: V110, 111: V111}
+    }
+  112
+    INode {
+        LNode {112: V112, 113: V113}
+      114
+        LNode {114: V114, 115: V115}
+      116
+        LNode {116: V116, 117: V117}
+      118
+        LNode {118: V118, 119: V119}
+      120
+        LNode {120: V120, 121: V121}
+      122
+        LNode {122: V122, 123: V123}
+      124
+        LNode {124: V124, 125: V125}
+      126
+        LNode {126: V126, 127: V127}
+      128
+        LNode {128: V128, 129: V129}
+      130
+        LNode {130: V130, 131: V131}
+      132
+        LNode {132: V132, 133: V133, 134: V134}
+    }
+}
+''');
+    expect(tree.remove(100), 'V100');
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {101: V101, 102: V102, 103: V103}
+      104
+        LNode {104: V104, 105: V105}
+      106
+        LNode {106: V106, 107: V107}
+      108
+        LNode {108: V108, 109: V109}
+      110
+        LNode {110: V110, 111: V111}
+      112
+        LNode {112: V112, 113: V113}
+      114
+        LNode {114: V114, 115: V115}
+      116
+        LNode {116: V116, 117: V117}
+    }
+  118
+    INode {
+        LNode {118: V118, 119: V119}
+      120
+        LNode {120: V120, 121: V121}
+      122
+        LNode {122: V122, 123: V123}
+      124
+        LNode {124: V124, 125: V125}
+      126
+        LNode {126: V126, 127: V127}
+      128
+        LNode {128: V128, 129: V129}
+      130
+        LNode {130: V130, 131: V131}
+      132
+        LNode {132: V132, 133: V133, 134: V134}
+    }
+}
+''');
+  }
+
+  void test_remove_inner_mergeLeft() {
+    _insertValues(15);
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1}
+      2
+        LNode {2: V2, 3: V3}
+      4
+        LNode {4: V4, 5: V5}
+    }
+  6
+    INode {
+        LNode {6: V6, 7: V7}
+      8
+        LNode {8: V8, 9: V9}
+      10
+        LNode {10: V10, 11: V11}
+      12
+        LNode {12: V12, 13: V13, 14: V14}
+    }
+}
+''');
+    expect(tree.remove(12), 'V12');
+    expect(tree.remove(13), 'V13');
+    expect(tree.remove(14), 'V14');
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1}
+      2
+        LNode {2: V2, 3: V3}
+      4
+        LNode {4: V4, 5: V5}
+    }
+  6
+    INode {
+        LNode {6: V6, 7: V7}
+      8
+        LNode {8: V8, 9: V9}
+      10
+        LNode {10: V10, 11: V11}
+    }
+}
+''');
+    expect(tree.remove(8), 'V8');
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7, 9: V9}
+  10
+    LNode {10: V10, 11: V11}
+}
+''');
+  }
+
+  void test_remove_inner_mergeRight() {
+    _insertValues(12);
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1}
+      2
+        LNode {2: V2, 3: V3}
+      4
+        LNode {4: V4, 5: V5}
+    }
+  6
+    INode {
+        LNode {6: V6, 7: V7}
+      8
+        LNode {8: V8, 9: V9, 10: V10, 11: V11}
+    }
+}
+''');
+    expect(tree.remove(0), 'V0');
+    _assertDebugString(tree, '''
+INode {
+    LNode {1: V1, 2: V2, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7}
+  8
+    LNode {8: V8, 9: V9, 10: V10, 11: V11}
+}
+''');
+  }
+
+  void test_remove_inner_notFound() {
+    _insertValues(20);
+    expect(tree.remove(100), isNull);
+  }
+
+  void test_remove_leafRoot_becomesEmpty() {
+    _insertValues(1);
+    _assertDebugString(tree, 'LNode {0: V0}\n');
+    expect(tree.remove(0), 'V0');
+    _assertDebugString(tree, 'LNode {}\n');
+  }
+
+  void test_remove_leafRoot_first() {
+    _insertValues(3);
+    _assertDebugString(tree, 'LNode {0: V0, 1: V1, 2: V2}\n');
+    expect(tree.remove(0), 'V0');
+    _assertDebugString(tree, 'LNode {1: V1, 2: V2}\n');
+  }
+
+  void test_remove_leafRoot_last() {
+    _insertValues(3);
+    _assertDebugString(tree, 'LNode {0: V0, 1: V1, 2: V2}\n');
+    expect(tree.remove(2), 'V2');
+    _assertDebugString(tree, 'LNode {0: V0, 1: V1}\n');
+  }
+
+  void test_remove_leafRoot_middle() {
+    _insertValues(3);
+    _assertDebugString(tree, 'LNode {0: V0, 1: V1, 2: V2}\n');
+    expect(tree.remove(1), 'V1');
+    _assertDebugString(tree, 'LNode {0: V0, 2: V2}\n');
+  }
+
+  void test_remove_leafRoot_notFound() {
+    _insertValues(1);
+    _assertDebugString(tree, 'LNode {0: V0}\n');
+    expect(tree.remove(10), null);
+    _assertDebugString(tree, 'LNode {0: V0}\n');
+  }
+
+  void test_remove_leaf_borrowLeft() {
+    tree = _createTree(10, 10);
+    for (int i = 20; i < 40; i++) {
+      _insert(i, 'V$i');
+    }
+    for (int i = 0; i < 5; i++) {
+      _insert(i, 'V$i');
+    }
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1, 2: V2, 3: V3, 4: V4, 20: V20, 21: V21, 22: V22, 23: V23, 24: V24}
+  25
+    LNode {25: V25, 26: V26, 27: V27, 28: V28, 29: V29}
+  30
+    LNode {30: V30, 31: V31, 32: V32, 33: V33, 34: V34, 35: V35, 36: V36, 37: V37, 38: V38, 39: V39}
+}
+''');
+    expect(tree.remove(25), 'V25');
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1, 2: V2, 3: V3, 4: V4, 20: V20, 21: V21}
+  22
+    LNode {22: V22, 23: V23, 24: V24, 26: V26, 27: V27, 28: V28, 29: V29}
+  30
+    LNode {30: V30, 31: V31, 32: V32, 33: V33, 34: V34, 35: V35, 36: V36, 37: V37, 38: V38, 39: V39}
+}
+''');
+  }
+
+  void test_remove_leaf_borrowRight() {
+    tree = _createTree(10, 10);
+    _insertValues(15);
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1, 2: V2, 3: V3, 4: V4}
+  5
+    LNode {5: V5, 6: V6, 7: V7, 8: V8, 9: V9, 10: V10, 11: V11, 12: V12, 13: V13, 14: V14}
+}
+''');
+    expect(tree.remove(0), 'V0');
+    _assertDebugString(tree, '''
+INode {
+    LNode {1: V1, 2: V2, 3: V3, 4: V4, 5: V5, 6: V6, 7: V7}
+  8
+    LNode {8: V8, 9: V9, 10: V10, 11: V11, 12: V12, 13: V13, 14: V14}
+}
+''');
+  }
+
+  void test_remove_leaf_mergeLeft() {
+    _insertValues(9);
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7, 8: V8}
+}
+''');
+    expect(tree.remove(2), 'V2');
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7, 8: V8}
+}
+''');
+  }
+
+  void test_remove_leaf_mergeRight() {
+    _insertValues(9);
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7, 8: V8}
+}
+''');
+    expect(tree.remove(1), 'V1');
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 2: V2, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7, 8: V8}
+}
+''');
+  }
+
+  void test_remove_leaf_noReorder() {
+    _insertValues(5);
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 3: V3, 4: V4}
+}
+''');
+    expect(tree.remove(3), 'V3');
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 4: V4}
+}
+''');
+  }
+
+  void test_stress_evenOdd() {
+    int count = 1000;
+    // insert odd, forward
+    for (int i = 1; i < count; i += 2) {
+      _insert(i, 'V$i');
+    }
+    // insert even, backward
+    for (int i = count - 2; i >= 0; i -= 2) {
+      _insert(i, 'V$i');
+    }
+    // find every
+    for (int i = 0; i < count; i++) {
+      expect(tree.find(i), 'V$i');
+    }
+    // remove odd, backward
+    for (int i = count - 1; i >= 1; i -= 2) {
+      expect(tree.remove(i), 'V$i');
+    }
+    for (int i = 0; i < count; i++) {
+      if (i.isEven) {
+        expect(tree.find(i), 'V$i');
+      } else {
+        expect(tree.find(i), isNull);
+      }
+    }
+    // remove even, forward
+    for (int i = 0; i < count; i += 2) {
+      tree.remove(i);
+    }
+    for (int i = 0; i < count; i++) {
+      expect(tree.find(i), isNull);
+    }
+  }
+
+  void test_stress_random() {
+    tree = _createTree(10, 10);
+    int maxKey = 1000000;
+    int tryCount = 1000;
+    Set<int> keys = new Set<int>();
+    {
+      Random random = new Random(37);
+      for (int i = 0; i < tryCount; i++) {
+        int key = random.nextInt(maxKey);
+        keys.add(key);
+        _insert(key, 'V$key');
+      }
+    }
+    // find every
+    for (int key in keys) {
+      expect(tree.find(key), 'V$key');
+    }
+    // remove random keys
+    {
+      Random random = new Random(37);
+      for (int key in new Set<int>.from(keys)) {
+        if (random.nextBool()) {
+          keys.remove(key);
+          expect(tree.remove(key), 'V$key');
+        }
+      }
+    }
+    // find every remaining key
+    for (int key in keys) {
+      expect(tree.find(key), 'V$key');
+    }
+  }
+
+  void _insert(int key, String value) {
+    tree.insert(key, value);
+  }
+
+  void _insertValues(int count) {
+    for (int i = 0; i < count; i++) {
+      _insert(i, 'V$i');
+    }
+  }
+}
+
+class _TestBTree<K, V> extends BPlusTree<K, V, int> {
+  _TestBTree(int maxIndexKeys, int maxLeafKeys, Comparator<K> comparator) :
+      super(comparator, new MemoryNodeManager(maxIndexKeys, maxLeafKeys));
+}
diff --git a/pkg/analysis_server/test/index/file_page_manager_test.dart b/pkg/analysis_server/test/index/file_page_manager_test.dart
new file mode 100644
index 0000000..1c11942
--- /dev/null
+++ b/pkg/analysis_server/test/index/file_page_manager_test.dart
@@ -0,0 +1,125 @@
+// 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.index.file_page_manager;
+
+import 'dart:collection';
+import 'dart:io';
+import 'dart:math';
+import 'dart:typed_data';
+
+import 'package:analysis_server/src/index/b_plus_tree.dart';
+import 'package:analysis_server/src/index/file_page_manager.dart';
+import 'package:analysis_server/src/index/page_node_manager.dart';
+import 'package:path/path.dart' as pathos;
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('FixedStringCodecTest', () {
+    runReflectiveTests(_FilePageManagerTest);
+  });
+}
+
+
+int _intComparator(int a, int b) => a - b;
+
+
+@ReflectiveTestCase()
+class _FilePageManagerTest {
+  FilePageManager manager;
+  int pageSize = 1024;
+  Directory tempDir;
+
+  void setUp() {
+    tempDir = Directory.systemTemp.createTempSync('testIndex_');
+    String path = pathos.join(tempDir.path, 'my.index');
+    manager = new FilePageManager(pageSize, path);
+  }
+
+  void tearDown() {
+    manager.close();
+    manager.delete();
+    tempDir.deleteSync(recursive: true);
+  }
+
+  void test_alloc_reuseFree() {
+    int id = manager.alloc();
+    manager.free(id);
+    int newId = manager.alloc();
+    expect(newId, id);
+  }
+
+  void test_alloc_unique() {
+    int idA = manager.alloc();
+    int idB = manager.alloc();
+    expect(idB, isNot(idA));
+  }
+
+  void test_btree_stress_random() {
+    NodeManager<int, String, int> nodeManager = new PageNodeManager<int,
+        String>(manager, Uint32Codec.INSTANCE, new FixedStringCodec(7));
+    nodeManager = new CachingNodeManager(nodeManager, 32, 32);
+    BPlusTree<int, String, int> tree = new BPlusTree(_intComparator,
+        nodeManager);
+    // insert
+    int maxKey = 1000000;
+    int tryCount = 1000;
+    Set<int> keys = new Set<int>();
+    {
+      Random random = new Random(37);
+      for (int i = 0; i < tryCount; i++) {
+        int key = random.nextInt(maxKey);
+        keys.add(key);
+        tree.insert(key, 'V$key');
+      }
+    }
+    // find every
+    for (int key in keys) {
+      expect(tree.find(key), 'V$key');
+    }
+    // remove random keys
+    {
+      Random random = new Random(37);
+      Set<int> removedKeys = new HashSet<int>();
+      for (int key in new Set<int>.from(keys)) {
+        if (random.nextBool()) {
+          removedKeys.add(key);
+          keys.remove(key);
+          expect(tree.remove(key), 'V$key');
+        }
+      }
+      // check the removed keys are actually gone
+      for (int key in removedKeys) {
+        expect(tree.find(key), isNull);
+      }
+    }
+    // find every remaining key
+    for (int key in keys) {
+      expect(tree.find(key), 'V$key');
+    }
+  }
+
+  void test_free_double() {
+    int id = manager.alloc();
+    manager.free(id);
+    expect(() {
+      manager.free(id);
+    }, throws);
+  }
+
+  void test_writeRead() {
+    // write
+    int id1 = manager.alloc();
+    int id2 = manager.alloc();
+    manager.write(id1, new Uint8List.fromList(new List.filled(pageSize, 1)));
+    manager.write(id2, new Uint8List.fromList(new List.filled(pageSize, 2)));
+    // read
+    expect(manager.read(id1), everyElement(1));
+    expect(manager.read(id2), everyElement(2));
+  }
+}
diff --git a/pkg/analysis_server/test/index/index_test.dart b/pkg/analysis_server/test/index/index_test.dart
new file mode 100644
index 0000000..965acff
--- /dev/null
+++ b/pkg/analysis_server/test/index/index_test.dart
@@ -0,0 +1,204 @@
+// 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.index;
+
+import 'dart:async';
+import 'dart:io' show Directory;
+
+import 'package:analysis_server/src/index/index.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/html.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:unittest/unittest.dart';
+
+import '../mocks.dart';
+import '../reflective_tests.dart';
+import 'store/single_source_container.dart';
+import 'store/memory_node_manager.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('LocalIndex', () {
+    runReflectiveTests(LocalIndexTest);
+  });
+}
+
+
+void _assertElementNames(List<Location> locations, List expected) {
+  expect(_toElementNames(locations), unorderedEquals(expected));
+}
+
+
+Iterable<String> _toElementNames(List<Location> locations) {
+  return locations.map((loc) => loc.element.name);
+}
+
+
+@ReflectiveTestCase()
+class LocalIndexTest {
+  static final DartSdk SDK = new MockSdk();
+
+  AnalysisContext context;
+  LocalIndex index;
+  Directory indexDirectory;
+  MemoryResourceProvider provider = new MemoryResourceProvider();
+
+  void setUp() {
+    // prepare Index
+    indexDirectory = Directory.systemTemp.createTempSync(
+        'AnalysisServer_index');
+    index = new LocalIndex(new MemoryNodeManager());
+    // prepare AnalysisContext
+    context = AnalysisEngine.instance.createAnalysisContext();
+    context.sourceFactory = new SourceFactory(<UriResolver>[new DartUriResolver(
+        SDK), new ResourceUriResolver(provider)]);
+  }
+
+  void tearDown() {
+    indexDirectory.delete(recursive: true);
+    index = null;
+    context = null;
+    provider = null;
+  }
+
+  Future test_clear() {
+    _indexTest('main() {}');
+    return _getDefinedFunctions().then((locations) {
+      _assertElementNames(locations, ['main']);
+      // clear
+      index.clear();
+      return _getDefinedFunctions().then((locations) {
+        expect(locations, isEmpty);
+      });
+    });
+  }
+
+  void test_getRelationships() {
+    var callback = new _RecordingRelationshipCallback();
+    Element element = UniverseElement.INSTANCE;
+    index.getRelationships(element, IndexConstants.DEFINES_CLASS, callback);
+    expect(callback.locations, isEmpty);
+  }
+
+  void test_indexHtmlUnit_nullUnit() {
+    index.indexHtmlUnit(context, null);
+  }
+
+  void test_indexHtmlUnit_nullUnitElement() {
+    HtmlUnit unit = new HtmlUnit(null, [], null);
+    index.indexHtmlUnit(context, unit);
+  }
+
+  Future test_indexUnit() {
+    _indexTest('main() {}');
+    return _getDefinedFunctions().then((locations) {
+      _assertElementNames(locations, ['main']);
+    });
+  }
+
+  void test_indexUnit_nullUnit() {
+    index.indexUnit(context, null);
+  }
+
+  void test_indexUnit_nullUnitElement() {
+    CompilationUnit unit = new CompilationUnit(null, null, [], [], null);
+    index.indexUnit(context, unit);
+  }
+
+  Future test_removeContext() {
+    _indexTest('main() {}');
+    return _getDefinedFunctions().then((locations) {
+      // OK, there is a location
+      _assertElementNames(locations, ['main']);
+      // remove context
+      index.removeContext(context);
+      return _getDefinedFunctions().then((locations) {
+        expect(locations, isEmpty);
+      });
+    });
+  }
+
+  Future test_removeSource() {
+    Source sourceA = _indexLibraryUnit('/testA.dart', 'fa() {}');
+    _indexLibraryUnit('/testB.dart', 'fb() {}');
+    return _getDefinedFunctions().then((locations) {
+      // OK, there are 2 functions
+      _assertElementNames(locations, ['fa', 'fb']);
+      // remove source
+      index.removeSource(context, sourceA);
+      return _getDefinedFunctions().then((locations) {
+        _assertElementNames(locations, ['fb']);
+      });
+    });
+  }
+
+  Future test_removeSources() {
+    Source sourceA = _indexLibraryUnit('/testA.dart', 'fa() {}');
+    _indexLibraryUnit('/testB.dart', 'fb() {}');
+    return _getDefinedFunctions().then((locations) {
+      // OK, there are 2 functions
+      _assertElementNames(locations, ['fa', 'fb']);
+      // remove source(s)
+      index.removeSources(context, new SingleSourceContainer(sourceA));
+      return _getDefinedFunctions().then((locations) {
+        _assertElementNames(locations, ['fb']);
+      });
+    });
+  }
+
+  void test_statistics() {
+    expect(index.statistics, '[0 locations, 0 sources, 0 names]');
+  }
+
+  Source _addSource(String path, String content) {
+    File file = provider.newFile(path, content);
+    Source source = file.createSource(UriKind.FILE_URI);
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    context.applyChanges(changeSet);
+    context.setContents(source, content);
+    return source;
+  }
+
+  Future<List<Location>> _getDefinedFunctions() {
+    return index.getRelationshipsAsync(UniverseElement.INSTANCE,
+        IndexConstants.DEFINES_FUNCTION);
+  }
+
+  Source _indexLibraryUnit(String path, String content) {
+    Source source = _addSource(path, content);
+    CompilationUnit dartUnit = _resolveLibraryUnit(source);
+    index.indexUnit(context, dartUnit);
+    return source;
+  }
+
+  void _indexTest(String content) {
+    _indexLibraryUnit('/test.dart', content);
+  }
+
+  CompilationUnit _resolveLibraryUnit(Source source) {
+    return context.resolveCompilationUnit2(source, source);
+  }
+}
+
+
+/**
+ * A [RelationshipCallback] that remembers [Location]s.
+ */
+class _RecordingRelationshipCallback extends RelationshipCallback {
+  List<Location> locations;
+
+  @override
+  void hasRelationships(Element element, Relationship relationship,
+      List<Location> locations) {
+    this.locations = locations;
+  }
+}
diff --git a/pkg/analysis_server/test/index/lru_cache_test.dart b/pkg/analysis_server/test/index/lru_cache_test.dart
new file mode 100644
index 0000000..5874a77
--- /dev/null
+++ b/pkg/analysis_server/test/index/lru_cache_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.
+
+library test.index.lru_cache;
+
+import 'package:analysis_server/src/index/lru_cache.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('LRUCache', () {
+    runReflectiveTests(_LRUCacheTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class _LRUCacheTest {
+  LRUCache<int, String> cache = new LRUCache<int, String>(3);
+
+  void test_evict_notGet() {
+    List<int> evictedKeys = new List<int>();
+    List<String> evictedValues = new List<String>();
+    cache = new LRUCache<int, String>(3, (int key, String value) {
+      evictedKeys.add(key);
+      evictedValues.add(value);
+    });
+    // fill
+    cache.put(1, 'A');
+    cache.put(2, 'B');
+    cache.put(3, 'C');
+    // access '1' and '3'
+    cache.get(1);
+    cache.get(3);
+    // put '4', evict '2'
+    cache.put(4, 'D');
+    expect(cache.get(1), 'A');
+    expect(cache.get(2), isNull);
+    expect(cache.get(3), 'C');
+    expect(cache.get(4), 'D');
+    // check eviction listener
+    expect(evictedKeys, contains(2));
+    expect(evictedValues, contains('B'));
+  }
+
+  void test_evict_notPut() {
+    List<int> evictedKeys = new List<int>();
+    List<String> evictedValues = new List<String>();
+    cache = new LRUCache<int, String>(3, (int key, String value) {
+      evictedKeys.add(key);
+      evictedValues.add(value);
+    });
+    // fill
+    cache.put(1, 'A');
+    cache.put(2, 'B');
+    cache.put(3, 'C');
+    // put '1' and '3'
+    cache.put(1, 'AA');
+    cache.put(3, 'CC');
+    // put '4', evict '2'
+    cache.put(4, 'D');
+    expect(cache.get(1), 'AA');
+    expect(cache.get(2), isNull);
+    expect(cache.get(3), 'CC');
+    expect(cache.get(4), 'D');
+    // check eviction listener
+    expect(evictedKeys, contains(2));
+    expect(evictedValues, contains('B'));
+  }
+
+  void test_putGet() {
+    // fill
+    cache.put(1, 'A');
+    cache.put(2, 'B');
+    cache.put(3, 'C');
+    // check
+    expect(cache.get(1), 'A');
+    expect(cache.get(2), 'B');
+    expect(cache.get(3), 'C');
+    expect(cache.get(4), isNull);
+  }
+
+  void test_remove() {
+    cache.put(1, 'A');
+    cache.put(2, 'B');
+    cache.put(3, 'C');
+    // remove
+    cache.remove(1);
+    cache.remove(3);
+    // check
+    expect(cache.get(1), isNull);
+    expect(cache.get(2), 'B');
+    expect(cache.get(3), isNull);
+  }
+}
diff --git a/pkg/analysis_server/test/index/page_node_manager_test.dart b/pkg/analysis_server/test/index/page_node_manager_test.dart
new file mode 100644
index 0000000..56dab61
--- /dev/null
+++ b/pkg/analysis_server/test/index/page_node_manager_test.dart
@@ -0,0 +1,434 @@
+// 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.index.page_node_manager;
+
+import 'dart:math';
+import 'dart:typed_data';
+
+import 'package:analysis_server/src/index/b_plus_tree.dart';
+import 'package:analysis_server/src/index/page_node_manager.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('_CachingNodeManagerTest', () {
+    runReflectiveTests(_CachingNodeManagerTest);
+  });
+  group('FixedStringCodecTest', () {
+    runReflectiveTests(_FixedStringCodecTest);
+  });
+  group('MemoryPageManager', () {
+    runReflectiveTests(_MemoryPageManagerTest);
+  });
+  group('PageNodeManager', () {
+    runReflectiveTests(_PageNodeManagerTest);
+  });
+  group('Uint32CodecTest', () {
+    runReflectiveTests(_Uint32CodecTest);
+  });
+  test('B+ tree with PageNodeManager', _treeWithPageNodeManager);
+}
+
+
+int _intComparator(int a, int b) => a - b;
+
+
+/**
+ * A stress test for [BPlusTree] using [PageNodeManager].
+ */
+_treeWithPageNodeManager() {
+  int pageSize = 256;
+  MemoryPageManager pageManager = new MemoryPageManager(pageSize);
+  NodeManager<int, String, int> nodeManager = new PageNodeManager<int, String>(
+      pageManager, Uint32Codec.INSTANCE, new FixedStringCodec(7));
+//  NodeManager<int, String, int> nodeManager = new MemoryNodeManager();
+  BPlusTree<int, String, int> tree = new BPlusTree(_intComparator, nodeManager);
+  int maxKey = 1000000;
+  int tryCount = 1000;
+  Set<int> keys = new Set<int>();
+  {
+    Random random = new Random(37);
+    for (int i = 0; i < tryCount; i++) {
+      int key = random.nextInt(maxKey);
+      keys.add(key);
+      tree.insert(key, 'V$key');
+    }
+  }
+  // find every
+  for (int key in keys) {
+    expect(tree.find(key), 'V$key');
+  }
+  // remove random keys
+  {
+    Random random = new Random(37);
+    for (int key in new Set<int>.from(keys)) {
+      if (random.nextBool()) {
+        keys.remove(key);
+        expect(tree.remove(key), 'V$key');
+      }
+    }
+  }
+  // find every remaining key
+  for (int key in keys) {
+    expect(tree.find(key), 'V$key');
+  }
+}
+
+
+@ReflectiveTestCase()
+class _CachingNodeManagerTest {
+  _NodeManagerMock<int, String, int> delegate = new _NodeManagerMock<int,
+      String, int>();
+  NodeManager<int, String, int> manager;
+
+  void setUp() {
+    when(delegate.writeIndex).thenReturn((key, value) {
+      delegate.writeIndex(key, value);
+    });
+    when(delegate.writeLeaf).thenReturn((key, value) {
+      delegate.writeLeaf(key, value);
+    });
+    manager = new CachingNodeManager<int, String, int>(delegate, 4, 4);
+    resetInteractions(delegate);
+  }
+
+  void test_createIndex() {
+    when(delegate.createIndex()).thenReturn(77);
+    expect(manager.createIndex(), 77);
+  }
+
+  void test_createLeaf() {
+    when(delegate.createLeaf()).thenReturn(99);
+    expect(manager.createLeaf(), 99);
+  }
+
+  void test_delete() {
+    manager.delete(42);
+    verify(delegate.delete(42)).once();
+  }
+
+  void test_isIndex() {
+    when(delegate.isIndex(1)).thenReturn(true);
+    when(delegate.isIndex(2)).thenReturn(false);
+    expect(manager.isIndex(1), isTrue);
+    expect(manager.isIndex(2), isFalse);
+  }
+
+  void test_maxIndexKeys() {
+    when(delegate.maxIndexKeys).thenReturn(42);
+    expect(manager.maxIndexKeys, 42);
+  }
+
+  void test_maxLeafKeys() {
+    when(delegate.maxLeafKeys).thenReturn(42);
+    expect(manager.maxLeafKeys, 42);
+  }
+
+  void test_readIndex_cache_whenRead() {
+    var data = new IndexNodeData<int, int>([1, 2], [10, 20, 30]);
+    when(delegate.readIndex(2)).thenReturn(data);
+    expect(manager.readIndex(2), data);
+    verify(delegate.readIndex(2)).once();
+    resetInteractions(delegate);
+    // we just read "2", so it should be cached
+    manager.readIndex(2);
+    verify(delegate.readIndex(2)).never();
+  }
+
+  void test_readIndex_cache_whenWrite() {
+    var data = new IndexNodeData<int, int>([1, 2], [10, 20, 30]);
+    manager.writeIndex(2, data);
+    expect(manager.readIndex(2), data);
+    verify(delegate.readLeaf(2)).never();
+    // delete, forces request to the delegate
+    manager.delete(2);
+    manager.readIndex(2);
+    verify(delegate.readIndex(2)).once();
+  }
+
+  void test_readIndex_delegate() {
+    var data = new IndexNodeData<int, int>([1, 2], [10, 20, 30]);
+    when(delegate.readIndex(2)).thenReturn(data);
+    expect(manager.readIndex(2), data);
+  }
+
+  void test_readLeaf_cache_whenRead() {
+    var data = new LeafNodeData<int, String>([1, 2, 3], ['A', 'B', 'C']);
+    when(delegate.readLeaf(2)).thenReturn(data);
+    expect(manager.readLeaf(2), data);
+    verify(delegate.readLeaf(2)).once();
+    resetInteractions(delegate);
+    // we just read "2", so it should be cached
+    manager.readLeaf(2);
+    verify(delegate.readLeaf(2)).never();
+  }
+
+  void test_readLeaf_cache_whenWrite() {
+    var data = new LeafNodeData<int, String>([1, 2, 3], ['A', 'B', 'C']);
+    manager.writeLeaf(2, data);
+    expect(manager.readLeaf(2), data);
+    verify(delegate.readLeaf(2)).never();
+    // delete, forces request to the delegate
+    manager.delete(2);
+    manager.readLeaf(2);
+    verify(delegate.readLeaf(2)).once();
+  }
+
+  void test_readLeaf_delegate() {
+    var data = new LeafNodeData<int, String>([1, 2, 3], ['A', 'B', 'C']);
+    when(delegate.readLeaf(2)).thenReturn(data);
+    expect(manager.readLeaf(2), data);
+  }
+
+  void test_writeIndex() {
+    var data = new IndexNodeData<int, int>([1], [10, 20]);
+    manager.writeIndex(1, data);
+    manager.writeIndex(2, data);
+    manager.writeIndex(3, data);
+    manager.writeIndex(4, data);
+    manager.writeIndex(1, data);
+    verifyZeroInteractions(delegate);
+    // only 4 nodes can be cached, 5-th one cause write to the delegate
+    manager.writeIndex(5, data);
+    verify(delegate.writeIndex(2, data)).once();
+  }
+
+  void test_writeLeaf() {
+    var data = new LeafNodeData<int, String>([1, 2], ['A', 'B']);
+    manager.writeLeaf(1, data);
+    manager.writeLeaf(2, data);
+    manager.writeLeaf(3, data);
+    manager.writeLeaf(4, data);
+    manager.writeLeaf(1, data);
+    verifyZeroInteractions(delegate);
+    // only 4 nodes can be cached, 5-th one cause write to the delegate
+    manager.writeLeaf(5, data);
+    verify(delegate.writeLeaf(2, data)).once();
+  }
+}
+
+
+@ReflectiveTestCase()
+class _FixedStringCodecTest {
+  ByteData buffer;
+  Uint8List bytes = new Uint8List(2 + 2 * 4);
+  FixedStringCodec codec = new FixedStringCodec(4);
+
+  void setUp() {
+    buffer = new ByteData.view(bytes.buffer);
+  }
+
+  test_empty() {
+    // encode
+    codec.encode(buffer, '');
+    expect(bytes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
+    // decode
+    expect(codec.decode(buffer), '');
+  }
+
+  test_fourChars() {
+    // encode
+    codec.encode(buffer, 'ABCD');
+    expect(bytes, [0, 4, 0, 65, 0, 66, 0, 67, 0, 68]);
+    // decode
+    expect(codec.decode(buffer), 'ABCD');
+  }
+
+  test_russian() {
+    // encode
+    codec.encode(buffer, 'ЩУКА');
+    expect(bytes, [0, 4, 4, 41, 4, 35, 4, 26, 4, 16]);
+    // decode
+    expect(codec.decode(buffer), 'ЩУКА');
+  }
+
+  test_tooManyChars() {
+    expect(() {
+      codec.encode(buffer, 'ABCDE');
+    }, throws);
+  }
+
+  test_twoChars() {
+    // encode
+    codec.encode(buffer, 'AB');
+    expect(bytes, [0, 2, 0, 65, 0, 66, 0, 0, 0, 0]);
+    // decode
+    expect(codec.decode(buffer), 'AB');
+  }
+}
+
+
+@ReflectiveTestCase()
+class _MemoryPageManagerTest {
+  static const PAGE_SIZE = 8;
+  MemoryPageManager manager = new MemoryPageManager(PAGE_SIZE);
+
+  test_alloc() {
+    int idA = manager.alloc();
+    int idB = manager.alloc();
+    expect(idB, isNot(idA));
+  }
+
+  test_free() {
+    int id = manager.alloc();
+    manager.free(id);
+    // double free
+    expect(() {
+      manager.free(id);
+    }, throws);
+  }
+
+  test_read() {
+    int id = manager.alloc();
+    Uint8List page = manager.read(id);
+    expect(page.length, PAGE_SIZE);
+  }
+
+  test_read_doesNotExist() {
+    expect(() {
+      manager.read(0);
+    }, throws);
+  }
+
+  test_write() {
+    int id = manager.alloc();
+    // do write
+    {
+      Uint8List page = new Uint8List(PAGE_SIZE);
+      page[3] = 42;
+      manager.write(id, page);
+    }
+    // now read
+    {
+      Uint8List page = manager.read(id);
+      expect(page.length, PAGE_SIZE);
+      expect(page[3], 42);
+    }
+  }
+
+  test_write_doesNotExist() {
+    expect(() {
+      Uint8List page = new Uint8List(PAGE_SIZE);
+      manager.write(42, page);
+    }, throws);
+  }
+
+  test_write_invalidLength() {
+    int id = manager.alloc();
+    Uint8List page = new Uint8List(0);
+    expect(() {
+      manager.write(id, page);
+    }, throws);
+  }
+}
+
+
+
+class _NodeManagerMock<K, V, N> extends TypedMock implements NodeManager<K, V,
+    N> {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+
+@ReflectiveTestCase()
+class _PageNodeManagerTest {
+  static const Codec KEY_CODEC = Uint32Codec.INSTANCE;
+  static const int PAGE_SIZE = 128;
+  static const Codec VALUE_CODEC = const FixedStringCodec(4);
+
+  PageNodeManager<int, String> nodeManager;
+  MemoryPageManager pageManager = new MemoryPageManager(PAGE_SIZE);
+
+  setUp() {
+    nodeManager = new PageNodeManager<int, String>(pageManager, KEY_CODEC,
+        VALUE_CODEC);
+  }
+
+  test_index_createDelete() {
+    int id = nodeManager.createIndex();
+    expect(nodeManager.isIndex(id), isTrue);
+    // do delete
+    nodeManager.delete(id);
+    expect(nodeManager.isIndex(id), isFalse);
+  }
+
+  test_index_readWrite() {
+    int id = nodeManager.createIndex();
+    expect(nodeManager.isIndex(id), isTrue);
+    // write
+    {
+      var keys = [1, 2];
+      var children = [10, 20, 30];
+      nodeManager.writeIndex(id, new IndexNodeData<int, int>(keys, children));
+    }
+    // check the page
+    {
+      Uint8List page = pageManager.read(id);
+      expect(page, [0, 0, 0, 2, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0,
+          2, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0]);
+    }
+    // read
+    {
+      IndexNodeData<int, int> data = nodeManager.readIndex(id);
+      expect(data.keys, [1, 2]);
+      expect(data.children, [10, 20, 30]);
+    }
+  }
+
+  test_leaf_readWrite() {
+    int id = nodeManager.createLeaf();
+    expect(nodeManager.isIndex(id), isFalse);
+    // write
+    {
+      var keys = [1, 2, 3];
+      var children = ['A', 'BB', 'CCC'];
+      nodeManager.writeLeaf(id, new LeafNodeData<int, String>(keys, children));
+    }
+    // check the page
+    {
+      Uint8List page = pageManager.read(id);
+      expect(page, [0, 0, 0, 3, 0, 0, 0, 1, 0, 1, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 2, 0, 2, 0, 66, 0, 66, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 67, 0, 67, 0, 67, 0,
+          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0]);
+    }
+    // read
+    {
+      LeafNodeData<int, String> data = nodeManager.readLeaf(id);
+      expect(data.keys, [1, 2, 3]);
+      expect(data.values, ['A', 'BB', 'CCC']);
+    }
+  }
+}
+
+@ReflectiveTestCase()
+class _Uint32CodecTest {
+  ByteData buffer;
+  Uint8List bytes = new Uint8List(4);
+  Uint32Codec codec = Uint32Codec.INSTANCE;
+
+  void setUp() {
+    buffer = new ByteData.view(bytes.buffer);
+  }
+
+  test_all() {
+    // encode
+    codec.encode(buffer, 42);
+    expect(bytes, [0, 0, 0, 42]);
+    // decode
+    expect(codec.decode(buffer), 42);
+  }
+}
diff --git a/pkg/analysis_server/test/index/store/codec_test.dart b/pkg/analysis_server/test/index/store/codec_test.dart
new file mode 100644
index 0000000..5d5262f
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/codec_test.dart
@@ -0,0 +1,178 @@
+// 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.index.store.codec;
+
+import 'package:analysis_server/src/index/store/codec.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import 'typed_mocks.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('ContextCodec', () {
+    runReflectiveTests(_ContextCodecTest);
+  });
+  group('ElementCodec', () {
+    runReflectiveTests(_ElementCodecTest);
+  });
+  group('RelationshipCodec', () {
+    runReflectiveTests(_RelationshipCodecTest);
+  });
+  group('StringCodec', () {
+    runReflectiveTests(_StringCodecTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class _ContextCodecTest {
+  ContextCodec codec = new ContextCodec();
+
+  void test_encode_decode() {
+    AnalysisContext contextA = new MockAnalysisContext('contextA');
+    AnalysisContext contextB = new MockAnalysisContext('contextB');
+    int idA = codec.encode(contextA);
+    int idB = codec.encode(contextB);
+    expect(idA, codec.encode(contextA));
+    expect(idB, codec.encode(contextB));
+    expect(codec.decode(idA), contextA);
+    expect(codec.decode(idB), contextB);
+  }
+
+  void test_remove() {
+    // encode
+    {
+      AnalysisContext context = new MockAnalysisContext('context');
+      // encode
+      int id = codec.encode(context);
+      expect(id, 0);
+      expect(codec.decode(id), context);
+      // remove
+      codec.remove(context);
+      expect(codec.decode(id), isNull);
+    }
+    // encode again
+    {
+      AnalysisContext context = new MockAnalysisContext('context');
+      // encode
+      int id = codec.encode(context);
+      expect(id, 1);
+      expect(codec.decode(id), context);
+    }
+  }
+}
+
+
+@ReflectiveTestCase()
+class _ElementCodecTest {
+  ElementCodec codec;
+  AnalysisContext context = new MockAnalysisContext('context');
+  StringCodec stringCodec = new StringCodec();
+
+  void setUp() {
+    codec = new ElementCodec(stringCodec);
+  }
+
+  void test_localLocalVariable() {
+    {
+      Element element = new MockElement();
+      ElementLocation location = new ElementLocationImpl.con3(['main', 'foo@1',
+          'bar@2']);
+      when(context.getElement(location)).thenReturn(element);
+      when(element.location).thenReturn(location);
+      int id = codec.encode(element);
+      expect(codec.decode(context, id), element);
+    }
+    {
+      Element element = new MockElement();
+      ElementLocation location = new ElementLocationImpl.con3(['main', 'foo@10',
+          'bar@20']);
+      when(context.getElement(location)).thenReturn(element);
+      when(element.location).thenReturn(location);
+      int id = codec.encode(element);
+      expect(codec.decode(context, id), element);
+    }
+    // check strings, "foo" as a single string, no "foo@1" or "foo@10"
+    expect(stringCodec.nameToIndex, hasLength(3));
+    expect(stringCodec.nameToIndex, containsPair('main', 0));
+    expect(stringCodec.nameToIndex, containsPair('foo', 1));
+    expect(stringCodec.nameToIndex, containsPair('bar', 2));
+  }
+
+  void test_localVariable() {
+    {
+      Element element = new MockElement();
+      ElementLocation location = new ElementLocationImpl.con3(['main',
+          'foo@42']);
+      when(context.getElement(location)).thenReturn(element);
+      when(element.location).thenReturn(location);
+      int id = codec.encode(element);
+      expect(codec.decode(context, id), element);
+    }
+    {
+      Element element = new MockElement();
+      ElementLocation location = new ElementLocationImpl.con3(['main',
+          'foo@4200']);
+      when(context.getElement(location)).thenReturn(element);
+      when(element.location).thenReturn(location);
+      int id = codec.encode(element);
+      expect(codec.decode(context, id), element);
+    }
+    // check strings, "foo" as a single string, no "foo@42" or "foo@4200"
+    expect(stringCodec.nameToIndex, hasLength(2));
+    expect(stringCodec.nameToIndex, containsPair('main', 0));
+    expect(stringCodec.nameToIndex, containsPair('foo', 1));
+  }
+
+  void test_notLocal() {
+    Element element = new MockElement();
+    ElementLocation location = new ElementLocationImpl.con3(['foo', 'bar']);
+    when(element.location).thenReturn(location);
+    when(context.getElement(location)).thenReturn(element);
+    int id = codec.encode(element);
+    expect(codec.encode(element), id);
+    expect(codec.decode(context, id), element);
+    // check strings
+    expect(stringCodec.nameToIndex, hasLength(2));
+    expect(stringCodec.nameToIndex, containsPair('foo', 0));
+    expect(stringCodec.nameToIndex, containsPair('bar', 1));
+  }
+}
+
+
+@ReflectiveTestCase()
+class _RelationshipCodecTest {
+  RelationshipCodec codec;
+  StringCodec stringCodec = new StringCodec();
+
+  void setUp() {
+    codec = new RelationshipCodec(stringCodec);
+  }
+
+  void test_all() {
+    Relationship relationship = Relationship.getRelationship('my-relationship');
+    int id = codec.encode(relationship);
+    expect(codec.decode(id), relationship);
+  }
+}
+
+
+@ReflectiveTestCase()
+class _StringCodecTest {
+  StringCodec codec = new StringCodec();
+
+  void test_all() {
+    int idA = codec.encode('aaa');
+    int idB = codec.encode('bbb');
+    expect(codec.decode(idA), 'aaa');
+    expect(codec.decode(idB), 'bbb');
+  }
+}
diff --git a/pkg/analysis_server/test/index/store/collection_test.dart b/pkg/analysis_server/test/index/store/collection_test.dart
new file mode 100644
index 0000000..382510b
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/collection_test.dart
@@ -0,0 +1,83 @@
+// 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.index.store.collection;
+
+import 'package:analysis_server/src/index/store/collection.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('IntArrayToIntMap', () {
+    runReflectiveTests(_IntArrayToIntMapTest);
+  });
+  group('IntToIntSetMap', () {
+    runReflectiveTests(_IntToIntSetMapTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class _IntArrayToIntMapTest {
+  IntArrayToIntMap map = new IntArrayToIntMap();
+
+  void test_put_get() {
+    map[<int>[1, 2, 3]] = 1;
+    map[<int>[2, 3, 4, 5]] = 2;
+    expect(map[<int>[0]], isNull);
+    expect(map[<int>[1, 2, 3]], 1);
+    expect(map[<int>[2, 3, 4, 5]], 2);
+  }
+}
+
+
+@ReflectiveTestCase()
+class _IntToIntSetMapTest {
+  IntToIntSetMap map = new IntToIntSetMap();
+
+  void test_add_duplicate() {
+    map.add(1, 0);
+    map.add(1, 0);
+    List<int> set = map.get(1);
+    expect(set, hasLength(1));
+  }
+
+  void test_clear() {
+    map.add(1, 10);
+    map.add(2, 20);
+    expect(map.length, 2);
+    map.clear();
+    expect(map.length, 0);
+  }
+
+  void test_get() {
+    map.add(1, 10);
+    map.add(1, 11);
+    map.add(1, 12);
+    map.add(2, 20);
+    map.add(2, 21);
+    expect(map.get(1), unorderedEquals([10, 11, 12]));
+    expect(map.get(2), unorderedEquals([20, 21]));
+  }
+
+  void test_get_no() {
+    expect(map.get(3), []);
+  }
+
+  void test_length() {
+    expect(map.length, 0);
+    map.add(1, 10);
+    expect(map.length, 1);
+    map.add(1, 11);
+    map.add(1, 12);
+    expect(map.length, 1);
+    map.add(2, 20);
+    expect(map.length, 2);
+    map.add(2, 21);
+    expect(map.length, 2);
+  }
+}
diff --git a/pkg/analysis_server/test/index/store/memory_node_manager.dart b/pkg/analysis_server/test/index/store/memory_node_manager.dart
new file mode 100644
index 0000000..3a9209e
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/memory_node_manager.dart
@@ -0,0 +1,96 @@
+// 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.index.store_memory_node_manager;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analysis_server/src/index/store/codec.dart';
+import 'package:analysis_server/src/index/store/split_store.dart';
+import 'package:analyzer/src/generated/engine.dart';
+
+
+class MemoryNodeManager implements NodeManager {
+  ContextCodec _contextCodec = new ContextCodec();
+  ElementCodec _elementCodec;
+  int _locationCount = 0;
+  final Map<String, int> _nodeLocationCounts = new HashMap<String, int>();
+  final Map<String, IndexNode> _nodes = new HashMap<String, IndexNode>();
+  RelationshipCodec _relationshipCodec;
+  StringCodec _stringCodec = new StringCodec();
+
+  MemoryNodeManager() {
+    _elementCodec = new ElementCodec(_stringCodec);
+    _relationshipCodec = new RelationshipCodec(_stringCodec);
+  }
+
+  @override
+  ContextCodec get contextCodec {
+    return _contextCodec;
+  }
+
+  @override
+  ElementCodec get elementCodec {
+    return _elementCodec;
+  }
+
+  @override
+  int get locationCount {
+    return _locationCount;
+  }
+
+  @override
+  StringCodec get stringCodec {
+    return _stringCodec;
+  }
+
+  @override
+  void clear() {
+    _nodes.clear();
+  }
+
+  int getLocationCount(String name) {
+    int locationCount = _nodeLocationCounts[name];
+    return locationCount != null ? locationCount : 0;
+  }
+
+  @override
+  Future<IndexNode> getNode(String name) {
+    return new Future.value(_nodes[name]);
+  }
+
+  bool isEmpty() {
+    for (IndexNode node in _nodes.values) {
+      Map<RelationKeyData, List<LocationData>> relations = node.relations;
+      if (!relations.isEmpty) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  IndexNode newNode(AnalysisContext context) {
+    return new IndexNode(context, elementCodec, _relationshipCodec);
+  }
+
+  @override
+  void putNode(String name, IndexNode node) {
+    // update location count
+    {
+      _locationCount -= getLocationCount(name);
+      int nodeLocationCount = node.locationCount;
+      _nodeLocationCounts[name] = nodeLocationCount;
+      _locationCount += nodeLocationCount;
+    }
+    // remember the node
+    _nodes[name] = node;
+  }
+
+  @override
+  void removeNode(String name) {
+    _nodes.remove(name);
+  }
+}
diff --git a/pkg/analysis_server/test/index/store/separate_file_manager_test.dart b/pkg/analysis_server/test/index/store/separate_file_manager_test.dart
new file mode 100644
index 0000000..6c3c0e2
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/separate_file_manager_test.dart
@@ -0,0 +1,77 @@
+// 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.index.store.separate_file_mananer;
+
+import 'dart:io';
+
+import 'package:analysis_server/src/index/store/separate_file_manager.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('SeparateFileManager', () {
+    runReflectiveTests(_SeparateFileManagerTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class _SeparateFileManagerTest {
+  SeparateFileManager fileManager;
+  Directory tempDir;
+
+  void setUp() {
+    tempDir = Directory.systemTemp.createTempSync('AnalysisServer_index');
+    fileManager = new SeparateFileManager(tempDir);
+  }
+
+  void tearDown() {
+    tempDir.delete(recursive: true);
+  }
+
+  test_clear() {
+    String name = "42.index";
+    // create the file
+    return fileManager.write(name, <int>[1, 2, 3, 4]).then((_) {
+      // check that the file exists
+      expect(_existsSync(name), isTrue);
+      // clear
+      fileManager.clear();
+      expect(_existsSync(name), isFalse);
+    });
+  }
+
+  test_delete_doesNotExist() {
+    String name = "42.index";
+    fileManager.delete(name);
+  }
+
+  test_outputInput() {
+    String name = "42.index";
+    // create the file
+    return fileManager.write(name, <int>[1, 2, 3, 4]).then((_) {
+      // check that that the file exists
+      expect(_existsSync(name), isTrue);
+      // read the file
+      return fileManager.read(name).then((bytes) {
+        expect(bytes, <int>[1, 2, 3, 4]);
+        // delete
+        fileManager.delete(name);
+        // the file does not exist anymore
+        return fileManager.read(name).then((bytes) {
+          expect(bytes, isNull);
+        });
+      });
+    });
+  }
+
+  bool _existsSync(String name) {
+    return new File(join(tempDir.path, name)).existsSync();
+  }
+}
diff --git a/pkg/analysis_server/test/index/store/single_source_container.dart b/pkg/analysis_server/test/index/store/single_source_container.dart
new file mode 100644
index 0000000..4968217
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/single_source_container.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.
+
+library test.index.store_single_source_container;
+
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * A [SourceContainer] with a single [Source].
+ */
+class SingleSourceContainer implements SourceContainer {
+  final Source _source;
+
+  SingleSourceContainer(this._source);
+
+  @override
+  bool contains(Source source) => source == _source;
+}
diff --git a/pkg/analysis_server/test/index/store/split_store_test.dart b/pkg/analysis_server/test/index/store/split_store_test.dart
new file mode 100644
index 0000000..cc1b5c1
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/split_store_test.dart
@@ -0,0 +1,1066 @@
+// 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.index.split_store;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/index/store/codec.dart';
+import 'package:analysis_server/src/index/store/split_store.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import 'memory_node_manager.dart';
+import 'single_source_container.dart';
+import 'typed_mocks.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('FileNodeManager', () {
+    runReflectiveTests(_FileNodeManagerTest);
+  });
+  group('IndexNode', () {
+    runReflectiveTests(_IndexNodeTest);
+  });
+  group('LocationData', () {
+    runReflectiveTests(_LocationDataTest);
+  });
+  group('RelationKeyData', () {
+    runReflectiveTests(_RelationKeyDataTest);
+  });
+  group('SplitIndexStore', () {
+    runReflectiveTests(_SplitIndexStoreTest);
+  });
+}
+
+
+void _assertHasLocation(List<Location> locations, Element element, int offset,
+    int length) {
+  for (Location location in locations) {
+    if ((element == null || location.element == element) && location.offset ==
+        offset && location.length == length) {
+      return;
+    }
+  }
+  fail('Expected to find Location'
+      '(element=$element, offset=$offset, length=$length)');
+}
+
+
+@ReflectiveTestCase()
+class _FileNodeManagerTest {
+  AnalysisContext context = new MockAnalysisContext('context');
+  ContextCodec contextCodec = new MockContextCodec();
+  int contextId = 13;
+  ElementCodec elementCodec = new MockElementCodec();
+  FileManager fileManager = new _MockFileManager();
+  MockLogger logger = new MockLogger();
+  int nextElementId = 0;
+  FileNodeManager nodeManager;
+  RelationshipCodec relationshipCodec;
+  StringCodec stringCodec = new StringCodec();
+
+  void setUp() {
+    relationshipCodec = new RelationshipCodec(stringCodec);
+    nodeManager = new FileNodeManager(fileManager, logger, stringCodec,
+        contextCodec, elementCodec, relationshipCodec);
+    when(contextCodec.encode(context)).thenReturn(contextId);
+    when(contextCodec.decode(contextId)).thenReturn(context);
+  }
+
+  void test_clear() {
+    nodeManager.clear();
+    verify(fileManager.clear()).once();
+  }
+
+  void test_getLocationCount_empty() {
+    expect(nodeManager.locationCount, 0);
+  }
+
+  void test_getNode_contextNull() {
+    String name = '42.index';
+    // record bytes
+    List<int> bytes;
+    when(fileManager.write(name, anyObject)).thenInvoke((name, bs) {
+      bytes = bs;
+    });
+    // put Node
+    Future putFuture;
+    {
+      IndexNode node = new IndexNode(context, elementCodec, relationshipCodec);
+      putFuture = nodeManager.putNode(name, node);
+    }
+    // do in the "put" Future
+    putFuture.then((_) {
+      // force "null" context
+      when(contextCodec.decode(contextId)).thenReturn(null);
+      // prepare input bytes
+      when(fileManager.read(name)).thenReturn(new Future.value(bytes));
+      // get Node
+      return nodeManager.getNode(name).then((IndexNode node) {
+        expect(node, isNull);
+        // no exceptions
+        verifyZeroInteractions(logger);
+      });
+    });
+  }
+
+  test_getNode_invalidVersion() {
+    String name = '42.index';
+    // prepare a stream with an invalid version
+    when(fileManager.read(name)).thenReturn(new Future.value([0x01, 0x02, 0x03,
+        0x04]));
+    // do in the Future
+    return nodeManager.getNode(name).then((IndexNode node) {
+      // no IndexNode
+      expect(node, isNull);
+      // failed
+      verify(logger.logError2(anyObject, anyObject)).once();
+    });
+  }
+
+  test_getNode_streamException() {
+    String name = '42.index';
+    when(fileManager.read(name)).thenReturn(new Future(() {
+      return throw new Exception();
+    }));
+    // do in the Future
+    return nodeManager.getNode(name).then((IndexNode node) {
+      expect(node, isNull);
+      // failed
+      verify(logger.logError2(anyString, anyObject)).once();
+    });
+  }
+
+  test_getNode_streamNull() {
+    String name = '42.index';
+    when(fileManager.read(name)).thenReturn(new Future.value(null));
+    // do in the Future
+    return nodeManager.getNode(name).then((IndexNode node) {
+      expect(node, isNull);
+      // OK
+      verifyZeroInteractions(logger);
+    });
+  }
+
+  void test_newNode() {
+    IndexNode node = nodeManager.newNode(context);
+    expect(node.context, context);
+    expect(node.locationCount, 0);
+  }
+
+  test_putNode_getNode() {
+    String name = '42.index';
+    // record bytes
+    List<int> bytes;
+    when(fileManager.write(name, anyObject)).thenInvoke((name, bs) {
+      bytes = bs;
+    });
+    // prepare elements
+    Element elementA = _mockElement();
+    Element elementB = _mockElement();
+    Element elementC = _mockElement();
+    Relationship relationship = Relationship.getRelationship('my-relationship');
+    // put Node
+    Future putFuture;
+    {
+      // prepare relations
+      int elementIdA = 0;
+      int elementIdB = 1;
+      int elementIdC = 2;
+      int relationshipId = relationshipCodec.encode(relationship);
+      RelationKeyData key = new RelationKeyData.forData(elementIdA,
+          relationshipId);
+      List<LocationData> locations = [new LocationData.forData(elementIdB, 1,
+          10), new LocationData.forData(elementIdC, 2, 20)];
+      Map<RelationKeyData, List<LocationData>> relations = {
+        key: locations
+      };
+      // prepare Node
+      IndexNode node = new _MockIndexNode();
+      when(node.context).thenReturn(context);
+      when(node.relations).thenReturn(relations);
+      when(node.locationCount).thenReturn(2);
+      // put Node
+      putFuture = nodeManager.putNode(name, node);
+    }
+    // do in the Future
+    putFuture.then((_) {
+      // has locations
+      expect(nodeManager.locationCount, 2);
+      // prepare input bytes
+      when(fileManager.read(name)).thenReturn(new Future.value(bytes));
+      // get Node
+      return nodeManager.getNode(name).then((IndexNode node) {
+        expect(2, node.locationCount);
+        {
+          List<Location> locations = node.getRelationships(elementA,
+              relationship);
+          expect(locations, hasLength(2));
+          _assertHasLocation(locations, elementB, 1, 10);
+          _assertHasLocation(locations, elementC, 2, 20);
+        }
+      });
+    });
+  }
+
+  test_putNode_streamException() {
+    String name = '42.index';
+    Exception exception = new Exception();
+    when(fileManager.write(name, anyObject)).thenReturn(new Future(() {
+      return throw exception;
+    }));
+    // prepare IndexNode
+    IndexNode node = new _MockIndexNode();
+    when(node.context).thenReturn(context);
+    when(node.locationCount).thenReturn(0);
+    when(node.relations).thenReturn({});
+    // try to put
+    return nodeManager.putNode(name, node).then((_) {
+      // failed
+      verify(logger.logError2(anyString, anyObject)).once();
+    });
+  }
+
+  void test_removeNode() {
+    String name = '42.index';
+    nodeManager.removeNode(name);
+    verify(fileManager.delete(name)).once();
+  }
+
+  Element _mockElement() {
+    int elementId = nextElementId++;
+    Element element = new MockElement();
+    when(elementCodec.encode(element)).thenReturn(elementId);
+    when(elementCodec.decode(context, elementId)).thenReturn(element);
+    return element;
+  }
+}
+
+
+@ReflectiveTestCase()
+class _IndexNodeTest {
+  AnalysisContext context = new MockAnalysisContext('context');
+  ElementCodec elementCodec = new MockElementCodec();
+  int nextElementId = 0;
+  IndexNode node;
+  RelationshipCodec relationshipCodec;
+  StringCodec stringCodec = new StringCodec();
+
+  void setUp() {
+    relationshipCodec = new RelationshipCodec(stringCodec);
+    node = new IndexNode(context, elementCodec, relationshipCodec);
+  }
+
+  void test_getContext() {
+    expect(node.context, context);
+  }
+
+  void test_recordRelationship() {
+    Element elementA = _mockElement();
+    Element elementB = _mockElement();
+    Element elementC = _mockElement();
+    Relationship relationship = Relationship.getRelationship('my-relationship');
+    Location locationA = new Location(elementB, 1, 2);
+    Location locationB = new Location(elementC, 10, 20);
+    // empty initially
+    expect(node.locationCount, 0);
+    // record
+    node.recordRelationship(elementA, relationship, locationA);
+    expect(node.locationCount, 1);
+    node.recordRelationship(elementA, relationship, locationB);
+    expect(node.locationCount, 2);
+    // get relations
+    expect(node.getRelationships(elementB, relationship), isEmpty);
+    {
+      List<Location> locations = node.getRelationships(elementA, relationship);
+      expect(locations, hasLength(2));
+      _assertHasLocation(locations, null, 1, 2);
+      _assertHasLocation(locations, null, 10, 20);
+    }
+    // verify relations map
+    {
+      Map<RelationKeyData, List<LocationData>> relations = node.relations;
+      expect(relations, hasLength(1));
+      List<LocationData> locations = relations.values.first;
+      expect(locations, hasLength(2));
+    }
+  }
+
+  void test_setRelations() {
+    Element elementA = _mockElement();
+    Element elementB = _mockElement();
+    Element elementC = _mockElement();
+    Relationship relationship = Relationship.getRelationship('my-relationship');
+    // record
+    {
+      int elementIdA = 0;
+      int elementIdB = 1;
+      int elementIdC = 2;
+      int relationshipId = relationshipCodec.encode(relationship);
+      RelationKeyData key = new RelationKeyData.forData(elementIdA,
+          relationshipId);
+      List<LocationData> locations = [new LocationData.forData(elementIdB, 1,
+          10), new LocationData.forData(elementIdC, 2, 20)];
+      node.relations = {
+        key: locations
+      };
+    }
+    // request
+    List<Location> locations = node.getRelationships(elementA, relationship);
+    expect(locations, hasLength(2));
+    _assertHasLocation(locations, elementB, 1, 10);
+    _assertHasLocation(locations, elementC, 2, 20);
+  }
+
+  Element _mockElement() {
+    int elementId = nextElementId++;
+    Element element = new MockElement();
+    when(elementCodec.encode(element)).thenReturn(elementId);
+    when(elementCodec.decode(context, elementId)).thenReturn(element);
+    return element;
+  }
+}
+
+
+@ReflectiveTestCase()
+class _LocationDataTest {
+  AnalysisContext context = new MockAnalysisContext('context');
+  ElementCodec elementCodec = new MockElementCodec();
+  StringCodec stringCodec = new StringCodec();
+
+  void test_newForData() {
+    Element element = new MockElement();
+    when(elementCodec.decode(context, 0)).thenReturn(element);
+    LocationData locationData = new LocationData.forData(0, 1, 2);
+    Location location = locationData.getLocation(context, elementCodec);
+    expect(location.element, element);
+    expect(location.offset, 1);
+    expect(location.length, 2);
+  }
+
+  void test_newForObject() {
+    // prepare Element
+    Element element = new MockElement();
+    when(elementCodec.encode(element)).thenReturn(42);
+    when(elementCodec.decode(context, 42)).thenReturn(element);
+    // create
+    Location location = new Location(element, 1, 2);
+    LocationData locationData = new LocationData.forObject(elementCodec,
+        location);
+    // touch 'hashCode'
+    locationData.hashCode;
+    // ==
+    expect(locationData == new LocationData.forData(42, 1, 2), isTrue);
+    // getLocation()
+    {
+      Location newLocation = locationData.getLocation(context, elementCodec);
+      expect(location.element, element);
+      expect(location.offset, 1);
+      expect(location.length, 2);
+    }
+    // no Element - no Location
+    {
+      when(elementCodec.decode(context, 42)).thenReturn(null);
+      Location newLocation = locationData.getLocation(context, elementCodec);
+      expect(newLocation, isNull);
+    }
+  }
+}
+
+
+/**
+ * [Location] has no [==] and [hashCode], so to compare locations by value we
+ * need to wrap them into such object.
+ */
+class _LocationEqualsWrapper {
+  final Location location;
+
+  _LocationEqualsWrapper(this.location);
+
+  @override
+  int get hashCode {
+    return 31 * (31 * location.element.hashCode + location.offset) +
+        location.length;
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is _LocationEqualsWrapper) {
+      return other.location.offset == location.offset && other.location.length
+          == location.length && other.location.element == location.element;
+    }
+    return false;
+  }
+}
+
+
+class _MockFileManager extends TypedMock implements FileManager {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class _MockIndexNode extends TypedMock implements IndexNode {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+@ReflectiveTestCase()
+class _RelationKeyDataTest {
+  AnalysisContext context = new MockAnalysisContext('context');
+  ElementCodec elementCodec = new MockElementCodec();
+  RelationshipCodec relationshipCodec = new MockRelationshipCodec();
+  StringCodec stringCodec = new StringCodec();
+
+  void test_newFromData() {
+    RelationKeyData keyData = new RelationKeyData.forData(1, 2);
+    // equals
+    expect(keyData == this, isFalse);
+    expect(keyData == new RelationKeyData.forData(10, 20), isFalse);
+    expect(keyData == keyData, isTrue);
+    expect(keyData == new RelationKeyData.forData(1, 2), isTrue);
+  }
+
+  void test_newFromObjects() {
+    // prepare Element
+    Element element;
+    int elementId = 2;
+    {
+      element = new MockElement();
+      ElementLocation location = new ElementLocationImpl.con3(['foo', 'bar']);
+      when(element.location).thenReturn(location);
+      when(context.getElement(location)).thenReturn(element);
+      when(elementCodec.encode(element)).thenReturn(elementId);
+    }
+    // prepare relationship
+    Relationship relationship = Relationship.getRelationship('my-relationship');
+    int relationshipId = 1;
+    when(relationshipCodec.encode(relationship)).thenReturn(relationshipId);
+    // create RelationKeyData
+    RelationKeyData keyData = new RelationKeyData.forObject(elementCodec,
+        relationshipCodec, element, relationship);
+    // touch
+    keyData.hashCode;
+    // equals
+    expect(keyData == this, isFalse);
+    expect(keyData == new RelationKeyData.forData(10, 20), isFalse);
+    expect(keyData == keyData, isTrue);
+    expect(keyData == new RelationKeyData.forData(elementId, relationshipId),
+        isTrue);
+  }
+}
+
+
+
+
+@ReflectiveTestCase()
+class _SplitIndexStoreTest {
+  AnalysisContext contextA = new MockAnalysisContext('contextA');
+
+  AnalysisContext contextB = new MockAnalysisContext('contextB');
+
+  AnalysisContext contextC = new MockAnalysisContext('contextC');
+
+  Element elementA = new MockElement('elementA');
+  Element elementB = new MockElement('elementB');
+
+  Element elementC = new MockElement('elementC');
+  Element elementD = new MockElement('elementD');
+  ElementLocation elementLocationA = new ElementLocationImpl.con3(
+      ['/home/user/sourceA.dart', 'ClassA']);
+  ElementLocation elementLocationB = new ElementLocationImpl.con3(
+      ['/home/user/sourceB.dart', 'ClassB']);
+  ElementLocation elementLocationC = new ElementLocationImpl.con3(
+      ['/home/user/sourceC.dart', 'ClassC']);
+  ElementLocation elementLocationD = new ElementLocationImpl.con3(
+      ['/home/user/sourceD.dart', 'ClassD']);
+  HtmlElement htmlElementA = new MockHtmlElement();
+  HtmlElement htmlElementB = new MockHtmlElement();
+  LibraryElement libraryElement = new MockLibraryElement();
+  Source librarySource = new MockSource('librarySource');
+  CompilationUnitElement libraryUnitElement = new MockCompilationUnitElement();
+  MemoryNodeManager nodeManager = new MemoryNodeManager();
+  Relationship relationship = Relationship.getRelationship('test-relationship');
+  Source sourceA = new MockSource('sourceA');
+  Source sourceB = new MockSource('sourceB');
+  Source sourceC = new MockSource('sourceC');
+  Source sourceD = new MockSource('sourceD');
+  SplitIndexStore store;
+  CompilationUnitElement unitElementA = new MockCompilationUnitElement();
+  CompilationUnitElement unitElementB = new MockCompilationUnitElement();
+  CompilationUnitElement unitElementC = new MockCompilationUnitElement();
+  CompilationUnitElement unitElementD = new MockCompilationUnitElement();
+  void setUp() {
+    store = new SplitIndexStore(nodeManager);
+    when(contextA.isDisposed).thenReturn(false);
+    when(contextB.isDisposed).thenReturn(false);
+    when(contextC.isDisposed).thenReturn(false);
+    when(contextA.getElement(elementLocationA)).thenReturn(elementA);
+    when(contextA.getElement(elementLocationB)).thenReturn(elementB);
+    when(contextA.getElement(elementLocationC)).thenReturn(elementC);
+    when(contextA.getElement(elementLocationD)).thenReturn(elementD);
+    when(sourceA.fullName).thenReturn('/home/user/sourceA.dart');
+    when(sourceB.fullName).thenReturn('/home/user/sourceB.dart');
+    when(sourceC.fullName).thenReturn('/home/user/sourceC.dart');
+    when(sourceD.fullName).thenReturn('/home/user/sourceD.dart');
+    when(elementA.context).thenReturn(contextA);
+    when(elementB.context).thenReturn(contextA);
+    when(elementC.context).thenReturn(contextA);
+    when(elementD.context).thenReturn(contextA);
+    when(elementA.location).thenReturn(elementLocationA);
+    when(elementB.location).thenReturn(elementLocationB);
+    when(elementC.location).thenReturn(elementLocationC);
+    when(elementD.location).thenReturn(elementLocationD);
+    when(elementA.enclosingElement).thenReturn(unitElementA);
+    when(elementB.enclosingElement).thenReturn(unitElementB);
+    when(elementC.enclosingElement).thenReturn(unitElementC);
+    when(elementD.enclosingElement).thenReturn(unitElementD);
+    when(elementA.source).thenReturn(sourceA);
+    when(elementB.source).thenReturn(sourceB);
+    when(elementC.source).thenReturn(sourceC);
+    when(elementD.source).thenReturn(sourceD);
+    when(elementA.library).thenReturn(libraryElement);
+    when(elementB.library).thenReturn(libraryElement);
+    when(elementC.library).thenReturn(libraryElement);
+    when(elementD.library).thenReturn(libraryElement);
+    when(unitElementA.source).thenReturn(sourceA);
+    when(unitElementB.source).thenReturn(sourceB);
+    when(unitElementC.source).thenReturn(sourceC);
+    when(unitElementD.source).thenReturn(sourceD);
+    when(unitElementA.library).thenReturn(libraryElement);
+    when(unitElementB.library).thenReturn(libraryElement);
+    when(unitElementC.library).thenReturn(libraryElement);
+    when(unitElementD.library).thenReturn(libraryElement);
+    when(htmlElementA.source).thenReturn(sourceA);
+    when(htmlElementB.source).thenReturn(sourceB);
+    // library
+    when(libraryUnitElement.library).thenReturn(libraryElement);
+    when(libraryUnitElement.source).thenReturn(librarySource);
+    when(libraryElement.source).thenReturn(librarySource);
+    when(libraryElement.definingCompilationUnit).thenReturn(libraryUnitElement);
+  }
+
+  void test_aboutToIndexDart_disposedContext() {
+    when(contextA.isDisposed).thenReturn(true);
+    expect(store.aboutToIndexDart(contextA, unitElementA), isFalse);
+  }
+
+  void test_aboutToIndexDart_disposedContext_wrapped() {
+    when(contextA.isDisposed).thenReturn(true);
+    InstrumentedAnalysisContextImpl instrumentedContext =
+        new MockInstrumentedAnalysisContextImpl();
+    when(instrumentedContext.basis).thenReturn(contextA);
+    expect(store.aboutToIndexDart(instrumentedContext, unitElementA), isFalse);
+  }
+
+  void test_aboutToIndexDart_library_first() {
+    when(libraryElement.parts).thenReturn(<CompilationUnitElement>[unitElementA,
+        unitElementB]);
+    {
+      store.aboutToIndexDart(contextA, libraryUnitElement);
+      store.doneIndex();
+    }
+    {
+      List<Location> locations = store.getRelationships(elementA, relationship);
+      assertLocations(locations, []);
+    }
+  }
+
+  test_aboutToIndexDart_library_secondWithoutOneUnit() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    // "A" and "B" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // apply "libraryUnitElement", only with "B"
+      when(libraryElement.parts).thenReturn([unitElementB]);
+      {
+        store.aboutToIndexDart(contextA, libraryUnitElement);
+        store.doneIndex();
+      }
+      return store.getRelationshipsAsync(elementA, relationship).then(
+          (List<Location> locations) {
+        assertLocations(locations, [locationB]);
+      });
+    });
+  }
+
+  void test_aboutToIndexDart_nullLibraryElement() {
+    when(unitElementA.library).thenReturn(null);
+    expect(store.aboutToIndexDart(contextA, unitElementA), isFalse);
+  }
+
+  void test_aboutToIndexDart_nullLibraryUnitElement() {
+    when(libraryElement.definingCompilationUnit).thenReturn(null);
+    expect(store.aboutToIndexDart(contextA, unitElementA), isFalse);
+  }
+
+  void test_aboutToIndexDart_nullUnitElement() {
+    expect(store.aboutToIndexDart(contextA, null), isFalse);
+  }
+
+  test_aboutToIndexHtml_() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexHtml(contextA, htmlElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexHtml(contextA, htmlElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    // "A" and "B" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    });
+  }
+
+  void test_aboutToIndexHtml_disposedContext() {
+    when(contextA.isDisposed).thenReturn(true);
+    expect(store.aboutToIndexHtml(contextA, htmlElementA), isFalse);
+  }
+
+  void test_clear() {
+    Location locationA = mockLocation(elementA);
+    store.aboutToIndexDart(contextA, unitElementA);
+    store.recordRelationship(elementA, relationship, locationA);
+    store.doneIndex();
+    expect(nodeManager.isEmpty(), isFalse);
+    // clear
+    store.clear();
+    expect(nodeManager.isEmpty(), isTrue);
+  }
+
+  test_getRelationships_empty() {
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      expect(locations, isEmpty);
+    });
+  }
+
+  void test_getStatistics() {
+    // empty initially
+    {
+      String statistics = store.statistics;
+      expect(statistics, contains('0 locations'));
+      expect(statistics, contains('0 sources'));
+    }
+    // add 2 locations
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    {
+      String statistics = store.statistics;
+      expect(statistics, contains('2 locations'));
+      expect(statistics, contains('3 sources'));
+    }
+  }
+
+  void test_recordRelationship_nullElement() {
+    Location locationA = mockLocation(elementA);
+    store.recordRelationship(null, relationship, locationA);
+    store.doneIndex();
+    expect(nodeManager.isEmpty(), isTrue);
+  }
+
+  void test_recordRelationship_nullLocation() {
+    store.recordRelationship(elementA, relationship, null);
+    store.doneIndex();
+    expect(nodeManager.isEmpty(), isTrue);
+  }
+
+  test_recordRelationship_oneElement_twoNodes() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    });
+  }
+
+  test_recordRelationship_oneLocation() {
+    Location locationA = mockLocation(elementA);
+    store.aboutToIndexDart(contextA, unitElementA);
+    store.recordRelationship(elementA, relationship, locationA);
+    store.doneIndex();
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA]);
+    });
+  }
+
+  test_recordRelationship_twoLocations() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementA);
+    store.aboutToIndexDart(contextA, unitElementA);
+    store.recordRelationship(elementA, relationship, locationA);
+    store.recordRelationship(elementA, relationship, locationB);
+    store.doneIndex();
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    });
+  }
+
+  test_removeContext() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    // "A" and "B" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // remove "A" context
+      store.removeContext(contextA);
+      return store.getRelationshipsAsync(elementA, relationship).then(
+          (List<Location> locations) {
+        assertLocations(locations, []);
+      });
+    });
+  }
+
+  void test_removeContext_nullContext() {
+    store.removeContext(null);
+  }
+
+  test_removeSource_library() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    Location locationC = mockLocation(elementC);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementC);
+      store.recordRelationship(elementA, relationship, locationC);
+      store.doneIndex();
+    }
+    // "A", "B" and "C" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB, locationC]);
+    }).then((_) {
+      // remove "librarySource"
+      store.removeSource(contextA, librarySource);
+      return store.getRelationshipsAsync(elementA, relationship).then(
+          (List<Location> locations) {
+        assertLocations(locations, []);
+      });
+    });
+  }
+
+  void test_removeSource_nullContext() {
+    store.removeSource(null, sourceA);
+  }
+
+  test_removeSource_unit() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    Location locationC = mockLocation(elementC);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementC);
+      store.recordRelationship(elementA, relationship, locationC);
+      store.doneIndex();
+    }
+    // "A", "B" and "C" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB, locationC]);
+    }).then((_) {
+      // remove "A" source
+      store.removeSource(contextA, sourceA);
+      return store.getRelationshipsAsync(elementA, relationship).then(
+          (List<Location> locations) {
+        assertLocations(locations, [locationB, locationC]);
+      });
+    });
+  }
+
+  test_removeSources_library() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    // "A" and "B" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // remove "librarySource"
+      store.removeSources(contextA, new SingleSourceContainer(librarySource));
+      return store.getRelationshipsAsync(elementA, relationship).then(
+          (List<Location> locations) {
+        assertLocations(locations, []);
+      });
+    });
+  }
+
+  void test_removeSources_nullContext() {
+    store.removeSources(null, null);
+  }
+
+  test_removeSources_unit() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    Location locationC = mockLocation(elementC);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementC);
+      store.recordRelationship(elementA, relationship, locationC);
+      store.doneIndex();
+    }
+    // "A", "B" and "C" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB, locationC]);
+    }).then((_) {
+      // remove "A" source
+      store.removeSources(contextA, new SingleSourceContainer(sourceA));
+      store.removeSource(contextA, sourceA);
+      return store.getRelationshipsAsync(elementA, relationship).then(
+          (List<Location> locations) {
+        assertLocations(locations, [locationB, locationC]);
+      });
+    });
+  }
+
+  test_universe_aboutToIndex() {
+    when(contextA.getElement(elementLocationA)).thenReturn(elementA);
+    when(contextB.getElement(elementLocationB)).thenReturn(elementB);
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextB, unitElementB);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationB);
+      store.doneIndex();
+    }
+    // get relationships
+    return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+        relationship).then((List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // re-index "unitElementA"
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.doneIndex();
+      return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+          relationship).then((List<Location> locations) {
+        assertLocations(locations, [locationB]);
+      });
+    });
+  }
+
+  test_universe_clear() {
+    when(contextA.getElement(elementLocationA)).thenReturn(elementA);
+    when(contextB.getElement(elementLocationB)).thenReturn(elementB);
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationB);
+      store.doneIndex();
+    }
+    return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+        relationship).then((List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // clear
+      store.clear();
+      return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+          relationship).then((List<Location> locations) {
+        expect(locations, isEmpty);
+      });
+    });
+  }
+
+  test_universe_removeContext() {
+    when(contextA.getElement(elementLocationA)).thenReturn(elementA);
+    when(contextB.getElement(elementLocationB)).thenReturn(elementB);
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextB, unitElementB);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationB);
+      store.doneIndex();
+    }
+    return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+        relationship).then((List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // remove "contextA"
+      store.removeContext(contextA);
+      return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+          relationship).then((List<Location> locations) {
+        assertLocations(locations, [locationB]);
+      });
+    });
+  }
+
+  test_universe_removeSource() {
+    when(contextA.getElement(elementLocationA)).thenReturn(elementA);
+    when(contextB.getElement(elementLocationB)).thenReturn(elementB);
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationB);
+      store.doneIndex();
+    }
+    return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+        relationship).then((List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // remove "sourceA"
+      store.removeSource(contextA, sourceA);
+      return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+          relationship).then((List<Location> locations) {
+        assertLocations(locations, [locationB]);
+      });
+    });
+  }
+
+  /**
+   * Asserts that the [actual] locations have all the [expected] locations and
+   * only them.
+   */
+  static void assertLocations(List<Location> actual, List<Location> expected) {
+    List<_LocationEqualsWrapper> actualWrappers = wrapLocations(actual);
+    List<_LocationEqualsWrapper> expectedWrappers = wrapLocations(expected);
+    expect(actualWrappers, unorderedEquals(expectedWrappers));
+  }
+
+  /**
+   * @return the new [Location] mock.
+   */
+  static Location mockLocation(Element element) {
+    Location location = new MockLocation();
+    when(location.element).thenReturn(element);
+    when(location.offset).thenReturn(0);
+    when(location.length).thenReturn(0);
+    return location;
+  }
+
+  /**
+   * Wraps the given locations into [LocationEqualsWrapper].
+   */
+  static List<_LocationEqualsWrapper> wrapLocations(List<Location> locations) {
+    List<_LocationEqualsWrapper> wrappers = <_LocationEqualsWrapper>[];
+    for (Location location in locations) {
+      wrappers.add(new _LocationEqualsWrapper(location));
+    }
+    return wrappers;
+  }
+}
diff --git a/pkg/analysis_server/test/index/store/test_all.dart b/pkg/analysis_server/test/index/store/test_all.dart
new file mode 100644
index 0000000..4e67d6b
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/test_all.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.
+
+library test.index.store;
+
+import 'package:unittest/unittest.dart';
+
+import 'codec_test.dart' as codec_test;
+import 'collection_test.dart' as collection_test;
+import 'separate_file_manager_test.dart' as separate_file_manager_test;
+import 'split_store_test.dart' as split_store_test;
+
+
+/**
+ * Utility for manually running all tests.
+ */
+main() {
+  groupSep = ' | ';
+  group('store', () {
+    codec_test.main();
+    collection_test.main();
+    separate_file_manager_test.main();
+    split_store_test.main();
+  });
+}
diff --git a/pkg/analysis_server/test/index/store/typed_mocks.dart b/pkg/analysis_server/test/index/store/typed_mocks.dart
new file mode 100644
index 0000000..3ec5089
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/typed_mocks.dart
@@ -0,0 +1,139 @@
+// 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.index.store.typed_mocks;
+
+import 'package:analysis_server/src/index/store/codec.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:typed_mock/typed_mock.dart';
+
+
+class MockAnalysisContext extends TypedMock implements AnalysisContext {
+  String _name;
+  MockAnalysisContext(this._name);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+  String toString() => _name;
+}
+
+
+class MockClassElement extends TypedMock implements ClassElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockCompilationUnitElement extends TypedMock implements
+    CompilationUnitElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockConstructorElement extends TypedMock implements
+    ConstructorElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockContextCodec extends TypedMock implements ContextCodec {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockDartType extends StringTypedMock implements DartType {
+  MockDartType([String toString]) : super(toString);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockElement extends TypedMock implements Element {
+  String _name;
+  MockElement([this._name = '<element>']);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+  String toString() => _name;
+}
+
+
+class MockElementCodec extends TypedMock implements ElementCodec {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockFieldElement extends TypedMock implements FieldElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockHtmlElement extends TypedMock implements HtmlElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockInstrumentedAnalysisContextImpl extends TypedMock implements
+    InstrumentedAnalysisContextImpl {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockLibraryElement extends TypedMock implements LibraryElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockLocation extends TypedMock implements Location {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockLogger extends TypedMock implements Logger {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockMethodElement extends TypedMock implements MethodElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockParameterElement extends StringTypedMock implements ParameterElement {
+  MockParameterElement([String toString]) : super(toString);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockPropertyAccessorElement extends TypedMock implements
+    PropertyAccessorElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockRelationshipCodec extends TypedMock implements RelationshipCodec {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockSource extends TypedMock implements Source {
+  String _name;
+  MockSource(this._name);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+  String toString() => _name;
+}
+
+
+class StringTypedMock extends TypedMock {
+  String _toString;
+
+  StringTypedMock(this._toString);
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  String toString() {
+    if (_toString != null) {
+      return _toString;
+    }
+    return super.toString();
+  }
+}
diff --git a/pkg/analysis_server/test/index/test_all.dart b/pkg/analysis_server/test/index/test_all.dart
new file mode 100644
index 0000000..bb601f9
--- /dev/null
+++ b/pkg/analysis_server/test/index/test_all.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 test.index.all;
+
+import 'package:unittest/unittest.dart';
+
+import 'b_plus_tree_test.dart' as b_plus_tree_test;
+import 'file_page_manager_test.dart' as file_page_manager_test;
+import 'index_test.dart' as index_test;
+import 'lru_cache_test.dart' as lru_cache_test;
+import 'page_node_manager_test.dart' as page_node_manager_test;
+import 'store/test_all.dart' as store_test_all;
+
+
+/**
+ * Utility for manually running all tests.
+ */
+main() {
+  groupSep = ' | ';
+  group('index', () {
+    b_plus_tree_test.main();
+    page_node_manager_test.main();
+    file_page_manager_test.main();
+    index_test.main();
+    lru_cache_test.main();
+    store_test_all.main();
+  });
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index f8f3f9a..ed6da26 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -10,16 +10,20 @@
 @MirrorsUsed(targets: 'mocks', override: '*')
 import 'dart:mirrors';
 
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel.dart';
+import 'package:analysis_server/src/operation/operation_analysis.dart';
+import 'package:analysis_server/src/operation/operation.dart';
+import 'package:analysis_server/src/package_map_provider.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart' as resource;
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:matcher/matcher.dart';
 import 'package:mock/mock.dart';
 import 'package:unittest/unittest.dart';
-import 'package:analysis_server/src/operation/operation_analysis.dart';
-import 'package:analysis_server/src/operation/operation.dart';
+import 'package:analyzer/src/generated/index.dart';
 
 /**
  * Answer the absolute path the the SDK relative to the currently running
@@ -211,6 +215,10 @@
   @override
   void sendNotices(AnalysisServer server, List<ChangeNotice> notices) {
   }
+
+  @override
+  void updateIndex(Index index, List<ChangeNotice> notices) {
+  }
 }
 
 
@@ -294,3 +302,131 @@
     return mismatchDescription;
   }
 }
+
+class MockSdk implements DartSdk {
+
+  final resource.MemoryResourceProvider provider = new resource.MemoryResourceProvider();
+
+  MockSdk() {
+    // TODO(paulberry): Add to this as needed.
+    const Map<String, String> pathToContent = const {
+      "/lib/core/core.dart": '''
+          library dart.core;
+          class Object {}
+          class Function {}
+          class StackTrace {}
+          class Symbol {}
+          class Type {}
+
+          class String extends Object {}
+          class bool extends Object {}
+          abstract class num extends Object {
+            num operator +(num other);
+            num operator -(num other);
+            num operator *(num other);
+            num operator /(num other);
+          }
+          abstract class int extends num {
+            int operator -();
+          }
+          class double extends num {}
+          class DateTime extends Object {}
+          class Null extends Object {}
+
+          class Deprecated extends Object {
+            final String expires;
+            const Deprecated(this.expires);
+          }
+          const Object deprecated = const Deprecated("next release");
+
+          abstract class List<E> extends Object {
+            void add(E value);
+            E operator [](int index);
+            void operator []=(int index, E value);
+          }
+          class Map<K, V> extends Object {}
+
+          void print(Object object) {}
+          ''',
+
+      "/lib/html/dartium/html_dartium.dart": '''
+          library dart.html;
+          class HtmlElement {}
+          ''',
+
+      "/lib/math/math.dart": '''
+          library dart.math;
+          '''
+    };
+
+    pathToContent.forEach((String path, String content) {
+      provider.newFile(path, content);
+    });
+  }
+
+  // Not used
+  @override
+  AnalysisContext get context => throw unimplemented;
+
+  @override
+  Source fromEncoding(UriKind kind, Uri uri) {
+    resource.Resource file = provider.getResource(uri.path);
+    if (file is resource.File) {
+      return file.createSource(kind);
+    }
+    return null;
+  }
+
+  UnimplementedError get unimplemented => new UnimplementedError();
+
+  @override
+  SdkLibrary getSdkLibrary(String dartUri) {
+    // getSdkLibrary() is only used to determine whether a library is internal
+    // to the SDK.  The mock SDK doesn't have any internals, so it's safe to
+    // return null.
+    return null;
+  }
+
+  @override
+  Source mapDartUri(String dartUri) {
+    const Map<String, String> uriToPath = const {
+      "dart:core": "/lib/core/core.dart",
+      "dart:html": "/lib/html/dartium/html_dartium.dart",
+      "dart:math": "/lib/math/math.dart"
+    };
+
+    String path = uriToPath[dartUri];
+    if (path != null) {
+      resource.File file = provider.getResource(path);
+      return file.createSource(UriKind.DART_URI);
+    }
+
+    // If we reach here then we tried to use a dartUri that's not in the
+    // table above.
+    throw unimplemented;
+  }
+
+  // Not used.
+  @override
+  List<SdkLibrary> get sdkLibraries => throw unimplemented;
+
+  // Not used.
+  @override
+  String get sdkVersion => throw unimplemented;
+
+  // Not used.
+  @override
+  List<String> get uris => throw unimplemented;
+}
+
+/**
+ * A mock [PackageMapProvider].
+ */
+class MockPackageMapProvider implements PackageMapProvider {
+  Map<String, List<resource.Folder>> packageMap = <String, List<resource.Folder>>{};
+
+  @override
+  Map<String, List<resource.Folder>> computePackageMap(resource.Folder folder) {
+    return packageMap;
+  }
+}
diff --git a/pkg/analysis_server/test/operation/operation_queue_test.dart b/pkg/analysis_server/test/operation/operation_queue_test.dart
index 2b05e14..32dcd78 100644
--- a/pkg/analysis_server/test/operation/operation_queue_test.dart
+++ b/pkg/analysis_server/test/operation/operation_queue_test.dart
@@ -54,8 +54,7 @@
       });
 
       test('use operation priorities', () {
-        // TODO(scheglov) update 'typed_mock' to make 'any*' fields dynamic
-        when(server.isPriorityContext(anyObject as dynamic)).thenReturn(false);
+        when(server.isPriorityContext(anyObject)).thenReturn(false);
         var analysisContext = new AnalysisContextMock();
         var operationA = mockOperation(ServerOperationPriority.SEARCH);
         var operationB = mockOperation(ServerOperationPriority.REFACTORING);
@@ -70,8 +69,7 @@
       });
 
       test('continue analysis first', () {
-        // TODO(scheglov) update 'typed_mock' to make 'any*' fields dynamic
-        when(server.isPriorityContext(anyObject as dynamic)).thenReturn(false);
+        when(server.isPriorityContext(anyObject)).thenReturn(false);
         var analysisContext = new AnalysisContextMock();
         var operationA = new PerformAnalysisOperation(analysisContext, false);
         var operationB = new PerformAnalysisOperation(analysisContext, true);
diff --git a/pkg/analysis_server/test/package_map_provider_test.dart b/pkg/analysis_server/test/package_map_provider_test.dart
new file mode 100644
index 0000000..f7567b0
--- /dev/null
+++ b/pkg/analysis_server/test/package_map_provider_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.package.map.provider;
+
+import 'dart:convert';
+
+import 'package:analysis_server/src/package_map_provider.dart';
+import 'package:unittest/unittest.dart';
+import 'package:analysis_server/src/resource.dart';
+
+main() {
+  groupSep = ' | ';
+
+  group('PubPackageMapProvider', () {
+    group('parsePackageMap', () {
+      MemoryResourceProvider resourceProvider;
+      PubPackageMapProvider packageMapProvider;
+
+      setUp(() {
+        resourceProvider = new MemoryResourceProvider();
+        packageMapProvider = new PubPackageMapProvider(resourceProvider);
+      });
+
+      test('normal folder', () {
+        String packageName = 'foo';
+        String folderPath = '/path/to/folder';
+        resourceProvider.newFolder(folderPath);
+        Map<String, List<Folder>> result = packageMapProvider.parsePackageMap(
+            JSON.encode({'packages': {packageName: folderPath}}));
+        expect(result, hasLength(1));
+        expect(result.keys, contains(packageName));
+        expect(result[packageName], hasLength(1));
+        expect(result[packageName][0], new isInstanceOf<Folder>());
+        expect(result[packageName][0].path, equals(folderPath));
+      });
+
+      test('ignore nonexistent folder', () {
+        String packageName = 'foo';
+        String folderPath = '/path/to/folder';
+        Map<String, List<Folder>> result = packageMapProvider.parsePackageMap(
+            JSON.encode({'packages': {packageName: folderPath}}));
+        expect(result, hasLength(0));
+      });
+
+      test('package maps to list', () {
+        String packageName = 'foo';
+        String folderPath1 = '/path/to/folder1';
+        String folderPath2 = '/path/to/folder2';
+        resourceProvider.newFolder(folderPath1);
+        resourceProvider.newFolder(folderPath2);
+        Map<String, List<Folder>> result = packageMapProvider.parsePackageMap(
+            JSON.encode({'packages': {packageName: [folderPath1, folderPath2]}}));
+        expect(result, hasLength(1));
+        expect(result.keys, contains(packageName));
+        expect(result[packageName], hasLength(2));
+        for (int i = 0; i < 2; i++) {
+          expect(result[packageName][i], new isInstanceOf<Folder>());
+          expect(result[packageName][i].path, isIn([folderPath1, folderPath2]));
+        }
+      });
+    });
+  });
+}
diff --git a/pkg/analysis_server/test/package_uri_resolver_test.dart b/pkg/analysis_server/test/package_uri_resolver_test.dart
new file mode 100644
index 0000000..f059fdc
--- /dev/null
+++ b/pkg/analysis_server/test/package_uri_resolver_test.dart
@@ -0,0 +1,159 @@
+// 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.resolver.package;
+
+import 'package:analysis_server/src/package_uri_resolver.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+
+import 'reflective_tests.dart';
+
+main() {
+  groupSep = ' | ';
+
+  group('PackageMapUriResolver', () {
+    runReflectiveTests(_PackageMapUriResolverTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class _PackageMapUriResolverTest {
+  static const EMPTY_MAP = const <String, List<Folder>>{};
+  MemoryResourceProvider provider = new MemoryResourceProvider();
+
+  setUp() {
+  }
+
+  tearDown() {
+  }
+
+  void test_isPackageUri() {
+    Uri uri = Uri.parse('package:test/test.dart');
+    expect(uri.scheme, 'package');
+    expect(PackageMapUriResolver.isPackageUri(uri), isTrue);
+  }
+
+  void test_fromEncoding_nonPackage() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('file:/does/not/exist.dart');
+    Source result = resolver.fromEncoding(UriKind.DART_URI, uri);
+    expect(result, isNull);
+  }
+
+  void test_fromEncoding_package() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:/does/not/exist.dart');
+    Source result = resolver.fromEncoding(UriKind.PACKAGE_URI, uri);
+    expect(result, isNotNull);
+    expect(result.fullName, '/does/not/exist.dart');
+  }
+
+  void test_isPackageUri_null_scheme() {
+    Uri uri = Uri.parse('foo.dart');
+    expect(uri.scheme, '');
+    expect(PackageMapUriResolver.isPackageUri(uri), isFalse);
+  }
+
+  void test_isPackageUri_other_scheme() {
+    Uri uri = Uri.parse('memfs:/foo.dart');
+    expect(uri.scheme, 'memfs');
+    expect(PackageMapUriResolver.isPackageUri(uri), isFalse);
+  }
+
+  void test_resolve_OK() {
+    const pkgFileA = '/pkgA/lib/libA.dart';
+    const pkgFileB = '/pkgB/lib/libB.dart';
+    provider.newFile(pkgFileA, 'library lib_a;');
+    provider.newFile(pkgFileB, 'library lib_b;');
+    PackageMapUriResolver resolver = new PackageMapUriResolver(provider,
+        <String, List<Folder>>{
+      'pkgA': [provider.getResource('/pkgA/lib/')],
+      'pkgB': [provider.getResource('/pkgB/lib/')]
+    });
+    {
+      Uri uri = Uri.parse('package:pkgA/libA.dart');
+      Source result = resolver.resolveAbsolute(uri);
+      expect(result, isNotNull);
+      expect(result.exists(), isTrue);
+      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.fullName, pkgFileA);
+    }
+    {
+      Uri uri = Uri.parse('package:pkgB/libB.dart');
+      Source result = resolver.resolveAbsolute(uri);
+      expect(result, isNotNull);
+      expect(result.exists(), isTrue);
+      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.fullName, pkgFileB);
+    }
+  }
+
+  void test_resolve_multiple_folders() {
+    const pkgFileA = '/part1/lib/libA.dart';
+    const pkgFileB = '/part2/lib/libB.dart';
+    provider.newFile(pkgFileA, 'library lib_a');
+    provider.newFile(pkgFileB, 'library lib_b');
+    PackageMapUriResolver resolver = new PackageMapUriResolver(provider,
+        <String, List<Folder>>{
+      'pkg': [provider.getResource('/part1/lib/'),
+              provider.getResource('/part2/lib/')]
+    });
+    {
+      Uri uri = Uri.parse('package:pkg/libA.dart');
+      Source result = resolver.resolveAbsolute(uri);
+      expect(result, isNotNull);
+      expect(result.exists(), isTrue);
+      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.fullName, pkgFileA);
+    }
+    {
+      Uri uri = Uri.parse('package:pkg/libB.dart');
+      Source result = resolver.resolveAbsolute(uri);
+      expect(result, isNotNull);
+      expect(result.exists(), isTrue);
+      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.fullName, pkgFileB);
+    }
+  }
+
+  void test_resolve_nonPackage() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('dart:core');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNull);
+  }
+
+  void test_resolve_package_invalid_leadingSlash() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:/foo');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNull);
+  }
+
+  void test_resolve_package_invalid_noSlash() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:foo');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNull);
+  }
+
+  void test_resolve_package_invalid_onlySlash() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:/');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNull);
+  }
+
+  void test_resolve_package_notInMap() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:analyzer/analyzer.dart');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNotNull);
+    expect(result.exists(), isFalse);
+    expect(result.fullName, 'package:analyzer/analyzer.dart');
+  }
+}
diff --git a/pkg/analysis_server/test/physical_resource_provider_test.dart b/pkg/analysis_server/test/physical_resource_provider_test.dart
index e3dfdc7..63f0a0d 100644
--- a/pkg/analysis_server/test/physical_resource_provider_test.dart
+++ b/pkg/analysis_server/test/physical_resource_provider_test.dart
@@ -32,6 +32,9 @@
       group('Watch', () {
 
         Future delayed(computation()) {
+          // Give the tests 1 second to detect the changes. While it may only
+          // take up to a few hundred ms, a whole second gives a good margin
+          // for when running tests.
           return new Future.delayed(
               new Duration(seconds: 1), computation);
         }
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index 79c394b..985a8b3 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -9,244 +9,39 @@
 import 'package:analysis_server/src/protocol.dart';
 import 'package:unittest/unittest.dart';
 
-import 'declarative_tests.dart';
+import 'reflective_tests.dart';
+
+
+Matcher _throwsRequestFailure = throwsA(new isInstanceOf<RequestFailure>());
+
 
 main() {
-  addTestSuite(NotificationTest);
-  addTestSuite(RequestTest);
-  addTestSuite(RequestErrorTest);
-  addTestSuite(RequestDatumTest);
-  addTestSuite(ResponseTest);
+  groupSep = ' | ';
+  group('Notification', () {
+    runReflectiveTests(NotificationTest);
+  });
+  group('Request', () {
+    runReflectiveTests(RequestTest);
+  });
+  group('RequestError', () {
+    runReflectiveTests(RequestErrorTest);
+  });
+  group('RequestDatum', () {
+    runReflectiveTests(RequestDatumTest);
+  });
+  group('Response', () {
+    runReflectiveTests(ResponseTest);
+  });
 }
 
-class NotificationTest {
-  @runTest
-  static void getParameter_defined() {
-    Notification notification = new Notification('foo');
-    notification.setParameter('x', 'y');
-    expect(notification.event, equals('foo'));
-    expect(notification.params.length, equals(1));
-    expect(notification.getParameter('x'), equals('y'));
-    expect(notification.toJson(), equals({
-      'event' : 'foo',
-      'params' : {'x' : 'y'}
-    }));
-  }
 
-  @runTest
-  static void getParameter_undefined() {
-    Notification notification = new Notification('foo');
-    expect(notification.event, equals('foo'));
-    expect(notification.params.length, equals(0));
-    expect(notification.getParameter('x'), isNull);
-    expect(notification.toJson(), equals({
-      'event' : 'foo'
-    }));
-  }
-
-  @runTest
-  static void fromJson() {
-    Notification original = new Notification('foo');
-    Notification notification = new Notification.fromJson(original.toJson());
-    expect(notification.event, equals('foo'));
-    expect(notification.params.length, equals(0));
-    expect(notification.getParameter('x'), isNull);
-  }
-
-  @runTest
-  static void fromJson_withParams() {
-    Notification original = new Notification('foo');
-    original.setParameter('x', 'y');
-    Notification notification = new Notification.fromJson(original.toJson());
-    expect(notification.event, equals('foo'));
-    expect(notification.params.length, equals(1));
-    expect(notification.getParameter('x'), equals('y'));
-  }
-}
-
-class RequestTest {
-  @runTest
-  static void getParameter_defined() {
-    String name = 'name';
-    String value = 'value';
-    Request request = new Request('0', '');
-    request.setParameter(name, value);
-    expect(request.getParameter(name, null).datum, equals(value));
-  }
-
-  @runTest
-  static void getParameter_undefined() {
-    String name = 'name';
-    String defaultValue = 'default value';
-    Request request = new Request('0', '');
-    expect(request.getParameter(name, defaultValue).datum, equals(defaultValue));
-  }
-
-  @runTest
-  static void getRequiredParameter_defined() {
-    String name = 'name';
-    String value = 'value';
-    Request request = new Request('0', '');
-    request.setParameter(name, value);
-    expect(request.getRequiredParameter(name).datum, equals(value));
-  }
-
-  @runTest
-  static void getRequiredParameter_undefined() {
-    String name = 'name';
-    Request request = new Request('0', '');
-    expect(() => request.getRequiredParameter(name), _throwsRequestFailure);
-  }
-
-  @runTest
-  static void fromJson() {
-    Request original = new Request('one', 'aMethod');
-    String json = JSON.encode(original.toJson());
-    Request request = new Request.fromString(json);
-    expect(request.id, equals('one'));
-    expect(request.method, equals('aMethod'));
-  }
-
-  @runTest
-  static void fromJson_invalidId() {
-    String json = '{"id":{"one":"two"},"method":"aMethod","params":{"foo":"bar"}}';
-    Request request = new Request.fromString(json);
-    expect(request, isNull);
-  }
-
-  @runTest
-  static void fromJson_invalidMethod() {
-    String json = '{"id":"one","method":{"boo":"aMethod"},"params":{"foo":"bar"}}';
-    Request request = new Request.fromString(json);
-    expect(request, isNull);
-  }
-
-  @runTest
-  static void fromJson_invalidParams() {
-    String json = '{"id":"one","method":"aMethod","params":"foobar"}';
-    Request request = new Request.fromString(json);
-    expect(request, isNull);
-  }
-
-  @runTest
-  static void fromJson_withParams() {
-    Request original = new Request('one', 'aMethod');
-    original.setParameter('foo', 'bar');
-    String json = JSON.encode(original.toJson());
-    Request request = new Request.fromString(json);
-    expect(request.id, equals('one'));
-    expect(request.method, equals('aMethod'));
-    expect(request.getParameter('foo', null).asString(), equals('bar'));
-  }
-
-  @runTest
-  static void toJson() {
-    Request request = new Request('one', 'aMethod');
-    expect(request.toJson(), equals({
-      Request.ID : 'one',
-      Request.METHOD : 'aMethod'
-    }));
-  }
-
-  @runTest
-  static void toJson_withParams() {
-    Request request = new Request('one', 'aMethod');
-    request.setParameter('foo', 'bar');
-    expect(request.toJson(), equals({
-      Request.ID : 'one',
-      Request.METHOD : 'aMethod',
-      Request.PARAMS : {'foo' : 'bar'}
-    }));
-  }
-}
-
-class RequestErrorTest {
-  @runTest
-  static void create() {
-    RequestError error = new RequestError(42, 'msg');
-    expect(error.code, 42);
-    expect(error.message, "msg");
-    expect(error.toJson(), equals({
-      RequestError.CODE: 42,
-      RequestError.MESSAGE: "msg"
-    }));
-  }
-
-  @runTest
-  static void create_parseError() {
-    RequestError error = new RequestError.parseError();
-    expect(error.code, RequestError.CODE_PARSE_ERROR);
-    expect(error.message, "Parse error");
-  }
-
-  @runTest
-  static void create_methodNotFound() {
-    RequestError error = new RequestError.methodNotFound();
-    expect(error.code, RequestError.CODE_METHOD_NOT_FOUND);
-    expect(error.message, "Method not found");
-  }
-
-  @runTest
-  static void create_invalidParameters() {
-    RequestError error = new RequestError.invalidParameters();
-    expect(error.code, RequestError.CODE_INVALID_PARAMS);
-    expect(error.message, "Invalid parameters");
-  }
-
-  @runTest
-  static void create_invalidRequest() {
-    RequestError error = new RequestError.invalidRequest();
-    expect(error.code, RequestError.CODE_INVALID_REQUEST);
-    expect(error.message, "Invalid request");
-  }
-
-  @runTest
-  static void create_internalError() {
-    RequestError error = new RequestError.internalError();
-    expect(error.code, RequestError.CODE_INTERNAL_ERROR);
-    expect(error.message, "Internal error");
-  }
-
-  @runTest
-  static void create_serverAlreadyStarted() {
-    RequestError error = new RequestError.serverAlreadyStarted();
-    expect(error.code, RequestError.CODE_SERVER_ALREADY_STARTED);
-    expect(error.message, "Server already started");
-  }
-
-  @runTest
-  static void fromJson() {
-    var json = {
-        RequestError.CODE: RequestError.CODE_PARSE_ERROR,
-        RequestError.MESSAGE: 'foo',
-        RequestError.DATA: {'ints': [1, 2, 3]}
-    };
-    RequestError error = new RequestError.fromJson(json);
-    expect(error.code, RequestError.CODE_PARSE_ERROR);
-    expect(error.message, "foo");
-    expect(error.data['ints'], [1, 2, 3]);
-    expect(error.getData('ints'), [1, 2, 3]);
-  }
-
-  @runTest
-  static void toJson() {
-    RequestError error = new RequestError(0, 'msg');
-    error.setData('answer', 42);
-    error.setData('question', 'unknown');
-    expect(error.toJson(), {
-        RequestError.CODE: 0,
-        RequestError.MESSAGE: 'msg',
-        RequestError.DATA: {'answer': 42, 'question': 'unknown'}
-    });
-  }
-}
-
+@ReflectiveTestCase()
 class InvalidParameterResponseMatcher extends Matcher {
   static const int ERROR_CODE = -2;
 
   @override
-  Description describe(Description description) =>
-      description.add("an 'invalid parameter' response (code $ERROR_CODE)");
+  Description describe(Description description) => description.add(
+      "an 'invalid parameter' response (code $ERROR_CODE)");
 
   @override
   bool matches(item, Map matchState) {
@@ -268,110 +63,66 @@
   }
 }
 
-class RequestDatumTest {
-  static Request request;
 
+@ReflectiveTestCase()
+class NotificationTest {
+  void test_fromJson() {
+    Notification original = new Notification('foo');
+    Notification notification = new Notification.fromJson(original.toJson());
+    expect(notification.event, equals('foo'));
+    expect(notification.params.length, equals(0));
+    expect(notification.getParameter('x'), isNull);
+  }
+
+  void test_fromJson_withParams() {
+    Notification original = new Notification('foo');
+    original.setParameter('x', 'y');
+    Notification notification = new Notification.fromJson(original.toJson());
+    expect(notification.event, equals('foo'));
+    expect(notification.params.length, equals(1));
+    expect(notification.getParameter('x'), equals('y'));
+  }
+
+  void test_getParameter_defined() {
+    Notification notification = new Notification('foo');
+    notification.setParameter('x', 'y');
+    expect(notification.event, equals('foo'));
+    expect(notification.params.length, equals(1));
+    expect(notification.getParameter('x'), equals('y'));
+    expect(notification.toJson(), equals({
+      'event': 'foo',
+      'params': {
+        'x': 'y'
+      }
+    }));
+  }
+
+  void test_getParameter_undefined() {
+    Notification notification = new Notification('foo');
+    expect(notification.event, equals('foo'));
+    expect(notification.params.length, equals(0));
+    expect(notification.getParameter('x'), isNull);
+    expect(notification.toJson(), equals({
+      'event': 'foo'
+    }));
+  }
+}
+
+
+@ReflectiveTestCase()
+class RequestDatumTest {
+  static Matcher isRequestDatum = new isInstanceOf<RequestDatum>(
+      "RequestDatum");
+
+  static Request request;
   static Matcher _throwsInvalidParameter = throwsA(
       new InvalidParameterResponseMatcher());
-  static Matcher isRequestDatum = new isInstanceOf<RequestDatum>("RequestDatum"
-      );
 
-  static void setUp() {
+  void setUp() {
     request = new Request('myId', 'myMethod');
   }
 
-  static RequestDatum makeDatum(dynamic datum) {
-    return new RequestDatum(request, 'myPath', datum);
-  }
-
-  @runTest
-  static void indexOperator_nonMap() {
-    setUp();
-    expect(() => makeDatum(1)['foo'], _throwsInvalidParameter);
-  }
-
-  @runTest
-  static void indexOperator_missingKey() {
-    setUp();
-    expect(() => makeDatum({
-      'foo': 'bar'
-    })['baz'], _throwsInvalidParameter);
-  }
-
-  @runTest
-  static void indexOperator_hasKey() {
-    setUp();
-    var indexResult = makeDatum({
-      'foo': 'bar'
-    })['foo'];
-    expect(indexResult, isRequestDatum);
-    expect(indexResult.datum, equals('bar'));
-    expect(indexResult.path, equals('myPath.foo'));
-  }
-
-  @runTest
-  static void hasKey() {
-    setUp();
-    var datum = makeDatum({
-      'foo': 'bar'
-    });
-    expect(datum.hasKey('foo'), isTrue);
-    expect(datum.hasKey('bar'), isFalse);
-    expect(datum.hasKey('baz'), isFalse);
-  }
-
-  @runTest
-  static void forEachMap_nonMap() {
-    setUp();
-    expect(() => makeDatum(1).forEachMap((key, value) {
-      fail('Non-map should not be iterated');
-    }), _throwsInvalidParameter);
-  }
-
-  @runTest
-  static void forEachMap_emptyMap() {
-    setUp();
-    makeDatum({}).forEachMap((key, value) {
-      fail('Empty map should not be iterated');
-    });
-  }
-
-  @runTest
-  static void forEachMap_oneElementMap() {
-    setUp();
-    int callCount = 0;
-    makeDatum({
-      'key': 'value'
-    }).forEachMap((key, value) {
-      callCount++;
-      expect(key, equals('key'));
-      expect(value, isRequestDatum);
-      expect(value.datum, equals('value'));
-    });
-    expect(callCount, equals(1));
-  }
-
-  @runTest
-  static void forEachMap_twoElementMap() {
-    setUp();
-    int callCount = 0;
-    Map<String, String> map = {
-      'key1': 'value1',
-      'key2': 'value2'
-    };
-    Map iterationResult = {};
-    makeDatum(map).forEachMap((key, value) {
-      callCount++;
-      expect(value, isRequestDatum);
-      iterationResult[key] = value.datum;
-    });
-    expect(callCount, equals(2));
-    expect(iterationResult, equals(map));
-  }
-
-  @runTest
-  static void asBool() {
-    setUp();
+  void test_asBool() {
     expect(makeDatum(true).asBool(), isTrue);
     expect(makeDatum(false).asBool(), isFalse);
     expect(makeDatum('true').asBool(), isTrue);
@@ -379,56 +130,77 @@
     expect(() => makeDatum('abc').asBool(), _throwsInvalidParameter);
   }
 
-  @runTest
-  static void asInt() {
-    setUp();
+  void test_asInt() {
     expect(makeDatum(1).asInt(), equals(1));
     expect(makeDatum('2').asInt(), equals(2));
     expect(() => makeDatum('xxx').asInt(), _throwsInvalidParameter);
     expect(() => makeDatum(true).asInt(), _throwsInvalidParameter);
   }
 
-  @runTest
-  static void asString() {
-    setUp();
+  void test_asList_emptyList() {
+    expect(makeDatum([]).asList((datum) => datum.asString()), equals([]));
+  }
+
+  void test_asList_nonEmptyList() {
+    expect(makeDatum(['foo', 'bar']).asList((datum) => datum.asString()),
+        equals(['foo', 'bar']));
+  }
+
+  void test_isList() {
+    expect(makeDatum(3).isList, isFalse);
+    expect(makeDatum(null).isList, isTrue);
+    expect(makeDatum([]).isList, isTrue);
+    expect(makeDatum(['foo', 'bar']).isList, isTrue);
+  }
+
+  void test_asList_nonList() {
+    expect(() => makeDatum(3).asList((datum) => null), _throwsInvalidParameter);
+  }
+
+  void test_asList_null() {
+    expect(makeDatum(null).asList((datum) => datum.asString()), equals([]));
+  }
+
+  void test_asString() {
     expect(makeDatum('foo').asString(), equals('foo'));
     expect(() => makeDatum(3).asString(), _throwsInvalidParameter);
   }
 
-  @runTest
-  static void asStringList() {
-    setUp();
+  void test_isStringList() {
+    expect(makeDatum(['foo', 'bar']).isStringList, isTrue);
+    expect(makeDatum([]).isStringList, isTrue);
+    expect(makeDatum(null).isStringList, isTrue);
+    expect(makeDatum(['foo', 1]).isStringList, isFalse);
+    expect(makeDatum({}).isStringList, isFalse);
+  }
+
+  void test_asStringList() {
     expect(makeDatum(['foo', 'bar']).asStringList(), equals(['foo', 'bar']));
     expect(makeDatum([]).asStringList(), equals([]));
+    expect(makeDatum(null).asStringList(), equals([]));
     expect(() => makeDatum(['foo', 1]).asStringList(), _throwsInvalidParameter);
     expect(() => makeDatum({}).asStringList(), _throwsInvalidParameter);
   }
 
-  @runTest
-  static void asStringMap() {
-    setUp();
+  void test_isStringListMap() {
     expect(makeDatum({
-      'key1': 'value1',
-      'key2': 'value2'
-    }).asStringMap(), equals({
-      'key1': 'value1',
-      'key2': 'value2'
-    }));
-    expect(makeDatum({}).asStringMap(), equals({}));
-    expect(() => makeDatum({
-      'key1': 'value1',
-      'key2': 2
-    }).asStringMap(), _throwsInvalidParameter);
-    expect(() => makeDatum({
-      'key1': 1,
-      'key2': 2
-    }).asStringMap(), _throwsInvalidParameter);
-    expect(() => makeDatum([]).asStringMap(), _throwsInvalidParameter);
+      'key1': ['value11', 'value12'],
+      'key2': ['value21', 'value22']
+    }).isStringListMap, isTrue);
+    expect(makeDatum({
+      'key1': 10,
+      'key2': 20
+    }).isStringListMap, isFalse);
+    expect(makeDatum({
+      'key1': [11, 12],
+      'key2': [21, 22]
+    }).isStringListMap, isFalse);
+    expect(makeDatum({}).isStringListMap, isTrue);
+    expect(makeDatum(null).isStringListMap, isTrue);
+    expect(makeDatum(3).isStringListMap, isFalse);
   }
 
-  @runTest
-  static void asStringListMap() {
-    setUp();
+  void test_asStringListMap() {
     {
       var map = {
         'key1': ['value11', 'value12'],
@@ -451,66 +223,447 @@
       expect(() => makeDatum(map).asStringListMap(), _throwsInvalidParameter);
     }
   }
+
+  void test_isMap() {
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 'value2'
+    }).isMap, isTrue);
+    expect(makeDatum({}).isMap, isTrue);
+    expect(makeDatum(null).isMap, isTrue);
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 2
+    }).isMap, isTrue);
+    expect(makeDatum({
+      'key1': 1,
+      'key2': 2
+    }).isMap, isTrue);
+    expect(makeDatum([]).isMap, isFalse);
+  }
+
+  void test_isStringMap() {
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 'value2'
+    }).isStringMap, isTrue);
+    expect(makeDatum({}).isStringMap, isTrue);
+    expect(makeDatum(null).isStringMap, isTrue);
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 2
+    }).isStringMap, isFalse);
+    expect(makeDatum({
+      'key1': 1,
+      'key2': 2
+    }).isStringMap, isFalse);
+    expect(makeDatum([]).isMap, isFalse);
+  }
+
+  void test_asStringMap() {
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 'value2'
+    }).asStringMap(), equals({
+      'key1': 'value1',
+      'key2': 'value2'
+    }));
+    expect(makeDatum({}).asStringMap(), equals({}));
+    expect(() => makeDatum({
+      'key1': 'value1',
+      'key2': 2
+    }).asStringMap(), _throwsInvalidParameter);
+    expect(() => makeDatum({
+      'key1': 1,
+      'key2': 2
+    }).asStringMap(), _throwsInvalidParameter);
+    expect(() => makeDatum([]).asStringMap(), _throwsInvalidParameter);
+  }
+
+  void test_forEachMap_emptyMap() {
+    makeDatum({}).forEachMap((key, value) {
+      fail('Empty map should not be iterated');
+    });
+  }
+
+  void test_forEachMap_nonMap() {
+    expect(() => makeDatum(1).forEachMap((key, value) {
+      fail('Non-map should not be iterated');
+    }), _throwsInvalidParameter);
+  }
+
+   void test_forEachMap_null() {
+    makeDatum(null).forEachMap((key, value) {
+      fail('Empty map should not be iterated');
+    });
+  }
+
+  void test_forEachMap_oneElementMap() {
+    int callCount = 0;
+    makeDatum({
+      'key': 'value'
+    }).forEachMap((key, value) {
+      callCount++;
+      expect(key, equals('key'));
+      expect(value, isRequestDatum);
+      expect(value.datum, equals('value'));
+    });
+    expect(callCount, equals(1));
+  }
+
+  void test_forEachMap_twoElementMap() {
+    int callCount = 0;
+    Map<String, String> map = {
+      'key1': 'value1',
+      'key2': 'value2'
+    };
+    Map iterationResult = {};
+    makeDatum(map).forEachMap((key, value) {
+      callCount++;
+      expect(value, isRequestDatum);
+      iterationResult[key] = value.datum;
+    });
+    expect(callCount, equals(2));
+    expect(iterationResult, equals(map));
+  }
+
+  void test_hasKey() {
+    var datum = makeDatum({
+      'foo': 'bar'
+    });
+    expect(datum.hasKey('foo'), isTrue);
+    expect(datum.hasKey('bar'), isFalse);
+    expect(datum.hasKey('baz'), isFalse);
+  }
+
+  void test_hasKey_null() {
+    expect(makeDatum(null).hasKey('foo'), isFalse);
+  }
+
+  void test_indexOperator_hasKey() {
+    var indexResult = makeDatum({
+      'foo': 'bar'
+    })['foo'];
+    expect(indexResult, isRequestDatum);
+    expect(indexResult.datum, equals('bar'));
+    expect(indexResult.path, equals('myPath.foo'));
+  }
+
+  void test_indexOperator_null() {
+    expect(() => makeDatum(null)['foo'], _throwsInvalidParameter);
+  }
+
+  void test_indexOperator_missingKey() {
+    expect(() => makeDatum({
+      'foo': 'bar'
+    })['baz'], _throwsInvalidParameter);
+  }
+
+  void test_indexOperator_nonMap() {
+    expect(() => makeDatum(1)['foo'], _throwsInvalidParameter);
+  }
+
+  static RequestDatum makeDatum(dynamic datum) {
+    return new RequestDatum(request, 'myPath', datum);
+  }
 }
 
+
+@ReflectiveTestCase()
+class RequestErrorTest {
+  void test_create() {
+    RequestError error = new RequestError(42, 'msg');
+    expect(error.code, 42);
+    expect(error.message, "msg");
+    expect(error.toJson(), equals({
+      RequestError.CODE: 42,
+      RequestError.MESSAGE: "msg"
+    }));
+  }
+
+  void test_create_internalError() {
+    RequestError error = new RequestError.internalError();
+    expect(error.code, RequestError.CODE_INTERNAL_ERROR);
+    expect(error.message, "Internal error");
+  }
+
+  void test_create_invalidParameters() {
+    RequestError error = new RequestError.invalidParameters();
+    expect(error.code, RequestError.CODE_INVALID_PARAMS);
+    expect(error.message, "Invalid parameters");
+  }
+
+  void test_create_invalidRequest() {
+    RequestError error = new RequestError.invalidRequest();
+    expect(error.code, RequestError.CODE_INVALID_REQUEST);
+    expect(error.message, "Invalid request");
+  }
+
+  void test_create_methodNotFound() {
+    RequestError error = new RequestError.methodNotFound();
+    expect(error.code, RequestError.CODE_METHOD_NOT_FOUND);
+    expect(error.message, "Method not found");
+  }
+
+  void test_create_parseError() {
+    RequestError error = new RequestError.parseError();
+    expect(error.code, RequestError.CODE_PARSE_ERROR);
+    expect(error.message, "Parse error");
+  }
+
+  void test_create_serverAlreadyStarted() {
+    RequestError error = new RequestError.serverAlreadyStarted();
+    expect(error.code, RequestError.CODE_SERVER_ALREADY_STARTED);
+    expect(error.message, "Server already started");
+  }
+
+  void test_fromJson() {
+    var json = {
+      RequestError.CODE: RequestError.CODE_PARSE_ERROR,
+      RequestError.MESSAGE: 'foo',
+      RequestError.DATA: {
+        'ints': [1, 2, 3]
+      }
+    };
+    RequestError error = new RequestError.fromJson(json);
+    expect(error.code, RequestError.CODE_PARSE_ERROR);
+    expect(error.message, "foo");
+    expect(error.data['ints'], [1, 2, 3]);
+    expect(error.getData('ints'), [1, 2, 3]);
+  }
+
+  void test_toJson() {
+    RequestError error = new RequestError(0, 'msg');
+    error.setData('answer', 42);
+    error.setData('question', 'unknown');
+    expect(error.toJson(), {
+      RequestError.CODE: 0,
+      RequestError.MESSAGE: 'msg',
+      RequestError.DATA: {
+        'answer': 42,
+        'question': 'unknown'
+      }
+    });
+  }
+}
+
+
+@ReflectiveTestCase()
+class RequestTest {
+  void test_fromJson() {
+    Request original = new Request('one', 'aMethod');
+    String json = JSON.encode(original.toJson());
+    Request request = new Request.fromString(json);
+    expect(request.id, equals('one'));
+    expect(request.method, equals('aMethod'));
+  }
+
+  void test_fromJson_invalidId() {
+    String json =
+        '{"id":{"one":"two"},"method":"aMethod","params":{"foo":"bar"}}';
+    Request request = new Request.fromString(json);
+    expect(request, isNull);
+  }
+
+  void test_fromJson_invalidMethod() {
+    String json =
+        '{"id":"one","method":{"boo":"aMethod"},"params":{"foo":"bar"}}';
+    Request request = new Request.fromString(json);
+    expect(request, isNull);
+  }
+
+  void test_fromJson_invalidParams() {
+    String json = '{"id":"one","method":"aMethod","params":"foobar"}';
+    Request request = new Request.fromString(json);
+    expect(request, isNull);
+  }
+
+  void test_fromJson_withParams() {
+    Request original = new Request('one', 'aMethod');
+    original.setParameter('foo', 'bar');
+    String json = JSON.encode(original.toJson());
+    Request request = new Request.fromString(json);
+    expect(request.id, equals('one'));
+    expect(request.method, equals('aMethod'));
+    expect(request.getParameter('foo', null).asString(), equals('bar'));
+  }
+
+  void test_getParameter_defined() {
+    String name = 'name';
+    String value = 'value';
+    Request request = new Request('0', '');
+    request.setParameter(name, value);
+    expect(request.getParameter(name, null).datum, equals(value));
+  }
+
+   void test_getParameter_null() {
+    String name = 'name';
+    Request request = new Request('0', '');
+    request.setParameter(name, null);
+    expect(request.getParameter(name, 'default').datum, equals(null));
+  }
+
+  void test_getParameter_undefined() {
+    String name = 'name';
+    String defaultValue = 'default value';
+    Request request = new Request('0', '');
+    expect(request.getParameter(name, defaultValue).datum, equals(
+        defaultValue));
+  }
+
+  void test_getRequiredParameter_defined() {
+    String name = 'name';
+    String value = 'value';
+    Request request = new Request('0', '');
+    request.setParameter(name, value);
+    expect(request.getRequiredParameter(name).datum, equals(value));
+  }
+
+   void test_getRequiredParameter_null() {
+    String name = 'name';
+    Request request = new Request('0', '');
+    request.setParameter(name, null);
+    expect(request.getRequiredParameter(name).datum, equals(null));
+  }
+
+  void test_getRequiredParameter_undefined() {
+    String name = 'name';
+    Request request = new Request('0', '');
+    expect(() => request.getRequiredParameter(name), _throwsRequestFailure);
+  }
+
+  void test_toJson() {
+    Request request = new Request('one', 'aMethod');
+    expect(request.toJson(), equals({
+      Request.ID: 'one',
+      Request.METHOD: 'aMethod'
+    }));
+  }
+
+  void test_toJson_withParams() {
+    Request request = new Request('one', 'aMethod');
+    request.setParameter('foo', 'bar');
+    expect(request.toJson(), equals({
+      Request.ID: 'one',
+      Request.METHOD: 'aMethod',
+      Request.PARAMS: {
+        'foo': 'bar'
+      }
+    }));
+  }
+}
+
+
+@ReflectiveTestCase()
 class ResponseTest {
-  @runTest
-  static void create_contextDoesNotExist() {
+  void test_create_contextDoesNotExist() {
     Response response = new Response.contextDoesNotExist(new Request('0', ''));
     expect(response.id, equals('0'));
     expect(response.error, isNotNull);
     expect(response.toJson(), equals({
       Response.ID: '0',
-      Response.ERROR: {'code': -1, 'message': 'Context does not exist'}
+      Response.ERROR: {
+        'code': -1,
+        'message': 'Context does not exist'
+      }
     }));
   }
 
-  @runTest
-  static void create_invalidRequestFormat() {
+  void test_create_invalidRequestFormat() {
     Response response = new Response.invalidRequestFormat();
     expect(response.id, equals(''));
     expect(response.error, isNotNull);
     expect(response.toJson(), equals({
       Response.ID: '',
-      Response.ERROR: {'code': -4, 'message': 'Invalid request'}
+      Response.ERROR: {
+        'code': -4,
+        'message': 'Invalid request'
+      }
     }));
   }
 
-  @runTest
-  static void create_missingRequiredParameter() {
-    Response response = new Response.missingRequiredParameter(new Request('0', ''), 'x');
+  void test_create_missingRequiredParameter() {
+    Response response = new Response.missingRequiredParameter(new Request('0',
+        ''), 'x');
     expect(response.id, equals('0'));
     expect(response.error, isNotNull);
     expect(response.toJson(), equals({
       Response.ID: '0',
-      Response.ERROR: {'code': -5, 'message': 'Missing required parameter: x'}
+      Response.ERROR: {
+        'code': -5,
+        'message': 'Missing required parameter: x'
+      }
     }));
   }
 
-  @runTest
-  static void create_unknownAnalysisOption() {
-    Response response = new Response.unknownAnalysisOption(new Request('0', ''), 'x');
+  void test_create_unanalyzedPriorityFiles() {
+    Response response = new Response.unanalyzedPriorityFiles(new Request('0',
+        ''), 'file list');
     expect(response.id, equals('0'));
     expect(response.error, isNotNull);
     expect(response.toJson(), equals({
       Response.ID: '0',
-      Response.ERROR: {'code': -6, 'message': 'Unknown analysis option: "x"'}
+      Response.ERROR: {
+        'code': -11,
+        'message': "Unanalyzed files cannot be a priority: 'file list'"
+      }
     }));
   }
 
-  @runTest
-  static void create_unknownRequest() {
+  void test_create_unknownAnalysisOption() {
+    Response response = new Response.unknownAnalysisOption(new Request('0', ''),
+        'x');
+    expect(response.id, equals('0'));
+    expect(response.error, isNotNull);
+    expect(response.toJson(), equals({
+      Response.ID: '0',
+      Response.ERROR: {
+        'code': -6,
+        'message': 'Unknown analysis option: "x"'
+      }
+    }));
+  }
+
+  void test_create_unknownRequest() {
     Response response = new Response.unknownRequest(new Request('0', ''));
     expect(response.id, equals('0'));
     expect(response.error, isNotNull);
     expect(response.toJson(), equals({
       Response.ID: '0',
-      Response.ERROR: {'code': -7, 'message': 'Unknown request'}
+      Response.ERROR: {
+        'code': -7,
+        'message': 'Unknown request'
+      }
     }));
   }
 
-  @runTest
-  static void setResult() {
+  void test_fromJson() {
+    Response original = new Response('myId');
+    Response response = new Response.fromJson(original.toJson());
+    expect(response.id, equals('myId'));
+  }
+
+  void test_fromJson_withError() {
+    Response original = new Response.invalidRequestFormat();
+    Response response = new Response.fromJson(original.toJson());
+    expect(response.id, equals(''));
+    expect(response.error, isNotNull);
+    RequestError error = response.error;
+    expect(error.code, equals(-4));
+    expect(error.message, equals('Invalid request'));
+  }
+
+  void test_fromJson_withResult() {
+    Response original = new Response('myId');
+    original.setResult('foo', 'bar');
+    Response response = new Response.fromJson(original.toJson());
+    expect(response.id, equals('myId'));
+    Map<String, Object> result = response.result;
+    expect(result.length, equals(1));
+    expect(result['foo'], equals('bar'));
+  }
+
+  void test_setResult() {
     String resultName = 'name';
     String resultValue = 'value';
     Response response = new Response('0');
@@ -523,35 +676,4 @@
       }
     }));
   }
-
-  @runTest
-  static void fromJson() {
-    Response original = new Response('myId');
-    Response response = new Response.fromJson(original.toJson());
-    expect(response.id, equals('myId'));
-  }
-
-  @runTest
-  static void fromJson_withError() {
-    Response original = new Response.invalidRequestFormat();
-    Response response = new Response.fromJson(original.toJson());
-    expect(response.id, equals(''));
-    expect(response.error, isNotNull);
-    RequestError error = response.error;
-    expect(error.code, equals(-4));
-    expect(error.message, equals('Invalid request'));
-  }
-
-  @runTest
-  static void fromJson_withResult() {
-    Response original = new Response('myId');
-    original.setResult('foo', 'bar');
-    Response response = new Response.fromJson(original.toJson());
-    expect(response.id, equals('myId'));
-    Map<String, Object> result = response.result;
-    expect(result.length, equals(1));
-    expect(result['foo'], equals('bar'));
-  }
 }
-
-Matcher _throwsRequestFailure = throwsA(new isInstanceOf<RequestFailure>());
diff --git a/pkg/analysis_server/test/reflective_tests.dart b/pkg/analysis_server/test/reflective_tests.dart
index 107812e..622ab5f 100644
--- a/pkg/analysis_server/test/reflective_tests.dart
+++ b/pkg/analysis_server/test/reflective_tests.dart
@@ -44,27 +44,39 @@
     if (memberMirror is! MethodMirror || !memberMirror.isRegularMethod) {
       return;
     }
-    // check name
     String memberName = MirrorSystem.getName(symbol);
+    // test_
     if (memberName.startsWith('test_')) {
       String testName = memberName.substring('test_'.length);
       test(testName, () {
-        InstanceMirror instanceMirror = classMirror.newInstance(new Symbol(''), []);
-        _invokeSymbolIfExists(instanceMirror, #setUp);
-        var testReturn = instanceMirror.invoke(symbol, []).reflectee;
-        if (testReturn is Future) {
-          return testReturn.whenComplete(() {
-            _invokeSymbolIfExists(instanceMirror, #tearDown);
-          });
-        } else {
-          _invokeSymbolIfExists(instanceMirror, #tearDown);
-          return testReturn;
-        }
+        return _runTest(classMirror, symbol);
+      });
+      return;
+    }
+    // solo_test_
+    if (memberName.startsWith('solo_test_')) {
+      String testName = memberName.substring('solo_test_'.length);
+      solo_test(testName, () {
+        return _runTest(classMirror, symbol);
       });
     }
   });
 }
 
+_runTest(ClassMirror classMirror, Symbol symbol) {
+  InstanceMirror instanceMirror = classMirror.newInstance(new Symbol(''), []);
+  _invokeSymbolIfExists(instanceMirror, #setUp);
+  var testReturn = instanceMirror.invoke(symbol, []).reflectee;
+  if (testReturn is Future) {
+    return testReturn.whenComplete(() {
+      _invokeSymbolIfExists(instanceMirror, #tearDown);
+    });
+  } else {
+    _invokeSymbolIfExists(instanceMirror, #tearDown);
+    return testReturn;
+  }
+}
+
 
 void _invokeSymbolIfExists(InstanceMirror instanceMirror, Symbol symbol) {
   try {
diff --git a/pkg/analysis_server/test/resource_test.dart b/pkg/analysis_server/test/resource_test.dart
index a7e2b47..489741d 100644
--- a/pkg/analysis_server/test/resource_test.dart
+++ b/pkg/analysis_server/test/resource_test.dart
@@ -6,15 +6,21 @@
 
 import 'dart:async';
 
-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:analyzer/src/generated/source.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
 import 'package:watcher/watcher.dart';
 
+import 'mocks.dart';
+
+
+var _isFile = new isInstanceOf<File>();
+var _isFolder = new isInstanceOf<Folder>();
+var _isMemoryResourceException = new isInstanceOf<MemoryResourceException>();
+
+
 main() {
   groupSep = ' | ';
 
@@ -114,21 +120,15 @@
 
     group('newFolder', () {
       test('empty path', () {
-        expect(
-          () {
-            provider.newFolder('');
-          },
-          throwsA(new isInstanceOf<ArgumentError>())
-        );
+        expect(() {
+          provider.newFolder('');
+        }, throwsA(new isInstanceOf<ArgumentError>()));
       });
 
       test('not absolute', () {
-        expect(
-          () {
-            provider.newFolder('not/absolute');
-          },
-          throwsA(new isInstanceOf<ArgumentError>())
-        );
+        expect(() {
+          provider.newFolder('not/absolute');
+        }, throwsA(new isInstanceOf<ArgumentError>()));
       });
 
       group('already exists', () {
@@ -140,12 +140,9 @@
 
         test('as file', () {
           File file = provider.newFile('/my/file', 'qwerty');
-          expect(
-            () {
+          expect(() {
             provider.newFolder('/my/file');
-            },
-            throwsA(new isInstanceOf<ArgumentError>())
-          );
+          }, throwsA(new isInstanceOf<ArgumentError>()));
         });
       });
     });
@@ -153,8 +150,9 @@
     group('modifyFile', () {
       test('nonexistent', () {
         String path = '/my/file';
-        expect(() { provider.modifyFile(path, 'contents'); },
-            throwsA(new isInstanceOf<ArgumentError>()));
+        expect(() {
+          provider.modifyFile(path, 'contents');
+        }, throwsA(new isInstanceOf<ArgumentError>()));
         Resource file = provider.getResource(path);
         expect(file, isNotNull);
         expect(file.exists, isFalse);
@@ -163,8 +161,9 @@
       test('is folder', () {
         String path = '/my/file';
         provider.newFolder(path);
-        expect(() { provider.modifyFile(path, 'contents'); },
-            throwsA(new isInstanceOf<ArgumentError>()));
+        expect(() {
+          provider.modifyFile(path, 'contents');
+        }, throwsA(new isInstanceOf<ArgumentError>()));
         expect(provider.getResource(path), new isInstanceOf<Folder>());
       });
 
@@ -183,8 +182,9 @@
     group('deleteFile', () {
       test('nonexistent', () {
         String path = '/my/file';
-        expect(() { provider.deleteFile(path); },
-            throwsA(new isInstanceOf<ArgumentError>()));
+        expect(() {
+          provider.deleteFile(path);
+        }, throwsA(new isInstanceOf<ArgumentError>()));
         Resource file = provider.getResource(path);
         expect(file, isNotNull);
         expect(file.exists, isFalse);
@@ -193,8 +193,9 @@
       test('is folder', () {
         String path = '/my/file';
         provider.newFolder(path);
-        expect(() { provider.deleteFile(path); },
-            throwsA(new isInstanceOf<ArgumentError>()));
+        expect(() {
+          provider.deleteFile(path);
+        }, throwsA(new isInstanceOf<ArgumentError>()));
         expect(provider.getResource(path), new isInstanceOf<Folder>());
       });
 
@@ -392,12 +393,9 @@
         });
 
         test('contents', () {
-          expect(
-            () {
-              source.contents;
-            },
-            throwsA(_isMemoryResourceException)
-          );
+          expect(() {
+            source.contents;
+          }, throwsA(_isMemoryResourceException));
         });
 
         test('encoding', () {
@@ -423,8 +421,57 @@
       });
     });
   });
+
+  group('ResourceUriResolver', testResourceResourceUriResolver);
 }
 
-var _isFile = new isInstanceOf<File>();
-var _isFolder = new isInstanceOf<Folder>();
-var _isMemoryResourceException = new isInstanceOf<MemoryResourceException>();
+
+void testResourceResourceUriResolver() {
+  MemoryResourceProvider provider;
+  ResourceUriResolver resolver;
+
+  setUp(() {
+    provider = new MemoryResourceProvider();
+    resolver = new ResourceUriResolver(provider);
+    provider.newFile('/test.dart', '');
+    provider.newFolder('/folder');
+  });
+
+  group('fromEncoding', () {
+    test('file', () {
+      var uri = new Uri(path: '/test.dart');
+      Source source = resolver.fromEncoding(UriKind.FILE_URI, uri);
+      expect(source, isNotNull);
+      expect(source.exists(), isTrue);
+      expect(source.fullName, '/test.dart');
+    });
+
+    test('not a UriKind.FILE_URI', () {
+      var uri = new Uri(path: '/test.dart');
+      Source source = resolver.fromEncoding(UriKind.DART_URI, uri);
+      expect(source, isNull);
+    });
+  });
+
+  group('resolveAbsolute', () {
+    test('file', () {
+      var uri = new Uri(scheme: 'file', path: '/test.dart');
+      Source source = resolver.resolveAbsolute(uri);
+      expect(source, isNotNull);
+      expect(source.exists(), isTrue);
+      expect(source.fullName, '/test.dart');
+    });
+
+    test('folder', () {
+      var uri = new Uri(scheme: 'file', path: '/folder');
+      Source source = resolver.resolveAbsolute(uri);
+      expect(source, isNull);
+    });
+
+    test('not a file URI', () {
+      var uri = new Uri(scheme: 'https', path: '127.0.0.1/test.dart');
+      Source source = resolver.resolveAbsolute(uri);
+      expect(source, isNull);
+    });
+  });
+}
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index 0f9c083..67c6c2e 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -28,10 +28,10 @@
     MockServerChannel channel = new MockServerChannel();
     server.createAnalysisServer(channel);
     channel.expectMsgCount(notificationCount: 1);
-    expect(channel.notificationsReceived[0].event, NOTIFICATION_CONNECTED);
+    expect(channel.notificationsReceived[0].event, SERVER_CONNECTED);
     expect(channel.notificationsReceived[0].params, isEmpty);
     return channel.sendRequest(
-        new Request('0', METHOD_SHUTDOWN)
+        new Request('0', SERVER_SHUTDOWN)
     ).then((Response response) {
       expect(response.id, equals('0'));
       expect(response.error, isNull);
@@ -44,7 +44,7 @@
     MockServerChannel channel1 = new MockServerChannel();
     MockServerChannel channel2 = new MockServerChannel();
     server.createAnalysisServer(channel1);
-    expect(channel1.notificationsReceived[0].event, NOTIFICATION_CONNECTED);
+    expect(channel1.notificationsReceived[0].event, SERVER_CONNECTED);
     expect(channel1.notificationsReceived[0].params, isEmpty);
     server.createAnalysisServer(channel2);
     channel1.expectMsgCount(notificationCount: 1);
@@ -53,7 +53,7 @@
     expect(channel2.responsesReceived[0].error, isNotNull);
     expect(channel2.responsesReceived[0].error.code, equals(
         RequestError.CODE_SERVER_ALREADY_STARTED));
-    channel2.sendRequest(new Request('0', METHOD_SHUTDOWN)).then((Response response) {
+    channel2.sendRequest(new Request('0', SERVER_SHUTDOWN)).then((Response response) {
       expect(response.id, equals('0'));
       expect(response.error, isNotNull);
       expect(response.error.code, equals(
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index 42cf5a9..c22cd2e 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -4,12 +4,22 @@
 
 import 'package:unittest/unittest.dart';
 
+import 'analysis_notification_highlights_test.dart' as analysis_notification_highlights_test;
 import 'analysis_notification_navigation_test.dart' as analysis_notification_navigation_test;
+import 'analysis_notification_outline_test.dart' as analysis_notification_outline_test;
 import 'analysis_server_test.dart' as analysis_server_test;
 import 'channel_test.dart' as channel_test;
+import 'computer/test_all.dart' as computer_test_all;
+import 'context_directory_manager_test.dart' as context_directory_manager_test;
 import 'domain_analysis_test.dart' as domain_analysis_test;
+import 'domain_completion_test.dart' as domain_completion_test;
+import 'domain_edit_test.dart' as domain_edit_test;
+import 'domain_search_test.dart' as domain_search_test;
 import 'domain_server_test.dart' as domain_server_test;
+import 'index/test_all.dart' as index_test_all;
 import 'operation/test_all.dart' as operation_test;
+import 'package_map_provider_test.dart' as package_map_provider_test;
+import 'package_uri_resolver_test.dart' as package_uri_resolver_test;
 import 'protocol_test.dart' as protocol_test;
 import 'resource_test.dart' as resource_test;
 import 'socket_server_test.dart' as socket_server_test;
@@ -20,12 +30,22 @@
 main() {
   groupSep = ' | ';
   group('analysis_server', () {
+    analysis_notification_highlights_test.main();
     analysis_notification_navigation_test.main();
+    analysis_notification_outline_test.main();
     analysis_server_test.main();
     channel_test.main();
+    computer_test_all.main();
+    context_directory_manager_test.main();
     domain_analysis_test.main();
+    domain_completion_test.main();
+    domain_edit_test.main();
+    domain_search_test.main();
     domain_server_test.main();
+    index_test_all.main();
     operation_test.main();
+    package_map_provider_test.main();
+    package_uri_resolver_test.main();
     protocol_test.main();
     resource_test.main();
     socket_server_test.main();
diff --git a/pkg/analyzer/bin/analyzer.dart b/pkg/analyzer/bin/analyzer.dart
index bab77b6..db4c475 100644
--- a/pkg/analyzer/bin/analyzer.dart
+++ b/pkg/analyzer/bin/analyzer.dart
@@ -14,10 +14,13 @@
 import 'package:analyzer/src/analyzer_impl.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/interner.dart';
 import 'package:analyzer/src/generated/java_core.dart' show JavaSystem;
+import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/options.dart';
 
 void main(args) {
+  StringUtilities.INTERNER = new MappedInterner();
   CommandLineOptions options = CommandLineOptions.parse(args);
   if (options.shouldBatch) {
     BatchRunner.runAsBatch(args, (List<String> args) {
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 870309a..93307b7 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -2221,7 +2221,7 @@
       }
     } else {
       if (_propertyMap == null) {
-        _propertyMap = new Map<String, Object>();
+        _propertyMap = new HashMap<String, Object>();
       }
       _propertyMap[propertyName] = propertyValue;
     }
@@ -4554,7 +4554,7 @@
 
   @override
   Object visitMapLiteral(MapLiteral node) {
-    Map<String, Object> map = new Map<String, Object>();
+    HashMap<String, Object> map = new HashMap<String, Object>();
     for (MapLiteralEntry entry in node.entries) {
       Object key = entry.key.accept(this);
       Object value = entry.value.accept(this);
@@ -5819,6 +5819,9 @@
  */
 class ElementLocator_ElementMapper extends GeneralizingAstVisitor<Element> {
   @override
+  Element visitAnnotation(Annotation node) => node.element;
+
+  @override
   Element visitAssignmentExpression(AssignmentExpression node) => node.bestElement;
 
   @override
@@ -5839,6 +5842,13 @@
   @override
   Element visitIdentifier(Identifier node) {
     AstNode parent = node.parent;
+    // Type name in Annotation
+    if (parent is Annotation) {
+      Annotation annotation = parent;
+      if (identical(annotation.name, node) && annotation.constructorName == null) {
+        return annotation.element;
+      }
+    }
     // Type name in InstanceCreationExpression
     {
       AstNode typeNameCandidate = parent;
@@ -14508,7 +14518,7 @@
 
   AstNode _immediateChild;
 
-  Map<String, SimpleIdentifier> _locals = new Map<String, SimpleIdentifier>();
+  Map<String, SimpleIdentifier> _locals = new HashMap<String, SimpleIdentifier>();
 
   final int _position;
 
@@ -15110,7 +15120,10 @@
 
   @override
   Token get beginToken {
-    if (keyword != null) {
+    NodeList<Annotation> metadata = this.metadata;
+    if (!metadata.isEmpty) {
+      return metadata.beginToken;
+    } else if (keyword != null) {
       return keyword;
     } else if (_type != null) {
       return _type.beginToken;
@@ -18305,7 +18318,7 @@
   }
 
   /**
-   * Validate the given directive, but do not check for existance.
+   * Validate the given directive, but do not check for existence.
    *
    * @return a code indicating the problem if there is one, or `null` no problem
    */
@@ -18588,6 +18601,7 @@
 
   @override
   void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
     safelyVisitChild(_type, visitor);
     _variables.accept(visitor);
   }
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index b5c986d..c911a76 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -7,6 +7,7 @@
 
 library engine.constant;
 
+import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart' show ObjectUtilities;
 import 'source.dart' show Source;
@@ -229,12 +230,12 @@
   /**
    * A table mapping constant variable elements to the declarations of those variables.
    */
-  final Map<VariableElement, VariableDeclaration> variableMap = new Map<VariableElement, VariableDeclaration>();
+  final HashMap<VariableElement, VariableDeclaration> variableMap = new HashMap<VariableElement, VariableDeclaration>();
 
   /**
    * A table mapping constant constructors to the declarations of those constructors.
    */
-  final Map<ConstructorElement, ConstructorDeclaration> constructorMap = new Map<ConstructorElement, ConstructorDeclaration>();
+  final HashMap<ConstructorElement, ConstructorDeclaration> constructorMap = new HashMap<ConstructorElement, ConstructorDeclaration>();
 
   /**
    * A collection of constant constructor invocations.
@@ -305,12 +306,12 @@
   /**
    * A table mapping constant variables to the declarations of those variables.
    */
-  Map<VariableElement, VariableDeclaration> _variableDeclarationMap;
+  HashMap<VariableElement, VariableDeclaration> _variableDeclarationMap;
 
   /**
    * A table mapping constant constructors to the declarations of those constructors.
    */
-  Map<ConstructorElement, ConstructorDeclaration> constructorDeclarationMap;
+  HashMap<ConstructorElement, ConstructorDeclaration> constructorDeclarationMap;
 
   /**
    * A collection of constant constructor invocations.
@@ -491,7 +492,7 @@
   ValidResult _evaluateConstructorCall(NodeList<Expression> arguments, ConstructorElement constructor, ConstantVisitor constantVisitor) {
     int argumentCount = arguments.length;
     List<DartObjectImpl> argumentValues = new List<DartObjectImpl>(argumentCount);
-    Map<String, DartObjectImpl> namedArgumentValues = new Map<String, DartObjectImpl>();
+    HashMap<String, DartObjectImpl> namedArgumentValues = new HashMap<String, DartObjectImpl>();
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
       if (argument is NamedExpression) {
@@ -534,8 +535,8 @@
       // been reported, so consider it an unknown value to suppress further errors.
       return constantVisitor._validWithUnknownValue(definingClass);
     }
-    Map<String, DartObjectImpl> fieldMap = new Map<String, DartObjectImpl>();
-    Map<String, DartObjectImpl> parameterMap = new Map<String, DartObjectImpl>();
+    HashMap<String, DartObjectImpl> fieldMap = new HashMap<String, DartObjectImpl>();
+    HashMap<String, DartObjectImpl> parameterMap = new HashMap<String, DartObjectImpl>();
     List<ParameterElement> parameters = constructorBase.parameters;
     int parameterCount = parameters.length;
     for (int i = 0; i < parameterCount; i++) {
@@ -610,7 +611,7 @@
     return constantVisitor._valid(definingClass, new GenericState(fieldMap));
   }
 
-  void _evaluateSuperConstructorCall(Map<String, DartObjectImpl> fieldMap, ConstructorElement superConstructor, NodeList<Expression> superArguments, ConstantVisitor initializerVisitor) {
+  void _evaluateSuperConstructorCall(HashMap<String, DartObjectImpl> fieldMap, ConstructorElement superConstructor, NodeList<Expression> superArguments, ConstantVisitor initializerVisitor) {
     if (superConstructor != null && superConstructor.isConst) {
       ValidResult evaluationResult = _evaluateConstructorCall(superArguments, superConstructor, initializerVisitor);
       fieldMap[GenericState.SUPERCLASS_FIELD] = evaluationResult.value;
@@ -627,7 +628,7 @@
    *         constructor will be returned.
    */
   ConstructorElement _followConstantRedirectionChain(ConstructorElement constructor) {
-    Set<ConstructorElement> constructorsVisited = new Set<ConstructorElement>();
+    HashSet<ConstructorElement> constructorsVisited = new HashSet<ConstructorElement>();
     while (constructor.isFactory) {
       if (identical(constructor.enclosingElement.type, typeProvider.symbolType)) {
         // The dart:core.Symbol has a const factory constructor that redirects to
@@ -758,7 +759,7 @@
    */
   DartObjectImpl _nullObject;
 
-  Map<String, DartObjectImpl> _lexicalEnvironment;
+  HashMap<String, DartObjectImpl> _lexicalEnvironment;
 
   /**
    * Initialize a newly created constant visitor.
@@ -778,7 +779,7 @@
    * @param lexicalEnvironment values which should override simpleIdentifiers, or null if no
    *          overriding is necessary.
    */
-  ConstantVisitor.con2(this._typeProvider, Map<String, DartObjectImpl> lexicalEnvironment) {
+  ConstantVisitor.con2(this._typeProvider, HashMap<String, DartObjectImpl> lexicalEnvironment) {
     this._lexicalEnvironment = lexicalEnvironment;
   }
 
@@ -946,7 +947,7 @@
       return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL);
     }
     ErrorResult result = null;
-    Map<DartObjectImpl, DartObjectImpl> map = new Map<DartObjectImpl, DartObjectImpl>();
+    HashMap<DartObjectImpl, DartObjectImpl> map = new HashMap<DartObjectImpl, DartObjectImpl>();
     for (MapLiteralEntry entry in node.entries) {
       EvaluationResultImpl keyResult = entry.key.accept(this);
       EvaluationResultImpl valueResult = entry.value.accept(this);
@@ -1439,7 +1440,7 @@
     return null;
   }
 
-  Map<String, DartObjectImpl> get fields => _state.fields;
+  HashMap<String, DartObjectImpl> get fields => _state.fields;
 
   @override
   int get intValue {
@@ -1729,7 +1730,7 @@
   /**
    * A table mapping the names of declared variables to their values.
    */
-  Map<String, String> _declaredVariables = new Map<String, String>();
+  HashMap<String, String> _declaredVariables = new HashMap<String, String>();
 
   /**
    * Define a variable with the given name to have the given value.
@@ -2821,7 +2822,7 @@
   /**
    * The values of the fields of this instance.
    */
-  final Map<String, DartObjectImpl> _fieldMap;
+  final HashMap<String, DartObjectImpl> _fieldMap;
 
   /**
    * Pseudo-field that we use to represent fields in the superclass.
@@ -2831,7 +2832,7 @@
   /**
    * A state that can be used to represent an object whose state is not known.
    */
-  static GenericState UNKNOWN_VALUE = new GenericState(new Map<String, DartObjectImpl>());
+  static GenericState UNKNOWN_VALUE = new GenericState(new HashMap<String, DartObjectImpl>());
 
   /**
    * Initialize a newly created state to represent a newly created object.
@@ -2858,7 +2859,7 @@
       return false;
     }
     GenericState state = object as GenericState;
-    Set<String> otherFields = new Set<String>.from(state._fieldMap.keys.toSet());
+    HashSet<String> otherFields = new HashSet<String>.from(state._fieldMap.keys.toSet());
     for (String fieldName in _fieldMap.keys.toSet()) {
       if (_fieldMap[fieldName] != state._fieldMap[fieldName]) {
         return false;
@@ -2874,7 +2875,7 @@
   }
 
   @override
-  Map<String, DartObjectImpl> get fields => _fieldMap;
+  HashMap<String, DartObjectImpl> get fields => _fieldMap;
 
   @override
   String get typeName => "user defined type";
@@ -3014,7 +3015,7 @@
    * If this represents a generic dart object, return a map from its fieldnames to their values.
    * Otherwise return null.
    */
-  Map<String, DartObjectImpl> get fields => null;
+  HashMap<String, DartObjectImpl> get fields => null;
 
   /**
    * Return the name of the type of this value.
@@ -3842,7 +3843,7 @@
   /**
    * The entries in the map.
    */
-  final Map<DartObjectImpl, DartObjectImpl> _entries;
+  final HashMap<DartObjectImpl, DartObjectImpl> _entries;
 
   /**
    * Initialize a newly created state to represent a map with the given entries.
@@ -3868,7 +3869,7 @@
     if (object is! MapState) {
       return false;
     }
-    Map<DartObjectImpl, DartObjectImpl> otherElements = (object as MapState)._entries;
+    HashMap<DartObjectImpl, DartObjectImpl> otherElements = (object as MapState)._entries;
     int count = _entries.length;
     if (otherElements.length != count) {
       return false;
@@ -3891,7 +3892,7 @@
 
   @override
   Map<Object, Object> get value {
-    Map<Object, Object> result = new Map<Object, Object>();
+    HashMap<Object, Object> result = new HashMap<Object, Object>();
     for (MapEntry<DartObjectImpl, DartObjectImpl> entry in getMapEntrySet(_entries)) {
       DartObjectImpl key = entry.getKey();
       DartObjectImpl value = entry.getValue();
@@ -4103,12 +4104,12 @@
   /**
    * A table mapping constant variables to the declarations of those variables.
    */
-  final Map<VariableElement, VariableDeclaration> _variableDeclarationMap;
+  final HashMap<VariableElement, VariableDeclaration> _variableDeclarationMap;
 
   /**
    * A table mapping constant constructors to the declarations of those constructors.
    */
-  final Map<ConstructorElement, ConstructorDeclaration> _constructorDeclarationMap;
+  final HashMap<ConstructorElement, ConstructorDeclaration> _constructorDeclarationMap;
 
   /**
    * Initialize a newly created reference finder to find references from the given variable to other
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 50b872b..8418199 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -1413,7 +1413,7 @@
   @override
   bool get hasNonFinalField {
     List<ClassElement> classesToVisit = new List<ClassElement>();
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     classesToVisit.add(this);
     while (!classesToVisit.isEmpty) {
       ClassElement currentElement = classesToVisit.removeAt(0);
@@ -1465,7 +1465,7 @@
   bool get isAbstract => hasModifier(Modifier.ABSTRACT);
 
   @override
-  bool get isOrInheritsProxy => _safeIsOrInheritsProxy(this, new Set<ClassElement>());
+  bool get isOrInheritsProxy => _safeIsOrInheritsProxy(this, new HashSet<ClassElement>());
 
   @override
   bool get isProxy {
@@ -1701,7 +1701,7 @@
   }
 
   PropertyAccessorElement _internalLookUpGetter(String getterName, LibraryElement library, bool includeThisClass) {
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     ClassElement currentElement = this;
     if (includeThisClass) {
       PropertyAccessorElement element = currentElement.getGetter(getterName);
@@ -1733,7 +1733,7 @@
   }
 
   MethodElement _internalLookUpMethod(String methodName, LibraryElement library, bool includeThisClass) {
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     ClassElement currentElement = this;
     if (includeThisClass) {
       MethodElement element = currentElement.getMethod(methodName);
@@ -1765,7 +1765,7 @@
   }
 
   PropertyAccessorElement _internalLookUpSetter(String setterName, LibraryElement library, bool includeThisClass) {
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     ClassElement currentElement = this;
     if (includeThisClass) {
       PropertyAccessorElement element = currentElement.getSetter(setterName);
@@ -1796,7 +1796,7 @@
     return null;
   }
 
-  bool _safeIsOrInheritsProxy(ClassElement classElt, Set<ClassElement> visitedClassElts) {
+  bool _safeIsOrInheritsProxy(ClassElement classElt, HashSet<ClassElement> visitedClassElts) {
     if (visitedClassElts.contains(classElt)) {
       return false;
     }
@@ -3640,6 +3640,14 @@
  */
 abstract class ElementLocation {
   /**
+   * Return the path to the element whose location is represented by this object. Clients must not
+   * modify the returned array.
+   *
+   * @return the path to the element whose location is represented by this object
+   */
+  List<String> get components;
+
+  /**
    * Return an encoded representation of this location that can be used to create a location that is
    * equal to this location.
    *
@@ -3686,6 +3694,15 @@
     this._components = _decode(encoding);
   }
 
+  /**
+   * Initialize a newly created location from the given components.
+   *
+   * @param components the components of a location
+   */
+  ElementLocationImpl.con3(List<String> components) {
+    this._components = components;
+  }
+
   @override
   bool operator ==(Object object) {
     if (identical(this, object)) {
@@ -3714,11 +3731,7 @@
     return true;
   }
 
-  /**
-   * Return the path to the element whose location is represented by this object.
-   *
-   * @return the path to the element whose location is represented by this object
-   */
+  @override
   List<String> get components => _components;
 
   @override
@@ -4624,6 +4637,9 @@
   PropertyAccessorElement get getter => PropertyAccessorMember.from(baseElement.getter, definingType);
 
   @override
+  DartType get propagatedType => substituteFor(baseElement.propagatedType);
+
+  @override
   PropertyAccessorElement get setter => PropertyAccessorMember.from(baseElement.setter, definingType);
 
   @override
@@ -4755,7 +4771,13 @@
   }
 
   @override
-  String get identifier => "${name}@${nameOffset}";
+  String get identifier {
+    String identifier = super.identifier;
+    if (!isStatic) {
+      identifier += "@${nameOffset}";
+    }
+    return identifier;
+  }
 }
 
 /**
@@ -5148,13 +5170,14 @@
   FunctionTypeImpl.con2(FunctionTypeAliasElement element) : super(element, element == null ? null : element.name);
 
   @override
-  bool operator ==(Object object) => internalEquals(object, new Set<ElementPair>());
+  bool operator ==(Object object) => internalEquals(object, new HashSet<ElementPair>());
 
   @override
   String get displayName {
     String name = this.name;
     if (name == null || name.length == 0) {
-      // TODO(brianwilkerson) Determine whether function types should ever have an empty name.
+      // Function types have an empty name when they are defined implicitly by either a closure or
+      // as part of a parameter declaration.
       List<DartType> normalParameterTypes = this.normalParameterTypes;
       List<DartType> optionalParameterTypes = this.optionalParameterTypes;
       Map<String, DartType> namedParameterTypes = this.namedParameterTypes;
@@ -5451,7 +5474,7 @@
   }
 
   @override
-  bool isAssignableTo(DartType type) => isSubtypeOf2(type, new Set<TypeImpl_TypePair>());
+  bool isAssignableTo(DartType type) => isSubtypeOf2(type, new HashSet<TypeImpl_TypePair>());
 
   @override
   FunctionTypeImpl substitute3(List<DartType> argumentTypes) => substitute2(argumentTypes, typeArguments);
@@ -6071,6 +6094,9 @@
       builder.append(source.fullName);
     }
   }
+
+  @override
+  String get identifier => source.encoding;
 }
 
 /**
@@ -6528,7 +6554,7 @@
    * @return the computed longest inheritance path to Object
    * @see InterfaceType#getLeastUpperBound(Type)
    */
-  static int computeLongestInheritancePathToObject(InterfaceType type) => _computeLongestInheritancePathToObject(type, 0, new Set<ClassElement>());
+  static int computeLongestInheritancePathToObject(InterfaceType type) => _computeLongestInheritancePathToObject(type, 0, new HashSet<ClassElement>());
 
   /**
    * Returns the set of all superinterfaces of the passed [Type].
@@ -6537,7 +6563,7 @@
    * @return the [Set] of superinterfaces of the passed [Type]
    * @see #getLeastUpperBound(Type)
    */
-  static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => _computeSuperinterfaceSet(type, new Set<InterfaceType>());
+  static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => _computeSuperinterfaceSet(type, new HashSet<InterfaceType>());
 
   /**
    * This method computes the longest inheritance path from some passed [Type] to Object. This
@@ -6552,7 +6578,7 @@
    * @see #computeLongestInheritancePathToObject(Type)
    * @see #getLeastUpperBound(Type)
    */
-  static int _computeLongestInheritancePathToObject(InterfaceType type, int depth, Set<ClassElement> visitedClasses) {
+  static int _computeLongestInheritancePathToObject(InterfaceType type, int depth, HashSet<ClassElement> visitedClasses) {
     ClassElement classElement = type.element;
     // Object case
     if (classElement.supertype == null || visitedClasses.contains(classElement)) {
@@ -6596,7 +6622,7 @@
    * @see #computeSuperinterfaceSet(Type)
    * @see #getLeastUpperBound(Type)
    */
-  static Set<InterfaceType> _computeSuperinterfaceSet(InterfaceType type, Set<InterfaceType> set) {
+  static Set<InterfaceType> _computeSuperinterfaceSet(InterfaceType type, HashSet<InterfaceType> set) {
     Element element = type.element;
     if (element != null) {
       List<InterfaceType> superinterfaces = type.interfaces;
@@ -6624,7 +6650,7 @@
    * @return the intersection of the given sets of types
    */
   static List<InterfaceType> _intersection(Set<InterfaceType> first, Set<InterfaceType> second) {
-    Set<InterfaceType> result = new Set<InterfaceType>.from(first);
+    Set<InterfaceType> result = new HashSet<InterfaceType>.from(first);
     result.retainAll(second);
     return new List.from(result);
   }
@@ -6688,7 +6714,7 @@
   InterfaceTypeImpl.con2(String name) : super(null, name);
 
   @override
-  bool operator ==(Object object) => internalEquals(object, new Set<ElementPair>());
+  bool operator ==(Object object) => internalEquals(object, new HashSet<ElementPair>());
 
   @override
   List<PropertyAccessorElement> get accessors {
@@ -6960,7 +6986,7 @@
         return element;
       }
     }
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     InterfaceType supertype = superclass;
     ClassElement supertypeElement = supertype == null ? null : supertype.element;
     while (supertype != null && !visitedClasses.contains(supertypeElement)) {
@@ -6998,7 +7024,7 @@
         return element;
       }
     }
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     InterfaceType supertype = superclass;
     ClassElement supertypeElement = supertype == null ? null : supertype.element;
     while (supertype != null && !visitedClasses.contains(supertypeElement)) {
@@ -7036,7 +7062,7 @@
         return element;
       }
     }
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     InterfaceType supertype = superclass;
     ClassElement supertypeElement = supertype == null ? null : supertype.element;
     while (supertype != null && !visitedClasses.contains(supertypeElement)) {
@@ -7114,7 +7140,7 @@
     } else if (type is! InterfaceType) {
       return false;
     }
-    return _isMoreSpecificThan(type as InterfaceType, new Set<ClassElement>(), withDynamic, visitedTypePairs);
+    return _isMoreSpecificThan(type as InterfaceType, new HashSet<ClassElement>(), withDynamic, visitedTypePairs);
   }
 
   @override
@@ -7138,10 +7164,10 @@
     } else if (this == type) {
       return true;
     }
-    return _isSubtypeOf(type as InterfaceType, new Set<ClassElement>(), visitedTypePairs);
+    return _isSubtypeOf(type as InterfaceType, new HashSet<ClassElement>(), visitedTypePairs);
   }
 
-  bool _isMoreSpecificThan(InterfaceType s, Set<ClassElement> visitedClasses, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+  bool _isMoreSpecificThan(InterfaceType s, HashSet<ClassElement> visitedClasses, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
     //
     // A type T is more specific than a type S, written T << S,  if one of the following conditions
     // is met:
@@ -7205,7 +7231,7 @@
     return false;
   }
 
-  bool _isSubtypeOf(InterfaceType type, Set<ClassElement> visitedClasses, Set<TypeImpl_TypePair> visitedTypePairs) {
+  bool _isSubtypeOf(InterfaceType type, HashSet<ClassElement> visitedClasses, Set<TypeImpl_TypePair> visitedTypePairs) {
     InterfaceType typeT = this;
     InterfaceType typeS = type;
     ClassElement elementT = element;
@@ -7627,7 +7653,7 @@
 
   @override
   List<LibraryElement> get exportedLibraries {
-    Set<LibraryElement> libraries = new Set<LibraryElement>();
+    HashSet<LibraryElement> libraries = new HashSet<LibraryElement>();
     for (ExportElement element in _exports) {
       LibraryElement library = element.exportedLibrary;
       if (library != null) {
@@ -7642,7 +7668,7 @@
 
   @override
   List<LibraryElement> get importedLibraries {
-    Set<LibraryElement> libraries = new Set<LibraryElement>();
+    HashSet<LibraryElement> libraries = new HashSet<LibraryElement>();
     for (ImportElement element in _imports) {
       LibraryElement library = element.importedLibrary;
       if (library != null) {
@@ -7691,7 +7717,7 @@
 
   @override
   List<PrefixElement> get prefixes {
-    Set<PrefixElement> prefixes = new Set<PrefixElement>();
+    HashSet<PrefixElement> prefixes = new HashSet<PrefixElement>();
     for (ImportElement element in _imports) {
       PrefixElement prefix = element.prefix;
       if (prefix != null) {
@@ -8220,6 +8246,9 @@
    * @return the result of transforming the type
    */
   DartType substituteFor(DartType type) {
+    if (type == null) {
+      return null;
+    }
     List<DartType> argumentTypes = _definingType.typeArguments;
     List<DartType> parameterTypes = TypeParameterTypeImpl.getTypes(_definingType.typeParameters);
     return type.substitute2(argumentTypes, parameterTypes);
@@ -8596,7 +8625,7 @@
    * @param elements the list to which the element(s) are to be added
    * @param element the element(s) to be added
    */
-  static void _add(Set<Element> elements, Element element) {
+  static void _add(HashSet<Element> elements, Element element) {
     if (element is MultiplyDefinedElementImpl) {
       for (Element conflictingElement in element.conflictingElements) {
         elements.add(conflictingElement);
@@ -8616,7 +8645,7 @@
    * @return an array containing all of the conflicting elements
    */
   static List<Element> _computeConflictingElements(Element firstElement, Element secondElement) {
-    Set<Element> elements = new Set<Element>();
+    HashSet<Element> elements = new HashSet<Element>();
     _add(elements, firstElement);
     _add(elements, secondElement);
     return new List.from(elements);
@@ -9810,6 +9839,14 @@
   PropertyAccessorElement get getter;
 
   /**
+   * Return the propagated type of this variable, or `null` if type propagation has not been
+   * performed, for example because the variable is not final.
+   *
+   * @return the propagated type of this variable
+   */
+  DartType get propagatedType;
+
+  /**
    * Return the setter associated with this variable, or `null` if the variable is effectively
    * `final` and therefore does not have a setter associated with it. (This can happen either
    * because the variable is explicitly defined as being `final` or because the variable is
@@ -9846,6 +9883,12 @@
   PropertyAccessorElement setter;
 
   /**
+   * The propagated type of this variable, or `null` if type propagation has not been
+   * performed.
+   */
+  DartType propagatedType;
+
+  /**
    * An empty array of elements.
    */
   static List<PropertyInducingElement> EMPTY_ARRAY = new List<PropertyInducingElement>(0);
@@ -10387,7 +10430,7 @@
   DartType getLeastUpperBound(DartType type) => null;
 
   @override
-  bool isAssignableTo(DartType type) => isAssignableTo2(type, new Set<TypeImpl_TypePair>());
+  bool isAssignableTo(DartType type) => isAssignableTo2(type, new HashSet<TypeImpl_TypePair>());
 
   /**
    * Return `true` if this type is assignable to the given type. A type <i>T</i> may be
@@ -10414,7 +10457,7 @@
   bool get isDynamic => false;
 
   @override
-  bool isMoreSpecificThan(DartType type) => isMoreSpecificThan2(type, false, new Set<TypeImpl_TypePair>());
+  bool isMoreSpecificThan(DartType type) => isMoreSpecificThan2(type, false, new HashSet<TypeImpl_TypePair>());
 
   /**
    * Return `true` if this type is more specific than the given type.
@@ -10443,7 +10486,7 @@
   bool get isObject => false;
 
   @override
-  bool isSubtypeOf(DartType type) => isSubtypeOf2(type, new Set<TypeImpl_TypePair>());
+  bool isSubtypeOf(DartType type) => isSubtypeOf2(type, new HashSet<TypeImpl_TypePair>());
 
   /**
    * Return `true` if this type is a subtype of the given type.
@@ -10700,11 +10743,11 @@
     if (s.isDynamic) {
       return true;
     }
-    return _isMoreSpecificThan(s, new Set<DartType>(), withDynamic, visitedTypePairs);
+    return _isMoreSpecificThan(s, new HashSet<DartType>(), withDynamic, visitedTypePairs);
   }
 
   @override
-  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => isMoreSpecificThan2(type, true, new Set<TypeImpl_TypePair>());
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => isMoreSpecificThan2(type, true, new HashSet<TypeImpl_TypePair>());
 
   bool _isMoreSpecificThan(DartType s, Set<DartType> visitedTypes, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
     //
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index c513eec..b1d7275 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -7,6 +7,7 @@
 
 library engine;
 
+import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'utilities_collection.dart';
@@ -18,10 +19,10 @@
 import 'ast.dart';
 import 'parser.dart' show Parser, IncrementalParser;
 import 'sdk.dart' show DartSdk;
+import 'constant.dart';
 import 'element.dart';
 import 'resolver.dart';
 import 'html.dart' as ht;
-import 'package:analyzer/src/generated/constant.dart';
 
 /**
  * Instances of the class `AnalysisCache` implement an LRU cache of information related to
@@ -867,19 +868,19 @@
    * An array containing sources whose AST structure is needed in order to resolve the next library
    * to be resolved.
    */
-  Set<Source> _neededForResolution = null;
+  HashSet<Source> _neededForResolution = null;
 
   /**
    * A table mapping sources to the change notices that are waiting to be returned related to that
    * source.
    */
-  Map<Source, ChangeNoticeImpl> _pendingNotices = new Map<Source, ChangeNoticeImpl>();
+  HashMap<Source, ChangeNoticeImpl> _pendingNotices = new HashMap<Source, ChangeNoticeImpl>();
 
   /**
    * A set containing information about the tasks that have been performed since the last change
    * notification. Used to detect infinite loops in [performAnalysisTask].
    */
-  Set<String> _recentTasks = new Set<String>();
+  HashSet<String> _recentTasks = new HashSet<String>();
 
   /**
    * The object used to synchronize access to all of the caches. The rules related to the use of
@@ -965,6 +966,11 @@
       }
     }
     for (Source source in changeSet.changedSources) {
+      if (_contentCache.getContents(source) != null) {
+        // This source is overridden in the content cache, so the change will have no effect.
+        // Just ignore it to avoid wasting time doing re-analysis.
+        continue;
+      }
       _sourceChanged(source);
     }
     for (MapEntry<Source, String> entry in getMapEntrySet(changeSet.changedContents)) {
@@ -1254,19 +1260,25 @@
   Element getElement(ElementLocation location) {
     // TODO(brianwilkerson) This should not be a "get" method.
     try {
-      List<String> components = (location as ElementLocationImpl).components;
-      Source librarySource = _computeSourceFromEncoding(components[0]);
-      ElementImpl element = computeLibraryElement(librarySource) as ElementImpl;
-      for (int i = 1; i < components.length; i++) {
-        if (element == null) {
-          return null;
+      List<String> components = location.components;
+      Source source = _computeSourceFromEncoding(components[0]);
+      String sourceName = source.shortName;
+      if (AnalysisEngine.isDartFileName(sourceName)) {
+        ElementImpl element = computeLibraryElement(source) as ElementImpl;
+        for (int i = 1; i < components.length; i++) {
+          if (element == null) {
+            return null;
+          }
+          element = element.getChild(components[i]);
         }
-        element = element.getChild(components[i]);
+        return element;
       }
-      return element;
+      if (AnalysisEngine.isHtmlFileName(sourceName)) {
+        return computeHtmlElement(source);
+      }
     } on AnalysisException catch (exception) {
-      return null;
     }
+    return null;
   }
 
   @override
@@ -1440,6 +1452,9 @@
   }
 
   @override
+  List<Source> get prioritySources => _priorityOrder;
+
+  @override
   Namespace getPublicNamespace(LibraryElement library) {
     // TODO(brianwilkerson) Rename this to not start with 'get'. Note that this is not part of the
     // API of the interface.
@@ -1522,7 +1537,7 @@
    * @return a list of the sources that would be processed by [performAnalysisTask]
    */
   List<Source> get sourcesNeedingProcessing {
-    Set<Source> sources = new Set<Source>();
+    HashSet<Source> sources = new HashSet<Source>();
     bool hintsEnabled = _options.hint;
     //
     // Look for priority sources that need to be analyzed.
@@ -1738,7 +1753,7 @@
 
   @override
   void set analysisOptions(AnalysisOptions options) {
-    bool needsRecompute = this._options.analyzeFunctionBodies != options.analyzeFunctionBodies || this._options.generateSdkErrors != options.generateSdkErrors || this._options.enableDeferredLoading != options.enableDeferredLoading || this._options.dart2jsHint != options.dart2jsHint || (this._options.hint && !options.hint) || this._options.preserveComments != options.preserveComments;
+    bool needsRecompute = this._options.analyzeAngular != options.analyzeAngular || this._options.analyzeFunctionBodies != options.analyzeFunctionBodies || this._options.generateSdkErrors != options.generateSdkErrors || this._options.enableDeferredLoading != options.enableDeferredLoading || this._options.dart2jsHint != options.dart2jsHint || (this._options.hint && !options.hint) || this._options.preserveComments != options.preserveComments;
     int cacheSize = options.cacheSize;
     if (this._options.cacheSize != cacheSize) {
       this._options.cacheSize = cacheSize;
@@ -1756,6 +1771,7 @@
         _priorityOrder = newPriorityOrder;
       }
     }
+    this._options.analyzeAngular = options.analyzeAngular;
     this._options.analyzeFunctionBodies = options.analyzeFunctionBodies;
     this._options.generateSdkErrors = options.generateSdkErrors;
     this._options.enableDeferredLoading = options.enableDeferredLoading;
@@ -2490,7 +2506,7 @@
    * @param library the library on which the other libraries depend
    * @param librariesToInvalidate the libraries that depend on the given library
    */
-  void _computeAllLibrariesDependingOn(Source library, Set<Source> librariesToInvalidate) {
+  void _computeAllLibrariesDependingOn(Source library, HashSet<Source> librariesToInvalidate) {
     if (librariesToInvalidate.add(library)) {
       for (Source dependentLibrary in getLibrariesDependingOn(library)) {
         _computeAllLibrariesDependingOn(dependentLibrary, librariesToInvalidate);
@@ -3519,7 +3535,7 @@
    * @param hintsEnabled `true` if hints are currently enabled
    * @param sources the set to which sources should be added
    */
-  void _getSourcesNeedingProcessing(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, Set<Source> sources) {
+  void _getSourcesNeedingProcessing(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, HashSet<Source> sources) {
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
       CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS);
@@ -3554,23 +3570,25 @@
               return;
             }
           }
-          CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource);
-          if (verificationErrorsState == CacheState.INVALID || (isPriority && verificationErrorsState == CacheState.FLUSHED)) {
-            LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
-            if (libraryElement != null) {
-              sources.add(source);
-              return;
-            }
-          }
-          if (hintsEnabled) {
-            CacheState hintsState = dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource);
-            if (hintsState == CacheState.INVALID || (isPriority && hintsState == CacheState.FLUSHED)) {
+          if (_generateSdkErrors || !source.isInSystemLibrary) {
+            CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource);
+            if (verificationErrorsState == CacheState.INVALID || (isPriority && verificationErrorsState == CacheState.FLUSHED)) {
               LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
               if (libraryElement != null) {
                 sources.add(source);
                 return;
               }
             }
+            if (hintsEnabled) {
+              CacheState hintsState = dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource);
+              if (hintsState == CacheState.INVALID || (isPriority && hintsState == CacheState.FLUSHED)) {
+                LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
+                if (libraryElement != null) {
+                  sources.add(source);
+                  return;
+                }
+              }
+            }
           }
         }
       }
@@ -3627,7 +3645,7 @@
    * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
    */
   void _invalidateAllLocalResolutionInformation() {
-    Map<Source, List<Source>> oldPartMap = new Map<Source, List<Source>>();
+    HashMap<Source, List<Source>> oldPartMap = new HashMap<Source, List<Source>>();
     MapIterator<Source, SourceEntry> iterator = _privatePartition.iterator();
     while (iterator.moveNext()) {
       Source source = iterator.key;
@@ -3750,7 +3768,7 @@
    *          infinite recursion
    * @return `true` if this library is, or depends on, dart:html
    */
-  bool _isClient(LibraryElement library, Source htmlSource, Set<LibraryElement> visitedLibraries) {
+  bool _isClient(LibraryElement library, Source htmlSource, HashSet<LibraryElement> visitedLibraries) {
     if (visitedLibraries.contains(library)) {
       return false;
     }
@@ -3870,7 +3888,7 @@
               LibraryElementImpl libraryElement = library.libraryElement;
               dartCopy.setValue(DartEntry.ELEMENT, libraryElement);
               dartCopy.setValue(DartEntry.IS_LAUNCHABLE, libraryElement.entryPoint != null);
-              dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(libraryElement, htmlSource, new Set<LibraryElement>()));
+              dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(libraryElement, htmlSource, new HashSet<LibraryElement>()));
             }
           } else {
             dartCopy.recordBuildElementErrorInLibrary(librarySource, thrownException);
@@ -3949,7 +3967,7 @@
   void _recordElementData(DartEntryImpl dartCopy, LibraryElement library, Source librarySource, Source htmlSource) {
     dartCopy.setValue(DartEntry.ELEMENT, library);
     dartCopy.setValue(DartEntry.IS_LAUNCHABLE, library.entryPoint != null);
-    dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(library, htmlSource, new Set<LibraryElement>()));
+    dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(library, htmlSource, new HashSet<LibraryElement>()));
   }
 
   /**
@@ -4038,7 +4056,7 @@
     Source librarySource = task.libraryElement.source;
     CaughtException thrownException = task.exception;
     DartEntry libraryEntry = null;
-    Map<Source, TimestampedData<List<AnalysisError>>> hintMap = task.hintMap;
+    HashMap<Source, TimestampedData<List<AnalysisError>>> hintMap = task.hintMap;
     if (hintMap == null) {
       // We don't have any information about which sources to mark as invalid other than the library
       // source.
@@ -4949,7 +4967,7 @@
    *
    * @param oldPartMap the table containing the parts associated with each library
    */
-  void _removeFromPartsUsingMap(Map<Source, List<Source>> oldPartMap) {
+  void _removeFromPartsUsingMap(HashMap<Source, List<Source>> oldPartMap) {
     for (MapEntry<Source, List<Source>> entry in getMapEntrySet(oldPartMap)) {
       Source librarySource = entry.getKey();
       List<Source> oldParts = entry.getValue();
@@ -5036,7 +5054,7 @@
       _workManager.add(source, SourcePriority.HTML);
     } else if (sourceEntry is DartEntry) {
       List<Source> containingLibraries = getLibrariesContaining(source);
-      Set<Source> librariesToInvalidate = new Set<Source>();
+      HashSet<Source> librariesToInvalidate = new HashSet<Source>();
       for (Source containingLibrary in containingLibraries) {
         _computeAllLibrariesDependingOn(containingLibrary, librariesToInvalidate);
       }
@@ -5066,7 +5084,7 @@
       htmlCopy.recordContentError(new CaughtException(new AnalysisException("This source was marked as being deleted"), null));
       _cache.put(source, htmlCopy);
     } else if (sourceEntry is DartEntry) {
-      Set<Source> libraries = new Set<Source>();
+      HashSet<Source> libraries = new HashSet<Source>();
       for (Source librarySource in getLibrariesContaining(source)) {
         libraries.add(librarySource);
         for (Source dependentLibrary in getLibrariesDependingOn(librarySource)) {
@@ -5095,7 +5113,7 @@
       HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
       _invalidateAngularResolution(htmlCopy);
     } else if (sourceEntry is DartEntry) {
-      Set<Source> libraries = new Set<Source>();
+      HashSet<Source> libraries = new HashSet<Source>();
       for (Source librarySource in getLibrariesContaining(source)) {
         libraries.add(librarySource);
         for (Source dependentLibrary in getLibrariesDependingOn(librarySource)) {
@@ -5261,7 +5279,7 @@
    * A table mapping the sources of the defining compilation units of libraries to the
    * representation of the library that has the information needed to resolve the library.
    */
-  Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary>();
+  HashMap<Source, ResolvableLibrary> _libraryMap = new HashMap<Source, ResolvableLibrary>();
 
   /**
    * The dependency graph used to compute the libraries in the cycle.
@@ -5558,7 +5576,7 @@
    *
    * @param library the library being tested
    */
-  void _ensureExports(ResolvableLibrary library, Set<Source> visitedLibraries) {
+  void _ensureExports(ResolvableLibrary library, HashSet<Source> visitedLibraries) {
     List<ResolvableLibrary> dependencies = library.exports;
     int dependencyCount = dependencies.length;
     for (int i = 0; i < dependencyCount; i++) {
@@ -5610,7 +5628,7 @@
    * cycle (but are not themselves in the cycle) have element models built for them.
    */
   void _ensureImportsAndExports() {
-    Set<Source> visitedLibraries = new Set<Source>();
+    HashSet<Source> visitedLibraries = new HashSet<Source>();
     int libraryCount = _librariesInCycle.length;
     for (int i = 0; i < libraryCount; i++) {
       ResolvableLibrary library = _librariesInCycle[i];
@@ -5636,16 +5654,18 @@
     List<CycleBuilder_SourceEntryPair> pairs = new List<CycleBuilder_SourceEntryPair>();
     Source librarySource = library.librarySource;
     DartEntry libraryEntry = AnalysisContextImpl_this._getReadableDartEntry(librarySource);
-    _ensureResolvableCompilationUnit(librarySource, libraryEntry);
-    pairs.add(new CycleBuilder_SourceEntryPair(librarySource, libraryEntry));
-    List<Source> partSources = _getSources(librarySource, libraryEntry, DartEntry.INCLUDED_PARTS);
-    int count = partSources.length;
-    for (int i = 0; i < count; i++) {
-      Source partSource = partSources[i];
-      DartEntry partEntry = AnalysisContextImpl_this._getReadableDartEntry(partSource);
-      if (partEntry != null && partEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) {
-        _ensureResolvableCompilationUnit(partSource, partEntry);
-        pairs.add(new CycleBuilder_SourceEntryPair(partSource, partEntry));
+    if (libraryEntry != null && libraryEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) {
+      _ensureResolvableCompilationUnit(librarySource, libraryEntry);
+      pairs.add(new CycleBuilder_SourceEntryPair(librarySource, libraryEntry));
+      List<Source> partSources = _getSources(librarySource, libraryEntry, DartEntry.INCLUDED_PARTS);
+      int count = partSources.length;
+      for (int i = 0; i < count; i++) {
+        Source partSource = partSources[i];
+        DartEntry partEntry = AnalysisContextImpl_this._getReadableDartEntry(partSource);
+        if (partEntry != null && partEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) {
+          _ensureResolvableCompilationUnit(partSource, partEntry);
+          pairs.add(new CycleBuilder_SourceEntryPair(partSource, partEntry));
+        }
       }
     }
     return pairs;
@@ -5666,9 +5686,9 @@
     }
   }
 
-  Set<Source> _gatherSources(List<CycleBuilder_LibraryPair> libraryData) {
+  HashSet<Source> _gatherSources(List<CycleBuilder_LibraryPair> libraryData) {
     int libraryCount = libraryData.length;
-    Set<Source> sources = new Set<Source>();
+    HashSet<Source> sources = new HashSet<Source>();
     for (int i = 0; i < libraryCount; i++) {
       List<CycleBuilder_SourceEntryPair> entryPairs = libraryData[i].entryPairs;
       int entryCount = entryPairs.length;
@@ -5784,11 +5804,11 @@
  * Implementation of the [AnalysisContextStatistics].
  */
 class AnalysisContextStatisticsImpl implements AnalysisContextStatistics {
-  Map<String, AnalysisContextStatistics_CacheRow> _dataMap = new Map<String, AnalysisContextStatistics_CacheRow>();
+  Map<String, AnalysisContextStatistics_CacheRow> _dataMap = new HashMap<String, AnalysisContextStatistics_CacheRow>();
 
   List<Source> _sources = new List<Source>();
 
-  Set<CaughtException> _exceptions = new Set<CaughtException>();
+  HashSet<CaughtException> _exceptions = new HashSet<CaughtException>();
 
   List<AnalysisContextStatistics_PartitionData> _partitionData;
 
@@ -5965,7 +5985,7 @@
   /**
    * A mapping from source to what type of analysis should be performed on that source.
    */
-  Map<Source, AnalysisLevel> _analysisMap = new Map<Source, AnalysisLevel>();
+  HashMap<Source, AnalysisLevel> _analysisMap = new HashMap<Source, AnalysisLevel>();
 
   /**
    * Return a collection of the sources that have been added. This is equivalent to calling
@@ -7645,7 +7665,7 @@
   /**
    * A table mapping library sources to the information being maintained for those libraries.
    */
-  Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary>();
+  HashMap<Source, ResolvableLibrary> _libraryMap = new HashMap<Source, ResolvableLibrary>();
 
   /**
    * Initialize a newly created task to perform analysis within the given context.
@@ -7759,7 +7779,7 @@
   void _buildDirectiveModels() {
     AnalysisContext analysisContext = context;
     for (ResolvableLibrary library in librariesInCycle) {
-      Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixElementImpl>();
+      HashMap<String, PrefixElementImpl> nameToPrefixMap = new HashMap<String, PrefixElementImpl>();
       List<ImportElement> imports = new List<ImportElement>();
       List<ExportElement> exports = new List<ExportElement>();
       for (Directive directive in library.definingCompilationUnit.directives) {
@@ -7872,8 +7892,8 @@
    *
    * @return the map that was built
    */
-  Map<Source, ResolvableLibrary> _buildLibraryMap() {
-    Map<Source, ResolvableLibrary> libraryMap = new Map<Source, ResolvableLibrary>();
+  HashMap<Source, ResolvableLibrary> _buildLibraryMap() {
+    HashMap<Source, ResolvableLibrary> libraryMap = new HashMap<Source, ResolvableLibrary>();
     int libraryCount = librariesInCycle.length;
     for (int i = 0; i < libraryCount; i++) {
       ResolvableLibrary library = librariesInCycle[i];
@@ -7936,7 +7956,7 @@
   /**
    * A table mapping the sources known to the context to the information known about the source.
    */
-  Map<Source, SourceEntry> _sourceMap = new Map<Source, SourceEntry>();
+  HashMap<Source, SourceEntry> _sourceMap = new HashMap<Source, SourceEntry>();
 
   /**
    * The maximum number of sources for which AST structures should be kept in the cache.
@@ -8358,13 +8378,13 @@
    * A table mapping the sources whose content has been changed to the current content of those
    * sources.
    */
-  Map<Source, String> _changedContent = new Map<Source, String>();
+  HashMap<Source, String> _changedContent = new HashMap<Source, String>();
 
   /**
    * A table mapping the sources whose content has been changed within a single range to the current
    * content of those sources and information about the affected range.
    */
-  final Map<Source, ChangeSet_ContentChange> changedRanges = new Map<Source, ChangeSet_ContentChange>();
+  final HashMap<Source, ChangeSet_ContentChange> changedRanges = new HashMap<Source, ChangeSet_ContentChange>();
 
   /**
    * A list containing the sources that have been removed.
@@ -8417,7 +8437,8 @@
 
   /**
    * Record that the specified source has been changed. If the content of the source was previously
-   * overridden, use [changedContent] instead.
+   * overridden, this has no effect (the content remains overridden). To cancel (or change) the
+   * override, use [changedContent] instead.
    *
    * @param source the source that was changed
    */
@@ -8536,7 +8557,7 @@
    * @param label the label used to prefix the sources
    * @return `true` if future lists of sources will need a separator
    */
-  bool _appendSources2(JavaStringBuilder builder, Map<Source, dynamic> sources, bool needsSeparator, String label) {
+  bool _appendSources2(JavaStringBuilder builder, HashMap<Source, dynamic> sources, bool needsSeparator, String label) {
     if (sources.isEmpty) {
       return needsSeparator;
     }
@@ -10478,7 +10499,7 @@
    * A table mapping the sources that were analyzed to the hints that were generated for the
    * sources.
    */
-  Map<Source, TimestampedData<List<AnalysisError>>> _hintMap;
+  HashMap<Source, TimestampedData<List<AnalysisError>>> _hintMap;
 
   /**
    * Initialize a newly created task to perform analysis within the given context.
@@ -10501,7 +10522,7 @@
    * @return a table mapping the sources that were analyzed to the hints that were generated for the
    *         sources
    */
-  Map<Source, TimestampedData<List<AnalysisError>>> get hintMap => _hintMap;
+  HashMap<Source, TimestampedData<List<AnalysisError>>> get hintMap => _hintMap;
 
   @override
   String get taskDescription {
@@ -10531,7 +10552,7 @@
     //
     // Store the results.
     //
-    _hintMap = new Map<Source, TimestampedData<List<AnalysisError>>>();
+    _hintMap = new HashMap<Source, TimestampedData<List<AnalysisError>>>();
     for (int i = 0; i < unitCount; i++) {
       int modificationTime = _units[i].modificationTime;
       Source source = _units[i].data.element.source;
@@ -11980,6 +12001,18 @@
   }
 
   @override
+  List<Source> get prioritySources {
+    InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getPrioritySources");
+    _checkThread(instrumentation);
+    try {
+      instrumentation.metric3("contextId", _contextId);
+      return _basis.prioritySources;
+    } finally {
+      instrumentation.log();
+    }
+  }
+
+  @override
   Namespace getPublicNamespace(LibraryElement library) => _basis.getPublicNamespace(library);
 
   @override
@@ -12315,6 +12348,14 @@
   InternalAnalysisContext extractContextInto(SourceContainer container, InternalAnalysisContext newContext);
 
   /**
+   * Return an array containing all of the sources that have been marked as priority sources.
+   * Clients must not modify the returned array.
+   *
+   * @return the sources that have been marked as priority sources
+   */
+  List<Source> get prioritySources;
+
+  /**
    * Return a namespace containing mappings for all of the public names defined by the given
    * library.
    *
@@ -12762,17 +12803,17 @@
   /**
    * A set containing the sources referenced by 'export' directives.
    */
-  Set<Source> _exportedSources = new Set<Source>();
+  HashSet<Source> _exportedSources = new HashSet<Source>();
 
   /**
    * A set containing the sources referenced by 'import' directives.
    */
-  Set<Source> _importedSources = new Set<Source>();
+  HashSet<Source> _importedSources = new HashSet<Source>();
 
   /**
    * A set containing the sources referenced by 'part' directives.
    */
-  Set<Source> _includedSources = new Set<Source>();
+  HashSet<Source> _includedSources = new HashSet<Source>();
 
   /**
    * The errors that were produced by scanning and parsing the source.
@@ -12907,7 +12948,7 @@
    * @param sources the set to be converted
    * @return an array containing all of the sources in the given set
    */
-  List<Source> _toArray(Set<Source> sources) {
+  List<Source> _toArray(HashSet<Source> sources) {
     int size = sources.length;
     if (size == 0) {
       return Source.EMPTY_ARRAY;
@@ -13071,7 +13112,7 @@
   /**
    * A table mapping SDK's to the partitions used for those SDK's.
    */
-  Map<DartSdk, SdkCachePartition> _sdkPartitions = new Map<DartSdk, SdkCachePartition>();
+  HashMap<DartSdk, SdkCachePartition> _sdkPartitions = new HashMap<DartSdk, SdkCachePartition>();
 
   /**
    * The default cache size for a Dart SDK partition.
@@ -13654,7 +13695,7 @@
   /**
    * A HashMap of lists containing the errors that were collected, keyed by each [Source].
    */
-  Map<Source, Set<AnalysisError>> _errors = new Map<Source, Set<AnalysisError>>();
+  Map<Source, HashSet<AnalysisError>> _errors = new HashMap<Source, HashSet<AnalysisError>>();
 
   /**
    * Add all of the errors recorded by the given listener to this listener.
@@ -13673,13 +13714,13 @@
    * @return an array of errors (not `null`, contains no `null`s)
    */
   List<AnalysisError> get errors {
-    Iterable<MapEntry<Source, Set<AnalysisError>>> entrySet = getMapEntrySet(_errors);
+    Iterable<MapEntry<Source, HashSet<AnalysisError>>> entrySet = getMapEntrySet(_errors);
     int numEntries = entrySet.length;
     if (numEntries == 0) {
       return AnalysisError.NO_ERRORS;
     }
     List<AnalysisError> resultList = new List<AnalysisError>();
-    for (MapEntry<Source, Set<AnalysisError>> entry in entrySet) {
+    for (MapEntry<Source, HashSet<AnalysisError>> entry in entrySet) {
       resultList.addAll(entry.getValue());
     }
     return new List.from(resultList);
@@ -13693,7 +13734,7 @@
    * @return the errors collected by the listener for the passed [Source]
    */
   List<AnalysisError> getErrorsForSource(Source source) {
-    Set<AnalysisError> errorsForSource = _errors[source];
+    HashSet<AnalysisError> errorsForSource = _errors[source];
     if (errorsForSource == null) {
       return AnalysisError.NO_ERRORS;
     } else {
@@ -13704,9 +13745,9 @@
   @override
   void onError(AnalysisError error) {
     Source source = error.source;
-    Set<AnalysisError> errorsForSource = _errors[source];
+    HashSet<AnalysisError> errorsForSource = _errors[source];
     if (_errors[source] == null) {
-      errorsForSource = new Set<AnalysisError>();
+      errorsForSource = new HashSet<AnalysisError>();
       _errors[source] = errorsForSource;
     }
     errorsForSource.add(error);
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index e92f2ae..5cdc4b9 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -7,11 +7,12 @@
 
 library engine.error;
 
+import 'dart:collection';
 import 'java_core.dart';
 import 'source.dart';
 import 'scanner.dart' show Token;
 import 'ast.dart' show AstNode;
-import 'element.dart' show Element;
+import 'element.dart';
 
 /**
  * Instances of the class `AnalysisError` represent an error discovered during the analysis of
@@ -244,7 +245,7 @@
   /**
    * The properties associated with this error.
    */
-  Map<ErrorProperty, Object> _propertyMap = new Map<ErrorProperty, Object>();
+  HashMap<ErrorProperty, Object> _propertyMap = new HashMap<ErrorProperty, Object>();
 
   /**
    * Initialize a newly created analysis error for the specified source. The error has no location
@@ -353,6 +354,9 @@
 
   @override
   ErrorType get type => ErrorType.ANGULAR;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -1000,14 +1004,20 @@
    * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
    * <b>this</b>.<i>id</i>.
    */
-  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 74, "Instance member cannot be accessed from static method");
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_FACTORY = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_FACTORY', 74, "Instance members cannot be accessed from a factory constructor");
+
+  /**
+   * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
+   * <b>this</b>.<i>id</i>.
+   */
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 75, "Instance members cannot be accessed from a static method");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 75, "Annotation can be only constant variable or constant constructor invocation");
+  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 76, "Annotation can be only constant variable or constant constructor invocation");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
@@ -1017,7 +1027,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY', 76, "Constant values from a deferred library cannot be used as annotations");
+  static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY', 77, "Constant values from a deferred library cannot be used as annotations");
 
   /**
    * TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
@@ -1025,26 +1035,26 @@
    *
    * See TODOs in ConstantVisitor
    */
-  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 77, "Invalid constant value");
+  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 78, "Invalid constant value");
 
   /**
    * 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
    * name.
    */
-  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 78, "Invalid constructor name");
+  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 79, "Invalid constructor name");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of the immediately
    * enclosing class.
    */
-  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 79, "The name of the immediately enclosing class expected");
+  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 80, "The name of the immediately enclosing class expected");
 
   /**
    * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
    * initializer, in a factory constructor, or in a static method or variable initializer, or in the
    * initializer of an instance variable.
    */
-  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 80, "Invalid reference to 'this' expression");
+  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 81, "Invalid reference to 'this' expression");
 
   /**
    * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
@@ -1052,7 +1062,7 @@
    *
    * @name the name of the type parameter
    */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 81, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 82, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
@@ -1060,7 +1070,7 @@
    *
    * @name the name of the type parameter
    */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 82, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 83, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1075,7 +1085,7 @@
    * @param uri the URI that is invalid
    * @see #URI_DOES_NOT_EXIST
    */
-  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 83, "Invalid URI syntax: '%s'");
+  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 84, "Invalid URI syntax: '%s'");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1086,7 +1096,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 84, "Cannot reference label '%s' declared in an outer method");
+  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 85, "Cannot reference label '%s' declared in an outer method");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1097,7 +1107,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 85, "Cannot reference undefined label '%s'");
+  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 86, "Cannot reference undefined label '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -1111,7 +1121,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 86, "The element type '%s' cannot be assigned to the list type '%s'");
+  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 87, "The element type '%s' cannot be assigned to the list type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1125,7 +1135,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 87, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 88, "The element type '%s' cannot be assigned to the map key type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1139,13 +1149,13 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 88, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 89, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
    * as <i>C</i>.
    */
-  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 89, "Class members cannot have the same name as the enclosing class");
+  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 90, "Class members cannot have the same name as the enclosing class");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -1153,17 +1163,17 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 90, "'%s' cannot be used to name a method, there is already a getter with the same name");
+  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 91, "'%s' cannot be used to name a method, there is already a getter with the same name");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant list literal.
    */
-  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 91, "List literals must be prefixed with 'const' when used as a constant expression");
+  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 92, "List literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant map literal.
    */
-  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 92, "Map literals must be prefixed with 'const' when used as a constant expression");
+  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 93, "Map literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
@@ -1171,7 +1181,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 93, "The class '%s' cannot be used as a mixin because it declares a constructor");
+  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 94, "The class '%s' cannot be used as a mixin because it declares a constructor");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if the with clause of a mixin application
@@ -1181,7 +1191,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #IMPLEMENTS_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 94, "This class cannot mixin the deferred class '%s'");
+  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 95, "This class cannot mixin the deferred class '%s'");
 
   /**
    * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
@@ -1189,7 +1199,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 95, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
+  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 96, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -1208,43 +1218,43 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 96, "Classes cannot mixin '%s'");
+  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 97, "Classes cannot mixin '%s'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>M</i> does not denote a class or mixin
    * available in the immediately enclosing scope.
    */
-  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 97, "Classes can only mixin other classes");
+  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 98, "Classes can only mixin other classes");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
    */
-  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 98, "The class '%s' cannot be used as a mixin because it references 'super'");
+  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 99, "The class '%s' cannot be used as a mixin because it references 'super'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>S</i> does not denote a class available
    * in the immediately enclosing scope.
    */
-  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 99, "Mixin can only be applied to class");
+  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 100, "Mixin can only be applied to class");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 100, "Constructor may have at most one 'this' redirection");
+  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 101, "Constructor may have at most one 'this' redirection");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Then <i>k</i> may
    * include at most one superinitializer in its initializer list or a compile time error occurs.
    */
-  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 101, "Constructor may have at most one 'super' initializer");
+  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 102, "Constructor may have at most one 'super' initializer");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 102, "Annotation creation must have arguments");
+  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 103, "Annotation creation must have arguments");
 
   /**
    * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
@@ -1254,7 +1264,7 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 103, "The class '%s' does not have a default constructor");
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 104, "The class '%s' does not have a default constructor");
 
   /**
    * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
@@ -1263,13 +1273,13 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 104, "The class '%s' does not have a default constructor");
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 105, "The class '%s' does not have a default constructor");
 
   /**
    * 13.2 Expression Statements: It is a compile-time error if a non-constant map literal that has
    * no explicit type arguments appears in a place where a statement is expected.
    */
-  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 105, "A non-constant map literal without type arguments cannot be used as an expression statement");
+  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 106, "A non-constant map literal without type arguments cannot be used as an expression statement");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1280,7 +1290,7 @@
    * s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
    * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 106, "Case expressions must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 107, "Case expressions must be constant");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1294,13 +1304,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY', 107, "Constant values from a deferred library cannot be used as a case expression");
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY', 108, "Constant values from a deferred library cannot be used as a case expression");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
    * parameter is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 108, "Default values of an optional parameter must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 109, "Default values of an optional parameter must be constant");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
@@ -1309,13 +1319,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY', 109, "Constant values from a deferred library cannot be used as a default parameter value");
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY', 110, "Constant values from a deferred library cannot be used as a default parameter value");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
    * compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 110, "'const' lists must have all constant values");
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 111, "'const' lists must have all constant values");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
@@ -1324,13 +1334,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY', 111, "Constant values from a deferred library cannot be used as values in a 'const' list");
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY', 112, "Constant values from a deferred library cannot be used as values in a 'const' list");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 112, "The keys in a map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 113, "The keys in a map must be constant");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
@@ -1339,13 +1349,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY', 113, "Constant values from a deferred library cannot be used as keys in a map");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY', 114, "Constant values from a deferred library cannot be used as keys in a map");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 114, "The values in a 'const' map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 115, "The values in a 'const' map must be constant");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
@@ -1354,7 +1364,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY', 115, "Constant values from a deferred library cannot be used as values in a 'const' map");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY', 116, "Constant values from a deferred library cannot be used as values in a 'const' map");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
@@ -1364,13 +1374,13 @@
    * "From deferred library" case is covered by
    * [CompileTimeErrorCode#INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY].
    */
-  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 116, "Annotation creation can use only 'const' constructor");
+  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 117, "Annotation creation can use only 'const' constructor");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
    * constant constructor must be a potentially constant expression, or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 117, "Initializer expressions in constant constructors must be constants");
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 118, "Initializer expressions in constant constructors must be constants");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
@@ -1379,7 +1389,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY', 118, "Constant values from a deferred library cannot be used as constant initializers");
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY', 119, "Constant values from a deferred library cannot be used as constant initializers");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
@@ -1390,7 +1400,7 @@
    * @param requiredCount the expected number of required arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 119, "%d required argument(s) expected, but %d found");
+  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 120, "%d required argument(s) expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1398,17 +1408,17 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 120, "The generative constructor '%s' expected, but factory found");
+  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 121, "The generative constructor '%s' expected, but factory found");
 
   /**
    * 7.9 Superclasses: It is a compile-time error to specify an extends clause for class Object.
    */
-  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 121, "");
+  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 122, "");
 
   /**
    * 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
    */
-  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 122, "Optional parameters are not allowed when defining an operator");
+  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 123, "Optional parameters are not allowed when defining an operator");
 
   /**
    * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
@@ -1416,25 +1426,25 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 123, "The included part '%s' must have a part-of directive");
+  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 124, "The included part '%s' must have a part-of directive");
 
   /**
    * 14.1 Imports: It is a compile-time error if the current library declares a top-level member
    * named <i>p</i>.
    */
-  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 124, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
+  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 125, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the name of a named optional parameter
    * begins with an '_' character.
    */
-  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 125, "Named optional parameters cannot start with an underscore");
+  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 126, "Named optional parameters cannot start with an underscore");
 
   /**
    * 12.1 Constants: It is a compile-time error if the value of a compile-time constant expression
    * depends on itself.
    */
-  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 126, "");
+  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 127, "");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1445,13 +1455,13 @@
    *
    * https://code.google.com/p/dart/issues/detail?id=954
    */
-  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 127, "Cycle in redirecting generative constructors");
+  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 128, "Cycle in redirecting generative constructors");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if a redirecting factory constructor redirects to
    * itself, either directly or indirectly via a sequence of redirections.
    */
-  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 128, "Cycle in redirecting factory constructors");
+  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 129, "Cycle in redirecting factory constructors");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1464,7 +1474,7 @@
    * @param className the name of the class that implements itself recursively
    * @param strImplementsPath a string representation of the implements loop
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 129, "'%s' cannot be a superinterface of itself: %s");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 130, "'%s' cannot be a superinterface of itself: %s");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1476,7 +1486,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 130, "'%s' cannot extend itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 131, "'%s' cannot extend itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1488,7 +1498,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 131, "'%s' cannot implement itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 132, "'%s' cannot implement itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1500,61 +1510,61 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH', 132, "'%s' cannot use itself as a mixin");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH', 133, "'%s' cannot use itself as a mixin");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 133, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 134, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 134, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 135, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 135, "Constant factory constructor cannot delegate to a non-constant constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 136, "Constant factory constructor cannot delegate to a non-constant constructor");
 
   /**
    * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
    * case its only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR', 136, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR', 137, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
    * case its only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR', 137, "Generative constructor cannot redirect to a factory constructor");
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR', 138, "Generative constructor cannot redirect to a factory constructor");
 
   /**
    * 5 Variables: A local variable may only be referenced at a source code location that is after
    * its initializer, if any, is complete, or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 138, "Local variables cannot be referenced before they are declared");
+  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 139, "Local variables cannot be referenced before they are declared");
 
   /**
    * 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
    * enclosed within a on-catch clause.
    */
-  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 139, "rethrow must be inside of a catch clause");
+  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 140, "rethrow must be inside of a catch clause");
 
   /**
    * 13.12 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
    * appears in a generative constructor.
    */
-  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 140, "Constructors cannot return a value");
+  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 141, "Constructors cannot return a value");
 
   /**
    * 14.1 Imports: It is a compile-time error if a prefix used in a deferred import is used in
    * another import clause.
    */
-  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 141, "The prefix of a deferred import cannot be used in other import directives");
+  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 142, "The prefix of a deferred import cannot be used in other import directives");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1564,19 +1574,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 142, "Invalid context for 'super' invocation");
+  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 143, "Invalid context for 'super' invocation");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 143, "The redirecting constructor cannot have a 'super' initializer");
+  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 144, "The redirecting constructor cannot have a 'super' initializer");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
    * error if a generative constructor of class Object includes a superinitializer.
    */
-  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 144, "");
+  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 145, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1595,19 +1605,19 @@
    * @param boundingTypeName the name of the bounding type
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 145, "'%s' does not extend '%s'");
+  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 146, "'%s' does not extend '%s'");
 
   /**
    * 15.3.1 Typedef: Any self reference, either directly, or recursively via another typedef, is a
    * compile time error.
    */
-  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 146, "Type alias cannot reference itself directly or recursively via another typedef");
+  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 147, "Type alias cannot reference itself directly or recursively via another typedef");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
    */
-  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 147, "Undefined class '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 148, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1615,7 +1625,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 148, "The class '%s' does not have a generative constructor '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 149, "The class '%s' does not have a generative constructor '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1623,7 +1633,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 149, "The class '%s' does not have a default generative constructor");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 150, "The class '%s' does not have a default generative constructor");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1635,7 +1645,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 150, "The named parameter '%s' is not defined");
+  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 151, "The named parameter '%s' is not defined");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1650,7 +1660,7 @@
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 151, "Target of URI does not exist: '%s'");
+  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 152, "Target of URI does not exist: '%s'");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
@@ -1662,7 +1672,7 @@
    * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
    * not a compile-time constant, or if <i>x</i> involves string interpolation.
    */
-  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 152, "URIs cannot use string interpolation");
+  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 153, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1675,7 +1685,7 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 153, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 154, "Operator '%s' should declare exactly %d parameter(s), but %d found");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
@@ -1683,13 +1693,13 @@
    *
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 154, "Operator '-' should declare 0 or 1 parameter, but %d found");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 155, "Operator '-' should declare 0 or 1 parameter, but %d found");
 
   /**
    * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
    * exactly one required formal parameter <i>p</i>.
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 155, "Setters should declare exactly one required parameter");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 156, "Setters should declare exactly one required parameter");
 
   static const List<CompileTimeErrorCode> values = const [
       AMBIGUOUS_EXPORT,
@@ -1766,6 +1776,7 @@
       INITIALIZER_FOR_STATIC_FIELD,
       INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD,
       INITIALIZING_FORMAL_FOR_STATIC_FIELD,
+      INSTANCE_MEMBER_ACCESS_FROM_FACTORY,
       INSTANCE_MEMBER_ACCESS_FROM_STATIC,
       INVALID_ANNOTATION,
       INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
@@ -1880,6 +1891,9 @@
 
   @override
   ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -1921,6 +1935,13 @@
    * @return the type of the error
    */
   ErrorType get type;
+
+  /**
+   * Return a unique name for this error code.
+   *
+   * @return a unique name for this error code
+   */
+  String get uniqueName;
 }
 
 /**
@@ -1996,17 +2017,6 @@
    * Report an error with the given error code and arguments.
    *
    * @param errorCode the error code of the error to be reported
-   * @param node the node specifying the location of the error
-   * @param arguments the arguments to the error, used to compose the error message
-   */
-  void reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
-    reportErrorForOffset(errorCode, node.offset, node.length, arguments);
-  }
-
-  /**
-   * Report an error with the given error code and arguments.
-   *
-   * @param errorCode the error code of the error to be reported
    * @param element the element which name should be used as the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
@@ -2017,6 +2027,21 @@
   /**
    * Report an error with the given error code and arguments.
    *
+   * If the arguments contain the names of two or more types, the method
+   * [reportTypeErrorForNode] should be used and the types
+   * themselves (rather than their names) should be passed as arguments.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param node the node specifying the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
+    reportErrorForOffset(errorCode, node.offset, node.length, arguments);
+  }
+
+  /**
+   * Report an error with the given error code and arguments.
+   *
    * @param errorCode the error code of the error to be reported
    * @param offset the offset of the location of the error
    * @param length the length of the location of the error
@@ -2038,6 +2063,24 @@
   }
 
   /**
+   * Report an error with the given error code and arguments. The arguments are expected to contain
+   * two or more types. Convert the types into strings by using the display names of the types,
+   * unless there are two or more types with the same names, in which case the extended display
+   * names of the types will be used in order to clarify the message.
+   *
+   * If there are not two or more types in the argument list, the method
+   * [reportErrorForNode] should be used instead.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param node the node specifying the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportTypeErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
+    _convertTypeNames(arguments);
+    reportErrorForOffset(errorCode, node.offset, node.length, arguments);
+  }
+
+  /**
    * Set the source to be used when reporting errors. Setting the source to `null` will cause
    * the default source to be used.
    *
@@ -2046,6 +2089,59 @@
   void set source(Source source) {
     this._source = source == null ? _defaultSource : source;
   }
+
+  /**
+   * Given an array of arguments that is expected to contain two or more types, convert the types
+   * into strings by using the display names of the types, unless there are two or more types with
+   * the same names, in which case the extended display names of the types will be used in order to
+   * clarify the message.
+   *
+   * @param arguments the arguments that are to be converted
+   */
+  void _convertTypeNames(List<Object> arguments) {
+    if (_hasEqualTypeNames(arguments)) {
+      int count = arguments.length;
+      for (int i = 0; i < count; i++) {
+        Object argument = arguments[i];
+        if (argument is DartType) {
+          DartType type = argument;
+          Element element = type.element;
+          if (element == null) {
+            arguments[i] = type.displayName;
+          } else {
+            arguments[i] = element.extendedDisplayName;
+          }
+        }
+      }
+    } else {
+      int count = arguments.length;
+      for (int i = 0; i < count; i++) {
+        Object argument = arguments[i];
+        if (argument is DartType) {
+          arguments[i] = argument.displayName;
+        }
+      }
+    }
+  }
+
+  /**
+   * Return `true` if the given array of arguments contains two or more types with the same
+   * display name.
+   *
+   * @param arguments the arguments being tested
+   * @return `true` if the array of arguments contains two or more types with the same display
+   *         name
+   */
+  bool _hasEqualTypeNames(List<Object> arguments) {
+    int count = arguments.length;
+    HashSet<String> typeNames = new HashSet<String>();
+    for (int i = 0; i < count; i++) {
+      if (arguments[i] is DartType && !typeNames.add((arguments[i] as DartType).displayName)) {
+        return true;
+      }
+    }
+    return false;
+  }
 }
 
 /**
@@ -2448,6 +2544,9 @@
 
   @override
   ErrorType get type => ErrorType.HINT;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -2506,6 +2605,9 @@
 
   @override
   ErrorType get type => ErrorType.STATIC_WARNING;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -2555,6 +2657,9 @@
 
   @override
   ErrorType get type => ErrorType.POLYMER;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -2623,6 +2728,9 @@
 
   @override
   ErrorType get type => ErrorType.PUB_SUGGESTION;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -2970,6 +3078,9 @@
 
   @override
   ErrorType get type => ErrorType.STATIC_TYPE_WARNING;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -3897,6 +4008,9 @@
 
   @override
   ErrorType get type => ErrorType.STATIC_WARNING;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -3938,4 +4052,7 @@
 
   @override
   ErrorType get type => ErrorType.TODO;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index 1da03c4..b559477 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -380,7 +380,7 @@
   /**
    * A set containing the names of tags that do not have a closing tag.
    */
-  static Set<String> SELF_CLOSING = new Set<String>.from(JavaArrays.asList(<String> [
+  static Set<String> SELF_CLOSING = new HashSet<String>.from(JavaArrays.asList(<String> [
       "area",
       "base",
       "basefont",
diff --git a/pkg/analyzer/lib/src/generated/index.dart b/pkg/analyzer/lib/src/generated/index.dart
index ae07ab5..92ed388 100644
--- a/pkg/analyzer/lib/src/generated/index.dart
+++ b/pkg/analyzer/lib/src/generated/index.dart
@@ -174,6 +174,33 @@
 }
 
 /**
+ * Instances of the [ClearOperation] implement an operation that removes all of the
+ * information from the index.
+ */
+class ClearOperation implements IndexOperation {
+  /**
+   * The index store against which this operation is being run.
+   */
+  final IndexStore _indexStore;
+
+  ClearOperation(this._indexStore);
+
+  @override
+  bool get isQuery => false;
+
+  @override
+  void performOperation() {
+    _indexStore.clear();
+  }
+
+  @override
+  bool removeWhenSourceRemoved(Source source) => false;
+
+  @override
+  String toString() => "ClearOperation()";
+}
+
+/**
  * Recursively visits [HtmlUnit] and every embedded [Expression].
  */
 abstract class ExpressionVisitor extends ht.RecursiveXmlVisitor<Object> {
@@ -265,6 +292,11 @@
  */
 abstract class Index {
   /**
+   * Asynchronously remove from the index all of the information.
+   */
+  void clear();
+
+  /**
    * Asynchronously invoke the given callback with an array containing all of the locations of the
    * elements that have the given relationship with the given element. For example, if the element
    * represents a method and the relationship is the is-referenced-by relationship, then the
@@ -1048,7 +1080,7 @@
   Object visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier name = node.methodName;
     Element element = name.bestElement;
-    if (element is MethodElement) {
+    if (element is MethodElement || element is PropertyAccessorElement) {
       Location location = _createLocationFromNode(name);
       Relationship relationship;
       if (node.target != null) {
@@ -1494,6 +1526,7 @@
       }
       AngularHtmlIndexContributor contributor = new AngularHtmlIndexContributor(_indexStore);
       unit.accept(contributor);
+      _indexStore.doneIndex();
     } catch (exception) {
       AnalysisEngine.instance.logger.logError2("Could not index ${unit.element.location}", exception);
     }
@@ -1563,6 +1596,19 @@
   bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement);
 
   /**
+   * Removes all of the information.
+   */
+  void clear();
+
+  /**
+   * Notifies that index store that the current Dart or HTML unit indexing is done.
+   *
+   * If this method is not invoked after corresponding "aboutToIndex*" invocation, all recorded
+   * information may be lost.
+   */
+  void doneIndex();
+
+  /**
    * Return the locations of the elements that have the given relationship with the given element.
    * For example, if the element represents a method and the relationship is the is-referenced-by
    * relationship, then the returned locations will be all of the places where the method is
@@ -1699,6 +1745,7 @@
       }
       unit.accept(new IndexContributor(_indexStore));
       unit.accept(new AngularDartIndexContributor(_indexStore));
+      _indexStore.doneIndex();
     } catch (exception) {
       AnalysisEngine.instance.logger.logError2("Could not index ${unit.element.location}", exception);
     }
@@ -1950,6 +1997,20 @@
   }
 
   @override
+  void clear() {
+    _canonicalKeys.clear();
+    _keyToLocations.clear();
+    _contextToSourceToKeys.clear();
+    _contextToSourceToLocations.clear();
+    _contextToLibraryToUnits.clear();
+    _contextToUnitToLibraries.clear();
+  }
+
+  @override
+  void doneIndex() {
+  }
+
+  @override
   List<Location> getRelationships(Element element, Relationship relationship) {
     MemoryIndexStoreImpl_ElementRelationKey key = new MemoryIndexStoreImpl_ElementRelationKey(element, relationship);
     Set<Location> locations = _keyToLocations[key];
diff --git a/pkg/analyzer/lib/src/generated/interner.dart b/pkg/analyzer/lib/src/generated/interner.dart
new file mode 100644
index 0000000..9ff047b
--- /dev/null
+++ b/pkg/analyzer/lib/src/generated/interner.dart
@@ -0,0 +1,49 @@
+// 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 interner;
+
+import 'dart:collection';
+
+/**
+ * The interface `Interner` defines the behavior of objects that can intern
+ * strings.
+ */
+abstract class Interner {
+  /**
+   * Return a string that is identical to all of the other strings that have
+   * been interned that are equal to the given [string].
+   */
+  String intern(String string);
+}
+
+/**
+ * The class `MappedInterner` implements an interner that uses a map to manage
+ * the strings that have been interned.
+ */
+class MappedInterner implements Interner {
+  /**
+   * A table mapping strings to themselves.
+   */
+  Map<String, String> _table = new HashMap<String, String>();
+
+  @override
+  String intern(String string) {
+    String original = _table[string];
+    if (original == null) {
+      _table[string] = string;
+      return string;
+    }
+    return original;
+  }
+}
+
+/**
+ * The class `NullInterner` implements an interner that does nothing (does not
+ * actually intern any strings).
+ */
+class NullInterner implements Interner {
+  @override
+  String intern(String string) => string;
+}
diff --git a/pkg/analyzer/lib/src/generated/java_engine.dart b/pkg/analyzer/lib/src/generated/java_engine.dart
index 3c2d08f..374586f 100644
--- a/pkg/analyzer/lib/src/generated/java_engine.dart
+++ b/pkg/analyzer/lib/src/generated/java_engine.dart
@@ -1,5 +1,6 @@
 library java.engine;
 
+import 'interner.dart';
 import 'java_core.dart';
 
 /**
@@ -10,7 +11,10 @@
 class StringUtilities {
   static const String EMPTY = '';
   static const List<String> EMPTY_ARRAY = const <String>[];
-  static String intern(String s) => s;
+
+  static Interner INTERNER = new NullInterner();
+
+  static String intern(String string) => INTERNER.intern(string);
   static bool isTagName(String s) {
     if (s == null || s.length == 0) {
       return false;
@@ -255,6 +259,17 @@
    * [cause].
    */
   AnalysisException([this.message = 'Exception', this.cause = null]);
+
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("AnalysisException: ");
+    buffer.writeln(message);
+    if (cause != null) {
+      buffer.write('Caused by ');
+      cause._writeOn(buffer);
+    }
+    return buffer.toString();
+  }
 }
 
 
@@ -266,7 +281,7 @@
   /**
    * The exception that was caught.
    */
-  final Exception exception;
+  final Object exception;
 
   /**
    * The stack trace associated with the exception.
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index bac76fa..8ffc875 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -7,6 +7,7 @@
 
 library engine.parser;
 
+import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'instrumentation.dart';
@@ -6064,7 +6065,7 @@
     bool wasInSwitch = _inSwitch;
     _inSwitch = true;
     try {
-      Set<String> definedLabels = new Set<String>();
+      HashSet<String> definedLabels = new HashSet<String>();
       Token keyword = _expectKeyword(Keyword.SWITCH);
       Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
       Expression expression = parseExpression2();
@@ -6570,7 +6571,17 @@
    * Skips a block with all containing blocks.
    */
   void _skipBlock() {
-    _currentToken = (_currentToken as BeginToken).endToken.next;
+    Token endToken = (_currentToken as BeginToken).endToken;
+    if (endToken == null) {
+      endToken = _currentToken.next;
+      while (!identical(endToken, _currentToken)) {
+        _currentToken = endToken;
+        endToken = _currentToken.next;
+      }
+      _reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, ["}"]);
+    } else {
+      _currentToken = endToken.next;
+    }
   }
 
   /**
@@ -7884,6 +7895,9 @@
 
   @override
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 003a977..3fc2b55 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -352,11 +352,22 @@
     Element element = annotation.element;
     if (element is ConstructorElement) {
       ConstructorElement constructorElement = element;
-      return constructorElement.returnType.displayName == name;
+      if (constructorElement.returnType.displayName != name) {
+        return false;
+      }
+      return _isAngularLibraryElement(constructorElement);
     }
     return false;
   }
 
+  /**
+   * Checks if the given [Element] is a part of the Angular library.
+   */
+  bool _isAngularLibraryElement(Element element) {
+    LibraryElement library = element.library;
+    return library != null && library.name != null && library.name.startsWith("angular");
+  }
+
   void _parseComponent() {
     bool isValid = true;
     // publishAs
@@ -910,7 +921,7 @@
     DartType actualBestType = actualPropagatedType != null ? actualPropagatedType : actualStaticType;
     if (actualBestType != null && expectedBestType != null) {
       if (!actualBestType.isAssignableTo(expectedBestType)) {
-        _errorReporter.reportErrorForNode(hintCode, expression, [actualBestType.displayName, expectedBestType.displayName]);
+        _errorReporter.reportTypeErrorForNode(hintCode, expression, [actualBestType, expectedBestType]);
         return true;
       }
     }
@@ -1082,17 +1093,7 @@
     DartType bestRightType = rhs.bestType;
     if (leftType != null && bestRightType != null) {
       if (!bestRightType.isAssignableTo(leftType)) {
-        String leftName = leftType.displayName;
-        String rightName = bestRightType.displayName;
-        if (leftName == rightName) {
-          Element leftElement = leftType.element;
-          Element rightElement = bestRightType.element;
-          if (leftElement != null && rightElement != null) {
-            leftName = leftElement.extendedDisplayName;
-            rightName = rightElement.extendedDisplayName;
-          }
-        }
-        _errorReporter.reportErrorForNode(HintCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
+        _errorReporter.reportTypeErrorForNode(HintCode.INVALID_ASSIGNMENT, rhs, [bestRightType, leftType]);
         return true;
       }
     }
@@ -1191,7 +1192,7 @@
     DartType rhsType = typeName.type;
     // TODO(jwren) After dartbug.com/13732, revisit this, we should be able to remove the
     // !(x instanceof TypeParameterType) checks.
-    if (lhsType != null && rhsType != null && !lhsType.isDynamic && !rhsType.isDynamic && lhsType is! TypeParameterType && rhsType is! TypeParameterType && lhsType.isSubtypeOf(rhsType)) {
+    if (lhsType != null && rhsType != null && !lhsType.isDynamic && !rhsType.isDynamic && lhsType is! TypeParameterType && rhsType is! TypeParameterType && lhsType.isMoreSpecificThan(rhsType)) {
       _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_CAST, node, []);
       return true;
     }
@@ -1233,11 +1234,10 @@
    * @param enclosingScope the scope in which this scope is lexically enclosed
    * @param typeElement the element representing the type represented by this scope
    */
-  ClassScope(Scope enclosingScope, ClassElement typeElement) : super(new EnclosedScope(enclosingScope)) {
+  ClassScope(Scope enclosingScope, ClassElement typeElement) : super(enclosingScope) {
     if (typeElement == null) {
       throw new IllegalArgumentException("class element cannot be null");
     }
-    _defineTypeParameters(typeElement);
     _defineMembers(typeElement);
   }
 
@@ -1266,18 +1266,6 @@
       define(method);
     }
   }
-
-  /**
-   * Define the type parameters for the class.
-   *
-   * @param typeElement the element representing the type represented by this scope
-   */
-  void _defineTypeParameters(ClassElement typeElement) {
-    Scope parameterScope = enclosingScope;
-    for (TypeParameterElement typeParameter in typeElement.typeParameters) {
-      parameterScope.define(typeParameter);
-    }
-  }
 }
 
 /**
@@ -1436,7 +1424,7 @@
     super.visitMapLiteral(node);
     bool isConst = node.constKeyword != null;
     bool reportEqualKeys = true;
-    Set<DartObject> keys = new Set<DartObject>();
+    HashSet<DartObject> keys = new HashSet<DartObject>();
     List<Expression> invalidKeys = new List<Expression>();
     for (MapLiteralEntry entry in node.entries) {
       Expression key = entry.key;
@@ -2197,14 +2185,14 @@
    * A set containing all of the elements in the element model that were defined by the old AST node
    * corresponding to the AST node being visited.
    */
-  Set<Element> _allElements = new Set<Element>();
+  HashSet<Element> _allElements = new HashSet<Element>();
 
   /**
    * A set containing all of the elements in the element model that were defined by the old AST node
    * corresponding to the AST node being visited that have not already been matched to nodes in the
    * AST structure being visited.
    */
-  Set<Element> _unmatchedElements = new Set<Element>();
+  HashSet<Element> _unmatchedElements = new HashSet<Element>();
 
   /**
    * Return `true` if the declarations within the given AST structure define an element model
@@ -3353,7 +3341,7 @@
    * A table mapping field names to field elements for the fields defined in the current class, or
    * `null` if we are not in the scope of a class.
    */
-  Map<String, FieldElement> _fieldMap;
+  HashMap<String, FieldElement> _fieldMap;
 
   /**
    * Initialize a newly created element builder to build the elements for a compilation unit.
@@ -3987,7 +3975,7 @@
    * @param fields the field elements defined in the current class
    */
   void _buildFieldMap(List<FieldElement> fields) {
-    _fieldMap = new Map<String, FieldElement>();
+    _fieldMap = new HashMap<String, FieldElement>();
     int count = fields.length;
     for (int i = 0; i < count; i++) {
       FieldElement field = fields[i];
@@ -5091,7 +5079,7 @@
         }
         if (classElementContext != null) {
           _subtypeManager.ensureLibraryVisited(_definingLibrary);
-          Set<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(classElementContext);
+          HashSet<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(classElementContext);
           for (ClassElement subtypeElement in subtypeElements) {
             if (subtypeElement.getMethod(methodName.name) != null) {
               errorCode = null;
@@ -5891,7 +5879,7 @@
       if (accessor != null) {
         return accessor;
       }
-      return _lookUpGetterInInterfaces(interfaceType, false, getterName, new Set<ClassElement>());
+      return _lookUpGetterInInterfaces(interfaceType, false, getterName, new HashSet<ClassElement>());
     }
     return null;
   }
@@ -5908,7 +5896,7 @@
    *          to prevent infinite recursion and to optimize the search
    * @return the element representing the getter that was found
    */
-  PropertyAccessorElement _lookUpGetterInInterfaces(InterfaceType targetType, bool includeTargetType, String getterName, Set<ClassElement> visitedInterfaces) {
+  PropertyAccessorElement _lookUpGetterInInterfaces(InterfaceType targetType, bool includeTargetType, String getterName, HashSet<ClassElement> visitedInterfaces) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
     // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
     // finding the inherited member. We need to follow that scheme. The code below should cover the
@@ -5964,7 +5952,7 @@
       if (member != null) {
         return member;
       }
-      return _lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new Set<ClassElement>());
+      return _lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new HashSet<ClassElement>());
     }
     return null;
   }
@@ -5981,7 +5969,7 @@
    *          to prevent infinite recursion and to optimize the search
    * @return the element representing the method or getter that was found
    */
-  ExecutableElement _lookUpGetterOrMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String memberName, Set<ClassElement> visitedInterfaces) {
+  ExecutableElement _lookUpGetterOrMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String memberName, HashSet<ClassElement> visitedInterfaces) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
     // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
     // finding the inherited member. We need to follow that scheme. The code below should cover the
@@ -6086,7 +6074,7 @@
       if (method != null) {
         return method;
       }
-      return _lookUpMethodInInterfaces(interfaceType, false, methodName, new Set<ClassElement>());
+      return _lookUpMethodInInterfaces(interfaceType, false, methodName, new HashSet<ClassElement>());
     }
     return null;
   }
@@ -6103,7 +6091,7 @@
    *          to prevent infinite recursion and to optimize the search
    * @return the element representing the method that was found
    */
-  MethodElement _lookUpMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String methodName, Set<ClassElement> visitedInterfaces) {
+  MethodElement _lookUpMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String methodName, HashSet<ClassElement> visitedInterfaces) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
     // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
     // finding the inherited member. We need to follow that scheme. The code below should cover the
@@ -6160,7 +6148,7 @@
       if (accessor != null) {
         return accessor;
       }
-      return _lookUpSetterInInterfaces(interfaceType, false, setterName, new Set<ClassElement>());
+      return _lookUpSetterInInterfaces(interfaceType, false, setterName, new HashSet<ClassElement>());
     }
     return null;
   }
@@ -6177,7 +6165,7 @@
    *          to prevent infinite recursion and to optimize the search
    * @return the element representing the setter that was found
    */
-  PropertyAccessorElement _lookUpSetterInInterfaces(InterfaceType targetType, bool includeTargetType, String setterName, Set<ClassElement> visitedInterfaces) {
+  PropertyAccessorElement _lookUpSetterInInterfaces(InterfaceType targetType, bool includeTargetType, String setterName, HashSet<ClassElement> visitedInterfaces) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
     // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
     // finding the inherited member. We need to follow that scheme. The code below should cover the
@@ -6228,7 +6216,7 @@
   bool _memberFoundInSubclass(Element element, String memberName, bool asMethod, bool asAccessor) {
     if (element is ClassElement) {
       _subtypeManager.ensureLibraryVisited(_definingLibrary);
-      Set<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(element);
+      HashSet<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(element);
       for (ClassElement subtypeElement in subtypeElements) {
         if (asMethod && subtypeElement.getMethod(memberName) != null) {
           return true;
@@ -6440,7 +6428,7 @@
   List<ParameterElement> _resolveArgumentsToParameters(bool reportError, ArgumentList argumentList, List<ParameterElement> parameters) {
     List<ParameterElement> requiredParameters = new List<ParameterElement>();
     List<ParameterElement> positionalParameters = new List<ParameterElement>();
-    Map<String, ParameterElement> namedParameters = new Map<String, ParameterElement>();
+    HashMap<String, ParameterElement> namedParameters = new HashMap<String, ParameterElement>();
     for (ParameterElement parameter in parameters) {
       ParameterKind kind = parameter.parameterKind;
       if (kind == ParameterKind.REQUIRED) {
@@ -6459,7 +6447,7 @@
     int argumentCount = arguments.length;
     List<ParameterElement> resolvedParameters = new List<ParameterElement>(argumentCount);
     int positionalArgumentCount = 0;
-    Set<String> usedNames = new Set<String>();
+    HashSet<String> usedNames = new HashSet<String>();
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
       if (argument is NamedExpression) {
@@ -6938,7 +6926,7 @@
    * According to the scoping rules these names are hidden, even if they were defined in an outer
    * scope.
    */
-  Map<String, Element> _hiddenElements = new Map<String, Element>();
+  HashMap<String, Element> _hiddenElements = new HashMap<String, Element>();
 
   /**
    * A flag indicating whether there are any names defined in this scope.
@@ -7130,6 +7118,11 @@
   bool _isInStaticMethod = false;
 
   /**
+   * This is set to `true` iff the visitor is currently visiting a factory constructor.
+   */
+  bool _isInFactory = false;
+
+  /**
    * This is set to `true` iff the visitor is currently visiting code in the SDK.
    */
   bool _isInSystemLibrary = false;
@@ -7187,27 +7180,27 @@
    * @see #visitClassDeclaration(ClassDeclaration)
    * @see #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration)
    */
-  Map<FieldElement, INIT_STATE> _initialFieldElementsMap;
+  HashMap<FieldElement, INIT_STATE> _initialFieldElementsMap;
 
   /**
    * A table mapping name of the library to the export directive which export this library.
    */
-  Map<String, LibraryElement> _nameToExportElement = new Map<String, LibraryElement>();
+  HashMap<String, LibraryElement> _nameToExportElement = new HashMap<String, LibraryElement>();
 
   /**
    * A table mapping name of the library to the import directive which import this library.
    */
-  Map<String, LibraryElement> _nameToImportElement = new Map<String, LibraryElement>();
+  HashMap<String, LibraryElement> _nameToImportElement = new HashMap<String, LibraryElement>();
 
   /**
    * A table mapping names to the exported elements.
    */
-  Map<String, Element> _exportedElements = new Map<String, Element>();
+  HashMap<String, Element> _exportedElements = new HashMap<String, Element>();
 
   /**
    * A set of the names of the variable initializers we are visiting now.
    */
-  Set<String> _namesForReferenceToDeclaredVariableInInitializer = new Set<String>();
+  HashSet<String> _namesForReferenceToDeclaredVariableInInitializer = new HashSet<String>();
 
   /**
    * A list of types used by the [CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS] and
@@ -7385,7 +7378,7 @@
       // initialize initialFieldElementsMap
       if (_enclosingClass != null) {
         List<FieldElement> fieldElements = _enclosingClass.fields;
-        _initialFieldElementsMap = new Map<FieldElement, INIT_STATE>();
+        _initialFieldElementsMap = new HashMap<FieldElement, INIT_STATE>();
         for (FieldElement fieldElement in fieldElements) {
           if (!fieldElement.isSynthetic) {
             _initialFieldElementsMap[fieldElement] = fieldElement.initializer == null ? INIT_STATE.NOT_INIT : INIT_STATE.INIT_IN_DECLARATION;
@@ -7453,6 +7446,7 @@
       ConstructorElement constructorElement = node.element;
       _enclosingFunction = constructorElement;
       _isEnclosingConstructorConst = node.constKeyword != null;
+      _isInFactory = node.factoryKeyword != null;
       _checkForConstConstructorWithNonFinalField(node, constructorElement);
       _checkForConstConstructorWithNonConstSuper(node);
       _checkForConflictingConstructorNameAndMember(node, constructorElement);
@@ -7469,6 +7463,7 @@
       return super.visitConstructorDeclaration(node);
     } finally {
       _isEnclosingConstructorConst = false;
+      _isInFactory = false;
       _enclosingFunction = outerFunction;
     }
   }
@@ -8010,7 +8005,7 @@
       return false;
     }
     bool foundError = false;
-    Map<FieldElement, INIT_STATE> fieldElementsMap = new Map<FieldElement, INIT_STATE>.from(_initialFieldElementsMap);
+    HashMap<FieldElement, INIT_STATE> fieldElementsMap = new HashMap<FieldElement, INIT_STATE>.from(_initialFieldElementsMap);
     // Visit all of the field formal parameters
     NodeList<FormalParameter> formalParameters = node.parameters.parameters;
     for (FormalParameter formalParameter in formalParameters) {
@@ -8111,60 +8106,6 @@
       isSetter = accessorElement.isSetter;
     }
     String executableElementName = executableElement.name;
-    // SWC.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-    if (overriddenExecutable == null) {
-      if (!isGetter && !isSetter && !executableElement.isOperator) {
-        Set<ClassElement> visitedClasses = new Set<ClassElement>();
-        InterfaceType superclassType = _enclosingClass.supertype;
-        ClassElement superclassElement = superclassType == null ? null : superclassType.element;
-        bool executableElementPrivate = Identifier.isPrivateName(executableElementName);
-        while (superclassElement != null && !visitedClasses.contains(superclassElement)) {
-          visitedClasses.add(superclassElement);
-          LibraryElement superclassLibrary = superclassElement.library;
-          // Check fields.
-          List<FieldElement> fieldElts = superclassElement.fields;
-          for (FieldElement fieldElt in fieldElts) {
-            // We need the same name.
-            if (fieldElt.name != executableElementName) {
-              continue;
-            }
-            // Ignore if private in a different library - cannot collide.
-            if (executableElementPrivate && _currentLibrary != superclassLibrary) {
-              continue;
-            }
-            // instance vs. static
-            if (fieldElt.isStatic) {
-              _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
-                  executableElementName,
-                  fieldElt.enclosingElement.displayName]);
-              return true;
-            }
-          }
-          // Check methods.
-          List<MethodElement> methodElements = superclassElement.methods;
-          for (MethodElement methodElement in methodElements) {
-            // We need the same name.
-            if (methodElement.name != executableElementName) {
-              continue;
-            }
-            // Ignore if private in a different library - cannot collide.
-            if (executableElementPrivate && _currentLibrary != superclassLibrary) {
-              continue;
-            }
-            // instance vs. static
-            if (methodElement.isStatic) {
-              _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
-                  executableElementName,
-                  methodElement.enclosingElement.displayName]);
-              return true;
-            }
-          }
-          superclassType = superclassElement.supertype;
-          superclassElement = superclassType == null ? null : superclassType.element;
-        }
-      }
-      return false;
-    }
     FunctionType overridingFT = executableElement.type;
     FunctionType overriddenFT = overriddenExecutable.type;
     InterfaceType enclosingType = _enclosingClass.type;
@@ -8210,9 +8151,9 @@
     }
     // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE
     if (overriddenFTReturnType != VoidTypeImpl.instance && !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
-      _errorReporter.reportErrorForNode(!isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, errorNameTarget, [
-          overridingFTReturnType.displayName,
-          overriddenFTReturnType.displayName,
+      _errorReporter.reportTypeErrorForNode(!isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, errorNameTarget, [
+          overridingFTReturnType,
+          overriddenFTReturnType,
           overriddenExecutable.enclosingElement.displayName]);
       return true;
     }
@@ -8223,9 +8164,9 @@
     int parameterIndex = 0;
     for (int i = 0; i < overridingNormalPT.length; i++) {
       if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
-        _errorReporter.reportErrorForNode(!isSetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterLocations[parameterIndex], [
-            overridingNormalPT[i].displayName,
-            overriddenNormalPT[i].displayName,
+        _errorReporter.reportTypeErrorForNode(!isSetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterLocations[parameterIndex], [
+            overridingNormalPT[i],
+            overriddenNormalPT[i],
             overriddenExecutable.enclosingElement.displayName]);
         return true;
       }
@@ -8234,9 +8175,9 @@
     // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
     for (int i = 0; i < overriddenPositionalPT.length; i++) {
       if (!overridingPositionalPT[i].isAssignableTo(overriddenPositionalPT[i])) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterLocations[parameterIndex], [
-            overridingPositionalPT[i].displayName,
-            overriddenPositionalPT[i].displayName,
+        _errorReporter.reportTypeErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterLocations[parameterIndex], [
+            overridingPositionalPT[i],
+            overriddenPositionalPT[i],
             overriddenExecutable.enclosingElement.displayName]);
         return true;
       }
@@ -8265,9 +8206,9 @@
           }
         }
         if (parameterToSelect != null) {
-          _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, parameterLocationToSelect, [
-              overridingType.displayName,
-              overriddenNamedPTEntry.getValue().displayName,
+          _errorReporter.reportTypeErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, parameterLocationToSelect, [
+              overridingType,
+              overriddenNamedPTEntry.getValue(),
               overriddenExecutable.enclosingElement.displayName]);
           return true;
         }
@@ -8373,25 +8314,20 @@
     //
     // Compute the overridden executable from the InheritanceManager
     //
-    ExecutableElement overriddenExecutable = _inheritanceManager.lookupInheritance(_enclosingClass, executableElement.name);
-    //
-    // If the result is a MultiplyInheritedExecutableElement call
-    // checkForAllInvalidOverrideErrorCodes on all of the elements, until an error is found.
-    //
-    if (overriddenExecutable is MultiplyInheritedExecutableElement) {
-      MultiplyInheritedExecutableElement multiplyInheritedElement = overriddenExecutable;
-      List<ExecutableElement> overriddenElement = multiplyInheritedElement.inheritedElements;
-      for (int i = 0; i < overriddenElement.length; i++) {
-        if (_checkForAllInvalidOverrideErrorCodes(executableElement, overriddenElement[i], parameters, parameterLocations, errorNameTarget)) {
-          return true;
-        }
-      }
-      return false;
+    List<ExecutableElement> overriddenExecutables = _inheritanceManager.lookupOverrides(_enclosingClass, executableElement.name);
+    if (overriddenExecutables.isEmpty) {
+      // Nothing is overridden, so we just have to check if the new name collides
+      // with a static defined in the superclass.
+      // TODO(paulberry): currently we don't do this check if the new element
+      // overrides a method in an interface (see issue 18947).
+      return _checkForInstanceMethodNameCollidesWithSuperclassStatic(executableElement, errorNameTarget);
     }
-    //
-    // Otherwise, just call checkForAllInvalidOverrideErrorCodes.
-    //
-    return _checkForAllInvalidOverrideErrorCodes(executableElement, overriddenExecutable, parameters, parameterLocations, errorNameTarget);
+    for (ExecutableElement overriddenElement in overriddenExecutables) {
+      if (_checkForAllInvalidOverrideErrorCodes(executableElement, overriddenElement, parameters, parameterLocations, errorNameTarget)) {
+        return true;
+      }
+    }
+    return false;
   }
 
   /**
@@ -8648,9 +8584,7 @@
     //
     if (actualStaticType != null && expectedStaticType != null) {
       if (!actualStaticType.isAssignableTo(expectedStaticType)) {
-        _errorReporter.reportErrorForNode(errorCode, expression, [
-            actualStaticType.displayName,
-            expectedStaticType.displayName]);
+        _errorReporter.reportTypeErrorForNode(errorCode, expression, [actualStaticType, expectedStaticType]);
         return true;
       }
     }
@@ -9087,7 +9021,7 @@
     // construct the HashMap, at the same time, look for violations.  Don't add members if they are
     // part of a conflict, this prevents multiple warnings for one issue.
     bool foundError = false;
-    Map<String, ClassMember> memberHashMap = new Map<String, ClassMember>();
+    HashMap<String, ClassMember> memberHashMap = new HashMap<String, ClassMember>();
     for (ClassMember classMember in classMembers) {
       if (classMember is MethodDeclaration) {
         MethodDeclaration method = classMember;
@@ -9553,7 +9487,7 @@
     NodeList<Directive> directives = node.directives;
     int count = directives.length;
     if (count > 0) {
-      Map<PrefixElement, List<ImportDirective>> prefixToDirectivesMap = new Map<PrefixElement, List<ImportDirective>>();
+      HashMap<PrefixElement, List<ImportDirective>> prefixToDirectivesMap = new HashMap<PrefixElement, List<ImportDirective>>();
       for (int i = 0; i < count; i++) {
         Directive directive = directives[i];
         if (directive is ImportDirective) {
@@ -9886,9 +9820,9 @@
     }
     // report problem
     if (_isEnclosingConstructorConst) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
+      _errorReporter.reportTypeErrorForNode(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType, fieldType]);
     } else {
-      _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
+      _errorReporter.reportTypeErrorForNode(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType, fieldType]);
     }
     return true;
   }
@@ -10029,7 +9963,7 @@
    * @see CompileTimeErrorCode#INSTANCE_MEMBER_ACCESS_FROM_STATIC TODO(scheglov) rename thid method
    */
   bool _checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
-    if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInInstanceVariableInitializer && !_isInStaticVariableDeclaration) {
+    if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInFactory && !_isInInstanceVariableInitializer && !_isInStaticVariableDeclaration) {
       return false;
     }
     // prepare element
@@ -10075,6 +10009,8 @@
     // report problem
     if (_isInStaticMethod) {
       _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, node, []);
+    } else if (_isInFactory) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, node, []);
     } else {
       _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, node, []);
     }
@@ -10154,7 +10090,7 @@
     // Ensure that the inheritance manager has a chance to generate all errors we may care about,
     // note that we ensure that the interfaces data since there are no errors.
     _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
-    Set<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
+    HashSet<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
     if (errors == null || errors.isEmpty) {
       return false;
     }
@@ -10204,6 +10140,70 @@
   }
 
   /**
+   * This checks whether the given [executableElement] collides with the name of a static
+   * method in one of its superclasses, and reports the appropriate warning if it does.
+   *
+   * @param executableElement the method to check.
+   * @param errorNameTarget the node to report problems on.
+   * @return `true` if and only if a warning was generated.
+   * @see StaticTypeWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+   */
+  bool _checkForInstanceMethodNameCollidesWithSuperclassStatic(ExecutableElement executableElement, SimpleIdentifier errorNameTarget) {
+    String executableElementName = executableElement.name;
+    if (executableElement is! PropertyAccessorElement && !executableElement.isOperator) {
+      HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+      InterfaceType superclassType = _enclosingClass.supertype;
+      ClassElement superclassElement = superclassType == null ? null : superclassType.element;
+      bool executableElementPrivate = Identifier.isPrivateName(executableElementName);
+      while (superclassElement != null && !visitedClasses.contains(superclassElement)) {
+        visitedClasses.add(superclassElement);
+        LibraryElement superclassLibrary = superclassElement.library;
+        // Check fields.
+        List<FieldElement> fieldElts = superclassElement.fields;
+        for (FieldElement fieldElt in fieldElts) {
+          // We need the same name.
+          if (fieldElt.name != executableElementName) {
+            continue;
+          }
+          // Ignore if private in a different library - cannot collide.
+          if (executableElementPrivate && _currentLibrary != superclassLibrary) {
+            continue;
+          }
+          // instance vs. static
+          if (fieldElt.isStatic) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
+                executableElementName,
+                fieldElt.enclosingElement.displayName]);
+            return true;
+          }
+        }
+        // Check methods.
+        List<MethodElement> methodElements = superclassElement.methods;
+        for (MethodElement methodElement in methodElements) {
+          // We need the same name.
+          if (methodElement.name != executableElementName) {
+            continue;
+          }
+          // Ignore if private in a different library - cannot collide.
+          if (executableElementPrivate && _currentLibrary != superclassLibrary) {
+            continue;
+          }
+          // instance vs. static
+          if (methodElement.isStatic) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
+                executableElementName,
+                methodElement.enclosingElement.displayName]);
+            return true;
+          }
+        }
+        superclassType = superclassElement.supertype;
+        superclassElement = superclassType == null ? null : superclassType.element;
+      }
+    }
+    return false;
+  }
+
+  /**
    * This verifies that an 'int' can be assigned to the parameter corresponding to the given
    * expression. This is used for prefix and postfix expressions where the argument value is
    * implicit.
@@ -10255,17 +10255,7 @@
     DartType leftType = (leftVariableElement == null) ? getStaticType(lhs) : leftVariableElement.type;
     DartType staticRightType = getStaticType(rhs);
     if (!staticRightType.isAssignableTo(leftType)) {
-      String leftName = leftType.displayName;
-      String rightName = staticRightType.displayName;
-      if (leftName == rightName) {
-        Element leftElement = leftType.element;
-        Element rightElement = staticRightType.element;
-        if (leftElement != null && rightElement != null) {
-          leftName = leftElement.extendedDisplayName;
-          rightName = rightElement.extendedDisplayName;
-        }
-      }
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
+      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [staticRightType, leftType]);
       return true;
     }
     return false;
@@ -10296,17 +10286,7 @@
       return false;
     }
     if (!rightType.isAssignableTo(leftType)) {
-      String leftName = leftType.displayName;
-      String rightName = rightType.displayName;
-      if (leftName == rightName) {
-        Element leftElement = leftType.element;
-        Element rightElement = rightType.element;
-        if (leftElement != null && rightElement != null) {
-          leftName = leftElement.extendedDisplayName;
-          rightName = rightElement.extendedDisplayName;
-        }
-      }
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
+      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightType, leftType]);
       return true;
     }
     return false;
@@ -10536,16 +10516,13 @@
     // it is dynamic which is assignable to everything).
     if (setterType != null && getterType != null && !getterType.isAssignableTo(setterType)) {
       if (enclosingClassForCounterpart == null) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [
-            accessorTextName,
-            setterType.displayName,
-            getterType.displayName]);
+        _errorReporter.reportTypeErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [accessorTextName, setterType, getterType]);
         return true;
       } else {
-        _errorReporter.reportErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, accessorDeclaration, [
+        _errorReporter.reportTypeErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, accessorDeclaration, [
             accessorTextName,
-            setterType.displayName,
-            getterType.displayName,
+            setterType,
+            getterType,
             enclosingClassForCounterpart.displayName]);
       }
     }
@@ -10760,7 +10737,7 @@
         return false;
       }
     }
-    Set<ExecutableElement> missingOverrides = new Set<ExecutableElement>();
+    HashSet<ExecutableElement> missingOverrides = new HashSet<ExecutableElement>();
     //
     // Loop through the set of all executable elements declared in the implicit interface.
     //
@@ -11285,9 +11262,9 @@
       if (staticReturnType.isVoid || staticReturnType.isDynamic || staticReturnType.isBottom) {
         return false;
       }
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
-          staticReturnType.displayName,
-          expectedReturnType.displayName,
+      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+          staticReturnType,
+          expectedReturnType,
           _enclosingFunction.displayName]);
       return true;
     }
@@ -11295,9 +11272,9 @@
     if (isStaticAssignable) {
       return false;
     }
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
-        staticReturnType.displayName,
-        expectedReturnType.displayName,
+    _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+        staticReturnType,
+        expectedReturnType,
         _enclosingFunction.displayName]);
     return true;
   }
@@ -11444,7 +11421,7 @@
           } else {
             errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
           }
-          _errorReporter.reportErrorForNode(errorCode, argTypeName, [argType.displayName, boundType.displayName]);
+          _errorReporter.reportTypeErrorForNode(errorCode, argTypeName, [argType, boundType]);
           foundError = true;
         }
       }
@@ -11599,7 +11576,7 @@
           } else if (fieldElement.isStatic) {
             _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
           } else if (declaredType != null && fieldType != null && !declaredType.isAssignableTo(fieldType)) {
-            _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
+            _errorReporter.reportTypeErrorForNode(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType, fieldType]);
           }
         } else {
           if (fieldElement.isSynthetic) {
@@ -11836,7 +11813,7 @@
    * @return `true` if the given constructor redirects to itself, directly or indirectly
    */
   bool _hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
-    Set<ConstructorElement> constructors = new Set<ConstructorElement>();
+    Set<ConstructorElement> constructors = new HashSet<ConstructorElement>();
     ConstructorElement current = element;
     while (current != null) {
       if (constructors.contains(current)) {
@@ -11856,7 +11833,7 @@
    *         from anywhere except [ClassElement] or type parameter bounds.
    */
   bool _hasTypedefSelfReference(Element target) {
-    Set<Element> checked = new Set<Element>();
+    Set<Element> checked = new HashSet<Element>();
     List<Element> toCheck = new List<Element>();
     toCheck.add(target);
     bool firstIteration = true;
@@ -12806,7 +12783,7 @@
   /**
    * A set of the libraries that were resolved while resolving the HTML unit.
    */
-  Set<Library> _resolvedLibraries = new Set<Library>();
+  Set<Library> _resolvedLibraries = new HashSet<Library>();
 
   /**
    * Initialize a newly created HTML unit builder.
@@ -13076,7 +13053,7 @@
    * will need to be used to compute the correct [ImportDirective] being used, see
    * [namespaceMap].
    */
-  Map<LibraryElement, List<ImportDirective>> _libraryMap;
+  HashMap<LibraryElement, List<ImportDirective>> _libraryMap;
 
   /**
    * In cases where there is more than one import directive per library element, this mapping is
@@ -13084,7 +13061,7 @@
    * [Namespace] for each of the imports to do lookups in the same way that they are done from
    * the [ElementResolver].
    */
-  Map<ImportDirective, Namespace> _namespaceMap;
+  HashMap<ImportDirective, Namespace> _namespaceMap;
 
   /**
    * This is a map between prefix elements and the import directives from which they are derived. In
@@ -13096,7 +13073,7 @@
    * it is possible to have an unreported unused import in situations where two imports use the same
    * prefix and at least one import directive is used.
    */
-  Map<PrefixElement, List<ImportDirective>> _prefixElementMap;
+  HashMap<PrefixElement, List<ImportDirective>> _prefixElementMap;
 
   /**
    * Create a new instance of the [ImportsVerifier].
@@ -13107,9 +13084,9 @@
     this._currentLibrary = library;
     this._unusedImports = new List<ImportDirective>();
     this._duplicateImports = new List<ImportDirective>();
-    this._libraryMap = new Map<LibraryElement, List<ImportDirective>>();
-    this._namespaceMap = new Map<ImportDirective, Namespace>();
-    this._prefixElementMap = new Map<PrefixElement, List<ImportDirective>>();
+    this._libraryMap = new HashMap<LibraryElement, List<ImportDirective>>();
+    this._namespaceMap = new HashMap<ImportDirective, Namespace>();
+    this._prefixElementMap = new HashMap<PrefixElement, List<ImportDirective>>();
   }
 
   /**
@@ -13246,8 +13223,10 @@
     Element element = prefixIdentifier.staticElement;
     if (element is PrefixElement) {
       List<ImportDirective> importDirectives = _prefixElementMap[element];
-      for (ImportDirective importDirective in importDirectives) {
-        _unusedImports.remove(importDirective);
+      if (importDirectives != null) {
+        for (ImportDirective importDirective in importDirectives) {
+          _unusedImports.remove(importDirective);
+        }
       }
       return null;
     }
@@ -13322,7 +13301,8 @@
     if (element == null) {
       return null;
     }
-    // If the element is multiply defined then call this method recursively for each of the conflicting elements.
+    // If the element is multiply defined then call this method recursively for each of the
+    // conflicting elements.
     if (element is MultiplyDefinedElement) {
       MultiplyDefinedElement multiplyDefinedElement = element;
       for (Element elt in multiplyDefinedElement.conflictingElements) {
@@ -13331,8 +13311,10 @@
       return null;
     } else if (element is PrefixElement) {
       List<ImportDirective> importDirectives = _prefixElementMap[element];
-      for (ImportDirective importDirective in importDirectives) {
-        _unusedImports.remove(importDirective);
+      if (importDirectives != null) {
+        for (ImportDirective importDirective in importDirectives) {
+          _unusedImports.remove(importDirective);
+        }
       }
       return null;
     } else if (element.enclosingElement is! CompilationUnitElement) {
@@ -13535,8 +13517,8 @@
    * named parameters of the <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i>. Then let
    * * <i>h = max(numberOfPositionals(m<sub>i</sub>)),</i>
    * * <i>r = min(numberOfRequiredParams(m<sub>i</sub>)), for all <i>i</i>, 1 <= i <= k.</i>
-   * If <i>r <= h</i> then <i>I</i> has a method named <i>n</i>, with <i>r</i> required parameters
-   * of type <b>dynamic</b>, <i>h</i> positional parameters of type <b>dynamic</b>, named parameters
+   * Then <i>I</i> has a method named <i>n</i>, with <i>r</i> required parameters of type
+   * <b>dynamic</b>, <i>h</i> positional parameters of type <b>dynamic</b>, named parameters
    * <i>s</i> of type <b>dynamic</b> and return type <b>dynamic</b>.
    *
    * TODO (jwren) Associate a propagated type to the synthetic method element using least upper
@@ -13545,7 +13527,7 @@
   static ExecutableElement _computeMergedExecutableElement(List<ExecutableElement> elementArrayToMerge) {
     int h = _getNumOfPositionalParameters(elementArrayToMerge[0]);
     int r = _getNumOfRequiredParameters(elementArrayToMerge[0]);
-    Set<String> namedParametersList = new Set<String>();
+    Set<String> namedParametersList = new HashSet<String>();
     for (int i = 1; i < elementArrayToMerge.length; i++) {
       ExecutableElement element = elementArrayToMerge[i];
       int numOfPositionalParams = _getNumOfPositionalParameters(element);
@@ -13558,9 +13540,6 @@
       }
       namedParametersList.addAll(_getNamedParameterNames(element));
     }
-    if (r > h) {
-      return null;
-    }
     return _createSyntheticExecutableElement(elementArrayToMerge, elementArrayToMerge[0].displayName, r, h - r, new List.from(namedParametersList));
   }
 
@@ -13685,19 +13664,19 @@
    * This is a mapping between each [ClassElement] and a map between the [String] member
    * names and the associated [ExecutableElement] in the mixin and superclass chain.
    */
-  Map<ClassElement, MemberMap> _classLookup;
+  HashMap<ClassElement, MemberMap> _classLookup;
 
   /**
    * This is a mapping between each [ClassElement] and a map between the [String] member
    * names and the associated [ExecutableElement] in the interface set.
    */
-  Map<ClassElement, MemberMap> _interfaceLookup;
+  HashMap<ClassElement, MemberMap> _interfaceLookup;
 
   /**
    * A map between each visited [ClassElement] and the set of [AnalysisError]s found on
    * the class element.
    */
-  Map<ClassElement, Set<AnalysisError>> _errorsInClassElement = new Map<ClassElement, Set<AnalysisError>>();
+  HashMap<ClassElement, HashSet<AnalysisError>> _errorsInClassElement = new HashMap<ClassElement, HashSet<AnalysisError>>();
 
   /**
    * Initialize a newly created inheritance manager.
@@ -13706,8 +13685,8 @@
    */
   InheritanceManager(LibraryElement library) {
     this._library = library;
-    _classLookup = new Map<ClassElement, MemberMap>();
-    _interfaceLookup = new Map<ClassElement, MemberMap>();
+    _classLookup = new HashMap<ClassElement, MemberMap>();
+    _interfaceLookup = new HashMap<ClassElement, MemberMap>();
   }
 
   /**
@@ -13718,7 +13697,7 @@
    * @return the set of [AnalysisError]s found on the passed [ClassElement], or
    *         `null` if there are none
    */
-  Set<AnalysisError> getErrors(ClassElement classElt) => _errorsInClassElement[classElt];
+  HashSet<AnalysisError> getErrors(ClassElement classElt) => _errorsInClassElement[classElt];
 
   /**
    * Get and return a mapping between the set of all string names of the members inherited from the
@@ -13728,7 +13707,7 @@
    * @return a mapping between the set of all members inherited from the passed [ClassElement]
    *         superclass hierarchy, and the associated [ExecutableElement]
    */
-  MemberMap getMapOfMembersInheritedFromClasses(ClassElement classElt) => _computeClassChainLookupMap(classElt, new Set<ClassElement>());
+  MemberMap getMapOfMembersInheritedFromClasses(ClassElement classElt) => _computeClassChainLookupMap(classElt, new HashSet<ClassElement>());
 
   /**
    * Get and return a mapping between the set of all string names of the members inherited from the
@@ -13738,7 +13717,7 @@
    * @return a mapping between the set of all string names of the members inherited from the passed
    *         [ClassElement] interface hierarchy, and the associated [ExecutableElement].
    */
-  MemberMap getMapOfMembersInheritedFromInterfaces(ClassElement classElt) => _computeInterfaceLookupMap(classElt, new Set<ClassElement>());
+  MemberMap getMapOfMembersInheritedFromInterfaces(ClassElement classElt) => _computeInterfaceLookupMap(classElt, new HashSet<ClassElement>());
 
   /**
    * Given some [ClassElement] and some member name, this returns the
@@ -13755,9 +13734,9 @@
     if (memberName == null || memberName.isEmpty) {
       return null;
     }
-    ExecutableElement executable = _computeClassChainLookupMap(classElt, new Set<ClassElement>()).get(memberName);
+    ExecutableElement executable = _computeClassChainLookupMap(classElt, new HashSet<ClassElement>()).get(memberName);
     if (executable == null) {
-      return _computeInterfaceLookupMap(classElt, new Set<ClassElement>()).get(memberName);
+      return _computeInterfaceLookupMap(classElt, new HashSet<ClassElement>()).get(memberName);
     }
     return executable;
   }
@@ -13800,6 +13779,40 @@
   }
 
   /**
+   * Determine the set of methods which is overridden by the given class member. If no member is
+   * inherited, an empty list is returned. If one of the inherited members is a
+   * [MultiplyInheritedExecutableElement], then it is expanded into its constituent inherited
+   * elements.
+   *
+   * @param classElt the class to query
+   * @param memberName the name of the class member to query
+   * @return a list of overridden methods
+   */
+  List<ExecutableElement> lookupOverrides(ClassElement classElt, String memberName) {
+    List<ExecutableElement> result = new List<ExecutableElement>();
+    if (memberName == null || memberName.isEmpty) {
+      return result;
+    }
+    List<MemberMap> interfaceMaps = _gatherInterfaceLookupMaps(classElt, new HashSet<ClassElement>());
+    if (interfaceMaps != null) {
+      for (MemberMap interfaceMap in interfaceMaps) {
+        ExecutableElement overriddenElement = interfaceMap.get(memberName);
+        if (overriddenElement != null) {
+          if (overriddenElement is MultiplyInheritedExecutableElement) {
+            MultiplyInheritedExecutableElement multiplyInheritedElement = overriddenElement;
+            for (ExecutableElement element in multiplyInheritedElement.inheritedElements) {
+              result.add(element);
+            }
+          } else {
+            result.add(overriddenElement);
+          }
+        }
+      }
+    }
+    return result;
+  }
+
+  /**
    * Set the new library element context.
    *
    * @param library the new library element
@@ -13852,7 +13865,7 @@
    * @return a mapping between the set of all string names of the members inherited from the passed
    *         [ClassElement] superclass hierarchy, and the associated [ExecutableElement]
    */
-  MemberMap _computeClassChainLookupMap(ClassElement classElt, Set<ClassElement> visitedClasses) {
+  MemberMap _computeClassChainLookupMap(ClassElement classElt, HashSet<ClassElement> visitedClasses) {
     MemberMap resultMap = _classLookup[classElt];
     if (resultMap != null) {
       return resultMap;
@@ -14008,13 +14021,37 @@
    * @return a mapping between the set of all string names of the members inherited from the passed
    *         [ClassElement] interface hierarchy, and the associated [ExecutableElement]
    */
-  MemberMap _computeInterfaceLookupMap(ClassElement classElt, Set<ClassElement> visitedInterfaces) {
+  MemberMap _computeInterfaceLookupMap(ClassElement classElt, HashSet<ClassElement> visitedInterfaces) {
     MemberMap resultMap = _interfaceLookup[classElt];
     if (resultMap != null) {
       return resultMap;
-    } else {
-      resultMap = new MemberMap();
     }
+    List<MemberMap> lookupMaps = _gatherInterfaceLookupMaps(classElt, visitedInterfaces);
+    if (lookupMaps == null) {
+      resultMap = new MemberMap();
+    } else {
+      HashMap<String, List<ExecutableElement>> unionMap = _unionInterfaceLookupMaps(lookupMaps);
+      resultMap = _resolveInheritanceLookup(classElt, unionMap);
+    }
+    _interfaceLookup[classElt] = resultMap;
+    return resultMap;
+  }
+
+  /**
+   * Collect a list of interface lookup maps whose elements correspond to all of the classes
+   * directly above [classElt] in the class hierarchy (the direct superclass if any, all
+   * mixins, and all direct superinterfaces). Each item in the list is the interface lookup map
+   * returned by [computeInterfaceLookupMap] for the corresponding super, except with type
+   * parameters appropriately substituted.
+   *
+   * @param classElt the class element to query
+   * @param visitedInterfaces a set of visited classes passed back into this method when it calls
+   *          itself recursively
+   * @return `null` if there was a problem (such as a loop in the class hierarchy) or if there
+   *         are no classes above this one in the class hierarchy. Otherwise, a list of interface
+   *         lookup maps.
+   */
+  List<MemberMap> _gatherInterfaceLookupMaps(ClassElement classElt, HashSet<ClassElement> visitedInterfaces) {
     InterfaceType supertype = classElt.supertype;
     ClassElement superclassElement = supertype != null ? supertype.element : null;
     List<InterfaceType> mixins = classElt.mixins;
@@ -14046,13 +14083,7 @@
           visitedInterfaces.remove(superclassElement);
         }
       } else {
-        MemberMap map = _interfaceLookup[classElt];
-        if (map != null) {
-          lookupMaps.add(map);
-        } else {
-          _interfaceLookup[superclassElement] = resultMap;
-          return resultMap;
-        }
+        return null;
       }
     }
     //
@@ -14083,13 +14114,7 @@
             visitedInterfaces.remove(mixinElement);
           }
         } else {
-          MemberMap map = _interfaceLookup[classElt];
-          if (map != null) {
-            lookupMaps.add(map);
-          } else {
-            _interfaceLookup[mixinElement] = resultMap;
-            return resultMap;
-          }
+          return null;
         }
       }
     }
@@ -14120,70 +14145,99 @@
             visitedInterfaces.remove(interfaceElement);
           }
         } else {
-          MemberMap map = _interfaceLookup[classElt];
-          if (map != null) {
-            lookupMaps.add(map);
-          } else {
-            _interfaceLookup[interfaceElement] = resultMap;
-            return resultMap;
-          }
+          return null;
         }
       }
     }
     if (lookupMaps.length == 0) {
-      _interfaceLookup[classElt] = resultMap;
-      return resultMap;
+      return null;
     }
-    //
-    // Union all of the lookupMaps together into unionMap, grouping the ExecutableElements into a
-    // list where none of the elements are equal where equality is determined by having equal
-    // function types. (We also take note too of the kind of the element: ()->int and () -> int may
-    // not be equal if one is a getter and the other is a method.)
-    //
-    Map<String, List<ExecutableElement>> unionMap = new Map<String, List<ExecutableElement>>();
-    for (MemberMap lookupMap in lookupMaps) {
-      int lookupMapSize = lookupMap.size;
-      for (int i = 0; i < lookupMapSize; i++) {
-        // Get the string key, if null, break.
-        String key = lookupMap.getKey(i);
-        if (key == null) {
-          break;
-        }
-        // Get the list value out of the unionMap
-        List<ExecutableElement> list = unionMap[key];
-        // If we haven't created such a map for this key yet, do create it and put the list entry
-        // into the unionMap.
-        if (list == null) {
-          list = new List<ExecutableElement>();
-          unionMap[key] = list;
-        }
-        // Fetch the entry out of this lookupMap
-        ExecutableElement newExecutableElementEntry = lookupMap.getValue(i);
-        if (list.isEmpty) {
-          // If the list is empty, just the new value
-          list.add(newExecutableElementEntry);
-        } else {
-          // Otherwise, only add the newExecutableElementEntry if it isn't already in the list, this
-          // covers situation where a class inherits two methods (or two getters) that are
-          // identical.
-          bool alreadyInList = false;
-          bool isMethod1 = newExecutableElementEntry is MethodElement;
-          for (ExecutableElement executableElementInList in list) {
-            bool isMethod2 = executableElementInList is MethodElement;
-            if (isMethod1 == isMethod2 && executableElementInList.type == newExecutableElementEntry.type) {
-              alreadyInList = true;
-              break;
-            }
-          }
-          if (!alreadyInList) {
-            list.add(newExecutableElementEntry);
-          }
-        }
+    return lookupMaps;
+  }
+
+  /**
+   * Given some [ClassElement], this method finds and returns the [ExecutableElement] of
+   * the passed name in the class element. Static members, members in super types and members not
+   * accessible from the current library are not considered.
+   *
+   * @param classElt the class element to query
+   * @param memberName the name of the member to lookup in the class
+   * @return the found [ExecutableElement], or `null` if no such member was found
+   */
+  ExecutableElement _lookupMemberInClass(ClassElement classElt, String memberName) {
+    List<MethodElement> methods = classElt.methods;
+    for (MethodElement method in methods) {
+      if (memberName == method.name && method.isAccessibleIn(_library) && !method.isStatic) {
+        return method;
       }
     }
-    //
-    // Loop through the entries in the unionMap, adding them to the resultMap appropriately.
-    //
+    List<PropertyAccessorElement> accessors = classElt.accessors;
+    for (PropertyAccessorElement accessor in accessors) {
+      if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !accessor.isStatic) {
+        return accessor;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Record the passed map with the set of all members (methods, getters and setters) in the type
+   * into the passed map.
+   *
+   * @param map some non-`null` map to put the methods and accessors from the passed
+   *          [ClassElement] into
+   * @param type the type that will be recorded into the passed map
+   * @param doIncludeAbstract `true` if abstract members will be put into the map
+   */
+  void _recordMapWithClassMembers(MemberMap map, InterfaceType type, bool doIncludeAbstract) {
+    List<MethodElement> methods = type.methods;
+    for (MethodElement method in methods) {
+      if (method.isAccessibleIn(_library) && !method.isStatic && (doIncludeAbstract || !method.isAbstract)) {
+        map.put(method.name, method);
+      }
+    }
+    List<PropertyAccessorElement> accessors = type.accessors;
+    for (PropertyAccessorElement accessor in accessors) {
+      if (accessor.isAccessibleIn(_library) && !accessor.isStatic && (doIncludeAbstract || !accessor.isAbstract)) {
+        map.put(accessor.name, accessor);
+      }
+    }
+  }
+
+  /**
+   * This method is used to report errors on when they are found computing inheritance information.
+   * See [ErrorVerifier#checkForInconsistentMethodInheritance] to see where these generated
+   * error codes are reported back into the analysis engine.
+   *
+   * @param classElt the location of the source for which the exception occurred
+   * @param offset the offset of the location of the error
+   * @param length the length of the location of the error
+   * @param errorCode the error code to be associated with this error
+   * @param arguments the arguments used to build the error message
+   */
+  void _reportError(ClassElement classElt, int offset, int length, ErrorCode errorCode, List<Object> arguments) {
+    HashSet<AnalysisError> errorSet = _errorsInClassElement[classElt];
+    if (errorSet == null) {
+      errorSet = new HashSet<AnalysisError>();
+      _errorsInClassElement[classElt] = errorSet;
+    }
+    errorSet.add(new AnalysisError.con2(classElt.source, offset, length, errorCode, arguments));
+  }
+
+  /**
+   * Given the set of methods defined by classes above [classElt] in the class hierarchy,
+   * apply the appropriate inheritance rules to determine those methods inherited by or overridden
+   * by [classElt]. Also report static warnings
+   * [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE] and
+   * [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD] if appropriate.
+   *
+   * @param classElt the class element to query.
+   * @param unionMap a mapping from method name to the set of unique (in terms of signature) methods
+   *          defined in superclasses of [classElt].
+   * @return the inheritance lookup map for [classElt].
+   */
+  MemberMap _resolveInheritanceLookup(ClassElement classElt, HashMap<String, List<ExecutableElement>> unionMap) {
+    MemberMap resultMap = new MemberMap();
     for (MapEntry<String, List<ExecutableElement>> entry in getMapEntrySet(unionMap)) {
       String key = entry.getKey();
       List<ExecutableElement> list = entry.getValue();
@@ -14299,9 +14353,7 @@
                 elementArrayToMerge[i] = elements[subtypesOfAllOtherTypesIndexes[i]];
               }
               ExecutableElement mergedExecutableElement = _computeMergedExecutableElement(elementArrayToMerge);
-              if (mergedExecutableElement != null) {
-                resultMap.put(key, mergedExecutableElement);
-              }
+              resultMap.put(key, mergedExecutableElement);
             }
           }
         } else {
@@ -14309,80 +14361,10 @@
         }
       }
     }
-    _interfaceLookup[classElt] = resultMap;
     return resultMap;
   }
 
   /**
-   * Given some [ClassElement], this method finds and returns the [ExecutableElement] of
-   * the passed name in the class element. Static members, members in super types and members not
-   * accessible from the current library are not considered.
-   *
-   * @param classElt the class element to query
-   * @param memberName the name of the member to lookup in the class
-   * @return the found [ExecutableElement], or `null` if no such member was found
-   */
-  ExecutableElement _lookupMemberInClass(ClassElement classElt, String memberName) {
-    List<MethodElement> methods = classElt.methods;
-    for (MethodElement method in methods) {
-      if (memberName == method.name && method.isAccessibleIn(_library) && !method.isStatic) {
-        return method;
-      }
-    }
-    List<PropertyAccessorElement> accessors = classElt.accessors;
-    for (PropertyAccessorElement accessor in accessors) {
-      if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !accessor.isStatic) {
-        return accessor;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Record the passed map with the set of all members (methods, getters and setters) in the type
-   * into the passed map.
-   *
-   * @param map some non-`null` map to put the methods and accessors from the passed
-   *          [ClassElement] into
-   * @param type the type that will be recorded into the passed map
-   * @param doIncludeAbstract `true` if abstract members will be put into the map
-   */
-  void _recordMapWithClassMembers(MemberMap map, InterfaceType type, bool doIncludeAbstract) {
-    List<MethodElement> methods = type.methods;
-    for (MethodElement method in methods) {
-      if (method.isAccessibleIn(_library) && !method.isStatic && (doIncludeAbstract || !method.isAbstract)) {
-        map.put(method.name, method);
-      }
-    }
-    List<PropertyAccessorElement> accessors = type.accessors;
-    for (PropertyAccessorElement accessor in accessors) {
-      if (accessor.isAccessibleIn(_library) && !accessor.isStatic && (doIncludeAbstract || !accessor.isAbstract)) {
-        map.put(accessor.name, accessor);
-      }
-    }
-  }
-
-  /**
-   * This method is used to report errors on when they are found computing inheritance information.
-   * See [ErrorVerifier#checkForInconsistentMethodInheritance] to see where these generated
-   * error codes are reported back into the analysis engine.
-   *
-   * @param classElt the location of the source for which the exception occurred
-   * @param offset the offset of the location of the error
-   * @param length the length of the location of the error
-   * @param errorCode the error code to be associated with this error
-   * @param arguments the arguments used to build the error message
-   */
-  void _reportError(ClassElement classElt, int offset, int length, ErrorCode errorCode, List<Object> arguments) {
-    Set<AnalysisError> errorSet = _errorsInClassElement[classElt];
-    if (errorSet == null) {
-      errorSet = new Set<AnalysisError>();
-      _errorsInClassElement[classElt] = errorSet;
-    }
-    errorSet.add(new AnalysisError.con2(classElt.source, offset, length, errorCode, arguments));
-  }
-
-  /**
    * Loop through all of the members in some [MemberMap], performing type parameter
    * substitutions using a passed supertype.
    *
@@ -14401,6 +14383,60 @@
       }
     }
   }
+
+  /**
+   * Union all of the [lookupMaps] together into a single map, grouping the ExecutableElements
+   * into a list where none of the elements are equal where equality is determined by having equal
+   * function types. (We also take note too of the kind of the element: ()->int and () -> int may
+   * not be equal if one is a getter and the other is a method.)
+   *
+   * @param lookupMaps the maps to be unioned together.
+   * @return the resulting union map.
+   */
+  HashMap<String, List<ExecutableElement>> _unionInterfaceLookupMaps(List<MemberMap> lookupMaps) {
+    HashMap<String, List<ExecutableElement>> unionMap = new HashMap<String, List<ExecutableElement>>();
+    for (MemberMap lookupMap in lookupMaps) {
+      int lookupMapSize = lookupMap.size;
+      for (int i = 0; i < lookupMapSize; i++) {
+        // Get the string key, if null, break.
+        String key = lookupMap.getKey(i);
+        if (key == null) {
+          break;
+        }
+        // Get the list value out of the unionMap
+        List<ExecutableElement> list = unionMap[key];
+        // If we haven't created such a map for this key yet, do create it and put the list entry
+        // into the unionMap.
+        if (list == null) {
+          list = new List<ExecutableElement>();
+          unionMap[key] = list;
+        }
+        // Fetch the entry out of this lookupMap
+        ExecutableElement newExecutableElementEntry = lookupMap.getValue(i);
+        if (list.isEmpty) {
+          // If the list is empty, just the new value
+          list.add(newExecutableElementEntry);
+        } else {
+          // Otherwise, only add the newExecutableElementEntry if it isn't already in the list, this
+          // covers situation where a class inherits two methods (or two getters) that are
+          // identical.
+          bool alreadyInList = false;
+          bool isMethod1 = newExecutableElementEntry is MethodElement;
+          for (ExecutableElement executableElementInList in list) {
+            bool isMethod2 = executableElementInList is MethodElement;
+            if (isMethod1 == isMethod2 && executableElementInList.type == newExecutableElementEntry.type) {
+              alreadyInList = true;
+              break;
+            }
+          }
+          if (!alreadyInList) {
+            list.add(newExecutableElementEntry);
+          }
+        }
+      }
+    }
+    return unionMap;
+  }
 }
 
 /**
@@ -14510,7 +14546,7 @@
   /**
    * A table mapping URI-based directive to the actual URI value.
    */
-  Map<UriBasedDirective, String> _directiveUris = new Map<UriBasedDirective, String>();
+  HashMap<UriBasedDirective, String> _directiveUris = new HashMap<UriBasedDirective, String>();
 
   /**
    * A flag indicating whether this library explicitly imports core.
@@ -14526,7 +14562,7 @@
    * A table mapping the sources for the compilation units in this library to their corresponding
    * AST structures.
    */
-  Map<Source, ResolvableCompilationUnit> _astMap = new Map<Source, ResolvableCompilationUnit>();
+  HashMap<Source, ResolvableCompilationUnit> _astMap = new HashMap<Source, ResolvableCompilationUnit>();
 
   /**
    * The library scope used when resolving elements within this library's compilation units.
@@ -14626,7 +14662,7 @@
    * @return the libraries that are either imported or exported from this library
    */
   List<Library> get importsAndExports {
-    Set<Library> libraries = new Set<Library>();
+    HashSet<Library> libraries = new HashSet<Library>();
     for (Library library in _importedLibraries) {
       libraries.add(library);
     }
@@ -14978,7 +15014,7 @@
    * @param setters the list to which setters are to be added
    * @param unit the compilation unit defining the accessors that are potentially being added
    */
-  void _collectAccessors(Map<String, PropertyAccessorElement> getters, List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
+  void _collectAccessors(HashMap<String, PropertyAccessorElement> getters, List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
     for (PropertyAccessorElement accessor in unit.accessors) {
       if (accessor.isGetter) {
         if (!accessor.isSynthetic && accessor.correspondingSetter == null) {
@@ -15039,7 +15075,7 @@
    * @param libraryElement the library defining the compilation units to be processed
    */
   void _patchTopLevelAccessors(LibraryElementImpl libraryElement) {
-    Map<String, PropertyAccessorElement> getters = new Map<String, PropertyAccessorElement>();
+    HashMap<String, PropertyAccessorElement> getters = new HashMap<String, PropertyAccessorElement>();
     List<PropertyAccessorElement> setters = new List<PropertyAccessorElement>();
     _collectAccessors(getters, setters, libraryElement.definingCompilationUnit);
     for (CompilationUnitElement unit in libraryElement.parts) {
@@ -15248,7 +15284,7 @@
   /**
    * A table mapping library sources to the information being maintained for those libraries.
    */
-  Map<Source, Library> _libraryMap = new Map<Source, Library>();
+  HashMap<Source, Library> _libraryMap = new HashMap<Source, Library>();
 
   /**
    * A collection containing the libraries that are being resolved together.
@@ -15306,7 +15342,7 @@
         // This will be true unless the library being analyzed is the core library.
         _coreLibrary = createLibrary(_coreLibrarySource);
         if (_coreLibrary == null) {
-          throw new AnalysisException("Core library does not exist");
+          LibraryResolver2.missingCoreLibrary(analysisContext, _coreLibrarySource);
         }
       }
       instrumentation.metric3("createLibrary", "complete");
@@ -15390,7 +15426,7 @@
         // This will be true unless the library being analyzed is the core library.
         _coreLibrary = _createLibraryOrNull(_coreLibrarySource);
         if (_coreLibrary == null) {
-          throw new AnalysisException("Core library does not exist");
+          LibraryResolver2.missingCoreLibrary(analysisContext, _coreLibrarySource);
         }
       }
       instrumentation.metric3("createLibrary", "complete");
@@ -15472,7 +15508,7 @@
    * @param referencingLibrary the library that references the referenced library
    * @param referencedLibrary the library referenced by the referencing library
    */
-  void _addDependencyToMap(Map<Library, List<Library>> dependencyMap, Library referencingLibrary, Library referencedLibrary) {
+  void _addDependencyToMap(HashMap<Library, List<Library>> dependencyMap, Library referencingLibrary, Library referencedLibrary) {
     List<Library> dependentLibraries = dependencyMap[referencedLibrary];
     if (dependentLibraries == null) {
       dependentLibraries = new List<Library>();
@@ -15491,7 +15527,7 @@
    * @param dependencyMap a table mapping libraries to the collection of libraries from which those
    *          libraries are referenced
    */
-  void _addLibrariesInCycle(Library library, Set<Library> librariesInCycle, Map<Library, List<Library>> dependencyMap) {
+  void _addLibrariesInCycle(Library library, Set<Library> librariesInCycle, HashMap<Library, List<Library>> dependencyMap) {
     if (librariesInCycle.add(library)) {
       List<Library> dependentLibraries = dependencyMap[library];
       if (dependentLibraries != null) {
@@ -15511,7 +15547,7 @@
    * @param visitedLibraries the libraries that have already been visited, used to prevent infinite
    *          recursion
    */
-  void _addToDependencyMap(Library library, Map<Library, List<Library>> dependencyMap, Set<Library> visitedLibraries) {
+  void _addToDependencyMap(Library library, HashMap<Library, List<Library>> dependencyMap, Set<Library> visitedLibraries) {
     if (visitedLibraries.add(library)) {
       for (Library referencedLibrary in library.importsAndExports) {
         _addDependencyToMap(dependencyMap, library, referencedLibrary);
@@ -15556,7 +15592,7 @@
    */
   void _buildDirectiveModels() {
     for (Library library in _librariesInCycles) {
-      Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixElementImpl>();
+      HashMap<String, PrefixElementImpl> nameToPrefixMap = new HashMap<String, PrefixElementImpl>();
       List<ImportElement> imports = new List<ImportElement>();
       List<ExportElement> exports = new List<ExportElement>();
       for (Directive directive in library.definingCompilationUnit.directives) {
@@ -15692,9 +15728,9 @@
    *
    * @param library the library currently being added to the dependency map
    */
-  Map<Library, List<Library>> _computeDependencyMap(Library library) {
-    Map<Library, List<Library>> dependencyMap = new Map<Library, List<Library>>();
-    _addToDependencyMap(library, dependencyMap, new Set<Library>());
+  HashMap<Library, List<Library>> _computeDependencyMap(Library library) {
+    HashMap<Library, List<Library>> dependencyMap = new HashMap<Library, List<Library>>();
+    _addToDependencyMap(library, dependencyMap, new HashSet<Library>());
     return dependencyMap;
   }
 
@@ -15707,8 +15743,8 @@
    */
   void _computeEmbeddedLibraryDependencies(Library library, CompilationUnit unit) {
     Source librarySource = library.librarySource;
-    Set<Source> exportedSources = new Set<Source>();
-    Set<Source> importedSources = new Set<Source>();
+    HashSet<Source> exportedSources = new HashSet<Source>();
+    HashSet<Source> importedSources = new HashSet<Source>();
     for (Directive directive in unit.directives) {
       if (directive is ExportDirective) {
         Source exportSource = _resolveSource(librarySource, directive);
@@ -15734,8 +15770,8 @@
    *         back to the given library
    */
   Set<Library> _computeLibrariesInCycles(Library library) {
-    Map<Library, List<Library>> dependencyMap = _computeDependencyMap(library);
-    Set<Library> librariesInCycle = new Set<Library>();
+    HashMap<Library, List<Library>> dependencyMap = _computeDependencyMap(library);
+    Set<Library> librariesInCycle = new HashSet<Library>();
     _addLibrariesInCycle(library, librariesInCycle, dependencyMap);
     return librariesInCycle;
   }
@@ -15962,6 +15998,18 @@
  */
 class LibraryResolver2 {
   /**
+   * Report that the core library could not be resolved in the given analysis context and throw an
+   * exception.
+   *
+   * @param analysisContext the analysis context in which the failure occurred
+   * @param coreLibrarySource the source representing the core library
+   * @throws AnalysisException always
+   */
+  static void missingCoreLibrary(AnalysisContext analysisContext, Source coreLibrarySource) {
+    throw new AnalysisException("Could not resolve dart:core");
+  }
+
+  /**
    * The analysis context in which the libraries are being analyzed.
    */
   final InternalAnalysisContext analysisContext;
@@ -15991,7 +16039,7 @@
   /**
    * A table mapping library sources to the information being maintained for those libraries.
    */
-  Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary>();
+  HashMap<Source, ResolvableLibrary> _libraryMap = new HashMap<Source, ResolvableLibrary>();
 
   /**
    * A collection containing the libraries that are being resolved together.
@@ -16065,7 +16113,7 @@
       instrumentation.metric3("buildElementModels", "complete");
       LibraryElement coreElement = _coreLibrary.libraryElement;
       if (coreElement == null) {
-        throw new AnalysisException("Could not resolve dart:core");
+        missingCoreLibrary(analysisContext, _coreLibrarySource);
       }
       _buildDirectiveModels();
       instrumentation.metric3("buildDirectiveModels", "complete");
@@ -16132,7 +16180,7 @@
    */
   void _buildDirectiveModels() {
     for (ResolvableLibrary library in _librariesInCycle) {
-      Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixElementImpl>();
+      HashMap<String, PrefixElementImpl> nameToPrefixMap = new HashMap<String, PrefixElementImpl>();
       List<ImportElement> imports = new List<ImportElement>();
       List<ExportElement> exports = new List<ExportElement>();
       for (Directive directive in library.definingCompilationUnit.directives) {
@@ -16241,8 +16289,8 @@
     }
   }
 
-  Map<Source, ResolvableLibrary> _buildLibraryMap() {
-    Map<Source, ResolvableLibrary> libraryMap = new Map<Source, ResolvableLibrary>();
+  HashMap<Source, ResolvableLibrary> _buildLibraryMap() {
+    HashMap<Source, ResolvableLibrary> libraryMap = new HashMap<Source, ResolvableLibrary>();
     int libraryCount = _librariesInCycle.length;
     for (int i = 0; i < libraryCount; i++) {
       ResolvableLibrary library = _librariesInCycle[i];
@@ -16615,12 +16663,12 @@
    * A table mapping names that are defined in this namespace to the element representing the thing
    * declared with that name.
    */
-  final Map<String, Element> _definedNames;
+  final HashMap<String, Element> _definedNames;
 
   /**
    * An empty namespace.
    */
-  static Namespace EMPTY = new Namespace(new Map<String, Element>());
+  static Namespace EMPTY = new Namespace(new HashMap<String, Element>());
 
   /**
    * Initialize a newly created namespace to have the given defined names.
@@ -16644,7 +16692,7 @@
    *
    * @return a table containing the same mappings as those defined by this namespace
    */
-  Map<String, Element> get definedNames => new Map<String, Element>.from(_definedNames);
+  Map<String, Element> get definedNames => new HashMap<String, Element>.from(_definedNames);
 }
 
 /**
@@ -16666,7 +16714,7 @@
       //
       return Namespace.EMPTY;
     }
-    Map<String, Element> definedNames = _createExportMapping(exportedLibrary, new Set<LibraryElement>());
+    HashMap<String, Element> definedNames = _createExportMapping(exportedLibrary, new HashSet<LibraryElement>());
     definedNames = _applyCombinators(definedNames, element.combinators);
     return new Namespace(definedNames);
   }
@@ -16677,7 +16725,7 @@
    * @param library the library whose export namespace is to be created
    * @return the export namespace that was created
    */
-  Namespace createExportNamespaceForLibrary(LibraryElement library) => new Namespace(_createExportMapping(library, new Set<LibraryElement>()));
+  Namespace createExportNamespaceForLibrary(LibraryElement library) => new Namespace(_createExportMapping(library, new HashSet<LibraryElement>()));
 
   /**
    * Create a namespace representing the import namespace of the given library.
@@ -16693,7 +16741,7 @@
       //
       return Namespace.EMPTY;
     }
-    Map<String, Element> definedNames = _createExportMapping(importedLibrary, new Set<LibraryElement>());
+    HashMap<String, Element> definedNames = _createExportMapping(importedLibrary, new HashSet<LibraryElement>());
     definedNames = _applyCombinators(definedNames, element.combinators);
     definedNames = _applyPrefix(definedNames, element.prefix);
     return new Namespace(definedNames);
@@ -16706,7 +16754,7 @@
    * @return the public namespace that was created
    */
   Namespace createPublicNamespaceForLibrary(LibraryElement library) {
-    Map<String, Element> definedNames = new Map<String, Element>();
+    HashMap<String, Element> definedNames = new HashMap<String, Element>();
     _addPublicNames(definedNames, library.definingCompilationUnit);
     for (CompilationUnitElement compilationUnit in library.parts) {
       _addPublicNames(definedNames, compilationUnit);
@@ -16780,7 +16828,7 @@
    * @param definedNames the mapping table to which the namespace operations are to be applied
    * @param combinators the combinators to be applied
    */
-  Map<String, Element> _applyCombinators(Map<String, Element> definedNames, List<NamespaceCombinator> combinators) {
+  HashMap<String, Element> _applyCombinators(HashMap<String, Element> definedNames, List<NamespaceCombinator> combinators) {
     for (NamespaceCombinator combinator in combinators) {
       if (combinator is HideElementCombinator) {
         _hide(definedNames, combinator.hiddenNames);
@@ -16800,10 +16848,10 @@
    * @param definedNames the names that were defined before this operation
    * @param prefixElement the element defining the prefix to be added to the names
    */
-  Map<String, Element> _applyPrefix(Map<String, Element> definedNames, PrefixElement prefixElement) {
+  HashMap<String, Element> _applyPrefix(HashMap<String, Element> definedNames, PrefixElement prefixElement) {
     if (prefixElement != null) {
       String prefix = prefixElement.name;
-      Map<String, Element> newNames = new Map<String, Element>();
+      HashMap<String, Element> newNames = new HashMap<String, Element>();
       for (MapEntry<String, Element> entry in getMapEntrySet(definedNames)) {
         newNames["${prefix}.${entry.getKey()}"] = entry.getValue();
       }
@@ -16822,17 +16870,17 @@
    *          be added by another library
    * @return the mapping table that was created
    */
-  Map<String, Element> _createExportMapping(LibraryElement library, Set<LibraryElement> visitedElements) {
+  HashMap<String, Element> _createExportMapping(LibraryElement library, HashSet<LibraryElement> visitedElements) {
     visitedElements.add(library);
     try {
-      Map<String, Element> definedNames = new Map<String, Element>();
+      HashMap<String, Element> definedNames = new HashMap<String, Element>();
       for (ExportElement element in library.exports) {
         LibraryElement exportedLibrary = element.exportedLibrary;
         if (exportedLibrary != null && !visitedElements.contains(exportedLibrary)) {
           //
           // The exported library will be null if the URI does not reference a valid library.
           //
-          Map<String, Element> exportedNames = _createExportMapping(exportedLibrary, visitedElements);
+          HashMap<String, Element> exportedNames = _createExportMapping(exportedLibrary, visitedElements);
           exportedNames = _applyCombinators(exportedNames, element.combinators);
           _addAllFromMap(definedNames, exportedNames);
         }
@@ -16850,7 +16898,7 @@
    * @param definedNames the names that were defined before this operation
    * @param hiddenNames the names to be hidden
    */
-  void _hide(Map<String, Element> definedNames, List<String> hiddenNames) {
+  void _hide(HashMap<String, Element> definedNames, List<String> hiddenNames) {
     for (String name in hiddenNames) {
       definedNames.remove(name);
       definedNames.remove("${name}=");
@@ -16864,8 +16912,8 @@
    * @param definedNames the names that were defined before this operation
    * @param shownNames the names to be shown
    */
-  Map<String, Element> _show(Map<String, Element> definedNames, List<String> shownNames) {
-    Map<String, Element> newNames = new Map<String, Element>();
+  HashMap<String, Element> _show(HashMap<String, Element> definedNames, List<String> shownNames) {
+    HashMap<String, Element> newNames = new HashMap<String, Element>();
     for (String name in shownNames) {
       Element element = definedNames[name];
       if (element != null) {
@@ -17551,7 +17599,7 @@
    * @return the libraries that are either imported or exported from this library
    */
   List<ResolvableLibrary> get importsAndExports {
-    Set<ResolvableLibrary> libraries = new Set<ResolvableLibrary>();
+    HashSet<ResolvableLibrary> libraries = new HashSet<ResolvableLibrary>();
     for (ResolvableLibrary library in _importedLibraries) {
       libraries.add(library);
     }
@@ -17724,6 +17772,9 @@
 
   @override
   ErrorSeverity get errorSeverity => type.severity;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -17963,6 +18014,8 @@
       _enclosingClass = node.element;
       _typeAnalyzer.thisType = _enclosingClass == null ? null : _enclosingClass.type;
       super.visitClassDeclaration(node);
+      node.accept(_elementResolver);
+      node.accept(_typeAnalyzer);
     } finally {
       _typeAnalyzer.thisType = outerType == null ? null : outerType.type;
       _enclosingClass = outerType;
@@ -18163,7 +18216,7 @@
     try {
       super.visitFieldDeclaration(node);
     } finally {
-      Map<Element, DartType> overrides = _overrideManager.captureOverrides(node.fields);
+      HashMap<Element, DartType> overrides = _overrideManager.captureOverrides(node.fields);
       _overrideManager.exitScope();
       _overrideManager.applyOverrides(overrides);
     }
@@ -18255,7 +18308,7 @@
   Object visitIfStatement(IfStatement node) {
     Expression condition = node.condition;
     safelyVisit(condition);
-    Map<Element, DartType> thenOverrides = null;
+    HashMap<Element, DartType> thenOverrides = null;
     Statement thenStatement = node.thenStatement;
     if (thenStatement != null) {
       _overrideManager.enterScope();
@@ -18277,7 +18330,7 @@
         _overrideManager.exitScope();
       }
     }
-    Map<Element, DartType> elseOverrides = null;
+    HashMap<Element, DartType> elseOverrides = null;
     Statement elseStatement = node.elseStatement;
     if (elseStatement != null) {
       _overrideManager.enterScope();
@@ -18426,7 +18479,7 @@
     try {
       super.visitTopLevelVariableDeclaration(node);
     } finally {
-      Map<Element, DartType> overrides = _overrideManager.captureOverrides(node.variables);
+      HashMap<Element, DartType> overrides = _overrideManager.captureOverrides(node.variables);
       _overrideManager.exitScope();
       _overrideManager.applyOverrides(overrides);
     }
@@ -18578,14 +18631,15 @@
     if (potentialType == null || potentialType.isBottom) {
       return;
     }
-    if (element is PropertyInducingElement) {
-      PropertyInducingElement variable = element;
-      if (!variable.isConst && !variable.isFinal) {
-        return;
-      }
-    }
     DartType currentType = _getBestType(element);
     if (currentType == null || !currentType.isMoreSpecificThan(potentialType)) {
+      if (element is PropertyInducingElement) {
+        PropertyInducingElement variable = element;
+        if (!variable.isConst && !variable.isFinal) {
+          return;
+        }
+        (variable as PropertyInducingElementImpl).propagatedType = potentialType;
+      }
       _overrideManager.setType(element, potentialType);
     }
   }
@@ -19043,7 +19097,7 @@
    * A table mapping names that are defined in this scope to the element representing the thing
    * declared with that name.
    */
-  Map<String, Element> _definedNames = new Map<String, Element>();
+  HashMap<String, Element> _definedNames = new HashMap<String, Element>();
 
   /**
    * A flag indicating whether there are any names defined in this scope.
@@ -19264,13 +19318,13 @@
       if (element == null) {
         throw new AnalysisException("Cannot build a scope for an unresolved class");
       }
-      scope = new ClassScope(scope, element);
+      scope = new ClassScope(new TypeParameterScope(scope, element), element);
     } else if (node is ClassTypeAlias) {
       ClassElement element = node.element;
       if (element == null) {
         throw new AnalysisException("Cannot build a scope for an unresolved class type alias");
       }
-      scope = new ClassScope(scope, element);
+      scope = new ClassScope(new TypeParameterScope(scope, element), element);
     } else if (node is ConstructorDeclaration) {
       ConstructorElement element = node.element;
       if (element == null) {
@@ -19481,11 +19535,14 @@
     Scope outerScope = _nameScope;
     try {
       if (classElement == null) {
-        AnalysisEngine.instance.logger.logInformation2("Missing element for constructor ${node.name.name} in ${definingLibrary.source.fullName}", new JavaException());
+        AnalysisEngine.instance.logger.logInformation2("Missing element for class declaration ${node.name.name} in ${definingLibrary.source.fullName}", new JavaException());
+        super.visitClassDeclaration(node);
       } else {
+        _nameScope = new TypeParameterScope(_nameScope, classElement);
+        visitClassDeclarationInScope(node);
         _nameScope = new ClassScope(_nameScope, classElement);
+        visitClassMembersInScope(node);
       }
-      visitClassDeclarationInScope(node);
     } finally {
       _nameScope = outerScope;
     }
@@ -19496,7 +19553,8 @@
   Object visitClassTypeAlias(ClassTypeAlias node) {
     Scope outerScope = _nameScope;
     try {
-      _nameScope = new ClassScope(_nameScope, node.element);
+      ClassElement element = node.element;
+      _nameScope = new ClassScope(new TypeParameterScope(_nameScope, element), element);
       super.visitClassTypeAlias(node);
     } finally {
       _nameScope = outerScope;
@@ -19827,7 +19885,18 @@
   }
 
   void visitClassDeclarationInScope(ClassDeclaration node) {
-    super.visitClassDeclaration(node);
+    safelyVisit(node.name);
+    safelyVisit(node.typeParameters);
+    safelyVisit(node.extendsClause);
+    safelyVisit(node.withClause);
+    safelyVisit(node.implementsClause);
+    safelyVisit(node.nativeClause);
+  }
+
+  void visitClassMembersInScope(ClassDeclaration node) {
+    safelyVisit(node.documentationComment);
+    node.metadata.accept(this);
+    node.members.accept(this);
   }
 
   /**
@@ -19942,8 +20011,8 @@
    *
    * @return the table that was created
    */
-  static Map<String, String> _createHtmlTagToClassMap() {
-    Map<String, String> map = new Map<String, String>();
+  static HashMap<String, String> _createHtmlTagToClassMap() {
+    HashMap<String, String> map = new HashMap<String, String>();
     map["a"] = "AnchorElement";
     map["area"] = "AreaElement";
     map["br"] = "BRElement";
@@ -20039,13 +20108,13 @@
   /**
    * A table mapping [ExecutableElement]s to their propagated return types.
    */
-  Map<ExecutableElement, DartType> _propagatedReturnTypes = new Map<ExecutableElement, DartType>();
+  HashMap<ExecutableElement, DartType> _propagatedReturnTypes = new HashMap<ExecutableElement, DartType>();
 
   /**
    * A table mapping HTML tag names to the names of the classes (in 'dart:html') that implement
    * those tags.
    */
-  static Map<String, String> _HTML_ELEMENT_TO_CLASS_MAP = _createHtmlTagToClassMap();
+  static HashMap<String, String> _HTML_ELEMENT_TO_CLASS_MAP = _createHtmlTagToClassMap();
 
   /**
    * Initialize a newly created type analyzer.
@@ -20808,6 +20877,7 @@
     SimpleIdentifier prefixedIdentifier = node.identifier;
     Element staticElement = prefixedIdentifier.staticElement;
     DartType staticType = _dynamicType;
+    DartType propagatedType = null;
     if (staticElement is ClassElement) {
       if (_isNotTypeLiteral(node)) {
         staticType = staticElement.type;
@@ -20824,6 +20894,7 @@
       staticType = staticElement.type;
     } else if (staticElement is PropertyAccessorElement) {
       staticType = _getTypeOfProperty(staticElement, node.prefix.staticType);
+      propagatedType = _getPropertyPropagatedType(staticElement, propagatedType);
     } else if (staticElement is ExecutableElement) {
       staticType = staticElement.type;
     } else if (staticElement is TypeParameterElement) {
@@ -20834,7 +20905,6 @@
     _recordStaticType(prefixedIdentifier, staticType);
     _recordStaticType(node, staticType);
     Element propagatedElement = prefixedIdentifier.propagatedElement;
-    DartType propagatedType = null;
     if (propagatedElement is ClassElement) {
       if (_isNotTypeLiteral(node)) {
         propagatedType = propagatedElement.type;
@@ -20847,6 +20917,7 @@
       propagatedType = propagatedElement.type;
     } else if (propagatedElement is PropertyAccessorElement) {
       propagatedType = _getTypeOfProperty(propagatedElement, node.prefix.staticType);
+      propagatedType = _getPropertyPropagatedType(propagatedElement, propagatedType);
     } else if (propagatedElement is ExecutableElement) {
       propagatedType = propagatedElement.type;
     } else if (propagatedElement is TypeParameterElement) {
@@ -21052,7 +21123,13 @@
     _recordStaticType(node, staticType);
     // TODO(brianwilkerson) I think we want to repeat the logic above using the propagated element
     // to get another candidate for the propagated type.
-    DartType propagatedType = _overrideManager.getType(element);
+    DartType propagatedType = _getPropertyPropagatedType(element, null);
+    if (propagatedType == null) {
+      DartType overriddenType = _overrideManager.getType(element);
+      if (propagatedType == null || overriddenType != null && overriddenType.isMoreSpecificThan(propagatedType)) {
+        propagatedType = overriddenType;
+      }
+    }
     if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
       _recordPropagatedType(node, propagatedType);
     }
@@ -21275,7 +21352,7 @@
    * @param nameMap an optional map used to map the element name to a type name
    * @return the type specified by the first argument in the argument list
    */
-  DartType _getElementNameAsType(LibraryElement library, String elementName, Map<String, String> nameMap) {
+  DartType _getElementNameAsType(LibraryElement library, String elementName, HashMap<String, String> nameMap) {
     if (elementName != null) {
       if (nameMap != null) {
         elementName = nameMap[elementName.toLowerCase()];
@@ -21363,7 +21440,24 @@
    * @param nameMap an optional map used to map the element name to a type name
    * @return the type specified by the first argument in the argument list
    */
-  DartType _getFirstArgumentAsTypeWithMap(LibraryElement library, ArgumentList argumentList, Map<String, String> nameMap) => _getElementNameAsType(library, _getFirstArgumentAsString(argumentList), nameMap);
+  DartType _getFirstArgumentAsTypeWithMap(LibraryElement library, ArgumentList argumentList, HashMap<String, String> nameMap) => _getElementNameAsType(library, _getFirstArgumentAsString(argumentList), nameMap);
+
+  /**
+   * Return the propagated type of the given [Element], or `null`.
+   */
+  DartType _getPropertyPropagatedType(Element element, DartType currentType) {
+    if (element is PropertyAccessorElement) {
+      PropertyAccessorElement accessor = element;
+      if (accessor.isGetter) {
+        PropertyInducingElement variable = accessor.variable;
+        DartType propagatedType = variable.propagatedType;
+        if (currentType == null || propagatedType != null && propagatedType.isMoreSpecificThan(currentType)) {
+          return propagatedType;
+        }
+      }
+    }
+    return currentType;
+  }
 
   /**
    * Return the static type of the given expression.
@@ -21578,26 +21672,26 @@
    * A map between [ClassElement]s and a set of [ClassElement]s that are subtypes of the
    * key.
    */
-  Map<ClassElement, Set<ClassElement>> _subtypeMap = new Map<ClassElement, Set<ClassElement>>();
+  HashMap<ClassElement, HashSet<ClassElement>> _subtypeMap = new HashMap<ClassElement, HashSet<ClassElement>>();
 
   /**
    * The set of all [LibraryElement]s that have been visited by the manager. This is used both
    * to prevent infinite loops in the recursive methods, and also as a marker for the scope of the
    * libraries visited by this manager.
    */
-  Set<LibraryElement> _visitedLibraries = new Set<LibraryElement>();
+  HashSet<LibraryElement> _visitedLibraries = new HashSet<LibraryElement>();
 
   /**
    * Given some [ClassElement], return the set of all subtypes, and subtypes of subtypes.
    *
    * @param classElement the class to recursively return the set of subtypes of
    */
-  Set<ClassElement> computeAllSubtypes(ClassElement classElement) {
+  HashSet<ClassElement> computeAllSubtypes(ClassElement classElement) {
     // Ensure that we have generated the subtype map for the library
     _computeSubtypesInLibrary(classElement.library);
     // use the subtypeMap to compute the set of all subtypes and subtype's subtypes
-    Set<ClassElement> allSubtypes = new Set<ClassElement>();
-    _safelyComputeAllSubtypes(classElement, new Set<ClassElement>(), allSubtypes);
+    HashSet<ClassElement> allSubtypes = new HashSet<ClassElement>();
+    _safelyComputeAllSubtypes(classElement, new HashSet<ClassElement>(), allSubtypes);
     return allSubtypes;
   }
 
@@ -21690,9 +21784,9 @@
    * @param subtypeElement the value for the [subtypeMap] map
    */
   void _putInSubtypeMap(ClassElement supertypeElement, ClassElement subtypeElement) {
-    Set<ClassElement> subtypes = _subtypeMap[supertypeElement];
+    HashSet<ClassElement> subtypes = _subtypeMap[supertypeElement];
     if (subtypes == null) {
-      subtypes = new Set<ClassElement>();
+      subtypes = new HashSet<ClassElement>();
       _subtypeMap[supertypeElement] = subtypes;
     }
     subtypes.add(subtypeElement);
@@ -21706,12 +21800,12 @@
    * @param visitedClasses the set of class elements that this method has already recursively seen
    * @param allSubtypes the computed set of subtypes of the passed class element
    */
-  void _safelyComputeAllSubtypes(ClassElement classElement, Set<ClassElement> visitedClasses, Set<ClassElement> allSubtypes) {
+  void _safelyComputeAllSubtypes(ClassElement classElement, HashSet<ClassElement> visitedClasses, HashSet<ClassElement> allSubtypes) {
     if (!visitedClasses.add(classElement)) {
       // if this class has already been called on this class element
       return;
     }
-    Set<ClassElement> subtypes = _subtypeMap[classElement];
+    HashSet<ClassElement> subtypes = _subtypeMap[classElement];
     if (subtypes == null) {
       return;
     }
@@ -21797,7 +21891,7 @@
    *
    * @param overrides the overrides to be applied
    */
-  void applyOverrides(Map<Element, DartType> overrides) {
+  void applyOverrides(HashMap<Element, DartType> overrides) {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot apply overrides without a scope");
     }
@@ -21810,7 +21904,7 @@
    *
    * @return the overrides in the current scope
    */
-  Map<Element, DartType> captureLocalOverrides() {
+  HashMap<Element, DartType> captureLocalOverrides() {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot capture local overrides without a scope");
     }
@@ -21824,7 +21918,7 @@
    * @param variableList the list of variables whose overriding types are to be captured
    * @return a table mapping elements to their overriding types
    */
-  Map<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
+  HashMap<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot capture overrides without a scope");
     }
@@ -21889,7 +21983,7 @@
   /**
    * A table mapping elements to the overridden type of that element.
    */
-  Map<Element, DartType> _overridenTypes = new Map<Element, DartType>();
+  HashMap<Element, DartType> _overridenTypes = new HashMap<Element, DartType>();
 
   /**
    * Initialize a newly created scope to be an empty child of the given scope.
@@ -21903,7 +21997,7 @@
    *
    * @param overrides the overrides to be applied
    */
-  void applyOverrides(Map<Element, DartType> overrides) {
+  void applyOverrides(HashMap<Element, DartType> overrides) {
     for (MapEntry<Element, DartType> entry in getMapEntrySet(overrides)) {
       _overridenTypes[entry.getKey()] = entry.getValue();
     }
@@ -21915,7 +22009,7 @@
    *
    * @return the overrides in the current scope
    */
-  Map<Element, DartType> captureLocalOverrides() => _overridenTypes;
+  HashMap<Element, DartType> captureLocalOverrides() => _overridenTypes;
 
   /**
    * Return a map from the elements for the variables in the given list that have their types
@@ -21924,8 +22018,8 @@
    * @param variableList the list of variables whose overriding types are to be captured
    * @return a table mapping elements to their overriding types
    */
-  Map<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
-    Map<Element, DartType> overrides = new Map<Element, DartType>();
+  HashMap<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
+    HashMap<Element, DartType> overrides = new HashMap<Element, DartType>();
     if (variableList.isConst || variableList.isFinal) {
       for (VariableDeclaration variable in variableList.variables) {
         Element element = variable.element;
@@ -21972,6 +22066,36 @@
 }
 
 /**
+ * Instances of the class `TypeParameterScope` implement the scope defined by the type
+ * parameters in a class.
+ */
+class TypeParameterScope extends EnclosedScope {
+  /**
+   * Initialize a newly created scope enclosed within another scope.
+   *
+   * @param enclosingScope the scope in which this scope is lexically enclosed
+   * @param typeElement the element representing the type represented by this scope
+   */
+  TypeParameterScope(Scope enclosingScope, ClassElement typeElement) : super(enclosingScope) {
+    if (typeElement == null) {
+      throw new IllegalArgumentException("class element cannot be null");
+    }
+    _defineTypeParameters(typeElement);
+  }
+
+  /**
+   * Define the type parameters for the class.
+   *
+   * @param typeElement the element representing the type represented by this scope
+   */
+  void _defineTypeParameters(ClassElement typeElement) {
+    for (TypeParameterElement typeParameter in typeElement.typeParameters) {
+      define(typeParameter);
+    }
+  }
+}
+
+/**
  * Instances of the class `TypePromotionManager` manage the ability to promote types of local
  * variables and formal parameters from their declared types based on control flow.
  */
@@ -22057,7 +22181,7 @@
   /**
    * A table mapping elements to the promoted type of that element.
    */
-  Map<Element, DartType> _promotedTypes = new Map<Element, DartType>();
+  HashMap<Element, DartType> _promotedTypes = new HashMap<Element, DartType>();
 
   /**
    * Initialize a newly created scope to be an empty child of the given scope.
@@ -22554,13 +22678,15 @@
 
   @override
   Object visitClassDeclaration(ClassDeclaration node) {
+    ExtendsClause extendsClause = node.extendsClause;
+    WithClause withClause = node.withClause;
+    ImplementsClause implementsClause = node.implementsClause;
     _hasReferenceToSuper = false;
     super.visitClassDeclaration(node);
     ClassElementImpl classElement = _getClassElement(node.name);
     InterfaceType superclassType = null;
-    ExtendsClause extendsClause = node.extendsClause;
     if (extendsClause != null) {
-      ErrorCode errorCode = (node.withClause == null ? CompileTimeErrorCode.EXTENDS_NON_CLASS : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS);
+      ErrorCode errorCode = (withClause == null ? CompileTimeErrorCode.EXTENDS_NON_CLASS : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS);
       superclassType = _resolveType(extendsClause.superclass, errorCode, errorCode);
       if (!identical(superclassType, typeProvider.objectType)) {
         classElement.validMixin = false;
@@ -22576,7 +22702,7 @@
       classElement.supertype = superclassType;
       classElement.hasReferenceToSuper = _hasReferenceToSuper;
     }
-    _resolve(classElement, node.withClause, node.implementsClause);
+    _resolve(classElement, withClause, implementsClause);
     return null;
   }
 
@@ -23030,13 +23156,13 @@
   }
 
   @override
-  void visitClassDeclarationInScope(ClassDeclaration node) {
+  void visitClassMembersInScope(ClassDeclaration node) {
     //
     // Process field declarations before constructors and methods so that the types of field formal
     // parameters can be correctly resolved.
     //
     List<ClassMember> nonFields = new List<ClassMember>();
-    node.visitChildren(new UnifyingAstVisitor_TypeResolverVisitor_visitClassDeclarationInScope(this, nonFields));
+    node.visitChildren(new UnifyingAstVisitor_TypeResolverVisitor_visitClassMembersInScope(this, nonFields));
     int count = nonFields.length;
     for (int i = 0; i < count; i++) {
       nonFields[i].accept(this);
@@ -23527,12 +23653,12 @@
   Object visitNode(AstNode node) => node.accept(ElementBuilder_this);
 }
 
-class UnifyingAstVisitor_TypeResolverVisitor_visitClassDeclarationInScope extends UnifyingAstVisitor<Object> {
+class UnifyingAstVisitor_TypeResolverVisitor_visitClassMembersInScope extends UnifyingAstVisitor<Object> {
   final TypeResolverVisitor TypeResolverVisitor_this;
 
   List<ClassMember> nonFields;
 
-  UnifyingAstVisitor_TypeResolverVisitor_visitClassDeclarationInScope(this.TypeResolverVisitor_this, this.nonFields) : super();
+  UnifyingAstVisitor_TypeResolverVisitor_visitClassMembersInScope(this.TypeResolverVisitor_this, this.nonFields) : super();
 
   @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
@@ -23541,6 +23667,12 @@
   }
 
   @override
+  Object visitExtendsClause(ExtendsClause node) => null;
+
+  @override
+  Object visitImplementsClause(ImplementsClause node) => null;
+
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     nonFields.add(node);
     return null;
@@ -23548,6 +23680,9 @@
 
   @override
   Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this);
+
+  @override
+  Object visitWithClause(WithClause node) => null;
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index 0153b3c..2d50d11 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -1631,8 +1631,8 @@
     while (next != -1) {
       if (next == 0x24) {
         _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
-        _beginToken();
         next = _tokenizeStringInterpolation(start);
+        _beginToken();
         start = _reader.offset;
         continue;
       }
@@ -1678,7 +1678,11 @@
       }
     }
     _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    if (start == _reader.offset) {
+      _appendStringTokenWithOffset(TokenType.STRING, "", 1);
+    } else {
+      _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    }
     return _reader.advance();
   }
 
@@ -1750,7 +1754,7 @@
         return _reader.advance();
       } else if (next == 0xD || next == 0xA) {
         _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-        _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
         return _reader.advance();
       }
       next = _reader.advance();
@@ -1766,14 +1770,20 @@
         next = _reader.advance();
       } else if (next == 0x24) {
         _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
-        _beginToken();
         next = _tokenizeStringInterpolation(start);
+        _beginToken();
         start = _reader.offset;
         continue;
       }
       if (next <= 0xD && (next == 0xA || next == 0xD || next == -1)) {
         _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-        _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        if (start == _reader.offset) {
+          _appendStringTokenWithOffset(TokenType.STRING, "", 1);
+        } else if (next == -1) {
+          _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        } else {
+          _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        }
         return _reader.advance();
       }
       next = _reader.advance();
@@ -1911,6 +1921,9 @@
 
   @override
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 4a60af2..84ccc2d 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -7,6 +7,7 @@
 
 library engine.sdk;
 
+import 'dart:collection';
 import 'source.dart' show ContentCache, Source, UriKind;
 import 'ast.dart';
 import 'engine.dart' show AnalysisContext;
@@ -101,7 +102,7 @@
   /**
    * A table mapping Dart library URI's to the library.
    */
-  Map<String, SdkLibraryImpl> _libraryMap = new Map<String, SdkLibraryImpl>();
+  HashMap<String, SdkLibraryImpl> _libraryMap = new HashMap<String, SdkLibraryImpl>();
 
   /**
    * Return the library with the given URI, or `null` if the URI does not map to a library.
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 3e41f46..e01f15f 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -7,6 +7,7 @@
 
 library engine.source;
 
+import 'dart:collection';
 import 'java_core.dart';
 import 'sdk.dart' show DartSdk;
 import 'engine.dart' show AnalysisContext, TimestampedData;
@@ -20,13 +21,13 @@
    * A table mapping sources to the contents of those sources. This is used to override the default
    * contents of a source.
    */
-  Map<Source, String> _contentMap = new Map<Source, String>();
+  HashMap<Source, String> _contentMap = new HashMap<Source, String>();
 
   /**
    * A table mapping sources to the modification stamps of those sources. This is used when the
    * default contents of a source has been overridden.
    */
-  Map<Source, int> _stampMap = new Map<Source, int>();
+  HashMap<Source, int> _stampMap = new HashMap<Source, int>();
 
   /**
    * Return the contents of the given source, or `null` if this cache does not override the
@@ -787,16 +788,11 @@
   static const UriKind FILE_URI = const UriKind('FILE_URI', 1, 0x66);
 
   /**
-   * A 'package:' URI referencing source package itself.
-   */
-  static const UriKind PACKAGE_SELF_URI = const UriKind('PACKAGE_SELF_URI', 2, 0x73);
-
-  /**
    * A 'package:' URI.
    */
-  static const UriKind PACKAGE_URI = const UriKind('PACKAGE_URI', 3, 0x70);
+  static const UriKind PACKAGE_URI = const UriKind('PACKAGE_URI', 2, 0x70);
 
-  static const List<UriKind> values = const [DART_URI, FILE_URI, PACKAGE_SELF_URI, PACKAGE_URI];
+  static const List<UriKind> values = const [DART_URI, FILE_URI, PACKAGE_URI];
 
   /**
    * Return the URI kind represented by the given encoding, or `null` if there is no kind with
@@ -811,8 +807,6 @@
         return DART_URI;
       } else if (encoding == 0x66) {
         return FILE_URI;
-      } else if (encoding == 0x73) {
-        return PACKAGE_SELF_URI;
       } else if (encoding == 0x70) {
         return PACKAGE_URI;
       }
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index fa87510..962368c 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -370,7 +370,7 @@
 
   @override
   Source fromEncoding(UriKind kind, Uri uri) {
-    if (kind == UriKind.PACKAGE_SELF_URI || kind == UriKind.PACKAGE_URI) {
+    if (kind == UriKind.PACKAGE_URI) {
       return new FileBasedSource.con2(new JavaFile.fromUri(uri), kind);
     }
     return null;
@@ -407,7 +407,7 @@
       JavaFile resolvedFile = new JavaFile.relative(packagesDirectory, path);
       if (resolvedFile.exists()) {
         JavaFile canonicalFile = getCanonicalFile(packagesDirectory, pkgName, relPath);
-        UriKind uriKind = _isSelfReference(packagesDirectory, canonicalFile) ? UriKind.PACKAGE_SELF_URI : UriKind.PACKAGE_URI;
+        UriKind uriKind = _isSelfReference(packagesDirectory, canonicalFile) ? UriKind.FILE_URI : UriKind.PACKAGE_URI;
         return new FileBasedSource.con2(canonicalFile, uriKind);
       }
     }
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index 0ba35d3..f89d69f 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -7,6 +7,7 @@
 
 library engine.utilities.collection;
 
+import 'dart:collection';
 import 'java_core.dart';
 import 'scanner.dart' show Token;
 
@@ -94,7 +95,7 @@
    * to a set of tails. Nodes that are not the head of any edge are represented by an entry mapping
    * the node to an empty set of tails.
    */
-  Map<N, Set<N>> _edges = new Map<N, Set<N>>();
+  HashMap<N, HashSet<N>> _edges = new HashMap<N, HashSet<N>>();
 
   /**
    * Add an edge from the given head node to the given tail node. Both nodes will be a part of the
@@ -108,14 +109,14 @@
     // First, ensure that the tail is a node known to the graph.
     //
     if (_edges[tail] == null) {
-      _edges[tail] = new Set<N>();
+      _edges[tail] = new HashSet<N>();
     }
     //
     // Then create the edge.
     //
-    Set<N> tails = _edges[head];
+    HashSet<N> tails = _edges[head];
     if (tails == null) {
-      tails = new Set<N>();
+      tails = new HashSet<N>();
       _edges[head] = tails;
     }
     tails.add(tail);
@@ -127,9 +128,9 @@
    * @param node the node to be added
    */
   void addNode(N node) {
-    Set<N> tails = _edges[node];
+    HashSet<N> tails = _edges[node];
     if (tails == null) {
-      _edges[node] = new Set<N>();
+      _edges[node] = new HashSet<N>();
     }
   }
 
@@ -148,7 +149,7 @@
    * Return true if the graph contains at least one path from `source` to `destination`.
    */
   bool containsPath(N source, N destination) {
-    Set<N> nodesVisited = new Set<N>();
+    HashSet<N> nodesVisited = new HashSet<N>();
     return _containsPathInternal(source, destination, nodesVisited);
   }
 
@@ -187,9 +188,9 @@
    * @return a set containing the tails of edges that have the given node as their head
    */
   Set<N> getTails(N head) {
-    Set<N> tails = _edges[head];
+    HashSet<N> tails = _edges[head];
     if (tails == null) {
-      return new Set<N>();
+      return new HashSet<N>();
     }
     return tails;
   }
@@ -223,7 +224,7 @@
    * @return `true` if the graph was modified as a result of this operation
    */
   void removeEdge(N head, N tail) {
-    Set<N> tails = _edges[head];
+    HashSet<N> tails = _edges[head];
     if (tails != null) {
       tails.remove(tail);
     }
@@ -237,7 +238,7 @@
    */
   void removeNode(N node) {
     _edges.remove(node);
-    for (Set<N> tails in _edges.values) {
+    for (HashSet<N> tails in _edges.values) {
       tails.remove(node);
     }
   }
@@ -260,11 +261,11 @@
     return sink;
   }
 
-  bool _containsPathInternal(N source, N destination, Set<N> nodesVisited) {
+  bool _containsPathInternal(N source, N destination, HashSet<N> nodesVisited) {
     if (identical(source, destination)) {
       return true;
     }
-    Set<N> tails = _edges[source];
+    HashSet<N> tails = _edges[source];
     if (tails != null) {
       nodesVisited.add(source);
       for (N tail in tails) {
@@ -355,7 +356,7 @@
   /**
    * A table mapping nodes to information about the nodes that is used by this algorithm.
    */
-  Map<N, DirectedGraph_NodeInfo<N>> _nodeMap = new Map<N, DirectedGraph_NodeInfo<N>>();
+  HashMap<N, DirectedGraph_NodeInfo<N>> _nodeMap = new HashMap<N, DirectedGraph_NodeInfo<N>>();
 
   /**
    * A list of all strongly connected components found, in topological sort order (each node in a
@@ -432,7 +433,7 @@
     //
     // Consider successors of v
     //
-    Set<N> tails = _graph._edges[v];
+    HashSet<N> tails = _graph._edges[v];
     if (tails != null) {
       for (N w in tails) {
         DirectedGraph_NodeInfo<N> wInfo = _nodeMap[w];
@@ -638,7 +639,7 @@
    * One possibility is a pair of parallel arrays, with keys being sorted by their offset and a
    * cursor indicating where to start searching.
    */
-  Map<Token, Token> _map = new Map<Token, Token>();
+  HashMap<Token, Token> _map = new HashMap<Token, Token>();
 
   /**
    * Return the token that is mapped to the given token, or `null` if there is no token
diff --git a/pkg/analyzer/lib/src/services/formatter_impl.dart b/pkg/analyzer/lib/src/services/formatter_impl.dart
index cfa81c9..588464d 100644
--- a/pkg/analyzer/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer/lib/src/services/formatter_impl.dart
@@ -425,7 +425,6 @@
     token(node.leftParenthesis);
     breakableNonSpace();
     visitCommaSeparatedNodes(node.arguments);
-    breakableNonSpace();
     token(node.rightParenthesis);
   }
 
@@ -808,7 +807,8 @@
     for (var i = 0; i < size; i++) {
       var parameter = parameters[i];
       if (i > 0) {
-        append(', ');
+        append(',');
+        space();
       }
       if (groupEnd == null && parameter is DefaultFormalParameter) {
         if (identical(parameter.kind, ParameterKind.NAMED)) {
@@ -1030,7 +1030,7 @@
 
   visitMapLiteral(MapLiteral node) {
     modifier(node.constKeyword);
-    visitNode(node.typeArguments, followedBy: space);
+    visitNode(node.typeArguments);
     token(node.leftBracket);
     if (!node.entries.isEmpty) {
       newlines();
@@ -1061,7 +1061,7 @@
     if (!node.isGetter) {
       visit(node.parameters);
     }
-    visitPrefixedBody(space, node.body);
+    visitPrefixedBody(nonBreakingSpace, node.body);
   }
 
   visitMethodInvocation(MethodInvocation node) {
@@ -1180,7 +1180,7 @@
   visitSimpleFormalParameter(SimpleFormalParameter node) {
     visitMemberMetadata(node.metadata);
     modifier(node.keyword);
-    visitNode(node.type, followedBy: space);
+    visitNode(node.type, followedBy: nonBreakingSpace);
     visit(node.identifier);
   }
 
@@ -1686,6 +1686,10 @@
   }
 
 
+  /// Test if this EOL [comment] is at the beginning of a line.
+  bool isAtBOL(Token comment) =>
+      lineInfo.getLocation(comment.offset).columnNumber == 1;
+
   /// Test if this [comment] is at the end of a line.
   bool isAtEOL(Token comment) =>
       comment != null && comment.toString().trim().startsWith(twoSlashes) &&
@@ -1701,6 +1705,11 @@
       }
     }
 
+    // Don't indent commented-out lines
+    if (isAtBOL(comment)) {
+      writer.currentLine.clear();
+    }
+
     append(comment.toString().trim());
   }
 
diff --git a/pkg/analyzer/lib/src/services/writer.dart b/pkg/analyzer/lib/src/services/writer.dart
index 4e8cef5..cf0dd74 100644
--- a/pkg/analyzer/lib/src/services/writer.dart
+++ b/pkg/analyzer/lib/src/services/writer.dart
@@ -33,6 +33,10 @@
     tokens.add(token);
   }
 
+  void clear() {
+    tokens.clear();
+  }
+
   bool isEmpty() => tokens.isEmpty;
 
   bool isWhitespace() => tokens.every(
@@ -346,8 +350,18 @@
     }
   }
 
-  void write(x) {
-    _addToken(new LineToken(x));
+  void write(String string) {
+    var lines = string.split(lineSeparator);
+    var length = lines.length;
+    for (int i = 0; i < length; i++) {
+      var line = lines[i];
+      _addToken(new LineToken(line));
+      if (i != length - 1) {
+        newline();
+        // no indentation for multi-line strings
+        currentLine.clear();
+      }
+    }
   }
 
   void writeln(String s) {
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index caa0f1c..1c66e72 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.15.6-dev
+version: 0.16.1
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
@@ -10,4 +10,4 @@
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
 dev_dependencies:
-  unittest: '>=0.9.0 <0.11.0'
+  unittest: '>=0.9.0 <0.12.0'
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index e6c2fc3..3bcb073 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -3269,6 +3269,16 @@
     JUnitTestCase.assertTrue(type.isMoreSpecificThan(DynamicTypeImpl.instance));
   }
 
+  void test_isMoreSpecificThan_generic() {
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElement classB = ElementFactory.classElement2("B", []);
+    DartType dynamicType = DynamicTypeImpl.instance;
+    InterfaceType typeAOfDynamic = classA.type.substitute4(<DartType> [dynamicType]);
+    InterfaceType typeAOfB = classA.type.substitute4(<DartType> [classB.type]);
+    JUnitTestCase.assertFalse(typeAOfDynamic.isMoreSpecificThan(typeAOfB));
+    JUnitTestCase.assertTrue(typeAOfB.isMoreSpecificThan(typeAOfDynamic));
+  }
+
   void test_isMoreSpecificThan_self() {
     InterfaceType type = ElementFactory.classElement2("A", []).type;
     JUnitTestCase.assertTrue(type.isMoreSpecificThan(type));
@@ -3392,6 +3402,16 @@
     JUnitTestCase.assertTrue(classA.type.isSubtypeOf(functionType));
   }
 
+  void test_isSubtypeOf_generic() {
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElement classB = ElementFactory.classElement2("B", []);
+    DartType dynamicType = DynamicTypeImpl.instance;
+    InterfaceType typeAOfDynamic = classA.type.substitute4(<DartType> [dynamicType]);
+    InterfaceType typeAOfB = classA.type.substitute4(<DartType> [classB.type]);
+    JUnitTestCase.assertTrue(typeAOfDynamic.isSubtypeOf(typeAOfB));
+    JUnitTestCase.assertTrue(typeAOfB.isSubtypeOf(typeAOfDynamic));
+  }
+
   void test_isSubtypeOf_interface() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -4100,6 +4120,10 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isMoreSpecificThan_dynamic);
       });
+      _ut.test('test_isMoreSpecificThan_generic', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_generic);
+      });
       _ut.test('test_isMoreSpecificThan_self', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isMoreSpecificThan_self);
@@ -4140,6 +4164,10 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_function);
       });
+      _ut.test('test_isSubtypeOf_generic', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_generic);
+      });
       _ut.test('test_isSubtypeOf_interface', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_interface);
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 7d1c72b..6ad74bc 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -7661,6 +7661,12 @@
     EngineTestCase.assertInstanceOf((obj) => obj is EmptyFunctionBody, EmptyFunctionBody, functionBody);
   }
 
+  void test_parseFunctionBody_skip_block_invalid() {
+    ParserTestCase.parseFunctionBodies = false;
+    FunctionBody functionBody = ParserTestCase.parse3("parseFunctionBody", <Object> [false, null, false], "{", [ParserErrorCode.EXPECTED_TOKEN]);
+    EngineTestCase.assertInstanceOf((obj) => obj is EmptyFunctionBody, EmptyFunctionBody, functionBody);
+  }
+
   void test_parseFunctionBody_skip_blocks() {
     ParserTestCase.parseFunctionBodies = false;
     FunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "{ {} }");
@@ -10995,6 +11001,10 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseFunctionBody_skip_block);
       });
+      _ut.test('test_parseFunctionBody_skip_block_invalid', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseFunctionBody_skip_block_invalid);
+      });
       _ut.test('test_parseFunctionBody_skip_blocks', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseFunctionBody_skip_blocks);
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index b59d1e9..f01c9a2 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -7,6 +7,7 @@
 
 library engine.resolver_test;
 
+import 'dart:collection';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
@@ -179,7 +180,7 @@
     htmlUnit.accessors = <PropertyAccessorElement> [document.getter];
     LibraryElementImpl htmlLibrary = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["dart", "dom", "html"]));
     htmlLibrary.definingCompilationUnit = htmlUnit;
-    Map<Source, LibraryElement> elementMap = new Map<Source, LibraryElement>();
+    HashMap<Source, LibraryElement> elementMap = new HashMap<Source, LibraryElement>();
     elementMap[coreSource] = coreLibrary;
     elementMap[asyncSource] = asyncLibrary;
     elementMap[htmlSource] = htmlLibrary;
@@ -2056,6 +2057,36 @@
     verify([source]);
   }
 
+  void test_instanceMemberAccessFromFactory_named() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {}",
+        "  A();",
+        "  factory A.make() {",
+        "    m();",
+        "    return new A();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY]);
+    verify([source]);
+  }
+
+  void test_instanceMemberAccessFromFactory_unnamed() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {}",
+        "  A._();",
+        "  factory A() {",
+        "    m();",
+        "    return new A._();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY]);
+    verify([source]);
+  }
+
   void test_instanceMemberAccessFromStatic_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -4714,6 +4745,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_initializingFormalForStaticField);
       });
+      _ut.test('test_instanceMemberAccessFromFactory_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_instanceMemberAccessFromFactory_named);
+      });
+      _ut.test('test_instanceMemberAccessFromFactory_unnamed', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_instanceMemberAccessFromFactory_unnamed);
+      });
       _ut.test('test_instanceMemberAccessFromStatic_field', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_instanceMemberAccessFromStatic_field);
@@ -6336,7 +6375,7 @@
       Scope outerScope = _visitor.nameScope_J2DAccessor as Scope;
       try {
         _visitor.enclosingClass_J2DAccessor = enclosingClass;
-        EnclosedScope innerScope = new ClassScope(outerScope, enclosingClass);
+        EnclosedScope innerScope = new ClassScope(new TypeParameterScope(outerScope, enclosingClass), enclosingClass);
         _visitor.nameScope_J2DAccessor = innerScope;
         node.accept(_resolver);
       } finally {
@@ -9204,9 +9243,66 @@
     _assertNoErrors(classA);
   }
 
+  void test_lookupOverrides_noParentClasses() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElementImpl methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    EngineTestCase.assertSizeOfList(0, _inheritanceManager.lookupOverrides(classA, methodName));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupOverrides_overrideBaseClass() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElementImpl methodMinA = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodMinA];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MethodElementImpl methodMinB = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classB.methods = <MethodElement> [methodMinB];
+    List<ExecutableElement> overrides = _inheritanceManager.lookupOverrides(classB, methodName);
+    EngineTestCase.assertEqualsIgnoreOrder(<Object> [methodMinA], new List.from(overrides));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupOverrides_overrideInterface() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElementImpl methodMinA = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodMinA];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    MethodElementImpl methodMinB = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classB.methods = <MethodElement> [methodMinB];
+    List<ExecutableElement> overrides = _inheritanceManager.lookupOverrides(classB, methodName);
+    EngineTestCase.assertEqualsIgnoreOrder(<Object> [methodMinA], new List.from(overrides));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupOverrides_overrideTwoInterfaces() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElementImpl methodMinA = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodMinA];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    MethodElementImpl methodMinB = ElementFactory.methodElement(methodName, _typeProvider.doubleType, []);
+    classB.methods = <MethodElement> [methodMinB];
+    ClassElementImpl classC = ElementFactory.classElement2("C", []);
+    classC.interfaces = <InterfaceType> [classA.type, classB.type];
+    MethodElementImpl methodMinC = ElementFactory.methodElement(methodName, _typeProvider.numType, []);
+    classC.methods = <MethodElement> [methodMinC];
+    List<ExecutableElement> overrides = _inheritanceManager.lookupOverrides(classC, methodName);
+    EngineTestCase.assertEqualsIgnoreOrder(<Object> [methodMinA, methodMinB], new List.from(overrides));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+    _assertNoErrors(classC);
+  }
+
   void _assertErrors(ClassElement classElt, List<ErrorCode> expectedErrorCodes) {
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    Set<AnalysisError> actualErrors = _inheritanceManager.getErrors(classElt);
+    HashSet<AnalysisError> actualErrors = _inheritanceManager.getErrors(classElt);
     if (actualErrors != null) {
       for (AnalysisError error in actualErrors) {
         errorListener.onError(error);
@@ -9452,6 +9548,22 @@
         final __test = new InheritanceManagerTest();
         runJUnitTest(__test, __test.test_lookupMember_setter_static);
       });
+      _ut.test('test_lookupOverrides_noParentClasses', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupOverrides_noParentClasses);
+      });
+      _ut.test('test_lookupOverrides_overrideBaseClass', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupOverrides_overrideBaseClass);
+      });
+      _ut.test('test_lookupOverrides_overrideInterface', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupOverrides_overrideInterface);
+      });
+      _ut.test('test_lookupOverrides_overrideTwoInterfaces', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupOverrides_overrideTwoInterfaces);
+      });
     });
   }
 }
@@ -15961,6 +16073,19 @@
     verify([source]);
   }
 
+  void test_unnecessaryCast_generics() {
+    // dartbug.com/18953
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'dart:async';",
+        "Future<int> f() => new Future.value(0);",
+        "void g(bool c) {",
+        "  (c ? f(): new Future.value(0) as Future<int>).then((int value) {});",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_unnecessaryCast_type_dynamic() {
     Source source = addSource(EngineTestCase.createSource(["m(v) {", "  var b = Object as dynamic;", "}"]));
     resolve(source);
@@ -16259,6 +16384,10 @@
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_unnecessaryCast_dynamic_type);
       });
+      _ut.test('test_unnecessaryCast_generics', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryCast_generics);
+      });
       _ut.test('test_unnecessaryCast_type_dynamic', () {
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_unnecessaryCast_type_dynamic);
@@ -18570,7 +18699,7 @@
     _analyze5(p1);
     _analyze5(p2);
     DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
+    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
     expectedNamedTypes["p1"] = dynamicType;
     expectedNamedTypes["p2"] = dynamicType;
     _assertFunctionType(dynamicType, null, null, expectedNamedTypes, resultType);
@@ -18585,7 +18714,7 @@
     FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
     _analyze5(p);
     DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
+    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
     expectedNamedTypes["p"] = dynamicType;
     _assertFunctionType(_typeProvider.intType, null, null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
@@ -18628,7 +18757,7 @@
     FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
     _analyze5(p2);
     DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
+    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
     expectedNamedTypes["p2"] = dynamicType;
     _assertFunctionType(dynamicType, <DartType> [dynamicType], null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
@@ -18644,7 +18773,7 @@
     FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
     _analyze5(p2);
     DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
+    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
     expectedNamedTypes["p2"] = dynamicType;
     _assertFunctionType(_typeProvider.intType, <DartType> [dynamicType], null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
@@ -21566,58 +21695,6 @@
 }
 
 class StaticWarningCodeTest extends ResolverTestCase {
-  void fail_invalidGetterOverrideReturnType_twoInterfaces_conflicting() {
-    // 17983
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I<U> {",
-        "  U get g => null;",
-        "}",
-        "abstract class J<V> {",
-        "  V get g => null;",
-        "}",
-        "class B implements I<int>, J<String> {",
-        "  double get g => null;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
-    verify([source]);
-  }
-
-  void fail_invalidMethodOverrideNormalParamType_twoInterfaces_conflicting() {
-    // 17983
-    // language/override_inheritance_generic_test/08
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I<U> {",
-        "  m(U u) => null;",
-        "}",
-        "abstract class J<V> {",
-        "  m(V v) => null;",
-        "}",
-        "class B implements I<int>, J<String> {",
-        "  m(double d) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
-    verify([source]);
-  }
-
-  void fail_invalidSetterOverrideNormalParamType_twoInterfaces_conflicting() {
-    // 17983
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I<U> {",
-        "  set s(U u) {}",
-        "}",
-        "abstract class J<V> {",
-        "  set s(V v) {}",
-        "}",
-        "class B implements I<int>, J<String> {",
-        "  set s(double d) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
-    verify([source]);
-  }
-
   void fail_undefinedGetter() {
     Source source = addSource(EngineTestCase.createSource([]));
     resolve(source);
@@ -22862,6 +22939,22 @@
     verify([source]);
   }
 
+  void test_invalidGetterOverrideReturnType_twoInterfaces_conflicting() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class I<U> {",
+        "  U get g => null;",
+        "}",
+        "abstract class J<V> {",
+        "  V get g => null;",
+        "}",
+        "class B implements I<int>, J<String> {",
+        "  double get g => null;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+
   void test_invalidMethodOverrideNamedParamType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -22934,6 +23027,23 @@
     verify([source]);
   }
 
+  void test_invalidMethodOverrideNormalParamType_twoInterfaces_conflicting() {
+    // language/override_inheritance_generic_test/08
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class I<U> {",
+        "  m(U u) => null;",
+        "}",
+        "abstract class J<V> {",
+        "  m(V v) => null;",
+        "}",
+        "class B implements I<int>, J<String> {",
+        "  m(double d) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
   void test_invalidMethodOverrideOptionalParamType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -23215,6 +23325,22 @@
     verify([source]);
   }
 
+  void test_invalidSetterOverrideNormalParamType_twoInterfaces_conflicting() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class I<U> {",
+        "  set s(U u) {}",
+        "}",
+        "abstract class J<V> {",
+        "  set s(V v) {}",
+        "}",
+        "class B implements I<int>, J<String> {",
+        "  set s(double d) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
   void test_listElementTypeNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["var v = <String> [42];"]));
     resolve(source);
@@ -24771,6 +24897,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidGetterOverrideReturnType_twoInterfaces);
       });
+      _ut.test('test_invalidGetterOverrideReturnType_twoInterfaces_conflicting', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidGetterOverrideReturnType_twoInterfaces_conflicting);
+      });
       _ut.test('test_invalidMethodOverrideNamedParamType', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidMethodOverrideNamedParamType);
@@ -24791,6 +24921,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidMethodOverrideNormalParamType_twoInterfaces);
       });
+      _ut.test('test_invalidMethodOverrideNormalParamType_twoInterfaces_conflicting', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidMethodOverrideNormalParamType_twoInterfaces_conflicting);
+      });
       _ut.test('test_invalidMethodOverrideOptionalParamType', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidMethodOverrideOptionalParamType);
@@ -24871,6 +25005,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidSetterOverrideNormalParamType_twoInterfaces);
       });
+      _ut.test('test_invalidSetterOverrideNormalParamType_twoInterfaces_conflicting', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidSetterOverrideNormalParamType_twoInterfaces_conflicting);
+      });
       _ut.test('test_listElementTypeNotAssignable', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_listElementTypeNotAssignable);
@@ -25527,7 +25665,7 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     _definingCompilationUnit.types = <ClassElement> [classA, classB];
-    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
     EngineTestCase.assertSizeOfSet(2, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classA, classB]);
@@ -25547,9 +25685,9 @@
     ClassElementImpl classD = ElementFactory.classElement("D", classB.type, []);
     ClassElementImpl classE = ElementFactory.classElement("E", classB.type, []);
     _definingCompilationUnit.types = <ClassElement> [classA, classB, classC, classD, classE];
-    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
-    Set<ClassElement> subtypesOfB = _subtypeManager.computeAllSubtypes(classB);
+    HashSet<ClassElement> subtypesOfB = _subtypeManager.computeAllSubtypes(classB);
     List<ClassElement> arraySubtypesOfB = new List.from(subtypesOfB);
     EngineTestCase.assertSizeOfSet(4, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classB, classC, classD, classE]);
@@ -25563,7 +25701,7 @@
     //
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     _definingCompilationUnit.types = <ClassElement> [classA];
-    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     EngineTestCase.assertSizeOfSet(0, subtypesOfA);
   }
 
@@ -25575,7 +25713,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     _definingCompilationUnit.types = <ClassElement> [classA, classB];
-    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
     EngineTestCase.assertSizeOfSet(1, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classB]);
@@ -26247,6 +26385,124 @@
     JUnitTestCase.assertEquals("CanvasRenderingContext2D", identifier.propagatedType.name);
   }
 
+  void test_finalPropertyInducingVariable_classMember_instance() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["class A {", "  final v = 0;", "}"]));
+    String code = EngineTestCase.createSource([
+        "import 'lib.dart';",
+        "f(A a) {",
+        "  return a.v; // marker",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // marker", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
+    }
+  }
+
+  void test_finalPropertyInducingVariable_classMember_instance_inherited() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["class A {", "  final v = 0;", "}"]));
+    String code = EngineTestCase.createSource([
+        "import 'lib.dart';",
+        "class B extends A {",
+        "  m() {",
+        "    return v; // marker",
+        "  }",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // marker", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
+    }
+  }
+
+  void test_finalPropertyInducingVariable_classMember_instance_propagatedTarget() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["class A {", "  final v = 0;", "}"]));
+    String code = EngineTestCase.createSource([
+        "import 'lib.dart';",
+        "f(p) {",
+        "  if (p is A) {",
+        "    return p.v; // marker",
+        "  }",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // marker", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
+    }
+  }
+
+  void test_finalPropertyInducingVariable_classMember_static() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["class A {", "  static final V = 0;", "}"]));
+    String code = EngineTestCase.createSource([
+        "import 'lib.dart';",
+        "f() {",
+        "  return A.V; // marker",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "V; // marker", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
+    }
+  }
+
+  void test_finalPropertyInducingVariable_topLevelVaraible_prefixed() {
+    addNamedSource("/lib.dart", "final V = 0;");
+    String code = EngineTestCase.createSource([
+        "import 'lib.dart' as p;",
+        "f() {",
+        "  var v2 = p.V; // prefixed",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "V; // prefixed", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
+    }
+  }
+
+  void test_finalPropertyInducingVariable_topLevelVaraible_simple() {
+    addNamedSource("/lib.dart", "final V = 0;");
+    String code = EngineTestCase.createSource([
+        "import 'lib.dart';",
+        "f() {",
+        "  return V; // simple",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "V; // simple", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
+    }
+  }
+
   void test_forEach() {
     String code = EngineTestCase.createSource([
         "main() {",
@@ -27017,6 +27273,30 @@
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_assignment_null);
       });
+      _ut.test('test_finalPropertyInducingVariable_classMember_instance', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_finalPropertyInducingVariable_classMember_instance);
+      });
+      _ut.test('test_finalPropertyInducingVariable_classMember_instance_inherited', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_finalPropertyInducingVariable_classMember_instance_inherited);
+      });
+      _ut.test('test_finalPropertyInducingVariable_classMember_instance_propagatedTarget', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_finalPropertyInducingVariable_classMember_instance_propagatedTarget);
+      });
+      _ut.test('test_finalPropertyInducingVariable_classMember_static', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_finalPropertyInducingVariable_classMember_static);
+      });
+      _ut.test('test_finalPropertyInducingVariable_topLevelVaraible_prefixed', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_finalPropertyInducingVariable_topLevelVaraible_prefixed);
+      });
+      _ut.test('test_finalPropertyInducingVariable_topLevelVaraible_simple', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_finalPropertyInducingVariable_topLevelVaraible_simple);
+      });
       _ut.test('test_forEach', () {
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_forEach);
@@ -27364,6 +27644,9 @@
 
   void test_visitClassDeclaration() {
     // class A extends B with C implements D {}
+    // class B {}
+    // class C {}
+    // class D {}
     ClassElement elementA = ElementFactory.classElement2("A", []);
     ClassElement elementB = ElementFactory.classElement2("B", []);
     ClassElement elementC = ElementFactory.classElement2("C", []);
@@ -27384,6 +27667,22 @@
     _listener.assertNoErrors();
   }
 
+  void test_visitClassDeclaration_instanceMemberCollidesWithClass() {
+    // class A {}
+    // class B extends A {
+    //   void A() {}
+    // }
+    ClassElementImpl elementA = ElementFactory.classElement2("A", []);
+    ClassElementImpl elementB = ElementFactory.classElement2("B", []);
+    elementB.methods = <MethodElement> [ElementFactory.methodElement("A", VoidTypeImpl.instance, [])];
+    ExtendsClause extendsClause = AstFactory.extendsClause(AstFactory.typeName(elementA, []));
+    ClassDeclaration declaration = AstFactory.classDeclaration(null, "B", null, extendsClause, null, null, []);
+    declaration.name.staticElement = elementB;
+    _resolveNode(declaration, [elementA, elementB]);
+    JUnitTestCase.assertSame(elementA.type, elementB.supertype);
+    _listener.assertNoErrors();
+  }
+
   void test_visitClassTypeAlias() {
     // class A = B with C implements D;
     ClassElement elementA = ElementFactory.classElement2("A", []);
@@ -27579,6 +27878,10 @@
         final __test = new TypeResolverVisitorTest();
         runJUnitTest(__test, __test.test_visitClassDeclaration);
       });
+      _ut.test('test_visitClassDeclaration_instanceMemberCollidesWithClass', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitClassDeclaration_instanceMemberCollidesWithClass);
+      });
       _ut.test('test_visitClassTypeAlias', () {
         final __test = new TypeResolverVisitorTest();
         runJUnitTest(__test, __test.test_visitClassTypeAlias);
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 575fcac..fabe810 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -1287,7 +1287,23 @@
   }
 
   void test_string_multi_unterminated() {
-    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string");
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string", [new StringToken(TokenType.STRING, "'''string", 0)]);
+  }
+
+  void test_string_multi_unterminated_interpolation_block() {
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''\${name", [
+        new StringToken(TokenType.STRING, "'''", 0),
+        new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 3),
+        new StringToken(TokenType.IDENTIFIER, "name", 5),
+        new StringToken(TokenType.STRING, "", 9)]);
+  }
+
+  void test_string_multi_unterminated_interpolation_identifier() {
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "'''\$name", [
+        new StringToken(TokenType.STRING, "'''", 0),
+        new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3),
+        new StringToken(TokenType.IDENTIFIER, "name", 4),
+        new StringToken(TokenType.STRING, "", 8)]);
   }
 
   void test_string_raw_multi_double() {
@@ -1299,7 +1315,8 @@
   }
 
   void test_string_raw_multi_unterminated() {
-    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "r'''string");
+    String source = "r'''string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, source, [new StringToken(TokenType.STRING, source, 0)]);
   }
 
   void test_string_raw_simple_double() {
@@ -1311,11 +1328,13 @@
   }
 
   void test_string_raw_simple_unterminated_eof() {
-    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "r'string");
+    String source = "r'string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, source, [new StringToken(TokenType.STRING, source, 0)]);
   }
 
   void test_string_raw_simple_unterminated_eol() {
-    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "r'string\n");
+    String source = "r'string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "${source}\n", [new StringToken(TokenType.STRING, source, 0)]);
   }
 
   void test_string_simple_double() {
@@ -1403,11 +1422,29 @@
   }
 
   void test_string_simple_unterminated_eof() {
-    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, "'string");
+    String source = "'string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, source, [new StringToken(TokenType.STRING, source, 0)]);
   }
 
   void test_string_simple_unterminated_eol() {
-    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "'string\r");
+    String source = "'string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "${source}\r", [new StringToken(TokenType.STRING, source, 0)]);
+  }
+
+  void test_string_simple_unterminated_interpolation_block() {
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, "'\${name", [
+        new StringToken(TokenType.STRING, "'", 0),
+        new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 1),
+        new StringToken(TokenType.IDENTIFIER, "name", 3),
+        new StringToken(TokenType.STRING, "", 7)]);
+  }
+
+  void test_string_simple_unterminated_interpolation_identifier() {
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 5, "'\$name", [
+        new StringToken(TokenType.STRING, "'", 0),
+        new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
+        new StringToken(TokenType.IDENTIFIER, "name", 2),
+        new StringToken(TokenType.STRING, "", 6)]);
   }
 
   void test_tilde() {
@@ -1457,8 +1494,8 @@
   /**
    * Assert that scanning the given source produces an error with the given code.
    *
-   * @param illegalCharacter
-   * @param i
+   * @param expectedError the error that should be produced
+   * @param expectedOffset the string offset that should be associated with the error
    * @param source the source to be scanned to produce the error
    */
   void _assertError(ScannerErrorCode expectedError, int expectedOffset, String source) {
@@ -2180,6 +2217,14 @@
         final __test = new ScannerTest();
         runJUnitTest(__test, __test.test_string_multi_unterminated);
       });
+      _ut.test('test_string_multi_unterminated_interpolation_block', () {
+        final __test = new ScannerTest();
+        runJUnitTest(__test, __test.test_string_multi_unterminated_interpolation_block);
+      });
+      _ut.test('test_string_multi_unterminated_interpolation_identifier', () {
+        final __test = new ScannerTest();
+        runJUnitTest(__test, __test.test_string_multi_unterminated_interpolation_identifier);
+      });
       _ut.test('test_string_raw_multi_double', () {
         final __test = new ScannerTest();
         runJUnitTest(__test, __test.test_string_raw_multi_double);
@@ -2256,6 +2301,14 @@
         final __test = new ScannerTest();
         runJUnitTest(__test, __test.test_string_simple_unterminated_eol);
       });
+      _ut.test('test_string_simple_unterminated_interpolation_block', () {
+        final __test = new ScannerTest();
+        runJUnitTest(__test, __test.test_string_simple_unterminated_interpolation_block);
+      });
+      _ut.test('test_string_simple_unterminated_interpolation_identifier', () {
+        final __test = new ScannerTest();
+        runJUnitTest(__test, __test.test_string_simple_unterminated_interpolation_identifier);
+      });
       _ut.test('test_tilde', () {
         final __test = new ScannerTest();
         runJUnitTest(__test, __test.test_tilde);
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index fe7f86b..382b42f 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -7,6 +7,7 @@
 
 library engine.test_support;
 
+import 'dart:collection';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
@@ -453,7 +454,7 @@
   /**
    * A table mapping sources to the line information for the source.
    */
-  Map<Source, LineInfo> _lineInfoMap = new Map<Source, LineInfo>();
+  HashMap<Source, LineInfo> _lineInfoMap = new HashMap<Source, LineInfo>();
 
   /**
    * An empty array of errors used when no errors are expected.
@@ -536,7 +537,7 @@
     //
     // Compute the expected number of each type of error.
     //
-    Map<ErrorCode, int> expectedCounts = new Map<ErrorCode, int>();
+    HashMap<ErrorCode, int> expectedCounts = new HashMap<ErrorCode, int>();
     for (ErrorCode code in expectedErrorCodes) {
       int count = expectedCounts[code];
       if (count == null) {
@@ -549,7 +550,7 @@
     //
     // Compute the actual number of each type of error.
     //
-    Map<ErrorCode, List<AnalysisError>> errorsByCode = new Map<ErrorCode, List<AnalysisError>>();
+    HashMap<ErrorCode, List<AnalysisError>> errorsByCode = new HashMap<ErrorCode, List<AnalysisError>>();
     for (AnalysisError error in _errors) {
       ErrorCode code = error.errorCode;
       List<AnalysisError> list = errorsByCode[code];
diff --git a/pkg/analyzer/test/services/data/cu_tests.data b/pkg/analyzer/test/services/data/cu_tests.data
index d6186df..06dddef 100644
--- a/pkg/analyzer/test/services/data/cu_tests.data
+++ b/pkg/analyzer/test/services/data/cu_tests.data
@@ -274,4 +274,36 @@
 >>>
 import 'a.dart' deferred as a;
 <<<
-import 'a.dart' deferred as a;
\ No newline at end of file
+import 'a.dart' deferred as a;
+>>> Long parameters list, place the opening curly brace ({) on the same line
+class Foo {
+  method(int a012345678901234567890123456789, int b012345678901234567890123456)
+  {
+    print('42');
+  }
+}
+<<<
+class Foo {
+  method(int a012345678901234567890123456789,
+      int b012345678901234567890123456) {
+    print('42');
+  }
+}
+>>> Long parameters list, this.field
+class A {
+  int a0123456789012345678901234;
+  int b0123456789012345678901234;
+  int c0123456789012345678901234;
+  int d0123456789012345678901234;
+  A(this.a0123456789012345678901234, this.b0123456789012345678901234, this.c0123456789012345678901234,
+                    this.d0123456789012345678901234);
+}
+<<<
+class A {
+  int a0123456789012345678901234;
+  int b0123456789012345678901234;
+  int c0123456789012345678901234;
+  int d0123456789012345678901234;
+  A(this.a0123456789012345678901234, this.b0123456789012345678901234,
+      this.c0123456789012345678901234, this.d0123456789012345678901234);
+}
diff --git a/pkg/analyzer/test/services/data/stmt_tests.data b/pkg/analyzer/test/services/data/stmt_tests.data
index 006ca41..3143fe1 100644
--- a/pkg/analyzer/test/services/data/stmt_tests.data
+++ b/pkg/analyzer/test/services/data/stmt_tests.data
@@ -190,4 +190,15 @@
     zero = 2;
   }
   print(0);
-}
\ No newline at end of file
+}
+>>>
+main() {
+  f(a, b) {}
+  f(0000000000000000000000000000000000000000000000000000000000000000000000, 111);
+}
+<<<
+main() {
+  f(a, b) {}
+  f(0000000000000000000000000000000000000000000000000000000000000000000000,
+      111);
+}
diff --git a/pkg/analyzer/test/services/data/style_guide_tests.data b/pkg/analyzer/test/services/data/style_guide_tests.data
index 781516d..d059c38 100644
--- a/pkg/analyzer/test/services/data/style_guide_tests.data
+++ b/pkg/analyzer/test/services/data/style_guide_tests.data
@@ -153,10 +153,12 @@
 >>> DON'T use a space after (, [, and {, or before ), ], and }.
 spaces() {
   var numbers = <int> [ 1, 2,( 3+4 ) ];
+  var mapLiteral = <int, int> {};
 }
 <<<
 spaces() {
   var numbers = <int>[1, 2, (3 + 4)];
+  var mapLiteral = <int, int>{};
 }
 >>> DO use a space before { in function and method bodies.
 getEmptyFn(a){
diff --git a/pkg/analyzer/test/services/formatter_test.dart b/pkg/analyzer/test/services/formatter_test.dart
index 85e68aa..5298d73 100644
--- a/pkg/analyzer/test/services/formatter_test.dart
+++ b/pkg/analyzer/test/services/formatter_test.dart
@@ -184,6 +184,30 @@
           'class C {\n'
           '}\n'
       );
+      expectCUFormatsTo(
+          'main() {\n'
+          '//  print(1);\n'
+          '//  print(2);\n'
+          '  print(3);\n'
+          '}\n',
+          'main() {\n'
+          '//  print(1);\n'
+          '//  print(2);\n'
+          '  print(3);\n'
+          '}\n'
+      );
+      expectCUFormatsTo(
+          'class A {\n'
+          '//  int a;\n'
+          '//  int b;\n'
+          '  int c;\n'
+          '}\n',
+          'class A {\n'
+          '//  int a;\n'
+          '//  int b;\n'
+          '  int c;\n'
+          '}\n'
+      );
     });
 
     test('CU - nested functions', () {
@@ -976,6 +1000,51 @@
                           transforms: false);
     });
 
+    test('String - multiline - short - same line', () {
+      expectCUFormatsTo(
+        'main() {\n'
+        '  print("""01234567890123456789012345678901234567890123456789""");\n'
+        '}\n',
+        'main() {\n'
+        '  print("""01234567890123456789012345678901234567890123456789""");\n'
+        '}\n'
+      );
+    });
+
+    test('String - multiline - short - next line', () {
+      expectCUFormatsTo(
+        'main() {\n'
+        '  print("""\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '""");\n'
+        '}\n',
+        'main() {\n'
+        '  print("""\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '""");\n'
+        '}\n'
+      );
+    });
+
+    test('String - multiline - long', () {
+      expectCUFormatsTo(
+        'main() {\n'
+        '  print("""\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '""");\n'
+        '}\n',
+        'main() {\n'
+        '  print("""\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '""");\n'
+        '}\n'
+      );
+    });
+
     // smoketest to ensure we're enforcing the 'no gratuitous linebreaks'
     // opinion
     test('CU (eat newlines)', () {
@@ -1242,6 +1311,15 @@
       expect(writer.toString(), equals('foo\n  bar\nbaz'));
     });
 
+    test('write - multiline', () {
+      var writer = new SourceWriter();
+      writer.indent();
+      writer.newline();
+      writer.write('aaa\nbbb\nccc');
+      expect(writer.toString(), equals('\n  aaa\nbbb\nccc'));
+      expect(writer.currentLine.toString(), equals('ccc'));
+    });
+
   });
 
 
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index 53666e3..048b3d0 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.1-dev
+version: 0.14.1+1
 
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
diff --git a/pkg/dart2js_incremental/lib/caching_compiler.dart b/pkg/dart2js_incremental/lib/caching_compiler.dart
new file mode 100644
index 0000000..181f405
--- /dev/null
+++ b/pkg/dart2js_incremental/lib/caching_compiler.dart
@@ -0,0 +1,146 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart2js_incremental;
+
+/// Do not call this method directly. It will be made private.
+// TODO(ahe): Make this method private.
+Compiler reuseCompiler(
+    {DiagnosticHandler diagnosticHandler,
+     CompilerInputProvider inputProvider,
+     CompilerOutputProvider outputProvider,
+     List<String> options: const [],
+     Compiler cachedCompiler,
+     Uri libraryRoot,
+     Uri packageRoot,
+     bool packagesAreImmutable: false,
+     Map<String, dynamic> environment}) {
+  UserTag oldTag = new UserTag('_reuseCompiler').makeCurrent();
+  if (libraryRoot == null) {
+    throw 'Missing libraryRoot';
+  }
+  if (inputProvider == null) {
+    throw 'Missing inputProvider';
+  }
+  if (diagnosticHandler == null) {
+    throw 'Missing diagnosticHandler';
+  }
+  if (outputProvider == null) {
+    outputProvider = NullSink.outputProvider;
+  }
+  if (environment == null) {
+    environment = {};
+  }
+  Compiler compiler = cachedCompiler;
+  if (compiler == null ||
+      compiler.libraryRoot != libraryRoot ||
+      !compiler.hasIncrementalSupport ||
+      compiler.hasCrashed ||
+      compiler.compilerWasCancelled ||
+      compiler.enqueuer.resolution.hasEnqueuedEverything ||
+      compiler.deferredLoadTask.splitProgram) {
+    if (compiler != null && compiler.hasIncrementalSupport) {
+      print('***FLUSH***');
+      if (compiler.hasCrashed) {
+        print('Unable to reuse compiler due to crash.');
+      } else if (compiler.compilerWasCancelled) {
+        print('Unable to reuse compiler due to cancel.');
+      } else if (compiler.enqueuer.resolution.hasEnqueuedEverything) {
+        print('Unable to reuse compiler due to dart:mirrors.');
+      } else if (compiler.deferredLoadTask.splitProgram) {
+        print('Unable to reuse compiler due to deferred loading.');
+      } else {
+        print('Unable to reuse compiler.');
+      }
+    }
+    compiler = new Compiler(
+        inputProvider,
+        outputProvider,
+        diagnosticHandler,
+        libraryRoot,
+        packageRoot,
+        options,
+        environment);
+  } else {
+    compiler
+        ..outputProvider = outputProvider
+        ..provider = inputProvider
+        ..handler = diagnosticHandler
+        ..enqueuer.resolution.queueIsClosed = false
+        ..enqueuer.resolution.hasEnqueuedEverything = false
+        ..enqueuer.resolution.hasEnqueuedReflectiveStaticFields = false
+        ..enqueuer.codegen.queueIsClosed = false
+        ..enqueuer.codegen.hasEnqueuedEverything = false
+        ..enqueuer.codegen.hasEnqueuedReflectiveStaticFields = false
+        ..assembledCode = null
+        ..compilationFailed = false;
+    JavaScriptBackend backend = compiler.backend;
+
+    backend.emitter.cachedElements.addAll(backend.generatedCode.keys);
+
+    compiler.enqueuer.codegen.newlyEnqueuedElements.clear();
+
+    backend.emitter.containerBuilder
+        ..staticGetters.clear()
+        ..methodClosures.clear();
+
+    backend.emitter.nsmEmitter
+        ..trivialNsmHandlers.clear();
+
+    backend.emitter.typeTestEmitter
+        ..checkedClasses = null
+        ..checkedFunctionTypes = null
+        ..checkedGenericFunctionTypes.clear()
+        ..checkedNonGenericFunctionTypes.clear()
+        ..rtiNeededClasses.clear()
+        ..cachedClassesUsingTypeVariableTests = null;
+
+    backend.emitter.interceptorEmitter
+        ..interceptorInvocationNames.clear();
+
+    backend.emitter.metadataEmitter
+        ..globalMetadata.clear()
+        ..globalMetadataMap.clear();
+
+    backend.emitter.nativeEmitter
+        ..nativeBuffer.clear()
+        ..nativeClasses.clear()
+        ..nativeMethods.clear();
+
+    backend.emitter
+        ..outputBuffers.clear()
+        ..deferredConstants.clear()
+        ..isolateProperties = null
+        ..classesCollector = null
+        ..neededClasses.clear()
+        ..outputClassLists.clear()
+        ..nativeClasses.clear()
+        ..mangledFieldNames.clear()
+        ..mangledGlobalFieldNames.clear()
+        ..recordedMangledNames.clear()
+        ..additionalProperties.clear()
+        ..readTypeVariables.clear()
+        ..instantiatedClasses = null
+        ..precompiledFunction.clear()
+        ..precompiledConstructorNames.clear()
+        ..hasMakeConstantList = false
+        ..elementDescriptors.clear();
+
+    backend
+        ..preMirrorsMethodCount = 0;
+
+    Map libraries = new Map.from(compiler.libraries);
+    compiler.libraries.clear();
+    compiler.libraryLoader.reset();
+    libraries.forEach((String uri, LibraryElement library) {
+      if (library.isPlatformLibrary ||
+          (packagesAreImmutable && library.isPackageLibrary)) {
+        compiler.libraries[uri] = library;
+        compiler.libraryLoader.reuseLibrary(library);
+      }
+    });
+  }
+  oldTag.makeCurrent();
+  return compiler;
+}
diff --git a/pkg/dart2js_incremental/lib/dart2js_incremental.dart b/pkg/dart2js_incremental/lib/dart2js_incremental.dart
new file mode 100644
index 0000000..6e49c02
--- /dev/null
+++ b/pkg/dart2js_incremental/lib/dart2js_incremental.dart
@@ -0,0 +1,83 @@
+// 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_incremental;
+
+import 'dart:async' show
+    Future;
+
+import 'dart:profiler' show
+    UserTag;
+
+import 'package:compiler/implementation/apiimpl.dart' show
+    Compiler;
+
+import 'package:compiler/compiler.dart' show
+    CompilerInputProvider,
+    CompilerOutputProvider,
+    Diagnostic,
+    DiagnosticHandler;
+
+import 'package:compiler/implementation/dart2jslib.dart' show
+    NullSink;
+
+import 'package:compiler/implementation/js_backend/js_backend.dart' show
+    JavaScriptBackend;
+
+import 'package:compiler/implementation/elements/elements.dart' show
+    LibraryElement;
+
+part 'caching_compiler.dart';
+
+const List<String> INCREMENTAL_OPTIONS = const <String>[
+    '--disable-type-inference',
+    '--incremental-support',
+    '--no-source-maps', // TODO(ahe): Remove this.
+];
+
+class IncrementalCompiler {
+  final Uri libraryRoot;
+  final Uri packageRoot;
+  final CompilerInputProvider inputProvider;
+  final DiagnosticHandler diagnosticHandler;
+  final List<String> options;
+  final CompilerOutputProvider outputProvider;
+  final Map<String, dynamic> environment;
+
+  Compiler _compiler;
+
+  IncrementalCompiler({
+      this.libraryRoot,
+      this.packageRoot,
+      this.inputProvider,
+      this.diagnosticHandler,
+      this.options,
+      this.outputProvider,
+      this.environment}) {
+    if (libraryRoot == null) {
+      throw new ArgumentError('libraryRoot is null.');
+    }
+    if (inputProvider == null) {
+      throw new ArgumentError('inputProvider is null.');
+    }
+    if (diagnosticHandler == null) {
+      throw new ArgumentError('diagnosticHandler is null.');
+    }
+  }
+
+  Future<bool> compile(Uri script) {
+    List<String> options = new List<String>.from(this.options);
+    options.addAll(INCREMENTAL_OPTIONS);
+    _compiler = reuseCompiler(
+        cachedCompiler: _compiler,
+        libraryRoot: libraryRoot,
+        packageRoot: packageRoot,
+        inputProvider: inputProvider,
+        diagnosticHandler: diagnosticHandler,
+        options: options,
+        outputProvider: outputProvider,
+        environment: environment);
+    return _compiler.run(script);
+  }
+}
diff --git a/pkg/docgen/lib/src/exports/dart2js_mirrors.dart b/pkg/docgen/lib/src/exports/dart2js_mirrors.dart
index 894dd51..a380c38 100644
--- a/pkg/docgen/lib/src/exports/dart2js_mirrors.dart
+++ b/pkg/docgen/lib/src/exports/dart2js_mirrors.dart
@@ -4,4 +4,4 @@
 
 library docgen.exports.dart2js_mirrors;
 
-export '../../../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart';
+export 'package:compiler/implementation/mirrors/dart2js_mirrors.dart';
diff --git a/pkg/docgen/lib/src/exports/mirrors_util.dart b/pkg/docgen/lib/src/exports/mirrors_util.dart
index 2479fbe..1bee22c 100644
--- a/pkg/docgen/lib/src/exports/mirrors_util.dart
+++ b/pkg/docgen/lib/src/exports/mirrors_util.dart
@@ -4,4 +4,4 @@
 
 library docgen.exports.mirrors_util;
 
-export '../../../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
+export 'package:compiler/implementation/mirrors/mirrors_util.dart';
diff --git a/pkg/docgen/lib/src/exports/source_mirrors.dart b/pkg/docgen/lib/src/exports/source_mirrors.dart
index 7c2ee9c..f15ef06 100644
--- a/pkg/docgen/lib/src/exports/source_mirrors.dart
+++ b/pkg/docgen/lib/src/exports/source_mirrors.dart
@@ -4,5 +4,5 @@
 
 library docgen.exports.source_mirrors;
 
-export '../../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart'
+export 'package:compiler/implementation/mirrors/source_mirrors.dart'
     hide SourceLocation;
diff --git a/pkg/docgen/lib/src/generator.dart b/pkg/docgen/lib/src/generator.dart
index 06a991e..42c2e3b 100644
--- a/pkg/docgen/lib/src/generator.dart
+++ b/pkg/docgen/lib/src/generator.dart
@@ -12,11 +12,11 @@
 import 'package:markdown/markdown.dart' as markdown;
 import 'package:path/path.dart' as path;
 
-import '../../../../sdk/lib/_internal/compiler/compiler.dart' as api;
-import '../../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
-import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart'
+import 'package:compiler/compiler.dart' as api;
+import 'package:compiler/implementation/filenames.dart';
+import 'package:compiler/implementation/mirrors/analyze.dart'
     as dart2js;
-import '../../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
+import 'package:compiler/implementation/source_file_provider.dart';
 
 import 'exports/dart2js_mirrors.dart' as dart2js_mirrors;
 import 'exports/libraries.dart';
diff --git a/pkg/docgen/lib/src/models/annotation.dart b/pkg/docgen/lib/src/models/annotation.dart
index f7a537c..18b0924 100644
--- a/pkg/docgen/lib/src/models/annotation.dart
+++ b/pkg/docgen/lib/src/models/annotation.dart
@@ -14,7 +14,7 @@
 import 'mirror_based.dart';
 
 import 'dart:mirrors';
-import '../../../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import 'package:compiler/implementation/tree/tree.dart';
 
 /// Holds the name of the annotation, and its parameters.
 class Annotation extends MirrorBased<ClassMirror> {
diff --git a/pkg/docgen/lib/src/models/variable.dart b/pkg/docgen/lib/src/models/variable.dart
index 2d8b02a..b4b83ac 100644
--- a/pkg/docgen/lib/src/models/variable.dart
+++ b/pkg/docgen/lib/src/models/variable.dart
@@ -24,7 +24,7 @@
   final String name;
 
   factory Variable(String name, VariableMirror mirror, Indexable owner) {
-    var variable = getDocgenObject(mirror);
+    var variable = getDocgenObject(mirror, owner);
     if (variable is DummyMirror) {
       return new Variable._(name, mirror, owner);
     }
diff --git a/pkg/http/CHANGELOG.md b/pkg/http/CHANGELOG.md
index 8d6e3c8..98deb33 100644
--- a/pkg/http/CHANGELOG.md
+++ b/pkg/http/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.11.1+2
+
+* Widen the version constraint on `unittest`.
+
 ## 0.11.1+1
 
 * Widen the version constraint for `stack_trace`.
diff --git a/pkg/http/pubspec.yaml b/pkg/http/pubspec.yaml
index abb241d..5c9a754 100644
--- a/pkg/http/pubspec.yaml
+++ b/pkg/http/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http
-version: 0.11.1+1
+version: 0.11.1+2
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://pub.dartlang.org/packages/http
 description: A composable, Future-based API for making HTTP requests.
@@ -8,6 +8,6 @@
   path: ">=0.9.0 <2.0.0"
   stack_trace: ">=0.9.1 <2.0.0"
 dev_dependencies:
-  unittest: ">=0.9.0 <0.11.0"
+  unittest: ">=0.9.0 <0.12.0"
 environment:
   sdk: ">=1.1.0 <2.0.0"
diff --git a/pkg/http/test/html/streamed_request_test.dart b/pkg/http/test/html/streamed_request_test.dart
index e75d130..907bcaf 100644
--- a/pkg/http/test/html/streamed_request_test.dart
+++ b/pkg/http/test/html/streamed_request_test.dart
@@ -4,8 +4,6 @@
 
 library http.test.html.streamed_request_test;
 
-import 'dart:convert';
-
 import 'package:http/http.dart' as http;
 import 'package:http/browser_client.dart';
 import 'package:unittest/unittest.dart';
@@ -37,4 +35,4 @@
       });
     });
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/http/test/html/utils.dart b/pkg/http/test/html/utils.dart
index 5803ec2..243278e 100644
--- a/pkg/http/test/html/utils.dart
+++ b/pkg/http/test/html/utils.dart
@@ -4,14 +4,8 @@
 
 library http.test.html_utils;
 
-import 'dart:async';
-import 'dart:convert';
 import 'dart:html';
 
-import 'package:http/http.dart';
-import 'package:http/src/utils.dart';
-import 'package:unittest/unittest.dart';
-
 export '../utils.dart';
 
 /// The test server's echo URL.
diff --git a/pkg/http/test/io/streamed_request_test.dart b/pkg/http/test/io/streamed_request_test.dart
index ef823f9..176d66f 100644
--- a/pkg/http/test/io/streamed_request_test.dart
+++ b/pkg/http/test/io/streamed_request_test.dart
@@ -55,4 +55,4 @@
     }).whenComplete(stopServer);
   });
 
-}
\ No newline at end of file
+}
diff --git a/pkg/http/test/streamed_request_test.dart b/pkg/http/test/streamed_request_test.dart
index afe8e09..444b36b 100644
--- a/pkg/http/test/streamed_request_test.dart
+++ b/pkg/http/test/streamed_request_test.dart
@@ -4,8 +4,6 @@
 
 library streamed_request_test;
 
-import 'dart:convert';
-
 import 'package:http/http.dart' as http;
 import 'package:unittest/unittest.dart';
 
@@ -29,4 +27,4 @@
       expect(() => request.contentLength = 10, throwsStateError);
     });
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/http_base/CHANGELOG.md b/pkg/http_base/CHANGELOG.md
index 64312a4..e39f08d 100644
--- a/pkg/http_base/CHANGELOG.md
+++ b/pkg/http_base/CHANGELOG.md
@@ -1,2 +1,13 @@
+# 0.0.2
+
+* Renamed `Response.status` to `Response.statusCode`.
+
+* Renamed `Client` to `RequestHandler`.
+
+* Removed `HttpRequestHandler`.
+
+* Standardized doc comments.
+
 # 0.0.1
 
+* Initial release
diff --git a/pkg/http_base/lib/http_base.dart b/pkg/http_base/lib/http_base.dart
index d05812e..55f6014 100644
--- a/pkg/http_base/lib/http_base.dart
+++ b/pkg/http_base/lib/http_base.dart
@@ -6,121 +6,72 @@
 
 import 'dart:async';
 
-/**
- * Representation of a set of HTTP headers.
- */
+/// Representation of a set of HTTP headers.
 abstract class Headers {
-  /**
-   * Returns the names of all header fields.
-   */
+  /// Returns the names of all header fields.
   Iterable<String> get names;
 
-  /**
-   * Returns `true` if a header field of the specified [name] exist.
-   */
+  /// Returns `true` if a header field of the specified [name] exist.
   bool contains(String name);
 
-  /**
-   * Returns the value for the header field named [name].
-   *
-   * The HTTP standard supports multiple values for each header field name.
-   * Header fields with multiple values can be represented as a
-   * comma-separated list. If a header has multiple values the returned string
-   * is the comma-separated list of all these values.
-   *
-   * For header field-names which do not allow combining multiple values with
-   * comma, this index operator will throw `IllegalArgument`.
-   * This is currently the case for the 'Cookie' and 'Set-Cookie' headers. Use
-   * `getMultiple` method to iterate over the header values for these.
-   */
+  /// Returns the value for the header field named [name].
+  ///
+  /// The HTTP standard supports multiple values for each header field name.
+  /// Header fields with multiple values can be represented as a
+  /// comma-separated list. If a header has multiple values the returned string
+  /// is the comma-separated list of all these values.
+  ///
+  /// For header field-names which do not allow combining multiple values with
+  /// comma, this index operator will throw `IllegalArgument`.
+  /// This is currently the case for the 'Cookie' and 'Set-Cookie' headers. Use
+  /// `getMultiple` method to iterate over the header values for these.
   String operator [](String name);
 
-  /**
-   * Returns the values for the header field named [name].
-   *
-   * The order in which the values for the field name appear is the same
-   * as the order in which they are to be send or was received.
-   */
+  /// Returns the values for the header field named [name].
+  ///
+  /// The order in which the values for the field name appear is the same
+  /// as the order in which they are to be send or was received.
   Iterable<String> getMultiple(String name);
 }
 
-
-/**
- * Representation of a HTTP request.
- */
+/// Representation of a HTTP request.
 abstract class Request {
-  /**
-   * Request method.
-   */
+  /// Request method.
   String get method;
 
-  /**
-   * Request url.
-   */
+  /// Request url.
   Uri get url;
 
-  /**
-   * Request headers.
-   */
+  /// Request headers.
   Headers get headers;
 
-  /**
-   * Request body.
-   */
+  /// Request body.
   Stream<List<int>> read();
 }
 
-
-/**
- * Representation of a HTTP response.
- */
+/// Representation of a HTTP response.
 abstract class Response {
-  /**
-   * Response status code.
-   */
-  int get status;
+  /// Response status code.
+  int get statusCode;
 
-  /**
-   * Response headers.
-   */
+  /// Response headers.
   Headers get headers;
 
-  /**
-   * Response body.
-   */
+  /// Response body.
   Stream<List<int>> read();
 }
 
-
-
-/**
- * Function for performing a HTTP request.
- *
- * The [Client] may use any transport mechanism it wants
- * (e.g. HTTP/1.1, HTTP/2.0, SPDY) to perform the HTTP request.
- *
- * [Client]s are composable. E.g. A [Client] may add an 'Authorization'
- * header to [request] and forward to another [Client].
- *
- * A [Client] may ignore connection specific headers in [request] and may
- * not present them in the [Response] object.
- *
- * Connection specific headers:
- *    'Connection', 'Upgrade', 'Keep-Alive', 'Transfer-Encoding'
- */
-typedef Future<Response> Client(Request request);
-
-/**
- * Function for handling a HTTP request.
- *
- * The [RequestHandler] should not react on any connection specific headers
- * in [request] and connection specific headers in it's [Response] may be
- * ignored by a HTTP Server.
- *
- * [RequestHandler]s are composable. E.g. A [RequestHandler] may call another
- * [RequestHandler] and augment the headers with e.g. a 'Set-Cookie' header.
- *
- * Connection specific headers:
- *    'Connection', 'Upgrade', 'Keep-Alive', 'Transfer-Encoding'
- */
-typedef Future<Response> HttpRequestHandler(Request request);
+/// Function for performing an HTTP request.
+///
+/// The [RequestHandler] may use any transport mechanism it wants
+/// (e.g. HTTP/1.1, HTTP/2.0, SPDY) to perform the HTTP request.
+///
+/// [RequestHandler]s are composable. E.g. A [RequestHandler] may add an
+/// 'Authorization' header to [request] and forward to another [RequestHandler].
+///
+/// A [RequestHandler] may ignore connection specific headers in [request] and
+/// may not present them in the [Response] object.
+///
+/// Connection specific headers:
+///    'Connection', 'Upgrade', 'Keep-Alive', 'Transfer-Encoding'
+typedef Future<Response> RequestHandler(Request request);
diff --git a/pkg/http_base/pubspec.yaml b/pkg/http_base/pubspec.yaml
index d9f115a..00e1c31 100644
--- a/pkg/http_base/pubspec.yaml
+++ b/pkg/http_base/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http_base
-version: 0.0.1
+version: 0.0.2-dev
 author: Dart Team <misc@dartlang.org>
 homepage: http://www.dartlang.org
 description: >
@@ -7,4 +7,3 @@
   objects, HTTP clients and HTTP request handlers.
 environment:
   sdk: '>=1.0.0 <2.0.0'
-
diff --git a/pkg/intl/lib/intl.dart b/pkg/intl/lib/intl.dart
index ba2e83a..a7213d0 100644
--- a/pkg/intl/lib/intl.dart
+++ b/pkg/intl/lib/intl.dart
@@ -29,7 +29,6 @@
 import 'src/date_format_internal.dart';
 import "number_symbols.dart";
 import "number_symbols_data.dart";
-import "src/temporary_debugging.dart";
 
 part 'date_format.dart';
 part 'src/date_format_field.dart';
diff --git a/pkg/intl/lib/src/date_format_helpers.dart b/pkg/intl/lib/src/date_format_helpers.dart
index d8adde1..e59a63e 100644
--- a/pkg/intl/lib/src/date_format_helpers.dart
+++ b/pkg/intl/lib/src/date_format_helpers.dart
@@ -36,22 +36,9 @@
    * Return a date built using our values. If no date portion is set,
    * use the "Epoch" of January 1, 1970.
    */
-  DateTime asDate() {
+  DateTime asDate({retry: true}) {
     // TODO(alanknight): Validate the date, especially for things which
     // can crash the VM, e.g. large month values.
-    if (debugLogDateCreation) {
-      debugDateCreationLog
-        ..write("  Creating Date from\n")
-        ..write("    UTC: $utc\n")
-        ..write("    year: $year\n")
-        ..write("    month: $month\n")
-        ..write("    day: $day\n")
-        ..write("    pm: $pm\n")
-        ..write("    hour: $hour\n")
-        ..write("    minute: $minute\n")
-        ..write("    second: $second\n")
-        ..write("    fractionalSecond: $fractionalSecond\n");
-    }
     var result;
     if (utc) {
       result = new DateTime.utc(
@@ -71,10 +58,12 @@
           minute,
           second,
           fractionalSecond);
-    }
-    if (debugLogDateCreation) {
-      debugDateCreationLog
-        ..write("Created $result");
+      // TODO(alanknight): Issue 15560 means non-UTC dates occasionally come
+      // out in UTC. If that happens, retry once. This will always happen if 
+      // the local time zone is UTC, but that's ok.
+      if (result.toUtc() == result) {
+        result = asDate(retry: false);
+      }
     }
     return result;
   }
diff --git a/pkg/intl/lib/src/http_request_data_reader.dart b/pkg/intl/lib/src/http_request_data_reader.dart
index bd86d66..af0d68f 100644
--- a/pkg/intl/lib/src/http_request_data_reader.dart
+++ b/pkg/intl/lib/src/http_request_data_reader.dart
@@ -23,6 +23,31 @@
     // TODO(alanknight): Remove this once it's not necessary for Chrome.
     // Without it, the tests will be flaky on Chrome. Issue 11834.
     var someNumber = new DateTime.now().millisecondsSinceEpoch;
-    return HttpRequest.getString('$url$locale.json?cacheBlocker=$someNumber');
+    var request = new HttpRequest();
+    request.timeout = 5000;
+    return _getString('$url$locale.json?cacheBlocker=$someNumber', request)
+      .then((r) => r.responseText);
+  }
+  
+  /// Read a string with the given request. This is a stripped down copy
+  /// of HttpRequest getString, but was the simplest way I could find to 
+  /// issue a request with a timeout.
+  Future<HttpRequest> _getString(String url, HttpRequest xhr) {
+    var completer = new Completer<HttpRequest>();
+    xhr.open('GET', url, async: true);
+    xhr.onLoad.listen((e) {
+      // Note: file:// URIs have status of 0.
+      if ((xhr.status >= 200 && xhr.status < 300) ||
+          xhr.status == 0 || xhr.status == 304) {
+        completer.complete(xhr);
+      } else {
+        completer.completeError(e);
+      }
+    });
+
+    xhr.onError.listen(completer.completeError);
+    xhr.send();
+
+    return completer.future;
   }
 }
diff --git a/pkg/intl/lib/src/temporary_debugging.dart b/pkg/intl/lib/src/temporary_debugging.dart
deleted file mode 100644
index 29740c4..0000000
--- a/pkg/intl/lib/src/temporary_debugging.dart
+++ /dev/null
@@ -1,10 +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.
-
-/// This library contains temporary debugging code that should be
-/// removed once its purpose is finished. You would be crazy to use it.
-
-bool debugLogDateCreation = false;
-
-StringBuffer debugDateCreationLog = new StringBuffer();
diff --git a/pkg/intl/pubspec.yaml b/pkg/intl/pubspec.yaml
index 82dce33..3895b01 100644
--- a/pkg/intl/pubspec.yaml
+++ b/pkg/intl/pubspec.yaml
@@ -1,5 +1,5 @@
 name: intl
-version: 0.9.10-dev.1
+version: 0.9.10
 author: Dart Team <misc@dartlang.org>
 description: Contains code to deal with internationalized/localized messages, date and number formatting and parsing, bi-directional text, and other internationalization issues.
 homepage: http://www.dartlang.org
@@ -7,7 +7,7 @@
   sdk: '>=1.4.0-dev.6.6 <2.0.0'
 documentation: http://api.dartlang.org/docs/pkg/intl
 dependencies:
-  analyzer: '>=0.13.2 <0.14.0'
+  analyzer: '>=0.13.2 <0.16.0'
   path: '>=0.9.0 <2.0.0'
 dev_dependencies:
   serialization: '>=0.9.0 <0.10.0'
diff --git a/pkg/intl/test/date_time_format_test_core.dart b/pkg/intl/test/date_time_format_test_core.dart
index ea7cfca..6510481 100644
--- a/pkg/intl/test/date_time_format_test_core.dart
+++ b/pkg/intl/test/date_time_format_test_core.dart
@@ -14,7 +14,6 @@
 import 'date_time_format_test_data.dart';
 import 'package:intl/intl.dart';
 import 'package:intl/src/date_format_internal.dart';
-import 'package:intl/src/temporary_debugging.dart';
 
 var formatsToTest = const [
   DateFormat.DAY,
@@ -165,35 +164,8 @@
     if (!badSkeletons.any((x) => x == skeleton)) {
       var format = new DateFormat(skeleton, localeName);
       var actualResult = format.format(date);
-      debugLogDateCreation = true;
       var parsed = format.parse(actualResult);
       var thenPrintAgain = format.format(parsed);
-      // We've seen a case where this failed in a way that seemed like a time
-      // zone shifting or some other strange behaviour that caused an off by
-      // one error in the date. Check for this and print out as much information
-      // as possible if it occurs again.
-      if (thenPrintAgain != actualResult) {
-        print("Date mismatch!");
-        print("Date creation log: $debugDateCreationLog");
-        debugDateCreationLog.clear();
-        print("  Expected $actualResult");
-        print("  Got $thenPrintAgain");
-        print("  Original date = $date");
-        print("  Original ms = ${date.millisecondsSinceEpoch}");
-        print("  Parsed back to $parsed");
-        var parsed2 = format.parse(actualResult);
-        print("  Parsing again yields $parsed2");
-        print("  Logged as: $debugDateCreationLog");
-        debugDateCreationLog.clear();
-        print("  Parsed ms = ${parsed.millisecondsSinceEpoch}");
-        print("  Original tz = $originalTimeZoneOffset");
-        print("  Current tz name = $originalTimeZoneName");
-        print("  Current tz = ${parsed.timeZoneOffset}");
-        print("  Current tz name = ${parsed.timeZoneName}");
-        print("  Start time = $originalTime");
-        print("  Current time ${new DateTime.now()}");
-      }
-      debugLogDateCreation = false;
       expect(thenPrintAgain, equals(actualResult));
     }
   }
diff --git a/pkg/json_rpc_2/CHANGELOG.md b/pkg/json_rpc_2/CHANGELOG.md
index ba15fb3..34123f9 100644
--- a/pkg/json_rpc_2/CHANGELOG.md
+++ b/pkg/json_rpc_2/CHANGELOG.md
@@ -1,3 +1,15 @@
+## 0.1.0
+
+* Remove `Server.handleRequest()` and `Server.parseRequest()`. Instead, `new
+  Server()` takes a `Stream` and a `StreamSink` and uses those behind-the-scenes
+  for its communication.
+
+* Add `Server.listen()`, which causes the server to begin listening to the
+  underlying request stream.
+
+* Add `Server.close()`, which closes the underlying request stream and response
+  sink.
+
 ## 0.0.2+3
 
 * Widen the version constraint for `stack_trace`.
diff --git a/pkg/json_rpc_2/lib/src/server.dart b/pkg/json_rpc_2/lib/src/server.dart
index d05c54f..c7ece5b 100644
--- a/pkg/json_rpc_2/lib/src/server.dart
+++ b/pkg/json_rpc_2/lib/src/server.dart
@@ -26,6 +26,20 @@
 /// asynchronously, it's possible for multiple methods to be invoked at the same
 /// time, or even for a single method to be invoked multiple times at once.
 class Server {
+  /// The stream for decoded requests.
+  final Stream _requests;
+
+  /// The subscription to the decoded request stream.
+  StreamSubscription _requestSubscription;
+
+  /// The sink for decoded responses.
+  final StreamSink _responses;
+
+  /// The completer for [listen].
+  ///
+  /// This is non-`null` after [listen] has been called.
+  Completer _listenCompleter;
+
   /// The methods registered for this server.
   final _methods = new Map<String, Function>();
 
@@ -35,7 +49,104 @@
   /// [RpcException.methodNotFound] exception.
   final _fallbacks = new Queue<Function>();
 
-  Server();
+  /// Creates a [Server] that reads requests from [requests] and writes
+  /// responses to [responses].
+  ///
+  /// If [requests] is a [StreamSink] as well as a [Stream] (for example, a
+  /// `WebSocket`), [responses] may be omitted.
+  ///
+  /// Note that the server won't begin listening to [requests] until
+  /// [Server.listen] is called.
+  factory Server(Stream<String> requests, [StreamSink<String> responses]) {
+    if (responses == null) {
+      if (requests is! StreamSink) {
+        throw new ArgumentError("Either `requests` must be a StreamSink or "
+            "`responses` must be passed.");
+      }
+      responses = requests as StreamSink;
+    }
+
+    var wrappedResponses = mapStreamSink(responses, JSON.encode);
+    return new Server.withoutJson(requests.expand((request) {
+      var decodedRequest;
+      try {
+        decodedRequest = JSON.decode(request);
+      } on FormatException catch (error) {
+        wrappedResponses.add(new RpcException(error_code.PARSE_ERROR,
+            'Invalid JSON: ${error.message}').serialize(request));
+        return [];
+      }
+
+      return [decodedRequest];
+    }), wrappedResponses);
+  }
+
+  /// Creates a [Server] that reads decoded requests from [requests] and writes
+  /// decoded responses to [responses].
+  ///
+  /// Unlike [new Server], this doesn't read or write JSON strings. Instead, it
+  /// reads and writes decoded maps or lists.
+  ///
+  /// If [requests] is a [StreamSink] as well as a [Stream], [responses] may be
+  /// omitted.
+  ///
+  /// Note that the server won't begin listening to [requests] until
+  /// [Server.listen] is called.
+  Server.withoutJson(Stream requests, [StreamSink responses])
+      : _requests = requests,
+        _responses = responses == null && requests is StreamSink ?
+            requests : responses {
+    if (_responses == null) {
+      throw new ArgumentError("Either `requests` must be a StreamSink or "
+          "`responses` must be passed.");
+    }
+  }
+
+  /// Starts listening to the underlying stream.
+  ///
+  /// Returns a [Future] that will complete when the stream is closed or when it
+  /// has an error.
+  ///
+  /// [listen] may only be called once.
+  Future listen() {
+    if (_listenCompleter != null) {
+      throw new StateError(
+          "Can only call Server.listen once on a given server.");
+    }
+
+    _listenCompleter = new Completer();
+    _requestSubscription = _requests.listen(_handleRequest,
+        onError: (error, stackTrace) {
+      if (_listenCompleter.isCompleted) return;
+      _responses.close();
+      _listenCompleter.completeError(error, stackTrace);
+    }, onDone: () {
+      if (_listenCompleter.isCompleted) return;
+      _responses.close();
+      _listenCompleter.complete();
+    }, cancelOnError: true);
+
+    return _listenCompleter.future;
+  }
+
+  /// Closes the server's request subscription and response sink.
+  ///
+  /// Returns a [Future] that completes when all resources have been released.
+  ///
+  /// A server can't be closed before [listen] has been called.
+  Future close() {
+    if (_listenCompleter == null) {
+      throw new StateError("Can't call Server.close before Server.listen.");
+    }
+
+    if (!_listenCompleter.isCompleted) _listenCompleter.complete();
+
+    var subscriptionFuture = _requestSubscription.cancel();
+    // TODO(nweiz): include the response future in the return value when issue
+    // 19095 is fixed.
+    _responses.close();
+    return subscriptionFuture == null ? new Future.value() : subscriptionFuture;
+  }
 
   /// Registers a method named [name] on this server.
   ///
@@ -69,14 +180,14 @@
     _fallbacks.add(callback);
   }
 
-  /// Handle a request that's already been parsed from JSON.
+  /// Handle a request.
   ///
   /// [request] is expected to be a JSON-serializable object representing a
   /// request sent by a client. This calls the appropriate method or methods for
   /// handling that request and returns a JSON-serializable response, or `null`
   /// if no response should be sent. [callback] may send custom
   /// errors by throwing an [RpcException].
-  Future handleRequest(request) {
+  Future _handleRequest(request) {
     return syncFuture(() {
       if (request is! List) return _handleSingleRequest(request);
       if (request.isEmpty) {
@@ -88,28 +199,7 @@
         var nonNull = results.where((result) => result != null);
         return nonNull.isEmpty ? null : nonNull.toList();
       });
-    });
-  }
-
-  /// Parses and handles a JSON serialized request.
-  ///
-  /// This calls the appropriate method or methods for handling that request and
-  /// returns a JSON string, or `null` if no response should be sent.
-  Future<String> parseRequest(String request) {
-    return syncFuture(() {
-      var decodedRequest;
-      try {
-        decodedRequest = JSON.decode(request);
-      } on FormatException catch (error) {
-        return new RpcException(error_code.PARSE_ERROR, 'Invalid JSON: '
-            '${error.message}').serialize(request);
-      }
-
-      return handleRequest(decodedRequest);
-    }).then((response) {
-      if (response == null) return null;
-      return JSON.encode(response);
-    });
+    }).then(_responses.add);
   }
 
   /// Handles an individual parsed request.
diff --git a/pkg/json_rpc_2/lib/src/utils.dart b/pkg/json_rpc_2/lib/src/utils.dart
index 1eff004..a212f58 100644
--- a/pkg/json_rpc_2/lib/src/utils.dart
+++ b/pkg/json_rpc_2/lib/src/utils.dart
@@ -43,3 +43,24 @@
 /// [toString], so we remove that if it exists.
 String getErrorMessage(error) =>
     error.toString().replaceFirst(_exceptionPrefix, '');
+
+/// Returns a [StreamSink] that wraps [sink] and maps each event added using
+/// [callback].
+StreamSink mapStreamSink(StreamSink sink, callback(event)) =>
+    new _MappedStreamSink(sink, callback);
+
+/// A [StreamSink] wrapper that maps each event added to the sink.
+class _MappedStreamSink implements StreamSink {
+  final StreamSink _inner;
+  final Function _callback;
+
+  Future get done => _inner.done;
+
+  _MappedStreamSink(this._inner, this._callback);
+
+  void add(event) => _inner.add(_callback(event));
+  void addError(error, [StackTrace stackTrace]) =>
+      _inner.addError(error, stackTrace);
+  Future addStream(Stream stream) => _inner.addStream(stream.map(_callback));
+  Future close() => _inner.close();
+}
diff --git a/pkg/json_rpc_2/pubspec.yaml b/pkg/json_rpc_2/pubspec.yaml
index 2cf1bc8..df1a8a0 100644
--- a/pkg/json_rpc_2/pubspec.yaml
+++ b/pkg/json_rpc_2/pubspec.yaml
@@ -1,5 +1,5 @@
 name: json_rpc_2
-version: 0.0.2+3
+version: 0.1.0
 author: Dart Team <misc@dartlang.org>
 description: An implementation of the JSON-RPC 2.0 spec.
 homepage: http://www.dartlang.org
@@ -7,7 +7,7 @@
 dependencies:
   stack_trace: '>=0.9.1 <2.0.0'
 dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
+  unittest: ">=0.9.0 <0.12.0"
 environment:
   sdk: ">=1.2.0 <2.0.0"
 
diff --git a/pkg/json_rpc_2/test/server/batch_test.dart b/pkg/json_rpc_2/test/server/batch_test.dart
index 441df58..7dda84f 100644
--- a/pkg/json_rpc_2/test/server/batch_test.dart
+++ b/pkg/json_rpc_2/test/server/batch_test.dart
@@ -13,16 +13,17 @@
 import 'utils.dart';
 
 void main() {
-  var server;
+  var controller;
   setUp(() {
-    server = new json_rpc.Server()
+    controller = new ServerController();
+    controller.server
         ..registerMethod('foo', () => 'foo')
         ..registerMethod('id', (params) => params.value)
         ..registerMethod('arg', (params) => params['arg'].value);
   });
 
   test('handles a batch of requests', () {
-    expect(server.handleRequest([
+    expect(controller.handleRequest([
       {'jsonrpc': '2.0', 'method': 'foo', 'id': 1},
       {'jsonrpc': '2.0', 'method': 'id', 'params': ['value'], 'id': 2},
       {'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}, 'id': 3}
@@ -34,7 +35,7 @@
   });
 
   test('handles errors individually', () {
-    expect(server.handleRequest([
+    expect(controller.handleRequest([
       {'jsonrpc': '2.0', 'method': 'foo', 'id': 1},
       {'jsonrpc': '2.0', 'method': 'zap', 'id': 2},
       {'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}, 'id': 3}
@@ -54,7 +55,7 @@
   });
 
   test('handles notifications individually', () {
-    expect(server.handleRequest([
+    expect(controller.handleRequest([
       {'jsonrpc': '2.0', 'method': 'foo', 'id': 1},
       {'jsonrpc': '2.0', 'method': 'id', 'params': ['value']},
       {'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}, 'id': 3}
@@ -65,7 +66,7 @@
   });
 
   test('returns nothing if every request is a notification', () {
-    expect(server.handleRequest([
+    expect(controller.handleRequest([
       {'jsonrpc': '2.0', 'method': 'foo'},
       {'jsonrpc': '2.0', 'method': 'id', 'params': ['value']},
       {'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}}
@@ -73,24 +74,12 @@
   });
 
   test('returns an error if the batch is empty', () {
-    expectErrorResponse(server, [], error_code.INVALID_REQUEST,
+    expectErrorResponse(controller, [], error_code.INVALID_REQUEST,
         'A batch must contain at least one request.');
   });
 
-  test('handles a batch of requests parsed from JSON', () {
-    expect(server.parseRequest(JSON.encode([
-      {'jsonrpc': '2.0', 'method': 'foo', 'id': 1},
-      {'jsonrpc': '2.0', 'method': 'id', 'params': ['value'], 'id': 2},
-      {'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}, 'id': 3}
-    ])), completion(equals(JSON.encode([
-      {'jsonrpc': '2.0', 'result': 'foo', 'id': 1},
-      {'jsonrpc': '2.0', 'result': ['value'], 'id': 2},
-      {'jsonrpc': '2.0', 'result': 'value', 'id': 3}
-    ]))));
-  });
-
   test('disallows nested batches', () {
-    expect(server.handleRequest([
+    expect(controller.handleRequest([
       [{'jsonrpc': '2.0', 'method': 'foo', 'id': 1}]
     ]), completion(equals([{
       'jsonrpc': '2.0',
diff --git a/pkg/json_rpc_2/test/server/invalid_request_test.dart b/pkg/json_rpc_2/test/server/invalid_request_test.dart
index feeefea..74cf86f 100644
--- a/pkg/json_rpc_2/test/server/invalid_request_test.dart
+++ b/pkg/json_rpc_2/test/server/invalid_request_test.dart
@@ -13,23 +13,23 @@
 import 'utils.dart';
 
 void main() {
-  var server;
-  setUp(() => server = new json_rpc.Server());
+  var controller;
+  setUp(() => controller = new ServerController());
 
   test("a non-Array/Object request is invalid", () {
-    expectErrorResponse(server, 'foo', error_code.INVALID_REQUEST,
+    expectErrorResponse(controller, 'foo', error_code.INVALID_REQUEST,
         'Request must be an Array or an Object.');
   });
 
   test("requests must have a jsonrpc key", () {
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'method': 'foo',
       'id': 1234
     }, error_code.INVALID_REQUEST, 'Request must contain a "jsonrpc" key.');
   });
 
   test("the jsonrpc version must be 2.0", () {
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'jsonrpc': '1.0',
       'method': 'foo',
       'id': 1234
@@ -38,14 +38,14 @@
   });
 
   test("requests must have a method key", () {
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'jsonrpc': '2.0',
       'id': 1234
     }, error_code.INVALID_REQUEST, 'Request must contain a "method" key.');
   });
 
   test("request method must be a string", () {
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'jsonrpc': '2.0',
       'method': 1234,
       'id': 1234
@@ -54,7 +54,7 @@
   });
 
   test("request params must be an Array or Object", () {
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': 1234,
@@ -64,7 +64,7 @@
   });
 
   test("request id may not be an Array or Object", () {
-    expect(server.handleRequest({
+    expect(controller.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'id': {'bad': 'id'}
diff --git a/pkg/json_rpc_2/test/server/parameters_test.dart b/pkg/json_rpc_2/test/server/parameters_test.dart
index 49e4573..64fe232 100644
--- a/pkg/json_rpc_2/test/server/parameters_test.dart
+++ b/pkg/json_rpc_2/test/server/parameters_test.dart
@@ -262,7 +262,9 @@
       expect(() => parameters['invalid-uri'].asUri,
           throwsInvalidParams('Parameter "invalid-uri" for method "foo" must '
               'be a valid URI, but was "http://[::1".\n'
-              'Bad end of IPv6 host'));
+              'Missing end `]` to match `[` in host at position 7.\n'
+              'http://[::1\n'
+              '       ^'));
     });
 
     group("with a nested parameter map", () {
diff --git a/pkg/json_rpc_2/test/server/server_test.dart b/pkg/json_rpc_2/test/server/server_test.dart
index c18a8ca..a89a0d99 100644
--- a/pkg/json_rpc_2/test/server/server_test.dart
+++ b/pkg/json_rpc_2/test/server/server_test.dart
@@ -13,15 +13,15 @@
 import 'utils.dart';
 
 void main() {
-  var server;
-  setUp(() => server = new json_rpc.Server());
+  var controller;
+  setUp(() => controller = new ServerController());
 
   test("calls a registered method with the given name", () {
-    server.registerMethod('foo', (params) {
+    controller.server.registerMethod('foo', (params) {
       return {'params': params.value};
     });
 
-    expect(server.handleRequest({
+    expect(controller.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': {'param': 'value'},
@@ -34,9 +34,9 @@
   });
 
   test("calls a method that takes no parameters", () {
-    server.registerMethod('foo', () => 'foo');
+    controller.server.registerMethod('foo', () => 'foo');
 
-    expect(server.handleRequest({
+    expect(controller.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'id': 1234
@@ -48,9 +48,9 @@
   });
 
   test("a method that takes no parameters rejects parameters", () {
-    server.registerMethod('foo', () => 'foo');
+    controller.server.registerMethod('foo', () => 'foo');
 
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': {},
@@ -61,9 +61,9 @@
   });
 
   test("an unexpected error in a method is captured", () {
-    server.registerMethod('foo', () => throw new FormatException('bad format'));
+    controller.server.registerMethod('foo', () => throw new FormatException('bad format'));
 
-    expect(server.handleRequest({
+    expect(controller.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'id': 1234
@@ -83,9 +83,9 @@
   });
 
   test("doesn't return a result for a notification", () {
-    server.registerMethod('foo', (args) => 'result');
+    controller.server.registerMethod('foo', (args) => 'result');
 
-    expect(server.handleRequest({
+    expect(controller.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': {}
@@ -93,11 +93,11 @@
   });
 
   test("includes the error data in the response", () {
-    server.registerMethod('foo', (params) {
+    controller.server.registerMethod('foo', (params) {
       throw new json_rpc.RpcException(5, 'Error message.', data: 'data value');
     });
 
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': {},
@@ -108,58 +108,28 @@
         data: 'data value');
   });
 
-  group("JSON", () {
-    test("handles a request parsed from JSON", () {
-      server.registerMethod('foo', (params) {
-        return {'params': params.value};
-      });
-
-      expect(server.parseRequest(JSON.encode({
+  test("a JSON parse error is rejected", () {
+    return controller.handleJsonRequest('invalid json {').then((result) {
+      expect(JSON.decode(result), {
         'jsonrpc': '2.0',
-        'method': 'foo',
-        'params': {'param': 'value'},
-        'id': 1234
-      })), completion(equals(JSON.encode({
-        'jsonrpc': '2.0',
-        'result': {'params': {'param': 'value'}},
-        'id': 1234
-      }))));
-    });
-
-    test("handles a notification parsed from JSON", () {
-      server.registerMethod('foo', (params) {
-        return {'params': params};
-      });
-
-      expect(server.parseRequest(JSON.encode({
-        'jsonrpc': '2.0',
-        'method': 'foo',
-        'params': {'param': 'value'}
-      })), completion(isNull));
-    });
-
-    test("a JSON parse error is rejected", () {
-      return server.parseRequest('invalid json {').then((result) {
-        expect(JSON.decode(result), {
-          'jsonrpc': '2.0',
-          'error': {
-            'code': error_code.PARSE_ERROR,
-            'message': startsWith("Invalid JSON: "),
-            'data': {'request': 'invalid json {'}
-          },
-          'id': null
-        });
+        'error': {
+          'code': error_code.PARSE_ERROR,
+          'message': startsWith("Invalid JSON: "),
+          'data': {'request': 'invalid json {'}
+        },
+        'id': null
       });
     });
   });
 
   group("fallbacks", () {
     test("calls a fallback if no method matches", () {
-      server.registerMethod('foo', () => 'foo');
-      server.registerMethod('bar', () => 'foo');
-      server.registerFallback((params) => {'fallback': params.value});
+      controller.server
+          ..registerMethod('foo', () => 'foo')
+          ..registerMethod('bar', () => 'foo')
+          ..registerFallback((params) => {'fallback': params.value});
 
-      expect(server.handleRequest({
+      expect(controller.handleRequest({
         'jsonrpc': '2.0',
         'method': 'baz',
         'params': {'param': 'value'},
@@ -172,13 +142,13 @@
     });
 
     test("calls the first matching fallback", () {
-      server.registerFallback((params) =>
-          throw new json_rpc.RpcException.methodNotFound(params.method));
+      controller.server
+          ..registerFallback((params) =>
+              throw new json_rpc.RpcException.methodNotFound(params.method))
+          ..registerFallback((params) => 'fallback 2')
+          ..registerFallback((params) => 'fallback 3');
 
-      server.registerFallback((params) => 'fallback 2');
-      server.registerFallback((params) => 'fallback 3');
-
-      expect(server.handleRequest({
+      expect(controller.handleRequest({
         'jsonrpc': '2.0',
         'method': 'fallback 2',
         'id': 1234
@@ -190,9 +160,10 @@
     });
 
     test("an unexpected error in a fallback is captured", () {
-      server.registerFallback((_) => throw new FormatException('bad format'));
+      controller.server.registerFallback((_) =>
+          throw new FormatException('bad format'));
 
-      expect(server.handleRequest({
+      expect(controller.handleRequest({
         'jsonrpc': '2.0',
         'method': 'foo',
         'id': 1234
@@ -213,7 +184,8 @@
   });
 
   test("disallows multiple methods with the same name", () {
-    server.registerMethod('foo', () => null);
-    expect(() => server.registerMethod('foo', () => null), throwsArgumentError);
+    controller.server.registerMethod('foo', () => null);
+    expect(() => controller.server.registerMethod('foo', () => null),
+        throwsArgumentError);
   });
 }
diff --git a/pkg/json_rpc_2/test/server/utils.dart b/pkg/json_rpc_2/test/server/utils.dart
index 6f92c0a..a4fd36a 100644
--- a/pkg/json_rpc_2/test/server/utils.dart
+++ b/pkg/json_rpc_2/test/server/utils.dart
@@ -4,16 +4,53 @@
 
 library json_rpc_2.test.server.util;
 
-import 'package:unittest/unittest.dart';
-import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
+import 'dart:async';
+import 'dart:convert';
 
-void expectErrorResponse(json_rpc.Server server, request, int errorCode,
+import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
+import 'package:json_rpc_2/error_code.dart' as error_code;
+import 'package:unittest/unittest.dart';
+
+/// A controller used to test a [json_rpc.Server].
+class ServerController {
+  /// The controller for the server's request stream.
+  final _requestController = new StreamController<String>();
+
+  /// The controller for the server's response sink.
+  final _responseController = new StreamController<String>();
+
+  /// The server.
+  json_rpc.Server get server => _server;
+  json_rpc.Server _server;
+
+  ServerController() {
+    _server = new json_rpc.Server(
+        _requestController.stream, _responseController.sink);
+    _server.listen();
+  }
+
+  /// Passes [request], a decoded request, to [server] and returns its decoded
+  /// response.
+  Future handleRequest(request) =>
+      handleJsonRequest(JSON.encode(request)).then(JSON.decode);
+
+  /// Passes [request], a JSON-encoded request, to [server] and returns its
+  /// encoded response.
+  Future handleJsonRequest(String request) {
+    _requestController.add(request);
+    return _responseController.stream.first;
+  }
+}
+
+/// Expects that [controller]'s server will return an error response to
+/// [request] with the given [errorCode], [message], and [data].
+void expectErrorResponse(ServerController controller, request, int errorCode,
     String message, {data}) {
   var id;
   if (request is Map) id = request['id'];
   if (data == null) data = {'request': request};
 
-  expect(server.handleRequest(request), completion(equals({
+  expect(controller.handleRequest(request), completion(equals({
     'jsonrpc': '2.0',
     'id': id,
     'error': {
@@ -24,10 +61,25 @@
   })));
 }
 
+/// Returns a matcher that matches a [json_rpc.RpcException] with an
+/// `invalid_params` error code.
 Matcher throwsInvalidParams(String message) {
   return throwsA(predicate((error) {
     expect(error, new isInstanceOf<json_rpc.RpcException>());
+    expect(error.code, equals(error_code.INVALID_PARAMS));
     expect(error.message, equals(message));
     return true;
   }));
 }
+
+/// Returns a [Future] that completes after pumping the event queue [times]
+/// times. By default, this should pump the event queue enough times to allow
+/// any code to run, as long as it's not waiting on some external event.
+Future pumpEventQueue([int times = 20]) {
+  if (times == 0) 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, () => pumpEventQueue(times - 1));
+}
diff --git a/pkg/matcher/CHANGELOG.md b/pkg/matcher/CHANGELOG.md
index 98cd9f4..af9ce95 100644
--- a/pkg/matcher/CHANGELOG.md
+++ b/pkg/matcher/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.10.1+1
+
+* Get the tests passing when run on dart2js in minified mode.
+
+## 0.10.1
+
+* Compare sets order-independently when using `equals()`.
+
 ## 0.10.0+3
 
 * Removed `@deprecated` annotation on matchers due to 
diff --git a/pkg/matcher/lib/matcher.dart b/pkg/matcher/lib/matcher.dart
index 85694ef..99fe44b 100644
--- a/pkg/matcher/lib/matcher.dart
+++ b/pkg/matcher/lib/matcher.dart
@@ -2,31 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Support for specifying test expectations, such as for unit tests.
- *
- * The matcher library provides a third-generation assertion mechanism, drawing
- * inspiration from [Hamcrest](http://code.google.com/p/hamcrest/).
- *
- * For more information, see
- * [Unit Testing with Dart]
- * (http://www.dartlang.org/articles/dart-unit-tests/).
- */
+/// Support for specifying test expectations, such as for unit tests.
 library matcher;
 
-import 'dart:async';
-
-import 'src/description.dart';
-import 'src/interfaces.dart';
-
+export 'src/core_matchers.dart';
 export 'src/description.dart';
+export 'src/error_matchers.dart';
+export 'src/expect.dart';
+export 'src/future_matchers.dart';
 export 'src/interfaces.dart';
-
-part 'src/core_matchers.dart';
-part 'src/expect.dart';
-part 'src/future_matchers.dart';
-part 'src/iterable_matchers.dart';
-part 'src/map_matchers.dart';
-part 'src/numeric_matchers.dart';
-part 'src/operator_matchers.dart';
-part 'src/string_matchers.dart';
+export 'src/iterable_matchers.dart';
+export 'src/map_matchers.dart';
+export 'src/numeric_matchers.dart';
+export 'src/operator_matchers.dart';
+export 'src/string_matchers.dart';
diff --git a/pkg/matcher/lib/mirror_matchers.dart b/pkg/matcher/lib/mirror_matchers.dart
index c836bc9..f397128 100644
--- a/pkg/matcher/lib/mirror_matchers.dart
+++ b/pkg/matcher/lib/mirror_matchers.dart
@@ -2,21 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * The mirror matchers library provides some additional matchers that
- * make use of `dart:mirrors`.
- */
+/// The mirror matchers library provides some additional matchers that
+/// make use of `dart:mirrors`.
 library matcher.mirror_matchers;
 
 import 'dart:mirrors';
 
 import 'matcher.dart';
 
-/**
- * Returns a matcher that checks if a class instance has a property
- * with name [name], and optionally, if that property in turn satisfies
- * a [matcher].
- */
+/// Returns a matcher that checks if a class instance has a property
+/// with name [name], and optionally, if that property in turn satisfies
+/// a [matcher].
 Matcher hasProperty(String name, [matcher]) =>
   new _HasProperty(name, matcher == null ? null : wrapMatcher(matcher));
 
diff --git a/pkg/matcher/lib/src/core_matchers.dart b/pkg/matcher/lib/src/core_matchers.dart
index 7acd7b4..cb76d68 100644
--- a/pkg/matcher/lib/src/core_matchers.dart
+++ b/pkg/matcher/lib/src/core_matchers.dart
@@ -2,12 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of matcher;
+library matcher.core_matchers;
 
-/**
- * Returns a matcher that matches empty strings, maps or iterables
- * (including collections).
- */
+import 'dart:async';
+
+import 'description.dart';
+import 'expect.dart';
+import 'interfaces.dart';
+
+/// Returns a matcher that matches empty strings, maps or iterables
+/// (including collections).
 const Matcher isEmpty = const _Empty();
 
 class _Empty extends Matcher {
@@ -24,10 +28,10 @@
   Description describe(Description description) => description.add('empty');
 }
 
-/** A matcher that matches any null value. */
+/// A matcher that matches any null value.
 const Matcher isNull = const _IsNull();
 
-/** A matcher that matches any non-null value. */
+/// A matcher that matches any non-null value.
 const Matcher isNotNull = const _IsNotNull();
 
 class _IsNull extends Matcher {
@@ -42,10 +46,10 @@
   Description describe(Description description) => description.add('not null');
 }
 
-/** A matcher that matches the Boolean value true. */
+/// A matcher that matches the Boolean value true.
 const Matcher isTrue = const _IsTrue();
 
-/** A matcher that matches anything except the Boolean value true. */
+/// A matcher that matches anything except the Boolean value true.
 const Matcher isFalse = const _IsFalse();
 
 class _IsTrue extends Matcher {
@@ -60,10 +64,8 @@
   Description describe(Description description) => description.add('false');
 }
 
-/**
- * Returns a matches that matches if the value is the same instance
- * as [expected], using [identical].
- */
+/// Returns a matches that matches if the value is the same instance
+/// as [expected], using [identical].
 Matcher same(expected) => new _IsSameAs(expected);
 
 class _IsSameAs extends Matcher {
@@ -75,18 +77,16 @@
       description.add('same instance as ').addDescriptionOf(_expected);
 }
 
-/**
- * Returns a matcher that matches if the value is structurally equal to
- * [expected].
- *
- * If [expected] is a [Matcher], then it matches using that. Otherwise it tests
- * for equality using `==` on the expected value.
- *
- * For [Iterable]s and [Map]s, this will recursively match the elements. To
- * handle cyclic structures a recursion depth [limit] can be provided. The
- * default limit is 100.
- */
-Matcher equals(expected, [limit=100]) =>
+/// Returns a matcher that matches if the value is structurally equal to
+/// [expected].
+///
+/// If [expected] is a [Matcher], then it matches using that. Otherwise it tests
+/// for equality using `==` on the expected value.
+///
+/// For [Iterable]s and [Map]s, this will recursively match the elements. To
+/// handle cyclic structures a recursion depth [limit] can be provided. The
+/// default limit is 100. [Set]s will be compared order-independently.
+Matcher equals(expected, [int limit=100]) =>
     expected is String
         ? new _StringEqualsMatcher(expected)
         : new _DeepMatcher(expected, limit);
@@ -96,7 +96,7 @@
   final int _limit;
   var count;
 
-  _DeepMatcher(this._expected, [limit = 1000]): this._limit = limit;
+  _DeepMatcher(this._expected, [int limit = 1000]) : this._limit = limit;
 
   // Returns a pair (reason, location)
   List _compareIterables(expected, actual, matcher, depth, location) {
@@ -124,6 +124,26 @@
     }
   }
 
+  List _compareSets(Set expected, actual, matcher, depth, location) {
+    if (actual is! Iterable) return ['is not Iterable', location];
+    actual = actual.toSet();
+
+    for (var expectedElement in expected) {
+      if (actual.every((actualElement) =>
+          matcher(expectedElement, actualElement, location, depth) != null)) {
+        return ['does not contain $expectedElement', location];
+      }
+    }
+
+    if (actual.length > expected.length) {
+      return ['larger than expected', location];
+    } else if (actual.length < expected.length) {
+      return ['smaller than expected', location];
+    } else {
+      return null;
+    }
+  }
+
   List _recursiveMatch(expected, actual, String location, int depth) {
     // If the expected value is a matcher, try to match it.
     if (expected is Matcher) {
@@ -146,37 +166,38 @@
     if (depth > _limit) return ['recursion depth limit exceeded', location];
 
     // If _limit is 1 we can only recurse one level into object.
-    bool canRecurse = depth == 0 || _limit > 1;
+    if (depth == 0 || _limit > 1) {
+      if (expected is Set) {
+        return _compareSets(expected, actual, _recursiveMatch, depth + 1,
+            location);
+      } else if (expected is Iterable) {
+        return _compareIterables(expected, actual, _recursiveMatch, depth + 1,
+            location);
+      } else if (expected is Map) {
+        if (actual is! Map) return ['expected a map', location];
 
-    if (expected is Iterable && canRecurse) {
-      return _compareIterables(expected, actual, _recursiveMatch, depth + 1,
-          location);
-    }
-
-    if (expected is Map && canRecurse) {
-      if (actual is! Map) return ['expected a map', location];
-
-      var err = (expected.length == actual.length) ? '' :
-                'has different length and ';
-      for (var key in expected.keys) {
-        if (!actual.containsKey(key)) {
-          return ["${err}is missing map key '$key'", location];
+        var err = (expected.length == actual.length) ? '' :
+                  'has different length and ';
+        for (var key in expected.keys) {
+          if (!actual.containsKey(key)) {
+            return ["${err}is missing map key '$key'", location];
+          }
         }
-      }
 
-      for (var key in actual.keys) {
-        if (!expected.containsKey(key)) {
-          return ["${err}has extra map key '$key'", location];
+        for (var key in actual.keys) {
+          if (!expected.containsKey(key)) {
+            return ["${err}has extra map key '$key'", location];
+          }
         }
-      }
 
-      for (var key in expected.keys) {
-        var rp = _recursiveMatch(expected[key], actual[key],
-            "${location}['${key}']", depth + 1);
-        if (rp != null) return rp;
-      }
+        for (var key in expected.keys) {
+          var rp = _recursiveMatch(expected[key], actual[key],
+              "${location}['${key}']", depth + 1);
+          if (rp != null) return rp;
+        }
 
-      return null;
+        return null;
+      }
     }
 
     var description = new StringDescription();
@@ -235,7 +256,7 @@
   }
 }
 
-/** A special equality matcher for strings. */
+/// A special equality matcher for strings.
 class _StringEqualsMatcher extends Matcher {
   final String _value;
 
@@ -313,7 +334,7 @@
   }
 }
 
-/** A matcher that matches any value. */
+/// A matcher that matches any value.
 const Matcher anything = const _IsAnything();
 
 class _IsAnything extends Matcher {
@@ -322,84 +343,76 @@
   Description describe(Description description) => description.add('anything');
 }
 
-/**
- * Returns a matcher that matches if an object is an instance
- * of [type] (or a subtype).
- *
- * As types are not first class objects in Dart we can only
- * approximate this test by using a generic wrapper class.
- *
- * For example, to test whether 'bar' is an instance of type
- * 'Foo', we would write:
- *
- *     expect(bar, new isInstanceOf<Foo>());
- *
- * To get better error message, supply a name when creating the
- * Type wrapper; e.g.:
- *
- *     expect(bar, new isInstanceOf<Foo>('Foo'));
- *
- * Note that this does not currently work in dart2js; it will
- * match any type, and isNot(new isInstanceof<T>()) will always
- * fail. This is because dart2js currently ignores template type
- * parameters.
- */
+/// Returns a matcher that matches if an object is an instance
+/// of [type] (or a subtype).
+///
+/// As types are not first class objects in Dart we can only
+/// approximate this test by using a generic wrapper class.
+///
+/// For example, to test whether 'bar' is an instance of type
+/// 'Foo', we would write:
+///
+///     expect(bar, new isInstanceOf<Foo>());
+///
+/// To get better error message, supply a name when creating the
+/// Type wrapper; e.g.:
+///
+///     expect(bar, new isInstanceOf<Foo>('Foo'));
+///
+/// Note that this does not currently work in dart2js; it will
+/// match any type, and isNot(new isInstanceof<T>()) will always
+/// fail. This is because dart2js currently ignores template type
+/// parameters.
 class isInstanceOf<T> extends Matcher {
   final String _name;
-  const isInstanceOf([name = 'specified type']): this._name = name;
+  const isInstanceOf([name = 'specified type']) : this._name = name;
   bool matches(obj, Map matchState) => obj is T;
   // The description here is lame :-(
   Description describe(Description description) =>
       description.add('an instance of ${_name}');
 }
 
-/**
- * This can be used to match two kinds of objects:
- *
- *   * A [Function] that throws an exception when called. The function cannot
- *     take any arguments. If you want to test that a function expecting
- *     arguments throws, wrap it in another zero-argument function that calls
- *     the one you want to test.
- *
- *   * A [Future] that completes with an exception. Note that this creates an
- *     asynchronous expectation. The call to `expect()` that includes this will
- *     return immediately and execution will continue. Later, when the future
- *     completes, the actual expectation will run.
- */
+/// This can be used to match two kinds of objects:
+///
+///   * A [Function] that throws an exception when called. The function cannot
+///     take any arguments. If you want to test that a function expecting
+///     arguments throws, wrap it in another zero-argument function that calls
+///     the one you want to test.
+///
+///   * A [Future] that completes with an exception. Note that this creates an
+///     asynchronous expectation. The call to `expect()` that includes this will
+///     return immediately and execution will continue. Later, when the future
+///     completes, the actual expectation will run.
 const Matcher throws = const Throws();
 
-/**
- * This can be used to match two kinds of objects:
- *
- *   * A [Function] that throws an exception when called. The function cannot
- *     take any arguments. If you want to test that a function expecting
- *     arguments throws, wrap it in another zero-argument function that calls
- *     the one you want to test.
- *
- *   * A [Future] that completes with an exception. Note that this creates an
- *     asynchronous expectation. The call to `expect()` that includes this will
- *     return immediately and execution will continue. Later, when the future
- *     completes, the actual expectation will run.
- *
- * In both cases, when an exception is thrown, this will test that the exception
- * object matches [matcher]. If [matcher] is not an instance of [Matcher], it
- * will implicitly be treated as `equals(matcher)`.
- */
+/// This can be used to match two kinds of objects:
+///
+///   * A [Function] that throws an exception when called. The function cannot
+///     take any arguments. If you want to test that a function expecting
+///     arguments throws, wrap it in another zero-argument function that calls
+///     the one you want to test.
+///
+///   * A [Future] that completes with an exception. Note that this creates an
+///     asynchronous expectation. The call to `expect()` that includes this will
+///     return immediately and execution will continue. Later, when the future
+///     completes, the actual expectation will run.
+///
+/// In both cases, when an exception is thrown, this will test that the exception
+/// object matches [matcher]. If [matcher] is not an instance of [Matcher], it
+/// will implicitly be treated as `equals(matcher)`.
 Matcher throwsA(matcher) => new Throws(wrapMatcher(matcher));
 
-/**
- * A matcher that matches a function call against no exception.
- * The function will be called once. Any exceptions will be silently swallowed.
- * The value passed to expect() should be a reference to the function.
- * Note that the function cannot take arguments; to handle this
- * a wrapper will have to be created.
- */
+/// A matcher that matches a function call against no exception.
+/// The function will be called once. Any exceptions will be silently swallowed.
+/// The value passed to expect() should be a reference to the function.
+/// Note that the function cannot take arguments; to handle this
+/// a wrapper will have to be created.
 const Matcher returnsNormally = const _ReturnsNormally();
 
 class Throws extends Matcher {
   final Matcher _matcher;
 
-  const Throws([Matcher matcher]): this._matcher = matcher;
+  const Throws([Matcher matcher]) : this._matcher = matcher;
 
   bool matches(item, Map matchState) {
     if (item is! Function && item is! Future) return false;
@@ -409,7 +422,9 @@
       // Queue up an asynchronous expectation that validates when the future
       // completes.
       item.then((value) {
-        done(() => fail("Expected future to fail, but succeeded with '$value'."));
+        done(() {
+          fail("Expected future to fail, but succeeded with '$value'.");
+        });
       }, onError: (error, trace) {
         done(() {
           if (_matcher == null) return;
@@ -519,179 +534,29 @@
   Description describe(Description description) => description.add(_name);
 }
 
-/** A matcher for FormatExceptions. */
-const isFormatException = const _FormatException();
-
-/** A matcher for functions that throw FormatException. */
-const Matcher throwsFormatException = const Throws(isFormatException);
-
-class _FormatException extends TypeMatcher {
-  const _FormatException(): super("FormatException");
-  bool matches(item, Map matchState) => item is FormatException;
-}
-
-/** A matcher for Exceptions. */
-const isException = const _Exception();
-
-/** A matcher for functions that throw Exception. */
-const Matcher throwsException = const Throws(isException);
-
-class _Exception extends TypeMatcher {
-  const _Exception(): super("Exception");
-  bool matches(item, Map matchState) => item is Exception;
-}
-
-/** A matcher for ArgumentErrors. */
-const isArgumentError = const _ArgumentError();
-
-/** A matcher for functions that throw ArgumentError. */
-const Matcher throwsArgumentError = const Throws(isArgumentError);
-
-class _ArgumentError extends TypeMatcher {
-  const _ArgumentError(): super("ArgumentError");
-  bool matches(item, Map matchState) => item is ArgumentError;
-}
-
-/** A matcher for RangeErrors. */
-const isRangeError = const _RangeError();
-
-/** A matcher for functions that throw RangeError. */
-const Matcher throwsRangeError = const Throws(isRangeError);
-
-class _RangeError extends TypeMatcher {
-  const _RangeError(): super("RangeError");
-  bool matches(item, Map matchState) => item is RangeError;
-}
-
-/** A matcher for NoSuchMethodErrors. */
-const isNoSuchMethodError = const _NoSuchMethodError();
-
-/** A matcher for functions that throw NoSuchMethodError. */
-const Matcher throwsNoSuchMethodError = const Throws(isNoSuchMethodError);
-
-class _NoSuchMethodError extends TypeMatcher {
-  const _NoSuchMethodError(): super("NoSuchMethodError");
-  bool matches(item, Map matchState) => item is NoSuchMethodError;
-}
-
-/** A matcher for UnimplementedErrors. */
-const isUnimplementedError = const _UnimplementedError();
-
-/** A matcher for functions that throw Exception. */
-const Matcher throwsUnimplementedError = const Throws(isUnimplementedError);
-
-class _UnimplementedError extends TypeMatcher {
-  const _UnimplementedError(): super("UnimplementedError");
-  bool matches(item, Map matchState) => item is UnimplementedError;
-}
-
-/** A matcher for UnsupportedError. */
-const isUnsupportedError = const _UnsupportedError();
-
-/** A matcher for functions that throw UnsupportedError. */
-const Matcher throwsUnsupportedError = const Throws(isUnsupportedError);
-
-class _UnsupportedError extends TypeMatcher {
-  const _UnsupportedError(): super("UnsupportedError");
-  bool matches(item, Map matchState) => item is UnsupportedError;
-}
-
-/** A matcher for StateErrors. */
-const isStateError = const _StateError();
-
-/** A matcher for functions that throw StateError. */
-const Matcher throwsStateError = const Throws(isStateError);
-
-class _StateError extends TypeMatcher {
-  const _StateError(): super("StateError");
-  bool matches(item, Map matchState) => item is StateError;
-}
-
-/** A matcher for FallThroughError. */
-const isFallThroughError = const _FallThroughError();
-
-/** A matcher for functions that throw FallThroughError. */
-const Matcher throwsFallThroughError = const Throws(isFallThroughError);
-
-class _FallThroughError extends TypeMatcher {
-  const _FallThroughError(): super("FallThroughError");
-  bool matches(item, Map matchState) => item is FallThroughError;
-}
-
-/** A matcher for NullThrownError. */
-const isNullThrownError = const _NullThrownError();
-
-/** A matcher for functions that throw NullThrownError. */
-const Matcher throwsNullThrownError = const Throws(isNullThrownError);
-
-class _NullThrownError extends TypeMatcher {
-  const _NullThrownError(): super("NullThrownError");
-  bool matches(item, Map matchState) => item is NullThrownError;
-}
-
-/** A matcher for ConcurrentModificationError. */
-const isConcurrentModificationError = const _ConcurrentModificationError();
-
-/** A matcher for functions that throw ConcurrentModificationError. */
-const Matcher throwsConcurrentModificationError =
-    const Throws(isConcurrentModificationError);
-
-class _ConcurrentModificationError extends TypeMatcher {
-  const _ConcurrentModificationError(): super("ConcurrentModificationError");
-  bool matches(item, Map matchState) => item is ConcurrentModificationError;
-}
-
-/** A matcher for AbstractClassInstantiationError. */
-const isAbstractClassInstantiationError =
-    const _AbstractClassInstantiationError();
-
-/** A matcher for functions that throw AbstractClassInstantiationError. */
-const Matcher throwsAbstractClassInstantiationError =
-    const Throws(isAbstractClassInstantiationError);
-
-class _AbstractClassInstantiationError extends TypeMatcher {
-  const _AbstractClassInstantiationError() :
-  super("AbstractClassInstantiationError");
-  bool matches(item, Map matchState) => item is AbstractClassInstantiationError;
-}
-
-/** A matcher for CyclicInitializationError. */
-const isCyclicInitializationError = const _CyclicInitializationError();
-
-/** A matcher for functions that throw CyclicInitializationError. */
-const Matcher throwsCyclicInitializationError =
-    const Throws(isCyclicInitializationError);
-
-class _CyclicInitializationError extends TypeMatcher {
-  const _CyclicInitializationError(): super("CyclicInitializationError");
-  bool matches(item, Map matchState) => item is CyclicInitializationError;
-}
-
-/** A matcher for Map types. */
-const isMap = const _IsMap();
+/// A matcher for Map types.
+const Matcher isMap = const _IsMap();
 
 class _IsMap extends TypeMatcher {
-  const _IsMap(): super("Map");
+  const _IsMap() : super("Map");
   bool matches(item, Map matchState) => item is Map;
 }
 
-/** A matcher for List types. */
-const isList = const _IsList();
+/// A matcher for List types.
+const Matcher isList = const _IsList();
 
 class _IsList extends TypeMatcher {
-  const _IsList(): super("List");
+  const _IsList() : super("List");
   bool matches(item, Map matchState) => item is List;
 }
 
-/**
- * Returns a matcher that matches if an object has a length property
- * that matches [matcher].
- */
+/// Returns a matcher that matches if an object has a length property
+/// that matches [matcher].
 Matcher hasLength(matcher) => new _HasLength(wrapMatcher(matcher));
 
 class _HasLength extends Matcher {
   final Matcher _matcher;
-  const _HasLength([Matcher matcher = null]): this._matcher = matcher;
+  const _HasLength([Matcher matcher = null]) : this._matcher = matcher;
 
   bool matches(item, Map matchState) {
     try {
@@ -722,18 +587,15 @@
   }
 }
 
-/**
- * Returns a matcher that matches if the match argument contains
- * the expected value. For [String]s this means substring matching;
- * for [Map]s it means the map has the key, and for [Iterable]s
- * (including [Iterable]s) it means the iterable has a matching
- * element. In the case of iterables, [expected] can itself be a
- * matcher.
- */
+/// Returns a matcher that matches if the match argument contains
+/// the expected value. For [String]s this means substring matching;
+/// for [Map]s it means the map has the key, and for [Iterable]s
+/// (including [Iterable]s) it means the iterable has a matching
+/// element. In the case of iterables, [expected] can itself be a
+/// matcher.
 Matcher contains(expected) => new _Contains(expected);
 
 class _Contains extends Matcher {
-
   final _expected;
 
   const _Contains(this._expected);
@@ -767,14 +629,11 @@
   }
 }
 
-/**
- * Returns a matcher that matches if the match argument is in
- * the expected value. This is the converse of [contains].
- */
+/// Returns a matcher that matches if the match argument is in
+/// the expected value. This is the converse of [contains].
 Matcher isIn(expected) => new _In(expected);
 
 class _In extends Matcher {
-
   final _expected;
 
   const _In(this._expected);
@@ -794,18 +653,17 @@
       description.add('is in ').addDescriptionOf(_expected);
 }
 
-/**
- * Returns a matcher that uses an arbitrary function that returns
- * true or false for the actual value. For example:
- *
- *     expect(v, predicate((x) => ((x % 2) == 0), "is even"))
- */
-Matcher predicate(Function f, [description = 'satisfies function']) =>
+/// Returns a matcher that uses an arbitrary function that returns
+/// true or false for the actual value. For example:
+///
+///     expect(v, predicate((x) => ((x % 2) == 0), "is even"))
+Matcher predicate(bool f(value), [String description = 'satisfies function']) =>
     new _Predicate(f, description);
 
-class _Predicate extends Matcher {
+typedef bool _PredicateFunction(value);
 
-  final Function _matcher;
+class _Predicate extends Matcher {
+  final _PredicateFunction _matcher;
   final String _description;
 
   const _Predicate(this._matcher, this._description);
@@ -816,27 +674,25 @@
       description.add(_description);
 }
 
-/**
- * A useful utility class for implementing other matchers through inheritance.
- * Derived classes should call the base constructor with a feature name and
- * description, and an instance matcher, and should implement the
- * [featureValueOf] abstract method.
- *
- * The feature description will typically describe the item and the feature,
- * while the feature name will just name the feature. For example, we may
- * have a Widget class where each Widget has a price; we could make a
- * [CustomMatcher] that can make assertions about prices with:
- *
- *     class HasPrice extends CustomMatcher {
- *       const HasPrice(matcher) :
- *           super("Widget with price that is", "price", matcher);
- *       featureValueOf(actual) => actual.price;
- *     }
- *
- * and then use this for example like:
- *
- *      expect(inventoryItem, new HasPrice(greaterThan(0)));
- */
+/// A useful utility class for implementing other matchers through inheritance.
+/// Derived classes should call the base constructor with a feature name and
+/// description, and an instance matcher, and should implement the
+/// [featureValueOf] abstract method.
+///
+/// The feature description will typically describe the item and the feature,
+/// while the feature name will just name the feature. For example, we may
+/// have a Widget class where each Widget has a price; we could make a
+/// [CustomMatcher] that can make assertions about prices with:
+///
+///     class HasPrice extends CustomMatcher {
+///       const HasPrice(matcher) :
+///           super("Widget with price that is", "price", matcher);
+///       featureValueOf(actual) => actual.price;
+///     }
+///
+/// and then use this for example like:
+///
+///      expect(inventoryItem, new HasPrice(greaterThan(0)));
 class CustomMatcher extends Matcher {
   final String _featureDescription;
   final String _featureName;
@@ -845,7 +701,7 @@
   CustomMatcher(this._featureDescription, this._featureName, matcher)
       : this._matcher = wrapMatcher(matcher);
 
-  /** Override this to extract the interesting feature.*/
+  /// Override this to extract the interesting feature.
   featureValueOf(actual) => actual;
 
   bool matches(item, Map matchState) {
diff --git a/pkg/matcher/lib/src/description.dart b/pkg/matcher/lib/src/description.dart
index f8ebf09..f03934d 100644
--- a/pkg/matcher/lib/src/description.dart
+++ b/pkg/matcher/lib/src/description.dart
@@ -6,44 +6,39 @@
 
 import 'interfaces.dart';
 import 'pretty_print.dart';
-import 'utils.dart';
 
-/**
- * The default implementation of IDescription. This should rarely need
- * substitution, although conceivably it is a place where other languages
- * could be supported.
- */
+/// The default implementation of [Description]. This should rarely need
+/// substitution, although conceivably it is a place where other languages
+/// could be supported.
 class StringDescription implements Description {
-  var _out;
+  final StringBuffer _out = new StringBuffer();
 
-  /** Initialize the description with initial contents [init]. */
+  /// Initialize the description with initial contents [init].
   StringDescription([String init = '']) {
-    _out = init;
+    _out.write(init);
   }
 
   int get length => _out.length;
 
-  /** Get the description as a string. */
-  String toString() => _out;
+  /// Get the description as a string.
+  String toString() => _out.toString();
 
-  /** Append [text] to the description.  */
-  Description add(text) {
-    _out = '${_out}${text}';
+  /// Append [text] to the description.
+  Description add(String text) {
+    _out.write(text);
     return this;
   }
 
-  /** Change the value of the description. */
+  /// Change the value of the description.
   Description replace(String text) {
-    _out = text;
-    return this;
+    _out.clear();
+    return add(text);
   }
 
-  /**
-   * Appends a description of [value]. If it is an IMatcher use its
-   * describe method; if it is a string use its literal value after
-   * escaping any embedded control characters; otherwise use its
-   * toString() value and wrap it in angular "quotes".
-   */
+  /// Appends a description of [value]. If it is an IMatcher use its
+  /// describe method; if it is a string use its literal value after
+  /// escaping any embedded control characters; otherwise use its
+  /// toString() value and wrap it in angular "quotes".
   Description addDescriptionOf(value) {
     if (value is Matcher) {
       value.describe(this);
@@ -53,11 +48,9 @@
     return this;
   }
 
-  /**
-   * Append an [Iterable] [list] of objects to the description, using the
-   * specified [separator] and framing the list with [start]
-   * and [end].
-   */
+  /// Append an [Iterable] [list] of objects to the description, using the
+  /// specified [separator] and framing the list with [start]
+  /// and [end].
   Description addAll(String start, String separator, String end,
                        Iterable list) {
     var separate = false;
@@ -72,11 +65,4 @@
     add(end);
     return this;
   }
-
-  /** Escape the control characters in [string] so that they are visible. */
-  _addEscapedString(String string) {
-    add("'");
-    add(escapeString(string));
-    add("'");
-  }
 }
diff --git a/pkg/matcher/lib/src/expect.dart b/pkg/matcher/lib/src/expect.dart
index 2994163..073ef34 100644
--- a/pkg/matcher/lib/src/expect.dart
+++ b/pkg/matcher/lib/src/expect.dart
@@ -2,9 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of matcher;
+library matcher.expect;
 
-/** The objects thrown by the default failure handler. */
+import 'core_matchers.dart';
+import 'description.dart';
+import 'interfaces.dart';
+
+/// The objects thrown by the default failure handler.
 class TestFailure extends Error {
   final String message;
 
@@ -13,9 +17,7 @@
   String toString() => message;
 }
 
-/**
- * Useful utility for nesting match states.
- */
+/// Useful utility for nesting match states.
 
 void addStateInfo(Map matchState, Map values) {
   var innerState = new Map.from(matchState);
@@ -24,37 +26,33 @@
   matchState.addAll(values);
 }
 
-/**
- * Some matchers, like those for Futures and exception testing,
- * can fail in asynchronous sections, and throw exceptions.
- * A user of this library will typically want to catch and handle
- * such exceptions. The [wrapAsync] property is a function that
- * can wrap callbacks used by these Matchers so that they can be
- * used safely. For example, the unittest library will set this
- * to be `expectAsync`. By default this is an identity function.
- */
+/// Some matchers, like those for Futures and exception testing,
+/// can fail in asynchronous sections, and throw exceptions.
+/// A user of this library will typically want to catch and handle
+/// such exceptions. The [wrapAsync] property is a function that
+/// can wrap callbacks used by these Matchers so that they can be
+/// used safely. For example, the unittest library will set this
+/// to be `expectAsync`. By default this is an identity function.
 Function wrapAsync = (Function f, [id]) => f;
 
-/**
- * This is the main assertion function. It asserts that [actual]
- * matches the [matcher]. [reason] is optional and is typically not
- * supplied, as a reason is generated from the matcher; if [reason]
- * is included it is appended to the reason generated by the matcher.
- *
- * [matcher] can be a value in which case it will be wrapped in an
- * [equals] matcher.
- *
- * If the assertion fails, then the default behavior is to throw a
- * [TestFailure], but this behavior can be changed by calling
- * [configureExpectFailureHandler] and providing an alternative handler that
- * implements the [IFailureHandler] interface. It is also possible to
- * pass a [failureHandler] to [expect] as a final parameter for fine-
- * grained control.
- *
- * In some cases extra diagnostic info can be produced on failure (for
- * example, stack traces on mismatched exceptions). To enable these,
- * [verbose] should be specified as true;
- */
+/// This is the main assertion function. It asserts that [actual]
+/// matches the [matcher]. [reason] is optional and is typically not
+/// supplied, as a reason is generated from the matcher; if [reason]
+/// is included it is appended to the reason generated by the matcher.
+///
+/// [matcher] can be a value in which case it will be wrapped in an
+/// [equals] matcher.
+///
+/// If the assertion fails, then the default behavior is to throw a
+/// [TestFailure], but this behavior can be changed by calling
+/// [configureExpectFailureHandler] and providing an alternative handler that
+/// implements the [IFailureHandler] interface. It is also possible to
+/// pass a [failureHandler] to [expect] as a final parameter for fine-
+/// grained control.
+///
+/// In some cases extra diagnostic info can be produced on failure (for
+/// example, stack traces on mismatched exceptions). To enable these,
+/// [verbose] should be specified as true;
 void expect(actual, matcher, {String reason, FailureHandler failureHandler,
             bool verbose : false}) {
   matcher = wrapMatcher(matcher);
@@ -83,12 +81,10 @@
   failureHandler.fail(message);
 }
 
-/**
- * Takes an argument and returns an equivalent matcher.
- * If the argument is already a matcher this does nothing,
- * else if the argument is a function, it generates a predicate
- * function matcher, else it generates an equals matcher.
- */
+/// Takes an argument and returns an equivalent matcher.
+/// If the argument is already a matcher this does nothing,
+/// else if the argument is a function, it generates a predicate
+/// function matcher, else it generates an equals matcher.
 Matcher wrapMatcher(x) {
   if (x is Matcher) {
     return x;
@@ -118,12 +114,10 @@
   }
 }
 
-/**
- * Changes or resets to the default the failure handler for expect()
- * [handler] is a reference to the new handler; if this is omitted
- * or null then the failure handler is reset to the default, which
- * throws [TestFailure]s on [expect] assertion failures.
- */
+/// Changes or resets to the default the failure handler for expect()
+/// [handler] is a reference to the new handler; if this is omitted
+/// or null then the failure handler is reset to the default, which
+/// throws [TestFailure]s on [expect] assertion failures.
 void configureExpectFailureHandler([FailureHandler handler = null]) {
   if (handler == null) {
     handler = new DefaultFailureHandler();
@@ -160,17 +154,14 @@
   return description.toString();
 }
 
-/**
- * Changes or resets to default the failure message formatter for expect().
- * [formatter] is a reference to the new formatter; if this is omitted or
- * null then the failure formatter is reset to the default. The new
- * formatter is returned; this allows custom expect handlers to easily
- * get a reference to the default formatter.
- */
+/// Changes or resets to default the failure message formatter for expect().
+/// [formatter] is a reference to the new formatter; if this is omitted or
+/// null then the failure formatter is reset to the default. The new
+/// formatter is returned; this allows custom expect handlers to easily
+/// get a reference to the default formatter.
 ErrorFormatter configureExpectFormatter([ErrorFormatter formatter = null]) {
   if (formatter == null) {
     formatter = _defaultErrorFormatter;
   }
   return _assertErrorFormatter = formatter;
 }
-
diff --git a/pkg/matcher/lib/src/future_matchers.dart b/pkg/matcher/lib/src/future_matchers.dart
index c9e2742e..4c5a391 100644
--- a/pkg/matcher/lib/src/future_matchers.dart
+++ b/pkg/matcher/lib/src/future_matchers.dart
@@ -2,31 +2,33 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of matcher;
+library matcher.future_matchers;
 
-/**
- * Matches a [Future] that completes successfully with a value. Note that this
- * creates an asynchronous expectation. The call to `expect()` that includes
- * this will return immediately and execution will continue. Later, when the
- * future completes, the actual expectation will run.
- *
- * To test that a Future completes with an exception, you can use [throws] and
- * [throwsA].
- */
+import 'dart:async';
+
+import 'core_matchers.dart';
+import 'expect.dart';
+import 'interfaces.dart';
+
+/// Matches a [Future] that completes successfully with a value. Note that this
+/// creates an asynchronous expectation. The call to `expect()` that includes
+/// this will return immediately and execution will continue. Later, when the
+/// future completes, the actual expectation will run.
+///
+/// To test that a Future completes with an exception, you can use [throws] and
+/// [throwsA].
 final Matcher completes = const _Completes(null, '');
 
-/**
- * Matches a [Future] that completes succesfully with a value that matches
- * [matcher]. Note that this creates an asynchronous expectation. The call to
- * `expect()` that includes this will return immediately and execution will
- * continue. Later, when the future completes, the actual expectation will run.
- *
- * To test that a Future completes with an exception, you can use [throws] and
- * [throwsA].
- *
- * [id] is an optional tag that can be used to identify the completion matcher
- * in error messages.
- */
+/// Matches a [Future] that completes succesfully with a value that matches
+/// [matcher]. Note that this creates an asynchronous expectation. The call to
+/// `expect()` that includes this will return immediately and execution will
+/// continue. Later, when the future completes, the actual expectation will run.
+///
+/// To test that a Future completes with an exception, you can use [throws] and
+/// [throwsA].
+///
+/// [id] is an optional tag that can be used to identify the completion matcher
+/// in error messages.
 Matcher completion(matcher, [String id = '']) =>
     new _Completes(wrapMatcher(matcher), id);
 
diff --git a/pkg/matcher/lib/src/interfaces.dart b/pkg/matcher/lib/src/interfaces.dart
index 71079e5..9fc1107 100644
--- a/pkg/matcher/lib/src/interfaces.dart
+++ b/pkg/matcher/lib/src/interfaces.dart
@@ -7,97 +7,80 @@
 // To decouple the reporting of errors, and allow for extensibility of
 // matchers, we make use of some interfaces.
 
-/**
- * The ErrorFormatter type is used for functions that
- * can be used to build up error reports upon [expect] failures.
- * There is one built-in implementation ([defaultErrorFormatter])
- * which is used by the default failure handler. If the failure handler
- * is replaced it may be desirable to replace the [stringDescription]
- * error formatter with another.
- */
+/// The ErrorFormatter type is used for functions that
+/// can be used to build up error reports upon [expect] failures.
+/// There is one built-in implementation ([defaultErrorFormatter])
+/// which is used by the default failure handler. If the failure handler
+/// is replaced it may be desirable to replace the [stringDescription]
+/// error formatter with another.
 typedef String ErrorFormatter(actual, Matcher matcher, String reason,
     Map matchState, bool verbose);
 
-/**
- * Matchers build up their error messages by appending to
- * Description objects. This interface is implemented by
- * StringDescription. This interface is unlikely to need
- * other implementations, but could be useful to replace in
- * some cases - e.g. language conversion.
- */
+/// Matchers build up their error messages by appending to
+/// Description objects. This interface is implemented by
+/// StringDescription. This interface is unlikely to need
+/// other implementations, but could be useful to replace in
+/// some cases - e.g. language conversion.
 abstract class Description {
   int get length;
 
-  /** Change the value of the description. */
+  /// Change the value of the description.
   Description replace(String text);
 
-  /** This is used to add arbitrary text to the description. */
+  /// This is used to add arbitrary text to the description.
   Description add(String text);
 
-  /** This is used to add a meaningful description of a value. */
+  /// This is used to add a meaningful description of a value.
   Description addDescriptionOf(value);
 
-  /**
-   * This is used to add a description of an [Iterable] [list],
-   * with appropriate [start] and [end] markers and inter-element [separator].
-   */
+  /// This is used to add a description of an [Iterable] [list],
+  /// with appropriate [start] and [end] markers and inter-element [separator].
   Description addAll(String start, String separator, String end, Iterable list);
 }
 
-/**
- * [expect] Matchers must implement/extend the Matcher class.
- * The base Matcher class has a generic implementation of [describeMismatch]
- * so this does not need to be provided unless a more clear description is
- * required. The other two methods ([matches] and [describe])
- * must always be provided as they are highly matcher-specific.
- */
+/// [expect] Matchers must implement/extend the Matcher class.
+/// The base Matcher class has a generic implementation of [describeMismatch]
+/// so this does not need to be provided unless a more clear description is
+/// required. The other two methods ([matches] and [describe])
+/// must always be provided as they are highly matcher-specific.
 abstract class Matcher {
   const Matcher();
 
-  /**
-   * This does the matching of the actual vs expected values.
-   * [item] is the actual value. [matchState] can be supplied
-   * and may be used to add details about the mismatch that are too
-   * costly to determine in [describeMismatch].
-   */
+  /// This does the matching of the actual vs expected values.
+  /// [item] is the actual value. [matchState] can be supplied
+  /// and may be used to add details about the mismatch that are too
+  /// costly to determine in [describeMismatch].
   bool matches(item, Map matchState);
 
-  /** This builds a textual description of the matcher. */
+  /// This builds a textual description of the matcher.
   Description describe(Description description);
 
-  /**
-   * This builds a textual description of a specific mismatch. [item]
-   * is the value that was tested by [matches]; [matchState] is
-   * the [Map] that was passed to and supplemented by [matches]
-   * with additional information about the mismact, and [mismatchDescription]
-   * is the [Description] that is being built to decribe the mismatch.
-   * A few matchers make use of the [verbose] flag to provide detailed
-   * information that is not typically included but can be of help in
-   * diagnosing failures, such as stack traces.
-   */
+  /// This builds a textual description of a specific mismatch. [item]
+  /// is the value that was tested by [matches]; [matchState] is
+  /// the [Map] that was passed to and supplemented by [matches]
+  /// with additional information about the mismact, and [mismatchDescription]
+  /// is the [Description] that is being built to decribe the mismatch.
+  /// A few matchers make use of the [verbose] flag to provide detailed
+  /// information that is not typically included but can be of help in
+  /// diagnosing failures, such as stack traces.
   Description describeMismatch(item, Description mismatchDescription,
       Map matchState, bool verbose) => mismatchDescription;
 }
 
-/**
- * Failed matches are reported using a default IFailureHandler.
- * The default implementation simply throws [TestFailure]s;
- * this can be replaced by some other implementation of
- * IFailureHandler by calling configureExpectHandler.
- */
+/// Failed matches are reported using a default IFailureHandler.
+/// The default implementation simply throws [TestFailure]s;
+/// this can be replaced by some other implementation of
+/// IFailureHandler by calling configureExpectHandler.
 abstract class FailureHandler {
-  /** This handles failures given a textual decription */
+  /// This handles failures given a textual decription
   void fail(String reason);
 
-  /**
-   * This handles failures given the actual [value], the [matcher]
-   * the [reason] (argument from [expect]), some additonal [matchState]
-   * generated by the [matcher], and a verbose flag which controls in
-   * some cases how much [matchState] information is used. It will use
-   * these to create a detailed error message (typically by calling
-   * an [ErrorFormatter]) and then call [fail] with this message.
-   */
+  /// This handles failures given the actual [value], the [matcher]
+  /// the [reason] (argument from [expect]), some additonal [matchState]
+  /// generated by the [matcher], and a verbose flag which controls in
+  /// some cases how much [matchState] information is used. It will use
+  /// these to create a detailed error message (typically by calling
+  /// an [ErrorFormatter]) and then call [fail] with this message.
   void failMatch(actual, Matcher matcher, String reason,
                  Map matchState, bool verbose);
 }
-
diff --git a/pkg/matcher/lib/src/iterable_matchers.dart b/pkg/matcher/lib/src/iterable_matchers.dart
index 1922aa1..ef7afb0 100644
--- a/pkg/matcher/lib/src/iterable_matchers.dart
+++ b/pkg/matcher/lib/src/iterable_matchers.dart
@@ -2,16 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of matcher;
+library matcher.iterable_matchers;
 
-/**
- * Returns a matcher which matches [Iterable]s in which all elements
- * match the given [matcher].
- */
+import 'core_matchers.dart';
+import 'description.dart';
+import 'expect.dart';
+import 'interfaces.dart';
+
+/// Returns a matcher which matches [Iterable]s in which all elements
+/// match the given [matcher].
 Matcher everyElement(matcher) => new _EveryElement(wrapMatcher(matcher));
 
 class _EveryElement extends _IterableMatcher {
-  Matcher _matcher;
+  final Matcher _matcher;
 
   _EveryElement(Matcher this._matcher);
 
@@ -41,10 +44,10 @@
       mismatchDescription.add('has value ').addDescriptionOf(element).
           add(' which ');
       var subDescription = new StringDescription();
-      _matcher.describeMismatch(element, subDescription,
-            matchState['state'], verbose);
+      _matcher.describeMismatch(element, subDescription, matchState['state'],
+          verbose);
       if (subDescription.length > 0) {
-        mismatchDescription.add(subDescription);
+        mismatchDescription.add(subDescription.toString());
       } else {
         mismatchDescription.add("doesn't match ");
         _matcher.describe(mismatchDescription);
@@ -57,14 +60,12 @@
   }
 }
 
-/**
- * Returns a matcher which matches [Iterable]s in which at least one
- * element matches the given [matcher].
- */
+/// Returns a matcher which matches [Iterable]s in which at least one
+/// element matches the given [matcher].
 Matcher anyElement(matcher) => new _AnyElement(wrapMatcher(matcher));
 
 class _AnyElement extends _IterableMatcher {
-  Matcher _matcher;
+  final Matcher _matcher;
 
   _AnyElement(this._matcher);
 
@@ -76,11 +77,9 @@
       description.add('some element ').addDescriptionOf(_matcher);
 }
 
-/**
- * Returns a matcher which matches [Iterable]s that have the same
- * length and the same elements as [expected], and in the same order.
- * This is equivalent to equals but does not recurse.
- */
+/// Returns a matcher which matches [Iterable]s that have the same
+/// length and the same elements as [expected], and in the same order.
+/// This is equivalent to equals but does not recurse.
 
 Matcher orderedEquals(Iterable expected) => new _OrderedEquals(expected);
 
@@ -109,12 +108,10 @@
   }
 }
 
-/**
- * Returns a matcher which matches [Iterable]s that have the same
- * length and the same elements as [expected], but not necessarily in
- * the same order. Note that this is O(n^2) so should only be used on
- * small objects.
- */
+/// Returns a matcher which matches [Iterable]s that have the same
+/// length and the same elements as [expected], but not necessarily in
+/// the same order. Note that this is O(n^2) so should only be used on
+/// small objects.
 Matcher unorderedEquals(Iterable expected) => new _UnorderedEquals(expected);
 
 class _UnorderedEquals extends _UnorderedMatches {
@@ -131,10 +128,8 @@
         .add(' unordered');
 }
 
-/**
- * Iterable matchers match against [Iterable]s. We add this intermediate
- * class to give better mismatch error messages than the base Matcher class.
- */
+/// Iterable matchers match against [Iterable]s. We add this intermediate
+/// class to give better mismatch error messages than the base Matcher class.
 abstract class _IterableMatcher extends Matcher {
   const _IterableMatcher();
   Description describeMismatch(item, Description mismatchDescription,
@@ -150,12 +145,10 @@
   }
 }
 
-/**
- * Returns a matcher which matches [Iterable]s whose elements match the matchers
- * in [expected], but not necessarily in the same order.
- *
- *  Note that this is `O(n^2)` and so should only be used on small objects.
- */
+/// Returns a matcher which matches [Iterable]s whose elements match the
+/// matchers in [expected], but not necessarily in the same order.
+///
+///  Note that this is `O(n^2)` and so should only be used on small objects.
 Matcher unorderedMatches(Iterable expected) => new _UnorderedMatches(expected);
 
 class _UnorderedMatches extends Matcher {
@@ -216,20 +209,20 @@
       mismatchDescription.add(_test(item));
 }
 
-/**
- * A pairwise matcher for iterable. You can pass an arbitrary [comparator]
- * function that takes an expected and actual argument which will be applied
- * to each pair in order. [description]  should be a meaningful name for
- * the comparator.
- */
-Matcher pairwiseCompare(Iterable expected, Function comparator,
+/// A pairwise matcher for iterable. You can pass an arbitrary [comparator]
+/// function that takes an expected and actual argument which will be applied
+/// to each pair in order. [description]  should be a meaningful name for
+/// the comparator.
+Matcher pairwiseCompare(Iterable expected, bool comparator(a, b),
     String description) =>
         new _PairwiseCompare(expected, comparator, description);
 
+typedef bool _Comparator(a, b);
+
 class _PairwiseCompare extends _IterableMatcher {
-  Iterable _expected;
-  Function _comparator;
-  String _description;
+  final Iterable _expected;
+  final _Comparator _comparator;
+  final String _description;
 
   _PairwiseCompare(this._expected, this._comparator, this._description);
 
@@ -270,4 +263,3 @@
     }
   }
 }
-
diff --git a/pkg/matcher/lib/src/map_matchers.dart b/pkg/matcher/lib/src/map_matchers.dart
index 033e906..a560e50 100644
--- a/pkg/matcher/lib/src/map_matchers.dart
+++ b/pkg/matcher/lib/src/map_matchers.dart
@@ -2,11 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of matcher;
+library matcher.map_matchers;
 
-/**
- * Returns a matcher which matches maps containing the given [value].
- */
+import 'expect.dart';
+import 'interfaces.dart';
+
+/// Returns a matcher which matches maps containing the given [value].
 Matcher containsValue(value) => new _ContainsValue(value);
 
 class _ContainsValue extends Matcher {
@@ -19,10 +20,8 @@
       description.add('contains value ').addDescriptionOf(_value);
 }
 
-/**
- * Returns a matcher which matches maps containing the key-value pair
- * with [key] => [value].
- */
+/// Returns a matcher which matches maps containing the key-value pair
+/// with [key] => [value].
 Matcher containsPair(key, value) =>
     new _ContainsMapping(key, wrapMatcher(value));
 
diff --git a/pkg/matcher/lib/src/numeric_matchers.dart b/pkg/matcher/lib/src/numeric_matchers.dart
index 507a682..ae0b0ad 100644
--- a/pkg/matcher/lib/src/numeric_matchers.dart
+++ b/pkg/matcher/lib/src/numeric_matchers.dart
@@ -2,73 +2,55 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of matcher;
+library matcher.numeric_matchers;
 
-/**
- * Returns a matcher which matches if the match argument is greater
- * than the given [value].
- */
+import 'interfaces.dart';
+
+/// Returns a matcher which matches if the match argument is greater
+/// than the given [value].
 Matcher greaterThan(value) =>
   new _OrderingComparison(value, false, false, true, 'a value greater than');
 
-/**
- * Returns a matcher which matches if the match argument is greater
- * than or equal to the given [value].
- */
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to the given [value].
 Matcher greaterThanOrEqualTo(value) =>
   new _OrderingComparison(value, true, false, true,
       'a value greater than or equal to');
 
-/**
- * Returns a matcher which matches if the match argument is less
- * than the given [value].
- */
+/// Returns a matcher which matches if the match argument is less
+/// than the given [value].
 Matcher lessThan(value) =>
   new _OrderingComparison(value, false, true, false, 'a value less than');
 
-/**
- * Returns a matcher which matches if the match argument is less
- * than or equal to the given [value].
- */
+/// Returns a matcher which matches if the match argument is less
+/// than or equal to the given [value].
 Matcher lessThanOrEqualTo(value) =>
   new _OrderingComparison(value, true, true, false,
       'a value less than or equal to');
 
-/**
- * A matcher which matches if the match argument is zero.
- */
+/// A matcher which matches if the match argument is zero.
 const Matcher isZero =
   const _OrderingComparison(0, true, false, false, 'a value equal to');
 
 
-/**
- * A matcher which matches if the match argument is non-zero.
- */
+/// A matcher which matches if the match argument is non-zero.
 const Matcher isNonZero =
   const _OrderingComparison(0, false, true, true, 'a value not equal to');
 
-/**
- * A matcher which matches if the match argument is positive.
- */
+/// A matcher which matches if the match argument is positive.
 const Matcher isPositive =
   const _OrderingComparison(0, false, false, true, 'a positive value', false);
 
-/**
- * A matcher which matches if the match argument is zero or negative.
- */
+/// A matcher which matches if the match argument is zero or negative.
 const Matcher isNonPositive =
   const _OrderingComparison(0, true, true, false,
       'a non-positive value', false);
 
-/**
- * A matcher which matches if the match argument is negative.
- */
+/// A matcher which matches if the match argument is negative.
 const Matcher isNegative =
   const _OrderingComparison(0, false, true, false, 'a negative value', false);
 
-/**
- * A matcher which matches if the match argument is zero or positive.
- */
+/// A matcher which matches if the match argument is zero or positive.
 const Matcher isNonNegative =
   const _OrderingComparison(0, true, false, true,
       'a non-negative value', false);
@@ -77,18 +59,20 @@
   return value is num;
 }
 
+// TODO(kevmoo) Note that matchers that use _OrderingComparison only use
+// `==` and `<` operators to evaluate the match. Or change the matcher.
 class _OrderingComparison extends Matcher {
-  /** Expected value. */
+  /// Expected value.
   final _value;
-  /** What to return if actual == expected */
+  /// What to return if actual == expected
   final bool _equalValue;
-  /** What to return if actual < expected */
+  /// What to return if actual < expected
   final bool _lessThanValue;
-  /** What to return if actual > expected */
+  /// What to return if actual > expected
   final bool _greaterThanValue;
-  /** Textual name of the inequality */
+  /// Textual name of the inequality
   final String _comparisonDescription;
-  /** Whether to include the expected value in the description */
+  /// Whether to include the expected value in the description
   final bool _valueInDescription;
 
   const _OrderingComparison(
@@ -97,7 +81,7 @@
     this._lessThanValue,
     this._greaterThanValue,
     this._comparisonDescription,
-    [valueInDescription = true]) :
+    [bool valueInDescription = true]) :
       this._valueInDescription = valueInDescription;
 
   bool matches(item, Map matchState) {
@@ -126,12 +110,10 @@
   }
 }
 
-/**
- * Returns a matcher which matches if the match argument is within [delta]
- * of some [value]; i.e. if the match argument is greater than
- * than or equal [value]-[delta] and less than or equal to [value]+[delta].
- */
-Matcher closeTo(value, delta) => new _IsCloseTo(value, delta);
+/// Returns a matcher which matches if the match argument is within [delta]
+/// of some [value]; i.e. if the match argument is greater than
+/// than or equal [value]-[delta] and less than or equal to [value]+[delta].
+Matcher closeTo(num value, num delta) => new _IsCloseTo(value, delta);
 
 class _IsCloseTo extends Matcher {
   final num _value, _delta;
@@ -167,29 +149,25 @@
   }
 }
 
-/**
- * Returns a matcher which matches if the match argument is greater
- * than or equal to [low] and less than or equal to [high].
- */
-Matcher inInclusiveRange(low, high) => new _InRange(low, high, true, true);
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to [low] and less than or equal to [high].
+Matcher inInclusiveRange(num low, num high) =>
+    new _InRange(low, high, true, true);
 
-/**
- * Returns a matcher which matches if the match argument is greater
- * than [low] and less than [high].
- */
-Matcher inExclusiveRange(low, high) => new _InRange(low, high, false, false);
+/// Returns a matcher which matches if the match argument is greater
+/// than [low] and less than [high].
+Matcher inExclusiveRange(num low, num high) =>
+    new _InRange(low, high, false, false);
 
-/**
- * Returns a matcher which matches if the match argument is greater
- * than [low] and less than or equal to [high].
- */
-Matcher inOpenClosedRange(low, high) => new _InRange(low, high, false, true);
+/// Returns a matcher which matches if the match argument is greater
+/// than [low] and less than or equal to [high].
+Matcher inOpenClosedRange(num low, num high) =>
+    new _InRange(low, high, false, true);
 
-/**
- * Returns a matcher which matches if the match argument is greater
- * than or equal to a [low] and less than [high].
- */
-Matcher inClosedOpenRange(low, high) => new _InRange(low, high, true, false);
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to a [low] and less than [high].
+Matcher inClosedOpenRange(num low, num high) =>
+    new _InRange(low, high, true, false);
 
 class _InRange extends Matcher {
   final num _low, _high;
@@ -231,4 +209,3 @@
     }
   }
 }
-
diff --git a/pkg/matcher/lib/src/operator_matchers.dart b/pkg/matcher/lib/src/operator_matchers.dart
index fa17aba..fb79e8f 100644
--- a/pkg/matcher/lib/src/operator_matchers.dart
+++ b/pkg/matcher/lib/src/operator_matchers.dart
@@ -2,11 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of matcher;
+library matcher.operator_matchers;
 
-/**
- * This returns a matcher that inverts [matcher] to its logical negation.
- */
+import 'core_matchers.dart';
+import 'expect.dart';
+import 'interfaces.dart';
+
+/// This returns a matcher that inverts [matcher] to its logical negation.
 Matcher isNot(matcher) => new _IsNot(wrapMatcher(matcher));
 
 class _IsNot extends Matcher {
@@ -20,13 +22,11 @@
     description.add('not ').addDescriptionOf(_matcher);
 }
 
-/**
- * This returns a matcher that matches if all of the matchers passed as
- * arguments (up to 7) match. Instead of passing the matchers separately
- * they can be passed as a single List argument.
- * Any argument that is not a matcher is implicitly wrapped in a
- * Matcher to check for equality.
-*/
+/// This returns a matcher that matches if all of the matchers passed as
+/// arguments (up to 7) match. Instead of passing the matchers separately
+/// they can be passed as a single List argument.
+/// Any argument that is not a matcher is implicitly wrapped in a
+/// Matcher to check for equality.
 Matcher allOf(arg0,
              [arg1 = null,
               arg2 = null,
@@ -34,46 +34,11 @@
               arg4 = null,
               arg5 = null,
               arg6 = null]) {
-  if (arg0 is List) {
-    expect(arg1, isNull);
-    expect(arg2, isNull);
-    expect(arg3, isNull);
-    expect(arg4, isNull);
-    expect(arg5, isNull);
-    expect(arg6, isNull);
-    for (int i = 0; i < arg0.length; i++) {
-      arg0[i] = wrapMatcher(arg0[i]);
-    }
-    return new _AllOf(arg0);
-  } else {
-    List matchers = new List();
-    if (arg0 != null) {
-      matchers.add(wrapMatcher(arg0));
-    }
-    if (arg1 != null) {
-      matchers.add(wrapMatcher(arg1));
-    }
-    if (arg2 != null) {
-      matchers.add(wrapMatcher(arg2));
-    }
-    if (arg3 != null) {
-      matchers.add(wrapMatcher(arg3));
-    }
-    if (arg4 != null) {
-      matchers.add(wrapMatcher(arg4));
-    }
-    if (arg5 != null) {
-      matchers.add(wrapMatcher(arg5));
-    }
-    if (arg6 != null) {
-      matchers.add(wrapMatcher(arg6));
-    }
-    return new _AllOf(matchers);
-  }
+  return new _AllOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
 }
 
 class _AllOf extends Matcher {
-  final Iterable<Matcher> _matchers;
+  final List<Matcher> _matchers;
 
   const _AllOf(this._matchers);
 
@@ -99,17 +64,15 @@
       description.addAll('(', ' and ', ')', _matchers);
 }
 
-/**
- * Matches if any of the given matchers evaluate to true. The
- * arguments can be a set of matchers as separate parameters
- * (up to 7), or a List of matchers.
- *
- * The matchers are evaluated from left to right using short-circuit
- * evaluation, so evaluation stops as soon as a matcher returns true.
- *
- * Any argument that is not a matcher is implicitly wrapped in a
- * Matcher to check for equality.
-*/
+/// Matches if any of the given matchers evaluate to true. The
+/// arguments can be a set of matchers as separate parameters
+/// (up to 7), or a List of matchers.
+///
+/// The matchers are evaluated from left to right using short-circuit
+/// evaluation, so evaluation stops as soon as a matcher returns true.
+///
+/// Any argument that is not a matcher is implicitly wrapped in a
+/// Matcher to check for equality.
 
 Matcher anyOf(arg0,
                [arg1 = null,
@@ -118,59 +81,62 @@
                 arg4 = null,
                 arg5 = null,
                 arg6 = null]) {
-  if (arg0 is List) {
-    expect(arg1, isNull);
-    expect(arg2, isNull);
-    expect(arg3, isNull);
-    expect(arg4, isNull);
-    expect(arg5, isNull);
-    expect(arg6, isNull);
-    for (int i = 0; i < arg0.length; i++) {
-      arg0[i] = wrapMatcher(arg0[i]);
-    }
-    return new _AnyOf(arg0);
-  } else {
-    List matchers = new List();
-    if (arg0 != null) {
-      matchers.add(wrapMatcher(arg0));
-    }
-    if (arg1 != null) {
-      matchers.add(wrapMatcher(arg1));
-    }
-    if (arg2 != null) {
-      matchers.add(wrapMatcher(arg2));
-    }
-    if (arg3 != null) {
-      matchers.add(wrapMatcher(arg3));
-    }
-    if (arg4 != null) {
-      matchers.add(wrapMatcher(arg4));
-    }
-    if (arg5 != null) {
-      matchers.add(wrapMatcher(arg5));
-    }
-    if (arg6 != null) {
-      matchers.add(wrapMatcher(arg6));
-    }
-    return new _AnyOf(matchers);
-  }
+  return new _AnyOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
 }
 
 class _AnyOf extends Matcher {
-  final Iterable<Matcher> _matchers;
+  final List<Matcher> _matchers;
 
   const _AnyOf(this._matchers);
 
   bool matches(item, Map matchState) {
-     for (var matcher in _matchers) {
-       if (matcher.matches(item, matchState)) {
-         return true;
-       }
-     }
-     return false;
+    for (var matcher in _matchers) {
+      if (matcher.matches(item, matchState)) {
+        return true;
+      }
+    }
+    return false;
   }
 
   Description describe(Description description) =>
     description.addAll('(', ' or ', ')', _matchers);
 }
 
+List<Matcher> _wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
+  if (arg0 is List) {
+    // TODO(kevmoo) throw a more helpful error here if any of these args is
+    // not null
+    expect(arg1, isNull);
+    expect(arg2, isNull);
+    expect(arg3, isNull);
+    expect(arg4, isNull);
+    expect(arg5, isNull);
+    expect(arg6, isNull);
+
+    return arg0.map((a) => wrapMatcher(a)).toList();
+  }
+
+  List matchers = new List();
+  if (arg0 != null) {
+    matchers.add(wrapMatcher(arg0));
+  }
+  if (arg1 != null) {
+    matchers.add(wrapMatcher(arg1));
+  }
+  if (arg2 != null) {
+    matchers.add(wrapMatcher(arg2));
+  }
+  if (arg3 != null) {
+    matchers.add(wrapMatcher(arg3));
+  }
+  if (arg4 != null) {
+    matchers.add(wrapMatcher(arg4));
+  }
+  if (arg5 != null) {
+    matchers.add(wrapMatcher(arg5));
+  }
+  if (arg6 != null) {
+    matchers.add(wrapMatcher(arg6));
+  }
+  return matchers;
+}
diff --git a/pkg/matcher/lib/src/pretty_print.dart b/pkg/matcher/lib/src/pretty_print.dart
index 7deae06..eb13448 100644
--- a/pkg/matcher/lib/src/pretty_print.dart
+++ b/pkg/matcher/lib/src/pretty_print.dart
@@ -6,19 +6,16 @@
 
 import 'description.dart';
 import 'interfaces.dart';
-import 'utils.dart';
 
-/**
- * Returns a pretty-printed representation of [object].
- *
- * If [maxLineLength] is passed, this will attempt to ensure that each line is
- * no longer than [maxLineLength] characters long. This isn't guaranteed, since
- * individual objects may have string representations that are too long, but
- * most lines will be less than [maxLineLength] long.
- *
- * If [maxItems] is passed, [Iterable]s and [Map]s will only print their first
- * [maxItems] members or key/value pairs, respectively.
- */
+/// Returns a pretty-printed representation of [object].
+///
+/// If [maxLineLength] is passed, this will attempt to ensure that each line is
+/// no longer than [maxLineLength] characters long. This isn't guaranteed, since
+/// individual objects may have string representations that are too long, but
+/// most lines will be less than [maxLineLength] long.
+///
+/// If [maxItems] is passed, [Iterable]s and [Map]s will only print their first
+/// [maxItems] members or key/value pairs, respectively.
 String prettyPrint(object, {int maxLineLength, int maxItems}) {
   String _prettyPrint(object, int indent, Set seen, bool top) {
     // If the object is a matcher, use its description.
@@ -35,7 +32,7 @@
 
     if (object is Iterable) {
       // Print the type name for non-List iterables.
-      var type = object is List ? "" : typeName(object) + ":";
+      var type = object is List ? "" : _typeName(object) + ":";
 
       // Truncate the list of strings if it's longer than [maxItems].
       var strings = object.map(pp).toList();
@@ -83,7 +80,7 @@
     } else if (object is String) {
       // Escape strings and print each line on its own line.
       var lines = object.split("\n");
-      return "'" + lines.map(escapeString)
+      return "'" + lines.map(_escapeString)
           .join("\\n'\n${_indent(indent + 2)}'") + "'";
     } else {
       var value = object.toString().replaceAll("\n", _indent(indent) + "\n");
@@ -100,7 +97,7 @@
           object == null || defaultToString) {
         return value;
       } else {
-        return "${typeName(object)}:$value";
+        return "${_typeName(object)}:$value";
       }
     }
   }
@@ -109,3 +106,42 @@
 }
 
 String _indent(int length) => new List.filled(length, ' ').join('');
+
+/// Returns the name of the type of [x], or "Unknown" if the type name can't be
+/// determined.
+String _typeName(x) {
+  // dart2js blows up on some objects (e.g. window.navigator).
+  // So we play safe here.
+  try {
+    if (x == null) return "null";
+    var type = x.runtimeType.toString();
+    // TODO(nweiz): if the object's type is private, find a public superclass to
+    // display once there's a portable API to do that.
+    return type.startsWith("_") ? "?" : type;
+  } catch (e) {
+    return "?";
+  }
+}
+
+/// Returns [source] with any control characters replaced by their escape
+/// sequences.
+///
+/// This doesn't add quotes to the string, but it does escape single quote
+/// characters so that single quotes can be applied externally.
+String _escapeString(String source) =>
+  source.split("").map(_escapeChar).join("");
+
+/// Return the escaped form of a character [ch].
+String _escapeChar(String ch) {
+  if (ch == "'")
+    return "\\'";
+  else if (ch == '\n')
+    return '\\n';
+  else if (ch == '\r')
+    return '\\r';
+  else if (ch == '\t')
+    return '\\t';
+  else
+    return ch;
+}
+
diff --git a/pkg/matcher/lib/src/string_matchers.dart b/pkg/matcher/lib/src/string_matchers.dart
index f5e32ff..c498446 100644
--- a/pkg/matcher/lib/src/string_matchers.dart
+++ b/pkg/matcher/lib/src/string_matchers.dart
@@ -2,21 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of matcher;
+library matcher.string_matchers;
 
-/**
- * Returns a matcher which matches if the match argument is a string and
- * is equal to [value] when compared case-insensitively.
- */
+import 'interfaces.dart';
+
+/// Returns a matcher which matches if the match argument is a string and
+/// is equal to [value] when compared case-insensitively.
 Matcher equalsIgnoringCase(String value) => new _IsEqualIgnoringCase(value);
 
 class _IsEqualIgnoringCase extends _StringMatcher {
   final String _value;
-  String _matchValue;
+  final String _matchValue;
 
-  _IsEqualIgnoringCase(this._value) {
-    _matchValue = _value.toLowerCase();
-  }
+  _IsEqualIgnoringCase(String value)
+      : _value = value,
+        _matchValue = value.toLowerCase();
 
   bool matches(item, Map matchState) =>
       item is String && _matchValue == item.toLowerCase();
@@ -25,24 +25,22 @@
       description.addDescriptionOf(_value).add(' ignoring case');
 }
 
-/**
- * Returns a matcher which matches if the match argument is a string and
- * is equal to [value] when compared with all runs of whitespace
- * collapsed to single spaces and leading and trailing whitespace removed.
- *
- * For example, `equalsIgnoringCase("hello world")` will match
- * "hello   world", "  hello world" and "hello world  ".
- */
-Matcher equalsIgnoringWhitespace(_string) =>
-    new _IsEqualIgnoringWhitespace(_string);
+/// Returns a matcher which matches if the match argument is a string and
+/// is equal to [value] when compared with all runs of whitespace
+/// collapsed to single spaces and leading and trailing whitespace removed.
+///
+/// For example, `equalsIgnoringCase("hello world")` will match
+/// "hello   world", "  hello world" and "hello world  ".
+Matcher equalsIgnoringWhitespace(String string) =>
+    new _IsEqualIgnoringWhitespace(string);
 
 class _IsEqualIgnoringWhitespace extends _StringMatcher {
   final String _value;
-  String _matchValue;
+  final String _matchValue;
 
-  _IsEqualIgnoringWhitespace(this._value) {
-    _matchValue = collapseWhitespace(_value);
-  }
+  _IsEqualIgnoringWhitespace(String value)
+      : _value = value,
+        _matchValue = collapseWhitespace(value);
 
   bool matches(item, Map matchState) =>
       item is String && _matchValue == collapseWhitespace(item);
@@ -63,33 +61,8 @@
   }
 }
 
-/**
- * Utility function to collapse whitespace runs to single spaces
- * and strip leading/trailing whitespace.
- */
-String collapseWhitespace(_string) {
-  bool isWhitespace(String ch) => (' \n\r\t'.indexOf(ch) >= 0);
-  StringBuffer result = new StringBuffer();
-  bool skipSpace = true;
-  for (var i = 0; i < _string.length; i++) {
-    var character = _string[i];
-    if (isWhitespace(character)) {
-      if (!skipSpace) {
-        result.write(' ');
-        skipSpace = true;
-      }
-    } else {
-      result.write(character);
-      skipSpace = false;
-    }
-  }
-  return result.toString().trim();
-}
-
-/**
- * Returns a matcher that matches if the match argument is a string and
- * starts with [prefixString].
- */
+/// Returns a matcher that matches if the match argument is a string and
+/// starts with [prefixString].
 Matcher startsWith(String prefixString) => new _StringStartsWith(prefixString);
 
 class _StringStartsWith extends _StringMatcher {
@@ -104,14 +77,11 @@
       description.add('a string starting with ').addDescriptionOf(_prefix);
 }
 
-/**
- * Returns a matcher that matches if the match argument is a string and
- * ends with [suffixString].
- */
+/// Returns a matcher that matches if the match argument is a string and
+/// ends with [suffixString].
 Matcher endsWith(String suffixString) => new _StringEndsWith(suffixString);
 
 class _StringEndsWith extends _StringMatcher {
-
   final String _suffix;
 
   const _StringEndsWith(this._suffix);
@@ -123,19 +93,16 @@
       description.add('a string ending with ').addDescriptionOf(_suffix);
 }
 
-/**
- * Returns a matcher that matches if the match argument is a string and
- * contains a given list of [substrings] in relative order.
- *
- * For example, `stringContainsInOrder(["a", "e", "i", "o", "u"])` will match
- * "abcdefghijklmnopqrstuvwxyz".
- */
+/// Returns a matcher that matches if the match argument is a string and
+/// contains a given list of [substrings] in relative order.
+///
+/// For example, `stringContainsInOrder(["a", "e", "i", "o", "u"])` will match
+/// "abcdefghijklmnopqrstuvwxyz".
 
-Matcher stringContainsInOrder(substrings) =>
+Matcher stringContainsInOrder(List<String> substrings) =>
     new _StringContainsInOrder(substrings);
 
 class _StringContainsInOrder extends _StringMatcher {
-
   final List<String> _substrings;
 
   const _StringContainsInOrder(this._substrings);
@@ -147,8 +114,7 @@
     var from_index = 0;
     for (var s in _substrings) {
       from_index = item.indexOf(s, from_index);
-      if (from_index < 0)
-        return false;
+      if (from_index < 0) return false;
     }
     return true;
   }
@@ -158,12 +124,10 @@
                                                   _substrings);
 }
 
-/**
- * Returns a matcher that matches if the match argument is a string and
- * matches the regular expression given by [re]. [re] can be a RegExp
- * instance or a string; in the latter case it will be used to create
- * a RegExp instance.
- */
+/// Returns a matcher that matches if the match argument is a string and
+/// matches the regular expression given by [re]. [re] can be a [RegExp]
+/// instance or a [String]; in the latter case it will be used to create
+/// a RegExp instance.
 Matcher matches(re) => new _MatchesRegExp(re);
 
 class _MatchesRegExp extends _StringMatcher {
@@ -202,3 +166,26 @@
     }
   }
 }
+
+/// Utility function to collapse whitespace runs to single spaces
+/// and strip leading/trailing whitespace.
+String collapseWhitespace(String string) {
+  var result = new StringBuffer();
+  var skipSpace = true;
+  for (var i = 0; i < string.length; i++) {
+    var character = string[i];
+    if (_isWhitespace(character)) {
+      if (!skipSpace) {
+        result.write(' ');
+        skipSpace = true;
+      }
+    } else {
+      result.write(character);
+      skipSpace = false;
+    }
+  }
+  return result.toString().trim();
+}
+
+bool _isWhitespace(String ch) =>
+    ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
diff --git a/pkg/matcher/pubspec.yaml b/pkg/matcher/pubspec.yaml
index 63f8191..6f6f277 100644
--- a/pkg/matcher/pubspec.yaml
+++ b/pkg/matcher/pubspec.yaml
@@ -1,5 +1,5 @@
 name: matcher
-version: 0.10.0
+version: 0.10.1+1
 author: Dart Team <misc@dartlang.org>
 description: Support for specifying test expectations
 homepage: http://www.dartlang.org
diff --git a/pkg/matcher/test/core_matchers_test.dart b/pkg/matcher/test/core_matchers_test.dart
index 3f694f3..7e9b246 100644
--- a/pkg/matcher/test/core_matchers_test.dart
+++ b/pkg/matcher/test/core_matchers_test.dart
@@ -47,6 +47,24 @@
     shouldPass(a, equals(b));
   });
 
+  test('equals with a set', () {
+    var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+    var set1 = numbers.toSet();
+    numbers.shuffle();
+    var set2 = numbers.toSet();
+
+    shouldPass(set2, equals(set1));
+    shouldPass(numbers, equals(set1));
+    shouldFail([1, 2, 3, 4, 5, 6, 7, 8, 9], equals(set1), matches(
+        r"Expected: .*:\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]"
+        r"  Actual: \[1, 2, 3, 4, 5, 6, 7, 8, 9\]"
+        r"   Which: does not contain 10"));
+    shouldFail([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], equals(set1), matches(
+        r"Expected: .*:\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]"
+        r"  Actual: \[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11\]"
+        r"   Which: larger than expected"));
+  });
+
   test('anything', () {
     var a = new Map();
     shouldPass(0, anything);
diff --git a/pkg/matcher/test/test_common.dart b/pkg/matcher/test/test_common.dart
index 562786d..93f45f3 100644
--- a/pkg/matcher/test/test_common.dart
+++ b/pkg/matcher/test/test_common.dart
@@ -13,13 +13,13 @@
 }
 
 class HasPrice extends CustomMatcher {
-  HasPrice(matcher) :
-    super("Widget with a price that is", "price", matcher);
+  HasPrice(matcher) : super("Widget with a price that is", "price", matcher);
   featureValueOf(actual) => actual.price;
 }
 
-class SimpleIterable extends IterableBase {
-  int count;
+class SimpleIterable extends IterableBase<int> {
+  final int count;
+
   SimpleIterable(this.count);
 
   bool contains(int val) => count < val ? false : true;
@@ -34,15 +34,15 @@
   String toString() => "<[$count]>";
 
   Iterator get iterator {
-    return new SimpleIterator(count);
+    return new _SimpleIterator(count);
   }
 }
 
-class SimpleIterator implements Iterator {
+class _SimpleIterator implements Iterator<int> {
   int _count;
   int _current;
 
-  SimpleIterator(this._count);
+  _SimpleIterator(this._count);
 
   bool moveNext() {
     if (_count > 0) {
@@ -54,6 +54,6 @@
     return false;
   }
 
-  get current => _current;
+  int get current => _current;
 }
 
diff --git a/pkg/pkg.gyp b/pkg/pkg.gyp
index dfea42a..6fb7f61 100644
--- a/pkg/pkg.gyp
+++ b/pkg/pkg.gyp
@@ -19,6 +19,9 @@
                 '"../third_party/pkg"])',
             '<!@(["python", "../tools/list_pkg_directories.py", '
                 '"polymer/e2e_test/"])',
+            '../sdk/lib/_internal/compiler',
+            '../sdk/lib/_internal/libraries.dart',
+            '../site/try',
           ],
           'outputs': [
             '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
diff --git a/pkg/pkg.status b/pkg/pkg.status
index a0b87f4..761516b 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -23,6 +23,7 @@
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
 third_party/angular_tests/browser_test/core_dom/shadow_root_options: Fail # Issue 18931 (Disabled for Chrome 35 roll)
 polymer/example/component/news/test/news_index_test: Pass, RuntimeError # Issue 18931
+intl/test/date_time_format_http_request_test: Pass, Timeout # Issue 19544
 
 [ $compiler == none && ($runtime == dartium) ]
 polymer/test/attr_deserialize_test: Pass, RuntimeError # Issue 18931
@@ -48,25 +49,28 @@
 polymer/test/template_distribute_dynamic_test: Pass, RuntimeError # Issue 18931
 web_components/test/interop_test: Pass, RuntimeError # Issue 18931
 
+[ $compiler == none && ($runtime == dartium) && $mode == debug ]
+polymer/test/instance_attrs_test: Skip # Issue 19496
+
 [ $compiler == none && $runtime == dartium && $system == windows ]
 polymer/test/property_observe_test: Pass, Timeout # Issue 19326
 
 [ $runtime == vm && $mode == debug]
-analysis_server/test/analysis_server_test: Pass, Timeout
-analysis_server/test/domain_context_test: Pass, Timeout
-analysis_server/test/domain_server_test: Pass, Timeout
-analyzer/test/generated/element_test: Pass, Timeout
-analyzer/test/generated/parser_test: Pass, Timeout
-code_transformers/test/resolver_test: Pass, Timeout
+analysis_server/test/analysis_server_test: Skip  # Times out
+analysis_server/test/domain_context_test: Skip  # Times out
+analysis_server/test/domain_server_test: Skip  # Times out
+analyzer/test/generated/element_test: Skip  # Times out
+analyzer/test/generated/parser_test: Skip  # Times out
+code_transformers/test/resolver_test: Skip  # Times out
 docgen/test/*: Skip # Slow
 polymer/test/build/all_phases_test: Skip # Slow
-smoke/test/codegen/end_to_end_test: Pass, Timeout
-smoke/test/codegen/recorder_test: Pass, Timeout
-template_binding/test/template_binding_test: Pass, Timeout
-third_party/html5lib/test/tokenizer_test: Pass, Timeout
+smoke/test/codegen/end_to_end_test: Skip  # Times out
+smoke/test/codegen/recorder_test: Skip  # Times out
+template_binding/test/template_binding_test: Skip  # Times out
+third_party/html5lib/test/tokenizer_test: Skip  # Times out
+barback/test/package_graph/repetition_test: Skip  # Times out
 
 [ $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
@@ -86,9 +90,11 @@
 typed_data/test/typed_buffers_test/01: Fail # Not supporting Int64List, Uint64List.
 
 [ $compiler == dart2js && $runtime == drt ]
+third_party/angular_tests/browser_test/core_dom/compiler: Fail # Issue 19329
+third_party/angular_tests/browser_test/core_dom/shadow_root_options: Fail # Issue 19329
+third_party/angular_tests/browser_test/core/templateurl: Fail # Issue 19329
 web_components/test/interop_test: Pass, Fail # Issue 19329
 web_components/test/interop2_test: Fail # Issue 19329
-third_party/angular_tests/browser_test/core_dom/shadow_root_options: Fail # Issue 19329
 
 [ $compiler == dart2js && $checked ]
 crypto/test/base64_test: Slow, Pass
@@ -111,8 +117,8 @@
 
 [ $runtime == jsshell ]
 async/test/stream_zip_test: RuntimeError, OK # Timers are not supported.
-scheduled_test/test/unittest_compatibility_test: RuntimeError # Issue 7728
-unittest/test/unittest_nested_groups_setup_teardown_test: RuntimeError # http://dartbug.com/10109
+scheduled_test/test/unittest_compatibility_test: Fail # Issue 7728
+unittest/test/nested_groups_setup_teardown_test: RuntimeError # http://dartbug.com/10109
 
 [ $compiler == dart2js && $runtime == drt ]
 async/test/stream_zip_test: RuntimeError, Pass # Issue 18548
@@ -166,10 +172,8 @@
 mime/test/mime_multipart_transformer_test: Skip # No typed_data on IE9.
 typed_data/test/typed_buffers_test: Fail, Crash # No typed_data on IE9.
 polymer/test/instance_attrs_test: Pass, Fail # Issue 14167
-polymer/test/bind_mdv_test: Slow, Pass
-template_binding/test/custom_element_bindings_test: Fail, Timeout # Issue 16717
-polymer/test/bind_mdv_test: RuntimeError # Issue 14412, 13260
-matcher/test/matchers_test: RuntimeError # Issue 17762
+polymer/test/bind_mdv_test: Slow, Pass, RuntimeError # Issue 14412, 13260
+matcher/test/core_matchers_test: RuntimeError # Issue 17762
 polymer_expressions/test/bindings_test: RuntimeError # Issue 19265
 polymer_expressions/test/globals_test: RuntimeError # Issue 19265
 template_binding/test/template_binding_test: Pass, RuntimeError # Issue 19265
@@ -186,9 +190,6 @@
 template_binding/test/template_binding_test: Pass, RuntimeError # Issue 19265
 polymer/test/event_handlers_test: Pass, Timeout # Issue 19327
 
-[ $runtime == ie11 ]
-polymer/test/event_handlers_test: RuntimeError, Timeout # Issue 19265
-
 [ $runtime == safari || $runtime == safarimobilesim ]
 # Unexplained errors only occuring on Safari.
 typed_data/test/typed_buffers_test: RuntimeError
@@ -266,6 +267,7 @@
 code_transformers/test/*: Skip # Uses dart:io.
 http/test/io/*: Fail, OK # Uses dart:io.
 http_parser/test/web_socket_test: Fail, OK # Uses dart:io
+http_multi_server/test/http_multi_server_test: Skip # Uses dart:io
 http_server/test/*: Fail, OK # Uses dart:io.
 intl/test/date_time_format_file_even_test: Fail, OK # Uses dart:io.
 intl/test/date_time_format_file_odd_test: Fail, OK # Uses dart:io.
@@ -326,30 +328,30 @@
 [ $compiler == none && ( $runtime == dartium || $runtime == drt ) ]
 serialization/test/no_library_test: Skip # Expected Failure
 serialization/test/serialization_test: Fail # 13921
-unittest/test/unittest_async_exception_test: Fail # 13921
-unittest/test/unittest_async_setup_teardown_test: Fail # 13921
-unittest/test/unittest_completion_test: Fail # 13921
-unittest/test/unittest_correct_callback_test: Fail # 13921
-unittest/test/unittest_exception_test: Fail # 13921
-unittest/test/unittest_excess_callback_test: Fail # 13921
-unittest/test/unittest_expect_async_args_test: Fail # 13921
-unittest/test/unittest_expect_async_test: Fail # 13921
-unittest/test/unittest_group_name_test: Fail # 13921
-unittest/test/unittest_invalid_ops_test: Fail # 13921
-unittest/test/unittest_late_exception_test: Fail # 13921
-unittest/test/unittest_middle_exception_test: Fail # 13921
-unittest/test/unittest_nested_groups_setup_teardown_test: Fail # 13921
-unittest/test/unittest_protect_async_test: Fail # 13921
-unittest/test/unittest_runtests_without_tests_test: Fail # 13921
-unittest/test/unittest_setup_and_teardown_test: Fail # 13921
-unittest/test/unittest_setup_test: Fail # 13921
-unittest/test/unittest_single_correct_test: Fail # 13921
-unittest/test/unittest_single_failing_test: Fail # 13921
-unittest/test/unittest_skipped_soloed_nested_test: Fail # 13921
-unittest/test/unittest_teardown_test: Fail # 13921
-unittest/test/unittest_test_returning_future_test: Fail # 13921
-unittest/test/unittest_test_returning_future_using_runasync_test: Fail # 13921
-unittest/test/unittest_testcases_immutable_test: Fail # 13921
+unittest/test/async_exception_test: RuntimeError # 13921
+unittest/test/async_setup_teardown_test: RuntimeError # 13921
+unittest/test/completion_test: RuntimeError # 13921
+unittest/test/correct_callback_test: RuntimeError # 13921
+unittest/test/exception_test: RuntimeError # 13921
+unittest/test/excess_callback_test: RuntimeError # 13921
+unittest/test/expect_async_args_test: RuntimeError # 13921
+unittest/test/expect_async_test: RuntimeError # 13921
+unittest/test/group_name_test: RuntimeError # 13921
+unittest/test/invalid_ops_test: RuntimeError # 13921
+unittest/test/late_exception_test: RuntimeError # 13921
+unittest/test/middle_exception_test: RuntimeError # 13921
+unittest/test/nested_groups_setup_teardown_test: RuntimeError # 13921
+unittest/test/protect_async_test: RuntimeError # 13921
+unittest/test/returning_future_test: RuntimeError # 13921
+unittest/test/returning_future_using_runasync_test: RuntimeError # 13921
+unittest/test/runtests_without_tests_test: RuntimeError # 13921
+unittest/test/setup_and_teardown_test: RuntimeError # 13921
+unittest/test/setup_test: RuntimeError # 13921
+unittest/test/single_correct_test: RuntimeError # 13921
+unittest/test/single_failing_test: RuntimeError # 13921
+unittest/test/skipped_soloed_nested_test: RuntimeError # 13921
+unittest/test/teardown_test: RuntimeError # 13921
+unittest/test/testcases_immutable_test: RuntimeError # 13921
 polymer/e2e_test/canonicalization/test/deploy1_test: Fail, OK # tests deploy only behavior
 polymer/e2e_test/canonicalization/test/deploy2_test: Fail, OK # tests deploy only behavior
 polymer/e2e_test/canonicalization/test/deploy3_test: Fail, OK # tests deploy only behavior
@@ -380,7 +382,7 @@
 source_maps/test/parser_test: Pass, Timeout # Issue 13719: Please triage this failure.
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-matcher/test/matchers_test: StaticWarning, OK # testing error creating abstract class
+matcher/test/deprecated_matchers_test: StaticWarning # testing error creating abstract class
 third_party/angular_tests/vm_test: StaticWarning # Uses removed APIs. See issue 18733.
 
 [ $runtime == vm && ($system == windows || $system == macos) ]
@@ -396,6 +398,9 @@
 # Various issues due to limited browser testing in Angular.
 third_party/angular_tests/*: Skip
 
+[ $runtime == chrome ] # Note: this only fails on Chrome 35. They pass 36+
+polymer/test/entered_view_test: Fail # Chrome 35 
+
 [ $unchecked ]
 third_party/angular_tests/browser_test/angular: Skip # Requires checked mode.
 third_party/angular_tests/browser_test/core/scope: Skip # Requires checked mode.
diff --git a/pkg/polymer/CHANGELOG.md b/pkg/polymer/CHANGELOG.md
index f09744f..e051ed3 100644
--- a/pkg/polymer/CHANGELOG.md
+++ b/pkg/polymer/CHANGELOG.md
@@ -4,13 +4,25 @@
 package. We will also note important changes to the polyfill packages (observe,
 web_components, and template_binding) if they impact polymer.
 
-#### Pub version 0.11.0-dev
-  * **breaking change**: Event bindings with `@` are no longer supported.
-  * **breaking change**: enteredView/leftView were renamed to attached/detached
-  * **breaking change**: polymer.html is not required in entrypoints, but it is
-    required from files that use `<polymer-element>`.
+#### Pub version 0.11.0+3
+  * update readme
+
+#### Pub version 0.11.0+2
+  * bug fix: event listeners were not in the dirty-checking zone
+  * bug fix: dispatch event in auto-binding
+
+#### Pub version 0.11.0+1
+  * Added a workaround for bug in HTML imports (issue
+    [19650](https://code.google.com/p/dart/issues/detail?id=19650)).
+
+#### Pub version 0.11.0
   * **breaking change**: platform.js and dart_support.js must be specified in
     your entry points at the beginning of `<head>`.
+  * **breaking change**: polymer.html is not required in entrypoints, but it is
+    required from files that use `<polymer-element>`.
+  * **breaking change**: enteredView/leftView were renamed to attached/detached.
+    The old lifecycle methods will not be invoked.
+  * **breaking change**: Event bindings with `@` are no longer supported.
 
 #### Pub version 0.10.1
   * Reduce the analyzer work by mocking a small subset of the core libraries.
diff --git a/pkg/polymer/README.md b/pkg/polymer/README.md
index c71bb2ab..6aef5a5f 100644
--- a/pkg/polymer/README.md
+++ b/pkg/polymer/README.md
@@ -40,7 +40,7 @@
 
 ```yaml
 dependencies:
-  polymer: ">=0.10.0 <0.11.0"
+  polymer: ">=0.11.0 <0.12.0"
 ```
 
 Instead of using `any`, we recommend using version ranges to avoid getting your
diff --git a/pkg/polymer/lib/auto_binding.dart b/pkg/polymer/lib/auto_binding.dart
index 44dc1ca..1e1d0b6 100644
--- a/pkg/polymer/lib/auto_binding.dart
+++ b/pkg/polymer/lib/auto_binding.dart
@@ -9,18 +9,18 @@
 import 'package:template_binding/template_binding.dart';
 
 /**
- * The `d-auto-binding` element extends the template element. It provides a
+ * The `auto-binding-dart` element extends the template element. It provides a
  * quick and easy way to do data binding without the need to setup a binding
  * delegate or use the [templateBind] call. Both data and event handlers can be
  * bound using the [model].
  *
- * The `d-auto-binding` element acts just like a template that is bound to
+ * The `auto-binding-dart` element acts just like a template that is bound to
  * a model. It stamps its content in the dom adjacent to itself. When the
  * content is stamped, the `template-bound` event is fired.
  *
  * Example:
  *
- *     <template is="d-auto-binding">
+ *     <template is="auto-binding-dart">
  *       <div>Say something: <input value="{{value}}"></div>
  *       <div>You said: {{value}}</div>
  *       <button on-tap="{{buttonTap}}">Tap me!</button>
@@ -41,7 +41,7 @@
  *     </script>
  *
  */
-// Dart note: renamed to d-auto-binding to avoid conflict with JS auto-binding.
+// Dart note: renamed to avoid conflict with JS auto-binding.
 class AutoBindingElement extends TemplateElement with Polymer, Observable
     implements TemplateBindExtension {
 
@@ -89,29 +89,19 @@
 
   DocumentFragment createInstance([model, BindingDelegate delegate]) =>
       _self.createInstance(model, delegate);
+
+  @override
+  dispatchMethod(obj, method, args) {
+    // Dart note: make sure we dispatch to the model, not ourselves.
+    if (identical(obj, this)) obj = model;
+    return super.dispatchMethod(obj, method, args);
+  }
 }
 
 // Dart note: this is implemented a little differently to keep it in classic
-// OOP style. Instead of monkeypatching findController, we override
-// getEventHandler to do the right thing.
+// OOP style. Instead of monkeypatching findController, override it.
 class _AutoBindingSyntax extends PolymerExpressions {
   final AutoBindingElement _node;
-
   _AutoBindingSyntax(this._node) : super();
-
-  EventListener getEventHandler(controller, target, String method) => (e) {
-    if (controller == null || controller is! Polymer) controller = _node;
-
-    if (controller is Polymer) {
-      var args = [e, e.detail, e.currentTarget];
-
-      // Dart note: make sure we dispatch to the model, not the
-      // AutoBindingElement instance.
-      var obj = controller == _node ? _node.model : controller;
-      controller.dispatchMethod(obj, method, args);
-    } else {
-      throw new StateError('controller $controller is not a '
-          'Dart polymer-element.');
-    }
-  };
+  @override findController(_) => _node;
 }
diff --git a/pkg/polymer/lib/polymer.html b/pkg/polymer/lib/polymer.html
index 67c2556..3a3a688 100644
--- a/pkg/polymer/lib/polymer.html
+++ b/pkg/polymer/lib/polymer.html
@@ -10,6 +10,10 @@
 -->
 <!-- minified for deployment: -->
 <link rel="import" href="src/js/polymer/polymer.html">
+<script>
+// TODO(sigmund): remove this script tag (dartbug.com/19650). This empty
+// script tag is necessary to work around a bug in Chrome 36.
+</script>
 
 <!-- unminfied for debugging:
 <link rel="import" href="src/js/polymer/layout.html">
diff --git a/pkg/polymer/lib/src/build/polyfill_injector.dart b/pkg/polymer/lib/src/build/polyfill_injector.dart
index 2a3099a..2f20a52 100644
--- a/pkg/polymer/lib/src/build/polyfill_injector.dart
+++ b/pkg/polymer/lib/src/build/polyfill_injector.dart
@@ -59,6 +59,10 @@
         return;
       }
 
+      // Remove "packages/browser/dart.js". It is not needed in release mode,
+      // and in debug mode we want to ensure it is the last script on the page.
+      if (dartJs != null) dartJs.remove();
+
       // TODO(jmesserly): ideally we would generate an HTML that loads
       // dart2dart too. But for now dart2dart is not a supported deployment
       // target, so just inline the JS script. This has the nice side effect of
@@ -76,9 +80,7 @@
             script.attributes['src'] = '$src$csp.js';
           }
         }
-        // Remove "packages/browser/dart.js"
-        if (dartJs != null) dartJs.remove();
-      } else if (dartJs == null) {
+      } else {
         document.body.nodes.add(parseFragment(
               '<script src="packages/browser/dart.js"></script>'));
       }
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index 8127eda..91c50ca 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -16,7 +16,7 @@
 import 'package:analyzer/src/generated/element.dart' as analyzer show Element;
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
-import 'package:source_maps/span.dart' show SourceFile;
+import 'package:source_maps/span.dart' show SourceFile, Span;
 import 'package:smoke/codegen/generator.dart';
 import 'package:smoke/codegen/recorder.dart';
 import 'package:code_transformers/resolver.dart';
@@ -75,6 +75,10 @@
               const Deprecated(this.expires);
             }
             const Object deprecated = const Deprecated("next release");
+            class _Override { const _Override(); }
+            const Object override = const _Override();
+            class _Proxy { const _Proxy(); }
+            const Object proxy = const _Proxy();
 
             class List<V> extends Object {}
             class Map<K, V> extends Object {}
@@ -486,10 +490,10 @@
   final TransformLogger logger;
   bool _inTemplate = false;
 
-  _HtmlExtractor(this.logger, SmokeCodeGenerator generator,
+  _HtmlExtractor(TransformLogger logger, SmokeCodeGenerator generator,
       this.publishedAttributes)
-      : generator = generator,
-        visitor = new _SubExpressionVisitor(generator);
+      : logger = logger, generator = generator,
+        visitor = new _SubExpressionVisitor(generator, logger);
 
   void visitElement(Element node) {
     if (_inTemplate) _processNormalElement(node);
@@ -554,7 +558,7 @@
   }
 
   void _addExpression(String stringExpression, bool inEvent, bool isTwoWay,
-      span) {
+      Span span) {
 
     if (inEvent) {
       if (stringExpression.startsWith('@')) {
@@ -564,10 +568,15 @@
       }
 
       if (stringExpression == '') return;
+      if (stringExpression.startsWith('_')) {
+        logger.warning('private symbols cannot be used in event handlers',
+            span: span);
+        return;
+      }
       generator.addGetter(stringExpression);
       generator.addSymbol(stringExpression);
     }
-    visitor.run(pe.parse(stringExpression), isTwoWay);
+    visitor.run(pe.parse(stringExpression), isTwoWay, span);
   }
 }
 
@@ -575,21 +584,28 @@
 /// be needed to evaluate a single expression at runtime.
 class _SubExpressionVisitor extends pe.RecursiveVisitor {
   final SmokeCodeGenerator generator;
+  final TransformLogger logger;
   bool _includeSetter;
+  Span _currentSpan;
 
-  _SubExpressionVisitor(this.generator);
+  _SubExpressionVisitor(this.generator, this.logger);
 
   /// Visit [exp], and record getters and setters that are needed in order to
   /// evaluate it at runtime. [includeSetter] is only true if this expression
   /// occured in a context where it could be updated, for example in two-way
   /// bindings such as `<input value={{exp}}>`.
-  void run(pe.Expression exp, bool includeSetter) {
+  void run(pe.Expression exp, bool includeSetter, span) {
+    _currentSpan = span;
     _includeSetter = includeSetter;
     visit(exp);
   }
 
   /// Adds a getter and symbol for [name], and optionally a setter.
   _add(String name) {
+    if (name.startsWith('_')) {
+      logger.warning('private symbols are not supported', span: _currentSpan);
+      return;
+    }
     generator.addGetter(name);
     generator.addSymbol(name);
     if (_includeSetter) generator.addSetter(name);
diff --git a/pkg/polymer/lib/src/events.dart b/pkg/polymer/lib/src/events.dart
index 2ca037c..d41f199 100644
--- a/pkg/polymer/lib/src/events.dart
+++ b/pkg/polymer/lib/src/events.dart
@@ -82,22 +82,20 @@
 
     return (model, node, oneTime) {
       var handler = getEventHandler(null, node, path);
-      node.addEventListener(eventType, handler);
+      var sub = node.on[eventType].listen(handler);
 
       if (oneTime) return null;
-      return new _EventBindable(node, eventType, handler, path);
+      return new _EventBindable(sub, path);
     };
   }
 }
 
 
 class _EventBindable extends Bindable {
-  final Node _node;
-  final String _eventType;
-  final Function _handler;
+  StreamSubscription _sub;
   final String _path;
 
-  _EventBindable(this._node, this._eventType, this._handler, this._path);
+  _EventBindable(this._sub, this._path);
 
   // TODO(rafaelw): This is really pointless work. Aside from the cost
   // of these allocations, NodeBind is going to setAttribute back to its
@@ -107,7 +105,12 @@
 
   open(callback) => value;
 
-  void close() => _node.removeEventListener(_eventType, _handler);
+  void close() {
+    if (_sub != null) {
+      _sub.cancel();
+      _sub = null;
+    }
+  }
 }
 
 
diff --git a/pkg/polymer/lib/src/instance.dart b/pkg/polymer/lib/src/instance.dart
index ceb1119..3032e34 100644
--- a/pkg/polymer/lib/src/instance.dart
+++ b/pkg/polymer/lib/src/instance.dart
@@ -182,12 +182,16 @@
   CompoundObserver _propertyObserver;
   bool _readied = false;
 
+  JsObject _jsElem;
+
   /// Returns the object that should be used as the event controller for
   /// event bindings in this element's template. If set, this will override the
   /// normal controller lookup.
-  // TODO(jmesserly): type seems wrong here? I'm guessing this should be any
-  // kind of model object. Also, should it be writable by anyone?
-  Polymer eventController;
+  // TODO(jmesserly): we need to use a JS-writable property as our backing
+  // store, because of elements such as:
+  // https://github.com/Polymer/core-overlay/blob/eeb14853/core-overlay-layer.html#L78
+  get eventController => _jsElem['eventController'];
+  set eventController(value) { _jsElem['eventController'] = value; }
 
   bool get hasBeenAttached => _hasBeenAttached;
   bool _hasBeenAttached = false;
@@ -212,8 +216,7 @@
   // Note: this is observable to support $['someId'] being used in templates.
   // The template is stamped before $ is populated, so we need observation if
   // we want it to be usable in bindings.
-  @reflectable final Map<String, Element> $ =
-      new ObservableMap<String, Element>();
+  final Map<String, dynamic> $ = new ObservableMap<String, dynamic>();
 
   /// Use to override the default syntax for polymer-elements.
   /// By default this will be null, which causes [instanceTemplate] to use
@@ -264,6 +267,7 @@
       window.console.warn('Element already prepared: $_name');
       return;
     }
+    _initJsObject();
     // Dart note: get the corresponding <polymer-element> declaration.
     _element = _getDeclaration(_name);
     // install property storage
@@ -278,6 +282,12 @@
     addHostListeners();
   }
 
+  /// Initialize JS interop for this element. For now we just initialize the
+  // JsObject, but in the future we could also initialize JS APIs here.
+  _initJsObject() {
+    _jsElem = new JsObject.fromBrowserObject(this);
+  }
+
   makeElementReady() {
     if (_readied) return;
     _readied = true;
@@ -828,8 +838,7 @@
     // by default supports 1 thing being bound.
     events.forEach((type, methodName) {
       // Dart note: the getEventHandler method is on our PolymerExpressions.
-      var handler = element.syntax.getEventHandler(this, this, methodName);
-      addEventListener(type, handler);
+      on[type].listen(element.syntax.getEventHandler(this, this, methodName));
     });
   }
 
diff --git a/pkg/polymer/lib/src/js/polymer/layout.html b/pkg/polymer/lib/src/js/polymer/layout.html
index 4e1284b..679738b 100644
--- a/pkg/polymer/lib/src/js/polymer/layout.html
+++ b/pkg/polymer/lib/src/js/polymer/layout.html
@@ -237,7 +237,7 @@
 
 /* ie support for hidden */
 html /deep/ [hidden] {
-  display: none;
+  display: none !important;
 }
 
 html /deep/ [relative] {
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
index 2478c92..b217d9d 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
@@ -7,7 +7,10 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-window.PolymerGestures = {};
+window.PolymerGestures = {
+  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)
+};
+PolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };
 
 /*
  * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
@@ -19,6 +22,30 @@
  */
 
 (function(scope) {
+  var HAS_FULL_PATH = false;
+
+  // test for full event path support
+  var pathTest = document.createElement('meta');
+  if (!scope.hasSDPolyfill && pathTest.createShadowRoot) {
+    var sr = pathTest.createShadowRoot();
+    var s = document.createElement('span');
+    sr.appendChild(s);
+    pathTest.addEventListener('testpath', function(ev) {
+      if (ev.path) {
+        // if the span is in the event path, then path[0] is the real source for all events
+        HAS_FULL_PATH = ev.path[0] === s;
+      }
+      ev.stopPropagation();
+    });
+    var ev = new CustomEvent('testpath', {bubbles: true});
+    // must add node to DOM to trigger event listener
+    document.head.appendChild(pathTest);
+    s.dispatchEvent(ev);
+    pathTest.parentNode.removeChild(pathTest);
+    sr = s = null;
+  }
+  pathTest = null;
+
   var target = {
     shadow: function(inEl) {
       if (inEl) {
@@ -53,25 +80,18 @@
       return shadows;
     },
     searchRoot: function(inRoot, x, y) {
+      var t, st, sr, os;
       if (inRoot) {
-        var t = inRoot.elementFromPoint(x, y);
-        var st, sr, os;
-        // is element a shadow host?
-        sr = this.targetingShadow(t);
-        while (sr) {
-          // find the the element inside the shadow root
-          st = sr.elementFromPoint(x, y);
-          if (!st) {
-            // check for older shadows
-            sr = this.olderShadow(sr);
-          } else {
-            // shadowed element may contain a shadow root
-            var ssr = this.targetingShadow(st);
-            return this.searchRoot(ssr, x, y) || st;
-          }
+        t = inRoot.elementFromPoint(x, y);
+        if (t) {
+          // found element, check if it has a ShadowRoot
+          sr = this.targetingShadow(t);
+        } else if (inRoot !== document) {
+          // check for sibling roots
+          sr = this.olderShadow(inRoot);
         }
-        // light dom element is the target
-        return t;
+        // search other roots, fall back to light dom element
+        return this.searchRoot(sr, x, y) || t;
       }
     },
     owner: function(element) {
@@ -90,6 +110,9 @@
       return s;
     },
     findTarget: function(inEvent) {
+      if (HAS_FULL_PATH && inEvent.path) {
+        return inEvent.path[0];
+      }
       var x = inEvent.clientX, y = inEvent.clientY;
       // if the listener is in the shadow root, it is much faster to start there
       var s = this.owner(inEvent.target);
@@ -99,6 +122,26 @@
       }
       return this.searchRoot(s, x, y);
     },
+    findScrollAxis: function(inEvent) {
+      var n;
+      if (HAS_FULL_PATH && inEvent.path) {
+        var path = inEvent.path;
+        for (var i = 0; i < path.length; i++) {
+          n = path[i];
+          if (n._scrollType) {
+            return n._scrollType;
+          }
+        }
+      } else {
+        n = scope.wrap(inEvent.currentTarget);
+        while(n) {
+          if (n._scrollType) {
+            return n._scrollType;
+          }
+          n = n.parentNode || n.host;
+        }
+      }
+    },
     LCA: function(a, b) {
       if (a === b) {
         return a;
@@ -122,14 +165,14 @@
       var adepth = this.depth(a);
       var bdepth = this.depth(b);
       var d = adepth - bdepth;
-      if (d > 0) {
+      if (d >= 0) {
         a = this.walk(a, d);
       } else {
         b = this.walk(b, -d);
       }
-      while(a && b && a !== b) {
-        a = this.walk(a, 1);
-        b = this.walk(b, 1);
+      while (a && b && a !== b) {
+        a = a.parentNode || a.host;
+        b = b.parentNode || b.host;
       }
       return a;
     },
@@ -229,7 +272,8 @@
         'pan-x pan-y',
         'pan-y pan-x'
       ]
-    }
+    },
+    'manipulation'
   ];
   var styles = '';
   // only install stylesheet if the browser has touch action support
@@ -377,6 +421,7 @@
       e.pointerType = inDict.pointerType || '';
       e.hwTimestamp = inDict.hwTimestamp || 0;
       e.isPrimary = inDict.isPrimary || false;
+      e._source = inDict._source || '';
       return e;
     }
   };
@@ -500,7 +545,8 @@
     'timeStamp',
     // gesture addons
     'preventTap',
-    'tapPrevented'
+    'tapPrevented',
+    '_source'
   ];
 
   var CLONE_DEFAULTS = [
@@ -545,9 +591,11 @@
 
   var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');
 
-  var wrap = window.ShadowDOMPolyfill && ShadowDOMPolyfill.wrapIfNeeded || function(e){ return e; };
-
   var eventFactory = scope.eventFactory;
+
+  var hasSDPolyfill = scope.hasSDPolyfill;
+  var wrap = scope.wrap;
+
   /**
    * This module is for normalizing events. Mouse and Touch events will be
    * collected here, and fire PointerEvents that have the same semantics, no
@@ -594,10 +642,6 @@
       this.gestures.push(source);
     },
     register: function(element) {
-      // NOTE: Work around for #4, don't add listeners to individual Polymer elmenets in SD Polyfill
-      if (window.ShadowDOMPolyfill && element !== document) {
-        return;
-      }
       var l = this.eventSourceList.length;
       for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
         // call eventsource register
@@ -644,19 +688,19 @@
     },
     // set up event listeners
     listen: function(target, events) {
-      events.forEach(function(e) {
+      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {
         this.addEvent(target, e);
-      }, this);
+      }
     },
     // remove event listeners
     unlisten: function(target, events) {
-      events.forEach(function(e) {
+      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {
         this.removeEvent(target, e);
-      }, this);
+      }
     },
     addEvent: function(target, eventName) {
       // NOTE: Work around for #4, use native event listener in SD Polyfill
-      if (window.ShadowDOMPolyfill) {
+      if (hasSDPolyfill) {
         target.addEventListener_(eventName, this.boundHandler);
       } else {
         target.addEventListener(eventName, this.boundHandler);
@@ -664,7 +708,7 @@
     },
     removeEvent: function(target, eventName) {
       // NOTE: Work around for #4, use native event listener in SD Polyfill
-      if (window.ShadowDOMPolyfill) {
+      if (hasSDPolyfill) {
         target.removeEventListener_(eventName, this.boundHandler);
       } else {
         target.removeEventListener(eventName, this.boundHandler);
@@ -738,10 +782,11 @@
       // process the gesture queue
       for (var i = 0, e; i < this.gestureQueue.length; i++) {
         e = this.gestureQueue[i];
-        for (var j = 0, g; j < this.gestures.length; j++) {
+        for (var j = 0, g, fn; j < this.gestures.length; j++) {
           g = this.gestures[j];
-          if (g.events.indexOf(e.type) >= 0) {
-            g[e.type].call(g, e);
+          fn = g[e.type];
+          if (fn) {
+            fn.call(g, e);
           }
         }
       }
@@ -758,8 +803,11 @@
   dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
   dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);
   scope.dispatcher = dispatcher;
-  scope.register = dispatcher.register.bind(dispatcher);
+  scope.register = function(root) {
+    dispatcher.register(root);
+  };
   scope.unregister = dispatcher.unregister.bind(dispatcher);
+  scope.wrap = wrap;
 })(window.PolymerGestures);
 
 /*
@@ -916,9 +964,12 @@
     events: [
       'mousedown',
       'mousemove',
-      'mouseup',
+      'mouseup'
     ],
     register: function(target) {
+      if (target !== document) {
+        return;
+      }
       dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
@@ -942,6 +993,7 @@
       e.pointerId = this.POINTER_ID;
       e.isPrimary = true;
       e.pointerType = this.POINTER_TYPE;
+      e._source = 'mouse';
       if (!HAS_BUTTONS) {
         e.buttons = WHICH_TO_BUTTONS[e.which] || 0;
       }
@@ -956,6 +1008,7 @@
           this.mouseup(inEvent);
         }
         var e = this.prepareEvent(inEvent);
+        e.target = scope.wrap(scope.findTarget(inEvent));
         pointermap.set(this.POINTER_ID, e.target);
         dispatcher.down(e);
       }
@@ -970,7 +1023,7 @@
     mouseup: function(inEvent) {
       if (!this.isEventSimulatedFromTouch(inEvent)) {
         var e = this.prepareEvent(inEvent);
-        e.relatedTarget = e.target;
+        e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
         e.target = pointermap.get(this.POINTER_ID);
         dispatcher.up(e);
         this.cleanupMouse();
@@ -1001,9 +1054,12 @@
   // This should be long enough to ignore compat mouse events made by touch
   var DEDUP_TIMEOUT = 2500;
   var CLICK_COUNT_TIMEOUT = 200;
+  var HYSTERESIS = 20;
   var ATTRIB = 'touch-action';
   var INSTALLER;
-  var HAS_TOUCH_ACTION = typeof document.head.style.touchAction === 'string';
+  // maybe one day...
+  // var CAN_USE_GLOBAL = ATTRIB in document.head.style;
+  var CAN_USE_GLOBAL = false;
 
   // handler block for native touch events
   var touchEvents = {
@@ -1014,14 +1070,14 @@
       'touchcancel'
     ],
     register: function(target) {
-      if (HAS_TOUCH_ACTION) {
+      if (CAN_USE_GLOBAL) {
         dispatcher.listen(target, this.events);
       } else {
         INSTALLER.enableOnSubtree(target);
       }
     },
     unregister: function(target) {
-      if (HAS_TOUCH_ACTION) {
+      if (CAN_USE_GLOBAL) {
         dispatcher.unlisten(target, this.events);
       } else {
         // TODO(dfreedman): is it worth it to disconnect the MO?
@@ -1069,7 +1125,7 @@
       EMITTER: 'none',
       XSCROLLER: 'pan-x',
       YSCROLLER: 'pan-y',
-      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/
+      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/
     },
     touchActionToScrollType: function(touchAction) {
       var t = touchAction;
@@ -1094,7 +1150,7 @@
       if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {
         this.firstTouch = inTouch.identifier;
         this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};
-        this.scrolling = false;
+        this.scrolling = null;
         this.cancelResetClickCount();
       }
     },
@@ -1128,7 +1184,17 @@
     },
     findTarget: function(touch, id) {
       if (this.currentTouchEvent.type === 'touchstart') {
-        return scope.findTarget(touch);
+        if (this.isPrimaryTouch(touch)) {
+          var fastPath = {
+            clientX: touch.clientX,
+            clientY: touch.clientY,
+            path: this.currentTouchEvent.path,
+            target: scope.wrap(this.currentTouchEvent.target)
+          };
+          return scope.findTarget(fastPath);
+        } else {
+          return scope.findTarget(touch);
+        }
       }
       // reuse target we found in touchstart
       return pointermap.get(id);
@@ -1140,7 +1206,7 @@
       // Touch identifiers can start at 0.
       // Add 2 to the touch identifier for compatibility.
       var id = e.pointerId = inTouch.identifier + 2;
-      e.target = this.findTarget(inTouch, id);
+      e.target = scope.wrap(this.findTarget(inTouch, id));
       e.bubbles = true;
       e.cancelable = true;
       e.detail = this.clickCount;
@@ -1150,6 +1216,7 @@
       e.pressure = inTouch.webkitForce || inTouch.force || 0.5;
       e.isPrimary = this.isPrimaryTouch(inTouch);
       e.pointerType = this.POINTER_TYPE;
+      e._source = 'touch';
       // forward touch preventDefaults
       var self = this;
       e.preventDefault = function() {
@@ -1162,9 +1229,18 @@
     processTouches: function(inEvent, inFunction) {
       var tl = inEvent.changedTouches;
       this.currentTouchEvent = inEvent;
-      for (var i = 0, t; i < tl.length; i++) {
+      for (var i = 0, t, p; i < tl.length; i++) {
         t = tl[i];
-        inFunction.call(this, this.touchToPointer(t));
+        p = this.touchToPointer(t);
+        if (inEvent.type === 'touchstart') {
+          pointermap.set(p.pointerId, p.target);
+        }
+        if (pointermap.has(p.pointerId)) {
+          inFunction.call(this, p);
+        }
+        if (inEvent.type === 'touchend' || inEvent._cancel) {
+          this.cleanUpPointer(p);
+        }
       }
     },
     // For single axis scrollers, determines whether the element should emit
@@ -1172,7 +1248,7 @@
     shouldScroll: function(inEvent) {
       if (this.firstXY) {
         var ret;
-        var scrollAxis = inEvent.currentTarget._scrollType;
+        var scrollAxis = scope.targetFinding.findScrollAxis(inEvent);
         if (scrollAxis === 'none') {
           // this element is a touch-action: none, should never scroll
           ret = false;
@@ -1190,7 +1266,6 @@
           // making events
           ret = da >= doa;
         }
-        this.firstXY = null;
         return ret;
       }
     },
@@ -1218,11 +1293,14 @@
           // Touch identifiers are 2 smaller than their pointerId, which is the
           // index in pointermap.
           if (key !== 1 && !this.findTouch(tl, key - 2)) {
-            var p = value.out;
+            var p = value;
             d.push(p);
           }
         }, this);
-        d.forEach(this.cancelOut, this);
+        d.forEach(function(p) {
+          this.cancel(p);
+          pointermap.delete(p.pointerId);
+        });
       }
     },
     touchstart: function(inEvent) {
@@ -1235,30 +1313,34 @@
       }
     },
     down: function(inPointer) {
-      var p = pointermap.set(inPointer.pointerId, inPointer.target);
       dispatcher.down(inPointer);
     },
     touchmove: function(inEvent) {
-      if (HAS_TOUCH_ACTION) {
+      if (CAN_USE_GLOBAL) {
         this.processTouches(inEvent, this.move);
       } else {
         if (!this.scrolling) {
-          if (this.shouldScroll(inEvent)) {
+          if (this.scrolling === null && this.shouldScroll(inEvent)) {
             this.scrolling = true;
-            this.touchcancel(inEvent);
           } else {
+            this.scrolling = false;
             inEvent.preventDefault();
             this.processTouches(inEvent, this.move);
           }
+        } else if (this.firstXY) {
+          var t = inEvent.changedTouches[0];
+          var dx = t.clientX - this.firstXY.X;
+          var dy = t.clientY - this.firstXY.Y;
+          var dd = Math.sqrt(dx * dx + dy * dy);
+          if (dd >= HYSTERESIS) {
+            this.touchcancel(inEvent);
+            this.scrolling = true;
+            this.firstXY = null;
+          }
         }
       }
     },
     move: function(inPointer) {
-      var pointer = pointermap.get(inPointer.pointerId);
-      // a finger drifted off the screen, ignore it
-      if (!pointer) {
-        return;
-      }
       dispatcher.move(inPointer);
     },
     touchend: function(inEvent) {
@@ -1266,18 +1348,14 @@
       this.processTouches(inEvent, this.up);
     },
     up: function(inPointer) {
-      if (!this.scrolling) {
-        inPointer.relatedTarget = scope.findTarget(inPointer);
-        dispatcher.up(inPointer);
-      }
-      this.cleanUpPointer(inPointer);
+      inPointer.relatedTarget = scope.wrap(scope.findTarget(inPointer));
+      dispatcher.up(inPointer);
     },
     cancel: function(inPointer) {
-      inPointer.relatedTarget = scope.findTarget(inPointer);
       dispatcher.cancel(inPointer);
-      this.cleanUpPointer(inPointer);
     },
     touchcancel: function(inEvent) {
+      inEvent._cancel = true;
       this.processTouches(inEvent, this.cancel);
     },
     cleanUpPointer: function(inPointer) {
@@ -1304,7 +1382,7 @@
     }
   };
 
-  if (!HAS_TOUCH_ACTION) {
+  if (!CAN_USE_GLOBAL) {
     INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);
   }
 
@@ -1332,6 +1410,9 @@
       'MSPointerCancel',
     ],
     register: function(target) {
+      if (target !== document) {
+        return;
+      }
       dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
@@ -1346,10 +1427,11 @@
     ],
     prepareEvent: function(inEvent) {
       var e = inEvent;
+      e = dispatcher.cloneEvent(inEvent);
       if (HAS_BITMAP_TYPE) {
-        e = dispatcher.cloneEvent(inEvent);
         e.pointerType = this.POINTER_TYPES[inEvent.pointerType];
       }
+      e._source = 'ms';
       return e;
     },
     cleanup: function(id) {
@@ -1357,6 +1439,7 @@
     },
     MSPointerDown: function(inEvent) {
       var e = this.prepareEvent(inEvent);
+      e.target = scope.wrap(scope.findTarget(inEvent));
       pointermap.set(inEvent.pointerId, e.target);
       dispatcher.down(e);
     },
@@ -1367,14 +1450,14 @@
     },
     MSPointerUp: function(inEvent) {
       var e = this.prepareEvent(inEvent);
-      e.relatedTarget = e.target;
+      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
       e.target = pointermap.get(e.pointerId);
       dispatcher.up(e);
       this.cleanup(inEvent.pointerId);
     },
     MSPointerCancel: function(inEvent) {
       var e = this.prepareEvent(inEvent);
-      e.relatedTarget = e.target;
+      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
       e.target = pointermap.get(e.pointerId);
       dispatcher.cancel(e);
       this.cleanup(inEvent.pointerId);
@@ -1404,9 +1487,14 @@
       'pointercancel'
     ],
     prepareEvent: function(inEvent) {
-      return dispatcher.cloneEvent(inEvent);
+      var e = dispatcher.cloneEvent(inEvent);
+      e._source = 'pointer';
+      return e;
     },
     register: function(target) {
+      if (target !== document) {
+        return;
+      }
       dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
@@ -1417,6 +1505,7 @@
     },
     pointerdown: function(inEvent) {
       var e = this.prepareEvent(inEvent);
+      e.target = scope.wrap(scope.findTarget(inEvent));
       pointermap.set(e.pointerId, e.target);
       dispatcher.down(e);
     },
@@ -1427,14 +1516,14 @@
     },
     pointerup: function(inEvent) {
       var e = this.prepareEvent(inEvent);
-      e.relatedTarget = e.target;
+      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
       e.target = pointermap.get(e.pointerId);
       dispatcher.up(e);
       this.cleanup(inEvent.pointerId);
     },
     pointercancel: function(inEvent) {
       var e = this.prepareEvent(inEvent);
-      e.relatedTarget = e.target;
+      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
       e.target = pointermap.get(e.pointerId);
       dispatcher.cancel(e);
       this.cleanup(inEvent.pointerId);
@@ -1632,7 +1721,8 @@
          trackInfo: t.trackInfo,
          relatedTarget: inEvent.relatedTarget,
          pointerType: inEvent.pointerType,
-         pointerId: inEvent.pointerId
+         pointerId: inEvent.pointerId,
+         _source: 'track'
        });
        t.downTarget.dispatchEvent(e);
      },
@@ -1731,7 +1821,7 @@
 /**
  * This event is fired when a held pointer is released or moved.
  *
- * @class released
+ * @class release
  */
 
 (function(scope) {
@@ -1793,7 +1883,8 @@
         pointerType: this.heldPointer.pointerType,
         pointerId: this.heldPointer.pointerId,
         x: this.heldPointer.clientX,
-        y: this.heldPointer.clientY
+        y: this.heldPointer.clientY,
+        _source: 'hold'
       };
       if (inHoldTime) {
         p.holdTime = inHoldTime;
@@ -1886,7 +1977,8 @@
             altKey: inEvent.altKey,
             ctrlKey: inEvent.ctrlKey,
             metaKey: inEvent.metaKey,
-            shiftKey: inEvent.shiftKey
+            shiftKey: inEvent.shiftKey,
+            _source: 'tap'
           });
           t.dispatchEvent(e);
         }
@@ -2658,17 +2750,22 @@
     }
 
     function parseLeftHandSideExpression() {
-        var expr, property;
+        var expr, args, property;
 
         expr = parsePrimaryExpression();
 
-        while (match('.') || match('[')) {
+        while (true) {
             if (match('[')) {
                 property = parseComputedMember();
                 expr = delegate.createMemberExpression('[', expr, property);
-            } else {
+            } else if (match('.')) {
                 property = parseNonComputedMember();
                 expr = delegate.createMemberExpression('.', expr, property);
+            } else if (match('(')) {
+                args = parseArguments();
+                expr = delegate.createCallExpression(expr, args);
+            } else {
+                break;
             }
         }
 
@@ -3041,34 +3138,31 @@
   };
 
   function MemberExpression(object, property, accessor) {
+    this.computed = accessor == '[';
+
     this.dynamicDeps = typeof object == 'function' ||
                        object.dynamicDeps ||
-                       (accessor == '[' && !(property instanceof Literal));
-
-    // convert literal computed property access where literal value is a value
-    // path to ident dot-access.
-    if (accessor == '[' &&
-        property instanceof Literal &&
-        Path.get(property.value).valid) {
-      accessor = '.';
-      property = new IdentPath(property.value);
-    }
+                       (this.computed && !(property instanceof Literal));
 
     this.simplePath =
         !this.dynamicDeps &&
-        property instanceof IdentPath &&
+        (property instanceof IdentPath || property instanceof Literal) &&
         (object instanceof MemberExpression || object instanceof IdentPath);
 
     this.object = this.simplePath ? object : getFn(object);
-    this.property = accessor == '.' ? property : getFn(property);
+    this.property = !this.computed || this.simplePath ?
+        property : getFn(property);
   }
 
   MemberExpression.prototype = {
     get fullPath() {
       if (!this.fullPath_) {
-        var last = this.object instanceof IdentPath ?
-            this.object.name : this.object.fullPath;
-        this.fullPath_ = Path.get(last + '.' + this.property.name);
+
+        var parts = this.object instanceof MemberExpression ?
+            this.object.fullPath.slice() : [this.object.name];
+        parts.push(this.property instanceof IdentPath ?
+            this.property.name : this.property.value);
+        this.fullPath_ = Path.get(parts);
       }
 
       return this.fullPath_;
@@ -3087,11 +3181,11 @@
 
             return path.getValueFrom(model);
           };
-        } else if (this.property instanceof IdentPath) {
+        } else if (!this.computed) {
           var path = Path.get(this.property.name);
 
-          this.valueFn_ = function(model, observer) {
-            var context = object(model, observer);
+          this.valueFn_ = function(model, observer, filterRegistry) {
+            var context = object(model, observer, filterRegistry);
 
             if (observer)
               observer.addPath(context, path);
@@ -3102,11 +3196,11 @@
           // Computed property.
           var property = this.property;
 
-          this.valueFn_ = function(model, observer) {
-            var context = object(model, observer);
-            var propName = property(model, observer);
+          this.valueFn_ = function(model, observer, filterRegistry) {
+            var context = object(model, observer, filterRegistry);
+            var propName = property(model, observer, filterRegistry);
             if (observer)
-              observer.addPath(context, propName);
+              observer.addPath(context, [propName]);
 
             return context ? context[propName] : undefined;
           };
@@ -3137,8 +3231,8 @@
   }
 
   Filter.prototype = {
-    transform: function(value, toModelDirection, filterRegistry, model,
-                        observer) {
+    transform: function(model, observer, filterRegistry, toModelDirection,
+                        initialArgs) {
       var fn = filterRegistry[this.name];
       var context = model;
       if (fn) {
@@ -3146,7 +3240,7 @@
       } else {
         fn = context[this.name];
         if (!fn) {
-          console.error('Cannot find filter: ' + this.name);
+          console.error('Cannot find function or filter: ' + this.name);
           return;
         }
       }
@@ -3161,14 +3255,13 @@
       }
 
       if (typeof fn != 'function') {
-        console.error('No ' + (toModelDirection ? 'toModel' : 'toDOM') +
-                      ' found on' + this.name);
+        console.error('Cannot find function or filter: ' + this.name);
         return;
       }
 
-      var args = [value];
+      var args = initialArgs || [];
       for (var i = 0; i < this.args.length; i++) {
-        args[i + 1] = getFn(this.args[i])(model, observer);
+        args.push(getFn(this.args[i])(model, observer, filterRegistry));
       }
 
       return fn.apply(context, args);
@@ -3222,8 +3315,8 @@
 
       argument = getFn(argument);
 
-      return function(model, observer) {
-        return unaryOperators[op](argument(model, observer));
+      return function(model, observer, filterRegistry) {
+        return unaryOperators[op](argument(model, observer, filterRegistry));
       };
     },
 
@@ -3234,9 +3327,9 @@
       left = getFn(left);
       right = getFn(right);
 
-      return function(model, observer) {
-        return binaryOperators[op](left(model, observer),
-                                   right(model, observer));
+      return function(model, observer, filterRegistry) {
+        return binaryOperators[op](left(model, observer, filterRegistry),
+                                   right(model, observer, filterRegistry));
       };
     },
 
@@ -3245,9 +3338,10 @@
       consequent = getFn(consequent);
       alternate = getFn(alternate);
 
-      return function(model, observer) {
-        return test(model, observer) ?
-            consequent(model, observer) : alternate(model, observer);
+      return function(model, observer, filterRegistry) {
+        return test(model, observer, filterRegistry) ?
+            consequent(model, observer, filterRegistry) :
+            alternate(model, observer, filterRegistry);
       }
     },
 
@@ -3264,6 +3358,17 @@
       return ex;
     },
 
+    createCallExpression: function(expression, args) {
+      if (!(expression instanceof IdentPath))
+        throw Error('Only identifier function invocations are allowed');
+
+      var filter = new Filter(expression.name, args);
+
+      return function(model, observer, filterRegistry) {
+        return filter.transform(model, observer, filterRegistry, false);
+      };
+    },
+
     createLiteral: function(token) {
       return new Literal(token.value);
     },
@@ -3272,10 +3377,10 @@
       for (var i = 0; i < elements.length; i++)
         elements[i] = getFn(elements[i]);
 
-      return function(model, observer) {
+      return function(model, observer, filterRegistry) {
         var arr = []
         for (var i = 0; i < elements.length; i++)
-          arr.push(elements[i](model, observer));
+          arr.push(elements[i](model, observer, filterRegistry));
         return arr;
       }
     },
@@ -3291,10 +3396,11 @@
       for (var i = 0; i < properties.length; i++)
         properties[i].value = getFn(properties[i].value);
 
-      return function(model, observer) {
+      return function(model, observer, filterRegistry) {
         var obj = {};
         for (var i = 0; i < properties.length; i++)
-          obj[properties[i].key] = properties[i].value(model, observer);
+          obj[properties[i].key] =
+              properties[i].value(model, observer, filterRegistry);
         return obj;
       }
     },
@@ -3385,10 +3491,10 @@
     },
 
     getValue: function(model, observer, filterRegistry) {
-      var value = getFn(this.expression)(model, observer);
+      var value = getFn(this.expression)(model, observer, filterRegistry);
       for (var i = 0; i < this.filters.length; i++) {
-        value = this.filters[i].transform(value, false, filterRegistry, model,
-                                          observer);
+        value = this.filters[i].transform(model, observer, filterRegistry,
+            false, [value]);
       }
 
       return value;
@@ -3397,8 +3503,8 @@
     setValue: function(model, newValue, filterRegistry) {
       var count = this.filters ? this.filters.length : 0;
       while (count-- > 0) {
-        newValue = this.filters[count].transform(newValue, true, filterRegistry,
-                                                 model);
+        newValue = this.filters[count].transform(model, undefined,
+            filterRegistry, true, [newValue]);
       }
 
       if (this.expression.setValue)
@@ -3510,19 +3616,33 @@
       var indexName = template.polymerExpressionIndexIdent_;
 
       return function(model) {
-        var scope = Object.create(parentScope);
-        scope[scopeName] = model;
-        scope[indexName] = undefined;
-        scope[parentScopeName] = parentScope;
-        return scope;
+        return createScopeObject(parentScope, model, scopeName, indexName);
       };
     }
   };
 
-  global.PolymerExpressions = PolymerExpressions;
-  if (global.exposeGetExpression)
-    global.getExpression_ = getExpression;
+  var createScopeObject = ('__proto__' in {}) ?
+    function(parentScope, model, scopeName, indexName) {
+      var scope = {};
+      scope[scopeName] = model;
+      scope[indexName] = undefined;
+      scope[parentScopeName] = parentScope;
+      scope.__proto__ = parentScope;
+      return scope;
+    } :
+    function(parentScope, model, scopeName, indexName) {
+      var scope = Object.create(parentScope);
+      Object.defineProperty(scope, scopeName,
+          { value: model, configurable: true, writable: true });
+      Object.defineProperty(scope, indexName,
+          { value: undefined, configurable: true, writable: true });
+      Object.defineProperty(scope, parentScopeName,
+          { value: parentScope, configurable: true, writable: true });
+      return scope;
+    };
 
+  global.PolymerExpressions = PolymerExpressions;
+  PolymerExpressions.getExpression = getExpression;
 })(this);
 
 /*
@@ -3534,7 +3654,7 @@
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 Polymer = {
-  version: '0.3.1-604ba08'
+  version: '0.3.3-0e73963'
 };
 
 /*
@@ -4013,7 +4133,7 @@
       this.async("fire", arguments);
     },
     /**
-      * Remove class from old, add class to anew, if they exist
+      * Remove class from old, add class to anew, if they exist.
       * @param classFollows
       * @param anew A node.
       * @param old A node
@@ -4026,6 +4146,22 @@
       if (anew) {
         anew.classList.add(className);
       }
+    },
+    /**
+      * Inject HTML which contains markup bound to this element into
+      * a target element (replacing target element content).
+      * @param String html to inject
+      * @param Element target element
+      */
+    injectBoundHTML: function(html, element) {
+      var template = document.createElement('template');
+      template.innerHTML = html;
+      var fragment = this.instanceTemplate(template);
+      if (element) {
+        element.textContent = '';
+        element.appendChild(fragment);
+      }
+      return fragment;
     }
   };
 
@@ -4222,15 +4358,44 @@
 
   var empty = [];
 
+  var updateRecord = {
+    object: undefined,
+    type: 'update',
+    name: undefined,
+    oldValue: undefined
+  };
+
+  var numberIsNaN = Number.isNaN || function(value) {
+    return typeof value === 'number' && isNaN(value);
+  }
+
+  function areSameValue(left, right) {
+    if (left === right)
+      return left !== 0 || 1 / left === 1 / right;
+    if (numberIsNaN(left) && numberIsNaN(right))
+      return true;
+
+    return left !== left && right !== right;
+  }
+
+  // capture A's value if B's value is null or undefined,
+  // otherwise use B's value
+  function resolveBindingValue(oldValue, value) {
+    if (value === undefined && oldValue === null) {
+      return value;
+    }
+    return (value === null || value === undefined) ? oldValue : value;
+  }
+
   var properties = {
     createPropertyObserver: function() {
       var n$ = this._observeNames;
       if (n$ && n$.length) {
         var o = this._propertyObserver = new CompoundObserver(true);
-        this.registerObservers([o]);
+        this.registerObserver(o);
         // TODO(sorvell): may not be kosher to access the value here (this[n]);
         // previously we looked at the descriptor on the prototype
-        // this doesn't work for inheritance and not for accessors without 
+        // this doesn't work for inheritance and not for accessors without
         // a value property
         for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
           o.addPath(this, n);
@@ -4297,12 +4462,83 @@
         }
       }
     },
+    emitPropertyChangeRecord: function(name, value, oldValue) {
+      var object = this;
+      if (areSameValue(value, oldValue))
+        return;
+
+      this.propertyChanged_(name, value, oldValue);
+
+      if (!Observer.hasObjectObserve)
+        return;
+
+      var notifier = this.notifier_;
+      if (!notifier)
+        notifier = this.notifier_ = Object.getNotifier(this);
+
+      updateRecord.object = this;
+      updateRecord.name = name;
+      updateRecord.oldValue = oldValue;
+
+      notifier.notify(updateRecord);
+    },
+    bindToAccessor: function(name, observable, resolveFn) {
+      var privateName = name + '_';
+      var privateObservable  = name + 'Observable_';
+
+      this[privateObservable] = observable;
+      var oldValue = this[privateName];
+
+      var self = this;
+      var value = observable.open(function(value, oldValue) {
+        self[privateName] = value;
+        self.emitPropertyChangeRecord(name, value, oldValue);
+      });
+
+      if (resolveFn && !areSameValue(oldValue, value)) {
+        var resolvedValue = resolveFn(oldValue, value);
+        if (!areSameValue(value, resolvedValue)) {
+          value = resolvedValue;
+          if (observable.setValue)
+            observable.setValue(value);
+        }
+      }
+
+      this[privateName] = value;
+      this.emitPropertyChangeRecord(name, value, oldValue);
+
+      var observer = {
+        close: function() {
+          observable.close();
+          self[privateObservable] = undefined;
+        }
+      };
+      this.registerObserver(observer);
+      return observer;
+    },
+    createComputedProperties: function() {
+      if (!this._computedNames) {
+        return;
+      }
+
+      for (var i = 0; i < this._computedNames.length; i++) {
+        var name = this._computedNames[i];
+        var expressionText = this.computed[name];
+        try {
+          var expression = PolymerExpressions.getExpression(expressionText);
+          var observable = expression.getBinding(this, this.element.syntax);
+          this.bindToAccessor(name, observable);
+        } catch (ex) {
+          console.error('Failed to create computed property', ex);
+        }
+      }
+    },
     bindProperty: function(property, observable, oneTime) {
       if (oneTime) {
         this[property] = observable;
         return;
       }
-      return bindProperties(this, property, observable);
+      return this.bindToAccessor(property, observable, resolveBindingValue);
     },
     invokeMethod: function(method, args) {
       var fn = this[method] || method;
@@ -4310,27 +4546,29 @@
         fn.apply(this, args);
       }
     },
-    registerObservers: function(observers) {
-      this._observers = this._observers || [];
-      this._observers.push(observers);
+    registerObserver: function(observer) {
+      if (!this._observers) {
+        this._observers = [observer];
+        return;
+      }
+
+      this._observers.push(observer);
     },
     // observer array items are arrays of observers.
     closeObservers: function() {
       if (!this._observers) {
         return;
       }
-      for (var i=0, l=this._observers.length; i<l; i++) {
-        this.closeObserverArray(this._observers[i]);
-      }
-      this._observers = [];
-    },
-    closeObserverArray: function(observerArray) {
-      for (var i=0, l=observerArray.length, o; i<l; i++) {
-        o = observerArray[i];
-        if (o && o.close) {
-          o.close();
+
+      var observers = this._observers;
+      for (var i = 0; i < observers.length; i++) {
+        var observer = observers[i];
+        if (observer && typeof observer.close == 'function') {
+          observer.close();
         }
       }
+
+      this._observers = [];
     },
     // bookkeeping observers for memory management
     registerNamedObserver: function(name, observer) {
@@ -4355,23 +4593,6 @@
     }
   };
 
-  // property binding
-  // bind a property in A to a path in B by converting A[property] to a
-  // getter/setter pair that accesses B[...path...]
-  function bindProperties(a, property, observable) {
-    // apply Polymer two-way reference binding
-    return Observer.bindToInstance(a, property, observable, resolveBindingValue);
-  }
-
-  // capture A's value if B's value is null or undefined,
-  // otherwise use B's value
-  function resolveBindingValue(oldValue, value) {
-    if (value === undefined && oldValue === null) {
-      return value;
-    }
-    return (value === null || value === undefined) ? oldValue : value;
-  }
-
   // logging
   var LOG_OBSERVE = '[%s] watching [%s]';
   var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';
@@ -4405,7 +4626,10 @@
       var syntax = this.syntax || (!template.bindingDelegate &&
           this.element.syntax);
       var dom = template.createInstance(this, syntax);
-      this.registerObservers(dom.bindings_);
+      var observers = dom.bindings_;
+      for (var i = 0; i < observers.length; i++) {
+        this.registerObserver(observers[i]);
+      }
       return dom;
     },
     bind: function(name, observable, oneTime) {
@@ -4558,6 +4782,7 @@
         return;
       }
       this._readied = true;
+      this.createComputedProperties();
       // TODO(sorvell): We could create an entry point here
       // for the user to compute property values.
       // process declarative resources
@@ -4582,7 +4807,7 @@
       if (this.enteredView) {
         this.enteredView();
       }
-      // NOTE: domReady can be used to access elements in dom (descendants, 
+      // NOTE: domReady can be used to access elements in dom (descendants,
       // ancestors, siblings) such that the developer is enured to upgrade
       // ordering. If the element definitions have loaded, domReady
       // can be used to access upgraded elements.
@@ -4647,7 +4872,7 @@
         // make a shadow root
         var root = this.createShadowRoot();
         // stamp template
-        // which includes parsing and applying MDV bindings before being 
+        // which includes parsing and applying MDV bindings before being
         // inserted (to avoid {{}} in attribute values)
         // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
         var dom = this.instanceTemplate(template);
@@ -4664,17 +4889,17 @@
       if (template) {
         // TODO(sorvell): mark this element as an eventController so that
         // event listeners on bound nodes inside it will be called on it.
-        // Note, the expectation here is that events on all descendants 
+        // Note, the expectation here is that events on all descendants
         // should be handled by this element.
         this.eventController = this;
         // stamp template
-        // which includes parsing and applying MDV bindings before being 
+        // which includes parsing and applying MDV bindings before being
         // inserted (to avoid {{}} in attribute values)
         // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
         var dom = this.instanceTemplate(template);
         // append to shadow dom
         if (refNode) {
-          this.insertBefore(dom, refNode);          
+          this.insertBefore(dom, refNode);
         } else {
           this.appendChild(dom);
         }
@@ -4722,7 +4947,7 @@
 
   // true if object has own PolymerBase api
   function isBase(object) {
-    return object.hasOwnProperty('PolymerBase') 
+    return object.hasOwnProperty('PolymerBase')
   }
 
   // name a base constructor for dev tools
@@ -4730,13 +4955,13 @@
   function PolymerBase() {};
   PolymerBase.prototype = base;
   base.constructor = PolymerBase;
-  
+
   // exports
 
   scope.Base = PolymerBase;
   scope.isBase = isBase;
   scope.api.instance.base = base;
-  
+
 })(Polymer);
 
 /*
@@ -5401,6 +5626,13 @@
           a.push(n);
         }
       }
+      if (prototype.computed) {
+        // construct name list
+        var a = prototype._computedNames = [];
+        for (var n in prototype.computed) {
+          a.push(n);
+        }
+      }
     },
     publishProperties: function(prototype, base) {
       // if we have any properties to publish
@@ -5412,17 +5644,17 @@
         prototype._publishLC = this.lowerCaseMap(publish);
       }
     },
-    // sync prototype to property descriptors; 
-    // desriptor format contains default value and optionally a 
+    // sync prototype to property descriptors;
+    // desriptor format contains default value and optionally a
     // hint for reflecting the property to an attribute.
     // e.g. {foo: 5, bar: {value: true, reflect: true}}
     // reflect: {foo: true} is also supported
-    // 
+    //
     requireProperties: function(propertyDescriptors, prototype, base) {
       // reflected properties
       prototype.reflect = prototype.reflect || {};
       // ensure a prototype value for each property
-      // and update the property's reflect to attribute status 
+      // and update the property's reflect to attribute status
       for (var n in propertyDescriptors) {
         var propertyDescriptor = propertyDescriptors[n];
         var reflects = this.reflectHintForDescriptor(propertyDescriptor);
@@ -5430,12 +5662,12 @@
           prototype.reflect[n] = reflects;
         }
         if (prototype[n] === undefined) {
-          prototype[n] = this.valueForDescriptor(propertyDescriptor); 
+          prototype[n] = this.valueForDescriptor(propertyDescriptor);
         }
       }
     },
     valueForDescriptor: function(propertyDescriptor) {
-      var value = typeof propertyDescriptor === 'object' && 
+      var value = typeof propertyDescriptor === 'object' &&
           propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;
       return value !== undefined ? value : null;
     },
@@ -5453,13 +5685,52 @@
       }
       return map;
     },
+    createPropertyAccessor: function(name) {
+      var proto = this.prototype;
+
+      var privateName = name + '_';
+      var privateObservable  = name + 'Observable_';
+      proto[privateName] = proto[name];
+
+      Object.defineProperty(proto, name, {
+        get: function() {
+          var observable = this[privateObservable];
+          if (observable)
+            observable.deliver();
+
+          return this[privateName];
+        },
+        set: function(value) {
+          var observable = this[privateObservable];
+          if (observable) {
+            observable.setValue(value);
+            return;
+          }
+
+          var oldValue = this[privateName];
+          this[privateName] = value;
+          this.emitPropertyChangeRecord(name, value, oldValue);
+
+          return value;
+        },
+        configurable: true
+      });
+    },
     createPropertyAccessors: function(prototype) {
       var n$ = prototype._publishNames;
       if (n$ && n$.length) {
         for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {
-          Observer.createBindablePrototypeAccessor(prototype, n);
+          this.createPropertyAccessor(n);
         }
       }
+
+      var n$ = prototype._computedNames;
+      if (n$ && n$.length) {
+        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {
+          this.createPropertyAccessor(n);
+        }
+      }
+
     }
   };
 
@@ -5507,11 +5778,24 @@
         for (var i=0, l=names.length, n; i<l; i++) {
           // remove excess ws
           n = names[i].trim();
-          // do not override explicit entries
-          if (n && publish[n] === undefined && base[n] === undefined) {
+          // if the user hasn't specified a value, we want to use the
+          // default, unless a superclass has already chosen one
+          if (n && publish[n] === undefined) {
+            // TODO(sjmiles): querying native properties on IE11 (and possibly
+            // on other browsers) throws an exception because there is no actual
+            // instance.
+            // In fact, trying to publish native properties is known bad for this
+            // and other reasons, and we need to solve this problem writ large.
+            try {
+              var hasValue = (base[n] !== undefined);
+            } catch(x) {
+              hasValue = false;
+            }
             // supply an empty 'descriptor' object and let the publishProperties
             // code determine a default
-            publish[n] = Polymer.nob;
+            if (!hasValue) {
+              publish[n] = Polymer.nob;
+            }
           }
         }
       }
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
index 7be4339..886d173 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
@@ -48,26 +48,26 @@
     "src/lib/auto-binding.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5gCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjhCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
   "sourcesContent": [
-    "/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {};\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      if (inRoot) {\n        var t = inRoot.elementFromPoint(x, y);\n        var st, sr, os;\n        // is element a shadow host?\n        sr = this.targetingShadow(t);\n        while (sr) {\n          // find the the element inside the shadow root\n          st = sr.elementFromPoint(x, y);\n          if (!st) {\n            // check for older shadows\n            sr = this.olderShadow(sr);\n          } else {\n            // shadowed element may contain a shadow root\n            var ssr = this.targetingShadow(st);\n            return this.searchRoot(ssr, x, y) || st;\n          }\n        }\n        // light dom element is the target\n        return t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d > 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while(a && b && a !== b) {\n        a = this.walk(a, 1);\n        b = this.walk(b, 1);\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n",
-    "/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'body /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    }\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n",
+    "/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {\n  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)\n};\nPolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (!scope.hasSDPolyfill && pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findScrollAxis: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n        }\n      } else {\n        n = scope.wrap(inEvent.currentTarget);\n        while(n) {\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n",
+    "/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'body /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var wrap = window.ShadowDOMPolyfill && ShadowDOMPolyfill.wrapIfNeeded || function(e){ return e; };\n\n  var eventFactory = scope.eventFactory;\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      this.gestures.push(source);\n    },\n    register: function(element) {\n      // NOTE: Work around for #4, don't add listeners to individual Polymer elmenets in SD Polyfill\n      if (window.ShadowDOMPolyfill && element !== document) {\n        return;\n      }\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      events.forEach(function(e) {\n        this.addEvent(target, e);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      events.forEach(function(e) {\n        this.removeEvent(target, e);\n      }, this);\n    },\n    addEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (window.ShadowDOMPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (window.ShadowDOMPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          if (g.events.indexOf(e.type) >= 0) {\n            g[e.type].call(g, e);\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = dispatcher.register.bind(dispatcher);\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  var hasSDPolyfill = scope.hasSDPolyfill;\n  var wrap = scope.wrap;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      this.gestures.push(source);\n    },\n    register: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          fn = g[e.type];\n          if (fn) {\n            fn.call(g, e);\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = function(root) {\n    dispatcher.register(root);\n  };\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n  scope.wrap = wrap;\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = e.target;\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  var HAS_TOUCH_ACTION = typeof document.head.style.touchAction === 'string';\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (HAS_TOUCH_ACTION) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = false;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        return scope.findTarget(touch);\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = this.findTarget(inTouch, id);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t; i < tl.length; i++) {\n        t = tl[i];\n        inFunction.call(this, this.touchToPointer(t));\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = inEvent.currentTarget._scrollType;\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        this.firstXY = null;\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value.out;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(this.cancelOut, this);\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      var p = pointermap.set(inPointer.pointerId, inPointer.target);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        this.processTouches(inEvent, this.move);\n      } else {\n        if (!this.scrolling) {\n          if (this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n            this.touchcancel(inEvent);\n          } else {\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      var pointer = pointermap.get(inPointer.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      if (!this.scrolling) {\n        inPointer.relatedTarget = scope.findTarget(inPointer);\n        dispatcher.up(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    cancel: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.cancel(inPointer);\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!HAS_TOUCH_ACTION) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      if (HAS_BITMAP_TYPE) {\n        e = dispatcher.cloneEvent(inEvent);\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = e.target;\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = e.target;\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      return dispatcher.cloneEvent(inEvent);\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = e.target;\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = e.target;\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.wrap(scope.findTarget(inEvent));\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  // maybe one day...\n  // var CAN_USE_GLOBAL = ATTRIB in document.head.style;\n  var CAN_USE_GLOBAL = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: scope.wrap(this.currentTouchEvent.target)\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = scope.wrap(this.findTarget(inTouch, id));\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = scope.targetFinding.findScrollAxis(inEvent);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (CAN_USE_GLOBAL) {\n        this.processTouches(inEvent, this.move);\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.wrap(scope.findTarget(inPointer));\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!CAN_USE_GLOBAL) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (window.navigator.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  dispatcher.register(document);\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId\n       });\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class released\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n",
-    "/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, property;\n\n        expr = parsePrimaryExpression();\n\n        while (match('.') || match('[')) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n",
-    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (accessor == '[' && !(property instanceof Literal));\n\n    // convert literal computed property access where literal value is a value\n    // path to ident dot-access.\n    if (accessor == '[' &&\n        property instanceof Literal &&\n        Path.get(property.value).valid) {\n      accessor = '.';\n      property = new IdentPath(property.value);\n    }\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        property instanceof IdentPath &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = accessor == '.' ? property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n        var last = this.object instanceof IdentPath ?\n            this.object.name : this.object.fullPath;\n        this.fullPath_ = Path.get(last + '.' + this.property.name);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (this.property instanceof IdentPath) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\n            var propName = property(model, observer);\n            if (observer)\n              observer.addPath(context, propName);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(value, toModelDirection, filterRegistry, model,\n                        observer) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('No ' + (toModelDirection ? 'toModel' : 'toDOM') +\n                      ' found on' + this.name);\n        return;\n      }\n\n      var args = [value];\n      for (var i = 0; i < this.args.length; i++) {\n        args[i + 1] = getFn(this.args[i])(model, observer);\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer) {\n        return unaryOperators[op](argument(model, observer));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer) {\n        return binaryOperators[op](left(model, observer),\n                                   right(model, observer));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer) {\n        return test(model, observer) ?\n            consequent(model, observer) : alternate(model, observer);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] = properties[i].value(model, observer);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(value, false, filterRegistry, model,\n                                          observer);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(newValue, true, filterRegistry,\n                                                 model);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        var scope = Object.create(parentScope);\n        scope[scopeName] = model;\n        scope[indexName] = undefined;\n        scope[parentScopeName] = parentScope;\n        return scope;\n      };\n    }\n  };\n\n  global.PolymerExpressions = PolymerExpressions;\n  if (global.exposeGetExpression)\n    global.getExpression_ = getExpression;\n\n})(this);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.3.1-604ba08'\n};\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       });\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n",
+    "/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n",
+    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.3.3-0e73963'\n};\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n",
@@ -75,19 +75,19 @@
     "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail || {};\n      var event = new CustomEvent(type, {\n        bubbles: (bubbles !== undefined ? bubbles : true), \n        cancelable: (cancelable !== undefined ? cancelable : true), \n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail || {};\n      var event = new CustomEvent(type, {\n        bubbles: (bubbles !== undefined ? bubbles : true), \n        cancelable: (cancelable !== undefined ? cancelable : true), \n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        this.addEventListener(type, this.element.getEventHandler(this, this,\n                                                                 methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n})(Polymer);\n",
     "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObservers([o]);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without \n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return bindProperties(this, property, observable);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObservers: function(observers) {\n      this._observers = this._observers || [];\n      this._observers.push(observers);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n      for (var i=0, l=this._observers.length; i<l; i++) {\n        this.closeObserverArray(this._observers[i]);\n      }\n      this._observers = [];\n    },\n    closeObserverArray: function(observerArray) {\n      for (var i=0, l=observerArray.length, o; i<l; i++) {\n        o = observerArray[i];\n        if (o && o.close) {\n          o.close();\n        }\n      }\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // property binding\n  // bind a property in A to a path in B by converting A[property] to a\n  // getter/setter pair that accesses B[...path...]\n  function bindProperties(a, property, observable) {\n    // apply Polymer two-way reference binding\n    return Observer.bindToInstance(a, property, observable, resolveBindingValue);\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      this.registerObservers(dom.bindings_);\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      // TODO (sorvell): temporarily open observer when created\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants, \n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being \n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants \n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being \n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);          \n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up polymer gestures\n      PolymerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase') \n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n  \n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n  \n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      // TODO (sorvell): temporarily open observer when created\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up polymer gestures\n      PolymerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (window.ShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      scope._scopeStyles[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      scope._scopeStyles = scope._scopeStyles || {};\n      return scope._scopeStyles[name];\n    }\n  };\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (window.ShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        node.addEventListener(eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            node.removeEventListener(eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    // sync prototype to property descriptors; \n    // desriptor format contains default value and optionally a \n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    // \n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status \n      for (var n in propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor); \n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' && \n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          Observer.createBindablePrototypeAccessor(prototype, n);\n        }\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // do not override explicit entries\n          if (n && publish[n] === undefined && base[n] === undefined) {\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            publish[n] = Polymer.nob;\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    // sync prototype to property descriptors;\n    // desriptor format contains default value and optionally a\n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    //\n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor);\n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' &&\n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // if the user hasn't specified a value, we want to use the\n          // default, unless a superclass has already chosen one\n          if (n && publish[n] === undefined) {\n            // TODO(sjmiles): querying native properties on IE11 (and possibly\n            // on other browsers) throws an exception because there is no actual\n            // instance.\n            // In fact, trying to publish native properties is known bad for this\n            // and other reasons, and we need to solve this problem writ large.\n            try {\n              var hasValue = (base[n] !== undefined);\n            } catch(x) {\n              hasValue = false;\n            }\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            if (!hasValue) {\n              publish[n] = Polymer.nob;\n            }\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && Platform.templateContent(template);\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (window.ShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      var shouldAdd = (this.indexOf(element) === -1 && \n          flushQueue.indexOf(element) === -1);\n      if (shouldAdd) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\n    },\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n    flush: function() {\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__go.call(element);\n        element.__check = element.__go = null;\n      }\n    },\n    ready: function() {\n      this.flush();\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    waitToReady: true\n  };\n\n  var flushQueue = [];\n\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n",
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js b/pkg/polymer/lib/src/js/polymer/polymer.js
index 9691d8b..4882e7f 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js
@@ -7,7 +7,8 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version: 0.3.1-604ba08
-window.PolymerGestures={},function(a){var b={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d}e=this.olderShadow(e)}return f}},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=this.walk(a,1),b=this.walk(b,1);return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=b,a.findTarget=b.findTarget.bind(b),a.deepContains=b.deepContains.bind(b),a.insideNode=b.insideNode}(window.PolymerGestures),function(){function a(a){return"body /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],e="",f=(document.head,"string"==typeof document.head.style.touchAction),g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],d[c]=b[c];return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=0;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp","preventTap","tapPrevented"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0,function(){},!1],d="undefined"!=typeof SVGElementInstance,e=window.ShadowDOMPolyfill&&ShadowDOMPolyfill.wrapIfNeeded||function(a){return a},f=a.eventFactory,g={pointermap:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){this.gestures.push(b)},register:function(a){if(!window.ShadowDOMPolyfill||a===document)for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a)},cancel:function(a){a.tapPrevented=!0,this.fireEvent("up",a)},eventHandler:function(a){if(!a._handledByPG){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPG=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){window.ShadowDOMPolyfill?a.addEventListener_(b,this.boundHandler):a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){window.ShadowDOMPolyfill?a.removeEventListener_(b,this.boundHandler):a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){var c=f.makePointerEvent(a,b);return c.preventDefault=b.preventDefault,c.tapPrevented=b.tapPrevented,c._target=c._target||b.target,c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var f,g=Object.create(null),h=0;h<b.length;h++)f=b[h],g[f]=a[f]||c[h],("target"===f||"relatedTarget"===f)&&(d&&g[f]instanceof SVGElementInstance&&(g[f]=g[f].correspondingUseElement),g[f]=e(g[f]));return g.preventDefault=a.preventDefault,g},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=b,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b=0;b<this.gestureQueue.length;b++){a=this.gestureQueue[b];for(var c,d=0;d<this.gestures.length;d++)c=this.gestures[d],c.events.indexOf(a.type)>=0&&c[a.type].call(c,a)}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),this.gestureQueue.push(a)}};g.boundHandler=g.eventHandler.bind(g),g.boundGestureTrigger=g.gestureTrigger.bind(g),a.dispatcher=g,a.register=g.register.bind(g),a.unregister=g.unregister.bind(g)}(window.PolymerGestures),function(a){function b(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),g&&(this.observer=new g(this.mutationWatcher.bind(this)))}var c=Array.prototype.forEach.call.bind(Array.prototype.forEach),d=Array.prototype.map.call.bind(Array.prototype.map),e=Array.prototype.slice.call.bind(Array.prototype.slice),f=Array.prototype.filter.call.bind(Array.prototype.filter),g=window.MutationObserver||window.WebKitMutationObserver,h="[touch-action]",i={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};b.prototype={watchSubtree:function(b){a.targetFinding.canTarget(b)&&this.observer.observe(b,i)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){c(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(h):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(e(b))},installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){var b=d(a,this.findElements,this);return b.push(f(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}},g||(b.prototype.watchSubtree=function(){console.warn("PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected")}),a.Installer=b}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=!1;try{f=1===new MouseEvent("test",{buttons:1}).buttons}catch(g){}var h={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,f||(c.buttons=e[c.which]||0),c},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.has(this.POINTER_ID);d&&this.mouseup(a);var e=this.prepareEvent(a);c.set(this.POINTER_ID,e.target),b.down(e)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=this.prepareEvent(a);d.target=c.get(this.POINTER_ID),b.move(d)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=this.prepareEvent(a);d.relatedTarget=d.target,d.target=c.get(this.POINTER_ID),b.up(d),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b,c=a.dispatcher,d=a.targetFinding.allShadows.bind(a.targetFinding),e=c.pointermap,f=(Array.prototype.map.call.bind(Array.prototype.map),2500),g=200,h="touch-action",i="string"==typeof document.head.style.touchAction,j={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){i?c.listen(a,this.events):b.enableOnSubtree(a)},unregister:function(a){i&&c.unlisten(a,this.events)},elementAdded:function(a){var b=a.getAttribute(h),e=this.touchActionToScrollType(b);e&&(a._scrollType=e,c.listen(a,this.events),d(a).forEach(function(a){a._scrollType=e,c.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,c.unlisten(a,this.events),d(a).forEach(function(a){a._scrollType=void 0,c.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(h),e=this.touchActionToScrollType(c),f=this.touchActionToScrollType(b);e&&f?(a._scrollType=e,d(a).forEach(function(a){a._scrollType=e},this)):f?this.elementRemoved(a):e&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===e.pointers()||1===e.pointers()&&e.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,g)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,c){return"touchstart"===this.currentTouchEvent.type?a.findTarget(b):e.get(c)},touchToPointer:function(a){var b=this.currentTouchEvent,d=c.cloneEvent(a),e=d.pointerId=a.identifier+2;d.target=this.findTarget(a,e),d.bubbles=!0,d.cancelable=!0,d.detail=this.clickCount,d.buttons=this.typeToButtons(b.type),d.width=a.webkitRadiusX||a.radiusX||0,d.height=a.webkitRadiusY||a.radiusY||0,d.pressure=a.webkitForce||a.force||.5,d.isPrimary=this.isPrimaryTouch(a),d.pointerType=this.POINTER_TYPE;var f=this;return d.preventDefault=function(){f.scrolling=!1,f.firstXY=null,b.preventDefault()},d},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)b=!1;else if("XY"===c)b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(e.pointers()>=b.length){var c=[];e.forEach(function(a,d){if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){e.set(a.pointerId,a.target);c.down(a)},touchmove:function(a){i?this.processTouches(a,this.move):this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.move)))},move:function(a){var b=e.get(a.pointerId);b&&c.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(b){this.scrolling||(b.relatedTarget=a.findTarget(b),c.up(b)),this.cleanUpPointer(b)},cancel:function(b){b.relatedTarget=a.findTarget(b),c.cancel(b),this.cleanUpPointer(b)},touchcancel:function(a){this.processTouches(a,this.cancel)},cleanUpPointer:function(a){e["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,d=b.changedTouches[0];if(this.isPrimaryTouch(d)){var e={x:d.clientX,y:d.clientY};c.push(e);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,e);setTimeout(g,f)}}};i||(b=new a.Installer(j.elementAdded,j.elementRemoved,j.elementChanged,j)),a.touchEvents=j}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return d&&(c=b.cloneEvent(a),c.pointerType=this.POINTER_TYPES[a.pointerType]),c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(a){var d=this.prepareEvent(a);c.set(a.pointerId,d.target),b.down(d)},MSPointerMove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},MSPointerUp:function(a){var d=this.prepareEvent(a);d.relatedTarget=d.target,d.target=c.get(d.pointerId),b.up(d),this.cleanup(a.pointerId)},MSPointerCancel:function(a){var d=this.prepareEvent(a);d.relatedTarget=d.target,d.target=c.get(d.pointerId),b.cancel(d),this.cleanup(a.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){return b.cloneEvent(a)},register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(a){var d=this.prepareEvent(a);c.set(d.pointerId,d.target),b.down(d)},pointermove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},pointerup:function(a){var d=this.prepareEvent(a);d.relatedTarget=d.target,d.target=c.get(d.pointerId),b.up(d),this.cleanup(a.pointerId)},pointercancel:function(a){var d=this.prepareEvent(a);d.relatedTarget=d.target,d.target=c.get(d.pointerId),b.cancel(d),this.cleanup(a.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher;window.PointerEvent?b.registerSource("pointer",a.pointerEvents):window.navigator.msPointerEnabled?b.registerSource("ms",a.msEvents):(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents)),b.register(document)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);g.x&&(e.xDirection=this.clampDir(g.x)),g.y&&(e.yDirection=this.clampDir(g.y));var h=c.makeGestureEvent(a,{bubbles:!0,cancelable:!0,dx:f.x,dy:f.y,ddx:g.x,ddy:g.y,x:b.x,y:b.y,clientX:b.clientX,clientY:b.clientY,pageX:b.pageX,pageY:b.pageY,screenX:b.screenX,screenY:b.screenY,xDirection:e.xDirection,yDirection:e.yDirection,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId});e.downTarget.dispatchEvent(h)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(b.tracking)this.fireTrack("track",a,b);else{var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,this.fireTrack("trackstart",b.downEvent,b),this.fireTrack("track",a,b))}b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d.delete(a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["down","move","up"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},down:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},up:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},move:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,b){var d={bubbles:!0,cancelable:!0,pointerType:this.heldPointer.pointerType,pointerId:this.heldPointer.pointerId,x:this.heldPointer.clientX,y:this.heldPointer.clientY};b&&(d.holdTime=b);var e=c.makeGestureEvent(a,d);this.target.dispatchEvent(e)}};b.registerGesture("hold",d)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){return"mouse"===a.pointerType?1===b.buttons:!a.tapPrevented},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey});f.dispatchEvent(g)}}d.delete(b.pointerId)}};c.preventTap=function(a){return function(){a.tapPrevented=!0,d.delete(a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b;for(a=C();v(".")||v("[");)v("[")?(b=G(),a=Z.createMemberExpression("[",a,b)):(b=F(),a=Z.createMemberExpression(".",a,b));return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=q[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),q[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){this.dynamicDeps="function"==typeof a||a.dynamicDeps||"["==c&&!(b instanceof d),"["==c&&b instanceof d&&Path.get(b.value).valid&&(c=".",b=new e(b.value)),this.simplePath=!this.dynamicDeps&&b instanceof e&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property="."==c?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a,b){for(;a[t]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[t];return a}function o(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function p(){}var q=Object.create(null);d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=n(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof e?this.object.name:this.object.fullPath;this.fullPath_=Path.get(a+"."+this.property.name)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.property instanceof e){var b=Path.get(this.property.name);this.valueFn_=function(c,d){var e=a(c,d);return d&&d.addPath(e,b),b.getValueFrom(e)}}else{var c=this.property;this.valueFn_=function(b,d){var e=a(b,d),f=c(b,d);return d&&d.addPath(e,f),e?e[f]:void 0}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=d;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find filter: "+this.name);if(b?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("No "+(b?"toModel":"toDOM")+" found on"+this.name);
-for(var h=[a],j=0;j<this.args.length;j++)h[j+1]=i(this.args[j])(d,e);return f.apply(g,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d){return r[a](b(c,d))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);return b=i(b),c=i(c),function(d,e){return s[a](b(d,e),c(d,e))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),function(d,e){return a(d,e)?b(d,e):c(d,e)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c){for(var d=[],e=0;e<a.length;e++)d.push(a[e](b,c));return d}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c){for(var d={},e=0;e<a.length;e++)d[a[e].key]=a[e].value(b,c);return d}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b),e=0;e<this.filters.length;e++)d=this.filters[e].transform(d,!1,c,a,b);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(b,!0,c,a);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){var e=Object.create(c);return e[b]=a,e[d]=void 0,e[t]=c,e}}}},a.PolymerExpressions=p,a.exposeGetExpression&&(a.getExpression_=c)}(this),Polymer={version:"0.3.1-604ba08"},"function"==typeof window.Polymer&&(Polymer={}),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}a.extend=b}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(){var a={};HTMLElement.register=function(b,c){a[b]=c},HTMLElement.getPrototypeForTag=function(b){var c=b?a[b]:HTMLElement.prototype;return c||Object.getPrototypeOf(document.createElement(b))};var b=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,b.apply(this,arguments)}}(Polymer),function(a){function b(a){var e=b.caller,g=e.nom,h=e._super;h||(g||(g=e.nom=c.call(this,e)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(e,g,f(this)));var i=h[g];return i?(i._super||d(i,g,h),i.apply(this,a||[])):void 0}function c(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function d(a,b,c){var d=e(c,b,a);return d[b]&&(d[b].nom=b),a._super=d}function e(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}return Object}function f(a){return a.__proto__}a.super=b}(Polymer),function(a){function b(a,b){var d=typeof b;return b instanceof Date&&(d="date"),c[d](a,b)}var c={string:function(a){return a},date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=b}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=b||{},g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];this.addEventListener(c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b,d){return Observer.bindToInstance(a,b,d,c)}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObservers([b]);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a,b){this.invokeMethod(e,[b])},this),this.registerNamedObserver(a+"__array",f)}},bindProperty:function(a,c,d){return d?void(this[a]=c):b(this,a,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObservers:function(a){this._observers=this._observers||[],this._observers.push(a)},closeObservers:function(){if(this._observers){for(var a=0,b=this._observers.length;b>a;a++)this.closeObserverArray(this._observers[a]);this._observers=[]}},closeObserverArray:function(a){for(var b,c=0,d=a.length;d>c;c++)b=a[c],b&&b.close&&b.close()},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a in this._namedObservers)this.closeNamedObserver(a);this._namedObservers={}}}};a.api.instance.properties=e}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b);return this.registerObservers(c.bindings_),c},bind:function(a,b,c){var d=this.propertyForAttribute(a);if(d){var e=this.bindProperty(d,b,c);return Platform.enableBindingsReflection&&e&&(e.path=b.path_,this._recordBinding(d,e)),this.reflect[d]&&this.reflectPropertyToAttribute(d),e}return this.mixinSuper(arguments)},bindFinished:function(){this.makeElementReady()},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},asyncUnbindAll:function(){this._unbound||(b.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){this._unbound||(this.closeObservers(),this.closeNamedObservers(),this._unbound=!0)},cancelUnbindAll:function(){return this._unbound?void(b.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(b.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},d=/\{\{([^{}]*)}}/;a.bindPattern=d,a.api.instance.mdv=c}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d={PolymerBase:!0,job:function(a,b,c){if("string"!=typeof a)return Polymer.job.call(this,a,b,c);var d="___"+a;this[d]=Polymer.job.call(this,this[d],b,c)},"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.templateInstance&&this.templateInstance.model&&console.warn("Attributes on "+this.localName+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."),this.created(),this.prepareElement(),(!this.ownerDocument.isStagingDocument||window.ShadowDOMPolyfill)&&this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a),PolymerGestures.register(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},"element"),e="controller",f={STYLE_SCOPE_ATTRIBUTE:d,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(e),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,d){if(b=b||this.findStyleScope(),d=d||"",b){window.ShadowDOMPolyfill&&(a=c(a,b.host));var f=this.element.cssTextToScopeStyle(a,e);Polymer.applyStyleToScope(f,b),b._scopeStyles[this.localName+d]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){return a._scopeStyles=a._scopeStyles||{},a._scopeStyles[b]}};a.api.instance.styles=f}(Polymer),function(a){function b(a,b){if(1===arguments.length&&"string"!=typeof arguments[0]){b=a;var c=document._currentScript;if(a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a);var j=Platform.deliverDeclarations();if(j)for(var k,l=0,m=j.length;m>l&&(k=j[l]);l++)b.apply(null,k)}(Polymer),function(a){var b={resolveElementPaths:function(a){Platform.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){b===document&&(b=document.head),window.ShadowDOMPolyfill&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",i=document.head.querySelectorAll(g);i.length&&(f=i[i.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return p?p.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i="style",j="@import",k="link[rel=stylesheet]",l="global",m="polymer-scope",n={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Platform.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(k),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(i),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(j)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(k),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(i+"["+m+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(m)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(l);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+m+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},o=HTMLElement.prototype,p=o.matches||o.matchesSelector||o.webkitMatchesSelector||o.mozMatchesSelector;a.api.declaration.styles=n,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return d.addEventListener(c,h),f?void 0:{open:g,discardChanges:g,close:function(){d.removeEventListener(c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c],e=this.reflectHintForDescriptor(d);void 0===b.reflect[c]&&void 0!==e&&(b.reflect[c]=e),void 0===b[c]&&(b[c]=this.valueForDescriptor(d))}},valueForDescriptor:function(a){var b="object"==typeof a&&a?a.value:a;return void 0!==b?b:null},reflectHintForDescriptor:function(a){return"object"==typeof a&&a&&void 0!==a.reflect?a.reflect:void 0},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)Observer.createBindablePrototypeAccessor(a,c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a,d){var e=this.getAttribute(b);if(e)for(var f,g=a.publish||(a.publish={}),h=e.split(c),i=0,j=h.length;j>i;i++)f=h[i].trim(),f&&void 0===g[f]&&void 0===d[f]&&(g[f]=Polymer.nob)},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&Platform.templateContent(a)},installBindingDelegate:function(a){a&&(a.bindingDelegate=this.syntax)}};a.api.declaration.mdv=e}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),window.ShadowDOMPolyfill&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),g[a]=b}return b},findBasePrototype:function(a){return g[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},g={};f.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=f}(Polymer),function(a){function b(a){return document.contains(a)?h:g}function c(){return g.length?g[0]:h[0]}function d(a){e.waitToReady=!0,CustomElements.ready=!1,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a,b,c){var d=-1===this.indexOf(a)&&-1===f.indexOf(a);return d&&(this.add(a),a.__check=b,a.__go=c),0!==this.indexOf(a)},add:function(a){b(a).push(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?g.length:1e9),c},go:function(a){var b=this.remove(a);b&&(this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){return!g.length&&!h.length},addToFlushQueue:function(a){f.push(a)},flush:function(){for(var a;f.length;)a=f.shift(),a.__go.call(a),a.__check=a.__go=null},ready:function(){this.flush(),CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&i.push(a)},flushReadyCallbacks:function(){if(i)for(var a;i.length;)(a=i.shift())()},waitToReady:!0},f=[],g=[],h=[],i=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.queue=e,a.whenPolymerReady=d}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenPolymerReady;a.import=c,a.importElements=b}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenPolymerReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this.extends=this.getAttribute("extends"),this.loadResources(),this.registerWhenReady()},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){if(this.hasAttribute("noscript")&&!this.noscript)if(this.noscript=!0,window.CustomElements&&!CustomElements.useNative)Polymer(a);else{var b=document.createElement("script");b.textContent="Polymer('"+a+"');",this.appendChild(b)}},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.wait(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
+// @version: 0.3.3-0e73963
+window.PolymerGestures={hasSDPolyfill:Boolean(window.ShadowDOMPolyfill)},PolymerGestures.wrap=PolymerGestures.hasSDPolyfill?ShadowDOMPolyfill.wrapIfNeeded:function(a){return a},function(a){var b=!1,c=document.createElement("meta");if(!a.hasSDPolyfill&&c.createShadowRoot){var d=c.createShadowRoot(),e=document.createElement("span");d.appendChild(e),c.addEventListener("testpath",function(a){a.path&&(b=a.path[0]===e),a.stopPropagation()});var f=new CustomEvent("testpath",{bubbles:!0});document.head.appendChild(c),e.dispatchEvent(f),c.parentNode.removeChild(c),d=e=null}c=null;var g={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){var d,e;return a?(d=a.elementFromPoint(b,c),d?e=this.targetingShadow(d):a!==document&&(e=this.olderShadow(a)),this.searchRoot(e,b,c)||d):void 0},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){if(b&&a.path)return a.path[0];var c=a.clientX,d=a.clientY,e=this.owner(a.target);return e.elementFromPoint(c,d)||(e=document),this.searchRoot(e,c,d)},findScrollAxis:function(c){var d;if(b&&c.path){for(var e=c.path,f=0;f<e.length;f++)if(d=e[f],d._scrollType)return d._scrollType}else for(d=a.wrap(c.currentTarget);d;){if(d._scrollType)return d._scrollType;d=d.parentNode||d.host}},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>=0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=a.parentNode||a.host,b=b.parentNode||b.host;return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=g,a.findTarget=g.findTarget.bind(g),a.deepContains=g.deepContains.bind(g),a.insideNode=g.insideNode}(window.PolymerGestures),function(){function a(a){return"body /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]},"manipulation"],e="",f=(document.head,"string"==typeof document.head.style.touchAction),g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],d[c]=b[c];return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=0;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f._source=d._source||"",f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp","preventTap","tapPrevented","_source"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0,function(){},!1],d="undefined"!=typeof SVGElementInstance,e=a.eventFactory,f=a.hasSDPolyfill,g=a.wrap,h={pointermap:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){this.gestures.push(b)},register:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a)},cancel:function(a){a.tapPrevented=!0,this.fireEvent("up",a)},eventHandler:function(a){if(!a._handledByPG){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPG=!0}},listen:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.addEvent(a,c)},unlisten:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.removeEvent(a,c)},addEvent:function(a,b){f?a.addEventListener_(b,this.boundHandler):a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){f?a.removeEventListener_(b,this.boundHandler):a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){var c=e.makePointerEvent(a,b);return c.preventDefault=b.preventDefault,c.tapPrevented=b.tapPrevented,c._target=c._target||b.target,c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var e,f=Object.create(null),h=0;h<b.length;h++)e=b[h],f[e]=a[e]||c[h],("target"===e||"relatedTarget"===e)&&(d&&f[e]instanceof SVGElementInstance&&(f[e]=f[e].correspondingUseElement),f[e]=g(f[e]));return f.preventDefault=a.preventDefault,f},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=b,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b=0;b<this.gestureQueue.length;b++){a=this.gestureQueue[b];for(var c,d,e=0;e<this.gestures.length;e++)c=this.gestures[e],d=c[a.type],d&&d.call(c,a)}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),this.gestureQueue.push(a)}};h.boundHandler=h.eventHandler.bind(h),h.boundGestureTrigger=h.gestureTrigger.bind(h),a.dispatcher=h,a.register=function(a){h.register(a)},a.unregister=h.unregister.bind(h),a.wrap=g}(window.PolymerGestures),function(a){function b(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),g&&(this.observer=new g(this.mutationWatcher.bind(this)))}var c=Array.prototype.forEach.call.bind(Array.prototype.forEach),d=Array.prototype.map.call.bind(Array.prototype.map),e=Array.prototype.slice.call.bind(Array.prototype.slice),f=Array.prototype.filter.call.bind(Array.prototype.filter),g=window.MutationObserver||window.WebKitMutationObserver,h="[touch-action]",i={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};b.prototype={watchSubtree:function(b){a.targetFinding.canTarget(b)&&this.observer.observe(b,i)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){c(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(h):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(e(b))},installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){var b=d(a,this.findElements,this);return b.push(f(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}},g||(b.prototype.watchSubtree=function(){console.warn("PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected")}),a.Installer=b}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=!1;try{f=1===new MouseEvent("test",{buttons:1}).buttons}catch(g){}var h={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],register:function(a){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",f||(c.buttons=e[c.which]||0),c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=c.has(this.POINTER_ID);e&&this.mouseup(d);var f=this.prepareEvent(d);f.target=a.wrap(a.findTarget(d)),c.set(this.POINTER_ID,f.target),b.down(f)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=this.prepareEvent(a);d.target=c.get(this.POINTER_ID),b.move(d)}},mouseup:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(this.POINTER_ID),b.up(e),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b,c=a.dispatcher,d=a.targetFinding.allShadows.bind(a.targetFinding),e=c.pointermap,f=(Array.prototype.map.call.bind(Array.prototype.map),2500),g=200,h=20,i="touch-action",j=!1,k={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){j?c.listen(a,this.events):b.enableOnSubtree(a)},unregister:function(a){j&&c.unlisten(a,this.events)},elementAdded:function(a){var b=a.getAttribute(i),e=this.touchActionToScrollType(b);e&&(a._scrollType=e,c.listen(a,this.events),d(a).forEach(function(a){a._scrollType=e,c.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,c.unlisten(a,this.events),d(a).forEach(function(a){a._scrollType=void 0,c.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(i),e=this.touchActionToScrollType(c),f=this.touchActionToScrollType(b);e&&f?(a._scrollType=e,d(a).forEach(function(a){a._scrollType=e},this)):f?this.elementRemoved(a):e&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===e.pointers()||1===e.pointers()&&e.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=null,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,g)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,c){if("touchstart"===this.currentTouchEvent.type){if(this.isPrimaryTouch(b)){var d={clientX:b.clientX,clientY:b.clientY,path:this.currentTouchEvent.path,target:a.wrap(this.currentTouchEvent.target)};return a.findTarget(d)}return a.findTarget(b)}return e.get(c)},touchToPointer:function(b){var d=this.currentTouchEvent,e=c.cloneEvent(b),f=e.pointerId=b.identifier+2;e.target=a.wrap(this.findTarget(b,f)),e.bubbles=!0,e.cancelable=!0,e.detail=this.clickCount,e.buttons=this.typeToButtons(d.type),e.width=b.webkitRadiusX||b.radiusX||0,e.height=b.webkitRadiusY||b.radiusY||0,e.pressure=b.webkitForce||b.force||.5,e.isPrimary=this.isPrimaryTouch(b),e.pointerType=this.POINTER_TYPE,e._source="touch";var g=this;return e.preventDefault=function(){g.scrolling=!1,g.firstXY=null,d.preventDefault()},e},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,f,g=0;g<c.length;g++)d=c[g],f=this.touchToPointer(d),"touchstart"===a.type&&e.set(f.pointerId,f.target),e.has(f.pointerId)&&b.call(this,f),("touchend"===a.type||a._cancel)&&this.cleanUpPointer(f)},shouldScroll:function(b){if(this.firstXY){var c,d=a.targetFinding.findScrollAxis(b);if("none"===d)c=!1;else if("XY"===d)c=!0;else{var e=b.changedTouches[0],f=d,g="Y"===d?"X":"Y",h=Math.abs(e["client"+f]-this.firstXY[f]),i=Math.abs(e["client"+g]-this.firstXY[g]);c=h>=i}return c}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(e.pointers()>=b.length){var c=[];e.forEach(function(a,d){if(1!==d&&!this.findTouch(b,d-2)){var e=a;c.push(e)}},this),c.forEach(function(a){this.cancel(a),e.delete(a.pointerId)})}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){c.down(a)},touchmove:function(a){if(j)this.processTouches(a,this.move);else if(this.scrolling){if(this.firstXY){var b=a.changedTouches[0],c=b.clientX-this.firstXY.X,d=b.clientY-this.firstXY.Y,e=Math.sqrt(c*c+d*d);e>=h&&(this.touchcancel(a),this.scrolling=!0,this.firstXY=null)}}else null===this.scrolling&&this.shouldScroll(a)?this.scrolling=!0:(this.scrolling=!1,a.preventDefault(),this.processTouches(a,this.move))},move:function(a){c.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(b){b.relatedTarget=a.wrap(a.findTarget(b)),c.up(b)},cancel:function(a){c.cancel(a)},touchcancel:function(a){a._cancel=!0,this.processTouches(a,this.cancel)},cleanUpPointer:function(a){e["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,d=b.changedTouches[0];if(this.isPrimaryTouch(d)){var e={x:d.clientX,y:d.clientY};c.push(e);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,e);setTimeout(g,f)}}};j||(b=new a.Installer(k.elementAdded,k.elementRemoved,k.elementChanged,k)),a.touchEvents=k}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return c=b.cloneEvent(a),d&&(c.pointerType=this.POINTER_TYPES[a.pointerType]),c._source="ms",c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(d){var e=this.prepareEvent(d);e.target=a.wrap(a.findTarget(d)),c.set(d.pointerId,e.target),b.down(e)},MSPointerMove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},MSPointerUp:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},MSPointerCancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){var c=b.cloneEvent(a);return c._source="pointer",c},register:function(a){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(d){var e=this.prepareEvent(d);e.target=a.wrap(a.findTarget(d)),c.set(e.pointerId,e.target),b.down(e)},pointermove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},pointerup:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},pointercancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher;window.PointerEvent?b.registerSource("pointer",a.pointerEvents):window.navigator.msPointerEnabled?b.registerSource("ms",a.msEvents):(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents)),b.register(document)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);g.x&&(e.xDirection=this.clampDir(g.x)),g.y&&(e.yDirection=this.clampDir(g.y));var h=c.makeGestureEvent(a,{bubbles:!0,cancelable:!0,dx:f.x,dy:f.y,ddx:g.x,ddy:g.y,x:b.x,y:b.y,clientX:b.clientX,clientY:b.clientY,pageX:b.pageX,pageY:b.pageY,screenX:b.screenX,screenY:b.screenY,xDirection:e.xDirection,yDirection:e.yDirection,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId,_source:"track"});e.downTarget.dispatchEvent(h)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(b.tracking)this.fireTrack("track",a,b);else{var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,this.fireTrack("trackstart",b.downEvent,b),this.fireTrack("track",a,b))}b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d.delete(a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["down","move","up"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},down:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},up:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},move:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,b){var d={bubbles:!0,cancelable:!0,pointerType:this.heldPointer.pointerType,pointerId:this.heldPointer.pointerId,x:this.heldPointer.clientX,y:this.heldPointer.clientY,_source:"hold"};b&&(d.holdTime=b);var e=c.makeGestureEvent(a,d);this.target.dispatchEvent(e)}};b.registerGesture("hold",d)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){return"mouse"===a.pointerType?1===b.buttons:!a.tapPrevented},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey,_source:"tap"});f.dispatchEvent(g)}}d.delete(b.pointerId)}};c.preventTap=function(a){return function(){a.tapPrevented=!0,d.delete(a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b,c;for(a=C();;)if(v("["))c=G(),a=Z.createMemberExpression("[",a,c);else if(v("."))c=F(),a=Z.createMemberExpression(".",a,c);else{if(!v("("))break;b=D(),a=Z.createCallExpression(a,b)}return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=q[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),q[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){this.computed="["==c,this.dynamicDeps="function"==typeof a||a.dynamicDeps||this.computed&&!(b instanceof d),this.simplePath=!this.dynamicDeps&&(b instanceof e||b instanceof d)&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property=!this.computed||this.simplePath?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a,b){for(;a[t]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[t];return a}function o(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function p(){}var q=Object.create(null);
+d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=n(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof f?this.object.fullPath.slice():[this.object.name];a.push(this.property instanceof e?this.property.name:this.property.value),this.fullPath_=Path.get(a)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.computed){var c=this.property;this.valueFn_=function(b,d,e){var f=a(b,d,e),g=c(b,d,e);return d&&d.addPath(f,[g]),f?f[g]:void 0}}else{var b=Path.get(this.property.name);this.valueFn_=function(c,d,e){var f=a(c,d,e);return d&&d.addPath(f,b),b.getValueFrom(f)}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=a;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find function or filter: "+this.name);if(d?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("Cannot find function or filter: "+this.name);for(var h=e||[],j=0;j<this.args.length;j++)h.push(i(this.args[j])(a,b,c));return f.apply(g,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d,e){return r[a](b(c,d,e))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);return b=i(b),c=i(c),function(d,e,f){return s[a](b(d,e,f),c(d,e,f))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),function(d,e,f){return a(d,e,f)?b(d,e,f):c(d,e,f)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createCallExpression:function(a,b){if(!(a instanceof e))throw Error("Only identifier function invocations are allowed");var c=new g(a.name,b);return function(a,b,d){return c.transform(a,b,d,!1)}},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c,d){for(var e=[],f=0;f<a.length;f++)e.push(a[f](b,c,d));return e}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c,d){for(var e={},f=0;f<a.length;f++)e[a[f].key]=a[f].value(b,c,d);return e}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b,c),e=0;e<this.filters.length;e++)d=this.filters[e].transform(a,b,c,!1,[d]);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(a,void 0,c,!0,[b]);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){return u(c,a,b,d)}}}};var u="__proto__"in{}?function(a,b,c,d){var e={};return e[c]=b,e[d]=void 0,e[t]=a,e.__proto__=a,e}:function(a,b,c,d){var e=Object.create(a);return Object.defineProperty(e,c,{value:b,configurable:!0,writable:!0}),Object.defineProperty(e,d,{value:void 0,configurable:!0,writable:!0}),Object.defineProperty(e,t,{value:a,configurable:!0,writable:!0}),e};a.PolymerExpressions=p,p.getExpression=c}(this),Polymer={version:"0.3.3-0e73963"},"function"==typeof window.Polymer&&(Polymer={}),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}a.extend=b}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(){var a={};HTMLElement.register=function(b,c){a[b]=c},HTMLElement.getPrototypeForTag=function(b){var c=b?a[b]:HTMLElement.prototype;return c||Object.getPrototypeOf(document.createElement(b))};var b=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,b.apply(this,arguments)}}(Polymer),function(a){function b(a){var e=b.caller,g=e.nom,h=e._super;h||(g||(g=e.nom=c.call(this,e)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(e,g,f(this)));var i=h[g];return i?(i._super||d(i,g,h),i.apply(this,a||[])):void 0}function c(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function d(a,b,c){var d=e(c,b,a);return d[b]&&(d[b].nom=b),a._super=d}function e(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}return Object}function f(a){return a.__proto__}a.super=b}(Polymer),function(a){function b(a,b){var d=typeof b;return b instanceof Date&&(d="date"),c[d](a,b)}var c={string:function(a){return a},date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=b}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=b||{},g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)},injectBoundHTML:function(a,b){var c=document.createElement("template");c.innerHTML=a;var d=this.instanceTemplate(c);return b&&(b.textContent="",b.appendChild(d)),d}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];this.addEventListener(c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b){return a===b?0!==a||1/a===1/b:f(a)&&f(b)?!0:a!==a&&b!==b}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={object:void 0,type:"update",name:void 0,oldValue:void 0},f=Number.isNaN||function(a){return"number"==typeof a&&isNaN(a)},g={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObserver(b);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a,b){this.invokeMethod(e,[b])},this),this.registerNamedObserver(a+"__array",f)}},emitPropertyChangeRecord:function(a,c,d){if(!b(c,d)&&(this.propertyChanged_(a,c,d),Observer.hasObjectObserve)){var f=this.notifier_;f||(f=this.notifier_=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},bindToAccessor:function(a,c,d){var e=a+"_",f=a+"Observable_";this[f]=c;var g=this[e],h=this,i=c.open(function(b,c){h[e]=b,h.emitPropertyChangeRecord(a,b,c)});if(d&&!b(g,i)){var j=d(g,i);b(i,j)||(i=j,c.setValue&&c.setValue(i))}this[e]=i,this.emitPropertyChangeRecord(a,i,g);var k={close:function(){c.close(),h[f]=void 0}};return this.registerObserver(k),k},createComputedProperties:function(){if(this._computedNames)for(var a=0;a<this._computedNames.length;a++){var b=this._computedNames[a],c=this.computed[b];try{var d=PolymerExpressions.getExpression(c),e=d.getBinding(this,this.element.syntax);this.bindToAccessor(b,e)}catch(f){console.error("Failed to create computed property",f)}}},bindProperty:function(a,b,d){return d?void(this[a]=b):this.bindToAccessor(a,b,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObserver:function(a){return this._observers?void this._observers.push(a):void(this._observers=[a])},closeObservers:function(){if(this._observers){for(var a=this._observers,b=0;b<a.length;b++){var c=a[b];c&&"function"==typeof c.close&&c.close()}this._observers=[]}},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a in this._namedObservers)this.closeNamedObserver(a);this._namedObservers={}}}};a.api.instance.properties=g}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){for(var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b),d=c.bindings_,e=0;e<d.length;e++)this.registerObserver(d[e]);return c},bind:function(a,b,c){var d=this.propertyForAttribute(a);if(d){var e=this.bindProperty(d,b,c);return Platform.enableBindingsReflection&&e&&(e.path=b.path_,this._recordBinding(d,e)),this.reflect[d]&&this.reflectPropertyToAttribute(d),e}return this.mixinSuper(arguments)},bindFinished:function(){this.makeElementReady()},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},asyncUnbindAll:function(){this._unbound||(b.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){this._unbound||(this.closeObservers(),this.closeNamedObservers(),this._unbound=!0)},cancelUnbindAll:function(){return this._unbound?void(b.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(b.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},d=/\{\{([^{}]*)}}/;a.bindPattern=d,a.api.instance.mdv=c}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d={PolymerBase:!0,job:function(a,b,c){if("string"!=typeof a)return Polymer.job.call(this,a,b,c);var d="___"+a;this[d]=Polymer.job.call(this,this[d],b,c)},"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.templateInstance&&this.templateInstance.model&&console.warn("Attributes on "+this.localName+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."),this.created(),this.prepareElement(),(!this.ownerDocument.isStagingDocument||window.ShadowDOMPolyfill)&&this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.createComputedProperties(),this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a),PolymerGestures.register(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},"element"),e="controller",f={STYLE_SCOPE_ATTRIBUTE:d,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(e),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,d){if(b=b||this.findStyleScope(),d=d||"",b){window.ShadowDOMPolyfill&&(a=c(a,b.host));var f=this.element.cssTextToScopeStyle(a,e);Polymer.applyStyleToScope(f,b),b._scopeStyles[this.localName+d]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){return a._scopeStyles=a._scopeStyles||{},a._scopeStyles[b]}};a.api.instance.styles=f}(Polymer),function(a){function b(a,b){if(1===arguments.length&&"string"!=typeof arguments[0]){b=a;var c=document._currentScript;if(a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a);var j=Platform.deliverDeclarations();if(j)for(var k,l=0,m=j.length;m>l&&(k=j[l]);l++)b.apply(null,k)}(Polymer),function(a){var b={resolveElementPaths:function(a){Platform.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){b===document&&(b=document.head),window.ShadowDOMPolyfill&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",i=document.head.querySelectorAll(g);i.length&&(f=i[i.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return p?p.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i="style",j="@import",k="link[rel=stylesheet]",l="global",m="polymer-scope",n={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Platform.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(k),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(i),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(j)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(k),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(i+"["+m+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(m)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(l);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+m+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},o=HTMLElement.prototype,p=o.matches||o.matchesSelector||o.webkitMatchesSelector||o.mozMatchesSelector;a.api.declaration.styles=n,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return d.addEventListener(c,h),f?void 0:{open:g,discardChanges:g,close:function(){d.removeEventListener(c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}if(a.computed){var b=a._computedNames=[];for(var c in a.computed)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c],e=this.reflectHintForDescriptor(d);void 0===b.reflect[c]&&void 0!==e&&(b.reflect[c]=e),void 0===b[c]&&(b[c]=this.valueForDescriptor(d))}},valueForDescriptor:function(a){var b="object"==typeof a&&a?a.value:a;return void 0!==b?b:null},reflectHintForDescriptor:function(a){return"object"==typeof a&&a&&void 0!==a.reflect?a.reflect:void 0},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a){var b=this.prototype,c=a+"_",d=a+"Observable_";b[c]=b[a],Object.defineProperty(b,a,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(b){var e=this[d];if(e)return void e.setValue(b);var f=this[c];return this[c]=b,this.emitPropertyChangeRecord(a,b,f),b},configurable:!0})},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c);var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a,d){var e=this.getAttribute(b);if(e)for(var f,g=a.publish||(a.publish={}),h=e.split(c),i=0,j=h.length;j>i;i++)if(f=h[i].trim(),f&&void 0===g[f]){try{var k=void 0!==d[f]}catch(l){k=!1}k||(g[f]=Polymer.nob)}},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&Platform.templateContent(a)},installBindingDelegate:function(a){a&&(a.bindingDelegate=this.syntax)}};a.api.declaration.mdv=e}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),window.ShadowDOMPolyfill&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),g[a]=b}return b},findBasePrototype:function(a){return g[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},g={};f.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=f}(Polymer),function(a){function b(a){return document.contains(a)?h:g}function c(){return g.length?g[0]:h[0]}function d(a){e.waitToReady=!0,CustomElements.ready=!1,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a,b,c){var d=-1===this.indexOf(a)&&-1===f.indexOf(a);return d&&(this.add(a),a.__check=b,a.__go=c),0!==this.indexOf(a)},add:function(a){b(a).push(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?g.length:1e9),c},go:function(a){var b=this.remove(a);b&&(this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){return!g.length&&!h.length},addToFlushQueue:function(a){f.push(a)},flush:function(){for(var a;f.length;)a=f.shift(),a.__go.call(a),a.__check=a.__go=null},ready:function(){this.flush(),CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&i.push(a)},flushReadyCallbacks:function(){if(i)for(var a;i.length;)(a=i.shift())()
+},waitToReady:!0},f=[],g=[],h=[],i=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.queue=e,a.whenPolymerReady=d}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenPolymerReady;a.import=c,a.importElements=b}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenPolymerReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this.extends=this.getAttribute("extends"),this.loadResources(),this.registerWhenReady()},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){if(this.hasAttribute("noscript")&&!this.noscript)if(this.noscript=!0,window.CustomElements&&!CustomElements.useNative)Polymer(a);else{var b=document.createElement("script");b.textContent="Polymer('"+a+"');",this.appendChild(b)}},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.wait(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
 //# sourceMappingURL=polymer.js.map
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js.map b/pkg/polymer/lib/src/js/polymer/polymer.js.map
index ed7b3a9..bd030a6 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js.map
@@ -1 +1 @@
-{"version":3,"file":"polymer.js","sources":["../../polymer-gestures/src/scope.js","../../polymer-gestures/src/targetfind.js","../../polymer-gestures/src/touch-action.js","../../polymer-gestures/src/eventFactory.js","../../polymer-gestures/src/pointermap.js","../../polymer-gestures/src/dispatcher.js","../../polymer-gestures/src/installer.js","../../polymer-gestures/src/mouse.js","../../polymer-gestures/src/touch.js","../../polymer-gestures/src/ms.js","../../polymer-gestures/src/pointer.js","../../polymer-gestures/src/platform-events.js","../../polymer-gestures/src/track.js","../../polymer-gestures/src/hold.js","../../polymer-gestures/src/tap.js","../../polymer-expressions/third_party/esprima/esprima.js","../../polymer-expressions/src/polymer-expressions.js","polymer-versioned.js","../src/boot.js","../src/lib/lang.js","../src/lib/job.js","../src/lib/dom.js","../src/lib/super.js","../src/lib/deserialize.js","../src/api.js","../src/instance/utils.js","../src/instance/events.js","../src/instance/attributes.js","../src/instance/properties.js","../src/instance/mdv.js","../src/instance/base.js","../src/instance/styles.js","../src/declaration/polymer.js","../src/declaration/path.js","../src/declaration/styles.js","../src/declaration/events.js","../src/declaration/properties.js","../src/declaration/attributes.js","../src/declaration/mdv.js","../src/declaration/prototype.js","../src/declaration/queue.js","../src/declaration/import.js","../src/declaration/polymer-element.js","../src/lib/auto-binding.js"],"names":["window","PolymerGestures","scope","target","shadow","inEl","shadowRoot","webkitShadowRoot","canTarget","Boolean","elementFromPoint","targetingShadow","s","this","olderShadow","os","olderShadowRoot","se","querySelector","allShadows","element","shadows","push","searchRoot","inRoot","x","y","st","sr","t","ssr","owner","document","parentNode","nodeType","Node","DOCUMENT_NODE","DOCUMENT_FRAGMENT_NODE","findTarget","inEvent","clientX","clientY","LCA","a","b","contains","adepth","depth","bdepth","d","walk","n","u","i","host","deepContains","common","insideNode","node","rect","getBoundingClientRect","left","right","top","bottom","targetFinding","bind","shadowSelector","v","selector","rule","attrib2css","selectors","styles","hasTouchAction","head","style","touchAction","hasShadowRoot","ShadowDOMPolyfill","createShadowRoot","forEach","r","String","map","el","createElement","textContent","appendChild","MOUSE_PROPS","MOUSE_DEFAULTS","NOP_FACTORY","eventFactory","preventTap","makeBaseEvent","inType","inDict","e","createEvent","initEvent","bubbles","cancelable","makeGestureEvent","Object","create","k","keys","length","makePointerEvent","p","buttons","pressure","pointerId","width","height","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","PointerMap","USE_MAP","m","Map","pointers","POINTERS_FN","values","prototype","size","set","inId","indexOf","has","delete","splice","get","clear","callback","thisArg","call","CLONE_PROPS","CLONE_DEFAULTS","HAS_SVG_INSTANCE","SVGElementInstance","wrap","wrapIfNeeded","dispatcher","pointermap","eventMap","eventSources","eventSourceList","gestures","gestureQueue","registerSource","name","source","newEvents","events","registerGesture","register","es","l","unregister","down","fireEvent","move","type","fillGestureQueue","up","cancel","tapPrevented","eventHandler","_handledByPG","fn","listen","addEvent","unlisten","removeEvent","eventName","addEventListener_","boundHandler","addEventListener","removeEventListener_","removeEventListener","makeEvent","preventDefault","_target","dispatchEvent","cloneEvent","eventCopy","correspondingUseElement","clone","gestureTrigger","g","j","ev","requestAnimationFrame","boundGestureTrigger","Installer","add","remove","changed","binder","addCallback","removeCallback","changedCallback","MO","observer","mutationWatcher","Array","toArray","slice","filter","MutationObserver","WebKitMutationObserver","SELECTOR","OBSERVER_INIT","subtree","childList","attributes","attributeOldValue","attributeFilter","watchSubtree","observe","enableOnSubtree","readyState","installOnLoad","installNewSubtree","findElements","addElement","querySelectorAll","removeElement","elementChanged","oldValue","concatLists","accum","list","concat","isElement","ELEMENT_NODE","flattenMutationTree","inNodes","tree","reduce","mutations","mutationHandler","added","addedNodes","removed","removedNodes","console","warn","DEDUP_DIST","WHICH_TO_BUTTONS","HAS_BUTTONS","MouseEvent","mouseEvents","POINTER_ID","POINTER_TYPE","lastTouches","isEventSimulatedFromTouch","lts","dx","Math","abs","dy","prepareEvent","which","mousedown","mouseup","mousemove","relatedTarget","cleanupMouse","INSTALLER","DEDUP_TIMEOUT","CLICK_COUNT_TIMEOUT","ATTRIB","HAS_TOUCH_ACTION","touchEvents","elementAdded","getAttribute","touchActionToScrollType","_scrollType","elementRemoved","undefined","oldSt","scrollTypes","EMITTER","XSCROLLER","YSCROLLER","SCROLLER","exec","firstTouch","isPrimaryTouch","inTouch","identifier","setPrimaryTouch","firstXY","X","Y","scrolling","cancelResetClickCount","removePrimaryPointer","inPointer","resetClickCount","clickCount","resetId","setTimeout","clearTimeout","typeToButtons","ret","touch","id","currentTouchEvent","touchToPointer","cte","detail","webkitRadiusX","radiusX","webkitRadiusY","radiusY","webkitForce","force","self","processTouches","inFunction","tl","changedTouches","shouldScroll","scrollAxis","currentTarget","oa","da","doa","findTouch","inTL","vacuumTouches","touches","value","key","out","cancelOut","touchstart","dedupSynthMouse","touchmove","touchcancel","pointer","touchend","cleanUpPointer","lt","HAS_BITMAP_TYPE","MSPointerEvent","MSPOINTER_TYPE_MOUSE","msEvents","POINTER_TYPES","cleanup","MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel","pointerEvents","pointerdown","pointermove","pointerup","pointercancel","PointerEvent","navigator","msPointerEnabled","ontouchstart","track","WIGGLE_THRESHOLD","clampDir","inDelta","calcPositionDelta","inA","inB","pageX","pageY","fireTrack","inTrackingData","downEvent","dd","lastMoveEvent","xDirection","yDirection","ddx","ddy","screenX","screenY","trackInfo","downTarget","tracking","hold","HOLD_DELAY","heldPointer","holdJob","pulse","Date","now","timeStamp","held","fireHold","clearInterval","setInterval","inHoldTime","holdTime","tap","shouldTap","downState","start","altKey","ctrlKey","metaKey","shiftKey","global","assert","condition","message","Error","isDecimalDigit","ch","isWhiteSpace","fromCharCode","isLineTerminator","isIdentifierStart","isIdentifierPart","isKeyword","skipWhitespace","index","charCodeAt","getIdentifier","scanIdentifier","Token","Identifier","Keyword","NullLiteral","BooleanLiteral","range","scanPunctuator","code2","ch2","code","ch1","Punctuator","throwError","Messages","UnexpectedToken","scanNumericLiteral","number","NumericLiteral","parseFloat","scanStringLiteral","quote","str","octal","StringLiteral","isIdentifierName","token","advance","EOF","lex","lookahead","peek","pos","messageFormat","error","args","arguments","msg","replace","whole","description","throwUnexpected","expect","match","matchKeyword","keyword","parseArrayInitialiser","elements","parseExpression","delegate","createArrayExpression","parseObjectPropertyKey","createLiteral","createIdentifier","parseObjectProperty","createProperty","parseObjectInitialiser","properties","createObjectExpression","parseGroupExpression","expr","parsePrimaryExpression","createThisExpression","parseArguments","parseNonComputedProperty","parseNonComputedMember","parseComputedMember","parseLeftHandSideExpression","property","createMemberExpression","parseUnaryExpression","parsePostfixExpression","createUnaryExpression","binaryPrecedence","prec","parseBinaryExpression","stack","operator","pop","createBinaryExpression","parseConditionalExpression","consequent","alternate","createConditionalExpression","parseFilter","createFilter","parseFilters","parseTopLevel","Syntax","parseInExpression","parseAsExpression","createTopLevel","createAsExpression","indexName","createInExpression","parse","inDelegate","state","labelSet","TokenName","ArrayExpression","BinaryExpression","CallExpression","ConditionalExpression","EmptyStatement","ExpressionStatement","Literal","LabeledStatement","LogicalExpression","MemberExpression","ObjectExpression","Program","Property","ThisExpression","UnaryExpression","UnknownLabel","Redeclaration","esprima","prepareBinding","expressionText","filterRegistry","expression","getExpression","scopeIdent","tagName","ex","model","oneTime","binding","getBinding","polymerExpressionScopeIdent_","indexIdent","polymerExpressionIndexIdent_","expressionParseCache","ASTDelegate","Expression","valueFn_","IdentPath","path","Path","object","accessor","dynamicDeps","valid","simplePath","getFn","Filter","notImplemented","arg","valueFn","filters","deps","currentPath","ConstantObservable","value_","convertStylePropertyName","c","toLowerCase","findScope","prop","parentScopeName","hasOwnProperty","isLiteralExpression","pathString","isNaN","Number","PolymerExpressions","addPath","getValueFrom","setValue","newValue","setValueFrom",{"end":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":3741,"pos":3733,"col":8,"line":123,"value":"fullPath","type":"name"},"start":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":3741,"pos":3733,"col":8,"line":123,"value":"fullPath","type":"name"},"name":"fullPath"},"fullPath","fullPath_","last","context","propName","transform","toModelDirection","toModel","toDOM","apply","unaryOperators","+","-","!","binaryOperators","*","/","%","<",">","<=",">=","==","!=","===","!==","&&","||","op","argument","test","ident","arr","kind","obj","open","discardChanges","deliver","close","firstTime","firstValue","startReset","getValue","finishReset","setValueFn","CompoundObserver","ObserverTransform","count","random","toString","styleObject","parts","join","tokenList","tokens","prepareInstancePositionChanged","template","templateInstance","PathObserver","prepareInstanceModel","scopeName","parentScope","exposeGetExpression","getExpression_","Polymer","version","extend","api","getOwnPropertyNames","pd","getOwnPropertyDescriptor","defineProperty","nom","job","wait","stop","Job","go","inContext","boundComplete","complete","h","handle","cancelAnimationFrame","registry","HTMLElement","tag","getPrototypeForTag","getPrototypeOf","originalStopPropagation","Event","stopPropagation","cancelBubble","$super","arrayOfArgs","caller","_super","nameInThis","memoizeSuper","__proto__","n$","method","proto","nextSuper","super","deserializeValue","currentValue","inferredType","typeHandlers","string","date","boolean","parseInt","JSON","function","declaration","instance","publish","apis","utils","async","timeout","Platform","flush","cancelAsync","fire","onNode","event","CustomEvent","asyncFire","classFollows","anew","old","className","classList","nop","nob","asyncMethod","log","logFlags","EVENT_PREFIX","addHostListeners","eventDelegates","localName","methodName","getEventHandler","dispatchMethod","group","groupEnd","copyInstanceAttributes","a$","_instanceAttributes","hasAttribute","setAttribute","takeAttributes","_publishLC","attributeToProperty","propertyForAttribute","search","bindPattern","stringValue","serializeValue","reflectPropertyToAttribute","serializedValue","removeAttribute","bindProperties","observable","Observer","bindToInstance","resolveBindingValue","createPropertyObserver","_observeNames","o","_propertyObserver","registerObservers","observeArrayValue","openPropertyObserver","notifyPropertyChanges","newValues","oldValues","paths","called","ov","nv","invokeMethod","deliverChanges","propertyChanged_","reflect","callbackName","isArray","closeNamedObserver","ArrayObserver","registerNamedObserver","bindProperty","observers","_observers","closeObservers","closeObserverArray","observerArray","o$","_namedObservers","closeNamedObservers","mdv","instanceTemplate","syntax","bindingDelegate","dom","createInstance","bindings_","enableBindingsReflection","path_","_recordBinding","mixinSuper","bindFinished","makeElementReady","asyncUnbindAll","_unbound","unbind","_unbindAllJob","unbindAll","cancelUnbindAll","mustachePattern","isBase","PolymerBase","base","created","ready","createdCallback","prepareElement","ownerDocument","isStagingDocument","_elementPrepared","shadowRoots","_readied","parseDeclarations","attachedCallback","attached","enteredView","hasBeenAttached","domReady","detachedCallback","preventDispose","detached","leftView","enteredViewCallback","leftViewCallback","enteredDocumentCallback","leftDocumentCallback","parseDeclaration","elementElement","fetchTemplate","root","shadowFromTemplate","shadowRootReady","lightFromTemplate","refNode","eventController","insertBefore","marshalNodeReferences","$","attributeChangedCallback","attributeChanged","onMutation","listener","disconnect","constructor","Base","shimCssText","cssText","is","ShadowCSS","makeScopeSelector","STYLE_SCOPE_ATTRIBUTE","STYLE_CONTROLLER_SCOPE","installControllerStyles","findStyleScope","scopeHasNamedStyle","cssTextForScope","installScopeCssText","installScopeStyle","cssTextToScopeStyle","applyStyleToScope","_scopeStyles","script","_currentScript","getRegisteredPrototype","registerPrototype","notifyPrototype","waitingForPrototype","client","waitPrototype","registerWhenReady","prototypesByName","declarations","deliverDeclarations","resolveElementPaths","urlResolver","resolveDom","addResolvePathApi","assetPath","URL","baseURI","resolvePath","urlPath","href","importRuleForSheet","sheet","baseUrl","createStyleElement","attr","firstElementChild","s$","nextElementSibling","cssTextFromSheet","__resource","matchesSelector","inSelector","matches","STYLE_SELECTOR","STYLE_LOADABLE_MATCH","SHEET_SELECTOR","STYLE_GLOBAL_SCOPE","SCOPE_ATTR","loadStyles","content","templateContent","convertSheetsToStyles","findLoadableStyles","templateUrl","styleResolver","copySheetAttributes","replaceChild","link","loadables","installSheets","cacheSheets","cacheStyles","installLocalSheets","installGlobalStyles","sheets","findNodes","removeChild","firstChild","matcher","nodes","array","templateNodes","styleForScope","scopeDescriptor","webkitMatchesSelector","mozMatchesSelector","mixedCaseEventTypes","parseHostEvents","delegates","addAttributeDelegates","hasEventPrefix","removeEventPrefix","trim","prefixLength","findController","controller","prepareEventBinding","eventType","bindingValue","handler","inferObservers","explodeObservers","exploded","ni","names","split","optimizePropertyMaps","_publishNames","publishProperties","requireProperties","lowerCaseMap","propertyDescriptors","propertyDescriptor","reflects","reflectHintForDescriptor","valueForDescriptor","createPropertyAccessors","createBindablePrototypeAccessor","ATTRIBUTES_ATTRIBUTE","ATTRIBUTES_REGEX","inheritAttributesObjects","inheritObject","publishAttributes","accumulateInstanceAttributes","clonable","isInstanceAttribute","blackList","extends","noscript","assetpath","cache-csstext","installBindingDelegate","ensurePrototypeTraversal","ancestor","extendeeName","buildPrototype","publishConstructor","extension","generateBasePrototype","desugarBeforeChaining","chainPrototypes","desugarAfterChaining","inheritMetaData","chained","chainObject","extendee","shimStyling","registerCallback","symbol","ctor","extnds","findBasePrototype","ensureBaseApi","memoizedBases","extended","mixinMethod","info","typeExtension","findTypeExtension","registerElement","inherited","queueForElement","mainQueue","importQueue","nextQueued","whenPolymerReady","queue","waitToReady","CustomElements","HTMLImports","whenImportsReady","addReadyCallback","check","shouldAdd","flushQueue","__check","__go","useNative","readied","addToFlushQueue","shift","nextElement","canReady","isEmpty","upgradeDocumentTree","flushReadyCallbacks","readyCallbacks","importElements","elementOrFragment","importUrls","urls","url","frag","createDocumentFragment","rel","import","isRegistered","isCustomTag","init","loadResources","registered","waitingForQueue","waitingForResources","_register","handleNoScript","_needsResources","body","makeSyntax"],"mappings":";;;;;;;;;;AASAA,OAAOC,mBCAP,SAAUC,GACR,GAAIC,IACFC,OAAQ,SAASC,GACf,MAAIA,GACKA,EAAKC,YAAcD,EAAKE,iBADjC,QAIFC,UAAW,SAASJ,GAClB,MAAOA,IAAUK,QAAQL,EAAOM,mBAElCC,gBAAiB,SAASN,GACxB,GAAIO,GAAIC,KAAKT,OAAOC,EACpB,OAAIQ,MAAKL,UAAUI,GACVA,EADT,QAIFE,YAAa,SAASV,GACpB,GAAIW,GAAKX,EAAOY,eAChB,KAAKD,EAAI,CACP,GAAIE,GAAKb,EAAOc,cAAc,SAC1BD,KACFF,EAAKE,EAAGD,iBAGZ,MAAOD,IAETI,WAAY,SAASC,GAEnB,IADA,GAAIC,MAAcT,EAAIC,KAAKT,OAAOgB,GAC5BR,GACJS,EAAQC,KAAKV,GACbA,EAAIC,KAAKC,YAAYF,EAEvB,OAAOS,IAETE,WAAY,SAASC,EAAQC,EAAGC,GAC9B,GAAIF,EAAQ,CACV,GACIG,GAAIC,EADJC,EAAIL,EAAOd,iBAAiBe,EAAGC,EAInC,KADAE,EAAKf,KAAKF,gBAAgBkB,GACnBD,GAAI,CAGT,GADAD,EAAKC,EAAGlB,iBAAiBe,EAAGC,GAIrB,CAEL,GAAII,GAAMjB,KAAKF,gBAAgBgB,EAC/B,OAAOd,MAAKU,WAAWO,EAAKL,EAAGC,IAAMC,EAJrCC,EAAKf,KAAKC,YAAYc,GAQ1B,MAAOC,KAGXE,MAAO,SAASX,GACd,IAAKA,EACH,MAAOY,SAIT,KAFA,GAAIpB,GAAIQ,EAEDR,EAAEqB,YACPrB,EAAIA,EAAEqB,UAMR,OAHIrB,GAAEsB,UAAYC,KAAKC,eAAiBxB,EAAEsB,UAAYC,KAAKE,yBACzDzB,EAAIoB,UAECpB,GAET0B,WAAY,SAASC,GACnB,GAAId,GAAIc,EAAQC,QAASd,EAAIa,EAAQE,QAEjC7B,EAAIC,KAAKkB,MAAMQ,EAAQpC,OAK3B,OAHKS,GAAEF,iBAAiBe,EAAGC,KACzBd,EAAIoB,UAECnB,KAAKU,WAAWX,EAAGa,EAAGC,IAE/BgB,IAAK,SAASC,EAAGC,GACf,GAAID,IAAMC,EACR,MAAOD,EAET,IAAIA,IAAMC,EACR,MAAOD,EAET,IAAIC,IAAMD,EACR,MAAOC,EAET,KAAKA,IAAMD,EACT,MAAOX,SAGT,IAAIW,EAAEE,UAAYF,EAAEE,SAASD,GAC3B,MAAOD,EAET,IAAIC,EAAEC,UAAYD,EAAEC,SAASF,GAC3B,MAAOC,EAET,IAAIE,GAASjC,KAAKkC,MAAMJ,GACpBK,EAASnC,KAAKkC,MAAMH,GACpBK,EAAIH,EAASE,CAMjB,KALIC,EAAI,EACNN,EAAI9B,KAAKqC,KAAKP,EAAGM,GAEjBL,EAAI/B,KAAKqC,KAAKN,GAAIK,GAEdN,GAAKC,GAAKD,IAAMC,GACpBD,EAAI9B,KAAKqC,KAAKP,EAAG,GACjBC,EAAI/B,KAAKqC,KAAKN,EAAG,EAEnB,OAAOD,IAETO,KAAM,SAASC,EAAGC,GAChB,IAAK,GAAIC,GAAI,EAAGF,GAAUC,EAAJC,EAAQA,IAC5BF,EAAIA,EAAElB,YAAckB,EAAEG,IAExB,OAAOH,IAETJ,MAAO,SAASI,GAEd,IADA,GAAIF,GAAI,EACFE,GACJF,IACAE,EAAIA,EAAElB,YAAckB,EAAEG,IAExB,OAAOL,IAETM,aAAc,SAASZ,EAAGC,GACxB,GAAIY,GAAS3C,KAAK6B,IAAIC,EAAGC,EAEzB,OAAOY,KAAWb,GAEpBc,WAAY,SAASC,EAAMjC,EAAGC,GAC5B,GAAIiC,GAAOD,EAAKE,uBAChB,OAAQD,GAAKE,MAAQpC,GAAOA,GAAKkC,EAAKG,OAAWH,EAAKI,KAAOrC,GAAOA,GAAKiC,EAAKK,QAGlF9D,GAAM+D,cAAgB9D,EAOtBD,EAAMoC,WAAanC,EAAOmC,WAAW4B,KAAK/D,GAS1CD,EAAMqD,aAAepD,EAAOoD,aAAaW,KAAK/D,GAqB9CD,EAAMuD,WAAatD,EAAOsD,YAEzBzD,OAAOC,iBCjLV,WACE,QAASkE,GAAeC,GACtB,MAAO,eAAiBC,EAASD,GAEnC,QAASC,GAASD,GAChB,MAAO,kBAAoBA,EAAI,KAEjC,QAASE,GAAKF,GACZ,MAAO,uBAAyBA,EAAI,mBAAqBA,EAAI,KAE/D,GAAIG,IACF,OACA,OACA,QACA,SAEED,KAAM,cACNE,WACE,cACA,iBAIFC,EAAS,GAGTC,GADO1C,SAAS2C,KAC4C,gBAApC3C,UAAS2C,KAAKC,MAAMC,aAE5CC,GAAiB9E,OAAO+E,mBAAqB/C,SAAS2C,KAAKK,gBAE/D,IAAIN,EAAgB,CAClBH,EAAWU,QAAQ,SAASC,GACtBC,OAAOD,KAAOA,GAChBT,GAAUJ,EAASa,GAAKZ,EAAKY,GAAK,KAC9BJ,IACFL,GAAUN,EAAee,GAAKZ,EAAKY,GAAK,QAG1CT,GAAUS,EAAEV,UAAUY,IAAIf,GAAYC,EAAKY,EAAEZ,MAAQ,KACjDQ,IACFL,GAAUS,EAAEV,UAAUY,IAAIjB,GAAkBG,EAAKY,EAAEZ,MAAQ,QAKjE,IAAIe,GAAKrD,SAASsD,cAAc,QAChCD,GAAGE,YAAcd,EACjBzC,SAAS2C,KAAKa,YAAYH,OClC9B,SAAUnF,GAER,GAAIuF,IACF,UACA,aACA,OACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,UACA,SACA,gBACA,QACA,SAGEC,IACF,GACA,EACA,KACA,KACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,KACA,EACA,GAGEC,EAAc,WAAY,MAAO,eAEjCC,GAEFC,WAAYF,EACZG,cAAe,SAASC,EAAQC,GAC9B,GAAIC,GAAIjE,SAASkE,YAAY,QAG7B,OAFAD,GAAEE,UAAUJ,EAAQC,EAAOI,UAAW,EAAOJ,EAAOK,aAAc,GAClEJ,EAAEJ,WAAaD,EAAaC,WAAWI,GAChCA,GAETK,iBAAkB,SAASP,EAAQC,GACjCA,EAASA,GAAUO,OAAOC,OAAO,KAGjC,KAAK,GAAuCC,GADxCR,EAAIpF,KAAKiF,cAAcC,EAAQC,GAC1B3C,EAAI,EAAGqD,EAAOH,OAAOG,KAAKV,GAAY3C,EAAIqD,EAAKC,OAAQtD,IAC9DoD,EAAIC,EAAKrD,GACT4C,EAAEQ,GAAKT,EAAOS,EAEhB,OAAOR,IAETW,iBAAkB,SAASb,EAAQC,GACjCA,EAASA,GAAUO,OAAOC,OAAO,KAIjC,KAAI,GAAWK,GAFXZ,EAAIpF,KAAKiF,cAAcC,EAAQC,GAE3B3C,EAAI,EAAMA,EAAIoC,EAAYkB,OAAQtD,IACxCwD,EAAIpB,EAAYpC,GAChB4C,EAAEY,GAAKb,EAAOa,IAAMnB,EAAerC,EAErC4C,GAAEa,QAAUd,EAAOc,SAAW,CAI9B,IAAIC,GAAW,CAqBf,OAnBEA,GADEf,EAAOe,SACEf,EAAOe,SAEPd,EAAEa,QAAU,GAAM,EAI/Bb,EAAExE,EAAIwE,EAAEzD,QACRyD,EAAEvE,EAAIuE,EAAExD,QAGRwD,EAAEe,UAAYhB,EAAOgB,WAAa,EAClCf,EAAEgB,MAAQjB,EAAOiB,OAAS,EAC1BhB,EAAEiB,OAASlB,EAAOkB,QAAU,EAC5BjB,EAAEc,SAAWA,EACbd,EAAEkB,MAAQnB,EAAOmB,OAAS,EAC1BlB,EAAEmB,MAAQpB,EAAOoB,OAAS,EAC1BnB,EAAEoB,YAAcrB,EAAOqB,aAAe,GACtCpB,EAAEqB,YAActB,EAAOsB,aAAe,EACtCrB,EAAEsB,UAAYvB,EAAOuB,YAAa,EAC3BtB,GAIX/F,GAAM0F,aAAeA,GACpB5F,OAAOC,iBC/GV,SAAUC,GAGR,QAASsH,KACP,GAAIC,EAAS,CACX,GAAIC,GAAI,GAAIC,IAEZ,OADAD,GAAEE,SAAWC,EACNH,EAEP7G,KAAK6F,QACL7F,KAAKiH,UATT,GAAIL,GAAUzH,OAAO2H,KAAO3H,OAAO2H,IAAII,UAAU9C,QAC7C4C,EAAc,WAAY,MAAOhH,MAAKmH,KAY1CR,GAAWO,WACTE,IAAK,SAASC,EAAM3F,GAClB,GAAIc,GAAIxC,KAAK6F,KAAKyB,QAAQD,EACtB7E,GAAI,GACNxC,KAAKiH,OAAOzE,GAAKd,GAEjB1B,KAAK6F,KAAKpF,KAAK4G,GACfrH,KAAKiH,OAAOxG,KAAKiB,KAGrB6F,IAAK,SAASF,GACZ,MAAOrH,MAAK6F,KAAKyB,QAAQD,GAAQ,IAEnCG,SAAU,SAASH,GACjB,GAAI7E,GAAIxC,KAAK6F,KAAKyB,QAAQD,EACtB7E,GAAI,KACNxC,KAAK6F,KAAK4B,OAAOjF,EAAG,GACpBxC,KAAKiH,OAAOQ,OAAOjF,EAAG,KAG1BkF,IAAK,SAASL,GACZ,GAAI7E,GAAIxC,KAAK6F,KAAKyB,QAAQD,EAC1B,OAAOrH,MAAKiH,OAAOzE,IAErBmF,MAAO,WACL3H,KAAK6F,KAAKC,OAAS,EACnB9F,KAAKiH,OAAOnB,OAAS,GAGvB1B,QAAS,SAASwD,EAAUC,GAC1B7H,KAAKiH,OAAO7C,QAAQ,SAASb,EAAGf,GAC9BoF,EAASE,KAAKD,EAAStE,EAAGvD,KAAK6F,KAAKrD,GAAIxC,OACvCA,OAEL+G,SAAU,WACR,MAAO/G,MAAK6F,KAAKC,SAIrBzG,EAAMsH,WAAaA,GAClBxH,OAAOC,iBCzDV,SAAUC,GACR,GAAI0I,IAEF,UACA,aACA,OACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,UACA,SACA,gBAEA,UAEA,YACA,QACA,SACA,WACA,QACA,QACA,cACA,cACA,YAEA,OACA,SACA,gBACA,QACA,QACA,QACA,YAEA,aACA,gBAGEC,IAEF,GACA,EACA,KACA,KACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,KAEA,EAEA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,EAEA,GACA,KACA,KACA,EACA,EACA,EACA,EACA,cACA,GAGEC,EAAkD,mBAAvBC,oBAE3BC,EAAOhJ,OAAO+E,mBAAqBA,kBAAkBkE,cAAgB,SAAShD,GAAI,MAAOA,IAEzFL,EAAe1F,EAAM0F,aAarBsD,GACFC,WAAY,GAAIjJ,GAAMsH,WACtB4B,SAAU7C,OAAOC,OAAO,MAGxB6C,aAAc9C,OAAOC,OAAO,MAC5B8C,mBACAC,YACAC,gBASAC,eAAgB,SAASC,EAAMC,GAC7B,GAAI/I,GAAI+I,EACJC,EAAYhJ,EAAEiJ,MACdD,KACFA,EAAU3E,QAAQ,SAASgB,GACrBrF,EAAEqF,KACJpF,KAAKuI,SAASnD,GAAKrF,EAAEqF,GAAG/B,KAAKtD,KAE9BC,MACHA,KAAKwI,aAAaK,GAAQ9I,EAC1BC,KAAKyI,gBAAgBhI,KAAKV,KAG9BkJ,gBAAiB,SAASJ,EAAMC,GAC9B9I,KAAK0I,SAASjI,KAAKqI,IAErBI,SAAU,SAAS3I,GAEjB,IAAIpB,OAAO+E,mBAAqB3D,IAAYY,SAI5C,IAAK,GAAWgI,GADZC,EAAIpJ,KAAKyI,gBAAgB3C,OACpBtD,EAAI,EAAY4G,EAAJ5G,IAAW2G,EAAKnJ,KAAKyI,gBAAgBjG,IAAKA,IAE7D2G,EAAGD,SAASpB,KAAKqB,EAAI5I,IAGzB8I,WAAY,SAAS9I,GAEnB,IAAK,GAAW4I,GADZC,EAAIpJ,KAAKyI,gBAAgB3C,OACpBtD,EAAI,EAAY4G,EAAJ5G,IAAW2G,EAAKnJ,KAAKyI,gBAAgBjG,IAAKA,IAE7D2G,EAAGE,WAAWvB,KAAKqB,EAAI5I,IAI3B+I,KAAM,SAAS5H,GACb1B,KAAKuJ,UAAU,OAAQ7H,IAEzB8H,KAAM,SAAS9H,GAEbA,EAAQ+H,KAAO,OACfzJ,KAAK0J,iBAAiBhI,IAExBiI,GAAI,SAASjI,GACX1B,KAAKuJ,UAAU,KAAM7H,IAEvBkI,OAAQ,SAASlI,GACfA,EAAQmI,cAAe,EACvB7J,KAAKuJ,UAAU,KAAM7H,IAGvBoI,aAAc,SAASpI,GAIrB,IAAIA,EAAQqI,aAAZ,CAGA,GAAIN,GAAO/H,EAAQ+H,KACfO,EAAKhK,KAAKuI,UAAYvI,KAAKuI,SAASkB,EACpCO,IACFA,EAAGtI,GAELA,EAAQqI,cAAe,IAGzBE,OAAQ,SAAS3K,EAAQ0J,GACvBA,EAAO5E,QAAQ,SAASgB,GACtBpF,KAAKkK,SAAS5K,EAAQ8F,IACrBpF,OAGLmK,SAAU,SAAS7K,EAAQ0J,GACzBA,EAAO5E,QAAQ,SAASgB,GACtBpF,KAAKoK,YAAY9K,EAAQ8F,IACxBpF,OAELkK,SAAU,SAAS5K,EAAQ+K,GAErBlL,OAAO+E,kBACT5E,EAAOgL,kBAAkBD,EAAWrK,KAAKuK,cAEzCjL,EAAOkL,iBAAiBH,EAAWrK,KAAKuK,eAG5CH,YAAa,SAAS9K,EAAQ+K,GAExBlL,OAAO+E,kBACT5E,EAAOmL,qBAAqBJ,EAAWrK,KAAKuK,cAE5CjL,EAAOoL,oBAAoBL,EAAWrK,KAAKuK,eAY/CI,UAAW,SAASzF,EAAQxD,GAC1B,GAAI0D,GAAIL,EAAagB,iBAAiBb,EAAQxD,EAI9C,OAHA0D,GAAEwF,eAAiBlJ,EAAQkJ,eAC3BxF,EAAEyE,aAAenI,EAAQmI,aACzBzE,EAAEyF,QAAUzF,EAAEyF,SAAWnJ,EAAQpC,OAC1B8F,GAGTmE,UAAW,SAASrE,EAAQxD,GAC1B,GAAI0D,GAAIpF,KAAK2K,UAAUzF,EAAQxD,EAC/B,OAAO1B,MAAK8K,cAAc1F,IAS5B2F,WAAY,SAASrJ,GAEnB,IAAK,GADgCsE,GAAjCgF,EAAYtF,OAAOC,OAAO,MACrBnD,EAAI,EAAGA,EAAIuF,EAAYjC,OAAQtD,IACtCwD,EAAI+B,EAAYvF,GAChBwI,EAAUhF,GAAKtE,EAAQsE,IAAMgC,EAAexF,IAIlC,WAANwD,GAAwB,kBAANA,KAChBiC,GAAoB+C,EAAUhF,YAAckC,sBAC9C8C,EAAUhF,GAAKgF,EAAUhF,GAAGiF,yBAE9BD,EAAUhF,GAAKmC,EAAK6C,EAAUhF,IAKlC,OADAgF,GAAUJ,eAAiBlJ,EAAQkJ,eAC5BI,GAQTF,cAAe,SAASpJ,GACtB,GAAIV,GAAIU,EAAQmJ,OAChB,IAAI7J,EAAG,CACLA,EAAE8J,cAAcpJ,EAGhB,IAAIwJ,GAAQlL,KAAK+K,WAAWrJ,EAC5BwJ,GAAM5L,OAAS0B,EACfhB,KAAK0J,iBAAiBwB,KAG1BC,eAAgB,WAEd,IAAK,GAAW/F,GAAP5C,EAAI,EAAMA,EAAIxC,KAAK2I,aAAa7C,OAAQtD,IAAK,CACpD4C,EAAIpF,KAAK2I,aAAanG,EACtB,KAAK,GAAW4I,GAAPC,EAAI,EAAMA,EAAIrL,KAAK0I,SAAS5C,OAAQuF,IAC3CD,EAAIpL,KAAK0I,SAAS2C,GACdD,EAAEpC,OAAO1B,QAAQlC,EAAEqE,OAAS,GAC9B2B,EAAEhG,EAAEqE,MAAM3B,KAAKsD,EAAGhG,GAIxBpF,KAAK2I,aAAa7C,OAAS,GAE7B4D,iBAAkB,SAAS4B,GAEpBtL,KAAK2I,aAAa7C,QACrByF,sBAAsBvL,KAAKwL,qBAE7BxL,KAAK2I,aAAalI,KAAK6K,IAG3BjD,GAAWkC,aAAelC,EAAWyB,aAAazG,KAAKgF,GACvDA,EAAWmD,oBAAsBnD,EAAW8C,eAAe9H,KAAKgF,GAChEhJ,EAAMgJ,WAAaA,EACnBhJ,EAAM6J,SAAWb,EAAWa,SAAS7F,KAAKgF,GAC1ChJ,EAAMgK,WAAahB,EAAWgB,WAAWhG,KAAKgF,IAC7ClJ,OAAOC,iBCpSV,SAAUC,GAeR,QAASoM,GAAUC,EAAKC,EAAQC,EAASC,GACvC7L,KAAK8L,YAAcJ,EAAIrI,KAAKwI,GAC5B7L,KAAK+L,eAAiBJ,EAAOtI,KAAKwI,GAClC7L,KAAKgM,gBAAkBJ,EAAQvI,KAAKwI,GAChCI,IACFjM,KAAKkM,SAAW,GAAID,GAAGjM,KAAKmM,gBAAgB9I,KAAKrD,QAnBrD,GAAIoE,GAAUgI,MAAMlF,UAAU9C,QAAQ0D,KAAKzE,KAAK+I,MAAMlF,UAAU9C,SAC5DG,EAAM6H,MAAMlF,UAAU3C,IAAIuD,KAAKzE,KAAK+I,MAAMlF,UAAU3C,KACpD8H,EAAUD,MAAMlF,UAAUoF,MAAMxE,KAAKzE,KAAK+I,MAAMlF,UAAUoF,OAC1DC,EAASH,MAAMlF,UAAUqF,OAAOzE,KAAKzE,KAAK+I,MAAMlF,UAAUqF,QAC1DN,EAAK9M,OAAOqN,kBAAoBrN,OAAOsN,uBACvCC,EAAW,iBACXC,GACFC,SAAS,EACTC,WAAW,EACXC,YAAY,EACZC,mBAAmB,EACnBC,iBAAkB,gBAYpBvB,GAAUvE,WACR+F,aAAc,SAAS3N,GAQjBD,EAAM+D,cAAczD,UAAUL,IAChCU,KAAKkM,SAASgB,QAAQ5N,EAAQqN,IAGlCQ,gBAAiB,SAAS7N,GACxBU,KAAKiN,aAAa3N,GACdA,IAAW6B,UAAoC,aAAxBA,SAASiM,WAClCpN,KAAKqN,gBAELrN,KAAKsN,kBAAkBhO,IAG3BgO,kBAAmB,SAAShO,GAC1B8E,EAAQpE,KAAKuN,aAAajO,GAASU,KAAKwN,WAAYxN,OAEtDuN,aAAc,SAASjO,GACrB,MAAIA,GAAOmO,iBACFnO,EAAOmO,iBAAiBf,OAInCgB,cAAe,SAASlJ,GACtBxE,KAAK+L,eAAevH,IAEtBgJ,WAAY,SAAShJ,GACnBxE,KAAK8L,YAAYtH,IAEnBmJ,eAAgB,SAASnJ,EAAIoJ,GAC3B5N,KAAKgM,gBAAgBxH,EAAIoJ,IAE3BC,YAAa,SAASC,EAAOC,GAC3B,MAAOD,GAAME,OAAO3B,EAAQ0B,KAG9BV,cAAe,WACblM,SAASqJ,iBAAiB,mBAAoB,WAChB,aAAxBrJ,SAASiM,YACXpN,KAAKsN,kBAAkBnM,WAEzBkC,KAAKrD,QAETiO,UAAW,SAAS3L,GAClB,MAAOA,GAAEjB,WAAaC,KAAK4M,cAE7BC,oBAAqB,SAASC,GAE5B,GAAIC,GAAO9J,EAAI6J,EAASpO,KAAKuN,aAAcvN,KAI3C,OAFAqO,GAAK5N,KAAK8L,EAAO6B,EAASpO,KAAKiO,YAExBI,EAAKC,OAAOtO,KAAK6N,iBAE1B1B,gBAAiB,SAASoC,GACxBA,EAAUnK,QAAQpE,KAAKwO,gBAAiBxO,OAE1CwO,gBAAiB,SAAS3H,GACxB,GAAe,cAAXA,EAAE4C,KAAsB,CAC1B,GAAIgF,GAAQzO,KAAKmO,oBAAoBtH,EAAE6H,WACvCD,GAAMrK,QAAQpE,KAAKwN,WAAYxN,KAC/B,IAAI2O,GAAU3O,KAAKmO,oBAAoBtH,EAAE+H,aACzCD,GAAQvK,QAAQpE,KAAK0N,cAAe1N,UAChB,eAAX6G,EAAE4C,MACXzJ,KAAK2N,eAAe9G,EAAEvH,OAAQuH,EAAE+G,YAKjC3B,IACHR,EAAUvE,UAAU+F,aAAe,WACjC4B,QAAQC,KAAK,iGAIjBzP,EAAMoM,UAAYA,GACjBtM,OAAOC,iBClHV,SAAWC,GACT,GAAIgJ,GAAahJ,EAAMgJ,WACnBC,EAAaD,EAAWC,WAExByG,EAAa,GAEbC,GAAoB,EAAG,EAAG,EAAG,GAE7BC,GAAc,CAClB,KACEA,EAA+D,IAAjD,GAAIC,YAAW,QAASjJ,QAAS,IAAIA,QACnD,MAAOb,IAGT,GAAI+J,IACFC,WAAY,EACZC,aAAc,QACdrG,QACE,YACA,YACA,WAEFE,SAAU,SAAS5J,GACjB+I,EAAW4B,OAAO3K,EAAQU,KAAKgJ,SAEjCK,WAAY,SAAS/J,GACnB+I,EAAW8B,SAAS7K,EAAQU,KAAKgJ,SAEnCsG,eAEAC,0BAA2B,SAAS7N,GAGlC,IAAK,GAA2BV,GAF5BwO,EAAMxP,KAAKsP,YACX1O,EAAIc,EAAQC,QAASd,EAAIa,EAAQE,QAC5BY,EAAI,EAAG4G,EAAIoG,EAAI1J,OAAesD,EAAJ5G,IAAUxB,EAAIwO,EAAIhN,IAAKA,IAAK,CAE7D,GAAIiN,GAAKC,KAAKC,IAAI/O,EAAII,EAAEJ,GAAIgP,EAAKF,KAAKC,IAAI9O,EAAIG,EAAEH,EAChD,IAAUkO,GAANU,GAA0BV,GAANa,EACtB,OAAO,IAIbC,aAAc,SAASnO,GACrB,GAAI0D,GAAIiD,EAAW0C,WAAWrJ,EAO9B,OANA0D,GAAEe,UAAYnG,KAAKoP,WACnBhK,EAAEsB,WAAY,EACdtB,EAAEoB,YAAcxG,KAAKqP,aAChBJ,IACH7J,EAAEa,QAAU+I,EAAiB5J,EAAE0K,QAAU,GAEpC1K,GAET2K,UAAW,SAASrO,GAClB,IAAK1B,KAAKuP,0BAA0B7N,GAAU,CAC5C,GAAIsE,GAAIsC,EAAWf,IAAIvH,KAAKoP,WAGxBpJ,IACFhG,KAAKgQ,QAAQtO,EAEf,IAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B4G,GAAWlB,IAAIpH,KAAKoP,WAAYhK,EAAE9F,QAClC+I,EAAWiB,KAAKlE,KAGpB6K,UAAW,SAASvO,GAClB,IAAK1B,KAAKuP,0BAA0B7N,GAAU,CAC5C,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE9F,OAASgJ,EAAWZ,IAAI1H,KAAKoP,YAC/B/G,EAAWmB,KAAKpE,KAGpB4K,QAAS,SAAStO,GAChB,IAAK1B,KAAKuP,0BAA0B7N,GAAU,CAC5C,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE8K,cAAgB9K,EAAE9F,OACpB8F,EAAE9F,OAASgJ,EAAWZ,IAAI1H,KAAKoP,YAC/B/G,EAAWsB,GAAGvE,GACdpF,KAAKmQ,iBAGTA,aAAc,WACZ7H,EAAW,UAAUtI,KAAKoP,aAI9B/P,GAAM8P,YAAcA,GACnBhQ,OAAOC,iBCtFV,SAAUC,GACR,GAQI+Q,GARA/H,EAAahJ,EAAMgJ,WACnB/H,EAAajB,EAAM+D,cAAc9C,WAAW+C,KAAKhE,EAAM+D,eACvDkF,EAAaD,EAAWC,WAGxB+H,GAFWjE,MAAMlF,UAAU3C,IAAIuD,KAAKzE,KAAK+I,MAAMlF,UAAU3C,KAEzC,MAChB+L,EAAsB,IACtBC,EAAS,eAETC,EAA8D,gBAApCrP,UAAS2C,KAAKC,MAAMC,YAG9CyM,GACFzH,QACE,aACA,YACA,WACA,eAEFE,SAAU,SAAS5J,GACbkR,EACFnI,EAAW4B,OAAO3K,EAAQU,KAAKgJ,QAE/BoH,EAAUjD,gBAAgB7N,IAG9B+J,WAAY,SAAS/J,GACfkR,GACFnI,EAAW8B,SAAS7K,EAAQU,KAAKgJ,SAKrC0H,aAAc,SAASlM,GACrB,GAAI1C,GAAI0C,EAAGmM,aAAaJ,GACpBzP,EAAKd,KAAK4Q,wBAAwB9O,EAClChB,KACF0D,EAAGqM,YAAc/P,EACjBuH,EAAW4B,OAAOzF,EAAIxE,KAAKgJ,QAE3B1I,EAAWkE,GAAIJ,QAAQ,SAASrE,GAC9BA,EAAE8Q,YAAc/P,EAChBuH,EAAW4B,OAAOlK,EAAGC,KAAKgJ,SACzBhJ,QAGP8Q,eAAgB,SAAStM,GACvBA,EAAGqM,YAAcE,OACjB1I,EAAW8B,SAAS3F,EAAIxE,KAAKgJ,QAE7B1I,EAAWkE,GAAIJ,QAAQ,SAASrE,GAC9BA,EAAE8Q,YAAcE,OAChB1I,EAAW8B,SAASpK,EAAGC,KAAKgJ,SAC3BhJ,OAEL2N,eAAgB,SAASnJ,EAAIoJ,GAC3B,GAAI9L,GAAI0C,EAAGmM,aAAaJ,GACpBzP,EAAKd,KAAK4Q,wBAAwB9O,GAClCkP,EAAQhR,KAAK4Q,wBAAwBhD,EAErC9M,IAAMkQ,GACRxM,EAAGqM,YAAc/P,EACjBR,EAAWkE,GAAIJ,QAAQ,SAASrE,GAC9BA,EAAE8Q,YAAc/P,GACfd,OACMgR,EACThR,KAAK8Q,eAAetM,GACX1D,GACTd,KAAK0Q,aAAalM,IAGtByM,aACEC,QAAS,OACTC,UAAW,QACXC,UAAW,QACXC,SAAU,0CAEZT,wBAAyB,SAAS5M,GAChC,GAAIhD,GAAIgD,EACJlD,EAAKd,KAAKiR,WACd,OAAU,SAANjQ,EACK,OACEA,IAAMF,EAAGqQ,UACX,IACEnQ,IAAMF,EAAGsQ,UACX,IACEtQ,EAAGuQ,SAASC,KAAKtQ,GACnB,KADF,QAITqO,aAAc,QACdkC,WAAY,KACZC,eAAgB,SAASC,GACvB,MAAOzR,MAAKuR,aAAeE,EAAQC,YAErCC,gBAAiB,SAASF,IAEM,IAA1BnJ,EAAWvB,YAA+C,IAA1BuB,EAAWvB,YAAoBuB,EAAWf,IAAI,MAChFvH,KAAKuR,WAAaE,EAAQC,WAC1B1R,KAAK4R,SAAWC,EAAGJ,EAAQ9P,QAASmQ,EAAGL,EAAQ7P,SAC/C5B,KAAK+R,WAAY,EACjB/R,KAAKgS,0BAGTC,qBAAsB,SAASC,GACzBA,EAAUxL,YACZ1G,KAAKuR,WAAa,KAClBvR,KAAK4R,QAAU,KACf5R,KAAKmS,oBAGTC,WAAY,EACZC,QAAS,KACTF,gBAAiB,WACf,GAAInI,GAAK,WACPhK,KAAKoS,WAAa,EAClBpS,KAAKqS,QAAU,MACfhP,KAAKrD,KACPA,MAAKqS,QAAUC,WAAWtI,EAAIsG,IAEhC0B,sBAAuB,WACjBhS,KAAKqS,SACPE,aAAavS,KAAKqS,UAGtBG,cAAe,SAAS/I,GACtB,GAAIgJ,GAAM,CAIV,QAHa,eAAThJ,GAAkC,cAATA,KAC3BgJ,EAAM,GAEDA,GAEThR,WAAY,SAASiR,EAAOC,GAC1B,MAAoC,eAAhC3S,KAAK4S,kBAAkBnJ,KAClBpK,EAAMoC,WAAWiR,GAGnBpK,EAAWZ,IAAIiL,IAExBE,eAAgB,SAASpB,GACvB,GAAIqB,GAAM9S,KAAK4S,kBACXxN,EAAIiD,EAAW0C,WAAW0G,GAI1BkB,EAAKvN,EAAEe,UAAYsL,EAAQC,WAAa,CAC5CtM,GAAE9F,OAASU,KAAKyB,WAAWgQ,EAASkB,GACpCvN,EAAEG,SAAU,EACZH,EAAEI,YAAa,EACfJ,EAAE2N,OAAS/S,KAAKoS,WAChBhN,EAAEa,QAAUjG,KAAKwS,cAAcM,EAAIrJ,MACnCrE,EAAEgB,MAAQqL,EAAQuB,eAAiBvB,EAAQwB,SAAW,EACtD7N,EAAEiB,OAASoL,EAAQyB,eAAiBzB,EAAQ0B,SAAW,EACvD/N,EAAEc,SAAWuL,EAAQ2B,aAAe3B,EAAQ4B,OAAS,GACrDjO,EAAEsB,UAAY1G,KAAKwR,eAAeC,GAClCrM,EAAEoB,YAAcxG,KAAKqP,YAErB,IAAIiE,GAAOtT,IAMX,OALAoF,GAAEwF,eAAiB,WACjB0I,EAAKvB,WAAY,EACjBuB,EAAK1B,QAAU,KACfkB,EAAIlI,kBAECxF,GAETmO,eAAgB,SAAS7R,EAAS8R,GAChC,GAAIC,GAAK/R,EAAQgS,cACjB1T,MAAK4S,kBAAoBlR,CACzB,KAAK,GAAWV,GAAPwB,EAAI,EAAMA,EAAIiR,EAAG3N,OAAQtD,IAChCxB,EAAIyS,EAAGjR,GACPgR,EAAW1L,KAAK9H,KAAMA,KAAK6S,eAAe7R,KAK9C2S,aAAc,SAASjS,GACrB,GAAI1B,KAAK4R,QAAS,CAChB,GAAIa,GACAmB,EAAalS,EAAQmS,cAAchD,WACvC,IAAmB,SAAf+C,EAEFnB,GAAM,MACD,IAAmB,OAAfmB,EAETnB,GAAM,MACD,CACL,GAAIzR,GAAIU,EAAQgS,eAAe,GAE3B5R,EAAI8R,EACJE,EAAoB,MAAfF,EAAqB,IAAM,IAChCG,EAAKrE,KAAKC,IAAI3O,EAAE,SAAWc,GAAK9B,KAAK4R,QAAQ9P,IAC7CkS,EAAMtE,KAAKC,IAAI3O,EAAE,SAAW8S,GAAM9T,KAAK4R,QAAQkC,GAGnDrB,GAAMsB,GAAMC,EAGd,MADAhU,MAAK4R,QAAU,KACRa,IAGXwB,UAAW,SAASC,EAAM7M,GACxB,IAAK,GAA4BrG,GAAxBwB,EAAI,EAAG4G,EAAI8K,EAAKpO,OAAesD,EAAJ5G,IAAUxB,EAAIkT,EAAK1R,IAAKA,IAC1D,GAAIxB,EAAE0Q,aAAerK,EACnB,OAAO,GAUb8M,cAAe,SAASzS,GACtB,GAAI+R,GAAK/R,EAAQ0S,OAGjB,IAAI9L,EAAWvB,YAAc0M,EAAG3N,OAAQ,CACtC,GAAI1D,KACJkG,GAAWlE,QAAQ,SAASiQ,EAAOC,GAIjC,GAAY,IAARA,IAActU,KAAKiU,UAAUR,EAAIa,EAAM,GAAI,CAC7C,GAAItO,GAAIqO,EAAME,GACdnS,GAAE3B,KAAKuF,KAERhG,MACHoC,EAAEgC,QAAQpE,KAAKwU,UAAWxU,QAG9ByU,WAAY,SAAS/S,GACnB1B,KAAKmU,cAAczS,GACnB1B,KAAK2R,gBAAgBjQ,EAAQgS,eAAe,IAC5C1T,KAAK0U,gBAAgBhT,GAChB1B,KAAK+R,YACR/R,KAAKoS,aACLpS,KAAKuT,eAAe7R,EAAS1B,KAAKsJ,QAGtCA,KAAM,SAAS4I,GACL5J,EAAWlB,IAAI8K,EAAU/L,UAAW+L,EAAU5S,OACtD+I,GAAWiB,KAAK4I,IAElByC,UAAW,SAASjT,GACd8O,EACFxQ,KAAKuT,eAAe7R,EAAS1B,KAAKwJ,MAE7BxJ,KAAK+R,YACJ/R,KAAK2T,aAAajS,IACpB1B,KAAK+R,WAAY,EACjB/R,KAAK4U,YAAYlT,KAEjBA,EAAQkJ,iBACR5K,KAAKuT,eAAe7R,EAAS1B,KAAKwJ,SAK1CA,KAAM,SAAS0I,GACb,GAAI2C,GAAUvM,EAAWZ,IAAIwK,EAAU/L,UAElC0O,IAGLxM,EAAWmB,KAAK0I,IAElB4C,SAAU,SAASpT,GACjB1B,KAAK0U,gBAAgBhT,GACrB1B,KAAKuT,eAAe7R,EAAS1B,KAAK2J,KAEpCA,GAAI,SAASuI,GACNlS,KAAK+R,YACRG,EAAUhC,cAAgB7Q,EAAMoC,WAAWyQ,GAC3C7J,EAAWsB,GAAGuI,IAEhBlS,KAAK+U,eAAe7C,IAEtBtI,OAAQ,SAASsI,GACfA,EAAUhC,cAAgB7Q,EAAMoC,WAAWyQ,GAC3C7J,EAAWuB,OAAOsI,GAClBlS,KAAK+U,eAAe7C,IAEtB0C,YAAa,SAASlT,GACpB1B,KAAKuT,eAAe7R,EAAS1B,KAAK4J,SAEpCmL,eAAgB,SAAS7C,GACvB5J,EAAW,UAAU4J,EAAU/L,WAC/BnG,KAAKiS,qBAAqBC,IAG5BwC,gBAAiB,SAAShT,GACxB,GAAI8N,GAAMnQ,EAAM8P,YAAYG,YACxBtO,EAAIU,EAAQgS,eAAe,EAE/B,IAAI1T,KAAKwR,eAAexQ,GAAI,CAE1B,GAAIgU,IAAMpU,EAAGI,EAAEW,QAASd,EAAGG,EAAEY,QAC7B4N,GAAI/O,KAAKuU,EACT,IAAIhL,GAAK,SAAUwF,EAAKwF,GACtB,GAAIxS,GAAIgN,EAAIlI,QAAQ0N,EAChBxS,GAAI,IACNgN,EAAI/H,OAAOjF,EAAG,IAEfa,KAAK,KAAMmM,EAAKwF,EACnB1C,YAAWtI,EAAIqG,KAKhBG,KACHJ,EAAY,GAAI/Q,GAAMoM,UAAUgF,EAAYC,aAAcD,EAAYK,eAAgBL,EAAY9C,eAAgB8C,IAGpHpR,EAAMoR,YAAcA,GACnBtR,OAAOC,iBC5TV,SAAUC,GACR,GAAIgJ,GAAahJ,EAAMgJ,WACnBC,EAAaD,EAAWC,WACxB2M,EAAkB9V,OAAO+V,gBAAwE,gBAA/C/V,QAAO+V,eAAeC,qBACxEC,GACFpM,QACE,gBACA,gBACA,cACA,mBAEFE,SAAU,SAAS5J,GACjB+I,EAAW4B,OAAO3K,EAAQU,KAAKgJ,SAEjCK,WAAY,SAAS/J,GACnB+I,EAAW8B,SAAS7K,EAAQU,KAAKgJ,SAEnCqM,eACE,GACA,cACA,QACA,MACA,SAEFxF,aAAc,SAASnO,GACrB,GAAI0D,GAAI1D,CAKR,OAJIuT,KACF7P,EAAIiD,EAAW0C,WAAWrJ,GAC1B0D,EAAEoB,YAAcxG,KAAKqV,cAAc3T,EAAQ8E,cAEtCpB,GAETkQ,QAAS,SAAS3C,GAChBrK,EAAW,UAAUqK,IAEvB4C,cAAe,SAAS7T,GACtB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B4G,GAAWlB,IAAI1F,EAAQyE,UAAWf,EAAE9F,QACpC+I,EAAWiB,KAAKlE,IAElBoQ,cAAe,SAAS9T,GACtB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE9F,OAASgJ,EAAWZ,IAAItC,EAAEe,WAC5BkC,EAAWmB,KAAKpE,IAElBqQ,YAAa,SAAS/T,GACpB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE8K,cAAgB9K,EAAE9F,OACpB8F,EAAE9F,OAASgJ,EAAWZ,IAAItC,EAAEe,WAC5BkC,EAAWsB,GAAGvE,GACdpF,KAAKsV,QAAQ5T,EAAQyE,YAEvBuP,gBAAiB,SAAShU,GACxB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE8K,cAAgB9K,EAAE9F,OACpB8F,EAAE9F,OAASgJ,EAAWZ,IAAItC,EAAEe,WAC5BkC,EAAWuB,OAAOxE,GAClBpF,KAAKsV,QAAQ5T,EAAQyE,YAIzB9G,GAAM+V,SAAWA,GAChBjW,OAAOC,iBC9DV,SAAUC,GACR,GAAIgJ,GAAahJ,EAAMgJ,WACnBC,EAAaD,EAAWC,WACxBqN,GACF3M,QACE,cACA,cACA,YACA,iBAEF6G,aAAc,SAASnO,GACrB,MAAO2G,GAAW0C,WAAWrJ,IAE/BwH,SAAU,SAAS5J,GACjB+I,EAAW4B,OAAO3K,EAAQU,KAAKgJ,SAEjCK,WAAY,SAAS/J,GACnB+I,EAAW8B,SAAS7K,EAAQU,KAAKgJ,SAEnCsM,QAAS,SAAS3C,GAChBrK,EAAW,UAAUqK,IAEvBiD,YAAa,SAASlU,GACpB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B4G,GAAWlB,IAAIhC,EAAEe,UAAWf,EAAE9F,QAC9B+I,EAAWiB,KAAKlE,IAElByQ,YAAa,SAASnU,GACpB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE9F,OAASgJ,EAAWZ,IAAItC,EAAEe,WAC5BkC,EAAWmB,KAAKpE,IAElB0Q,UAAW,SAASpU,GAClB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE8K,cAAgB9K,EAAE9F,OACpB8F,EAAE9F,OAASgJ,EAAWZ,IAAItC,EAAEe,WAC5BkC,EAAWsB,GAAGvE,GACdpF,KAAKsV,QAAQ5T,EAAQyE,YAEvB4P,cAAe,SAASrU,GACtB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE8K,cAAgB9K,EAAE9F,OACpB8F,EAAE9F,OAASgJ,EAAWZ,IAAItC,EAAEe,WAC5BkC,EAAWuB,OAAOxE,GAClBpF,KAAKsV,QAAQ5T,EAAQyE,YAIzB9G,GAAMsW,cAAgBA,GACrBxW,OAAOC,iBC5CV,SAAUC,GACR,GAAIgJ,GAAahJ,EAAMgJ,UAEnBlJ,QAAO6W,aACT3N,EAAWO,eAAe,UAAWvJ,EAAMsW,eAClCxW,OAAO8W,UAAUC,iBAC1B7N,EAAWO,eAAe,KAAMvJ,EAAM+V,WAEtC/M,EAAWO,eAAe,QAASvJ,EAAM8P,aACb4B,SAAxB5R,OAAOgX,cACT9N,EAAWO,eAAe,QAASvJ,EAAMoR,cAI7CpI,EAAWa,SAAS/H,WACnBhC,OAAOC,iBC4ET,SAAUC,GACR,GAAIgJ,GAAahJ,EAAMgJ,WACnBtD,EAAe1F,EAAM0F,aACrBuD,EAAa,GAAIjJ,GAAMsH,WACvByP,GACFpN,QACE,OACA,OACA,MAEFqN,iBAAkB,EAClBC,SAAU,SAASC,GACjB,MAAOA,GAAU,EAAI,EAAI,IAE3BC,kBAAmB,SAASC,EAAKC,GAC/B,GAAI9V,GAAI,EAAGC,EAAI,CAKf,OAJI4V,IAAOC,IACT9V,EAAI8V,EAAIC,MAAQF,EAAIE,MACpB9V,EAAI6V,EAAIE,MAAQH,EAAIG,QAEdhW,EAAGA,EAAGC,EAAGA,IAEnBgW,UAAW,SAAS3R,EAAQxD,EAASoV,GACnC,GAAI9V,GAAI8V,EACJ1U,EAAIpC,KAAKwW,kBAAkBxV,EAAE+V,UAAWrV,GACxCsV,EAAKhX,KAAKwW,kBAAkBxV,EAAEiW,cAAevV,EAC7CsV,GAAGpW,IACLI,EAAEkW,WAAalX,KAAKsW,SAASU,EAAGpW,IAE9BoW,EAAGnW,IACLG,EAAEmW,WAAanX,KAAKsW,SAASU,EAAGnW,GAElC,IAAIuE,GAAIL,EAAaU,iBAAiBP,GACpCK,SAAS,EACTC,YAAY,EACZiK,GAAIrN,EAAExB,EACNgP,GAAIxN,EAAEvB,EACNuW,IAAKJ,EAAGpW,EACRyW,IAAKL,EAAGnW,EACRD,EAAGc,EAAQd,EACXC,EAAGa,EAAQb,EACXc,QAASD,EAAQC,QACjBC,QAASF,EAAQE,QACjB+U,MAAOjV,EAAQiV,MACfC,MAAOlV,EAAQkV,MACfU,QAAS5V,EAAQ4V,QACjBC,QAAS7V,EAAQ6V,QACjBL,WAAYlW,EAAEkW,WACdC,WAAYnW,EAAEmW,WACdK,UAAWxW,EAAEwW,UACbtH,cAAexO,EAAQwO,cACvB1J,YAAa9E,EAAQ8E,YACrBL,UAAWzE,EAAQyE,WAErBnF,GAAEyW,WAAW3M,cAAc1F,IAE7BkE,KAAM,SAAS5H,GACb,GAAIA,EAAQgF,YAAsC,UAAxBhF,EAAQ8E,YAA8C,IAApB9E,EAAQuE,SAAgB,GAAO,CACzF,GAAID,IACF+Q,UAAWrV,EACX+V,WAAY/V,EAAQpC,OACpBkY,aACAP,cAAe,KACfC,WAAY,EACZC,WAAY,EACZO,UAAU,EAEZpP,GAAWlB,IAAI1F,EAAQyE,UAAWH,KAGtCwD,KAAM,SAAS9H,GACb,GAAIsE,GAAIsC,EAAWZ,IAAIhG,EAAQyE,UAC/B,IAAIH,EAAG,CACL,GAAKA,EAAE0R,SAUL1X,KAAK6W,UAAU,QAASnV,EAASsE,OAVlB,CACf,GAAI5D,GAAIpC,KAAKwW,kBAAkBxQ,EAAE+Q,UAAWrV,GACxC8H,EAAOpH,EAAExB,EAAIwB,EAAExB,EAAIwB,EAAEvB,EAAIuB,EAAEvB,CAE3B2I,GAAOxJ,KAAKqW,mBACdrQ,EAAE0R,UAAW,EACb1X,KAAK6W,UAAU,aAAc7Q,EAAE+Q,UAAW/Q,GAC1ChG,KAAK6W,UAAU,QAASnV,EAASsE,IAKrCA,EAAEiR,cAAgBvV,IAGtBiI,GAAI,SAASjI,GACX,GAAIsE,GAAIsC,EAAWZ,IAAIhG,EAAQyE,UAC3BH,KACEA,EAAE0R,UACJ1X,KAAK6W,UAAU,WAAYnV,EAASsE,GAEtCsC,EAAWd,OAAO9F,EAAQyE,aAIhCkC,GAAWY,gBAAgB,QAASmN,IACnCjX,OAAOC,iBCvJX,SAAUC,GACR,GAAIgJ,GAAahJ,EAAMgJ,WACnBtD,EAAe1F,EAAM0F,aACrB4S,GAEFC,WAAY,IAEZvB,iBAAkB,GAClBrN,QACE,OACA,OACA,MAEF6O,YAAa,KACbC,QAAS,KACTC,MAAO,WACL,GAAIJ,GAAOK,KAAKC,MAAQjY,KAAK6X,YAAYK,UACrCzO,EAAOzJ,KAAKmY,KAAO,YAAc,MACrCnY,MAAKoY,SAAS3O,EAAMkO,GACpB3X,KAAKmY,MAAO,GAEdvO,OAAQ,WACNyO,cAAcrY,KAAK8X,SACf9X,KAAKmY,MACPnY,KAAKoY,SAAS,WAEhBpY,KAAKmY,MAAO,EACZnY,KAAK6X,YAAc,KACnB7X,KAAKV,OAAS,KACdU,KAAK8X,QAAU,MAEjBxO,KAAM,SAAS5H,GACTA,EAAQgF,YAAc1G,KAAK6X,cAC7B7X,KAAK6X,YAAcnW,EACnB1B,KAAKV,OAASoC,EAAQpC,OACtBU,KAAK8X,QAAUQ,YAAYtY,KAAK+X,MAAM1U,KAAKrD,MAAOA,KAAK4X,cAG3DjO,GAAI,SAASjI,GACP1B,KAAK6X,aAAe7X,KAAK6X,YAAY1R,YAAczE,EAAQyE,WAC7DnG,KAAK4J,UAGTJ,KAAM,SAAS9H,GACb,GAAI1B,KAAK6X,aAAe7X,KAAK6X,YAAY1R,YAAczE,EAAQyE,UAAW,CACxE,GAAIvF,GAAIc,EAAQC,QAAU3B,KAAK6X,YAAYlW,QACvCd,EAAIa,EAAQE,QAAU5B,KAAK6X,YAAYjW,OACtChB,GAAIA,EAAIC,EAAIA,EAAKb,KAAKqW,kBACzBrW,KAAK4J,WAIXwO,SAAU,SAASlT,EAAQqT,GACzB,GAAIvS,IACFT,SAAS,EACTC,YAAY,EACZgB,YAAaxG,KAAK6X,YAAYrR,YAC9BL,UAAWnG,KAAK6X,YAAY1R,UAC5BvF,EAAGZ,KAAK6X,YAAYlW,QACpBd,EAAGb,KAAK6X,YAAYjW,QAElB2W,KACFvS,EAAEwS,SAAWD,EAEf,IAAInT,GAAIL,EAAaU,iBAAiBP,EAAQc,EAC9ChG,MAAKV,OAAOwL,cAAc1F,IAG9BiD,GAAWY,gBAAgB,OAAQ0O,IAClCxY,OAAOC,iBCpFV,SAAUC,GACR,GAAIgJ,GAAahJ,EAAMgJ,WACnBtD,EAAe1F,EAAM0F,aACrBuD,EAAa,GAAIjJ,GAAMsH,WACvB8R,GACFzP,QACE,OACA,MAEFM,KAAM,SAAS5H,GACTA,EAAQgF,YAAchF,EAAQmI,cAChCvB,EAAWlB,IAAI1F,EAAQyE,WACrB7G,OAAQoC,EAAQpC,OAChB2G,QAASvE,EAAQuE,QACjBrF,EAAGc,EAAQC,QACXd,EAAGa,EAAQE,WAIjB8W,UAAW,SAAStT,EAAGuT,GACrB,MAAsB,UAAlBvT,EAAEoB,YAEyB,IAAtBmS,EAAU1S,SAEXb,EAAEyE,cAEZF,GAAI,SAASjI,GACX,GAAIkX,GAAQtQ,EAAWZ,IAAIhG,EAAQyE,UACnC,IAAIyS,GAAS5Y,KAAK0Y,UAAUhX,EAASkX,GAAQ,CAE3C,GAAI5X,GAAI3B,EAAM+D,cAAcvB,IAAI+W,EAAMtZ,OAAQoC,EAAQwO,cACtD,IAAIlP,EAAG,CACL,GAAIoE,GAAIL,EAAaU,iBAAiB,OACpCF,SAAS,EACTC,YAAY,EACZ5E,EAAGc,EAAQC,QACXd,EAAGa,EAAQE,QACXmR,OAAQrR,EAAQqR,OAChBvM,YAAa9E,EAAQ8E,YACrBL,UAAWzE,EAAQyE,UACnB0S,OAAQnX,EAAQmX,OAChBC,QAASpX,EAAQoX,QACjBC,QAASrX,EAAQqX,QACjBC,SAAUtX,EAAQsX,UAEpBhY,GAAE8J,cAAc1F,IAGpBkD,EAAWd,OAAO9F,EAAQyE,YAI9BpB,GAAaC,WAAa,SAASI,GACjC,MAAO,YACLA,EAAEyE,cAAe,EACjBvB,EAAWd,OAAOpC,EAAEe,aAGxBkC,EAAWY,gBAAgB,MAAOwP,IACjCtZ,OAAOC,iBCjEV,SAAW6Z,GACP,YAiEA,SAASC,GAAOC,EAAWC,GACvB,IAAKD,EACD,KAAM,IAAIE,OAAM,WAAaD,GAIrC,QAASE,GAAeC,GACpB,MAAQA,IAAM,IAAY,IAANA,EAMxB,QAASC,GAAaD,GAClB,MAAe,MAAPA,GACI,IAAPA,GACO,KAAPA,GACO,KAAPA,GACO,MAAPA,GACAA,GAAM,MAAU,yGAAyGjS,QAAQhD,OAAOmV,aAAaF,IAAO,EAKrK,QAASG,GAAiBH,GACtB,MAAe,MAAPA,GAAsB,KAAPA,GAAsB,OAAPA,GAA0B,OAAPA,EAK7D,QAASI,GAAkBJ,GACvB,MAAe,MAAPA,GAAsB,KAAPA,GAClBA,GAAM,IAAY,IAANA,GACZA,GAAM,IAAY,KAANA,EAGrB,QAASK,GAAiBL,GACtB,MAAe,MAAPA,GAAsB,KAAPA,GAClBA,GAAM,IAAY,IAANA,GACZA,GAAM,IAAY,KAANA,GACZA,GAAM,IAAY,IAANA,EAKrB,QAASM,GAAUlH,GACf,MAAe,SAAPA,EAKZ,QAASmH,KACL,KAAehU,EAARiU,GAAkBP,EAAa1Q,EAAOkR,WAAWD,OACnDA,EAIT,QAASE,KACL,GAAIrB,GAAOW,CAGX,KADAX,EAAQmB,IACOjU,EAARiU,IACHR,EAAKzQ,EAAOkR,WAAWD,GACnBH,EAAiBL,OACfQ,CAMV,OAAOjR,GAAOwD,MAAMsM,EAAOmB,GAG/B,QAASG,KACL,GAAItB,GAAOjG,EAAIlJ,CAoBf,OAlBAmP,GAAQmB,EAERpH,EAAKsH,IAKDxQ,EADc,IAAdkJ,EAAG7M,OACIqU,EAAMC,WACNP,EAAUlH,GACVwH,EAAME,QACC,SAAP1H,EACAwH,EAAMG,YACC,SAAP3H,GAAwB,UAAPA,EACjBwH,EAAMI,eAENJ,EAAMC,YAIb3Q,KAAMA,EACN4K,MAAO1B,EACP6H,OAAQ5B,EAAOmB,IAOvB,QAASU,KACL,GAEIC,GAEAC,EAJA/B,EAAQmB,EACRa,EAAO9R,EAAOkR,WAAWD,GAEzBc,EAAM/R,EAAOiR,EAGjB,QAAQa,GAGR,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IAED,QADEb,GAEEtQ,KAAM0Q,EAAMW,WACZzG,MAAO/P,OAAOmV,aAAamB,GAC3BJ,OAAQ5B,EAAOmB,GAGvB,SAII,GAHAW,EAAQ5R,EAAOkR,WAAWD,EAAQ,GAGpB,KAAVW,EACA,OAAQE,GACR,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KAED,MADAb,IAAS,GAELtQ,KAAM0Q,EAAMW,WACZzG,MAAO/P,OAAOmV,aAAamB,GAAQtW,OAAOmV,aAAaiB,GACvDF,OAAQ5B,EAAOmB,GAGvB,KAAK,IACL,IAAK,IAOD,MANAA,IAAS,EAGwB,KAA7BjR,EAAOkR,WAAWD,MAChBA,GAGFtQ,KAAM0Q,EAAMW,WACZzG,MAAOvL,EAAOwD,MAAMsM,EAAOmB,GAC3BS,OAAQ5B,EAAOmB,KAe/B,MAJAY,GAAM7R,EAAOiR,EAAQ,GAIjBc,IAAQF,GAAQ,KAAKrT,QAAQuT,IAAQ,GACrCd,GAAS,GAELtQ,KAAM0Q,EAAMW,WACZzG,MAAOwG,EAAMF,EACbH,OAAQ5B,EAAOmB,KAInB,eAAezS,QAAQuT,IAAQ,KAC7Bd,GAEEtQ,KAAM0Q,EAAMW,WACZzG,MAAOwG,EACPL,OAAQ5B,EAAOmB,SAIvBgB,MAAeC,EAASC,gBAAiB,WAI7C,QAASC,KACL,GAAIC,GAAQvC,EAAOW,CAQnB,IANAA,EAAKzQ,EAAOiR,GACZb,EAAOI,EAAeC,EAAGS,WAAW,KAAe,MAAPT,EACxC,sEAEJX,EAAQmB,EACRoB,EAAS,GACE,MAAP5B,EAAY,CAaZ,IAZA4B,EAASrS,EAAOiR,KAChBR,EAAKzQ,EAAOiR,GAIG,MAAXoB,GAEI5B,GAAMD,EAAeC,EAAGS,WAAW,KACnCe,KAAeC,EAASC,gBAAiB,WAI1C3B,EAAexQ,EAAOkR,WAAWD,KACpCoB,GAAUrS,EAAOiR,IAErBR,GAAKzQ,EAAOiR,GAGhB,GAAW,MAAPR,EAAY,CAEZ,IADA4B,GAAUrS,EAAOiR,KACVT,EAAexQ,EAAOkR,WAAWD,KACpCoB,GAAUrS,EAAOiR,IAErBR,GAAKzQ,EAAOiR,GAGhB,GAAW,MAAPR,GAAqB,MAAPA,EAOd,GANA4B,GAAUrS,EAAOiR,KAEjBR,EAAKzQ,EAAOiR,IACD,MAAPR,GAAqB,MAAPA,KACd4B,GAAUrS,EAAOiR,MAEjBT,EAAexQ,EAAOkR,WAAWD,IACjC,KAAOT,EAAexQ,EAAOkR,WAAWD,KACpCoB,GAAUrS,EAAOiR,SAGrBgB,MAAeC,EAASC,gBAAiB,UAQjD,OAJItB,GAAkB7Q,EAAOkR,WAAWD,KACpCgB,KAAeC,EAASC,gBAAiB,YAIzCxR,KAAM0Q,EAAMiB,eACZ/G,MAAOgH,WAAWF,GAClBX,OAAQ5B,EAAOmB,IAMvB,QAASuB,KACL,GAAcC,GAAO3C,EAAOW,EAAxBiC,EAAM,GAAsBC,GAAQ,CASxC,KAPAF,EAAQzS,EAAOiR,GACfb,EAAkB,MAAVqC,GAA4B,MAAVA,EACtB,2CAEJ3C,EAAQmB,IACNA,EAEajU,EAARiU,GAAgB,CAGnB,GAFAR,EAAKzQ,EAAOiR,KAERR,IAAOgC,EAAO,CACdA,EAAQ,EACR,OACG,GAAW,OAAPhC,EAEP,GADAA,EAAKzQ,EAAOiR,KACPR,GAAOG,EAAiBH,EAAGS,WAAW,IA0B3B,OAART,GAAkC,OAAlBzQ,EAAOiR,MACrBA,MA1BN,QAAQR,GACR,IAAK,IACDiC,GAAO,IACP,MACJ,KAAK,IACDA,GAAO,IACP,MACJ,KAAK,IACDA,GAAO,GACP,MACJ,KAAK,IACDA,GAAO,IACP,MACJ,KAAK,IACDA,GAAO,IACP,MACJ,KAAK,IACDA,GAAO,GACP,MAEJ,SACIA,GAAOjC,MAQZ,CAAA,GAAIG,EAAiBH,EAAGS,WAAW,IACtC,KAEAwB,IAAOjC,GAQf,MAJc,KAAVgC,GACAR,KAAeC,EAASC,gBAAiB,YAIzCxR,KAAM0Q,EAAMuB,cACZrH,MAAOmH,EACPC,MAAOA,EACPjB,OAAQ5B,EAAOmB,IAIvB,QAAS4B,GAAiBC,GACtB,MAAOA,GAAMnS,OAAS0Q,EAAMC,YACxBwB,EAAMnS,OAAS0Q,EAAME,SACrBuB,EAAMnS,OAAS0Q,EAAMI,gBACrBqB,EAAMnS,OAAS0Q,EAAMG,YAG7B,QAASuB,KACL,GAAItC,EAIJ,OAFAO,KAEIC,GAASjU,GAEL2D,KAAM0Q,EAAM2B,IACZtB,OAAQT,EAAOA,KAIvBR,EAAKzQ,EAAOkR,WAAWD,GAGZ,KAAPR,GAAoB,KAAPA,GAAoB,KAAPA,EACnBkB,IAIA,KAAPlB,GAAoB,KAAPA,EACN+B,IAGP3B,EAAkBJ,GACXW,IAKA,KAAPX,EACID,EAAexQ,EAAOkR,WAAWD,EAAQ,IAClCmB,IAEJT,IAGPnB,EAAeC,GACR2B,IAGJT,KAGX,QAASsB,KACL,GAAIH,EASJ,OAPAA,GAAQI,EACRjC,EAAQ6B,EAAMpB,MAAM,GAEpBwB,EAAYH,IAEZ9B,EAAQ6B,EAAMpB,MAAM,GAEboB,EAGX,QAASK,KACL,GAAIC,EAEJA,GAAMnC,EACNiC,EAAYH,IACZ9B,EAAQmC,EAKZ,QAASnB,GAAWa,EAAOO,GACvB,GAAIC,GACAC,EAAOjQ,MAAMlF,UAAUoF,MAAMxE,KAAKwU,UAAW,GAC7CC,EAAMJ,EAAcK,QAChB,SACA,SAAUC,EAAO1C,GAEb,MADAb,GAAOa,EAAQsC,EAAKvW,OAAQ,sCACrBuW,EAAKtC,IAOxB,MAHAqC,GAAQ,GAAI/C,OAAMkD,GAClBH,EAAMrC,MAAQA,EACdqC,EAAMM,YAAcH,EACdH,EAKV,QAASO,GAAgBf,GACrBb,EAAWa,EAAOZ,EAASC,gBAAiBW,EAAMvH,OAMtD,QAASuI,GAAOvI,GACZ,GAAIuH,GAAQG,KACRH,EAAMnS,OAAS0Q,EAAMW,YAAcc,EAAMvH,QAAUA,IACnDsI,EAAgBf,GAMxB,QAASiB,GAAMxI,GACX,MAAO2H,GAAUvS,OAAS0Q,EAAMW,YAAckB,EAAU3H,QAAUA,EAKtE,QAASyI,GAAaC,GAClB,MAAOf,GAAUvS,OAAS0Q,EAAME,SAAW2B,EAAU3H,QAAU0I,EAwBnE,QAASC,KACL,GAAIC,KAIJ,KAFAL,EAAO,MAECC,EAAM,MACNA,EAAM,MACNd,IACAkB,EAASxc,KAAK,QAEdwc,EAASxc,KAAKyc,MAETL,EAAM,MACPD,EAAO,KAOnB,OAFAA,GAAO,KAEAO,EAASC,sBAAsBH,GAK1C,QAASI,KACL,GAAIzB,EAOJ,OALA9B,KACA8B,EAAQG,IAIJH,EAAMnS,OAAS0Q,EAAMuB,eAAiBE,EAAMnS,OAAS0Q,EAAMiB,eACpD+B,EAASG,cAAc1B,GAG3BuB,EAASI,iBAAiB3B,EAAMvH,OAG3C,QAASmJ,KACL,GAAI5B,GAAOtH,CAWX,OATAsH,GAAQI,EACRlC,KAEI8B,EAAMnS,OAAS0Q,EAAM2B,KAAOF,EAAMnS,OAAS0Q,EAAMW,aACjD6B,EAAgBf,GAGpBtH,EAAM+I,IACNT,EAAO,KACAO,EAASM,eAAe,OAAQnJ,EAAK4I,MAGhD,QAASQ,KACL,GAAIC,KAIJ,KAFAf,EAAO,MAECC,EAAM,MACVc,EAAWld,KAAK+c,KAEXX,EAAM,MACPD,EAAO,IAMf,OAFAA,GAAO,KAEAO,EAASS,uBAAuBD,GAK3C,QAASE,KACL,GAAIC,EAQJ,OANAlB,GAAO,KAEPkB,EAAOZ,KAEPN,EAAO,KAEAkB,EAMX,QAASC,KACL,GAAItU,GAAMmS,EAAOkC,CAEjB,OAAIjB,GAAM,KACCgB,KAGXpU,EAAOuS,EAAUvS,KAEbA,IAAS0Q,EAAMC,WACf0D,EAAOX,EAASI,iBAAiBxB,IAAM1H,OAChC5K,IAAS0Q,EAAMuB,eAAiBjS,IAAS0Q,EAAMiB,eACtD0C,EAAOX,EAASG,cAAcvB,KACvBtS,IAAS0Q,EAAME,QAClByC,EAAa,UACbf,IACA+B,EAAOX,EAASa,wBAEbvU,IAAS0Q,EAAMI,gBACtBqB,EAAQG,IACRH,EAAMvH,MAAyB,SAAhBuH,EAAMvH,MACrByJ,EAAOX,EAASG,cAAc1B,IACvBnS,IAAS0Q,EAAMG,aACtBsB,EAAQG,IACRH,EAAMvH,MAAQ,KACdyJ,EAAOX,EAASG,cAAc1B,IACvBiB,EAAM,KACbiB,EAAOd,IACAH,EAAM,OACbiB,EAAOJ,KAGPI,EACOA,MAGXnB,GAAgBZ,MAKpB,QAASkC,KACL,GAAI5B,KAIJ,IAFAO,EAAO,MAEFC,EAAM,KACP,KAAe/W,EAARiU,IACHsC,EAAK5b,KAAKyc,OACNL,EAAM,OAGVD,EAAO,IAMf,OAFAA,GAAO,KAEAP,EAGX,QAAS6B,KACL,GAAItC,EAQJ,OANAA,GAAQG,IAEHJ,EAAiBC,IAClBe,EAAgBf,GAGbuB,EAASI,iBAAiB3B,EAAMvH,OAG3C,QAAS8J,KAGL,MAFAvB,GAAO,KAEAsB,IAGX,QAASE,KACL,GAAIN,EAQJ,OANAlB,GAAO,KAEPkB,EAAOZ,KAEPN,EAAO,KAEAkB,EAGX,QAASO,KACL,GAAIP,GAAMQ,CAIV,KAFAR,EAAOC,IAEAlB,EAAM,MAAQA,EAAM,MACnBA,EAAM,MACNyB,EAAWF,IACXN,EAAOX,EAASoB,uBAAuB,IAAKT,EAAMQ,KAElDA,EAAWH,IACXL,EAAOX,EAASoB,uBAAuB,IAAKT,EAAMQ,GAI1D,OAAOR,GASX,QAASU,KACL,GAAI5C,GAAOkC,CAcX,OAZI9B,GAAUvS,OAAS0Q,EAAMW,YAAckB,EAAUvS,OAAS0Q,EAAME,QAChEyD,EAAOW,KACA5B,EAAM,MAAQA,EAAM,MAAQA,EAAM,MACzCjB,EAAQG,IACR+B,EAAOU,IACPV,EAAOX,EAASuB,sBAAsB9C,EAAMvH,MAAOyJ,IAC5ChB,EAAa,WAAaA,EAAa,SAAWA,EAAa,UACtE/B,KAAeC,EAASC,iBAExB6C,EAAOW,KAGJX,EAGX,QAASa,GAAiB/C,GACtB,GAAIgD,GAAO,CAEX,IAAIhD,EAAMnS,OAAS0Q,EAAMW,YAAcc,EAAMnS,OAAS0Q,EAAME,QACxD,MAAO,EAGX,QAAQuB,EAAMvH,OACd,IAAK,KACDuK,EAAO,CACP,MAEJ,KAAK,KACDA,EAAO,CACP,MAEJ,KAAK,KACL,IAAK,KACL,IAAK,MACL,IAAK,MACDA,EAAO,CACP,MAEJ,KAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,aACDA,EAAO,CACP,MAEJ,KAAK,KACDA,EAAO,CACP,MAEJ,KAAK,IACL,IAAK,IACDA,EAAO,CACP,MAEJ,KAAK,IACL,IAAK,IACL,IAAK,IACDA,EAAO,GAOX,MAAOA,GAWX,QAASC,KACL,GAAIf,GAAMlC,EAAOgD,EAAME,EAAO7b,EAAO8b,EAAU/b,EAAMR,CAMrD,IAJAQ,EAAOwb,IAEP5C,EAAQI,EACR4C,EAAOD,EAAiB/C,GACX,IAATgD,EACA,MAAO5b,EASX,KAPA4Y,EAAMgD,KAAOA,EACb7C,IAEA9Y,EAAQub,IAERM,GAAS9b,EAAM4Y,EAAO3Y,IAEd2b,EAAOD,EAAiB3C,IAAc,GAAG,CAG7C,KAAQ8C,EAAMhZ,OAAS,GAAO8Y,GAAQE,EAAMA,EAAMhZ,OAAS,GAAG8Y,MAC1D3b,EAAQ6b,EAAME,MACdD,EAAWD,EAAME,MAAM3K,MACvBrR,EAAO8b,EAAME,MACblB,EAAOX,EAAS8B,uBAAuBF,EAAU/b,EAAMC,GACvD6b,EAAMre,KAAKqd,EAIflC,GAAQG,IACRH,EAAMgD,KAAOA,EACbE,EAAMre,KAAKmb,GACXkC,EAAOU,IACPM,EAAMre,KAAKqd,GAMf,IAFAtb,EAAIsc,EAAMhZ,OAAS,EACnBgY,EAAOgB,EAAMtc,GACNA,EAAI,GACPsb,EAAOX,EAAS8B,uBAAuBH,EAAMtc,EAAI,GAAG6R,MAAOyK,EAAMtc,EAAI,GAAIsb,GACzEtb,GAAK,CAGT,OAAOsb,GAMX,QAASoB,KACL,GAAIpB,GAAMqB,EAAYC,CAatB,OAXAtB,GAAOe,IAEHhC,EAAM,OACNd,IACAoD,EAAaD,IACbtC,EAAO,KACPwC,EAAYF,IAEZpB,EAAOX,EAASkC,4BAA4BvB,EAAMqB,EAAYC,IAG3DtB,EAaX,QAASwB,KACL,GAAI5N,GAAY2K,CAUhB,OARA3K,GAAaqK,IAETrK,EAAWjI,OAAS0Q,EAAMC,YAC1BuC,EAAgBjL,GAGpB2K,EAAOQ,EAAM,KAAOoB,OAEbd,EAASoC,aAAa7N,EAAW2C,MAAOgI,GAOnD,QAASmD,KACL,KAAO3C,EAAM,MACTd,IACAuD,IAqBR,QAASG,KACL3F,IACAmC,GAEA,IAAI6B,GAAOZ,IACPY,KACwB,MAApB9B,EAAU3H,OAAoC,MAAnB2H,EAAU3H,OAC9ByJ,EAAKrU,OAASiW,EAAOtF,WAC5BuF,EAAkB7B,IAElB0B,IACwB,OAApBxD,EAAU3H,MACVuL,EAAkB9B,GAElBX,EAAS0C,eAAe/B,KAKhC9B,EAAUvS,OAAS0Q,EAAM2B,KACzBa,EAAgBX,GAIxB,QAAS4D,GAAkB9B,GACvB/B,GACA,IAAIrK,GAAaqK,IAAM1H,KACvB8I,GAAS2C,mBAAmBhC,EAAMpM,GAGtC,QAASiO,GAAkBjO,GACvB,GAAIqO,EACoB,OAApB/D,EAAU3H,QACV0H,IACIC,EAAUvS,OAAS0Q,EAAMC,YACzBuC,EAAgBX,GACpB+D,EAAYhE,IAAM1H,OAGtB0H,GACA,IAAI+B,GAAOZ,IACXsC,KACArC,EAAS6C,mBAAmBtO,EAAW7I,KAAMkX,EAAWjC,GAG5D,QAASmC,GAAMrF,EAAMsF,GAUjB,MATA/C,GAAW+C,EACXpX,EAAS8R,EACTb,EAAQ,EACRjU,EAASgD,EAAOhD,OAChBkW,EAAY,KACZmE,GACIC,aAGGX,IAn+BX,GAAItF,GACAkG,EACAX,EACA1E,EACAlS,EACAiR,EACAjU,EACAqX,EACAnB,EACAmE,CAEJhG,IACII,eAAgB,EAChBuB,IAAK,EACL1B,WAAY,EACZC,QAAS,EACTC,YAAa,EACbc,eAAgB,EAChBN,WAAY,EACZY,cAAe,GAGnB2E,KACAA,EAAUlG,EAAMI,gBAAkB,UAClC8F,EAAUlG,EAAM2B,KAAO,QACvBuE,EAAUlG,EAAMC,YAAc,aAC9BiG,EAAUlG,EAAME,SAAW,UAC3BgG,EAAUlG,EAAMG,aAAe,OAC/B+F,EAAUlG,EAAMiB,gBAAkB,UAClCiF,EAAUlG,EAAMW,YAAc,aAC9BuF,EAAUlG,EAAMuB,eAAiB,SAEjCgE,GACIY,gBAAiB,kBACjBC,iBAAkB,mBAClBC,eAAgB,iBAChBC,sBAAuB,wBACvBC,eAAgB,iBAChBC,oBAAqB,sBACrBvG,WAAY,aACZwG,QAAS,UACTC,iBAAkB,mBAClBC,kBAAmB,oBACnBC,iBAAkB,mBAClBC,iBAAkB,mBAClBC,QAAS,UACTC,SAAU,WACVC,eAAgB,iBAChBC,gBAAiB,mBAIrBpG,GACIC,gBAAkB,sBAClBoG,aAAc,uBACdC,cAAe,oCA2qBnB,IAAI7C,IAAyBJ,EAuJzBnB,GAAkBgC,CA6GtBjG,GAAOsI,SACHtB,MAAOA,IAEZjgB,MCrgCH,SAAWiZ,GACT,YAEA,SAASuI,GAAeC,EAAgB5Y,EAAMhG,EAAM6e,GAClD,GAAIC,EACJ,KAEE,GADAA,EAAaC,EAAcH,GACvBE,EAAWE,aACVhf,EAAKxB,WAAaC,KAAK4M,cACN,aAAjBrL,EAAKif,SACK,SAATjZ,GAA4B,WAATA,GACvB,KAAMwQ,OAAM,4DAEd,MAAO0I,GAEP,WADAlT,SAAQuN,MAAM,8BAAgCqF,EAAgBM,GAIhE,MAAO,UAASC,EAAOnf,EAAMof,GAC3B,GAAIC,GAAUP,EAAWQ,WAAWH,EAAON,EAAgBO,EAO3D,OANIN,GAAWE,YAAcK,IAC3Brf,EAAKuf,6BAA+BT,EAAWE,WAC3CF,EAAWU,aACbxf,EAAKyf,6BAA+BX,EAAWU,aAG5CH,GAOX,QAASN,GAAcH,GACrB,GAAIE,GAAaY,EAAqBd,EACtC,KAAKE,EAAY,CACf,GAAIxE,GAAW,GAAIqF,EACnBjB,SAAQtB,MAAMwB,EAAgBtE,GAC9BwE,EAAa,GAAIc,GAAWtF,GAC5BoF,EAAqBd,GAAkBE,EAEzC,MAAOA,GAGT,QAASf,GAAQvM,GACfrU,KAAKqU,MAAQA,EACbrU,KAAK0iB,SAAW3R,OAgBlB,QAAS4R,GAAU9Z,GACjB7I,KAAK6I,KAAOA,EACZ7I,KAAK4iB,KAAOC,KAAKnb,IAAImB,GA2BvB,QAASkY,GAAiB+B,EAAQxE,EAAUyE,GAC1C/iB,KAAKgjB,YAA+B,kBAAVF,IACPA,EAAOE,aACM,KAAZD,KAAqBzE,YAAoBsC,IAI7C,KAAZmC,GACAzE,YAAoBsC,IACpBiC,KAAKnb,IAAI4W,EAASjK,OAAO4O,QAC3BF,EAAW,IACXzE,EAAW,GAAIqE,GAAUrE,EAASjK,QAGpCrU,KAAKkjB,YACAljB,KAAKgjB,aACN1E,YAAoBqE,KACnBG,YAAkB/B,IAAoB+B,YAAkBH,IAE7D3iB,KAAK8iB,OAAS9iB,KAAKkjB,WAAaJ,EAASK,EAAML,GAC/C9iB,KAAKse,SAAuB,KAAZyE,EAAkBzE,EAAW6E,EAAM7E,GAoErD,QAAS8E,GAAOva,EAAMwT,GACpBrc,KAAK6I,KAAOA,EACZ7I,KAAKqc,OACL,KAAK,GAAI7Z,GAAI,EAAGA,EAAI6Z,EAAKvW,OAAQtD,IAC/BxC,KAAKqc,KAAK7Z,GAAK2gB,EAAM9G,EAAK7Z,IA2C9B,QAAS6gB,KAAmB,KAAMhK,OAAM,mBA0BxC,QAAS8J,GAAMG,GACb,MAAqB,kBAAPA,GAAoBA,EAAMA,EAAIC,UAG9C,QAASf,KACPxiB,KAAK2hB,WAAa,KAClB3hB,KAAKwjB,WACLxjB,KAAKyjB,QACLzjB,KAAK0jB,YAAc3S,OACnB/Q,KAAK6hB,WAAa9Q,OAClB/Q,KAAKqiB,WAAatR,OAClB/Q,KAAKgjB,aAAc,EA6GrB,QAASW,GAAmBtP,GAC1BrU,KAAK4jB,OAASvP,EAUhB,QAASoO,GAAWtF,GAIlB,GAHAnd,KAAK6hB,WAAa1E,EAAS0E,WAC3B7hB,KAAKqiB,WAAalF,EAASkF,YAEtBlF,EAASwE,WACZ,KAAMtI,OAAM,uBAEdrZ,MAAK2hB,WAAaxE,EAASwE,WAC3BwB,EAAMnjB,KAAK2hB,YAEX3hB,KAAKwjB,QAAUrG,EAASqG,QACxBxjB,KAAKgjB,YAAc7F,EAAS6F,YAmE9B,QAASa,GAAyBhb,GAChC,MAAOvE,QAAOuE,GAAM2T,QAAQ,SAAU,SAASsH,GAC7C,MAAO,IAAMA,EAAEC,gBASnB,QAASC,GAAUhC,EAAOiC,GACxB,KAAOjC,EAAMkC,KACLxe,OAAOwB,UAAUid,eAAerc,KAAKka,EAAOiC,IAClDjC,EAAQA,EAAMkC,EAGhB,OAAOlC,GAGT,QAASoC,GAAoBC,GAC3B,OAAQA,GACN,IAAK,GACH,OAAO,CAET,KAAK,QACL,IAAK,OACL,IAAK,OACH,OAAO,EAGX,MAAKC,OAAMC,OAAOF,KAGX,GAFE,EAKX,QAASG,MAndT,GAAIjC,GAAuB7c,OAAOC,OAAO,KAkBzCib,GAAQ1Z,WACNqc,QAAS,WACP,IAAKvjB,KAAK0iB,SAAU,CAClB,GAAIrO,GAAQrU,KAAKqU,KACjBrU,MAAK0iB,SAAW,WACd,MAAOrO,IAIX,MAAOrU,MAAK0iB,WAShBC,EAAUzb,WACRqc,QAAS,WACP,IAAKvjB,KAAK0iB,SAAU,CAClB,GACIE,IADO5iB,KAAK6I,KACL7I,KAAK4iB,KAChB5iB,MAAK0iB,SAAW,SAASV,EAAO9V,GAI9B,MAHIA,IACFA,EAASuY,QAAQzC,EAAOY,GAEnBA,EAAK8B,aAAa1C,IAI7B,MAAOhiB,MAAK0iB,UAGdiC,SAAU,SAAS3C,EAAO4C,GAIxB,MAHwB,IAApB5kB,KAAK4iB,KAAK9c,OACZkc,EAAQgC,EAAUhC,EAAOhiB,KAAK4iB,KAAK,IAE9B5iB,KAAK4iB,KAAKiC,aAAa7C,EAAO4C,KA2BzC7D,EAAiB7Z,WACf4d,GAAIC,YACF,IAAK/kB,KAAKglB,UAAW,CACnB,GAAIC,GAAOjlB,KAAK8iB,iBAAkBH,GAC9B3iB,KAAK8iB,OAAOja,KAAO7I,KAAK8iB,OAAOiC,QACnC/kB,MAAKglB,UAAYnC,KAAKnb,IAAIud,EAAO,IAAMjlB,KAAKse,SAASzV,MAGvD,MAAO7I,MAAKglB,WAGdzB,QAAS,WACP,IAAKvjB,KAAK0iB,SAAU,CAClB,GAAII,GAAS9iB,KAAK8iB,MAElB,IAAI9iB,KAAKkjB,WAAY,CACnB,GAAIN,GAAO5iB,KAAK+kB,QAEhB/kB,MAAK0iB,SAAW,SAASV,EAAO9V,GAI9B,MAHIA,IACFA,EAASuY,QAAQzC,EAAOY,GAEnBA,EAAK8B,aAAa1C,QAEtB,IAAIhiB,KAAKse,mBAAoBqE,GAAW,CAC7C,GAAIC,GAAOC,KAAKnb,IAAI1H,KAAKse,SAASzV,KAElC7I,MAAK0iB,SAAW,SAASV,EAAO9V,GAC9B,GAAIgZ,GAAUpC,EAAOd,EAAO9V,EAK5B,OAHIA,IACFA,EAASuY,QAAQS,EAAStC,GAErBA,EAAK8B,aAAaQ,QAEtB,CAEL,GAAI5G,GAAWte,KAAKse,QAEpBte,MAAK0iB,SAAW,SAASV,EAAO9V,GAC9B,GAAIgZ,GAAUpC,EAAOd,EAAO9V,GACxBiZ,EAAW7G,EAAS0D,EAAO9V,EAI/B,OAHIA,IACFA,EAASuY,QAAQS,EAASC,GAErBD,EAAUA,EAAQC,GAAYpU,SAI3C,MAAO/Q,MAAK0iB,UAGdiC,SAAU,SAAS3C,EAAO4C,GACxB,GAAI5kB,KAAKkjB,WAEP,MADAljB,MAAK+kB,SAASF,aAAa7C,EAAO4C,GAC3BA,CAGT,IAAI9B,GAAS9iB,KAAK8iB,OAAOd,GACrBmD,EAAWnlB,KAAKse,mBAAoBqE,GAAY3iB,KAAKse,SAASzV,KAC9D7I,KAAKse,SAAS0D,EAClB,OAAOc,GAAOqC,GAAYP,IAY9BxB,EAAOlc,WACLke,UAAW,SAAS/Q,EAAOgR,EAAkB3D,EAAgBM,EACzC9V,GAClB,GAAIlC,GAAK0X,EAAe1hB,KAAK6I,MACzBqc,EAAUlD,CACd,IAAIhY,EACFkb,EAAUnU,WAGV,IADA/G,EAAKkb,EAAQllB,KAAK6I,OACbmB,EAEH,WADA6E,SAAQuN,MAAM,uBAAyBpc,KAAK6I,KAchD,IANIwc,EACFrb,EAAKA,EAAGsb,QACoB,kBAAZtb,GAAGub,QACnBvb,EAAKA,EAAGub,OAGO,kBAANvb,GAGT,WAFA6E,SAAQuN,MAAM,OAASiJ,EAAmB,UAAY,SACxC,YAAcrlB,KAAK6I,KAKnC;IAAK,GADDwT,IAAQhI,GACH7R,EAAI,EAAGA,EAAIxC,KAAKqc,KAAKvW,OAAQtD,IACpC6Z,EAAK7Z,EAAI,GAAK2gB,EAAMnjB,KAAKqc,KAAK7Z,IAAIwf,EAAO9V,EAG3C,OAAOlC,GAAGwb,MAAMN,EAAS7I,IAM7B,IAAIoJ,IACFC,IAAK,SAASniB,GAAK,OAAQA,GAC3BoiB,IAAK,SAASpiB,GAAK,OAAQA,GAC3BqiB,IAAK,SAASriB,GAAK,OAAQA,IAGzBsiB,GACFH,IAAK,SAAStc,EAAG/E,GAAK,MAAO+E,GAAE/E,GAC/BshB,IAAK,SAASvc,EAAG/E,GAAK,MAAO+E,GAAE/E,GAC/ByhB,IAAK,SAAS1c,EAAG/E,GAAK,MAAO+E,GAAE/E,GAC/B0hB,IAAK,SAAS3c,EAAG/E,GAAK,MAAO+E,GAAE/E,GAC/B2hB,IAAK,SAAS5c,EAAG/E,GAAK,MAAO+E,GAAE/E,GAC/B4hB,IAAK,SAAS7c,EAAG/E,GAAK,MAASA,GAAF+E,GAC7B8c,IAAK,SAAS9c,EAAG/E,GAAK,MAAO+E,GAAE/E,GAC/B8hB,KAAM,SAAS/c,EAAG/E,GAAK,MAAUA,IAAH+E,GAC9Bgd,KAAM,SAAShd,EAAG/E,GAAK,MAAO+E,IAAG/E,GACjCgiB,KAAM,SAASjd,EAAG/E,GAAK,MAAO+E,IAAG/E,GACjCiiB,KAAM,SAASld,EAAG/E,GAAK,MAAO+E,IAAG/E,GACjCkiB,MAAO,SAASnd,EAAG/E,GAAK,MAAO+E,KAAI/E,GACnCmiB,MAAO,SAASpd,EAAG/E,GAAK,MAAO+E,KAAI/E,GACnCoiB,KAAM,SAASrd,EAAG/E,GAAK,MAAO+E,IAAG/E,GACjCqiB,KAAM,SAAStd,EAAG/E,GAAK,MAAO+E,IAAG/E,GAiBnCme,GAAYtb,WACVwX,sBAAuB,SAASiI,EAAIC,GAClC,IAAKnB,EAAekB,GAClB,KAAMtN,OAAM,wBAA0BsN,EAIxC,OAFAC,GAAWzD,EAAMyD,GAEV,SAAS5E,EAAO9V,GACrB,MAAOuZ,GAAekB,GAAIC,EAAS5E,EAAO9V,MAI9C+S,uBAAwB,SAAS0H,EAAI3jB,EAAMC,GACzC,IAAK4iB,EAAgBc,GACnB,KAAMtN,OAAM,wBAA0BsN,EAKxC,OAHA3jB,GAAOmgB,EAAMngB,GACbC,EAAQkgB,EAAMlgB,GAEP,SAAS+e,EAAO9V,GACrB,MAAO2Z,GAAgBc,GAAI3jB,EAAKgf,EAAO9V,GACZjJ,EAAM+e,EAAO9V,MAI5CmT,4BAA6B,SAASwH,EAAM1H,EAAYC,GAKtD,MAJAyH,GAAO1D,EAAM0D,GACb1H,EAAagE,EAAMhE,GACnBC,EAAY+D,EAAM/D,GAEX,SAAS4C,EAAO9V,GACrB,MAAO2a,GAAK7E,EAAO9V,GACfiT,EAAW6C,EAAO9V,GAAYkT,EAAU4C,EAAO9V,KAIvDqR,iBAAkB,SAAS1U,GACzB,GAAIie,GAAQ,GAAInE,GAAU9Z,EAE1B,OADAie,GAAMrd,KAAO,aACNqd,GAGTvI,uBAAwB,SAASwE,EAAUD,EAAQxE,GACjD,GAAIyD,GAAK,GAAIhB,GAAiB+B,EAAQxE,EAAUyE,EAGhD,OAFIhB,GAAGiB,cACLhjB,KAAKgjB,aAAc,GACdjB,GAGTzE,cAAe,SAAS1B,GACtB,MAAO,IAAIgF,GAAQhF,EAAMvH,QAG3B+I,sBAAuB,SAASH,GAC9B,IAAK,GAAIza,GAAI,EAAGA,EAAIya,EAASnX,OAAQtD,IACnCya,EAASza,GAAK2gB,EAAMlG,EAASza,GAE/B,OAAO,UAASwf,EAAO9V,GAErB,IAAK,GADD6a,MACKvkB,EAAI,EAAGA,EAAIya,EAASnX,OAAQtD,IACnCukB,EAAItmB,KAAKwc,EAASza,GAAGwf,EAAO9V,GAC9B,OAAO6a,KAIXtJ,eAAgB,SAASuJ,EAAM1S,EAAKD,GAClC,OACEC,IAAKA,YAAeqO,GAAYrO,EAAIzL,KAAOyL,EAAID,MAC/CA,MAAOA,IAIXuJ,uBAAwB,SAASD,GAC/B,IAAK,GAAInb,GAAI,EAAGA,EAAImb,EAAW7X,OAAQtD,IACrCmb,EAAWnb,GAAG6R,MAAQ8O,EAAMxF,EAAWnb,GAAG6R,MAE5C,OAAO,UAAS2N,EAAO9V,GAErB,IAAK,GADD+a,MACKzkB,EAAI,EAAGA,EAAImb,EAAW7X,OAAQtD,IACrCykB,EAAItJ,EAAWnb,GAAG8R,KAAOqJ,EAAWnb,GAAG6R,MAAM2N,EAAO9V,EACtD,OAAO+a,KAIX1H,aAAc,SAAS1W,EAAMwT,GAC3Brc,KAAKwjB,QAAQ/iB,KAAK,GAAI2iB,GAAOva,EAAMwT,KAGrCyD,mBAAoB,SAAS6B,EAAYE,GACvC7hB,KAAK2hB,WAAaA,EAClB3hB,KAAK6hB,WAAaA,GAGpB7B,mBAAoB,SAAS6B,EAAYQ,EAAYV,GACnD3hB,KAAK2hB,WAAaA,EAClB3hB,KAAK6hB,WAAaA,EAClB7hB,KAAKqiB,WAAaA,GAGpBxC,eAAgB,SAAS8B,GACvB3hB,KAAK2hB,WAAaA,GAGpB3D,qBAAsBqF,GAOxBM,EAAmBzc,WACjBggB,KAAM,WAAa,MAAOlnB,MAAK4jB,QAC/BuD,eAAgB,WAAa,MAAOnnB,MAAK4jB,QACzCwD,QAAS,aACTC,MAAO,cAiBT5E,EAAWvb,WACTib,WAAY,SAASH,EAAON,EAAgBO,GAU1C,QAASsB,KAEP,GAAI+D,EAEF,MADAA,IAAY,EACLC,CAGLjU,GAAK0P,aACP9W,EAASsb,YAEX,IAAInT,GAAQf,EAAKmU,SAASzF,EACA1O,EAAK0P,YAAc9W,EAAW6E,OAC9B2Q,EAI1B,OAHIpO,GAAK0P,aACP9W,EAASwb,cAEJrT,EAGT,QAASsT,GAAW/C,GAElB,MADAtR,GAAKqR,SAAS3C,EAAO4C,EAAUlD,GACxBkD,EA9BT,GAAI3C,EACF,MAAOjiB,MAAKynB,SAASzF,EAAOjR,OAAW2Q,EAEzC,IAAIxV,GAAW,GAAI0b,kBAEfL,EAAavnB,KAAKynB,SAASzF,EAAO9V,EAAUwV,GAC5C4F,GAAY,EACZhU,EAAOtT,IA0BX,OAAO,IAAI6nB,mBAAkB3b,EAAUqX,EAASoE,GAAY,IAG9DF,SAAU,SAASzF,EAAO9V,EAAUwV,GAElC,IAAK,GADDrN,GAAQ8O,EAAMnjB,KAAK2hB,YAAYK,EAAO9V,GACjC1J,EAAI,EAAGA,EAAIxC,KAAKwjB,QAAQ1d,OAAQtD,IACvC6R,EAAQrU,KAAKwjB,QAAQhhB,GAAG4iB,UAAU/Q,GAAO,EAAOqN,EAAgBM,EAC9B9V,EAGpC,OAAOmI,IAGTsQ,SAAU,SAAS3C,EAAO4C,EAAUlD,GAElC,IADA,GAAIoG,GAAQ9nB,KAAKwjB,QAAUxjB,KAAKwjB,QAAQ1d,OAAS,EAC1CgiB,IAAU,GACflD,EAAW5kB,KAAKwjB,QAAQsE,GAAO1C,UAAUR,GAAU,EAAMlD,EAChBM,EAG3C,OAAIhiB,MAAK2hB,WAAWgD,SACX3kB,KAAK2hB,WAAWgD,SAAS3C,EAAO4C,GADzC,QAeJ,IAAIV,GAAkB,IAAMxU,KAAKqY,SAASC,SAAS,IAAI1b,MAAM,EAiC7DkY,GAAmBtd,WAEjB+gB,YAAa,SAAS5T,GACpB,GAAI6T,KACJ,KAAK,GAAI5T,KAAOD,GACd6T,EAAMznB,KAAKojB,EAAyBvP,GAAO,KAAOD,EAAMC,GAE1D,OAAO4T,GAAMC,KAAK,OAGpBC,UAAW,SAAS/T,GAClB,GAAIgU,KACJ,KAAK,GAAI/T,KAAOD,GACVA,EAAMC,IACR+T,EAAO5nB,KAAK6T,EAEhB,OAAO+T,GAAOF,KAAK,MAIrBG,+BAAgC,SAASC,GACvC,GAAIlG,GAAakG,EAASjG,4BAC1B,IAAKD,EAGL,MAAO,UAASmG,EAAkBzO,GAChCyO,EAAiBxG,MAAMK,GAActI,IAIzCyH,eAAgB,SAAS6C,EAAYxb,EAAMhG,GACzC,GAAI+f,GAAOC,KAAKnb,IAAI2c,EAEpB,EAAA,GAAKD,EAAoBC,KAAezB,EAAKK,MAa7C,MAAOzB,GAAe6C,EAAYxb,EAAMhG,EAAM7C,KAZ5C,IAAmB,GAAf4iB,EAAK9c,OACP,MAAO,UAASkc,EAAOnf,EAAMof,GAC3B,GAAIA,EACF,MAAOW,GAAK8B,aAAa1C,EAE3B,IAAI3iB,GAAQ2kB,EAAUhC,EAAOY,EAAK,GAClC,OAAO,IAAI6F,cAAappB,EAAOujB,MASvC8F,qBAAsB,SAASH,GAC7B,GAAII,GAAYJ,EAASnG,4BACzB,IAAKuG,EAAL,CAGA,GAAIC,GAAcL,EAASC,iBACvBD,EAASC,iBAAiBxG,MAC1BuG,EAASvG,MAETjC,EAAYwI,EAASjG,4BAEzB,OAAO,UAASN,GACd,GAAI3iB,GAAQqG,OAAOC,OAAOijB,EAI1B,OAHAvpB,GAAMspB,GAAa3G,EACnB3iB,EAAM0gB,GAAahP,OACnB1R,EAAM6kB,GAAmB0E,EAClBvpB,MAKb4Z,EAAOuL,mBAAqBA,EACxBvL,EAAO4P,sBACT5P,EAAO6P,eAAiBlH,IAEzB5hB,MC7jBH+oB,SACEC,QAAS,iBCGmB,kBAAnB7pB,QAAO4pB,UAChBA,YCJF,SAAU1pB,GAGR,QAAS4pB,GAAO/hB,EAAWgiB,GAiBzB,MAhBIhiB,IAAagiB,GAEfxjB,OAAOyjB,oBAAoBD,GAAK9kB,QAAQ,SAAS9B,GAE/C,GAAI8mB,GAAK1jB,OAAO2jB,yBAAyBH,EAAK5mB,EAC1C8mB,KAEF1jB,OAAO4jB,eAAepiB,EAAW5E,EAAG8mB,GAEb,kBAAZA,GAAG/U,QAEZ+U,EAAG/U,MAAMkV,IAAMjnB,MAKhB4E,EAKT7H,EAAM4pB,OAASA,GAEdF,SC3BH,SAAU1pB,GA6CR,QAASmqB,GAAIA,EAAK5hB,EAAU6hB,GAO1B,MANID,GACFA,EAAIE,OAEJF,EAAM,GAAIG,GAAI3pB,MAEhBwpB,EAAII,GAAGhiB,EAAU6hB,GACVD,EAzCT,GAAIG,GAAM,SAASE,GACjB7pB,KAAKklB,QAAU2E,EACf7pB,KAAK8pB,cAAgB9pB,KAAK+pB,SAAS1mB,KAAKrD,MAE1C2pB,GAAIziB,WACF0iB,GAAI,SAAShiB,EAAU6hB,GACrBzpB,KAAK4H,SAAWA,CAChB,IAAIoiB,EACCP,IAMHO,EAAI1X,WAAWtS,KAAK8pB,cAAeL,GACnCzpB,KAAKiqB,OAAS,WACZ1X,aAAayX,MAPfA,EAAIze,sBAAsBvL,KAAK8pB,eAC/B9pB,KAAKiqB,OAAS,WACZC,qBAAqBF,MAS3BN,KAAM,WACA1pB,KAAKiqB,SACPjqB,KAAKiqB,SACLjqB,KAAKiqB,OAAS,OAGlBF,SAAU,WACJ/pB,KAAKiqB,SACPjqB,KAAK0pB,OACL1pB,KAAK4H,SAASE,KAAK9H,KAAKklB,YAiB9B7lB,EAAMmqB,IAAMA,GAEXT,SC3DH,WAEE,GAAIoB,KAEJC,aAAYlhB,SAAW,SAASmhB,EAAKnjB,GACnCijB,EAASE,GAAOnjB,GAIlBkjB,YAAYE,mBAAqB,SAASD,GACxC,GAAInjB,GAAamjB,EAA8BF,EAASE,GAAjCD,YAAYljB,SAEnC,OAAOA,IAAaxB,OAAO6kB,eAAeppB,SAASsD,cAAc4lB,IAInE,IAAIG,GAA0BC,MAAMvjB,UAAUwjB,eAC9CD,OAAMvjB,UAAUwjB,gBAAkB,WAChC1qB,KAAK2qB,cAAe,EACpBH,EAAwBhF,MAAMxlB,KAAMsc,aASrCyM,SC5BF,SAAU1pB,GAgBP,QAASurB,GAAOC,GAMd,GAAIC,GAASF,EAAOE,OAEhBvB,EAAMuB,EAAOvB,IAEbwB,EAASD,EAAOC,MACfA,KACExB,IACHA,EAAMuB,EAAOvB,IAAMyB,EAAWljB,KAAK9H,KAAM8qB,IAEtCvB,GACH1a,QAAQC,KAAK,iFAQfic,EAASE,EAAaH,EAAQvB,EAAKgB,EAAevqB,OAGpD,IAAIgK,GAAK+gB,EAAOxB,EAChB,OAAIvf,IAEGA,EAAG+gB,QAENE,EAAajhB,EAAIuf,EAAKwB,GAIjB/gB,EAAGwb,MAAMxlB,KAAM6qB,QARxB,OAYF,QAASG,GAAW3W,GAElB,IADA,GAAIrO,GAAIhG,KAAKkrB,UACNllB,GAAKA,IAAMokB,YAAYljB,WAAW,CAGvC,IAAK,GAAsB5E,GADvB6oB,EAAKzlB,OAAOyjB,oBAAoBnjB,GAC3BxD,EAAE,EAAG4G,EAAE+hB,EAAGrlB,OAAasD,EAAF5G,IAAQF,EAAE6oB,EAAG3oB,IAAKA,IAAK,CACnD,GAAIJ,GAAIsD,OAAO2jB,yBAAyBrjB,EAAG1D,EAC3C,IAAuB,kBAAZF,GAAEiS,OAAwBjS,EAAEiS,QAAUA,EAC/C,MAAO/R,GAGX0D,EAAIA,EAAEklB,WAIV,QAASD,GAAaG,EAAQviB,EAAMwiB,GAIlC,GAAItrB,GAAIurB,EAAUD,EAAOxiB,EAAMuiB,EAM/B,OALIrrB,GAAE8I,KAGJ9I,EAAE8I,GAAM0gB,IAAM1gB,GAETuiB,EAAOL,OAAShrB,EAGzB,QAASurB,GAAUD,EAAOxiB,EAAMiiB,GAE9B,KAAOO,GAAO,CACZ,GAAKA,EAAMxiB,KAAUiiB,GAAWO,EAAMxiB,GACpC,MAAOwiB,EAETA,GAAQd,EAAec,GAMzB,MAAO3lB,QAMT,QAAS6kB,GAAerjB,GACtB,MAAOA,GAAUgkB,UAkBnB7rB,EAAMksB,MAAQX,GAEf7B,SC3HH,SAAU1pB,GA8CR,QAASmsB,GAAiBnX,EAAOoX,GAE/B,GAAIC,SAAsBD,EAM1B,OAJIA,aAAwBzT,QAC1B0T,EAAe,QAGVC,EAAaD,GAAcrX,EAAOoX,GApD3C,GAAIE,IACFC,OAAQ,SAASvX,GACf,MAAOA,IAETwX,KAAM,SAASxX,GACb,MAAO,IAAI2D,MAAKA,KAAKiI,MAAM5L,IAAU2D,KAAKC,QAE5C6T,UAAS,SAASzX,GAChB,MAAc,KAAVA,GACK,EAEQ,UAAVA,GAAoB,IAAUA,GAEvC8G,OAAQ,SAAS9G,GACf,GAAI/R,GAAI+Y,WAAWhH,EAKnB,OAHU,KAAN/R,IACFA,EAAIypB,SAAS1X,IAERiQ,MAAMhiB,GAAK+R,EAAQ/R,GAK5BwgB,OAAQ,SAASzO,EAAOoX,GACtB,GAAqB,OAAjBA,EACF,MAAOpX,EAET,KAIE,MAAO2X,MAAK/L,MAAM5L,EAAMmI,QAAQ,KAAM,MACtC,MAAMpX,GAEN,MAAOiP,KAIX4X,WAAY,SAAS5X,EAAOoX,GAC1B,MAAOA,IAiBXpsB,GAAMmsB,iBAAmBA,GAExBzC,SC9DH,SAAU1pB,GAIR,GAAI4pB,GAAS5pB,EAAM4pB,OAIfC,IAEJA,GAAIgD,eACJhD,EAAIiD,YAEJjD,EAAIkD,QAAU,SAASC,EAAMnlB,GAC3B,IAAK,GAAI5E,KAAK+pB,GACZpD,EAAO/hB,EAAWmlB,EAAK/pB,KAM3BjD,EAAM6pB,IAAMA,GAEXH,SCtBH,SAAU1pB,GAER,GAAIitB,IASFC,MAAO,SAASnB,EAAQ/O,EAAMmQ,GAG5BC,SAASC,QAETrQ,EAAQA,GAAQA,EAAKvW,OAAUuW,GAAQA,EAEvC,IAAIrS,GAAK,YACNhK,KAAKorB,IAAWA,GAAQ5F,MAAMxlB,KAAMqc,IACrChZ,KAAKrD,MAEHiqB,EAASuC,EAAUla,WAAWtI,EAAIwiB,GAClCjhB,sBAAsBvB,EAE1B,OAAOwiB,GAAUvC,GAAUA,GAE7B0C,YAAa,SAAS1C,GACP,EAATA,EACFC,sBAAsBD,GAEtB1X,aAAa0X,IAWjB2C,KAAM,SAASnjB,EAAMsJ,EAAQ8Z,EAAQtnB,EAASC,GAC5C,GAAI3C,GAAOgqB,GAAU7sB,KACjB+S,EAASA,MACT+Z,EAAQ,GAAIC,aAAYtjB,GAC1BlE,QAAsBwL,SAAZxL,EAAwBA,GAAU,EAC5CC,WAA4BuL,SAAfvL,EAA2BA,GAAa,EACrDuN,OAAQA,GAGV,OADAlQ,GAAKiI,cAAcgiB,GACZA,GASTE,UAAW,WACThtB,KAAKusB,MAAM,OAAQjQ,YASrB2Q,aAAc,SAASC,EAAMC,EAAKC,GAC5BD,GACFA,EAAIE,UAAU1hB,OAAOyhB,GAEnBF,GACFA,EAAKG,UAAU3hB,IAAI0hB,KAMrBE,EAAM,aAGNC,IAIJjB,GAAMkB,YAAclB,EAAMC,MAI1BltB,EAAM6pB,IAAIiD,SAASG,MAAQA,EAC3BjtB,EAAMiuB,IAAMA,EACZjuB,EAAMkuB,IAAMA,GAEXxE,SChGH,SAAU1pB,GAIR,GAAIouB,GAAMtuB,OAAOuuB,aACbC,EAAe,MAGf3kB,GAEF2kB,aAAcA,EAEdC,iBAAkB,WAChB,GAAI5kB,GAAShJ,KAAK6tB,cAClBJ,GAAIzkB,QAAWtD,OAAOG,KAAKmD,GAAQlD,OAAS,GAAM+I,QAAQ4e,IAAI,yBAA0BztB,KAAK8tB,UAAW9kB,EAKxG,KAAK,GAAIS,KAAQT,GAAQ,CACvB,GAAI+kB,GAAa/kB,EAAOS,EACxBzJ,MAAKwK,iBAAiBf,EAAMzJ,KAAKO,QAAQytB,gBAAgBhuB,KAAMA,KACN+tB,MAI7DE,eAAgB,SAAShH,EAAKmE,EAAQ/O,GACpC,GAAI4K,EAAK,CACPwG,EAAIzkB,QAAU6F,QAAQqf,MAAM,qBAAsBjH,EAAI6G,UAAW1C,EACjE,IAAIphB,GAAuB,kBAAXohB,GAAwBA,EAASnE,EAAImE,EACjDphB,IACFA,EAAGqS,EAAO,QAAU,QAAQ4K,EAAK5K,GAEnCoR,EAAIzkB,QAAU6F,QAAQsf,WACtB1B,SAASC,UAOfrtB,GAAM6pB,IAAIiD,SAASnjB,OAASA,GAE3B+f,SC3CH,SAAU1pB,GAIR,GAAIyN,IACFshB,uBAAwB,WACtB,GAAIC,GAAKruB,KAAKsuB,mBACd,KAAK,GAAI1oB,KAAKyoB,GACPruB,KAAKuuB,aAAa3oB,IACrB5F,KAAKwuB,aAAa5oB,EAAGyoB,EAAGzoB,KAK9B6oB,eAAgB,WAGd,GAAIzuB,KAAK0uB,WACP,IAAK,GAA0C5sB,GAAtCU,EAAE,EAAG6rB,EAAGruB,KAAK8M,WAAY1D,EAAEilB,EAAGvoB,QAAYhE,EAAEusB,EAAG7rB,KAAS4G,EAAF5G,EAAKA,IAClExC,KAAK2uB,oBAAoB7sB,EAAE+G,KAAM/G,EAAEuS,QAMzCsa,oBAAqB,SAAS9lB,EAAMwL,GAGlC,GAAIxL,GAAO7I,KAAK4uB,qBAAqB/lB,EACrC,IAAIA,EAAM,CAIR,GAAIwL,GAASA,EAAMwa,OAAOxvB,EAAMyvB,cAAgB,EAC9C,MAGF,IAAIrD,GAAezrB,KAAK6I,GAEpBwL,EAAQrU,KAAKwrB,iBAAiBnX,EAAOoX,EAErCpX,KAAUoX,IAEZzrB,KAAK6I,GAAQwL,KAKnBua,qBAAsB,SAAS/lB,GAC7B,GAAIgU,GAAQ7c,KAAK0uB,YAAc1uB,KAAK0uB,WAAW7lB,EAE/C,OAAOgU,IAGT2O,iBAAkB,SAASuD,EAAatD,GACtC,MAAOpsB,GAAMmsB,iBAAiBuD,EAAatD,IAE7CuD,eAAgB,SAAS3a,EAAOqX,GAC9B,MAAqB,YAAjBA,EACKrX,EAAQ,GAAKtD,OACM,WAAjB2a,GAA8C,aAAjBA,GACvB3a,SAAVsD,EACEA,EAFF,QAKT4a,2BAA4B,SAASpmB,GACnC,GAAI6iB,SAAsB1rB,MAAK6I,GAE3BqmB,EAAkBlvB,KAAKgvB,eAAehvB,KAAK6I,GAAO6iB,EAE9B3a,UAApBme,EACFlvB,KAAKwuB,aAAa3lB,EAAMqmB,GAME,YAAjBxD,GACT1rB,KAAKmvB,gBAAgBtmB,IAO3BxJ,GAAM6pB,IAAIiD,SAASrf,WAAaA,GAE/Bic,SCvFH,SAAU1pB,GAsJR,QAAS+vB,GAAettB,EAAGwc,EAAU+Q,GAEnC,MAAOC,UAASC,eAAeztB,EAAGwc,EAAU+Q,EAAYG,GAK1D,QAASA,GAAoB5hB,EAAUyG,GACrC,MAActD,UAAVsD,GAAoC,OAAbzG,EAClByG,EAES,OAAVA,GAA4BtD,SAAVsD,EAAuBzG,EAAWyG,EA7J9D,GAAIoZ,GAAMtuB,OAAOuuB,aAUb/P,GACF8R,uBAAwB,WACtB,GAAItE,GAAKnrB,KAAK0vB,aACd,IAAIvE,GAAMA,EAAGrlB,OAAQ,CACnB,GAAI6pB,GAAI3vB,KAAK4vB,kBAAoB,GAAIhI,mBAAiB,EACtD5nB,MAAK6vB,mBAAmBF,GAKxB,KAAK,GAAsBrtB,GAAlBE,EAAE,EAAG4G,EAAE+hB,EAAGrlB,OAAcsD,EAAF5G,IAASF,EAAE6oB,EAAG3oB,IAAKA,IAChDmtB,EAAElL,QAAQzkB,KAAMsC,GAChBtC,KAAK8vB,kBAAkBxtB,EAAGtC,KAAKsC,GAAI,QAIzCytB,qBAAsB,WAChB/vB,KAAK4vB,mBACP5vB,KAAK4vB,kBAAkB1I,KAAKlnB,KAAKgwB,sBAAuBhwB,OAG5DgwB,sBAAuB,SAASC,EAAWC,EAAWC,GACpD,GAAItnB,GAAMuiB,EAAQgF,IAClB,KAAK,GAAI5tB,KAAK0tB,GAIZ,GAFArnB,EAAOsnB,EAAM,EAAI3tB,EAAI,GACrB4oB,EAASprB,KAAKkN,QAAQrE,GACV,CACV,GAAIwnB,GAAKH,EAAU1tB,GAAI8tB,EAAKL,EAAUztB,EAEtCxC,MAAK8vB,kBAAkBjnB,EAAMynB,EAAID,GAC5BD,EAAOhF,KAEEra,SAAPsf,GAA2B,OAAPA,GAAwBtf,SAAPuf,GAA2B,OAAPA,KAC5DF,EAAOhF,IAAU,EAKjBprB,KAAKuwB,aAAanF,GAASiF,EAAIC,EAAIhU,eAM7CkU,eAAgB,WACVxwB,KAAK4vB,mBACP5vB,KAAK4vB,kBAAkBxI,WAG3BqJ,iBAAkB,SAAS5nB,GACrB7I,KAAK0wB,QAAQ7nB,IACf7I,KAAKivB,2BAA2BpmB,IAGpCinB,kBAAmB,SAASjnB,EAAMwL,EAAO8Y,GAEvC,GAAIwD,GAAe3wB,KAAKkN,QAAQrE,EAChC,IAAI8nB,IAEEvkB,MAAMwkB,QAAQzD,KAChBM,EAAIvgB,SAAW2B,QAAQ4e,IAAI,mDAAoDztB,KAAK8tB,UAAWjlB,GAC/F7I,KAAK6wB,mBAAmBhoB,EAAO,YAG7BuD,MAAMwkB,QAAQvc,IAAQ,CACxBoZ,EAAIvgB,SAAW2B,QAAQ4e,IAAI,iDAAkDztB,KAAK8tB,UAAWjlB,EAAMwL,EACnG,IAAInI,GAAW,GAAI4kB,eAAczc,EACjCnI,GAASgb,KAAK,SAAS7S,EAAO8Y,GAC5BntB,KAAKuwB,aAAaI,GAAexD,KAChCntB,MACHA,KAAK+wB,sBAAsBloB,EAAO,UAAWqD,KAInD8kB,aAAc,SAAS1S,EAAU+Q,EAAYpN,GAC3C,MAAIA,QACFjiB,KAAKse,GAAY+Q,GAGZD,EAAepvB,KAAMse,EAAU+Q,IAExCkB,aAAc,SAASnF,EAAQ/O,GAC7B,GAAIrS,GAAKhK,KAAKorB,IAAWA,CACP,mBAAPphB,IACTA,EAAGwb,MAAMxlB,KAAMqc,IAGnBwT,kBAAmB,SAASoB,GAC1BjxB,KAAKkxB,WAAalxB,KAAKkxB,eACvBlxB,KAAKkxB,WAAWzwB,KAAKwwB,IAGvBE,eAAgB,WACd,GAAKnxB,KAAKkxB,WAAV,CAGA,IAAK,GAAI1uB,GAAE,EAAG4G,EAAEpJ,KAAKkxB,WAAWprB,OAAUsD,EAAF5G,EAAKA,IAC3CxC,KAAKoxB,mBAAmBpxB,KAAKkxB,WAAW1uB,GAE1CxC,MAAKkxB,gBAEPE,mBAAoB,SAASC,GAC3B,IAAK,GAAiC1B,GAA7BntB,EAAE,EAAG4G,EAAEioB,EAAcvrB,OAAasD,EAAF5G,EAAKA,IAC5CmtB,EAAI0B,EAAc7uB,GACdmtB,GAAKA,EAAEtI,OACTsI,EAAEtI,SAKR0J,sBAAuB,SAASloB,EAAMqD,GACpC,GAAIolB,GAAKtxB,KAAKuxB,kBAAoBvxB,KAAKuxB,mBACvCD,GAAGzoB,GAAQqD,GAEb2kB,mBAAoB,SAAShoB,GAC3B,GAAIyoB,GAAKtxB,KAAKuxB,eACd,OAAID,IAAMA,EAAGzoB,IACXyoB,EAAGzoB,GAAMwe,QACTiK,EAAGzoB,GAAQ,MACJ,GAHT,QAMF2oB,oBAAqB,WACnB,GAAIxxB,KAAKuxB,gBAAiB,CACxB,IAAK,GAAI/uB,KAAKxC,MAAKuxB,gBACjBvxB,KAAK6wB,mBAAmBruB,EAE1BxC,MAAKuxB,qBA6BXlyB,GAAM6pB,IAAIiD,SAASxO,WAAaA,GAE/BoL,SC7KH,SAAU1pB,GAIR,GAAIouB,GAAMtuB,OAAOuuB,UAAY,EAGzB+D,GACFC,iBAAkB,SAASnJ,GAEzB,GAAIoJ,GAAS3xB,KAAK2xB,SAAYpJ,EAASqJ,iBACnC5xB,KAAKO,QAAQoxB,OACbE,EAAMtJ,EAASuJ,eAAe9xB,KAAM2xB,EAExC,OADA3xB,MAAK6vB,kBAAkBgC,EAAIE,WACpBF,GAETxuB,KAAM,SAASwF,EAAMwmB,EAAYpN,GAC/B,GAAI3D,GAAWte,KAAK4uB,qBAAqB/lB,EACzC,IAAKyV,EAIE,CAEL,GAAIpS,GAAWlM,KAAKgxB,aAAa1S,EAAU+Q,EAAYpN,EAUvD,OAPIwK,UAASuF,0BAA4B9lB,IACvCA,EAAS0W,KAAOyM,EAAW4C,MAC3BjyB,KAAKkyB,eAAe5T,EAAUpS,IAE5BlM,KAAK0wB,QAAQpS,IACfte,KAAKivB,2BAA2B3Q,GAE3BpS,EAbP,MAAOlM,MAAKmyB,WAAW7V,YAgB3B8V,aAAc,WACZpyB,KAAKqyB,oBAEPH,eAAgB,SAASrpB,EAAMqD,GAC7BlM,KAAK+xB,UAAY/xB,KAAK+xB,cACtB/xB,KAAK+xB,UAAUlpB,GAAQqD,GAKzBomB,eAAgB,WACTtyB,KAAKuyB,WACR9E,EAAI+E,QAAU3jB,QAAQ4e,IAAI,sBAAuBztB,KAAK8tB,WACtD9tB,KAAKyyB,cAAgBzyB,KAAKwpB,IAAIxpB,KAAKyyB,cAAezyB,KAAK0yB,UAAW,KAGtEA,UAAW,WACJ1yB,KAAKuyB,WACRvyB,KAAKmxB,iBACLnxB,KAAKwxB,sBACLxxB,KAAKuyB,UAAW,IAGpBI,gBAAiB,WACf,MAAI3yB,MAAKuyB,cACP9E,EAAI+E,QAAU3jB,QAAQC,KAAK,gDAAiD9O,KAAK8tB,aAGnFL,EAAI+E,QAAU3jB,QAAQ4e,IAAI,uBAAwBztB,KAAK8tB,gBACnD9tB,KAAKyyB,gBACPzyB,KAAKyyB,cAAgBzyB,KAAKyyB,cAAc/I,YAsB1CkJ,EAAkB,gBAItBvzB,GAAMyvB,YAAc8D,EACpBvzB,EAAM6pB,IAAIiD,SAASsF,IAAMA,GAExB1I,SChGH,SAAU1pB,GA8NR,QAASwzB,GAAO/P,GACd,MAAOA,GAAOqB,eAAe,eAK/B,QAAS2O,MAlOT,GAAIC,IACFD,aAAa,EACbtJ,IAAK,SAASA,EAAK5hB,EAAU6hB,GAC3B,GAAmB,gBAARD,GAIT,MAAOT,SAAQS,IAAI1hB,KAAK9H,KAAMwpB,EAAK5hB,EAAU6hB,EAH7C,IAAInnB,GAAI,MAAQknB,CAChBxpB,MAAKsC,GAAKymB,QAAQS,IAAI1hB,KAAK9H,KAAMA,KAAKsC,GAAIsF,EAAU6hB,IAKxD8B,QAAOxC,QAAQwC,MAEfyH,QAAS,aAITC,MAAO,aAEPC,gBAAiB,WACXlzB,KAAKwoB,kBAAoBxoB,KAAKwoB,iBAAiBxG,OACjDnT,QAAQC,KAAK,iBAAmB9O,KAAK8tB,UAAY,wGAInD9tB,KAAKgzB,UACLhzB,KAAKmzB,mBAGAnzB,KAAKozB,cAAcC,mBAAqBl0B,OAAO+E,oBAClDlE,KAAKqyB,oBAITc,eAAgB,WACd,MAAInzB,MAAKszB,qBACPzkB,SAAQC,KAAK,2BAA4B9O,KAAK8tB,YAGhD9tB,KAAKszB,kBAAmB,EAExBtzB,KAAKuzB,eAELvzB,KAAKyvB,yBAELzvB,KAAK+vB,uBAEL/vB,KAAKouB,yBAELpuB,KAAKyuB,qBAELzuB,MAAK4tB,qBAEPyE,iBAAkB,WACZryB,KAAKwzB,WAGTxzB,KAAKwzB,UAAW,EAIhBxzB,KAAKyzB,kBAAkBzzB,KAAKkrB,WAI5BlrB,KAAKmvB,gBAAgB,cAErBnvB,KAAKizB,UAKPS,iBAAkB,WAChB1zB,KAAK2yB,kBAED3yB,KAAK2zB,UACP3zB,KAAK2zB,WAGH3zB,KAAK4zB,aACP5zB,KAAK4zB,cAMF5zB,KAAK6zB,kBACR7zB,KAAK6zB,iBAAkB,EACnB7zB,KAAK8zB,UACP9zB,KAAKusB,MAAM,cAIjBwH,iBAAkB,WACX/zB,KAAKg0B,gBACRh0B,KAAKsyB,iBAGHtyB,KAAKi0B,UACPj0B,KAAKi0B,WAGHj0B,KAAKk0B,UACPl0B,KAAKk0B,YAITC,oBAAqB,WACnBn0B,KAAK0zB,oBAGPU,iBAAkB,WAChBp0B,KAAK+zB,oBAGPM,wBAAyB,WACvBr0B,KAAK0zB,oBAGPY,qBAAsB,WACpBt0B,KAAK+zB,oBAGPN,kBAAmB,SAASztB,GACtBA,GAAKA,EAAEzF,UACTP,KAAKyzB,kBAAkBztB,EAAEklB,WACzBllB,EAAEuuB,iBAAiBzsB,KAAK9H,KAAMgG,EAAEzF,WAIpCg0B,iBAAkB,SAASC,GACzB,GAAIjM,GAAWvoB,KAAKy0B,cAAcD,EAClC,IAAIjM,EAAU,CACZ,GAAImM,GAAO10B,KAAK20B,mBAAmBpM,EACnCvoB,MAAKuzB,YAAYiB,EAAe3rB,MAAQ6rB,IAI5CD,cAAe,SAASD,GACtB,MAAOA,GAAen0B,cAAc,aAGtCs0B,mBAAoB,SAASpM,GAC3B,GAAIA,EAAU,CAEZ,GAAImM,GAAO10B,KAAKmE,mBAKZ0tB,EAAM7xB,KAAK0xB,iBAAiBnJ,EAMhC,OAJAmM,GAAK/vB,YAAYktB,GAEjB7xB,KAAK40B,gBAAgBF,EAAMnM,GAEpBmM,IAIXG,kBAAmB,SAAStM,EAAUuM,GACpC,GAAIvM,EAAU,CAKZvoB,KAAK+0B,gBAAkB/0B,IAKvB,IAAI6xB,GAAM7xB,KAAK0xB,iBAAiBnJ,EAUhC,OARIuM,GACF90B,KAAKg1B,aAAanD,EAAKiD,GAEvB90B,KAAK2E,YAAYktB,GAGnB7xB,KAAK40B,gBAAgB50B,MAEd6xB,IAGX+C,gBAAiB,SAASF,GAExB10B,KAAKi1B,sBAAsBP,GAE3Bt1B,gBAAgB8J,SAASwrB,IAG3BO,sBAAuB,SAASP,GAE9B,GAAIQ,GAAIl1B,KAAKk1B,EAAIl1B,KAAKk1B,KAEtB,IAAIR,EAEF,IAAK,GAAsBpyB,GADvB6oB,EAAKuJ,EAAKjnB,iBAAiB,QACtBjL,EAAE,EAAG4G,EAAE+hB,EAAGrlB,OAAcsD,EAAF5G,IAASF,EAAE6oB,EAAG3oB,IAAKA,IAChD0yB,EAAE5yB,EAAEqQ,IAAMrQ,GAIhB6yB,yBAA0B,SAAStsB,GAEpB,UAATA,GAA6B,UAATA,GACtB7I,KAAK2uB,oBAAoB9lB,EAAM7I,KAAK2Q,aAAa9H,IAE/C7I,KAAKo1B,kBACPp1B,KAAKo1B,iBAAiB5P,MAAMxlB,KAAMsc,YAGtC+Y,WAAY,SAASxyB,EAAMyyB,GACzB,GAAIppB,GAAW,GAAIM,kBAAiB,SAAS+B,GAC3C+mB,EAASxtB,KAAK9H,KAAMkM,EAAUqC,GAC9BrC,EAASqpB,cACTlyB,KAAKrD,MACPkM,GAASgB,QAAQrK,GAAOgK,WAAW,EAAMD,SAAS,KAYtDkmB,GAAY5rB,UAAY6rB,EACxBA,EAAKyC,YAAc1C,EAInBzzB,EAAMo2B,KAAO3C,EACbzzB,EAAMwzB,OAASA,EACfxzB,EAAM6pB,IAAIiD,SAAS4G,KAAOA,GAEzBhK,SC9OH,SAAU1pB,GA8ER,QAASkrB,GAAerjB,GACtB,MAAOA,GAAUgkB,UAGnB,QAASwK,GAAYC,EAASlzB,GAC5B,GAAIoG,GAAO,GAAI+sB,GAAK,CAChBnzB,KACFoG,EAAOpG,EAAKqrB,UACZ8H,EAAKnzB,EAAK8rB,aAAa,MAEzB,IAAI/qB,GAAWipB,SAASoJ,UAAUC,kBAAkBjtB,EAAM+sB,EAC1D,OAAOnJ,UAASoJ,UAAUH,YAAYC,EAASnyB,GArFjD,GAIIuyB,IAJM52B,OAAOuuB,aAIW,WACxBsI,EAAyB,aAEzBpyB,GACFmyB,sBAAuBA,EAMvBE,wBAAyB,WAEvB,GAAI52B,GAAQW,KAAKk2B,gBACjB,IAAI72B,IAAUW,KAAKm2B,mBAAmB92B,EAAOW,KAAK8tB,WAAY,CAG5D,IADA,GAAIzC,GAAQd,EAAevqB,MAAO21B,EAAU,GACrCtK,GAASA,EAAM9qB,SACpBo1B,GAAWtK,EAAM9qB,QAAQ61B,gBAAgBJ,GACzC3K,EAAQd,EAAec,EAErBsK,IACF31B,KAAKq2B,oBAAoBV,EAASt2B,KAIxCi3B,kBAAmB,SAASvyB,EAAO8E,EAAMxJ,GACvC,GAAIA,GAAQA,GAASW,KAAKk2B,iBAAkBrtB,EAAOA,GAAQ,EAC3D,IAAIxJ,IAAUW,KAAKm2B,mBAAmB92B,EAAOW,KAAK8tB,UAAYjlB,GAAO,CACnE,GAAI8sB,GAAU,EACd,IAAI5xB,YAAiBqI,OACnB,IAAK,GAAyBrM,GAArByC,EAAE,EAAG4G,EAAErF,EAAM+B,OAAcsD,EAAF5G,IAASzC,EAAEgE,EAAMvB,IAAKA,IACtDmzB,GAAW51B,EAAE2E,YAAc,WAG7BixB,GAAU5xB,EAAMW,WAElB1E,MAAKq2B,oBAAoBV,EAASt2B,EAAOwJ,KAG7CwtB,oBAAqB,SAASV,EAASt2B,EAAOwJ,GAG5C,GAFAxJ,EAAQA,GAASW,KAAKk2B,iBACtBrtB,EAAOA,GAAQ,GACVxJ,EAAL,CAGIF,OAAO+E,oBACTyxB,EAAUD,EAAYC,EAASt2B,EAAMoD,MAEvC,IAAIsB,GAAQ/D,KAAKO,QAAQg2B,oBAAoBZ,EACzCK,EACJjN,SAAQyN,kBAAkBzyB,EAAO1E,GAEjCA,EAAMo3B,aAAaz2B,KAAK8tB,UAAYjlB,IAAQ,IAE9CqtB,eAAgB,SAASrzB,GAGvB,IADA,GAAIP,GAAIO,GAAQ7C,KACTsC,EAAElB,YACPkB,EAAIA,EAAElB,UAER,OAAOkB,IAET6zB,mBAAoB,SAAS92B,EAAOwJ,GAElC,MADAxJ,GAAMo3B,aAAep3B,EAAMo3B,iBACpBp3B,EAAMo3B,aAAa5tB,IAsB9BxJ,GAAM6pB,IAAIiD,SAASvoB,OAASA,GAE3BmlB,SChGH,SAAU1pB,GAUR,QAASkB,GAAQsI,EAAM3B,GACrB,GAAyB,IAArBoV,UAAUxW,QAAwC,gBAAjBwW,WAAU,GAAiB,CAC9DpV,EAAY2B,CACZ,IAAI6tB,GAASv1B,SAASw1B,cAGtB,IAFA9tB,EAAO6tB,GAAUA,EAAOt1B,YAAcs1B,EAAOt1B,WAAWuP,aACpD+lB,EAAOt1B,WAAWuP,aAAa,QAAU,IACxC9H,EACH,KAAM,sCAGV,GAAI+tB,EAAuB/tB,GACzB,KAAM,sDAAwDA,CAGhEguB,GAAkBhuB,EAAM3B,GAExB4vB,EAAgBjuB,GAKlB,QAASkuB,GAAoBluB,EAAMmuB,GACjCC,EAAcpuB,GAAQmuB,EAKxB,QAASF,GAAgBjuB,GACnBouB,EAAcpuB,KAChBouB,EAAcpuB,GAAMquB,0BACbD,GAAcpuB,IAgBzB,QAASguB,GAAkBhuB,EAAM3B,GAC/B,MAAOiwB,GAAiBtuB,GAAQ3B,MAGlC,QAAS0vB,GAAuB/tB,GAC9B,MAAOsuB,GAAiBtuB,GAzD1B,GAAIogB,GAAS5pB,EAAM4pB,OA+BfgO,GA9BM53B,EAAM6pB,QAiDZiO,IAYJ93B,GAAMu3B,uBAAyBA,EAC/Bv3B,EAAM03B,oBAAsBA,EAO5B53B,OAAO4pB,QAAUxoB,EAKjB0oB,EAAOF,QAAS1pB,EAOhB,IAAI+3B,GAAe3K,SAAS4K,qBAC5B,IAAID,EACF,IAAK,GAAgCh1B,GAA5BI,EAAE,EAAG4G,EAAEguB,EAAatxB,OAAcsD,EAAF5G,IAASJ,EAAEg1B,EAAa50B,IAAKA,IACpEjC,EAAQilB,MAAM,KAAMpjB,IAIvB2mB,SC7FH,SAAU1pB,GAEV,GAAIujB,IACF0U,oBAAqB,SAASz0B,GAC5B4pB,SAAS8K,YAAYC,WAAW30B,IAElC40B,kBAAmB,WAEjB,GAAIC,GAAY13B,KAAK2Q,aAAa,cAAgB,GAC9C+jB,EAAO,GAAIiD,KAAID,EAAW13B,KAAKozB,cAAcwE,QACjD53B,MAAKkH,UAAU2wB,YAAc,SAASC,EAAS/E,GAC7C,GAAIxwB,GAAI,GAAIo1B,KAAIG,EAAS/E,GAAQ2B,EACjC,OAAOnyB,GAAEw1B,OAMf14B,GAAM6pB,IAAIgD,YAAYtJ,KAAOA,GAE1BmG,SCpBH,SAAU1pB,GA0KR,QAAS24B,GAAmBC,EAAOC,GACjC,GAAIH,GAAO,GAAIJ,KAAIM,EAAMtnB,aAAa,QAASunB,GAASH,IACxD,OAAO,YAAeA,EAAO,KAG/B,QAASvB,GAAkBzyB,EAAO1E,GAChC,GAAI0E,EAAO,CACL1E,IAAU8B,WACZ9B,EAAQ8B,SAAS2C,MAEf3E,OAAO+E,oBACT7E,EAAQ8B,SAAS2C,KAOnB,IAAIoH,GAAQitB,EAAmBp0B,EAAMW,aACjC0zB,EAAOr0B,EAAM4M,aAAaolB,EAC1BqC,IACFltB,EAAMsjB,aAAauH,EAAuBqC,EAI5C,IAAItD,GAAUz1B,EAAMg5B,iBACpB,IAAIh5B,IAAU8B,SAAS2C,KAAM,CAC3B,GAAIN,GAAW,SAAWuyB,EAAwB,IAC9CuC,EAAKn3B,SAAS2C,KAAK2J,iBAAiBjK,EACpC80B,GAAGxyB,SACLgvB,EAAUwD,EAAGA,EAAGxyB,OAAO,GAAGyyB,oBAG9Bl5B,EAAM21B,aAAa9pB,EAAO4pB,IAI9B,QAASqD,GAAmBxC,EAASt2B,GACnCA,EAAQA,GAAS8B,SACjB9B,EAAQA,EAAMoF,cAAgBpF,EAAQA,EAAM+zB,aAC5C,IAAIrvB,GAAQ1E,EAAMoF,cAAc,QAEhC,OADAV,GAAMW,YAAcixB,EACb5xB,EAGT,QAASy0B,GAAiBP,GACxB,MAAQA,IAASA,EAAMQ,YAAe,GAGxC,QAASC,GAAgB71B,EAAM81B,GAC7B,MAAIC,GACKA,EAAQ9wB,KAAKjF,EAAM81B,GAD5B,OAxNF,GACIzP,IADM/pB,OAAOuuB,aACPruB,EAAM6pB,IAAIiD,SAASvoB,QACzBmyB,EAAwB7M,EAAI6M,sBAI5B8C,EAAiB,QACjBC,EAAuB,UACvBC,EAAiB,uBACjBC,EAAqB,SACrBC,EAAa,gBAEbr1B,GAEFs1B,WAAY,SAAStxB,GACnB,GAAI2gB,GAAWvoB,KAAKy0B,gBAChB0E,EAAU5Q,GAAYvoB,KAAKo5B,iBAC/B,IAAID,EAAS,CACXn5B,KAAKq5B,sBAAsBF,EAC3B,IAAIv1B,GAAS5D,KAAKs5B,mBAAmBH,EACrC,IAAIv1B,EAAOkC,OAAQ,CACjB,GAAIyzB,GAAchR,EAAS6K,cAAcwE,OACzC,OAAOnL,UAAS+M,cAAcN,WAAWt1B,EAAQ21B,EAAa3xB,IAG9DA,GACFA,KAGJyxB,sBAAuB,SAAS3E,GAE9B,IAAK,GAAsB30B,GAAG+jB,EAD1BwU,EAAK5D,EAAKjnB,iBAAiBsrB,GACtBv2B,EAAE,EAAG4G,EAAEkvB,EAAGxyB,OAAiBsD,EAAF5G,IAASzC,EAAEu4B,EAAG91B,IAAKA,IACnDshB,EAAIqU,EAAmBH,EAAmBj4B,EAAGC,KAAKozB,cAAcwE,SAC5D53B,KAAKozB,eACTpzB,KAAKy5B,oBAAoB3V,EAAG/jB,GAC5BA,EAAEqB,WAAWs4B,aAAa5V,EAAG/jB,IAGjC05B,oBAAqB,SAAS11B,EAAO41B,GACnC,IAAK,GAA0C73B,GAAtCU,EAAE,EAAG6rB,EAAGsL,EAAK7sB,WAAY1D,EAAEilB,EAAGvoB,QAAYhE,EAAEusB,EAAG7rB,KAAS4G,EAAF5G,EAAKA,IACnD,QAAXV,EAAE+G,MAA6B,SAAX/G,EAAE+G,MACxB9E,EAAMyqB,aAAa1sB,EAAE+G,KAAM/G,EAAEuS,QAInCilB,mBAAoB,SAAS5E,GAC3B,GAAIkF,KACJ,IAAIlF,EAEF,IAAK,GAAsB30B,GADvBu4B,EAAK5D,EAAKjnB,iBAAiBorB,GACtBr2B,EAAE,EAAG4G,EAAEkvB,EAAGxyB,OAAcsD,EAAF5G,IAASzC,EAAEu4B,EAAG91B,IAAKA,IAC5CzC,EAAE2E,YAAYmY,MAAMic,IACtBc,EAAUn5B,KAAKV,EAIrB,OAAO65B,IAOTC,cAAe,WACb75B,KAAK85B,cACL95B,KAAK+5B,cACL/5B,KAAKg6B,qBACLh6B,KAAKi6B,uBAKPH,YAAa,WACX95B,KAAKk6B,OAASl6B,KAAKm6B,UAAUpB,GAC7B/4B,KAAKk6B,OAAO91B,QAAQ,SAASrE,GACvBA,EAAEqB,YACJrB,EAAEqB,WAAWg5B,YAAYr6B,MAI/Bg6B,YAAa,WACX/5B,KAAK4D,OAAS5D,KAAKm6B,UAAUtB,EAAiB,IAAMI,EAAa,KACjEj5B,KAAK4D,OAAOQ,QAAQ,SAASrE,GACvBA,EAAEqB,YACJrB,EAAEqB,WAAWg5B,YAAYr6B,MAa/Bi6B,mBAAoB,WAClB,GAAIE,GAASl6B,KAAKk6B,OAAO3tB,OAAO,SAASxM,GACvC,OAAQA,EAAEwuB,aAAa0K,KAErBE,EAAUn5B,KAAKo5B,iBACnB,IAAID,EAAS,CACX,GAAIxD,GAAU,EAId,IAHAuE,EAAO91B,QAAQ,SAAS6zB,GACtBtC,GAAW6C,EAAiBP,GAAS,OAEnCtC,EAAS,CACX,GAAI5xB,GAAQo0B,EAAmBxC,EAAS31B,KAAKozB,cAC7C+F,GAAQnE,aAAajxB,EAAOo1B,EAAQkB,eAI1CF,UAAW,SAAS32B,EAAU82B,GAC5B,GAAIC,GAAQv6B,KAAKyN,iBAAiBjK,GAAUg3B,QACxCrB,EAAUn5B,KAAKo5B,iBACnB,IAAID,EAAS,CACX,GAAIsB,GAAgBtB,EAAQ1rB,iBAAiBjK,GAAUg3B,OACvDD,GAAQA,EAAMvsB,OAAOysB,GAEvB,MAAOH,GAAUC,EAAMhuB,OAAO+tB,GAAWC,GAW3CN,oBAAqB,WACnB,GAAIl2B,GAAQ/D,KAAK06B,cAAc1B,EAC/BxC,GAAkBzyB,EAAO5C,SAAS2C,OAEpCsyB,gBAAiB,SAASuE,GACxB,GAAIhF,GAAU,GAEVnyB,EAAW,IAAMy1B,EAAa,IAAM0B,EAAkB,IACtDL,EAAU,SAASv6B,GACrB,MAAO24B,GAAgB34B,EAAGyD,IAExB02B,EAASl6B,KAAKk6B,OAAO3tB,OAAO+tB,EAChCJ,GAAO91B,QAAQ,SAAS6zB,GACtBtC,GAAW6C,EAAiBP,GAAS,QAGvC,IAAIr0B,GAAS5D,KAAK4D,OAAO2I,OAAO+tB,EAIhC,OAHA12B,GAAOQ,QAAQ,SAASL,GACtB4xB,GAAW5xB,EAAMW,YAAc,SAE1BixB,GAET+E,cAAe,SAASC,GACtB,GAAIhF,GAAU31B,KAAKo2B,gBAAgBuE,EACnC,OAAO36B,MAAKu2B,oBAAoBZ,EAASgF,IAE3CpE,oBAAqB,SAASZ,EAASgF,GACrC,GAAIhF,EAAS,CACX,GAAI5xB,GAAQo0B,EAAmBxC,EAG/B,OAFA5xB,GAAMyqB,aAAauH,EAAuB/1B,KAAK2Q,aAAa,QACxD,IAAMgqB,GACH52B,KA2DTiC,EAAIokB,YAAYljB,UAChB0xB,EAAU5yB,EAAE4yB,SAAW5yB,EAAE0yB,iBAAmB1yB,EAAE40B,uBAC3C50B,EAAE60B,kBAITx7B,GAAM6pB,IAAIgD,YAAYtoB,OAASA,EAC/BvE,EAAMm3B,kBAAoBA,GAEzBzN,SCzOH,SAAU1pB,GAIR,GACI6pB,IADM/pB,OAAOuuB,aACPruB,EAAM6pB,IAAIiD,SAASnjB,QACzB2kB,EAAezE,EAAIyE,aAGnBmN,MAEF,uBACA,qBACA,sBACA,cACA,aACA,kBACA12B,QAAQ,SAASgB,GACjB01B,EAAoB11B,EAAE2e,eAAiB3e,GAGzC,IAAI4D,IACF+xB,gBAAiB,WAEf,GAAIC,GAAYh7B,KAAKkH,UAAU2mB,cAE/B7tB,MAAKi7B,sBAAsBD,IAE7BC,sBAAuB,SAASD,GAE9B,IAAK,GAASl5B,GAALU,EAAE,EAAMV,EAAE9B,KAAK8M,WAAWtK,GAAIA,IAEjCxC,KAAKk7B,eAAep5B,EAAE+G,QAExBmyB,EAAUh7B,KAAKm7B,kBAAkBr5B,EAAE+G,OAAS/G,EAAEuS,MAAMmI,QAAQ,KAAM,IAC7DA,QAAQ,KAAM,IAAI4e,SAK7BF,eAAgB,SAAU54B,GACxB,MAAOA,IAAe,MAATA,EAAE,IAAyB,MAATA,EAAE,IAAyB,MAATA,EAAE,IAErD64B,kBAAmB,SAAS74B,GAC1B,MAAOA,GAAEgK,MAAM+uB,IAEjBC,eAAgB,SAASz4B,GACvB,KAAOA,EAAKzB,YAAY,CACtB,GAAIyB,EAAKkyB,gBACP,MAAOlyB,GAAKkyB,eAEdlyB,GAAOA,EAAKzB,WAEd,MAAOyB,GAAKJ,MAEdurB,gBAAiB,SAASuN,EAAYj8B,EAAQ8rB,GAC5C,GAAIpiB,GAAShJ,IACb,OAAO,UAASoF,GACTm2B,GAAeA,EAAWzI,cAC7ByI,EAAavyB,EAAOsyB,eAAeh8B,GAGrC,IAAI+c,IAAQjX,EAAGA,EAAE2N,OAAQ3N,EAAEyO,cAC3B0nB,GAAWtN,eAAesN,EAAYnQ,EAAQ/O,KAGlDmf,oBAAqB,SAASnX,EAAYxb,GACxC,GAAK7I,KAAKk7B,eAAeryB,GAAzB,CAGA,GAAI4yB,GAAYz7B,KAAKm7B,kBAAkBtyB,EACvC4yB,GAAYX,EAAoBW,IAAcA,CAE9C,IAAIzyB,GAAShJ,IAEb,OAAO,UAASgiB,EAAOnf,EAAMof,GAW3B,QAASyZ,KACP,MAAO,MAAQrX,EAAa,MAX9B,GAAIsX,GAAU3yB,EAAOglB,gBAAgBjd,OAAWlO,EAAMwhB,EAGtD,OAFAxhB,GAAK2H,iBAAiBixB,EAAWE,GAE7B1Z,EAAJ,QAYEiF,KAAMwU,EACNvU,eAAgBuU,EAChBrU,MAAO,WACLxkB,EAAK6H,oBAAoB+wB,EAAWE,SAO1CN,EAAe1N,EAAa7nB,MAGhCzG,GAAM6pB,IAAIgD,YAAYljB,OAASA,GAE9B+f,SC1GH,SAAU1pB,GAIR,GAAIse,IACFie,eAAgB,SAAS10B,GAEvB,GAAiCoX,GAA7BpR,EAAUhG,EAAUgG,OACxB,KAAK,GAAI5K,KAAK4E,GACQ,YAAhB5E,EAAEgK,MAAM,MACLY,IACHA,EAAYhG,EAAUgG,YAExBoR,EAAWhc,EAAEgK,MAAM,EAAG,IACtBY,EAAQoR,GAAYpR,EAAQoR,IAAahc,IAI/Cu5B,iBAAkB,SAAS30B,GAEzB,GAAIyoB,GAAIzoB,EAAUgG,OAClB,IAAIyiB,EAAG,CACL,GAAImM,KACJ,KAAK,GAAIx5B,KAAKqtB,GAEZ,IAAK,GAASoM,GADVC,EAAQ15B,EAAE25B,MAAM,KACXz5B,EAAE,EAAOu5B,EAAGC,EAAMx5B,GAAIA,IAC7Bs5B,EAASC,GAAMpM,EAAErtB,EAGrB4E,GAAUgG,QAAU4uB,IAGxBI,qBAAsB,SAASh1B,GAC7B,GAAIA,EAAUgG,QAAS,CAErB,GAAIpL,GAAIoF,EAAUwoB,gBAClB,KAAK,GAAIptB,KAAK4E,GAAUgG,QAEtB,IAAK,GAAS6uB,GADVC,EAAQ15B,EAAE25B,MAAM,KACXz5B,EAAE,EAAOu5B,EAAGC,EAAMx5B,GAAIA,IAC7BV,EAAErB,KAAKs7B,GAIb,GAAI70B,EAAUklB,QAAS,CAErB,GAAItqB,GAAIoF,EAAUi1B,gBAClB,KAAK,GAAI75B,KAAK4E,GAAUklB,QACtBtqB,EAAErB,KAAK6B,KAIb85B,kBAAmB,SAASl1B,EAAW6rB,GAErC,GAAI3G,GAAUllB,EAAUklB,OACpBA,KAEFpsB,KAAKq8B,kBAAkBjQ,EAASllB,EAAW6rB,GAE3C7rB,EAAUwnB,WAAa1uB,KAAKs8B,aAAalQ,KAS7CiQ,kBAAmB,SAASE,EAAqBr1B,GAE/CA,EAAUwpB,QAAUxpB,EAAUwpB,WAG9B,KAAK,GAAIpuB,KAAKi6B,GAAqB,CACjC,GAAIC,GAAqBD,EAAoBj6B,GACzCm6B,EAAWz8B,KAAK08B,yBAAyBF,EAChBzrB,UAAzB7J,EAAUwpB,QAAQpuB,IAAiCyO,SAAb0rB,IACxCv1B,EAAUwpB,QAAQpuB,GAAKm6B,GAEJ1rB,SAAjB7J,EAAU5E,KACZ4E,EAAU5E,GAAKtC,KAAK28B,mBAAmBH,MAI7CG,mBAAoB,SAASH,GAC3B,GAAInoB,GAAsC,gBAAvBmoB,IACfA,EAAqBA,EAAmBnoB,MAAQmoB,CACpD,OAAiBzrB,UAAVsD,EAAsBA,EAAQ,MAGvCqoB,yBAA0B,SAASF,GACjC,MAAkC,gBAAvBA,IACPA,GAAqDzrB,SAA/ByrB,EAAmB9L,QACpC8L,EAAmB9L,QAF5B,QAKF4L,aAAc,SAAS3e,GACrB,GAAIpZ,KACJ,KAAK,GAAIjC,KAAKqb,GACZpZ,EAAIjC,EAAEyhB,eAAiBzhB,CAEzB,OAAOiC,IAETq4B,wBAAyB,SAAS11B,GAChC,GAAIikB,GAAKjkB,EAAUi1B,aACnB,IAAIhR,GAAMA,EAAGrlB,OACX,IAAK,GAAsBxD,GAAlBE,EAAE,EAAG4G,EAAE+hB,EAAGrlB,OAAkBsD,EAAF5G,IAASF,EAAE6oB,EAAG3oB,IAAKA,IACpD8sB,SAASuN,gCAAgC31B,EAAW5E,IAQ5DjD,GAAM6pB,IAAIgD,YAAYvO,WAAaA,GAElCoL,SCrHH,SAAU1pB,GAIR,GAAIy9B,GAAuB,aACvBC,EAAmB,OAInBjwB,GAEFkwB,yBAA0B,SAAS91B,GAEjClH,KAAKi9B,cAAc/1B,EAAW,aAE9BlH,KAAKi9B,cAAc/1B,EAAW,wBAGhCg2B,kBAAmB,SAASh2B,EAAW6rB,GAErC,GAAIjmB,GAAa9M,KAAK2Q,aAAamsB,EACnC,IAAIhwB,EAMF,IAAK,GAAyBxK,GAJ1B8pB,EAAUllB,EAAUklB,UAAYllB,EAAUklB,YAE1C4P,EAAQlvB,EAAWmvB,MAAMc,GAEpBv6B,EAAE,EAAG4G,EAAE4yB,EAAMl2B,OAAasD,EAAF5G,EAAKA,IAEpCF,EAAI05B,EAAMx5B,GAAG44B,OAET94B,GAAoByO,SAAfqb,EAAQ9pB,IAAgCyO,SAAZgiB,EAAKzwB,KAGxC8pB,EAAQ9pB,GAAKymB,QAAQwE,MAO7B4P,6BAA8B,WAK5B,IAAK,GAAsBr7B,GAHvBs7B,EAAWp9B,KAAKkH,UAAUonB,oBAE1BD,EAAKruB,KAAK8M,WACLtK,EAAE,EAAG4G,EAAEilB,EAAGvoB,OAAcsD,EAAF5G,IAASV,EAAEusB,EAAG7rB,IAAKA,IAC5CxC,KAAKq9B,oBAAoBv7B,EAAE+G,QAC7Bu0B,EAASt7B,EAAE+G,MAAQ/G,EAAEuS,QAK3BgpB,oBAAqB,SAASx0B,GAC5B,OAAQ7I,KAAKs9B,UAAUz0B,IAA6B,QAApBA,EAAKyD,MAAM,EAAE,IAI/CgxB,WACEz0B,KAAM,EACN00B,UAAW,EACX/H,YAAa,EACbgI,SAAU,EACVC,UAAW,EACXC,gBAAiB,GAMrB5wB,GAAWwwB,UAAUR,GAAwB,EAI7Cz9B,EAAM6pB,IAAIgD,YAAYpf,WAAaA,GAElCic,SC3EH,SAAU1pB,GAGR,GAAI2J,GAAS3J,EAAM6pB,IAAIgD,YAAYljB,OAE/B2oB,EAAS,GAAInN,oBACbhD,EAAiBmQ,EAAOnQ,cAI5BmQ,GAAOnQ,eAAiB,SAAS6C,EAAYxb,EAAMhG,GACjD,MAAOmG,GAAOwyB,oBAAoBnX,EAAYxb,EAAMhG,IAC7C2e,EAAe1Z,KAAK6pB,EAAQtN,EAAYxb,EAAMhG,GAIvD,IAAI4uB,IACFE,OAAQA,EACR8C,cAAe,WACb,MAAOz0B,MAAKK,cAAc,aAE5B+4B,gBAAiB,WACf,GAAI7Q,GAAWvoB,KAAKy0B,eACpB,OAAOlM,IAAYkE,SAAS2M,gBAAgB7Q,IAE9CoV,uBAAwB,SAASpV,GAC3BA,IACFA,EAASqJ,gBAAkB5xB,KAAK2xB,SAMtCtyB,GAAM6pB,IAAIgD,YAAYuF,IAAMA,GAE3B1I,SCnCH,SAAU1pB,GAoOR,QAASu+B,GAAyB12B,GAChC,IAAKxB,OAAOwlB,UAAW,CACrB,GAAI2S,GAAWn4B,OAAO6kB,eAAerjB,EACrCA,GAAUgkB,UAAY2S,EAClBhL,EAAOgL,KACTA,EAAS3S,UAAYxlB,OAAO6kB,eAAesT,KArOjD,GAAI3U,GAAM7pB,EAAM6pB,IACZ2J,EAASxzB,EAAMwzB,OACf5J,EAAS5pB,EAAM4pB,OAIf/hB,GAEFgC,SAAU,SAASL,EAAMi1B,GAEvB99B,KAAK+9B,eAAel1B,EAAMi1B,GAE1B99B,KAAK62B,kBAAkBhuB,EAAMi1B,GAE7B99B,KAAKg+B,sBAGPD,eAAgB,SAASl1B,EAAMi1B,GAE7B,GAAIG,GAAY5+B,EAAMu3B,uBAAuB/tB,GAEzCkqB,EAAO/yB,KAAKk+B,sBAAsBJ,EAEtC99B,MAAKm+B,sBAAsBF,EAAWlL,GAEtC/yB,KAAKkH,UAAYlH,KAAKo+B,gBAAgBH,EAAWlL,GAEjD/yB,KAAKq+B,qBAAqBx1B,EAAMi1B,IAGlCK,sBAAuB,SAASj3B,EAAW6rB,GAGzC7rB,EAAU3G,QAAUP,KAEpBA,KAAKk9B,kBAAkBh2B,EAAW6rB,GAElC/yB,KAAKo8B,kBAAkBl1B,EAAW6rB,GAElC/yB,KAAK47B,eAAe10B,GAEpBlH,KAAK67B,iBAAiB30B,IAGxBk3B,gBAAiB,SAASl3B,EAAW6rB,GAEnC/yB,KAAKs+B,gBAAgBp3B,EAAW6rB,EAEhC,IAAIwL,GAAUv+B,KAAKw+B,YAAYt3B,EAAW6rB,EAG1C,OADA6K,GAAyBW,GAClBA,GAGTD,gBAAiB,SAASp3B,EAAW6rB,GAEnC/yB,KAAKi9B,cAAc,UAAW/1B,EAAW6rB,GAEzC/yB,KAAKi9B,cAAc,UAAW/1B,EAAW6rB,GAEzC/yB,KAAKi9B,cAAc,UAAW/1B,EAAW6rB,GAEzC/yB,KAAKi9B,cAAc,aAAc/1B,EAAW6rB,GAE5C/yB,KAAKi9B,cAAc,sBAAuB/1B,EAAW6rB,GAErD/yB,KAAKi9B,cAAc,iBAAkB/1B,EAAW6rB,IAIlDsL,qBAAsB,SAASx1B,EAAM41B,GAEnCz+B,KAAKk8B,qBAAqBl8B,KAAKkH,WAC/BlH,KAAK48B,wBAAwB58B,KAAKkH,WAElClH,KAAK29B,uBAAuB39B,KAAKy0B,iBAEjCz0B,KAAK65B,gBAEL75B,KAAKs3B,oBAAoBt3B,MAEzBA,KAAKm9B,+BAELn9B,KAAK+6B,kBAKL/6B,KAAKy3B,oBAEDt4B,OAAO+E,mBACTuoB,SAASoJ,UAAU6I,YAAY1+B,KAAKo5B,kBAAmBvwB,EAAM41B,GAG3Dz+B,KAAKkH,UAAUy3B,kBACjB3+B,KAAKkH,UAAUy3B,iBAAiB3+B,OAMpCg+B,mBAAoB,WAClB,GAAIY,GAAS5+B,KAAK2Q,aAAa,cAC3BiuB,KACFz/B,OAAOy/B,GAAU5+B,KAAK6+B,OAK1BX,sBAAuB,SAASY,GAC9B,GAAI53B,GAAYlH,KAAK++B,kBAAkBD,EACvC,KAAK53B,EAAW,CAEd,GAAIA,GAAYkjB,YAAYE,mBAAmBwU,EAE/C53B,GAAYlH,KAAKg/B,cAAc93B,GAE/B+3B,EAAcH,GAAU53B,EAE1B,MAAOA,IAGT63B,kBAAmB,SAASl2B,GAC1B,MAAOo2B,GAAcp2B,IAIvBm2B,cAAe,SAAS93B,GACtB,GAAIA,EAAU4rB,YACZ,MAAO5rB,EAET,IAAIg4B,GAAWx5B,OAAOC,OAAOuB,EAkB7B,OAfAgiB,GAAIkD,QAAQlD,EAAIiD,SAAU+S,GAa1Bl/B,KAAKm/B,YAAYD,EAAUh4B,EAAWgiB,EAAIiD,SAASsF,IAAK,QAEjDyN,GAGTC,YAAa,SAASD,EAAUh4B,EAAWgiB,EAAKrgB,GAC9C,GAAI+hB,GAAS,SAASvO,GACpB,MAAOnV,GAAU2B,GAAM2c,MAAMxlB,KAAMqc,GAErC6iB,GAASr2B,GAAQ,WAEf,MADA7I,MAAKmyB,WAAavH,EACX1B,EAAIrgB,GAAM2c,MAAMxlB,KAAMsc,aAKjC2gB,cAAe,SAASp0B,EAAM3B,EAAW6rB,GAEvC,GAAIjqB,GAAS5B,EAAU2B,MAEvB3B,GAAU2B,GAAQ7I,KAAKw+B,YAAY11B,EAAQiqB,EAAKlqB,KAIlDguB,kBAAmB,SAAShuB,EAAM41B,GAChC,GAAIW,IACFl4B,UAAWlH,KAAKkH,WAGdm4B,EAAgBr/B,KAAKs/B,kBAAkBb,EACvCY,KACFD,EAAK7B,QAAU8B,GAGjBjV,YAAYlhB,SAASL,EAAM7I,KAAKkH,WAEhClH,KAAK6+B,KAAO19B,SAASo+B,gBAAgB12B,EAAMu2B,IAG7CE,kBAAmB,SAASz2B,GAC1B,GAAIA,GAAQA,EAAKvB,QAAQ,KAAO,EAC9B,MAAOuB,EAEP,IAAI7C,GAAIhG,KAAK++B,kBAAkBl2B,EAC/B,OAAI7C,GAAEzF,QACGP,KAAKs/B,kBAAkBt5B,EAAEzF,QAAQg9B,SAD1C,SASF0B,IAIF/3B,GAAUs3B,YADR94B,OAAOwlB,UACe,SAASpI,EAAQ0c,GAIvC,MAHI1c,IAAU0c,GAAa1c,IAAW0c,IACpC1c,EAAOoI,UAAYsU,GAEd1c,GAGe,SAASA,EAAQ0c,GACvC,GAAI1c,GAAU0c,GAAa1c,IAAW0c,EAAW,CAC/C,GAAIjB,GAAU74B,OAAOC,OAAO65B,EAC5B1c,GAASmG,EAAOsV,EAASzb,GAE3B,MAAOA,IAoBXoG,EAAIgD,YAAYhlB,UAAYA,GAE3B6hB,SClPH,SAAU1pB,GAoIR,QAASogC,GAAgBl/B,GACvB,MAAOY,UAASa,SAASzB,GAAWm/B,EAAYC,EAGlD,QAASC,KACP,MAAOD,GAAY75B,OAAS65B,EAAY,GAAKD,EAAU,GASzD,QAASG,GAAiBj4B,GACxBk4B,EAAMC,aAAc,EACpBC,eAAe/M,OAAQ,EACvBgN,YAAYC,iBAAiB,WAC3BJ,EAAMK,iBAAiBv4B,GACvBk4B,EAAMC,aAAc,EACpBD,EAAMM,UAjIV,GAAIN,IAEFrW,KAAM,SAASlpB,EAAS6/B,EAAOxW,GAC7B,GAAIyW,GAAuC,KAA1BrgC,KAAKsH,QAAQ/G,IACM,KAAhC+/B,EAAWh5B,QAAQ/G,EAMvB,OALI8/B,KACFrgC,KAAK0L,IAAInL,GACTA,EAAQggC,QAAUH,EAClB7/B,EAAQigC,KAAO5W,GAEiB,IAA1B5pB,KAAKsH,QAAQ/G,IAEvBmL,IAAK,SAASnL,GAEZk/B,EAAgBl/B,GAASE,KAAKF,IAEhC+G,QAAS,SAAS/G,GAChB,GAAIiC,GAAIi9B,EAAgBl/B,GAAS+G,QAAQ/G,EAKzC,OAJIiC,IAAK,GAAKrB,SAASa,SAASzB,KAC9BiC,GAAMy9B,YAAYQ,WAAaR,YAAYhN,MACzC0M,EAAY75B,OAAS,KAElBtD,GAGTonB,GAAI,SAASrpB,GACX,GAAImgC,GAAU1gC,KAAK2L,OAAOpL,EACtBmgC,KACF1gC,KAAK2gC,gBAAgBD,GACrB1gC,KAAKogC,UAGTz0B,OAAQ,SAASpL,GACf,GAAIiC,GAAIxC,KAAKsH,QAAQ/G,EACrB,IAAU,IAANiC,EAIJ,MAAOi9B,GAAgBl/B,GAASqgC,SAElCR,MAAO,WAEL,GAAI7/B,GAAUP,KAAK6gC,aAInB,OAHItgC,IACFA,EAAQggC,QAAQz4B,KAAKvH,GAEnBP,KAAK8gC,YACP9gC,KAAKizB,SACE,GAFT,QAKF4N,YAAa,WACX,MAAOjB,MAETkB,SAAU,WACR,OAAQ9gC,KAAK+/B,aAAe//B,KAAK+gC,WAEnCA,QAAS,WACP,OAAQpB,EAAY75B,SAAW45B,EAAU55B,QAE3C66B,gBAAiB,SAASpgC,GACxB+/B,EAAW7/B,KAAKF,IAElBmsB,MAAO,WAEL,IADA,GAAInsB,GACG+/B,EAAWx6B,QAChBvF,EAAU+/B,EAAWM,QACrBrgC,EAAQigC,KAAK14B,KAAKvH,GAClBA,EAAQggC,QAAUhgC,EAAQigC,KAAO,MAGrCvN,MAAO,WACLjzB,KAAK0sB,QAODsT,eAAe/M,SAAU,IAC3B+M,eAAegB,oBAAoB7/B,UACnC6+B,eAAe/M,OAAQ,GAEzBxG,SAASC,QACTnhB,sBAAsBvL,KAAKihC,sBAE7Bd,iBAAkB,SAASv4B,GACrBA,GACFs5B,EAAezgC,KAAKmH,IAGxBq5B,oBAAqB,WACnB,GAAIC,EAEF,IADA,GAAIl3B,GACGk3B,EAAep7B,SACpBkE,EAAKk3B,EAAeN,YAK1Bb,aAAa,GAGXO,KAEAX,KACAD,KACAwB,IAYJ//B,UAASqJ,iBAAiB,qBAAsB,WAC9Cw1B,eAAe/M,OAAQ,IAczB5zB,EAAMygC,MAAQA,EACdzgC,EAAMwgC,iBAAmBA,GACxB9W,SC/JH,SAAU1pB,GAIR,QAAS8hC,GAAeC,EAAmBx5B,GACrCw5B,GACFjgC,SAAS2C,KAAKa,YAAYy8B,GAC1BvB,EAAiBj4B,IACRA,GACTA,IAIJ,QAASy5B,GAAWC,EAAM15B,GACxB,GAAI05B,GAAQA,EAAKx7B,OAAQ,CAErB,IAAK,GAAwBy7B,GAAK5H,EAD9B6H,EAAOrgC,SAASsgC,yBACXj/B,EAAE,EAAG4G,EAAEk4B,EAAKx7B,OAAsBsD,EAAF5G,IAAS++B,EAAID,EAAK9+B,IAAKA,IAC9Dm3B,EAAOx4B,SAASsD,cAAc,QAC9Bk1B,EAAK+H,IAAM,SACX/H,EAAK5B,KAAOwJ,EACZC,EAAK78B,YAAYg1B,EAEnBwH,GAAeK,EAAM55B,OACdA,IACTA,IAtBJ,GAAIi4B,GAAmBxgC,EAAMwgC,gBA2B7BxgC,GAAMsiC,OAASN,EACfhiC,EAAM8hC,eAAiBA,GAEtBpY,SChCH,SAAU1pB,GAuHR,QAASuiC,GAAa/4B,GACpB,MAAOjJ,SAAQwqB,YAAYE,mBAAmBzhB,IAGhD,QAASg5B,GAAYh5B,GACnB,MAAQA,IAAQA,EAAKvB,QAAQ,MAAQ,EAxHvC,GAAI2hB,GAAS5pB,EAAM4pB,OACfC,EAAM7pB,EAAM6pB,IACZ4W,EAAQzgC,EAAMygC,MACdD,EAAmBxgC,EAAMwgC,iBACzBjJ,EAAyBv3B,EAAMu3B,uBAC/BG,EAAsB13B,EAAM03B,oBAI5B7vB,EAAY+hB,EAAOvjB,OAAOC,OAAOykB,YAAYljB,YAE/CgsB,gBAAiB,WACXlzB,KAAK2Q,aAAa,SACpB3Q,KAAK8hC,QAITA,KAAM,WAEJ9hC,KAAK6I,KAAO7I,KAAK2Q,aAAa,QAC9B3Q,KAAKu9B,QAAUv9B,KAAK2Q,aAAa,WAEjC3Q,KAAK+hC,gBAEL/hC,KAAKk3B,qBAGPA,kBAAmB,WACdl3B,KAAKgiC,YACJhiC,KAAK+2B,oBAAoB/2B,KAAK6I,OAC9B7I,KAAKiiC,mBACLjiC,KAAKkiC,uBAKTpC,EAAMlW,GAAG5pB,OAKXmiC,UAAW,WAILN,EAAY7hC,KAAKu9B,WAAaqE,EAAa5hC,KAAKu9B,UAClD1uB,QAAQC,KAAK,sGACuC9O,KAAK6I,KACrD7I,KAAKu9B,SAEXv9B,KAAKkJ,SAASlJ,KAAK6I,KAAM7I,KAAKu9B,SAC9Bv9B,KAAKgiC,YAAa,GAIpBjL,oBAAqB,SAASluB,GAC5B,MAAK+tB,GAAuB/tB,GAA5B,QAEEkuB,EAAoBluB,EAAM7I,MAE1BA,KAAKoiC,eAAev5B,IAEb,IAIXu5B,eAAgB,SAASv5B,GAEvB,GAAI7I,KAAKuuB,aAAa,cAAgBvuB,KAAKw9B,SAQzC,GAPAx9B,KAAKw9B,UAAW,EAOZr+B,OAAO6gC,iBAAmBA,eAAeS,UAC3C1X,QAAQlgB,OACH,CACL,GAAI6tB,GAASv1B,SAASsD,cAAc,SACpCiyB,GAAOhyB,YAAc,YAAemE,EAAO,MAC3C7I,KAAK2E,YAAY+xB,KAKvBwL,oBAAqB,WACnB,MAAOliC,MAAKqiC,iBAMdJ,gBAAiB,WACf,MAAOnC,GAAMrW,KAAKzpB,KAAMA,KAAKk3B,kBAAmBl3B,KAAKmiC,YAGvDJ,cAAe,WACb/hC,KAAKqiC,iBAAkB,EACvBriC,KAAKk5B,WAAW,WACdl5B,KAAKqiC,iBAAkB,EACvBriC,KAAKk3B,qBACL7zB,KAAKrD,SASXkpB,GAAIkD,QAAQlD,EAAIgD,YAAahlB,GAc7B24B,EAAiB,WACf1+B,SAASmhC,KAAKnT,gBAAgB,cAC9BhuB,SAAS2J,cACP,GAAIiiB,aAAY,iBAAkBxnB,SAAS,OAM/CpE,SAASo+B,gBAAgB,mBAAoBr4B,UAAWA,KAEvD6hB,SC/GH,WAEE,GAAIxoB,GAAUY,SAASsD,cAAc,kBACrClE,GAAQiuB,aAAa,OAAQ,gBAC7BjuB,EAAQiuB,aAAa,UAAW,YAChCjuB,EAAQuhC,OAER/Y,QAAQ,gBAENmK,gBAAiB,WACflzB,KAAK2xB,OAAS3xB,KAAK4xB,gBAAkB5xB,KAAKuiC,aAG1CxZ,QAAQ8W,iBAAiB,WACvB7/B,KAAKgiB,MAAQhiB,KACbA,KAAKwuB,aAAa,OAAQ,IAG1BxuB,KAAKusB,MAAM,WAITvsB,KAAKi1B,sBAAsBj1B,KAAKoB,YAGhCpB,KAAK4sB,KAAK,qBAEZvpB,KAAKrD,QAGTuiC,WAAY,WACV,GAAIv5B,GAAStD,OAAOC,OAAOojB,QAAQG,IAAIgD,YAAYljB,QAC/CsK,EAAOtT,IACXgJ,GAAOsyB,eAAiB,WAAa,MAAOhoB,GAAK0O,MAEjD,IAAI2P,GAAS,GAAInN,oBACbhD,EAAiBmQ,EAAOnQ,cAK5B,OAJAmQ,GAAOnQ,eAAiB,SAAS6C,EAAYxb,EAAMhG,GACjD,MAAOmG,GAAOwyB,oBAAoBnX,EAAYxb,EAAMhG,IAC7C2e,EAAe1Z,KAAK6pB,EAAQtN,EAAYxb,EAAMhG,IAEhD8uB","sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {};\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      if (inRoot) {\n        var t = inRoot.elementFromPoint(x, y);\n        var st, sr, os;\n        // is element a shadow host?\n        sr = this.targetingShadow(t);\n        while (sr) {\n          // find the the element inside the shadow root\n          st = sr.elementFromPoint(x, y);\n          if (!st) {\n            // check for older shadows\n            sr = this.olderShadow(sr);\n          } else {\n            // shadowed element may contain a shadow root\n            var ssr = this.targetingShadow(st);\n            return this.searchRoot(ssr, x, y) || st;\n          }\n        }\n        // light dom element is the target\n        return t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d > 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while(a && b && a !== b) {\n        a = this.walk(a, 1);\n        b = this.walk(b, 1);\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n","/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'body /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    }\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var wrap = window.ShadowDOMPolyfill && ShadowDOMPolyfill.wrapIfNeeded || function(e){ return e; };\n\n  var eventFactory = scope.eventFactory;\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      this.gestures.push(source);\n    },\n    register: function(element) {\n      // NOTE: Work around for #4, don't add listeners to individual Polymer elmenets in SD Polyfill\n      if (window.ShadowDOMPolyfill && element !== document) {\n        return;\n      }\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      events.forEach(function(e) {\n        this.addEvent(target, e);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      events.forEach(function(e) {\n        this.removeEvent(target, e);\n      }, this);\n    },\n    addEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (window.ShadowDOMPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (window.ShadowDOMPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          if (g.events.indexOf(e.type) >= 0) {\n            g[e.type].call(g, e);\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = dispatcher.register.bind(dispatcher);\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = e.target;\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  var HAS_TOUCH_ACTION = typeof document.head.style.touchAction === 'string';\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (HAS_TOUCH_ACTION) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = false;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        return scope.findTarget(touch);\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = this.findTarget(inTouch, id);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t; i < tl.length; i++) {\n        t = tl[i];\n        inFunction.call(this, this.touchToPointer(t));\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = inEvent.currentTarget._scrollType;\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        this.firstXY = null;\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value.out;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(this.cancelOut, this);\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      var p = pointermap.set(inPointer.pointerId, inPointer.target);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        this.processTouches(inEvent, this.move);\n      } else {\n        if (!this.scrolling) {\n          if (this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n            this.touchcancel(inEvent);\n          } else {\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      var pointer = pointermap.get(inPointer.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      if (!this.scrolling) {\n        inPointer.relatedTarget = scope.findTarget(inPointer);\n        dispatcher.up(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    cancel: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.cancel(inPointer);\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!HAS_TOUCH_ACTION) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      if (HAS_BITMAP_TYPE) {\n        e = dispatcher.cloneEvent(inEvent);\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = e.target;\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = e.target;\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      return dispatcher.cloneEvent(inEvent);\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = e.target;\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = e.target;\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (window.navigator.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  dispatcher.register(document);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId\n       });\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class released\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n","/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, property;\n\n        expr = parsePrimaryExpression();\n\n        while (match('.') || match('[')) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (accessor == '[' && !(property instanceof Literal));\n\n    // convert literal computed property access where literal value is a value\n    // path to ident dot-access.\n    if (accessor == '[' &&\n        property instanceof Literal &&\n        Path.get(property.value).valid) {\n      accessor = '.';\n      property = new IdentPath(property.value);\n    }\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        property instanceof IdentPath &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = accessor == '.' ? property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n        var last = this.object instanceof IdentPath ?\n            this.object.name : this.object.fullPath;\n        this.fullPath_ = Path.get(last + '.' + this.property.name);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (this.property instanceof IdentPath) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\n            var propName = property(model, observer);\n            if (observer)\n              observer.addPath(context, propName);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(value, toModelDirection, filterRegistry, model,\n                        observer) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('No ' + (toModelDirection ? 'toModel' : 'toDOM') +\n                      ' found on' + this.name);\n        return;\n      }\n\n      var args = [value];\n      for (var i = 0; i < this.args.length; i++) {\n        args[i + 1] = getFn(this.args[i])(model, observer);\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer) {\n        return unaryOperators[op](argument(model, observer));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer) {\n        return binaryOperators[op](left(model, observer),\n                                   right(model, observer));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer) {\n        return test(model, observer) ?\n            consequent(model, observer) : alternate(model, observer);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] = properties[i].value(model, observer);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(value, false, filterRegistry, model,\n                                          observer);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(newValue, true, filterRegistry,\n                                                 model);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        var scope = Object.create(parentScope);\n        scope[scopeName] = model;\n        scope[indexName] = undefined;\n        scope[parentScopeName] = parentScope;\n        return scope;\n      };\n    }\n  };\n\n  global.PolymerExpressions = PolymerExpressions;\n  if (global.exposeGetExpression)\n    global.getExpression_ = getExpression;\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.3.1-604ba08'\n};\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\n  */\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail || {};\n      var event = new CustomEvent(type, {\n        bubbles: (bubbles !== undefined ? bubbles : true), \n        cancelable: (cancelable !== undefined ? cancelable : true), \n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        this.addEventListener(type, this.element.getEventHandler(this, this,\n                                                                 methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObservers([o]);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without \n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return bindProperties(this, property, observable);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObservers: function(observers) {\n      this._observers = this._observers || [];\n      this._observers.push(observers);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n      for (var i=0, l=this._observers.length; i<l; i++) {\n        this.closeObserverArray(this._observers[i]);\n      }\n      this._observers = [];\n    },\n    closeObserverArray: function(observerArray) {\n      for (var i=0, l=observerArray.length, o; i<l; i++) {\n        o = observerArray[i];\n        if (o && o.close) {\n          o.close();\n        }\n      }\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // property binding\n  // bind a property in A to a path in B by converting A[property] to a\n  // getter/setter pair that accesses B[...path...]\n  function bindProperties(a, property, observable) {\n    // apply Polymer two-way reference binding\n    return Observer.bindToInstance(a, property, observable, resolveBindingValue);\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      this.registerObservers(dom.bindings_);\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      // TODO (sorvell): temporarily open observer when created\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants, \n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being \n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants \n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being \n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);          \n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up polymer gestures\n      PolymerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase') \n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n  \n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (window.ShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      scope._scopeStyles[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      scope._scopeStyles = scope._scopeStyles || {};\n      return scope._scopeStyles[name];\n    }\n  };\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (window.ShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        node.addEventListener(eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            node.removeEventListener(eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    // sync prototype to property descriptors; \n    // desriptor format contains default value and optionally a \n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    // \n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status \n      for (var n in propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor); \n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' && \n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          Observer.createBindablePrototypeAccessor(prototype, n);\n        }\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // do not override explicit entries\n          if (n && publish[n] === undefined && base[n] === undefined) {\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            publish[n] = Polymer.nob;\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && Platform.templateContent(template);\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (window.ShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      var shouldAdd = (this.indexOf(element) === -1 && \n          flushQueue.indexOf(element) === -1);\n      if (shouldAdd) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\n    },\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n    flush: function() {\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__go.call(element);\n        element.__check = element.__go = null;\n      }\n    },\n    ready: function() {\n      this.flush();\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    waitToReady: true\n  };\n\n  var flushQueue = [];\n\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      // TODO(sorvell): ends up calling '_register' by virtue\n      // of `waitingForQueue` (see below)\n      queue.go(this);\n    },\n\n    // TODO(sorvell): refactor, this method is private-ish, but it's being\n    // called by the queue object.\n    _register: function() {\n      //console.log('registering', this.name);\n      //console.group('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n      //console.groupEnd();\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // TODO(sorvell): CustomElements polyfill awareness:\n        // noscript elements should upgrade in logical order\n        // script injection ensures this under native custom elements;\n        // under imports + ce polyfills, scripts run before upgrades.\n        // dependencies should be ready at upgrade time so register\n        // prototype at this time.\n        if (window.CustomElements && !CustomElements.useNative) {\n          Polymer(name);\n        } else {\n          var script = document.createElement('script');\n          script.textContent = 'Polymer(\\'' + name + '\\');';\n          this.appendChild(script);\n        }\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.wait(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n"]}
\ No newline at end of file
+{"version":3,"file":"polymer.js","sources":["../../polymer-gestures/src/scope.js","../../polymer-gestures/src/targetfind.js","../../polymer-gestures/src/touch-action.js","../../polymer-gestures/src/eventFactory.js","../../polymer-gestures/src/pointermap.js","../../polymer-gestures/src/dispatcher.js","../../polymer-gestures/src/installer.js","../../polymer-gestures/src/mouse.js","../../polymer-gestures/src/touch.js","../../polymer-gestures/src/ms.js","../../polymer-gestures/src/pointer.js","../../polymer-gestures/src/platform-events.js","../../polymer-gestures/src/track.js","../../polymer-gestures/src/hold.js","../../polymer-gestures/src/tap.js","../../polymer-expressions/third_party/esprima/esprima.js","../../polymer-expressions/src/polymer-expressions.js","polymer-versioned.js","../src/boot.js","../src/lib/lang.js","../src/lib/job.js","../src/lib/dom.js","../src/lib/super.js","../src/lib/deserialize.js","../src/api.js","../src/instance/utils.js","../src/instance/events.js","../src/instance/attributes.js","../src/instance/properties.js","../src/instance/mdv.js","../src/instance/base.js","../src/instance/styles.js","../src/declaration/polymer.js","../src/declaration/path.js","../src/declaration/styles.js","../src/declaration/events.js","../src/declaration/properties.js","../src/declaration/attributes.js","../src/declaration/mdv.js","../src/declaration/prototype.js","../src/declaration/queue.js","../src/declaration/import.js","../src/declaration/polymer-element.js","../src/lib/auto-binding.js"],"names":["window","PolymerGestures","hasSDPolyfill","Boolean","ShadowDOMPolyfill","wrap","wrapIfNeeded","a","scope","HAS_FULL_PATH","pathTest","document","createElement","createShadowRoot","sr","s","appendChild","addEventListener","ev","path","stopPropagation","CustomEvent","bubbles","head","dispatchEvent","parentNode","removeChild","target","shadow","inEl","shadowRoot","webkitShadowRoot","canTarget","elementFromPoint","targetingShadow","this","olderShadow","os","olderShadowRoot","se","querySelector","allShadows","element","shadows","push","searchRoot","inRoot","x","y","t","owner","nodeType","Node","DOCUMENT_NODE","DOCUMENT_FRAGMENT_NODE","findTarget","inEvent","clientX","clientY","findScrollAxis","n","i","length","_scrollType","currentTarget","host","LCA","b","contains","adepth","depth","bdepth","d","walk","u","deepContains","common","insideNode","node","rect","getBoundingClientRect","left","right","top","bottom","targetFinding","bind","shadowSelector","v","selector","rule","attrib2css","selectors","styles","hasTouchAction","style","touchAction","hasShadowRoot","forEach","r","String","map","el","textContent","MOUSE_PROPS","MOUSE_DEFAULTS","NOP_FACTORY","eventFactory","preventTap","makeBaseEvent","inType","inDict","e","createEvent","initEvent","cancelable","makeGestureEvent","Object","create","k","keys","makePointerEvent","p","buttons","pressure","pointerId","width","height","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","_source","PointerMap","USE_MAP","m","Map","pointers","POINTERS_FN","values","prototype","size","set","inId","indexOf","has","delete","splice","get","clear","callback","thisArg","call","CLONE_PROPS","CLONE_DEFAULTS","HAS_SVG_INSTANCE","SVGElementInstance","dispatcher","pointermap","eventMap","eventSources","eventSourceList","gestures","gestureQueue","registerSource","name","source","newEvents","events","registerGesture","register","es","l","unregister","down","fireEvent","move","type","fillGestureQueue","up","cancel","tapPrevented","eventHandler","_handledByPG","fn","listen","addEvent","unlisten","removeEvent","eventName","addEventListener_","boundHandler","removeEventListener_","removeEventListener","makeEvent","preventDefault","_target","cloneEvent","eventCopy","correspondingUseElement","clone","gestureTrigger","g","j","requestAnimationFrame","boundGestureTrigger","root","Installer","add","remove","changed","binder","addCallback","removeCallback","changedCallback","MO","observer","mutationWatcher","Array","toArray","slice","filter","MutationObserver","WebKitMutationObserver","SELECTOR","OBSERVER_INIT","subtree","childList","attributes","attributeOldValue","attributeFilter","watchSubtree","observe","enableOnSubtree","readyState","installOnLoad","installNewSubtree","findElements","addElement","querySelectorAll","removeElement","elementChanged","oldValue","concatLists","accum","list","concat","isElement","ELEMENT_NODE","flattenMutationTree","inNodes","tree","reduce","mutations","mutationHandler","added","addedNodes","removed","removedNodes","console","warn","DEDUP_DIST","WHICH_TO_BUTTONS","HAS_BUTTONS","MouseEvent","mouseEvents","POINTER_ID","POINTER_TYPE","lastTouches","isEventSimulatedFromTouch","lts","dx","Math","abs","dy","prepareEvent","which","mousedown","mouseup","mousemove","relatedTarget","cleanupMouse","INSTALLER","DEDUP_TIMEOUT","CLICK_COUNT_TIMEOUT","HYSTERESIS","ATTRIB","CAN_USE_GLOBAL","touchEvents","elementAdded","getAttribute","st","touchActionToScrollType","elementRemoved","undefined","oldSt","scrollTypes","EMITTER","XSCROLLER","YSCROLLER","SCROLLER","exec","firstTouch","isPrimaryTouch","inTouch","identifier","setPrimaryTouch","firstXY","X","Y","scrolling","cancelResetClickCount","removePrimaryPointer","inPointer","resetClickCount","clickCount","resetId","setTimeout","clearTimeout","typeToButtons","ret","touch","id","currentTouchEvent","fastPath","touchToPointer","cte","detail","webkitRadiusX","radiusX","webkitRadiusY","radiusY","webkitForce","force","self","processTouches","inFunction","tl","changedTouches","_cancel","cleanUpPointer","shouldScroll","scrollAxis","oa","da","doa","findTouch","inTL","vacuumTouches","touches","value","key","touchstart","dedupSynthMouse","touchmove","dd","sqrt","touchcancel","touchend","lt","HAS_BITMAP_TYPE","MSPointerEvent","MSPOINTER_TYPE_MOUSE","msEvents","POINTER_TYPES","cleanup","MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel","pointerEvents","pointerdown","pointermove","pointerup","pointercancel","PointerEvent","navigator","msPointerEnabled","ontouchstart","track","WIGGLE_THRESHOLD","clampDir","inDelta","calcPositionDelta","inA","inB","pageX","pageY","fireTrack","inTrackingData","downEvent","lastMoveEvent","xDirection","yDirection","ddx","ddy","screenX","screenY","trackInfo","downTarget","tracking","hold","HOLD_DELAY","heldPointer","holdJob","pulse","Date","now","timeStamp","held","fireHold","clearInterval","setInterval","inHoldTime","holdTime","tap","shouldTap","downState","start","altKey","ctrlKey","metaKey","shiftKey","global","assert","condition","message","Error","isDecimalDigit","ch","isWhiteSpace","fromCharCode","isLineTerminator","isIdentifierStart","isIdentifierPart","isKeyword","skipWhitespace","index","charCodeAt","getIdentifier","scanIdentifier","Token","Identifier","Keyword","NullLiteral","BooleanLiteral","range","scanPunctuator","code2","ch2","code","ch1","Punctuator","throwError","Messages","UnexpectedToken","scanNumericLiteral","number","NumericLiteral","parseFloat","scanStringLiteral","quote","str","octal","StringLiteral","isIdentifierName","token","advance","EOF","lex","lookahead","peek","pos","messageFormat","error","args","arguments","msg","replace","whole","description","throwUnexpected","expect","match","matchKeyword","keyword","parseArrayInitialiser","elements","parseExpression","delegate","createArrayExpression","parseObjectPropertyKey","createLiteral","createIdentifier","parseObjectProperty","createProperty","parseObjectInitialiser","properties","createObjectExpression","parseGroupExpression","expr","parsePrimaryExpression","createThisExpression","parseArguments","parseNonComputedProperty","parseNonComputedMember","parseComputedMember","parseLeftHandSideExpression","property","createMemberExpression","createCallExpression","parseUnaryExpression","parsePostfixExpression","createUnaryExpression","binaryPrecedence","prec","parseBinaryExpression","stack","operator","pop","createBinaryExpression","parseConditionalExpression","consequent","alternate","createConditionalExpression","parseFilter","createFilter","parseFilters","parseTopLevel","Syntax","parseInExpression","parseAsExpression","createTopLevel","createAsExpression","indexName","createInExpression","parse","inDelegate","state","labelSet","TokenName","ArrayExpression","BinaryExpression","CallExpression","ConditionalExpression","EmptyStatement","ExpressionStatement","Literal","LabeledStatement","LogicalExpression","MemberExpression","ObjectExpression","Program","Property","ThisExpression","UnaryExpression","UnknownLabel","Redeclaration","esprima","prepareBinding","expressionText","filterRegistry","expression","getExpression","scopeIdent","tagName","ex","model","oneTime","binding","getBinding","polymerExpressionScopeIdent_","indexIdent","polymerExpressionIndexIdent_","expressionParseCache","ASTDelegate","Expression","valueFn_","IdentPath","Path","object","accessor","computed","dynamicDeps","simplePath","getFn","Filter","notImplemented","arg","valueFn","filters","deps","currentPath","ConstantObservable","value_","convertStylePropertyName","c","toLowerCase","findScope","prop","parentScopeName","hasOwnProperty","isLiteralExpression","pathString","isNaN","Number","PolymerExpressions","addPath","getValueFrom","setValue","newValue","setValueFrom",{"end":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":3539,"pos":3531,"col":8,"line":117,"value":"fullPath","type":"name"},"start":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":3539,"pos":3531,"col":8,"line":117,"value":"fullPath","type":"name"},"name":"fullPath"},"fullPath","fullPath_","parts","context","propName","transform","toModelDirection","initialArgs","toModel","toDOM","apply","unaryOperators","+","-","!","binaryOperators","*","/","%","<",">","<=",">=","==","!=","===","!==","&&","||","op","argument","test","ident","arr","kind","obj","open","discardChanges","deliver","close","firstTime","firstValue","startReset","getValue","finishReset","setValueFn","CompoundObserver","ObserverTransform","count","random","toString","styleObject","join","tokenList","tokens","prepareInstancePositionChanged","template","templateInstance","valid","PathObserver","prepareInstanceModel","scopeName","parentScope","createScopeObject","__proto__","defineProperty","configurable","writable","Polymer","version","extend","api","getOwnPropertyNames","pd","getOwnPropertyDescriptor","nom","job","wait","stop","Job","go","inContext","boundComplete","complete","h","handle","cancelAnimationFrame","registry","HTMLElement","tag","getPrototypeForTag","getPrototypeOf","originalStopPropagation","Event","cancelBubble","$super","arrayOfArgs","caller","_super","nameInThis","memoizeSuper","n$","method","proto","nextSuper","super","deserializeValue","currentValue","inferredType","typeHandlers","string","date","boolean","parseInt","JSON","function","declaration","instance","publish","apis","utils","async","timeout","Platform","flush","cancelAsync","fire","onNode","event","asyncFire","classFollows","anew","old","className","classList","injectBoundHTML","html","innerHTML","fragment","instanceTemplate","nop","nob","asyncMethod","log","logFlags","EVENT_PREFIX","addHostListeners","eventDelegates","localName","methodName","getEventHandler","dispatchMethod","group","groupEnd","copyInstanceAttributes","a$","_instanceAttributes","hasAttribute","setAttribute","takeAttributes","_publishLC","attributeToProperty","propertyForAttribute","search","bindPattern","stringValue","serializeValue","reflectPropertyToAttribute","serializedValue","removeAttribute","areSameValue","numberIsNaN","resolveBindingValue","updateRecord","createPropertyObserver","_observeNames","o","_propertyObserver","registerObserver","observeArrayValue","openPropertyObserver","notifyPropertyChanges","newValues","oldValues","paths","called","ov","nv","invokeMethod","deliverChanges","propertyChanged_","reflect","callbackName","isArray","closeNamedObserver","ArrayObserver","registerNamedObserver","emitPropertyChangeRecord","Observer","hasObjectObserve","notifier","notifier_","getNotifier","notify","bindToAccessor","observable","resolveFn","privateName","privateObservable","resolvedValue","createComputedProperties","_computedNames","syntax","bindProperty","_observers","closeObservers","observers","o$","_namedObservers","closeNamedObservers","mdv","bindingDelegate","dom","createInstance","bindings_","enableBindingsReflection","path_","_recordBinding","mixinSuper","bindFinished","makeElementReady","asyncUnbindAll","_unbound","unbind","_unbindAllJob","unbindAll","cancelUnbindAll","mustachePattern","isBase","PolymerBase","base","created","ready","createdCallback","prepareElement","ownerDocument","isStagingDocument","_elementPrepared","shadowRoots","_readied","parseDeclarations","attachedCallback","attached","enteredView","hasBeenAttached","domReady","detachedCallback","preventDispose","detached","leftView","enteredViewCallback","leftViewCallback","enteredDocumentCallback","leftDocumentCallback","parseDeclaration","elementElement","fetchTemplate","shadowFromTemplate","shadowRootReady","lightFromTemplate","refNode","eventController","insertBefore","marshalNodeReferences","$","attributeChangedCallback","attributeChanged","onMutation","listener","disconnect","constructor","Base","shimCssText","cssText","is","ShadowCSS","makeScopeSelector","STYLE_SCOPE_ATTRIBUTE","STYLE_CONTROLLER_SCOPE","installControllerStyles","findStyleScope","scopeHasNamedStyle","cssTextForScope","installScopeCssText","installScopeStyle","cssTextToScopeStyle","applyStyleToScope","_scopeStyles","script","_currentScript","getRegisteredPrototype","registerPrototype","notifyPrototype","waitingForPrototype","client","waitPrototype","registerWhenReady","prototypesByName","declarations","deliverDeclarations","resolveElementPaths","urlResolver","resolveDom","addResolvePathApi","assetPath","URL","baseURI","resolvePath","urlPath","href","importRuleForSheet","sheet","baseUrl","createStyleElement","attr","firstElementChild","s$","nextElementSibling","cssTextFromSheet","__resource","matchesSelector","inSelector","matches","STYLE_SELECTOR","STYLE_LOADABLE_MATCH","SHEET_SELECTOR","STYLE_GLOBAL_SCOPE","SCOPE_ATTR","loadStyles","content","templateContent","convertSheetsToStyles","findLoadableStyles","templateUrl","styleResolver","copySheetAttributes","replaceChild","link","loadables","installSheets","cacheSheets","cacheStyles","installLocalSheets","installGlobalStyles","sheets","findNodes","firstChild","matcher","nodes","array","templateNodes","styleForScope","scopeDescriptor","webkitMatchesSelector","mozMatchesSelector","mixedCaseEventTypes","parseHostEvents","delegates","addAttributeDelegates","hasEventPrefix","removeEventPrefix","trim","prefixLength","findController","controller","prepareEventBinding","eventType","bindingValue","handler","inferObservers","explodeObservers","exploded","ni","names","split","optimizePropertyMaps","_publishNames","publishProperties","requireProperties","lowerCaseMap","propertyDescriptors","propertyDescriptor","reflects","reflectHintForDescriptor","valueForDescriptor","createPropertyAccessor","createPropertyAccessors","ATTRIBUTES_ATTRIBUTE","ATTRIBUTES_REGEX","inheritAttributesObjects","inheritObject","publishAttributes","hasValue","accumulateInstanceAttributes","clonable","isInstanceAttribute","blackList","extends","noscript","assetpath","cache-csstext","installBindingDelegate","ensurePrototypeTraversal","ancestor","extendeeName","buildPrototype","publishConstructor","extension","generateBasePrototype","desugarBeforeChaining","chainPrototypes","desugarAfterChaining","inheritMetaData","chained","chainObject","extendee","shimStyling","registerCallback","symbol","ctor","extnds","findBasePrototype","ensureBaseApi","memoizedBases","extended","mixinMethod","info","typeExtension","findTypeExtension","registerElement","inherited","queueForElement","mainQueue","importQueue","nextQueued","whenPolymerReady","queue","waitToReady","CustomElements","HTMLImports","whenImportsReady","addReadyCallback","check","shouldAdd","flushQueue","__check","__go","useNative","readied","addToFlushQueue","shift","nextElement","canReady","isEmpty","upgradeDocumentTree","flushReadyCallbacks","readyCallbacks","importElements","elementOrFragment","importUrls","urls","url","frag","createDocumentFragment","rel","import","isRegistered","isCustomTag","init","loadResources","registered","waitingForQueue","waitingForResources","_register","handleNoScript","_needsResources","body","makeSyntax"],"mappings":";;;;;;;;;;AASAA,OAAOC,iBACLC,cAAeC,QAAQH,OAAOI,oBAEhCH,gBAAgBI,KAAOJ,gBAAgBC,cAAgBE,kBAAkBE,aAAe,SAASC,GAAI,MAAOA,ICH5G,SAAUC,GACR,GAAIC,IAAgB,EAGhBC,EAAWC,SAASC,cAAc,OACtC,KAAKJ,EAAMN,eAAiBQ,EAASG,iBAAkB,CACrD,GAAIC,GAAKJ,EAASG,mBACdE,EAAIJ,SAASC,cAAc,OAC/BE,GAAGE,YAAYD,GACfL,EAASO,iBAAiB,WAAY,SAASC,GACzCA,EAAGC,OAELV,EAAgBS,EAAGC,KAAK,KAAOJ,GAEjCG,EAAGE,mBAEL,IAAIF,GAAK,GAAIG,aAAY,YAAaC,SAAS,GAE/CX,UAASY,KAAKP,YAAYN,GAC1BK,EAAES,cAAcN,GAChBR,EAASe,WAAWC,YAAYhB,GAChCI,EAAKC,EAAI,KAEXL,EAAW,IAEX,IAAIiB,IACFC,OAAQ,SAASC,GACf,MAAIA,GACKA,EAAKC,YAAcD,EAAKE,iBADjC,QAIFC,UAAW,SAASJ,GAClB,MAAOA,IAAUzB,QAAQyB,EAAOK,mBAElCC,gBAAiB,SAASL,GACxB,GAAId,GAAIoB,KAAKP,OAAOC,EACpB,OAAIM,MAAKH,UAAUjB,GACVA,EADT,QAIFqB,YAAa,SAASR,GACpB,GAAIS,GAAKT,EAAOU,eAChB,KAAKD,EAAI,CACP,GAAIE,GAAKX,EAAOY,cAAc,SAC1BD,KACFF,EAAKE,EAAGD,iBAGZ,MAAOD,IAETI,WAAY,SAASC,GAEnB,IADA,GAAIC,MAAc5B,EAAIoB,KAAKP,OAAOc,GAC5B3B,GACJ4B,EAAQC,KAAK7B,GACbA,EAAIoB,KAAKC,YAAYrB,EAEvB,OAAO4B,IAETE,WAAY,SAASC,EAAQC,EAAGC,GAC9B,GAAIC,GAAOnC,CACX,OAAIgC,IACFG,EAAIH,EAAOb,iBAAiBc,EAAGC,GAC3BC,EAEFnC,EAAKqB,KAAKD,gBAAgBe,GACjBH,IAAWnC,WAEpBG,EAAKqB,KAAKC,YAAYU,IAGjBX,KAAKU,WAAW/B,EAAIiC,EAAGC,IAAMC,GAVtC,QAaFC,MAAO,SAASR,GACd,IAAKA,EACH,MAAO/B,SAIT,KAFA,GAAII,GAAI2B,EAED3B,EAAEU,YACPV,EAAIA,EAAEU,UAMR,OAHIV,GAAEoC,UAAYC,KAAKC,eAAiBtC,EAAEoC,UAAYC,KAAKE,yBACzDvC,EAAIJ,UAECI,GAETwC,WAAY,SAASC,GACnB,GAAI/C,GAAiB+C,EAAQrC,KAC3B,MAAOqC,GAAQrC,KAAK,EAEtB,IAAI4B,GAAIS,EAAQC,QAAST,EAAIQ,EAAQE,QAEjC3C,EAAIoB,KAAKe,MAAMM,EAAQ7B,OAK3B,OAHKZ,GAAEkB,iBAAiBc,EAAGC,KACzBjC,EAAIJ,UAECwB,KAAKU,WAAW9B,EAAGgC,EAAGC,IAE/BW,eAAgB,SAASH,GACvB,GAAII,EACJ,IAAInD,GAAiB+C,EAAQrC,MAE3B,IAAK,GADDA,GAAOqC,EAAQrC,KACV0C,EAAI,EAAGA,EAAI1C,EAAK2C,OAAQD,IAE/B,GADAD,EAAIzC,EAAK0C,GACLD,EAAEG,YACJ,MAAOH,GAAEG,gBAKb,KADAH,EAAIpD,EAAMH,KAAKmD,EAAQQ,eACjBJ,GAAG,CACP,GAAIA,EAAEG,YACJ,MAAOH,GAAEG,WAEXH,GAAIA,EAAEnC,YAAcmC,EAAEK,OAI5BC,IAAK,SAAS3D,EAAG4D,GACf,GAAI5D,IAAM4D,EACR,MAAO5D,EAET,IAAIA,IAAM4D,EACR,MAAO5D,EAET,IAAI4D,IAAM5D,EACR,MAAO4D,EAET,KAAKA,IAAM5D,EACT,MAAOI,SAGT,IAAIJ,EAAE6D,UAAY7D,EAAE6D,SAASD,GAC3B,MAAO5D,EAET,IAAI4D,EAAEC,UAAYD,EAAEC,SAAS7D,GAC3B,MAAO4D,EAET,IAAIE,GAASlC,KAAKmC,MAAM/D,GACpBgE,EAASpC,KAAKmC,MAAMH,GACpBK,EAAIH,EAASE,CAMjB,KALIC,GAAK,EACPjE,EAAI4B,KAAKsC,KAAKlE,EAAGiE,GAEjBL,EAAIhC,KAAKsC,KAAKN,GAAIK,GAEbjE,GAAK4D,GAAK5D,IAAM4D,GACrB5D,EAAIA,EAAEkB,YAAclB,EAAE0D,KACtBE,EAAIA,EAAE1C,YAAc0C,EAAEF,IAExB,OAAO1D,IAETkE,KAAM,SAASb,EAAGc,GAChB,IAAK,GAAIb,GAAI,EAAGD,GAAUc,EAAJb,EAAQA,IAC5BD,EAAIA,EAAEnC,YAAcmC,EAAEK,IAExB,OAAOL,IAETU,MAAO,SAASV,GAEd,IADA,GAAIY,GAAI,EACFZ,GACJY,IACAZ,EAAIA,EAAEnC,YAAcmC,EAAEK,IAExB,OAAOO,IAETG,aAAc,SAASpE,EAAG4D,GACxB,GAAIS,GAASzC,KAAK+B,IAAI3D,EAAG4D,EAEzB,OAAOS,KAAWrE,GAEpBsE,WAAY,SAASC,EAAM/B,EAAGC,GAC5B,GAAI+B,GAAOD,EAAKE,uBAChB,OAAQD,GAAKE,MAAQlC,GAAOA,GAAKgC,EAAKG,OAAWH,EAAKI,KAAOnC,GAAOA,GAAK+B,EAAKK,QAGlF5E,GAAM6E,cAAgB1D,EAOtBnB,EAAM+C,WAAa5B,EAAO4B,WAAW+B,KAAK3D,GAS1CnB,EAAMmE,aAAehD,EAAOgD,aAAaW,KAAK3D,GAqB9CnB,EAAMqE,WAAalD,EAAOkD,YAEzB7E,OAAOC,iBCzNV,WACE,QAASsF,GAAeC,GACtB,MAAO,eAAiBC,EAASD,GAEnC,QAASC,GAASD,GAChB,MAAO,kBAAoBA,EAAI,KAEjC,QAASE,GAAKF,GACZ,MAAO,uBAAyBA,EAAI,mBAAqBA,EAAI,KAE/D,GAAIG,IACF,OACA,OACA,QACA,SAEED,KAAM,cACNE,WACE,cACA,gBAGJ,gBAEEC,EAAS,GAGTC,GADOnF,SAASY,KAC4C,gBAApCZ,UAASY,KAAKwE,MAAMC,aAE5CC,GAAiBjG,OAAOI,mBAAqBO,SAASY,KAAKV,gBAE/D,IAAIiF,EAAgB,CAClBH,EAAWO,QAAQ,SAASC,GACtBC,OAAOD,KAAOA,GAChBN,GAAUJ,EAASU,GAAKT,EAAKS,GAAK,KAC9BF,IACFJ,GAAUN,EAAeY,GAAKT,EAAKS,GAAK,QAG1CN,GAAUM,EAAEP,UAAUS,IAAIZ,GAAYC,EAAKS,EAAET,MAAQ,KACjDO,IACFJ,GAAUM,EAAEP,UAAUS,IAAId,GAAkBG,EAAKS,EAAET,MAAQ,QAKjE,IAAIY,GAAK3F,SAASC,cAAc,QAChC0F,GAAGC,YAAcV,EACjBlF,SAASY,KAAKP,YAAYsF,OCnC9B,SAAU9F,GAER,GAAIgG,IACF,UACA,aACA,OACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,UACA,SACA,gBACA,QACA,SAGEC,IACF,GACA,EACA,KACA,KACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,KACA,EACA,GAGEC,EAAc,WAAY,MAAO,eAEjCC,GAEFC,WAAYF,EACZG,cAAe,SAASC,EAAQC,GAC9B,GAAIC,GAAIrG,SAASsG,YAAY,QAG7B,OAFAD,GAAEE,UAAUJ,EAAQC,EAAOzF,UAAW,EAAOyF,EAAOI,aAAc,GAClEH,EAAEJ,WAAaD,EAAaC,WAAWI,GAChCA,GAETI,iBAAkB,SAASN,EAAQC,GACjCA,EAASA,GAAUM,OAAOC,OAAO,KAGjC,KAAK,GAAuCC,GADxCP,EAAI7E,KAAK0E,cAAcC,EAAQC,GAC1BlD,EAAI,EAAG2D,EAAOH,OAAOG,KAAKT,GAAYlD,EAAI2D,EAAK1D,OAAQD,IAC9D0D,EAAIC,EAAK3D,GACTmD,EAAEO,GAAKR,EAAOQ,EAEhB,OAAOP,IAETS,iBAAkB,SAASX,EAAQC,GACjCA,EAASA,GAAUM,OAAOC,OAAO,KAIjC,KAAI,GAAWI,GAFXV,EAAI7E,KAAK0E,cAAcC,EAAQC,GAE3BlD,EAAI,EAAMA,EAAI2C,EAAY1C,OAAQD,IACxC6D,EAAIlB,EAAY3C,GAChBmD,EAAEU,GAAKX,EAAOW,IAAMjB,EAAe5C,EAErCmD,GAAEW,QAAUZ,EAAOY,SAAW,CAI9B,IAAIC,GAAW,CAsBf,OApBEA,GADEb,EAAOa,SACEb,EAAOa,SAEPZ,EAAEW,QAAU,GAAM,EAI/BX,EAAEjE,EAAIiE,EAAEvD,QACRuD,EAAEhE,EAAIgE,EAAEtD,QAGRsD,EAAEa,UAAYd,EAAOc,WAAa,EAClCb,EAAEc,MAAQf,EAAOe,OAAS,EAC1Bd,EAAEe,OAAShB,EAAOgB,QAAU,EAC5Bf,EAAEY,SAAWA,EACbZ,EAAEgB,MAAQjB,EAAOiB,OAAS,EAC1BhB,EAAEiB,MAAQlB,EAAOkB,OAAS,EAC1BjB,EAAEkB,YAAcnB,EAAOmB,aAAe,GACtClB,EAAEmB,YAAcpB,EAAOoB,aAAe,EACtCnB,EAAEoB,UAAYrB,EAAOqB,YAAa,EAClCpB,EAAEqB,QAAUtB,EAAOsB,SAAW,GACvBrB,GAIXxG,GAAMmG,aAAeA,GACpB3G,OAAOC,iBChHV,SAAUO,GAGR,QAAS8H,KACP,GAAIC,EAAS,CACX,GAAIC,GAAI,GAAIC,IAEZ,OADAD,GAAEE,SAAWC,EACNH,EAEPrG,KAAKqF,QACLrF,KAAKyG,UATT,GAAIL,GAAUvI,OAAOyI,KAAOzI,OAAOyI,IAAII,UAAU3C,QAC7CyC,EAAc,WAAY,MAAOxG,MAAK2G,KAY1CR,GAAWO,WACTE,IAAK,SAASC,EAAMxF,GAClB,GAAIK,GAAI1B,KAAKqF,KAAKyB,QAAQD,EACtBnF,GAAI,GACN1B,KAAKyG,OAAO/E,GAAKL,GAEjBrB,KAAKqF,KAAK5E,KAAKoG,GACf7G,KAAKyG,OAAOhG,KAAKY,KAGrB0F,IAAK,SAASF,GACZ,MAAO7G,MAAKqF,KAAKyB,QAAQD,GAAQ,IAEnCG,SAAU,SAASH,GACjB,GAAInF,GAAI1B,KAAKqF,KAAKyB,QAAQD,EACtBnF,GAAI,KACN1B,KAAKqF,KAAK4B,OAAOvF,EAAG,GACpB1B,KAAKyG,OAAOQ,OAAOvF,EAAG,KAG1BwF,IAAK,SAASL,GACZ,GAAInF,GAAI1B,KAAKqF,KAAKyB,QAAQD,EAC1B,OAAO7G,MAAKyG,OAAO/E,IAErByF,MAAO,WACLnH,KAAKqF,KAAK1D,OAAS,EACnB3B,KAAKyG,OAAO9E,OAAS,GAGvBoC,QAAS,SAASqD,EAAUC,GAC1BrH,KAAKyG,OAAO1C,QAAQ,SAASV,EAAG3B,GAC9B0F,EAASE,KAAKD,EAAShE,EAAGrD,KAAKqF,KAAK3D,GAAI1B,OACvCA,OAELuG,SAAU,WACR,MAAOvG,MAAKqF,KAAK1D,SAIrBtD,EAAM8H,WAAaA,GAClBtI,OAAOC,iBCzDV,SAAUO,GACR,GAAIkJ,IAEF,UACA,aACA,OACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,UACA,SACA,gBAEA,UAEA,YACA,QACA,SACA,WACA,QACA,QACA,cACA,cACA,YAEA,OACA,SACA,gBACA,QACA,QACA,QACA,YAEA,aACA,eACA,WAGEC,IAEF,GACA,EACA,KACA,KACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,KAEA,EAEA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,EAEA,GACA,KACA,KACA,EACA,EACA,EACA,EACA,cACA,GAGEC,EAAkD,mBAAvBC,oBAE3BlD,EAAenG,EAAMmG,aAErBzG,EAAgBM,EAAMN,cACtBG,EAAOG,EAAMH,KAcbyJ,GACFC,WAAY,GAAIvJ,GAAM8H,WACtB0B,SAAU3C,OAAOC,OAAO,MAGxB2C,aAAc5C,OAAOC,OAAO,MAC5B4C,mBACAC,YACAC,gBASAC,eAAgB,SAASC,EAAMC,GAC7B,GAAIxJ,GAAIwJ,EACJC,EAAYzJ,EAAE0J,MACdD,KACFA,EAAUtE,QAAQ,SAASc,GACrBjG,EAAEiG,KACJ7E,KAAK6H,SAAShD,GAAKjG,EAAEiG,GAAG1B,KAAKvE,KAE9BoB,MACHA,KAAK8H,aAAaK,GAAQvJ,EAC1BoB,KAAK+H,gBAAgBtH,KAAK7B,KAG9B2J,gBAAiB,SAASJ,EAAMC,GAC9BpI,KAAKgI,SAASvH,KAAK2H,IAErBI,SAAU,SAASjI,GAEjB,IAAK,GAAWkI,GADZC,EAAI1I,KAAK+H,gBAAgBpG,OACpBD,EAAI,EAAYgH,EAAJhH,IAAW+G,EAAKzI,KAAK+H,gBAAgBrG,IAAKA,IAE7D+G,EAAGD,SAASlB,KAAKmB,EAAIlI,IAGzBoI,WAAY,SAASpI,GAEnB,IAAK,GAAWkI,GADZC,EAAI1I,KAAK+H,gBAAgBpG,OACpBD,EAAI,EAAYgH,EAAJhH,IAAW+G,EAAKzI,KAAK+H,gBAAgBrG,IAAKA,IAE7D+G,EAAGE,WAAWrB,KAAKmB,EAAIlI,IAI3BqI,KAAM,SAASvH,GACbrB,KAAK6I,UAAU,OAAQxH,IAEzByH,KAAM,SAASzH,GAEbA,EAAQ0H,KAAO,OACf/I,KAAKgJ,iBAAiB3H,IAExB4H,GAAI,SAAS5H,GACXrB,KAAK6I,UAAU,KAAMxH,IAEvB6H,OAAQ,SAAS7H,GACfA,EAAQ8H,cAAe,EACvBnJ,KAAK6I,UAAU,KAAMxH,IAGvB+H,aAAc,SAAS/H,GAIrB,IAAIA,EAAQgI,aAAZ,CAGA,GAAIN,GAAO1H,EAAQ0H,KACfO,EAAKtJ,KAAK6H,UAAY7H,KAAK6H,SAASkB,EACpCO,IACFA,EAAGjI,GAELA,EAAQgI,cAAe,IAGzBE,OAAQ,SAAS/J,EAAQ8I,GACvB,IAAK,GAA8BzD,GAA1BnD,EAAI,EAAGgH,EAAIJ,EAAO3G,OAAgB+G,EAAJhH,IAAWmD,EAAIyD,EAAO5G,IAAKA,IAChE1B,KAAKwJ,SAAShK,EAAQqF,IAI1B4E,SAAU,SAASjK,EAAQ8I,GACzB,IAAK,GAA8BzD,GAA1BnD,EAAI,EAAGgH,EAAIJ,EAAO3G,OAAgB+G,EAAJhH,IAAWmD,EAAIyD,EAAO5G,IAAKA,IAChE1B,KAAK0J,YAAYlK,EAAQqF,IAG7B2E,SAAU,SAAShK,EAAQmK,GAErB5L,EACFyB,EAAOoK,kBAAkBD,EAAW3J,KAAK6J,cAEzCrK,EAAOV,iBAAiB6K,EAAW3J,KAAK6J,eAG5CH,YAAa,SAASlK,EAAQmK,GAExB5L,EACFyB,EAAOsK,qBAAqBH,EAAW3J,KAAK6J,cAE5CrK,EAAOuK,oBAAoBJ,EAAW3J,KAAK6J,eAY/CG,UAAW,SAASrF,EAAQtD,GAC1B,GAAIwD,GAAIL,EAAac,iBAAiBX,EAAQtD,EAI9C,OAHAwD,GAAEoF,eAAiB5I,EAAQ4I,eAC3BpF,EAAEsE,aAAe9H,EAAQ8H,aACzBtE,EAAEqF,QAAUrF,EAAEqF,SAAW7I,EAAQ7B,OAC1BqF,GAGTgE,UAAW,SAASlE,EAAQtD,GAC1B,GAAIwD,GAAI7E,KAAKgK,UAAUrF,EAAQtD,EAC/B,OAAOrB,MAAKX,cAAcwF,IAS5BsF,WAAY,SAAS9I,GAEnB,IAAK,GADgCkE,GAAjC6E,EAAYlF,OAAOC,OAAO,MACrBzD,EAAI,EAAGA,EAAI6F,EAAY5F,OAAQD,IACtC6D,EAAIgC,EAAY7F,GAChB0I,EAAU7E,GAAKlE,EAAQkE,IAAMiC,EAAe9F,IAIlC,WAAN6D,GAAwB,kBAANA,KAChBkC,GAAoB2C,EAAU7E,YAAcmC,sBAC9C0C,EAAU7E,GAAK6E,EAAU7E,GAAG8E,yBAE9BD,EAAU7E,GAAKrH,EAAKkM,EAAU7E,IAKlC,OADA6E,GAAUH,eAAiB5I,EAAQ4I,eAC5BG,GAQT/K,cAAe,SAASgC,GACtB,GAAIP,GAAIO,EAAQ6I,OAChB,IAAIpJ,EAAG,CACLA,EAAEzB,cAAcgC,EAGhB,IAAIiJ,GAAQtK,KAAKmK,WAAW9I,EAC5BiJ,GAAM9K,OAASsB,EACfd,KAAKgJ,iBAAiBsB,KAG1BC,eAAgB,WAEd,IAAK,GAAW1F,GAAPnD,EAAI,EAAMA,EAAI1B,KAAKiI,aAAatG,OAAQD,IAAK,CACpDmD,EAAI7E,KAAKiI,aAAavG,EACtB,KAAK,GAAW8I,GAAGlB,EAAVmB,EAAI,EAAUA,EAAIzK,KAAKgI,SAASrG,OAAQ8I,IAC/CD,EAAIxK,KAAKgI,SAASyC,GAClBnB,EAAKkB,EAAE3F,EAAEkE,MACLO,GACFA,EAAGhC,KAAKkD,EAAG3F,GAIjB7E,KAAKiI,aAAatG,OAAS,GAE7BqH,iBAAkB,SAASjK,GAEpBiB,KAAKiI,aAAatG,QACrB+I,sBAAsB1K,KAAK2K,qBAE7B3K,KAAKiI,aAAaxH,KAAK1B,IAG3B4I,GAAWkC,aAAelC,EAAWyB,aAAajG,KAAKwE,GACvDA,EAAWgD,oBAAsBhD,EAAW4C,eAAepH,KAAKwE,GAChEtJ,EAAMsJ,WAAaA,EACnBtJ,EAAMmK,SAAW,SAASoC,GACxBjD,EAAWa,SAASoC,IAEtBvM,EAAMsK,WAAahB,EAAWgB,WAAWxF,KAAKwE,GAC9CtJ,EAAMH,KAAOA,GACZL,OAAOC,iBCvSV,SAAUO,GAeR,QAASwM,GAAUC,EAAKC,EAAQC,EAASC,GACvCjL,KAAKkL,YAAcJ,EAAI3H,KAAK8H,GAC5BjL,KAAKmL,eAAiBJ,EAAO5H,KAAK8H,GAClCjL,KAAKoL,gBAAkBJ,EAAQ7H,KAAK8H,GAChCI,IACFrL,KAAKsL,SAAW,GAAID,GAAGrL,KAAKuL,gBAAgBpI,KAAKnD,QAnBrD,GAAI+D,GAAUyH,MAAM9E,UAAU3C,QAAQuD,KAAKnE,KAAKqI,MAAM9E,UAAU3C,SAC5DG,EAAMsH,MAAM9E,UAAUxC,IAAIoD,KAAKnE,KAAKqI,MAAM9E,UAAUxC,KACpDuH,EAAUD,MAAM9E,UAAUgF,MAAMpE,KAAKnE,KAAKqI,MAAM9E,UAAUgF,OAC1DC,EAASH,MAAM9E,UAAUiF,OAAOrE,KAAKnE,KAAKqI,MAAM9E,UAAUiF,QAC1DN,EAAKxN,OAAO+N,kBAAoB/N,OAAOgO,uBACvCC,EAAW,iBACXC,GACFC,SAAS,EACTC,WAAW,EACXC,YAAY,EACZC,mBAAmB,EACnBC,iBAAkB,gBAYpBvB,GAAUnE,WACR2F,aAAc,SAAS7M,GAQjBnB,EAAM6E,cAAcrD,UAAUL,IAChCQ,KAAKsL,SAASgB,QAAQ9M,EAAQuM,IAGlCQ,gBAAiB,SAAS/M,GACxBQ,KAAKqM,aAAa7M,GACdA,IAAWhB,UAAoC,aAAxBA,SAASgO,WAClCxM,KAAKyM,gBAELzM,KAAK0M,kBAAkBlN,IAG3BkN,kBAAmB,SAASlN,GAC1BuE,EAAQ/D,KAAK2M,aAAanN,GAASQ,KAAK4M,WAAY5M,OAEtD2M,aAAc,SAASnN,GACrB,MAAIA,GAAOqN,iBACFrN,EAAOqN,iBAAiBf,OAInCgB,cAAe,SAAS3I,GACtBnE,KAAKmL,eAAehH,IAEtByI,WAAY,SAASzI,GACnBnE,KAAKkL,YAAY/G,IAEnB4I,eAAgB,SAAS5I,EAAI6I,GAC3BhN,KAAKoL,gBAAgBjH,EAAI6I,IAE3BC,YAAa,SAASC,EAAOC,GAC3B,MAAOD,GAAME,OAAO3B,EAAQ0B,KAG9BV,cAAe,WACbjO,SAASM,iBAAiB,mBAAoB,WAChB,aAAxBN,SAASgO,YACXxM,KAAK0M,kBAAkBlO,WAEzB2E,KAAKnD,QAETqN,UAAW,SAAS5L,GAClB,MAAOA,GAAET,WAAaC,KAAKqM,cAE7BC,oBAAqB,SAASC,GAE5B,GAAIC,GAAOvJ,EAAIsJ,EAASxN,KAAK2M,aAAc3M,KAI3C,OAFAyN,GAAKhN,KAAKkL,EAAO6B,EAASxN,KAAKqN,YAExBI,EAAKC,OAAO1N,KAAKiN,iBAE1B1B,gBAAiB,SAASoC,GACxBA,EAAU5J,QAAQ/D,KAAK4N,gBAAiB5N,OAE1C4N,gBAAiB,SAASvH,GACxB,GAAe,cAAXA,EAAE0C,KAAsB,CAC1B,GAAI8E,GAAQ7N,KAAKuN,oBAAoBlH,EAAEyH,WACvCD,GAAM9J,QAAQ/D,KAAK4M,WAAY5M,KAC/B,IAAI+N,GAAU/N,KAAKuN,oBAAoBlH,EAAE2H,aACzCD,GAAQhK,QAAQ/D,KAAK8M,cAAe9M,UAChB,eAAXqG,EAAE0C,MACX/I,KAAK+M,eAAe1G,EAAE7G,OAAQ6G,EAAE2G,YAKjC3B,IACHR,EAAUnE,UAAU2F,aAAe,WACjC4B,QAAQC,KAAK,iGAIjB7P,EAAMwM,UAAYA,GACjBhN,OAAOC,iBClHV,SAAWO,GACT,GAAIsJ,GAAatJ,EAAMsJ,WACnBC,EAAaD,EAAWC,WAExBuG,EAAa,GAEbC,GAAoB,EAAG,EAAG,EAAG,GAE7BC,GAAc,CAClB,KACEA,EAA+D,IAAjD,GAAIC,YAAW,QAAS9I,QAAS,IAAIA,QACnD,MAAOX,IAGT,GAAI0J,IACFC,WAAY,EACZC,aAAc,QACdnG,QACE,YACA,YACA,WAEFE,SAAU,SAAShJ,GACbA,IAAWhB,UAGfmJ,EAAW4B,OAAO/J,EAAQQ,KAAKsI,SAEjCK,WAAY,SAASnJ,GACnBmI,EAAW8B,SAASjK,EAAQQ,KAAKsI,SAEnCoG,eAEAC,0BAA2B,SAAStN,GAGlC,IAAK,GAA2BP,GAF5B8N,EAAM5O,KAAK0O,YACX9N,EAAIS,EAAQC,QAAST,EAAIQ,EAAQE,QAC5BG,EAAI,EAAGgH,EAAIkG,EAAIjN,OAAe+G,EAAJhH,IAAUZ,EAAI8N,EAAIlN,IAAKA,IAAK,CAE7D,GAAImN,GAAKC,KAAKC,IAAInO,EAAIE,EAAEF,GAAIoO,EAAKF,KAAKC,IAAIlO,EAAIC,EAAED,EAChD,IAAUsN,GAANU,GAA0BV,GAANa,EACtB,OAAO,IAIbC,aAAc,SAAS5N,GACrB,GAAIwD,GAAI8C,EAAWwC,WAAW9I,EAQ9B,OAPAwD,GAAEa,UAAY1F,KAAKwO,WACnB3J,EAAEoB,WAAY,EACdpB,EAAEkB,YAAc/F,KAAKyO,aACrB5J,EAAEqB,QAAU,QACPmI,IACHxJ,EAAEW,QAAU4I,EAAiBvJ,EAAEqK,QAAU,GAEpCrK,GAETsK,UAAW,SAAS9N,GAClB,IAAKrB,KAAK2O,0BAA0BtN,GAAU,CAC5C,GAAIkE,GAAIqC,EAAWb,IAAI/G,KAAKwO,WAGxBjJ,IACFvF,KAAKoP,QAAQ/N,EAEf,IAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAErF,OAASnB,EAAMH,KAAKG,EAAM+C,WAAWC,IACvCuG,EAAWhB,IAAI5G,KAAKwO,WAAY3J,EAAErF,QAClCmI,EAAWiB,KAAK/D,KAGpBwK,UAAW,SAAShO,GAClB,IAAKrB,KAAK2O,0BAA0BtN,GAAU,CAC5C,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAErF,OAASoI,EAAWV,IAAIlH,KAAKwO,YAC/B7G,EAAWmB,KAAKjE,KAGpBuK,QAAS,SAAS/N,GAChB,IAAKrB,KAAK2O,0BAA0BtN,GAAU,CAC5C,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAEyK,cAAgBjR,EAAMH,KAAKG,EAAM+C,WAAWC,IAC9CwD,EAAErF,OAASoI,EAAWV,IAAIlH,KAAKwO,YAC/B7G,EAAWsB,GAAGpE,GACd7E,KAAKuP,iBAGTA,aAAc,WACZ3H,EAAW,UAAU5H,KAAKwO,aAI9BnQ,GAAMkQ,YAAcA,GACnB1Q,OAAOC,iBC3FV,SAAUO,GACR,GASImR,GATA7H,EAAatJ,EAAMsJ,WACnBrH,EAAajC,EAAM6E,cAAc5C,WAAW6C,KAAK9E,EAAM6E,eACvD0E,EAAaD,EAAWC,WAGxB6H,GAFWjE,MAAM9E,UAAUxC,IAAIoD,KAAKnE,KAAKqI,MAAM9E,UAAUxC,KAEzC,MAChBwL,EAAsB,IACtBC,EAAa,GACbC,EAAS,eAITC,GAAiB,EAGjBC,GACFxH,QACE,aACA,YACA,WACA,eAEFE,SAAU,SAAShJ,GACbqQ,EACFlI,EAAW4B,OAAO/J,EAAQQ,KAAKsI,QAE/BkH,EAAUjD,gBAAgB/M,IAG9BmJ,WAAY,SAASnJ,GACfqQ,GACFlI,EAAW8B,SAASjK,EAAQQ,KAAKsI,SAKrCyH,aAAc,SAAS5L,GACrB,GAAI/F,GAAI+F,EAAG6L,aAAaJ,GACpBK,EAAKjQ,KAAKkQ,wBAAwB9R,EAClC6R,KACF9L,EAAGvC,YAAcqO,EACjBtI,EAAW4B,OAAOpF,EAAInE,KAAKsI,QAE3BhI,EAAW6D,GAAIJ,QAAQ,SAASnF,GAC9BA,EAAEgD,YAAcqO,EAChBtI,EAAW4B,OAAO3K,EAAGoB,KAAKsI,SACzBtI,QAGPmQ,eAAgB,SAAShM,GACvBA,EAAGvC,YAAcwO,OACjBzI,EAAW8B,SAAStF,EAAInE,KAAKsI,QAE7BhI,EAAW6D,GAAIJ,QAAQ,SAASnF,GAC9BA,EAAEgD,YAAcwO,OAChBzI,EAAW8B,SAAS7K,EAAGoB,KAAKsI,SAC3BtI,OAEL+M,eAAgB,SAAS5I,EAAI6I,GAC3B,GAAI5O,GAAI+F,EAAG6L,aAAaJ,GACpBK,EAAKjQ,KAAKkQ,wBAAwB9R,GAClCiS,EAAQrQ,KAAKkQ,wBAAwBlD,EAErCiD,IAAMI,GACRlM,EAAGvC,YAAcqO,EACjB3P,EAAW6D,GAAIJ,QAAQ,SAASnF,GAC9BA,EAAEgD,YAAcqO,GACfjQ,OACMqQ,EACTrQ,KAAKmQ,eAAehM,GACX8L,GACTjQ,KAAK+P,aAAa5L,IAGtBmM,aACEC,QAAS,OACTC,UAAW,QACXC,UAAW,QACXC,SAAU,uDAEZR,wBAAyB,SAASrM,GAChC,GAAI/C,GAAI+C,EACJoM,EAAKjQ,KAAKsQ,WACd,OAAU,SAANxP,EACK,OACEA,IAAMmP,EAAGO,UACX,IACE1P,IAAMmP,EAAGQ,UACX,IACER,EAAGS,SAASC,KAAK7P,GACnB,KADF,QAIT2N,aAAc,QACdmC,WAAY,KACZC,eAAgB,SAASC,GACvB,MAAO9Q,MAAK4Q,aAAeE,EAAQC,YAErCC,gBAAiB,SAASF,IAEM,IAA1BlJ,EAAWrB,YAA+C,IAA1BqB,EAAWrB,YAAoBqB,EAAWb,IAAI,MAChF/G,KAAK4Q,WAAaE,EAAQC,WAC1B/Q,KAAKiR,SAAWC,EAAGJ,EAAQxP,QAAS6P,EAAGL,EAAQvP,SAC/CvB,KAAKoR,UAAY,KACjBpR,KAAKqR,0BAGTC,qBAAsB,SAASC,GACzBA,EAAUtL,YACZjG,KAAK4Q,WAAa,KAClB5Q,KAAKiR,QAAU,KACfjR,KAAKwR,oBAGTC,WAAY,EACZC,QAAS,KACTF,gBAAiB,WACf,GAAIlI,GAAK,WACPtJ,KAAKyR,WAAa,EAClBzR,KAAK0R,QAAU,MACfvO,KAAKnD,KACPA,MAAK0R,QAAUC,WAAWrI,EAAIoG,IAEhC2B,sBAAuB,WACjBrR,KAAK0R,SACPE,aAAa5R,KAAK0R,UAGtBG,cAAe,SAAS9I,GACtB,GAAI+I,GAAM,CAIV,QAHa,eAAT/I,GAAkC,cAATA,KAC3B+I,EAAM,GAEDA,GAET1Q,WAAY,SAAS2Q,EAAOC,GAC1B,GAAoC,eAAhChS,KAAKiS,kBAAkBlJ,KAAuB,CAChD,GAAI/I,KAAK6Q,eAAekB,GAAQ,CAC9B,GAAIG,IACF5Q,QAASyQ,EAAMzQ,QACfC,QAASwQ,EAAMxQ,QACfvC,KAAMgB,KAAKiS,kBAAkBjT,KAC7BQ,OAAQnB,EAAMH,KAAK8B,KAAKiS,kBAAkBzS,QAE5C,OAAOnB,GAAM+C,WAAW8Q,GAExB,MAAO7T,GAAM+C,WAAW2Q,GAI5B,MAAOnK,GAAWV,IAAI8K,IAExBG,eAAgB,SAASrB,GACvB,GAAIsB,GAAMpS,KAAKiS,kBACXpN,EAAI8C,EAAWwC,WAAW2G,GAI1BkB,EAAKnN,EAAEa,UAAYoL,EAAQC,WAAa,CAC5ClM,GAAErF,OAASnB,EAAMH,KAAK8B,KAAKoB,WAAW0P,EAASkB,IAC/CnN,EAAE1F,SAAU,EACZ0F,EAAEG,YAAa,EACfH,EAAEwN,OAASrS,KAAKyR,WAChB5M,EAAEW,QAAUxF,KAAK6R,cAAcO,EAAIrJ,MACnClE,EAAEc,MAAQmL,EAAQwB,eAAiBxB,EAAQyB,SAAW,EACtD1N,EAAEe,OAASkL,EAAQ0B,eAAiB1B,EAAQ2B,SAAW,EACvD5N,EAAEY,SAAWqL,EAAQ4B,aAAe5B,EAAQ6B,OAAS,GACrD9N,EAAEoB,UAAYjG,KAAK6Q,eAAeC,GAClCjM,EAAEkB,YAAc/F,KAAKyO,aACrB5J,EAAEqB,QAAU,OAEZ,IAAI0M,GAAO5S,IAMX,OALA6E,GAAEoF,eAAiB,WACjB2I,EAAKxB,WAAY,EACjBwB,EAAK3B,QAAU,KACfmB,EAAInI,kBAECpF,GAETgO,eAAgB,SAASxR,EAASyR,GAChC,GAAIC,GAAK1R,EAAQ2R,cACjBhT,MAAKiS,kBAAoB5Q,CACzB,KAAK,GAAWP,GAAGyE,EAAV7D,EAAI,EAASA,EAAIqR,EAAGpR,OAAQD,IACnCZ,EAAIiS,EAAGrR,GACP6D,EAAIvF,KAAKmS,eAAerR,GACH,eAAjBO,EAAQ0H,MACVnB,EAAWhB,IAAIrB,EAAEG,UAAWH,EAAE/F,QAE5BoI,EAAWb,IAAIxB,EAAEG,YACnBoN,EAAWxL,KAAKtH,KAAMuF,IAEH,aAAjBlE,EAAQ0H,MAAuB1H,EAAQ4R,UACzCjT,KAAKkT,eAAe3N,IAM1B4N,aAAc,SAAS9R,GACrB,GAAIrB,KAAKiR,QAAS,CAChB,GAAIa,GACAsB,EAAa/U,EAAM6E,cAAc1B,eAAeH,EACpD,IAAmB,SAAf+R,EAEFtB,GAAM,MACD,IAAmB,OAAfsB,EAETtB,GAAM,MACD,CACL,GAAIhR,GAAIO,EAAQ2R,eAAe,GAE3B5U,EAAIgV,EACJC,EAAoB,MAAfD,EAAqB,IAAM,IAChCE,EAAKxE,KAAKC,IAAIjO,EAAE,SAAW1C,GAAK4B,KAAKiR,QAAQ7S,IAC7CmV,EAAMzE,KAAKC,IAAIjO,EAAE,SAAWuS,GAAMrT,KAAKiR,QAAQoC,GAGnDvB,GAAMwB,GAAMC,EAEd,MAAOzB,KAGX0B,UAAW,SAASC,EAAM5M,GACxB,IAAK,GAA4B/F,GAAxBY,EAAI,EAAGgH,EAAI+K,EAAK9R,OAAe+G,EAAJhH,IAAUZ,EAAI2S,EAAK/R,IAAKA,IAC1D,GAAIZ,EAAEiQ,aAAelK,EACnB,OAAO,GAUb6M,cAAe,SAASrS,GACtB,GAAI0R,GAAK1R,EAAQsS,OAGjB,IAAI/L,EAAWrB,YAAcwM,EAAGpR,OAAQ,CACtC,GAAIU,KACJuF,GAAW7D,QAAQ,SAAS6P,EAAOC,GAIjC,GAAY,IAARA,IAAc7T,KAAKwT,UAAUT,EAAIc,EAAM,GAAI,CAC7C,GAAItO,GAAIqO,CACRvR,GAAE5B,KAAK8E,KAERvF,MACHqC,EAAE0B,QAAQ,SAASwB,GACjBvF,KAAKkJ,OAAO3D,GACZqC,EAAWZ,OAAOzB,EAAEG,eAI1BoO,WAAY,SAASzS,GACnBrB,KAAK0T,cAAcrS,GACnBrB,KAAKgR,gBAAgB3P,EAAQ2R,eAAe,IAC5ChT,KAAK+T,gBAAgB1S,GAChBrB,KAAKoR,YACRpR,KAAKyR,aACLzR,KAAK6S,eAAexR,EAASrB,KAAK4I,QAGtCA,KAAM,SAAS2I,GACb5J,EAAWiB,KAAK2I,IAElByC,UAAW,SAAS3S,GAClB,GAAIwO,EACF7P,KAAK6S,eAAexR,EAASrB,KAAK8I,UAElC,IAAK9I,KAAKoR,WAQH,GAAIpR,KAAKiR,QAAS,CACvB,GAAInQ,GAAIO,EAAQ2R,eAAe,GAC3BnE,EAAK/N,EAAEQ,QAAUtB,KAAKiR,QAAQC,EAC9BlC,EAAKlO,EAAES,QAAUvB,KAAKiR,QAAQE,EAC9B8C,EAAKnF,KAAKoF,KAAKrF,EAAKA,EAAKG,EAAKA,EAC9BiF,IAAMtE,IACR3P,KAAKmU,YAAY9S,GACjBrB,KAAKoR,WAAY,EACjBpR,KAAKiR,QAAU,WAfM,QAAnBjR,KAAKoR,WAAsBpR,KAAKmT,aAAa9R,GAC/CrB,KAAKoR,WAAY,GAEjBpR,KAAKoR,WAAY,EACjB/P,EAAQ4I,iBACRjK,KAAK6S,eAAexR,EAASrB,KAAK8I,QAe1CA,KAAM,SAASyI,GACb5J,EAAWmB,KAAKyI,IAElB6C,SAAU,SAAS/S,GACjBrB,KAAK+T,gBAAgB1S,GACrBrB,KAAK6S,eAAexR,EAASrB,KAAKiJ,KAEpCA,GAAI,SAASsI,GACXA,EAAUjC,cAAgBjR,EAAMH,KAAKG,EAAM+C,WAAWmQ,IACtD5J,EAAWsB,GAAGsI,IAEhBrI,OAAQ,SAASqI,GACf5J,EAAWuB,OAAOqI,IAEpB4C,YAAa,SAAS9S,GACpBA,EAAQ4R,SAAU,EAClBjT,KAAK6S,eAAexR,EAASrB,KAAKkJ,SAEpCgK,eAAgB,SAAS3B,GACvB3J,EAAW,UAAU2J,EAAU7L,WAC/B1F,KAAKsR,qBAAqBC,IAG5BwC,gBAAiB,SAAS1S,GACxB,GAAIuN,GAAMvQ,EAAMkQ,YAAYG,YACxB5N,EAAIO,EAAQ2R,eAAe,EAE/B,IAAIhT,KAAK6Q,eAAe/P,GAAI,CAE1B,GAAIuT,IAAMzT,EAAGE,EAAEQ,QAAST,EAAGC,EAAES,QAC7BqN,GAAInO,KAAK4T,EACT,IAAI/K,GAAK,SAAUsF,EAAKyF,GACtB,GAAI3S,GAAIkN,EAAI9H,QAAQuN,EAChB3S,GAAI,IACNkN,EAAI3H,OAAOvF,EAAG,IAEfyB,KAAK,KAAMyL,EAAKyF,EACnB1C,YAAWrI,EAAImG,KAKhBI,KACHL,EAAY,GAAInR,GAAMwM,UAAUiF,EAAYC,aAAcD,EAAYK,eAAgBL,EAAY/C,eAAgB+C,IAGpHzR,EAAMyR,YAAcA,GACnBjS,OAAOC,iBCrVV,SAAUO,GACR,GAAIsJ,GAAatJ,EAAMsJ,WACnBC,EAAaD,EAAWC,WACxB0M,EAAkBzW,OAAO0W,gBAAwE,gBAA/C1W,QAAO0W,eAAeC,qBACxEC,GACFnM,QACE,gBACA,gBACA,cACA,mBAEFE,SAAU,SAAShJ,GACbA,IAAWhB,UAGfmJ,EAAW4B,OAAO/J,EAAQQ,KAAKsI,SAEjCK,WAAY,SAASnJ,GACnBmI,EAAW8B,SAASjK,EAAQQ,KAAKsI,SAEnCoM,eACE,GACA,cACA,QACA,MACA,SAEFzF,aAAc,SAAS5N,GACrB,GAAIwD,GAAIxD,CAMR,OALAwD,GAAI8C,EAAWwC,WAAW9I,GACtBiT,IACFzP,EAAEkB,YAAc/F,KAAK0U,cAAcrT,EAAQ0E,cAE7ClB,EAAEqB,QAAU,KACLrB,GAET8P,QAAS,SAAS3C,GAChBpK,EAAW,UAAUoK,IAEvB4C,cAAe,SAASvT,GACtB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAErF,OAASnB,EAAMH,KAAKG,EAAM+C,WAAWC,IACvCuG,EAAWhB,IAAIvF,EAAQqE,UAAWb,EAAErF,QACpCmI,EAAWiB,KAAK/D,IAElBgQ,cAAe,SAASxT,GACtB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAErF,OAASoI,EAAWV,IAAIrC,EAAEa,WAC5BiC,EAAWmB,KAAKjE,IAElBiQ,YAAa,SAASzT,GACpB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAEyK,cAAgBjR,EAAMH,KAAKG,EAAM+C,WAAWC,IAC9CwD,EAAErF,OAASoI,EAAWV,IAAIrC,EAAEa,WAC5BiC,EAAWsB,GAAGpE,GACd7E,KAAK2U,QAAQtT,EAAQqE,YAEvBqP,gBAAiB,SAAS1T,GACxB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAEyK,cAAgBjR,EAAMH,KAAKG,EAAM+C,WAAWC,IAC9CwD,EAAErF,OAASoI,EAAWV,IAAIrC,EAAEa,WAC5BiC,EAAWuB,OAAOrE,GAClB7E,KAAK2U,QAAQtT,EAAQqE,YAIzBrH,GAAMoW,SAAWA,GAChB5W,OAAOC,iBCnEV,SAAUO,GACR,GAAIsJ,GAAatJ,EAAMsJ,WACnBC,EAAaD,EAAWC,WACxBoN,GACF1M,QACE,cACA,cACA,YACA,iBAEF2G,aAAc,SAAS5N,GACrB,GAAIwD,GAAI8C,EAAWwC,WAAW9I,EAE9B,OADAwD,GAAEqB,QAAU,UACLrB,GAET2D,SAAU,SAAShJ,GACbA,IAAWhB,UAGfmJ,EAAW4B,OAAO/J,EAAQQ,KAAKsI,SAEjCK,WAAY,SAASnJ,GACnBmI,EAAW8B,SAASjK,EAAQQ,KAAKsI,SAEnCqM,QAAS,SAAS3C,GAChBpK,EAAW,UAAUoK,IAEvBiD,YAAa,SAAS5T,GACpB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAErF,OAASnB,EAAMH,KAAKG,EAAM+C,WAAWC,IACvCuG,EAAWhB,IAAI/B,EAAEa,UAAWb,EAAErF,QAC9BmI,EAAWiB,KAAK/D,IAElBqQ,YAAa,SAAS7T,GACpB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAErF,OAASoI,EAAWV,IAAIrC,EAAEa,WAC5BiC,EAAWmB,KAAKjE,IAElBsQ,UAAW,SAAS9T,GAClB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAEyK,cAAgBjR,EAAMH,KAAKG,EAAM+C,WAAWC,IAC9CwD,EAAErF,OAASoI,EAAWV,IAAIrC,EAAEa,WAC5BiC,EAAWsB,GAAGpE,GACd7E,KAAK2U,QAAQtT,EAAQqE,YAEvB0P,cAAe,SAAS/T,GACtB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAEyK,cAAgBjR,EAAMH,KAAKG,EAAM+C,WAAWC,IAC9CwD,EAAErF,OAASoI,EAAWV,IAAIrC,EAAEa,WAC5BiC,EAAWuB,OAAOrE,GAClB7E,KAAK2U,QAAQtT,EAAQqE,YAIzBrH,GAAM2W,cAAgBA,GACrBnX,OAAOC,iBClDV,SAAUO,GACR,GAAIsJ,GAAatJ,EAAMsJ,UAEnB9J,QAAOwX,aACT1N,EAAWO,eAAe,UAAW7J,EAAM2W,eAClCnX,OAAOyX,UAAUC,iBAC1B5N,EAAWO,eAAe,KAAM7J,EAAMoW,WAEtC9M,EAAWO,eAAe,QAAS7J,EAAMkQ,aACb6B,SAAxBvS,OAAO2X,cACT7N,EAAWO,eAAe,QAAS7J,EAAMyR,cAI7CnI,EAAWa,SAAShK,WACnBX,OAAOC,iBC4ET,SAAUO,GACR,GAAIsJ,GAAatJ,EAAMsJ,WACnBnD,EAAenG,EAAMmG,aACrBoD,EAAa,GAAIvJ,GAAM8H,WACvBsP,GACFnN,QACE,OACA,OACA,MAEFoN,iBAAkB,EAClBC,SAAU,SAASC,GACjB,MAAOA,GAAU,EAAI,EAAI,IAE3BC,kBAAmB,SAASC,EAAKC,GAC/B,GAAInV,GAAI,EAAGC,EAAI,CAKf,OAJIiV,IAAOC,IACTnV,EAAImV,EAAIC,MAAQF,EAAIE,MACpBnV,EAAIkV,EAAIE,MAAQH,EAAIG,QAEdrV,EAAGA,EAAGC,EAAGA,IAEnBqV,UAAW,SAASvR,EAAQtD,EAAS8U,GACnC,GAAIrV,GAAIqV,EACJ9T,EAAIrC,KAAK6V,kBAAkB/U,EAAEsV,UAAW/U,GACxC4S,EAAKjU,KAAK6V,kBAAkB/U,EAAEuV,cAAehV,EAC7C4S,GAAGrT,IACLE,EAAEwV,WAAatW,KAAK2V,SAAS1B,EAAGrT,IAE9BqT,EAAGpT,IACLC,EAAEyV,WAAavW,KAAK2V,SAAS1B,EAAGpT,GAElC,IAAIgE,GAAIL,EAAaS,iBAAiBN,GACpCxF,SAAS,EACT6F,YAAY,EACZ6J,GAAIxM,EAAEzB,EACNoO,GAAI3M,EAAExB,EACN2V,IAAKvC,EAAGrT,EACR6V,IAAKxC,EAAGpT,EACRD,EAAGS,EAAQT,EACXC,EAAGQ,EAAQR,EACXS,QAASD,EAAQC,QACjBC,QAASF,EAAQE,QACjByU,MAAO3U,EAAQ2U,MACfC,MAAO5U,EAAQ4U,MACfS,QAASrV,EAAQqV,QACjBC,QAAStV,EAAQsV,QACjBL,WAAYxV,EAAEwV,WACdC,WAAYzV,EAAEyV,WACdK,UAAW9V,EAAE8V,UACbtH,cAAejO,EAAQiO,cACvBvJ,YAAa1E,EAAQ0E,YACrBL,UAAWrE,EAAQqE,UACnBQ,QAAS,SAEXpF,GAAE+V,WAAWxX,cAAcwF,IAE7B+D,KAAM,SAASvH,GACb,GAAIA,EAAQ4E,YAAsC,UAAxB5E,EAAQ0E,YAA8C,IAApB1E,EAAQmE,SAAgB,GAAO,CACzF,GAAID,IACF6Q,UAAW/U,EACXwV,WAAYxV,EAAQ7B,OACpBoX,aACAP,cAAe,KACfC,WAAY,EACZC,WAAY,EACZO,UAAU,EAEZlP,GAAWhB,IAAIvF,EAAQqE,UAAWH,KAGtCuD,KAAM,SAASzH,GACb,GAAIkE,GAAIqC,EAAWV,IAAI7F,EAAQqE,UAC/B,IAAIH,EAAG,CACL,GAAKA,EAAEuR,SAUL9W,KAAKkW,UAAU,QAAS7U,EAASkE,OAVlB,CACf,GAAIlD,GAAIrC,KAAK6V,kBAAkBtQ,EAAE6Q,UAAW/U,GACxCyH,EAAOzG,EAAEzB,EAAIyB,EAAEzB,EAAIyB,EAAExB,EAAIwB,EAAExB,CAE3BiI,GAAO9I,KAAK0V,mBACdnQ,EAAEuR,UAAW,EACb9W,KAAKkW,UAAU,aAAc3Q,EAAE6Q,UAAW7Q,GAC1CvF,KAAKkW,UAAU,QAAS7U,EAASkE,IAKrCA,EAAE8Q,cAAgBhV,IAGtB4H,GAAI,SAAS5H,GACX,GAAIkE,GAAIqC,EAAWV,IAAI7F,EAAQqE,UAC3BH,KACEA,EAAEuR,UACJ9W,KAAKkW,UAAU,WAAY7U,EAASkE,GAEtCqC,EAAWZ,OAAO3F,EAAQqE,aAIhCiC,GAAWY,gBAAgB,QAASkN,IACnC5X,OAAOC,iBCxJX,SAAUO,GACR,GAAIsJ,GAAatJ,EAAMsJ,WACnBnD,EAAenG,EAAMmG,aACrBuS,GAEFC,WAAY,IAEZtB,iBAAkB,GAClBpN,QACE,OACA,OACA,MAEF2O,YAAa,KACbC,QAAS,KACTC,MAAO,WACL,GAAIJ,GAAOK,KAAKC,MAAQrX,KAAKiX,YAAYK,UACrCvO,EAAO/I,KAAKuX,KAAO,YAAc,MACrCvX,MAAKwX,SAASzO,EAAMgO,GACpB/W,KAAKuX,MAAO,GAEdrO,OAAQ,WACNuO,cAAczX,KAAKkX,SACflX,KAAKuX,MACPvX,KAAKwX,SAAS,WAEhBxX,KAAKuX,MAAO,EACZvX,KAAKiX,YAAc,KACnBjX,KAAKR,OAAS,KACdQ,KAAKkX,QAAU,MAEjBtO,KAAM,SAASvH,GACTA,EAAQ4E,YAAcjG,KAAKiX,cAC7BjX,KAAKiX,YAAc5V,EACnBrB,KAAKR,OAAS6B,EAAQ7B,OACtBQ,KAAKkX,QAAUQ,YAAY1X,KAAKmX,MAAMhU,KAAKnD,MAAOA,KAAKgX,cAG3D/N,GAAI,SAAS5H,GACPrB,KAAKiX,aAAejX,KAAKiX,YAAYvR,YAAcrE,EAAQqE,WAC7D1F,KAAKkJ,UAGTJ,KAAM,SAASzH,GACb,GAAIrB,KAAKiX,aAAejX,KAAKiX,YAAYvR,YAAcrE,EAAQqE,UAAW,CACxE,GAAI9E,GAAIS,EAAQC,QAAUtB,KAAKiX,YAAY3V,QACvCT,EAAIQ,EAAQE,QAAUvB,KAAKiX,YAAY1V,OACtCX,GAAIA,EAAIC,EAAIA,EAAKb,KAAK0V,kBACzB1V,KAAKkJ,WAIXsO,SAAU,SAAS7S,EAAQgT,GACzB,GAAIpS,IACFpG,SAAS,EACT6F,YAAY,EACZe,YAAa/F,KAAKiX,YAAYlR,YAC9BL,UAAW1F,KAAKiX,YAAYvR,UAC5B9E,EAAGZ,KAAKiX,YAAY3V,QACpBT,EAAGb,KAAKiX,YAAY1V,QACpB2E,QAAS,OAEPyR,KACFpS,EAAEqS,SAAWD,EAEf,IAAI9S,GAAIL,EAAaS,iBAAiBN,EAAQY,EAC9CvF,MAAKR,OAAOH,cAAcwF,IAG9B8C,GAAWY,gBAAgB,OAAQwO,IAClClZ,OAAOC,iBCrFV,SAAUO,GACR,GAAIsJ,GAAatJ,EAAMsJ,WACnBnD,EAAenG,EAAMmG,aACrBoD,EAAa,GAAIvJ,GAAM8H,WACvB0R,GACFvP,QACE,OACA,MAEFM,KAAM,SAASvH,GACTA,EAAQ4E,YAAc5E,EAAQ8H,cAChCvB,EAAWhB,IAAIvF,EAAQqE,WACrBlG,OAAQ6B,EAAQ7B,OAChBgG,QAASnE,EAAQmE,QACjB5E,EAAGS,EAAQC,QACXT,EAAGQ,EAAQE,WAIjBuW,UAAW,SAASjT,EAAGkT,GACrB,MAAsB,UAAlBlT,EAAEkB,YAEyB,IAAtBgS,EAAUvS,SAEXX,EAAEsE,cAEZF,GAAI,SAAS5H,GACX,GAAI2W,GAAQpQ,EAAWV,IAAI7F,EAAQqE,UACnC,IAAIsS,GAAShY,KAAK8X,UAAUzW,EAAS2W,GAAQ,CAE3C,GAAIlX,GAAIzC,EAAM6E,cAAcnB,IAAIiW,EAAMxY,OAAQ6B,EAAQiO,cACtD,IAAIxO,EAAG,CACL,GAAI+D,GAAIL,EAAaS,iBAAiB,OACpC9F,SAAS,EACT6F,YAAY,EACZpE,EAAGS,EAAQC,QACXT,EAAGQ,EAAQE,QACX8Q,OAAQhR,EAAQgR,OAChBtM,YAAa1E,EAAQ0E,YACrBL,UAAWrE,EAAQqE,UACnBuS,OAAQ5W,EAAQ4W,OAChBC,QAAS7W,EAAQ6W,QACjBC,QAAS9W,EAAQ8W,QACjBC,SAAU/W,EAAQ+W,SAClBlS,QAAS,OAEXpF,GAAEzB,cAAcwF,IAGpB+C,EAAWZ,OAAO3F,EAAQqE,YAI9BlB,GAAaC,WAAa,SAASI,GACjC,MAAO,YACLA,EAAEsE,cAAe,EACjBvB,EAAWZ,OAAOnC,EAAEa,aAGxBiC,EAAWY,gBAAgB,MAAOsP,IACjCha,OAAOC,iBClEV,SAAWua,GACP,YAiEA,SAASC,GAAOC,EAAWC,GACvB,IAAKD,EACD,KAAM,IAAIE,OAAM,WAAaD,GAIrC,QAASE,GAAeC,GACpB,MAAQA,IAAM,IAAY,IAANA,EAMxB,QAASC,GAAaD,GAClB,MAAe,MAAPA,GACI,IAAPA,GACO,KAAPA,GACO,KAAPA,GACO,MAAPA,GACAA,GAAM,MAAU,yGAAyG7R,QAAQ7C,OAAO4U,aAAaF,IAAO,EAKrK,QAASG,GAAiBH,GACtB,MAAe,MAAPA,GAAsB,KAAPA,GAAsB,OAAPA,GAA0B,OAAPA,EAK7D,QAASI,GAAkBJ,GACvB,MAAe,MAAPA,GAAsB,KAAPA,GAClBA,GAAM,IAAY,IAANA,GACZA,GAAM,IAAY,KAANA,EAGrB,QAASK,GAAiBL,GACtB,MAAe,MAAPA,GAAsB,KAAPA,GAClBA,GAAM,IAAY,IAANA,GACZA,GAAM,IAAY,KAANA,GACZA,GAAM,IAAY,IAANA,EAKrB,QAASM,GAAUjH,GACf,MAAe,SAAPA,EAKZ,QAASkH,KACL,KAAevX,EAARwX,GAAkBP,EAAaxQ,EAAOgR,WAAWD,OACnDA,EAIT,QAASE,KACL,GAAIrB,GAAOW,CAGX,KADAX,EAAQmB,IACOxX,EAARwX,IACHR,EAAKvQ,EAAOgR,WAAWD,GACnBH,EAAiBL,OACfQ,CAMV,OAAO/Q,GAAOsD,MAAMsM,EAAOmB,GAG/B,QAASG,KACL,GAAItB,GAAOhG,EAAIjJ,CAoBf,OAlBAiP,GAAQmB,EAERnH,EAAKqH,IAKDtQ,EADc,IAAdiJ,EAAGrQ,OACI4X,EAAMC,WACNP,EAAUjH,GACVuH,EAAME,QACC,SAAPzH,EACAuH,EAAMG,YACC,SAAP1H,GAAwB,UAAPA,EACjBuH,EAAMI,eAENJ,EAAMC,YAIbzQ,KAAMA,EACN6K,MAAO5B,EACP4H,OAAQ5B,EAAOmB,IAOvB,QAASU,KACL,GAEIC,GAEAC,EAJA/B,EAAQmB,EACRa,EAAO5R,EAAOgR,WAAWD,GAEzBc,EAAM7R,EAAO+Q,EAGjB,QAAQa,GAGR,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IAED,QADEb,GAEEpQ,KAAMwQ,EAAMW,WACZtG,MAAO3P,OAAO4U,aAAamB,GAC3BJ,OAAQ5B,EAAOmB,GAGvB,SAII,GAHAW,EAAQ1R,EAAOgR,WAAWD,EAAQ,GAGpB,KAAVW,EACA,OAAQE,GACR,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KAED,MADAb,IAAS,GAELpQ,KAAMwQ,EAAMW,WACZtG,MAAO3P,OAAO4U,aAAamB,GAAQ/V,OAAO4U,aAAaiB,GACvDF,OAAQ5B,EAAOmB,GAGvB,KAAK,IACL,IAAK,IAOD,MANAA,IAAS,EAGwB,KAA7B/Q,EAAOgR,WAAWD,MAChBA,GAGFpQ,KAAMwQ,EAAMW,WACZtG,MAAOxL,EAAOsD,MAAMsM,EAAOmB,GAC3BS,OAAQ5B,EAAOmB,KAe/B,MAJAY,GAAM3R,EAAO+Q,EAAQ,GAIjBc,IAAQF,GAAQ,KAAKjT,QAAQmT,IAAQ,GACrCd,GAAS,GAELpQ,KAAMwQ,EAAMW,WACZtG,MAAOqG,EAAMF,EACbH,OAAQ5B,EAAOmB,KAInB,eAAerS,QAAQmT,IAAQ,KAC7Bd,GAEEpQ,KAAMwQ,EAAMW,WACZtG,MAAOqG,EACPL,OAAQ5B,EAAOmB,SAIvBgB,MAAeC,EAASC,gBAAiB,WAI7C,QAASC,KACL,GAAIC,GAAQvC,EAAOW,CAQnB,IANAA,EAAKvQ,EAAO+Q,GACZb,EAAOI,EAAeC,EAAGS,WAAW,KAAe,MAAPT,EACxC,sEAEJX,EAAQmB,EACRoB,EAAS,GACE,MAAP5B,EAAY,CAaZ,IAZA4B,EAASnS,EAAO+Q,KAChBR,EAAKvQ,EAAO+Q,GAIG,MAAXoB,GAEI5B,GAAMD,EAAeC,EAAGS,WAAW,KACnCe,KAAeC,EAASC,gBAAiB,WAI1C3B,EAAetQ,EAAOgR,WAAWD,KACpCoB,GAAUnS,EAAO+Q,IAErBR,GAAKvQ,EAAO+Q,GAGhB,GAAW,MAAPR,EAAY,CAEZ,IADA4B,GAAUnS,EAAO+Q,KACVT,EAAetQ,EAAOgR,WAAWD,KACpCoB,GAAUnS,EAAO+Q,IAErBR,GAAKvQ,EAAO+Q,GAGhB,GAAW,MAAPR,GAAqB,MAAPA,EAOd,GANA4B,GAAUnS,EAAO+Q,KAEjBR,EAAKvQ,EAAO+Q,IACD,MAAPR,GAAqB,MAAPA,KACd4B,GAAUnS,EAAO+Q,MAEjBT,EAAetQ,EAAOgR,WAAWD,IACjC,KAAOT,EAAetQ,EAAOgR,WAAWD,KACpCoB,GAAUnS,EAAO+Q,SAGrBgB,MAAeC,EAASC,gBAAiB,UAQjD,OAJItB,GAAkB3Q,EAAOgR,WAAWD,KACpCgB,KAAeC,EAASC,gBAAiB,YAIzCtR,KAAMwQ,EAAMiB,eACZ5G,MAAO6G,WAAWF,GAClBX,OAAQ5B,EAAOmB,IAMvB,QAASuB,KACL,GAAcC,GAAO3C,EAAOW,EAAxBiC,EAAM,GAAsBC,GAAQ,CASxC,KAPAF,EAAQvS,EAAO+Q,GACfb,EAAkB,MAAVqC,GAA4B,MAAVA,EACtB,2CAEJ3C,EAAQmB,IACNA,EAEaxX,EAARwX,GAAgB,CAGnB,GAFAR,EAAKvQ,EAAO+Q,KAERR,IAAOgC,EAAO,CACdA,EAAQ,EACR,OACG,GAAW,OAAPhC,EAEP,GADAA,EAAKvQ,EAAO+Q,KACPR,GAAOG,EAAiBH,EAAGS,WAAW,IA0B3B,OAART,GAAkC,OAAlBvQ,EAAO+Q,MACrBA,MA1BN,QAAQR,GACR,IAAK,IACDiC,GAAO,IACP,MACJ,KAAK,IACDA,GAAO,IACP,MACJ,KAAK,IACDA,GAAO,GACP,MACJ,KAAK,IACDA,GAAO,IACP,MACJ,KAAK,IACDA,GAAO,IACP,MACJ,KAAK,IACDA,GAAO,GACP,MAEJ,SACIA,GAAOjC,MAQZ,CAAA,GAAIG,EAAiBH,EAAGS,WAAW,IACtC,KAEAwB,IAAOjC,GAQf,MAJc,KAAVgC,GACAR,KAAeC,EAASC,gBAAiB,YAIzCtR,KAAMwQ,EAAMuB,cACZlH,MAAOgH,EACPC,MAAOA,EACPjB,OAAQ5B,EAAOmB,IAIvB,QAAS4B,GAAiBC,GACtB,MAAOA,GAAMjS,OAASwQ,EAAMC,YACxBwB,EAAMjS,OAASwQ,EAAME,SACrBuB,EAAMjS,OAASwQ,EAAMI,gBACrBqB,EAAMjS,OAASwQ,EAAMG,YAG7B,QAASuB,KACL,GAAItC,EAIJ,OAFAO,KAEIC,GAASxX,GAELoH,KAAMwQ,EAAM2B,IACZtB,OAAQT,EAAOA,KAIvBR,EAAKvQ,EAAOgR,WAAWD,GAGZ,KAAPR,GAAoB,KAAPA,GAAoB,KAAPA,EACnBkB,IAIA,KAAPlB,GAAoB,KAAPA,EACN+B,IAGP3B,EAAkBJ,GACXW,IAKA,KAAPX,EACID,EAAetQ,EAAOgR,WAAWD,EAAQ,IAClCmB,IAEJT,IAGPnB,EAAeC,GACR2B,IAGJT,KAGX,QAASsB,KACL,GAAIH,EASJ,OAPAA,GAAQI,EACRjC,EAAQ6B,EAAMpB,MAAM,GAEpBwB,EAAYH,IAEZ9B,EAAQ6B,EAAMpB,MAAM,GAEboB,EAGX,QAASK,KACL,GAAIC,EAEJA,GAAMnC,EACNiC,EAAYH,IACZ9B,EAAQmC,EAKZ,QAASnB,GAAWa,EAAOO,GACvB,GAAIC,GACAC,EAAOjQ,MAAM9E,UAAUgF,MAAMpE,KAAKoU,UAAW,GAC7CC,EAAMJ,EAAcK,QAChB,SACA,SAAUC,EAAO1C,GAEb,MADAb,GAAOa,EAAQsC,EAAK9Z,OAAQ,sCACrB8Z,EAAKtC,IAOxB,MAHAqC,GAAQ,GAAI/C,OAAMkD,GAClBH,EAAMrC,MAAQA,EACdqC,EAAMM,YAAcH,EACdH,EAKV,QAASO,GAAgBf,GACrBb,EAAWa,EAAOZ,EAASC,gBAAiBW,EAAMpH,OAMtD,QAASoI,GAAOpI,GACZ,GAAIoH,GAAQG,KACRH,EAAMjS,OAASwQ,EAAMW,YAAcc,EAAMpH,QAAUA,IACnDmI,EAAgBf,GAMxB,QAASiB,GAAMrI,GACX,MAAOwH,GAAUrS,OAASwQ,EAAMW,YAAckB,EAAUxH,QAAUA,EAKtE,QAASsI,GAAaC,GAClB,MAAOf,GAAUrS,OAASwQ,EAAME,SAAW2B,EAAUxH,QAAUuI,EAwBnE,QAASC,KACL,GAAIC,KAIJ,KAFAL,EAAO,MAECC,EAAM,MACNA,EAAM,MACNd,IACAkB,EAAS5b,KAAK,QAEd4b,EAAS5b,KAAK6b,MAETL,EAAM,MACPD,EAAO,KAOnB,OAFAA,GAAO,KAEAO,EAASC,sBAAsBH,GAK1C,QAASI,KACL,GAAIzB,EAOJ,OALA9B,KACA8B,EAAQG,IAIJH,EAAMjS,OAASwQ,EAAMuB,eAAiBE,EAAMjS,OAASwQ,EAAMiB,eACpD+B,EAASG,cAAc1B,GAG3BuB,EAASI,iBAAiB3B,EAAMpH,OAG3C,QAASgJ,KACL,GAAI5B,GAAOnH,CAWX,OATAmH,GAAQI,EACRlC,KAEI8B,EAAMjS,OAASwQ,EAAM2B,KAAOF,EAAMjS,OAASwQ,EAAMW,aACjD6B,EAAgBf,GAGpBnH,EAAM4I,IACNT,EAAO,KACAO,EAASM,eAAe,OAAQhJ,EAAKyI,MAGhD,QAASQ,KACL,GAAIC,KAIJ,KAFAf,EAAO,MAECC,EAAM,MACVc,EAAWtc,KAAKmc,KAEXX,EAAM,MACPD,EAAO,IAMf,OAFAA,GAAO,KAEAO,EAASS,uBAAuBD,GAK3C,QAASE,KACL,GAAIC,EAQJ,OANAlB,GAAO,KAEPkB,EAAOZ,KAEPN,EAAO,KAEAkB,EAMX,QAASC,KACL,GAAIpU,GAAMiS,EAAOkC,CAEjB,OAAIjB,GAAM,KACCgB,KAGXlU,EAAOqS,EAAUrS,KAEbA,IAASwQ,EAAMC,WACf0D,EAAOX,EAASI,iBAAiBxB,IAAMvH,OAChC7K,IAASwQ,EAAMuB,eAAiB/R,IAASwQ,EAAMiB,eACtD0C,EAAOX,EAASG,cAAcvB,KACvBpS,IAASwQ,EAAME,QAClByC,EAAa,UACbf,IACA+B,EAAOX,EAASa,wBAEbrU,IAASwQ,EAAMI,gBACtBqB,EAAQG,IACRH,EAAMpH,MAAyB,SAAhBoH,EAAMpH,MACrBsJ,EAAOX,EAASG,cAAc1B,IACvBjS,IAASwQ,EAAMG,aACtBsB,EAAQG,IACRH,EAAMpH,MAAQ,KACdsJ,EAAOX,EAASG,cAAc1B,IACvBiB,EAAM,KACbiB,EAAOd,IACAH,EAAM,OACbiB,EAAOJ,KAGPI,EACOA,MAGXnB,GAAgBZ,MAKpB,QAASkC,KACL,GAAI5B,KAIJ,IAFAO,EAAO,MAEFC,EAAM,KACP,KAAeta,EAARwX,IACHsC,EAAKhb,KAAK6b,OACNL,EAAM,OAGVD,EAAO,IAMf,OAFAA,GAAO,KAEAP,EAGX,QAAS6B,KACL,GAAItC,EAQJ,OANAA,GAAQG,IAEHJ,EAAiBC,IAClBe,EAAgBf,GAGbuB,EAASI,iBAAiB3B,EAAMpH,OAG3C,QAAS2J,KAGL,MAFAvB,GAAO,KAEAsB,IAGX,QAASE,KACL,GAAIN,EAQJ,OANAlB,GAAO,KAEPkB,EAAOZ,KAEPN,EAAO,KAEAkB,EAGX,QAASO,KACL,GAAIP,GAAMzB,EAAMiC,CAIhB,KAFAR,EAAOC,MAGH,GAAIlB,EAAM,KACNyB,EAAWF,IACXN,EAAOX,EAASoB,uBAAuB,IAAKT,EAAMQ,OAC/C,IAAIzB,EAAM,KACbyB,EAAWH,IACXL,EAAOX,EAASoB,uBAAuB,IAAKT,EAAMQ,OAC/C,CAAA,IAAIzB,EAAM,KAIb,KAHAR,GAAO4B,IACPH,EAAOX,EAASqB,qBAAqBV,EAAMzB,GAMnD,MAAOyB,GASX,QAASW,KACL,GAAI7C,GAAOkC,CAcX,OAZI9B,GAAUrS,OAASwQ,EAAMW,YAAckB,EAAUrS,OAASwQ,EAAME,QAChEyD,EAAOY,KACA7B,EAAM,MAAQA,EAAM,MAAQA,EAAM,MACzCjB,EAAQG,IACR+B,EAAOW,IACPX,EAAOX,EAASwB,sBAAsB/C,EAAMpH,MAAOsJ,IAC5ChB,EAAa,WAAaA,EAAa,SAAWA,EAAa,UACtE/B,KAAeC,EAASC,iBAExB6C,EAAOY,KAGJZ,EAGX,QAASc,GAAiBhD,GACtB,GAAIiD,GAAO,CAEX,IAAIjD,EAAMjS,OAASwQ,EAAMW,YAAcc,EAAMjS,OAASwQ,EAAME,QACxD,MAAO,EAGX,QAAQuB,EAAMpH,OACd,IAAK,KACDqK,EAAO,CACP,MAEJ,KAAK,KACDA,EAAO,CACP,MAEJ,KAAK,KACL,IAAK,KACL,IAAK,MACL,IAAK,MACDA,EAAO,CACP,MAEJ,KAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,aACDA,EAAO,CACP,MAEJ,KAAK,KACDA,EAAO,CACP,MAEJ,KAAK,IACL,IAAK,IACDA,EAAO,CACP,MAEJ,KAAK,IACL,IAAK,IACL,IAAK,IACDA,EAAO,GAOX,MAAOA,GAWX,QAASC,KACL,GAAIhB,GAAMlC,EAAOiD,EAAME,EAAOpb,EAAOqb,EAAUtb,EAAMpB,CAMrD,IAJAoB,EAAO+a,IAEP7C,EAAQI,EACR6C,EAAOD,EAAiBhD,GACX,IAATiD,EACA,MAAOnb,EASX,KAPAkY,EAAMiD,KAAOA,EACb9C,IAEApY,EAAQ8a,IAERM,GAASrb,EAAMkY,EAAOjY,IAEdkb,EAAOD,EAAiB5C,IAAc,GAAG,CAG7C,KAAQ+C,EAAMxc,OAAS,GAAOsc,GAAQE,EAAMA,EAAMxc,OAAS,GAAGsc,MAC1Dlb,EAAQob,EAAME,MACdD,EAAWD,EAAME,MAAMzK,MACvB9Q,EAAOqb,EAAME,MACbnB,EAAOX,EAAS+B,uBAAuBF,EAAUtb,EAAMC,GACvDob,EAAM1d,KAAKyc,EAIflC,GAAQG,IACRH,EAAMiD,KAAOA,EACbE,EAAM1d,KAAKua,GACXkC,EAAOW,IACPM,EAAM1d,KAAKyc,GAMf,IAFAxb,EAAIyc,EAAMxc,OAAS,EACnBub,EAAOiB,EAAMzc,GACNA,EAAI,GACPwb,EAAOX,EAAS+B,uBAAuBH,EAAMzc,EAAI,GAAGkS,MAAOuK,EAAMzc,EAAI,GAAIwb,GACzExb,GAAK,CAGT,OAAOwb,GAMX,QAASqB,KACL,GAAIrB,GAAMsB,EAAYC,CAatB,OAXAvB,GAAOgB,IAEHjC,EAAM,OACNd,IACAqD,EAAaD,IACbvC,EAAO,KACPyC,EAAYF,IAEZrB,EAAOX,EAASmC,4BAA4BxB,EAAMsB,EAAYC,IAG3DvB,EAaX,QAASyB,KACL,GAAI5N,GAAY0K,CAUhB,OARA1K,GAAaoK,IAETpK,EAAWhI,OAASwQ,EAAMC,YAC1BuC,EAAgBhL,GAGpB0K,EAAOQ,EAAM,KAAOoB,OAEbd,EAASqC,aAAa7N,EAAW6C,MAAO6H,GAOnD,QAASoD,KACL,KAAO5C,EAAM,MACTd,IACAwD,IAqBR,QAASG,KACL5F,IACAmC,GAEA,IAAI6B,GAAOZ,IACPY,KACwB,MAApB9B,EAAUxH,OAAoC,MAAnBwH,EAAUxH,OAC9BsJ,EAAKnU,OAASgW,EAAOvF,WAC5BwF,EAAkB9B,IAElB2B,IACwB,OAApBzD,EAAUxH,MACVqL,EAAkB/B,GAElBX,EAAS2C,eAAehC,KAKhC9B,EAAUrS,OAASwQ,EAAM2B,KACzBa,EAAgBX,GAIxB,QAAS6D,GAAkB/B,GACvB/B,GACA,IAAIpK,GAAaoK,IAAMvH,KACvB2I,GAAS4C,mBAAmBjC,EAAMnM,GAGtC,QAASiO,GAAkBjO,GACvB,GAAIqO,EACoB,OAApBhE,EAAUxH,QACVuH,IACIC,EAAUrS,OAASwQ,EAAMC,YACzBuC,EAAgBX,GACpBgE,EAAYjE,IAAMvH,OAGtBuH,GACA,IAAI+B,GAAOZ,IACXuC,KACAtC,EAAS8C,mBAAmBtO,EAAW5I,KAAMiX,EAAWlC,GAG5D,QAASoC,GAAMtF,EAAMuF,GAUjB,MATAhD,GAAWgD,EACXnX,EAAS4R,EACTb,EAAQ,EACRxX,EAASyG,EAAOzG,OAChByZ,EAAY,KACZoE,GACIC,aAGGX,IAx+BX,GAAIvF,GACAmG,EACAX,EACA3E,EACAhS,EACA+Q,EACAxX,EACA4a,EACAnB,EACAoE,CAEJjG,IACII,eAAgB,EAChBuB,IAAK,EACL1B,WAAY,EACZC,QAAS,EACTC,YAAa,EACbc,eAAgB,EAChBN,WAAY,EACZY,cAAe,GAGnB4E,KACAA,EAAUnG,EAAMI,gBAAkB,UAClC+F,EAAUnG,EAAM2B,KAAO,QACvBwE,EAAUnG,EAAMC,YAAc,aAC9BkG,EAAUnG,EAAME,SAAW,UAC3BiG,EAAUnG,EAAMG,aAAe,OAC/BgG,EAAUnG,EAAMiB,gBAAkB,UAClCkF,EAAUnG,EAAMW,YAAc,aAC9BwF,EAAUnG,EAAMuB,eAAiB,SAEjCiE,GACIY,gBAAiB,kBACjBC,iBAAkB,mBAClBC,eAAgB,iBAChBC,sBAAuB,wBACvBC,eAAgB,iBAChBC,oBAAqB,sBACrBxG,WAAY,aACZyG,QAAS,UACTC,iBAAkB,mBAClBC,kBAAmB,oBACnBC,iBAAkB,mBAClBC,iBAAkB,mBAClBC,QAAS,UACTC,SAAU,WACVC,eAAgB,iBAChBC,gBAAiB,mBAIrBrG,GACIC,gBAAkB,sBAClBqG,aAAc,uBACdC,cAAe,oCAgrBnB,IAAI7C,IAAyBL,EAuJzBnB,GAAkBiC,CA6GtBlG,GAAOuI,SACHtB,MAAOA,IAEZtf,MC1gCH,SAAWqY,GACT,YAEA,SAASwI,GAAeC,EAAgB3Y,EAAMxF,EAAMoe,GAClD,GAAIC,EACJ,KAEE,GADAA,EAAaC,EAAcH,GACvBE,EAAWE,aACVve,EAAK3B,WAAaC,KAAKqM,cACN,aAAjB3K,EAAKwe,SACK,SAAThZ,GAA4B,WAATA,GACvB,KAAMsQ,OAAM,4DAEd,MAAO2I,GAEP,WADAnT,SAAQuN,MAAM,8BAAgCsF,EAAgBM,GAIhE,MAAO,UAASC,EAAO1e,EAAM2e,GAC3B,GAAIC,GAAUP,EAAWQ,WAAWH,EAAON,EAAgBO,EAO3D,OANIN,GAAWE,YAAcK,IAC3B5e,EAAK8e,6BAA+BT,EAAWE,WAC3CF,EAAWU,aACb/e,EAAKgf,6BAA+BX,EAAWU,aAG5CH,GAOX,QAASN,GAAcH,GACrB,GAAIE,GAAaY,EAAqBd,EACtC,KAAKE,EAAY,CACf,GAAIzE,GAAW,GAAIsF,EACnBjB,SAAQtB,MAAMwB,EAAgBvE,GAC9ByE,EAAa,GAAIc,GAAWvF,GAC5BqF,EAAqBd,GAAkBE,EAEzC,MAAOA,GAGT,QAASf,GAAQrM,GACf5T,KAAK4T,MAAQA,EACb5T,KAAK+hB,SAAW3R,OAgBlB,QAAS4R,GAAU7Z,GACjBnI,KAAKmI,KAAOA,EACZnI,KAAKhB,KAAOijB,KAAK/a,IAAIiB,GA2BvB,QAASiY,GAAiB8B,EAAQxE,EAAUyE,GAC1CniB,KAAKoiB,SAAuB,KAAZD,EAEhBniB,KAAKqiB,YAA+B,kBAAVH,IACPA,EAAOG,aACNriB,KAAKoiB,YAAc1E,YAAoBuC,IAE3DjgB,KAAKsiB,YACAtiB,KAAKqiB,cACL3E,YAAoBsE,IAAatE,YAAoBuC,MACrDiC,YAAkB9B,IAAoB8B,YAAkBF,IAE7DhiB,KAAKkiB,OAASliB,KAAKsiB,WAAaJ,EAASK,EAAML,GAC/CliB,KAAK0d,UAAY1d,KAAKoiB,UAAYpiB,KAAKsiB,WACnC5E,EAAW6E,EAAM7E,GAuEvB,QAAS8E,GAAOra,EAAMsT,GACpBzb,KAAKmI,KAAOA,EACZnI,KAAKyb,OACL,KAAK,GAAI/Z,GAAI,EAAGA,EAAI+Z,EAAK9Z,OAAQD,IAC/B1B,KAAKyb,KAAK/Z,GAAK6gB,EAAM9G,EAAK/Z,IA0C9B,QAAS+gB,KAAmB,KAAMhK,OAAM,mBA0BxC,QAAS8J,GAAMG,GACb,MAAqB,kBAAPA,GAAoBA,EAAMA,EAAIC,UAG9C,QAASd,KACP7hB,KAAKghB,WAAa,KAClBhhB,KAAK4iB,WACL5iB,KAAK6iB,QACL7iB,KAAK8iB,YAAc1S,OACnBpQ,KAAKkhB,WAAa9Q,OAClBpQ,KAAK0hB,WAAatR,OAClBpQ,KAAKqiB,aAAc,EA0HrB,QAASU,GAAmBnP,GAC1B5T,KAAKgjB,OAASpP,EAUhB,QAASkO,GAAWvF,GAIlB,GAHAvc,KAAKkhB,WAAa3E,EAAS2E,WAC3BlhB,KAAK0hB,WAAanF,EAASmF,YAEtBnF,EAASyE,WACZ,KAAMvI,OAAM,uBAEdzY,MAAKghB,WAAazE,EAASyE,WAC3BuB,EAAMviB,KAAKghB,YAEXhhB,KAAK4iB,QAAUrG,EAASqG,QACxB5iB,KAAKqiB,YAAc9F,EAAS8F,YAmE9B,QAASY,GAAyB9a,GAChC,MAAOlE,QAAOkE,GAAMyT,QAAQ,SAAU,SAASsH,GAC7C,MAAO,IAAMA,EAAEC,gBASnB,QAASC,GAAU/B,EAAOgC,GACxB,KAAOhC,EAAMiC,KACLpe,OAAOwB,UAAU6c,eAAejc,KAAK+Z,EAAOgC,IAClDhC,EAAQA,EAAMiC,EAGhB,OAAOjC,GAGT,QAASmC,GAAoBC,GAC3B,OAAQA,GACN,IAAK,GACH,OAAO,CAET,KAAK,QACL,IAAK,OACL,IAAK,OACH,OAAO,EAGX,MAAKC,OAAMC,OAAOF,KAGX,GAFE,EAKX,QAASG,MA5dT,GAAIhC,GAAuB1c,OAAOC,OAAO,KAkBzC8a;EAAQvZ,WACNic,QAAS,WACP,IAAK3iB,KAAK+hB,SAAU,CAClB,GAAInO,GAAQ5T,KAAK4T,KACjB5T,MAAK+hB,SAAW,WACd,MAAOnO,IAIX,MAAO5T,MAAK+hB,WAShBC,EAAUtb,WACRic,QAAS,WACP,IAAK3iB,KAAK+hB,SAAU,CAClB,GACI/iB,IADOgB,KAAKmI,KACLnI,KAAKhB,KAChBgB,MAAK+hB,SAAW,SAASV,EAAO/V,GAI9B,MAHIA,IACFA,EAASuY,QAAQxC,EAAOriB,GAEnBA,EAAK8kB,aAAazC,IAI7B,MAAOrhB,MAAK+hB,UAGdgC,SAAU,SAAS1C,EAAO2C,GAIxB,MAHwB,IAApBhkB,KAAKhB,KAAK2C,OACZ0f,EAAQ+B,EAAU/B,EAAOrhB,KAAKhB,KAAK,IAE9BgB,KAAKhB,KAAKilB,aAAa5C,EAAO2C,KAqBzC5D,EAAiB1Z,WACfwd,GAAIC,YACF,IAAKnkB,KAAKokB,UAAW,CAEnB,GAAIC,GAAQrkB,KAAKkiB,iBAAkB9B,GAC/BpgB,KAAKkiB,OAAOiC,SAASzY,SAAW1L,KAAKkiB,OAAO/Z,KAChDkc,GAAM5jB,KAAKT,KAAK0d,mBAAoBsE,GAChChiB,KAAK0d,SAASvV,KAAOnI,KAAK0d,SAAS9J,OACvC5T,KAAKokB,UAAYnC,KAAK/a,IAAImd,GAG5B,MAAOrkB,MAAKokB,WAGdzB,QAAS,WACP,IAAK3iB,KAAK+hB,SAAU,CAClB,GAAIG,GAASliB,KAAKkiB,MAElB,IAAIliB,KAAKsiB,WAAY,CACnB,GAAItjB,GAAOgB,KAAKmkB,QAEhBnkB,MAAK+hB,SAAW,SAASV,EAAO/V,GAI9B,MAHIA,IACFA,EAASuY,QAAQxC,EAAOriB,GAEnBA,EAAK8kB,aAAazC,QAEtB,IAAKrhB,KAAKoiB,SAWV,CAEL,GAAI1E,GAAW1d,KAAK0d,QAEpB1d,MAAK+hB,SAAW,SAASV,EAAO/V,EAAUyV,GACxC,GAAIuD,GAAUpC,EAAOb,EAAO/V,EAAUyV,GAClCwD,EAAW7G,EAAS2D,EAAO/V,EAAUyV,EAIzC,OAHIzV,IACFA,EAASuY,QAAQS,GAAUC,IAEtBD,EAAUA,EAAQC,GAAYnU,YArBd,CACzB,GAAIpR,GAAOijB,KAAK/a,IAAIlH,KAAK0d,SAASvV,KAElCnI,MAAK+hB,SAAW,SAASV,EAAO/V,EAAUyV,GACxC,GAAIuD,GAAUpC,EAAOb,EAAO/V,EAAUyV,EAKtC,OAHIzV,IACFA,EAASuY,QAAQS,EAAStlB,GAErBA,EAAK8kB,aAAaQ,KAgB/B,MAAOtkB,MAAK+hB,UAGdgC,SAAU,SAAS1C,EAAO2C,GACxB,GAAIhkB,KAAKsiB,WAEP,MADAtiB,MAAKmkB,SAASF,aAAa5C,EAAO2C,GAC3BA,CAGT,IAAI9B,GAASliB,KAAKkiB,OAAOb,GACrBkD,EAAWvkB,KAAK0d,mBAAoBsE,GAAYhiB,KAAK0d,SAASvV,KAC9DnI,KAAK0d,SAAS2D,EAClB,OAAOa,GAAOqC,GAAYP,IAY9BxB,EAAO9b,WACL8d,UAAW,SAASnD,EAAO/V,EAAUyV,EAAgB0D,EACjCC,GAClB,GAAIpb,GAAKyX,EAAe/gB,KAAKmI,MACzBmc,EAAUjD,CACd,IAAI/X,EACFgb,EAAUlU,WAGV,IADA9G,EAAKgb,EAAQtkB,KAAKmI,OACbmB,EAEH,WADA2E,SAAQuN,MAAM,mCAAqCxb,KAAKmI,KAc5D,IANIsc,EACFnb,EAAKA,EAAGqb,QACoB,kBAAZrb,GAAGsb,QACnBtb,EAAKA,EAAGsb,OAGO,kBAANtb,GAET,WADA2E,SAAQuN,MAAM,mCAAqCxb,KAAKmI,KAK1D,KAAK,GADDsT,GAAOiJ,MACFhjB,EAAI,EAAGA,EAAI1B,KAAKyb,KAAK9Z,OAAQD,IACpC+Z,EAAKhb,KAAK8hB,EAAMviB,KAAKyb,KAAK/Z,IAAI2f,EAAO/V,EAAUyV,GAGjD,OAAOzX,GAAGub,MAAMP,EAAS7I,IAM7B,IAAIqJ,IACFC,IAAK,SAAS1hB,GAAK,OAAQA,GAC3B2hB,IAAK,SAAS3hB,GAAK,OAAQA,GAC3B4hB,IAAK,SAAS5hB,GAAK,OAAQA,IAGzB6hB,GACFH,IAAK,SAASrc,EAAG1E,GAAK,MAAO0E,GAAE1E,GAC/BghB,IAAK,SAAStc,EAAG1E,GAAK,MAAO0E,GAAE1E,GAC/BmhB,IAAK,SAASzc,EAAG1E,GAAK,MAAO0E,GAAE1E,GAC/BohB,IAAK,SAAS1c,EAAG1E,GAAK,MAAO0E,GAAE1E,GAC/BqhB,IAAK,SAAS3c,EAAG1E,GAAK,MAAO0E,GAAE1E,GAC/BshB,IAAK,SAAS5c,EAAG1E,GAAK,MAASA,GAAF0E,GAC7B6c,IAAK,SAAS7c,EAAG1E,GAAK,MAAO0E,GAAE1E,GAC/BwhB,KAAM,SAAS9c,EAAG1E,GAAK,MAAUA,IAAH0E,GAC9B+c,KAAM,SAAS/c,EAAG1E,GAAK,MAAO0E,IAAG1E,GACjC0hB,KAAM,SAAShd,EAAG1E,GAAK,MAAO0E,IAAG1E,GACjC2hB,KAAM,SAASjd,EAAG1E,GAAK,MAAO0E,IAAG1E,GACjC4hB,MAAO,SAASld,EAAG1E,GAAK,MAAO0E,KAAI1E,GACnC6hB,MAAO,SAASnd,EAAG1E,GAAK,MAAO0E,KAAI1E,GACnC8hB,KAAM,SAASpd,EAAG1E,GAAK,MAAO0E,IAAG1E,GACjC+hB,KAAM,SAASrd,EAAG1E,GAAK,MAAO0E,IAAG1E,GAiBnC6d,GAAYnb,WACVqX,sBAAuB,SAASiI,EAAIC,GAClC,IAAKnB,EAAekB,GAClB,KAAMvN,OAAM,wBAA0BuN,EAIxC,OAFAC,GAAW1D,EAAM0D,GAEV,SAAS5E,EAAO/V,EAAUyV,GAC/B,MAAO+D,GAAekB,GAAIC,EAAS5E,EAAO/V,EAAUyV,MAIxDzC,uBAAwB,SAAS0H,EAAIljB,EAAMC,GACzC,IAAKmiB,EAAgBc,GACnB,KAAMvN,OAAM,wBAA0BuN,EAKxC,OAHAljB,GAAOyf,EAAMzf,GACbC,EAAQwf,EAAMxf,GAEP,SAASse,EAAO/V,EAAUyV,GAC/B,MAAOmE,GAAgBc,GAAIljB,EAAKue,EAAO/V,EAAUyV,GACtBhe,EAAMse,EAAO/V,EAAUyV,MAItDrC,4BAA6B,SAASwH,EAAM1H,EAAYC,GAKtD,MAJAyH,GAAO3D,EAAM2D,GACb1H,EAAa+D,EAAM/D,GACnBC,EAAY8D,EAAM9D,GAEX,SAAS4C,EAAO/V,EAAUyV,GAC/B,MAAOmF,GAAK7E,EAAO/V,EAAUyV,GACzBvC,EAAW6C,EAAO/V,EAAUyV,GAC5BtC,EAAU4C,EAAO/V,EAAUyV,KAInCpE,iBAAkB,SAASxU,GACzB,GAAIge,GAAQ,GAAInE,GAAU7Z,EAE1B,OADAge,GAAMpd,KAAO,aACNod,GAGTxI,uBAAwB,SAASwE,EAAUD,EAAQxE,GACjD,GAAI0D,GAAK,GAAIhB,GAAiB8B,EAAQxE,EAAUyE,EAGhD,OAFIf,GAAGiB,cACLriB,KAAKqiB,aAAc,GACdjB,GAGTxD,qBAAsB,SAASoD,EAAYvF,GACzC,KAAMuF,YAAsBgB,IAC1B,KAAMvJ,OAAM,mDAEd,IAAI9M,GAAS,GAAI6W,GAAOxB,EAAW7Y,KAAMsT,EAEzC,OAAO,UAAS4F,EAAO/V,EAAUyV,GAC/B,MAAOpV,GAAO6Y,UAAUnD,EAAO/V,EAAUyV,GAAgB,KAI7DrE,cAAe,SAAS1B,GACtB,MAAO,IAAIiF,GAAQjF,EAAMpH,QAG3B4I,sBAAuB,SAASH,GAC9B,IAAK,GAAI3a,GAAI,EAAGA,EAAI2a,EAAS1a,OAAQD,IACnC2a,EAAS3a,GAAK6gB,EAAMlG,EAAS3a,GAE/B,OAAO,UAAS2f,EAAO/V,EAAUyV,GAE/B,IAAK,GADDqF,MACK1kB,EAAI,EAAGA,EAAI2a,EAAS1a,OAAQD,IACnC0kB,EAAI3lB,KAAK4b,EAAS3a,GAAG2f,EAAO/V,EAAUyV,GACxC,OAAOqF,KAIXvJ,eAAgB,SAASwJ,EAAMxS,EAAKD,GAClC,OACEC,IAAKA,YAAemO,GAAYnO,EAAI1L,KAAO0L,EAAID,MAC/CA,MAAOA,IAIXoJ,uBAAwB,SAASD,GAC/B,IAAK,GAAIrb,GAAI,EAAGA,EAAIqb,EAAWpb,OAAQD,IACrCqb,EAAWrb,GAAGkS,MAAQ2O,EAAMxF,EAAWrb,GAAGkS,MAE5C,OAAO,UAASyN,EAAO/V,EAAUyV,GAE/B,IAAK,GADDuF,MACK5kB,EAAI,EAAGA,EAAIqb,EAAWpb,OAAQD,IACrC4kB,EAAIvJ,EAAWrb,GAAGmS,KACdkJ,EAAWrb,GAAGkS,MAAMyN,EAAO/V,EAAUyV,EAC3C,OAAOuF,KAIX1H,aAAc,SAASzW,EAAMsT,GAC3Bzb,KAAK4iB,QAAQniB,KAAK,GAAI+hB,GAAOra,EAAMsT,KAGrC0D,mBAAoB,SAAS6B,EAAYE,GACvClhB,KAAKghB,WAAaA,EAClBhhB,KAAKkhB,WAAaA,GAGpB7B,mBAAoB,SAAS6B,EAAYQ,EAAYV,GACnDhhB,KAAKghB,WAAaA,EAClBhhB,KAAKkhB,WAAaA,EAClBlhB,KAAK0hB,WAAaA,GAGpBxC,eAAgB,SAAS8B,GACvBhhB,KAAKghB,WAAaA,GAGpB5D,qBAAsBqF,GAOxBM,EAAmBrc,WACjB6f,KAAM,WAAa,MAAOvmB,MAAKgjB,QAC/BwD,eAAgB,WAAa,MAAOxmB,MAAKgjB,QACzCyD,QAAS,aACTC,MAAO,cAiBT5E,EAAWpb,WACT8a,WAAY,SAASH,EAAON,EAAgBO,GAU1C,QAASqB,KAEP,GAAIgE,EAEF,MADAA,IAAY,EACLC,CAGLhU,GAAKyP,aACP/W,EAASub,YAEX,IAAIjT,GAAQhB,EAAKkU,SAASzF,EACAzO,EAAKyP,YAAc/W,EAAW8E,OAC9B2Q,EAI1B,OAHInO,GAAKyP,aACP/W,EAASyb,cAEJnT,EAGT,QAASoT,GAAWhD,GAElB,MADApR,GAAKmR,SAAS1C,EAAO2C,EAAUjD,GACxBiD,EA9BT,GAAI1C,EACF,MAAOthB,MAAK8mB,SAASzF,EAAOjR,OAAW2Q,EAEzC,IAAIzV,GAAW,GAAI2b,kBAEfL,EAAa5mB,KAAK8mB,SAASzF,EAAO/V,EAAUyV,GAC5C4F,GAAY,EACZ/T,EAAO5S,IA0BX,OAAO,IAAIknB,mBAAkB5b,EAAUqX,EAASqE,GAAY,IAG9DF,SAAU,SAASzF,EAAO/V,EAAUyV,GAElC,IAAK,GADDnN,GAAQ2O,EAAMviB,KAAKghB,YAAYK,EAAO/V,EAAUyV,GAC3Crf,EAAI,EAAGA,EAAI1B,KAAK4iB,QAAQjhB,OAAQD,IACvCkS,EAAQ5T,KAAK4iB,QAAQlhB,GAAG8iB,UAAUnD,EAAO/V,EAAUyV,GAC/C,GAAQnN,GAGd,OAAOA,IAGTmQ,SAAU,SAAS1C,EAAO2C,EAAUjD,GAElC,IADA,GAAIoG,GAAQnnB,KAAK4iB,QAAU5iB,KAAK4iB,QAAQjhB,OAAS,EAC1CwlB,IAAU,GACfnD,EAAWhkB,KAAK4iB,QAAQuE,GAAO3C,UAAUnD,EAAOjR,OAC5C2Q,GAAgB,GAAOiD,GAG7B,OAAIhkB,MAAKghB,WAAW+C,SACX/jB,KAAKghB,WAAW+C,SAAS1C,EAAO2C,GADzC,QAeJ,IAAIV,GAAkB,IAAMxU,KAAKsY,SAASC,SAAS,IAAI3b,MAAM,EAiC7DkY,GAAmBld,WAEjB4gB,YAAa,SAAS1T,GACpB,GAAIyQ,KACJ,KAAK,GAAIxQ,KAAOD,GACdyQ,EAAM5jB,KAAKwiB,EAAyBpP,GAAO,KAAOD,EAAMC,GAE1D,OAAOwQ,GAAMkD,KAAK,OAGpBC,UAAW,SAAS5T,GAClB,GAAI6T,KACJ,KAAK,GAAI5T,KAAOD,GACVA,EAAMC,IACR4T,EAAOhnB,KAAKoT,EAEhB,OAAO4T,GAAOF,KAAK,MAIrBG,+BAAgC,SAASC,GACvC,GAAIjG,GAAaiG,EAAShG,4BAC1B,IAAKD,EAGL,MAAO,UAASkG,EAAkBzO,GAChCyO,EAAiBvG,MAAMK,GAAcvI,IAIzC0H,eAAgB,SAAS4C,EAAYtb,EAAMxF,GACzC,GAAI3D,GAAOijB,KAAK/a,IAAIuc,EAEpB,EAAA,GAAKD,EAAoBC,KAAezkB,EAAK6oB,MAa7C,MAAOhH,GAAe4C,EAAYtb,EAAMxF,EAAM3C,KAZ5C,IAAmB,GAAfhB,EAAK2C,OACP,MAAO,UAAS0f,EAAO1e,EAAM2e,GAC3B,GAAIA,EACF,MAAOtiB,GAAK8kB,aAAazC,EAE3B,IAAIhjB,GAAQ+kB,EAAU/B,EAAOriB,EAAK,GAClC,OAAO,IAAI8oB,cAAazpB,EAAOW,MASvC+oB,qBAAsB,SAASJ,GAC7B,GAAIK,GAAYL,EAASlG,4BACzB,IAAKuG,EAAL,CAGA,GAAIC,GAAcN,EAASC,iBACvBD,EAASC,iBAAiBvG,MAC1BsG,EAAStG,MAETjC,EAAYuI,EAAShG,4BAEzB,OAAO,UAASN,GACd,MAAO6G,GAAkBD,EAAa5G,EAAO2G,EAAW5I,MAK9D,IAAI8I,GAAqB,gBACvB,SAASD,EAAa5G,EAAO2G,EAAW5I,GACtC,GAAI/gB,KAKJ,OAJAA,GAAM2pB,GAAa3G,EACnBhjB,EAAM+gB,GAAahP,OACnB/R,EAAMilB,GAAmB2E,EACzB5pB,EAAM8pB,UAAYF,EACX5pB,GAET,SAAS4pB,EAAa5G,EAAO2G,EAAW5I,GACtC,GAAI/gB,GAAQ6G,OAAOC,OAAO8iB,EAO1B,OANA/iB,QAAOkjB,eAAe/pB,EAAO2pB,GACvBpU,MAAOyN,EAAOgH,cAAc,EAAMC,UAAU,IAClDpjB,OAAOkjB,eAAe/pB,EAAO+gB,GACvBxL,MAAOxD,OAAWiY,cAAc,EAAMC,UAAU,IACtDpjB,OAAOkjB,eAAe/pB,EAAOilB,GACvB1P,MAAOqU,EAAaI,cAAc,EAAMC,UAAU,IACjDjqB,EAGXga,GAAOuL,mBAAqBA,EAC5BA,EAAmB3C,cAAgBA,GAClCjhB,MCplBHuoB,SACEC,QAAS,iBCGmB,kBAAnB3qB,QAAO0qB,UAChBA,YCJF,SAAUlqB,GAGR,QAASoqB,GAAO/hB,EAAWgiB,GAiBzB,MAhBIhiB,IAAagiB,GAEfxjB,OAAOyjB,oBAAoBD,GAAK3kB,QAAQ,SAAStC,GAE/C,GAAImnB,GAAK1jB,OAAO2jB,yBAAyBH,EAAKjnB,EAC1CmnB,KAEF1jB,OAAOkjB,eAAe1hB,EAAWjF,EAAGmnB,GAEb,kBAAZA,GAAGhV,QAEZgV,EAAGhV,MAAMkV,IAAMrnB,MAKhBiF,EAKTrI,EAAMoqB,OAASA,GAEdF,SC3BH,SAAUlqB,GA6CR,QAAS0qB,GAAIA,EAAK3hB,EAAU4hB,GAO1B,MANID,GACFA,EAAIE,OAEJF,EAAM,GAAIG,GAAIlpB,MAEhB+oB,EAAII,GAAG/hB,EAAU4hB,GACVD,EAzCT,GAAIG,GAAM,SAASE,GACjBppB,KAAKskB,QAAU8E,EACfppB,KAAKqpB,cAAgBrpB,KAAKspB,SAASnmB,KAAKnD,MAE1CkpB,GAAIxiB,WACFyiB,GAAI,SAAS/hB,EAAU4hB,GACrBhpB,KAAKoH,SAAWA,CAChB,IAAImiB,EACCP,IAMHO,EAAI5X,WAAW3R,KAAKqpB,cAAeL,GACnChpB,KAAKwpB,OAAS,WACZ5X,aAAa2X,MAPfA,EAAI7e,sBAAsB1K,KAAKqpB,eAC/BrpB,KAAKwpB,OAAS,WACZC,qBAAqBF,MAS3BN,KAAM,WACAjpB,KAAKwpB,SACPxpB,KAAKwpB,SACLxpB,KAAKwpB,OAAS,OAGlBF,SAAU,WACJtpB,KAAKwpB,SACPxpB,KAAKipB,OACLjpB,KAAKoH,SAASE,KAAKtH,KAAKskB,YAiB9BjmB,EAAM0qB,IAAMA,GAEXR,SC3DH,WAEE,GAAImB,KAEJC,aAAYnhB,SAAW,SAASohB,EAAKljB,GACnCgjB,EAASE,GAAOljB,GAIlBijB,YAAYE,mBAAqB,SAASD,GACxC,GAAIljB,GAAakjB,EAA8BF,EAASE,GAAjCD,YAAYjjB,SAEnC,OAAOA,IAAaxB,OAAO4kB,eAAetrB,SAASC,cAAcmrB,IAInE,IAAIG,GAA0BC,MAAMtjB,UAAUzH,eAC9C+qB,OAAMtjB,UAAUzH,gBAAkB,WAChCe,KAAKiqB,cAAe,EACpBF,EAAwBlF,MAAM7kB,KAAM0b,aASrC6M,SC5BF,SAAUlqB,GAgBP,QAAS6rB,GAAOC,GAMd,GAAIC,GAASF,EAAOE,OAEhBtB,EAAMsB,EAAOtB,IAEbuB,EAASD,EAAOC,MACfA,KACEvB,IACHA,EAAMsB,EAAOtB,IAAMwB,EAAWhjB,KAAKtH,KAAMoqB,IAEtCtB,GACH7a,QAAQC,KAAK,iFAQfmc,EAASE,EAAaH,EAAQtB,EAAKgB,EAAe9pB,OAGpD,IAAIsJ,GAAK+gB,EAAOvB,EAChB,OAAIxf,IAEGA,EAAG+gB,QAENE,EAAajhB,EAAIwf,EAAKuB,GAIjB/gB,EAAGub,MAAM7kB,KAAMmqB,QARxB,OAYF,QAASG,GAAW1W,GAElB,IADA,GAAIrO,GAAIvF,KAAKmoB,UACN5iB,GAAKA,IAAMokB,YAAYjjB,WAAW,CAGvC,IAAK,GAAsBjF,GADvB+oB,EAAKtlB,OAAOyjB,oBAAoBpjB,GAC3B7D,EAAE,EAAGgH,EAAE8hB,EAAG7oB,OAAa+G,EAAFhH,IAAQD,EAAE+oB,EAAG9oB,IAAKA,IAAK,CACnD,GAAIW,GAAI6C,OAAO2jB,yBAAyBtjB,EAAG9D,EAC3C,IAAuB,kBAAZY,GAAEuR,OAAwBvR,EAAEuR,QAAUA,EAC/C,MAAOnS,GAGX8D,EAAIA,EAAE4iB,WAIV,QAASoC,GAAaE,EAAQtiB,EAAMuiB,GAIlC,GAAI9rB,GAAI+rB,EAAUD,EAAOviB,EAAMsiB,EAM/B,OALI7rB,GAAEuJ,KAGJvJ,EAAEuJ,GAAM2gB,IAAM3gB,GAETsiB,EAAOJ,OAASzrB,EAGzB,QAAS+rB,GAAUD,EAAOviB,EAAMiiB,GAE9B,KAAOM,GAAO,CACZ,GAAKA,EAAMviB,KAAUiiB,GAAWM,EAAMviB,GACpC,MAAOuiB,EAETA,GAAQZ,EAAeY,GAMzB,MAAOxlB,QAMT,QAAS4kB,GAAepjB,GACtB,MAAOA,GAAUyhB,UAkBnB9pB,EAAMusB,MAAQV,GAEf3B,SC3HH,SAAUlqB,GA8CR,QAASwsB,GAAiBjX,EAAOkX,GAE/B,GAAIC,SAAsBD,EAM1B,OAJIA,aAAwB1T,QAC1B2T,EAAe,QAGVC,EAAaD,GAAcnX,EAAOkX,GApD3C,GAAIE,IACFC,OAAQ,SAASrX,GACf,MAAOA,IAETsX,KAAM,SAAStX,GACb,MAAO,IAAIwD,MAAKA,KAAKkI,MAAM1L,IAAUwD,KAAKC,QAE5C8T,UAAS,SAASvX,GAChB,MAAc,KAAVA,GACK,EAEQ,UAAVA,GAAoB,IAAUA,GAEvC2G,OAAQ,SAAS3G,GACf,GAAInS,GAAIgZ,WAAW7G,EAKnB,OAHU,KAANnS,IACFA,EAAI2pB,SAASxX,IAER8P,MAAMjiB,GAAKmS,EAAQnS,GAK5BygB,OAAQ,SAAStO,EAAOkX,GACtB,GAAqB,OAAjBA,EACF,MAAOlX,EAET,KAIE,MAAOyX,MAAK/L,MAAM1L,EAAMgI,QAAQ,KAAM,MACtC,MAAM/W,GAEN,MAAO+O,KAIX0X,WAAY,SAAS1X,EAAOkX,GAC1B,MAAOA,IAiBXzsB,GAAMwsB,iBAAmBA,GAExBtC,SC9DH,SAAUlqB,GAIR,GAAIoqB,GAASpqB,EAAMoqB,OAIfC,IAEJA,GAAI6C,eACJ7C,EAAI8C,YAEJ9C,EAAI+C,QAAU,SAASC,EAAMhlB,GAC3B,IAAK,GAAIjF,KAAKiqB,GACZjD,EAAO/hB,EAAWglB,EAAKjqB,KAM3BpD,EAAMqqB,IAAMA,GAEXH,SCtBH,SAAUlqB,GAER,GAAIstB,IASFC,MAAO,SAASnB,EAAQhP,EAAMoQ,GAG5BC,SAASC,QAETtQ,EAAQA,GAAQA,EAAK9Z,OAAU8Z,GAAQA,EAEvC,IAAInS,GAAK,YACNtJ,KAAKyqB,IAAWA,GAAQ5F,MAAM7kB,KAAMyb,IACrCtY,KAAKnD,MAEHwpB,EAASqC,EAAUla,WAAWrI,EAAIuiB,GAClCnhB,sBAAsBpB,EAE1B,OAAOuiB,GAAUrC,GAAUA,GAE7BwC,YAAa,SAASxC,GACP,EAATA,EACFC,sBAAsBD,GAEtB5X,aAAa4X,IAWjByC,KAAM,SAASljB,EAAMsJ,EAAQ6Z,EAAQ/sB,EAAS6F,GAC5C,GAAIrC,GAAOupB,GAAUlsB,KACjBqS,EAASA,MACT8Z,EAAQ,GAAIjtB,aAAY6J,GAC1B5J,QAAsBiR,SAAZjR,EAAwBA,GAAU,EAC5C6F,WAA4BoL,SAAfpL,EAA2BA,GAAa,EACrDqN,OAAQA,GAGV,OADA1P,GAAKtD,cAAc8sB,GACZA,GASTC,UAAW,WACTpsB,KAAK4rB,MAAM,OAAQlQ,YASrB2Q,aAAc,SAASC,EAAMC,EAAKC,GAC5BD,GACFA,EAAIE,UAAU1hB,OAAOyhB,GAEnBF,GACFA,EAAKG,UAAU3hB,IAAI0hB,IASvBE,gBAAiB,SAASC,EAAMpsB,GAC9B,GAAIonB,GAAWnpB,SAASC,cAAc,WACtCkpB,GAASiF,UAAYD,CACrB,IAAIE,GAAW7sB,KAAK8sB,iBAAiBnF,EAKrC,OAJIpnB,KACFA,EAAQ6D,YAAc,GACtB7D,EAAQ1B,YAAYguB,IAEfA,IAKPE,EAAM,aAGNC,IAIJrB,GAAMsB,YAActB,EAAMC,MAI1BvtB,EAAMqqB,IAAI8C,SAASG,MAAQA,EAC3BttB,EAAM0uB,IAAMA,EACZ1uB,EAAM2uB,IAAMA,GAEXzE,SChHH,SAAUlqB,GAIR,GAAI6uB,GAAMrvB,OAAOsvB,aACbC,EAAe,MAGf9kB,GAEF8kB,aAAcA,EAEdC,iBAAkB,WAChB,GAAI/kB,GAAStI,KAAKstB,cAClBJ,GAAI5kB,QAAWpD,OAAOG,KAAKiD,GAAQ3G,OAAS,GAAMsM,QAAQif,IAAI,yBAA0BltB,KAAKutB,UAAWjlB,EAKxG,KAAK,GAAIS,KAAQT,GAAQ,CACvB,GAAIklB,GAAallB,EAAOS,EACxB/I,MAAKlB,iBAAiBiK,EAAM/I,KAAKO,QAAQktB,gBAAgBztB,KAAMA,KACNwtB,MAI7DE,eAAgB,SAASpH,EAAKmE,EAAQhP,GACpC,GAAI6K,EAAK,CACP4G,EAAI5kB,QAAU2F,QAAQ0f,MAAM,qBAAsBrH,EAAIiH,UAAW9C,EACjE,IAAInhB,GAAuB,kBAAXmhB,GAAwBA,EAASnE,EAAImE,EACjDnhB,IACFA,EAAGmS,EAAO,QAAU,QAAQ6K,EAAK7K,GAEnCyR,EAAI5kB,QAAU2F,QAAQ2f,WACtB9B,SAASC,UAOf1tB,GAAMqqB,IAAI8C,SAASljB,OAASA,GAE3BigB,SC3CH,SAAUlqB,GAIR,GAAI6N,IACF2hB,uBAAwB,WACtB,GAAIC,GAAK9tB,KAAK+tB,mBACd,KAAK,GAAI3oB,KAAK0oB,GACP9tB,KAAKguB,aAAa5oB,IACrBpF,KAAKiuB,aAAa7oB,EAAG0oB,EAAG1oB,KAK9B8oB,eAAgB,WAGd,GAAIluB,KAAKmuB,WACP,IAAK,GAA0C/vB,GAAtCsD,EAAE,EAAGosB,EAAG9tB,KAAKkM,WAAYxD,EAAEolB,EAAGnsB,QAAYvD,EAAE0vB,EAAGpsB,KAASgH,EAAFhH,EAAKA,IAClE1B,KAAKouB,oBAAoBhwB,EAAE+J,KAAM/J,EAAEwV,QAMzCwa,oBAAqB,SAASjmB,EAAMyL,GAGlC,GAAIzL,GAAOnI,KAAKquB,qBAAqBlmB,EACrC,IAAIA,EAAM,CAIR,GAAIyL,GAASA,EAAM0a,OAAOjwB,EAAMkwB,cAAgB,EAC9C,MAGF,IAAIzD,GAAe9qB,KAAKmI,GAEpByL,EAAQ5T,KAAK6qB,iBAAiBjX,EAAOkX,EAErClX,KAAUkX,IAEZ9qB,KAAKmI,GAAQyL,KAKnBya,qBAAsB,SAASlmB,GAC7B,GAAI8T,GAAQjc,KAAKmuB,YAAcnuB,KAAKmuB,WAAWhmB,EAE/C,OAAO8T,IAGT4O,iBAAkB,SAAS2D,EAAa1D,GACtC,MAAOzsB,GAAMwsB,iBAAiB2D,EAAa1D,IAE7C2D,eAAgB,SAAS7a,EAAOmX,GAC9B,MAAqB,YAAjBA,EACKnX,EAAQ,GAAKxD,OACM,WAAjB2a,GAA8C,aAAjBA,GACvB3a,SAAVwD,EACEA,EAFF,QAKT8a,2BAA4B,SAASvmB,GACnC,GAAI4iB,SAAsB/qB,MAAKmI,GAE3BwmB,EAAkB3uB,KAAKyuB,eAAezuB,KAAKmI,GAAO4iB,EAE9B3a,UAApBue,EACF3uB,KAAKiuB,aAAa9lB,EAAMwmB,GAME,YAAjB5D,GACT/qB,KAAK4uB,gBAAgBzmB,IAO3B9J,GAAMqqB,IAAI8C,SAAStf,WAAaA,GAE/Bqc,SCvFH,SAAUlqB,GAyBR,QAASwwB,GAAa/rB,EAAMC,GAC1B,MAAID,KAASC,EACK,IAATD,GAAc,EAAIA,IAAS,EAAIC,EACpC+rB,EAAYhsB,IAASgsB,EAAY/rB,IAC5B,EAEFD,IAASA,GAAQC,IAAUA,EAKpC,QAASgsB,GAAoB/hB,EAAU4G,GACrC,MAAcxD,UAAVwD,GAAoC,OAAb5G,EAClB4G,EAES,OAAVA,GAA4BxD,SAAVwD,EAAuB5G,EAAW4G,EApC9D,GAAIsZ,GAAMrvB,OAAOsvB,aAUb6B,GACF9M,OAAQ9R,OACRrH,KAAM,SACNZ,KAAMiI,OACNpD,SAAUoD,QAGR0e,EAAcnL,OAAOD,OAAS,SAAS9P,GACzC,MAAwB,gBAAVA,IAAsB8P,MAAM9P,IAqBxCmJ,GACFkS,uBAAwB,WACtB,GAAIzE,GAAKxqB,KAAKkvB,aACd,IAAI1E,GAAMA,EAAG7oB,OAAQ,CACnB,GAAIwtB,GAAInvB,KAAKovB,kBAAoB,GAAInI,mBAAiB,EACtDjnB,MAAKqvB,iBAAiBF,EAKtB,KAAK,GAAsB1tB,GAAlBC,EAAE,EAAGgH,EAAE8hB,EAAG7oB,OAAc+G,EAAFhH,IAASD,EAAE+oB,EAAG9oB,IAAKA,IAChDytB,EAAEtL,QAAQ7jB,KAAMyB,GAChBzB,KAAKsvB,kBAAkB7tB,EAAGzB,KAAKyB,GAAI,QAIzC8tB,qBAAsB,WAChBvvB,KAAKovB,mBACPpvB,KAAKovB,kBAAkB7I,KAAKvmB,KAAKwvB,sBAAuBxvB,OAG5DwvB,sBAAuB,SAASC,EAAWC,EAAWC,GACpD,GAAIxnB,GAAMsiB,EAAQmF,IAClB,KAAK,GAAIluB,KAAKguB,GAIZ,GAFAvnB,EAAOwnB,EAAM,EAAIjuB,EAAI,GACrB+oB,EAASzqB,KAAKsM,QAAQnE,GACV,CACV,GAAI0nB,GAAKH,EAAUhuB,GAAIouB,EAAKL,EAAU/tB,EAEtC1B,MAAKsvB,kBAAkBnnB,EAAM2nB,EAAID,GAC5BD,EAAOnF,KAEEra,SAAPyf,GAA2B,OAAPA,GAAwBzf,SAAP0f,GAA2B,OAAPA,KAC5DF,EAAOnF,IAAU,EAKjBzqB,KAAK+vB,aAAatF,GAASoF,EAAIC,EAAIpU,eAM7CsU,eAAgB,WACVhwB,KAAKovB,mBACPpvB,KAAKovB,kBAAkB3I,WAG3BwJ,iBAAkB,SAAS9nB,GACrBnI,KAAKkwB,QAAQ/nB,IACfnI,KAAK0uB,2BAA2BvmB,IAGpCmnB,kBAAmB,SAASnnB,EAAMyL,EAAO2Y,GAEvC,GAAI4D,GAAenwB,KAAKsM,QAAQnE,EAChC,IAAIgoB,IAEE3kB,MAAM4kB,QAAQ7D,KAChBW,EAAI5gB,SAAW2B,QAAQif,IAAI,mDAAoDltB,KAAKutB,UAAWplB,GAC/FnI,KAAKqwB,mBAAmBloB,EAAO,YAG7BqD,MAAM4kB,QAAQxc,IAAQ,CACxBsZ,EAAI5gB,SAAW2B,QAAQif,IAAI,iDAAkDltB,KAAKutB,UAAWplB,EAAMyL,EACnG,IAAItI,GAAW,GAAIglB,eAAc1c,EACjCtI,GAASib,KAAK,SAAS3S,EAAO2Y,GAC5BvsB,KAAK+vB,aAAaI,GAAe5D,KAChCvsB,MACHA,KAAKuwB,sBAAsBpoB,EAAO,UAAWmD,KAInDklB,yBAA0B,SAASroB,EAAMyL,EAAO5G,GAE9C,IAAI6hB,EAAajb,EAAO5G,KAGxBhN,KAAKiwB,iBAAiB9nB,EAAMyL,EAAO5G,GAE9ByjB,SAASC,kBAAd,CAGA,GAAIC,GAAW3wB,KAAK4wB,SACfD,KACHA,EAAW3wB,KAAK4wB,UAAY1rB,OAAO2rB,YAAY7wB,OAEjDgvB,EAAa9M,OAASliB,KACtBgvB,EAAa7mB,KAAOA,EACpB6mB,EAAahiB,SAAWA,EAExB2jB,EAASG,OAAO9B,KAElB+B,eAAgB,SAAS5oB,EAAM6oB,EAAYC,GACzC,GAAIC,GAAc/oB,EAAO,IACrBgpB,EAAqBhpB,EAAO,aAEhCnI,MAAKmxB,GAAqBH,CAC1B,IAAIhkB,GAAWhN,KAAKkxB,GAEhBte,EAAO5S,KACP4T,EAAQod,EAAWzK,KAAK,SAAS3S,EAAO5G,GAC1C4F,EAAKse,GAAetd,EACpBhB,EAAK4d,yBAAyBroB,EAAMyL,EAAO5G,IAG7C,IAAIikB,IAAcpC,EAAa7hB,EAAU4G,GAAQ,CAC/C,GAAIwd,GAAgBH,EAAUjkB,EAAU4G,EACnCib,GAAajb,EAAOwd,KACvBxd,EAAQwd,EACJJ,EAAWjN,UACbiN,EAAWjN,SAASnQ,IAI1B5T,KAAKkxB,GAAetd,EACpB5T,KAAKwwB,yBAAyBroB,EAAMyL,EAAO5G,EAE3C,IAAI1B,IACFob,MAAO,WACLsK,EAAWtK,QACX9T,EAAKue,GAAqB/gB,QAI9B,OADApQ,MAAKqvB,iBAAiB/jB,GACfA,GAET+lB,yBAA0B,WACxB,GAAKrxB,KAAKsxB,eAIV,IAAK,GAAI5vB,GAAI,EAAGA,EAAI1B,KAAKsxB,eAAe3vB,OAAQD,IAAK,CACnD,GAAIyG,GAAOnI,KAAKsxB,eAAe5vB,GAC3Bof,EAAiB9gB,KAAKoiB,SAASja,EACnC,KACE,GAAI6Y,GAAa4C,mBAAmB3C,cAAcH,GAC9CkQ,EAAahQ,EAAWQ,WAAWxhB,KAAMA,KAAKO,QAAQgxB,OAC1DvxB,MAAK+wB,eAAe5oB,EAAM6oB,GAC1B,MAAO5P,GACPnT,QAAQuN,MAAM,qCAAsC4F,MAI1DoQ,aAAc,SAAS9T,EAAUsT,EAAY1P,GAC3C,MAAIA,QACFthB,KAAK0d,GAAYsT,GAGZhxB,KAAK+wB,eAAerT,EAAUsT,EAAYjC,IAEnDgB,aAAc,SAAStF,EAAQhP,GAC7B,GAAInS,GAAKtJ,KAAKyqB,IAAWA,CACP,mBAAPnhB,IACTA,EAAGub,MAAM7kB,KAAMyb,IAGnB4T,iBAAkB,SAAS/jB,GACzB,MAAKtL,MAAKyxB,eAKVzxB,MAAKyxB,WAAWhxB,KAAK6K,QAJnBtL,KAAKyxB,YAAcnmB,KAOvBomB,eAAgB,WACd,GAAK1xB,KAAKyxB,WAAV,CAKA,IAAK,GADDE,GAAY3xB,KAAKyxB,WACZ/vB,EAAI,EAAGA,EAAIiwB,EAAUhwB,OAAQD,IAAK,CACzC,GAAI4J,GAAWqmB,EAAUjwB,EACrB4J,IAAqC,kBAAlBA,GAASob,OAC9Bpb,EAASob,QAIb1mB,KAAKyxB,gBAGPlB,sBAAuB,SAASpoB,EAAMmD,GACpC,GAAIsmB,GAAK5xB,KAAK6xB,kBAAoB7xB,KAAK6xB,mBACvCD,GAAGzpB,GAAQmD,GAEb+kB,mBAAoB,SAASloB,GAC3B,GAAIypB,GAAK5xB,KAAK6xB,eACd,OAAID,IAAMA,EAAGzpB,IACXypB,EAAGzpB,GAAMue,QACTkL,EAAGzpB,GAAQ,MACJ,GAHT,QAMF2pB,oBAAqB,WACnB,GAAI9xB,KAAK6xB,gBAAiB,CACxB,IAAK,GAAInwB,KAAK1B,MAAK6xB,gBACjB7xB,KAAKqwB,mBAAmB3uB,EAE1B1B,MAAK6xB,qBAYXxzB,GAAMqqB,IAAI8C,SAASzO,WAAaA,GAE/BwL,SClQH,SAAUlqB,GAIR,GAAI6uB,GAAMrvB,OAAOsvB,UAAY,EAGzB4E,GACFjF,iBAAkB,SAASnF,GAMzB,IAAK,GAJD4J,GAASvxB,KAAKuxB,SAAY5J,EAASqK,iBACnChyB,KAAKO,QAAQgxB,OACbU,EAAMtK,EAASuK,eAAelyB,KAAMuxB,GACpCI,EAAYM,EAAIE,UACXzwB,EAAI,EAAGA,EAAIiwB,EAAUhwB,OAAQD,IACpC1B,KAAKqvB,iBAAiBsC,EAAUjwB,GAElC,OAAOuwB,IAET9uB,KAAM,SAASgF,EAAM6oB,EAAY1P,GAC/B,GAAI5D,GAAW1d,KAAKquB,qBAAqBlmB,EACzC,IAAKuV,EAIE,CAEL,GAAIpS,GAAWtL,KAAKwxB,aAAa9T,EAAUsT,EAAY1P,EAUvD,OAPIwK,UAASsG,0BAA4B9mB,IACvCA,EAAStM,KAAOgyB,EAAWqB,MAC3BryB,KAAKsyB,eAAe5U,EAAUpS,IAE5BtL,KAAKkwB,QAAQxS,IACf1d,KAAK0uB,2BAA2BhR,GAE3BpS,EAbP,MAAOtL,MAAKuyB,WAAW7W,YAgB3B8W,aAAc,WACZxyB,KAAKyyB,oBAEPH,eAAgB,SAASnqB,EAAMmD,GAC7BtL,KAAKmyB,UAAYnyB,KAAKmyB,cACtBnyB,KAAKmyB,UAAUhqB,GAAQmD,GAKzBonB,eAAgB,WACT1yB,KAAK2yB,WACRzF,EAAI0F,QAAU3kB,QAAQif,IAAI,sBAAuBltB,KAAKutB,WACtDvtB,KAAK6yB,cAAgB7yB,KAAK+oB,IAAI/oB,KAAK6yB,cAAe7yB,KAAK8yB,UAAW,KAGtEA,UAAW,WACJ9yB,KAAK2yB,WACR3yB,KAAK0xB,iBACL1xB,KAAK8xB,sBACL9xB,KAAK2yB,UAAW,IAGpBI,gBAAiB,WACf,MAAI/yB,MAAK2yB,cACPzF,EAAI0F,QAAU3kB,QAAQC,KAAK,gDAAiDlO,KAAKutB,aAGnFL,EAAI0F,QAAU3kB,QAAQif,IAAI,uBAAwBltB,KAAKutB,gBACnDvtB,KAAK6yB,gBACP7yB,KAAK6yB,cAAgB7yB,KAAK6yB,cAAc5J,YAsB1C+J,EAAkB,gBAItB30B,GAAMkwB,YAAcyE,EACpB30B,EAAMqqB,IAAI8C,SAASuG,IAAMA,GAExBxJ,SCnGH,SAAUlqB,GA+NR,QAAS40B,GAAO/Q,GACd,MAAOA,GAAOqB,eAAe,eAK/B,QAAS2P,MAnOT,GAAIC,IACFD,aAAa,EACbnK,IAAK,SAASA,EAAK3hB,EAAU4hB,GAC3B,GAAmB,gBAARD,GAIT,MAAOR,SAAQQ,IAAIzhB,KAAKtH,KAAM+oB,EAAK3hB,EAAU4hB,EAH7C,IAAIvnB,GAAI,MAAQsnB,CAChB/oB,MAAKyB,GAAK8mB,QAAQQ,IAAIzhB,KAAKtH,KAAMA,KAAKyB,GAAI2F,EAAU4hB,IAKxD4B,QAAOrC,QAAQqC,MAEfwI,QAAS,aAITC,MAAO,aAEPC,gBAAiB,WACXtzB,KAAK4nB,kBAAoB5nB,KAAK4nB,iBAAiBvG,OACjDpT,QAAQC,KAAK,iBAAmBlO,KAAKutB,UAAY,wGAInDvtB,KAAKozB,UACLpzB,KAAKuzB,mBAGAvzB,KAAKwzB,cAAcC,mBAAqB51B,OAAOI,oBAClD+B,KAAKyyB,oBAITc,eAAgB,WACd,MAAIvzB,MAAK0zB,qBACPzlB,SAAQC,KAAK,2BAA4BlO,KAAKutB,YAGhDvtB,KAAK0zB,kBAAmB,EAExB1zB,KAAK2zB,eAEL3zB,KAAKivB,yBAELjvB,KAAKuvB,uBAELvvB,KAAK6tB,yBAEL7tB,KAAKkuB,qBAELluB,MAAKqtB,qBAEPoF,iBAAkB,WACZzyB,KAAK4zB,WAGT5zB,KAAK4zB,UAAW,EAChB5zB,KAAKqxB,2BAILrxB,KAAK6zB,kBAAkB7zB,KAAKmoB,WAI5BnoB,KAAK4uB,gBAAgB,cAErB5uB,KAAKqzB,UAKPS,iBAAkB,WAChB9zB,KAAK+yB,kBAED/yB,KAAK+zB,UACP/zB,KAAK+zB,WAGH/zB,KAAKg0B,aACPh0B,KAAKg0B,cAMFh0B,KAAKi0B,kBACRj0B,KAAKi0B,iBAAkB,EACnBj0B,KAAKk0B,UACPl0B,KAAK4rB,MAAM,cAIjBuI,iBAAkB,WACXn0B,KAAKo0B,gBACRp0B,KAAK0yB,iBAGH1yB,KAAKq0B,UACPr0B,KAAKq0B,WAGHr0B,KAAKs0B,UACPt0B,KAAKs0B,YAITC,oBAAqB,WACnBv0B,KAAK8zB,oBAGPU,iBAAkB,WAChBx0B,KAAKm0B,oBAGPM,wBAAyB,WACvBz0B,KAAK8zB,oBAGPY,qBAAsB,WACpB10B,KAAKm0B,oBAGPN,kBAAmB,SAAStuB,GACtBA,GAAKA,EAAEhF,UACTP,KAAK6zB,kBAAkBtuB,EAAE4iB,WACzB5iB,EAAEovB,iBAAiBrtB,KAAKtH,KAAMuF,EAAEhF,WAIpCo0B,iBAAkB,SAASC,GACzB,GAAIjN,GAAW3nB,KAAK60B,cAAcD,EAClC,IAAIjN,EAAU,CACZ,GAAI/c,GAAO5K,KAAK80B,mBAAmBnN,EACnC3nB,MAAK2zB,YAAYiB,EAAezsB,MAAQyC,IAI5CiqB,cAAe,SAASD,GACtB,MAAOA,GAAev0B,cAAc,aAGtCy0B,mBAAoB,SAASnN,GAC3B,GAAIA,EAAU,CAEZ,GAAI/c,GAAO5K,KAAKtB,mBAKZuzB,EAAMjyB,KAAK8sB,iBAAiBnF,EAMhC,OAJA/c,GAAK/L,YAAYozB,GAEjBjyB,KAAK+0B,gBAAgBnqB,EAAM+c,GAEpB/c,IAIXoqB,kBAAmB,SAASrN,EAAUsN,GACpC,GAAItN,EAAU,CAKZ3nB,KAAKk1B,gBAAkBl1B,IAKvB,IAAIiyB,GAAMjyB,KAAK8sB,iBAAiBnF,EAUhC,OARIsN,GACFj1B,KAAKm1B,aAAalD,EAAKgD,GAEvBj1B,KAAKnB,YAAYozB,GAGnBjyB,KAAK+0B,gBAAgB/0B,MAEdiyB,IAGX8C,gBAAiB,SAASnqB,GAExB5K,KAAKo1B,sBAAsBxqB,GAE3B9M,gBAAgB0K,SAASoC,IAG3BwqB,sBAAuB,SAASxqB,GAE9B,GAAIyqB,GAAIr1B,KAAKq1B,EAAIr1B,KAAKq1B,KAEtB,IAAIzqB,EAEF,IAAK,GAAsBnJ,GADvB+oB,EAAK5f,EAAKiC,iBAAiB,QACtBnL,EAAE,EAAGgH,EAAE8hB,EAAG7oB,OAAc+G,EAAFhH,IAASD,EAAE+oB,EAAG9oB,IAAKA,IAChD2zB,EAAE5zB,EAAEuQ,IAAMvQ,GAIhB6zB,yBAA0B,SAASntB,GAEpB,UAATA,GAA6B,UAATA,GACtBnI,KAAKouB,oBAAoBjmB,EAAMnI,KAAKgQ,aAAa7H,IAE/CnI,KAAKu1B,kBACPv1B,KAAKu1B,iBAAiB1Q,MAAM7kB,KAAM0b,YAGtC8Z,WAAY,SAAS7yB,EAAM8yB,GACzB,GAAInqB,GAAW,GAAIM,kBAAiB,SAAS+B,GAC3C8nB,EAASnuB,KAAKtH,KAAMsL,EAAUqC,GAC9BrC,EAASoqB,cACTvyB,KAAKnD,MACPsL,GAASgB,QAAQ3J,GAAOsJ,WAAW,EAAMD,SAAS,KAYtDknB,GAAYxsB,UAAYysB,EACxBA,EAAKwC,YAAczC,EAInB70B,EAAMu3B,KAAO1C,EACb70B,EAAM40B,OAASA,EACf50B,EAAMqqB,IAAI8C,SAAS2H,KAAOA,GAEzB5K,SC/OH,SAAUlqB,GA8ER,QAASyrB,GAAepjB,GACtB,MAAOA,GAAUyhB,UAGnB,QAAS0N,GAAYC,EAASh0B,GAC5B,GAAIqG,GAAO,GAAI4tB,GAAK,CAChBj0B,KACFqG,EAAOrG,EAAKyrB,UACZwI,EAAKj0B,EAAKksB,aAAa,MAEzB,IAAI1qB,GAAWwoB,SAASkK,UAAUC,kBAAkB9tB,EAAM4tB,EAC1D,OAAOjK,UAASkK,UAAUH,YAAYC,EAASxyB,GArFjD,GAII4yB,IAJMr4B,OAAOsvB,aAIW,WACxBgJ,EAAyB,aAEzBzyB,GACFwyB,sBAAuBA,EAMvBE,wBAAyB,WAEvB,GAAI/3B,GAAQ2B,KAAKq2B,gBACjB,IAAIh4B,IAAU2B,KAAKs2B,mBAAmBj4B,EAAO2B,KAAKutB,WAAY,CAG5D,IADA,GAAI7C,GAAQZ,EAAe9pB,MAAO81B,EAAU,GACrCpL,GAASA,EAAMnqB,SACpBu1B,GAAWpL,EAAMnqB,QAAQg2B,gBAAgBJ,GACzCzL,EAAQZ,EAAeY,EAErBoL,IACF91B,KAAKw2B,oBAAoBV,EAASz3B,KAIxCo4B,kBAAmB,SAAS7yB,EAAOuE,EAAM9J,GACvC,GAAIA,GAAQA,GAAS2B,KAAKq2B,iBAAkBluB,EAAOA,GAAQ,EAC3D,IAAI9J,IAAU2B,KAAKs2B,mBAAmBj4B,EAAO2B,KAAKutB,UAAYplB,GAAO,CACnE,GAAI2tB,GAAU,EACd,IAAIlyB,YAAiB4H,OACnB,IAAK,GAAyB5M,GAArB8C,EAAE,EAAGgH,EAAE9E,EAAMjC,OAAc+G,EAAFhH,IAAS9C,EAAEgF,EAAMlC,IAAKA,IACtDo0B,GAAWl3B,EAAEwF,YAAc,WAG7B0xB,GAAUlyB,EAAMQ,WAElBpE,MAAKw2B,oBAAoBV,EAASz3B,EAAO8J,KAG7CquB,oBAAqB,SAASV,EAASz3B,EAAO8J,GAG5C,GAFA9J,EAAQA,GAAS2B,KAAKq2B,iBACtBluB,EAAOA,GAAQ,GACV9J,EAAL,CAGIR,OAAOI,oBACT63B,EAAUD,EAAYC,EAASz3B,EAAMyD,MAEvC,IAAI8B,GAAQ5D,KAAKO,QAAQm2B,oBAAoBZ,EACzCK,EACJ5N,SAAQoO,kBAAkB/yB,EAAOvF,GAEjCA,EAAMu4B,aAAa52B,KAAKutB,UAAYplB,IAAQ,IAE9CkuB,eAAgB,SAAS1zB,GAGvB,IADA,GAAIlB,GAAIkB,GAAQ3C,KACTyB,EAAEnC,YACPmC,EAAIA,EAAEnC,UAER,OAAOmC,IAET60B,mBAAoB,SAASj4B,EAAO8J,GAElC,MADA9J,GAAMu4B,aAAev4B,EAAMu4B,iBACpBv4B,EAAMu4B,aAAazuB,IAsB9B9J,GAAMqqB,IAAI8C,SAAS9nB,OAASA,GAE3B6kB,SChGH,SAAUlqB,GAUR,QAASkC,GAAQ4H,EAAMzB,GACrB,GAAyB,IAArBgV,UAAU/Z,QAAwC,gBAAjB+Z,WAAU,GAAiB,CAC9DhV,EAAYyB,CACZ,IAAI0uB,GAASr4B,SAASs4B,cAGtB,IAFA3uB,EAAO0uB,GAAUA,EAAOv3B,YAAcu3B,EAAOv3B,WAAW0Q,aACpD6mB,EAAOv3B,WAAW0Q,aAAa,QAAU,IACxC7H,EACH,KAAM,sCAGV,GAAI4uB,EAAuB5uB,GACzB,KAAM,sDAAwDA,CAGhE6uB,GAAkB7uB,EAAMzB,GAExBuwB,EAAgB9uB,GAKlB,QAAS+uB,GAAoB/uB,EAAMgvB,GACjCC,EAAcjvB,GAAQgvB,EAKxB,QAASF,GAAgB9uB,GACnBivB,EAAcjvB,KAChBivB,EAAcjvB,GAAMkvB,0BACbD,GAAcjvB,IAgBzB,QAAS6uB,GAAkB7uB,EAAMzB,GAC/B,MAAO4wB,GAAiBnvB,GAAQzB,MAGlC,QAASqwB,GAAuB5uB,GAC9B,MAAOmvB,GAAiBnvB,GAzD1B,GAAIsgB,GAASpqB,EAAMoqB,OA+Bf2O,GA9BM/4B,EAAMqqB,QAiDZ4O,IAYJj5B,GAAM04B,uBAAyBA,EAC/B14B,EAAM64B,oBAAsBA,EAO5Br5B,OAAO0qB,QAAUhoB,EAKjBkoB,EAAOF,QAASlqB,EAOhB,IAAIk5B,GAAezL,SAAS0L,qBAC5B,IAAID,EACF,IAAK,GAAgCl1B,GAA5BX,EAAE,EAAGgH,EAAE6uB,EAAa51B,OAAc+G,EAAFhH,IAASW,EAAEk1B,EAAa71B,IAAKA,IACpEnB,EAAQskB,MAAM,KAAMxiB,IAIvBkmB,SC7FH,SAAUlqB,GAEV,GAAIW,IACFy4B,oBAAqB,SAAS90B,GAC5BmpB,SAAS4L,YAAYC,WAAWh1B,IAElCi1B,kBAAmB,WAEjB,GAAIC,GAAY73B,KAAKgQ,aAAa,cAAgB,GAC9CpF,EAAO,GAAIktB,KAAID,EAAW73B,KAAKwzB,cAAcuE,QACjD/3B,MAAK0G,UAAUsxB,YAAc,SAASC,EAAS9E,GAC7C,GAAI5wB,GAAI,GAAIu1B,KAAIG,EAAS9E,GAAQvoB,EACjC,OAAOrI,GAAE21B,OAMf75B,GAAMqqB,IAAI6C,YAAYvsB,KAAOA,GAE1BupB,SCpBH,SAAUlqB,GA0KR,QAAS85B,GAAmBC,EAAOC,GACjC,GAAIH,GAAO,GAAIJ,KAAIM,EAAMpoB,aAAa,QAASqoB,GAASH,IACxD,OAAO,YAAeA,EAAO,KAG/B,QAASvB,GAAkB/yB,EAAOvF,GAChC,GAAIuF,EAAO,CACLvF,IAAUG,WACZH,EAAQG,SAASY,MAEfvB,OAAOI,oBACTI,EAAQG,SAASY,KAOnB,IAAIkL,GAAQguB,EAAmB10B,EAAMQ,aACjCm0B,EAAO30B,EAAMoM,aAAakmB,EAC1BqC,IACFjuB,EAAM2jB,aAAaiI,EAAuBqC,EAI5C,IAAItD,GAAU52B,EAAMm6B,iBACpB,IAAIn6B,IAAUG,SAASY,KAAM,CAC3B,GAAIkE,GAAW,SAAW4yB,EAAwB,IAC9CuC,EAAKj6B,SAASY,KAAKyN,iBAAiBvJ,EACpCm1B,GAAG92B,SACLszB,EAAUwD,EAAGA,EAAG92B,OAAO,GAAG+2B,oBAG9Br6B,EAAM82B,aAAa7qB,EAAO2qB,IAI9B,QAASqD,GAAmBxC,EAASz3B,GACnCA,EAAQA,GAASG,SACjBH,EAAQA,EAAMI,cAAgBJ,EAAQA,EAAMm1B,aAC5C,IAAI5vB,GAAQvF,EAAMI,cAAc,QAEhC,OADAmF,GAAMQ,YAAc0xB,EACblyB,EAGT,QAAS+0B,GAAiBP,GACxB,MAAQA,IAASA,EAAMQ,YAAe,GAGxC,QAASC,GAAgBl2B,EAAMm2B,GAC7B,MAAIC,GACKA,EAAQzxB,KAAK3E,EAAMm2B,GAD5B,OAxNF,GACIpQ,IADM7qB,OAAOsvB,aACP9uB,EAAMqqB,IAAI8C,SAAS9nB,QACzBwyB,EAAwBxN,EAAIwN,sBAI5B8C,EAAiB,QACjBC,EAAuB,UACvBC,EAAiB,uBACjBC,EAAqB,SACrBC,EAAa,gBAEb11B,GAEF21B,WAAY,SAASjyB,GACnB,GAAIugB,GAAW3nB,KAAK60B,gBAChByE,EAAU3R,GAAY3nB,KAAKu5B,iBAC/B,IAAID,EAAS,CACXt5B,KAAKw5B,sBAAsBF,EAC3B,IAAI51B,GAAS1D,KAAKy5B,mBAAmBH,EACrC,IAAI51B,EAAO/B,OAAQ,CACjB,GAAI+3B,GAAc/R,EAAS6L,cAAcuE,OACzC,OAAOjM,UAAS6N,cAAcN,WAAW31B,EAAQg2B,EAAatyB,IAG9DA,GACFA,KAGJoyB,sBAAuB,SAAS5uB,GAE9B,IAAK,GAAsBhM,GAAGskB,EAD1BuV,EAAK7tB,EAAKiC,iBAAiBqsB,GACtBx3B,EAAE,EAAGgH,EAAE+vB,EAAG92B,OAAiB+G,EAAFhH,IAAS9C,EAAE65B,EAAG/2B,IAAKA,IACnDwhB,EAAIoV,EAAmBH,EAAmBv5B,EAAGoB,KAAKwzB,cAAcuE,SAC5D/3B,KAAKwzB,eACTxzB,KAAK45B,oBAAoB1W,EAAGtkB,GAC5BA,EAAEU,WAAWu6B,aAAa3W,EAAGtkB,IAGjCg7B,oBAAqB,SAASh2B,EAAOk2B,GACnC,IAAK,GAA0C17B,GAAtCsD,EAAE,EAAGosB,EAAGgM,EAAK5tB,WAAYxD,EAAEolB,EAAGnsB,QAAYvD,EAAE0vB,EAAGpsB,KAASgH,EAAFhH,EAAKA,IACnD,QAAXtD,EAAE+J,MAA6B,SAAX/J,EAAE+J,MACxBvE,EAAMqqB,aAAa7vB,EAAE+J,KAAM/J,EAAEwV,QAInC6lB,mBAAoB,SAAS7uB,GAC3B,GAAImvB,KACJ,IAAInvB,EAEF,IAAK,GAAsBhM,GADvB65B,EAAK7tB,EAAKiC,iBAAiBmsB,GACtBt3B,EAAE,EAAGgH,EAAE+vB,EAAG92B,OAAc+G,EAAFhH,IAAS9C,EAAE65B,EAAG/2B,IAAKA,IAC5C9C,EAAEwF,YAAY6X,MAAMgd,IACtBc,EAAUt5B,KAAK7B,EAIrB,OAAOm7B,IAOTC,cAAe,WACbh6B,KAAKi6B,cACLj6B,KAAKk6B,cACLl6B,KAAKm6B,qBACLn6B,KAAKo6B,uBAKPH,YAAa,WACXj6B,KAAKq6B,OAASr6B,KAAKs6B,UAAUpB,GAC7Bl5B,KAAKq6B,OAAOt2B,QAAQ,SAASnF,GACvBA,EAAEU,YACJV,EAAEU,WAAWC,YAAYX,MAI/Bs7B,YAAa,WACXl6B,KAAK0D,OAAS1D,KAAKs6B,UAAUtB,EAAiB,IAAMI,EAAa,KACjEp5B,KAAK0D,OAAOK,QAAQ,SAASnF,GACvBA,EAAEU,YACJV,EAAEU,WAAWC,YAAYX,MAa/Bu7B,mBAAoB,WAClB,GAAIE,GAASr6B,KAAKq6B,OAAO1uB,OAAO,SAAS/M,GACvC,OAAQA,EAAEovB,aAAaoL,KAErBE,EAAUt5B,KAAKu5B,iBACnB,IAAID,EAAS,CACX,GAAIxD,GAAU,EAId,IAHAuE,EAAOt2B,QAAQ,SAASq0B,GACtBtC,GAAW6C,EAAiBP,GAAS,OAEnCtC,EAAS,CACX,GAAIlyB,GAAQ00B,EAAmBxC,EAAS91B,KAAKwzB,cAC7C8F,GAAQnE,aAAavxB,EAAO01B,EAAQiB,eAI1CD,UAAW,SAASh3B,EAAUk3B,GAC5B,GAAIC,GAAQz6B,KAAK6M,iBAAiBvJ,GAAUo3B,QACxCpB,EAAUt5B,KAAKu5B,iBACnB,IAAID,EAAS,CACX,GAAIqB,GAAgBrB,EAAQzsB,iBAAiBvJ,GAAUo3B,OACvDD,GAAQA,EAAMrtB,OAAOutB,GAEvB,MAAOH,GAAUC,EAAM9uB,OAAO6uB,GAAWC,GAW3CL,oBAAqB,WACnB,GAAIx2B,GAAQ5D,KAAK46B,cAAczB,EAC/BxC,GAAkB/yB,EAAOpF,SAASY,OAEpCm3B,gBAAiB,SAASsE,GACxB,GAAI/E,GAAU,GAEVxyB,EAAW,IAAM81B,EAAa,IAAMyB,EAAkB,IACtDL,EAAU,SAAS57B,GACrB,MAAOi6B,GAAgBj6B,EAAG0E,IAExB+2B,EAASr6B,KAAKq6B,OAAO1uB,OAAO6uB,EAChCH,GAAOt2B,QAAQ,SAASq0B,GACtBtC,GAAW6C,EAAiBP,GAAS,QAGvC,IAAI10B,GAAS1D,KAAK0D,OAAOiI,OAAO6uB,EAIhC,OAHA92B,GAAOK,QAAQ,SAASH,GACtBkyB,GAAWlyB,EAAMQ,YAAc,SAE1B0xB,GAET8E,cAAe,SAASC,GACtB,GAAI/E,GAAU91B,KAAKu2B,gBAAgBsE,EACnC,OAAO76B,MAAK02B,oBAAoBZ,EAAS+E,IAE3CnE,oBAAqB,SAASZ,EAAS+E,GACrC,GAAI/E,EAAS,CACX,GAAIlyB,GAAQ00B,EAAmBxC,EAG/B,OAFAlyB,GAAMqqB,aAAaiI,EAAuBl2B,KAAKgQ,aAAa,QACxD,IAAM6qB,GACHj3B,KA2DT2B,EAAIokB,YAAYjjB,UAChBqyB,EAAUxzB,EAAEwzB,SAAWxzB,EAAEszB,iBAAmBtzB,EAAEu1B,uBAC3Cv1B,EAAEw1B,kBAIT18B,GAAMqqB,IAAI6C,YAAY7nB,OAASA,EAC/BrF,EAAMs4B,kBAAoBA,GAEzBpO,SCzOH,SAAUlqB,GAIR,GACIqqB,IADM7qB,OAAOsvB,aACP9uB,EAAMqqB,IAAI8C,SAASljB,QACzB8kB,EAAe1E,EAAI0E,aAGnB4N,MAEF,uBACA,qBACA,sBACA,cACA,aACA,kBACAj3B,QAAQ,SAASc,GACjBm2B,EAAoBn2B,EAAEse,eAAiBte,GAGzC,IAAIyD,IACF2yB,gBAAiB,WAEf,GAAIC,GAAYl7B,KAAK0G,UAAU4mB,cAE/BttB,MAAKm7B,sBAAsBD,IAE7BC,sBAAuB,SAASD,GAE9B,IAAK,GAAS98B,GAALsD,EAAE,EAAMtD,EAAE4B,KAAKkM,WAAWxK,GAAIA,IAEjC1B,KAAKo7B,eAAeh9B,EAAE+J,QAExB+yB,EAAUl7B,KAAKq7B,kBAAkBj9B,EAAE+J,OAAS/J,EAAEwV,MAAMgI,QAAQ,KAAM,IAC7DA,QAAQ,KAAM,IAAI0f,SAK7BF,eAAgB,SAAU35B,GACxB,MAAOA,IAAe,MAATA,EAAE,IAAyB,MAATA,EAAE,IAAyB,MAATA,EAAE,IAErD45B,kBAAmB,SAAS55B,GAC1B,MAAOA,GAAEiK,MAAM6vB,IAEjBC,eAAgB,SAAS74B,GACvB,KAAOA,EAAKrD,YAAY,CACtB,GAAIqD,EAAKuyB,gBACP,MAAOvyB,GAAKuyB,eAEdvyB,GAAOA,EAAKrD,WAEd,MAAOqD,GAAKb,MAEd2rB,gBAAiB,SAASgO,EAAYj8B,EAAQirB,GAC5C,GAAIniB,GAAStI,IACb,OAAO,UAAS6E,GACT42B,GAAeA,EAAWvI,cAC7BuI,EAAanzB,EAAOkzB,eAAeh8B,GAGrC,IAAIic,IAAQ5W,EAAGA,EAAEwN,OAAQxN,EAAEhD,cAC3B45B,GAAW/N,eAAe+N,EAAYhR,EAAQhP,KAGlDigB,oBAAqB,SAASjY,EAAYtb,GACxC,GAAKnI,KAAKo7B,eAAejzB,GAAzB,CAGA,GAAIwzB,GAAY37B,KAAKq7B,kBAAkBlzB,EACvCwzB,GAAYX,EAAoBW,IAAcA,CAE9C,IAAIrzB,GAAStI,IAEb,OAAO,UAASqhB,EAAO1e,EAAM2e,GAW3B,QAASsa,KACP,MAAO,MAAQnY,EAAa,MAX9B,GAAIoY,GAAUvzB,EAAOmlB,gBAAgBrd,OAAWzN,EAAM8gB,EAGtD,OAFA9gB,GAAK7D,iBAAiB68B,EAAWE,GAE7Bva,EAAJ,QAYEiF,KAAMqV,EACNpV,eAAgBoV,EAChBlV,MAAO,WACL/jB,EAAKoH,oBAAoB4xB,EAAWE,SAO1CN,EAAenO,EAAazrB,MAGhCtD,GAAMqqB,IAAI6C,YAAYjjB,OAASA,GAE9BigB,SC1GH,SAAUlqB,GAIR,GAAI0e,IACF+e,eAAgB,SAASp1B,GAEvB,GAAiCgX,GAA7BpR,EAAU5F,EAAU4F,OACxB,KAAK,GAAI7K,KAAKiF,GACQ,YAAhBjF,EAAEiK,MAAM,MACLY,IACHA,EAAY5F,EAAU4F,YAExBoR,EAAWjc,EAAEiK,MAAM,EAAG,IACtBY,EAAQoR,GAAYpR,EAAQoR,IAAajc,IAI/Cs6B,iBAAkB,SAASr1B,GAEzB,GAAIyoB,GAAIzoB,EAAU4F,OAClB,IAAI6iB,EAAG,CACL,GAAI6M,KACJ,KAAK,GAAIv6B,KAAK0tB,GAEZ,IAAK,GAAS8M,GADVC,EAAQz6B,EAAE06B,MAAM,KACXz6B,EAAE,EAAOu6B,EAAGC,EAAMx6B,GAAIA,IAC7Bs6B,EAASC,GAAM9M,EAAE1tB,EAGrBiF,GAAU4F,QAAU0vB,IAGxBI,qBAAsB,SAAS11B,GAC7B,GAAIA,EAAU4F,QAAS,CAErB,GAAIlO,GAAIsI,EAAUwoB,gBAClB,KAAK,GAAIztB,KAAKiF,GAAU4F,QAEtB,IAAK,GAAS2vB,GADVC,EAAQz6B,EAAE06B,MAAM,KACXz6B,EAAE,EAAOu6B,EAAGC,EAAMx6B,GAAIA,IAC7BtD,EAAEqC,KAAKw7B,GAIb,GAAIv1B,EAAU+kB,QAAS,CAErB,GAAIrtB,GAAIsI,EAAU21B,gBAClB,KAAK,GAAI56B,KAAKiF,GAAU+kB,QACtBrtB,EAAEqC,KAAKgB,GAGX,GAAIiF,EAAU0b,SAAU,CAEtB,GAAIhkB,GAAIsI,EAAU4qB,iBAClB,KAAK,GAAI7vB,KAAKiF,GAAU0b,SACtBhkB,EAAEqC,KAAKgB,KAIb66B,kBAAmB,SAAS51B,EAAWysB,GAErC,GAAI1H,GAAU/kB,EAAU+kB,OACpBA,KAEFzrB,KAAKu8B,kBAAkB9Q,EAAS/kB,EAAWysB,GAE3CzsB,EAAUynB,WAAanuB,KAAKw8B,aAAa/Q,KAS7C8Q,kBAAmB,SAASE,EAAqB/1B,GAE/CA,EAAUwpB,QAAUxpB,EAAUwpB,WAG9B,KAAK,GAAIzuB,KAAKg7B,GAAqB,CACjC,GAAIC,GAAqBD,EAAoBh7B,GACzCk7B,EAAW38B,KAAK48B,yBAAyBF,EAChBtsB,UAAzB1J,EAAUwpB,QAAQzuB,IAAiC2O,SAAbusB,IACxCj2B,EAAUwpB,QAAQzuB,GAAKk7B,GAEJvsB,SAAjB1J,EAAUjF,KACZiF,EAAUjF,GAAKzB,KAAK68B,mBAAmBH,MAI7CG,mBAAoB,SAASH,GAC3B,GAAI9oB,GAAsC,gBAAvB8oB,IACfA,EAAqBA,EAAmB9oB,MAAQ8oB,CACpD,OAAiBtsB,UAAVwD,EAAsBA,EAAQ,MAGvCgpB,yBAA0B,SAASF,GACjC,MAAkC,gBAAvBA,IACPA,GAAqDtsB,SAA/BssB,EAAmBxM,QACpCwM,EAAmBxM,QAF5B,QAKFsM,aAAc,SAASzf,GACrB,GAAI7Y,KACJ,KAAK,GAAIzC,KAAKsb,GACZ7Y,EAAIzC,EAAE0hB,eAAiB1hB,CAEzB,OAAOyC,IAET44B,uBAAwB,SAAS30B,GAC/B,GAAIuiB,GAAQ1qB,KAAK0G,UAEbwqB,EAAc/oB,EAAO,IACrBgpB,EAAqBhpB,EAAO,aAChCuiB,GAAMwG,GAAexG,EAAMviB,GAE3BjD,OAAOkjB,eAAesC,EAAOviB,GAC3BjB,IAAK,WACH,GAAI8pB,GAAahxB,KAAKmxB,EAItB,OAHIH,IACFA,EAAWvK,UAENzmB,KAAKkxB,IAEdtqB,IAAK,SAASgN,GACZ,GAAIod,GAAahxB,KAAKmxB,EACtB,IAAIH,EAEF,WADAA,GAAWjN,SAASnQ,EAItB,IAAI5G,GAAWhN,KAAKkxB,EAIpB,OAHAlxB,MAAKkxB,GAAetd,EACpB5T,KAAKwwB,yBAAyBroB,EAAMyL,EAAO5G,GAEpC4G,GAETyU,cAAc,KAGlB0U,wBAAyB,SAASr2B,GAChC,GAAI8jB,GAAK9jB,EAAU21B,aACnB,IAAI7R,GAAMA,EAAG7oB,OACX,IAAK,GAAsBF,GAAlBC,EAAE,EAAGgH,EAAE8hB,EAAG7oB,OAAkB+G,EAAFhH,IAASD,EAAE+oB,EAAG9oB,IAAKA,IACpD1B,KAAK88B,uBAAuBr7B,EAIhC,IAAI+oB,GAAK9jB,EAAU4qB,cACnB,IAAI9G,GAAMA,EAAG7oB,OACX,IAAK,GAAsBF,GAAlBC,EAAE,EAAGgH,EAAE8hB,EAAG7oB,OAAkB+G,EAAFhH,IAASD,EAAE+oB,EAAG9oB,IAAKA,IACpD1B,KAAK88B,uBAAuBr7B,IASpCpD,GAAMqqB,IAAI6C,YAAYxO,WAAaA,GAElCwL,SCnKH,SAAUlqB,GAIR,GAAI2+B,GAAuB,aACvBC,EAAmB,OAInB/wB,GAEFgxB,yBAA0B,SAASx2B,GAEjC1G,KAAKm9B,cAAcz2B,EAAW,aAE9B1G,KAAKm9B,cAAcz2B,EAAW,wBAGhC02B,kBAAmB,SAAS12B,EAAWysB,GAErC,GAAIjnB,GAAalM,KAAKgQ,aAAagtB,EACnC,IAAI9wB,EAMF,IAAK,GAAyBzK,GAJ1BgqB,EAAU/kB,EAAU+kB,UAAY/kB,EAAU+kB,YAE1CyQ,EAAQhwB,EAAWiwB,MAAMc,GAEpBv7B,EAAE,EAAGgH,EAAEwzB,EAAMv6B,OAAa+G,EAAFhH,EAAKA,IAKpC,GAHAD,EAAIy6B,EAAMx6B,GAAG45B,OAGT75B,GAAoB2O,SAAfqb,EAAQhqB,GAAkB,CAMjC,IACE,GAAI47B,GAAwBjtB,SAAZ+iB,EAAK1xB,GACrB,MAAMb,GACNy8B,GAAW,EAIRA,IACH5R,EAAQhqB,GAAK8mB,QAAQyE,OAQ/BsQ,6BAA8B,WAK5B,IAAK,GAAsBl/B,GAHvBm/B,EAAWv9B,KAAK0G,UAAUqnB,oBAE1BD,EAAK9tB,KAAKkM,WACLxK,EAAE,EAAGgH,EAAEolB,EAAGnsB,OAAc+G,EAAFhH,IAAStD,EAAE0vB,EAAGpsB,IAAKA,IAC5C1B,KAAKw9B,oBAAoBp/B,EAAE+J,QAC7Bo1B,EAASn/B,EAAE+J,MAAQ/J,EAAEwV,QAK3B4pB,oBAAqB,SAASr1B,GAC5B,OAAQnI,KAAKy9B,UAAUt1B,IAA6B,QAApBA,EAAKuD,MAAM,EAAE,IAI/C+xB,WACEt1B,KAAM,EACNu1B,UAAW,EACX/H,YAAa,EACbgI,SAAU,EACVC,UAAW,EACXC,gBAAiB,GAMrB3xB,GAAWuxB,UAAUT,GAAwB,EAI7C3+B,EAAMqqB,IAAI6C,YAAYrf,WAAaA,GAElCqc,SCxFH,SAAUlqB,GAGR,GAAIiK,GAASjK,EAAMqqB,IAAI6C,YAAYjjB,OAE/BipB,EAAS,GAAI3N,oBACb/C,EAAiB0Q,EAAO1Q,cAI5B0Q,GAAO1Q,eAAiB,SAAS4C,EAAYtb,EAAMxF,GACjD,MAAO2F,GAAOozB,oBAAoBjY,EAAYtb,EAAMxF,IAC7Cke,EAAevZ,KAAKiqB,EAAQ9N,EAAYtb,EAAMxF,GAIvD,IAAIovB,IACFR,OAAQA,EACRsD,cAAe,WACb,MAAO70B,MAAKK,cAAc,aAE5Bk5B,gBAAiB,WACf,GAAI5R,GAAW3nB,KAAK60B,eACpB,OAAOlN,IAAYmE,SAASyN,gBAAgB5R,IAE9CmW,uBAAwB,SAASnW,GAC3BA,IACFA,EAASqK,gBAAkBhyB,KAAKuxB,SAMtClzB,GAAMqqB,IAAI6C,YAAYwG,IAAMA,GAE3BxJ,SCnCH,SAAUlqB,GAoOR,QAAS0/B,GAAyBr3B,GAChC,IAAKxB,OAAOijB,UAAW,CACrB,GAAI6V,GAAW94B,OAAO4kB,eAAepjB,EACrCA,GAAUyhB,UAAY6V,EAClB/K,EAAO+K,KACTA,EAAS7V,UAAYjjB,OAAO4kB,eAAekU,KArOjD,GAAItV,GAAMrqB,EAAMqqB,IACZuK,EAAS50B,EAAM40B,OACfxK,EAASpqB,EAAMoqB,OAIf/hB,GAEF8B,SAAU,SAASL,EAAM81B,GAEvBj+B,KAAKk+B,eAAe/1B,EAAM81B,GAE1Bj+B,KAAKg3B,kBAAkB7uB,EAAM81B,GAE7Bj+B,KAAKm+B,sBAGPD,eAAgB,SAAS/1B,EAAM81B,GAE7B,GAAIG,GAAY//B,EAAM04B,uBAAuB5uB,GAEzCgrB,EAAOnzB,KAAKq+B,sBAAsBJ,EAEtCj+B,MAAKs+B,sBAAsBF,EAAWjL,GAEtCnzB,KAAK0G,UAAY1G,KAAKu+B,gBAAgBH,EAAWjL,GAEjDnzB,KAAKw+B,qBAAqBr2B,EAAM81B,IAGlCK,sBAAuB,SAAS53B,EAAWysB,GAGzCzsB,EAAUnG,QAAUP,KAEpBA,KAAKo9B,kBAAkB12B,EAAWysB,GAElCnzB,KAAKs8B,kBAAkB51B,EAAWysB,GAElCnzB,KAAK87B,eAAep1B,GAEpB1G,KAAK+7B,iBAAiBr1B,IAGxB63B,gBAAiB,SAAS73B,EAAWysB,GAEnCnzB,KAAKy+B,gBAAgB/3B,EAAWysB,EAEhC,IAAIuL,GAAU1+B,KAAK2+B,YAAYj4B,EAAWysB,EAG1C,OADA4K,GAAyBW,GAClBA,GAGTD,gBAAiB,SAAS/3B,EAAWysB,GAEnCnzB,KAAKm9B,cAAc,UAAWz2B,EAAWysB,GAEzCnzB,KAAKm9B,cAAc,UAAWz2B,EAAWysB,GAEzCnzB,KAAKm9B,cAAc,UAAWz2B,EAAWysB,GAEzCnzB,KAAKm9B,cAAc,aAAcz2B,EAAWysB,GAE5CnzB,KAAKm9B,cAAc,sBAAuBz2B,EAAWysB,GAErDnzB,KAAKm9B,cAAc,iBAAkBz2B,EAAWysB,IAIlDqL,qBAAsB,SAASr2B,EAAMy2B,GAEnC5+B,KAAKo8B,qBAAqBp8B,KAAK0G,WAC/B1G,KAAK+8B,wBAAwB/8B,KAAK0G,WAElC1G,KAAK89B,uBAAuB99B,KAAK60B,iBAEjC70B,KAAKg6B,gBAELh6B,KAAKy3B,oBAAoBz3B,MAEzBA,KAAKs9B,+BAELt9B,KAAKi7B,kBAKLj7B,KAAK43B,oBAED/5B,OAAOI,mBACT6tB,SAASkK,UAAU6I,YAAY7+B,KAAKu5B,kBAAmBpxB,EAAMy2B,GAG3D5+B,KAAK0G,UAAUo4B,kBACjB9+B,KAAK0G,UAAUo4B,iBAAiB9+B,OAMpCm+B,mBAAoB,WAClB,GAAIY,GAAS/+B,KAAKgQ,aAAa,cAC3B+uB,KACFlhC,OAAOkhC,GAAU/+B,KAAKg/B,OAK1BX,sBAAuB,SAASY,GAC9B,GAAIv4B,GAAY1G,KAAKk/B,kBAAkBD,EACvC,KAAKv4B,EAAW,CAEd,GAAIA,GAAYijB,YAAYE,mBAAmBoV,EAE/Cv4B,GAAY1G,KAAKm/B,cAAcz4B,GAE/B04B,EAAcH,GAAUv4B,EAE1B,MAAOA,IAGTw4B,kBAAmB,SAAS/2B,GAC1B,MAAOi3B,GAAcj3B,IAIvBg3B,cAAe,SAASz4B,GACtB,GAAIA,EAAUwsB,YACZ,MAAOxsB,EAET,IAAI24B,GAAWn6B,OAAOC,OAAOuB,EAkB7B,OAfAgiB,GAAI+C,QAAQ/C,EAAI8C,SAAU6T,GAa1Br/B,KAAKs/B,YAAYD,EAAU34B,EAAWgiB,EAAI8C,SAASuG,IAAK,QAEjDsN,GAGTC,YAAa,SAASD,EAAU34B,EAAWgiB,EAAKvgB,GAC9C,GAAI+hB,GAAS,SAASzO,GACpB,MAAO/U,GAAUyB,GAAM0c,MAAM7kB,KAAMyb,GAErC4jB,GAASl3B,GAAQ,WAEf,MADAnI,MAAKuyB,WAAarI,EACXxB,EAAIvgB,GAAM0c,MAAM7kB,KAAM0b,aAKjCyhB,cAAe,SAASh1B,EAAMzB,EAAWysB,GAEvC,GAAI/qB,GAAS1B,EAAUyB,MAEvBzB,GAAUyB,GAAQnI,KAAK2+B,YAAYv2B,EAAQ+qB,EAAKhrB,KAIlD6uB,kBAAmB,SAAS7uB,EAAMy2B,GAChC,GAAIW,IACF74B,UAAW1G,KAAK0G,WAGd84B,EAAgBx/B,KAAKy/B,kBAAkBb,EACvCY,KACFD,EAAK7B,QAAU8B,GAGjB7V,YAAYnhB,SAASL,EAAMnI,KAAK0G,WAEhC1G,KAAKg/B,KAAOxgC,SAASkhC,gBAAgBv3B,EAAMo3B,IAG7CE,kBAAmB,SAASt3B,GAC1B,GAAIA,GAAQA,EAAKrB,QAAQ,KAAO,EAC9B,MAAOqB,EAEP,IAAI5C,GAAIvF,KAAKk/B,kBAAkB/2B,EAC/B,OAAI5C,GAAEhF,QACGP,KAAKy/B,kBAAkBl6B,EAAEhF,QAAQm9B,SAD1C,SASF0B,IAIF14B,GAAUi4B,YADRz5B,OAAOijB,UACe,SAASjG,EAAQyd,GAIvC,MAHIzd,IAAUyd,GAAazd,IAAWyd,IACpCzd,EAAOiG,UAAYwX,GAEdzd,GAGe,SAASA,EAAQyd,GACvC,GAAIzd,GAAUyd,GAAazd,IAAWyd,EAAW,CAC/C,GAAIjB,GAAUx5B,OAAOC,OAAOw6B,EAC5Bzd,GAASuG,EAAOiW,EAASxc,GAE3B,MAAOA,IAoBXwG,EAAI6C,YAAY7kB,UAAYA,GAE3B6hB,SClPH,SAAUlqB,GAoIR,QAASuhC,GAAgBr/B,GACvB,MAAO/B,UAASyD,SAAS1B,GAAWs/B,EAAYC,EAGlD,QAASC,KACP,MAAOD,GAAYn+B,OAASm+B,EAAY,GAAKD,EAAU,GASzD,QAASG,GAAiB54B,GACxB64B,EAAMC,aAAc,EACpBC,eAAe9M,OAAQ,EACvB+M,YAAYC,iBAAiB,WAC3BJ,EAAMK,iBAAiBl5B,GACvB64B,EAAMC,aAAc,EACpBD,EAAMM,UAjIV,GAAIN,IAEFjX,KAAM,SAASzoB,EAASggC,EAAOpX,GAC7B,GAAIqX,GAAuC,KAA1BxgC,KAAK8G,QAAQvG,IACM,KAAhCkgC,EAAW35B,QAAQvG,EAMvB,OALIigC,KACFxgC,KAAK8K,IAAIvK,GACTA,EAAQmgC,QAAUH,EAClBhgC,EAAQogC,KAAOxX,GAEiB,IAA1BnpB,KAAK8G,QAAQvG,IAEvBuK,IAAK,SAASvK,GAEZq/B,EAAgBr/B,GAASE,KAAKF,IAEhCuG,QAAS,SAASvG,GAChB,GAAImB,GAAIk+B,EAAgBr/B,GAASuG,QAAQvG,EAKzC,OAJImB,IAAK,GAAKlD,SAASyD,SAAS1B,KAC9BmB,GAAM0+B,YAAYQ,WAAaR,YAAY/M,MACzCyM,EAAYn+B,OAAS,KAElBD,GAGTynB,GAAI,SAAS5oB,GACX,GAAIsgC,GAAU7gC,KAAK+K,OAAOxK,EACtBsgC,KACF7gC,KAAK8gC,gBAAgBD,GACrB7gC,KAAKugC,UAGTx1B,OAAQ,SAASxK,GACf,GAAImB,GAAI1B,KAAK8G,QAAQvG,EACrB,IAAU,IAANmB,EAIJ,MAAOk+B,GAAgBr/B,GAASwgC,SAElCR,MAAO,WAEL,GAAIhgC,GAAUP,KAAKghC,aAInB,OAHIzgC,IACFA,EAAQmgC,QAAQp5B,KAAK/G,GAEnBP,KAAKihC,YACPjhC,KAAKqzB,SACE,GAFT,QAKF2N,YAAa,WACX,MAAOjB,MAETkB,SAAU,WACR,OAAQjhC,KAAKkgC,aAAelgC,KAAKkhC,WAEnCA,QAAS,WACP,OAAQpB,EAAYn+B,SAAWk+B,EAAUl+B,QAE3Cm/B,gBAAiB,SAASvgC,GACxBkgC,EAAWhgC,KAAKF,IAElBwrB,MAAO,WAEL,IADA,GAAIxrB,GACGkgC,EAAW9+B,QAChBpB,EAAUkgC,EAAWM,QACrBxgC,EAAQogC,KAAKr5B,KAAK/G,GAClBA,EAAQmgC,QAAUngC,EAAQogC,KAAO,MAGrCtN,MAAO,WACLrzB,KAAK+rB,QAODoU,eAAe9M,SAAU,IAC3B8M,eAAegB,oBAAoB3iC,UACnC2hC,eAAe9M,OAAQ,GAEzBvH,SAASC,QACTrhB,sBAAsB1K,KAAKohC,sBAE7Bd,iBAAkB,SAASl5B,GACrBA,GACFi6B,EAAe5gC,KAAK2G,IAGxBg6B,oBAAqB,WACnB,GAAIC,EAEF,IADA,GAAI/3B,GACG+3B,EAAe1/B,SACpB2H,EAAK+3B,EAAeN;EAK1Bb,aAAa,GAGXO,KAEAX,KACAD,KACAwB,IAYJ7iC,UAASM,iBAAiB,qBAAsB,WAC9CqhC,eAAe9M,OAAQ,IAczBh1B,EAAM4hC,MAAQA,EACd5hC,EAAM2hC,iBAAmBA,GACxBzX,SC/JH,SAAUlqB,GAIR,QAASijC,GAAeC,EAAmBn6B,GACrCm6B,GACF/iC,SAASY,KAAKP,YAAY0iC,GAC1BvB,EAAiB54B,IACRA,GACTA,IAIJ,QAASo6B,GAAWC,EAAMr6B,GACxB,GAAIq6B,GAAQA,EAAK9/B,OAAQ,CAErB,IAAK,GAAwB+/B,GAAK5H,EAD9B6H,EAAOnjC,SAASojC,yBACXlgC,EAAE,EAAGgH,EAAE+4B,EAAK9/B,OAAsB+G,EAAFhH,IAASggC,EAAID,EAAK//B,IAAKA,IAC9Do4B,EAAOt7B,SAASC,cAAc,QAC9Bq7B,EAAK+H,IAAM,SACX/H,EAAK5B,KAAOwJ,EACZC,EAAK9iC,YAAYi7B,EAEnBwH,GAAeK,EAAMv6B,OACdA,IACTA,IAtBJ,GAAI44B,GAAmB3hC,EAAM2hC,gBA2B7B3hC,GAAMyjC,OAASN,EACfnjC,EAAMijC,eAAiBA,GAEtB/Y,SChCH,SAAUlqB,GAuHR,QAAS0jC,GAAa55B,GACpB,MAAOnK,SAAQ2rB,YAAYE,mBAAmB1hB,IAGhD,QAAS65B,GAAY75B,GACnB,MAAQA,IAAQA,EAAKrB,QAAQ,MAAQ,EAxHvC,GAAI2hB,GAASpqB,EAAMoqB,OACfC,EAAMrqB,EAAMqqB,IACZuX,EAAQ5hC,EAAM4hC,MACdD,EAAmB3hC,EAAM2hC,iBACzBjJ,EAAyB14B,EAAM04B,uBAC/BG,EAAsB74B,EAAM64B,oBAI5BxwB,EAAY+hB,EAAOvjB,OAAOC,OAAOwkB,YAAYjjB,YAE/C4sB,gBAAiB,WACXtzB,KAAKgQ,aAAa,SACpBhQ,KAAKiiC,QAITA,KAAM,WAEJjiC,KAAKmI,KAAOnI,KAAKgQ,aAAa,QAC9BhQ,KAAK09B,QAAU19B,KAAKgQ,aAAa,WAEjChQ,KAAKkiC,gBAELliC,KAAKq3B,qBAGPA,kBAAmB,WACdr3B,KAAKmiC,YACJniC,KAAKk3B,oBAAoBl3B,KAAKmI,OAC9BnI,KAAKoiC,mBACLpiC,KAAKqiC,uBAKTpC,EAAM9W,GAAGnpB,OAKXsiC,UAAW,WAILN,EAAYhiC,KAAK09B,WAAaqE,EAAa/hC,KAAK09B,UAClDzvB,QAAQC,KAAK,sGACuClO,KAAKmI,KACrDnI,KAAK09B,SAEX19B,KAAKwI,SAASxI,KAAKmI,KAAMnI,KAAK09B,SAC9B19B,KAAKmiC,YAAa,GAIpBjL,oBAAqB,SAAS/uB,GAC5B,MAAK4uB,GAAuB5uB,GAA5B,QAEE+uB,EAAoB/uB,EAAMnI,MAE1BA,KAAKuiC,eAAep6B,IAEb,IAIXo6B,eAAgB,SAASp6B,GAEvB,GAAInI,KAAKguB,aAAa,cAAgBhuB,KAAK29B,SAQzC,GAPA39B,KAAK29B,UAAW,EAOZ9/B,OAAOsiC,iBAAmBA,eAAeS,UAC3CrY,QAAQpgB,OACH,CACL,GAAI0uB,GAASr4B,SAASC,cAAc,SACpCo4B,GAAOzyB,YAAc,YAAe+D,EAAO,MAC3CnI,KAAKnB,YAAYg4B,KAKvBwL,oBAAqB,WACnB,MAAOriC,MAAKwiC,iBAMdJ,gBAAiB,WACf,MAAOnC,GAAMjX,KAAKhpB,KAAMA,KAAKq3B,kBAAmBr3B,KAAKsiC,YAGvDJ,cAAe,WACbliC,KAAKwiC,iBAAkB,EACvBxiC,KAAKq5B,WAAW,WACdr5B,KAAKwiC,iBAAkB,EACvBxiC,KAAKq3B,qBACLl0B,KAAKnD,SASX0oB,GAAI+C,QAAQ/C,EAAI6C,YAAa7kB,GAc7Bs5B,EAAiB,WACfxhC,SAASikC,KAAK7T,gBAAgB,cAC9BpwB,SAASa,cACP,GAAIH,aAAY,iBAAkBC,SAAS,OAM/CX,SAASkhC,gBAAgB,mBAAoBh5B,UAAWA,KAEvD6hB,SC/GH,WAEE,GAAIhoB,GAAU/B,SAASC,cAAc,kBACrC8B,GAAQ0tB,aAAa,OAAQ,gBAC7B1tB,EAAQ0tB,aAAa,UAAW,YAChC1tB,EAAQ0hC,OAER1Z,QAAQ,gBAEN+K,gBAAiB,WACftzB,KAAKuxB,OAASvxB,KAAKgyB,gBAAkBhyB,KAAK0iC,aAG1Cna,QAAQyX,iBAAiB,WACvBhgC,KAAKqhB,MAAQrhB,KACbA,KAAKiuB,aAAa,OAAQ,IAG1BjuB,KAAK4rB,MAAM,WAIT5rB,KAAKo1B,sBAAsBp1B,KAAKV,YAGhCU,KAAKisB,KAAK,qBAEZ9oB,KAAKnD,QAGT0iC,WAAY,WACV,GAAIp6B,GAASpD,OAAOC,OAAOojB,QAAQG,IAAI6C,YAAYjjB,QAC/CsK,EAAO5S,IACXsI,GAAOkzB,eAAiB,WAAa,MAAO5oB,GAAKyO,MAEjD,IAAIkQ,GAAS,GAAI3N,oBACb/C,EAAiB0Q,EAAO1Q,cAK5B,OAJA0Q,GAAO1Q,eAAiB,SAAS4C,EAAYtb,EAAMxF,GACjD,MAAO2F,GAAOozB,oBAAoBjY,EAAYtb,EAAMxF,IAC7Cke,EAAevZ,KAAKiqB,EAAQ9N,EAAYtb,EAAMxF,IAEhD4uB","sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {\n  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)\n};\nPolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (!scope.hasSDPolyfill && pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findScrollAxis: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n        }\n      } else {\n        n = scope.wrap(inEvent.currentTarget);\n        while(n) {\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n","/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'body /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  var hasSDPolyfill = scope.hasSDPolyfill;\n  var wrap = scope.wrap;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      this.gestures.push(source);\n    },\n    register: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          fn = g[e.type];\n          if (fn) {\n            fn.call(g, e);\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = function(root) {\n    dispatcher.register(root);\n  };\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n  scope.wrap = wrap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.wrap(scope.findTarget(inEvent));\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  // maybe one day...\n  // var CAN_USE_GLOBAL = ATTRIB in document.head.style;\n  var CAN_USE_GLOBAL = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: scope.wrap(this.currentTouchEvent.target)\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = scope.wrap(this.findTarget(inTouch, id));\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = scope.targetFinding.findScrollAxis(inEvent);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (CAN_USE_GLOBAL) {\n        this.processTouches(inEvent, this.move);\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.wrap(scope.findTarget(inPointer));\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!CAN_USE_GLOBAL) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (window.navigator.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  dispatcher.register(document);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       });\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n","/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.3.3-0e73963'\n};\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\n  */\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail || {};\n      var event = new CustomEvent(type, {\n        bubbles: (bubbles !== undefined ? bubbles : true), \n        cancelable: (cancelable !== undefined ? cancelable : true), \n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        this.addEventListener(type, this.element.getEventHandler(this, this,\n                                                                 methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      // TODO (sorvell): temporarily open observer when created\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up polymer gestures\n      PolymerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (window.ShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      scope._scopeStyles[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      scope._scopeStyles = scope._scopeStyles || {};\n      return scope._scopeStyles[name];\n    }\n  };\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (window.ShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        node.addEventListener(eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            node.removeEventListener(eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    // sync prototype to property descriptors;\n    // desriptor format contains default value and optionally a\n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    //\n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor);\n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' &&\n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // if the user hasn't specified a value, we want to use the\n          // default, unless a superclass has already chosen one\n          if (n && publish[n] === undefined) {\n            // TODO(sjmiles): querying native properties on IE11 (and possibly\n            // on other browsers) throws an exception because there is no actual\n            // instance.\n            // In fact, trying to publish native properties is known bad for this\n            // and other reasons, and we need to solve this problem writ large.\n            try {\n              var hasValue = (base[n] !== undefined);\n            } catch(x) {\n              hasValue = false;\n            }\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            if (!hasValue) {\n              publish[n] = Polymer.nob;\n            }\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && Platform.templateContent(template);\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (window.ShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      var shouldAdd = (this.indexOf(element) === -1 && \n          flushQueue.indexOf(element) === -1);\n      if (shouldAdd) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\n    },\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n    flush: function() {\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__go.call(element);\n        element.__check = element.__go = null;\n      }\n    },\n    ready: function() {\n      this.flush();\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    waitToReady: true\n  };\n\n  var flushQueue = [];\n\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      // TODO(sorvell): ends up calling '_register' by virtue\n      // of `waitingForQueue` (see below)\n      queue.go(this);\n    },\n\n    // TODO(sorvell): refactor, this method is private-ish, but it's being\n    // called by the queue object.\n    _register: function() {\n      //console.log('registering', this.name);\n      //console.group('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n      //console.groupEnd();\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // TODO(sorvell): CustomElements polyfill awareness:\n        // noscript elements should upgrade in logical order\n        // script injection ensures this under native custom elements;\n        // under imports + ce polyfills, scripts run before upgrades.\n        // dependencies should be ready at upgrade time so register\n        // prototype at this time.\n        if (window.CustomElements && !CustomElements.useNative) {\n          Polymer(name);\n        } else {\n          var script = document.createElement('script');\n          script.textContent = 'Polymer(\\'' + name + '\\');';\n          this.appendChild(script);\n        }\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.wait(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n"]}
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/use_native_dartium_shadowdom.js b/pkg/polymer/lib/src/js/use_native_dartium_shadowdom.js
deleted file mode 100644
index 7b492b7..0000000
--- a/pkg/polymer/lib/src/js/use_native_dartium_shadowdom.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Prevent polyfilled JS Shadow DOM in Dartium
-// We need this if we want Dart code to be able to interoperate with Polymer.js
-// code that also uses Shadow DOM.
-// TODO(jmesserly): we can remove this code once platform.js is correctly
-// feature detecting Shadow DOM in Dartium.
-if (navigator.userAgent.indexOf('(Dart)') !== -1) {
-  window.Platform = window.Platform || {};
-  Platform.flags = Platform.flags || {};
-  Platform.flags.shadow = 'native';
-
-  // Note: Dartium 34 hasn't turned on the unprefixed Shadow DOM
-  // (this happens in Chrome 35), so unless "enable experimental platform
-  // features" is enabled, things will break. So we expose them as unprefixed
-  // names instead.
-  var proto = Element.prototype;
-  if (!proto.createShadowRoot) {
-    proto.createShadowRoot = proto.webkitCreateShadowRoot;
-
-    Object.defineProperty(proto, 'shadowRoot', {
-      get: function() {
-        return this.webkitShadowRoot;
-      },
-      set: function(value) {
-        this.webkitShadowRoot = value;
-      },
-      configurable: true
-    });
-  }
-}
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index 5737200..33a6a68 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -61,7 +61,7 @@
         'is correct. If you are using pub-serve, you may need to restart it.';
   }
 
-  Polymer.registerSync('d-auto-binding', AutoBindingElement,
+  Polymer.registerSync('auto-binding-dart', AutoBindingElement,
       extendsTag: 'template');
 
   for (var initializer in initializers) {
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 4deef24..990a58b 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.11.0-dev.3
+version: 0.11.0+3
 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
@@ -19,8 +19,8 @@
   polymer_expressions: '>=0.11.0 <0.12.0'
   smoke: '>=0.1.0 <0.2.0'
   source_maps: '>=0.9.0 <0.10.0'
-  template_binding: '>=0.11.0-dev <0.12.0'
-  web_components: '>=0.3.5-dev <0.4.0'
+  template_binding: '>=0.11.0 <0.12.0'
+  web_components: '>=0.3.5 <0.4.0'
   yaml: '>=0.9.0 <2.0.0'
 dev_dependencies:
   unittest: '>=0.10.0 <0.11.0'
diff --git a/pkg/polymer/test/auto_binding_test.html b/pkg/polymer/test/auto_binding_test.html
index b724b0c..ba1f13f 100644
--- a/pkg/polymer/test/auto_binding_test.html
+++ b/pkg/polymer/test/auto_binding_test.html
@@ -17,11 +17,11 @@
 
     <div>top</div>
 
-    <template id="one" is="d-auto-binding">
+    <template id="one" is="auto-binding-dart">
       <h2 id="h" on-tap="{{eventAction}}">{{greeting}}</h2>
     </template>
 
-    <template id="two" is="d-auto-binding">
+    <template id="two" is="auto-binding-dart">
       <div>Say something: <input value="{{value}}"></div>
       <div>You said: {{value}}</div>
     </template>
diff --git a/pkg/scheduled_test/CHANGELOG.md b/pkg/scheduled_test/CHANGELOG.md
index a745c63..953019f 100644
--- a/pkg/scheduled_test/CHANGELOG.md
+++ b/pkg/scheduled_test/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 0.11.0+7
+
+* A `nothing()` descriptor will fail if a broken symlink is present.
+
+## 0.11.0+6
+
+* Use `http_multi_server` to bind to both the IPv4 and IPv6 loopback addresses
+  for scheduled_test.
+
 ## 0.11.0+5
 
 * Widen the version constraint for `stack_trace`.
diff --git a/pkg/scheduled_test/lib/scheduled_server.dart b/pkg/scheduled_test/lib/scheduled_server.dart
index e04817a..2d9aba0 100644
--- a/pkg/scheduled_test/lib/scheduled_server.dart
+++ b/pkg/scheduled_test/lib/scheduled_server.dart
@@ -8,6 +8,7 @@
 import 'dart:collection';
 import 'dart:io';
 
+import 'package:http_multi_server/http_multi_server.dart';
 import 'package:shelf/shelf.dart' as shelf;
 import 'package:shelf/shelf_io.dart' as shelf_io;
 
@@ -39,16 +40,17 @@
   ScheduledServer._(this._server, this.description);
 
   /// Creates a new server listening on an automatically-allocated port on
-  /// 127.0.0.1. [description] is used to refer to the server in debugging
-  /// messages.
+  /// localhost (both IPv4 and IPv6, if available).
+  ///
+  /// [description] is used to refer to the server in debugging messages.
   factory ScheduledServer([String description]) {
     var id = _count++;
     if (description == null) description = 'scheduled server $id';
 
     var scheduledServer;
     scheduledServer = new ScheduledServer._(schedule(() {
-      return shelf_io.serve(scheduledServer._handleRequest, "127.0.0.1", 0)
-          .then((server) {
+      return HttpMultiServer.loopback(0).then((server) {
+        shelf_io.serveRequests(server, scheduledServer._handleRequest);
         currentSchedule.onComplete.schedule(() => server.close(force: true));
         return server;
       });
@@ -60,7 +62,7 @@
   Future<int> get port => _server.then((s) => s.port);
 
   /// The base URL of the server, including its port.
-  Future<Uri> get url => port.then((p) => Uri.parse("http://127.0.0.1:$p"));
+  Future<Uri> get url => port.then((p) => Uri.parse("http://localhost:$p"));
 
   /// Schedules [handler] to handle a request to the server with [method] and
   /// [path]. The schedule will wait until an HTTP request is received. If that
diff --git a/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
index 8303117..a60840f 100644
--- a/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
@@ -31,6 +31,8 @@
       fail("Expected nothing to exist at '$fullPath', but found a file.");
     } else if (new Directory(fullPath).existsSync()) {
       fail("Expected nothing to exist at '$fullPath', but found a directory.");
+    } else if (new Link(fullPath).existsSync()) {
+      fail("Expected nothing to exist at '$fullPath', but found a link.");
     } else {
       return;
     }
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 9eb8ec1..bc99431 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: scheduled_test
-version: 0.11.0+5
+version: 0.11.0+7
 author: Dart Team <misc@dartlang.org>
 description: >
   A package for writing readable tests of asynchronous behavior.
@@ -12,6 +12,7 @@
 environment:
   sdk: '>=1.3.0 <2.0.0'
 dependencies:
+  http_multi_server: '>=1.0.0 <2.0.0'
   http: '>=0.9.0 <0.12.0'
   path: '>=0.9.0 <2.0.0'
   shelf: '>=0.4.0 <0.6.0'
diff --git a/pkg/scheduled_test/test/descriptor/nothing_test.dart b/pkg/scheduled_test/test/descriptor/nothing_test.dart
index 34d02e9..68acccb 100644
--- a/pkg/scheduled_test/test/descriptor/nothing_test.dart
+++ b/pkg/scheduled_test/test/descriptor/nothing_test.dart
@@ -42,45 +42,38 @@
     });
   });
 
-  expectTestsPass("nothing().validate() fails if there's a file", () {
-    var errors;
-    test('test 1', () {
-      scheduleSandbox();
+  expectTestFails("nothing().validate() fails if there's a file", () {
+    scheduleSandbox();
+    d.file('name.txt', 'contents').create();
+    d.nothing('name.txt').validate();
+  }, (errors) {
+    expect(errors.single, new isInstanceOf<ScheduleError>());
+    expect(errors.single.error.toString(),
+        matches(r"^Expected nothing to exist at '[^']+[\\/]name.txt', but "
+                r"found a file\.$"));
+  });
 
-      currentSchedule.onException.schedule(() {
-        errors = currentSchedule.errors;
-      });
+  expectTestFails("nothing().validate() fails if there's a directory", () {
+    scheduleSandbox();
+    d.dir('dir').create();
+    d.nothing('dir').validate();
+  }, (errors) {
+    expect(errors.single, new isInstanceOf<ScheduleError>());
+    expect(errors.single.error.toString(),
+        matches(r"^Expected nothing to exist at '[^']+[\\/]dir', but found a "
+            r"directory\.$"));
+  });
 
-      d.file('name.txt', 'contents').create();
-      d.nothing('name.txt').validate();
+  expectTestFails("nothing().validate() fails if there's a broken link", () {
+    scheduleSandbox();
+    schedule(() {
+      new Link(path.join(sandbox, 'link')).createSync('nonexistent');
     });
-
-    test('test 2', () {
-      expect(errors.single, new isInstanceOf<ScheduleError>());
-      expect(errors.single.error.toString(),
-          matches(r"^Expected nothing to exist at '[^']+[\\/]name.txt', but "
-                  r"found a file\.$"));
-    });
-  }, passing: ['test 2']);
-
-  expectTestsPass("nothing().validate() fails if there's a directory", () {
-    var errors;
-    test('test 1', () {
-      scheduleSandbox();
-
-      currentSchedule.onException.schedule(() {
-        errors = currentSchedule.errors;
-      });
-
-      d.dir('dir').create();
-      d.nothing('dir').validate();
-    });
-
-    test('test 2', () {
-      expect(errors.single, new isInstanceOf<ScheduleError>());
-      expect(errors.single.error.toString(),
-          matches(r"^Expected nothing to exist at '[^']+[\\/]dir', but found a "
-              r"directory\.$"));
-    });
-  }, passing: ['test 2']);
+    d.nothing('link').validate();
+  }, (errors) {
+    expect(errors.single, new isInstanceOf<ScheduleError>());
+    expect(errors.single.error.toString(),
+        matches(r"^Expected nothing to exist at '[^']+[\\/]link', but found "
+            r"a link\.$"));
+  });
 }
diff --git a/pkg/shelf/lib/src/message.dart b/pkg/shelf/lib/src/message.dart
index 1522e13..514eb48 100644
--- a/pkg/shelf/lib/src/message.dart
+++ b/pkg/shelf/lib/src/message.dart
@@ -37,6 +37,12 @@
   /// This can be read via [read] or [readAsString].
   final Stream<List<int>> _body;
 
+  /// This boolean indicates whether [_body] has been read.
+  ///
+  /// After calling [read], or [readAsString] (which internally calls [read]),
+  /// this will be `true`.
+  bool _bodyWasRead = false;
+
   /// Creates a new [Message].
   ///
   /// If [headers] is `null`, it is treated as empty.
@@ -98,7 +104,14 @@
   /// Returns a [Stream] representing the body.
   ///
   /// Can only be called once.
-  Stream<List<int>> read() => _body;
+  Stream<List<int>> read() {
+    if (_bodyWasRead) {
+      throw new StateError("The 'read' method can only be called once on a "
+                           "shelf.Request/shelf.Response object.");
+    }
+    _bodyWasRead = true;
+    return _body;
+  }
 
   /// Returns a [Future] containing the body as a String.
   ///
diff --git a/pkg/shelf/test/message_test.dart b/pkg/shelf/test/message_test.dart
index d393388..1d84110 100644
--- a/pkg/shelf/test/message_test.dart
+++ b/pkg/shelf/test/message_test.dart
@@ -131,6 +131,26 @@
           ..close();
       });
     });
+
+    test("throws when calling read()/readAsString() multiple times", () {
+      var request;
+
+      request = _createMessage();
+      expect(request.read().toList(), completion(isEmpty));
+      expect(() => request.read(), throwsStateError);
+
+      request = _createMessage();
+      expect(request.readAsString(), completion(isEmpty));
+      expect(() => request.readAsString(), throwsStateError);
+
+      request = _createMessage();
+      expect(request.readAsString(), completion(isEmpty));
+      expect(() => request.read(), throwsStateError);
+
+      request = _createMessage();
+      expect(request.read().toList(), completion(isEmpty));
+      expect(() => request.readAsString(), throwsStateError);
+    });
   });
 
   group("contentLength", () {
diff --git a/pkg/source_maps/CHANGELOG.md b/pkg/source_maps/CHANGELOG.md
index e278458..f40a16d 100644
--- a/pkg/source_maps/CHANGELOG.md
+++ b/pkg/source_maps/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 0.9.2+2
+
+* Fix a bug in `FixedSpan.getLocationMessage`.
+
+## 0.9.2+1
+
+* Minor readability improvements to `FixedSpan.getLocationMessage` and
+  `SpanException.toString`.
+
+## 0.9.2
+
+* Add `SpanException` and `SpanFormatException` classes.
+
 ## 0.9.1
 
 * Support unmapped areas in source maps.
diff --git a/pkg/source_maps/lib/span.dart b/pkg/source_maps/lib/span.dart
index f47e08e..600506e 100644
--- a/pkg/source_maps/lib/span.dart
+++ b/pkg/source_maps/lib/span.dart
@@ -64,7 +64,10 @@
 
   String getLocationMessage(String message,
       {bool useColors: false, String color}) {
-    return '$formatLocation: $message';
+    var source = start.sourceUrl == null ? '' :
+        ' of ${p.prettyUri(start.sourceUrl)}';
+    return 'line ${start.line + 1}, column ${start.column + 1}$source: ' +
+        message;
   }
 
   bool operator ==(Span other) =>
@@ -360,3 +363,28 @@
   String getText(int start, [int end]) =>
     super.getText(start - _baseOffset, end == null ? null : end - _baseOffset);
 }
+
+/// A class for exceptions that have source span information attached.
+class SpanException implements Exception {
+  /// A message describing the exception.
+  final String message;
+
+  /// The span associated with this exception.
+  ///
+  /// This may be `null` if the source location can't be determined.
+  final Span span;
+
+  SpanException(this.message, this.span);
+
+  String toString({bool useColors: false, String color}) {
+    if (span == null) return message;
+    return "Error on " + span.getLocationMessage(message,
+        useColors: useColors, color: color);
+  }
+}
+
+/// A [SpanException] that's also a [FormatException].
+class SpanFormatException extends SpanException implements FormatException {
+  SpanFormatException(String message, Span span)
+      : super(message, span);
+}
diff --git a/pkg/source_maps/pubspec.yaml b/pkg/source_maps/pubspec.yaml
index 3c946e0..80c7e7f 100644
--- a/pkg/source_maps/pubspec.yaml
+++ b/pkg/source_maps/pubspec.yaml
@@ -1,5 +1,5 @@
 name: source_maps
-version: 0.9.1
+version: 0.9.2+2
 author: Dart Team <misc@dartlang.org>
 description: Library to programmatically manipulate source map files.
 homepage: http://www.dartlang.org
diff --git a/pkg/stack_trace/CHANGELOG.md b/pkg/stack_trace/CHANGELOG.md
index 0b3553f..a58190f 100644
--- a/pkg/stack_trace/CHANGELOG.md
+++ b/pkg/stack_trace/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.0.1
+
+* Synchronous errors in the [Chain.capture] callback are now handled correctly.
+
 ## 1.0.0
 
 * No API changes, just declared stable.
diff --git a/pkg/stack_trace/lib/src/chain.dart b/pkg/stack_trace/lib/src/chain.dart
index a097bba..78c6ae4 100644
--- a/pkg/stack_trace/lib/src/chain.dart
+++ b/pkg/stack_trace/lib/src/chain.dart
@@ -90,7 +90,14 @@
   /// [15105]: https://code.google.com/p/dart/issues/detail?id=15105
   static capture(callback(), {ChainHandler onError}) {
     var spec = new StackZoneSpecification(onError);
-    return runZoned(callback, zoneSpecification: spec.toSpec(), zoneValues: {
+    return runZoned(() {
+      try {
+        return callback();
+      } catch (error, stackTrace) {
+        // TODO(nweiz): Don't special-case this when issue 19566 is fixed.
+        return Zone.current.handleUncaughtError(error, stackTrace);
+      }
+    }, zoneSpecification: spec.toSpec(), zoneValues: {
       #stack_trace.stack_zone.spec: spec
     });
   }
diff --git a/pkg/stack_trace/pubspec.yaml b/pkg/stack_trace/pubspec.yaml
index ddad7f9..1c43efd 100644
--- a/pkg/stack_trace/pubspec.yaml
+++ b/pkg/stack_trace/pubspec.yaml
@@ -1,5 +1,5 @@
 name: stack_trace
-version: 1.0.0
+version: 1.0.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
diff --git a/pkg/stack_trace/test/chain_test.dart b/pkg/stack_trace/test/chain_test.dart
index 3347deb..beb4721 100644
--- a/pkg/stack_trace/test/chain_test.dart
+++ b/pkg/stack_trace/test/chain_test.dart
@@ -14,6 +14,15 @@
 
 void main() {
   group('capture() with onError catches exceptions', () {
+    test('thrown synchronously', () {
+      return captureFuture(() => throw 'error')
+          .then((chain) {
+        expect(chain.traces, hasLength(1));
+        expect(chain.traces.single.frames.first,
+            frameMember(startsWith('main')));
+      });
+    });
+
     test('thrown in a microtask', () {
       return captureFuture(() => inMicrotask(() => throw 'error'))
           .then((chain) {
diff --git a/pkg/string_scanner/CHANGELOG.md b/pkg/string_scanner/CHANGELOG.md
index 2c41c9d..a5d5518 100644
--- a/pkg/string_scanner/CHANGELOG.md
+++ b/pkg/string_scanner/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 0.0.3
+
+* Make `StringScannerException` inherit from source_map's
+  [`SpanFormatException`][].
+
+[SpanFormatException]: (http://www.dartdocs.org/documentation/source_maps/0.9.2/index.html#source_maps/source_maps.SpanFormatException)
+
 ## 0.0.2
 
 * `new StringScanner()` now takes an optional `sourceUrl` argument that provides
diff --git a/pkg/string_scanner/lib/src/exception.dart b/pkg/string_scanner/lib/src/exception.dart
index c398687..44ec9a3 100644
--- a/pkg/string_scanner/lib/src/exception.dart
+++ b/pkg/string_scanner/lib/src/exception.dart
@@ -7,10 +7,7 @@
 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;
-
+class StringScannerException extends SpanFormatException {
   /// The source string being parsed.
   final String string;
 
@@ -19,19 +16,6 @@
   /// 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);
-  }
+  StringScannerException(String message, this.string, this.sourceUrl, Span span)
+      : super(message, span);
 }
-
diff --git a/pkg/string_scanner/pubspec.yaml b/pkg/string_scanner/pubspec.yaml
index 86ae238..f6d7ab9 100644
--- a/pkg/string_scanner/pubspec.yaml
+++ b/pkg/string_scanner/pubspec.yaml
@@ -1,12 +1,12 @@
 name: string_scanner
-version: 0.0.2
+version: 0.0.3
 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"
+  source_maps: ">=0.9.2 <0.10.0"
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
 environment:
diff --git a/pkg/template_binding/CHANGELOG.md b/pkg/template_binding/CHANGELOG.md
index 5e8d985..7df9ea5 100644
--- a/pkg/template_binding/CHANGELOG.md
+++ b/pkg/template_binding/CHANGELOG.md
@@ -3,7 +3,7 @@
 This file contains highlights of what changes on each version of the
 template_binding package.
 
-#### Pub version 0.11.0-dev
+#### Pub version 0.11.0
   * Ported up to commit [TemplateBinding#1cee02][5b9a3b] and
     [NodeBind#c47bc1][c47bc1].
 
diff --git a/pkg/template_binding/pubspec.yaml b/pkg/template_binding/pubspec.yaml
index c84d4f5..acb2c24 100644
--- a/pkg/template_binding/pubspec.yaml
+++ b/pkg/template_binding/pubspec.yaml
@@ -1,5 +1,5 @@
 name: template_binding
-version: 0.11.0-dev
+version: 0.11.0
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: >
   Extends the capabilities of the HTML Template Element by enabling it to
diff --git a/pkg/typed_mock/lib/typed_mock.dart b/pkg/typed_mock/lib/typed_mock.dart
index eb9ae73..180ff27 100644
--- a/pkg/typed_mock/lib/typed_mock.dart
+++ b/pkg/typed_mock/lib/typed_mock.dart
@@ -39,6 +39,14 @@
   }
 }
 
+
+/// Clears all interactions remembered so far.
+resetInteractions(TypedMock mock) {
+  mock._invocations.clear();
+  mock._verifiedInvocations.clear();
+}
+
+
 /// Verifies certain behavior happened a specified number of times.
 Verifier verify(_ignored) {
   try {
@@ -364,6 +372,8 @@
 /// [ArgumentMatcher] checks whether the given argument satisfies some
 /// condition.
 abstract class ArgumentMatcher {
+  const ArgumentMatcher();
+
   /// Checks whether this matcher accepts the given argument.
   bool matches(val);
 }
@@ -372,7 +382,7 @@
 class _ArgumentMatcher_equals extends ArgumentMatcher {
   final expected;
 
-  _ArgumentMatcher_equals(this.expected);
+  const _ArgumentMatcher_equals(this.expected);
 
   @override
   bool matches(val) {
@@ -382,6 +392,8 @@
 
 
 class _ArgumentMatcher_anyBool extends ArgumentMatcher {
+  const _ArgumentMatcher_anyBool();
+
   @override
   bool matches(val) {
     return val is bool;
@@ -389,10 +401,12 @@
 }
 
 /// Matches any [bool] value.
-final anyBool = new _ArgumentMatcher_anyBool() as dynamic;
+final anyBool = const _ArgumentMatcher_anyBool() as dynamic;
 
 
 class _ArgumentMatcher_anyInt extends ArgumentMatcher {
+  const _ArgumentMatcher_anyInt();
+
   @override
   bool matches(val) {
     return val is int;
@@ -400,10 +414,12 @@
 }
 
 /// Matches any [int] value.
-final anyInt = new _ArgumentMatcher_anyInt() as dynamic;
+final anyInt = const _ArgumentMatcher_anyInt() as dynamic;
 
 
 class _ArgumentMatcher_anyObject extends ArgumentMatcher {
+  const _ArgumentMatcher_anyObject();
+
   @override
   bool matches(val) {
     return true;
@@ -411,10 +427,12 @@
 }
 
 /// Matches any [Object] (or subclass) value.
-final anyObject = new _ArgumentMatcher_anyObject() as dynamic;
+final anyObject = const _ArgumentMatcher_anyObject() as dynamic;
 
 
 class _ArgumentMatcher_anyString extends ArgumentMatcher {
+  const _ArgumentMatcher_anyString();
+
   @override
   bool matches(val) {
     return val is String;
@@ -422,4 +440,4 @@
 }
 
 /// Matches any [String] value.
-final anyString = new _ArgumentMatcher_anyString() as dynamic;
+final anyString = const _ArgumentMatcher_anyString() as dynamic;
diff --git a/pkg/typed_mock/pubspec.yaml b/pkg/typed_mock/pubspec.yaml
index 209860c..937b128 100644
--- a/pkg/typed_mock/pubspec.yaml
+++ b/pkg/typed_mock/pubspec.yaml
@@ -1,5 +1,5 @@
 name: typed_mock
-version: 0.0.2
+version: 0.0.4
 author: Dart Team <misc@dartlang.org>
 description: A library for mocking classes using Mockito-like syntax
 homepage: http://www.dartlang.org
diff --git a/pkg/typed_mock/test/typed_mock_test.dart b/pkg/typed_mock/test/typed_mock_test.dart
index c2dc907..9585673 100644
--- a/pkg/typed_mock/test/typed_mock_test.dart
+++ b/pkg/typed_mock/test/typed_mock_test.dart
@@ -183,6 +183,14 @@
     });
   });
 
+  test('resetInteractions', () {
+    TestInterfaceMock obj = new TestInterfaceMock();
+    obj.testProperty;
+    obj.testMethod0();
+    resetInteractions(obj);
+    verifyZeroInteractions(obj);
+  });
+
   group('verify', () {
     TestInterfaceMock obj;
     setUp(() {
diff --git a/pkg/unittest/CHANGELOG.md b/pkg/unittest/CHANGELOG.md
index b9c36f2..d8171f9 100644
--- a/pkg/unittest/CHANGELOG.md
+++ b/pkg/unittest/CHANGELOG.md
@@ -1,4 +1,8 @@
-##0.11.1+1
+##0.11.0+2
+
+*  Removed unused files from tests and standardized remaining test file names.
+
+##0.11.0+1
 
 * Widen the version constraint for `stack_trace`.
 
@@ -55,5 +59,3 @@
 * `runTests`, `tearDown`, `setUp`, `test`, `group`, `solo_test`, and
   `solo_group` now throw a `StateError` if called while tests are running.
 * `rerunTests` has been removed.
-
-##0.9.3 - 2014-01-13
diff --git a/pkg/unittest/pubspec.yaml b/pkg/unittest/pubspec.yaml
index fc05836..c5b04ca 100644
--- a/pkg/unittest/pubspec.yaml
+++ b/pkg/unittest/pubspec.yaml
@@ -1,5 +1,5 @@
 name: unittest
-version: 0.11.0+1
+version: 0.11.0+2
 author: Dart Team <misc@dartlang.org>
 description: A library for writing dart unit tests.
 homepage: http://www.dartlang.org
diff --git a/pkg/unittest/test/unittest_async_exception_test.dart b/pkg/unittest/test/async_exception_test.dart
similarity index 81%
rename from pkg/unittest/test/unittest_async_exception_test.dart
rename to pkg/unittest/test/async_exception_test.dart
index cc35116..8574416 100644
--- a/pkg/unittest/test/unittest_async_exception_test.dart
+++ b/pkg/unittest/test/async_exception_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'async exception test';
 
@@ -18,4 +20,4 @@
   });
 };
 
-var expected = buildStatusString(0, 1, 0, testName, message: 'Caught error!');
+final expected = buildStatusString(0, 1, 0, testName, message: 'Caught error!');
diff --git a/pkg/unittest/test/unittest_async_setup_teardown_test.dart b/pkg/unittest/test/async_setup_teardown_test.dart
similarity index 95%
rename from pkg/unittest/test/unittest_async_setup_teardown_test.dart
rename to pkg/unittest/test/async_setup_teardown_test.dart
index 067dbf9..56e7c12 100644
--- a/pkg/unittest/test/unittest_async_setup_teardown_test.dart
+++ b/pkg/unittest/test/async_setup_teardown_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'async setup teardown test';
 
@@ -53,7 +55,7 @@
   test('post groups', () {});
 };
 
-var expected = buildStatusString(2, 0, 3,
+final expected = buildStatusString(2, 0, 3,
     'good setup/good teardown foo1::'
     'good setup/bad teardown foo2:'
     'Teardown failed: Caught Failed to complete tearDown:'
diff --git a/pkg/unittest/test/breath_test.dart b/pkg/unittest/test/breath_test.dart
index 84435a6..7b0a038 100644
--- a/pkg/unittest/test/breath_test.dart
+++ b/pkg/unittest/test/breath_test.dart
@@ -2,11 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+library unittest.breath_test;
+
 import 'dart:async';
 
 import 'package:unittest/unittest.dart';
 
-main() {
+void main() {
   // Test the sync test 'breath' feature of unittest.
 
   group('breath', () {
@@ -31,4 +33,3 @@
     });
   });
 }
-
diff --git a/pkg/unittest/test/unittest_completion_test.dart b/pkg/unittest/test/completion_test.dart
similarity index 95%
rename from pkg/unittest/test/unittest_completion_test.dart
rename to pkg/unittest/test/completion_test.dart
index 037dee1..c1ed574 100644
--- a/pkg/unittest/test/unittest_completion_test.dart
+++ b/pkg/unittest/test/completion_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'completion test';
 
diff --git a/pkg/unittest/test/unittest_correct_callback_test.dart b/pkg/unittest/test/correct_callback_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_correct_callback_test.dart
rename to pkg/unittest/test/correct_callback_test.dart
index 43b40ea..a5689b9 100644
--- a/pkg/unittest/test/unittest_correct_callback_test.dart
+++ b/pkg/unittest/test/correct_callback_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'correct callback test';
 
diff --git a/pkg/unittest/test/unittest_exception_test.dart b/pkg/unittest/test/exception_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_exception_test.dart
rename to pkg/unittest/test/exception_test.dart
index 23d302d..f84ac18 100644
--- a/pkg/unittest/test/unittest_exception_test.dart
+++ b/pkg/unittest/test/exception_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'exception test';
 
diff --git a/pkg/unittest/test/unittest_excess_callback_test.dart b/pkg/unittest/test/excess_callback_test.dart
similarity index 96%
rename from pkg/unittest/test/unittest_excess_callback_test.dart
rename to pkg/unittest/test/excess_callback_test.dart
index 76a3a9e..0bd985e 100644
--- a/pkg/unittest/test/unittest_excess_callback_test.dart
+++ b/pkg/unittest/test/excess_callback_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'excess callback test';
 
diff --git a/pkg/unittest/test/unittest_expect_async_args_test.dart b/pkg/unittest/test/expect_async_args_test.dart
similarity index 96%
rename from pkg/unittest/test/unittest_expect_async_args_test.dart
rename to pkg/unittest/test/expect_async_args_test.dart
index 0fd7517..82702b3 100644
--- a/pkg/unittest/test/unittest_expect_async_args_test.dart
+++ b/pkg/unittest/test/expect_async_args_test.dart
@@ -4,11 +4,12 @@
 
 library unittestTest;
 
-import 'dart:isolate';
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testFunction = (TestConfiguration testConfig) {
   List<int> _getArgs([a = 0, b = 0, c = 0, d = 0, e = 0, f = 0]) {
diff --git a/pkg/unittest/test/unittest_expect_async_test.dart b/pkg/unittest/test/expect_async_test.dart
similarity index 98%
rename from pkg/unittest/test/unittest_expect_async_test.dart
rename to pkg/unittest/test/expect_async_test.dart
index a8bbde5..cd771b1 100644
--- a/pkg/unittest/test/unittest_expect_async_test.dart
+++ b/pkg/unittest/test/expect_async_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testFunction = (TestConfiguration testConfig) {
   test('expectAsync zero params', () {
diff --git a/pkg/unittest/test/unittest_group_name_test.dart b/pkg/unittest/test/group_name_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_group_name_test.dart
rename to pkg/unittest/test/group_name_test.dart
index 8f6b87b..c0fdfa0 100644
--- a/pkg/unittest/test/unittest_group_name_test.dart
+++ b/pkg/unittest/test/group_name_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'group name test';
 
diff --git a/pkg/unittest/test/instance_test.dart b/pkg/unittest/test/instance_test.dart
deleted file mode 100644
index 287744c..0000000
--- a/pkg/unittest/test/instance_test.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittestTests;
-import 'package:unittest/unittest.dart';
-
-import 'test_utils.dart';
-
-main() {
-  initUtils();
-
-  group('Type Matchers', () {
-    test('isInstanceOf', () {
-      shouldFail(0, new isInstanceOf<String>('String'),
-          "Expected: an instance of String Actual: <0>");
-      shouldPass('cow', new isInstanceOf<String>('String'));
-    });
-
-    test('throwsA', () {
-      shouldPass(doesThrow, throwsA(equals('X')));
-      shouldFail(doesThrow, throwsA(equals('Y')),
-          matches("Expected: throws 'Y'.*"
-          "Actual: <Closure.*"
-          "Which: threw 'X'"));
-    });
-  });
-}
-
diff --git a/pkg/unittest/test/unittest_invalid_ops_test.dart b/pkg/unittest/test/invalid_ops_test.dart
similarity index 96%
rename from pkg/unittest/test/unittest_invalid_ops_test.dart
rename to pkg/unittest/test/invalid_ops_test.dart
index 4f1091c..a1c5190 100644
--- a/pkg/unittest/test/unittest_invalid_ops_test.dart
+++ b/pkg/unittest/test/invalid_ops_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'invalid ops throw while test is running';
 
diff --git a/pkg/unittest/test/unittest_late_exception_test.dart b/pkg/unittest/test/late_exception_test.dart
similarity index 95%
rename from pkg/unittest/test/unittest_late_exception_test.dart
rename to pkg/unittest/test/late_exception_test.dart
index c80de12..4fec977 100644
--- a/pkg/unittest/test/unittest_late_exception_test.dart
+++ b/pkg/unittest/test/late_exception_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'late exception test';
 
diff --git a/pkg/unittest/test/unittest_middle_exception_test.dart b/pkg/unittest/test/middle_exception_test.dart
similarity index 90%
rename from pkg/unittest/test/unittest_middle_exception_test.dart
rename to pkg/unittest/test/middle_exception_test.dart
index ba77514..6fb1b7b 100644
--- a/pkg/unittest/test/unittest_middle_exception_test.dart
+++ b/pkg/unittest/test/middle_exception_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'late exception test';
 
@@ -23,5 +25,5 @@
   });
 };
 
-var expected = buildStatusString(2, 1, 0,
+final expected = buildStatusString(2, 1, 0,
     'testOne::testTwo:Expected: false Actual: <true>:testThree');
diff --git a/pkg/unittest/test/missing_tick_test.dart b/pkg/unittest/test/missing_tick_test.dart
index 19c5b89..bc7bd58 100644
--- a/pkg/unittest/test/missing_tick_test.dart
+++ b/pkg/unittest/test/missing_tick_test.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+library unittest.missing_tick_test;
+
 import 'package:unittest/unittest.dart';
 
 // TODO(gram): Convert to a shouldFail passing test.
-main() {
+void main() {
   SimpleConfiguration config = unittestConfiguration;
   config.timeout = const Duration(seconds: 2);
   group('Broken', () {
diff --git a/pkg/unittest/test/unittest_nested_groups_setup_teardown_test.dart b/pkg/unittest/test/nested_groups_setup_teardown_test.dart
similarity index 97%
rename from pkg/unittest/test/unittest_nested_groups_setup_teardown_test.dart
rename to pkg/unittest/test/nested_groups_setup_teardown_test.dart
index 1cb16a0..fdd851a 100644
--- a/pkg/unittest/test/unittest_nested_groups_setup_teardown_test.dart
+++ b/pkg/unittest/test/nested_groups_setup_teardown_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'nested groups setup/teardown';
 
diff --git a/pkg/unittest/test/unittest_protect_async_test.dart b/pkg/unittest/test/protect_async_test.dart
similarity index 97%
rename from pkg/unittest/test/unittest_protect_async_test.dart
rename to pkg/unittest/test/protect_async_test.dart
index 15d3394..8fd6765 100644
--- a/pkg/unittest/test/unittest_protect_async_test.dart
+++ b/pkg/unittest/test/protect_async_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testFunction = (_) {
   test('protectAsync0', () {
diff --git a/pkg/unittest/test/unittest_test_returning_future_test.dart b/pkg/unittest/test/returning_future_test.dart
similarity index 97%
rename from pkg/unittest/test/unittest_test_returning_future_test.dart
rename to pkg/unittest/test/returning_future_test.dart
index 83c4a5d..97faf8e 100644
--- a/pkg/unittest/test/unittest_test_returning_future_test.dart
+++ b/pkg/unittest/test/returning_future_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'test returning future';
 
diff --git a/pkg/unittest/test/unittest_test_returning_future_using_runasync_test.dart b/pkg/unittest/test/returning_future_using_runasync_test.dart
similarity index 95%
rename from pkg/unittest/test/unittest_test_returning_future_using_runasync_test.dart
rename to pkg/unittest/test/returning_future_using_runasync_test.dart
index e5fc304..0ba0b48 100644
--- a/pkg/unittest/test/unittest_test_returning_future_using_runasync_test.dart
+++ b/pkg/unittest/test/returning_future_using_runasync_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'test returning future using scheduleMicrotask';
 
@@ -64,7 +66,7 @@
   });
 };
 
-var expected = buildStatusString(2, 4, 0,
+final expected = buildStatusString(2, 4, 0,
     'successful::'
     'fail1:Expected: <false> Actual: <true>:'
     'error1:Callback called more times than expected (1).:'
diff --git a/pkg/unittest/test/unittest_runtests_without_tests_test.dart b/pkg/unittest/test/runtests_without_tests_test.dart
similarity index 93%
rename from pkg/unittest/test/unittest_runtests_without_tests_test.dart
rename to pkg/unittest/test/runtests_without_tests_test.dart
index e8c26f8..b4c95122 100644
--- a/pkg/unittest/test/unittest_runtests_without_tests_test.dart
+++ b/pkg/unittest/test/runtests_without_tests_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'runTests() without tests';
 
diff --git a/pkg/unittest/test/unittest_setup_and_teardown_test.dart b/pkg/unittest/test/setup_and_teardown_test.dart
similarity index 95%
rename from pkg/unittest/test/unittest_setup_and_teardown_test.dart
rename to pkg/unittest/test/setup_and_teardown_test.dart
index 0c20cf3..4b3a7f8 100644
--- a/pkg/unittest/test/unittest_setup_and_teardown_test.dart
+++ b/pkg/unittest/test/setup_and_teardown_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'setup and teardown test';
 
diff --git a/pkg/unittest/test/unittest_setup_test.dart b/pkg/unittest/test/setup_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_setup_test.dart
rename to pkg/unittest/test/setup_test.dart
index 0050f64..dfb5ee1 100644
--- a/pkg/unittest/test/unittest_setup_test.dart
+++ b/pkg/unittest/test/setup_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'setup test';
 
@@ -20,5 +22,3 @@
 
 var expected = buildStatusString(1, 0, 0, 'a $testName',
     count: 0, setup: 'setup');
-
-
diff --git a/pkg/unittest/test/unittest_single_correct_test.dart b/pkg/unittest/test/single_correct_test.dart
similarity index 93%
rename from pkg/unittest/test/unittest_single_correct_test.dart
rename to pkg/unittest/test/single_correct_test.dart
index 23c31fd..f10ff0c 100644
--- a/pkg/unittest/test/unittest_single_correct_test.dart
+++ b/pkg/unittest/test/single_correct_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'single correct test';
 
diff --git a/pkg/unittest/test/unittest_single_failing_test.dart b/pkg/unittest/test/single_failing_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_single_failing_test.dart
rename to pkg/unittest/test/single_failing_test.dart
index c965e7a..0ba648e 100644
--- a/pkg/unittest/test/unittest_single_failing_test.dart
+++ b/pkg/unittest/test/single_failing_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'single failing test';
 
diff --git a/pkg/unittest/test/unittest_skipped_soloed_nested_test.dart b/pkg/unittest/test/skipped_soloed_nested_test.dart
similarity index 98%
rename from pkg/unittest/test/unittest_skipped_soloed_nested_test.dart
rename to pkg/unittest/test/skipped_soloed_nested_test.dart
index 3cbd09d..cf32f2c 100644
--- a/pkg/unittest/test/unittest_skipped_soloed_nested_test.dart
+++ b/pkg/unittest/test/skipped_soloed_nested_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'skipped/soloed nested groups with setup/teardown';
 
diff --git a/pkg/unittest/test/unittest_teardown_test.dart b/pkg/unittest/test/teardown_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_teardown_test.dart
rename to pkg/unittest/test/teardown_test.dart
index c01bdaf..8d23398 100644
--- a/pkg/unittest/test/unittest_teardown_test.dart
+++ b/pkg/unittest/test/teardown_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'teardown test';
 
diff --git a/pkg/unittest/test/test_common.dart b/pkg/unittest/test/test_common.dart
deleted file mode 100644
index da9e9e5..0000000
--- a/pkg/unittest/test/test_common.dart
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test_common;
-
-import 'dart:collection';
-
-import 'package:unittest/unittest.dart';
-
-class Widget {
-  int price;
-}
-
-class HasPrice extends CustomMatcher {
-  HasPrice(matcher) :
-    super("Widget with a price that is", "price", matcher);
-  featureValueOf(actual) => actual.price;
-}
-
-class SimpleIterable extends IterableBase {
-  int count;
-  SimpleIterable(this.count);
-
-  bool contains(int val) => count < val ? false : true;
-
-  bool any(bool f(element)) {
-    for (var i = 0; i <= count; i++) {
-      if (f(i)) return true;
-    }
-    return false;
-  }
-
-  String toString() => "<[$count]>";
-
-  Iterator get iterator {
-    return new SimpleIterator(count);
-  }
-}
-
-class SimpleIterator implements Iterator {
-  int _count;
-  int _current;
-
-  SimpleIterator(this._count);
-
-  bool moveNext() {
-    if (_count > 0) {
-      _current = _count;
-      _count--;
-      return true;
-    }
-    _current = null;
-    return false;
-  }
-
-  get current => _current;
-}
-
diff --git a/pkg/unittest/test/test_utils.dart b/pkg/unittest/test/test_utils.dart
deleted file mode 100644
index 783f71b..0000000
--- a/pkg/unittest/test/test_utils.dart
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test_utils;
-
-import 'package:unittest/unittest.dart';
-
-import 'dart:async';
-
-int errorCount;
-String errorString;
-var _testHandler = null;
-
-class MyFailureHandler extends DefaultFailureHandler {
-  void fail(String reason) {
-    ++errorCount;
-    errorString = reason;
-  }
-}
-
-void initUtils() {
-  if (_testHandler == null) {
-    _testHandler = new MyFailureHandler();
-  }
-}
-
-void shouldFail(value, Matcher matcher, expected, {bool isAsync: false}) {
-  configureExpectFailureHandler(_testHandler);
-  errorCount = 0;
-  errorString = '';
-  expect(value, matcher);
-  afterTest() {
-    configureExpectFailureHandler(null);
-    expect(errorCount, equals(1));
-    if (expected is String) {
-      expect(errorString, equalsIgnoringWhitespace(expected));
-    } else {
-      expect(errorString.replaceAll('\n', ''), expected);
-    }
-  }
-
-  if (isAsync) {
-    Timer.run(expectAsync(afterTest));
-  } else {
-    afterTest();
-  }
-}
-
-void shouldPass(value, Matcher matcher, {bool isAsync: false}) {
-  configureExpectFailureHandler(_testHandler);
-  errorCount = 0;
-  errorString = '';
-  expect(value, matcher);
-  afterTest() {
-    configureExpectFailureHandler(null);
-    expect(errorCount, equals(0));
-  }
-  if (isAsync) {
-    Timer.run(expectAsync(afterTest));
-  } else {
-    afterTest();
-  }
-}
-
-doesNotThrow() {}
-doesThrow() { throw 'X'; }
-
-class PrefixMatcher extends Matcher {
-  final String _prefix;
-  const PrefixMatcher(this._prefix);
-  bool matches(item, Map matchState) {
-    return item is String &&
-        (collapseWhitespace(item)).startsWith(collapseWhitespace(_prefix));
-  }
-
-  Description describe(Description description) =>
-    description.add('a string starting with ').
-        addDescriptionOf(collapseWhitespace(_prefix)).
-        add(' ignoring whitespace');
-}
diff --git a/pkg/unittest/test/unittest_testcases_immutable_test.dart b/pkg/unittest/test/testcases_immutable_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_testcases_immutable_test.dart
rename to pkg/unittest/test/testcases_immutable_test.dart
index 891ea3a..ddd42d2 100644
--- a/pkg/unittest/test/unittest_testcases_immutable_test.dart
+++ b/pkg/unittest/test/testcases_immutable_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'testcases immutable';
 
diff --git a/pkg/unittest/test/unittest_test_utils.dart b/pkg/unittest/test/utils.dart
similarity index 100%
rename from pkg/unittest/test/unittest_test_utils.dart
rename to pkg/unittest/test/utils.dart
diff --git a/pkg/watcher/lib/src/directory_watcher/windows.dart b/pkg/watcher/lib/src/directory_watcher/windows.dart
index ddcf897..4f41d33 100644
--- a/pkg/watcher/lib/src/directory_watcher/windows.dart
+++ b/pkg/watcher/lib/src/directory_watcher/windows.dart
@@ -28,11 +28,8 @@
   final List<FileSystemEvent> events = [];

   Timer timer;

 

-  void addEvent(FileSystemEvent event) {

+  void addEvent(FileSystemEvent event, void callback()) {

     events.add(event);

-  }

-

-  void startTimer(void callback()) {

     if (timer != null) {

       timer.cancel();

     }

@@ -78,18 +75,19 @@
   /// the directory to determine its initial state.

   StreamSubscription<FileSystemEntity> _initialListSubscription;

 

-  /// The subscriptions to the [Directory.list] call for listing the contents of

-  /// subdirectories that was moved into the watched directory.

+  /// The subscriptions to the [Directory.list] calls for listing the contents

+  /// of subdirectories that were moved into the watched directory.

   final Set<StreamSubscription<FileSystemEntity>> _listSubscriptions

       = new HashSet<StreamSubscription<FileSystemEntity>>();

 

   _WindowsDirectoryWatcher(String directory)

       : directory = directory, _files = new PathSet(directory) {

-    _startWatch();

-    _startParentWatcher();

-

     // Before we're ready to emit events, wait for [_listDir] to complete.

-    _listDir().then(_readyCompleter.complete);

+    _listDir().then((_) {

+      _startWatch();

+      _startParentWatcher();

+      _readyCompleter.complete();

+    });

   }

 

   void close() {

@@ -111,13 +109,13 @@
   }

 

   /// On Windows, if [directory] is deleted, we will not receive any event.

+  ///

   /// Instead, we add a watcher on the parent folder (if any), that can notify

-  /// us about [directory].

-  /// This also includes events such as moves.

+  /// us about [directory]. This also includes events such as moves.

   void _startParentWatcher() {

     var absoluteDir = p.absolute(directory);

     var parent = p.dirname(absoluteDir);

-    // Check if we [directory] is already the root directory.

+    // Check if [directory] is already the root directory.

     if (FileSystemEntity.identicalSync(parent, directory)) return;

     var parentStream = Chain.track(

         new Directory(parent).watch(recursive: false));

@@ -140,26 +138,19 @@
         close();

       }

     }, onError: (error) {

-      // Ignore errors, simply close the stream.

+      // Ignore errors, simply close the stream. The user listens on

+      // [directory], and while it can fail to listen on the parent, we may

+      // still be able to listen on the path requested.

       _parentWatchSubscription.cancel();

       _parentWatchSubscription = null;

     });

   }

 

   void _onEvent(FileSystemEvent event) {

-    // If we get a event before we're ready to begin emitting events,

-    // ignore those events and re-list the directory.

-    if (!isReady) {

-      _listDir().then((_) {

-       _readyCompleter.complete();

-      });

-      return;

-    }

-

-    _EventBatcher batcher = _eventBatchers.putIfAbsent(

+    assert(isReady);

+    final batcher = _eventBatchers.putIfAbsent(

         event.path, () => new _EventBatcher());

-    batcher.addEvent(event);

-    batcher.startTimer(() {

+    batcher.addEvent(event, () {

       _eventBatchers.remove(event.path);

       _onBatch(batcher.events);

     });

@@ -246,8 +237,7 @@
 

     for (var event in batch) {

       if (event is FileSystemMoveEvent) {

-        FileSystemMoveEvent moveEvent = event;

-        addEvent(moveEvent.destination, event);

+        addEvent(event.destination, event);

       }

       addEvent(event.path, event);

     }

@@ -366,7 +356,7 @@
   void _onDone() {

     _watchSubscription = null;

 

-    // Emit remove-events for any remaining files.

+    // Emit remove events for any remaining files.

     for (var file in _files.toSet()) {

       _emitEvent(ChangeType.REMOVE, file);

     }

@@ -376,7 +366,7 @@
 

   /// Start or restart the underlying [Directory.watch] stream.

   void _startWatch() {

-    // Batch the events changes together so that we can dedup events.

+    // Batch the events together so that we can dedup events.

     var innerStream =

         Chain.track(new Directory(directory).watch(recursive: true));

     _watchSubscription = innerStream.listen(_onEvent,

diff --git a/pkg/watcher/test/directory_watcher/shared.dart b/pkg/watcher/test/directory_watcher/shared.dart
index 849cea00..d3575ea 100644
--- a/pkg/watcher/test/directory_watcher/shared.dart
+++ b/pkg/watcher/test/directory_watcher/shared.dart
@@ -78,6 +78,20 @@
     ]);
   });
 
+  test('when the watched directory is moved, removes all files', () {
+    writeFile("dir/a.txt");
+    writeFile("dir/b.txt");
+
+    startWatcher(dir: "dir");
+
+    renameDir("dir", "moved_dir");
+    createDir("dir");
+    inAnyOrder([
+      isRemoveEvent("dir/a.txt"),
+      isRemoveEvent("dir/b.txt")
+    ]);
+  });
+
   group("moves", () {
     test('notifies when a file is moved within the watched directory', () {
       writeFile("old.txt");
diff --git a/pkg/watcher/test/directory_watcher/windows_test.dart b/pkg/watcher/test/directory_watcher/windows_test.dart
index 3e9a854..6bfb88b 100644
--- a/pkg/watcher/test/directory_watcher/windows_test.dart
+++ b/pkg/watcher/test/directory_watcher/windows_test.dart
@@ -23,19 +23,5 @@
     expect(new DirectoryWatcher('.'),

         new isInstanceOf<WindowsDirectoryWatcher>());

   });

-

-  test('when the watched directory is moved, removes all files', () {

-    writeFile("dir/a.txt");

-    writeFile("dir/b.txt");

-

-    startWatcher(dir: "dir");

-

-    renameDir("dir", "moved_dir");

-    createDir("dir");

-    inAnyOrder([

-      isRemoveEvent("dir/a.txt"),

-      isRemoveEvent("dir/b.txt")

-    ]);

-  });

 }

 

diff --git a/pkg/web_components/CHANGELOG.md b/pkg/web_components/CHANGELOG.md
new file mode 100644
index 0000000..87f77b6
--- /dev/null
+++ b/pkg/web_components/CHANGELOG.md
@@ -0,0 +1,10 @@
+# changelog
+
+This file contains highlights of what changes on each version of this package.
+
+#### Pub version 0.3.5
+  * Added `registerDartType` to register a Dart API for a custom-element written
+    in Javascript.
+
+#### Pub version 0.3.4
+  * Updated to platform 0.2.4 (see lib/build.log for details)
diff --git a/pkg/web_components/lib/interop.dart b/pkg/web_components/lib/interop.dart
index 415c7fe..de1ef2f 100644
--- a/pkg/web_components/lib/interop.dart
+++ b/pkg/web_components/lib/interop.dart
@@ -29,7 +29,17 @@
 
   var upgrader = document.createElementUpgrader(
       dartType, extendsTag: extendsTag);
-  _doc.callMethod('_registerDartTypeUpgrader', [tagName, upgrader.upgrade]);
+
+  // Unfortunately the dart:html upgrader will throw on an already-upgraded
+  // element, so we need to duplicate the type check to prevent that.
+  // An element can be upgraded twice if it extends another element and calls
+  // createdCallback on the superclass. Since that's a valid use case we must
+  // wrap at both levels, and guard against it here.
+  upgradeElement(e) {
+    if (e.runtimeType != dartType) upgrader.upgrade(e);
+  }
+
+  _doc.callMethod('_registerDartTypeUpgrader', [tagName, upgradeElement]);
 }
 
 /// This function is mainly used to save resources. By default, we save a log of
diff --git a/pkg/web_components/lib/platform.concat.js b/pkg/web_components/lib/platform.concat.js
index be0db90..2044ee3 100644
--- a/pkg/web_components/lib/platform.concat.js
+++ b/pkg/web_components/lib/platform.concat.js
@@ -192,7 +192,7 @@
     return obj === Object(obj);
   }
 
-  var numberIsNaN = global.Number.isNaN || function isNaN(value) {
+  var numberIsNaN = global.Number.isNaN || function(value) {
     return typeof value === 'number' && global.isNaN(value);
   }
 
@@ -221,45 +221,194 @@
 
   var identStart = '[\$_a-zA-Z]';
   var identPart = '[\$_a-zA-Z0-9]';
-  var ident = identStart + '+' + identPart + '*';
-  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';
-  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';
-  var path = '(?:' + identOrElementIndex + ')(?:\\s*\\.\\s*' + identOrElementIndex + ')*';
-  var pathRegExp = new RegExp('^' + path + '$');
+  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');
 
-  function isPathValid(s) {
-    if (typeof s != 'string')
-      return false;
-    s = s.trim();
+  function getPathCharType(char) {
+    if (char === undefined)
+      return 'eof';
 
-    if (s == '')
-      return true;
+    var code = char.charCodeAt(0);
 
-    if (s[0] == '.')
-      return false;
+    switch(code) {
+      case 0x5B: // [
+      case 0x5D: // ]
+      case 0x2E: // .
+      case 0x22: // "
+      case 0x27: // '
+      case 0x30: // 0
+        return char;
 
-    return pathRegExp.test(s);
+      case 0x5F: // _
+      case 0x24: // $
+        return 'ident';
+
+      case 0x20: // Space
+      case 0x09: // Tab
+      case 0x0A: // Newline
+      case 0x0D: // Return
+      case 0xA0:  // No-break space
+      case 0xFEFF:  // Byte Order Mark
+      case 0x2028:  // Line Separator
+      case 0x2029:  // Paragraph Separator
+        return 'ws';
+    }
+
+    // a-z, A-Z
+    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))
+      return 'ident';
+
+    // 1-9
+    if (0x31 <= code && code <= 0x39)
+      return 'number';
+
+    return 'else';
+  }
+
+  var pathStateMachine = {
+    'beforePath': {
+      'ws': ['beforePath'],
+      'ident': ['inIdent', 'append'],
+      '[': ['beforeElement'],
+      'eof': ['afterPath']
+    },
+
+    'inPath': {
+      'ws': ['inPath'],
+      '.': ['beforeIdent'],
+      '[': ['beforeElement'],
+      'eof': ['afterPath']
+    },
+
+    'beforeIdent': {
+      'ws': ['beforeIdent'],
+      'ident': ['inIdent', 'append']
+    },
+
+    'inIdent': {
+      'ident': ['inIdent', 'append'],
+      '0': ['inIdent', 'append'],
+      'number': ['inIdent', 'append'],
+      'ws': ['inPath', 'push'],
+      '.': ['beforeIdent', 'push'],
+      '[': ['beforeElement', 'push'],
+      'eof': ['afterPath', 'push']
+    },
+
+    'beforeElement': {
+      'ws': ['beforeElement'],
+      '0': ['afterZero', 'append'],
+      'number': ['inIndex', 'append'],
+      "'": ['inSingleQuote', 'append', ''],
+      '"': ['inDoubleQuote', 'append', '']
+    },
+
+    'afterZero': {
+      'ws': ['afterElement', 'push'],
+      ']': ['inPath', 'push']
+    },
+
+    'inIndex': {
+      '0': ['inIndex', 'append'],
+      'number': ['inIndex', 'append'],
+      'ws': ['afterElement'],
+      ']': ['inPath', 'push']
+    },
+
+    'inSingleQuote': {
+      "'": ['afterElement'],
+      'eof': ['error'],
+      'else': ['inSingleQuote', 'append']
+    },
+
+    'inDoubleQuote': {
+      '"': ['afterElement'],
+      'eof': ['error'],
+      'else': ['inDoubleQuote', 'append']
+    },
+
+    'afterElement': {
+      'ws': ['afterElement'],
+      ']': ['inPath', 'push']
+    }
+  }
+
+  function noop() {}
+
+  function parsePath(path) {
+    var keys = [];
+    var index = -1;
+    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';
+
+    var actions = {
+      push: function() {
+        if (key === undefined)
+          return;
+
+        keys.push(key);
+        key = undefined;
+      },
+
+      append: function() {
+        if (key === undefined)
+          key = newChar
+        else
+          key += newChar;
+      }
+    };
+
+    function maybeUnescapeQuote() {
+      if (index >= path.length)
+        return;
+
+      var nextChar = path[index + 1];
+      if ((mode == 'inSingleQuote' && nextChar == "'") ||
+          (mode == 'inDoubleQuote' && nextChar == '"')) {
+        index++;
+        newChar = nextChar;
+        actions.append();
+        return true;
+      }
+    }
+
+    while (mode) {
+      index++;
+      c = path[index];
+
+      if (c == '\\' && maybeUnescapeQuote(mode))
+        continue;
+
+      type = getPathCharType(c);
+      typeMap = pathStateMachine[mode];
+      transition = typeMap[type] || typeMap['else'] || 'error';
+
+      if (transition == 'error')
+        return; // parse error;
+
+      mode = transition[0];
+      action = actions[transition[1]] || noop;
+      newChar = transition[2] === undefined ? c : transition[2];
+      action();
+
+      if (mode === 'afterPath') {
+        return keys;
+      }
+    }
+
+    return; // parse error
+  }
+
+  function isIdent(s) {
+    return identRegExp.test(s);
   }
 
   var constructorIsPrivate = {};
 
-  function Path(s, privateToken) {
+  function Path(parts, privateToken) {
     if (privateToken !== constructorIsPrivate)
       throw Error('Use Path.get to retrieve path objects');
 
-    if (s.trim() == '')
-      return this;
-
-    if (isIndex(s)) {
-      this.push(s);
-      return this;
-    }
-
-    s.split(/\s*\.\s*/).filter(function(part) {
-      return part;
-    }).forEach(function(part) {
-      this.push(part);
-    }, this);
+    if (parts.length)
+      Array.prototype.push.apply(this, parts.slice());
 
     if (hasEval && this.length) {
       this.getValueFrom = this.compiledGetValueFromFn();
@@ -273,30 +422,57 @@
     if (pathString instanceof Path)
       return pathString;
 
-    if (pathString == null)
+    if (pathString == null || pathString.length == 0)
       pathString = '';
 
-    if (typeof pathString !== 'string')
+    if (typeof pathString != 'string') {
+      if (isIndex(pathString.length)) {
+        // Constructed with array-like (pre-parsed) keys
+        return new Path(pathString, constructorIsPrivate);
+      }
+
       pathString = String(pathString);
+    }
 
     var path = pathCache[pathString];
     if (path)
       return path;
-    if (!isPathValid(pathString))
+
+    var parts = parsePath(pathString);
+    if (!parts)
       return invalidPath;
-    var path = new Path(pathString, constructorIsPrivate);
+
+    var path = new Path(parts, constructorIsPrivate);
     pathCache[pathString] = path;
     return path;
   }
 
   Path.get = getPath;
 
+  function formatAccessor(key) {
+    if (isIndex(key)) {
+      return '[' + key + ']';
+    } else {
+      return '["' + key.replace(/"/g, '\\"') + '"]';
+    }
+  }
+
   Path.prototype = createObject({
     __proto__: [],
     valid: true,
 
     toString: function() {
-      return this.join('.');
+      var pathString = '';
+      for (var i = 0; i < this.length; i++) {
+        var key = this[i];
+        if (isIdent(key)) {
+          pathString += i ? '.' + key : key;
+        } else {
+          pathString += formatAccessor(key);
+        }
+      }
+
+      return pathString;
     },
 
     getValueFrom: function(obj, directObserver) {
@@ -319,22 +495,20 @@
     },
 
     compiledGetValueFromFn: function() {
-      var accessors = this.map(function(ident) {
-        return isIndex(ident) ? '["' + ident + '"]' : '.' + ident;
-      });
-
       var str = '';
       var pathString = 'obj';
       str += 'if (obj != null';
       var i = 0;
+      var key;
       for (; i < (this.length - 1); i++) {
-        var ident = this[i];
-        pathString += accessors[i];
+        key = this[i];
+        pathString += isIdent(key) ? '.' + key : formatAccessor(key);
         str += ' &&\n     ' + pathString + ' != null';
       }
       str += ')\n';
 
-      pathString += accessors[i];
+      var key = this[i];
+      pathString += isIdent(key) ? '.' + key : formatAccessor(key);
 
       str += '  return ' + pathString + ';\nelse\n  return undefined;';
       return new Function('obj', str);
@@ -935,6 +1109,10 @@
   PathObserver.prototype = createObject({
     __proto__: Observer.prototype,
 
+    get path() {
+      return this.path_;
+    },
+
     connect_: function() {
       if (hasObserve)
         this.directObserver_ = getObservedSet(this, this.object_);
@@ -961,7 +1139,7 @@
       if (skipChanges || areSameValue(this.value_, oldValue))
         return false;
 
-      this.report_([this.value_, oldValue]);
+      this.report_([this.value_, oldValue, this]);
       return true;
     },
 
@@ -1171,98 +1349,6 @@
     delete: true
   };
 
- var updateRecord = {
-    object: undefined,
-    type: 'update',
-    name: undefined,
-    oldValue: undefined
-  };
-
-  function notify(object, name, value, oldValue) {
-    if (areSameValue(value, oldValue))
-      return;
-
-    // TODO(rafaelw): Hack hack hack. This entire code really needs to move
-    // out of observe-js into polymer.
-    if (typeof object.propertyChanged_ == 'function')
-      object.propertyChanged_(name, value, oldValue);
-
-    if (!hasObserve)
-      return;
-
-    var notifier = object.notifier_;
-    if (!notifier)
-      notifier = object.notifier_ = Object.getNotifier(object);
-
-    updateRecord.object = object;
-    updateRecord.name = name;
-    updateRecord.oldValue = oldValue;
-
-    notifier.notify(updateRecord);
-  }
-
-  Observer.createBindablePrototypeAccessor = function(proto, name) {
-    var privateName = name + '_';
-    var privateObservable  = name + 'Observable_';
-
-    proto[privateName] = proto[name];
-
-    Object.defineProperty(proto, name, {
-      get: function() {
-        var observable = this[privateObservable];
-        if (observable)
-          observable.deliver();
-
-        return this[privateName];
-      },
-      set: function(value) {
-        var observable = this[privateObservable];
-        if (observable) {
-          observable.setValue(value);
-          return;
-        }
-
-        var oldValue = this[privateName];
-        this[privateName] = value;
-        notify(this, name, value, oldValue);
-
-        return value;
-      },
-      configurable: true
-    });
-  }
-
-  Observer.bindToInstance = function(instance, name, observable, resolveFn) {
-    var privateName = name + '_';
-    var privateObservable  = name + 'Observable_';
-
-    instance[privateObservable] = observable;
-    var oldValue = instance[privateName];
-    var value = observable.open(function(value, oldValue) {
-      instance[privateName] = value;
-      notify(instance, name, value, oldValue);
-    });
-
-    if (resolveFn && !areSameValue(oldValue, value)) {
-      var resolvedValue = resolveFn(oldValue, value);
-      if (!areSameValue(value, resolvedValue)) {
-        value = resolvedValue;
-        if (observable.setValue)
-          observable.setValue(value);
-      }
-    }
-
-    instance[privateName] = value;
-    notify(instance, name, value, oldValue);
-
-    return {
-      close: function() {
-        observable.close();
-        instance[privateObservable] = undefined;
-      }
-    };
-  }
-
   function diffObjectFromChangeRecords(object, changeRecords, oldValues) {
     var added = {};
     var removed = {};
@@ -3044,7 +3130,11 @@
     targetTable.set(event, target);
     currentTargetTable.set(event, currentTarget);
 
-    for (var i = 0; i < listeners.length; i++) {
+    // Keep track of the invoke depth so that we only clean up the removed
+    // listeners if we are in the outermost invoke.
+    listeners.depth++;
+
+    for (var i = 0, len = listeners.length; i < len; i++) {
       var listener = listeners[i];
       if (listener.removed) {
         anyRemoved = true;
@@ -3072,7 +3162,9 @@
       }
     }
 
-    if (anyRemoved) {
+    listeners.depth--;
+
+    if (anyRemoved && listeners.depth === 0) {
       var copy = listeners.slice();
       listeners.length = 0;
       for (var i = 0; i < copy.length; i++) {
@@ -3137,25 +3229,11 @@
       return eventPhaseTable.get(this);
     },
     get path() {
-      var nodeList = new wrappers.NodeList();
       var eventPath = eventPathTable.get(this);
-      if (eventPath) {
-        var index = 0;
-        var lastIndex = eventPath.length - 1;
-        var baseRoot = getTreeScope(currentTargetTable.get(this));
-
-        for (var i = 0; i <= lastIndex; i++) {
-          var currentTarget = eventPath[i];
-          var currentRoot = getTreeScope(currentTarget);
-          if (currentRoot.contains(baseRoot) &&
-              // Make sure we do not add Window to the path.
-              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {
-            nodeList[index++] = currentTarget;
-          }
-        }
-        nodeList.length = index;
-      }
-      return nodeList;
+      if (!eventPath)
+        return [];
+      // TODO(arv): Event path should contain window.
+      return eventPath.slice();
     },
     stopPropagation: function() {
       stopPropagationTable.set(this, true);
@@ -3383,6 +3461,7 @@
       var listeners = listenersTable.get(this);
       if (!listeners) {
         listeners = [];
+        listeners.depth = 0;
         listenersTable.set(this, listeners);
       } else {
         // Might have a duplicate.
@@ -3491,6 +3570,15 @@
     if (!element)
       return null;
     var path = getEventPath(element, null);
+
+    // scope the path to this TreeScope
+    var idx = path.lastIndexOf(self);
+    if (idx == -1)
+      return null;
+    else
+      path = path.slice(0, idx);
+
+    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy
     return eventRetargetting(path, self);
   }
 
@@ -4448,7 +4536,7 @@
         } else {
           if (modNode && remNodes.length) {
             modNode.data += s;
-            cleanUpNodes(remNodes);
+            cleanupNodes(remNodes);
           }
           remNodes = [];
           s = '';
@@ -4766,6 +4854,53 @@
   scope.wrappers.Text = Text;
 })(window.ShadowDOMPolyfill);
 
+// Copyright 2014 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  function invalidateClass(el) {
+    scope.invalidateRendererBasedOnAttribute(el, 'class');
+  }
+
+  function DOMTokenList(impl, ownerElement) {
+    this.impl = impl;
+    this.ownerElement_ = ownerElement;
+  }
+
+  DOMTokenList.prototype = {
+    get length() {
+      return this.impl.length;
+    },
+    item: function(index) {
+      return this.impl.item(index);
+    },
+    contains: function(token) {
+      return this.impl.contains(token);
+    },
+    add: function() {
+      this.impl.add.apply(this.impl, arguments);
+      invalidateClass(this.ownerElement_);
+    },
+    remove: function() {
+      this.impl.remove.apply(this.impl, arguments);
+      invalidateClass(this.ownerElement_);
+    },
+    toggle: function(token) {
+      var rv = this.impl.toggle.apply(this.impl, arguments);
+      invalidateClass(this.ownerElement_);
+      return rv;
+    },
+    toString: function() {
+      return this.impl.toString();
+    }
+  };
+
+  scope.wrappers.DOMTokenList = DOMTokenList;
+})(window.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
@@ -4776,6 +4911,7 @@
   var ChildNodeInterface = scope.ChildNodeInterface;
   var GetElementsByInterface = scope.GetElementsByInterface;
   var Node = scope.wrappers.Node;
+  var DOMTokenList = scope.wrappers.DOMTokenList;
   var ParentNodeInterface = scope.ParentNodeInterface;
   var SelectorsInterface = scope.SelectorsInterface;
   var addWrapNodeListMethod = scope.addWrapNodeListMethod;
@@ -4783,6 +4919,7 @@
   var mixin = scope.mixin;
   var oneOf = scope.oneOf;
   var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
   var wrappers = scope.wrappers;
 
   var OriginalElement = window.Element;
@@ -4822,6 +4959,8 @@
     });
   }
 
+  var classListTable = new WeakMap();
+
   function Element(node) {
     Node.call(this, node);
   }
@@ -4859,6 +4998,31 @@
 
     matches: function(selector) {
       return originalMatches.call(this.impl, selector);
+    },
+
+    get classList() {
+      var list = classListTable.get(this);
+      if (!list) {
+        classListTable.set(this,
+            list = new DOMTokenList(unwrap(this).classList, this));
+      }
+      return list;
+    },
+
+    get className() {
+      return unwrap(this).className;
+    },
+
+    set className(v) {
+      this.setAttribute('class', v);
+    },
+
+    get id() {
+      return unwrap(this).id;
+    },
+
+    set id(v) {
+      this.setAttribute('id', v);
     }
   });
 
@@ -4875,28 +5039,6 @@
         Element.prototype.createShadowRoot;
   }
 
-  /**
-   * Useful for generating the accessor pair for a property that reflects an
-   * attribute.
-   */
-  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {
-    var attrName = opt_attrName || propertyName;
-    Object.defineProperty(prototype, propertyName, {
-      get: function() {
-        return this.impl[propertyName];
-      },
-      set: function(v) {
-        this.impl[propertyName] = v;
-        invalidateRendererBasedOnAttribute(this, attrName);
-      },
-      configurable: true,
-      enumerable: true
-    });
-  }
-
-  setterDirtiesAttribute(Element.prototype, 'id');
-  setterDirtiesAttribute(Element.prototype, 'className', 'class');
-
   mixin(Element.prototype, ChildNodeInterface);
   mixin(Element.prototype, GetElementsByInterface);
   mixin(Element.prototype, ParentNodeInterface);
@@ -4905,8 +5047,7 @@
   registerWrapper(OriginalElement, Element,
                   document.createElementNS(null, 'x'));
 
-  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings
-  // that reflect attributes.
+  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;
   scope.matchesNames = matchesNames;
   scope.wrappers.Element = Element;
 })(window.ShadowDOMPolyfill);
@@ -5802,6 +5943,8 @@
 (function(scope) {
   'use strict';
 
+  var Element = scope.wrappers.Element;
+  var HTMLElement = scope.wrappers.HTMLElement;
   var registerObject = scope.registerObject;
 
   var SVG_NS = 'http://www.w3.org/2000/svg';
@@ -5809,6 +5952,16 @@
   var SVGTitleElement = registerObject(svgTitleElement);
   var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;
 
+  // IE11 does not have classList for SVG elements. The spec says that classList
+  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving
+  // SVGElement without a classList property. We therefore move the accessor for
+  // IE11.
+  if (!('classList' in svgTitleElement)) {
+    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');
+    Object.defineProperty(HTMLElement.prototype, 'classList', descr);
+    delete Element.prototype.classList;
+  }
+
   scope.wrappers.SVGElement = SVGElement;
 })(window.ShadowDOMPolyfill);
 
@@ -7100,6 +7253,10 @@
     getSelection: function() {
       renderAllPending();
       return new Selection(originalGetSelection.call(unwrap(this)));
+    },
+    getElementsByName: function(name) {
+      return SelectorsInterface.querySelectorAll.call(this,
+          '[name=' + JSON.stringify(String(name)) + ']');
     }
   });
 
@@ -7244,6 +7401,7 @@
     'createTextNode',
     'elementFromPoint',
     'getElementById',
+    'getElementsByName',
     'getSelection',
   ]);
 
@@ -7534,7 +7692,7 @@
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 
-(function() {
+(function(scope) {
 
   // convenient global
   window.wrap = ShadowDOMPolyfill.wrapIfNeeded;
@@ -7567,7 +7725,62 @@
   };
 
   Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;
-})();
+
+  function queryShadow(node, selector) {
+    var m, el = node.firstElementChild;
+    var shadows, sr, i;
+    shadows = [];
+    sr = node.shadowRoot;
+    while(sr) {
+      shadows.push(sr);
+      sr = sr.olderShadowRoot;
+    }
+    for(i = shadows.length - 1; i >= 0; i--) {
+      m = shadows[i].querySelector(selector);
+      if (m) {
+        return m;
+      }
+    }
+    while(el) {
+      m = queryShadow(el, selector);
+      if (m) {
+        return m;
+      }
+      el = el.nextElementSibling;
+    }
+    return null;
+  }
+
+  function queryAllShadows(node, selector, results) {
+    var el = node.firstElementChild;
+    var temp, sr, shadows, i, j;
+    shadows = [];
+    sr = node.shadowRoot;
+    while(sr) {
+      shadows.push(sr);
+      sr = sr.olderShadowRoot;
+    }
+    for (i = shadows.length - 1; i >= 0; i--) {
+      temp = shadows[i].querySelectorAll(selector);
+      for(j = 0; j < temp.length; j++) {
+        results.push(temp[j]);
+      }
+    }
+    while (el) {
+      queryAllShadows(el, selector, results);
+      el = el.nextElementSibling;
+    }
+    return results;
+  }
+
+  scope.queryAllShadows = function(node, selector, all) {
+    if (all) {
+      return queryAllShadows(node, selector, []);
+    } else {
+      return queryShadow(node, selector);
+    }
+  };
+})(window.Platform);
 
 /*
  * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
@@ -7969,7 +8182,7 @@
     var cssText = '';
     if (cssRules) {
       Array.prototype.forEach.call(cssRules, function(rule) {
-        if (rule.selectorText && (rule.style && rule.style.cssText)) {
+        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {
           cssText += this.scopeSelector(rule.selectorText, scopeSelector, 
             this.strictStyling) + ' {\n\t';
           cssText += this.propertiesFromRule(rule) + '\n}\n\n';
@@ -7977,8 +8190,23 @@
           cssText += '@media ' + rule.media.mediaText + ' {\n';
           cssText += this.scopeRules(rule.cssRules, scopeSelector);
           cssText += '\n}\n\n';
-        } else if (rule.cssText) {
-          cssText += rule.cssText + '\n\n';
+        } else {
+          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText
+          // 'cssText' in rule returns true, but rule.cssText throws anyway
+          // We can test the rule type, e.g.
+          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {
+          // but this will prevent cssText propagation in other browsers which
+          // support it.
+          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed
+          // from that collection; this would be a proper fix.
+          // For now, I'm trapping the exception so IE11 is unblocked in other areas.
+          try {
+            if (rule.cssText) {
+              cssText += rule.cssText + '\n\n';
+            }
+          } catch(x) {
+            // squelch
+          }
         }
       }, this);
     }
@@ -8306,6 +8534,7 @@
         }
         style.__importParsed = true;
         this.markParsingComplete(elt);
+        this.parseNext();
       }
 
       var hasResource = HTMLImports.parser.hasResource;
@@ -9420,9 +9649,11 @@
         module = null;
         break;
       case 2:
+        // dependsOrFactory is `factory` in this case
         module = dependsOrFactory.apply(this);
         break;
       default:
+        // dependsOrFactory is `depends` in this case
         module = withDependencies(moduleFactory, dependsOrFactory);
         break;
     }
@@ -9444,7 +9675,8 @@
   // exports
 
   scope.marshal = marshal;
-  scope.module = module;
+  // `module` confuses commonjs detectors
+  scope.modularize = module;
   scope.using = using;
 
 })(window);
@@ -9551,7 +9783,7 @@
       var replacement;
       if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {
         if (v === 'style') {
-          replacement = replaceUrlsInCssText(value, url, CSS_URL_REGEXP);
+          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);
         } else {
           replacement = resolveRelativeUrl(url, value);
         }
@@ -9563,7 +9795,7 @@
 
 var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
 var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
-var URL_ATTRS = ['href', 'src', 'action', 'style'];
+var URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];
 var URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';
 var URL_TEMPLATE_SEARCH = '{{.*}}';
 
@@ -10261,8 +10493,8 @@
             this.receive(url, elt, null, body);
         }.bind(this), 0);
       } else {
-        var receiveXhr = function(err, resource) {
-          this.receive(url, elt, err, resource);
+        var receiveXhr = function(err, resource, redirectedUrl) {
+          this.receive(url, elt, err, resource, redirectedUrl);
         }.bind(this);
         xhr.load(url, receiveXhr);
         // TODO(sorvell): blocked on)
@@ -10280,16 +10512,25 @@
         */
       }
     },
-    receive: function(url, elt, err, resource) {
+    receive: function(url, elt, err, resource, redirectedUrl) {
       this.cache[url] = resource;
       var $p = this.pending[url];
+      if ( redirectedUrl && redirectedUrl !== url ) {
+        this.cache[redirectedUrl] = resource;
+        $p = $p.concat(this.pending[redirectedUrl]);
+      }
       for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {
         //if (!err) {
-          this.onload(url, p, resource);
+          // If url was redirected, use the redirected location so paths are
+          // calculated relative to that.
+          this.onload(redirectedUrl || url, p, resource);
         //}
         this.tail();
       }
       this.pending[url] = null;
+      if ( redirectedUrl && redirectedUrl !== url ) {
+        this.pending[redirectedUrl] = null;
+      }
     },
     tail: function() {
       --this.inflight;
@@ -10317,8 +10558,17 @@
       request.open('GET', url, xhr.async);
       request.addEventListener('readystatechange', function(e) {
         if (request.readyState === 4) {
+          // Servers redirecting an import can add a Location header to help us
+          // polyfill correctly.
+          var locationHeader = request.getResponseHeader("Location");
+          var redirectedUrl = null;
+          if (locationHeader) {
+            var redirectedUrl = (locationHeader.substr( 0, 1 ) === "/")
+              ? location.origin + locationHeader  // Location is a relative path
+              : redirectedUrl;                    // Full path
+          }
           next.call(nextContext, !xhr.ok(request) && request,
-              request.response || request.responseText, url);
+              request.response || request.responseText, redirectedUrl);
         }
       });
       request.send();
@@ -10392,9 +10642,14 @@
       fn.call(this, elt);
     }
   },
-  // only 1 element may be parsed at a time; parsing is async so, each
+  // only 1 element may be parsed at a time; parsing is async so each
   // parsing implementation must inform the system that parsing is complete
   // via markParsingComplete.
+  // To prompt the system to parse the next element, parseNext should then be
+  // called.
+  // Note, parseNext used to be included at the end of markParsingComplete, but
+  // we must not do this so that, for example, we can (1) mark parsing complete 
+  // then (2) fire an import load event, and then (3) parse the next resource.
   markParsing: function(elt) {
     flags.parse && console.log('parsing', elt);
     this.parsingElement = elt;
@@ -10406,16 +10661,31 @@
     }
     this.parsingElement = null;
     flags.parse && console.log('completed', elt);
-    this.parseNext();
+  },
+  invalidateParse: function(doc) {
+    if (doc && doc.__importLink) {
+      doc.__importParsed = doc.__importLink.__importParsed = false;
+      this.parseSoon();
+    }
+  },
+  parseSoon: function() {
+    if (this._parseSoon) {
+      cancelAnimationFrame(this._parseDelay);
+    }
+    var parser = this;
+    this._parseSoon = requestAnimationFrame(function() {
+      parser.parseNext();
+    });
   },
   parseImport: function(elt) {
-    elt.import.__importParsed = true;
     // TODO(sorvell): consider if there's a better way to do this;
     // expose an imports parsing hook; this is needed, for example, by the
     // CustomElements polyfill.
     if (HTMLImports.__importsParsingHook) {
       HTMLImports.__importsParsingHook(elt);
     }
+    elt.import.__importParsed = true;
+    this.markParsingComplete(elt);
     // fire load event
     if (elt.__resource) {
       elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    
@@ -10433,7 +10703,7 @@
         }
       }
     }
-    this.markParsingComplete(elt);
+    this.parseNext();
   },
   parseLink: function(linkElt) {
     if (nodeIsImport(linkElt)) {
@@ -10463,6 +10733,7 @@
         callback(e);
       }
       self.markParsingComplete(elt);
+      self.parseNext();
     };
     elt.addEventListener('load', done);
     elt.addEventListener('error', done);
@@ -10934,6 +11205,7 @@
 var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
 var importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';
 var importer = scope.importer;
+var parser = scope.parser;
 
 // we track mutations for addedNodes, looking for imports
 function handler(mutations) {
@@ -10946,7 +11218,9 @@
 
 // find loadable elements and add them to the importer
 function addedNodes(nodes) {
+  var owner;
   for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
+    owner = owner || n.ownerDocument;
     if (shouldLoadNode(n)) {
       importer.loadNode(n);
     }
@@ -10954,6 +11228,14 @@
       addedNodes(n.children);
     }
   }
+  // TODO(sorvell): This is not the right approach here. We shouldn't need to
+  // invalidate parsing when an element is added. Disabling this code 
+  // until a better approach is found.
+  /*
+  if (owner) {
+    parser.invalidateParse(owner);
+  }
+  */
 }
 
 function shouldLoadNode(node) {
@@ -11418,12 +11700,9 @@
 // native document.registerElement?
 
 var hasNative = Boolean(document.registerElement);
-// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399
-// we'll address this by defaulting to CE polyfill in the presence of the SD
-// polyfill. This will avoid spamming excess attached/detached callbacks.
-// If there is a compelling need to run CE native with SD polyfill,
-// we'll need to fix this issue.
-var useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;
+// For consistent timing, use native custom elements only when not polyfilling
+// other key related web components features.
+var useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);
 
 if (useNative) {
 
@@ -11713,6 +11992,7 @@
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/
   // index.html#dfn-attribute-changed-callback
   function changeAttribute(name, value, operation) {
+    name = name.toLowerCase();
     var oldValue = this.getAttribute(name);
     operation.apply(this, arguments);
     var newValue = this.getAttribute(name);
@@ -13193,9 +13473,6 @@
       };
     },
 
-    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may
-    // make sense to issue a warning or even throw if the template is already
-    // "activated", since this would be a strange thing to do.
     set bindingDelegate(bindingDelegate) {
       if (this.delegate_) {
         throw Error('Template must be cleared before a new bindingDelegate ' +
diff --git a/pkg/web_components/lib/platform.concat.js.map b/pkg/web_components/lib/platform.concat.js.map
index df7b0d1..9abc6b5 100644
--- a/pkg/web_components/lib/platform.concat.js.map
+++ b/pkg/web_components/lib/platform.concat.js.map
@@ -19,6 +19,7 @@
     "../ShadowDOM/src/wrappers/node-interfaces.js",
     "../ShadowDOM/src/wrappers/CharacterData.js",
     "../ShadowDOM/src/wrappers/Text.js",
+    "../ShadowDOM/src/wrappers/DOMTokenList.js",
     "../ShadowDOM/src/wrappers/Element.js",
     "../ShadowDOM/src/wrappers/HTMLElement.js",
     "../ShadowDOM/src/wrappers/HTMLCanvasElement.js",
@@ -83,26 +84,27 @@
     "src/patches-mdv.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9lDA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACj4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9oBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpvBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA,C;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjiBA;AACA;AACA;AACA;AACA;AACA,sD;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA,4D;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0B;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzuCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CClEA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CCnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;CCprDA;AACA;CCDA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC/ZA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CChDA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCnXA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CChFA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCn4BA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,C;AC5HA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CC/CA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCdA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9tBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CCjHA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CC1EA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CC5CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CCzCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;CC7CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;CCrJA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;CC1TA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CC9BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCtCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CC1CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCzBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCtEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCrBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CCzCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CC9DA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjDA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CC/DA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCnCA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCpCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CC9BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;CC3BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CC7CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CClEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCvCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjDA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CC9FA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCvBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCzEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9oBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCrDA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CClEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CC1UA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CCpEA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CCvBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;CC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CCjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CCpwBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC5CA,C;ACAA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;CCdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CCpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,C;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CChIA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjiBA;AACA;AACA;AACA;AACA;AACA,sD;ACLA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CCtLA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCvTA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCtSA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCpEA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCvDA;AACA;AACA;AACA;AACA;AACA,4D;ACLA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA,EACA;AACA,EACA;CCvVA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;CC3dA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA,0B;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;CCjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCtEA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;CCtVA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CCtuCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,C",
   "sourcesContent": [
     "/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n",
     "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n",
-    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function isNaN(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var ident = identStart + '+' + identPart + '*';\n  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';\n  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';\n  var path = '(?:' + identOrElementIndex + ')(?:\\\\s*\\\\.\\\\s*' + identOrElementIndex + ')*';\n  var pathRegExp = new RegExp('^' + path + '$');\n\n  function isPathValid(s) {\n    if (typeof s != 'string')\n      return false;\n    s = s.trim();\n\n    if (s == '')\n      return true;\n\n    if (s[0] == '.')\n      return false;\n\n    return pathRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(s, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (s.trim() == '')\n      return this;\n\n    if (isIndex(s)) {\n      this.push(s);\n      return this;\n    }\n\n    s.split(/\\s*\\.\\s*/).filter(function(part) {\n      return part;\n    }).forEach(function(part) {\n      this.push(part);\n    }, this);\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null)\n      pathString = '';\n\n    if (typeof pathString !== 'string')\n      pathString = String(pathString);\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n    if (!isPathValid(pathString))\n      return invalidPath;\n    var path = new Path(pathString, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      return this.join('.');\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var accessors = this.map(function(ident) {\n        return isIndex(ident) ? '[\"' + ident + '\"]' : '.' + ident;\n      });\n\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      for (; i < (this.length - 1); i++) {\n        var ident = this[i];\n        pathString += accessors[i];\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      pathString += accessors[i];\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  function notify(object, name, value, oldValue) {\n    if (areSameValue(value, oldValue))\n      return;\n\n    // TODO(rafaelw): Hack hack hack. This entire code really needs to move\n    // out of observe-js into polymer.\n    if (typeof object.propertyChanged_ == 'function')\n      object.propertyChanged_(name, value, oldValue);\n\n    if (!hasObserve)\n      return;\n\n    var notifier = object.notifier_;\n    if (!notifier)\n      notifier = object.notifier_ = Object.getNotifier(object);\n\n    updateRecord.object = object;\n    updateRecord.name = name;\n    updateRecord.oldValue = oldValue;\n\n    notifier.notify(updateRecord);\n  }\n\n  Observer.createBindablePrototypeAccessor = function(proto, name) {\n    var privateName = name + '_';\n    var privateObservable  = name + 'Observable_';\n\n    proto[privateName] = proto[name];\n\n    Object.defineProperty(proto, name, {\n      get: function() {\n        var observable = this[privateObservable];\n        if (observable)\n          observable.deliver();\n\n        return this[privateName];\n      },\n      set: function(value) {\n        var observable = this[privateObservable];\n        if (observable) {\n          observable.setValue(value);\n          return;\n        }\n\n        var oldValue = this[privateName];\n        this[privateName] = value;\n        notify(this, name, value, oldValue);\n\n        return value;\n      },\n      configurable: true\n    });\n  }\n\n  Observer.bindToInstance = function(instance, name, observable, resolveFn) {\n    var privateName = name + '_';\n    var privateObservable  = name + 'Observable_';\n\n    instance[privateObservable] = observable;\n    var oldValue = instance[privateName];\n    var value = observable.open(function(value, oldValue) {\n      instance[privateName] = value;\n      notify(instance, name, value, oldValue);\n    });\n\n    if (resolveFn && !areSameValue(oldValue, value)) {\n      var resolvedValue = resolveFn(oldValue, value);\n      if (!areSameValue(value, resolvedValue)) {\n        value = resolvedValue;\n        if (observable.setValue)\n          observable.setValue(value);\n      }\n    }\n\n    instance[privateName] = value;\n    notify(instance, name, value, oldValue);\n\n    return {\n      close: function() {\n        observable.close();\n        instance[privateObservable] = undefined;\n      }\n    };\n  }\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
+    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (parts.length)\n      Array.prototype.push.apply(this, parts.slice());\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
     "// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n",
     "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n",
     "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    for (var i = 0; i < listeners.length; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    if (anyRemoved) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var nodeList = new wrappers.NodeList();\n      var eventPath = eventPathTable.get(this);\n      if (eventPath) {\n        var index = 0;\n        var lastIndex = eventPath.length - 1;\n        var baseRoot = getTreeScope(currentTargetTable.get(this));\n\n        for (var i = 0; i <= lastIndex; i++) {\n          var currentTarget = eventPath[i];\n          var currentRoot = getTreeScope(currentTarget);\n          if (currentRoot.contains(baseRoot) &&\n              // Make sure we do not add Window to the path.\n              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {\n            nodeList[index++] = currentTarget;\n          }\n        }\n        nodeList.length = index;\n      }\n      return nodeList;\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    this.impl = impl;\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(this.impl.target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return this.impl[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n",
     "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n",
-    "/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanUpNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalName(el, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  /**\n   * Useful for generating the accessor pair for a property that reflects an\n   * attribute.\n   */\n  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {\n    var attrName = opt_attrName || propertyName;\n    Object.defineProperty(prototype, propertyName, {\n      get: function() {\n        return this.impl[propertyName];\n      },\n      set: function(v) {\n        this.impl[propertyName] = v;\n        invalidateRendererBasedOnAttribute(this, attrName);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  setterDirtiesAttribute(Element.prototype, 'id');\n  setterDirtiesAttribute(Element.prototype, 'className', 'class');\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings\n  // that reflect attributes.\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    this.impl = impl;\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    get length() {\n      return this.impl.length;\n    },\n    item: function(index) {\n      return this.impl.item(index);\n    },\n    contains: function(token) {\n      return this.impl.contains(token);\n    },\n    add: function() {\n      this.impl.add.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      this.impl.remove.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = this.impl.toggle.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n",
@@ -117,7 +119,7 @@
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n",
@@ -128,12 +130,12 @@
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n",
     "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n  };\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n})();\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else if (rule.cssText) {\n          cssText += rule.cssText + '\\n\\n';\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n",
     "} else {",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n",
     "}",
@@ -143,26 +145,26 @@
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n})(window.Platform);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  scope.module = module;\n  scope.using = using;\n\n})(window);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n",
     "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource) {\n          this.receive(url, elt, err, resource);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          this.onload(url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, url);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so, each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n    this.parseNext();\n  },\n  parseImport: function(elt) {\n    elt.import.__importParsed = true;\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.markParsingComplete(elt);\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.cache[redirectedUrl] = resource;\n        $p = $p.concat(this.pending[redirectedUrl]);\n      }\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          // If url was redirected, use the redirected location so paths are\n          // calculated relative to that.\n          this.onload(redirectedUrl || url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.pending[redirectedUrl] = null;\n      }\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : redirectedUrl;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    elt.import.__importParsed = true;\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n",
-    " /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n",
+    " /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};",
     " /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399\n// we'll address this by defaulting to CE polyfill in the presence of the SD\n// polyfill. This will avoid spamming excess attached/detached callbacks.\n// If there is a compelling need to run CE native with SD polyfill,\n// we'll need to fix this issue.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n\n    // install upgrade hook if HTMLImports are available\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        CustomElements.parser.parse(elt.import);\n      }\n    }\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n",
     "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n",
-    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may\n    // make sense to issue a warning or even throw if the template is already\n    // \"activated\", since this would be a strange thing to do.\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n",
+    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"
   ]
 }
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.js b/pkg/web_components/lib/platform.js
index f937545..2e3f9d6 100644
--- a/pkg/web_components/lib/platform.js
+++ b/pkg/web_components/lib/platform.js
@@ -7,11 +7,11 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version: 0.2.4-15e4e51
+// @version: 0.3.3-29065bc
 
-window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.shadow&&document.querySelectorAll("script").length>1&&console.warn("platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}(),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function isPathValid(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:pathRegExp.test(a))}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:isIndex(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),void(hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())))}function getPath(a){if(a instanceof Path)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=pathCache[a];if(b)return b;if(!isPathValid(a))return invalidPath;var b=new Path(a,constructorIsPrivate);return pathCache[a]=b,b}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function notify(a,b,c,d){if(!areSameValue(c,d)&&("function"==typeof a.propertyChanged_&&a.propertyChanged_(b,c,d),hasObserve)){var e=a.notifier_;e||(e=a.notifier_=Object.getNotifier(a)),updateRecord.object=a,updateRecord.name=b,updateRecord.oldValue=d,e.notify(updateRecord)}}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",ident=identStart+"+"+identPart+"*",elementIndex="(?:[0-9]|[1-9]+[0-9]+)",identOrElementIndex="(?:"+ident+"|"+elementIndex+")",path="(?:"+identOrElementIndex+")(?:\\s*\\.\\s*"+identOrElementIndex+")*",pathRegExp=new RegExp("^"+path+"$"),constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){return this.join(".")},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a=this.map(function(a){return isIndex(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var d=0;d<this.length-1;d++){{this[d]}c+=a[d],b+=" &&\n     "+c+" != null"}return b+=")\n",c+=a[d],b+="  return "+c+";\nelse\n  return undefined;",new Function("obj",b)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},updateRecord={object:void 0,type:"update",name:void 0,oldValue:void 0};Observer.createBindablePrototypeAccessor=function(a,b){var c=b+"_",d=b+"Observable_";a[c]=a[b],Object.defineProperty(a,b,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(a){var e=this[d];if(e)return void e.setValue(a);var f=this[c];return this[c]=a,notify(this,b,a,f),a},configurable:!0})},Observer.bindToInstance=function(a,b,c,d){var e=b+"_",f=b+"Observable_";a[f]=c;var g=a[e],h=c.open(function(c,d){a[e]=c,notify(a,b,c,d)});if(d&&!areSameValue(g,h)){var i=d(g,h);areSameValue(h,i)||(h=i,c.setValue&&c.setValue(h))}return a[e]=h,notify(a,b,h,g),{close:function(){c.close(),a[f]=void 0}}};var EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=L(b),d=0;d<c.length;d++){var e=c[d];K(a,e,M(b,e))}return a}function e(a,b){for(var c=L(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}K(a,e,M(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){N.value=c,K(a,b,N)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=G.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return J&&l(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function n(a){return J&&l(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function o(a){return J&&l(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return P}}function q(b,c,d){for(var e=L(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){O&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),K(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===G.get(a)),G.set(a,b),H.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return G.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a instanceof I.EventTarget||a instanceof I.Event||a instanceof I.Range||a instanceof I.DOMImplementation||a instanceof I.CanvasRenderingContext2D||I.WebGLRenderingContext&&a instanceof I.WebGLRenderingContext}function x(a){return R&&a instanceof R||a instanceof T||a instanceof S||a instanceof U||a instanceof V||a instanceof Q||a instanceof W||X&&a instanceof X||Y&&a instanceof Y}function y(a){return null===a?null:(c(x(a)),a.polymerWrapper_||(a.polymerWrapper_=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.impl)}function A(a){return a&&w(a)?z(a):a}function B(a){return a&&!w(a)?y(a):a}function C(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.polymerWrapper_=b)}function D(a,b,c){Z.get=c,K(a.prototype,b,Z)}function E(a,b){D(a,b,function(){return y(this.impl[b])})}function F(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=B(this);return a[b].apply(a,arguments)}})})}var G=new WeakMap,H=new WeakMap,I=Object.create(null),J=b(),K=Object.defineProperty,L=Object.getOwnPropertyNames,M=Object.getOwnPropertyDescriptor,N={value:void 0,configurable:!0,enumerable:!1,writable:!0};L(window);var O=/Firefox/.test(navigator.userAgent),P={get:function(){},set:function(){},configurable:!0,enumerable:!0},Q=window.DOMImplementation,R=window.EventTarget,S=window.Event,T=window.Node,U=window.Window,V=window.Range,W=window.CanvasRenderingContext2D,X=window.WebGLRenderingContext,Y=window.SVGElementInstance,Z={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=G,a.defineGetter=D,a.defineWrapGetter=E,a.forwardMethodsToWrapper=F,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=H,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=C,a.unwrap=z,a.unwrapIfNeeded=A,a.wrap=y,a.wrapIfNeeded=B,a.wrappers=I}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r,o.push(this)}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof Q.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof Q.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof Q.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!S.get(a)&&(S.set(a,!0),n(P(a),P(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(T.get(b))throw new Error("InvalidStateError");T.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof Q.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof Q.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];i instanceof Q.Document&&(g=i.defaultView)}return _.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),X.set(b,ab),V.delete(b,null),T.delete(b),b.defaultPrevented}function o(a,b,c,d){var e=bb;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=cb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=db,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=R.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===bb)return!0;c===db&&(c=cb)}else if(c===db&&!b.bubbles)return!0;if("relatedTarget"in b){var i=O(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=P(j),m=k(b,a,l);if(m===g)return!0}else m=null;W.set(b,m)}}X.set(b,c);var n=b.type,o=!1;U.set(b,g),V.set(b,a);for(var p=0;p<f.length;p++){var q=f[p];if(q.removed)o=!0;else if(!(q.type!==n||!q.capture&&c===bb||q.capture&&c===db))try{if("function"==typeof q.handler?q.handler.call(a,b):q.handler.handleEvent(b),Z.get(b))return!1
-}catch(r){J||(J=r)}}if(o){var s=f.slice();f.length=0;for(var p=0;p<s.length;p++)s[p].removed||f.push(s[p])}return!Y.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof eb))return P(x(eb,"Event",a,b));var c=a;return pb||"beforeunload"!==c.type?void(this.impl=c):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:O(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):P(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=O(arguments[b]);var c=O(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(nb)return new a(c,u(d));var e=O(document.createEvent(b)),f=mb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=O(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){this.impl=a}function C(a){return a instanceof Q.ShadowRoot&&(a=a.host),O(a)}function D(a,b){var c=R.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=O(a);c;c=c.parentNode)if(D(P(c),b))return!0;return!1}function F(a){K(a,rb)}function G(b,c,e,f){a.renderAllPending();var g=P(sb.call(c.impl,e,f));if(!g)return null;var i=d(g,null);return h(i,b)}function H(a){return function(){var b=$.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=$.get(this);d||(d=Object.create(null),$.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.unwrap,P=a.wrap,Q=a.wrappers,R=(new WeakMap,new WeakMap),S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=0,bb=1,cb=2,db=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var eb=window.Event;eb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return U.get(this)},get currentTarget(){return V.get(this)},get eventPhase(){return X.get(this)},get path(){var a=new Q.NodeList,b=_.get(this);if(b){for(var c=0,d=b.length-1,e=L(V.get(this)),f=0;d>=f;f++){var g=b[f],h=L(g);h.contains(e)&&(f!==d||g instanceof Q.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){Y.set(this,!0)},stopImmediatePropagation:function(){Y.set(this,!0),Z.set(this,!0)}},N(eb,t,document.createEvent("Event"));var fb=v("UIEvent",t),gb=v("CustomEvent",t),hb={get relatedTarget(){var a=W.get(this);return void 0!==a?a:P(O(this).relatedTarget)}},ib=M({initMouseEvent:w("initMouseEvent",14)},hb),jb=M({initFocusEvent:w("initFocusEvent",5)},hb),kb=v("MouseEvent",fb,ib),lb=v("FocusEvent",fb,jb),mb=Object.create(null),nb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!nb){var ob=function(a,b,c){if(c){var d=mb[c];b=M(M({},d),b)}mb[a]=b};ob("Event",{bubbles:!1,cancelable:!1}),ob("CustomEvent",{detail:null},"Event"),ob("UIEvent",{view:null,detail:0},"Event"),ob("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ob("FocusEvent",{relatedTarget:null},"UIEvent")}var pb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}}),pb&&N(pb,y);var qb=window.EventTarget,rb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;rb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=R.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],R.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=R.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=O(b),d=c.type;S.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return O(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},qb&&N(qb,B);var sb=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=gb,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=lb,a.wrappers.MouseEvent=kb,a.wrappers.UIEvent=fb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,o)}function c(a){this.impl=a}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.unwrap,k=a.wrap,l=window.TouchEvent;if(l){var m;try{m=document.createEvent("TouchEvent")}catch(n){return}var o={enumerable:!1};c.prototype={get target(){return k(this.impl.target)}};var p={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){p.get=function(){return this.impl[a]},Object.defineProperty(c.prototype,a,p)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(j(this).touches)},get targetTouches(){return e(j(this).targetTouches)},get changedTouches(){return e(j(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(l,f,m),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,g)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap,g={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);O=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;O=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return J(b[0]);for(var d=J(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(J(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=J(b),e=d.parentNode;e&&V.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=J(a),g=f.firstChild;g;)c=g.nextSibling,V.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=L(c?P.call(c,a.impl,!1):Q.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof N.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof R),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unwrap,K=a.unwrapIfNeeded,L=a.wrap,M=a.wrapIfNeeded,N=a.wrappers,O=!1,P=document.importNode,Q=window.Node.prototype.cloneNode,R=window.Node,S=window.DocumentFragment,T=(R.prototype.appendChild,R.prototype.compareDocumentPosition),U=R.prototype.insertBefore,V=R.prototype.removeChild,W=R.prototype.replaceChild,X=/Trident/.test(navigator.userAgent),Y=X?function(a,b){try{V.call(a,b)}catch(c){if(!(a instanceof S))throw c}}:function(a,b){V.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=J(c):(d=c,c=L(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),U.call(this.impl,J(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:this.impl;j?U.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=J(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Y(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Y(this.impl,f);return O||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=J(d):(e=d,d=L(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),W.call(this.impl,J(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&W.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:L(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:L(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:L(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:L(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:L(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),this.impl.textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,M(a))},compareDocumentPosition:function(a){return T.call(this.impl,K(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,cleanUpNodes(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(R,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b){return a.matches(b)}function d(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===l}function e(){return!0}function f(a,b){return a.localName===b}function g(a,b){return a.namespaceURI===b}function h(a,b,c){return a.namespaceURI===b&&a.localName===c}function i(a,b,c,d,e){for(var f=a.firstElementChild;f;)c(f,d,e)&&(b[b.length++]=f),i(f,b,c,d,e),f=f.nextElementSibling;return b}var j=a.wrappers.HTMLCollection,k=a.wrappers.NodeList,l="http://www.w3.org/1999/xhtml",m={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return i(this,new k,c,a)}},n={getElementsByTagName:function(a){var b=new j;return"*"===a?i(this,b,e):i(this,b,d,a,a.toLowerCase())},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new j;if(""===a)a=null;else if("*"===a)return"*"===b?i(this,c,e):i(this,c,f,b);return"*"===b?i(this,c,g,a):i(this,c,h,a,b)}};a.GetElementsByInterface=n,a.SelectorsInterface=m}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){h.call(this,a)}function e(a,c,d){var e=d||c;Object.defineProperty(a,c,{get:function(){return this.impl[c]},set:function(a){this.impl[c]=a,b(this,e)},configurable:!0,enumerable:!0})}var f=a.ChildNodeInterface,g=a.GetElementsByInterface,h=a.wrappers.Node,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.wrappers,o=window.Element,p=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return o.prototype[a]}),q=p[0],r=o.prototype[q];d.prototype=Object.create(h.prototype),l(d.prototype,{createShadowRoot:function(){var b=new n.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return r.call(this.impl,a)}}),p.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),o.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),e(d.prototype,"id"),e(d.prototype,"className","class"),l(d.prototype,f),l(d.prototype,g),l(d.prototype,i),l(d.prototype,j),m(o,d,document.createElementNS(null,"x")),a.matchesNames=p,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(z,b)}function d(a){return a.replace(A,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof y.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=k.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);k.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=h(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!l){var b=c(a);j.set(this,i(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unwrap,i=a.wrap,j=new WeakMap,k=new WeakMap,l=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{get content(){return l?i(this.impl.content):j.get(this)}}),l&&g(l,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.registerObject,c="http://www.w3.org/2000/svg",d=document.createElementNS(c,"title"),e=b(d),f=Object.getPrototypeOf(e.prototype).constructor;a.wrappers.SVGElement=f}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.SVGElementInstance;g&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return f(this.impl.correspondingElement)},get correspondingUseElement(){return f(this.impl.correspondingUseElement)},get parentNode(){return f(this.impl.parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return f(this.impl.firstChild)},get lastChild(){return f(this.impl.lastChild)},get previousSibling(){return f(this.impl.previousSibling)},get nextSibling(){return f(this.impl.nextSibling)}}),e(g,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;if(g){c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)
-},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))},toString:function(){return this.impl.toString()}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=k(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;m.set(this,e),this.treeScope_=new d(this,g(e||a)),l.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unwrap,l=new WeakMap,m=new WeakMap,n=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return m.get(this)||null},get host(){return l.get(this)||null},invalidateShadowRenderer:function(){return l.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return n.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=G(a),g=G(c),h=e?G(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){I.set(a,[])}function f(a){var b=I.get(a);return b||I.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<M.length;a++){var b=M[a],c=b.parentRenderer;c&&c.dirty||b.render()}M=[]}function i(){y=null,h()}function j(a){var b=K.get(a);return b||(b=new n(a),K.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=J.get(a);c?c.push(b):J.set(a,[b])}function r(a){return J.get(a)}function s(a){J.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!O.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),M=[],N=new ArraySplice;N.equals=function(a,b){return G(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(G(b)),h=a||new WeakMap,i=N.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(h);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){if(this.dirty=!0,M.push(this),y)return;y=window[L](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){a.impl.polymerShadowRenderer_=this}};var O=/^[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}{var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap;window.Selection}b.prototype={get anchorNode(){return f(this.impl.anchorNode)},get focusNode(){return f(this.impl.focusNode)},addRange:function(a){this.impl.addRange(d(a))},collapse:function(a,b){this.impl.collapse(e(a),b)},containsNode:function(a,b){return this.impl.containsNode(e(a),b)},extend:function(a,b){this.impl.extend(e(a),b)},getRangeAt:function(a){return f(this.impl.getRangeAt(a))},removeRange:function(a){this.impl.removeRange(d(a))},selectAllChildren:function(a){this.impl.selectAllChildren(e(a))},toString:function(){return this.impl.toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return A(c.apply(this.impl,arguments))}}function d(a,b){D.call(b.impl,z(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return A(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.unwrap,A=a.wrap,B=a.wrapEventTargetMethods,C=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var D=document.adoptNode,E=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,this.impl)},getSelection:function(){return x(),new m(E.call(z(this)))}}),document.registerElement){var F=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void(this.impl=a):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){A(this)instanceof d||y(this),b.apply(A(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);F.call(z(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=C.get(this);return a?a:(a=new g(z(this).implementation),C.set(this,a),a)},get defaultView(){return A(z(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),B([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(m.call(h(this)))},get document(){return j(h(this).document)}}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(){window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot}(),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=g.sheet.cssRules,b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertCombinators(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertCombinators:function(a){for(var b=0;b<combinatorsRe.length;b++)a=a.replace(combinatorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n"):a.type===CSSRule.MEDIA_RULE?(c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n"):a.cssText&&(c+=a.cssText+"\n\n")},this),c},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*'([^']*)'[^}]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),combinatorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):C.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a)}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:f.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}}),Platform.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");
-break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}},a.URL=i}}(window),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}}),a.mixin=b}(window.Platform),function(a){"use strict";function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),function(a){a.templateContent=a.templateContent||function(a){return a.content}}(window.Platform),function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.module=c,a.using=e}(window),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(a,b,d,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=c(b,h,d),e+"'"+h+"'"+g})}function c(a,b,c){if(b&&"/"===b[0])return b;var e=new URL(b,a);return c?e.href:d(e.href)}function d(a){var b=new URL(document.baseURI),c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b,c):a}function e(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");return f.join("/")+b.search+b.hash}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c,d){return a=b(a,c,d,g),b(a,c,d,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c){this.receive(a,d,b,c)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d){this.cache[a]=d;for(var e,f=this.pending[a],g=0,h=f.length;h>g&&(e=f[g]);g++)this.onload(a,e,d),this.tail();this.pending[a]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){4===f.readyState&&d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b,c=d(a);try{b=btoa(c)}catch(e){b=btoa(unescape(encodeURIComponent(c))),console.warn("Script contained non-latin characters that were forced to latin. Some characters may be wrong.",a)}return"data:text/javascript;base64,"+b}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=/Trident/.test(navigator.userAgent),j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a),this.parseNext()},parseImport:function(a){if(a.import.__importParsed=!0,HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.dispatchEvent(a.__resource?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.markParsingComplete(a)},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),document.head.appendChild(a)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a)};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),document.head.appendChild(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&!a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n,a.isIE=i}(HTMLImports),function(a){function b(a){return c(a,q)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(q)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}function e(a,b){b=b||r,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===y}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===y)&&(b.removeEventListener(z,c),g(a,b))};b.addEventListener(z,c)}}function h(a,b){function c(){f==g&&a&&a()}function d(){f++,c()}var e=b.querySelectorAll("link[rel=import]"),f=0,g=e.length;if(g)for(var h,j=0;g>j&&(h=e[j]);j++)i(h)?d.call(h):(h.addEventListener("load",d),h.addEventListener("error",d));else c()}function i(a){return o?a.import&&"loading"!==a.import.readyState||a.__loaded:a.__importParsed}function j(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)k(b)&&l(b)}function k(a){return"link"===a.localName&&"import"===a.rel}function l(a){var b=a.import;b?m({target:a}):(a.addEventListener("load",m),a.addEventListener("error",m))}function m(a){a.target.__loaded=!0}var n="import"in document.createElement("link"),o=n,p=a.flags,q="import",r=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(o)var s={};else var t=(a.xhr,a.Loader),u=a.parser,s={documents:{},documentPreloadSelectors:"link[rel="+q+"]",importsPreloadSelectors:["link[rel="+q+"]"].join(","),loadNode:function(a){v.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);v.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===r?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(p.load&&console.log("loaded",a,c),c.__resource=e,b(c)){var f=this.documents[a];f||(f=d(e,a),f.__importLink=c,this.bootDocument(f),this.documents[a]=f),c.import=f}u.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),u.parseNext()},loadedAll:function(){u.parseNext()}},v=new t(s.loaded.bind(s),s.loadedAll.bind(s));var w={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",w),Object.defineProperty(r,"_currentScript",w),!document.baseURI){var x={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",x),Object.defineProperty(r,"baseURI",x)}var y=HTMLImports.isIE?"complete":"interactive",z="readystatechange";o&&new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&j(b.addedNodes)}).observe(document.head,{childList:!0}),a.hasNative=n,a.useNative=o,a.importer=s,a.whenImportsReady=e,a.IMPORT_LINK_TYPE=q,a.isImportLoaded=i,a.importLoader=v}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e=0,g=a.length;g>e&&(b=a[e]);e++)d(b)&&f.loadNode(b),b.children&&b.children.length&&c(b.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector,h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c});var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.whenImportsReady(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),b.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill;if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w
-}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document);var a=window.Platform&&Platform.endOfMicrotask?Platform.endOfMicrotask:setTimeout;a(function(){CustomElements.ready=!0,CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0})),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)})})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a){var b=document.createEvent("HTMLEvents");return b.initEvent(a,!0,!0),b}),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=a.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(window.Platform),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(window.Platform),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue())},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),c.ifOneTime&&!c.ifValue)return void this.updateIteratedValue();c.ifOneTime||c.ifValue.open(this.updateIteratedValue,this)}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b)),c.oneTime||c.value.open(this.updateIteratedValue,this),this.updateIteratedValue()},updateIteratedValue:function(){if(this.deps.hasIf){var a=this.deps.ifValue;if(this.deps.ifOneTime||(a=a.discardChanges()),!a)return void this.valueChanged()}var b=this.deps.value;this.deps.oneTime||(b=b.discardChanges()),this.deps.repeat||(b=[b]);var c=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(b);this.valueChanged(b,c)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform);
+window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.shadow&&document.querySelectorAll("script").length>1&&console.warn("platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}(),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");a.length&&Array.prototype.push.apply(this,a.slice()),hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=L(b),d=0;d<c.length;d++){var e=c[d];K(a,e,M(b,e))}return a}function e(a,b){for(var c=L(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}K(a,e,M(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){N.value=c,K(a,b,N)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=G.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return J&&l(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function n(a){return J&&l(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function o(a){return J&&l(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return P}}function q(b,c,d){for(var e=L(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){O&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),K(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===G.get(a)),G.set(a,b),H.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return G.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a instanceof I.EventTarget||a instanceof I.Event||a instanceof I.Range||a instanceof I.DOMImplementation||a instanceof I.CanvasRenderingContext2D||I.WebGLRenderingContext&&a instanceof I.WebGLRenderingContext}function x(a){return R&&a instanceof R||a instanceof T||a instanceof S||a instanceof U||a instanceof V||a instanceof Q||a instanceof W||X&&a instanceof X||Y&&a instanceof Y}function y(a){return null===a?null:(c(x(a)),a.polymerWrapper_||(a.polymerWrapper_=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.impl)}function A(a){return a&&w(a)?z(a):a}function B(a){return a&&!w(a)?y(a):a}function C(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.polymerWrapper_=b)}function D(a,b,c){Z.get=c,K(a.prototype,b,Z)}function E(a,b){D(a,b,function(){return y(this.impl[b])})}function F(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=B(this);return a[b].apply(a,arguments)}})})}var G=new WeakMap,H=new WeakMap,I=Object.create(null),J=b(),K=Object.defineProperty,L=Object.getOwnPropertyNames,M=Object.getOwnPropertyDescriptor,N={value:void 0,configurable:!0,enumerable:!1,writable:!0};L(window);var O=/Firefox/.test(navigator.userAgent),P={get:function(){},set:function(){},configurable:!0,enumerable:!0},Q=window.DOMImplementation,R=window.EventTarget,S=window.Event,T=window.Node,U=window.Window,V=window.Range,W=window.CanvasRenderingContext2D,X=window.WebGLRenderingContext,Y=window.SVGElementInstance,Z={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=G,a.defineGetter=D,a.defineWrapGetter=E,a.forwardMethodsToWrapper=F,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=H,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=C,a.unwrap=z,a.unwrapIfNeeded=A,a.wrap=y,a.wrapIfNeeded=B,a.wrappers=I}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r,o.push(this)}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof Q.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof Q.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof Q.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!S.get(a)&&(S.set(a,!0),n(P(a),P(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(T.get(b))throw new Error("InvalidStateError");T.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof Q.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof Q.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];i instanceof Q.Document&&(g=i.defaultView)}return _.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),X.set(b,ab),V.delete(b,null),T.delete(b),b.defaultPrevented
+}function o(a,b,c,d){var e=bb;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=cb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=db,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=R.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===bb)return!0;c===db&&(c=cb)}else if(c===db&&!b.bubbles)return!0;if("relatedTarget"in b){var i=O(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=P(j),m=k(b,a,l);if(m===g)return!0}else m=null;W.set(b,m)}}X.set(b,c);var n=b.type,o=!1;U.set(b,g),V.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===bb||r.capture&&c===db))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),Z.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!Y.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof eb))return P(x(eb,"Event",a,b));var c=a;return pb||"beforeunload"!==c.type?void(this.impl=c):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:O(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):P(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=O(arguments[b]);var c=O(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(nb)return new a(c,u(d));var e=O(document.createEvent(b)),f=mb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=O(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){this.impl=a}function C(a){return a instanceof Q.ShadowRoot&&(a=a.host),O(a)}function D(a,b){var c=R.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=O(a);c;c=c.parentNode)if(D(P(c),b))return!0;return!1}function F(a){K(a,rb)}function G(b,c,e,f){a.renderAllPending();var g=P(sb.call(c.impl,e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=$.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=$.get(this);d||(d=Object.create(null),$.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.unwrap,P=a.wrap,Q=a.wrappers,R=(new WeakMap,new WeakMap),S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=0,bb=1,cb=2,db=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var eb=window.Event;eb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return U.get(this)},get currentTarget(){return V.get(this)},get eventPhase(){return X.get(this)},get path(){var a=_.get(this);return a?a.slice():[]},stopPropagation:function(){Y.set(this,!0)},stopImmediatePropagation:function(){Y.set(this,!0),Z.set(this,!0)}},N(eb,t,document.createEvent("Event"));var fb=v("UIEvent",t),gb=v("CustomEvent",t),hb={get relatedTarget(){var a=W.get(this);return void 0!==a?a:P(O(this).relatedTarget)}},ib=M({initMouseEvent:w("initMouseEvent",14)},hb),jb=M({initFocusEvent:w("initFocusEvent",5)},hb),kb=v("MouseEvent",fb,ib),lb=v("FocusEvent",fb,jb),mb=Object.create(null),nb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!nb){var ob=function(a,b,c){if(c){var d=mb[c];b=M(M({},d),b)}mb[a]=b};ob("Event",{bubbles:!1,cancelable:!1}),ob("CustomEvent",{detail:null},"Event"),ob("UIEvent",{view:null,detail:0},"Event"),ob("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ob("FocusEvent",{relatedTarget:null},"UIEvent")}var pb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}}),pb&&N(pb,y);var qb=window.EventTarget,rb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;rb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=R.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,R.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=R.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=O(b),d=c.type;S.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return O(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},qb&&N(qb,B);var sb=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=gb,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=lb,a.wrappers.MouseEvent=kb,a.wrappers.UIEvent=fb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,o)}function c(a){this.impl=a}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.unwrap,k=a.wrap,l=window.TouchEvent;if(l){var m;try{m=document.createEvent("TouchEvent")}catch(n){return}var o={enumerable:!1};c.prototype={get target(){return k(this.impl.target)}};var p={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){p.get=function(){return this.impl[a]},Object.defineProperty(c.prototype,a,p)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(j(this).touches)},get targetTouches(){return e(j(this).targetTouches)},get changedTouches(){return e(j(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(l,f,m),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,g)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap,g={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);O=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;O=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return J(b[0]);for(var d=J(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(J(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=J(b),e=d.parentNode;e&&V.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=J(a),g=f.firstChild;g;)c=g.nextSibling,V.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=L(c?P.call(c,a.impl,!1):Q.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof N.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof R),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unwrap,K=a.unwrapIfNeeded,L=a.wrap,M=a.wrapIfNeeded,N=a.wrappers,O=!1,P=document.importNode,Q=window.Node.prototype.cloneNode,R=window.Node,S=window.DocumentFragment,T=(R.prototype.appendChild,R.prototype.compareDocumentPosition),U=R.prototype.insertBefore,V=R.prototype.removeChild,W=R.prototype.replaceChild,X=/Trident/.test(navigator.userAgent),Y=X?function(a,b){try{V.call(a,b)}catch(c){if(!(a instanceof S))throw c}}:function(a,b){V.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=J(c):(d=c,c=L(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),U.call(this.impl,J(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:this.impl;j?U.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=J(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Y(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Y(this.impl,f);return O||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=J(d):(e=d,d=L(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),W.call(this.impl,J(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&W.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:L(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:L(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:L(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:L(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:L(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),this.impl.textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,M(a))},compareDocumentPosition:function(a){return T.call(this.impl,K(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(R,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b){return a.matches(b)}function d(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===l}function e(){return!0}function f(a,b){return a.localName===b}function g(a,b){return a.namespaceURI===b}function h(a,b,c){return a.namespaceURI===b&&a.localName===c}function i(a,b,c,d,e){for(var f=a.firstElementChild;f;)c(f,d,e)&&(b[b.length++]=f),i(f,b,c,d,e),f=f.nextElementSibling;return b}var j=a.wrappers.HTMLCollection,k=a.wrappers.NodeList,l="http://www.w3.org/1999/xhtml",m={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return i(this,new k,c,a)}},n={getElementsByTagName:function(a){var b=new j;return"*"===a?i(this,b,e):i(this,b,d,a,a.toLowerCase())},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new j;if(""===a)a=null;else if("*"===a)return"*"===b?i(this,c,e):i(this,c,f,b);return"*"===b?i(this,c,g,a):i(this,c,h,a,b)}};a.GetElementsByInterface=n,a.SelectorsInterface=m}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){this.impl=a,this.ownerElement_=b}c.prototype={get length(){return this.impl.length},item:function(a){return this.impl.item(a)},contains:function(a){return this.impl.contains(a)},add:function(){this.impl.add.apply(this.impl,arguments),b(this.ownerElement_)},remove:function(){this.impl.remove.apply(this.impl,arguments),b(this.ownerElement_)},toggle:function(){var a=this.impl.toggle.apply(this.impl,arguments);return b(this.ownerElement_),a},toString:function(){return this.impl.toString()}},a.wrappers.DOMTokenList=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(this.impl,a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(z,b)}function d(a){return a.replace(A,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof y.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=k.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);k.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=h(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!l){var b=c(a);j.set(this,i(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unwrap,i=a.wrap,j=new WeakMap,k=new WeakMap,l=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{get content(){return l?i(this.impl.content):j.get(this)}}),l&&g(l,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;
+b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.SVGElementInstance;g&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return f(this.impl.correspondingElement)},get correspondingUseElement(){return f(this.impl.correspondingUseElement)},get parentNode(){return f(this.impl.parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return f(this.impl.firstChild)},get lastChild(){return f(this.impl.lastChild)},get previousSibling(){return f(this.impl.previousSibling)},get nextSibling(){return f(this.impl.nextSibling)}}),e(g,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;if(g){c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))},toString:function(){return this.impl.toString()}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=k(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;m.set(this,e),this.treeScope_=new d(this,g(e||a)),l.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unwrap,l=new WeakMap,m=new WeakMap,n=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return m.get(this)||null},get host(){return l.get(this)||null},invalidateShadowRenderer:function(){return l.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return n.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=G(a),g=G(c),h=e?G(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){I.set(a,[])}function f(a){var b=I.get(a);return b||I.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<M.length;a++){var b=M[a],c=b.parentRenderer;c&&c.dirty||b.render()}M=[]}function i(){y=null,h()}function j(a){var b=K.get(a);return b||(b=new n(a),K.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=J.get(a);c?c.push(b):J.set(a,[b])}function r(a){return J.get(a)}function s(a){J.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!O.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),M=[],N=new ArraySplice;N.equals=function(a,b){return G(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(G(b)),h=a||new WeakMap,i=N.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(h);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){if(this.dirty=!0,M.push(this),y)return;y=window[L](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){a.impl.polymerShadowRenderer_=this}};var O=/^[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}{var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap;window.Selection}b.prototype={get anchorNode(){return f(this.impl.anchorNode)},get focusNode(){return f(this.impl.focusNode)},addRange:function(a){this.impl.addRange(d(a))},collapse:function(a,b){this.impl.collapse(e(a),b)},containsNode:function(a,b){return this.impl.containsNode(e(a),b)},extend:function(a,b){this.impl.extend(e(a),b)},getRangeAt:function(a){return f(this.impl.getRangeAt(a))},removeRange:function(a){this.impl.removeRange(d(a))},selectAllChildren:function(a){this.impl.selectAllChildren(e(a))},toString:function(){return this.impl.toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return A(c.apply(this.impl,arguments))}}function d(a,b){D.call(b.impl,z(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return A(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.unwrap,A=a.wrap,B=a.wrapEventTargetMethods,C=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var D=document.adoptNode,E=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,this.impl)},getSelection:function(){return x(),new m(E.call(z(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var F=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void(this.impl=a):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){A(this)instanceof d||y(this),b.apply(A(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);F.call(z(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=C.get(this);return a?a:(a=new g(z(this).implementation),C.set(this,a),a)},get defaultView(){return A(z(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),B([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(m.call(h(this)))},get document(){return j(h(this).document)}}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.Platform),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=g.sheet.cssRules,b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertCombinators(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertCombinators:function(a){for(var b=0;b<combinatorsRe.length;b++)a=a.replace(combinatorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){}},this),c},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*'([^']*)'[^}]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),combinatorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):C.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:f.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}}),Platform.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";
+continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}},a.URL=i}}(window),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}}),a.mixin=b}(window.Platform),function(a){"use strict";function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),function(a){a.templateContent=a.templateContent||function(a){return a.content}}(window.Platform),function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(a,b,d,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=c(b,h,d),e+"'"+h+"'"+g})}function c(a,b,c){if(b&&"/"===b[0])return b;var e=new URL(b,a);return c?e.href:d(e.href)}function d(a){var b=new URL(document.baseURI),c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b,c):a}function e(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");return f.join("/")+b.search+b.hash}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c,d){return a=b(a,c,d,g),b(a,c,d,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,!1,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style","url"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;var f=this.pending[a];e&&e!==a&&(this.cache[e]=d,f=f.concat(this.pending[e]));for(var g,h=0,i=f.length;i>h&&(g=f[h]);h++)this.onload(e||a,g,d),this.tail();this.pending[a]=null,e&&e!==a&&(this.pending[e]=null)},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:c;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b,c=d(a);try{b=btoa(c)}catch(e){b=btoa(unescape(encodeURIComponent(c))),console.warn("Script contained non-latin characters that were forced to latin. Some characters may be wrong.",a)}return"data:text/javascript;base64,"+b}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=/Trident/.test(navigator.userAgent),j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import.__importParsed=!0,this.markParsingComplete(a),a.dispatchEvent(a.__resource?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),document.head.appendChild(a)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),document.head.appendChild(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&!a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n,a.isIE=i}(HTMLImports),function(a){function b(a){return c(a,q)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(q)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}function e(a,b){b=b||r,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===y}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===y)&&(b.removeEventListener(z,c),g(a,b))};b.addEventListener(z,c)}}function h(a,b){function c(){f==g&&a&&a()}function d(){f++,c()}var e=b.querySelectorAll("link[rel=import]"),f=0,g=e.length;if(g)for(var h,j=0;g>j&&(h=e[j]);j++)i(h)?d.call(h):(h.addEventListener("load",d),h.addEventListener("error",d));else c()}function i(a){return o?a.import&&"loading"!==a.import.readyState||a.__loaded:a.__importParsed}function j(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)k(b)&&l(b)}function k(a){return"link"===a.localName&&"import"===a.rel}function l(a){var b=a.import;b?m({target:a}):(a.addEventListener("load",m),a.addEventListener("error",m))}function m(a){a.target.__loaded=!0}var n="import"in document.createElement("link"),o=n,p=a.flags,q="import",r=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(o)var s={};else var t=(a.xhr,a.Loader),u=a.parser,s={documents:{},documentPreloadSelectors:"link[rel="+q+"]",importsPreloadSelectors:["link[rel="+q+"]"].join(","),loadNode:function(a){v.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);v.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===r?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(p.load&&console.log("loaded",a,c),c.__resource=e,b(c)){var f=this.documents[a];f||(f=d(e,a),f.__importLink=c,this.bootDocument(f),this.documents[a]=f),c.import=f}u.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),u.parseNext()},loadedAll:function(){u.parseNext()}},v=new t(s.loaded.bind(s),s.loadedAll.bind(s));var w={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",w),Object.defineProperty(r,"_currentScript",w),!document.baseURI){var x={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",x),Object.defineProperty(r,"baseURI",x)}var y=HTMLImports.isIE?"complete":"interactive",z="readystatechange";o&&new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&j(b.addedNodes)}).observe(document.head,{childList:!0}),a.hasNative=n,a.useNative=o,a.importer=s,a.whenImportsReady=e,a.IMPORT_LINK_TYPE=q,a.isImportLoaded=i,a.importLoader=v}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c});var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.whenImportsReady(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),b.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor
+}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document);var a=window.Platform&&Platform.endOfMicrotask?Platform.endOfMicrotask:setTimeout;a(function(){CustomElements.ready=!0,CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0})),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)})})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a){var b=document.createEvent("HTMLEvents");return b.initEvent(a,!0,!0),b}),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=a.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(window.Platform),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(window.Platform),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue())},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),c.ifOneTime&&!c.ifValue)return void this.updateIteratedValue();c.ifOneTime||c.ifValue.open(this.updateIteratedValue,this)}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b)),c.oneTime||c.value.open(this.updateIteratedValue,this),this.updateIteratedValue()},updateIteratedValue:function(){if(this.deps.hasIf){var a=this.deps.ifValue;if(this.deps.ifOneTime||(a=a.discardChanges()),!a)return void this.valueChanged()}var b=this.deps.value;this.deps.oneTime||(b=b.discardChanges()),this.deps.repeat||(b=[b]);var c=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(b);this.valueChanged(b,c)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform);
 //# sourceMappingURL=platform.js.map
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.js.map b/pkg/web_components/lib/platform.js.map
index de4213d..e0e09db 100644
--- a/pkg/web_components/lib/platform.js.map
+++ b/pkg/web_components/lib/platform.js.map
@@ -1 +1 @@
-{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","build/if-poly.js","../ShadowDOM/src/wrappers.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/TouchEvent.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","src/url.js","../MutationObservers/MutationObserver.js","../HTMLImports/src/scope.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/loader.js","src/styleloader.js","../NodeBind/src/NodeBind.js","../TemplateBinding/src/TemplateBinding.js","src/patches-mdv.js"],"names":[],"mappings":";;;;;;;;;;;AASA,OAAA,SAAA,OAAA,aAEA,OAAA,SAAA,OAAA,aAEA,SAAA,GAEA,GAAA,GAAA,EAAA,SAEA,UAAA,OAAA,MAAA,GAAA,MAAA,KAAA,QAAA,SAAA,GACA,EAAA,EAAA,MAAA,KACA,EAAA,KAAA,EAAA,EAAA,IAAA,EAAA,KAAA,IAEA,IAAA,GAAA,SAAA,eACA,SAAA,cAAA,6BACA,IAAA,EAEA,IAAA,GAAA,GADA,EAAA,EAAA,WACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,QAAA,EAAA,OACA,EAAA,EAAA,MAAA,EAAA,QAAA,EAIA,GAAA,KACA,EAAA,IAAA,MAAA,KAAA,QAAA,SAAA,GACA,OAAA,SAAA,IAAA,IAMA,EAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAEA,EAAA,OADA,WAAA,EAAA,QACA,EAEA,EAAA,SAAA,YAAA,UAAA,iBAGA,EAAA,QAAA,SAAA,iBAAA,UAAA,OAAA,GACA,QAAA,KAAA,mIAMA,EAAA,WACA,OAAA,eAAA,OAAA,iBAAA,UACA,OAAA,eAAA,MAAA,SAAA,EAAA,UAGA,EAAA,UACA,OAAA,YAAA,OAAA,cAAA,UACA,OAAA,YAAA,MAAA,QAAA,EAAA,SAIA,EAAA,MAAA,GACA,UC5DA,mBAAA,WACA,WACA,GAAA,GAAA,OAAA,eACA,EAAA,KAAA,MAAA,IAEA,EAAA,WACA,KAAA,KAAA,QAAA,IAAA,KAAA,WAAA,IAAA,KAAA,MAGA,GAAA,WACA,IAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,KAAA,KACA,IAAA,EAAA,KAAA,EACA,EAAA,GAAA,EAEA,EAAA,EAAA,KAAA,MAAA,OAAA,EAAA,GAAA,UAAA,KAEA,IAAA,SAAA,GACA,GAAA,EACA,QAAA,EAAA,EAAA,KAAA,QAAA,EAAA,KAAA,EACA,EAAA,GAAA,QAEA,SAAA,SAAA,GACA,KAAA,IAAA,EAAA,UAIA,OAAA,QAAA,KCnBA,SAAA,QACA,YAGA,SAAA,uBAQA,QAAA,GAAA,GACA,EAAA,EARA,GAAA,kBAAA,QAAA,SACA,kBAAA,OAAA,QACA,OAAA,CAGA,IAAA,MAMA,KACA,IAUA,OATA,QAAA,QAAA,EAAA,GACA,MAAA,QAAA,EAAA,GACA,EAAA,GAAA,EACA,EAAA,GAAA,QACA,GAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,OAAA,EAEA,OAAA,qBAAA,GACA,IAAA,EAAA,QACA,EAEA,OAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,GAGA,OAAA,UAAA,EAAA,GACA,MAAA,UAAA,EAAA,IAEA,GAKA,QAAA,cAGA,GAAA,mBAAA,SAAA,OAAA,KAAA,OAAA,IAAA,QACA,OAAA,CAGA,KACA,GAAA,GAAA,GAAA,UAAA,GAAA,eACA,OAAA,KACA,MAAA,GACA,OAAA,GAMA,QAAA,SAAA,GACA,OAAA,IAAA,IAAA,EAGA,QAAA,UAAA,GACA,OAAA,EAGA,QAAA,UAAA,GACA,MAAA,KAAA,OAAA,GAOA,QAAA,cAAA,EAAA,GACA,MAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EAAA,EACA,YAAA,IAAA,YAAA,IACA,EAEA,IAAA,GAAA,IAAA,EAyBA,QAAA,aAAA,GACA,MAAA,gBAAA,IACA,GACA,EAAA,EAAA,OAEA,IAAA,GACA,EAEA,KAAA,EAAA,IACA,EAEA,WAAA,KAAA,IAKA,QAAA,MAAA,EAAA,GACA,GAAA,IAAA,qBACA,KAAA,OAAA,wCAEA,OAAA,IAAA,EAAA,OACA,KAEA,QAAA,IACA,KAAA,KAAA,GACA,OAGA,EAAA,MAAA,YAAA,OAAA,SAAA,GACA,MAAA,KACA,QAAA,SAAA,GACA,KAAA,KAAA,IACA,WAEA,SAAA,KAAA,SACA,KAAA,aAAA,KAAA,4BAOA,QAAA,SAAA,GACA,GAAA,YAAA,MACA,MAAA,EAEA,OAAA,IACA,EAAA,IAEA,gBAAA,KACA,EAAA,OAAA,GAEA,IAAA,GAAA,UAAA,EACA,IAAA,EACA,MAAA,EACA,KAAA,YAAA,GACA,MAAA,YACA,IAAA,GAAA,GAAA,MAAA,EAAA,qBAEA,OADA,WAAA,GAAA,EACA,EA8EA,QAAA,YAAA,GAEA,IADA,GAAA,GAAA,EACA,uBAAA,GAAA,EAAA,UACA,GAKA,OAHA,QAAA,0BACA,OAAA,qBAAA,GAEA,EAAA,EAGA,QAAA,eAAA,GACA,IAAA,GAAA,KAAA,GACA,OAAA,CACA,QAAA,EAGA,QAAA,aAAA,GACA,MAAA,eAAA,EAAA,QACA,cAAA,EAAA,UACA,cAAA,EAAA,SAGA,QAAA,yBAAA,EAAA,GACA,GAAA,MACA,KACA,IAEA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,IAEA,SAAA,GAAA,IAAA,EAAA,MAGA,IAAA,GAKA,IAAA,EAAA,KACA,EAAA,GAAA,GALA,EAAA,GAAA,QAQA,IAAA,GAAA,KAAA,GACA,IAAA,KAGA,EAAA,GAAA,EAAA,GAMA,OAHA,OAAA,QAAA,IAAA,EAAA,SAAA,EAAA,SACA,EAAA,OAAA,EAAA,SAGA,MAAA,EACA,QAAA,EACA,QAAA,GAKA,QAAA,eACA,IAAA,SAAA,OACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,SAAA,OAAA,IACA,SAAA,IAGA,OADA,UAAA,OAAA,GACA,EA4BA,QAAA,qBAMA,QAAA,GAAA,GACA,GAAA,EAAA,SAAA,SAAA,GACA,EAAA,OAAA,GAPA,GAAA,GACA,EACA,GAAA,EACA,GAAA,CAOA,QACA,KAAA,SAAA,GACA,GAAA,EACA,KAAA,OAAA,wBAEA,IACA,OAAA,qBAAA,GAEA,EAAA,EACA,GAAA,GAEA,QAAA,SAAA,EAAA,GACA,EAAA,EACA,EACA,MAAA,QAAA,EAAA,GAEA,OAAA,QAAA,EAAA,IAEA,QAAA,SAAA,GACA,EAAA,EACA,OAAA,qBAAA,GACA,GAAA,GAEA,MAAA,WACA,EAAA,OACA,OAAA,UAAA,EAAA,GACA,oBAAA,KAAA,QA2BA,QAAA,mBAAA,EAAA,EAAA,GACA,GAAA,GAAA,oBAAA,OAAA,mBAGA,OAFA,GAAA,KAAA,GACA,EAAA,QAAA,EAAA,GACA,EAKA,QAAA,kBAOA,QAAA,GAAA,EAAA,GACA,IAGA,IAAA,IACA,EAAA,IAAA,GAEA,EAAA,QAAA,GAAA,IACA,EAAA,KAAA,GACA,OAAA,QAAA,EAAA,IAGA,EAAA,OAAA,eAAA,GAAA,IAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,SAAA,GACA,EAAA,EAAA,OACA,iBAAA,EAAA,KACA,OAAA,EAGA,OAAA,EAGA,QAAA,GAAA,GACA,IAAA,EAAA,GAAA,CAIA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,QAAA,QACA,EAAA,gBAAA,EAIA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,QAAA,QACA,EAAA,UAhDA,GAGA,GACA,EAJA,EAAA,EACA,KACA,KAmDA,GACA,OAAA,OACA,QAAA,EACA,KAAA,SAAA,EAAA,GACA,IACA,EAAA,EACA,MAGA,EAAA,KAAA,GACA,IACA,EAAA,gBAAA,IAEA,MAAA,WAEA,GADA,MACA,EAAA,GAAA,CAIA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,OAAA,UAAA,EAAA,GAAA,GACA,SAAA,iBAGA,GAAA,OAAA,EACA,EAAA,OAAA,EACA,EAAA,OACA,EAAA,OACA,iBAAA,KAAA,QAIA,OAAA,GAKA,QAAA,gBAAA,EAAA,GAMA,MALA,kBAAA,gBAAA,SAAA,IACA,gBAAA,iBAAA,OAAA,iBACA,gBAAA,OAAA,GAEA,gBAAA,KAAA,EAAA,GACA,gBAUA,QAAA,YACA,KAAA,OAAA,SACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,gBAAA,OACA,KAAA,OAAA,OACA,KAAA,IAAA,iBA2DA,QAAA,UAAA,GACA,SAAA,qBACA,kBAGA,aAAA,KAAA,GAGA,QAAA,iBACA,SAAA,qBAiEA,QAAA,gBAAA,GACA,SAAA,KAAA,MACA,KAAA,OAAA,EACA,KAAA,WAAA,OA0FA,QAAA,eAAA,GACA,IAAA,MAAA,QAAA,GACA,KAAA,OAAA,kCACA,gBAAA,KAAA,KAAA,GAgDA,QAAA,cAAA,EAAA,GACA,SAAA,KAAA,MAEA,KAAA,QAAA,EACA,KAAA,MAAA,QAAA,GACA,KAAA,gBAAA,OA0CA,QAAA,kBAAA,GACA,SAAA,KAAA,MAEA,KAAA,qBAAA,EACA,KAAA,UACA,KAAA,gBAAA,OACA,KAAA,aAgIA,QAAA,SAAA,GAAA,MAAA,GAEA,QAAA,mBAAA,EAAA,EAAA,EACA,GACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,EACA,KAAA,YAAA,GAAA,QACA,KAAA,YAAA,GAAA,QAGA,KAAA,oBAAA,EA6DA,QAAA,QAAA,EAAA,EAAA,EAAA,GACA,IAAA,aAAA,EAAA,KAKA,kBAAA,GAAA,kBACA,EAAA,iBAAA,EAAA,EAAA,GAEA,YAAA,CAGA,GAAA,GAAA,EAAA,SACA,KACA,EAAA,EAAA,UAAA,OAAA,YAAA,IAEA,aAAA,OAAA,EACA,aAAA,KAAA,EACA,aAAA,SAAA,EAEA,EAAA,OAAA,eAiEA,QAAA,6BAAA,EAAA,EAAA,GAIA,IAAA,GAHA,MACA,KAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,qBAAA,EAAA,OAMA,EAAA,OAAA,KACA,EAAA,EAAA,MAAA,EAAA,UAEA,UAAA,EAAA,OAGA,OAAA,EAAA,KAUA,EAAA,OAAA,UACA,GAAA,EAAA,YACA,GAAA,EAAA,OAEA,EAAA,EAAA,OAAA,EAbA,EAAA,OAAA,SACA,GAAA,EAAA,MAEA,EAAA,EAAA,OAAA,KAfA,QAAA,MAAA,8BAAA,EAAA,MACA,QAAA,MAAA,IA4BA,IAAA,GAAA,KAAA,GACA,EAAA,GAAA,EAAA,EAEA,KAAA,GAAA,KAAA,GACA,EAAA,GAAA,MAEA,IAAA,KACA,KAAA,GAAA,KAAA,GACA,KAAA,IAAA,IAAA,IAAA,IAAA,CAGA,GAAA,GAAA,EAAA,EACA,GAAA,KAAA,IACA,EAAA,GAAA,GAGA,OACA,MAAA,EACA,QAAA,EACA,QAAA,GAIA,QAAA,WAAA,EAAA,EAAA,GACA,OACA,MAAA,EACA,QAAA,EACA,WAAA,GASA,QAAA,gBA0OA,QAAA,aAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,MAAA,aAAA,YAAA,EAAA,EAAA,EACA,EAAA,EAAA,GAGA,QAAA,WAAA,EAAA,EAAA,EAAA,GAEA,MAAA,GAAA,GAAA,EAAA,EACA,GAGA,GAAA,GAAA,GAAA,EACA,EAGA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,EAAA,EAGA,EAAA,EACA,EAAA,EAEA,EAAA,EAIA,QAAA,aAAA,EAAA,EAAA,EAAA,GAOA,IAAA,GALA,GAAA,UAAA,EAAA,EAAA,GAEA,GAAA,EACA,EAAA,EAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAGA,IAFA,EAAA,OAAA,GAEA,EAAA,CAGA,GAAA,GAAA,UAAA,EAAA,MACA,EAAA,MAAA,EAAA,QAAA,OACA,EAAA,MACA,EAAA,MAAA,EAAA,WAEA,IAAA,GAAA,EAAA,CAGA,EAAA,OAAA,EAAA,GACA,IAEA,GAAA,EAAA,WAAA,EAAA,QAAA,OAEA,EAAA,YAAA,EAAA,WAAA,CACA,IAAA,GAAA,EAAA,QAAA,OACA,EAAA,QAAA,OAAA,CAEA,IAAA,EAAA,YAAA,EAGA,CACA,GAAA,GAAA,EAAA,OAEA,IAAA,EAAA,MAAA,EAAA,MAAA,CAEA,GAAA,GAAA,EAAA,QAAA,MAAA,EAAA,EAAA,MAAA,EAAA,MACA,OAAA,UAAA,KAAA,MAAA,EAAA,GACA,EAAA,EAGA,GAAA,EAAA,MAAA,EAAA,QAAA,OAAA,EAAA,MAAA,EAAA,WAAA,CAEA,GAAA,GAAA,EAAA,QAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MACA,OAAA,UAAA,KAAA,MAAA,EAAA,GAGA,EAAA,QAAA,EACA,EAAA,MAAA,EAAA,QACA,EAAA,MAAA,EAAA,WAnBA,IAAA,MAsBA,IAAA,EAAA,MAAA,EAAA,MAAA,CAGA,GAAA,EAEA,EAAA,OAAA,EAAA,EAAA,GACA,GAEA,IAAA,GAAA,EAAA,WAAA,EAAA,QAAA,MACA,GAAA,OAAA,EACA,GAAA,IAIA,GACA,EAAA,KAAA,GAGA,QAAA,sBAAA,EAAA,GAGA,IAAA,GAFA,MAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,EAAA,MACA,IAAA,SACA,YAAA,EAAA,EAAA,MAAA,EAAA,QAAA,QAAA,EAAA,WACA,MACA,KAAA,MACA,IAAA,SACA,IAAA,SACA,IAAA,QAAA,EAAA,MACA,QACA,IAAA,GAAA,SAAA,EAAA,KACA,IAAA,EAAA,EACA,QACA,aAAA,EAAA,GAAA,EAAA,UAAA,EACA,MACA,SACA,QAAA,MAAA,2BAAA,KAAA,UAAA,KAKA,MAAA,GAGA,QAAA,qBAAA,EAAA,GACA,GAAA,KAcA,OAZA,sBAAA,EAAA,GAAA,QAAA,SAAA,GACA,MAAA,IAAA,EAAA,YAAA,GAAA,EAAA,QAAA,YACA,EAAA,QAAA,KAAA,EAAA,EAAA,QACA,EAAA,KAAA,SAKA,EAAA,EAAA,OAAA,YAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,WACA,EAAA,QAAA,EAAA,EAAA,QAAA,YAGA,EAlhDA,GAAA,YAAA,sBAiBA,QAAA,aAcA,YAAA,OAAA,OAAA,OAAA,SAAA,GACA,MAAA,gBAAA,IAAA,OAAA,MAAA,IAYA,aAAA,gBACA,SAAA,GAAA,MAAA,IACA,SAAA,GACA,GAAA,GAAA,EAAA,SACA,KAAA,EACA,MAAA,EACA,IAAA,GAAA,OAAA,OAAA,EAKA,OAJA,QAAA,oBAAA,GAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EACA,OAAA,yBAAA,EAAA,MAEA,GAGA,WAAA,aACA,UAAA,gBACA,MAAA,WAAA,IAAA,UAAA,IACA,aAAA,yBACA,oBAAA,MAAA,MAAA,IAAA,aAAA,IACA,KAAA,MAAA,oBAAA,kBAAA,oBAAA,KACA,WAAA,GAAA,QAAA,IAAA,KAAA,KAgBA,wBA0BA,YAsBA,MAAA,IAAA,QAEA,KAAA,UAAA,cACA,aACA,OAAA,EAEA,SAAA,WACA,MAAA,MAAA,KAAA,MAGA,aAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CACA,GAAA,MAAA,EACA,MACA,GAAA,EAAA,KAAA,IAEA,MAAA,IAGA,eAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CAGA,GAFA,IACA,EAAA,EAAA,KAAA,EAAA,MACA,SAAA,GACA,MACA,GAAA,EAAA,KAAA,MAIA,uBAAA,WACA,GAAA,GAAA,KAAA,IAAA,SAAA,GACA,MAAA,SAAA,GAAA,KAAA,EAAA,KAAA,IAAA,IAGA,EAAA,GACA,EAAA,KACA,IAAA,iBAEA,KADA,GAAA,GAAA,EACA,EAAA,KAAA,OAAA,EAAA,IAAA,CACA,CAAA,KAAA,GACA,GAAA,EAAA,GACA,GAAA,aAAA,EAAA,WAOA,MALA,IAAA,MAEA,GAAA,EAAA,GAEA,GAAA,YAAA,EAAA,+BACA,GAAA,UAAA,MAAA,IAGA,aAAA,SAAA,EAAA,GACA,IAAA,KAAA,OACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,EAAA,IAAA,CACA,IAAA,SAAA,GACA,OAAA,CACA,GAAA,EAAA,KAAA,IAGA,MAAA,UAAA,IAGA,EAAA,KAAA,IAAA,GACA,IAHA,IAOA,IAAA,aAAA,GAAA,MAAA,GAAA,qBACA,aAAA,OAAA,EACA,YAAA,aAAA,YAAA,aAAA,YAEA,IAAA,wBAAA,IA8DA,YAYA,OAAA,WAAA,WACA,GAAA,IAAA,UAAA,GACA,GAAA,CAOA,OALA,QAAA,QAAA,EAAA,WACA,cACA,GAAA,IAGA,SAAA,GACA,SAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,UAAA,EAAA,cAIA,WACA,MAAA,UAAA,GACA,SAAA,KAAA,OAIA,uBAyEA,oBA2FA,gBAWA,SAAA,EACA,OAAA,EACA,OAAA,EACA,UAAA,EAEA,eAAA,CAWA,UAAA,WACA,KAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,SACA,KAAA,OAAA,oCAOA,OALA,UAAA,MACA,KAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,WACA,KAAA,OAAA,OACA,KAAA,QAGA,MAAA,WACA,KAAA,QAAA,SAGA,cAAA,MACA,KAAA,cACA,KAAA,OAAA,OACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,OAAA,SAGA,QAAA,WACA,KAAA,QAAA,QAGA,WAAA,OAGA,QAAA,SAAA,GACA,IACA,KAAA,UAAA,MAAA,KAAA,QAAA,GACA,MAAA,GACA,SAAA,4BAAA,EACA,QAAA,MAAA,+CACA,EAAA,OAAA,MAIA,eAAA,WAEA,MADA,MAAA,OAAA,QAAA,GACA,KAAA,QAIA,IAAA,mBAAA,WACA,YACA,UAAA,mBAAA,EAEA,mBACA,gBAeA,IAAA,6BAAA,EAEA,0BAAA,YAAA,WACA,IAEA,MADA,MAAA,qBACA,EACA,MAAA,IACA,OAAA,KAIA,QAAA,SAAA,OAAA,aAEA,OAAA,SAAA,2BAAA,WACA,IAAA,2BAAA,CAGA,GAAA,0BAEA,WADA,MAAA,mBAIA,IAAA,iBAAA,CAGA,4BAAA,CAEA,IAAA,QAAA,EACA,WAAA,OAEA,GAAA,CACA,SACA,QAAA,aACA,gBACA,YAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,QAAA,OAAA,IAAA,CACA,GAAA,UAAA,QAAA,EACA,UAAA,QAAA,SAGA,SAAA,WACA,YAAA,GAEA,aAAA,KAAA,WAEA,gBACA,YAAA,SACA,uBAAA,QAAA,WAEA,QAAA,0BACA,OAAA,qBAAA,QAEA,4BAAA,KAGA,mBACA,OAAA,SAAA,eAAA,WACA,kBAUA,eAAA,UAAA,cACA,UAAA,SAAA,UAEA,cAAA,EAEA,SAAA,WACA,WACA,KAAA,gBAAA,kBAAA,KAAA,KAAA,OACA,KAAA,cAEA,KAAA,WAAA,KAAA,WAAA,KAAA,SAKA,WAAA,SAAA,GACA,GAAA,GAAA,MAAA,QAAA,QACA,KAAA,GAAA,KAAA,GACA,EAAA,GAAA,EAAA,EAIA,OAFA,OAAA,QAAA,KACA,EAAA,OAAA,EAAA,QACA,GAGA,OAAA,SAAA,GACA,GAAA,GACA,CACA,IAAA,WAAA,CACA,IAAA,EACA,OAAA,CAEA,MACA,EAAA,4BAAA,KAAA,OAAA,EACA,OAEA,GAAA,KAAA,WACA,EAAA,wBAAA,KAAA,OAAA,KAAA,WAGA,OAAA,aAAA,IACA,GAEA,aACA,KAAA,WAAA,KAAA,WAAA,KAAA,SAEA,KAAA,SACA,EAAA,UACA,EAAA,YACA,EAAA,YACA,SAAA,GACA,MAAA,GAAA,OAIA,IAGA,YAAA,WACA,YACA,KAAA,gBAAA,QACA,KAAA,gBAAA,QAEA,KAAA,WAAA,QAIA,QAAA,WACA,KAAA,QAAA,SAGA,WACA,KAAA,gBAAA,SAAA,GAEA,WAAA,QAGA,eAAA,WAMA,MALA,MAAA,gBACA,KAAA,gBAAA,SAAA,GAEA,KAAA,WAAA,KAAA,WAAA,KAAA,QAEA,KAAA,UAUA,cAAA,UAAA,cAEA,UAAA,eAAA,UAEA,cAAA,EAEA,WAAA,SAAA,GACA,MAAA,GAAA,SAGA,OAAA,SAAA,GACA,GAAA,EACA,IAAA,WAAA,CACA,IAAA,EACA,OAAA,CACA,GAAA,oBAAA,KAAA,OAAA,OAEA,GAAA,YAAA,KAAA,OAAA,EAAA,KAAA,OAAA,OACA,KAAA,WAAA,EAAA,KAAA,WAAA,OAGA,OAAA,IAAA,EAAA,QAGA,aACA,KAAA,WAAA,KAAA,WAAA,KAAA,SAEA,KAAA,SAAA,KACA,IANA,KAUA,cAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,QAAA,SAAA,GAGA,IAFA,GAAA,IAAA,EAAA,MAAA,EAAA,QAAA,QACA,EAAA,EAAA,MACA,EAAA,EAAA,MAAA,EAAA,YACA,EAAA,KAAA,EAAA,IACA,GAGA,OAAA,UAAA,OAAA,MAAA,EAAA,MAYA,aAAA,UAAA,cACA,UAAA,SAAA,UAEA,SAAA,WACA,aACA,KAAA,gBAAA,eAAA,KAAA,KAAA,UAEA,KAAA,OAAA,QAAA,IAGA,YAAA,WACA,KAAA,OAAA,OAEA,KAAA,kBACA,KAAA,gBAAA,MAAA,MACA,KAAA,gBAAA,SAIA,gBAAA,SAAA,GACA,KAAA,MAAA,eAAA,KAAA,QAAA,IAGA,OAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,MAEA,OADA,MAAA,OAAA,KAAA,MAAA,aAAA,KAAA,SACA,GAAA,aAAA,KAAA,OAAA,IACA,GAEA,KAAA,SAAA,KAAA,OAAA,KACA,IAGA,SAAA,SAAA,GACA,KAAA,OACA,KAAA,MAAA,aAAA,KAAA,QAAA,KAaA,IAAA,oBAEA,kBAAA,UAAA,cACA,UAAA,SAAA,UAEA,SAAA,WACA,GAAA,WAAA,CAGA,IAAA,GAFA,GACA,GAAA,EACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EAEA,GADA,EAAA,KAAA,UAAA,GACA,IAAA,iBAAA,CACA,GAAA,CACA,OAIA,IACA,KAAA,gBAAA,eAAA,KAAA,IAGA,KAAA,OAAA,QAAA,KAAA,uBAGA,YAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EACA,KAAA,UAAA,KAAA,kBACA,KAAA,UAAA,EAAA,GAAA,OAEA,MAAA,UAAA,OAAA,EACA,KAAA,OAAA,OAAA,EAEA,KAAA,kBACA,KAAA,gBAAA,MAAA,MACA,KAAA,gBAAA,SAIA,QAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UACA,KAAA,OAAA,iCAEA,IAAA,GAAA,QAAA,EAEA,IADA,KAAA,UAAA,KAAA,EAAA,GACA,KAAA,qBAAA,CAEA,GAAA,GAAA,KAAA,UAAA,OAAA,EAAA,CACA,MAAA,OAAA,GAAA,EAAA,aAAA,KAGA,YAAA,SAAA,GACA,GAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UACA,KAAA,OAAA,qCAGA,IADA,KAAA,UAAA,KAAA,iBAAA,GACA,KAAA,qBAAA,CAEA,GAAA,GAAA,KAAA,UAAA,OAAA,EAAA,CACA,MAAA,OAAA,GAAA,EAAA,KAAA,KAAA,QAAA,QAGA,WAAA,WACA,GAAA,KAAA,QAAA,OACA,KAAA,OAAA,4BAEA,MAAA,OAAA,UACA,KAAA,eAGA,YAAA,WACA,GAAA,KAAA,QAAA,UACA,KAAA,OAAA,wCAIA,OAHA,MAAA,OAAA,OACA,KAAA,WAEA,KAAA,QAGA,gBAAA,SAAA,GAEA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EACA,EAAA,KAAA,UAAA,GACA,IAAA,kBACA,KAAA,UAAA,EAAA,GAAA,eAAA,EAAA,IAIA,OAAA,SAAA,EAAA,GAEA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EAAA,CACA,GAEA,GAFA,EAAA,KAAA,UAAA,GACA,EAAA,KAAA,UAAA,EAAA,EAEA,IAAA,IAAA,iBAAA,CACA,GAAA,GAAA,CACA,GAAA,KAAA,SAAA,SACA,EAAA,KAAA,KAAA,QAAA,MACA,EAAA,qBAEA,GAAA,EAAA,aAAA,EAGA,GACA,KAAA,OAAA,EAAA,GAAA,EAIA,aAAA,EAAA,KAAA,OAAA,EAAA,MAGA,EAAA,MACA,EAAA,EAAA,GAAA,KAAA,OAAA,EAAA,GACA,KAAA,OAAA,EAAA,GAAA,GAGA,MAAA,IAKA,KAAA,SAAA,KAAA,OAAA,EAAA,KAAA,aACA,IALA,KAwBA,kBAAA,WACA,KAAA,SAAA,EAAA,GAKA,MAJA,MAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,OACA,KAAA,YAAA,KAAA,YAAA,KAAA,KAAA,kBAAA,OACA,KAAA,QAGA,kBAAA,SAAA,GAEA,GADA,EAAA,KAAA,YAAA,IACA,aAAA,EAAA,KAAA,QAAA,CAEA,GAAA,GAAA,KAAA,MACA,MAAA,OAAA,EACA,KAAA,UAAA,KAAA,KAAA,QAAA,KAAA,OAAA,KAGA,eAAA,WAEA,MADA,MAAA,OAAA,KAAA,YAAA,KAAA,YAAA,kBACA,KAAA,QAGA,QAAA,WACA,MAAA,MAAA,YAAA,WAGA,SAAA,SAAA,GAEA,MADA,GAAA,KAAA,YAAA,IACA,KAAA,qBAAA,KAAA,YAAA,SACA,KAAA,YAAA,SAAA,GADA,QAIA,MAAA,WACA,KAAA,aACA,KAAA,YAAA,QACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,YAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,OACA,KAAA,YAAA,QAIA,IAAA,sBACA,KAAA,EACA,QAAA,EACA,UAAA,GAGA,cACA,OAAA,OACA,KAAA,SACA,KAAA,OACA,SAAA,OA0BA,UAAA,gCAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,IACA,EAAA,EAAA,aAEA,GAAA,GAAA,EAAA,GAEA,OAAA,eAAA,EAAA,GACA,IAAA,WACA,GAAA,GAAA,KAAA,EAIA,OAHA,IACA,EAAA,UAEA,KAAA,IAEA,IAAA,SAAA,GACA,GAAA,GAAA,KAAA,EACA,IAAA,EAEA,WADA,GAAA,SAAA,EAIA,IAAA,GAAA,KAAA,EAIA,OAHA,MAAA,GAAA,EACA,OAAA,KAAA,EAAA,EAAA,GAEA,GAEA,cAAA,KAIA,SAAA,eAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,IACA,EAAA,EAAA,aAEA,GAAA,GAAA,CACA,IAAA,GAAA,EAAA,GACA,EAAA,EAAA,KAAA,SAAA,EAAA,GACA,EAAA,GAAA,EACA,OAAA,EAAA,EAAA,EAAA,IAGA,IAAA,IAAA,aAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,EAAA,EACA,cAAA,EAAA,KACA,EAAA,EACA,EAAA,UACA,EAAA,SAAA,IAOA,MAHA,GAAA,GAAA,EACA,OAAA,EAAA,EAAA,EAAA,IAGA,MAAA,WACA,EAAA,QACA,EAAA,GAAA,SAwEA,IAAA,YAAA,EACA,YAAA,EACA,SAAA,EACA,YAAA,CAIA,aAAA,WAaA,kBAAA,SAAA,EAAA,EAAA,EACA,EAAA,EAAA,GAOA,IAAA,GALA,GAAA,EAAA,EAAA,EACA,EAAA,EAAA,EAAA,EACA,EAAA,GAAA,OAAA,GAGA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,OAAA,GACA,EAAA,GAAA,GAAA,CAIA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,GAAA,KAAA,OAAA,EAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,EAAA,EAAA,GAAA,EAAA,OACA,CACA,GAAA,GAAA,EAAA,EAAA,GAAA,GAAA,EACA,EAAA,EAAA,GAAA,EAAA,GAAA,CACA,GAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAKA,MAAA,IAMA,kCAAA,SAAA,GAKA,IAJA,GAAA,GAAA,EAAA,OAAA,EACA,EAAA,EAAA,GAAA,OAAA,EACA,EAAA,EAAA,GAAA,GACA,KACA,EAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAKA,GAAA,GAAA,EAAA,CAKA,GAIA,GAJA,EAAA,EAAA,EAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,GAAA,GACA,EAAA,EAAA,GAAA,EAAA,EAIA,GADA,EAAA,EACA,EAAA,EAAA,EAAA,EAEA,EAAA,EAAA,EAAA,EAEA,GAAA,GACA,GAAA,EACA,EAAA,KAAA,aAEA,EAAA,KAAA,aACA,EAAA,GAEA,IACA,KACA,GAAA,GACA,EAAA,KAAA,aACA,IACA,EAAA,IAEA,EAAA,KAAA,UACA,IACA,EAAA,OA9BA,GAAA,KAAA,aACA,QANA,GAAA,KAAA,UACA,GAuCA,OADA,GAAA,UACA,GA2BA,YAAA,SAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,GAAA,GAAA,EACA,EAAA,EAEA,EAAA,KAAA,IAAA,EAAA,EAAA,EAAA,EAYA,IAXA,GAAA,GAAA,GAAA,IACA,EAAA,KAAA,aAAA,EAAA,EAAA,IAEA,GAAA,EAAA,QAAA,GAAA,EAAA,SACA,EAAA,KAAA,aAAA,EAAA,EAAA,EAAA,IAEA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EAEA,EAAA,GAAA,GAAA,EAAA,GAAA,EACA,QAEA,IAAA,GAAA,EAAA,CAEA,IADA,GAAA,GAAA,UAAA,KAAA,GACA,EAAA,GACA,EAAA,QAAA,KAAA,EAAA,KAEA,QAAA,GACA,GAAA,GAAA,EACA,OAAA,UAAA,KAAA,EAAA,GAUA,KAAA,GARA,GAAA,KAAA,kCACA,KAAA,kBAAA,EAAA,EAAA,EACA,EAAA,EAAA,IAEA,EAAA,OACA,KACA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,OAAA,EAAA,IACA,IAAA,YACA,IACA,EAAA,KAAA,GACA,EAAA,QAGA,IACA,GACA,MACA,KAAA,aACA,IACA,EAAA,UAAA,KAAA,IAEA,EAAA,aACA,IAEA,EAAA,QAAA,KAAA,EAAA,IACA,GACA,MACA,KAAA,UACA,IACA,EAAA,UAAA,KAAA,IAEA,EAAA,aACA,GACA,MACA,KAAA,aACA,IACA,EAAA,UAAA,KAAA,IAEA,EAAA,QAAA,KAAA,EAAA,IACA,IAQA,MAHA,IACA,EAAA,KAAA,GAEA,GAGA,aAAA,SAAA,EAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,IAAA,KAAA,OAAA,EAAA,GAAA,EAAA,IACA,MAAA,EACA,OAAA,IAGA,aAAA,SAAA,EAAA,EAAA,GAIA,IAHA,GAAA,GAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EACA,EAAA,GAAA,KAAA,OAAA,IAAA,GAAA,IAAA,KACA,GAEA,OAAA,IAGA,iBAAA,SAAA,EAAA,GACA,MAAA,MAAA,YAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EACA,EAAA,SAGA,OAAA,SAAA,EAAA,GACA,MAAA,KAAA,GAIA,IAAA,aAAA,GAAA,YAuJA,QAAA,SAAA,SACA,OAAA,SAAA,QAAA,OACA,OAAA,SAAA,kBAAA,iBACA,OAAA,SAAA,iBAAA,WACA,OAAA,cAAA,cACA,OAAA,cAAA,iBAAA,SAAA,EAAA,GACA,MAAA,aAAA,iBAAA,EAAA,IAGA,OAAA,YAAA,YACA,OAAA,eAAA,eACA,OAAA,aAAA,aACA,OAAA,iBAAA,iBACA,OAAA,KAAA,KACA,OAAA,kBAAA,mBACA,mBAAA,SAAA,QAAA,mBAAA,SAAA,OAAA,OAAA,MAAA,QC7lDA,SAAA,MAAA,QCGA,OAAA,qBAEA,SAAA,GACA,YAMA,SAAA,KAGA,GAAA,mBAAA,SAAA,OAAA,KAAA,OAAA,IAAA,QACA,OAAA,CAGA,KACA,GAAA,GAAA,GAAA,UAAA,eACA,OAAA,KACA,MAAA,GACA,OAAA,GAMA,QAAA,GAAA,GACA,IAAA,EACA,KAAA,IAAA,OAAA,oBAOA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,EAAA,EAAA,EAAA,EAAA,IAEA,MAAA,GAGA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,GACA,IAAA,YACA,IAAA,SACA,IAAA,SACA,IAAA,OACA,IAAA,YACA,IAAA,WACA,SAEA,EAAA,EAAA,EAAA,EAAA,EAAA,IAEA,MAAA,GAGA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,IAAA,GACA,MAAA,GAAA,GAWA,QAAA,GAAA,EAAA,EAAA,GACA,EAAA,MAAA,EACA,EAAA,EAAA,EAAA,GAQA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,WAAA,OAAA,eAAA,GACA,EAAA,EAAA,IAAA,EACA,IAAA,EACA,MAAA,EAEA,IAAA,GAAA,EAAA,GAEA,EAAA,EAAA,EAGA,OAFA,GAAA,EAAA,EAAA,GAEA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAAA,GAcA,QAAA,GAAA,GACA,MAAA,aAAA,KAAA,GAGA,QAAA,GAAA,GACA,MAAA,oBAAA,KAAA,GAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,oBAAA,GACA,WAAA,MAAA,MAAA,KAAA,IAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,IAAA,aAAA,EAAA,QACA,SAAA,GAAA,KAAA,KAAA,GAAA,GAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,oBAAA,EACA,gCACA,WAAA,MAAA,MAAA,KAAA,GAAA,MAAA,KAAA,KAAA,YAGA,QAAA,GAAA,EAAA,GACA,IACA,MAAA,QAAA,yBAAA,EAAA,GACA,MAAA,GAIA,MAAA,IAIA,QAAA,GAAA,EAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,sBAAA,KAGA,IAAA,IAGA,EAAA,mBAAA,EAAA,kBAAA,IAAA,CAGA,GAEA,EAAA,iBAAA,EAEA,IACA,GAAA,EADA,EAAA,EAAA,EAAA,EAEA,IAAA,GAAA,kBAAA,GAAA,MACA,EAAA,GAAA,EAAA,OADA,CAKA,GAAA,GAAA,EAAA,EAEA,GADA,EACA,EAAA,sBAAA,GAEA,EAAA,IAEA,EAAA,UAAA,EAAA,OAEA,EADA,EACA,EAAA,sBAAA,GAEA,EAAA,IAGA,EAAA,EAAA,GACA,IAAA,EACA,IAAA,EACA,aAAA,EAAA,aACA,WAAA,EAAA,gBAWA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,SACA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,SACA,GAAA,SAAA,EAAA,IAAA,IAEA,EAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAEA,EAAA,EAAA,GACA,GACA,EAAA,EAAA,GAEA,EACA,EAAA,cAAA,GAEA,EAAA,UAAA,EAGA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,IAAA,EAAA,aACA,EASA,QAAA,GAAA,GACA,GAAA,GAAA,OAAA,eAAA,GAEA,EAAA,EAAA,GACA,EAAA,EAAA,EAGA,OAFA,GAAA,EAAA,EAAA,GAEA,EAGA,QAAA,GAAA,GACA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAEA,GAAA,GAAA,OAAA,OAAA,EAAA,UAIA,OAHA,GAAA,YAAA,EACA,EAAA,UAAA,EAEA,EAaA,QAAA,GAAA,GACA,MAAA,aAAA,GAAA,aACA,YAAA,GAAA,OACA,YAAA,GAAA,OACA,YAAA,GAAA,mBACA,YAAA,GAAA,0BACA,EAAA,uBACA,YAAA,GAAA,sBAGA,QAAA,GAAA,GACA,MAAA,IAAA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IACA,GACA,YAAA,IACA,GACA,YAAA,GASA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MAEA,EAAA,EAAA,IACA,EAAA,kBACA,EAAA,gBAAA,IAAA,EAAA,IAAA,KAQA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MACA,EAAA,EAAA,IACA,EAAA,MAQA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GAAA,EAAA,GAAA,EAQA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,GAAA,EAAA,GAAA,EASA,QAAA,GAAA,EAAA,GACA,OAAA,IAEA,EAAA,EAAA,IACA,EAAA,SAAA,GAAA,EAAA,IACA,EAAA,gBAAA,GASA,QAAA,GAAA,EAAA,EAAA,GACA,EAAA,IAAA,EACA,EAAA,EAAA,UAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,WACA,MAAA,GAAA,KAAA,KAAA,MAWA,QAAA,GAAA,EAAA,GACA,EAAA,QAAA,SAAA,GACA,EAAA,QAAA,SAAA,GACA,EAAA,UAAA,GAAA,WACA,GAAA,GAAA,EAAA,KACA,OAAA,GAAA,GAAA,MAAA,EAAA,gBA7XA,GAAA,GAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,OAAA,OAAA,MAiBA,EAAA,IAOA,EAAA,OAAA,eACA,EAAA,OAAA,oBACA,EAAA,OAAA,yBAoCA,GACA,MAAA,OACA,cAAA,EACA,YAAA,EACA,UAAA,EAWA,GAAA,OAwBA,IAAA,GAAA,UAAA,KAAA,UAAA,WAIA,GACA,IAAA,aACA,IAAA,aACA,cAAA,EACA,YAAA,GAoJA,EAAA,OAAA,kBACA,EAAA,OAAA,YACA,EAAA,OAAA,MACA,EAAA,OAAA,KACA,EAAA,OAAA,OACA,EAAA,OAAA,MACA,EAAA,OAAA,yBACA,EAAA,OAAA,sBACA,EAAA,OAAA,mBAqFA,GACA,IAAA,OACA,cAAA,EACA,YAAA,EAgCA,GAAA,OAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,EACA,EAAA,iBAAA,EACA,EAAA,wBAAA,EACA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,MAAA,EACA,EAAA,qBAAA,EACA,EAAA,MAAA,EACA,EAAA,eAAA,EACA,EAAA,gBAAA,EACA,EAAA,OAAA,EACA,EAAA,OAAA,EACA,EAAA,eAAA,EACA,EAAA,KAAA,EACA,EAAA,aAAA,EACA,EAAA,SAAA,GAEA,OAAA,mBCzZA,SAAA,GACA,YAOA,SAAA,KACA,GAAA,CACA,IAAA,GAAA,EAAA,MAAA,EACA,KACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,KAmBA,QAAA,GAAA,GACA,EAAA,KAAA,GACA,IAEA,GAAA,EACA,EAAA,EAAA,IAlCA,GAGA,GAHA,EAAA,OAAA,iBACA,KACA,GAAA,CAYA,IAAA,EAAA,CACA,GAAA,GAAA,EACA,EAAA,GAAA,GAAA,GACA,EAAA,SAAA,eAAA,EACA,GAAA,QAAA,GAAA,eAAA,IAEA,EAAA,WACA,GAAA,EAAA,GAAA,EACA,EAAA,KAAA,OAIA,GAAA,OAAA,cAAA,OAAA,UAWA,GAAA,kBAAA,GAEA,OAAA,mBC1CA,SAAA,GACA,YAUA,SAAA,KACA,IAEA,EAAA,GACA,GAAA,GAIA,QAAA,KACA,GAAA,CAEA,GAGA,KAAA,GAFA,GAAA,EAAA,QACA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,aACA,GAAA,GACA,EAAA,SACA,EAAA,UAAA,EAAA,GACA,GAAA,SAGA,GAQA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,WAAA,GAAA,GAAA,SACA,KAAA,aAAA,GAAA,GAAA,SACA,KAAA,gBAAA,KACA,KAAA,YAAA,KACA,KAAA,cAAA,KACA,KAAA,mBAAA,KACA,KAAA,SAAA,KASA,QAAA,GAAA,EAAA,GACA,KAAA,EAAA,EAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,QAAA,SACA,EAAA,qBAAA,KAKA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,OAAA,GACA,EAAA,EAAA,IAAA,EACA,KAAA,EACA,MACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,WAAA,GACA,EAAA,6BAMA,QAAA,GAAA,EAAA,EAAA,GAMA,IAAA,GAJA,GAAA,OAAA,OAAA,MACA,EAAA,OAAA,OAAA,MAGA,EAAA,EAAA,EAAA,EAAA,EAAA,WAAA,CAEA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAEA,KAAA,IAAA,GAAA,EAAA,YAIA,eAAA,IAAA,EAAA,YAMA,eAAA,GAAA,EAAA,kBACA,OAAA,EAAA,WACA,KAAA,EAAA,gBAAA,QAAA,EAAA,QAKA,kBAAA,IAAA,EAAA,eAIA,cAAA,IAAA,EAAA,WAAA,CAIA,GAAA,GAAA,EAAA,QACA,GAAA,EAAA,MAAA,GAMA,eAAA,GAAA,EAAA,mBACA,kBAAA,GAAA,EAAA,yBACA,EAAA,EAAA,MAAA,EAAA,YAKA,GAAA,IAAA,CAGA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,GAAA,GAAA,EAAA,EAGA,SAAA,IAAA,aAAA,KACA,EAAA,cAAA,EAAA,KACA,EAAA,mBAAA,EAAA,WAIA,EAAA,aACA,EAAA,WAAA,EAAA,YAGA,EAAA,eACA,EAAA,aAAA,EAAA,cAGA,EAAA,kBACA,EAAA,gBAAA,EAAA,iBAGA,EAAA,cACA,EAAA,YAAA,EAAA,aAGA,SAAA,EAAA,KACA,EAAA,SAAA,EAAA,IAGA,EAAA,SAAA,KAAA,GAEA,GAAA,EAGA,GACA,IASA,QAAA,GAAA,GAqBA,GApBA,KAAA,YAAA,EAAA,UACA,KAAA,UAAA,EAAA,QAQA,KAAA,WAJA,cAAA,MACA,qBAAA,IAAA,mBAAA,MAGA,EAAA,YAFA,EAQA,KAAA,cADA,yBAAA,MAAA,iBAAA,KACA,IAEA,EAAA,eAGA,KAAA,aACA,EAAA,mBAAA,mBAAA,MAEA,KAAA,eAAA,EAAA,sBACA,KAAA,IAAA,UAMA,IAHA,KAAA,gBAAA,EAAA,cACA,KAAA,oBAAA,EAAA,kBACA,KAAA,wBAAA,EAAA,sBACA,mBAAA,GAAA,CACA,GAAA,MAAA,EAAA,iBACA,gBAAA,GAAA,gBACA,KAAA,IAAA,UAEA,MAAA,gBAAA,EAAA,KAAA,EAAA,qBAEA,MAAA,gBAAA,KAWA,QAAA,GAAA,GACA,KAAA,UAAA,EACA,KAAA,UACA,KAAA,YACA,KAAA,OAAA,EAGA,EAAA,KAAA,MAiEA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BAzTA,GAAA,GAAA,EAAA,kBACA,EAAA,EAAA,aACA,EAAA,EAAA,SAEA,EAAA,GAAA,SACA,KACA,GAAA,EAgLA,EAAA,MAAA,UAAA,MAgDA,EAAA,CAiBA,GAAA,WAEA,QAAA,SAAA,EAAA,GACA,EAAA,EAAA,EAEA,IAGA,GAHA,EAAA,GAAA,GAAA,GAIA,EAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,KAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,WAAA,OACA,EAAA,EAAA,GAEA,EAAA,2BAEA,EAAA,QAAA,EAKA,KACA,EAAA,GAAA,GAAA,KAAA,EAAA,GACA,EAAA,KAAA,GACA,KAAA,OAAA,KAAA,KAKA,WAAA,WACA,KAAA,OAAA,QAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,WAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,UAGA,MACA,KAAA,aAGA,YAAA,WACA,GAAA,GAAA,KAAA,QAEA,OADA,MAAA,YACA,IAkBA,EAAA,WAMA,qBAAA,SAAA,GAGA,GAAA,IAAA,KAAA,OAAA,CAGA,KAAA,uBAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,MAIA,EAAA,KAAA,QAGA,yBAAA,WACA,GAAA,GAAA,KAAA,sBACA,MAAA,yBAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAGA,IAAA,GAFA,GAAA,EAAA,GACA,EAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,KAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,UAOA,EAAA,gBAAA,EACA,EAAA,2BAAA,EACA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,eAAA,GAEA,OAAA,mBC7WA,SAAA,GACA,YAgBA,SAAA,GAAA,EAAA,GAEA,KAAA,KAAA,EAGA,KAAA,OAAA,EAoBA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,aAAA,EAAA,CACA,EAAA,WAAA,CACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,gBACA,EAAA,WAAA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,EAAA,IAKA,QAAA,GAAA,GAKA,GAJA,YAAA,GAAA,SAAA,OAIA,EAAA,WACA,MAAA,GAAA,UACA,IACA,GADA,EAAA,EAAA,UAMA,OAHA,GADA,EACA,EAAA,GAEA,GAAA,GAAA,EAAA,MACA,EAAA,WAAA,EA1CA,EAAA,WACA,GAAA,YACA,MAAA,MAAA,eAAA,GAAA,SAAA,WACA,EAAA,mBAAA,KAAA,KAAA,MAEA,MAGA,SAAA,SAAA,GACA,KAAA,EAAA,EAAA,EAAA,OACA,GAAA,IAAA,KACA,OAAA,CAEA,QAAA,IAgCA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,aAAA,GAEA,OAAA,mBC5EA,SAAA,GACA,YAuBA,SAAA,GAAA,GACA,MAAA,aAAA,GAAA,WAGA,QAAA,GAAA,GACA,MAAA,GAAA,GAAA,KAIA,QAAA,GAAA,EAAA,GACA,GAAA,MACA,EAAA,CAEA,KADA,EAAA,KAAA,GACA,GAAA,CAEA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,EAAA,OAAA,EAAA,CAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAEA,IAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,EAAA,eACA,IACA,EAAA,KAAA,GAIA,EAAA,KAAA,GAIA,EAAA,EACA,EAAA,OAAA,OAIA,IAAA,EAAA,GAAA,CACA,GAAA,EAAA,EAAA,IAAA,EAAA,GAEA,KAEA,GAAA,EAAA,KACA,EAAA,KAAA,OAIA,GAAA,EAAA,WACA,GACA,EAAA,KAAA,GAKA,MAAA,GAIA,QAAA,GAAA,GACA,IAAA,EACA,OAAA,CAEA,QAAA,EAAA,MACA,IAAA,QACA,IAAA,QACA,IAAA,SACA,IAAA,SACA,IAAA,OACA,IAAA,QACA,IAAA,SACA,IAAA,SACA,IAAA,cACA,OAAA,EAEA,OAAA,EAIA,QAAA,GAAA,GACA,MAAA,aAAA,mBAKA,QAAA,GAAA,GACA,MAAA,GAAA,8BAAA,GAIA,QAAA,GAAA,EAAA,GACA,GAAA,IAAA,EAAA,OACA,MAAA,EAIA,aAAA,GAAA,SACA,EAAA,EAAA,SAQA,KAAA,GANA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,EACA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,KAAA,EACA,MAAA,GAGA,MAAA,GAAA,EAAA,OAAA,GAGA,QAAA,GAAA,GAEA,IADA,GAAA,MACA,EAAA,EAAA,EAAA,OACA,EAAA,KAAA,EAEA,OAAA,GAGA,QAAA,GAAA,EAAA,GAKA,IAJA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAEA,EAAA,KACA,EAAA,OAAA,GAAA,EAAA,OAAA,GAAA,CACA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,KACA,IAAA,IAAA,EAGA,KAFA,GAAA,EAIA,MAAA,GASA,QAAA,GAAA,EAAA,EAAA,GAGA,YAAA,GAAA,SACA,EAAA,EAAA,SAEA,IAKA,GALA,EAAA,EAAA,GACA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,GAKA,EACA,EAAA,EAAA,EAGA,KACA,EAAA,EAAA,KAGA,KAAA,GAAA,GAAA,EACA,EACA,EAAA,EAAA,OAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,KAAA,EACA,MAAA,GAIA,MAAA,MAGA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,KAAA,EAAA,GAaA,QAAA,GAAA,GAEA,IAAA,EAAA,IAAA,KAEA,EAAA,IAAA,GAAA,GACA,EAAA,EAAA,GAAA,EAAA,EAAA,SACA,GAAA,CACA,GAAA,GAAA,CAEA,MADA,GAAA,KACA,GAIA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,IAAA,GACA,KAAA,IAAA,OAAA,oBAEA,GAAA,IAAA,GAAA,GAGA,EAAA,kBACA,IAAA,GAOA,EACA,EACA,EAAA,EAAA,IAKA,IAAA,SAAA,IAAA,EAAA,QAAA,CACA,GAAA,GAAA,CACA,aAAA,GAAA,WAAA,EAAA,EAAA,eACA,EAAA,EACA,MAIA,IAAA,EACA,GAAA,YAAA,GAAA,OACA,EAAA,EACA,SAIA,IAFA,EAAA,EAAA,EAAA,GAEA,SAAA,EAAA,KAAA,CACA,GAAA,GAAA,EAAA,EAAA,OAAA,EACA,aAAA,GAAA,WACA,EAAA,EAAA,aAiBA,MAZA,GAAA,IAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,GAIA,EAAA,IAAA,EAAA,IACA,EAAA,OAAA,EAAA,MACA,EAAA,OAAA,GAEA,EAAA,iBAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAEA,IAAA,IACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,CAGA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IACA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,OAAA,CAGA,QAAA,EAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,GACA,EAAA,EAAA,IAAA,CACA,OAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GAEA,IAAA,GADA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAGA,IAAA,EAAA,OAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,GAIA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,KAAA,EACA,OAAA,CAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAEA,IAAA,IAAA,EAAA,CACA,GAAA,IAAA,GACA,OAAA,CAEA,KAAA,KACA,EAAA,QAEA,IAAA,IAAA,KAAA,EAAA,QACA,OAAA,CAGA,IAAA,iBAAA,GAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,aAMA,IAAA,EAAA,CAIA,GAAA,YAAA,SACA,EAAA,iBAAA,CACA,GAAA,GAAA,EAAA,GAEA,EACA,EAAA,EAAA,EAAA,EACA,IAAA,IAAA,EACA,OAAA,MAEA,GAAA,IAEA,GAAA,IAAA,EAAA,IAIA,EAAA,IAAA,EAAA,EACA,IAAA,GAAA,EAAA,KAEA,GAAA,CAEA,GAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,EAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,QACA,GAAA,MAIA,MAAA,EAAA,OAAA,IACA,EAAA,SAAA,IAAA,IACA,EAAA,SAAA,IAAA,IAIA,IAMA,GALA,kBAAA,GAAA,QACA,EAAA,QAAA,KAAA,EAAA,GAEA,EAAA,QAAA,YAAA,GAEA,EAAA,IAAA,GACA,OAAA;CAEA,MAAA,GACA,IACA,EAAA,IAIA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,OACA,GAAA,OAAA,CACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,SACA,EAAA,KAAA,EAAA,IAIA,OAAA,EAAA,IAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,QAAA,EACA,KAAA,QAAA,QAAA,GA6BA,QAAA,GAAA,EAAA,GACA,KAAA,YAAA,KAMA,MAAA,GAAA,EAAA,GAAA,QAAA,EAAA,GALA,IAAA,GAAA,CACA,OAAA,KAAA,iBAAA,EAAA,UAEA,KAAA,KAAA,GADA,GAAA,GAAA,GA+CA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,cAEA,OAAA,OAAA,GACA,eAAA,MAAA,EAAA,EAAA,kBAFA,EAMA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,OAAA,GACA,EAAA,SAAA,EAAA,GACA,MAAA,aAAA,QACA,KAAA,KAAA,GAEA,EAAA,EAAA,EAAA,EAAA,EAAA,IAKA,IAHA,EAAA,UAAA,OAAA,OAAA,EAAA,WACA,GACA,EAAA,EAAA,UAAA,GACA,EAMA,IACA,EAAA,EAAA,EAAA,GAAA,GAAA,SACA,MAAA,GACA,EAAA,EAAA,EACA,SAAA,YAAA,IAGA,MAAA,GAgBA,QAAA,GAAA,EAAA,GACA,MAAA,YACA,UAAA,GAAA,EAAA,UAAA,GACA,IAAA,GAAA,EAAA,KACA,GAAA,GAAA,MAAA,EAAA,YAgCA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GACA,MAAA,IAAA,GAAA,EAAA,EAAA,GAGA,IAAA,GAAA,EAAA,SAAA,YAAA,IACA,EAAA,GAAA,GACA,GAAA,EASA,OARA,QAAA,KAAA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,MAAA,GAAA,IAAA,GACA,EAAA,GAAA,EAAA,EACA,mBAAA,IACA,EAAA,EAAA,IACA,EAAA,KAAA,KAEA,EAAA,OAAA,GAAA,MAAA,EAAA,GACA,EAqCA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAeA,QAAA,GAAA,GACA,MAAA,kBAAA,IACA,EACA,GAAA,EAAA,YAGA,QAAA,GAAA,GACA,OAAA,GACA,IAAA,kBACA,IAAA,0BACA,IAAA,2BACA,IAAA,wBACA,IAAA,kBACA,IAAA,8BACA,IAAA,iBACA,IAAA,6BACA,IAAA,qBACA,OAAA,EAEA,OAAA,EAUA,QAAA,GAAA,GACA,KAAA,KAAA,EAkBA,QAAA,GAAA,GAGA,MAFA,aAAA,GAAA,aACA,EAAA,EAAA,MACA,EAAA,GAqFA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,IAAA,EAAA,GAAA,SAAA,EAAA,GAAA,OAAA,EACA,OAAA,CAGA,QAAA,EAGA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,WACA,GAAA,EAAA,EAAA,GAAA,GACA,OAAA,CAEA,QAAA,EAMA,QAAA,GAAA,GACA,EAAA,EAAA,IAKA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,kBAEA,IAAA,GAAA,EAAA,GAAA,KAAA,EAAA,KAAA,EAAA,GACA,KAAA,EACA,MAAA,KACA,IAAA,GAAA,EAAA,EAAA,KACA,OAAA,GAAA,EAAA,GAQA,QAAA,GAAA,GACA,MAAA,YACA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,IAAA,EAAA,IACA,EAAA,GAAA,OAAA,MASA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,OAAA,UAAA,GACA,GAAA,GAAA,EAAA,IAAA,KACA,KACA,EAAA,OAAA,OAAA,MACA,EAAA,IAAA,KAAA,GAGA,IAAA,GAAA,EAAA,EAIA,IAHA,GACA,KAAA,oBAAA,EAAA,EAAA,SAAA,GAEA,kBAAA,GAAA,CACA,GAAA,GAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,KAAA,EACA,MAAA,EACA,EAAA,iBACA,mBAAA,GAAA,gBAAA,KACA,EAAA,YAAA,GAKA,MAAA,iBAAA,EAAA,GAAA,GACA,EAAA,IACA,MAAA,EACA,QAAA,KAx2BA,GAuNA,GAvNA,EAAA,EAAA,wBACA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,SAGA,GADA,GAAA,SACA,GAAA,UACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SA4LA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,CAoNA,GAAA,WACA,OAAA,SAAA,GACA,MAAA,MAAA,UAAA,EAAA,SAAA,KAAA,OAAA,EAAA,MACA,KAAA,UAAA,EAAA,SAEA,GAAA,WACA,MAAA,QAAA,KAAA,SAEA,OAAA,WACA,KAAA,QAAA,MAIA,IAAA,IAAA,OAAA,KACA,IAAA,UAAA,mBACA,aAAA,EAGA,aAAA,GAmBA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,IAAA,OAEA,GAAA,iBACA,MAAA,GAAA,IAAA,OAEA,GAAA,cACA,MAAA,GAAA,IAAA,OAEA,GAAA,QACA,GAAA,GAAA,GAAA,GAAA,SACA,EAAA,EAAA,IAAA,KACA,IAAA,EAAA,CAKA,IAAA,GAJA,GAAA,EACA,EAAA,EAAA,OAAA,EACA,EAAA,EAAA,EAAA,IAAA,OAEA,EAAA,EAAA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EACA,GAAA,SAAA,KAEA,IAAA,GAAA,YAAA,GAAA,QACA,EAAA,KAAA,GAGA,EAAA,OAAA,EAEA,MAAA,IAEA,gBAAA,WACA,EAAA,IAAA,MAAA,IAEA,yBAAA,WACA,EAAA,IAAA,MAAA,GACA,EAAA,IAAA,MAAA,KAGA,EAAA,GAAA,EAAA,SAAA,YAAA,SAqCA,IAAA,IAAA,EAAA,UAAA,GACA,GAAA,EAAA,cAAA,GAEA,IACA,GAAA,iBACA,GAAA,GAAA,EAAA,IAAA,KAEA,OAAA,UAAA,EACA,EACA,EAAA,EAAA,MAAA,iBAYA,GAAA,GACA,eAAA,EAAA,iBAAA,KACA,IAEA,GAAA,GACA,eAAA,EAAA,iBAAA,IACA,IAEA,GAAA,EAAA,aAAA,GAAA,IACA,GAAA,EAAA,aAAA,GAAA,IAKA,GAAA,OAAA,OAAA,MAEA,GAAA,WACA,IACA,GAAA,QAAA,WAAA,SACA,MAAA,GACA,OAAA,EAEA,OAAA,IAyBA,KAAA,GAAA,CACA,GAAA,IAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,CACA,GAAA,GAAA,GAAA,EACA,GAAA,EAAA,KAAA,GAAA,GAGA,GAAA,GAAA,EAKA,IAAA,SAAA,SAAA,EAAA,YAAA,IACA,GAAA,eAAA,OAAA,MAAA,SACA,GAAA,WAAA,KAAA,KAAA,OAAA,GAAA,SACA,GAAA,cACA,QAAA,EACA,QAAA,EACA,QAAA,EACA,QAAA,EACA,SAAA,EACA,QAAA,EACA,UAAA,EACA,SAAA,EACA,OAAA,EACA,cAAA,MACA,WACA,GAAA,cAAA,cAAA,MAAA,WAKA,GAAA,IAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,eACA,MAAA,MAAA,KAAA,aAEA,GAAA,aAAA,GACA,KAAA,KAAA,YAAA,KAIA,IACA,EAAA,GAAA,EAwBA,IAAA,IAAA,OAAA,YAaA,IACA,mBACA,sBACA,kBAGA,KAAA,QAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,SACA,IAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EAAA,KAAA,MAAA,EAAA,SAUA,EAAA,WACA,iBAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,KAAA,EAAA,GAAA,CAGA,GAAA,GAAA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,IAAA,KACA,IAAA,GAKA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,OAAA,EAAA,IACA,WANA,MACA,EAAA,IAAA,KAAA,EASA,GAAA,KAAA,EAEA,IAAA,GAAA,EAAA,KACA,GAAA,kBAAA,EAAA,GAAA,KAEA,oBAAA,SAAA,EAAA,EAAA,GACA,EAAA,QAAA,EACA,IAAA,GAAA,EAAA,IAAA,KACA,IAAA,EAAA,CAGA,IAAA,GADA,GAAA,EAAA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,OAAA,GAAA,EAAA,GAAA,UAAA,IACA,IACA,EAAA,GAAA,UAAA,IACA,GAAA,EACA,EAAA,GAAA,UAKA,IAAA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KACA,GAAA,qBAAA,EAAA,GAAA,MAGA,cAAA,SAAA,GAWA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,IAKA,GAAA,IAAA,GAAA,GAIA,EAAA,kBAEA,IAAA,EACA,GAAA,KAAA,KACA,EAAA,aACA,KAAA,iBAAA,EAAA,GAAA,GAGA,KACA,MAAA,GAAA,MAAA,eAAA,GACA,QACA,GACA,KAAA,oBAAA,EAAA,GAAA,MAwBA,IACA,EAAA,GAAA,EAMA,IAAA,IAAA,SAAA,gBA+DA,GAAA,iBAAA,EACA,EAAA,sBAAA,EACA,EAAA,sBAAA,EACA,EAAA,uBAAA,EACA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,YAAA,GACA,EAAA,SAAA,MAAA,EACA,EAAA,SAAA,YAAA,EACA,EAAA,SAAA,WAAA,GACA,EAAA,SAAA,WAAA,GACA,EAAA,SAAA,QAAA,IAEA,OAAA,mBC33BA,SAAA,GACA,YAwBA,SAAA,GAAA,EAAA,GACA,OAAA,eAAA,EAAA,EAAA,GAGA,QAAA,GAAA,GACA,KAAA,KAAA,EAkCA,QAAA,KACA,KAAA,OAAA,EACA,EAAA,KAAA,UASA,QAAA,GAAA,GAEA,IAAA,GADA,GAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,GAAA,GAAA,EAAA,GAGA,OADA,GAAA,OAAA,EACA,EAGA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAlFA,GAAA,GAAA,EAAA,SAAA,QACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,UACA,IAAA,EAAA,CAGA,GAAA,EACA,KACA,EAAA,SAAA,YAAA,cACA,MAAA,GAGA,OAGA,GAAA,IAAA,YAAA,EAUA,GAAA,WACA,GAAA,UACA,MAAA,GAAA,KAAA,KAAA,SAIA,IAAA,IACA,cAAA,EACA,YAAA,EACA,IAAA,OAIA,UACA,UACA,UACA,UACA,QACA,QACA,aACA,gBACA,gBACA,sBACA,eACA,QAAA,SAAA,GACA,EAAA,IAAA,WACA,MAAA,MAAA,KAAA,IAEA,OAAA,eAAA,EAAA,UAAA,EAAA,KAQA,EAAA,WACA,KAAA,SAAA,GACA,MAAA,MAAA,KAiBA,EAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAGA,GAAA,iBACA,MAAA,GAAA,EAAA,MAAA,gBAGA,GAAA,kBACA,MAAA,GAAA,EAAA,MAAA,iBAGA,eAAA,WAIA,KAAA,IAAA,OAAA,sBAIA,EAAA,EAAA,EAAA,GAEA,EAAA,SAAA,MAAA,EACA,EAAA,SAAA,WAAA,EACA,EAAA,SAAA,UAAA,IAEA,OAAA,mBCvHA,SAAA,GACA,YAMA,SAAA,GAAA,EAAA,GACA,OAAA,eAAA,EAAA,EAAA,GAGA,QAAA,KACA,KAAA,OAAA,EACA,EAAA,KAAA,UASA,QAAA,GAAA,GACA,GAAA,MAAA,EACA,MAAA,EAEA,KAAA,GADA,GAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IACA,EAAA,GAAA,EAAA,EAAA,GAGA,OADA,GAAA,OAAA,EACA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,UAAA,GAAA,WACA,MAAA,GAAA,KAAA,KAAA,GAAA,MAAA,KAAA,KAAA,aAhCA,GAAA,GAAA,EAAA,KAEA,GAAA,YAAA,EAUA,GAAA,WACA,KAAA,SAAA,GACA,MAAA,MAAA,KAGA,EAAA,EAAA,UAAA,QAmBA,EAAA,SAAA,SAAA,EACA,EAAA,sBAAA,EACA,EAAA,aAAA,GAEA,OAAA,mBCzCA,SAAA,GACA,YAIA,GAAA,mBAAA,EAAA,aACA,EAAA,SAAA,eAAA,EAAA,SAAA,UAEA,OAAA,mBCRA,SAAA,GACA,YAoBA,SAAA,GAAA,GACA,EAAA,YAAA,IAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,EAGA,OAFA,GAAA,GAAA,EACA,EAAA,OAAA,EACA,EAYA,QAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,aACA,aAAA,EACA,gBAAA,EAAA,gBACA,YAAA,EAAA,cAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,aACA,aAAA,IAUA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,YAAA,kBAAA,CACA,GAAA,GAAA,EAAA,EAGA,IAAA,CACA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IACA,EAAA,YAAA,EAAA,IACA,EAAA,GAAA,YAAA,CAEA,IAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,iBAAA,EAAA,EAAA,IAAA,EACA,EAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAQA,OALA,KACA,EAAA,aAAA,EAAA,IACA,IACA,EAAA,iBAAA,EAAA,EAAA,OAAA,IAEA,EAGA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,UAcA,OAbA,IAEA,EAAA,YAAA,GAGA,EAAA,YAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,EACA,IACA,EAAA,aAAA,GACA,IACA,EAAA,iBAAA,GAEA,EAGA,QAAA,GAAA,GACA,GAAA,YAAA,kBACA,MAAA,GAAA,EAEA,IAAA,GAAA,EAAA,GACA,EAAA,EAAA,UAGA,OAFA,IACA,EAAA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,GAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAIA,OAFA,GAAA,OAAA,EACA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,GAEA,MAAA,GAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,kBAGA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GAAA,GAKA,QAAA,GAAA,GACA,EAAA,EAAA,GAAA,GAAA,EAAA,OAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,IAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,WAAA,EAAA,cACA,EAAA,EAAA,aACA,KAAA,EAAA,eACA,EAAA,UAAA,GAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,OAAA,CAGA,GAAA,GAAA,EAAA,aAGA,IAAA,IAAA,EAAA,GAAA,cAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,kBAAA,EAAA,GAAA,IAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,EACA,IAAA,GAAA,EAAA,MAEA,IAAA,IAAA,EACA,MAAA,GAAA,EAAA,GAGA,KAAA,GADA,GAAA,EAAA,EAAA,cAAA,0BACA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,YAAA,EAAA,EAAA,IAEA,OAAA,GAGA,QAAA,GAAA,GACA,GAAA,SAAA,EAAA,YAEA,IADA,GAAA,GAAA,EAAA,YACA,GAAA,CACA,GAAA,GAAA,CACA,GAAA,EAAA,aACA,EAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,OAGA,EAAA,YAAA,EAAA,WAAA,OAGA,QAAA,GAAA,GACA,GAAA,EAAA,2BAAA,CAEA,IADA,GAAA,GAAA,EAAA,WACA,GAAA,CACA,EAAA,EAAA,aAAA,EACA,IAAA,GAAA,EAAA,YACA,EAAA,EAAA,GACA,EAAA,EAAA,UACA,IACA,EAAA,KAAA,EAAA,GACA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,KACA,EAAA,EAEA,EAAA,YAAA,EAAA,WAAA,SAKA,KAHA,GAEA,GAFA,EAAA,EAAA,GACA,EAAA,EAAA,WAEA,GACA,EAAA,EAAA,YACA,EAAA,KAAA,EAAA,GACA,EAAA,EAKA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,UACA,OAAA,IAAA,EAAA,2BAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,WAAA,YAAA,GAOA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,EAMA,IAJA,EAAA,EADA,EACA,EAAA,KAAA,EAAA,EAAA,MAAA,GAEA,EAAA,KAAA,EAAA,MAAA,IAEA,EAAA,CACA,IAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,GAAA,EAAA,GAGA,IAAA,YAAA,GAAA,oBAEA,IAAA,GADA,GAAA,EAAA,QACA,EAAA,EAAA,QAAA,WACA,EACA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,GAAA,EAAA,IAKA,MAAA,GAGA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,EAAA,KAAA,EAAA,GACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,WACA,GAAA,IAAA,EACA,OAAA,CAEA,QAAA,EAWA,QAAA,GAAA,GACA,EAAA,YAAA,IAEA,EAAA,KAAA,KAAA,GAUA,KAAA,YAAA,OAMA,KAAA,YAAA,OAMA,KAAA,WAAA,OAMA,KAAA,aAAA,OAMA,KAAA,iBAAA,OAEA,KAAA,WAAA,OArUA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,SACA,EAAA,EAAA,UACA,EAAA,EAAA,OACA,EAAA,EAAA,iBACA,EAAA,EAAA,gBACA,EAAA,EAAA,aACA,EAAA,EAAA,UACA,EAAA,EAAA,MACA,EAAA,EAAA,2BACA,EAAA,EAAA,gBACA,EAAA,EAAA,aACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KACA,EAAA,EAAA,aACA,EAAA,EAAA,SAaA,GAAA,EAkNA,EAAA,SAAA,WACA,EAAA,OAAA,KAAA,UAAA,UAsCA,EAAA,OAAA,KAkDA,EAAA,OAAA,iBAEA,GADA,EAAA,UAAA,YAEA,EAAA,UAAA,yBACA,EAAA,EAAA,UAAA,aACA,EAAA,EAAA,UAAA,YACA,EAAA,EAAA,UAAA,aAEA,EAAA,UAAA,KAAA,UAAA,WAEA,EAAA,EACA,SAAA,EAAA,GACA,IACA,EAAA,KAAA,EAAA,GACA,MAAA,GACA,KAAA,YAAA,IACA,KAAA,KAGA,SAAA,EAAA,GACA,EAAA,KAAA,EAAA,GAGA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,YAAA,SAAA,GACA,MAAA,MAAA,aAAA,EAAA,OAGA,aAAA,SAAA,EAAA,GACA,EAAA,EAEA,IAAA,EACA,GACA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EACA,EAAA,EAAA,KAGA,EAAA,KACA,EAAA,MAGA,GAAA,EAAA,EAAA,aAAA,KAEA,IAAA,GACA,EACA,EAAA,EAAA,gBAAA,KAAA,UAEA,GAAA,KAAA,6BACA,EAAA,EAOA,IAJA,EADA,EACA,EAAA,GAEA,EAAA,EAAA,KAAA,EAAA,GAEA,EACA,EAAA,KAAA,GACA,EAAA,MACA,EAAA,KAAA,KAAA,KAAA,EAAA,GAAA,OACA,CACA,IACA,KAAA,YAAA,EAAA,IACA,IACA,KAAA,WAAA,EAAA,EAAA,OAAA,GACA,SAAA,KAAA,cACA,KAAA,YAAA,KAAA,YAGA,IAAA,GAAA,EAAA,EAAA,WAAA,KAAA,IAGA,GACA,EAAA,KAAA,EACA,EAAA,KAAA,GAAA,GAEA,EAAA,KAAA,GAYA,MARA,GAAA,KAAA,aACA,WAAA,EACA,YAAA,EACA,gBAAA,IAGA,EAAA,EAAA,MAEA,GAGA,YAAA,SAAA,GAEA,GADA,EAAA,GACA,EAAA,aAAA,KAAA,CAIA,IAAA,GAFA,IAAA,EAEA,GADA,KAAA,WACA,KAAA,YAAA,EACA,EAAA,EAAA,YACA,GAAA,IAAA,EAAA,CACA,GAAA,CACA,OAGA,IAAA,EAEA,KAAA,IAAA,OAAA,iBAIA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,YACA,EAAA,EAAA,eAEA,IAAA,KAAA,2BAAA,CAIA,GAAA,GAAA,KAAA,WACA,EAAA,KAAA,UAEA,EAAA,EAAA,UACA,IACA,EAAA,EAAA,GAEA,IAAA,IACA,KAAA,YAAA,GACA,IAAA,IACA,KAAA,WAAA,GACA,IACA,EAAA,aAAA,GACA,IACA,EAAA,iBACA,GAGA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,WAEA,GAAA,MACA,EAAA,KAAA,KAAA,EAaA,OAVA,IACA,EAAA,KAAA,aACA,aAAA,EAAA,GACA,YAAA,EACA,gBAAA,IAIA,EAAA,KAAA,GAEA,GAGA,aAAA,SAAA,EAAA,GACA,EAAA,EAEA,IAAA,EAQA,IAPA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EACA,EAAA,EAAA,IAGA,EAAA,aAAA,KAEA,KAAA,IAAA,OAAA,gBAGA,IAEA,GAFA,EAAA,EAAA,YACA,EAAA,EAAA,gBAGA,GAAA,KAAA,6BACA,EAAA,EA2CA,OAzCA,GACA,EAAA,EAAA,IAEA,IAAA,IACA,EAAA,EAAA,aACA,EAAA,EAAA,EAAA,KAAA,EAAA,IAGA,GAiBA,EAAA,KAAA,GACA,EAAA,MACA,EAAA,KAAA,KAAA,KAAA,EAAA,GACA,KAnBA,KAAA,aAAA,IACA,KAAA,YAAA,EAAA,IACA,KAAA,YAAA,IACA,KAAA,WAAA,EAAA,EAAA,OAAA,IAEA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,OAGA,EAAA,YACA,EAAA,KACA,EAAA,WACA,EAAA,KAAA,GACA,IASA,EAAA,KAAA,aACA,WAAA,EACA,aAAA,EAAA,GACA,YAAA,EACA,gBAAA,IAGA,EAAA,GACA,EAAA,EAAA,MAEA,GAQA,gBAAA,WACA,IAAA,GAAA,GAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,mBAIA,cAAA,WACA,MAAA,QAAA,KAAA,YAIA,GAAA,cAEA,MAAA,UAAA,KAAA,YACA,KAAA,YAAA,EAAA,KAAA,KAAA,aAIA,GAAA,cACA,MAAA,UAAA,KAAA,YACA,KAAA,YAAA,EAAA,KAAA,KAAA,aAIA,GAAA,aACA,MAAA,UAAA,KAAA,WACA,KAAA,WAAA,EAAA,KAAA,KAAA,YAIA,GAAA,eACA,MAAA,UAAA,KAAA,aACA,KAAA,aAAA,EAAA,KAAA,KAAA,cAIA,GAAA,mBACA,MAAA,UAAA,KAAA,iBACA,KAAA,iBAAA,EAAA,KAAA,KAAA,kBAGA,GAAA,iBAEA,IADA,GAAA,GAAA,KAAA,WACA,GAAA,EAAA,WAAA,EAAA,cACA,EAAA,EAAA,UAEA,OAAA,IAGA,GAAA,eAIA,IAAA,GADA,GAAA,GACA,EAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,UAAA,EAAA,eACA,GAAA,EAAA,YAGA,OAAA,IAEA,GAAA,aAAA,GACA,GAAA,GAAA,EAAA,KAAA,WAEA,IAAA,KAAA,4BAEA,GADA,EAAA,MACA,KAAA,EAAA,CACA,GAAA,GAAA,KAAA,KAAA,cAAA,eAAA,EACA,MAAA,YAAA,QAGA,GAAA,MACA,KAAA,KAAA,YAAA,CAGA,IAAA,GAAA,EAAA,KAAA,WAEA,GAAA,KAAA,aACA,WAAA,EACA,aAAA,IAGA,EAAA,GACA,EAAA,EAAA,OAGA,GAAA,cAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAGA,OADA,GAAA,OAAA,EACA,GAGA,UAAA,SAAA,GACA,MAAA,GAAA,KAAA,IAGA,SAAA,SAAA,GACA,MAAA,GAAA,KAAA,EAAA,KAGA,wBAAA,SAAA,GAGA,MAAA,GAAA,KAAA,KAAA,KACA,EAAA,KAGA,UAAA,WAMA,IAAA,GAFA,GAEA,EALA,EAAA,EAAA,KAAA,YACA,KACA,EAAA,GAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,WAAA,EAAA,UACA,GAAA,EAAA,KAAA,OAEA,GAGA,GAAA,EAAA,KACA,EAAA,KAAA,IAHA,EAAA,EAFA,KAAA,WAAA,IAQA,GAAA,EAAA,SACA,EAAA,MAAA,EACA,aAAA,IAEA,KACA,EAAA,GACA,EAAA,KACA,EAAA,WAAA,QACA,EAAA,YAKA,IAAA,EAAA,SACA,EAAA,MAAA,EACA,EAAA,OAKA,EAAA,EAAA,iBAKA,EAAA,EAAA,EAAA,SAAA,gCACA,GAAA,UAAA,oBACA,GAAA,UAAA,iBACA,EAAA,UAAA,EAAA,OAAA,OAAA,EAAA,WAAA,EAAA,WAEA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,eAAA,EACA,EAAA,eAAA,EACA,EAAA,iBAAA,EACA,EAAA,iBAAA,EACA,EAAA,SAAA,KAAA,GAEA,OAAA,mBC1tBA,SAAA,GACA,YAKA,SAAA,GAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,EAAA,kBACA,GAAA,CACA,GAAA,EAAA,QAAA,GACA,MAAA,EAEA,IADA,EAAA,EAAA,EAAA,GAEA,MAAA,EACA,GAAA,EAAA,mBAEA,MAAA,MAGA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,QAAA,GAKA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,SACA,OAAA,KAAA,GACA,IAAA,GAAA,EAAA,eAAA,EAGA,QAAA,KACA,OAAA,EAGA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,YAAA,EAGA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,eAAA,EAGA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,GAAA,eAAA,GAAA,EAAA,YAAA,EAGA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,kBACA,GACA,EAAA,EAAA,EAAA,KACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,kBAEA,OAAA,GApDA,GAAA,GAAA,EAAA,SAAA,eACA,EAAA,EAAA,SAAA,SAmBA,EAAA,+BAuCA,GACA,cAAA,SAAA,GACA,MAAA,GAAA,KAAA,IAEA,iBAAA,SAAA,GACA,MAAA,GAAA,KAAA,GAAA,GAAA,EAAA,KAIA,GACA,qBAAA,SAAA,GACA,GAAA,GAAA,GAAA,EACA,OAAA,MAAA,EACA,EAAA,KAAA,EAAA,GAEA,EAAA,KAAA,EACA,EACA,EACA,EAAA,gBAGA,uBAAA,SAAA,GAEA,MAAA,MAAA,iBAAA,IAAA,IAGA,uBAAA,SAAA,EAAA,GACA,GAAA,GAAA,GAAA,EAEA,IAAA,KAAA,EACA,EAAA,SACA,IAAA,MAAA,EACA,MAAA,MAAA,EACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,EAAA,EAAA,EAGA,OAAA,MAAA,EACA,EAAA,KAAA,EAAA,EAAA,GAEA,EAAA,KAAA,EAAA,EAAA,EAAA,IAIA,GAAA,uBAAA,EACA,EAAA,mBAAA,GAEA,OAAA,mBC7GA,SAAA,GACA,YAIA,SAAA,GAAA,GACA,KAAA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,WAEA,OAAA,GAGA,QAAA,GAAA,GACA,KAAA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,eAEA,OAAA,GAbA,GAAA,GAAA,EAAA,SAAA,SAgBA,GACA,GAAA,qBACA,MAAA,GAAA,KAAA,aAGA,GAAA,oBACA,MAAA,GAAA,KAAA,YAGA,GAAA,qBAEA,IAAA,GADA,GAAA,EACA,EAAA,KAAA,kBACA,EACA,EAAA,EAAA,mBACA,GAEA,OAAA,IAGA,GAAA,YAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,KAAA,kBACA,EACA,EAAA,EAAA,mBACA,EAAA,KAAA,CAGA,OADA,GAAA,OAAA,EACA,GAGA,OAAA,WACA,GAAA,GAAA,KAAA,UACA,IACA,EAAA,YAAA,QAIA,GACA,GAAA,sBACA,MAAA,GAAA,KAAA,cAGA,GAAA,0BACA,MAAA,GAAA,KAAA,kBAIA,GAAA,mBAAA,EACA,EAAA,oBAAA,GAEA,OAAA,mBCtEA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GATA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,gBACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,OAAA,aAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,eACA,MAAA,MAAA,MAEA,GAAA,aAAA,GACA,KAAA,KAAA,GAEA,GAAA,QACA,MAAA,MAAA,KAAA,MAEA,GAAA,MAAA,GACA,GAAA,GAAA,KAAA,KAAA,IACA,GAAA,KAAA,iBACA,SAAA,IAEA,KAAA,KAAA,KAAA,KAIA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,EACA,SAAA,eAAA,KAEA,EAAA,SAAA,cAAA,GACA,OAAA,mBCxCA,SAAA,GACA,YAOA,SAAA,GAAA,GACA,MAAA,KAAA,EAKA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAZA,GAAA,GAAA,EAAA,SAAA,cAEA,GADA,EAAA,gBACA,EAAA,OACA,EAAA,EAAA,gBAMA,EAAA,OAAA,IAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,UAAA,SAAA,GACA,EAAA,EAAA,EACA,IAAA,GAAA,KAAA,IACA,IAAA,EAAA,EAAA,OACA,KAAA,IAAA,OAAA,iBACA,IAAA,GAAA,EAAA,MAAA,EAAA,GACA,EAAA,EAAA,MAAA,EACA,MAAA,KAAA,CACA,IAAA,GAAA,KAAA,cAAA,eAAA,EAGA,OAFA,MAAA,YACA,KAAA,WAAA,aAAA,EAAA,KAAA,aACA,KAIA,EAAA,EAAA,EAAA,SAAA,eAAA,KAEA,EAAA,SAAA,KAAA,GACA,OAAA,mBCrCA,SAAA,GACA,YA6BA,SAAA,GAAA,EAAA,GAEA,GAAA,GAAA,EAAA,UACA,IAAA,GAAA,EAAA,WAAA,CAGA,GAAA,GAAA,EAAA,mBAAA,EACA,GAAA,mBAAA,IACA,EAAA,cAGA,QAAA,GAAA,EAAA,EAAA,GAIA,EAAA,EAAA,cACA,KAAA,EACA,UAAA,KACA,SAAA,IAIA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAwDA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,CACA,QAAA,eAAA,EAAA,GACA,IAAA,WACA,MAAA,MAAA,KAAA,IAEA,IAAA,SAAA,GACA,KAAA,KAAA,GAAA,EACA,EAAA,KAAA,IAEA,cAAA,EACA,YAAA,IArHA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,oBACA,EAAA,EAAA,mBAEA,GADA,EAAA,sBACA,EAAA,iBACA,EAAA,EAAA,MAEA,GADA,EAAA,MACA,EAAA,iBACA,EAAA,EAAA,SAEA,EAAA,OAAA,QAEA,GACA,UACA,qBACA,oBACA,yBACA,OAAA,SAAA,GACA,MAAA,GAAA,UAAA,KAGA,EAAA,EAAA,GAEA,EAAA,EAAA,UAAA,EA2BA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,iBAAA,WACA,GAAA,GAAA,GAAA,GAAA,WAAA,KACA,MAAA,KAAA,mBAAA,CAEA,IAAA,GAAA,EAAA,mBAAA,KAGA,OAFA,GAAA,aAEA,GAGA,GAAA,cACA,MAAA,MAAA,KAAA,oBAAA,MAKA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,KAAA,aAAA,EACA,MAAA,KAAA,aAAA,EAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,IAGA,gBAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,aAAA,EACA,MAAA,KAAA,gBAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,IAGA,QAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,KAAA,MAIA,EAAA,QAAA,SAAA,GACA,YAAA,IACA,EAAA,UAAA,GAAA,SAAA,GACA,MAAA,MAAA,QAAA,OAKA,EAAA,UAAA,yBACA,EAAA,UAAA,uBACA,EAAA,UAAA,kBAsBA,EAAA,EAAA,UAAA,MACA,EAAA,EAAA,UAAA,YAAA,SAEA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,EACA,SAAA,gBAAA,KAAA,MAIA,EAAA,aAAA,EACA,EAAA,SAAA,QAAA,GACA,OAAA,mBC3IA,SAAA,GACA,YAqBA,SAAA,GAAA,GACA,OAAA,GACA,IAAA,IACA,MAAA,OACA,KAAA,IACA,MAAA,MACA,KAAA,IACA,MAAA,MACA,KAAA,IACA,MAAA,QACA,KAAA,OACA,MAAA,UAIA,QAAA,GAAA,GACA,MAAA,GAAA,QAAA,EAAA,GAGA,QAAA,GAAA,GACA,MAAA,GAAA,QAAA,EAAA,GAGA,QAAA,GAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,KAAA,CAEA,OAAA,GAkCA,QAAA,GAAA,EAAA,GACA,OAAA,EAAA,UACA,IAAA,MAAA,aAIA,IAAA,GAAA,GAHA,EAAA,EAAA,QAAA,cACA,EAAA,IAAA,EACA,EAAA,EAAA,WACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,GAAA,IAAA,EAAA,KAAA,KAAA,EAAA,EAAA,OAAA,GAGA,OADA,IAAA,IACA,EAAA,GACA,EAEA,EAAA,EAAA,GAAA,KAAA,EAAA,GAEA,KAAA,MAAA,UACA,GAAA,GAAA,EAAA,IACA,OAAA,IAAA,EAAA,EAAA,WACA,EACA,EAAA,EAEA,KAAA,MAAA,aACA,MAAA,OAAA,EAAA,KAAA,KAEA,SAEA,KADA,SAAA,MAAA,GACA,GAAA,OAAA,oBAIA,QAAA,GAAA,GACA,YAAA,GAAA,sBACA,EAAA,EAAA,QAGA,KAAA,GADA,GAAA,GACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,GAAA,EAAA,EAAA,EAEA,OAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,KACA,GAAA,YAAA,EACA,IAAA,GAAA,EAAA,EAAA,cAAA,cAAA,GACA,GAAA,UAAA,CAEA,KADA,GAAA,GACA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,IAUA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAwFA,QAAA,GAAA,EAAA,GAEA,GAAA,GAAA,EAAA,EAAA,WAAA,GACA,GAAA,UAAA,CAGA,KAFA,GACA,GADA,EAAA,EAAA,SAAA,0BAEA,EAAA,EAAA,YACA,EAAA,YAAA,EAEA,OAAA,GAAA,GAGA,QAAA,GAAA,GACA,MAAA,YAEA,MADA,GAAA,mBACA,KAAA,KAAA,IAIA,QAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAgBA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GACA,IAAA,EAAA,GACA,IAAA,SAAA,GACA,EAAA,mBACA,KAAA,KAAA,GAAA,GAEA,cAAA,EACA,YAAA,IASA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GACA,MAAA,WAEA,MADA,GAAA,mBACA,KAAA,KAAA,GAAA,MAAA,KAAA,KAAA,YAEA,cAAA,EACA,YAAA,IAhSA,GAAA,GAAA,EAAA,SAAA,QACA,EAAA,EAAA,aACA,EAAA,EAAA,gBACA,EAAA,EAAA,MACA,EAAA,EAAA,eACA,EAAA,EAAA,iBACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,SAMA,EAAA,cACA,EAAA,eAkCA,EAAA,GACA,OACA,OACA,KACA,MACA,UACA,QACA,KACA,MACA,QACA,SACA,OACA,OACA,QACA,SACA,QACA,QAGA,EAAA,GACA,QACA,SACA,MACA,SACA,UACA,WACA,YACA,aAwDA,EAAA,OAAA,KAAA,UAAA,WAEA,EAAA,OAAA,YACA,EAAA,OAAA,mBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,aACA,MAAA,GAAA,OAEA,GAAA,WAAA,GAOA,GAAA,GAAA,EAAA,KAAA,WAEA,YADA,KAAA,YAAA,EAIA,IAAA,GAAA,EAAA,KAAA,WAEA,MAAA,2BACA,eAAA,GAAA,oBACA,EAAA,KAAA,QAAA,GAEA,EAAA,KAAA,EAAA,KAAA,UAKA,GACA,eAAA,GAAA,oBACA,EAAA,KAAA,QAAA,GAEA,KAAA,KAAA,UAAA,CAGA,IAAA,GAAA,EAAA,KAAA,WAEA,GAAA,KAAA,aACA,WAAA,EACA,aAAA,IAGA,EAAA,GACA,EAAA,EAAA,OAGA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,aAEA,GAAA,WAAA,GACA,GAAA,GAAA,KAAA,UACA,IAAA,EAAA,CACA,EAAA,0BACA,IAAA,GAAA,EAAA,EAAA,EACA,GAAA,aAAA,EAAA,QAIA,mBAAA,SAAA,EAAA,GACA,GAAA,GAAA,CACA,QAAA,OAAA,GAAA,eACA,IAAA,cACA,EAAA,KAAA,WACA,EAAA,IACA,MACA,KAAA,WACA,EAAA,KAAA,WACA,EAAA,KAAA,WACA,MACA,KAAA,aACA,EAAA,KACA,EAAA,KAAA,UACA,MACA,KAAA,YACA,EAAA,KACA,EAAA,IACA,MACA,SACA,OAGA,GAAA,GAAA,EAAA,EAAA,EACA,GAAA,aAAA,EAAA,OA4BA,eACA,aACA,YACA,cACA,eACA,aACA,YACA,cACA,eACA,eACA,QAAA,IAeA,aACA,aACA,QAAA,IAcA,wBACA,iBACA,kBACA,QAAA,GAGA,EAAA,EAAA,EACA,SAAA,cAAA,MAEA,EAAA,SAAA,YAAA,EAGA,EAAA,aAAA,EACA,EAAA,aAAA,GACA,OAAA,mBCtTA,SAAA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GARA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,WAAA,WACA,GAAA,GAAA,KAAA,KAAA,WAAA,MAAA,KAAA,KAAA,UACA,OAAA,IAAA,EAAA,MAIA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBC1BA,SAAA,GACA,YAQA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAPA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,OAAA,kBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,UACA,MAAA,MAAA,aAAA,WAEA,GAAA,QAAA,GACA,KAAA,aAAA,SAAA,IAGA,aAAA,SAAA,EAAA,GACA,EAAA,UAAA,aAAA,KAAA,KAAA,EAAA,GACA,WAAA,OAAA,GAAA,eACA,KAAA,0BAAA,MAMA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,mBAAA,GACA,OAAA,mBClCA,SAAA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAOA,QAAA,GAAA,EAAA,GACA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,OACA,GAAA,KAAA,KAAA,GACA,EAAA,EAAA,MAEA,SAAA,IACA,EAAA,MAAA,GACA,SAAA,IACA,EAAA,OAAA,GA5BA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EACA,SAAA,cAAA,QAkBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,GACA,OAAA,mBCtCA,SAAA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GARA,GAAA,GAAA,EAAA,SAAA,YAGA,GAFA,EAAA,MACA,EAAA,SAAA,SACA,EAAA,iBAEA,EAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAIA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBCrBA,SAAA,GACA,YAYA,SAAA,GAAA,GACA,IAAA,EAAA,YACA,MAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,KAAA,EAAA,CAIA,IADA,EAAA,EAAA,eAAA,mBAAA,IACA,EAAA,WACA,EAAA,YAAA,EAAA,UAEA,GAAA,IAAA,EAAA,GAEA,MAAA,GAGA,QAAA,GAAA,GAKA,IAHA,GAEA,GAFA,EAAA,EAAA,EAAA,eACA,EAAA,EAAA,EAAA,0BAEA,EAAA,EAAA,YACA,EAAA,YAAA,EAEA,OAAA,GAKA,QAAA,GAAA,GAEA,GADA,EAAA,KAAA,KAAA,IACA,EAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,IAAA,KAAA,EAAA,KA3CA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,GAAA,SACA,EAAA,GAAA,SA8BA,EAAA,OAAA,mBASA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GACA,EAAA,KAAA,KAAA,SACA,EAAA,IAAA,SAOA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,oBAAA,GACA,OAAA,mBClEA,SAAA,GACA,YAOA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GANA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,gBAEA,EAAA,OAAA,gBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EACA,SAAA,cAAA,UAEA,EAAA,SAAA,iBAAA,GACA,OAAA,mBCjBA,SAAA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAOA,QAAA,GAAA,GACA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,SACA,GAAA,KAAA,KAAA,GACA,EAAA,EAAA,MAEA,EAAA,aAAA,UAAA,QACA,SAAA,GACA,EAAA,aAAA,MAAA,GA3BA,GAAA,GAAA,EAAA,SAAA,iBACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EACA,SAAA,cAAA,UAiBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,GACA,OAAA,mBCrCA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,MAAA,GAAA,QAAA,OAAA,KAAA,OAGA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAkBA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,UACA,GAAA,KAAA,KAAA,GACA,EAAA,EAAA,MAEA,SAAA,IACA,EAAA,KAAA,GACA,SAAA,GACA,EAAA,aAAA,QAAA,GACA,KAAA,GACA,EAAA,aAAA,WAAA,IACA,EAAA,SAAA,KAAA,EAhDA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBASA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,QACA,MAAA,GAAA,KAAA,cAEA,GAAA,MAAA,GACA,KAAA,YAAA,EAAA,OAAA,KAEA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAIA,EAAA,EAAA,EACA,SAAA,cAAA,WAqBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,OAAA,GACA,OAAA,mBC1DA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GATA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,IAAA,SAAA,EAAA,GACA,gBAAA,KACA,EAAA,EAAA,IACA,EAAA,MAAA,IAAA,EAAA,GAAA,IAGA,OAAA,SAAA,GAGA,MAAA,UAAA,MACA,GAAA,UAAA,OAAA,KAAA,OAIA,gBAAA,KACA,EAAA,EAAA,QAEA,GAAA,MAAA,OAAA,KAGA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAIA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBC3CA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,mBAEA,EAAA,OAAA,gBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAEA,cAAA,WACA,MAAA,GAAA,EAAA,MAAA,kBAGA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAEA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAGA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAEA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAGA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAEA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAGA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,OAEA,UAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,UAAA,OAIA,EAAA,EAAA,EACA,SAAA,cAAA,UAEA,EAAA,SAAA,iBAAA,GACA,OAAA,mBCzDA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,mBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,uBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,OAEA,UAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,UAAA,OAIA,EAAA,EAAA,EACA,SAAA,cAAA,UAEA,EAAA,SAAA,wBAAA,GACA,OAAA,mBC7BA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,mBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,mBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAGA,WAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,WAAA,OAIA,EAAA,EAAA,EACA,SAAA,cAAA,OAEA,EAAA,SAAA,oBAAA,GACA,OAAA,mBChCA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,OAAA,EAAA,WACA,IAAA,UACA,MAAA,IAAA,GAAA,EACA,KAAA,SACA,MAAA,IAAA,GAAA,EACA,KAAA,WACA,MAAA,IAAA,GAAA,GAEA,EAAA,KAAA,KAAA,GAlBA,GAAA,GAAA,EAAA,SAAA,mBACA,EAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,kBACA,EAAA,EAAA,SAAA,oBAEA,GADA,EAAA,MACA,EAAA,iBAEA,EAAA,OAAA,kBAaA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,GACA,EAAA,SAAA,mBAAA,GACA,OAAA,mBC1BA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,eAEA,EAAA,6BACA,EAAA,SAAA,gBAAA,EAAA,SACA,EAAA,EAAA,GACA,EAAA,OAAA,eAAA,EAAA,WAAA,WAEA,GAAA,SAAA,WAAA,GACA,OAAA,mBCXA,SAAA,GACA,YAmBA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAlBA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,cAKA,EAAA,6BACA,EAAA,EAAA,SAAA,gBAAA,EAAA,MACA,EAAA,SAAA,gBAAA,EAAA,OACA,EAAA,EAAA,YACA,EAAA,OAAA,eAAA,EAAA,WACA,EAAA,EAAA,WAMA,GAAA,UAAA,OAAA,OAAA,GAGA,gBAAA,IACA,EAAA,EAAA,WACA,GAAA,gBACA,MAAA,GAAA,EAAA,MAAA,eAEA,GAAA,wBACA,MAAA,GAAA,EAAA,MAAA,yBAKA,EAAA,EAAA,EAAA,GAEA,EAAA,SAAA,cAAA,GACA,OAAA,mBCzCA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,KAEA,EAAA,OAAA,kBACA,KAOA,EAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,GAAA,wBACA,MAAA,GAAA,KAAA,KAAA,uBAIA,GAAA,2BACA,MAAA,GAAA,KAAA,KAAA,0BAIA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAIA,GAAA,cACA,KAAA,IAAA,OAAA,oBAIA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAIA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,YAIA,GAAA,mBACA,MAAA,GAAA,KAAA,KAAA,kBAIA,GAAA,eACA,MAAA,GAAA,KAAA,KAAA,gBAIA,EAAA,EAAA,GAEA,EAAA,SAAA,mBAAA,IACA,OAAA,mBC9DA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,KAAA,KAAA,EATA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,wBAMA,GAAA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,KAAA,KAAA,SAGA,UAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,UAAA,MAAA,KAAA,KAAA,YAGA,cAAA,WAEA,MADA,WAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,cAAA,MAAA,KAAA,KAAA,cAIA,EAAA,EAAA,EACA,SAAA,cAAA,UAAA,WAAA,OAEA,EAAA,SAAA,yBAAA,GACA,OAAA,mBCnCA,SAAA,GACA,YAaA,SAAA,GAAA,GACA,KAAA,KAAA,EAZA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,qBAGA,IAAA,EAAA,CAOA,EAAA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,KAAA,KAAA,SAGA,WAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,WAAA,MAAA,KAAA,KAAA;EAGA,cAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,cAAA,MAAA,KAAA,KAAA,aAQA,IAAA,GAAA,SAAA,KAAA,UAAA,YACA,oBAAA,KAAA,mBAAA,QAEA,GAAA,EAAA,EACA,GAEA,EAAA,SAAA,sBAAA,IACA,OAAA,mBC7CA,SAAA,GACA,YASA,SAAA,GAAA,GACA,KAAA,KAAA,EARA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,KAKA,GAAA,WACA,GAAA,kBACA,MAAA,GAAA,KAAA,KAAA,iBAEA,GAAA,gBACA,MAAA,GAAA,KAAA,KAAA,eAEA,GAAA,2BACA,MAAA,GAAA,KAAA,KAAA,0BAEA,SAAA,SAAA,EAAA,GACA,KAAA,KAAA,SAAA,EAAA,GAAA,IAEA,OAAA,SAAA,EAAA,GACA,KAAA,KAAA,OAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GACA,KAAA,KAAA,eAAA,EAAA,KAEA,cAAA,SAAA,GACA,KAAA,KAAA,cAAA,EAAA,KAEA,aAAA,SAAA,GACA,KAAA,KAAA,aAAA,EAAA,KAEA,YAAA,SAAA,GACA,KAAA,KAAA,YAAA,EAAA,KAEA,WAAA,SAAA,GACA,KAAA,KAAA,WAAA,EAAA,KAEA,mBAAA,SAAA,GACA,KAAA,KAAA,mBAAA,EAAA,KAEA,sBAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,sBAAA,EAAA,EAAA,KAEA,gBAAA,WACA,MAAA,GAAA,KAAA,KAAA,oBAEA,cAAA,WACA,MAAA,GAAA,KAAA,KAAA,kBAEA,WAAA,SAAA,GACA,KAAA,KAAA,WAAA,EAAA,KAEA,iBAAA,SAAA,GACA,KAAA,KAAA,iBAAA,EAAA,KAEA,WAAA,WACA,MAAA,GAAA,KAAA,KAAA,eAEA,eAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,eAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,aAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GACA,MAAA,MAAA,KAAA,eAAA,EAAA,KAEA,SAAA,WACA,MAAA,MAAA,KAAA,aAKA,EAAA,UAAA,2BACA,EAAA,UAAA,yBAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,yBAAA,MAIA,EAAA,OAAA,MAAA,EAAA,SAAA,eAEA,EAAA,SAAA,MAAA,GAEA,OAAA,mBC1FA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,uBACA,EAAA,EAAA,oBACA,EAAA,EAAA,mBACA,EAAA,EAAA,MACA,EAAA,EAAA,eAEA,EAAA,EAAA,SAAA,yBACA,GAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,EAEA,IAAA,GAAA,EAAA,SAAA,cAAA,IAEA,GAAA,SAAA,QAAA,EACA,EAAA,SAAA,iBAAA,GAEA,OAAA,mBCnBA,SAAA,GACA,YAiBA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,KAAA,cAAA,yBACA,GAAA,KAAA,KAAA,GAIA,EAAA,EAAA,KAEA,IAAA,GAAA,EAAA,UACA,GAAA,IAAA,KAAA,GAEA,KAAA,WACA,GAAA,GAAA,KAAA,EAAA,GAAA,IAEA,EAAA,IAAA,KAAA,GA7BA,GAAA,GAAA,EAAA,SAAA,iBACA,EAAA,EAAA,UACA,EAAA,EAAA,iBACA,EAAA,EAAA,aACA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,OACA,EAAA,EAAA,aACA,EAAA,EAAA,OAEA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,aAkBA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,aACA,MAAA,GAAA,OAEA,GAAA,WAAA,GACA,EAAA,KAAA,GACA,KAAA,4BAGA,GAAA,mBACA,MAAA,GAAA,IAAA,OAAA,MAGA,GAAA,QACA,MAAA,GAAA,IAAA,OAAA,MAGA,yBAAA,WACA,MAAA,GAAA,IAAA,MAAA,4BAGA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,KAAA,cAAA,EAAA,IAGA,eAAA,SAAA,GACA,MAAA,GAAA,KAAA,GACA,KACA,KAAA,cAAA,QAAA,EAAA,SAIA,EAAA,SAAA,WAAA,GAEA,OAAA,mBCrEA,SAAA,GACA,YAoBA,SAAA,GAAA,GACA,EAAA,iBAAA,EAAA,gBACA,EAAA,aAAA,EAAA,YACA,EAAA,YAAA,EAAA,WAuBA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,GAAA,IAKA,IAHA,EAAA,GACA,EAAA,GAEA,EASA,EAAA,aAAA,IACA,EAAA,YAAA,GAEA,EAAA,iBAAA,EAAA,oBAZA,CACA,EAAA,WAAA,EAAA,UACA,EAAA,YAAA,EAAA,aACA,EAAA,YAAA,EAAA,WAEA,IAAA,GAAA,EAAA,EAAA,UACA,KACA,EAAA,aAAA,EAAA,aAQA,EAAA,aAAA,EAAA,GAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,UACA,IAAA,EAAA,CAGA,GAAA,GAAA,EAAA,EACA,GAAA,GAEA,EAAA,kBACA,EAAA,gBAAA,aAAA,GACA,EAAA,cACA,EAAA,YAAA,iBAAA,GAEA,EAAA,YAAA,IACA,EAAA,WAAA,GACA,EAAA,aAAA,IACA,EAAA,YAAA,GAEA,EAAA,YAAA,IAOA,QAAA,GAAA,GACA,EAAA,IAAA,MAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAGA,OAFA,IACA,EAAA,IAAA,EAAA,MACA,EAGA,QAAA,GAAA,GAEA,IAAA,GADA,MAAA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAEA,OAAA,GAaA,QAAA,KAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,cACA,IAAA,EAAA,OAEA,EAAA,SAGA,KAGA,QAAA,KACA,EAAA,KACA,IAQA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAKA,OAJA,KACA,EAAA,GAAA,GAAA,GACA,EAAA,IAAA,EAAA,IAEA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GAAA,IACA,OAAA,aAAA,GACA,EACA,KAGA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,MAaA,QAAA,GAAA,GACA,KAAA,MAAA,EACA,KAAA,KAAA,EACA,KAAA,cA8DA,QAAA,GAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,uBACA,KAAA,cAAA,GAyOA,QAAA,GAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,GACA,EAAA,KAAA,MAAA,EAAA,EAAA,IAEA,EAAA,KAAA,EAGA,OAAA,GAGA,QAAA,GAAA,GACA,GAAA,YAAA,GACA,MAAA,EACA,IAAA,YAAA,GACA,MAAA,KACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EACA,MAAA,GAEA,MAAA,MAGA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,GAGA,EAAA,KAAA,GAFA,EAAA,IAAA,GAAA,IAKA,QAAA,GAAA,GACA,MAAA,GAAA,IAAA,GAGA,QAAA,GAAA,GAEA,EAAA,IAAA,EAAA,QAWA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,aAAA,SACA,KAAA,EACA,OAAA,CAIA,IADA,EAAA,EAAA,QACA,EACA,OAAA,CAEA,MAAA,YAAA,IACA,OAAA,CAEA,KAAA,EAAA,KAAA,GACA,OAAA,CAEA,KACA,MAAA,GAAA,QAAA,GACA,MAAA,GAEA,OAAA,GAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EACA,OAAA,IAAA,EAAA,EAAA,OAAA,KAAA,EAGA,QAAA,GAAA,GACA,MAAA,aAAA,IACA,YAAA,GAGA,QAAA,GAAA,GACA,MAAA,GAAA,WAKA,QAAA,GAAA,GAGA,IAAA,GAFA,MAEA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,gBACA,EAAA,KAAA,EAEA,OAAA,GAlkBA,GA2HA,GA3HA,EAAA,EAAA,SAAA,QACA,EAAA,EAAA,SAAA,mBACA,EAAA,EAAA,SAAA,kBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,SAAA,WAEA,GADA,EAAA,OACA,EAAA,cAEA,GADA,EAAA,MACA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EAAA,KAkFA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SAqBA,EAAA,EAAA,QACA,wBACA,2BACA,8BACA,eAGA,KA+CA,EAAA,GAAA,YACA,GAAA,OAAA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,QAAA,GAcA,EAAA,WACA,OAAA,SAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAEA,OADA,MAAA,WAAA,KAAA,GACA,GAGA,KAAA,SAAA,GACA,IAAA,KAAA,KAAA,CAcA,IAAA,GAXA,GAAA,KAAA,KAEA,EAAA,KAAA,WAEA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,SAEA,EAAA,EAAA,iBAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAEA,IADA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,MAAA,IACA,IACA,EAAA,KAAA,KAAA,EAIA,KAAA,GADA,GAAA,EAAA,QAAA,OACA,EAAA,EAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAAA,KACA,GAAA,IAAA,IACA,EAAA,GAKA,IAAA,GAFA,GAAA,EAAA,WACA,EAAA,EAAA,IAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,KACA,EAAA,EAAA,IACA,GAAA,EAAA,EAAA,GAIA,EAAA,IAAA,GAAA,GAEA,EAAA,KAAA,GAGA,GAAA,EAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,KAAA,MAYA,EAAA,WAGA,OAAA,SAAA,GACA,GAAA,KAAA,MAAA,CAGA,KAAA,sBAEA,IAAA,GAAA,KAAA,IAEA,MAAA,aAAA,EACA,IAAA,GAAA,GAAA,GAAA,GAAA,EACA,MAAA,gBAAA,EAAA,EAEA,IAAA,IAAA,CACA,IACA,EAAA,OAEA,KAAA,OAAA,IAGA,GAAA,kBACA,MAAA,GAAA,KAAA,MAAA,UAGA,WAAA,WACA,IAAA,KAAA,MAAA,CAGA,GAFA,KAAA,OAAA,EACA,EAAA,KAAA,MACA,EACA,MACA,GAAA,OAAA,GAAA,EAAA,KAKA,aAAA,SAAA,GACA,KAAA,SAAA,GACA,KAAA,uBAAA,IAGA,SAAA,SAAA,GACA,EAAA,GACA,EAAA,GAEA,EAAA,EAEA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,SAAA,EAGA,GAAA,YACA,KAAA,SAAA,EAAA,YAEA,EAAA,iBACA,KAAA,SAAA,EAAA,kBAIA,uBAAA,SAAA,GACA,GAAA,EAAA,GAAA,CAQA,IAAA,GAPA,GAAA,EAEA,EAAA,EAAA,GAEA,EAAA,EAAA,GAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,KAAA,iBAAA,EAAA,GAAA,EAIA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,GAMA,EAAA,EAAA,EAGA,IAAA,EAAA,CAGA,GAAA,GAAA,EAAA,eACA,KAEA,EAAA,EAAA,GAIA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GAAA,GAKA,KAAA,uBAAA,IAIA,IAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,uBAAA,IAKA,iBAAA,SAAA,EAAA,GACA,KAAA,YAAA,IAGA,GAAA,YAAA,GAAA,CACA,GAAA,GAAA,CACA,MAAA,0BAAA,EAAA,aAAA,UAKA,KAAA,GAHA,IAAA,EAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAEA,EAAA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,GAAA,OACA,GAAA,GAMA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,WACA,EACA,EAAA,EAAA,YACA,EAAA,EAAA,OAOA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,iBAAA,EAAA,IAIA,gBAAA,SAAA,EAAA,GAEA,IAAA,GADA,GAAA,KAAA,QAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAAA,EACA,MAAA,gBAAA,EAAA,GAGA,GAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,OAAA,IAKA,QAAA,SAAA,GAGA,IAAA,GAFA,MACA,EAAA,EAAA,YAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,GAAA,EAAA,GAAA,CACA,KAAA,cAAA,EAEA,KAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,EAAA,IACA,EAAA,KAAA,QAGA,GAAA,KAAA,EAGA,OAAA,IAOA,qBAAA,WACA,KAAA,WAAA,OAAA,OAAA,OAQA,0BAAA,SAAA,GACA,GAAA,EAAA,CAGA,GAAA,GAAA,KAAA,UAGA,SAAA,KAAA,KACA,EAAA,UAAA,GAGA,OAAA,KAAA,KACA,EAAA,IAAA,GAEA,EAAA,QAAA,uBAAA,SAAA,EAAA,GACA,EAAA,IAAA,MAMA,mBAAA,SAAA,GACA,MAAA,MAAA,WAAA,IAGA,cAAA,SAAA,GACA,EAAA,KAAA,uBAAA,MAsDA,IAAA,GAAA,iBAoEA,GAAA,UAAA,yBAAA,WACA,GAAA,GAAA,KAAA,KAAA,sBACA,OAAA,IACA,EAAA,cACA,IAGA,GAGA,EAAA,UAAA,oBACA,EAAA,UAAA,oBAAA,WAIA,MADA,KACA,EAAA,OAGA,EAAA,UAAA,8BAAA,WAEA,MADA,KACA,EAAA,WAGA,EAAA,UAAA,gBACA,EAAA,UAAA,gBAAA,WAEA,KAAA,0BAEA,IACA,GADA,EAAA,EAAA,KAEA,KACA,EAAA,EAAA,IACA,KAAA,KAAA,uBAAA,EACA,GACA,EAAA,cAGA,EAAA,mBAAA,EACA,EAAA,eAAA,EACA,EAAA,iBAAA,EAEA,EAAA,8BAAA,EAGA,EAAA,QACA,aAAA,EACA,OAAA,IAGA,OAAA,mBC1oBA,SAAA,GACA,YAuBA,SAAA,GAAA,GACA,GAAA,OAAA,GAAA,CAIA,GAAA,EAAA,SAAA,GAEA,IAAA,GAAA,SAAA,GAEA,EAAA,KAAA,KAAA,GAEA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAIA,EAAA,OAAA,GAAA,EACA,SAAA,cAAA,EAAA,MAAA,EAAA,MACA,EAAA,SAAA,GAAA,GAzCA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,OACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,GACA,oBACA,sBACA,mBACA,oBACA,mBACA,oBACA,oBAEA,oBAEA,sBA0BA,GAAA,QAAA,IAEA,OAAA,mBCjDA,SAAA,GACA,YASA,SAAA,GAAA,GACA,KAAA,KAAA,EARA,CAAA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,IAEA,QAAA,UAKA,EAAA,WACA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAEA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,YAEA,SAAA,SAAA,GACA,KAAA,KAAA,SAAA,EAAA,KAEA,SAAA,SAAA,EAAA,GACA,KAAA,KAAA,SAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,aAAA,EAAA,GAAA,IAEA,OAAA,SAAA,EAAA,GACA,KAAA,KAAA,OAAA,EAAA,GAAA,IAEA,WAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,WAAA,KAEA,YAAA,SAAA,GACA,KAAA,KAAA,YAAA,EAAA,KAEA,kBAAA,SAAA,GACA,KAAA,KAAA,kBAAA,EAAA,KAEA,SAAA,WACA,MAAA,MAAA,KAAA,aAgBA,EAAA,OAAA,UAAA,EAAA,OAAA,gBAEA,EAAA,SAAA,UAAA,GAEA,OAAA,mBC9DA,SAAA,GACA,YAyBA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GACA,KAAA,WAAA,GAAA,GAAA,KAAA,MAcA,QAAA,GAAA,GACA,GAAA,GAAA,SAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,KAAA,KAAA,aAkBA,QAAA,GAAA,EAAA,GACA,EAAA,KAAA,EAAA,KAAA,EAAA,IACA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,YACA,EAAA,UAAA,EAAA,YACA,YAAA,IACA,EAAA,EAAA,EACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,EAAA,GAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,eACA,IACA,EAAA,UAAA,GA0MA,QAAA,GAAA,GACA,KAAA,KAAA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,KAAA,KAAA,aAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,MAAA,KAAA,KAAA,YAtSA,GAAA,GAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,oBACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,mBACA,EAAA,EAAA,SAAA,WACA,EAAA,EAAA,UACA,EAAA,EAAA,UACA,EAAA,EAAA,iBACA,EAAA,EAAA,iBACA,EAAA,EAAA,wBACA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,uBAGA,GAFA,EAAA,aAEA,GAAA,SAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,mBAIA,EAAA,EAAA,QACA,EAAA,EAAA,SAaA,gBACA,yBACA,gBACA,kBACA,cACA,gBACA,cACA,iBACA,kBACA,QAAA,EAEA,IAAA,GAAA,SAAA,UAuBA,EAAA,SAAA,YAqBA,IAnBA,EAAA,EAAA,WACA,UAAA,SAAA,GAIA,MAHA,GAAA,YACA,EAAA,WAAA,YAAA,GACA,EAAA,EAAA,MACA,GAEA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,KAAA,EAAA,IAEA,WAAA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,EAAA,KAAA,OAEA,aAAA,WAEA,MADA,KACA,GAAA,GAAA,EAAA,KAAA,EAAA,WAIA,SAAA,gBAAA,CACA,GAAA,GAAA,SAAA,eACA,GAAA,UAAA,gBAAA,SAAA,EAAA,GAyEA,QAAA,GAAA,GACA,MAAA,QAOA,KAAA,KAAA,GANA,EACA,SAAA,cAAA,EAAA,GAEA,SAAA,cAAA,GA7EA,GAAA,GAAA,CAYA,IAXA,SAAA,IACA,EAAA,EAAA,UACA,EAAA,EAAA,SAGA,IACA,EAAA,OAAA,OAAA,YAAA,YAKA,EAAA,qBAAA,IAAA,GAEA,KAAA,IAAA,OAAA,oBASA,KAHA,GACA,GADA,EAAA,OAAA,eAAA,GAEA,KACA,KACA,EAAA,EAAA,qBAAA,IAAA,KAGA,EAAA,KAAA,GACA,EAAA,OAAA,eAAA,EAGA,KAAA,EAEA,KAAA,IAAA,OAAA,oBAQA,KAAA,GADA,GAAA,OAAA,OAAA,GACA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IACA,EAAA,OAAA,OAAA,IAQA,kBACA,mBACA,mBACA,4BACA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,EACA,KAEA,EAAA,GAAA,WAGA,EAAA,eAAA,IACA,EAAA,MAEA,EAAA,MAAA,EAAA,MAAA,cAIA,IAAA,IAAA,UAAA,EACA,KACA,EAAA,QAAA,GAYA,EAAA,UAAA,EACA,EAAA,UAAA,YAAA,EAEA,EAAA,iBAAA,IAAA,EAAA,GACA,EAAA,qBAAA,IAAA,EAAA,EAGA,GAAA,KAAA,EAAA,MACA,EAAA,EACA,OAAA,IAGA,GACA,OAAA,cAAA,OAAA,WAEA,oBAMA,GACA,OAAA,gBACA,OAAA,cAAA,OAAA,SACA,OAAA,gBACA,OAAA,kBAEA,cACA,0BACA,WACA,yBACA,uBACA,yBACA,eACA,gBACA,mBACA,cACA,gBACA,OAAA,IAEA,GACA,OAAA,cAAA,OAAA,WAEA,YACA,aACA,WACA,gBACA,yBACA,gBACA,kBACA,cACA,gBACA,cACA,iBACA,mBACA,iBACA,iBAGA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,WACA,GAAA,kBACA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,GACA,GACA,EACA,GAAA,GAAA,EAAA,MAAA,gBACA,EAAA,IAAA,KAAA,GACA,IAGA,GAAA,eACA,MAAA,GAAA,EAAA,MAAA,gBAIA,EAAA,OAAA,SAAA,EACA,SAAA,eAAA,mBAAA,KAIA,OAAA,cACA,EAAA,OAAA,aAAA,GAEA,GACA,OAAA,gBACA,OAAA,cAAA,OAAA,SACA,OAAA,kBAqBA,EAAA,EAAA,sBACA,EAAA,EAAA,kBACA,EAAA,EAAA,sBACA,EAAA,EAAA,cAEA,EAAA,OAAA,kBAAA,GAEA,GACA,OAAA,oBAEA,qBACA,iBACA,qBACA,eAGA,EAAA,kBAAA,EACA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,SAAA,GAEA,OAAA,mBCjUA,SAAA,GACA,YAeA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAdA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,OACA,EAAA,OAAA,iBACA,EAAA,OAAA,YAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,UAAA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,QAAA,iBAAA,EAAA,GAAA,IAGA,EAAA,UAAA,aAAA,WACA,MAAA,GAAA,MAAA,QAAA,sBAIA,QAAA,uBACA,QAAA,cAEA,mBAAA,sBAAA,iBAAA,QACA,SAAA,GACA,EAAA,UAAA,GAAA,WACA,GAAA,GAAA,EAAA,MAAA,OACA,OAAA,GAAA,GAAA,MAAA,EAAA,kBAIA,QAAA,KAGA,EAAA,EAAA,WACA,iBAAA,SAAA,EAAA,GAEA,MADA,KACA,EAAA,KAAA,EAAA,MAAA,EAAA,GACA,IAEA,aAAA,WAEA,MADA,KACA,GAAA,GAAA,EAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,GAAA,EAAA,MAAA,aAIA,EAAA,EAAA,EAAA,QAEA,EAAA,SAAA,OAAA,GAEA,OAAA,mBC9DA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,OAMA,EAAA,OAAA,cAAA,OAAA,UACA,EACA,EAAA,UAAA,YAEA,GAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,GAAA,EAAA,KAGA,OAAA,mBCnBA,SAAA,GACA,YAsFA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,OAAA,EACA,IAAA,EAAA,CAEA,GAAA,GAAA,SAAA,cAAA,GACA,EAAA,EAAA,WACA,QAAA,GAAA,GA3FA,GAIA,IAJA,EAAA,cAKA,EAAA,oBAKA,KAAA,kBACA,MAAA,mBACA,KAAA,kBACA,KAAA,kBACA,GAAA,gBACA,OAAA,oBACA,OAAA,oBACA,QAAA,0BACA,IAAA,sBAEA,QAAA,qBACA,KAAA,kBACA,SAAA,sBACA,IAAA,iBACA,IAAA,uBACA,IAAA,iBACA,GAAA,mBACA,MAAA,mBACA,SAAA,sBACA,KAAA,kBACA,KAAA,kBACA,MAAA,mBACA,SAAA,sBACA,GAAA,qBACA,KAAA,kBACA,GAAA,gBACA,KAAA,kBACA,OAAA,oBACA,IAAA,mBACA,MAAA,mBACA,OAAA,oBACA,MAAA,mBACA,OAAA,oBACA,GAAA,gBACA,KAAA,kBACA,IAAA,iBACA,QAAA,qBACA,KAAA,kBACA,SAAA,sBACA,KAAA,kBACA,MAAA,mBACA,OAAA,oBACA,GAAA,mBACA,SAAA,sBACA,OAAA,oBACA,OAAA,oBACA,EAAA,uBACA,MAAA,mBACA,IAAA,iBACA,SAAA,sBACA,EAAA,mBACA,OAAA,oBACA,OAAA,oBACA,OAAA,oBACA,OAAA,oBACA,KAAA,kBACA,MAAA,mBACA,MAAA,mBACA,MAAA,0BAKA,SAAA,sBACA,SAAA,sBACA,MAAA,0BACA,KAAA,kBACA,MAAA,mBACA,GAAA,sBACA,MAAA,mBACA,GAAA,mBACA,MAAA,oBAaA,QAAA,KAAA,GAAA,QAAA,GAEA,OAAA,oBAAA,EAAA,UAAA,QAAA,SAAA,GACA,OAAA,GAAA,EAAA,SAAA,MAGA,OAAA,mBClGA,WAGA,OAAA,KAAA,kBAAA,aACA,OAAA,OAAA,kBAAA,eAkBA,OAAA,eAAA,QAAA,UAAA,mBACA,OAAA,yBAAA,QAAA,UAAA,cAEA,IAAA,GAAA,QAAA,UAAA,gBACA,SAAA,UAAA,iBAAA,WACA,GAAA,GAAA,EAAA,KAAA,KAEA,OADA,gBAAA,YAAA,MACA,GAGA,QAAA,UAAA,uBAAA,QAAA,UAAA,oBCkFA,SAAA,GA0bA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAQA,OAPA,OAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,GAAA,EAAA,YAAA,SAGA,IACA,EAAA,EAAA,QAAA,EAAA,KAEA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,SAAA,cAAA,QAEA,OADA,GAAA,YAAA,EACA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EACA,UAAA,KAAA,YAAA,EACA,IAAA,KACA,IAAA,EAAA,MAIA,IACA,EAAA,EAAA,MAAA,SACA,MAAA,QAIA,SAAA,KAAA,kBAAA,EAGA,OADA,GAAA,WAAA,YAAA,GACA,EAMA,QAAA,KACA,EAAA,aAAA,EACA,SAAA,KAAA,YAAA,EACA,IAAA,GAAA,EAAA,gBACA,EAAA,EAAA,cAAA,OACA,GAAA,KAAA,SAAA,QACA,EAAA,KAAA,YAAA,GAGA,QAAA,GAAA,GACA,EAAA,aACA,IAEA,SAAA,KAAA,YAAA,GACA,EAAA,EAAA,iBACA,SAAA,KAAA,YAAA,GAMA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CAGA,GAAA,EACA,IAAA,EAAA,MAAA,YAAA,EAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,SAAA,GACA,EAAA,KAAA,YAAA,EAAA,MACA,EAAA,EAAA,MAAA,SACA,EAAA,SAGA,GAAA,EAAA,GACA,EAAA,IAWA,QAAA,GAAA,GACA,GACA,IAAA,YAAA,SAAA,eAAA,IAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EACA,GAAA,aAAA,EAAA,IACA,EAAA,aAAA,EAAA,IACA,SAAA,KAAA,YAAA,GAQA,QAAA,KAMA,MALA,KACA,EAAA,SAAA,cAAA,SACA,EAAA,aAAA,EAAA,IACA,EAAA,IAAA,GAEA,EAviBA,GAAA,IACA,eAAA,EACA,YAMA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,GACA,EAAA,KAAA,gBAAA,GACA,EAAA,KAAA,kBAAA,EAAA,GAGA,EAAA,EAAA,GAAA,EACA,GAAA,KAAA,aAAA,EAAA,GAEA,IACA,EAAA,aAAA,GAGA,KAAA,iBAAA,EAAA,IAMA,UAAA,SAAA,EAAA,GACA,MAAA,MAAA,YAAA,EAAA,YAAA,IAMA,YAAA,SAAA,EAAA,GAEA,MADA,GAAA,KAAA,iBAAA,GACA,KAAA,aAAA,EAAA,IAEA,kBAAA,SAAA,EAAA,GACA,MAAA,GACA,EAAA,OAAA,EAAA,IAAA,EAEA,IAEA,gBAAA,SAAA,GACA,MAAA,IAAA,EAAA,QAAA,KAAA,GAEA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAAA,EAAA,EAQA,OAPA,MAAA,oBAAA,EAAA,WAAA,KAAA,kBAEA,KAAA,aAAA,EAAA,EAAA,YAEA,KAAA,eACA,KAAA,oBAAA,EAAA,GAEA,EAAA,aAEA,aAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,WAAA,YAAA,IAGA,aAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,SAAA,IACA,KAAA,EACA,KAAA,EACA,YAAA,GAEA,EAAA,KAAA,WAAA,EACA,GAAA,WAAA,EACA,EAAA,YAAA,EAAA,UACA,IAAA,GAAA,KAAA,SAAA,EAAA,YAIA,OAHA,KACA,EAAA,YAAA,EAAA,YAAA,OAAA,EAAA,cAEA,GAEA,WAAA,SAAA,GACA,IAAA,EACA,QAEA,IAAA,GAAA,EAAA,iBAAA,QACA,OAAA,OAAA,UAAA,OAAA,KAAA,EAAA,SAAA,GACA,OAAA,EAAA,aAAA,MAGA,oBAAA,SAAA,EAAA,GACA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,iBAAA,KACA,SAAA,GACA,EAAA,aAAA,EAAA,MAGA,MAAA,UAAA,QAAA,KAAA,EAAA,iBAAA,YACA,SAAA,GACA,KAAA,oBAAA,EAAA,QAAA,IAEA,QAGA,iBAAA,SAAA,GAEA,MADA,GAAA,KAAA,kCAAA,GACA,KAAA,6BAAA,IAgBA,kCAAA,SAAA,GAMA,MAJA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GAEA,MAAA,GAAA,MAAA,EAAA,IAAA,MAEA,EAAA,QAAA,EAAA,SAAA,EAAA,GACA,MAAA,GAAA,QAkBA,6BAAA,SAAA,GAMA,MAJA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GAEA,MAAA,GAAA,MAAA,EAAA,MAEA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,EAAA,IAAA,QAAA,EAAA,GACA,OAAA,GAAA,KAWA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,gCAAA,EAKA,IAJA,EAAA,KAAA,4BAAA,GACA,EAAA,KAAA,iBAAA,GACA,EAAA,KAAA,wBAAA,GACA,EAAA,KAAA,mBAAA,GACA,EAAA,CACA,GAAA,GAAA,EAAA,IACA,GAAA,EAAA,SAAA,GACA,EAAA,EAAA,WAAA,EAAA,KAKA,MADA,GAAA,EAAA,KAAA,EACA,EAAA,QAgBA,gCAAA,SAAA,GAGA,IADA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,KAAA,IACA,GAAA,EAAA,GAAA,MAAA,EAAA,IAAA,MAEA,MAAA,EAAA,EAAA,KAAA,IACA,GAAA,EAAA,GAAA,QAAA,EAAA,GAAA,IAAA,QAAA,EAAA,GAAA,EAAA,IAAA,MAEA,OAAA,IASA,iBAAA,SAAA,GACA,MAAA,MAAA,iBAAA,EAAA,eACA,KAAA,wBAiBA,wBAAA,SAAA,GACA,MAAA,MAAA,iBAAA,EAAA,sBACA,KAAA,+BAEA,iBAAA,SAAA,EAAA,EAAA,GAEA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GADA,EAAA,yBACA,EAAA,CAEA,IAAA,GAAA,GADA,EAAA,EAAA,MAAA,KAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,EAAA,OACA,EAAA,KAAA,EAAA,EAAA,EAAA,GAEA,OAAA,GAAA,KAAA,KAEA,MAAA,GAAA,KAIA,6BAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,MAAA,GACA,KAAA,sBAAA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,KAAA,EAAA,IAAA,EAAA,GAGA,sBAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,EAAA,QAAA,EAAA,IAAA,GAKA,mBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,cAAA,OAAA,IACA,EAAA,EAAA,QAAA,cAAA,GAAA,IAEA,OAAA,IAGA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAgBA,OAfA,IACA,MAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,SACA,GAAA,KAAA,cAAA,EAAA,aAAA,EACA,KAAA,eAAA,QACA,GAAA,KAAA,mBAAA,GAAA,WACA,EAAA,OAAA,QAAA,YACA,GAAA,UAAA,EAAA,MAAA,UAAA,OACA,GAAA,KAAA,WAAA,EAAA,SAAA,GACA,GAAA,WACA,EAAA,UACA,GAAA,EAAA,QAAA,SAEA,MAEA,GAEA,cAAA,SAAA,EAAA,EAAA,GACA,GAAA,MAAA,EAAA,EAAA,MAAA,IAUA,OATA,GAAA,QAAA,SAAA,GACA,EAAA,EAAA,OACA,KAAA,qBAAA,EAAA,KACA,EAAA,IAAA,EAAA,MAAA,0BACA,KAAA,yBAAA,EAAA,GACA,KAAA,mBAAA,EAAA,IAEA,EAAA,KAAA,IACA,MACA,EAAA,KAAA,OAEA,qBAAA,SAAA,EAAA,GACA,GAAA,MAAA,QAAA,GACA,OAAA,CAEA,IAAA,GAAA,KAAA,iBAAA,EACA,QAAA,EAAA,MAAA,IAEA,iBAAA,SAAA,GAEA,MADA,GAAA,EAAA,QAAA,MAAA,OAAA,QAAA,MAAA,OACA,GAAA,QAAA,KAAA,EAAA,IAAA,iBAAA,MAEA,mBAAA,SAAA,EAAA,GACA,MAAA,OAAA,QAAA,GACA,KAAA,uBAAA,EAAA,GACA,KAAA,yBAAA,EAAA,IAGA,uBAAA,SAAA,EAAA,GAEA,IAAA,GAAA,GADA,KACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,KAAA,KAAA,yBAAA,EAAA,GAEA,OAAA,GAAA,KAAA,OAGA,yBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,iBACA,EAAA,EAAA,QAAA,yBAAA,GACA,EAAA,QAAA,eAAA,EAAA,MAEA,EAAA,IAAA,GAKA,yBAAA,SAAA,EAAA,GACA,EAAA,EAAA,QAAA,mBAAA,KACA,IAAA,IAAA,IAAA,IAAA,IAAA,KACA,EAAA,EACA,EAAA,IAAA,EAAA,GAYA,OAXA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,GAAA,EAAA,IAAA,SAAA,GAEA,GAAA,GAAA,EAAA,OAAA,QAAA,eAAA,GAIA,OAHA,IAAA,EAAA,QAAA,GAAA,GAAA,EAAA,QAAA,GAAA,IACA,EAAA,EAAA,QAAA,kBAAA,KAAA,EAAA,SAEA,IACA,KAAA,KAEA,GAEA,4BAAA,SAAA,GACA,MAAA,GAAA,QAAA,mBAAA,GAAA,QACA,YAAA,IAEA,mBAAA,SAAA,GACA,GAAA,GAAA,EAAA,MAAA,OAIA,GAAA,MAAA,UAAA,EAAA,MAAA,QAAA,MAAA,gBACA,EAAA,EAAA,QAAA,kBAAA,aACA,EAAA,MAAA,QAAA,MAQA,IAAA,GAAA,EAAA,KACA,KAAA,GAAA,KAAA,GACA,YAAA,EAAA,KACA,GAAA,EAAA,cAGA,OAAA,IAEA,oBAAA,SAAA,EAAA,GACA,GAAA,IACA,YAAA,SACA,GAAA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,EAAA,YAAA,EAAA,KAAA,KAAA,EAAA,cACA,QAGA,iBAAA,SAAA,EAAA,GACA,EAAA,MAAA,WACA,EAAA,EAAA,GAEA,EAAA,KAMA,EAAA,oCAEA,EAAA,4DACA,EAAA,uEAEA,EAAA,sDACA,EAAA,+DAEA,EAAA,+DACA,EAAA,wEAIA,EAAA,iBAEA,EAAA,oBACA,EAAA,iDAGA,gBAAA,GAAA,QAAA,IAAA,EAAA,EAAA,OACA,sBAAA,GAAA,QAAA,IAAA,EAAA,EAAA,OACA,iBAAA,6BACA,YAAA,YACA,mBAAA,oBAEA,yBAAA,EAAA,iBACA,eAAA,GAAA,QAAA,EAAA,OACA,sBAAA,GAAA,QAAA,EAAA,OACA,eACA,QACA,MACA,cACA,mBACA,YACA,YAyCA,IAAA,GAAA,SAAA,cAAA,SACA,GAAA,MAAA,QAAA,MAsBA,IA2CA,GA3CA,EAAA,UAAA,UAAA,MAAA,UAuCA,EAAA,iBACA,EAAA,qBACA,EAAA,SAaA,IAAA,OAAA,kBAAA,CACA,EAAA,wCACA,IAAA,GAAA,KAAA,UACA,EAAA,EAAA,cAAA,OACA,GAAA,aAAA,IAAA,EAAA,WAAA,IAIA,SAAA,iBAAA,mBAAA,WACA,GAAA,GAAA,EAAA,WAEA,IAAA,OAAA,cAAA,YAAA,UAAA,CACA,GAAA,GAAA,wBACA,EAAA,IACA,EAAA,SAAA,EAAA,GACA,aAAA,SAAA,0BAAA,IAAA,EACA,YAAA,SAAA,yBAAA,IAAA,EAEA,YAAA,OAAA,mBACA,YAAA,OAAA,kBACA,EACA,GACA,KAAA,IAEA,IAAA,GAAA,YAAA,OAAA,YAEA,aAAA,OAAA,aAAA,SAAA,GACA,IAAA,EAAA,GAAA,CAGA,GAAA,GAAA,EAAA,iBAAA,CACA,KAAA,EAAA,aAAA,GAEA,WADA,GAAA,KAAA,KAAA,EAGA,GAAA,YACA,EAAA,EAAA,cAAA,cAAA,SACA,EAAA,YAAA,EAAA,eACA,EAAA,WAAA,EAAA,OAEA,EAAA,aAAA,GAEA,EAAA,YAAA,EAAA,UAAA,GACA,EAAA,gBAAA,EAAA,IACA,EAAA,aAAA,EAAA,IACA,EAAA,IAAA,EAEA,EAAA,aAAA,IAEA,EAAA,aAAA,EACA,EAAA,aAAA,EAAA,GAEA,EAAA,YAAA,IAGA,EAAA,gBAAA,EACA,KAAA,oBAAA,IAGA,IAAA,GAAA,YAAA,OAAA,WACA,aAAA,OAAA,YAAA,SAAA,GACA,MAAA,SAAA,EAAA,WAAA,eAAA,EAAA,KACA,EAAA,aAAA,GACA,EAAA,WAEA,EAAA,KAAA,KAAA,OASA,EAAA,UAAA,GAEA,OAAA,YC3uBA,WAGA,OAAA,KAAA,OAAA,OAAA,SAAA,GACA,MAAA,IAGA,iBAAA,mBAAA,WACA,GAAA,eAAA,aAAA,EAAA,CACA,GAAA,GAAA,QAAA,UAAA,gBACA,SAAA,UAAA,iBAAA,WACA,GAAA,GAAA,EAAA,KAAA,KAEA,OADA,gBAAA,YAAA,MACA,MAKA,SAAA,gBAAA,SAAA,GAOA,GALA,OAAA,qBAAA,oBAAA,WACA,oBAAA,UAAA,IAIA,EAAA,UAAA,EAAA,SAAA,CAEA,IADA,GAAA,GAAA,SAAA,yBACA,EAAA,YACA,EAAA,YAAA,EAAA,WAEA,GAAA,SAAA,EAEA,MAAA,GAAA,SAAA,EAAA,WAGA,OAAA,UCzCA,SAAA,GACA,YA6BA,SAAA,GAAA,GACA,MAAA,UAAA,EAAA,GAGA,QAAA,KACA,EAAA,KAAA,MACA,KAAA,YAAA,EAGA,QAAA,GAAA,GAKA,MAJA,IAAA,GACA,EAAA,KAAA,MAGA,EAAA,cAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,WAAA,EACA,OAAA,GAAA,IACA,IAAA,GAEA,KAAA,GAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QAAA,GAEA,EAEA,mBAAA,GAGA,QAAA,GAAA,GAIA,GAAA,GAAA,EAAA,WAAA,EACA,OAAA,GAAA,IACA,IAAA,GAEA,KAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QAAA,GAEA,EAEA,mBAAA,GAOA,QAAA,GAAA,EAAA,EAAA,GACA,QAAA,GAAA,GACA,EAAA,KAAA,GAGA,GAAA,GAAA,GAAA,eACA,EAAA,EACA,EAAA,GACA,GAAA,EACA,GAAA,EACA,IAEA,GAAA,MAAA,EAAA,EAAA,IAAA,GAAA,GAAA,KAAA,KAAA,YAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,GACA,IAAA,eACA,IAAA,IAAA,EAAA,KAAA,GAGA,CAAA,GAAA,EAIA,CACA,EAAA,kBACA,MAAA,GALA,EAAA,GACA,EAAA,WACA,UALA,GAAA,EAAA,cACA,EAAA,QASA,MAEA,KAAA,SACA,GAAA,GAAA,EAAA,KAAA,GACA,GAAA,EAAA,kBACA,CAAA,GAAA,KAAA,EAkBA,CAAA,GAAA,EAKA,CAAA,GAAA,GAAA,EACA,KAAA,EAEA,GAAA,qCAAA,EACA,MAAA,GARA,EAAA,GACA,EAAA,EACA,EAAA,WACA,UAnBA,GAFA,KAAA,QAAA,EACA,EAAA,GACA,EACA,KAAA,EAEA,GAAA,KAAA,WACA,KAAA,aAAA,GAGA,EADA,QAAA,KAAA,QACA,WACA,KAAA,aAAA,GAAA,EAAA,SAAA,KAAA,QACA,wBACA,KAAA,YACA,wBAEA,cAaA,KAEA,KAAA,cACA,KAAA,GACA,MAAA,IACA,EAAA,SACA,KAAA,GACA,KAAA,UAAA,IACA,EAAA,YAGA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,aAAA,EAAA,GAGA,MAEA,KAAA,YACA,GAAA,GAAA,EAAA,EAAA,SAGA,CACA,EAAA,UACA,UAJA,EAAA,mBACA,EAAA,KAAA,KAKA,MAEA,KAAA,wBACA,GAAA,KAAA,GAAA,KAAA,EAAA,EAAA,GAEA,CACA,EAAA,oBAAA,GACA,EAAA,UACA,UAJA,EAAA,0BAMA,MAEA,KAAA,WAIA,GAHA,KAAA,aAAA,EACA,QAAA,KAAA,UACA,KAAA,QAAA,EAAA,SACA,GAAA,EAAA,CACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,EAAA,MACA,MAAA,GACA,GAAA,KAAA,GAAA,MAAA,EACA,MAAA,GACA,EAAA,gCACA,EAAA,qBACA,IAAA,KAAA,EACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,IACA,EAAA,YACA,CAAA,GAAA,KAAA,EAOA,CACA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,IAEA,QAAA,KAAA,UAAA,EAAA,KAAA,IACA,KAAA,GAAA,KAAA,GACA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,KACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,MAAA,OAEA,EAAA,eACA,UAnBA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,EAAA,OACA,KAAA,UAAA,IACA,EAAA,WAgBA,KAEA,KAAA,iBACA,GAAA,KAAA,GAAA,MAAA,EASA,CACA,QAAA,KAAA,UACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,OAEA,EAAA,eACA,UAdA,MAAA,GACA,EAAA,gCAGA,EADA,QAAA,KAAA,QACA,YAEA,0BAUA,MAEA,KAAA,wBACA,GAAA,KAAA,EAEA,CACA,EAAA,sBAAA,GACA,EAAA,0BACA,UAJA,EAAA,wBAMA,MAEA,KAAA,yBAEA,GADA,EAAA,2BACA,KAAA,EAAA,CACA,EAAA,sBAAA,EACA,UAEA,KAEA,KAAA,2BACA,GAAA,KAAA,GAAA,MAAA,EAAA,CACA,EAAA,WACA,UAEA,EAAA,4BAAA,EAEA,MAEA,KAAA,YACA,GAAA,KAAA,EAAA,CACA,IACA,EAAA,mBACA,GAAA,OAEA,GAAA,CACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,KAAA,GAAA,MAAA,GAAA,MAAA,EAKA,GAAA,KAAA,GAAA,OAAA,KAAA,UAAA,CAIA,GAAA,GAAA,EAAA,EACA,QAAA,KAAA,UAAA,KAAA,WAAA,EAAA,KAAA,WAAA,MAJA,MAAA,UAAA,OALA,GAAA,oCAWA,EAAA,OACA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CACA,GAAA,EAAA,OACA,EAAA,GACA,EAAA,MACA,UAEA,GAAA,EAEA,KAEA,KAAA,YACA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CACA,GAAA,EAAA,SAAA,EAAA,KAAA,EAAA,KAAA,KAAA,EAAA,IAAA,KAAA,EAAA,GAEA,GAAA,EAAA,OACA,EAAA,uBAEA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,uBANA,EAAA,eAQA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,EACA,EAAA,oCAEA,GAAA,CAEA,MAEA,KAAA,OACA,IAAA,WACA,GAAA,KAAA,GAAA,EAQA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CAIA,GAHA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,sBACA,EACA,KAAA,EAEA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,GACA,KAAA,EACA,GAAA,EACA,KAAA,IACA,GAAA,GAEA,GAAA,GAEA,EAAA,wCAAA,OAnBA,IAHA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,OACA,YAAA,EACA,KAAA,EAoBA,MAEA,KAAA,OACA,GAAA,QAAA,KAAA,GACA,GAAA,MACA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,GAAA,EAAA,CACA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,SAAA,EAAA,GACA,IAAA,EAAA,KAAA,WACA,KAAA,MAAA,EAAA,IAEA,EAAA,GAEA,GAAA,EACA,KAAA,EAEA,GAAA,qBACA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,EACA,EAAA,+BAAA,GAEA,EAAA,KAAA,MAEA,KAEA,KAAA,sBAIA,GAHA,MAAA,GACA,EAAA,6BACA,EAAA,gBACA,KAAA,GAAA,MAAA,EACA,QAEA,MAEA,KAAA,gBACA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,IAAA,GAAA,KAAA,GAAA,KAAA,GA6BA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,GAAA,EAAA,QA9BA,CACA,MAAA,GACA,EAAA,mCAEA,IAAA,IACA,EAAA,EAAA,EAAA,kBACA,EAAA,GAEA,MAAA,GACA,KAAA,MAAA,MACA,KAAA,GAAA,MAAA,GACA,KAAA,MAAA,KAAA,KAEA,KAAA,GAAA,KAAA,GAAA,MAAA,EACA,KAAA,MAAA,KAAA,IACA,KAAA,IACA,QAAA,KAAA,SAAA,GAAA,KAAA,MAAA,QAAA,GAAA,EAAA,QAAA,EAAA,KAAA,EAAA,KAAA,KAAA,EAAA,KACA,EAAA,EAAA,GAAA,KAEA,KAAA,MAAA,KAAA,IAEA,EAAA,GACA,KAAA,GACA,KAAA,OAAA,IACA,EAAA,SACA,KAAA,IACA,KAAA,UAAA,IACA,EAAA,YAKA,KAEA,KAAA,QACA,GAAA,KAAA,EAGA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,QAAA,EAAA,KAHA,KAAA,UAAA,IACA,EAAA,WAIA;KAEA,KAAA,WACA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,WAAA,GAKA,KAIA,QAAA,KACA,KAAA,QAAA,GACA,KAAA,YAAA,GACA,KAAA,UAAA,GACA,KAAA,UAAA,KACA,KAAA,MAAA,GACA,KAAA,MAAA,GACA,KAAA,SACA,KAAA,OAAA,GACA,KAAA,UAAA,GACA,KAAA,YAAA,EACA,KAAA,aAAA,EAKA,QAAA,GAAA,EAAA,GACA,SAAA,GAAA,YAAA,KACA,EAAA,GAAA,GAAA,OAAA,KAEA,KAAA,KAAA,EACA,EAAA,KAAA,KAEA,IAAA,GAAA,EAAA,QAAA,+BAAA,GAGA,GAAA,KAAA,KAAA,EAAA,KAAA,GAzcA,GAAA,IAAA,CACA,KAAA,EAAA,UACA,IACA,GAAA,GAAA,GAAA,KAAA,IAAA,WACA,GAAA,eAAA,EAAA,KACA,MAAA,IAGA,IAAA,EAAA,CAGA,GAAA,GAAA,OAAA,OAAA,KACA,GAAA,IAAA,GACA,EAAA,KAAA,EACA,EAAA,OAAA,GACA,EAAA,KAAA,GACA,EAAA,MAAA,IACA,EAAA,GAAA,GACA,EAAA,IAAA,GAEA,IAAA,GAAA,OAAA,OAAA,KACA,GAAA,OAAA,IACA,EAAA,QAAA,KACA,EAAA,QAAA,KACA,EAAA,UAAA,IA8CA,IAAA,GAAA,OACA,EAAA,WACA,EAAA,mBAoYA,GAAA,WACA,GAAA,QACA,GAAA,KAAA,WACA,MAAA,MAAA,IAEA,IAAA,GAAA,EAMA,QALA,IAAA,KAAA,WAAA,MAAA,KAAA,aACA,EAAA,KAAA,WACA,MAAA,KAAA,UAAA,IAAA,KAAA,UAAA,IAAA,KAGA,KAAA,UACA,KAAA,YAAA,KAAA,EAAA,KAAA,KAAA,IACA,KAAA,SAAA,KAAA,OAAA,KAAA,WAEA,GAAA,MAAA,GACA,EAAA,KAAA,MACA,EAAA,KAAA,KAAA,IAGA,GAAA,YACA,MAAA,MAAA,QAAA,KAEA,GAAA,UAAA,GACA,KAAA,YAEA,EAAA,KAAA,KAAA,EAAA,IAAA,iBAGA,GAAA,QACA,MAAA,MAAA,WAAA,GAAA,KAAA,MACA,KAAA,MAAA,IAAA,KAAA,MAAA,KAAA,OAEA,GAAA,MAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,MAAA,OAEA,GAAA,UAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,aAGA,GAAA,QACA,MAAA,MAAA,OAEA,GAAA,MAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,MAAA,WAAA,GAAA,KAAA,YACA,IAAA,KAAA,MAAA,KAAA,KAAA,KAAA,aAEA,GAAA,UAAA,IACA,KAAA,YAAA,KAAA,cAEA,KAAA,SACA,EAAA,KAAA,KAAA,EAAA,yBAGA,GAAA,UACA,MAAA,MAAA,aAAA,KAAA,QAAA,KAAA,KAAA,OACA,GAAA,KAAA,QAEA,GAAA,QAAA,IACA,KAAA,YAAA,KAAA,cAEA,KAAA,OAAA,IACA,KAAA,EAAA,KACA,EAAA,EAAA,MAAA,IACA,EAAA,KAAA,KAAA,EAAA,WAGA,GAAA,QACA,MAAA,MAAA,aAAA,KAAA,WAAA,KAAA,KAAA,UACA,GAAA,KAAA,WAEA,GAAA,MAAA,GACA,KAAA,aAEA,KAAA,UAAA,IACA,KAAA,EAAA,KACA,EAAA,EAAA,MAAA,IACA,EAAA,KAAA,KAAA,EAAA,eAIA,EAAA,IAAA,IAEA,QC3iBA,SAAA,GAmBA,QAAA,GAAA,GAEA,IAAA,GADA,GAAA,MACA,EAAA,EAAA,EAAA,UAAA,OAAA,IAAA,CACA,GAAA,GAAA,UAAA,EACA,KACA,IAAA,GAAA,KAAA,GACA,EAAA,EAAA,EAAA,GAEA,MAAA,KAGA,MAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,QAAA,eAAA,EAAA,EAAA,GAKA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CACA,GAAA,GAAA,OAAA,yBAAA,EAAA,EACA,OAAA,IAAA,EAAA,OAAA,eAAA,GAAA,IAxCA,SAAA,UAAA,OACA,SAAA,UAAA,KAAA,SAAA,GACA,GAAA,GAAA,KACA,EAAA,MAAA,UAAA,MAAA,KAAA,UAAA,EACA,OAAA,YACA,GAAA,GAAA,EAAA,OAEA,OADA,GAAA,KAAA,MAAA,EAAA,WACA,EAAA,MAAA,EAAA,MAuCA,EAAA,MAAA,GAEA,OAAA,UCpDA,SAAA,GAEA,YAiFA,SAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,gBAAA,GACA,SAAA,cAAA,GAAA,EAAA,WAAA,EAEA,IADA,EAAA,UAAA,EACA,EACA,IAAA,GAAA,KAAA,GACA,EAAA,aAAA,EAAA,EAAA,GAGA,OAAA,GAnFA,GAAA,GAAA,aAAA,UAAA,IACA,EAAA,aAAA,UAAA,MACA,cAAA,UAAA,IAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,UAAA,OAAA,IACA,EAAA,KAAA,KAAA,UAAA,KAGA,aAAA,UAAA,OAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,UAAA,OAAA,IACA,EAAA,KAAA,KAAA,UAAA,KAGA,aAAA,UAAA,OAAA,SAAA,EAAA,GACA,GAAA,UAAA,SACA,GAAA,KAAA,SAAA,IAEA,EAAA,KAAA,IAAA,GAAA,KAAA,OAAA,IAEA,aAAA,UAAA,OAAA,SAAA,EAAA,GACA,GAAA,KAAA,OAAA,GACA,GAAA,KAAA,IAAA,GAKA,IAAA,GAAA,WACA,MAAA,OAAA,UAAA,MAAA,KAAA,OAGA,EAAA,OAAA,cAAA,OAAA,mBAQA,IANA,SAAA,UAAA,MAAA,EACA,EAAA,UAAA,MAAA,EACA,eAAA,UAAA,MAAA,GAIA,OAAA,YAAA,CACA,GAAA,GAAA,KAAA,KAEA,QAAA,aAAA,IAAA,WAAA,MAAA,MAAA,MAAA,IAKA,OAAA,wBACA,OAAA,sBAAA,WACA,GAAA,GAAA,OAAA,6BACA,OAAA,wBAEA,OAAA,GACA,SAAA,GACA,MAAA,GAAA,WACA,EAAA,YAAA,UAGA,SAAA,GACA,MAAA,QAAA,WAAA,EAAA,IAAA,SAKA,OAAA,uBACA,OAAA,qBAAA,WACA,MAAA,QAAA,4BACA,OAAA,yBACA,SAAA,GACA,aAAA,OAwBA,IAAA,MAEA,EAAA,WACA,EAAA,KAAA,WAEA,QAAA,QAAA,EAGA,EAAA,oBAAA,WAIA,MAHA,GAAA,oBAAA,WACA,KAAA,0CAEA,GAMA,OAAA,iBAAA,mBAAA,WACA,OAAA,UAAA,IACA,OAAA,QAAA,WACA,QAAA,MAAA,sIAQA,EAAA,UAAA,GAEA,OAAA,UClIA,SAAA,GACA,EAAA,gBAAA,EAAA,iBAAA,SAAA,GACA,MAAA,GAAA,UAEA,OAAA,UCLA,SAAA,GAEA,EAAA,IAAA,OAAA,aAEA,IAAA,EAEA,QAAA,SAAA,SAAA,EAAA,GACA,IACA,EAAA,OAAA,KAAA,GAAA,sBAAA,MAAA,GACA,EAAA,SAAA,MAAA,GAEA,EAAA,KACA,UAAA,YAGA,EAAA,GAAA,KAAA,SAAA,MAAA,GAGA,IAAA,IACA,kBACA,SACA,WACA,yCACA,cACA,eACA,UACA,cACA,8CACA,8BACA,UACA,cACA,yBACA,UACA,aACA,sBACA,uBACA,6BACA,UACA,aACA,kCACA,sCACA,6BACA,+BACA,8BACA,UACA,eACA,YACA,WACA,uBACA,YACA,4BACA,YACA,WACA,KAAA,MAEA,KAEA,EAAA,WAEA,GAAA,GAAA,EAAA,SAEA,EAAA,EAAA,cAAA,UAEA,GAAA,YAAA,EAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,CACA,GAAA,GAAA,EAAA,cAAA,IACA,GAAA,KAAA,IACA,EAAA,YAAA,EAAA,UACA,EAAA,IAAA,EACA,EAAA,QAAA,SAAA,GAEA,IADA,GAAA,GACA,EAAA,OAAA,KAAA,KACA,EAAA,EAAA,KAEA,GAAA,EAAA,QAAA,EAAA,GACA,EAAA,kBAEA,EAAA,YAAA,EAAA,cAAA,OAAA,YAAA,KAIA,EAAA,SAAA,EAAA,GAEA,GAAA,GAAA,EAAA,QAEA,KAEA,IAAA,GAAA,GAAA,CACA,GAAA,KAAA,GAEA,IAEA,EAAA,KAAA,cAAA,SAAA,UACA,QAAA,EAAA,EAAA,EAAA,YAAA,UAGA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,SAEA,GAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,SAAA,GACA,EAAA,SAAA,GACA,MAAA,GAAA,EAAA,WAGA,EAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,GACA,MAAA,EAEA,IAAA,GAAA,GAAA,EACA,IAAA,EAAA,WAAA,IAAA,EAAA,SAAA,CACA,GAAA,GAAA,EAAA,WAAA,cAEA,EAAA,EAAA,EAAA,EAOA,YAAA,IACA,EAAA,EAAA,uBAEA,GAAA,OACA,IAAA,GAAA,EAAA,cACA,GAAA,EAAA,SAAA,GACA,GAAA,EAAA,EAAA,EAAA,WAAA,KAEA,GAAA,GAEA,GAAA,GAAA,KACA,GAAA,aAAA,EAAA,aACA,GAAA,aAEA,CACA,GAAA,GAAA,EAAA,YAAA,MACA,GAAA,EAAA,EAAA,IAAA,EAAA,SAAA,GAEA,MAAA,IAWA,KAEA,EAAA,SAAA,GACA,GAAA,GAAA,YACA,EAAA,EAAA,WAAA,aAcA,OAbA,GAAA,kBAAA,EAAA,YACA,GAAA,iBAAA,EAAA,OACA,wCAAA,EAAA,YACA,EAAA,KAAA,IAEA,GAAA,GAAA,cAEA,EAAA,YACA,EAAA,EAAA,WAAA,SAAA,GACA,GAAA,IAAA,EAAA,MAAA,EAAA,MAAA,KAAA,EAAA,MAAA,IAAA,MAGA,GAAA,aAMA,WAAA,WACA,GAAA,GAAA,OAAA,KAAA,WAAA,IAAA,OAEA,EAAA,EAAA,EACA,GACA,EAAA,EAAA,kBAAA,EAAA,WAAA,IAEA,QAAA,IAAA,sBACA,QAAA,IAAA,QAMA,EAAA,OAAA,GAEA,OAAA,WC3LA,WASA,GAAA,GAAA,SAAA,cAAA,QACA,GAAA,YAAA,kHAQA,IAAA,GAAA,SAAA,cAAA,OACA,GAAA,aAAA,EAAA,EAAA,aAEA,UCrBA,SAAA,GAEA,QAAA,GAAA,EAAA,GAKA,MAJA,GAAA,MACA,EAAA,MACA,GAAA,IAEA,EAAA,MAAA,KAAA,EAAA,IAAA,IAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,EACA,QAAA,UAAA,QACA,IAAA,GACA,MACA,KAAA,GACA,EAAA,IACA,MACA,KAAA,GACA,EAAA,EAAA,MAAA,KACA,MACA,SACA,EAAA,EAAA,EAAA,GAGA,EAAA,GAAA,EAGA,QAAA,GAAA,GACA,MAAA,GAAA,GAKA,QAAA,GAAA,EAAA,GACA,YAAA,iBAAA,WACA,EAAA,EAAA,KAJA,GAAA,KAUA,GAAA,QAAA,EACA,EAAA,OAAA,EACA,EAAA,MAAA,GAEA,QC9CA,SAAA,GAMA,QAAA,GAAA,GACA,EAAA,YAAA,IACA,EAAA,KAAA,GAGA,QAAA,KACA,KAAA,EAAA,QACA,EAAA,UAXA,GAAA,GAAA,EACA,KACA,EAAA,SAAA,eAAA,GAaA,KAAA,OAAA,kBAAA,oBAAA,GACA,QAAA,GAAA,eAAA,IAKA,EAAA,eAAA,GAEA,UCzBA,SAAA,GAwEA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,QAAA,GAEA,OADA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,IAAA,EAAA,IAAA,IAIA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,MAAA,EAAA,GACA,MAAA,EAEA,IAAA,GAAA,GAAA,KAAA,EAAA,EACA,OAAA,GAAA,EAAA,KAAA,EAAA,EAAA,MAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,KAAA,SAAA,SACA,EAAA,GAAA,KAAA,EAAA,EACA,OAAA,GAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MACA,EAAA,WAAA,EAAA,SACA,EAAA,EAAA,GAEA,EAKA,QAAA,GAAA,EAAA,GAKA,IAJA,GAAA,GAAA,EAAA,SACA,EAAA,EAAA,SACA,EAAA,EAAA,MAAA,KACA,EAAA,EAAA,MAAA,KACA,EAAA,QAAA,EAAA,KAAA,EAAA,IACA,EAAA,QACA,EAAA,OAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IACA,EAAA,QAAA,KAEA,OAAA,GAAA,KAAA,KAAA,EAAA,OAAA,EAAA,KA/GA,GAAA,IACA,WAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,KAAA,kBAAA,EAAA,GACA,KAAA,cAAA,EAAA,EAEA,IAAA,GAAA,EAAA,iBAAA,WACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,SACA,KAAA,WAAA,EAAA,QAAA,IAKA,gBAAA,SAAA,GACA,KAAA,WAAA,EAAA,QAAA,EAAA,cAAA,UAEA,cAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBAAA,QACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,aAAA,EAAA,IAIA,aAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,EAAA,YAAA,KAAA,eAAA,EAAA,YAAA,IAEA,eAAA,SAAA,EAAA,EAAA,GAEA,MADA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAEA,kBAAA,SAAA,EAAA,GACA,EAAA,eAAA,EAAA,iBACA,KAAA,yBAAA,EAAA,EAGA,IAAA,GAAA,GAAA,EAAA,iBAAA,EACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,yBAAA,EAAA,IAIA,yBAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,EAAA,QAAA,SAAA,GACA,GAEA,GAFA,EAAA,EAAA,WAAA,GACA,EAAA,GAAA,EAAA,KAEA,IAAA,EAAA,OAAA,GAAA,IAEA,EADA,UAAA,EACA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,GAEA,EAAA,MAAA,OAMA,EAAA,sBACA,EAAA,qCACA,GAAA,OAAA,MAAA,SAAA,SACA,EAAA,IAAA,EAAA,KAAA,OAAA,IACA,EAAA,QA+CA,GAAA,YAAA,GAEA,UC1HA,SAAA,GAoCA,QAAA,GAAA,GACA,EAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,IAIA,QAAA,GAAA,GACA,MAAA,QAAA,mBACA,OAAA,kBAAA,aAAA,IACA,EAGA,QAAA,KAGA,GAAA,CAEA,IAAA,GAAA,CACA,MAEA,EAAA,KAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,EAAA,MAGA,IAAA,IAAA,CACA,GAAA,QAAA,SAAA,GAGA,GAAA,GAAA,EAAA,aAEA,GAAA,GAGA,EAAA,SACA,EAAA,UAAA,EAAA,GACA,GAAA,KAKA,GACA,IAGA,QAAA,GAAA,GACA,EAAA,OAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,IAEA,EAAA,QAAA,SAAA,GACA,EAAA,WAAA,GACA,EAAA,+BAiBA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,IAAA,EAEA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAGA,IAAA,IAAA,GAAA,EAAA,QAAA,CAGA,GAAA,GAAA,EAAA,EACA,IACA,EAAA,QAAA,MAaA,QAAA,GAAA,GACA,KAAA,UAAA,EACA,KAAA,UACA,KAAA,YACA,KAAA,OAAA,EAoFA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,cACA,KAAA,gBACA,KAAA,gBAAA,KACA,KAAA,YAAA,KACA,KAAA,cAAA,KACA,KAAA,mBAAA,KACA,KAAA,SAAA,KAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAAA,KAAA,EAAA,OAQA,OAPA,GAAA,WAAA,EAAA,WAAA,QACA,EAAA,aAAA,EAAA,aAAA,QACA,EAAA,gBAAA,EAAA,gBACA,EAAA,YAAA,EAAA,YACA,EAAA,cAAA,EAAA,cACA,EAAA,mBAAA,EAAA,mBACA,EAAA,SAAA,EAAA,SACA,EAYA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,GAAA,GAAA,EAAA,GAQA,QAAA,GAAA,GACA,MAAA,GACA,GACA,EAAA,EAAA,GACA,EAAA,SAAA,EACA,GAGA,QAAA,KACA,EAAA,EAAA,OAQA,QAAA,GAAA,GACA,MAAA,KAAA,GAAA,IAAA,EAWA,QAAA,GAAA,EAAA,GACA,MAAA,KAAA,EACA,EAIA,GAAA,EAAA,GACA,EAEA,KAUA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BA1TA,GAAA,GAAA,GAAA,SAGA,EAAA,OAAA,cAGA,KAAA,EAAA,CACA,GAAA,MACA,EAAA,OAAA,KAAA,SACA,QAAA,iBAAA,UAAA,SAAA,GACA,GAAA,EAAA,OAAA,EAAA,CACA,GAAA,GAAA,CACA,MACA,EAAA,QAAA,SAAA,GACA,SAIA,EAAA,SAAA,GACA,EAAA,KAAA,GACA,OAAA,YAAA,EAAA,MAKA,GAAA,IAAA,EAGA,KAiGA,EAAA,CAcA,GAAA,WACA,QAAA,SAAA,EAAA,GAIA,GAHA,EAAA,EAAA,IAGA,EAAA,YAAA,EAAA,aAAA,EAAA,eAGA,EAAA,oBAAA,EAAA,YAGA,EAAA,iBAAA,EAAA,gBAAA,SACA,EAAA,YAGA,EAAA,wBAAA,EAAA,cAEA,KAAA,IAAA,YAGA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,KAOA,KAAA,GADA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,GAAA,WAAA,KAAA,CACA,EAAA,EAAA,GACA,EAAA,kBACA,EAAA,QAAA,CACA,OASA,IACA,EAAA,GAAA,GAAA,KAAA,EAAA,GACA,EAAA,KAAA,GACA,KAAA,OAAA,KAAA,IAGA,EAAA,gBAGA,WAAA,WACA,KAAA,OAAA,QAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,WAAA,KAAA,CACA,EAAA,kBACA,EAAA,OAAA,EAAA,EAGA,UAGA,MACA,KAAA,aAGA,YAAA,WACA,GAAA,GAAA,KAAA,QAEA,OADA,MAAA,YACA,GAkCA,IAAA,GAAA,CAwEA,GAAA,WACA,QAAA,SAAA,GACA,GAAA,GAAA,KAAA,SAAA,SACA,EAAA,EAAA,MAMA,IAAA,EAAA,OAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EACA,IAAA,EAEA,YADA,EAAA,EAAA,GAAA,OAIA,GAAA,KAAA,SAGA,GAAA,GAAA,GAGA,aAAA,WACA,KAAA,cAAA,KAAA,SAGA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,OACA,GAAA,YACA,EAAA,iBAAA,kBAAA,MAAA,GAEA,EAAA,eACA,EAAA,iBAAA,2BAAA,MAAA,GAEA,EAAA,WACA,EAAA,iBAAA,kBAAA,MAAA,IAEA,EAAA,WAAA,EAAA,UACA,EAAA,iBAAA,iBAAA,MAAA,IAGA,gBAAA,WACA,KAAA,iBAAA,KAAA,SAGA,iBAAA,SAAA,GACA,GAAA,GAAA,KAAA,OACA,GAAA,YACA,EAAA,oBAAA,kBAAA,MAAA,GAEA,EAAA,eACA,EAAA,oBAAA,2BAAA,MAAA,GAEA,EAAA,WACA,EAAA,oBAAA,kBAAA,MAAA,IAEA,EAAA,WAAA,EAAA,UACA,EAAA,oBAAA,iBAAA,MAAA,IAQA,qBAAA,SAAA,GAGA,GAAA,IAAA,KAAA,OAAA,CAGA,KAAA,cAAA,GACA,KAAA,uBAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,MAIA,EAAA,KAAA,QAGA,yBAAA,WACA,GAAA,GAAA,KAAA,sBACA,MAAA,0BAEA,EAAA,QAAA,SAAA,GAEA,KAAA,iBAAA,EAGA,KAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,KAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,SAGA,OAGA,YAAA,SAAA,GAMA,OAFA,EAAA,2BAEA,EAAA,MACA,IAAA,kBAGA,GAAA,GAAA,EAAA,SACA,EAAA,EAAA,YAAA,aACA,EAAA,EAAA,OAGA,EAAA,GAAA,GAAA,aAAA,EACA,GAAA,cAAA,EACA,EAAA,mBAAA,CAGA,IAAA,GACA,EAAA,aAAA,cAAA,SAAA,KAAA,EAAA,SAEA,GAAA,EAAA,SAAA,GAEA,OAAA,EAAA,YAIA,EAAA,iBAAA,EAAA,gBAAA,QACA,KAAA,EAAA,gBAAA,QAAA,IACA,KAAA,EAAA,gBAAA,QAAA,GANA,OAUA,EAAA,kBACA,EAAA,GAGA,GAGA,MAEA,KAAA,2BAEA,GAAA,GAAA,EAAA,OAGA,EAAA,EAAA,gBAAA,GAGA,EAAA,EAAA,SAGA,GAAA,EAAA,SAAA,GAEA,MAAA,GAAA,cAIA,EAAA,sBACA,EAAA,GAGA,EARA,QAWA,MAEA,KAAA,iBACA,KAAA,qBAAA,EAAA,OAEA,KAAA,kBAEA,GAEA,GAAA,EAFA,EAAA,EAAA,YACA,EAAA,EAAA,MAEA,qBAAA,EAAA,MACA,GAAA,GACA,OAGA,KACA,GAAA,GAEA,IAAA,GAAA,EAAA,gBACA,EAAA,EAAA,YAGA,EAAA,EAAA,YAAA,EACA,GAAA,WAAA,EACA,EAAA,aAAA,EACA,EAAA,gBAAA,EACA,EAAA,YAAA,EAEA,EAAA,EAAA,SAAA,GAEA,MAAA,GAAA,UAIA,EAJA,SASA,MAIA,EAAA,mBAAA,EAEA,EAAA,mBACA,EAAA,iBAAA,IAGA,MC5hBA,OAAA,YAAA,OAAA,cAAA,UCCA,SAAA,GAGA,GACA,IADA,EAAA,KACA,EAAA,KACA,EAAA,EAAA,MAMA,EAAA,SAAA,EAAA,GACA,KAAA,SACA,KAAA,OAAA,EACA,KAAA,WAAA,EACA,KAAA,SAAA,EACA,KAAA,WAGA,GAAA,WACA,SAAA,SAAA,GAEA,KAAA,UAAA,EAAA,MAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,QAAA,EAGA,MAAA,aAEA,QAAA,SAAA,GAEA,KAAA,WAEA,KAAA,QAAA,GAEA,KAAA,aAEA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,EAAA,IAIA,GAAA,UAAA,EAEA,KAAA,OAAA,EAAA,IAEA,KAAA,MAAA,EAAA,IAGA,OAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,GAIA,MAFA,MAAA,QAAA,GAAA,KAAA,IAEA,CAGA,OAAA,MAAA,MAAA,IACA,KAAA,OAAA,EAAA,EAAA,KAAA,MAAA,IAEA,KAAA,QAEA,IAGA,KAAA,QAAA,IAAA,IAEA,IAEA,MAAA,SAAA,EAAA,GAEA,GADA,EAAA,MAAA,QAAA,IAAA,QAAA,EAAA,GACA,EAAA,MAAA,UAAA,CAEA,GAAA,GAAA,EAAA,MAAA,KACA,EAAA,EAAA,GACA,EAAA,EAAA,EAEA,GADA,EAAA,QAAA,WAAA,GACA,KAAA,GAEA,mBAAA,GAEA,WAAA,WACA,KAAA,QAAA,EAAA,EAAA,KAAA,IACA,KAAA,MAAA,OACA,CACA,GAAA,GAAA,SAAA,EAAA,GACA,KAAA,QAAA,EAAA,EAAA,EAAA,IACA,KAAA,KACA,GAAA,KAAA,EAAA,KAgBA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,KAAA,MAAA,GAAA,CAEA,KAAA,GAAA,GADA,EAAA,KAAA,QAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAEA,KAAA,OAAA,EAAA,EAAA,GAEA,KAAA,MAEA,MAAA,QAAA,GAAA,MAEA,KAAA,aACA,KAAA,SACA,KAAA,aAEA,UAAA,WACA,KAAA,UACA,KAAA,eAKA,EAAA,IACA,OAAA,EACA,GAAA,SAAA,GACA,MAAA,GAAA,QAAA,KAAA,EAAA,OAAA,KACA,MAAA,EAAA,QACA,IAAA,EAAA,QAEA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,eAYA,QAXA,EAAA,MAAA,OAAA,EAAA,MAAA,QACA,GAAA,IAAA,KAAA,UAEA,EAAA,KAAA,MAAA,EAAA,EAAA,OACA,EAAA,iBAAA,mBAAA,WACA,IAAA,EAAA,YACA,EAAA,KAAA,GAAA,EAAA,GAAA,IAAA,EACA,EAAA,UAAA,EAAA,aAAA,KAGA,EAAA,OACA,GAEA,aAAA,SAAA,EAAA,EAAA,GACA,KAAA,KAAA,EAAA,EAAA,GAAA,aAAA,aAKA,EAAA,IAAA,EACA,EAAA,OAAA,GAEA,OAAA,aC9JA,SAAA,GA4MA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,KACA,EAAA,KAAA,GACA,MAAA,GACA,EAAA,KAAA,SAAA,mBAAA,KACA,QAAA,KAAA,iGACA,GAEA,MAAA,+BAAA,EAGA,QAAA,GAAA,GACA,MAAA,GAAA,YAAA,EAAA,GAIA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,SACA,KAAA,EAAA,CACA,EAAA,EAAA,cAAA,OAEA,IAAA,GAAA,IAAA,KAAA,MAAA,KAAA,KAAA,SAAA,IAAA,IAGA,EAAA,EAAA,YAAA,MAAA,wBACA,GAAA,GAAA,EAAA,IAAA,EAEA,GAAA,IAAA,EAAA,MAEA,MAAA,mBAAA,EAAA,KAOA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,cAAA,cAAA,QAGA,OAFA,GAAA,YAAA,EAAA,YACA,EAAA,mBAAA,GACA,EAvPA,GAAA,GAAA,SACA,EAAA,EAAA,MACA,EAAA,UAAA,KAAA,UAAA,WAEA,EAAA,OAAA,kBACA,OAAA,kBAAA,aAAA,UAAA,SAUA,GAEA,kBAAA,YAAA,EAAA,IAEA,kBACA,YAAA,EAAA,IACA,uBACA,QACA,qBACA,kCACA,KAAA,KACA,KACA,KAAA,YACA,OAAA,cACA,MAAA,cAGA,UAAA,WACA,GAAA,GAAA,KAAA,aACA,IACA,KAAA,MAAA,IAGA,MAAA,SAAA,GACA,GAAA,KAAA,SAAA,GAEA,YADA,EAAA,OAAA,QAAA,IAAA,yBAAA,EAAA,WAGA,IAAA,GAAA,KAAA,KAAA,IAAA,EAAA,WACA,KACA,KAAA,YAAA,GACA,EAAA,KAAA,KAAA,KAMA,YAAA,SAAA,GACA,EAAA,OAAA,QAAA,IAAA,UAAA,GACA,KAAA,eAAA,GAEA,oBAAA,SAAA,GACA,EAAA,gBAAA,EACA,EAAA,kBACA,EAAA,gBAAA,gBAAA,GAEA,KAAA,eAAA,KACA,EAAA,OAAA,QAAA,IAAA,YAAA,GACA,KAAA,aAEA,YAAA,SAAA,GAgBA,GAfA,EAAA,OAAA,gBAAA,EAIA,YAAA,sBACA,YAAA,qBAAA,GAIA,EAAA,cADA,EAAA,WACA,GAAA,aAAA,QAAA,SAAA,IAEA,GAAA,aAAA,SAAA,SAAA,KAIA,EAAA,UAEA,IADA,GAAA,GACA,EAAA,UAAA,QACA,EAAA,EAAA,UAAA,QACA,GACA,GAAA,OAAA,GAIA,MAAA,oBAAA,IAEA,UAAA,SAAA,GACA,EAAA,GACA,KAAA,YAAA,IAGA,EAAA,KAAA,EAAA,KACA,KAAA,aAAA,KAGA,WAAA,SAAA,GAEA,GAAA,GAAA,CACA,GAAA,EAAA,GACA,EAAA,gBAAA,EACA,KAAA,aAAA,IAEA,aAAA,SAAA,GACA,KAAA,aAAA,GACA,SAAA,KAAA,YAAA,IAGA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KACA,EAAA,SAAA,GACA,GACA,EAAA,GAEA,EAAA,oBAAA,GAOA,IALA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,GAIA,GAAA,UAAA,EAAA,UAAA,CACA,GAAA,IAAA,CAEA,IAAA,IAAA,EAAA,YAAA,QAAA,WACA,GAAA,MAEA,IAAA,EAAA,MAAA,CACA,GAAA,CAIA,KAAA,GAAA,GAHA,EAAA,EAAA,MAAA,SACA,EAAA,EAAA,EAAA,OAAA,EAEA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,OAAA,QAAA,cAEA,EAAA,GAAA,QAAA,EAAA,aAKA,GACA,EAAA,cAAA,GAAA,aAAA,QAAA,SAAA,OAUA,YAAA,SAAA,GACA,GAAA,GAAA,SAAA,cAAA,SACA,GAAA,gBAAA,EACA,EAAA,IAAA,EAAA,IAAA,EAAA,IACA,EAAA,GACA,EAAA,cAAA,EACA,KAAA,aAAA,EAAA,WACA,EAAA,WAAA,YAAA,GACA,EAAA,cAAA,OAEA,SAAA,KAAA,YAAA,IAGA,YAAA,WACA,OAAA,KAAA,gBAAA,KAAA,iBAAA,IAEA,iBAAA,SAAA,EAAA,GAEA,IAAA,GAAA,GADA,EAAA,EAAA,iBAAA,KAAA,sBAAA,IACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,IAAA,KAAA,SAAA,GACA,MAAA,MAAA,YAAA,GACA,EAAA,GAAA,KAAA,iBAAA,EAAA,OAAA,GAAA,EAEA,MAKA,OAAA,IAGA,sBAAA,SAAA,GACA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,kBAAA,KAAA,kBAEA,SAAA,SAAA,GACA,MAAA,GAAA,gBAEA,YAAA,SAAA,GACA,MAAA,GAAA,KAAA,EAAA,QACA,GAEA,IAsDA,EAAA,sBACA,EAAA,qCAEA,GACA,mBAAA,SAAA,GACA,GAAA,GAAA,EAAA,cACA,EAAA,EAAA,cAAA,IAEA,OADA,GAAA,YAAA,KAAA,qBAAA,EAAA,YAAA,GACA,GAEA,qBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,EAEA,OADA,GAAA,KAAA,YAAA,EAAA,EAAA,IAGA,YAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,QAAA,GAGA,OAFA,GAAA,KAAA,EACA,EAAA,EAAA,KACA,EAAA,IAAA,EAAA,IAAA,KAMA,GAAA,OAAA,EACA,EAAA,KAAA,EACA,EAAA,KAAA,GAEA,aC5RA,SAAA,GA0FA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,MAAA,SAAA,EAAA,WAAA,EAAA,aAAA,SAAA,EAOA,QAAA,GAAA,EAAA,GAEA,GAAA,GAAA,CACA,aAAA,YACA,EAAA,SAAA,eAAA,mBAAA,IAGA,EAAA,KAAA,CAEA,IAAA,GAAA,EAAA,cAAA,OACA,GAAA,aAAA,OAAA,GAEA,EAAA,UACA,EAAA,QAAA,EAGA,IAAA,GAAA,EAAA,cAAA,OAmBA,OAlBA,GAAA,aAAA,UAAA,SAEA,EAAA,KAAA,YAAA,GACA,EAAA,KAAA,YAAA,GAMA,YAAA,YAEA,EAAA,KAAA,UAAA,GAIA,OAAA,qBAAA,oBAAA,WACA,oBAAA,UAAA,GAEA,EAsCA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,EAEA,EAAA,WACA,EAAA,EAAA,IACA,GAMA,QAAA,GAAA,GACA,MAAA,aAAA,EAAA,YACA,EAAA,aAAA,EAIA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,GASA,GACA,QAVA,CACA,GAAA,GAAA,YACA,aAAA,EAAA,YACA,EAAA,aAAA,KACA,EAAA,oBAAA,EAAA,GACA,EAAA,EAAA,IAGA,GAAA,iBAAA,EAAA,IAOA,QAAA,GAAA,EAAA,GAGA,QAAA,KACA,GAAA,GACA,GAAA,IAGA,QAAA,KACA,IACA,IATA,GAAA,GAAA,EAAA,iBAAA,oBACA,EAAA,EAAA,EAAA,EAAA,MAUA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,GACA,EAAA,KAAA,IAEA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,QAIA,KAIA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,QAAA,YAAA,EAAA,OAAA,YAAA,EAAA,SACA,EAAA,eAeA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,IACA,EAAA,GAKA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,WAAA,WAAA,EAAA,IAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,MACA,GACA,GAAA,OAAA,KAEA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,IAIA,QAAA,GAAA,GACA,EAAA,OAAA,UAAA,EAhRA,GAAA,GAAA,UAAA,UAAA,cAAA,QACA,EAAA,EACA,EAAA,EAAA,MACA,EAAA,SAGA,EAAA,OAAA,kBACA,kBAAA,aAAA,UAAA,QAEA,IAAA,EAkIA,GAAA,UA/HA,IACA,IADA,EAAA,IACA,EAAA,QACA,EAAA,EAAA,OAQA,GACA,aAEA,yBAAA,YAAA,EAAA,IAEA,yBACA,YAAA,EAAA,KACA,KAAA,KACA,SAAA,SAAA,GACA,EAAA,QAAA,IAGA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAEA,GAAA,SAAA,IAEA,aAAA,SAAA,GAEA,MAAA,GAAA,iBAAA,KAAA,qBAAA,KAGA,qBAAA,SAAA,GACA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,yBACA,KAAA,yBAEA,OAAA,SAAA,EAAA,EAAA,GAMA,GALA,EAAA,MAAA,QAAA,IAAA,SAAA,EAAA,GAIA,EAAA,WAAA,EACA,EAAA,GAAA,CACA,GAAA,GAAA,KAAA,UAAA,EAEA,KAEA,EAAA,EAAA,EAAA,GACA,EAAA,aAAA,EAGA,KAAA,aAAA,GAEA,KAAA,UAAA,GAAA,GAIA,EAAA,OAAA,EAEA,EAAA,aAEA,aAAA,SAAA,GACA,KAAA,YAAA,GACA,KAAA,QAAA,GACA,EAAA,aAEA,UAAA,WACA,EAAA,cAKA,EAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GACA,EAAA,UAAA,KAAA,GA4DA,IAAA,IACA,IAAA,WACA,MAAA,aAAA,eAAA,SAAA,eAEA,cAAA,EAOA,IAJA,OAAA,eAAA,SAAA,iBAAA,GACA,OAAA,eAAA,EAAA,iBAAA,IAGA,SAAA,QAAA,CACA,GAAA,IACA,IAAA,WACA,MAAA,QAAA,SAAA,MAEA,cAAA,EAGA,QAAA,eAAA,SAAA,UAAA,GACA,OAAA,eAAA,EAAA,UAAA,GAgBA,GAAA,GAAA,YAAA,KAAA,WAAA,cACA,EAAA,kBAyDA,IACA,GAAA,kBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,YACA,EAAA,EAAA,cAGA,QAAA,SAAA,MAAA,WAAA,IA+BA,EAAA,UAAA,EACA,EAAA,UAAA,EACA,EAAA,SAAA,EACA,EAAA,iBAAA,EACA,EAAA,iBAAA,EACA,EAAA,eAAA,EACA,EAAA,aAAA,GAEA,OAAA,aChSA,SAAA,GAOA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,cAAA,EAAA,MAAA,EAAA,WAAA,QACA,EAAA,EAAA,YAMA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,IACA,EAAA,SAAA,GAEA,EAAA,UAAA,EAAA,SAAA,QACA,EAAA,EAAA,UAKA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EACA,EAAA,qBAAA,IAaA,QAAA,GAAA,GACA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IAzCA,GAEA,IAFA,EAAA,iBAEA,EAAA,UA6BA,EAAA,YAAA,UAAA,SACA,YAAA,UAAA,iBACA,YAAA,UAAA,uBACA,YAAA,UAAA,oBACA,YAAA,UAAA,kBAEA,EAAA,GAAA,kBAAA,EASA,GAAA,QAAA,EACA,EAAA,QAAA,GAEA,aCpDA,WAmCA,QAAA,KACA,YAAA,SAAA,aAAA,GA/BA,kBAAA,QAAA,cACA,OAAA,YAAA,SAAA,EAAA,GACA,GAAA,GAAA,SAAA,YAAA,aAKA,OAJA,GAAA,UAAA,EACA,EAAA,WAAA,GAAA,GAAA,EACA,EAAA,cAAA,GAAA,GAAA,EACA,EAAA,QACA,GAKA,IAAA,GAAA,OAAA,kBACA,OAAA,kBAAA,aAAA,UAAA,QAMA,aAAA,iBAAA,WACA,YAAA,OAAA,EACA,YAAA,WAAA,GAAA,OAAA,UACA,EAAA,cACA,GAAA,aAAA,qBAAA,SAAA,OAMA,YAAA,YAQA,aAAA,SAAA,YACA,gBAAA,SAAA,aAAA,OAAA,YACA,IAEA,SAAA,iBAAA,mBAAA,OC9CA,OAAA,eAAA,OAAA,iBAAA,UCCA,SAAA,GAQA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBACA,KAAA,EAEA,IADA,EAAA,EAAA,WACA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,WAGA,MAAA,GACA,EAAA,EAAA,MAAA,GACA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,kBAEA,OAAA,MAIA,QAAA,GAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,WACA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,gBAMA,QAAA,GAAA,EAAA,GAEA,EAAA,EAAA,SAAA,GACA,MAAA,GAAA,IACA,MAEA,GAAA,EAAA,KAEA,EAAA,EAAA,GAKA,QAAA,GAAA,GACA,MAAA,GAAA,IACA,EAAA,IACA,OAEA,GAAA,GAIA,QAAA,GAAA,GACA,EAAA,EAAA,SAAA,GACA,MAAA,GAAA,IACA,EADA,SAOA,QAAA,GAAA,GACA,MAAA,GAAA,IAAA,EAAA,GAIA,QAAA,GAAA,GACA,IAAA,EAAA,cAAA,EAAA,WAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,aAAA,OAAA,EAAA,UACA,EAAA,EAAA,SAAA,EACA,IAAA,EAIA,MAHA,GAAA,KAAA,QAAA,MAAA,WAAA,EAAA,WACA,EAAA,QAAA,GACA,EAAA,KAAA,QAAA,YACA,GAKA,QAAA,GAAA,GACA,EAAA,GACA,EAAA,IACA,EAAA,EAAA,SAAA,GACA,EAAA,KAiBA,QAAA,GAAA,GAEA,GADA,EAAA,KAAA,IACA,EAAA,CACA,GAAA,CACA,IAAA,GAAA,OAAA,UAAA,OAAA,SAAA,gBACA,UACA,GAAA,IAIA,QAAA,KACA,GAAA,CAEA,KAAA,GAAA,GADA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,GAEA,MAGA,QAAA,GAAA,GACA,EACA,EAAA,WACA,EAAA,KAGA,EAAA,GAKA,QAAA,GAAA,IAWA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,OACA,EAAA,KAAA,QAAA,MAAA,YAAA,EAAA,WACA,EAAA,KACA,EAAA,YAAA,EAAA,YAAA,GAAA,EAEA,EAAA,WAAA,IACA,EAAA,WAAA,GAGA,EAAA,WAAA,EACA,EAAA,KAAA,QAAA,KAAA,YAAA,EAAA,UACA,uBAAA,EAAA,YACA,EAAA,mBACA,EAAA,KAAA,QAAA,IAAA,YAAA,EAAA,WACA,EAAA,qBAGA,EAAA,KAAA,QAAA,YAIA,QAAA,GAAA,GACA,EAAA,GACA,EAAA,EAAA,SAAA,GACA,EAAA,KAIA,QAAA,GAAA,GACA,EACA,EAAA,WACA,EAAA,KAGA,EAAA,GAIA,QAAA,GAAA,IAGA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,OACA,EAAA,KAAA,QAAA,MAAA,WAAA,EAAA,WACA,EAAA,KACA,EAAA,YAAA,EAAA,YAAA,GAAA,EAEA,EAAA,WAAA,IACA,EAAA,WAAA,GAGA,EAAA,WAAA,EACA,EAAA,KAAA,QAAA,KAAA,WAAA,EAAA,UACA,uBAAA,EAAA,YACA,EAAA,kBACA,EAAA,oBAGA,EAAA,KAAA,QAAA,YAMA,QAAA,GAAA,GACA,MAAA,QAAA,kBAAA,kBAAA,aAAA,GACA,EAGA,QAAA,GAAA,GAGA,IAFA,GAAA,GAAA,EACA,EAAA,EAAA,UACA,GAAA,CACA,GAAA,GAAA,EACA,OAAA,CAEA,GAAA,EAAA,YAAA,EAAA,MAIA,QAAA,GAAA,GACA,GAAA,EAAA,aAAA,EAAA,WAAA,UAAA,CACA,EAAA,KAAA,QAAA,IAAA,6BAAA,EAAA,UAGA,KADA,GAAA,GAAA,EAAA,WACA,GACA,EAAA,GACA,EAAA,EAAA,iBAKA,QAAA,GAAA,GACA,EAAA,YACA,EAAA,GACA,EAAA,WAAA,GAIA,QAAA,GAAA,GAEA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,cAAA,EAAA,MAAA,EAAA,YACA,EAAA,WAAA,CAEA,IADA,GAAA,GAAA,EAAA,WAAA,GACA,GAAA,IAAA,WAAA,EAAA,MACA,EAAA,EAAA,UAEA,IAAA,GAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,MAAA,EAAA,KAAA,YAAA,EACA,GAAA,EAAA,MAAA,MAAA,QAAA,MAAA,KAAA,MAGA,QAAA,MAAA,sBAAA,EAAA,OAAA,GAAA,IAGA,EAAA,QAAA,SAAA,GAEA,cAAA,EAAA,OACA,EAAA,EAAA,WAAA,SAAA,GAEA,EAAA,WAIA,EAAA,KAGA,EAAA,EAAA,aAAA,SAAA,GAEA,EAAA,WAGA,EAAA,QAKA,EAAA,KAAA,QAAA,WAKA,QAAA,KAEA,EAAA,EAAA,eACA,IAKA,QAAA,GAAA,GACA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IAGA,QAAA,GAAA,GACA,EAAA,GAGA,QAAA,GAAA,GACA,EAAA,KAAA,QAAA,MAAA,oBAAA,EAAA,QAAA,MAAA,KAAA,OACA,EAAA,GACA,EAAA,KAAA,QAAA,WAGA,QAAA,GAAA,GACA,EAAA,EAAA,EAIA,KAAA,GAAA,GADA,EAAA,EAAA,iBAAA,YAAA,EAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,QAAA,EAAA,OAAA,UACA,EAAA,EAAA,OAGA,GAAA,GA/TA,GAAA,GAAA,OAAA,aACA,EAAA,OAAA,YAAA,YAAA,iBAAA,OAiGA,GAAA,OAAA,kBACA,OAAA,mBAAA,OAAA,kBACA,GAAA,qBAAA,CAEA,IAAA,IAAA,EACA,KAsLA,EAAA,GAAA,kBAAA,GAQA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QA8BA,GAAA,iBAAA,EACA,EAAA,YAAA,EACA,EAAA,oBAAA,EACA,EAAA,WAAA,EACA,EAAA,eAAA,EACA,EAAA,aAAA,EAEA,EAAA,gBAAA,EACA,EAAA,gBAAA,EAEA,EAAA,YAAA,GAEA,OAAA,gBCvUA,SAAA,GA8EA,QAAA,GAAA,EAAA,GAIA,GAAA,GAAA,KACA,KAAA,EAGA,KAAA,IAAA,OAAA,oEAEA,IAAA,EAAA,QAAA,KAAA,EAGA,KAAA,IAAA,OAAA,uGAAA,OAAA,GAAA,KAGA,IAAA,EAAA,GACA,KAAA,IAAA,OAAA,oFAAA,OAAA,GAAA,+BAGA,IAAA,EAAA,GACA,KAAA,IAAA,OAAA,+CAAA,OAAA,GAAA,0BAIA,KAAA,EAAA,UAGA,KAAA,IAAA,OAAA,8CA+BA,OA5BA,GAAA,OAAA,EAAA,cAEA,EAAA,UAAA,EAAA,cAIA,EAAA,SAAA,EAAA,EAAA,SAGA,EAAA,GAGA,EAAA,GAEA,EAAA,EAAA,WAEA,EAAA,EAAA,OAAA,GAGA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,UAAA,EAAA,UAEA,EAAA,UAAA,YAAA,EAAA,KAEA,EAAA,OAEA,EAAA,oBAAA,UAEA,EAAA,KAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,IAAA,EAAA,GACA,OAAA,EAUA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EACA,OAAA,GACA,EAAA,EAAA,SAAA,QAAA,OAKA,QAAA,GAAA,GAMA,IAAA,GAAA,GAHA,EAAA,EAAA,QAGA,EAAA,EAAA,EAAA,EAAA,SAAA,GAAA,IACA,EAAA,EAAA,IAAA,EAAA,GAGA,GAAA,IAAA,GAAA,EAAA,OACA,IAEA,EAAA,GAAA,EAAA,QAIA,QAAA,GAAA,GAGA,IAAA,OAAA,UAAA,CAEA,GAAA,GAAA,YAAA,SAEA,IAAA,EAAA,GAAA,CACA,GAAA,GAAA,SAAA,cAAA,EAAA,KACA,EAAA,OAAA,eAAA,EAEA,KAAA,EAAA,YACA,EAAA,GASA,IADA,GAAA,GAAA,EAAA,EAAA,UACA,GAAA,IAAA,GACA,EAAA,OAAA,eAAA,GACA,EAAA,UAAA,EACA,EAAA,CAGA,GAAA,OAAA,GAMA,QAAA,GAAA,GAOA,MAAA,GAAA,EAAA,EAAA,KAAA,GAGA,QAAA,GAAA,EAAA,GAkBA,MAhBA,GAAA,IACA,EAAA,aAAA,KAAA,EAAA,IAGA,EAAA,gBAAA,cAEA,EAAA,EAAA,GAEA,EAAA,cAAA,EAEA,EAAA,GAEA,EAAA,aAAA,GAEA,EAAA,eAAA,GAEA,EAGA,QAAA,GAAA,EAAA,GAEA,OAAA,UACA,EAAA,UAAA,EAAA,WAKA,EAAA,EAAA,EAAA,UAAA,EAAA,QACA,EAAA,UAAA,EAAA,WAIA,QAAA,GAAA,EAAA,EAAA,GASA,IALA,GAAA,MAEA,EAAA,EAGA,IAAA,GAAA,IAAA,YAAA,WAAA,CAEA,IAAA,GAAA,GADA,EAAA,OAAA,oBAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,KACA,OAAA,eAAA,EAAA,EACA,OAAA,yBAAA,EAAA,IACA,EAAA,GAAA,EAGA,GAAA,OAAA,eAAA,IAIA,QAAA,GAAA,GAEA,EAAA,iBACA,EAAA,kBAMA,QAAA,GAAA,GAIA,IAAA,EAAA,aAAA,YAAA,CAGA,GAAA,GAAA,EAAA,YACA,GAAA,aAAA,SAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,EAAA,GAEA,IAAA,GAAA,EAAA,eACA,GAAA,gBAAA,SAAA,GACA,EAAA,KAAA,KAAA,EAAA,KAAA,IAEA,EAAA,aAAA,aAAA,GAKA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,MAAA,KAAA,UACA,IAAA,GAAA,KAAA,aAAA,EACA,MAAA,0BACA,IAAA,GACA,KAAA,yBAAA,EAAA,EAAA,GAQA,QAAA,GAAA,GACA,MAAA,GACA,EAAA,EAAA,eADA,OAKA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,EAGA,QAAA,GAAA,GACA,MAAA,YACA,MAAA,GAAA,IAKA,QAAA,GAAA,EAAA,EAAA,GAGA,MAAA,KAAA,EACA,EAAA,EAAA,GAEA,EAAA,EAAA,GAIA,QAAA,GAAA,EAAA,GAGA,GAAA,GAAA,EAAA,GAAA,EACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KAAA,GAAA,EAAA,GACA,MAAA,IAAA,GAAA,IAGA,KAAA,IAAA,EAAA,GACA,MAAA,IAAA,GAAA,KAIA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAEA,OADA,GAAA,aAAA,KAAA,GACA,EAEA,GAAA,GAAA,EAAA,EAKA,OAHA,GAAA,QAAA,MAAA,GACA,EAAA,EAAA,aAEA,EAGA,QAAA,GAAA,GACA,IAAA,EAAA,cAAA,EAAA,WAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,aAAA,MACA,EAAA,EAAA,GAAA,EAAA,UACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KAAA,EAAA,UACA,MAAA,GAAA,EAAA,EACA,KAAA,IAAA,EAAA,QACA,MAAA,GAAA,EAAA,KAMA,QAAA,GAAA,GAEA,GAAA,GAAA,EAAA,KAAA,KAAA,EAIA,OAFA,GAAA,WAAA,GAEA,EAtYA,IACA,EAAA,OAAA,gBAAA,UAEA,IAAA,GAAA,EAAA,MAIA,EAAA,QAAA,SAAA,iBAMA,GAAA,EAAA,UAAA,IAAA,OAAA,iBAEA,IAAA,EAAA,CAGA,GAAA,GAAA,YAGA,GAAA,YACA,EAAA,eAAA,EAEA,EAAA,YAAA,EACA,EAAA,QAAA,EACA,EAAA,WAAA,EACA,EAAA,eAAA,EACA,EAAA,gBAAA,EACA,EAAA,gBAAA,EACA,EAAA,oBAAA,EACA,EAAA,YAAA,EACA,EAAA,uBAEA,CA8GA,GAAA,IACA,iBAAA,gBAAA,YAAA,gBACA,gBAAA,mBAAA,iBAAA,iBAwKA,KAkBA,EAAA,+BA8DA,EAAA,SAAA,cAAA,KAAA,UACA,EAAA,SAAA,gBAAA,KAAA,UAIA,EAAA,KAAA,UAAA,SAIA,UAAA,gBAAA,EACA,SAAA,cAAA,EACA,SAAA,gBAAA,EACA,KAAA,UAAA,UAAA,EAEA,EAAA,SAAA,EAaA,EAAA,QAAA,EAKA,GAAA,EAgBA,GAfA,OAAA,WAAA,EAeA,SAAA,EAAA,GACA,MAAA,aAAA,IAfA,SAAA,EAAA,GAEA,IADA,GAAA,GAAA,EACA,GAAA,CAIA,GAAA,IAAA,EAAA,UACA,OAAA,CAEA,GAAA,EAAA,UAEA,OAAA,GASA,EAAA,WAAA,EACA,EAAA,gBAAA,EAGA,SAAA,SAAA,SAAA,gBAEA,EAAA,UAAA,EACA,EAAA,UAAA;EAEA,OAAA,gBCvdA,SAAA,GA6CA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,WACA,EAAA,aAAA,SAAA,EA3CA,GAAA,GAAA,EAAA,iBAIA,GACA,WACA,YAAA,EAAA,KAEA,KACA,KAAA,aAEA,MAAA,SAAA,GACA,IAAA,EAAA,SAAA,CAEA,EAAA,UAAA,CAEA,IAAA,GAAA,EAAA,iBAAA,EAAA,UAEA,GAAA,EAAA,SAAA,GACA,EAAA,EAAA,IAAA,EAAA,YAAA,KAIA,eAAA,gBAAA,GAEA,eAAA,gBAAA,KAGA,UAAA,SAAA,GAEA,EAAA,IACA,KAAA,YAAA,IAGA,YAAA,SAAA,GACA,EAAA,QACA,EAAA,MAAA,EAAA,UAUA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QAIA,GAAA,OAAA,EACA,EAAA,iBAAA,GAEA,OAAA,gBC1DA,SAAA,GAGA,QAAA,KAEA,eAAA,OAAA,MAAA,UAEA,eAAA,gBAAA,SAEA,IAAA,GAAA,OAAA,UAAA,SAAA,eACA,SAAA,eACA,UACA,GAAA,WAGA,eAAA,OAAA,EAEA,eAAA,UAAA,KAAA,MACA,OAAA,cACA,eAAA,QAAA,eAAA,UAAA,YAAA,WAGA,SAAA,cACA,GAAA,aAAA,sBAAA,SAAA,KAIA,OAAA,cACA,YAAA,qBAAA,SAAA,GACA,eAAA,OAAA,MAAA,EAAA,YAkBA,GAXA,kBAAA,QAAA,cACA,OAAA,YAAA,SAAA,GACA,GAAA,GAAA,SAAA,YAAA,aAEA,OADA,GAAA,UAAA,GAAA,GAAA,GACA,IAOA,aAAA,SAAA,YAAA,EAAA,MAAA,MACA,QAGA,IAAA,gBAAA,SAAA,YAAA,OAAA,aACA,OAAA,cAAA,OAAA,YAAA,MAIA,CACA,GAAA,GAAA,OAAA,cAAA,YAAA,MACA,oBAAA,kBACA,QAAA,iBAAA,EAAA,OANA,MASA,OAAA,gBC1DA,WAEA,GAAA,OAAA,kBAAA,CAGA,GAAA,IAAA,aAAA,iBAAA,kBACA,mBAGA,IACA,GAAA,QAAA,SAAA,GACA,EAAA,GAAA,eAAA,KAIA,EAAA,QAAA,SAAA,GACA,eAAA,GAAA,SAAA,GACA,MAAA,GAAA,GAAA,KAAA,WCjBA,SAAA,GAIA,QAAA,GAAA,GACA,KAAA,MAAA,OAAA,OAAA,MACA,KAAA,IAAA,OAAA,OAAA,MACA,KAAA,SAAA,EACA,KAAA,MAAA,EAPA,GAAA,GAAA,EAAA,cASA,GAAA,WAIA,YAAA,SAAA,EAAA,GAGA,IAFA,GACA,GAAA,EADA,KAEA,EAAA,KAAA,MAAA,KAAA,IACA,EAAA,GAAA,KAAA,EAAA,GAAA,GACA,EAAA,MAAA,QAAA,EAAA,GAAA,IAAA,EAAA,MAEA,OAAA,IAIA,QAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,GAGA,EAAA,EAAA,KAAA,KAAA,KAAA,IACA,MAAA,MAAA,EAAA,IAGA,MAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,MAGA,KAAA,EACA,MAAA,IAYA,KAAA,GADA,GAAA,EAAA,EAPA,EAAA,WACA,MAAA,GACA,KAMA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,EAAA,GACA,EAAA,EAAA,IACA,EAAA,KAAA,MAAA,GAEA,IACA,EAAA,KAAA,IAAA,GACA,EAAA,MAAA,EACA,KAAA,MAAA,GAAA,GAGA,EAAA,KAAA,IAGA,UAAA,SAAA,GACA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,IAGA,EAAA,EAAA,UAAA,EAAA,cAAA,EACA,MAAA,IAAA,GAAA,EACA,KAAA,MAAA,KAAA,YAAA,EAAA,GAAA,EAAA,UAEA,IAAA,SAAA,GACA,KAAA,UACA,IAAA,GAAA,GAAA,eAwBA,OAvBA,GAAA,KAAA,MAAA,GAAA,GACA,EAAA,OACA,EAAA,QAAA,EAAA,OAAA,KAAA,UAAA,KAAA,KAAA,GAGA,EAAA,WACA,EAAA,QAAA,WAEA,IAAA,GADA,GAAA,EAAA,QACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,IAEA,GAAA,QAAA,MAIA,EAAA,KAAA,SAAA,GACA,EAAA,QACA,EAAA,QAAA,KAAA,GAEA,EAAA,IAIA,IAIA,EAAA,OAAA,GACA,OAAA,UCxGA,SAAA,GAKA,QAAA,KACA,KAAA,OAAA,GAAA,GAAA,KAAA,OAJA,GAAA,GAAA,EAAA,YACA,EAAA,EAAA,MAKA,GAAA,WACA,MAAA,+CAEA,QAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,SAAA,GACA,EAAA,KAAA,QAAA,EAAA,EAAA,KACA,KAAA,KACA,MAAA,OAAA,QAAA,EAAA,EAAA,IAGA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,YACA,EAAA,SAAA,GACA,EAAA,YAAA,EACA,EAAA,GAEA,MAAA,QAAA,EAAA,EAAA,IAGA,QAAA,SAAA,EAAA,EAAA,GAGA,IAAA,GADA,GAAA,EAAA,EADA,EAAA,KAAA,OAAA,YAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EAAA,eAAA,EAAA,GAAA,GAAA,GAEA,EAAA,KAAA,QAAA,EAAA,EAAA,GACA,EAAA,EAAA,QAAA,EAAA,QAAA,EAEA,OAAA,IAEA,WAAA,SAAA,EAAA,EAAA,GAGA,QAAA,KACA,IACA,IAAA,GAAA,GACA,IAGA,IAAA,GAAA,GARA,EAAA,EAAA,EAAA,EAAA,OAQA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,YAAA,EAAA,EAAA,IAKA,IAAA,GAAA,GAAA,EAGA,GAAA,cAAA,GAEA,OAAA,UC/DA,WACA,YAIA,SAAA,GAAA,GACA,KAAA,EAAA,YACA,EAAA,EAAA,UAGA,OAAA,kBAAA,GAAA,eAAA,EAAA,KASA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,SAOA,OANA,KACA,EAAA,EAAA,cAEA,EAAA,IACA,EAAA,GAAA,QAEA,EAAA,GAAA,EAGA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,GAGA,QAAA,GAAA,GACA,MAAA,OAAA,EAAA,GAAA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,KAAA,EAAA,GAGA,QAAA,GAAA,GACA,MAAA,UAAA,GACA,MAAA,GAAA,EAAA,IA6BA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAAA,QACA,EACA,EAAA,aAAA,EAAA,IAEA,EAAA,gBAAA,QAIA,GAAA,aAAA,EAAA,EAAA,IAGA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,UAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAiDA,QAAA,GAAA,GACA,OAAA,EAAA,MACA,IAAA,WACA,MAAA,EACA,KAAA,QACA,IAAA,kBACA,IAAA,aACA,MAAA,QACA,KAAA,QACA,GAAA,eAAA,KAAA,UAAA,WACA,MAAA,QACA,SACA,MAAA,SAIA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,IAAA,GAAA,GAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,UAAA,GACA,MAAA,GAAA,EAAA,EAAA,EAAA,IAIA,QAAA,MAEA,QAAA,GAAA,EAAA,EAAA,EAAA,GAGA,QAAA,KACA,EAAA,SAAA,EAAA,IACA,EAAA,kBACA,GAAA,GAAA,GACA,SAAA,6BANA,GAAA,GAAA,EAAA,EAUA,OAFA,GAAA,iBAAA,EAAA,IAGA,MAAA,WACA,EAAA,oBAAA,EAAA,GACA,EAAA,SAGA,YAAA,GAIA,QAAA,GAAA,GACA,MAAA,SAAA,GAYA,QAAA,GAAA,GACA,GAAA,EAAA,KACA,MAAA,GAAA,EAAA,KAAA,SAAA,SAAA,GACA,MAAA,IAAA,GACA,SAAA,EAAA,SACA,SAAA,EAAA,MACA,EAAA,MAAA,EAAA,MAGA,IAAA,GAAA,EAAA,EACA,KAAA,EACA,QACA,IAAA,GAAA,EAAA,iBACA,6BAAA,EAAA,KAAA,KACA,OAAA,GAAA,EAAA,SAAA,GACA,MAAA,IAAA,IAAA,EAAA,OAKA,QAAA,GAAA,GAIA,UAAA,EAAA,SACA,UAAA,EAAA,MACA,EAAA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,UAAA,OACA,IAEA,EAAA,YAAA,UAAA,KA4CA,QAAA,GAAA,EAAA,GACA,GACA,GACA,EACA,EAHA,EAAA,EAAA,UAIA,aAAA,oBACA,EAAA,WACA,EAAA,UAAA,QACA,EAAA,EACA,EAAA,EAAA,UAAA,MACA,EAAA,EAAA,OAGA,EAAA,MAAA,EAAA,GAEA,GAAA,EAAA,OAAA,IACA,EAAA,YAAA,SAAA,EAAA,OACA,EAAA,YAAA,iBACA,SAAA,8BAIA,QAAA,GAAA,GACA,MAAA,UAAA,GACA,EAAA,EAAA,IArSA,GAAA,GAAA,MAAA,UAAA,OAAA,KAAA,KAAA,MAAA,UAAA,OAUA,MAAA,UAAA,KAAA,SAAA,EAAA,GACA,QAAA,MAAA,8BAAA,KAAA,EAAA,IAGA,KAAA,UAAA,aAAA,YA+BA,IAAA,GAAA,CAEA,QAAA,eAAA,SAAA,4BACA,IAAA,WACA,MAAA,KAAA,GAEA,IAAA,SAAA,GAEA,MADA,GAAA,EAAA,EAAA,EACA,GAEA,cAAA,IAGA,KAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,gBAAA,EACA,MAAA,MAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAEA,IAAA,EACA,MAAA,GAAA,KAAA,EAEA,IAAA,GAAA,CAEA,OADA,GAAA,KAAA,EAAA,KAAA,EAAA,QACA,EAAA,KAAA,EAAA,IAqBA,QAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,EAAA,EAAA,OAAA,EAMA,IALA,IACA,KAAA,gBAAA,GACA,EAAA,EAAA,MAAA,EAAA,KAGA,EACA,MAAA,GAAA,KAAA,EAAA,EAAA,EAGA,IAAA,GAAA,CAIA,OAHA,GAAA,KAAA,EAAA,EACA,EAAA,KAAA,EAAA,KAAA,EAAA,KAEA,EAAA,KAAA,EAAA,GAGA,IAAA,IACA,WAGA,GAAA,GAAA,SAAA,cAAA,OACA,EAAA,EAAA,YAAA,SAAA,cAAA,SACA,GAAA,aAAA,OAAA,WACA,IAAA,GACA,EAAA,CACA,GAAA,iBAAA,QAAA,WACA,IACA,EAAA,GAAA,UAEA,EAAA,iBAAA,SAAA,WACA,IACA,EAAA,GAAA,UAGA,IAAA,GAAA,SAAA,YAAA,aACA,GAAA,eAAA,SAAA,GAAA,EAAA,OAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,MACA,EAAA,cAAA,GAGA,EAAA,GAAA,EAAA,SAAA,KAqGA,iBAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,UAAA,GAAA,YAAA,EACA,MAAA,aAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAEA,MAAA,gBAAA,EACA,IAAA,GAAA,WAAA,EAAA,EAAA,EACA,EAAA,WAAA,EAAA,EAAA,CAEA,IAAA,EACA,MAAA,GAAA,KAAA,EAAA,EAAA,EAGA,IAAA,GAAA,EACA,EAAA,EAAA,KAAA,EAAA,EAAA,EAMA,OALA,GAAA,KAAA,EACA,EAAA,KAAA,EAAA,KAAA,EAAA,IACA,GAGA,EAAA,KAAA,EAAA,IAGA,oBAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,UAAA,EACA,MAAA,aAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAIA,IAFA,KAAA,gBAAA,SAEA,EACA,MAAA,GAAA,KAAA,QAAA,EAEA,IAAA,GAAA,EACA,EAAA,EAAA,KAAA,QAAA,EAGA,OAFA,GAAA,KAAA,QACA,EAAA,KAAA,EAAA,KAAA,QAAA,KACA,EAAA,KAAA,EAAA,IA+BA,kBAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,UAAA,EACA,MAAA,aAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAIA,IAFA,KAAA,gBAAA,SAEA,EACA,MAAA,GAAA,KAAA,EAEA,IAAA,GAAA,EACA,EAAA,EAAA,KAAA,QAAA,EAEA,OADA,GAAA,KAAA,EAAA,KAAA,EAAA,QACA,EAAA,KAAA,EAAA,IAGA,kBAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GAIA,GAHA,kBAAA,IACA,EAAA,iBAEA,kBAAA,GAAA,UAAA,EACA,MAAA,aAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAIA,IAFA,KAAA,gBAAA,GAEA,EACA,MAAA,GAAA,KAAA,EAAA,EAEA,IAAA,GAAA,EACA,EAAA,EAAA,KAAA,EAAA,EAKA,OAJA,GAAA,KAAA,EACA,EAAA,KAAA,EAAA,KAAA,KAGA,EAAA,KAAA,EAAA,KAEA,MC/UA,SAAA,GACA,YAEA,SAAA,GAAA,GACA,IAAA,EACA,KAAA,IAAA,OAAA,oBAKA,QAAA,GAAA,GAEA,IADA,GAAA,GACA,EAAA,EAAA,YACA,EAAA,CAGA,OAAA,GAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CAKA,IAFA,GAAA,GACA,EAAA,IAAA,GACA,IACA,EAAA,EAAA,GAEA,EAAA,cACA,EAAA,EAAA,cAAA,cAAA,GACA,EAAA,iBACA,EAAA,EAAA,eAAA,KAEA,GAAA,EAAA,mBAGA,EAAA,EAAA,gBAGA,OAAA,IAiIA,QAAA,GAAA,GACA,MAAA,YAAA,EAAA,SACA,8BAAA,EAAA,aAGA,QAAA,GAAA,GACA,MAAA,YAAA,EAAA,SACA,gCAAA,EAAA,aAGA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,EAAA,UACA,EAAA,aAAA,aAGA,QAAA,GAAA,GAIA,MAHA,UAAA,EAAA,cACA,EAAA,YAAA,YAAA,EAAA,SAAA,EAAA,IAEA,EAAA,YAYA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBAAA,EAEA,GAAA,IACA,EAAA,GACA,EAAA,EAAA,GAGA,QAAA,GAAA,GACA,QAAA,GAAA,GACA,oBAAA,SAAA,IACA,EAAA,EAAA,SAGA,EAAA,EAAA,GAgBA,QAAA,GAAA,EAAA,GACA,OAAA,oBAAA,GAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EACA,OAAA,yBAAA,EAAA,MAKA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,aACA,KAAA,EAAA,YACA,MAAA,EACA,IAAA,GAAA,EAAA,sBACA,KAAA,EAAA,CAIA,IADA,EAAA,EAAA,eAAA,mBAAA,IACA,EAAA,WACA,EAAA,YAAA,EAAA,UAEA,GAAA,uBAAA,EAEA,MAAA,GAGA,QAAA,GAAA,GACA,IAAA,EAAA,iBAAA,CACA,GAAA,GAAA,EAAA,aACA,KAAA,EAAA,iBAAA,CACA,EAAA,iBAAA,EAAA,eAAA,mBAAA,IACA,EAAA,iBAAA,mBAAA,CAIA,IAAA,GAAA,EAAA,iBAAA,cAAA,OACA,GAAA,KAAA,SAAA,QACA,EAAA,iBAAA,KAAA,YAAA,GAEA,EAAA,iBAAA,iBAAA,EAAA,iBAGA,EAAA,iBAAA,EAAA,iBAGA,MAAA,GAAA,iBAgBA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,cAAA,cAAA,WACA,GAAA,WAAA,aAAA,EAAA,EAIA,KAFA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,OACA,IAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,EAAA,QACA,aAAA,EAAA,MACA,EAAA,aAAA,EAAA,KAAA,EAAA,OACA,EAAA,gBAAA,EAAA,OAIA,MAAA,GAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,cAAA,cAAA,WACA,GAAA,WAAA,aAAA,EAAA,EAIA,KAFA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,OACA,IAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,aAAA,EAAA,KAAA,EAAA,OACA,EAAA,gBAAA,EAAA,MAIA,MADA,GAAA,WAAA,YAAA,GACA,EAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,OACA,IAAA,EAEA,WADA,GAAA,YAAA,EAKA,KADA,GAAA,GACA,EAAA,EAAA,YACA,EAAA,YAAA,GA4FA,QAAA,GAAA,GACA,EACA,EAAA,UAAA,oBAAA,UAEA,EAAA,EAAA,oBAAA,WAGA,QAAA,GAAA,GACA,EAAA,cACA,EAAA,YAAA,WACA,EAAA,sBAAA,CACA,IAAA,GAAA,EAAA,EACA,EAAA,WAAA,EAAA,UAAA,eACA,GAAA,EAAA,EAAA,EAAA,UAIA,EAAA,uBACA,EAAA,sBAAA,EACA,SAAA,QAAA,EAAA,cA4MA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,OAAA,CAOA,IAJA,GAAA,GACA,EAAA,EAAA,OACA,EAAA,EAAA,EAAA,EAAA,EAAA,EACA,GAAA,EACA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,QAAA,KAAA,GACA,EAAA,EAAA,QAAA,KAAA,GACA,GAAA,EACA,EAAA,IAWA,IATA,GAAA,IACA,EAAA,GAAA,EAAA,KACA,EAAA,EACA,GAAA,EACA,EAAA,MAGA,EAAA,EAAA,EAAA,GAAA,EAAA,QAAA,EAAA,EAAA,GAEA,EAAA,EAAA,CACA,IAAA,EACA,MAEA,GAAA,KAAA,EAAA,MAAA,GACA,OAGA,EAAA,MACA,EAAA,KAAA,EAAA,MAAA,EAAA,GACA,IAAA,GAAA,EAAA,MAAA,EAAA,EAAA,GAAA,MACA,GAAA,KAAA,GACA,EAAA,GAAA,CACA,IAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAGA,GAAA,KADA,MAAA,EACA,KAAA,IAAA,GAEA,MAEA,EAAA,KAAA,GACA,EAAA,EAAA,EAyBA,MAtBA,KAAA,GACA,EAAA,KAAA,IAEA,EAAA,WAAA,IAAA,EAAA,OACA,EAAA,aAAA,EAAA,YACA,IAAA,EAAA,IACA,IAAA,EAAA,GACA,EAAA,YAAA,EAEA,EAAA,WAAA,SAAA,GAGA,IAAA,GAFA,GAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,WAAA,EAAA,GAAA,EAAA,GAAA,EACA,UAAA,IACA,GAAA,GACA,GAAA,EAAA,EAAA,GAGA,MAAA,IAGA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,GACA,EAAA,GAAA,aAAA,EACA,OAAA,GAAA,aAAA,EAAA,EAAA,WAAA,GAIA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,EACA,IAAA,EAAA,GAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAAA,aAAA,GAGA,MAAA,GAAA,WAAA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,GACA,GAAA,cAAA,EAAA,EAAA,GAEA,OAAA,GAAA,aAAA,EACA,GAAA,mBAAA,EAAA,EAAA,YAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,EAAA,YACA,MAAA,GAAA,EAAA,EAAA,EAAA,EAEA,IAAA,EAAA,WACA,MAAA,GAAA,EAAA,EAAA,EAAA,EAIA,KAAA,GAFA,GAAA,GAAA,kBAEA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAEA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,EAAA,EACA,GACA,EAAA,QAAA,GAEA,EAAA,YAAA,OALA,CASA,GAAA,GAAA,EAAA,EAAA,EACA,GACA,EAAA,QAAA,EAAA,aAAA,IAEA,EAAA,QAAA,EAAA,IAGA,MAAA,IAAA,mBAAA,EAAA,EAAA,YAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,KAAA,EAAA,EAAA,EAAA,YACA,IAAA,GACA,EAAA,KAAA,GAIA,GADA,EAAA,eACA,EAAA,WAAA,CAGA,EAAA,OAAA,CACA,IAAA,GAAA,EAAA,0BAAA,EACA,IAAA,GACA,EAAA,KAAA,IAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,aAAA,EACA,OAAA,GAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAMA,KAAA,GAJA,MAIA,EAAA,EAAA,EAAA,EAAA,WAAA,OAAA,IAAA,CAUA,IATA,GAAA,GAAA,EAAA,WAAA,GACA,EAAA,EAAA,KACA,EAAA,EAAA,MAOA,MAAA,EAAA,IACA,EAAA,EAAA,UAAA,EAGA,KAAA,EAAA,IACA,IAAA,GAAA,IAAA,GAAA,IAAA,EADA,CAKA,GAAA,GAAA,EAAA,EAAA,EAAA,EACA,EACA,IAGA,EAAA,KAAA,EAAA,IAaA,MAVA,GAAA,KACA,EAAA,YAAA,EACA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,KAAA,EAAA,EAAA,EAAA,GACA,EAAA,OAAA,EAAA,EAAA,EAAA,IAEA,EAAA,IAAA,EAAA,MAAA,EAAA,SACA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,KAGA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,WAAA,KAAA,aACA,MAAA,GAAA,EAAA,EAEA,IAAA,EAAA,WAAA,KAAA,UAAA,CACA,GAAA,GAAA,EAAA,EAAA,KAAA,cAAA,EACA,EACA,IAAA,EACA,OAAA,cAAA,GAGA,SAGA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EACA,EACA,GAKA,IAAA,GAHA,GAAA,EAAA,YAAA,EAAA,WAAA,GAAA,IAEA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,EAAA,EAAA,EACA,EAAA,SAAA,KACA,EACA,EACA,EAUA,OAPA,GAAA,aACA,oBAAA,SAAA,EAAA,GACA,GACA,EAAA,aAAA,IAGA,EAAA,EAAA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,GAAA,WAEA,KAAA,GADA,GAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,SAAA,KAAA,EAAA,EAAA,EAGA,OAAA,GAOA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GAGA,OAFA,KACA,EAAA,EAAA,IAAA,KACA,EAUA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,YAAA,EAKA,OAJA,KACA,EAAA,EAAA,YAAA,GACA,EAAA,EAAA,EAAA,qBAEA,EAGA,GAAA,GAAA,EAAA,WAKA,OAJA,KACA,EAAA,EAAA,YACA,EAAA,EAAA,aAEA,EAeA,QAAA,GAAA,GACA,KAAA,QAAA,EACA,KAAA,iBAAA,EACA,KAAA,aACA,KAAA,KAAA,OACA,KAAA,iBACA,KAAA,aAAA,OACA,KAAA,cAAA,OAr7BA,GAyCA,GAzCA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QA0CA,GAAA,KAAA,kBAAA,GAAA,IAAA,UAAA,QACA,EAAA,EAAA,KAEA,EAAA,WACA,KAAA,QACA,KAAA,WAGA,EAAA,WACA,IAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,GAAA,GACA,KAAA,KAAA,KAAA,GACA,KAAA,OAAA,KAAA,IAEA,KAAA,OAAA,GAAA,GAIA,IAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,MAAA,EAAA,GAGA,MAAA,MAAA,OAAA,IAGA,SAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,OAAA,GAAA,GACA,GAEA,KAAA,KAAA,OAAA,EAAA,GACA,KAAA,OAAA,OAAA,EAAA,IACA,IAGA,QAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,KAAA,OAAA,IACA,EAAA,KAAA,GAAA,KAAA,KAAA,OAAA,GAAA,KAAA,KAAA,GAAA,QAyBA,mBAAA,UAAA,WACA,SAAA,UAAA,SAAA,SAAA,GACA,MAAA,KAAA,MAAA,EAAA,aAAA,MACA,EACA,KAAA,gBAAA,SAAA,IAIA,IAAA,GAAA,OACA,EAAA,SACA,EAAA,KAEA,GACA,UAAA,EACA,QAAA,EACA,MAAA,EACA,KAAA,GAGA,GACA,OAAA,EACA,OAAA,EACA,OAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,UAAA,EACA,KAAA,EACA,SAAA,EACA,QAAA,EACA,UAAA,GAGA,EAAA,mBAAA,oBACA,KAIA,WACA,GAAA,GAAA,SAAA,cAAA,YACA,EAAA,EAAA,QAAA,cACA,EAAA,EAAA,YAAA,EAAA,cAAA,SACA,EAAA,EAAA,YAAA,EAAA,cAAA,SACA,EAAA,EAAA,cAAA,OACA,GAAA,KAAA,SAAA,QACA,EAAA,YAAA,KAIA,IAAA,GAAA,aACA,OAAA,KAAA,GAAA,IAAA,SAAA,GACA,MAAA,GAAA,cAAA,eACA,KAAA,KA2BA,UAAA,iBAAA,mBAAA,WACA,EAAA,UAEA,SAAA,+BACA,GAmBA,IAMA,EAAA,oBAAA,WACA,KAAA,WAAA,wBAIA,IA6GA,GA7GA,EAAA,eA8GA,mBAAA,oBACA,EAAA,GAAA,kBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,OAAA,iBAWA,oBAAA,SAAA,SAAA,EAAA,GACA,GAAA,EAAA,qBACA,OAAA,CAEA,IAAA,GAAA,CACA,GAAA,sBAAA,CAEA,IAAA,GAAA,EAAA,IACA,EACA,EAAA,EACA,GAAA,EACA,GAAA,CAgBA,IAdA,IACA,EAAA,IACA,GAAA,GACA,EAAA,EAAA,GACA,EAAA,sBAAA,EACA,EAAA,EACA,GAAA,GACA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,sBAAA,EACA,EAAA,KAIA,EAAA,CACA,EAAA,EACA,IAAA,GAAA,EAAA,EACA,GAAA,SAAA,EAAA,yBAeA,MAZA,GAGA,EAAA,aAAA,EACA,EACA,EAAA,EACA,EACA,GACA,GACA,EAAA,EAAA,UAGA,GAOA,oBAAA,UAAA,CAEA,IAAA,GAAA,EAAA,oBAAA,YAEA,GACA,IAAA,WACA,MAAA,MAAA,UAEA,YAAA,EACA,cAAA,EAGA,KAGA,oBAAA,UAAA,OAAA,OAAA,EAAA,WAEA,OAAA,eAAA,oBAAA,UAAA,UACA,IA0BA,EAAA,oBAAA,WACA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,OAAA,EACA,MAAA,SAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAEA,IAAA,GAAA,KACA,EAAA,EAAA,EAAA,EAAA,KAAA,SAAA,GACA,EAAA,aAAA,MAAA,GACA,EAAA,eAKA,OAFA,MAAA,aAAA,MAAA,GACA,KAAA,cACA,EAAA,QAGA,KAAA,UAGA,KAAA,UAAA,IAAA,EAFA,KAAA,WAAA,IAAA,GAKA,IAGA,0BAAA,SAAA,GAIA,MAHA,MAAA,WACA,KAAA,UAAA,YAEA,EAAA,IAAA,EAAA,MAAA,EAAA,QASA,KAAA,YACA,KAAA,UAAA,GAAA,GAAA,OAGA,KAAA,UAAA,mBAAA,EAAA,KAAA,QAEA,GACA,EAAA,QAAA,MAAA,YAAA,EACA,iBAAA,SAGA,KAAA,gBAnBA,KAAA,YACA,KAAA,UAAA,QACA,KAAA,UAAA,UAoBA,eAAA,SAAA,EAAA,EAAA,GACA,EACA,EAAA,KAAA,aAAA,GACA,IACA,EAAA,KAAA,WAEA,KAAA,cACA,KAAA,YAAA,KAAA,KAAA,QACA,IAAA,GAAA,KAAA,WACA,IAAA,OAAA,EAAA,WACA,MAAA,EAEA,IAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,MACA,EAAA,EAAA,wBACA,GAAA,iBAAA,KACA,EAAA,cAAA,EACA,EAAA,aACA,EAAA,YAAA,IASA,KAAA,GARA,GAAA,EAAA,mBACA,UAAA,KACA,SAAA,KACA,MAAA,GAGA,EAAA,EACA,GAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAAA,CAKA,OAAA,EAAA,cACA,GAAA,EAEA,IAAA,GAAA,EAAA,EAAA,EAAA,EACA,EAAA,SAAA,KACA,EACA,EACA,EAAA,UACA,GAAA,kBAAA,EACA,IACA,EAAA,YAAA,GAOA,MAJA,GAAA,UAAA,EAAA,WACA,EAAA,SAAA,EAAA,UACA,EAAA,iBAAA,OACA,EAAA,cAAA,OACA,GAGA,GAAA,SACA,MAAA,MAAA,QAGA,GAAA,OAAA,GACA,KAAA,OAAA,EACA,EAAA,OAGA,GAAA,mBACA,MAAA,MAAA,WAAA,KAAA,UAAA,KAGA,YAAA,WACA,KAAA,WAAA,KAAA,cAAA,KAAA,KAAA,UAGA,KAAA,YAAA,OACA,KAAA,UAAA,eACA,KAAA,UAAA,wBAGA,MAAA,WACA,KAAA,OAAA,OACA,KAAA,UAAA,OACA,KAAA,WAAA,KAAA,UAAA,KACA,KAAA,UAAA,IAAA,QACA,KAAA,YAAA,OACA,KAAA,YAEA,KAAA,UAAA,eACA,KAAA,UAAA,QACA,KAAA,UAAA,SAGA,aAAA,SAAA,GACA,KAAA,UAAA,EACA,KAAA,YAAA,OACA,KAAA,YACA,KAAA,UAAA,2BAAA,OACA,KAAA,UAAA,iBAAA,SAIA,aAAA,SAAA,GAIA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,EAAA,EACA,IAAA,kBAAA,GAGA,MAAA,YACA,MAAA,GAAA,MAAA,EAAA,YATA,GAAA,EAaA,OACA,eACA,IAAA,EACA,eAAA,EAAA,kBACA,qBAAA,EAAA,wBACA,+BACA,EAAA,oCAOA,GAAA,iBAAA,GACA,GAAA,KAAA,UACA,KAAA,OAAA,wEAIA,MAAA,aAAA,KAAA,aAAA,KAGA,GAAA,QACA,GAAA,GAAA,EAAA,KAAA,KAAA,aAAA,OAIA,IAHA,IACA,EAAA,KAAA,eAEA,EACA,MAAA,KAEA,IAAA,GAAA,EAAA,IACA,OAAA,GAAA,EAAA,IAqQA,IAAA,GAAA,CAqCA,QAAA,eAAA,KAAA,UAAA,oBACA,IAAA,WACA,GAAA,GAAA,KAAA,iBACA,OAAA,GAAA,EACA,KAAA,WAAA,KAAA,WAAA,iBAAA,SAIA,IAAA,GAAA,SAAA,wBACA,GAAA,aACA,EAAA,YAAA,KAYA,EAAA,WACA,UAAA,WACA,GAAA,GAAA,KAAA,IACA,KACA,EAAA,aAAA,GACA,EAAA,QAAA,QACA,EAAA,WAAA,GACA,EAAA,MAAA,UAIA,mBAAA,SAAA,EAAA,GACA,KAAA,WAEA,IAAA,GAAA,KAAA,QACA,EAAA,KAAA,gBAEA,IAAA,EAAA,GAAA,CAMA,GALA,EAAA,OAAA,EACA,EAAA,UAAA,EAAA,GAAA,YACA,EAAA,QAAA,EAAA,EAAA,EAAA,GAAA,EAAA,GAGA,EAAA,YAAA,EAAA,QAEA,WADA,MAAA,qBAIA,GAAA,WACA,EAAA,QAAA,KAAA,KAAA,oBAAA,MAGA,EAAA,QACA,EAAA,QAAA,EACA,EAAA,QAAA,EAAA,OAAA,YACA,EAAA,MAAA,EAAA,EAAA,EAAA,OAAA,EAAA,KAEA,EAAA,QAAA,EACA,EAAA,QAAA,EAAA,KAAA,YACA,EAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,IAGA,EAAA,SACA,EAAA,MAAA,KAAA,KAAA,oBAAA,MAEA,KAAA,uBAGA,oBAAA,WACA,GAAA,KAAA,KAAA,MAAA,CACA,GAAA,GAAA,KAAA,KAAA,OAGA,IAFA,KAAA,KAAA,YACA,EAAA,EAAA,mBACA,EAEA,WADA,MAAA,eAKA,GAAA,GAAA,KAAA,KAAA,KACA,MAAA,KAAA,UACA,EAAA,EAAA,kBACA,KAAA,KAAA,SACA,GAAA,GACA,IAAA,GAAA,KAAA,KAAA,SACA,KAAA,KAAA,SACA,MAAA,QAAA,EACA,MAAA,aAAA,EAAA,IAGA,aAAA,SAAA,EAAA,GACA,MAAA,QAAA,KACA,MAEA,IAAA,KAAA,gBAGA,KAAA,YACA,KAAA,aAAA,EACA,IACA,KAAA,cAAA,GAAA,eAAA,KAAA,cACA,KAAA,cAAA,KAAA,KAAA,cAAA,OAGA,KAAA,cAAA,cAAA,iBAAA,KAAA,aACA,KAAA,kBAGA,oBAAA,SAAA,GACA,GAAA,IAAA,EACA,MAAA,MAAA,gBACA,IAAA,GAAA,KAAA,UAAA,GACA,EAAA,EAAA,WACA,KAAA,EACA,MAAA,MAAA,oBAAA,EAAA,EAEA,IAAA,EAAA,WAAA,KAAA,cACA,KAAA,mBAAA,EACA,MAAA,EAGA,IAAA,GAAA,EAAA,SACA,OAAA,GAGA,EAAA,sBAFA,GAKA,oBAAA,WACA,MAAA,MAAA,oBAAA,KAAA,UAAA,OAAA,IAGA,iBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,oBAAA,EAAA,GACA,EAAA,KAAA,iBAAA,UACA,MAAA,UAAA,OAAA,EAAA,EAAA,GAEA,EAAA,aAAA,EAAA,EAAA,cAGA,kBAAA,SAAA,GAMA,IALA,GAAA,GAAA,KAAA,oBAAA,EAAA,GACA,EAAA,KAAA,oBAAA,GACA,EAAA,KAAA,iBAAA,WACA,EAAA,KAAA,UAAA,OAAA,EAAA,GAAA,GAEA,IAAA,GAAA,CACA,GAAA,GAAA,EAAA,WACA,IAAA,IACA,EAAA,GAEA,EAAA,YAAA,EAAA,YAAA,IAGA,MAAA,IAGA,cAAA,SAAA,GAEA,MADA,GAAA,GAAA,EAAA,KAAA,kBACA,kBAAA,GAAA,EAAA,MAGA,cAAA,SAAA,GACA,IAAA,KAAA,QAAA,EAAA,OAAA,CAGA,GAAA,GAAA,KAAA,gBAEA,KAAA,EAAA,WAEA,WADA,MAAA,OAIA,eAAA,aAAA,KAAA,cAAA,KAAA,aACA,EAEA,IAAA,GAAA,EAAA,SACA,UAAA,KAAA,mBACA,KAAA,iBACA,KAAA,cAAA,GAAA,EAAA,uBAGA,SAAA,KAAA,6BACA,KAAA,2BACA,KAAA,cAAA,GACA,EAAA,gCAMA,KAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAGA,IAAA,GAFA,GAAA,EAAA,GACA,EAAA,EAAA,QACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,KAAA,kBAAA,EAAA,MAAA,EACA,KAAA,GACA,EAAA,IAAA,EAAA,GAIA,GAAA,EAAA,WAIA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAGA,IAFA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,MACA,EAAA,EAAA,MAAA,EAAA,WAAA,IAAA,CACA,GAAA,GAAA,KAAA,cAAA,GACA,EAAA,EAAA,IAAA,EACA,GACA,EAAA,OAAA,IAEA,KAAA,mBACA,EAAA,KAAA,iBAAA,IAIA,EADA,SAAA,EACA,EAEA,EAAA,eAAA,EAAA,OAAA,IAIA,KAAA,iBAAA,EAAA,GAIA,EAAA,QAAA,SAAA,GACA,KAAA,sBAAA,IACA,MAEA,KAAA,4BACA,KAAA,qBAAA,KAGA,oBAAA,SAAA,GACA,GAAA,GAAA,KAAA,UAAA,EACA,KAAA,GAGA,KAAA,2BAAA,EAAA,kBAAA,IAGA,qBAAA,SAAA,GAGA,IAAA,GAFA,GAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,EACA,KAAA,EAAA,EAAA,OACA,KAAA,oBAAA,GACA,QAGA,GAAA,EAAA,KAGA,MAAA,EAAA,EAAA,MAAA,EAAA,YACA,KAAA,oBAAA,GACA,GAGA,IAAA,EAAA,WAAA,EAAA,QAAA,OAGA,GAAA,GAAA,EAIA,IADA,GAAA,GAAA,KAAA,UAAA,OACA,EAAA,GACA,KAAA,oBAAA,GACA,KAIA,sBAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,UACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,SAIA,UAAA,WACA,KAAA,gBAGA,KAAA,cAAA,QACA,KAAA,cAAA,SAGA,MAAA,WACA,IAAA,KAAA,OAAA,CAEA,KAAA,WACA,KAAA,GAAA,GAAA,EAAA,EAAA,KAAA,UAAA,OAAA,IACA,KAAA,sBAAA,KAAA,UAAA,GAGA,MAAA,UAAA,OAAA,EACA,KAAA,YACA,KAAA,iBAAA,UAAA,OACA,KAAA,QAAA,KAKA,oBAAA,qBAAA,GACA,MChuCA,SAAA,GAUA,QAAA,KACA,IACA,GAAA,EACA,EAAA,eAAA,WACA,GAAA,EACA,SAAA,MAAA,QAAA,MAAA,oBACA,EAAA,6BACA,SAAA,MAAA,QAAA,cAdA,GAAA,GAAA,SAAA,cAAA,QACA,GAAA,YAAA,oEACA,IAAA,GAAA,SAAA,cAAA,OACA,GAAA,aAAA,EAAA,EAAA,WAGA,IAAA,EAeA,IAAA,SAAA,iBAQA,EAAA,iBARA,CACA,GAAA,GAAA,GACA,QAAA,iBAAA,qBAAA,WACA,IACA,EAAA,UAAA,YAAA,EAAA,KAOA,GAAA,OAAA,iBAAA,eAAA,UAAA,CACA,GAAA,GAAA,SAAA,UAAA,UACA,UAAA,UAAA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,KAAA,KAAA,EAAA,EAEA,OADA,gBAAA,WAAA,GACA,GAKA,EAAA,MAAA,GAEA,OAAA","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function isNaN(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var ident = identStart + '+' + identPart + '*';\n  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';\n  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';\n  var path = '(?:' + identOrElementIndex + ')(?:\\\\s*\\\\.\\\\s*' + identOrElementIndex + ')*';\n  var pathRegExp = new RegExp('^' + path + '$');\n\n  function isPathValid(s) {\n    if (typeof s != 'string')\n      return false;\n    s = s.trim();\n\n    if (s == '')\n      return true;\n\n    if (s[0] == '.')\n      return false;\n\n    return pathRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(s, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (s.trim() == '')\n      return this;\n\n    if (isIndex(s)) {\n      this.push(s);\n      return this;\n    }\n\n    s.split(/\\s*\\.\\s*/).filter(function(part) {\n      return part;\n    }).forEach(function(part) {\n      this.push(part);\n    }, this);\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null)\n      pathString = '';\n\n    if (typeof pathString !== 'string')\n      pathString = String(pathString);\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n    if (!isPathValid(pathString))\n      return invalidPath;\n    var path = new Path(pathString, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      return this.join('.');\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var accessors = this.map(function(ident) {\n        return isIndex(ident) ? '[\"' + ident + '\"]' : '.' + ident;\n      });\n\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      for (; i < (this.length - 1); i++) {\n        var ident = this[i];\n        pathString += accessors[i];\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      pathString += accessors[i];\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  function notify(object, name, value, oldValue) {\n    if (areSameValue(value, oldValue))\n      return;\n\n    // TODO(rafaelw): Hack hack hack. This entire code really needs to move\n    // out of observe-js into polymer.\n    if (typeof object.propertyChanged_ == 'function')\n      object.propertyChanged_(name, value, oldValue);\n\n    if (!hasObserve)\n      return;\n\n    var notifier = object.notifier_;\n    if (!notifier)\n      notifier = object.notifier_ = Object.getNotifier(object);\n\n    updateRecord.object = object;\n    updateRecord.name = name;\n    updateRecord.oldValue = oldValue;\n\n    notifier.notify(updateRecord);\n  }\n\n  Observer.createBindablePrototypeAccessor = function(proto, name) {\n    var privateName = name + '_';\n    var privateObservable  = name + 'Observable_';\n\n    proto[privateName] = proto[name];\n\n    Object.defineProperty(proto, name, {\n      get: function() {\n        var observable = this[privateObservable];\n        if (observable)\n          observable.deliver();\n\n        return this[privateName];\n      },\n      set: function(value) {\n        var observable = this[privateObservable];\n        if (observable) {\n          observable.setValue(value);\n          return;\n        }\n\n        var oldValue = this[privateName];\n        this[privateName] = value;\n        notify(this, name, value, oldValue);\n\n        return value;\n      },\n      configurable: true\n    });\n  }\n\n  Observer.bindToInstance = function(instance, name, observable, resolveFn) {\n    var privateName = name + '_';\n    var privateObservable  = name + 'Observable_';\n\n    instance[privateObservable] = observable;\n    var oldValue = instance[privateName];\n    var value = observable.open(function(value, oldValue) {\n      instance[privateName] = value;\n      notify(instance, name, value, oldValue);\n    });\n\n    if (resolveFn && !areSameValue(oldValue, value)) {\n      var resolvedValue = resolveFn(oldValue, value);\n      if (!areSameValue(value, resolvedValue)) {\n        value = resolvedValue;\n        if (observable.setValue)\n          observable.setValue(value);\n      }\n    }\n\n    instance[privateName] = value;\n    notify(instance, name, value, oldValue);\n\n    return {\n      close: function() {\n        observable.close();\n        instance[privateObservable] = undefined;\n      }\n    };\n  }\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    for (var i = 0; i < listeners.length; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    if (anyRemoved) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var nodeList = new wrappers.NodeList();\n      var eventPath = eventPathTable.get(this);\n      if (eventPath) {\n        var index = 0;\n        var lastIndex = eventPath.length - 1;\n        var baseRoot = getTreeScope(currentTargetTable.get(this));\n\n        for (var i = 0; i <= lastIndex; i++) {\n          var currentTarget = eventPath[i];\n          var currentRoot = getTreeScope(currentTarget);\n          if (currentRoot.contains(baseRoot) &&\n              // Make sure we do not add Window to the path.\n              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {\n            nodeList[index++] = currentTarget;\n          }\n        }\n        nodeList.length = index;\n      }\n      return nodeList;\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    this.impl = impl;\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(this.impl.target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return this.impl[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanUpNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalName(el, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  /**\n   * Useful for generating the accessor pair for a property that reflects an\n   * attribute.\n   */\n  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {\n    var attrName = opt_attrName || propertyName;\n    Object.defineProperty(prototype, propertyName, {\n      get: function() {\n        return this.impl[propertyName];\n      },\n      set: function(v) {\n        this.impl[propertyName] = v;\n        invalidateRendererBasedOnAttribute(this, attrName);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  setterDirtiesAttribute(Element.prototype, 'id');\n  setterDirtiesAttribute(Element.prototype, 'className', 'class');\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings\n  // that reflect attributes.\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else if (rule.cssText) {\n          cssText += rule.cssText + '\\n\\n';\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n// mixin\n\n// copy all properties from inProps (et al) to inObj\nfunction mixin(inObj/*, inProps, inMoreProps, ...*/) {\n  var obj = inObj || {};\n  for (var i = 1; i < arguments.length; i++) {\n    var p = arguments[i];\n    try {\n      for (var n in p) {\n        copyProperty(n, p, obj);\n      }\n    } catch(x) {\n    }\n  }\n  return obj;\n}\n\n// copy property inName from inSource object to inTarget object\nfunction copyProperty(inName, inSource, inTarget) {\n  var pd = getPropertyDescriptor(inSource, inName);\n  Object.defineProperty(inTarget, inName, pd);\n}\n\n// get property descriptor for inName on inObject, even if\n// inName exists on some link in inObject's prototype chain\nfunction getPropertyDescriptor(inObject, inName) {\n  if (inObject) {\n    var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n    return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n  }\n}\n\n// export\n\nscope.mixin = mixin;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  scope.module = module;\n  scope.using = using;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource) {\n          this.receive(url, elt, err, resource);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          this.onload(url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, url);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so, each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n    this.parseNext();\n  },\n  parseImport: function(elt) {\n    elt.import.__importParsed = true;\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.markParsingComplete(elt);\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};"," /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399\n// we'll address this by defaulting to CE polyfill in the presence of the SD\n// polyfill. This will avoid spamming excess attached/detached callbacks.\n// If there is a compelling need to run CE native with SD polyfill,\n// we'll need to fix this issue.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n\n    // install upgrade hook if HTMLImports are available\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        CustomElements.parser.parse(elt.import);\n      }\n    }\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may\n    // make sense to issue a warning or even throw if the template is already\n    // \"activated\", since this would be a strange thing to do.\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"]}
\ No newline at end of file
+{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","../ShadowDOM/src/wrappers.js","build/if-poly.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/TouchEvent.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/DOMTokenList.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/dom.js","src/url.js","../MutationObservers/MutationObserver.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","../HTMLImports/src/scope.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/loader.js","../NodeBind/src/NodeBind.js","src/styleloader.js","../TemplateBinding/src/TemplateBinding.js","src/patches-mdv.js"],"names":[],"mappings":";;;;;;;;;;;AAUA,OAAA,SAAA,OAAA,aAEA,OAAA,SAAA,OAAA,aAEA,SAAA,GAEA,GAAA,GAAA,EAAA,SAEA,UAAA,OAAA,MAAA,GAAA,MAAA,KAAA,QAAA,SAAA,GACA,EAAA,EAAA,MAAA,KACA,EAAA,KAAA,EAAA,EAAA,IAAA,EAAA,KAAA,IAEA,IAAA,GAAA,SAAA,eACA,SAAA,cAAA,6BACA,IAAA,EAEA,IAAA,GAAA,GADA,EAAA,EAAA,WACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,QAAA,EAAA,OACA,EAAA,EAAA,MAAA,EAAA,QAAA,EAIA,GAAA,KACA,EAAA,IAAA,MAAA,KAAA,QAAA,SAAA,GACA,OAAA,SAAA,IAAA,IAMA,EAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAEA,EAAA,OADA,WAAA,EAAA,QACA,EAEA,EAAA,SAAA,YAAA,UAAA,iBAIA,EAAA,QAAA,SAAA,iBAAA,UAAA,OAAA,GACA,QAAA,KAAA,mIAOA,EAAA,WAEA,OAAA,eAAA,OAAA,iBAAA,UACA,OAAA,eAAA,MAAA,SAAA,EAAA,UAIA,EAAA,UACA,OAAA,YAAA,OAAA,cAAA,UACA,OAAA,YAAA,MAAA,QAAA,EAAA,SC/DA,EAAA,MAAA,GACA,UAWA,mBAAA,WACA,WACA,GAAA,GAAA,OAAA,eACA,EAAA,KAAA,MAAA,IAEA,EAAA,WACA,KAAA,KAAA,QAAA,IAAA,KAAA,WAAA,IAAA,KAAA,MAGA,GAAA,WACA,IAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,KAAA,KACA,IAAA,EAAA,KAAA,EACA,EAAA,GAAA,EAEA,EAAA,EAAA,KAAA,MAAA,OAAA,EAAA,GAAA,UAAA,KAGA,IAAA,SAAA,GACA,GAAA,EACA,QAAA,EAAA,EAAA,KAAA,QAAA,EAAA,KAAA,ECnCA,EAAA,GAAA,QAEA,SAAA,SAAA,GACA,KAAA,IAAA,EAAA,UAIA,OAAA,QAAA,KAsBA,SACA,QACA,YAGA,SAAA,uBAUA,QAAA,GAAA,GACA,EAAA,EAVA,GAAA,kBAAA,QAAA,SACA,kBAAA,OAAA,QACA,OAAA,CAIA,IAAA,MAOA,KACA,IAcA,OAbA,QAAA,QAAA,EAAA,GAEA,MAAA,QAAA,EAAA,GACA,EAAA,GAAA,EAEA,EAAA,GAAA,QACA,GAAA,GAEA,EAAA,KAAA,EAAA,GAEA,EAAA,OAAA,EAEA,OAAA,qBAAA,GACA,IAAA,EAAA,QACA,EAGA,OAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,GAKA,OAAA,UAAA,EAAA,GACA,MAAA,UAAA,EAAA,IAGA,GAMA,QAAA,cAIA,GAAA,mBAAA,SAAA,OAAA,KAAA,OAAA,IAAA,QAEA,OAAA,CAGA,KACA,GAAA,GAAA,GAAA,UAAA,GAAA,eAEA,OAAA,KACA,MAAA,GAEA,OAAA,GAMA,QAAA,SAAA,GACA,OAAA,IAAA,IAAA,EAGA,QAAA,UAAA,GACA,OAAA,EAIA,QAAA,UAAA,GACA,MAAA,KAAA,OAAA,GAUA,QAAA,cAAA,EAAA,GACA,MAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EAAA,EACA,YAAA,IAAA,YAAA,IACA,EAGA,IAAA,GAAA,IAAA,EA0BA,QAAA,iBAAA,GACA,GAAA,SAAA,EACA,MAAA,KAEA,IAAA,GAAA,EAAA,WAAA,EAEA,QAAA,GAEA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IAEA,MAAA,EAEA,KAAA,IACA,IAAA,IAEA,MAAA,OAEA,KAAA,IACA,IAAA,GACA,IAAA,IACA,IAAA,IACA,IAAA,KACA,IAAA,OACA,IAAA,MAEA,IAAA,MACA,MAAA,KAIA,MAAA,IAAA,IAAA,KAAA,GAAA,GAAA,IAAA,IAAA,EACA,QAIA,GAAA,IAAA,IAAA,EACA,SAGA,OAyFA,QAAA,SAEA,QAAA,WAAA,GA8BA,QAAA,KAEA,KAAA,GAAA,EAAA,QAAA,CAIA,GAAA,GAAA,EAAA,EAAA,EACA,OAAA,iBAAA,GAAA,KAAA,GAEA,iBAAA,GAAA,KAAA,GACA,IACA,EAAA,EAEA,EAAA,UACA,GAPA,QAaA,IAhDA,GAGA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAHA,KAEA,EAAA,GACA,EAAA,aAGA,GACA,KAAA,WAEA,SAAA,IAGA,EAAA,KAAA,GAEA,EAAA,SAIA,OAAA,WACA,SAAA,EAEA,EAAA,EAGA,GAAA,IAwBA,GAIA,GAHA,IACA,EAAA,EAAA,GAEA,MAAA,IAAA,EAAA,GAAA,CASA,GALA,EAAA,gBAAA,GACA,EAAA,iBAAA,GACA,EAAA,EAAA,IAAA,EAAA,SAAA,QAGA,SAAA,EACA,MAOA,IALA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,KAAA,KACA,EAAA,SAAA,EAAA,GAAA,EAAA,EAAA,GACA,IAEA,cAAA,EAEA,MAAA,IAQA,QAAA,SAAA,GACA,MAAA,aAAA,KAAA,GAMA,QAAA,MAAA,EAAA,GACA,GAAA,IAAA,qBACA,KAAA,OAAA,wCAEA,GAAA,QACA,MAAA,UAAA,KAAA,MAAA,KAAA,EAAA,SAGA,SAAA,KAAA,SACA,KAAA,aAAA,KAAA,0BAOA,QAAA,SAAA,GACA,GAAA,YAAA,MACA,MAAA,EAOA,KAJA,MAAA,GAAA,GAAA,EAAA,UAEA,EAAA,IAEA,gBAAA,GAAA,CAEA,GAAA,QAAA,EAAA,QAEA,MAAA,IAAA,MAAA,EAAA,qBAIA,GAAA,OAAA,GAIA,GAAA,GAAA,UAAA,EACA,IAAA,EAEA,MAAA,EAEA,IAAA,GAAA,UAAA,EACA,KAAA,EAEA,MAAA,YAEA,IAAA,GAAA,GAAA,MAAA,EAAA,qBAIA,OAFA,WAAA,GAAA,EAEA,EAKA,QAAA,gBAAA,GACA,MAAA,SAAA,GAEA,IAAA,EAAA,IAGA,KAAA,EAAA,QAAA,KAAA,OAAA,KA0GA,QAAA,YAAA,GAEA,IADA,GAAA,GAAA,EACA,uBAAA,GAAA,EAAA,UACA,GAKA,OAHA,QAAA,0BACA,OAAA,qBAAA,GAEA,EAAA,EAGA,QAAA,eAAA,GACA,IAAA,GAAA,KAAA,GACA,OAAA,CACA,QAAA,EAGA,QAAA,aAAA,GACA,MAAA,eAAA,EAAA,QACA,cAAA,EAAA,UACA,cAAA,EAAA,SAIA,QAAA,yBAAA,EAAA,GACA,GAAA,MACA,KACA,IAEA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,IAEA,SAAA,GAAA,IAAA,EAAA,MAGA,IAAA,GAKA,IAAA,EAAA,KACA,EAAA,GAAA,GALA,EAAA,GAAA,QASA,IAAA,GAAA,KAAA,GACA,IAAA,KAGA,EAAA,GAAA,EAAA,GAQA,OAHA,OAAA,QAAA,IAAA,EAAA,SAAA,EAAA,SACA,EAAA,OAAA,EAAA,SAGA,MAAA,EAEA,QAAA,EACA,QAAA,GAOA,QAAA,eACA,IAAA,SAAA,OACA,OAAA,CAGA,KAAA,GAAA,GAAA,EAAA,EAAA,SAAA,OAAA,IAEA,SAAA,IAGA,OADA,UAAA,OAAA,GACA,EAgCA,QAAA,qBAOA,QAAA,GAAA,GACA,GAAA,EAAA,SAAA,SAAA,GACA,EAAA,OAAA,GARA,GAAA,GACA,EACA,GAAA,EACA,GAAA,CAQA,QACA,KAAA,SAAA,GACA,GAAA,EAEA,KAAA,OAAA,wBAEA,IACA,OAAA,qBAAA,GAGA,EAAA,EACA,GAAA,GAEA,QAAA,SAAA,EAAA,GACA,EAAA,EACA,EAEA,MAAA,QAAA,EAAA,GAGA,OAAA,QAAA,EAAA,IAGA,QAAA,SAAA,GACA,EAAA,EACA,OAAA,qBAAA,GACA,GAAA,GAEA,MAAA,WACA,EAAA,OAEA,OAAA,UAAA,EAAA,GACA,oBAAA,KAAA,QAiCA,QAAA,mBAAA,EAAA,EAAA,GACA,GAAA,GAAA,oBAAA,OAAA,mBAGA,OAFA,GAAA,KAAA,GACA,EAAA,QAAA,EAAA,GACA,EAOA,QAAA,kBAQA,QAAA,GAAA,EAAA,GACA,IAIA,IAAA,IACA,EAAA,IAAA,GAEA,EAAA,QAAA,GAAA,IACA,EAAA,KAAA,GAEA,OAAA,QAAA,EAAA,IAIA,EAAA,OAAA,eAAA,GAAA,IAIA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,SAAA,GAEA,EAAA,EAAA,OACA,iBAAA,EAAA,KAEA,OAAA,EAIA,OAAA,EAIA,QAAA,GAAA,GACA,IAAA,EAAA,GAAA,CAIA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GAEA,EAAA,QAAA,QACA,EAAA,gBAAA,EAKA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GAEA,EAAA,QAAA,QACA,EAAA,UA7DA,GAIA,GACA,EALA,EAAA,EAEA,KACA,KAkEA,GACA,OAAA,OACA,QAAA,EACA,KAAA,SAAA,EAAA,GAEA,IACA,EAAA,EACA,MAIA,EAAA,KAAA,GAEA,IACA,EAAA,gBAAA,IAEA,MAAA,WAGA,GAFA,MAEA,EAAA,GAAA,CAMA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,OAAA,UAAA,EAAA,GAAA,GACA,SAAA,iBAIA,GAAA,OAAA,EACA,EAAA,OAAA,EACA,EAAA,OACA,EAAA,OACA,iBAAA,KAAA,QAOA,OAAA,GAKA,QAAA,gBAAA,EAAA,GAQA,MAPA,kBAAA,gBAAA,SAAA,IAEA,gBAAA,iBAAA,OAAA,iBAEA,gBAAA,OAAA,GAEA,gBAAA,KAAA,EAAA,GACA,gBAWA,QAAA,YACA,KAAA,OAAA,SAEA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,gBAAA,OACA,KAAA,OAAA,OACA,KAAA,IAAA,iBA0EA,QAAA,UAAA,GACA,SAAA,qBACA,kBAKA,aAAA,KAAA,GAIA,QAAA,iBACA,SAAA,qBAoFA,QAAA,gBAAA,GACA,SAAA,KAAA,MACA,KAAA,OAAA,EACA,KAAA,WAAA,OA6GA,QAAA,eAAA,GACA,IAAA,MAAA,QAAA,GACA,KAAA,OAAA,kCACA,gBAAA,KAAA,KAAA,GAwDA,QAAA,cAAA,EAAA,GACA,SAAA,KAAA,MAEA,KAAA,QAAA,EACA,KAAA,MAAA,QAAA,GAEA,KAAA,gBAAA,OA0DA,QAAA,kBAAA,GACA,SAAA,KAAA,MAEA,KAAA,qBAAA,EACA,KAAA,UACA,KAAA,gBAAA,OAEA,KAAA,aA+IA,QAAA,SAAA,GAAA,MAAA,GAGA,QAAA,mBAAA,EAAA,EAAA,EACA,GAEA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,EAEA,KAAA,YAAA,GAAA,QACA,KAAA,YAAA,GAAA,QAIA,KAAA,oBAAA,EAgEA,QAAA,6BAAA,EAAA,EAAA,GAKA,IAAA,GAHA,MACA,KAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,qBAAA,EAAA,OAQA,EAAA,OAAA,KAEA,EAAA,EAAA,MAAA,EAAA,UAEA,UAAA,EAAA,OAKA,OAAA,EAAA,KAYA,EAAA,OAAA,UACA,GAAA,EAAA,YAEA,GAAA,EAAA,OAEA,EAAA,EAAA,OAAA,EAhBA,EAAA,OAAA,SACA,GAAA,EAAA,MAEA,EAAA,EAAA,OAAA,KAnBA,QAAA,MAAA,8BAAA,EAAA,MACA,QAAA,MAAA,IAmCA,IAAA,GAAA,KAAA,GACA,EAAA,GAAA,EAAA,EAEA,KAAA,GAAA,KAAA,GACA,EAAA,GAAA,MAEA,IAAA,KACA,KAAA,GAAA,KAAA,GAEA,KAAA,IAAA,IAAA,IAAA,IAAA,CAKA,GAAA,GAAA,EAAA,EAEA,GAAA,KAAA,IACA,EAAA,GAAA,GAIA,OAEA,MAAA,EACA,QAAA,EACA,QAAA,GAMA,QAAA,WAAA,EAAA,EAAA,GACA,OAEA,MAAA,EAEA,QAAA,EACA,WAAA,GAWA,QAAA,gBC55CA,QAAA,aAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,MAAA,aAAA,YAAA,EAAA,EAAA,EACA,EAAA,EAAA,GAIA,QAAA,WAAA,EAAA,EAAA,EAAA,GAEA,MAAA,GAAA,GAAA,EAAA,EACA,GAIA,GAAA,GAAA,GAAA,EACA,EAGA,EAAA,EACA,EAAA,EACA,EAAA,EAGA,EAAA,EAGA,EAAA,EACA,EAAA,EAEA,EAAA,EAKA,QAAA,aAAA,EAAA,EAAA,EAAA,GASA,IAAA,GAPA,GAAA,UAAA,EAAA,EAAA,GAGA,GAAA,EAEA,EAAA,EAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAEA,GAAA,GAAA,EAAA,EAGA,IAFA,EAAA,OAAA,GAEA,EAAA,CAIA,GAAA,GAAA,UAAA,EAAA,MACA,EAAA,MAAA,EAAA,QAAA,OACA,EAAA,MAEA,EAAA,MAAA,EAAA,WAEA,IAAA,GAAA,EAAA,CAGA,EAAA,OAAA,EAAA,GACA,IAGA,GAAA,EAAA,WAAA,EAAA,QAAA,OAEA,EAAA,YAAA,EAAA,WAAA,CAEA,IAAA,GAAA,EAAA,QAAA,OACA,EAAA,QAAA,OAAA,CAGA,IAAA,EAAA,YAAA,EAGA,CACA,GAAA,GAAA,EAAA,OAGA,IAAA,EAAA,MAAA,EAAA,MAAA,CAGA,GAAA,GAAA,EAAA,QAAA,MAAA,EAAA,EAAA,MAAA,EAAA,MACA,OAAA,UAAA,KAAA,MAAA,EAAA,GACA,EAAA,EAGA,GAAA,EAAA,MAAA,EAAA,QAAA,OAAA,EAAA,MAAA,EAAA,WAAA,CAEA,GAAA,GAAA,EAAA,QAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MACA,OAAA,UAAA,KAAA,MAAA,EAAA,GAIA,EAAA,QAAA,EACA,EAAA,MAAA,EAAA,QACA,EAAA,MAAA,EAAA,WAtBA,IAAA,MAyBA,IAAA,EAAA,MAAA,EAAA,MAAA,CAIA,GAAA,EAEA,EAAA,OAAA,EAAA,EAAA,GACA,GAEA,IAAA,GAAA,EAAA,WAAA,EAAA,QAAA,MACA,GAAA,OAAA,EACA,GAAA,IAIA,GAEA,EAAA,KAAA,GAGA,QAAA,sBAAA,EAAA,GAGA,IAAA,GAFA,MAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,EAAA,MAEA,IAAA,SACA,YAAA,EAAA,EAAA,MAAA,EAAA,QAAA,QAAA,EAAA,WACA,MACA,KAAA,MAEA,IAAA,SACA,IAAA,SACA,IAAA,QAAA,EAAA,MACA,QACA,IAAA,GAAA,SAAA,EAAA,KACA,IAAA,EAAA,EACA,QACA,aAAA,EAAA,GAAA,EAAA,UAAA,EACA,MACA,SACA,QAAA,MAAA,2BAAA,KAAA,UAAA,KAMA,MAAA,GAGA,QAAA,qBAAA,EAAA,GAEA,GAAA,KAeA,OAbA,sBAAA,EAAA,GAAA,QAAA,SAAA,GACA,MAAA,IAAA,EAAA,YAAA,GAAA,EAAA,QAAA,YACA,EAAA,QAAA,KAAA,EAAA,EAAA,QACA,EAAA,KAAA,SAMA,EAAA,EAAA,OAAA,YAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,WACA,EAAA,QAAA,EAAA,EAAA,QAAA,YAGA,ED5QA,GAAA,YAAA,sBAqBA,QAAA,aAgBA,YAAA,OAAA,OAAA,OAAA,SAAA,GAEA,MAAA,gBAAA,IAAA,OAAA,MAAA,IAeA,aAAA,gBACA,SAAA,GAAA,MAAA,IACA,SAAA,GACA,GAAA,GAAA,EAAA,SACA,KAAA,EACA,MAAA,EACA,IAAA,GAAA,OAAA,OAAA,EAMA,OALA,QAAA,oBAAA,GAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EACA,OAAA,yBAAA,EAAA,MAGA,GAIA,WAAA,aACA,UAAA,gBAEA,YAAA,GAAA,QAAA,IAAA,WAAA,IAAA,UAAA,MAkDA,kBACA,YAEA,IAAA,cACA,OAAA,UAAA,UACA,KAAA,iBACA,KAAA,cAIA,QACA,IAAA,UACA,KAAA,eACA,KAAA,iBAEA,KAAA,cAGA,aACA,IAAA,eAEA,OAAA,UAAA,WAIA,SACA,OAAA,UAAA,UAEA,GAAA,UAAA,UACA,QAAA,UAAA,UACA,IAAA,SAAA,QACA,KAAA,cAAA,QAEA,KAAA,gBAAA,QACA,KAAA,YAAA,SAIA,eACA,IAAA,iBACA,GAAA,YAAA,UACA,QAAA,UAAA,UACA,KAAA,gBAAA,SAAA,IACA,KAAA,gBAAA,SAAA,KAIA,WAEA,IAAA,eAAA,QACA,KAAA,SAAA,SAGA,SACA,GAAA,UAAA,UACA,QAAA,UAAA,UACA,IAAA,gBACA,KAAA,SAAA,SAIA,eAEA,KAAA,gBACA,KAAA,SAEA,QAAA,gBAAA,WAIA,eACA,KAAA,gBAEA,KAAA,SACA,QAAA,gBAAA,WAIA,cACA,IAAA,gBACA,KAAA,SAAA,UA8FA,wBAgBA,YAwCA,MAAA,IAAA,QAYA,KAAA,UAAA,cAEA,aACA,OAAA,EAEA,SAAA,WAGA,IAAA,GAFA,GAAA,GAEA,EAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CACA,GAAA,GAAA,KAAA,EAEA,IADA,QAAA,GACA,EAAA,IAAA,EAAA,EAGA,eAAA,GAMA,MAAA,IAIA,aAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CACA,GAAA,MAAA,EAEA,MACA,GAAA,EAAA,KAAA,IAGA,MAAA,IAIA,eAAA,SAAA,EAAA,GAEA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CAGA,GAFA,IACA,EAAA,EAAA,KAAA,EAAA,MACA,SAAA,GACA,MACA,GAAA,EAAA,KAAA,MAKA,uBAAA,WAEA,GAAA,GAAA,GACA,EAAA,KACA,IAAA,iBAGA,KAFA,GACA,GADA,EAAA,EAEA,EAAA,KAAA,OAAA,EAAA,IAEA,EAAA,KAAA,GACA,GAAA,QAAA,GAAA,IAAA,EAAA,eAAA,GACA,GAAA,aAAA,EAAA,UAGA,IAAA,KAEA,IAAA,GAAA,KAAA,EAKA,OAHA,IAAA,QAAA,GAAA,IAAA,EAAA,eAAA,GAEA,GAAA,YAAA,EAAA,+BACA,GAAA,UAAA,MAAA,IAGA,aAAA,SAAA,EAAA,GACA,IAAA,KAAA,OACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,EAAA,IAAA,CACA,IAAA,SAAA,GACA,OAAA,CAEA,GAAA,EAAA,KAAA,IAIA,MAAA,UAAA,IAIA,EAAA,KAAA,IAAA,GACA,IAJA,IASA,IAAA,aAAA,GAAA,MAAA,GAAA,qBACA,aAAA,OAAA,EACA,YAAA,aAAA,YAAA,aAAA,YAGA,IAAA,wBAAA,IAsEA,YAcA,OAAA,WAAA,WACA,GAAA,IAAA,UAAA,GACA,GAAA,CASA,OAPA,QAAA,QAAA,EAAA,WAEA,cACA,GAAA,IAIA,SAAA,GACA,SAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,UAAA,EAAA,cAKA,WACA,MAAA,UAAA,GACA,SAAA,KAAA,OAKA,uBAuFA,oBAsHA,gBAaA,SAAA,EACA,OAAA,EACA,OAAA,EAEA,UAAA,EAEA,eAAA,CAaA,UAAA,WACA,KAAA,SAAA,EAAA,GAEA,GAAA,KAAA,QAAA,SACA,KAAA,OAAA,oCAQA,OALA,UAAA,MACA,KAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,WACA,KAAA,OAAA,OACA,KAAA,QAIA,MAAA,WAEA,KAAA,QAAA,SAGA,cAAA,MACA,KAAA,cACA,KAAA,OAAA,OACA,KAAA,UAAA,OACA,KAAA,QAAA,OAEA,KAAA,OAAA,SAIA,QAAA,WACA,KAAA,QAAA,QAGA,WAAA,OAIA,QAAA,SAAA,GACA,IACA,KAAA,UAAA,MAAA,KAAA,QAAA,GAEA,MAAA,GACA,SAAA,4BAAA,EACA,QAAA,MAAA,+CAEA,EAAA,OAAA,MAIA,eAAA,WAIA,MAFA,MAAA,OAAA,QAAA,GAEA,KAAA,QAMA,IAAA,mBAAA,WAEA,YACA,UAAA,mBAAA,EAEA,mBACA,gBAmBA,IAAA,6BAAA,EAEA,0BAAA,YAAA,WACA,IAEA,MADA,MAAA,qBACA,EACA,MAAA,IAEA,OAAA,KAKA,QAAA,SAAA,OAAA,aAGA,OAAA,SAAA,2BAAA,WACA,IAAA,2BAAA,CAIA,GAAA,0BAGA,WADA,MAAA,mBAKA,IAAA,iBAAA,CAIA,4BAAA,CAGA,IAAA,QAAA,EAEA,WAAA,OAEA,GAAA,CACA,SACA,QAAA,aAEA,gBACA,YAAA,CAGA,KAAA,GAAA,GAAA,EAAA,EAAA,QAAA,OAAA,IAAA,CACA,GAAA,UAAA,QAAA,EACA,UAAA,QAAA,SAIA,SAAA,WACA,YAAA,GAGA,aAAA,KAAA,WAEA,gBACA,YAAA,SACA,uBAAA,QAAA,WAGA,QAAA,0BAEA,OAAA,qBAAA,QAEA,4BAAA,KAIA,mBAEA,OAAA,SAAA,eAAA,WACA,kBAWA,eAAA,UAAA,cACA,UAAA,SAAA,UAGA,cAAA,EAGA,SAAA,WACA,WAEA,KAAA,gBAAA,kBAAA,KAAA,KAAA,OACA,KAAA,cAEA,KAAA,WAAA,KAAA,WAAA,KAAA,SAMA,WAAA,SAAA,GACA,GAAA,GAAA,MAAA,QAAA,QACA,KAAA,GAAA,KAAA,GACA,EAAA,GAAA,EAAA,EAMA,OAHA,OAAA,QAAA,KACA,EAAA,OAAA,EAAA,QAEA,GAGA,OAAA,SAAA,GACA,GAAA,GACA,CACA,IAAA,WAAA,CAEA,IAAA,EACA,OAAA,CAGA,MACA,EAAA,4BAAA,KAAA,OAAA,EACA,OAEA,GAAA,KAAA,WACA,EAAA,wBAAA,KAAA,OAAA,KAAA,WAIA,OAAA,aAAA,IAEA,GAEA,aAEA,KAAA,WAAA,KAAA,WAAA,KAAA,SAEA,KAAA,SACA,EAAA,UACA,EAAA,YAEA,EAAA,YACA,SAAA,GAEA,MAAA,GAAA,OAIA,IAGA,YAAA,WAEA,YACA,KAAA,gBAAA,QACA,KAAA,gBAAA,QAEA,KAAA,WAAA,QAIA,QAAA,WACA,KAAA,QAAA,SAGA,WACA,KAAA,gBAAA,SAAA,GAGA,WAAA,QAIA,eAAA,WAQA,MAPA,MAAA,gBAEA,KAAA,gBAAA,SAAA,GAEA,KAAA,WAAA,KAAA,WAAA,KAAA,QAGA,KAAA,UAaA,cAAA,UAAA,cAEA,UAAA,eAAA,UAEA,cAAA,EAEA,WAAA,SAAA,GACA,MAAA,GAAA,SAGA,OAAA,SAAA,GAEA,GAAA,EACA,IAAA,WAAA,CACA,IAAA,EACA,OAAA,CACA,GAAA,oBAAA,KAAA,OAAA,OAEA,GAAA,YAAA,KAAA,OAAA,EAAA,KAAA,OAAA,OACA,KAAA,WAAA,EAAA,KAAA,WAAA,OAIA,OAAA,IAAA,EAAA,QAGA,aACA,KAAA,WAAA,KAAA,WAAA,KAAA,SAGA,KAAA,SAAA,KACA,IAPA,KAYA,cAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,QAAA,SAAA,GAIA,IAFA,GAAA,IAAA,EAAA,MAAA,EAAA,QAAA,QACA,EAAA,EAAA,MACA,EAAA,EAAA,MAAA,EAAA,YACA,EAAA,KAAA,EAAA,IACA,GAIA,OAAA,UAAA,OAAA,MAAA,EAAA,MAaA,aAAA,UAAA,cACA,UAAA,SAAA,UAGA,GAAA,QACA,MAAA,MAAA,OAIA,SAAA,WACA,aACA,KAAA,gBAAA,eAAA,KAAA,KAAA,UAEA,KAAA,OAAA,QAAA,IAKA,YAAA,WACA,KAAA,OAAA,OAGA,KAAA,kBACA,KAAA,gBAAA,MAAA,MACA,KAAA,gBAAA,SAMA,gBAAA,SAAA,GACA,KAAA,MAAA,eAAA,KAAA,QAAA,IAGA,OAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,MAEA,OADA,MAAA,OAAA,KAAA,MAAA,aAAA,KAAA,SACA,GAAA,aAAA,KAAA,OAAA,IAEA,GAGA,KAAA,SAAA,KAAA,OAAA,EAAA,QACA,IAIA,SAAA,SAAA,GACA,KAAA,OAEA,KAAA,MAAA,aAAA,KAAA,QAAA,KAeA,IAAA,oBAEA,kBAAA,UAAA,cACA,UAAA,SAAA,UAGA,SAAA,WACA,GAAA,WAAA,CAKA,IAAA,GAJA,GAEA,GAAA,EAEA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EAGA,GADA,EAAA,KAAA,UAAA,GACA,IAAA,iBAAA,CACA,GAAA,CACA,OAIA,IACA,KAAA,gBAAA,eAAA,KAAA,IAGA,KAAA,OAAA,QAAA,KAAA,uBAGA,YAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EACA,KAAA,UAAA,KAAA,kBAEA,KAAA,UAAA,EAAA,GAAA,OAEA,MAAA,UAAA,OAAA,EACA,KAAA,OAAA,OAAA,EAGA,KAAA,kBACA,KAAA,gBAAA,MAAA,MACA,KAAA,gBAAA,SAKA,QAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UACA,KAAA,OAAA,iCAEA,IAAA,GAAA,QAAA,EAEA,IADA,KAAA,UAAA,KAAA,EAAA,GACA,KAAA,qBAAA,CAGA,GAAA,GAAA,KAAA,UAAA,OAAA,EAAA,CACA,MAAA,OAAA,GAAA,EAAA,aAAA,KAIA,YAAA,SAAA,GACA,GAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UACA,KAAA,OAAA,qCAGA,IADA,KAAA,UAAA,KAAA,iBAAA,GACA,KAAA,qBAAA,CAEA,GAAA,GAAA,KAAA,UAAA,OAAA,EAAA,CACA,MAAA,OAAA,GAAA,EAAA,KAAA,KAAA,QAAA,QAGA,WAAA,WACA,GAAA,KAAA,QAAA,OACA,KAAA,OAAA,4BAEA,MAAA,OAAA,UACA,KAAA,eAGA,YAAA,WAEA,GAAA,KAAA,QAAA,UACA,KAAA,OAAA,wCAKA,OAJA,MAAA,OAAA,OACA,KAAA,WAGA,KAAA,QAGA,gBAAA,SAAA,GAEA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EACA,EAAA,KAAA,UAAA,GACA,IAAA,kBACA,KAAA,UAAA,EAAA,GAAA,eAAA,EAAA,IAIA,OAAA,SAAA,EAAA,GAEA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EAAA,CACA,GAEA,GAFA,EAAA,KAAA,UAAA,GACA,EAAA,KAAA,UAAA,EAAA,EAEA,IAAA,IAAA,iBAAA,CAEA,GAAA,GAAA,CACA,GAAA,KAAA,SAAA,SACA,EAAA,KAAA,KAAA,QAAA,MAEA,EAAA,qBAEA,GAAA,EAAA,aAAA,EAGA,GACA,KAAA,OAAA,EAAA,GAAA,EAIA,aAAA,EAAA,KAAA,OAAA,EAAA,MAIA,EAAA,MACA,EAAA,EAAA,GAAA,KAAA,OAAA,EAAA,GACA,KAAA,OAAA,EAAA,GAAA,GAGA,MAAA,IAKA,KAAA,SAAA,KAAA,OAAA,EAAA,KAAA,aACA,IALA,KA8BA,kBAAA,WACA,KAAA,SAAA,EAAA,GAOA,MALA,MAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,OAEA,KAAA,YAAA,KAAA,YAAA,KAAA,KAAA,kBAAA,OACA,KAAA,QAGA,kBAAA,SAAA,GAEA,GADA,EAAA,KAAA,YAAA,IACA,aAAA,EAAA,KAAA,QAAA,CAEA,GAAA,GAAA,KAAA,MACA,MAAA,OAAA,EACA,KAAA,UAAA,KAAA,KAAA,QAAA,KAAA,OAAA,KAIA,eAAA,WAEA,MADA,MAAA,OAAA,KAAA,YAAA,KAAA,YAAA,kBACA,KAAA,QAIA,QAAA,WAEA,MAAA,MAAA,YAAA,WAGA,SAAA,SAAA,GAEA,MADA,GAAA,KAAA,YAAA,IACA,KAAA,qBAAA,KAAA,YAAA,SAEA,KAAA,YAAA,SAAA,GAFA,QAKA,MAAA,WACA,KAAA,aACA,KAAA,YAAA,QAEA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,YAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,OAEA,KAAA,YAAA,QAIA,IAAA,sBAEA,KAAA,EACA,QAAA,EACA,UAAA,GA0FA,WAAA,EACA,YAAA,EACA,SAAA,EAEA,YAAA,CAIA,aAAA,WAeA,kBAAA,SAAA,EAAA,EAAA,EAEA,EAAA,EAAA,GASA,IAAA,GANA,GAAA,EAAA,EAAA,EAEA,EAAA,EAAA,EAAA,EACA,EAAA,GAAA,OAAA,GAGA,EAAA,EAAA,EAAA,EAAA,IAEA,EAAA,GAAA,GAAA,OAAA,GACA,EAAA,GAAA,GAAA,CAMA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,GAAA,KAAA,OAAA,EAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,EAAA,EAAA,GAAA,EAAA,OACA,CACA,GAAA,GAAA,EAAA,EAAA,GAAA,GAAA,EACA,EAAA,EAAA,GAAA,EAAA,GAAA,CACA,GAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAKA,MAAA,IAOA,kCAAA,SAAA,GAOA,IANA,GAAA,GAAA,EAAA,OAAA,EAEA,EAAA,EAAA,GAAA,OAAA,EACA,EAAA,EAAA,GAAA,GAEA,KACA,EAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAOA,GAAA,GAAA,EAAA,CAOA,GAIA,GAJA,EAAA,EAAA,EAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,GAAA,GACA,EAAA,EAAA,GAAA,EAAA,EAIA,GADA,EAAA,EACA,EAAA,EAAA,EAAA,EAGA,EAAA,EAAA,EAAA,EAEA,GAAA,GACA,GAAA,EACA,EAAA,KAAA,aEnrDA,EAAA,KAAA,aACA,EAAA,GDAA,IACA,KAEA,GAAA,GAEA,EAAA,KAAA,aACA,IAEA,EAAA,IAEA,EAAA,KAAA,UAEA,IACA,EAAA,ODkpDA,GAAA,KAAA,aAEA,QATA,GAAA,KAAA,UAEA,GCvoDA,OAFA,GAAA,UAEA,GAgCA,YAAA,SAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,GAAA,GAAA,EACA,EAAA,EAEA,EAAA,KAAA,IAAA,EAAA,EAAA,EAAA,EAaA,IAZA,GAAA,GAAA,GAAA,IACA,EAAA,KAAA,aAAA,EAAA,EAAA,IAEA,GAAA,EAAA,QAAA,GAAA,EAAA,SACA,EAAA,KAAA,aAAA,EAAA,EAAA,EAAA,IAEA,GAAA,EAEA,GAAA,EACA,GAAA,EACA,GAAA,EAEA,EAAA,GAAA,GAAA,EAAA,GAAA,EACA,QAGA,IAAA,GAAA,EAAA,CAEA,IADA,GAAA,GAAA,UAAA,KAAA,GACA,EAAA,GACA,EAAA,QAAA,KAAA,EAAA,KAGA,QAAA,GACA,GAAA,GAAA,EACA,OAAA,UAAA,KAAA,EAAA,GAYA,KAAA,GATA,GAAA,KAAA,kCACA,KAAA,kBAAA,EAAA,EAAA,EACA,EAAA,EAAA,IAGA,EAAA,OACA,KACA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,OAAA,EAAA,IAEA,IAAA,YACA,IAEA,EAAA,KAAA,GACA,EAAA,QAIA,IAEA,GACA,MACA,KAAA,aAEA,IAEA,EAAA,UAAA,KAAA,IAEA,EAAA,aACA,IAEA,EAAA,QAAA,KAAA,EAAA,IACA,GACA,MAEA,KAAA,UACA,IACA,EAAA,UAAA,KAAA,IAGA,EAAA,aACA,GAEA,MACA,KAAA,aACA,IACA,EAAA,UAAA,KAAA,IAGA,EAAA,QAAA,KAAA,EAAA,IACA,IASA,MAHA,IACA,EAAA,KAAA,GAEA,GAIA,aAAA,SAAA,EAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,IAAA,KAAA,OAAA,EAAA,GAAA,EAAA,IACA,MAAA,EACA,OAAA,IAGA,aAAA,SAAA,EAAA,EAAA,GAKA,IAJA,GAAA,GAAA,EAAA,OAEA,EAAA,EAAA,OACA,EAAA,EACA,EAAA,GAAA,KAAA,OAAA,IAAA,GAAA,IAAA,KACA,GAEA,OAAA,IAKA,iBAAA,SAAA,EAAA,GACA,MAAA,MAAA,YAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAEA,EAAA,SAGA,OAAA,SAAA,EAAA,GACA,MAAA,KAAA,GAIA,IAAA,aAAA,GAAA,YA8KA,QAAA,SAAA,SACA,OAAA,SAAA,QAAA,OACA,OAAA,SAAA,kBAAA,iBACA,OAAA,SAAA,iBAAA,WAEA,OAAA,cAAA,cACA,OAAA,cAAA,iBAAA,SAAA,EAAA,GACA,MAAA,aAAA,iBAAA,EAAA,IAIA,OAAA,YAAA,YACA,OAAA,eAAA,eACA,OAAA,aAAA,aACA,OAAA,iBAAA,iBAEA,OAAA,KAAA,KACA,OAAA,kBAAA,mBACA,mBAAA,SAAA,QAAA,mBAAA,SAAA,OAAA,OAAA,MAAA,QAIA,SAAA,MAAA,QAMA,OAAA,qBAEA,SAAA,GACA,YAMA,SAAA,KAIA,GAAA,mBAAA,SAAA,OAAA,KAAA,OAAA,IAAA,QACA,OAAA,CAGA,KACA,GAAA,GAAA,GAAA,UAAA,eACA,OAAA,KACA,MAAA,GACA,OAAA,GAMA,QAAA,GAAA,GACA,IAAA,EACA,KAAA,IAAA,OAAA,oBEvZA,QAAA,GAAA,EAAA,GAGA,IAAA,GAFA,GAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,EAAA,EAAA,EAAA,EAAA,IAGA,MAAA,GAGA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,GAEA,IAAA,YACA,IAAA,SACA,IAAA,SACA,IAAA,OACA,IAAA,YAEA,IAAA,WACA,SAEA,EAAA,EAAA,EAAA,EAAA,EAAA,IAGA,MAAA,GAIA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,IAAA,GACA,MAAA,GAAA,GCnCA,QAAA,GAAA,EAAA,EAAA,GAEA,EAAA,MAAA,EACA,EAAA,EAAA,EAAA,GAUA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,WAAA,OAAA,eAAA,GACA,EAAA,EAAA,IAAA,EAEA,IAAA,EACA,MAAA,EAGA,IAAA,GAAA,EAAA,GAEA,EAAA,EAAA,EAGA,OAFA,GAAA,EAAA,EAAA,GAEA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAAA,GAeA,QAAA,GAAA,GACA,MAAA,aAAA,KAAA,GAIA,QAAA,GAAA,GACA,MAAA,oBAAA,KAAA,GAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,oBAAA,GACA,WAAA,MAAA,MAAA,KAAA,IAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,IAAA,aAAA,EAAA,QACA,SAAA,GAAA,KAAA,KAAA,GAAA,GAGA,QAAA,GAAA,GAEA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,oBAAA,EACA,gCACA,WAAA,MAAA,MAAA,KAAA,GAAA,MAAA,KAAA,KAAA,YAGA,QAAA,GAAA,EAAA,GACA,IACA,MAAA,QAAA,yBAAA,EAAA,GACA,MAAA,GAKA,MAAA,IAIA,QAAA,GAAA,EAAA,EAAA,GAGA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,sBAAA,KAGA,IAAA,IAGA,EAAA,mBAAA,EAAA,kBAAA,IAAA,CAIA,GAEA,EAAA,iBAAA,EAGA,IACA,GAAA,EADA,EAAA,EAAA,EAAA,EAEA,IAAA,GAAA,kBAAA,GAAA,MACA,EAAA,GAAA,EAAA,OADA,CAMA,GAAA,GAAA,EAAA,EAEA,GADA,EACA,EAAA,sBAAA,GAGA,EAAA,IAGA,EAAA,UAAA,EAAA,OAEA,EADA,EACA,EAAA,sBAAA,GAGA,EAAA,IAGA,EAAA,EAAA,GACA,IAAA,EACA,IAAA,EACA,aAAA,EAAA,aACA,WAAA,EAAA,gBAcA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,EAAA,SACA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,EAAA,SACA,GAAA,SAAA,EAAA,IAAA,IAGA,EAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAGA,EAAA,EAAA,GACA,GACA,EAAA,EAAA,GAGA,EAEA,EAAA,cAAA,GAGA,EAAA,UAAA,EAIA,QAAA,GAAA,EAAA,GAEA,MAAA,GAAA,IAAA,EAAA,aACA,EAUA,QAAA,GAAA,GACA,GAAA,GAAA,OAAA,eAAA,GAEA,EAAA,EAAA,GACA,EAAA,EAAA,EAIA,OAFA,GAAA,EAAA,EAAA,GAEA,EAGA,QAAA,GAAA,GAEA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAEA,GAAA,GAAA,OAAA,OAAA,EAAA,UAKA,OAJA,GAAA,YAAA,EACA,EAAA,UAAA,EAGA,EAcA,QAAA,GAAA,GAEA,MAAA,aAAA,GAAA,aACA,YAAA,GAAA,OACA,YAAA,GAAA,OACA,YAAA,GAAA,mBACA,YAAA,GAAA,0BACA,EAAA,uBACA,YAAA,GAAA,sBAGA,QAAA,GAAA,GAEA,MAAA,IAAA,YAAA,IACA,YAAA,IACA,YAAA,IAEA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IAEA,GAEA,YAAA,IACA,GACA,YAAA,GAUA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MAGA,EAAA,EAAA,IACA,EAAA,kBACA,EAAA,gBAAA,IAAA,EAAA,IAAA,KASA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MACA,EAAA,EAAA,IACA,EAAA,MASA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GAAA,EAAA,GAAA,EASA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,GAAA,EAAA,GAAA,EAUA,QAAA,GAAA,EAAA,GACA,OAAA,IAEA,EAAA,EAAA,IACA,EAAA,SAAA,GAAA,EAAA,IACA,EAAA,gBAAA,GAUA,QAAA,GAAA,EAAA,EAAA,GAEA,EAAA,IAAA,EACA,EAAA,EAAA,UAAA,EAAA,GAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,WACA,MAAA,GAAA,KAAA,KAAA,MAYA,QAAA,GAAA,EAAA,GACA,EAAA,QAAA,SAAA,GACA,EAAA,QAAA,SAAA,GACA,EAAA,UAAA,GAAA,WAEA,GAAA,GAAA,EAAA,KACA,OAAA,GAAA,GAAA,MAAA,EAAA,gBHsBA,GAAA,GAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,OAAA,OAAA,MAkBA,EAAA,IExZA,EAAA,OAAA,eACA,EAAA,OAAA,oBACA,EAAA,OAAA,yBA6CA,GChDA,MAAA,OACA,cAAA,EACA,YAAA,EACA,UAAA,EAeA,GAAA,OA2BA,IAAA,GAAA,UAAA,KAAA,UAAA,WAIA,GACA,IAAA,aACA,IAAA,aACA,cAAA,EACA,YAAA,GA+KA,EAAA,OAAA,kBACA,EAAA,OAAA,YACA,EAAA,OAAA,MACA,EAAA,OAAA,KACA,EAAA,OAAA,OACA,EAAA,OAAA,MACA,EAAA,OAAA,yBACA,EAAA,OAAA,sBACA,EAAA,OAAA,mBAiGA,GACA,IAAA,OACA,cAAA,EAEA,YAAA,EC/UA,GAAA,OAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,EAEA,EAAA,iBAAA,EACA,EAAA,wBAAA,EAEA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,MAAA,EACA,EAAA,qBAAA,EACA,EAAA,MAAA,EACA,EAAA,eAAA,EACA,EAAA,gBAAA,EACA,EAAA,OAAA,EACA,EAAA,OAAA,EACA,EAAA,eAAA,EACA,EAAA,KAAA,EACA,EAAA,aAAA,EACA,EAAA,SAAA,GAEA,OAAA,mBAUA,SAAA,GACA,YAQA,SAAA,KACA,GAAA,CACA,IAAA,GAAA,EAAA,MAAA,EACA,KACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,KAqBA,QAAA,GAAA,GACA,EAAA,KAAA,GACA,IAEA,GAAA,EACA,EAAA,EAAA,IAtCA,GAIA,GAJA,EAAA,OAAA,iBACA,KAEA,GAAA,CAaA,IAAA,EAAA,CACA,GAAA,GAAA,EACA,EAAA,GAAA,GAAA,GACA,EAAA,SAAA,eAAA,EACA,GAAA,QAAA,GAAA,eAAA,IAEA,EAAA,WAEA,GAAA,EAAA,GAAA,EACA,EAAA,KAAA,OAKA,GAAA,OAAA,cAAA,OAAA,UAYA,GAAA,kBAAA,GC9EA,OAAA,mBAUA,SAAA,GACA,YAWA,SAAA,KACA,IAEA,EAAA,GACA,GAAA,GAMA,QAAA,KACA,GAAA,CAGA,GAGA,KAAA,GAFA,GAAA,EAAA,QACA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,aACA,GAAA,GACA,EAAA,SACA,EAAA,UAAA,EAAA,GACA,GAAA,SAGA,GASA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EAEA,KAAA,WAAA,GAAA,GAAA,SACA,KAAA,aAAA,GAAA,GAAA,SACA,KAAA,gBAAA,KAEA,KAAA,YAAA,KACA,KAAA,cAAA,KACA,KAAA,mBAAA,KACA,KAAA,SAAA,KAUA,QAAA,GAAA,EAAA,GACA,KAAA,EAAA,EAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAEA,GAAA,QAAA,SACA,EAAA,qBAAA,KAMA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,OAAA,GACA,EAAA,EAAA,IAAA,EACA,KAAA,EACA,MACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,WAAA,GACA,EAAA,6BAOA,QAAA,GAAA,EAAA,EAAA,GAQA,IAAA,GANA,GAAA,OAAA,OAAA,MAEA,EAAA,OAAA,OAAA,MAIA,EAAA,EAAA,EAAA,EAAA,EAAA,WAAA,CAEA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAGA,KAAA,IAAA,GAAA,EAAA,YAKA,eAAA,IAAA,EAAA,YAOA,eAAA,GAAA,EAAA,kBAEA,OAAA,EAAA,WACA,KAAA,EAAA,gBAAA,QAAA,EAAA,QAKA,kBAAA,IAAA,EAAA,eAMA,cAAA,IAAA,EAAA,WAAA,CAIA,GAAA,GAAA,EAAA,QACA,GAAA,EAAA,MAAA,GAOA,eAAA,GAAA,EAAA,mBACA,kBAAA,GAAA,EAAA,yBACA,EAAA,EAAA,MAAA,EAAA,YAMA,GAAA,IAAA,CAIA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,GAAA,GAAA,EAAA,EAKA,SAAA,IAAA,aAAA,KACA,EAAA,cAAA,EAAA,KAEA,EAAA,mBAAA,EAAA,WAKA,EAAA,aACA,EAAA,WAAA,EAAA,YAGA,EAAA,eACA,EAAA,aAAA,EAAA,cAGA,EAAA,kBACA,EAAA,gBAAA,EAAA,iBAIA,EAAA,cAEA,EAAA,YAAA,EAAA,aAIA,SAAA,EAAA,KACA,EAAA,SAAA,EAAA,IAIA,EAAA,SAAA,KAAA,GAEA,GAAA,EAIA,GACA,IASA,QAAA,GAAA,GA2BA,GAzBA,KAAA,YAAA,EAAA,UACA,KAAA,UAAA,EAAA,QAWA,KAAA,WALA,cAAA,MACA,qBAAA,IAAA,mBAAA,MAIA,EAAA,YAFA,EAUA,KAAA,cADA,yBAAA,MAAA,iBAAA,KACA,IAEA,EAAA,eAGA,KAAA,aACA,EAAA,mBAAA,mBAAA,MAEA,KAAA,eAAA,EAAA,sBAEA,KAAA,IAAA,UAOA,IAJA,KAAA,gBAAA,EAAA,cACA,KAAA,oBAAA,EAAA,kBACA,KAAA,wBAAA,EAAA,sBAEA,mBAAA,GAAA,CACA,GAAA,MAAA,EAAA,iBACA,gBAAA,GAAA,gBACA,KAAA,IAAA,UAEA,MAAA,gBAAA,EAAA,KAAA,EAAA,qBAGA,MAAA,gBAAA,KAeA,QAAA,GAAA,GACA,KAAA,UAAA,EAEA,KAAA,UACA,KAAA,YACA,KAAA,OAAA,EAIA,EAAA,KAAA,MAgFA,QAAA,GAAA,EAAA,EAAA,GAEA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BA1XA,GAAA,GAAA,EAAA,kBAEA,EAAA,EAAA,aACA,EAAA,EAAA,SAEA,EAAA,GAAA,SACA,KACA,GAAA,EAiNA,EAAA,MAAA,UAAA,MA0DA,EAAA,CAuBA,GAAA,WAGA,QAAA,SAAA,EAAA,GACA,EAAA,EAAA,EAEA,IAIA,GAJA,EAAA,GAAA,GAAA,GAKA,EAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,KAGA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,WAAA,OACA,EAAA,EAAA,GAGA,EAAA,2BAEA,EAAA,QAAA,EAOA,KAEA,EAAA,GAAA,GAAA,KAAA,EAAA,GACA,EAAA,KAAA,GAEA,KAAA,OAAA,KAAA,KAMA,WAAA,WAEA,KAAA,OAAA,QAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,WAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,UAIA,MACA,KAAA,aAGA,YAAA,WACA,GAAA,GAAA,KAAA,QAEA,OADA,MAAA,YACA,IAuBA,EAAA,WAOA,qBAAA,SAAA,GAGA,GAAA,IAAA,KAAA,OAAA,CAKA,KAAA,uBAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,MAMA,EAAA,KAAA,QAGA,yBAAA,WACA,GAAA,GAAA,KAAA,sBACA,MAAA,yBAGA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAIA,IAAA,GAHA,GAAA,EAAA,GAEA,EAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,KAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,UAOA,EAAA,gBAAA,EACA,EAAA,2BAAA,EACA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,eAAA,GAGA,OAAA,mBASA,SAAA,GACA,YAgBA,SAAA,GAAA,EAAA,GAEA,KAAA,KAAA,EAGA,KAAA,OAAA,EAqBA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,aAAA,EAAA,CACA,EAAA,WAAA,CACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,gBACA,EAAA,WAAA,OAAA,CAGA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,EAAA,IAKA,QAAA,GAAA,GAKA,GAJA,YAAA,GAAA,SAAA,OAIA,EAAA,WACA,MAAA,GAAA,UACA,IACA,GADA,EAAA,EAAA,UAMA,OAHA,GADA,EACA,EAAA,GAEA,GAAA,GAAA,EAAA,MACA,EAAA,WAAA,EA5CA,EAAA,WACA,GAAA,YACA,MAAA,MAAA,eAAA,GAAA,SAAA,WACA,EAAA,mBAAA,KAAA,KAAA,MAEA,MAGA,SAAA,SAAA,GACA,KAAA,EAAA,EAAA,EAAA,OACA,GAAA,IAAA,KACA,OAAA,CAEA,QAAA,IAkCA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,aAAA,GAGA,OAAA,mBAOA,SAAA,GACA,YA6BA,SAAA,GAAA,GACA,MAAA,aAAA,GAAA,WAGA,QAAA,GAAA,GACA,MAAA,GAAA,GAAA,KAKA,QAAA,GAAA,EAAA,GACA,GAAA,MACA,EAAA,CAGA,KAFA,EAAA,KAAA,GAEA,GAAA,CAEA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,EAAA,OAAA,EAAA,CAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAEA,IAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,EAAA,eACA,IACA,EAAA,KAAA,GAKA,EAAA,KAAA,GAKA,EAAA,EAEA,EAAA,OAAA,OAIA,IAAA,EAAA,GAAA,CACA,GAAA,EAAA,EAAA,IAAA,EAAA,GAEA,KAEA,GAAA,EAAA,KACA,EAAA,KAAA,OAIA,GAAA,EAAA,WACA,GACA,EAAA,KAAA,GAMA,MAAA,GAKA,QAAA,GAAA,GACA,IAAA,EACA,OAAA,CAEA,QAAA,EAAA,MACA,IAAA,QACA,IAAA,QACA,IAAA,SACA,IAAA,SAEA,IAAA,OACA,IAAA,QAEA,IAAA,SACA,IAAA,SACA,IAAA,cACA,OAAA,EAGA,OAAA,EAIA,QAAA,GAAA,GACA,MAAA,aAAA,mBAKA,QAAA,GAAA,GACA,MAAA,GAAA,8BAAA,GAKA,QAAA,GAAA,EAAA,GAEA,GAAA,IAAA,EAAA,OACA,MAAA,EAIA,aAAA,GAAA,SACA,EAAA,EAAA,SASA,KAAA,GANA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,EACA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAEA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,KAAA,EACA,MAAA,GAGA,MAAA,GAAA,EAAA,OAAA,GAIA,QAAA,GAAA,GAEA,IADA,GAAA,MACA,EAAA,EAAA,EAAA,OAEA,EAAA,KAAA,EAEA,OAAA,GAIA,QAAA,GAAA,EAAA,GAKA,IAJA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAEA,EAAA,KACA,EAAA,OAAA,GAAA,EAAA,OAAA,GAAA,CACA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,KACA,IAAA,IAAA,EAGA,KAFA,GAAA,EAMA,MAAA,GASA,QAAA,GAAA,EAAA,EAAA,GAGA,YAAA,GAAA,SACA,EAAA,EAAA,SAEA,IAMA,GANA,EAAA,EAAA,GACA,EAAA,EAAA,GAGA,EAAA,EAAA,EAAA,GAKA,EACA,EAAA,EAAA,EAGA,KACA,EAAA,EAAA,KAGA,KAAA,GAAA,GAAA,EACA,EAEA,EAAA,EAAA,OAIA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,KAAA,EAEA,MAAA,GAKA,MAAA,MAGA,QAAA,GAAA,EAAA,GAEA,MAAA,GAAA,KAAA,EAAA,GAcA,QAAA,GAAA,GAEA,IAAA,EAAA,IAAA,KAEA,EAAA,IAAA,GAAA,GAEA,EAAA,EAAA,GAAA,EAAA,EAAA,SACA,GAAA,CACA,GAAA,GAAA,CAEA,MADA,GAAA,KACA,GAKA,QAAA,GAAA,EAAA,GAEA,GAAA,EAAA,IAAA,GACA,KAAA,IAAA,OAAA,oBAGA,GAAA,IAAA,GAAA,GAKA,EAAA,kBACA,IAAA,GAQA,EACA,EAEA,EAAA,EAAA,IAMA,IAAA,SAAA,IAAA,EAAA,QAAA,CACA,GAAA,GAAA,CACA,aAAA,GAAA,WAAA,EAAA,EAAA,eACA,EAAA,EACA,MAIA,IAAA,EACA,GAAA,YAAA,GAAA,OAEA,EAAA,EACA,SAIA,IAFA,EAAA,EAAA,EAAA,GAEA,SAAA,EAAA,KAAA,CACA,GAAA,GAAA,EAAA,EAAA,OAAA,EACA,aAAA,GAAA,WACA,EAAA,EAAA,aAmBA,MAbA,GAAA,IAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,IAEA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,GAIA,EAAA,IAAA,EAAA,IACA,EAAA,OAAA,EAAA,MACA,EAAA,OAAA,GAEA,EAAA;CAIA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAEA,IAAA,IACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,CAIA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IACA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,OAAA,CAGA,QAAA,EAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GAEA,GAAA,GAAA,GCn4BA,EAAA,EAAA,IAAA,CACA,OAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GAGA,IAAA,GADA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAGA,IAAA,EAAA,OAAA,GAEA,EAAA,EAAA,EAAA,EAAA,EAAA,GAKA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,KAAA,EACA,OAAA,CAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAEA,IAAA,IAAA,EAAA,CAEA,GAAA,IAAA,GAEA,OAAA,CAEA,KAAA,KAEA,EAAA,QAEA,IAAA,IAAA,KAAA,EAAA,QAEA,OAAA,CAGA,IAAA,iBAAA,GAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,EAAA,aAOA,IAAA,EAAA,CAIA,GAAA,YAAA,SACA,EAAA,iBAAA,CACA,GAAA,GAAA,EAAA,GAEA,EACA,EAAA,EAAA,EAAA,EACA,IAAA,IAAA,EACA,OAAA,MAEA,GAAA,IAEA,GAAA,IAAA,EAAA,IAKA,EAAA,IAAA,EAAA,EACA,IAAA,GAAA,EAAA,KAGA,GAAA,CAEA,GAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAKA,EAAA,OAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,QAEA,GAAA,MAMA,MAAA,EAAA,OAAA,IACA,EAAA,SAAA,IAAA,IACA,EAAA,SAAA,IAAA,IAKA,IAQA,GANA,kBAAA,GAAA,QACA,EAAA,QAAA,KAAA,EAAA,GAGA,EAAA,QAAA,YAAA,GAEA,EAAA,IAAA,GACA,OAAA,EAEA,MAAA,GACA,IAEA,EAAA,ICrHA,GD2HA,EAAA,QC3HA,GAAA,IAAA,EAAA,MAAA,CACA,GAAA,GAAA,EAAA,OACA,GAAA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,SAEA,EAAA,KAAA,EAAA,IAMA,OAAA,EAAA,IAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,QAAA,EACA,KAAA,QAAA,QAAA,GCdA,QAAA,GAAA,EAAA,GACA,KAAA,YAAA,KCNA,MAAA,GAAA,EAAA,GAAA,QAAA,EAAA,GDQA,IAAA,GAAA,CAEA,OAAA,KAAA,iBAAA,EAAA,UAGA,KAAA,KAAA,GAFA,GAAA,GAAA,GCuBA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,cAIA,OAAA,OAAA,GACA,eAAA,MAAA,EAAA,EAAA,kBAHA,EAOA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,OAAA,GACA,EAAA,SAAA,EAAA,GACA,MAAA,aAAA,QACA,KAAA,KAAA,GAEA,EAAA,EAAA,EAAA,EAAA,EAAA,IAMA,IAJA,EAAA,UAAA,OAAA,OAAA,EAAA,WAEA,GACA,EAAA,EAAA,UAAA,GACA,EAOA,IACA,EAAA,EAAA,EAAA,GAAA,GAAA,SACA,MAAA,GACA,EAAA,EAAA,EACA,SAAA,YAAA,IAIA,MAAA,GAoBA,QAAA,GAAA,EAAA,GACA,MAAA,YACA,UAAA,GAAA,EAAA,UAAA,GACA,IAAA,GAAA,EAAA,KACA,GAAA,GAAA,MAAA,EAAA,YAsCA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAEA,MAAA,IAAA,GAAA,EAAA,EAAA,GAGA,IAAA,GAAA,EAAA,SAAA,YAAA,IACA,EAAA,GAAA,GAEA,GAAA,EAUA,OATA,QAAA,KAAA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,MAAA,GAAA,IAAA,GACA,EAAA,GAAA,EAAA,EACA,mBAAA,IACA,EAAA,EAAA,IAEA,EAAA,KAAA,KAEA,EAAA,OAAA,GAAA,MAAA,EAAA,GACA,EA+CA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAgBA,QAAA,GAAA,GACA,MAAA,kBAAA,IACA,EACA,GAAA,EAAA,YAGA,QAAA,GAAA,GACA,OAAA,GACA,IAAA,kBACA,IAAA,0BACA,IAAA,2BACA,IAAA,wBACA,IAAA,kBACA,IAAA,8BACA,IAAA,iBACA,IAAA,6BACA,IAAA,qBACA,OAAA,EAGA,OAAA,EAYA,QAAA,GAAA,GAEA,KAAA,KAAA,EAoBA,QAAA,GAAA,GAGA,MAFA,aAAA,GAAA,aACA,EAAA,EAAA,MACA,EAAA,GAwGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAEA,IAAA,EAAA,GAAA,SAAA,EAAA,GAAA,OAAA,EACA,OAAA,CAIA,QAAA,EAIA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,WAEA,GAAA,EAAA,EAAA,GAAA,GACA,OAAA,CAEA,QAAA,EAMA,QAAA,GAAA,GACA,EAAA,EAAA,IAOA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,kBAEA,IAAA,GAAA,EAAA,GAAA,KAAA,EAAA,KAAA,EAAA,GACA,KAAA,EACA,MAAA,KAEA,IAAA,GAAA,EAAA,EAAA,MAGA,EAAA,EAAA,YAAA,EACA,OAAA,IAAA,EAEA,MAGA,EAAA,EAAA,MAAA,EAAA,GAIA,EAAA,EAAA,IAQA,QAAA,GAAA,GACA,MAAA,YACA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,IAAA,EAAA,IACA,EAAA,GAAA,OAAA,MAWA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,OAAA,UAAA,GACA,GAAA,GAAA,EAAA,IAAA,KAEA,KACA,EAAA,OAAA,OAAA,MACA,EAAA,IAAA,KAAA,GAIA,IAAA,GAAA,EAAA,EAIA,IAHA,GACA,KAAA,oBAAA,EAAA,EAAA,SAAA,GAEA,kBAAA,GAAA,CACA,GAAA,GAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,KAAA,EACA,MAAA,EAEA,EAAA,iBACA,mBAAA,GAAA,gBAAA,KACA,EAAA,YAAA,GAMA,MAAA,iBAAA,EAAA,GAAA,GACA,EAAA,IACA,MAAA,EACA,QAAA,KJ0DA,GAuPA,GAvPA,EAAA,EAAA,wBAEA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,SAIA,GADA,GAAA,SACA,GAAA,UACA,EAAA,GAAA,SAEA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SAsNA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,CE5vBA,GAAA,WACA,OAAA,SAAA,GACA,MAAA,MAAA,UAAA,EAAA,SAAA,KAAA,OAAA,EAAA,MAEA,KAAA,UAAA,EAAA,SAEA,GAAA,WACA,MAAA,QAAA,KAAA,SAEA,OAAA,WACA,KAAA,QAAA,MAKA,IAAA,IAAA,OAAA,KACA,IAAA,UAAA,mBACA,aAAA,EAIA,aAAA,GEvCA,EAAA,WAEA,GAAA,UACA,MAAA,GAAA,IAAA,OAGA,GAAA,iBACA,MAAA,GAAA,IAAA,OAEA,GAAA,cACA,MAAA,GAAA,IAAA,OAEA,GAAA,QACA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,GAGA,EAAA,YAEA,gBAAA,WACA,EAAA,IAAA,MAAA,IAGA,yBAAA,WACA,EAAA,IAAA,MAAA,GACA,EAAA,IAAA,MAAA,KAIA,EAAA,GAAA,EAAA,SAAA,YAAA,SA0CA,IAAA,IAAA,EAAA,UAAA,GACA,GAAA,EAAA,cAAA,GAGA,IACA,GAAA,iBACA,GAAA,GAAA,EAAA,IAAA,KAGA,OAAA,UAAA,EACA,EACA,EAAA,EAAA,MAAA,iBAeA,GAAA,GACA,eAAA,EAAA,iBAAA,KACA,IAEA,GAAA,GAEA,eAAA,EAAA,iBAAA,IACA,IAGA,GAAA,EAAA,aAAA,GAAA,IACA,GAAA,EAAA,aAAA,GAAA,IAMA,GAAA,OAAA,OAAA,MAGA,GAAA,WACA,IACA,GAAA,QAAA,WAAA,SACA,MAAA,GACA,OAAA,EAEA,OAAA,IA8BA,KAAA,GAAA,CACA,GAAA,IAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,CAEA,GAAA,GAAA,GAAA,EACA,GAAA,EAAA,KAAA,GAAA,GAGA,GAAA,GAAA,EAOA,IAAA,SAAA,SAAA,EAAA,YAAA,IAEA,GAAA,eAAA,OAAA,MAAA,SACA,GAAA,WAAA,KAAA,KAAA,OAAA,GAAA,SACA,GAAA,cAEA,QAAA,EACA,QAAA,EACA,QAAA,EACA,QAAA,EAEA,SAAA,EACA,QAAA,EACA,UAAA,EAEA,SAAA,EACA,OAAA,EAEA,cAAA,MACA,WACA,GAAA,cAAA,cAAA,MAAA,WAMA,GAAA,IAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,eACA,MAAA,MAAA,KAAA,aAGA,GAAA,aAAA,GACA,KAAA,KAAA,YAAA,KAIA,IACA,EAAA,GAAA,EA0BA,IAAA,IAAA,OAAA,YAeA,IAEA,mBACA,sBACA,kBAIA,KAAA,QAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,SACA,IAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EAAA,KAAA,MAAA,EAAA,SAWA,EAAA,WAEA,iBAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,KAAA,EAAA,GAAA,CAGA,GAAA,GAAA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,IAAA,KAEA,IAAA,GAOA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,OAAA,EAAA,IACA,WAPA,MACA,EAAA,MAAA,EACA,EAAA,IAAA,KAAA,EAWA,GAAA,KAAA,EAGA,IAAA,GAAA,EAAA,KACA,GAAA,kBAAA,EAAA,GAAA,KAEA,oBAAA,SAAA,EAAA,EAAA,GAEA,EAAA,QAAA,EACA,IAAA,GAAA,EAAA,IAAA,KACA,IAAA,EAAA,CAIA,IAAA,GAFA,GAAA,EAAA,GAAA,EAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,OAAA,GAAA,EAAA,GAAA,UAAA,IACA,IACA,EAAA,GAAA,UAAA,IACA,GAAA,EAEA,EAAA,GAAA,UAMA,IAAA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KACA,GAAA,qBAAA,EAAA,GAAA,MAIA,cAAA,SAAA,GAcA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,IAKA,GAAA,IAAA,GAAA,GAIA,EAAA,kBAGA,IAAA,EACA,GAAA,KAAA,KACA,EAAA,aACA,KAAA,iBAAA,EAAA,GAAA,GAKA,KACA,MAAA,GAAA,MAAA,eAAA,GACA,QACA,GACA,KAAA,oBAAA,EAAA,GAAA,MA6BA,IACA,EAAA,GAAA,EAQA,IAAA,IAAA,SAAA,gBAqFA,GAAA,iBAAA,EACA,EAAA,sBAAA,EAEA,EAAA,sBAAA,EACA,EAAA,uBAAA,EACA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,YAAA,GACA,EAAA,SAAA,MAAA,EACA,EAAA,SAAA,YAAA,EACA,EAAA,SAAA,WAAA,GAEA,EAAA,SAAA,WAAA,GACA,EAAA,SAAA,QAAA,IAEA,OAAA,mBAWA,SAAA,GACA,YA4BA,SAAA,GAAA,EAAA,GACA,OAAA,eAAA,EAAA,EAAA,GAGA,QAAA,GAAA,GACA,KAAA,KAAA,EA0CA,QAAA,KACA,KAAA,OAAA,EACA,EAAA,KAAA,UAWA,QAAA,GAAA,GAEA,IAAA,GADA,GAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,GAAA,GAAA,EAAA,GAIA,OAFA,GAAA,OAAA,EAEA,EAGA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAjGA,GAAA,GAAA,EAAA,SAAA,QACA,EAAA,EAAA,MAEA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAIA,EAAA,OAAA,UACA,IAAA,EAAA,CAIA,GAAA,EACA,KACA,EAAA,SAAA,YAAA,cACA,MAAA,GAGA,OAGA,GAAA,IAAA,YAAA,EAaA,GAAA,WACA,GAAA,UAEA,MAAA,GAAA,KAAA,KAAA,SAIA,IAAA,IACA,cAAA,EACA,YAAA,EACA,IAAA,OAKA,UACA,UAEA,UACA,UACA,QACA,QACA,aACA,gBAEA,gBACA,sBACA,eACA,QAAA,SAAA,GACA,EAAA,IAAA,WAEA,MAAA,MAAA,KAAA,IAEA,OAAA,eAAA,EAAA,UAAA,EAAA,KAUA,EAAA,WACA,KAAA,SAAA,GACA,MAAA,MAAA,KAmBA,EAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAIA,GAAA,iBACA,MAAA,GAAA,EAAA,MAAA,gBAGA,GAAA,kBACA,MAAA,GAAA,EAAA,MAAA,iBAGA,eAAA,WAMA,KAAA,IAAA,OAAA,sBAKA,EAAA,EAAA,EAAA,GAGA,EAAA,SAAA,MAAA,EACA,EAAA,SAAA,WAAA,EACA,EAAA,SAAA,UAAA,IAEA,OAAA,mBAQA,SACA,GACA,YAOA,SAAA,GAAA,EAAA,GACA,OAAA,eAAA,EAAA,EAAA,GAIA,QAAA,KACA,KAAA,OAAA,EACA,EAAA,KAAA,UAUA,QAAA,GAAA,GACA,GAAA,MAAA,EACA,MAAA,EAEA,KAAA,GADA,GAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IACA,EAAA,GAAA,EAAA,EAAA,GAGA,OADA,GAAA,OAAA,EACA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,UAAA,GAAA,WACA,MAAA,GAAA,KAAA,KAAA,GAAA,MAAA,KAAA,KAAA,aAlCA,GAAA,GAAA,EAAA,KAEA,GAAA,YAAA,EAYA,GAAA,WACA,KAAA,SAAA,GACA,MAAA,MAAA,KAGA,EAAA,EAAA,UAAA,QAoBA,EAAA,SAAA,SAAA,EACA,EAAA,sBAAA,EACA,EAAA,aAAA,GAEA,OAAA,mBAUA,SAAA,GAEA,YAIA,GAAA,mBAAA,EAAA,aACA,EAAA,SAAA,eAAA,EAAA,SAAA,UAGA,OAAA,mBCrtBA,SACA,GACA,YAwBA,SAAA,GAAA,GACA,EAAA,YAAA,IAIA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,EAIA,OAFA,GAAA,GAAA,EACA,EAAA,OAAA,EACA,EAcA,QAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,aAEA,aAAA,EACA,gBAAA,EAAA,gBACA,YAAA,EAAA,cAKA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,aACA,aAAA,IAYA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,YAAA,kBAAA,CACA,GAAA,GAAA,EAAA,EAIA,IAAA,CACA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAEA,EAAA,YAAA,EAAA,IACA,EAAA,GAAA,YAAA,CAGA,IAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,iBAAA,EAAA,EAAA,IAAA,EACA,EAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAWA,OAPA,KAEA,EAAA,aAAA,EAAA,IACA,IACA,EAAA,iBAAA,EAAA,EAAA,OAAA,IAGA,EC9GA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,UAkBA,OAhBA,IAGA,EAAA,YAAA,GAIA,EAAA,YAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,EACA,IAEA,EAAA,aAAA,GACA,IACA,EAAA,iBAAA,GAEA,EAIA,QAAA,GAAA,GACA,GAAA,YAAA,kBACA,MAAA,GAAA,EAGA,IAAA,GAAA,EAAA,GACA,EAAA,EAAA,UAIA,OAFA,IACA,EAAA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,GAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAEA,EAAA,KAAA,CAIA,OAFA,GAAA,OAAA,EACA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,GAEA,MAAA,GAKA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,kBAIA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GAAA,GAMA,QAAA,GAAA,GAEA,EAAA,EAAA,GAAA,GAAA,EAAA,OCxEA,QAAA,GAAA,GAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,IAKA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,WAAA,EAAA,cAEA,EAAA,EAAA,aAEA,KAAA,EAAA,eACA,EAAA,UAAA,GAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,OAAA,CAGA,GAAA,GAAA,EAAA,aAGA,IAAA,IAAA,EAAA,GAAA,cAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,kBAAA,EAAA,GAAA,IAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,EACA,IAAA,GAAA,EAAA,MAIA,IAAA,IAAA,EACA,MAAA,GAAA,EAAA,GCzCA,KAAA,GD4CA,GAAA,EAAA,EAAA,cAAA,0BC5CA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,YAAA,EAAA,EAAA,IAGA,OAAA,GAIA,QAAA,GAAA,GACA,GAAA,SAAA,EAAA,YAGA,IAFA,GAAA,GAAA,EAAA,YAEA,GAAA,CACA,GAAA,GAAA,CACA,GAAA,EAAA,aAEA,EAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,OAIA,EAAA,YAAA,EAAA,WAAA,OAGA,QAAA,GAAA,GACA,GAAA,EAAA,2BAAA,CAEA,IADA,GAAA,GAAA,EAAA,WACA,GAAA,CACA,EAAA,EAAA,aAAA,EACA,IAAA,GAAA,EAAA,YACA,EAAA,EAAA,GACA,EAAA,EAAA,UACA,IACA,EAAA,KAAA,EAAA,GACA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,KACA,EAAA,EAGA,EAAA,YAAA,EAAA,WAAA,SCpCA,KDuCA,GCxCA,GDwCA,EAAA,EAAA,GCzCA,EAAA,EAAA,WAEA,GAEA,EAAA,EAAA,YACA,EAAA,KAAA,EAAA,GAEA,EAAA,EAMA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,UAEA,OAAA,IAAA,EAAA,2BAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,WAAA,YAAA,GAOA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,EAMA,IAJA,EAAA,EADA,EACA,EAAA,KAAA,EAAA,EAAA,MAAA,GAEA,EAAA,KAAA,EAAA,MAAA,IAEA,EAAA,CACA,IAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,GAAA,EAAA,GAGA,IAAA,YAAA,GAAA,oBAGA,IAAA,GAFA,GAAA,EAAA,QAEA,EAAA,EAAA,QAAA,WACA,EC7CA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,GAAA,EAAA,IAOA,MAAA,GAGA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,EAAA,KAAA,EAAA,GACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,WACA,GAAA,IAAA,EACA,OAAA,CAEA,QAAA,EAeA,QAAA,GAAA,GAEA,EAAA,YAAA,IAEA,EAAA,KAAA,KAAA,GAYA,KAAA,YAAA,OAMA,KAAA,YAAA,OAQA,KAAA,WAAA,OAQA,KAAA,aAAA,OASA,KAAA,iBAAA,OAEA,KAAA,WAAA,OLtEA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,SACA,EAAA,EAAA,UACA,EAAA,EAAA,OACA,EAAA,EAAA,iBACA,EAAA,EAAA,gBACA,EAAA,EAAA,aACA,EAAA,EAAA,UACA,EAAA,EAAA,MAEA,EAAA,EAAA,2BACA,EAAA,EAAA,gBACA,EAAA,EAAA,aAEA,EAAA,EAAA,OAEA,EAAA,EAAA,eACA,EAAA,EAAA,KACA,EAAA,EAAA,aACA,EAAA,EAAA,SAiBA,GAAA,EIvBA,EAAA,SAAA,WACA,EAAA,OAAA,KAAA,UAAA,UCHA,EAAA,OAAA,KA8DA,EAAA,OAAA,iBAGA,GADA,EAAA,UAAA,YAEA,EAAA,UAAA,yBACA,EAAA,EAAA,UAAA,aACA,EAAA,EAAA,UAAA,YACA,EAAA,EAAA,UAAA,aAGA,EAAA,UAAA,KAAA,UAAA,WAGA,EAAA,EACA,SAAA,EAAA,GACA,IACA,EAAA,KAAA,EAAA,GACA,MAAA,GACA,KAAA,YAAA,IACA,KAAA,KAIA,SAAA,EAAA,GACA,EAAA,KAAA,EAAA,GAIA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,YAAA,SAAA,GACA,MAAA,MAAA,aAAA,EAAA,OAIA,aAAA,SAAA,EAAA,GACA,EAAA,EAGA,IAAA,EACA,GACA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EAEA,EAAA,EAAA,KAGA,EAAA,KAEA,EAAA,MAGA,GAAA,EAAA,EAAA,aAAA,KAGA,IAAA,GAEA,EACA,EAAA,EAAA,gBAAA,KAAA,UAEA,GAAA,KAAA,6BCrJA,EAAA,EASA,IALA,EAFA,EAEA,EAAA,GAGA,EAAA,EAAA,KAAA,EAAA,GAEA,EACA,EAAA,KAAA,GACA,EAAA,MACA,EAAA,KAAA,KAAA,KAAA,EAAA,GAAA,OACA,CACA,IACA,KAAA,YAAA,EAAA,IACA,IACA,KAAA,WAAA,EAAA,EAAA,OAAA,GAEA,SAAA,KAAA,cACA,KAAA,YAAA,KAAA,YAIA,IAAA,GAAA,EAAA,EAAA,WAAA,KAAA,IAIA,GACA,EAAA,KAAA,EACA,EAAA,KAAA,GAAA,GAEA,EAAA,KAAA,GAcA,MAVA,GAAA,KAAA,aACA,WAAA,EACA,YAAA,EACA,gBAAA,IAIA,EAAA,EAAA,MAGA,GAIA,YAAA,SAAA,GAEA,GADA,EAAA,GACA,EAAA,aAAA,KAAA,CAKA,IAAA,GAHA,IAAA,EAGA,GAFA,KAAA,WAEA,KAAA,YAAA,EACA,EAAA,EAAA,YACA,GAAA,IAAA,EAAA,CACA,GAAA,CACA,OAGA,IAAA,EAEA,KAAA,IAAA,OAAA,iBAIA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,YACA,EAAA,EAAA,eAEA,IAAA,KAAA,2BAAA,CAKA,GAAA,GAAA,KAAA,WACA,EAAA,KAAA,UAEA,EAAA,EAAA,UACA,IACA,EAAA,EAAA,GAEA,IAAA,IAEA,KAAA,YAAA,GACA,IAAA,IACA,KAAA,WAAA,GACA,IACA,EAAA,aAAA,GACA,IACA,EAAA,iBACA,GAGA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,WAIA,GAAA,MACA,EAAA,KAAA,KAAA,EAgBA,OAbA,IAEA,EAAA,KAAA,aACA,aAAA,EAAA,GAEA,YAAA,EACA,gBAAA,IAKA,EAAA,KAAA,GAEA,GAIA,aAAA,SAAA,EAAA,GACA,EAAA,EAEA,IAAA,EASA,IAPA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EACA,EAAA,EAAA,IAGA,EAAA,aAAA,KAEA,KAAA,IAAA,OAAA,gBAKA,IAGA,GAHA,EAAA,EAAA,YACA,EAAA,EAAA,gBAIA,GAAA,KAAA,6BACA,EAAA,EAkDA,OAhDA,GACA,EAAA,EAAA,IAEA,IAAA,IACA,EAAA,EAAA,aACA,EAAA,EAAA,EAAA,KAAA,EAAA,IAGA,GAoBA,EAAA,KAAA,GACA,EAAA,MACA,EAAA,KAAA,KAAA,KAAA,EAAA,GACA,KAtBA,KAAA,aAAA,IACA,KAAA,YAAA,EAAA,IACA,KAAA,YAAA,IACA,KAAA,WAAA,EAAA,EAAA,OAAA,IAGA,EAAA,iBAAA,EAAA,aAEA,EAAA,YAAA,OAGA,EAAA,YACA,EAAA,KAEA,EAAA,WACA,EAAA,KAAA,GACA,IAWA,EAAA,KAAA,aACA,WAAA,EACA,aAAA,EAAA,GAEA,YAAA,EACA,gBAAA,IAIA,EAAA,GACA,EAAA,EAAA,MAEA,GASA,gBAAA,WACA,IAAA,GAAA,GAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,mBAIA,cAAA,WACA,MAAA,QAAA,KAAA,YAIA,GAAA,cAEA,MAAA,UAAA,KAAA,YACA,KAAA,YAAA,EAAA,KAAA,KAAA,aAIA,GAAA,cACA,MAAA,UAAA,KAAA,YACA,KAAA,YAAA,EAAA,KAAA,KAAA,aAKA,GAAA,aAEA,MAAA,UAAA,KAAA,WACA,KAAA,WAAA,EAAA,KAAA,KAAA,YAIA,GAAA,eACA,MAAA,UAAA,KAAA,aACA,KAAA,aAAA,EAAA,KAAA,KAAA,cAKA,GAAA,mBACA,MAAA,UAAA,KAAA,iBACA,KAAA,iBAAA,EAAA,KAAA,KAAA,kBAGA,GAAA,iBAGA,IADA,GAAA,GAAA,KAAA,WACA,GAAA,EAAA,WAAA,EAAA,cACA,EAAA,EAAA,UAGA,OAAA,IAGA,GAAA,eAIA,IAAA,GADA,GAAA,GACA,EAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,UAAA,EAAA,eACA,GAAA,EAAA,YAIA,OAAA,IAEA,GAAA,aAAA,GACA,GAAA,GAAA,EAAA,KAAA,WAEA,IAAA,KAAA,4BAEA,GADA,EAAA,MACA,KAAA,EAAA,CACA,GAAA,GAAA,KAAA,KAAA,cAAA,eAAA,EACA,MAAA,YAAA,QAIA,GAAA,MACA,KAAA,KAAA,YAAA,CAIA,IAAA,GAAA,EAAA,KAAA,WAEA,GAAA,KAAA,aACA,WAAA,EACA,aAAA,IAGA,EAAA,GAEA,EAAA,EAAA,OAGA,GAAA,cAIA,IAAA,GAHA,GAAA,GAAA,GAEA,EAAA,EACA,EAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAKA,OADA,GAAA,OAAA,EACA,GCxTA,UAAA,SAAA,GACA,MAAA,GAAA,KAAA,IAIA,SAAA,SAAA,GAEA,MAAA,GAAA,KAAA,EAAA,KAGA,wBAAA,SAAA,GAKA,MAAA,GAAA,KAAA,KAAA,KACA,EAAA,KAIA,UAAA,WAOA,IAAA,GAHA,GAGA,EANA,EAAA,EAAA,KAAA,YACA,KACA,EAAA,GAIA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GACA,EAAA,WAAA,EAAA,UC9BA,GAAA,EAAA,KAAA,OAEA,GAKA,GAAA,EAAA,KACA,EAAA,KAAA,IAJA,EAAA,EAHA,KAAA,WAAA,IAYA,GAAA,EAAA,SACA,EAAA,MAAA,EACA,EAAA,IAEA,KACA,EAAA,GACA,EAAA,KACA,EAAA,WAAA,QACA,EAAA,YAMA,IAAA,EAAA,SACA,EAAA,MAAA,EACA,EAAA,OAQA,EAAA,EAAA,iBCjCA,EAAA,EAAA,EAAA,SAAA,gCACA,GAAA,UAAA,oBAEA,GAAA,UAAA,iBACA,EAAA,UAAA,EAAA,OAAA,OAAA,EAAA,WAAA,EAAA,WAEA,EAAA,UAAA,EAEA,EAAA,aAAA,EAEA,EAAA,eAAA,EACA,EAAA,eAAA,EACA,EAAA,iBAAA,EACA,EAAA,iBAAA,EAEA,EAAA,SAAA,KAAA,GAGA,OAAA,mBAOA,SAAA,GACA,YAMA,SAAA,GAAA,EAAA,GAIA,IAFA,GAAA,GAAA,EAAA,EAAA,kBAEA,GAAA,CACA,GAAA,EAAA,QAAA,GACA,MAAA,ECzCA,IADA,EAAA,EAAA,EAAA,GAEA,MAAA,EAEA,GAAA,EAAA,mBAGA,MAAA,MAGA,QAAA,GAAA,EAAA,GAEA,MAAA,GAAA,QAAA,GAOA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,EAAA,SACA,OAAA,KAAA,GAEA,IAAA,GAAA,EAAA,eAAA,ECvBA,QAAA,KACA,OAAA,EAKA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,YAAA,EAGA,QAAA,GAAA,EAAA,GAEA,MAAA,GAAA,eAAA,EAIA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,GAAA,eAAA,GAAA,EAAA,YAAA,EAGA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,kBACA,GACA,EAAA,EAAA,EAAA,KACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,kBAEA,OAAA,GFIA,GAAA,GAAA,EAAA,SAAA,eACA,EAAA,EAAA,SAAA,SClBA,EAAA,+BCqBA,GACA,cAAA,SAAA,GACA,MAAA,GAAA,KAAA,IAEA,iBAAA,SAAA,GACA,MAAA,GAAA,KAAA,GAAA,GAAA,EAAA,KAMA,GACA,qBAAA,SAAA,GACA,GAAA,GAAA,GAAA,EACA,OAAA,MAAA,EACA,EAAA,KAAA,EAAA,GAGA,EAAA,KAAA,EACA,EACA,EACA,EAAA,gBAIA,uBAAA,SAAA,GAIA,MAAA,MAAA,iBAAA,IAAA,IAIA,uBAAA,SAAA,EAAA,GCtEA,GAAA,GAAA,GAAA,EAEA,IAAA,KAAA,EAEA,EAAA,SACA,IAAA,MAAA,EAEA,MAAA,MAAA,EACA,EAAA,KAAA,EAAA,GAEA,EAAA,KAAA,EAAA,EAAA,EAIA,OAAA,MAAA,EACA,EAAA,KAAA,EAAA,EAAA,GAGA,EAAA,KAAA,EAAA,EAAA,EAAA,ICjBA,GAAA,uBAAA,EACA,EAAA,mBAAA,GAGA,OAAA,mBAQA,SACA,GACA,YAKA,SAAA,GAAA,GAEA,KAAA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,WAEA,OAAA,GAIA,QAAA,GAAA,GACA,KAAA,GAAA,EAAA,WAAA,KAAA,cAEA,EAAA,EAAA,eAEA,OAAA,GAjBA,GAAA,GAAA,EAAA,SAAA,SAsBA,GACA,GAAA,qBACA,MAAA,GAAA,KAAA,aCvCA,GAAA,oBAEA,MAAA,GAAA,KAAA,YAIA,GAAA,qBAEA,IAAA,GADA,GAAA,EACA,EAAA,KAAA,kBACA,EACA,EAAA,EAAA,mBAEA,GAGA,OAAA,IAIA,GAAA,YAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,KAAA,kBACA,EACA,EAAA,EAAA,mBACA,EAAA,KAAA,CAGA,OADA,GAAA,OAAA,EACA,GAGA,OAAA,WACA,GAAA,GAAA,KAAA,UAEA,IACA,EAAA,YAAA,QAKA,GACA,GAAA,sBAEA,MAAA,GAAA,KAAA,cAIA,GAAA,0BACA,MAAA,GAAA,KAAA,kBAIA,GAAA,mBAAA,EACA,EAAA,oBAAA,GAGA,OAAA,mBCxDA,SAAA,GAEA,YAaA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAXA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,gBACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAIA,EAAA,OAAA,aAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,eACA,MAAA,MAAA,MAGA,GAAA,aAAA,GACA,KAAA,KAAA,GAEA,GAAA,QACA,MAAA,MAAA,KAAA,MAEA,GAAA,MAAA,GAEA,GAAA,GAAA,KAAA,KAAA,IACA,GAAA,KAAA,iBAEA,SAAA,IAGA,KAAA,KAAA,KAAA,KAKA,EAAA,EAAA,UAAA,GAGA,EAAA,EAAA,EACA,SAAA,eAAA,KChDA,EAAA,SAAA,cAAA,GACA,OAAA,mBAQA,SAAA,GACA,YASA,SAAA,GAAA,GACA,MAAA,KAAA,EAKA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAdA,GAAA,GAAA,EAAA,SAAA,cAGA,GAFA,EAAA,gBAEA,EAAA,OAEA,EAAA,EAAA,gBAMA,EAAA,OAAA,IAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,UAAA,SAAA,GACA,EAAA,EAAA,EACA,IAAA,GAAA,KAAA,IACA,IAAA,EAAA,EAAA,OAEA,KAAA,IAAA,OAAA,iBACA,IAAA,GAAA,EAAA,MAAA,EAAA,GACA,EAAA,EAAA,MAAA,EACA,MAAA,KAAA,CACA,IAAA,GAAA,KAAA,cAAA,eAAA,EAIA,OAHA,MAAA,YAEA,KAAA,WAAA,aAAA,EAAA,KAAA,aACA,KAIA,EAAA,EAAA,EAAA,SAAA,eAAA,KAGA,EAAA,SAAA,KAAA,GACA,OAAA,mBAOA,SAAA,GAEA,YC9DA,SAAA,GAAA,GACA,EAAA,mCAAA,EAAA,SAGA,QAAA,GAAA,EAAA,GAEA,KAAA,KAAA,EACA,KAAA,cAAA,EAIA,EAAA,WACA,GAAA,UACA,MAAA,MAAA,KAAA,QAGA,KAAA,SAAA,GAEA,MAAA,MAAA,KAAA,KAAA,IAEA,SAAA,SAAA,GACA,MAAA,MAAA,KAAA,SAAA,IAEA,IAAA,WACA,KAAA,KAAA,IAAA,MAAA,KAAA,KAAA,WACA,EAAA,KAAA,gBAEA,OAAA,WACA,KAAA,KAAA,OAAA,MAAA,KAAA,KAAA,WACA,EAAA,KAAA,gBAGA,OAAA,WAEA,GAAA,GAAA,KAAA,KAAA,OAAA,MAAA,KAAA,KAAA,UClCA,ODmCA,GAAA,KAAA,eCnCA,GAEA,SAAA,WACA,MAAA,MAAA,KAAA,aAMA,EAAA,SAAA,aAAA,GACA,OAAA,mBAOA,SACA,GACA,YCCA,SAAA,GAAA,EAAA,GAEA,GAAA,GAAA,EAAA,UACA,IAAA,GAAA,EAAA,WAAA,CAGA,GAAA,GAAA,EAAA,mBAAA,EACA,GAAA,mBAAA,IACA,EAAA,cC5BA,QAAA,GAAA,EAAA,EAAA,GAKA,EAAA,EAAA,cAEA,KAAA,EACA,UAAA,KACA,SAAA,IAQA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GFGA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,SAAA,aACA,EAAA,EAAA,oBAEA,EAAA,EAAA,mBAEA,GADA,EAAA,sBACA,EAAA,iBACA,EAAA,EAAA,MAGA,GADA,EAAA,MACA,EAAA,iBAEA,EAAA,EAAA,OACA,EAAA,EAAA,SCnCA,EAAA,OAAA,QAGA,GACA,UAEA,qBACA,oBACA,yBACA,OAAA,SAAA,GACA,MAAA,GAAA,UAAA,KAKA,EAAA,EAAA,GAEA,EAAA,EAAA,UAAA,GCJA,EAAA,GAAA,QAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,iBAAA,WACA,GAAA,GAAA,GAAA,GAAA,WAAA,KACA,MAAA,KAAA,mBAAA,CAGA,IAAA,GAAA,EAAA,mBAAA,KCzBA,OAFA,GAAA,aAEA,GAKA,GAAA,cACA,MAAA,MAAA,KAAA,oBAAA,MAOA,aAAA,SAAA,EAAA,GAEA,GAAA,GAAA,KAAA,KAAA,aAAA,EACA,MAAA,KAAA,aAAA,EAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,IAIA,gBAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,aAAA,EACA,MAAA,KAAA,gBAAA,GAEA,EAAA,KAAA,EAAA,GAEA,EAAA,KAAA,IAGA,QAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,KAAA,IAGA,GAAA,aACA,GAAA,GAAA,EAAA,IAAA,KAOA,OANA,IACA,EAAA,IAAA,KAEA,EAAA,GAAA,GAAA,EAAA,MAAA,UAAA,OAGA,GC3CA,GAAA,aAEA,MAAA,GAAA,MAAA,WAIA,GAAA,WAAA,GACA,KAAA,aAAA,QAAA,IAIA,GAAA,MACA,MAAA,GAAA,MAAA,IAIA,GAAA,IAAA,GAEA,KAAA,aAAA,KAAA,MAIA,EAAA,QAAA,SAAA,GACA,YAAA,IAEA,EAAA,UAAA,GAAA,SAAA,GACA,MAAA,MAAA,QAAA,OAMA,EAAA,UAAA,yBACA,EAAA,UAAA,uBAEA,EAAA,UAAA,kBAGA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAGA,EAAA,EAAA,EACA,SAAA,gBAAA,KAAA,MAEA,EAAA,mCAAA,EAEA,EAAA,aAAA,EACA,EAAA,SAAA,QAAA,GACA,OAAA,mBAOA,SAAA,GAEA,YCvCA,SAAA,GAAA,GACA,OAAA,GACA,IAAA,IACA,MAAA,OAEA,KAAA,IACA,MAAA,MACA,KAAA,IACA,MAAA,MACA,KAAA,IAEA,MAAA,QACA,KAAA,OAEA,MAAA,UCpCA,QAAA,GAAA,GAEA,MAAA,GAAA,QAAA,EAAA,GAIA,QAAA,GAAA,GACA,MAAA,GAAA,QAAA,EAAA,GAKA,QAAA,GAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,KAAA,CAEA,OAAA,GCNA,QAAA,GAAA,EAAA,GACA,OAAA,EAAA,UACA,IAAA,MAAA,aAIA,IAAA,GAAA,GAHA,EAAA,EAAA,QAAA,cACA,EAAA,IAAA,EACA,EAAA,EAAA,WACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,GAAA,IAAA,EAAA,KAAA,KAAA,EAAA,EAAA,OAAA,GAGA,OADA,IAAA,IACA,EAAA,GACA,EAEA,EAAA,EAAA,GAAA,KAAA,EAAA,GAEA,KAAA,MAAA,UACA,GAAA,GAAA,EAAA,IACA,OAAA,IAAA,EAAA,EAAA,WACA,EACA,EAAA,EAEA,KAAA,MAAA,aACA,MAAA,OAAA,EAAA,KAAA,KAEA,SAEA,KADA,SAAA,MAAA,GACA,GAAA,OAAA,oBAIA,QAAA,GAAA,GACA,YAAA,GAAA,sBACA,EAAA,EAAA,QAGA,KAAA,GADA,GAAA,GACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,GAAA,EAAA,EAAA,EAEA,OAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,KACA,GAAA,YAAA,EACA,IAAA,GAAA,EAAA,EAAA,cAAA,cAAA,GACA,GAAA,UAAA,CAEA,KADA,GAAA,GACA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,IAUA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GCPA,QAAA,GAAA,EAAA,GAEA,GAAA,GAAA,EAAA,EAAA,WAAA,GACA,GAAA,UAAA,CCrEA,KDuEA,GAEA,GAFA,EAAA,EAAA,SAAA,0BCvEA,EAAA,EAAA,YACA,EAAA,YAAA,EAGA,OAAA,GAAA,GAIA,QAAA,GAAA,GACA,MAAA,YAEA,MADA,GAAA,mBACA,KAAA,KAAA,IAIA,QAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAkBA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GACA,IAAA,EAAA,GACA,IAAA,SAAA,GACA,EAAA,mBACA,KAAA,KAAA,GAAA,GAGA,cAAA,EACA,YAAA,IAUA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GAEA,MAAA,WAGA,MAFA,GAAA,mBAEA,KAAA,KAAA,GAAA,MAAA,KAAA,KAAA,YAEA,cAAA,EACA,YAAA,ILIA,GAAA,GAAA,EAAA,SAAA,QClEA,EAAA,EAAA,aACA,EAAA,EAAA,gBACA,EAAA,EAAA,MAEA,EAAA,EAAA,eACA,EAAA,EAAA,iBAEA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,SASA,EAAA,cACA,EAAA,eCIA,EAAA,GAEA,OACA,OACA,KACA,MAEA,UACA,QACA,KACA,MACA,QAEA,SACA,OACA,OACA,QACA,SACA,QAEA,QAIA,EAAA,GCjDA,QACA,SACA,MAEA,SACA,UAEA,WACA,YACA,aA0DA,EAAA,OAAA,KAAA,UAAA,WAEA,EAAA,OAAA,YACA,EAAA,OAAA,mBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,aACA,MAAA,GAAA,OAEA,GAAA,WAAA,GAQA,GAAA,GAAA,EAAA,KAAA,WAIA,YAFA,KAAA,YAAA,EGzFA,IAAA,GAAA,EAAA,KAAA,WAGA,MAAA,2BACA,eAAA,GAAA,oBAEA,EAAA,KAAA,QAAA,GAEA,EAAA,KAAA,EAAA,KAAA,UAMA,GACA,eAAA,GAAA,oBAEA,EAAA,KAAA,QAAA,GAGA,KAAA,KAAA,UAAA,CFpBA,IAAA,GAAA,EAAA,KAAA,WAGA,GAAA,KAAA,aACA,WAAA,EAEA,aAAA,IAGA,EAAA,GACA,EAAA,EAAA,OAGA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,aAGA,GAAA,WAAA,GAEA,GAAA,GAAA,KAAA,UAEA,IAAA,EAAA,CACA,EAAA,0BACA,IAAA,GAAA,EAAA,EAAA,EAEA,GAAA,aAAA,EAAA,QAKA,mBAAA,SAAA,EAAA,GAEA,GAAA,GAAA,CACA,QAAA,OAAA,GAAA,eAEA,IAAA,cACA,EAAA,KAAA,WACA,EAAA,IACA,MACA,KAAA,WACA,EAAA,KAAA,WACA,EAAA,KAAA,WACA,MACA,KAAA,aACA,EAAA,KACA,EAAA,KAAA,UAEA,MACA,KAAA,YACA,EAAA,KAEA,EAAA,IACA,MACA,SAEA,OAIA,GAAA,GAAA,EAAA,EAAA,EACA,GAAA,aAAA,EAAA,OCxCA,eACA,aACA,YACA,cACA,eACA,aACA,YACA,cACA,eAEA,eACA,QAAA,IAgBA,aACA,aAEA,QAAA,IAiBA,wBACA,iBAEA,kBACA,QAAA,GAKA,EAAA,EAAA,EACA,SAAA,cAAA,MAEA,EAAA,SAAA,YAAA,EAIA,EAAA,aAAA,EAEA,EAAA,aAAA,GACA,OAAA,mBAOA,SAAA,GAEA,YAYA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAGA,EAAA,EAAA,WACA,WAAA,WACA,GAAA,GAAA,KAAA,KAAA,WAAA,MAAA,KAAA,KAAA,UACA,OAAA,IAAA,EAAA,MAKA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBAQA,SAAA,GACA,YASA,SAAA,GAAA,GAEA,EAAA,KAAA,KAAA,GATA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,OAAA,kBAOA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,GAAA,UACA,MAAA,MAAA,aAAA,WAEA,GAAA,QAAA,GACA,KAAA,aAAA,SAAA,IAGA,aAAA,SAAA,EAAA,GACA,EAAA,UAAA,aAAA,KAAA,KAAA,EAAA,GACA,WAAA,OAAA,GAAA,eACA,KAAA,0BAAA,MAOA,GACA,EAAA,EAAA,GAGA,EAAA,SAAA,mBAAA,GACA,OAAA,mBAOA,SACA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAQA,QAAA,GAAA,EAAA,GAEA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,OAEA,GAAA,KAAA,KAAA,GAEA,EAAA,EAAA,MAEA,SAAA,IACA,EAAA,MAAA,GACA,SAAA,IACA,EAAA,OAAA,GAjCA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EAEA,SAAA,cAAA,QAsBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,GACA,OAAA,mBAOA,SAAA,GACA,YAaA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAXA,GAAA,GAAA,EAAA,SAAA,YAIA,GAHA,EAAA,MAEA,EAAA,SAAA,SACA,EAAA,iBAGA,EAAA,OAAA,iBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAKA,GACA,EAAA,EAAA,GAGA,EAAA,SAAA,kBAAA,GAEA,OAAA,mBAQA,SACA,GACA,YAgBA,SAAA,GAAA,GACA,IAAA,EAAA,YACA,MAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,KAAA,EAAA,CAKA,IADA,EAAA,EAAA,eAAA,mBAAA,IACA,EAAA,WACA,EAAA,YAAA,EAAA,UAEA,GAAA,IAAA,EAAA,GAGA,MAAA,GAGA,QAAA,GAAA,GAOA,IAJA,GAGA,GAHA,EAAA,EAAA,EAAA,eACA,EAAA,EAAA,EAAA,0BAGA,EAAA,EAAA,YAEA,EAAA,YAAA,EAEA,OAAA,GAMA,QAAA,GAAA,GAGA,GAFA,EAAA,KAAA,KAAA,IAEA,EAAA,CAEA,GAAA,GAAA,EAAA,EACA,GAAA,IAAA,KAAA,EAAA,KAtDA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,GAAA,SACA,EAAA,GAAA,SAqCA,EAAA,OAAA,mBAWA,GAAA,UAAA,OAAA,OAAA,EAAA,WAGA,EAAA,EAAA,WACA,GAAA,WAEA,MAAA,GACA,EAAA,KAAA,KAAA,SACA,EAAA,IAAA,SASA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,oBAAA,GAEA,OAAA,mBAMA,SACA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GARA,GAAA,GAAA,EAAA,SAAA,YAEA,EAAA,EAAA,gBAEA,EAAA,OAAA,gBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAGA,EAAA,EAAA,EACA,SAAA,cAAA,UAIA,EAAA,SAAA,iBAAA,GACA,OAAA,mBAMA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GASA,QAAA,GAAA,GAEA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,SACA,GAAA,KAAA,KAAA,GAEA,EAAA,EAAA,MAEA,EAAA,aAAA,UAAA,QACA,SAAA,GAEA,EAAA,aAAA,MAAA,GAjCA,GAAA,GAAA,EAAA,SAAA,iBAEA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAGA,EAAA,EAAA,EACA,SAAA,cAAA,UAqBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,GACA,OAAA,mBAMA,SAAA,GACA,YAYA,SAAA,GAAA,GAEA,MAAA,GAAA,QAAA,OAAA,KAAA,OAGA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAwBA,QAAA,GAAA,EAAA,EAAA,EAAA,GAEA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAIA,IAAA,GAAA,EAAA,SAAA,cAAA,UACA,GAAA,KAAA,KAAA,GACA,EAAA,EAAA,MAEA,SAAA,IACA,EAAA,KAAA,GACA,SAAA,GACA,EAAA,aAAA,QAAA,GACA,KAAA,GACA,EAAA,aAAA,WAAA,IACA,EAAA,SAAA,KAAA,EA1DA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAUA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,GAAA,QAEA,MAAA,GAAA,KAAA,cAEA,GAAA,MAAA,GAEA,KAAA,YAAA,EAAA,OAAA,KAEA,GAAA,QAEA,MAAA,GAAA,EAAA,MAAA,SAKA,EAAA,EAAA,EAEA,SAAA,cAAA,WAwBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,OAAA,GACA,OAAA,mBAMA,SACA,GACA,YAYA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAXA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,iBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,IAAA,SAAA,EAAA,GACA,gBAAA,KACA,EAAA,EAAA,IACA,EAAA,MAAA,IAAA,EAAA,GAAA,IAIA,OAAA,SAAA,GAGA,MAAA,UAAA,MAEA,GAAA,UAAA,OAAA,KAAA,OAKA,gBAAA,KACA,EAAA,EAAA,QAGA,GAAA,MAAA,OAAA,KAIA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAKA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GAEA,OAAA,mBAUA,SAAA,GACA,YAcA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAZA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,EAAA,mBAEA,EAAA,OAAA,gBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAGA,cAAA,WACA,MAAA,GAAA,EAAA,MAAA,kBAGA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAEA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAKA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAEA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAIA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAEA,YAAA,WAEA,MAAA,GAAA,EAAA,MAAA,gBAGA,GAAA,QAEA,MAAA,GAAA,EAAA,MAAA,OAEA,UAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,UAAA,OAIA,EAAA,EAAA,EAEA,SAAA,cAAA,UAEA,EAAA,SAAA,iBAAA,GAEA,OAAA,mBEroBA,SAAA,GACA,YAcA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAZA,GAAA,GAAA,EAAA,SAAA,YAEA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,mBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,uBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,OAEA,UAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,UAAA,OAKA,EAAA,EAAA,EAEA,SAAA,cAAA,UAGA,EAAA,SAAA,wBAAA,GACA,OAAA,mBAQA,SAAA,GAEA,YCvCA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GDwCA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MAEA,EAAA,EAAA,gBAEA,EAAA,EAAA,mBCrDA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,mBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WAEA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAGA,WAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,WAAA,OAIA,EAAA,EAAA,EACA,SAAA,cAAA,OAEA,EAAA,SAAA,oBAAA,GACA,OAAA,mBAMA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,OAAA,EAAA,WACA,IAAA,UACA,MAAA,IAAA,GAAA,EAEA,KAAA,SACA,MAAA,IAAA,GAAA,EACA,KAAA,WACA,MAAA,IAAA,GAAA,GAEA,EAAA,KAAA,KAAA,GAnBA,GAAA,GAAA,EAAA,SAAA,mBACA,EAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,kBACA,EAAA,EAAA,SAAA,oBAEA,GADA,EAAA,MACA,EAAA,iBAEA,EAAA,OAAA,kBAcA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,GACA,EAAA,SAAA,mBAAA,GACA,OAAA,mBC1DA,SAAA,GAEA,YAGA,IAAA,GAAA,EAAA,SAAA,QACA,EAAA,EAAA,SAAA,YACA,EAAA,EAAA,eAEA,EAAA,6BACA,EAAA,SAAA,gBAAA,EAAA,SACA,EAAA,EAAA,GACA,EAAA,OAAA,eAAA,EAAA,WAAA,WAMA,MAAA,aAAA,IAAA,CACA,GAAA,GAAA,OAAA,yBAAA,EAAA,UAAA,YACA,QAAA,eAAA,EAAA,UAAA,YAAA,SACA,GAAA,UAAA,UAGA,EAAA,SAAA,WAAA,GAEA,OAAA,mBAOA,SACA,GAEA,YAsBA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GArBA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,cAMA,EAAA,6BACA,EAAA,EAAA,SAAA,gBAAA,EAAA,MACA,EAAA,SAAA,gBAAA,EAAA,OACA,EAAA,EAAA,YACA,EAAA,OAAA,eAAA,EAAA,WACA,EAAA,EAAA,WAOA;EAAA,UAAA,OAAA,OAAA,GAIA,gBAAA,IACA,EAAA,EAAA,WAEA,GAAA,gBACA,MAAA,GAAA,EAAA,MAAA,eAEA,GAAA,wBACA,MAAA,GAAA,EAAA,MAAA,yBAMA,EAAA,EAAA,EAAA,GAEA,EAAA,SAAA,cAAA,GACA,OAAA,mBAQA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,KAEA,EAAA,OAAA,kBACA,KAOA,EAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAGA,GAAA,wBACA,MAAA,GAAA,KAAA,KAAA,uBAIA,GAAA,2BACA,MAAA,GAAA,KAAA,KAAA,0BAMA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAIA,GAAA,cACA,KAAA,IAAA,OAAA,oBAKA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAIA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,YAKA,GAAA,mBACA,MAAA,GAAA,KAAA,KAAA,kBAKA,GAAA,eACA,MAAA,GAAA,KAAA,KAAA,gBAKA,EAAA,EAAA,GAGA,EAAA,SAAA,mBAAA,IACA,OAAA,mBAMA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,KAAA,KAAA,EATA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,wBAOA,GAAA,EAAA,WACA,GAAA,UAEA,MAAA,GAAA,KAAA,KAAA,SAGA,UAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,UAAA,MAAA,KAAA,KAAA,YAGA,cAAA,WAEA,MADA,WAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,cAAA,MAAA,KAAA,KAAA,cAMA,EAAA,EAAA,EACA,SAAA,cAAA,UAAA,WAAA,OAEA,EAAA,SAAA,yBAAA,GACA,OAAA,mBAOA,SAAA,GAEA,YAaA,SAAA,GAAA,GACA,KAAA,KAAA,EAZA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,qBAGA,IAAA,EAAA,CAOA,EAAA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,KAAA,KAAA,SAIA,WAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,WAAA,MAAA,KAAA,KAAA,YAGA,cAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,cAAA,MAAA,KAAA,KAAA,aAQA,IAAA,GAAA,SAAA,KAAA,UAAA,YACA,oBAAA,KAAA,mBAAA,QAGA,GAAA,EAAA,EACA,GAGA,EAAA,SAAA,sBAAA,IACA,OAAA,mBAMA,SAAA,GACA,YAYA,SAAA,GAAA,GACA,KAAA,KAAA,EAVA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eAEA,EAAA,EAAA,KAGA,EAAA,OAAA,KAMA,GAAA,WACA,GAAA,kBACA,MAAA,GAAA,KAAA,KAAA,iBAGA,GAAA,gBACA,MAAA,GAAA,KAAA,KAAA,eAGA,GAAA,2BACA,MAAA,GAAA,KAAA,KAAA,0BAEA,SAAA,SAAA,EAAA,GACA,KAAA,KAAA,SAAA,EAAA,GAAA,IAGA,OAAA,SAAA,EAAA,GACA,KAAA,KAAA,OAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GACA,KAAA,KAAA,eAAA,EAAA,KAGA,cAAA,SAAA,GACA,KAAA,KAAA,cAAA,EAAA,KAEA,aAAA,SAAA,GAEA,KAAA,KAAA,aAAA,EAAA,KAGA,YAAA,SAAA,GACA,KAAA,KAAA,YAAA,EAAA,KAEA,WAAA,SAAA,GACA,KAAA,KAAA,WAAA,EAAA,KAEA,mBAAA,SAAA,GAEA,KAAA,KAAA,mBAAA,EAAA,KAEA,sBAAA,SAAA,EAAA,GAEA,MAAA,MAAA,KAAA,sBAAA,EAAA,EAAA,KCzUA,gBAAA,WACA,MAAA,GAAA,KAAA,KAAA,oBAGA,cAAA,WAEA,MAAA,GAAA,KAAA,KAAA,kBAEA,WAAA,SAAA,GACA,KAAA,KAAA,WAAA,EAAA,KAEA,iBAAA,SAAA,GACA,KAAA,KAAA,iBAAA,EAAA,KAGA,WAAA,WACA,MAAA,GAAA,KAAA,KAAA,eAGA,eAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,eAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GAEA,MAAA,MAAA,KAAA,aAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GAEA,MAAA,MAAA,KAAA,eAAA,EAAA,KAEA,SAAA,WAEA,MAAA,MAAA,KAAA,aAMA,EAAA,UAAA,2BACA,EAAA,UAAA,yBAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,yBAAA,MAKA,EAAA,OAAA,MAAA,EAAA,SAAA,eAGA,EAAA,SAAA,MAAA,GAEA,OAAA,mBAMA,SAAA,GAEA,YAEA,IAAA,GAAA,EAAA,uBACA,EAAA,EAAA,oBAEA,EAAA,EAAA,mBAEA,EAAA,EAAA,MAEA,EAAA,EAAA,eCnEA,EAAA,EAAA,SAAA,yBACA,GAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,EAGA,IAAA,GAAA,EAAA,SAAA,cAAA,IAIA,GAAA,SAAA,QAAA,EACA,EAAA,SAAA,iBAAA,GAGA,OAAA,mBAOA,SACA,GCvBA,YAoBA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,KAAA,cAAA,yBACA,GAAA,KAAA,KAAA,GAIA,EAAA,EAAA,KAEA,IAAA,GAAA,EAAA,UACA,GAAA,IAAA,KAAA,GAEA,KAAA,WACA,GAAA,GAAA,KAAA,EAAA,GAAA,IAEA,EAAA,IAAA,KAAA,GAhCA,GAAA,GAAA,EAAA,SAAA,iBAEA,EAAA,EAAA,UACA,EAAA,EAAA,iBAEA,EAAA,EAAA,aAEA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,OACA,EAAA,EAAA,aACA,EAAA,EAAA,OAEA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,aAkBA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,aACA,MAAA,GAAA,OAEA,GAAA,WAAA,GACA,EAAA,KAAA,GACA,KAAA,4BAGA,GAAA,mBACA,MAAA,GAAA,IAAA,OAAA,MAGA,GAAA,QACA,MAAA,GAAA,IAAA,OAAA,MAGA,yBAAA,WACA,MAAA,GAAA,IAAA,MAAA,4BAGA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,KAAA,cAAA,EAAA,IAGA,eAAA,SAAA,GACA,MAAA,GAAA,KAAA,GACA,KACA,KAAA,cAAA,QAAA,EAAA,SAIA,EAAA,SAAA,WAAA,GAEA,OAAA,mBAMA,SAAA,GACA,YAqBA,SAAA,GAAA,GAEA,EAAA,iBAAA,EAAA,gBAEA,EAAA,aAAA,EAAA,YACA,EAAA,YAAA,EAAA,WCjFA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,GAAA,IAMA,IAJA,EAAA,GAEA,EAAA,GAEA,EAYA,EAAA,aAAA,IACA,EAAA,YAAA,GAEA,EAAA,iBAAA,EAAA,oBAfA,CAEA,EAAA,WAAA,EAAA,UACA,EAAA,YAAA,EAAA,aACA,EAAA,YAAA,EAAA,WAEA,IAAA,GAAA,EAAA,EAAA,UACA,KAEA,EAAA,aAAA,EAAA,aASA,EAAA,aAAA,EAAA,GAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,UACA,IAAA,EAAA,CAGA,GAAA,GAAA,EAAA,EACA,GAAA,GAEA,EAAA,kBACA,EAAA,gBAAA,aAAA,GACA,EAAA,cACA,EAAA,YAAA,iBAAA,GAGA,EAAA,YAAA,IACA,EAAA,WAAA,GACA,EAAA,aAAA,IACA,EAAA,YAAA,GAEA,EAAA,YAAA,IAOA,QAAA,GAAA,GACA,EAAA,IAAA,MAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAGA,OAFA,IACA,EAAA,IAAA,EAAA,MACA,EAIA,QAAA,GAAA,GAEA,IAAA,GADA,MAAA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAEA,OAAA,GCpFA,QAAA,KAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,EAAA,cACA,IAAA,EAAA,OAIA,EAAA,SAGA,KAGA,QAAA,KACA,EAAA,KACA,IAQA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAKA,OAJA,KACA,EAAA,GAAA,GAAA,GACA,EAAA,IAAA,EAAA,IAEA,EAIA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GAAA,IACA,OAAA,aAAA,GACA,EAEA,KAGA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,MAcA,QAAA,GAAA,GACA,KAAA,MAAA,EACA,KAAA,KAAA,EACA,KAAA,cAkEA,QAAA,GAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,uBACA,KAAA,cAAA,GA0OA,QAAA,GAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,GACA,EAAA,KAAA,MAAA,EAAA,EAAA,IAEA,EAAA,KAAA,EAGA,OAAA,GAGA,QAAA,GAAA,GACA,GAAA,YAAA,GACA,MAAA,EACA,IAAA,YAAA,GACA,MAAA,KACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EACA,MAAA,GAEA,MAAA,MAGA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,GAGA,EAAA,KAAA,GAFA,EAAA,IAAA,GAAA,IAKA,QAAA,GAAA,GACA,MAAA,GAAA,IAAA,GAGA,QAAA,GAAA,GAEA,EAAA,IAAA,EAAA,QAWA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,aAAA,SACA,KAAA,EACA,OAAA,CAIA,IADA,EAAA,EAAA,QACA,EACA,OAAA,CAEA,MAAA,YAAA,IACA,OAAA,CAEA,KAAA,EAAA,KAAA,GACA,OAAA,CAEA,KACA,MAAA,GAAA,QAAA,GACA,MAAA,GAEA,OAAA,GAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EACA,OAAA,IAAA,EAAA,EAAA,OAAA,KAAA,EAGA,QAAA,GAAA,GACA,MAAA,aAAA,IACA,YAAA,GAGA,QAAA,GAAA,GACA,MAAA,GAAA,WAKA,QAAA,GAAA,GAGA,IAAA,GAFA,MAEA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,gBACA,EAAA,KAAA,EAEA,OAAA,GF7YA,GErEA,GFqEA,EAAA,EAAA,SAAA,QACA,EAAA,EAAA,SAAA,mBACA,EAAA,EAAA,SAAA,kBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,SAAA,WAEA,GADA,EAAA,OACA,EAAA,cAEA,GADA,EAAA,MACA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,EAAA,KCfA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SC5EA,EAAA,EAAA,QACA,wBACA,2BACA,8BACA,eAIA,KAqDA,EAAA,GAAA,YACA,GAAA,OAAA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,QAAA,GAeA,EAAA,WAEA,OAAA,SAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAGA,OAFA,MAAA,WAAA,KAAA,GAEA,GAGA,KAAA,SAAA,GACA,IAAA,KAAA,KAAA,CAcA,IAAA,GAXA,GAAA,KAAA,KAEA,EAAA,KAAA,WAEA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,SAEA,EAAA,EAAA,iBAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAEA,IADA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,MAAA,IACA,IACA,EAAA,KAAA,KAAA,EAIA,KAAA,GADA,GAAA,EAAA,QAAA,OACA,EAAA,EAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAAA,KACA,GAAA,IAAA,IACA,EAAA,GAKA,IAAA,GAFA,GAAA,EAAA,WACA,EAAA,EAAA,IAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,KACA,EAAA,EAAA,IACA,GAAA,EAAA,EAAA,GAKA,EAAA,IAAA,GAAA,GAEA,EAAA,KAAA,GAGA,GAAA,EAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,KAAA,MAYA,EAAA,WAGA,OAAA,SAAA,GACA,GAAA,KAAA,MAAA,CAGA,KAAA,sBAEA,IAAA,GAAA,KAAA,IAEA,MAAA,aAAA,EACA,IAAA,GAAA,GAAA,GAAA,GAAA,EACA,MAAA,gBAAA,EAAA,EAEA,IAAA,IAAA,CACA,IACA,EAAA,OAEA,KAAA,OAAA,IAGA,GAAA,kBACA,MAAA,GAAA,KAAA,MAAA,UAGA,WAAA,WACA,IAAA,KAAA,MAAA,CAGA,GAFA,KAAA,OAAA,EACA,EAAA,KAAA,MACA,EACA,MACA,GAAA,OAAA,GAAA,EAAA,KAKA,aAAA,SAAA,GACA,KAAA,SAAA,GACA,KAAA,uBAAA,IAGA,SAAA,SAAA,GACA,EAAA,GACA,EAAA,GAEA,EAAA,EAEA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,SAAA,EAGA,GAAA,YACA,KAAA,SAAA,EAAA,YAEA,EAAA,iBACA,KAAA,SAAA,EAAA,kBAIA,uBAAA,SAAA,GACA,GAAA,EAAA,GAAA,CAQA,IAAA,GAPA,GAAA,EAEA,EAAA,EAAA,GAEA,EAAA,EAAA,GAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,KAAA,iBAAA,EAAA,GAAA,EAIA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,GAMA,EAAA,EAAA,EAGA,IAAA,EAAA,CAGA,GAAA,GAAA,EAAA,eACA,KAEA,EAAA,EAAA,GAIA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GAAA,GAKA,KAAA,uBAAA,IAIA,IAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,uBAAA,IAKA,iBAAA,SAAA,EAAA,GACA,KAAA,YAAA,IAGA,GAAA,YAAA,GAAA,CACA,GAAA,GAAA,CACA,MAAA,0BAAA,EAAA,aAAA,UAKA,KAAA,GAHA,IAAA,EAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAEA,EAAA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,GAAA,OACA,GAAA,GAMA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,WACA,EACA,EAAA,EAAA,YACA,EAAA,EAAA,OAOA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,iBAAA,EAAA,IAKA,gBAAA,SAAA,EAAA,GAEA,IAAA,GADA,GAAA,KAAA,QAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAAA,EACA,MAAA,gBAAA,EAAA,GAGA,GAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,OAAA,IAKA,QAAA,SAAA,GAGA,IAAA,GAFA,MACA,EAAA,EAAA,YAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,GAAA,EAAA,GAAA,CACA,KAAA,cAAA,EAEA,KAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,EAAA,IACA,EAAA,KAAA,QAGA,GAAA,KAAA,EAGA,OAAA,IAOA,qBAAA,WACA,KAAA,WAAA,OAAA,OAAA,OAQA,0BAAA,SAAA,GACA,GAAA,EAAA,CAGA,GAAA,GAAA,KAAA,UAGA,SAAA,KAAA,KACA,EAAA,UAAA,GAGA,OAAA,KAAA,KACA,EAAA,IAAA,GAEA,EAAA,QAAA,uBAAA,SAAA,EAAA,GACA,EAAA,IAAA,MAMA,mBAAA,SAAA,GACA,MAAA,MAAA,WAAA,IAGA,cAAA,SAAA,GACA,EAAA,KAAA,uBAAA,MAsDA,IAAA,GAAA,iBAoEA,GAAA,UAAA,yBAAA,WACA,GAAA,GAAA,KAAA,KAAA,sBACA,OAAA,IACA,EAAA,cACA,IAGA,GAGA,EAAA,UAAA,oBACA,EAAA,UAAA,oBAAA,WAIA,MADA,KACA,EAAA,OAGA,EAAA,UAAA,8BAAA,WAEA,MADA,KACA,EAAA,WAGA,EAAA,UAAA,gBACA,EAAA,UAAA,gBAAA,WAEA,KAAA,0BAEA,IACA,GADA,EAAA,EAAA,KAEA,KACA,EAAA,EAAA,IACA,KAAA,KAAA,uBAAA,EACA,GACA,EAAA,cAGA,EAAA,mBAAA,EACA,EAAA,eAAA,EACA,EAAA,iBAAA,EAEA,EAAA,8BAAA,EAIA,EAAA,QACA,aAAA,EACA,OAAA,IAGA,OAAA,mBAMA,SAAA,GACA,YAuBA,SAAA,GAAA,GACA,GAAA,OAAA,GAAA,CAKA,GAAA,EAAA,SAAA,GAEA,IAAA,GAAA,SAAA,GAEA,EAAA,KAAA,KAAA,GAEA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAKA,EAAA,OAAA,GAAA,EACA,SAAA,cAAA,EAAA,MAAA,EAAA,MACA,EAAA,SAAA,GAAA,GA5CA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,OACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,GACA,oBACA,sBACA,mBACA,oBACA,mBACA,oBACA,oBAEA,oBAEA,sBA6BA,GAAA,QAAA,IAEA,OAAA,mBAMA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,KAAA,KAAA,EAVA,CAAA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eAEA,EAAA,EAAA,IAGA,QAAA,UAKA,EAAA,WACA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAGA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,YAEA,SAAA,SAAA,GACA,KAAA,KAAA,SAAA,EAAA,KAEA,SAAA,SAAA,EAAA,GAEA,KAAA,KAAA,SAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,aAAA,EAAA,GAAA,IAEA,OAAA,SAAA,EAAA,GACA,KAAA,KAAA,OAAA,EAAA,GAAA,IAEA,WAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,WAAA,KAEA,YAAA,SAAA,GACA,KAAA,KAAA,YAAA,EAAA,KAEA,kBAAA,SAAA,GACA,KAAA,KAAA,kBAAA,EAAA,KAEA,SAAA,WACA,MAAA,MAAA,KAAA,aAmBA,EAAA,OAAA,UAAA,EAAA,OAAA,gBAEA,EAAA,SAAA,UAAA,GAGA,OAAA,mBAOA,SAAA,GACA,YA4BA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GACA,KAAA,WAAA,GAAA,GAAA,KAAA,MAeA,QAAA,GAAA,GACA,GAAA,GAAA,SAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,KAAA,KAAA,aAmBA,QAAA,GAAA,EAAA,GACA,EAAA,KAAA,EAAA,KAAA,EAAA,IACA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,YACA,EAAA,UAAA,EAAA,YAEA,YAAA,IACA,EAAA,EAAA,EACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAEA,EAAA,EAAA,GCjwBA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,eACA,IACA,EAAA,UAAA,GC0LA,QAAA,GAAA,GACA,KAAA,KAAA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,KAAA,KAAA,aAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,MAAA,KAAA,KAAA,YFweA,GAAA,GAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KAEA,EAAA,EAAA,oBACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,mBACA,EAAA,EAAA,SAAA,WACA,EAAA,EAAA,UACA,EAAA,EAAA,UAEA,EAAA,EAAA,iBACA,EAAA,EAAA,iBACA,EAAA,EAAA,wBACA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,uBAIA,GAFA,EAAA,aAEA,GAAA,SAOA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,mBAIA,EAAA,EAAA,QACA,EAAA,EAAA,SAaA,gBACA,yBACA,gBACA,kBACA,cACA,gBACA,cACA,iBACA,kBACA,QAAA,EAEA,IAAA,GAAA,SAAA,UC3uBA,EAAA,SAAA,YA6BA,IA1BA,EAAA,EAAA,WAEA,UAAA,SAAA,GAKA,MAJA,GAAA,YACA,EAAA,WAAA,YAAA,GACA,EAAA,EAAA,MAEA,GAEA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,KAAA,EAAA,IAEA,WAAA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,EAAA,KAAA,OAEA,aAAA,WAGA,MAFA,KAEA,GAAA,GAAA,EAAA,KAAA,EAAA,SAEA,kBAAA,SAAA,GACA,MAAA,GAAA,iBAAA,KAAA,KACA,SAAA,KAAA,UAAA,OAAA,IAAA,QAIA,SAAA,gBAAA,CACA,GAAA,GAAA,SAAA,eACA,GAAA,UAAA,gBAAA,SAAA,EAAA,GCwCA,QAAA,GAAA,GACA,MAAA,QASA,KAAA,KAAA,GARA,EAEA,SAAA,cAAA,EAAA,GAEA,SAAA,cAAA,GD7CA,GAAA,GAAA,CC/BA,IDgCA,SAAA,IACA,EAAA,EAAA,UACA,EAAA,EAAA,aCzCA,EAAA,OAAA,OAAA,YAAA,YAOA,EAAA,qBAAA,IAAA,GAEA,KAAA,IAAA,OAAA,oBAWA,KAJA,GAEA,GAFA,EAAA,OAAA,eAAA,GAGA,KACA,KACA,EAAA,EAAA,qBAAA,IAAA,KAGA,EAAA,KAAA,GACA,EAAA,OAAA,eAAA,EAIA,KAAA,EAEA,KAAA,IAAA,OAAA,oBAWA,KAAA,GAFA,GAAA,OAAA,OAAA,GAEA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IACA,EAAA,OAAA,OAAA,IASA,kBACA,mBACA,mBACA,4BACA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,EACA,KAEA,EAAA,GAAA,WAIA,EAAA,eAAA,IAEA,EAAA,MAEA,EAAA,MAAA,EAAA,MAAA,cAIA,IAAA,IAAA,UAAA,EACA,KACA,EAAA,QAAA,GAeA,EAAA,UAAA,EACA,EAAA,UAAA,YAAA,EAGA,EAAA,iBAAA,IAAA,EAAA,GACA,EAAA,qBAAA,IAAA,EAAA,EAGA,GAAA,KAAA,EAAA,MACA,EAAA,EACA,OAAA,IAGA,GACA,OAAA,cAAA,OAAA,WAEA,oBAOA,GACA,OAAA,gBACA,OAAA,cAAA,OAAA,SACA,OAAA,gBACA,OAAA,kBAEA,cACA,0BACA,WACA,yBACA,uBACA,yBACA,eACA,gBACA,mBACA,cACA,gBACA,OAAA,IAEA,GACA,OAAA,cAAA,OAAA,WAEA,YACA,aACA,WACA,gBACA,yBACA,gBACA,kBACA,cACA,gBAEA,cACA,iBACA,mBACA,iBACA,oBACA,iBAGA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,WACA,GAAA,kBAEA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,GACA,GACA,EACA,GAAA,GAAA,EAAA,MAAA,gBACA,EAAA,IAAA,KAAA,GACA,IAIA,GAAA,eACA,MAAA,GAAA,EAAA,MAAA,gBAIA,EAAA,OAAA,SAAA,EACA,SAAA,eAAA,mBAAA,KAKA,OAAA,cACA,EAAA,OAAA,aAAA,GAEA,GACA,OAAA,gBACA,OAAA,cAAA,OAAA,SACA,OAAA,kBAqBA,EAAA,EAAA,sBACA,EAAA,EAAA,kBACA,EAAA,EAAA,sBACA,EAAA,EAAA,cAEA,EAAA,OAAA,kBAAA,GAEA,GACA,OAAA,oBAEA,qBACA,iBACA,qBACA,eAIA,EAAA,kBAAA,EACA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,SAAA,GAEA,OAAA,mBAMA,SAAA,GACA,YAgBA,SAAA,GAAA,GAEA,EAAA,KAAA,KAAA,GAhBA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBAEA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,OACA,EAAA,OAAA,iBACA,EAAA,OAAA,YAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,UAAA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,QAAA,iBAAA,EAAA,GAAA,IAIA,EAAA,UAAA,aAAA,WACA,MAAA,GAAA,MAAA,QAAA,sBAIA,QAAA,uBACA,QAAA,cAGA,mBAAA,sBAAA,iBAAA,QACA,SAAA,GACA,EAAA,UAAA,GAAA,WACA,GAAA,GAAA,EAAA,MAAA,OACA,OAAA,GAAA,GAAA,MAAA,EAAA,kBAIA,QAAA,KAGA,EAAA,EAAA,WACA,iBAAA,SAAA,EAAA,GAEA,MADA,KACA,EAAA,KAAA,EAAA,MAAA,EAAA,GACA,IAEA,aAAA,WAEA,MADA,KACA,GAAA,GAAA,EAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,GAAA,EAAA,MAAA,aAIA,EAAA,EAAA,EAAA,QAEA,EAAA,SAAA,OAAA,GAGA,OAAA,mBAQA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,OAOA,EAAA,OAAA,cAAA,OAAA,UACA,EACA,EAAA,UAAA,YAEA,GAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,GAAA,EAAA,KAGA,OAAA,mBAMA,SAAA,GACA,YA2FA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,OAAA,EACA,IAAA,EAAA,CAEA,GAAA,GAAA,SAAA,cAAA,GAEA,EAAA,EAAA,WACA,QAAA,GAAA,GAjGA,GAIA,IAJA,EAAA,cAKA,EAAA,oBAKA,KAAA,kBACA,MAAA,mBAEA,KAAA,kBACA,KAAA,kBACA,GAAA,gBACA,OAAA,oBACA,OAAA,oBACA,QAAA,0BACA,IAAA,sBAEA,QAAA,qBACA,KAAA,kBACA,SAAA,sBACA,IAAA,iBACA,IAAA,uBACA,IAAA,iBACA,GAAA,mBACA,MAAA,mBACA,SAAA,sBACA,KAAA,kBACA,KAAA,kBACA,MAAA,mBACA,SAAA,sBACA,GAAA,qBAEA,KAAA,kBACA,GAAA,gBACA,KAAA,kBACA,OAAA,oBACA,IAAA,mBACA,MAAA,mBACA,OAAA,oBACA,MAAA,mBAEA,OAAA,oBACA,GAAA,gBACA,KAAA,kBACA,IAAA,iBACA,QAAA,qBACA,KAAA,kBACA,SAAA,sBACA,KAAA,kBACA,MAAA,mBACA,OAAA,oBACA,GAAA,mBACA,SAAA,sBACA,OAAA,oBACA,OAAA,oBACA,EAAA,uBACA,MAAA,mBACA,IAAA,iBACA,SAAA,sBACA,EAAA,mBACA,OAAA,oBACA,OAAA,oBACA,OAAA,oBACA,OAAA,oBACA,KAAA,kBACA,MAAA,mBACA,MAAA,mBACA,MAAA,0BAKA,SAAA,sBACA,SAAA,sBACA,MAAA,0BAEA,KAAA,kBACA,MAAA,mBACA,GAAA,sBACA,MAAA,mBACA,GAAA,mBACA,MAAA,oBAgBA,QAAA,KAAA,GAAA,QAAA,GAEA,OAAA,oBAAA,EAAA,UAAA,QAAA,SAAA,GACA,OAAA,GAAA,EAAA,SAAA,MAGA,OAAA,mBAYA,SACA,GAyCA,QAAA,GAAA,EAAA,GACA,GAAA,GACA,EAAA,EAAA,EADA,EAAA,EAAA,iBAIA,KAFA,KACA,EAAA,EAAA,WACA,GAEA,EAAA,KAAA,GACA,EAAA,EAAA,eAEA,KAAA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAEA,GADA,EAAA,EAAA,GAAA,cAAA,GAEA,MAAA,EAIA,MAAA,GAAA,CAEA,GADA,EAAA,EAAA,EAAA,GAEA,MAAA,EAEA,GAAA,EAAA,mBAGA,MAAA,MAGA,QAAA,GAAA,EAAA,EAAA,GACA,GACA,GAAA,EAAA,EAAA,EAAA,EADA,EAAA,EAAA,iBAIA,KAFA,KACA,EAAA,EAAA,WACA,GACA,EAAA,KAAA,GAEA,EAAA,EAAA,eAEA,KAAA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAEA,IADA,EAAA,EAAA,GAAA,iBAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,KAAA,EAAA,GAGA,MAAA,GACA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,kBAGA,OAAA,GAtFA,OAAA,KAAA,kBAAA,aAEA,OAAA,OAAA,kBAAA,eAqBA,OAAA,eAAA,QAAA,UAAA,mBAEA,OAAA,yBAAA,QAAA,UAAA,cAEA,IAAA,GAAA,QAAA,UAAA,gBACA,SAAA,UAAA,iBAAA,WACA,GAAA,GAAA,EAAA,KAAA,KAEA,OADA,gBAAA,YAAA,MACA,GAIA,QAAA,UAAA,uBAAA,QAAA,UAAA,iBAsDA,EAAA,gBAAA,SAAA,EAAA,EAAA,GACA,MAAA,GACA,EAAA,EAAA,MAEA,EAAA,EAAA,KAGA,OAAA,UC5dA,SAAA,GC0BA,QACA,GAAA,EAAA,GACA,GAAA,GAAA,EAQA,OAPA,OAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,GAAA,EAAA,YAAA,SAGA,IACA,EAAA,EAAA,QAAA,EAAA,KAEA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,SAAA,cAAA,QAGA,OAFA,GAAA,YAAA,EAEA,UC7HA,GAAA,GACA,GAAA,GAAA,EAAA,EACA,UAAA,KAAA,YAAA,EACA,IAAA,KACA,IAAA,EAAA,MAOA,IAEA,EAAA,EAAA,MAAA,SACA,MAAA,QAIA,SAAA,KAAA,kBAAA,EAGA,OADA,GAAA,WAAA,YAAA,GACA,EAMA,QAAA,KACA,EAAA,aAAA,EACA,SAAA,KAAA,YAAA,EACA,IAAA,GAAA,EAAA,gBAEA,EAAA,EAAA,cAAA,OACA,GAAA,KAAA,SAAA,QAEA,EAAA,KAAA,YAAA,GAIA,QAAA,GAAA,GACA,EAAA,aACA,IAEA,SAAA,KAAA,YAAA,GACA,EAAA,EAAA,iBACA,SAAA,KAAA,YAAA,GAOA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CAIA,GAAA,EAEA,IAAA,EAAA,MAAA,YAAA,EAAA,CAEA,GAAA,GAAA,EAAA,EACA,GAAA,SAAA,GACA,EAAA,KAAA,YAAA,EAAA,MACA,EAAA,EAAA,MAAA,SACA,EAAA,SAIA,GAAA,EAAA,GAEA,EAAA,IAaA,QAAA,GAAA,GACA,GACA,IAAA,YAAA,SAAA,eAAA,IAKA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EACA,GAAA,aAAA,EAAA,IACA,EAAA,aAAA,EAAA,IACA,SAAA,KAAA,YAAA,GASA,QAAA,KAMA,MALA,KACA,EAAA,SAAA,cAAA,SACA,EAAA,aAAA,EAAA,IACA,EAAA,IAAA,GAEA,EF1BA,GAAA,IACA,eAAA,EACA,YAQA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,GACA,EAAA,KAAA,gBAAA,GACA,EAAA,KAAA,kBAAA,EAAA,GAGA,EAAA,EAAA,GAAA,EACA,GAAA,KAAA,aAAA,EAAA,GAEA,IACA,EAAA,aAAA,GAGA,KAAA,iBAAA,EAAA,IAOA,UAAA,SAAA,EAAA,GAEA,MAAA,MAAA,YAAA,EAAA,YAAA,IAMA,YAAA,SAAA,EAAA,GAGA,MADA,GAAA,KAAA,iBAAA,GACA,KAAA,aAAA,EAAA,IAEA,kBAAA,SAAA,EAAA,GACA,MAAA,GACA,EAAA,OAAA,EAAA,IAAA,EAEA,IAEA,gBAAA,SAAA,GACA,MAAA,IAAA,EAAA,QAAA,KAAA,GAGA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAAA,EAAA,EGpIA,OHsIA,MAAA,oBAAA,EAAA,WAAA,KAAA,kBG3IA,KAAA,aAAA,EAAA,EAAA,YAEA,KAAA,eACA,KAAA,oBAAA,EAAA,GAEA,EAAA,aAGA,aAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,WAAA,YAAA,IAGA,aAAA,SAAA,EAAA,EAAA,GCdA,GAAA,GAAA,KAAA,SAAA,IACA,KAAA,EACA,KAAA,EACA,YAAA,GAEA,EAAA,KAAA,WAAA,EACA,GAAA,WAAA,EACA,EAAA,YAAA,EAAA,UAEA,IAAA,GAAA,KAAA,SAAA,EAAA,YAIA,OAHA,KACA,EAAA,YAAA,EAAA,YAAA,OAAA,EAAA,cAEA,GAGA,WAAA,SAAA,GACA,IAAA,EACA,QAEA,IAAA,GAAA,EAAA,iBAAA,QACA,OAAA,OAAA,UAAA,OAAA,KAAA,EAAA,SAAA,GACA,OAAA,EAAA,aAAA,MAGA,oBAAA,SAAA,EAAA,GAEA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,iBAAA,KACA,SAAA,GACA,EAAA,aAAA,EAAA,MAGA,MAAA,UAAA,QAAA,KAAA,EAAA,iBAAA,YACA,SAAA,GACA,KAAA,oBAAA,EAAA,QAAA,IAEA,QAGA,iBAAA,SAAA,GAEA,MADA,GAAA,KAAA,kCAAA,GACA,KAAA,6BAAA,IAgBA,kCAAA,SAAA,GAOA,MALA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GAEA,MAAA,GAAA,MAAA,EAAA,IAAA,MAGA,EAAA,QAAA,EAAA,SAAA,EAAA,GACA,MAAA,GAAA,QAkBA,6BAAA,SAAA,GAOA,MALA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GAEA,MAAA,GAAA,MAAA,EAAA,MAGA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,EAAA,IAAA,QAAA,EAAA,GACA,OAAA,GAAA,KAYA,aAAA,SAAA,EAAA,GAEA,GAAA,GAAA,KAAA,gCAAA,EAMA,IALA,EAAA,KAAA,4BAAA,GACA,EAAA,KAAA,iBAAA,GACA,EAAA,KAAA,wBAAA,GAEA,EAAA,KAAA,mBAAA,GACA,EAAA,CACA,GAAA,GAAA,EAAA,IACA,GAAA,EAAA,SAAA,GACA,EAAA,EAAA,WAAA,EAAA,KAKA,MADA,GAAA,EAAA,KAAA,EACA,EAAA,QAgBA,gCAAA,SAAA,GAGA,IADA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,KAAA,IACA,GAAA,EAAA,GAAA,MAAA,EAAA,IAAA,MAEA,MAAA,EAAA,EAAA,KAAA,IACA,GAAA,EAAA,GAAA,QAAA,EAAA,GAAA,IAAA,QAAA,EAAA,GAAA,EAAA,IAAA,MAEA,OAAA,IAYA,iBAAA,SAAA,GACA,MAAA,MAAA,iBAAA,EAAA,eACA,KAAA,wBAmBA,wBAAA,SAAA,GACA,MAAA,MAAA,iBAAA,EAAA,sBACA,KAAA,+BAEA,iBAAA,SAAA,EAAA,EAAA,GAEA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GADA,EAAA,yBACA,EAAA,CAEA,IAAA,GAAA,GADA,EAAA,EAAA,MAAA,KAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,EAAA,OACA,EAAA,KAAA,EAAA,EAAA,EAAA,GAEA,OAAA,GAAA,KAAA,KAEA,MAAA,GAAA,KCjMA,6BAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,MAAA,GACA,KAAA,sBAAA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,KAAA,EAAA,IAAA,EAAA,GAKA,sBAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,EAAA,QAAA,EAAA,IAAA,GAMA,mBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,cAAA,OAAA,IACA,EAAA,EAAA,QAAA,cAAA,GAAA,IAEA,OAAA,IAGA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,ECIA,ODHA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GC9BA,GAAA,EAAA,cAAA,EAAA,OAAA,SAAA,EAAA,MAAA,QACA,GAAA,KAAA,cAAA,EAAA,aAAA,EACA,KAAA,eAAA,QACA,GAAA,KAAA,mBAAA,GAAA,cACA,IAAA,EAAA,OAAA,QAAA,WACA,GAAA,UAAA,EAAA,MAAA,UAAA,OACA,GAAA,KAAA,WAAA,EAAA,SAAA,GACA,GAAA,cAcA,KACA,EAAA,UACA,GAAA,EAAA,QAAA,QAEA,MAAA,MAIA,MAEA,GAEA,cAAA,SAAA,EAAA,EAAA,GACA,GAAA,MAAA,EAAA,EAAA,MAAA,IAaA,OAZA,GAAA,QAAA,SAAA,GACA,EAAA,EAAA,OACA,KAAA,qBAAA,EAAA,KAEA,EAAA,IAAA,EAAA,MAAA,0BACA,KAAA,yBAAA,EAAA,GACA,KAAA,mBAAA,EAAA,IAIA,EAAA,KAAA,IACA,MACA,EAAA,KAAA,OAEA,qBAAA,SAAA,EAAA,GAEA,GAAA,MAAA,QAAA,GAEA,OAAA,CAEA,IAAA,GAAA,KAAA,iBAAA,EACA,QAAA,EAAA,MAAA,ICxDA,iBAAA,SAAA,GAEA,MADA,GAAA,EAAA,QAAA,MAAA,OAAA,QAAA,MAAA,OACA,GAAA,QAAA,KAAA,EAAA,IAAA,iBAAA,MAEA,mBAAA,SAAA,EAAA,GACA,MAAA,OAAA,QAAA,GACA,KAAA,uBAAA,EAAA,GACA,KAAA,yBAAA,EAAA,IAKA,uBAAA,SAAA,EAAA,GAGA,IAAA,GAAA,GAFA,KAEA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,KAAA,KAAA,yBAAA,EAAA,GAEA,OAAA,GAAA,KAAA,OAIA,yBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,iBACA,EAAA,EAAA,QAAA,yBAAA,GAEA,EAAA,QAAA,eAAA,EAAA,MAEA,EAAA,IAAA,GN5BA,yBAAA,SAAA,EAAA,GACA,EAAA,EAAA,QAAA,mBAAA,KACA,IAAA,IAAA,IAAA,IAAA,IAAA,KACA,EAAA,EACA,EAAA,IAAA,EAAA,GAcA,OAbA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,GAAA,EAAA,IAAA,SAAA,GAIA,GAAA,GAAA,EAAA,OAAA,QAAA,eAAA,GAIA,OAHA,IAAA,EAAA,QAAA,GAAA,GAAA,EAAA,QAAA,GAAA,IACA,EAAA,EAAA,QAAA,kBAAA,KAAA,EAAA,SAEA,IACA,KAAA,KAEA,GAEA,4BAAA,SAAA,GACA,MAAA,GAAA,QAAA,mBAAA,GAAA,QACA,YAAA,IAEA,mBAAA,SAAA,GACA,GAAA,GAAA,EAAA,MAAA,OAIA,GAAA,MAAA,UAAA,EAAA,MAAA,QAAA,MAAA,gBACA,EAAA,EAAA,QAAA,kBAAA,aACA,EAAA,MAAA,QAAA,MAQA,IAAA,GAAA,EAAA,KACA,KAAA,GAAA,KAAA,GACA,YAAA,EAAA,KACA,GAAA,EAAA,cAGA,OAAA,IAEA,oBAAA,SAAA,EAAA,GACA,GAAA,IACA,YAAA,SACA,GAAA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,EAAA,YAAA,EAAA,KAAA,KAAA,EAAA,cACA,QAGA,iBAAA,SAAA,EAAA,GACA,EAAA,MAAA,WACA,EAAA,EAAA,GAEA,EAAA,KAMA,EAAA,oCAEA,EAAA,4DACA,EAAA,uEAEA,EAAA,sDACA,EAAA,+DAGA,EAAA,+DACA,EAAA,wEAKA,EAAA,iBAEA,EAAA,oBACA,EAAA,iDAIA,gBAAA,GAAA,QAAA,IAAA,EAAA,EAAA,OACA,sBAAA,GAAA,QAAA,IAAA,EAAA,EAAA,OACA,iBAAA,6BACA,YAAA,YACA,mBAAA,oBAEA,yBAAA,EAAA,iBACA,eAAA,GAAA,QAAA,EAAA,OAEA,sBAAA,GAAA,QAAA,EAAA,OACA,eACA,QACA,MACA,cACA,mBACA,YACA,YCjFA,IAAA,GAAA,SAAA,cAAA,SACA,GAAA,MAAA,QAAA,MA0BA,IAoDA,GApDA,EAAA,UAAA,UAAA,MAAA,UA+CA,EAAA,iBAEA,EAAA,qBACA,EAAA,SAaA,IAAA,OAAA,kBAAA,CAEA,EAAA,wCACA,IAAA,GAAA,KAAA,UACA,EAAA,EAAA,cAAA,OACA,GAAA,aAAA,IAAA,EAAA,WAAA,IAMA,SAAA,iBAAA,mBAAA,WACA,GAAA,GAAA,EAAA,WAEA,IAAA,OAAA,cAAA,YAAA,UAAA,CACA,GAAA,GAAA,wBACA,EAAA,IACA,EAAA,SAAA,EAAA,GAEA,aAAA,SAAA,0BAAA,IAAA,EAEA,YAAA,SAAA,yBAAA,IAAA,EAEA,YAAA,OAAA,mBACA,YAAA,OAAA,kBACA,EACA,GACA,KAAA,IAEA,IAAA,GAAA,YAAA,OAAA,YAEA,aAAA,OAAA,aAAA,SAAA,GAEA,IAAA,EAAA,GAAA,CAIA,GAAA,GAAA,EAAA,iBAAA,CACA,KAAA,EAAA,aAAA,GAGA,WADA,GAAA,KAAA,KAAA,EAIA,GAAA,YACA,EAAA,EAAA,cAAA,cAAA,SAEA,EAAA,YAAA,EAAA,eACA,EAAA,WAAA,EAAA,OAGA,EAAA,aAAA,GAGA,EAAA,YAAA,EAAA,UAAA,GACA,EAAA,gBAAA,EAAA,IAEA,EAAA,aAAA,EAAA,IACA,EAAA,IAAA,EAEA,EAAA,aAAA,IAEA,EAAA,aAAA,EACA,EAAA,aAAA,EAAA,GAEA,EAAA,YAAA,IAGA,EAAA,gBAAA,EACA,KAAA,oBAAA,GAEA,KAAA,aAGA,IAAA,GAAA,YAAA,OAAA,WACA,aAAA,OAAA,YAAA,SAAA,GACA,MAAA,SAAA,EAAA,WAAA,eAAA,EAAA,KACA,EAAA,aAAA,GACA,EAAA,WAEA,EAAA,KAAA,KAAA,OAWA,EAAA,UAAA,GAEA,OAAA,YAaA,WAIA,OAAA,KAAA,OAAA,OAAA,SAAA,GACA,MAAA,IAGA,iBAAA,mBAAA,WACA,GAAA,eAAA,aAAA,EAAA,CACA,GAAA,GAAA,QAAA,UAAA,gBACA,SAAA,UAAA,iBAAA,WACA,GAAA,GAAA,EAAA,KAAA,KAEA,OADA,gBAAA,YAAA,MACA,MAMA,SAAA,gBAAA,SAAA,GAOA,GALA,OAAA,qBAAA,oBAAA,WACA,oBAAA,UAAA,IAIA,EAAA,UAAA,EAAA,SAAA,CAEA,IADA,GAAA,GAAA,SAAA,yBACA,EAAA,YACA,EAAA,YAAA,EAAA,WAGA,GAAA,SAAA,EAGA,MAAA,GAAA,SAAA,EAAA,WAGA,OAAA,UAOA,SAAA,GACA,YAgCA,SAAA,GAAA,GACA,MAAA,UAAA,EAAA,GAIA,QAAA,KACA,EAAA,KAAA,MACA,KAAA,YAAA,EAKA,QAAA,GAAA,GAKA,MAJA,IAAA,GACA,EAAA,KAAA,MAGA,EAAA,cAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,WAAA,EACA,OAAA,GAAA,IACA,IAAA,GAGA,KAAA,GAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QAAA,GAEA,EAGA,mBAAA,GAGA,QAAA,GAAA,GAIA,GAAA,GAAA,EAAA,WAAA,EACA,OAAA,GAAA,IACA,IAAA,GAEA,KAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QAAA,GAEA,EAGA,mBAAA,GASA,QAAA,GAAA,EAAA,EAAA,GAEA,QAAA,GAAA,GACA,EAAA,KAAA,GAKA,GAAA,GAAA,GAAA,eACA,EAAA,EACA,EAAA,GAEA,GAAA,EACA,GAAA,EACA,IAGA,GAAA,MAAA,EAAA,EAAA,IAAA,GAAA,GAAA,KAAA,KAAA,YAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,GAEA,IAAA,eACA,IAAA,IAAA,EAAA,KAAA,GAKA,CAAA,GAAA,EAKA,CACA,EAAA,kBACA,MAAA,GANA,EAAA,GACA,EAAA,WAEA,UAPA,GAAA,EAAA,cACA,EAAA,QAWA,MAEA,KAAA,SACA,GAAA,GAAA,EAAA,KAAA,GACA,GAAA,EAAA,kBAEA,CAAA,GAAA,KAAA,EAsBA,CAAA,GAAA,EAKA,CAAA,GAAA,GAAA,EACA,KAAA,EAGA,GAAA,qCAAA,EACA,MAAA,GATA,EAAA,GACA,EAAA,EACA,EAAA,WACA,UAvBA,GAFA,KAAA,QAAA,EACA,EAAA,GACA,EACA,KAAA,EAGA,GAAA,KAAA,WACA,KAAA,aAAA,GAIA,EADA,QAAA,KAAA,QACA,WACA,KAAA,aAAA,GAAA,EAAA,SAAA,KAAA,QAEA,wBACA,KAAA,YACA,wBAGA,cAcA,KAGA,KAAA,cACA,KAAA,GACA,MAAA,IAEA,EAAA,SACA,KAAA,GACA,KAAA,UAAA,IAEA,EAAA,YAGA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IAEA,KAAA,aAAA,EAAA,GAIA,MAEA,KAAA,YACA,GAAA,GAAA,EAAA,EAAA,SAIA,CACA,EAAA,UACA,UAJA,EAAA,mBACA,EAAA,KAAA,KAKA,MAEA,KAAA,wBAEA,GAAA,KAAA,GAAA,KAAA,EAAA,EAAA,GAEA,CAEA,EAAA,oBAAA,GAEA,EAAA,UACA,UANA,EAAA,0BASA,MAGA,KAAA,WAKA,GAJA,KAAA,aAAA,EAEA,QAAA,KAAA,UACA,KAAA,QAAA,EAAA,SACA,GAAA,EAAA,CACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAEA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,EAAA,MACA,MAAA,GAEA,GAAA,KAAA,GAAA,MAAA,EACA,MAAA,GACA,EAAA,gCAEA,EAAA,qBAEA,IAAA,KAAA,EACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,IACA,EAAA,YACA,CAAA,GAAA,KAAA,EAQA,CACA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,IAGA,QAAA,KAAA,UAAA,EAAA,KAAA,IACA,KAAA,GAAA,KAAA,GACA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,KACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QAEA,KAAA,MAAA,OAEA,EAAA,eACA,UAtBA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,EAAA,OACA,KAAA,UAAA,IAEA,EAAA,WAmBA,KAGA,KAAA,iBAEA,GAAA,KAAA,GAAA,MAAA,EMthBA,CACA,QAAA,KAAA,UACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,OCJA,EAAA,eACA;SPuhBA,MAAA,GACA,EAAA,gCAKA,EADA,QAAA,KAAA,QACA,YAGA,0BO9hBA,MAGA,KAAA,wBAEA,GAAA,KAAA,EAEA,CACA,EAAA,sBAAA,GAEA,EAAA,0BACA,UALA,EAAA,wBAOA,MAEA,KAAA,yBAEA,GADA,EAAA,2BACA,KAAA,EAAA,CACA,EAAA,sBAAA,EACA,UAGA,KAEA,KAAA,2BACA,GAAA,KAAA,GAAA,MAAA,EAAA,CACA,EAAA,WACA,UAEA,EAAA,4BAAA,EAEA,MAEA,KAAA,YACA,GAAA,KAAA,EAAA,CACA,IACA,EAAA,mBACA,GAAA,OAEA,GAAA,CACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,KAAA,GAAA,MAAA,GAAA,MAAA,EAKA,GAAA,KAAA,GAAA,OAAA,KAAA,UAAA,CAIA,GAAA,GAAA,EAAA,EACA,QAAA,KAAA,UAAA,KAAA,WAAA,EAAA,KAAA,WAAA,MAJA,MAAA,UAAA,OALA,GAAA,oCAWA,EAAA,OACA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CACA,GAAA,EAAA,OACA,EAAA,GACA,EAAA,MACA,UAEA,GAAA,EAEA,KAEA,KAAA,YACA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CACA,GAAA,EAAA,SAAA,EAAA,KAAA,EAAA,KAAA,KAAA,EAAA,IAAA,KAAA,EAAA,GAEA,GAAA,EAAA,OACA,EAAA,uBAEA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,uBANA,EAAA,eAQA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,EACA,EAAA,oCAEA,GAAA,CAEA,MAEA,KAAA,OACA,IAAA,WACA,GAAA,KAAA,GAAA,EAQA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CAIA,GAHA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,sBACA,EACA,KAAA,EAEA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,GACA,KAAA,EACA,GAAA,EACA,KAAA,IACA,GAAA,GAEA,GAAA,GAEA,EAAA,wCAAA,OAnBA,IAHA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,OACA,YAAA,EACA,KAAA,EAoBA,MAEA,KAAA,OACA,GAAA,QAAA,KAAA,GACA,GAAA,MACA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,GAAA,EAAA,CACA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,SAAA,EAAA,GACA,IAAA,EAAA,KAAA,WACA,KAAA,MAAA,EAAA,IAEA,EAAA,GAEA,GAAA,EACA,KAAA,EAEA,GAAA,qBACA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,EACA,EAAA,+BAAA,GAEA,EAAA,KAAA,MAEA,KAEA,KAAA,sBAKA,GAHA,MAAA,GACA,EAAA,6BACA,EAAA,gBACA,KAAA,GAAA,MAAA,EACA,QAEA,MAEA,KAAA,gBACA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,IAAA,GAAA,KAAA,GAAA,KAAA,GA+BA,KAAA,GAAA,MAAA,GAAA,MAAA,ICtLA,GAAA,EAAA,QDuJA,CACA,MAAA,GACA,EAAA,mCAEA,IAAA,IACA,EAAA,EAAA,EAAA,kBACA,EAAA,GAEA,MAAA,GACA,KAAA,MAAA,MACA,KAAA,GAAA,MAAA,GACA,KAAA,MAAA,KAAA,KAEA,KAAA,GAAA,KAAA,GAAA,MAAA,EACA,KAAA,MAAA,KAAA,IACA,KAAA,IACA,QAAA,KAAA,SAAA,GAAA,KAAA,MAAA,QAAA,GAAA,EAAA,QAAA,EAAA,KAAA,EAAA,KAAA,KAAA,EAAA,KACA,EAAA,EAAA,GAAA,KAEA,KAAA,MAAA,KAAA,IAEA,EAAA,GACA,KAAA,GACA,KAAA,OAAA,IACA,EAAA,SACA,KAAA,IAEA,KAAA,UAAA,IACA,EAAA,YCjLA,KAEA,KAAA,QAEA,GAAA,KAAA,EAIA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,QAAA,EAAA,KAHA,KAAA,UAAA,IACA,EAAA,WAIA,MAGA,KAAA,WACA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,WAAA,GAMA,KAIA,QAAA,KACA,KAAA,QAAA,GACA,KAAA,YAAA,GACA,KAAA,UAAA,GACA,KAAA,UAAA,KACA,KAAA,MAAA,GACA,KAAA,MAAA,GACA,KAAA,SACA,KAAA,OAAA,GACA,KAAA,UAAA,GACA,KAAA,YAAA,EACA,KAAA,aAAA,EAKA,QAAA,GAAA,EAAA,GACA,SAAA,GAAA,YAAA,KACA,EAAA,GAAA,GAAA,OAAA,KAEA,KAAA,KAAA,EACA,EAAA,KAAA,KAEA,IAAA,GAAA,EAAA,QAAA,+BAAA,GAGA,GAAA,KAAA,KAAA,EAAA,KAAA,GRwNA,GAAA,IAAA,CACA,KAAA,EAAA,UACA,IACA,GAAA,GAAA,GAAA,KAAA,IAAA,WACA,GAAA,eAAA,EAAA,KACA,MAAA,IAIA,IAAA,EAAA,CAIA,GAAA,GAAA,OAAA,OAAA,KACA,GAAA,IAAA,GACA,EAAA,KAAA,EACA,EAAA,OAAA,GACA,EAAA,KAAA,GACA,EAAA,MAAA,IACA,EAAA,GAAA,GAEA,EAAA,IAAA,GAEA,IAAA,GAAA,OAAA,OAAA,KACA,GAAA,OAAA,IACA,EAAA,QAAA,KACA,EAAA,QAAA,KACA,EAAA,UAAA,IAqDA,IAAA,GAAA,OAEA,EAAA,WACA,EAAA,mBQxSA,GAAA,WACA,GAAA,QACA,GAAA,KAAA,WACA,MAAA,MAAA,IAEA,IAAA,GAAA,EAMA,QALA,IAAA,KAAA,WAAA,MAAA,KAAA,aACA,EAAA,KAAA,WACA,MAAA,KAAA,UAAA,IAAA,KAAA,UAAA,IAAA,KAGA,KAAA,UACA,KAAA,YAAA,KAAA,EAAA,KAAA,KAAA,IACA,KAAA,SAAA,KAAA,OAAA,KAAA,WAEA,GAAA,MAAA,GACA,EAAA,KAAA,MACA,EAAA,KAAA,KAAA,IAGA,GAAA,YACA,MAAA,MAAA,QAAA,KAEA,GAAA,UAAA,GACA,KAAA,YAEA,EAAA,KAAA,KAAA,EAAA,IAAA,iBAGA,GAAA,QACA,MAAA,MAAA,WAAA,GAAA,KAAA,MACA,KAAA,MAAA,IAAA,KAAA,MAAA,KAAA,OAEA,GAAA,MAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,MAAA,OAEA,GAAA,UAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,aAGA,GAAA,QACA,MAAA,MAAA,OAEA,GAAA,MAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,MAAA,WAAA,GAAA,KAAA,YACA,IAAA,KAAA,MAAA,KAAA,KAAA,KAAA,aAEA,GAAA,UAAA,IACA,KAAA,YAAA,KAAA,cAEA,KAAA,SACA,EAAA,KAAA,KAAA,EAAA,yBAGA,GAAA,UACA,MAAA,MAAA,aAAA,KAAA,QAAA,KAAA,KAAA,OACA,GAAA,KAAA,QAEA,GAAA,QAAA,IACA,KAAA,YAAA,KAAA,cAEA,KAAA,OAAA,IACA,KAAA,EAAA,KACA,EAAA,EAAA,MAAA,IACA,EAAA,KAAA,KAAA,EAAA,WAGA,GAAA,QACA,MAAA,MAAA,aAAA,KAAA,WAAA,KAAA,KAAA,UACA,GAAA,KAAA,WAEA,GAAA,MAAA,GACA,KAAA,aAEA,KAAA,UAAA,IACA,KAAA,EAAA,KACA,EAAA,EAAA,MAAA,IACA,EAAA,KAAA,KAAA,EAAA,eAKA,EAAA,IAAA,IAEA,QAWA,SAAA,GAmBA,QAAA,GAAA,GAEA,IAAA,GADA,GAAA,MACA,EAAA,EAAA,EAAA,UAAA,OAAA,IAAA,CACA,GAAA,GAAA,UAAA,EACA,KACA,IAAA,GAAA,KAAA,GACA,EAAA,EAAA,EAAA,GAEA,MAAA,KAGA,MAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,QAAA,eAAA,EAAA,EAAA,GAKA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CACA,GAAA,GAAA,OAAA,yBAAA,EAAA,EACA,OAAA,IAAA,EAAA,OAAA,eAAA,GAAA,IAxCA,SAAA,UAAA,OACA,SAAA,UAAA,KAAA,SAAA,GACA,GAAA,GAAA,KACA,EAAA,MAAA,UAAA,MAAA,KAAA,UAAA,EACA,OAAA,YACA,GAAA,GAAA,EAAA,OAEA,OADA,GAAA,KAAA,MAAA,EAAA,WACA,EAAA,MAAA,EAAA,MAuCA,EAAA,MAAA,GAEA,OAAA,UAWA,SAAA,GAGA,YC3NA,SAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,gBAAA,GACA,SAAA,cAAA,GAAA,EAAA,WAAA,EAIA,IAFA,EAAA,UAAA,EAEA,EACA,IAAA,GAAA,KAAA,GACA,EAAA,aAAA,EAAA,EAAA,GAIA,OAAA,GDuNA,GAAA,GAAA,aAAA,UAAA,IACA,EAAA,aAAA,UAAA,MACA,cAAA,UAAA,IAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,UAAA,OAAA,IACA,EAAA,KAAA,KAAA,UAAA,KAIA,aAAA,UAAA,OAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,UAAA,OAAA,IAEA,EAAA,KAAA,KAAA,UAAA,KAGA,aAAA,UAAA,OAAA,SAAA,EAAA,GACA,GAAA,UAAA,SACA,GAAA,KAAA,SAAA,IAEA,EAAA,KAAA,IAAA,GAAA,KAAA,OAAA,IAEA,aAAA,UAAA,OAAA,SAAA,EAAA,GACA,GAAA,KAAA,OAAA,GACA,GAAA,KAAA,IAAA,GAMA,IAAA,GAAA,WAEA,MAAA,OAAA,UAAA,MAAA,KAAA,OAGA,EAAA,OAAA,cAAA,OAAA,mBASA,IAPA,SAAA,UAAA,MAAA,EACA,EAAA,UAAA,MAAA,EACA,eAAA,UAAA,MAAA,GAKA,OAAA,YAAA,CAEA,GAAA,GAAA,KAAA,KAEA,QAAA,aAAA,IAAA,WAAA,MAAA,MAAA,MAAA,IAKA,OAAA,wBACA,OAAA,sBAAA,WACA,GAAA,GAAA,OAAA,6BACA,OAAA,wBAEA,OAAA,GACA,SAAA,GACA,MAAA,GAAA,WACA,EAAA,YAAA,UAGA,SAAA,GACA,MAAA,QAAA,WAAA,EAAA,IAAA,SAMA,OAAA,uBAEA,OAAA,qBAAA,WCvTA,MAAA,QAAA,4BACA,OAAA,yBACA,SAAA,GACA,aAAA,OAgCA,IAAA,MAEA,EAAA,WACA,EAAA,KAAA,WAEA,QAAA,QAAA,EAGA,EAAA,oBAAA,WAIA,MAHA,GAAA,oBAAA,WACA,KAAA,0CAEA,GAMA,OAAA,iBAAA,mBAAA,WACA,OAAA,UAAA,IACA,OAAA,QAAA,WACA,QAAA,MAAA,sIAQA,EAAA,UAAA,GAEA,OAAA,UAYA,SAAA,GACA,EAAA,gBAAA,EAAA,iBAAA,SAAA,GACA,MAAA,GAAA,UAEA,OAAA,UAYA,SAAA,GAGA,EAAA,IAAA,OAAA,aAGA,IAAA,EAEA,QAAA,SAAA,SAAA,EAAA,GAEA,IACA,EAAA,OAAA,KAAA,GAAA,sBAAA,MAAA,GACA,EAAA,SAAA,MAAA,GAGA,EAAA,KACA,UAAA,YAGA,EAAA,GAAA,KAAA,SAAA,MAAA,GAGA,IAAA,IACA,kBACA,SACA,WACA,yCACA,cACA,eACA,UACA,cACA,8CAEA,8BACA,UACA,cACA,yBACA,UACA,aACA,sBACA,uBACA,6BACA,UACA,aACA,kCACA,sCACA,6BACA,+BACA,8BACA,UACA,eACA,YACA,WACA,uBACA,YAEA,4BACA,YACA,WACA,KAAA,MAEA,KAEA,EAAA,WAEA,GAAA,GAAA,EAAA,SAGA,EAAA,EAAA,cAAA,UAGA,GAAA,YAAA,EAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,CACA,GAAA,GAAA,EAAA,cAAA,IACA,GAAA,KAAA,IACA,EAAA,YAAA,EAAA,UACA,EAAA,IAAA,EAEA,EAAA,QAAA,SAAA,GAEA,IADA,GAAA,GACA,EAAA,OAAA,KAAA,KAEA,EAAA,EAAA,KAEA,GAAA,EAAA,QAAA,EAAA,GACA,EAAA,kBAEA,EAAA,YAAA,EAAA,cAAA,OAAA,YAAA,KAIA,EAAA,SAAA,EAAA,GAGA,GAAA,GAAA,EAAA,QAEA,KAEA,IAAA,GAAA,GAAA,CACA,GAAA,KAAA,GAGA,IAEA,EAAA,KAAA,cAAA,SAAA,UACA,QAAA,EAAA,EAAA,EAAA,YAAA,UAGA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,SAEA,GAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,SAAA,GACA,EAAA,SAAA,GACA,MAAA,GAAA,EAAA,WAGA,EAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,GAEA,MAAA,EAEA,IAAA,GAAA,GAAA,EACA,IAAA,EAAA,WAAA,IAAA,EAAA,SAAA,CACA,GAAA,GAAA,EAAA,WAAA,cAEA,EAAA,EAAA,EAAA,EAOA,YAAA,IACA,EAAA,EAAA,uBAEA,GAAA,OACA,IAAA,GAAA,EAAA,cACA,GAAA,EAAA,SAAA,GACA,GAAA,EAAA,EAAA,EAAA,WAAA,KAEA,GAAA,GAEA,GAAA,GAAA,KACA,GAAA,aAAA,EAAA,aACA,GAAA,aAGA,CACA,GAAA,GAAA,EAAA,YAAA,MACA,GAAA,EAAA,EAAA,IAAA,EAAA,SAAA,GAGA,MAAA,IAYA,KAEA,EAAA,SAAA,GACA,GAAA,GAAA,YACA,EAAA,EAAA,WAAA,aAiBA,OAhBA,GAAA,kBAAA,EAAA,YAEA,GAAA,iBAAA,EAAA,OACA,wCAAA,EAAA,YACA,EAAA,KAAA,IAGA,GAAA,GAAA,cAEA,EAAA,YACA,EAAA,EAAA,WAAA,SAAA,GACA,GAAA,IAAA,EAAA,MAAA,EAAA,MAAA,KAAA,EAAA,MAAA,IAAA,MAGA,GAAA,aASA,WAAA,WACA,GAAA,GAAA,OAAA,KAAA,WAAA,IAAA,OAEA,EAAA,EAAA,EACA,GACA,EAAA,EAAA,kBAAA,EAAA,WAAA,IAGA,QAAA,IAAA,sBCtSA,QAAA,IAAA,QAQA,EAAA,OAAA,GAEA,OAAA,WAaA,WASA,GAAA,GAAA,SAAA,cAAA,QACA,GAAA,YAAA,kHAQA,IAAA,GAAA,SAAA,cAAA,OACA,GAAA,aAAA,EAAA,EAAA,aAGA,UAcA,SAAA,GAEA,QAAA,GAAA,EAAA,GAOA,MALA,GAAA,MACA,EAAA,MACA,GAAA,IAGA,EAAA,MAAA,KAAA,EAAA,IAAA,IClEA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,EACA,QAAA,UAAA,QACA,IAAA,GAEA,MAEA,KAAA,GACA,EAAA,IACA,MACA,KAAA,GAEA,EAAA,EAAA,MAAA,KACA,MACA,SAEA,EAAA,EAAA,EAAA,GAIA,EAAA,GAAA,EAIA,QAAA,GAAA,GACA,MAAA,GAAA,GAKA,QAAA,GAAA,EAAA,GACA,YAAA,iBAAA,WACA,EAAA,EAAA,KAJA,GAAA,KAWA,GAAA,QAAA,EAEA,EAAA,WAAA,EACA,EAAA,MAAA,GAEA,QC5CA,SAAA,GCAA,QAAA,GAAA,GACA,EAAA,YAAA,IACA,EAAA,KAAA,GAKA,QAAA,KAEA,KAAA,EAAA,QACA,EAAA,UDRA,GAAA,GAAA,EACA,KCLA,EAAA,SAAA,eAAA,GAgBA,KAAA,OAAA,kBAAA,oBAAA,GACA,QAAA,GAAA,eAAA,IAKA,EAAA,eAAA,GAEA,UAaA,SAAA,GAgFA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,QAAA,GAGA,OAFA,GAAA,EAAA,EAAA,EAAA,GAEA,EAAA,IAAA,EAAA,IAAA,IAIA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,MAAA,EAAA,GACA,MAAA,EAGA,IAAA,GAAA,GAAA,KAAA,EAAA,EACA,OAAA,GAAA,EAAA,KAAA,EAAA,EAAA,MAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,KAAA,SAAA,SACA,EAAA,GAAA,KAAA,EAAA,EACA,OAAA,GAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAEA,EAAA,WAAA,EAAA,SACA,EAAA,EAAA,GAEA,EAKA,QAAA,GAAA,EAAA,GAKA,IAJA,GAAA,GAAA,EAAA,SACA,EAAA,EAAA,SACA,EAAA,EAAA,MAAA,KACA,EAAA,EAAA,MAAA,KACA,EAAA,QAAA,EAAA,KAAA,EAAA,IACA,EAAA,QACA,EAAA,OAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IACA,EAAA,QAAA,KAEA,OAAA,GAAA,KAAA,KAAA,EAAA,OAAA,EAAA,KA1HA,GACA,IACA,WAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,KAAA,kBAAA,EAAA,GACA,KAAA,cAAA,EAAA,EAEA,IAAA,GAAA,EAAA,iBAAA,WACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,SACA,KAAA,WAAA,EAAA,QAAA,IAMA,gBAAA,SAAA,GACA,KAAA,WAAA,EAAA,QAAA,EAAA,cAAA,UAEA,cAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBAAA,QACA,IAAA,EAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,aAAA,EAAA,IAIA,aAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,EAAA,YAAA,KAAA,eAAA,EAAA,YAAA,IAGA,eAAA,SAAA,EAAA,EAAA,GAEA,MADA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAGA,kBAAA,SAAA,EAAA,GACA,EAAA,eAAA,EAAA,iBACA,KAAA,yBAAA,EAAA,EAGA,IAAA,GAAA,GAAA,EAAA,iBAAA,EACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,yBAAA,EAAA,IAKA,yBAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,EAAA,QAAA,SAAA,GACA,GAEA,GAFA,EAAA,EAAA,WAAA,GACA,EAAA,GAAA,EAAA,KAEA,IAAA,EAAA,OAAA,GAAA,IAGA,EAFA,UAAA,EAEA,EAAA,EAAA,GAAA,EAAA,GAEA,EAAA,EAAA,GAEA,EAAA,MAAA,OAOA,EAAA,sBACA,EAAA,qCACA,GAAA,OAAA,MAAA,SAAA,QAAA,OACA,EAAA,IAAA,EAAA,KAAA,OAAA,IACA,EAAA,QAkDA,GAAA,YAAA,GAEA,UASA,SAAA,GAuCA,QAAA,GAAA,GACA,EAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,IAKA,QAAA,GAAA,GACA,MAAA,QAAA,mBACA,OAAA,kBAAA,aAAA,IACA,EAGA,QAAA,KAIA,GAAA,CAEA,IAAA,GAAA,CACA,MAEA,EAAA,KAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,EAAA,MAIA,IAAA,IAAA,CACA,GAAA,QAAA,SAAA,GAGA,GAAA,GAAA,EAAA,aAGA,GAAA,GAGA,EAAA,SACA,EAAA,UAAA,EAAA,GACA,GAAA,KAKA,GACA,IAGA,QAAA,GAAA,GACA,EAAA,OAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,IAEA,EAAA,QAAA,SAAA,GACA,EAAA,WAAA,GACA,EAAA,+BAiBA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,IAAA,EAIA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAKA,IAAA,IAAA,GAAA,EAAA,QAAA,CAIA,GAAA,GAAA,EAAA,EACA,IACA,EAAA,QAAA,MAeA,QAAA,GAAA,GACA,KAAA,UAAA,EACA,KAAA,UACA,KAAA,YACA,KAAA,OAAA,ECnPA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,cACA,KAAA,gBACA,KAAA,gBAAA,KACA,KAAA,YAAA,KACA,KAAA,cAAA,KACA,KAAA,mBAAA,KACA,KAAA,SAAA,KAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAAA,KAAA,EAAA,OAQA,OAPA,GAAA,WAAA,EAAA,WAAA,QACA,EAAA,aAAA,EAAA,aAAA,QACA,EAAA,gBAAA,EAAA,gBACA,EAAA,YAAA,EAAA,YACA,EAAA,cAAA,EAAA,cACA,EAAA,mBAAA,EAAA,mBACA,EAAA,SAAA,EAAA,SACA,EAYA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,GAAA,GAAA,EAAA,GAQA,QAAA,GAAA,GACA,MAAA,GACA,GACA,EAAA,EAAA,GACA,EAAA,SAAA,EACA,GAGA,QAAA,KACA,EAAA,EAAA,OAQA,QAAA,GAAA,GACA,MAAA,KAAA,GAAA,IAAA,EAYA,QAAA,GAAA,EAAA,GACA,MAAA,KAAA,EACA,EAKA,GAAA,EAAA,GAEA,EAEA,KAWA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BDLA,GAAA,GAAA,GAAA,SAIA,EAAA,OAAA,cAGA,KAAA,EAAA,CACA,GAAA,MACA,EAAA,OAAA,KAAA,SACA,QAAA,iBAAA,UAAA,SAAA,GACA,GAAA,EAAA,OAAA,EAAA,CAEA,GAAA,GAAA,CACA,MACA,EAAA,QAAA,SAAA,GACA,SAIA,EAAA,SAAA,GACA,EAAA,KAAA,GACA,OAAA,YAAA,EAAA,MAKA,GAAA,IAAA,EAGA,KA6GA,EAAA,CAeA,GAAA,WACA,QAAA,SAAA,EAAA,GAKA,GAJA,EAAA,EAAA,IAIA,EAAA,YAAA,EAAA,aAAA,EAAA,eAKA,EAAA,oBAAA,EAAA,YCrVA,EAAA,iBAAA,EAAA,gBAAA,SACA,EAAA,YAIA,EAAA,wBAAA,EAAA,cAEA,KAAA,IAAA,YAIA,IAAA,GAAA,EAAA,IAAA,EACA,IAEA,EAAA,IAAA,EAAA,KAWA,KAAA,GAFA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,GAAA,WAAA,KAAA,CACA,EAAA,EAAA,GACA,EAAA,kBAEA,EAAA,QAAA,CAEA,OAWA,IACA,EAAA,GAAA,GAAA,KAAA,EAAA,GACA,EAAA,KAAA,GACA,KAAA,OAAA,KAAA,IAKA,EAAA,gBAGA,WAAA,WACA,KAAA,OAAA,QAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,WAAA,KAAA,CACA,EAAA,kBACA,EAAA,OAAA,EAAA,EAGA,UAGA,MACA,KAAA,aAGA,YAAA,WACA,GAAA,GAAA,KAAA,QAEA,OADA,MAAA,YACA,GAkCA,IAAA,GAAA,CA4EA,GAAA,WACA,QAAA,SAAA,GACA,GAAA,GAAA,KAAA,SAAA,SACA,EAAA,EAAA,MAOA,IAAA,EAAA,OAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EACA,IAAA,EAEA,YADA,EAAA,EAAA,GAAA,OAIA,GAAA,KAAA,SAGA,GAAA,GAAA,GAGA,aAAA,WACA,KAAA,cAAA,KAAA,SAGA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,OACA,GAAA,YACA,EAAA,iBAAA,kBAAA,MAAA,GAEA,EAAA,eACA,EAAA,iBAAA,2BAAA,MAAA,GAIA,EAAA,WACA,EAAA,iBAAA,kBAAA,MAAA,IAEA,EAAA,WAAA,EAAA,UACA,EAAA,iBAAA,iBAAA,MAAA,IAGA,gBAAA,WACA,KAAA,iBAAA,KAAA,SAIA,iBAAA,SAAA,GACA,GAAA,GAAA,KAAA,OACA,GAAA,YACA,EAAA,oBAAA,kBAAA,MAAA,GAEA,EAAA,eACA,EAAA,oBAAA,2BAAA,MAAA,GAEA,EAAA,WACA,EAAA,oBAAA,kBAAA,MAAA,IAEA,EAAA,WAAA,EAAA,UACA,EAAA,oBAAA,iBAAA,MAAA,IASA,qBAAA,SAAA,GAGA,GAAA,IAAA,KAAA,OAAA,CAGA,KAAA,cAAA,GACA,KAAA,uBAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,IAEA,EAAA,IAAA,EAAA,MAIA,EAAA,KAAA,QAGA,yBAAA,WACA,GAAA,GAAA,KAAA,sBACA,MAAA,0BAEA,EAAA,QAAA,SAAA,GAEA,KAAA,iBAAA,EAGA,KAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,KAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAIA,SAGA,OAIA,YAAA,SAAA,GAOA,OAFA,EAAA,2BAEA,EAAA,MACA,IAAA,kBAGA,GAAA,GAAA,EAAA,SACA,EAAA,EAAA,YAAA,aACA,EAAA,EAAA,OAGA,EAAA,GAAA,GAAA,aAAA,EACA,GAAA,cAAA,EACA,EAAA,mBAAA,CAIA,IAAA,GACA,EAAA,aAAA,cAAA,SAAA,KAAA,EAAA,SAEA,GAAA,EAAA,SAAA,GAEA,OAAA,EAAA,YAIA,EAAA,iBAAA,EAAA,gBAAA,QAEA,KAAA,EAAA,gBAAA,QAAA,IAEA,KAAA,EAAA,gBAAA,QAAA,GARA,OAaA,EAAA,kBACA,EAAA,GAIA,GAIA,MAEA,KAAA,2BAGA,GAAA,GAAA,EAAA,OAGA,EAAA,EAAA,gBAAA,GAGA,EAAA,EAAA,SAIA,GAAA,EAAA,SAAA,GAEA,MAAA,GAAA,cAIA,EAAA,sBACA,EAAA,GAGA,EARA,QAYA,MAEA,KAAA,iBACA,KAAA,qBAAA,EAAA,OAEA,KAAA,kBAEA,GAEA,GAAA,EAFA,EAAA,EAAA,YACA,EAAA,EAAA,MAEA,qBAAA,EAAA,MACA,GAAA,GAEA,OAGA,KACA,GAAA,GAEA,IAAA,GAAA,EAAA,gBACA,EAAA,EAAA,YAGA,EAAA,EAAA,YAAA,EACA,GAAA,WAAA,EACA,EAAA,aAAA,EAEA,EAAA,gBAAA,EACA,EAAA,YAAA,EAEA,EAAA,EAAA,SAAA,GAEA,MAAA,GAAA,UAKA,EALA,SAcA,MAKA,EAAA,mBAAA,EAGA,EAAA,mBACA,EAAA,iBAAA,IAGA,MAOA,OAAA,YAAA,OAAA,cAAA,UAQA,SAAA,GAGA,GACA,IADA,EAAA,KACA,EAAA,KACA,EAAA,EAAA,MAMA,EAAA,SAAA,EAAA,GACA,KAAA,SACA,KAAA,OAAA,EACA,KAAA,WAAA,EACA,KAAA,SAAA,EAEA,KAAA,WAIA,GAAA,WACA,SAAA,SAAA,GAGA,KAAA,UAAA,EAAA,MCzdA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,QAAA,EAGA,MAAA,aAIA,QAAA,SAAA,GAIA,KAAA,WAGA,KAAA,QAAA,GAEA,KAAA,aAEA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,EAAA,IAIA,GAAA,UAAA,EAEA,KAAA,OAAA,EAAA,IAEA,KAAA,MAAA,EAAA,IAGA,OAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,GAIA,MAFA,MAAA,QAAA,GAAA,KAAA,IAEA,CAGA,OAAA,MAAA,MAAA,IACA,KAAA,OAAA,EAAA,EAAA,KAAA,MAAA,IAEA,KAAA,QAEA,IAGA,KAAA,QAAA,IAAA,IAEA,IAGA,MAAA,SAAA,EAAA,GAEA,GADA,EAAA,MAAA,QAAA,IAAA,QAAA,EAAA,GACA,EAAA,MAAA,UAAA,CAIA,GAAA,GAAA,EAAA,MAAA,KAEA,EAAA,EAAA,GACA,EAAA,EAAA,EC7DA,GD+DA,EAAA,QAAA,cC/DA,KAAA,GAEA,mBAAA,GAEA,WAAA,WACA,KAAA,QAAA,EAAA,EAAA,KAAA,IAEA,KAAA,MAAA,OACA,CACA,GAAA,GAAA,SAAA,EAAA,EAAA,GACA,KAAA,QAAA,EAAA,EAAA,EAAA,EAAA,IACA,KAAA,KACA,GAAA,KAAA,EAAA,KAgBA,QAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,KAAA,MAAA,GAAA,CAEA,IAAA,GAAA,KAAA,QAAA,EACA,IAAA,IAAA,IACA,KAAA,MAAA,GAAA,EACA,EAAA,EAAA,OAAA,KAAA,QAAA,IAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAKA,KAAA,OAAA,GAAA,EAAA,EAAA,GAEA,KAAA,MAEA,MAAA,QAAA,GAAA,KACA,GAAA,IAAA,IACA,KAAA,QAAA,GAAA,OAIA,KAAA,aACA,KAAA,SACA,KAAA,aAEA,UAAA,WACA,KAAA,UACA,KAAA,eAKA,EAAA,IACA,OAAA,EACA,GAAA,SAAA,GACA,MAAA,GAAA,QAAA,KAAA,EAAA,OAAA,KAEA,MAAA,EAAA,QCnEA,IAAA,EAAA,QAEA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,eA2BA,QA1BA,EAAA,MAAA,OAAA,EAAA,MAAA,QACA,GAAA,IAAA,KAAA,UAEA,EAAA,KAAA,MAAA,EAAA,EAAA,OAEA,EAAA,iBAAA,mBAAA,WAEA,GAAA,IAAA,EAAA,WAAA,CAIA,GAAA,GAAA,EAAA,kBAAA,YAEA,EAAA,IACA,IAAA,EACA,GAAA,GAAA,MAAA,EAAA,OAAA,EAAA,GACA,SAAA,OAAA,EACA,CAGA,GAAA,KAAA,GAAA,EAAA,GAAA,IAAA,EACA,EAAA,UAAA,EAAA,aAAA,MAGA,EAAA,OAEA,GC9BA,aAAA,SAAA,EAAA,EAAA,GACA,KAAA,KAAA,EAAA,EAAA,GAAA,aAAA,aAKA,EAAA,IAAA,EACA,EAAA,OAAA,GAGA,OAAA,aASA,SAAA,GC6EA,QAAA,GAAA,GAEA,MAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,KAEA,EAAA,KAAA,GACA,MAAA,GAEA,EAAA,KAAA,SAAA,mBAAA,KACA,QAAA,KAAA,iGACA,GAGA,MAAA,+BAAA,EAIA,QAAA,GAAA,GACA,MAAA,GAAA,YAAA,EAAA,GAIA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,SACA,KAAA,EAAA,CACA,EAAA,EAAA,cAAA,OAEA,IAAA,GAAA,IAAA,KAAA,MAAA,KAAA,KAAA,SAAA,IAAA,IAGA,EAAA,EAAA,YAAA,MAAA,wBACA,GAAA,GAAA,EAAA,IAAA,EAGA,GAAA,IAAA,EAAA,MAEA,MAAA,mBAAA,EAAA,KAQA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,cAAA,cAAA,QAGA,OAFA,GAAA,YAAA,EAAA,YACA,EAAA,mBAAA,GACA,ED9HA,GAAA,GAAA,SACA,EAAA,EAAA,MACA,EAAA,UAAA,KAAA,UAAA,WAEA,EAAA,OAAA,kBACA,OAAA,kBAAA,aAAA,UAAA,SAWA,GAEA,kBAAA,YAAA,EAAA,IAEA,kBACA,YAAA,EAAA,IAEA,uBACA,QACA,qBACA,kCAEA,KAAA,KACA,KACA,KAAA,YACA,OAAA,cACA,MAAA,cAIA,UAAA,WACA,GAAA,GAAA,KAAA,aACA,IACA,KAAA,MAAA,IAGA,MAAA,SAAA,GACA,GAAA,KAAA,SAAA,GAEA,YADA,EAAA,OAAA,QAAA,IAAA,yBAAA,EAAA,WAGA,IAAA,GAAA,KAAA,KAAA,IAAA,EAAA,WACA,KACA,KAAA,YAAA,GACA,EAAA,KAAA,KAAA,KAYA,YAAA,SAAA,GACA,EAAA,OAAA,QAAA,IAAA,UAAA,GACA,KAAA,eAAA,GAGA,oBAAA,SAAA,GACA,EAAA,gBAAA,EACA,EAAA,kBACA,EAAA,gBAAA,gBAAA,GAEA,KAAA,eAAA,KACA,EAAA,OAAA,QAAA,IAAA,YAAA,IAEA,gBAAA,SAAA,GAEA,GAAA,EAAA,eACA,EAAA,eAAA,EAAA,aAAA,gBAAA,EACA,KAAA,cAGA,UAAA,WACA,KAAA,YACA,qBAAA,KAAA,YAGA,IAAA,GAAA,IACA,MAAA,WAAA,sBAAA,WAEA,EAAA,eE/GA,YAAA,SAAA,GAoBA,GAhBA,YAAA,sBACA,YAAA,qBAAA,GAGA,EAAA,OAAA,gBAAA,EAEA,KAAA,oBAAA,GAIA,EAAA,cADA,EAAA,WACA,GAAA,aAAA,QAAA,SAAA,IAEA,GAAA,aAAA,SAAA,SAAA,KAIA,EAAA,UAEA,IADA,GAAA,GACA,EAAA,UAAA,QACA,EAAA,EAAA,UAAA,QACA,GACA,GAAA,OAAA,GAIA,MAAA,aAEA,UAAA,SAAA,GACA,EAAA,GACA,KAAA,YAAA,IAGA,EAAA,KAAA,EAAA,KACA,KAAA,aAAA,KAGA,WAAA,SAAA,GAEA,GAAA,GAAA,CACA,GAAA,EAAA,GACA,EAAA,gBAAA,EACA,KAAA,aAAA,IAEA,aAAA,SAAA,GACA,KAAA,aAAA,GACA,SAAA,KAAA,YAAA,IAGA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KACA,EAAA,SAAA,GACA,GACA,EAAA,GAEA,EAAA,oBAAA,GACA,EAAA,YAUA,IARA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,GAOA,GAAA,UAAA,EAAA,UAAA,CDtEA,GAAA,IAAA,CAEA,IAAA,IAAA,EAAA,YAAA,QAAA,WACA,GAAA,MAEA,IAAA,EAAA,MAAA,CAEA,GAAA,CAMA,KAAA,GAAA,GALA,EAAA,EAAA,MAAA,SAEA,EAAA,EAAA,EAAA,OAAA,EAGA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,OAAA,QAAA,cAGA,EAAA,GAAA,QAAA,EAAA,aAOA,GAEA,EAAA,cAAA,GAAA,aAAA,QAAA,SAAA,OAaA,YAAA,SAAA,GAEA,GAAA,GAAA,SAAA,cAAA,SACA,GAAA,gBAAA,EACA,EAAA,IAAA,EAAA,IAAA,EAAA,IAEA,EAAA,GACA,EAAA,cAAA,EACA,KAAA,aAAA,EAAA,WAEA,EAAA,WAAA,YAAA,GACA,EAAA,cAAA,OAEA,SAAA,KAAA,YAAA,IAKA,YAAA,WACA,OAAA,KAAA,gBAAA,KAAA,iBAAA,IAEA,iBAAA,SAAA,EAAA,GAEA,IAAA,GAAA,GADA,EAAA,EAAA,iBAAA,KAAA,sBAAA,IACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,IAAA,KAAA,SAAA,GACA,MAAA,MAAA,YAAA,GACA,EAAA,GAAA,KAAA,iBAAA,EAAA,OAAA,GAAA,EAGA,MAOA,OAAA,IAGA,sBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,kBAAA,KAAA,kBAEA,SAAA,SAAA,GACA,MAAA,GAAA,gBAEA,YAAA,SAAA,GACA,MAAA,GAAA,KAAA,EAAA,QAEA,GAGA,IA6DA,EAAA,sBACA,EAAA,qCAEA,GACA,mBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,cACA,EAAA,EAAA,cAAA,IAGA,OAFA,GAAA,YAAA,KAAA,qBAAA,EAAA,YAAA,GAEA,GAEA,qBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,EAGA,OAFA,GAAA,KAAA,YAAA,EAAA,EAAA,IAKA,YAAA,SAAA,EAAA,EAAA,GAEA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,QAAA,GAGA,OAFA,GAAA,KAAA,EACA,EAAA,EAAA,KACA,EAAA,IAAA,EAAA,IAAA,KAOA,GAAA,OAAA,EACA,EAAA,KAAA,EACA,EACA,KAAA,GAEA,aAUA,SAAA,GAwGA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,GAIA,QAAA,GAAA,EAAA,GAEA,MAAA,SAAA,EAAA,WAAA,EAAA,aAAA,SAAA,EASA,QAAA,GAAA,EAAA,GAGA,GAAA,GAAA,CACA,aAAA,YAEA,EAAA,SAAA,eAAA,mBAAA,IAKA,EAAA,KAAA,CAGA,IAAA,GAAA,EAAA,cAAA,OACA,GAAA,aAAA,OAAA,GAEA,EAAA,UAEA,EAAA,QAAA,EAGA,IAAA,GAAA,EAAA,cAAA,OE/TA,OAvBA,GAAA,aAAA,UAAA,SAEA,EAAA,KAAA,YAAA,GACA,EAAA,KAAA,YAAA,GAQA,YAAA,YAEA,EAAA,KAAA,UAAA,GAMA,OAAA,qBAAA,oBAAA,WACA,oBAAA,UAAA,GAGA,EA+CA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,EAEA,EAAA,WACA,EAAA,EAAA,IAEA,GAOA,QACA,GAAA,GACA,MAAA,aAAA,EAAA,YACA,EAAA,aAAA,EAKA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,GAWA,GACA,QAZA,CAEA,GAAA,GAAA,YACA,aAAA,EAAA,YACA,EAAA,aAAA,KACA,EAAA,oBAAA,EAAA,GACA,EAAA,EAAA,IAIA,GAAA,iBAAA,EAAA,IAOA,QAAA,GAAA,EAAA,GAGA,QAAA,KACA,GAAA,GACA,GAAA,IAGA,QAAA,KACA,IAEA,IAVA,GAAA,GAAA,EAAA,iBAAA,oBACA,EAAA,EAAA,EAAA,EAAA,MAWA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,GACA,EAAA,KAAA,IAEA,EAAA,iBAAA,OAAA,GAEA,EAAA,iBAAA,QAAA,QAKA,KAIA,QAAA,GAAA,GAEA,MAAA,GAAA,EAAA,QAAA,YAAA,EAAA,OAAA,YAAA,EAAA,SACA,EAAA,eAgBA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,IACA,EAAA,GAKA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,WAAA,WAAA,EAAA,IAIA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,MACA,GACA,GAAA,OAAA,KAGA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,IAKA,QAAA,GAAA,GACA,EAAA,OAAA,UAAA,EFmBA,GAAA,GAAA,UAAA,UAAA,cAAA,QACA,EAAA,EACA,EAAA,EAAA,MACA,EAAA,SAGA,EAAA,OAAA,kBACA,kBAAA,aAAA,UAAA,QAEA,IAAA,EEvLA,GAAA,UF0LA,IACA,IADA,EAAA,IACA,EAAA,QACA,EAAA,EAAA,OASA,GACA,aAEA,yBAAA,YAAA,EAAA,IAEA,yBACA,YAAA,EAAA,KACA,KAAA,KACA,SAAA,SAAA,GACA,EAAA,QAAA,IAGA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAGA,GAAA,SAAA,IAEA,aAAA,SAAA,GAGA,MAAA,GAAA,iBAAA,KAAA,qBAAA,KAIA,qBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,yBACA,KAAA,yBAEA,OAAA,SAAA,EAAA,EAAA,GAQA,GAPA,EAAA,MAAA,QAAA,IAAA,SAAA,EAAA,GAMA,EAAA,WAAA,EACA,EAAA,GAAA,CACA,GAAA,GAAA,KAAA,UAAA,EAIA,KAGA,EAAA,EAAA,EAAA,GACA,EAAA,aAAA,EAGA,KAAA,aAAA,GAGA,KAAA,UAAA,GAAA,GAIA,EAAA,OAAA,EAEA,EAAA,aAEA,aAAA,SAAA,GACA,KAAA,YAAA,GACA,KAAA,QAAA,GACA,EAAA,aAIA,UAAA,WACA,EAAA,cAMA,EAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GACA,EAAA,UAAA,KAAA,GEzQA,IAAA,IACA,IAAA,WAEA,MAAA,aAAA,eAAA,SAAA,eAGA,cAAA,EASA,IALA,OAAA,eAAA,SAAA,iBAAA,GACA,OACA,eAAA,EAAA,iBAAA,IAGA,SAAA,QAAA,CACA,GAAA,IACA,IAAA,WAEA,MAAA,QAAA,SAAA,MAEA,cAAA,EAGA,QAAA,eAAA,SAAA,UAAA,GACA,OAAA,eAAA,EAAA,UAAA,GAkBA,GACA,GAAA,YAAA,KAAA,WAAA,cACA,EAAA,kBAiEA,IACA,GAAA,kBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,YACA,EAAA,EAAA,cAIA,QAAA,SAAA,MAAA,WAAA,IAoCA,EAAA,UAAA,EACA,EAAA,UAAA,EACA,EACA,SAAA,EACA,EAAA,iBAAA,EACA,EACA,iBAAA,EACA,EAAA,eAAA,EACA,EAAA,aAAA,GAEA,OAAA,aAUA,SAAA,GAUA,QAAA,GAAA,GAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,cAAA,EAAA,MAAA,EAAA,WAAA,QACA,EAAA,EAAA,YAMA,QAAA,GAAA,GAGA,IAAA,GAFA,GAEA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAEA,EAAA,GAAA,EAAA,cACA,EAAA,IACA,EAAA,SAAA,GAEA,EAAA,UAAA,EAAA,SAAA,QACA,EAAA,EAAA,UAcA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EACA,EAAA,qBAAA,IAcA,QAAA,GAAA,GACA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IA3DA,GAGA,IAFA,EAAA,iBAEA,EAAA,UA8CA,GA7CA,EAAA,OA6CA,YAAA,UAAA,SACA,YAAA,UAAA,iBACA,YAAA,UAAA,uBACA,YAAA,UAAA,oBACA,YAAA,UAAA,mBAEA,EAAA,GAAA,kBAAA,EAWA,GACA,QAAA,EACA,EAAA,QAAA,GAGA,aAOA,WAyCA,QAAA,KACA,YAAA,SAAA,aAAA,GArCA,kBAAA,QAAA,cACA,OAAA,YAAA,SAAA,EAAA,GACA,GAAA,GAAA,SAAA,YAAA,aAMA,OAJA,GAAA,UAAA,EACA,EAAA,WAAA,GAAA,GAAA,EACA,EAAA,cAAA,GAAA,GAAA,EACA,EAAA,QACA,GAKA,IAAA,GAAA,OAAA,kBAEA,OAAA,kBAAA,aAAA,UAAA,QAQA,aAAA,iBAAA,WACA,YAAA,OAAA,EACA,YAAA,WAAA,GAAA,OAAA,UACA,EAAA,cACA,GAAA,aAAA,qBAAA,SAAA,OAQA,YAAA,YASA,aAAA,SAAA,YACA,gBAAA,SAAA,aAAA,OAAA,YAEA,IAEA,SAAA,iBAAA,mBAAA,OAYA,OAAA,eAAA,OAAA,iBAAA,UASA,SAAA,GASA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBACA,KAAA,EAEA,IADA,EAAA,EAAA,WACA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,WAGA,MAAA,GAEA,EAAA,EAAA,MAAA,GACA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,kBAGA,OAAA,MAIA,QAAA,GAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,WACA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,gBAQA,QAAA,GAAA,EAAA,GAEA,EAAA,EAAA,SAAA,GACA,MAAA,GAAA,IAEA,MAGA,GAAA,EAAA,KAEA,EAAA,EAAA,GAMA,QAAA,GAAA,GACA,MAAA,GAAA,IACA,EAAA,IAEA,OAEA,GAAA,GAKA,QAAA,GAAA,GACA,EAAA,EAAA,SAAA,GACA,MAAA,GAAA,IAEA,EAFA,SAQA,QAAA,GAAA,GACA,MAAA,GAAA,IAAA,EAAA,GAKA,QAAA,GAAA,GACA,IAAA,EAAA,cAAA,EAAA,WAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,aAAA,OAAA,EAAA,UAEA,EAAA,EAAA,SAAA,EACA,IAAA,EAKA,MAJA,GAAA,KAAA,QAAA,MAAA,WAAA,EAAA,WACA,EAAA,QAAA,GAEA,EAAA,KAAA,QAAA,YACA,GAMA,QAAA,GAAA,GACA,EAAA,GACA,EAAA,IAEA,EAAA,EAAA,SAAA,GACA,EAAA,KAsBA,QAAA,GAAA,GAGA,GAFA,EAAA,KAAA,IAEA,EAAA,CAEA,GAAA,CACA,IAAA,GAAA,OAAA,UAAA,OAAA,SAAA,gBACA,UACA,GAAA,IAMA,QAAA,KACA,GAAA,CAEA,KAAA,GAAA,GADA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAEA,GAEA,MAGA,QACA,GAAA,GACA,EACA,EAAA,WACA,EAAA,KAGA,EAAA,GAKA,QAAA,GAAA,IAaA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,OACA,EAAA,KAAA,QAAA,MAAA,YAAA,EAAA,WACA,EAAA,KACA,EAAA,YAAA,EAAA,YAAA,GAAA,EAEA,EAAA,WAAA,IACA,EAAA,WAAA,GAIA,EAAA,WAAA,EACA,EAAA,KAAA,QAAA,KAAA,YAAA,EAAA,UACA,uBAAA,EAAA,YACA,EAAA,mBACA,EAAA,KAAA,QAAA,IAAA,YAAA,EAAA,WAEA,EAAA,qBAIA,EAAA,KAAA,QAAA,YAIA,QACA,GAAA,GACA,EAAA,GACA,EAAA,EAAA,SAAA,GAEA,EAAA,KAKA,QAAA,GAAA,GACA,EACA,EAAA,WAEA,EAAA,KAGA,EAAA,GAIA,QAAA,GAAA,IAGA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,OACA,EAAA,KAAA,QAAA,MAAA,WAAA,EAAA,WAEA,EAAA,KACA,EAAA,YAAA,EAAA,YAAA,GAAA,EAEA,EAAA,WAAA,IACA,EAAA,WAAA,GAGA,EAAA,WAAA,EAEA,EAAA,KAAA,QAAA,KAAA,WAAA,EAAA,UACA,uBAAA,EAAA,YACA,EAAA,kBAEA,EAAA,oBAGA,EAAA,KAAA,QAAA,YAQA,QAAA,GAAA,GACA,MAAA,QAAA,kBAAA,kBAAA,aAAA,GACA,EAGA,QAAA,GAAA,GAIA,IAHA,GAAA,GAAA,EACA,EAAA,EAAA,UAEA,GAAA,CACA,GAAA,GAAA,EACA,OAAA,CAEA,GAAA,EAAA,YAAA,EAAA,MAMA,QAAA,GAAA,GACA,GAAA,EAAA,aAAA,EAAA,WAAA,UAAA,CACA,EAAA,KAAA,QAAA,IAAA,6BAAA,EAAA,UAKA,KAFA,GAAA,GAAA,EAAA,WAEA,GACA,EAAA,GACA,EAAA,EAAA,iBAMA,QAAA,GAAA,GACA,EAAA,YACA,EAAA,GAEA,EAAA,WAAA,GAIA,QAAA,GAAA,GAEA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,cAAA,EAAA,MAAA,EAAA,YAEA,EAAA,WAAA,CAEA,IADA,GAAA,GAAA,EAAA,WAAA,GACA,GAAA,IAAA,WAAA,EAAA,MACA,EAAA,EAAA,UAEA,IAAA,GAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,MAAA,EAAA,KAAA,YAAA,EAEA,GAAA,EAAA,MAAA,MAAA,QAAA,MAAA,KAAA,MAIA,QAAA,MAAA,sBAAA,EAAA,OAAA,GAAA,IAIA,EAAA,QAAA,SAAA,GAGA,cAAA,EAAA,OACA,EAAA,EAAA,WAAA,SAAA,GAEA,EAAA,WAIA,EAAA,KAGA,EAAA,EAAA,aAAA,SAAA,GAEA,EAAA,WAIA,EAAA,QAMA,EAAA,KAAA,QAAA,WAOA,QAAA,KAEA,EAAA,EAAA,eACA,IAOA,QAAA,GAAA,GAEA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IAGA,QAAA,GAAA,GACA,EAAA,GAGA,QACA,GAAA,GACA,EAAA,KAAA,QAAA,MAAA,oBAAA,EAAA,QAAA,MAAA,KAAA,OACA,EAAA,GACA,EAAA,KAAA,QAAA,WAGA,QACA,GAAA,GACA,EAAA,EAAA,EAKA,KAAA,GAAA,GADA,EAAA,EAAA,iBAAA,YAAA,EAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAEA,EAAA,QAAA,EAAA,OAAA,UACA,EAAA,EAAA,OAIA,GAAA,GAhYA,GAAA,GAAA,OAAA,aACA,EAAA,OAAA,YAAA,YAAA,iBAAA,OAoHA,GAAA,OAAA,kBACA,OAAA,mBAAA,OAAA,kBACA,GAAA,qBAAA,CAGA,IAAA,IAAA,EAEA,KAyNA,EAAA,GAAA,kBAAA,GAUA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QAsCA,GACA,iBAAA,EACA,EACA,YAAA,EACA,EAAA,oBAAA,EACA,EAAA,WAAA,EACA,EACA,eAAA,EACA,EAAA,aAAA,EAEA,EAAA,gBAAA,EACA,EAAA,gBAAA,EAEA,EAAA,YAAA,GAGA,OAAA,gBAqBA,SAAA,GA6FA,QAAA,GAAA,EAAA,GAKA,GAAA,GAAA,KAEA,KAAA,EAGA,KAAA,IAAA,OAAA,oEAEA,IAAA,EAAA,QAAA,KAAA,EAIA,KAAA,IAAA,OAAA,uGAAA,OAAA,GAAA,KAKA,IAAA,EAAA,GACA,KAAA,IAAA,OAAA,oFAAA,OAAA,GAAA,+BAGA,IAAA,EAAA,GACA,KAAA,IAAA,OAAA,+CAAA,OAAA,GAAA,0BAKA,KAAA,EAAA,UAGA,KAAA,IAAA,OAAA,8CAmCA,OAhCA,GAAA,OAAA,EAAA,cAEA,EAAA,UAAA,EAAA,cAIA,EAAA,SAAA,EAAA,EAAA,SAIA,EAAA,GAGA,EAAA,GAEA,EAAA,EAAA,WAGA,EAAA,EAAA,OAAA,GAGA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,UAAA,EAAA,UAEA,EAAA,UAAA,YAAA,EAAA,KAGA,EAAA,OAGA,EAAA,oBAAA,UAEA,EAAA;CAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,IAAA,EAAA,GACA,OAAA,EAWA,QAAA,GAAA,GAEA,GAAA,GAAA,EAAA,EACA,OAAA,GAEA,EAAA,EAAA,SAAA,QAAA,OAMA,QAAA,GAAA,GAQA,IAAA,GAAA,GAJA,EAAA,EAAA,QAIA,EAAA,EAAA,EAAA,EAAA,SAAA,GAAA,IACA,EAAA,EAAA,IAAA,EAAA,GAIA,GAAA,IAAA,GAAA,EAAA,OACA,IAEA,EAAA,GAAA,EAAA,QAIA,QAAA,GAAA,GAKA,IAAA,OAAA,UAAA,CAGA,GAAA,GAAA,YAAA,SAEA,IAAA,EAAA,GAAA,CACA,GAAA,GAAA,SAAA,cAAA,EAAA,KACA,EAAA,OAAA,eAAA,EAEA,KAAA,EAAA,YACA,EAAA,GAUA,IADA,GAAA,GAAA,EAAA,EAAA,UACA,GAAA,IAAA,GACA,EAAA,OAAA,eAAA,GACA,EAAA,UAAA,EACA,EAAA,CAIA,GAAA,OAAA,GAQA,QAAA,GAAA,GASA,MAAA,GAAA,EAAA,EAAA,KAAA,GAGA,QAAA,GAAA,EAAA,GAuBA,MArBA,GAAA,IAEA,EAAA,aAAA,KAAA,EAAA,IAGA,EAAA,gBAAA,cAGA,EAAA,EAAA,GAGA,EAAA,cAAA,EAGA,EAAA,GAEA,EAAA,aAAA,GAGA,EAAA,eAAA,GAEA,EAKA,QAAA,GAAA,EAAA,GAEA,OAAA,UACA,EAAA,UAAA,EAAA,WAMA,EAAA,EAAA,EAAA,UAAA,EAAA,QAEA,EAAA,UAAA,EAAA,WAMA,QAAA,GAAA,EAAA,EAAA,GAYA,IAPA,GAAA,MAEA,EAAA,EAKA,IAAA,GAAA,IAAA,YAAA,WAAA,CAEA,IAAA,GAAA,GADA,EAAA,OAAA,oBAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,IAEA,EAAA,KACA,OAAA,eAAA,EAAA,EAEA,OAAA,yBAAA,EAAA,IACA,EAAA,GAAA,EAGA,GAAA,OAAA,eAAA,IAKA,QAAA,GAAA,GAGA,EAAA,iBACA,EAAA,kBAMA,QAAA,GAAA,GAIA,IAAA,EAAA,aAAA,YAAA,CAIA,GAAA,GAAA,EAAA,YAEA,GAAA,aAAA,SAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,EAAA,GAEA,IAAA,GAAA,EAAA,eACA,GAAA,gBAAA,SAAA,GACA,EAAA,KAAA,KAAA,EAAA,KAAA,IAEA,EAAA,aAAA,aAAA,GAKA,QAAA,GAAA,EAAA,EAAA,GAEA,EAAA,EAAA,aACA,IAAA,GAAA,KAAA,aAAA,EACA,GAAA,MAAA,KAAA,UACA,IAAA,GAAA,KAAA,aAAA,EACA,MAAA,0BACA,IAAA,GAEA,KAAA,yBAAA,EAAA,EAAA,GAUA,QAAA,GAAA,GAEA,MAAA,GACA,EAAA,EAAA,eADA,OAMA,QAAA,GAAA,EAAA,GAEA,EAAA,GAAA,EAGA,QAAA,GAAA,GACA,MAAA,YACA,MAAA,GAAA,IAKA,QAAA,GAAA,EAAA,EAAA,GAIA,MAAA,KAAA,EACA,EAAA,EAAA,GAEA,EAAA,EAAA,GAMA,QAAA,GAAA,EAAA,GAIA,GAAA,GAAA,EAAA,GAAA,EACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KAAA,GAAA,EAAA,GACA,MAAA,IAAA,GAAA,IAIA,KAAA,IAAA,EAAA,GACA,MAAA,IAAA,GAAA,KAKA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAGA,OADA,GAAA,aAAA,KAAA,GACA,EAGA,GAAA,GAAA,EAAA,EAKA,OAHA,GAAA,QAAA,MAAA,GACA,EAAA,EAAA,aAEA,EAIA,QAAA,GAAA,GACA,IAAA,EAAA,cAAA,EAAA,WAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,aAAA,MACA,EAAA,EAAA,GAAA,EAAA,UACA,IAAA,EAAA,CAEA,GAAA,GAAA,EAAA,KAAA,EAAA,UACA,MAAA,GAAA,EAAA,EACA,KAAA,IAAA,EAAA,QCtuCA,MAAA,GAAA,EAAA,KAMA,QAAA,GAAA,GAGA,GAAA,GAAA,EAAA,KAAA,KAAA,EAKA,OAFA,GAAA,WAAA,GAEA,EDixBA,IACA,EAAA,OAAA,gBAAA,UAEA,IACA,GAAA,EAAA,MAKA,EAAA,QAAA,SAAA,iBAIA,GAAA,EAAA,UAAA,IAAA,OAAA,qBAAA,OAAA,aAAA,YAAA,UAEA,IACA,EAAA,CAGA,GAAA,GAAA,YAIA,GAAA,YACA,EAAA,eAAA,EAEA,EAAA,YAAA,EACA,EAAA,QAAA,EACA,EAAA,WAAA,EAEA,EAAA,eAAA,EACA,EAAA,gBAAA,EACA,EAAA,gBAAA,EACA,EAAA,oBAAA,EAEA,EAAA,YAAA,EACA,EAAA,uBAEA,CAmIA,GAAA,IACA,iBAAA,gBAAA,YAAA,gBACA,gBAAA,mBAAA,iBAAA,iBAgNA,KAqBA,EAAA,+BC5pCA,EAAA,SAAA,cAAA,KAAA,UACA,EAAA,SAAA,gBAAA,KAAA,UAIA,EAAA,KAAA,UAAA,SAIA,UAAA,gBAAA,EACA,SAAA,cAAA,EAEA,SAAA,gBAAA,EACA,KAAA,UAAA,UAAA,EAEA,EAAA,SAAA,EAcA,EAAA,QAAA,EAMA,GAAA,KAEA,OAAA,WAAA","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (parts.length)\n      Array.prototype.push.apply(this, parts.slice());\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    this.impl = impl;\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(this.impl.target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return this.impl[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalName(el, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    this.impl = impl;\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    get length() {\n      return this.impl.length;\n    },\n    item: function(index) {\n      return this.impl.item(index);\n    },\n    contains: function(token) {\n      return this.impl.contains(token);\n    },\n    add: function() {\n      this.impl.add.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      this.impl.remove.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = this.impl.toggle.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.cache[redirectedUrl] = resource;\n        $p = $p.concat(this.pending[redirectedUrl]);\n      }\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          // If url was redirected, use the redirected location so paths are\n          // calculated relative to that.\n          this.onload(redirectedUrl || url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.pending[redirectedUrl] = null;\n      }\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : redirectedUrl;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    elt.import.__importParsed = true;\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};"," /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n\n    // install upgrade hook if HTMLImports are available\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        CustomElements.parser.parse(elt.import);\n      }\n    }\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"]}
\ No newline at end of file
diff --git a/pkg/web_components/pubspec.yaml b/pkg/web_components/pubspec.yaml
index b8f0bc5..1cc75cd 100644
--- a/pkg/web_components/pubspec.yaml
+++ b/pkg/web_components/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.3.5-dev.2
+version: 0.3.5
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://www.dartlang.org/polymer-dart/
 description: >
diff --git a/pkg/web_components/test/interop_test.dart b/pkg/web_components/test/interop_test.dart
index cbad6e1..20cce29 100644
--- a/pkg/web_components/test/interop_test.dart
+++ b/pkg/web_components/test/interop_test.dart
@@ -120,6 +120,16 @@
     expect(c.x, 7);
     expect(c.wrapperCount, 6);
   });
+
+  test('element can extend another element', () {
+    registerDartType('x-e', XEWrapper);
+    context.callMethod('addE');
+
+    var e = document.querySelector('x-e');
+    expect(e is XEWrapper, isTrue);
+    expect(e.x, 8);
+    expect(e.y, 9);
+  });
 }
 int _count = 0;
 
@@ -145,3 +155,9 @@
 class XDWrapper extends HtmlElement with Wrapper {
   XDWrapper.created() : super.created();
 }
+
+class XEWrapper extends HtmlElement with Wrapper {
+  XEWrapper.created() : super.created();
+
+  int get y => new JsObject.fromBrowserObject(this)['y'];
+}
diff --git a/pkg/web_components/test/interop_test.html b/pkg/web_components/test/interop_test.html
index 036c7ef..d49dcb9 100644
--- a/pkg/web_components/test/interop_test.html
+++ b/pkg/web_components/test/interop_test.html
@@ -32,13 +32,23 @@
     D.prototype.inc = function() { this.x = counter++; };
     D.prototype.createdCallback = function() { this.inc(); };
 
+    var E = { prototype: Object.create(D.prototype) };
+    E.prototype.inc2 = function() {
+      this.y = counter++;
+    };
+    E.prototype.createdCallback = function() {
+      D.prototype.createdCallback.call(this);
+      this.inc2();
+    };
+
     document.registerElement('x-a', A);
     document.registerElement('x-b', B);
     document.registerElement('x-d', D);
+    document.registerElement('x-e', E);
 
     function registerC() {
       var proto = Object.create(HTMLElement.prototype, {
-        inc: { value: function() { this.x = counter++; } }, 
+        inc: { value: function() { this.x = counter++; } },
         createdCallback: {
           value: function() { this.inc(); },
           configurable: true},
@@ -57,6 +67,9 @@
     function addD() {
       document.body.appendChild(document.createElement('x-d'));
     }
+    function addE() {
+      document.body.appendChild(document.createElement('x-e'));
+    }
   </script>
   <x-a id="i1"></x-a>
   <div is="x-b" id="i2"></div>
diff --git a/pkg/yaml/CHANGELOG.md b/pkg/yaml/CHANGELOG.md
index 261a666..e4f532c 100644
--- a/pkg/yaml/CHANGELOG.md
+++ b/pkg/yaml/CHANGELOG.md
@@ -1,3 +1,21 @@
+## 1.1.1
+
+* Fix broken type arguments that caused breakage on dart2js.
+
+* Fix an analyzer warning in `yaml_node_wrapper.dart`.
+
+## 1.1.0
+
+* Add new publicly-accessible constructors for `YamlNode` subclasses. These
+  constructors make it possible to use the same API to access non-YAML data as
+  YAML data.
+
+* Make `YamlException` inherit from source_map's [`SpanFormatException`][]. This
+  improves the error formatting and allows callers access to source range
+  information.
+
+[SpanFormatException]: (http://www.dartdocs.org/documentation/source_maps/0.9.2/index.html#source_maps/source_maps.SpanFormatException)
+
 ## 1.0.0+1
 
 * Fix a variable name typo.
diff --git a/pkg/yaml/lib/src/composer.dart b/pkg/yaml/lib/src/composer.dart
index 1a23bc6..8612067 100644
--- a/pkg/yaml/lib/src/composer.dart
+++ b/pkg/yaml/lib/src/composer.dart
@@ -34,7 +34,8 @@
   /// Returns the anchor to which an alias node refers.
   Node visitAlias(AliasNode alias) {
     if (!_anchors.containsKey(alias.anchor)) {
-      throw new YamlException("No anchor for alias ${alias.anchor}.");
+      throw new YamlException("No anchor for alias ${alias.anchor}.",
+          alias.span);
     }
     return _anchors[alias.anchor];
   }
@@ -56,8 +57,8 @@
 
     var result = _parseByTag(scalar);
     if (result != null) return setAnchor(scalar, result);
-    throw new YamlException('Invalid literal for ${scalar.tag}: '
-        '"${scalar.content}".');
+    throw new YamlException('Invalid literal for ${scalar.tag}.',
+        scalar.span);
   }
 
   ScalarNode _parseByTag(ScalarNode scalar) {
@@ -68,14 +69,15 @@
       case "float": return parseFloat(scalar);
       case "str": return parseString(scalar);
     }
-    throw new YamlException('Undefined tag: ${scalar.tag}.');
+    throw new YamlException('Undefined tag: ${scalar.tag}.', scalar.span);
   }
 
   /// Assigns a tag to the sequence and recursively composes its contents.
   Node visitSequence(SequenceNode seq) {
     var tagName = seq.tag.name;
     if (tagName != "!" && tagName != "?" && tagName != Tag.yaml("seq")) {
-      throw new YamlException("Invalid tag for sequence: ${seq.tag}.");
+      throw new YamlException("Invalid tag for sequence: ${seq.tag}.",
+          seq.span);
     }
 
     var result = setAnchor(seq,
@@ -88,7 +90,8 @@
   Node visitMapping(MappingNode map) {
     var tagName = map.tag.name;
     if (tagName != "!" && tagName != "?" && tagName != Tag.yaml("map")) {
-      throw new YamlException("Invalid tag for mapping: ${map.tag}.");
+      throw new YamlException("Invalid tag for mapping: ${map.tag}.",
+          map.span);
     }
 
     var result = setAnchor(map,
diff --git a/pkg/yaml/lib/src/constructor.dart b/pkg/yaml/lib/src/constructor.dart
index 5cf23c7..5931dae 100644
--- a/pkg/yaml/lib/src/constructor.dart
+++ b/pkg/yaml/lib/src/constructor.dart
@@ -26,14 +26,14 @@
 
   /// Returns the value of a scalar.
   YamlScalar visitScalar(ScalarNode scalar) =>
-      new YamlScalar(scalar.value, scalar.span);
+      new YamlScalar.internal(scalar.value, scalar.span);
 
   /// Converts a sequence into a List of Dart objects.
   YamlList visitSequence(SequenceNode seq) {
     var anchor = getAnchor(seq);
     if (anchor != null) return anchor;
     var nodes = [];
-    var dartSeq = setAnchor(seq, new YamlList(nodes, seq.span));
+    var dartSeq = setAnchor(seq, new YamlList.internal(nodes, seq.span));
     nodes.addAll(super.visitSequence(seq));
     return dartSeq;
   }
@@ -43,7 +43,7 @@
     var anchor = getAnchor(map);
     if (anchor != null) return anchor;
     var nodes = deepEqualsMap();
-    var dartMap = setAnchor(map, new YamlMap(nodes, map.span));
+    var dartMap = setAnchor(map, new YamlMap.internal(nodes, map.span));
     super.visitMapping(map).forEach((k, v) => nodes[k] = v);
     return dartMap;
   }
@@ -57,10 +57,14 @@
 
     // Re-wrap [value]'s contents so that it's associated with the span of the
     // anchor rather than its original definition.
-    if (value is YamlMap) return new YamlMap(value.nodes, anchored.span);
-    if (value is YamlList) return new YamlList(value.nodes, anchored.span);
-    assert(value is YamlScalar);
-    return new YamlScalar(value.value, anchored.span);
+    if (value is YamlMap) {
+      return new YamlMap.internal(value.nodes, anchored.span);
+    } else if (value is YamlList) {
+      return new YamlList.internal(value.nodes, anchored.span);
+    } else {
+      assert(value is YamlScalar);
+      return new YamlScalar.internal(value.value, anchored.span);
+    }
   }
 
   /// Records that [value] is the Dart object representing [anchored].
diff --git a/pkg/yaml/lib/src/model.dart b/pkg/yaml/lib/src/model.dart
index f0e839c..0973769 100644
--- a/pkg/yaml/lib/src/model.dart
+++ b/pkg/yaml/lib/src/model.dart
@@ -208,7 +208,7 @@
       return '"${escapedValue.join()}"';
     }
 
-    throw new YamlException('Unknown scalar value: "$value".');
+    throw new YamlException('Unknown scalar value.', span);
   }
 
   String toString() => '$tag "$content"';
diff --git a/pkg/yaml/lib/src/null_span.dart b/pkg/yaml/lib/src/null_span.dart
new file mode 100644
index 0000000..b3e3254
--- /dev/null
+++ b/pkg/yaml/lib/src/null_span.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 yaml.null_span;
+
+import 'package:path/path.dart' as p;
+import 'package:source_maps/source_maps.dart';
+
+/// A [Span] with no location information.
+///
+/// This is used with [YamlMap.wrap] and [YamlList.wrap] to provide means of
+/// accessing a non-YAML map that behaves transparently like a map parsed from
+/// YAML.
+class NullSpan extends Span {
+  Location get end => start;
+  final text = "";
+
+  NullSpan(String sourceUrl)
+      : this._(new NullLocation(sourceUrl));
+
+  NullSpan._(Location location)
+      : super(location, location, false);
+
+  String formatLocationMessage(String message, {bool useColors: false,
+      String color}) {
+    var locationMessage = sourceUrl == null ? "in an unknown location" :
+        "in ${p.prettyUri(sourceUrl)}";
+    return "$locationMessage: $message";
+  }
+}
+
+/// A [Location] with no location information.
+///
+/// This is used with [YamlMap.wrap] and [YamlList.wrap] to provide means of
+/// accessing a non-YAML map that behaves transparently like a map parsed from
+/// YAML.
+class NullLocation extends Location {
+  final String sourceUrl;
+  final line = 0;
+  final column = 0;
+
+  String get formatString => sourceUrl == null ? "unknown location" : sourceUrl;
+
+  NullLocation(this.sourceUrl)
+      : super(0);
+}
diff --git a/pkg/yaml/lib/src/yaml_exception.dart b/pkg/yaml/lib/src/yaml_exception.dart
index a863274..9d43717 100644
--- a/pkg/yaml/lib/src/yaml_exception.dart
+++ b/pkg/yaml/lib/src/yaml_exception.dart
@@ -4,12 +4,11 @@
 
 library yaml.exception;
 
+import 'package:source_maps/source_maps.dart';
+
 /// An error thrown by the YAML processor.
-class YamlException implements Exception {
-  final String _msg;
-
-  YamlException(this._msg);
-
-  String toString() => _msg;
+class YamlException extends SpanFormatException {
+  YamlException(String message, Span span)
+      : super(message, span);
 }
 
diff --git a/pkg/yaml/lib/src/yaml_node.dart b/pkg/yaml/lib/src/yaml_node.dart
index d0e0578..1aded2b 100644
--- a/pkg/yaml/lib/src/yaml_node.dart
+++ b/pkg/yaml/lib/src/yaml_node.dart
@@ -2,13 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.map;
+library yaml.yaml_node;
 
 import 'dart:collection' as collection;
 
 import 'package:collection/collection.dart';
 import 'package:source_maps/source_maps.dart';
 
+import 'null_span.dart';
+import 'yaml_node_wrapper.dart';
+
 /// An interface for parsed nodes from a YAML source tree.
 ///
 /// [YamlMap]s and [YamlList]s implement this interface in addition to the
@@ -37,14 +40,40 @@
 class YamlMap extends YamlNode with collection.MapMixin, UnmodifiableMapMixin  {
   final Span span;
 
+  /// A view of [this] where the keys and values are guaranteed to be
+  /// [YamlNode]s.
+  ///
+  /// The key type is `dynamic` to allow values to be accessed using
+  /// non-[YamlNode] keys, but [Map.keys] and [Map.forEach] will always expose
+  /// them as [YamlNode]s. For example, for `{"foo": [1, 2, 3]}` [nodes] will be
+  /// a map from a [YamlScalar] to a [YamlList], but since the key type is
+  /// `dynamic` `map.nodes["foo"]` will still work.
   final Map<dynamic, YamlNode> nodes;
 
   Map get value => this;
 
   Iterable get keys => nodes.keys.map((node) => node.value);
 
-  /// Users of the library should not construct [YamlMap]s manually.
-  YamlMap(Map<dynamic, YamlNode> nodes, this.span)
+  /// Creates an empty YamlMap.
+  ///
+  /// This map's [span] won't have useful location information. However, it will
+  /// have a reasonable implementation of [Span.getLocationMessage]. If
+  /// [sourceName] is passed, it's used as the [Span.sourceUrl].
+  factory YamlMap({String sourceName}) =>
+      new YamlMapWrapper(const {}, sourceName);
+
+  /// Wraps a Dart map so that it can be accessed (recursively) like a
+  /// [YamlMap].
+  ///
+  /// Any [Span]s returned by this map or its children will be dummies without
+  /// useful location information. However, they will have a reasonable
+  /// implementation of [Span.getLocationMessage]. If [sourceName] is passed,
+  /// it's used as the [Span.sourceUrl].
+  factory YamlMap.wrap(Map dartMap, {String sourceName}) =>
+      new YamlMapWrapper(dartMap, sourceName);
+
+  /// Users of the library should not use this constructor.
+  YamlMap.internal(Map<dynamic, YamlNode> nodes, this.span)
       : nodes = new UnmodifiableMapView<dynamic, YamlNode>(nodes);
 
   operator [](key) {
@@ -68,8 +97,26 @@
     throw new UnsupportedError("Cannot modify an unmodifiable List");
   }
 
-  /// Users of the library should not construct [YamlList]s manually.
-  YamlList(List<YamlNode> nodes, this.span)
+  /// Creates an empty YamlList.
+  ///
+  /// This list's [span] won't have useful location information. However, it
+  /// will have a reasonable implementation of [Span.getLocationMessage]. If
+  /// [sourceName] is passed, it's used as the [Span.sourceUrl].
+  factory YamlList({String sourceName}) =>
+      new YamlListWrapper(const [], sourceName);
+
+  /// Wraps a Dart list so that it can be accessed (recursively) like a
+  /// [YamlList].
+  ///
+  /// Any [Span]s returned by this list or its children will be dummies without
+  /// useful location information. However, they will have a reasonable
+  /// implementation of [Span.getLocationMessage]. If [sourceName] is passed,
+  /// it's used as the [Span.sourceUrl].
+  factory YamlList.wrap(List dartList, {String sourceName}) =>
+      new YamlListWrapper(dartList, sourceName);
+
+  /// Users of the library should not use this constructor.
+  YamlList.internal(List<YamlNode> nodes, this.span)
       : nodes = new UnmodifiableListView<YamlNode>(nodes);
 
   operator [](int index) => nodes[index].value;
@@ -85,8 +132,16 @@
 
   final value;
 
-  /// Users of the library should not construct [YamlScalar]s manually.
-  YamlScalar(this.value, this.span);
+  /// Wraps a Dart value in a [YamlScalar].
+  ///
+  /// This scalar's [span] won't have useful location information. However, it
+  /// will have a reasonable implementation of [Span.getLocationMessage]. If
+  /// [sourceName] is passed, it's used as the [Span.sourceUrl].
+  YamlScalar.wrap(this.value, {String sourceName})
+      : span = new NullSpan(sourceName);
+
+  /// Users of the library should not use this constructor.
+  YamlScalar.internal(this.value, this.span);
 
   String toString() => value.toString();
 }
diff --git a/pkg/yaml/lib/src/yaml_node_wrapper.dart b/pkg/yaml/lib/src/yaml_node_wrapper.dart
new file mode 100644
index 0000000..2dcaa23
--- /dev/null
+++ b/pkg/yaml/lib/src/yaml_node_wrapper.dart
@@ -0,0 +1,150 @@
+// 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 yaml.yaml_node_wrapper;
+
+import 'dart:collection';
+
+import 'package:collection/collection.dart' as pkg_collection;
+import 'package:source_maps/source_maps.dart';
+
+import 'null_span.dart';
+import 'yaml_node.dart';
+
+/// A wrapper that makes a normal Dart map behave like a [YamlMap].
+class YamlMapWrapper extends MapBase
+    with pkg_collection.UnmodifiableMapMixin
+    implements YamlMap {
+  final Map _dartMap;
+
+  final Span span;
+
+  final Map<dynamic, YamlNode> nodes;
+
+  Map get value => this;
+
+  Iterable get keys => _dartMap.keys;
+
+  YamlMapWrapper(Map dartMap, String sourceName)
+      : this._(dartMap, new NullSpan(sourceName));
+
+  YamlMapWrapper._(Map dartMap, Span span)
+      : _dartMap = dartMap,
+        span = span,
+        nodes = new _YamlMapNodes(dartMap, span);
+
+  operator [](Object key) {
+    var value = _dartMap[key];
+    if (value is Map) return new YamlMapWrapper._(value, span);
+    if (value is List) return new YamlListWrapper._(value, span);
+    return value;
+  }
+
+  int get hashCode => _dartMap.hashCode;
+
+  operator ==(Object other) =>
+      other is YamlMapWrapper && other._dartMap == _dartMap;
+}
+
+/// The implementation of [YamlMapWrapper.nodes] as a wrapper around the Dart
+/// map.
+class _YamlMapNodes extends MapBase<dynamic, YamlNode>
+    with pkg_collection.UnmodifiableMapMixin<dynamic, YamlNode> {
+  final Map _dartMap;
+
+  final Span _span;
+
+  Iterable get keys =>
+      _dartMap.keys.map((key) => new YamlScalar.internal(key, _span));
+
+  _YamlMapNodes(this._dartMap, this._span);
+
+  YamlNode operator [](Object key) {
+    // Use "as" here because key being assigned to invalidates type propagation.
+    if (key is YamlScalar) key = (key as YamlScalar).value;
+    if (!_dartMap.containsKey(key)) return null;
+    return _nodeForValue(_dartMap[key], _span);
+  }
+
+  int get hashCode => _dartMap.hashCode;
+
+  operator ==(Object other) =>
+      other is _YamlMapNodes && other._dartMap == _dartMap;
+}
+
+// TODO(nweiz): Use UnmodifiableListMixin when issue 18970 is fixed.
+/// A wrapper that makes a normal Dart list behave like a [YamlList].
+class YamlListWrapper extends ListBase implements YamlList {
+  final List _dartList;
+
+  final Span span;
+
+  final List<YamlNode> nodes;
+
+  List get value => this;
+
+  int get length => _dartList.length;
+
+  set length(int index) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List.");
+  }
+
+  YamlListWrapper(List dartList, String sourceName)
+      : this._(dartList, new NullSpan(sourceName));
+
+  YamlListWrapper._(List dartList, Span span)
+      : _dartList = dartList,
+        span = span,
+        nodes = new _YamlListNodes(dartList, span);
+
+  operator [](int index) {
+    var value = _dartList[index];
+    if (value is Map) return new YamlMapWrapper._(value, span);
+    if (value is List) return new YamlListWrapper._(value, span);
+    return value;
+  }
+
+  operator []=(int index, value) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List.");
+  }
+
+  int get hashCode => _dartList.hashCode;
+
+  operator ==(Object other) =>
+      other is YamlListWrapper && other._dartList == _dartList;
+}
+
+// TODO(nweiz): Use UnmodifiableListMixin when issue 18970 is fixed.
+/// The implementation of [YamlListWrapper.nodes] as a wrapper around the Dart
+/// list.
+class _YamlListNodes extends ListBase<YamlNode> {
+  final List _dartList;
+
+  final Span _span;
+
+  int get length => _dartList.length;
+
+  set length(int index) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List.");
+  }
+
+  _YamlListNodes(this._dartList, this._span);
+
+  YamlNode operator [](int index) => _nodeForValue(_dartList[index], _span);
+
+  operator []=(int index, value) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List.");
+  }
+
+  int get hashCode => _dartList.hashCode;
+
+  operator ==(Object other) =>
+      other is _YamlListNodes && other._dartList == _dartList;
+}
+
+YamlNode _nodeForValue(value, Span span) {
+  if (value is Map) return new YamlMapWrapper._(value, span);
+  if (value is List) return new YamlListWrapper._(value, span);
+  return new YamlScalar.internal(value, span);
+}
diff --git a/pkg/yaml/lib/yaml.dart b/pkg/yaml/lib/yaml.dart
index f59719d..0afc2cc 100644
--- a/pkg/yaml/lib/yaml.dart
+++ b/pkg/yaml/lib/yaml.dart
@@ -4,6 +4,8 @@
 
 library yaml;
 
+import 'package:string_scanner/string_scanner.dart';
+
 import 'src/composer.dart';
 import 'src/constructor.dart';
 import 'src/parser.dart';
@@ -40,7 +42,8 @@
 YamlNode loadYamlNode(String yaml, {String sourceName}) {
   var stream = loadYamlStream(yaml, sourceName: sourceName);
   if (stream.length != 1) {
-    throw new YamlException("Expected 1 document, were ${stream.length}.");
+    throw new YamlException("Expected 1 document, were ${stream.length}.",
+        stream.span);
   }
   return stream.nodes[0];
 }
@@ -62,12 +65,12 @@
   var pair;
   try {
     pair = new Parser(yaml, sourceName).l_yamlStream();
-  } on FormatException catch (error) {
-    throw new YamlException(error.toString());
+  } on StringScannerException catch (error) {
+    throw new YamlException(error.message, error.span);
   }
 
   var nodes = pair.first
       .map((doc) => new Constructor(new Composer(doc).compose()).construct())
       .toList();
-  return new YamlList(nodes, pair.last);
+  return new YamlList.internal(nodes, pair.last);
 }
diff --git a/pkg/yaml/pubspec.yaml b/pkg/yaml/pubspec.yaml
index 50fc3db..c160482 100644
--- a/pkg/yaml/pubspec.yaml
+++ b/pkg/yaml/pubspec.yaml
@@ -1,12 +1,14 @@
 name: yaml
-version: 1.0.0+1
+version: 1.1.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: A parser for YAML.
 dependencies:
   collection: ">=0.9.2 <0.10.0"
+  path: ">=1.2.0 <2.0.0"
   string_scanner: ">=0.0.2 <0.1.0"
+  source_maps: ">=0.9.2 <0.10.0"
 dev_dependencies:
   unittest: ">=0.9.0 <0.12.0"
 environment:
-  sdk: ">=0.8.10+6 <2.0.0"
+  sdk: ">=1.5.0-dev.0.0 <2.0.0"
diff --git a/pkg/yaml/test/yaml_node_wrapper_test.dart b/pkg/yaml/test/yaml_node_wrapper_test.dart
new file mode 100644
index 0000000..8bf4761
--- /dev/null
+++ b/pkg/yaml/test/yaml_node_wrapper_test.dart
@@ -0,0 +1,163 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.node_wrapper_test;
+
+import 'package:source_maps/source_maps.dart';
+import 'package:unittest/unittest.dart';
+import 'package:yaml/yaml.dart';
+
+main() {
+  test("YamlMap() with no sourceName", () {
+    var map = new YamlMap();
+    expect(map, isEmpty);
+    expect(map.nodes, isEmpty);
+    expect(map.span, isNullSpan(isNull));
+  });
+
+  test("YamlMap() with a sourceName", () {
+    var map = new YamlMap(sourceName: "source");
+    expect(map.span, isNullSpan("source"));
+  });
+
+  test("YamlList() with no sourceName", () {
+    var list = new YamlList();
+    expect(list, isEmpty);
+    expect(list.nodes, isEmpty);
+    expect(list.span, isNullSpan(isNull));
+  });
+
+  test("YamlList() with a sourceName", () {
+    var list = new YamlList(sourceName: "source");
+    expect(list.span, isNullSpan("source"));
+  });
+
+  test("YamlMap.wrap() with no sourceName", () {
+    var map = new YamlMap.wrap({
+      "list": [1, 2, 3],
+      "map": {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "scalar": "value"
+    });
+
+    expect(map, equals({
+      "list": [1, 2, 3],
+      "map": {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "scalar": "value"
+    }));
+
+    expect(map.span, isNullSpan(isNull));
+    expect(map["list"], new isInstanceOf<YamlList>());
+    expect(map["list"].nodes[0], new isInstanceOf<YamlScalar>());
+    expect(map["list"].span, isNullSpan(isNull));
+    expect(map["map"], new isInstanceOf<YamlMap>());
+    expect(map["map"].nodes["foo"], new isInstanceOf<YamlScalar>());
+    expect(map["map"]["nested"], new isInstanceOf<YamlList>());
+    expect(map["map"].span, isNullSpan(isNull));
+    expect(map.nodes["scalar"], new isInstanceOf<YamlScalar>());
+    expect(map.nodes["scalar"].value, "value");
+    expect(map.nodes["scalar"].span, isNullSpan(isNull));
+    expect(map["scalar"], "value");
+    expect(map.keys, unorderedEquals(["list", "map", "scalar"]));
+    expect(map.nodes.keys, everyElement(new isInstanceOf<YamlScalar>()));
+    expect(map.nodes[new YamlScalar.wrap("list")], equals([1, 2, 3]));
+  });
+
+  test("YamlMap.wrap() with a sourceName", () {
+    var map = new YamlMap.wrap({
+      "list": [1, 2, 3],
+      "map": {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "scalar": "value"
+    }, sourceName: "source");
+
+    expect(map.span, isNullSpan("source"));
+    expect(map["list"].span, isNullSpan("source"));
+    expect(map["map"].span, isNullSpan("source"));
+    expect(map.nodes["scalar"].span, isNullSpan("source"));
+  });
+
+  test("YamlList.wrap() with no sourceName", () {
+    var list = new YamlList.wrap([
+      [1, 2, 3],
+      {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "value"
+    ]);
+
+    expect(list, equals([
+      [1, 2, 3],
+      {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "value"
+    ]));
+
+    expect(list.span, isNullSpan(isNull));
+    expect(list[0], new isInstanceOf<YamlList>());
+    expect(list[0].nodes[0], new isInstanceOf<YamlScalar>());
+    expect(list[0].span, isNullSpan(isNull));
+    expect(list[1], new isInstanceOf<YamlMap>());
+    expect(list[1].nodes["foo"], new isInstanceOf<YamlScalar>());
+    expect(list[1]["nested"], new isInstanceOf<YamlList>());
+    expect(list[1].span, isNullSpan(isNull));
+    expect(list.nodes[2], new isInstanceOf<YamlScalar>());
+    expect(list.nodes[2].value, "value");
+    expect(list.nodes[2].span, isNullSpan(isNull));
+    expect(list[2], "value");
+  });
+
+  test("YamlList.wrap() with a sourceName", () {
+    var list = new YamlList.wrap([
+      [1, 2, 3],
+      {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "value"
+    ]);
+
+    expect(list.span, isNullSpan(isNull));
+    expect(list[0].span, isNullSpan(isNull));
+    expect(list[1].span, isNullSpan(isNull));
+    expect(list.nodes[2].span, isNullSpan(isNull));
+  });
+
+  solo_test("re-wrapped objects equal one another", () {
+    var list = new YamlList.wrap([
+      [1, 2, 3],
+      {"foo": "bar"}
+    ]);
+
+    expect(list[0] == list[0], isTrue);
+    expect(list[0].nodes == list[0].nodes, isTrue);
+    expect(list[0] == new YamlList.wrap([1, 2, 3]), isFalse);
+    expect(list[1] == list[1], isTrue);
+    expect(list[1].nodes == list[1].nodes, isTrue);
+    expect(list[1] == new YamlMap.wrap({"foo": "bar"}), isFalse);
+  });
+}
+
+Matcher isNullSpan(sourceUrl) => predicate((span) {
+  expect(span, new isInstanceOf<Span>());
+  expect(span.length, equals(0));
+  expect(span.text, isEmpty);
+  expect(span.isIdentifier, isFalse);
+  expect(span.start, equals(span.end));
+  expect(span.start.offset, equals(0));
+  expect(span.start.line, equals(0));
+  expect(span.start.column, equals(0));
+  expect(span.sourceUrl, sourceUrl);
+  return true;
+});
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index 2d498e2..3be7164 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -41,7 +41,7 @@
             '--input_cc', '<(builtin_in_cc_file)',
             '--include', 'bin/builtin.h',
             '--var_name', 'dart::bin::Builtin::builtin_source_paths_',
-            '--library_name', 'dart:builtin',
+            '--library_name', 'dart:_builtin',
             '<@(_sources)',
           ],
           'message': 'Generating ''<(builtin_cc_file)'' file.'
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index c20f7d1..8f6ea77 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -308,9 +308,34 @@
 }
 
 
-void _loadScript(String uri, List<int> data) native "Builtin_LoadScript";
+int _numOutstandingLoadRequests = 0;
 
-void _asyncLoadError(uri, error) native "Builtin_AsyncLoadError";
+void _signalDoneLoading() native "Builtin_DoneLoading";
+
+void _loadScriptCallback(String uri, List<int> data) native "Builtin_LoadScript";
+
+void _loadScript(String uri, List<int> data) {
+  // TODO: Currently a compilation error while loading the script is
+  // fatal for the isolate. _loadScriptCallback() does not return and
+  // the _numOutstandingLoadRequests counter remains out of sync.
+  _loadScriptCallback(uri, data);
+  assert(_numOutstandingLoadRequests > 0);
+  _numOutstandingLoadRequests--;
+  _logResolution("native Builtin_LoadScript($uri) completed, "
+                 "${_numOutstandingLoadRequests} requests remaining");
+  if (_numOutstandingLoadRequests == 0) {
+    _signalDoneLoading();
+  }
+}
+
+
+void _asyncLoadErrorCallback(uri, error) native "Builtin_AsyncLoadError";
+
+void _asyncLoadError(uri, error) {
+  assert(_numOutstandingLoadRequests > 0);
+  _numOutstandingLoadRequests--;
+  _asyncLoadErrorCallback(uri, error);
+}
 
 
 // Asynchronously loads script data (source or snapshot) through
@@ -318,32 +343,50 @@
 _loadDataAsync(String uri) {
   uri = _resolveScriptUri(uri);
   Uri sourceUri = Uri.parse(uri);
+  _numOutstandingLoadRequests++;
+  _logResolution("_loadDataAsync($uri), "
+                 "${_numOutstandingLoadRequests} requests outstanding");
   if (sourceUri.scheme == 'http') {
     _httpGet(sourceUri, (data) {
       _loadScript(uri, data);
     });
   } else {
-    _loadDataFromFileAsync(uri);
+    var sourceFile = new File(_filePathFromUri(uri));
+    sourceFile.readAsBytes().then((data) {
+      _loadScript(uri, data);
+    },
+    onError: (e) {
+      _asyncLoadError(uri, e);
+    });
   }
 }
 
-_loadDataFromFileAsync(String uri) {
-  var sourceFile = new File(_filePathFromUri(uri));
-  sourceFile.readAsBytes().then((data) {
-    _loadScript(uri, data);
-  },
-  onError: (e) {
-    _asyncLoadError(uri, e);
-  });
+
+void _loadLibrarySourceCallback(tag, uri, libraryUri, text)
+    native "Builtin_LoadLibrarySource";
+
+void _loadLibrarySource(tag, uri, libraryUri, text) {
+  // TODO: Currently a compilation error while loading the library is
+  // fatal for the isolate. _loadLibraryCallback() does not return and
+  // the _numOutstandingLoadRequests counter remains out of sync.
+  _loadLibrarySourceCallback(tag, uri, libraryUri, text);
+  assert(_numOutstandingLoadRequests > 0);
+  _numOutstandingLoadRequests--;
+  _logResolution("native Builtin_LoadLibrarySource($uri) completed, "
+                 "${_numOutstandingLoadRequests} requests remaining");
+  if (_numOutstandingLoadRequests == 0) {
+    _signalDoneLoading();
+  }
 }
 
 
-void _loadLibrarySource(tag, uri, libraryUri, text)
-    native "Builtin_LoadLibrarySource";
-
+// Asynchronously loads source code through an http or file uri.
 _loadSourceAsync(int tag, String uri, String libraryUri) {
   var filePath = _filePathFromUri(uri);
   Uri sourceUri = Uri.parse(filePath);
+  _numOutstandingLoadRequests++;
+  _logResolution("_loadLibrarySource($uri), "
+                 "${_numOutstandingLoadRequests} requests outstanding");
   if (sourceUri.scheme == 'http') {
     _httpGet(sourceUri, (data) {
       var text = UTF8.decode(data);
diff --git a/runtime/bin/builtin_impl_sources.gypi b/runtime/bin/builtin_impl_sources.gypi
index 2d997bc..1c38b33 100644
--- a/runtime/bin/builtin_impl_sources.gypi
+++ b/runtime/bin/builtin_impl_sources.gypi
@@ -2,7 +2,7 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-# This file contains all C++ sources for the dart:builtin library and
+# This file contains all C++ sources for the dart:_builtin library and
 # some of the C++ sources for the dart:io library.  The rest are in
 # io_impl_sources.gypi.
 {
diff --git a/runtime/bin/builtin_natives.cc b/runtime/bin/builtin_natives.cc
index 8298b97..6068f4d 100644
--- a/runtime/bin/builtin_natives.cc
+++ b/runtime/bin/builtin_natives.cc
@@ -67,6 +67,7 @@
   V(Builtin_LoadScript, 2)                                                     \
   V(Builtin_LoadLibrarySource, 4)                                              \
   V(Builtin_AsyncLoadError, 2)                                                 \
+  V(Builtin_DoneLoading, 0)                                                    \
 
 
 BUILTIN_NATIVE_LIST(DECLARE_FUNCTION);
diff --git a/runtime/bin/builtin_sources.gypi b/runtime/bin/builtin_sources.gypi
index cbfd1f0..fbf642e 100644
--- a/runtime/bin/builtin_sources.gypi
+++ b/runtime/bin/builtin_sources.gypi
@@ -2,7 +2,7 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-# This file contains all dart sources for the dart:builtin library.
+# This file contains all dart sources for the dart:_builtin library.
 {
   'sources': [
     'builtin.dart',
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 8ec584f..c8cf522 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -25,7 +25,7 @@
 const char* DartUtils::kDartScheme = "dart:";
 const char* DartUtils::kDartExtensionScheme = "dart-ext:";
 const char* DartUtils::kAsyncLibURL = "dart:async";
-const char* DartUtils::kBuiltinLibURL = "dart:builtin";
+const char* DartUtils::kBuiltinLibURL = "dart:_builtin";
 const char* DartUtils::kCoreLibURL = "dart:core";
 const char* DartUtils::kInternalLibURL = "dart:_internal";
 const char* DartUtils::kIsolateLibURL = "dart:isolate";
@@ -679,7 +679,9 @@
 
   intptr_t num_bytes = 0;
   Dart_Handle result = Dart_ListLength(data, &num_bytes);
-  DART_CHECK_VALID(result);
+  if (Dart_IsError(result)) {
+    Dart_PropagateError(result);
+  }
 
   uint8_t* buffer = reinterpret_cast<uint8_t*>(malloc(num_bytes));
   Dart_ListGetAsBytes(data, 0, buffer, num_bytes);
@@ -739,6 +741,16 @@
 }
 
 
+// Callback function that gets called from dartutils when there are
+// no more outstanding load requests.
+void FUNCTION_NAME(Builtin_DoneLoading)(Dart_NativeArguments args) {
+  Dart_Handle res = Dart_FinalizeLoading();
+  if (Dart_IsError(res)) {
+    Dart_PropagateError(res);
+  }
+}
+
+
 Dart_Handle DartUtils::LoadSource(Dart_Handle library,
                                   Dart_Handle url,
                                   Dart_LibraryTag tag,
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index 4ab57c3..a67e249 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -606,7 +606,7 @@
 }
 
 
-int Handle::Available() {
+intptr_t Handle::Available() {
   ScopedLock lock(this);
   if (data_ready_ == NULL) return 0;
   ASSERT(!data_ready_->IsEmpty());
@@ -614,10 +614,11 @@
 }
 
 
-int Handle::Read(void* buffer, int num_bytes) {
+intptr_t Handle::Read(void* buffer, intptr_t num_bytes) {
   ScopedLock lock(this);
   if (data_ready_ == NULL) return 0;
-  num_bytes = data_ready_->Read(buffer, num_bytes);
+  num_bytes = data_ready_->Read(
+      buffer, Utils::Minimum<intptr_t>(num_bytes, INT_MAX));
   if (data_ready_->IsEmpty()) {
     OverlappedBuffer::DisposeBuffer(data_ready_);
     data_ready_ = NULL;
@@ -627,11 +628,12 @@
 }
 
 
-int Handle::RecvFrom(
-    void* buffer, int num_bytes, struct sockaddr* sa, socklen_t sa_len) {
+intptr_t Handle::RecvFrom(
+    void* buffer, intptr_t num_bytes, struct sockaddr* sa, socklen_t sa_len) {
   ScopedLock lock(this);
   if (data_ready_ == NULL) return 0;
-  num_bytes = data_ready_->Read(buffer, num_bytes);
+  num_bytes = data_ready_->Read(
+      buffer, Utils::Minimum<intptr_t>(num_bytes, INT_MAX));
   if (data_ready_->from()->sa_family == AF_INET) {
     ASSERT(sa_len >= sizeof(struct sockaddr_in));
     memmove(sa, data_ready_->from(), sizeof(struct sockaddr_in));
@@ -649,21 +651,24 @@
 }
 
 
-int Handle::Write(const void* buffer, int num_bytes) {
+intptr_t Handle::Write(const void* buffer, intptr_t num_bytes) {
   ScopedLock lock(this);
   if (pending_write_ != NULL) return 0;
   if (num_bytes > kBufferSize) num_bytes = kBufferSize;
   ASSERT(SupportsOverlappedIO());
   if (completion_port_ == INVALID_HANDLE_VALUE) return 0;
-  pending_write_ = OverlappedBuffer::AllocateWriteBuffer(num_bytes);
-  pending_write_->Write(buffer, num_bytes);
+  int truncated_bytes = Utils::Minimum<intptr_t>(num_bytes, INT_MAX);
+  pending_write_ = OverlappedBuffer::AllocateWriteBuffer(truncated_bytes);
+  pending_write_->Write(buffer, truncated_bytes);
   if (!IssueWrite()) return -1;
-  return num_bytes;
+  return truncated_bytes;
 }
 
 
-int Handle::SendTo(
-    const void* buffer, int num_bytes, struct sockaddr* sa, socklen_t sa_len) {
+intptr_t Handle::SendTo(const void* buffer,
+                        intptr_t num_bytes,
+                        struct sockaddr* sa,
+                        socklen_t sa_len) {
   ScopedLock lock(this);
   if (pending_write_ != NULL) return 0;
   if (num_bytes > kBufferSize) num_bytes = kBufferSize;
@@ -725,7 +730,7 @@
   }
 }
 
-int StdHandle::Write(const void* buffer, int num_bytes) {
+intptr_t StdHandle::Write(const void* buffer, intptr_t num_bytes) {
   ScopedLock lock(this);
   if (pending_write_ != NULL) return 0;
   if (num_bytes > kBufferSize) num_bytes = kBufferSize;
@@ -752,9 +757,11 @@
       locker.Wait(Monitor::kNoTimeout);
     }
   }
+  // Only queue up to INT_MAX bytes.
+  int truncated_bytes = Utils::Minimum<intptr_t>(num_bytes, INT_MAX);
   // Create buffer and notify thread about the new handle.
-  pending_write_ = OverlappedBuffer::AllocateWriteBuffer(num_bytes);
-  pending_write_->Write(buffer, num_bytes);
+  pending_write_ = OverlappedBuffer::AllocateWriteBuffer(truncated_bytes);
+  pending_write_->Write(buffer, truncated_bytes);
   locker.Notify();
   return 0;
 }
diff --git a/runtime/bin/eventhandler_win.h b/runtime/bin/eventhandler_win.h
index 4bac8f4..fc6af0d 100644
--- a/runtime/bin/eventhandler_win.h
+++ b/runtime/bin/eventhandler_win.h
@@ -189,15 +189,17 @@
   virtual ~Handle();
 
   // Socket interface exposing normal socket operations.
-  int Available();
-  int Read(void* buffer, int num_bytes);
-  int RecvFrom(
-      void* buffer, int num_bytes, struct sockaddr* sa, socklen_t addr_len);
-  virtual int Write(const void* buffer, int num_bytes);
-  virtual int SendTo(const void* buffer,
-                     int num_bytes,
-                     struct sockaddr* sa,
-                     socklen_t sa_len);
+  intptr_t Available();
+  intptr_t Read(void* buffer, intptr_t num_bytes);
+  intptr_t RecvFrom(void* buffer,
+                    intptr_t num_bytes,
+                    struct sockaddr* sa,
+                    socklen_t addr_len);
+  virtual intptr_t Write(const void* buffer, intptr_t num_bytes);
+  virtual intptr_t SendTo(const void* buffer,
+                          intptr_t num_bytes,
+                          struct sockaddr* sa,
+                          socklen_t sa_len);
 
   // Internal interface used by the event handler.
   virtual bool IssueRead();
@@ -324,7 +326,7 @@
   }
 
   virtual void DoClose();
-  virtual int Write(const void* buffer, int num_bytes);
+  virtual intptr_t Write(const void* buffer, intptr_t num_bytes);
 
   void WriteSyncCompleteAsync();
   void RunWriteLoop();
diff --git a/runtime/bin/file_system_watcher_macos.cc b/runtime/bin/file_system_watcher_macos.cc
index 88d98d4..93177f2 100644
--- a/runtime/bin/file_system_watcher_macos.cc
+++ b/runtime/bin/file_system_watcher_macos.cc
@@ -113,7 +113,7 @@
           array,
           kFSEventStreamEventIdSinceNow,
           0.10,
-          kFSEventStreamCreateFlagNoDefer | kFSEventStreamCreateFlagFileEvents);
+          kFSEventStreamCreateFlagFileEvents);
       CFRelease(array);
 
       node->set_ref(ref);
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 13b7938..2c0047a 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -65,12 +65,14 @@
 static bool has_print_script = false;
 
 
+static const char* DEFAULT_VM_SERVICE_SERVER_IP = "127.0.0.1";
+static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181;
 // VM Service options.
 static bool start_vm_service = false;
-static const char *vm_service_server_ip = NULL;
-static int vm_service_server_port = -1;
-static const char *DEFAULT_VM_SERVICE_SERVER_IP = "127.0.0.1";
-static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181;
+static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP;
+// The 0 port is a magic value which results in the first available port
+// being allocated.
+static int vm_service_server_port = 0;
 
 // The environment provided through the command line using -D options.
 static dart::HashMap* environment = NULL;
@@ -434,19 +436,30 @@
             break;
           }
         }
+        i++;
+        continue;  // '-p' is not a VM flag so don't add to vm options.
       } else if (strncmp(argv[i], kChecked, strlen(kChecked)) == 0) {
         vm_options->AddArgument("--checked");
+        i++;
+        continue;  // '-c' is not a VM flag so don't add to vm options.
       } else if (!IsValidFlag(argv[i], kPrefix, kPrefixLen)) {
         break;
       }
+      // The following two flags are processed by both the embedder and
+      // the VM.
       const char* kPrintFlags1 = "--print-flags";
       const char* kPrintFlags2 = "--print_flags";
+      const char* kVerboseDebug1 = "--verbose_debug";
+      const char* kVerboseDebug2 = "--verbose-debug";
       if ((strncmp(argv[i], kPrintFlags1, strlen(kPrintFlags1)) == 0) ||
           (strncmp(argv[i], kPrintFlags2, strlen(kPrintFlags2)) == 0)) {
         *print_flags_seen = true;
-      }
-      const char* kVerboseDebug = "--verbose_debug";
-      if (strncmp(argv[i], kVerboseDebug, strlen(kVerboseDebug)) == 0) {
+      } else if ((strncmp(argv[i],
+                          kVerboseDebug1,
+                          strlen(kVerboseDebug1)) == 0) ||
+                 (strncmp(argv[i],
+                          kVerboseDebug2,
+                          strlen(kVerboseDebug2)) == 0)) {
         *verbose_debug_seen = true;
       }
       vm_options->AddArgument(argv[i]);
@@ -938,6 +951,7 @@
   bool print_flags_seen = false;
   bool verbose_debug_seen = false;
 
+  vm_options.AddArgument("--no_write_protect_code");
   // Perform platform specific initialization.
   if (!Platform::Initialize()) {
     Log::PrintErr("Initialization failed\n");
@@ -1013,8 +1027,7 @@
     if (!start_debugger) {
       DebuggerConnectionHandler::InitForVmService();
     }
-    ASSERT(vm_service_server_ip != NULL && vm_service_server_port >= 0);
-    bool r = VmService::Start(vm_service_server_ip , vm_service_server_port);
+    bool r = VmService::Start(vm_service_server_ip, vm_service_server_port);
     if (!r) {
       Log::PrintErr("Could not start VM Service isolate %s\n",
                     VmService::GetErrorMessage());
diff --git a/runtime/bin/net/nss.gyp b/runtime/bin/net/nss.gyp
index c811f31..cbd86a8 100644
--- a/runtime/bin/net/nss.gyp
+++ b/runtime/bin/net/nss.gyp
@@ -50,21 +50,10 @@
       },
       # Added by Dart.
       'Dart_x64_Base': {
-        'conditions': [
-          # On Windows, Dart is always built as a 32-bit version,
-          # even if a 64-bit build is requested.
-          ['OS=="win"', {
-            'defines': [
-              'NSS_X86_OR_X64',
-              'NSS_X86',
-              '_X86_',
-              ],
-            }, {
-            'defines': [
-              'NSS_X86_OR_X64',
-              'NSS_X64',
-              'NSS_USE_64',
-          ]}],
+        'defines': [
+          'NSS_X86_OR_X64',
+          'NSS_X64',
+          'NSS_USE_64',
         ],
       },
       # Added by Dart.
@@ -89,7 +78,32 @@
               # Do not compile NSPR and NSS with /D _UNICODE /D UNICODE.
               'CharacterSet': '0'
             }
-          }
+          },
+          # Added by Dart. All target_arch specific defines are taken
+          # from below.
+          'Dart_ia32_Base': {
+            'defines': [
+              'NSS_X86_OR_X64',
+              'NSS_X86',
+              '_X86_',
+              'MP_ASSEMBLY_MULTIPLY',
+              'MP_ASSEMBLY_SQUARE',
+              'MP_ASSEMBLY_DIV_2DX1D',
+              'MP_USE_UINT_DIGIT',
+              'MP_NO_MP_WORD',
+            ],
+          },
+          'Dart_x64_Base': {
+            'defines': [
+              'NSS_USE_64',
+              'NSS_X86_OR_X64',
+              'NSS_X64',
+              '_AMD64_',
+              'MP_CHAR_STORE_SLOW',
+              'MP_IS_LITTLE_ENDIAN',
+              'WIN64',
+            ],
+          },
         },
         'defines!': [
           'WIN32_LEAN_AND_MEAN',
@@ -433,13 +447,14 @@
             ['exclude', 'nspr/pr/src/md/unix/'],
             ['exclude', 'nspr/pr/src/pthreads/'],
           ],
-          'conditions': [
-            ['target_arch=="ia32"', {
-              'defines': [
-                '_X86_',
-              ],
-            }],
-          ],
+          # Changed by Dart. We don't use target_arch.
+          # 'conditions': [
+          #  ['target_arch=="ia32"', {
+          #    'defines': [
+          #      '_X86_',
+          #    ],
+          #  }],
+          # ],
         }],
         ['component == "static_library"', {
           'defines': [
@@ -594,6 +609,7 @@
       # should be on 'nss'.
       'suppress_wildcard': 1,
       'sources': [
+        'os_windows.c',
         '<(nss_directory)/nss/lib/base/arena.c',
         '<(nss_directory)/nss/lib/base/base.h',
         '<(nss_directory)/nss/lib/base/baset.h',
@@ -1306,38 +1322,43 @@
           },
           'sources!': [
             '<(nss_directory)/nss/lib/freebl/mpi/mpi_amd64.c',
+            # If needed it will be included by os_windows.c.
+            '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
           ],
-          'conditions': [
-            ['target_arch=="ia32"', {
-              'defines': [
-                'NSS_X86_OR_X64',
-                'NSS_X86',
-                '_X86_',
-                'MP_ASSEMBLY_MULTIPLY',
-                'MP_ASSEMBLY_SQUARE',
-                'MP_ASSEMBLY_DIV_2DX1D',
-                'MP_USE_UINT_DIGIT',
-                'MP_NO_MP_WORD',
-              ],
-            }],
-            ['target_arch=="x64"', {
-              'defines': [
-                'NSS_USE_64',
-                'NSS_X86_OR_X64',
-                'NSS_X64',
-                '_AMD64_',
-                'MP_CHAR_STORE_SLOW',
-                'MP_IS_LITTLE_ENDIAN',
-                'WIN64',
-              ],
-              'sources!': [
-                '<(nss_directory)/nss/lib/freebl/mpi/mpi_amd64.c',
-                '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
-              ],
-            }],
-          ],
+          # Changed by Dart. We don't use target_arch. This was moved into
+          # configurations instead.
+          # 'conditions': [
+          #   ['target_arch=="ia32"', {
+          #     'defines': [
+          #       'NSS_X86_OR_X64',
+          #       'NSS_X86',
+          #       '_X86_',
+          #       'MP_ASSEMBLY_MULTIPLY',
+          #       'MP_ASSEMBLY_SQUARE',
+          #       'MP_ASSEMBLY_DIV_2DX1D',
+          #       'MP_USE_UINT_DIGIT',
+          #       'MP_NO_MP_WORD',
+          #     ],
+          #   }],
+          #   ['target_arch=="x64"', {
+          #     'defines': [
+          #       'NSS_USE_64',
+          #       'NSS_X86_OR_X64',
+          #       'NSS_X64',
+          #       '_AMD64_',
+          #       'MP_CHAR_STORE_SLOW',
+          #       'MP_IS_LITTLE_ENDIAN',
+          #       'WIN64',
+          #     ],
+          #     'sources!': [
+          #       '<(nss_directory)/nss/lib/freebl/mpi/mpi_amd64.c',
+          #       '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
+          #     ],
+          #    }],
+          # ],
         }, { # else: OS!="win"
           'sources!': [
+            'os_windows.c',
             # mpi_x86_asm.c contains MSVC inline assembly code.
             '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
           ],
diff --git a/runtime/bin/platform_win.cc b/runtime/bin/platform_win.cc
index 85b6694..0d3cb11 100644
--- a/runtime/bin/platform_win.cc
+++ b/runtime/bin/platform_win.cc
@@ -59,8 +59,10 @@
 }
 
 
-void Platform::FreeEnvironment(char** env, int count) {
-  for (int i = 0; i < count; i++) free(env[i]);
+void Platform::FreeEnvironment(char** env, intptr_t count) {
+  for (intptr_t i = 0; i < count; i++) {
+    free(env[i]);
+  }
   delete[] env;
 }
 
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index 586d6d4..213d446 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -47,7 +47,8 @@
   if ((run_filter == kAllBenchmarks) ||
       (strcmp(run_filter, this->name()) == 0)) {
     this->Run();
-    OS::Print("%s(RunTime): %" Pd "\n", this->name(), this->score());
+    OS::Print("%s(%s): %" Pd "\n",
+              this->name(), this->score_kind(), this->score());
     run_matches++;
   } else if (run_filter == kList) {
     fprintf(stdout, "%s\n", this->name());
diff --git a/runtime/bin/service_object_patch.dart b/runtime/bin/service_object_patch.dart
index b714971..348e3b2 100644
--- a/runtime/bin/service_object_patch.dart
+++ b/runtime/bin/service_object_patch.dart
@@ -6,6 +6,7 @@
 final Map _servicePathMap = {
   'http' : {
     'servers' : _httpServersServiceObject,
+    'serverconnections' : _httpServerConnectionsServiceObject,
   },
   'sockets' : _socketsServiceObject,
   'websockets' : _webSocketsServiceObject,
@@ -15,6 +16,8 @@
   'processes' : _processesServiceObject,
 };
 
+String _getServicePath(obj) => obj._servicePath;
+
 String _serviceObjectHandler(List<String> paths,
                              List<String> keys,
                              List<String> values) {
@@ -85,6 +88,17 @@
   };
 }
 
+Map _httpServerConnectionsServiceObject(args) {
+  if (args.length == 1) {
+    var connection = _HttpConnection._connections[int.parse(args.first)];
+    if (connection == null) {
+      return {};
+    }
+    return connection._toJSON(false);
+  }
+  return _makeServiceError("http/serverconnections can not be listed");
+}
+
 Map _socketsServiceObject(args) {
   if (args.length == 1) {
     var socket = _NativeSocket._sockets[int.parse(args.first)];
diff --git a/runtime/bin/socket.h b/runtime/bin/socket.h
index 926cc31..9471c5a 100644
--- a/runtime/bin/socket.h
+++ b/runtime/bin/socket.h
@@ -221,11 +221,11 @@
 
   static bool Initialize();
   static intptr_t Available(intptr_t fd);
-  static int Read(intptr_t fd, void* buffer, intptr_t num_bytes);
-  static int Write(intptr_t fd, const void* buffer, intptr_t num_bytes);
-  static int SendTo(
+  static intptr_t Read(intptr_t fd, void* buffer, intptr_t num_bytes);
+  static intptr_t Write(intptr_t fd, const void* buffer, intptr_t num_bytes);
+  static intptr_t SendTo(
       intptr_t fd, const void* buffer, intptr_t num_bytes, RawAddr addr);
-  static int RecvFrom(
+  static intptr_t RecvFrom(
       intptr_t fd, void* buffer, intptr_t num_bytes, RawAddr* addr);
   static intptr_t Create(RawAddr addr);
   static intptr_t Connect(intptr_t fd, RawAddr addr, const intptr_t port);
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 56a065d..96175cf 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -101,7 +101,7 @@
 }
 
 
-int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
+intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
   ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
@@ -114,7 +114,7 @@
 }
 
 
-int Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
+intptr_t Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
                      RawAddr* addr) {
   ASSERT(fd >= 0);
   socklen_t addr_len = sizeof(addr->ss);
@@ -129,7 +129,7 @@
 }
 
 
-int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
+intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
@@ -142,7 +142,7 @@
 }
 
 
-int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
+intptr_t Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index aaff4d9..6e8b4aa 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -94,7 +94,7 @@
 }
 
 
-int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
+intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
   ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
@@ -107,7 +107,7 @@
 }
 
 
-int Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
+intptr_t Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
                      RawAddr* addr) {
   ASSERT(fd >= 0);
   socklen_t addr_len = sizeof(addr->ss);
@@ -122,7 +122,7 @@
 }
 
 
-int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
+intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
@@ -135,7 +135,7 @@
 }
 
 
-int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
+intptr_t Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 04a1413..db39707 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -103,7 +103,7 @@
 }
 
 
-int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
+intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
   ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
@@ -116,7 +116,7 @@
 }
 
 
-int Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
+intptr_t Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
                      RawAddr* addr) {
   ASSERT(fd >= 0);
   socklen_t addr_len = sizeof(addr->ss);
@@ -131,7 +131,7 @@
 }
 
 
-int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
+intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
@@ -144,7 +144,7 @@
 }
 
 
-int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
+intptr_t Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 4f28550..7cb36c8 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -286,6 +286,7 @@
   // Handlers and receive port for socket events from the event handler.
   final List eventHandlers = new List(EVENT_COUNT + 1);
   RawReceivePort eventPort;
+  bool flagsSent = false;
 
   // The type flags for this socket.
   final int typeFlags;
@@ -457,6 +458,7 @@
                                       port: port);
           }
           if (port != 0) socket.localPort = port;
+          socket.connectToEventHandler();
           return socket;
         });
   }
@@ -759,7 +761,8 @@
   }
 
   void returnTokens(int tokenBatchSize) {
-    if (eventPort != null && !isClosing && !isClosed) {
+    if (!isClosing && !isClosed) {
+      assert(eventPort != null);
       // Return in batches.
       if (tokens == tokenBatchSize) {
         assert(tokens < (1 << FIRST_COMMAND));
@@ -782,7 +785,8 @@
     sendWriteEvents = write;
     if (read) issueReadEvent();
     if (write) issueWriteEvent();
-    if (eventPort == null && !isClosing) {
+    if (!flagsSent && !isClosing) {
+      flagsSent = true;
       int flags = typeFlags & TYPE_TYPE_MASK;
       if (!isClosedRead) flags |= 1 << READ_EVENT;
       if (!isClosedWrite) flags |= 1 << WRITE_EVENT;
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 5ec7f1f..18156e6 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -76,7 +76,7 @@
 }
 
 
-int Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
+intptr_t Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
                      RawAddr* addr) {
   Handle* handle = reinterpret_cast<Handle*>(fd);
   socklen_t addr_len = sizeof(addr->ss);
@@ -90,7 +90,7 @@
 }
 
 
-int Socket::SendTo(
+intptr_t Socket::SendTo(
     intptr_t fd, const void* buffer, intptr_t num_bytes, RawAddr addr) {
   Handle* handle = reinterpret_cast<Handle*>(fd);
   return handle->SendTo(
diff --git a/runtime/bin/vmservice/client/deploy.sh b/runtime/bin/vmservice/client/deploy.sh
index 1990bd6..930f86e 100755
--- a/runtime/bin/vmservice/client/deploy.sh
+++ b/runtime/bin/vmservice/client/deploy.sh
@@ -15,6 +15,7 @@
 
 EXCLUDE="--exclude bootstrap_css"
 EXCLUDE="$EXCLUDE --exclude *.map"
+EXCLUDE="$EXCLUDE --exclude *.concat.js"
 EXCLUDE="$EXCLUDE --exclude *.scriptUrls"
 EXCLUDE="$EXCLUDE --exclude *.precompiled.js"
 EXCLUDE="$EXCLUDE --exclude main.*"
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 0e36a6c..5994639 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -3850,11 +3850,30 @@
       </template>
       
       <template if="{{ !cls.hasNoAllocations }}">
-        current instances ({{ cls.newSpace.current.instances + cls.oldSpace.current.instances }})
+        instances
           <div class="memberItem">
-            <div class="memberName">shallow size</div>
+            <div class="memberName">currently allocated</div>
             <div class="memberValue">
-              {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }}
+              count {{ cls.newSpace.current.instances + cls.oldSpace.current.instances }}
+              (shallow size {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }})
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">strongly reachable</div>
+            <div class="memberValue">
+              <template if="{{ instances == null }}">
+                <eval-link callback="{{ reachable }}" label="[find]" expr="100">
+                </eval-link>
+              </template>
+              <template if="{{ instances != null }}">
+                sample
+                <instance-ref ref="{{ instances['sample'] }}"></instance-ref>
+                <template if="{{ instances['totalCount'] > instances['sampleCount'] }}">
+                  <eval-link callback="{{ reachable }}" label="[more]" expr="{{ instances['sampleCount'] * 2 }}">
+                  </eval-link>
+                </template>
+                of total {{ instances['totalCount'] }}
+              </template>
             </div>
           </div>
           <div class="memberItem">
@@ -16525,4 +16544,4 @@
 
   <observatory-application></observatory-application>
 
-<script src="index.html_bootstrap.dart.js"></script></body></html>
\ No newline at end of file
+<script type="application/dart" src="index.html_bootstrap.dart"></script><script src="packages/browser/dart.js"></script></body></html>
\ 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 150a063..bccc6ae 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
@@ -1,19320 +1,35820 @@
 // Generated by dart2js, the Dart to JavaScript compiler.
-(function($){function dart(){this.x=0}var A=new dart
-delete A.x
-var B=new dart
-delete B.x
-var C=new dart
-delete C.x
-var D=new dart
-delete D.x
-var E=new dart
-delete E.x
-var F=new dart
-delete F.x
-var G=new dart
-delete G.x
-var H=new dart
-delete H.x
-var J=new dart
-delete J.x
-var K=new dart
-delete K.x
-var L=new dart
-delete L.x
-var M=new dart
-delete M.x
-var N=new dart
-delete N.x
-var O=new dart
-delete O.x
-var P=new dart
-delete P.x
-var Q=new dart
-delete Q.x
-var R=new dart
-delete R.x
-var S=new dart
-delete S.x
-var T=new dart
-delete T.x
-var U=new dart
-delete U.x
-var V=new dart
-delete V.x
-var W=new dart
-delete W.x
-var X=new dart
-delete X.x
-var Y=new dart
-delete Y.x
-var Z=new dart
-delete Z.x
-function I(){}
-init()
-$=I.p
-var $$={}
-;(function(a){"use strict"
-function map(b){b={x:b}
-delete b.x
-return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
-if(h==="^")continue
-var g=a3[h]
-var f=h.substring(0,1)
-var e
-if(f==="+"){v[e]=h.substring(1)
-var d=a3[h]
-if(d>0)a3[e].$reflectable=d
-if(g&&g.length)init.typeInformation[e]=g}else if(f==="@"){h=h.substring(1)
-$[h]["@"]=g}else if(f==="*"){n[e].$defaultValues=g
-var c=a3.$methodsWithOptionalArguments
-if(!c){a3.$methodsWithOptionalArguments=c={}}c[h]=e}else if(typeof g==="function"){n[e=h]=g
-i.push(h)
-init.globalFunctions[h]=g}else if(g.constructor===Array){addStubs(n,g,h,true,a3,i)}else{e=h
-var b={}
-var a0
-for(var a1 in g){if(!u.call(g,a1))continue
-f=a1.substring(0,1)
-if(a1==="static"){processStatics(init.statics[h]=g[a1])}else if(f==="+"){w[a0]=a1.substring(1)
-var d=g[a1]
-if(d>0)g[a0].$reflectable=d}else if(f==="@"&&a1!=="@"){b[a1.substring(1)]["@"]=g[a1]}else if(f==="*"){b[a0].$defaultValues=g[a1]
-var c=b.$methodsWithOptionalArguments
-if(!c){b.$methodsWithOptionalArguments=c={}}c[a1]=a0}else{var a2=g[a1]
-if(a1!=="^"&&a2!=null&&a2.constructor===Array&&a1!=="<>"){addStubs(b,a2,a1,false,g,[])}else{b[a0=a1]=a2}}}$$[h]=[n,b]
-j.push(h)}}}function addStubs(b3,b4,b5,b6,b7,b8){var h,g=[b7[b5]=b3[b5]=h=b4[0]]
-h.$stubName=b5
-b8.push(b5)
-for(var f=0;f<b4.length;f+=2){h=b4[f+1]
-if(typeof h!="function")break
-h.$stubName=b4[f+2]
-g.push(h)
-if(h.$stubName){b7[h.$stubName]=b3[h.$stubName]=h
-b8.push(h.$stubName)}}for(var e=0;e<g.length;f++,e++){g[e].$callName=b4[f+1]}var d=b4[++f]
-b4=b4.slice(++f)
-var c=b4[0]
-var b=c>>1
-var a0=(c&1)===1
-var a1=c===3
-var a2=c===1
-var a3=b4[1]
-var a4=a3>>1
-var a5=(a3&1)===1
-var a6=b+a4!=g[0].length
-var a7=b4[2]
-var a8=2*a4+b+3
-var a9=b4.length>a8
-if(d){h=tearOff(g,b4,b6,b5,a6)
-b3[b5].$getter=h
-h.$getterStub=true
-if(b6)init.globalFunctions[b5]=h
-b7[d]=b3[d]=h
-g.push(h)
-if(d)b8.push(d)
-h.$stubName=d
-h.$callName=null
-if(a6)init.interceptedNames[d]=true}if(a9){for(var e=0;e<g.length;e++){g[e].$reflectable=1
-g[e].$reflectionInfo=b4}var b0=b6?init.mangledGlobalNames:init.mangledNames
-var b1=b4[a8]
-var b2=b1
-if(d)b0[d]=b2
-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.wh("+"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.wh("+"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.wh(this,b,c,false,[f],d)
-return new h(this,b[0],f,d)}:function(){if(h===null)h=H.wh(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.wh(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=[]
-if(!init.mangledNames)init.mangledNames=map()
-if(!init.mangledGlobalNames)init.mangledGlobalNames=map()
-if(!init.statics)init.statics=map()
-if(!init.typeInformation)init.typeInformation=map()
-if(!init.globalFunctions)init.globalFunctions=map()
-if(!init.interceptedNames)init.interceptedNames=map()
-var x=init.libraries
-var w=init.mangledNames
-var v=init.mangledGlobalNames
-var u=Object.prototype.hasOwnProperty
-var t=a.length
-for(var s=0;s<t;s++){var r=a[s]
-var q=r[0]
-var p=r[1]
-var o=r[2]
-var n=r[3]
-var m=r[4]
-var l=!!r[5]
-var k=m&&m["^"]
-if(k instanceof Array)k=k[0]
-var j=[]
-var i=[]
-processStatics(m)
-x.push([q,p,j,i,o,k,l,n])}})([["_foreign_helper","dart:_foreign_helper",,H,{
-"^":"",
-FK2:{
-"^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
-"^":"",
-x:function(a){return void 0},
-Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-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
-if(!1===y)return z.i
-if(!0===y)return a
-x=Object.getPrototypeOf(a)
-if(y===x)return z.i
-if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
-if(w==null){y=Object.getPrototypeOf(a)
-if(y==null||y===Object.prototype)return C.Sx
-else return C.vB}return w},
-TZ:function(a){var z,y,x,w
-z=$.Au
-if(z==null)return
-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},
-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]},
-KE:function(a,b){var z,y,x
-z=J.TZ(a)
-if(z==null)return
-y=$.Au
-x=z+2
-if(x>=y.length)return H.e(y,x)
-return y[x][b]},
-Gv:{
-"^":"a;",
-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,68],
-gbx:function(a){return new H.cu(H.dJ(a),null)},
-"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
-yEe:{
-"^":"Gv;",
-bu:function(a){return String(a)},
-giO:function(a){return a?519018:218159},
-gbx:function(a){return C.HL},
-$isa2:true},
-CDU:{
-"^":"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,68]},
-Ue1:{
-"^":"Gv;",
-giO:function(a){return 0},
-gbx:function(a){return C.lU}},
-Ai:{
-"^":"Ue1;"},
-kdQ:{
-"^":"Ue1;"},
-Q:{
-"^":"Gv;",
-h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},
-KI:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(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]},
-xe:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-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"))
-H.IC(a,b,c)},
-Rz:function(a,b){var z
-if(!!a.fixed$length)H.vh(P.f("remove"))
-for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
-return!0}return!1},
-ad:function(a,b){return H.VM(new H.U5(a,b),[null])},
-lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},31],
-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.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},31],
-zV:function(a,b){var z,y,x,w
-z=a.length
-y=Array(z)
-y.fixed$length=init
-for(x=0;x<a.length;++x){w=H.d(a[x])
-if(x>=z)return H.e(y,x)
-y[x]=w}return y.join(b)},
-eR:function(a,b){return H.q9(a,b,null,null)},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-aM:function(a,b,c){if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))
-if(b===c)return H.VM([],[H.Kp(a,0)])
-return H.VM(a.slice(b,c),[H.Kp(a,0)])},
-Mu:function(a,b,c){H.xF(a,b,c)
-return H.q9(a,b,c,null)},
-gtH: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]
-throw H.b(P.w("No elements"))},
-UZ:function(a,b,c){var z
-if(!!a.fixed$length)H.vh(P.f("removeRange"))
-z=a.length
-if(b<0||b>z)throw H.b(P.TE(b,0,z))
-if(c<b||c>z)throw H.b(P.TE(c,b,z))
-H.tb(a,c,a,b,z-c)
-this.sB(a,z-(c-b))},
-Vr:function(a,b){return H.Ck(a,b)},
-GT:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
-H.rd(a,b)},
-Jd:function(a){return this.GT(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)},
-Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
-cn:function(a,b){return this.Pk(a,b,null)},
-tg:function(a,b){var z
-for(z=0;z<a.length;++z)if(J.xC(a[z],b))return!0
-return!1},
-gl0:function(a){return a.length===0},
-gor:function(a){return a.length!==0},
-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)])
-z.fixed$length=init
-return z}},
-br:function(a){return this.tt(a,!0)},
-gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
-giO:function(a){return H.eQ(a)},
-gB:function(a){return a.length},
-sB:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0)throw H.b(P.N(b))
-if(!!a.fixed$length)H.vh(P.f("set length"))
-a.length=b},
-t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},
-u:function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
-if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b>=a.length||b<0)throw H.b(P.N(b))
-a[b]=c},
-$isQ:true,
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{Zz:function(a,b){var z
-if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(P.u("Length must be a non-negative integer: "+H.d(a)))
-z=H.VM(new Array(a),[b])
-z.fixed$length=init
-return z}}},
-P:{
-"^":"Gv;",
-iM:function(a,b){var z
-if(typeof b!=="number")throw H.b(P.u(b))
-if(a<b)return-1
-else if(a>b)return 1
-else if(a===b){if(a===0){z=this.gzP(b)
-if(this.gzP(a)===z)return 0
-if(this.gzP(a))return-1
-return 1}return 0}else if(isNaN(a)){if(this.gG0(b))return 0
-return 1}else return-1},
-gzP:function(a){return a===0?1/a<0:a<0},
-gG0:function(a){return isNaN(a)},
-gx8:function(a){return isFinite(a)},
-JV:function(a,b){return a%b},
-Vy:function(a){return Math.abs(a)},
-yu:function(a){var z
-if(a>=-2147483648&&a<=2147483647)return a|0
-if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
-return z+0}throw H.b(P.f(''+a))},
-HG:function(a){return this.yu(this.UD(a))},
-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.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.KP(b))
-return a.toString(b)},
-bu:function(a){if(a===0&&1/a<0)return"-0.0"
-else return""+a},
-giO:function(a){return a&0x1FFFFFFF},
-J:function(a){return-a},
-g:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a+b},
-W:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a-b},
-V:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a/b},
-U:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a*b},
-Y:function(a,b){var z
-if(typeof b!=="number")throw H.b(P.u(b))
-z=a%b
-if(z===0)return 0
-if(z>0)return z
-if(b<0)return z-b
-else return z+b},
-Z:function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
-else{if(typeof b!=="number")H.vh(P.u(b))
-return this.yu(a/b)}},
-cU:function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},
-O:function(a,b){if(b<0)throw H.b(P.u(b))
-return b>31?0:a<<b>>>0},
-W4:function(a,b){return b>31?0:a<<b>>>0},
-m:function(a,b){var z
-if(b<0)throw H.b(P.u(b))
-if(a>0)z=b>31?0:a>>>b
-else{z=b>31?31:b
-z=a>>z>>>0}return z},
-GG:function(a,b){var z
-if(a>0)z=b>31?0:a>>>b
-else{z=b>31?31:b
-z=a>>z>>>0}return z},
-i:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return(a&b)>>>0},
-w:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return(a^b)>>>0},
-C:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a<b},
-D:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a>b},
-E:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a<=b},
-F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a>=b},
-gbx:function(a){return C.yT},
-$isFK:true,
-static:{"^":"Ng,N6l"}},
-imn:{
-"^":"P;",
-gbx:function(a){return C.yw},
-$isCP:true,
-$isFK:true,
-$isKN:true},
-Yn:{
-"^":"P;",
-gbx:function(a){return C.CR},
-$isCP:true,
-$isFK:true},
-O:{
-"^":"Gv;",
-j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0)throw H.b(P.N(b))
-if(b>=a.length)throw H.b(P.N(b))
-return a.charCodeAt(b)},
-dd:function(a,b){return H.ZT(a,b)},
-wL:function(a,b,c){var z,y,x,w
-if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
-z=a.length
-y=b.length
-if(c+z>y)return
-for(x=0;x<z;++x){w=c+x
-if(w<0)H.vh(P.N(w))
-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.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
-z=b.length
-y=a.length
-if(z>y)return!1
-return b===this.yn(a,y-z)},
-h8:function(a,b,c){return H.ys(a,b,c)},
-Fr:function(a,b){if(b==null)H.vh(P.u(null))
-if(typeof b==="string")return a.split(b)
-else if(!!J.x(b).$isVR)return a.split(b.Ej)
-else throw H.b("String.split(Pattern) UNIMPLEMENTED")},
-Ys:function(a,b,c){var z
-if(c>a.length)throw H.b(P.TE(c,0,a.length))
-z=c+b.length
-if(z>a.length)return!1
-return b===a.substring(c,z)},
-nC:function(a,b){return this.Ys(a,b,0)},
-Nj:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
-if(c==null)c=a.length
-if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
-if(b<0)throw H.b(P.N(b))
-if(typeof c!=="number")return H.s(c)
-if(b>c)throw H.b(P.N(b))
-if(c>a.length)throw H.b(P.N(c))
-return a.substring(b,c)},
-yn:function(a,b){return this.Nj(a,b,null)},
-hc:function(a){return a.toLowerCase()},
-bS:function(a){var z,y,x,w,v
-z=a.trim()
-y=z.length
-if(y===0)return z
-if(this.j(z,0)===133){x=J.mm(z,1)
-if(x===y)return""}else x=0
-w=y-1
-v=this.j(z,w)===133?J.r9(z,w):y
-if(x===0&&v===y)return z
-return z.substring(x,v)},
-U:function(a,b){var z,y
-if(typeof b!=="number")return H.s(b)
-if(0>=b)return""
-if(b===1||a.length===0)return a
-if(b!==b>>>0)throw H.b(C.Eq)
-for(z=a,y="";!0;){if((b&1)===1)y=z+y
-b=b>>>1
-if(b===0)break
-z+=z}return y},
-XU:function(a,b,c){var z,y,x,w
-if(b==null)H.vh(P.u(null))
-if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
-if(typeof b==="string")return a.indexOf(b,c)
-z=J.x(b)
-if(!!z.$isVR){y=b.yk(a,c)
-return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},
-u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){var z,y
-c=a.length
-z=b.length
-y=a.length
-if(c+z>y)c=y-z
-return a.lastIndexOf(b,c)},
-cn:function(a,b){return this.Pk(a,b,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.b0(a,b,c)},
-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
-if(typeof b!=="string")throw H.b(P.u(b))
-if(a===b)z=0
-else z=a<b?-1:1
-return z},
-bu:function(a){return a},
-giO:function(a){var z,y,x
-for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
-y=536870911&y+((524287&y)<<10>>>0)
-y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
-y^=y>>11
-return 536870911&y+((16383&y)<<15>>>0)},
-gbx:function(a){return C.Db},
-gB:function(a){return a.length},
-t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},
-$isqU:true,
-static:{Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
-default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},mm:function(a,b){var z,y
-for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
-y=a.charCodeAt(b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y,x
-for(z=a.length;b>0;b=y){y=b-1
-if(y>=z)H.vh(P.N(y))
-x=a.charCodeAt(y)
-if(x!==32&&x!==13&&!J.Ga(x))break}return b}}}}],["_isolate_helper","dart:_isolate_helper",,H,{
-"^":"",
-dB:function(a,b){var z=a.vV(0,b)
-init.globalState.Xz.bL()
-return z},
-cv:function(){--init.globalState.Xz.GL},
-wW:function(a,b){var z,y,x,w,v,u
-z={}
-z.a=b
-b=b
-z.a=b
-if(b==null){b=[]
-z.a=b
-y=b}else y=b
-if(!J.x(y).$isWO)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
-y=new H.pq(0,0,1,null,null,null,null,null,null,null,null,null,a)
-y.qi(a)
-init.globalState=y
-if(init.globalState.EF===!0)return
-y=init.globalState.Hg++
-x=P.L5(null,null,null,P.KN,H.yo)
-w=P.Ls(null,null,null,P.KN)
-v=new H.yo(0,null,!1)
-u=new H.aX(y,x,w,new I(),v,P.N3(),P.N3(),!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.Nr=u
-init.globalState.N0=u
-y=H.G3()
-x=H.KT(y,[y]).BD(a)
-if(x)u.vV(0,new H.PK(z,a))
-else{y=H.KT(y,[y,y]).BD(a)
-if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},
-yl:function(){var z=init.currentScript
-if(z!=null)return String(z.src)
-if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.mf()
-if(typeof version=="function"&&typeof system=="function")return thisFilename()
-if(init.globalState.EF===!0)return H.mf()
-return},
-mf:function(){var z,y
-z=new Error().stack
-if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
-if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
-if(y!=null)return y[1]
-y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
-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
-z=H.Hh(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"))
-t=y.t(z,"isSpawnUri")
-s=y.t(z,"startPaused")
-r=H.Hh(y.t(z,"replyTo"))
-y=init.globalState.Hg++
-q=P.L5(null,null,null,P.KN,H.yo)
-p=P.Ls(null,null,null,P.KN)
-o=new H.yo(0,null,!1)
-n=new H.aX(y,q,p,new I(),o,P.N3(),P.N3(),!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)
-init.globalState.Xz.Rk.NZ(0,new H.IY(n,new H.mN(w,v,u,t,s,r),"worker-start"))
-init.globalState.N0=n
-init.globalState.Xz.bL()
-break
-case"spawn-worker":m=y.t(z,"replyPort")
-H.EN(y.t(z,"functionName"),y.t(z,"uri"),y.t(z,"args"),y.t(z,"msg"),!1,y.t(z,"isSpawnUri"),y.t(z,"startPaused")).Rx(new H.xn(m),new H.jl3(m))
-break
-case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
-init.globalState.Xz.bL()
-break
-case"close":init.globalState.XC.Rz(0,$.p6().t(0,a))
-a.terminate()
-init.globalState.Xz.bL()
-break
-case"log":H.ZF(y.t(z,"msg"))
-break
-case"print":if(init.globalState.EF===!0){y=init.globalState.rj
-q=H.t0(P.EF(["command","print","msg",z],null,null))
-y.toString
-self.postMessage(q)}else P.FL(y.t(z,"msg"))
-break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","nW",4,0,null,0,1],
-ZF:function(a){var z,y,x,w
-if(init.globalState.EF===!0){y=init.globalState.rj
-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.XO(w,null)
-throw H.b(P.FM(z))}},
-EN:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-if(b!=null&&J.VT(b,".dart"))b=J.ew(b,".js")
-z=P.hM()
-y=H.VM(new P.Zf(P.Dt(null)),[null])
-z.gtH(z).ml(new H.WK(y))
-x=new H.ws(z.vl,init.globalState.N0.jO)
-if(init.globalState.ji===!0&&!e)if(init.globalState.EF===!0){w=init.globalState.rj
-v=H.t0(P.EF(["command","spawn-worker","functionName",a,"args",c,"msg",d,"uri",b,"isSpawnUri",f,"startPaused",g,"replyPort",x],null,null))
-w.toString
-self.postMessage(v)}else{if(b==null)b=$.Zt()
-u=new Worker(b)
-u.onerror=function(h,i,j){return function(k){return h(k,i,j)}}(H.GA,b,new H.tZ(y))
-u.onmessage=function(h,i){return function(j){j.onerror=null
-return h(i,j)}}(H.Mg,u)
-w=init.globalState.Y7++
-$.p6().u(0,u,w)
-init.globalState.XC.u(0,w,u)
-u.postMessage(H.t0(P.EF(["command","start","id",w,"replyTo",H.t0(x),"args",c,"msg",H.t0(d),"isSpawnUri",f,"startPaused",g,"functionName",a],null,null)))}else H.Ff(a,b,c,d,f,g,x)
-return y.MM},
-Ff:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-z={}
-z.a=c
-z.b=d
-if(b!=null)throw H.b(P.f("Currently spawnUri is not supported without web workers."))
-z.b=H.t0(d)
-z.a=H.t0(z.a)
-y=init.globalState.Xz
-x=init.globalState.Hg++
-w=P.L5(null,null,null,P.KN,H.yo)
-v=P.Ls(null,null,null,P.KN)
-u=new H.yo(0,null,!1)
-w=new H.aX(x,w,v,new I(),u,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-v.h(0,0)
-w.O9(0,u)
-y.Rk.NZ(0,new H.IY(w,new H.hI(z,a,e,f,g),"nonworker start"))},
-Di:function(a,b,c,d,e,f){var z,y,x,w
-z=init.globalState.N0
-y=z.jO
-$.z7=$.z7+("_"+y)
-$.eb=$.eb+("_"+y)
-y=z.EE
-x=init.globalState.N0.jO
-w=z.um
-J.H4(f,["spawned",new H.ws(y,x),w,z.PX])
-x=new H.vK(a,b,c,d,z)
-if(e===!0){z.V0(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
-GA:[function(a,b,c){var z
-a.preventDefault()
-z=a.message
-c.$1(z==null?"Error spawning worker for "+H.d(b):"Error spawning worker for "+H.d(b)+" ("+z+")")
-return!0},"$3","dd",6,0,null,2,3,4],
-t0:function(a){var z
-if(init.globalState.ji===!0){z=new H.NA(0,new H.cx())
-z.mR=new H.m3(null)
-return z.Zo(a)}else{z=new H.Qt(new H.cx())
-z.mR=new H.m3(null)
-return z.Zo(a)}},
-Hh: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:{
-"^":"Tp:69;a,b",
-$0:function(){this.b.$1(this.a.a)},
-$isEH:true},
-JO:{
-"^":"Tp:69;a,c",
-$0:function(){this.c.$2(this.a.a,null)},
-$isEH:true},
-pq:{
-"^":"a;Hg,oL,Y7,N0,Nr,Xz,Ai,EF,ji,iR<,rj,XC,w2<",
-qi:function(a){var z,y,x,w
-z=$.Vr()==null
-y=$.rm()
-x=z&&$.ey()===!0
-this.EF=x
-if(!x)y=y!=null&&$.Zt()!=null
-else y=!0
-this.ji=y
-this.Ai=z&&!x
-y=H.IY
-x=H.VM(new P.Sw(null,0,0,0),[y])
-x.Eo(null,y)
-this.Xz=new H.cC(x,0)
-this.iR=P.L5(null,null,null,P.KN,H.aX)
-this.XC=P.L5(null,null,null,P.KN,null)
-if(this.EF===!0){z=new H.JH()
-this.rj=z
-w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
-$.jk().onmessage=w
-$.jk().dartPrint=function(b){}}}},
-aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lw,CN,M2,mf,pa,ir",
-V0:function(a,b){if(!this.um.n(0,a))return
-if(this.lw.h(0,b)&&!this.UF)this.UF=!0
-this.PC()},
-NR:function(a){var z,y,x,w,v,u
-if(!this.UF)return
-z=this.lw
-z.Rz(0,a)
-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
-v=y.v5
-u=v.length
-w=(w-1&u-1)>>>0
-y.av=w
-if(w<0||w>=u)return H.e(v,w)
-v[w]=x
-if(w===y.eZ)y.M9();++y.qT}this.UF=!1}this.PC()},
-iK:function(a){var z=this.CN
-if(z==null){z=[]
-this.CN=z}if(J.x5(z,a))return
-this.CN.push(a)},
-IB:function(a){var z=this.CN
-if(z==null)return
-J.V1(z,a)},
-JZ:function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},
-ZC:function(a,b){var z,y
-z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.mf
-else y=!0
-if(y){J.H4(a,null)
-return}y=new H.NY(a)
-if(z.n(b,2)){init.globalState.Xz.Rk.NZ(0,new H.IY(this,y,"ping"))
-return}z=this.M2
-if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Eo(null,null)
-this.M2=z}z.NZ(0,y)},
-bc:function(a,b){var z,y
-if(!this.PX.n(0,a))return
-z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.mf
-else y=!0
-if(y){this.Dm()
-return}if(z.n(b,2)){z=init.globalState.Xz
-y=this.gIm()
-z.Rk.NZ(0,new H.IY(this,y,"kill"))
-return}z=this.M2
-if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Eo(null,null)
-this.M2=z}z.NZ(0,this.gIm())},
-hk:function(a,b){var z,y
-z=this.ir
-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)
-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)
-for(z=H.VM(new P.zQ(z,z.zN,null,null),[null]),z.zq=z.O2.H9;z.G();)J.H4(z.fD,y)},
-vV:[function(a,b){var z,y,x,w,v,u
-z=init.globalState.N0
-init.globalState.N0=this
-$=this.En
-y=null
-this.mf=!0
-try{y=b.$0()}catch(v){u=H.Ru(v)
-x=u
-w=new H.XO(v,null)
-this.hk(x,w)
-if(this.pa===!0){this.Dm()
-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,70,71],
-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
-case"resume":this.NR(z.t(a,1))
-break
-case"add-ondone":this.iK(z.t(a,1))
-break
-case"remove-ondone":this.IB(z.t(a,1))
-break
-case"set-errors-fatal":this.JZ(z.t(a,1),z.t(a,2))
-break
-case"ping":this.ZC(z.t(a,1),z.t(a,2))
-break
-case"kill":this.bc(z.t(a,1),z.t(a,2))
-break
-case"getErrors":this.ir.h(0,z.t(a,1))
-break
-case"stopErrors":this.ir.Rz(0,z.t(a,1))
-break}},
-hV:function(a){return this.Gx.t(0,a)},
-O9:function(a,b){var z=this.Gx
-if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.u(0,a,b)},
-PC:function(){if(this.Gx.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.iR.u(0,this.jO,this)
-else this.Dm()},
-Dm:[function(){var z,y
-z=this.M2
-if(z!=null)z.V1(0)
-for(z=this.Gx,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.pr()
-z.V1(0)
-this.fW.V1(0)
-init.globalState.iR.Rz(0,this.jO)
-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.H4(z.lo,null)
-this.CN=null}},"$0","gIm",0,0,18],
-$isaX:true},
-NY:{
-"^":"Tp:18;a",
-$0:[function(){J.H4(this.a,null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-cC:{
-"^":"a;Rk,GL",
-mj:function(){var z=this.Rk
-if(z.av===z.eZ)return
-return z.AR()},
-xB:function(){var z,y,x
-z=this.mj()
-if(z==null){if(init.globalState.Nr!=null&&init.globalState.iR.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.iR.X5===0&&y.Xz.GL===0){y=y.rj
-x=H.t0(P.EF(["command","close"],null,null))
-y.toString
-self.postMessage(x)}return!1}J.R1(z)
-return!0},
-oV:function(){if($.Vr()!=null)new H.Rm(this).$0()
-else for(;this.xB(););},
-bL:function(){var z,y,x,w,v
-if(init.globalState.EF!==!0)this.oV()
-else try{this.oV()}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-w=init.globalState.rj
-v=H.t0(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
-w.toString
-self.postMessage(v)}}},
-Rm:{
-"^":"Tp:18;a",
-$0:[function(){if(!this.a.xB())return
-P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
-$isEH:true},
-IY:{
-"^":"a;od*,i3,G1>",
-Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
-return}J.QT(this.od,this.i3)},"$0","gNN",0,0,18],
-$isIY:true},
-JH:{
-"^":"a;"},
-mN:{
-"^":"Tp:69;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},
-xn:{
-"^":"Tp:13;UI",
-$1:[function(a){J.H4(this.UI,a)},"$1",null,2,0,null,72,"call"],
-$isEH:true},
-jl3:{
-"^":"Tp:5;bK",
-$1:[function(a){J.H4(this.bK,["spawn failed",a])},"$1",null,2,0,null,73,"call"],
-$isEH:true},
-WK:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y
-z=J.U6(a)
-y=this.a
-if(J.xC(z.t(a,0),"spawned")){z=y.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(a)}else y.pm(z.t(a,1))},"$1",null,2,0,null,72,"call"],
-$isEH:true},
-tZ:{
-"^":"Tp:5;b",
-$1:[function(a){return this.b.pm(a)},"$1",null,2,0,null,74,"call"],
-$isEH:true},
-hI:{
-"^":"Tp:69;a,b,c,d,e",
-$0:[function(){var z=this.a
-H.Di(init.globalFunctions[this.b](),z.a,z.b,this.c,this.d,this.e)},"$0",null,0,0,null,"call"],
-$isEH:true},
-vK:{
-"^":"Tp:18;a,b,c,d,e",
-$0:[function(){var z,y,x
-this.e.sxF(!0)
-if(this.d!==!0)this.a.$1(this.c)
-else{z=this.a
-y=H.G3()
-x=H.KT(y,[y,y]).BD(z)
-if(x)z.$2(this.b,this.c)
-else{y=H.KT(y,[y]).BD(z)
-if(y)z.$1(this.b)
-else z.$0()}}},"$0",null,0,0,null,"call"],
-$isEH:true},
-Iy4:{
-"^":"a;",
-$isbC:true,
-$isXY:true},
-ws:{
-"^":"Iy4;JE,tv",
-wR:function(a,b){var z,y,x,w,v
-z={}
-y=this.tv
-x=init.globalState.iR.t(0,y)
-if(x==null)return
-w=this.JE
-if(w.gKS())return
-v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
-z.a=b
-if(v)z.a=H.t0(b)
-if(x.gEE()===w){x.Ds(z.a)
-return}y=init.globalState.Xz
-w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isws&&J.xC(this.JE,b.JE)},
-giO:function(a){return J.ki(this.JE)},
-$isws:true,
-$isbC:true,
-$isXY:true},
-Ua:{
-"^":"Tp:69;a,b,c",
-$0:[function(){var z,y
-z=this.b.JE
-if(!z.gKS()){if(this.c){y=this.a
-y.a=H.Hh(y.a)}J.n0(z,this.a.a)}},"$0",null,0,0,null,"call"],
-$isEH:true},
-bM:{
-"^":"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.rj.toString
-self.postMessage(z)}else{y=init.globalState.XC.t(0,this.ZU)
-if(y!=null)y.postMessage(z)}},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isbM&&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.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},
-$isbM:true,
-$isbC:true,
-$isXY:true},
-yo:{
-"^":"a;qK>,D1,KS<",
-aV:function(a){return this.D1.$1(a)},
-pr:function(){this.KS=!0
-this.D1=null},
-S6:function(a){var z,y
-if(this.KS)return
-this.KS=!0
-this.D1=null
-z=init.globalState.N0
-y=this.qK
-z.Gx.Rz(0,y)
-z.fW.Rz(0,y)
-z.PC()},
-Rf:function(a,b){if(this.KS)return
-this.aV(b)},
-$isyo:true,
-static:{"^":"Vz"}},
-fc:{
-"^":"cb;vl,da",
-KR:function(a,b,c,d){var z=this.da
-z.toString
-return H.VM(new P.O9(z),[null]).KR(a,b,c,d)},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-S6:[function(a){this.vl.S6(0)
-this.da.S6(0)},"$0","gJK",0,0,18],
-TL:function(a){var z=P.x2(this.gJK(this),null,null,null,!0,null)
-this.da=z
-this.vl.D1=z.ght(z)},
-$ascb:function(){return[null]},
-$iscb:true},
-NA:{
-"^":"jP1;Ao,mR",
-DE:function(a){if(!!a.$isws)return["sendport",init.globalState.oL,a.tv,J.ki(a.JE)]
-if(!!a.$isbM)return["sendport",a.ZU,a.tv,a.bv]
-throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return["capability",a.qK]
-throw H.b("Capability not serializable: "+a.bu(0))}},
-Qt:{
-"^":"ooy;mR",
-DE:function(a){if(!!a.$isws)return new H.ws(a.JE,a.tv)
-if(!!a.$isbM)return new H.bM(a.ZU,a.bv,a.tv)
-throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return new H.iV(a.qK)
-throw H.b("Capability not serializable: "+a.bu(0))}},
-BV:{
-"^":"fPc;RZ",
-Vf:function(a){var z,y,x,w,v,u
-z=J.U6(a)
-y=z.t(a,1)
-x=z.t(a,2)
-w=z.t(a,3)
-if(J.xC(y,init.globalState.oL)){v=init.globalState.iR.t(0,x)
-if(v==null)return
-u=v.hV(w)
-if(u==null)return
-return new H.ws(u,x)}else return new H.bM(y,w,x)},
-Op:function(a){return new H.iV(J.UQ(a,1))}},
-m3:{
-"^":"a;MD",
-t:function(a,b){return b.__MessageTraverser__attached_info__},
-u:function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},
-CH:function(a){this.MD=[]},
-no:function(){var z,y,x
-for(z=this.MD.length,y=0;y<z;++y){x=this.MD
-if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.MD=null}},
-cx:{
-"^":"a;",
-t:function(a,b){return},
-u:function(a,b,c){},
-CH:function(a){},
-no:function(){}},
-BB:{
-"^":"a;",
-Zo:function(a){var z
-if(H.vM(a))return this.Pq(a)
-this.mR.CH(0)
-z=null
-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.$isbC)return this.DE(a)
-if(!!z.$isXY)return this.yf(a)
-return this.N1(a)},
-N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
-ooy:{
-"^":"BB;",
-Pq:function(a){return a},
-wb:function(a){var z,y,x,w
-z=this.mR.t(0,a)
-if(z!=null)return z
-y=J.U6(a)
-x=y.gB(a)
-z=Array(x)
-z.fixed$length=init
-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
-z={}
-y=this.mR.t(0,a)
-z.a=y
-if(y!=null)return y
-y=P.L5(null,null,null,null,null)
-z.a=y
-this.mR.u(0,a,y)
-a.aN(0,new H.OW(z,this))
-return z.a},
-DE:function(a){return H.vh(P.SY(null))},
-yf:function(a){return H.vh(P.SY(null))}},
-OW:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.Q9(a),z.Q9(b))},"$2",null,4,0,null,75,76,"call"],
-$isEH:true},
-jP1:{
-"^":"BB;",
-Pq:function(a){return a},
-wb: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["list",y,this.mE(a)]},
-TI: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)))]},
-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.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))},
-yf:function(a){return H.vh(P.SY(null))}},
-fPc:{
-"^":"a;",
-ug:function(a){if(H.ZR(a))return a
-this.RZ=P.YM(null,null,null,null,null)
-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)
-return this.RZ.t(0,y)
-case"list":return this.Dj(a)
-case"map":return this.GD(a)
-case"sendport":return this.Vf(a)
-case"capability":return this.Op(a)
-default:return this.PR(a)}},
-Dj:function(a){var z,y,x,w,v
-z=J.U6(a)
-y=z.t(a,1)
-x=z.t(a,2)
-this.RZ.u(0,y,x)
-z=J.U6(x)
-w=z.gB(x)
-if(typeof w!=="number")return H.s(w)
-v=0
-for(;v<w;++v)z.u(x,v,this.D5(z.t(x,v)))
-return x},
-GD:function(a){var z,y,x,w,v,u,t,s
-z=P.L5(null,null,null,null,null)
-y=J.U6(a)
-x=y.t(a,1)
-this.RZ.u(0,x,z)
-w=y.t(a,2)
-v=y.t(a,3)
-y=J.U6(w)
-u=y.gB(w)
-if(typeof u!=="number")return H.s(u)
-t=J.U6(v)
-s=0
-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")}},
-Oe:{
-"^":"a;Om,zu,p9",
-ed:function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
-if(this.p9==null)return
-H.cv()
-if(this.Om)$.jk().clearTimeout(this.p9)
-else $.jk().clearInterval(this.p9)
-this.p9=null}else throw H.b(P.f("Canceling a timer."))},
-Qa:function(a,b){var z,y
-if(a===0)z=$.jk().setTimeout==null||init.globalState.EF===!0
-else z=!1
-if(z){this.p9=1
-z=init.globalState.Xz
-y=init.globalState.N0
-z.Rk.NZ(0,new H.IY(y,new H.Av(this,b),"timer"))
-this.zu=!0}else{z=$.jk()
-if(z.setTimeout!=null){++init.globalState.Xz.GL
-this.p9=z.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))}},
-static:{cy:function(a,b){var z=new H.Oe(!0,!1,null)
-z.Qa(a,b)
-return z}}},
-Av:{
-"^":"Tp:18;a,b",
-$0:[function(){this.a.p9=null
-this.b.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-vt:{
-"^":"Tp:18;c,d",
-$0:[function(){this.c.p9=null
-H.cv()
-this.d.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-iV:{
-"^":"a;qK>",
-giO:function(a){var z,y,x
-z=this.qK
-y=J.Wx(z)
-x=y.m(z,0)
-y=y.Z(z,4294967296)
-if(typeof y!=="number")return H.s(y)
-z=x^y
-z=(~z>>>0)+(z<<15>>>0)&4294967295
-z=((z^z>>>12)>>>0)*5&4294967295
-z=((z^z>>>4)>>>0)*2057&4294967295
-return(z^z>>>16)>>>0},
-n:function(a,b){var z,y
-if(b==null)return!1
-if(b===this)return!0
-if(!!J.x(b).$isiV){z=this.qK
-y=b.qK
-return z==null?y==null:z===y}return!1},
-$isiV:true,
-$isXY:true}}],["_js_helper","dart:_js_helper",,H,{
-"^":"",
-Gp:function(a,b){var z
-if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(a).$isXj},
-d:function(a){var z
-if(typeof a==="string")return a
-if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
-else if(!1===a)return"false"
-else if(a==null)return"null"
-z=J.AG(a)
-if(typeof z!=="string")throw H.b(P.u(a))
-return z},
-eQ:function(a){var z=a.$identityHash
-if(z==null){z=Math.random()*0x3fffffff|0
-a.$identityHash=z}return z},
-rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,5],
-BU:function(a,b,c){var z,y,x,w,v,u
-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
-if(2>=y)return H.e(z,2)
-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.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)
-if(!(b<10)){if(3>=z.length)return H.e(z,3)
-y=z[3]==null}else y=!0
-if(y){x=b<=10?48+b-1:97+b-10-1
-if(1>=z.length)return H.e(z,1)
-w=z[1]
-y=J.U6(w)
-v=0
-while(!0){u=y.gB(w)
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-y.j(w,0)
-if(y.j(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
-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.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)
-if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.$1(a)}return z},
-lh:function(a){var z,y
-z=C.w2(J.x(a))
-if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
-if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
-return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
-a5:function(a){return"Instance of '"+H.lh(a)+"'"},
-Ms:function(){if(typeof window!="undefined"&&window!==null){var z=window.performance
-if(z!=null&&typeof z.webkitNow=="function")return C.CD.yu(Math.floor(1000*z.webkitNow()))}return 1000*Date.now()},
-Cb:function(a){var z,y,x,w,v,u
-z=a.length
-for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
-else{u=w+500
-u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},
-YF:function(a){var z,y,x
-z=[]
-z.$builtinTypeInfo=[P.KN]
-y=new H.a7(a,a.length,0,null)
-y.$builtinTypeInfo=[H.Kp(a,0)]
-for(;y.G();){x=y.lo
-if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
-if(x<=65535)z.push(x)
-else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.Cb(z)},
-eT:function(a){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
-if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
-if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.YF(a)}return H.Cb(a)},
-Lw:function(a){var z
-if(typeof a!=="number")return H.s(a)
-if(0<=a){if(a<=65535)return String.fromCharCode(a)
-if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
-fu:function(a,b,c,d,e,f,g,h){var z,y,x,w
-if(typeof a!=="number"||Math.floor(a)!==a)H.vh(P.u(a))
-if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
-if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
-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.bI(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)
-if(x.E(a,0)||x.C(a,100)){w=new Date(y)
-if(h)w.setUTCFullYear(a)
-else w.setFullYear(a)
-return w.valueOf()}return y},
-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]},
-wV: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={}
-z.a=0
-y=[]
-x=[]
-if(b!=null){z.a=b.length
-C.Nm.FV(y,b)}z.b=""
-if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"$"+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*"]
-if(y==null)return H.zo(a,b,c)
-x=H.zh(y)
-if(x==null||!x.Mo)return H.zo(a,b,c)
-b=b!=null?P.F(b,!0,null):[]
-w=x.Rv
-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.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))
-return y.apply(a,b)}r=[]
-if(b!=null){q=b.length
-C.Nm.FV(r,b)}else q=0
-y=a["$"+q]
-if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},
-s:function(a){throw H.b(P.u(a))},
-e:function(a,b){if(a==null)J.q8(a)
-if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},
-b:function(a){var z
-if(a==null)a=new P.LK()
-z=new Error()
-z.dartException=a
-if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.tM})
-z.name=""}else z.toString=H.tM
-return z},
-tM:[function(){return J.AG(this.dartException)},"$0","p3",0,0,null],
-vh:function(a){throw H.b(a)},
-Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=new H.Am(a)
-if(a==null)return
-if(typeof a!=="object")return a
-if("dartException" in a)return z.$1(a.dartException)
-else if(!("message" in a))return a
-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.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=$.Up()
-t=$.PH()
-s=$.D1()
-r=$.rx()
-q=$.kQ()
-p=$.W6()
-$.Bi()
-o=$.eA()
-n=$.ko()
-m=v.qS(y)
-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.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)
-if(m==null){m=p.qS(y)
-if(m==null){m=s.qS(y)
-if(m==null){m=o.qS(y)
-if(m==null){m=n.qS(y)
-v=m!=null}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0
-if(v){v=m==null?null:m.method
-return z.$1(new H.Zo(y,v))}}}v=typeof y==="string"?y:""
-return z.$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.KY()
-return z.$1(new P.AT(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.KY()
-return a},
-CU:function(a){if(a==null||typeof a!='object')return J.v1(a)
-else return H.eQ(a)},
-B7:function(a,b){var z,y,x,w
-z=a.length
-for(y=0;y<z;y=w){x=y+1
-w=x+1
-b.u(0,a[y],a[x])}return b},
-El:[function(a,b,c,d,e,f,g){var z=J.x(c)
-if(z.n(c,0))return H.dB(b,new H.dr(a))
-else if(z.n(c,1))return H.dB(b,new H.TL(a,d))
-else if(z.n(c,2))return H.dB(b,new H.uZ(a,d,e))
-else if(z.n(c,3))return H.dB(b,new H.OQ(a,d,e,f))
-else if(z.n(c,4))return H.dB(b,new H.Qx(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","ye5",14,0,null,6,7,8,9,10,11,12],
-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.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
-z=b[0]
-z.$stubName
-y=z.$callName
-z.$reflectionInfo=c
-x=H.zh(z).AM
-w=d?Object.create(new H.Bp().constructor.prototype):Object.create(new H.v(null,null,null,null).constructor.prototype)
-w.$initialize=w.constructor
-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.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.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)
-else if(u&&typeof x=="function"){q=t?H.HY:H.uj
-r=function(g,h){return function(){return g.apply({$receiver:h(this)},arguments)}}(x,q)}else throw H.b("Error in reflectionInfo.")
-w.$signature=r
-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.SD(a,o,t)
-w[n]=m}}w["call*"]=s
-return v},
-vq:function(a,b,c,d){var z=H.uj
-switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
-case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
-case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
-case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
-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)}},
-SD:function(a,b,c){var z,y,x,w,v,u
-if(c)return H.Hf(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.B3("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.B3("self")
-$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
-w=$.OK
-$.OK=J.ew(w,1)
-return new Function(v+H.d(w)+"}")()},
-Zq:function(a,b,c,d){var z,y
-z=H.uj
-y=H.HY
-switch(b?-1:a){case 0:throw H.b(H.Pa("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)
-case 4:return function(e,f,g){return function(h,i,j){return f(this)[e](g(this),h,i,j)}}(c,z,y)
-case 5:return function(e,f,g){return function(h,i,j,k){return f(this)[e](g(this),h,i,j,k)}}(c,z,y)
-case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
-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.bO()
-y=$.P4
-if(y==null){y=H.B3("receiver")
-$.P4=y}x=b.$stubName
-w=b.length
-v=typeof dart_precompiled=="function"
-u=a[x]
-t=b==null?u==null:b===u
-if(v||!t||w>=28)return H.Zq(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.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.ew(t,1)
-return new Function(y+H.d(t)+"}")()},
-wh:function(a,b,c,d,e,f){b.fixed$length=init
-c.fixed$length=init
-return H.HA(a,b,c,!!d,e,f)},
-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.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.Fp(z)
-return new H.KEA(z,b,null)},
-G3:function(){return C.KZ},
-Kx:function(a){return new H.cu(a,null)},
-VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},
-oX:function(a){if(a==null)return
-return a.$builtinTypeInfo},
-IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
-ip:function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},
-Kp:function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},
-Ko:function(a,b){if(a==null)return"dynamic"
-else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
-else if(typeof a=="function")return a.builtin$cls
-else if(typeof a==="number"&&Math.floor(a)===a)return C.jn.bu(a)
-else return},
-ia:function(a,b,c){var z,y,x,w,v,u
-if(a==null)return""
-z=P.p9("")
-for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
-else z.vM+=", "
-v=a[y]
-if(v!=null)w=!1
-u=H.Ko(v,c)
-z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
-dJ:function(a){var z=J.x(a).constructor.builtin$cls
-if(a==null)return z
-return z+H.ia(a.$builtinTypeInfo,0,null)},
-Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function"){a=H.ml(a,null,b)
-if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},
-RB:function(a,b,c,d){var z,y
-if(a==null)return!1
-z=H.oX(a)
-y=J.x(a)
-if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},
-hv:function(a,b){var z,y
-if(a==null||b==null)return!0
-z=a.length
-for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},
-XW:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
-IU:function(a,b){var z,y
-if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="c8"
-if(b==null)return!0
-z=H.oX(a)
-a=J.x(a)
-if(z!=null){y=z.slice()
-y.splice(0,0,a)}else y=a
-return H.t1(y,b)},
-t1:function(a,b){var z,y,x,w,v,u,t
-if(a===b)return!0
-if(a==null||b==null)return!0
-if("func" in b){if(!("func" in a)){if("$is_"+H.d(b.func) in a)return!0
-z=a.$signature
-if(z==null)return!1
-a=z.apply(a,null)}return H.J4(a,b)}if(b.builtin$cls==="EH"&&"func" in a)return!0
-y=typeof a==="object"&&a!==null&&a.constructor===Array
-x=y?a[0]:a
-w=typeof b==="object"&&b!==null&&b.constructor===Array
-v=w?b[0]:b
-u=H.Ko(v,null)
-if(v!==x){if(!("$is"+H.d(u) in x))return!1
-t=x["$as"+H.d(H.Ko(v,null))]}else t=null
-if(!y&&t==null||!w)return!0
-y=y?a.slice(1):null
-w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},
-Hc:function(a,b,c){var z,y,x,w,v
-if(b==null&&a==null)return!0
-if(b==null)return c
-if(a==null)return!1
-z=a.length
-y=b.length
-if(c){if(z<y)return!1}else if(z!==y)return!1
-for(x=0;x<y;++x){w=a[x]
-v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},
-Vt:function(a,b){var z,y,x,w,v,u
-if(b==null)return!0
-if(a==null)return!1
-z=Object.getOwnPropertyNames(b)
-z.fixed$length=init
-y=z
-for(z=y.length,x=0;x<z;++x){w=y[x]
-if(!Object.hasOwnProperty.call(a,w))return!1
-v=b[w]
-u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
-J4:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-if(!("func" in a))return!1
-if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
-y=b.ret
-if(!(H.t1(z,y)||H.t1(y,z)))return!1}x=a.args
-w=b.args
-v=a.opt
-u=b.opt
-t=x!=null?x.length:0
-s=w!=null?w.length:0
-r=v!=null?v.length:0
-q=u!=null?u.length:0
-if(t>s)return!1
-if(t+r<s+q)return!1
-if(t===s){if(!H.Hc(x,w,!1))return!1
-if(!H.Hc(v,u,!0))return!1}else{for(p=0;p<t;++p){o=x[p]
-n=w[p]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=p,l=0;m<s;++l,++m){o=v[l]
-n=w[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
-n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
-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))},
-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)
-y=$.q4[z]
-if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}x=$.vv[z]
-if(x!=null)return x
-w=init.interceptorsByTag[z]
-if(w==null){z=$.TX.$2(a,z)
-if(z!=null){y=$.q4[z]
-if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}x=$.vv[z]
-if(x!=null)return x
-w=init.interceptorsByTag[z]}}if(w==null)return
-x=w.prototype
-v=z[0]
-if(v==="!"){y=H.Va(x)
-$.q4[z]=y
-Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}if(v==="~"){$.vv[z]=x
-return x}if(v==="-"){u=H.Va(x)
-Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}if(v==="+")return H.B1(a,x)
-if(v==="*")throw H.b(P.SY(z))
-if(init.leafTags[z]===true){u=H.Va(x)
-Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.B1(a,x)},
-B1:function(a,b){var z,y
-z=Object.getPrototypeOf(a)
-y=J.Qu(b,z,null,null)
-Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return b},
-Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
-ow:function(a,b,c){var z=b.prototype
-if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},
-XD:function(){if(!0===$.Bv)return
-$.Bv=!0
-H.Z1()},
-Z1:function(){var z,y,x,w,v,u,t,s
-$.q4=Object.create(null)
-$.vv=Object.create(null)
-H.kO()
-z=init.interceptorsByTag
-y=Object.getOwnPropertyNames(z)
-if(typeof window!="undefined"){window
-x=function(){}
-for(w=0;w<y.length;++w){v=y[w]
-u=$.x7.$1(v)
-if(u!=null){t=H.ow(v,z[v],u)
-if(t!=null){Object.defineProperty(u,init.dispatchPropertyName,{value:t,enumerable:false,writable:true,configurable:true})
-x.prototype=u}}}}for(w=0;w<y.length;++w){v=y[w]
-if(/^[A-Za-z_]/.test(v)){s=z[v]
-z["!"+v]=s
-z["~"+v]=s
-z["-"+v]=s
-z["+"+v]=s
-z["*"+v]=s}}},
-kO:function(){var z,y,x,w,v,u,t
-z=C.MA()
-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]
-if(typeof w=="function")z=w(z)||z}}v=z.getTag
-u=z.getUnknownTag
-t=z.prototypeForTag
-$.NF=new H.dC(v)
-$.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.ns])
-y=b.length
-x=a.length
-for(w=0;!0;){v=C.xB.XU(b,a,w)
-if(v===-1)break
-z.push(new H.Vo(v,b,a))
-u=v+x
-if(u===y)break
-else w=v===u?w+1:u}return z},
-b0:function(a,b,c){var z,y
-if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
-else{z=J.x(b)
-if(!!z.$isVR){z=C.xB.yn(a,c)
-y=b.Ej
-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("")
-y=a.length
-z.KF(c)
-for(x=0;x<y;++x){w=a[x]
-w=z.vM+=w
-z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
-ysD:{
-"^":"a;",
-gl0:function(a){return J.xC(this.gB(this),0)},
-gor:function(a){return!J.xC(this.gB(this),0)},
-bu:function(a){return P.vW(this)},
-EP:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
-u:function(a,b,c){return this.EP()},
-V1:function(a){return this.EP()},
-FV:function(a,b){return this.EP()},
-$isZ0:true},
-Px:{
-"^":"ysD;B>,HV,tc",
-x4:function(a){if(typeof a!=="string")return!1
-if("__proto__"===a)return!1
-return this.HV.hasOwnProperty(a)},
-t:function(a,b){if(!this.x4(b))return
-return this.TZ(b)},
-TZ:function(a){return this.HV[a]},
-aN:function(a,b){var z,y,x
-z=this.tc
-for(y=0;y<z.length;++y){x=z[y]
-b.$2(x,this.TZ(x))}},
-gvc:function(){return H.VM(new H.XR(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Kp(this,0),H.Kp(this,1))},
-$isyN:true},
-hY:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,75,"call"],
-$isEH:true},
-XR:{
-"^":"mW;Y3",
-gA:function(a){return J.mY(this.Y3.tc)}},
-LI:{
-"^":"a;lK,uk,xI,rq,FX,Nc",
-gWa:function(){return this.lK},
-gUA:function(){return this.xI===0},
-gnd:function(){var z,y,x,w
-if(this.xI===1)return C.dn
-z=this.rq
-y=z.length-this.FX.length
-if(y===0)return C.dn
-x=[]
-for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
-x.push(z[w])}x.immutable$list=!0
-x.fixed$length=!0
-return x},
-gVm:function(){var z,y,x,w,v,u,t,s
-if(this.xI!==0)return P.Fl(P.GD,null)
-z=this.FX
-y=z.length
-x=this.rq
-w=x.length-y
-if(y===0)return P.Fl(P.GD,null)
-v=P.L5(null,null,null,P.GD,null)
-for(u=0;u<y;++u){if(u>=z.length)return H.e(z,u)
-t=z[u]
-s=w+u
-if(s<0||s>=x.length)return H.e(x,s)
-v.u(0,new H.IN(t),x[s])}return v},
-static:{"^":"hAw,oY,Y8"}},
-FD:{
-"^":"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()
-if(b<z)return
-return this.Rn[3+b-z]},
-Fk:function(a){var z=this.Rv
-if(a<z)return
-if(!this.Mo||this.hG===1)return this.BX(0,a)
-return this.BX(0,this.e4(a-z))},
-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))},
-e4:function(a){var z,y,x,w,v,u
-z={}
-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))
-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,H6",zh:function(a){var z,y,x
-z=a.$reflectionInfo
-if(z==null)return
-z.fixed$length=init
-z=z
-y=z[0]
-x=z[1]
-return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
-uV:{
-"^":"Tp:5;a,b,c",
-$1:function(a){var z,y,x
-z=this.b.NE
-y=this.a.a++
-x=this.c.t(0,a)
-if(y>=z.length)return H.e(z,y)
-z[y]=x},
-$isEH:true},
-Cj:{
-"^":"Tp:78;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:{
-"^":"Tp:78;a,b",
-$2:function(a,b){var z=this.b
-if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},
-$isEH:true},
-Zr:{
-"^":"a;bT,rq,Xs,Fa,Ga,cR",
-qS:function(a){var z,y,x
-z=new RegExp(this.bT).exec(a)
-if(z==null)return
-y={}
-x=this.rq
-if(x!==-1)y.arguments=z[x+1]
-x=this.Xs
-if(x!==-1)y.argumentsExpr=z[x+1]
-x=this.Fa
-if(x!==-1)y.expr=z[x+1]
-x=this.Ga
-if(x!==-1)y.method=z[x+1]
-x=this.cR
-if(x!==-1)y.receiver=z[x+1]
-return y},
-static:{"^":"lm,k1,Re,fN,qi,cz,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=[]
-y=z.indexOf("\\$arguments\\$")
-x=z.indexOf("\\$argumentsExpr\\$")
-w=z.indexOf("\\$expr\\$")
-v=z.indexOf("\\$method\\$")
-u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},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;K9,Ga",
-bu:function(a){var z=this.Ga
-if(z==null)return"NullError: "+H.d(this.K9)
-return"NullError: Cannot call \""+H.d(z)+"\" on null"},
-$isJS:true,
-$isXS:true},
-u0:{
-"^":"XS;K9,Ga,cR",
-bu:function(a){var z,y
-z=this.Ga
-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.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
-y=z?null:b.method
-z=z?null:b.receiver
-return new H.u0(a,y,z)}}},
-vV:{
-"^":"XS;K9",
-bu:function(a){var z=this.K9
-return C.xB.gl0(z)?"Error":"Error: "+z}},
-Am:{
-"^":"Tp:13;a",
-$1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},
-$isEH:true},
-XO:{
-"^":"a;lA,ui",
-bu:function(a){var z,y
-z=this.ui
-if(z!=null)return z
-z=this.lA
-y=typeof z==="object"?z.stack:null
-z=y==null?"":y
-this.ui=z
-return z}},
-dr:{
-"^":"Tp:69;a",
-$0:function(){return this.a.$0()},
-$isEH:true},
-TL:{
-"^":"Tp:69;b,c",
-$0:function(){return this.b.$1(this.c)},
-$isEH:true},
-uZ:{
-"^":"Tp:69;d,e,f",
-$0:function(){return this.d.$2(this.e,this.f)},
-$isEH:true},
-OQ:{
-"^":"Tp:69;UI,bK,Gq,Rm",
-$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
-$isEH:true},
-Qx:{
-"^":"Tp:69;w3,HZ,mG,xC,cj",
-$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
-$isEH:true},
-Tp:{
-"^":"a;",
-bu:function(a){return"Closure"},
-$isEH:true,
-gKu:function(){return this}},
-Bp:{
-"^":"Tp;"},
-v:{
-"^":"Bp;nw,jm,cR,RA",
-n:function(a,b){if(b==null)return!1
-if(this===b)return!0
-if(!J.x(b).$isv)return!1
-return this.nw===b.nw&&this.jm===b.jm&&this.cR===b.cR},
-giO:function(a){var z,y
-z=this.cR
-if(z==null)y=H.eQ(this.nw)
-else y=typeof z!=="object"?J.v1(z):H.eQ(z)
-return J.UN(y,H.eQ(this.jm))},
-$isv:true,
-static:{"^":"bf,P4",uj:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
-if(z==null){z=H.B3("self")
-$.bf=z}return z},B3:function(a){var z,y,x,w,v
-z=new H.v("self","target","receiver","name")
-y=Object.getOwnPropertyNames(z)
-y.fixed$length=init
-x=y
-for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}}}},
-Pe:{
-"^":"XS;G1>",
-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))}}},
-bb:{
-"^":"XS;G1>",
-bu:function(a){return"RuntimeError: "+H.d(this.G1)},
-static:{Pa:function(a){return new H.bb(a)}}},
-lbp:{
-"^":"a;"},
-GN:{
-"^":"lbp;dw,Iq,is,p6",
-BD:function(a){var z=this.rP(a)
-return z==null?!1:H.J4(z,this.za())},
-rP:function(a){var z=J.x(a)
-return"$signature" in z?z.$signature():null},
-za:function(){var z,y,x,w,v,u,t
-z={func:"dynafunc"}
-y=this.dw
-x=J.x(y)
-if(!!x.$isnr)z.void=true
-else if(!x.$ishJ)z.ret=y.za()
-y=this.Iq
-if(y!=null&&y.length!==0)z.args=H.Dz(y)
-y=this.is
-if(y!=null&&y.length!==0)z.opt=H.Dz(y)
-y=this.p6
-if(y!=null){w={}
-v=H.kU(y)
-for(x=v.length,u=0;u<x;++u){t=v[u]
-w[t]=y[t].za()}z.named=w}return z},
-bu:function(a){var z,y,x,w,v,u,t,s
-z=this.Iq
-if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
-if(w)x+=", "
-x+=H.d(u)}else{x="("
-w=!1}z=this.is
-if(z!=null&&z.length!==0){x=(w?x+", ":x)+"["
-for(y=z.length,w=!1,v=0;v<y;++v,w=!0){u=z[v]
-if(w)x+=", "
-x+=H.d(u)}x+="]"}else{z=this.p6
-if(z!=null){x=(w?x+", ":x)+"{"
-t=H.kU(z)
-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:{"^":"Ot",Dz:function(a){var z,y,x
-a=a
-z=[]
-for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z}}},
-hJ:{
-"^":"lbp;",
-bu:function(a){return"dynamic"},
-za:function(){return},
-$ishJ:true},
-Fp:{
-"^":"lbp;oc>",
-za:function(){var z,y
-z=this.oc
-y=init.allClasses[z]
-if(y==null)throw H.b("no type for '"+H.d(z)+"'")
-return y},
-bu:function(a){return this.oc}},
-KEA:{
-"^":"lbp;oc>,re,Et",
-za:function(){var z,y
-z=this.Et
-if(z!=null)return z
-z=this.oc
-y=[init.allClasses[z]]
-if(0>=y.length)return H.e(y,0)
-if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
-for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
-this.Et=y
-return y},
-bu:function(a){return H.d(this.oc)+"<"+J.Dn(this.re,", ")+">"}},
-cu:{
-"^":"a;LU,ke",
-bu:function(a){var z,y
-z=this.ke
-if(z!=null)return z
-y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
-this.ke=y
-return y},
-giO:function(a){return J.v1(this.LU)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iscu&&J.xC(this.LU,b.LU)},
-$iscu:true,
-$isuq:true},
-dC:{
-"^":"Tp:13;a",
-$1:function(a){return this.a(a)},
-$isEH:true},
-VX:{
-"^":"Tp:79;b",
-$2:function(a,b){return this.b(a,b)},
-$isEH:true},
-vZ:{
-"^":"Tp:5;c",
-$1:function(a){return this.c(a)},
-$isEH:true},
-VR:{
-"^":"a;zO,Ej,BT,xJ",
-gF4:function(){var z=this.BT
-if(z!=null)return z
-z=this.Ej
-z=H.ol(this.zO,z.multiline,!z.ignoreCase,!0)
-this.BT=z
-return z},
-gAT:function(){var z=this.xJ
-if(z!=null)return z
-z=this.Ej
-z=H.ol(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
-this.xJ=z
-return z},
-ej:function(a){var z
-if(typeof a!=="string")H.vh(P.u(a))
-z=this.Ej.exec(a)
-if(z==null)return
-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.gF4()
-z.lastIndex=b
-y=z.exec(a)
-if(y==null)return
-return H.Mr(this,y)},
-Bh:function(a,b){var z,y,x,w
-z=this.gAT()
-z.lastIndex=b
-y=z.exec(a)
-if(y==null)return
-x=y.length
-w=x-1
-if(w<0)return H.e(y,w)
-if(y[w]!=null)return
-C.Nm.sB(y,w)
-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)
-z=c>z}else z=!0
-if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},
-R4:function(a,b){return this.wL(a,b,0)},
-$isVR:true,
-$isSP:true,
-static:{ol:function(a,b,c,d){var z,y,x,w,v
-z=b?"m":""
-y=c?"":"i"
-x=d?"g":""
-w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
-if(w instanceof RegExp)return w
-v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
-AX:{
-"^":"a;zO,QK",
-t:function(a,b){var z=this.QK
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-VO:function(a,b){},
-$isns:true,
-static:{Mr:function(a,b){var z=new H.AX(a,b)
-z.VO(a,b)
-return z}}},
-KW:{
-"^":"mW;rN,rv",
-gA:function(a){return new H.Pb(this.rN,this.rv,null)},
-$asmW:function(){return[P.ns]},
-$asQV:function(){return[P.ns]}},
-Pb:{
-"^":"a;xz,rv,Wh",
-gl:function(){return this.Wh},
-G:function(){var z,y,x
-if(this.rv==null)return!1
-z=this.Wh
-if(z!=null){z=z.QK
-y=z.index
-if(0>=z.length)return H.e(z,0)
-z=J.q8(z[0])
-if(typeof z!=="number")return H.s(z)
-x=y+z
-if(this.Wh.QK.index===x)++x}else x=0
-z=this.xz.yk(this.rv,x)
-this.Wh=z
-if(z==null){this.rv=null
-return!1}return!0}},
-Vo:{
-"^":"a;M,f1,zO",
-t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
-return this.zO},
-$isns:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
-"^":"",
-hV:{
-"^":"LPc;fi,dB,KW,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.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.dB!=null){a.fi=this.ct(a,C.S4,z,!0)
-this.LY(a,null).Qy(new X.jE(a))}},"$3","gNa",6,0,80,46,47,81],
-static:{zy:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.fi=!1
-a.dB=null
-a.KW="action"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Df.ZL(a)
-C.Df.XI(a)
-return a}}},
-LPc:{
-"^":"xc+Pi;",
-$isd3:true},
-jE:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-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($.Si(),"google"),"visualization")
-$.BY=z
-return z},"$1","vN",2,0,13,14],
-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)},
-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","kh",2,0,15],
-P0:function(a){var z,y,x,w
-z=C.CD.yu(C.CD.UD(a*1000))
-y=C.jn.cU(z,3600000)
-z=C.jn.Y(z,3600000)
-x=C.jn.cU(z,60000)
-z=C.jn.Y(z,60000)
-w=C.jn.cU(z,1000)
-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)},
-As:[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.Sy(z.V(a,1024),1)+"KB"
-else if(z.C(a,1073741824))return C.CD.Sy(z.V(a,1048576),1)+"MB"
-else if(z.C(a,1099511627776))return C.CD.Sy(z.V(a,1073741824),1)+"GB"
-else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","YN",2,0,15,16],
-mG:function(a){var z,y,x,w
-if(a==null)return"-"
-z=J.LL(J.vX(a,1000))
-y=C.jn.cU(z,3600000)
-z=C.jn.Y(z,3600000)
-x=C.jn.cU(z,60000)
-w=C.jn.cU(C.jn.Y(z,60000),1000)
-P.p9("")
-if(y!==0)return""+y+"h "+x+"m "+w+"s"
-if(x!==0)return""+x+"m "+w+"s"
-return""+w+"s"},
-uG:{
-"^":"Pi;",
-gFL:function(a){return this.yF},
-$isuG:true},
-cZ:{
-"^":"uG;MR,yF,AP,fn",
-zw:function(){if(this.yF==null){var z=W.r3("service-view",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
-DV:function(a){if(J.xC(a,""))return
-this.MR.wv.cv(a).ml(new G.zv(this))},
-VU:function(a){return!0}},
-zv:{
-"^":"Tp:13;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,82,"call"],
-$isEH:true},
-Ez:{
-"^":"uG;MR,yF,AP,fn",
-zw:function(){if(this.yF==null){var z=W.r3("class-tree",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
-DV:function(a){this.MR.wv.cv(J.ZZ(a,11)).ml(new G.yk(this))},
-VU:function(a){return J.co(a,"class-tree/")},
-static:{"^":"o9x"}},
-yk:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a.yF
-if(z!=null)J.uM(z,a)},"$1",null,2,0,null,83,"call"],
-$isEH:true},
-f2:{
-"^":"uG;MR,yF,AP,fn",
-zw:function(){if(this.yF==null){var z=W.r3("service-view",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
-DV:function(a){var z,y
-z=H.Go(this.yF,"$isTi")
-y=this.MR.EC
-z.Ll=J.Q5(z,C.td,z.Ll,y)},
-VU:function(a){return J.co(a,"error/")}},
-mL:{
-"^":"Pi;cE,Lh,cL,Z6,wv>,Eb,bn,EC,AP,fn",
-god:function(a){return this.Eb},
-sod:function(a,b){this.Eb=F.Wi(this,C.rB,this.Eb,b)},
-Da:function(){var z,y
-this.om()
-z=this.wv
-y=z.G2
-H.VM(new P.Ik(y),[H.Kp(y,0)]).yI(this.gbf())
-z=z.Li
-H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())
-z=this.Z6
-$.W5=z
-z.ec=this
-y=H.VM(new W.RO(window,C.yf.Ph,!1),[null])
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(z.gjU()),y.Sg),[H.Kp(y,0)]).Zz()
-z.Cy()},
-om:function(){var z,y
-if(this.Lh!=null)return
-z=this.cE
-z.push(new G.Ez(this,null,null,null))
-z.push(new G.f2(this,null,null,null))
-y=new G.cZ(this,null,null,null)
-this.Lh=y
-z.push(y)},
-kj:[function(a){this.EC=a
-this.og("error/",null)},"$1","gbf",2,0,84,24],
-kI:[function(a){this.EC=a
-this.og("error/",null)},"$1","gXa",2,0,85,86],
-og:function(a,b){var z,y,x
-for(z=this.cE,y=0;y<z.length;++y){x=z[y]
-if(x.VU(a)){this.lJ(x)
-x.DV(a)
-return}}throw H.b(P.EY())},
-lJ:function(a){var z,y,x
-z="Installing "+J.AG(a)
-y=$.oK
-if(y==null)H.qw(z)
-else y.$1(z)
-y=this.cL
-if(y==null?a==null:y===a)return
-if(y!=null){x=y.yF
-if(y.gnz(y)&&x!=null){x=new T.qI(y,C.GP,x,null)
-x.$builtinTypeInfo=[null]
-y.nq(y,x)}y.yF=null}a.zw()
-y=this.bn
-J.r4(y)
-y.appendChild(a.yF)
-this.cL=a},
-Ty:function(a){this.Da()},
-E0:function(a){this.Da()}},
-Kf:{
-"^":"a;Yb",
-goH:function(){return this.Yb.nQ("getNumberOfColumns")},
-gvp:function(a){return this.Yb.nQ("getNumberOfRows")},
-B7:function(){var z=this.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
-Id:function(a,b){var z=[]
-C.Nm.FV(z,J.kl(b,P.En()))
-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.V7("draw",[a.Yb,z])}},
-yVe:{
-"^":"d3;",
-lU:function(a){var z,y,x
-if(J.rY(a).nC(a,"#"))a=C.xB.yn(a,1)
-if(C.xB.nC(a,"/"))a=C.xB.yn(a,1)
-if(C.xB.tg(a,"#")){z=a.split("#")
-y=z.length
-if(0>=y)return H.e(z,0)
-a=z[0]
-if(y>1&&!J.xC(z[1],"")){if(1>=z.length)return H.e(z,1)
-x=z[1]}else x=null}else x=null
-this.ec.og(a,x)},
-Bs:function(a,b,c){var z,y,x,w
-z=J.Vs(c).MW.getAttribute("href")
-y=J.RE(a)
-x=y.gpL(a)
-if(typeof x!=="number")return x.D()
-if(x>1||y.gNl(a)===!0||y.gEX(a)===!0||y.gqx(a)===!0||y.gGU(a)===!0)return
-x=$.W5
-w=x.c5
-if(w==null?z!=null:w!==z){N.QM("").To("Navigated to "+H.d(z))
-window.history.pushState(z,document.title,z)
-x.c5=z}x.lU(z)
-y.e6(a)}},
-OR:{
-"^":"yVe;hS,ec,c5,ro,dUC,pt",
-Cy:function(){var z=H.d(window.location.hash)
-if(window.location.hash===""||window.location.hash==="#")z="#"+this.hS
-window.history.pushState(z,document.title,z)
-this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gjU",2,0,87,14]},
-Y2:{
-"^":"Pi;eT>,yt<,ks>,oH<",
-gyX:function(a){return this.PU},
-gty:function(){return this.aZ},
-goE:function(a){return this.yq},
-soE:function(a,b){var z=J.xC(this.yq,b)
-this.yq=b
-if(!z){z=this.PU
-if(b===!0){this.PU=F.Wi(this,C.Ek,z,"\u21b3")
-this.C4(0)}else{this.PU=F.Wi(this,C.Ek,z,"\u2192")
-this.cO()}}},
-r8:function(){this.soE(0,this.yq!==!0)
-return this.yq},
-k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
-$isY2:true},
-XN:{
-"^":"Pi;vp>,AP,fn",
-rT:function(a){var z,y
-z=this.vp
-y=J.w1(z)
-y.V1(z)
-a.C4(0)
-y.FV(z,a.ks)},
-qU:function(a){var z,y,x
-z=this.vp
-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))
-if(y===0)return
-for(x=0;x<y;++x)if(J.Mz(J.UQ(z.gks(a),x))===!0)this.FS(J.UQ(z.gks(a),x))
-z.soE(a,!1)
-z=this.vp
-w=J.U6(z)
-v=w.u8(z,a)+1
-w.UZ(z,v,v+y)}},
-Kt:{
-"^":"a;ph>,OV<",
-static:{hg:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Q8",2,0,17]}},
-Ni:{
-"^":"a;UQ>",
-$isNi:true},
-Vz0:{
-"^":"Pi;oH<,vp>,zz<",
-sxp:function(a){this.pT=a
-F.Wi(this,C.JB,0,1)},
-gxp:function(){return this.pT},
-gT3:function(){return this.jV},
-sT3:function(a){this.jV=a
-F.Wi(this,C.JB,0,1)},
-eE:function(a,b){var z=this.vp
-if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8o(z[a]),b)},
-PV:[function(a,b){var z=this.eE(a,this.pT)
-return J.oE(this.eE(b,this.pT),z)},"$2","gCS",4,0,88],
-zF:[function(a,b){return J.oE(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gAZ",4,0,88],
-Jd:function(a){var z,y
-new P.VV(1000000,null,null).wE(0)
-z=this.zz
-if(this.jV){y=this.gCS()
-H.rd(z,y)}else{y=this.gAZ()
-H.rd(z,y)}},
-B7:function(){C.Nm.sB(this.vp,0)
-C.Nm.sB(this.zz,0)},
-Id:function(a,b){var z=this.vp
-this.zz.push(z.length)
-z.push(b)},
-Gu:function(a,b){var z,y
-z=this.vp
-if(a>=z.length)return H.e(z,a)
-y=J.UQ(J.U8o(z[a]),b)
-z=this.oH
-if(b>=z.length)return H.e(z,b)
-return z[b].gOV().$1(y)},
-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,15,89]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
-"^":"",
-Jz:[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.ET,new E.Cv(),C.WC,new E.ed(),C.S4,new E.wa(),C.Ro,new E.Or(),C.hN,new E.YL(),C.AV,new E.wf(),C.bV,new E.Oa(),C.C0,new E.emv(),C.eZ,new E.Lbd(),C.bk,new E.QAa(),C.lH,new E.CvS(),C.kG,new E.edy(),C.OI,new E.waE(),C.To,new E.Ore(),C.XA,new E.YLa(),C.i4,new E.wfa(),C.qt,new E.Oaa(),C.p1,new E.e0(),C.yL,new E.e1(),C.bJ,new E.e2(),C.ox,new E.e3(),C.Je,new E.e4(),C.iE,new E.e5(),C.f4,new E.e6(),C.VK,new E.e7(),C.aH,new E.e8(),C.aK,new E.e9(),C.GP,new E.e10(),C.vs,new E.e11(),C.Gr,new E.e12(),C.TU,new E.e13(),C.tP,new E.e14(),C.yh,new E.e15(),C.Zb,new E.e16(),C.u7,new E.e17(),C.ne,new E.e18(),C.B0,new E.e19(),C.r1,new E.e20(),C.mr,new E.e21(),C.Ek,new E.e22(),C.Pn,new E.e23(),C.YT,new E.e24(),C.h7,new E.e25(),C.R3,new E.e26(),C.WQ,new E.e27(),C.fV,new E.e28(),C.jU,new E.e29(),C.Gd,new E.e30(),C.OO,new E.e31(),C.Mc,new E.e32(),C.FP,new E.e33(),C.kF,new E.e34(),C.UD,new E.e35(),C.Aq,new E.e36(),C.DS,new E.e37(),C.C9,new E.e38(),C.VF,new E.e39(),C.uU,new E.e40(),C.YJ,new E.e41(),C.eF,new E.e42(),C.oI,new E.e43(),C.ST,new E.e44(),C.QH,new E.e45(),C.qX,new E.e46(),C.rE,new E.e47(),C.nf,new E.e48(),C.pO,new E.e49(),C.EI,new E.e50(),C.JB,new E.e51(),C.d4,new E.e52(),C.cF,new E.e53(),C.Ql,new E.e54(),C.SI,new E.e55(),C.zS,new E.e56(),C.YA,new E.e57(),C.ak,new E.e58(),C.Ge,new E.e59(),C.He,new E.e60(),C.Ss,new E.e61(),C.k6,new E.e62(),C.oj,new E.e63(),C.PJ,new E.e64(),C.q2,new E.e65(),C.d2,new E.e66(),C.kN,new E.e67(),C.fn,new E.e68(),C.yB,new E.e69(),C.eJ,new E.e70(),C.iG,new E.e71(),C.Py,new E.e72(),C.pC,new E.e73(),C.uu,new E.e74(),C.qs,new E.e75(),C.XH,new E.e76(),C.I9,new E.e77(),C.C1,new E.e78(),C.a0,new E.e79(),C.Yg,new E.e80(),C.bR,new E.e81(),C.ai,new E.e82(),C.ob,new E.e83(),C.Iv,new E.e84(),C.Wg,new E.e85(),C.tD,new E.e86(),C.nZ,new E.e87(),C.Of,new E.e88(),C.pY,new E.e89(),C.XL,new E.e90(),C.LA,new E.e91(),C.Lk,new E.e92(),C.dK,new E.e93(),C.xf,new E.e94(),C.rB,new E.e95(),C.bz,new E.e96(),C.Jx,new E.e97(),C.b5,new E.e98(),C.Lc,new E.e99(),C.hf,new E.e100(),C.uk,new E.e101(),C.Zi,new E.e102(),C.TN,new E.e103(),C.kA,new E.e104(),C.GI,new E.e105(),C.Wn,new E.e106(),C.ur,new E.e107(),C.VN,new E.e108(),C.EV,new E.e109(),C.VI,new E.e110(),C.eh,new E.e111(),C.r6,new E.e112(),C.MW,new E.e113(),C.SA,new E.e114(),C.kV,new E.e115(),C.vp,new E.e116(),C.cc,new E.e117(),C.DY,new E.e118(),C.Lx,new E.e119(),C.M3,new E.e120(),C.wT,new E.e121(),C.SR,new E.e122(),C.t6,new E.e123(),C.rP,new E.e124(),C.pX,new E.e125(),C.VD,new E.e126(),C.NN,new E.e127(),C.UX,new E.e128(),C.YS,new E.e129(),C.pu,new E.e130(),C.BJ,new E.e131(),C.td,new E.e132(),C.Gn,new E.e133(),C.zO,new E.e134(),C.vg,new E.e135(),C.Ys,new E.e136(),C.zm,new E.e137(),C.XM,new E.e138(),C.Ic,new E.e139(),C.yG,new E.e140(),C.uI,new E.e141(),C.tW,new E.e142(),C.CG,new E.e143(),C.Wj,new E.e144(),C.vb,new E.e145(),C.UL,new E.e146(),C.AY,new E.e147(),C.QK,new E.e148(),C.AO,new E.e149(),C.I7,new E.e150(),C.xP,new E.e151(),C.Wm,new E.e152(),C.GR,new E.e153(),C.KX,new E.e154(),C.ja,new E.e155(),C.Dj,new E.e156(),C.ir,new E.e157(),C.dx,new E.e158(),C.ni,new E.e159(),C.X2,new E.e160(),C.F3,new E.e161(),C.UY,new E.e162(),C.Aa,new E.e163(),C.nY,new E.e164(),C.tg,new E.e165(),C.HD,new E.e166(),C.iU,new E.e167(),C.eN,new E.e168(),C.ue,new E.e169(),C.nh,new E.e170(),C.L2,new E.e171(),C.Gs,new E.e172(),C.bE,new E.e173(),C.YD,new E.e174(),C.PX,new E.e175(),C.N8,new E.e176(),C.EA,new E.e177(),C.oW,new E.e178(),C.hd,new E.e179(),C.pH,new E.e180(),C.Ve,new E.e181(),C.jM,new E.e182(),C.nt,new E.e183(),C.PM,new E.e184(),C.xA,new E.e185(),C.k5,new E.e186(),C.Nv,new E.e187(),C.Cw,new E.e188(),C.TW,new E.e189(),C.xS,new E.e190(),C.mi,new E.e191(),C.zz,new E.e192(),C.hO,new E.e193(),C.ei,new E.e194(),C.HK,new E.e195(),C.je,new E.e196(),C.Ef,new E.e197(),C.Q1,new E.e198(),C.ID,new E.e199(),C.z6,new E.e200(),C.bc,new E.e201(),C.kw,new E.e202(),C.ep,new E.e203(),C.J2,new E.e204(),C.zU,new E.e205(),C.bn,new E.e206(),C.mh,new E.e207(),C.Fh,new E.e208(),C.LP,new E.e209(),C.jh,new E.e210(),C.fj,new E.e211(),C.xw,new E.e212(),C.zn,new E.e213(),C.RJ,new E.e214(),C.Tc,new E.e215(),C.YE,new E.e216(),C.Uy,new E.e217()],null,null)
-y=P.EF([C.aP,new E.e218(),C.cg,new E.e219(),C.S4,new E.e220(),C.AV,new E.e221(),C.bk,new E.e222(),C.lH,new E.e223(),C.kG,new E.e224(),C.XA,new E.e225(),C.i4,new E.e226(),C.yL,new E.e227(),C.bJ,new E.e228(),C.VK,new E.e229(),C.aH,new E.e230(),C.vs,new E.e231(),C.Gr,new E.e232(),C.tP,new E.e233(),C.yh,new E.e234(),C.Zb,new E.e235(),C.ne,new E.e236(),C.B0,new E.e237(),C.mr,new E.e238(),C.YT,new E.e239(),C.WQ,new E.e240(),C.jU,new E.e241(),C.Gd,new E.e242(),C.OO,new E.e243(),C.Mc,new E.e244(),C.QH,new E.e245(),C.rE,new E.e246(),C.nf,new E.e247(),C.Ql,new E.e248(),C.ak,new E.e249(),C.Ge,new E.e250(),C.He,new E.e251(),C.oj,new E.e252(),C.d2,new E.e253(),C.fn,new E.e254(),C.Py,new E.e255(),C.uu,new E.e256(),C.qs,new E.e257(),C.a0,new E.e258(),C.rB,new E.e259(),C.Lc,new E.e260(),C.hf,new E.e261(),C.uk,new E.e262(),C.Zi,new E.e263(),C.TN,new E.e264(),C.kA,new E.e265(),C.ur,new E.e266(),C.EV,new E.e267(),C.eh,new E.e268(),C.SA,new E.e269(),C.kV,new E.e270(),C.vp,new E.e271(),C.SR,new E.e272(),C.t6,new E.e273(),C.UX,new E.e274(),C.YS,new E.e275(),C.td,new E.e276(),C.zO,new E.e277(),C.Ys,new E.e278(),C.XM,new E.e279(),C.Ic,new E.e280(),C.tW,new E.e281(),C.Wj,new E.e282(),C.vb,new E.e283(),C.QK,new E.e284(),C.AO,new E.e285(),C.xP,new E.e286(),C.GR,new E.e287(),C.KX,new E.e288(),C.ja,new E.e289(),C.Dj,new E.e290(),C.X2,new E.e291(),C.UY,new E.e292(),C.Aa,new E.e293(),C.nY,new E.e294(),C.tg,new E.e295(),C.HD,new E.e296(),C.iU,new E.e297(),C.eN,new E.e298(),C.Gs,new E.e299(),C.bE,new E.e300(),C.YD,new E.e301(),C.PX,new E.e302(),C.pH,new E.e303(),C.Ve,new E.e304(),C.jM,new E.e305(),C.nt,new E.e306(),C.PM,new E.e307(),C.Nv,new E.e308(),C.Cw,new E.e309(),C.TW,new E.e310(),C.mi,new E.e311(),C.zz,new E.e312(),C.z6,new E.e313(),C.kw,new E.e314(),C.zU,new E.e315(),C.RJ,new E.e316(),C.YE,new E.e317()],null,null)
-x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.xE,C.Mt,C.oT,C.il,C.jR,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.MI,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Zj,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.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,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.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.jw,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.jw,C.Mt,C.l4,C.al,C.il],null,null)
-w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,C.CM,C.nw,P.EF([C.rB,C.hR,C.bz,C.Bk],null,null),C.xE,P.EF([C.XA,C.xY,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,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.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.BL,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.Yo,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.V3,C.pO,C.au,C.Lc,C.Pc,C.AO,C.fi],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.hR,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.Wz,C.CM,C.MI,P.EF([C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,C.CM,C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.nX,C.CM,C.Zj,P.EF([C.oj,C.GT],null,null),C.Ep,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.bw],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.dq,C.He,C.oV,C.vb,C.Mq,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.bB,C.zz,C.lS],null,null),C.UJ,C.CM,C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.hr,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.DZ,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,C.CM,C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,C.CM,C.ON,P.EF([C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.SA,C.KI,C.tW,C.kH,C.CG,C.Ml,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS],null,null),C.Sb,P.EF([C.tW,C.kH,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.rZ],null,null),C.il,P.EF([C.uu,C.yY,C.xP,C.TO,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.Zk,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.m2,C.RJ,C.BP],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.ET,"assertsEnabled",C.WC,"bpt",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",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.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",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.h7,"external",C.R3,"fd",C.WQ,"field",C.fV,"fields",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.d4,"goto",C.cF,"gotoLink",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.ak,"hasParent",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",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.XL,"isPatch",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.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.kA,"lastTokenPos",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.r6,"lineNumber",C.MW,"lineNumbers",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.BJ,"newSpace",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",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.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",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.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.nt,"startLine",C.PM,"status",C.xA,"styleForHits",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",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.Ef,"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.LP,"used",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.fH(z,y,C.CM)
-$.Yv=new O.bY(x,w,!1)
-$.qe=v
-$.M6=[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(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391()]
-$.UG=!0
-F.E2()},"$0","V7",0,0,18],
-em:{
-"^":"Tp:13;",
-$1:function(a){return J.Jp(a)},
-$isEH:true},
-Lb:{
-"^":"Tp:13;",
-$1:function(a){return a.gYu()},
-$isEH:true},
-QA:{
-"^":"Tp:13;",
-$1:function(a){return J.Ln(a)},
-$isEH:true},
-Cv:{
-"^":"Tp:13;",
-$1:function(a){return a.gA3()},
-$isEH:true},
-ed:{
-"^":"Tp:13;",
-$1:function(a){return a.gqr()},
-$isEH:true},
-wa:{
-"^":"Tp:13;",
-$1:function(a){return J.nG(a)},
-$isEH:true},
-Or:{
-"^":"Tp:13;",
-$1:function(a){return J.aA(a)},
-$isEH:true},
-YL:{
-"^":"Tp:13;",
-$1:function(a){return a.gfj()},
-$isEH:true},
-wf:{
-"^":"Tp:13;",
-$1:function(a){return J.WT(a)},
-$isEH:true},
-Oa:{
-"^":"Tp:13;",
-$1:function(a){return a.gCs()},
-$isEH:true},
-emv:{
-"^":"Tp:13;",
-$1:function(a){return J.Wp(a)},
-$isEH:true},
-Lbd:{
-"^":"Tp:13;",
-$1:function(a){return J.n9(a)},
-$isEH:true},
-QAa:{
-"^":"Tp:13;",
-$1:function(a){return J.K0(a)},
-$isEH:true},
-CvS:{
-"^":"Tp:13;",
-$1:function(a){return J.hn(a)},
-$isEH:true},
-edy:{
-"^":"Tp:13;",
-$1:function(a){return J.yz(a)},
-$isEH:true},
-waE:{
-"^":"Tp:13;",
-$1:function(a){return J.pP(a)},
-$isEH:true},
-Ore:{
-"^":"Tp:13;",
-$1:function(a){return a.gaP()},
-$isEH:true},
-YLa:{
-"^":"Tp:13;",
-$1:function(a){return J.E3(a)},
-$isEH:true},
-wfa:{
-"^":"Tp:13;",
-$1:function(a){return J.on(a)},
-$isEH:true},
-Oaa:{
-"^":"Tp:13;",
-$1:function(a){return J.SM(a)},
-$isEH:true},
-e0:{
-"^":"Tp:13;",
-$1:function(a){return a.goH()},
-$isEH:true},
-e1:{
-"^":"Tp:13;",
-$1:function(a){return J.xe(a)},
-$isEH:true},
-e2:{
-"^":"Tp:13;",
-$1:function(a){return J.OT(a)},
-$isEH:true},
-e3:{
-"^":"Tp:13;",
-$1:function(a){return J.Ok(a)},
-$isEH:true},
-e4:{
-"^":"Tp:13;",
-$1:function(a){return a.gl()},
-$isEH:true},
-e5:{
-"^":"Tp:13;",
-$1:function(a){return a.gSL()},
-$isEH:true},
-e6:{
-"^":"Tp:13;",
-$1:function(a){return a.guH()},
-$isEH:true},
-e7:{
-"^":"Tp:13;",
-$1:function(a){return J.mP(a)},
-$isEH:true},
-e8:{
-"^":"Tp:13;",
-$1:function(a){return J.BT(a)},
-$isEH:true},
-e9:{
-"^":"Tp:13;",
-$1:function(a){return J.vi(a)},
-$isEH:true},
-e10:{
-"^":"Tp:13;",
-$1:function(a){return J.nq(a)},
-$isEH:true},
-e11:{
-"^":"Tp:13;",
-$1:function(a){return J.k0(a)},
-$isEH:true},
-e12:{
-"^":"Tp:13;",
-$1:function(a){return J.rw(a)},
-$isEH:true},
-e13:{
-"^":"Tp:13;",
-$1:function(a){return J.wt(a)},
-$isEH:true},
-e14:{
-"^":"Tp:13;",
-$1:function(a){return a.gw2()},
-$isEH:true},
-e15:{
-"^":"Tp:13;",
-$1:function(a){return J.w8(a)},
-$isEH:true},
-e16:{
-"^":"Tp:13;",
-$1:function(a){return J.is(a)},
-$isEH:true},
-e17:{
-"^":"Tp:13;",
-$1:function(a){return J.yi(a)},
-$isEH:true},
-e18:{
-"^":"Tp:13;",
-$1:function(a){return J.Vl(a)},
-$isEH:true},
-e19:{
-"^":"Tp:13;",
-$1:function(a){return J.kE(a)},
-$isEH:true},
-e20:{
-"^":"Tp:13;",
-$1:function(a){return J.Gl(a)},
-$isEH:true},
-e21:{
-"^":"Tp:13;",
-$1:function(a){return J.Mz(a)},
-$isEH:true},
-e22:{
-"^":"Tp:13;",
-$1:function(a){return J.nb(a)},
-$isEH:true},
-e23:{
-"^":"Tp:13;",
-$1:function(a){return a.gty()},
-$isEH:true},
-e24:{
-"^":"Tp:13;",
-$1:function(a){return J.yn(a)},
-$isEH:true},
-e25:{
-"^":"Tp:13;",
-$1:function(a){return a.gMX()},
-$isEH:true},
-e26:{
-"^":"Tp:13;",
-$1:function(a){return a.gkE()},
-$isEH:true},
-e27:{
-"^":"Tp:13;",
-$1:function(a){return J.pm(a)},
-$isEH:true},
-e28:{
-"^":"Tp:13;",
-$1:function(a){return a.gtJ()},
-$isEH:true},
-e29:{
-"^":"Tp:13;",
-$1:function(a){return J.Ec(a)},
-$isEH:true},
-e30:{
-"^":"Tp:13;",
-$1:function(a){return a.ghY()},
-$isEH:true},
-e31:{
-"^":"Tp:13;",
-$1:function(a){return J.ra(a)},
-$isEH:true},
-e32:{
-"^":"Tp:13;",
-$1:function(a){return J.QZ(a)},
-$isEH:true},
-e33:{
-"^":"Tp:13;",
-$1:function(a){return J.WX(a)},
-$isEH:true},
-e34:{
-"^":"Tp:13;",
-$1:function(a){return J.JD(a)},
-$isEH:true},
-e35:{
-"^":"Tp:13;",
-$1:function(a){return a.gZd()},
-$isEH:true},
-e36:{
-"^":"Tp:13;",
-$1:function(a){return J.lT(a)},
-$isEH:true},
-e37:{
-"^":"Tp:13;",
-$1:function(a){return J.M4(a)},
-$isEH:true},
-e38:{
-"^":"Tp:13;",
-$1:function(a){return a.gkA()},
-$isEH:true},
-e39:{
-"^":"Tp:13;",
-$1:function(a){return a.gGK()},
-$isEH:true},
-e40:{
-"^":"Tp:13;",
-$1:function(a){return a.gan()},
-$isEH:true},
-e41:{
-"^":"Tp:13;",
-$1:function(a){return a.gcQ()},
-$isEH:true},
-e42:{
-"^":"Tp:13;",
-$1:function(a){return a.gS7()},
-$isEH:true},
-e43:{
-"^":"Tp:13;",
-$1:function(a){return a.gJz()},
-$isEH:true},
-e44:{
-"^":"Tp:13;",
-$1:function(a){return J.PY(a)},
-$isEH:true},
-e45:{
-"^":"Tp:13;",
-$1:function(a){return J.bu(a)},
-$isEH:true},
-e46:{
-"^":"Tp:13;",
-$1:function(a){return J.VL(a)},
-$isEH:true},
-e47:{
-"^":"Tp:13;",
-$1:function(a){return J.zN(a)},
-$isEH:true},
-e48:{
-"^":"Tp:13;",
-$1:function(a){return J.m4(a)},
-$isEH:true},
-e49:{
-"^":"Tp:13;",
-$1:function(a){return J.v8(a)},
-$isEH:true},
-e50:{
-"^":"Tp:13;",
-$1:function(a){return a.gmu()},
-$isEH:true},
-e51:{
-"^":"Tp:13;",
-$1:function(a){return a.gCO()},
-$isEH:true},
-e52:{
-"^":"Tp:13;",
-$1:function(a){return J.eU(a)},
-$isEH:true},
-e53:{
-"^":"Tp:13;",
-$1:function(a){return J.DB(a)},
-$isEH:true},
-e54:{
-"^":"Tp:13;",
-$1:function(a){return J.wO(a)},
-$isEH:true},
-e55:{
-"^":"Tp:13;",
-$1:function(a){return a.gGf()},
-$isEH:true},
-e56:{
-"^":"Tp:13;",
-$1:function(a){return a.gUa()},
-$isEH:true},
-e57:{
-"^":"Tp:13;",
-$1:function(a){return a.gMp()},
-$isEH:true},
-e58:{
-"^":"Tp:13;",
-$1:function(a){return J.u1(a)},
-$isEH:true},
-e59:{
-"^":"Tp:13;",
-$1:function(a){return J.z3(a)},
-$isEH:true},
-e60:{
-"^":"Tp:13;",
-$1:function(a){return J.YQ(a)},
-$isEH:true},
-e61:{
-"^":"Tp:13;",
-$1:function(a){return a.gu9()},
-$isEH:true},
-e62:{
-"^":"Tp:13;",
-$1:function(a){return J.fA(a)},
-$isEH:true},
-e63:{
-"^":"Tp:13;",
-$1:function(a){return J.cd(a)},
-$isEH:true},
-e64:{
-"^":"Tp:13;",
-$1:function(a){return a.gL4()},
-$isEH:true},
-e65:{
-"^":"Tp:13;",
-$1:function(a){return a.gaj()},
-$isEH:true},
-e66:{
-"^":"Tp:13;",
-$1:function(a){return a.giq()},
-$isEH:true},
-e67:{
-"^":"Tp:13;",
-$1:function(a){return a.gBm()},
-$isEH:true},
-e68:{
-"^":"Tp:13;",
-$1:function(a){return J.xR(a)},
-$isEH:true},
-e69:{
-"^":"Tp:13;",
-$1:function(a){return a.gWt()},
-$isEH:true},
-e70:{
-"^":"Tp:13;",
-$1:function(a){return a.gNI()},
-$isEH:true},
-e71:{
-"^":"Tp:13;",
-$1:function(a){return a.gva()},
-$isEH:true},
-e72:{
-"^":"Tp:13;",
-$1:function(a){return a.gKt()},
-$isEH:true},
-e73:{
-"^":"Tp:13;",
-$1:function(a){return a.gp2()},
-$isEH:true},
-e74:{
-"^":"Tp:13;",
-$1:function(a){return J.UU(a)},
-$isEH:true},
-e75:{
-"^":"Tp:13;",
-$1:function(a){return J.Ew(a)},
-$isEH:true},
-e76:{
-"^":"Tp:13;",
-$1:function(a){return a.gVM()},
-$isEH:true},
-e77:{
-"^":"Tp:13;",
-$1:function(a){return J.Ja(a)},
-$isEH:true},
-e78:{
-"^":"Tp:13;",
-$1:function(a){return a.gUB()},
-$isEH:true},
-e79:{
-"^":"Tp:13;",
-$1:function(a){return J.pd(a)},
-$isEH:true},
-e80:{
-"^":"Tp:13;",
-$1:function(a){return a.gkU()},
-$isEH:true},
-e81:{
-"^":"Tp:13;",
-$1:function(a){return J.wz(a)},
-$isEH:true},
-e82:{
-"^":"Tp:13;",
-$1:function(a){return J.FN(a)},
-$isEH:true},
-e83:{
-"^":"Tp:13;",
-$1:function(a){return J.ls(a)},
-$isEH:true},
-e84:{
-"^":"Tp:13;",
-$1:function(a){return J.yq(a)},
-$isEH:true},
-e85:{
-"^":"Tp:13;",
-$1:function(a){return J.SZ(a)},
-$isEH:true},
-e86:{
-"^":"Tp:13;",
-$1:function(a){return J.DL(a)},
-$isEH:true},
-e87:{
-"^":"Tp:13;",
-$1:function(a){return J.yx(a)},
-$isEH:true},
-e88:{
-"^":"Tp:13;",
-$1:function(a){return J.cU(a)},
-$isEH:true},
-e89:{
-"^":"Tp:13;",
-$1:function(a){return a.gYG()},
-$isEH:true},
-e90:{
-"^":"Tp:13;",
-$1:function(a){return a.gi2()},
-$isEH:true},
-e91:{
-"^":"Tp:13;",
-$1:function(a){return a.gHY()},
-$isEH:true},
-e92:{
-"^":"Tp:13;",
-$1:function(a){return J.UM(a)},
-$isEH:true},
-e93:{
-"^":"Tp:13;",
-$1:function(a){return J.ZN(a)},
-$isEH:true},
-e94:{
-"^":"Tp:13;",
-$1:function(a){return J.xa(a)},
-$isEH:true},
-e95:{
-"^":"Tp:13;",
-$1:function(a){return J.aT(a)},
-$isEH:true},
-e96:{
-"^":"Tp:13;",
-$1:function(a){return J.hb(a)},
-$isEH:true},
-e97:{
-"^":"Tp:13;",
-$1:function(a){return a.giR()},
-$isEH:true},
-e98:{
-"^":"Tp:13;",
-$1:function(a){return a.gEB()},
-$isEH:true},
-e99:{
-"^":"Tp:13;",
-$1:function(a){return J.Iz(a)},
-$isEH:true},
-e100:{
-"^":"Tp:13;",
-$1:function(a){return J.Q4(a)},
-$isEH:true},
-e101:{
-"^":"Tp:13;",
-$1:function(a){return J.MQ(a)},
-$isEH:true},
-e102:{
-"^":"Tp:13;",
-$1:function(a){return J.tx(a)},
-$isEH:true},
-e103:{
-"^":"Tp:13;",
-$1:function(a){return J.IR(a)},
-$isEH:true},
-e104:{
-"^":"Tp:13;",
-$1:function(a){return a.gSK()},
-$isEH:true},
-e105:{
-"^":"Tp:13;",
-$1:function(a){return a.gPE()},
-$isEH:true},
-e106:{
-"^":"Tp:13;",
-$1:function(a){return J.q8(a)},
-$isEH:true},
-e107:{
-"^":"Tp:13;",
-$1:function(a){return a.ghX()},
-$isEH:true},
-e108:{
-"^":"Tp:13;",
-$1:function(a){return a.gvU()},
-$isEH:true},
-e109:{
-"^":"Tp:13;",
-$1:function(a){return J.jl(a)},
-$isEH:true},
-e110:{
-"^":"Tp:13;",
-$1:function(a){return a.gRd()},
-$isEH:true},
-e111:{
-"^":"Tp:13;",
-$1:function(a){return J.zY(a)},
-$isEH:true},
-e112:{
-"^":"Tp:13;",
-$1:function(a){return J.Fd(a)},
-$isEH:true},
-e113:{
-"^":"Tp:13;",
-$1:function(a){return J.oZ(a)},
-$isEH:true},
-e114:{
-"^":"Tp:13;",
-$1:function(a){return J.de(a)},
-$isEH:true},
-e115:{
-"^":"Tp:13;",
-$1:function(a){return J.Ds(a)},
-$isEH:true},
-e116:{
-"^":"Tp:13;",
-$1:function(a){return J.cO(a)},
-$isEH:true},
-e117:{
-"^":"Tp:13;",
-$1:function(a){return a.gzM()},
-$isEH:true},
-e118:{
-"^":"Tp:13;",
-$1:function(a){return a.gjz()},
-$isEH:true},
-e119:{
-"^":"Tp:13;",
-$1:function(a){return a.giP()},
-$isEH:true},
-e120:{
-"^":"Tp:13;",
-$1:function(a){return a.gLw()},
-$isEH:true},
-e121:{
-"^":"Tp:13;",
-$1:function(a){return a.geH()},
-$isEH:true},
-e122:{
-"^":"Tp:13;",
-$1:function(a){return J.Yf(a)},
-$isEH:true},
-e123:{
-"^":"Tp:13;",
-$1:function(a){return J.kv(a)},
-$isEH:true},
-e124:{
-"^":"Tp:13;",
-$1:function(a){return J.ih(a)},
-$isEH:true},
-e125:{
-"^":"Tp:13;",
-$1:function(a){return J.z2(a)},
-$isEH:true},
-e126:{
-"^":"Tp:13;",
-$1:function(a){return J.ZL(a)},
-$isEH:true},
-e127:{
-"^":"Tp:13;",
-$1:function(a){return J.ba(a)},
-$isEH:true},
-e128:{
-"^":"Tp:13;",
-$1:function(a){return J.Zv(a)},
-$isEH:true},
-e129:{
-"^":"Tp:13;",
-$1:function(a){return J.O6(a)},
-$isEH:true},
-e130:{
-"^":"Tp:13;",
-$1:function(a){return J.HO(a)},
-$isEH:true},
-e131:{
-"^":"Tp:13;",
-$1:function(a){return a.gUY()},
-$isEH:true},
-e132:{
-"^":"Tp:13;",
-$1:function(a){return J.Jj(a)},
-$isEH:true},
-e133:{
-"^":"Tp:13;",
-$1:function(a){return J.t8(a)},
-$isEH:true},
-e134:{
-"^":"Tp:13;",
-$1:function(a){return a.gL1()},
-$isEH:true},
-e135:{
-"^":"Tp:13;",
-$1:function(a){return a.gxQ()},
-$isEH:true},
-e136:{
-"^":"Tp:13;",
-$1:function(a){return J.EC(a)},
-$isEH:true},
-e137:{
-"^":"Tp:13;",
-$1:function(a){return J.JG(a)},
-$isEH:true},
-e138:{
-"^":"Tp:13;",
-$1:function(a){return J.AF(a)},
-$isEH:true},
-e139:{
-"^":"Tp:13;",
-$1:function(a){return J.LB(a)},
-$isEH:true},
-e140:{
-"^":"Tp:13;",
-$1:function(a){return J.Kl(a)},
-$isEH:true},
-e141:{
-"^":"Tp:13;",
-$1:function(a){return a.gU6()},
-$isEH:true},
-e142:{
-"^":"Tp:13;",
-$1:function(a){return J.io(a)},
-$isEH:true},
-e143:{
-"^":"Tp:13;",
-$1:function(a){return J.fy(a)},
-$isEH:true},
-e144:{
-"^":"Tp:13;",
-$1:function(a){return J.Qa(a)},
-$isEH:true},
-e145:{
-"^":"Tp:13;",
-$1:function(a){return J.ks(a)},
-$isEH:true},
-e146:{
-"^":"Tp:13;",
-$1:function(a){return J.CN(a)},
-$isEH:true},
-e147:{
-"^":"Tp:13;",
-$1:function(a){return J.WM(a)},
-$isEH:true},
-e148:{
-"^":"Tp:13;",
-$1:function(a){return J.ul(a)},
-$isEH:true},
-e149:{
-"^":"Tp:13;",
-$1:function(a){return J.Sz(a)},
-$isEH:true},
-e150:{
-"^":"Tp:13;",
-$1:function(a){return a.gm8()},
-$isEH:true},
-e151:{
-"^":"Tp:13;",
-$1:function(a){return J.BZ(a)},
-$isEH:true},
-e152:{
-"^":"Tp:13;",
-$1:function(a){return J.Dd(a)},
-$isEH:true},
-e153:{
-"^":"Tp:13;",
-$1:function(a){return J.Cm(a)},
-$isEH:true},
-e154:{
-"^":"Tp:13;",
-$1:function(a){return J.fU(a)},
-$isEH:true},
-e155:{
-"^":"Tp:13;",
-$1:function(a){return J.GH(a)},
-$isEH:true},
-e156:{
-"^":"Tp:13;",
-$1:function(a){return J.QX(a)},
-$isEH:true},
-e157:{
-"^":"Tp:13;",
-$1:function(a){return a.gLc()},
-$isEH:true},
-e158:{
-"^":"Tp:13;",
-$1:function(a){return a.gNS()},
-$isEH:true},
-e159:{
-"^":"Tp:13;",
-$1:function(a){return a.guh()},
-$isEH:true},
-e160:{
-"^":"Tp:13;",
-$1:function(a){return J.iL(a)},
-$isEH:true},
-e161:{
-"^":"Tp:13;",
-$1:function(a){return J.k7(a)},
-$isEH:true},
-e162:{
-"^":"Tp:13;",
-$1:function(a){return J.uW(a)},
-$isEH:true},
-e163:{
-"^":"Tp:13;",
-$1:function(a){return J.W2(a)},
-$isEH:true},
-e164:{
-"^":"Tp:13;",
-$1:function(a){return J.UT(a)},
-$isEH:true},
-e165:{
-"^":"Tp:13;",
-$1:function(a){return J.Kd(a)},
-$isEH:true},
-e166:{
-"^":"Tp:13;",
-$1:function(a){return J.pU(a)},
-$isEH:true},
-e167:{
-"^":"Tp:13;",
-$1:function(a){return J.jo(a)},
-$isEH:true},
-e168:{
-"^":"Tp:13;",
-$1:function(a){return a.gVc()},
-$isEH:true},
-e169:{
-"^":"Tp:13;",
-$1:function(a){return a.gpF()},
-$isEH:true},
-e170:{
-"^":"Tp:13;",
-$1:function(a){return J.TY(a)},
-$isEH:true},
-e171:{
-"^":"Tp:13;",
-$1:function(a){return a.gA6()},
-$isEH:true},
-e172:{
-"^":"Tp:13;",
-$1:function(a){return J.Ry(a)},
-$isEH:true},
-e173:{
-"^":"Tp:13;",
-$1:function(a){return J.UP(a)},
-$isEH:true},
-e174:{
-"^":"Tp:13;",
-$1:function(a){return J.fw(a)},
-$isEH:true},
-e175:{
-"^":"Tp:13;",
-$1:function(a){return J.zH(a)},
-$isEH:true},
-e176:{
-"^":"Tp:13;",
-$1:function(a){return J.Vi(a)},
-$isEH:true},
-e177:{
-"^":"Tp:13;",
-$1:function(a){return a.gXR()},
-$isEH:true},
-e178:{
-"^":"Tp:13;",
-$1:function(a){return J.P5(a)},
-$isEH:true},
-e179:{
-"^":"Tp:13;",
-$1:function(a){return a.gzS()},
-$isEH:true},
-e180:{
-"^":"Tp:13;",
-$1:function(a){return J.U8(a)},
-$isEH:true},
-e181:{
-"^":"Tp:13;",
-$1:function(a){return J.oN(a)},
-$isEH:true},
-e182:{
-"^":"Tp:13;",
-$1:function(a){return a.gV8()},
-$isEH:true},
-e183:{
-"^":"Tp:13;",
-$1:function(a){return J.HB(a)},
-$isEH:true},
-e184:{
-"^":"Tp:13;",
-$1:function(a){return J.jB(a)},
-$isEH:true},
-e185:{
-"^":"Tp:13;",
-$1:function(a){return J.J0(a)},
-$isEH:true},
-e186:{
-"^":"Tp:13;",
-$1:function(a){return a.gS5()},
-$isEH:true},
-e187:{
-"^":"Tp:13;",
-$1:function(a){return a.gDo()},
-$isEH:true},
-e188:{
-"^":"Tp:13;",
-$1:function(a){return a.guj()},
-$isEH:true},
-e189:{
-"^":"Tp:13;",
-$1:function(a){return J.j1(a)},
-$isEH:true},
-e190:{
-"^":"Tp:13;",
-$1:function(a){return J.Aw(a)},
-$isEH:true},
-e191:{
-"^":"Tp:13;",
-$1:function(a){return J.dY(a)},
-$isEH:true},
-e192:{
-"^":"Tp:13;",
-$1:function(a){return J.OL(a)},
-$isEH:true},
-e193:{
-"^":"Tp:13;",
-$1:function(a){return a.gki()},
-$isEH:true},
-e194:{
-"^":"Tp:13;",
-$1:function(a){return a.gZn()},
-$isEH:true},
-e195:{
-"^":"Tp:13;",
-$1:function(a){return a.gvs()},
-$isEH:true},
-e196:{
-"^":"Tp:13;",
-$1:function(a){return a.gVh()},
-$isEH:true},
-e197:{
-"^":"Tp:13;",
-$1:function(a){return a.gZX()},
-$isEH:true},
-e198:{
-"^":"Tp:13;",
-$1:function(a){return J.SG(a)},
-$isEH:true},
-e199:{
-"^":"Tp:13;",
-$1:function(a){return J.L7(a)},
-$isEH:true},
-e200:{
-"^":"Tp:13;",
-$1:function(a){return a.gVF()},
-$isEH:true},
-e201:{
-"^":"Tp:13;",
-$1:function(a){return a.gkw()},
-$isEH:true},
-e202:{
-"^":"Tp:13;",
-$1:function(a){return J.K2(a)},
-$isEH:true},
-e203:{
-"^":"Tp:13;",
-$1:function(a){return J.uy(a)},
-$isEH:true},
-e204:{
-"^":"Tp:13;",
-$1:function(a){return a.gEy()},
-$isEH:true},
-e205:{
-"^":"Tp:13;",
-$1:function(a){return J.XJ(a)},
-$isEH:true},
-e206:{
-"^":"Tp:13;",
-$1:function(a){return J.Sl(a)},
-$isEH:true},
-e207:{
-"^":"Tp:13;",
-$1:function(a){return a.gJk()},
-$isEH:true},
-e208:{
-"^":"Tp:13;",
-$1:function(a){return J.Nl(a)},
-$isEH:true},
-e209:{
-"^":"Tp:13;",
-$1:function(a){return a.gSU()},
-$isEH:true},
-e210:{
-"^":"Tp:13;",
-$1:function(a){return a.gFc()},
-$isEH:true},
-e211:{
-"^":"Tp:13;",
-$1:function(a){return a.gYY()},
-$isEH:true},
-e212:{
-"^":"Tp:13;",
-$1:function(a){return a.gZ3()},
-$isEH:true},
-e213:{
-"^":"Tp:13;",
-$1:function(a){return J.ry(a)},
-$isEH:true},
-e214:{
-"^":"Tp:13;",
-$1:function(a){return J.I2(a)},
-$isEH:true},
-e215:{
-"^":"Tp:13;",
-$1:function(a){return a.gdN()},
-$isEH:true},
-e216:{
-"^":"Tp:13;",
-$1:function(a){return J.tp(a)},
-$isEH:true},
-e217:{
-"^":"Tp:13;",
-$1:function(a){return a.gaU()},
-$isEH:true},
-e218:{
-"^":"Tp:77;",
-$2:function(a,b){J.RX(a,b)},
-$isEH:true},
-e219:{
-"^":"Tp:77;",
-$2:function(a,b){J.a8(a,b)},
-$isEH:true},
-e220:{
-"^":"Tp:77;",
-$2:function(a,b){J.l7(a,b)},
-$isEH:true},
-e221:{
-"^":"Tp:77;",
-$2:function(a,b){J.kB(a,b)},
-$isEH:true},
-e222:{
-"^":"Tp:77;",
-$2:function(a,b){J.Ae(a,b)},
-$isEH:true},
-e223:{
-"^":"Tp:77;",
-$2:function(a,b){J.IX(a,b)},
-$isEH:true},
-e224:{
-"^":"Tp:77;",
-$2:function(a,b){J.WI(a,b)},
-$isEH:true},
-e225:{
-"^":"Tp:77;",
-$2:function(a,b){J.NZ(a,b)},
-$isEH:true},
-e226:{
-"^":"Tp:77;",
-$2:function(a,b){J.T5(a,b)},
-$isEH:true},
-e227:{
-"^":"Tp:77;",
-$2:function(a,b){J.i0(a,b)},
-$isEH:true},
-e228:{
-"^":"Tp:77;",
-$2:function(a,b){J.Sf(a,b)},
-$isEH:true},
-e229:{
-"^":"Tp:77;",
-$2:function(a,b){J.LM(a,b)},
-$isEH:true},
-e230:{
-"^":"Tp:77;",
-$2:function(a,b){J.qq(a,b)},
-$isEH:true},
-e231:{
-"^":"Tp:77;",
-$2:function(a,b){J.Ac(a,b)},
-$isEH:true},
-e232:{
-"^":"Tp:77;",
-$2:function(a,b){J.Yz(a,b)},
-$isEH:true},
-e233:{
-"^":"Tp:77;",
-$2:function(a,b){a.sw2(b)},
-$isEH:true},
-e234:{
-"^":"Tp:77;",
-$2:function(a,b){J.Qr(a,b)},
-$isEH:true},
-e235:{
-"^":"Tp:77;",
-$2:function(a,b){J.xW(a,b)},
-$isEH:true},
-e236:{
-"^":"Tp:77;",
-$2:function(a,b){J.BC(a,b)},
-$isEH:true},
-e237:{
-"^":"Tp:77;",
-$2:function(a,b){J.pB(a,b)},
-$isEH:true},
-e238:{
-"^":"Tp:77;",
-$2:function(a,b){J.NO(a,b)},
-$isEH:true},
-e239:{
-"^":"Tp:77;",
-$2:function(a,b){J.WB(a,b)},
-$isEH:true},
-e240:{
-"^":"Tp:77;",
-$2:function(a,b){J.JZ(a,b)},
-$isEH:true},
-e241:{
-"^":"Tp:77;",
-$2:function(a,b){J.fR(a,b)},
-$isEH:true},
-e242:{
-"^":"Tp:77;",
-$2:function(a,b){a.shY(b)},
-$isEH:true},
-e243:{
-"^":"Tp:77;",
-$2:function(a,b){J.uP(a,b)},
-$isEH:true},
-e244:{
-"^":"Tp:77;",
-$2:function(a,b){J.vJ(a,b)},
-$isEH:true},
-e245:{
-"^":"Tp:77;",
-$2:function(a,b){J.Nf(a,b)},
-$isEH:true},
-e246:{
-"^":"Tp:77;",
-$2:function(a,b){J.Pl(a,b)},
-$isEH:true},
-e247:{
-"^":"Tp:77;",
-$2:function(a,b){J.C3(a,b)},
-$isEH:true},
-e248:{
-"^":"Tp:77;",
-$2:function(a,b){J.xH(a,b)},
-$isEH:true},
-e249:{
-"^":"Tp:77;",
-$2:function(a,b){J.Nh(a,b)},
-$isEH:true},
-e250:{
-"^":"Tp:77;",
-$2:function(a,b){J.AI(a,b)},
-$isEH:true},
-e251:{
-"^":"Tp:77;",
-$2:function(a,b){J.nA(a,b)},
-$isEH:true},
-e252:{
-"^":"Tp:77;",
-$2:function(a,b){J.fb(a,b)},
-$isEH:true},
-e253:{
-"^":"Tp:77;",
-$2:function(a,b){a.siq(b)},
-$isEH:true},
-e254:{
-"^":"Tp:77;",
-$2:function(a,b){J.Qy(a,b)},
-$isEH:true},
-e255:{
-"^":"Tp:77;",
-$2:function(a,b){a.sKt(b)},
-$isEH:true},
-e256:{
-"^":"Tp:77;",
-$2:function(a,b){J.cV(a,b)},
-$isEH:true},
-e257:{
-"^":"Tp:77;",
-$2:function(a,b){J.mU(a,b)},
-$isEH:true},
-e258:{
-"^":"Tp:77;",
-$2:function(a,b){J.Kz(a,b)},
-$isEH:true},
-e259:{
-"^":"Tp:77;",
-$2:function(a,b){J.uM(a,b)},
-$isEH:true},
-e260:{
-"^":"Tp:77;",
-$2:function(a,b){J.Er(a,b)},
-$isEH:true},
-e261:{
-"^":"Tp:77;",
-$2:function(a,b){J.uX(a,b)},
-$isEH:true},
-e262:{
-"^":"Tp:77;",
-$2:function(a,b){J.hS(a,b)},
-$isEH:true},
-e263:{
-"^":"Tp:77;",
-$2:function(a,b){J.mz(a,b)},
-$isEH:true},
-e264:{
-"^":"Tp:77;",
-$2:function(a,b){J.pA(a,b)},
-$isEH:true},
-e265:{
-"^":"Tp:77;",
-$2:function(a,b){a.sSK(b)},
-$isEH:true},
-e266:{
-"^":"Tp:77;",
-$2:function(a,b){a.shX(b)},
-$isEH:true},
-e267:{
-"^":"Tp:77;",
-$2:function(a,b){J.cl(a,b)},
-$isEH:true},
-e268:{
-"^":"Tp:77;",
-$2:function(a,b){J.Jb(a,b)},
-$isEH:true},
-e269:{
-"^":"Tp:77;",
-$2:function(a,b){J.xQ(a,b)},
-$isEH:true},
-e270:{
-"^":"Tp:77;",
-$2:function(a,b){J.MX(a,b)},
-$isEH:true},
-e271:{
-"^":"Tp:77;",
-$2:function(a,b){J.A4(a,b)},
-$isEH:true},
-e272:{
-"^":"Tp:77;",
-$2:function(a,b){J.wD(a,b)},
-$isEH:true},
-e273:{
-"^":"Tp:77;",
-$2:function(a,b){J.wJ(a,b)},
-$isEH:true},
-e274:{
-"^":"Tp:77;",
-$2:function(a,b){J.oJ(a,b)},
-$isEH:true},
-e275:{
-"^":"Tp:77;",
-$2:function(a,b){J.DF(a,b)},
-$isEH:true},
-e276:{
-"^":"Tp:77;",
-$2:function(a,b){J.h9(a,b)},
-$isEH:true},
-e277:{
-"^":"Tp:77;",
-$2:function(a,b){a.sL1(b)},
-$isEH:true},
-e278:{
-"^":"Tp:77;",
-$2:function(a,b){J.XF(a,b)},
-$isEH:true},
-e279:{
-"^":"Tp:77;",
-$2:function(a,b){J.SF(a,b)},
-$isEH:true},
-e280:{
-"^":"Tp:77;",
-$2:function(a,b){J.Qv(a,b)},
-$isEH:true},
-e281:{
-"^":"Tp:77;",
-$2:function(a,b){J.Xg(a,b)},
-$isEH:true},
-e282:{
-"^":"Tp:77;",
-$2:function(a,b){J.aw(a,b)},
-$isEH:true},
-e283:{
-"^":"Tp:77;",
-$2:function(a,b){J.CJ(a,b)},
-$isEH:true},
-e284:{
-"^":"Tp:77;",
-$2:function(a,b){J.P2(a,b)},
-$isEH:true},
-e285:{
-"^":"Tp:77;",
-$2:function(a,b){J.fv(a,b)},
-$isEH:true},
-e286:{
-"^":"Tp:77;",
-$2:function(a,b){J.PP(a,b)},
-$isEH:true},
-e287:{
-"^":"Tp:77;",
-$2:function(a,b){J.Sj(a,b)},
-$isEH:true},
-e288:{
-"^":"Tp:77;",
-$2:function(a,b){J.tv(a,b)},
-$isEH:true},
-e289:{
-"^":"Tp:77;",
-$2:function(a,b){J.w7(a,b)},
-$isEH:true},
-e290:{
-"^":"Tp:77;",
-$2:function(a,b){J.ME(a,b)},
-$isEH:true},
-e291:{
-"^":"Tp:77;",
-$2:function(a,b){J.kX(a,b)},
-$isEH:true},
-e292:{
-"^":"Tp:77;",
-$2:function(a,b){J.q0(a,b)},
-$isEH:true},
-e293:{
-"^":"Tp:77;",
-$2:function(a,b){J.EJ(a,b)},
-$isEH:true},
-e294:{
-"^":"Tp:77;",
-$2:function(a,b){J.iH(a,b)},
-$isEH:true},
-e295:{
-"^":"Tp:77;",
-$2:function(a,b){J.SO(a,b)},
-$isEH:true},
-e296:{
-"^":"Tp:77;",
-$2:function(a,b){J.B9(a,b)},
-$isEH:true},
-e297:{
-"^":"Tp:77;",
-$2:function(a,b){J.PN(a,b)},
-$isEH:true},
-e298:{
-"^":"Tp:77;",
-$2:function(a,b){a.sVc(b)},
-$isEH:true},
-e299:{
-"^":"Tp:77;",
-$2:function(a,b){J.By(a,b)},
-$isEH:true},
-e300:{
-"^":"Tp:77;",
-$2:function(a,b){J.jd(a,b)},
-$isEH:true},
-e301:{
-"^":"Tp:77;",
-$2:function(a,b){J.Rx(a,b)},
-$isEH:true},
-e302:{
-"^":"Tp:77;",
-$2:function(a,b){J.ZI(a,b)},
-$isEH:true},
-e303:{
-"^":"Tp:77;",
-$2:function(a,b){J.fa(a,b)},
-$isEH:true},
-e304:{
-"^":"Tp:77;",
-$2:function(a,b){J.Cu(a,b)},
-$isEH:true},
-e305:{
-"^":"Tp:77;",
-$2:function(a,b){a.sV8(b)},
-$isEH:true},
-e306:{
-"^":"Tp:77;",
-$2:function(a,b){J.Hn(a,b)},
-$isEH:true},
-e307:{
-"^":"Tp:77;",
-$2:function(a,b){J.Tx(a,b)},
-$isEH:true},
-e308:{
-"^":"Tp:77;",
-$2:function(a,b){a.sDo(b)},
-$isEH:true},
-e309:{
-"^":"Tp:77;",
-$2:function(a,b){a.suj(b)},
-$isEH:true},
-e310:{
-"^":"Tp:77;",
-$2:function(a,b){J.H3(a,b)},
-$isEH:true},
-e311:{
-"^":"Tp:77;",
-$2:function(a,b){J.t3(a,b)},
-$isEH:true},
-e312:{
-"^":"Tp:77;",
-$2:function(a,b){J.my(a,b)},
-$isEH:true},
-e313:{
-"^":"Tp:77;",
-$2:function(a,b){a.sVF(b)},
-$isEH:true},
-e314:{
-"^":"Tp:77;",
-$2:function(a,b){J.yO(a,b)},
-$isEH:true},
-e315:{
-"^":"Tp:77;",
-$2:function(a,b){J.ZU(a,b)},
-$isEH:true},
-e316:{
-"^":"Tp:77;",
-$2:function(a,b){J.tQ(a,b)},
-$isEH:true},
-e317:{
-"^":"Tp:77;",
-$2:function(a,b){J.tH(a,b)},
-$isEH:true},
-e318:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e319:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e320:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e321:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e322:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e323:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e324:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e325:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e326:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e327:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e328:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e329:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e330:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e331:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e332:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e333:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e334:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e335:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e336:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e337:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e338:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e339:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e340:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e341:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e342:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e343:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e344:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e345:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e346:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e347:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("flag-list",C.BL)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e348:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e349:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e350:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e351:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e352:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e353:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e354:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e355:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e356:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e357:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e358:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e359:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e360:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e361:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e362:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e363:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e364:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e365:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e366:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e367:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e368:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-process-list-view",C.Ep)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e369:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e370:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e371:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e372:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e373:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e374:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e375:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e376:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e377:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e378:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e379:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e380:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e381:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e382:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e383:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e384:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e385:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e386:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e387:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e388:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e389:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e390:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e391:{
-"^":"Tp:69;",
-$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,{
-"^":"",
-G6:{
-"^":"Vc;BW,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.BW).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Dw:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.C8.ZL(a)
-C.C8.XI(a)
-return a}}},
-Vc:{
-"^":"uL+Pi;",
-$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
-"^":"",
-eW:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{rt:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.YZz.ZL(a)
-C.YZz.XI(a)
-return a}}}}],["class_tree_element","package:observatory/src/elements/class_tree.dart",,O,{
-"^":"",
-CZ:{
-"^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
-C4:function(a){var z,y,x,w,v,u,t
-z=this.ks
-if(z.length>0)return
-for(y=J.mY(J.Mx(this.Ru)),x=this.od,w=this.yt+1;y.G();){v=y.gl()
-if(v.gi2()===!0)continue
-u=[]
-u.$builtinTypeInfo=[G.Y2]
-t=new O.CZ(x,v,this,w,u,[],"\u2192","cursor: pointer;",!1,null,null)
-if(!t.Nh()){u=t.aZ
-if(t.gnz(t)&&!J.xC(u,"visibility:hidden;")){u=new T.qI(t,C.Pn,u,"visibility:hidden;")
-u.$builtinTypeInfo=[null]
-t.nq(t,u)}t.aZ="visibility:hidden;"}z.push(t)}},
-cO:function(){},
-Nh:function(){return J.q8(J.Mx(this.Ru))>0}},
-eo:{
-"^":"Vfx;CA,Hm=,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-god:function(a){return a.CA},
-sod:function(a,b){a.CA=this.ct(a,C.rB,a.CA,b)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=R.tB([])
-a.Hm=new G.XN(z,null,null)
-z=a.CA
-if(z!=null)this.hP(a,z.gDZ())},
-vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","gQ1",2,0,13,57],
-hP:function(a,b){var z,y,x,w,v,u,t,s,r,q
-try{w=a.CA
-v=H.VM([],[G.Y2])
-u=new O.CZ(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
-u.k7(null)
-z=u
-w=J.Mx(z)
-v=a.CA
-t=z
-s=H.VM([],[G.Y2])
-r=t!=null?t.gyt()+1:0
-s=new O.CZ(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
-s.k7(t)
-w.push(s)
-a.Hm.rT(z)}catch(q){w=H.Ru(q)
-y=w
-x=new H.XO(q,null)
-N.QM("").xH("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),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,91,92],
-Vj:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,91,92],
-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()
-w.qU(v-1)}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,93,1,94,95],
-static:{l0:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.RD.ZL(a)
-C.RD.XI(a)
-return a}}},
-Vfx:{
-"^":"uL+Pi;",
-$isd3:true},
-nc:{
-"^":"Tp:13;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
-"^":"",
-aC:{
-"^":"Dsd;yB,mN,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gRu:function(a){return a.yB},
-sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
-gCF:function(a){return a.mN},
-sCF:function(a,b){a.mN=this.ct(a,C.tg,a.mN,b)},
-vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,97,98],
-S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,99,100],
-RF:[function(a,b){J.r0(a.yB).Qy(b)},"$1","gvC",2,0,20,90],
-static:{lW:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ka.ZL(a)
-C.ka.XI(a)
-return a}}},
-Dsd:{
-"^":"uL+Pi;",
-$isd3:true},
-SS:{
-"^":"Tp:101;a",
-$1:[function(a){var z,y
-z=this.a
-y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,82,"call"],
-$isEH:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
-"^":"",
-VY:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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,13,57],
-static:{On:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.IK.ZL(a)
-C.IK.XI(a)
-return a}}}}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
-"^":"",
-Be:{
-"^":"tuj;Xx,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gtT:function(a){return a.Xx},
-stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=a.Xx
-if(z==null)return
-J.SK(z).ml(new F.Bc())},
-RF:[function(a,b){J.r0(a.Xx).Qy(b)},"$1","gvC",2,0,20,90],
-m2:function(a,b){var z,y,x
-z=J.Vs(b).MW.getAttribute("data-jump-target")
-if(z==="")return
-y=H.BU(z,null,null)
-x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
-if(x==null)return
-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,102,1,94,95],
-Lk:[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,102,1,94,95],
-static:{f9:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ux.ZL(a)
-C.ux.XI(a)
-return a}}},
-tuj:{
-"^":"uL+Pi;",
-$isd3:true},
-Bc:{
-"^":"Tp:103;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,81,"call"],
-$isEH:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
-"^":"",
-JI:{
-"^":"Xfs;GV,uo,nx,oM,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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},
-sv8:function(a,b){a.uo=this.ct(a,C.S4,a.uo,b)},
-gFR:function(a){return a.nx},
-Ki:function(a){return this.gFR(a).$0()},
-AV:function(a,b,c){return this.gFR(a).$2(b,c)},
-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,20,57],
-WM:[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,18],
-ko:[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,80,46,47,81],
-static:{U9:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.GV=!1
-a.uo=!1
-a.nx=null
-a.oM=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.O0.ZL(a)
-C.O0.XI(a)
-return a}}},
-Xfs:{
-"^":"xc+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
-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},
-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.bI(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.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
-if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-z=J.x(c)
-if(!z.$isyN)c=z.tt(c,!1)
-z=J.U6(c)
-y=z.gB(c)
-x=a.length
-if(typeof y!=="number")return H.s(y)
-C.Nm.sB(a,x+y)
-x=a.length
-if(!!a.immutable$list)H.vh(P.f("set range"))
-H.qG(a,b+y,x,a,b)
-for(z=z.gA(c);z.G();b=w){w=b+1
-C.Nm.u(a,b,z.gl())}},
-vf: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")},
-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.bI(z.g(b,e),1),x=J.bI(J.ew(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.bI(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)
-if(J.xC(a[z],b))return z}return-1},
-lO:function(a,b,c){var z,y
-if(typeof c!=="number")return c.C()
-if(c<0)return-1
-z=a.length
-if(c>=z)c=z-1
-for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.xC(a[y],b))return y}return-1},
-ZE:function(a,b,c,d){if(c-b<=32)H.w9(a,b,c,d)
-else H.wR(a,b,c,d)},
-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.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)}},
-wR:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
-z=C.jn.cU(c-b+1,6)
-y=b+z
-x=c-z
-w=C.jn.cU(b+c,2)
-v=w-z
-u=w+z
-t=J.U6(a)
-s=t.t(a,y)
-r=t.t(a,v)
-q=t.t(a,w)
-p=t.t(a,u)
-o=t.t(a,x)
-if(J.z8(d.$2(s,r),0)){n=r
-r=s
-s=n}if(J.z8(d.$2(p,o),0)){n=o
-o=p
-p=n}if(J.z8(d.$2(s,q),0)){n=q
-q=s
-s=n}if(J.z8(d.$2(r,q),0)){n=q
-q=r
-r=n}if(J.z8(d.$2(s,p),0)){n=p
-p=s
-s=n}if(J.z8(d.$2(q,p),0)){n=p
-p=q
-q=n}if(J.z8(d.$2(r,o),0)){n=o
-o=r
-r=n}if(J.z8(d.$2(r,q),0)){n=q
-q=r
-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)
-t.u(a,x,o)
-t.u(a,v,t.t(a,b))
-t.u(a,u,t.t(a,c))
-m=b+1
-l=c-1
-if(J.xC(d.$2(r,p),0)){for(k=m;k<=l;++k){j=t.t(a,k)
-i=d.$2(j,r)
-h=J.x(i)
-if(h.n(i,0))continue
-if(h.C(i,0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else for(;!0;){i=d.$2(t.t(a,l),r)
-h=J.Wx(i)
-if(h.D(i,0)){--l
-continue}else{g=l-1
-if(h.C(i,0)){t.u(a,k,t.t(a,m))
-f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
-l=g
-m=f
-break}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
-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.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))
-f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
-l=g
-m=f}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
-l=g}break}}e=!1}h=m-1
-t.u(a,b,t.t(a,h))
-t.u(a,h,r)
-h=l+1
-t.u(a,c,t.t(a,h))
-t.u(a,h,p)
-H.ZE(a,b,m-2,d)
-H.ZE(a,l+2,c,d)
-if(e)return
-if(m<y&&l>x){for(;J.xC(d.$2(t.t(a,m),r),0);)++m
-for(;J.xC(d.$2(t.t(a,l),p),0);)--l
-for(k=m;k<=l;++k){j=t.t(a,k)
-if(J.xC(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.xC(d.$2(j,p),0))for(;!0;)if(J.xC(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))
-f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
-l=g
-m=f}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
-l=g}break}}H.ZE(a,m,l,d)}else H.ZE(a,m,l,d)},
-aL:{
-"^":"mW;",
-gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
-aN:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
-y=0
-for(;y<z;++y){b.$1(this.Zv(0,y))
-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.bI(this.gB(this),1))},
-tg:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
-y=0
-for(;y<z;++y){if(J.xC(this.Zv(0,y),b))return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
-Vr:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
-y=0
-for(;y<z;++y){if(b.$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
-zV:function(a,b){var z,y,x,w,v,u
-z=this.gB(this)
-if(b.length!==0){y=J.x(z)
-if(y.n(z,0))return""
-x=H.d(this.Zv(0,0))
-if(!y.n(z,this.gB(this)))throw H.b(P.a4(this))
-w=P.p9(x)
-if(typeof z!=="number")return H.s(z)
-v=1
-for(;v<z;++v){w.vM+=b
-u=this.Zv(0,v)
-w.vM+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}else{w=P.p9("")
-if(typeof z!=="number")return H.s(z)
-v=0
-for(;v<z;++v){u=this.Zv(0,v)
-w.vM+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
-ad:function(a,b){return P.mW.prototype.ad.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"kY",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},31],
-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)
-if(typeof y!=="number")return H.s(y)
-y=Array(y)
-y.fixed$length=init
-z=H.VM(y,[H.ip(this,"aL",0)])}x=0
-while(!0){y=this.gB(this)
-if(typeof y!=="number")return H.s(y)
-if(!(x<y))break
-y=this.Zv(0,x)
-if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},
-br:function(a){return this.tt(a,!0)},
-$isyN:true},
-bX:{
-"^":"aL;l6,SH,AN",
-gMa:function(){var z,y
-z=J.q8(this.l6)
-y=this.AN
-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.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.bI(z,y)
-return J.bI(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.q9(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.q9(this.l6,y,J.ew(y,b),null)
-else{x=J.ew(y,b)
-if(J.u6(z,x))return this
-return H.q9(this.l6,y,x,null)}},
-Hd:function(a,b,c,d){var z,y,x
-z=this.SH
-y=J.Wx(z)
-if(y.C(z,0))throw H.b(P.N(z))
-x=this.AN
-if(x!=null){if(J.u6(x,0))throw H.b(P.N(x))
-if(y.D(z,x))throw H.b(P.TE(z,0,x))}},
-static:{q9:function(a,b,c,d){var z=H.VM(new H.bX(a,b,c),[d])
-z.Hd(a,b,c,d)
-return z}}},
-a7:{
-"^":"a;l6,SW,G7,lo",
-gl:function(){return this.lo},
-G:function(){var z,y,x,w
-z=this.l6
-y=J.U6(z)
-x=y.gB(z)
-if(!J.xC(this.SW,x))throw H.b(P.a4(z))
-w=this.G7
-if(typeof x!=="number")return H.s(x)
-if(w>=x){this.lo=null
-return!1}this.lo=y.Zv(z,w);++this.G7
-return!0}},
-i1:{
-"^":"mW;l6,T6",
-mb:function(a){return this.T6.$1(a)},
-gA:function(a){var z=new H.MH(null,J.mY(this.l6),this.T6)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-gB:function(a){return J.q8(this.l6)},
-gl0:function(a){return J.FN(this.l6)},
-grZ:function(a){return this.mb(J.MQ(this.l6))},
-$asmW: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:{
-"^":"Dk;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},
-$asDk:function(a,b){return[b]}},
-A8:{
-"^":"aL;CR,T6",
-mb:function(a){return this.T6.$1(a)},
-gB:function(a){return J.q8(this.CR)},
-Zv:function(a,b){return this.mb(J.i9(this.CR,b))},
-$asaL:function(a,b){return[b]},
-$asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
-$isyN:true},
-U5:{
-"^":"mW;l6,T6",
-gA:function(a){var z=new H.Mo(J.mY(this.l6),this.T6)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z}},
-Mo:{
-"^":"Dk;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()}},
-oA:{
-"^":"mW;l6,T6",
-gA:function(a){var z=new H.Wy(J.mY(this.l6),this.T6,C.Gw,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-$asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]}},
-Wy:{
-"^":"a;OI,T6,e0,lo",
-mb:function(a){return this.T6.$1(a)},
-gl:function(){return this.lo},
-G:function(){var z,y
-z=this.e0
-if(z==null)return!1
-for(y=this.OI;!z.G();){this.lo=null
-if(y.G()){this.e0=null
-z=J.mY(this.mb(y.gl()))
-this.e0=z}else return!1}this.lo=this.e0.gl()
-return!0}},
-FuS:{
-"^":"a;",
-G:function(){return!1},
-gl:function(){return}},
-SU7:{
-"^":"a;",
-sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
-h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
-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:{
-"^":"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"))},
-h:function(a,b){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"))},
-GT:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
-Jd:function(a){return this.GT(a,null)},
-V1:function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},
-YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable 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 remove from an unmodifiable list"))},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-w2Y:{
-"^":"ark+Zl;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-iK:{
-"^":"aL;CR",
-gB:function(a){return J.q8(this.CR)},
-Zv:function(a,b){var z,y,x
-z=this.CR
-y=J.U6(z)
-x=y.gB(z)
-if(typeof b!=="number")return H.s(b)
-return y.Zv(z,x-1-b)}},
-IN:{
-"^":"a;fN>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isIN&&J.xC(this.fN,b.fN)},
-giO:function(a){var z=J.v1(this.fN)
-if(typeof z!=="number")return H.s(z)
-return 536870911&664597*z},
-bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
-$isIN:true,
-$isGD:true,
-static:{"^":"RWj,ES1,quP,KGP,eD,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,{
-"^":"",
-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,19],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,19],
-VH:function(a,b){var z=H.G3()
-z=H.KT(z,[z,z]).BD(a)
-if(z)return b.O8(a)
-else return b.wY(a)},
-Iw:function(a,b){var z=P.Dt(b)
-P.rT(C.ny,new P.w4(a,z))
-return z},
-YZ:function(a,b){var z,y,x,w,v
-z={}
-z.a=null
-z.b=null
-z.c=0
-z.d=null
-z.e=null
-y=new P.mQ(z,b)
-for(x=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
-y=z.c
-if(y===0)return P.Ab(C.dn,null)
-w=Array(y)
-w.fixed$length=init
-z.b=w
-y=P.WO
-v=H.VM(new P.Zf(P.Dt(y)),[y])
-z.a=v
-return v.MM},
-Cx:function(){var z=$.S6
-for(;z!=null;){J.cG(z)
-z=z.gaw()
-$.S6=z}$.k8=null},
-BG:[function(){var z
-try{P.Cx()}catch(z){H.Ru(z)
-$.ej().$1(P.qZ())
-$.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,18],
-IA:function(a){var z,y
-z=$.k8
-if(z==null){z=new P.OM(a,null)
-$.k8=z
-$.S6=z
-$.ej().$1(P.qZ())}else{y=new P.OM(a,null)
-z.aw=y
-$.k8=y}},
-rb:function(a){var z
-if(J.xC($.X3,C.NU)){$.X3.wr(a)
-return}z=$.X3
-z.wr(z.xi(a,!0))},
-x2:function(a,b,c,d,e,f){return e?H.VM(new P.Xq(b,c,d,a,null,0,null),[f]):H.VM(new P.Gh(b,c,d,a,null,0,null),[f])},
-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
-z.iE=z}else{z=H.VM(new P.HX(b,a,0,null,null,null,null),[d])
-z.SJ=z
-z.iE=z}return z},
-ot:function(a){var z,y,x,w,v
-if(a==null)return
-try{z=a.$0()
-if(!!J.x(z).$isb8)return z
-return}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-$.X3.hk(y,x)}},
-SN:[function(a){},"$1","Ax",2,0,20,21],
-vF:[function(a,b){$.X3.hk(a,b)},function(a){return P.vF(a,null)},null,"$2","$1","Mm",2,2,22,23,24,25],
-p0:[function(){},"$0","od",0,0,18],
-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.XO(x,null)
-c.$2(z,y)}},
-NX:function(a,b,c,d){var z=a.ed()
-if(!!J.x(z).$isb8)z.Qy(new P.dR(b,c,d))
-else b.K5(c,d)},
-TB:function(a,b){return new P.uR(a,b)},
-Bb:function(a,b,c){var z=a.ed()
-if(!!J.x(z).$isb8)z.Qy(new P.Q0(b,c))
-else b.rX(c)},
-rT: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){a.Gr(new P.FO(d,e))},"$5","wL",10,0,26,27,28,29,24,25],
-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}},"$4","lw",8,0,30,27,28,29,31],
-yv:[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}},"$5","Un",10,0,32,27,28,29,31,33],
-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}},"$6","iy",12,0,34,27,28,29,31,9,10],
-Ee:[function(a,b,c,d){return d},"$4","Qk",8,0,35,27,28,29,31],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,36,27,28,29,31],
-dL:[function(a,b,c,d){return d},"$4","v3",8,0,37,27,28,29,31],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,38],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,39,27,28,29,40,41],
-XB:[function(a,b,c,d){H.qw(d)},"$4","aW",8,0,42],
-CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,43],
-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,44],
-C6:{
-"^":"Tp:69;a",
-$0:[function(){H.cv()
-this.a.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-Ca:{
-"^":"a;kc>,I4<",
-$isXS:true},
-Ik:{
-"^":"O9;Y8"},
-LR:{
-"^":"yU;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,Ri",
-gY8:function(){return this.Y8},
-uR:function(a){var z=this.Ae
-if(typeof z!=="number")return z.i()
-return(z&1)===a},
-Ac:function(){var z=this.Ae
-if(typeof z!=="number")return z.w()
-this.Ae=z^1},
-gP4:function(){var z=this.Ae
-if(typeof z!=="number")return z.i()
-return(z&2)!==0},
-dK:function(){var z=this.Ae
-if(typeof z!=="number")return z.k()
-this.Ae=z|4},
-gHj:function(){var z=this.Ae
-if(typeof z!=="number")return z.i()
-return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
-static:{"^":"E2b,PR,id"}},
-Ks:{
-"^":"a;iE@,SJ@",
-gUF:function(){return!1},
-im:function(){var z=this.yx
-if(z!=null)return z
-z=P.Dt(null)
-this.yx=z
-return z},
-p1:function(a){var z,y
-z=a.gSJ()
-y=a.giE()
-z.siE(y)
-y.sSJ(z)
-a.sSJ(a)
-a.siE(a)},
-ET:function(a){var z,y,x
-if((this.Gv&4)!==0){z=new P.EM($.X3,0,P.od())
-z.$builtinTypeInfo=this.$builtinTypeInfo
-z.yc()
-return z}z=$.X3
-y=a?1:0
-x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
-x.$builtinTypeInfo=this.$builtinTypeInfo
-x.SJ=x
-x.iE=x
-y=this.SJ
-x.SJ=y
-x.iE=this
-y.siE(x)
-this.SJ=x
-x.Ae=this.Gv&1
-if(this.iE===x)P.ot(this.nL)
-return x},
-j0:function(a){if(a.giE()===a)return
-if(a.gP4())a.dK()
-else{this.p1(a)
-if((this.Gv&2)===0&&this.iE===this)this.Of()}},
-mO:function(a){},
-m4:function(a){},
-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.XW(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"Ks")},104],
-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,105,23,24,25],
-S6:function(a){var z,y
-z=this.Gv
-if((z&4)!==0)return this.yx
-if(z>=4)throw H.b(this.q7())
-this.Gv=z|4
-y=this.im()
-this.Pl()
-return y},
-Rg:function(a,b){this.Iv(b)},
-oJ:function(a,b){this.pb(a,b)},
-YB:function(){var z=this.WX
-this.WX=null
-this.Gv&=4294967287
-C.jN.tZ(z)},
-FW:function(a){var z,y,x,w
-z=this.Gv
-if((z&2)!==0)throw H.b(P.w("Cannot fire new event. Controller is already firing an event"))
-y=this.iE
-if(y===this)return
-x=z&1
-this.Gv=z^3
-for(;y!==this;)if(y.uR(x)){z=y.gAe()
-if(typeof z!=="number")return z.k()
-y.sAe(z|2)
-a.$1(y)
-y.Ac()
-w=y.giE()
-if(y.gHj())this.p1(y)
-z=y.gAe()
-if(typeof z!=="number")return z.i()
-y.sAe(z&4294967293)
-y=w}else y=y.giE()
-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.Ym)}},
-zW:{
-"^":"Ks;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
-this.iE.Rg(0,a)
-this.Gv&=4294967293
-if(this.iE===this)this.Of()
-return}this.FW(new P.tK(this,a))},
-pb:function(a,b){if(this.iE===this)return
-this.FW(new P.ORH(this,a,b))},
-Pl:function(){if(this.iE!==this)this.FW(new P.eB(this))
-else this.yx.OH(null)}},
-tK:{
-"^":"Tp;a,b",
-$1:function(a){a.Rg(0,this.b)},
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
-ORH:{
-"^":"Tp;a,b,c",
-$1:function(a){a.oJ(this.b,this.c)},
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
-eB:{
-"^":"Tp;a",
-$1:function(a){a.YB()},
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Mc",args:[[P.LR,a]]}},this.a,"zW")}},
-HX:{
-"^":"Ks;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.w6(y)}},
-pb:function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.WG(a,b,null))},
-Pl:function(){var z=this.iE
-if(z!==this)for(;z!==this;z=z.giE())z.w6(C.ZB)
-else this.yx.OH(null)}},
-b8:{
-"^":"a;",
-$isb8:true},
-w4:{
-"^":"Tp:69;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.XO(x,null)
-this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
-$isEH:true},
-mQ:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){var z,y,x
-z=this.a
-y=z.b
-z.b=null
-x=--z.c
-if(y!=null)if(x===0||this.b)z.a.w0(a,b)
-else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,106,107,"call"],
-$isEH:true},
-Tw:{
-"^":"Tp:108;a,c,d",
-$1:[function(a){var z,y,x,w
-z=this.a
-y=--z.c
-x=z.b
-if(x!=null){w=this.d
-if(w<0||w>=x.length)return H.e(x,w)
-x[w]=a
-if(y===0){z=z.a.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,21,"call"],
-$isEH:true},
-oh:{
-"^":"a;",
-$isoh:true},
-Pf0:{
-"^":"a;",
-$isoh:true},
-Zf:{
-"^":"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,109,23,21],
-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)},"pm","$2","$1","gyr",2,2,105,23,24,25]},
-Gc:{
-"^":"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},
-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},
-go7:function(){return this.Gv===2?null:this.qV},
-gIa:function(){return this.Gv===2?null:this.o4},
-Rx:function(a,b){var z,y
-z=$.X3
-y=H.VM(new P.Gc(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)
-x=H.VM(new P.Gc(0,z,null,null,null,$.X3.wY(b),y,null),[null])
-this.au(x)
-return x},
-OA:function(a){return this.co(a,null)},
-Qy:function(a){var z,y
-z=$.X3
-y=new P.Gc(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},
-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){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
-this.jk=null
-for(y=null;z!=null;y=z,z=x){x=z.gBQ()
-z.sBQ(y)}return y},
-rX:function(a){var z,y
-z=J.x(a)
-if(!!z.$isb8)if(!!z.$isGc)P.A9(a,this)
-else P.k3(a,this)
-else{y=this.L3()
-this.Am(a)
-P.HZ(this,y)}},
-R8:function(a){var z=this.L3()
-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,22,23,24,25],
-OH:function(a){var z
-if(a==null);else{z=J.x(a)
-if(!!z.$isb8){if(!!z.$isGc){z=a.Gv
-if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.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
-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
-this.Lj.wr(new P.iX(this,a,b))},
-J9:function(a,b){this.OH(a)},
-X8:function(a,b,c){this.CG(a,b)},
-$isGc:true,
-$isb8:true,
-static:{"^":"ewM,JE,C3n,oN1,dh",Dt:function(a){return H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[b])
-z.J9(a,b)
-return z},Vu:function(a,b,c){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[c])
-z.X8(a,b,c)
-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
-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()
-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
-u=z.e.gWj()?z.e.gDL():null
-x.c=u
-x.d=!1
-y=!w
-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=(u==null?y!=null:u!==y)&&!!J.x(y).$isb8}else y=!1
-if(y){r=x.c
-if(!!J.x(r).$isGc)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=q}}}},
-da:{
-"^":"Tp:69;a,b",
-$0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-U7:{
-"^":"Tp:13;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,21,"call"],
-$isEH:true},
-vr:{
-"^":"Tp:110;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
-$isEH:true},
-cX:{
-"^":"Tp:69;a,b",
-$0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
-eX:{
-"^":"Tp:69;c,d",
-$0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-iX:{
-"^":"Tp:69;a,b,c",
-$0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
-rq:{
-"^":"Tp:111;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:{
-"^":"Tp:18;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{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
-w=r
-v=new H.XO(q,null)
-r=J.w8(z)
-p=w
-o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
-r=this.b
-r.c=o
-r.b=!1
-return}u=r.go7()
-if(x===!0&&u!=null){try{r=u
-p=H.G3()
-p=H.KT(p,[p,p]).BD(r)
-n=this.bK
-m=this.b
-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.XO(q,null)
-r=J.w8(z)
-p=t
-o=(r==null?p==null:r===p)?z:new P.Ca(t,s)
-r=this.b
-r.c=o
-r.b=!1
-return}this.b.b=!0}else{r=this.b
-r.c=z
-r.b=!1}},
-$isEH:true},
-RT:{
-"^":"Tp:18;c,b,Gq,Rm,w3",
-$0:function(){var z,y,x,w,v,u
-z={}
-z.a=null
-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,v),new P.FZ(z,v))}},
-$isEH:true},
-jZ:{
-"^":"Tp:13;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,112,"call"],
-$isEH:true},
-FZ:{
-"^":"Tp:110;a,mG",
-$2:[function(a,b){var z,y
-z=this.a
-if(!J.x(z.a).$isGc){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,23,24,25,"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.XW(function(a){return{func:"bp",ret:P.cb,args:[{func:"Lf",args:[a]}]}},this.$receiver,"cb")},113],
-lM:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"cb",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"xv",ret:P.cb,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},113],
-tg:function(a,b){var z,y
-z={}
-y=P.Dt(P.a2)
-z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.kb(y),y.gaq())
-return y},
-aN:function(a,b){var z,y
-z={}
-y=P.Dt(null)
-z.a=null
-z.a=this.KR(new P.lz(z,this,b,y),!0,new P.ib(y),y.gaq())
-return y},
-Vr:function(a,b){var z,y
-z={}
-y=P.Dt(P.a2)
-z.a=null
-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={}
-y=P.Dt(P.KN)
-z.a=0
-this.KR(new P.PI(z),!0,new P.uO(z,y),y.gaq())
-return y},
-gl0:function(a){var z,y
-z={}
-y=P.Dt(P.a2)
-z.a=null
-z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gaq())
-return y},
-gtH:function(a){var z,y
-z={}
-y=P.Dt(H.ip(this,"cb",0))
-z.a=null
-z.a=this.KR(new P.xp(z,this,y),!0,new P.OC(y),y.gaq())
-return y},
-grZ:function(a){var z,y
-z={}
-y=P.Dt(H.ip(this,"cb",0))
-z.a=null
-z.b=!1
-this.KR(new P.UH(z,this),!0,new P.Z5(z,y),y.gaq())
-return y},
-$iscb:true},
-Sd:{
-"^":"Tp;a,b,c,d",
-$1:[function(a){var z,y
-z=this.a
-y=this.d
-P.FE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,114,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-Oh:{
-"^":"Tp:69;e,f",
-$0:function(){return J.xC(this.f,this.e)},
-$isEH:true},
-jvH:{
-"^":"Tp:115;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
-$isEH:true},
-kb:{
-"^":"Tp:69;bK",
-$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
-$isEH:true},
-lz:{
-"^":"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,114,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-at:{
-"^":"Tp:69;e,f",
-$0:function(){return this.e.$1(this.f)},
-$isEH:true},
-mj:{
-"^":"Tp:13;",
-$1:function(a){},
-$isEH:true},
-ib:{
-"^":"Tp:69;UI",
-$0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-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,114,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-WN:{
-"^":"Tp:69;e,f",
-$0:function(){return this.e.$1(this.f)},
-$isEH:true},
-XPB:{
-"^":"Tp:115;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
-$isEH:true},
-BSd:{
-"^":"Tp:69;bK",
-$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
-$isEH:true},
-PI:{
-"^":"Tp:13;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-uO:{
-"^":"Tp:69;a,b",
-$0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
-qg:{
-"^":"Tp:13;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-Wd:{
-"^":"Tp:69;c",
-$0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
-$isEH:true},
-xp:{
-"^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-OC:{
-"^":"Tp:69;d",
-$0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
-$isEH:true},
-UH:{
-"^":"Tp;a,b",
-$1:[function(a){var z=this.a
-z.b=!0
-z.a=a},"$1",null,2,0,null,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-Z5:{
-"^":"Tp:69;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"],
-$isEH:true},
-Oy:{
-"^":"a;",
-$isOy:true},
-nR:{
-"^":"a;",
-gUF:function(){var z=this.Gv
-return(z&1)!==0?this.gEe().gyD():(z&2)===0},
-gh6:function(){if((this.Gv&8)===0)return this.xG
-return this.xG.gmT()},
-kW:function(){var z,y
-if((this.Gv&8)===0){z=this.xG
-if(z==null){z=new P.qm(null,null,0)
-this.xG=z}return z}y=this.xG
-y.gmT()
-return y.gmT()},
-gEe:function(){if((this.Gv&8)!==0)return this.xG.gmT()
-return this.xG},
-nG:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add event after closing")
-return new P.lj("Cannot add event while adding a stream")},
-im:function(){var z=this.yx
-if(z==null){z=(this.Gv&2)!==0?$.mk():P.Dt(null)
-this.yx=z}return z},
-h:[function(a,b){var z=this.Gv
-if(z>=4)throw H.b(this.nG())
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"nR")}],
-S6:function(a){var z=this.Gv
-if((z&4)!==0)return this.im()
-if(z>=4)throw H.b(this.nG())
-z|=4
-this.Gv=z
-if((z&1)!==0)this.Pl()
-else if((z&3)===0)this.kW().h(0,C.ZB)
-return this.im()},
-Rg:function(a,b){var z=this.Gv
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},
-oJ:function(a,b){var z=this.Gv
-if((z&1)!==0)this.pb(a,b)
-else if((z&3)===0)this.kW().h(0,new P.WG(a,b,null))},
-ET:function(a){var z,y,x,w,v
-if((this.Gv&3)!==0)throw H.b(P.w("Stream has already been listened to."))
-z=$.X3
-y=a?1:0
-x=H.VM(new P.yU(this,null,null,null,z,y,null,null),[null])
-w=this.gh6()
-y=this.Gv|=1
-if((y&8)!==0){v=this.xG
-v.smT(x)
-v.QE(0)}else this.xG=x
-x.WN(w)
-x.J7(new P.UO(this))
-return x},
-j0:function(a){var z,y,x,w,v,u
-z=null
-if((this.Gv&8)!==0)z=this.xG.ed()
-this.xG=null
-this.Gv=this.Gv&4294967286|2
-if(this.gYm()!=null)if(z==null)try{z=this.tA()}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-u=P.Dt(null)
-u.CG(y,x)
-z=u}else z=z.Qy(this.gYm())
-v=new P.A1(this)
-if(z!=null)z=z.Qy(v)
-else v.$0()
-return z},
-mO:function(a){if((this.Gv&8)!==0)this.xG.yy(0)
-P.ot(this.gp4())},
-m4:function(a){if((this.Gv&8)!==0)this.xG.QE(0)
-P.ot(this.gZ9())}},
-UO:{
-"^":"Tp:69;a",
-$0:function(){P.ot(this.a.gnL())},
-$isEH:true},
-A1:{
-"^":"Tp:18;a",
-$0:[function(){var z=this.a.yx
-if(z!=null&&z.Gv===0)z.OH(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-TT:{
-"^":"a;",
-Iv:function(a){this.gEe().Rg(0,a)},
-pb:function(a,b){this.gEe().oJ(a,b)},
-Pl:function(){this.gEe().YB()}},
-of2:{
-"^":"a;",
-Iv:function(a){this.gEe().w6(H.VM(new P.fZ(a,null),[null]))},
-pb:function(a,b){this.gEe().w6(new P.WG(a,b,null))},
-Pl:function(){this.gEe().w6(C.ZB)}},
-Gh:{
-"^":"ZzD;nL<,p4<,Z9<,Ym<,xG,Gv,yx",
-tA:function(){return this.Ym.$0()}},
-ZzD:{
-"^":"nR+of2;"},
-Xq:{
-"^":"pe;nL<,p4<,Z9<,Ym<,xG,Gv,yx",
-tA:function(){return this.Ym.$0()}},
-pe:{
-"^":"nR+TT;"},
-O9:{
-"^":"ez;Y8",
-w4:function(a){return this.Y8.ET(a)},
-giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
-n:function(a,b){if(b==null)return!1
-if(this===b)return!0
-if(!J.x(b).$isO9)return!1
-return b.Y8===this.Y8},
-$isO9:true},
-yU:{
-"^":"KA;Y8<,pN,o7,Bd,Lj,Gv,lz,Ri",
-tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8().mO(this)},"$0","gp4",0,0,18],
-LP:[function(){this.gY8().m4(this)},"$0","gZ9",0,0,18]},
-NOT:{
-"^":"a;"},
-KA:{
-"^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
-WN:function(a){if(a==null)return
-this.Ri=a
-if(!a.gl0(a)){this.Gv=(this.Gv|64)>>>0
-this.Ri.t2(this)}},
-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.od()
-this.Bd=this.Lj.Al(a)},
-Fv:[function(a,b){var z=this.Gv
-if((z&8)!==0)return
-this.Gv=(z+128|4)>>>0
-if(b!=null)b.Qy(this.gDQ(this))
-if(z<128&&this.Ri!=null)this.Ri.FK()
-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,116,23,117],
-QE:[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){z=this.Ri
-z=!z.gl0(z)}else z=!1
-if(z)this.Ri.t2(this)
-else{z=(this.Gv&4294967291)>>>0
-this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}}},"$0","gDQ",0,0,18],
-ed:function(){var z=(this.Gv&4294967279)>>>0
-this.Gv=z
-if((z&8)!==0)return this.lz
-this.tk()
-return this.lz},
-gyD:function(){return(this.Gv&4)!==0},
-gUF:function(){return this.Gv>=128},
-tk:function(){var z=(this.Gv|8)>>>0
-this.Gv=z
-if((z&64)!==0)this.Ri.FK()
-if((this.Gv&32)===0)this.Ri=null
-this.lz=this.tA()},
-Rg:function(a,b){var z=this.Gv
-if((z&8)!==0)return
-if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.fZ(b,null),[null]))},
-oJ:function(a,b){var z=this.Gv
-if((z&8)!==0)return
-if(z<32)this.pb(a,b)
-else this.w6(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.w6(C.ZB)},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
-tA:function(){},
-w6:function(a){var z,y
-z=this.Ri
-if(z==null){z=new P.qm(null,null,0)
-this.Ri=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)}},
-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)},
-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
-this.tk()
-z=this.lz
-if(!!J.x(z).$isb8)z.Qy(y)
-else y.$0()}else{y.$0()
-this.Kl((z&4)!==0)}},
-Pl:function(){var z,y
-z=new P.qQ(this)
-this.tk()
-this.Gv=(this.Gv|16)>>>0
-y=this.lz
-if(!!J.x(y).$isb8)y.Qy(z)
-else z.$0()},
-J7:function(a){var z=this.Gv
-this.Gv=(z|32)>>>0
-a.$0()
-this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},
-Kl:function(a){var z,y
-if((this.Gv&64)!==0){z=this.Ri
-z=z.gl0(z)}else z=!1
-if(z){z=(this.Gv&4294967231)>>>0
-this.Gv=z
-if((z&4)!==0)if(z<128){z=this.Ri
-z=z==null||z.gl0(z)}else z=!1
-else z=!1
-if(z)this.Gv=(this.Gv&4294967291)>>>0}for(;!0;a=y){z=this.Gv
-if((z&8)!==0){this.Ri=null
-return}y=(z&4)!==0
-if(a===y)break
-this.Gv=(z^32)>>>0
-if(y)this.uO()
-else this.LP()
-this.Gv=(this.Gv&4294967263)>>>0}z=this.Gv
-if((z&64)!==0&&z<128)this.Ri.t2(this)},
-$isOy:true,
-static:{"^":"Xx,bG,zC,Ir,nav,Dr,JAK,N3S,bsZ"}},
-x1:{
-"^":"Tp:18;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
-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.M8(v,u)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
-$isEH:true},
-qQ:{
-"^":"Tp:18;a",
-$0:[function(){var z,y
-z=this.a
-y=z.Gv
-if((y&16)===0)return
-z.Gv=(y|42)>>>0
-z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
-$isEH:true},
-ez:{
-"^":"cb;",
-KR:function(a,b,c,d){var z=this.w4(!0===b)
-z.yl(a)
-z.fm(0,d)
-z.y5(c)
-return z},
-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.KA(null,null,null,z,y,null,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y}},
-ti:{
-"^":"a;aw@"},
-fZ:{
-"^":"ti;P>,aw",
-dP:function(a){a.Iv(this.P)}},
-WG:{
-"^":"ti;kc>,I4<,aw",
-dP:function(a){a.pb(this.kc,this.I4)}},
-yRf:{
-"^":"a;",
-dP:function(a){a.Pl()},
-gaw:function(){return},
-saw:function(a){throw H.b(P.w("No events after a done."))}},
-B3P:{
-"^":"a;",
-t2:function(a){var z=this.Gv
-if(z===1)return
-if(z>=1){this.Gv=1
-return}P.rb(new P.lg(this,a))
-this.Gv=1},
-FK:function(){if(this.Gv===1)this.Gv=3}},
-lg:{
-"^":"Tp:69;a,b",
-$0:[function(){var z,y
-z=this.a
-y=z.Gv
-z.Gv=0
-if(y===3)return
-z.TO(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-qm:{
-"^":"B3P;zR,N6,Gv",
-gl0:function(a){return this.N6==null},
-h:function(a,b){var z=this.N6
-if(z==null){this.N6=b
-this.zR=b}else{z.saw(b)
-this.N6=b}},
-TO:function(a){var z,y
-z=this.zR
-y=z.gaw()
-this.zR=y
-if(y==null)this.N6=null
-z.dP(a)},
-V1:function(a){if(this.Gv===1)this.Gv=3
-this.N6=null
-this.zR=null}},
-EM:{
-"^":"a;Lj<,Gv,Bd",
-gUF:function(){return this.Gv>=4},
-yc:function(){if((this.Gv&2)!==0)return
-this.Lj.wr(this.gXm())
-this.Gv=(this.Gv|2)>>>0},
-yl:function(a){},
-fm:function(a,b){},
-y5:function(a){this.Bd=a},
-Fv:[function(a,b){this.Gv+=4
-if(b!=null)b.Qy(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,116,23,117],
-QE:[function(a){var z=this.Gv
-if(z>=4){z-=4
-this.Gv=z
-if(z<4&&(z&1)===0)this.yc()}},"$0","gDQ",0,0,18],
-ed:function(){return},
-Pl:[function(){var z=(this.Gv&4294967293)>>>0
-this.Gv=z
-if(z>=4)return
-this.Gv=(z|1)>>>0
-z=this.Bd
-if(z!=null)this.Lj.bH(z)},"$0","gXm",0,0,18],
-$isOy:true,
-static:{"^":"D4,ED7,Yi"}},
-dR:{
-"^":"Tp:69;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
-uR:{
-"^":"Tp:118;a,b",
-$2:function(a,b){return P.NX(this.a,this.b,a,b)},
-$isEH:true},
-Q0:{
-"^":"Tp:69;a,b",
-$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-og:{
-"^":"cb;",
-KR:function(a,b,c,d){var z,y,x,w,v
-b=!0===b
-z=H.ip(this,"og",0)
-y=H.ip(this,"og",1)
-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.yl(a)
-v.fm(0,d)
-v.y5(c)
-return v},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-ut:function(a,b){b.Rg(0,a)},
-$ascb:function(a,b){return[b]}},
-fB:{
-"^":"KA;KQ,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
-Rg:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.Rg.call(this,this,b)},
-oJ:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.oJ.call(this,a,b)},
-uO:[function(){var z=this.Ee
-if(z==null)return
-z.yy(0)},"$0","gp4",0,0,18],
-LP:[function(){var z=this.Ee
-if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,18],
-tA:function(){var z=this.Ee
-if(z!=null){this.Ee=null
-z.ed()}return},
-vx:[function(a){this.KQ.ut(a,this)},"$1","gOa",2,0,function(){return H.XW(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},104],
-xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,119,24,25],
-nn:[function(){this.YB()},"$0","gH1",0,0,18],
-S8:function(a,b,c,d){var z,y
-z=this.gOa()
-y=this.gve()
-this.Ee=this.KQ.Sb.zC(z,this.gH1(),y)},
-$asKA:function(a,b){return[b]},
-$asOy:function(a,b){return[b]}},
-nO:{
-"^":"og;qs,Sb",
-wW:function(a){return this.qs.$1(a)},
-ut:function(a,b){var z,y,x,w,v
-z=null
-try{z=this.wW(a)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-b.oJ(y,x)
-return}if(z===!0)J.z4(b,a)},
-$asog:function(a){return[a,a]},
-$ascb:null},
-c9:{
-"^":"og;TN,Sb",
-kn:function(a){return this.TN.$1(a)},
-ut:function(a,b){var z,y,x,w,v
-z=null
-try{z=this.kn(a)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-b.oJ(y,x)
-return}J.z4(b,z)}},
-Bg:{
-"^":"og;pK,Sb",
-GW:function(a){return this.pK.$1(a)},
-ut:function(a,b){var z,y,x,w,v
-try{for(w=J.mY(this.GW(a));w.G();){z=w.gl()
-J.z4(b,z)}}catch(v){w=H.Ru(v)
-y=w
-x=new H.XO(v,null)
-b.oJ(y,x)}}},
-Xa:{
-"^":"a;"},
-Ob:{
-"^":"a;"},
-yQ:{
-"^":"a;E2<,cP<,Ot<,eo<,Ka<,Xp<,fb<,rb<,Zq<,NW,JS>,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.JS.$1(b)},
-qp:function(a){return this.il.$1$specification(a)}},
-AN:{
-"^":"a;"},
-dl:{
-"^":"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.gJS(y)==null;)z=z.geT(z)
-y=z.gtp()
-y.gJS(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)}},
-fZi:{
-"^":"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.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.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.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.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)},
-up:function(a,b){var z=this.O8(a)
-if(b)return new P.dv(this,z)
-else return new P.wd(this,z)}},
-TF:{
-"^":"Tp:69;a,b",
-$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Xz:{
-"^":"Tp:69;c,d",
-$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Cg:{
-"^":"Tp:13;a,b",
-$1:[function(a){return this.a.M8(this.b,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-Hs:{
-"^":"Tp:13;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-dv:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-wd:{
-"^":"Tp:77;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-uo:{
-"^":"fZi;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:{
-"^":"Tp:69;a,b",
-$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
-$isEH:true},
-eM:{
-"^":"Tp:69;c,d",
-$0:[function(){var z,y
-z=this.c
-P.FL("Uncaught Error: "+H.d(z))
-y=this.d
-if(y==null&&!!J.x(z).$isXS)y=z.gI4()
-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:77;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true},
-AHi:{
-"^":"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.Un()},
-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)},
-gJS:function(a){return P.aW()},
-Ch:function(a,b){return this.gJS(this).$1(b)},
-gil:function(){return P.Is()},
-qp:function(a){return this.gil().$1$specification(a)}},
-R81:{
-"^":"fZi;",
-geT:function(a){return},
-gtp:function(){return C.dS},
-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.yv(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},
-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])},
-R2:[function(a,b){return J.xC(a,b)},"$2","lZ",4,0,45,46,47],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,48,46],
-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]
-return z}b=P.py()
-return P.c7(a,b,c,d,e)},
-RN:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
-l1:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
-Ix:function(a,b,c){var z,y
-if(P.nH(a)){if(b==="("&&c===")")return"(...)"
-return b+"..."+c}z=[]
-y=$.Ex()
-y.push(a)
-try{P.T4(a,z)}finally{if(0>=y.length)return H.e(y,0)
-y.pop()}y=P.p9(b)
-y.We(z,", ")
-y.KF(c)
-return y.vM},
-WE:function(a,b,c){var z,y
-if(P.nH(a))return b+"..."+c
-z=P.p9(b)
-y=$.Ex()
-y.push(a)
-try{z.We(a,", ")}finally{if(0>=y.length)return H.e(y,0)
-y.pop()}z.KF(c)
-return z.gvM()},
-nH:function(a){var z,y
-for(z=0;y=$.Ex(),z<y.length;++z)if(a===y[z])return!0
-return!1},
-T4:function(a,b){var z,y,x,w,v,u,t,s,r,q
-z=a.gA(a)
-y=0
-x=0
-while(!0){if(!(y<80||x<3))break
-if(!z.G())return
-w=H.d(z.gl())
-b.push(w)
-y+=w.length+2;++x}if(!z.G()){if(x<=5)return
-if(0>=b.length)return H.e(b,0)
-v=b.pop()
-if(0>=b.length)return H.e(b,0)
-u=b.pop()}else{t=z.gl();++x
-if(!z.G()){if(x<=4){b.push(H.d(t))
-return}v=H.d(t)
-if(0>=b.length)return H.e(b,0)
-u=b.pop()
-y+=v.length+2}else{s=z.gl();++x
-for(;z.G();t=s,s=r){r=z.gl();++x
-if(x>100){while(!0){if(!(y>75&&x>3))break
-if(0>=b.length)return H.e(b,0)
-y-=b.pop().length+2;--x}b.push("...")
-return}}u=H.d(t)
-v=H.d(s)
-y+=v.length+u.length+4}}if(x>b.length+2){y+=5
-q="..."}else q=null
-while(!0){if(!(y>80&&b.length>3))break
-if(0>=b.length)return H.e(b,0)
-y-=b.pop().length+2
-if(q==null){y+=5
-q="..."}}if(q!=null)b.push(q)
-b.push(u)
-b.push(v)},
-L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
-Ls:function(a,b,c,d){return H.VM(new P.D0(0,null,null,null,null,null,0),[d])},
-vW:function(a){var z,y
-z={}
-if(P.nH(a))return"{...}"
-y=P.p9("")
-try{$.Ex().push(a)
-y.KF("{")
-z.a=!0
-J.Me(a,new P.W0(z,y))
-y.KF("}")}finally{z=$.Ex()
-if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},
-bA:{
-"^":"a;X5,vv,OX,OB,wV",
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-gvc:function(){return H.VM(new P.fG(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.fG(this),[H.Kp(this,0)]),new P.oi(this),H.Kp(this,0),H.Kp(this,1))},
-x4:function(a){var z,y
-if(typeof a==="string"&&a!=="__proto__"){z=this.vv
-return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
-return y==null?!1:y[a]!=null}else return this.Zt(a)},
-Zt:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-FV:function(a,b){H.bQ(b,new P.DJ(this))},
-t:function(a,b){var z,y,x,w
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null)y=null
-else{x=z[b]
-y=x===z?null:x}return y}else if(typeof b==="number"&&(b&0x3ffffff)===b){w=this.OX
-if(w==null)y=null
-else{x=w[b]
-y=x===w?null:x}return y}else return this.Dl(b)},
-Dl:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-return x<0?null:y[x+1]},
-u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){z=P.SQ()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null){y=P.SQ()
-this.OX=y}this.dg(y,b,c)}else this.ms(b,c)},
-ms:function(a,b){var z,y,x,w
-z=this.OB
-if(z==null){z=P.SQ()
-this.OB=z}y=this.nm(a)
-x=z[y]
-if(x==null){P.cW(z,y,[a,b]);++this.X5
-this.wV=null}else{w=this.aH(x,a)
-if(w>=0)x[w+1]=b
-else{x.push(a,b);++this.X5
-this.wV=null}}},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return;--this.X5
-this.wV=null
-return y.splice(x,2)[1]},
-V1:function(a){if(this.X5>0){this.wV=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0}},
-aN:function(a,b){var z,y,x,w
-z=this.Ig()
-for(y=z.length,x=0;x<y;++x){w=z[x]
-b.$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},
-Ig:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.wV
-if(z!=null)return z
-y=Array(this.X5)
-y.fixed$length=init
-x=this.vv
-if(x!=null){w=Object.getOwnPropertyNames(x)
-v=w.length
-for(u=0,t=0;t<v;++t){y[u]=w[t];++u}}else u=0
-s=this.OX
-if(s!=null){w=Object.getOwnPropertyNames(s)
-v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.OB
-if(r!=null){w=Object.getOwnPropertyNames(r)
-v=w.length
-for(t=0;t<v;++t){q=r[w[t]]
-p=q.length
-for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
-return y},
-dg:function(a,b,c){if(a[b]==null){++this.X5
-this.wV=null}P.cW(a,b,c)},
-Nv:function(a,b){var z
-if(a!=null&&a[b]!=null){z=P.vL(a,b)
-delete a[b];--this.X5
-this.wV=null
-return z}else return},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;y+=2)if(J.xC(a[y],b))return y
-return-1},
-$isZ0:true,
-static:{vL:function(a,b){var z=a[b]
-return z===a?null:z},cW:function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},SQ:function(){var z=Object.create(null)
-P.cW(z,"<non-identifier-key>",z)
-delete z["<non-identifier-key>"]
-return z}}},
-oi:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,120,"call"],
-$isEH:true},
-DJ:{
-"^":"Tp;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
-PL:{
-"^":"bA;X5,vv,OX,OB,wV",
-nm:function(a){return H.CU(a)&0x3ffffff},
-aH:function(a,b){var z,y,x
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1}},
-Fq:{
-"^":"bA;m6,Q6,hg,X5,vv,OX,OB,wV",
-C2:function(a,b){return this.m6.$2(a,b)},
-H5:function(a){return this.Q6.$1(a)},
-Ef:function(a){return this.hg.$1(a)},
-t:function(a,b){if(this.Ef(b)!==!0)return
-return P.bA.prototype.Dl.call(this,b)},
-u:function(a,b,c){P.bA.prototype.ms.call(this,b,c)},
-x4:function(a){if(this.Ef(a)!==!0)return!1
-return P.bA.prototype.Zt.call(this,a)},
-Rz:function(a,b){if(this.Ef(b)!==!0)return
-return P.bA.prototype.bB.call(this,b)},
-nm:function(a){return this.H5(a)&0x3ffffff},
-aH:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
-return-1},
-bu:function(a){return P.vW(this)},
-static:{c7:function(a,b,c,d,e){var z=new P.jG(d)
-return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
-jG:{
-"^":"Tp:13;a",
-$1:function(a){var z=H.IU(a,this.a)
-return z},
-$isEH:true},
-fG:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.X5},
-gl0:function(a){return this.Fb.X5===0},
-gA:function(a){var z=this.Fb
-z=new P.EQ(z,z.Ig(),0,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-tg:function(a,b){return this.Fb.x4(b)},
-aN:function(a,b){var z,y,x,w
-z=this.Fb
-y=z.Ig()
-for(x=y.length,w=0;w<x;++w){b.$1(y[w])
-if(y!==z.wV)throw H.b(P.a4(z))}},
-$isyN:true},
-EQ:{
-"^":"a;Fb,wV,zi,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.wV
-y=this.zi
-x=this.Fb
-if(z!==x.wV)throw H.b(P.a4(x))
-else if(y>=z.length){this.fD=null
-return!1}else{this.fD=z[y]
-this.zi=y+1
-return!0}}},
-YB:{
-"^":"a;X5,vv,OX,OB,H9,lX,zN",
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-gvc:function(){return H.VM(new P.i5(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.i5(this),[H.Kp(this,0)]),new P.a1(this),H.Kp(this,0),H.Kp(this,1))},
-x4:function(a){var z,y
-if(typeof a==="string"&&a!=="__proto__"){z=this.vv
-if(z==null)return!1
-return z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
-if(y==null)return!1
-return y[a]!=null}else return this.Zt(a)},
-Zt:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-FV:function(a,b){J.Me(b,new P.pk(this))},
-t:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null)return
-y=z[b]
-return y==null?null:y.gcA()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
-if(x==null)return
-y=x[b]
-return y==null?null:y.gcA()}else return this.Dl(b)},
-Dl:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-return y[x].gcA()},
-u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){z=P.Jc()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null){y=P.Jc()
-this.OX=y}this.dg(y,b,c)}else this.ms(b,c)},
-ms:function(a,b){var z,y,x,w
-z=this.OB
-if(z==null){z=P.Jc()
-this.OB=z}y=this.nm(a)
-x=z[y]
-if(x==null)z[y]=[this.pE(a,b)]
-else{w=this.aH(x,a)
-if(w>=0)x[w].scA(b)
-else x.push(this.pE(a,b))}},
-to:function(a,b){var z
-if(this.x4(a))return this.t(0,a)
-z=b.$0()
-this.u(0,a,z)
-return z},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x,w
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-w=y.splice(x,1)[0]
-this.Vb(w)
-return w.gcA()},
-V1:function(a){if(this.X5>0){this.lX=null
-this.H9=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0
-this.zN=this.zN+1&67108863}},
-aN:function(a,b){var z,y
-z=this.H9
-y=this.zN
-for(;z!=null;){b.$2(z.gkh(),z.gcA())
-if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},
-dg:function(a,b,c){var z=a[b]
-if(z==null)a[b]=this.pE(b,c)
-else z.scA(c)},
-Nv:function(a,b){var z
-if(a==null)return
-z=a[b]
-if(z==null)return
-this.Vb(z)
-delete a[b]
-return z.gcA()},
-pE:function(a,b){var z,y
-z=new P.db(a,b,null,null)
-if(this.H9==null){this.lX=z
-this.H9=z}else{y=this.lX
-z.zQ=y
-y.sDG(z)
-this.lX=z}++this.X5
-this.zN=this.zN+1&67108863
-return z},
-Vb:function(a){var z,y
-z=a.gzQ()
-y=a.gDG()
-if(z==null)this.H9=y
-else z.sDG(y)
-if(y==null)this.lX=z
-else y.szQ(z);--this.X5
-this.zN=this.zN+1&67108863},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y)if(J.xC(a[y].gkh(),b))return y
-return-1},
-bu:function(a){return P.vW(this)},
-$isFo:true,
-$isZ0:true,
-static:{Jc:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-a1:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,120,"call"],
-$isEH:true},
-pk:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
-db:{
-"^":"a;kh<,cA@,DG@,zQ@"},
-i5:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.X5},
-gl0:function(a){return this.Fb.X5===0},
-gA:function(a){var z,y
-z=this.Fb
-y=new P.N6(z,z.zN,null,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-y.zq=z.H9
-return y},
-tg:function(a,b){return this.Fb.x4(b)},
-aN:function(a,b){var z,y,x
-z=this.Fb
-y=z.H9
-x=z.zN
-for(;y!=null;){b.$1(y.gkh())
-if(x!==z.zN)throw H.b(P.a4(z))
-y=y.gDG()}},
-$isyN:true},
-N6:{
-"^":"a;Fb,zN,zq,fD",
-gl:function(){return this.fD},
-G:function(){var z=this.Fb
-if(this.zN!==z.zN)throw H.b(P.a4(z))
-else{z=this.zq
-if(z==null){this.fD=null
-return!1}else{this.fD=z.gkh()
-this.zq=this.zq.gDG()
-return!0}}}},
-jg:{
-"^":"lN;X5,vv,OX,OB,DM",
-gA:function(a){var z=new P.cN(this,this.Zl(),0,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-return y==null?!1:y[b]!=null}else return this.bk(b)},
-bk:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-hV:function(a){var z
-if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
-else z=!0
-if(z)return this.tg(0,a)?a:null
-return this.AD(a)},
-AD:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-return J.UQ(y,x)},
-h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
-if(x==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.OX=y
-x=y}return this.jn(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
-z=this.OB
-if(z==null){z=P.V5()
-this.OB=z}y=this.nm(b)
-x=z[y]
-if(x==null)z[y]=[b]
-else{if(this.aH(x,b)>=0)return!1
-x.push(b)}++this.X5
-this.DM=null
-return!0},
-FV:function(a,b){var z
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
-if(z==null)return!1
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return!1;--this.X5
-this.DM=null
-y.splice(x,1)
-return!0},
-V1:function(a){if(this.X5>0){this.DM=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0}},
-Zl:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.DM
-if(z!=null)return z
-y=Array(this.X5)
-y.fixed$length=init
-x=this.vv
-if(x!=null){w=Object.getOwnPropertyNames(x)
-v=w.length
-for(u=0,t=0;t<v;++t){y[u]=w[t];++u}}else u=0
-s=this.OX
-if(s!=null){w=Object.getOwnPropertyNames(s)
-v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.OB
-if(r!=null){w=Object.getOwnPropertyNames(r)
-v=w.length
-for(t=0;t<v;++t){q=r[w[t]]
-p=q.length
-for(o=0;o<p;++o){y[u]=q[o];++u}}}this.DM=y
-return y},
-jn:function(a,b){if(a[b]!=null)return!1
-a[b]=0;++this.X5
-this.DM=null
-return!0},
-Nv:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.X5
-this.DM=null
-return!0}else return!1},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y)if(J.xC(a[y],b))return y
-return-1},
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{V5:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-cN:{
-"^":"a;O2,DM,zi,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.DM
-y=this.zi
-x=this.O2
-if(z!==x.DM)throw H.b(P.a4(x))
-else if(y>=z.length){this.fD=null
-return!1}else{this.fD=z[y]
-this.zi=y+1
-return!0}}},
-D0:{
-"^":"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},
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null)return!1
-return y[b]!=null}else return this.bk(b)},
-bk:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-hV:function(a){var z
-if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
-else z=!0
-if(z)return this.tg(0,a)?a:null
-else return this.AD(a)},
-AD:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-return J.Nq(J.UQ(y,x))},
-aN:function(a,b){var z,y
-z=this.H9
-y=this.zN
-for(;z!=null;){b.$1(z.gGc(z))
-if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},
-grZ:function(a){var z=this.lX
-if(z==null)throw H.b(P.w("No elements"))
-return z.gGc(z)},
-h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
-if(x==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.OX=y
-x=y}return this.jn(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
-z=this.OB
-if(z==null){z=P.T2()
-this.OB=z}y=this.nm(b)
-x=z[y]
-if(x==null)z[y]=[this.xf(b)]
-else{if(this.aH(x,b)>=0)return!1
-x.push(this.xf(b))}return!0},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
-if(z==null)return!1
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return!1
-this.Vb(y.splice(x,1)[0])
-return!0},
-V1:function(a){if(this.X5>0){this.lX=null
-this.H9=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0
-this.zN=this.zN+1&67108863}},
-jn:function(a,b){if(a[b]!=null)return!1
-a[b]=this.xf(b)
-return!0},
-Nv:function(a,b){var z
-if(a==null)return!1
-z=a[b]
-if(z==null)return!1
-this.Vb(z)
-delete a[b]
-return!0},
-xf:function(a){var z,y
-z=new P.tj(a,null,null)
-if(this.H9==null){this.lX=z
-this.H9=z}else{y=this.lX
-z.zQ=y
-y.sDG(z)
-this.lX=z}++this.X5
-this.zN=this.zN+1&67108863
-return z},
-Vb:function(a){var z,y
-z=a.gzQ()
-y=a.gDG()
-if(z==null)this.H9=y
-else z.sDG(y)
-if(y==null)this.lX=z
-else y.szQ(z);--this.X5
-this.zN=this.zN+1&67108863},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y)if(J.xC(J.Nq(a[y]),b))return y
-return-1},
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{T2:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-tj:{
-"^":"a;Gc>,DG@,zQ@"},
-zQ:{
-"^":"a;O2,zN,zq,fD",
-gl:function(){return this.fD},
-G:function(){var z=this.O2
-if(this.zN!==z.zN)throw H.b(P.a4(z))
-else{z=this.zq
-if(z==null){this.fD=null
-return!1}else{this.fD=z.gGc(z)
-this.zq=this.zq.gDG()
-return!0}}}},
-Yp:{
-"^":"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]}},
-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.XW(function(a){return{func:"Uy",ret:P.QV,args:[{func:"YM",args:[a]}]}},this.$receiver,"mW")},31],
-ad:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"RS",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},31],
-tg:function(a,b){var z
-for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
-return!1},
-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
-z=this.gA(this)
-if(!z.G())return""
-y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
-for(;z.G();){y.vM+=b
-x=H.d(z.gl())
-y.vM+=x}}return y.vM},
-Vr:function(a,b){var z
-for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
-return!1},
-tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
-br:function(a){return this.tt(a,!0)},
-gB:function(a){var z,y
-z=this.gA(this)
-for(y=0;z.G();)++y
-return y},
-gl0:function(a){return!this.gA(this).G()},
-gor:function(a){return this.gl0(this)!==!0},
-grZ:function(a){var z,y
-z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
-do y=z.gl()
-while(z.G())
-return y},
-Zv:function(a,b){var z,y,x,w
-if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
-for(z=this.gA(this),y=b;z.G();){x=z.gl()
-w=J.x(y)
-if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(P.N(b))},
-bu:function(a){return P.Ix(this,"(",")")},
-$isQV:true,
-$asQV:null},
-ark:{
-"^":"E9h;"},
-E9h:{
-"^":"a+lD;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$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)])},
-Zv:function(a,b){return this.t(a,b)},
-aN:function(a,b){var z,y
-z=this.gB(a)
-for(y=0;y<z;++y){b.$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},
-gl0:function(a){return this.gB(a)===0},
-gor:function(a){return!this.gl0(a)},
-grZ:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
-return this.t(a,this.gB(a)-1)},
-tg:function(a,b){var z,y
-z=this.gB(a)
-for(y=0;y<this.gB(a);++y){if(J.xC(this.t(a,y),b))return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
-Vr:function(a,b){var z,y
-z=this.gB(a)
-for(y=0;y<z;++y){if(b.$1(this.t(a,y))===!0)return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
-zV:function(a,b){var z
-if(this.gB(a)===0)return""
-z=P.p9("")
-z.We(a,b)
-return z.vM},
-ad: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.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"fQO",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"lD")},31],
-lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"mh",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},31],
-eR:function(a,b){return H.q9(a,b,null,null)},
-tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.ip(a,"lD",0)])
-C.Nm.sB(z,this.gB(a))}else{y=Array(this.gB(a))
-y.fixed$length=init
-z=H.VM(y,[H.ip(a,"lD",0)])}for(x=0;x<this.gB(a);++x){y=this.t(a,x)
-if(x>=z.length)return H.e(z,x)
-z[x]=y}return z},
-br:function(a){return this.tt(a,!0)},
-h:function(a,b){var z=this.gB(a)
-this.sB(a,z+1)
-this.u(a,z,b)},
-FV:function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
-x=this.gB(a)
-this.sB(a,x+1)
-this.u(a,x,y)}},
-V1:function(a){this.sB(a,0)},
-GT:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,this.gB(a)-1,b)},
-Jd:function(a){return this.GT(a,null)},
-pZ:function(a,b,c){var z=J.Wx(b)
-if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
-z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},
-Mu:function(a,b,c){this.pZ(a,b,c)
-return H.q9(a,b,c,null)},
-UZ:function(a,b,c){var z
-this.pZ(a,b,c)
-z=c-b
-this.YW(a,b,this.gB(a)-z,a,c)
-this.sB(a,this.gB(a)-z)},
-YW:function(a,b,c,d,e){var z,y,x,w,v
-if(b<0||b>this.gB(a))H.vh(P.TE(b,0,this.gB(a)))
-if(c<b||c>this.gB(a))H.vh(P.TE(c,b,this.gB(a)))
-z=c-b
-if(z===0)return
-if(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}y=J.U6(w)
-if(x+z>y.gB(w))throw H.b(P.w("Not enough elements"))
-if(x<b)for(v=z-1;v>=0;--v)this.u(a,b+v,y.t(w,x+v))
-else for(v=0;v<z;++v)this.u(a,b+v,y.t(w,x+v))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-XU:function(a,b,c){var z
-if(c>=this.gB(a))return-1
-for(z=c;z<this.gB(a);++z)if(J.xC(this.t(a,z),b))return z
-return-1},
-u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){var z
-c=this.gB(a)-1
-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)},
-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)
-this.u(a,b,c)},
-UG:function(a,b,c){var z,y
-if(b<0||b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
-z=J.x(c)
-if(!!z.$isyN)c=z.br(c)
-y=J.q8(c)
-this.sB(a,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
-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){return P.WE(a,"[","]")},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-W0:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){var z=this.a
-if(!z.a)this.b.KF(", ")
-z.a=!1
-z=this.b
-z.KF(a)
-z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,121,64,"call"],
-$isEH:true},
-Sw:{
-"^":"mW;v5,av,eZ,qT",
-gA:function(a){var z=new P.KG(this,this.eZ,this.qT,this.av,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-aN:function(a,b){var z,y,x
-z=this.qT
-for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
-if(y<0||y>=x.length)return H.e(x,y)
-b.$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},
-gl0:function(a){return this.av===this.eZ},
-gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
-grZ:function(a){var z,y,x
-z=this.av
-y=this.eZ
-if(z===y)throw H.b(H.DU())
-z=this.v5
-x=z.length
-y=(y-1&x-1)>>>0
-if(y<0||y>=x)return H.e(z,y)
-return z[y]},
-tt:function(a,b){var z,y
-if(b){z=H.VM([],[H.Kp(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}this.GP(z)
-return z},
-br:function(a){return this.tt(a,!0)},
-h:function(a,b){this.NZ(0,b)},
-FV:function(a,b){var z,y,x,w,v,u,t,s,r
-z=b.length
-y=this.gB(this)
-x=y+z
-w=this.v5
-v=w.length
-if(x>=v){u=P.Pd(x)
-if(typeof u!=="number")return H.s(u)
-w=Array(u)
-w.fixed$length=init
-t=H.VM(w,[H.Kp(this,0)])
-this.eZ=this.GP(t)
-this.v5=t
-this.av=0
-H.qG(t,y,x,b,0)
-this.eZ+=z}else{x=this.eZ
-s=v-x
-if(z<s){H.qG(w,x,x+z,b,0)
-this.eZ+=z}else{r=z-s
-H.qG(w,x,x+s,b,0)
-x=this.v5
-H.qG(x,0,r,b,s)
-this.eZ=r}}++this.qT},
-V1:function(a){var z,y,x,w,v
-z=this.av
-y=this.eZ
-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.WE(this,"{","}")},
-AR:function(){var z,y,x,w
-z=this.av
-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)
-w=y[z]
-y[z]=null
-this.av=(z+1&x-1)>>>0
-return w},
-NZ:function(a,b){var z,y,x
-z=this.v5
-y=this.eZ
-x=z.length
-if(y<0||y>=x)return H.e(z,y)
-z[y]=b
-x=(y+1&x-1)>>>0
-this.eZ=x
-if(this.av===x)this.M9();++this.qT},
-M9:function(){var z,y,x,w
-z=Array(this.v5.length*2)
-z.fixed$length=init
-y=H.VM(z,[H.Kp(this,0)])
-z=this.v5
-x=this.av
-w=z.length-x
-H.qG(y,0,w,z,x)
-z=this.av
-x=this.v5
-H.qG(y,w,w+z,x,0)
-this.av=0
-this.eZ=this.v5.length
-this.v5=y},
-GP:function(a){var z,y,x,w,v
-z=this.av
-y=this.eZ
-x=this.v5
-if(z<=y){w=y-z
-H.qG(a,0,w,x,z)
-return w}else{v=x.length-z
-H.qG(a,0,v,x,z)
-z=this.eZ
-y=this.v5
-H.qG(a,v,v+z,y,0)
-return this.eZ+v}},
-Eo:function(a,b){var z=Array(8)
-z.fixed$length=init
-this.v5=H.VM(z,[b])},
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{"^":"TNe",Pd:function(a){var z
-if(typeof a!=="number")return a.O()
-a=(a<<2>>>0)-1
-for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}}}},
-KG:{
-"^":"a;Lz,pP,qT,Dc,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.Lz
-if(this.qT!==z.qT)H.vh(P.a4(z))
-y=this.Dc
-if(y===this.pP){this.fD=null
-return!1}z=z.v5
-x=z.length
-if(y>=x)return H.e(z,y)
-this.fD=z[y]
-this.Dc=(y+1&x-1)>>>0
-return!0}},
-lfu:{
-"^":"a;",
-gl0:function(a){return this.gB(this)===0},
-gor:function(a){return this.gB(this)!==0},
-V1:function(a){this.Ex(this.br(0))},
-FV:function(a,b){var z
-for(z=J.mY(b);z.G();)this.h(0,z.gl())},
-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.Kp(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}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.Kp(this,0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"xPo",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lfu")},31],
-bu:function(a){return P.WE(this,"{","}")},
-ad:function(a,b){var z=new H.U5(this,b)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.Kp(this,0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gba",ret:P.QV,args:[{func:"D6",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},31],
-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
-z=this.gA(this)
-if(!z.G())return""
-y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
-for(;z.G();){y.vM+=b
-x=H.d(z.gl())
-y.vM+=x}}return y.vM},
-Vr:function(a,b){var z
-for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
-return!1},
-grZ:function(a){var z,y
-z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
-do y=z.gl()
-while(z.G())
-return y},
-$isyN:true,
-$isQV:true,
-$asQV:null},
-Vj:{
-"^":"lfu;"},
-oz:{
-"^":"a;G3>,Bb>,T8>",
-$isoz:true},
-jp:{
-"^":"oz;P*,G3,Bb,T8",
-$asoz:function(a,b){return[a]}},
-Xt:{
-"^":"a;",
-vh:function(a){var z,y,x,w,v,u,t,s
-z=this.aY
-if(z==null)return-1
-y=this.iW
-for(x=y,w=x,v=null;!0;){v=this.yV(z.G3,a)
-u=J.Wx(v)
-if(u.D(v,0)){u=z.Bb
-if(u==null)break
-v=this.yV(u.G3,a)
-if(J.z8(v,0)){t=z.Bb
-z.Bb=t.T8
-t.T8=z
-if(t.Bb==null){z=t
-break}z=t}x.Bb=z
-s=z.Bb
-x=z
-z=s}else{if(u.C(v,0)){u=z.T8
-if(u==null)break
-v=this.yV(u.G3,a)
-if(J.u6(v,0)){t=z.T8
-z.T8=t.Bb
-t.Bb=z
-if(t.T8==null){z=t
-break}z=t}w.T8=z
-s=z.T8}else break
-w=z
-z=s}}w.T8=z.Bb
-x.Bb=z.T8
-z.Bb=y.T8
-z.T8=y.Bb
-this.aY=z
-y.T8=null
-y.Bb=null;++this.bb
-return v},
-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
-if(z){a.Bb=y
-a.T8=y.T8
-y.T8=null}else{a.T8=y
-a.Bb=y.Bb
-y.Bb=null}this.aY=a}},
-Ba:{
-"^":"Xt;qW,hg,aY,iW,J0,qT,bb",
-wS:function(a,b){return this.qW.$2(a,b)},
-Ef:function(a){return this.hg.$1(a)},
-yV:function(a,b){return this.wS(a,b)},
-t:function(a,b){if(b==null)throw H.b(P.u(b))
-if(this.Ef(b)!==!0)return
-if(this.aY!=null)if(J.xC(this.vh(b),0))return this.aY.P
-return},
-u:function(a,b,c){var z
-if(b==null)throw H.b(P.u(b))
-z=this.vh(b)
-if(J.xC(z,0)){this.aY.P=c
-return}this.K8(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
-FV:function(a,b){H.bQ(b,new P.QG(this))},
-gl0:function(a){return this.aY==null},
-gor:function(a){return this.aY!=null},
-aN:function(a,b){var z,y,x
-z=H.Kp(this,0)
-y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.qT,this.bb,null),[z])
-y.Qf(this,[P.oz,z])
-for(;y.G();){x=y.gl()
-z=J.RE(x)
-b.$2(z.gG3(x),z.gP(x))}},
-gB:function(a){return this.J0},
-V1:function(a){this.aY=null
-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]},
-$asZ0:null,
-$isZ0:true,
-static:{GV:function(a,b,c,d){var z,y
-z=P.n4()
-y=new P.An(c)
-return H.VM(new P.Ba(z,y,null,H.VM(new P.oz(null,null,null),[c]),0,0,0),[c,d])}}},
-An:{
-"^":"Tp:13;a",
-$1:function(a){var z=H.IU(a,this.a)
-return z},
-$isEH:true},
-QG:{
-"^":"Tp;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"lb",args:[a,b]}},this.a,"Ba")}},
-S6B:{
-"^":"a;",
-gl:function(){var z=this.ya
-if(z==null)return
-return this.Wb(z)},
-Az:function(a){var z
-for(z=this.Jt;a!=null;){z.push(a)
-a=a.Bb}},
-G:function(){var z,y,x
-z=this.lT
-if(this.qT!==z.qT)throw H.b(P.a4(z))
-y=this.Jt
-if(y.length===0){this.ya=null
-return!1}if(z.bb!==this.bb&&this.ya!=null){x=this.ya
-C.Nm.sB(y,0)
-if(x==null)this.Az(z.aY)
-else{z.vh(x.G3)
-this.Az(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
-z=y.pop()
-this.ya=z
-this.Az(z.T8)
-return!0},
-Qf:function(a,b){this.Az(a.aY)}},
-nF:{
-"^":"mW;lT",
-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.oz]),z.qT,z.bb,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.Kp(this,0))
-return y},
-$isyN:true},
-ro:{
-"^":"mW;Fb",
-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.oz]),z.qT,z.bb,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.Kp(this,1))
-return y},
-$asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
-$isyN:true},
-DN:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a.G3}},
-ZM:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a.P},
-$asS6B:function(a,b){return[b]}},
-HW:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a},
-$asS6B:function(a){return[[P.oz,a]]}}}],["dart.convert","dart:convert",,P,{
-"^":"",
-VQ: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
-if(typeof x!=="string")throw H.b(P.u(a))
-z=null
-try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
-y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
-NC:[function(a){return a.Lt()},"$1","bx",2,0,49,50],
-hW:{
-"^":"Tp:77;",
-$2:function(a,b){return b},
-$isEH:true},
-f1:{
-"^":"Tp:13;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
-for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
-return z}w=Object.keys(a)
-v=P.Fl(null,null)
-for(y=this.a,x=0;x<w.length;++x){u=w[x]
-v.u(0,u,y.$2(u,this.$1(a[u])))}t=a.__proto__
-if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.$2("__proto__",this.$1(t)))
-return v},
-$isEH:true},
-Ukr:{
-"^":"a;"},
-zF:{
-"^":"a;"},
-Ziv:{
-"^":"Ukr;",
-$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
-AJ:{
-"^":"XS;Ct,FN",
-bu:function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
-else return"Converting object did not return an encodable object."},
-static:{Gy:function(a,b){return new P.AJ(a,b)}}},
-K8:{
-"^":"AJ;Ct,FN",
-bu:function(a){return"Cyclic error in JSON stringify"},
-static:{TP:function(a){return new P.K8(a,null)}}},
-pE:{
-"^":"Ukr;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()
-return P.Vg(a,z.SI,z.UM)},
-KP:function(a){return this.Q0(a,null)},
-gZE:function(){return C.Sr},
-gHe:function(){return C.A3},
-$asUkr:function(){return[P.a,P.qU]}},
-ojF:{
-"^":"zF;UM,SI",
-$aszF:function(){return[P.a,P.qU]}},
-c5:{
-"^":"zF;qa<",
-$aszF:function(){return[P.qU,P.a]}},
-Sh:{
-"^":"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.p8
-w=0
-v=0
-for(;v<y;++v){u=z.j(a,v)
-if(u>92)continue
-if(u<32){if(v>w){t=z.Nj(a,w,v)
-x.vM+=t}w=v+1
-t=H.Lw(92)
-x.vM+=t
-switch(u){case 8:t=H.Lw(98)
-x.vM+=t
-break
-case 9:t=H.Lw(116)
-x.vM+=t
-break
-case 10:t=H.Lw(110)
-x.vM+=t
-break
-case 12:t=H.Lw(102)
-x.vM+=t
-break
-case 13:t=H.Lw(114)
-x.vM+=t
-break
-default:t=H.Lw(117)
-x.vM+=t
-t=H.Lw(48)
-x.vM+=t
-t=H.Lw(48)
-x.vM+=t
-t=u>>>4&15
-t=H.Lw(t<10?48+t:87+t)
-x.vM+=t
-t=u&15
-t=H.Lw(t<10?48+t:87+t)
-x.vM+=t
-break}}else if(u===34||u===92){if(v>w){t=z.Nj(a,w,v)
-x.vM+=t}w=v+1
-t=H.Lw(92)
-x.vM+=t
-t=H.Lw(u)
-x.vM+=t}}if(w===0)x.vM+=typeof a==="string"?a:H.d(a)
-else if(w<y){z=z.Nj(a,w,y)
-x.vM+=z}},
-WD:function(a){var z,y,x,w
-for(z=this.ol,y=z.length,x=0;x<y;++x){w=z[x]
-if(a==null?w==null:a===w)throw H.b(P.TP(a))}z.push(a)},
-C7:function(a){var z,y,x,w
-if(!this.IS(a)){this.WD(a)
-try{z=this.iY(a)
-if(!this.IS(z)){x=P.Gy(a,null)
-throw H.b(x)}x=this.ol
-if(0>=x.length)return H.e(x,0)
-x.pop()}catch(w){x=H.Ru(w)
-y=x
-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.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.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.p8
-y.KF("{")
-for(w=J.mY(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
-y.vM+=v
-this.Ip(u)
-y.vM+="\":"
-this.C7(z.t(a,u))}y.KF("}")
-this.pg(a)
-return!0}else return!1}},
-pg:function(a){var z=this.ol
-if(0>=z.length)return H.e(z,0)
-z.pop()},
-static:{"^":"Gsm,hyY,IE,Jyf,NoV,HVe,tF,BLm,KQz,i6,ql,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
-b=P.bx()
-z=P.p9("")
-P.xl(z,b,c).C7(a)
-return z.vM}}},
-u5F:{
-"^":"Ziv;Iy",
-goc:function(a){return"utf-8"},
-gZE:function(){return new P.om()}},
-om:{
-"^":"zF;",
-WJ:function(a){var z,y,x
-z=J.U6(a)
-y=J.vX(z.gB(a),3)
-if(typeof y!=="number")return H.s(y)
-y=Array(y)
-y.fixed$length=init
-y=H.VM(y,[P.KN])
-x=new P.Yu(0,0,y)
-if(x.rw(a,0,z.gB(a))!==z.gB(a))x.I7(z.j(a,J.bI(z.gB(a),1)),0)
-return C.Nm.aM(y,0,x.L8)},
-$aszF:function(){return[P.qU,[P.WO,P.KN]]}},
-Yu:{
-"^":"a;aQ,L8,IT",
-I7:function(a,b){var z,y,x,w,v
-z=this.IT
-y=this.L8
-if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
-w=y+1
-this.L8=w
-v=z.length
-if(y>=v)return H.e(z,y)
-z[y]=(240|x>>>18)>>>0
-y=w+1
-this.L8=y
-if(w>=v)return H.e(z,w)
-z[w]=128|x>>>12&63
-w=y+1
-this.L8=w
-if(y>=v)return H.e(z,y)
-z[y]=128|x>>>6&63
-this.L8=w+1
-if(w>=v)return H.e(z,w)
-z[w]=128|x&63
-return!0}else{w=y+1
-this.L8=w
-v=z.length
-if(y>=v)return H.e(z,y)
-z[y]=224|a>>>12
-y=w+1
-this.L8=y
-if(w>=v)return H.e(z,w)
-z[w]=128|a>>>6&63
-this.L8=y+1
-if(y>=v)return H.e(z,y)
-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.Pp(a,J.bI(c,1))&64512)===55296)c=J.bI(c,1)
-if(typeof c!=="number")return H.s(c)
-z=this.IT
-y=z.length
-x=J.rY(a)
-w=b
-for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.L8
-if(u>=y)break
-this.L8=u+1
-z[u]=v}else if((v&64512)===55296){if(this.L8+3>=y)break
-t=w+1
-if(this.I7(v,x.j(a,t)))w=t}else if(v<=2047){u=this.L8
-s=u+1
-if(s>=y)break
-this.L8=s
-if(u>=y)return H.e(z,u)
-z[u]=192|v>>>6
-this.L8=s+1
-z[s]=128|v&63}else{u=this.L8
-if(u+2>=y)break
-s=u+1
-this.L8=s
-if(u>=y)return H.e(z,u)
-z[u]=224|v>>>12
-u=s+1
-this.L8=u
-if(s>=y)return H.e(z,s)
-z[s]=128|v>>>6&63
-this.L8=u+1
-if(u>=y)return H.e(z,u)
-z[u]=128|v&63}}return w},
-static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
-"^":"",
-Te:function(a){return},
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,51,46,47],
-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("")
-z.vM="\""
-for(y=a.length,x=0,w="\"";x<y;++x){v=C.xB.j(a,x)
-if(v<=31)if(v===10)w=z.vM+="\\n"
-else if(v===13)w=z.vM+="\\r"
-else if(v===9)w=z.vM+="\\t"
-else{w=z.vM+="\\x"
-if(v<16)z.vM=w+"0"
-else{z.vM=w+"1"
-v-=16}w=H.Lw(v<10?48+v:87+v)
-w=z.vM+=w}else if(v===92)w=z.vM+="\\\\"
-else if(v===34)w=z.vM+="\\\""
-else{w=H.Lw(v)
-w=z.vM+=w}}y=w+"\""
-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","N3R",4,0,52],
-xv:[function(a){return H.CU(a)},"$1","J2K",2,0,53],
-O8:function(a,b,c){var z,y,x
-z=J.Zz(a,c)
-if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
-return z},
-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,y
-z=H.d(a)
-y=$.oK
-if(y==null)H.qw(z)
-else y.$1(z)},
-qa:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.u(0,a.gfN(a),b)},
-$isEH:true},
-CL:{
-"^":"Tp:122;a",
-$2:function(a,b){var z=this.a
-if(z.b>0)z.a.KF(", ")
-z.a.KF(J.GL(a))
-z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},
-$isEH:true},
-a2:{
-"^":"a;",
-$isa2:true},
-"+bool":0,
-Rz:{
-"^":"a;"},
-iP:{
-"^":"a;y3<,aL",
-n:function(a,b){if(b==null)return!1
-if(!J.x(b).$isiP)return!1
-return J.xC(this.y3,b.y3)&&this.aL===b.aL},
-iM:function(a,b){return J.oE(this.y3,b.gy3())},
-giO:function(a){return this.y3},
-bu:function(a){var z,y,x,w,v,u,t,s
-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(J.ew(this.y3,b.gVs()),this.aL)},
-EK:function(){H.o2(this)},
-RM:function(a,b){if(J.yH(a)>8640000000000000)throw H.b(P.u(a))},
-$isiP:true,
-static:{"^":"bS,Vp8,Hq,Kw,h2,KL,EQe,NXt,Hm,Xs,Fz,cRS,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,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
-if(1>=x.length)return H.e(x,1)
-w=H.BU(x[1],null,null)
-if(2>=x.length)return H.e(x,2)
-v=H.BU(x[2],null,null)
-if(3>=x.length)return H.e(x,3)
-u=H.BU(x[3],null,null)
-if(4>=x.length)return H.e(x,4)
-t=y.$1(x[4])
-if(5>=x.length)return H.e(x,5)
-s=y.$1(x[5])
-if(6>=x.length)return H.e(x,6)
-r=y.$1(x[6])
-if(7>=x.length)return H.e(x,7)
-q=J.LL(J.vX(new P.Rq().$1(x[7]),1000))
-if(q===1000){p=!0
-q=999}else p=!1
-o=x.length
-if(8>=o)return H.e(x,8)
-if(x[8]!=null){if(9>=o)return H.e(x,9)
-o=x[9]
-if(o!=null){n=J.xC(o,"-")?-1:1
-if(10>=x.length)return H.e(x,10)
-m=H.BU(x[10],null,null)
-if(11>=x.length)return H.e(x,11)
-l=y.$1(x[11])
-if(typeof m!=="number")return H.s(m)
-l=J.ew(l,60*m)
-if(typeof l!=="number")return H.s(l)
-s=J.bI(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)
-return z},Gq:function(a){var z,y
-z=Math.abs(a)
-y=a<0?"-":""
-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)},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:{
-"^":"Tp:123;",
-$1:function(a){if(a==null)return 0
-return H.BU(a,null,null)},
-$isEH:true},
-Rq:{
-"^":"Tp:124;",
-$1:function(a){if(a==null)return 0
-return H.RR(a,null)},
-$isEH:true},
-CP:{
-"^":"FK;",
-$isCP:true},
-"+double":0,
-a6:{
-"^":"a;Fq<",
-g:function(a,b){return P.ii(0,0,this.Fq+b.gFq(),0,0,0)},
-W:function(a,b){return P.ii(0,0,this.Fq-b.gFq(),0,0,0)},
-U:function(a,b){if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},
-Z:function(a,b){if(J.xC(b,0))throw H.b(P.ts())
-if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.Z(this.Fq,b),0,0,0)},
-C:function(a,b){return this.Fq<b.gFq()},
-D:function(a,b){return this.Fq>b.gFq()},
-E:function(a,b){return this.Fq<=b.gFq()},
-F:function(a,b){return this.Fq>=b.gFq()},
-gVs:function(){return C.CD.cU(this.Fq,1000)},
-n:function(a,b){if(b==null)return!1
-if(!J.x(b).$isa6)return!1
-return this.Fq===b.Fq},
-giO:function(a){return this.Fq&0x1FFFFFFF},
-iM:function(a,b){return C.CD.iM(this.Fq,b.gFq())},
-bu:function(a){var z,y,x,w,v
-z=new P.DW()
-y=this.Fq
-if(y<0)return"-"+P.ii(0,0,-y,0,0,0).bu(0)
-x=z.$1(C.CD.JV(C.CD.cU(y,60000000),60))
-w=z.$1(C.CD.JV(C.CD.cU(y,1000000),60))
-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:{"^":"Bp7,v7,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,MV,IJZ,D9,Wr,fm,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:{
-"^":"Tp:15;",
-$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)
-if(a>=100)return"000"+H.d(a)
-if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},
-$isEH:true},
-DW:{
-"^":"Tp:15;",
-$1:function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},
-$isEH:true},
-XS:{
-"^":"a;",
-gI4:function(){return new H.XO(this.$thrownJsError,null)},
-$isXS:true},
-LK:{
-"^":"XS;",
-bu:function(a){return"Throw of null."}},
-AT:{
-"^":"XS;G1>",
-bu:function(a){var z=this.G1
-if(z!=null)return"Illegal argument(s): "+H.d(z)
-return"Illegal argument(s)"},
-static:{u:function(a){return new P.AT(a)}}},
-Sn:{
-"^":"AT;G1",
-bu:function(a){return"RangeError: "+H.d(this.G1)},
-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:{EY:function(){return new P.Np()}}},
-JS:{
-"^":"XS;uF,UP,mP,SA,vG",
-bu:function(a){var z,y,x,w,v,u
-z={}
-z.a=P.p9("")
-z.b=0
-for(y=this.mP,x=0;w=y.length,x<w;x=++z.b){if(x>0){v=z.a
-v.vM+=", "}v=z.a
-if(x<0)return H.e(y,x)
-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+"]"},
-$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)}}},
-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.rM(a)}}},
-lj:{
-"^":"XS;G1>",
-bu:function(a){return"Bad state: "+this.G1},
-static:{w:function(a){return new P.lj(a)}}},
-UV:{
-"^":"XS;YA",
-bu:function(a){var z=this.YA
-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)}}},
-qn:{
-"^":"a;",
-bu:function(a){return"Out of Memory"},
-gI4:function(){return},
-$isXS:true},
-KY:{
-"^":"a;",
-bu:function(a){return"Stack Overflow"},
-gI4:function(){return},
-$isXS:true},
-t7:{
-"^":"XS;Wo",
-bu:function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},
-static:{Gz:function(a){return new P.t7(a)}}},
-HG:{
-"^":"a;G1>",
-bu:function(a){var z=this.G1
-if(z==null)return"Exception"
-return"Exception: "+H.d(z)}},
-oe:{
-"^":"a;G1>",
-bu:function(a){return"FormatException: "+H.d(this.G1)},
-static:{cD:function(a){return new P.oe(a)}}},
-eV:{
-"^":"a;",
-bu:function(a){return"IntegerDivisionByZeroException"},
-static:{ts:function(){return new P.eV()}}},
-qo:{
-"^":"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())},
-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.J4(),c)},
-J4:function(){var z,y
-z=H.of(this,"expando$key")
-if(z==null){y=$.Km
-$.Km=y+1
-z="expando$key$"+y
-H.wV(this,"expando$key",z)}return z},
-static:{"^":"Bq,rly,Km"}},
-EH:{
-"^":"a;",
-$isEH:true},
-KN:{
-"^":"FK;",
-$isKN:true},
-"+int":0,
-QV:{
-"^":"a;",
-$isQV:true,
-$asQV:null},
-Dk:{
-"^":"a;"},
-WO:{
-"^":"a;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-"+List":0,
-Z0:{
-"^":"a;",
-$isZ0:true},
-c8:{
-"^":"a;",
-bu:function(a){return"null"}},
-"+Null":0,
-FK:{
-"^":"a;",
-$isFK:true},
-"+num":0,
-a:{
-"^":";",
-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.gVm(),null))},
-gbx:function(a){return new H.cu(H.dJ(this),null)},
-$isa:true},
-ns:{
-"^":"a;",
-$isns:true},
-mE:{
-"^":"a;"},
-VV:{
-"^":"a;dI,yz,wj",
-wE:function(a){var z,y,x
-z=this.yz==null
-if(!z&&this.wj==null)return
-if(z)this.yz=H.Ms()
-else{z=H.Ms()
-y=this.wj
-x=this.yz
-if(typeof y!=="number")return y.W()
-if(typeof x!=="number")return H.s(x)
-this.yz=z-(y-x)
-this.wj=null}}},
-qU:{
-"^":"a;",
-$isqU:true},
-"+String":0,
-WU:{
-"^":"a;Cb,R7,C3,Wn",
-gl:function(){return this.Wn},
-G:function(){var z,y,x,w,v,u
-z=this.C3
-this.R7=z
-y=this.Cb
-x=y.length
-if(z===x){this.Wn=null
-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
-this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
-return!0}}this.C3=v
-this.Wn=w
-return!0}},
-Rn:{
-"^":"a;vM<",
-gB:function(a){return this.vM.length},
-gl0:function(a){return this.vM.length===0},
-gor:function(a){return this.vM.length!==0},
-KF:function(a){this.vM+=typeof a==="string"?a:H.d(a)},
-We:function(a,b){var z,y
-z=J.mY(a)
-if(!z.G())return
-if(b.length===0)do{y=z.gl()
-this.vM+=typeof y==="string"?y:H.d(y)}while(z.G())
-else{this.KF(z.gl())
-for(;z.G();){this.vM+=b
-y=z.gl()
-this.vM+=typeof y==="string"?y:H.d(y)}}},
-V1:function(a){this.vM=""},
-bu:function(a){return this.vM},
-PD:function(a){if(typeof a==="string")this.vM=a
-else this.KF(a)},
-static:{p9:function(a){var z=new P.Rn("")
-z.PD(a)
-return z}}},
-GD:{
-"^":"a;",
-$isGD:true},
-uq:{
-"^":"a;",
-$isuq:true},
-q5:{
-"^":"a;Bo,IE,pO,Fi,ku,tP,BJ,hO,lH",
-gJf:function(a){var z
-if(C.xB.nC(this.Bo,"[")){z=this.Bo
-return C.xB.Nj(z,1,z.length-1)}return this.Bo},
-gkb:function(a){var z
-if(J.xC(this.IE,0)){z=this.Fi
-if(z==="http")return 80
-if(z==="https")return 443}return this.IE},
-gIi:function(a){return this.pO},
-x6:function(a,b){var z,y
-z=a==null
-if(z&&!0)return""
-z=!z
-if(z);y=z?P.Xc(a):C.jN.ez(b,new P.uF()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
-return y},
-Ky:function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
-K2:function(a){if(a.length>0&&J.Pp(a,0)===58)return!0
-return J.R7(a,"/.")!==-1},
-KO:function(a){var z,y,x,w,v
-if(!this.K2(a))return a
-z=[]
-for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=!1;y.G();){w=y.lo
-if(J.xC(w,"..")){v=z.length
-if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
-v=!J.xC(z[0],"")}else v=!0
-else v=!1
-if(v){if(0>=z.length)return H.e(z,0)
-z.pop()}x=!0}else if("."===w)x=!0
-else{z.push(w)
-x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},
-bu:function(a){var z,y
-z=P.p9("")
-y=this.Fi
-if(""!==y){z.KF(y)
-z.KF(":")}if(this.gJf(this)!==""||y==="file"){z.KF("//")
-y=this.ku
-if(""!==y){z.KF(y)
-z.KF("@")}z.KF(this.Bo)
-if(!J.xC(this.IE,0)){z.KF(":")
-z.KF(J.AG(this.IE))}}z.KF(this.pO)
-y=this.tP
-if(""!==y){z.KF("?")
-z.KF(y)}y=this.BJ
-if(""!==y){z.KF("#")
-z.KF(y)}return z.vM},
-n:function(a,b){var z,y,x
-if(b==null)return!1
-z=J.x(b)
-if(!z.$isq5)return!1
-y=this.Fi
-x=b.Fi
-if(y==null?x==null:y===x)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.xC(this.gkb(this),z.gkb(b))){z=this.pO
-y=b.pO
-if(z==null?y==null:z===y){z=this.tP
-y=b.tP
-if(z==null?y==null:z===y){z=this.BJ
-y=b.BJ
-y=z==null?y==null:z===y
-z=y}else z=!1}else z=!1}else z=!1
-else z=!1
-else z=!1
-else z=!1
-return z},
-giO:function(a){var z=new P.XZ()
-return z.$2(this.Fi,z.$2(this.ku,z.$2(this.gJf(this),z.$2(this.gkb(this),z.$2(this.pO,z.$2(this.tP,z.$2(this.BJ,1)))))))},
-n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.xC(e,80))this.IE=0
-else if(h==="https"&&J.xC(e,443))this.IE=0
-else this.IE=e
-this.pO=this.x6(c,d)},
-$isq5:true,
-static:{"^":"QqF,q7,rU,v5,vI,ilf,Imi,IL,Bd,XrJ,G9,fC,O5i,FsP,j3,mo,u0I,TGN,Yk,Qxt,lL,Bx,Hiw,H5,zst,VFG,nJd,Sp,GPf,JA7,wo,xd,fbQ",hK:function(a0){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a
-x=new P.jY()
-w=new P.Uo(a0)
-v=a0.length
-if(v===0)return P.Wo("","",null,null,0,null,null,null,"")
-if(J.Pp(a0,0)!==47)for(u=0;t=0,u<v;u=s){s=u+1
-if(u>=v)H.vh(P.N(u))
-r=a0.charCodeAt(u)
-if(r<128){q=r>>>4
-if(q>=8)return H.e(C.NL,q)
-q=(C.NL[q]&C.jn.W4(1,r&15))!==0}else q=!1
-if(!q){if(r===58){t=s
-u=t}else{u=s-1
-t=0}break}}else{u=0
-t=0}if(t===u){q=t+1
-q=q<v&&C.xB.j(a0,t)===47&&C.xB.j(a0,q)===47}else q=!1
-if(q){p=t+2
-for(o=-1;q=J.Wx(p),n=-1,q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(J.xC(o,-1)&&r===58);else{q=r===64||r===58
-p=m-1
-if(q){n=C.xB.XU(a0,"@",p)
-if(n===-1){p=u
-break}p=n+1
-for(o=-1;q=J.Wx(p),q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(r===58){if(!J.xC(o,-1))throw H.b(P.cD("Double port in host"))}else{p=m-1
-break}p=m
-o=p}else p=m}break}else{n=-1
-break}}p=m
-o=p}else p=m}}else{p=t
-n=-1
-o=-1}for(l=p;x=J.Wx(l),x.C(l,v);l=k){k=x.g(l,1)
-if(typeof l!=="number"||Math.floor(l)!==l)H.vh(P.u(l))
-if(x.C(l,0))H.vh(P.N(l))
-if(x.F(l,v))H.vh(P.N(l))
-r=a0.charCodeAt(l)
-if(r===63||r===35){l=k-1
-break}}x=J.Wx(l)
-if(x.C(l,v)&&C.xB.j(a0,l)===63)for(j=l;w=J.Wx(j),w.C(j,v);j=i){i=w.g(j,1)
-if(typeof j!=="number"||Math.floor(j)!==j)H.vh(P.u(j))
-if(w.C(j,0))H.vh(P.N(j))
-if(w.F(j,v))H.vh(P.N(j))
-if(a0.charCodeAt(j)===35){j=i-1
-break}}else j=l
-h=t>0?C.xB.Nj(a0,0,t-1):null
-z=0
-if(t!==p){g=t+2
-if(n>0){f=C.xB.Nj(a0,g,n)
-g=n+1}else f=""
-w=J.Wx(o)
-if(w.D(o,0)){y=C.xB.Nj(a0,o,p)
-try{z=H.BU(y,null,null)}catch(e){H.Ru(e)
-throw H.b(P.cD("Invalid port: '"+H.d(y)+"'"))}d=C.xB.Nj(a0,g,w.W(o,1))}else d=C.xB.Nj(a0,g,p)}else{d=""
-f=""}c=C.xB.Nj(a0,p,l)
-b=x.C(l,j)?C.xB.Nj(a0,x.g(l,1),j):""
-x=J.Wx(j)
-a=x.C(j,v)?C.xB.Nj(a0,x.g(j,1),v):""
-return P.Wo(a,d,c,null,z,b,null,h,f)},Wo:function(a,b,c,d,e,f,g,h,i){var z=P.Wf(h)
-z=new P.q5(P.mA(b),null,null,z,i,P.LE(f,g),P.o6(a),null,null)
-z.n3(a,b,c,d,e,f,g,h,i)
-return z},mA:function(a){var z,y
-if(a.length===0)return a
-if(C.xB.j(a,0)===91){z=a.length-1
-if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
-P.Uw(C.xB.Nj(a,1,z))
-return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
-if(a.charCodeAt(y)===58){P.Uw(a)
-return"["+a+"]"}}return a},Wf:function(a){var z,y,x,w,v,u
-z=new P.QU()
-if(a==null)return""
-y=a.length
-for(x=!0,w=0;w<y;++w){if(w>=y)H.vh(P.N(w))
-v=a.charCodeAt(w)
-if(w===0){if(!(v>=97&&v<=122))u=v>=65&&v<=90
-else u=!0
-u=!u}else u=!1
-if(u)throw H.b(P.u("Illegal scheme: "+a))
-if(z.$1(v)!==!0){if(v<128){u=v>>>4
-if(u>=8)return H.e(C.NL,u)
-u=(C.NL[u]&C.jn.W4(1,v&15))!==0}else u=!1
-if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},LE:function(a,b){var z,y,x
-z={}
-y=a==null
-if(y&&!0)return""
-y=!y
-if(y);if(y)return P.Xc(a)
-x=P.p9("")
-z.a=!0
-C.jN.aN(b,new P.yZ(z,x))
-return x.vM},o6:function(a){if(a==null)return""
-return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z={}
-y=J.U6(a).u8(a,"%")
-z.a=y
-if(y<0)return a
-x=new P.Al()
-w=new P.KM()
-v=new P.wm(a,x,new P.tS())
-u=new P.QE(a)
-z.b=null
-t=a.length
-z.c=0
-s=new P.YP(z,a)
-for(r=y;r<t;){if(t<r+2)throw H.b(P.u("Invalid percent-encoding in URI component: "+a))
-q=C.xB.j(a,r+1)
-p=C.xB.j(a,z.a+2)
-o=u.$1(z.a+1)
-if(x.$1(q)===!0&&x.$1(p)===!0&&w.$1(o)!==!0)r=z.a+=3
-else{s.$0()
-r=w.$1(o)
-n=z.b
-if(r===!0){n.toString
-r=H.Lw(o)
-n.vM+=r}else{n.toString
-n.vM+="%"
-r=v.$1(z.a+1)
-n.toString
-r=H.Lw(r)
-n.vM+=r
-r=z.b
-n=v.$1(z.a+2)
-r.toString
-n=H.Lw(n)
-r.vM+=n}r=z.a+=3
-z.c=r}m=C.xB.XU(a,"%",r)
-if(m>=z.a){z.a=m
-r=m}else{z.a=t
-r=t}}if(z.b==null)return a
-if(z.c!==r)s.$0()
-return J.AG(z.b)},Dy:function(a){var z,y
-z=new P.JV()
-y=a.split(".")
-if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.Nw(z)),[null,null]).br(0)},Uw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=new P.x8()
-y=new P.JT(a,z)
-if(J.q8(a)<2)z.$1("address is too short")
-x=[]
-w=0
-u=!1
-t=0
-while(!0){s=J.q8(a)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-s=a
-r=J.q8(s)
-if(typeof r!=="number")return H.s(r)
-if(t>=r)H.vh(P.N(t))
-if(s.charCodeAt(t)===58){if(t===0){++t
-s=a
-if(t>=J.q8(s))H.vh(P.N(t))
-if(s.charCodeAt(t)!==58)z.$1("invalid start colon.")
-w=t}if(t===w){if(u)z.$1("only one wildcard `::` is allowed")
-J.bi(x,-1)
-u=!0}else J.bi(x,y.$2(w,t))
-w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
-q=J.xC(w,J.q8(a))
-p=J.xC(J.MQ(x),-1)
-if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.bi(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
-try{v=P.Dy(J.ZZ(a,w))
-s=J.lf(J.UQ(v,0),8)
-r=J.UQ(v,1)
-if(typeof r!=="number")return H.s(r)
-J.bi(x,(s|r)>>>0)
-r=J.lf(J.UQ(v,2),8)
-s=J.UQ(v,3)
-if(typeof s!=="number")return H.s(s)
-J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
-z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
-s=new H.oA(x,new P.d9(x))
-s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},jW:function(a,b,c,d){var z,y,x,w,v,u,t
-z=new P.rI()
-y=P.p9("")
-x=c.gZE().WJ(b)
-for(w=0;w<x.length;++w){v=x[w]
-u=J.Wx(v)
-if(u.C(v,128)){t=u.m(v,4)
-if(t>=8)return H.e(a,t)
-t=(a[t]&C.jn.W4(1,u.i(v,15)))!==0}else t=!1
-if(t){u=H.Lw(v)
-y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
-y.vM+=u}else{u=H.Lw(37)
-y.vM+=u
-z.$2(v,y)}}return y.vM}}},
-jY:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.aa,z)
-z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-Uo:{
-"^":"Tp:126;a",
-$1:function(a){a=J.G0(this.a,"]",a)
-if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},
-$isEH:true},
-QU:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.rs,z)
-z=(C.rs[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-uF:{
-"^":"Tp:13;",
-$1:function(a){return P.jW(C.ZJ,a,C.xM,!1)},
-$isEH:true},
-yZ:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z=this.a
-if(!z.a)this.b.KF("&")
-z.a=!1
-z=this.b
-z.KF(P.jW(C.B2,a,C.xM,!0))
-b.gl0(b)
-z.KF("=")
-z.KF(P.jW(C.B2,b,C.xM,!0))},
-$isEH:true},
-Al:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(!(48<=a&&a<=57))z=65<=a&&a<=70
-else z=!0
-return z},
-$isEH:true},
-tS:{
-"^":"Tp:125;",
-$1:function(a){return 97<=a&&a<=102},
-$isEH:true},
-KM:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(a<128){z=C.jn.GG(a,4)
-if(z>=8)return H.e(C.B2,z)
-z=(C.B2[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-wm:{
-"^":"Tp:126;b,c,d",
-$1:function(a){var z,y
-z=this.b
-y=J.Pp(z,a)
-if(this.d.$1(y)===!0)return y-32
-else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},
-$isEH:true},
-QE:{
-"^":"Tp:126;e",
-$1:function(a){var z,y,x,w,v
-for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
-if(48<=v&&v<=57)x=x*16+v-48
-else{v|=32
-if(97<=v&&v<=102)x=x*16+v-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return x},
-$isEH:true},
-YP:{
-"^":"Tp:18;a,f",
-$0:function(){var z,y,x,w,v
-z=this.a
-y=z.b
-x=z.c
-w=this.f
-v=z.a
-if(y==null)z.b=P.p9(J.Nj(w,x,v))
-else y.KF(J.Nj(w,x,v))},
-$isEH:true},
-XZ:{
-"^":"Tp:127;",
-$2:function(a,b){var z=J.v1(a)
-if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},
-$isEH:true},
-JV:{
-"^":"Tp:43;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
-$isEH:true},
-Nw:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y
-z=H.BU(a,null,null)
-y=J.Wx(z)
-if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,128,"call"],
-$isEH:true},
-x8:{
-"^":"Tp:43;",
-$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
-$isEH:true},
-JT:{
-"^":"Tp:88;a,b",
-$2:function(a,b){var z,y
-if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
-z=H.BU(C.xB.Nj(this.a,a,b),16,null)
-y=J.Wx(z)
-if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
-return z},
-$isEH:true},
-d9:{
-"^":"Tp:13;c",
-$1:function(a){var z=J.x(a)
-if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},
-$isEH:true},
-rI:{
-"^":"Tp:77;",
-$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,{
-"^":"",
-H9:function(a,b,c,d){var z,y,x
-z=document.createEvent("CustomEvent")
-J.QD(z,d)
-if(!J.x(d).$isWO)if(!J.x(d).$isZ0){y=d
-if(typeof y!=="string"){y=d
-y=typeof y==="number"}else y=!0}else y=!0
-else y=!0
-if(y)try{d=P.bL(d)
-J.avD(z,a,b,c,d)}catch(x){H.Ru(x)
-J.avD(z,a,b,c,null)}else J.avD(z,a,b,c,null)
-return z},
-r3:function(a,b){return document.createElement(a)},
-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.kP(x,"GET",a,!0)
-e.aN(0,new W.bU(x))
-z=H.VM(new W.RO(x,C.LF.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(new W.Tf(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.Ov(0,z.DK,z.Ph,W.aF(y.gyr()),z.Sg),[H.Kp(z,0)]).Zz()
-x.send()
-return y.MM},
-ED:function(a){var z,y
-z=document.createElement("input",null)
-if(a!=null)try{J.iM(z,a)}catch(y){H.Ru(y)}return z},
-VC:function(a,b){a=536870911&a+b
-a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-Pv:function(a){if(a==null)return
-return W.P1(a)},
-qc:function(a){var z
-if(a==null)return
-if("setInterval" in a){z=W.P1(a)
-if(!!J.x(z).$isPZ)return z
-return}else return a},
-ju:function(a){return a},
-Z9:function(a){if(!!J.x(a).$isQF)return a
-return P.o7(a,!0)},
-Gi:function(a,b){return new W.uY(a,b)},
-w6:[function(a){return J.N1(a)},"$1","B4",2,0,13,54],
-Hx:[function(a){return J.Z2(a)},"$1","HM",2,0,13,54],
-zI:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","QN",8,0,55,54,56,57,58],
-Ct:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
-z=J.Xr(d)
-if(z==null)throw H.b(P.u(d))
-y=z.prototype
-x=J.KE(d,"created")
-if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.m0(W.r3("article",null))
-w=z.$nativeSuperclassTag
-if(w==null)throw H.b(P.u(d))
-v=e==null
-if(v){if(!J.xC(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
-u=a[w]
-t={}
-t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Gi(x,y),1))}
-t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.B4(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.HM(),1))}
-t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.QN(),4))}
-s=Object.create(u.prototype,t)
-r=H.Va(y)
-Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
-q={prototype:s}
-if(!v)q.extends=e
-b.registerElement(c,q)},
-aF:function(a){if(J.xC($.X3,C.NU))return a
-if(a==null)return
-return $.X3.Nf(a,!0)},
-Fs:function(a){if(J.xC($.X3,C.NU))return a
-return $.X3.up(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|Ao|xc|LPc|hV|uL|Vc|G6|pv|xI|eW|Vfx|eo|Dsd|aC|VY|tuj|Be|Xfs|JI|Vct|ZP|D13|nJ|SaM|Eg|i7|WZq|Gk|pva|Nr|cda|MJ|T53|DK|waa|BS|V4|Vb|V10|Ly|pR|V11|hx|V12|L4|Mb|V13|mO|DE|V14|U1|V15|H8|WS|qh|V16|oF|V17|Q6|uE|V18|Zn|V19|n5|V20|Ma|wN|V21|ds|V22|ou|ZzR|av|V23|uz|V24|kK|oa|V25|St|V26|IW|V27|Qh|V28|Oz|V29|Z4|V30|qk|V31|vj|LU|V32|CX|V33|md|V34|Bm|V35|Ya|V36|Ww|ye|V37|G1|V38|fl|V39|UK|V40|wM|V41|F1|V42|ov|oEY|kn|V43|fI|V44|zM|V45|Rk|V46|Ti|KAf|CY|V47|nm|V48|uw|I5|V49|el"},
-Yyn:{
-"^":"Gv;",
-$isWO:true,
-$asWO:function(){return[W.QI]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.QI]},
-"%":"EntryArray"},
-Ps:{
-"^":"Bo;N:target=,t5:type%,mH:href%,yv:protocol=",
-bu:function(a){return a.toString()},
-"%":"HTMLAnchorElement"},
-fY:{
-"^":"Bo;N:target=,mH:href%,yv:protocol=",
-bu:function(a){return a.toString()},
-"%":"HTMLAreaElement"},
-rZg:{
-"^":"Bo;mH:href%,N:target=",
-"%":"HTMLBaseElement"},
-O4:{
-"^":"Gv;t5:type=",
-$isO4:true,
-"%":";Blob"},
-Fy:{
-"^":"Bo;",
-$isPZ:true,
-"%":"HTMLBodyElement"},
-Ox:{
-"^":"Bo;MB:form=,oc:name%,t5:type%,P:value%",
-"%":"HTMLButtonElement"},
-Ny:{
-"^":"Bo;fg:height},R:width}",
-gVE:function(a){return a.getContext("2d")},
-"%":"HTMLCanvasElement"},
-Oi:{
-"^":"Gv;",
-"%":";CanvasRenderingContext"},
-Gcw:{
-"^":"Oi;",
-A8:function(a,b,c,d,e,f,g,h){var z
-if(g!=null)z=!0
-else z=!1
-if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
-return}throw H.b(P.u("Incorrect number or type of arguments"))},
-"%":"CanvasRenderingContext2D"},
-nx:{
-"^":"KV;Rn:data=,B:length=,Wq:nextElementSibling=",
-"%":"Comment;CharacterData"},
-QQS:{
-"^":"ea;tT:code=",
-"%":"CloseEvent"},
-di:{
-"^":"w6O;Rn:data=",
-"%":"CompositionEvent"},
-eC:{
-"^":"ea;M3:_dartDetail}",
-gey:function(a){var z=a._dartDetail
-if(z!=null)return z
-return P.o7(a.detail,!0)},
-dF:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
-$iseC:true,
-"%":"CustomEvent"},
-Q3:{
-"^":"Bo;",
-TR:function(a,b){return a.open.$1(b)},
-"%":"HTMLDetailsElement"},
-rV:{
-"^":"Bo;",
-TR:function(a,b){return a.open.$1(b)},
-"%":"HTMLDialogElement"},
-QF:{
-"^":"KV;",
-Xf:function(a){return a.createDocumentFragment()},
-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)},
-gEr: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.T1.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)},
-$isQF:true,
-"%":"XMLDocument;Document"},
-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.vD(a.querySelectorAll(b),null)},
-Wk:function(a,b){return a.querySelector(b)},
-"%":";DocumentFragment"},
-rz:{
-"^":"Gv;G1:message=,oc:name=",
-"%":";DOMError"},
-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()},
-$isBK:true,
-"%":"DOMException"},
-h4:{
-"^":"KV;mk:title},xr:className%,jO:id=,ns:tagName=,Wq:nextElementSibling=",
-gQg:function(a){return new W.E9(a)},
-gks:function(a){return new W.VG(a,a.children)},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-gDD:function(a){return new W.I4(a)},
-gD7:function(a){return P.T7(C.CD.yu(C.CD.UD(a.offsetLeft)),C.CD.yu(C.CD.UD(a.offsetTop)),C.CD.yu(C.CD.UD(a.offsetWidth)),C.CD.yu(C.CD.UD(a.offsetHeight)),null)},
-Es:function(a){},
-dQ:function(a){},
-wN:function(a,b,c,d){},
-gqn:function(a){return a.localName},
-gKD:function(a){return a.namespaceURI},
-bu:function(a){return a.localName},
-WO:function(a,b){if(!!a.matches)return a.matches(b)
-else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
-else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
-else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
-else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
-else throw H.b(P.f("Not supported on this platform"))},
-X3:function(a,b){var z=a
-do{if(J.RF(z,b))return!0
-z=z.parentElement}while(z!=null)
-return!1},
-er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
-gI:function(a){return new W.DM(a,a)},
-GE:function(a,b){return a.getAttribute(b)},
-Zi:function(a){return a.getBoundingClientRect()},
-Wk:function(a,b){return a.querySelector(b)},
-gEr:function(a){return H.VM(new W.eu(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.eu(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.eu(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.eu(a,C.uh.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.eu(a,C.Kq.Ph,!1),[null])},
-ZL:function(a){},
-$ish4:true,
-$isPZ:true,
-"%":";Element"},
-lC:{
-"^":"Bo;fg:height},oc:name%,t5:type%,R:width}",
-"%":"HTMLEmbedElement"},
-Ty:{
-"^":"ea;kc:error=,G1:message=",
-"%":"ErrorEvent"},
-ea:{
-"^":"Gv;It:_selector},Ii:path=,t5:type=",
-gCa:function(a){return W.qc(a.currentTarget)},
-gN:function(a){return W.qc(a.target)},
-e6:function(a){return a.preventDefault()},
-$isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
-PZ:{
-"^":"Gv;",
-gI:function(a){return new W.Jn(a)},
-YJ:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-BG:function(a,b,c){c=H.tR(c,1)
-return a.addEventListener(b,c)},
-H2:function(a,b){return a.dispatchEvent(b)},
-Si:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isPZ:true,
-"%":";EventTarget"},
-hD:{
-"^":"Bo;MB:form=,oc:name%,t5:type=",
-"%":"HTMLFieldSetElement"},
-hH:{
-"^":"O4;oc:name=",
-$ishH:true,
-"%":"File"},
-nS:{
-"^":"rz;tT:code=",
-"%":"FileError"},
-jH:{
-"^":"Bo;B:length=,oc:name%,N:target=",
-"%":"HTMLFormElement"},
-c4:{
-"^":"Gv;B:length=",
-"%":"History"},
-xnd:{
-"^":"ecX;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
-Vbi:{
-"^":"QF;",
-gQr:function(a){return a.head},
-smk:function(a,b){a.title=b},
-"%":"HTMLDocument"},
-fJ:{
-"^":"rk;xN:responseText=,pf:status=,po:statusText=",
-gbA:function(a){return W.Z9(a.response)},
-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"},
-GJ:{
-"^":"Bo;fg:height},oc:name%,R:width}",
-"%":"HTMLIFrameElement"},
-Sg:{
-"^":"Gv;Rn:data=,fg:height=,R:width=",
-$isSg:true,
-"%":"ImageData"},
-SL:{
-"^":"Bo;fg:height},R:width}",
-j3:function(a,b){return a.complete.$1(b)},
-"%":"HTMLImageElement"},
-Mi:{
-"^":"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,
-$ish4:true,
-$isPZ:true,
-$isKV:true,
-"%":"HTMLInputElement"},
-Gt:{
-"^":"w6O;GU:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-"%":"KeyboardEvent"},
-ttH:{
-"^":"Bo;MB:form=,oc:name%,t5:type=",
-"%":"HTMLKeygenElement"},
-Gx:{
-"^":"Bo;P:value%",
-"%":"HTMLLIElement"},
-xT:{
-"^":"Bo;MB:form=",
-"%":"HTMLLabelElement"},
-mF:{
-"^":"Bo;MB:form=",
-"%":"HTMLLegendElement"},
-Ogt:{
-"^":"Bo;mH:href%,t5:type%",
-"%":"HTMLLinkElement"},
-ZD:{
-"^":"Gv;mH:href=,yv:protocol=",
-RE:function(a){return a.reload()},
-bu:function(a){return a.toString()},
-"%":"Location"},
-p8:{
-"^":"Bo;oc:name%",
-"%":"HTMLMapElement"},
-eL:{
-"^":"Bo;kc:error=",
-xW:function(a){return a.load()},
-yy:[function(a){return a.pause()},"$0","gX0",0,0,18],
-"%":"HTMLAudioElement;HTMLMediaElement",
-static:{"^":"TH<"}},
-mCi:{
-"^":"Gv;tT:code=",
-"%":"MediaError"},
-Br:{
-"^":"Gv;tT:code=",
-"%":"MediaKeyError"},
-wq:{
-"^":"ea;G1:message=",
-"%":"MediaKeyEvent"},
-W7:{
-"^":"ea;G1:message=",
-"%":"MediaKeyMessageEvent"},
-Rv:{
-"^":"PZ;jO:id=,ph:label=",
-"%":"MediaStream"},
-AW:{
-"^":"ea;",
-gRn:function(a){return P.o7(a.data,!0)},
-$isAW:true,
-"%":"MessageEvent"},
-EeC:{
-"^":"Bo;jb:content=,oc:name%",
-"%":"HTMLMetaElement"},
-tJ:{
-"^":"Bo;P:value%",
-"%":"HTMLMeterElement"},
-Hw:{
-"^":"ea;Rn:data=",
-"%":"MIDIMessageEvent"},
-yt:{
-"^":"Imr;",
-fZ:function(a,b,c){return a.send(b,c)},
-wR:function(a,b){return a.send(b)},
-"%":"MIDIOutput"},
-Imr:{
-"^":"PZ;jO:id=,oc:name=,t5:type=,Ye:version=",
-"%":"MIDIInput;MIDIPort"},
-AjY:{
-"^":"w6O;GU:altKey=,pL:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-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.hL(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.hL(a.clientX,a.clientY),[null]).W(0,J.Yq(J.tG(z)))
-return H.VM(new P.hL(J.Kn(y.x),J.Kn(y.y)),[null])}},
-$isAjY:true,
-"%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-x76:{
-"^":"Gv;",
-jh:function(a,b,c,d,e,f,g,h,i){var z,y
-z={}
-y=new W.tN(z)
-y.$2("childList",h)
-y.$2("attributes",e)
-y.$2("characterData",f)
-y.$2("subtree",i)
-y.$2("attributeOldValue",d)
-y.$2("characterDataOldValue",g)
-y.$2("attributeFilter",c)
-a.observe(b,z)},
-MS:function(a,b,c,d){return this.jh(a,b,c,null,d,null,null,null,null)},
-"%":"MutationObserver|WebKitMutationObserver"},
-Vv:{
-"^":"Gv;N:target=,t5:type=",
-"%":"MutationRecord"},
-qT:{
-"^":"Gv;G1:message=,oc:name=",
-"%":"NavigatorUserMediaError"},
-KV:{
-"^":"PZ;PZ:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,By:parentNode=,a4:textContent%",
-gyT:function(a){return new W.wi(a)},
-wg:function(a){var z=a.parentNode
-if(z!=null)z.removeChild(a)},
-Tk:function(a,b){var z,y
-try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},
-aD:function(a,b,c){var z,y,x
-z=J.x(b)
-if(!!z.$iswi){z=b.NL
-if(z===a)throw H.b(P.u(b))
-for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},
-pj:function(a){var z
-for(;z=a.firstChild,z!=null;)a.removeChild(z)},
-bu:function(a){var z=a.nodeValue
-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)},
-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"},
-BH3:{
-"^":"w1p;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"NodeList|RadioNodeList"},
-VSm:{
-"^":"Bo;t5:type%",
-"%":"HTMLOListElement"},
-G77:{
-"^":"Bo;Rn:data=,MB:form=,fg:height},oc:name%,t5:type%,R:width}",
-"%":"HTMLObjectElement"},
-l9:{
-"^":"Bo;ph:label%",
-"%":"HTMLOptGroupElement"},
-Qlt:{
-"^":"Bo;MB:form=,vH:index=,ph:label%,P:value%",
-$isQlt:true,
-"%":"HTMLOptionElement"},
-wL2:{
-"^":"Bo;MB:form=,oc:name%,t5:type=,P:value%",
-"%":"HTMLOutputElement"},
-HDy:{
-"^":"Bo;oc:name%,P:value%",
-"%":"HTMLParamElement"},
-f5:{
-"^":"ea;",
-$isf5:true,
-"%":"PopStateEvent"},
-mg:{
-"^":"Gv;tT:code=,G1:message=",
-"%":"PositionError"},
-qW:{
-"^":"nx;N:target=",
-"%":"ProcessingInstruction"},
-KR:{
-"^":"Bo;P:value%",
-"%":"HTMLProgressElement"},
-kf:{
-"^":"ea;ox:loaded=",
-$iskf:true,
-"%":"XMLHttpRequestProgressEvent;ProgressEvent"},
-LY:{
-"^":"kf;O3:url=",
-"%":"ResourceProgressEvent"},
-j2:{
-"^":"Bo;t5:type%",
-"%":"HTMLScriptElement"},
-Eag:{
-"^":"ea;i6:lineNumber=",
-"%":"SecurityPolicyViolationEvent"},
-bs:{
-"^":"Bo;MB:form=,B:length%,oc:name%,Mj:selectedIndex%,t5:type=,P:value%",
-$isbs:true,
-"%":"HTMLSelectElement"},
-I0:{
-"^":"Aj;",
-Kb:function(a,b){return a.getElementById(b)},
-$isI0:true,
-"%":"ShadowRoot"},
-yNV:{
-"^":"Bo;t5:type%",
-"%":"HTMLSourceElement"},
-S2:{
-"^":"ea;kc:error=,G1:message=",
-"%":"SpeechRecognitionError"},
-r5:{
-"^":"ea;Cf:results=",
-"%":"SpeechRecognitionEvent"},
-vKL:{
-"^":"Gv;V5:isFinal=,B:length=",
-"%":"SpeechRecognitionResult"},
-G5:{
-"^":"ea;oc:name=",
-"%":"SpeechSynthesisEvent"},
-kI:{
-"^":"ea;G3:key=,O3:url=",
-"%":"StorageEvent"},
-fqq:{
-"^":"Bo;t5:type%",
-"%":"HTMLStyleElement"},
-v6:{
-"^":"Bo;",
-$isv6:true,
-"%":"HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"},
-inA:{
-"^":"Bo;",
-gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
-"%":"HTMLTableElement"},
-tV:{
-"^":"Bo;RH:rowIndex=",
-iF:function(a,b){return a.insertCell(b)},
-$istV:true,
-"%":"HTMLTableRowElement"},
-BTK:{
-"^":"Bo;",
-gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
-"%":"HTMLTableSectionElement"},
-OH:{
-"^":"Bo;jb:content=",
-$isOH:true,
-"%":";HTMLTemplateElement;GLL|wc|q6"},
-mw:{
-"^":"nx;",
-$ismw:true,
-"%":"CDATASection|Text"},
-AE:{
-"^":"Bo;MB:form=,oc:name%,vp:rows=,t5:type=,P:value%",
-$isAE:true,
-"%":"HTMLTextAreaElement"},
-R0:{
-"^":"w6O;Rn:data=",
-"%":"TextEvent"},
-y6:{
-"^":"w6O;GU:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-"%":"TouchEvent"},
-RH:{
-"^":"Bo;fY:kind%,ph:label%",
-"%":"HTMLTrackElement"},
-w6O:{
-"^":"ea;ey:detail=",
-"%":"FocusEvent|SVGZoomEvent;UIEvent"},
-SW:{
-"^":"eL;fg:height},R:width}",
-"%":"HTMLVideoElement"},
-K5:{
-"^":"PZ;oc:name%,pf:status%",
-oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
-hr:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
-for(var y=0;y<z.length&&!b.requestAnimationFrame;++y){b.requestAnimationFrame=b[z[y]+'RequestAnimationFrame']
-b.cancelAnimationFrame=b[z[y]+'CancelAnimationFrame']||b[z[y]+'CancelRequestAnimationFrame']}if(b.requestAnimationFrame&&b.cancelAnimationFrame)return
-b.requestAnimationFrame=function(c){return window.setTimeout(function(){c(Date.now())},16)}
-b.cancelAnimationFrame=function(c){clearTimeout(c)}})(a)},
-geT:function(a){return W.Pv(a.parent)},
-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()},
-gEr: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])},
-$isK5:true,
-$isPZ:true,
-"%":"DOMWindow|Window"},
-Bn:{
-"^":"KV;oc:name=,P:value%",
-"%":"Attr"},
-o5:{
-"^":"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
-z=J.x(b)
-if(!z.$istn)return!1
-y=a.left
-x=z.gBb(b)
-if(y==null?x==null:y===x){y=a.top
-x=z.gG6(b)
-if(y==null?x==null:y===x){y=a.width
-x=z.gR(b)
-if(y==null?x==null:y===x){y=a.height
-z=z.gfg(b)
-z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
-return z},
-giO:function(a){var z,y,x,w,v
-z=J.v1(a.left)
-y=J.v1(a.top)
-x=J.v1(a.width)
-w=J.v1(a.height)
-w=W.VC(W.VC(W.VC(W.VC(0,z),y),x),w)
-v=536870911&w+((67108863&w)<<3>>>0)
-v^=v>>>11
-return 536870911&v+((16383&v)<<15>>>0)},
-gSR:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
-$istn:true,
-$astn:function(){return[null]},
-"%":"ClientRect|DOMRect"},
-NfA:{
-"^":"Bo;",
-$isPZ:true,
-"%":"HTMLFrameSetElement"},
-rh:{
-"^":"kEI;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"MozNamedAttrMap|NamedNodeMap"},
-IT:{
-"^":"x5e;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.vKL]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.vKL]},
-$isXj:true,
-"%":"SpeechRecognitionResultList"},
-VG:{
-"^":"ark;MW,wM",
-tg:function(a,b){return J.x5(this.wM,b)},
-gl0:function(a){return this.MW.firstElementChild==null},
-gB:function(a){return this.wM.length},
-t:function(a,b){var z=this.wM
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-u:function(a,b,c){var z=this.wM
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},
-sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
-h:function(a,b){this.MW.appendChild(b)
-return b},
-gA:function(a){var z=this.br(this)
-return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
-FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},
-GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
-Jd:function(a){return this.GT(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)},
-xe:function(a,b,c){var z,y,x
-if(b>this.wM.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.wM
-y=z.length
-x=this.MW
-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))},
-V1:function(a){J.r4(this.MW)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)this.MW.removeChild(z)
-return z},
-grZ:function(a){var z=this.MW.lastElementChild
-if(z==null)throw H.b(P.w("No elements"))
-return z},
-$asark:function(){return[W.h4]},
-$asE9h:function(){return[W.h4]},
-$asWO:function(){return[W.h4]},
-$asQV:function(){return[W.h4]}},
-TS:{
-"^":"ark;Sn,Sc",
-gB:function(a){return this.Sn.length},
-t:function(a,b){var z=this.Sn
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot modify list"))},
-sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
-GT:function(a,b){throw H.b(P.f("Cannot sort list"))},
-Jd:function(a){return this.GT(a,null)},
-grZ:function(a){return C.t5.grZ(this.Sn)},
-gDD:function(a){return W.or(this.Sc)},
-gEr: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.ad(this.Sn,new W.HU())
-this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{vD:function(a,b){var z=H.VM(new W.TS(a,null),[b])
-z.nJ(a,b)
-return z}}},
-HU:{
-"^":"Tp:13;",
-$1:function(a){return!!J.x(a).$ish4},
-$isEH:true},
-QI:{
-"^":"Gv;"},
-Jn:{
-"^":"a;WK<",
-t:function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])}},
-DM:{
-"^":"Jn;WK:YO<,WK",
-t:function(a,b){var z,y
-z=$.Vp()
-y=J.rY(b)
-if(z.gvc().Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.eu(this.YO,z.t(0,y.hc(b)),!1),[null])
-return H.VM(new W.eu(this.YO,b,!1),[null])},
-static:{"^":"fD"}},
-RAp:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-ecX:{
-"^":"RAp+Gm;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-bU:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.setRequestHeader(a,b)},
-$isEH:true},
-Tf:{
-"^":"Tp:13;b,c",
-$1:[function(a){var z,y,x
-z=this.c
-y=z.status
-if(typeof y!=="number")return y.F()
-y=y>=200&&y<300||y===0||y===304
-x=this.b
-if(y){y=x.MM
-if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(z)}else x.pm(a)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-tN:{
-"^":"Tp:77;a",
-$2:function(a,b){if(b!=null)this.a[a]=b},
-$isEH:true},
-wi:{
-"^":"ark;NL",
-grZ:function(a){var z=this.NL.lastChild
-if(z==null)throw H.b(P.w("No elements"))
-return z},
-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)},
-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
-x=y.length
-if(b===x)z.appendChild(c)
-else{if(b>=x)return H.e(y,b)
-z.insertBefore(c,y[b])}},
-UG:function(a,b,c){var z,y
-z=this.NL
-y=z.childNodes
-if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
-Mh: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
-y=z.childNodes
-if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},
-gA:function(a){return C.t5.gA(this.NL.childNodes)},
-GT:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
-Jd:function(a){return this.GT(a,null)},
-YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-gB:function(a){return this.NL.childNodes.length},
-sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
-t:function(a,b){var z=this.NL.childNodes
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-$iswi:true,
-$asark:function(){return[W.KV]},
-$asE9h:function(){return[W.KV]},
-$asWO:function(){return[W.KV]},
-$asQV:function(){return[W.KV]}},
-nNL:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-w1p:{
-"^":"nNL+Gm;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-yoo:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-kEI:{
-"^":"yoo+Gm;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-zLC:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.vKL]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.vKL]}},
-x5e:{
-"^":"zLC+Gm;",
-$isWO:true,
-$asWO:function(){return[W.vKL]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.vKL]}},
-a7B:{
-"^":"a;",
-FV:function(a,b){J.Me(b,new W.Zc(this))},
-V1:function(a){var z
-for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},
-aN:function(a,b){var z,y
-for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-b.$2(y,this.t(0,y))}},
-gvc:function(){var z,y,x,w
-z=this.MW.attributes
-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.O6(z[w]))}}return y},
-gUQ:function(a){var z,y,x,w
-z=this.MW.attributes
-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.Vm(z[w]))}}return y},
-gl0:function(a){return this.gB(this)===0},
-gor:function(a){return this.gB(this)!==0},
-$isZ0:true,
-$asZ0:function(){return[P.qU,P.qU]}},
-Zc:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true},
-E9:{
-"^":"a7B;MW",
-x4:function(a){return this.MW.hasAttribute(a)},
-t:function(a,b){return this.MW.getAttribute(b)},
-u:function(a,b,c){this.MW.setAttribute(b,c)},
-Rz:function(a,b){var z,y
-z=this.MW
-y=z.getAttribute(b)
-z.removeAttribute(b)
-return y},
-gB:function(a){return this.gvc().length},
-FJ:function(a){return a.namespaceURI==null}},
-hZ:{
-"^":"As3;n8,Kd",
-lF:function(){var z=P.Ls(null,null,null,P.qU)
-this.Kd.aN(0,new W.Siz(z))
-return z},
-p5:function(a){var z,y
-z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.n8,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.Jt(a))},
-yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.n8,!0,null),new W.Xw()),[null,null])},
-static:{or:function(a){var z=new W.hZ(a,null)
-z.yJ(a)
-return z}}},
-Xw:{
-"^":"Tp:13;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-Siz:{
-"^":"Tp:13;a",
-$1:function(a){return this.a.FV(0,a.lF())},
-$isEH:true},
-Jt:{
-"^":"Tp:13;a",
-$1:function(a){return a.OS(this.a)},
-$isEH:true},
-I4:{
-"^":"As3;MW",
-lF:function(){var z,y,x
-z=P.Ls(null,null,null,P.qU)
-for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
-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," "))}},
-FkO:{
-"^":"a;Ph",
-ly:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
-LX:function(a){return this.ly(a,!1)}},
-RO:{
-"^":"cb;DK,Ph,Sg",
-KR:function(a,b,c,d){var z=new W.Ov(0,this.DK,this.Ph,W.aF(a),this.Sg)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-z.Zz()
-return z},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)}},
-eu:{
-"^":"RO;DK,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])},
-$iscb:true},
-ie:{
-"^":"Tp:13;a",
-$1:function(a){return J.So(J.l2(a),this.a)},
-$isEH:true},
-rg:{
-"^":"Tp:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-Uc:{
-"^":"cb;Qx,Sg,Ph",
-WO:function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"cb",0)])
-return H.VM(new P.c9(new W.Hb(b),z),[H.ip(z,"cb",0),null])},
-KR:function(a,b,c,d){var z,y,x,w,v
-z=H.VM(new W.qO(null,P.L5(null,null,null,[P.cb,null],[P.Oy,null])),[null])
-z.xd(null)
-for(y=this.Qx,y=y.gA(y),x=this.Ph,w=this.Sg;y.G();){v=new W.RO(y.lo,x,w)
-v.$builtinTypeInfo=[null]
-z.h(0,v)}y=z.pY
-y.toString
-return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-$iscb:true},
-i2:{
-"^":"Tp:13;a",
-$1:function(a){return J.So(J.l2(a),this.a)},
-$isEH:true},
-Hb:{
-"^":"Tp:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-Ov:{
-"^":"Oy;VP,DK,Ph,G9,Sg",
-ed:function(){if(this.DK==null)return
-this.Jc()
-this.DK=null
-this.G9=null
-return},
-Fv:[function(a,b){if(this.DK==null)return;++this.VP
-this.Jc()
-if(b!=null)b.Qy(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,116,23,117],
-gUF:function(){return this.VP>0},
-QE:[function(a){if(this.DK==null||this.VP<=0)return;--this.VP
-this.Zz()},"$0","gDQ",0,0,18],
-Zz:function(){var z=this.G9
-if(z!=null&&this.VP<=0)J.FI(this.DK,this.Ph,z,this.Sg)},
-Jc:function(){var z=this.G9
-if(z!=null)J.pW(this.DK,this.Ph,z,this.Sg)}},
-qO:{
-"^":"a;pY,uZ",
-h:function(a,b){var z,y
-z=this.uZ
-if(z.x4(b))return
-y=this.pY
-z.u(0,b,b.zC(y.ght(y),new W.rC(this,b),this.pY.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.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.pY.S6(0)},"$0","gJK",0,0,18],
-xd:function(a){this.pY=P.bK(this.gJK(this),null,!0,a)}},
-rC:{
-"^":"Tp:69;a,b",
-$0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Gm:{
-"^":"a;",
-gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
-h:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
-FV:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
-GT:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
-Jd:function(a){return this.GT(a,null)},
-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."))},
-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,
-$isQV:true,
-$asQV:null},
-uB:{
-"^":"ark;xa",
-gA:function(a){return H.VM(new W.LV(J.mY(this.xa)),[null])},
-gB:function(a){return this.xa.length},
-h:function(a,b){J.bi(this.xa,b)},
-V1:function(a){J.U2(this.xa)},
-t:function(a,b){var z=this.xa
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-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)},
-GT:function(a,b){J.LH(this.xa,b)},
-Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.G0(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)},
-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.O2(this.xa,b,c)}},
-LV:{
-"^":"a;qD",
-G:function(){return this.qD.G()},
-gl:function(){return this.qD.QZ}},
-W9:{
-"^":"a;nj,vN,Nq,QZ",
-G:function(){var z,y
-z=this.Nq+1
-y=this.vN
-if(z<y){this.QZ=J.UQ(this.nj,z)
-this.Nq=z
-return!0}this.QZ=null
-this.Nq=y
-return!1},
-gl:function(){return this.QZ}},
-uY:{
-"^":"Tp:13;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,54,"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(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."))},
-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
-else return new W.dW(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
-"^":"",
-hF:{
-"^":"Gv;",
-$ishF:true,
-"%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
-"^":"",
-Y0Y:{
-"^":"tpr;N:target=,mH:href=",
-"%":"SVGAElement"},
-nI:{
-"^":"Rc;mH:href=",
-"%":"SVGAltGlyphElement"},
-eG:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEBlendElement"},
-bd:{
-"^":"d5;t5:type=,UQ:values=,yG:result=,x=,y=",
-"%":"SVGFEColorMatrixElement"},
-pf:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEComponentTransferElement"},
-nQ:{
-"^":"d5;kp:operator=,yG:result=,x=,y=",
-"%":"SVGFECompositeElement"},
-W1:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEConvolveMatrixElement"},
-mCz:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEDiffuseLightingElement"},
-wfu:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEDisplacementMapElement"},
-ha:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEFloodElement"},
-ym:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEGaussianBlurElement"},
-meI:{
-"^":"d5;yG:result=,x=,y=,mH:href=",
-"%":"SVGFEImageElement"},
-oBW:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEMergeElement"},
-wC:{
-"^":"d5;kp:operator=,yG:result=,x=,y=",
-"%":"SVGFEMorphologyElement"},
-MI8:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEOffsetElement"},
-Ubr:{
-"^":"d5;x=,y=",
-"%":"SVGFEPointLightElement"},
-bMB:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFESpecularLightingElement"},
-pQ:{
-"^":"d5;x=,y=",
-"%":"SVGFESpotLightElement"},
-Qya:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFETileElement"},
-Fu:{
-"^":"d5;t5:type=,yG:result=,x=,y=",
-"%":"SVGFETurbulenceElement"},
-OE5:{
-"^":"d5;x=,y=,mH:href=",
-"%":"SVGFilterElement"},
-N9:{
-"^":"tpr;x=,y=",
-"%":"SVGForeignObjectElement"},
-d0D:{
-"^":"tpr;",
-"%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
-tpr:{
-"^":"d5;",
-"%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
-pAv:{
-"^":"tpr;x=,y=,mH:href=",
-"%":"SVGImageElement"},
-NBZ:{
-"^":"d5;x=,y=",
-"%":"SVGMaskElement"},
-Gr5:{
-"^":"d5;x=,y=,mH:href=",
-"%":"SVGPatternElement"},
-MU:{
-"^":"d0D;x=,y=",
-"%":"SVGRectElement"},
-j24:{
-"^":"d5;t5:type%,mH:href=",
-"%":"SVGScriptElement"},
-EUL:{
-"^":"d5;t5:type%",
-smk:function(a,b){a.title=b},
-"%":"SVGStyleElement"},
-d5:{
-"^":"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])},
-gEr:function(a){return H.VM(new W.eu(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.eu(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.eu(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.eu(a,C.uh.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.eu(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:{"^":"JQ<"}},
-hy:{
-"^":"tpr;x=,y=",
-Kb:function(a,b){return a.getElementById(b)},
-$ishy:true,
-"%":"SVGSVGElement"},
-mHq:{
-"^":"tpr;",
-"%":";SVGTextContentElement"},
-Rk4:{
-"^":"mHq;mH:href=",
-"%":"SVGTextPathElement"},
-Rc:{
-"^":"mHq;x=,y=",
-"%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
-ci:{
-"^":"tpr;x=,y=,mH:href=",
-"%":"SVGUseElement"},
-cuU:{
-"^":"d5;mH:href=",
-"%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-O7:{
-"^":"As3;LO",
-lF:function(){var z,y,x,w
-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.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
-"^":"",
-QmI:{
-"^":"Gv;tT:code=,G1:message=",
-"%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
-"^":"",
-hM:function(){var z,y,x
-z=$.Vz
-$.Vz=z+1
-y=new H.yo(z,null,!1)
-x=init.globalState.N0
-x.O9(z,y)
-x.PC()
-x=new H.fc(y,null)
-x.TL(y)
-return x},
-XY:{
-"^":"a;",
-$isXY:true,
-static:{N3: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,41,59,27,60],
-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},
-Om:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},
-wY:[function(a){var z
-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.$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($.iW()))}},"$1","En",2,0,13,61],
-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.$isK5}else z=!1
-if(z)return a
-else if(a instanceof Date)return P.Wu(a.getTime(),!1)
-else if(a.constructor===$.iW())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,49,61],
-ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
-else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),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},
-E4:{
-"^":"a;eh",
-t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
-return P.dU(this.eh[b])},
-u:function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
-this.eh[b]=P.wY(c)},
-giO:function(a){return 0},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isE4&&this.eh===b.eh},
-Eg:function(a){return a in this.eh},
-bu:function(a){var z,y
-try{z=String(this.eh)
-return z}catch(y){H.Ru(y)
-return P.a.prototype.bu.call(this,this)}},
-V7:function(a,b){var z,y
-z=this.eh
-y=b==null?null:P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)
-return P.dU(z[a].apply(z,y))},
-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.ND(new z())
-y=[null]
-C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
-x=z.bind.apply(z,y)
-String(x)
-return P.ND(new x())},Cq: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:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y,x,w,v
-z=this.a
-if(z.x4(a))return z.t(0,a)
-y=J.x(a)
-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.$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,61,"call"],
-$isEH:true},
-r7:{
-"^":"E4;eh",
-qP:function(a,b){var z,y
-z=P.wY(b)
-y=P.F(H.VM(new H.A8(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,
-static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
-Tz:{
-"^":"Wk;eh",
-t:function(a,b){var z
-if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
-else z=!1
-if(z)H.vh(P.TE(b,0,this.gB(this)))}return P.E4.prototype.t.call(this,this,b)},
-u:function(a,b,c){var z
-if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
-else z=!1
-if(z)H.vh(P.TE(b,0,this.gB(this)))}P.E4.prototype.u.call(this,this,b,c)},
-gB:function(a){var z=this.eh.length
-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.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.BE(b,c,this.gB(this))
-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))
-if(c<b||c>z)H.vh(P.TE(c,b,z))
-y=c-b
-if(y===0)return
-if(e<0)throw H.b(P.u(e))
-x=[b,y]
-C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
-this.V7("splice",x)},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-GT:function(a,b){this.V7("sort",[b])},
-Jd:function(a){return this.GT(a,null)},
-static:{BE: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))}}},
-Wk:{
-"^":"E4+lD;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-DV:{
-"^":"Tp:13;",
-$1:function(a){var z=P.xZ(a,!1)
-P.Dm(z,$.Dp(),a)
-return z},
-$isEH:true},
-Hp:{
-"^":"Tp:13;a",
-$1:function(a){return new this.a(a)},
-$isEH:true},
-Nz:{
-"^":"Tp:13;",
-$1:function(a){return new P.r7(a)},
-$isEH:true},
-Jd:{
-"^":"Tp:13;",
-$1:function(a){return H.VM(new P.Tz(a),[null])},
-$isEH:true},
-QS:{
-"^":"Tp:13;",
-$1:function(a){return new P.E4(a)},
-$isEH:true}}],["dart.math","dart:math",,P,{
-"^":"",
-Zm:function(a,b){a=536870911&a+b
-a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-xk:function(a){a=536870911&a+((67108863&a)<<3>>>0)
-a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},
-J:function(a,b){var z
-if(typeof a!=="number")throw H.b(P.u(a))
-if(typeof b!=="number")throw H.b(P.u(b))
-if(a>b)return b
-if(a<b)return a
-if(typeof b==="number"){if(typeof a==="number")if(a===0)return(a+b)*a*b
-if(a===0)z=b===0?1/b<0:b<0
-else z=!1
-if(z||isNaN(b))return b
-return a}return a},
-y:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
-if(typeof b!=="number")throw H.b(P.u(b))
-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.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.KP("max must be in range 0 < max \u2264 2^32, was "+a))
-return Math.random()*a>>>0}},
-vY:{
-"^":"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.Ak
-z=(u&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.KP("max must be in range 0 < max \u2264 2^32, was "+a))
-z=a-1
-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},
-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)
-a=J.Ts(y.W(a,x),4294967296)
-y=J.Wx(a)
-w=y.i(a,4294967295)
-a=J.Ts(y.W(a,w),4294967296)
-v=((~x&4294967295)>>>0)+(x<<21>>>0)
-u=(v&4294967295)>>>0
-w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.cU(v-u,4294967296)&4294967295
-v=((u^(u>>>24|w<<8))>>>0)*265
-x=(v&4294967295)>>>0
-w=((w^w>>>24)>>>0)*265+C.jn.cU(v-x,4294967296)&4294967295
-v=((x^(x>>>14|w<<18))>>>0)*21
-x=(v&4294967295)>>>0
-w=((w^w>>>14)>>>0)*21+C.jn.cU(v-x,4294967296)&4294967295
-x=(x^(x>>>28|w<<4))>>>0
-w=(w^w>>>28)>>>0
-v=(x<<31>>>0)+x
-u=(v&4294967295)>>>0
-y=C.jn.cU(v-u,4294967296)
-v=this.Pd*1037
-t=(v&4294967295)>>>0
-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,PZi,JYU",r2:function(a){var z=new P.vY(0,0)
-z.qR(a)
-return z}}},
-hL:{
-"^":"a;x>,y>",
-bu:function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},
-n:function(a,b){var z,y
-if(b==null)return!1
-if(!J.x(b).$ishL)return!1
-z=this.x
-y=b.x
-if(z==null?y==null:z===y){z=this.y
-y=b.y
-y=z==null?y==null:z===y
-z=y}else z=!1
-return z},
-giO:function(a){var z,y
-z=J.v1(this.x)
-y=J.v1(this.y)
-return P.xk(P.Zm(P.Zm(0,z),y))},
-g:function(a,b){var z,y,x,w
-z=this.x
-y=J.RE(b)
-x=y.gx(b)
-if(typeof z!=="number")return z.g()
-if(typeof x!=="number")return H.s(x)
-w=this.y
-y=y.gy(b)
-if(typeof w!=="number")return w.g()
-if(typeof y!=="number")return H.s(y)
-y=new P.hL(z+x,w+y)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},
-W:function(a,b){var z,y,x,w
-z=this.x
-y=J.RE(b)
-x=y.gx(b)
-if(typeof z!=="number")return z.W()
-if(typeof x!=="number")return H.s(x)
-w=this.y
-y=y.gy(b)
-if(typeof w!=="number")return w.W()
-if(typeof y!=="number")return H.s(y)
-y=new P.hL(z-x,w-y)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},
-U:function(a,b){var z,y
-z=this.x
-if(typeof z!=="number")return z.U()
-if(typeof b!=="number")return H.s(b)
-y=this.y
-if(typeof y!=="number")return y.U()
-y=new P.hL(z*b,y*b)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},
-$ishL:true},
-HDe:{
-"^":"a;",
-gT8:function(a){return this.gBb(this)+this.R},
-gQG:function(a){return this.gG6(this)+this.fg},
-bu:function(a){return"Rectangle ("+this.gBb(this)+", "+this.G6+") "+this.R+" x "+this.fg},
-n:function(a,b){var z,y
-if(b==null)return!1
-z=J.x(b)
-if(!z.$istn)return!1
-if(this.gBb(this)===z.gBb(b)){y=this.G6
-z=y===z.gG6(b)&&this.Bb+this.R===z.gT8(b)&&y+this.fg===z.gQG(b)}else z=!1
-return z},
-giO:function(a){var z=this.G6
-return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Bb+this.R&0x1FFFFFFF),z+this.fg&0x1FFFFFFF))},
-gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z}},
-tn:{
-"^":"HDe;Bb>,G6>,R>,fg>",
-$istn:true,
-$astn:null,
-static:{T7:function(a,b,c,d,e){var z,y
-z=c<0?-c*0:c
-y=d<0?-d*0:d
-return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
-"^":"",
-qp:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
-A2:{
-"^":"mAS;Rp"},
-mAS:{
-"^":"Nx+cw;",
-$isZ0:true},
-cw:{
-"^":"a;",
-u:function(a,b,c){return Q.qp()},
-FV:function(a,b){return Q.qp()},
-V1:function(a){return Q.qp()},
-$isZ0:true},
-Nx:{
-"^":"a;",
-t:function(a,b){return this.Rp.t(0,b)},
-u:function(a,b,c){this.Rp.u(0,b,c)},
-FV:function(a,b){this.Rp.FV(0,b)},
-V1:function(a){this.Rp.V1(0)},
-aN:function(a,b){this.Rp.aN(0,b)},
-gl0:function(a){return this.Rp.X5===0},
-gor:function(a){return this.Rp.X5!==0},
-gvc:function(){var z=this.Rp
-return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gB:function(a){return this.Rp.X5},
-gUQ:function(a){var z=this.Rp
-return z.gUQ(z)},
-bu:function(a){return P.vW(this.Rp)},
-$isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
-"^":"",
-ic:function(a){a.toString
-return a},
-jZN:function(a){a.toString
-return a},
-aRu:function(a){a.toString
-return a},
-WZ:{
-"^":"Gv;",
-gbx:function(a){return C.E0},
-$isWZ:true,
-"%":"ArrayBuffer"},
-eH:{
-"^":"Gv;",
-J2:function(a,b,c){var z=J.Wx(b)
-if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(P.u("Invalid list index "+H.d(b)))},
-ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
-$iseH:true,
-$isAS:true,
-"%":";ArrayBufferView;we|Ui|Ip|Dg|ObS|GVy|Pg"},
-dfL:{
-"^":"eH;",
-gbx:function(a){return C.dP},
-$isAS:true,
-"%":"DataView"},
-zU7:{
-"^":"Dg;",
-gbx:function(a){return C.kq},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]},
-$isAS:true,
-"%":"Float32Array"},
-fS:{
-"^":"Dg;",
-gbx:function(a){return C.lk},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]},
-$isAS:true,
-"%":"Float64Array"},
-PS:{
-"^":"Pg;",
-gbx:function(a){return C.jV},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Int16Array"},
-dE:{
-"^":"Pg;",
-gbx:function(a){return C.XI},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Int32Array"},
-Eb:{
-"^":"Pg;",
-gbx:function(a){return C.la},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Int8Array"},
-wfF:{
-"^":"Pg;",
-gbx:function(a){return C.M5},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Uint16Array"},
-Pqh:{
-"^":"Pg;",
-gbx:function(a){return C.Vh},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Uint32Array"},
-eEV:{
-"^":"Pg;",
-gbx:function(a){return C.Fe},
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"CanvasPixelArray|Uint8ClampedArray"},
-V6a:{
-"^":"Pg;",
-gbx:function(a){return C.HC},
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":";Uint8Array"},
-we:{
-"^":"eH;",
-gB:function(a){return a.length},
-oZ:function(a,b,c,d,e){var z,y,x
-z=a.length+1
-this.ZF(a,b,z)
-this.ZF(a,c,z)
-if(b>c)throw H.b(P.TE(b,0,c))
-y=c-b
-if(e<0)throw H.b(P.u(e))
-x=d.length
-if(x-e<y)throw H.b(P.w("Not enough elements"))
-if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},
-$isXj:true},
-Dg:{
-"^":"Ip;",
-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)},
-$isDg:true,
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]}},
-Ui:{
-"^":"we+lD;",
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]}},
-Ip:{
-"^":"Ui+SU7;"},
-Pg:{
-"^":"GVy;",
-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)},
-$isPg:true,
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]}},
-ObS:{
-"^":"we+lD;",
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]}},
-GVy:{
-"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
-"^":"",
-qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
-return}if(typeof console=="object"&&typeof console.log!="undefined"){console.log(a)
-return}if(typeof window=="object")return
-if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
-"^":"",
-ZP:{
-"^":"Vct;Py,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gkc:function(a){return a.Py},
-skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
-static:{Zg:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.OD.ZL(a)
-C.OD.XI(a)
-return a}}},
-Vct:{
-"^":"uL+Pi;",
-$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
-"^":"",
-nJ:{
-"^":"D13;a3,Ek,Ln,y4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-ga4:function(a){return a.a3},
-sa4:function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},
-gdu:function(a){return a.Ek},
-sdu:function(a,b){a.Ek=this.ct(a,C.eh,a.Ek,b)},
-gFR:function(a){return a.Ln},
-Ki:function(a){return this.gFR(a).$0()},
-LY:function(a,b){return this.gFR(a).$1(b)},
-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
-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,102,1,94,95],
-Z1:[function(a,b,c,d){var z,y,x
-J.Kr(b)
-z=a.a3
-a.a3=this.ct(a,C.mi,z,"")
-if(a.Ln!=null){y=P.Fl(null,null)
-x=R.tB(y)
-J.kW(x,"expr",z)
-J.Vk(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,102,1,94,95],
-o5:[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,129,1],
-static:{Rp:function(a){var z,y,x
-z=R.tB([])
-y=P.L5(null,null,null,P.qU,W.I0)
-x=P.qU
-x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
-a.Ek="1-line"
-a.y4=z
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=y
-a.ZQ=x
-C.tT.ZL(a)
-C.tT.XI(a)
-return a}}},
-D13:{
-"^":"uL+Pi;",
-$isd3:true},
-YW:{
-"^":"Tp:13;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,130,"call"],
-$isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
-"^":"",
-Eg:{
-"^":"SaM;fe,l1,bY,jv,oy,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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},
-sph:function(a,b){a.l1=this.ct(a,C.hf,a.l1,b)},
-gFR:function(a){return a.bY},
-Ki:function(a){return this.gFR(a).$0()},
-LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},
-gkZ:function(a){return a.jv},
-skZ:function(a,b){a.jv=this.ct(a,C.YT,a.jv,b)},
-gyG:function(a){return a.oy},
-syG:function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},
-wB:[function(a,b,c,d){var z=a.fe
-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.uv(a)).Qy(new R.Ou(a))}},"$3","gbN",6,0,80,46,47,81],
-static:{fL:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.fe=!1
-a.l1="[evaluate]"
-a.bY=null
-a.jv=""
-a.oy=null
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.UF.ZL(a)
-C.UF.XI(a)
-return a}}},
-SaM:{
-"^":"xc+Pi;",
-$isd3:true},
-uv:{
-"^":"Tp:131;a",
-$1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,82,"call"],
-$isEH:true},
-Ou:{
-"^":"Tp:69;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,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{hSW:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-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,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.KV).Qy(b)},"$1","gvC",2,0,20,90],
-static:{nv:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.by.ZL(a)
-C.by.XI(a)
-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,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.DC).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Ak:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Mh.ZL(a)
-C.Mh.XI(a)
-return a}}},
-pva:{
-"^":"uL+Pi;",
-$isd3:true},
-MJ:{
-"^":"cda;Zc,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gJ6:function(a){return a.Zc},
-sJ6:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
-static:{IfX:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-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:{
-"^":"T53;lh,Qz,zg,Fs,AP,fn,tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gU4:function(a){return a.lh},
-sU4:function(a,b){a.lh=this.ct(a,C.QK,a.lh,b)},
-Qj:[function(a,b){var z,y,x
-Q.xI.prototype.Qj.call(this,a,b)
-this.ct(a,C.ak,0,1)
-this.ct(a,C.Ql,0,1)
-z=a.tY
-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)
-x=y&&J.UQ(z,"parent")!=null
-a.Qz=this.ct(a,C.ak,a.Qz,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,20,57],
-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)},
-static:{v9:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.lh=!0
-a.Qz=!1
-a.zg=!1
-a.Fs=!1
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Xo.ZL(a)
-C.Xo.XI(a)
-return a}}},
-T53:{
-"^":"xI+Pi;",
-$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
-"^":"",
-BS:{
-"^":"waa;P6,Sq,ZZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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},
-sfY:function(a,b){a.ZZ=this.ct(a,C.Lc,a.ZZ,b)},
-W7:function(a,b){var z,y,x
-z=b!=null
-y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
-if(y!=null)return this.W7(a,y)+"."+H.d(J.UQ(b,"user_name"))
-if(z){z=J.U6(b)
-z=z.t(b,"owner")!=null&&J.xC(z.t(b,"owner").gzS(),"Class")}else z=!1
-x=z?J.UQ(b,"owner"):null
-if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},
-jC:[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.P6)
-a.Sq=this.ct(a,C.AO,a.Sq,z)
-z=J.UQ(a.P6,"kind")
-y=a.ZZ
-switch(z){case"kRegularFunction":a.ZZ=this.ct(a,C.Lc,y,"function")
-break
-case"kClosureFunction":a.ZZ=this.ct(a,C.Lc,y,"closure function")
-break
-case"kSignatureFunction":a.ZZ=this.ct(a,C.Lc,y,"signature function")
-break
-case"kGetterFunction":a.ZZ=this.ct(a,C.Lc,y,"getter function")
-break
-case"kSetterFunction":a.ZZ=this.ct(a,C.Lc,y,"setter function")
-break
-case"kConstructor":a.ZZ=this.ct(a,C.Lc,y,"constructor")
-break
-case"kImplicitGetterFunction":a.ZZ=this.ct(a,C.Lc,y,"implicit getter function")
-break
-case"kImplicitSetterFunction":a.ZZ=this.ct(a,C.Lc,y,"implicit setter function")
-break
-case"kStaticInitializer":a.ZZ=this.ct(a,C.Lc,y,"static initializer")
-break
-case"kMethodExtractor":a.ZZ=this.ct(a,C.Lc,y,"method extractor")
-break
-case"kNoSuchMethodDispatcher":a.ZZ=this.ct(a,C.Lc,y,"noSuchMethod dispatcher")
-break
-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,20,57],
-RF:[function(a,b){J.r0(a.P6).Qy(b)},"$1","gvC",2,0,20,90],
-static:{nz:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.PJ8.ZL(a)
-C.PJ8.XI(a)
-return a}}},
-waa:{
-"^":"uL+Pi;",
-$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
-"^":"",
-Hz:{
-"^":"a;zE,mS",
-PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,132],
-gvH:function(a){return C.CD.cU(this.mS,4)},
-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()
-if(typeof y!=="number")return H.s(y)
-x=b.gx(b)
-if(typeof x!=="number")return H.s(x)
-return new O.Hz(a,(z*y+x)*4)}}},
-uc:{
-"^":"a;Yu<,tL"},
-Vb:{
-"^":"V4;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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},
-syw:function(a,b){a.oj=this.ct(a,C.QH,a.oj,b)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
-a.hi=z
-z=J.Q9(z)
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gmo(a)),z.Sg),[H.Kp(z,0)]).Zz()
-z=J.GW(a.hi)
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gJb(a)),z.Sg),[H.Kp(z,0)]).Zz()},
-LV:function(a,b){var z,y,x
-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,"@")
-if(0>=z.length)return H.e(z,0)
-a.UL.u(0,b,z[0])
-a.rM.u(0,b,d)
-a.Ge.u(0,this.LV(a,d),b)},
-eD:function(a,b,c){var z,y,x,w,v,u,t,s,r
-for(z=J.mY(J.UQ(b,"members")),y=a.UL,x=a.rM,w=a.Ge;z.G();){v=z.gl()
-if(!J.x(v).$isdy){N.QM("").To(H.d(v))
-continue}u=H.BU(C.Nm.grZ(J.uH(v.r0,"/")),null,null)
-t=u==null?C.pr:P.r2(u)
-s=[t.j1(128),t.j1(128),t.j1(128),255]
-r=J.uH(v.px,"@")
-if(0>=r.length)return H.e(r,0)
-y.u(0,u,r[0])
-x.u(0,u,s)
-w.u(0,this.LV(a,s),u)}this.fJ(a,c,"Free",$.Rl())
-this.fJ(a,0,"",$.Qg())},
-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.x6(a.An,b).mS,4)
-v=C.CD.Z(w,x)
-u=C.CD.Y(w,x)
-t=J.UQ(a.oj,"pages")
-if(!(v<0)){z=J.q8(t)
-if(typeof z!=="number")return H.s(z)
-z=v>=z}else z=!0
-if(z)return
-s=J.UQ(t,v)
-z=J.U6(s)
-r=z.t(s,"objects")
-y=J.U6(r)
-q=0
-p=0
-o=0
-while(!0){n=y.gB(r)
-if(typeof n!=="number")return H.s(n)
-if(!(o<n))break
-p=y.t(r,o)
-if(typeof p!=="number")return H.s(p)
-q+=p
-if(q>u){u=q-p
-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.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.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,129,2],
-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,129,2],
-My:function(a){var z,y,x,w,v
-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
-z.toString
-x=P.T7(C.CD.yu(C.CD.UD(z.clientLeft)),C.CD.yu(C.CD.UD(z.clientTop)),C.CD.yu(C.CD.UD(z.clientWidth)),C.CD.yu(C.CD.UD(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
-a.dW=z
-w=J.q8(y)
-if(typeof w!=="number")return H.s(w)
-v=P.J(z*w,6000)
-w=P.J3(J.Vf(a.hi).createImageData(x,v))
-a.An=w
-J.No(a.hi,J.DO(w))
-J.OE(a.hi,J.OB(a.An))
-this.ps(a,0)},
-ps:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-z=J.UQ(a.oj,"pages")
-y=J.U6(z)
-x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
-a.PA=this.ct(a,C.PM,a.PA,x)
-x=a.dW
-if(typeof x!=="number")return H.s(x)
-w=b*x
-v=w+x
-x=y.gB(z)
-if(typeof x!=="number")return H.s(x)
-if(!(b>=x)){x=J.OB(a.An)
-if(typeof x!=="number")return H.s(x)
-x=v>x}else x=!0
-if(x)return
-u=O.x6(a.An,H.VM(new P.hL(0,w),[null]))
-t=J.UQ(y.t(z,b),"objects")
-y=J.U6(t)
-x=a.rM
-s=0
-while(!0){r=y.gB(t)
-if(typeof r!=="number")return H.s(r)
-if(!(s<r))break
-q=y.t(t,s)
-p=x.t(0,y.t(t,s+1))
-for(;r=J.Wx(q),o=r.W(q,1),r.D(q,0);q=o){r=u.zE
-n=u.mS
-m=n+4
-C.yp.vg(J.Qd(r),n,m,p)
-u=new O.Hz(r,m)}s+=2}while(!0){y=u.mS
-x=C.CD.cU(y,4)
-r=u.zE
-n=J.RE(r)
-m=n.gR(r)
-if(typeof m!=="number")return H.s(m)
-m=C.CD.Y(x,m)
-l=n.gR(r)
-if(typeof l!=="number")return H.s(l)
-l=C.CD.Z(x,l)
-new P.hL(m,l).$builtinTypeInfo=[null]
-if(!(l<v))break
-x=$.Qg()
-m=y+4
-C.yp.vg(n.gRn(r),y,m,x)
-u=new O.Hz(r,m)}y=J.Vf(a.hi)
-x=a.An
-J.kZ(y,x,0,0,0,w,J.DO(x),v)
-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.wx()).Qy(b)},"$1","gvC",2,0,20,90],
-YS7:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,20,57],
-static:{"^":"nK,Os,SoT,WBO",dF:function(a){var z,y,x,w,v
-z=P.Fl(null,null)
-y=P.Fl(null,null)
-x=P.Fl(null,null)
-w=P.L5(null,null,null,P.qU,W.I0)
-v=P.qU
-v=H.VM(new V.qC(P.YM(null,null,null,v,null),null,null),[v,null])
-a.rM=z
-a.Ge=y
-a.UL=x
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=w
-a.ZQ=v
-C.Cs.ZL(a)
-C.Cs.XI(a)
-return a}}},
-V4:{
-"^":"uL+Pi;",
-$isd3:true},
-R5:{
-"^":"Tp:69;a,b",
-$0:function(){J.EK(this.a,this.b+1)},
-$isEH:true},
-aG:{
-"^":"Tp:101;a",
-$1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,133,"call"],
-$isEH:true},
-wx:{
-"^":"Tp:77;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,134,"call"],
-$isEH:true},
-oc:{
-"^":"Tp:69;a",
-$0:function(){J.vP(this.a)},
-$isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
-"^":"",
-UC:{
-"^":"Vz0;oH,vp,zz,pT,jV,AP,fn",
-eE:function(a,b){var z
-if(b===0){z=this.vp
-if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.O6(J.UQ(J.U8o(z[a]),b))}return G.Vz0.prototype.eE.call(this,a,b)}},
-Ly:{
-"^":"V10;MF,uY,GQ,I8,Oc,GM,nc,pp,Ol,Sk,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gYt:function(a){return a.MF},
-sYt:function(a,b){a.MF=this.ct(a,C.TN,a.MF,b)},
-gcH:function(a){return a.uY},
-scH:function(a,b){a.uY=this.ct(a,C.Zi,a.uY,b)},
-gLF:function(a){return a.nc},
-sLF:function(a,b){a.nc=this.ct(a,C.kG,a.nc,b)},
-gB1:function(a){return a.Ol},
-sB1:function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},
-god:function(a){return a.Sk},
-sod:function(a,b){a.Sk=this.ct(a,C.rB,a.Sk,b)},
-Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
-z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.zV(J.UQ($.BY,"PieChart"),[z])
-a.I8=y
-y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-a.GM=z
-a.pp=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
-Og:function(a){var z,y,x,w
-for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
-x=J.U6(y)
-w=x.t(y,"class")
-if(w==null)continue
-w.gUY().eC(x.t(y,"new"))
-w.gxQ().eC(x.t(y,"old"))}},
-Yz:function(a){var z,y,x,w,v,u,t,s,r,q
-a.nc.B7()
-for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=J.UQ(z.gl(),"class")
-if(y==null)continue
-if(y.gMp())continue
-x=y.gUY().gbi().yg
-w=y.gUY().gbi().wf
-v=y.gUY().gl().yg
-u=y.gUY().gl().wf
-t=y.gxQ().gbi().yg
-s=y.gxQ().gbi().wf
-r=y.gxQ().gl().yg
-q=y.gxQ().gl().wf
-J.Jr(a.nc,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.tO(a.nc)},
-E4:function(a,b,c){var z,y,x,w,v,u
-z=J.UQ(J.TY(a.nc),c)
-y=J.RE(b)
-x=J.RE(z)
-J.PP(J.UQ(J.Mx(J.UQ(y.gks(b),0)),0),J.UQ(x.gUQ(z),0))
-w=1
-while(!0){v=J.q8(x.gUQ(z))
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-c$0:{if(C.Nm.tg(C.NG,w))break c$0
-u=J.UQ(y.gks(b),w)
-v=J.RE(u)
-v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
-v.sa4(u,a.nc.Gu(c,w))}++w}},
-Jh:function(a){var z,y,x,w,v,u,t,s
-z=J.Mx(a.pp)
-if(z.gB(z)>a.nc.gzz().length){z=J.Mx(a.pp)
-y=z.gB(z)-a.nc.gzz().length
-for(x=0;x<y;++x)J.Mx(a.pp).mv(0)}else{z=J.Mx(a.pp)
-if(z.gB(z)<a.nc.gzz().length){z=a.nc.gzz().length
-w=J.Mx(a.pp)
-v=z-w.gB(w)
-for(x=0;x<v;++x){u=document.createElement("tr",null)
-z=J.RE(u)
-z.iF(u,-1).appendChild(W.r3("class-ref",null))
-t=z.iF(u,-1)
-t.toString
-new W.I4(t).h(0,"left-border-spacer")
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-t=z.iF(u,-1)
-t.toString
-new W.I4(t).h(0,"left-border-spacer")
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-J.Mx(a.pp).h(0,u)}}}for(x=0;x<a.nc.gzz().length;++x){z=a.nc.gzz()
-if(x>=z.length)return H.e(z,x)
-s=z[x]
-this.E4(a,J.Mx(a.pp).t(0,x),s)}},
-BB:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.nc.gxp()
-y=d.cellIndex
-x=a.nc
-if(z==null?y!=null:z!==y){x.sxp(y)
-a.nc.sT3(!0)}else x.sT3(!x.gT3())
-J.tO(a.nc)
-this.Jh(a)}},"$3","gQq",6,0,93,1,94,95],
-RF:[function(a,b){var z=a.Ol
-if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).Qy(b)},"$1","gvC",2,0,20,90],
-zT:[function(a,b){var z=a.Ol
-if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).Qy(b)},"$1","gyW",2,0,20,90],
-eJ:[function(a,b){var z=a.Ol
-if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).Qy(b)},"$1","gNb",2,0,20,90],
-hz:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,135,136],
-n1:[function(a,b){var z,y,x,w,v
-z=a.Ol
-if(z==null)return
-z=J.aT(z)
-z=this.ct(a,C.rB,a.Sk,z)
-a.Sk=z
-z.WU(J.UQ(a.Ol,"heaps"))
-y=H.BU(J.UQ(a.Ol,"dateLastAccumulatorReset"),null,null)
-if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
-a.uY=this.ct(a,C.Zi,a.uY,z)}y=H.BU(J.UQ(a.Ol,"dateLastServiceGC"),null,null)
-if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
-a.MF=this.ct(a,C.TN,a.MF,z)}z=a.GQ.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-x=J.aT(a.Ol)
-z=a.GQ
-w=x.gUY().gSU()
-z=z.Yb
-v=[]
-C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
-z.V7("addRow",[H.VM(new P.Tz(v),[null])])
-v=a.GQ
-z=J.bI(x.gUY().gCs(),x.gUY().gSU())
-v=v.Yb
-w=[]
-C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.V7("addRow",[H.VM(new P.Tz(w),[null])])
-w=a.GQ
-v=x.gUY().gMX()
-w=w.Yb
-z=[]
-C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
-w.V7("addRow",[H.VM(new P.Tz(z),[null])])
-z=a.Oc.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-z=a.Oc
-w=x.gxQ().gSU()
-z=z.Yb
-v=[]
-C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
-z.V7("addRow",[H.VM(new P.Tz(v),[null])])
-v=a.Oc
-z=J.bI(x.gxQ().gCs(),x.gxQ().gSU())
-v=v.Yb
-w=[]
-C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.V7("addRow",[H.VM(new P.Tz(w),[null])])
-w=a.Oc
-v=x.gxQ().gMX()
-w=w.Yb
-z=[]
-C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
-w.V7("addRow",[H.VM(new P.Tz(z),[null])])
-this.Og(a)
-this.Yz(a)
-this.Jh(a)
-a.I8.W2(a.GQ)
-a.GM.W2(a.Oc)
-this.ct(a,C.Aq,0,1)
-this.ct(a,C.ST,0,1)
-this.ct(a,C.DS,0,1)},"$1","gd0",2,0,20,57],
-Ar:[function(a,b){var z,y,x
-z=a.Ol
-if(z==null)return""
-y=J.RE(z)
-x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.L9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,137,138],
-uW:[function(a,b){var z,y
-z=a.Ol
-if(z==null)return""
-y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,137,138],
-F9:[function(a,b){var z,y
-z=a.Ol
-if(z==null)return""
-y=J.RE(z)
-return J.cI((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,137,138],
-Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.GQ=new G.Kf(z)
-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.V7("addColumn",["string","Type"])
-a.Oc.Yb.V7("addColumn",["number","Size"])
-z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.nc,new K.UC([new G.Kt("Class",G.Q8()),new G.Kt("",G.Q8()),new G.Kt("Accumulated Size (New)",G.YN()),new G.Kt("Accumulated Instances",G.kh()),new G.Kt("Current Size",G.YN()),new G.Kt("Current Instances",G.kh()),new G.Kt("",G.Q8()),new G.Kt("Accumulator Size (Old)",G.YN()),new G.Kt("Accumulator Instances",G.kh()),new G.Kt("Current Size",G.YN()),new G.Kt("Current Instances",G.kh())],z,[],0,!0,null,null))
-a.nc=z
-z.sxp(2)},
-static:{US:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.MF="---"
-a.uY="---"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.xu.ZL(a)
-C.xu.XI(a)
-C.xu.Zy(a)
-return a}}},
-V10:{
-"^":"uL+Pi;",
-$isd3:true}}],["html_common","dart:html_common",,P,{
-"^":"",
-bL:function(a){var z,y
-z=[]
-y=new P.Tm(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.a9([],z),new P.D6(z),new P.KC(z)).$1(a)},
-J3:function(a){var z,y
-z=J.x(a)
-if(!!z.$isSg){y=z.gRn(a)
-if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.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=$.R6
-if(z==null){z=$.Qz
-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:{
-"^":"Tp:48;b,c",
-$1:function(a){var z,y,x
-z=this.b
-y=z.length
-for(x=0;x<y;++x)if(z[x]===a)return x
-z.push(a)
-this.c.push(null)
-return y},
-$isEH:true},
-rG:{
-"^":"Tp:139;d",
-$1:function(a){var z=this.d
-if(a>=z.length)return H.e(z,a)
-return z[a]},
-$isEH:true},
-fh:{
-"^":"Tp:140;e",
-$2:function(a,b){var z=this.e
-if(a>=z.length)return H.e(z,a)
-z[a]=b},
-$isEH:true},
-uS:{
-"^":"Tp:69;",
-$0:function(){},
-$isEH:true},
-Tm:{
-"^":"Tp:13;f,UI,bK",
-$1:function(a){var z,y,x,w,v,u
-z={}
-if(a==null)return a
-if(typeof a==="boolean")return a
-if(typeof a==="number")return a
-if(typeof a==="string")return a
-y=J.x(a)
-if(!!y.$isiP)return new Date(a.y3)
-if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
-if(!!y.$ishH)return a
-if(!!y.$isO4)return a
-if(!!y.$isSg)return a
-if(!!y.$isWZ)return a
-if(!!y.$iseH)return a
-if(!!y.$isZ0){x=this.f.$1(a)
-w=this.UI.$1(x)
-z.a=w
-if(w!=null)return w
-w={}
-z.a=w
-this.bK.$2(x,w)
-y.aN(a,new P.q1(z,this))
-return z.a}if(!!y.$isWO){v=y.gB(a)
-x=this.f.$1(a)
-w=this.UI.$1(x)
-if(w!=null){if(!0===w){w=new Array(v)
-this.bK.$2(x,w)}return w}w=new Array(v)
-this.bK.$2(x,w)
-for(u=0;u<v;++u){z=this.$1(y.t(a,u))
-if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
-$isEH:true},
-q1:{
-"^":"Tp:77;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true},
-a9:{
-"^":"Tp:48;a,b",
-$1:function(a){var z,y,x,w
-z=this.a
-y=z.length
-for(x=0;x<y;++x){w=z[x]
-if(w==null?a==null:w===a)return x}z.push(a)
-this.b.push(null)
-return y},
-$isEH:true},
-D6:{
-"^":"Tp:139;c",
-$1:function(a){var z=this.c
-if(a>=z.length)return H.e(z,a)
-return z[a]},
-$isEH:true},
-KC:{
-"^":"Tp:140;d",
-$2:function(a,b){var z=this.d
-if(a>=z.length)return H.e(z,a)
-z[a]=b},
-$isEH:true},
-xL:{
-"^":"Tp:13;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
-if(typeof a==="number")return a
-if(typeof a==="string")return a
-if(a instanceof Date)return P.Wu(a.getTime(),!0)
-if(a instanceof RegExp)throw H.b(P.SY("structured clone of RegExp"))
-if(Object.getPrototypeOf(a)===Object.prototype){z=this.f.$1(a)
-y=this.UI.$1(z)
-if(y!=null)return y
-y=P.Fl(null,null)
-this.bK.$2(z,y)
-for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=x.lo
-y.u(0,w,this.$1(a[w]))}return y}if(a instanceof Array){z=this.f.$1(a)
-y=this.UI.$1(z)
-if(y!=null)return y
-x=J.U6(a)
-v=x.gB(a)
-y=this.e?new Array(v):a
-this.bK.$2(z,y)
-if(typeof v!=="number")return H.s(v)
-u=J.w1(y)
-t=0
-for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
-return y}return a},
-$isEH:true},
-nl:{
-"^":"a;Rn>,fg>,R>",
-$isnl:true,
-$isSg:true},
-As3:{
-"^":"a;",
-bu:function(a){return this.lF().zV(0," ")},
-gA:function(a){var z=this.lF()
-z=H.VM(new P.zQ(z,z.zN,null,null),[null])
-z.zq=z.O2.H9
-return z},
-aN:function(a,b){this.lF().aN(0,b)},
-zV:function(a,b){return this.lF().zV(0,b)},
-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,141,31],
-ad:function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.Kp(z,0)])},
-lM:[function(a,b){var z=this.lF()
-return H.VM(new H.oA(z,b),[H.Kp(z,0),null])},"$1","git",2,0,142,31],
-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},
-gB:function(a){return this.lF().X5},
-tg:function(a,b){return this.lF().tg(0,b)},
-hV:function(a){return this.lF().tg(0,a)?a:null},
-h:function(a,b){return this.OS(new P.GE(b))},
-Rz:function(a,b){var z,y
-z=this.lF()
-y=z.Rz(0,b)
-this.p5(z)
-return y},
-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(z)},
-tt:function(a,b){return this.lF().tt(0,b)},
-br:function(a){return this.tt(a,!0)},
-V1:function(a){this.OS(new P.uQ())},
-OS:function(a){var z,y
-z=this.lF()
-y=a.$1(z)
-this.p5(z)
-return y},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.qU]}},
-GE:{
-"^":"Tp:13;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-rl:{
-"^":"Tp:13;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-uQ:{
-"^":"Tp:13;",
-$1:[function(a){return J.U2(a)},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-D7:{
-"^":"ark;Yn,iz",
-gye:function(){var z=this.iz
-return P.F(z.ad(z,new P.hT()),!0,W.h4)},
-aN:function(a,b){H.bQ(this.gye(),b)},
-u:function(a,b,c){var z=this.gye()
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.Bj(z[b],c)},
-sB:function(a,b){var z=this.gye().length
-if(b>=z)return
-else if(b<0)throw H.b(P.u("Invalid list length"))
-this.UZ(0,b,z)},
-h:function(a,b){this.iz.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.iz.NL;z.G();)y.appendChild(z.lo)},
-tg:function(a,b){return!1},
-GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
-Jd:function(a){return this.GT(a,null)},
-YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},
-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)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)J.Mp(z)
-return z},
-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.qD(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)
-return z[b]},
-gA:function(a){var z=this.gye()
-return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
-hT:{
-"^":"Tp:13;",
-$1:function(a){return!!J.x(a).$ish4},
-$isEH:true},
-GS:{
-"^":"Tp:13;",
-$1:function(a){return J.Mp(a)},
-$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
-"^":"",
-pR:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gJp:function(a){var z=a.tY
-if(z!=null)if(J.xC(z.gzS(),"Null"))if(J.xC(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
-else if(J.xC(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
-else if(J.xC(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
-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)},
-Gn:[function(a){return this.gNe(a)},"$0","gyX",0,0,69],
-vQ:[function(a,b,c){var z,y
-z=a.tY
-if(b===!0)J.r0(z).ml(new B.qB(a)).Qy(c)
-else{y=J.w1(z)
-y.u(z,"fields",null)
-y.u(z,"elements",null)
-c.$0()}},"$2","gNe",4,0,144,145,90],
-static:{lu:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.EL.ZL(a)
-C.EL.XI(a)
-return a}}},
-qB:{
-"^":"Tp:13;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.sdN(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,130,"call"],
-$isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
-"^":"",
-hx:{
-"^":"V11;Xh,f2,Rr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-gCF:function(a){return a.Rr},
-sCF:function(a,b){a.Rr=this.ct(a,C.tg,a.Rr,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,97,98],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,99,100],
-Pr:[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,99,33],
-RF:[function(a,b){J.r0(a.Xh).Qy(b)},"$1","gvC",2,0,20,90],
-static:{CoW:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Rr=null
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.yd.ZL(a)
-C.yd.XI(a)
-return a}}},
-V11:{
-"^":"uL+Pi;",
-$isd3:true},
-wU:{
-"^":"Tp:101;a",
-$1:[function(a){var z,y
-z=this.a
-y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,82,"call"],
-$isEH:true},
-cL:{
-"^":"Tp:131;a",
-$1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,82,"call"],
-$isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
-"^":"",
-L4:{
-"^":"V12;PM,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.PM).Qy(b)},"$1","gvC",2,0,20,90],
-static:{MB:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.za.ZL(a)
-C.za.XI(a)
-return a}}},
-V12:{
-"^":"uL+Pi;",
-$isd3:true},
-Mb:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{RVI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ag.ZL(a)
-C.Ag.XI(a)
-return a}}},
-mO:{
-"^":"V13;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Ch:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ie.ZL(a)
-C.Ie.XI(a)
-return a}}},
-V13:{
-"^":"uL+Pi;",
-$isd3:true},
-DE:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{oB:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ig.ZL(a)
-C.Ig.XI(a)
-return a}}},
-U1:{
-"^":"V14;yR,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.yR).Qy(b)},"$1","gvC",2,0,20,90],
-TY:[function(a){J.r0(a.yR).Qy(new E.Kv(a))},"$0","gW6",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{hm:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.VLs.ZL(a)
-C.VLs.XI(a)
-return a}}},
-V14:{
-"^":"uL+Pi;",
-$isd3:true},
-Kv:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
-$isEH:true},
-H8:{
-"^":"V15;vd,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gPB:function(a){return a.vd},
-sPB:function(a,b){a.vd=this.ct(a,C.yL,a.vd,b)},
-RF:[function(a,b){J.r0(a.vd).Qy(b)},"$1","gvC",2,0,20,90],
-TY:[function(a){J.r0(a.vd).Qy(new E.uN(a))},"$0","gW6",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{ZhX:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.hh.ZL(a)
-C.hh.XI(a)
-return a}}},
-V15:{
-"^":"uL+Pi;",
-$isd3:true},
-uN:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
-$isEH:true},
-WS:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{jS:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.bP.ZL(a)
-C.bP.XI(a)
-return a}}},
-qh:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{Sc:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wK.ZL(a)
-C.wK.XI(a)
-return a}}},
-oF:{
-"^":"V16;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{UE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Tl.ZL(a)
-C.Tl.XI(a)
-return a}}},
-V16:{
-"^":"uL+Pi;",
-$isd3:true},
-Q6:{
-"^":"V17;uv,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.uv).Qy(b)},"$1","gvC",2,0,20,90],
-static:{chF:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.to.ZL(a)
-C.to.XI(a)
-return a}}},
-V17:{
-"^":"uL+Pi;",
-$isd3:true},
-uE:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{P3:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Rr.ZL(a)
-C.Rr.XI(a)
-return a}}},
-Zn:{
-"^":"V18;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{xK:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ij.ZL(a)
-C.ij.XI(a)
-return a}}},
-V18:{
-"^":"uL+Pi;",
-$isd3:true},
-n5:{
-"^":"V19;h1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.h1).Qy(b)},"$1","gvC",2,0,20,90],
-static:{iOo:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.aV.ZL(a)
-C.aV.XI(a)
-return a}}},
-V19:{
-"^":"uL+Pi;",
-$isd3:true},
-Ma:{
-"^":"V20;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Ii:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.iR.ZL(a)
-C.iR.XI(a)
-return a}}},
-V20:{
-"^":"uL+Pi;",
-$isd3:true},
-wN:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{ML:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.L6.ZL(a)
-C.L6.XI(a)
-return a}}},
-ds:{
-"^":"V21;wT,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.wT).Qy(b)},"$1","gvC",2,0,20,90],
-nK:[function(a){J.r0(a.wT).Qy(new E.Gf(a))},"$0","guT",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{pI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wP.ZL(a)
-C.wP.XI(a)
-return a}}},
-V21:{
-"^":"uL+Pi;",
-$isd3:true},
-Gf:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
-$isEH:true},
-ou:{
-"^":"V22;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{tX:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.lX.ZL(a)
-C.lX.XI(a)
-return a}}},
-V22:{
-"^":"uL+Pi;",
-$isd3:true},
-av:{
-"^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gEQ:function(a){return a.CB},
-sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
-static:{Ci:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.CB=!1
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Wa.ZL(a)
-C.Wa.XI(a)
-return a}}},
-ZzR:{
-"^":"xI+Pi;",
-$isd3:true},
-uz:{
-"^":"V23;RX,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.RX).Qy(b)},"$1","gvC",2,0,20,90],
-nK:[function(a){J.r0(a.RX).Qy(new E.Cc(a))},"$0","guT",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{z1:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.bZ.ZL(a)
-C.bZ.XI(a)
-return a}}},
-V23:{
-"^":"uL+Pi;",
-$isd3:true},
-Cc:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(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:{
-"^":"Y2;B1>,YK,H,Zn<,vs<,ki<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
-gtT:function(a){return J.on(this.H)},
-C4:function(a){var z,y,x,w,v,u,t,s
-z=this.B1
-y=J.UQ(z,"threshold")
-x=this.ks
-if(x.length>0)return
-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.Mx(this.H))>0},
-mW:function(a,b,c,d){var z,y
-z=this.H
-this.Vh=H.d(z.gAv())
-this.ZX=G.P0(J.L9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
-y=J.RE(z)
-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"
-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())
-this.ki=G.dj(y.gtT(z).gDu(),this.YK.Av)}z=this.oH
-z.push(this.vs)
-z.push(this.ki)},
-static:{SJ:function(a,b,c,d){var z,y
-z=H.VM([],[G.Y2])
-y=d!=null?d.yt+1:0
-z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
-z.k7(d)
-z.mW(a,b,c,d)
-return z}}},
-kK:{
-"^":"V24;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,WC,Hm=,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gB1:function(a){return a.oi},
-sB1:function(a,b){a.oi=this.ct(a,C.vb,a.oi,b)},
-gPL:function(a){return a.TH},
-sPL:function(a,b){a.TH=this.ct(a,C.He,a.TH,b)},
-gLW:function(a){return a.WT},
-sLW:function(a,b){a.WT=this.ct(a,C.Gs,a.WT,b)},
-gUo:function(a){return a.Uw},
-sUo:function(a,b){a.Uw=this.ct(a,C.Dj,a.Uw,b)},
-gEl:function(a){return a.Ik},
-sEl:function(a,b){a.Ik=this.ct(a,C.YD,a.Ik,b)},
-gnZ:function(a){return a.oo},
-snZ:function(a,b){a.oo=this.ct(a,C.bE,a.oo,b)},
-gNG:function(a){return a.fE},
-sNG:function(a,b){a.fE=this.ct(a,C.aH,a.fE,b)},
-gQl:function(a){return a.ev},
-sQl:function(a,b){a.ev=this.ct(a,C.zz,a.ev,b)},
-gZA:function(a){return a.TM},
-sZA:function(a,b){a.TM=this.ct(a,C.TW,a.TM,b)},
-n1:[function(a,b){var z,y,x,w,v
-z=a.oi
-if(z==null)return
-y=J.UQ(z,"samples")
-x=new P.iP(Date.now(),!1)
-x.EK()
-z=J.AG(y)
-a.WT=this.ct(a,C.Gs,a.WT,z)
-z=x.bu(0)
-a.Uw=this.ct(a,C.Dj,a.Uw,z)
-z=J.AG(J.UQ(a.oi,"depth"))
-a.oo=this.ct(a,C.bE,a.oo,z)
-w=J.UQ(a.oi,"period")
-if(typeof w!=="number")return H.s(w)
-z=C.CD.Sy(1000000/w,0)
-a.Ik=this.ct(a,C.YD,a.Ik,z)
-z=G.mG(J.UQ(a.oi,"timeSpan"))
-a.ev=this.ct(a,C.zz,a.ev,z)
-z=a.XX
-v=C.YI.bu(z*100)+"%"
-a.fE=this.ct(a,C.aH,a.fE,v)
-J.aT(a.oi).N3(a.oi)
-J.kW(a.oi,"threshold",z)
-this.Zb(a)},"$1","gd0",2,0,20,57],
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=R.tB([])
-a.Hm=new G.XN(z,null,null)
-this.Zb(a)},
-m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,20,57],
-RF:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).Qy(b)},"$1","gvC",2,0,20,90],
-Zb:function(a){if(a.oi==null)return
-this.GN(a)},
-GN:function(a){var z,y,x,w,v
-z=J.aT(a.oi).gBC()
-if(z==null)return
-try{a.Hm.rT(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-N.QM("").xH("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),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,91,92],
-Vj:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,91,92],
-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()
-w.qU(v-1)}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,93,1,94,95],
-static:{"^":"B6",jD:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.WT=""
-a.Uw=""
-a.Ik=""
-a.oo=""
-a.fE=""
-a.ev=""
-a.XX=0.0002
-a.TM="uv"
-a.WC="#tableTree"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.kS.ZL(a)
-C.kS.XI(a)
-return a}}},
-V24:{
-"^":"uL+Pi;",
-$isd3:true},
-Xy:{
-"^":"Tp:101;a",
-$1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,146,"call"],
-$isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
-"^":"",
-oa:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{IB:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.LN.ZL(a)
-C.LN.XI(a)
-return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
-"^":"",
-St:{
-"^":"V25;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.OoF.ZL(a)
-C.OoF.XI(a)
-return a}}},
-V25:{
-"^":"uL+Pi;",
-$isd3:true},
-IW:{
-"^":"V26;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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,147,14],
-kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,147,14],
-static:{zr:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.F2.ZL(a)
-C.F2.XI(a)
-return a}}},
-V26:{
-"^":"uL+Pi;",
-$isd3:true},
-GG:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ow)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-r8:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ow)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-Qh:{
-"^":"V27;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.kd.ZL(a)
-C.kd.XI(a)
-return a}}},
-V27:{
-"^":"uL+Pi;",
-$isd3:true},
-Oz:{
-"^":"V28;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ji.ZL(a)
-C.Ji.XI(a)
-return a}}},
-V28:{
-"^":"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.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)
-u=[]
-C.Nm.FV(u,C.Nm.ez([w,H.RR(v[0],null)],P.En()))
-u=new P.Tz(u)
-u.$builtinTypeInfo=[null]
-z.V7("addRow",[u])}}},
-Z4:{
-"^":"V29;wd,iw,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.iw==null)a.iw=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
-z=a.iw
-if(z==null)return
-z.eC(a.wd)
-y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
-if(y!=null){z=a.iw
-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,20,57],
-static:{d7:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wQ.ZL(a)
-C.wQ.XI(a)
-return a}}},
-V29:{
-"^":"uL+Pi;",
-$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
-"^":"",
-If:{
-"^":"a;X6,YT",
-eC:function(a){var z,y,x,w,v,u,t,s,r,q
-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.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-w=J.R7(a.gaf(),"Idle")
-v=a.gij()
-for(u=0;u<a.glI().length;++u){y=a.glI()
-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()
-if(u>=y.length)return H.e(y,u)
-r=y[u].wZ
-if(r===0){q=0
-while(!0){y=a.glI()
-if(u>=y.length)return H.e(y,u)
-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()
-if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].XE.length))break
-c$1:{if(q===w)break c$1
-y=a.glI()
-if(u>=y.length)return H.e(y,u)
-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.V7("addRow",[y])}}},
-qk:{
-"^":"V30;ck,ts,LR,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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,97,98],
-Vp:[function(a){a.ck.m7().ml(new L.LX(a))},"$0","gJD",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.ts=P.rT(P.ii(0,0,0,0,0,1),this.gJD(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.ts
-if(z!=null){z.ed()
-a.ts=null}},
-RF:[function(a,b){J.r0(a.ck).Qy(b)},"$1","gvC",2,0,20,90],
-Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,147,14],
-kf:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,147,14],
-static:{Qtp:function(a){var z,y,x
-z=P.zV(J.UQ($.BY,"DataTable"),null)
-y=P.L5(null,null,null,P.qU,W.I0)
-x=P.qU
-x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
-a.LR=new L.If(new G.Kf(z),null)
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=y
-a.ZQ=x
-C.Xe.ZL(a)
-C.Xe.XI(a)
-return a}}},
-V30:{
-"^":"uL+Pi;",
-$isd3:true},
-LX:{
-"^":"Tp:13;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.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.YT=v
-w.u(0,"isStacked",!0)
-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)}if(z.ts!=null)z.ts=P.rT(P.ii(0,0,0,0,0,1),J.OY(z))},"$1",null,2,0,null,148,"call"],
-$isEH:true},
-CV:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ck)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-Vq:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ck)},"$1",null,2,0,null,130,"call"],
-$isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
-"^":"",
-xh:{
-"^":"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.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.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.QC(t,v)
-s=C.xB.U("  ",b)
-s=x.vM+=s
-x.vM=s+"]\n"}else{s=C.xB.U("  ",b)
-x.vM+=s
-s="\""+H.d(u)+"\": "+H.d(t)
-s=x.vM+=s
-x.vM=s+"\n"}}z.Rz(0,a)},
-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.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.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.QC(v,w)
-u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"]\n"}else{u=C.xB.U("  ",b)
-x.vM+=u
-u=x.vM+=typeof v==="string"?v:H.d(v)
-x.vM=u+"\n"}}z.Rz(0,a)}},
-vj:{
-"^":"V31;Ly,cs,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gIr:function(a){return a.Ly},
-ez:function(a,b){return this.gIr(a).$1(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.Ly
-z.vM=""
-z.KF("{\n")
-new Z.xh(z,y).LE(x,0)
-z.KF("}\n")
-z=z.vM
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,20,57],
-static:{M7:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Yt.ZL(a)
-C.Yt.XI(a)
-return a}}},
-V31:{
-"^":"uL+Pi;",
-$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
-"^":"",
-LU:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{rA:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Z3.ZL(a)
-C.Z3.XI(a)
-return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
-"^":"",
-CX:{
-"^":"V32;iI,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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,97,98],
-RF:[function(a,b){J.r0(a.iI).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Dc:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.MG.ZL(a)
-C.MG.XI(a)
-return a}}},
-V32:{
-"^":"uL+Pi;",
-$isd3:true}}],["logging","package:logging/logging.dart",,N,{
-"^":"",
-Rw:{
-"^":"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.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.tQ()},
-mL: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()
-y=new P.iP(Date.now(),!1)
-y.EK()
-x=$.xO
-$.xO=x+1
-w=new N.HV(a,b,z,y,x,c,d)
-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.D8,a,b,c)},
-kS: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)},
-ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
-To:function(a){return this.ZG(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)},
-tQ: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("").tQ()},
-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)},
-$isRw:true,
-static:{"^":"Uj",QM:function(a){return $.Iu().to(a,new N.aO(a))}}},
-aO:{
-"^":"Tp:69;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.Rw)
-v=new N.Rw(z,x,null,w,H.VM(new Q.A2(w),[null,null]),null)
-v.QL(z,x,w)
-return v},
-$isEH:true},
-qV:{
-"^":"a;oc>,P>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isqV&&this.P===b.P},
-C:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P<z},
-E:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P<=z},
-D:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P>z},
-F:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P>=z},
-iM:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P-z},
-giO:function(a){return this.P},
-bu:function(a){return this.oc},
-$isqV:true,
-static:{"^":"X9,tmj,Enk,LkO,tY,kH8,hlK,MHK,fM,lDu,uxc"}},
-HV:{
-"^":"a;OR<,G1>,iJ,Fl<,c0,kc>,I4<",
-bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
-$isHV:true,
-static:{"^":"xO"}}}],["","main.dart",,F,{
-"^":"",
-E2:function(){var z,y
-N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e392())
-N.QM("").To("Starting Observatory")
-N.QM("").To("Loading Google Charts API")
-z=J.UQ($.Si(),"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.e393())},
-e392:{
-"^":"Tp:150;",
-$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,149,"call"],
-$isEH:true},
-e393:{
-"^":"Tp:13;",
-$1:[function(a){N.QM("").To("Initializing Polymer")
-A.YK()},"$1",null,2,0,null,14,"call"],
-$isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
-"^":"",
-md:{
-"^":"V33;i4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-giC:function(a){return a.i4},
-siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
-static:{DCi:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.i4=!0
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.kD.ZL(a)
-C.kD.XI(a)
-return a}}},
-V33:{
-"^":"uL+Pi;",
-$isd3:true},
-Bm:{
-"^":"V34;KU,V4,Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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:{AJm:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.KU="#"
-a.V4="---"
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.IG.ZL(a)
-C.IG.XI(a)
-return a}}},
-V34:{
-"^":"uL+Pi;",
-$isd3:true},
-Ya:{
-"^":"V35;KU,V4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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:{vn:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.KU="#"
-a.V4="---"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.nn.ZL(a)
-C.nn.XI(a)
-return a}}},
-V35:{
-"^":"uL+Pi;",
-$isd3:true},
-Ww:{
-"^":"V36;rU,SB,z2,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.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)},
-W1:[function(a,b,c,d){var z=a.SB
-if(z===!0)return
-a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,102,1,94,95],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,18],
-static:{ZC:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.SB=!1
-a.z2="Refresh"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.J7.ZL(a)
-C.J7.XI(a)
-return a}}},
-V36:{
-"^":"uL+Pi;",
-$isd3:true},
-ye:{
-"^":"uL;AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{Fv:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.br.ZL(a)
-C.br.XI(a)
-return a}}},
-G1:{
-"^":"V37;Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.OKl.ZL(a)
-C.OKl.XI(a)
-return a}}},
-V37:{
-"^":"uL+Pi;",
-$isd3:true},
-fl:{
-"^":"V38;Jo,iy,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","gQ1",2,0,20,57],
-gu6:function(a){var z=a.iy
-if(z!=null)return J.Ds(z)
-else return""},
-su6:function(a,b){},
-static:{zf:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.RRl.ZL(a)
-C.RRl.XI(a)
-return a}}},
-V38:{
-"^":"uL+Pi;",
-$isd3:true},
-UK:{
-"^":"V39;VW,Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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:{IV:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ct.ZL(a)
-C.ct.XI(a)
-return a}}},
-V39:{
-"^":"uL+Pi;",
-$isd3:true},
-wM:{
-"^":"V40;Au,Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.HR.ZL(a)
-C.HR.XI(a)
-return a}}},
-V40:{
-"^":"uL+Pi;",
-$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
-"^":"",
-F1:{
-"^":"V41;qC,MR,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gzj:function(a){return a.qC},
-szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
-Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
-if(a.qC===!0){z=H.VM([],[G.uG])
-y=new U.ho(P.L5(null,null,null,P.qU,P.oh),0,"unknown","unknown",0,!1,!1,"",null,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)
-y.md()
-y.PI()
-y=new G.mL(z,null,null,new G.OR("/vm",null,null,null,null,null),y,null,a,null,null,null)
-y.E0(a)
-a.MR=y}else{z=H.VM([],[G.uG])
-y=new U.XK(null,"unknown","unknown",0,!1,!1,"",null,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)
-y.md()
-y.eY()
-y=new G.mL(z,null,null,new G.OR("/vm",null,null,null,null,null),y,null,a,null,null,null)
-y.Ty(a)
-a.MR=y}},
-static:{JT8:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.qC=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.BH.ZL(a)
-C.BH.XI(a)
-return a}}},
-V41:{
-"^":"uL+Pi;",
-$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
-"^":"",
-uL:{
-"^":"xc;AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-Es:function(a){A.zs.prototype.Es.call(this,a)},
-wN:function(a,b,c,d){A.zs.prototype.wN.call(this,a,b,c,d)},
-dQ:function(a){A.zs.prototype.dQ.call(this,a)},
-aR:function(a){A.zs.prototype.aR.call(this,a)},
-cD:[function(a,b,c,d){$.W5.Bs(b,c,d)},"$3","gRh",6,0,151,2,94,95],
-XD:[function(a,b){$.W5.toString
-return"#"+H.d(b)},"$1","gn0",2,0,152,153],
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,154,155],
-Ze:[function(a,b){return G.As(b)},"$1","gbJ",2,0,15,16],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,156,157],
-i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,156,157],
-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,156,157],
-GA:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,156,157],
-ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,156,157],
-wm:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,156,157],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,156,157],
-Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,156,157],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,156,157],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,156,157],
-static:{EE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Pfz.ZL(a)
-C.Pfz.XI(a)
-return a}}}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
-"^":"",
-Ap:{
-"^":"a;",
-sP:function(a,b){},
-$isAp:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
-"^":"",
-Pi:{
-"^":"a;",
-gqh:function(a){var z=a.AP
-if(z==null){z=this.gqw(a)
-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","gqw",0,0,18],
-NB:[function(a){a.AP=null},"$0","gym",0,0,18],
-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,111],
-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)},
-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,{
-"^":"",
-yj:{
-"^":"a;",
-$isyj:true},
-qI:{
-"^":"yj;WA>,oc>,jL,zZ",
-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
-if($.Td)return
-if($.Oo==null)return
-$.Td=!0
-z=0
-y=null
-do{++z
-if(z===1000)y=[]
-x=$.Oo
-w=[]
-w.$builtinTypeInfo=[F.d3]
-$.Oo=w
-for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
-s=J.RE(t)
-if(s.gnz(t)){if(s.HC(t)){if(w)y.push([u,t])
-v=!0}$.Oo.push(t)}}}while(z<1000&&v)
-if(w&&v){w=$.S5()
-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
-$.Td=!1},
-Ht:function(){var z={}
-z.a=!1
-z=new O.YC(z)
-return new P.yQ(null,null,null,null,new O.u3(z),new O.bF(z),null,null,null,null,null,null)},
-YC:{
-"^":"Tp:158;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:69;a",
-$0:[function(){this.a.a=!1
-O.N0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-u3:{
-"^":"Tp:30;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,27,28,29,31,"call"],
-$isEH:true},
-yJ:{
-"^":"Tp:69;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:159;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,27,28,29,31,"call"],
-$isEH:true},
-f6:{
-"^":"Tp:13;bK,Gq,Rm,w3",
-$1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,65,"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.ew(J.bI(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)
-if(v>=w)return H.e(x,v)
-x[v]=u
-if(0>=u.length)return H.e(u,0)
-u[0]=v}if(typeof y!=="number")return H.s(y)
-t=0
-for(;t<y;++t){if(0>=w)return H.e(x,0)
-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.bI(u.g(b,t),1)))
-o=x[v]
-n=x[r]
-m=t-1
-if(p){if(v>=w)return H.e(x,v)
-if(r>=w)return H.e(x,r)
-if(m>=n.length)return H.e(n,m)
-p=n[m]
-if(t>=o.length)return H.e(o,t)
-o[t]=p}else{if(r>=w)return H.e(x,r)
-if(t>=n.length)return H.e(n,t)
-p=n[t]
-if(typeof p!=="number")return p.g()
-if(v>=w)return H.e(x,v)
-n=o.length
-if(m>=n)return H.e(o,m)
-m=o[m]
-if(typeof m!=="number")return m.g()
-m=P.J(p+1,m+1)
-if(t>=n)return H.e(o,t)
-o[t]=m}}return x},
-kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=a.length
-y=z-1
-if(0>=z)return H.e(a,0)
-x=a[0].length-1
-if(y<0)return H.e(a,y)
-w=a[y]
-if(x<0||x>=w.length)return H.e(w,x)
-v=w[x]
-u=[]
-while(!0){if(!(y>0||x>0))break
-c$0:{if(y===0){u.push(2);--x
-break c$0}if(x===0){u.push(3);--y
-break c$0}w=y-1
-if(w<0)return H.e(a,w)
-t=a[w]
-s=x-1
-r=t.length
-if(s<0||s>=r)return H.e(t,s)
-q=t[s]
-if(x<0||x>=r)return H.e(t,x)
-p=t[x]
-if(y<0)return H.e(a,y)
-t=a[y]
-if(s>=t.length)return H.e(t,s)
-o=t[s]
-n=P.J(P.J(p,o),q)
-if(n===q){if(q==null?v==null:q===v)u.push(0)
-else{u.push(1)
-v=q}x=s
-y=w}else if(n===p){u.push(3)
-v=p
-y=w}else{u.push(2)
-v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},
-rN:function(a,b,c){var z,y,x
-for(z=J.U6(a),y=0;y<c;++y){x=z.t(a,y)
-if(y>=b.length)return H.e(b,y)
-if(!J.xC(x,b[y]))return y}return c},
-xU:function(a,b,c){var z,y,x,w,v
-z=J.U6(a)
-y=z.gB(a)
-x=b.length
-w=0
-while(!0){if(w<c){--y
-v=z.t(a,y);--x
-if(x<0||x>=b.length)return H.e(b,x)
-v=J.xC(v,b[x])}else v=!1
-if(!v)break;++w}return w},
-jj:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.Wx(c)
-y=P.J(z.W(c,b),f-e)
-x=J.x(b)
-w=x.n(b,0)&&e===0?G.rN(a,d,y):0
-v=z.n(c,J.q8(a))&&f===d.length?G.xU(a,d,y-w):0
-b=x.g(b,w)
-e+=w
-c=z.W(c,v)
-f-=v
-z=J.Wx(c)
-if(J.xC(z.W(c,b),0)&&f-e===0)return C.dn
-if(J.xC(b,c)){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,b,0)
-for(;e<f;e=s){z=t.em
-s=e+1
-if(e>>>0!==e||e>=d.length)return H.e(d,e)
-J.bi(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
-u=[]
-x=new P.Yp(u)
-x.$builtinTypeInfo=[null]
-return[new G.DA(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
-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.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.Ld=J.ew(t.Ld,1)
-o=J.ew(o,1)
-z=t.em
-if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
-break
-case 2:if(t==null){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}t.Ld=J.ew(t.Ld,1)
-o=J.ew(o,1)
-break
-case 3:if(t==null){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}z=t.em
-if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
-break}if(t!=null)q.push(t)
-return q},
-m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.RE(b)
-y=z.gWA(b)
-z=z.gvH(b)
-x=J.qA(b.gem())
-w=b.gNg()
-if(w==null)w=0
-v=new P.Yp(x)
-v.$builtinTypeInfo=[null]
-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.Ft=J.ew(q.Ft,s)
-if(t)continue
-z=u.Ft
-y=J.ew(z,u.VD.G4.length)
-x=q.Ft
-p=P.J(y,J.ew(x,q.Ld))-P.y(z,x)
-if(p>=0){C.Nm.KI(a,r);--r
-z=J.bI(q.Ld,q.VD.G4.length)
-if(typeof z!=="number")return H.s(z)
-s-=z
-z=J.ew(u.Ld,J.bI(q.Ld,p))
-u.Ld=z
-y=u.VD.G4.length
-x=q.VD.G4.length
-if(J.xC(z,0)&&y+x-p===0)t=!0
-else{o=q.em
-if(J.u6(u.Ft,q.Ft)){z=u.VD
-z=z.Mu(z,0,J.bI(q.Ft,u.Ft))
-o.toString
-if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
-H.IC(o,0,z)}if(J.z8(J.ew(u.Ft,u.VD.G4.length),J.ew(q.Ft,q.Ld))){z=u.VD
-J.bj(o,z.Mu(z,J.bI(J.ew(q.Ft,q.Ld),u.Ft),u.VD.G4.length))}u.em=o
-u.VD=q.VD
-if(J.u6(q.Ft,u.Ft))u.Ft=q.Ft
-t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.xe(a,r,u);++r
-n=J.bI(u.Ld,u.VD.G4.length)
-q.Ft=J.ew(q.Ft,n)
-if(typeof n!=="number")return H.s(n)
-s+=n
-t=!0}else t=!1}if(!t)a.push(u)},
-hs:function(a,b){var z,y
-z=H.VM([],[G.DA])
-for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},
-Qi:function(a,b){var z,y,x,w,v,u
-if(b.length<=1)return b
-z=[]
-for(y=G.hs(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]
-u=J.zj(w)
-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.ew(v.gvH(w),w.gNg()),w.gem(),0,w.gRt().G4.length))}return z},
-DA:{
-"^":"a;WA>,VD,em<,Ft,Ld",
-gvH:function(a){return this.Ft},
-gRt:function(){return this.VD},
-gNg:function(){return this.Ld},
-XP:function(a){var z
-if(typeof a==="number"&&Math.floor(a)===a){z=this.Ft
-if(typeof z!=="number")return H.s(z)
-z=a<z}else z=!0
-if(z)return!1
-if(!J.xC(this.Ld,this.VD.G4.length))return!0
-return J.u6(a,J.ew(this.Ft,this.Ld))},
-bu:function(a){var z,y
-z="#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "
-y=this.VD
-return z+y.bu(y)+", addedCount: "+H.d(this.Ld)+">"},
-$isDA:true,
-static:{K6:function(a,b,c,d){var z
-if(d==null)d=[]
-if(c==null)c=0
-z=new P.Yp(d)
-z.$builtinTypeInfo=[null]
-return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
-"^":"",
-nd:{
-"^":"a;"},
-vly:{
-"^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
-"^":"",
-kM:[function(){return O.N0()},"$0","Jy",0,0,18],
-Wi:function(a,b,c,d){var z=J.RE(a)
-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;R9:ro%,V2:dUC%,me:pt%",
-gqh:function(a){var z
-if(this.gR9(a)==null){z=this.glZ(a)
-this.sR9(a,P.bK(this.gkk(a),z,!0,null))}z=this.gR9(a)
-z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gnz:function(a){var z,y
-if(this.gR9(a)!=null){z=this.gR9(a)
-y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-W7Y:[function(a){var z,y,x,w
-z=$.Oo
-if(z==null){z=H.VM([],[F.d3])
-$.Oo=z}z.push(a)
-$.ax=$.ax+1
-y=P.L5(null,null,null,P.GD,P.a)
-for(z=this.gbx(a),z=$.mX().Me(0,z,new A.Wq(!0,!1,!0,C.FQ,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=J.O6(z.lo)
-w=$.cp().eA.t(0,x)
-if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+this.bu(a)))
-y.u(0,x,w.$1(a))}this.sV2(a,y)},"$0","glZ",0,0,18],
-L5:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,18],
-HC:function(a){var z,y
-z={}
-if(this.gV2(a)==null||!this.gnz(a))return!1
-z.a=this.gme(a)
-this.sme(a,null)
-this.gV2(a).aN(0,new F.X6(z,a))
-if(z.a==null)return!1
-y=this.gR9(a)
-z=H.VM(new P.Yp(z.a),[T.yj])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
-return!0},
-nq:function(a,b){if(!this.gnz(a))return
-if(this.gme(a)==null)this.sme(a,[])
-this.gme(a).push(b)},
-$isd3:true},
-X6:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z,y,x,w,v
-z=this.b
-y=$.cp().jD(z,a)
-if(!J.xC(b,y)){x=this.a
-w=x.a
-if(w==null){v=[]
-x.a=v
-x=v}else x=w
-x.push(H.VM(new T.qI(z,a,b,y),[null]))
-J.iv(z).u(0,a,y)}},
-$isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
-"^":"",
-Sk:{
-"^":"Pi;",
-gP:function(a){return this.DA},
-sP:function(a,b){this.DA=F.Wi(this,C.Ha,this.DA,b)},
-bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.DA)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
-"^":"",
-wn:{
-"^":"uFU;b3@,iT,ao,AP,fn",
-gQV:function(){var z=this.iT
-if(z==null){z=P.bK(new Q.cj(this),null,!0,null)
-this.iT=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:function(a){return this.ao.length},
-sB:function(a,b){var z,y,x,w,v
-z=this.ao
-y=z.length
-if(y===b)return
-this.ct(this,C.Wn,y,b)
-x=y===0
-w=b===0
-this.ct(this,C.ai,x,w)
-this.ct(this,C.nZ,!x,!w)
-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))
-if(y<b||y>z.length)H.vh(P.TE(y,b,z.length))
-x=new H.bX(z,b,y)
-x.$builtinTypeInfo=[null]
-if(b<0)H.vh(P.N(b))
-if(y<0)H.vh(P.N(y))
-if(b>y)H.vh(P.TE(b,0,y))
-x=x.br(0)
-w=new P.Yp(x)
-w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,0))}else{v=[]
-x=new P.Yp(v)
-x.$builtinTypeInfo=[null]
-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.ao
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-y=z[b]
-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.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
-z=J.x(c)
-if(!z.$isWO&&!0)c=z.br(c)
-y=J.q8(c)
-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.ao
-H.xF(z,b,y)
-this.iH(G.K6(this,b,y,H.q9(z,b,y,null).br(0)))}H.vf(this.ao,b,c)},
-h:function(a,b){var z,y,x,w
-z=this.ao
-y=z.length
-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.iH(G.K6(this,y,1,null))
-C.Nm.h(z,b)},
-FV:function(a,b){var z,y,x,w
-z=this.ao
-y=z.length
-C.Nm.FV(z,b)
-this.On(y,z.length)
-x=z.length-y
-z=this.iT
-if(z!=null){w=z.iE
-z=w==null?z!=null:w!==z}else z=!1
-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.ao.length)H.vh(P.TE(b,0,this.gB(this)))
-y=c>=b
-if(!y||c>this.ao.length)H.vh(P.TE(c,b,this.gB(this)))
-x=c-b
-w=this.ao
-v=w.length
-u=v-x
-this.ct(this,C.Wn,v,u)
-t=v===0
-u=u===0
-this.ct(this,C.ai,t,u)
-this.ct(this,C.nZ,!t,!u)
-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))
-if(!y||c>w.length)H.vh(P.TE(c,b,w.length))
-z=new H.bX(w,b,c)
-z.$builtinTypeInfo=[null]
-if(b<0)H.vh(P.N(b))
-if(c<0)H.vh(P.N(c))
-if(b>c)H.vh(P.TE(b,0,c))
-z=z.br(0)
-y=new P.Yp(z)
-y.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
-UG:function(a,b,c){var z,y,x,w
-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.ao
-x=z.length
-C.Nm.sB(z,x+y)
-w=z.length
-H.qG(z,b+y,w,this,b)
-H.vf(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.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.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.iH(G.K6(this,b,1,null))
-if(b>=z.length)return H.e(z,b)
-z[b]=c},
-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.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.b3
-if(z==null)return!1
-y=G.Qi(this,z)
-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,111],
-$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
-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.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)
-if(s.C(w,0)||s.D(w,a.length))H.vh(P.TE(w,0,a.length))
-r=J.Wx(u)
-if(r.C(u,w)||r.D(u,a.length))H.vh(P.TE(u,w,a.length))
-q=r.W(u,w)
-p=t.gB(t)
-r=J.Wx(q)
-if(r.F(q,p)){o=r.W(q,p)
-n=s.g(w,p)
-s=a.length
-if(typeof o!=="number")return H.s(o)
-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.bI(p,q)
-r=a.length
-if(typeof o!=="number")return H.s(o)
-l=r+o
-n=s.g(w,p)
-C.Nm.sB(a,l)
-H.qG(a,n,l,a,u)
-H.qG(a,w,n,t,0)}}}}},
-uFU:{
-"^":"ark+Pi;",
-$isd3:true},
-cj:{
-"^":"Tp:69;a",
-$0:function(){this.a.iT=null},
-$isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
-"^":"",
-ya:{
-"^":"yj;G3>,jL,zZ,aC,w5",
-bu:function(a){var z
-if(this.aC)z="insert"
-else z=this.w5?"remove":"set"
-return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
-$isya:true},
-qC:{
-"^":"Pi;Zp,AP,fn",
-gvc:function(){return this.Zp.gvc()},
-gUQ:function(a){var z=this.Zp
-return z.gUQ(z)},
-gB:function(a){var z=this.Zp
-return z.gB(z)},
-gl0:function(a){var z=this.Zp
-return z.gB(z)===0},
-gor:function(a){var z=this.Zp
-return z.gB(z)!==0},
-t:function(a,b){return this.Zp.t(0,b)},
-u:function(a,b,c){var z,y,x,w
-z=this.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z){this.Zp.u(0,b,c)
-return}z=this.Zp
-x=z.gB(z)
-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.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.Uq,null,null),[null]))}},
-FV:function(a,b){J.Me(b,new V.zT(this))},
-V1:function(a){var z,y,x,w
-z=this.Zp
-y=z.gB(z)
-x=this.AP
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(x&&y>0){z.aN(0,new V.Lo(this))
-F.Wi(this,C.Wn,y,0)
-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.SV,null,null),[null]))
-this.nq(this,H.VM(new T.qI(this,C.Uq,null,null),[null]))},
-$isqC:true,
-$isZ0:true,
-static:{AB:function(a,b,c){var z
-if(!!a.$isBa)z=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-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:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"qC")}},
-Lo:{
-"^":"Tp:77;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,{
-"^":"",
-Qw:{
-"^":"Ap;TA,xy,i7,at,Cg",
-e5:function(a){return this.xy.$1(a)},
-nM:function(a){return this.at.$1(a)},
-TR:function(a,b){var z
-this.at=b
-z=this.e5(J.mu(this.TA,this.gqy()))
-this.Cg=z
-return z},
-cf:[function(a){var z=this.e5(a)
-if(J.xC(z,this.Cg))return
-this.Cg=z
-return this.nM(z)},"$1","gqy",2,0,13,58],
-S6:function(a){var z=this.TA
-if(z!=null)J.x0(z)
-this.TA=null
-this.xy=null
-this.i7=null
-this.at=null
-this.Cg=null},
-gP:function(a){var z=this.e5(J.Vm(this.TA))
-this.Cg=z
-return z},
-sP:function(a,b){J.ta(this.TA,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
-"^":"",
-Hj:function(a,b){var z,y,x,w,v
-if(a==null)return
-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)))return J.UQ(a,b)}else if(!!J.x(b).$isGD){z=a
-y=H.RB(z,"$isab",[P.qU,null],"$asab")
-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().ep.t(0,b))
-try{z=a
-y=b
-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)).$isJS){z=J.Lm(a)
-v=$.mX().F1(z,C.OV)
-if(!(v!=null&&v.fY===C.WH&&!v.Fo))throw w}else throw w}}z=$.YV()
-if(z.mL(C.D8))z.kS("can't get "+H.d(b)+" in "+H.d(a))
-return},
-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)
-return!0}}else if(!!J.x(b).$isGD){z=a
-y=H.RB(z,"$isab",[P.qU,null],"$asab")
-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().ep.t(0,b),c)
-return!0}try{$.cp().Cq(a,b,c)
-return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.Lm(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.YV()
-if(z.mL(C.D8))z.kS("can't set "+H.d(b)+" in "+H.d(a))
-return!1},
-cB:function(a){a=J.rr(a)
-if(a==="")return!0
-if(0>=a.length)return H.e(a,0)
-if(a[0]===".")return!1
-return $.uC().zD(a)},
-WR:{
-"^":"qK;HS,XF,xE,cX,GX,vA,Wf",
-gqc:function(){return this.HS==null},
-sP:function(a,b){var z=this.HS
-if(z!=null)z.rL(this.XF,b)},
-gIn:function(){return 2},
-TR:function(a,b){return L.qK.prototype.TR.call(this,this,b)},
-NJ:function(){this.xE=L.SE(this,this.XF)
-this.hQ(!0)},
-kH:function(){this.Wf=null
-this.HS=null
-this.XF=null},
-nf:function(a){this.HS.VV(this.XF,a)},
-hQ:function(a){var z,y
-z=this.Wf
-y=this.HS.Tl(this.XF)
-this.Wf=y
-if(a||J.xC(y,z))return!1
-this.zc(this.Wf,z)
-return!0},
-tF:function(){return this.hQ(!1)},
-$isAp:true},
-Tv:{
-"^":"a;OK",
-gB:function(a){return this.OK.length},
-gl0:function(a){return this.OK.length===0},
-gPu:function(){return!0},
-bu:function(a){if(!this.gPu())return"<invalid path>"
-return H.VM(new H.A8(this.OK,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.OK
-y=z.length
-x=b.OK
-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.OK,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
-x=536870911&x+((524287&x)<<10>>>0)
-x^=x>>>6}x=536870911&x+((67108863&x)<<3>>>0)
-x^=x>>>11
-return 536870911&x+((16383&x)<<15>>>0)},
-Tl:function(a){var z,y
-if(!this.gPu())return
-for(z=this.OK,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.Hj(a,y)}return a},
-rL:function(a,b){var z,y,x
-z=this.OK
-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.Hj(a,z[x])}if(y>=z.length)return H.e(z,y)
-return L.iu(a,z[y],b)},
-VV:function(a,b){var z,y,x,w
-if(!this.gPu()||this.OK.length===0)return
-z=this.OK
-y=z.length-1
-for(x=0;a!=null;x=w){b.$1(a)
-if(x>=y)break
-w=x+1
-if(x>=z.length)return H.e(z,x)
-a=L.Hj(a,z[x])}},
-$isTv:true,
-static:{hk:function(a){var z,y,x,w,v,u,t,s
-if(!!J.x(a).$isWO){z=P.F(a,!1,null)
-y=new H.a7(z,z.length,0,null)
-y.$builtinTypeInfo=[H.Kp(z,0)]
-for(;y.G();){x=y.lo
-if((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isGD)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Tv(z)}if(a==null)a=""
-w=$.aB().t(0,a)
-if(w!=null)return w
-if(!L.cB(a))return $.V6()
-v=[]
-y=J.rr(a).split(".")
-u=new H.a7(y,y.length,0,null)
-u.$builtinTypeInfo=[H.Kp(y,0)]
-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().Nz.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
-y=$.aB()
-if(y.X5>=100){y.toString
-u=new P.i5(y)
-u.$builtinTypeInfo=[H.Kp(y,0)]
-s=u.gA(u)
-if(!s.G())H.vh(H.DU())
-y.Rz(0,s.gl())}y.u(0,a,w)
-return w}}},
-oq:{
-"^":"Tp:13;",
-$1:function(a){return},
-$isEH:true},
-f7:{
-"^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isGD?$.b7().ep.t(0,a):a},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-vH:{
-"^":"Tv;OK",
-gPu:function(){return!1},
-static:{"^":"qr"}},
-YJG:{
-"^":"Tp:69;",
-$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},
-ww:{
-"^":"qK;xE,cb,cX,GX,vA,Wf",
-gqc:function(){return this.cb==null},
-gIn:function(){return 3},
-TR:function(a,b){return L.qK.prototype.TR.call(this,this,b)},
-NJ:function(){var z,y,x,w
-this.hQ(!0)
-for(z=this.cb,y=z.length,x=0;x<y;x+=2){w=z[x]
-if(w!==C.dV){z=$.xG
-if(z!=null){y=z.IU
-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.yj.u(0,this.cX,this)
-this.nf(z.gTT(z))
-this.xE=null
-break}}},
-kH:function(){var z,y,x,w
-this.Wf=null
-for(z=0;y=this.cb,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.cb=null},
-yN:function(a,b){var z
-if(this.GX!=null||this.cb==null)throw H.b(P.w("Cannot add paths once started."))
-if(!J.x(b).$isTv)b=L.hk(b)
-z=this.cb
-z.push(a)
-z.push(b)},
-ti:function(a){return this.yN(a,null)},
-nf:function(a){var z,y,x,w,v
-for(z=0;y=this.cb,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").VV(w,a)}}},
-hQ:function(a){var z,y,x,w,v,u,t,s,r
-J.wg(this.Wf,C.jn.cU(this.cb.length,2))
-for(z=!1,y=null,x=0;w=this.cb,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.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.vA
-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.Wf,v))}J.kW(this.Wf,v,r)
-z=!0}if(!z)return!1
-this.Aw(this.Wf,y,w)
-return!0},
-tF:function(){return this.hQ(!1)},
-$isAp:true},
-iNc:{
-"^":"a;"},
-qK:{
-"^":"Ap;cX<",
-CC:function(){return this.GX.$0()},
-K0:function(a){return this.GX.$1(a)},
-cF:function(a,b){return this.GX.$2(a,b)},
-Mm:function(a,b,c){return this.GX.$3(a,b,c)},
-ga8: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.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
-this.GX=b
-this.vA=P.J(this.gIn(),X.RI(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,20,14],
-SG:function(){var z=0
-while(!0){if(!(z<1000&&this.tF()))break;++z}return z>0},
-Aw:function(a,b,c){var z,y,x,w
-try{switch(this.vA){case 0:this.CC()
-break
-case 1:this.K0(a)
-break
-case 2:this.cF(a,b)
-break
-case 3:this.Mm(a,b,c)
-break}}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}},
-zc:function(a,b){return this.Aw(a,b,null)}},
-zG:{
-"^":"a;IU,yj,rS,HN,op",
-TR:function(a,b){this.yj.u(0,b.gcX(),b)
-b.nf(this.gTT(this))},
-we:[function(a,b){var z=J.x(b)
-if(!!z.$iswn)this.wq(b.gQV())
-if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,160,82],
-wq: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.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.op)return
-z=this.HN
-if(z==null)z=P.YM(null,null,null,null,null)
-this.HN=this.rS
-this.rS=z
-for(y=this.yj,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.oz]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
-if(v.ga8())v.nf(this.gTT(this))}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","gTh",0,0,18],
-t9:[function(a){var z,y
-for(z=this.yj,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.ga8())y.tF()}this.op=!0
-P.rb(this.gTh(this))},"$1","gCP",2,0,20,161],
-static:{"^":"xG",SE:function(a,b){var z,y
-z=$.xG
-if(z!=null){y=z.IU
-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.yj.u(0,a.cX,a)
-a.nf(z.gTT(z))}}}}],["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.Qe(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,13,21],
-Qe:{
-"^":"Tp:77;a",
-$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,121,64,"call"],
-$isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
-"^":"",
-YG:function(a,b,c){if(a==null||$.AM()==null)return
-$.AM().V7("shimStyling",[a,b,c])},
-q3:function(a){var z,y,x,w,v
-if(a==null)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.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.XO(v,null)
-$.Es().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw v}},
-M8:[function(a){var z,y
-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","F4",2,0,62,63],
-Ad:function(a,b){$.Ej().u(0,a,b)
-H.Go(J.UQ($.Si(),"Polymer"),"$isr7").PO([a])},
-h6:function(a,b){var z,y,x,w
-if(a==null)return
-document
-if($.op()===!0)b=document.head
-z=document.createElement("style",null)
-J.t3(z,J.dY(a))
-y=a.getAttribute("element")
-if(y!=null)z.setAttribute("element",y)
-x=b.firstChild
-if(b===document.head){w=W.vD(document.head.querySelectorAll("style[element]"),null)
-if(w.gor(w))x=J.QP(C.t5.grZ(w.Sn))}b.insertBefore(z,x)},
-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,y
-if($.AC)throw H.b("Initialization was already done.")
-$.AC=!0
-A.JP()
-$.ok=b
-if(a==null)throw H.b("Missing initialization of polymer elements. Please check that the list of entry points in your pubspec.yaml is correct. If you are using pub-serve, you may need to restart it.")
-A.Ad("d-auto-binding",C.Jm)
-z=document.createElement("polymer-element",null)
-z.setAttribute("name","d-auto-binding")
-z.setAttribute("extends","template")
-J.UQ($.XX(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,74,0,null),[H.Kp(a,0)]);y.G();)y.lo.$0()},
-JP:function(){var z,y,x,w
-z=$.Si()
-if(J.UQ(z,"Platform")==null)throw H.b(P.w("platform.js, dart_support.js must be loaded at the top of your application, before any other scripts or HTML imports that use polymer. Putting these two script tags at the top of your <head> element should address this issue: <script src=\"packages/web_components/platform.js\"></script> and  <script src=\"packages/web_components/dart_support.js\"></script>."))
-y=J.UQ(z,"Polymer")
-if(y==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."))
-x=$.X3
-y.V7("whenPolymerReady",[x.ce(new A.hp())])
-w=J.UQ($.XX(),"register")
-if(w==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
-J.kW($.XX(),"register",P.mt(new A.k2(x,w)))},
-XP:{
-"^":"a;FL>,t5>,P1<,oc>,Q7<,NF<,cK>,kK<,Bj<,Qk,lD,Uj>,PS<,Ve,t4",
-gZf:function(){var z,y
-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},
-Ba:function(a){var z,y,x
-for(z=null,y=this;y!=null;){z=J.Vs(J.nq(y)).MW.getAttribute("extends")
-y=y.gP1()}x=document
-W.Ct(window,x,a,this.t5,z)},
-Cw:function(a){var z=$.Kc()
-if(z==null)return
-J.UQ(z,"urlResolver").V7("resolveDom",[a])},
-Zw:function(a){var z,y,x,w,v,u,t,s,r
-if(a!=null){if(a.gQ7()!=null){z=a.gQ7()
-y=P.L5(null,null,null,null,null)
-y.FV(0,z)
-this.Q7=y}if(a.gBj()!=null){z=a.gBj()
-y=P.Ls(null,null,null,null)
-y.FV(0,z)
-this.Bj=y}}z=this.t5
-this.pI(z)
-x=J.Vs(this.FL).MW.getAttribute("attributes")
-if(x!=null)for(y=C.xB.Fr(x,$.aQ()),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().Nz.t(0,v)
-t=L.hk([u])
-s=this.Q7
-if(s!=null&&s.x4(t))continue
-r=$.mX().CV(z,u)
-if(r==null||r.fY===C.WH||r.V5){window
-s="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
-if(typeof console!="undefined")console.warn(s)
-continue}s=this.Q7
-if(s==null){s=P.Fl(null,null)
-this.Q7=s}s.u(0,t,r)}},
-pI:function(a){var z,y,x,w
-for(z=$.mX().Me(0,a,C.aj),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
-w=this.Q7
-if(w==null){w=P.Fl(null,null)
-this.Q7=w}w.u(0,L.hk([x.goc(y)]),y)
-w=new H.U5(y.gDv(),new A.Zd())
-w.$builtinTypeInfo=[null]
-if(w.Vr(0,new A.Da())){w=this.Bj
-if(w==null){w=P.Ls(null,null,null,null)
-this.Bj=w}x=x.goc(y)
-w.h(0,$.b7().ep.t(0,x))}}},
-Vk:function(){var z,y
-z=P.L5(null,null,null,P.qU,P.a)
-this.kK=z
-y=this.P1
-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.Bg("link[rel=stylesheet]")
-this.Qk=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Mp(z.lo)},
-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.Mp(z.lo)},
-m1:function(){var z,y,x,w,v,u,t,s
-z=this.Qk
-z.toString
-y=H.VM(new H.U5(z,new A.ZG()),[null])
-x=this.gZf()
-if(x!=null){w=P.p9("")
-for(z=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.Kp(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
-t=w.vM+=typeof u==="string"?u:H.d(u)
-w.vM=t+"\n"}if(w.vM.length>0){s=J.Do(this.FL).createElement("style",null)
-J.t3(s,H.d(w))
-z=J.RE(x)
-z.mK(x,s,z.gPZ(x))}}},
-oP: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},
-Bg:function(a){return this.oP(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.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.Mo(J.mY(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.q3(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.Mo(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)
-z.vM=w+"\n\n"}return z.vM},
-J3:function(a,b){var z
-if(a==="")return
-z=document.createElement("style",null)
-J.t3(z,a)
-z.setAttribute("element",H.d(this.oc)+"-"+b)
-return z},
-rH:function(){var z,y,x,w,v
-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.cK==null)this.cK=P.YM(null,null,null,null,null)
-x=J.RE(y)
-w=x.goc(y)
-v=$.b7().ep.t(0,w)
-w=J.U6(v)
-v=w.Nj(v,0,J.bI(w.gB(v),7))
-this.cK.u(0,L.hk(v),[x.goc(y)])}},
-I9: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()
-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.Tj(z))
-return z},
-$isXP:true,
-static:{"^":"Kb"}},
-Zd:{
-"^":"Tp:13;",
-$1:function(a){return!!J.x(a).$ishG},
-$isEH:true},
-Da:{
-"^":"Tp:13;",
-$1:function(a){return a.gvn()},
-$isEH:true},
-eY:{
-"^":"Tp:77;a",
-$2:function(a,b){if(C.n7.x4(a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
-$isEH:true},
-BO:{
-"^":"Tp:77;a",
-$2:function(a,b){var z,y,x
-z=J.rY(a)
-if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
-x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
-$isEH:true},
-ZG:{
-"^":"Tp:13;",
-$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
-$isEH:true},
-ua:{
-"^":"Tp:13;a",
-$1:function(a){return J.RF(a,this.a)},
-$isEH:true},
-ix:{
-"^":"Tp:69;",
-$0:function(){return[]},
-$isEH:true},
-Tj:{
-"^":"Tp:162;a",
-$2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
-$isEH:true},
-Li:{
-"^":"BG9;Mn,cJ",
-US:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
-return this.Mn.US(a,b,c)}},
-BG9:{
-"^":"vE+vA;"},
-vA:{
-"^":"a;",
-XB:function(a){var z
-for(;z=J.RE(a),z.gBy(a)!=null;){if(!!z.$iszs&&J.UQ(a.SD,"eventController")!=null)return J.UQ(z.gXG(a),"eventController")
-a=z.gBy(a)}return!!z.$isI0?a.host:null},
-Y2:function(a,b,c){var z={}
-z.a=a
-return new A.l5(z,this,b,c)},
-CZ:function(a,b,c){var z,y,x,w
-z={}
-y=J.rY(b)
-if(!y.nC(b,"on-"))return
-x=y.yn(b,3)
-z.a=x
-w=C.fE.t(0,x)
-z.a=w!=null?w:z.a
-return new A.li(z,this,a)}},
-l5:{
-"^":"Tp:13;a,b,c,d",
-$1:[function(a){var z,y,x,w
-z=this.a
-y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
-z.a=x
-y=x}if(!!J.x(y).$iszs){y=J.x(a)
-if(!!y.$iseC){w=y.gey(a)
-if(w==null)w=J.UQ(P.Cq(a),"detail")}else w=null
-y=y.gCa(a)
-z=z.a
-J.Pj(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-li:{
-"^":"Tp:166;a,b,c",
-$3:[function(a,b,c){var z,y,x,w
-z=this.c
-y=this.b.Y2(null,b,z)
-x=J.Ei(b).t(0,this.a.a)
-w=H.VM(new W.Ov(0,x.DK,x.Ph,W.aF(y),x.Sg),[H.Kp(x,0)])
-w.Zz()
-if(c===!0)return
-return new A.d6(w,z)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-d6:{
-"^":"Ap;Jq,ED",
-gP:function(a){return"{{ "+this.ED+" }}"},
-TR:function(a,b){return"{{ "+this.ED+" }}"},
-S6:function(a){var z=this.Jq
-if(z!=null){z.ed()
-this.Jq=null}}},
-hG:{
-"^":"nd;vn<",
-$ishG:true},
-xc:{
-"^":"Ao;AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-XI:function(a){this.Pa(a)},
-static:{G7:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ki.ZL(a)
-C.Ki.XI(a)
-return a}}},
-jpR:{
-"^":"Bo+zs;XG:SD=",
-$iszs:true,
-$isvy:true,
-$isd3:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true},
-Ao:{
-"^":"jpR+Pi;",
-$isd3:true},
-zs:{
-"^":"a;XG:SD=",
-gFL:function(a){return a.IX},
-gUj:function(a){return},
-gRT:function(a){var z,y
-z=a.IX
-if(z!=null)return J.O6(z)
-y=this.gQg(a).MW.getAttribute("is")
-return y==null||y===""?this.gqn(a):y},
-Pa:function(a){var z,y
-z=this.gCn(a)
-if(z!=null&&z.k8!=null){window
-y="Attributes on "+H.d(this.gRT(a))+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."
-if(typeof console!="undefined")console.warn(y)}this.es(a)
-y=this.gM0(a)
-if(!J.xC($.AA().t(0,y),!0)||$.op()===!0)this.rf(a)},
-es:function(a){var z,y
-if(a.IX!=null){window
-z="Element already prepared: "+H.d(this.gRT(a))
-if(typeof console!="undefined")console.warn(z)
-return}a.SD=P.Cq(a)
-z=this.gRT(a)
-a.IX=$.RA().t(0,z)
-this.nt(a)
-z=a.Wz
-if(z!=null){y=this.gnu(a)
-z.toString
-L.qK.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gqY(a))
-this.oR(a)
-this.fk(a)
-this.Uc(a)},
-rf:function(a){if(a.q1)return
-a.q1=!0
-this.Oh(a,a.IX)
-this.gQg(a).Rz(0,"unresolved")
-this.aR(a)},
-aR:function(a){},
-Es:function(a){if(a.IX==null)throw H.b(P.w("polymerCreated was not called for custom element "+H.d(this.gRT(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
-this.oW(a)
-if(!a.XN){a.XN=!0
-this.rW(a,new A.bl(a))}},
-dQ:function(a){this.x3(a)},
-Oh:function(a,b){if(b!=null){this.Oh(a,b.gP1())
-this.aI(a,J.nq(b))}},
-aI:function(a,b){var z,y,x,w
-z=J.RE(b)
-y=z.Wk(b,"template")
-if(y!=null){x=this.Tp(a,y)
-w=z.gQg(b).MW.getAttribute("name")
-if(w==null)return
-a.Xy.u(0,w,x)}},
-Tp:function(a,b){var z,y,x,w,v,u
-if(b==null)return
-z=this.er(a)
-y=this.gUj(a)
-x=!!J.x(b).$isvy?b:M.Ky(b)
-w=J.MO(x,a,y==null&&J.Xp(x)==null?J.xq(a.IX):y)
-v=$.It().t(0,w)
-u=v!=null?v.gu2():v
-a.Sa.push(u)
-z.appendChild(w)
-this.Ec(a,z)
-u=$.dg()
-if(u!=null)u.V7("register",[z])
-return z},
-Ec:function(a,b){var z,y,x
-if(b==null)return
-for(z=J.MK(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
-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.IX.gkK().aN(0,new A.Sv(a))},
-fk:function(a){if(a.IX.gNF()==null)return
-this.gQg(a).aN(0,this.ghW(a))},
-D3:[function(a,b,c){var z,y,x,w,v,u
-z=this.B2(a,b)
-if(z==null)return
-if(c==null||J.x5(c,$.iB())===!0)return
-y=J.RE(z)
-x=y.goc(z)
-w=$.cp().jD(a,x)
-v=y.gt5(z)
-x=J.x(v)
-u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.eP))&&w!=null?J.Lm(w):v)
-if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,167],
-B2:function(a,b){var z=a.IX.gNF()
-if(z==null)return
-return z.t(0,b)},
-TW:function(a,b){if(b==null)return
-if(typeof b==="boolean")return b?"":null
-else if(typeof b==="string"||typeof b==="number")return H.d(b)
-return},
-JY:function(a,b){var z,y,x
-z=L.hk(b).Tl(a)
-y=this.TW(a,z)
-if(y!=null)this.gQg(a).MW.setAttribute(b,y)
-else if(typeof z==="boolean"){x=this.gQg(a).MW
-x.getAttribute(b)
-x.removeAttribute(b)}},
-nR:function(a,b,c,d){var z,y,x,w,v,u,t
-z=this.B2(a,b)
-if(z==null)return J.FS(M.Ky(a),b,c,d)
-else{y=J.RE(z)
-x=y.goc(z)
-w=$.QX5()
-if(w.mL(C.eI))w.Ny("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gRT(a))+"].["+H.d(x)+"]")
-w=J.RE(c)
-if(w.gP(c)==null)w.sP(c,$.cp().jD(a,x))
-v=new A.lK(a,x,c,null,null)
-v.Jq=this.gqh(a).yI(v.gXQ())
-w=J.mu(c,v.gap())
-v.dY=w
-$.cp().Cq(a,x,w)
-if($.rK&&!0){if(J.C5(M.Ky(a))==null){x=P.Fl(null,null)
-J.nC(M.Ky(a),x)}J.kW(J.C5(M.Ky(a)),b,v)}u=a.IX.gBj()
-y=y.goc(z)
-t=$.b7().ep.t(0,y)
-if(u!=null&&u.tg(0,t))this.JY(a,t)
-return v}},
-Vz:function(a){return this.rf(a)},
-gCd:function(a){return J.C5(M.Ky(a))},
-sCd:function(a,b){J.nC(M.Ky(a),b)},
-gCn:function(a){return J.fe(M.Ky(a))},
-x3:function(a){var z,y
-if(a.Uk===!0)return
-$.UW().Ny("["+H.d(this.gRT(a))+"] asyncUnbindAll")
-z=a.oq
-y=this.gJg(a)
-if(z==null)z=new A.FT(null,null,null)
-z.t6(0,y,null)
-a.oq=z},
-BM:[function(a){if(a.Uk===!0)return
-H.bQ(a.Sa,this.ghb(a))
-a.Sa=[]
-this.Uq(a)
-a.Uk=!0},"$0","gJg",0,0,18],
-oW:function(a){var z
-if(a.Uk===!0){$.UW().j2("["+H.d(this.gRT(a))+"] already unbound, cannot cancel unbindAll")
-return}$.UW().Ny("["+H.d(this.gRT(a))+"] cancelUnbindAll")
-z=a.oq
-if(z!=null){z.TP(0)
-a.oq=null}},
-nt:function(a){var z,y,x,w,v
-z=J.JR(a.IX)
-if(z!=null){y=$.ps
-$.ps=y+1
-x=new L.ww(null,[],y,null,null,null)
-x.Wf=[]
-a.Wz=x
-a.Sa.push([x])
-for(y=H.VM(new P.fG(z),[H.Kp(z,0)]),w=y.Fb,y=H.VM(new P.EQ(w,w.Ig(),0,null),[H.Kp(y,0)]);y.G();){v=y.fD
-x.yN(a,v)
-this.rJ(a,v,v.Tl(a),null)}}},
-FQ:[function(a,b,c,d){J.Me(c,new A.n1(a,b,c,d,J.JR(a.IX),P.l1(null,null,null,null)))},"$3","gnu",6,0,168],
-hu:[function(a,b){var z,y,x,w,v
-for(z=J.mY(b);z.G();){y=z.gl()
-if(!J.x(y).$isqI)continue
-x=y.oc
-w=$.b7().ep.t(0,x)
-v=a.IX.gBj()
-if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gqY",2,0,169,161],
-rJ:function(a,b,c,d){var z,y,x,w,v
-z=J.JR(a.IX)
-if(z==null)return
-y=z.t(0,b)
-if(y==null)return
-if(!!J.x(d).$iswn){x=$.p2()
-if(x.mL(C.eI))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: unregister "+H.d(b))
-this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.p2()
-if(x.mL(C.eI))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: register "+H.d(b))
-w=c.gQV().w4(!1)
-w.yl(new A.R8(a,d,y))
-w.fm(0,null)
-w.y5(null)
-x=H.d(b)+"__array"
-v=a.q9
-if(v==null){v=P.L5(null,null,null,P.qU,P.Oy)
-a.q9=v}v.u(0,x,w)}},
-dvq:[function(a,b){var z,y
-for(z=J.mY(b);z.G();){y=z.gl()
-if(y!=null)J.x0(y)}},"$1","ghb",2,0,170],
-iQ:function(a,b){var z=a.q9.Rz(0,b)
-if(z==null)return!1
-z.ed()
-return!0},
-Uq:function(a){var z,y
-z=a.q9
-if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
-if(y!=null)y.ed()}a.q9.V1(0)
-a.q9=null},
-Uc:function(a){var z,y
-z=a.IX.gPS()
-if(z.gl0(z))return
-y=$.eS()
-if(y.mL(C.eI))y.Ny("["+H.d(this.gRT(a))+"] addHostListeners: "+z.bu(0))
-z.aN(0,new A.SX(a))},
-ea:function(a,b,c,d){var z,y,x,w
-z=$.eS()
-y=z.mL(C.eI)
-if(y)z.Ny(">>> ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))
-if(!!J.x(c).$isEH){x=X.RI(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().Nz.t(0,c)
-$.cp().Ck(b,w,d,!0,null)}else z.j2("invalid callback")
-if(y)z.To("<<< ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))},
-rW:function(a,b){var z
-P.rb(F.Jy())
-$.Kc().nQ("flush")
-z=window
-C.ma.hr(z)
-return C.ma.oB(z,W.aF(b))},
-SE:function(a,b,c,d,e,f){var z=W.H9(b,!0,!0,e)
-this.H2(a,z)
-return z},
-Tj:function(a,b){return this.SE(a,b,null,null,null,null)},
-$iszs:true,
-$isvy:true,
-$isd3:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true},
-bl:{
-"^":"Tp:13;a",
-$1:[function(a){return},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-Sv:{
-"^":"Tp:77;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:{
-"^":"Tp:69;b",
-$0:function(){return this.b},
-$isEH:true},
-n1:{
-"^":"Tp:77;a,b,c,d,e,f",
-$2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
-z=this.b
-y=J.UQ(z,a)
-x=this.d
-if(typeof a!=="number")return H.s(a)
-w=2*a+1
-if(w>>>0!==w||w>=x.length)return H.e(x,w)
-v=x[w]
-w=this.e
-if(w==null)return
-u=w.t(0,v)
-if(u==null)return
-for(w=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;w.G();){p=w.gl()
-if(!q.h(0,p))continue
-s.rJ(t,v,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,83,57,"call"],
-$isEH:true},
-R8:{
-"^":"Tp:13;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,171,"call"],
-$isEH:true},
-SX:{
-"^":"Tp:77;a",
-$2:function(a,b){var z=this.a
-J.mZ(z,a,J.xq(z.IX).Y2(z,z,b))},
-$isEH:true},
-lK:{
-"^":"Ap;I6,iU,q0,Jq,dY",
-AB:[function(a){this.dY=a
-$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,20,58],
-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().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.ta(this.q0,v)
-return}}},"$1","gXQ",2,0,169,161],
-TR:function(a,b){return J.mu(this.q0,b)},
-gP:function(a){return J.Vm(this.q0)},
-sP:function(a,b){J.ta(this.q0,b)
-return b},
-S6:function(a){var z=this.Jq
-if(z!=null){z.ed()
-this.Jq=null}J.x0(this.q0)}},
-FT:{
-"^":"a;jd,ih,lS",
-Ws:function(){return this.jd.$0()},
-t6:function(a,b,c){var z
-this.TP(0)
-this.jd=b
-z=window
-C.ma.hr(z)
-this.lS=C.ma.oB(z,W.aF(new A.K3(this)))},
-TP:function(a){var z,y
-z=this.lS
-if(z!=null){y=window
-C.ma.hr(y)
-y.cancelAnimationFrame(z)
-this.lS=null}z=this.ih
-if(z!=null){z.ed()
-this.ih=null}}},
-K3:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-if(z.ih!=null||z.lS!=null){z.TP(0)
-z.Ws()}return},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-mS:{
-"^":"Tp:69;",
-$0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-hp:{
-"^":"Tp:69;",
-$0:[function(){var z=$.iF().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:{
-"^":"Tp:174;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,172,56,173,"call"],
-$isEH:true},
-v4:{
-"^":"Tp:69;c,d,e,f",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=this.c
-y=this.d
-x=this.e
-w=this.f
-v=$.Rs()
-u=P.Fl(null,null)
-t=new A.XP(z,x,w,y,null,null,null,null,null,null,null,v,u,null,null)
-$.RA().u(0,y,t)
-t.Zw(w)
-s=t.Q7
-if(s!=null)t.NF=t.Yl(s)
-t.rH()
-t.I9()
-s=J.RE(z)
-r=s.Wk(z,"template")
-if(r!=null)J.Co(!!J.x(r).$isvy?r:M.Ky(r),v)
-t.Mi()
-t.f6()
-t.m1()
-A.h6(t.J3(t.kO("global"),"global"),document.head)
-t.Cw(z)
-t.Vk()
-t.W3(u)
-q=s.gQg(z).MW.getAttribute("assetpath")
-if(q==null)q=""
-p=P.hK(s.gM0(z).baseURI)
-z=P.hK(q)
-o=z.Fi
-if(o!==""){n=z.ku
-m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{if(z.gJf(z)!==""){n=z.ku
-m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{v=z.pO
-if(v===""){k=p.pO
-j=z.tP
-j=j!==""?j:p.tP}else{v=J.co(v,"/")
-u=z.pO
-k=v?p.KO(u):p.KO(p.Ky(p.pO,u))
-j=z.tP}n=p.ku
-m=p.gJf(p)
-l=p.gkb(p)}o=p.Fi}t.t4=P.Wo(z.BJ,m,k,null,l,j,null,o,n)
-z=t.gZf()
-A.YG(z,y,w!=null?J.O6(w):null)
-if($.mX().n6(x,C.MT))$.cp().Ck(x,C.MT,[t],!1,null)
-t.Ba(y)
-return},"$0",null,0,0,null,"call"],
-$isEH:true},
-Md:{
-"^":"Tp:69;",
-$0:function(){var z=J.UQ(P.Cq(document.createElement("polymer-element",null)),"__proto__")
-return!!J.x(z).$isKV?P.Cq(z):z},
-$isEH:true}}],["polymer.auto_binding","package:polymer/auto_binding.dart",,Y,{
-"^":"",
-q6:{
-"^":"wc;Hf,ro,dUC,pt,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gk8:function(a){return J.ZH(a.Hf)},
-gzH:function(a){return J.Xp(a.Hf)},
-szH:function(a,b){J.Co(a.Hf,b)},
-V1:function(a){return J.U2(a.Hf)},
-gUj:function(a){return J.Xp(a.Hf)},
-ZK:function(a,b,c){return J.MO(a.Hf,b,c)},
-dX:function(a){var z
-this.Pa(a)
-a.Hf=M.Ky(a)
-z=T.GF(null,C.qY)
-J.Co(a.Hf,new Y.zp(a,z,null))
-$.iF().MM.ml(new Y.lkK(a))},
-$isDT:true,
-$isvy:true,
-static:{zE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Gkp.ZL(a)
-C.Gkp.dX(a)
-return a}}},
-GLL:{
-"^":"OH+zs;XG:SD=",
-$iszs:true,
-$isvy:true,
-$isd3:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true},
-wc:{
-"^":"GLL+d3;R9:ro%,V2:dUC%,me:pt%",
-$isd3:true},
-lkK:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-z.setAttribute("bind","")
-J.mI(z,new Y.oO(z))},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-oO:{
-"^":"Tp:13;b",
-$1:[function(a){var z,y
-z=this.b
-y=J.RE(z)
-y.Ec(z,z.parentNode)
-y.Tj(z,"template-bound")},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-zp:{
-"^":"Li;dq,Mn,cJ",
-Y2:function(a,b,c){var z={}
-z.a=a
-return new Y.PA(z,this,c)}},
-PA:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){var z,y,x,w,v,u
-z=this.a
-y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.dq
-z.a=x
-y=x}w=J.x(y)
-if(!!w.$iszs){y=J.RE(a)
-w=y.gey(a)
-y=y.gCa(a)
-v=z.a
-u=this.b.dq
-if(v===u)v=J.ZH(u.Hf)
-J.Pj(z.a,v,this.c,[a,w,y])}else throw H.b(P.w("controller "+w.bu(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,1,"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.xr.kV(J.JA(a,"'","\""))
-return y}catch(x){H.Ru(x)
-return a}},
-lP:{
-"^":"Tp:77;",
-$2:function(a,b){return a},
-$isEH:true},
-Uf:{
-"^":"Tp:77;",
-$2:function(a,b){return a},
-$isEH:true},
-Ra:{
-"^":"Tp:77;",
-$2:function(a,b){var z,y
-try{z=P.zu(a)
-return z}catch(y){H.Ru(y)
-return b}},
-$isEH:true},
-wJY:{
-"^":"Tp:77;",
-$2:function(a,b){return!J.xC(a,"false")},
-$isEH:true},
-zOQ:{
-"^":"Tp:77;",
-$2:function(a,b){return H.BU(a,null,new Z.fT(b))},
-$isEH:true},
-fT:{
-"^":"Tp:13;a",
-$1:function(a){return this.a},
-$isEH:true},
-W6o:{
-"^":"Tp:77;",
-$2:function(a,b){return H.RR(a,new Z.Lf(b))},
-$isEH:true},
-Lf:{
-"^":"Tp:13;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.zg(a.gvc(),new T.Fi(a)).zV(0," ")
-else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","v0",2,0,49,64],
-qN:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.kl(a.gvc(),new T.k9(a)).zV(0,";")
-else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Gu",2,0,49,64],
-Fm:[function(a){return a},"$1","m9",2,0,13,65],
-Fi:{
-"^":"Tp:13;a",
-$1:function(a){return J.xC(this.a.t(0,a),!0)},
-$isEH:true},
-k9:{
-"^":"Tp:13;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-QB:{
-"^":"vE;uc,jw,YD,zA,cJ",
-US:function(a,b,c){var z,y,x,w
-z={}
-y=new Y.pa(H.VM([],[Y.qS]),P.p9(""),new P.WU(a,0,0,null),null)
-x=new U.tu()
-x=new T.FX(x,y,null,null)
-y=y.zl()
-x.jQ=y
-x.vi=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)])
-x.Bp()
-w=x.Te()
-if(M.CF(c)){y=J.x(b)
-y=y.n(b,"bind")||y.n(b,"repeat")}else y=!1
-if(y){z=J.x(w)
-if(!!z.$isb4)return new T.H1(this,w.gF5(),z.gkZ(w))
-else return new T.kj(this,w)}z.a=null
-y=!!J.x(c).$ish4
-if(y&&J.xC(b,"class"))z.a=T.v0()
-else if(y&&J.xC(b,"style"))z.a=T.Gu()
-return new T.qb(z,this,w)},
-CE:function(a){var z=this.zA.t(0,a)
-if(z==null)return new T.uK(this,a)
-return new T.Wb(this,a,z)},
-qF:function(a){var z,y,x,w,v
-z=J.RE(a)
-y=z.gBy(a)
-if(y==null)return
-if(M.CF(a)){x=!!z.$isvy?a:M.Ky(a)
-z=J.RE(x)
-w=z.gCn(x)
-v=w==null?z.gk8(x):w.k8
-if(!!J.x(v).$isGK)return v
-else return this.YD.t(0,a)}return this.qF(y)},
-hm:function(a,b){var z,y
-if(a==null)return K.dZ(b,this.jw)
-z=J.x(a)
-if(!!z.$ish4);if(!!J.x(b).$isGK)return b
-y=this.YD
-if(y.t(0,a)!=null){y.t(0,a)
-return y.t(0,a)}else if(z.gBy(a)!=null)return this.b8(z.gBy(a),b)
-else{if(!M.CF(a))throw H.b("expected a template instead of "+H.d(a))
-return this.b8(a,b)}},
-b8:function(a,b){var z,y,x
-if(M.CF(a)){z=!!J.x(a).$isvy?a:M.Ky(a)
-y=J.RE(z)
-if(y.gCn(z)==null)y.gk8(z)
-return this.YD.t(0,a)}else{y=J.RE(a)
-if(y.geT(a)==null){x=this.YD.t(0,a)
-return x!=null?x:K.dZ(b,this.jw)}else return this.b8(y.gBy(a),b)}},
-static:{"^":"DI",GF:function(a,b){var z,y,x
-z=H.VM(new P.qo(null),[K.GK])
-y=H.VM(new P.qo(null),[P.qU])
-x=P.L5(null,null,null,P.qU,P.a)
-x.FV(0,C.va)
-return new T.QB(b,x,z,y,null)}}},
-H1:{
-"^":"Tp:175;b,c,d",
-$3:[function(a,b,c){var z,y
-z=this.b
-z.zA.u(0,b,this.c)
-y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
-z.YD.u(0,b,y)
-z=T.m9()
-return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-kj:{
-"^":"Tp:175;e,f",
-$3:[function(a,b,c){var z,y
-z=this.e
-y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
-z.YD.u(0,b,y)
-if(c===!0)return T.rD(this.f,y,null)
-z=T.m9()
-return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-qb:{
-"^":"Tp:175;a,UI,bK",
-$3:[function(a,b,c){var z,y
-z=this.UI.hm(b,a)
-if(c===!0)return T.rD(this.bK,z,this.a.a)
-y=this.a.a
-if(y==null)y=T.m9()
-return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-uK:{
-"^":"Tp:13;a,b",
-$1:[function(a){var z,y,x
-z=this.a
-y=this.b
-x=z.YD.t(0,y)
-if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.dZ(a,z.jw)}else return z.hm(y,a)},"$1",null,2,0,null,163,"call"],
-$isEH:true},
-Wb:{
-"^":"Tp:13;c,d,e",
-$1:[function(a){var z,y,x,w
-z=this.c
-y=this.d
-x=z.YD.t(0,y)
-w=this.e
-if(x!=null)return x.t1(w,a)
-else return z.qF(y).t1(w,a)},"$1",null,2,0,null,163,"call"],
-$isEH:true},
-tI:{
-"^":"Ap;FT,pk,oF,RU,EU,q5,pU",
-Qv:function(a){return this.pk.$1(a)},
-ZW:function(a){return this.RU.$1(a)},
-LZ:[function(a,b){var z,y
-z=this.pU
-y=this.Qv(a)
-this.pU=y
-if(b!==!0&&this.RU!=null&&!J.xC(z,y))this.ZW(this.pU)},function(a){return this.LZ(a,!1)},"Ro","$2$skipChanges","$1","gTJ",2,3,176,177,64,178],
-gP:function(a){if(this.RU!=null)return this.pU
-return T.rD(this.oF,this.FT,this.pk)},
-sP:function(a,b){var z,y,x,w,v
-try{z=K.jX(this.oF,b,this.FT,!1)
-this.LZ(z,!0)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.oF)+"': "+H.d(y),x)}},
-TR:function(a,b){var z,y,x,w,v
-if(this.RU!=null)throw H.b(P.w("already open"))
-this.RU=b
-x=H.VM(new P.Sw(null,0,0,0),[null])
-x.Eo(null,null)
-w=this.oF.RR(0,new K.rdH(x))
-this.q5=w
-x=w.glr().yI(this.gTJ())
-x.fm(0,new T.Tg(this))
-this.EU=x
-try{x=this.q5
-J.NV(x,new K.Ed(this.FT))
-x.gXr()
-this.LZ(this.q5.gXr(),!0)}catch(v){x=H.Ru(v)
-z=x
-y=new H.XO(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.q5)+"': "+H.d(z),y)}return this.pU},
-S6:function(a){var z,y
-if(this.RU==null)return
-this.EU.ed()
-this.EU=null
-this.RU=null
-z=$.Pk()
-y=this.q5
-z.toString
-J.NV(y,z)
-this.q5=null},
-static:{rD:function(a,b,c){var z,y,x,w,v
-try{z=J.NV(a,new K.GQ(b))
-w=c==null?z:c.$1(z)
-return w}catch(v){w=H.Ru(v)
-y=w
-x=new H.XO(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
-Tg:{
-"^":"Tp:77;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.q5)+"': "+H.d(a),b)},"$2",null,4,0,null,1,143,"call"],
-$isEH:true},
-yy:{
-"^":"a;"}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
-"^":"",
-De:{
-"^":"Sk;vq,DA,AP,fn",
-vb:function(a,b){this.vq.yI(new B.fg(b,this))},
-$asSk:function(a){return[null]},
-static:{zR:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
-z.vb(a,b)
-return z}}},
-fg:{
-"^":"Tp;a,b",
-$1:[function(a){var z=this.b
-z.DA=F.Wi(z,C.Ha,z.DA,a)},"$1",null,2,0,null,83,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
-"^":"",
-jX:function(a,b,c,d){var z,y,x,w,v,u,t
-z=H.VM([],[U.hw])
-for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gkp(a),"|"))break
-z.push(y.gT8(a))
-a=y.gBb(a)}if(!!y.$isfp){x=y.gP(a)
-w=C.x4
-v=!1}else if(!!y.$iszX){w=a.gTf()
-x=a.gJn()
-v=!0}else{if(!!y.$isx9){w=a.gTf()
-x=y.goc(a)}else{if(d)throw H.b(K.zq("Expression is not assignable: "+H.d(a)))
-return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);y.G();){u=y.lo
-J.NV(u,new K.GQ(c))
-if(d)throw H.b(K.zq("filter must implement Transformer to be assignable: "+H.d(u)))
-else return}t=J.NV(w,new K.GQ(c))
-if(t==null)return
-if(v)J.kW(t,J.NV(x,new K.GQ(c)),b)
-else{y=$.b7().Nz.t(0,x)
-$.cp().Cq(t,y,b)}return b},
-dZ:function(a,b){var z,y,x
-z=new K.nk(a)
-if(b==null)y=z
-else{y=P.L5(null,null,null,P.qU,P.a)
-y.FV(0,b)
-x=new K.Ph(z,y)
-if(y.x4("this"))H.vh(K.zq("'this' cannot be used as a variable name."))
-y=x}return y},
-w10:{
-"^":"Tp:77;",
-$2:function(a,b){return J.ew(a,b)},
-$isEH:true},
-w11:{
-"^":"Tp:77;",
-$2:function(a,b){return J.bI(a,b)},
-$isEH:true},
-w12:{
-"^":"Tp:77;",
-$2:function(a,b){return J.vX(a,b)},
-$isEH:true},
-w13:{
-"^":"Tp:77;",
-$2:function(a,b){return J.L9(a,b)},
-$isEH:true},
-w14:{
-"^":"Tp:77;",
-$2:function(a,b){return J.jO(a,b)},
-$isEH:true},
-w15:{
-"^":"Tp:77;",
-$2:function(a,b){return J.xC(a,b)},
-$isEH:true},
-w16:{
-"^":"Tp:77;",
-$2:function(a,b){return!J.xC(a,b)},
-$isEH:true},
-w17:{
-"^":"Tp:77;",
-$2:function(a,b){return a==null?b==null:a===b},
-$isEH:true},
-w18:{
-"^":"Tp:77;",
-$2:function(a,b){return a==null?b!=null:a!==b},
-$isEH:true},
-w19:{
-"^":"Tp:77;",
-$2:function(a,b){return J.z8(a,b)},
-$isEH:true},
-w20:{
-"^":"Tp:77;",
-$2:function(a,b){return J.J5(a,b)},
-$isEH:true},
-w21:{
-"^":"Tp:77;",
-$2:function(a,b){return J.u6(a,b)},
-$isEH:true},
-w22:{
-"^":"Tp:77;",
-$2:function(a,b){return J.Bl(a,b)},
-$isEH:true},
-w23:{
-"^":"Tp:77;",
-$2:function(a,b){return a===!0||b===!0},
-$isEH:true},
-w24:{
-"^":"Tp:77;",
-$2:function(a,b){return a===!0&&b===!0},
-$isEH:true},
-w25:{
-"^":"Tp:77;",
-$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.zq("Filters must be a one-argument function."))},
-$isEH:true},
-Raa:{
-"^":"Tp:13;",
-$1:function(a){return a},
-$isEH:true},
-w0:{
-"^":"Tp:13;",
-$1:function(a){return J.jzo(a)},
-$isEH:true},
-w5:{
-"^":"Tp:13;",
-$1:function(a){return a!==!0},
-$isEH:true},
-GK:{
-"^":"a;",
-u:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
-t1:function(a,b){if(J.xC(a,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
-return new K.PO(this,a,b)},
-$isGK:true,
-$isab:true,
-$asab:function(){return[P.qU,P.a]}},
-nk:{
-"^":"GK;k8>",
-t:function(a,b){var z,y
-if(J.xC(b,"this"))return this.k8
-z=$.b7().Nz.t(0,b)
-y=this.k8
-if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
-y=$.cp().jD(y,z)
-return!!J.x(y).$iscb?B.zR(y,null):y},
-NX:function(a){return!J.xC(a,"this")},
-bu:function(a){return"[model: "+H.d(this.k8)+"]"}},
-PO:{
-"^":"GK;eT>,Z0,P>",
-gk8:function(a){var z=this.eT
-z=z.gk8(z)
-return z},
-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)},
-NX:function(a){if(J.xC(this.Z0,a))return!1
-return this.eT.NX(a)},
-bu:function(a){return this.eT.bu(0)+" > [local: "+H.d(this.Z0)+"]"}},
-Ph:{
-"^":"GK;eT>,Z3<",
-gk8:function(a){return this.eT.k8},
-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)},
-NX:function(a){if(this.Z3.x4(a))return!1
-return!J.xC(a,"this")},
-bu:function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.Kp(z,0)]),"(",")")+"]"}},
-Ay0:{
-"^":"a;NV?,Y4<",
-glr:function(){var z=this.Zj
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gXr:function(){return this.Y4},
-ab:function(a){},
-tf:function(a){var z
-this.Ra(0,a)
-z=this.NV
-if(z!=null)z.tf(a)},
-PK:function(){var z=this.a9
-if(z!=null){z.ed()
-this.a9=null}},
-Ra:function(a,b){var z,y,x
-this.PK()
-z=this.Y4
-this.ab(b)
-y=this.Y4
-if(y==null?z!=null:y!==z){x=this.Zj
-if(x.Gv>=4)H.vh(x.q7())
-x.Iv(y)}},
-bu:function(a){return this.r3.bu(0)},
-$ishw:true},
-Ed:{
-"^":"cfS;qu",
-xn:function(a){a.Ra(0,this.qu)}},
-me:{
-"^":"cfS;",
-xn:function(a){a.PK()},
-static:{"^":"jC"}},
-GQ:{
-"^":"P55;qu",
-W9:function(a){return J.ZH(this.qu)},
-LT:function(a){return a.wz.RR(0,this)},
-fV:function(a){var z,y,x
-z=J.NV(a.gTf(),this)
-if(z==null)return
-y=a.goc(a)
-x=$.b7().Nz.t(0,y)
-return $.cp().jD(z,x)},
-CU:function(a){var z=J.NV(a.gTf(),this)
-if(z==null)return
-return J.UQ(z,J.NV(a.gJn(),this))},
-ZR:function(a){var z,y,x,w,v
-z=J.NV(a.gTf(),this)
-if(z==null)return
-if(a.gre()==null)y=null
-else{x=a.gre()
-w=this.gay()
-x.toString
-y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gSf(a)==null)return H.im(z,y,P.Te(null))
-x=a.gSf(a)
-v=$.b7().Nz.t(0,x)
-return $.cp().Ck(z,v,y,!1,null)},
-oD:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.ghL(),this.gay()),[null,null]).br(0)},
-o0:function(a){var z,y,x
-z=P.Fl(null,null)
-for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=y.lo
-z.u(0,J.NV(J.A6(x),this),J.NV(x.gv4(),this))}return z},
-YV:function(a){return H.vh(P.f("should never be called"))},
-qv:function(a){return J.UQ(this.qu,a.gP(a))},
-ex:function(a){var z,y,x,w,v
-z=a.gkp(a)
-y=J.NV(a.gBb(a),this)
-x=J.NV(a.gT8(a),this)
-w=$.Rab().t(0,z)
-v=J.x(z)
-if(v.n(z,"&&")||v.n(z,"||")){v=y==null?!1:y
-return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
-else if(y==null||x==null)return
-return w.$2(y,x)},
-Hx:function(a){var z,y
-z=J.NV(a.gwz(),this)
-y=$.qL().t(0,a.gkp(a))
-if(J.xC(a.gkp(a),"!"))return y.$1(z==null?!1:z)
-return z==null?null:y.$1(z)},
-RD:function(a){return J.xC(J.NV(a.gdc(),this),!0)?J.NV(a.gSl(),this):J.NV(a.gru(),this)},
-kz:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
-xt:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
-rdH:{
-"^":"P55;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)},
-fV:function(a){var z,y
-z=J.NV(a.gTf(),this)
-y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(y)
-return y},
-CU:function(a){var z,y,x
-z=J.NV(a.gTf(),this)
-y=J.NV(a.gJn(),this)
-x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(x)
-y.sNV(x)
-return x},
-ZR:function(a){var z,y,x,w,v
-z=J.NV(a.gTf(),this)
-if(a.gre()==null)y=null
-else{x=a.gre()
-w=this.gay()
-x.toString
-y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.c3(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(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.A8(a.ghL(),this.gay()),[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))
-return y},
-o0:function(a){var z,y
-z=H.VM(new H.A8(a.gRl(a),this.gay()),[null,null]).tt(0,!1)
-y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.B8(y))
-return y},
-YV:function(a){var z,y,x
-z=J.NV(a.gG3(a),this)
-y=J.NV(a.gv4(),this)
-x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(x)
-y.sNV(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.NV(a.gBb(a),this)
-y=J.NV(a.gT8(a),this)
-x=new K.kyp(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(x)
-y.sNV(x)
-return x},
-Hx:function(a){var z,y
-z=J.NV(a.gwz(),this)
-y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(y)
-return y},
-RD:function(a){var z,y,x,w
-z=J.NV(a.gdc(),this)
-y=J.NV(a.gSl(),this)
-x=J.NV(a.gru(),this)
-w=new K.WW(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(w)
-y.sNV(w)
-x.sNV(w)
-return w},
-kz:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
-xt:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
-zD:{
-"^":"Tp:13;a",
-$1:function(a){var z=this.a
-a.sNV(z)
-return z},
-$isEH:true},
-XV:{
-"^":"Tp:13;a",
-$1:function(a){var z=this.a
-a.sNV(z)
-return z},
-$isEH:true},
-B8:{
-"^":"Tp:13;a",
-$1:function(a){var z=this.a
-a.sNV(z)
-return z},
-$isEH:true},
-uD:{
-"^":"Ay0;r3,NV,a9,Y4,Zj",
-ab:function(a){this.Y4=J.ZH(a)},
-RR:function(a,b){return b.W9(this)},
-$asAy0:function(){return[U.EO]},
-$isEO:true,
-$ishw:true},
-z0:{
-"^":"Ay0;r3,NV,a9,Y4,Zj",
-gP:function(a){var z=this.r3
-return z.gP(z)},
-ab:function(a){var z=this.r3
-this.Y4=z.gP(z)},
-RR:function(a,b){return b.oD(this)},
-$asAy0:function(){return[U.no]},
-$asno:function(){return[null]},
-$isno:true,
-$ishw:true},
-kL:{
-"^":"Ay0;hL<,r3,NV,a9,Y4,Zj",
-ab:function(a){this.Y4=H.VM(new H.A8(this.hL,new K.Hv()),[null,null]).br(0)},
-RR:function(a,b){return b.Zh(this)},
-$asAy0:function(){return[U.c0]},
-$isc0:true,
-$ishw:true},
-Hv:{
-"^":"Tp:13;",
-$1:[function(a){return a.gY4()},"$1",null,2,0,null,83,"call"],
-$isEH:true},
-ev:{
-"^":"Ay0;Rl>,r3,NV,a9,Y4,Zj",
-ab:function(a){this.Y4=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Ku())},
-RR:function(a,b){return b.o0(this)},
-$asAy0:function(){return[U.Qb]},
-$isQb:true,
-$ishw:true},
-Ku:{
-"^":"Tp:77;",
-$2:function(a,b){J.kW(a,J.A6(b).gY4(),b.gv4().gY4())
-return a},
-$isEH:true},
-qR:{
-"^":"Ay0;G3>,v4<,r3,NV,a9,Y4,Zj",
-RR:function(a,b){return b.YV(this)},
-$asAy0:function(){return[U.ae]},
-$isae:true,
-$ishw:true},
-ek:{
-"^":"Ay0;r3,NV,a9,Y4,Zj",
-gP:function(a){var z=this.r3
-return z.gP(z)},
-ab:function(a){var z,y,x,w
-z=this.r3
-y=J.U6(a)
-this.Y4=y.t(a,z.gP(z))
-if(!a.NX(z.gP(z)))return
-x=y.gk8(a)
-y=J.x(x)
-if(!y.$isd3)return
-z=z.gP(z)
-w=$.b7().Nz.t(0,z)
-this.a9=y.gqh(x).yI(new K.j9(this,a,w))},
-RR:function(a,b){return b.qv(this)},
-$asAy0:function(){return[U.fp]},
-$isfp:true,
-$ishw:true},
-j9:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-GC:{
-"^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-mv:{
-"^":"Ay0;wz<,r3,NV,a9,Y4,Zj",
-gkp:function(a){var z=this.r3
-return z.gkp(z)},
-ab:function(a){var z,y
-z=this.r3
-y=$.qL().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"!")){z=this.wz.gY4()
-this.Y4=y.$1(z==null?!1:z)}else{z=this.wz
-this.Y4=z.gY4()==null?null:y.$1(z.gY4())}},
-RR:function(a,b){return b.Hx(this)},
-$asAy0:function(){return[U.cJ]},
-$iscJ:true,
-$ishw:true},
-kyp:{
-"^":"Ay0;Bb>,T8>,r3,NV,a9,Y4,Zj",
-gkp:function(a){var z=this.r3
-return z.gkp(z)},
-ab:function(a){var z,y,x
-z=this.r3
-y=$.Rab().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"&&")||J.xC(z.gkp(z),"||")){z=this.Bb.gY4()
-if(z==null)z=!1
-x=this.T8.gY4()
-this.Y4=y.$2(z,x==null?!1:x)}else if(J.xC(z.gkp(z),"==")||J.xC(z.gkp(z),"!="))this.Y4=y.$2(this.Bb.gY4(),this.T8.gY4())
-else{x=this.Bb
-if(x.gY4()==null||this.T8.gY4()==null)this.Y4=null
-else{if(J.xC(z.gkp(z),"|")&&!!J.x(x.gY4()).$iswn)this.a9=H.Go(x.gY4(),"$iswn").gQV().yI(new K.P8(this,a))
-this.Y4=y.$2(x.gY4(),this.T8.gY4())}}},
-RR:function(a,b){return b.ex(this)},
-$asAy0:function(){return[U.uku]},
-$isuku:true,
-$ishw:true},
-P8:{
-"^":"Tp:13;a,b",
-$1:[function(a){return this.a.tf(this.b)},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-WW:{
-"^":"Ay0;dc<,Sl<,ru<,r3,NV,a9,Y4,Zj",
-ab:function(a){var z=this.dc.gY4()
-this.Y4=(z==null?!1:z)===!0?this.Sl.gY4():this.ru.gY4()},
-RR:function(a,b){return b.RD(this)},
-$asAy0:function(){return[U.mc]},
-$ismc:true,
-$ishw:true},
-vl:{
-"^":"Ay0;Tf<,r3,NV,a9,Y4,Zj",
-goc:function(a){var z=this.r3
-return z.goc(z)},
-ab:function(a){var z,y,x
-z=this.Tf.gY4()
-if(z==null){this.Y4=null
-return}y=this.r3
-y=y.goc(y)
-x=$.b7().Nz.t(0,y)
-this.Y4=$.cp().jD(z,x)
-y=J.x(z)
-if(!!y.$isd3)this.a9=y.gqh(z).yI(new K.fk(this,a,x))},
-RR:function(a,b){return b.fV(this)},
-$asAy0:function(){return[U.x9]},
-$isx9:true,
-$ishw:true},
-fk:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-WKb:{
-"^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-iT:{
-"^":"Ay0;Tf<,Jn<,r3,NV,a9,Y4,Zj",
-ab:function(a){var z,y,x
-z=this.Tf.gY4()
-if(z==null){this.Y4=null
-return}y=this.Jn.gY4()
-x=J.U6(z)
-this.Y4=x.t(z,y)
-if(!!x.$iswn)this.a9=z.gQV().yI(new K.tE(this,a,y))
-else if(!!x.$isd3)this.a9=x.gqh(z).yI(new K.na(this,a,y))},
-RR:function(a,b){return b.CU(this)},
-$asAy0:function(){return[U.zX]},
-$iszX:true,
-$ishw:true},
-tE:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GST(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-GST:{
-"^":"Tp:13;d",
-$1:[function(a){return a.XP(this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-na:{
-"^":"Tp:13;e,f,UI",
-$1:[function(a){if(J.VA(a,new K.zw(this.UI))===!0)this.e.tf(this.f)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-zw:{
-"^":"Tp:13;bK",
-$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-c3:{
-"^":"Ay0;Tf<,re<,r3,NV,a9,Y4,Zj",
-gSf:function(a){var z=this.r3
-return z.gSf(z)},
-ab:function(a){var z,y,x,w
-z=this.re
-z.toString
-y=H.VM(new H.A8(z,new K.Xh()),[null,null]).br(0)
-x=this.Tf.gY4()
-if(x==null){this.Y4=null
-return}z=this.r3
-if(z.gSf(z)==null){z=H.im(x,y,P.Te(null))
-this.Y4=!!J.x(z).$iscb?B.zR(z,null):z}else{z=z.gSf(z)
-w=$.b7().Nz.t(0,z)
-this.Y4=$.cp().Ck(x,w,y,!1,null)
-z=J.x(x)
-if(!!z.$isd3)this.a9=z.gqh(x).yI(new K.BGc(this,a,w))}},
-RR:function(a,b){return b.ZR(this)},
-$asAy0:function(){return[U.Nb]},
-$isNb:true,
-$ishw:true},
-Xh:{
-"^":"Tp:13;",
-$1:[function(a){return a.gY4()},"$1",null,2,0,null,46,"call"],
-$isEH:true},
-BGc:{
-"^":"Tp:179;a,b,c",
-$1:[function(a){if(J.VA(a,new K.vk(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-vk:{
-"^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-nD:{
-"^":"a;G1>",
-bu:function(a){return"EvalException: "+this.G1},
-static:{zq:function(a){return new K.nD(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
-"^":"",
-Pu:function(a,b){var z,y
-if(a==null?b==null:a===b)return!0
-if(a==null||b==null)return!1
-if(a.length!==b.length)return!1
-for(z=0;z<a.length;++z){y=a[z]
-if(z>=b.length)return H.e(b,z)
-if(!J.xC(y,b[z]))return!1}return!0},
-b1:function(a){a.toString
-return U.Le(H.n3(a,0,new U.xs()))},
-C0C: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},
-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)},
-tu:{
-"^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,180,1,46]},
-hw:{
-"^":"a;",
-$ishw:true},
-EO:{
-"^":"hw;",
-RR:function(a,b){return b.W9(this)},
-$isEO:true},
-no:{
-"^":"hw;P>",
-RR:function(a,b){return b.oD(this)},
-bu:function(a){var z=this.P
-return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},
-n:function(a,b){var z
-if(b==null)return!1
-z=H.RB(b,"$isno",[H.Kp(this,0)],"$asno")
-return z&&J.xC(J.Vm(b),this.P)},
-giO:function(a){return J.v1(this.P)},
-$isno:true},
-c0:{
-"^":"hw;hL<",
-RR:function(a,b){return b.Zh(this)},
-bu:function(a){return H.d(this.hL)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isc0&&U.Pu(b.ghL(),this.hL)},
-giO:function(a){return U.b1(this.hL)},
-$isc0:true},
-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.$isQb&&U.Pu(z.gRl(b),this.Rl)},
-giO:function(a){return U.b1(this.Rl)},
-$isQb:true},
-ae:{
-"^":"hw;G3>,v4<",
-RR:function(a,b){return b.YV(this)},
-bu:function(a){return this.G3.bu(0)+": "+H.d(this.v4)},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isae&&J.xC(z.gG3(b),this.G3)&&J.xC(b.gv4(),this.v4)},
-giO:function(a){var z,y
-z=J.v1(this.G3.P)
-y=J.v1(this.v4)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$isae:true},
-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).$isXC&&J.xC(b.wz,this.wz)},
-giO:function(a){return J.v1(this.wz)},
-$isXC:true},
-fp:{
-"^":"hw;P>",
-RR:function(a,b){return b.qv(this)},
-bu:function(a){return this.P},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isfp&&J.xC(z.gP(b),this.P)},
-giO:function(a){return J.v1(this.P)},
-$isfp:true},
-cJ:{
-"^":"hw;kp>,wz<",
-RR:function(a,b){return b.Hx(this)},
-bu:function(a){return H.d(this.kp)+" "+H.d(this.wz)},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$iscJ&&J.xC(z.gkp(b),this.kp)&&J.xC(b.gwz(),this.wz)},
-giO:function(a){var z,y
-z=J.v1(this.kp)
-y=J.v1(this.wz)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$iscJ:true},
-uku:{
-"^":"hw;kp>,Bb>,T8>",
-RR:function(a,b){return b.ex(this)},
-bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isuku&&J.xC(z.gkp(b),this.kp)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
-giO:function(a){var z,y,x
-z=J.v1(this.kp)
-y=J.v1(this.Bb)
-x=J.v1(this.T8)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$isuku:true},
-mc:{
-"^":"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).$ismc&&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.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$ismc:true},
-K9:{
-"^":"hw;Bb>,T8>",
-RR:function(a,b){return b.kz(this)},
-gF5:function(){var z=this.Bb
-return z.gP(z)},
-gkZ:function(a){return this.T8},
-bu:function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isK9&&b.Bb.n(0,this.Bb)&&J.xC(b.T8,this.T8)},
-giO:function(a){var z,y
-z=this.Bb
-z=z.giO(z)
-y=J.v1(this.T8)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$isK9:true,
-$isb4:true},
-px:{
-"^":"hw;Bb>,T8>",
-RR:function(a,b){return b.xt(this)},
-gF5:function(){var z=this.T8
-return z.gP(z)},
-gkZ:function(a){return this.Bb},
-bu:function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$ispx&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
-giO:function(a){var z,y
-z=J.v1(this.Bb)
-y=this.T8
-y=y.giO(y)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$ispx:true,
-$isb4:true},
-zX:{
-"^":"hw;Tf<,Jn<",
-RR:function(a,b){return b.CU(this)},
-bu:function(a){return H.d(this.Tf)+"["+H.d(this.Jn)+"]"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iszX&&J.xC(b.gTf(),this.Tf)&&J.xC(b.gJn(),this.Jn)},
-giO:function(a){var z,y
-z=J.v1(this.Tf)
-y=J.v1(this.Jn)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$iszX:true},
-x9:{
-"^":"hw;Tf<,oc>",
-RR:function(a,b){return b.fV(this)},
-bu:function(a){return H.d(this.Tf)+"."+H.d(this.oc)},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isx9&&J.xC(b.gTf(),this.Tf)&&J.xC(z.goc(b),this.oc)},
-giO:function(a){var z,y
-z=J.v1(this.Tf)
-y=J.v1(this.oc)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$isx9:true},
-Nb:{
-"^":"hw;Tf<,Sf>,re<",
-RR:function(a,b){return b.ZR(this)},
-bu:function(a){return H.d(this.Tf)+"."+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.$isNb&&J.xC(b.gTf(),this.Tf)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
-giO:function(a){var z,y,x
-z=J.v1(this.Tf)
-y=J.v1(this.Sf)
-x=U.b1(this.re)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$isNb:true},
-xs:{
-"^":"Tp:77;",
-$2:function(a,b){return U.C0C(a,J.v1(b))},
-$isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
-"^":"",
-FX:{
-"^":"a;rp,Yf,jQ,vi",
-gQi:function(){return this.vi.lo},
-lx: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.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
-this.vi.G()},
-Bp:function(){return this.lx(null,null)},
-GI:function(a){return this.lx(a,null)},
-Te:function(){if(this.vi.lo==null){this.rp.toString
-return C.x4}var z=this.Yq()
-return z==null?null:this.G5(z,0)},
-G5: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.rD()
-this.rp.toString
-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))if(J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
-this.Bp()
-w=this.Te()
-this.rp.toString
-a=new U.K9(a,w)}else if(J.xC(J.Vm(this.vi.lo),"as")){this.Bp()
-w=this.Te()
-if(!J.x(w).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
-this.rp.toString
-a=new U.px(a,w)}else break
-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.lx(8,"?")
-v=this.Te()
-this.GI(5)
-u=this.Te()
-this.rp.toString
-a=new U.mc(a,v,u)}else a=this.T1(a)
-else break}return a},
-j6:function(a,b){var z,y
-z=J.x(b)
-if(!!z.$isfp){z=z.gP(b)
-this.rp.toString
-return new U.x9(a,z)}else if(!!z.$isNb&&!!J.x(b.gTf()).$isfp){z=J.Vm(b.gTf())
-y=b.gre()
-this.rp.toString
-return new U.Nb(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-T1:function(a){var z,y,x,w,v
-z=this.vi.lo
-y=J.RE(z)
-if(!C.Nm.tg(C.fW,y.gP(z)))throw H.b(Y.RV("unknown operator: "+H.d(y.gP(z))))
-this.Bp()
-x=this.Yq()
-while(!0){w=this.vi.lo
-if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.vi.lo),3)||J.xC(J.Iz(this.vi.lo),9)){w=this.vi.lo.gP9()
-v=z.gP9()
-if(typeof w!=="number")return w.D()
-if(typeof v!=="number")return H.s(v)
-v=w>v
-w=v}else w=!1
-else w=!1
-if(!w)break
-x=this.G5(x,this.vi.lo.gP9())}y=y.gP(z)
-this.rp.toString
-return new U.uku(y,a,x)},
-Yq:function(){var z,y,x,w
-if(J.xC(J.Iz(this.vi.lo),8)){z=J.Vm(this.vi.lo)
-y=J.x(z)
-if(y.n(z,"+")||y.n(z,"-")){this.Bp()
-if(J.xC(J.Iz(this.vi.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.vi.lo)),null,null)
-this.rp.toString
-z=new U.no(y)
-z.$builtinTypeInfo=[null]
-this.Bp()
-return z}else{y=this.rp
-if(J.xC(J.Iz(this.vi.lo),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.vi.lo)),null)
-y.toString
-z=new U.no(x)
-z.$builtinTypeInfo=[null]
-this.Bp()
-return z}else{w=this.G5(this.LL(),11)
-y.toString
-return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
-w=this.G5(this.LL(),11)
-this.rp.toString
-return new U.cJ(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LL()},
-LL:function(){var z,y
-switch(J.Iz(this.vi.lo)){case 10:z=J.Vm(this.vi.lo)
-if(J.xC(z,"this")){this.Bp()
-this.rp.toString
-return new U.fp("this")}else if(C.Nm.tg(C.oP,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
-throw H.b(Y.RV("unrecognized keyword: "+H.d(z)))
-case 2:return this.jf()
-case 1:return this.ef()
-case 6:return this.DS()
-case 7:return this.Xk()
-case 9:if(J.xC(J.Vm(this.vi.lo),"(")){this.Bp()
-y=this.Te()
-this.lx(9,")")
-this.rp.toString
-return new U.XC(y)}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(Y.RV("unexpected token \":\""))
-default:return}},
-S9:function(){var z,y
-z=[]
-do{this.Bp()
-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.lx(9,"]")
-return new U.c0(z)},
-pH:function(){var z,y,x
-z=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"}"))break
-y=J.Vm(this.vi.lo)
-this.rp.toString
-x=new U.no(y)
-x.$builtinTypeInfo=[null]
-this.Bp()
-this.lx(5,":")
-z.push(new U.ae(x,this.Te()))
-y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"}")
-return new U.Qb(z)},
-jf:function(){var z,y,x
-if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(!0),[null])}if(J.xC(J.Vm(this.vi.lo),"false")){this.Bp()
-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.RV("expected identifier: "+H.d(this.gQi())+".value"))
-z=J.Vm(this.vi.lo)
-this.Bp()
-this.rp.toString
-y=new U.fp(z)
-x=this.rD()
-if(x==null)return y
-else return new U.Nb(y,null,x)},
-rD: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=[]
-do{this.Bp()
-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.lx(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.lx(9,"]")
-return y}return},
-ef:function(){var z,y
-z=J.Vm(this.vi.lo)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
-this.Bp()
-return y},
-Bu: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.Bu("")},
-u3:function(a){var z,y
-z=H.RR(H.d(a)+H.d(J.Vm(this.vi.lo)),null)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
-this.Bp()
-return y},
-Xk:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
-"^":"",
-RS:[function(a){return H.VM(new K.Bt(a),[null])},"$1","y8",2,0,66,67],
-Aep:{
-"^":"a;vH>,P>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isAep&&J.xC(b.vH,this.vH)&&J.xC(b.P,this.P)},
-giO:function(a){return J.v1(this.P)},
-bu:function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},
-$isAep:true},
-Bt:{
-"^":"mW;YR",
-gA:function(a){var z=new K.vR(J.mY(this.YR),0,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-gB:function(a){return J.q8(this.YR)},
-gl0:function(a){return J.FN(this.YR)},
-grZ:function(a){var z,y
-z=this.YR
-y=J.U6(z)
-z=new K.Aep(J.bI(y.gB(z),1),y.grZ(z))
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-$asmW:function(a){return[[K.Aep,a]]},
-$asQV:function(a){return[[K.Aep,a]]}},
-vR:{
-"^":"Dk;WS,wX,CD",
-gl:function(){return this.CD},
-G:function(){var z=this.WS
-if(z.G()){this.CD=H.VM(new K.Aep(this.wX++,z.gl()),[null])
-return!0}this.CD=null
-return!1},
-$asDk:function(a){return[[K.Aep,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
-"^":"",
-wX:function(a){switch(a){case 102:return 12
-case 110:return 10
-case 114:return 13
-case 116:return 9
-case 118:return 11
-default:return a}},
-qS:{
-"^":"a;fY>,P>,P9<",
-bu:function(a){return"("+this.fY+", '"+this.P+"')"},
-$isqS:true},
-pa:{
-"^":"a;MV,zy,jI,x0",
-zl:function(){var z,y,x,w,v,u,t,s
-z=this.jI
-this.x0=z.G()?z.Wn:null
-for(y=this.MV;x=this.x0,x!=null;)if(x===32||x===9||x===160)this.x0=z.G()?z.Wn:null
-else if(x===34||x===39)this.WG()
-else{if(typeof x!=="number")return H.s(x)
-if(!(97<=x&&x<=122))w=65<=x&&x<=90||x===95||x===36||x>127
-else w=!0
-if(w)this.zI()
-else if(48<=x&&x<=57)this.jj()
-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.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])
-if(C.Nm.tg(C.G8,u)){x=z.G()?z.Wn:null
-this.x0=x
-if(x===61)x=v===33||v===61
-else x=!1
-if(x){t=u+"="
-this.x0=z.G()?z.Wn:null}else t=u}else t=H.Lw(v)}else t=H.Lw(v)
-y.push(new Y.qS(8,t,C.lx.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.Lw(this.x0)
-y.push(new Y.qS(9,s,C.lx.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
-z=this.x0
-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.RV("unterminated string"))
-if(x===92){x=y.G()?y.Wn:null
-this.x0=x
-if(x==null)throw H.b(Y.RV("unterminated string"))
-x=H.Lw(Y.wX(x))
-w.vM+=x}else{x=H.Lw(x)
-w.vM+=x}x=y.G()?y.Wn:null
-this.x0=x}this.MV.push(new Y.qS(1,w.vM,0))
-w.vM=""
-this.x0=y.G()?y.Wn:null},
-zI:function(){var z,y,x,w,v
-z=this.jI
-y=this.zy
-while(!0){x=this.x0
-if(x!=null){if(typeof x!=="number")return H.s(x)
-if(!(97<=x&&x<=122))if(!(65<=x&&x<=90))w=48<=x&&x<=57||x===95||x===36||x>127
-else w=!0
-else w=!0}else w=!1
-if(!w)break
-x=H.Lw(x)
-y.vM+=x
-this.x0=z.G()?z.Wn:null}v=y.vM
-z=this.MV
-if(C.Nm.tg(C.oP,v))z.push(new Y.qS(10,v,0))
-else z.push(new Y.qS(2,v,0))
-y.vM=""},
-jj:function(){var z,y,x,w
-z=this.jI
-y=this.zy
-while(!0){x=this.x0
-if(x!=null){if(typeof x!=="number")return H.s(x)
-w=48<=x&&x<=57}else w=!1
-if(!w)break
-x=H.Lw(x)
-y.vM+=x
-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.oz()
-else this.MV.push(new Y.qS(3,".",11))}else{this.MV.push(new Y.qS(6,y.vM,0))
-y.vM=""}},
-oz:function(){var z,y,x,w
-z=this.zy
-z.KF(H.Lw(46))
-y=this.jI
-while(!0){x=this.x0
-if(x!=null){if(typeof x!=="number")return H.s(x)
-w=48<=x&&x<=57}else w=!1
-if(!w)break
-x=H.Lw(x)
-z.vM+=x
-this.x0=y.G()?y.Wn:null}this.MV.push(new Y.qS(7,z.vM,0))
-z.vM=""}},
-hA:{
-"^":"a;G1>",
-bu:function(a){return"ParseException: "+this.G1},
-static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
-"^":"",
-P55:{
-"^":"a;",
-DV:[function(a){return J.NV(a,this)},"$1","gay",2,0,181,143]},
-cfS:{
-"^":"P55;",
-xn:function(a){},
-W9:function(a){this.xn(a)},
-LT:function(a){a.wz.RR(0,this)
-this.xn(a)},
-fV:function(a){J.NV(a.gTf(),this)
-this.xn(a)},
-CU:function(a){J.NV(a.gTf(),this)
-J.NV(a.gJn(),this)
-this.xn(a)},
-ZR:function(a){var z
-J.NV(a.gTf(),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.NV(z.lo,this)
-this.xn(a)},
-oD:function(a){this.xn(a)},
-Zh:function(a){var z
-for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.NV(z.lo,this)
-this.xn(a)},
-o0:function(a){var z
-for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.NV(z.lo,this)
-this.xn(a)},
-YV:function(a){J.NV(a.gG3(a),this)
-J.NV(a.gv4(),this)
-this.xn(a)},
-qv:function(a){this.xn(a)},
-ex:function(a){J.NV(a.gBb(a),this)
-J.NV(a.gT8(a),this)
-this.xn(a)},
-Hx:function(a){J.NV(a.gwz(),this)
-this.xn(a)},
-RD:function(a){J.NV(a.gdc(),this)
-J.NV(a.gSl(),this)
-J.NV(a.gru(),this)
-this.xn(a)},
-kz:function(a){a.Bb.RR(0,this)
-a.T8.RR(0,this)
-this.xn(a)},
-xt:function(a){a.Bb.RR(0,this)
-a.T8.RR(0,this)
-this.xn(a)}}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
-"^":"",
-ov:{
-"^":"V42;oX,GR,cI,Bi=,xo,ZJ,Kf,Oq,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gIs:function(a){return a.oX},
-sIs:function(a,b){a.oX=this.ct(a,C.PX,a.oX,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},
-sMl:function(a,b){a.cI=this.ct(a,C.Gr,a.cI,b)},
-gxT:function(a){return a.xo},
-sxT:function(a,b){a.xo=this.ct(a,C.nt,a.xo,b)},
-giZ:function(a){return a.ZJ},
-siZ:function(a,b){a.ZJ=this.ct(a,C.vs,a.ZJ,b)},
-gGd:function(a){return a.Kf},
-sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-Es:function(a){Z.uL.prototype.Es.call(this,a)},
-rh:[function(a,b){this.mC(a)},"$1","grO",2,0,20,57],
-fX:[function(a,b){this.mC(a)},"$1","gIF",2,0,20,57],
-rA:[function(a,b){this.mC(a)},"$1","gP3",2,0,20,57],
-DJ:[function(a,b){if(b==null)return"min-width:32px;"
-else if(J.xC(b,0))return"min-width:32px; background-color:red"
-return"min-width:32px; background-color:green"},"$1","gfq",2,0,15,182],
-mC:function(a){var z,y,x
-if(a.Oq!=null)return
-if(J.iS(a.oX)!==!0){a.Oq=J.SK(a.oX).ml(new T.FW(a))
-return}z=a.GR
-z=z!=null?J.bI(a.oX.q6(z),1):0
-a.xo=this.ct(a,C.nt,a.xo,z)
-z=a.cI
-y=a.oX
-z=z!=null?y.q6(z):J.q8(J.de(y))
-a.ZJ=this.ct(a,C.vs,a.ZJ,z)
-z=a.Bi
-z.V1(z)
-for(x=a.xo;y=J.Wx(x),y.C(x,a.ZJ);x=y.g(x,1))z.h(0,x)},
-static:{"^":"bN,MRW,VnP",T5i:function(a){var z,y,x,w
-z=Q.ch(null,P.KN)
-y=R.tB([])
-x=P.L5(null,null,null,P.qU,W.I0)
-w=P.qU
-w=H.VM(new V.qC(P.YM(null,null,null,w,null),null,null),[w,null])
-a.Bi=z
-a.Kf=y
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=x
-a.ZQ=w
-C.Fa.ZL(a)
-C.Fa.XI(a)
-return a}}},
-V42:{
-"^":"uL+Pi;",
-$isd3:true},
-FW:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0){z.Oq=null
-J.TG(z)}},"$1",null,2,0,null,14,"call"],
-$isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
-"^":"",
-kn:{
-"^":"oEY;jJ,AP,fn,tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.gdN()},
-fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,20,57],
-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,20,14],
-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.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.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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.jJ=-1
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Yj.ZL(a)
-C.Yj.XI(a)
-return a}}},
-oEY:{
-"^":"xI+Pi;",
-$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
-"^":"",
-fI:{
-"^":"V43;Uz,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gIs:function(a){return a.Uz},
-sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=a.Uz
-if(z==null)return
-J.SK(z)},
-RF:[function(a,b){J.r0(a.Uz).Qy(b)},"$1","gvC",2,0,20,90],
-Ur:[function(a,b){J.eg(J.aT(a.Uz)).Qy(b)},"$1","gDX",2,0,20,90],
-static:{dI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.FH.ZL(a)
-C.FH.XI(a)
-return a}}},
-V43:{
-"^":"uL+Pi;",
-$isd3:true}}],["service","package:observatory/service.dart",,D,{
-"^":"",
-hi:function(a,b){var z,y,x,w,v,u,t,s,r
-if(b==null)return
-z=J.U6(b)
-z=z.t(b,"id")!=null&&z.t(b,"type")!=null
-if(!z)N.QM("").YX("Malformed service object: "+H.d(b))
-y=J.UQ(b,"type")
-z=J.rY(y)
-switch(z.nC(y,"@")?z.yn(y,1):y){case"Class":z=D.dy
-x=[]
-x.$builtinTypeInfo=[z]
-x=new Q.wn(null,null,x,null,null)
-x.$builtinTypeInfo=[z]
-z=D.dy
-w=[]
-w.$builtinTypeInfo=[z]
-w=new Q.wn(null,null,w,null,null)
-w.$builtinTypeInfo=[z]
-z=D.vO
-v=[]
-v.$builtinTypeInfo=[z]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[z]
-z=D.vO
-u=[]
-u.$builtinTypeInfo=[z]
-u=new Q.wn(null,null,u,null,null)
-u.$builtinTypeInfo=[z]
-z=D.dy
-t=[]
-t.$builtinTypeInfo=[z]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[z]
-s=new D.dy(null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Code":z=[]
-z.$builtinTypeInfo=[D.Fc]
-x=[]
-x.$builtinTypeInfo=[D.Fc]
-w=D.DP
-v=[]
-v.$builtinTypeInfo=[w]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[w]
-w=P.KN
-u=D.uA
-t=new V.qC(P.YM(null,null,null,w,u),null,null)
-t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Error":s=new D.ft(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Isolate":z=new V.qC(P.YM(null,null,null,null,null),null,null)
-z.$builtinTypeInfo=[null,null]
-x=P.L5(null,null,null,P.qU,D.af)
-w=[]
-w.$builtinTypeInfo=[P.qU]
-v=[]
-v.$builtinTypeInfo=[D.ER]
-u=D.dy
-t=[]
-t.$builtinTypeInfo=[u]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[u]
-u=D.U4
-r=[]
-r.$builtinTypeInfo=[u]
-r=new Q.wn(null,null,r,null,null)
-r.$builtinTypeInfo=[u]
-u=P.L5(null,null,null,P.qU,P.CP)
-u=R.tB(u)
-s=new D.bv(z,null,!1,!1,!0,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,r,null,null,null,null,null,u,new D.eK(0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,null,null),null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Library":z=D.U4
-x=[]
-x.$builtinTypeInfo=[z]
-x=new Q.wn(null,null,x,null,null)
-x.$builtinTypeInfo=[z]
-z=D.vx
-w=[]
-w.$builtinTypeInfo=[z]
-w=new Q.wn(null,null,w,null,null)
-w.$builtinTypeInfo=[z]
-z=D.dy
-v=[]
-v.$builtinTypeInfo=[z]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[z]
-z=D.vO
-u=[]
-u.$builtinTypeInfo=[z]
-u=new Q.wn(null,null,u,null,null)
-u.$builtinTypeInfo=[z]
-z=D.vO
-t=[]
-t.$builtinTypeInfo=[z]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[z]
-s=new D.U4(null,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"ServiceException":s=new D.EP(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Script":z=D.c2
-x=[]
-x.$builtinTypeInfo=[z]
-x=new Q.wn(null,null,x,null,null)
-x.$builtinTypeInfo=[z]
-s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),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},
-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},
-kT:function(a,b){var z=J.x(a)
-if(!!z.$isvO)return
-if(!!z.$isqC)D.yX(a,b)
-else if(!!z.$iswn)D.f3(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.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.yX(x,b)}},
-af:{
-"^":"Pi;px@,t7@",
-gwv:function(a){var z=this.Q4
-return z.gwv(z)},
-god:function(a){var z=this.Q4
-return z.god(z)},
-gjO:function(a){return this.r0},
-gzS:function(){return this.mQ},
-gPj:function(a){return this.Q4.Mq(this.r0)},
-gox:function(a){return this.kT},
-gUm:function(){return!1},
-gfS:function(){return!1},
-goc:function(a){return this.gpx()},
-soc:function(a,b){this.spx(this.ct(this,C.YS,this.gpx(),b))},
-gdN:function(){return this.gt7()},
-sdN:function(a){this.st7(this.ct(this,C.Tc,this.gt7(),a))},
-xW:function(a){if(this.kT)return P.Ab(this,null)
-return this.RE(0)},
-RE:function(a){var z
-if(J.xC(this.r0,""))return P.Ab(this,null)
-if(this.kT&&this.gfS())return P.Ab(this,null)
-z=this.VR
-if(z==null){z=this.gwv(this).HL(this.gPj(this)).ml(new D.JM(this)).Qy(new D.Bf(this))
-this.VR=z}return z},
-eC:function(a){var z,y,x,w
-z=J.U6(a)
-y=J.co(z.t(a,"type"),"@")
-x=z.t(a,"type")
-w=J.rY(x)
-if(w.nC(x,"@"))x=w.yn(x,1)
-w=this.r0
-if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
-this.mQ=x
-this.bF(0,a,y)},
-$isaf:true},
-JM:{
-"^":"Tp:184;a",
-$1:[function(a){var z,y
-z=J.UQ(a,"type")
-y=J.rY(z)
-if(y.nC(z,"@"))z=y.yn(z,1)
-y=this.a
-if(!J.xC(z,y.mQ))return D.hi(y.Q4,a)
-y.eC(a)
-return y},"$1",null,2,0,null,183,"call"],
-$isEH:true},
-Bf:{
-"^":"Tp:69;b",
-$0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
-$isEH:true},
-xm:{
-"^":"af;"},
-wv:{
-"^":"O1w;",
-gwv:function(a){return this},
-god:function(a){return},
-giR:function(){var z=this.z7
-return z.gUQ(z)},
-gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gLc",2,0,152,185],
-gYe:function(a){return this.Ox},
-gJk:function(){return this.RW},
-gA3:function(){return this.Ts},
-gEy:function(){return this.Va},
-gU6:function(){return this.bQ},
-gPE:function(){return this.l7},
-jq:function(a){var z,y,x,w
-z=$.rc().R4(0,a)
-if(z==null)return
-y=z.QK
-x=y.input
-w=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return C.xB.yn(x,w+y)},
-TV:function(a){var z,y,x
-z=$.vo().R4(0,a)
-if(z==null)return""
-y=z.QK
-x=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return J.Nj(a,0,x+y)},
-Qn:function(a){throw H.b(P.SY(null))},
-Tn:function(a){var z
-if(a==="")return P.Ab(null,null)
-z=this.z7.t(0,a)
-if(z!=null)return P.Ab(z,null)
-return this.RE(0).ml(new D.MZ(this,a))},
-cv:function(a){var z,y,x
-if(J.co(a,"isolates/")){z=this.TV(a)
-y=this.jq(a)
-return this.Tn(z).ml(new D.it(this,y))}x=this.yM.t(0,a)
-if(x!=null)return J.r0(x)
-return this.HL(a).ml(new D.lb(this,a))},
-nJm:[function(a,b){return b},"$2","ge1",4,0,77],
-ng:function(a){var z,y,x
-z=null
-try{y=new P.c5(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.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)
-return P.Ab(a,null)},
-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
-z=J.U6(b)
-y=z.t(b,"version")
-this.Ox=F.Wi(this,C.zn,this.Ox,y)
-y=z.t(b,"architecture")
-this.GY=F.Wi(this,C.ke,this.GY,y)
-y=z.t(b,"uptime")
-this.RW=F.Wi(this,C.mh,this.RW,y)
-y=P.Wu(H.BU(z.t(b,"date"),null,null),!1)
-this.l7=F.Wi(this,C.GI,this.l7,y)
-y=z.t(b,"assertsEnabled")
-this.Ts=F.Wi(this,C.ET,this.Ts,y)
-y=z.t(b,"pid")
-this.bQ=F.Wi(this,C.uI,this.bQ,y)
-y=z.t(b,"typeChecksEnabled")
-this.Va=F.Wi(this,C.J2,this.Va,y)
-this.l9(z.t(b,"isolates"))},
-l9:function(a){var z,y,x,w,v,u
-z=this.z7
-y=P.L5(null,null,null,P.qU,D.bv)
-for(x=J.mY(a);x.G();){w=x.gl()
-v=J.UQ(w,"id")
-u=z.t(0,v)
-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.y2())
-this.z7=y},
-md:function(){this.px=this.ct(this,C.YS,this.px,"vm")
-this.t7=this.ct(this,C.Tc,this.t7,"vm")
-this.yM.u(0,"vm",this)
-var z=P.EF(["id","vm","type","@VM"],null,null)
-this.eC(R.tB(z))},
-$iswv:true},
-O1w:{
-"^":"xm+Pi;",
-$isd3:true},
-MZ:{
-"^":"Tp:13;a,b",
-$1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-it:{
-"^":"Tp:13;a,b",
-$1:[function(a){var z
-if(a==null)return this.a
-z=this.b
-if(z==null)return J.r0(a)
-else return a.cv(z)},"$1",null,2,0,null,7,"call"],
-$isEH:true},
-lb:{
-"^":"Tp:184;c,d",
-$1:[function(a){var z,y
-z=this.c
-y=D.hi(z,a)
-if(y.gUm())z.yM.to(this.d,new D.zK(y))
-return y},"$1",null,2,0,null,183,"call"],
-$isEH:true},
-zK:{
-"^":"Tp:69;e",
-$0:function(){return this.e},
-$isEH:true},
-zA:{
-"^":"Tp:13;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.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,133,"call"],
-$isEH:true},
-tm:{
-"^":"Tp:13;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,24,"call"],
-$isEH:true},
-mR:{
-"^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-bp:{
-"^":"Tp:13;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,86,"call"],
-$isEH:true},
-hc:{
-"^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-y2:{
-"^":"Tp:77;",
-$2:function(a,b){J.r0(b)},
-$isEH:true},
-ER:{
-"^":"a;SP,XE>,wZ",
-eK:function(a){var z,y,x,w,v
-z=this.XE
-H.vf(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.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.bI(u,b[v])
-z[v]=u
-t=this.wZ
-if(typeof u!=="number")return H.s(u)
-this.wZ=t+u}},
-k5:function(a,b){var z,y,x,w,v,u
-z=J.U6(b)
-y=this.XE
-x=y.length
-w=0
-while(!0){v=z.gB(b)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=z.t(b,w)
-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.XE,y=z.length,x=0;x<y;++x)z[x]=0},
-$isER:true},
-tL:{
-"^":"a;af<,lI<,h7,yP,hD,QS",
-gij:function(){return this.h7},
-xZ:function(a,b){var z,y,x,w,v,u
-this.h7=a
-z=J.U6(b)
-y=z.t(b,"counters")
-x=this.af
-if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
-this.QS=J.q8(z.t(b,"counters"))
-for(z=this.hD,x=this.lI,w=0;v=this.QS,w<z;++w){if(typeof v!=="number")return H.s(v)
-v=Array(v)
-v.fixed$length=init
-v.$builtinTypeInfo=[P.KN]
-u=new D.ER(0,v,0)
-u.CJ()
-x.push(u)}if(typeof v!=="number")return H.s(v)
-z=Array(v)
-z.fixed$length=init
-z=new D.ER(0,H.VM(z,[P.KN]),0)
-this.yP=z
-z.eK(y)
-return}z=this.QS
-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.XE)
-this.yP.k5(0,y)
-z=this.lI
-z.push(u)
-if(z.length>this.hD)C.Nm.KI(z,0)}},
-eK:{
-"^":"Pi;mV,ob,pX,yp,uK,AP,fn",
-gSU:function(){return this.mV},
-gCs:function(){return this.ob},
-gMX:function(){return this.pX},
-gYk:function(){return this.yp},
-gpy:function(){return this.uK},
-eC:function(a){var z,y
-z=J.U6(a)
-y=z.t(a,"used")
-this.mV=F.Wi(this,C.LP,this.mV,y)
-y=z.t(a,"capacity")
-this.ob=F.Wi(this,C.bV,this.ob,y)
-y=z.t(a,"external")
-this.pX=F.Wi(this,C.h7,this.pX,y)
-y=z.t(a,"collections")
-this.yp=F.Wi(this,C.J6,this.yp,y)
-z=z.t(a,"time")
-this.uK=F.Wi(this,C.Jl,this.uK,z)}},
-bv:{
-"^":"uz4;V3,Jr,EY,eU,zG,XV,yM,GH,Z2,AI,v9,tW,zb,px:KT@,t7:f5@,i9,SF,Dr,UY<,xQ<,vJ,zf,BC<,FF,bj,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gwv:function(a){return this.Q4},
-god:function(a){return this},
-gXE:function(a){return this.V3},
-sXE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
-gPj:function(a){return"/"+H.d(this.r0)},
-gBP:function(a){return this.Jr},
-gA6:function(){return this.EY},
-gaj:function(){return this.eU},
-gjz:function(){return this.zG},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,152,185],
-N3:function(a){var z,y,x,w
-z=H.VM([],[D.kx])
-y=J.U6(a)
-for(x=J.mY(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
-this.c2()
-this.pl(a,z)
-w=y.t(a,"exclusive_trie")
-if(w!=null)this.BC=this.Q3(w,z)},
-c2:function(){var z=this.yM
-z.gUQ(z).aN(0,new D.TV())},
-pl:function(a,b){var z,y,x,w
-z=J.U6(a)
-y=z.t(a,"codes")
-x=z.t(a,"samples")
-for(z=J.mY(y);z.G();){w=z.gl()
-J.UQ(w,"code").Il(w,b,x)}},
-Ms:[function(a){return this.cv("coverage").ml(this.gJJ())},"$0","gDX",0,0,186],
-cNN:[function(a){J.Me(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,135,187],
-WR:function(){return this.cv("classes").ml(this.geL()).ml(this.gjR())},
-Dw:[function(a){var z,y,x,w
-z=[]
-for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
-w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.YZ(z,!1)},"$1","geL",2,0,188,189],
-xk:[function(a){var z,y,x,w
-z=this.AI
-z.V1(z)
-this.Z2=F.Wi(this,C.as,this.Z2,null)
-for(y=J.mY(a);y.G();){x=y.gl()
-if(x.guj()==null)z.h(0,x)
-if(J.xC(x.gdN(),"Object")&&J.xC(x.gi2(),!1)){w=this.Z2
-if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.as,w,x)
-w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Z2=x}}return P.Ab(this.Z2,null)},"$1","gjR",2,0,190,191],
-Qn:function(a){var z,y,x
-if(a==null)return
-z=J.UQ(a,"id")
-y=this.yM
-x=y.t(0,z)
-if(x!=null)return x
-x=D.hi(this,a)
-if(x.gUm())y.u(0,z,x)
-return x},
-cv:function(a){var z=this.yM.t(0,a)
-if(z!=null)return J.r0(z)
-return this.Q4.HL("/"+H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gDZ:function(){return this.Z2},
-gVc:function(){return this.v9},
-sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
-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)},
-gdN:function(){return this.f5},
-sdN:function(a){this.f5=F.Wi(this,C.Tc,this.f5,a)},
-geH:function(){return this.i9},
-gw2:function(){return this.SF},
-sw2:function(a){this.SF=F.Wi(this,C.tP,this.SF,a)},
-gkc:function(a){return this.zf},
-skc:function(a,b){this.zf=F.Wi(this,C.yh,this.zf,b)},
-WU:function(a){var z=J.U6(a)
-this.UY.eC(z.t(a,"new"))
-this.xQ.eC(z.t(a,"old"))},
-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")
-this.i9=F.Wi(this,C.wT,this.i9,y)
-y=z.t(b,"name")
-this.KT=F.Wi(this,C.YS,this.KT,y)
-y=z.t(b,"name")
-this.f5=F.Wi(this,C.Tc,this.f5,y)
-if(c)return
-this.kT=!0
-this.zG=F.Wi(this,C.DY,this.zG,!1)
-D.kT(b,this)
-if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heaps")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
-return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.eN,this.v9,y)
-if(z.t(b,"entry")!=null){y=z.t(b,"entry")
-this.SF=F.Wi(this,C.tP,this.SF,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
-this.zb=F.Wi(this,C.bc,this.zb,y)}else this.zb=F.Wi(this,C.bc,this.zb,null)
-x=z.t(b,"tagCounters")
-if(x!=null){y=J.U6(x)
-w=y.t(x,"names")
-v=y.t(x,"counters")
-y=J.U6(v)
-u=0
-t=0
-while(!0){s=y.gB(v)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-s=y.t(v,t)
-if(typeof s!=="number")return H.s(s)
-u+=s;++t}s=P.Fl(null,null)
-s=R.tB(s)
-this.V3=F.Wi(this,C.bJ,this.V3,s)
-if(u===0){y=J.U6(w)
-t=0
-while(!0){s=y.gB(w)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-J.kW(this.V3,y.t(w,t),"0.0%");++t}}else{s=J.U6(w)
-t=0
-while(!0){r=s.gB(w)
-if(typeof r!=="number")return H.s(r)
-if(!(t<r))break
-J.kW(this.V3,s.t(w,t),C.CD.Sy(J.L9(y.t(v,t),u)*100,2)+"%");++t}}}q=P.Fl(null,null)
-J.Me(z.t(b,"timers"),new D.Qq(q))
-y=this.Dr
-s=J.w1(y)
-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.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"))
-this.WU(z.t(b,"heaps"))
-p=z.t(b,"features")
-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.Bs,s,!0)
-s.$builtinTypeInfo=[null]
-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
-this.EY=F.Wi(this,C.L2,this.EY,y)
-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.zf=F.Wi(this,C.yh,this.zf,y)
-y=this.tW
-y.V1(y)
-for(z=J.mY(z.t(b,"libraries"));z.G();)y.h(0,z.gl())
-y.GT(y,new D.hU())},
-m7:function(){return this.Q4.HL("/"+H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
-Q3:function(a,b){this.FF=0
-this.bj=a
-if(a==null)return
-if(J.u6(J.q8(a),3))return
-return this.AW(b)},
-AW:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.bj
-y=this.FF
-if(typeof y!=="number")return y.g()
-this.FF=y+1
-x=J.UQ(z,y)
-if(x>>>0!==x||x>=a.length)return H.e(a,x)
-w=a[x]
-y=this.bj
-z=this.FF
-if(typeof z!=="number")return z.g()
-this.FF=z+1
-v=J.UQ(y,z)
-z=[]
-z.$builtinTypeInfo=[D.t9]
-u=new D.t9(w,v,z,0)
-y=this.bj
-t=this.FF
-if(typeof t!=="number")return t.g()
-this.FF=t+1
-s=J.UQ(y,t)
-if(typeof s!=="number")return H.s(s)
-r=0
-for(;r<s;++r){q=this.AW(a)
-z.push(q)
-y=u.Jv
-t=q.Av
-if(typeof t!=="number")return H.s(t)
-u.Jv=y+t}return u},
-$isbv:true,
-static:{"^":"ZGx"}},
-uz4:{
-"^":"xm+Pi;",
-$isd3:true},
-TV:{
-"^":"Tp:13;",
-$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.hw,0)
-a.Oo.V1(0)}},
-$isEH:true},
-Yb:{
-"^":"Tp:13;a",
-$1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,192,"call"],
-$isEH:true},
-KQ:{
-"^":"Tp:184;a,b",
-$1:[function(a){var z,y
-z=this.a
-y=D.hi(z,a)
-if(y.gUm())z.yM.to(this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,183,"call"],
-$isEH:true},
-Ea:{
-"^":"Tp:69;c",
-$0:function(){return this.c},
-$isEH:true},
-Qq:{
-"^":"Tp:13;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,193,"call"],
-$isEH:true},
-hU:{
-"^":"Tp:77;",
-$2:function(a,b){return J.oE(J.O6(a),J.O6(b))},
-$isEH:true},
-AP:{
-"^":"Tp:184;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,146,"call"],
-$isEH:true},
-vO:{
-"^":"af;Ce,Q4,r0,mQ,kT,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
-z=this.Ce
-z.V1(0)
-z.FV(0,b)
-y=z.Zp
-x=y.t(0,"user_name")
-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.kT(z,this.Q4)},
-FV:function(a,b){return this.Ce.FV(0,b)},
-V1:function(a){return this.Ce.V1(0)},
-aN:function(a,b){return this.Ce.Zp.aN(0,b)},
-t:function(a,b){return this.Ce.Zp.t(0,b)},
-u:function(a,b,c){this.Ce.u(0,b,c)
-return c},
-gl0:function(a){var z=this.Ce.Zp
-return z.gB(z)===0},
-gor:function(a){var z=this.Ce.Zp
-return z.gB(z)!==0},
-gvc:function(){return this.Ce.Zp.gvc()},
-gUQ:function(a){var z=this.Ce.Zp
-return z.gUQ(z)},
-gB:function(a){var z=this.Ce.Zp
-return z.gB(z)},
-HC:[function(a){var z=this.Ce
-return z.HC(z)},"$0","gDx",0,0,111],
-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","gqw",0,0,18],
-NB:[function(a){this.Ce.AP=null
-return},"$0","gym",0,0,18],
-gqh:function(a){var z=this.Ce
-return z.gqh(z)},
-gnz:function(a){var z,y
-z=this.Ce.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-$isvO:true,
-$isqC:true,
-$asqC:function(){return[null,null]},
-$isZ0:true,
-$asZ0:function(){return[null,null]},
-$isd3:true,
-static:{"^":"RQ"}},
-ft:{
-"^":"D3;I0,LD,jo,YS,AP,fn,Q4,r0,mQ,kT,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.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.Q4
-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.YS=F.Wi(this,C.Pf,this.YS,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;I0,LD,AP,fn,Q4,r0,mQ,kT,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
-z=J.U6(b)
-y=z.t(b,"kind")
-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.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;I0,LD,IV,AP,fn,Q4,r0,mQ,kT,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},
-bF:function(a,b,c){var z,y
-z=J.U6(b)
-y=z.t(b,"kind")
-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.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<,XR<,DD>,Z3<,mu<,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gO3:function(a){return this.dj},
-gUm:function(){return!0},
-gfS:function(){return!1},
-bF:function(a,b,c){var z,y,x,w,v
-z=J.U6(b)
-y=z.t(b,"url")
-x=F.Wi(this,C.Fh,this.dj,y)
-this.dj=x
-if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
-w=J.U6(y)
-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.px,y)
-this.px=y
-if(J.FN(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
-y=this.Q4
-D.kT(b,y.god(y))
-y=this.Bm
-y.V1(y)
-y.FV(0,z.t(b,"imports"))
-y=this.XR
-y.V1(y)
-y.FV(0,z.t(b,"scripts"))
-y=this.DD
-y.V1(y)
-y.FV(0,z.t(b,"classes"))
-y=this.Z3
-y.V1(y)
-y.FV(0,z.t(b,"variables"))
-y=this.mu
-y.V1(y)
-y.FV(0,z.t(b,"functions"))},
-$isU4:true},
-w8F:{
-"^":"af+Pi;",
-$isd3:true},
-mT:{
-"^":"Pi;wf,yg,AP,fn",
-gWt:function(){return this.wf},
-gfj:function(){return this.yg}},
-Iy:{
-"^":"a;bi<,l<",
-eC:function(a){var z,y,x
-z=this.bi
-y=J.U6(a)
-x=y.t(a,6)
-z.wf=F.Wi(z,C.yB,z.wf,x)
-x=y.t(a,7)
-z.yg=F.Wi(z,C.hN,z.yg,x)
-x=this.l
-z=J.ew(y.t(a,2),y.t(a,4))
-x.wf=F.Wi(x,C.yB,x.wf,z)
-y=J.ew(y.t(a,3),y.t(a,5))
-x.yg=F.Wi(x,C.hN,x.yg,y)},
-static:{"^":"jZx,xxx,qWF,oQ,S1O,wXu,WVi,Whu"}},
-dy:{
-"^":"V4b;Gz,ar,qX,Xj,vY,u0,J1,E8,Aj,zf,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gHt:function(a){return this.Gz},
-sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-guj:function(){return this.qX},
-suj:function(a){this.qX=F.Wi(this,C.Cw,this.qX,a)},
-gVM:function(){return this.Xj},
-gi2:function(){return this.J1},
-gVF:function(){return this.Aj},
-sVF:function(a){this.Aj=F.Wi(this,C.z6,this.Aj,a)},
-gkc:function(a){return this.zf},
-skc:function(a,b){this.zf=F.Wi(this,C.yh,this.zf,b)},
-gMp:function(){var z,y
-z=this.UY
-y=z.bi
-if(J.xC(y.wf,0)&&J.xC(y.yg,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.yg,0)}else z=!1
-if(z){z=this.xQ
-y=z.bi
-if(J.xC(y.wf,0)&&J.xC(y.yg,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.yg,0)}else z=!1}else z=!1
-return z},
-gUm:function(){return!0},
-gfS:function(){return!1},
-bu:function(a){return"Service Class: "+H.d(this.t7)},
-bF:function(a,b,c){var z,y,x
-z=J.U6(b)
-y=z.t(b,"user_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)
-if(c)return
-this.kT=!0
-y=this.Q4
-D.kT(b,y.god(y))
-if(!!J.x(z.t(b,"library")).$isU4){y=z.t(b,"library")
-this.Gz=F.Wi(this,C.EV,this.Gz,y)}else this.Gz=F.Wi(this,C.EV,this.Gz,null)
-y=z.t(b,"script")
-this.ar=F.Wi(this,C.PX,this.ar,y)
-y=z.t(b,"abstract")
-this.Xj=F.Wi(this,C.XH,this.Xj,y)
-y=z.t(b,"const")
-this.vY=F.Wi(this,C.bD,this.vY,y)
-y=z.t(b,"finalized")
-this.u0=F.Wi(this,C.WV,this.u0,y)
-y=z.t(b,"patch")
-this.J1=F.Wi(this,C.XL,this.J1,y)
-y=z.t(b,"implemented")
-this.E8=F.Wi(this,C.Ih,this.E8,y)
-y=z.t(b,"tokenPos")
-this.Aj=F.Wi(this,C.z6,this.Aj,y)
-y=this.S5
-y.V1(y)
-y.FV(0,z.t(b,"subclasses"))
-y=this.tJ
-y.V1(y)
-y.FV(0,z.t(b,"fields"))
-y=this.mu
-y.V1(y)
-y.FV(0,z.t(b,"functions"))
-y=z.t(b,"super")
-y=F.Wi(this,C.Cw,this.qX,y)
-this.qX=y
-if(y!=null)y.Ib(this)
-y=z.t(b,"error")
-this.zf=F.Wi(this,C.yh,this.zf,y)
-x=z.t(b,"allocationStats")
-if(x!=null){z=J.U6(x)
-this.UY.eC(z.t(x,"new"))
-this.xQ.eC(z.t(x,"old"))}},
-Ib:function(a){var z=this.ks
-if(z.tg(z,a))return
-z.h(0,a)},
-cv:function(a){var z=this.Q4
-return z.god(z).cv(J.ew(this.r0,"/"+H.d(a)))},
-$isdy:true},
-V4b:{
-"^":"af+Pi;",
-$isd3:true},
-c2:{
-"^":"Pi;Rd<,a4>,x9,AP,fn",
-gu9:function(){return this.x9},
-su9:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
-$isc2:true},
-vx:{
-"^":"Zqa;Gd>,d6,I0,U9,nE,mB,wA,y6,FB,AP,fn,Q4,r0,mQ,kT,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.U9},
-shY:function(a){var z=this.U9
-if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.Gd,z,a)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.U9=a},
-gSK:function(){return this.nE},
-sSK:function(a){var z=this.nE
-if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.kA,z,a)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.nE=a},
-gUm:function(){return!0},
-gfS:function(){return!0},
-rK:function(a){var z,y
-z=J.bI(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.I0=F.Wi(this,C.Lc,this.I0,y)
-y=z.t(b,"name")
-this.wA=y
-x=J.U6(y)
-w=x.cn(y,"/")
-if(typeof w!=="number")return w.g()
-w=x.yn(y,w+1)
-this.mB=w
-this.px=this.ct(this,C.YS,this.px,w)
-w=this.wA
-this.t7=this.ct(this,C.Tc,this.t7,w)
-this.W8(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.nE=F.Wi(this,C.kA,this.nE,null)
-for(z=J.mY(a);z.G();){y=z.gl()
-x=J.U6(y)
-w=x.t(y,0)
-v=1
-while(!0){u=x.gB(y)
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-t=x.t(y,v)
-s=x.t(y,v+1)
-u=this.U9
-if(u==null){if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.Gd,u,t)
-u.$builtinTypeInfo=[null]
-this.nq(this,u)}this.U9=t
-u=this.nE
-if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.kA,u,t)
-u.$builtinTypeInfo=[null]
-this.nq(this,u)}this.nE=t}else{u=J.Bl(u,t)?this.U9:t
-r=this.U9
-if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.Gd,r,u)
-r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.U9=u
-u=J.J5(this.nE,t)?this.nE:t
-r=this.nE
-if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.kA,r,u)
-r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.nE=u}this.y6.u(0,t,w)
-this.FB.u(0,t,s)
-v+=2}}},
-SC:function(a){var z,y,x,w,v,u,t
-z=J.U6(a)
-y=this.d6
-x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-v=z.t(a,x)
-u=z.t(a,x+1)
-t=y.t(0,v)
-y.u(0,v,t!=null?J.ew(u,t):u)
-x+=2}this.zL()},
-W8:function(a){var z,y,x,w
-this.kT=!1
-if(a==null)return
-z=J.uH(a,"\n")
-if(z.length===0)return
-this.kT=!0
-y=this.Gd
-y.V1(y)
-N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
-for(x=0;x<z.length;x=w){w=x+1
-y.h(0,new D.c2(w,z[x],null,null,null))}this.zL()},
-zL:function(){var z,y,x
-z=this.Gd
-if(z.ao.length===0)return
-for(z=z.gA(z),y=this.d6;z.G();){x=z.lo
-x.su9(y.t(0,x.gRd()))}},
-$isvx:true},
-Zqa:{
-"^":"af+Pi;",
-$isd3:true},
-uA:{
-"^":"a;Yu<,Du<,fF<",
-$isuA:true},
-xb:{
-"^":"Pi;Yu<,JP,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)},
-gJz:function(){return this.MT},
-JM:[function(){var z,y
-z=this.JP
-y=J.x(z)
-if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,194],
-bR:function(a){var z,y
-this.ar=F.Wi(this,C.PX,this.ar,null)
-z=this.VF
-if(J.xC(z,-1))return
-y=a.q6(z)
-if(y==null)return
-this.ar=F.Wi(this,C.PX,this.ar,a)
-z=J.dY(a.rK(y))
-this.MT=F.Wi(this,C.oI,this.MT,z)},
-$isxb:true},
-DP:{
-"^":"Pi;Yu<,jA,L4<,dh,uH<,AP,fn",
-gEB:function(){return this.dh},
-gUB:function(){return J.xC(this.Yu,0)},
-gGf:function(){return this.uH.ao.length>0},
-dV:[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,194],
-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,195,71],
-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,195,71],
-eQ:function(){var z,y,x,w
-y=J.uH(this.L4," ")
-x=y.length
-if(x!==2)return 0
-if(1>=x)return H.e(y,1)
-z=y[1]
-if(J.co(z,"0x"))z=J.ZZ(z,2)
-try{x=H.BU(z,16,null)
-return x}catch(w){H.Ru(w)
-return 0}},
-Sd:function(a){var z,y,x,w,v
-z=this.L4
-if(!J.co(z,"j"))return
-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.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.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)
-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,"Reused"))return C.yP
-else if(z.n(a,"Tag"))return C.Z7
-N.QM("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.EY())}}},
-Fc:{
-"^":"a;tT>,Av<",
-$isFc:true},
-t9:{
-"^":"a;tT>,Av<,ks>,Jv",
-$ist9:true},
-kx:{
-"^":"D3i;I0,xM,Du<,fF<,Oj,Mb,VS,hw,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,dN@,TD,AP,fn,Q4,r0,mQ,kT,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},
-gL1:function(){return this.Ni},
-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)},
-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","gUH",2,0,196,197],
-OF:function(){if(this.ar!=null)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.gUH())},
-RE:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.RE.call(this,this)
-return P.Ab(this,null)},
-bd:function(a,b,c){var z,y,x,w,v
-z=J.U6(b)
-y=0
-while(!0){x=z.gB(b)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-w=H.BU(z.t(b,y),null,null)
-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.Fc(c[w],v))
-y+=2}H.rd(a,new D.fx())},
-Il: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.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)+")"
-this.mM=F.Wi(this,C.eF,this.mM,z)
-z=D.Rd(this.Du,this.xM)+" ("+H.d(this.Du)+")"
-this.qH=F.Wi(this,C.uU,this.qH,z)},
-bF:function(a,b,c){var z,y,x,w,v
-z=J.U6(b)
-this.oc=z.t(b,"user_name")
-this.dN=z.t(b,"name")
-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.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.Q4
-x=y.god(y).Qn(z.t(b,"function"))
-this.MO=F.Wi(this,C.nf,this.MO,x)
-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.xs(w)
-v=z.t(b,"descriptors")
-if(v!=null)this.WY(J.UQ(v,"members"))
-z=this.va.ao
-this.kT=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},
-xs:function(a){var z,y,x,w,v,u,t,s
-z=this.va
-z.V1(z)
-y=J.U6(a)
-x=0
-while(!0){w=y.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-v=y.t(a,x+1)
-u=y.t(a,x+2)
-t=!J.xC(y.t(a,x),"")?H.BU(y.t(a,x),null,null):0
-w=D.xb
-s=[]
-s.$builtinTypeInfo=[w]
-s=new Q.wn(null,null,s,null,null)
-s.$builtinTypeInfo=[w]
-z.h(0,new D.DP(t,v,u,null,s,null,null))
-x+=3}for(y=z.gA(z);y.G();)y.lo.Sd(z)},
-QX:function(a){var z,y,x,w,v,u,t
-z=J.U6(a)
-y=H.BU(z.t(a,"pc"),16,null)
-x=z.t(a,"deoptId")
-w=z.t(a,"tokenPos")
-v=z.t(a,"tryIndex")
-u=J.rr(z.t(a,"kind"))
-for(z=this.va,z=z.gA(z);z.G();){t=z.lo
-if(J.xC(t.gYu(),y)){t.guH().h(0,new D.xb(y,x,w,v,u,null,null,null,null))
-return}}N.QM("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
-WY:function(a){var z
-for(z=J.mY(a);z.G();)this.QX(z.gl())},
-qL:function(a){var z,y,x,w,v
-z=J.U6(a)
-y=this.Oo
-x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-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){J.J5(b,this.Oj)
-return!1},
-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)+"%"}}},
-D3i:{
-"^":"af+Pi;",
-$isd3:true},
-Em:{
-"^":"Tp:13;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.gUH())},"$1",null,2,0,null,198,"call"],
-$isEH:true},
-fx:{
-"^":"Tp:77;",
-$2:function(a,b){return J.bI(b.gAv(),a.gAv())},
-$isEH:true},
-l8R:{
-"^":"a;uX",
-bu:function(a){return this.uX},
-static:{"^":"Ll,lTU,FJy,wr",AR:function(a){var z=J.x(a)
-if(z.n(a,"Listening"))return C.Cn
-else if(z.n(a,"Normal"))return C.fO
-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.EY())}}},
-WP:{
-"^":"Pqb;V8@,je,mI,I0,vu,DB,XK,FH,L7,Wu,tO,HO,kJ,Wm,AP,fn,Q4,r0,mQ,kT,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.vu},
-gm8:function(){return this.DB},
-gaU:function(){return this.XK},
-gaP:function(){return this.FH},
-gzM:function(){return this.L7},
-gkE:function(){return this.Wu},
-giP:function(){return this.tO},
-gLw:function(){return this.HO},
-gNS:function(){return this.kJ},
-guh:function(){return this.Wm},
-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.AR(z.t(b,"kind"))
-this.I0=F.Wi(this,C.Lc,this.I0,y)
-if(c)return
-this.kT=!0
-y=this.Q4
-D.kT(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.FH=F.Wi(this,C.To,this.FH,y)
-y=z.t(b,"listening")
-this.L7=F.Wi(this,C.cc,this.L7,y)
-y=z.t(b,"protocol")
-this.vu=F.Wi(this,C.AY,this.vu,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.dx,this.kJ,y)
-y=z.t(b,"remotePort")
-this.Wm=F.Wi(this,C.ni,this.Wm,y)
-y=z.t(b,"fd")
-this.Wu=F.Wi(this,C.R3,this.Wu,y)
-this.V8=z.t(b,"owner")}},
-Pqb:{
-"^":"af+Pi;",
-$isd3:true},
-Qf:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z,y
-z=J.x(b)
-y=!!z.$isqC
-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.yX(b,this.b)},
-$isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
-"^":"",
-zM:{
-"^":"V44;S4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gkc:function(a){return a.S4},
-skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
-static:{cE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.n8.ZL(a)
-C.n8.XI(a)
-return a}}},
-V44:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
-"^":"",
-Rk:{
-"^":"V45;Xc,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Vd.ZL(a)
-C.Vd.XI(a)
-return a}}},
-V45:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
-"^":"",
-XK:{
-"^":"wv;Jf,Ox,GY,RW,Ts,Va,bQ,l7,Li,G2,yM,z7,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-z6:function(a,b){var z
-if(J.VT(this.Jf,"/")&&J.co(b,"/"))b=J.ZZ(b,1)
-N.QM("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
-z=this.Jf
-if(typeof z!=="string")return z.g()
-return W.lt(J.ew(z,b),null,null,null,P.EF(["Observatory-Version","1.0"],null,null),null,null,null).ml(new U.dT()).OA(new U.E7())},
-eY:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
-dT:{
-"^":"Tp:200;",
-$1:[function(a){return J.Du(a)},"$1",null,2,0,null,199,"call"],
-$isEH:true},
-E7:{
-"^":"Tp:13;",
-$1:[function(a){var z,y
-N.QM("").YX("HttpRequest.request failed.")
-z=J.l2(a)
-y=J.RE(z)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",y.gxN(z),"kind","NetworkException","message","Could not connect to service ("+H.d(y.gpo(z))+"). Check that you started the VM with the following flags: --observe"],null,null))},"$1",null,2,0,null,24,"call"],
-$isEH:true},
-ho:{
-"^":"wv;S3,yb,Ox,GY,RW,Ts,Va,bQ,l7,Li,G2,yM,z7,AP,fn,Q4,r0,mQ,kT,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")
-x=J.UQ(z.gRn(a),"name")
-w=J.UQ(z.gRn(a),"data")
-if(!J.xC(x,"observatoryData"))return
-z=this.S3
-v=z.t(0,y)
-z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,20,72],
-z6:function(a,b){var z,y,x
-z=""+this.yb
-y=P.Fl(null,null)
-y.u(0,"id",z)
-y.u(0,"method","observatoryQuery")
-y.u(0,"query",H.d(b));++this.yb
-x=H.VM(new P.Zf(P.Dt(null)),[null])
-this.S3.u(0,z,x)
-J.iA(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.Ov(0,z.DK,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:{
-"^":"V46;Ll,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-switch(a.Ll.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
-J.CJ(z,a.Ll)
-return z
-case"BreakpointList":z=W.r3("breakpoint-list",null)
-J.oJ(z,a.Ll)
-return z
-case"Class":z=W.r3("class-view",null)
-J.NZ(z,a.Ll)
-return z
-case"Code":z=W.r3("code-view",null)
-J.T5(z,a.Ll)
-return z
-case"Error":z=W.r3("error-view",null)
-J.Qr(z,a.Ll)
-return z
-case"Field":z=W.r3("field-view",null)
-J.JZ(z,a.Ll)
-return z
-case"FlagList":z=W.r3("flag-list",null)
-J.vJ(z,a.Ll)
-return z
-case"Function":z=W.r3("function-view",null)
-J.C3(z,a.Ll)
-return z
-case"HeapMap":z=W.r3("heap-map",null)
-J.Nf(z,a.Ll)
-return z
-case"LibraryPrefix":case"TypeRef":case"TypeParameter":case"BoundedType":case"Int32x4":case"Float32x4":case"Float64x4":case"TypedData":case"ExternalTypedData":case"Capability":case"ReceivePort":case"SendPort":case"Stacktrace":case"JSRegExp":case"WeakProperty":case"MirrorReference":case"UserTag":case"Type":case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"Mint":case"Bigint":case"String":z=W.r3("instance-view",null)
-J.Qy(z,a.Ll)
-return z
-case"IO":z=W.r3("io-view",null)
-J.mU(z,a.Ll)
-return z
-case"HttpServerList":z=W.r3("io-http-server-list-view",null)
-J.A4(z,a.Ll)
-return z
-case"HttpServer":z=W.r3("io-http-server-view",null)
-J.fb(z,a.Ll)
-return z
-case"HttpServerConnection":z=W.r3("io-http-server-connection-view",null)
-J.i0(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
-case"ServiceException":z=W.r3("service-exception-view",null)
-J.BC(z,a.Ll)
-return z
-case"Script":z=W.r3("script-view",null)
-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.tQ(z,a.Ll)
-return z
-default:z=W.r3("json-view",null)
-J.wD(z,a.Ll)
-return z}},
-rm:[function(a,b){var z,y,x
-this.pj(a)
-z=a.Ll
-if(z==null){N.QM("").To("Viewing null object.")
-return}y=z.gzS()
-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,13,57],
-$isTi:true,
-static:{HP:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ns.ZL(a)
-C.Ns.XI(a)
-return a}}},
-V46:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
-"^":"",
-xI:{
-"^":"pv;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gnv:function(a){return a.tY},
-snv:function(a,b){a.tY=this.ct(a,C.xP,a.tY,b)},
-gjT:function(a){return a.Pe},
-sjT:function(a,b){a.Pe=this.ct(a,C.uu,a.Pe,b)},
-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,20,57],
-gO3:function(a){var z=a.tY
-if(z==null)return"NULL REF"
-z=J.Ds(z)
-$.W5.toString
-return"#"+H.d(z)},
-gJp:function(a){var z=a.tY
-if(z==null)return"NULL REF"
-return z.gdN()},
-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))},
-static:{fd:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.HRc.ZL(a)
-C.HRc.XI(a)
-return a}}},
-pv:{
-"^":"uL+Pi;",
-$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
-"^":"",
-CY:{
-"^":"KAf;kF,IK,bP,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-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,102,1,201,95],
-static:{Sm:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.zb.ZL(a)
-C.zb.XI(a)
-return a}}},
-KAf:{
-"^":"xc+Pi;",
-$isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
-"^":"",
-Wq:{
-"^":"a;c1,IW,Mg,nN,ER,Ja,WI,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.IW?"properties ":"")
-z.KF(this.Ja?"methods ":"")
-z.KF(this.Mg?"inherited ":"_")
-z.KF(this.ER?"no finals ":"")
-z.KF("annotations: "+H.d(this.WI))
-z.KF(this.tu!=null?"with matcher":"")
-z.KF(")")
-return z.vM}},
-ES:{
-"^":"a;oc>,fY>,V5>,t5>,Fo,Dv<",
-gZI:function(){return this.fY===C.nU},
-gUd:function(){return this.fY===C.BM},
-gUA:function(){return this.fY===C.WH},
-giO:function(a){var z=this.oc
-return z.giO(z)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isES&&this.oc.n(0,b.oc)&&this.fY===b.fY&&this.V5===b.V5&&this.t5.n(0,b.t5)&&this.Fo===b.Fo&&X.W4(this.Dv,b.Dv,!1)},
-bu:function(a){var z=P.p9("")
-z.KF("(declaration ")
-z.KF(this.oc)
-z.KF(this.fY===C.BM?" (property) ":" (method) ")
-z.KF(this.V5?"final ":"")
-z.KF(this.Fo?"static ":"")
-z.KF(this.Dv)
-z.KF(")")
-return z.vM},
-$isES:true},
-iYn:{
-"^":"a;fY>"}}],["smoke.src.common","package:smoke/src/common.dart",,X,{
-"^":"",
-Na:function(a,b,c){var z,y
-z=a.length
-if(z<b){y=Array(b)
-y.fixed$length=init
-H.qG(y,0,z,a,0)
-return y}if(z>c){z=Array(c)
-z.fixed$length=init
-H.qG(z,0,c,a,0)
-return z}return a},
-ZO:function(a,b){var z,y,x,w,v,u
-z=new H.a7(a,a.length,0,null)
-z.$builtinTypeInfo=[H.Kp(a,0)]
-for(;z.G();){y=z.lo
-b.length
-x=new H.a7(b,1,0,null)
-x.$builtinTypeInfo=[H.Kp(b,0)]
-w=J.x(y)
-for(;x.G();){v=x.lo
-if(w.n(y,v))return!0
-if(!!J.x(v).$isuq){u=w.gbx(y)
-u=$.mX().dM(u,v)}else u=!1
-if(u)return!0}}return!1},
-OS:function(a){var z,y
-z=H.G3()
-y=H.KT(z).BD(a)
-if(y)return 0
-y=H.KT(z,[z]).BD(a)
-if(y)return 1
-y=H.KT(z,[z,z]).BD(a)
-if(y)return 2
-z=H.KT(z,[z,z,z]).BD(a)
-if(z)return 3
-return 4},
-RI:function(a){var z,y
-z=H.G3()
-y=H.KT(z,[z,z,z]).BD(a)
-if(y)return 3
-y=H.KT(z,[z,z]).BD(a)
-if(y)return 2
-y=H.KT(z,[z]).BD(a)
-if(y)return 1
-z=H.KT(z).BD(a)
-if(z)return 0
-return-1},
-W4:function(a,b,c){var z,y,x,w,v
-z=a.length
-y=b.length
-if(z!==y)return!1
-if(c){x=P.Ls(null,null,null,null)
-x.FV(0,b)
-for(w=0;w<a.length;++w)if(!x.tg(0,a[w]))return!1}else for(w=0;w<z;++w){v=a[w]
-if(w>=y)return H.e(b,w)
-if(v!==b[w])return!1}return!0}}],["smoke.src.implementation","package:smoke/src/implementation.dart",,D,{
-"^":"",
-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;E4e,AH,lk,XO,Yp,af<,yQ"},
-fH:{
-"^":"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.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.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.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.RI(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)).$isJS){if(y!=null)P.FL(y)
-throw t}else throw t}}},
-bY:{
-"^":"a;TB,WF,wa",
-dM:function(a,b){var z,y,x
-if(a.n(0,b)||b.n(0,C.FQ))return!0
-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.wa)return!1
-throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+x.bu(y)+")"))}}return!1},
-UK:function(a,b){var z=this.F1(a,b)
-return z!=null&&z.fY===C.WH&&!z.Fo},
-n6:function(a,b){var z,y
-z=this.WF.t(0,a)
-if(z==null){if(!this.wa)return!1
-throw H.b(O.lA("declarations for "+H.d(a)))}y=z.t(0,b)
-return y!=null&&y.fY===C.WH&&y.Fo},
-CV:function(a,b){var z=this.F1(a,b)
-if(z==null){if(!this.wa)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.TB.t(0,b)
-if(y==null){if(this.wa)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.nN))z=this.Me(0,y,c)}x=this.WF.t(0,b)
-if(x==null){if(!this.wa)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.gZI())continue
-if(!c.IW&&v.gUd())continue
-if(c.ER&&J.Z6(v)===!0)continue
-if(!c.Ja&&v.gUA())continue
-if(c.tu!=null&&c.WO(0,J.O6(v))!==!0)continue
-u=c.WI
-if(u!=null&&!X.ZO(v.gDv(),u))continue
-z.push(v)}return z},
-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.wa)return
-throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
-ut:{
-"^":"a;ep,Nz",
-Ut:function(a){this.ep.aN(0,new O.m8(this))},
-static:{ty:function(a){var z=new O.ut(a.af,P.Fl(null,null))
-z.Ut(a)
-return z}}},
-m8:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.Nz.u(0,b,a)},
-$isEH:true},
-tk:{
-"^":"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:{
-"^":"V47;xP,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.dX.ZL(a)
-C.dX.XI(a)
-return a}}},
-V47:{
-"^":"uL+Pi;",
-$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
-"^":"",
-uw:{
-"^":"V48;ju,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.ju).Qy(b)},"$1","gvC",2,0,20,90],
-static:{HI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wB.ZL(a)
-C.wB.XI(a)
-return a}}},
-V48:{
-"^":"uL+Pi;",
-$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
-"^":"",
-AD:function(a,b,c,d){var z,y
-if(c){z=null!=d&&!1!==d
-y=J.RE(a)
-if(z)y.gQg(a).MW.setAttribute(b,"")
-else y.gQg(a).Rz(0,b)}else{z=J.Vs(a)
-y=d==null?"":H.d(d)
-z.MW.setAttribute(b,y)}},
-y9:function(a){var z
-for(;z=J.TmB(a),z!=null;a=z);return M.wp(a)?a:null},
-wp:function(a){var z=J.x(a)
-return!!z.$isQF||!!z.$isI0||!!z.$ishy},
-Lj:function(a,b){var z,y,x,w,v,u
-z=M.pN(a,b)
-if(z==null)z=new M.PW([],null,null)
-for(y=J.RE(a),x=y.gPZ(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.Lj(x,b)
-if(u==null)continue
-if(w==null){w=Array(y.gyT(a).NL.childNodes.length)
-w.fixed$length=init}if(v>=w.length)return H.e(w,v)
-w[v]=u}z.ks=w
-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)
-if(d.ghK()){M.Ky(z).bt(a)
-if(f!=null)J.Co(M.Ky(z),f)}M.mV(z,d,e,g)
-return z},
-tA:function(a){var z
-for(;z=J.TmB(a),z!=null;a=z);return a},
-cS:function(a,b){var z,y,x,w,v,u
-if(b==null||b==="")return
-z="#"+H.d(b)
-for(;!0;){a=M.tA(a)
-y=$.It()
-y.toString
-x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.J4())
-y=w==null
-if(!y&&w.gO5()!=null)v=J.Eh(w.gO5(),z)
-else{u=J.x(a)
-v=!!u.$isQF||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
-if(y)return
-a=w.gCi()
-if(a==null)return}},
-fX:function(a,b,c){if(c==null)return
-return new M.aR(a,b,c)},
-pN:function(a,b){var z,y
-z=J.x(a)
-if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$ismw){y=S.iw(a.textContent,M.fX("text",a,b))
-if(y!=null)return new M.PW(["text",y],null,null)}return},
-rJ:function(a,b,c){var z=a.getAttribute(b)
-if(z==="")z="{{}}"
-return S.iw(z,M.fX(b,a,c))},
-F5:function(a,b){var z,y,x,w,v,u
-z={}
-z.a=null
-y=M.CF(a)
-new W.E9(a).aN(0,new M.Uk(z,a,b,y))
-if(y){x=z.a
-if(x==null){w=[]
-z.a=w
-z=w}else z=x
-v=new M.qf(null,null,null,z,null,null)
-z=M.rJ(a,"if",b)
-v.qd=z
-x=M.rJ(a,"bind",b)
-v.fu=x
-u=M.rJ(a,"repeat",b)
-v.cw=u
-if(z!=null&&x==null&&u==null)v.fu=S.iw("{{}}",M.fX("bind",a,b))
-return v}z=z.a
-return z==null?null:new M.PW(z,null,null)},
-KH:function(a,b,c,d){var z,y,x,w,v,u,t
-if(b.gqz()){z=b.HH(0)
-y=z!=null?z.$3(d,c,!0):b.Pn(0).Tl(d)
-return b.gaW()?y:b.qm(y)}x=J.U6(b)
-w=x.gB(b)
-if(typeof w!=="number")return H.s(w)
-v=Array(w)
-v.fixed$length=init
-w=v.length
-u=0
-while(!0){t=x.gB(b)
-if(typeof t!=="number")return H.s(t)
-if(!(u<t))break
-z=b.HH(u)
-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)},
-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)
-else{x=b.Pn(0)
-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.Qw(y,b.gEO(),null,null,null)}x=$.ps
-$.ps=x+1
-y=new L.ww(null,[],x,null,null,null)
-y.Wf=[]
-x=J.U6(b)
-v=0
-while(!0){w=x.gB(b)
-if(typeof w!=="number")return H.s(w)
-if(!(v<w))break
-c$0:{u=b.AX(v)
-z=b.HH(v)
-if(z!=null){t=z.$3(d,c,u)
-if(u===!0)y.ti(t)
-else{if(y.GX!=null||y.cb==null)H.vh(P.w("Cannot add observers once started."))
-J.mu(t,y.gjM())
-w=y.cb
-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.Qw(y,b.gEO(),null,null,null)},
-mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p
-z=J.RE(b)
-y=z.gCd(b)
-x=!!J.x(a).$isvy?a:M.Ky(a)
-for(w=J.U6(y),v=J.RE(x),u=0;u<w.gB(y);u+=2){t=w.t(y,u)
-s=w.t(y,u+1)
-r=v.nR(x,t,M.GZ(t,s,a,c),s.geq())
-if(r!=null&&!0)d.push(r)}v.Vz(x)
-if(!z.$isqf)return
-q=M.Ky(a)
-q.sQ2(c)
-p=q.A5(b)
-if(p!=null&&!0)d.push(p)},
-Ky:function(a){var z,y,x,w
-z=$.cm()
-z.toString
-y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.J4())
-if(x!=null)return x
-w=J.x(a)
-if(!!w.$isMi)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.bH(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,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$ismw?new M.XT(a,null,null):new M.vy(a,null,null)
-z.u(0,a,x)
-return x},
-CF: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
-return z},
-vE:{
-"^":"a;cJ",
-US:function(a,b,c){return},
-static:{"^":"ac"}},
-V2:{
-"^":"vy;rF,Cd,Vw",
-nR:function(a,b,c,d){var z,y,x,w,v,u
-z={}
-z.a=b
-y=this.grF()
-x=J.x(y)
-w=!!x.$isQlt&&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.VT(v,"?")
-if(u){x.gQg(y).Rz(0,z.a)
-x=z.a
-w=J.U6(x)
-z.a=w.Nj(x,0,J.bI(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
-x=new M.IoZ(z,this,u)
-x.$1(J.mu(c,x))}z=z.a
-return $.rK?this.Un(z,c):c},
-nD:[function(a){var z,y,x,w,v,u,t,s
-z=this.grF()
-y=J.RE(z)
-x=y.gBy(z)
-w=J.x(x)
-if(!!w.$isbs){v=J.C5(M.Ky(x))
-if(v!=null){u=J.UQ(v,"value")
-if(!!J.x(u).$isb2){t=x.value
-s=u}else{t=null
-s=null}}else{t=null
-s=null}}else{t=null
-s=null}y.sP(z,a==null?"":H.d(a))
-if(s!=null&&!J.xC(w.gP(x),t)){y=w.gP(x)
-J.ta(s.gvt(),y)}},"$1","ge2",2,0,20,58]},
-IoZ:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,65,"call"],
-$isEH:true},
-b2:{
-"^":"Ap;rF<,E3,vt<,jS",
-zJ:[function(a){return M.pw(this.rF,a,this.jS)},"$1","ghZ",2,0,20,58],
-O2A:[function(a){var z,y,x,w,v
-switch(this.jS){case"value":z=J.Vm(this.rF)
-J.ta(this.vt,z)
-break
-case"checked":z=this.rF
-y=J.RE(z)
-x=y.gd4(z)
-J.ta(this.vt,x)
-if(!!y.$isMi&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
-v=J.UQ(J.C5(!!J.x(w).$isvy?w:M.Ky(w)),"checked")
-if(v!=null)J.ta(v,!1)}break
-case"selectedIndex":z=J.Lr(this.rF)
-J.ta(this.vt,z)
-break}O.N0()},"$1","gCL",2,0,20,1],
-TR:function(a,b){return J.mu(this.vt,b)},
-gP:function(a){return J.Vm(this.vt)},
-sP:function(a,b){J.ta(this.vt,b)
-return b},
-S6:function(a){var z=this.E3
-if(z!=null){z.ed()
-this.E3=null}z=this.vt
-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)
-return
-case"selectedIndex":J.dk(a,M.h5(b))
-return
-case"value":J.ta(a,b==null?"":H.d(b))
-return}},IP:function(a){var z=J.x(a)
-if(!!z.$isQlt)return H.VM(new W.eu(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.gEr(a)
-case"range":if(J.x5(window.navigator.userAgent,new H.VR("Trident|MSIE",H.ol("Trident|MSIE",!1,!0,!1),null,null)))return z.gEr(a)
-break}return z.gLm(a)},pt:function(a){var z,y,x
-z=J.RE(a)
-if(z.gMB(a)!=null){z=z.gMB(a)
-z.toString
-z=new W.wi(z)
-return z.ad(z,new M.qx(a))}else{y=M.y9(a)
-if(y==null)return C.dn
-x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ad(x,new M.y4(a))}},h5:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
-return typeof a==="number"&&Math.floor(a)===a?a:0}}},
-Ufa:{
-"^":"Tp:69;",
-$0:function(){var z,y,x,w,v
-z=document.createElement("div",null).appendChild(W.ED(null))
-y=J.RE(z)
-y.st5(z,"checkbox")
-x=[]
-w=y.gVl(z)
-H.VM(new W.Ov(0,w.DK,w.Ph,W.aF(new M.pp(x)),w.Sg),[H.Kp(w,0)]).Zz()
-y=y.gEr(z)
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(new M.ik(x)),y.Sg),[H.Kp(y,0)]).Zz()
-y=window
-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)},
-$isEH:true},
-pp:{
-"^":"Tp:13;a",
-$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-ik:{
-"^":"Tp:13;b",
-$1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-qx:{
-"^":"Tp:13;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.O6(z)
-z=y==null?z==null:y===z}else z=!1
-else z=!1
-else z=!1
-return z},
-$isEH:true},
-y4:{
-"^":"Tp:13;b",
-$1:function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},
-$isEH:true},
-LG:{
-"^":"Tp:13;",
-$1:function(a){return 0},
-$isEH:true},
-ee:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z,y,x
-z=J.x(b)
-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}z=this.rF
-y=new M.b2(z,null,c,b)
-y.E3=M.IP(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return this.Un(b,y)}},
-PW:{
-"^":"a;Cd>,ks>,jb>",
-ghK:function(){return!1},
-JW: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]}},
-qf:{
-"^":"PW;qd,fu,cw,Cd,ks,jb",
-ghK:function(){return!0},
-$isqf:true},
-vy:{
-"^":"a;rF<,Cd*,Vw?",
-nR:function(a,b,c,d){var z
-window
-z="Unhandled binding to Node: "+H.a5(this)+" "+H.d(b)+" "+H.d(c)+" "+d
-if(typeof console!="undefined")console.error(z)
-return},
-Vz:function(a){},
-gCn:function(a){var z=this.Vw
-if(z!=null);else if(J.Lp(this.grF())!=null){z=J.Lp(this.grF())
-z=J.fe(!!J.x(z).$isvy?z:M.Ky(z))}else z=null
-return z},
-Un:function(a,b){var z,y
-z=this.Cd
-if(z==null){z=P.Fl(null,null)
-this.Cd=z}y=z.t(0,a)
-if(y!=null)J.x0(y)
-this.Cd.u(0,a,b)
-return b},
-$isvy:true},
-DH:{
-"^":"a;k8>,EA,Po"},
-ug:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z,y,x
-if(J.xC(b,"selectedindex"))b="selectedIndex"
-z=J.x(b)
-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}z=this.rF
-y=new M.b2(z,null,c,b)
-y.E3=M.IP(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return this.Un(b,y)}},
-DT:{
-"^":"V2;Q2?,nF,os<,xU,q4?,IO?,M5?,le,VZ,q8,rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z
-if(!J.xC(b,"ref"))return M.V2.prototype.nR.call(this,this,b,c,d)
-z=d?c:J.mu(c,new M.pi(this))
-J.Vs(this.rF).MW.setAttribute("ref",z)
-this.aX()
-if(d)return
-return this.Un("ref",c)},
-A5:function(a){var z=this.os
-if(z!=null)z.NC()
-if(a.qd==null&&a.fu==null&&a.cw==null){z=this.os
-if(z!=null){z.S6(0)
-this.os=null}return}z=this.os
-if(z==null){z=new M.aY(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
-this.os=z}z.dE(a,this.Q2)
-J.ZW($.pT(),this.rF,["ref"],!0)
-return this.os},
-ZK:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-if(c==null)c=this.nF
-z=this.q8
-if(z==null){z=this.gNK()
-z=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
-this.q8=z}y=J.RE(z)
-if(y.gPZ(z)==null)return $.zl()
-x=c==null?$.HT():c
-w=x.cJ
-if(w==null){w=H.VM(new P.qo(null),[null])
-x.cJ=w}v=w.t(0,z)
-if(v==null){v=M.Lj(z,x)
-x.cJ.u(0,z,v)}w=this.le
-if(w==null){u=J.Do(this.rF)
-w=$.Lu()
-t=w.t(0,u)
-if(t==null){t=u.implementation.createHTMLDocument("")
-$.AA().u(0,t,!0)
-M.lo(t)
-w.u(0,u,t)}this.le=t
-w=t}s=J.mx(w)
-w=[]
-r=new M.NK(w,null,null,null)
-q=$.It()
-r.Ci=this.rF
-r.O5=z
-q.u(0,s,r)
-p=new M.DH(b,null,null)
-M.Ky(s).sVw(p)
-for(o=y.gPZ(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
-l=z?v.JW(n):null
-k=M.X7(o,s,this.le,l,b,c,w,null)
-M.Ky(k).sVw(p)
-if(m)r.Qo=k}p.EA=s.firstChild
-p.Po=s.lastChild
-r.O5=null
-r.Ci=null
-return s},
-gk8:function(a){return this.Q2},
-gzH:function(a){return this.nF},
-szH:function(a,b){var z
-if(this.nF!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
-this.nF=b
-this.VZ=null
-z=this.os
-if(z!=null){z.Wv=!1
-z.LH=null
-z.TC=null}},
-aX:function(){var z,y
-if(this.os!=null){z=this.q8
-y=this.gNK()
-y=J.NQ(!!J.x(y).$isvy?y:M.Ky(y))
-y=z==null?y==null:z===y
-z=y}else z=!0
-if(z)return
-this.q8=null
-this.os.Io(null)
-this.os.vr(null)},
-V1:function(a){var z,y
-this.Q2=null
-this.nF=null
-z=this.Cd
-if(z!=null){y=z.Rz(0,"ref")
-if(y!=null)J.x0(y)}this.q8=null
-z=this.os
-if(z==null)return
-z.Io(null)
-this.os.S6(0)
-this.os=null},
-gNK:function(){var z,y
-this.GC()
-z=M.cS(this.rF,J.Vs(this.rF).MW.getAttribute("ref"))
-if(z==null){z=this.q4
-if(z==null)return this.rF}y=M.Ky(z).gNK()
-return y!=null?y:z},
-gjb:function(a){var z
-this.GC()
-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()
-M.HS()
-this.M5=!0
-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.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
-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
-w=J.RE(x)
-t=w.gM0(x).createElement("template",null)
-w.gBy(x).insertBefore(t,x)
-t.toString
-new W.E9(t).FV(0,w.gQg(x))
-w.gQg(x).V1(0)
-w.wg(x)
-v=!!J.x(t).$isvy?t:M.Ky(t)
-v.sM5(!0)
-z=!!J.x(v.grF()).$isOH}else{v=this
-z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sIO(J.mx(M.TA(v.grF())))
-if(a!=null)v.sq4(a)
-else if(y)M.O1(v,this.rF,u)
-else M.GM(J.NQ(v))
-return!0},
-GC:function(){return this.bt(null)},
-$isDT:true,
-static:{"^":"mn,EW,YO,vU,xV,kY",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},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)
-for(x=C.Nm.br(z.gQg(a).gvc()),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=x.lo
-switch(w){case"template":v=z.gQg(a).MW
-v.getAttribute(w)
-v.removeAttribute(w)
-break
-case"repeat":case"bind":case"ref":y.toString
-v=z.gQg(a).MW
-u=v.getAttribute(w)
-v.removeAttribute(w)
-y.setAttribute(w,u)
-break}}return y},O1:function(a,b,c){var z,y,x,w
-z=J.NQ(a)
-if(c){J.TQ(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,$.Ze())
-if(M.CF(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($.Ze())+" { display: none; }")
-document.head.appendChild(z)},HS:function(){var z,y
-if($.xV===!0)return
-$.xV=!0
-z=document.createElement("template",null)
-if(!!J.x(z).$isOH){y=z.content.ownerDocument
-if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
-if(J.m5(y).querySelector("base")==null)M.lo(y)}},lo:function(a){var z=a.createElement("base",null)
-J.O5(z,document.baseURI)
-J.m5(a).appendChild(z)}}},
-pi:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-J.Vs(z.rF).MW.setAttribute("ref",a)
-z.aX()},"$1",null,2,0,null,202,"call"],
-$isEH:true},
-CE:{
-"^":"Tp:20;",
-$1:function(a){if(!M.Ky(a).bt(null))M.GM(J.NQ(!!J.x(a).$isvy?a:M.Ky(a)))},
-$isEH:true},
-MdQ:{
-"^":"Tp:13;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-DOe:{
-"^":"Tp:77;",
-$2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.Ky(J.l2(z.gl())).aX()},"$2",null,4,0,null,161,14,"call"],
-$isEH:true},
-lPa:{
-"^":"Tp:69;",
-$0:function(){var z=document.createDocumentFragment()
-$.It().u(0,z,new M.NK([],null,null,null))
-return z},
-$isEH:true},
-NK:{
-"^":"a;u2<,Qo<,Ci<,O5<"},
-aR:{
-"^":"Tp:13;a,b,c",
-$1:function(a){return this.c.US(a,this.a,this.b)},
-$isEH:true},
-Uk:{
-"^":"Tp:77;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")
-else z=!1
-if(z)return
-y=S.iw(b,M.fX(a,this.b,this.c))
-if(y!=null){z=this.a
-x=z.a
-if(x==null){w=[]
-z.a=w
-z=w}else z=x
-z.push(a)
-z.push(y)}},
-$isEH:true},
-aY:{
-"^":"Ap;bE,Rj,vy,qg,ky,vL,wC,D2,cM,qe,ur,VC,Wv,LH,TC",
-RV:function(a){return this.LH.$1(a)},
-TR:function(a,b){return H.vh(P.w("binding already opened"))},
-gP:function(a){return this.wC},
-NC:function(){var z,y
-z=this.vL
-y=J.x(z)
-if(!!y.$isAp){y.S6(z)
-this.vL=null}z=this.wC
-y=J.x(z)
-if(!!y.$isAp){y.S6(z)
-this.wC=null}},
-dE:function(a,b){var z,y,x
-this.NC()
-z=this.bE.rF
-y=a.qd
-x=y!=null
-this.D2=x
-this.cM=a.cw!=null
-if(x){this.qe=y.eq
-y=M.GZ("if",y,z,b)
-this.vL=y
-if(this.qe===!0){if(!(null!=y&&!1!==y)){this.vr(null)
-return}}else H.Go(y,"$isAp").TR(0,this.gNt())}if(this.cM===!0){y=a.cw
-this.ur=y.eq
-y=M.GZ("repeat",y,z,b)
-this.wC=y}else{y=a.fu
-this.ur=y.eq
-y=M.GZ("bind",y,z,b)
-this.wC=y}if(this.ur!==!0)J.mu(y,this.gNt())
-this.vr(null)},
-vr:[function(a){var z,y
-if(this.D2===!0){z=this.vL
-if(this.qe!==!0){H.Go(z,"$isAp")
-z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
-return}}y=this.wC
-if(this.ur!==!0){H.Go(y,"$isAp")
-y=y.gP(y)}this.Io(this.cM!==!0?[y]:y)},"$1","gNt",2,0,20,14],
-Io:function(a){var z,y
-z=J.x(a)
-if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
-z=this.vy
-if(a===z)return
-this.Ke()
-this.qg=a
-if(!!J.x(a).$iswn&&this.cM===!0&&this.ur!==!0){if(a.gb3()!=null)a.sb3([])
-this.VC=a.gQV().yI(this.gU0())}y=this.qg
-y=y!=null?y:[]
-this.Vi(G.jj(y,0,J.q8(y),z,0,z.length))},
-xS:function(a){var z,y,x,w
-if(J.xC(a,-1))return this.bE.rF
-z=$.It()
-y=this.Rj
-if(a>>>0!==a||a>=y.length)return H.e(y,a)
-x=z.t(0,y[a]).gQo()
-if(x==null)return this.xS(a-1)
-if(!M.CF(x)||x===this.bE.rF)return x
-w=M.Ky(x).gos()
-if(w==null)return x
-return w.xS(w.Rj.length-1)},
-ne:function(a){var z,y,x,w,v,u,t
-z=this.xS(J.bI(a,1))
-y=this.xS(a)
-J.TmB(this.bE.rF)
-x=C.Nm.KI(this.Rj,a)
-for(w=J.RE(x),v=J.RE(z);!J.xC(y,z);){u=v.guD(z)
-if(u==null?y==null:u===y)y=z
-t=u.parentNode
-if(t!=null)t.removeChild(u)
-w.mx(x,u)}return x},
-Vi:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
-if(this.ky||J.FN(a)===!0)return
-u=this.bE
-t=u.rF
-if(J.TmB(t)==null){this.S6(0)
-return}s=this.vy
-Q.Y5(s,this.qg,a)
-z=u.nF
-if(!this.Wv){this.Wv=!0
-r=J.Xp(!!J.x(u.rF).$isDT?u.rF:u)
-if(r!=null){this.LH=r.Mn.CE(t)
-this.TC=null}}q=P.YM(P.N3R(),null,null,null,null)
-for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
-for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.lo
-i=this.ne(J.ew(k.gvH(m),n))
-if(!J.xC(i,$.zl()))q.u(0,j,i)}l=m.gNg()
-if(typeof l!=="number")return H.s(l)
-n-=l}for(p=p.gA(a);p.G();){m=p.gl()
-for(o=J.RE(m),h=o.gvH(m);J.u6(h,J.ew(o.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
-y=s[h]
-x=q.Rz(0,y)
-if(x==null)try{if(this.LH!=null)y=this.RV(y)
-if(y==null)x=$.zl()
-else x=u.ZK(0,y,z)}catch(g){l=H.Ru(g)
-w=l
-v=new H.XO(g,null)
-l=new P.Gc(0,$.X3,null,null,null,null,null,null)
-l.$builtinTypeInfo=[null]
-new P.Zf(l).$builtinTypeInfo=[null]
-k=w
-if(k==null)H.vh(P.u("Error must not be null"))
-if(l.Gv!==0)H.vh(P.w("Future already completed"))
-l.CG(k,v)
-x=$.zl()}l=x
-f=this.xS(h-1)
-e=J.TmB(u.rF)
-C.Nm.xe(this.Rj,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Kp(u,0),H.Kp(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,203,204],
-Ep:[function(a){var z,y,x
-z=$.It()
-z.toString
-y=H.of(a,"expando$values")
-x=(y==null?null:H.of(y,z.J4())).gu2()
-z=new H.a7(x,x.length,0,null)
-z.$builtinTypeInfo=[H.Kp(x,0)]
-for(;z.G();)J.x0(z.lo)},"$1","gV6",2,0,205],
-Ke:function(){var z=this.VC
-if(z==null)return
-z.ed()
-this.VC=null},
-S6:function(a){var z
-if(this.ky)return
-this.Ke()
-z=this.Rj
-H.bQ(z,this.gV6())
-C.Nm.sB(z,0)
-this.NC()
-this.bE.os=null
-this.ky=!0}},
-XT:{
-"^":"vy;rF,Cd,Vw",
-nR:function(a,b,c,d){var z
-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}z=this.gmt()
-z.$1(J.mu(c,z))
-return $.rK?this.Un(b,c):c},
-ux:[function(a){var z=a==null?"":H.d(a)
-J.t3(this.rF,z)},"$1","gmt",2,0,13,21]},
-bH:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z,y,x
-if(!J.xC(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}z=this.rF
-y=new M.b2(z,null,c,b)
-y.E3=M.IP(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return $.rK?this.Un(b,y):y}}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
-"^":"",
-jb:{
-"^":"a;iB,eq<,O0",
-gqz:function(){return this.iB.length===5},
-gaW:function(){var z,y
-z=this.iB
-y=z.length
-if(y===5){if(0>=y)return H.e(z,0)
-if(J.xC(z[0],"")){if(4>=z.length)return H.e(z,4)
-z=J.xC(z[4],"")}else z=!1}else z=!1
-return z},
-gEO:function(){return this.O0},
-qm:function(a){return this.gEO().$1(a)},
-gB:function(a){return C.jn.cU(this.iB.length,4)},
-AX:function(a){var z,y
-z=this.iB
-y=a*4+1
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-Pn:function(a){var z,y
-z=this.iB
-y=a*4+2
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-HH:function(a){var z,y
-z=this.iB
-y=a*4+3
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-ln:[function(a){var z,y,x,w
-if(a==null)a=""
-z=this.iB
-if(0>=z.length)return H.e(z,0)
-y=H.d(z[0])+H.d(a)
-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","geb",2,0,206,21],
-Xb:[function(a){var z,y,x,w,v,u,t,s
-z=this.iB
-if(0>=z.length)return H.e(z,0)
-y=P.p9(z[0])
-x=C.jn.cU(z.length,4)
-for(w=J.U6(a),v=0;v<x;){u=w.t(a,v)
-if(u!=null)y.vM+=typeof u==="string"?u:H.d(u);++v
-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","gqt",2,0,207,208],
-l3:function(a,b){this.O0=this.iB.length===5?this.geb():this.gqt()},
-static:{"^":"rz5,xN8,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)
-s=C.xB.XU(a,"[[",v)
-if(s>=0)r=t<0||s<t
-else r=!1
-if(r){t=s
-q=!0
-p="]]"}else{q=!1
-p="}}"}o=t>=0?C.xB.XU(a,p,t+2):-1
-if(o<0){if(w==null)return
-w.push(C.xB.yn(a,v))
-break}if(w==null)w=[]
-w.push(C.xB.Nj(a,v,t))
-n=C.xB.bS(C.xB.Nj(a,t+2,o))
-w.push(q)
-u=u&&q
-m=y?null:b.$1(n)
-if(m==null)w.push(L.hk(n))
-else w.push(null)
-w.push(m)
-v=o+2}if(v===z)w.push("")
-y=new S.jb(w,u,null)
-y.l3(w,u)
-return y}}}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
-"^":"",
-I5:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{pn:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.u2.ZL(a)
-C.u2.XI(a)
-return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
-"^":"",
-el:{
-"^":"V49;uB,lc,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.uB).Qy(b)},"$1","gvC",2,0,20,90],
-static:{oH:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.dm.ZL(a)
-C.dm.XI(a)
-return a}}},
-V49:{
-"^":"uL+Pi;",
-$isd3:true}}],])
-I.$finishClasses($$,$,null)
-$$=null
-P.KN.$isKN=true
-P.KN.$isRz=true
-P.KN.$asRz=[P.FK]
-P.KN.$isa=true
-P.CP.$isCP=true
-P.CP.$isRz=true
-P.CP.$asRz=[P.FK]
-P.CP.$isa=true
-W.KV.$isKV=true
-W.KV.$isa=true
-W.vKL.$isa=true
-W.QI.$isa=true
-P.qU.$isqU=true
-P.qU.$isRz=true
-P.qU.$asRz=[P.qU]
-P.qU.$isa=true
-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.$isRz=true
-P.a6.$asRz=[P.a6]
-P.a6.$isa=true
-W.h4.$ish4=true
-W.h4.$isKV=true
-W.h4.$isa=true
-P.WO.$isWO=true
-P.WO.$isQV=true
-P.WO.$isa=true
-P.oz.$isa=true
-P.a.$isa=true
-P.ns.$isa=true
-K.Aep.$isAep=true
-K.Aep.$isa=true
-U.mc.$ishw=true
-U.mc.$isa=true
-U.cJ.$ishw=true
-U.cJ.$isa=true
-U.uku.$ishw=true
-U.uku.$isa=true
-U.fp.$isfp=true
-U.fp.$ishw=true
-U.fp.$isa=true
-U.ae.$ishw=true
-U.ae.$isa=true
-U.Qb.$ishw=true
-U.Qb.$isa=true
-U.c0.$ishw=true
-U.c0.$isa=true
-U.no.$ishw=true
-U.no.$isa=true
-U.Nb.$ishw=true
-U.Nb.$isa=true
-U.zX.$iszX=true
-U.zX.$ishw=true
-U.zX.$isa=true
-U.x9.$ishw=true
-U.x9.$isa=true
-U.EO.$isEO=true
-U.EO.$ishw=true
-U.EO.$isa=true
-P.GD.$isGD=true
-P.GD.$isa=true
-P.uq.$isuq=true
-P.uq.$isa=true
-N.Rw.$isa=true
-T.yj.$isyj=true
-T.yj.$isa=true
-W.tV.$ish4=true
-W.tV.$isKV=true
-W.tV.$isa=true
-G.DA.$isDA=true
-G.DA.$isa=true
-G.Y2.$isY2=true
-G.Y2.$isa=true
-F.d3.$isa=true
-A.XP.$isa=true
-W.AjY.$isAjY=true
-W.AjY.$isea=true
-W.AjY.$isa=true
-P.a2.$isa2=true
-P.a2.$isa=true
-G.uG.$isa=true
-P.oh.$isa=true
-D.af.$isaf=true
-D.af.$isa=true
-D.bv.$isaf=true
-D.bv.$isa=true
-W.f5.$isf5=true
-W.f5.$isea=true
-W.f5.$isa=true
-D.Fc.$isa=true
-D.ER.$isa=true
-D.dy.$isdy=true
-D.dy.$isaf=true
-D.dy.$isa=true
-D.vO.$isvO=true
-D.vO.$isaf=true
-D.vO.$isqC=true
-D.vO.$asqC=[null,null]
-D.vO.$isZ0=true
-D.vO.$asZ0=[null,null]
-D.vO.$isa=true
-D.DP.$isa=true
-D.uA.$isa=true
-D.U4.$isaf=true
-D.U4.$isa=true
-D.vx.$isvx=true
-D.vx.$isaf=true
-D.vx.$isa=true
-D.c2.$isa=true
-W.fJ.$isfJ=true
-W.fJ.$isa=true
-W.kf.$isea=true
-W.kf.$isa=true
-D.kx.$iskx=true
-D.kx.$isaf=true
-D.kx.$isa=true
-D.t9.$isa=true
-D.xb.$isa=true
-W.AW.$isea=true
-W.AW.$isa=true
-L.Tv.$isTv=true
-L.Tv.$isa=true
-K.GK.$isa=true
-N.HV.$isHV=true
-N.HV.$isa=true
-H.yo.$isa=true
-H.IY.$isa=true
-H.aX.$isa=true
-W.I0.$isAj=true
-W.I0.$isKV=true
-W.I0.$isa=true
-W.ea.$isea=true
-W.ea.$isa=true
-P.cb.$iscb=true
-P.cb.$isa=true
-P.Oy.$isOy=true
-P.Oy.$isa=true
-Y.qS.$isa=true
-U.hw.$ishw=true
-U.hw.$isa=true
-G.Ni.$isa=true
-P.AN.$isAN=true
-P.AN.$isa=true
-P.dl.$isdl=true
-P.dl.$isa=true
-P.mE.$ismE=true
-P.mE.$isa=true
-V.qC.$isqC=true
-V.qC.$isZ0=true
-V.qC.$isa=true
-P.KA.$isKA=true
-P.KA.$isNOT=true
-P.KA.$isOy=true
-P.KA.$isa=true
-P.LR.$isLR=true
-P.LR.$isKA=true
-P.LR.$isNOT=true
-P.LR.$isOy=true
-P.LR.$isa=true
-P.Rz.$isRz=true
-P.Rz.$isa=true
-P.Ob.$isOb=true
-P.Ob.$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.NOT.$isNOT=true
-P.NOT.$isa=true
-P.ti.$isti=true
-P.ti.$isa=true
-P.iP.$isiP=true
-P.iP.$isRz=true
-P.iP.$asRz=[null]
-P.iP.$isa=true
-A.Ap.$isAp=true
-A.Ap.$isa=true
-O.Hz.$isHz=true
-O.Hz.$isa=true
-D.N7.$isN7=true
-D.N7.$isaf=true
-D.N7.$isa=true
-D.EP.$isEP=true
-D.EP.$isaf=true
-D.EP.$isa=true
-A.ES.$isES=true
-A.ES.$isa=true
-A.Wq.$isWq=true
-A.Wq.$isa=true
-L.qK.$isqK=true
-L.qK.$isAp=true
-L.qK.$isa=true
-W.Aj.$isAj=true
-W.Aj.$isKV=true
-W.Aj.$isa=true
-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.kdQ.prototype
-return a}
-J.RE=function(a){if(a==null)return a
-if(typeof a!="object")return a
-if(a instanceof P.a)return 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.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
-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.kdQ.prototype
-return a}
-J.w1=function(a){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.m0(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
-return J.Yn.prototype}if(typeof a=="string")return J.O.prototype
-if(a==null)return J.CDU.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.m0(a)}
-J.A4=function(a,b){return J.RE(a).sjx(a,b)}
-J.A6=function(a){return J.RE(a).gG3(a)}
-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.AL=function(a){return J.RE(a).gW6(a)}
-J.Ac=function(a,b){return J.RE(a).siZ(a,b)}
-J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
-J.Aw=function(a){return J.RE(a).gb6(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.BZ=function(a){return J.RE(a).gnv(a)}
-J.Bj=function(a,b){return J.RE(a).Tk(a,b)}
-J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
-return J.Wx(a).E(a,b)}
-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.C5=function(a){return J.RE(a).gCd(a)}
-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.Co=function(a,b){return J.RE(a).szH(a,b)}
-J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
-J.DB=function(a){return J.RE(a).gn0(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)}
-J.Dd=function(a){return J.RE(a).gLe(a)}
-J.Dh=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
-J.Dn=function(a,b){return J.w1(a).zV(a,b)}
-J.Do=function(a){return J.RE(a).gM0(a)}
-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.EK=function(a,b){return J.RE(a).ps(a,b)}
-J.Ec=function(a){return J.RE(a).gMZ(a)}
-J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
-J.Ei=function(a){return J.RE(a).gI(a)}
-J.Er=function(a,b){return J.RE(a).sfY(a,b)}
-J.Ew=function(a){return J.RE(a).gkm(a)}
-J.F8=function(a){return J.RE(a).gjO(a)}
-J.FI=function(a,b,c,d){return J.RE(a).YJ(a,b,c,d)}
-J.FN=function(a){return J.U6(a).gl0(a)}
-J.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
-J.Fd=function(a){return J.RE(a).gi6(a)}
-J.G0=function(a,b,c){return J.U6(a).XU(a,b,c)}
-J.GH=function(a){return J.RE(a).gyW(a)}
-J.GL=function(a){return J.RE(a).gfN(a)}
-J.GW=function(a){return J.RE(a).gVY(a)}
-J.Gl=function(a){return J.RE(a).ghy(a)}
-J.H3=function(a,b){return J.RE(a).sZA(a,b)}
-J.H4=function(a,b){return J.RE(a).wR(a,b)}
-J.HB=function(a){return J.RE(a).gxT(a)}
-J.HF=function(a){return J.RE(a).gD7(a)}
-J.HO=function(a){return J.RE(a).gWw(a)}
-J.Hn=function(a,b){return J.RE(a).sxT(a,b)}
-J.I2=function(a){return J.RE(a).gwv(a)}
-J.IO=function(a){return J.RE(a).gRH(a)}
-J.IR=function(a){return J.RE(a).gYt(a)}
-J.IX=function(a,b){return J.RE(a).sEu(a,b)}
-J.Iz=function(a){return J.RE(a).gfY(a)}
-J.J0=function(a){return J.RE(a).gfq(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.JR=function(a){return J.RE(a).gcK(a)}
-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.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)}
-J.K2=function(a){return J.RE(a).gtN(a)}
-J.KD=function(a,b){return J.RE(a).j3(a,b)}
-J.Kd=function(a){return J.RE(a).gCF(a)}
-J.Kl=function(a){return J.RE(a).gBP(a)}
-J.Kn=function(a){return J.Wx(a).yu(a)}
-J.Kr=function(a){return J.RE(a).e6(a)}
-J.Kz=function(a,b){return J.RE(a).sni(a,b)}
-J.L7=function(a){return J.RE(a).gY9(a)}
-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.LH=function(a,b){return J.w1(a).GT(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.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.Lm=function(a){return J.x(a).gbx(a)}
-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.MO=function(a,b,c){return J.RE(a).ZK(a,b,c)}
-J.MQ=function(a){return J.w1(a).grZ(a)}
-J.MX=function(a,b){return J.RE(a).sPj(a,b)}
-J.Me=function(a,b){return J.w1(a).aN(a,b)}
-J.Mp=function(a){return J.w1(a).wg(a)}
-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,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.NV=function(a,b){return J.RE(a).RR(a,b)}
-J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
-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.No=function(a,b){return J.RE(a).sR(a,b)}
-J.Nq=function(a){return J.RE(a).gGc(a)}
-J.O2=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.O5=function(a,b){return J.RE(a).smH(a,b)}
-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.OT=function(a){return J.RE(a).gXE(a)}
-J.OY=function(a){return J.RE(a).gJD(a)}
-J.Ok=function(a){return J.RE(a).ghU(a)}
-J.P2=function(a,b){return J.RE(a).sU4(a,b)}
-J.P5=function(a){return J.RE(a).gHo(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.Pj=function(a,b,c,d){return J.RE(a).ea(a,b,c,d)}
-J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
-J.Pp=function(a,b){return J.rY(a).j(a,b)}
-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,b){return J.RE(a).sM3(a,b)}
-J.QP=function(a){return J.RE(a).gWq(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.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.R7=function(a,b){return J.U6(a).u8(a,b)}
-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.Rx=function(a,b){return J.RE(a).sEl(a,b)}
-J.Ry=function(a){return J.RE(a).gLW(a)}
-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.SO=function(a,b){return J.RE(a).sCF(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.So=function(a,b){return J.RE(a).X3(a,b)}
-J.Sz=function(a){return J.RE(a).gUx(a)}
-J.T5=function(a,b){return J.RE(a).stT(a,b)}
-J.TG=function(a){return J.RE(a).mC(a)}
-J.TQ=function(a,b){return J.RE(a).mx(a,b)}
-J.TY=function(a){return J.RE(a).gvp(a)}
-J.TmB=function(a){return J.RE(a).gBy(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.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)}
-J.UP=function(a){return J.RE(a).gnZ(a)}
-J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.Gp(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
-return J.U6(a).t(a,b)}
-J.UT=function(a){return J.RE(a).gDQ(a)}
-J.UU=function(a){return J.RE(a).gjT(a)}
-J.V1=function(a,b){return J.w1(a).Rz(a,b)}
-J.VA=function(a,b){return J.w1(a).Vr(a,b)}
-J.VL=function(a){return J.RE(a).gR2(a)}
-J.VT=function(a,b){return J.rY(a).Tc(a,b)}
-J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
-J.Vf=function(a){return J.RE(a).gVE(a)}
-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.Vs=function(a){return J.RE(a).gQg(a)}
-J.W2=function(a){return J.RE(a).gCf(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.Wp=function(a){return J.RE(a).gQU(a)}
-J.XF=function(a,b){return J.RE(a).siC(a,b)}
-J.XJ=function(a){return J.RE(a).gRY(a)}
-J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
-J.Xp=function(a){return J.RE(a).gzH(a)}
-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)}
-J.Z2=function(a){return J.RE(a).dQ(a)}
-J.Z6=function(a){return J.RE(a).gV5(a)}
-J.ZH=function(a){return J.RE(a).gk8(a)}
-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.ZW=function(a,b,c,d){return J.RE(a).MS(a,b,c,d)}
-J.ZZ=function(a,b){return J.rY(a).yn(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.avD=function(a,b,c,d,e){return J.RE(a).dF(a,b,c,d,e)}
-J.aw=function(a,b){return J.RE(a).sNN(a,b)}
-J.bI=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
-return J.Wx(a).W(a,b)}
-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.bu=function(a){return J.RE(a).gyw(a)}
-J.cG=function(a){return J.RE(a).Ki(a)}
-J.cI=function(a,b){return J.Wx(a).Sy(a,b)}
-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.cV=function(a,b){return J.RE(a).sjT(a,b)}
-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)}
-J.dY=function(a){return J.RE(a).ga4(a)}
-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.eU=function(a){return J.RE(a).gRh(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.fR=function(a,b){return J.RE(a).sMZ(a,b)}
-J.fU=function(a){return J.RE(a).gDX(a)}
-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.fe=function(a){return J.RE(a).gCn(a)}
-J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
-J.fv=function(a,b){return J.RE(a).sUx(a,b)}
-J.fw=function(a){return J.RE(a).gEl(a)}
-J.fy=function(a){return J.RE(a).gIF(a)}
-J.h9=function(a,b){return J.RE(a).sWA(a,b)}
-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.i0=function(a,b){return J.RE(a).sPB(a,b)}
-J.i9=function(a,b){return J.w1(a).Zv(a,b)}
-J.iA=function(a,b,c){return J.RE(a).D9(a,b,c)}
-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.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.iv=function(a){return J.RE(a).gV2(a)}
-J.iz=function(a,b){return J.RE(a).GE(a,b)}
-J.j1=function(a){return J.RE(a).gZA(a)}
-J.jB=function(a){return J.RE(a).gpf(a)}
-J.jO=function(a,b){return J.Wx(a).Y(a,b)}
-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.k0=function(a){return J.RE(a).giZ(a)}
-J.k7=function(a){return J.RE(a).gbA(a)}
-J.kB=function(a,b){return J.RE(a).sFR(a,b)}
-J.kE=function(a){return J.w1(a).git(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)}
-J.kZ=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
-J.ki=function(a){return J.RE(a).gqK(a)}
-J.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.ks=function(a){return J.RE(a).gB1(a)}
-J.kv=function(a){return J.RE(a).glp(a)}
-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.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.m5=function(a){return J.RE(a).gQr(a)}
-J.mI=function(a,b){return J.RE(a).rW(a,b)}
-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.mZ=function(a,b,c){return J.RE(a).BG(a,b,c)}
-J.mu=function(a,b){return J.RE(a).TR(a,b)}
-J.mx=function(a){return J.RE(a).Xf(a)}
-J.my=function(a,b){return J.RE(a).sQl(a,b)}
-J.mz=function(a,b){return J.RE(a).scH(a,b)}
-J.n0=function(a,b){return J.RE(a).Rf(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.nC=function(a,b){return J.RE(a).sCd(a,b)}
-J.nG=function(a){return J.RE(a).gv8(a)}
-J.nb=function(a){return J.RE(a).gyX(a)}
-J.nq=function(a){return J.RE(a).gFL(a)}
-J.oD=function(a,b){return J.RE(a).hP(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.oN=function(a){return J.RE(a).gj4(a)}
-J.oZ=function(a){return J.RE(a).gBi(a)}
-J.on=function(a){return J.RE(a).gtT(a)}
-J.p7=function(a){return J.RE(a).guD(a)}
-J.pA=function(a,b){return J.RE(a).sYt(a,b)}
-J.pB=function(a,b){return J.w1(a).sit(a,b)}
-J.pP=function(a){return J.RE(a).gDD(a)}
-J.pU=function(a){return J.RE(a).ghN(a)}
-J.pW=function(a,b,c,d){return J.RE(a).Si(a,b,c,d)}
-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.q8=function(a){return J.U6(a).gB(a)}
-J.qA=function(a){return J.w1(a).br(a)}
-J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
-J.qd=function(a,b){return J.RE(a).sIt(a,b)}
-J.qq=function(a,b){return J.RE(a).sNG(a,b)}
-J.r0=function(a){return J.RE(a).RE(a)}
-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){return J.RE(a).gYe(a)}
-J.t3=function(a,b){return J.RE(a).sa4(a,b)}
-J.t8=function(a){return J.RE(a).gYQ(a)}
-J.tG=function(a){return J.RE(a).Zi(a)}
-J.tH=function(a,b){return J.RE(a).sHy(a,b)}
-J.tO=function(a){return J.w1(a).Jd(a)}
-J.tQ=function(a,b){return J.RE(a).swv(a,b)}
-J.ta=function(a,b){return J.RE(a).sP(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).gcH(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.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,b){return J.RE(a).sJ6(a,b)}
-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){return J.RE(a).gU4(a)}
-J.uy=function(a){return J.RE(a).gHm(a)}
-J.v1=function(a){return J.x(a).giO(a)}
-J.v8=function(a){return J.RE(a).gnp(a)}
-J.vJ=function(a,b){return J.RE(a).spM(a,b)}
-J.vP=function(a){return J.RE(a).My(a)}
-J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
-return J.Qc(a).U(a,b)}
-J.vi=function(a){return J.RE(a).gNa(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.wl=function(a,b){return J.RE(a).Ch(a,b)}
-J.wt=function(a){return J.RE(a).gP3(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
-return J.x(a).n(a,b)}
-J.xH=function(a,b){return J.RE(a).sE7(a,b)}
-J.xQ=function(a,b){return J.RE(a).sGd(a,b)}
-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.xe=function(a){return J.RE(a).gPB(a)}
-J.xq=function(a){return J.RE(a).gUj(a)}
-J.yH=function(a){return J.Wx(a).Vy(a)}
-J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yi=function(a){return J.RE(a).gbN(a)}
-J.yn=function(a){return J.RE(a).gkZ(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,b){return J.RE(a).Rg(a,b)}
-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,b){return J.w1(a).ad(a,b)}
-J.zj=function(a){return J.RE(a).gvH(a)}
-C.Df=X.hV.prototype
-C.Gkp=Y.q6.prototype
-C.C8=B.G6.prototype
-C.HR=A.wM.prototype
-C.YZz=Q.eW.prototype
-C.RD=O.eo.prototype
-C.ka=Z.aC.prototype
-C.IK=O.VY.prototype
-C.ux=F.Be.prototype
-C.O0=R.JI.prototype
-C.OD=F.ZP.prototype
-C.tT=L.nJ.prototype
-C.UF=R.Eg.prototype
-C.MC=D.i7.prototype
-C.by=A.Gk.prototype
-C.Cl=X.MJ.prototype
-C.Mh=X.Nr.prototype
-C.Xo=U.DK.prototype
-C.PJ8=N.BS.prototype
-C.Cs=O.Vb.prototype
-C.xu=K.Ly.prototype
-C.W3=W.fJ.prototype
-C.bP=E.WS.prototype
-C.hh=E.H8.prototype
-C.Ie=E.mO.prototype
-C.Ig=E.DE.prototype
-C.VLs=E.U1.prototype
-C.lX=E.ou.prototype
-C.Wa=E.av.prototype
-C.bZ=E.uz.prototype
-C.iR=E.Ma.prototype
-C.L6=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.Z4.prototype
-C.kd=D.Qh.prototype
-C.RRl=A.fl.prototype
-C.kS=X.kK.prototype
-C.LN=N.oa.prototype
-C.F2=D.IW.prototype
-C.Ji=D.Oz.prototype
-C.OoF=D.St.prototype
-C.Xe=L.qk.prototype
-C.Nm=J.Q.prototype
-C.YI=J.Yn.prototype
-C.jn=J.imn.prototype
-C.jN=J.CDU.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.yp=H.eEV.prototype
-C.kD=A.md.prototype
-C.br=A.ye.prototype
-C.IG=A.Bm.prototype
-C.nn=A.Ya.prototype
-C.J7=A.Ww.prototype
-C.t5=W.BH3.prototype
-C.BH=V.F1.prototype
-C.Pfz=Z.uL.prototype
-C.Sx=J.Ai.prototype
-C.Ki=A.xc.prototype
-C.Fa=T.ov.prototype
-C.Yj=A.kn.prototype
-C.FH=U.fI.prototype
-C.n8=R.zM.prototype
-C.Vd=D.Rk.prototype
-C.Ns=U.Ti.prototype
-C.HRc=Q.xI.prototype
-C.zb=Q.CY.prototype
-C.dX=K.nm.prototype
-C.wB=X.uw.prototype
-C.OKl=A.G1.prototype
-C.vB=J.kdQ.prototype
-C.u2=X.I5.prototype
-C.dm=U.el.prototype
-C.ma=W.K5.prototype
-C.KZ=new H.hJ()
-C.x4=new U.EO()
-C.Gw=new H.FuS()
-C.Eq=new P.qn()
-C.qY=new T.yy()
-C.ZB=new P.yRf()
-C.pr=new P.mgb()
-C.dV=new L.iNc()
-C.NU=new P.R81()
-C.dS=new P.AHi()
-C.WA=new D.WAE("Collected")
-C.l8=new D.WAE("Dart")
-C.Oc=new D.WAE("Native")
-C.yP=new D.WAE("Reused")
-C.Z7=new D.WAE("Tag")
-C.nU=new A.iYn(0)
-C.BM=new A.iYn(1)
-C.WH=new A.iYn(2)
-C.hf=new H.IN("label")
-C.Db=H.Kx('qU')
-C.NS=new K.vly()
-C.vrd=new A.hG(!1)
-I.uL=function(a){a.immutable$list=init
-a.fixed$length=init
-return a}
-C.ucP=I.uL([C.NS,C.vrd])
-C.V0=new A.ES(C.hf,C.BM,!1,C.Db,!1,C.ucP)
-C.EV=new H.IN("library")
-C.Jny=H.Kx('U4')
-C.ZQ=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.ucP)
-C.SR=new H.IN("map")
-C.MR1=H.Kx('vO')
-C.S9=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.ucP)
-C.UL=new H.IN("profileChanged")
-C.yQP=H.Kx('EH')
-C.dn=I.uL([])
-C.mM=new A.ES(C.UL,C.WH,!1,C.yQP,!1,C.dn)
-C.Ql=new H.IN("hasClass")
-C.HL=H.Kx('a2')
-C.J19=new K.nd()
-C.X0=I.uL([C.NS,C.J19])
-C.TJ=new A.ES(C.Ql,C.BM,!1,C.HL,!1,C.X0)
-C.TU=new H.IN("endPosChanged")
-C.Cp=new A.ES(C.TU,C.WH,!1,C.yQP,!1,C.dn)
-C.ne=new H.IN("exception")
-C.SNu=H.Kx('EP')
-C.rZ=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.ucP)
-C.Wm=new H.IN("refChanged")
-C.QW=new A.ES(C.Wm,C.WH,!1,C.yQP,!1,C.dn)
-C.UY=new H.IN("result")
-C.SmN=H.Kx('af')
-C.n6=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.ucP)
-C.QK=new H.IN("qualified")
-C.Yo=new A.ES(C.QK,C.BM,!1,C.HL,!1,C.ucP)
-C.SA=new H.IN("lines")
-C.hAX=H.Kx('WO')
-C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.X0)
-C.zU=new H.IN("uncheckedText")
-C.uT=new A.ES(C.zU,C.BM,!1,C.Db,!1,C.ucP)
-C.yh=new H.IN("error")
-C.k5t=H.Kx('ft')
-C.m2=new A.ES(C.yh,C.BM,!1,C.k5t,!1,C.ucP)
-C.aH=new H.IN("displayCutoff")
-C.dq=new A.ES(C.aH,C.BM,!1,C.Db,!1,C.X0)
-C.rB=new H.IN("isolate")
-C.a2p=H.Kx('bv')
-C.hR=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.X0)
-C.XA=new H.IN("cls")
-C.jF=H.Kx('dy')
-C.xY=new A.ES(C.XA,C.BM,!1,C.jF,!1,C.ucP)
-C.bz=new H.IN("isolateChanged")
-C.Bk=new A.ES(C.bz,C.WH,!1,C.yQP,!1,C.dn)
-C.CG=new H.IN("posChanged")
-C.Ml=new A.ES(C.CG,C.WH,!1,C.yQP,!1,C.dn)
-C.oUD=H.Kx('N7')
-C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
-C.Gs=new H.IN("sampleCount")
-C.iO=new A.ES(C.Gs,C.BM,!1,C.Db,!1,C.X0)
-C.oj=new H.IN("httpServer")
-C.GT=new A.ES(C.oj,C.BM,!1,C.MR1,!1,C.ucP)
-C.td=new H.IN("object")
-C.Zk=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.ucP)
-C.TW=new H.IN("tagSelector")
-C.H0=new A.ES(C.TW,C.BM,!1,C.Db,!1,C.X0)
-C.He=new H.IN("hideTagsChecked")
-C.oV=new A.ES(C.He,C.BM,!1,C.HL,!1,C.X0)
-C.zz=new H.IN("timeSpan")
-C.lS=new A.ES(C.zz,C.BM,!1,C.Db,!1,C.X0)
-C.AO=new H.IN("qualifiedName")
-C.fi=new A.ES(C.AO,C.BM,!1,C.Db,!1,C.ucP)
-C.mr=new H.IN("expanded")
-C.HE=new A.ES(C.mr,C.BM,!1,C.HL,!1,C.X0)
-C.kw=new H.IN("trace")
-C.oC=new A.ES(C.kw,C.BM,!1,C.MR1,!1,C.ucP)
-C.qX=new H.IN("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.WH,!1,C.yQP,!1,C.dn)
-C.UX=new H.IN("msg")
-C.Pt=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.ucP)
-C.pO=new H.IN("functionChanged")
-C.au=new A.ES(C.pO,C.WH,!1,C.yQP,!1,C.dn)
-C.rP=new H.IN("mapChanged")
-C.Nt=new A.ES(C.rP,C.WH,!1,C.yQP,!1,C.dn)
-C.bk=new H.IN("checked")
-C.Ud=new A.ES(C.bk,C.BM,!1,C.HL,!1,C.ucP)
-C.kV=new H.IN("link")
-C.vz=new A.ES(C.kV,C.BM,!1,C.Db,!1,C.ucP)
-C.Ve=new H.IN("socket")
-C.Xmq=H.Kx('WP')
-C.X4=new A.ES(C.Ve,C.BM,!1,C.Xmq,!1,C.ucP)
-C.nt=new H.IN("startLine")
-C.yw=H.Kx('KN')
-C.VS=new A.ES(C.nt,C.BM,!1,C.yw,!1,C.X0)
-C.tg=new H.IN("retainedBytes")
-C.DC=new A.ES(C.tg,C.BM,!1,C.yw,!1,C.X0)
-C.YD=new H.IN("sampleRate")
-C.fP=new A.ES(C.YD,C.BM,!1,C.Db,!1,C.X0)
-C.Aa=new H.IN("results")
-C.Gsc=H.Kx('wn')
-C.Uz=new A.ES(C.Aa,C.BM,!1,C.Gsc,!1,C.X0)
-C.B0=new H.IN("expand")
-C.b6=new A.ES(C.B0,C.BM,!1,C.HL,!1,C.ucP)
-C.t6=new H.IN("mapAsString")
-C.hr=new A.ES(C.t6,C.BM,!1,C.Db,!1,C.X0)
-C.qs=new H.IN("io")
-C.MN=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.ucP)
-C.QH=new H.IN("fragmentation")
-C.C4=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.ucP)
-C.VK=new H.IN("devtools")
-C.Od=new A.ES(C.VK,C.BM,!1,C.HL,!1,C.ucP)
-C.uu=new H.IN("internal")
-C.yY=new A.ES(C.uu,C.BM,!1,C.HL,!1,C.ucP)
-C.yL=new H.IN("connection")
-C.j5=new A.ES(C.yL,C.BM,!1,C.MR1,!1,C.ucP)
-C.Wj=new H.IN("process")
-C.Ah=new A.ES(C.Wj,C.BM,!1,C.MR1,!1,C.ucP)
-C.nf=new H.IN("function")
-C.V3=new A.ES(C.nf,C.BM,!1,C.MR1,!1,C.ucP)
-C.Lc=new H.IN("kind")
-C.Pc=new A.ES(C.Lc,C.BM,!1,C.Db,!1,C.ucP)
-C.S4=new H.IN("busy")
-C.FB=new A.ES(C.S4,C.BM,!1,C.HL,!1,C.X0)
-C.eh=new H.IN("lineMode")
-C.rH=new A.ES(C.eh,C.BM,!1,C.Db,!1,C.X0)
-C.PM=new H.IN("status")
-C.jv=new A.ES(C.PM,C.BM,!1,C.Db,!1,C.X0)
-C.Zi=new H.IN("lastAccumulatorReset")
-C.xx=new A.ES(C.Zi,C.BM,!1,C.Db,!1,C.X0)
-C.lH=new H.IN("checkedText")
-C.dG=new A.ES(C.lH,C.BM,!1,C.Db,!1,C.ucP)
-C.AV=new H.IN("callback")
-C.wu=H.Kx('Sa')
-C.fr=new A.ES(C.AV,C.BM,!1,C.wu,!1,C.ucP)
-C.vs=new H.IN("endLine")
-C.MP=new A.ES(C.vs,C.BM,!1,C.yw,!1,C.X0)
-C.pH=new H.IN("small")
-C.Fk=new A.ES(C.pH,C.BM,!1,C.HL,!1,C.ucP)
-C.ox=new H.IN("countersChanged")
-C.Rh=new A.ES(C.ox,C.WH,!1,C.yQP,!1,C.dn)
-C.XM=new H.IN("path")
-C.Tt=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.ucP)
-C.bJ=new H.IN("counters")
-C.jJ=H.Kx('qC')
-C.UI=new A.ES(C.bJ,C.BM,!1,C.jJ,!1,C.ucP)
-C.bE=new H.IN("sampleDepth")
-C.h3=new A.ES(C.bE,C.BM,!1,C.Db,!1,C.X0)
-C.Ys=new H.IN("pad")
-C.Ce=new A.ES(C.Ys,C.BM,!1,C.HL,!1,C.ucP)
-C.N8=new H.IN("scriptChanged")
-C.qE=new A.ES(C.N8,C.WH,!1,C.yQP,!1,C.dn)
-C.YT=new H.IN("expr")
-C.eP=H.Kx('dynamic')
-C.LC=new A.ES(C.YT,C.BM,!1,C.eP,!1,C.ucP)
-C.ak=new H.IN("hasParent")
-C.yI=new A.ES(C.ak,C.BM,!1,C.HL,!1,C.X0)
-C.xS=new H.IN("tagSelectorChanged")
-C.bB=new A.ES(C.xS,C.WH,!1,C.yQP,!1,C.dn)
-C.jU=new H.IN("file")
-C.bw=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.ucP)
-C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
-C.DZ=new A.ES(C.XA,C.BM,!1,C.MR1,!1,C.ucP)
-C.YE=new H.IN("webSocket")
-C.Wl=new A.ES(C.YE,C.BM,!1,C.MR1,!1,C.ucP)
-C.Dj=new H.IN("refreshTime")
-C.Ay=new A.ES(C.Dj,C.BM,!1,C.Db,!1,C.X0)
-C.Gr=new H.IN("endPos")
-C.VJ=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.ucP)
-C.RJ=new H.IN("vm")
-C.n8S=H.Kx('wv')
-C.BP=new A.ES(C.RJ,C.BM,!1,C.n8S,!1,C.ucP)
-C.a0=new H.IN("isDart")
-C.P9=new A.ES(C.a0,C.BM,!1,C.HL,!1,C.X0)
-C.PX=new H.IN("script")
-C.KB=H.Kx('vx')
-C.jz=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.ucP)
-C.aP=new H.IN("active")
-C.xD=new A.ES(C.aP,C.BM,!1,C.HL,!1,C.ucP)
-C.Gn=new H.IN("objectChanged")
-C.az=new A.ES(C.Gn,C.WH,!1,C.yQP,!1,C.dn)
-C.vp=new H.IN("list")
-C.o0=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.ucP)
-C.i4=new H.IN("code")
-C.pM=H.Kx('kx')
-C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.ucP)
-C.kG=new H.IN("classTable")
-C.F9=H.Kx('UC')
-C.Pr=new A.ES(C.kG,C.BM,!1,C.F9,!1,C.X0)
-C.TN=new H.IN("lastServiceGC")
-C.Gj=new A.ES(C.TN,C.BM,!1,C.Db,!1,C.X0)
-C.zd=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.ucP)
-C.OO=new H.IN("flag")
-C.Cf=new A.ES(C.OO,C.BM,!1,C.jJ,!1,C.ucP)
-C.uk=new H.IN("last")
-C.p4=new A.ES(C.uk,C.BM,!1,C.HL,!1,C.ucP)
-C.WQ=new H.IN("field")
-C.ah=new A.ES(C.WQ,C.BM,!1,C.MR1,!1,C.ucP)
-C.r1=new H.IN("expandChanged")
-C.nP=new A.ES(C.r1,C.WH,!1,C.yQP,!1,C.dn)
-C.Mc=new H.IN("flagList")
-C.f0=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.ucP)
-C.fn=new H.IN("instance")
-C.fz=new A.ES(C.fn,C.BM,!1,C.MR1,!1,C.ucP)
-C.rE=new H.IN("frame")
-C.KS=new A.ES(C.rE,C.BM,!1,C.jJ,!1,C.ucP)
-C.cg=new H.IN("anchor")
-C.ll=new A.ES(C.cg,C.BM,!1,C.Db,!1,C.ucP)
-C.ng=I.uL([C.J19])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.pM,!1,C.ng)
-C.mi=new H.IN("text")
-C.yV=new A.ES(C.mi,C.BM,!1,C.Db,!1,C.X0)
-C.tW=new H.IN("pos")
-C.kH=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.ucP)
-C.xP=new H.IN("ref")
-C.TO=new A.ES(C.xP,C.BM,!1,C.SmN,!1,C.ucP)
-C.Qp=new A.ES(C.AV,C.BM,!1,C.eP,!1,C.ucP)
-C.vb=new H.IN("profile")
-C.Mq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.ucP)
-C.ny=new P.a6(0)
-C.U3=H.VM(new W.FkO("change"),[W.ea])
-C.T1=H.VM(new W.FkO("click"),[W.AjY])
-C.MD=H.VM(new W.FkO("error"),[W.kf])
-C.i3=H.VM(new W.FkO("input"),[W.ea])
-C.LF=H.VM(new W.FkO("load"),[W.kf])
-C.ph=H.VM(new W.FkO("message"),[W.AW])
-C.uh=H.VM(new W.FkO("mousedown"),[W.AjY])
-C.Kq=H.VM(new W.FkO("mousemove"),[W.AjY])
-C.yf=H.VM(new W.FkO("popstate"),[W.f5])
-C.mp=function(hooks) {
+// The code supports the following hooks:
+// dartPrint(message):
+//    if this function is defined it is called instead of the Dart [print]
+//    method.
+//
+// dartMainRunner(main, args):
+//    if this function is defined, the Dart [main] method will not be invoked
+//    directly. Instead, a closure that will invoke [main], and its arguments
+//    [args] is passed to [dartMainRunner].
+(function($) {
+function dart(){ this.x = 0 }var A = new dart;
+delete A.x;
+var B = new dart;
+delete B.x;
+var C = new dart;
+delete C.x;
+var D = new dart;
+delete D.x;
+var E = new dart;
+delete E.x;
+var F = new dart;
+delete F.x;
+var G = new dart;
+delete G.x;
+var H = new dart;
+delete H.x;
+var J = new dart;
+delete J.x;
+var K = new dart;
+delete K.x;
+var L = new dart;
+delete L.x;
+var M = new dart;
+delete M.x;
+var N = new dart;
+delete N.x;
+var O = new dart;
+delete O.x;
+var P = new dart;
+delete P.x;
+var Q = new dart;
+delete Q.x;
+var R = new dart;
+delete R.x;
+var S = new dart;
+delete S.x;
+var T = new dart;
+delete T.x;
+var U = new dart;
+delete U.x;
+var V = new dart;
+delete V.x;
+var W = new dart;
+delete W.x;
+var X = new dart;
+delete X.x;
+var Y = new dart;
+delete Y.x;
+var Z = new dart;
+delete Z.x;
+function Isolate() {}
+init();
+
+$ = Isolate.$isolateProperties;
+var $$ = {};
+
+// Native classes
+(function(reflectionData) {
+  "use strict";
+  function map(x) {
+    x = {x: x};
+    delete x.x;
+    return x;
+  }
+  function processStatics(descriptor) {
+    for (var property in descriptor) {
+      if (!hasOwnProperty.call(descriptor, property))
+        continue;
+      if (property === "^")
+        continue;
+      var element = descriptor[property];
+      var firstChar = property.substring(0, 1);
+      var previousProperty;
+      if (firstChar === "+") {
+        mangledGlobalNames[previousProperty] = property.substring(1);
+        var flag = descriptor[property];
+        if (flag > 0)
+          descriptor[previousProperty].$reflectable = flag;
+        if (element && element.length)
+          init.typeInformation[previousProperty] = element;
+      } else if (firstChar === "@") {
+        property = property.substring(1);
+        $[property]["@"] = element;
+      } else if (firstChar === "*") {
+        globalObject[previousProperty].$defaultValues = element;
+        var optionalMethods = descriptor.$methodsWithOptionalArguments;
+        if (!optionalMethods) {
+          descriptor.$methodsWithOptionalArguments = optionalMethods = {};
+        }
+        optionalMethods[property] = previousProperty;
+      } else if (typeof element === "function") {
+        globalObject[previousProperty = property] = element;
+        functions.push(property);
+        init.globalFunctions[property] = element;
+      } else if (element.constructor === Array) {
+        addStubs(globalObject, element, property, true, descriptor, functions);
+      } else {
+        previousProperty = property;
+        var newDesc = {};
+        var previousProp;
+        for (var prop in element) {
+          if (!hasOwnProperty.call(element, prop))
+            continue;
+          firstChar = prop.substring(0, 1);
+          if (prop === "static") {
+            processStatics(init.statics[property] = element[prop]);
+          } else if (firstChar === "+") {
+            mangledNames[previousProp] = prop.substring(1);
+            var flag = element[prop];
+            if (flag > 0)
+              element[previousProp].$reflectable = flag;
+          } else if (firstChar === "@" && prop !== "@") {
+            newDesc[prop.substring(1)]["@"] = element[prop];
+          } else if (firstChar === "*") {
+            newDesc[previousProp].$defaultValues = element[prop];
+            var optionalMethods = newDesc.$methodsWithOptionalArguments;
+            if (!optionalMethods) {
+              newDesc.$methodsWithOptionalArguments = optionalMethods = {};
+            }
+            optionalMethods[prop] = previousProp;
+          } else {
+            var elem = element[prop];
+            if (prop !== "^" && elem != null && elem.constructor === Array && prop !== "<>") {
+              addStubs(newDesc, elem, prop, false, element, []);
+            } else {
+              newDesc[previousProp = prop] = elem;
+            }
+          }
+        }
+        $$[property] = [globalObject, newDesc];
+        classes.push(property);
+      }
+    }
+  }
+  function addStubs(descriptor, array, name, isStatic, originalDescriptor, functions) {
+    var f, funcs = [originalDescriptor[name] = descriptor[name] = f = array[0]];
+    f.$stubName = name;
+    functions.push(name);
+    for (var index = 0; index < array.length; index += 2) {
+      f = array[index + 1];
+      if (typeof f != "function")
+        break;
+      f.$stubName = array[index + 2];
+      funcs.push(f);
+      if (f.$stubName) {
+        originalDescriptor[f.$stubName] = descriptor[f.$stubName] = f;
+        functions.push(f.$stubName);
+      }
+    }
+    for (var i = 0; i < funcs.length; index++, i++) {
+      funcs[i].$callName = array[index + 1];
+    }
+    var getterStubName = array[++index];
+    array = array.slice(++index);
+    var requiredParameterInfo = array[0];
+    var requiredParameterCount = requiredParameterInfo >> 1;
+    var isAccessor = (requiredParameterInfo & 1) === 1;
+    var isSetter = requiredParameterInfo === 3;
+    var isGetter = requiredParameterInfo === 1;
+    var optionalParameterInfo = array[1];
+    var optionalParameterCount = optionalParameterInfo >> 1;
+    var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
+    var isIntercepted = requiredParameterCount + optionalParameterCount != funcs[0].length;
+    var functionTypeIndex = array[2];
+    var unmangledNameIndex = 2 * optionalParameterCount + requiredParameterCount + 3;
+    var isReflectable = array.length > unmangledNameIndex;
+    if (getterStubName) {
+      f = tearOff(funcs, array, isStatic, name, isIntercepted);
+      descriptor[name].$getter = f;
+      f.$getterStub = true;
+      if (isStatic)
+        init.globalFunctions[name] = f;
+      originalDescriptor[getterStubName] = descriptor[getterStubName] = f;
+      funcs.push(f);
+      if (getterStubName)
+        functions.push(getterStubName);
+      f.$stubName = getterStubName;
+      f.$callName = null;
+      if (isIntercepted)
+        init.interceptedNames[getterStubName] = true;
+    }
+    if (isReflectable) {
+      for (var i = 0; i < funcs.length; i++) {
+        funcs[i].$reflectable = 1;
+        funcs[i].$reflectionInfo = array;
+      }
+      var mangledNames = isStatic ? init.mangledGlobalNames : init.mangledNames;
+      var unmangledName = array[unmangledNameIndex];
+      var reflectionName = unmangledName;
+      if (getterStubName)
+        mangledNames[getterStubName] = reflectionName;
+      if (isSetter) {
+        reflectionName += "=";
+      } else if (!isGetter) {
+        reflectionName += ":" + requiredParameterCount + ":" + optionalParameterCount;
+      }
+      mangledNames[name] = reflectionName;
+      funcs[0].$reflectionName = reflectionName;
+      funcs[0].$metadataIndex = unmangledNameIndex + 1;
+      if (optionalParameterCount)
+        descriptor[unmangledName + "*"] = funcs[0];
+    }
+  }
+  function tearOffGetterNoCsp(funcs, reflectionInfo, name, isIntercepted) {
+    return isIntercepted ? new Function("funcs", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "(x) {" + "if (c === null) c = H.closureFromTearOff(" + "this, funcs, reflectionInfo, false, [x], name);" + "return new c(this, funcs[0], x, name);" + "}")(funcs, reflectionInfo, name, H, null) : new Function("funcs", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "() {" + "if (c === null) c = H.closureFromTearOff(" + "this, funcs, reflectionInfo, false, [], name);" + "return new c(this, funcs[0], null, name);" + "}")(funcs, reflectionInfo, name, H, null);
+  }
+  function tearOffGetterCsp(funcs, reflectionInfo, name, isIntercepted) {
+    var cache = null;
+    return isIntercepted ? function(x) {
+      if (cache === null)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, false, [x], name);
+      return new cache(this, funcs[0], x, name);
+    } : function() {
+      if (cache === null)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, false, [], name);
+      return new cache(this, funcs[0], null, name);
+    };
+  }
+  function tearOff(funcs, reflectionInfo, isStatic, name, isIntercepted) {
+    var cache;
+    return isStatic ? function() {
+      if (cache === void 0)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, true, [], name).prototype;
+      return cache;
+    } : tearOffGetter(funcs, reflectionInfo, name, isIntercepted);
+  }
+  var functionCounter = 0;
+  var tearOffGetter = typeof dart_precompiled == "function" ? tearOffGetterCsp : tearOffGetterNoCsp;
+  if (!init.libraries)
+    init.libraries = [];
+  if (!init.mangledNames)
+    init.mangledNames = map();
+  if (!init.mangledGlobalNames)
+    init.mangledGlobalNames = map();
+  if (!init.statics)
+    init.statics = map();
+  if (!init.typeInformation)
+    init.typeInformation = map();
+  if (!init.globalFunctions)
+    init.globalFunctions = map();
+  if (!init.interceptedNames)
+    init.interceptedNames = map();
+  var libraries = init.libraries;
+  var mangledNames = init.mangledNames;
+  var mangledGlobalNames = init.mangledGlobalNames;
+  var hasOwnProperty = Object.prototype.hasOwnProperty;
+  var length = reflectionData.length;
+  for (var i = 0; i < length; i++) {
+    var data = reflectionData[i];
+    var name = data[0];
+    var uri = data[1];
+    var metadata = data[2];
+    var globalObject = data[3];
+    var descriptor = data[4];
+    var isRoot = !!data[5];
+    var fields = descriptor && descriptor["^"];
+    if (fields instanceof Array)
+      fields = fields[0];
+    var classes = [];
+    var functions = [];
+    processStatics(descriptor);
+    libraries.push([name, uri, classes, functions, metadata, fields, isRoot, globalObject]);
+  }
+})([
+["_foreign_helper", "dart:_foreign_helper", , H, {
+  "^": "",
+  JS_CONST: {
+    "^": "Object;code>"
+  }
+}],
+["_interceptors", "dart:_interceptors", , J, {
+  "^": "",
+  getInterceptor: function(object) {
+    return void 0;
+  },
+  makeDispatchRecord: function(interceptor, proto, extension, indexability) {
+    return {i: interceptor, p: proto, e: extension, x: indexability};
+  },
+  getNativeInterceptor: function(object) {
+    var record, proto, objectProto, interceptor;
+    record = object[init.dispatchPropertyName];
+    if (record == null)
+      if ($.initNativeDispatchFlag == null) {
+        H.initNativeDispatch();
+        record = object[init.dispatchPropertyName];
+      }
+    if (record != null) {
+      proto = record.p;
+      if (false === proto)
+        return record.i;
+      if (true === proto)
+        return object;
+      objectProto = Object.getPrototypeOf(object);
+      if (proto === objectProto)
+        return record.i;
+      if (record.e === objectProto)
+        throw H.wrapException(P.UnimplementedError$("Return interceptor for " + H.S(proto(object, record))));
+    }
+    interceptor = H.lookupAndCacheInterceptor(object);
+    if (interceptor == null) {
+      proto = Object.getPrototypeOf(object);
+      if (proto == null || proto === Object.prototype)
+        return C.PlainJavaScriptObject_methods;
+      else
+        return C.UnknownJavaScriptObject_methods;
+    }
+    return interceptor;
+  },
+  findIndexForNativeSubclassType: function(type) {
+    var t1, map, t2, i;
+    t1 = $.mapTypeToInterceptor;
+    if (t1 == null)
+      return;
+    map = t1;
+    for (t1 = map.length, t2 = J.getInterceptor(type), i = 0; i + 1 < t1; i += 3) {
+      if (i >= t1)
+        return H.ioore(map, i);
+      if (t2.$eq(type, map[i]))
+        return i;
+    }
+    return;
+  },
+  findInterceptorConstructorForType: function(type) {
+    var index, map, t1;
+    index = J.findIndexForNativeSubclassType(type);
+    if (index == null)
+      return;
+    map = $.mapTypeToInterceptor;
+    t1 = index + 1;
+    if (t1 >= map.length)
+      return H.ioore(map, t1);
+    return map[t1];
+  },
+  findConstructorForNativeSubclassType: function(type, $name) {
+    var index, map, t1;
+    index = J.findIndexForNativeSubclassType(type);
+    if (index == null)
+      return;
+    map = $.mapTypeToInterceptor;
+    t1 = index + 2;
+    if (t1 >= map.length)
+      return H.ioore(map, t1);
+    return map[t1][$name];
+  },
+  Interceptor: {
+    "^": "Object;",
+    $eq: function(receiver, other) {
+      return receiver === other;
+    },
+    get$hashCode: function(receiver) {
+      return H.Primitives_objectHashCode(receiver);
+    },
+    toString$0: function(receiver) {
+      return H.Primitives_objectToString(receiver);
+    },
+    noSuchMethod$1: [function(receiver, invocation) {
+      throw H.wrapException(P.NoSuchMethodError$(receiver, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments(), null));
+    }, "call$1", "get$noSuchMethod", 2, 0, null, 68],
+    get$runtimeType: function(receiver) {
+      return new H.TypeImpl(H.getRuntimeTypeString(receiver), null);
+    },
+    "%": "DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"
+  },
+  JSBool: {
+    "^": "Interceptor;",
+    toString$0: function(receiver) {
+      return String(receiver);
+    },
+    get$hashCode: function(receiver) {
+      return receiver ? 519018 : 218159;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_EsU;
+    },
+    $isbool: true
+  },
+  JSNull: {
+    "^": "Interceptor;",
+    $eq: function(receiver, other) {
+      return null == other;
+    },
+    toString$0: function(receiver) {
+      return "null";
+    },
+    get$hashCode: function(receiver) {
+      return 0;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_eZO;
+    },
+    noSuchMethod$1: [function(receiver, invocation) {
+      return J.Interceptor.prototype.noSuchMethod$1.call(this, receiver, invocation);
+    }, "call$1", "get$noSuchMethod", 2, 0, null, 68]
+  },
+  JavaScriptObject: {
+    "^": "Interceptor;",
+    get$hashCode: function(_) {
+      return 0;
+    },
+    get$runtimeType: function(_) {
+      return C.Type_XXD;
+    }
+  },
+  PlainJavaScriptObject: {
+    "^": "JavaScriptObject;"
+  },
+  UnknownJavaScriptObject: {
+    "^": "JavaScriptObject;"
+  },
+  JSArray: {
+    "^": "Interceptor;",
+    add$1: function(receiver, value) {
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("add"));
+      receiver.push(value);
+    },
+    removeAt$1: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index < 0 || index >= receiver.length)
+        throw H.wrapException(P.RangeError$value(index));
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("removeAt"));
+      return receiver.splice(index, 1)[0];
+    },
+    insert$2: function(receiver, index, value) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index < 0 || index > receiver.length)
+        throw H.wrapException(P.RangeError$value(index));
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("insert"));
+      receiver.splice(index, 0, value);
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("insertAll"));
+      H.IterableMixinWorkaround_insertAllList(receiver, index, iterable);
+    },
+    remove$1: function(receiver, element) {
+      var i;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("remove"));
+      for (i = 0; i < receiver.length; ++i)
+        if (J.$eq(receiver[i], element)) {
+          receiver.splice(i, 1);
+          return true;
+        }
+      return false;
+    },
+    where$1: function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.WhereIterable(receiver, f), [null]);
+    },
+    expand$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(receiver, f), [null, null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E", ret: P.Iterable, args: [{func: "Iterable__E", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "JSArray");
+    }, 31],
+    addAll$1: function(receiver, collection) {
+      var t1;
+      for (t1 = J.get$iterator$ax(collection); t1.moveNext$0();)
+        this.add$1(receiver, t1.get$current());
+    },
+    clear$0: function(receiver) {
+      this.set$length(receiver, 0);
+    },
+    forEach$1: function(receiver, f) {
+      return H.IterableMixinWorkaround_forEach(receiver, f);
+    },
+    map$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(receiver, f), [null, null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E", ret: P.Iterable, args: [{func: "dynamic__E", args: [E]}]};
+      }, this.$receiver, "JSArray");
+    }, 31],
+    join$1: function(receiver, separator) {
+      var t1, list, i, t2;
+      t1 = receiver.length;
+      list = Array(t1);
+      list.fixed$length = init;
+      for (i = 0; i < receiver.length; ++i) {
+        t2 = H.S(receiver[i]);
+        if (i >= t1)
+          return H.ioore(list, i);
+        list[i] = t2;
+      }
+      return list.join(separator);
+    },
+    skip$1: function(receiver, n) {
+      return H.SubListIterable$(receiver, n, null, null);
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    sublist$2: function(receiver, start, end) {
+      if (start < 0 || start > receiver.length)
+        throw H.wrapException(P.RangeError$range(start, 0, receiver.length));
+      if (end < start || end > receiver.length)
+        throw H.wrapException(P.RangeError$range(end, start, receiver.length));
+      if (start === end)
+        return H.setRuntimeTypeInfo([], [H.getTypeArgumentByIndex(receiver, 0)]);
+      return H.setRuntimeTypeInfo(receiver.slice(start, end), [H.getTypeArgumentByIndex(receiver, 0)]);
+    },
+    getRange$2: function(receiver, start, end) {
+      H.IterableMixinWorkaround__rangeCheck(receiver, start, end);
+      return H.SubListIterable$(receiver, start, end, null);
+    },
+    get$first: function(receiver) {
+      if (receiver.length > 0)
+        return receiver[0];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    get$last: function(receiver) {
+      var t1 = receiver.length;
+      if (t1 > 0)
+        return receiver[t1 - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    removeRange$2: function(receiver, start, end) {
+      var receiverLength;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("removeRange"));
+      receiverLength = receiver.length;
+      if (start < 0 || start > receiverLength)
+        throw H.wrapException(P.RangeError$range(start, 0, receiverLength));
+      if (end < start || end > receiverLength)
+        throw H.wrapException(P.RangeError$range(end, start, receiverLength));
+      H.Lists_copy(receiver, end, receiver, start, receiverLength - end);
+      this.set$length(receiver, receiverLength - (end - start));
+    },
+    any$1: function(receiver, f) {
+      return H.IterableMixinWorkaround_any(receiver, f);
+    },
+    sort$1: function(receiver, compare) {
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("sort"));
+      H.IterableMixinWorkaround_sortList(receiver, compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    indexOf$2: function(receiver, element, start) {
+      return H.Lists_indexOf(receiver, element, start, receiver.length);
+    },
+    indexOf$1: function($receiver, element) {
+      return this.indexOf$2($receiver, element, 0);
+    },
+    lastIndexOf$2: function(receiver, element, start) {
+      return H.Lists_lastIndexOf(receiver, element, receiver.length - 1);
+    },
+    lastIndexOf$1: function($receiver, element) {
+      return this.lastIndexOf$2($receiver, element, null);
+    },
+    contains$1: function(receiver, other) {
+      var i;
+      for (i = 0; i < receiver.length; ++i)
+        if (J.$eq(receiver[i], other))
+          return true;
+      return false;
+    },
+    get$isEmpty: function(receiver) {
+      return receiver.length === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return receiver.length !== 0;
+    },
+    toString$0: function(receiver) {
+      return P.IterableBase_iterableToFullString(receiver, "[", "]");
+    },
+    toList$1$growable: function(receiver, growable) {
+      var t1;
+      if (growable)
+        return H.setRuntimeTypeInfo(receiver.slice(), [H.getTypeArgumentByIndex(receiver, 0)]);
+      else {
+        t1 = H.setRuntimeTypeInfo(receiver.slice(), [H.getTypeArgumentByIndex(receiver, 0)]);
+        t1.fixed$length = init;
+        return t1;
+      }
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    get$iterator: function(receiver) {
+      return H.setRuntimeTypeInfo(new H.ListIterator(receiver, receiver.length, 0, null), [H.getTypeArgumentByIndex(receiver, 0)]);
+    },
+    get$hashCode: function(receiver) {
+      return H.Primitives_objectHashCode(receiver);
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    set$length: function(receiver, newLength) {
+      if (typeof newLength !== "number" || Math.floor(newLength) !== newLength)
+        throw H.wrapException(P.ArgumentError$(newLength));
+      if (newLength < 0)
+        throw H.wrapException(P.RangeError$value(newLength));
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("set length"));
+      receiver.length = newLength;
+    },
+    $index: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("indexed set"));
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      receiver[index] = value;
+    },
+    $isJSArray: true,
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {JSArray_JSArray$fixed: function($length, $E) {
+        var t1;
+        if (typeof $length !== "number" || Math.floor($length) !== $length || $length < 0)
+          throw H.wrapException(P.ArgumentError$("Length must be a non-negative integer: " + H.S($length)));
+        t1 = H.setRuntimeTypeInfo(new Array($length), [$E]);
+        t1.fixed$length = init;
+        return t1;
+      }}
+  },
+  JSNumber: {
+    "^": "Interceptor;",
+    compareTo$1: function(receiver, b) {
+      var bIsNegative;
+      if (typeof b !== "number")
+        throw H.wrapException(P.ArgumentError$(b));
+      if (receiver < b)
+        return -1;
+      else if (receiver > b)
+        return 1;
+      else if (receiver === b) {
+        if (receiver === 0) {
+          bIsNegative = this.get$isNegative(b);
+          if (this.get$isNegative(receiver) === bIsNegative)
+            return 0;
+          if (this.get$isNegative(receiver))
+            return -1;
+          return 1;
+        }
+        return 0;
+      } else if (isNaN(receiver)) {
+        if (this.get$isNaN(b))
+          return 0;
+        return 1;
+      } else
+        return -1;
+    },
+    get$isNegative: function(receiver) {
+      return receiver === 0 ? 1 / receiver < 0 : receiver < 0;
+    },
+    get$isNaN: function(receiver) {
+      return isNaN(receiver);
+    },
+    get$isFinite: function(receiver) {
+      return isFinite(receiver);
+    },
+    remainder$1: function(receiver, b) {
+      return receiver % b;
+    },
+    abs$0: function(receiver) {
+      return Math.abs(receiver);
+    },
+    toInt$0: function(receiver) {
+      var t1;
+      if (receiver >= -2147483648 && receiver <= 2147483647)
+        return receiver | 0;
+      if (isFinite(receiver)) {
+        t1 = receiver < 0 ? Math.ceil(receiver) : Math.floor(receiver);
+        return t1 + 0;
+      }
+      throw H.wrapException(P.UnsupportedError$('' + receiver));
+    },
+    round$0: function(receiver) {
+      return this.toInt$0(this.roundToDouble$0(receiver));
+    },
+    roundToDouble$0: function(receiver) {
+      if (receiver < 0)
+        return -Math.round(-receiver);
+      else
+        return Math.round(receiver);
+    },
+    toStringAsFixed$1: function(receiver, fractionDigits) {
+      var result;
+      if (fractionDigits > 20)
+        throw H.wrapException(P.RangeError$(fractionDigits));
+      result = receiver.toFixed(fractionDigits);
+      if (receiver === 0 && this.get$isNegative(receiver))
+        return "-" + result;
+      return result;
+    },
+    toRadixString$1: function(receiver, radix) {
+      if (radix < 2 || radix > 36)
+        throw H.wrapException(P.RangeError$(radix));
+      return receiver.toString(radix);
+    },
+    toString$0: function(receiver) {
+      if (receiver === 0 && 1 / receiver < 0)
+        return "-0.0";
+      else
+        return "" + receiver;
+    },
+    get$hashCode: function(receiver) {
+      return receiver & 0x1FFFFFFF;
+    },
+    $negate: function(receiver) {
+      return -receiver;
+    },
+    $add: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver + other;
+    },
+    $sub: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver - other;
+    },
+    $div: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver / other;
+    },
+    $mul: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver * other;
+    },
+    $mod: function(receiver, other) {
+      var result;
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      result = receiver % other;
+      if (result === 0)
+        return 0;
+      if (result > 0)
+        return result;
+      if (other < 0)
+        return result - other;
+      else
+        return result + other;
+    },
+    $tdiv: function(receiver, other) {
+      if ((receiver | 0) === receiver && (other | 0) === other && 0 !== other && -1 !== other)
+        return receiver / other | 0;
+      else {
+        if (typeof other !== "number")
+          H.throwExpression(P.ArgumentError$(other));
+        return this.toInt$0(receiver / other);
+      }
+    },
+    _tdivFast$1: function(receiver, other) {
+      return (receiver | 0) === receiver ? receiver / other | 0 : this.toInt$0(receiver / other);
+    },
+    $shl: function(receiver, other) {
+      if (other < 0)
+        throw H.wrapException(P.ArgumentError$(other));
+      return other > 31 ? 0 : receiver << other >>> 0;
+    },
+    _shlPositive$1: function(receiver, other) {
+      return other > 31 ? 0 : receiver << other >>> 0;
+    },
+    $shr: function(receiver, other) {
+      var t1;
+      if (other < 0)
+        throw H.wrapException(P.ArgumentError$(other));
+      if (receiver > 0)
+        t1 = other > 31 ? 0 : receiver >>> other;
+      else {
+        t1 = other > 31 ? 31 : other;
+        t1 = receiver >> t1 >>> 0;
+      }
+      return t1;
+    },
+    _shrOtherPositive$1: function(receiver, other) {
+      var t1;
+      if (receiver > 0)
+        t1 = other > 31 ? 0 : receiver >>> other;
+      else {
+        t1 = other > 31 ? 31 : other;
+        t1 = receiver >> t1 >>> 0;
+      }
+      return t1;
+    },
+    $and: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return (receiver & other) >>> 0;
+    },
+    $xor: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return (receiver ^ other) >>> 0;
+    },
+    $lt: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver < other;
+    },
+    $gt: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver > other;
+    },
+    $le: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver <= other;
+    },
+    $ge: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver >= other;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_xM7;
+    },
+    $isnum: true,
+    static: {"^": "JSNumber__MIN_INT32,JSNumber__MAX_INT32"}
+  },
+  JSInt: {
+    "^": "JSNumber;",
+    get$runtimeType: function(receiver) {
+      return C.Type_SnA;
+    },
+    $is$double: true,
+    $isnum: true,
+    $is$int: true
+  },
+  JSDouble: {
+    "^": "JSNumber;",
+    get$runtimeType: function(receiver) {
+      return C.Type_qq1;
+    },
+    $is$double: true,
+    $isnum: true
+  },
+  JSString: {
+    "^": "Interceptor;",
+    codeUnitAt$1: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      if (index >= receiver.length)
+        throw H.wrapException(P.RangeError$value(index));
+      return receiver.charCodeAt(index);
+    },
+    allMatches$1: function(receiver, str) {
+      return H.allMatchesInStringUnchecked(receiver, str);
+    },
+    matchAsPrefix$2: function(receiver, string, start) {
+      var t1, t2, i, t3;
+      if (start < 0 || start > string.length)
+        throw H.wrapException(P.RangeError$range(start, 0, string.length));
+      t1 = receiver.length;
+      t2 = string.length;
+      if (start + t1 > t2)
+        return;
+      for (i = 0; i < t1; ++i) {
+        t3 = start + i;
+        if (t3 < 0)
+          H.throwExpression(P.RangeError$value(t3));
+        if (t3 >= t2)
+          H.throwExpression(P.RangeError$value(t3));
+        t3 = string.charCodeAt(t3);
+        if (i >= t1)
+          H.throwExpression(P.RangeError$value(i));
+        if (t3 !== receiver.charCodeAt(i))
+          return;
+      }
+      return new H.StringMatch(start, string, receiver);
+    },
+    $add: function(receiver, other) {
+      if (typeof other !== "string")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver + other;
+    },
+    endsWith$1: function(receiver, other) {
+      var otherLength, t1;
+      otherLength = other.length;
+      t1 = receiver.length;
+      if (otherLength > t1)
+        return false;
+      return other === this.substring$1(receiver, t1 - otherLength);
+    },
+    replaceAll$2: function(receiver, from, to) {
+      return H.stringReplaceAllUnchecked(receiver, from, to);
+    },
+    split$1: function(receiver, pattern) {
+      if (pattern == null)
+        H.throwExpression(P.ArgumentError$(null));
+      if (typeof pattern === "string")
+        return receiver.split(pattern);
+      else if (!!J.getInterceptor(pattern).$isJSSyntaxRegExp)
+        return receiver.split(pattern._nativeRegExp);
+      else
+        throw H.wrapException("String.split(Pattern) UNIMPLEMENTED");
+    },
+    startsWith$2: function(receiver, pattern, index) {
+      var endIndex;
+      if (index > receiver.length)
+        throw H.wrapException(P.RangeError$range(index, 0, receiver.length));
+      endIndex = index + pattern.length;
+      if (endIndex > receiver.length)
+        return false;
+      return pattern === receiver.substring(index, endIndex);
+    },
+    startsWith$1: function($receiver, pattern) {
+      return this.startsWith$2($receiver, pattern, 0);
+    },
+    substring$2: function(receiver, startIndex, endIndex) {
+      if (typeof startIndex !== "number" || Math.floor(startIndex) !== startIndex)
+        H.throwExpression(P.ArgumentError$(startIndex));
+      if (endIndex == null)
+        endIndex = receiver.length;
+      if (typeof endIndex !== "number" || Math.floor(endIndex) !== endIndex)
+        H.throwExpression(P.ArgumentError$(endIndex));
+      if (startIndex < 0)
+        throw H.wrapException(P.RangeError$value(startIndex));
+      if (typeof endIndex !== "number")
+        return H.iae(endIndex);
+      if (startIndex > endIndex)
+        throw H.wrapException(P.RangeError$value(startIndex));
+      if (endIndex > receiver.length)
+        throw H.wrapException(P.RangeError$value(endIndex));
+      return receiver.substring(startIndex, endIndex);
+    },
+    substring$1: function($receiver, startIndex) {
+      return this.substring$2($receiver, startIndex, null);
+    },
+    toLowerCase$0: function(receiver) {
+      return receiver.toLowerCase();
+    },
+    trim$0: function(receiver) {
+      var result, endIndex, startIndex, t1, endIndex0;
+      result = receiver.trim();
+      endIndex = result.length;
+      if (endIndex === 0)
+        return result;
+      if (this.codeUnitAt$1(result, 0) === 133) {
+        startIndex = J.JSString__skipLeadingWhitespace(result, 1);
+        if (startIndex === endIndex)
+          return "";
+      } else
+        startIndex = 0;
+      t1 = endIndex - 1;
+      endIndex0 = this.codeUnitAt$1(result, t1) === 133 ? J.JSString__skipTrailingWhitespace(result, t1) : endIndex;
+      if (startIndex === 0 && endIndex0 === endIndex)
+        return result;
+      return result.substring(startIndex, endIndex0);
+    },
+    $mul: function(receiver, times) {
+      var s, result;
+      if (typeof times !== "number")
+        return H.iae(times);
+      if (0 >= times)
+        return "";
+      if (times === 1 || receiver.length === 0)
+        return receiver;
+      if (times !== times >>> 0)
+        throw H.wrapException(C.C_OutOfMemoryError);
+      for (s = receiver, result = ""; true;) {
+        if ((times & 1) === 1)
+          result = s + result;
+        times = times >>> 1;
+        if (times === 0)
+          break;
+        s += s;
+      }
+      return result;
+    },
+    indexOf$2: function(receiver, pattern, start) {
+      var t1, match, t2, i;
+      if (pattern == null)
+        H.throwExpression(P.ArgumentError$(null));
+      if (start < 0 || start > receiver.length)
+        throw H.wrapException(P.RangeError$range(start, 0, receiver.length));
+      if (typeof pattern === "string")
+        return receiver.indexOf(pattern, start);
+      t1 = J.getInterceptor(pattern);
+      if (!!t1.$isJSSyntaxRegExp) {
+        match = pattern._execGlobal$2(receiver, start);
+        return match == null ? -1 : match._match.index;
+      }
+      for (t2 = receiver.length, i = start; i <= t2; ++i)
+        if (t1.matchAsPrefix$2(pattern, receiver, i) != null)
+          return i;
+      return -1;
+    },
+    indexOf$1: function($receiver, pattern) {
+      return this.indexOf$2($receiver, pattern, 0);
+    },
+    lastIndexOf$2: function(receiver, pattern, start) {
+      var t1, t2;
+      start = receiver.length;
+      t1 = pattern.length;
+      t2 = receiver.length;
+      if (start + t1 > t2)
+        start = t2 - t1;
+      return receiver.lastIndexOf(pattern, start);
+    },
+    lastIndexOf$1: function($receiver, pattern) {
+      return this.lastIndexOf$2($receiver, pattern, null);
+    },
+    contains$2: function(receiver, other, startIndex) {
+      if (other == null)
+        H.throwExpression(P.ArgumentError$(null));
+      if (startIndex > receiver.length)
+        throw H.wrapException(P.RangeError$range(startIndex, 0, receiver.length));
+      return H.stringContainsUnchecked(receiver, other, startIndex);
+    },
+    contains$1: function($receiver, other) {
+      return this.contains$2($receiver, other, 0);
+    },
+    get$isEmpty: function(receiver) {
+      return receiver.length === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return receiver.length !== 0;
+    },
+    compareTo$1: function(receiver, other) {
+      var t1;
+      if (typeof other !== "string")
+        throw H.wrapException(P.ArgumentError$(other));
+      if (receiver === other)
+        t1 = 0;
+      else
+        t1 = receiver < other ? -1 : 1;
+      return t1;
+    },
+    toString$0: function(receiver) {
+      return receiver;
+    },
+    get$hashCode: function(receiver) {
+      var t1, hash, i;
+      for (t1 = receiver.length, hash = 0, i = 0; i < t1; ++i) {
+        hash = 536870911 & hash + receiver.charCodeAt(i);
+        hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+        hash ^= hash >> 6;
+      }
+      hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+      hash ^= hash >> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_Ejg;
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      return receiver[index];
+    },
+    $isString: true,
+    static: {JSString__isWhitespace: function(codeUnit) {
+        if (codeUnit < 256)
+          switch (codeUnit) {
+            case 9:
+            case 10:
+            case 11:
+            case 12:
+            case 13:
+            case 32:
+            case 133:
+            case 160:
+              return true;
+            default:
+              return false;
+          }
+        switch (codeUnit) {
+          case 5760:
+          case 6158:
+          case 8192:
+          case 8193:
+          case 8194:
+          case 8195:
+          case 8196:
+          case 8197:
+          case 8198:
+          case 8199:
+          case 8200:
+          case 8201:
+          case 8202:
+          case 8232:
+          case 8233:
+          case 8239:
+          case 8287:
+          case 12288:
+          case 65279:
+            return true;
+          default:
+            return false;
+        }
+      }, JSString__skipLeadingWhitespace: function(string, index) {
+        var t1, codeUnit;
+        for (t1 = string.length; index < t1;) {
+          if (index >= t1)
+            H.throwExpression(P.RangeError$value(index));
+          codeUnit = string.charCodeAt(index);
+          if (codeUnit !== 32 && codeUnit !== 13 && !J.JSString__isWhitespace(codeUnit))
+            break;
+          ++index;
+        }
+        return index;
+      }, JSString__skipTrailingWhitespace: function(string, index) {
+        var t1, index0, codeUnit;
+        for (t1 = string.length; index > 0; index = index0) {
+          index0 = index - 1;
+          if (index0 >= t1)
+            H.throwExpression(P.RangeError$value(index0));
+          codeUnit = string.charCodeAt(index0);
+          if (codeUnit !== 32 && codeUnit !== 13 && !J.JSString__isWhitespace(codeUnit))
+            break;
+        }
+        return index;
+      }}
+  }
+}],
+["_isolate_helper", "dart:_isolate_helper", , H, {
+  "^": "",
+  _callInIsolate: function(isolate, $function) {
+    var result = isolate.eval$1(0, $function);
+    init.globalState.topEventLoop.run$0();
+    return result;
+  },
+  leaveJsAsync: function() {
+    --init.globalState.topEventLoop._activeJsAsyncCount;
+  },
+  startRootIsolate: function(entry, args) {
+    var t1, t2, t3, t4, t5, rootContext;
+    t1 = {};
+    t1.args_0 = args;
+    args = args;
+    t1.args_0 = args;
+    if (args == null) {
+      args = [];
+      t1.args_0 = args;
+      t2 = args;
+    } else
+      t2 = args;
+    if (!J.getInterceptor(t2).$isList)
+      throw H.wrapException(P.ArgumentError$("Arguments to main must be a List: " + H.S(t2)));
+    t2 = new H._Manager(0, 0, 1, null, null, null, null, null, null, null, null, null, entry);
+    t2._Manager$1(entry);
+    init.globalState = t2;
+    if (init.globalState.isWorker === true)
+      return;
+    t2 = init.globalState.nextIsolateId++;
+    t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+    t4 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+    t5 = new H.RawReceivePortImpl(0, null, false);
+    rootContext = new H._IsolateContext(t2, t3, t4, new Isolate(), t5, P.Capability_Capability(), P.Capability_Capability(), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+    t4.add$1(0, 0);
+    rootContext._addRegistration$2(0, t5);
+    init.globalState.rootContext = rootContext;
+    init.globalState.currentContext = rootContext;
+    t2 = H.getDynamicRuntimeType();
+    t3 = H.buildFunctionType(t2, [t2])._isTest$1(entry);
+    if (t3)
+      rootContext.eval$1(0, new H.startRootIsolate_closure(t1, entry));
+    else {
+      t2 = H.buildFunctionType(t2, [t2, t2])._isTest$1(entry);
+      if (t2)
+        rootContext.eval$1(0, new H.startRootIsolate_closure0(t1, entry));
+      else
+        rootContext.eval$1(0, entry);
+    }
+    init.globalState.topEventLoop.run$0();
+  },
+  IsolateNatives_computeThisScript: function() {
+    var currentScript = init.currentScript;
+    if (currentScript != null)
+      return String(currentScript.src);
+    if (typeof version == "function" && typeof os == "object" && "system" in os)
+      return H.IsolateNatives_computeThisScriptFromTrace();
+    if (typeof version == "function" && typeof system == "function")
+      return thisFilename();
+    if (init.globalState.isWorker === true)
+      return H.IsolateNatives_computeThisScriptFromTrace();
+    return;
+  },
+  IsolateNatives_computeThisScriptFromTrace: function() {
+    var stack, matches;
+    stack = new Error().stack;
+    if (stack == null) {
+      stack = function() {
+        try {
+          throw new Error();
+        } catch (e) {
+          return e.stack;
+        }
+
+      }();
+      if (stack == null)
+        throw H.wrapException(P.UnsupportedError$("No stack trace"));
+    }
+    matches = stack.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m"));
+    if (matches != null)
+      return matches[1];
+    matches = stack.match(new RegExp("^[^@]*@(.*):[0-9]*$", "m"));
+    if (matches != null)
+      return matches[1];
+    throw H.wrapException(P.UnsupportedError$("Cannot extract URI from \"" + H.S(stack) + "\""));
+  },
+  IsolateNatives__processWorkerMessage: [function(sender, e) {
+    var msg, t1, functionName, entryPoint, args, message, isSpawnUri, startPaused, replyTo, t2, t3, t4, context, replyPort;
+    msg = H._deserializeMessage(e.data);
+    t1 = J.getInterceptor$asx(msg);
+    switch (t1.$index(msg, "command")) {
+      case "start":
+        init.globalState.currentManagerId = t1.$index(msg, "id");
+        functionName = t1.$index(msg, "functionName");
+        entryPoint = functionName == null ? init.globalState.entry : init.globalFunctions[functionName]();
+        args = t1.$index(msg, "args");
+        message = H._deserializeMessage(t1.$index(msg, "msg"));
+        isSpawnUri = t1.$index(msg, "isSpawnUri");
+        startPaused = t1.$index(msg, "startPaused");
+        replyTo = H._deserializeMessage(t1.$index(msg, "replyTo"));
+        t1 = init.globalState.nextIsolateId++;
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+        t3 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+        t4 = new H.RawReceivePortImpl(0, null, false);
+        context = new H._IsolateContext(t1, t2, t3, new Isolate(), t4, P.Capability_Capability(), P.Capability_Capability(), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+        t3.add$1(0, 0);
+        context._addRegistration$2(0, t4);
+        init.globalState.topEventLoop.events._add$1(0, new H._IsolateEvent(context, new H.IsolateNatives__processWorkerMessage_closure(entryPoint, args, message, isSpawnUri, startPaused, replyTo), "worker-start"));
+        init.globalState.currentContext = context;
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "spawn-worker":
+        replyPort = t1.$index(msg, "replyPort");
+        H.IsolateNatives_spawn(t1.$index(msg, "functionName"), t1.$index(msg, "uri"), t1.$index(msg, "args"), t1.$index(msg, "msg"), false, t1.$index(msg, "isSpawnUri"), t1.$index(msg, "startPaused")).then$2$onError(new H.IsolateNatives__processWorkerMessage_closure0(replyPort), new H.IsolateNatives__processWorkerMessage_closure1(replyPort));
+        break;
+      case "message":
+        if (t1.$index(msg, "port") != null)
+          J.send$1$x(t1.$index(msg, "port"), t1.$index(msg, "msg"));
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "close":
+        init.globalState.managers.remove$1(0, $.get$IsolateNatives_workerIds().$index(0, sender));
+        sender.terminate();
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "log":
+        H.IsolateNatives__log(t1.$index(msg, "msg"));
+        break;
+      case "print":
+        if (init.globalState.isWorker === true) {
+          t1 = init.globalState.mainManager;
+          t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "print", "msg", msg], null, null));
+          t1.toString;
+          self.postMessage(t2);
+        } else
+          P.print(t1.$index(msg, "msg"));
+        break;
+      case "error":
+        throw H.wrapException(t1.$index(msg, "msg"));
+    }
+  }, "call$2", "IsolateNatives__processWorkerMessage$closure", 4, 0, null, 0, 1],
+  IsolateNatives__log: function(msg) {
+    var trace, t1, t2, exception;
+    if (init.globalState.isWorker === true) {
+      t1 = init.globalState.mainManager;
+      t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "log", "msg", msg], null, null));
+      t1.toString;
+      self.postMessage(t2);
+    } else
+      try {
+        $.get$globalThis().console.log(msg);
+      } catch (exception) {
+        H.unwrapException(exception);
+        trace = new H._StackTrace(exception, null);
+        throw H.wrapException(P.Exception_Exception(trace));
+      }
+
+  },
+  IsolateNatives_spawn: function(functionName, uri, args, message, isLight, isSpawnUri, startPaused) {
+    var port, completer, signalReply, t1, t2, worker;
+    if (uri != null && J.endsWith$1$s(uri, ".dart"))
+      uri = J.$add$ns(uri, ".js");
+    port = P.ReceivePort_ReceivePort();
+    completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+    port.get$first(port).then$1(new H.IsolateNatives_spawn_closure(completer));
+    signalReply = new H._NativeJsSendPort(port._rawPort, init.globalState.currentContext.id);
+    if (init.globalState.supportsWorkers === true && !isLight)
+      if (init.globalState.isWorker === true) {
+        t1 = init.globalState.mainManager;
+        t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "spawn-worker", "functionName", functionName, "args", args, "msg", message, "uri", uri, "isSpawnUri", isSpawnUri, "startPaused", startPaused, "replyPort", signalReply], null, null));
+        t1.toString;
+        self.postMessage(t2);
+      } else {
+        if (uri == null)
+          uri = $.get$IsolateNatives_thisScript();
+        worker = new Worker(uri);
+        worker.onerror = function(f, u, c) {
+          return function(e) {
+            return f(e, u, c);
+          };
+        }(H.IsolateNatives_workerOnError, uri, new H.IsolateNatives_spawn_closure0(completer));
+        worker.onmessage = function(f, a) {
+          return function(e) {
+            e.onerror = null;
+            return f(a, e);
+          };
+        }(H.IsolateNatives__processWorkerMessage, worker);
+        t1 = init.globalState.nextManagerId++;
+        $.get$IsolateNatives_workerIds().$indexSet(0, worker, t1);
+        init.globalState.managers.$indexSet(0, t1, worker);
+        worker.postMessage(H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "start", "id", t1, "replyTo", H._serializeMessage(signalReply), "args", args, "msg", H._serializeMessage(message), "isSpawnUri", isSpawnUri, "startPaused", startPaused, "functionName", functionName], null, null)));
+      }
+    else
+      H.IsolateNatives__startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply);
+    return completer.future;
+  },
+  IsolateNatives__startNonWorker: function(functionName, uri, args, message, isSpawnUri, startPaused, replyPort) {
+    var t1, t2, t3, t4, t5, t6;
+    t1 = {};
+    t1.args_0 = args;
+    t1.message_1 = message;
+    if (uri != null)
+      throw H.wrapException(P.UnsupportedError$("Currently spawnUri is not supported without web workers."));
+    t1.message_1 = H._serializeMessage(message);
+    t1.args_0 = H._serializeMessage(t1.args_0);
+    t2 = init.globalState.topEventLoop;
+    t3 = init.globalState.nextIsolateId++;
+    t4 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+    t5 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+    t6 = new H.RawReceivePortImpl(0, null, false);
+    t4 = new H._IsolateContext(t3, t4, t5, new Isolate(), t6, P.Capability_Capability(), P.Capability_Capability(), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+    t5.add$1(0, 0);
+    t4._addRegistration$2(0, t6);
+    t2.events._add$1(0, new H._IsolateEvent(t4, new H.IsolateNatives__startNonWorker_closure(t1, functionName, isSpawnUri, startPaused, replyPort), "nonworker start"));
+  },
+  IsolateNatives__startIsolate: function(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
+    var context, t1, t2, t3;
+    context = init.globalState.currentContext;
+    t1 = context.id;
+    $.Primitives_mirrorFunctionCacheName = $.Primitives_mirrorFunctionCacheName + ("_" + t1);
+    $.Primitives_mirrorInvokeCacheName = $.Primitives_mirrorInvokeCacheName + ("_" + t1);
+    t1 = context.controlPort;
+    t2 = init.globalState.currentContext.id;
+    t3 = context.pauseCapability;
+    J.send$1$x(replyTo, ["spawned", new H._NativeJsSendPort(t1, t2), t3, context.terminateCapability]);
+    t2 = new H.IsolateNatives__startIsolate_runStartFunction(topLevel, args, message, isSpawnUri, context);
+    if (startPaused === true) {
+      context.addPause$2(t3, t3);
+      init.globalState.topEventLoop.events._add$1(0, new H._IsolateEvent(context, t2, "start isolate"));
+    } else
+      t2.call$0();
+  },
+  IsolateNatives_workerOnError: [function($event, uri, onError) {
+    var message;
+    $event.preventDefault();
+    message = $event.message;
+    onError.call$1(message == null ? "Error spawning worker for " + H.S(uri) : "Error spawning worker for " + H.S(uri) + " (" + message + ")");
+    return true;
+  }, "call$3", "IsolateNatives_workerOnError$closure", 6, 0, null, 2, 3, 4],
+  _serializeMessage: function(message) {
+    var t1;
+    if (init.globalState.supportsWorkers === true) {
+      t1 = new H._JsSerializer(0, new H._MessageTraverserVisitedMap());
+      t1._visited = new H._JsVisitedMap(null);
+      return t1.traverse$1(message);
+    } else {
+      t1 = new H._JsCopier(new H._MessageTraverserVisitedMap());
+      t1._visited = new H._JsVisitedMap(null);
+      return t1.traverse$1(message);
+    }
+  },
+  _deserializeMessage: function(message) {
+    if (init.globalState.supportsWorkers === true)
+      return new H._JsDeserializer(null).deserialize$1(message);
+    else
+      return message;
+  },
+  _MessageTraverser_isPrimitive: function(x) {
+    return x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean";
+  },
+  _Deserializer_isPrimitive: function(x) {
+    return x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean";
+  },
+  startRootIsolate_closure: {
+    "^": "Closure:69;box_0,entry_1",
+    call$0: function() {
+      this.entry_1.call$1(this.box_0.args_0);
+    },
+    $isFunction: true
+  },
+  startRootIsolate_closure0: {
+    "^": "Closure:69;box_0,entry_2",
+    call$0: function() {
+      this.entry_2.call$2(this.box_0.args_0, null);
+    },
+    $isFunction: true
+  },
+  _Manager: {
+    "^": "Object;nextIsolateId,currentManagerId,nextManagerId,currentContext,rootContext,topEventLoop,fromCommandLine,isWorker,supportsWorkers,isolates<,mainManager,managers,entry<",
+    _Manager$1: function(entry) {
+      var t1, t2, t3, $function;
+      t1 = $.get$globalWindow() == null;
+      t2 = $.get$globalWorker();
+      t3 = t1 && $.get$globalPostMessageDefined() === true;
+      this.isWorker = t3;
+      if (!t3)
+        t2 = t2 != null && $.get$IsolateNatives_thisScript() != null;
+      else
+        t2 = true;
+      this.supportsWorkers = t2;
+      this.fromCommandLine = t1 && !t3;
+      t2 = H._IsolateEvent;
+      t3 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [t2]);
+      t3.ListQueue$1(null, t2);
+      this.topEventLoop = new H._EventLoop(t3, 0);
+      this.isolates = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H._IsolateContext);
+      this.managers = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, null);
+      if (this.isWorker === true) {
+        t1 = new H._MainManagerStub();
+        this.mainManager = t1;
+        $function = function(f, a) {
+          return function(e) {
+            f(a, e);
+          };
+        }(H.IsolateNatives__processWorkerMessage, t1);
+        $.get$globalThis().onmessage = $function;
+        $.get$globalThis().dartPrint = function(object) {
+        };
+      }
+    }
+  },
+  _IsolateContext: {
+    "^": "Object;id>,ports,weakPorts,isolateStatics<,controlPort<,pauseCapability,terminateCapability,initialized?,isPaused<,delayedEvents<,pauseTokens,doneHandlers,_scheduledControlEvents,_isExecutingEvent,errorsAreFatal,errorPorts",
+    addPause$2: function(authentification, resume) {
+      if (!this.pauseCapability.$eq(0, authentification))
+        return;
+      if (this.pauseTokens.add$1(0, resume) && !this.isPaused)
+        this.isPaused = true;
+      this._updateGlobalState$0();
+    },
+    removePause$1: function(resume) {
+      var t1, t2, $event, t3, t4, t5;
+      if (!this.isPaused)
+        return;
+      t1 = this.pauseTokens;
+      t1.remove$1(0, resume);
+      if (t1._collection$_length === 0) {
+        for (t1 = this.delayedEvents; t2 = t1.length, t2 !== 0;) {
+          if (0 >= t2)
+            return H.ioore(t1, 0);
+          $event = t1.pop();
+          t2 = init.globalState.topEventLoop.events;
+          t3 = t2._head;
+          t4 = t2._collection$_table;
+          t5 = t4.length;
+          t3 = (t3 - 1 & t5 - 1) >>> 0;
+          t2._head = t3;
+          if (t3 < 0 || t3 >= t5)
+            return H.ioore(t4, t3);
+          t4[t3] = $event;
+          if (t3 === t2._tail)
+            t2._grow$0();
+          ++t2._modificationCount;
+        }
+        this.isPaused = false;
+      }
+      this._updateGlobalState$0();
+    },
+    addDoneListener$1: function(responsePort) {
+      var t1 = this.doneHandlers;
+      if (t1 == null) {
+        t1 = [];
+        this.doneHandlers = t1;
+      }
+      if (J.contains$1$asx(t1, responsePort))
+        return;
+      this.doneHandlers.push(responsePort);
+    },
+    removeDoneListener$1: function(responsePort) {
+      var t1 = this.doneHandlers;
+      if (t1 == null)
+        return;
+      J.remove$1$ax(t1, responsePort);
+    },
+    setErrorsFatal$2: function(authentification, errorsAreFatal) {
+      if (!this.terminateCapability.$eq(0, authentification))
+        return;
+      this.errorsAreFatal = errorsAreFatal;
+    },
+    handlePing$2: function(responsePort, pingType) {
+      var t1, t2;
+      t1 = J.getInterceptor(pingType);
+      if (!t1.$eq(pingType, 0))
+        t2 = t1.$eq(pingType, 1) && !this._isExecutingEvent;
+      else
+        t2 = true;
+      if (t2) {
+        J.send$1$x(responsePort, null);
+        return;
+      }
+      t2 = new H._IsolateContext_handlePing_respond(responsePort);
+      if (t1.$eq(pingType, 2)) {
+        init.globalState.topEventLoop.events._add$1(0, new H._IsolateEvent(this, t2, "ping"));
+        return;
+      }
+      t1 = this._scheduledControlEvents;
+      if (t1 == null) {
+        t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [null]);
+        t1.ListQueue$1(null, null);
+        this._scheduledControlEvents = t1;
+      }
+      t1._add$1(0, t2);
+    },
+    handleKill$2: function(authentification, priority) {
+      var t1, t2;
+      if (!this.terminateCapability.$eq(0, authentification))
+        return;
+      t1 = J.getInterceptor(priority);
+      if (!t1.$eq(priority, 0))
+        t2 = t1.$eq(priority, 1) && !this._isExecutingEvent;
+      else
+        t2 = true;
+      if (t2) {
+        this.kill$0();
+        return;
+      }
+      if (t1.$eq(priority, 2)) {
+        t1 = init.globalState.topEventLoop;
+        t2 = this.get$kill();
+        t1.events._add$1(0, new H._IsolateEvent(this, t2, "kill"));
+        return;
+      }
+      t1 = this._scheduledControlEvents;
+      if (t1 == null) {
+        t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [null]);
+        t1.ListQueue$1(null, null);
+        this._scheduledControlEvents = t1;
+      }
+      t1._add$1(0, this.get$kill());
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      var t1, message;
+      t1 = this.errorPorts;
+      if (t1._collection$_length === 0) {
+        if (this.errorsAreFatal === true && this === init.globalState.rootContext)
+          return;
+        t1 = $.get$globalThis();
+        if (t1.console != null && typeof t1.console.error == "function")
+          t1.console.error(error, stackTrace);
+        else {
+          P.print(error);
+          if (stackTrace != null)
+            P.print(stackTrace);
+        }
+        return;
+      }
+      message = Array(2);
+      message.fixed$length = init;
+      message[0] = J.toString$0(error);
+      message[1] = stackTrace == null ? null : J.toString$0(stackTrace);
+      for (t1 = H.setRuntimeTypeInfo(new P.LinkedHashSetIterator(t1, t1._modifications, null, null), [null]), t1._cell = t1._set._first; t1.moveNext$0();)
+        J.send$1$x(t1._collection$_current, message);
+    },
+    eval$1: [function(_, code) {
+      var old, result, e, s, exception, t1;
+      old = init.globalState.currentContext;
+      init.globalState.currentContext = this;
+      $ = this.isolateStatics;
+      result = null;
+      this._isExecutingEvent = true;
+      try {
+        result = code.call$0();
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        this.handleUncaughtError$2(e, s);
+        if (this.errorsAreFatal === true) {
+          this.kill$0();
+          if (this === init.globalState.rootContext)
+            throw exception;
+        }
+      }
+ finally {
+        this._isExecutingEvent = false;
+        init.globalState.currentContext = old;
+        if (old != null)
+          $ = old.get$isolateStatics();
+        if (this._scheduledControlEvents != null)
+          for (; t1 = this._scheduledControlEvents, !t1.get$isEmpty(t1);)
+            this._scheduledControlEvents.removeFirst$0().call$0();
+      }
+      return result;
+    }, "call$1", "get$eval", 2, 0, 70, 71],
+    handleControlMessage$1: function(message) {
+      var t1 = J.getInterceptor$asx(message);
+      switch (t1.$index(message, 0)) {
+        case "pause":
+          this.addPause$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "resume":
+          this.removePause$1(t1.$index(message, 1));
+          break;
+        case "add-ondone":
+          this.addDoneListener$1(t1.$index(message, 1));
+          break;
+        case "remove-ondone":
+          this.removeDoneListener$1(t1.$index(message, 1));
+          break;
+        case "set-errors-fatal":
+          this.setErrorsFatal$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "ping":
+          this.handlePing$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "kill":
+          this.handleKill$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "getErrors":
+          this.errorPorts.add$1(0, t1.$index(message, 1));
+          break;
+        case "stopErrors":
+          this.errorPorts.remove$1(0, t1.$index(message, 1));
+          break;
+      }
+    },
+    lookup$1: function(portId) {
+      return this.ports.$index(0, portId);
+    },
+    _addRegistration$2: function(portId, port) {
+      var t1 = this.ports;
+      if (t1.containsKey$1(portId))
+        throw H.wrapException(P.Exception_Exception("Registry: ports must be registered only once."));
+      t1.$indexSet(0, portId, port);
+    },
+    _updateGlobalState$0: function() {
+      if (this.ports._collection$_length - this.weakPorts._collection$_length > 0 || this.isPaused || !this.initialized)
+        init.globalState.isolates.$indexSet(0, this.id, this);
+      else
+        this.kill$0();
+    },
+    kill$0: [function() {
+      var t1, t2;
+      t1 = this._scheduledControlEvents;
+      if (t1 != null)
+        t1.clear$0(0);
+      for (t1 = this.ports, t2 = t1.get$values(t1), t2 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t2._iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0), H.getTypeArgumentByIndex(t2, 1)]); t2.moveNext$0();)
+        t2._current.__isolate_helper$_close$0();
+      t1.clear$0(0);
+      this.weakPorts.clear$0(0);
+      init.globalState.isolates.remove$1(0, this.id);
+      this.errorPorts.clear$0(0);
+      t1 = this.doneHandlers;
+      if (t1 != null) {
+        for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+          J.send$1$x(t1._current, null);
+        this.doneHandlers = null;
+      }
+    }, "call$0", "get$kill", 0, 0, 18],
+    $is_IsolateContext: true
+  },
+  _IsolateContext_handlePing_respond: {
+    "^": "Closure:18;responsePort_0",
+    call$0: [function() {
+      J.send$1$x(this.responsePort_0, null);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _EventLoop: {
+    "^": "Object;events,_activeJsAsyncCount",
+    dequeue$0: function() {
+      var t1 = this.events;
+      if (t1._head === t1._tail)
+        return;
+      return t1.removeFirst$0();
+    },
+    runIteration$0: function() {
+      var $event, t1, t2;
+      $event = this.dequeue$0();
+      if ($event == null) {
+        if (init.globalState.rootContext != null && init.globalState.isolates.containsKey$1(init.globalState.rootContext.id) && init.globalState.fromCommandLine === true && init.globalState.rootContext.ports._collection$_length === 0)
+          H.throwExpression(P.Exception_Exception("Program exited with open ReceivePorts."));
+        t1 = init.globalState;
+        if (t1.isWorker === true && t1.isolates._collection$_length === 0 && t1.topEventLoop._activeJsAsyncCount === 0) {
+          t1 = t1.mainManager;
+          t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "close"], null, null));
+          t1.toString;
+          self.postMessage(t2);
+        }
+        return false;
+      }
+      J.process$0$x($event);
+      return true;
+    },
+    _runHelper$0: function() {
+      if ($.get$globalWindow() != null)
+        new H._EventLoop__runHelper_next(this).call$0();
+      else
+        for (; this.runIteration$0();)
+          ;
+    },
+    run$0: function() {
+      var e, trace, exception, t1, t2;
+      if (init.globalState.isWorker !== true)
+        this._runHelper$0();
+      else
+        try {
+          this._runHelper$0();
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          trace = new H._StackTrace(exception, null);
+          t1 = init.globalState.mainManager;
+          t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "error", "msg", H.S(e) + "\n" + H.S(trace)], null, null));
+          t1.toString;
+          self.postMessage(t2);
+        }
+
+    }
+  },
+  _EventLoop__runHelper_next: {
+    "^": "Closure:18;this_0",
+    call$0: [function() {
+      if (!this.this_0.runIteration$0())
+        return;
+      P.Timer_Timer(C.Duration_0, this);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _IsolateEvent: {
+    "^": "Object;isolate*,fn,message>",
+    process$0: [function(_) {
+      if (this.isolate.get$isPaused()) {
+        this.isolate.get$delayedEvents().push(this);
+        return;
+      }
+      J.eval$1$x(this.isolate, this.fn);
+    }, "call$0", "get$process", 0, 0, 18],
+    $is_IsolateEvent: true
+  },
+  _MainManagerStub: {
+    "^": "Object;"
+  },
+  IsolateNatives__processWorkerMessage_closure: {
+    "^": "Closure:69;entryPoint_0,args_1,message_2,isSpawnUri_3,startPaused_4,replyTo_5",
+    call$0: [function() {
+      H.IsolateNatives__startIsolate(this.entryPoint_0, this.args_1, this.message_2, this.isSpawnUri_3, this.startPaused_4, this.replyTo_5);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__processWorkerMessage_closure0: {
+    "^": "Closure:13;replyPort_6",
+    call$1: [function(msg) {
+      J.send$1$x(this.replyPort_6, msg);
+    }, "call$1", null, 2, 0, null, 72, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__processWorkerMessage_closure1: {
+    "^": "Closure:5;replyPort_7",
+    call$1: [function(errorMessage) {
+      J.send$1$x(this.replyPort_7, ["spawn failed", errorMessage]);
+    }, "call$1", null, 2, 0, null, 73, "call"],
+    $isFunction: true
+  },
+  IsolateNatives_spawn_closure: {
+    "^": "Closure:13;completer_0",
+    call$1: [function(msg) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(msg);
+      t2 = this.completer_0;
+      if (J.$eq(t1.$index(msg, 0), "spawned")) {
+        t1 = t2.future;
+        if (t1._state !== 0)
+          H.throwExpression(P.StateError$("Future already completed"));
+        t1._asyncComplete$1(msg);
+      } else
+        t2.completeError$1(t1.$index(msg, 1));
+    }, "call$1", null, 2, 0, null, 72, "call"],
+    $isFunction: true
+  },
+  IsolateNatives_spawn_closure0: {
+    "^": "Closure:5;completer_1",
+    call$1: [function(message) {
+      return this.completer_1.completeError$1(message);
+    }, "call$1", null, 2, 0, null, 74, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__startNonWorker_closure: {
+    "^": "Closure:69;box_0,functionName_1,isSpawnUri_2,startPaused_3,replyPort_4",
+    call$0: [function() {
+      var t1 = this.box_0;
+      H.IsolateNatives__startIsolate(init.globalFunctions[this.functionName_1](), t1.args_0, t1.message_1, this.isSpawnUri_2, this.startPaused_3, this.replyPort_4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__startIsolate_runStartFunction: {
+    "^": "Closure:18;topLevel_0,args_1,message_2,isSpawnUri_3,context_4",
+    call$0: [function() {
+      var t1, t2, t3;
+      this.context_4.set$initialized(true);
+      if (this.isSpawnUri_3 !== true)
+        this.topLevel_0.call$1(this.message_2);
+      else {
+        t1 = this.topLevel_0;
+        t2 = H.getDynamicRuntimeType();
+        t3 = H.buildFunctionType(t2, [t2, t2])._isTest$1(t1);
+        if (t3)
+          t1.call$2(this.args_1, this.message_2);
+        else {
+          t2 = H.buildFunctionType(t2, [t2])._isTest$1(t1);
+          if (t2)
+            t1.call$1(this.args_1);
+          else
+            t1.call$0();
+        }
+      }
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BaseSendPort: {
+    "^": "Object;",
+    $isSendPort: true,
+    $isCapability: true
+  },
+  _NativeJsSendPort: {
+    "^": "_BaseSendPort;_receivePort,_isolateId",
+    send$1: function(_, message) {
+      var t1, t2, isolate, t3, shouldSerialize;
+      t1 = {};
+      t2 = this._isolateId;
+      isolate = init.globalState.isolates.$index(0, t2);
+      if (isolate == null)
+        return;
+      t3 = this._receivePort;
+      if (t3.get$_isClosed())
+        return;
+      shouldSerialize = init.globalState.currentContext != null && init.globalState.currentContext.id !== t2;
+      t1.msg_0 = message;
+      if (shouldSerialize)
+        t1.msg_0 = H._serializeMessage(message);
+      if (isolate.get$controlPort() === t3) {
+        isolate.handleControlMessage$1(t1.msg_0);
+        return;
+      }
+      t2 = init.globalState.topEventLoop;
+      t3 = "receive " + H.S(message);
+      t2.events._add$1(0, new H._IsolateEvent(isolate, new H._NativeJsSendPort_send_closure(t1, this, shouldSerialize), t3));
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$is_NativeJsSendPort && J.$eq(this._receivePort, other._receivePort);
+    },
+    get$hashCode: function(_) {
+      return J.get$__isolate_helper$_id$x(this._receivePort);
+    },
+    $is_NativeJsSendPort: true,
+    $isSendPort: true,
+    $isCapability: true
+  },
+  _NativeJsSendPort_send_closure: {
+    "^": "Closure:69;box_0,this_1,shouldSerialize_2",
+    call$0: [function() {
+      var t1, t2;
+      t1 = this.this_1._receivePort;
+      if (!t1.get$_isClosed()) {
+        if (this.shouldSerialize_2) {
+          t2 = this.box_0;
+          t2.msg_0 = H._deserializeMessage(t2.msg_0);
+        }
+        J.__isolate_helper$_add$1$x(t1, this.box_0.msg_0);
+      }
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _WorkerSendPort: {
+    "^": "_BaseSendPort;_workerId,_receivePortId,_isolateId",
+    send$1: function(_, message) {
+      var workerMessage, manager;
+      workerMessage = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "message", "port", this, "msg", message], null, null));
+      if (init.globalState.isWorker === true) {
+        init.globalState.mainManager.toString;
+        self.postMessage(workerMessage);
+      } else {
+        manager = init.globalState.managers.$index(0, this._workerId);
+        if (manager != null)
+          manager.postMessage(workerMessage);
+      }
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$is_WorkerSendPort && J.$eq(this._workerId, other._workerId) && J.$eq(this._isolateId, other._isolateId) && J.$eq(this._receivePortId, other._receivePortId);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.$shl$n(this._workerId, 16);
+      t2 = J.$shl$n(this._isolateId, 8);
+      t3 = this._receivePortId;
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      return (t1 ^ t2 ^ t3) >>> 0;
+    },
+    $is_WorkerSendPort: true,
+    $isSendPort: true,
+    $isCapability: true
+  },
+  RawReceivePortImpl: {
+    "^": "Object;__isolate_helper$_id>,_handler,_isClosed<",
+    _handler$1: function(arg0) {
+      return this._handler.call$1(arg0);
+    },
+    __isolate_helper$_close$0: function() {
+      this._isClosed = true;
+      this._handler = null;
+    },
+    close$0: function(_) {
+      var t1, t2;
+      if (this._isClosed)
+        return;
+      this._isClosed = true;
+      this._handler = null;
+      t1 = init.globalState.currentContext;
+      t2 = this.__isolate_helper$_id;
+      t1.ports.remove$1(0, t2);
+      t1.weakPorts.remove$1(0, t2);
+      t1._updateGlobalState$0();
+    },
+    __isolate_helper$_add$1: function(_, dataEvent) {
+      if (this._isClosed)
+        return;
+      this._handler$1(dataEvent);
+    },
+    $isRawReceivePortImpl: true,
+    static: {"^": "RawReceivePortImpl__nextFreeId"}
+  },
+  ReceivePortImpl: {
+    "^": "Stream;_rawPort,__isolate_helper$_controller",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var t1 = this.__isolate_helper$_controller;
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._ControllerStream(t1), [null]).listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError);
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    close$0: [function(_) {
+      this._rawPort.close$0(0);
+      this.__isolate_helper$_controller.close$0(0);
+    }, "call$0", "get$close", 0, 0, 18],
+    ReceivePortImpl$fromRawReceivePort$1: function(_rawPort) {
+      var t1 = P.StreamController_StreamController(this.get$close(this), null, null, null, true, null);
+      this.__isolate_helper$_controller = t1;
+      this._rawPort._handler = t1.get$add(t1);
+    },
+    $asStream: function() {
+      return [null];
+    },
+    $isStream: true
+  },
+  _JsSerializer: {
+    "^": "_Serializer;_nextFreeRefId,_visited",
+    visitSendPort$1: function(x) {
+      if (!!x.$is_NativeJsSendPort)
+        return ["sendport", init.globalState.currentManagerId, x._isolateId, J.get$__isolate_helper$_id$x(x._receivePort)];
+      if (!!x.$is_WorkerSendPort)
+        return ["sendport", x._workerId, x._isolateId, x._receivePortId];
+      throw H.wrapException("Illegal underlying port " + x.toString$0(0));
+    },
+    visitCapability$1: function(x) {
+      if (!!x.$isCapabilityImpl)
+        return ["capability", x.__isolate_helper$_id];
+      throw H.wrapException("Capability not serializable: " + x.toString$0(0));
+    }
+  },
+  _JsCopier: {
+    "^": "_Copier;_visited",
+    visitSendPort$1: function(x) {
+      if (!!x.$is_NativeJsSendPort)
+        return new H._NativeJsSendPort(x._receivePort, x._isolateId);
+      if (!!x.$is_WorkerSendPort)
+        return new H._WorkerSendPort(x._workerId, x._receivePortId, x._isolateId);
+      throw H.wrapException("Illegal underlying port " + x.toString$0(0));
+    },
+    visitCapability$1: function(x) {
+      if (!!x.$isCapabilityImpl)
+        return new H.CapabilityImpl(x.__isolate_helper$_id);
+      throw H.wrapException("Capability not serializable: " + x.toString$0(0));
+    }
+  },
+  _JsDeserializer: {
+    "^": "_Deserializer;_deserialized",
+    deserializeSendPort$1: function(list) {
+      var t1, managerId, isolateId, receivePortId, isolate, receivePort;
+      t1 = J.getInterceptor$asx(list);
+      managerId = t1.$index(list, 1);
+      isolateId = t1.$index(list, 2);
+      receivePortId = t1.$index(list, 3);
+      if (J.$eq(managerId, init.globalState.currentManagerId)) {
+        isolate = init.globalState.isolates.$index(0, isolateId);
+        if (isolate == null)
+          return;
+        receivePort = isolate.lookup$1(receivePortId);
+        if (receivePort == null)
+          return;
+        return new H._NativeJsSendPort(receivePort, isolateId);
+      } else
+        return new H._WorkerSendPort(managerId, receivePortId, isolateId);
+    },
+    deserializeCapability$1: function(list) {
+      return new H.CapabilityImpl(J.$index$asx(list, 1));
+    }
+  },
+  _JsVisitedMap: {
+    "^": "Object;tagged",
+    $index: function(_, object) {
+      return object.__MessageTraverser__attached_info__;
+    },
+    $indexSet: function(_, object, info) {
+      this.tagged.push(object);
+      object.__MessageTraverser__attached_info__ = info;
+    },
+    reset$0: function(_) {
+      this.tagged = [];
+    },
+    cleanup$0: function() {
+      var $length, i, t1;
+      for ($length = this.tagged.length, i = 0; i < $length; ++i) {
+        t1 = this.tagged;
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t1[i].__MessageTraverser__attached_info__ = null;
+      }
+      this.tagged = null;
+    }
+  },
+  _MessageTraverserVisitedMap: {
+    "^": "Object;",
+    $index: function(_, object) {
+      return;
+    },
+    $indexSet: function(_, object, info) {
+    },
+    reset$0: function(_) {
+    },
+    cleanup$0: function() {
+    }
+  },
+  _MessageTraverser: {
+    "^": "Object;",
+    traverse$1: function(x) {
+      var result;
+      if (H._MessageTraverser_isPrimitive(x))
+        return this.visitPrimitive$1(x);
+      this._visited.reset$0(0);
+      result = null;
+      try {
+        result = this._dispatch$1(x);
+      } finally {
+        this._visited.cleanup$0();
+      }
+      return result;
+    },
+    _dispatch$1: function(x) {
+      var t1;
+      if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
+        return this.visitPrimitive$1(x);
+      t1 = J.getInterceptor(x);
+      if (!!t1.$isList)
+        return this.visitList$1(x);
+      if (!!t1.$isMap)
+        return this.visitMap$1(x);
+      if (!!t1.$isSendPort)
+        return this.visitSendPort$1(x);
+      if (!!t1.$isCapability)
+        return this.visitCapability$1(x);
+      return this.visitObject$1(x);
+    },
+    visitObject$1: function(x) {
+      throw H.wrapException("Message serialization: Illegal value " + H.S(x) + " passed");
+    }
+  },
+  _Copier: {
+    "^": "_MessageTraverser;",
+    visitPrimitive$1: function(x) {
+      return x;
+    },
+    visitList$1: function(list) {
+      var copy, t1, len, i;
+      copy = this._visited.$index(0, list);
+      if (copy != null)
+        return copy;
+      t1 = J.getInterceptor$asx(list);
+      len = t1.get$length(list);
+      copy = Array(len);
+      copy.fixed$length = init;
+      this._visited.$indexSet(0, list, copy);
+      for (i = 0; i < len; ++i)
+        copy[i] = this._dispatch$1(t1.$index(list, i));
+      return copy;
+    },
+    visitMap$1: function(map) {
+      var t1, copy;
+      t1 = {};
+      copy = this._visited.$index(0, map);
+      t1.copy_0 = copy;
+      if (copy != null)
+        return copy;
+      copy = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+      t1.copy_0 = copy;
+      this._visited.$indexSet(0, map, copy);
+      map.forEach$1(0, new H._Copier_visitMap_closure(t1, this));
+      return t1.copy_0;
+    },
+    visitSendPort$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    },
+    visitCapability$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    }
+  },
+  _Copier_visitMap_closure: {
+    "^": "Closure:75;box_0,this_1",
+    call$2: function(key, val) {
+      var t1 = this.this_1;
+      J.$indexSet$ax(this.box_0.copy_0, t1._dispatch$1(key), t1._dispatch$1(val));
+    },
+    $isFunction: true
+  },
+  _Serializer: {
+    "^": "_MessageTraverser;",
+    visitPrimitive$1: function(x) {
+      return x;
+    },
+    visitList$1: function(list) {
+      var copyId, t1;
+      copyId = this._visited.$index(0, list);
+      if (copyId != null)
+        return ["ref", copyId];
+      t1 = this._nextFreeRefId++;
+      this._visited.$indexSet(0, list, t1);
+      return ["list", t1, this._serializeList$1(list)];
+    },
+    visitMap$1: function(map) {
+      var copyId, t1;
+      copyId = this._visited.$index(0, map);
+      if (copyId != null)
+        return ["ref", copyId];
+      t1 = this._nextFreeRefId++;
+      this._visited.$indexSet(0, map, t1);
+      return ["map", t1, this._serializeList$1(J.toList$0$ax(map.get$keys())), this._serializeList$1(J.toList$0$ax(map.get$values(map)))];
+    },
+    _serializeList$1: function(list) {
+      var t1, len, result, i, t2;
+      t1 = J.getInterceptor$asx(list);
+      len = t1.get$length(list);
+      result = [];
+      C.JSArray_methods.set$length(result, len);
+      for (i = 0; i < len; ++i) {
+        t2 = this._dispatch$1(t1.$index(list, i));
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t2;
+      }
+      return result;
+    },
+    visitSendPort$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    },
+    visitCapability$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    }
+  },
+  _Deserializer: {
+    "^": "Object;",
+    deserialize$1: function(x) {
+      if (H._Deserializer_isPrimitive(x))
+        return x;
+      this._deserialized = P.HashMap_HashMap(null, null, null, null, null);
+      return this._deserializeHelper$1(x);
+    },
+    _deserializeHelper$1: function(x) {
+      var t1, id;
+      if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
+        return x;
+      t1 = J.getInterceptor$asx(x);
+      switch (t1.$index(x, 0)) {
+        case "ref":
+          id = t1.$index(x, 1);
+          return this._deserialized.$index(0, id);
+        case "list":
+          return this._deserializeList$1(x);
+        case "map":
+          return this._deserializeMap$1(x);
+        case "sendport":
+          return this.deserializeSendPort$1(x);
+        case "capability":
+          return this.deserializeCapability$1(x);
+        default:
+          return this.deserializeObject$1(x);
+      }
+    },
+    _deserializeList$1: function(x) {
+      var t1, id, dartList, len, i;
+      t1 = J.getInterceptor$asx(x);
+      id = t1.$index(x, 1);
+      dartList = t1.$index(x, 2);
+      this._deserialized.$indexSet(0, id, dartList);
+      t1 = J.getInterceptor$asx(dartList);
+      len = t1.get$length(dartList);
+      if (typeof len !== "number")
+        return H.iae(len);
+      i = 0;
+      for (; i < len; ++i)
+        t1.$indexSet(dartList, i, this._deserializeHelper$1(t1.$index(dartList, i)));
+      return dartList;
+    },
+    _deserializeMap$1: function(x) {
+      var result, t1, id, keys, values, len, t2, i;
+      result = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+      t1 = J.getInterceptor$asx(x);
+      id = t1.$index(x, 1);
+      this._deserialized.$indexSet(0, id, result);
+      keys = t1.$index(x, 2);
+      values = t1.$index(x, 3);
+      t1 = J.getInterceptor$asx(keys);
+      len = t1.get$length(keys);
+      if (typeof len !== "number")
+        return H.iae(len);
+      t2 = J.getInterceptor$asx(values);
+      i = 0;
+      for (; i < len; ++i)
+        result.$indexSet(0, this._deserializeHelper$1(t1.$index(keys, i)), this._deserializeHelper$1(t2.$index(values, i)));
+      return result;
+    },
+    deserializeObject$1: function(x) {
+      throw H.wrapException("Unexpected serialized object");
+    }
+  },
+  TimerImpl: {
+    "^": "Object;_once,_inEventLoop,_handle",
+    cancel$0: function() {
+      if ($.get$globalThis().setTimeout != null) {
+        if (this._inEventLoop)
+          throw H.wrapException(P.UnsupportedError$("Timer in event loop cannot be canceled."));
+        if (this._handle == null)
+          return;
+        H.leaveJsAsync();
+        if (this._once)
+          $.get$globalThis().clearTimeout(this._handle);
+        else
+          $.get$globalThis().clearInterval(this._handle);
+        this._handle = null;
+      } else
+        throw H.wrapException(P.UnsupportedError$("Canceling a timer."));
+    },
+    TimerImpl$2: function(milliseconds, callback) {
+      var t1, t2;
+      if (milliseconds === 0)
+        t1 = $.get$globalThis().setTimeout == null || init.globalState.isWorker === true;
+      else
+        t1 = false;
+      if (t1) {
+        this._handle = 1;
+        t1 = init.globalState.topEventLoop;
+        t2 = init.globalState.currentContext;
+        t1.events._add$1(0, new H._IsolateEvent(t2, new H.TimerImpl_internalCallback(this, callback), "timer"));
+        this._inEventLoop = true;
+      } else {
+        t1 = $.get$globalThis();
+        if (t1.setTimeout != null) {
+          ++init.globalState.topEventLoop._activeJsAsyncCount;
+          this._handle = t1.setTimeout(H.convertDartClosureToJS(new H.TimerImpl_internalCallback0(this, callback), 0), milliseconds);
+        } else
+          throw H.wrapException(P.UnsupportedError$("Timer greater than 0."));
+      }
+    },
+    static: {TimerImpl$: function(milliseconds, callback) {
+        var t1 = new H.TimerImpl(true, false, null);
+        t1.TimerImpl$2(milliseconds, callback);
+        return t1;
+      }}
+  },
+  TimerImpl_internalCallback: {
+    "^": "Closure:18;this_0,callback_1",
+    call$0: [function() {
+      this.this_0._handle = null;
+      this.callback_1.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  TimerImpl_internalCallback0: {
+    "^": "Closure:18;this_2,callback_3",
+    call$0: [function() {
+      this.this_2._handle = null;
+      H.leaveJsAsync();
+      this.callback_3.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  CapabilityImpl: {
+    "^": "Object;__isolate_helper$_id>",
+    get$hashCode: function(_) {
+      var hash, t1, t2;
+      hash = this.__isolate_helper$_id;
+      t1 = J.getInterceptor$n(hash);
+      t2 = t1.$shr(hash, 0);
+      t1 = t1.$tdiv(hash, 4294967296);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      hash = t2 ^ t1;
+      hash = (~hash >>> 0) + (hash << 15 >>> 0) & 4294967295;
+      hash = ((hash ^ hash >>> 12) >>> 0) * 5 & 4294967295;
+      hash = ((hash ^ hash >>> 4) >>> 0) * 2057 & 4294967295;
+      return (hash ^ hash >>> 16) >>> 0;
+    },
+    $eq: function(_, other) {
+      var t1, t2;
+      if (other == null)
+        return false;
+      if (other === this)
+        return true;
+      if (!!J.getInterceptor(other).$isCapabilityImpl) {
+        t1 = this.__isolate_helper$_id;
+        t2 = other.__isolate_helper$_id;
+        return t1 == null ? t2 == null : t1 === t2;
+      }
+      return false;
+    },
+    $isCapabilityImpl: true,
+    $isCapability: true
+  }
+}],
+["_js_helper", "dart:_js_helper", , H, {
+  "^": "",
+  isJsIndexable: function(object, record) {
+    var result;
+    if (record != null) {
+      result = record.x;
+      if (result != null)
+        return result;
+    }
+    return !!J.getInterceptor(object).$isJavaScriptIndexingBehavior;
+  },
+  S: function(value) {
+    var res;
+    if (typeof value === "string")
+      return value;
+    if (typeof value === "number") {
+      if (value !== 0)
+        return "" + value;
+    } else if (true === value)
+      return "true";
+    else if (false === value)
+      return "false";
+    else if (value == null)
+      return "null";
+    res = J.toString$0(value);
+    if (typeof res !== "string")
+      throw H.wrapException(P.ArgumentError$(value));
+    return res;
+  },
+  Primitives_objectHashCode: function(object) {
+    var hash = object.$identityHash;
+    if (hash == null) {
+      hash = Math.random() * 0x3fffffff | 0;
+      object.$identityHash = hash;
+    }
+    return hash;
+  },
+  Primitives__throwFormatException: [function(string) {
+    throw H.wrapException(P.FormatException$(string));
+  }, "call$1", "Primitives__throwFormatException$closure", 2, 0, 5],
+  Primitives_parseInt: function(source, radix, handleError) {
+    var match, t1, maxCharCode, digitsPart, i, t2;
+    if (handleError == null)
+      handleError = H.Primitives__throwFormatException$closure();
+    if (typeof source !== "string")
+      H.throwExpression(P.ArgumentError$(source));
+    match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
+    if (radix == null) {
+      if (match != null) {
+        t1 = match.length;
+        if (2 >= t1)
+          return H.ioore(match, 2);
+        if (match[2] != null)
+          return parseInt(source, 16);
+        if (3 >= t1)
+          return H.ioore(match, 3);
+        if (match[3] != null)
+          return parseInt(source, 10);
+        return handleError.call$1(source);
+      }
+      radix = 10;
+    } else {
+      if (radix < 2 || radix > 36)
+        throw H.wrapException(P.RangeError$("Radix " + H.S(radix) + " not in range 2..36"));
+      if (match != null) {
+        if (radix === 10) {
+          if (3 >= match.length)
+            return H.ioore(match, 3);
+          t1 = match[3] != null;
+        } else
+          t1 = false;
+        if (t1)
+          return parseInt(source, 10);
+        if (!(radix < 10)) {
+          if (3 >= match.length)
+            return H.ioore(match, 3);
+          t1 = match[3] == null;
+        } else
+          t1 = true;
+        if (t1) {
+          maxCharCode = radix <= 10 ? 48 + radix - 1 : 97 + radix - 10 - 1;
+          if (1 >= match.length)
+            return H.ioore(match, 1);
+          digitsPart = match[1];
+          t1 = J.getInterceptor$asx(digitsPart);
+          i = 0;
+          while (true) {
+            t2 = t1.get$length(digitsPart);
+            if (typeof t2 !== "number")
+              return H.iae(t2);
+            if (!(i < t2))
+              break;
+            t1.codeUnitAt$1(digitsPart, 0);
+            if (t1.codeUnitAt$1(digitsPart, i) > maxCharCode)
+              return handleError.call$1(source);
+            ++i;
+          }
+        }
+      }
+    }
+    if (match == null)
+      return handleError.call$1(source);
+    return parseInt(source, radix);
+  },
+  Primitives_parseDouble: function(source, handleError) {
+    var result, trimmed;
+    if (typeof source !== "string")
+      H.throwExpression(P.ArgumentError$(source));
+    if (handleError == null)
+      handleError = H.Primitives__throwFormatException$closure();
+    if (!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(source))
+      return handleError.call$1(source);
+    result = parseFloat(source);
+    if (isNaN(result)) {
+      trimmed = J.trim$0$s(source);
+      if (trimmed === "NaN" || trimmed === "+NaN" || trimmed === "-NaN")
+        return result;
+      return handleError.call$1(source);
+    }
+    return result;
+  },
+  Primitives_objectTypeName: function(object) {
+    var $name, decompiled;
+    $name = C.JS_CONST_8ZY(J.getInterceptor(object));
+    if ($name === "Object") {
+      decompiled = String(object.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1];
+      if (typeof decompiled === "string")
+        $name = /^\w+$/.test(decompiled) ? decompiled : $name;
+    }
+    if ($name.length > 1 && C.JSString_methods.codeUnitAt$1($name, 0) === 36)
+      $name = C.JSString_methods.substring$1($name, 1);
+    return ($name + H.joinArguments(H.getRuntimeTypeInfo(object), 0, null)).replace(/[^<,> ]+/g, function(m) {
+      return init.mangledGlobalNames[m] || m;
+    });
+  },
+  Primitives_objectToString: function(object) {
+    return "Instance of '" + H.Primitives_objectTypeName(object) + "'";
+  },
+  Primitives_numMicroseconds: function() {
+    if (typeof window != "undefined" && window !== null) {
+      var performance = window.performance;
+      if (performance != null && typeof performance.webkitNow == "function")
+        return C.JSNumber_methods.toInt$0(Math.floor(1000 * performance.webkitNow()));
+    }
+    return 1000 * Date.now();
+  },
+  Primitives__fromCharCodeApply: function(array) {
+    var end, t1, result, i, subarray, t2;
+    end = array.length;
+    for (t1 = end <= 500, result = "", i = 0; i < end; i += 500) {
+      if (t1)
+        subarray = array;
+      else {
+        t2 = i + 500;
+        t2 = t2 < end ? t2 : end;
+        subarray = array.slice(i, t2);
+      }
+      result += String.fromCharCode.apply(null, subarray);
+    }
+    return result;
+  },
+  Primitives_stringFromCodePoints: function(codePoints) {
+    var a, t1, i;
+    a = [];
+    a.$builtinTypeInfo = [P.$int];
+    t1 = new H.ListIterator(codePoints, codePoints.length, 0, null);
+    t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(codePoints, 0)];
+    for (; t1.moveNext$0();) {
+      i = t1._current;
+      if (typeof i !== "number" || Math.floor(i) !== i)
+        throw H.wrapException(P.ArgumentError$(i));
+      if (i <= 65535)
+        a.push(i);
+      else if (i <= 1114111) {
+        a.push(55296 + (C.JSInt_methods._shrOtherPositive$1(i - 65536, 10) & 1023));
+        a.push(56320 + (i & 1023));
+      } else
+        throw H.wrapException(P.ArgumentError$(i));
+    }
+    return H.Primitives__fromCharCodeApply(a);
+  },
+  Primitives_stringFromCharCodes: function(charCodes) {
+    var t1, i;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(charCodes, charCodes.length, 0, null), [H.getTypeArgumentByIndex(charCodes, 0)]); t1.moveNext$0();) {
+      i = t1._current;
+      if (typeof i !== "number" || Math.floor(i) !== i)
+        throw H.wrapException(P.ArgumentError$(i));
+      if (i < 0)
+        throw H.wrapException(P.ArgumentError$(i));
+      if (i > 65535)
+        return H.Primitives_stringFromCodePoints(charCodes);
+    }
+    return H.Primitives__fromCharCodeApply(charCodes);
+  },
+  Primitives_stringFromCharCode: function(charCode) {
+    var bits;
+    if (typeof charCode !== "number")
+      return H.iae(charCode);
+    if (0 <= charCode) {
+      if (charCode <= 65535)
+        return String.fromCharCode(charCode);
+      if (charCode <= 1114111) {
+        bits = charCode - 65536;
+        return String.fromCharCode((55296 | C.JSNumber_methods._shrOtherPositive$1(bits, 10)) >>> 0, (56320 | bits & 1023) >>> 0);
+      }
+    }
+    throw H.wrapException(P.RangeError$range(charCode, 0, 1114111));
+  },
+  Primitives_valueFromDecomposedDate: function(years, month, day, hours, minutes, seconds, milliseconds, isUtc) {
+    var jsMonth, value, t1, date;
+    if (typeof years !== "number" || Math.floor(years) !== years)
+      H.throwExpression(P.ArgumentError$(years));
+    if (typeof month !== "number" || Math.floor(month) !== month)
+      H.throwExpression(P.ArgumentError$(month));
+    if (typeof day !== "number" || Math.floor(day) !== day)
+      H.throwExpression(P.ArgumentError$(day));
+    if (typeof hours !== "number" || Math.floor(hours) !== hours)
+      H.throwExpression(P.ArgumentError$(hours));
+    if (typeof minutes !== "number" || Math.floor(minutes) !== minutes)
+      H.throwExpression(P.ArgumentError$(minutes));
+    if (typeof seconds !== "number" || Math.floor(seconds) !== seconds)
+      H.throwExpression(P.ArgumentError$(seconds));
+    jsMonth = J.$sub$n(month, 1);
+    value = isUtc ? Date.UTC(years, jsMonth, day, hours, minutes, seconds, milliseconds) : new Date(years, jsMonth, day, hours, minutes, seconds, milliseconds).valueOf();
+    if (isNaN(value) || value < -8640000000000000 || value > 8640000000000000)
+      throw H.wrapException(P.ArgumentError$(null));
+    t1 = J.getInterceptor$n(years);
+    if (t1.$le(years, 0) || t1.$lt(years, 100)) {
+      date = new Date(value);
+      if (isUtc)
+        date.setUTCFullYear(years);
+      else
+        date.setFullYear(years);
+      return date.valueOf();
+    }
+    return value;
+  },
+  Primitives_lazyAsJsDate: function(receiver) {
+    if (receiver.date === void 0)
+      receiver.date = new Date(receiver.millisecondsSinceEpoch);
+    return receiver.date;
+  },
+  Primitives_getProperty: function(object, key) {
+    if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
+      throw H.wrapException(P.ArgumentError$(object));
+    return object[key];
+  },
+  Primitives_setProperty: function(object, key, value) {
+    if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
+      throw H.wrapException(P.ArgumentError$(object));
+    object[key] = value;
+  },
+  Primitives_functionNoSuchMethod: function($function, positionalArguments, namedArguments) {
+    var t1, $arguments, namedArgumentList;
+    t1 = {};
+    t1.argumentCount_0 = 0;
+    $arguments = [];
+    namedArgumentList = [];
+    if (positionalArguments != null) {
+      t1.argumentCount_0 = positionalArguments.length;
+      C.JSArray_methods.addAll$1($arguments, positionalArguments);
+    }
+    t1.names_1 = "";
+    if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments))
+      namedArguments.forEach$1(0, new H.Primitives_functionNoSuchMethod_closure(t1, $arguments, namedArgumentList));
+    return J.noSuchMethod$1($function, new H.JSInvocationMirror(C.Symbol_call, "call$" + t1.argumentCount_0 + t1.names_1, 0, $arguments, namedArgumentList, null));
+  },
+  Primitives_applyFunction: function($function, positionalArguments, namedArguments) {
+    var t1, jsFunction, info, t2, defaultArguments, t3, i, index, $arguments, argumentCount;
+    t1 = {};
+    if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments)) {
+      jsFunction = J.getInterceptor($function)["call*"];
+      if (jsFunction == null)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      info = H.ReflectionInfo_ReflectionInfo(jsFunction);
+      if (info == null || !info.areOptionalParametersNamed)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      positionalArguments = positionalArguments != null ? P.List_List$from(positionalArguments, true, null) : [];
+      t2 = info.requiredParameterCount;
+      if (t2 !== positionalArguments.length)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      defaultArguments = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+      for (t3 = info.optionalParameterCount, i = 0; i < t3; ++i) {
+        index = i + t2;
+        defaultArguments.$indexSet(0, info.parameterNameInOrder$1(index), init.metadata[info.defaultValueInOrder$1(index)]);
+      }
+      t1.bad_0 = false;
+      namedArguments.forEach$1(0, new H.Primitives_applyFunction_closure(t1, defaultArguments));
+      if (t1.bad_0)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      C.JSArray_methods.addAll$1(positionalArguments, defaultArguments.get$values(defaultArguments));
+      return jsFunction.apply($function, positionalArguments);
+    }
+    $arguments = [];
+    if (positionalArguments != null) {
+      argumentCount = positionalArguments.length;
+      C.JSArray_methods.addAll$1($arguments, positionalArguments);
+    } else
+      argumentCount = 0;
+    jsFunction = $function["call$" + argumentCount];
+    if (jsFunction == null)
+      return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+    return jsFunction.apply($function, $arguments);
+  },
+  iae: function(argument) {
+    throw H.wrapException(P.ArgumentError$(argument));
+  },
+  ioore: function(receiver, index) {
+    if (receiver == null)
+      J.get$length$asx(receiver);
+    if (typeof index !== "number" || Math.floor(index) !== index)
+      H.iae(index);
+    throw H.wrapException(P.RangeError$value(index));
+  },
+  wrapException: function(ex) {
+    var wrapper;
+    if (ex == null)
+      ex = new P.NullThrownError();
+    wrapper = new Error();
+    wrapper.dartException = ex;
+    if ("defineProperty" in Object) {
+      Object.defineProperty(wrapper, "message", {get: H.toStringWrapper});
+      wrapper.name = "";
+    } else
+      wrapper.toString = H.toStringWrapper;
+    return wrapper;
+  },
+  toStringWrapper: [function() {
+    return J.toString$0(this.dartException);
+  }, "call$0", "toStringWrapper$closure", 0, 0, null],
+  throwExpression: function(ex) {
+    throw H.wrapException(ex);
+  },
+  unwrapException: function(ex) {
+    var t1, message, number, ieErrorCode, t2, t3, t4, nullLiteralCall, t5, t6, t7, t8, t9, match;
+    t1 = new H.unwrapException_saveStackTrace(ex);
+    if (ex == null)
+      return;
+    if (typeof ex !== "object")
+      return ex;
+    if ("dartException" in ex)
+      return t1.call$1(ex.dartException);
+    else if (!("message" in ex))
+      return ex;
+    message = ex.message;
+    if ("number" in ex && typeof ex.number == "number") {
+      number = ex.number;
+      ieErrorCode = number & 65535;
+      if ((C.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
+        switch (ieErrorCode) {
+          case 438:
+            return t1.call$1(H.JsNoSuchMethodError$(H.S(message) + " (Error " + ieErrorCode + ")", null));
+          case 445:
+          case 5007:
+            t2 = H.S(message) + " (Error " + ieErrorCode + ")";
+            return t1.call$1(new H.NullError(t2, null));
+        }
+    }
+    if (ex instanceof TypeError) {
+      t2 = $.get$TypeErrorDecoder_noSuchMethodPattern();
+      t3 = $.get$TypeErrorDecoder_notClosurePattern();
+      t4 = $.get$TypeErrorDecoder_nullCallPattern();
+      nullLiteralCall = $.get$TypeErrorDecoder_nullLiteralCallPattern();
+      t5 = $.get$TypeErrorDecoder_undefinedCallPattern();
+      t6 = $.get$TypeErrorDecoder_undefinedLiteralCallPattern();
+      t7 = $.get$TypeErrorDecoder_nullPropertyPattern();
+      $.get$TypeErrorDecoder_nullLiteralPropertyPattern();
+      t8 = $.get$TypeErrorDecoder_undefinedPropertyPattern();
+      t9 = $.get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
+      match = t2.matchTypeError$1(message);
+      if (match != null)
+        return t1.call$1(H.JsNoSuchMethodError$(message, match));
+      else {
+        match = t3.matchTypeError$1(message);
+        if (match != null) {
+          match.method = "call";
+          return t1.call$1(H.JsNoSuchMethodError$(message, match));
+        } else {
+          match = t4.matchTypeError$1(message);
+          if (match == null) {
+            match = nullLiteralCall.matchTypeError$1(message);
+            if (match == null) {
+              match = t5.matchTypeError$1(message);
+              if (match == null) {
+                match = t6.matchTypeError$1(message);
+                if (match == null) {
+                  match = t7.matchTypeError$1(message);
+                  if (match == null) {
+                    match = nullLiteralCall.matchTypeError$1(message);
+                    if (match == null) {
+                      match = t8.matchTypeError$1(message);
+                      if (match == null) {
+                        match = t9.matchTypeError$1(message);
+                        t2 = match != null;
+                      } else
+                        t2 = true;
+                    } else
+                      t2 = true;
+                  } else
+                    t2 = true;
+                } else
+                  t2 = true;
+              } else
+                t2 = true;
+            } else
+              t2 = true;
+          } else
+            t2 = true;
+          if (t2) {
+            t2 = match == null ? null : match.method;
+            return t1.call$1(new H.NullError(message, t2));
+          }
+        }
+      }
+      t2 = typeof message === "string" ? message : "";
+      return t1.call$1(new H.UnknownJsTypeError(t2));
+    }
+    if (ex instanceof RangeError) {
+      if (typeof message === "string" && message.indexOf("call stack") !== -1)
+        return new P.StackOverflowError();
+      return t1.call$1(new P.ArgumentError(null));
+    }
+    if (typeof InternalError == "function" && ex instanceof InternalError)
+      if (typeof message === "string" && message === "too much recursion")
+        return new P.StackOverflowError();
+    return ex;
+  },
+  objectHashCode: function(object) {
+    if (object == null || typeof object != 'object')
+      return J.get$hashCode$(object);
+    else
+      return H.Primitives_objectHashCode(object);
+  },
+  fillLiteralMap: function(keyValuePairs, result) {
+    var $length, index, index0, index1;
+    $length = keyValuePairs.length;
+    for (index = 0; index < $length; index = index1) {
+      index0 = index + 1;
+      index1 = index0 + 1;
+      result.$indexSet(0, keyValuePairs[index], keyValuePairs[index0]);
+    }
+    return result;
+  },
+  invokeClosure: [function(closure, isolate, numberOfArguments, arg1, arg2, arg3, arg4) {
+    var t1 = J.getInterceptor(numberOfArguments);
+    if (t1.$eq(numberOfArguments, 0))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure(closure));
+    else if (t1.$eq(numberOfArguments, 1))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure0(closure, arg1));
+    else if (t1.$eq(numberOfArguments, 2))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure1(closure, arg1, arg2));
+    else if (t1.$eq(numberOfArguments, 3))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure2(closure, arg1, arg2, arg3));
+    else if (t1.$eq(numberOfArguments, 4))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure3(closure, arg1, arg2, arg3, arg4));
+    else
+      throw H.wrapException(P.Exception_Exception("Unsupported number of arguments for wrapped closure"));
+  }, "call$7", "invokeClosure$closure", 14, 0, null, 6, 7, 8, 9, 10, 11, 12],
+  convertDartClosureToJS: function(closure, arity) {
+    var $function;
+    if (closure == null)
+      return;
+    $function = closure.$identity;
+    if (!!$function)
+      return $function;
+    $function = function(closure, arity, context, invoke) {
+      return function(a1, a2, a3, a4) {
+        return invoke(closure, context, arity, a1, a2, a3, a4);
+      };
+    }(closure, arity, init.globalState.currentContext, H.invokeClosure);
+    closure.$identity = $function;
+    return $function;
+  },
+  Closure_fromTearOff: function(receiver, functions, reflectionInfo, isStatic, jsArguments, propertyName) {
+    var $function, callName, functionType, $prototype, $constructor, t1, isIntercepted, trampoline, signatureFunction, getReceiver, i, stub, stubCallName, t2;
+    $function = functions[0];
+    $function.$stubName;
+    callName = $function.$callName;
+    $function.$reflectionInfo = reflectionInfo;
+    functionType = H.ReflectionInfo_ReflectionInfo($function).functionType;
+    $prototype = isStatic ? Object.create(new H.TearOffClosure().constructor.prototype) : Object.create(new H.BoundClosure(null, null, null, null).constructor.prototype);
+    $prototype.$initialize = $prototype.constructor;
+    if (isStatic)
+      $constructor = function() {
+        this.$initialize();
+      };
+    else if (typeof dart_precompiled == "function") {
+      t1 = function(a, b, c, d) {
+        this.$initialize(a, b, c, d);
+      };
+      $constructor = t1;
+    } else {
+      t1 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t1, 1);
+      t1 = new Function("a", "b", "c", "d", "this.$initialize(a,b,c,d);" + t1);
+      $constructor = t1;
+    }
+    $prototype.constructor = $constructor;
+    $constructor.prototype = $prototype;
+    t1 = !isStatic;
+    if (t1) {
+      isIntercepted = jsArguments.length == 1 && true;
+      trampoline = H.Closure_forwardCallTo(receiver, $function, isIntercepted);
+      trampoline.$reflectionInfo = reflectionInfo;
+    } else {
+      $prototype.$name = propertyName;
+      trampoline = $function;
+      isIntercepted = false;
+    }
+    if (typeof functionType == "number")
+      signatureFunction = function(s) {
+        return function() {
+          return init.metadata[s];
+        };
+      }(functionType);
+    else if (t1 && typeof functionType == "function") {
+      getReceiver = isIntercepted ? H.BoundClosure_receiverOf : H.BoundClosure_selfOf;
+      signatureFunction = function(f, r) {
+        return function() {
+          return f.apply({$receiver: r(this)}, arguments);
+        };
+      }(functionType, getReceiver);
+    } else
+      throw H.wrapException("Error in reflectionInfo.");
+    $prototype.$signature = signatureFunction;
+    $prototype[callName] = trampoline;
+    for (t1 = functions.length, i = 1; i < t1; ++i) {
+      stub = functions[i];
+      stubCallName = stub.$callName;
+      if (stubCallName != null) {
+        t2 = isStatic ? stub : H.Closure_forwardCallTo(receiver, stub, isIntercepted);
+        $prototype[stubCallName] = t2;
+      }
+    }
+    $prototype["call*"] = trampoline;
+    return $constructor;
+  },
+  Closure_cspForwardCall: function(arity, isSuperCall, stubName, $function) {
+    var getSelf = H.BoundClosure_selfOf;
+    switch (isSuperCall ? -1 : arity) {
+      case 0:
+        return function(n, S) {
+          return function() {
+            return S(this)[n]();
+          };
+        }(stubName, getSelf);
+      case 1:
+        return function(n, S) {
+          return function(a) {
+            return S(this)[n](a);
+          };
+        }(stubName, getSelf);
+      case 2:
+        return function(n, S) {
+          return function(a, b) {
+            return S(this)[n](a, b);
+          };
+        }(stubName, getSelf);
+      case 3:
+        return function(n, S) {
+          return function(a, b, c) {
+            return S(this)[n](a, b, c);
+          };
+        }(stubName, getSelf);
+      case 4:
+        return function(n, S) {
+          return function(a, b, c, d) {
+            return S(this)[n](a, b, c, d);
+          };
+        }(stubName, getSelf);
+      case 5:
+        return function(n, S) {
+          return function(a, b, c, d, e) {
+            return S(this)[n](a, b, c, d, e);
+          };
+        }(stubName, getSelf);
+      default:
+        return function(f, s) {
+          return function() {
+            return f.apply(s(this), arguments);
+          };
+        }($function, getSelf);
+    }
+  },
+  Closure_forwardCallTo: function(receiver, $function, isIntercepted) {
+    var stubName, arity, lookedUpFunction, t1, t2, $arguments;
+    if (isIntercepted)
+      return H.Closure_forwardInterceptedCallTo(receiver, $function);
+    stubName = $function.$stubName;
+    arity = $function.length;
+    lookedUpFunction = receiver[stubName];
+    t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+    if (typeof dart_precompiled == "function" || !t1 || arity >= 27)
+      return H.Closure_cspForwardCall(arity, !t1, stubName, $function);
+    if (arity === 0) {
+      t1 = $.BoundClosure_selfFieldNameCache;
+      if (t1 == null) {
+        t1 = H.BoundClosure_computeFieldNamed("self");
+        $.BoundClosure_selfFieldNameCache = t1;
+      }
+      t1 = "return function(){return this." + H.S(t1) + "." + H.S(stubName) + "();";
+      t2 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t2, 1);
+      return new Function(t1 + H.S(t2) + "}")();
+    }
+    $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity).join(",");
+    t1 = "return function(" + $arguments + "){return this.";
+    t2 = $.BoundClosure_selfFieldNameCache;
+    if (t2 == null) {
+      t2 = H.BoundClosure_computeFieldNamed("self");
+      $.BoundClosure_selfFieldNameCache = t2;
+    }
+    t2 = t1 + H.S(t2) + "." + H.S(stubName) + "(" + $arguments + ");";
+    t1 = $.Closure_functionCounter;
+    $.Closure_functionCounter = J.$add$ns(t1, 1);
+    return new Function(t2 + H.S(t1) + "}")();
+  },
+  Closure_cspForwardInterceptedCall: function(arity, isSuperCall, $name, $function) {
+    var getSelf, getReceiver;
+    getSelf = H.BoundClosure_selfOf;
+    getReceiver = H.BoundClosure_receiverOf;
+    switch (isSuperCall ? -1 : arity) {
+      case 0:
+        throw H.wrapException(H.RuntimeError$("Intercepted function with no arguments."));
+      case 1:
+        return function(n, s, r) {
+          return function() {
+            return s(this)[n](r(this));
+          };
+        }($name, getSelf, getReceiver);
+      case 2:
+        return function(n, s, r) {
+          return function(a) {
+            return s(this)[n](r(this), a);
+          };
+        }($name, getSelf, getReceiver);
+      case 3:
+        return function(n, s, r) {
+          return function(a, b) {
+            return s(this)[n](r(this), a, b);
+          };
+        }($name, getSelf, getReceiver);
+      case 4:
+        return function(n, s, r) {
+          return function(a, b, c) {
+            return s(this)[n](r(this), a, b, c);
+          };
+        }($name, getSelf, getReceiver);
+      case 5:
+        return function(n, s, r) {
+          return function(a, b, c, d) {
+            return s(this)[n](r(this), a, b, c, d);
+          };
+        }($name, getSelf, getReceiver);
+      case 6:
+        return function(n, s, r) {
+          return function(a, b, c, d, e) {
+            return s(this)[n](r(this), a, b, c, d, e);
+          };
+        }($name, getSelf, getReceiver);
+      default:
+        return function(f, s, r, a) {
+          return function() {
+            a = [r(this)];
+            Array.prototype.push.apply(a, arguments);
+            return f.apply(s(this), a);
+          };
+        }($function, getSelf, getReceiver);
+    }
+  },
+  Closure_forwardInterceptedCallTo: function(receiver, $function) {
+    var selfField, t1, stubName, arity, isCsp, lookedUpFunction, t2, $arguments;
+    selfField = H.BoundClosure_selfFieldName();
+    t1 = $.BoundClosure_receiverFieldNameCache;
+    if (t1 == null) {
+      t1 = H.BoundClosure_computeFieldNamed("receiver");
+      $.BoundClosure_receiverFieldNameCache = t1;
+    }
+    stubName = $function.$stubName;
+    arity = $function.length;
+    isCsp = typeof dart_precompiled == "function";
+    lookedUpFunction = receiver[stubName];
+    t2 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+    if (isCsp || !t2 || arity >= 28)
+      return H.Closure_cspForwardInterceptedCall(arity, !t2, stubName, $function);
+    if (arity === 1) {
+      t1 = "return function(){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + H.S(t1) + ");";
+      t2 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t2, 1);
+      return new Function(t1 + H.S(t2) + "}")();
+    }
+    $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity - 1).join(",");
+    t1 = "return function(" + $arguments + "){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + H.S(t1) + ", " + $arguments + ");";
+    t2 = $.Closure_functionCounter;
+    $.Closure_functionCounter = J.$add$ns(t2, 1);
+    return new Function(t1 + H.S(t2) + "}")();
+  },
+  closureFromTearOff: function(receiver, functions, reflectionInfo, isStatic, jsArguments, $name) {
+    functions.fixed$length = init;
+    reflectionInfo.fixed$length = init;
+    return H.Closure_fromTearOff(receiver, functions, reflectionInfo, !!isStatic, jsArguments, $name);
+  },
+  propertyTypeCastError: function(value, property) {
+    var t1 = J.getInterceptor$asx(property);
+    throw H.wrapException(H.CastErrorImplementation$(H.Primitives_objectTypeName(value), t1.substring$2(property, 3, t1.get$length(property))));
+  },
+  interceptedTypeCast: function(value, property) {
+    var t1;
+    if (value != null)
+      t1 = typeof value === "object" && J.getInterceptor(value)[property];
+    else
+      t1 = true;
+    if (t1)
+      return value;
+    H.propertyTypeCastError(value, property);
+  },
+  throwCyclicInit: function(staticName) {
+    throw H.wrapException(P.CyclicInitializationError$("Cyclic initialization for static " + H.S(staticName)));
+  },
+  buildFunctionType: function(returnType, parameterTypes, optionalParameterTypes) {
+    return new H.RuntimeFunctionType(returnType, parameterTypes, optionalParameterTypes, null);
+  },
+  buildInterfaceType: function(rti, typeArguments) {
+    var $name = rti.name;
+    if (typeArguments == null || typeArguments.length === 0)
+      return new H.RuntimeTypePlain($name);
+    return new H.RuntimeTypeGeneric($name, typeArguments, null);
+  },
+  getDynamicRuntimeType: function() {
+    return C.C_DynamicRuntimeType;
+  },
+  createRuntimeType: function($name) {
+    return new H.TypeImpl($name, null);
+  },
+  setRuntimeTypeInfo: function(target, typeInfo) {
+    if (target != null)
+      target.$builtinTypeInfo = typeInfo;
+    return target;
+  },
+  getRuntimeTypeInfo: function(target) {
+    if (target == null)
+      return;
+    return target.$builtinTypeInfo;
+  },
+  getRuntimeTypeArguments: function(target, substitutionName) {
+    return H.substitute(target["$as" + H.S(substitutionName)], H.getRuntimeTypeInfo(target));
+  },
+  getRuntimeTypeArgument: function(target, substitutionName, index) {
+    var $arguments = H.getRuntimeTypeArguments(target, substitutionName);
+    return $arguments == null ? null : $arguments[index];
+  },
+  getTypeArgumentByIndex: function(target, index) {
+    var rti = H.getRuntimeTypeInfo(target);
+    return rti == null ? null : rti[index];
+  },
+  runtimeTypeToString: function(type, onTypeVariable) {
+    if (type == null)
+      return "dynamic";
+    else if (typeof type === "object" && type !== null && type.constructor === Array)
+      return type[0].builtin$cls + H.joinArguments(type, 1, onTypeVariable);
+    else if (typeof type == "function")
+      return type.builtin$cls;
+    else if (typeof type === "number" && Math.floor(type) === type)
+      return C.JSInt_methods.toString$0(type);
+    else
+      return;
+  },
+  joinArguments: function(types, startIndex, onTypeVariable) {
+    var buffer, index, firstArgument, allDynamic, argument, str;
+    if (types == null)
+      return "";
+    buffer = P.StringBuffer$("");
+    for (index = startIndex, firstArgument = true, allDynamic = true; index < types.length; ++index) {
+      if (firstArgument)
+        firstArgument = false;
+      else
+        buffer._contents += ", ";
+      argument = types[index];
+      if (argument != null)
+        allDynamic = false;
+      str = H.runtimeTypeToString(argument, onTypeVariable);
+      buffer._contents += typeof str === "string" ? str : H.S(str);
+    }
+    return allDynamic ? "" : "<" + H.S(buffer) + ">";
+  },
+  getRuntimeTypeString: function(object) {
+    var className = J.getInterceptor(object).constructor.builtin$cls;
+    if (object == null)
+      return className;
+    return className + H.joinArguments(object.$builtinTypeInfo, 0, null);
+  },
+  substitute: function(substitution, $arguments) {
+    if (typeof substitution === "object" && substitution !== null && substitution.constructor === Array)
+      $arguments = substitution;
+    else if (typeof substitution == "function") {
+      substitution = H.invokeOn(substitution, null, $arguments);
+      if (typeof substitution === "object" && substitution !== null && substitution.constructor === Array)
+        $arguments = substitution;
+      else if (typeof substitution == "function")
+        $arguments = H.invokeOn(substitution, null, $arguments);
+    }
+    return $arguments;
+  },
+  checkSubtype: function(object, isField, checks, asField) {
+    var $arguments, interceptor;
+    if (object == null)
+      return false;
+    $arguments = H.getRuntimeTypeInfo(object);
+    interceptor = J.getInterceptor(object);
+    if (interceptor[isField] == null)
+      return false;
+    return H.areSubtypes(H.substitute(interceptor[asField], $arguments), checks);
+  },
+  areSubtypes: function(s, t) {
+    var len, i;
+    if (s == null || t == null)
+      return true;
+    len = s.length;
+    for (i = 0; i < len; ++i)
+      if (!H.isSubtype(s[i], t[i]))
+        return false;
+    return true;
+  },
+  computeSignature: function(signature, context, contextName) {
+    return H.invokeOn(signature, context, H.getRuntimeTypeArguments(context, contextName));
+  },
+  checkSubtypeOfRuntimeType: function(o, t) {
+    var rti, type;
+    if (o == null)
+      return t == null || t.builtin$cls === "Object" || t.builtin$cls === "Null";
+    if (t == null)
+      return true;
+    rti = H.getRuntimeTypeInfo(o);
+    o = J.getInterceptor(o);
+    if (rti != null) {
+      type = rti.slice();
+      type.splice(0, 0, o);
+    } else
+      type = o;
+    return H.isSubtype(type, t);
+  },
+  isSubtype: function(s, t) {
+    var targetSignatureFunction, t1, typeOfS, t2, typeOfT, $name, substitution;
+    if (s === t)
+      return true;
+    if (s == null || t == null)
+      return true;
+    if ("func" in t) {
+      if (!("func" in s)) {
+        if ("$is_" + H.S(t.func) in s)
+          return true;
+        targetSignatureFunction = s.$signature;
+        if (targetSignatureFunction == null)
+          return false;
+        s = targetSignatureFunction.apply(s, null);
+      }
+      return H.isFunctionSubtype(s, t);
+    }
+    if (t.builtin$cls === "Function" && "func" in s)
+      return true;
+    t1 = typeof s === "object" && s !== null && s.constructor === Array;
+    typeOfS = t1 ? s[0] : s;
+    t2 = typeof t === "object" && t !== null && t.constructor === Array;
+    typeOfT = t2 ? t[0] : t;
+    $name = H.runtimeTypeToString(typeOfT, null);
+    if (typeOfT !== typeOfS) {
+      if (!("$is" + H.S($name) in typeOfS))
+        return false;
+      substitution = typeOfS["$as" + H.S(H.runtimeTypeToString(typeOfT, null))];
+    } else
+      substitution = null;
+    if (!t1 && substitution == null || !t2)
+      return true;
+    t1 = t1 ? s.slice(1) : null;
+    t2 = t2 ? t.slice(1) : null;
+    return H.areSubtypes(H.substitute(substitution, t1), t2);
+  },
+  areAssignable: function(s, t, allowShorter) {
+    var sLength, tLength, i, t1, t2;
+    if (t == null && s == null)
+      return true;
+    if (t == null)
+      return allowShorter;
+    if (s == null)
+      return false;
+    sLength = s.length;
+    tLength = t.length;
+    if (allowShorter) {
+      if (sLength < tLength)
+        return false;
+    } else if (sLength !== tLength)
+      return false;
+    for (i = 0; i < tLength; ++i) {
+      t1 = s[i];
+      t2 = t[i];
+      if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+        return false;
+    }
+    return true;
+  },
+  areAssignableMaps: function(s, t) {
+    var t1, names, i, $name, tType, sType;
+    if (t == null)
+      return true;
+    if (s == null)
+      return false;
+    t1 = Object.getOwnPropertyNames(t);
+    t1.fixed$length = init;
+    names = t1;
+    for (t1 = names.length, i = 0; i < t1; ++i) {
+      $name = names[i];
+      if (!Object.hasOwnProperty.call(s, $name))
+        return false;
+      tType = t[$name];
+      sType = s[$name];
+      if (!(H.isSubtype(tType, sType) || H.isSubtype(sType, tType)))
+        return false;
+    }
+    return true;
+  },
+  isFunctionSubtype: function(s, t) {
+    var sReturnType, tReturnType, sParameterTypes, tParameterTypes, sOptionalParameterTypes, tOptionalParameterTypes, sParametersLen, tParametersLen, sOptionalParametersLen, tOptionalParametersLen, pos, t1, t2, tPos, sPos;
+    if (!("func" in s))
+      return false;
+    if ("void" in s) {
+      if (!("void" in t) && "ret" in t)
+        return false;
+    } else if (!("void" in t)) {
+      sReturnType = s.ret;
+      tReturnType = t.ret;
+      if (!(H.isSubtype(sReturnType, tReturnType) || H.isSubtype(tReturnType, sReturnType)))
+        return false;
+    }
+    sParameterTypes = s.args;
+    tParameterTypes = t.args;
+    sOptionalParameterTypes = s.opt;
+    tOptionalParameterTypes = t.opt;
+    sParametersLen = sParameterTypes != null ? sParameterTypes.length : 0;
+    tParametersLen = tParameterTypes != null ? tParameterTypes.length : 0;
+    sOptionalParametersLen = sOptionalParameterTypes != null ? sOptionalParameterTypes.length : 0;
+    tOptionalParametersLen = tOptionalParameterTypes != null ? tOptionalParameterTypes.length : 0;
+    if (sParametersLen > tParametersLen)
+      return false;
+    if (sParametersLen + sOptionalParametersLen < tParametersLen + tOptionalParametersLen)
+      return false;
+    if (sParametersLen === tParametersLen) {
+      if (!H.areAssignable(sParameterTypes, tParameterTypes, false))
+        return false;
+      if (!H.areAssignable(sOptionalParameterTypes, tOptionalParameterTypes, true))
+        return false;
+    } else {
+      for (pos = 0; pos < sParametersLen; ++pos) {
+        t1 = sParameterTypes[pos];
+        t2 = tParameterTypes[pos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+      for (tPos = pos, sPos = 0; tPos < tParametersLen; ++sPos, ++tPos) {
+        t1 = sOptionalParameterTypes[sPos];
+        t2 = tParameterTypes[tPos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+      for (tPos = 0; tPos < tOptionalParametersLen; ++sPos, ++tPos) {
+        t1 = sOptionalParameterTypes[sPos];
+        t2 = tOptionalParameterTypes[tPos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+    }
+    return H.areAssignableMaps(s.named, t.named);
+  },
+  invokeOn: function($function, receiver, $arguments) {
+    return $function.apply(receiver, $arguments);
+  },
+  toStringForNativeObject: function(obj) {
+    var t1 = $.getTagFunction;
+    return "Instance of " + (t1 == null ? "<Unknown>" : t1.call$1(obj));
+  },
+  hashCodeForNativeObject: function(object) {
+    return H.Primitives_objectHashCode(object);
+  },
+  defineProperty: function(obj, property, value) {
+    Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
+  },
+  lookupAndCacheInterceptor: function(obj) {
+    var tag, record, interceptor, interceptorClass, mark, t1;
+    tag = $.getTagFunction.call$1(obj);
+    record = $.dispatchRecordsForInstanceTags[tag];
+    if (record != null) {
+      Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+      return record.i;
+    }
+    interceptor = $.interceptorsForUncacheableTags[tag];
+    if (interceptor != null)
+      return interceptor;
+    interceptorClass = init.interceptorsByTag[tag];
+    if (interceptorClass == null) {
+      tag = $.alternateTagFunction.call$2(obj, tag);
+      if (tag != null) {
+        record = $.dispatchRecordsForInstanceTags[tag];
+        if (record != null) {
+          Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+          return record.i;
+        }
+        interceptor = $.interceptorsForUncacheableTags[tag];
+        if (interceptor != null)
+          return interceptor;
+        interceptorClass = init.interceptorsByTag[tag];
+      }
+    }
+    if (interceptorClass == null)
+      return;
+    interceptor = interceptorClass.prototype;
+    mark = tag[0];
+    if (mark === "!") {
+      record = H.makeLeafDispatchRecord(interceptor);
+      $.dispatchRecordsForInstanceTags[tag] = record;
+      Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+      return record.i;
+    }
+    if (mark === "~") {
+      $.interceptorsForUncacheableTags[tag] = interceptor;
+      return interceptor;
+    }
+    if (mark === "-") {
+      t1 = H.makeLeafDispatchRecord(interceptor);
+      Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+      return t1.i;
+    }
+    if (mark === "+")
+      return H.patchInteriorProto(obj, interceptor);
+    if (mark === "*")
+      throw H.wrapException(P.UnimplementedError$(tag));
+    if (init.leafTags[tag] === true) {
+      t1 = H.makeLeafDispatchRecord(interceptor);
+      Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+      return t1.i;
+    } else
+      return H.patchInteriorProto(obj, interceptor);
+  },
+  patchInteriorProto: function(obj, interceptor) {
+    var proto, record;
+    proto = Object.getPrototypeOf(obj);
+    record = J.makeDispatchRecord(interceptor, proto, null, null);
+    Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+    return interceptor;
+  },
+  makeLeafDispatchRecord: function(interceptor) {
+    return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
+  },
+  makeDefaultDispatchRecord: function(tag, interceptorClass, proto) {
+    var interceptor = interceptorClass.prototype;
+    if (init.leafTags[tag] === true)
+      return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
+    else
+      return J.makeDispatchRecord(interceptor, proto, null, null);
+  },
+  initNativeDispatch: function() {
+    if (true === $.initNativeDispatchFlag)
+      return;
+    $.initNativeDispatchFlag = true;
+    H.initNativeDispatchContinue();
+  },
+  initNativeDispatchContinue: function() {
+    var map, tags, fun, i, tag, proto, record, interceptorClass;
+    $.dispatchRecordsForInstanceTags = Object.create(null);
+    $.interceptorsForUncacheableTags = Object.create(null);
+    H.initHooks();
+    map = init.interceptorsByTag;
+    tags = Object.getOwnPropertyNames(map);
+    if (typeof window != "undefined") {
+      window;
+      fun = function() {
+      };
+      for (i = 0; i < tags.length; ++i) {
+        tag = tags[i];
+        proto = $.prototypeForTagFunction.call$1(tag);
+        if (proto != null) {
+          record = H.makeDefaultDispatchRecord(tag, map[tag], proto);
+          if (record != null) {
+            Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+            fun.prototype = proto;
+          }
+        }
+      }
+    }
+    for (i = 0; i < tags.length; ++i) {
+      tag = tags[i];
+      if (/^[A-Za-z_]/.test(tag)) {
+        interceptorClass = map[tag];
+        map["!" + tag] = interceptorClass;
+        map["~" + tag] = interceptorClass;
+        map["-" + tag] = interceptorClass;
+        map["+" + tag] = interceptorClass;
+        map["*" + tag] = interceptorClass;
+      }
+    }
+  },
+  initHooks: function() {
+    var hooks, transformers, i, transformer, getTag, getUnknownTag, prototypeForTag;
+    hooks = C.JS_CONST_aQP();
+    hooks = H.applyHooksTransformer(C.JS_CONST_0, H.applyHooksTransformer(C.JS_CONST_rr7, H.applyHooksTransformer(C.JS_CONST_Fs4, H.applyHooksTransformer(C.JS_CONST_Fs4, H.applyHooksTransformer(C.JS_CONST_gkc, H.applyHooksTransformer(C.JS_CONST_4hp, H.applyHooksTransformer(C.JS_CONST_QJm(C.JS_CONST_8ZY), hooks)))))));
+    if (typeof dartNativeDispatchHooksTransformer != "undefined") {
+      transformers = dartNativeDispatchHooksTransformer;
+      if (typeof transformers == "function")
+        transformers = [transformers];
+      if (transformers.constructor == Array)
+        for (i = 0; i < transformers.length; ++i) {
+          transformer = transformers[i];
+          if (typeof transformer == "function")
+            hooks = transformer(hooks) || hooks;
+        }
+    }
+    getTag = hooks.getTag;
+    getUnknownTag = hooks.getUnknownTag;
+    prototypeForTag = hooks.prototypeForTag;
+    $.getTagFunction = new H.initHooks_closure(getTag);
+    $.alternateTagFunction = new H.initHooks_closure0(getUnknownTag);
+    $.prototypeForTagFunction = new H.initHooks_closure1(prototypeForTag);
+  },
+  applyHooksTransformer: function(transformer, hooks) {
+    return transformer(hooks) || hooks;
+  },
+  allMatchesInStringUnchecked: function(needle, haystack) {
+    var result, $length, patternLength, startIndex, position, endIndex;
+    result = H.setRuntimeTypeInfo([], [P.Match]);
+    $length = haystack.length;
+    patternLength = needle.length;
+    for (startIndex = 0; true;) {
+      position = C.JSString_methods.indexOf$2(haystack, needle, startIndex);
+      if (position === -1)
+        break;
+      result.push(new H.StringMatch(position, haystack, needle));
+      endIndex = position + patternLength;
+      if (endIndex === $length)
+        break;
+      else
+        startIndex = position === endIndex ? startIndex + 1 : endIndex;
+    }
+    return result;
+  },
+  stringContainsUnchecked: function(receiver, other, startIndex) {
+    var t1, t2;
+    if (typeof other === "string")
+      return C.JSString_methods.indexOf$2(receiver, other, startIndex) !== -1;
+    else {
+      t1 = J.getInterceptor(other);
+      if (!!t1.$isJSSyntaxRegExp) {
+        t1 = C.JSString_methods.substring$1(receiver, startIndex);
+        t2 = other._nativeRegExp;
+        return t2.test(t1);
+      } else
+        return J.get$isNotEmpty$asx(t1.allMatches$1(other, C.JSString_methods.substring$1(receiver, startIndex)));
+    }
+  },
+  stringReplaceAllUnchecked: function(receiver, from, to) {
+    var result, $length, i, t1;
+    if (from === "")
+      if (receiver === "")
+        return to;
+      else {
+        result = P.StringBuffer$("");
+        $length = receiver.length;
+        result.write$1(to);
+        for (i = 0; i < $length; ++i) {
+          t1 = receiver[i];
+          t1 = result._contents += t1;
+          result._contents = t1 + to;
+        }
+        return result._contents;
+      }
+    else
+      return receiver.replace(new RegExp(from.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]", 'g'), "\\$&"), 'g'), to.replace(/\$/g, "$$$$"));
+  },
+  ConstantMap: {
+    "^": "Object;",
+    get$isEmpty: function(_) {
+      return J.$eq(this.get$length(this), 0);
+    },
+    get$isNotEmpty: function(_) {
+      return !J.$eq(this.get$length(this), 0);
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    _throwUnmodifiable$0: function() {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable Map"));
+    },
+    $indexSet: function(_, key, val) {
+      return this._throwUnmodifiable$0();
+    },
+    clear$0: function(_) {
+      return this._throwUnmodifiable$0();
+    },
+    addAll$1: function(_, other) {
+      return this._throwUnmodifiable$0();
+    },
+    $isMap: true
+  },
+  ConstantStringMap: {
+    "^": "ConstantMap;length>,_jsObject,_keys",
+    containsKey$1: function(key) {
+      if (typeof key !== "string")
+        return false;
+      if ("__proto__" === key)
+        return false;
+      return this._jsObject.hasOwnProperty(key);
+    },
+    $index: function(_, key) {
+      if (!this.containsKey$1(key))
+        return;
+      return this._fetch$1(key);
+    },
+    _fetch$1: function(key) {
+      return this._jsObject[key];
+    },
+    forEach$1: function(_, f) {
+      var keys, i, key;
+      keys = this._keys;
+      for (i = 0; i < keys.length; ++i) {
+        key = keys[i];
+        f.call$2(key, this._fetch$1(key));
+      }
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new H._ConstantMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      return H.MappedIterable_MappedIterable(this._keys, new H.ConstantStringMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    $isEfficientLength: true
+  },
+  ConstantStringMap_values_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(key) {
+      return this.this_0._fetch$1(key);
+    }, "call$1", null, 2, 0, null, 76, "call"],
+    $isFunction: true
+  },
+  _ConstantMapKeyIterable: {
+    "^": "IterableBase;__js_helper$_map",
+    get$iterator: function(_) {
+      return J.get$iterator$ax(this.__js_helper$_map._keys);
+    }
+  },
+  JSInvocationMirror: {
+    "^": "Object;__js_helper$_memberName,_internalName,_kind,_arguments,_namedArgumentNames,_namedIndices",
+    get$memberName: function() {
+      return this.__js_helper$_memberName;
+    },
+    get$isMethod: function() {
+      return this._kind === 0;
+    },
+    get$positionalArguments: function() {
+      var t1, argumentCount, list, index;
+      if (this._kind === 1)
+        return C.List_empty;
+      t1 = this._arguments;
+      argumentCount = t1.length - this._namedArgumentNames.length;
+      if (argumentCount === 0)
+        return C.List_empty;
+      list = [];
+      for (index = 0; index < argumentCount; ++index) {
+        if (index >= t1.length)
+          return H.ioore(t1, index);
+        list.push(t1[index]);
+      }
+      list.immutable$list = true;
+      list.fixed$length = true;
+      return list;
+    },
+    get$namedArguments: function() {
+      var t1, namedArgumentCount, t2, namedArgumentsStartIndex, map, i, t3, t4;
+      if (this._kind !== 0)
+        return P.LinkedHashMap_LinkedHashMap$_empty(P.Symbol, null);
+      t1 = this._namedArgumentNames;
+      namedArgumentCount = t1.length;
+      t2 = this._arguments;
+      namedArgumentsStartIndex = t2.length - namedArgumentCount;
+      if (namedArgumentCount === 0)
+        return P.LinkedHashMap_LinkedHashMap$_empty(P.Symbol, null);
+      map = P.LinkedHashMap_LinkedHashMap(null, null, null, P.Symbol, null);
+      for (i = 0; i < namedArgumentCount; ++i) {
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t3 = t1[i];
+        t4 = namedArgumentsStartIndex + i;
+        if (t4 < 0 || t4 >= t2.length)
+          return H.ioore(t2, t4);
+        map.$indexSet(0, new H.Symbol0(t3), t2[t4]);
+      }
+      return map;
+    },
+    static: {"^": "JSInvocationMirror_METHOD,JSInvocationMirror_GETTER,JSInvocationMirror_SETTER"}
+  },
+  ReflectionInfo: {
+    "^": "Object;jsFunction,data>,isAccessor,requiredParameterCount,optionalParameterCount,areOptionalParametersNamed,functionType,cachedSortedIndices",
+    parameterName$1: function(parameter) {
+      var metadataIndex = this.data[parameter + this.optionalParameterCount + 3];
+      return init.metadata[metadataIndex];
+    },
+    defaultValue$1: function(_, parameter) {
+      var t1 = this.requiredParameterCount;
+      if (typeof parameter !== "number")
+        return parameter.$lt();
+      if (parameter < t1)
+        return;
+      return this.data[3 + parameter - t1];
+    },
+    defaultValueInOrder$1: function(parameter) {
+      var t1 = this.requiredParameterCount;
+      if (parameter < t1)
+        return;
+      if (!this.areOptionalParametersNamed || this.optionalParameterCount === 1)
+        return this.defaultValue$1(0, parameter);
+      return this.defaultValue$1(0, this.sortedIndex$1(parameter - t1));
+    },
+    parameterNameInOrder$1: function(parameter) {
+      var t1 = this.requiredParameterCount;
+      if (parameter < t1)
+        return;
+      if (!this.areOptionalParametersNamed || this.optionalParameterCount === 1)
+        return this.parameterName$1(parameter);
+      return this.parameterName$1(this.sortedIndex$1(parameter - t1));
+    },
+    sortedIndex$1: function(unsortedIndex) {
+      var t1, t2, positions, t3, i, index;
+      t1 = {};
+      if (this.cachedSortedIndices == null) {
+        t2 = this.optionalParameterCount;
+        this.cachedSortedIndices = Array(t2);
+        positions = P.LinkedHashMap_LinkedHashMap$_empty(P.String, P.$int);
+        for (t3 = this.requiredParameterCount, i = 0; i < t2; ++i) {
+          index = t3 + i;
+          positions.$indexSet(0, this.parameterName$1(index), index);
+        }
+        t1.index_0 = 0;
+        t2 = positions.get$keys();
+        t2 = P.List_List$from(t2, true, H.getRuntimeTypeArgument(t2, "IterableBase", 0));
+        H.IterableMixinWorkaround_sortList(t2, null);
+        H.IterableMixinWorkaround_forEach(t2, new H.ReflectionInfo_sortedIndex_closure(t1, this, positions));
+      }
+      t1 = this.cachedSortedIndices;
+      if (unsortedIndex < 0 || unsortedIndex >= t1.length)
+        return H.ioore(t1, unsortedIndex);
+      return t1[unsortedIndex];
+    },
+    static: {"^": "ReflectionInfo_REQUIRED_PARAMETERS_INFO,ReflectionInfo_OPTIONAL_PARAMETERS_INFO,ReflectionInfo_FUNCTION_TYPE_INDEX,ReflectionInfo_FIRST_DEFAULT_ARGUMENT", ReflectionInfo_ReflectionInfo: function(jsFunction) {
+        var data, requiredParametersInfo, optionalParametersInfo;
+        data = jsFunction.$reflectionInfo;
+        if (data == null)
+          return;
+        data.fixed$length = init;
+        data = data;
+        requiredParametersInfo = data[0];
+        optionalParametersInfo = data[1];
+        return new H.ReflectionInfo(jsFunction, data, (requiredParametersInfo & 1) === 1, requiredParametersInfo >> 1, optionalParametersInfo >> 1, (optionalParametersInfo & 1) === 1, data[2], null);
+      }}
+  },
+  ReflectionInfo_sortedIndex_closure: {
+    "^": "Closure:5;box_0,this_1,positions_2",
+    call$1: function($name) {
+      var t1, t2, t3;
+      t1 = this.this_1.cachedSortedIndices;
+      t2 = this.box_0.index_0++;
+      t3 = this.positions_2.$index(0, $name);
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      t1[t2] = t3;
+    },
+    $isFunction: true
+  },
+  Primitives_functionNoSuchMethod_closure: {
+    "^": "Closure:77;box_0,arguments_1,namedArgumentList_2",
+    call$2: function($name, argument) {
+      var t1 = this.box_0;
+      t1.names_1 = t1.names_1 + "$" + H.S($name);
+      this.namedArgumentList_2.push($name);
+      this.arguments_1.push(argument);
+      ++t1.argumentCount_0;
+    },
+    $isFunction: true
+  },
+  Primitives_applyFunction_closure: {
+    "^": "Closure:77;box_0,defaultArguments_1",
+    call$2: function(parameter, value) {
+      var t1 = this.defaultArguments_1;
+      if (t1.containsKey$1(parameter))
+        t1.$indexSet(0, parameter, value);
+      else
+        this.box_0.bad_0 = true;
+    },
+    $isFunction: true
+  },
+  TypeErrorDecoder: {
+    "^": "Object;_pattern,_arguments,_argumentsExpr,_expr,_method,_receiver",
+    matchTypeError$1: function(message) {
+      var match, result, t1;
+      match = new RegExp(this._pattern).exec(message);
+      if (match == null)
+        return;
+      result = {};
+      t1 = this._arguments;
+      if (t1 !== -1)
+        result.arguments = match[t1 + 1];
+      t1 = this._argumentsExpr;
+      if (t1 !== -1)
+        result.argumentsExpr = match[t1 + 1];
+      t1 = this._expr;
+      if (t1 !== -1)
+        result.expr = match[t1 + 1];
+      t1 = this._method;
+      if (t1 !== -1)
+        result.method = match[t1 + 1];
+      t1 = this._receiver;
+      if (t1 !== -1)
+        result.receiver = match[t1 + 1];
+      return result;
+    },
+    static: {"^": "TypeErrorDecoder_noSuchMethodPattern,TypeErrorDecoder_notClosurePattern,TypeErrorDecoder_nullCallPattern,TypeErrorDecoder_nullLiteralCallPattern,TypeErrorDecoder_undefinedCallPattern,TypeErrorDecoder_undefinedLiteralCallPattern,TypeErrorDecoder_nullPropertyPattern,TypeErrorDecoder_nullLiteralPropertyPattern,TypeErrorDecoder_undefinedPropertyPattern,TypeErrorDecoder_undefinedLiteralPropertyPattern", TypeErrorDecoder_extractPattern: function(message) {
+        var match, $arguments, argumentsExpr, expr, method, receiver;
+        message = message.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]", 'g'), '\\$&');
+        match = message.match(/\\\$[a-zA-Z]+\\\$/g);
+        if (match == null)
+          match = [];
+        $arguments = match.indexOf("\\$arguments\\$");
+        argumentsExpr = match.indexOf("\\$argumentsExpr\\$");
+        expr = match.indexOf("\\$expr\\$");
+        method = match.indexOf("\\$method\\$");
+        receiver = match.indexOf("\\$receiver\\$");
+        return new H.TypeErrorDecoder(message.replace('\\$arguments\\$', '((?:x|[^x])*)').replace('\\$argumentsExpr\\$', '((?:x|[^x])*)').replace('\\$expr\\$', '((?:x|[^x])*)').replace('\\$method\\$', '((?:x|[^x])*)').replace('\\$receiver\\$', '((?:x|[^x])*)'), $arguments, argumentsExpr, expr, method, receiver);
+      }, TypeErrorDecoder_provokeCallErrorOn: function(expression) {
+        return function($expr$) {
+          var $argumentsExpr$ = '$arguments$';
+          try {
+            $expr$.$method$($argumentsExpr$);
+          } catch (e) {
+            return e.message;
+          }
+
+        }(expression);
+      }, TypeErrorDecoder_provokePropertyErrorOn: function(expression) {
+        return function($expr$) {
+          try {
+            $expr$.$method$;
+          } catch (e) {
+            return e.message;
+          }
+
+        }(expression);
+      }}
+  },
+  NullError: {
+    "^": "Error;_message,_method",
+    toString$0: function(_) {
+      var t1 = this._method;
+      if (t1 == null)
+        return "NullError: " + H.S(this._message);
+      return "NullError: Cannot call \"" + H.S(t1) + "\" on null";
+    },
+    $isNoSuchMethodError: true,
+    $isError: true
+  },
+  JsNoSuchMethodError: {
+    "^": "Error;_message,_method,_receiver",
+    toString$0: function(_) {
+      var t1, t2;
+      t1 = this._method;
+      if (t1 == null)
+        return "NoSuchMethodError: " + H.S(this._message);
+      t2 = this._receiver;
+      if (t2 == null)
+        return "NoSuchMethodError: Cannot call \"" + H.S(t1) + "\" (" + H.S(this._message) + ")";
+      return "NoSuchMethodError: Cannot call \"" + H.S(t1) + "\" on \"" + H.S(t2) + "\" (" + H.S(this._message) + ")";
+    },
+    $isNoSuchMethodError: true,
+    $isError: true,
+    static: {JsNoSuchMethodError$: function(_message, match) {
+        var t1, t2;
+        t1 = match == null;
+        t2 = t1 ? null : match.method;
+        t1 = t1 ? null : match.receiver;
+        return new H.JsNoSuchMethodError(_message, t2, t1);
+      }}
+  },
+  UnknownJsTypeError: {
+    "^": "Error;_message",
+    toString$0: function(_) {
+      var t1 = this._message;
+      return C.JSString_methods.get$isEmpty(t1) ? "Error" : "Error: " + t1;
+    }
+  },
+  unwrapException_saveStackTrace: {
+    "^": "Closure:13;ex_0",
+    call$1: function(error) {
+      if (!!J.getInterceptor(error).$isError)
+        if (error.$thrownJsError == null)
+          error.$thrownJsError = this.ex_0;
+      return error;
+    },
+    $isFunction: true
+  },
+  _StackTrace: {
+    "^": "Object;_exception,_trace",
+    toString$0: function(_) {
+      var t1, trace;
+      t1 = this._trace;
+      if (t1 != null)
+        return t1;
+      t1 = this._exception;
+      trace = typeof t1 === "object" ? t1.stack : null;
+      t1 = trace == null ? "" : trace;
+      this._trace = t1;
+      return t1;
+    }
+  },
+  invokeClosure_closure: {
+    "^": "Closure:69;closure_0",
+    call$0: function() {
+      return this.closure_0.call$0();
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure0: {
+    "^": "Closure:69;closure_1,arg1_2",
+    call$0: function() {
+      return this.closure_1.call$1(this.arg1_2);
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure1: {
+    "^": "Closure:69;closure_3,arg1_4,arg2_5",
+    call$0: function() {
+      return this.closure_3.call$2(this.arg1_4, this.arg2_5);
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure2: {
+    "^": "Closure:69;closure_6,arg1_7,arg2_8,arg3_9",
+    call$0: function() {
+      return this.closure_6.call$3(this.arg1_7, this.arg2_8, this.arg3_9);
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure3: {
+    "^": "Closure:69;closure_10,arg1_11,arg2_12,arg3_13,arg4_14",
+    call$0: function() {
+      return this.closure_10.call$4(this.arg1_11, this.arg2_12, this.arg3_13, this.arg4_14);
+    },
+    $isFunction: true
+  },
+  Closure: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Closure";
+    },
+    $isFunction: true,
+    get$$call: function() {
+      return this;
+    }
+  },
+  TearOffClosure: {
+    "^": "Closure;"
+  },
+  BoundClosure: {
+    "^": "TearOffClosure;_self,_target,_receiver,__js_helper$_name",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!J.getInterceptor(other).$isBoundClosure)
+        return false;
+      return this._self === other._self && this._target === other._target && this._receiver === other._receiver;
+    },
+    get$hashCode: function(_) {
+      var t1, receiverHashCode;
+      t1 = this._receiver;
+      if (t1 == null)
+        receiverHashCode = H.Primitives_objectHashCode(this._self);
+      else
+        receiverHashCode = typeof t1 !== "object" ? J.get$hashCode$(t1) : H.Primitives_objectHashCode(t1);
+      return J.$xor$n(receiverHashCode, H.Primitives_objectHashCode(this._target));
+    },
+    $isBoundClosure: true,
+    static: {"^": "BoundClosure_selfFieldNameCache,BoundClosure_receiverFieldNameCache", BoundClosure_selfOf: function(closure) {
+        return closure._self;
+      }, BoundClosure_receiverOf: function(closure) {
+        return closure._receiver;
+      }, BoundClosure_selfFieldName: function() {
+        var t1 = $.BoundClosure_selfFieldNameCache;
+        if (t1 == null) {
+          t1 = H.BoundClosure_computeFieldNamed("self");
+          $.BoundClosure_selfFieldNameCache = t1;
+        }
+        return t1;
+      }, BoundClosure_computeFieldNamed: function(fieldName) {
+        var template, t1, names, i, $name;
+        template = new H.BoundClosure("self", "target", "receiver", "name");
+        t1 = Object.getOwnPropertyNames(template);
+        t1.fixed$length = init;
+        names = t1;
+        for (t1 = names.length, i = 0; i < t1; ++i) {
+          $name = names[i];
+          if (template[$name] === fieldName)
+            return $name;
+        }
+      }}
+  },
+  CastErrorImplementation: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return this.message;
+    },
+    $isError: true,
+    static: {CastErrorImplementation$: function(actualType, expectedType) {
+        return new H.CastErrorImplementation("CastError: Casting value of type " + H.S(actualType) + " to incompatible type " + H.S(expectedType));
+      }}
+  },
+  RuntimeError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return "RuntimeError: " + H.S(this.message);
+    },
+    static: {RuntimeError$: function(message) {
+        return new H.RuntimeError(message);
+      }}
+  },
+  RuntimeType: {
+    "^": "Object;"
+  },
+  RuntimeFunctionType: {
+    "^": "RuntimeType;returnType,parameterTypes,optionalParameterTypes,namedParameters",
+    _isTest$1: function(expression) {
+      var functionTypeObject = this._extractFunctionTypeObjectFrom$1(expression);
+      return functionTypeObject == null ? false : H.isFunctionSubtype(functionTypeObject, this.toRti$0());
+    },
+    _extractFunctionTypeObjectFrom$1: function(o) {
+      var interceptor = J.getInterceptor(o);
+      return "$signature" in interceptor ? interceptor.$signature() : null;
+    },
+    toRti$0: function() {
+      var result, t1, t2, namedRti, keys, i, $name;
+      result = {func: "dynafunc"};
+      t1 = this.returnType;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isVoidRuntimeType)
+        result.void = true;
+      else if (!t2.$isDynamicRuntimeType)
+        result.ret = t1.toRti$0();
+      t1 = this.parameterTypes;
+      if (t1 != null && t1.length !== 0)
+        result.args = H.RuntimeFunctionType_listToRti(t1);
+      t1 = this.optionalParameterTypes;
+      if (t1 != null && t1.length !== 0)
+        result.opt = H.RuntimeFunctionType_listToRti(t1);
+      t1 = this.namedParameters;
+      if (t1 != null) {
+        namedRti = {};
+        keys = H.extractKeys(t1);
+        for (t2 = keys.length, i = 0; i < t2; ++i) {
+          $name = keys[i];
+          namedRti[$name] = t1[$name].toRti$0();
+        }
+        result.named = namedRti;
+      }
+      return result;
+    },
+    toString$0: function(_) {
+      var t1, t2, result, needsComma, i, type, keys, $name;
+      t1 = this.parameterTypes;
+      if (t1 != null)
+        for (t2 = t1.length, result = "(", needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+          type = t1[i];
+          if (needsComma)
+            result += ", ";
+          result += H.S(type);
+        }
+      else {
+        result = "(";
+        needsComma = false;
+      }
+      t1 = this.optionalParameterTypes;
+      if (t1 != null && t1.length !== 0) {
+        result = (needsComma ? result + ", " : result) + "[";
+        for (t2 = t1.length, needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+          type = t1[i];
+          if (needsComma)
+            result += ", ";
+          result += H.S(type);
+        }
+        result += "]";
+      } else {
+        t1 = this.namedParameters;
+        if (t1 != null) {
+          result = (needsComma ? result + ", " : result) + "{";
+          keys = H.extractKeys(t1);
+          for (t2 = keys.length, needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+            $name = keys[i];
+            if (needsComma)
+              result += ", ";
+            result += H.S(t1[$name].toRti$0()) + " " + $name;
+          }
+          result += "}";
+        }
+      }
+      return result + (") -> " + H.S(this.returnType));
+    },
+    static: {"^": "RuntimeFunctionType_inAssert", RuntimeFunctionType_listToRti: function(list) {
+        var result, t1, i;
+        list = list;
+        result = [];
+        for (t1 = list.length, i = 0; i < t1; ++i)
+          result.push(list[i].toRti$0());
+        return result;
+      }}
+  },
+  DynamicRuntimeType: {
+    "^": "RuntimeType;",
+    toString$0: function(_) {
+      return "dynamic";
+    },
+    toRti$0: function() {
+      return;
+    },
+    $isDynamicRuntimeType: true
+  },
+  RuntimeTypePlain: {
+    "^": "RuntimeType;name>",
+    toRti$0: function() {
+      var t1, rti;
+      t1 = this.name;
+      rti = init.allClasses[t1];
+      if (rti == null)
+        throw H.wrapException("no type for '" + H.S(t1) + "'");
+      return rti;
+    },
+    toString$0: function(_) {
+      return this.name;
+    }
+  },
+  RuntimeTypeGeneric: {
+    "^": "RuntimeType;name>,arguments,rti",
+    toRti$0: function() {
+      var t1, result;
+      t1 = this.rti;
+      if (t1 != null)
+        return t1;
+      t1 = this.name;
+      result = [init.allClasses[t1]];
+      if (0 >= result.length)
+        return H.ioore(result, 0);
+      if (result[0] == null)
+        throw H.wrapException("no type for '" + H.S(t1) + "<...>'");
+      for (t1 = this.arguments, t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        result.push(t1._current.toRti$0());
+      this.rti = result;
+      return result;
+    },
+    toString$0: function(_) {
+      return H.S(this.name) + "<" + J.join$1$ax(this.arguments, ", ") + ">";
+    }
+  },
+  TypeImpl: {
+    "^": "Object;_typeName,_unmangledName",
+    toString$0: function(_) {
+      var t1, unmangledName;
+      t1 = this._unmangledName;
+      if (t1 != null)
+        return t1;
+      unmangledName = this._typeName.replace(/[^<,> ]+/g, function(m) {
+        return init.mangledGlobalNames[m] || m;
+      });
+      this._unmangledName = unmangledName;
+      return unmangledName;
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this._typeName);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isTypeImpl && J.$eq(this._typeName, other._typeName);
+    },
+    $isTypeImpl: true,
+    $isType: true
+  },
+  initHooks_closure: {
+    "^": "Closure:13;getTag_0",
+    call$1: function(o) {
+      return this.getTag_0(o);
+    },
+    $isFunction: true
+  },
+  initHooks_closure0: {
+    "^": "Closure:78;getUnknownTag_1",
+    call$2: function(o, tag) {
+      return this.getUnknownTag_1(o, tag);
+    },
+    $isFunction: true
+  },
+  initHooks_closure1: {
+    "^": "Closure:5;prototypeForTag_2",
+    call$1: function(tag) {
+      return this.prototypeForTag_2(tag);
+    },
+    $isFunction: true
+  },
+  JSSyntaxRegExp: {
+    "^": "Object;pattern,_nativeRegExp,_nativeGlobalRegExp,_nativeAnchoredRegExp",
+    get$_nativeGlobalVersion: function() {
+      var t1 = this._nativeGlobalRegExp;
+      if (t1 != null)
+        return t1;
+      t1 = this._nativeRegExp;
+      t1 = H.JSSyntaxRegExp_makeNative(this.pattern, t1.multiline, !t1.ignoreCase, true);
+      this._nativeGlobalRegExp = t1;
+      return t1;
+    },
+    get$_nativeAnchoredVersion: function() {
+      var t1 = this._nativeAnchoredRegExp;
+      if (t1 != null)
+        return t1;
+      t1 = this._nativeRegExp;
+      t1 = H.JSSyntaxRegExp_makeNative(this.pattern + "|()", t1.multiline, !t1.ignoreCase, true);
+      this._nativeAnchoredRegExp = t1;
+      return t1;
+    },
+    firstMatch$1: function(str) {
+      var m;
+      if (typeof str !== "string")
+        H.throwExpression(P.ArgumentError$(str));
+      m = this._nativeRegExp.exec(str);
+      if (m == null)
+        return;
+      return H._MatchImplementation$(this, m);
+    },
+    hasMatch$1: function(str) {
+      if (typeof str !== "string")
+        H.throwExpression(P.ArgumentError$(str));
+      return this._nativeRegExp.test(str);
+    },
+    allMatches$1: function(_, str) {
+      return new H._AllMatchesIterable(this, str);
+    },
+    _execGlobal$2: function(string, start) {
+      var regexp, match;
+      regexp = this.get$_nativeGlobalVersion();
+      regexp.lastIndex = start;
+      match = regexp.exec(string);
+      if (match == null)
+        return;
+      return H._MatchImplementation$(this, match);
+    },
+    _execAnchored$2: function(string, start) {
+      var regexp, match, t1, t2;
+      regexp = this.get$_nativeAnchoredVersion();
+      regexp.lastIndex = start;
+      match = regexp.exec(string);
+      if (match == null)
+        return;
+      t1 = match.length;
+      t2 = t1 - 1;
+      if (t2 < 0)
+        return H.ioore(match, t2);
+      if (match[t2] != null)
+        return;
+      C.JSArray_methods.set$length(match, t2);
+      return H._MatchImplementation$(this, match);
+    },
+    matchAsPrefix$2: function(_, string, start) {
+      var t1;
+      if (start >= 0) {
+        t1 = J.get$length$asx(string);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = start > t1;
+      } else
+        t1 = true;
+      if (t1)
+        throw H.wrapException(P.RangeError$range(start, 0, J.get$length$asx(string)));
+      return this._execAnchored$2(string, start);
+    },
+    matchAsPrefix$1: function($receiver, string) {
+      return this.matchAsPrefix$2($receiver, string, 0);
+    },
+    $isJSSyntaxRegExp: true,
+    $isRegExp: true,
+    static: {JSSyntaxRegExp_makeNative: function(source, multiLine, caseSensitive, global) {
+        var m, i, g, regexp, errorMessage;
+        m = multiLine ? "m" : "";
+        i = caseSensitive ? "" : "i";
+        g = global ? "g" : "";
+        regexp = function() {
+          try {
+            return new RegExp(source, m + i + g);
+          } catch (e) {
+            return e;
+          }
+
+        }();
+        if (regexp instanceof RegExp)
+          return regexp;
+        errorMessage = String(regexp);
+        throw H.wrapException(P.FormatException$("Illegal RegExp pattern: " + source + ", " + errorMessage));
+      }}
+  },
+  _MatchImplementation: {
+    "^": "Object;pattern,_match",
+    $index: function(_, index) {
+      var t1 = this._match;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    _MatchImplementation$2: function(pattern, _match) {
+    },
+    $isMatch: true,
+    static: {_MatchImplementation$: function(pattern, _match) {
+        var t1 = new H._MatchImplementation(pattern, _match);
+        t1._MatchImplementation$2(pattern, _match);
+        return t1;
+      }}
+  },
+  _AllMatchesIterable: {
+    "^": "IterableBase;_re,_string",
+    get$iterator: function(_) {
+      return new H._AllMatchesIterator(this._re, this._string, null);
+    },
+    $asIterableBase: function() {
+      return [P.Match];
+    },
+    $asIterable: function() {
+      return [P.Match];
+    }
+  },
+  _AllMatchesIterator: {
+    "^": "Object;_regExp,_string,__js_helper$_current",
+    get$current: function() {
+      return this.__js_helper$_current;
+    },
+    moveNext$0: function() {
+      var t1, t2, index;
+      if (this._string == null)
+        return false;
+      t1 = this.__js_helper$_current;
+      if (t1 != null) {
+        t1 = t1._match;
+        t2 = t1.index;
+        if (0 >= t1.length)
+          return H.ioore(t1, 0);
+        t1 = J.get$length$asx(t1[0]);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        index = t2 + t1;
+        if (this.__js_helper$_current._match.index === index)
+          ++index;
+      } else
+        index = 0;
+      t1 = this._regExp._execGlobal$2(this._string, index);
+      this.__js_helper$_current = t1;
+      if (t1 == null) {
+        this._string = null;
+        return false;
+      }
+      return true;
+    }
+  },
+  StringMatch: {
+    "^": "Object;start,input,pattern",
+    $index: function(_, g) {
+      if (!J.$eq(g, 0))
+        H.throwExpression(P.RangeError$value(g));
+      return this.pattern;
+    },
+    $isMatch: true
+  }
+}],
+["action_link_element", "package:observatory/src/elements/action_link.dart", , X, {
+  "^": "",
+  ActionLinkElement: {
+    "^": "PolymerElement_ChangeNotifier;_action_link_element$__$busy,_action_link_element$__$callback,_action_link_element$__$label,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$busy: function(receiver) {
+      return receiver._action_link_element$__$busy;
+    },
+    set$busy: function(receiver, value) {
+      receiver._action_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._action_link_element$__$busy, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._action_link_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._action_link_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._action_link_element$__$callback, value);
+    },
+    get$label: function(receiver) {
+      return receiver._action_link_element$__$label;
+    },
+    set$label: function(receiver, value) {
+      receiver._action_link_element$__$label = this.notifyPropertyChange$3(receiver, C.Symbol_label, receiver._action_link_element$__$label, value);
+    },
+    doAction$3: [function(receiver, a, b, c) {
+      var t1 = receiver._action_link_element$__$busy;
+      if (t1 === true)
+        return;
+      if (receiver._action_link_element$__$callback != null) {
+        receiver._action_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, t1, true);
+        this.callback$1(receiver, null).whenComplete$1(new X.ActionLinkElement_doAction_closure(receiver));
+      }
+    }, "call$3", "get$doAction", 6, 0, 79, 46, 47, 80],
+    static: {ActionLinkElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._action_link_element$__$busy = false;
+        receiver._action_link_element$__$callback = null;
+        receiver._action_link_element$__$label = "action";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ActionLinkElement_methods.Element$created$0(receiver);
+        C.ActionLinkElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ActionLinkElement_doAction_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      t1._action_link_element$__$busy = J.notifyPropertyChange$3$x(t1, C.Symbol_busy, t1._action_link_element$__$busy, false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+}],
+["app", "package:observatory/app.dart", , G, {
+  "^": "",
+  GoogleChart__initOnceOnComplete: [function(_) {
+    var t1;
+    N.Logger_Logger("").info$1("Google Charts API loaded");
+    t1 = J.$index$asx(J.$index$asx($.get$context(), "google"), "visualization");
+    $.GoogleChart__api = t1;
+    return t1;
+  }, "call$1", "GoogleChart__initOnceOnComplete$closure", 2, 0, 13, 14],
+  Utils_formatPercent: function(a, total) {
+    return C.JSNumber_methods.toStringAsFixed$1(100 * J.$div$n(a, total), 2) + "%";
+  },
+  Utils_zeroPad: function(value, pad) {
+    var prefix;
+    for (prefix = ""; pad > 1;) {
+      --pad;
+      if (value < Math.pow(10, pad))
+        prefix += "0";
+    }
+    return prefix + H.S(value);
+  },
+  Utils_formatCommaSeparated: [function(v) {
+    var t1, mod, r;
+    t1 = J.getInterceptor$n(v);
+    if (t1.$lt(v, 1000))
+      return t1.toString$0(v);
+    mod = t1.$mod(v, 1000);
+    v = t1.$tdiv(v, 1000);
+    r = G.Utils_zeroPad(mod, 3);
+    for (; t1 = J.getInterceptor$n(v), t1.$gt(v, 1000);) {
+      r = G.Utils_zeroPad(t1.$mod(v, 1000), 3) + "," + r;
+      v = t1.$tdiv(v, 1000);
+    }
+    return !t1.$eq(v, 0) ? H.S(v) + "," + r : r;
+  }, "call$1", "Utils_formatCommaSeparated$closure", 2, 0, 15],
+  Utils_formatTimePrecise: function(time) {
+    var millis, hours, minutes, seconds;
+    millis = C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(time * 1000));
+    hours = C.JSInt_methods._tdivFast$1(millis, 3600000);
+    millis = C.JSInt_methods.$mod(millis, 3600000);
+    minutes = C.JSInt_methods._tdivFast$1(millis, 60000);
+    millis = C.JSInt_methods.$mod(millis, 60000);
+    seconds = C.JSInt_methods._tdivFast$1(millis, 1000);
+    millis = C.JSInt_methods.$mod(millis, 1000);
+    if (hours > 0)
+      return G.Utils_zeroPad(hours, 2) + ":" + G.Utils_zeroPad(minutes, 2) + ":" + G.Utils_zeroPad(seconds, 2) + "." + G.Utils_zeroPad(millis, 3);
+    else
+      return G.Utils_zeroPad(minutes, 2) + ":" + G.Utils_zeroPad(seconds, 2) + "." + G.Utils_zeroPad(millis, 3);
+  },
+  Utils_formatSize: [function(bytes) {
+    var t1 = J.getInterceptor$n(bytes);
+    if (t1.$lt(bytes, 1024))
+      return H.S(bytes) + "B";
+    else if (t1.$lt(bytes, 1048576))
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1024), 1) + "KB";
+    else if (t1.$lt(bytes, 1073741824))
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1048576), 1) + "MB";
+    else if (t1.$lt(bytes, 1099511627776))
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1073741824), 1) + "GB";
+    else
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1099511627776), 1) + "TB";
+  }, "call$1", "Utils_formatSize$closure", 2, 0, 15, 16],
+  Utils_formatTime: function(time) {
+    var millis, hours, minutes, seconds;
+    if (time == null)
+      return "-";
+    millis = J.round$0$n(J.$mul$ns(time, 1000));
+    hours = C.JSInt_methods._tdivFast$1(millis, 3600000);
+    millis = C.JSInt_methods.$mod(millis, 3600000);
+    minutes = C.JSInt_methods._tdivFast$1(millis, 60000);
+    seconds = C.JSInt_methods._tdivFast$1(C.JSInt_methods.$mod(millis, 60000), 1000);
+    P.StringBuffer$("");
+    if (hours !== 0)
+      return "" + hours + "h " + minutes + "m " + seconds + "s";
+    if (minutes !== 0)
+      return "" + minutes + "m " + seconds + "s";
+    return "" + seconds + "s";
+  },
+  Pane: {
+    "^": "ChangeNotifier;",
+    get$element: function(_) {
+      return this._app$__$element;
+    },
+    $isPane: true
+  },
+  ServiceObjectPane: {
+    "^": "Pane;app,_app$__$element,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onInstall$0: function() {
+      if (this._app$__$element == null) {
+        var t1 = W._ElementFactoryProvider_createElement_tag("service-view", null);
+        this._app$__$element = F.notifyPropertyChangeHelper(this, C.Symbol_element, this._app$__$element, t1);
+      }
+    },
+    visit$1: function(url) {
+      if (J.$eq(url, ""))
+        return;
+      this.app.vm.get$1(url).then$1(new G.ServiceObjectPane_visit_closure(this));
+    },
+    canVisit$1: function(url) {
+      return true;
+    }
+  },
+  ServiceObjectPane_visit_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(obj) {
+      J.set$object$x(this.this_0._app$__$element, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  ClassTreePane: {
+    "^": "Pane;app,_app$__$element,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onInstall$0: function() {
+      if (this._app$__$element == null) {
+        var t1 = W._ElementFactoryProvider_createElement_tag("class-tree", null);
+        this._app$__$element = F.notifyPropertyChangeHelper(this, C.Symbol_element, this._app$__$element, t1);
+      }
+    },
+    visit$1: function(url) {
+      this.app.vm.get$1(J.substring$1$s(url, 11)).then$1(new G.ClassTreePane_visit_closure(this));
+    },
+    canVisit$1: function(url) {
+      return J.startsWith$1$s(url, "class-tree/");
+    },
+    static: {"^": "ClassTreePane__urlPrefix"}
+  },
+  ClassTreePane_visit_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(i) {
+      var t1 = this.this_0._app$__$element;
+      if (t1 != null)
+        J.set$isolate$x(t1, i);
+    }, "call$1", null, 2, 0, null, 82, "call"],
+    $isFunction: true
+  },
+  ErrorViewPane: {
+    "^": "Pane;app,_app$__$element,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onInstall$0: function() {
+      if (this._app$__$element == null) {
+        var t1 = W._ElementFactoryProvider_createElement_tag("service-view", null);
+        this._app$__$element = F.notifyPropertyChangeHelper(this, C.Symbol_element, this._app$__$element, t1);
+      }
+    },
+    visit$1: function(url) {
+      var t1, t2;
+      t1 = H.interceptedTypeCast(this._app$__$element, "$isServiceObjectViewElement");
+      t2 = this.app.lastErrorOrException;
+      t1._service_object_view_element$__$object = J.notifyPropertyChange$3$x(t1, C.Symbol_object, t1._service_object_view_element$__$object, t2);
+    },
+    canVisit$1: function(url) {
+      return J.startsWith$1$s(url, "error/");
+    }
+  },
+  ObservatoryApplication: {
+    "^": "ChangeNotifier;_paneRegistry,_serviceObjectPane,_currentPane,locationManager,vm>,_app$__$isolate,rootElement,lastErrorOrException,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$isolate: function(_) {
+      return this._app$__$isolate;
+    },
+    set$isolate: function(_, value) {
+      this._app$__$isolate = F.notifyPropertyChangeHelper(this, C.Symbol_isolate, this._app$__$isolate, value);
+    },
+    _initOnce$0: function() {
+      var t1, t2;
+      this._registerPanes$0();
+      t1 = this.vm;
+      t2 = t1.errors;
+      H.setRuntimeTypeInfo(new P._BroadcastStream(t2), [H.getTypeArgumentByIndex(t2, 0)]).listen$1(this.get$_app$_onError());
+      t1 = t1.exceptions;
+      H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]).listen$1(this.get$_onException());
+      t1 = this.locationManager;
+      $.location = t1;
+      t1._app = this;
+      t2 = H.setRuntimeTypeInfo(new W._EventStream(window, C.EventStreamProvider_popstate._eventType, false), [null]);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t2._html$_target, t2._eventType, W._wrapZone(t1.get$_onLocationChange()), t2._useCapture), [H.getTypeArgumentByIndex(t2, 0)])._tryResume$0();
+      t1._onStartup$0();
+    },
+    _registerPanes$0: function() {
+      var t1, t2;
+      if (this._serviceObjectPane != null)
+        return;
+      t1 = this._paneRegistry;
+      t1.push(new G.ClassTreePane(this, null, null, null));
+      t1.push(new G.ErrorViewPane(this, null, null, null));
+      t2 = new G.ServiceObjectPane(this, null, null, null);
+      this._serviceObjectPane = t2;
+      t1.push(t2);
+    },
+    _app$_onError$1: [function(error) {
+      this.lastErrorOrException = error;
+      this._visit$2("error/", null);
+    }, "call$1", "get$_app$_onError", 2, 0, 83, 24],
+    _onException$1: [function(exception) {
+      this.lastErrorOrException = exception;
+      this._visit$2("error/", null);
+    }, "call$1", "get$_onException", 2, 0, 84, 85],
+    _visit$2: function(url, args) {
+      var t1, i, pane;
+      for (t1 = this._paneRegistry, i = 0; i < t1.length; ++i) {
+        pane = t1[i];
+        if (pane.canVisit$1(url)) {
+          this._installPane$1(pane);
+          pane.visit$1(url);
+          return;
+        }
+      }
+      throw H.wrapException(P.FallThroughError$());
+    },
+    _installPane$1: function(pane) {
+      var line, t1, t2;
+      line = "Installing " + J.toString$0(pane);
+      t1 = $.printToZone;
+      if (t1 == null)
+        H.printString(line);
+      else
+        t1.call$1(line);
+      t1 = this._currentPane;
+      if (t1 == null ? pane == null : t1 === pane)
+        return;
+      if (t1 != null) {
+        t2 = t1._app$__$element;
+        if (t1.get$hasObservers(t1) && t2 != null) {
+          t2 = new T.PropertyChangeRecord(t1, C.Symbol_element, t2, null);
+          t2.$builtinTypeInfo = [null];
+          t1.notifyChange$1(t1, t2);
+        }
+        t1._app$__$element = null;
+      }
+      pane.onInstall$0();
+      t1 = this.rootElement;
+      J._clearChildren$0$x(t1);
+      t1.appendChild(pane._app$__$element);
+      this._currentPane = pane;
+    },
+    ObservatoryApplication$1: function(rootElement) {
+      this._initOnce$0();
+    },
+    ObservatoryApplication$devtools$1: function(rootElement) {
+      this._initOnce$0();
+    }
+  },
+  DataTable: {
+    "^": "Object;_app$_table",
+    get$columns: function() {
+      return this._app$_table.callMethod$1("getNumberOfColumns");
+    },
+    get$rows: function(_) {
+      return this._app$_table.callMethod$1("getNumberOfRows");
+    },
+    clearRows$0: function() {
+      var t1 = this._app$_table;
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+    },
+    addRow$1: function(_, row) {
+      var t1 = [];
+      C.JSArray_methods.addAll$1(t1, J.map$1$ax(row, P._convertToJS$closure()));
+      this._app$_table.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t1), [null])]);
+    }
+  },
+  Chart: {
+    "^": "Object;_app$_chart,options",
+    draw$1: function(table) {
+      var jsOptions = P.JsObject_JsObject$jsify(this.options);
+      this._app$_chart.callMethod$2("draw", [table._app$_table, jsOptions]);
+    }
+  },
+  LocationManager: {
+    "^": "Observable;",
+    _go$1: function(url) {
+      var chunks, t1, args;
+      if (J.getInterceptor$s(url).startsWith$1(url, "#"))
+        url = C.JSString_methods.substring$1(url, 1);
+      if (C.JSString_methods.startsWith$1(url, "/"))
+        url = C.JSString_methods.substring$1(url, 1);
+      if (C.JSString_methods.contains$1(url, "#")) {
+        chunks = url.split("#");
+        t1 = chunks.length;
+        if (0 >= t1)
+          return H.ioore(chunks, 0);
+        url = chunks[0];
+        if (t1 > 1 && !J.$eq(chunks[1], "")) {
+          if (1 >= chunks.length)
+            return H.ioore(chunks, 1);
+          args = chunks[1];
+        } else
+          args = null;
+      } else
+        args = null;
+      this._app._visit$2(url, args);
+    },
+    onGoto$3: function($event, detail, target) {
+      var href, t1, t2, t3;
+      href = J.get$attributes$x(target)._html$_element.getAttribute("href");
+      t1 = J.getInterceptor$x($event);
+      t2 = t1.get$button($event);
+      if (typeof t2 !== "number")
+        return t2.$gt();
+      if (t2 > 1 || t1.get$metaKey($event) === true || t1.get$ctrlKey($event) === true || t1.get$shiftKey($event) === true || t1.get$altKey($event) === true)
+        return;
+      t2 = $.location;
+      t3 = t2._lastUrl;
+      if (t3 == null ? href != null : t3 !== href) {
+        N.Logger_Logger("").info$1("Navigated to " + H.S(href));
+        window.history.pushState(href, document.title, href);
+        t2._lastUrl = href;
+      }
+      t2._go$1(href);
+      t1.preventDefault$0($event);
+    }
+  },
+  HashLocationManager: {
+    "^": "LocationManager;_initialPath,_app,_lastUrl,observable$Observable$_observable$_changes,observable$Observable$_values,observable$Observable$_records",
+    _onStartup$0: function() {
+      var initialPath = H.S(window.location.hash);
+      if (window.location.hash === "" || window.location.hash === "#")
+        initialPath = "#" + this._initialPath;
+      window.history.pushState(initialPath, document.title, initialPath);
+      this._go$1(window.location.hash);
+    },
+    _onLocationChange$1: [function(_) {
+      this._go$1(window.location.hash);
+    }, "call$1", "get$_onLocationChange", 2, 0, 86, 14]
+  },
+  TableTreeRow: {
+    "^": "ChangeNotifier;parent>,depth<,children>,columns<",
+    get$expander: function(_) {
+      return this._app$__$expander;
+    },
+    get$expanderStyle: function() {
+      return this._app$__$expanderStyle;
+    },
+    get$expanded: function(_) {
+      return this._expanded;
+    },
+    set$expanded: function(_, expanded) {
+      var t1 = J.$eq(this._expanded, expanded);
+      this._expanded = expanded;
+      if (!t1) {
+        t1 = this._app$__$expander;
+        if (expanded === true) {
+          this._app$__$expander = F.notifyPropertyChangeHelper(this, C.Symbol_expander, t1, "\u21b3");
+          this.onShow$0(0);
+        } else {
+          this._app$__$expander = F.notifyPropertyChangeHelper(this, C.Symbol_expander, t1, "\u2192");
+          this.onHide$0();
+        }
+      }
+    },
+    toggle$0: function() {
+      this.set$expanded(0, this._expanded !== true);
+      return this._expanded;
+    },
+    TableTreeRow$1: function($parent) {
+      if (!this.hasChildren$0())
+        this._app$__$expanderStyle = F.notifyPropertyChangeHelper(this, C.Symbol_expanderStyle, this._app$__$expanderStyle, "visibility:hidden;");
+    },
+    $isTableTreeRow: true
+  },
+  TableTree: {
+    "^": "ChangeNotifier;rows>,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    initialize$1: function(root) {
+      var t1, t2;
+      t1 = this.rows;
+      t2 = J.getInterceptor$ax(t1);
+      t2.clear$0(t1);
+      root.onShow$0(0);
+      t2.addAll$1(t1, root.children);
+    },
+    toggle$1: function(rowIndex) {
+      var t1, t2, row;
+      t1 = this.rows;
+      t2 = J.getInterceptor$asx(t1);
+      row = t2.$index(t1, rowIndex);
+      if (row.toggle$0() === true)
+        t2.insertAll$2(t1, t2.indexOf$1(t1, row) + 1, J.get$children$x(row));
+      else
+        this._collapse$1(row);
+    },
+    _collapse$1: function(row) {
+      var t1, childCount, i, t2, t3;
+      t1 = J.getInterceptor$x(row);
+      childCount = J.get$length$asx(t1.get$children(row));
+      if (childCount === 0)
+        return;
+      for (i = 0; i < childCount; ++i)
+        if (J.get$expanded$x(J.$index$asx(t1.get$children(row), i)) === true)
+          this._collapse$1(J.$index$asx(t1.get$children(row), i));
+      t1.set$expanded(row, false);
+      t1 = this.rows;
+      t2 = J.getInterceptor$asx(t1);
+      t3 = t2.indexOf$1(t1, row) + 1;
+      t2.removeRange$2(t1, t3, t3 + childCount);
+    }
+  },
+  SortedTableColumn: {
+    "^": "Object;label>,formatter<",
+    static: {SortedTableColumn_toStringFormatter: [function(v) {
+        return v != null ? J.toString$0(v) : "<null>";
+      }, "call$1", "SortedTableColumn_toStringFormatter$closure", 2, 0, 17]}
+  },
+  SortedTableRow: {
+    "^": "Object;values>",
+    $isSortedTableRow: true
+  },
+  SortedTable: {
+    "^": "ChangeNotifier;columns<,rows>,sortedRows<",
+    set$sortColumnIndex: function(index) {
+      this._sortColumnIndex = index;
+      F.notifyPropertyChangeHelper(this, C.Symbol_getColumnLabel, 0, 1);
+    },
+    get$sortColumnIndex: function() {
+      return this._sortColumnIndex;
+    },
+    get$sortDescending: function() {
+      return this._sortDescending;
+    },
+    set$sortDescending: function(descending) {
+      this._sortDescending = descending;
+      F.notifyPropertyChangeHelper(this, C.Symbol_getColumnLabel, 0, 1);
+    },
+    getSortKeyFor$2: function(row, col) {
+      var t1 = this.rows;
+      if (row >>> 0 !== row || row >= t1.length)
+        return H.ioore(t1, row);
+      return J.$index$asx(J.get$values$x(t1[row]), col);
+    },
+    _sortFuncDescending$2: [function(i, j) {
+      var a = this.getSortKeyFor$2(i, this._sortColumnIndex);
+      return J.compareTo$1$ns(this.getSortKeyFor$2(j, this._sortColumnIndex), a);
+    }, "call$2", "get$_sortFuncDescending", 4, 0, 87],
+    _sortFuncAscending$2: [function(i, j) {
+      return J.compareTo$1$ns(this.getSortKeyFor$2(i, this._sortColumnIndex), this.getSortKeyFor$2(j, this._sortColumnIndex));
+    }, "call$2", "get$_sortFuncAscending", 4, 0, 87],
+    sort$0: function(_) {
+      var t1, t2;
+      new P.Stopwatch(1000000, null, null).start$0(0);
+      t1 = this.sortedRows;
+      if (this._sortDescending) {
+        t2 = this.get$_sortFuncDescending();
+        H.IterableMixinWorkaround_sortList(t1, t2);
+      } else {
+        t2 = this.get$_sortFuncAscending();
+        H.IterableMixinWorkaround_sortList(t1, t2);
+      }
+    },
+    clearRows$0: function() {
+      C.JSArray_methods.set$length(this.rows, 0);
+      C.JSArray_methods.set$length(this.sortedRows, 0);
+    },
+    addRow$1: function(_, row) {
+      var t1 = this.rows;
+      this.sortedRows.push(t1.length);
+      t1.push(row);
+    },
+    getFormattedValue$2: function(row, column) {
+      var t1, value;
+      t1 = this.rows;
+      if (row >= t1.length)
+        return H.ioore(t1, row);
+      value = J.$index$asx(J.get$values$x(t1[row]), column);
+      t1 = this.columns;
+      if (column >= t1.length)
+        return H.ioore(t1, column);
+      return t1[column].get$formatter().call$1(value);
+    },
+    getColumnLabel$1: [function(column) {
+      var t1;
+      if (!J.$eq(column, this._sortColumnIndex)) {
+        t1 = this.columns;
+        if (column >>> 0 !== column || column >= t1.length)
+          return H.ioore(t1, column);
+        return J.$add$ns(J.get$label$x(t1[column]), "\u2003");
+      }
+      t1 = this.columns;
+      if (column >>> 0 !== column || column >= t1.length)
+        return H.ioore(t1, column);
+      t1 = J.get$label$x(t1[column]);
+      return J.$add$ns(t1, this._sortDescending ? "\u25bc" : "\u25b2");
+    }, "call$1", "get$getColumnLabel", 2, 0, 15, 88]
+  }
+}],
+["app_bootstrap", "index.html_bootstrap.dart", , E, {
+  "^": "",
+  main0: [function() {
+    var t1, t2, t3, t4, t5;
+    t1 = P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, new E.main_closure(), C.Symbol_address, new E.main_closure0(), C.Symbol_anchor, new E.main_closure1(), C.Symbol_assertsEnabled, new E.main_closure2(), C.Symbol_bpt, new E.main_closure3(), C.Symbol_busy, new E.main_closure4(), C.Symbol_buttonClick, new E.main_closure5(), C.Symbol_bytes, new E.main_closure6(), C.Symbol_callback, new E.main_closure7(), C.Symbol_capacity, new E.main_closure8(), C.Symbol_change, new E.main_closure9(), C.Symbol_changeSort, new E.main_closure10(), C.Symbol_checked, new E.main_closure11(), C.Symbol_checkedText, new E.main_closure12(), C.Symbol_classTable, new E.main_closure13(), C.Symbol_classes, new E.main_closure14(), C.Symbol_closing, new E.main_closure15(), C.Symbol_cls, new E.main_closure16(), C.Symbol_code, new E.main_closure17(), C.Symbol_coloring, new E.main_closure18(), C.Symbol_columns, new E.main_closure19(), C.Symbol_connection, new E.main_closure20(), C.Symbol_counters, new E.main_closure21(), C.Symbol_countersChanged, new E.main_closure22(), C.Symbol_current, new E.main_closure23(), C.Symbol_descriptor, new E.main_closure24(), C.Symbol_descriptors, new E.main_closure25(), C.Symbol_devtools, new E.main_closure26(), C.Symbol_displayCutoff, new E.main_closure27(), C.Symbol_doAction, new E.main_closure28(), C.Symbol_element, new E.main_closure29(), C.Symbol_endLine, new E.main_closure30(), C.Symbol_endPos, new E.main_closure31(), C.Symbol_endPosChanged, new E.main_closure32(), C.Symbol_entry, new E.main_closure33(), C.Symbol_error, new E.main_closure34(), C.Symbol_eval, new E.main_closure35(), C.Symbol_evalNow, new E.main_closure36(), C.Symbol_exception, new E.main_closure37(), C.Symbol_expand, new E.main_closure38(), C.Symbol_expandChanged, new E.main_closure39(), C.Symbol_expanded, new E.main_closure40(), C.Symbol_expander, new E.main_closure41(), C.Symbol_expanderStyle, new E.main_closure42(), C.Symbol_expr, new E.main_closure43(), C.Symbol_external, new E.main_closure44(), C.Symbol_fd, new E.main_closure45(), C.Symbol_field, new E.main_closure46(), C.Symbol_fields, new E.main_closure47(), C.Symbol_file, new E.main_closure48(), C.Symbol_firstTokenPos, new E.main_closure49(), C.Symbol_flag, new E.main_closure50(), C.Symbol_flagList, new E.main_closure51(), C.Symbol_formatSize, new E.main_closure52(), C.Symbol_formatTime, new E.main_closure53(), C.Symbol_formattedAddress, new E.main_closure54(), C.Symbol_formattedAverage, new E.main_closure55(), C.Symbol_formattedCollections, new E.main_closure56(), C.Symbol_formattedDeoptId, new E.main_closure57(), C.Symbol_formattedExclusive, new E.main_closure58(), C.Symbol_formattedExclusiveTicks, new E.main_closure59(), C.Symbol_formattedInclusive, new E.main_closure60(), C.Symbol_formattedInclusiveTicks, new E.main_closure61(), C.Symbol_formattedLine, new E.main_closure62(), C.Symbol_formattedTotalCollectionTime, new E.main_closure63(), C.Symbol_fragmentation, new E.main_closure64(), C.Symbol_fragmentationChanged, new E.main_closure65(), C.Symbol_frame, new E.main_closure66(), C.Symbol_function, new E.main_closure67(), C.Symbol_functionChanged, new E.main_closure68(), C.Symbol_functions, new E.main_closure69(), C.Symbol_getColumnLabel, new E.main_closure70(), C.Symbol_goto, new E.main_closure71(), C.Symbol_gotoLink, new E.main_closure72(), C.Symbol_hasClass, new E.main_closure73(), C.Symbol_hasDescriptors, new E.main_closure74(), C.Symbol_hasDisassembly, new E.main_closure75(), C.Symbol_hasNoAllocations, new E.main_closure76(), C.Symbol_hasParent, new E.main_closure77(), C.Symbol_hashLinkWorkaround, new E.main_closure78(), C.Symbol_hideTagsChecked, new E.main_closure79(), C.Symbol_hits, new E.main_closure80(), C.Symbol_hoverText, new E.main_closure81(), C.Symbol_httpServer, new E.main_closure82(), C.Symbol_human, new E.main_closure83(), C.Symbol_idle, new E.main_closure84(), C.Symbol_imp, new E.main_closure85(), C.Symbol_imports, new E.main_closure86(), C.Symbol_instance, new E.main_closure87(), C.Symbol_instances, new E.main_closure88(), C.Symbol_instruction, new E.main_closure89(), C.Symbol_instructions, new E.main_closure90(), C.Symbol_interface, new E.main_closure91(), C.Symbol_interfaces, new E.main_closure92(), C.Symbol_internal, new E.main_closure93(), C.Symbol_io, new E.main_closure94(), C.Symbol_isAbstract, new E.main_closure95(), C.Symbol_isBool, new E.main_closure96(), C.Symbol_isComment, new E.main_closure97(), C.Symbol_isDart, new E.main_closure98(), C.Symbol_isDartCode, new E.main_closure99(), C.Symbol_isDouble, new E.main_closure100(), C.Symbol_isEmpty, new E.main_closure101(), C.Symbol_isError, new E.main_closure102(), C.Symbol_isInstance, new E.main_closure103(), C.Symbol_isInt, new E.main_closure104(), C.Symbol_isList, new E.main_closure105(), C.Symbol_isNotEmpty, new E.main_closure106(), C.Symbol_isNull, new E.main_closure107(), C.Symbol_isOptimized, new E.main_closure108(), C.Symbol_isPatch, new E.main_closure109(), C.Symbol_isPipe, new E.main_closure110(), C.Symbol_isString, new E.main_closure111(), C.Symbol_isType, new E.main_closure112(), C.Symbol_isUnexpected, new E.main_closure113(), C.Symbol_isolate, new E.main_closure114(), C.Symbol_isolateChanged, new E.main_closure115(), C.Symbol_isolates, new E.main_closure116(), C.Symbol_jumpTarget, new E.main_closure117(), C.Symbol_kind, new E.main_closure118(), C.Symbol_label, new E.main_closure119(), C.Symbol_last, new E.main_closure120(), C.Symbol_lastAccumulatorReset, new E.main_closure121(), C.Symbol_lastServiceGC, new E.main_closure122(), C.Symbol_lastTokenPos, new E.main_closure123(), C.Symbol_lastUpdate, new E.main_closure124(), C.Symbol_length, new E.main_closure125(), C.Symbol_lib, new E.main_closure126(), C.Symbol_libraries, new E.main_closure127(), C.Symbol_library, new E.main_closure128(), C.Symbol_line, new E.main_closure129(), C.Symbol_lineMode, new E.main_closure130(), C.Symbol_lineNumber, new E.main_closure131(), C.Symbol_lineNumbers, new E.main_closure132(), C.Symbol_lines, new E.main_closure133(), C.Symbol_link, new E.main_closure134(), C.Symbol_list, new E.main_closure135(), C.Symbol_listening, new E.main_closure136(), C.Symbol_loading, new E.main_closure137(), C.Symbol_localAddress, new E.main_closure138(), C.Symbol_localPort, new E.main_closure139(), C.Symbol_mainPort, new E.main_closure140(), C.Symbol_map, new E.main_closure141(), C.Symbol_mapAsString, new E.main_closure142(), C.Symbol_mapChanged, new E.main_closure143(), C.Symbol_message, new E.main_closure144(), C.Symbol_mouseOut, new E.main_closure145(), C.Symbol_mouseOver, new E.main_closure146(), C.Symbol_msg, new E.main_closure147(), C.Symbol_name, new E.main_closure148(), C.Symbol_nameIsEmpty, new E.main_closure149(), C.Symbol_newSpace, new E.main_closure150(), C.Symbol_object, new E.main_closure151(), C.Symbol_objectChanged, new E.main_closure152(), C.Symbol_objectPool, new E.main_closure153(), C.Symbol_oldSpace, new E.main_closure154(), C.Symbol_pad, new E.main_closure155(), C.Symbol_padding, new E.main_closure156(), C.Symbol_path, new E.main_closure157(), C.Symbol_pause, new E.main_closure158(), C.Symbol_pauseEvent, new E.main_closure159(), C.Symbol_pid, new E.main_closure160(), C.Symbol_pos, new E.main_closure161(), C.Symbol_posChanged, new E.main_closure162(), C.Symbol_process, new E.main_closure163(), C.Symbol_profile, new E.main_closure164(), C.Symbol_profileChanged, new E.main_closure165(), C.Symbol_protocol, new E.main_closure166(), C.Symbol_qualified, new E.main_closure167(), C.Symbol_qualifiedName, new E.main_closure168(), C.Symbol_reachable, new E.main_closure169(), C.Symbol_readClosed, new E.main_closure170(), C.Symbol_ref, new E.main_closure171(), C.Symbol_refChanged, new E.main_closure172(), C.Symbol_refresh, new E.main_closure173(), C.Symbol_refreshCoverage, new E.main_closure174(), C.Symbol_refreshGC, new E.main_closure175(), C.Symbol_refreshTime, new E.main_closure176(), C.Symbol_relativeLink, new E.main_closure177(), C.Symbol_remoteAddress, new E.main_closure178(), C.Symbol_remotePort, new E.main_closure179(), C.Symbol_resetAccumulator, new E.main_closure180(), C.Symbol_response, new E.main_closure181(), C.Symbol_result, new E.main_closure182(), C.Symbol_results, new E.main_closure183(), C.Symbol_resume, new E.main_closure184(), C.Symbol_retainedBytes, new E.main_closure185(), C.Symbol_retainedSize, new E.main_closure186(), C.Symbol_retainingPath, new E.main_closure187(), C.Symbol_rootLib, new E.main_closure188(), C.Symbol_row, new E.main_closure189(), C.Symbol_rows, new E.main_closure190(), C.Symbol_running, new E.main_closure191(), C.Symbol_sampleCount, new E.main_closure192(), C.Symbol_sampleDepth, new E.main_closure193(), C.Symbol_sampleRate, new E.main_closure194(), C.Symbol_script, new E.main_closure195(), C.Symbol_scriptChanged, new E.main_closure196(), C.Symbol_scripts, new E.main_closure197(), C.Symbol_selectExpr, new E.main_closure198(), C.Symbol_serviceType, new E.main_closure199(), C.Symbol_small, new E.main_closure200(), C.Symbol_socket, new E.main_closure201(), C.Symbol_socketOwner, new E.main_closure202(), C.Symbol_startLine, new E.main_closure203(), C.Symbol_status, new E.main_closure204(), C.Symbol_styleForHits, new E.main_closure205(), C.Symbol_subClasses, new E.main_closure206(), C.Symbol_subclass, new E.main_closure207(), C.Symbol_superClass, new E.main_closure208(), C.Symbol_tagSelector, new E.main_closure209(), C.Symbol_tagSelectorChanged, new E.main_closure210(), C.Symbol_text, new E.main_closure211(), C.Symbol_timeSpan, new E.main_closure212(), C.Symbol_tipExclusive, new E.main_closure213(), C.Symbol_tipKind, new E.main_closure214(), C.Symbol_tipParent, new E.main_closure215(), C.Symbol_tipTicks, new E.main_closure216(), C.Symbol_tipTime, new E.main_closure217(), C.Symbol_toggleExpand, new E.main_closure218(), C.Symbol_toggleExpanded, new E.main_closure219(), C.Symbol_tokenPos, new E.main_closure220(), C.Symbol_topFrame, new E.main_closure221(), C.Symbol_trace, new E.main_closure222(), C.Symbol_tree, new E.main_closure223(), C.Symbol_typeChecksEnabled, new E.main_closure224(), C.Symbol_uncheckedText, new E.main_closure225(), C.Symbol_updateLineMode, new E.main_closure226(), C.Symbol_uptime, new E.main_closure227(), C.Symbol_url, new E.main_closure228(), C.Symbol_used, new E.main_closure229(), C.Symbol_v, new E.main_closure230(), C.Symbol_variable, new E.main_closure231(), C.Symbol_variables, new E.main_closure232(), C.Symbol_version, new E.main_closure233(), C.Symbol_vm, new E.main_closure234(), C.Symbol_vmName, new E.main_closure235(), C.Symbol_webSocket, new E.main_closure236(), C.Symbol_writeClosed, new E.main_closure237()], null, null);
+    t2 = P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, new E.main_closure238(), C.Symbol_anchor, new E.main_closure239(), C.Symbol_busy, new E.main_closure240(), C.Symbol_callback, new E.main_closure241(), C.Symbol_checked, new E.main_closure242(), C.Symbol_checkedText, new E.main_closure243(), C.Symbol_classTable, new E.main_closure244(), C.Symbol_cls, new E.main_closure245(), C.Symbol_code, new E.main_closure246(), C.Symbol_connection, new E.main_closure247(), C.Symbol_counters, new E.main_closure248(), C.Symbol_devtools, new E.main_closure249(), C.Symbol_displayCutoff, new E.main_closure250(), C.Symbol_endLine, new E.main_closure251(), C.Symbol_endPos, new E.main_closure252(), C.Symbol_entry, new E.main_closure253(), C.Symbol_error, new E.main_closure254(), C.Symbol_eval, new E.main_closure255(), C.Symbol_exception, new E.main_closure256(), C.Symbol_expand, new E.main_closure257(), C.Symbol_expanded, new E.main_closure258(), C.Symbol_expr, new E.main_closure259(), C.Symbol_field, new E.main_closure260(), C.Symbol_file, new E.main_closure261(), C.Symbol_firstTokenPos, new E.main_closure262(), C.Symbol_flag, new E.main_closure263(), C.Symbol_flagList, new E.main_closure264(), C.Symbol_fragmentation, new E.main_closure265(), C.Symbol_frame, new E.main_closure266(), C.Symbol_function, new E.main_closure267(), C.Symbol_hasClass, new E.main_closure268(), C.Symbol_hasParent, new E.main_closure269(), C.Symbol_hashLinkWorkaround, new E.main_closure270(), C.Symbol_hideTagsChecked, new E.main_closure271(), C.Symbol_httpServer, new E.main_closure272(), C.Symbol_imp, new E.main_closure273(), C.Symbol_instance, new E.main_closure274(), C.Symbol_instances, new E.main_closure275(), C.Symbol_interface, new E.main_closure276(), C.Symbol_internal, new E.main_closure277(), C.Symbol_io, new E.main_closure278(), C.Symbol_isDart, new E.main_closure279(), C.Symbol_isolate, new E.main_closure280(), C.Symbol_kind, new E.main_closure281(), C.Symbol_label, new E.main_closure282(), C.Symbol_last, new E.main_closure283(), C.Symbol_lastAccumulatorReset, new E.main_closure284(), C.Symbol_lastServiceGC, new E.main_closure285(), C.Symbol_lastTokenPos, new E.main_closure286(), C.Symbol_lib, new E.main_closure287(), C.Symbol_library, new E.main_closure288(), C.Symbol_lineMode, new E.main_closure289(), C.Symbol_lines, new E.main_closure290(), C.Symbol_link, new E.main_closure291(), C.Symbol_list, new E.main_closure292(), C.Symbol_map, new E.main_closure293(), C.Symbol_mapAsString, new E.main_closure294(), C.Symbol_msg, new E.main_closure295(), C.Symbol_name, new E.main_closure296(), C.Symbol_object, new E.main_closure297(), C.Symbol_objectPool, new E.main_closure298(), C.Symbol_pad, new E.main_closure299(), C.Symbol_path, new E.main_closure300(), C.Symbol_pause, new E.main_closure301(), C.Symbol_pos, new E.main_closure302(), C.Symbol_process, new E.main_closure303(), C.Symbol_profile, new E.main_closure304(), C.Symbol_qualified, new E.main_closure305(), C.Symbol_qualifiedName, new E.main_closure306(), C.Symbol_reachable, new E.main_closure307(), C.Symbol_ref, new E.main_closure308(), C.Symbol_refresh, new E.main_closure309(), C.Symbol_refreshCoverage, new E.main_closure310(), C.Symbol_refreshGC, new E.main_closure311(), C.Symbol_refreshTime, new E.main_closure312(), C.Symbol_resetAccumulator, new E.main_closure313(), C.Symbol_result, new E.main_closure314(), C.Symbol_results, new E.main_closure315(), C.Symbol_resume, new E.main_closure316(), C.Symbol_retainedBytes, new E.main_closure317(), C.Symbol_retainedSize, new E.main_closure318(), C.Symbol_retainingPath, new E.main_closure319(), C.Symbol_rootLib, new E.main_closure320(), C.Symbol_sampleCount, new E.main_closure321(), C.Symbol_sampleDepth, new E.main_closure322(), C.Symbol_sampleRate, new E.main_closure323(), C.Symbol_script, new E.main_closure324(), C.Symbol_small, new E.main_closure325(), C.Symbol_socket, new E.main_closure326(), C.Symbol_socketOwner, new E.main_closure327(), C.Symbol_startLine, new E.main_closure328(), C.Symbol_status, new E.main_closure329(), C.Symbol_subclass, new E.main_closure330(), C.Symbol_superClass, new E.main_closure331(), C.Symbol_tagSelector, new E.main_closure332(), C.Symbol_text, new E.main_closure333(), C.Symbol_timeSpan, new E.main_closure334(), C.Symbol_tokenPos, new E.main_closure335(), C.Symbol_trace, new E.main_closure336(), C.Symbol_uncheckedText, new E.main_closure337(), C.Symbol_vm, new E.main_closure338(), C.Symbol_webSocket, new E.main_closure339()], null, null);
+    t3 = P.LinkedHashMap_LinkedHashMap$_literal([C.Type_kA7, C.Type_GNh, C.Type_ON8, C.Type_EOZ, C.Type_ql8, C.Type_UJT, C.Type_dRp, C.Type_EOZ, C.Type_O5a, C.Type_EOZ, C.Type_2jN, C.Type_UJT, C.Type_Aym, C.Type_EOZ, C.Type_cop, C.Type_GNh, C.Type_Npb, C.Type_EOZ, C.Type_8eb, C.Type_EOZ, C.Type_p2P, C.Type_GNh, C.Type_ohY, C.Type_UJT, C.Type_4IJ, C.Type_EOZ, C.Type_7g3, C.Type_EOZ, C.Type_f1j, C.Type_EOZ, C.Type_wgH, C.Type_oyU, C.Type_bDN, C.Type_EOZ, C.Type_SoB, C.Type_EOZ, C.Type_LV6, C.Type_EOZ, C.Type_EVD, C.Type_UJT, C.Type_gqS, C.Type_EOZ, C.Type_uIL, C.Type_UJT, C.Type_L9j, C.Type_EOZ, C.Type_yvP, C.Type_EOZ, C.Type_i7j, C.Type_UJT, C.Type_M6L, C.Type_EOZ, C.Type_8KD, C.Type_EOZ, C.Type_qMZ, C.Type_oyU, C.Type_AHF, C.Type_EOZ, C.Type_IuH, C.Type_EOZ, C.Type_mWg, C.Type_UJT, C.Type_8cK, C.Type_EOZ, C.Type_JmU, C.Type_UJT, C.Type_4m4, C.Type_EOZ, C.Type_B8J, C.Type_UJT, C.Type_61d, C.Type_EOZ, C.Type_TEn, C.Type_EOZ, C.Type_gg4, C.Type_EOZ, C.Type_MUU, C.Type_UJT, C.Type_AyI, C.Type_EOZ, C.Type_cOY, C.Type_EOZ, C.Type_ES1, C.Type_UJT, C.Type_wT1, C.Type_EOZ, C.Type_ECh, C.Type_EOZ, C.Type_aAD, C.Type_EOZ, C.Type_8Gl, C.Type_EOZ, C.Type_iL9, C.Type_EOZ, C.Type_ZKG, C.Type_EOZ, C.Type_Kyy, C.Type_EOZ, C.Type_mpV, C.Type_UJT, C.Type_qph, C.Type_EOZ, C.Type_JFX, C.Type_EOZ, C.Type_wsa, C.Type_EOZ, C.Type_s2l, C.Type_EOZ, C.Type_nV5, C.Type_EOZ, C.Type_9ur, C.Type_sRP, C.Type_KMd, C.Type_EOZ, C.Type_AD4, C.Type_EOZ, C.Type_Sxn, C.Type_EOZ, C.Type_C7R, C.Type_EOZ, C.Type_YgH, C.Type_EOZ, C.Type_sRP, C.Type_I2I, C.Type_a1Y, C.Type_EOZ, C.Type_wBh, C.Type_oyU, C.Type_0e9, C.Type_EOZ, C.Type_FKd, C.Type_EOZ, C.Type_y1j, C.Type_EOZ, C.Type_UJT, C.Type_EOZ, C.Type_Mu6, C.Type_EOZ, C.Type_kuc, C.Type_GNh, C.Type_Jcu, C.Type_EOZ, C.Type_nVV, C.Type_EOZ, C.Type_Eue, C.Type_UJT, C.Type_E0k, C.Type_EOZ, C.Type_GNh, C.Type_I2I, C.Type_EOZ, C.Type_sRP, C.Type_oyU, C.Type_UJT], null, null);
+    t4 = P.LinkedHashMap_LinkedHashMap$_literal([C.Type_kA7, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_busy, C.Declaration_izV, C.Symbol_callback, C.Declaration_yXb, C.Symbol_label, C.Declaration_0g2], null, null), C.Type_ON8, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_msg, C.Declaration_gc6], null, null), C.Type_ql8, C.Map_empty, C.Type_dRp, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_agR, C.Symbol_isolateChanged, C.Declaration_e3c], null, null), C.Type_O5a, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_cls, C.Declaration_okX, C.Symbol_instances, C.Declaration_qr9, C.Symbol_retainedBytes, C.Declaration_CIB], null, null), C.Type_2jN, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_code, C.Declaration_AgZ, C.Symbol_refChanged, C.Declaration_MJ5], null, null), C.Type_Aym, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_code, C.Declaration_woc], null, null), C.Type_cop, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_busy, C.Declaration_izV, C.Symbol_callback, C.Declaration_yXb, C.Symbol_expand, C.Declaration_yXb0, C.Symbol_expandChanged, C.Declaration_Dbk, C.Symbol_expanded, C.Declaration_RQo], null, null), C.Type_Npb, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_error, C.Declaration_eea], null, null), C.Type_8eb, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_callback, C.Declaration_IF7, C.Symbol_lineMode, C.Declaration_ww8, C.Symbol_results, C.Declaration_ggw, C.Symbol_text, C.Declaration_ZfX], null, null), C.Type_p2P, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_busy, C.Declaration_izV, C.Symbol_callback, C.Declaration_yXb, C.Symbol_expr, C.Declaration_gLQ, C.Symbol_label, C.Declaration_0g2, C.Symbol_result, C.Declaration_2No], null, null), C.Type_ohY, C.Map_empty, C.Type_4IJ, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_field, C.Declaration_iyl], null, null), C.Type_7g3, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_flag, C.Declaration_6YB], null, null), C.Type_f1j, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_flagList, C.Declaration_wE9], null, null), C.Type_wgH, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_hasClass, C.Declaration_X8B, C.Symbol_hasParent, C.Declaration_0qV, C.Symbol_isDart, C.Declaration_o7e, C.Symbol_qualified, C.Declaration_e24, C.Symbol_refChanged, C.Declaration_MJ5], null, null), C.Type_bDN, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_function, C.Declaration_y9n, C.Symbol_functionChanged, C.Declaration_Chj, C.Symbol_kind, C.Declaration_Xdi, C.Symbol_qualifiedName, C.Declaration_i3y], null, null), C.Type_SoB, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_fragmentation, C.Declaration_0Y4, C.Symbol_fragmentationChanged, C.Declaration_ivD, C.Symbol_status, C.Declaration_8sn], null, null), C.Type_LV6, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_classTable, C.Declaration_gsm, C.Symbol_isolate, C.Declaration_agR, C.Symbol_lastAccumulatorReset, C.Declaration_vA1, C.Symbol_lastServiceGC, C.Declaration_mPk, C.Symbol_profile, C.Declaration_EkK, C.Symbol_profileChanged, C.Declaration_j3g], null, null), C.Type_EVD, C.Map_empty, C.Type_gqS, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_instance, C.Declaration_o7L, C.Symbol_path, C.Declaration_cMb, C.Symbol_retainedBytes, C.Declaration_CIB], null, null), C.Type_uIL, C.Map_empty, C.Type_L9j, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_connection, C.Declaration_yDj], null, null), C.Type_yvP, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_i7j, C.Map_empty, C.Type_M6L, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_httpServer, C.Declaration_BSX], null, null), C.Type_8KD, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_qMZ, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_small, C.Declaration_pPA], null, null), C.Type_AHF, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_process, C.Declaration_a13], null, null), C.Type_IuH, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_mWg, C.Map_empty, C.Type_8cK, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_file, C.Declaration_Ix1], null, null), C.Type_JmU, C.Map_empty, C.Type_4m4, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_B8J, C.Map_empty, C.Type_61d, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_socket, C.Declaration_Iiu], null, null), C.Type_TEn, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_io, C.Declaration_bh9], null, null), C.Type_gg4, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_MUU, C.Map_empty, C.Type_AyI, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_webSocket, C.Declaration_mT8], null, null), C.Type_cOY, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_displayCutoff, C.Declaration_CR6, C.Symbol_hideTagsChecked, C.Declaration_a1A, C.Symbol_profile, C.Declaration_EkK, C.Symbol_profileChanged, C.Declaration_j3g, C.Symbol_refreshTime, C.Declaration_ijl, C.Symbol_sampleCount, C.Declaration_ac8, C.Symbol_sampleDepth, C.Declaration_2AE, C.Symbol_sampleRate, C.Declaration_3VL, C.Symbol_tagSelector, C.Declaration_Q0F, C.Symbol_tagSelectorChanged, C.Declaration_ECn, C.Symbol_timeSpan, C.Declaration_dIf], null, null), C.Type_ES1, C.Map_empty, C.Type_wT1, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_counters, C.Declaration_2Qn, C.Symbol_countersChanged, C.Declaration_cJC], null, null), C.Type_ECh, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_aAD, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_8Gl, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_iL9, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_ZKG, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_Kyy, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_map, C.Declaration_wzu, C.Symbol_mapAsString, C.Declaration_Qx4, C.Symbol_mapChanged, C.Declaration_iLh], null, null), C.Type_mpV, C.Map_empty, C.Type_qph, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_library, C.Declaration_6ts], null, null), C.Type_JFX, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_cls, C.Declaration_qrv, C.Symbol_last, C.Declaration_06U], null, null), C.Type_wsa, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj, C.Symbol_isolateChanged, C.Declaration_e3c, C.Symbol_last, C.Declaration_06U], null, null), C.Type_s2l, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_last, C.Declaration_06U, C.Symbol_library, C.Declaration_6ts], null, null), C.Type_nV5, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_pad, C.Declaration_EsU], null, null), C.Type_9ur, C.Map_empty, C.Type_KMd, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_anchor, C.Declaration_suy, C.Symbol_last, C.Declaration_06U, C.Symbol_link, C.Declaration_ibz], null, null), C.Type_AD4, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_anchor, C.Declaration_suy, C.Symbol_link, C.Declaration_ibz], null, null), C.Type_Sxn, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, C.Declaration_dw1, C.Symbol_callback, C.Declaration_yXb, C.Symbol_label, C.Declaration_0g2], null, null), C.Type_C7R, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_last, C.Declaration_06U], null, null), C.Type_YgH, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_devtools, C.Declaration_c4R], null, null), C.Type_sRP, C.Map_empty, C.Type_a1Y, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_endLine, C.Declaration_ZcJ, C.Symbol_endPos, C.Declaration_ACG, C.Symbol_endPosChanged, C.Declaration_QAa, C.Symbol_lines, C.Declaration_WfA, C.Symbol_pos, C.Declaration_i3t, C.Symbol_posChanged, C.Declaration_owq, C.Symbol_script, C.Declaration_yx3, C.Symbol_scriptChanged, C.Declaration_ixB, C.Symbol_startLine, C.Declaration_k6K], null, null), C.Type_wBh, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_pos, C.Declaration_i3t, C.Symbol_posChanged, C.Declaration_owq], null, null), C.Type_0e9, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_script, C.Declaration_yx3], null, null), C.Type_FKd, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_error, C.Declaration_4eA], null, null), C.Type_y1j, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_exception, C.Declaration_v0l], null, null), C.Type_UJT, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_internal, C.Declaration_XBb, C.Symbol_ref, C.Declaration_e3c0, C.Symbol_refChanged, C.Declaration_MJ5], null, null), C.Type_Mu6, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_object, C.Declaration_HtW, C.Symbol_objectChanged, C.Declaration_4up], null, null), C.Type_kuc, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_checked, C.Declaration_siO, C.Symbol_checkedText, C.Declaration_cdS, C.Symbol_uncheckedText, C.Declaration_IRg], null, null), C.Type_Jcu, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_frame, C.Declaration_65l], null, null), C.Type_nVV, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_trace, C.Declaration_ssf], null, null), C.Type_Eue, C.Map_empty, C.Type_E0k, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_error, C.Declaration_0, C.Symbol_vm, C.Declaration_Qi2], null, null)], null, null);
+    t5 = O.GeneratedSymbolConverterService$(new O.StaticConfiguration(t1, t2, t3, t4, C.Map_empty, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, "active", C.Symbol_address, "address", C.Symbol_anchor, "anchor", C.Symbol_assertsEnabled, "assertsEnabled", C.Symbol_bpt, "bpt", C.Symbol_busy, "busy", C.Symbol_buttonClick, "buttonClick", C.Symbol_bytes, "bytes", C.Symbol_callback, "callback", C.Symbol_capacity, "capacity", C.Symbol_change, "change", C.Symbol_changeSort, "changeSort", C.Symbol_checked, "checked", C.Symbol_checkedText, "checkedText", C.Symbol_classTable, "classTable", C.Symbol_classes, "classes", C.Symbol_closing, "closing", C.Symbol_cls, "cls", C.Symbol_code, "code", C.Symbol_coloring, "coloring", C.Symbol_columns, "columns", C.Symbol_connection, "connection", C.Symbol_counters, "counters", C.Symbol_countersChanged, "countersChanged", C.Symbol_current, "current", C.Symbol_descriptor, "descriptor", C.Symbol_descriptors, "descriptors", C.Symbol_devtools, "devtools", C.Symbol_displayCutoff, "displayCutoff", C.Symbol_doAction, "doAction", C.Symbol_element, "element", C.Symbol_endLine, "endLine", C.Symbol_endPos, "endPos", C.Symbol_endPosChanged, "endPosChanged", C.Symbol_entry, "entry", C.Symbol_error, "error", C.Symbol_eval, "eval", C.Symbol_evalNow, "evalNow", C.Symbol_exception, "exception", C.Symbol_expand, "expand", C.Symbol_expandChanged, "expandChanged", C.Symbol_expanded, "expanded", C.Symbol_expander, "expander", C.Symbol_expanderStyle, "expanderStyle", C.Symbol_expr, "expr", C.Symbol_external, "external", C.Symbol_fd, "fd", C.Symbol_field, "field", C.Symbol_fields, "fields", C.Symbol_file, "file", C.Symbol_firstTokenPos, "firstTokenPos", C.Symbol_flag, "flag", C.Symbol_flagList, "flagList", C.Symbol_formatSize, "formatSize", C.Symbol_formatTime, "formatTime", C.Symbol_formattedAddress, "formattedAddress", C.Symbol_formattedAverage, "formattedAverage", C.Symbol_formattedCollections, "formattedCollections", C.Symbol_formattedDeoptId, "formattedDeoptId", C.Symbol_formattedExclusive, "formattedExclusive", C.Symbol_formattedExclusiveTicks, "formattedExclusiveTicks", C.Symbol_formattedInclusive, "formattedInclusive", C.Symbol_formattedInclusiveTicks, "formattedInclusiveTicks", C.Symbol_formattedLine, "formattedLine", C.Symbol_formattedTotalCollectionTime, "formattedTotalCollectionTime", C.Symbol_fragmentation, "fragmentation", C.Symbol_fragmentationChanged, "fragmentationChanged", C.Symbol_frame, "frame", C.Symbol_function, "function", C.Symbol_functionChanged, "functionChanged", C.Symbol_functions, "functions", C.Symbol_getColumnLabel, "getColumnLabel", C.Symbol_goto, "goto", C.Symbol_gotoLink, "gotoLink", C.Symbol_hasClass, "hasClass", C.Symbol_hasDescriptors, "hasDescriptors", C.Symbol_hasDisassembly, "hasDisassembly", C.Symbol_hasNoAllocations, "hasNoAllocations", C.Symbol_hasParent, "hasParent", C.Symbol_hashLinkWorkaround, "hashLinkWorkaround", C.Symbol_hideTagsChecked, "hideTagsChecked", C.Symbol_hits, "hits", C.Symbol_hoverText, "hoverText", C.Symbol_httpServer, "httpServer", C.Symbol_human, "human", C.Symbol_idle, "idle", C.Symbol_imp, "imp", C.Symbol_imports, "imports", C.Symbol_instance, "instance", C.Symbol_instances, "instances", C.Symbol_instruction, "instruction", C.Symbol_instructions, "instructions", C.Symbol_interface, "interface", C.Symbol_interfaces, "interfaces", C.Symbol_internal, "internal", C.Symbol_io, "io", C.Symbol_isAbstract, "isAbstract", C.Symbol_isBool, "isBool", C.Symbol_isComment, "isComment", C.Symbol_isDart, "isDart", C.Symbol_isDartCode, "isDartCode", C.Symbol_isDouble, "isDouble", C.Symbol_isEmpty, "isEmpty", C.Symbol_isError, "isError", C.Symbol_isInstance, "isInstance", C.Symbol_isInt, "isInt", C.Symbol_isList, "isList", C.Symbol_isNotEmpty, "isNotEmpty", C.Symbol_isNull, "isNull", C.Symbol_isOptimized, "isOptimized", C.Symbol_isPatch, "isPatch", C.Symbol_isPipe, "isPipe", C.Symbol_isString, "isString", C.Symbol_isType, "isType", C.Symbol_isUnexpected, "isUnexpected", C.Symbol_isolate, "isolate", C.Symbol_isolateChanged, "isolateChanged", C.Symbol_isolates, "isolates", C.Symbol_jumpTarget, "jumpTarget", C.Symbol_kind, "kind", C.Symbol_label, "label", C.Symbol_last, "last", C.Symbol_lastAccumulatorReset, "lastAccumulatorReset", C.Symbol_lastServiceGC, "lastServiceGC", C.Symbol_lastTokenPos, "lastTokenPos", C.Symbol_lastUpdate, "lastUpdate", C.Symbol_length, "length", C.Symbol_lib, "lib", C.Symbol_libraries, "libraries", C.Symbol_library, "library", C.Symbol_line, "line", C.Symbol_lineMode, "lineMode", C.Symbol_lineNumber, "lineNumber", C.Symbol_lineNumbers, "lineNumbers", C.Symbol_lines, "lines", C.Symbol_link, "link", C.Symbol_list, "list", C.Symbol_listening, "listening", C.Symbol_loading, "loading", C.Symbol_localAddress, "localAddress", C.Symbol_localPort, "localPort", C.Symbol_mainPort, "mainPort", C.Symbol_map, "map", C.Symbol_mapAsString, "mapAsString", C.Symbol_mapChanged, "mapChanged", C.Symbol_message, "message", C.Symbol_mouseOut, "mouseOut", C.Symbol_mouseOver, "mouseOver", C.Symbol_msg, "msg", C.Symbol_name, "name", C.Symbol_nameIsEmpty, "nameIsEmpty", C.Symbol_newSpace, "newSpace", C.Symbol_object, "object", C.Symbol_objectChanged, "objectChanged", C.Symbol_objectPool, "objectPool", C.Symbol_oldSpace, "oldSpace", C.Symbol_pad, "pad", C.Symbol_padding, "padding", C.Symbol_path, "path", C.Symbol_pause, "pause", C.Symbol_pauseEvent, "pauseEvent", C.Symbol_pid, "pid", C.Symbol_pos, "pos", C.Symbol_posChanged, "posChanged", C.Symbol_process, "process", C.Symbol_profile, "profile", C.Symbol_profileChanged, "profileChanged", C.Symbol_protocol, "protocol", C.Symbol_qualified, "qualified", C.Symbol_qualifiedName, "qualifiedName", C.Symbol_reachable, "reachable", C.Symbol_readClosed, "readClosed", C.Symbol_ref, "ref", C.Symbol_refChanged, "refChanged", C.Symbol_refresh, "refresh", C.Symbol_refreshCoverage, "refreshCoverage", C.Symbol_refreshGC, "refreshGC", C.Symbol_refreshTime, "refreshTime", C.Symbol_relativeLink, "relativeLink", C.Symbol_remoteAddress, "remoteAddress", C.Symbol_remotePort, "remotePort", C.Symbol_resetAccumulator, "resetAccumulator", C.Symbol_response, "response", C.Symbol_result, "result", C.Symbol_results, "results", C.Symbol_resume, "resume", C.Symbol_retainedBytes, "retainedBytes", C.Symbol_retainedSize, "retainedSize", C.Symbol_retainingPath, "retainingPath", C.Symbol_rootLib, "rootLib", C.Symbol_row, "row", C.Symbol_rows, "rows", C.Symbol_running, "running", C.Symbol_sampleCount, "sampleCount", C.Symbol_sampleDepth, "sampleDepth", C.Symbol_sampleRate, "sampleRate", C.Symbol_script, "script", C.Symbol_scriptChanged, "scriptChanged", C.Symbol_scripts, "scripts", C.Symbol_selectExpr, "selectExpr", C.Symbol_serviceType, "serviceType", C.Symbol_small, "small", C.Symbol_socket, "socket", C.Symbol_socketOwner, "socketOwner", C.Symbol_startLine, "startLine", C.Symbol_status, "status", C.Symbol_styleForHits, "styleForHits", C.Symbol_subClasses, "subClasses", C.Symbol_subclass, "subclass", C.Symbol_superClass, "superClass", C.Symbol_tagSelector, "tagSelector", C.Symbol_tagSelectorChanged, "tagSelectorChanged", C.Symbol_text, "text", C.Symbol_timeSpan, "timeSpan", C.Symbol_tipExclusive, "tipExclusive", C.Symbol_tipKind, "tipKind", C.Symbol_tipParent, "tipParent", C.Symbol_tipTicks, "tipTicks", C.Symbol_tipTime, "tipTime", C.Symbol_toggleExpand, "toggleExpand", C.Symbol_toggleExpanded, "toggleExpanded", C.Symbol_tokenPos, "tokenPos", C.Symbol_topFrame, "topFrame", C.Symbol_trace, "trace", C.Symbol_tree, "tree", C.Symbol_typeChecksEnabled, "typeChecksEnabled", C.Symbol_uncheckedText, "uncheckedText", C.Symbol_updateLineMode, "updateLineMode", C.Symbol_uptime, "uptime", C.Symbol_url, "url", C.Symbol_used, "used", C.Symbol_v, "v", C.Symbol_variable, "variable", C.Symbol_variables, "variables", C.Symbol_version, "version", C.Symbol_vm, "vm", C.Symbol_vmName, "vmName", C.Symbol_webSocket, "webSocket", C.Symbol_writeClosed, "writeClosed"], null, null), false));
+    $.objectAccessor = new O.GeneratedObjectAccessorService(t1, t2, C.Map_empty);
+    $.typeInspector = new O.GeneratedTypeInspectorService(t3, t4, false);
+    $.symbolConverter = t5;
+    $.initializers = [new E.main_closure340(), new E.main_closure341(), new E.main_closure342(), new E.main_closure343(), new E.main_closure344(), new E.main_closure345(), new E.main_closure346(), new E.main_closure347(), new E.main_closure348(), new E.main_closure349(), new E.main_closure350(), new E.main_closure351(), new E.main_closure352(), new E.main_closure353(), new E.main_closure354(), new E.main_closure355(), new E.main_closure356(), new E.main_closure357(), new E.main_closure358(), new E.main_closure359(), new E.main_closure360(), new E.main_closure361(), new E.main_closure362(), new E.main_closure363(), new E.main_closure364(), new E.main_closure365(), new E.main_closure366(), new E.main_closure367(), new E.main_closure368(), new E.main_closure369(), new E.main_closure370(), new E.main_closure371(), new E.main_closure372(), new E.main_closure373(), new E.main_closure374(), new E.main_closure375(), new E.main_closure376(), new E.main_closure377(), new E.main_closure378(), new E.main_closure379(), new E.main_closure380(), new E.main_closure381(), new E.main_closure382(), new E.main_closure383(), new E.main_closure384(), new E.main_closure385(), new E.main_closure386(), new E.main_closure387(), new E.main_closure388(), new E.main_closure389(), new E.main_closure390(), new E.main_closure391(), new E.main_closure392(), new E.main_closure393(), new E.main_closure394(), new E.main_closure395(), new E.main_closure396(), new E.main_closure397(), new E.main_closure398(), new E.main_closure399(), new E.main_closure400(), new E.main_closure401(), new E.main_closure402(), new E.main_closure403(), new E.main_closure404(), new E.main_closure405(), new E.main_closure406(), new E.main_closure407(), new E.main_closure408(), new E.main_closure409(), new E.main_closure410(), new E.main_closure411(), new E.main_closure412(), new E.main_closure413()];
+    $.deployMode = true;
+    F.main();
+  }, "call$0", "main0$closure", 0, 0, 18],
+  main_closure: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$active$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure0: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$address();
+    },
+    $isFunction: true
+  },
+  main_closure1: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$anchor$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure2: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$assertsEnabled();
+    },
+    $isFunction: true
+  },
+  main_closure3: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$bpt();
+    },
+    $isFunction: true
+  },
+  main_closure4: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$busy$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure5: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$buttonClick$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure6: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$bytes();
+    },
+    $isFunction: true
+  },
+  main_closure7: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$callback$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure8: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$capacity();
+    },
+    $isFunction: true
+  },
+  main_closure9: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$change$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure10: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$changeSort$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure11: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$checked$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure12: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$checkedText$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure13: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$classTable$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure14: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$classes$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure15: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$closing();
+    },
+    $isFunction: true
+  },
+  main_closure16: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$cls$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure17: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$code$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure18: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$coloring$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure19: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$columns();
+    },
+    $isFunction: true
+  },
+  main_closure20: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$connection$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure21: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$counters$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure22: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$countersChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure23: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$current();
+    },
+    $isFunction: true
+  },
+  main_closure24: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$descriptor();
+    },
+    $isFunction: true
+  },
+  main_closure25: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$descriptors();
+    },
+    $isFunction: true
+  },
+  main_closure26: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$devtools$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure27: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$displayCutoff$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure28: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$doAction$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure29: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$element$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure30: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$endLine$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure31: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$endPos$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure32: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$endPosChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure33: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$entry();
+    },
+    $isFunction: true
+  },
+  main_closure34: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$error$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure35: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$eval$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure36: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$evalNow$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure37: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$exception$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure38: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expand$ax(o);
+    },
+    $isFunction: true
+  },
+  main_closure39: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expandChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure40: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expanded$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure41: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expander$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure42: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$expanderStyle();
+    },
+    $isFunction: true
+  },
+  main_closure43: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expr$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure44: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$external();
+    },
+    $isFunction: true
+  },
+  main_closure45: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$fd();
+    },
+    $isFunction: true
+  },
+  main_closure46: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$field$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure47: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$fields();
+    },
+    $isFunction: true
+  },
+  main_closure48: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$file$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure49: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$firstTokenPos();
+    },
+    $isFunction: true
+  },
+  main_closure50: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$flag$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure51: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$flagList$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure52: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formatSize$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure53: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formatTime$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure54: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedAddress();
+    },
+    $isFunction: true
+  },
+  main_closure55: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formattedAverage$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure56: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formattedCollections$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure57: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedDeoptId();
+    },
+    $isFunction: true
+  },
+  main_closure58: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedExclusive();
+    },
+    $isFunction: true
+  },
+  main_closure59: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedExclusiveTicks();
+    },
+    $isFunction: true
+  },
+  main_closure60: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedInclusive();
+    },
+    $isFunction: true
+  },
+  main_closure61: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedInclusiveTicks();
+    },
+    $isFunction: true
+  },
+  main_closure62: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedLine();
+    },
+    $isFunction: true
+  },
+  main_closure63: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formattedTotalCollectionTime$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure64: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$fragmentation$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure65: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$fragmentationChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure66: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$frame$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure67: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$$function$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure68: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$functionChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure69: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$functions();
+    },
+    $isFunction: true
+  },
+  main_closure70: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$getColumnLabel();
+    },
+    $isFunction: true
+  },
+  main_closure71: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$$goto$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure72: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$gotoLink$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure73: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hasClass$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure74: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hasDescriptors();
+    },
+    $isFunction: true
+  },
+  main_closure75: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hasDisassembly();
+    },
+    $isFunction: true
+  },
+  main_closure76: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hasNoAllocations();
+    },
+    $isFunction: true
+  },
+  main_closure77: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hasParent$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure78: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hashLinkWorkaround$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure79: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hideTagsChecked$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure80: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hits();
+    },
+    $isFunction: true
+  },
+  main_closure81: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hoverText$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure82: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$httpServer$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure83: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$human();
+    },
+    $isFunction: true
+  },
+  main_closure84: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$idle();
+    },
+    $isFunction: true
+  },
+  main_closure85: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$imp();
+    },
+    $isFunction: true
+  },
+  main_closure86: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$imports();
+    },
+    $isFunction: true
+  },
+  main_closure87: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$instance$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure88: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$instances$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure89: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$instruction();
+    },
+    $isFunction: true
+  },
+  main_closure90: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$instructions();
+    },
+    $isFunction: true
+  },
+  main_closure91: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$$interface();
+    },
+    $isFunction: true
+  },
+  main_closure92: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$interfaces();
+    },
+    $isFunction: true
+  },
+  main_closure93: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$internal$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure94: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$io$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure95: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isAbstract();
+    },
+    $isFunction: true
+  },
+  main_closure96: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isBool$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure97: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isComment();
+    },
+    $isFunction: true
+  },
+  main_closure98: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isDart$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure99: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isDartCode();
+    },
+    $isFunction: true
+  },
+  main_closure100: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isDouble$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure101: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isEmpty$asx(o);
+    },
+    $isFunction: true
+  },
+  main_closure102: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isError$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure103: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isInstance$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure104: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isInt$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure105: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isList$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure106: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isNotEmpty$asx(o);
+    },
+    $isFunction: true
+  },
+  main_closure107: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isNull$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure108: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isOptimized();
+    },
+    $isFunction: true
+  },
+  main_closure109: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isPatch();
+    },
+    $isFunction: true
+  },
+  main_closure110: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isPipe();
+    },
+    $isFunction: true
+  },
+  main_closure111: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isString$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure112: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isType$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure113: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isUnexpected$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure114: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isolate$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure115: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isolateChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure116: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isolates();
+    },
+    $isFunction: true
+  },
+  main_closure117: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$jumpTarget();
+    },
+    $isFunction: true
+  },
+  main_closure118: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$kind$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure119: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$label$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure120: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$last$ax(o);
+    },
+    $isFunction: true
+  },
+  main_closure121: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lastAccumulatorReset$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure122: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lastServiceGC$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure123: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$lastTokenPos();
+    },
+    $isFunction: true
+  },
+  main_closure124: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$lastUpdate();
+    },
+    $isFunction: true
+  },
+  main_closure125: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$length$asx(o);
+    },
+    $isFunction: true
+  },
+  main_closure126: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$lib();
+    },
+    $isFunction: true
+  },
+  main_closure127: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$libraries();
+    },
+    $isFunction: true
+  },
+  main_closure128: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$library$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure129: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$line();
+    },
+    $isFunction: true
+  },
+  main_closure130: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lineMode$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure131: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lineNumber$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure132: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lineNumbers$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure133: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lines$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure134: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$link$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure135: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$list$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure136: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$listening();
+    },
+    $isFunction: true
+  },
+  main_closure137: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$loading();
+    },
+    $isFunction: true
+  },
+  main_closure138: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$localAddress();
+    },
+    $isFunction: true
+  },
+  main_closure139: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$localPort();
+    },
+    $isFunction: true
+  },
+  main_closure140: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$mainPort();
+    },
+    $isFunction: true
+  },
+  main_closure141: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$map$ax(o);
+    },
+    $isFunction: true
+  },
+  main_closure142: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mapAsString$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure143: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mapChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure144: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$message$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure145: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mouseOut$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure146: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mouseOver$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure147: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$msg$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure148: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$name$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure149: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$nameIsEmpty$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure150: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$newSpace();
+    },
+    $isFunction: true
+  },
+  main_closure151: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$object$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure152: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$objectChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure153: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$objectPool();
+    },
+    $isFunction: true
+  },
+  main_closure154: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$oldSpace();
+    },
+    $isFunction: true
+  },
+  main_closure155: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pad$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure156: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$padding$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure157: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$path$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure158: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pause$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure159: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pauseEvent$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure160: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$pid();
+    },
+    $isFunction: true
+  },
+  main_closure161: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pos$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure162: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$posChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure163: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$process$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure164: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$profile$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure165: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$profileChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure166: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$protocol$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure167: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$qualified$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure168: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$qualifiedName$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure169: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$reachable$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure170: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$readClosed();
+    },
+    $isFunction: true
+  },
+  main_closure171: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$ref$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure172: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure173: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refresh$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure174: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refreshCoverage$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure175: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refreshGC$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure176: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refreshTime$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure177: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$relativeLink();
+    },
+    $isFunction: true
+  },
+  main_closure178: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$remoteAddress();
+    },
+    $isFunction: true
+  },
+  main_closure179: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$remotePort();
+    },
+    $isFunction: true
+  },
+  main_closure180: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$resetAccumulator$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure181: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$response$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure182: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$result$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure183: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$results$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure184: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$resume$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure185: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$retainedBytes$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure186: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$retainedSize$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure187: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$retainingPath$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure188: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$rootLib();
+    },
+    $isFunction: true
+  },
+  main_closure189: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$row();
+    },
+    $isFunction: true
+  },
+  main_closure190: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$rows$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure191: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$running();
+    },
+    $isFunction: true
+  },
+  main_closure192: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$sampleCount$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure193: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$sampleDepth$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure194: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$sampleRate$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure195: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$script$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure196: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$scriptChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure197: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$scripts();
+    },
+    $isFunction: true
+  },
+  main_closure198: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$selectExpr$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure199: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$serviceType();
+    },
+    $isFunction: true
+  },
+  main_closure200: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$small$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure201: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$socket$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure202: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$socketOwner();
+    },
+    $isFunction: true
+  },
+  main_closure203: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$startLine$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure204: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$status$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure205: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$styleForHits$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure206: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$subClasses();
+    },
+    $isFunction: true
+  },
+  main_closure207: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$subclass();
+    },
+    $isFunction: true
+  },
+  main_closure208: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$superClass();
+    },
+    $isFunction: true
+  },
+  main_closure209: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$tagSelector$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure210: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$tagSelectorChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure211: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$text$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure212: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$timeSpan$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure213: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipExclusive();
+    },
+    $isFunction: true
+  },
+  main_closure214: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipKind();
+    },
+    $isFunction: true
+  },
+  main_closure215: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipParent();
+    },
+    $isFunction: true
+  },
+  main_closure216: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipTicks();
+    },
+    $isFunction: true
+  },
+  main_closure217: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipTime();
+    },
+    $isFunction: true
+  },
+  main_closure218: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$toggleExpand$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure219: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$toggleExpanded$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure220: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tokenPos();
+    },
+    $isFunction: true
+  },
+  main_closure221: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$topFrame();
+    },
+    $isFunction: true
+  },
+  main_closure222: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$trace$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure223: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$tree$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure224: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$typeChecksEnabled();
+    },
+    $isFunction: true
+  },
+  main_closure225: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$uncheckedText$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure226: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$updateLineMode$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure227: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$uptime();
+    },
+    $isFunction: true
+  },
+  main_closure228: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$url$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure229: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$used();
+    },
+    $isFunction: true
+  },
+  main_closure230: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$v();
+    },
+    $isFunction: true
+  },
+  main_closure231: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$variable();
+    },
+    $isFunction: true
+  },
+  main_closure232: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$variables();
+    },
+    $isFunction: true
+  },
+  main_closure233: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$version$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure234: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$vm$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure235: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$vmName();
+    },
+    $isFunction: true
+  },
+  main_closure236: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$webSocket$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure237: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$writeClosed();
+    },
+    $isFunction: true
+  },
+  main_closure238: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$active$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure239: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$anchor$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure240: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$busy$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure241: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$callback$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure242: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$checked$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure243: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$checkedText$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure244: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$classTable$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure245: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$cls$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure246: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$code$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure247: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$connection$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure248: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$counters$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure249: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$devtools$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure250: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$displayCutoff$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure251: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$endLine$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure252: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$endPos$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure253: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$entry(v);
+    },
+    $isFunction: true
+  },
+  main_closure254: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$error$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure255: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$eval$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure256: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$exception$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure257: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$expand$ax(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure258: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$expanded$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure259: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$expr$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure260: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$field$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure261: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$file$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure262: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$firstTokenPos(v);
+    },
+    $isFunction: true
+  },
+  main_closure263: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$flag$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure264: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$flagList$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure265: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$fragmentation$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure266: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$frame$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure267: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$$function$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure268: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hasClass$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure269: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hasParent$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure270: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hashLinkWorkaround$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure271: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hideTagsChecked$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure272: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$httpServer$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure273: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$imp(v);
+    },
+    $isFunction: true
+  },
+  main_closure274: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$instance$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure275: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$instances$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure276: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$$interface(v);
+    },
+    $isFunction: true
+  },
+  main_closure277: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$internal$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure278: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$io$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure279: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$isDart$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure280: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$isolate$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure281: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$kind$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure282: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$label$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure283: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$last$ax(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure284: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lastAccumulatorReset$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure285: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lastServiceGC$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure286: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$lastTokenPos(v);
+    },
+    $isFunction: true
+  },
+  main_closure287: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$lib(v);
+    },
+    $isFunction: true
+  },
+  main_closure288: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$library$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure289: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lineMode$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure290: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lines$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure291: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$link$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure292: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$list$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure293: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$map$ax(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure294: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$mapAsString$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure295: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$msg$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure296: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$name$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure297: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$object$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure298: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$objectPool(v);
+    },
+    $isFunction: true
+  },
+  main_closure299: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$pad$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure300: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$path$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure301: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$pause$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure302: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$pos$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure303: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$process$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure304: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$profile$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure305: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$qualified$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure306: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$qualifiedName$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure307: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$reachable$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure308: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$ref$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure309: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refresh$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure310: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refreshCoverage$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure311: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refreshGC$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure312: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refreshTime$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure313: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$resetAccumulator$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure314: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$result$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure315: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$results$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure316: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$resume$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure317: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$retainedBytes$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure318: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$retainedSize$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure319: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$retainingPath$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure320: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$rootLib(v);
+    },
+    $isFunction: true
+  },
+  main_closure321: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$sampleCount$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure322: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$sampleDepth$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure323: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$sampleRate$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure324: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$script$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure325: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$small$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure326: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$socket$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure327: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$socketOwner(v);
+    },
+    $isFunction: true
+  },
+  main_closure328: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$startLine$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure329: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$status$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure330: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$subclass(v);
+    },
+    $isFunction: true
+  },
+  main_closure331: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$superClass(v);
+    },
+    $isFunction: true
+  },
+  main_closure332: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$tagSelector$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure333: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$text$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure334: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$timeSpan$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure335: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$tokenPos(v);
+    },
+    $isFunction: true
+  },
+  main_closure336: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$trace$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure337: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$uncheckedText$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure338: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$vm$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure339: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$webSocket$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure340: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("curly-block", C.Type_cop);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure341: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("observatory-element", C.Type_sRP);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure342: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-ref", C.Type_UJT);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure343: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("instance-ref", C.Type_EVD);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure344: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("action-link", C.Type_kA7);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure345: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-bar", C.Type_nV5);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure346: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-menu", C.Type_KMd);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure347: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-menu-item", C.Type_AD4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure348: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-refresh", C.Type_Sxn);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure349: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-control", C.Type_9ur);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure350: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("top-nav-menu", C.Type_C7R);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure351: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-nav-menu", C.Type_wsa);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure352: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("library-nav-menu", C.Type_s2l);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure353: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-nav-menu", C.Type_JFX);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure354: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("breakpoint-list", C.Type_ON8);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure355: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-ref", C.Type_ql8);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure356: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-tree", C.Type_dRp);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure357: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("eval-box", C.Type_8eb);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure358: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("eval-link", C.Type_p2P);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure359: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("field-ref", C.Type_ohY);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure360: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("function-ref", C.Type_wgH);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure361: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("library-ref", C.Type_mpV);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure362: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("script-ref", C.Type_wBh);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure363: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-view", C.Type_O5a);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure364: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("code-ref", C.Type_2jN);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure365: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("code-view", C.Type_Aym);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure366: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("error-view", C.Type_Npb);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure367: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("field-view", C.Type_4IJ);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure368: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("stack-frame", C.Type_Jcu);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure369: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("flag-list", C.Type_f1j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure370: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("flag-item", C.Type_7g3);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure371: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("script-inset", C.Type_a1Y);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure372: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("function-view", C.Type_bDN);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure373: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("heap-map", C.Type_SoB);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure374: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-view", C.Type_TEn);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure375: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-ref", C.Type_JmU);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure376: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-list-view", C.Type_yvP);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure377: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-ref", C.Type_i7j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure378: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-view", C.Type_M6L);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure379: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-connection-view", C.Type_L9j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure380: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-connection-ref", C.Type_uIL);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure381: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-socket-ref", C.Type_B8J);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure382: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-socket-list-view", C.Type_4m4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure383: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-socket-view", C.Type_61d);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure384: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-web-socket-ref", C.Type_MUU);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure385: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-web-socket-list-view", C.Type_gg4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure386: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-web-socket-view", C.Type_AyI);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure387: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-random-access-file-list-view", C.Type_IuH);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure388: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-random-access-file-ref", C.Type_mWg);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure389: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-random-access-file-view", C.Type_8cK);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure390: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-process-list-view", C.Type_8KD);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure391: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-process-ref", C.Type_qMZ);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure392: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-process-view", C.Type_AHF);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure393: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-ref", C.Type_ES1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure394: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-summary", C.Type_iL9);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure395: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-run-state", C.Type_aAD);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure396: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-location", C.Type_ECh);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure397: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-shared-summary", C.Type_8Gl);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure398: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-counter-chart", C.Type_wT1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure399: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-view", C.Type_ZKG);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure400: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("instance-view", C.Type_gqS);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure401: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("json-view", C.Type_Kyy);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure402: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("library-view", C.Type_qph);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure403: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("heap-profile", C.Type_LV6);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure404: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("sliding-checkbox", C.Type_kuc);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure405: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-profile", C.Type_cOY);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure406: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("script-view", C.Type_0e9);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure407: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("stack-trace", C.Type_nVV);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure408: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("vm-view", C.Type_E0k);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure409: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-view", C.Type_Mu6);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure410: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("observatory-application", C.Type_YgH);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure411: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-exception-view", C.Type_y1j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure412: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-error-view", C.Type_FKd);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure413: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("vm-ref", C.Type_Eue);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+},
+1],
+["breakpoint_list_element", "package:observatory/src/elements/breakpoint_list.dart", , B, {
+  "^": "",
+  BreakpointListElement: {
+    "^": "ObservatoryElement_ChangeNotifier;_breakpoint_list_element$__$msg,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$msg: function(receiver) {
+      return receiver._breakpoint_list_element$__$msg;
+    },
+    set$msg: function(receiver, value) {
+      receiver._breakpoint_list_element$__$msg = this.notifyPropertyChange$3(receiver, C.Symbol_msg, receiver._breakpoint_list_element$__$msg, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._breakpoint_list_element$__$msg).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {BreakpointListElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.BreakpointListElement_methods.Element$created$0(receiver);
+        C.BreakpointListElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["class_ref_element", "package:observatory/src/elements/class_ref.dart", , Q, {
+  "^": "",
+  ClassRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {ClassRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassRefElement_methods.Element$created$0(receiver);
+        C.ClassRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["class_tree_element", "package:observatory/src/elements/class_tree.dart", , O, {
+  "^": "",
+  ClassTreeRow: {
+    "^": "TableTreeRow;isolate>,cls>,parent,depth,children,columns,_app$__$expander,_app$__$expanderStyle,_expanded,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onShow$0: function(_) {
+      var t1, t2, t3, t4, subClass, t5, row;
+      t1 = this.children;
+      if (t1.length > 0)
+        return;
+      for (t2 = J.get$iterator$ax(J.get$children$x(this.cls)), t3 = this.isolate, t4 = this.depth + 1; t2.moveNext$0();) {
+        subClass = t2.get$current();
+        if (subClass.get$isPatch() === true)
+          continue;
+        t5 = [];
+        t5.$builtinTypeInfo = [G.TableTreeRow];
+        row = new O.ClassTreeRow(t3, subClass, this, t4, t5, [], "\u2192", "cursor: pointer;", false, null, null);
+        if (!row.hasChildren$0()) {
+          t5 = row._app$__$expanderStyle;
+          if (row.get$hasObservers(row) && !J.$eq(t5, "visibility:hidden;")) {
+            t5 = new T.PropertyChangeRecord(row, C.Symbol_expanderStyle, t5, "visibility:hidden;");
+            t5.$builtinTypeInfo = [null];
+            row.notifyChange$1(row, t5);
+          }
+          row._app$__$expanderStyle = "visibility:hidden;";
+        }
+        t1.push(row);
+      }
+    },
+    onHide$0: function() {
+    },
+    hasChildren$0: function() {
+      return J.get$length$asx(J.get$children$x(this.cls)) > 0;
+    }
+  },
+  ClassTreeElement: {
+    "^": "ObservatoryElement_ChangeNotifier1;_class_tree_element$__$isolate,tree=,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._class_tree_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._class_tree_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._class_tree_element$__$isolate, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = R._toObservableDeep([]);
+      receiver.tree = new G.TableTree(t1, null, null);
+      t1 = receiver._class_tree_element$__$isolate;
+      if (t1 != null)
+        this._update$1(receiver, t1.get$objectClass());
+    },
+    isolateChanged$1: [function(receiver, oldValue) {
+      receiver._class_tree_element$__$isolate.getClassHierarchy$0().then$1(new O.ClassTreeElement_isolateChanged_closure(receiver));
+    }, "call$1", "get$isolateChanged", 2, 0, 13, 57],
+    _update$1: function(receiver, root) {
+      var rootRow, e, stackTrace, t1, t2, rootRow0, t3, t4, t5, exception;
+      try {
+        t1 = receiver._class_tree_element$__$isolate;
+        t2 = H.setRuntimeTypeInfo([], [G.TableTreeRow]);
+        rootRow0 = new O.ClassTreeRow(t1, root, null, 0, t2, [], "\u2192", "cursor: pointer;", false, null, null);
+        rootRow0.TableTreeRow$1(null);
+        rootRow = rootRow0;
+        t1 = J.get$children$x(rootRow);
+        t2 = receiver._class_tree_element$__$isolate;
+        t3 = rootRow;
+        t4 = H.setRuntimeTypeInfo([], [G.TableTreeRow]);
+        t5 = t3 != null ? t3.get$depth() + 1 : 0;
+        t4 = new O.ClassTreeRow(t2, root, t3, t5, t4, [], "\u2192", "cursor: pointer;", false, null, null);
+        t4.TableTreeRow$1(t3);
+        t1.push(t4);
+        receiver.tree.initialize$1(rootRow);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        stackTrace = new H._StackTrace(exception, null);
+        N.Logger_Logger("").warning$3("_update", e, stackTrace);
+      }
+
+      if (J.$eq(J.get$length$asx(receiver.tree.rows), 1))
+        receiver.tree.toggle$1(0);
+      this.notifyPropertyChange$3(receiver, C.Symbol_tree, null, receiver.tree);
+    },
+    padding$1: [function(receiver, row) {
+      return "padding-left: " + row.get$depth() * 16 + "px;";
+    }, "call$1", "get$padding", 2, 0, 90, 91],
+    coloring$1: [function(receiver, row) {
+      return C.List_mBx[C.JSInt_methods.$mod(row.get$depth() - 1, 9)];
+    }, "call$1", "get$coloring", 2, 0, 90, 91],
+    toggleExpanded$3: [function(receiver, e, detail, target) {
+      var row, e0, stackTrace, t1, t2, exception;
+      t1 = J.getInterceptor$x(e);
+      if (!J.$eq(J.get$id$x(t1.get$target(e)), "expand") && !J.$eq(t1.get$target(e), target))
+        return;
+      row = J.get$parent$x(target);
+      if (!!J.getInterceptor(row).$isTableRowElement)
+        try {
+          t1 = receiver.tree;
+          t2 = J.get$rowIndex$x(row);
+          if (typeof t2 !== "number")
+            return t2.$sub();
+          t1.toggle$1(t2 - 1);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          stackTrace = new H._StackTrace(exception, null);
+          N.Logger_Logger("").warning$3("toggleExpanded", e0, stackTrace);
+        }
+
+    }, "call$3", "get$toggleExpanded", 6, 0, 92, 1, 93, 94],
+    static: {ClassTreeElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassTreeElement_methods.Element$created$0(receiver);
+        C.ClassTreeElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier1: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ClassTreeElement_isolateChanged_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(objectClass) {
+      J._update$1$x(this.this_0, objectClass);
+    }, "call$1", null, 2, 0, null, 95, "call"],
+    $isFunction: true
+  }
+}],
+["class_view_element", "package:observatory/src/elements/class_view.dart", , Z, {
+  "^": "",
+  ClassViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier2;_class_view_element$__$cls,_class_view_element$__$instances,_class_view_element$__$retainedBytes,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$cls: function(receiver) {
+      return receiver._class_view_element$__$cls;
+    },
+    set$cls: function(receiver, value) {
+      receiver._class_view_element$__$cls = this.notifyPropertyChange$3(receiver, C.Symbol_cls, receiver._class_view_element$__$cls, value);
+    },
+    get$instances: function(receiver) {
+      return receiver._class_view_element$__$instances;
+    },
+    set$instances: function(receiver, value) {
+      receiver._class_view_element$__$instances = this.notifyPropertyChange$3(receiver, C.Symbol_instances, receiver._class_view_element$__$instances, value);
+    },
+    get$retainedBytes: function(receiver) {
+      return receiver._class_view_element$__$retainedBytes;
+    },
+    set$retainedBytes: function(receiver, value) {
+      receiver._class_view_element$__$retainedBytes = this.notifyPropertyChange$3(receiver, C.Symbol_retainedBytes, receiver._class_view_element$__$retainedBytes, value);
+    },
+    eval$1: [function(receiver, text) {
+      return receiver._class_view_element$__$cls.get$1("eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    reachable$1: [function(receiver, limit) {
+      return receiver._class_view_element$__$cls.get$1("instances?limit=" + H.S(limit)).then$1(new Z.ClassViewElement_reachable_closure(receiver));
+    }, "call$1", "get$reachable", 2, 0, 98, 99],
+    retainedSize$1: [function(receiver, dummy) {
+      return receiver._class_view_element$__$cls.get$1("retained").then$1(new Z.ClassViewElement_retainedSize_closure(receiver));
+    }, "call$1", "get$retainedSize", 2, 0, 98, 100],
+    refresh$1: [function(receiver, done) {
+      receiver._class_view_element$__$instances = this.notifyPropertyChange$3(receiver, C.Symbol_instances, receiver._class_view_element$__$instances, null);
+      receiver._class_view_element$__$retainedBytes = this.notifyPropertyChange$3(receiver, C.Symbol_retainedBytes, receiver._class_view_element$__$retainedBytes, null);
+      J.reload$0$x(receiver._class_view_element$__$cls).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {ClassViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassViewElement_methods.Element$created$0(receiver);
+        C.ClassViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier2: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ClassViewElement_reachable_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(obj) {
+      var t1 = this.this_0;
+      t1._class_view_element$__$instances = J.notifyPropertyChange$3$x(t1, C.Symbol_instances, t1._class_view_element$__$instances, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  ClassViewElement_retainedSize_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(obj) {
+      var t1, t2;
+      t1 = this.this_0;
+      t2 = H.Primitives_parseInt(J.$index$asx(obj, "valueAsString"), null, null);
+      t1._class_view_element$__$retainedBytes = J.notifyPropertyChange$3$x(t1, C.Symbol_retainedBytes, t1._class_view_element$__$retainedBytes, t2);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  }
+}],
+["code_ref_element", "package:observatory/src/elements/code_ref.dart", , O, {
+  "^": "",
+  CodeRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$code: function(receiver) {
+      return receiver._service_ref_element$__$ref;
+    },
+    refChanged$1: [function(receiver, oldValue) {
+      Q.ServiceRefElement.prototype.refChanged$1.call(this, receiver, oldValue);
+      this.notifyPropertyChange$3(receiver, C.Symbol_code, 0, 1);
+    }, "call$1", "get$refChanged", 2, 0, 13, 57],
+    static: {CodeRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.CodeRefElement_methods.Element$created$0(receiver);
+        C.CodeRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["code_view_element", "package:observatory/src/elements/code_view.dart", , F, {
+  "^": "",
+  CodeViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier3;_code_view_element$__$code,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$code: function(receiver) {
+      return receiver._code_view_element$__$code;
+    },
+    set$code: function(receiver, value) {
+      receiver._code_view_element$__$code = this.notifyPropertyChange$3(receiver, C.Symbol_code, receiver._code_view_element$__$code, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = receiver._code_view_element$__$code;
+      if (t1 == null)
+        return;
+      J.load$0$x(t1).then$1(new F.CodeViewElement_attached_closure());
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._code_view_element$__$code).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _findJumpTarget$1: function(receiver, target) {
+      var jumpTarget, address, node;
+      jumpTarget = J.get$attributes$x(target)._html$_element.getAttribute("data-jump-target");
+      if (jumpTarget === "")
+        return;
+      address = H.Primitives_parseInt(jumpTarget, null, null);
+      node = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#addr-" + H.S(address));
+      if (node == null)
+        return;
+      return node;
+    },
+    mouseOver$3: [function(receiver, e, detail, target) {
+      var jt = this._findJumpTarget$1(receiver, target);
+      if (jt == null)
+        return;
+      J.get$classes$x(jt).add$1(0, "highlight");
+    }, "call$3", "get$mouseOver", 6, 0, 102, 1, 93, 94],
+    mouseOut$3: [function(receiver, e, detail, target) {
+      var jt = this._findJumpTarget$1(receiver, target);
+      if (jt == null)
+        return;
+      J.get$classes$x(jt).remove$1(0, "highlight");
+    }, "call$3", "get$mouseOut", 6, 0, 102, 1, 93, 94],
+    static: {CodeViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.CodeViewElement_methods.Element$created$0(receiver);
+        C.CodeViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier3: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  CodeViewElement_attached_closure: {
+    "^": "Closure:103;",
+    call$1: [function(c) {
+      c.loadScript$0();
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  }
+}],
+["curly_block_element", "package:observatory/src/elements/curly_block.dart", , R, {
+  "^": "",
+  CurlyBlockElement: {
+    "^": "PolymerElement_ChangeNotifier0;_curly_block_element$__$expanded,_curly_block_element$__$busy,_curly_block_element$__$callback,_curly_block_element$__$expand,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$expanded: function(receiver) {
+      return receiver._curly_block_element$__$expanded;
+    },
+    set$expanded: function(receiver, value) {
+      receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, receiver._curly_block_element$__$expanded, value);
+    },
+    get$busy: function(receiver) {
+      return receiver._curly_block_element$__$busy;
+    },
+    set$busy: function(receiver, value) {
+      receiver._curly_block_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._curly_block_element$__$busy, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._curly_block_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$2: function($receiver, arg0, arg1) {
+      return this.get$callback($receiver).call$2(arg0, arg1);
+    },
+    set$callback: function(receiver, value) {
+      receiver._curly_block_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._curly_block_element$__$callback, value);
+    },
+    get$expand: function(receiver) {
+      return receiver._curly_block_element$__$expand;
+    },
+    set$expand: function(receiver, value) {
+      receiver._curly_block_element$__$expand = this.notifyPropertyChange$3(receiver, C.Symbol_expand, receiver._curly_block_element$__$expand, value);
+    },
+    expandChanged$1: [function(receiver, oldValue) {
+      var t1 = receiver._curly_block_element$__$expand;
+      receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, receiver._curly_block_element$__$expanded, t1);
+    }, "call$1", "get$expandChanged", 2, 0, 20, 57],
+    doneCallback$0: [function(receiver) {
+      var t1 = receiver._curly_block_element$__$expanded;
+      receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, t1, t1 !== true);
+      receiver._curly_block_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._curly_block_element$__$busy, false);
+    }, "call$0", "get$doneCallback", 0, 0, 18],
+    toggleExpand$3: [function(receiver, a, b, c) {
+      var t1 = receiver._curly_block_element$__$busy;
+      if (t1 === true)
+        return;
+      if (receiver._curly_block_element$__$callback != null) {
+        receiver._curly_block_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, t1, true);
+        this.callback$2(receiver, receiver._curly_block_element$__$expanded !== true, this.get$doneCallback(receiver));
+      } else {
+        t1 = receiver._curly_block_element$__$expanded;
+        receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, t1, t1 !== true);
+      }
+    }, "call$3", "get$toggleExpand", 6, 0, 79, 46, 47, 80],
+    static: {CurlyBlockElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._curly_block_element$__$expanded = false;
+        receiver._curly_block_element$__$busy = false;
+        receiver._curly_block_element$__$callback = null;
+        receiver._curly_block_element$__$expand = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.CurlyBlockElement_methods.Element$created$0(receiver);
+        C.CurlyBlockElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier0: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["dart._internal", "dart:_internal", , H, {
+  "^": "",
+  IterableMixinWorkaround_forEach: function(iterable, f) {
+    var t1;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();)
+      f.call$1(t1._current);
+  },
+  IterableMixinWorkaround_any: function(iterable, f) {
+    var t1;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();)
+      if (f.call$1(t1._current) === true)
+        return true;
+    return false;
+  },
+  IterableMixinWorkaround_fold: function(iterable, initialValue, combine) {
+    var t1;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();)
+      initialValue = combine.call$2(initialValue, t1._current);
+    return initialValue;
+  },
+  IterableMixinWorkaround_sortList: function(list, compare) {
+    if (compare == null)
+      compare = P.Comparable_compare$closure();
+    H.Sort__doSort(list, 0, list.length - 1, compare);
+  },
+  IterableMixinWorkaround__rangeCheck: function(list, start, end) {
+    var t1 = J.getInterceptor$n(start);
+    if (t1.$lt(start, 0) || t1.$gt(start, list.length))
+      throw H.wrapException(P.RangeError$range(start, 0, list.length));
+    t1 = J.getInterceptor$n(end);
+    if (t1.$lt(end, start) || t1.$gt(end, list.length))
+      throw H.wrapException(P.RangeError$range(end, start, list.length));
+  },
+  IterableMixinWorkaround_setRangeList: function(list, start, end, from, skipCount) {
+    var $length, t1, otherStart, otherList;
+    H.IterableMixinWorkaround__rangeCheck(list, start, end);
+    $length = J.$sub$n(end, start);
+    if (J.$eq($length, 0))
+      return;
+    if (J.$lt$n(skipCount, 0))
+      throw H.wrapException(P.ArgumentError$(skipCount));
+    t1 = J.getInterceptor(from);
+    if (!!t1.$isList) {
+      otherStart = skipCount;
+      otherList = from;
+    } else {
+      otherList = t1.skip$1(from, skipCount).toList$1$growable(0, false);
+      otherStart = 0;
+    }
+    if (J.$gt$n(J.$add$ns(otherStart, $length), J.get$length$asx(otherList)))
+      throw H.wrapException(H.IterableElementError_tooFew());
+    H.Lists_copy(otherList, otherStart, list, start, $length);
+  },
+  IterableMixinWorkaround_insertAllList: function(list, index, iterable) {
+    var t1, insertionLength, t2, index0;
+    if (index < 0 || index > list.length)
+      throw H.wrapException(P.RangeError$range(index, 0, list.length));
+    t1 = J.getInterceptor(iterable);
+    if (!t1.$isEfficientLength)
+      iterable = t1.toList$1$growable(iterable, false);
+    t1 = J.getInterceptor$asx(iterable);
+    insertionLength = t1.get$length(iterable);
+    t2 = list.length;
+    if (typeof insertionLength !== "number")
+      return H.iae(insertionLength);
+    C.JSArray_methods.set$length(list, t2 + insertionLength);
+    t2 = list.length;
+    if (!!list.immutable$list)
+      H.throwExpression(P.UnsupportedError$("set range"));
+    H.IterableMixinWorkaround_setRangeList(list, index + insertionLength, t2, list, index);
+    for (t1 = t1.get$iterator(iterable); t1.moveNext$0(); index = index0) {
+      index0 = index + 1;
+      C.JSArray_methods.$indexSet(list, index, t1.get$current());
+    }
+  },
+  IterableMixinWorkaround_setAllList: function(list, index, iterable) {
+    var t1, index0;
+    if (index < 0 || index > list.length)
+      throw H.wrapException(P.RangeError$range(index, 0, list.length));
+    for (t1 = J.get$iterator$ax(iterable); t1.moveNext$0(); index = index0) {
+      index0 = index + 1;
+      C.JSArray_methods.$indexSet(list, index, t1.get$current());
+    }
+  },
+  IterableElementError_noElement: function() {
+    return new P.StateError("No element");
+  },
+  IterableElementError_tooFew: function() {
+    return new P.StateError("Too few elements");
+  },
+  Lists_copy: function(src, srcStart, dst, dstStart, count) {
+    var t1, i, j, t2, t3;
+    t1 = J.getInterceptor$n(srcStart);
+    if (t1.$lt(srcStart, dstStart))
+      for (i = J.$sub$n(t1.$add(srcStart, count), 1), j = J.$sub$n(J.$add$ns(dstStart, count), 1), t1 = J.getInterceptor$asx(src); t2 = J.getInterceptor$n(i), t2.$ge(i, srcStart); i = t2.$sub(i, 1), j = J.$sub$n(j, 1))
+        C.JSArray_methods.$indexSet(dst, j, t1.$index(src, i));
+    else
+      for (t2 = J.getInterceptor$asx(src), j = dstStart, i = srcStart; t3 = J.getInterceptor$n(i), t3.$lt(i, t1.$add(srcStart, count)); i = t3.$add(i, 1), j = J.$add$ns(j, 1))
+        C.JSArray_methods.$indexSet(dst, j, t2.$index(src, i));
+  },
+  Lists_indexOf: function(a, element, startIndex, endIndex) {
+    var i;
+    if (startIndex >= a.length)
+      return -1;
+    for (i = startIndex; i < endIndex; ++i) {
+      if (i >= a.length)
+        return H.ioore(a, i);
+      if (J.$eq(a[i], element))
+        return i;
+    }
+    return -1;
+  },
+  Lists_lastIndexOf: function(a, element, startIndex) {
+    var t1, i;
+    if (typeof startIndex !== "number")
+      return startIndex.$lt();
+    if (startIndex < 0)
+      return -1;
+    t1 = a.length;
+    if (startIndex >= t1)
+      startIndex = t1 - 1;
+    for (i = startIndex; i >= 0; --i) {
+      if (i >= a.length)
+        return H.ioore(a, i);
+      if (J.$eq(a[i], element))
+        return i;
+    }
+    return -1;
+  },
+  Sort__doSort: function(a, left, right, compare) {
+    if (right - left <= 32)
+      H.Sort__insertionSort(a, left, right, compare);
+    else
+      H.Sort__dualPivotQuicksort(a, left, right, compare);
+  },
+  Sort__insertionSort: function(a, left, right, compare) {
+    var i, t1, el, j, j0;
+    for (i = left + 1, t1 = J.getInterceptor$asx(a); i <= right; ++i) {
+      el = t1.$index(a, i);
+      j = i;
+      while (true) {
+        if (!(j > left && J.$gt$n(compare.call$2(t1.$index(a, j - 1), el), 0)))
+          break;
+        j0 = j - 1;
+        t1.$indexSet(a, j, t1.$index(a, j0));
+        j = j0;
+      }
+      t1.$indexSet(a, j, el);
+    }
+  },
+  Sort__dualPivotQuicksort: function(a, left, right, compare) {
+    var sixth, index1, index5, index3, index2, index4, t1, el1, el2, el3, el4, el5, t0, less, great, k, ak, comp, t2, great0, less0, pivots_are_equal;
+    sixth = C.JSInt_methods._tdivFast$1(right - left + 1, 6);
+    index1 = left + sixth;
+    index5 = right - sixth;
+    index3 = C.JSInt_methods._tdivFast$1(left + right, 2);
+    index2 = index3 - sixth;
+    index4 = index3 + sixth;
+    t1 = J.getInterceptor$asx(a);
+    el1 = t1.$index(a, index1);
+    el2 = t1.$index(a, index2);
+    el3 = t1.$index(a, index3);
+    el4 = t1.$index(a, index4);
+    el5 = t1.$index(a, index5);
+    if (J.$gt$n(compare.call$2(el1, el2), 0)) {
+      t0 = el2;
+      el2 = el1;
+      el1 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el4, el5), 0)) {
+      t0 = el5;
+      el5 = el4;
+      el4 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el1, el3), 0)) {
+      t0 = el3;
+      el3 = el1;
+      el1 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el2, el3), 0)) {
+      t0 = el3;
+      el3 = el2;
+      el2 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el1, el4), 0)) {
+      t0 = el4;
+      el4 = el1;
+      el1 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el3, el4), 0)) {
+      t0 = el4;
+      el4 = el3;
+      el3 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el2, el5), 0)) {
+      t0 = el5;
+      el5 = el2;
+      el2 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el2, el3), 0)) {
+      t0 = el3;
+      el3 = el2;
+      el2 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el4, el5), 0)) {
+      t0 = el5;
+      el5 = el4;
+      el4 = t0;
+    }
+    t1.$indexSet(a, index1, el1);
+    t1.$indexSet(a, index3, el3);
+    t1.$indexSet(a, index5, el5);
+    t1.$indexSet(a, index2, t1.$index(a, left));
+    t1.$indexSet(a, index4, t1.$index(a, right));
+    less = left + 1;
+    great = right - 1;
+    if (J.$eq(compare.call$2(el2, el4), 0)) {
+      for (k = less; k <= great; ++k) {
+        ak = t1.$index(a, k);
+        comp = compare.call$2(ak, el2);
+        t2 = J.getInterceptor(comp);
+        if (t2.$eq(comp, 0))
+          continue;
+        if (t2.$lt(comp, 0)) {
+          if (k !== less) {
+            t1.$indexSet(a, k, t1.$index(a, less));
+            t1.$indexSet(a, less, ak);
+          }
+          ++less;
+        } else
+          for (; true;) {
+            comp = compare.call$2(t1.$index(a, great), el2);
+            t2 = J.getInterceptor$n(comp);
+            if (t2.$gt(comp, 0)) {
+              --great;
+              continue;
+            } else {
+              great0 = great - 1;
+              if (t2.$lt(comp, 0)) {
+                t1.$indexSet(a, k, t1.$index(a, less));
+                less0 = less + 1;
+                t1.$indexSet(a, less, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                less = less0;
+                break;
+              } else {
+                t1.$indexSet(a, k, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                break;
+              }
+            }
+          }
+      }
+      pivots_are_equal = true;
+    } else {
+      for (k = less; k <= great; ++k) {
+        ak = t1.$index(a, k);
+        if (J.$lt$n(compare.call$2(ak, el2), 0)) {
+          if (k !== less) {
+            t1.$indexSet(a, k, t1.$index(a, less));
+            t1.$indexSet(a, less, ak);
+          }
+          ++less;
+        } else if (J.$gt$n(compare.call$2(ak, el4), 0))
+          for (; true;)
+            if (J.$gt$n(compare.call$2(t1.$index(a, great), el4), 0)) {
+              --great;
+              if (great < k)
+                break;
+              continue;
+            } else {
+              great0 = great - 1;
+              if (J.$lt$n(compare.call$2(t1.$index(a, great), el2), 0)) {
+                t1.$indexSet(a, k, t1.$index(a, less));
+                less0 = less + 1;
+                t1.$indexSet(a, less, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                less = less0;
+              } else {
+                t1.$indexSet(a, k, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+              }
+              break;
+            }
+      }
+      pivots_are_equal = false;
+    }
+    t2 = less - 1;
+    t1.$indexSet(a, left, t1.$index(a, t2));
+    t1.$indexSet(a, t2, el2);
+    t2 = great + 1;
+    t1.$indexSet(a, right, t1.$index(a, t2));
+    t1.$indexSet(a, t2, el4);
+    H.Sort__doSort(a, left, less - 2, compare);
+    H.Sort__doSort(a, great + 2, right, compare);
+    if (pivots_are_equal)
+      return;
+    if (less < index1 && great > index5) {
+      for (; J.$eq(compare.call$2(t1.$index(a, less), el2), 0);)
+        ++less;
+      for (; J.$eq(compare.call$2(t1.$index(a, great), el4), 0);)
+        --great;
+      for (k = less; k <= great; ++k) {
+        ak = t1.$index(a, k);
+        if (J.$eq(compare.call$2(ak, el2), 0)) {
+          if (k !== less) {
+            t1.$indexSet(a, k, t1.$index(a, less));
+            t1.$indexSet(a, less, ak);
+          }
+          ++less;
+        } else if (J.$eq(compare.call$2(ak, el4), 0))
+          for (; true;)
+            if (J.$eq(compare.call$2(t1.$index(a, great), el4), 0)) {
+              --great;
+              if (great < k)
+                break;
+              continue;
+            } else {
+              great0 = great - 1;
+              if (J.$lt$n(compare.call$2(t1.$index(a, great), el2), 0)) {
+                t1.$indexSet(a, k, t1.$index(a, less));
+                less0 = less + 1;
+                t1.$indexSet(a, less, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                less = less0;
+              } else {
+                t1.$indexSet(a, k, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+              }
+              break;
+            }
+      }
+      H.Sort__doSort(a, less, great, compare);
+    } else
+      H.Sort__doSort(a, less, great, compare);
+  },
+  ListIterable: {
+    "^": "IterableBase;",
+    get$iterator: function(_) {
+      return H.setRuntimeTypeInfo(new H.ListIterator(this, this.get$length(this), 0, null), [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+    },
+    forEach$1: function(_, action) {
+      var $length, i;
+      $length = this.get$length(this);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      i = 0;
+      for (; i < $length; ++i) {
+        action.call$1(this.elementAt$1(0, i));
+        if ($length !== this.get$length(this))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+    },
+    get$isEmpty: function(_) {
+      return J.$eq(this.get$length(this), 0);
+    },
+    get$last: function(_) {
+      if (J.$eq(this.get$length(this), 0))
+        throw H.wrapException(H.IterableElementError_noElement());
+      return this.elementAt$1(0, J.$sub$n(this.get$length(this), 1));
+    },
+    contains$1: function(_, element) {
+      var $length, i;
+      $length = this.get$length(this);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      i = 0;
+      for (; i < $length; ++i) {
+        if (J.$eq(this.elementAt$1(0, i), element))
+          return true;
+        if ($length !== this.get$length(this))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+      return false;
+    },
+    any$1: function(_, test) {
+      var $length, i;
+      $length = this.get$length(this);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      i = 0;
+      for (; i < $length; ++i) {
+        if (test.call$1(this.elementAt$1(0, i)) === true)
+          return true;
+        if ($length !== this.get$length(this))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+      return false;
+    },
+    join$1: function(_, separator) {
+      var $length, t1, first, buffer, i, str;
+      $length = this.get$length(this);
+      if (separator.length !== 0) {
+        t1 = J.getInterceptor($length);
+        if (t1.$eq($length, 0))
+          return "";
+        first = H.S(this.elementAt$1(0, 0));
+        if (!t1.$eq($length, this.get$length(this)))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+        buffer = P.StringBuffer$(first);
+        if (typeof $length !== "number")
+          return H.iae($length);
+        i = 1;
+        for (; i < $length; ++i) {
+          buffer._contents += separator;
+          str = this.elementAt$1(0, i);
+          buffer._contents += typeof str === "string" ? str : H.S(str);
+          if ($length !== this.get$length(this))
+            throw H.wrapException(P.ConcurrentModificationError$(this));
+        }
+        return buffer._contents;
+      } else {
+        buffer = P.StringBuffer$("");
+        if (typeof $length !== "number")
+          return H.iae($length);
+        i = 0;
+        for (; i < $length; ++i) {
+          str = this.elementAt$1(0, i);
+          buffer._contents += typeof str === "string" ? str : H.S(str);
+          if ($length !== this.get$length(this))
+            throw H.wrapException(P.ConcurrentModificationError$(this));
+        }
+        return buffer._contents;
+      }
+    },
+    where$1: function(_, test) {
+      return P.IterableBase.prototype.where$1.call(this, this, test);
+    },
+    map$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(this, f), [null, null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E0", ret: P.Iterable, args: [{func: "dynamic__E0", args: [E]}]};
+      }, this.$receiver, "ListIterable");
+    }, 31],
+    toList$1$growable: function(_, growable) {
+      var result, t1, i;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(this));
+      } else {
+        t1 = this.get$length(this);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = Array(t1);
+        t1.fixed$length = init;
+        result = H.setRuntimeTypeInfo(t1, [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+      }
+      i = 0;
+      while (true) {
+        t1 = this.get$length(this);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        if (!(i < t1))
+          break;
+        t1 = this.elementAt$1(0, i);
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t1;
+        ++i;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    $isEfficientLength: true
+  },
+  SubListIterable: {
+    "^": "ListIterable;_iterable,_start,_endOrLength",
+    get$_endIndex: function() {
+      var $length, t1;
+      $length = J.get$length$asx(this._iterable);
+      t1 = this._endOrLength;
+      if (t1 == null || J.$gt$n(t1, $length))
+        return $length;
+      return t1;
+    },
+    get$_startIndex: function() {
+      var $length, t1;
+      $length = J.get$length$asx(this._iterable);
+      t1 = this._start;
+      if (J.$gt$n(t1, $length))
+        return $length;
+      return t1;
+    },
+    get$length: function(_) {
+      var $length, t1, t2;
+      $length = J.get$length$asx(this._iterable);
+      t1 = this._start;
+      if (J.$ge$n(t1, $length))
+        return 0;
+      t2 = this._endOrLength;
+      if (t2 == null || J.$ge$n(t2, $length))
+        return J.$sub$n($length, t1);
+      return J.$sub$n(t2, t1);
+    },
+    elementAt$1: function(_, index) {
+      var realIndex = J.$add$ns(this.get$_startIndex(), index);
+      if (J.$lt$n(index, 0) || J.$ge$n(realIndex, this.get$_endIndex()))
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      return J.elementAt$1$ax(this._iterable, realIndex);
+    },
+    skip$1: function(_, count) {
+      if (J.$lt$n(count, 0))
+        throw H.wrapException(P.RangeError$value(count));
+      return H.SubListIterable$(this._iterable, J.$add$ns(this._start, count), this._endOrLength, null);
+    },
+    take$1: function(_, count) {
+      var t1, t2, newEnd;
+      if (count < 0)
+        throw H.wrapException(P.RangeError$value(count));
+      t1 = this._endOrLength;
+      t2 = this._start;
+      if (t1 == null)
+        return H.SubListIterable$(this._iterable, t2, J.$add$ns(t2, count), null);
+      else {
+        newEnd = J.$add$ns(t2, count);
+        if (J.$lt$n(t1, newEnd))
+          return this;
+        return H.SubListIterable$(this._iterable, t2, newEnd, null);
+      }
+    },
+    SubListIterable$3: function(_iterable, _start, _endOrLength, $E) {
+      var t1, t2, t3;
+      t1 = this._start;
+      t2 = J.getInterceptor$n(t1);
+      if (t2.$lt(t1, 0))
+        throw H.wrapException(P.RangeError$value(t1));
+      t3 = this._endOrLength;
+      if (t3 != null) {
+        if (J.$lt$n(t3, 0))
+          throw H.wrapException(P.RangeError$value(t3));
+        if (t2.$gt(t1, t3))
+          throw H.wrapException(P.RangeError$range(t1, 0, t3));
+      }
+    },
+    static: {SubListIterable$: function(_iterable, _start, _endOrLength, $E) {
+        var t1 = H.setRuntimeTypeInfo(new H.SubListIterable(_iterable, _start, _endOrLength), [$E]);
+        t1.SubListIterable$3(_iterable, _start, _endOrLength, $E);
+        return t1;
+      }}
+  },
+  ListIterator: {
+    "^": "Object;_iterable,_length,_index,_current",
+    get$current: function() {
+      return this._current;
+    },
+    moveNext$0: function() {
+      var t1, t2, $length, t3;
+      t1 = this._iterable;
+      t2 = J.getInterceptor$asx(t1);
+      $length = t2.get$length(t1);
+      if (!J.$eq(this._length, $length))
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      t3 = this._index;
+      if (typeof $length !== "number")
+        return H.iae($length);
+      if (t3 >= $length) {
+        this._current = null;
+        return false;
+      }
+      this._current = t2.elementAt$1(t1, t3);
+      ++this._index;
+      return true;
+    }
+  },
+  MappedIterable: {
+    "^": "IterableBase;_iterable,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    get$iterator: function(_) {
+      var t1 = new H.MappedIterator(null, J.get$iterator$ax(this._iterable), this._f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._iterable);
+    },
+    get$isEmpty: function(_) {
+      return J.get$isEmpty$asx(this._iterable);
+    },
+    get$last: function(_) {
+      return this._f$1(J.get$last$ax(this._iterable));
+    },
+    $asIterableBase: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    },
+    static: {MappedIterable_MappedIterable: function(iterable, $function, $S, $T) {
+        if (!!J.getInterceptor(iterable).$isEfficientLength)
+          return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(iterable, $function), [$S, $T]);
+        return H.setRuntimeTypeInfo(new H.MappedIterable(iterable, $function), [$S, $T]);
+      }}
+  },
+  EfficientLengthMappedIterable: {
+    "^": "MappedIterable;_iterable,_f",
+    $isEfficientLength: true
+  },
+  MappedIterator: {
+    "^": "Iterator;_current,_iterator,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    moveNext$0: function() {
+      var t1 = this._iterator;
+      if (t1.moveNext$0()) {
+        this._current = this._f$1(t1.get$current());
+        return true;
+      }
+      this._current = null;
+      return false;
+    },
+    get$current: function() {
+      return this._current;
+    },
+    $asIterator: function($S, $T) {
+      return [$T];
+    }
+  },
+  MappedListIterable: {
+    "^": "ListIterable;_source,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._source);
+    },
+    elementAt$1: function(_, index) {
+      return this._f$1(J.elementAt$1$ax(this._source, index));
+    },
+    $asListIterable: function($S, $T) {
+      return [$T];
+    },
+    $asIterableBase: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    },
+    $isEfficientLength: true
+  },
+  WhereIterable: {
+    "^": "IterableBase;_iterable,_f",
+    get$iterator: function(_) {
+      var t1 = new H.WhereIterator(J.get$iterator$ax(this._iterable), this._f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    }
+  },
+  WhereIterator: {
+    "^": "Iterator;_iterator,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    moveNext$0: function() {
+      for (var t1 = this._iterator; t1.moveNext$0();)
+        if (this._f$1(t1.get$current()) === true)
+          return true;
+      return false;
+    },
+    get$current: function() {
+      return this._iterator.get$current();
+    }
+  },
+  ExpandIterable: {
+    "^": "IterableBase;_iterable,_f",
+    get$iterator: function(_) {
+      var t1 = new H.ExpandIterator(J.get$iterator$ax(this._iterable), this._f, C.C_EmptyIterator, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    $asIterableBase: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    }
+  },
+  ExpandIterator: {
+    "^": "Object;_iterator,_f,_currentExpansion,_current",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    get$current: function() {
+      return this._current;
+    },
+    moveNext$0: function() {
+      var t1, t2;
+      t1 = this._currentExpansion;
+      if (t1 == null)
+        return false;
+      for (t2 = this._iterator; !t1.moveNext$0();) {
+        this._current = null;
+        if (t2.moveNext$0()) {
+          this._currentExpansion = null;
+          t1 = J.get$iterator$ax(this._f$1(t2.get$current()));
+          this._currentExpansion = t1;
+        } else
+          return false;
+      }
+      this._current = this._currentExpansion.get$current();
+      return true;
+    }
+  },
+  EmptyIterator: {
+    "^": "Object;",
+    moveNext$0: function() {
+      return false;
+    },
+    get$current: function() {
+      return;
+    }
+  },
+  FixedLengthListMixin: {
+    "^": "Object;",
+    set$length: function(receiver, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change the length of a fixed-length list"));
+    },
+    add$1: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    insert$2: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    insertAll$2: function(receiver, at, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    addAll$1: function(receiver, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    clear$0: function(receiver) {
+      throw H.wrapException(P.UnsupportedError$("Cannot clear a fixed-length list"));
+    },
+    removeRange$2: function(receiver, start, end) {
+      throw H.wrapException(P.UnsupportedError$("Cannot remove from a fixed-length list"));
+    }
+  },
+  UnmodifiableListMixin: {
+    "^": "Object;",
+    $indexSet: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change the length of an unmodifiable list"));
+    },
+    setAll$2: function(_, at, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    add$1: function(_, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    insert$2: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    insertAll$2: function(_, at, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    addAll$1: function(_, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    clear$0: function(_) {
+      throw H.wrapException(P.UnsupportedError$("Cannot clear an unmodifiable list"));
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(_, start, end) {
+      throw H.wrapException(P.UnsupportedError$("Cannot remove from an unmodifiable list"));
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  UnmodifiableListBase: {
+    "^": "ListBase+UnmodifiableListMixin;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  ReversedListIterable: {
+    "^": "ListIterable;_source",
+    get$length: function(_) {
+      return J.get$length$asx(this._source);
+    },
+    elementAt$1: function(_, index) {
+      var t1, t2, t3;
+      t1 = this._source;
+      t2 = J.getInterceptor$asx(t1);
+      t3 = t2.get$length(t1);
+      if (typeof index !== "number")
+        return H.iae(index);
+      return t2.elementAt$1(t1, t3 - 1 - index);
+    }
+  },
+  Symbol0: {
+    "^": "Object;_name>",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isSymbol0 && J.$eq(this._name, other._name);
+    },
+    get$hashCode: function(_) {
+      var t1 = J.get$hashCode$(this._name);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return 536870911 & 664597 * t1;
+    },
+    toString$0: function(_) {
+      return "Symbol(\"" + H.S(this._name) + "\")";
+    },
+    $isSymbol0: true,
+    $isSymbol: true,
+    static: {"^": "Symbol_reservedWordRE,Symbol_publicIdentifierRE,Symbol_identifierRE,Symbol_operatorRE,Symbol_publicSymbolPattern,Symbol_symbolPattern"}
+  }
+}],
+["dart._js_names", "dart:_js_names", , H, {
+  "^": "",
+  extractKeys: function(victim) {
+    var t1 = H.setRuntimeTypeInfo(function(victim, hasOwnProperty) {
+      var result = [];
+      for (var key in victim) {
+        if (hasOwnProperty.call(victim, key))
+          result.push(key);
+      }
+      return result;
+    }(victim, Object.prototype.hasOwnProperty), [null]);
+    t1.fixed$length = init;
+    return t1;
+  }
+}],
+["dart.async", "dart:async", , P, {
+  "^": "",
+  _AsyncRun__initializeScheduleImmediate: function() {
+    if ($.get$globalThis().scheduleImmediate != null)
+      return P._AsyncRun__scheduleImmediateJsOverride$closure();
+    return P._AsyncRun__scheduleImmediateWithTimer$closure();
+  },
+  _AsyncRun__scheduleImmediateJsOverride: [function(callback) {
+    ++init.globalState.topEventLoop._activeJsAsyncCount;
+    $.get$globalThis().scheduleImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateJsOverride_internalCallback(callback), 0));
+  }, "call$1", "_AsyncRun__scheduleImmediateJsOverride$closure", 2, 0, 19],
+  _AsyncRun__scheduleImmediateWithTimer: [function(callback) {
+    P._createTimer(C.Duration_0, callback);
+  }, "call$1", "_AsyncRun__scheduleImmediateWithTimer$closure", 2, 0, 19],
+  _registerErrorHandler: function(errorHandler, zone) {
+    var t1 = H.getDynamicRuntimeType();
+    t1 = H.buildFunctionType(t1, [t1, t1])._isTest$1(errorHandler);
+    if (t1)
+      return zone.registerBinaryCallback$1(errorHandler);
+    else
+      return zone.registerUnaryCallback$1(errorHandler);
+  },
+  Future_Future: function(computation, $T) {
+    var result = P._Future$($T);
+    P.Timer_Timer(C.Duration_0, new P.Future_Future_closure(computation, result));
+    return result;
+  },
+  Future_wait: function(futures, eagerError) {
+    var t1, t2, t3, values, completer;
+    t1 = {};
+    t1.completer_0 = null;
+    t1.values_1 = null;
+    t1.remaining_2 = 0;
+    t1.error_3 = null;
+    t1.stackTrace_4 = null;
+    t2 = new P.Future_wait_handleError(t1, eagerError);
+    for (t3 = H.setRuntimeTypeInfo(new H.ListIterator(futures, futures.length, 0, null), [H.getTypeArgumentByIndex(futures, 0)]); t3.moveNext$0();)
+      t3._current.then$2$onError(new P.Future_wait_closure(t1, eagerError, t1.remaining_2++), t2);
+    t2 = t1.remaining_2;
+    if (t2 === 0)
+      return P._Future$immediate(C.List_empty, null);
+    values = Array(t2);
+    values.fixed$length = init;
+    t1.values_1 = values;
+    t2 = P.List;
+    completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(t2)), [t2]);
+    t1.completer_0 = completer;
+    return completer.future;
+  },
+  _asyncRunCallbackLoop: function() {
+    var entry = $._nextCallback;
+    for (; entry != null;) {
+      J.callback$0$x(entry);
+      entry = entry.get$next();
+      $._nextCallback = entry;
+    }
+    $._lastCallback = null;
+  },
+  _asyncRunCallback: [function() {
+    var exception;
+    try {
+      P._asyncRunCallbackLoop();
+    } catch (exception) {
+      H.unwrapException(exception);
+      $.get$_AsyncRun_scheduleImmediateClosure().call$1(P._asyncRunCallback$closure());
+      $._nextCallback = $._nextCallback.get$next();
+      throw exception;
+    }
+
+  }, "call$0", "_asyncRunCallback$closure", 0, 0, 18],
+  _scheduleAsyncCallback: function(callback) {
+    var t1, t2;
+    t1 = $._lastCallback;
+    if (t1 == null) {
+      t1 = new P._AsyncCallbackEntry(callback, null);
+      $._lastCallback = t1;
+      $._nextCallback = t1;
+      $.get$_AsyncRun_scheduleImmediateClosure().call$1(P._asyncRunCallback$closure());
+    } else {
+      t2 = new P._AsyncCallbackEntry(callback, null);
+      t1.next = t2;
+      $._lastCallback = t2;
+    }
+  },
+  scheduleMicrotask: function(callback) {
+    var t1;
+    if (J.$eq($.Zone__current, C.C__RootZone)) {
+      $.Zone__current.scheduleMicrotask$1(callback);
+      return;
+    }
+    t1 = $.Zone__current;
+    t1.scheduleMicrotask$1(t1.bindCallback$2$runGuarded(callback, true));
+  },
+  StreamController_StreamController: function(onCancel, onListen, onPause, onResume, sync, $T) {
+    return sync ? H.setRuntimeTypeInfo(new P._SyncStreamController(onListen, onPause, onResume, onCancel, null, 0, null), [$T]) : H.setRuntimeTypeInfo(new P._AsyncStreamController(onListen, onPause, onResume, onCancel, null, 0, null), [$T]);
+  },
+  StreamController_StreamController$broadcast: function(onCancel, onListen, sync, $T) {
+    var t1;
+    if (sync) {
+      t1 = H.setRuntimeTypeInfo(new P._SyncBroadcastStreamController(onListen, onCancel, 0, null, null, null, null), [$T]);
+      t1._async$_previous = t1;
+      t1._async$_next = t1;
+    } else {
+      t1 = H.setRuntimeTypeInfo(new P._AsyncBroadcastStreamController(onListen, onCancel, 0, null, null, null, null), [$T]);
+      t1._async$_previous = t1;
+      t1._async$_next = t1;
+    }
+    return t1;
+  },
+  _runGuarded: function(notificationHandler) {
+    var result, e, s, exception, t1;
+    if (notificationHandler == null)
+      return;
+    try {
+      result = notificationHandler.call$0();
+      if (!!J.getInterceptor(result).$isFuture)
+        return result;
+      return;
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      e = t1;
+      s = new H._StackTrace(exception, null);
+      $.Zone__current.handleUncaughtError$2(e, s);
+    }
+
+  },
+  _nullDataHandler: [function(value) {
+  }, "call$1", "_nullDataHandler$closure", 2, 0, 20, 21],
+  _nullErrorHandler: [function(error, stackTrace) {
+    $.Zone__current.handleUncaughtError$2(error, stackTrace);
+  }, function(error) {
+    return P._nullErrorHandler(error, null);
+  }, null, "call$2", "call$1", "_nullErrorHandler$closure", 2, 2, 22, 23, 24, 25],
+  _nullDoneHandler: [function() {
+  }, "call$0", "_nullDoneHandler$closure", 0, 0, 18],
+  _runUserCode: function(userCode, onSuccess, onError) {
+    var e, s, exception, t1;
+    try {
+      onSuccess.call$1(userCode.call$0());
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      e = t1;
+      s = new H._StackTrace(exception, null);
+      onError.call$2(e, s);
+    }
+
+  },
+  _cancelAndError: function(subscription, future, error, stackTrace) {
+    var cancelFuture = subscription.cancel$0();
+    if (!!J.getInterceptor(cancelFuture).$isFuture)
+      cancelFuture.whenComplete$1(new P._cancelAndError_closure(future, error, stackTrace));
+    else
+      future._completeError$2(error, stackTrace);
+  },
+  _cancelAndErrorClosure: function(subscription, future) {
+    return new P._cancelAndErrorClosure_closure(subscription, future);
+  },
+  _cancelAndValue: function(subscription, future, value) {
+    var cancelFuture = subscription.cancel$0();
+    if (!!J.getInterceptor(cancelFuture).$isFuture)
+      cancelFuture.whenComplete$1(new P._cancelAndValue_closure(future, value));
+    else
+      future._complete$1(value);
+  },
+  Timer_Timer: function(duration, callback) {
+    var t1;
+    if (J.$eq($.Zone__current, C.C__RootZone))
+      return $.Zone__current.createTimer$2(duration, callback);
+    t1 = $.Zone__current;
+    return t1.createTimer$2(duration, t1.bindCallback$2$runGuarded(callback, true));
+  },
+  _createTimer: function(duration, callback) {
+    var milliseconds = duration.get$inMilliseconds();
+    return H.TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
+  },
+  Zone__enter: function(zone) {
+    var previous = $.Zone__current;
+    $.Zone__current = zone;
+    return previous;
+  },
+  _rootHandleUncaughtError: [function($self, $parent, zone, error, stackTrace) {
+    $self.run$1(new P._rootHandleUncaughtError_closure(error, stackTrace));
+  }, "call$5", "_rootHandleUncaughtError$closure", 10, 0, 26, 27, 28, 29, 24, 25],
+  _rootRun: [function($self, $parent, zone, f) {
+    var old, t1;
+    if (J.$eq($.Zone__current, zone))
+      return f.call$0();
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$0();
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  }, "call$4", "_rootRun$closure", 8, 0, 30, 27, 28, 29, 31],
+  _rootRunUnary: [function($self, $parent, zone, f, arg) {
+    var old, t1;
+    if (J.$eq($.Zone__current, zone))
+      return f.call$1(arg);
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$1(arg);
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  }, "call$5", "_rootRunUnary$closure", 10, 0, 32, 27, 28, 29, 31, 33],
+  _rootRunBinary: [function($self, $parent, zone, f, arg1, arg2) {
+    var old, t1;
+    if (J.$eq($.Zone__current, zone))
+      return f.call$2(arg1, arg2);
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$2(arg1, arg2);
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  }, "call$6", "_rootRunBinary$closure", 12, 0, 34, 27, 28, 29, 31, 9, 10],
+  _rootRegisterCallback: [function($self, $parent, zone, f) {
+    return f;
+  }, "call$4", "_rootRegisterCallback$closure", 8, 0, 35, 27, 28, 29, 31],
+  _rootRegisterUnaryCallback: [function($self, $parent, zone, f) {
+    return f;
+  }, "call$4", "_rootRegisterUnaryCallback$closure", 8, 0, 36, 27, 28, 29, 31],
+  _rootRegisterBinaryCallback: [function($self, $parent, zone, f) {
+    return f;
+  }, "call$4", "_rootRegisterBinaryCallback$closure", 8, 0, 37, 27, 28, 29, 31],
+  _rootScheduleMicrotask: [function($self, $parent, zone, f) {
+    P._scheduleAsyncCallback(C.C__RootZone !== zone ? zone.bindCallback$1(f) : f);
+  }, "call$4", "_rootScheduleMicrotask$closure", 8, 0, 38],
+  _rootCreateTimer: [function($self, $parent, zone, duration, callback) {
+    return P._createTimer(duration, C.C__RootZone !== zone ? zone.bindCallback$1(callback) : callback);
+  }, "call$5", "_rootCreateTimer$closure", 10, 0, 39, 27, 28, 29, 40, 41],
+  _rootPrint: [function($self, $parent, zone, line) {
+    H.printString(line);
+  }, "call$4", "_rootPrint$closure", 8, 0, 42],
+  _printToZone: [function(line) {
+    J.print$1$x($.Zone__current, line);
+  }, "call$1", "_printToZone$closure", 2, 0, 43],
+  _rootFork: [function($self, $parent, zone, specification, zoneValues) {
+    var copiedMap;
+    $.printToZone = P._printToZone$closure();
+    copiedMap = P.HashMap_HashMap(null, null, null, null, null);
+    return new P._CustomizedZone(zone, specification, copiedMap);
+  }, "call$5", "_rootFork$closure", 10, 0, 44],
+  _AsyncRun__scheduleImmediateJsOverride_internalCallback: {
+    "^": "Closure:69;callback_0",
+    call$0: [function() {
+      H.leaveJsAsync();
+      this.callback_0.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _AsyncError: {
+    "^": "Object;error>,stackTrace<",
+    $isError: true
+  },
+  _BroadcastStream: {
+    "^": "_ControllerStream;_async$_controller"
+  },
+  _BroadcastSubscription: {
+    "^": "_ControllerSubscription;_eventState@,_async$_next@,_async$_previous@,_async$_controller,_onData,_onError,_onDone,_zone,_state,_cancelFuture,_pending",
+    get$_async$_controller: function() {
+      return this._async$_controller;
+    },
+    _expectsEvent$1: function(eventId) {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$and();
+      return (t1 & 1) === eventId;
+    },
+    _toggleEventId$0: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$xor();
+      this._eventState = t1 ^ 1;
+    },
+    get$_isFiring: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$and();
+      return (t1 & 2) !== 0;
+    },
+    _setRemoveAfterFiring$0: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$or();
+      this._eventState = t1 | 4;
+    },
+    get$_removeAfterFiring: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$and();
+      return (t1 & 4) !== 0;
+    },
+    _onPause$0: [function() {
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+    }, "call$0", "get$_onResume", 0, 0, 18],
+    static: {"^": "_BroadcastSubscription__STATE_EVENT_ID,_BroadcastSubscription__STATE_FIRING,_BroadcastSubscription__STATE_REMOVE_AFTER_FIRING"}
+  },
+  _BroadcastStreamController: {
+    "^": "Object;_async$_next@,_async$_previous@",
+    get$isPaused: function() {
+      return false;
+    },
+    _ensureDoneFuture$0: function() {
+      var t1 = this._doneFuture;
+      if (t1 != null)
+        return t1;
+      t1 = P._Future$(null);
+      this._doneFuture = t1;
+      return t1;
+    },
+    _removeListener$1: function(subscription) {
+      var previous, next;
+      previous = subscription.get$_async$_previous();
+      next = subscription.get$_async$_next();
+      previous.set$_async$_next(next);
+      next.set$_async$_previous(previous);
+      subscription.set$_async$_previous(subscription);
+      subscription.set$_async$_next(subscription);
+    },
+    _subscribe$1: function(cancelOnError) {
+      var t1, t2, subscription;
+      if ((this._state & 4) !== 0) {
+        t1 = new P._DoneStreamSubscription($.Zone__current, 0, P._nullDoneHandler$closure());
+        t1.$builtinTypeInfo = this.$builtinTypeInfo;
+        t1._schedule$0();
+        return t1;
+      }
+      t1 = $.Zone__current;
+      t2 = cancelOnError ? 1 : 0;
+      subscription = new P._BroadcastSubscription(null, null, null, this, null, null, null, t1, t2, null, null);
+      subscription.$builtinTypeInfo = this.$builtinTypeInfo;
+      subscription._async$_previous = subscription;
+      subscription._async$_next = subscription;
+      t2 = this._async$_previous;
+      subscription._async$_previous = t2;
+      subscription._async$_next = this;
+      t2.set$_async$_next(subscription);
+      this._async$_previous = subscription;
+      subscription._eventState = this._state & 1;
+      if (this._async$_next === subscription)
+        P._runGuarded(this._onListen);
+      return subscription;
+    },
+    _recordCancel$1: function(subscription) {
+      if (subscription.get$_async$_next() === subscription)
+        return;
+      if (subscription.get$_isFiring())
+        subscription._setRemoveAfterFiring$0();
+      else {
+        this._removeListener$1(subscription);
+        if ((this._state & 2) === 0 && this._async$_next === this)
+          this._callOnCancel$0();
+      }
+    },
+    _recordPause$1: function(subscription) {
+    },
+    _recordResume$1: function(subscription) {
+    },
+    _addEventError$0: function() {
+      if ((this._state & 4) !== 0)
+        return new P.StateError("Cannot add new events after calling close");
+      return new P.StateError("Cannot add new events while doing an addStream");
+    },
+    add$1: [function(_, data) {
+      if (this._state >= 4)
+        throw H.wrapException(this._addEventError$0());
+      this._sendData$1(data);
+    }, "call$1", "get$add", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "void__T", void: true, args: [T]};
+      }, this.$receiver, "_BroadcastStreamController");
+    }, 104],
+    addError$2: [function(error, stackTrace) {
+      if (this._state >= 4)
+        throw H.wrapException(this._addEventError$0());
+      this._sendError$2(error, stackTrace);
+    }, function(error) {
+      return this.addError$2(error, null);
+    }, "addError$1", "call$2", "call$1", "get$addError", 2, 2, 105, 23, 24, 25],
+    close$0: function(_) {
+      var t1, doneFuture;
+      t1 = this._state;
+      if ((t1 & 4) !== 0)
+        return this._doneFuture;
+      if (t1 >= 4)
+        throw H.wrapException(this._addEventError$0());
+      this._state = t1 | 4;
+      doneFuture = this._ensureDoneFuture$0();
+      this._sendDone$0();
+      return doneFuture;
+    },
+    _async$_add$1: function(_, data) {
+      this._sendData$1(data);
+    },
+    _addError$2: function(error, stackTrace) {
+      this._sendError$2(error, stackTrace);
+    },
+    _close$0: function() {
+      var addState = this._addStreamState;
+      this._addStreamState = null;
+      this._state &= 4294967287;
+      C.JSNull_methods.complete$0(addState);
+    },
+    _forEachListener$1: function(action) {
+      var t1, link, id, link0;
+      t1 = this._state;
+      if ((t1 & 2) !== 0)
+        throw H.wrapException(P.StateError$("Cannot fire new event. Controller is already firing an event"));
+      link = this._async$_next;
+      if (link === this)
+        return;
+      id = t1 & 1;
+      this._state = t1 ^ 3;
+      for (; link !== this;)
+        if (link._expectsEvent$1(id)) {
+          t1 = link.get$_eventState();
+          if (typeof t1 !== "number")
+            return t1.$or();
+          link.set$_eventState(t1 | 2);
+          action.call$1(link);
+          link._toggleEventId$0();
+          link0 = link.get$_async$_next();
+          if (link.get$_removeAfterFiring())
+            this._removeListener$1(link);
+          t1 = link.get$_eventState();
+          if (typeof t1 !== "number")
+            return t1.$and();
+          link.set$_eventState(t1 & 4294967293);
+          link = link0;
+        } else
+          link = link.get$_async$_next();
+      this._state &= 4294967293;
+      if (this._async$_next === this)
+        this._callOnCancel$0();
+    },
+    _callOnCancel$0: function() {
+      if ((this._state & 4) !== 0 && this._doneFuture._state === 0)
+        this._doneFuture._asyncComplete$1(null);
+      P._runGuarded(this._onCancel);
+    }
+  },
+  _SyncBroadcastStreamController: {
+    "^": "_BroadcastStreamController;_onListen,_onCancel,_state,_async$_next,_async$_previous,_addStreamState,_doneFuture",
+    _sendData$1: function(data) {
+      var t1 = this._async$_next;
+      if (t1 === this)
+        return;
+      if (t1.get$_async$_next() === this) {
+        this._state |= 2;
+        this._async$_next._async$_add$1(0, data);
+        this._state &= 4294967293;
+        if (this._async$_next === this)
+          this._callOnCancel$0();
+        return;
+      }
+      this._forEachListener$1(new P._SyncBroadcastStreamController__sendData_closure(this, data));
+    },
+    _sendError$2: function(error, stackTrace) {
+      if (this._async$_next === this)
+        return;
+      this._forEachListener$1(new P._SyncBroadcastStreamController__sendError_closure(this, error, stackTrace));
+    },
+    _sendDone$0: function() {
+      if (this._async$_next !== this)
+        this._forEachListener$1(new P._SyncBroadcastStreamController__sendDone_closure(this));
+      else
+        this._doneFuture._asyncComplete$1(null);
+    }
+  },
+  _SyncBroadcastStreamController__sendData_closure: {
+    "^": "Closure;this_0,data_1",
+    call$1: function(subscription) {
+      subscription._async$_add$1(0, this.data_1);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic___BufferingStreamSubscription", args: [[P._BufferingStreamSubscription, T]]};
+      }, this.this_0, "_SyncBroadcastStreamController");
+    }
+  },
+  _SyncBroadcastStreamController__sendError_closure: {
+    "^": "Closure;this_0,error_1,stackTrace_2",
+    call$1: function(subscription) {
+      subscription._addError$2(this.error_1, this.stackTrace_2);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic___BufferingStreamSubscription", args: [[P._BufferingStreamSubscription, T]]};
+      }, this.this_0, "_SyncBroadcastStreamController");
+    }
+  },
+  _SyncBroadcastStreamController__sendDone_closure: {
+    "^": "Closure;this_0",
+    call$1: function(subscription) {
+      subscription._close$0();
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic___BroadcastSubscription", args: [[P._BroadcastSubscription, T]]};
+      }, this.this_0, "_SyncBroadcastStreamController");
+    }
+  },
+  _AsyncBroadcastStreamController: {
+    "^": "_BroadcastStreamController;_onListen,_onCancel,_state,_async$_next,_async$_previous,_addStreamState,_doneFuture",
+    _sendData$1: function(data) {
+      var link, t1;
+      for (link = this._async$_next; link !== this; link = link.get$_async$_next()) {
+        t1 = new P._DelayedData(data, null);
+        t1.$builtinTypeInfo = [null];
+        link._addPending$1(t1);
+      }
+    },
+    _sendError$2: function(error, stackTrace) {
+      var link;
+      for (link = this._async$_next; link !== this; link = link.get$_async$_next())
+        link._addPending$1(new P._DelayedError(error, stackTrace, null));
+    },
+    _sendDone$0: function() {
+      var link = this._async$_next;
+      if (link !== this)
+        for (; link !== this; link = link.get$_async$_next())
+          link._addPending$1(C.C__DelayedDone);
+      else
+        this._doneFuture._asyncComplete$1(null);
+    }
+  },
+  Future: {
+    "^": "Object;",
+    $isFuture: true
+  },
+  Future_Future_closure: {
+    "^": "Closure:69;computation_0,result_1",
+    call$0: [function() {
+      var e, s, exception, t1;
+      try {
+        this.result_1._complete$1(this.computation_0.call$0());
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        this.result_1._completeError$2(e, s);
+      }
+
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Future_wait_handleError: {
+    "^": "Closure:75;box_0,eagerError_1",
+    call$2: [function(theError, theStackTrace) {
+      var t1, t2, t3;
+      t1 = this.box_0;
+      t2 = t1.values_1;
+      t1.values_1 = null;
+      t3 = --t1.remaining_2;
+      if (t2 != null)
+        if (t3 === 0 || this.eagerError_1)
+          t1.completer_0.completeError$2(theError, theStackTrace);
+        else {
+          t1.error_3 = theError;
+          t1.stackTrace_4 = theStackTrace;
+        }
+      else if (t3 === 0 && !this.eagerError_1)
+        t1.completer_0.completeError$2(t1.error_3, t1.stackTrace_4);
+    }, "call$2", null, 4, 0, null, 106, 107, "call"],
+    $isFunction: true
+  },
+  Future_wait_closure: {
+    "^": "Closure:108;box_0,eagerError_2,pos_3",
+    call$1: [function(value) {
+      var t1, t2, t3, t4;
+      t1 = this.box_0;
+      t2 = --t1.remaining_2;
+      t3 = t1.values_1;
+      if (t3 != null) {
+        t4 = this.pos_3;
+        if (t4 < 0 || t4 >= t3.length)
+          return H.ioore(t3, t4);
+        t3[t4] = value;
+        if (t2 === 0) {
+          t1 = t1.completer_0.future;
+          if (t1._state !== 0)
+            H.throwExpression(P.StateError$("Future already completed"));
+          t1._asyncComplete$1(t3);
+        }
+      } else if (t2 === 0 && !this.eagerError_2)
+        t1.completer_0.completeError$2(t1.error_3, t1.stackTrace_4);
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true
+  },
+  Completer: {
+    "^": "Object;",
+    $isCompleter: true
+  },
+  _Completer: {
+    "^": "Object;",
+    $isCompleter: true
+  },
+  _AsyncCompleter: {
+    "^": "_Completer;future",
+    complete$1: [function(_, value) {
+      var t1 = this.future;
+      if (t1._state !== 0)
+        throw H.wrapException(P.StateError$("Future already completed"));
+      t1._asyncComplete$1(value);
+    }, function($receiver) {
+      return this.complete$1($receiver, null);
+    }, "complete$0", "call$1", "call$0", "get$complete", 0, 2, 109, 23, 21],
+    completeError$2: [function(error, stackTrace) {
+      var t1;
+      if (error == null)
+        throw H.wrapException(P.ArgumentError$("Error must not be null"));
+      t1 = this.future;
+      if (t1._state !== 0)
+        throw H.wrapException(P.StateError$("Future already completed"));
+      t1._asyncCompleteError$2(error, stackTrace);
+    }, function(error) {
+      return this.completeError$2(error, null);
+    }, "completeError$1", "call$2", "call$1", "get$completeError", 2, 2, 105, 23, 24, 25]
+  },
+  _Future: {
+    "^": "Object;_state,_zone<,_resultOrListeners,_nextListener@,_onValueCallback,_errorTestCallback,_onErrorCallback,_whenCompleteActionCallback",
+    get$_isComplete: function() {
+      return this._state >= 4;
+    },
+    get$_hasValue: function() {
+      return this._state === 4;
+    },
+    get$_hasError: function() {
+      return this._state === 8;
+    },
+    set$_isChained: function(value) {
+      if (value)
+        this._state = 2;
+      else
+        this._state = 0;
+    },
+    get$_onValue: function() {
+      return this._state === 2 ? null : this._onValueCallback;
+    },
+    get$_errorTest: function() {
+      return this._state === 2 ? null : this._errorTestCallback;
+    },
+    get$_onError: function() {
+      return this._state === 2 ? null : this._onErrorCallback;
+    },
+    get$_whenCompleteAction: function() {
+      return this._state === 2 ? null : this._whenCompleteActionCallback;
+    },
+    then$2$onError: function(f, onError) {
+      var t1, result;
+      t1 = $.Zone__current;
+      result = H.setRuntimeTypeInfo(new P._Future(0, t1, null, null, t1.registerUnaryCallback$1(f), null, P._registerErrorHandler(onError, $.Zone__current), null), [null]);
+      this._addListener$1(result);
+      return result;
+    },
+    then$1: function(f) {
+      return this.then$2$onError(f, null);
+    },
+    catchError$2$test: function(onError, test) {
+      var t1, t2, result;
+      t1 = $.Zone__current;
+      t2 = P._registerErrorHandler(onError, t1);
+      result = H.setRuntimeTypeInfo(new P._Future(0, t1, null, null, null, $.Zone__current.registerUnaryCallback$1(test), t2, null), [null]);
+      this._addListener$1(result);
+      return result;
+    },
+    catchError$1: function(onError) {
+      return this.catchError$2$test(onError, null);
+    },
+    whenComplete$1: function(action) {
+      var t1, result;
+      t1 = $.Zone__current;
+      result = new P._Future(0, t1, null, null, null, null, null, t1.registerCallback$1(action));
+      result.$builtinTypeInfo = this.$builtinTypeInfo;
+      this._addListener$1(result);
+      return result;
+    },
+    get$_async$_value: function() {
+      return this._resultOrListeners;
+    },
+    get$_error: function() {
+      return this._resultOrListeners;
+    },
+    _setValue$1: function(value) {
+      this._state = 4;
+      this._resultOrListeners = value;
+    },
+    _setError$2: function(error, stackTrace) {
+      this._state = 8;
+      this._resultOrListeners = new P._AsyncError(error, stackTrace);
+    },
+    _addListener$1: function(listener) {
+      if (this._state >= 4)
+        this._zone.scheduleMicrotask$1(new P._Future__addListener_closure(this, listener));
+      else {
+        listener.set$_nextListener(this._resultOrListeners);
+        this._resultOrListeners = listener;
+      }
+    },
+    _removeListeners$0: function() {
+      var current, prev, next;
+      current = this._resultOrListeners;
+      this._resultOrListeners = null;
+      for (prev = null; current != null; prev = current, current = next) {
+        next = current.get$_nextListener();
+        current.set$_nextListener(prev);
+      }
+      return prev;
+    },
+    _complete$1: function(value) {
+      var t1, listeners;
+      t1 = J.getInterceptor(value);
+      if (!!t1.$isFuture)
+        if (!!t1.$is_Future)
+          P._Future__chainCoreFuture(value, this);
+        else
+          P._Future__chainForeignFuture(value, this);
+      else {
+        listeners = this._removeListeners$0();
+        this._setValue$1(value);
+        P._Future__propagateToListeners(this, listeners);
+      }
+    },
+    _completeWithValue$1: function(value) {
+      var listeners = this._removeListeners$0();
+      this._setValue$1(value);
+      P._Future__propagateToListeners(this, listeners);
+    },
+    _completeError$2: [function(error, stackTrace) {
+      var listeners = this._removeListeners$0();
+      this._setError$2(error, stackTrace);
+      P._Future__propagateToListeners(this, listeners);
+    }, function(error) {
+      return this._completeError$2(error, null);
+    }, "_completeError$1", "call$2", "call$1", "get$_completeError", 2, 2, 22, 23, 24, 25],
+    _asyncComplete$1: function(value) {
+      var t1;
+      if (value == null)
+        ;
+      else {
+        t1 = J.getInterceptor(value);
+        if (!!t1.$isFuture) {
+          if (!!t1.$is_Future) {
+            t1 = value._state;
+            if (t1 >= 4 && t1 === 8) {
+              if (this._state !== 0)
+                H.throwExpression(P.StateError$("Future already completed"));
+              this._state = 1;
+              this._zone.scheduleMicrotask$1(new P._Future__asyncComplete_closure(this, value));
+            } else
+              P._Future__chainCoreFuture(value, this);
+          } else
+            P._Future__chainForeignFuture(value, this);
+          return;
+        }
+      }
+      if (this._state !== 0)
+        H.throwExpression(P.StateError$("Future already completed"));
+      this._state = 1;
+      this._zone.scheduleMicrotask$1(new P._Future__asyncComplete_closure0(this, value));
+    },
+    _asyncCompleteError$2: function(error, stackTrace) {
+      if (this._state !== 0)
+        H.throwExpression(P.StateError$("Future already completed"));
+      this._state = 1;
+      this._zone.scheduleMicrotask$1(new P._Future__asyncCompleteError_closure(this, error, stackTrace));
+    },
+    _async$_Future$immediate$1: function(value, $T) {
+      this._asyncComplete$1(value);
+    },
+    _async$_Future$immediateError$2: function(error, stackTrace, $T) {
+      this._asyncCompleteError$2(error, stackTrace);
+    },
+    $is_Future: true,
+    $isFuture: true,
+    static: {"^": "_Future__INCOMPLETE,_Future__PENDING_COMPLETE,_Future__CHAINED,_Future__VALUE,_Future__ERROR", _Future$: function($T) {
+        return H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null, null, null, null, null, null), [$T]);
+      }, _Future$immediate: function(value, $T) {
+        var t1 = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null, null, null, null, null, null), [$T]);
+        t1._async$_Future$immediate$1(value, $T);
+        return t1;
+      }, _Future$immediateError: function(error, stackTrace, $T) {
+        var t1 = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null, null, null, null, null, null), [$T]);
+        t1._async$_Future$immediateError$2(error, stackTrace, $T);
+        return t1;
+      }, _Future__chainForeignFuture: function(source, target) {
+        target.set$_isChained(true);
+        source.then$2$onError(new P._Future__chainForeignFuture_closure(target), new P._Future__chainForeignFuture_closure0(target));
+      }, _Future__chainCoreFuture: function(source, target) {
+        target.set$_isChained(true);
+        if (source._state >= 4)
+          P._Future__propagateToListeners(source, target);
+        else
+          source._addListener$1(target);
+      }, _Future__propagateMultipleListeners: function(source, listeners) {
+        var listeners0;
+        do {
+          listeners0 = listeners.get$_nextListener();
+          listeners.set$_nextListener(null);
+          P._Future__propagateToListeners(source, listeners);
+          if (listeners0 != null) {
+            listeners = listeners0;
+            continue;
+          } else
+            break;
+        } while (true);
+      }, _Future__propagateToListeners: function(source, listeners) {
+        var t1, t2, t3, hasError, asyncError, sourceValue, zone, oldZone, chainSource, listeners0;
+        t1 = {};
+        t1.source_4 = source;
+        for (t2 = source; true;) {
+          t3 = {};
+          if (!t2.get$_isComplete())
+            return;
+          hasError = t1.source_4.get$_hasError();
+          if (hasError && listeners == null) {
+            asyncError = t1.source_4.get$_error();
+            t1.source_4.get$_zone().handleUncaughtError$2(J.get$error$x(asyncError), asyncError.get$stackTrace());
+            return;
+          }
+          if (listeners == null)
+            return;
+          if (listeners.get$_nextListener() != null) {
+            P._Future__propagateMultipleListeners(t1.source_4, listeners);
+            return;
+          }
+          t3.listenerHasValue_1 = true;
+          sourceValue = t1.source_4.get$_hasValue() ? t1.source_4.get$_async$_value() : null;
+          t3.listenerValueOrError_2 = sourceValue;
+          t3.isPropagationAborted_3 = false;
+          t2 = !hasError;
+          if (!t2 || listeners.get$_onValue() != null || listeners.get$_whenCompleteAction() != null) {
+            zone = listeners.get$_zone();
+            if (hasError && !t1.source_4.get$_zone().inSameErrorZone$1(zone)) {
+              asyncError = t1.source_4.get$_error();
+              t1.source_4.get$_zone().handleUncaughtError$2(J.get$error$x(asyncError), asyncError.get$stackTrace());
+              return;
+            }
+            oldZone = $.Zone__current;
+            if (oldZone == null ? zone != null : oldZone !== zone)
+              $.Zone__current = zone;
+            else
+              oldZone = null;
+            if (t2) {
+              if (listeners.get$_onValue() != null)
+                t3.listenerHasValue_1 = new P._Future__propagateToListeners_handleValueCallback(t3, listeners, sourceValue, zone).call$0();
+            } else
+              new P._Future__propagateToListeners_handleError(t1, t3, listeners, zone).call$0();
+            if (listeners.get$_whenCompleteAction() != null)
+              new P._Future__propagateToListeners_handleWhenCompleteCallback(t1, t3, hasError, listeners, zone).call$0();
+            if (oldZone != null)
+              $.Zone__current = oldZone;
+            if (t3.isPropagationAborted_3)
+              return;
+            if (t3.listenerHasValue_1 === true) {
+              t2 = t3.listenerValueOrError_2;
+              t2 = (sourceValue == null ? t2 != null : sourceValue !== t2) && !!J.getInterceptor(t2).$isFuture;
+            } else
+              t2 = false;
+            if (t2) {
+              chainSource = t3.listenerValueOrError_2;
+              if (!!J.getInterceptor(chainSource).$is_Future)
+                if (chainSource._state >= 4) {
+                  listeners.set$_isChained(true);
+                  t1.source_4 = chainSource;
+                  t2 = chainSource;
+                  continue;
+                } else
+                  P._Future__chainCoreFuture(chainSource, listeners);
+              else
+                P._Future__chainForeignFuture(chainSource, listeners);
+              return;
+            }
+          }
+          if (t3.listenerHasValue_1 === true) {
+            listeners0 = listeners._removeListeners$0();
+            listeners._setValue$1(t3.listenerValueOrError_2);
+          } else {
+            listeners0 = listeners._removeListeners$0();
+            asyncError = t3.listenerValueOrError_2;
+            listeners._setError$2(J.get$error$x(asyncError), asyncError.get$stackTrace());
+          }
+          t1.source_4 = listeners;
+          t2 = listeners;
+          listeners = listeners0;
+        }
+      }}
+  },
+  _Future__addListener_closure: {
+    "^": "Closure:69;this_0,listener_1",
+    call$0: [function() {
+      P._Future__propagateToListeners(this.this_0, this.listener_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__chainForeignFuture_closure: {
+    "^": "Closure:13;target_0",
+    call$1: [function(value) {
+      this.target_0._completeWithValue$1(value);
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true
+  },
+  _Future__chainForeignFuture_closure0: {
+    "^": "Closure:110;target_1",
+    call$2: [function(error, stackTrace) {
+      this.target_1._completeError$2(error, stackTrace);
+    }, function(error) {
+      return this.call$2(error, null);
+    }, "call$1", "call$2", null, null, 2, 2, null, 23, 24, 25, "call"],
+    $isFunction: true
+  },
+  _Future__asyncComplete_closure: {
+    "^": "Closure:69;this_0,coreFuture_1",
+    call$0: [function() {
+      P._Future__chainCoreFuture(this.coreFuture_1, this.this_0);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__asyncComplete_closure0: {
+    "^": "Closure:69;this_2,value_3",
+    call$0: [function() {
+      this.this_2._completeWithValue$1(this.value_3);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__asyncCompleteError_closure: {
+    "^": "Closure:69;this_0,error_1,stackTrace_2",
+    call$0: [function() {
+      this.this_0._completeError$2(this.error_1, this.stackTrace_2);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleValueCallback: {
+    "^": "Closure:111;box_1,listener_3,sourceValue_4,zone_5",
+    call$0: function() {
+      var e, s, exception, t1;
+      try {
+        this.box_1.listenerValueOrError_2 = this.zone_5.runUnary$2(this.listener_3.get$_onValue(), this.sourceValue_4);
+        return true;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        this.box_1.listenerValueOrError_2 = new P._AsyncError(e, s);
+        return false;
+      }
+
+    },
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleError: {
+    "^": "Closure:18;box_2,box_1,listener_6,zone_7",
+    call$0: function() {
+      var asyncError, test, matchesTest, e, s, errorCallback, e0, s0, t1, exception, t2, listenerValueOrError, t3, t4;
+      asyncError = this.box_2.source_4.get$_error();
+      t1 = this.listener_6;
+      test = t1.get$_errorTest();
+      matchesTest = true;
+      if (test != null)
+        try {
+          matchesTest = this.zone_7.runUnary$2(test, J.get$error$x(asyncError));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          s = new H._StackTrace(exception, null);
+          t1 = J.get$error$x(asyncError);
+          t2 = e;
+          listenerValueOrError = (t1 == null ? t2 == null : t1 === t2) ? asyncError : new P._AsyncError(e, s);
+          t1 = this.box_1;
+          t1.listenerValueOrError_2 = listenerValueOrError;
+          t1.listenerHasValue_1 = false;
+          return;
+        }
+
+      errorCallback = t1.get$_onError();
+      if (matchesTest === true && errorCallback != null) {
+        try {
+          t1 = errorCallback;
+          t2 = H.getDynamicRuntimeType();
+          t2 = H.buildFunctionType(t2, [t2, t2])._isTest$1(t1);
+          t3 = this.zone_7;
+          t4 = this.box_1;
+          if (t2)
+            t4.listenerValueOrError_2 = t3.runBinary$3(errorCallback, J.get$error$x(asyncError), asyncError.get$stackTrace());
+          else
+            t4.listenerValueOrError_2 = t3.runUnary$2(errorCallback, J.get$error$x(asyncError));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          s0 = new H._StackTrace(exception, null);
+          t1 = J.get$error$x(asyncError);
+          t2 = e0;
+          listenerValueOrError = (t1 == null ? t2 == null : t1 === t2) ? asyncError : new P._AsyncError(e0, s0);
+          t1 = this.box_1;
+          t1.listenerValueOrError_2 = listenerValueOrError;
+          t1.listenerHasValue_1 = false;
+          return;
+        }
+
+        this.box_1.listenerHasValue_1 = true;
+      } else {
+        t1 = this.box_1;
+        t1.listenerValueOrError_2 = asyncError;
+        t1.listenerHasValue_1 = false;
+      }
+    },
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback: {
+    "^": "Closure:18;box_2,box_1,hasError_8,listener_9,zone_10",
+    call$0: function() {
+      var t1, e, s, exception, t2, t3;
+      t1 = {};
+      t1.completeResult_0 = null;
+      try {
+        t1.completeResult_0 = this.zone_10.run$1(this.listener_9.get$_whenCompleteAction());
+      } catch (exception) {
+        t2 = H.unwrapException(exception);
+        e = t2;
+        s = new H._StackTrace(exception, null);
+        if (this.hasError_8) {
+          t2 = J.get$error$x(this.box_2.source_4.get$_error());
+          t3 = e;
+          t3 = t2 == null ? t3 == null : t2 === t3;
+          t2 = t3;
+        } else
+          t2 = false;
+        t3 = this.box_1;
+        if (t2)
+          t3.listenerValueOrError_2 = this.box_2.source_4.get$_error();
+        else
+          t3.listenerValueOrError_2 = new P._AsyncError(e, s);
+        t3.listenerHasValue_1 = false;
+      }
+
+      if (!!J.getInterceptor(t1.completeResult_0).$isFuture) {
+        t2 = this.listener_9;
+        t2.set$_isChained(true);
+        this.box_1.isPropagationAborted_3 = true;
+        t1.completeResult_0.then$2$onError(new P._Future__propagateToListeners_handleWhenCompleteCallback_closure(this.box_2, t2), new P._Future__propagateToListeners_handleWhenCompleteCallback_closure0(t1, t2));
+      }
+    },
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback_closure: {
+    "^": "Closure:13;box_2,listener_11",
+    call$1: [function(ignored) {
+      P._Future__propagateToListeners(this.box_2.source_4, this.listener_11);
+    }, "call$1", null, 2, 0, null, 112, "call"],
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback_closure0: {
+    "^": "Closure:110;box_0,listener_12",
+    call$2: [function(error, stackTrace) {
+      var t1, completeResult;
+      t1 = this.box_0;
+      if (!J.getInterceptor(t1.completeResult_0).$is_Future) {
+        completeResult = P._Future$(null);
+        t1.completeResult_0 = completeResult;
+        completeResult._setError$2(error, stackTrace);
+      }
+      P._Future__propagateToListeners(t1.completeResult_0, this.listener_12);
+    }, function(error) {
+      return this.call$2(error, null);
+    }, "call$1", "call$2", null, null, 2, 2, null, 23, 24, 25, "call"],
+    $isFunction: true
+  },
+  _AsyncCallbackEntry: {
+    "^": "Object;callback>,next@",
+    callback$0: function($receiver) {
+      return this.callback.call$0();
+    }
+  },
+  Stream: {
+    "^": "Object;",
+    map$1: [function(_, convert) {
+      return H.setRuntimeTypeInfo(new P._MapStream(convert, this), [H.getRuntimeTypeArgument(this, "Stream", 0), null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "Stream__dynamic__T", ret: P.Stream, args: [{func: "dynamic__T", args: [T]}]};
+      }, this.$receiver, "Stream");
+    }, 113],
+    expand$1: [function(_, convert) {
+      return H.setRuntimeTypeInfo(new P._ExpandStream(convert, this), [H.getRuntimeTypeArgument(this, "Stream", 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "Stream__Iterable__T", ret: P.Stream, args: [{func: "Iterable__T", ret: P.Iterable, args: [T]}]};
+      }, this.$receiver, "Stream");
+    }, 113],
+    contains$1: function(_, needle) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.bool);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_contains_closure(t1, this, needle, future), true, new P.Stream_contains_closure0(future), future.get$_completeError());
+      return future;
+    },
+    forEach$1: function(_, action) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(null);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_forEach_closure(t1, this, action, future), true, new P.Stream_forEach_closure0(future), future.get$_completeError());
+      return future;
+    },
+    any$1: function(_, test) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.bool);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_any_closure(t1, this, test, future), true, new P.Stream_any_closure0(future), future.get$_completeError());
+      return future;
+    },
+    get$length: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.$int);
+      t1.count_0 = 0;
+      this.listen$4$cancelOnError$onDone$onError(new P.Stream_length_closure(t1), true, new P.Stream_length_closure0(t1, future), future.get$_completeError());
+      return future;
+    },
+    get$isEmpty: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.bool);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_isEmpty_closure(t1, future), true, new P.Stream_isEmpty_closure0(future), future.get$_completeError());
+      return future;
+    },
+    get$first: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(H.getRuntimeTypeArgument(this, "Stream", 0));
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_first_closure(t1, this, future), true, new P.Stream_first_closure0(future), future.get$_completeError());
+      return future;
+    },
+    get$last: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(H.getRuntimeTypeArgument(this, "Stream", 0));
+      t1.result_0 = null;
+      t1.foundResult_1 = false;
+      this.listen$4$cancelOnError$onDone$onError(new P.Stream_last_closure(t1, this), true, new P.Stream_last_closure0(t1, future), future.get$_completeError());
+      return future;
+    },
+    $isStream: true
+  },
+  Stream_contains_closure: {
+    "^": "Closure;box_0,this_1,needle_2,future_3",
+    call$1: [function(element) {
+      var t1, t2;
+      t1 = this.box_0;
+      t2 = this.future_3;
+      P._runUserCode(new P.Stream_contains__closure(this.needle_2, element), new P.Stream_contains__closure0(t1, t2), P._cancelAndErrorClosure(t1.subscription_0, t2));
+    }, "call$1", null, 2, 0, null, 114, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_contains__closure: {
+    "^": "Closure:69;needle_4,element_5",
+    call$0: function() {
+      return J.$eq(this.element_5, this.needle_4);
+    },
+    $isFunction: true
+  },
+  Stream_contains__closure0: {
+    "^": "Closure:115;box_0,future_6",
+    call$1: function(isMatch) {
+      if (isMatch === true)
+        P._cancelAndValue(this.box_0.subscription_0, this.future_6, true);
+    },
+    $isFunction: true
+  },
+  Stream_contains_closure0: {
+    "^": "Closure:69;future_7",
+    call$0: [function() {
+      this.future_7._complete$1(false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_forEach_closure: {
+    "^": "Closure;box_0,this_1,action_2,future_3",
+    call$1: [function(element) {
+      P._runUserCode(new P.Stream_forEach__closure(this.action_2, element), new P.Stream_forEach__closure0(), P._cancelAndErrorClosure(this.box_0.subscription_0, this.future_3));
+    }, "call$1", null, 2, 0, null, 114, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_forEach__closure: {
+    "^": "Closure:69;action_4,element_5",
+    call$0: function() {
+      return this.action_4.call$1(this.element_5);
+    },
+    $isFunction: true
+  },
+  Stream_forEach__closure0: {
+    "^": "Closure:13;",
+    call$1: function(_) {
+    },
+    $isFunction: true
+  },
+  Stream_forEach_closure0: {
+    "^": "Closure:69;future_6",
+    call$0: [function() {
+      this.future_6._complete$1(null);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_any_closure: {
+    "^": "Closure;box_0,this_1,test_2,future_3",
+    call$1: [function(element) {
+      var t1, t2;
+      t1 = this.box_0;
+      t2 = this.future_3;
+      P._runUserCode(new P.Stream_any__closure(this.test_2, element), new P.Stream_any__closure0(t1, t2), P._cancelAndErrorClosure(t1.subscription_0, t2));
+    }, "call$1", null, 2, 0, null, 114, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_any__closure: {
+    "^": "Closure:69;test_4,element_5",
+    call$0: function() {
+      return this.test_4.call$1(this.element_5);
+    },
+    $isFunction: true
+  },
+  Stream_any__closure0: {
+    "^": "Closure:115;box_0,future_6",
+    call$1: function(isMatch) {
+      if (isMatch === true)
+        P._cancelAndValue(this.box_0.subscription_0, this.future_6, true);
+    },
+    $isFunction: true
+  },
+  Stream_any_closure0: {
+    "^": "Closure:69;future_7",
+    call$0: [function() {
+      this.future_7._complete$1(false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_length_closure: {
+    "^": "Closure:13;box_0",
+    call$1: [function(_) {
+      ++this.box_0.count_0;
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  Stream_length_closure0: {
+    "^": "Closure:69;box_0,future_1",
+    call$0: [function() {
+      this.future_1._complete$1(this.box_0.count_0);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_isEmpty_closure: {
+    "^": "Closure:13;box_0,future_1",
+    call$1: [function(_) {
+      P._cancelAndValue(this.box_0.subscription_0, this.future_1, false);
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  Stream_isEmpty_closure0: {
+    "^": "Closure:69;future_2",
+    call$0: [function() {
+      this.future_2._complete$1(true);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_first_closure: {
+    "^": "Closure;box_0,this_1,future_2",
+    call$1: [function(value) {
+      P._cancelAndValue(this.box_0.subscription_0, this.future_2, value);
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_first_closure0: {
+    "^": "Closure:69;future_3",
+    call$0: [function() {
+      this.future_3._completeError$1(new P.StateError("No elements"));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_last_closure: {
+    "^": "Closure;box_0,this_1",
+    call$1: [function(value) {
+      var t1 = this.box_0;
+      t1.foundResult_1 = true;
+      t1.result_0 = value;
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_last_closure0: {
+    "^": "Closure:69;box_0,future_2",
+    call$0: [function() {
+      var t1 = this.box_0;
+      if (t1.foundResult_1) {
+        this.future_2._complete$1(t1.result_0);
+        return;
+      }
+      this.future_2._completeError$1(new P.StateError("No elements"));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  StreamSubscription: {
+    "^": "Object;",
+    $isStreamSubscription: true
+  },
+  _StreamController: {
+    "^": "Object;",
+    get$isPaused: function() {
+      var t1 = this._state;
+      return (t1 & 1) !== 0 ? this.get$_subscription().get$_isInputPaused() : (t1 & 2) === 0;
+    },
+    get$_pendingEvents: function() {
+      if ((this._state & 8) === 0)
+        return this._varData;
+      return this._varData.get$varData();
+    },
+    _ensurePendingEvents$0: function() {
+      var t1, state;
+      if ((this._state & 8) === 0) {
+        t1 = this._varData;
+        if (t1 == null) {
+          t1 = new P._StreamImplEvents(null, null, 0);
+          this._varData = t1;
+        }
+        return t1;
+      }
+      state = this._varData;
+      state.get$varData();
+      return state.get$varData();
+    },
+    get$_subscription: function() {
+      if ((this._state & 8) !== 0)
+        return this._varData.get$varData();
+      return this._varData;
+    },
+    _badEventState$0: function() {
+      if ((this._state & 4) !== 0)
+        return new P.StateError("Cannot add event after closing");
+      return new P.StateError("Cannot add event while adding a stream");
+    },
+    _ensureDoneFuture$0: function() {
+      var t1 = this._doneFuture;
+      if (t1 == null) {
+        t1 = (this._state & 2) !== 0 ? $.get$Future__nullFuture() : P._Future$(null);
+        this._doneFuture = t1;
+      }
+      return t1;
+    },
+    add$1: [function(_, value) {
+      var t1 = this._state;
+      if (t1 >= 4)
+        throw H.wrapException(this._badEventState$0());
+      if ((t1 & 1) !== 0)
+        this._sendData$1(value);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, H.setRuntimeTypeInfo(new P._DelayedData(value, null), [H.getRuntimeTypeArgument(this, "_StreamController", 0)]));
+    }, "call$1", "get$add", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "void__T0", void: true, args: [T]};
+      }, this.$receiver, "_StreamController");
+    }],
+    close$0: function(_) {
+      var t1 = this._state;
+      if ((t1 & 4) !== 0)
+        return this._ensureDoneFuture$0();
+      if (t1 >= 4)
+        throw H.wrapException(this._badEventState$0());
+      t1 |= 4;
+      this._state = t1;
+      if ((t1 & 1) !== 0)
+        this._sendDone$0();
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, C.C__DelayedDone);
+      return this._ensureDoneFuture$0();
+    },
+    _async$_add$1: function(_, value) {
+      var t1 = this._state;
+      if ((t1 & 1) !== 0)
+        this._sendData$1(value);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, H.setRuntimeTypeInfo(new P._DelayedData(value, null), [H.getRuntimeTypeArgument(this, "_StreamController", 0)]));
+    },
+    _addError$2: function(error, stackTrace) {
+      var t1 = this._state;
+      if ((t1 & 1) !== 0)
+        this._sendError$2(error, stackTrace);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, new P._DelayedError(error, stackTrace, null));
+    },
+    _subscribe$1: function(cancelOnError) {
+      var t1, t2, subscription, pendingEvents, addState;
+      if ((this._state & 3) !== 0)
+        throw H.wrapException(P.StateError$("Stream has already been listened to."));
+      t1 = $.Zone__current;
+      t2 = cancelOnError ? 1 : 0;
+      subscription = H.setRuntimeTypeInfo(new P._ControllerSubscription(this, null, null, null, t1, t2, null, null), [null]);
+      pendingEvents = this.get$_pendingEvents();
+      t2 = this._state |= 1;
+      if ((t2 & 8) !== 0) {
+        addState = this._varData;
+        addState.set$varData(subscription);
+        addState.resume$0(0);
+      } else
+        this._varData = subscription;
+      subscription._setPendingEvents$1(pendingEvents);
+      subscription._guardCallback$1(new P._StreamController__subscribe_closure(this));
+      return subscription;
+    },
+    _recordCancel$1: function(subscription) {
+      var result, e, s, exception, t1, result0;
+      result = null;
+      if ((this._state & 8) !== 0)
+        result = this._varData.cancel$0();
+      this._varData = null;
+      this._state = this._state & 4294967286 | 2;
+      if (this.get$_onCancel() != null)
+        if (result == null)
+          try {
+            result = this._onCancel$0();
+          } catch (exception) {
+            t1 = H.unwrapException(exception);
+            e = t1;
+            s = new H._StackTrace(exception, null);
+            result0 = P._Future$(null);
+            result0._asyncCompleteError$2(e, s);
+            result = result0;
+          }
+
+        else
+          result = result.whenComplete$1(this.get$_onCancel());
+      t1 = new P._StreamController__recordCancel_complete(this);
+      if (result != null)
+        result = result.whenComplete$1(t1);
+      else
+        t1.call$0();
+      return result;
+    },
+    _recordPause$1: function(subscription) {
+      if ((this._state & 8) !== 0)
+        this._varData.pause$0(0);
+      P._runGuarded(this.get$_onPause());
+    },
+    _recordResume$1: function(subscription) {
+      if ((this._state & 8) !== 0)
+        this._varData.resume$0(0);
+      P._runGuarded(this.get$_onResume());
+    }
+  },
+  _StreamController__subscribe_closure: {
+    "^": "Closure:69;this_0",
+    call$0: function() {
+      P._runGuarded(this.this_0.get$_onListen());
+    },
+    $isFunction: true
+  },
+  _StreamController__recordCancel_complete: {
+    "^": "Closure:18;this_0",
+    call$0: [function() {
+      var t1 = this.this_0._doneFuture;
+      if (t1 != null && t1._state === 0)
+        t1._asyncComplete$1(null);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _SyncStreamControllerDispatch: {
+    "^": "Object;",
+    _sendData$1: function(data) {
+      this.get$_subscription()._async$_add$1(0, data);
+    },
+    _sendError$2: function(error, stackTrace) {
+      this.get$_subscription()._addError$2(error, stackTrace);
+    },
+    _sendDone$0: function() {
+      this.get$_subscription()._close$0();
+    }
+  },
+  _AsyncStreamControllerDispatch: {
+    "^": "Object;",
+    _sendData$1: function(data) {
+      this.get$_subscription()._addPending$1(H.setRuntimeTypeInfo(new P._DelayedData(data, null), [null]));
+    },
+    _sendError$2: function(error, stackTrace) {
+      this.get$_subscription()._addPending$1(new P._DelayedError(error, stackTrace, null));
+    },
+    _sendDone$0: function() {
+      this.get$_subscription()._addPending$1(C.C__DelayedDone);
+    }
+  },
+  _AsyncStreamController: {
+    "^": "_StreamController__AsyncStreamControllerDispatch;_onListen<,_onPause<,_onResume<,_onCancel<,_varData,_state,_doneFuture",
+    _onCancel$0: function() {
+      return this._onCancel.call$0();
+    }
+  },
+  _StreamController__AsyncStreamControllerDispatch: {
+    "^": "_StreamController+_AsyncStreamControllerDispatch;"
+  },
+  _SyncStreamController: {
+    "^": "_StreamController__SyncStreamControllerDispatch;_onListen<,_onPause<,_onResume<,_onCancel<,_varData,_state,_doneFuture",
+    _onCancel$0: function() {
+      return this._onCancel.call$0();
+    }
+  },
+  _StreamController__SyncStreamControllerDispatch: {
+    "^": "_StreamController+_SyncStreamControllerDispatch;"
+  },
+  _ControllerStream: {
+    "^": "_StreamImpl;_async$_controller",
+    _createSubscription$1: function(cancelOnError) {
+      return this._async$_controller._subscribe$1(cancelOnError);
+    },
+    get$hashCode: function(_) {
+      return (H.Primitives_objectHashCode(this._async$_controller) ^ 892482866) >>> 0;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!J.getInterceptor(other).$is_ControllerStream)
+        return false;
+      return other._async$_controller === this._async$_controller;
+    },
+    $is_ControllerStream: true
+  },
+  _ControllerSubscription: {
+    "^": "_BufferingStreamSubscription;_async$_controller<,_onData,_onError,_onDone,_zone,_state,_cancelFuture,_pending",
+    _onCancel$0: function() {
+      return this.get$_async$_controller()._recordCancel$1(this);
+    },
+    _onPause$0: [function() {
+      this.get$_async$_controller()._recordPause$1(this);
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+      this.get$_async$_controller()._recordResume$1(this);
+    }, "call$0", "get$_onResume", 0, 0, 18]
+  },
+  _EventSink: {
+    "^": "Object;"
+  },
+  _BufferingStreamSubscription: {
+    "^": "Object;_onData,_onError<,_onDone,_zone<,_state,_cancelFuture,_pending",
+    _setPendingEvents$1: function(pendingEvents) {
+      if (pendingEvents == null)
+        return;
+      this._pending = pendingEvents;
+      if (!pendingEvents.get$isEmpty(pendingEvents)) {
+        this._state = (this._state | 64) >>> 0;
+        this._pending.schedule$1(this);
+      }
+    },
+    onData$1: function(handleData) {
+      this._onData = this._zone.registerUnaryCallback$1(handleData);
+    },
+    onError$1: function(_, handleError) {
+      if (handleError == null)
+        handleError = P._nullErrorHandler$closure();
+      this._onError = P._registerErrorHandler(handleError, this._zone);
+    },
+    onDone$1: function(handleDone) {
+      if (handleDone == null)
+        handleDone = P._nullDoneHandler$closure();
+      this._onDone = this._zone.registerCallback$1(handleDone);
+    },
+    pause$1: [function(_, resumeSignal) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      this._state = (t1 + 128 | 4) >>> 0;
+      if (resumeSignal != null)
+        resumeSignal.whenComplete$1(this.get$resume(this));
+      if (t1 < 128 && this._pending != null)
+        this._pending.cancelSchedule$0();
+      if ((t1 & 4) === 0 && (this._state & 32) === 0)
+        this._guardCallback$1(this.get$_onPause());
+    }, function($receiver) {
+      return this.pause$1($receiver, null);
+    }, "pause$0", "call$1", "call$0", "get$pause", 0, 2, 116, 23, 117],
+    resume$0: [function(_) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 >= 128) {
+        t1 -= 128;
+        this._state = t1;
+        if (t1 < 128) {
+          if ((t1 & 64) !== 0) {
+            t1 = this._pending;
+            t1 = !t1.get$isEmpty(t1);
+          } else
+            t1 = false;
+          if (t1)
+            this._pending.schedule$1(this);
+          else {
+            t1 = (this._state & 4294967291) >>> 0;
+            this._state = t1;
+            if ((t1 & 32) === 0)
+              this._guardCallback$1(this.get$_onResume());
+          }
+        }
+      }
+    }, "call$0", "get$resume", 0, 0, 18],
+    cancel$0: function() {
+      var t1 = (this._state & 4294967279) >>> 0;
+      this._state = t1;
+      if ((t1 & 8) !== 0)
+        return this._cancelFuture;
+      this._cancel$0();
+      return this._cancelFuture;
+    },
+    get$_isInputPaused: function() {
+      return (this._state & 4) !== 0;
+    },
+    get$isPaused: function() {
+      return this._state >= 128;
+    },
+    _cancel$0: function() {
+      var t1 = (this._state | 8) >>> 0;
+      this._state = t1;
+      if ((t1 & 64) !== 0)
+        this._pending.cancelSchedule$0();
+      if ((this._state & 32) === 0)
+        this._pending = null;
+      this._cancelFuture = this._onCancel$0();
+    },
+    _async$_add$1: function(_, data) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 < 32)
+        this._sendData$1(data);
+      else
+        this._addPending$1(H.setRuntimeTypeInfo(new P._DelayedData(data, null), [null]));
+    },
+    _addError$2: function(error, stackTrace) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 < 32)
+        this._sendError$2(error, stackTrace);
+      else
+        this._addPending$1(new P._DelayedError(error, stackTrace, null));
+    },
+    _close$0: function() {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      t1 = (t1 | 2) >>> 0;
+      this._state = t1;
+      if (t1 < 32)
+        this._sendDone$0();
+      else
+        this._addPending$1(C.C__DelayedDone);
+    },
+    _onPause$0: [function() {
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+    }, "call$0", "get$_onResume", 0, 0, 18],
+    _onCancel$0: function() {
+    },
+    _addPending$1: function($event) {
+      var pending, t1;
+      pending = this._pending;
+      if (pending == null) {
+        pending = new P._StreamImplEvents(null, null, 0);
+        this._pending = pending;
+      }
+      pending.add$1(0, $event);
+      t1 = this._state;
+      if ((t1 & 64) === 0) {
+        t1 = (t1 | 64) >>> 0;
+        this._state = t1;
+        if (t1 < 128)
+          this._pending.schedule$1(this);
+      }
+    },
+    _sendData$1: function(data) {
+      var t1 = this._state;
+      this._state = (t1 | 32) >>> 0;
+      this._zone.runUnaryGuarded$2(this._onData, data);
+      this._state = (this._state & 4294967263) >>> 0;
+      this._checkState$1((t1 & 4) !== 0);
+    },
+    _sendError$2: function(error, stackTrace) {
+      var t1, t2;
+      t1 = this._state;
+      t2 = new P._BufferingStreamSubscription__sendError_sendError(this, error, stackTrace);
+      if ((t1 & 1) !== 0) {
+        this._state = (t1 | 16) >>> 0;
+        this._cancel$0();
+        t1 = this._cancelFuture;
+        if (!!J.getInterceptor(t1).$isFuture)
+          t1.whenComplete$1(t2);
+        else
+          t2.call$0();
+      } else {
+        t2.call$0();
+        this._checkState$1((t1 & 4) !== 0);
+      }
+    },
+    _sendDone$0: function() {
+      var t1, t2;
+      t1 = new P._BufferingStreamSubscription__sendDone_sendDone(this);
+      this._cancel$0();
+      this._state = (this._state | 16) >>> 0;
+      t2 = this._cancelFuture;
+      if (!!J.getInterceptor(t2).$isFuture)
+        t2.whenComplete$1(t1);
+      else
+        t1.call$0();
+    },
+    _guardCallback$1: function(callback) {
+      var t1 = this._state;
+      this._state = (t1 | 32) >>> 0;
+      callback.call$0();
+      this._state = (this._state & 4294967263) >>> 0;
+      this._checkState$1((t1 & 4) !== 0);
+    },
+    _checkState$1: function(wasInputPaused) {
+      var t1, isInputPaused;
+      if ((this._state & 64) !== 0) {
+        t1 = this._pending;
+        t1 = t1.get$isEmpty(t1);
+      } else
+        t1 = false;
+      if (t1) {
+        t1 = (this._state & 4294967231) >>> 0;
+        this._state = t1;
+        if ((t1 & 4) !== 0)
+          if (t1 < 128) {
+            t1 = this._pending;
+            t1 = t1 == null || t1.get$isEmpty(t1);
+          } else
+            t1 = false;
+        else
+          t1 = false;
+        if (t1)
+          this._state = (this._state & 4294967291) >>> 0;
+      }
+      for (; true; wasInputPaused = isInputPaused) {
+        t1 = this._state;
+        if ((t1 & 8) !== 0) {
+          this._pending = null;
+          return;
+        }
+        isInputPaused = (t1 & 4) !== 0;
+        if (wasInputPaused === isInputPaused)
+          break;
+        this._state = (t1 ^ 32) >>> 0;
+        if (isInputPaused)
+          this._onPause$0();
+        else
+          this._onResume$0();
+        this._state = (this._state & 4294967263) >>> 0;
+      }
+      t1 = this._state;
+      if ((t1 & 64) !== 0 && t1 < 128)
+        this._pending.schedule$1(this);
+    },
+    $isStreamSubscription: true,
+    static: {"^": "_BufferingStreamSubscription__STATE_CANCEL_ON_ERROR,_BufferingStreamSubscription__STATE_CLOSED,_BufferingStreamSubscription__STATE_INPUT_PAUSED,_BufferingStreamSubscription__STATE_CANCELED,_BufferingStreamSubscription__STATE_WAIT_FOR_CANCEL,_BufferingStreamSubscription__STATE_IN_CALLBACK,_BufferingStreamSubscription__STATE_HAS_PENDING,_BufferingStreamSubscription__STATE_PAUSE_COUNT,_BufferingStreamSubscription__STATE_PAUSE_COUNT_SHIFT"}
+  },
+  _BufferingStreamSubscription__sendError_sendError: {
+    "^": "Closure:18;this_0,error_1,stackTrace_2",
+    call$0: [function() {
+      var t1, t2, t3, t4, t5, t6;
+      t1 = this.this_0;
+      t2 = t1._state;
+      if ((t2 & 8) !== 0 && (t2 & 16) === 0)
+        return;
+      t1._state = (t2 | 32) >>> 0;
+      t2 = t1._zone;
+      if (!t2.inSameErrorZone$1($.Zone__current))
+        $.Zone__current.handleUncaughtError$2(this.error_1, this.stackTrace_2);
+      else {
+        t3 = t1._onError;
+        t4 = H.getDynamicRuntimeType();
+        t4 = H.buildFunctionType(t4, [t4, t4])._isTest$1(t3);
+        t5 = t1._onError;
+        t6 = this.error_1;
+        if (t4)
+          t2.runBinaryGuarded$3(t5, t6, this.stackTrace_2);
+        else
+          t2.runUnaryGuarded$2(t5, t6);
+      }
+      t1._state = (t1._state & 4294967263) >>> 0;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BufferingStreamSubscription__sendDone_sendDone: {
+    "^": "Closure:18;this_0",
+    call$0: [function() {
+      var t1, t2;
+      t1 = this.this_0;
+      t2 = t1._state;
+      if ((t2 & 16) === 0)
+        return;
+      t1._state = (t2 | 42) >>> 0;
+      t1._zone.runGuarded$1(t1._onDone);
+      t1._state = (t1._state & 4294967263) >>> 0;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _StreamImpl: {
+    "^": "Stream;",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var subscription = this._createSubscription$1(true === cancelOnError);
+      subscription.onData$1(onData);
+      subscription.onError$1(0, onError);
+      subscription.onDone$1(onDone);
+      return subscription;
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    _createSubscription$1: function(cancelOnError) {
+      var t1, t2;
+      t1 = $.Zone__current;
+      t2 = cancelOnError ? 1 : 0;
+      t2 = new P._BufferingStreamSubscription(null, null, null, t1, t2, null, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    }
+  },
+  _DelayedEvent: {
+    "^": "Object;next@"
+  },
+  _DelayedData: {
+    "^": "_DelayedEvent;value>,next",
+    perform$1: function(dispatch) {
+      dispatch._sendData$1(this.value);
+    }
+  },
+  _DelayedError: {
+    "^": "_DelayedEvent;error>,stackTrace<,next",
+    perform$1: function(dispatch) {
+      dispatch._sendError$2(this.error, this.stackTrace);
+    }
+  },
+  _DelayedDone: {
+    "^": "Object;",
+    perform$1: function(dispatch) {
+      dispatch._sendDone$0();
+    },
+    get$next: function() {
+      return;
+    },
+    set$next: function(_) {
+      throw H.wrapException(P.StateError$("No events after a done."));
+    }
+  },
+  _PendingEvents: {
+    "^": "Object;",
+    schedule$1: function(dispatch) {
+      var t1 = this._state;
+      if (t1 === 1)
+        return;
+      if (t1 >= 1) {
+        this._state = 1;
+        return;
+      }
+      P.scheduleMicrotask(new P._PendingEvents_schedule_closure(this, dispatch));
+      this._state = 1;
+    },
+    cancelSchedule$0: function() {
+      if (this._state === 1)
+        this._state = 3;
+    }
+  },
+  _PendingEvents_schedule_closure: {
+    "^": "Closure:69;this_0,dispatch_1",
+    call$0: [function() {
+      var t1, oldState;
+      t1 = this.this_0;
+      oldState = t1._state;
+      t1._state = 0;
+      if (oldState === 3)
+        return;
+      t1.handleNext$1(this.dispatch_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _StreamImplEvents: {
+    "^": "_PendingEvents;firstPendingEvent,lastPendingEvent,_state",
+    get$isEmpty: function(_) {
+      return this.lastPendingEvent == null;
+    },
+    add$1: function(_, $event) {
+      var t1 = this.lastPendingEvent;
+      if (t1 == null) {
+        this.lastPendingEvent = $event;
+        this.firstPendingEvent = $event;
+      } else {
+        t1.set$next($event);
+        this.lastPendingEvent = $event;
+      }
+    },
+    handleNext$1: function(dispatch) {
+      var $event, t1;
+      $event = this.firstPendingEvent;
+      t1 = $event.get$next();
+      this.firstPendingEvent = t1;
+      if (t1 == null)
+        this.lastPendingEvent = null;
+      $event.perform$1(dispatch);
+    },
+    clear$0: function(_) {
+      if (this._state === 1)
+        this._state = 3;
+      this.lastPendingEvent = null;
+      this.firstPendingEvent = null;
+    }
+  },
+  _DoneStreamSubscription: {
+    "^": "Object;_zone<,_state,_onDone",
+    get$isPaused: function() {
+      return this._state >= 4;
+    },
+    _schedule$0: function() {
+      if ((this._state & 2) !== 0)
+        return;
+      this._zone.scheduleMicrotask$1(this.get$_sendDone());
+      this._state = (this._state | 2) >>> 0;
+    },
+    onData$1: function(handleData) {
+    },
+    onError$1: function(_, handleError) {
+    },
+    onDone$1: function(handleDone) {
+      this._onDone = handleDone;
+    },
+    pause$1: [function(_, resumeSignal) {
+      this._state += 4;
+      if (resumeSignal != null)
+        resumeSignal.whenComplete$1(this.get$resume(this));
+    }, function($receiver) {
+      return this.pause$1($receiver, null);
+    }, "pause$0", "call$1", "call$0", "get$pause", 0, 2, 116, 23, 117],
+    resume$0: [function(_) {
+      var t1 = this._state;
+      if (t1 >= 4) {
+        t1 -= 4;
+        this._state = t1;
+        if (t1 < 4 && (t1 & 1) === 0)
+          this._schedule$0();
+      }
+    }, "call$0", "get$resume", 0, 0, 18],
+    cancel$0: function() {
+      return;
+    },
+    _sendDone$0: [function() {
+      var t1 = (this._state & 4294967293) >>> 0;
+      this._state = t1;
+      if (t1 >= 4)
+        return;
+      this._state = (t1 | 1) >>> 0;
+      t1 = this._onDone;
+      if (t1 != null)
+        this._zone.runGuarded$1(t1);
+    }, "call$0", "get$_sendDone", 0, 0, 18],
+    $isStreamSubscription: true,
+    static: {"^": "_DoneStreamSubscription__DONE_SENT,_DoneStreamSubscription__SCHEDULED,_DoneStreamSubscription__PAUSED"}
+  },
+  _cancelAndError_closure: {
+    "^": "Closure:69;future_0,error_1,stackTrace_2",
+    call$0: [function() {
+      return this.future_0._completeError$2(this.error_1, this.stackTrace_2);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _cancelAndErrorClosure_closure: {
+    "^": "Closure:118;subscription_0,future_1",
+    call$2: function(error, stackTrace) {
+      return P._cancelAndError(this.subscription_0, this.future_1, error, stackTrace);
+    },
+    $isFunction: true
+  },
+  _cancelAndValue_closure: {
+    "^": "Closure:69;future_0,value_1",
+    call$0: [function() {
+      return this.future_0._complete$1(this.value_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _ForwardingStream: {
+    "^": "Stream;",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var t1, t2, t3, t4, result;
+      cancelOnError = true === cancelOnError;
+      t1 = H.getRuntimeTypeArgument(this, "_ForwardingStream", 0);
+      t2 = H.getRuntimeTypeArgument(this, "_ForwardingStream", 1);
+      t3 = $.Zone__current;
+      t4 = cancelOnError ? 1 : 0;
+      result = H.setRuntimeTypeInfo(new P._ForwardingStreamSubscription(this, null, null, null, null, t3, t4, null, null), [t1, t2]);
+      result._ForwardingStreamSubscription$2(this, cancelOnError, t1, t2);
+      result.onData$1(onData);
+      result.onError$1(0, onError);
+      result.onDone$1(onDone);
+      return result;
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    _handleData$2: function(data, sink) {
+      sink._async$_add$1(0, data);
+    },
+    $asStream: function($S, $T) {
+      return [$T];
+    }
+  },
+  _ForwardingStreamSubscription: {
+    "^": "_BufferingStreamSubscription;_stream,_subscription,_onData,_onError,_onDone,_zone,_state,_cancelFuture,_pending",
+    _async$_add$1: function(_, data) {
+      if ((this._state & 2) !== 0)
+        return;
+      P._BufferingStreamSubscription.prototype._async$_add$1.call(this, this, data);
+    },
+    _addError$2: function(error, stackTrace) {
+      if ((this._state & 2) !== 0)
+        return;
+      P._BufferingStreamSubscription.prototype._addError$2.call(this, error, stackTrace);
+    },
+    _onPause$0: [function() {
+      var t1 = this._subscription;
+      if (t1 == null)
+        return;
+      t1.pause$0(0);
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+      var t1 = this._subscription;
+      if (t1 == null)
+        return;
+      t1.resume$0(0);
+    }, "call$0", "get$_onResume", 0, 0, 18],
+    _onCancel$0: function() {
+      var t1 = this._subscription;
+      if (t1 != null) {
+        this._subscription = null;
+        t1.cancel$0();
+      }
+      return;
+    },
+    _handleData$1: [function(data) {
+      this._stream._handleData$2(data, this);
+    }, "call$1", "get$_handleData", 2, 0, function() {
+      return H.computeSignature(function(S, T) {
+        return {func: "void__S", void: true, args: [S]};
+      }, this.$receiver, "_ForwardingStreamSubscription");
+    }, 104],
+    _handleError$2: [function(error, stackTrace) {
+      this._addError$2(error, stackTrace);
+    }, "call$2", "get$_handleError", 4, 0, 119, 24, 25],
+    _handleDone$0: [function() {
+      this._close$0();
+    }, "call$0", "get$_handleDone", 0, 0, 18],
+    _ForwardingStreamSubscription$2: function(_stream, cancelOnError, $S, $T) {
+      var t1, t2;
+      t1 = this.get$_handleData();
+      t2 = this.get$_handleError();
+      this._subscription = this._stream._async$_source.listen$3$onDone$onError(t1, this.get$_handleDone(), t2);
+    },
+    $as_BufferingStreamSubscription: function($S, $T) {
+      return [$T];
+    },
+    $asStreamSubscription: function($S, $T) {
+      return [$T];
+    }
+  },
+  _WhereStream: {
+    "^": "_ForwardingStream;_test,_async$_source",
+    _test$1: function(arg0) {
+      return this._test.call$1(arg0);
+    },
+    _handleData$2: function(inputEvent, sink) {
+      var satisfies, e, s, exception, t1;
+      satisfies = null;
+      try {
+        satisfies = this._test$1(inputEvent);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        sink._addError$2(e, s);
+        return;
+      }
+
+      if (satisfies === true)
+        J._async$_add$1$x(sink, inputEvent);
+    },
+    $as_ForwardingStream: function($T) {
+      return [$T, $T];
+    },
+    $asStream: null
+  },
+  _MapStream: {
+    "^": "_ForwardingStream;_transform,_async$_source",
+    _transform$1: function(arg0) {
+      return this._transform.call$1(arg0);
+    },
+    _handleData$2: function(inputEvent, sink) {
+      var outputEvent, e, s, exception, t1;
+      outputEvent = null;
+      try {
+        outputEvent = this._transform$1(inputEvent);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        sink._addError$2(e, s);
+        return;
+      }
+
+      J._async$_add$1$x(sink, outputEvent);
+    }
+  },
+  _ExpandStream: {
+    "^": "_ForwardingStream;_expand,_async$_source",
+    _expand$1: function(arg0) {
+      return this._expand.call$1(arg0);
+    },
+    _handleData$2: function(inputEvent, sink) {
+      var value, e, s, t1, exception;
+      try {
+        for (t1 = J.get$iterator$ax(this._expand$1(inputEvent)); t1.moveNext$0();) {
+          value = t1.get$current();
+          J._async$_add$1$x(sink, value);
+        }
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        sink._addError$2(e, s);
+      }
+
+    }
+  },
+  Timer: {
+    "^": "Object;"
+  },
+  ZoneSpecification: {
+    "^": "Object;"
+  },
+  _ZoneSpecification: {
+    "^": "Object;handleUncaughtError<,run<,runUnary<,runBinary<,registerCallback<,registerUnaryCallback<,registerBinaryCallback<,scheduleMicrotask<,createTimer<,createPeriodicTimer,print>,fork<",
+    handleUncaughtError$2: function(arg0, arg1) {
+      return this.handleUncaughtError.call$2(arg0, arg1);
+    },
+    run$1: function(arg0) {
+      return this.run.call$1(arg0);
+    },
+    runUnary$2: function(arg0, arg1) {
+      return this.runUnary.call$2(arg0, arg1);
+    },
+    runBinary$3: function(arg0, arg1, arg2) {
+      return this.runBinary.call$3(arg0, arg1, arg2);
+    },
+    registerCallback$1: function(arg0) {
+      return this.registerCallback.call$1(arg0);
+    },
+    registerUnaryCallback$1: function(arg0) {
+      return this.registerUnaryCallback.call$1(arg0);
+    },
+    registerBinaryCallback$1: function(arg0) {
+      return this.registerBinaryCallback.call$1(arg0);
+    },
+    scheduleMicrotask$1: function(arg0) {
+      return this.scheduleMicrotask.call$1(arg0);
+    },
+    scheduleMicrotask$2: function(arg0, arg1) {
+      return this.scheduleMicrotask.call$2(arg0, arg1);
+    },
+    createTimer$2: function(arg0, arg1) {
+      return this.createTimer.call$2(arg0, arg1);
+    },
+    print$1: function($receiver, arg0) {
+      return this.print.call$1(arg0);
+    },
+    fork$1$specification: function(arg0) {
+      return this.fork.call$1$specification(arg0);
+    }
+  },
+  ZoneDelegate: {
+    "^": "Object;"
+  },
+  Zone: {
+    "^": "Object;"
+  },
+  _ZoneDelegate: {
+    "^": "Object;_degelationTarget",
+    get$_zone: function() {
+      return this._degelationTarget;
+    },
+    handleUncaughtError$3: function(zone, error, stackTrace) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$handleUncaughtError() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$handleUncaughtError().call$5($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, error, stackTrace);
+    },
+    run$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$run() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$run().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    runUnary$3: function(zone, f, arg) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$runUnary() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$runUnary().call$5($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f, arg);
+    },
+    runBinary$4: function(zone, f, arg1, arg2) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$runBinary() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$runBinary().call$6($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f, arg1, arg2);
+    },
+    registerCallback$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$registerCallback() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$registerCallback().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    registerUnaryCallback$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$registerUnaryCallback() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$registerUnaryCallback().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    registerBinaryCallback$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$registerBinaryCallback() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$registerBinaryCallback().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    scheduleMicrotask$2: function(zone, f) {
+      var $parent, t1;
+      $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$scheduleMicrotask() == null;)
+        $parent = $parent.get$parent($parent);
+      t1 = $parent.get$parent($parent);
+      $parent.get$_specification().get$scheduleMicrotask().call$4($parent, new P._ZoneDelegate(t1), zone, f);
+    },
+    createTimer$3: function(zone, duration, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$createTimer() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$createTimer().call$5($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, duration, f);
+    },
+    print$2: function(_, zone, line) {
+      var $parent, t1;
+      $parent = this._degelationTarget;
+      for (; t1 = $parent.get$_specification(), t1.get$print(t1) == null;)
+        $parent = $parent.get$parent($parent);
+      t1 = $parent.get$_specification();
+      t1.get$print(t1).call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, line);
+    },
+    fork$3: function(zone, specification, zoneValues) {
+      var $parent, t1;
+      $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$fork() == null;)
+        $parent = $parent.get$parent($parent);
+      t1 = $parent.get$parent($parent);
+      return $parent.get$_specification().get$fork().call$5($parent, new P._ZoneDelegate(t1), zone, specification, zoneValues);
+    }
+  },
+  _BaseZone: {
+    "^": "Object;",
+    inSameErrorZone$1: function(otherZone) {
+      return this.get$_errorZone() === otherZone.get$_errorZone();
+    },
+    runGuarded$1: function(f) {
+      var e, s, t1, exception;
+      try {
+        t1 = this.run$1(f);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        return this.handleUncaughtError$2(e, s);
+      }
+
+    },
+    runUnaryGuarded$2: function(f, arg) {
+      var e, s, t1, exception;
+      try {
+        t1 = this.runUnary$2(f, arg);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        return this.handleUncaughtError$2(e, s);
+      }
+
+    },
+    runBinaryGuarded$3: function(f, arg1, arg2) {
+      var e, s, t1, exception;
+      try {
+        t1 = this.runBinary$3(f, arg1, arg2);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        return this.handleUncaughtError$2(e, s);
+      }
+
+    },
+    bindCallback$2$runGuarded: function(f, runGuarded) {
+      var registered = this.registerCallback$1(f);
+      if (runGuarded)
+        return new P._BaseZone_bindCallback_closure(this, registered);
+      else
+        return new P._BaseZone_bindCallback_closure0(this, registered);
+    },
+    bindCallback$1: function(f) {
+      return this.bindCallback$2$runGuarded(f, true);
+    },
+    bindUnaryCallback$2$runGuarded: function(f, runGuarded) {
+      var registered = this.registerUnaryCallback$1(f);
+      if (runGuarded)
+        return new P._BaseZone_bindUnaryCallback_closure(this, registered);
+      else
+        return new P._BaseZone_bindUnaryCallback_closure0(this, registered);
+    },
+    bindBinaryCallback$2$runGuarded: function(f, runGuarded) {
+      var registered = this.registerBinaryCallback$1(f);
+      if (runGuarded)
+        return new P._BaseZone_bindBinaryCallback_closure(this, registered);
+      else
+        return new P._BaseZone_bindBinaryCallback_closure0(this, registered);
+    }
+  },
+  _BaseZone_bindCallback_closure: {
+    "^": "Closure:69;this_0,registered_1",
+    call$0: [function() {
+      return this.this_0.runGuarded$1(this.registered_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindCallback_closure0: {
+    "^": "Closure:69;this_2,registered_3",
+    call$0: [function() {
+      return this.this_2.run$1(this.registered_3);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindUnaryCallback_closure: {
+    "^": "Closure:13;this_0,registered_1",
+    call$1: [function(arg) {
+      return this.this_0.runUnaryGuarded$2(this.registered_1, arg);
+    }, "call$1", null, 2, 0, null, 33, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindUnaryCallback_closure0: {
+    "^": "Closure:13;this_2,registered_3",
+    call$1: [function(arg) {
+      return this.this_2.runUnary$2(this.registered_3, arg);
+    }, "call$1", null, 2, 0, null, 33, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindBinaryCallback_closure: {
+    "^": "Closure:75;this_0,registered_1",
+    call$2: [function(arg1, arg2) {
+      return this.this_0.runBinaryGuarded$3(this.registered_1, arg1, arg2);
+    }, "call$2", null, 4, 0, null, 9, 10, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindBinaryCallback_closure0: {
+    "^": "Closure:75;this_2,registered_3",
+    call$2: [function(arg1, arg2) {
+      return this.this_2.runBinary$3(this.registered_3, arg1, arg2);
+    }, "call$2", null, 4, 0, null, 9, 10, "call"],
+    $isFunction: true
+  },
+  _CustomizedZone: {
+    "^": "_BaseZone;parent>,_specification<,_async$_map",
+    get$_errorZone: function() {
+      return this.parent.get$_errorZone();
+    },
+    $index: function(_, key) {
+      var t1, result;
+      t1 = this._async$_map;
+      result = t1.$index(0, key);
+      if (result != null || t1.containsKey$1(key))
+        return result;
+      return this.parent.$index(0, key);
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      return new P._ZoneDelegate(this).handleUncaughtError$3(this, error, stackTrace);
+    },
+    fork$2$specification$zoneValues: function(specification, zoneValues) {
+      return new P._ZoneDelegate(this).fork$3(this, specification, zoneValues);
+    },
+    fork$1$specification: function(specification) {
+      return this.fork$2$specification$zoneValues(specification, null);
+    },
+    run$1: function(f) {
+      return new P._ZoneDelegate(this).run$2(this, f);
+    },
+    runUnary$2: function(f, arg) {
+      return new P._ZoneDelegate(this).runUnary$3(this, f, arg);
+    },
+    runBinary$3: function(f, arg1, arg2) {
+      return new P._ZoneDelegate(this).runBinary$4(this, f, arg1, arg2);
+    },
+    registerCallback$1: function(f) {
+      return new P._ZoneDelegate(this).registerCallback$2(this, f);
+    },
+    registerUnaryCallback$1: function(f) {
+      return new P._ZoneDelegate(this).registerUnaryCallback$2(this, f);
+    },
+    registerBinaryCallback$1: function(f) {
+      return new P._ZoneDelegate(this).registerBinaryCallback$2(this, f);
+    },
+    scheduleMicrotask$1: function(f) {
+      new P._ZoneDelegate(this).scheduleMicrotask$2(this, f);
+    },
+    createTimer$2: function(duration, f) {
+      return new P._ZoneDelegate(this).createTimer$3(this, duration, f);
+    },
+    print$1: function(_, line) {
+      new P._ZoneDelegate(this).print$2(0, this, line);
+    }
+  },
+  _rootHandleUncaughtError_closure: {
+    "^": "Closure:69;error_0,stackTrace_1",
+    call$0: [function() {
+      P._scheduleAsyncCallback(new P._rootHandleUncaughtError__closure(this.error_0, this.stackTrace_1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _rootHandleUncaughtError__closure: {
+    "^": "Closure:69;error_2,stackTrace_3",
+    call$0: [function() {
+      var t1, trace;
+      t1 = this.error_2;
+      P.print("Uncaught Error: " + H.S(t1));
+      trace = this.stackTrace_3;
+      if (trace == null && !!J.getInterceptor(t1).$isError)
+        trace = t1.get$stackTrace();
+      if (trace != null)
+        P.print("Stack Trace: \n" + H.S(trace) + "\n");
+      throw H.wrapException(t1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _rootFork_closure: {
+    "^": "Closure:75;copiedMap_0",
+    call$2: [function(key, value) {
+      this.copiedMap_0.$indexSet(0, key, value);
+    }, "call$2", null, 4, 0, null, 76, 21, "call"],
+    $isFunction: true
+  },
+  _RootZoneSpecification: {
+    "^": "Object;",
+    get$handleUncaughtError: function() {
+      return P._rootHandleUncaughtError$closure();
+    },
+    handleUncaughtError$2: function(arg0, arg1) {
+      return this.get$handleUncaughtError().call$2(arg0, arg1);
+    },
+    get$run: function() {
+      return P._rootRun$closure();
+    },
+    run$1: function(arg0) {
+      return this.get$run().call$1(arg0);
+    },
+    get$runUnary: function() {
+      return P._rootRunUnary$closure();
+    },
+    runUnary$2: function(arg0, arg1) {
+      return this.get$runUnary().call$2(arg0, arg1);
+    },
+    get$runBinary: function() {
+      return P._rootRunBinary$closure();
+    },
+    runBinary$3: function(arg0, arg1, arg2) {
+      return this.get$runBinary().call$3(arg0, arg1, arg2);
+    },
+    get$registerCallback: function() {
+      return P._rootRegisterCallback$closure();
+    },
+    registerCallback$1: function(arg0) {
+      return this.get$registerCallback().call$1(arg0);
+    },
+    get$registerUnaryCallback: function() {
+      return P._rootRegisterUnaryCallback$closure();
+    },
+    registerUnaryCallback$1: function(arg0) {
+      return this.get$registerUnaryCallback().call$1(arg0);
+    },
+    get$registerBinaryCallback: function() {
+      return P._rootRegisterBinaryCallback$closure();
+    },
+    registerBinaryCallback$1: function(arg0) {
+      return this.get$registerBinaryCallback().call$1(arg0);
+    },
+    get$scheduleMicrotask: function() {
+      return P._rootScheduleMicrotask$closure();
+    },
+    scheduleMicrotask$1: function(arg0) {
+      return this.get$scheduleMicrotask().call$1(arg0);
+    },
+    scheduleMicrotask$2: function(arg0, arg1) {
+      return this.get$scheduleMicrotask().call$2(arg0, arg1);
+    },
+    get$createTimer: function() {
+      return P._rootCreateTimer$closure();
+    },
+    createTimer$2: function(arg0, arg1) {
+      return this.get$createTimer().call$2(arg0, arg1);
+    },
+    get$print: function(_) {
+      return P._rootPrint$closure();
+    },
+    print$1: function($receiver, arg0) {
+      return this.get$print(this).call$1(arg0);
+    },
+    get$fork: function() {
+      return P._rootFork$closure();
+    },
+    fork$1$specification: function(arg0) {
+      return this.get$fork().call$1$specification(arg0);
+    }
+  },
+  _RootZone: {
+    "^": "_BaseZone;",
+    get$parent: function(_) {
+      return;
+    },
+    get$_specification: function() {
+      return C.C__RootZoneSpecification;
+    },
+    get$_errorZone: function() {
+      return this;
+    },
+    inSameErrorZone$1: function(otherZone) {
+      return otherZone.get$_errorZone() === this;
+    },
+    $index: function(_, key) {
+      return;
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      return P._rootHandleUncaughtError(this, null, this, error, stackTrace);
+    },
+    fork$2$specification$zoneValues: function(specification, zoneValues) {
+      return P._rootFork(this, null, this, specification, zoneValues);
+    },
+    fork$1$specification: function(specification) {
+      return this.fork$2$specification$zoneValues(specification, null);
+    },
+    run$1: function(f) {
+      return P._rootRun(this, null, this, f);
+    },
+    runUnary$2: function(f, arg) {
+      return P._rootRunUnary(this, null, this, f, arg);
+    },
+    runBinary$3: function(f, arg1, arg2) {
+      return P._rootRunBinary(this, null, this, f, arg1, arg2);
+    },
+    registerCallback$1: function(f) {
+      return f;
+    },
+    registerUnaryCallback$1: function(f) {
+      return f;
+    },
+    registerBinaryCallback$1: function(f) {
+      return f;
+    },
+    scheduleMicrotask$1: function(f) {
+      P._rootScheduleMicrotask(this, null, this, f);
+    },
+    createTimer$2: function(duration, f) {
+      return P._rootCreateTimer(this, null, this, duration, f);
+    },
+    print$1: function(_, line) {
+      H.printString(line);
+      return;
+    }
+  }
+}],
+["dart.collection", "dart:collection", , P, {
+  "^": "",
+  LinkedHashMap_LinkedHashMap$_literal: function(keyValuePairs, $K, $V) {
+    return H.fillLiteralMap(keyValuePairs, H.setRuntimeTypeInfo(new P._LinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]));
+  },
+  LinkedHashMap_LinkedHashMap$_empty: function($K, $V) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]);
+  },
+  _defaultEquals: [function(a, b) {
+    return J.$eq(a, b);
+  }, "call$2", "_defaultEquals$closure", 4, 0, 45, 46, 47],
+  _defaultHashCode: [function(a) {
+    return J.get$hashCode$(a);
+  }, "call$1", "_defaultHashCode$closure", 2, 0, 48, 46],
+  HashMap_HashMap: function(equals, hashCode, isValidKey, $K, $V) {
+    var t1;
+    if (equals == null) {
+      t1 = new P._HashMap(0, null, null, null, null);
+      t1.$builtinTypeInfo = [$K, $V];
+      return t1;
+    }
+    hashCode = P._defaultHashCode$closure();
+    return P._CustomHashMap$(equals, hashCode, isValidKey, $K, $V);
+  },
+  HashMap_HashMap$identity: function($K, $V) {
+    return H.setRuntimeTypeInfo(new P._IdentityHashMap(0, null, null, null, null), [$K, $V]);
+  },
+  HashSet_HashSet: function(equals, hashCode, isValidKey, $E) {
+    return H.setRuntimeTypeInfo(new P._HashSet(0, null, null, null, null), [$E]);
+  },
+  IterableBase_iterableToShortString: function(iterable, leftDelimiter, rightDelimiter) {
+    var parts, t1;
+    if (P.IterableBase__isToStringVisiting(iterable)) {
+      if (leftDelimiter === "(" && rightDelimiter === ")")
+        return "(...)";
+      return leftDelimiter + "..." + rightDelimiter;
+    }
+    parts = [];
+    t1 = $.get$IterableBase__toStringVisiting();
+    t1.push(iterable);
+    try {
+      P.IterableBase__iterablePartsToStrings(iterable, parts);
+    } finally {
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    t1 = P.StringBuffer$(leftDelimiter);
+    t1.writeAll$2(parts, ", ");
+    t1.write$1(rightDelimiter);
+    return t1._contents;
+  },
+  IterableBase_iterableToFullString: function(iterable, leftDelimiter, rightDelimiter) {
+    var buffer, t1;
+    if (P.IterableBase__isToStringVisiting(iterable))
+      return leftDelimiter + "..." + rightDelimiter;
+    buffer = P.StringBuffer$(leftDelimiter);
+    t1 = $.get$IterableBase__toStringVisiting();
+    t1.push(iterable);
+    try {
+      buffer.writeAll$2(iterable, ", ");
+    } finally {
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    buffer.write$1(rightDelimiter);
+    return buffer.get$_contents();
+  },
+  IterableBase__isToStringVisiting: function(o) {
+    var i, t1;
+    for (i = 0; t1 = $.get$IterableBase__toStringVisiting(), i < t1.length; ++i)
+      if (o === t1[i])
+        return true;
+    return false;
+  },
+  IterableBase__iterablePartsToStrings: function(iterable, parts) {
+    var it, $length, count, next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision;
+    it = iterable.get$iterator(iterable);
+    $length = 0;
+    count = 0;
+    while (true) {
+      if (!($length < 80 || count < 3))
+        break;
+      if (!it.moveNext$0())
+        return;
+      next = H.S(it.get$current());
+      parts.push(next);
+      $length += next.length + 2;
+      ++count;
+    }
+    if (!it.moveNext$0()) {
+      if (count <= 5)
+        return;
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      ultimateString = parts.pop();
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      penultimateString = parts.pop();
+    } else {
+      penultimate = it.get$current();
+      ++count;
+      if (!it.moveNext$0()) {
+        if (count <= 4) {
+          parts.push(H.S(penultimate));
+          return;
+        }
+        ultimateString = H.S(penultimate);
+        if (0 >= parts.length)
+          return H.ioore(parts, 0);
+        penultimateString = parts.pop();
+        $length += ultimateString.length + 2;
+      } else {
+        ultimate = it.get$current();
+        ++count;
+        for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
+          ultimate0 = it.get$current();
+          ++count;
+          if (count > 100) {
+            while (true) {
+              if (!($length > 75 && count > 3))
+                break;
+              if (0 >= parts.length)
+                return H.ioore(parts, 0);
+              $length -= parts.pop().length + 2;
+              --count;
+            }
+            parts.push("...");
+            return;
+          }
+        }
+        penultimateString = H.S(penultimate);
+        ultimateString = H.S(ultimate);
+        $length += ultimateString.length + penultimateString.length + 4;
+      }
+    }
+    if (count > parts.length + 2) {
+      $length += 5;
+      elision = "...";
+    } else
+      elision = null;
+    while (true) {
+      if (!($length > 80 && parts.length > 3))
+        break;
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      $length -= parts.pop().length + 2;
+      if (elision == null) {
+        $length += 5;
+        elision = "...";
+      }
+    }
+    if (elision != null)
+      parts.push(elision);
+    parts.push(penultimateString);
+    parts.push(ultimateString);
+  },
+  LinkedHashMap_LinkedHashMap: function(equals, hashCode, isValidKey, $K, $V) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]);
+  },
+  LinkedHashSet_LinkedHashSet: function(equals, hashCode, isValidKey, $E) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashSet(0, null, null, null, null, null, 0), [$E]);
+  },
+  Maps_mapToString: function(m) {
+    var t1, result;
+    t1 = {};
+    if (P.IterableBase__isToStringVisiting(m))
+      return "{...}";
+    result = P.StringBuffer$("");
+    try {
+      $.get$IterableBase__toStringVisiting().push(m);
+      result.write$1("{");
+      t1.first_0 = true;
+      J.forEach$1$ax(m, new P.Maps_mapToString_closure(t1, result));
+      result.write$1("}");
+    } finally {
+      t1 = $.get$IterableBase__toStringVisiting();
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    return result.get$_contents();
+  },
+  _HashMap: {
+    "^": "Object;_collection$_length,_strings,_nums,_rest,_collection$_keys",
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new P.HashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      return H.MappedIterable_MappedIterable(H.setRuntimeTypeInfo(new P.HashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]), new P._HashMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    containsKey$1: function(key) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        return strings == null ? false : strings[key] != null;
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        return nums == null ? false : nums[key] != null;
+      } else
+        return this._containsKey$1(key);
+    },
+    _containsKey$1: function(key) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(key)], key) >= 0;
+    },
+    addAll$1: function(_, other) {
+      H.IterableMixinWorkaround_forEach(other, new P._HashMap_addAll_closure(this));
+    },
+    $index: function(_, key) {
+      var strings, t1, entry, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          t1 = null;
+        else {
+          entry = strings[key];
+          t1 = entry === strings ? null : entry;
+        }
+        return t1;
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          t1 = null;
+        else {
+          entry = nums[key];
+          t1 = entry === nums ? null : entry;
+        }
+        return t1;
+      } else
+        return this._get$1(key);
+    },
+    _get$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      return index < 0 ? null : bucket[index + 1];
+    },
+    $indexSet: function(_, key, value) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          strings = P._HashMap__newHashTable();
+          this._strings = strings;
+        }
+        this._addHashTableEntry$3(strings, key, value);
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null) {
+          nums = P._HashMap__newHashTable();
+          this._nums = nums;
+        }
+        this._addHashTableEntry$3(nums, key, value);
+      } else
+        this._set$2(key, value);
+    },
+    _set$2: function(key, value) {
+      var rest, hash, bucket, index;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._HashMap__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(key);
+      bucket = rest[hash];
+      if (bucket == null) {
+        P._HashMap__setTableEntry(rest, hash, [key, value]);
+        ++this._collection$_length;
+        this._collection$_keys = null;
+      } else {
+        index = this._findBucketIndex$2(bucket, key);
+        if (index >= 0)
+          bucket[index + 1] = value;
+        else {
+          bucket.push(key, value);
+          ++this._collection$_length;
+          this._collection$_keys = null;
+        }
+      }
+    },
+    remove$1: function(_, key) {
+      if (typeof key === "string" && key !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, key);
+      else if (typeof key === "number" && (key & 0x3ffffff) === key)
+        return this._removeHashTableEntry$2(this._nums, key);
+      else
+        return this._remove$1(key);
+    },
+    _remove$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      --this._collection$_length;
+      this._collection$_keys = null;
+      return bucket.splice(index, 2)[1];
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._collection$_keys = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+      }
+    },
+    forEach$1: function(_, action) {
+      var keys, $length, i, key;
+      keys = this._computeKeys$0();
+      for ($length = keys.length, i = 0; i < $length; ++i) {
+        key = keys[i];
+        action.call$2(key, this.$index(0, key));
+        if (keys !== this._collection$_keys)
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+    },
+    _computeKeys$0: function() {
+      var t1, result, strings, names, entries, index, i, nums, rest, bucket, $length, i0;
+      t1 = this._collection$_keys;
+      if (t1 != null)
+        return t1;
+      result = Array(this._collection$_length);
+      result.fixed$length = init;
+      strings = this._strings;
+      if (strings != null) {
+        names = Object.getOwnPropertyNames(strings);
+        entries = names.length;
+        for (index = 0, i = 0; i < entries; ++i) {
+          result[index] = names[i];
+          ++index;
+        }
+      } else
+        index = 0;
+      nums = this._nums;
+      if (nums != null) {
+        names = Object.getOwnPropertyNames(nums);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          result[index] = +names[i];
+          ++index;
+        }
+      }
+      rest = this._rest;
+      if (rest != null) {
+        names = Object.getOwnPropertyNames(rest);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          bucket = rest[names[i]];
+          $length = bucket.length;
+          for (i0 = 0; i0 < $length; i0 += 2) {
+            result[index] = bucket[i0];
+            ++index;
+          }
+        }
+      }
+      this._collection$_keys = result;
+      return result;
+    },
+    _addHashTableEntry$3: function(table, key, value) {
+      if (table[key] == null) {
+        ++this._collection$_length;
+        this._collection$_keys = null;
+      }
+      P._HashMap__setTableEntry(table, key, value);
+    },
+    _removeHashTableEntry$2: function(table, key) {
+      var value;
+      if (table != null && table[key] != null) {
+        value = P._HashMap__getTableEntry(table, key);
+        delete table[key];
+        --this._collection$_length;
+        this._collection$_keys = null;
+        return value;
+      } else
+        return;
+    },
+    _computeHashCode$1: function(key) {
+      return J.get$hashCode$(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2)
+        if (J.$eq(bucket[i], key))
+          return i;
+      return -1;
+    },
+    $isMap: true,
+    static: {_HashMap__getTableEntry: function(table, key) {
+        var entry = table[key];
+        return entry === table ? null : entry;
+      }, _HashMap__setTableEntry: function(table, key, value) {
+        if (value == null)
+          table[key] = table;
+        else
+          table[key] = value;
+      }, _HashMap__newHashTable: function() {
+        var table = Object.create(null);
+        P._HashMap__setTableEntry(table, "<non-identifier-key>", table);
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  _HashMap_values_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(each) {
+      return this.this_0.$index(0, each);
+    }, "call$1", null, 2, 0, null, 120, "call"],
+    $isFunction: true
+  },
+  _HashMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V", args: [K, V]};
+      }, this.this_0, "_HashMap");
+    }
+  },
+  _IdentityHashMap: {
+    "^": "_HashMap;_collection$_length,_strings,_nums,_rest,_collection$_keys",
+    _computeHashCode$1: function(key) {
+      return H.objectHashCode(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i, t1;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2) {
+        t1 = bucket[i];
+        if (t1 == null ? key == null : t1 === key)
+          return i;
+      }
+      return -1;
+    }
+  },
+  _CustomHashMap: {
+    "^": "_HashMap;_equals,_hashCode,_validKey,_collection$_length,_strings,_nums,_rest,_collection$_keys",
+    _equals$2: function(arg0, arg1) {
+      return this._equals.call$2(arg0, arg1);
+    },
+    _hashCode$1: function(arg0) {
+      return this._hashCode.call$1(arg0);
+    },
+    _validKey$1: function(arg0) {
+      return this._validKey.call$1(arg0);
+    },
+    $index: function(_, key) {
+      if (this._validKey$1(key) !== true)
+        return;
+      return P._HashMap.prototype._get$1.call(this, key);
+    },
+    $indexSet: function(_, key, value) {
+      P._HashMap.prototype._set$2.call(this, key, value);
+    },
+    containsKey$1: function(key) {
+      if (this._validKey$1(key) !== true)
+        return false;
+      return P._HashMap.prototype._containsKey$1.call(this, key);
+    },
+    remove$1: function(_, key) {
+      if (this._validKey$1(key) !== true)
+        return;
+      return P._HashMap.prototype._remove$1.call(this, key);
+    },
+    _computeHashCode$1: function(key) {
+      return this._hashCode$1(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2)
+        if (this._equals$2(bucket[i], key) === true)
+          return i;
+      return -1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    static: {_CustomHashMap$: function(_equals, _hashCode, validKey, $K, $V) {
+        var t1 = new P._CustomHashMap_closure($K);
+        return H.setRuntimeTypeInfo(new P._CustomHashMap(_equals, _hashCode, t1, 0, null, null, null, null), [$K, $V]);
+      }}
+  },
+  _CustomHashMap_closure: {
+    "^": "Closure:13;K_0",
+    call$1: function(v) {
+      var t1 = H.checkSubtypeOfRuntimeType(v, this.K_0);
+      return t1;
+    },
+    $isFunction: true
+  },
+  HashMapKeyIterable: {
+    "^": "IterableBase;_map",
+    get$length: function(_) {
+      return this._map._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._map._collection$_length === 0;
+    },
+    get$iterator: function(_) {
+      var t1 = this._map;
+      t1 = new P.HashMapKeyIterator(t1, t1._computeKeys$0(), 0, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    contains$1: function(_, element) {
+      return this._map.containsKey$1(element);
+    },
+    forEach$1: function(_, f) {
+      var t1, keys, $length, i;
+      t1 = this._map;
+      keys = t1._computeKeys$0();
+      for ($length = keys.length, i = 0; i < $length; ++i) {
+        f.call$1(keys[i]);
+        if (keys !== t1._collection$_keys)
+          throw H.wrapException(P.ConcurrentModificationError$(t1));
+      }
+    },
+    $isEfficientLength: true
+  },
+  HashMapKeyIterator: {
+    "^": "Object;_map,_collection$_keys,_offset,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var keys, offset, t1;
+      keys = this._collection$_keys;
+      offset = this._offset;
+      t1 = this._map;
+      if (keys !== t1._collection$_keys)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else if (offset >= keys.length) {
+        this._collection$_current = null;
+        return false;
+      } else {
+        this._collection$_current = keys[offset];
+        this._offset = offset + 1;
+        return true;
+      }
+    }
+  },
+  _LinkedHashMap: {
+    "^": "Object;_collection$_length,_strings,_nums,_rest,_first,_last,_modifications",
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      return H.MappedIterable_MappedIterable(H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]), new P._LinkedHashMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    containsKey$1: function(key) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          return false;
+        return strings[key] != null;
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          return false;
+        return nums[key] != null;
+      } else
+        return this._containsKey$1(key);
+    },
+    _containsKey$1: function(key) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(key)], key) >= 0;
+    },
+    addAll$1: function(_, other) {
+      J.forEach$1$ax(other, new P._LinkedHashMap_addAll_closure(this));
+    },
+    $index: function(_, key) {
+      var strings, cell, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          return;
+        cell = strings[key];
+        return cell == null ? null : cell.get$_value();
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          return;
+        cell = nums[key];
+        return cell == null ? null : cell.get$_value();
+      } else
+        return this._get$1(key);
+    },
+    _get$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      return bucket[index].get$_value();
+    },
+    $indexSet: function(_, key, value) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          strings = P._LinkedHashMap__newHashTable();
+          this._strings = strings;
+        }
+        this._addHashTableEntry$3(strings, key, value);
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null) {
+          nums = P._LinkedHashMap__newHashTable();
+          this._nums = nums;
+        }
+        this._addHashTableEntry$3(nums, key, value);
+      } else
+        this._set$2(key, value);
+    },
+    _set$2: function(key, value) {
+      var rest, hash, bucket, index;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._LinkedHashMap__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(key);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [this._newLinkedCell$2(key, value)];
+      else {
+        index = this._findBucketIndex$2(bucket, key);
+        if (index >= 0)
+          bucket[index].set$_value(value);
+        else
+          bucket.push(this._newLinkedCell$2(key, value));
+      }
+    },
+    putIfAbsent$2: function(key, ifAbsent) {
+      var value;
+      if (this.containsKey$1(key))
+        return this.$index(0, key);
+      value = ifAbsent.call$0();
+      this.$indexSet(0, key, value);
+      return value;
+    },
+    remove$1: function(_, key) {
+      if (typeof key === "string" && key !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, key);
+      else if (typeof key === "number" && (key & 0x3ffffff) === key)
+        return this._removeHashTableEntry$2(this._nums, key);
+      else
+        return this._remove$1(key);
+    },
+    _remove$1: function(key) {
+      var rest, bucket, index, cell;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      cell = bucket.splice(index, 1)[0];
+      this._unlinkCell$1(cell);
+      return cell.get$_value();
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._last = null;
+        this._first = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+        this._modifications = this._modifications + 1 & 67108863;
+      }
+    },
+    forEach$1: function(_, action) {
+      var cell, modifications;
+      cell = this._first;
+      modifications = this._modifications;
+      for (; cell != null;) {
+        action.call$2(cell.get$_key(), cell.get$_value());
+        if (modifications !== this._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+        cell = cell.get$_next();
+      }
+    },
+    _addHashTableEntry$3: function(table, key, value) {
+      var cell = table[key];
+      if (cell == null)
+        table[key] = this._newLinkedCell$2(key, value);
+      else
+        cell.set$_value(value);
+    },
+    _removeHashTableEntry$2: function(table, key) {
+      var cell;
+      if (table == null)
+        return;
+      cell = table[key];
+      if (cell == null)
+        return;
+      this._unlinkCell$1(cell);
+      delete table[key];
+      return cell.get$_value();
+    },
+    _newLinkedCell$2: function(key, value) {
+      var cell, last;
+      cell = new P.LinkedHashMapCell(key, value, null, null);
+      if (this._first == null) {
+        this._last = cell;
+        this._first = cell;
+      } else {
+        last = this._last;
+        cell._previous = last;
+        last.set$_next(cell);
+        this._last = cell;
+      }
+      ++this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+      return cell;
+    },
+    _unlinkCell$1: function(cell) {
+      var previous, next;
+      previous = cell.get$_previous();
+      next = cell.get$_next();
+      if (previous == null)
+        this._first = next;
+      else
+        previous.set$_next(next);
+      if (next == null)
+        this._last = previous;
+      else
+        next.set$_previous(previous);
+      --this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+    },
+    _computeHashCode$1: function(key) {
+      return J.get$hashCode$(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(bucket[i].get$_key(), key))
+          return i;
+      return -1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    $isLinkedHashMap: true,
+    $isMap: true,
+    static: {_LinkedHashMap__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  _LinkedHashMap_values_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(each) {
+      return this.this_0.$index(0, each);
+    }, "call$1", null, 2, 0, null, 120, "call"],
+    $isFunction: true
+  },
+  _LinkedHashMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V0", args: [K, V]};
+      }, this.this_0, "_LinkedHashMap");
+    }
+  },
+  LinkedHashMapCell: {
+    "^": "Object;_key<,_value@,_next@,_previous@"
+  },
+  LinkedHashMapKeyIterable: {
+    "^": "IterableBase;_map",
+    get$length: function(_) {
+      return this._map._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._map._collection$_length === 0;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._map;
+      t2 = new P.LinkedHashMapKeyIterator(t1, t1._modifications, null, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      t2._cell = t1._first;
+      return t2;
+    },
+    contains$1: function(_, element) {
+      return this._map.containsKey$1(element);
+    },
+    forEach$1: function(_, f) {
+      var t1, cell, modifications;
+      t1 = this._map;
+      cell = t1._first;
+      modifications = t1._modifications;
+      for (; cell != null;) {
+        f.call$1(cell.get$_key());
+        if (modifications !== t1._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(t1));
+        cell = cell.get$_next();
+      }
+    },
+    $isEfficientLength: true
+  },
+  LinkedHashMapKeyIterator: {
+    "^": "Object;_map,_modifications,_cell,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._map;
+      if (this._modifications !== t1._modifications)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else {
+        t1 = this._cell;
+        if (t1 == null) {
+          this._collection$_current = null;
+          return false;
+        } else {
+          this._collection$_current = t1.get$_key();
+          this._cell = this._cell.get$_next();
+          return true;
+        }
+      }
+    }
+  },
+  _HashSet: {
+    "^": "_HashSetBase;_collection$_length,_strings,_nums,_rest,_elements",
+    get$iterator: function(_) {
+      var t1 = new P.HashSetIterator(this, this._computeElements$0(), 0, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    contains$1: function(_, object) {
+      var strings, nums;
+      if (typeof object === "string" && object !== "__proto__") {
+        strings = this._strings;
+        return strings == null ? false : strings[object] != null;
+      } else if (typeof object === "number" && (object & 0x3ffffff) === object) {
+        nums = this._nums;
+        return nums == null ? false : nums[object] != null;
+      } else
+        return this._contains$1(object);
+    },
+    _contains$1: function(object) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
+    },
+    lookup$1: function(object) {
+      var t1;
+      if (!(typeof object === "string" && object !== "__proto__"))
+        t1 = typeof object === "number" && (object & 0x3ffffff) === object;
+      else
+        t1 = true;
+      if (t1)
+        return this.contains$1(0, object) ? object : null;
+      return this._lookup$1(object);
+    },
+    _lookup$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return;
+      return J.$index$asx(bucket, index);
+    },
+    add$1: function(_, element) {
+      var strings, table, nums;
+      if (typeof element === "string" && element !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._strings = table;
+          strings = table;
+        }
+        return this._addHashTableEntry$2(strings, element);
+      } else if (typeof element === "number" && (element & 0x3ffffff) === element) {
+        nums = this._nums;
+        if (nums == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._nums = table;
+          nums = table;
+        }
+        return this._addHashTableEntry$2(nums, element);
+      } else
+        return this._add$1(0, element);
+    },
+    _add$1: function(_, element) {
+      var rest, hash, bucket;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._HashSet__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(element);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [element];
+      else {
+        if (this._findBucketIndex$2(bucket, element) >= 0)
+          return false;
+        bucket.push(element);
+      }
+      ++this._collection$_length;
+      this._elements = null;
+      return true;
+    },
+    addAll$1: function(_, objects) {
+      var t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(objects, objects.length, 0, null), [H.getTypeArgumentByIndex(objects, 0)]); t1.moveNext$0();)
+        this.add$1(0, t1._current);
+    },
+    remove$1: function(_, object) {
+      if (typeof object === "string" && object !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, object);
+      else if (typeof object === "number" && (object & 0x3ffffff) === object)
+        return this._removeHashTableEntry$2(this._nums, object);
+      else
+        return this._remove$1(object);
+    },
+    _remove$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return false;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return false;
+      --this._collection$_length;
+      this._elements = null;
+      bucket.splice(index, 1);
+      return true;
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._elements = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+      }
+    },
+    _computeElements$0: function() {
+      var t1, result, strings, names, entries, index, i, nums, rest, bucket, $length, i0;
+      t1 = this._elements;
+      if (t1 != null)
+        return t1;
+      result = Array(this._collection$_length);
+      result.fixed$length = init;
+      strings = this._strings;
+      if (strings != null) {
+        names = Object.getOwnPropertyNames(strings);
+        entries = names.length;
+        for (index = 0, i = 0; i < entries; ++i) {
+          result[index] = names[i];
+          ++index;
+        }
+      } else
+        index = 0;
+      nums = this._nums;
+      if (nums != null) {
+        names = Object.getOwnPropertyNames(nums);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          result[index] = +names[i];
+          ++index;
+        }
+      }
+      rest = this._rest;
+      if (rest != null) {
+        names = Object.getOwnPropertyNames(rest);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          bucket = rest[names[i]];
+          $length = bucket.length;
+          for (i0 = 0; i0 < $length; ++i0) {
+            result[index] = bucket[i0];
+            ++index;
+          }
+        }
+      }
+      this._elements = result;
+      return result;
+    },
+    _addHashTableEntry$2: function(table, element) {
+      if (table[element] != null)
+        return false;
+      table[element] = 0;
+      ++this._collection$_length;
+      this._elements = null;
+      return true;
+    },
+    _removeHashTableEntry$2: function(table, element) {
+      if (table != null && table[element] != null) {
+        delete table[element];
+        --this._collection$_length;
+        this._elements = null;
+        return true;
+      } else
+        return false;
+    },
+    _computeHashCode$1: function(element) {
+      return J.get$hashCode$(element) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, element) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(bucket[i], element))
+          return i;
+      return -1;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {_HashSet__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  HashSetIterator: {
+    "^": "Object;_set,_elements,_offset,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var elements, offset, t1;
+      elements = this._elements;
+      offset = this._offset;
+      t1 = this._set;
+      if (elements !== t1._elements)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else if (offset >= elements.length) {
+        this._collection$_current = null;
+        return false;
+      } else {
+        this._collection$_current = elements[offset];
+        this._offset = offset + 1;
+        return true;
+      }
+    }
+  },
+  _LinkedHashSet: {
+    "^": "_HashSetBase;_collection$_length,_strings,_nums,_rest,_first,_last,_modifications",
+    get$iterator: function(_) {
+      var t1 = H.setRuntimeTypeInfo(new P.LinkedHashSetIterator(this, this._modifications, null, null), [null]);
+      t1._cell = t1._set._first;
+      return t1;
+    },
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    contains$1: function(_, object) {
+      var strings, nums;
+      if (typeof object === "string" && object !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          return false;
+        return strings[object] != null;
+      } else if (typeof object === "number" && (object & 0x3ffffff) === object) {
+        nums = this._nums;
+        if (nums == null)
+          return false;
+        return nums[object] != null;
+      } else
+        return this._contains$1(object);
+    },
+    _contains$1: function(object) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
+    },
+    lookup$1: function(object) {
+      var t1;
+      if (!(typeof object === "string" && object !== "__proto__"))
+        t1 = typeof object === "number" && (object & 0x3ffffff) === object;
+      else
+        t1 = true;
+      if (t1)
+        return this.contains$1(0, object) ? object : null;
+      else
+        return this._lookup$1(object);
+    },
+    _lookup$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return;
+      return J.get$_element$x(J.$index$asx(bucket, index));
+    },
+    forEach$1: function(_, action) {
+      var cell, modifications;
+      cell = this._first;
+      modifications = this._modifications;
+      for (; cell != null;) {
+        action.call$1(cell.get$_element(cell));
+        if (modifications !== this._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+        cell = cell.get$_next();
+      }
+    },
+    get$last: function(_) {
+      var t1 = this._last;
+      if (t1 == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return t1.get$_element(t1);
+    },
+    add$1: function(_, element) {
+      var strings, table, nums;
+      if (typeof element === "string" && element !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._strings = table;
+          strings = table;
+        }
+        return this._addHashTableEntry$2(strings, element);
+      } else if (typeof element === "number" && (element & 0x3ffffff) === element) {
+        nums = this._nums;
+        if (nums == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._nums = table;
+          nums = table;
+        }
+        return this._addHashTableEntry$2(nums, element);
+      } else
+        return this._add$1(0, element);
+    },
+    _add$1: function(_, element) {
+      var rest, hash, bucket;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._LinkedHashSet__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(element);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [this._newLinkedCell$1(element)];
+      else {
+        if (this._findBucketIndex$2(bucket, element) >= 0)
+          return false;
+        bucket.push(this._newLinkedCell$1(element));
+      }
+      return true;
+    },
+    remove$1: function(_, object) {
+      if (typeof object === "string" && object !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, object);
+      else if (typeof object === "number" && (object & 0x3ffffff) === object)
+        return this._removeHashTableEntry$2(this._nums, object);
+      else
+        return this._remove$1(object);
+    },
+    _remove$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return false;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return false;
+      this._unlinkCell$1(bucket.splice(index, 1)[0]);
+      return true;
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._last = null;
+        this._first = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+        this._modifications = this._modifications + 1 & 67108863;
+      }
+    },
+    _addHashTableEntry$2: function(table, element) {
+      if (table[element] != null)
+        return false;
+      table[element] = this._newLinkedCell$1(element);
+      return true;
+    },
+    _removeHashTableEntry$2: function(table, element) {
+      var cell;
+      if (table == null)
+        return false;
+      cell = table[element];
+      if (cell == null)
+        return false;
+      this._unlinkCell$1(cell);
+      delete table[element];
+      return true;
+    },
+    _newLinkedCell$1: function(element) {
+      var cell, last;
+      cell = new P.LinkedHashSetCell(element, null, null);
+      if (this._first == null) {
+        this._last = cell;
+        this._first = cell;
+      } else {
+        last = this._last;
+        cell._previous = last;
+        last.set$_next(cell);
+        this._last = cell;
+      }
+      ++this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+      return cell;
+    },
+    _unlinkCell$1: function(cell) {
+      var previous, next;
+      previous = cell.get$_previous();
+      next = cell.get$_next();
+      if (previous == null)
+        this._first = next;
+      else
+        previous.set$_next(next);
+      if (next == null)
+        this._last = previous;
+      else
+        next.set$_previous(previous);
+      --this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+    },
+    _computeHashCode$1: function(element) {
+      return J.get$hashCode$(element) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, element) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(J.get$_element$x(bucket[i]), element))
+          return i;
+      return -1;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {_LinkedHashSet__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  LinkedHashSetCell: {
+    "^": "Object;_element>,_next@,_previous@"
+  },
+  LinkedHashSetIterator: {
+    "^": "Object;_set,_modifications,_cell,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._set;
+      if (this._modifications !== t1._modifications)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else {
+        t1 = this._cell;
+        if (t1 == null) {
+          this._collection$_current = null;
+          return false;
+        } else {
+          this._collection$_current = t1.get$_element(t1);
+          this._cell = this._cell.get$_next();
+          return true;
+        }
+      }
+    }
+  },
+  UnmodifiableListView: {
+    "^": "UnmodifiableListBase;_collection$_source",
+    get$length: function(_) {
+      return this._collection$_source.length;
+    },
+    $index: function(_, index) {
+      var t1 = this._collection$_source;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    }
+  },
+  _HashSetBase: {
+    "^": "SetBase;"
+  },
+  IterableBase: {
+    "^": "Object;",
+    map$1: [function(_, f) {
+      return H.MappedIterable_MappedIterable(this, f, H.getRuntimeTypeArgument(this, "IterableBase", 0), null);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E1", ret: P.Iterable, args: [{func: "dynamic__E1", args: [E]}]};
+      }, this.$receiver, "IterableBase");
+    }, 31],
+    where$1: function(_, f) {
+      return H.setRuntimeTypeInfo(new H.WhereIterable(this, f), [H.getRuntimeTypeArgument(this, "IterableBase", 0)]);
+    },
+    expand$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(this, f), [H.getRuntimeTypeArgument(this, "IterableBase", 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E0", ret: P.Iterable, args: [{func: "Iterable__E0", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "IterableBase");
+    }, 31],
+    contains$1: function(_, element) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (J.$eq(t1.get$current(), element))
+          return true;
+      return false;
+    },
+    forEach$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        f.call$1(t1.get$current());
+    },
+    join$1: function(_, separator) {
+      var iterator, buffer, t1;
+      iterator = this.get$iterator(this);
+      if (!iterator.moveNext$0())
+        return "";
+      buffer = P.StringBuffer$("");
+      if (separator === "")
+        do {
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        } while (iterator.moveNext$0());
+      else {
+        buffer.write$1(H.S(iterator.get$current()));
+        for (; iterator.moveNext$0();) {
+          buffer._contents += separator;
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        }
+      }
+      return buffer._contents;
+    },
+    any$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (f.call$1(t1.get$current()) === true)
+          return true;
+      return false;
+    },
+    toList$1$growable: function(_, growable) {
+      return P.List_List$from(this, growable, H.getRuntimeTypeArgument(this, "IterableBase", 0));
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    get$length: function(_) {
+      var it, count;
+      it = this.get$iterator(this);
+      for (count = 0; it.moveNext$0();)
+        ++count;
+      return count;
+    },
+    get$isEmpty: function(_) {
+      return !this.get$iterator(this).moveNext$0();
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$isEmpty(this) !== true;
+    },
+    get$last: function(_) {
+      var it, result;
+      it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      do
+        result = it.get$current();
+      while (it.moveNext$0());
+      return result;
+    },
+    elementAt$1: function(_, index) {
+      var t1, remaining, element, t2;
+      if (typeof index !== "number" || Math.floor(index) !== index || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      for (t1 = this.get$iterator(this), remaining = index; t1.moveNext$0();) {
+        element = t1.get$current();
+        t2 = J.getInterceptor(remaining);
+        if (t2.$eq(remaining, 0))
+          return element;
+        remaining = t2.$sub(remaining, 1);
+      }
+      throw H.wrapException(P.RangeError$value(index));
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToShortString(this, "(", ")");
+    },
+    $isIterable: true,
+    $asIterable: null
+  },
+  ListBase: {
+    "^": "Object_ListMixin;"
+  },
+  Object_ListMixin: {
+    "^": "Object+ListMixin;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  ListMixin: {
+    "^": "Object;",
+    get$iterator: function(receiver) {
+      return H.setRuntimeTypeInfo(new H.ListIterator(receiver, this.get$length(receiver), 0, null), [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+    },
+    elementAt$1: function(receiver, index) {
+      return this.$index(receiver, index);
+    },
+    forEach$1: function(receiver, action) {
+      var $length, i;
+      $length = this.get$length(receiver);
+      for (i = 0; i < $length; ++i) {
+        action.call$1(this.$index(receiver, i));
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+    },
+    get$isEmpty: function(receiver) {
+      return this.get$length(receiver) === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return !this.get$isEmpty(receiver);
+    },
+    get$last: function(receiver) {
+      if (this.get$length(receiver) === 0)
+        throw H.wrapException(P.StateError$("No elements"));
+      return this.$index(receiver, this.get$length(receiver) - 1);
+    },
+    contains$1: function(receiver, element) {
+      var $length, i;
+      $length = this.get$length(receiver);
+      for (i = 0; i < this.get$length(receiver); ++i) {
+        if (J.$eq(this.$index(receiver, i), element))
+          return true;
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return false;
+    },
+    any$1: function(receiver, test) {
+      var $length, i;
+      $length = this.get$length(receiver);
+      for (i = 0; i < $length; ++i) {
+        if (test.call$1(this.$index(receiver, i)) === true)
+          return true;
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return false;
+    },
+    join$1: function(receiver, separator) {
+      var buffer;
+      if (this.get$length(receiver) === 0)
+        return "";
+      buffer = P.StringBuffer$("");
+      buffer.writeAll$2(receiver, separator);
+      return buffer._contents;
+    },
+    where$1: function(receiver, test) {
+      return H.setRuntimeTypeInfo(new H.WhereIterable(receiver, test), [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+    },
+    map$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(receiver, f), [null, null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E2", ret: P.Iterable, args: [{func: "dynamic__E2", args: [E]}]};
+      }, this.$receiver, "ListMixin");
+    }, 31],
+    expand$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(receiver, f), [H.getRuntimeTypeArgument(receiver, "ListMixin", 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E1", ret: P.Iterable, args: [{func: "Iterable__E1", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "ListMixin");
+    }, 31],
+    skip$1: function(receiver, count) {
+      return H.SubListIterable$(receiver, count, null, null);
+    },
+    toList$1$growable: function(receiver, growable) {
+      var result, t1, i;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(receiver));
+      } else {
+        t1 = Array(this.get$length(receiver));
+        t1.fixed$length = init;
+        result = H.setRuntimeTypeInfo(t1, [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+      }
+      for (i = 0; i < this.get$length(receiver); ++i) {
+        t1 = this.$index(receiver, i);
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t1;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    add$1: function(receiver, element) {
+      var t1 = this.get$length(receiver);
+      this.set$length(receiver, t1 + 1);
+      this.$indexSet(receiver, t1, element);
+    },
+    addAll$1: function(receiver, iterable) {
+      var t1, element, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();) {
+        element = t1._current;
+        t2 = this.get$length(receiver);
+        this.set$length(receiver, t2 + 1);
+        this.$indexSet(receiver, t2, element);
+      }
+    },
+    clear$0: function(receiver) {
+      this.set$length(receiver, 0);
+    },
+    sort$1: function(receiver, compare) {
+      if (compare == null)
+        compare = P.Comparable_compare$closure();
+      H.Sort__doSort(receiver, 0, this.get$length(receiver) - 1, compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    _rangeCheck$2: function(receiver, start, end) {
+      var t1 = J.getInterceptor$n(start);
+      if (t1.$lt(start, 0) || t1.$gt(start, this.get$length(receiver)))
+        throw H.wrapException(P.RangeError$range(start, 0, this.get$length(receiver)));
+      t1 = J.getInterceptor$n(end);
+      if (t1.$lt(end, start) || t1.$gt(end, this.get$length(receiver)))
+        throw H.wrapException(P.RangeError$range(end, start, this.get$length(receiver)));
+    },
+    getRange$2: function(receiver, start, end) {
+      this._rangeCheck$2(receiver, start, end);
+      return H.SubListIterable$(receiver, start, end, null);
+    },
+    removeRange$2: function(receiver, start, end) {
+      var $length;
+      this._rangeCheck$2(receiver, start, end);
+      $length = end - start;
+      this.setRange$4(receiver, start, this.get$length(receiver) - $length, receiver, end);
+      this.set$length(receiver, this.get$length(receiver) - $length);
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      var $length, t1, otherStart, otherList, i;
+      if (start < 0 || start > this.get$length(receiver))
+        H.throwExpression(P.RangeError$range(start, 0, this.get$length(receiver)));
+      if (end < start || end > this.get$length(receiver))
+        H.throwExpression(P.RangeError$range(end, start, this.get$length(receiver)));
+      $length = end - start;
+      if ($length === 0)
+        return;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      t1 = J.getInterceptor(iterable);
+      if (!!t1.$isList) {
+        otherStart = skipCount;
+        otherList = iterable;
+      } else {
+        otherList = t1.skip$1(iterable, skipCount).toList$1$growable(0, false);
+        otherStart = 0;
+      }
+      t1 = J.getInterceptor$asx(otherList);
+      if (otherStart + $length > t1.get$length(otherList))
+        throw H.wrapException(P.StateError$("Not enough elements"));
+      if (otherStart < start)
+        for (i = $length - 1; i >= 0; --i)
+          this.$indexSet(receiver, start + i, t1.$index(otherList, otherStart + i));
+      else
+        for (i = 0; i < $length; ++i)
+          this.$indexSet(receiver, start + i, t1.$index(otherList, otherStart + i));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    indexOf$2: function(receiver, element, startIndex) {
+      var i;
+      if (startIndex >= this.get$length(receiver))
+        return -1;
+      for (i = startIndex; i < this.get$length(receiver); ++i)
+        if (J.$eq(this.$index(receiver, i), element))
+          return i;
+      return -1;
+    },
+    indexOf$1: function($receiver, element) {
+      return this.indexOf$2($receiver, element, 0);
+    },
+    lastIndexOf$2: function(receiver, element, startIndex) {
+      var i;
+      startIndex = this.get$length(receiver) - 1;
+      for (i = startIndex; i >= 0; --i)
+        if (J.$eq(this.$index(receiver, i), element))
+          return i;
+      return -1;
+    },
+    lastIndexOf$1: function($receiver, element) {
+      return this.lastIndexOf$2($receiver, element, null);
+    },
+    insert$2: function(receiver, index, element) {
+      if (index > this.get$length(receiver))
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(receiver)));
+      if (index === this.get$length(receiver)) {
+        this.add$1(receiver, element);
+        return;
+      }
+      this.set$length(receiver, this.get$length(receiver) + 1);
+      this.setRange$4(receiver, index + 1, this.get$length(receiver), receiver, index);
+      this.$indexSet(receiver, index, element);
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      var t1, insertionLength;
+      if (index < 0 || index > this.get$length(receiver))
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(receiver)));
+      t1 = J.getInterceptor(iterable);
+      if (!!t1.$isEfficientLength)
+        iterable = t1.toList$0(iterable);
+      insertionLength = J.get$length$asx(iterable);
+      this.set$length(receiver, this.get$length(receiver) + insertionLength);
+      this.setRange$4(receiver, index + insertionLength, this.get$length(receiver), receiver, index);
+      this.setAll$2(receiver, index, iterable);
+    },
+    setAll$2: function(receiver, index, iterable) {
+      var t1, index0;
+      t1 = J.getInterceptor(iterable);
+      if (!!t1.$isList)
+        this.setRange$3(receiver, index, index + t1.get$length(iterable), iterable);
+      else
+        for (t1 = t1.get$iterator(iterable); t1.moveNext$0(); index = index0) {
+          index0 = index + 1;
+          this.$indexSet(receiver, index, t1.get$current());
+        }
+    },
+    toString$0: function(receiver) {
+      return P.IterableBase_iterableToFullString(receiver, "[", "]");
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  Maps_mapToString_closure: {
+    "^": "Closure:75;box_0,result_1",
+    call$2: function(k, v) {
+      var t1 = this.box_0;
+      if (!t1.first_0)
+        this.result_1.write$1(", ");
+      t1.first_0 = false;
+      t1 = this.result_1;
+      t1.write$1(k);
+      t1.write$1(": ");
+      t1.write$1(v);
+    },
+    $isFunction: true
+  },
+  ListQueue: {
+    "^": "IterableBase;_collection$_table,_head,_tail,_modificationCount",
+    get$iterator: function(_) {
+      var t1 = new P._ListQueueIterator(this, this._tail, this._modificationCount, this._head, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    forEach$1: function(_, action) {
+      var modificationCount, i, t1;
+      modificationCount = this._modificationCount;
+      for (i = this._head; i !== this._tail; i = (i + 1 & this._collection$_table.length - 1) >>> 0) {
+        t1 = this._collection$_table;
+        if (i < 0 || i >= t1.length)
+          return H.ioore(t1, i);
+        action.call$1(t1[i]);
+        if (modificationCount !== this._modificationCount)
+          H.throwExpression(P.ConcurrentModificationError$(this));
+      }
+    },
+    get$isEmpty: function(_) {
+      return this._head === this._tail;
+    },
+    get$length: function(_) {
+      return (this._tail - this._head & this._collection$_table.length - 1) >>> 0;
+    },
+    get$last: function(_) {
+      var t1, t2, t3;
+      t1 = this._head;
+      t2 = this._tail;
+      if (t1 === t2)
+        throw H.wrapException(H.IterableElementError_noElement());
+      t1 = this._collection$_table;
+      t3 = t1.length;
+      t2 = (t2 - 1 & t3 - 1) >>> 0;
+      if (t2 < 0 || t2 >= t3)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    toList$1$growable: function(_, growable) {
+      var list, t1;
+      if (growable) {
+        list = H.setRuntimeTypeInfo([], [H.getTypeArgumentByIndex(this, 0)]);
+        C.JSArray_methods.set$length(list, this.get$length(this));
+      } else {
+        t1 = Array(this.get$length(this));
+        t1.fixed$length = init;
+        list = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      }
+      this._writeToList$1(list);
+      return list;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    add$1: function(_, element) {
+      this._add$1(0, element);
+    },
+    addAll$1: function(_, elements) {
+      var addCount, $length, t1, t2, t3, newCapacity, newTable, endSpace, preSpace;
+      addCount = elements.length;
+      $length = this.get$length(this);
+      t1 = $length + addCount;
+      t2 = this._collection$_table;
+      t3 = t2.length;
+      if (t1 >= t3) {
+        newCapacity = P.ListQueue__nextPowerOf2(t1);
+        if (typeof newCapacity !== "number")
+          return H.iae(newCapacity);
+        t2 = Array(newCapacity);
+        t2.fixed$length = init;
+        newTable = H.setRuntimeTypeInfo(t2, [H.getTypeArgumentByIndex(this, 0)]);
+        this._tail = this._writeToList$1(newTable);
+        this._collection$_table = newTable;
+        this._head = 0;
+        H.IterableMixinWorkaround_setRangeList(newTable, $length, t1, elements, 0);
+        this._tail += addCount;
+      } else {
+        t1 = this._tail;
+        endSpace = t3 - t1;
+        if (addCount < endSpace) {
+          H.IterableMixinWorkaround_setRangeList(t2, t1, t1 + addCount, elements, 0);
+          this._tail += addCount;
+        } else {
+          preSpace = addCount - endSpace;
+          H.IterableMixinWorkaround_setRangeList(t2, t1, t1 + endSpace, elements, 0);
+          t1 = this._collection$_table;
+          H.IterableMixinWorkaround_setRangeList(t1, 0, preSpace, elements, endSpace);
+          this._tail = preSpace;
+        }
+      }
+      ++this._modificationCount;
+    },
+    clear$0: function(_) {
+      var i, t1, t2, t3, t4;
+      i = this._head;
+      t1 = this._tail;
+      if (i !== t1) {
+        for (t2 = this._collection$_table, t3 = t2.length, t4 = t3 - 1; i !== t1; i = (i + 1 & t4) >>> 0) {
+          if (i < 0 || i >= t3)
+            return H.ioore(t2, i);
+          t2[i] = null;
+        }
+        this._tail = 0;
+        this._head = 0;
+        ++this._modificationCount;
+      }
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    removeFirst$0: function() {
+      var t1, t2, t3, result;
+      t1 = this._head;
+      if (t1 === this._tail)
+        throw H.wrapException(H.IterableElementError_noElement());
+      ++this._modificationCount;
+      t2 = this._collection$_table;
+      t3 = t2.length;
+      if (t1 >= t3)
+        return H.ioore(t2, t1);
+      result = t2[t1];
+      t2[t1] = null;
+      this._head = (t1 + 1 & t3 - 1) >>> 0;
+      return result;
+    },
+    _add$1: function(_, element) {
+      var t1, t2, t3;
+      t1 = this._collection$_table;
+      t2 = this._tail;
+      t3 = t1.length;
+      if (t2 < 0 || t2 >= t3)
+        return H.ioore(t1, t2);
+      t1[t2] = element;
+      t3 = (t2 + 1 & t3 - 1) >>> 0;
+      this._tail = t3;
+      if (this._head === t3)
+        this._grow$0();
+      ++this._modificationCount;
+    },
+    _grow$0: function() {
+      var t1, newTable, t2, split;
+      t1 = Array(this._collection$_table.length * 2);
+      t1.fixed$length = init;
+      newTable = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      t1 = this._collection$_table;
+      t2 = this._head;
+      split = t1.length - t2;
+      H.IterableMixinWorkaround_setRangeList(newTable, 0, split, t1, t2);
+      t1 = this._head;
+      t2 = this._collection$_table;
+      H.IterableMixinWorkaround_setRangeList(newTable, split, split + t1, t2, 0);
+      this._head = 0;
+      this._tail = this._collection$_table.length;
+      this._collection$_table = newTable;
+    },
+    _writeToList$1: function(target) {
+      var t1, t2, t3, $length, firstPartSize;
+      t1 = this._head;
+      t2 = this._tail;
+      t3 = this._collection$_table;
+      if (t1 <= t2) {
+        $length = t2 - t1;
+        H.IterableMixinWorkaround_setRangeList(target, 0, $length, t3, t1);
+        return $length;
+      } else {
+        firstPartSize = t3.length - t1;
+        H.IterableMixinWorkaround_setRangeList(target, 0, firstPartSize, t3, t1);
+        t1 = this._tail;
+        t2 = this._collection$_table;
+        H.IterableMixinWorkaround_setRangeList(target, firstPartSize, firstPartSize + t1, t2, 0);
+        return this._tail + firstPartSize;
+      }
+    },
+    ListQueue$1: function(initialCapacity, $E) {
+      var t1 = Array(8);
+      t1.fixed$length = init;
+      this._collection$_table = H.setRuntimeTypeInfo(t1, [$E]);
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {"^": "ListQueue__INITIAL_CAPACITY", ListQueue__nextPowerOf2: function(number) {
+        var nextNumber;
+        if (typeof number !== "number")
+          return number.$shl();
+        number = (number << 2 >>> 0) - 1;
+        for (; true; number = nextNumber) {
+          nextNumber = (number & number - 1) >>> 0;
+          if (nextNumber === 0)
+            return number;
+        }
+      }}
+  },
+  _ListQueueIterator: {
+    "^": "Object;_queue,_end,_modificationCount,_collection$_position,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1, t2, t3;
+      t1 = this._queue;
+      if (this._modificationCount !== t1._modificationCount)
+        H.throwExpression(P.ConcurrentModificationError$(t1));
+      t2 = this._collection$_position;
+      if (t2 === this._end) {
+        this._collection$_current = null;
+        return false;
+      }
+      t1 = t1._collection$_table;
+      t3 = t1.length;
+      if (t2 >= t3)
+        return H.ioore(t1, t2);
+      this._collection$_current = t1[t2];
+      this._collection$_position = (t2 + 1 & t3 - 1) >>> 0;
+      return true;
+    }
+  },
+  SetMixin: {
+    "^": "Object;",
+    get$isEmpty: function(_) {
+      return this.get$length(this) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$length(this) !== 0;
+    },
+    clear$0: function(_) {
+      this.removeAll$1(this.toList$0(0));
+    },
+    addAll$1: function(_, elements) {
+      var t1;
+      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
+        this.add$1(0, t1.get$current());
+    },
+    removeAll$1: function(elements) {
+      var t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(elements, elements.length, 0, null), [H.getTypeArgumentByIndex(elements, 0)]); t1.moveNext$0();)
+        this.remove$1(0, t1._current);
+    },
+    toList$1$growable: function(_, growable) {
+      var result, t1, i, element, i0;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getTypeArgumentByIndex(this, 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(this));
+      } else {
+        t1 = Array(this.get$length(this));
+        t1.fixed$length = init;
+        result = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      }
+      for (t1 = this.get$iterator(this), i = 0; t1.moveNext$0(); i = i0) {
+        element = t1.get$current();
+        i0 = i + 1;
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = element;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    map$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(this, f), [H.getTypeArgumentByIndex(this, 0), null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E3", ret: P.Iterable, args: [{func: "dynamic__E3", args: [E]}]};
+      }, this.$receiver, "SetMixin");
+    }, 31],
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    where$1: function(_, f) {
+      var t1 = new H.WhereIterable(this, f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    expand$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(this, f), [H.getTypeArgumentByIndex(this, 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E2", ret: P.Iterable, args: [{func: "Iterable__E2", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "SetMixin");
+    }, 31],
+    forEach$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        f.call$1(t1.get$current());
+    },
+    join$1: function(_, separator) {
+      var iterator, buffer, t1;
+      iterator = this.get$iterator(this);
+      if (!iterator.moveNext$0())
+        return "";
+      buffer = P.StringBuffer$("");
+      if (separator === "")
+        do {
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        } while (iterator.moveNext$0());
+      else {
+        buffer.write$1(H.S(iterator.get$current()));
+        for (; iterator.moveNext$0();) {
+          buffer._contents += separator;
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        }
+      }
+      return buffer._contents;
+    },
+    any$1: function(_, test) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (test.call$1(t1.get$current()) === true)
+          return true;
+      return false;
+    },
+    get$last: function(_) {
+      var it, result;
+      it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      do
+        result = it.get$current();
+      while (it.moveNext$0());
+      return result;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  SetBase: {
+    "^": "SetMixin;"
+  },
+  _SplayTreeNode: {
+    "^": "Object;key>,left>,right>",
+    $is_SplayTreeNode: true
+  },
+  _SplayTreeMapNode: {
+    "^": "_SplayTreeNode;value*,key,left,right",
+    $as_SplayTreeNode: function($K, $V) {
+      return [$K];
+    }
+  },
+  _SplayTree: {
+    "^": "Object;",
+    _splay$1: function(key) {
+      var current, left, right, left0, comp, t1, tmp, current0;
+      current = this._root;
+      if (current == null)
+        return -1;
+      left = this._dummy;
+      for (right = left, left0 = right, comp = null; true;) {
+        comp = this._compare$2(current.key, key);
+        t1 = J.getInterceptor$n(comp);
+        if (t1.$gt(comp, 0)) {
+          t1 = current.left;
+          if (t1 == null)
+            break;
+          comp = this._compare$2(t1.key, key);
+          if (J.$gt$n(comp, 0)) {
+            tmp = current.left;
+            current.left = tmp.right;
+            tmp.right = current;
+            if (tmp.left == null) {
+              current = tmp;
+              break;
+            }
+            current = tmp;
+          }
+          right.left = current;
+          current0 = current.left;
+          right = current;
+          current = current0;
+        } else {
+          if (t1.$lt(comp, 0)) {
+            t1 = current.right;
+            if (t1 == null)
+              break;
+            comp = this._compare$2(t1.key, key);
+            if (J.$lt$n(comp, 0)) {
+              tmp = current.right;
+              current.right = tmp.left;
+              tmp.left = current;
+              if (tmp.right == null) {
+                current = tmp;
+                break;
+              }
+              current = tmp;
+            }
+            left0.right = current;
+            current0 = current.right;
+          } else
+            break;
+          left0 = current;
+          current = current0;
+        }
+      }
+      left0.right = current.left;
+      right.left = current.right;
+      current.left = left.right;
+      current.right = left.left;
+      this._root = current;
+      left.right = null;
+      left.left = null;
+      ++this._splayCount;
+      return comp;
+    },
+    _addNewRoot$2: function(node, comp) {
+      var t1, t2;
+      ++this._count;
+      ++this._modificationCount;
+      if (this._root == null) {
+        this._root = node;
+        return;
+      }
+      t1 = J.$lt$n(comp, 0);
+      t2 = this._root;
+      if (t1) {
+        node.left = t2;
+        node.right = t2.right;
+        t2.right = null;
+      } else {
+        node.right = t2;
+        node.left = t2.left;
+        t2.left = null;
+      }
+      this._root = node;
+    }
+  },
+  SplayTreeMap: {
+    "^": "_SplayTree;_comparator,_validKey,_root,_dummy,_count,_modificationCount,_splayCount",
+    _comparator$2: function(arg0, arg1) {
+      return this._comparator.call$2(arg0, arg1);
+    },
+    _validKey$1: function(arg0) {
+      return this._validKey.call$1(arg0);
+    },
+    _compare$2: function(key1, key2) {
+      return this._comparator$2(key1, key2);
+    },
+    $index: function(_, key) {
+      if (key == null)
+        throw H.wrapException(P.ArgumentError$(key));
+      if (this._validKey$1(key) !== true)
+        return;
+      if (this._root != null)
+        if (J.$eq(this._splay$1(key), 0))
+          return this._root.value;
+      return;
+    },
+    $indexSet: function(_, key, value) {
+      var comp;
+      if (key == null)
+        throw H.wrapException(P.ArgumentError$(key));
+      comp = this._splay$1(key);
+      if (J.$eq(comp, 0)) {
+        this._root.value = value;
+        return;
+      }
+      this._addNewRoot$2(H.setRuntimeTypeInfo(new P._SplayTreeMapNode(value, key, null, null), [null, null]), comp);
+    },
+    addAll$1: function(_, other) {
+      H.IterableMixinWorkaround_forEach(other, new P.SplayTreeMap_addAll_closure(this));
+    },
+    get$isEmpty: function(_) {
+      return this._root == null;
+    },
+    get$isNotEmpty: function(_) {
+      return this._root != null;
+    },
+    forEach$1: function(_, f) {
+      var t1, nodes, node;
+      t1 = H.getTypeArgumentByIndex(this, 0);
+      nodes = H.setRuntimeTypeInfo(new P._SplayTreeNodeIterator(this, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), this._modificationCount, this._splayCount, null), [t1]);
+      nodes._SplayTreeIterator$1(this, [P._SplayTreeNode, t1]);
+      for (; nodes.moveNext$0();) {
+        node = nodes.get$current();
+        t1 = J.getInterceptor$x(node);
+        f.call$2(t1.get$key(node), t1.get$value(node));
+      }
+    },
+    get$length: function(_) {
+      return this._count;
+    },
+    clear$0: function(_) {
+      this._root = null;
+      this._count = 0;
+      ++this._modificationCount;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new P._SplayTreeKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      var t1 = new P._SplayTreeValueIterable(this);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    $isSplayTreeMap: true,
+    $as_SplayTree: function($K, $V) {
+      return [$K];
+    },
+    $asMap: null,
+    $isMap: true,
+    static: {SplayTreeMap$: function(compare, isValidKey, $K, $V) {
+        var t1, t2;
+        t1 = P.Comparable_compare$closure();
+        t2 = new P.SplayTreeMap_closure($K);
+        return H.setRuntimeTypeInfo(new P.SplayTreeMap(t1, t2, null, H.setRuntimeTypeInfo(new P._SplayTreeNode(null, null, null), [$K]), 0, 0, 0), [$K, $V]);
+      }}
+  },
+  SplayTreeMap_closure: {
+    "^": "Closure:13;K_0",
+    call$1: function(v) {
+      var t1 = H.checkSubtypeOfRuntimeType(v, this.K_0);
+      return t1;
+    },
+    $isFunction: true
+  },
+  SplayTreeMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V1", args: [K, V]};
+      }, this.this_0, "SplayTreeMap");
+    }
+  },
+  _SplayTreeIterator: {
+    "^": "Object;",
+    get$current: function() {
+      var t1 = this._currentNode;
+      if (t1 == null)
+        return;
+      return this._getValue$1(t1);
+    },
+    _findLeftMostDescendent$1: function(node) {
+      var t1;
+      for (t1 = this._workList; node != null;) {
+        t1.push(node);
+        node = node.left;
+      }
+    },
+    moveNext$0: function() {
+      var t1, t2, t3;
+      t1 = this._tree;
+      if (this._modificationCount !== t1._modificationCount)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      t2 = this._workList;
+      if (t2.length === 0) {
+        this._currentNode = null;
+        return false;
+      }
+      if (t1._splayCount !== this._splayCount && this._currentNode != null) {
+        t3 = this._currentNode;
+        C.JSArray_methods.set$length(t2, 0);
+        if (t3 == null)
+          this._findLeftMostDescendent$1(t1._root);
+        else {
+          t1._splay$1(t3.key);
+          this._findLeftMostDescendent$1(t1._root.right);
+        }
+      }
+      if (0 >= t2.length)
+        return H.ioore(t2, 0);
+      t1 = t2.pop();
+      this._currentNode = t1;
+      this._findLeftMostDescendent$1(t1.right);
+      return true;
+    },
+    _SplayTreeIterator$1: function(tree, $T) {
+      this._findLeftMostDescendent$1(tree._root);
+    }
+  },
+  _SplayTreeKeyIterable: {
+    "^": "IterableBase;_tree",
+    get$length: function(_) {
+      return this._tree._count;
+    },
+    get$isEmpty: function(_) {
+      return this._tree._count === 0;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._tree;
+      t2 = new P._SplayTreeKeyIterator(t1, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), t1._modificationCount, t1._splayCount, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      t2._SplayTreeIterator$1(t1, H.getTypeArgumentByIndex(this, 0));
+      return t2;
+    },
+    $isEfficientLength: true
+  },
+  _SplayTreeValueIterable: {
+    "^": "IterableBase;_map",
+    get$length: function(_) {
+      return this._map._count;
+    },
+    get$isEmpty: function(_) {
+      return this._map._count === 0;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._map;
+      t2 = new P._SplayTreeValueIterator(t1, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), t1._modificationCount, t1._splayCount, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      t2._SplayTreeIterator$1(t1, H.getTypeArgumentByIndex(this, 1));
+      return t2;
+    },
+    $asIterableBase: function($K, $V) {
+      return [$V];
+    },
+    $asIterable: function($K, $V) {
+      return [$V];
+    },
+    $isEfficientLength: true
+  },
+  _SplayTreeKeyIterator: {
+    "^": "_SplayTreeIterator;_tree,_workList,_modificationCount,_splayCount,_currentNode",
+    _getValue$1: function(node) {
+      return node.key;
+    }
+  },
+  _SplayTreeValueIterator: {
+    "^": "_SplayTreeIterator;_tree,_workList,_modificationCount,_splayCount,_currentNode",
+    _getValue$1: function(node) {
+      return node.value;
+    },
+    $as_SplayTreeIterator: function($K, $V) {
+      return [$V];
+    }
+  },
+  _SplayTreeNodeIterator: {
+    "^": "_SplayTreeIterator;_tree,_workList,_modificationCount,_splayCount,_currentNode",
+    _getValue$1: function(node) {
+      return node;
+    },
+    $as_SplayTreeIterator: function($K) {
+      return [[P._SplayTreeNode, $K]];
+    }
+  }
+}],
+["dart.convert", "dart:convert", , P, {
+  "^": "",
+  _convertJsonToDart: function(json, reviver) {
+    var revive = reviver == null ? new P._convertJsonToDart_closure() : reviver;
+    return revive.call$2(null, new P._convertJsonToDart_walk(revive).call$1(json));
+  },
+  _parseJson: function(source, reviver) {
+    var parsed, e, t1, exception;
+    t1 = source;
+    if (typeof t1 !== "string")
+      throw H.wrapException(P.ArgumentError$(source));
+    parsed = null;
+    try {
+      parsed = JSON.parse(source);
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      e = t1;
+      throw H.wrapException(P.FormatException$(String(e)));
+    }
+
+    return P._convertJsonToDart(parsed, reviver);
+  },
+  _defaultToEncodable: [function(object) {
+    return object.toJson$0();
+  }, "call$1", "_defaultToEncodable$closure", 2, 0, 49, 50],
+  _convertJsonToDart_closure: {
+    "^": "Closure:75;",
+    call$2: function(key, value) {
+      return value;
+    },
+    $isFunction: true
+  },
+  _convertJsonToDart_walk: {
+    "^": "Closure:13;revive_0",
+    call$1: function(e) {
+      var list, t1, i, keys, map, key, proto;
+      if (e == null || typeof e != "object")
+        return e;
+      if (Object.getPrototypeOf(e) === Array.prototype) {
+        list = e;
+        for (t1 = this.revive_0, i = 0; i < list.length; ++i)
+          list[i] = t1.call$2(i, this.call$1(list[i]));
+        return list;
+      }
+      keys = Object.keys(e);
+      map = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      for (t1 = this.revive_0, i = 0; i < keys.length; ++i) {
+        key = keys[i];
+        map.$indexSet(0, key, t1.call$2(key, this.call$1(e[key])));
+      }
+      proto = e.__proto__;
+      if (typeof proto !== "undefined" && proto !== Object.prototype)
+        map.$indexSet(0, "__proto__", t1.call$2("__proto__", this.call$1(proto)));
+      return map;
+    },
+    $isFunction: true
+  },
+  Codec: {
+    "^": "Object;"
+  },
+  Converter: {
+    "^": "Object;"
+  },
+  Encoding: {
+    "^": "Codec;",
+    $asCodec: function() {
+      return [P.String, [P.List, P.$int]];
+    }
+  },
+  JsonUnsupportedObjectError: {
+    "^": "Error;unsupportedObject,cause",
+    toString$0: function(_) {
+      if (this.cause != null)
+        return "Converting object to an encodable object failed.";
+      else
+        return "Converting object did not return an encodable object.";
+    },
+    static: {JsonUnsupportedObjectError$: function(unsupportedObject, cause) {
+        return new P.JsonUnsupportedObjectError(unsupportedObject, cause);
+      }}
+  },
+  JsonCyclicError: {
+    "^": "JsonUnsupportedObjectError;unsupportedObject,cause",
+    toString$0: function(_) {
+      return "Cyclic error in JSON stringify";
+    },
+    static: {JsonCyclicError$: function(object) {
+        return new P.JsonCyclicError(object, null);
+      }}
+  },
+  JsonCodec: {
+    "^": "Codec;_reviver<,_toEncodable",
+    decode$2$reviver: function(source, reviver) {
+      return P._parseJson(source, this.get$decoder()._reviver);
+    },
+    decode$1: function(source) {
+      return this.decode$2$reviver(source, null);
+    },
+    encode$2$toEncodable: function(value, toEncodable) {
+      var t1 = this.get$encoder();
+      return P._JsonStringifier_stringify(value, t1._toEncodableFunction, t1.indent);
+    },
+    encode$1: function(value) {
+      return this.encode$2$toEncodable(value, null);
+    },
+    get$encoder: function() {
+      return C.JsonEncoder_null_null;
+    },
+    get$decoder: function() {
+      return C.JsonDecoder_null;
+    },
+    $asCodec: function() {
+      return [P.Object, P.String];
+    }
+  },
+  JsonEncoder: {
+    "^": "Converter;indent,_toEncodableFunction",
+    $asConverter: function() {
+      return [P.Object, P.String];
+    }
+  },
+  JsonDecoder: {
+    "^": "Converter;_reviver<",
+    $asConverter: function() {
+      return [P.String, P.Object];
+    }
+  },
+  _JsonStringifier: {
+    "^": "Object;_toEncodable,_sink,_convert$_seen",
+    _toEncodable$1: function(arg0) {
+      return this._toEncodable.call$1(arg0);
+    },
+    escape$1: function(s) {
+      var t1, $length, t2, offset, i, charCode, t3;
+      t1 = J.getInterceptor$asx(s);
+      $length = t1.get$length(s);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      t2 = this._sink;
+      offset = 0;
+      i = 0;
+      for (; i < $length; ++i) {
+        charCode = t1.codeUnitAt$1(s, i);
+        if (charCode > 92)
+          continue;
+        if (charCode < 32) {
+          if (i > offset) {
+            t3 = t1.substring$2(s, offset, i);
+            t2._contents += t3;
+          }
+          offset = i + 1;
+          t3 = H.Primitives_stringFromCharCode(92);
+          t2._contents += t3;
+          switch (charCode) {
+            case 8:
+              t3 = H.Primitives_stringFromCharCode(98);
+              t2._contents += t3;
+              break;
+            case 9:
+              t3 = H.Primitives_stringFromCharCode(116);
+              t2._contents += t3;
+              break;
+            case 10:
+              t3 = H.Primitives_stringFromCharCode(110);
+              t2._contents += t3;
+              break;
+            case 12:
+              t3 = H.Primitives_stringFromCharCode(102);
+              t2._contents += t3;
+              break;
+            case 13:
+              t3 = H.Primitives_stringFromCharCode(114);
+              t2._contents += t3;
+              break;
+            default:
+              t3 = H.Primitives_stringFromCharCode(117);
+              t2._contents += t3;
+              t3 = H.Primitives_stringFromCharCode(48);
+              t2._contents += t3;
+              t3 = H.Primitives_stringFromCharCode(48);
+              t2._contents += t3;
+              t3 = charCode >>> 4 & 15;
+              t3 = H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t2._contents += t3;
+              t3 = charCode & 15;
+              t3 = H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t2._contents += t3;
+              break;
+          }
+        } else if (charCode === 34 || charCode === 92) {
+          if (i > offset) {
+            t3 = t1.substring$2(s, offset, i);
+            t2._contents += t3;
+          }
+          offset = i + 1;
+          t3 = H.Primitives_stringFromCharCode(92);
+          t2._contents += t3;
+          t3 = H.Primitives_stringFromCharCode(charCode);
+          t2._contents += t3;
+        }
+      }
+      if (offset === 0)
+        t2._contents += typeof s === "string" ? s : H.S(s);
+      else if (offset < $length) {
+        t1 = t1.substring$2(s, offset, $length);
+        t2._contents += t1;
+      }
+    },
+    checkCycle$1: function(object) {
+      var t1, t2, i, t3;
+      for (t1 = this._convert$_seen, t2 = t1.length, i = 0; i < t2; ++i) {
+        t3 = t1[i];
+        if (object == null ? t3 == null : object === t3)
+          throw H.wrapException(P.JsonCyclicError$(object));
+      }
+      t1.push(object);
+    },
+    stringifyValue$1: function(object) {
+      var customJson, e, t1, exception;
+      if (!this.stringifyJsonValue$1(object)) {
+        this.checkCycle$1(object);
+        try {
+          customJson = this._toEncodable$1(object);
+          if (!this.stringifyJsonValue$1(customJson)) {
+            t1 = P.JsonUnsupportedObjectError$(object, null);
+            throw H.wrapException(t1);
+          }
+          t1 = this._convert$_seen;
+          if (0 >= t1.length)
+            return H.ioore(t1, 0);
+          t1.pop();
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          throw H.wrapException(P.JsonUnsupportedObjectError$(object, e));
+        }
+
+      }
+    },
+    stringifyJsonValue$1: function(object) {
+      var t1, t2, i, t3, separator, key;
+      if (typeof object === "number") {
+        if (!C.JSNumber_methods.get$isFinite(object))
+          return false;
+        this._sink.write$1(C.JSNumber_methods.toString$0(object));
+        return true;
+      } else if (object === true) {
+        this._sink.write$1("true");
+        return true;
+      } else if (object === false) {
+        this._sink.write$1("false");
+        return true;
+      } else if (object == null) {
+        this._sink.write$1("null");
+        return true;
+      } else if (typeof object === "string") {
+        t1 = this._sink;
+        t1.write$1("\"");
+        this.escape$1(object);
+        t1.write$1("\"");
+        return true;
+      } else {
+        t1 = J.getInterceptor(object);
+        if (!!t1.$isList) {
+          this.checkCycle$1(object);
+          t2 = this._sink;
+          t2.write$1("[");
+          if (t1.get$length(object) > 0) {
+            this.stringifyValue$1(t1.$index(object, 0));
+            for (i = 1; i < t1.get$length(object); ++i) {
+              t2._contents += ",";
+              this.stringifyValue$1(t1.$index(object, i));
+            }
+          }
+          t2.write$1("]");
+          this._removeSeen$1(object);
+          return true;
+        } else if (!!t1.$isMap) {
+          this.checkCycle$1(object);
+          t2 = this._sink;
+          t2.write$1("{");
+          for (t3 = J.get$iterator$ax(object.get$keys()), separator = "\""; t3.moveNext$0(); separator = ",\"") {
+            key = t3.get$current();
+            t2._contents += separator;
+            this.escape$1(key);
+            t2._contents += "\":";
+            this.stringifyValue$1(t1.$index(object, key));
+          }
+          t2.write$1("}");
+          this._removeSeen$1(object);
+          return true;
+        } else
+          return false;
+      }
+    },
+    _removeSeen$1: function(object) {
+      var t1 = this._convert$_seen;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    },
+    static: {"^": "_JsonStringifier_BACKSPACE,_JsonStringifier_TAB,_JsonStringifier_NEWLINE,_JsonStringifier_CARRIAGE_RETURN,_JsonStringifier_FORM_FEED,_JsonStringifier_QUOTE,_JsonStringifier_CHAR_0,_JsonStringifier_BACKSLASH,_JsonStringifier_CHAR_b,_JsonStringifier_CHAR_f,_JsonStringifier_CHAR_n,_JsonStringifier_CHAR_r,_JsonStringifier_CHAR_t,_JsonStringifier_CHAR_u", _JsonStringifier__JsonStringifier: function(sink, toEncodable, indent) {
+        return new P._JsonStringifier(toEncodable, sink, []);
+      }, _JsonStringifier_stringify: function(object, toEncodable, indent) {
+        var output;
+        toEncodable = P._defaultToEncodable$closure();
+        output = P.StringBuffer$("");
+        P._JsonStringifier__JsonStringifier(output, toEncodable, indent).stringifyValue$1(object);
+        return output._contents;
+      }}
+  },
+  Utf8Codec: {
+    "^": "Encoding;_allowMalformed",
+    get$name: function(_) {
+      return "utf-8";
+    },
+    get$encoder: function() {
+      return new P.Utf8Encoder();
+    }
+  },
+  Utf8Encoder: {
+    "^": "Converter;",
+    convert$1: function(string) {
+      var t1, t2, encoder;
+      t1 = J.getInterceptor$asx(string);
+      t2 = J.$mul$ns(t1.get$length(string), 3);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      t2 = H.setRuntimeTypeInfo(Array(t2), [P.$int]);
+      encoder = new P._Utf8Encoder(0, 0, t2);
+      if (encoder._fillBuffer$3(string, 0, t1.get$length(string)) !== t1.get$length(string))
+        encoder._writeSurrogate$2(t1.codeUnitAt$1(string, J.$sub$n(t1.get$length(string), 1)), 0);
+      return C.JSArray_methods.sublist$2(t2, 0, encoder._bufferIndex);
+    },
+    $asConverter: function() {
+      return [P.String, [P.List, P.$int]];
+    }
+  },
+  _Utf8Encoder: {
+    "^": "Object;_carry,_bufferIndex,_buffer",
+    _writeSurrogate$2: function(leadingSurrogate, nextCodeUnit) {
+      var t1, t2, rune, t3, t4;
+      t1 = this._buffer;
+      t2 = this._bufferIndex;
+      if ((nextCodeUnit & 64512) === 56320) {
+        rune = 65536 + ((leadingSurrogate & 1023) << 10 >>> 0) | nextCodeUnit & 1023;
+        t3 = t2 + 1;
+        this._bufferIndex = t3;
+        t4 = t1.length;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = (240 | rune >>> 18) >>> 0;
+        t2 = t3 + 1;
+        this._bufferIndex = t2;
+        if (t3 >= t4)
+          return H.ioore(t1, t3);
+        t1[t3] = 128 | rune >>> 12 & 63;
+        t3 = t2 + 1;
+        this._bufferIndex = t3;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = 128 | rune >>> 6 & 63;
+        this._bufferIndex = t3 + 1;
+        if (t3 >= t4)
+          return H.ioore(t1, t3);
+        t1[t3] = 128 | rune & 63;
+        return true;
+      } else {
+        t3 = t2 + 1;
+        this._bufferIndex = t3;
+        t4 = t1.length;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = 224 | leadingSurrogate >>> 12;
+        t2 = t3 + 1;
+        this._bufferIndex = t2;
+        if (t3 >= t4)
+          return H.ioore(t1, t3);
+        t1[t3] = 128 | leadingSurrogate >>> 6 & 63;
+        this._bufferIndex = t2 + 1;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = 128 | leadingSurrogate & 63;
+        return false;
+      }
+    },
+    _fillBuffer$3: function(str, start, end) {
+      var t1, t2, t3, stringIndex, codeUnit, t4, stringIndex0, t5;
+      if (start !== end && (J.codeUnitAt$1$s(str, J.$sub$n(end, 1)) & 64512) === 55296)
+        end = J.$sub$n(end, 1);
+      if (typeof end !== "number")
+        return H.iae(end);
+      t1 = this._buffer;
+      t2 = t1.length;
+      t3 = J.getInterceptor$s(str);
+      stringIndex = start;
+      for (; stringIndex < end; ++stringIndex) {
+        codeUnit = t3.codeUnitAt$1(str, stringIndex);
+        if (codeUnit <= 127) {
+          t4 = this._bufferIndex;
+          if (t4 >= t2)
+            break;
+          this._bufferIndex = t4 + 1;
+          t1[t4] = codeUnit;
+        } else if ((codeUnit & 64512) === 55296) {
+          if (this._bufferIndex + 3 >= t2)
+            break;
+          stringIndex0 = stringIndex + 1;
+          if (this._writeSurrogate$2(codeUnit, t3.codeUnitAt$1(str, stringIndex0)))
+            stringIndex = stringIndex0;
+        } else if (codeUnit <= 2047) {
+          t4 = this._bufferIndex;
+          t5 = t4 + 1;
+          if (t5 >= t2)
+            break;
+          this._bufferIndex = t5;
+          if (t4 >= t2)
+            return H.ioore(t1, t4);
+          t1[t4] = 192 | codeUnit >>> 6;
+          this._bufferIndex = t5 + 1;
+          t1[t5] = 128 | codeUnit & 63;
+        } else {
+          t4 = this._bufferIndex;
+          if (t4 + 2 >= t2)
+            break;
+          t5 = t4 + 1;
+          this._bufferIndex = t5;
+          if (t4 >= t2)
+            return H.ioore(t1, t4);
+          t1[t4] = 224 | codeUnit >>> 12;
+          t4 = t5 + 1;
+          this._bufferIndex = t4;
+          if (t5 >= t2)
+            return H.ioore(t1, t5);
+          t1[t5] = 128 | codeUnit >>> 6 & 63;
+          this._bufferIndex = t4 + 1;
+          if (t4 >= t2)
+            return H.ioore(t1, t4);
+          t1[t4] = 128 | codeUnit & 63;
+        }
+      }
+      return stringIndex;
+    },
+    static: {"^": "_Utf8Encoder__DEFAULT_BYTE_BUFFER_SIZE"}
+  }
+}],
+["dart.core", "dart:core", , P, {
+  "^": "",
+  Function__toMangledNames: function(namedArguments) {
+    return;
+  },
+  Comparable_compare: [function(a, b) {
+    return J.compareTo$1$ns(a, b);
+  }, "call$2", "Comparable_compare$closure", 4, 0, 51, 46, 47],
+  Error_safeToString: function(object) {
+    var buffer, t1, i, t2, codeUnit;
+    if (typeof object === "number" || typeof object === "boolean" || null == object)
+      return J.toString$0(object);
+    if (typeof object === "string") {
+      buffer = new P.StringBuffer("");
+      buffer._contents = "\"";
+      for (t1 = object.length, i = 0, t2 = "\""; i < t1; ++i) {
+        codeUnit = C.JSString_methods.codeUnitAt$1(object, i);
+        if (codeUnit <= 31)
+          if (codeUnit === 10)
+            t2 = buffer._contents += "\\n";
+          else if (codeUnit === 13)
+            t2 = buffer._contents += "\\r";
+          else if (codeUnit === 9)
+            t2 = buffer._contents += "\\t";
+          else {
+            t2 = buffer._contents += "\\x";
+            if (codeUnit < 16)
+              buffer._contents = t2 + "0";
+            else {
+              buffer._contents = t2 + "1";
+              codeUnit -= 16;
+            }
+            t2 = H.Primitives_stringFromCharCode(codeUnit < 10 ? 48 + codeUnit : 87 + codeUnit);
+            t2 = buffer._contents += t2;
+          }
+        else if (codeUnit === 92)
+          t2 = buffer._contents += "\\\\";
+        else if (codeUnit === 34)
+          t2 = buffer._contents += "\\\"";
+        else {
+          t2 = H.Primitives_stringFromCharCode(codeUnit);
+          t2 = buffer._contents += t2;
+        }
+      }
+      t1 = t2 + "\"";
+      buffer._contents = t1;
+      return t1;
+    }
+    return "Instance of '" + H.Primitives_objectTypeName(object) + "'";
+  },
+  Exception_Exception: function(message) {
+    return new P._ExceptionImplementation(message);
+  },
+  identical: [function(a, b) {
+    return a == null ? b == null : a === b;
+  }, "call$2", "identical$closure", 4, 0, 52],
+  identityHashCode: [function(object) {
+    return H.objectHashCode(object);
+  }, "call$1", "identityHashCode$closure", 2, 0, 53],
+  List_List$filled: function($length, fill, $E) {
+    var result, t1, i;
+    result = J.JSArray_JSArray$fixed($length, $E);
+    if ($length !== 0 && true)
+      for (t1 = result.length, i = 0; i < t1; ++i)
+        result[i] = fill;
+    return result;
+  },
+  List_List$from: function(other, growable, $E) {
+    var list, t1;
+    list = H.setRuntimeTypeInfo([], [$E]);
+    for (t1 = J.get$iterator$ax(other); t1.moveNext$0();)
+      list.push(t1.get$current());
+    if (growable)
+      return list;
+    list.fixed$length = init;
+    return list;
+  },
+  print: function(object) {
+    var line, t1;
+    line = H.S(object);
+    t1 = $.printToZone;
+    if (t1 == null)
+      H.printString(line);
+    else
+      t1.call$1(line);
+  },
+  Function__toMangledNames_closure: {
+    "^": "Closure:75;result_0",
+    call$2: function(symbol, value) {
+      this.result_0.$indexSet(0, symbol.get$_name(symbol), value);
+    },
+    $isFunction: true
+  },
+  NoSuchMethodError_toString_closure: {
+    "^": "Closure:121;box_0",
+    call$2: function(key, value) {
+      var t1 = this.box_0;
+      if (t1.i_1 > 0)
+        t1.sb_0.write$1(", ");
+      t1.sb_0.write$1(J.get$_name$x(key));
+      t1.sb_0.write$1(": ");
+      t1.sb_0.write$1(P.Error_safeToString(value));
+      ++t1.i_1;
+    },
+    $isFunction: true
+  },
+  bool: {
+    "^": "Object;",
+    $isbool: true
+  },
+  "+bool": 0,
+  Comparable: {
+    "^": "Object;"
+  },
+  DateTime: {
+    "^": "Object;millisecondsSinceEpoch<,isUtc",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (!J.getInterceptor(other).$isDateTime)
+        return false;
+      return J.$eq(this.millisecondsSinceEpoch, other.millisecondsSinceEpoch) && this.isUtc === other.isUtc;
+    },
+    compareTo$1: function(_, other) {
+      return J.compareTo$1$ns(this.millisecondsSinceEpoch, other.get$millisecondsSinceEpoch());
+    },
+    get$hashCode: function(_) {
+      return this.millisecondsSinceEpoch;
+    },
+    toString$0: function(_) {
+      var t1, y, m, d, h, min, sec, ms;
+      t1 = this.isUtc;
+      y = P.DateTime__fourDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCFullYear() + 0 : H.Primitives_lazyAsJsDate(this).getFullYear() + 0);
+      m = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCMonth() + 1 : H.Primitives_lazyAsJsDate(this).getMonth() + 1);
+      d = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCDate() + 0 : H.Primitives_lazyAsJsDate(this).getDate() + 0);
+      h = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCHours() + 0 : H.Primitives_lazyAsJsDate(this).getHours() + 0);
+      min = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCMinutes() + 0 : H.Primitives_lazyAsJsDate(this).getMinutes() + 0);
+      sec = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCSeconds() + 0 : H.Primitives_lazyAsJsDate(this).getSeconds() + 0);
+      ms = P.DateTime__threeDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCMilliseconds() + 0 : H.Primitives_lazyAsJsDate(this).getMilliseconds() + 0);
+      if (t1)
+        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms + "Z";
+      else
+        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms;
+    },
+    add$1: function(_, duration) {
+      return P.DateTime$fromMillisecondsSinceEpoch(J.$add$ns(this.millisecondsSinceEpoch, duration.get$inMilliseconds()), this.isUtc);
+    },
+    DateTime$_now$0: function() {
+      H.Primitives_lazyAsJsDate(this);
+    },
+    DateTime$fromMillisecondsSinceEpoch$2$isUtc: function(millisecondsSinceEpoch, isUtc) {
+      if (J.abs$0$n(millisecondsSinceEpoch) > 8640000000000000)
+        throw H.wrapException(P.ArgumentError$(millisecondsSinceEpoch));
+    },
+    $isDateTime: true,
+    static: {"^": "DateTime_MONDAY,DateTime_TUESDAY,DateTime_WEDNESDAY,DateTime_THURSDAY,DateTime_FRIDAY,DateTime_SATURDAY,DateTime_SUNDAY,DateTime_DAYS_PER_WEEK,DateTime_JANUARY,DateTime_FEBRUARY,DateTime_MARCH,DateTime_APRIL,DateTime_MAY,DateTime_JUNE,DateTime_JULY,DateTime_AUGUST,DateTime_SEPTEMBER,DateTime_OCTOBER,DateTime_NOVEMBER,DateTime_DECEMBER,DateTime_MONTHS_PER_YEAR,DateTime__MAX_MILLISECONDS_SINCE_EPOCH", DateTime_parse: function(formattedString) {
+        var match, t1, t2, years, month, day, hour, minute, second, millisecond, addOneMillisecond, t3, sign, hourDifference, minuteDifference, isUtc, millisecondsSinceEpoch;
+        match = new H.JSSyntaxRegExp("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$", H.JSSyntaxRegExp_makeNative("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$", false, true, false), null, null).firstMatch$1(formattedString);
+        if (match != null) {
+          t1 = new P.DateTime_parse_parseIntOrZero();
+          t2 = match._match;
+          if (1 >= t2.length)
+            return H.ioore(t2, 1);
+          years = H.Primitives_parseInt(t2[1], null, null);
+          if (2 >= t2.length)
+            return H.ioore(t2, 2);
+          month = H.Primitives_parseInt(t2[2], null, null);
+          if (3 >= t2.length)
+            return H.ioore(t2, 3);
+          day = H.Primitives_parseInt(t2[3], null, null);
+          if (4 >= t2.length)
+            return H.ioore(t2, 4);
+          hour = t1.call$1(t2[4]);
+          if (5 >= t2.length)
+            return H.ioore(t2, 5);
+          minute = t1.call$1(t2[5]);
+          if (6 >= t2.length)
+            return H.ioore(t2, 6);
+          second = t1.call$1(t2[6]);
+          if (7 >= t2.length)
+            return H.ioore(t2, 7);
+          millisecond = J.round$0$n(J.$mul$ns(new P.DateTime_parse_parseDoubleOrZero().call$1(t2[7]), 1000));
+          if (millisecond === 1000) {
+            addOneMillisecond = true;
+            millisecond = 999;
+          } else
+            addOneMillisecond = false;
+          t3 = t2.length;
+          if (8 >= t3)
+            return H.ioore(t2, 8);
+          if (t2[8] != null) {
+            if (9 >= t3)
+              return H.ioore(t2, 9);
+            t3 = t2[9];
+            if (t3 != null) {
+              sign = J.$eq(t3, "-") ? -1 : 1;
+              if (10 >= t2.length)
+                return H.ioore(t2, 10);
+              hourDifference = H.Primitives_parseInt(t2[10], null, null);
+              if (11 >= t2.length)
+                return H.ioore(t2, 11);
+              minuteDifference = t1.call$1(t2[11]);
+              if (typeof hourDifference !== "number")
+                return H.iae(hourDifference);
+              minuteDifference = J.$add$ns(minuteDifference, 60 * hourDifference);
+              if (typeof minuteDifference !== "number")
+                return H.iae(minuteDifference);
+              minute = J.$sub$n(minute, sign * minuteDifference);
+            }
+            isUtc = true;
+          } else
+            isUtc = false;
+          millisecondsSinceEpoch = H.Primitives_valueFromDecomposedDate(years, month, day, hour, minute, second, millisecond, isUtc);
+          return P.DateTime$fromMillisecondsSinceEpoch(addOneMillisecond ? millisecondsSinceEpoch + 1 : millisecondsSinceEpoch, isUtc);
+        } else
+          throw H.wrapException(P.FormatException$(formattedString));
+      }, DateTime$fromMillisecondsSinceEpoch: function(millisecondsSinceEpoch, isUtc) {
+        var t1 = new P.DateTime(millisecondsSinceEpoch, isUtc);
+        t1.DateTime$fromMillisecondsSinceEpoch$2$isUtc(millisecondsSinceEpoch, isUtc);
+        return t1;
+      }, DateTime__fourDigits: function(n) {
+        var absN, sign;
+        absN = Math.abs(n);
+        sign = n < 0 ? "-" : "";
+        if (absN >= 1000)
+          return "" + n;
+        if (absN >= 100)
+          return sign + "0" + H.S(absN);
+        if (absN >= 10)
+          return sign + "00" + H.S(absN);
+        return sign + "000" + H.S(absN);
+      }, DateTime__threeDigits: function(n) {
+        if (n >= 100)
+          return "" + n;
+        if (n >= 10)
+          return "0" + n;
+        return "00" + n;
+      }, DateTime__twoDigits: function(n) {
+        if (n >= 10)
+          return "" + n;
+        return "0" + n;
+      }}
+  },
+  DateTime_parse_parseIntOrZero: {
+    "^": "Closure:122;",
+    call$1: function(matched) {
+      if (matched == null)
+        return 0;
+      return H.Primitives_parseInt(matched, null, null);
+    },
+    $isFunction: true
+  },
+  DateTime_parse_parseDoubleOrZero: {
+    "^": "Closure:123;",
+    call$1: function(matched) {
+      if (matched == null)
+        return 0;
+      return H.Primitives_parseDouble(matched, null);
+    },
+    $isFunction: true
+  },
+  $double: {
+    "^": "num;",
+    $is$double: true
+  },
+  "+double": 0,
+  Duration: {
+    "^": "Object;_duration<",
+    $add: function(_, other) {
+      return P.Duration$(0, 0, this._duration + other.get$_duration(), 0, 0, 0);
+    },
+    $sub: function(_, other) {
+      return P.Duration$(0, 0, this._duration - other.get$_duration(), 0, 0, 0);
+    },
+    $mul: function(_, factor) {
+      if (typeof factor !== "number")
+        return H.iae(factor);
+      return P.Duration$(0, 0, C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(this._duration * factor)), 0, 0, 0);
+    },
+    $tdiv: function(_, quotient) {
+      if (J.$eq(quotient, 0))
+        throw H.wrapException(P.IntegerDivisionByZeroException$());
+      if (typeof quotient !== "number")
+        return H.iae(quotient);
+      return P.Duration$(0, 0, C.JSNumber_methods.$tdiv(this._duration, quotient), 0, 0, 0);
+    },
+    $lt: function(_, other) {
+      return this._duration < other.get$_duration();
+    },
+    $gt: function(_, other) {
+      return this._duration > other.get$_duration();
+    },
+    $le: function(_, other) {
+      return this._duration <= other.get$_duration();
+    },
+    $ge: function(_, other) {
+      return this._duration >= other.get$_duration();
+    },
+    get$inMilliseconds: function() {
+      return C.JSNumber_methods._tdivFast$1(this._duration, 1000);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (!J.getInterceptor(other).$isDuration)
+        return false;
+      return this._duration === other._duration;
+    },
+    get$hashCode: function(_) {
+      return this._duration & 0x1FFFFFFF;
+    },
+    compareTo$1: function(_, other) {
+      return C.JSNumber_methods.compareTo$1(this._duration, other.get$_duration());
+    },
+    toString$0: function(_) {
+      var t1, t2, twoDigitMinutes, twoDigitSeconds, sixDigitUs;
+      t1 = new P.Duration_toString_twoDigits();
+      t2 = this._duration;
+      if (t2 < 0)
+        return "-" + P.Duration$(0, 0, -t2, 0, 0, 0).toString$0(0);
+      twoDigitMinutes = t1.call$1(C.JSNumber_methods.remainder$1(C.JSNumber_methods._tdivFast$1(t2, 60000000), 60));
+      twoDigitSeconds = t1.call$1(C.JSNumber_methods.remainder$1(C.JSNumber_methods._tdivFast$1(t2, 1000000), 60));
+      sixDigitUs = new P.Duration_toString_sixDigits().call$1(C.JSNumber_methods.remainder$1(t2, 1000000));
+      return H.S(C.JSNumber_methods._tdivFast$1(t2, 3600000000)) + ":" + H.S(twoDigitMinutes) + ":" + H.S(twoDigitSeconds) + "." + H.S(sixDigitUs);
+    },
+    $isDuration: true,
+    static: {"^": "Duration_MICROSECONDS_PER_MILLISECOND,Duration_MILLISECONDS_PER_SECOND,Duration_SECONDS_PER_MINUTE,Duration_MINUTES_PER_HOUR,Duration_HOURS_PER_DAY,Duration_MICROSECONDS_PER_SECOND,Duration_MICROSECONDS_PER_MINUTE,Duration_MICROSECONDS_PER_HOUR,Duration_MICROSECONDS_PER_DAY,Duration_MILLISECONDS_PER_MINUTE,Duration_MILLISECONDS_PER_HOUR,Duration_MILLISECONDS_PER_DAY,Duration_SECONDS_PER_HOUR,Duration_SECONDS_PER_DAY,Duration_MINUTES_PER_DAY,Duration_ZERO", Duration$: function(days, hours, microseconds, milliseconds, minutes, seconds) {
+        return new P.Duration(days * 86400000000 + hours * 3600000000 + minutes * 60000000 + seconds * 1000000 + milliseconds * 1000 + microseconds);
+      }}
+  },
+  Duration_toString_sixDigits: {
+    "^": "Closure:15;",
+    call$1: function(n) {
+      if (n >= 100000)
+        return H.S(n);
+      if (n >= 10000)
+        return "0" + H.S(n);
+      if (n >= 1000)
+        return "00" + H.S(n);
+      if (n >= 100)
+        return "000" + H.S(n);
+      if (n >= 10)
+        return "0000" + H.S(n);
+      return "00000" + H.S(n);
+    },
+    $isFunction: true
+  },
+  Duration_toString_twoDigits: {
+    "^": "Closure:15;",
+    call$1: function(n) {
+      if (n >= 10)
+        return H.S(n);
+      return "0" + H.S(n);
+    },
+    $isFunction: true
+  },
+  Error: {
+    "^": "Object;",
+    get$stackTrace: function() {
+      return new H._StackTrace(this.$thrownJsError, null);
+    },
+    $isError: true
+  },
+  NullThrownError: {
+    "^": "Error;",
+    toString$0: function(_) {
+      return "Throw of null.";
+    }
+  },
+  ArgumentError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      var t1 = this.message;
+      if (t1 != null)
+        return "Illegal argument(s): " + H.S(t1);
+      return "Illegal argument(s)";
+    },
+    static: {ArgumentError$: function(message) {
+        return new P.ArgumentError(message);
+      }}
+  },
+  RangeError: {
+    "^": "ArgumentError;message",
+    toString$0: function(_) {
+      return "RangeError: " + H.S(this.message);
+    },
+    static: {RangeError$: function(message) {
+        return new P.RangeError(message);
+      }, RangeError$value: function(value) {
+        return new P.RangeError("value " + H.S(value));
+      }, RangeError$range: function(value, start, end) {
+        return new P.RangeError("value " + H.S(value) + " not in range " + H.S(start) + ".." + H.S(end));
+      }}
+  },
+  FallThroughError: {
+    "^": "Error;",
+    static: {FallThroughError$: function() {
+        return new P.FallThroughError();
+      }}
+  },
+  NoSuchMethodError: {
+    "^": "Error;_core$_receiver,_memberName,_core$_arguments,_namedArguments,_existingArgumentNames",
+    toString$0: function(_) {
+      var t1, t2, t3, t4, t5, str;
+      t1 = {};
+      t1.sb_0 = P.StringBuffer$("");
+      t1.i_1 = 0;
+      for (t2 = this._core$_arguments, t3 = 0; t4 = t2.length, t3 < t4; t3 = ++t1.i_1) {
+        if (t3 > 0) {
+          t5 = t1.sb_0;
+          t5._contents += ", ";
+        }
+        t5 = t1.sb_0;
+        if (t3 < 0)
+          return H.ioore(t2, t3);
+        str = P.Error_safeToString(t2[t3]);
+        t5._contents += typeof str === "string" ? str : H.S(str);
+      }
+      this._namedArguments.forEach$1(0, new P.NoSuchMethodError_toString_closure(t1));
+      return "NoSuchMethodError : method not found: '" + this._memberName.toString$0(0) + "'\nReceiver: " + H.S(P.Error_safeToString(this._core$_receiver)) + "\nArguments: [" + t1.sb_0._contents + "]";
+    },
+    $isNoSuchMethodError: true,
+    static: {NoSuchMethodError$: function(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames) {
+        return new P.NoSuchMethodError(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames);
+      }}
+  },
+  UnsupportedError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return "Unsupported operation: " + this.message;
+    },
+    static: {UnsupportedError$: function(message) {
+        return new P.UnsupportedError(message);
+      }}
+  },
+  UnimplementedError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      var t1 = this.message;
+      return t1 != null ? "UnimplementedError: " + H.S(t1) : "UnimplementedError";
+    },
+    $isError: true,
+    static: {UnimplementedError$: function(message) {
+        return new P.UnimplementedError(message);
+      }}
+  },
+  StateError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return "Bad state: " + this.message;
+    },
+    static: {StateError$: function(message) {
+        return new P.StateError(message);
+      }}
+  },
+  ConcurrentModificationError: {
+    "^": "Error;modifiedObject",
+    toString$0: function(_) {
+      var t1 = this.modifiedObject;
+      if (t1 == null)
+        return "Concurrent modification during iteration.";
+      return "Concurrent modification during iteration: " + H.S(P.Error_safeToString(t1)) + ".";
+    },
+    static: {ConcurrentModificationError$: function(modifiedObject) {
+        return new P.ConcurrentModificationError(modifiedObject);
+      }}
+  },
+  OutOfMemoryError: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Out of Memory";
+    },
+    get$stackTrace: function() {
+      return;
+    },
+    $isError: true
+  },
+  StackOverflowError: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Stack Overflow";
+    },
+    get$stackTrace: function() {
+      return;
+    },
+    $isError: true
+  },
+  CyclicInitializationError: {
+    "^": "Error;variableName",
+    toString$0: function(_) {
+      return "Reading static variable '" + this.variableName + "' during its initialization";
+    },
+    static: {CyclicInitializationError$: function(variableName) {
+        return new P.CyclicInitializationError(variableName);
+      }}
+  },
+  _ExceptionImplementation: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      var t1 = this.message;
+      if (t1 == null)
+        return "Exception";
+      return "Exception: " + H.S(t1);
+    }
+  },
+  FormatException: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      return "FormatException: " + H.S(this.message);
+    },
+    static: {FormatException$: function(message) {
+        return new P.FormatException(message);
+      }}
+  },
+  IntegerDivisionByZeroException: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "IntegerDivisionByZeroException";
+    },
+    static: {IntegerDivisionByZeroException$: function() {
+        return new P.IntegerDivisionByZeroException();
+      }}
+  },
+  Expando: {
+    "^": "Object;name>",
+    toString$0: function(_) {
+      return "Expando:" + H.S(this.name);
+    },
+    $index: function(_, object) {
+      var values = H.Primitives_getProperty(object, "expando$values");
+      return values == null ? null : H.Primitives_getProperty(values, this._getKey$0());
+    },
+    $indexSet: function(_, object, value) {
+      var values = H.Primitives_getProperty(object, "expando$values");
+      if (values == null) {
+        values = new P.Object();
+        H.Primitives_setProperty(object, "expando$values", values);
+      }
+      H.Primitives_setProperty(values, this._getKey$0(), value);
+    },
+    _getKey$0: function() {
+      var key, t1;
+      key = H.Primitives_getProperty(this, "expando$key");
+      if (key == null) {
+        t1 = $.Expando__keyCount;
+        $.Expando__keyCount = t1 + 1;
+        key = "expando$key$" + t1;
+        H.Primitives_setProperty(this, "expando$key", key);
+      }
+      return key;
+    },
+    static: {"^": "Expando__KEY_PROPERTY_NAME,Expando__EXPANDO_PROPERTY_NAME,Expando__keyCount"}
+  },
+  Function: {
+    "^": "Object;",
+    $isFunction: true
+  },
+  $int: {
+    "^": "num;",
+    $is$int: true
+  },
+  "+int": 0,
+  Iterable: {
+    "^": "Object;",
+    $isIterable: true,
+    $asIterable: null
+  },
+  Iterator: {
+    "^": "Object;"
+  },
+  List: {
+    "^": "Object;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  "+List": 0,
+  Map: {
+    "^": "Object;",
+    $isMap: true
+  },
+  Null: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "null";
+    }
+  },
+  "+Null": 0,
+  num: {
+    "^": "Object;",
+    $isnum: true
+  },
+  "+num": 0,
+  Object: {
+    "^": ";",
+    $eq: function(_, other) {
+      return this === other;
+    },
+    get$hashCode: function(_) {
+      return H.Primitives_objectHashCode(this);
+    },
+    toString$0: function(_) {
+      return H.Primitives_objectToString(this);
+    },
+    noSuchMethod$1: function(_, invocation) {
+      throw H.wrapException(P.NoSuchMethodError$(this, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments(), null));
+    },
+    get$runtimeType: function(_) {
+      return new H.TypeImpl(H.getRuntimeTypeString(this), null);
+    },
+    $isObject: true
+  },
+  Match: {
+    "^": "Object;",
+    $isMatch: true
+  },
+  StackTrace: {
+    "^": "Object;"
+  },
+  Stopwatch: {
+    "^": "Object;frequency,_core$_start,_stop",
+    start$0: function(_) {
+      var t1, t2, t3;
+      t1 = this._core$_start == null;
+      if (!t1 && this._stop == null)
+        return;
+      if (t1)
+        this._core$_start = H.Primitives_numMicroseconds();
+      else {
+        t1 = H.Primitives_numMicroseconds();
+        t2 = this._stop;
+        t3 = this._core$_start;
+        if (typeof t2 !== "number")
+          return t2.$sub();
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        this._core$_start = t1 - (t2 - t3);
+        this._stop = null;
+      }
+    }
+  },
+  String: {
+    "^": "Object;",
+    $isString: true
+  },
+  "+String": 0,
+  RuneIterator: {
+    "^": "Object;string,_core$_position,_nextPosition,_currentCodePoint",
+    get$current: function() {
+      return this._currentCodePoint;
+    },
+    moveNext$0: function() {
+      var t1, t2, t3, codeUnit, nextPosition, nextCodeUnit;
+      t1 = this._nextPosition;
+      this._core$_position = t1;
+      t2 = this.string;
+      t3 = t2.length;
+      if (t1 === t3) {
+        this._currentCodePoint = null;
+        return false;
+      }
+      codeUnit = C.JSString_methods.codeUnitAt$1(t2, t1);
+      nextPosition = this._core$_position + 1;
+      if ((codeUnit & 64512) === 55296 && nextPosition < t3) {
+        nextCodeUnit = C.JSString_methods.codeUnitAt$1(t2, nextPosition);
+        if ((nextCodeUnit & 64512) === 56320) {
+          this._nextPosition = nextPosition + 1;
+          this._currentCodePoint = 65536 + ((codeUnit & 1023) << 10 >>> 0) + (nextCodeUnit & 1023);
+          return true;
+        }
+      }
+      this._nextPosition = nextPosition;
+      this._currentCodePoint = codeUnit;
+      return true;
+    }
+  },
+  StringBuffer: {
+    "^": "Object;_contents<",
+    get$length: function(_) {
+      return this._contents.length;
+    },
+    get$isEmpty: function(_) {
+      return this._contents.length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._contents.length !== 0;
+    },
+    write$1: function(obj) {
+      this._contents += typeof obj === "string" ? obj : H.S(obj);
+    },
+    writeAll$2: function(objects, separator) {
+      var iterator, str;
+      iterator = J.get$iterator$ax(objects);
+      if (!iterator.moveNext$0())
+        return;
+      if (separator.length === 0)
+        do {
+          str = iterator.get$current();
+          this._contents += typeof str === "string" ? str : H.S(str);
+        } while (iterator.moveNext$0());
+      else {
+        this.write$1(iterator.get$current());
+        for (; iterator.moveNext$0();) {
+          this._contents += separator;
+          str = iterator.get$current();
+          this._contents += typeof str === "string" ? str : H.S(str);
+        }
+      }
+    },
+    clear$0: function(_) {
+      this._contents = "";
+    },
+    toString$0: function(_) {
+      return this._contents;
+    },
+    StringBuffer$1: function($content) {
+      if (typeof $content === "string")
+        this._contents = $content;
+      else
+        this.write$1($content);
+    },
+    static: {StringBuffer$: function($content) {
+        var t1 = new P.StringBuffer("");
+        t1.StringBuffer$1($content);
+        return t1;
+      }}
+  },
+  Symbol: {
+    "^": "Object;",
+    $isSymbol: true
+  },
+  Type: {
+    "^": "Object;",
+    $isType: true
+  },
+  Uri: {
+    "^": "Object;_host,_port,_path,scheme,userInfo,query,fragment,_pathSegments,_queryParameters",
+    get$host: function(_) {
+      var t1;
+      if (C.JSString_methods.startsWith$1(this._host, "[")) {
+        t1 = this._host;
+        return C.JSString_methods.substring$2(t1, 1, t1.length - 1);
+      }
+      return this._host;
+    },
+    get$port: function(_) {
+      var t1;
+      if (J.$eq(this._port, 0)) {
+        t1 = this.scheme;
+        if (t1 === "http")
+          return 80;
+        if (t1 === "https")
+          return 443;
+      }
+      return this._port;
+    },
+    get$path: function(_) {
+      return this._path;
+    },
+    _makePath$2: function(path, pathSegments) {
+      var t1, result;
+      t1 = path == null;
+      if (t1 && true)
+        return "";
+      t1 = !t1;
+      if (t1)
+        ;
+      result = t1 ? P.Uri__normalize(path) : C.JSNull_methods.map$1(pathSegments, new P.Uri__makePath_closure()).join$1(0, "/");
+      if ((this.get$host(this) !== "" || this.scheme === "file") && J.getInterceptor$asx(result).get$isNotEmpty(result) && !C.JSString_methods.startsWith$1(result, "/"))
+        return "/" + H.S(result);
+      return result;
+    },
+    _merge$2: function(base, reference) {
+      if (base === "")
+        return "/" + H.S(reference);
+      return C.JSString_methods.substring$2(base, 0, J.getInterceptor$asx(base).lastIndexOf$1(base, "/") + 1) + H.S(reference);
+    },
+    _hasDotSegments$1: function(path) {
+      if (path.length > 0 && J.codeUnitAt$1$s(path, 0) === 58)
+        return true;
+      return J.indexOf$1$asx(path, "/.") !== -1;
+    },
+    _removeDotSegments$1: function(path) {
+      var output, t1, appendSlash, segment, t2;
+      if (!this._hasDotSegments$1(path))
+        return path;
+      output = [];
+      for (t1 = path.split("/"), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]), appendSlash = false; t1.moveNext$0();) {
+        segment = t1._current;
+        if (J.$eq(segment, "..")) {
+          t2 = output.length;
+          if (t2 !== 0)
+            if (t2 === 1) {
+              if (0 >= t2)
+                return H.ioore(output, 0);
+              t2 = !J.$eq(output[0], "");
+            } else
+              t2 = true;
+          else
+            t2 = false;
+          if (t2) {
+            if (0 >= output.length)
+              return H.ioore(output, 0);
+            output.pop();
+          }
+          appendSlash = true;
+        } else if ("." === segment)
+          appendSlash = true;
+        else {
+          output.push(segment);
+          appendSlash = false;
+        }
+      }
+      if (appendSlash)
+        output.push("");
+      return C.JSArray_methods.join$1(output, "/");
+    },
+    toString$0: function(_) {
+      var sb, t1;
+      sb = P.StringBuffer$("");
+      t1 = this.scheme;
+      if ("" !== t1) {
+        sb.write$1(t1);
+        sb.write$1(":");
+      }
+      if (this.get$host(this) !== "" || t1 === "file") {
+        sb.write$1("//");
+        t1 = this.userInfo;
+        if ("" !== t1) {
+          sb.write$1(t1);
+          sb.write$1("@");
+        }
+        sb.write$1(this._host);
+        if (!J.$eq(this._port, 0)) {
+          sb.write$1(":");
+          sb.write$1(J.toString$0(this._port));
+        }
+      }
+      sb.write$1(this._path);
+      t1 = this.query;
+      if ("" !== t1) {
+        sb.write$1("?");
+        sb.write$1(t1);
+      }
+      t1 = this.fragment;
+      if ("" !== t1) {
+        sb.write$1("#");
+        sb.write$1(t1);
+      }
+      return sb._contents;
+    },
+    $eq: function(_, other) {
+      var t1, t2, t3;
+      if (other == null)
+        return false;
+      t1 = J.getInterceptor(other);
+      if (!t1.$isUri)
+        return false;
+      t2 = this.scheme;
+      t3 = other.scheme;
+      if (t2 == null ? t3 == null : t2 === t3)
+        if (this.userInfo === other.userInfo)
+          if (this.get$host(this) === t1.get$host(other))
+            if (J.$eq(this.get$port(this), t1.get$port(other))) {
+              t1 = this._path;
+              t2 = other._path;
+              if (t1 == null ? t2 == null : t1 === t2) {
+                t1 = this.query;
+                t2 = other.query;
+                if (t1 == null ? t2 == null : t1 === t2) {
+                  t1 = this.fragment;
+                  t2 = other.fragment;
+                  t2 = t1 == null ? t2 == null : t1 === t2;
+                  t1 = t2;
+                } else
+                  t1 = false;
+              } else
+                t1 = false;
+            } else
+              t1 = false;
+          else
+            t1 = false;
+        else
+          t1 = false;
+      else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = new P.Uri_hashCode_combine();
+      return t1.call$2(this.scheme, t1.call$2(this.userInfo, t1.call$2(this.get$host(this), t1.call$2(this.get$port(this), t1.call$2(this._path, t1.call$2(this.query, t1.call$2(this.fragment, 1)))))));
+    },
+    Uri$9$fragment$host$path$pathSegments$port$query$queryParameters$scheme$userInfo: function(fragment, host, path, pathSegments, port, query, queryParameters, scheme, userInfo) {
+      if (scheme === "http" && J.$eq(port, 80))
+        this._port = 0;
+      else if (scheme === "https" && J.$eq(port, 443))
+        this._port = 0;
+      else
+        this._port = port;
+      this._path = this._makePath$2(path, pathSegments);
+    },
+    $isUri: true,
+    static: {"^": "Uri__SPACE,Uri__DOUBLE_QUOTE,Uri__NUMBER_SIGN,Uri__PERCENT,Uri__ASTERISK,Uri__PLUS,Uri__SLASH,Uri__ZERO,Uri__NINE,Uri__COLON,Uri__LESS,Uri__GREATER,Uri__QUESTION,Uri__AT_SIGN,Uri__UPPER_CASE_A,Uri__UPPER_CASE_F,Uri__UPPER_CASE_Z,Uri__LEFT_BRACKET,Uri__BACKSLASH,Uri__RIGHT_BRACKET,Uri__LOWER_CASE_A,Uri__LOWER_CASE_F,Uri__LOWER_CASE_Z,Uri__BAR,Uri__unreservedTable,Uri__unreserved2396Table,Uri__encodeFullTable,Uri__schemeTable,Uri__schemeLowerTable,Uri__subDelimitersTable,Uri__regNameTable,Uri__pathCharTable,Uri__queryCharTable", Uri_parse: function(uri) {
+        var port, portStr, t1, t2, $length, index, schemeEndIndex, index0, codeUnit, t3, authorityEndIndex, portIndex, userInfoEndIndex, authorityEndIndex0, pathEndIndex, pathEndIndex0, queryEndIndex, queryEndIndex0, scheme, startIndex, userInfo, exception, host, path, query, fragment;
+        t1 = new P.Uri_parse_isRegName();
+        t2 = new P.Uri_parse_ipV6Address(uri);
+        $length = uri.length;
+        if ($length === 0)
+          return P.Uri$("", "", null, null, 0, null, null, null, "");
+        if (J.codeUnitAt$1$s(uri, 0) !== 47)
+          for (index = 0; schemeEndIndex = 0, index < $length; index = index0) {
+            index0 = index + 1;
+            if (index >= $length)
+              H.throwExpression(P.RangeError$value(index));
+            codeUnit = uri.charCodeAt(index);
+            if (codeUnit < 128) {
+              t3 = codeUnit >>> 4;
+              if (t3 >= 8)
+                return H.ioore(C.List_JYB, t3);
+              t3 = (C.List_JYB[t3] & C.JSInt_methods._shlPositive$1(1, codeUnit & 15)) !== 0;
+            } else
+              t3 = false;
+            if (!t3) {
+              if (codeUnit === 58) {
+                schemeEndIndex = index0;
+                index = schemeEndIndex;
+              } else {
+                index = index0 - 1;
+                schemeEndIndex = 0;
+              }
+              break;
+            }
+          }
+        else {
+          index = 0;
+          schemeEndIndex = 0;
+        }
+        if (schemeEndIndex === index) {
+          t3 = schemeEndIndex + 1;
+          t3 = t3 < $length && C.JSString_methods.codeUnitAt$1(uri, schemeEndIndex) === 47 && C.JSString_methods.codeUnitAt$1(uri, t3) === 47;
+        } else
+          t3 = false;
+        if (t3) {
+          authorityEndIndex = schemeEndIndex + 2;
+          for (portIndex = -1; t3 = J.getInterceptor$n(authorityEndIndex), userInfoEndIndex = -1, t3.$lt(authorityEndIndex, $length);) {
+            authorityEndIndex0 = t3.$add(authorityEndIndex, 1);
+            if (typeof authorityEndIndex !== "number" || Math.floor(authorityEndIndex) !== authorityEndIndex)
+              H.throwExpression(P.ArgumentError$(authorityEndIndex));
+            if (t3.$lt(authorityEndIndex, 0))
+              H.throwExpression(P.RangeError$value(authorityEndIndex));
+            if (t3.$ge(authorityEndIndex, $length))
+              H.throwExpression(P.RangeError$value(authorityEndIndex));
+            codeUnit = uri.charCodeAt(authorityEndIndex);
+            if (t1.call$1(codeUnit) !== true)
+              if (codeUnit === 91)
+                authorityEndIndex = t2.call$1(authorityEndIndex0);
+              else {
+                if (J.$eq(portIndex, -1) && codeUnit === 58)
+                  ;
+                else {
+                  t3 = codeUnit === 64 || codeUnit === 58;
+                  authorityEndIndex = authorityEndIndex0 - 1;
+                  if (t3) {
+                    userInfoEndIndex = C.JSString_methods.indexOf$2(uri, "@", authorityEndIndex);
+                    if (userInfoEndIndex === -1) {
+                      authorityEndIndex = index;
+                      break;
+                    }
+                    authorityEndIndex = userInfoEndIndex + 1;
+                    for (portIndex = -1; t3 = J.getInterceptor$n(authorityEndIndex), t3.$lt(authorityEndIndex, $length);) {
+                      authorityEndIndex0 = t3.$add(authorityEndIndex, 1);
+                      if (typeof authorityEndIndex !== "number" || Math.floor(authorityEndIndex) !== authorityEndIndex)
+                        H.throwExpression(P.ArgumentError$(authorityEndIndex));
+                      if (t3.$lt(authorityEndIndex, 0))
+                        H.throwExpression(P.RangeError$value(authorityEndIndex));
+                      if (t3.$ge(authorityEndIndex, $length))
+                        H.throwExpression(P.RangeError$value(authorityEndIndex));
+                      codeUnit = uri.charCodeAt(authorityEndIndex);
+                      if (t1.call$1(codeUnit) !== true)
+                        if (codeUnit === 91)
+                          authorityEndIndex = t2.call$1(authorityEndIndex0);
+                        else {
+                          if (codeUnit === 58) {
+                            if (!J.$eq(portIndex, -1))
+                              throw H.wrapException(P.FormatException$("Double port in host"));
+                          } else {
+                            authorityEndIndex = authorityEndIndex0 - 1;
+                            break;
+                          }
+                          authorityEndIndex = authorityEndIndex0;
+                          portIndex = authorityEndIndex;
+                        }
+                      else
+                        authorityEndIndex = authorityEndIndex0;
+                    }
+                    break;
+                  } else {
+                    userInfoEndIndex = -1;
+                    break;
+                  }
+                }
+                authorityEndIndex = authorityEndIndex0;
+                portIndex = authorityEndIndex;
+              }
+            else
+              authorityEndIndex = authorityEndIndex0;
+          }
+        } else {
+          authorityEndIndex = schemeEndIndex;
+          userInfoEndIndex = -1;
+          portIndex = -1;
+        }
+        for (pathEndIndex = authorityEndIndex; t1 = J.getInterceptor$n(pathEndIndex), t1.$lt(pathEndIndex, $length); pathEndIndex = pathEndIndex0) {
+          pathEndIndex0 = t1.$add(pathEndIndex, 1);
+          if (typeof pathEndIndex !== "number" || Math.floor(pathEndIndex) !== pathEndIndex)
+            H.throwExpression(P.ArgumentError$(pathEndIndex));
+          if (t1.$lt(pathEndIndex, 0))
+            H.throwExpression(P.RangeError$value(pathEndIndex));
+          if (t1.$ge(pathEndIndex, $length))
+            H.throwExpression(P.RangeError$value(pathEndIndex));
+          codeUnit = uri.charCodeAt(pathEndIndex);
+          if (codeUnit === 63 || codeUnit === 35) {
+            pathEndIndex = pathEndIndex0 - 1;
+            break;
+          }
+        }
+        t1 = J.getInterceptor$n(pathEndIndex);
+        if (t1.$lt(pathEndIndex, $length) && C.JSString_methods.codeUnitAt$1(uri, pathEndIndex) === 63)
+          for (queryEndIndex = pathEndIndex; t2 = J.getInterceptor$n(queryEndIndex), t2.$lt(queryEndIndex, $length); queryEndIndex = queryEndIndex0) {
+            queryEndIndex0 = t2.$add(queryEndIndex, 1);
+            if (typeof queryEndIndex !== "number" || Math.floor(queryEndIndex) !== queryEndIndex)
+              H.throwExpression(P.ArgumentError$(queryEndIndex));
+            if (t2.$lt(queryEndIndex, 0))
+              H.throwExpression(P.RangeError$value(queryEndIndex));
+            if (t2.$ge(queryEndIndex, $length))
+              H.throwExpression(P.RangeError$value(queryEndIndex));
+            if (uri.charCodeAt(queryEndIndex) === 35) {
+              queryEndIndex = queryEndIndex0 - 1;
+              break;
+            }
+          }
+        else
+          queryEndIndex = pathEndIndex;
+        scheme = schemeEndIndex > 0 ? C.JSString_methods.substring$2(uri, 0, schemeEndIndex - 1) : null;
+        port = 0;
+        if (schemeEndIndex !== authorityEndIndex) {
+          startIndex = schemeEndIndex + 2;
+          if (userInfoEndIndex > 0) {
+            userInfo = C.JSString_methods.substring$2(uri, startIndex, userInfoEndIndex);
+            startIndex = userInfoEndIndex + 1;
+          } else
+            userInfo = "";
+          t2 = J.getInterceptor$n(portIndex);
+          if (t2.$gt(portIndex, 0)) {
+            portStr = C.JSString_methods.substring$2(uri, portIndex, authorityEndIndex);
+            try {
+              port = H.Primitives_parseInt(portStr, null, null);
+            } catch (exception) {
+              H.unwrapException(exception);
+              throw H.wrapException(P.FormatException$("Invalid port: '" + H.S(portStr) + "'"));
+            }
+
+            host = C.JSString_methods.substring$2(uri, startIndex, t2.$sub(portIndex, 1));
+          } else
+            host = C.JSString_methods.substring$2(uri, startIndex, authorityEndIndex);
+        } else {
+          host = "";
+          userInfo = "";
+        }
+        path = C.JSString_methods.substring$2(uri, authorityEndIndex, pathEndIndex);
+        query = t1.$lt(pathEndIndex, queryEndIndex) ? C.JSString_methods.substring$2(uri, t1.$add(pathEndIndex, 1), queryEndIndex) : "";
+        t1 = J.getInterceptor$n(queryEndIndex);
+        fragment = t1.$lt(queryEndIndex, $length) ? C.JSString_methods.substring$2(uri, t1.$add(queryEndIndex, 1), $length) : "";
+        return P.Uri$(fragment, host, path, null, port, query, null, scheme, userInfo);
+      }, Uri$: function(fragment, host, path, pathSegments, port, query, queryParameters, scheme, userInfo) {
+        var t1 = P.Uri__makeScheme(scheme);
+        t1 = new P.Uri(P.Uri__makeHost(host), null, null, t1, userInfo, P.Uri__makeQuery(query, queryParameters), P.Uri__makeFragment(fragment), null, null);
+        t1.Uri$9$fragment$host$path$pathSegments$port$query$queryParameters$scheme$userInfo(fragment, host, path, pathSegments, port, query, queryParameters, scheme, userInfo);
+        return t1;
+      }, Uri__makeHost: function(host) {
+        var t1, i;
+        if (host.length === 0)
+          return host;
+        if (C.JSString_methods.codeUnitAt$1(host, 0) === 91) {
+          t1 = host.length - 1;
+          if (C.JSString_methods.codeUnitAt$1(host, t1) !== 93)
+            throw H.wrapException(P.FormatException$("Missing end `]` to match `[` in host"));
+          P.Uri_parseIPv6Address(C.JSString_methods.substring$2(host, 1, t1));
+          return host;
+        }
+        for (t1 = host.length, i = 0; i < t1; ++i) {
+          if (i >= t1)
+            H.throwExpression(P.RangeError$value(i));
+          if (host.charCodeAt(i) === 58) {
+            P.Uri_parseIPv6Address(host);
+            return "[" + host + "]";
+          }
+        }
+        return host;
+      }, Uri__makeScheme: function(scheme) {
+        var t1, $length, allLowercase, i, codeUnit, t2;
+        t1 = new P.Uri__makeScheme_isSchemeLowerCharacter();
+        if (scheme == null)
+          return "";
+        $length = scheme.length;
+        for (allLowercase = true, i = 0; i < $length; ++i) {
+          if (i >= $length)
+            H.throwExpression(P.RangeError$value(i));
+          codeUnit = scheme.charCodeAt(i);
+          if (i === 0) {
+            if (!(codeUnit >= 97 && codeUnit <= 122))
+              t2 = codeUnit >= 65 && codeUnit <= 90;
+            else
+              t2 = true;
+            t2 = !t2;
+          } else
+            t2 = false;
+          if (t2)
+            throw H.wrapException(P.ArgumentError$("Illegal scheme: " + scheme));
+          if (t1.call$1(codeUnit) !== true) {
+            if (codeUnit < 128) {
+              t2 = codeUnit >>> 4;
+              if (t2 >= 8)
+                return H.ioore(C.List_JYB, t2);
+              t2 = (C.List_JYB[t2] & C.JSInt_methods._shlPositive$1(1, codeUnit & 15)) !== 0;
+            } else
+              t2 = false;
+            if (t2)
+              ;
+            else
+              throw H.wrapException(P.ArgumentError$("Illegal scheme: " + scheme));
+            allLowercase = false;
+          }
+        }
+        return allLowercase ? scheme : scheme.toLowerCase();
+      }, Uri__makeQuery: function(query, queryParameters) {
+        var t1, t2, result;
+        t1 = {};
+        t2 = query == null;
+        if (t2 && true)
+          return "";
+        t2 = !t2;
+        if (t2)
+          ;
+        if (t2)
+          return P.Uri__normalize(query);
+        result = P.StringBuffer$("");
+        t1.first_0 = true;
+        C.JSNull_methods.forEach$1(queryParameters, new P.Uri__makeQuery_closure(t1, result));
+        return result._contents;
+      }, Uri__makeFragment: function(fragment) {
+        if (fragment == null)
+          return "";
+        return P.Uri__normalize(fragment);
+      }, Uri__normalize: function(component) {
+        var t1, index, t2, t3, t4, t5, $length, t6, t7, codeUnit1, codeUnit2, decodedCodeUnit, t8, next;
+        t1 = {};
+        index = J.getInterceptor$asx(component).indexOf$1(component, "%");
+        t1.index_0 = index;
+        if (index < 0)
+          return component;
+        t2 = new P.Uri__normalize_isNormalizedHexDigit();
+        t3 = new P.Uri__normalize_isUnreserved();
+        t4 = new P.Uri__normalize_normalizeHexDigit(component, t2, new P.Uri__normalize_isLowerCaseHexDigit());
+        t5 = new P.Uri__normalize_decodeHexDigitPair(component);
+        t1.result_1 = null;
+        $length = component.length;
+        t1.prevIndex_2 = 0;
+        t6 = new P.Uri__normalize_fillResult(t1, component);
+        for (t7 = index; t7 < $length;) {
+          if ($length < t7 + 2)
+            throw H.wrapException(P.ArgumentError$("Invalid percent-encoding in URI component: " + component));
+          codeUnit1 = C.JSString_methods.codeUnitAt$1(component, t7 + 1);
+          codeUnit2 = C.JSString_methods.codeUnitAt$1(component, t1.index_0 + 2);
+          decodedCodeUnit = t5.call$1(t1.index_0 + 1);
+          if (t2.call$1(codeUnit1) === true && t2.call$1(codeUnit2) === true && t3.call$1(decodedCodeUnit) !== true)
+            t7 = t1.index_0 += 3;
+          else {
+            t6.call$0();
+            t7 = t3.call$1(decodedCodeUnit);
+            t8 = t1.result_1;
+            if (t7 === true) {
+              t8.toString;
+              t7 = H.Primitives_stringFromCharCode(decodedCodeUnit);
+              t8._contents += t7;
+            } else {
+              t8.toString;
+              t8._contents += "%";
+              t7 = t4.call$1(t1.index_0 + 1);
+              t8.toString;
+              t7 = H.Primitives_stringFromCharCode(t7);
+              t8._contents += t7;
+              t7 = t1.result_1;
+              t8 = t4.call$1(t1.index_0 + 2);
+              t7.toString;
+              t8 = H.Primitives_stringFromCharCode(t8);
+              t7._contents += t8;
+            }
+            t7 = t1.index_0 += 3;
+            t1.prevIndex_2 = t7;
+          }
+          next = C.JSString_methods.indexOf$2(component, "%", t7);
+          if (next >= t1.index_0) {
+            t1.index_0 = next;
+            t7 = next;
+          } else {
+            t1.index_0 = $length;
+            t7 = $length;
+          }
+        }
+        if (t1.result_1 == null)
+          return component;
+        if (t1.prevIndex_2 !== t7)
+          t6.call$0();
+        return J.toString$0(t1.result_1);
+      }, Uri_parseIPv4Address: function(host) {
+        var t1, bytes;
+        t1 = new P.Uri_parseIPv4Address_error();
+        bytes = host.split(".");
+        if (bytes.length !== 4)
+          t1.call$1("IPv4 address should contain exactly 4 parts");
+        return H.setRuntimeTypeInfo(new H.MappedListIterable(bytes, new P.Uri_parseIPv4Address_closure(t1)), [null, null]).toList$0(0);
+      }, Uri_parseIPv6Address: function(host) {
+        var error, parseHex, parts, partStart, last, wildcardSeen, i, t1, t2, atEnd, isLastWildcard, exception;
+        error = new P.Uri_parseIPv6Address_error();
+        parseHex = new P.Uri_parseIPv6Address_parseHex(host, error);
+        if (J.get$length$asx(host) < 2)
+          error.call$1("address is too short");
+        parts = [];
+        partStart = 0;
+        wildcardSeen = false;
+        i = 0;
+        while (true) {
+          t1 = J.get$length$asx(host);
+          if (typeof t1 !== "number")
+            return H.iae(t1);
+          if (!(i < t1))
+            break;
+          t1 = host;
+          t2 = J.get$length$asx(t1);
+          if (typeof t2 !== "number")
+            return H.iae(t2);
+          if (i >= t2)
+            H.throwExpression(P.RangeError$value(i));
+          if (t1.charCodeAt(i) === 58) {
+            if (i === 0) {
+              ++i;
+              t1 = host;
+              if (i >= J.get$length$asx(t1))
+                H.throwExpression(P.RangeError$value(i));
+              if (t1.charCodeAt(i) !== 58)
+                error.call$1("invalid start colon.");
+              partStart = i;
+            }
+            if (i === partStart) {
+              if (wildcardSeen)
+                error.call$1("only one wildcard `::` is allowed");
+              J.add$1$ax(parts, -1);
+              wildcardSeen = true;
+            } else
+              J.add$1$ax(parts, parseHex.call$2(partStart, i));
+            partStart = i + 1;
+          }
+          ++i;
+        }
+        if (J.get$length$asx(parts) === 0)
+          error.call$1("too few parts");
+        atEnd = J.$eq(partStart, J.get$length$asx(host));
+        isLastWildcard = J.$eq(J.get$last$ax(parts), -1);
+        if (atEnd && !isLastWildcard)
+          error.call$1("expected a part after last `:`");
+        if (!atEnd)
+          try {
+            J.add$1$ax(parts, parseHex.call$2(partStart, J.get$length$asx(host)));
+          } catch (exception) {
+            H.unwrapException(exception);
+            try {
+              last = P.Uri_parseIPv4Address(J.substring$1$s(host, partStart));
+              t1 = J.$shl$n(J.$index$asx(last, 0), 8);
+              t2 = J.$index$asx(last, 1);
+              if (typeof t2 !== "number")
+                return H.iae(t2);
+              J.add$1$ax(parts, (t1 | t2) >>> 0);
+              t2 = J.$shl$n(J.$index$asx(last, 2), 8);
+              t1 = J.$index$asx(last, 3);
+              if (typeof t1 !== "number")
+                return H.iae(t1);
+              J.add$1$ax(parts, (t2 | t1) >>> 0);
+            } catch (exception) {
+              H.unwrapException(exception);
+              error.call$1("invalid end of IPv6 address.");
+            }
+
+          }
+
+        if (wildcardSeen) {
+          if (J.get$length$asx(parts) > 7)
+            error.call$1("an address with a wildcard must have less than 7 parts");
+        } else if (J.get$length$asx(parts) !== 8)
+          error.call$1("an address without a wildcard must contain exactly 8 parts");
+        t1 = new H.ExpandIterable(parts, new P.Uri_parseIPv6Address_closure(parts));
+        t1.$builtinTypeInfo = [null, null];
+        return P.List_List$from(t1, true, H.getRuntimeTypeArgument(t1, "IterableBase", 0));
+      }, Uri__uriEncode: function(canonicalTable, text, encoding, spaceToPlus) {
+        var t1, result, bytes, i, $byte, t2, t3;
+        t1 = new P.Uri__uriEncode_byteToHex();
+        result = P.StringBuffer$("");
+        bytes = encoding.get$encoder().convert$1(text);
+        for (i = 0; i < bytes.length; ++i) {
+          $byte = bytes[i];
+          t2 = J.getInterceptor$n($byte);
+          if (t2.$lt($byte, 128)) {
+            t3 = t2.$shr($byte, 4);
+            if (t3 >= 8)
+              return H.ioore(canonicalTable, t3);
+            t3 = (canonicalTable[t3] & C.JSInt_methods._shlPositive$1(1, t2.$and($byte, 15))) !== 0;
+          } else
+            t3 = false;
+          if (t3) {
+            t2 = H.Primitives_stringFromCharCode($byte);
+            result._contents += t2;
+          } else if (spaceToPlus && t2.$eq($byte, 32)) {
+            t2 = H.Primitives_stringFromCharCode(43);
+            result._contents += t2;
+          } else {
+            t2 = H.Primitives_stringFromCharCode(37);
+            result._contents += t2;
+            t1.call$2($byte, result);
+          }
+        }
+        return result._contents;
+      }}
+  },
+  Uri_parse_isRegName: {
+    "^": "Closure:124;",
+    call$1: function(ch) {
+      var t1;
+      if (ch < 128) {
+        t1 = ch >>> 4;
+        if (t1 >= 8)
+          return H.ioore(C.List_qNA, t1);
+        t1 = (C.List_qNA[t1] & C.JSInt_methods._shlPositive$1(1, ch & 15)) !== 0;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri_parse_ipV6Address: {
+    "^": "Closure:125;uri_0",
+    call$1: function(index) {
+      index = J.indexOf$2$asx(this.uri_0, "]", index);
+      if (index === -1)
+        throw H.wrapException(P.FormatException$("Bad end of IPv6 host"));
+      return index + 1;
+    },
+    $isFunction: true
+  },
+  Uri__makeScheme_isSchemeLowerCharacter: {
+    "^": "Closure:124;",
+    call$1: function(ch) {
+      var t1;
+      if (ch < 128) {
+        t1 = ch >>> 4;
+        if (t1 >= 8)
+          return H.ioore(C.List_6Pr, t1);
+        t1 = (C.List_6Pr[t1] & C.JSInt_methods._shlPositive$1(1, ch & 15)) !== 0;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri__makePath_closure: {
+    "^": "Closure:13;",
+    call$1: function(s) {
+      return P.Uri__uriEncode(C.List_qg4, s, C.Utf8Codec_false, false);
+    },
+    $isFunction: true
+  },
+  Uri__makeQuery_closure: {
+    "^": "Closure:75;box_0,result_1",
+    call$2: function(key, value) {
+      var t1 = this.box_0;
+      if (!t1.first_0)
+        this.result_1.write$1("&");
+      t1.first_0 = false;
+      t1 = this.result_1;
+      t1.write$1(P.Uri__uriEncode(C.List_nxB, key, C.Utf8Codec_false, true));
+      value.get$isEmpty(value);
+      t1.write$1("=");
+      t1.write$1(P.Uri__uriEncode(C.List_nxB, value, C.Utf8Codec_false, true));
+    },
+    $isFunction: true
+  },
+  Uri__normalize_isNormalizedHexDigit: {
+    "^": "Closure:124;",
+    call$1: function(digit) {
+      var t1;
+      if (!(48 <= digit && digit <= 57))
+        t1 = 65 <= digit && digit <= 70;
+      else
+        t1 = true;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_isLowerCaseHexDigit: {
+    "^": "Closure:124;",
+    call$1: function(digit) {
+      return 97 <= digit && digit <= 102;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_isUnreserved: {
+    "^": "Closure:124;",
+    call$1: function(ch) {
+      var t1;
+      if (ch < 128) {
+        t1 = C.JSInt_methods._shrOtherPositive$1(ch, 4);
+        if (t1 >= 8)
+          return H.ioore(C.List_nxB, t1);
+        t1 = (C.List_nxB[t1] & C.JSInt_methods._shlPositive$1(1, ch & 15)) !== 0;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_normalizeHexDigit: {
+    "^": "Closure:125;component_1,isNormalizedHexDigit_2,isLowerCaseHexDigit_3",
+    call$1: function(index) {
+      var t1, codeUnit;
+      t1 = this.component_1;
+      codeUnit = J.codeUnitAt$1$s(t1, index);
+      if (this.isLowerCaseHexDigit_3.call$1(codeUnit) === true)
+        return codeUnit - 32;
+      else if (this.isNormalizedHexDigit_2.call$1(codeUnit) !== true)
+        throw H.wrapException(P.ArgumentError$("Invalid URI component: " + t1));
+      else
+        return codeUnit;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_decodeHexDigitPair: {
+    "^": "Closure:125;component_4",
+    call$1: function(index) {
+      var t1, t2, $byte, i, codeUnit;
+      for (t1 = this.component_4, t2 = J.getInterceptor$s(t1), $byte = 0, i = 0; i < 2; ++i) {
+        codeUnit = t2.codeUnitAt$1(t1, index + i);
+        if (48 <= codeUnit && codeUnit <= 57)
+          $byte = $byte * 16 + codeUnit - 48;
+        else {
+          codeUnit |= 32;
+          if (97 <= codeUnit && codeUnit <= 102)
+            $byte = $byte * 16 + codeUnit - 97 + 10;
+          else
+            throw H.wrapException(P.ArgumentError$("Invalid percent-encoding in URI component: " + t1));
+        }
+      }
+      return $byte;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_fillResult: {
+    "^": "Closure:18;box_0,component_5",
+    call$0: function() {
+      var t1, t2, t3, t4, t5;
+      t1 = this.box_0;
+      t2 = t1.result_1;
+      t3 = t1.prevIndex_2;
+      t4 = this.component_5;
+      t5 = t1.index_0;
+      if (t2 == null)
+        t1.result_1 = P.StringBuffer$(J.substring$2$s(t4, t3, t5));
+      else
+        t2.write$1(J.substring$2$s(t4, t3, t5));
+    },
+    $isFunction: true
+  },
+  Uri_hashCode_combine: {
+    "^": "Closure:126;",
+    call$2: function(part, current) {
+      var t1 = J.get$hashCode$(part);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return current * 31 + t1 & 1073741823;
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv4Address_error: {
+    "^": "Closure:43;",
+    call$1: function(msg) {
+      throw H.wrapException(P.FormatException$("Illegal IPv4 address, " + msg));
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv4Address_closure: {
+    "^": "Closure:13;error_0",
+    call$1: [function(byteString) {
+      var $byte, t1;
+      $byte = H.Primitives_parseInt(byteString, null, null);
+      t1 = J.getInterceptor$n($byte);
+      if (t1.$lt($byte, 0) || t1.$gt($byte, 255))
+        this.error_0.call$1("each part must be in the range of `0..255`");
+      return $byte;
+    }, "call$1", null, 2, 0, null, 127, "call"],
+    $isFunction: true
+  },
+  Uri_parseIPv6Address_error: {
+    "^": "Closure:43;",
+    call$1: function(msg) {
+      throw H.wrapException(P.FormatException$("Illegal IPv6 address, " + msg));
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv6Address_parseHex: {
+    "^": "Closure:87;host_0,error_1",
+    call$2: function(start, end) {
+      var value, t1;
+      if (end - start > 4)
+        this.error_1.call$1("an IPv6 part can only contain a maximum of 4 hex digits");
+      value = H.Primitives_parseInt(C.JSString_methods.substring$2(this.host_0, start, end), 16, null);
+      t1 = J.getInterceptor$n(value);
+      if (t1.$lt(value, 0) || t1.$gt(value, 65535))
+        this.error_1.call$1("each part must be in the range of `0x0..0xFFFF`");
+      return value;
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv6Address_closure: {
+    "^": "Closure:13;parts_2",
+    call$1: function(value) {
+      var t1 = J.getInterceptor(value);
+      if (t1.$eq(value, -1))
+        return P.List_List$filled((9 - this.parts_2.length) * 2, 0, null);
+      else
+        return [t1.$shr(value, 8) & 255, t1.$and(value, 255)];
+    },
+    $isFunction: true
+  },
+  Uri__uriEncode_byteToHex: {
+    "^": "Closure:75;",
+    call$2: function($byte, buffer) {
+      var t1 = J.getInterceptor$n($byte);
+      buffer.write$1(H.Primitives_stringFromCharCode(C.JSString_methods.codeUnitAt$1("0123456789ABCDEF", t1.$shr($byte, 4))));
+      buffer.write$1(H.Primitives_stringFromCharCode(C.JSString_methods.codeUnitAt$1("0123456789ABCDEF", t1.$and($byte, 15))));
+    },
+    $isFunction: true
+  }
+}],
+["dart.dom.html", "dart:html", , W, {
+  "^": "",
+  CustomEvent_CustomEvent: function(type, canBubble, cancelable, detail) {
+    var e, t1, exception;
+    e = document.createEvent("CustomEvent");
+    J.set$_dartDetail$x(e, detail);
+    if (!J.getInterceptor(detail).$isList)
+      if (!J.getInterceptor(detail).$isMap) {
+        t1 = detail;
+        if (typeof t1 !== "string") {
+          t1 = detail;
+          t1 = typeof t1 === "number";
+        } else
+          t1 = true;
+      } else
+        t1 = true;
+    else
+      t1 = true;
+    if (t1)
+      try {
+        detail = P._convertDartToNative_PrepareForStructuredClone(detail);
+        J._initCustomEvent$4$x(e, type, canBubble, cancelable, detail);
+      } catch (exception) {
+        H.unwrapException(exception);
+        J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
+      }
+
+    else
+      J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
+    return e;
+  },
+  _ElementFactoryProvider_createElement_tag: function(tag, typeExtension) {
+    return document.createElement(tag);
+  },
+  HttpRequest_request: function(url, method, mimeType, onProgress, requestHeaders, responseType, sendData, withCredentials) {
+    var t1, completer, xhr;
+    t1 = W.HttpRequest;
+    completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(t1)), [t1]);
+    xhr = new XMLHttpRequest();
+    C.HttpRequest_methods.open$3$async(xhr, "GET", url, true);
+    requestHeaders.forEach$1(0, new W.HttpRequest_request_closure(xhr));
+    t1 = H.setRuntimeTypeInfo(new W._EventStream(xhr, C.EventStreamProvider_load._eventType, false), [null]);
+    H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(new W.HttpRequest_request_closure0(completer, xhr)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+    t1 = H.setRuntimeTypeInfo(new W._EventStream(xhr, C.EventStreamProvider_error._eventType, false), [null]);
+    H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(completer.get$completeError()), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+    xhr.send();
+    return completer.future;
+  },
+  InputElement_InputElement: function(type) {
+    var e, exception;
+    e = document.createElement("input", null);
+    if (type != null)
+      try {
+        J.set$type$x(e, type);
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+
+    return e;
+  },
+  _JenkinsSmiHash_combine: function(hash, value) {
+    hash = 536870911 & hash + value;
+    hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+    return hash ^ hash >>> 6;
+  },
+  _convertNativeToDart_Window: function(win) {
+    if (win == null)
+      return;
+    return W._DOMWindowCrossFrame__createSafe(win);
+  },
+  _convertNativeToDart_EventTarget: function(e) {
+    var $window;
+    if (e == null)
+      return;
+    if ("setInterval" in e) {
+      $window = W._DOMWindowCrossFrame__createSafe(e);
+      if (!!J.getInterceptor($window).$isEventTarget)
+        return $window;
+      return;
+    } else
+      return e;
+  },
+  _convertDartToNative_EventTarget: function(e) {
+    return e;
+  },
+  _convertNativeToDart_XHR_Response: function(o) {
+    if (!!J.getInterceptor(o).$isDocument)
+      return o;
+    return P.convertNativeToDart_AcceptStructuredClone(o, true);
+  },
+  _callConstructor: function($constructor, interceptor) {
+    return new W._callConstructor_closure($constructor, interceptor);
+  },
+  _callAttached: [function(receiver) {
+    return J.attached$0$x(receiver);
+  }, "call$1", "_callAttached$closure", 2, 0, 13, 54],
+  _callDetached: [function(receiver) {
+    return J.detached$0$x(receiver);
+  }, "call$1", "_callDetached$closure", 2, 0, 13, 54],
+  _callAttributeChanged: [function(receiver, $name, oldValue, newValue) {
+    return J.attributeChanged$3$x(receiver, $name, oldValue, newValue);
+  }, "call$4", "_callAttributeChanged$closure", 8, 0, 55, 54, 56, 57, 58],
+  _registerCustomElement: function(context, $document, tag, type, extendsTagName) {
+    var interceptorClass, interceptor, $constructor, baseClassName, t1, baseConstructor, properties, proto, t2, options;
+    interceptorClass = J.findInterceptorConstructorForType(type);
+    if (interceptorClass == null)
+      throw H.wrapException(P.ArgumentError$(type));
+    interceptor = interceptorClass.prototype;
+    $constructor = J.findConstructorForNativeSubclassType(type, "created");
+    if ($constructor == null)
+      throw H.wrapException(P.ArgumentError$(H.S(type) + " has no constructor called 'created'"));
+    J.getNativeInterceptor(W._ElementFactoryProvider_createElement_tag("article", null));
+    baseClassName = interceptorClass.$nativeSuperclassTag;
+    if (baseClassName == null)
+      throw H.wrapException(P.ArgumentError$(type));
+    t1 = extendsTagName == null;
+    if (t1) {
+      if (!J.$eq(baseClassName, "HTMLElement"))
+        throw H.wrapException(P.UnsupportedError$("Class must provide extendsTag if base native class is not HtmlElement"));
+    } else if (!($document.createElement(extendsTagName) instanceof window[baseClassName]))
+      throw H.wrapException(P.UnsupportedError$("extendsTag does not match base native class"));
+    baseConstructor = context[baseClassName];
+    properties = {};
+    properties.createdCallback = {value: function(invokeCallback) {
+        return function() {
+          return invokeCallback(this);
+        };
+      }(H.convertDartClosureToJS(W._callConstructor($constructor, interceptor), 1))};
+    properties.attachedCallback = {value: function(invokeCallback) {
+        return function() {
+          return invokeCallback(this);
+        };
+      }(H.convertDartClosureToJS(W._callAttached$closure(), 1))};
+    properties.detachedCallback = {value: function(invokeCallback) {
+        return function() {
+          return invokeCallback(this);
+        };
+      }(H.convertDartClosureToJS(W._callDetached$closure(), 1))};
+    properties.attributeChangedCallback = {value: function(invokeCallback) {
+        return function(arg1, arg2, arg3) {
+          return invokeCallback(this, arg1, arg2, arg3);
+        };
+      }(H.convertDartClosureToJS(W._callAttributeChanged$closure(), 4))};
+    proto = Object.create(baseConstructor.prototype, properties);
+    t2 = H.makeLeafDispatchRecord(interceptor);
+    Object.defineProperty(proto, init.dispatchPropertyName, {value: t2, enumerable: false, writable: true, configurable: true});
+    options = {prototype: proto};
+    if (!t1)
+      options.extends = extendsTagName;
+    $document.registerElement(tag, options);
+  },
+  _wrapZone: function(callback) {
+    if (J.$eq($.Zone__current, C.C__RootZone))
+      return callback;
+    if (callback == null)
+      return;
+    return $.Zone__current.bindUnaryCallback$2$runGuarded(callback, true);
+  },
+  _wrapBinaryZone: function(callback) {
+    if (J.$eq($.Zone__current, C.C__RootZone))
+      return callback;
+    return $.Zone__current.bindBinaryCallback$2$runGuarded(callback, true);
+  },
+  HtmlElement: {
+    "^": "Element;",
+    "%": "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;HtmlElement_Polymer|HtmlElement_Polymer_ChangeNotifier|PolymerElement|PolymerElement_ChangeNotifier|ActionLinkElement|ObservatoryElement|ObservatoryElement_ChangeNotifier|BreakpointListElement|ObservatoryElement_ChangeNotifier0|ServiceRefElement|ClassRefElement|ObservatoryElement_ChangeNotifier1|ClassTreeElement|ObservatoryElement_ChangeNotifier2|ClassViewElement|CodeRefElement|ObservatoryElement_ChangeNotifier3|CodeViewElement|PolymerElement_ChangeNotifier0|CurlyBlockElement|ObservatoryElement_ChangeNotifier4|ErrorViewElement|ObservatoryElement_ChangeNotifier5|EvalBoxElement|PolymerElement_ChangeNotifier1|EvalLinkElement|FieldRefElement|ObservatoryElement_ChangeNotifier6|FieldViewElement|ObservatoryElement_ChangeNotifier7|FlagListElement|ObservatoryElement_ChangeNotifier8|FlagItemElement|ServiceRefElement_ChangeNotifier|FunctionRefElement|ObservatoryElement_ChangeNotifier9|FunctionViewElement|ObservatoryElement_ChangeNotifier10|HeapMapElement|ObservatoryElement_ChangeNotifier11|HeapProfileElement|InstanceRefElement|ObservatoryElement_ChangeNotifier12|InstanceViewElement|ObservatoryElement_ChangeNotifier13|IOViewElement|IORefElement|ObservatoryElement_ChangeNotifier14|IOHttpServerListViewElement|IOHttpServerRefElement|ObservatoryElement_ChangeNotifier15|IOHttpServerViewElement|ObservatoryElement_ChangeNotifier16|IOHttpServerConnectionViewElement|IOHttpServerConnectionRefElement|IOSocketRefElement|ObservatoryElement_ChangeNotifier17|IOSocketListViewElement|ObservatoryElement_ChangeNotifier18|IOSocketViewElement|IOWebSocketRefElement|ObservatoryElement_ChangeNotifier19|IOWebSocketListViewElement|ObservatoryElement_ChangeNotifier20|IOWebSocketViewElement|ObservatoryElement_ChangeNotifier21|IORandomAccessFileListViewElement|IORandomAccessFileRefElement|ObservatoryElement_ChangeNotifier22|IORandomAccessFileViewElement|ObservatoryElement_ChangeNotifier23|IOProcessListViewElement|ServiceRefElement_ChangeNotifier0|IOProcessRefElement|ObservatoryElement_ChangeNotifier24|IOProcessViewElement|ObservatoryElement_ChangeNotifier25|IsolateProfileElement|IsolateRefElement|ObservatoryElement_ChangeNotifier26|IsolateSummaryElement|ObservatoryElement_ChangeNotifier27|IsolateRunStateElement|ObservatoryElement_ChangeNotifier28|IsolateLocationElement|ObservatoryElement_ChangeNotifier29|IsolateSharedSummaryElement|ObservatoryElement_ChangeNotifier30|IsolateCounterChartElement|ObservatoryElement_ChangeNotifier31|IsolateViewElement|ObservatoryElement_ChangeNotifier32|JsonViewElement|LibraryRefElement|ObservatoryElement_ChangeNotifier33|LibraryViewElement|ObservatoryElement_ChangeNotifier34|NavBarElement|ObservatoryElement_ChangeNotifier35|NavMenuElement|ObservatoryElement_ChangeNotifier36|NavMenuItemElement|ObservatoryElement_ChangeNotifier37|NavRefreshElement|NavControlElement|ObservatoryElement_ChangeNotifier38|TopNavMenuElement|ObservatoryElement_ChangeNotifier39|IsolateNavMenuElement|ObservatoryElement_ChangeNotifier40|LibraryNavMenuElement|ObservatoryElement_ChangeNotifier41|ClassNavMenuElement|ObservatoryElement_ChangeNotifier42|ObservatoryApplicationElement|ObservatoryElement_ChangeNotifier43|ScriptInsetElement|ServiceRefElement_ChangeNotifier1|ScriptRefElement|ObservatoryElement_ChangeNotifier44|ScriptViewElement|ObservatoryElement_ChangeNotifier45|ServiceErrorViewElement|ObservatoryElement_ChangeNotifier46|ServiceExceptionViewElement|ObservatoryElement_ChangeNotifier47|ServiceObjectViewElement|PolymerElement_ChangeNotifier2|SlidingCheckboxElement|ObservatoryElement_ChangeNotifier48|StackFrameElement|ObservatoryElement_ChangeNotifier49|StackTraceElement|VMRefElement|ObservatoryElement_ChangeNotifier50|VMViewElement"
+  },
+  _EntryArray: {
+    "^": "Interceptor;",
+    $isList: true,
+    $asList: function() {
+      return [W.Entry];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Entry];
+    },
+    "%": "EntryArray"
+  },
+  AnchorElement: {
+    "^": "HtmlElement;target=,type%,href%,protocol=",
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    "%": "HTMLAnchorElement"
+  },
+  AreaElement: {
+    "^": "HtmlElement;target=,href%,protocol=",
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    "%": "HTMLAreaElement"
+  },
+  BaseElement: {
+    "^": "HtmlElement;href%,target=",
+    "%": "HTMLBaseElement"
+  },
+  Blob: {
+    "^": "Interceptor;type=",
+    $isBlob: true,
+    "%": ";Blob"
+  },
+  BodyElement: {
+    "^": "HtmlElement;",
+    $isEventTarget: true,
+    "%": "HTMLBodyElement"
+  },
+  ButtonElement: {
+    "^": "HtmlElement;form=,name%,type%,value%",
+    "%": "HTMLButtonElement"
+  },
+  CanvasElement: {
+    "^": "HtmlElement;height},width}",
+    get$context2D: function(receiver) {
+      return receiver.getContext("2d");
+    },
+    "%": "HTMLCanvasElement"
+  },
+  CanvasRenderingContext: {
+    "^": "Interceptor;",
+    "%": ";CanvasRenderingContext"
+  },
+  CanvasRenderingContext2D: {
+    "^": "CanvasRenderingContext;",
+    putImageData$7: function(receiver, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
+      var t1;
+      if (dirtyWidth != null)
+        t1 = true;
+      else
+        t1 = false;
+      if (t1) {
+        receiver.putImageData(P.convertDartToNative_ImageData(imagedata), dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+        return;
+      }
+      throw H.wrapException(P.ArgumentError$("Incorrect number or type of arguments"));
+    },
+    "%": "CanvasRenderingContext2D"
+  },
+  CharacterData: {
+    "^": "Node;data=,length=,nextElementSibling=",
+    "%": "Comment;CharacterData"
+  },
+  CloseEvent: {
+    "^": "Event;code=",
+    "%": "CloseEvent"
+  },
+  CompositionEvent: {
+    "^": "UIEvent;data=",
+    "%": "CompositionEvent"
+  },
+  CustomEvent: {
+    "^": "Event;_dartDetail}",
+    get$detail: function(receiver) {
+      var t1 = receiver._dartDetail;
+      if (t1 != null)
+        return t1;
+      return P.convertNativeToDart_AcceptStructuredClone(receiver.detail, true);
+    },
+    _initCustomEvent$4: function(receiver, typeArg, canBubbleArg, cancelableArg, detailArg) {
+      return receiver.initCustomEvent(typeArg, canBubbleArg, cancelableArg, detailArg);
+    },
+    $isCustomEvent: true,
+    "%": "CustomEvent"
+  },
+  DetailsElement: {
+    "^": "HtmlElement;",
+    open$1: function($receiver, arg0) {
+      return $receiver.open.call$1(arg0);
+    },
+    "%": "HTMLDetailsElement"
+  },
+  DialogElement: {
+    "^": "HtmlElement;",
+    open$1: function($receiver, arg0) {
+      return $receiver.open.call$1(arg0);
+    },
+    "%": "HTMLDialogElement"
+  },
+  Document: {
+    "^": "Node;",
+    createDocumentFragment$0: function(receiver) {
+      return receiver.createDocumentFragment();
+    },
+    getElementById$1: function(receiver, elementId) {
+      return receiver.getElementById(elementId);
+    },
+    importNode$2: function(receiver, node, deep) {
+      return receiver.importNode(node, deep);
+    },
+    querySelector$1: function(receiver, selectors) {
+      return receiver.querySelector(selectors);
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onClick: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_click._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    querySelectorAll$1: function(receiver, selectors) {
+      return W._FrozenElementList$_wrap(receiver.querySelectorAll(selectors), null);
+    },
+    $isDocument: true,
+    "%": "XMLDocument;Document"
+  },
+  DocumentFragment: {
+    "^": "Node;",
+    get$children: function(receiver) {
+      if (receiver._docChildren == null)
+        receiver._docChildren = H.setRuntimeTypeInfo(new P.FilteredElementList(receiver, new W._ChildNodeListLazy(receiver)), [null]);
+      return receiver._docChildren;
+    },
+    querySelectorAll$1: function(receiver, selectors) {
+      return W._FrozenElementList$_wrap(receiver.querySelectorAll(selectors), null);
+    },
+    querySelector$1: function(receiver, selectors) {
+      return receiver.querySelector(selectors);
+    },
+    "%": ";DocumentFragment"
+  },
+  DomError: {
+    "^": "Interceptor;message=,name=",
+    "%": ";DOMError"
+  },
+  DomException: {
+    "^": "Interceptor;message=",
+    get$name: function(receiver) {
+      var errorName = receiver.name;
+      if (P.Device_isWebKit() === true && errorName === "SECURITY_ERR")
+        return "SecurityError";
+      if (P.Device_isWebKit() === true && errorName === "SYNTAX_ERR")
+        return "SyntaxError";
+      return errorName;
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    $isDomException: true,
+    "%": "DOMException"
+  },
+  Element: {
+    "^": "Node;title},className%,id=,tagName=,nextElementSibling=",
+    get$attributes: function(receiver) {
+      return new W._ElementAttributeMap(receiver);
+    },
+    get$children: function(receiver) {
+      return new W._ChildrenElementList(receiver, receiver.children);
+    },
+    querySelectorAll$1: function(receiver, selectors) {
+      return W._FrozenElementList$_wrap(receiver.querySelectorAll(selectors), null);
+    },
+    get$classes: function(receiver) {
+      return new W._ElementCssClassSet(receiver);
+    },
+    get$offset: function(receiver) {
+      return P.Rectangle$(C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetLeft)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetTop)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetWidth)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetHeight)), null);
+    },
+    attached$0: function(receiver) {
+    },
+    detached$0: function(receiver) {
+    },
+    attributeChanged$3: function(receiver, $name, oldValue, newValue) {
+    },
+    get$localName: function(receiver) {
+      return receiver.localName;
+    },
+    get$namespaceUri: function(receiver) {
+      return receiver.namespaceURI;
+    },
+    toString$0: function(receiver) {
+      return receiver.localName;
+    },
+    matches$1: function(receiver, selectors) {
+      if (!!receiver.matches)
+        return receiver.matches(selectors);
+      else if (!!receiver.webkitMatchesSelector)
+        return receiver.webkitMatchesSelector(selectors);
+      else if (!!receiver.mozMatchesSelector)
+        return receiver.mozMatchesSelector(selectors);
+      else if (!!receiver.msMatchesSelector)
+        return receiver.msMatchesSelector(selectors);
+      else if (!!receiver.oMatchesSelector)
+        return receiver.oMatchesSelector(selectors);
+      else
+        throw H.wrapException(P.UnsupportedError$("Not supported on this platform"));
+    },
+    matchesWithAncestors$1: function(receiver, selectors) {
+      var elem = receiver;
+      do {
+        if (J.matches$1$x(elem, selectors))
+          return true;
+        elem = elem.parentElement;
+      } while (elem != null);
+      return false;
+    },
+    createShadowRoot$0: function(receiver) {
+      return (receiver.createShadowRoot || receiver.webkitCreateShadowRoot).call(receiver);
+    },
+    get$on: function(receiver) {
+      return new W.ElementEvents(receiver, receiver);
+    },
+    getAttribute$1: function(receiver, $name) {
+      return receiver.getAttribute($name);
+    },
+    getBoundingClientRect$0: function(receiver) {
+      return receiver.getBoundingClientRect();
+    },
+    querySelector$1: function(receiver, selectors) {
+      return receiver.querySelector(selectors);
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onClick: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_click._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    get$onMouseDown: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousedown._eventType, false), [null]);
+    },
+    get$onMouseMove: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousemove._eventType, false), [null]);
+    },
+    Element$created$0: function(receiver) {
+    },
+    $isElement: true,
+    $isEventTarget: true,
+    "%": ";Element"
+  },
+  EmbedElement: {
+    "^": "HtmlElement;height},name%,type%,width}",
+    "%": "HTMLEmbedElement"
+  },
+  ErrorEvent: {
+    "^": "Event;error=,message=",
+    "%": "ErrorEvent"
+  },
+  Event: {
+    "^": "Interceptor;_selector},path=,type=",
+    get$currentTarget: function(receiver) {
+      return W._convertNativeToDart_EventTarget(receiver.currentTarget);
+    },
+    get$target: function(receiver) {
+      return W._convertNativeToDart_EventTarget(receiver.target);
+    },
+    preventDefault$0: function(receiver) {
+      return receiver.preventDefault();
+    },
+    $isEvent: true,
+    "%": "AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"
+  },
+  EventTarget: {
+    "^": "Interceptor;",
+    get$on: function(receiver) {
+      return new W.Events(receiver);
+    },
+    addEventListener$3: function(receiver, type, listener, useCapture) {
+      return receiver.addEventListener(type, H.convertDartClosureToJS(listener, 1), useCapture);
+    },
+    addEventListener$2: function($receiver, type, listener) {
+      listener = H.convertDartClosureToJS(listener, 1);
+      return $receiver.addEventListener(type, listener);
+    },
+    dispatchEvent$1: function(receiver, $event) {
+      return receiver.dispatchEvent($event);
+    },
+    removeEventListener$3: function(receiver, type, listener, useCapture) {
+      return receiver.removeEventListener(type, H.convertDartClosureToJS(listener, 1), useCapture);
+    },
+    $isEventTarget: true,
+    "%": ";EventTarget"
+  },
+  FieldSetElement: {
+    "^": "HtmlElement;form=,name%,type=",
+    "%": "HTMLFieldSetElement"
+  },
+  File: {
+    "^": "Blob;name=",
+    $isFile: true,
+    "%": "File"
+  },
+  FileError: {
+    "^": "DomError;code=",
+    "%": "FileError"
+  },
+  FormElement: {
+    "^": "HtmlElement;length=,name%,target=",
+    "%": "HTMLFormElement"
+  },
+  History: {
+    "^": "Interceptor;length=",
+    "%": "History"
+  },
+  HtmlCollection: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"
+  },
+  HtmlDocument: {
+    "^": "Document;",
+    get$head: function(receiver) {
+      return receiver.head;
+    },
+    set$title: function(receiver, value) {
+      receiver.title = value;
+    },
+    "%": "HTMLDocument"
+  },
+  HttpRequest: {
+    "^": "HttpRequestEventTarget;responseText=,status=,statusText=",
+    get$response: function(receiver) {
+      return W._convertNativeToDart_XHR_Response(receiver.response);
+    },
+    open$5$async$password$user: function(receiver, method, url, async, password, user) {
+      return receiver.open(method, url, async, user, password);
+    },
+    open$3$async: function($receiver, method, url, async) {
+      return $receiver.open(method, url, async);
+    },
+    send$1: function(receiver, data) {
+      return receiver.send(data);
+    },
+    $isHttpRequest: true,
+    "%": "XMLHttpRequest"
+  },
+  HttpRequestEventTarget: {
+    "^": "EventTarget;",
+    "%": ";XMLHttpRequestEventTarget"
+  },
+  IFrameElement: {
+    "^": "HtmlElement;height},name%,width}",
+    "%": "HTMLIFrameElement"
+  },
+  ImageData: {
+    "^": "Interceptor;data=,height=,width=",
+    $isImageData: true,
+    "%": "ImageData"
+  },
+  ImageElement: {
+    "^": "HtmlElement;height},width}",
+    complete$1: function($receiver, arg0) {
+      return $receiver.complete.call$1(arg0);
+    },
+    "%": "HTMLImageElement"
+  },
+  InputElement: {
+    "^": "HtmlElement;checked%,form=,height},list=,name%,type%,value%,width}",
+    accept$1: function($receiver, arg0) {
+      return $receiver.accept.call$1(arg0);
+    },
+    $isInputElement: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true,
+    "%": "HTMLInputElement"
+  },
+  KeyboardEvent: {
+    "^": "UIEvent;altKey=,ctrlKey=,metaKey=,shiftKey=",
+    "%": "KeyboardEvent"
+  },
+  KeygenElement: {
+    "^": "HtmlElement;form=,name%,type=",
+    "%": "HTMLKeygenElement"
+  },
+  LIElement: {
+    "^": "HtmlElement;value%",
+    "%": "HTMLLIElement"
+  },
+  LabelElement: {
+    "^": "HtmlElement;form=",
+    "%": "HTMLLabelElement"
+  },
+  LegendElement: {
+    "^": "HtmlElement;form=",
+    "%": "HTMLLegendElement"
+  },
+  LinkElement: {
+    "^": "HtmlElement;href%,type%",
+    "%": "HTMLLinkElement"
+  },
+  Location: {
+    "^": "Interceptor;href=,protocol=",
+    reload$0: function(receiver) {
+      return receiver.reload();
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    "%": "Location"
+  },
+  MapElement: {
+    "^": "HtmlElement;name%",
+    "%": "HTMLMapElement"
+  },
+  MediaElement: {
+    "^": "HtmlElement;error=",
+    load$0: function(receiver) {
+      return receiver.load();
+    },
+    pause$0: [function(receiver) {
+      return receiver.pause();
+    }, "call$0", "get$pause", 0, 0, 18],
+    "%": "HTMLAudioElement;HTMLMediaElement",
+    static: {"^": "MediaElement_pauseEvent<"}
+  },
+  MediaError: {
+    "^": "Interceptor;code=",
+    "%": "MediaError"
+  },
+  MediaKeyError: {
+    "^": "Interceptor;code=",
+    "%": "MediaKeyError"
+  },
+  MediaKeyEvent: {
+    "^": "Event;message=",
+    "%": "MediaKeyEvent"
+  },
+  MediaKeyMessageEvent: {
+    "^": "Event;message=",
+    "%": "MediaKeyMessageEvent"
+  },
+  MediaStream: {
+    "^": "EventTarget;id=,label=",
+    "%": "MediaStream"
+  },
+  MessageEvent: {
+    "^": "Event;",
+    get$data: function(receiver) {
+      return P.convertNativeToDart_AcceptStructuredClone(receiver.data, true);
+    },
+    $isMessageEvent: true,
+    "%": "MessageEvent"
+  },
+  MetaElement: {
+    "^": "HtmlElement;content=,name%",
+    "%": "HTMLMetaElement"
+  },
+  MeterElement: {
+    "^": "HtmlElement;value%",
+    "%": "HTMLMeterElement"
+  },
+  MidiMessageEvent: {
+    "^": "Event;data=",
+    "%": "MIDIMessageEvent"
+  },
+  MidiOutput: {
+    "^": "MidiPort;",
+    send$2: function(receiver, data, timestamp) {
+      return receiver.send(data, timestamp);
+    },
+    send$1: function($receiver, data) {
+      return $receiver.send(data);
+    },
+    "%": "MIDIOutput"
+  },
+  MidiPort: {
+    "^": "EventTarget;id=,name=,type=,version=",
+    "%": "MIDIInput;MIDIPort"
+  },
+  MouseEvent: {
+    "^": "UIEvent;altKey=,button=,ctrlKey=,metaKey=,shiftKey=",
+    _initMouseEvent$15: function(receiver, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
+      receiver.initMouseEvent(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, W._convertDartToNative_EventTarget(relatedTarget));
+      return;
+    },
+    get$offset: function(receiver) {
+      var target, point;
+      if (!!receiver.offsetX)
+        return H.setRuntimeTypeInfo(new P.Point(receiver.offsetX, receiver.offsetY), [null]);
+      else {
+        if (!J.getInterceptor(W._convertNativeToDart_EventTarget(receiver.target)).$isElement)
+          throw H.wrapException(P.UnsupportedError$("offsetX is only supported on elements"));
+        target = W._convertNativeToDart_EventTarget(receiver.target);
+        point = H.setRuntimeTypeInfo(new P.Point(receiver.clientX, receiver.clientY), [null]).$sub(0, J.get$topLeft$x(J.getBoundingClientRect$0$x(target)));
+        return H.setRuntimeTypeInfo(new P.Point(J.toInt$0$n(point.x), J.toInt$0$n(point.y)), [null]);
+      }
+    },
+    $isMouseEvent: true,
+    "%": "DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"
+  },
+  MutationObserver: {
+    "^": "Interceptor;",
+    observe$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree: function(receiver, target, attributeFilter, attributeOldValue, attributes, characterData, characterDataOldValue, childList, subtree) {
+      var parsedOptions, t1;
+      parsedOptions = {};
+      t1 = new W.MutationObserver_observe_override(parsedOptions);
+      t1.call$2("childList", childList);
+      t1.call$2("attributes", attributes);
+      t1.call$2("characterData", characterData);
+      t1.call$2("subtree", subtree);
+      t1.call$2("attributeOldValue", attributeOldValue);
+      t1.call$2("characterDataOldValue", characterDataOldValue);
+      t1.call$2("attributeFilter", attributeFilter);
+      receiver.observe(target, parsedOptions);
+    },
+    observe$3$attributeFilter$attributes: function($receiver, target, attributeFilter, attributes) {
+      return this.observe$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree($receiver, target, attributeFilter, null, attributes, null, null, null, null);
+    },
+    "%": "MutationObserver|WebKitMutationObserver"
+  },
+  MutationRecord: {
+    "^": "Interceptor;target=,type=",
+    "%": "MutationRecord"
+  },
+  NavigatorUserMediaError: {
+    "^": "Interceptor;message=,name=",
+    "%": "NavigatorUserMediaError"
+  },
+  Node: {
+    "^": "EventTarget;firstChild=,nextNode:nextSibling=,ownerDocument=,parent:parentElement=,parentNode=,text:textContent%",
+    get$nodes: function(receiver) {
+      return new W._ChildNodeListLazy(receiver);
+    },
+    remove$0: function(receiver) {
+      var t1 = receiver.parentNode;
+      if (t1 != null)
+        t1.removeChild(receiver);
+    },
+    replaceWith$1: function(receiver, otherNode) {
+      var $parent, exception;
+      try {
+        $parent = receiver.parentNode;
+        J._replaceChild$2$x($parent, otherNode, receiver);
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+
+      return receiver;
+    },
+    insertAllBefore$2: function(receiver, newNodes, refChild) {
+      var t1, len, i;
+      t1 = J.getInterceptor(newNodes);
+      if (!!t1.$is_ChildNodeListLazy) {
+        t1 = newNodes._this;
+        if (t1 === receiver)
+          throw H.wrapException(P.ArgumentError$(newNodes));
+        for (len = t1.childNodes.length, i = 0; i < len; ++i)
+          receiver.insertBefore(t1.firstChild, refChild);
+      } else
+        for (t1 = t1.get$iterator(newNodes); t1.moveNext$0();)
+          receiver.insertBefore(t1.get$current(), refChild);
+    },
+    _clearChildren$0: function(receiver) {
+      var t1;
+      for (; t1 = receiver.firstChild, t1 != null;)
+        receiver.removeChild(t1);
+    },
+    toString$0: function(receiver) {
+      var t1 = receiver.nodeValue;
+      return t1 == null ? J.Interceptor.prototype.toString$0.call(this, receiver) : t1;
+    },
+    append$1: function(receiver, newChild) {
+      return receiver.appendChild(newChild);
+    },
+    contains$1: function(receiver, other) {
+      return receiver.contains(other);
+    },
+    insertBefore$2: function(receiver, newChild, refChild) {
+      return receiver.insertBefore(newChild, refChild);
+    },
+    _replaceChild$2: function(receiver, newChild, oldChild) {
+      return receiver.replaceChild(newChild, oldChild);
+    },
+    $isNode: true,
+    "%": "DocumentType|Notation;Node"
+  },
+  NodeList: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin0;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "NodeList|RadioNodeList"
+  },
+  OListElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLOListElement"
+  },
+  ObjectElement: {
+    "^": "HtmlElement;data=,form=,height},name%,type%,width}",
+    "%": "HTMLObjectElement"
+  },
+  OptGroupElement: {
+    "^": "HtmlElement;label%",
+    "%": "HTMLOptGroupElement"
+  },
+  OptionElement: {
+    "^": "HtmlElement;form=,index=,label%,value%",
+    $isOptionElement: true,
+    "%": "HTMLOptionElement"
+  },
+  OutputElement: {
+    "^": "HtmlElement;form=,name%,type=,value%",
+    "%": "HTMLOutputElement"
+  },
+  ParamElement: {
+    "^": "HtmlElement;name%,value%",
+    "%": "HTMLParamElement"
+  },
+  PopStateEvent: {
+    "^": "Event;",
+    $isPopStateEvent: true,
+    "%": "PopStateEvent"
+  },
+  PositionError: {
+    "^": "Interceptor;code=,message=",
+    "%": "PositionError"
+  },
+  ProcessingInstruction: {
+    "^": "CharacterData;target=",
+    "%": "ProcessingInstruction"
+  },
+  ProgressElement: {
+    "^": "HtmlElement;value%",
+    "%": "HTMLProgressElement"
+  },
+  ProgressEvent: {
+    "^": "Event;loaded=",
+    $isProgressEvent: true,
+    "%": "XMLHttpRequestProgressEvent;ProgressEvent"
+  },
+  ResourceProgressEvent: {
+    "^": "ProgressEvent;url=",
+    "%": "ResourceProgressEvent"
+  },
+  ScriptElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLScriptElement"
+  },
+  SecurityPolicyViolationEvent: {
+    "^": "Event;lineNumber=",
+    "%": "SecurityPolicyViolationEvent"
+  },
+  SelectElement: {
+    "^": "HtmlElement;form=,length%,name%,selectedIndex%,type=,value%",
+    $isSelectElement: true,
+    "%": "HTMLSelectElement"
+  },
+  ShadowRoot: {
+    "^": "DocumentFragment;",
+    getElementById$1: function(receiver, elementId) {
+      return receiver.getElementById(elementId);
+    },
+    $isShadowRoot: true,
+    "%": "ShadowRoot"
+  },
+  SourceElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLSourceElement"
+  },
+  SpeechRecognitionError: {
+    "^": "Event;error=,message=",
+    "%": "SpeechRecognitionError"
+  },
+  SpeechRecognitionEvent: {
+    "^": "Event;results=",
+    "%": "SpeechRecognitionEvent"
+  },
+  SpeechRecognitionResult: {
+    "^": "Interceptor;isFinal=,length=",
+    "%": "SpeechRecognitionResult"
+  },
+  SpeechSynthesisEvent: {
+    "^": "Event;name=",
+    "%": "SpeechSynthesisEvent"
+  },
+  StorageEvent: {
+    "^": "Event;key=,url=",
+    "%": "StorageEvent"
+  },
+  StyleElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLStyleElement"
+  },
+  TableCellElement: {
+    "^": "HtmlElement;",
+    $isTableCellElement: true,
+    "%": "HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"
+  },
+  TableElement: {
+    "^": "HtmlElement;",
+    get$rows: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._WrappedList(receiver.rows), [W.TableRowElement]);
+    },
+    "%": "HTMLTableElement"
+  },
+  TableRowElement: {
+    "^": "HtmlElement;rowIndex=",
+    insertCell$1: function(receiver, index) {
+      return receiver.insertCell(index);
+    },
+    $isTableRowElement: true,
+    "%": "HTMLTableRowElement"
+  },
+  TableSectionElement: {
+    "^": "HtmlElement;",
+    get$rows: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._WrappedList(receiver.rows), [W.TableRowElement]);
+    },
+    "%": "HTMLTableSectionElement"
+  },
+  TemplateElement: {
+    "^": "HtmlElement;content=",
+    $isTemplateElement: true,
+    "%": ";HTMLTemplateElement;TemplateElement_Polymer|TemplateElement_Polymer_Observable|AutoBindingElement"
+  },
+  Text: {
+    "^": "CharacterData;",
+    $isText: true,
+    "%": "CDATASection|Text"
+  },
+  TextAreaElement: {
+    "^": "HtmlElement;form=,name%,rows=,type=,value%",
+    $isTextAreaElement: true,
+    "%": "HTMLTextAreaElement"
+  },
+  TextEvent: {
+    "^": "UIEvent;data=",
+    "%": "TextEvent"
+  },
+  TouchEvent: {
+    "^": "UIEvent;altKey=,ctrlKey=,metaKey=,shiftKey=",
+    "%": "TouchEvent"
+  },
+  TrackElement: {
+    "^": "HtmlElement;kind%,label%",
+    "%": "HTMLTrackElement"
+  },
+  UIEvent: {
+    "^": "Event;detail=",
+    "%": "FocusEvent|SVGZoomEvent;UIEvent"
+  },
+  VideoElement: {
+    "^": "MediaElement;height},width}",
+    "%": "HTMLVideoElement"
+  },
+  Window: {
+    "^": "EventTarget;name%,status%",
+    _requestAnimationFrame$1: function(receiver, callback) {
+      return receiver.requestAnimationFrame(H.convertDartClosureToJS(callback, 1));
+    },
+    _ensureRequestAnimationFrame$0: function(receiver) {
+      if (!!(receiver.requestAnimationFrame && receiver.cancelAnimationFrame))
+        return;
+      (function($this) {
+        var vendors = ['ms', 'moz', 'webkit', 'o'];
+        for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
+          $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
+          $this.cancelAnimationFrame = $this[vendors[i] + 'CancelAnimationFrame'] || $this[vendors[i] + 'CancelRequestAnimationFrame'];
+        }
+        if ($this.requestAnimationFrame && $this.cancelAnimationFrame)
+          return;
+        $this.requestAnimationFrame = function(callback) {
+          return window.setTimeout(function() {
+            callback(Date.now());
+          }, 16);
+        };
+        $this.cancelAnimationFrame = function(id) {
+          clearTimeout(id);
+        };
+      })(receiver);
+    },
+    get$parent: function(receiver) {
+      return W._convertNativeToDart_Window(receiver.parent);
+    },
+    close$0: function(receiver) {
+      return receiver.close();
+    },
+    postMessage$3: function(receiver, message, targetOrigin, messagePorts) {
+      receiver.postMessage(P._convertDartToNative_PrepareForStructuredClone(message), targetOrigin);
+      return;
+    },
+    postMessage$2: function($receiver, message, targetOrigin) {
+      return this.postMessage$3($receiver, message, targetOrigin, null);
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    $isWindow: true,
+    $isEventTarget: true,
+    "%": "DOMWindow|Window"
+  },
+  _Attr: {
+    "^": "Node;name=,value%",
+    "%": "Attr"
+  },
+  _ClientRect: {
+    "^": "Interceptor;bottom=,height=,left=,right=,top=,width=",
+    toString$0: function(receiver) {
+      return "Rectangle (" + H.S(receiver.left) + ", " + H.S(receiver.top) + ") " + H.S(receiver.width) + " x " + H.S(receiver.height);
+    },
+    $eq: function(receiver, other) {
+      var t1, t2, t3;
+      if (other == null)
+        return false;
+      t1 = J.getInterceptor(other);
+      if (!t1.$isRectangle)
+        return false;
+      t2 = receiver.left;
+      t3 = t1.get$left(other);
+      if (t2 == null ? t3 == null : t2 === t3) {
+        t2 = receiver.top;
+        t3 = t1.get$top(other);
+        if (t2 == null ? t3 == null : t2 === t3) {
+          t2 = receiver.width;
+          t3 = t1.get$width(other);
+          if (t2 == null ? t3 == null : t2 === t3) {
+            t2 = receiver.height;
+            t1 = t1.get$height(other);
+            t1 = t2 == null ? t1 == null : t2 === t1;
+          } else
+            t1 = false;
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(receiver) {
+      var t1, t2, t3, t4, hash;
+      t1 = J.get$hashCode$(receiver.left);
+      t2 = J.get$hashCode$(receiver.top);
+      t3 = J.get$hashCode$(receiver.width);
+      t4 = J.get$hashCode$(receiver.height);
+      t4 = W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(0, t1), t2), t3), t4);
+      hash = 536870911 & t4 + ((67108863 & t4) << 3 >>> 0);
+      hash ^= hash >>> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    get$topLeft: function(receiver) {
+      return H.setRuntimeTypeInfo(new P.Point(receiver.left, receiver.top), [null]);
+    },
+    $isRectangle: true,
+    $asRectangle: function() {
+      return [null];
+    },
+    "%": "ClientRect|DOMRect"
+  },
+  _HTMLFrameSetElement: {
+    "^": "HtmlElement;",
+    $isEventTarget: true,
+    "%": "HTMLFrameSetElement"
+  },
+  _NamedNodeMap: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin1;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "MozNamedAttrMap|NamedNodeMap"
+  },
+  _SpeechRecognitionResultList: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin2;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "SpeechRecognitionResultList"
+  },
+  _ChildrenElementList: {
+    "^": "ListBase;_html$_element,_childElements",
+    contains$1: function(_, element) {
+      return J.contains$1$asx(this._childElements, element);
+    },
+    get$isEmpty: function(_) {
+      return this._html$_element.firstElementChild == null;
+    },
+    get$length: function(_) {
+      return this._childElements.length;
+    },
+    $index: function(_, index) {
+      var t1 = this._childElements;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      var t1 = this._childElements;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      this._html$_element.replaceChild(value, t1[index]);
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize element lists"));
+    },
+    add$1: function(_, value) {
+      this._html$_element.appendChild(value);
+      return value;
+    },
+    get$iterator: function(_) {
+      var t1 = this.toList$0(this);
+      return H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]), t2 = this._html$_element; t1.moveNext$0();)
+        t2.appendChild(t1._current);
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort element lists"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnimplementedError$(null));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    insert$2: function(_, index, element) {
+      var t1, t2, t3;
+      if (index > this._childElements.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = this._childElements;
+      t2 = t1.length;
+      t3 = this._html$_element;
+      if (index === t2)
+        t3.appendChild(element);
+      else {
+        if (index >= t2)
+          return H.ioore(t1, index);
+        t3.insertBefore(element, t1[index]);
+      }
+    },
+    setAll$2: function(_, index, iterable) {
+      throw H.wrapException(P.UnimplementedError$(null));
+    },
+    clear$0: function(_) {
+      J._clearChildren$0$x(this._html$_element);
+    },
+    removeLast$0: function(_) {
+      var result = this.get$last(this);
+      if (result != null)
+        this._html$_element.removeChild(result);
+      return result;
+    },
+    get$last: function(_) {
+      var result = this._html$_element.lastElementChild;
+      if (result == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return result;
+    },
+    $asListBase: function() {
+      return [W.Element];
+    },
+    $asObject_ListMixin: function() {
+      return [W.Element];
+    },
+    $asList: function() {
+      return [W.Element];
+    },
+    $asIterable: function() {
+      return [W.Element];
+    }
+  },
+  _FrozenElementList: {
+    "^": "ListBase;_nodeList,_elementList",
+    get$length: function(_) {
+      return this._nodeList.length;
+    },
+    $index: function(_, index) {
+      var t1 = this._nodeList;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify list"));
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify list"));
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    get$last: function(_) {
+      return C.NodeList_methods.get$last(this._nodeList);
+    },
+    get$classes: function(_) {
+      return W._MultiElementCssClassSet$(this._elementList);
+    },
+    get$onChange: function(_) {
+      return H.setRuntimeTypeInfo(new W._ElementListEventStreamImpl(this, false, C.EventStreamProvider_change._eventType), [null]);
+    },
+    get$onInput: function(_) {
+      return H.setRuntimeTypeInfo(new W._ElementListEventStreamImpl(this, false, C.EventStreamProvider_input._eventType), [null]);
+    },
+    _html$_FrozenElementList$_wrap$1: function(_nodeList, $T) {
+      var t1 = C.NodeList_methods.where$1(this._nodeList, new W._FrozenElementList$_wrap_closure());
+      this._elementList = P.List_List$from(t1, true, H.getRuntimeTypeArgument(t1, "IterableBase", 0));
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {_FrozenElementList$_wrap: function(_nodeList, $T) {
+        var t1 = H.setRuntimeTypeInfo(new W._FrozenElementList(_nodeList, null), [$T]);
+        t1._html$_FrozenElementList$_wrap$1(_nodeList, $T);
+        return t1;
+      }}
+  },
+  _FrozenElementList$_wrap_closure: {
+    "^": "Closure:13;",
+    call$1: function(e) {
+      return !!J.getInterceptor(e).$isElement;
+    },
+    $isFunction: true
+  },
+  Entry: {
+    "^": "Interceptor;"
+  },
+  Events: {
+    "^": "Object;_ptr<",
+    $index: function(_, type) {
+      return H.setRuntimeTypeInfo(new W._EventStream(this.get$_ptr(), type, false), [null]);
+    }
+  },
+  ElementEvents: {
+    "^": "Events;_ptr:html$ElementEvents$_ptr<,_ptr",
+    $index: function(_, type) {
+      var t1, t2;
+      t1 = $.get$ElementEvents_webkitEvents();
+      t2 = J.getInterceptor$s(type);
+      if (t1.get$keys()._map.containsKey$1(t2.toLowerCase$0(type)))
+        if (P.Device_isWebKit() === true)
+          return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(this.html$ElementEvents$_ptr, t1.$index(0, t2.toLowerCase$0(type)), false), [null]);
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(this.html$ElementEvents$_ptr, type, false), [null]);
+    },
+    static: {"^": "ElementEvents_webkitEvents"}
+  },
+  Interceptor_ListMixin: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin: {
+    "^": "Interceptor_ListMixin+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  HttpRequest_request_closure: {
+    "^": "Closure:75;xhr_0",
+    call$2: function(header, value) {
+      this.xhr_0.setRequestHeader(header, value);
+    },
+    $isFunction: true
+  },
+  HttpRequest_request_closure0: {
+    "^": "Closure:13;completer_1,xhr_2",
+    call$1: [function(e) {
+      var t1, t2, t3;
+      t1 = this.xhr_2;
+      t2 = t1.status;
+      if (typeof t2 !== "number")
+        return t2.$ge();
+      t2 = t2 >= 200 && t2 < 300 || t2 === 0 || t2 === 304;
+      t3 = this.completer_1;
+      if (t2) {
+        t2 = t3.future;
+        if (t2._state !== 0)
+          H.throwExpression(P.StateError$("Future already completed"));
+        t2._asyncComplete$1(t1);
+      } else
+        t3.completeError$1(e);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  MutationObserver_observe_override: {
+    "^": "Closure:75;parsedOptions_0",
+    call$2: function(key, value) {
+      if (value != null)
+        this.parsedOptions_0[key] = value;
+    },
+    $isFunction: true
+  },
+  _ChildNodeListLazy: {
+    "^": "ListBase;_this",
+    get$last: function(_) {
+      var result = this._this.lastChild;
+      if (result == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return result;
+    },
+    add$1: function(_, value) {
+      this._this.appendChild(value);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]), t2 = this._this; t1.moveNext$0();)
+        t2.appendChild(t1._current);
+    },
+    insert$2: function(_, index, node) {
+      var t1, t2, t3;
+      if (index > this._this.childNodes.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = this._this;
+      t2 = t1.childNodes;
+      t3 = t2.length;
+      if (index === t3)
+        t1.appendChild(node);
+      else {
+        if (index >= t3)
+          return H.ioore(t2, index);
+        t1.insertBefore(node, t2[index]);
+      }
+    },
+    insertAll$2: function(_, index, iterable) {
+      var t1, t2;
+      t1 = this._this;
+      t2 = t1.childNodes;
+      if (index < 0 || index >= t2.length)
+        return H.ioore(t2, index);
+      J.insertAllBefore$2$x(t1, iterable, t2[index]);
+    },
+    setAll$2: function(_, index, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setAll on Node list"));
+    },
+    clear$0: function(_) {
+      J._clearChildren$0$x(this._this);
+    },
+    $indexSet: function(_, index, value) {
+      var t1, t2;
+      t1 = this._this;
+      t2 = t1.childNodes;
+      if (index >>> 0 !== index || index >= t2.length)
+        return H.ioore(t2, index);
+      t1.replaceChild(value, t2[index]);
+    },
+    get$iterator: function(_) {
+      return C.NodeList_methods.get$iterator(this._this.childNodes);
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort Node list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setRange on Node list"));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    get$length: function(_) {
+      return this._this.childNodes.length;
+    },
+    set$length: function(_, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot set length on immutable List."));
+    },
+    $index: function(_, index) {
+      var t1 = this._this.childNodes;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $is_ChildNodeListLazy: true,
+    $asListBase: function() {
+      return [W.Node];
+    },
+    $asObject_ListMixin: function() {
+      return [W.Node];
+    },
+    $asList: function() {
+      return [W.Node];
+    },
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin0: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin0: {
+    "^": "Interceptor_ListMixin0+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin1: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin1: {
+    "^": "Interceptor_ListMixin1+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin2: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.SpeechRecognitionResult];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin2: {
+    "^": "Interceptor_ListMixin2+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.SpeechRecognitionResult];
+    }
+  },
+  _AttributeMap: {
+    "^": "Object;",
+    addAll$1: function(_, other) {
+      J.forEach$1$ax(other, new W._AttributeMap_addAll_closure(this));
+    },
+    clear$0: function(_) {
+      var t1;
+      for (t1 = this.get$keys(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        this.remove$1(0, t1._current);
+    },
+    forEach$1: function(_, f) {
+      var t1, key;
+      for (t1 = this.get$keys(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        key = t1._current;
+        f.call$2(key, this.$index(0, key));
+      }
+    },
+    get$keys: function() {
+      var attributes, keys, len, i;
+      attributes = this._html$_element.attributes;
+      keys = H.setRuntimeTypeInfo([], [P.String]);
+      for (len = attributes.length, i = 0; i < len; ++i) {
+        if (i >= attributes.length)
+          return H.ioore(attributes, i);
+        if (this._matches$1(attributes[i])) {
+          if (i >= attributes.length)
+            return H.ioore(attributes, i);
+          keys.push(J.get$name$x(attributes[i]));
+        }
+      }
+      return keys;
+    },
+    get$values: function(_) {
+      var attributes, values, len, i;
+      attributes = this._html$_element.attributes;
+      values = H.setRuntimeTypeInfo([], [P.String]);
+      for (len = attributes.length, i = 0; i < len; ++i) {
+        if (i >= attributes.length)
+          return H.ioore(attributes, i);
+        if (this._matches$1(attributes[i])) {
+          if (i >= attributes.length)
+            return H.ioore(attributes, i);
+          values.push(J.get$value$x(attributes[i]));
+        }
+      }
+      return values;
+    },
+    get$isEmpty: function(_) {
+      return this.get$length(this) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$length(this) !== 0;
+    },
+    $isMap: true,
+    $asMap: function() {
+      return [P.String, P.String];
+    }
+  },
+  _AttributeMap_addAll_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(k, v) {
+      this.this_0.$indexSet(0, k, v);
+    },
+    $isFunction: true
+  },
+  _ElementAttributeMap: {
+    "^": "_AttributeMap;_html$_element",
+    containsKey$1: function(key) {
+      return this._html$_element.hasAttribute(key);
+    },
+    $index: function(_, key) {
+      return this._html$_element.getAttribute(key);
+    },
+    $indexSet: function(_, key, value) {
+      this._html$_element.setAttribute(key, value);
+    },
+    remove$1: function(_, key) {
+      var t1, value;
+      t1 = this._html$_element;
+      value = t1.getAttribute(key);
+      t1.removeAttribute(key);
+      return value;
+    },
+    get$length: function(_) {
+      return this.get$keys().length;
+    },
+    _matches$1: function(node) {
+      return node.namespaceURI == null;
+    }
+  },
+  _MultiElementCssClassSet: {
+    "^": "CssClassSetImpl;_elementIterable,_elementCssClassSetIterable",
+    readClasses$0: function() {
+      var s = P.LinkedHashSet_LinkedHashSet(null, null, null, P.String);
+      this._elementCssClassSetIterable.forEach$1(0, new W._MultiElementCssClassSet_readClasses_closure(s));
+      return s;
+    },
+    writeClasses$1: function(s) {
+      var classes, t1;
+      classes = C.JSArray_methods.join$1(P.List_List$from(s, true, null), " ");
+      for (t1 = this._elementIterable, t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.set$className$x(t1._current, classes);
+    },
+    modify$1: function(f) {
+      this._elementCssClassSetIterable.forEach$1(0, new W._MultiElementCssClassSet_modify_closure(f));
+    },
+    _MultiElementCssClassSet$1: function(_elementIterable) {
+      this._elementCssClassSetIterable = H.setRuntimeTypeInfo(new H.MappedListIterable(P.List_List$from(this._elementIterable, true, null), new W._MultiElementCssClassSet_closure()), [null, null]);
+    },
+    static: {_MultiElementCssClassSet$: function(_elementIterable) {
+        var t1 = new W._MultiElementCssClassSet(_elementIterable, null);
+        t1._MultiElementCssClassSet$1(_elementIterable);
+        return t1;
+      }}
+  },
+  _MultiElementCssClassSet_closure: {
+    "^": "Closure:13;",
+    call$1: [function(e) {
+      return new W._ElementCssClassSet(e);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _MultiElementCssClassSet_readClasses_closure: {
+    "^": "Closure:13;s_0",
+    call$1: function(e) {
+      return this.s_0.addAll$1(0, e.readClasses$0());
+    },
+    $isFunction: true
+  },
+  _MultiElementCssClassSet_modify_closure: {
+    "^": "Closure:13;f_0",
+    call$1: function(e) {
+      return e.modify$1(this.f_0);
+    },
+    $isFunction: true
+  },
+  _ElementCssClassSet: {
+    "^": "CssClassSetImpl;_html$_element",
+    readClasses$0: function() {
+      var s, t1, trimmed;
+      s = P.LinkedHashSet_LinkedHashSet(null, null, null, P.String);
+      for (t1 = J.get$className$x(this._html$_element).split(" "), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        trimmed = J.trim$0$s(t1._current);
+        if (trimmed.length !== 0)
+          s.add$1(0, trimmed);
+      }
+      return s;
+    },
+    writeClasses$1: function(s) {
+      P.List_List$from(s, true, null);
+      J.set$className$x(this._html$_element, s.join$1(0, " "));
+    }
+  },
+  EventStreamProvider: {
+    "^": "Object;_eventType",
+    forTarget$2$useCapture: function(e, useCapture) {
+      return H.setRuntimeTypeInfo(new W._EventStream(e, this._eventType, useCapture), [null]);
+    },
+    forTarget$1: function(e) {
+      return this.forTarget$2$useCapture(e, false);
+    }
+  },
+  _EventStream: {
+    "^": "Stream;_html$_target,_eventType,_useCapture",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var t1 = new W._EventStreamSubscription(0, this._html$_target, this._eventType, W._wrapZone(onData), this._useCapture);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      t1._tryResume$0();
+      return t1;
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    }
+  },
+  _ElementEventStreamImpl: {
+    "^": "_EventStream;_html$_target,_eventType,_useCapture",
+    matches$1: function(_, selector) {
+      var t1 = H.setRuntimeTypeInfo(new P._WhereStream(new W._ElementEventStreamImpl_matches_closure(selector), this), [H.getRuntimeTypeArgument(this, "Stream", 0)]);
+      return H.setRuntimeTypeInfo(new P._MapStream(new W._ElementEventStreamImpl_matches_closure0(selector), t1), [H.getRuntimeTypeArgument(t1, "Stream", 0), null]);
+    },
+    $isStream: true
+  },
+  _ElementEventStreamImpl_matches_closure: {
+    "^": "Closure:13;selector_0",
+    call$1: function($event) {
+      return J.matchesWithAncestors$1$x(J.get$target$x($event), this.selector_0);
+    },
+    $isFunction: true
+  },
+  _ElementEventStreamImpl_matches_closure0: {
+    "^": "Closure:13;selector_1",
+    call$1: [function(e) {
+      J.set$_selector$x(e, this.selector_1);
+      return e;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _ElementListEventStreamImpl: {
+    "^": "Stream;_targetList,_useCapture,_eventType",
+    matches$1: function(_, selector) {
+      var t1 = H.setRuntimeTypeInfo(new P._WhereStream(new W._ElementListEventStreamImpl_matches_closure(selector), this), [H.getRuntimeTypeArgument(this, "Stream", 0)]);
+      return H.setRuntimeTypeInfo(new P._MapStream(new W._ElementListEventStreamImpl_matches_closure0(selector), t1), [H.getRuntimeTypeArgument(t1, "Stream", 0), null]);
+    },
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var pool, t1, t2, t3, t4;
+      pool = H.setRuntimeTypeInfo(new W._StreamPool(null, P.LinkedHashMap_LinkedHashMap(null, null, null, [P.Stream, null], [P.StreamSubscription, null])), [null]);
+      pool._html$_StreamPool$broadcast$0(null);
+      for (t1 = this._targetList, t1 = t1.get$iterator(t1), t2 = this._eventType, t3 = this._useCapture; t1.moveNext$0();) {
+        t4 = new W._EventStream(t1._current, t2, t3);
+        t4.$builtinTypeInfo = [null];
+        pool.add$1(0, t4);
+      }
+      t1 = pool._html$_controller;
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]).listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError);
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    $isStream: true
+  },
+  _ElementListEventStreamImpl_matches_closure: {
+    "^": "Closure:13;selector_0",
+    call$1: function($event) {
+      return J.matchesWithAncestors$1$x(J.get$target$x($event), this.selector_0);
+    },
+    $isFunction: true
+  },
+  _ElementListEventStreamImpl_matches_closure0: {
+    "^": "Closure:13;selector_1",
+    call$1: [function(e) {
+      J.set$_selector$x(e, this.selector_1);
+      return e;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _EventStreamSubscription: {
+    "^": "StreamSubscription;_pauseCount,_html$_target,_eventType,_html$_onData,_useCapture",
+    cancel$0: function() {
+      if (this._html$_target == null)
+        return;
+      this._unlisten$0();
+      this._html$_target = null;
+      this._html$_onData = null;
+      return;
+    },
+    pause$1: [function(_, resumeSignal) {
+      if (this._html$_target == null)
+        return;
+      ++this._pauseCount;
+      this._unlisten$0();
+      if (resumeSignal != null)
+        resumeSignal.whenComplete$1(this.get$resume(this));
+    }, function($receiver) {
+      return this.pause$1($receiver, null);
+    }, "pause$0", "call$1", "call$0", "get$pause", 0, 2, 116, 23, 117],
+    get$isPaused: function() {
+      return this._pauseCount > 0;
+    },
+    resume$0: [function(_) {
+      if (this._html$_target == null || this._pauseCount <= 0)
+        return;
+      --this._pauseCount;
+      this._tryResume$0();
+    }, "call$0", "get$resume", 0, 0, 18],
+    _tryResume$0: function() {
+      var t1 = this._html$_onData;
+      if (t1 != null && this._pauseCount <= 0)
+        J.addEventListener$3$x(this._html$_target, this._eventType, t1, this._useCapture);
+    },
+    _unlisten$0: function() {
+      var t1 = this._html$_onData;
+      if (t1 != null)
+        J.removeEventListener$3$x(this._html$_target, this._eventType, t1, this._useCapture);
+    }
+  },
+  _StreamPool: {
+    "^": "Object;_html$_controller,_subscriptions",
+    add$1: function(_, stream) {
+      var t1, t2;
+      t1 = this._subscriptions;
+      if (t1.containsKey$1(stream))
+        return;
+      t2 = this._html$_controller;
+      t1.$indexSet(0, stream, stream.listen$3$onDone$onError(t2.get$add(t2), new W._StreamPool_add_closure(this, stream), this._html$_controller.get$addError()));
+    },
+    remove$1: function(_, stream) {
+      var subscription = this._subscriptions.remove$1(0, stream);
+      if (subscription != null)
+        subscription.cancel$0();
+    },
+    close$0: [function(_) {
+      var t1, t2;
+      for (t1 = this._subscriptions, t2 = t1.get$values(t1), t2 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t2._iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0), H.getTypeArgumentByIndex(t2, 1)]); t2.moveNext$0();)
+        t2._current.cancel$0();
+      t1.clear$0(0);
+      this._html$_controller.close$0(0);
+    }, "call$0", "get$close", 0, 0, 18],
+    _html$_StreamPool$broadcast$0: function($T) {
+      this._html$_controller = P.StreamController_StreamController$broadcast(this.get$close(this), null, true, $T);
+    }
+  },
+  _StreamPool_add_closure: {
+    "^": "Closure:69;this_0,stream_1",
+    call$0: [function() {
+      return this.this_0.remove$1(0, this.stream_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  ImmutableListMixin: {
+    "^": "Object;",
+    get$iterator: function(receiver) {
+      return H.setRuntimeTypeInfo(new W.FixedSizeListIterator(receiver, this.get$length(receiver), -1, null), [H.getRuntimeTypeArgument(receiver, "ImmutableListMixin", 0)]);
+    },
+    add$1: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    addAll$1: function(receiver, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    sort$1: function(receiver, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort immutable List."));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    insert$2: function(receiver, index, element) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    setAll$2: function(receiver, index, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an immutable List."));
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setRange on immutable List."));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(receiver, start, end) {
+      throw H.wrapException(P.UnsupportedError$("Cannot removeRange on immutable List."));
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  _WrappedList: {
+    "^": "ListBase;_list",
+    get$iterator: function(_) {
+      return H.setRuntimeTypeInfo(new W._WrappedIterator(J.get$iterator$ax(this._list)), [null]);
+    },
+    get$length: function(_) {
+      return this._list.length;
+    },
+    add$1: function(_, element) {
+      J.add$1$ax(this._list, element);
+    },
+    clear$0: function(_) {
+      J.clear$0$ax(this._list);
+    },
+    $index: function(_, index) {
+      var t1 = this._list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      var t1 = this._list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      t1[index] = value;
+    },
+    set$length: function(_, newLength) {
+      J.set$length$asx(this._list, newLength);
+    },
+    sort$1: function(_, compare) {
+      J.sort$1$ax(this._list, compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    indexOf$2: function(_, element, start) {
+      return J.indexOf$2$asx(this._list, element, start);
+    },
+    indexOf$1: function($receiver, element) {
+      return this.indexOf$2($receiver, element, 0);
+    },
+    lastIndexOf$2: function(_, element, start) {
+      return J.lastIndexOf$2$asx(this._list, element, start);
+    },
+    lastIndexOf$1: function($receiver, element) {
+      return this.lastIndexOf$2($receiver, element, null);
+    },
+    insert$2: function(_, index, element) {
+      return J.insert$2$ax(this._list, index, element);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      J.setRange$4$ax(this._list, start, end, iterable, skipCount);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(_, start, end) {
+      J.removeRange$2$ax(this._list, start, end);
+    }
+  },
+  _WrappedIterator: {
+    "^": "Object;_html$_iterator",
+    moveNext$0: function() {
+      return this._html$_iterator.moveNext$0();
+    },
+    get$current: function() {
+      return this._html$_iterator._html$_current;
+    }
+  },
+  FixedSizeListIterator: {
+    "^": "Object;_array,_html$_length,_position,_html$_current",
+    moveNext$0: function() {
+      var nextPosition, t1;
+      nextPosition = this._position + 1;
+      t1 = this._html$_length;
+      if (nextPosition < t1) {
+        this._html$_current = J.$index$asx(this._array, nextPosition);
+        this._position = nextPosition;
+        return true;
+      }
+      this._html$_current = null;
+      this._position = t1;
+      return false;
+    },
+    get$current: function() {
+      return this._html$_current;
+    }
+  },
+  _callConstructor_closure: {
+    "^": "Closure:13;constructor_0,interceptor_1",
+    call$1: [function(receiver) {
+      var t1 = H.makeLeafDispatchRecord(this.interceptor_1);
+      Object.defineProperty(receiver, init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+      receiver.constructor = receiver.__proto__.constructor;
+      return this.constructor_0(receiver);
+    }, "call$1", null, 2, 0, null, 54, "call"],
+    $isFunction: true
+  },
+  _DOMWindowCrossFrame: {
+    "^": "Object;_window",
+    get$parent: function(_) {
+      return W._DOMWindowCrossFrame__createSafe(this._window.parent);
+    },
+    close$0: function(_) {
+      return this._window.close();
+    },
+    postMessage$3: function(_, message, targetOrigin, messagePorts) {
+      this._window.postMessage(P._convertDartToNative_PrepareForStructuredClone(message), targetOrigin);
+    },
+    postMessage$2: function($receiver, message, targetOrigin) {
+      return this.postMessage$3($receiver, message, targetOrigin, null);
+    },
+    get$on: function(_) {
+      return H.throwExpression(P.UnsupportedError$("You can only attach EventListeners to your own window."));
+    },
+    addEventListener$3: function(_, type, listener, useCapture) {
+      return H.throwExpression(P.UnsupportedError$("You can only attach EventListeners to your own window."));
+    },
+    removeEventListener$3: function(_, type, listener, useCapture) {
+      return H.throwExpression(P.UnsupportedError$("You can only attach EventListeners to your own window."));
+    },
+    $isEventTarget: true,
+    static: {_DOMWindowCrossFrame__createSafe: function(w) {
+        if (w === window)
+          return w;
+        else
+          return new W._DOMWindowCrossFrame(w);
+      }}
+  }
+}],
+["dart.dom.indexed_db", "dart:indexed_db", , P, {
+  "^": "",
+  KeyRange: {
+    "^": "Interceptor;",
+    $isKeyRange: true,
+    "%": "IDBKeyRange"
+  }
+}],
+["dart.dom.svg", "dart:svg", , P, {
+  "^": "",
+  AElement: {
+    "^": "GraphicsElement;target=,href=",
+    "%": "SVGAElement"
+  },
+  AltGlyphElement: {
+    "^": "TextPositioningElement;href=",
+    "%": "SVGAltGlyphElement"
+  },
+  FEBlendElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEBlendElement"
+  },
+  FEColorMatrixElement: {
+    "^": "SvgElement;type=,values=,result=,x=,y=",
+    "%": "SVGFEColorMatrixElement"
+  },
+  FEComponentTransferElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEComponentTransferElement"
+  },
+  FECompositeElement: {
+    "^": "SvgElement;operator=,result=,x=,y=",
+    "%": "SVGFECompositeElement"
+  },
+  FEConvolveMatrixElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEConvolveMatrixElement"
+  },
+  FEDiffuseLightingElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEDiffuseLightingElement"
+  },
+  FEDisplacementMapElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEDisplacementMapElement"
+  },
+  FEFloodElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEFloodElement"
+  },
+  FEGaussianBlurElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEGaussianBlurElement"
+  },
+  FEImageElement: {
+    "^": "SvgElement;result=,x=,y=,href=",
+    "%": "SVGFEImageElement"
+  },
+  FEMergeElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEMergeElement"
+  },
+  FEMorphologyElement: {
+    "^": "SvgElement;operator=,result=,x=,y=",
+    "%": "SVGFEMorphologyElement"
+  },
+  FEOffsetElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEOffsetElement"
+  },
+  FEPointLightElement: {
+    "^": "SvgElement;x=,y=",
+    "%": "SVGFEPointLightElement"
+  },
+  FESpecularLightingElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFESpecularLightingElement"
+  },
+  FESpotLightElement: {
+    "^": "SvgElement;x=,y=",
+    "%": "SVGFESpotLightElement"
+  },
+  FETileElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFETileElement"
+  },
+  FETurbulenceElement: {
+    "^": "SvgElement;type=,result=,x=,y=",
+    "%": "SVGFETurbulenceElement"
+  },
+  FilterElement: {
+    "^": "SvgElement;x=,y=,href=",
+    "%": "SVGFilterElement"
+  },
+  ForeignObjectElement: {
+    "^": "GraphicsElement;x=,y=",
+    "%": "SVGForeignObjectElement"
+  },
+  GeometryElement: {
+    "^": "GraphicsElement;",
+    "%": "SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"
+  },
+  GraphicsElement: {
+    "^": "SvgElement;",
+    "%": "SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"
+  },
+  ImageElement0: {
+    "^": "GraphicsElement;x=,y=,href=",
+    "%": "SVGImageElement"
+  },
+  MaskElement: {
+    "^": "SvgElement;x=,y=",
+    "%": "SVGMaskElement"
+  },
+  PatternElement: {
+    "^": "SvgElement;x=,y=,href=",
+    "%": "SVGPatternElement"
+  },
+  RectElement: {
+    "^": "GeometryElement;x=,y=",
+    "%": "SVGRectElement"
+  },
+  ScriptElement0: {
+    "^": "SvgElement;type%,href=",
+    "%": "SVGScriptElement"
+  },
+  StyleElement0: {
+    "^": "SvgElement;type%",
+    set$title: function(receiver, value) {
+      receiver.title = value;
+    },
+    "%": "SVGStyleElement"
+  },
+  SvgElement: {
+    "^": "Element;",
+    get$classes: function(receiver) {
+      if (receiver._cssClassSet == null)
+        receiver._cssClassSet = new P._AttributeClassSet(receiver);
+      return receiver._cssClassSet;
+    },
+    get$children: function(receiver) {
+      return H.setRuntimeTypeInfo(new P.FilteredElementList(receiver, new W._ChildNodeListLazy(receiver)), [W.Element]);
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onClick: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_click._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    get$onMouseDown: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousedown._eventType, false), [null]);
+    },
+    get$onMouseMove: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousemove._eventType, false), [null]);
+    },
+    $isEventTarget: 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: {"^": "SvgElement_pauseEvent<"}
+  },
+  SvgSvgElement: {
+    "^": "GraphicsElement;x=,y=",
+    getElementById$1: function(receiver, elementId) {
+      return receiver.getElementById(elementId);
+    },
+    $isSvgSvgElement: true,
+    "%": "SVGSVGElement"
+  },
+  TextContentElement: {
+    "^": "GraphicsElement;",
+    "%": ";SVGTextContentElement"
+  },
+  TextPathElement: {
+    "^": "TextContentElement;href=",
+    "%": "SVGTextPathElement"
+  },
+  TextPositioningElement: {
+    "^": "TextContentElement;x=,y=",
+    "%": "SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"
+  },
+  UseElement: {
+    "^": "GraphicsElement;x=,y=,href=",
+    "%": "SVGUseElement"
+  },
+  _GradientElement: {
+    "^": "SvgElement;href=",
+    "%": "SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"
+  },
+  _AttributeClassSet: {
+    "^": "CssClassSetImpl;_svg$_element",
+    readClasses$0: function() {
+      var classname, s, t1, trimmed;
+      classname = this._svg$_element.getAttribute("class");
+      s = P.LinkedHashSet_LinkedHashSet(null, null, null, P.String);
+      if (classname == null)
+        return s;
+      for (t1 = classname.split(" "), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        trimmed = J.trim$0$s(t1._current);
+        if (trimmed.length !== 0)
+          s.add$1(0, trimmed);
+      }
+      return s;
+    },
+    writeClasses$1: function(s) {
+      this._svg$_element.setAttribute("class", s.join$1(0, " "));
+    }
+  }
+}],
+["dart.dom.web_sql", "dart:web_sql", , P, {
+  "^": "",
+  SqlError: {
+    "^": "Interceptor;code=,message=",
+    "%": "SQLError"
+  }
+}],
+["dart.isolate", "dart:isolate", , P, {
+  "^": "",
+  ReceivePort_ReceivePort: function() {
+    var t1, t2, t3;
+    t1 = $.RawReceivePortImpl__nextFreeId;
+    $.RawReceivePortImpl__nextFreeId = t1 + 1;
+    t2 = new H.RawReceivePortImpl(t1, null, false);
+    t3 = init.globalState.currentContext;
+    t3._addRegistration$2(t1, t2);
+    t3._updateGlobalState$0();
+    t3 = new H.ReceivePortImpl(t2, null);
+    t3.ReceivePortImpl$fromRawReceivePort$1(t2);
+    return t3;
+  },
+  Capability: {
+    "^": "Object;",
+    $isCapability: true,
+    static: {Capability_Capability: function() {
+        return new H.CapabilityImpl((Math.random() * 0x100000000 >>> 0) + (Math.random() * 0x100000000 >>> 0) * 4294967296);
+      }}
+  }
+}],
+["dart.js", "dart:js", , P, {
+  "^": "",
+  _convertDartFunction: function(f, captureThis) {
+    return function(_call, f, captureThis) {
+      return function() {
+        return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));
+      };
+    }(P._callDartFunction, f, captureThis);
+  },
+  _callDartFunction: [function(callback, captureThis, $self, $arguments) {
+    var arguments0;
+    if (captureThis === true) {
+      arguments0 = [$self];
+      C.JSArray_methods.addAll$1(arguments0, $arguments);
+      $arguments = arguments0;
+    }
+    return P._convertToJS(H.Primitives_applyFunction(callback, P.List_List$from(J.map$1$ax($arguments, P._convertToDart$closure()), true, null), P.Function__toMangledNames(null)));
+  }, "call$4", "_callDartFunction$closure", 8, 0, null, 41, 59, 27, 60],
+  _defineProperty: function(o, $name, value) {
+    var exception;
+    if (Object.isExtensible(o))
+      try {
+        Object.defineProperty(o, $name, {value: value});
+        return true;
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+
+    return false;
+  },
+  _getOwnProperty: function(o, $name) {
+    if (Object.prototype.hasOwnProperty.call(o, $name))
+      return o[$name];
+    return;
+  },
+  _convertToJS: [function(o) {
+    var t1;
+    if (o == null)
+      return;
+    else if (typeof o === "string" || typeof o === "number" || typeof o === "boolean")
+      return o;
+    else {
+      t1 = J.getInterceptor(o);
+      if (!!t1.$isBlob || !!t1.$isEvent || !!t1.$isKeyRange || !!t1.$isImageData || !!t1.$isNode || !!t1.$isTypedData || !!t1.$isWindow)
+        return o;
+      else if (!!t1.$isDateTime)
+        return H.Primitives_lazyAsJsDate(o);
+      else if (!!t1.$isJsObject)
+        return o._js$_jsObject;
+      else if (!!t1.$isFunction)
+        return P._getJsProxy(o, "$dart_jsFunction", new P._convertToJS_closure());
+      else
+        return P._getJsProxy(o, "_$dart_jsObject", new P._convertToJS_closure0($.get$_dartProxyCtor()));
+    }
+  }, "call$1", "_convertToJS$closure", 2, 0, 13, 61],
+  _getJsProxy: function(o, propertyName, createProxy) {
+    var jsProxy = P._getOwnProperty(o, propertyName);
+    if (jsProxy == null) {
+      jsProxy = createProxy.call$1(o);
+      P._defineProperty(o, propertyName, jsProxy);
+    }
+    return jsProxy;
+  },
+  _convertToDart: [function(o) {
+    var t1;
+    if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean")
+      return o;
+    else {
+      if (o instanceof Object) {
+        t1 = J.getInterceptor(o);
+        t1 = !!t1.$isBlob || !!t1.$isEvent || !!t1.$isKeyRange || !!t1.$isImageData || !!t1.$isNode || !!t1.$isTypedData || !!t1.$isWindow;
+      } else
+        t1 = false;
+      if (t1)
+        return o;
+      else if (o instanceof Date)
+        return P.DateTime$fromMillisecondsSinceEpoch(o.getTime(), false);
+      else if (o.constructor === $.get$_dartProxyCtor())
+        return o.o;
+      else
+        return P._wrapToDart(o);
+    }
+  }, "call$1", "_convertToDart$closure", 2, 0, 49, 61],
+  _wrapToDart: function(o) {
+    if (typeof o == "function")
+      return P._getDartProxy(o, $.get$_DART_CLOSURE_PROPERTY_NAME(), new P._wrapToDart_closure());
+    else if (o instanceof Array)
+      return P._getDartProxy(o, $.get$_DART_OBJECT_PROPERTY_NAME(), new P._wrapToDart_closure0());
+    else
+      return P._getDartProxy(o, $.get$_DART_OBJECT_PROPERTY_NAME(), new P._wrapToDart_closure1());
+  },
+  _getDartProxy: function(o, propertyName, createProxy) {
+    var dartProxy = P._getOwnProperty(o, propertyName);
+    if (dartProxy == null || !(o instanceof Object)) {
+      dartProxy = createProxy.call$1(o);
+      P._defineProperty(o, propertyName, dartProxy);
+    }
+    return dartProxy;
+  },
+  JsObject: {
+    "^": "Object;_js$_jsObject",
+    $index: function(_, property) {
+      if (typeof property !== "string" && typeof property !== "number")
+        throw H.wrapException(P.ArgumentError$("property is not a String or num"));
+      return P._convertToDart(this._js$_jsObject[property]);
+    },
+    $indexSet: function(_, property, value) {
+      if (typeof property !== "string" && typeof property !== "number")
+        throw H.wrapException(P.ArgumentError$("property is not a String or num"));
+      this._js$_jsObject[property] = P._convertToJS(value);
+    },
+    get$hashCode: function(_) {
+      return 0;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isJsObject && this._js$_jsObject === other._js$_jsObject;
+    },
+    hasProperty$1: function(property) {
+      return property in this._js$_jsObject;
+    },
+    toString$0: function(_) {
+      var t1, exception;
+      try {
+        t1 = String(this._js$_jsObject);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return P.Object.prototype.toString$0.call(this, this);
+      }
+
+    },
+    callMethod$2: function(method, args) {
+      var t1, t2;
+      t1 = this._js$_jsObject;
+      t2 = args == null ? null : P.List_List$from(H.setRuntimeTypeInfo(new H.MappedListIterable(args, P._convertToJS$closure()), [null, null]), true, null);
+      return P._convertToDart(t1[method].apply(t1, t2));
+    },
+    callMethod$1: function(method) {
+      return this.callMethod$2(method, null);
+    },
+    $isJsObject: true,
+    static: {JsObject_JsObject: function($constructor, $arguments) {
+        var constr, args, factoryFunction;
+        constr = P._convertToJS($constructor);
+        if ($arguments == null)
+          return P._wrapToDart(new constr());
+        args = [null];
+        C.JSArray_methods.addAll$1(args, H.setRuntimeTypeInfo(new H.MappedListIterable($arguments, P._convertToJS$closure()), [null, null]));
+        factoryFunction = constr.bind.apply(constr, args);
+        String(factoryFunction);
+        return P._wrapToDart(new factoryFunction());
+      }, JsObject_JsObject$fromBrowserObject: function(object) {
+        if (object == null)
+          throw H.wrapException(P.ArgumentError$("object cannot be a num, string, bool, or null"));
+        return P._wrapToDart(P._convertToJS(object));
+      }, JsObject_JsObject$jsify: function(object) {
+        return P._wrapToDart(P.JsObject__convertDataTree(object));
+      }, JsObject__convertDataTree: function(data) {
+        return new P.JsObject__convertDataTree__convert(P.HashMap_HashMap$identity(null, null)).call$1(data);
+      }}
+  },
+  JsObject__convertDataTree__convert: {
+    "^": "Closure:13;_convertedObjects_0",
+    call$1: [function(o) {
+      var t1, t2, convertedMap, key, convertedList;
+      t1 = this._convertedObjects_0;
+      if (t1.containsKey$1(o))
+        return t1.$index(0, o);
+      t2 = J.getInterceptor(o);
+      if (!!t2.$isMap) {
+        convertedMap = {};
+        t1.$indexSet(0, o, convertedMap);
+        for (t1 = J.get$iterator$ax(o.get$keys()); t1.moveNext$0();) {
+          key = t1.get$current();
+          convertedMap[key] = this.call$1(t2.$index(o, key));
+        }
+        return convertedMap;
+      } else if (!!t2.$isIterable) {
+        convertedList = [];
+        t1.$indexSet(0, o, convertedList);
+        C.JSArray_methods.addAll$1(convertedList, t2.map$1(o, this));
+        return convertedList;
+      } else
+        return P._convertToJS(o);
+    }, "call$1", null, 2, 0, null, 61, "call"],
+    $isFunction: true
+  },
+  JsFunction: {
+    "^": "JsObject;_js$_jsObject",
+    apply$2$thisArg: function(args, thisArg) {
+      var t1, t2;
+      t1 = P._convertToJS(thisArg);
+      t2 = P.List_List$from(H.setRuntimeTypeInfo(new H.MappedListIterable(args, P._convertToJS$closure()), [null, null]), true, null);
+      return P._convertToDart(this._js$_jsObject.apply(t1, t2));
+    },
+    apply$1: function(args) {
+      return this.apply$2$thisArg(args, null);
+    },
+    $isJsFunction: true,
+    static: {JsFunction_JsFunction$withThis: function(f) {
+        return new P.JsFunction(P._convertDartFunction(f, true));
+      }}
+  },
+  JsArray: {
+    "^": "JsObject_ListMixin;_js$_jsObject",
+    $index: function(_, index) {
+      var t1;
+      if (typeof index === "number" && index === C.JSNumber_methods.toInt$0(index)) {
+        if (typeof index === "number" && Math.floor(index) === index)
+          t1 = index < 0 || index >= this.get$length(this);
+        else
+          t1 = false;
+        if (t1)
+          H.throwExpression(P.RangeError$range(index, 0, this.get$length(this)));
+      }
+      return P.JsObject.prototype.$index.call(this, this, index);
+    },
+    $indexSet: function(_, index, value) {
+      var t1;
+      if (typeof index === "number" && index === C.JSNumber_methods.toInt$0(index)) {
+        if (typeof index === "number" && Math.floor(index) === index)
+          t1 = index < 0 || index >= this.get$length(this);
+        else
+          t1 = false;
+        if (t1)
+          H.throwExpression(P.RangeError$range(index, 0, this.get$length(this)));
+      }
+      P.JsObject.prototype.$indexSet.call(this, this, index, value);
+    },
+    get$length: function(_) {
+      var len = this._js$_jsObject.length;
+      if (typeof len === "number" && len >>> 0 === len)
+        return len;
+      throw H.wrapException(P.StateError$("Bad JsArray length"));
+    },
+    set$length: function(_, $length) {
+      P.JsObject.prototype.$indexSet.call(this, this, "length", $length);
+    },
+    add$1: function(_, value) {
+      this.callMethod$2("push", [value]);
+    },
+    addAll$1: function(_, iterable) {
+      this.callMethod$2("push", iterable instanceof Array ? iterable : P.List_List$from(iterable, true, null));
+    },
+    insert$2: function(_, index, element) {
+      if (index >= this.get$length(this) + 1)
+        H.throwExpression(P.RangeError$range(index, 0, this.get$length(this)));
+      this.callMethod$2("splice", [index, 0, element]);
+    },
+    removeRange$2: function(_, start, end) {
+      P.JsArray__checkRange(start, end, this.get$length(this));
+      this.callMethod$2("splice", [start, end - start]);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      var t1, $length, args;
+      t1 = this.get$length(this);
+      if (start < 0 || start > t1)
+        H.throwExpression(P.RangeError$range(start, 0, t1));
+      if (end < start || end > t1)
+        H.throwExpression(P.RangeError$range(end, start, t1));
+      $length = end - start;
+      if ($length === 0)
+        return;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      args = [start, $length];
+      C.JSArray_methods.addAll$1(args, J.skip$1$ax(iterable, skipCount).take$1(0, $length));
+      this.callMethod$2("splice", args);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    sort$1: function(_, compare) {
+      this.callMethod$2("sort", [compare]);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    static: {JsArray__checkRange: function(start, end, $length) {
+        if (start < 0 || start > $length)
+          throw H.wrapException(P.RangeError$range(start, 0, $length));
+        if (end < start || end > $length)
+          throw H.wrapException(P.RangeError$range(end, start, $length));
+      }}
+  },
+  JsObject_ListMixin: {
+    "^": "JsObject+ListMixin;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  _convertToJS_closure: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      var jsFunction = P._convertDartFunction(o, false);
+      P._defineProperty(jsFunction, $.get$_DART_CLOSURE_PROPERTY_NAME(), o);
+      return jsFunction;
+    },
+    $isFunction: true
+  },
+  _convertToJS_closure0: {
+    "^": "Closure:13;ctor_0",
+    call$1: function(o) {
+      return new this.ctor_0(o);
+    },
+    $isFunction: true
+  },
+  _wrapToDart_closure: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return new P.JsFunction(o);
+    },
+    $isFunction: true
+  },
+  _wrapToDart_closure0: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return H.setRuntimeTypeInfo(new P.JsArray(o), [null]);
+    },
+    $isFunction: true
+  },
+  _wrapToDart_closure1: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return new P.JsObject(o);
+    },
+    $isFunction: true
+  }
+}],
+["dart.math", "dart:math", , P, {
+  "^": "",
+  _JenkinsSmiHash_combine0: function(hash, value) {
+    hash = 536870911 & hash + value;
+    hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+    return hash ^ hash >>> 6;
+  },
+  _JenkinsSmiHash_finish: function(hash) {
+    hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+    hash ^= hash >>> 11;
+    return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+  },
+  min: function(a, b) {
+    var t1;
+    if (typeof a !== "number")
+      throw H.wrapException(P.ArgumentError$(a));
+    if (typeof b !== "number")
+      throw H.wrapException(P.ArgumentError$(b));
+    if (a > b)
+      return b;
+    if (a < b)
+      return a;
+    if (typeof b === "number") {
+      if (typeof a === "number")
+        if (a === 0)
+          return (a + b) * a * b;
+      if (a === 0)
+        t1 = b === 0 ? 1 / b < 0 : b < 0;
+      else
+        t1 = false;
+      if (t1 || isNaN(b))
+        return b;
+      return a;
+    }
+    return a;
+  },
+  max: function(a, b) {
+    if (typeof a !== "number")
+      throw H.wrapException(P.ArgumentError$(a));
+    if (typeof b !== "number")
+      throw H.wrapException(P.ArgumentError$(b));
+    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.JSDouble_methods.get$isNaN(b))
+        return b;
+      return a;
+    }
+    if (b === 0 && C.JSNumber_methods.get$isNegative(a))
+      return b;
+    return a;
+  },
+  _JSRandom: {
+    "^": "Object;",
+    nextInt$1: function(max) {
+      if (max <= 0 || max > 4294967296)
+        throw H.wrapException(P.RangeError$("max must be in range 0 < max \u2264 2^32, was " + max));
+      return Math.random() * max >>> 0;
+    }
+  },
+  _Random: {
+    "^": "Object;_lo,_hi",
+    _nextState$0: function() {
+      var t1, tmpHi, tmpHiLo, tmpLo, tmpLoLo, newLo;
+      t1 = this._lo;
+      tmpHi = 4294901760 * t1;
+      tmpHiLo = (tmpHi & 4294967295) >>> 0;
+      tmpLo = 55905 * t1;
+      tmpLoLo = (tmpLo & 4294967295) >>> 0;
+      newLo = tmpLoLo + tmpHiLo + this._hi;
+      t1 = (newLo & 4294967295) >>> 0;
+      this._lo = t1;
+      this._hi = (C.JSInt_methods._tdivFast$1(tmpLo - tmpLoLo + (tmpHi - tmpHiLo) + (newLo - t1), 4294967296) & 4294967295) >>> 0;
+    },
+    nextInt$1: function(max) {
+      var t1, rnd32, result;
+      if (max <= 0 || max > 4294967296)
+        throw H.wrapException(P.RangeError$("max must be in range 0 < max \u2264 2^32, was " + max));
+      t1 = max - 1;
+      if ((max & t1) === 0) {
+        this._nextState$0();
+        return (this._lo & t1) >>> 0;
+      }
+      do {
+        this._nextState$0();
+        rnd32 = this._lo;
+        result = rnd32 % max;
+      } while (rnd32 - result + max >= 4294967296);
+      return result;
+    },
+    _Random$1: function(seed) {
+      var empty_seed, t1, low, high, tmplow, low0, t2, t3;
+      empty_seed = J.$lt$n(seed, 0) ? -1 : 0;
+      do {
+        t1 = J.getInterceptor$n(seed);
+        low = t1.$and(seed, 4294967295);
+        seed = J.$tdiv$n(t1.$sub(seed, low), 4294967296);
+        t1 = J.getInterceptor$n(seed);
+        high = t1.$and(seed, 4294967295);
+        seed = J.$tdiv$n(t1.$sub(seed, high), 4294967296);
+        tmplow = ((~low & 4294967295) >>> 0) + (low << 21 >>> 0);
+        low0 = (tmplow & 4294967295) >>> 0;
+        high = (~high >>> 0) + ((high << 21 | low >>> 11) >>> 0) + C.JSInt_methods._tdivFast$1(tmplow - low0, 4294967296) & 4294967295;
+        tmplow = ((low0 ^ (low0 >>> 24 | high << 8)) >>> 0) * 265;
+        low = (tmplow & 4294967295) >>> 0;
+        high = ((high ^ high >>> 24) >>> 0) * 265 + C.JSInt_methods._tdivFast$1(tmplow - low, 4294967296) & 4294967295;
+        tmplow = ((low ^ (low >>> 14 | high << 18)) >>> 0) * 21;
+        low = (tmplow & 4294967295) >>> 0;
+        high = ((high ^ high >>> 14) >>> 0) * 21 + C.JSInt_methods._tdivFast$1(tmplow - low, 4294967296) & 4294967295;
+        low = (low ^ (low >>> 28 | high << 4)) >>> 0;
+        high = (high ^ high >>> 28) >>> 0;
+        tmplow = (low << 31 >>> 0) + low;
+        low0 = (tmplow & 4294967295) >>> 0;
+        t1 = C.JSInt_methods._tdivFast$1(tmplow - low0, 4294967296);
+        tmplow = this._lo * 1037;
+        t2 = (tmplow & 4294967295) >>> 0;
+        this._lo = t2;
+        t3 = (this._hi * 1037 + C.JSInt_methods._tdivFast$1(tmplow - t2, 4294967296) & 4294967295) >>> 0;
+        this._hi = t3;
+        this._lo = (t2 ^ low0) >>> 0;
+        this._hi = (t3 ^ high + ((high << 31 | low >>> 1) >>> 0) + t1 & 4294967295) >>> 0;
+      } while (!J.$eq(seed, empty_seed));
+      if (this._hi === 0 && this._lo === 0)
+        this._lo = 23063;
+      this._nextState$0();
+      this._nextState$0();
+      this._nextState$0();
+      this._nextState$0();
+    },
+    static: {"^": "_Random__POW2_53_D,_Random__POW2_27_D,_Random__MASK32", _Random$: function(seed) {
+        var t1 = new P._Random(0, 0);
+        t1._Random$1(seed);
+        return t1;
+      }}
+  },
+  Point: {
+    "^": "Object;x>,y>",
+    toString$0: function(_) {
+      return "Point(" + H.S(this.x) + ", " + H.S(this.y) + ")";
+    },
+    $eq: function(_, other) {
+      var t1, t2;
+      if (other == null)
+        return false;
+      if (!J.getInterceptor(other).$isPoint)
+        return false;
+      t1 = this.x;
+      t2 = other.x;
+      if (t1 == null ? t2 == null : t1 === t2) {
+        t1 = this.y;
+        t2 = other.y;
+        t2 = t1 == null ? t2 == null : t1 === t2;
+        t1 = t2;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.x);
+      t2 = J.get$hashCode$(this.y);
+      return P._JenkinsSmiHash_finish(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(0, t1), t2));
+    },
+    $add: function(_, other) {
+      var t1, t2, t3, t4;
+      t1 = this.x;
+      t2 = J.getInterceptor$x(other);
+      t3 = t2.get$x(other);
+      if (typeof t1 !== "number")
+        return t1.$add();
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      t4 = this.y;
+      t2 = t2.get$y(other);
+      if (typeof t4 !== "number")
+        return t4.$add();
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      t2 = new P.Point(t1 + t3, t4 + t2);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    },
+    $sub: function(_, other) {
+      var t1, t2, t3, t4;
+      t1 = this.x;
+      t2 = J.getInterceptor$x(other);
+      t3 = t2.get$x(other);
+      if (typeof t1 !== "number")
+        return t1.$sub();
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      t4 = this.y;
+      t2 = t2.get$y(other);
+      if (typeof t4 !== "number")
+        return t4.$sub();
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      t2 = new P.Point(t1 - t3, t4 - t2);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    },
+    $mul: function(_, factor) {
+      var t1, t2;
+      t1 = this.x;
+      if (typeof t1 !== "number")
+        return t1.$mul();
+      if (typeof factor !== "number")
+        return H.iae(factor);
+      t2 = this.y;
+      if (typeof t2 !== "number")
+        return t2.$mul();
+      t2 = new P.Point(t1 * factor, t2 * factor);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    },
+    $isPoint: true
+  },
+  _RectangleBase: {
+    "^": "Object;",
+    get$right: function(_) {
+      return this.get$left(this) + this.width;
+    },
+    get$bottom: function(_) {
+      return this.get$top(this) + this.height;
+    },
+    toString$0: function(_) {
+      return "Rectangle (" + this.get$left(this) + ", " + this.top + ") " + this.width + " x " + this.height;
+    },
+    $eq: function(_, other) {
+      var t1, t2;
+      if (other == null)
+        return false;
+      t1 = J.getInterceptor(other);
+      if (!t1.$isRectangle)
+        return false;
+      if (this.get$left(this) === t1.get$left(other)) {
+        t2 = this.top;
+        t1 = t2 === t1.get$top(other) && this.left + this.width === t1.get$right(other) && t2 + this.height === t1.get$bottom(other);
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = this.top;
+      return P._JenkinsSmiHash_finish(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(0, this.get$left(this) & 0x1FFFFFFF), t1 & 0x1FFFFFFF), this.left + this.width & 0x1FFFFFFF), t1 + this.height & 0x1FFFFFFF));
+    },
+    get$topLeft: function(_) {
+      var t1 = new P.Point(this.get$left(this), this.top);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    }
+  },
+  Rectangle: {
+    "^": "_RectangleBase;left>,top>,width>,height>",
+    $isRectangle: true,
+    $asRectangle: null,
+    static: {Rectangle$: function(left, $top, width, height, $T) {
+        var t1, t2;
+        t1 = width < 0 ? -width * 0 : width;
+        t2 = height < 0 ? -height * 0 : height;
+        return H.setRuntimeTypeInfo(new P.Rectangle(left, $top, t1, t2), [$T]);
+      }}
+  }
+}],
+["dart.pkg.collection.wrappers", "package:collection/wrappers.dart", , Q, {
+  "^": "",
+  UnmodifiableMapMixin__throw: function() {
+    throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable Map"));
+  },
+  UnmodifiableMapView: {
+    "^": "DelegatingMap_UnmodifiableMapMixin;_base"
+  },
+  DelegatingMap_UnmodifiableMapMixin: {
+    "^": "DelegatingMap+UnmodifiableMapMixin;",
+    $isMap: true
+  },
+  UnmodifiableMapMixin: {
+    "^": "Object;",
+    $indexSet: function(_, key, value) {
+      return Q.UnmodifiableMapMixin__throw();
+    },
+    addAll$1: function(_, other) {
+      return Q.UnmodifiableMapMixin__throw();
+    },
+    clear$0: function(_) {
+      return Q.UnmodifiableMapMixin__throw();
+    },
+    $isMap: true
+  },
+  DelegatingMap: {
+    "^": "Object;",
+    $index: function(_, key) {
+      return this._base.$index(0, key);
+    },
+    $indexSet: function(_, key, value) {
+      this._base.$indexSet(0, key, value);
+    },
+    addAll$1: function(_, other) {
+      this._base.addAll$1(0, other);
+    },
+    clear$0: function(_) {
+      this._base.clear$0(0);
+    },
+    forEach$1: function(_, f) {
+      this._base.forEach$1(0, f);
+    },
+    get$isEmpty: function(_) {
+      return this._base._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._base._collection$_length !== 0;
+    },
+    get$keys: function() {
+      var t1 = this._base;
+      return H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$length: function(_) {
+      return this._base._collection$_length;
+    },
+    get$values: function(_) {
+      var t1 = this._base;
+      return t1.get$values(t1);
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this._base);
+    },
+    $isMap: true
+  }
+}],
+["dart.typed_data.implementation", "dart:_native_typed_data", , H, {
+  "^": "",
+  NativeTypedArray$: function(receiver) {
+    receiver.toString;
+    return receiver;
+  },
+  NativeTypedArrayOfDouble$: function(receiver) {
+    receiver.toString;
+    return receiver;
+  },
+  NativeTypedArrayOfInt$: function(receiver) {
+    receiver.toString;
+    return receiver;
+  },
+  NativeByteBuffer: {
+    "^": "Interceptor;",
+    get$runtimeType: function(receiver) {
+      return C.Type_wAg;
+    },
+    $isNativeByteBuffer: true,
+    "%": "ArrayBuffer"
+  },
+  NativeTypedData: {
+    "^": "Interceptor;",
+    _invalidIndex$2: function(receiver, index, $length) {
+      var t1 = J.getInterceptor$n(index);
+      if (t1.$lt(index, 0) || t1.$ge(index, $length))
+        throw H.wrapException(P.RangeError$range(index, 0, $length));
+      else
+        throw H.wrapException(P.ArgumentError$("Invalid list index " + H.S(index)));
+    },
+    _checkIndex$2: function(receiver, index, $length) {
+      if (index >>> 0 !== index || index >= $length)
+        this._invalidIndex$2(receiver, index, $length);
+    },
+    $isNativeTypedData: true,
+    $isTypedData: true,
+    "%": ";ArrayBufferView;NativeTypedArray|NativeTypedArray_ListMixin|NativeTypedArray_ListMixin_FixedLengthListMixin|NativeTypedArrayOfDouble|NativeTypedArray_ListMixin0|NativeTypedArray_ListMixin_FixedLengthListMixin0|NativeTypedArrayOfInt"
+  },
+  NativeByteData: {
+    "^": "NativeTypedData;",
+    get$runtimeType: function(receiver) {
+      return C.Type_oGP;
+    },
+    $isTypedData: true,
+    "%": "DataView"
+  },
+  NativeFloat32List: {
+    "^": "NativeTypedArrayOfDouble;",
+    get$runtimeType: function(receiver) {
+      return C.Type_Art;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    },
+    $isTypedData: true,
+    "%": "Float32Array"
+  },
+  NativeFloat64List: {
+    "^": "NativeTypedArrayOfDouble;",
+    get$runtimeType: function(receiver) {
+      return C.Type_ckn;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    },
+    $isTypedData: true,
+    "%": "Float64Array"
+  },
+  NativeInt16List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_UoK;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Int16Array"
+  },
+  NativeInt32List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_dTZ;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Int32Array"
+  },
+  NativeInt8List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_mp3;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Int8Array"
+  },
+  NativeUint16List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_CAk;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Uint16Array"
+  },
+  NativeUint32List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_irB;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Uint32Array"
+  },
+  NativeUint8ClampedList: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_QuW;
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "CanvasPixelArray|Uint8ClampedArray"
+  },
+  NativeUint8List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_6L0;
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": ";Uint8Array"
+  },
+  NativeTypedArray: {
+    "^": "NativeTypedData;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    _setRangeFast$4: function(receiver, start, end, source, skipCount) {
+      var t1, count, sourceLength;
+      t1 = receiver.length + 1;
+      this._checkIndex$2(receiver, start, t1);
+      this._checkIndex$2(receiver, end, t1);
+      if (start > end)
+        throw H.wrapException(P.RangeError$range(start, 0, end));
+      count = end - start;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      sourceLength = source.length;
+      if (sourceLength - skipCount < count)
+        throw H.wrapException(P.StateError$("Not enough elements"));
+      if (skipCount !== 0 || sourceLength !== count)
+        source = source.subarray(skipCount, skipCount + count);
+      receiver.set(source, start);
+    },
+    $isJavaScriptIndexingBehavior: true
+  },
+  NativeTypedArrayOfDouble: {
+    "^": "NativeTypedArray_ListMixin_FixedLengthListMixin;",
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      if (!!J.getInterceptor(iterable).$isNativeTypedArrayOfDouble) {
+        this._setRangeFast$4(receiver, start, end, iterable, skipCount);
+        return;
+      }
+      P.ListMixin.prototype.setRange$4.call(this, receiver, start, end, iterable, skipCount);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    $isNativeTypedArrayOfDouble: true,
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    }
+  },
+  NativeTypedArray_ListMixin: {
+    "^": "NativeTypedArray+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    }
+  },
+  NativeTypedArray_ListMixin_FixedLengthListMixin: {
+    "^": "NativeTypedArray_ListMixin+FixedLengthListMixin;"
+  },
+  NativeTypedArrayOfInt: {
+    "^": "NativeTypedArray_ListMixin_FixedLengthListMixin0;",
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      if (!!J.getInterceptor(iterable).$isNativeTypedArrayOfInt) {
+        this._setRangeFast$4(receiver, start, end, iterable, skipCount);
+        return;
+      }
+      P.ListMixin.prototype.setRange$4.call(this, receiver, start, end, iterable, skipCount);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    $isNativeTypedArrayOfInt: true,
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    }
+  },
+  NativeTypedArray_ListMixin0: {
+    "^": "NativeTypedArray+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    }
+  },
+  NativeTypedArray_ListMixin_FixedLengthListMixin0: {
+    "^": "NativeTypedArray_ListMixin0+FixedLengthListMixin;"
+  }
+}],
+["dart2js._js_primitives", "dart:_js_primitives", , H, {
+  "^": "",
+  printString: function(string) {
+    if (typeof dartPrint == "function") {
+      dartPrint(string);
+      return;
+    }
+    if (typeof console == "object" && typeof console.log != "undefined") {
+      console.log(string);
+      return;
+    }
+    if (typeof window == "object")
+      return;
+    if (typeof print == "function") {
+      print(string);
+      return;
+    }
+    throw "Unable to print message: " + String(string);
+  }
+}],
+["error_view_element", "package:observatory/src/elements/error_view.dart", , F, {
+  "^": "",
+  ErrorViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier4;_error_view_element$__$error,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$error: function(receiver) {
+      return receiver._error_view_element$__$error;
+    },
+    set$error: function(receiver, value) {
+      receiver._error_view_element$__$error = this.notifyPropertyChange$3(receiver, C.Symbol_error, receiver._error_view_element$__$error, value);
+    },
+    static: {ErrorViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ErrorViewElement_methods.Element$created$0(receiver);
+        C.ErrorViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier4: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["eval_box_element", "package:observatory/src/elements/eval_box.dart", , L, {
+  "^": "",
+  EvalBoxElement: {
+    "^": "ObservatoryElement_ChangeNotifier5;_eval_box_element$__$text,_eval_box_element$__$lineMode,_eval_box_element$__$callback,_eval_box_element$__$results,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$text: function(receiver) {
+      return receiver._eval_box_element$__$text;
+    },
+    set$text: function(receiver, value) {
+      receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, receiver._eval_box_element$__$text, value);
+    },
+    get$lineMode: function(receiver) {
+      return receiver._eval_box_element$__$lineMode;
+    },
+    set$lineMode: function(receiver, value) {
+      receiver._eval_box_element$__$lineMode = this.notifyPropertyChange$3(receiver, C.Symbol_lineMode, receiver._eval_box_element$__$lineMode, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._eval_box_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._eval_box_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._eval_box_element$__$callback, value);
+    },
+    get$results: function(receiver) {
+      return receiver._eval_box_element$__$results;
+    },
+    set$results: function(receiver, value) {
+      receiver._eval_box_element$__$results = this.notifyPropertyChange$3(receiver, C.Symbol_results, receiver._eval_box_element$__$results, value);
+    },
+    updateLineMode$3: [function(receiver, e, detail, target) {
+      var t1 = H.interceptedTypeCast(J.get$target$x(e), "$isInputElement").value;
+      t1 = this.notifyPropertyChange$3(receiver, C.Symbol_lineMode, receiver._eval_box_element$__$lineMode, t1);
+      receiver._eval_box_element$__$lineMode = t1;
+      if (J.$eq(t1, "1-line")) {
+        t1 = J.replaceAll$2$s(receiver._eval_box_element$__$text, "\n", " ");
+        receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, receiver._eval_box_element$__$text, t1);
+      }
+    }, "call$3", "get$updateLineMode", 6, 0, 102, 1, 93, 94],
+    eval$3: [function(receiver, e, detail, target) {
+      var expr, t1, map;
+      J.preventDefault$0$x(e);
+      expr = receiver._eval_box_element$__$text;
+      receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, expr, "");
+      if (receiver._eval_box_element$__$callback != null) {
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        map = R._toObservableDeep(t1);
+        J.$indexSet$ax(map, "expr", expr);
+        J.insert$2$ax(receiver._eval_box_element$__$results, 0, map);
+        this.callback$1(receiver, expr).then$1(new L.EvalBoxElement_eval_closure(map));
+      }
+    }, "call$3", "get$eval", 6, 0, 102, 1, 93, 94],
+    selectExpr$1: [function(receiver, e) {
+      var t1 = J.getAttribute$1$x(J.get$target$x(e), "expr");
+      receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, receiver._eval_box_element$__$text, t1);
+    }, "call$1", "get$selectExpr", 2, 0, 128, 1],
+    static: {EvalBoxElement$created: function(receiver) {
+        var t1, t2, t3;
+        t1 = R._toObservableDeep([]);
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t3 = P.String;
+        t3 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t3, null), null, null), [t3, null]);
+        receiver._eval_box_element$__$lineMode = "1-line";
+        receiver._eval_box_element$__$results = t1;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t2;
+        receiver.polymer$Polymer$$ = t3;
+        C.EvalBoxElement_methods.Element$created$0(receiver);
+        C.EvalBoxElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier5: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  EvalBoxElement_eval_closure: {
+    "^": "Closure:13;map_0",
+    call$1: [function(result) {
+      J.$indexSet$ax(this.map_0, "value", result);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  }
+}],
+["eval_link_element", "package:observatory/src/elements/eval_link.dart", , R, {
+  "^": "",
+  EvalLinkElement: {
+    "^": "PolymerElement_ChangeNotifier1;_eval_link_element$__$busy,_eval_link_element$__$label,_eval_link_element$__$callback,_eval_link_element$__$expr,_eval_link_element$__$result,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$busy: function(receiver) {
+      return receiver._eval_link_element$__$busy;
+    },
+    set$busy: function(receiver, value) {
+      receiver._eval_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._eval_link_element$__$busy, value);
+    },
+    get$label: function(receiver) {
+      return receiver._eval_link_element$__$label;
+    },
+    set$label: function(receiver, value) {
+      receiver._eval_link_element$__$label = this.notifyPropertyChange$3(receiver, C.Symbol_label, receiver._eval_link_element$__$label, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._eval_link_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._eval_link_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._eval_link_element$__$callback, value);
+    },
+    get$expr: function(receiver) {
+      return receiver._eval_link_element$__$expr;
+    },
+    set$expr: function(receiver, value) {
+      receiver._eval_link_element$__$expr = this.notifyPropertyChange$3(receiver, C.Symbol_expr, receiver._eval_link_element$__$expr, value);
+    },
+    get$result: function(receiver) {
+      return receiver._eval_link_element$__$result;
+    },
+    set$result: function(receiver, value) {
+      receiver._eval_link_element$__$result = this.notifyPropertyChange$3(receiver, C.Symbol_result, receiver._eval_link_element$__$result, value);
+    },
+    evalNow$3: [function(receiver, a, b, c) {
+      var t1 = receiver._eval_link_element$__$busy;
+      if (t1 === true)
+        return;
+      if (receiver._eval_link_element$__$callback != null) {
+        receiver._eval_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, t1, true);
+        receiver._eval_link_element$__$result = this.notifyPropertyChange$3(receiver, C.Symbol_result, receiver._eval_link_element$__$result, null);
+        this.callback$1(receiver, receiver._eval_link_element$__$expr).then$1(new R.EvalLinkElement_evalNow_closure(receiver)).whenComplete$1(new R.EvalLinkElement_evalNow_closure0(receiver));
+      }
+    }, "call$3", "get$evalNow", 6, 0, 79, 46, 47, 80],
+    static: {EvalLinkElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._eval_link_element$__$busy = false;
+        receiver._eval_link_element$__$label = "[evaluate]";
+        receiver._eval_link_element$__$callback = null;
+        receiver._eval_link_element$__$expr = "";
+        receiver._eval_link_element$__$result = null;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.EvalLinkElement_methods.Element$created$0(receiver);
+        C.EvalLinkElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier1: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  EvalLinkElement_evalNow_closure: {
+    "^": "Closure:130;this_0",
+    call$1: [function(obj) {
+      var t1 = this.this_0;
+      t1._eval_link_element$__$result = J.notifyPropertyChange$3$x(t1, C.Symbol_result, t1._eval_link_element$__$result, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  EvalLinkElement_evalNow_closure0: {
+    "^": "Closure:69;this_1",
+    call$0: [function() {
+      var t1 = this.this_1;
+      t1._eval_link_element$__$busy = J.notifyPropertyChange$3$x(t1, C.Symbol_busy, t1._eval_link_element$__$busy, false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+}],
+["field_ref_element", "package:observatory/src/elements/field_ref.dart", , D, {
+  "^": "",
+  FieldRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {FieldRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FieldRefElement_methods.Element$created$0(receiver);
+        C.FieldRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["field_view_element", "package:observatory/src/elements/field_view.dart", , A, {
+  "^": "",
+  FieldViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier6;_field_view_element$__$field,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$field: function(receiver) {
+      return receiver._field_view_element$__$field;
+    },
+    set$field: function(receiver, value) {
+      receiver._field_view_element$__$field = this.notifyPropertyChange$3(receiver, C.Symbol_field, receiver._field_view_element$__$field, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._field_view_element$__$field).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {FieldViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FieldViewElement_methods.Element$created$0(receiver);
+        C.FieldViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier6: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["flag_list_element", "package:observatory/src/elements/flag_list.dart", , X, {
+  "^": "",
+  FlagListElement: {
+    "^": "ObservatoryElement_ChangeNotifier7;_flag_list_element$__$flagList,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$flagList: function(receiver) {
+      return receiver._flag_list_element$__$flagList;
+    },
+    set$flagList: function(receiver, value) {
+      receiver._flag_list_element$__$flagList = this.notifyPropertyChange$3(receiver, C.Symbol_flagList, receiver._flag_list_element$__$flagList, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._flag_list_element$__$flagList).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {FlagListElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FlagListElement_methods.Element$created$0(receiver);
+        C.FlagListElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier7: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  FlagItemElement: {
+    "^": "ObservatoryElement_ChangeNotifier8;_flag_list_element$__$flag,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$flag: function(receiver) {
+      return receiver._flag_list_element$__$flag;
+    },
+    set$flag: function(receiver, value) {
+      receiver._flag_list_element$__$flag = this.notifyPropertyChange$3(receiver, C.Symbol_flag, receiver._flag_list_element$__$flag, value);
+    },
+    static: {FlagItemElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FlagItemElement_methods.Element$created$0(receiver);
+        C.FlagItemElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier8: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["function_ref_element", "package:observatory/src/elements/function_ref.dart", , U, {
+  "^": "",
+  FunctionRefElement: {
+    "^": "ServiceRefElement_ChangeNotifier;_function_ref_element$__$qualified,_function_ref_element$__$hasParent,_function_ref_element$__$hasClass,_function_ref_element$__$isDart,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$qualified: function(receiver) {
+      return receiver._function_ref_element$__$qualified;
+    },
+    set$qualified: function(receiver, value) {
+      receiver._function_ref_element$__$qualified = this.notifyPropertyChange$3(receiver, C.Symbol_qualified, receiver._function_ref_element$__$qualified, value);
+    },
+    refChanged$1: [function(receiver, oldValue) {
+      var refMap, t1, t2;
+      Q.ServiceRefElement.prototype.refChanged$1.call(this, receiver, oldValue);
+      this.notifyPropertyChange$3(receiver, C.Symbol_hasParent, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_hasClass, 0, 1);
+      refMap = receiver._service_ref_element$__$ref;
+      t1 = refMap != null;
+      if (t1) {
+        t2 = J.getInterceptor$asx(refMap);
+        t2 = !J.$eq(t2.$index(refMap, "kind"), "Collected") && !J.$eq(t2.$index(refMap, "kind"), "Native") && !J.$eq(t2.$index(refMap, "kind"), "Tag") && !J.$eq(t2.$index(refMap, "kind"), "Reused");
+      } else
+        t2 = false;
+      receiver._function_ref_element$__$isDart = this.notifyPropertyChange$3(receiver, C.Symbol_isDart, receiver._function_ref_element$__$isDart, t2);
+      t2 = t1 && J.$index$asx(refMap, "parent") != null;
+      receiver._function_ref_element$__$hasParent = this.notifyPropertyChange$3(receiver, C.Symbol_hasParent, receiver._function_ref_element$__$hasParent, t2);
+      if (t1) {
+        t1 = J.getInterceptor$asx(refMap);
+        t1 = t1.$index(refMap, "owner") != null && J.$eq(t1.$index(refMap, "owner").get$serviceType(), "Class");
+      } else
+        t1 = false;
+      receiver._function_ref_element$__$hasClass = this.notifyPropertyChange$3(receiver, C.Symbol_hasClass, receiver._function_ref_element$__$hasClass, t1);
+    }, "call$1", "get$refChanged", 2, 0, 20, 57],
+    get$hasParent: function(receiver) {
+      return receiver._function_ref_element$__$hasParent;
+    },
+    set$hasParent: function(receiver, value) {
+      receiver._function_ref_element$__$hasParent = this.notifyPropertyChange$3(receiver, C.Symbol_hasParent, receiver._function_ref_element$__$hasParent, value);
+    },
+    get$hasClass: function(receiver) {
+      return receiver._function_ref_element$__$hasClass;
+    },
+    set$hasClass: function(receiver, value) {
+      receiver._function_ref_element$__$hasClass = this.notifyPropertyChange$3(receiver, C.Symbol_hasClass, receiver._function_ref_element$__$hasClass, value);
+    },
+    get$isDart: function(receiver) {
+      return receiver._function_ref_element$__$isDart;
+    },
+    set$isDart: function(receiver, value) {
+      receiver._function_ref_element$__$isDart = this.notifyPropertyChange$3(receiver, C.Symbol_isDart, receiver._function_ref_element$__$isDart, value);
+    },
+    static: {FunctionRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._function_ref_element$__$qualified = true;
+        receiver._function_ref_element$__$hasParent = false;
+        receiver._function_ref_element$__$hasClass = false;
+        receiver._function_ref_element$__$isDart = false;
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FunctionRefElement_methods.Element$created$0(receiver);
+        C.FunctionRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ServiceRefElement_ChangeNotifier: {
+    "^": "ServiceRefElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["function_view_element", "package:observatory/src/elements/function_view.dart", , N, {
+  "^": "",
+  FunctionViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier9;_function_view_element$__$function,_function_view_element$__$qualifiedName,_function_view_element$__$kind,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$$function: function(receiver) {
+      return receiver._function_view_element$__$function;
+    },
+    set$$function: function(receiver, value) {
+      receiver._function_view_element$__$function = this.notifyPropertyChange$3(receiver, C.Symbol_function, receiver._function_view_element$__$function, value);
+    },
+    get$qualifiedName: function(receiver) {
+      return receiver._function_view_element$__$qualifiedName;
+    },
+    set$qualifiedName: function(receiver, value) {
+      receiver._function_view_element$__$qualifiedName = this.notifyPropertyChange$3(receiver, C.Symbol_qualifiedName, receiver._function_view_element$__$qualifiedName, value);
+    },
+    get$kind: function(receiver) {
+      return receiver._function_view_element$__$kind;
+    },
+    set$kind: function(receiver, value) {
+      receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, receiver._function_view_element$__$kind, value);
+    },
+    _getQualifiedName$1: function(receiver, $function) {
+      var t1, $parent, cls;
+      t1 = $function != null;
+      $parent = t1 && J.$index$asx($function, "parent") != null ? J.$index$asx($function, "parent") : null;
+      if ($parent != null)
+        return this._getQualifiedName$1(receiver, $parent) + "." + H.S(J.$index$asx($function, "user_name"));
+      if (t1) {
+        t1 = J.getInterceptor$asx($function);
+        t1 = t1.$index($function, "owner") != null && J.$eq(t1.$index($function, "owner").get$serviceType(), "Class");
+      } else
+        t1 = false;
+      cls = t1 ? J.$index$asx($function, "owner") : null;
+      if (cls != null)
+        return H.S(J.$index$asx(cls, "user_name")) + "." + H.S(J.$index$asx($function, "user_name"));
+      return H.S(J.$index$asx($function, "user_name"));
+    },
+    functionChanged$1: [function(receiver, oldValue) {
+      var t1, t2;
+      this.notifyPropertyChange$3(receiver, C.Symbol_qualifiedName, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_kind, 0, 1);
+      t1 = this._getQualifiedName$1(receiver, receiver._function_view_element$__$function);
+      receiver._function_view_element$__$qualifiedName = this.notifyPropertyChange$3(receiver, C.Symbol_qualifiedName, receiver._function_view_element$__$qualifiedName, t1);
+      t1 = J.$index$asx(receiver._function_view_element$__$function, "kind");
+      t2 = receiver._function_view_element$__$kind;
+      switch (t1) {
+        case "kRegularFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "function");
+          break;
+        case "kClosureFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "closure function");
+          break;
+        case "kSignatureFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "signature function");
+          break;
+        case "kGetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "getter function");
+          break;
+        case "kSetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "setter function");
+          break;
+        case "kConstructor":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "constructor");
+          break;
+        case "kImplicitGetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "implicit getter function");
+          break;
+        case "kImplicitSetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "implicit setter function");
+          break;
+        case "kStaticInitializer":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "static initializer");
+          break;
+        case "kMethodExtractor":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "method extractor");
+          break;
+        case "kNoSuchMethodDispatcher":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "noSuchMethod dispatcher");
+          break;
+        case "kInvokeFieldDispatcher":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "invoke field dispatcher");
+          break;
+        default:
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "UNKNOWN");
+          break;
+      }
+    }, "call$1", "get$functionChanged", 2, 0, 20, 57],
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._function_view_element$__$function).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {FunctionViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FunctionViewElement_methods.Element$created$0(receiver);
+        C.FunctionViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier9: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["heap_map_element", "package:observatory/src/elements/heap_map.dart", , O, {
+  "^": "",
+  PixelReference: {
+    "^": "Object;_data,_dataIndex",
+    next$0: [function() {
+      return new O.PixelReference(this._data, this._dataIndex + 4);
+    }, "call$0", "get$next", 0, 0, 131],
+    get$index: function(_) {
+      return C.JSNumber_methods._tdivFast$1(this._dataIndex, 4);
+    },
+    static: {"^": "PixelReference_NUM_COLOR_COMPONENTS", PixelReference$: function(data, point) {
+        var t1, t2, t3;
+        t1 = point.get$y(point);
+        t2 = J.get$width$x(data);
+        if (typeof t1 !== "number")
+          return t1.$mul();
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        t3 = point.get$x(point);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        return new O.PixelReference(data, (t1 * t2 + t3) * 4);
+      }}
+  },
+  ObjectInfo: {
+    "^": "Object;address<,size"
+  },
+  HeapMapElement: {
+    "^": "ObservatoryElement_ChangeNotifier10;_fragmentationCanvas,_fragmentationData,_pageHeight,_classIdToColor,_colorToClassId,_classIdToName,_heap_map_element$__$status,_heap_map_element$__$fragmentation,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$status: function(receiver) {
+      return receiver._heap_map_element$__$status;
+    },
+    set$status: function(receiver, value) {
+      receiver._heap_map_element$__$status = this.notifyPropertyChange$3(receiver, C.Symbol_status, receiver._heap_map_element$__$status, value);
+    },
+    get$fragmentation: function(receiver) {
+      return receiver._heap_map_element$__$fragmentation;
+    },
+    set$fragmentation: function(receiver, value) {
+      receiver._heap_map_element$__$fragmentation = this.notifyPropertyChange$3(receiver, C.Symbol_fragmentation, receiver._heap_map_element$__$fragmentation, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#fragmentation");
+      receiver._fragmentationCanvas = t1;
+      t1 = J.get$onMouseMove$x(t1);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(this.get$_handleMouseMove(receiver)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+      t1 = J.get$onMouseDown$x(receiver._fragmentationCanvas);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(this.get$_handleClick(receiver)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+    },
+    _packColor$1: function(receiver, color) {
+      var t1, packed, component;
+      for (t1 = J.get$iterator$ax(color), packed = 0; t1.moveNext$0();) {
+        component = t1._current;
+        if (typeof component !== "number")
+          return H.iae(component);
+        packed = packed * 256 + component;
+      }
+      return packed;
+    },
+    _addClass$3: function(receiver, classId, $name, color) {
+      var t1 = J.split$1$s($name, "@");
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      receiver._classIdToName.$indexSet(0, classId, t1[0]);
+      receiver._classIdToColor.$indexSet(0, classId, color);
+      receiver._colorToClassId.$indexSet(0, this._packColor$1(receiver, color), classId);
+    },
+    _updateClassList$2: function(receiver, classList, freeClassId) {
+      var t1, t2, t3, t4, member, classId, rng, color, t5;
+      for (t1 = J.get$iterator$ax(J.$index$asx(classList, "members")), t2 = receiver._classIdToName, t3 = receiver._classIdToColor, t4 = receiver._colorToClassId; t1.moveNext$0();) {
+        member = t1.get$current();
+        if (!J.getInterceptor(member).$isClass) {
+          N.Logger_Logger("").info$1(H.S(member));
+          continue;
+        }
+        classId = H.Primitives_parseInt(C.JSArray_methods.get$last(J.split$1$s(member._id, "/")), null, null);
+        rng = classId == null ? C.C__JSRandom : P._Random$(classId);
+        color = [rng.nextInt$1(128), rng.nextInt$1(128), rng.nextInt$1(128), 255];
+        t5 = J.split$1$s(member._service$__$name, "@");
+        if (0 >= t5.length)
+          return H.ioore(t5, 0);
+        t2.$indexSet(0, classId, t5[0]);
+        t3.$indexSet(0, classId, color);
+        t4.$indexSet(0, this._packColor$1(receiver, color), classId);
+      }
+      this._addClass$3(receiver, freeClassId, "Free", $.get$HeapMapElement__freeColor());
+      this._addClass$3(receiver, 0, "", $.get$HeapMapElement__pageSeparationColor());
+    },
+    _objectAt$1: function(receiver, point) {
+      var t1, t2, pagePixels, index, pageIndex, pageOffset, pages, page, objects, offset, size, i, t3;
+      t1 = receiver._pageHeight;
+      t2 = J.get$width$x(receiver._fragmentationData);
+      if (typeof t1 !== "number")
+        return t1.$mul();
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      pagePixels = t1 * t2;
+      index = C.JSNumber_methods._tdivFast$1(O.PixelReference$(receiver._fragmentationData, point)._dataIndex, 4);
+      pageIndex = C.JSNumber_methods.$tdiv(index, pagePixels);
+      pageOffset = C.JSNumber_methods.$mod(index, pagePixels);
+      pages = J.$index$asx(receiver._heap_map_element$__$fragmentation, "pages");
+      if (!(pageIndex < 0)) {
+        t1 = J.get$length$asx(pages);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = pageIndex >= t1;
+      } else
+        t1 = true;
+      if (t1)
+        return;
+      page = J.$index$asx(pages, pageIndex);
+      t1 = J.getInterceptor$asx(page);
+      objects = t1.$index(page, "objects");
+      t2 = J.getInterceptor$asx(objects);
+      offset = 0;
+      size = 0;
+      i = 0;
+      while (true) {
+        t3 = t2.get$length(objects);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        size = t2.$index(objects, i);
+        if (typeof size !== "number")
+          return H.iae(size);
+        offset += size;
+        if (offset > pageOffset) {
+          pageOffset = offset - size;
+          break;
+        }
+        i += 2;
+      }
+      t1 = H.Primitives_parseInt(t1.$index(page, "object_start"), null, null);
+      t2 = J.$index$asx(receiver._heap_map_element$__$fragmentation, "unit_size_bytes");
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      return new O.ObjectInfo(J.$add$ns(t1, pageOffset * t2), J.$mul$ns(size, J.$index$asx(receiver._heap_map_element$__$fragmentation, "unit_size_bytes")));
+    },
+    _handleMouseMove$1: [function(receiver, $event) {
+      var t1, info, addressString, t2, className;
+      t1 = J.getInterceptor$x($event);
+      info = this._objectAt$1(receiver, t1.get$offset($event));
+      addressString = H.S(info.size) + "B @ 0x" + J.toRadixString$1$n(info.address, 16);
+      t1 = t1.get$offset($event);
+      t1 = O.PixelReference$(receiver._fragmentationData, t1);
+      t2 = t1._dataIndex;
+      className = receiver._classIdToName.$index(0, receiver._colorToClassId.$index(0, this._packColor$1(receiver, C.NativeUint8ClampedList_methods.getRange$2(J.get$data$x(t1._data), t2, t2 + 4))));
+      t1 = J.$eq(className, "") ? "-" : H.S(className) + " " + addressString;
+      receiver._heap_map_element$__$status = this.notifyPropertyChange$3(receiver, C.Symbol_status, receiver._heap_map_element$__$status, t1);
+    }, "call$1", "get$_handleMouseMove", 2, 0, 128, 2],
+    _handleClick$1: [function(receiver, $event) {
+      var address = J.toRadixString$1$n(this._objectAt$1(receiver, J.get$offset$x($event)).address, 16);
+      window.location.hash = "/" + H.S(J.get$link$x(J.get$isolate$x(receiver._heap_map_element$__$fragmentation))) + "/address/" + address;
+    }, "call$1", "get$_handleClick", 2, 0, 128, 2],
+    _updateFragmentationData$0: function(receiver) {
+      var t1, pages, width, t2, height;
+      t1 = receiver._heap_map_element$__$fragmentation;
+      if (t1 == null || receiver._fragmentationCanvas == null)
+        return;
+      this._updateClassList$2(receiver, J.$index$asx(t1, "class_list"), J.$index$asx(receiver._heap_map_element$__$fragmentation, "free_class_id"));
+      pages = J.$index$asx(receiver._heap_map_element$__$fragmentation, "pages");
+      t1 = receiver._fragmentationCanvas.parentElement;
+      t1.toString;
+      width = P.Rectangle$(C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientLeft)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientTop)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientWidth)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientHeight)), null).width;
+      t1 = J.$tdiv$n(J.$tdiv$n(J.$index$asx(receiver._heap_map_element$__$fragmentation, "page_size_bytes"), J.$index$asx(receiver._heap_map_element$__$fragmentation, "unit_size_bytes")), width);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      t1 = 4 + t1;
+      receiver._pageHeight = t1;
+      t2 = J.get$length$asx(pages);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      height = P.min(t1 * t2, 6000);
+      t2 = P.convertNativeToDart_ImageData(J.get$context2D$x(receiver._fragmentationCanvas).createImageData(width, height));
+      receiver._fragmentationData = t2;
+      J.set$width$x(receiver._fragmentationCanvas, J.get$width$x(t2));
+      J.set$height$x(receiver._fragmentationCanvas, J.get$height$x(receiver._fragmentationData));
+      this._renderPages$1(receiver, 0);
+    },
+    _renderPages$1: function(receiver, startPage) {
+      var pages, t1, t2, startY, endY, pixel, objects, i, t3, count, color, count0, t4, t5, t6;
+      pages = J.$index$asx(receiver._heap_map_element$__$fragmentation, "pages");
+      t1 = J.getInterceptor$asx(pages);
+      t2 = "Loaded " + startPage + " of " + H.S(t1.get$length(pages)) + " pages";
+      receiver._heap_map_element$__$status = this.notifyPropertyChange$3(receiver, C.Symbol_status, receiver._heap_map_element$__$status, t2);
+      t2 = receiver._pageHeight;
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      startY = startPage * t2;
+      endY = startY + t2;
+      t2 = t1.get$length(pages);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      if (!(startPage >= t2)) {
+        t2 = J.get$height$x(receiver._fragmentationData);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        t2 = endY > t2;
+      } else
+        t2 = true;
+      if (t2)
+        return;
+      pixel = O.PixelReference$(receiver._fragmentationData, H.setRuntimeTypeInfo(new P.Point(0, startY), [null]));
+      objects = J.$index$asx(t1.$index(pages, startPage), "objects");
+      t1 = J.getInterceptor$asx(objects);
+      t2 = receiver._classIdToColor;
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(objects);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        count = t1.$index(objects, i);
+        color = t2.$index(0, t1.$index(objects, i + 1));
+        for (; t3 = J.getInterceptor$n(count), count0 = t3.$sub(count, 1), t3.$gt(count, 0); count = count0) {
+          t3 = pixel._data;
+          t4 = pixel._dataIndex;
+          t5 = t4 + 4;
+          C.NativeUint8ClampedList_methods.setRange$3(J.get$data$x(t3), t4, t5, color);
+          pixel = new O.PixelReference(t3, t5);
+        }
+        i += 2;
+      }
+      while (true) {
+        t1 = pixel._dataIndex;
+        t2 = C.JSNumber_methods._tdivFast$1(t1, 4);
+        t3 = pixel._data;
+        t4 = J.getInterceptor$x(t3);
+        t5 = t4.get$width(t3);
+        if (typeof t5 !== "number")
+          return H.iae(t5);
+        t5 = C.JSNumber_methods.$mod(t2, t5);
+        t6 = t4.get$width(t3);
+        if (typeof t6 !== "number")
+          return H.iae(t6);
+        t6 = C.JSNumber_methods.$tdiv(t2, t6);
+        new P.Point(t5, t6).$builtinTypeInfo = [null];
+        if (!(t6 < endY))
+          break;
+        t2 = $.get$HeapMapElement__pageSeparationColor();
+        t5 = t1 + 4;
+        C.NativeUint8ClampedList_methods.setRange$3(t4.get$data(t3), t1, t5, t2);
+        pixel = new O.PixelReference(t3, t5);
+      }
+      t1 = J.get$context2D$x(receiver._fragmentationCanvas);
+      t2 = receiver._fragmentationData;
+      J.putImageData$7$x(t1, t2, 0, 0, 0, startY, J.get$width$x(t2), endY);
+      P.Future_Future(new O.HeapMapElement__renderPages_closure(receiver, startPage), null);
+    },
+    refresh$1: [function(receiver, done) {
+      var t1 = receiver._heap_map_element$__$fragmentation;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("heapmap").then$1(new O.HeapMapElement_refresh_closure(receiver)).catchError$1(new O.HeapMapElement_refresh_closure0()).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    fragmentationChanged$1: [function(receiver, oldValue) {
+      P.Future_Future(new O.HeapMapElement_fragmentationChanged_closure(receiver), null);
+    }, "call$1", "get$fragmentationChanged", 2, 0, 20, 57],
+    static: {"^": "HeapMapElement__freeColor,HeapMapElement__pageSeparationColor,HeapMapElement__PAGE_SEPARATION_HEIGHT,HeapMapElement__MAX_CANVAS_HEIGHT", HeapMapElement$created: function(receiver) {
+        var t1, t2, t3, t4, t5;
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t2 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t3 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t4 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t5 = P.String;
+        t5 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t5, null), null, null), [t5, null]);
+        receiver._classIdToColor = t1;
+        receiver._colorToClassId = t2;
+        receiver._classIdToName = t3;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t4;
+        receiver.polymer$Polymer$$ = t5;
+        C.HeapMapElement_methods.Element$created$0(receiver);
+        C.HeapMapElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier10: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  HeapMapElement__renderPages_closure: {
+    "^": "Closure:69;this_0,startPage_1",
+    call$0: function() {
+      J._renderPages$1$x(this.this_0, this.startPage_1 + 1);
+    },
+    $isFunction: true
+  },
+  HeapMapElement_refresh_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(response) {
+      var t1 = this.this_0;
+      t1._heap_map_element$__$fragmentation = J.notifyPropertyChange$3$x(t1, C.Symbol_fragmentation, t1._heap_map_element$__$fragmentation, response);
+    }, "call$1", null, 2, 0, null, 132, "call"],
+    $isFunction: true
+  },
+  HeapMapElement_refresh_closure0: {
+    "^": "Closure:75;",
+    call$2: [function(e, st) {
+      N.Logger_Logger("").info$1(H.S(e) + " " + H.S(st));
+    }, "call$2", null, 4, 0, null, 1, 133, "call"],
+    $isFunction: true
+  },
+  HeapMapElement_fragmentationChanged_closure: {
+    "^": "Closure:69;this_0",
+    call$0: function() {
+      J._updateFragmentationData$0$x(this.this_0);
+    },
+    $isFunction: true
+  }
+}],
+["heap_profile_element", "package:observatory/src/elements/heap_profile.dart", , K, {
+  "^": "",
+  ClassSortedTable: {
+    "^": "SortedTable;columns,rows,sortedRows,_sortColumnIndex,_sortDescending,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    getSortKeyFor$2: function(row, col) {
+      var t1;
+      if (col === 0) {
+        t1 = this.rows;
+        if (row >>> 0 !== row || row >= t1.length)
+          return H.ioore(t1, row);
+        return J.get$name$x(J.$index$asx(J.get$values$x(t1[row]), col));
+      }
+      return G.SortedTable.prototype.getSortKeyFor$2.call(this, row, col);
+    }
+  },
+  HeapProfileElement: {
+    "^": "ObservatoryElement_ChangeNotifier11;_heap_profile_element$__$lastServiceGC,_heap_profile_element$__$lastAccumulatorReset,_newPieDataTable,_newPieChart,_oldPieDataTable,_oldPieChart,_heap_profile_element$__$classTable,_classTableBody,_heap_profile_element$__$profile,_heap_profile_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$lastServiceGC: function(receiver) {
+      return receiver._heap_profile_element$__$lastServiceGC;
+    },
+    set$lastServiceGC: function(receiver, value) {
+      receiver._heap_profile_element$__$lastServiceGC = this.notifyPropertyChange$3(receiver, C.Symbol_lastServiceGC, receiver._heap_profile_element$__$lastServiceGC, value);
+    },
+    get$lastAccumulatorReset: function(receiver) {
+      return receiver._heap_profile_element$__$lastAccumulatorReset;
+    },
+    set$lastAccumulatorReset: function(receiver, value) {
+      receiver._heap_profile_element$__$lastAccumulatorReset = this.notifyPropertyChange$3(receiver, C.Symbol_lastAccumulatorReset, receiver._heap_profile_element$__$lastAccumulatorReset, value);
+    },
+    get$classTable: function(receiver) {
+      return receiver._heap_profile_element$__$classTable;
+    },
+    set$classTable: function(receiver, value) {
+      receiver._heap_profile_element$__$classTable = this.notifyPropertyChange$3(receiver, C.Symbol_classTable, receiver._heap_profile_element$__$classTable, value);
+    },
+    get$profile: function(receiver) {
+      return receiver._heap_profile_element$__$profile;
+    },
+    set$profile: function(receiver, value) {
+      receiver._heap_profile_element$__$profile = this.notifyPropertyChange$3(receiver, C.Symbol_profile, receiver._heap_profile_element$__$profile, value);
+    },
+    get$isolate: function(receiver) {
+      return receiver._heap_profile_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._heap_profile_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._heap_profile_element$__$isolate, value);
+    },
+    attached$0: function(receiver) {
+      var t1, t2;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#newPieChart");
+      t2 = new G.Chart(null, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null));
+      t2._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "PieChart"), [t1]);
+      receiver._newPieChart = t2;
+      t2 = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#oldPieChart");
+      t1 = new G.Chart(null, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null));
+      t1._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "PieChart"), [t2]);
+      receiver._oldPieChart = t1;
+      receiver._classTableBody = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#classTableBody");
+    },
+    _updateClasses$0: function(receiver) {
+      var t1, clsAllocations, t2, cls;
+      for (t1 = J.get$iterator$ax(J.$index$asx(receiver._heap_profile_element$__$profile, "members")); t1.moveNext$0();) {
+        clsAllocations = t1.get$current();
+        t2 = J.getInterceptor$asx(clsAllocations);
+        cls = t2.$index(clsAllocations, "class");
+        if (cls == null)
+          continue;
+        cls.get$newSpace().update$1(t2.$index(clsAllocations, "new"));
+        cls.get$oldSpace().update$1(t2.$index(clsAllocations, "old"));
+      }
+    },
+    _updateClassTable$0: function(receiver) {
+      var t1, cls, t2, t3, t4, t5, t6, t7, t8, t9;
+      receiver._heap_profile_element$__$classTable.clearRows$0();
+      for (t1 = J.get$iterator$ax(J.$index$asx(receiver._heap_profile_element$__$profile, "members")); t1.moveNext$0();) {
+        cls = J.$index$asx(t1.get$current(), "class");
+        if (cls == null)
+          continue;
+        if (cls.get$hasNoAllocations())
+          continue;
+        t2 = cls.get$newSpace().get$accumulated()._service$__$bytes;
+        t3 = cls.get$newSpace().get$accumulated()._service$__$instances;
+        t4 = cls.get$newSpace().get$current()._service$__$bytes;
+        t5 = cls.get$newSpace().get$current()._service$__$instances;
+        t6 = cls.get$oldSpace().get$accumulated()._service$__$bytes;
+        t7 = cls.get$oldSpace().get$accumulated()._service$__$instances;
+        t8 = cls.get$oldSpace().get$current()._service$__$bytes;
+        t9 = cls.get$oldSpace().get$current()._service$__$instances;
+        J.addRow$1$x(receiver._heap_profile_element$__$classTable, new G.SortedTableRow([cls, "", t2, t3, t4, t5, "", t6, t7, t8, t9]));
+      }
+      J.sort$0$ax(receiver._heap_profile_element$__$classTable);
+    },
+    _fillClassTableDomRow$2: function(receiver, tr, rowIndex) {
+      var row, t1, t2, i, t3, cell;
+      row = J.$index$asx(J.get$rows$x(receiver._heap_profile_element$__$classTable), rowIndex);
+      t1 = J.getInterceptor$x(tr);
+      t2 = J.getInterceptor$x(row);
+      J.set$ref$x(J.$index$asx(J.get$children$x(J.$index$asx(t1.get$children(tr), 0)), 0), J.$index$asx(t2.get$values(row), 0));
+      i = 1;
+      while (true) {
+        t3 = J.get$length$asx(t2.get$values(row));
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        c$0: {
+          if (C.JSArray_methods.contains$1(C.List_1_6, i))
+            break c$0;
+          cell = J.$index$asx(t1.get$children(tr), i);
+          t3 = J.getInterceptor$x(cell);
+          t3.set$title(cell, J.toString$0(J.$index$asx(t2.get$values(row), i)));
+          t3.set$text(cell, receiver._heap_profile_element$__$classTable.getFormattedValue$2(rowIndex, i));
+        }
+        ++i;
+      }
+    },
+    _updateClassTableInDom$0: function(receiver) {
+      var t1, deadRows, i, t2, newRows, tr, cell, rowIndex;
+      t1 = J.get$children$x(receiver._classTableBody);
+      if (t1.get$length(t1) > receiver._heap_profile_element$__$classTable.get$sortedRows().length) {
+        t1 = J.get$children$x(receiver._classTableBody);
+        deadRows = t1.get$length(t1) - receiver._heap_profile_element$__$classTable.get$sortedRows().length;
+        for (i = 0; i < deadRows; ++i)
+          J.get$children$x(receiver._classTableBody).removeLast$0(0);
+      } else {
+        t1 = J.get$children$x(receiver._classTableBody);
+        if (t1.get$length(t1) < receiver._heap_profile_element$__$classTable.get$sortedRows().length) {
+          t1 = receiver._heap_profile_element$__$classTable.get$sortedRows().length;
+          t2 = J.get$children$x(receiver._classTableBody);
+          newRows = t1 - t2.get$length(t2);
+          for (i = 0; i < newRows; ++i) {
+            tr = document.createElement("tr", null);
+            t1 = J.getInterceptor$x(tr);
+            t1.insertCell$1(tr, -1).appendChild(W._ElementFactoryProvider_createElement_tag("class-ref", null));
+            cell = t1.insertCell$1(tr, -1);
+            cell.toString;
+            new W._ElementCssClassSet(cell).add$1(0, "left-border-spacer");
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            cell = t1.insertCell$1(tr, -1);
+            cell.toString;
+            new W._ElementCssClassSet(cell).add$1(0, "left-border-spacer");
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            J.get$children$x(receiver._classTableBody).add$1(0, tr);
+          }
+        }
+      }
+      for (i = 0; i < receiver._heap_profile_element$__$classTable.get$sortedRows().length; ++i) {
+        t1 = receiver._heap_profile_element$__$classTable.get$sortedRows();
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        rowIndex = t1[i];
+        this._fillClassTableDomRow$2(receiver, J.get$children$x(receiver._classTableBody).$index(0, i), rowIndex);
+      }
+    },
+    changeSort$3: [function(receiver, e, detail, target) {
+      var t1, t2, t3;
+      if (!!J.getInterceptor(target).$isTableCellElement) {
+        t1 = receiver._heap_profile_element$__$classTable.get$sortColumnIndex();
+        t2 = target.cellIndex;
+        t3 = receiver._heap_profile_element$__$classTable;
+        if (t1 == null ? t2 != null : t1 !== t2) {
+          t3.set$sortColumnIndex(t2);
+          receiver._heap_profile_element$__$classTable.set$sortDescending(true);
+        } else
+          t3.set$sortDescending(!t3.get$sortDescending());
+        J.sort$0$ax(receiver._heap_profile_element$__$classTable);
+        this._updateClassTableInDom$0(receiver);
+      }
+    }, "call$3", "get$changeSort", 6, 0, 92, 1, 93, 94],
+    refresh$1: [function(receiver, done) {
+      var t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("/allocationprofile").then$1(this.get$_heap_profile_element$_update(receiver)).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    refreshGC$1: [function(receiver, done) {
+      var t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("/allocationprofile?gc=full").then$1(this.get$_heap_profile_element$_update(receiver)).whenComplete$1(done);
+    }, "call$1", "get$refreshGC", 2, 0, 20, 89],
+    resetAccumulator$1: [function(receiver, done) {
+      var t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("/allocationprofile?reset=true").then$1(this.get$_heap_profile_element$_update(receiver)).whenComplete$1(done);
+    }, "call$1", "get$resetAccumulator", 2, 0, 20, 89],
+    _heap_profile_element$_update$1: [function(receiver, newProfile) {
+      receiver._heap_profile_element$__$profile = this.notifyPropertyChange$3(receiver, C.Symbol_profile, receiver._heap_profile_element$__$profile, newProfile);
+    }, "call$1", "get$_heap_profile_element$_update", 2, 0, 134, 135],
+    profileChanged$1: [function(receiver, oldValue) {
+      var t1, millis, isolate, t2, t3;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      t1 = J.get$isolate$x(t1);
+      t1 = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._heap_profile_element$__$isolate, t1);
+      receiver._heap_profile_element$__$isolate = t1;
+      t1.updateHeapsFromMap$1(J.$index$asx(receiver._heap_profile_element$__$profile, "heaps"));
+      millis = H.Primitives_parseInt(J.$index$asx(receiver._heap_profile_element$__$profile, "dateLastAccumulatorReset"), null, null);
+      if (!J.$eq(millis, 0)) {
+        t1 = P.DateTime$fromMillisecondsSinceEpoch(millis, false).toString$0(0);
+        receiver._heap_profile_element$__$lastAccumulatorReset = this.notifyPropertyChange$3(receiver, C.Symbol_lastAccumulatorReset, receiver._heap_profile_element$__$lastAccumulatorReset, t1);
+      }
+      millis = H.Primitives_parseInt(J.$index$asx(receiver._heap_profile_element$__$profile, "dateLastServiceGC"), null, null);
+      if (!J.$eq(millis, 0)) {
+        t1 = P.DateTime$fromMillisecondsSinceEpoch(millis, false).toString$0(0);
+        receiver._heap_profile_element$__$lastServiceGC = this.notifyPropertyChange$3(receiver, C.Symbol_lastServiceGC, receiver._heap_profile_element$__$lastServiceGC, t1);
+      }
+      t1 = receiver._newPieDataTable._app$_table;
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      isolate = J.get$isolate$x(receiver._heap_profile_element$__$profile);
+      t1 = receiver._newPieDataTable;
+      t2 = isolate.get$newSpace().get$used();
+      t1 = t1._app$_table;
+      t3 = [];
+      C.JSArray_methods.addAll$1(t3, C.JSArray_methods.map$1(["Used", t2], P._convertToJS$closure()));
+      t1.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t3), [null])]);
+      t3 = receiver._newPieDataTable;
+      t1 = J.$sub$n(isolate.get$newSpace().get$capacity(), isolate.get$newSpace().get$used());
+      t3 = t3._app$_table;
+      t2 = [];
+      C.JSArray_methods.addAll$1(t2, C.JSArray_methods.map$1(["Free", t1], P._convertToJS$closure()));
+      t3.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t2), [null])]);
+      t2 = receiver._newPieDataTable;
+      t3 = isolate.get$newSpace().get$external();
+      t2 = t2._app$_table;
+      t1 = [];
+      C.JSArray_methods.addAll$1(t1, C.JSArray_methods.map$1(["External", t3], P._convertToJS$closure()));
+      t2.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t1), [null])]);
+      t1 = receiver._oldPieDataTable._app$_table;
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      t1 = receiver._oldPieDataTable;
+      t2 = isolate.get$oldSpace().get$used();
+      t1 = t1._app$_table;
+      t3 = [];
+      C.JSArray_methods.addAll$1(t3, C.JSArray_methods.map$1(["Used", t2], P._convertToJS$closure()));
+      t1.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t3), [null])]);
+      t3 = receiver._oldPieDataTable;
+      t1 = J.$sub$n(isolate.get$oldSpace().get$capacity(), isolate.get$oldSpace().get$used());
+      t3 = t3._app$_table;
+      t2 = [];
+      C.JSArray_methods.addAll$1(t2, C.JSArray_methods.map$1(["Free", t1], P._convertToJS$closure()));
+      t3.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t2), [null])]);
+      t2 = receiver._oldPieDataTable;
+      t3 = isolate.get$oldSpace().get$external();
+      t2 = t2._app$_table;
+      t1 = [];
+      C.JSArray_methods.addAll$1(t1, C.JSArray_methods.map$1(["External", t3], P._convertToJS$closure()));
+      t2.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t1), [null])]);
+      this._updateClasses$0(receiver);
+      this._updateClassTable$0(receiver);
+      this._updateClassTableInDom$0(receiver);
+      receiver._newPieChart.draw$1(receiver._newPieDataTable);
+      receiver._oldPieChart.draw$1(receiver._oldPieDataTable);
+      this.notifyPropertyChange$3(receiver, C.Symbol_formattedAverage, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_formattedTotalCollectionTime, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_formattedCollections, 0, 1);
+    }, "call$1", "get$profileChanged", 2, 0, 20, 57],
+    formattedAverage$1: [function(receiver, newSpace) {
+      var t1, t2, heap;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return "";
+      t2 = J.getInterceptor$x(t1);
+      heap = newSpace === true ? t2.get$isolate(t1).get$newSpace() : t2.get$isolate(t1).get$oldSpace();
+      return C.JSNumber_methods.toStringAsFixed$1(J.$div$n(J.$mul$ns(heap.get$totalCollectionTimeInSeconds(), 1000), heap.get$collections()), 2) + " ms";
+    }, "call$1", "get$formattedAverage", 2, 0, 136, 137],
+    formattedCollections$1: [function(receiver, newSpace) {
+      var t1, t2;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return "";
+      t2 = J.getInterceptor$x(t1);
+      return J.toString$0((newSpace === true ? t2.get$isolate(t1).get$newSpace() : t2.get$isolate(t1).get$oldSpace()).get$collections());
+    }, "call$1", "get$formattedCollections", 2, 0, 136, 137],
+    formattedTotalCollectionTime$1: [function(receiver, newSpace) {
+      var t1, t2;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return "";
+      t2 = J.getInterceptor$x(t1);
+      return J.toStringAsFixed$1$n((newSpace === true ? t2.get$isolate(t1).get$newSpace() : t2.get$isolate(t1).get$oldSpace()).get$totalCollectionTimeInSeconds(), 2) + " secs";
+    }, "call$1", "get$formattedTotalCollectionTime", 2, 0, 136, 137],
+    HeapProfileElement$created$0: function(receiver) {
+      var t1 = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null);
+      receiver._newPieDataTable = new G.DataTable(t1);
+      t1.callMethod$2("addColumn", ["string", "Type"]);
+      receiver._newPieDataTable._app$_table.callMethod$2("addColumn", ["number", "Size"]);
+      t1 = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null);
+      receiver._oldPieDataTable = new G.DataTable(t1);
+      t1.callMethod$2("addColumn", ["string", "Type"]);
+      receiver._oldPieDataTable._app$_table.callMethod$2("addColumn", ["number", "Size"]);
+      t1 = H.setRuntimeTypeInfo([], [G.SortedTableRow]);
+      t1 = this.notifyPropertyChange$3(receiver, C.Symbol_classTable, receiver._heap_profile_element$__$classTable, new K.ClassSortedTable([new G.SortedTableColumn("Class", G.SortedTableColumn_toStringFormatter$closure()), new G.SortedTableColumn("", G.SortedTableColumn_toStringFormatter$closure()), new G.SortedTableColumn("Accumulated Size (New)", G.Utils_formatSize$closure()), new G.SortedTableColumn("Accumulated Instances", G.Utils_formatCommaSeparated$closure()), new G.SortedTableColumn("Current Size", G.Utils_formatSize$closure()), new G.SortedTableColumn("Current Instances", G.Utils_formatCommaSeparated$closure()), new G.SortedTableColumn("", G.SortedTableColumn_toStringFormatter$closure()), new G.SortedTableColumn("Accumulator Size (Old)", G.Utils_formatSize$closure()), new G.SortedTableColumn("Accumulator Instances", G.Utils_formatCommaSeparated$closure()), new G.SortedTableColumn("Current Size", G.Utils_formatSize$closure()), new G.SortedTableColumn("Current Instances", G.Utils_formatCommaSeparated$closure())], t1, [], 0, true, null, null));
+      receiver._heap_profile_element$__$classTable = t1;
+      t1.set$sortColumnIndex(2);
+    },
+    static: {HeapProfileElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._heap_profile_element$__$lastServiceGC = "---";
+        receiver._heap_profile_element$__$lastAccumulatorReset = "---";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.HeapProfileElement_methods.Element$created$0(receiver);
+        C.HeapProfileElement_methods.PolymerElement$created$0(receiver);
+        C.HeapProfileElement_methods.HeapProfileElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier11: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["html_common", "dart:html_common", , P, {
+  "^": "",
+  _convertDartToNative_PrepareForStructuredClone: function(value) {
+    var copies, copy;
+    copies = [];
+    copy = new P._convertDartToNative_PrepareForStructuredClone_walk(new P._convertDartToNative_PrepareForStructuredClone_findSlot([], copies), new P._convertDartToNative_PrepareForStructuredClone_readSlot(copies), new P._convertDartToNative_PrepareForStructuredClone_writeSlot(copies)).call$1(value);
+    new P._convertDartToNative_PrepareForStructuredClone_cleanupSlots().call$0();
+    return copy;
+  },
+  convertNativeToDart_AcceptStructuredClone: function(object, mustCopy) {
+    var copies = [];
+    return new P.convertNativeToDart_AcceptStructuredClone_walk(mustCopy, new P.convertNativeToDart_AcceptStructuredClone_findSlot([], copies), new P.convertNativeToDart_AcceptStructuredClone_readSlot(copies), new P.convertNativeToDart_AcceptStructuredClone_writeSlot(copies)).call$1(object);
+  },
+  convertNativeToDart_ImageData: function(nativeImageData) {
+    var t1, data;
+    t1 = J.getInterceptor(nativeImageData);
+    if (!!t1.$isImageData) {
+      data = t1.get$data(nativeImageData);
+      if (data.constructor === Array)
+        if (typeof CanvasPixelArray !== "undefined") {
+          data.constructor = CanvasPixelArray;
+          data.BYTES_PER_ELEMENT = 1;
+        }
+      return nativeImageData;
+    }
+    return new P._TypedImageData(nativeImageData.data, nativeImageData.height, nativeImageData.width);
+  },
+  convertDartToNative_ImageData: function(imageData) {
+    if (!!J.getInterceptor(imageData).$is_TypedImageData)
+      return {data: imageData.data, height: imageData.height, width: imageData.width};
+    return imageData;
+  },
+  Device_isWebKit: function() {
+    var t1 = $.Device__isWebKit;
+    if (t1 == null) {
+      t1 = $.Device__isOpera;
+      if (t1 == null) {
+        t1 = J.contains$2$asx(window.navigator.userAgent, "Opera", 0);
+        $.Device__isOpera = t1;
+      }
+      t1 = t1 !== true && J.contains$2$asx(window.navigator.userAgent, "WebKit", 0);
+      $.Device__isWebKit = t1;
+    }
+    return t1;
+  },
+  _convertDartToNative_PrepareForStructuredClone_findSlot: {
+    "^": "Closure:48;values_1,copies_2",
+    call$1: function(value) {
+      var t1, $length, i;
+      t1 = this.values_1;
+      $length = t1.length;
+      for (i = 0; i < $length; ++i)
+        if (t1[i] === value)
+          return i;
+      t1.push(value);
+      this.copies_2.push(null);
+      return $length;
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_readSlot: {
+    "^": "Closure:138;copies_3",
+    call$1: function(i) {
+      var t1 = this.copies_3;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      return t1[i];
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_writeSlot: {
+    "^": "Closure:139;copies_4",
+    call$2: function(i, x) {
+      var t1 = this.copies_4;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      t1[i] = x;
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_cleanupSlots: {
+    "^": "Closure:69;",
+    call$0: function() {
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_walk: {
+    "^": "Closure:13;findSlot_5,readSlot_6,writeSlot_7",
+    call$1: function(e) {
+      var t1, t2, slot, copy, $length, i;
+      t1 = {};
+      if (e == null)
+        return e;
+      if (typeof e === "boolean")
+        return e;
+      if (typeof e === "number")
+        return e;
+      if (typeof e === "string")
+        return e;
+      t2 = J.getInterceptor(e);
+      if (!!t2.$isDateTime)
+        return new Date(e.millisecondsSinceEpoch);
+      if (!!t2.$isRegExp)
+        throw H.wrapException(P.UnimplementedError$("structured clone of RegExp"));
+      if (!!t2.$isFile)
+        return e;
+      if (!!t2.$isBlob)
+        return e;
+      if (!!t2.$isImageData)
+        return e;
+      if (!!t2.$isNativeByteBuffer)
+        return e;
+      if (!!t2.$isNativeTypedData)
+        return e;
+      if (!!t2.$isMap) {
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        t1.copy_0 = copy;
+        if (copy != null)
+          return copy;
+        copy = {};
+        t1.copy_0 = copy;
+        this.writeSlot_7.call$2(slot, copy);
+        t2.forEach$1(e, new P._convertDartToNative_PrepareForStructuredClone_walk_closure(t1, this));
+        return t1.copy_0;
+      }
+      if (!!t2.$isList) {
+        $length = t2.get$length(e);
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        if (copy != null) {
+          if (true === copy) {
+            copy = new Array($length);
+            this.writeSlot_7.call$2(slot, copy);
+          }
+          return copy;
+        }
+        copy = new Array($length);
+        this.writeSlot_7.call$2(slot, copy);
+        for (i = 0; i < $length; ++i) {
+          t1 = this.call$1(t2.$index(e, i));
+          if (i >= copy.length)
+            return H.ioore(copy, i);
+          copy[i] = t1;
+        }
+        return copy;
+      }
+      throw H.wrapException(P.UnimplementedError$("structured clone of other type"));
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_walk_closure: {
+    "^": "Closure:75;box_0,walk_8",
+    call$2: function(key, value) {
+      this.box_0.copy_0[key] = this.walk_8.call$1(value);
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_findSlot: {
+    "^": "Closure:48;values_0,copies_1",
+    call$1: function(value) {
+      var t1, $length, i, t2;
+      t1 = this.values_0;
+      $length = t1.length;
+      for (i = 0; i < $length; ++i) {
+        t2 = t1[i];
+        if (t2 == null ? value == null : t2 === value)
+          return i;
+      }
+      t1.push(value);
+      this.copies_1.push(null);
+      return $length;
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_readSlot: {
+    "^": "Closure:138;copies_2",
+    call$1: function(i) {
+      var t1 = this.copies_2;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      return t1[i];
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_writeSlot: {
+    "^": "Closure:139;copies_3",
+    call$2: function(i, x) {
+      var t1 = this.copies_3;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      t1[i] = x;
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_walk: {
+    "^": "Closure:13;mustCopy_4,findSlot_5,readSlot_6,writeSlot_7",
+    call$1: function(e) {
+      var slot, copy, t1, key, $length, t2, i;
+      if (e == null)
+        return e;
+      if (typeof e === "boolean")
+        return e;
+      if (typeof e === "number")
+        return e;
+      if (typeof e === "string")
+        return e;
+      if (e instanceof Date)
+        return P.DateTime$fromMillisecondsSinceEpoch(e.getTime(), true);
+      if (e instanceof RegExp)
+        throw H.wrapException(P.UnimplementedError$("structured clone of RegExp"));
+      if (Object.getPrototypeOf(e) === Object.prototype) {
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        if (copy != null)
+          return copy;
+        copy = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        this.writeSlot_7.call$2(slot, copy);
+        for (t1 = Object.keys(e), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+          key = t1._current;
+          copy.$indexSet(0, key, this.call$1(e[key]));
+        }
+        return copy;
+      }
+      if (e instanceof Array) {
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        if (copy != null)
+          return copy;
+        t1 = J.getInterceptor$asx(e);
+        $length = t1.get$length(e);
+        copy = this.mustCopy_4 ? new Array($length) : e;
+        this.writeSlot_7.call$2(slot, copy);
+        if (typeof $length !== "number")
+          return H.iae($length);
+        t2 = J.getInterceptor$ax(copy);
+        i = 0;
+        for (; i < $length; ++i)
+          t2.$indexSet(copy, i, this.call$1(t1.$index(e, i)));
+        return copy;
+      }
+      return e;
+    },
+    $isFunction: true
+  },
+  _TypedImageData: {
+    "^": "Object;data>,height>,width>",
+    $is_TypedImageData: true,
+    $isImageData: true
+  },
+  CssClassSetImpl: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return this.readClasses$0().join$1(0, " ");
+    },
+    get$iterator: function(_) {
+      var t1 = this.readClasses$0();
+      t1 = H.setRuntimeTypeInfo(new P.LinkedHashSetIterator(t1, t1._modifications, null, null), [null]);
+      t1._cell = t1._set._first;
+      return t1;
+    },
+    forEach$1: function(_, f) {
+      this.readClasses$0().forEach$1(0, f);
+    },
+    join$1: function(_, separator) {
+      return this.readClasses$0().join$1(0, separator);
+    },
+    map$1: [function(_, f) {
+      var t1 = this.readClasses$0();
+      return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(t1, f), [H.getTypeArgumentByIndex(t1, 0), null]);
+    }, "call$1", "get$map", 2, 0, 140, 31],
+    where$1: function(_, f) {
+      var t1 = this.readClasses$0();
+      return H.setRuntimeTypeInfo(new H.WhereIterable(t1, f), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    expand$1: [function(_, f) {
+      var t1 = this.readClasses$0();
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(t1, f), [H.getTypeArgumentByIndex(t1, 0), null]);
+    }, "call$1", "get$expand", 2, 0, 141, 31],
+    any$1: function(_, f) {
+      return this.readClasses$0().any$1(0, f);
+    },
+    get$isEmpty: function(_) {
+      return this.readClasses$0()._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.readClasses$0()._collection$_length !== 0;
+    },
+    get$length: function(_) {
+      return this.readClasses$0()._collection$_length;
+    },
+    contains$1: function(_, value) {
+      return this.readClasses$0().contains$1(0, value);
+    },
+    lookup$1: function(value) {
+      return this.readClasses$0().contains$1(0, value) ? value : null;
+    },
+    add$1: function(_, value) {
+      return this.modify$1(new P.CssClassSetImpl_add_closure(value));
+    },
+    remove$1: function(_, value) {
+      var s, result;
+      s = this.readClasses$0();
+      result = s.remove$1(0, value);
+      this.writeClasses$1(s);
+      return result;
+    },
+    addAll$1: function(_, iterable) {
+      this.modify$1(new P.CssClassSetImpl_addAll_closure(iterable));
+    },
+    get$last: function(_) {
+      var t1 = this.readClasses$0()._last;
+      if (t1 == null)
+        H.throwExpression(P.StateError$("No elements"));
+      return t1.get$_element(t1);
+    },
+    toList$1$growable: function(_, growable) {
+      return this.readClasses$0().toList$1$growable(0, growable);
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    clear$0: function(_) {
+      this.modify$1(new P.CssClassSetImpl_clear_closure());
+    },
+    modify$1: function(f) {
+      var s, ret;
+      s = this.readClasses$0();
+      ret = f.call$1(s);
+      this.writeClasses$1(s);
+      return ret;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.String];
+    }
+  },
+  CssClassSetImpl_add_closure: {
+    "^": "Closure:13;value_0",
+    call$1: [function(s) {
+      return J.add$1$ax(s, this.value_0);
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  CssClassSetImpl_addAll_closure: {
+    "^": "Closure:13;iterable_0",
+    call$1: [function(s) {
+      return J.addAll$1$ax(s, this.iterable_0);
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  CssClassSetImpl_clear_closure: {
+    "^": "Closure:13;",
+    call$1: [function(s) {
+      return J.clear$0$ax(s);
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  FilteredElementList: {
+    "^": "ListBase;_html_common$_node,_childNodes",
+    get$_filtered: function() {
+      var t1 = this._childNodes;
+      return P.List_List$from(t1.where$1(t1, new P.FilteredElementList__filtered_closure()), true, W.Element);
+    },
+    forEach$1: function(_, f) {
+      H.IterableMixinWorkaround_forEach(this.get$_filtered(), f);
+    },
+    $indexSet: function(_, index, value) {
+      var t1 = this.get$_filtered();
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      J.replaceWith$1$x(t1[index], value);
+    },
+    set$length: function(_, newLength) {
+      var len = this.get$_filtered().length;
+      if (newLength >= len)
+        return;
+      else if (newLength < 0)
+        throw H.wrapException(P.ArgumentError$("Invalid list length"));
+      this.removeRange$2(0, newLength, len);
+    },
+    add$1: function(_, value) {
+      this._childNodes._this.appendChild(value);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]), t2 = this._childNodes._this; t1.moveNext$0();)
+        t2.appendChild(t1._current);
+    },
+    contains$1: function(_, needle) {
+      return false;
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort filtered list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setRange on filtered list"));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(_, start, end) {
+      H.IterableMixinWorkaround_forEach(C.JSArray_methods.sublist$2(this.get$_filtered(), start, end), new P.FilteredElementList_removeRange_closure());
+    },
+    clear$0: function(_) {
+      J._clearChildren$0$x(this._childNodes._this);
+    },
+    removeLast$0: function(_) {
+      var result = this.get$last(this);
+      if (result != null)
+        J.remove$0$ax(result);
+      return result;
+    },
+    insert$2: function(_, index, value) {
+      this._childNodes.insert$2(0, index, value);
+    },
+    insertAll$2: function(_, index, iterable) {
+      var t1, t2;
+      t1 = this._childNodes._this;
+      t2 = t1.childNodes;
+      if (index < 0 || index >= t2.length)
+        return H.ioore(t2, index);
+      J.insertAllBefore$2$x(t1, iterable, t2[index]);
+    },
+    get$length: function(_) {
+      return this.get$_filtered().length;
+    },
+    $index: function(_, index) {
+      var t1 = this.get$_filtered();
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    get$iterator: function(_) {
+      var t1 = this.get$_filtered();
+      return H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]);
+    }
+  },
+  FilteredElementList__filtered_closure: {
+    "^": "Closure:13;",
+    call$1: function(n) {
+      return !!J.getInterceptor(n).$isElement;
+    },
+    $isFunction: true
+  },
+  FilteredElementList_removeRange_closure: {
+    "^": "Closure:13;",
+    call$1: function(el) {
+      return J.remove$0$ax(el);
+    },
+    $isFunction: true
+  }
+}],
+["instance_ref_element", "package:observatory/src/elements/instance_ref.dart", , B, {
+  "^": "",
+  InstanceRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$hoverText: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 != null)
+        if (J.$eq(t1.get$serviceType(), "Null"))
+          if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/optimized-out"))
+            return "This object is no longer needed and has been removed by the optimizing compiler.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/collected"))
+            return "This object has been reclaimed by the garbage collector.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/expired"))
+            return "The handle to this object has expired.  Consider refreshing the page.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/not-initialized"))
+            return "This object will be initialized once it is accessed by the program.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/being-initialized"))
+            return "This object is currently being initialized.";
+      return Q.ServiceRefElement.prototype.get$hoverText.call(this, receiver);
+    },
+    expander$0: [function(receiver) {
+      return this.get$expandEvent(receiver);
+    }, "call$0", "get$expander", 0, 0, 69],
+    expandEvent$2: [function(receiver, expand, done) {
+      var t1, t2;
+      t1 = receiver._service_ref_element$__$ref;
+      if (expand === true)
+        J.reload$0$x(t1).then$1(new B.InstanceRefElement_expandEvent_closure(receiver)).whenComplete$1(done);
+      else {
+        t2 = J.getInterceptor$ax(t1);
+        t2.$indexSet(t1, "fields", null);
+        t2.$indexSet(t1, "elements", null);
+        done.call$0();
+      }
+    }, "call$2", "get$expandEvent", 4, 0, 143, 144, 89],
+    static: {InstanceRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.InstanceRefElement_methods.Element$created$0(receiver);
+        C.InstanceRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  InstanceRefElement_expandEvent_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(result);
+      if (t1.$index(result, "valueAsString") != null) {
+        t1.set$name(result, t1.$index(result, "valueAsString"));
+        result.set$vmName(t1.$index(result, "valueAsString"));
+      }
+      t1 = this.this_0;
+      t2 = J.getInterceptor$x(t1);
+      t1._service_ref_element$__$ref = t2.notifyPropertyChange$3(t1, C.Symbol_ref, t1._service_ref_element$__$ref, result);
+      t2.notifyPropertyChange$3(t1, C.Symbol_ref, 0, 1);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  }
+}],
+["instance_view_element", "package:observatory/src/elements/instance_view.dart", , Z, {
+  "^": "",
+  InstanceViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier12;_instance_view_element$__$instance,_instance_view_element$__$path,_instance_view_element$__$retainedBytes,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$instance: function(receiver) {
+      return receiver._instance_view_element$__$instance;
+    },
+    set$instance: function(receiver, value) {
+      receiver._instance_view_element$__$instance = this.notifyPropertyChange$3(receiver, C.Symbol_instance, receiver._instance_view_element$__$instance, value);
+    },
+    get$path: function(receiver) {
+      return receiver._instance_view_element$__$path;
+    },
+    set$path: function(receiver, value) {
+      receiver._instance_view_element$__$path = this.notifyPropertyChange$3(receiver, C.Symbol_path, receiver._instance_view_element$__$path, value);
+    },
+    get$retainedBytes: function(receiver) {
+      return receiver._instance_view_element$__$retainedBytes;
+    },
+    set$retainedBytes: function(receiver, value) {
+      receiver._instance_view_element$__$retainedBytes = this.notifyPropertyChange$3(receiver, C.Symbol_retainedBytes, receiver._instance_view_element$__$retainedBytes, value);
+    },
+    eval$1: [function(receiver, text) {
+      return J.get$isolate$x(receiver._instance_view_element$__$instance).get$1(J.$add$ns(J.get$id$x(receiver._instance_view_element$__$instance), "/eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false)));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    retainedSize$1: [function(receiver, dummy) {
+      return J.get$isolate$x(receiver._instance_view_element$__$instance).get$1(J.$add$ns(J.get$id$x(receiver._instance_view_element$__$instance), "/retained")).then$1(new Z.InstanceViewElement_retainedSize_closure(receiver));
+    }, "call$1", "get$retainedSize", 2, 0, 98, 100],
+    retainingPath$1: [function(receiver, arg) {
+      return J.get$isolate$x(receiver._instance_view_element$__$instance).get$1(J.$add$ns(J.get$id$x(receiver._instance_view_element$__$instance), "/retaining_path?limit=" + H.S(arg))).then$1(new Z.InstanceViewElement_retainingPath_closure(receiver));
+    }, "call$1", "get$retainingPath", 2, 0, 98, 33],
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._instance_view_element$__$instance).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {InstanceViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._instance_view_element$__$retainedBytes = null;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.InstanceViewElement_methods.Element$created$0(receiver);
+        C.InstanceViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier12: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  InstanceViewElement_retainedSize_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(obj) {
+      var t1, t2;
+      t1 = this.this_0;
+      t2 = H.Primitives_parseInt(J.$index$asx(obj, "valueAsString"), null, null);
+      t1._instance_view_element$__$retainedBytes = J.notifyPropertyChange$3$x(t1, C.Symbol_retainedBytes, t1._instance_view_element$__$retainedBytes, t2);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  InstanceViewElement_retainingPath_closure: {
+    "^": "Closure:130;this_0",
+    call$1: [function(obj) {
+      var t1 = this.this_0;
+      t1._instance_view_element$__$path = J.notifyPropertyChange$3$x(t1, C.Symbol_path, t1._instance_view_element$__$path, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  }
+}],
+["io_view_element", "package:observatory/src/elements/io_view.dart", , E, {
+  "^": "",
+  IOViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier13;_io_view_element$__$io,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$io: function(receiver) {
+      return receiver._io_view_element$__$io;
+    },
+    set$io: function(receiver, value) {
+      receiver._io_view_element$__$io = this.notifyPropertyChange$3(receiver, C.Symbol_io, receiver._io_view_element$__$io, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$io).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOViewElement_methods.Element$created$0(receiver);
+        C.IOViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier13: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IORefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORefElement_methods.Element$created$0(receiver);
+        C.IORefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOHttpServerListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier14;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOHttpServerListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerListViewElement_methods.Element$created$0(receiver);
+        C.IOHttpServerListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier14: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOHttpServerRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOHttpServerRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerRefElement_methods.Element$created$0(receiver);
+        C.IOHttpServerRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOHttpServerViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier15;_io_view_element$__$httpServer,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$httpServer: function(receiver) {
+      return receiver._io_view_element$__$httpServer;
+    },
+    set$httpServer: function(receiver, value) {
+      receiver._io_view_element$__$httpServer = this.notifyPropertyChange$3(receiver, C.Symbol_httpServer, receiver._io_view_element$__$httpServer, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$httpServer).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateHttpServer$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$httpServer).whenComplete$1(new E.IOHttpServerViewElement__updateHttpServer_closure(receiver));
+    }, "call$0", "get$_updateHttpServer", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateHttpServer(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IOHttpServerViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerViewElement_methods.Element$created$0(receiver);
+        C.IOHttpServerViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier15: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOHttpServerViewElement__updateHttpServer_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateHttpServer$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IOHttpServerConnectionViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier16;_io_view_element$__$connection,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$connection: function(receiver) {
+      return receiver._io_view_element$__$connection;
+    },
+    set$connection: function(receiver, value) {
+      receiver._io_view_element$__$connection = this.notifyPropertyChange$3(receiver, C.Symbol_connection, receiver._io_view_element$__$connection, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$connection).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateHttpServer$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$connection).whenComplete$1(new E.IOHttpServerConnectionViewElement__updateHttpServer_closure(receiver));
+    }, "call$0", "get$_updateHttpServer", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateHttpServer(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IOHttpServerConnectionViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerConnectionViewElement_methods.Element$created$0(receiver);
+        C.IOHttpServerConnectionViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier16: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOHttpServerConnectionViewElement__updateHttpServer_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateHttpServer$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IOHttpServerConnectionRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOHttpServerConnectionRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerConnectionRefElement_methods.Element$created$0(receiver);
+        C.IOHttpServerConnectionRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOSocketRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOSocketRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOSocketRefElement_methods.Element$created$0(receiver);
+        C.IOSocketRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOSocketListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier17;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOSocketListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOSocketListViewElement_methods.Element$created$0(receiver);
+        C.IOSocketListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier17: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOSocketViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier18;_io_view_element$__$socket,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$socket: function(receiver) {
+      return receiver._io_view_element$__$socket;
+    },
+    set$socket: function(receiver, value) {
+      receiver._io_view_element$__$socket = this.notifyPropertyChange$3(receiver, C.Symbol_socket, receiver._io_view_element$__$socket, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$socket).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOSocketViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOSocketViewElement_methods.Element$created$0(receiver);
+        C.IOSocketViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier18: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOWebSocketRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOWebSocketRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOWebSocketRefElement_methods.Element$created$0(receiver);
+        C.IOWebSocketRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOWebSocketListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier19;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOWebSocketListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOWebSocketListViewElement_methods.Element$created$0(receiver);
+        C.IOWebSocketListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier19: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOWebSocketViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier20;_io_view_element$__$webSocket,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$webSocket: function(receiver) {
+      return receiver._io_view_element$__$webSocket;
+    },
+    set$webSocket: function(receiver, value) {
+      receiver._io_view_element$__$webSocket = this.notifyPropertyChange$3(receiver, C.Symbol_webSocket, receiver._io_view_element$__$webSocket, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$webSocket).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOWebSocketViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOWebSocketViewElement_methods.Element$created$0(receiver);
+        C.IOWebSocketViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier20: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORandomAccessFileListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier21;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IORandomAccessFileListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORandomAccessFileListViewElement_methods.Element$created$0(receiver);
+        C.IORandomAccessFileListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier21: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORandomAccessFileRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IORandomAccessFileRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORandomAccessFileRefElement_methods.Element$created$0(receiver);
+        C.IORandomAccessFileRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IORandomAccessFileViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier22;_io_view_element$__$file,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$file: function(receiver) {
+      return receiver._io_view_element$__$file;
+    },
+    set$file: function(receiver, value) {
+      receiver._io_view_element$__$file = this.notifyPropertyChange$3(receiver, C.Symbol_file, receiver._io_view_element$__$file, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$file).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateFile$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$file).whenComplete$1(new E.IORandomAccessFileViewElement__updateFile_closure(receiver));
+    }, "call$0", "get$_updateFile", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateFile(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IORandomAccessFileViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORandomAccessFileViewElement_methods.Element$created$0(receiver);
+        C.IORandomAccessFileViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier22: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORandomAccessFileViewElement__updateFile_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateFile$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IOProcessListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier23;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOProcessListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOProcessListViewElement_methods.Element$created$0(receiver);
+        C.IOProcessListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier23: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOProcessRefElement: {
+    "^": "ServiceRefElement_ChangeNotifier0;_io_view_element$__$small,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$small: function(receiver) {
+      return receiver._io_view_element$__$small;
+    },
+    set$small: function(receiver, value) {
+      receiver._io_view_element$__$small = this.notifyPropertyChange$3(receiver, C.Symbol_small, receiver._io_view_element$__$small, value);
+    },
+    static: {IOProcessRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._io_view_element$__$small = false;
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOProcessRefElement_methods.Element$created$0(receiver);
+        C.IOProcessRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ServiceRefElement_ChangeNotifier0: {
+    "^": "ServiceRefElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOProcessViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier24;_io_view_element$__$process,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$process: function(receiver) {
+      return receiver._io_view_element$__$process;
+    },
+    process$0: function($receiver) {
+      return this.get$process($receiver).call$0();
+    },
+    set$process: function(receiver, value) {
+      receiver._io_view_element$__$process = this.notifyPropertyChange$3(receiver, C.Symbol_process, receiver._io_view_element$__$process, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$process).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateFile$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$process).whenComplete$1(new E.IOProcessViewElement__updateFile_closure(receiver));
+    }, "call$0", "get$_updateFile", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateFile(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IOProcessViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOProcessViewElement_methods.Element$created$0(receiver);
+        C.IOProcessViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier24: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOProcessViewElement__updateFile_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateFile$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+}],
+["isolate_profile_element", "package:observatory/src/elements/isolate_profile.dart", , X, {
+  "^": "",
+  ProfileCodeTrieNodeTreeRow: {
+    "^": "TableTreeRow;profile>,root,node,tipKind<,tipParent<,tipExclusive<,tipTicks<,tipTime<,parent,depth,children,columns,_app$__$expander,_app$__$expanderStyle,_expanded,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$code: function(_) {
+      return J.get$code$x(this.node);
+    },
+    onShow$0: function(_) {
+      var t1, threshold, t2, t3, t4, t5, childNode, t6;
+      t1 = this.profile;
+      threshold = J.$index$asx(t1, "threshold");
+      t2 = this.children;
+      if (t2.length > 0)
+        return;
+      for (t3 = this.node, t4 = J.get$iterator$ax(J.get$children$x(t3)), t5 = this.root; t4.moveNext$0();) {
+        childNode = t4.get$current();
+        t6 = J.$div$n(childNode.get$count(), t3.get$count());
+        if (typeof threshold !== "number")
+          return H.iae(threshold);
+        if (!(t6 > threshold || J.$div$n(J.get$code$x(childNode).get$exclusiveTicks(), t5.count) > threshold))
+          continue;
+        t2.push(X.ProfileCodeTrieNodeTreeRow$(t1, t5, childNode, this));
+      }
+    },
+    onHide$0: function() {
+    },
+    hasChildren$0: function() {
+      return J.get$length$asx(J.get$children$x(this.node)) > 0;
+    },
+    ProfileCodeTrieNodeTreeRow$4: function(profile, root, node, $parent) {
+      var t1, t2;
+      t1 = this.node;
+      this.tipTicks = H.S(t1.get$count());
+      this.tipTime = G.Utils_formatTimePrecise(J.$div$n(J.$mul$ns(J.$index$asx(this.profile, "period"), t1.get$count()), 1000000));
+      t2 = J.getInterceptor$x(t1);
+      if (J.$eq(J.get$kind$x(t2.get$code(t1)), C.CodeKind_Tag)) {
+        this.tipKind = "Tag (category)";
+        if ($parent == null)
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), this.root.count);
+        else
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), $parent.node.get$count());
+        this.tipExclusive = G.Utils_formatPercent(t1.get$count(), this.root.count);
+      } else {
+        if (J.$eq(J.get$kind$x(t2.get$code(t1)), C.CodeKind_Collected) || J.$eq(J.get$kind$x(t2.get$code(t1)), C.CodeKind_Reused))
+          this.tipKind = "Garbage Collected Code";
+        else
+          this.tipKind = H.S(J.get$kind$x(t2.get$code(t1))) + " (Function)";
+        if ($parent == null)
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), this.root.count);
+        else
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), $parent.node.get$count());
+        this.tipExclusive = G.Utils_formatPercent(t2.get$code(t1).get$exclusiveTicks(), this.root.count);
+      }
+      t1 = this.columns;
+      t1.push(this.tipParent);
+      t1.push(this.tipExclusive);
+    },
+    static: {ProfileCodeTrieNodeTreeRow$: function(profile, root, node, $parent) {
+        var t1, t2;
+        t1 = H.setRuntimeTypeInfo([], [G.TableTreeRow]);
+        t2 = $parent != null ? $parent.depth + 1 : 0;
+        t1 = new X.ProfileCodeTrieNodeTreeRow(profile, root, node, "", "", "", "", "", $parent, t2, t1, [], "\u2192", "cursor: pointer;", false, null, null);
+        t1.TableTreeRow$1($parent);
+        t1.ProfileCodeTrieNodeTreeRow$4(profile, root, node, $parent);
+        return t1;
+      }}
+  },
+  IsolateProfileElement: {
+    "^": "ObservatoryElement_ChangeNotifier25;_isolate_profile_element$__$profile,_isolate_profile_element$__$hideTagsChecked,_isolate_profile_element$__$sampleCount,_isolate_profile_element$__$refreshTime,_isolate_profile_element$__$sampleRate,_isolate_profile_element$__$sampleDepth,_isolate_profile_element$__$displayCutoff,_isolate_profile_element$__$timeSpan,displayThreshold,_isolate_profile_element$__$tagSelector,_isolate_profile_element$_id,tree=,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$profile: function(receiver) {
+      return receiver._isolate_profile_element$__$profile;
+    },
+    set$profile: function(receiver, value) {
+      receiver._isolate_profile_element$__$profile = this.notifyPropertyChange$3(receiver, C.Symbol_profile, receiver._isolate_profile_element$__$profile, value);
+    },
+    get$hideTagsChecked: function(receiver) {
+      return receiver._isolate_profile_element$__$hideTagsChecked;
+    },
+    set$hideTagsChecked: function(receiver, value) {
+      receiver._isolate_profile_element$__$hideTagsChecked = this.notifyPropertyChange$3(receiver, C.Symbol_hideTagsChecked, receiver._isolate_profile_element$__$hideTagsChecked, value);
+    },
+    get$sampleCount: function(receiver) {
+      return receiver._isolate_profile_element$__$sampleCount;
+    },
+    set$sampleCount: function(receiver, value) {
+      receiver._isolate_profile_element$__$sampleCount = this.notifyPropertyChange$3(receiver, C.Symbol_sampleCount, receiver._isolate_profile_element$__$sampleCount, value);
+    },
+    get$refreshTime: function(receiver) {
+      return receiver._isolate_profile_element$__$refreshTime;
+    },
+    set$refreshTime: function(receiver, value) {
+      receiver._isolate_profile_element$__$refreshTime = this.notifyPropertyChange$3(receiver, C.Symbol_refreshTime, receiver._isolate_profile_element$__$refreshTime, value);
+    },
+    get$sampleRate: function(receiver) {
+      return receiver._isolate_profile_element$__$sampleRate;
+    },
+    set$sampleRate: function(receiver, value) {
+      receiver._isolate_profile_element$__$sampleRate = this.notifyPropertyChange$3(receiver, C.Symbol_sampleRate, receiver._isolate_profile_element$__$sampleRate, value);
+    },
+    get$sampleDepth: function(receiver) {
+      return receiver._isolate_profile_element$__$sampleDepth;
+    },
+    set$sampleDepth: function(receiver, value) {
+      receiver._isolate_profile_element$__$sampleDepth = this.notifyPropertyChange$3(receiver, C.Symbol_sampleDepth, receiver._isolate_profile_element$__$sampleDepth, value);
+    },
+    get$displayCutoff: function(receiver) {
+      return receiver._isolate_profile_element$__$displayCutoff;
+    },
+    set$displayCutoff: function(receiver, value) {
+      receiver._isolate_profile_element$__$displayCutoff = this.notifyPropertyChange$3(receiver, C.Symbol_displayCutoff, receiver._isolate_profile_element$__$displayCutoff, value);
+    },
+    get$timeSpan: function(receiver) {
+      return receiver._isolate_profile_element$__$timeSpan;
+    },
+    set$timeSpan: function(receiver, value) {
+      receiver._isolate_profile_element$__$timeSpan = this.notifyPropertyChange$3(receiver, C.Symbol_timeSpan, receiver._isolate_profile_element$__$timeSpan, value);
+    },
+    get$tagSelector: function(receiver) {
+      return receiver._isolate_profile_element$__$tagSelector;
+    },
+    set$tagSelector: function(receiver, value) {
+      receiver._isolate_profile_element$__$tagSelector = this.notifyPropertyChange$3(receiver, C.Symbol_tagSelector, receiver._isolate_profile_element$__$tagSelector, value);
+    },
+    profileChanged$1: [function(receiver, oldValue) {
+      var t1, totalSamples, now, period, t2;
+      t1 = receiver._isolate_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      totalSamples = J.$index$asx(t1, "samples");
+      now = new P.DateTime(Date.now(), false);
+      now.DateTime$_now$0();
+      t1 = J.toString$0(totalSamples);
+      receiver._isolate_profile_element$__$sampleCount = this.notifyPropertyChange$3(receiver, C.Symbol_sampleCount, receiver._isolate_profile_element$__$sampleCount, t1);
+      t1 = now.toString$0(0);
+      receiver._isolate_profile_element$__$refreshTime = this.notifyPropertyChange$3(receiver, C.Symbol_refreshTime, receiver._isolate_profile_element$__$refreshTime, t1);
+      t1 = J.toString$0(J.$index$asx(receiver._isolate_profile_element$__$profile, "depth"));
+      receiver._isolate_profile_element$__$sampleDepth = this.notifyPropertyChange$3(receiver, C.Symbol_sampleDepth, receiver._isolate_profile_element$__$sampleDepth, t1);
+      period = J.$index$asx(receiver._isolate_profile_element$__$profile, "period");
+      if (typeof period !== "number")
+        return H.iae(period);
+      t1 = C.JSNumber_methods.toStringAsFixed$1(1000000 / period, 0);
+      receiver._isolate_profile_element$__$sampleRate = this.notifyPropertyChange$3(receiver, C.Symbol_sampleRate, receiver._isolate_profile_element$__$sampleRate, t1);
+      t1 = G.Utils_formatTime(J.$index$asx(receiver._isolate_profile_element$__$profile, "timeSpan"));
+      receiver._isolate_profile_element$__$timeSpan = this.notifyPropertyChange$3(receiver, C.Symbol_timeSpan, receiver._isolate_profile_element$__$timeSpan, t1);
+      t1 = receiver.displayThreshold;
+      t2 = C.JSDouble_methods.toString$0(t1 * 100) + "%";
+      receiver._isolate_profile_element$__$displayCutoff = this.notifyPropertyChange$3(receiver, C.Symbol_displayCutoff, receiver._isolate_profile_element$__$displayCutoff, t2);
+      J.get$isolate$x(receiver._isolate_profile_element$__$profile).processProfile$1(receiver._isolate_profile_element$__$profile);
+      J.$indexSet$ax(receiver._isolate_profile_element$__$profile, "threshold", t1);
+      this._isolate_profile_element$_update$0(receiver);
+    }, "call$1", "get$profileChanged", 2, 0, 20, 57],
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = R._toObservableDeep([]);
+      receiver.tree = new G.TableTree(t1, null, null);
+      this._isolate_profile_element$_update$0(receiver);
+    },
+    tagSelectorChanged$1: [function(receiver, oldValue) {
+      this.refresh$1(receiver, null);
+    }, "call$1", "get$tagSelectorChanged", 2, 0, 20, 57],
+    refresh$1: [function(receiver, done) {
+      var request = "profile?tags=" + H.S(receiver._isolate_profile_element$__$tagSelector);
+      J.get$isolate$x(receiver._isolate_profile_element$__$profile).get$1(request).then$1(new X.IsolateProfileElement_refresh_closure(receiver)).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _isolate_profile_element$_update$0: function(receiver) {
+      if (receiver._isolate_profile_element$__$profile == null)
+        return;
+      this._buildStackTree$0(receiver);
+    },
+    _buildStackTree$0: function(receiver) {
+      var root, e, stackTrace, exception, t1;
+      root = J.get$isolate$x(receiver._isolate_profile_element$__$profile).get$profileTrieRoot();
+      if (root == null)
+        return;
+      try {
+        receiver.tree.initialize$1(X.ProfileCodeTrieNodeTreeRow$(receiver._isolate_profile_element$__$profile, root, root, null));
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        stackTrace = new H._StackTrace(exception, null);
+        N.Logger_Logger("").warning$3("_buildStackTree", e, stackTrace);
+      }
+
+      if (J.$eq(J.get$length$asx(receiver.tree.rows), 1))
+        receiver.tree.toggle$1(0);
+      this.notifyPropertyChange$3(receiver, C.Symbol_tree, null, receiver.tree);
+    },
+    padding$1: [function(receiver, row) {
+      return "padding-left: " + row.get$depth() * 16 + "px;";
+    }, "call$1", "get$padding", 2, 0, 90, 91],
+    coloring$1: [function(receiver, row) {
+      return C.List_mBx[C.JSInt_methods.$mod(row.get$depth() - 1, 9)];
+    }, "call$1", "get$coloring", 2, 0, 90, 91],
+    toggleExpanded$3: [function(receiver, e, detail, target) {
+      var row, e0, stackTrace, t1, t2, exception;
+      t1 = J.getInterceptor$x(e);
+      if (!J.$eq(J.get$id$x(t1.get$target(e)), "expand") && !J.$eq(t1.get$target(e), target))
+        return;
+      row = J.get$parent$x(target);
+      if (!!J.getInterceptor(row).$isTableRowElement)
+        try {
+          t1 = receiver.tree;
+          t2 = J.get$rowIndex$x(row);
+          if (typeof t2 !== "number")
+            return t2.$sub();
+          t1.toggle$1(t2 - 1);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          stackTrace = new H._StackTrace(exception, null);
+          N.Logger_Logger("").warning$3("toggleExpanded", e0, stackTrace);
+        }
+
+    }, "call$3", "get$toggleExpanded", 6, 0, 92, 1, 93, 94],
+    static: {"^": "IsolateProfileElement_MICROSECONDS_PER_SECOND", IsolateProfileElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._isolate_profile_element$__$sampleCount = "";
+        receiver._isolate_profile_element$__$refreshTime = "";
+        receiver._isolate_profile_element$__$sampleRate = "";
+        receiver._isolate_profile_element$__$sampleDepth = "";
+        receiver._isolate_profile_element$__$displayCutoff = "";
+        receiver._isolate_profile_element$__$timeSpan = "";
+        receiver.displayThreshold = 0.0002;
+        receiver._isolate_profile_element$__$tagSelector = "uv";
+        receiver._isolate_profile_element$_id = "#tableTree";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateProfileElement_methods.Element$created$0(receiver);
+        C.IsolateProfileElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier25: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateProfileElement_refresh_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(m) {
+      var t1 = this.this_0;
+      t1._isolate_profile_element$__$profile = J.notifyPropertyChange$3$x(t1, C.Symbol_profile, t1._isolate_profile_element$__$profile, m);
+    }, "call$1", null, 2, 0, null, 145, "call"],
+    $isFunction: true
+  }
+}],
+["isolate_ref_element", "package:observatory/src/elements/isolate_ref.dart", , N, {
+  "^": "",
+  IsolateRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IsolateRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateRefElement_methods.Element$created$0(receiver);
+        C.IsolateRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["isolate_summary_element", "package:observatory/src/elements/isolate_summary.dart", , D, {
+  "^": "",
+  IsolateSummaryElement: {
+    "^": "ObservatoryElement_ChangeNotifier26;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    static: {IsolateSummaryElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateSummaryElement_methods.Element$created$0(receiver);
+        C.IsolateSummaryElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier26: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateRunStateElement: {
+    "^": "ObservatoryElement_ChangeNotifier27;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    pause$1: [function(receiver, _) {
+      return receiver._isolate_summary_element$__$isolate.get$1("debug/pause").then$1(new D.IsolateRunStateElement_pause_closure(receiver));
+    }, "call$1", "get$pause", 2, 0, 146, 14],
+    resume$1: [function(receiver, _) {
+      return receiver._isolate_summary_element$__$isolate.get$1("debug/resume").then$1(new D.IsolateRunStateElement_resume_closure(receiver));
+    }, "call$1", "get$resume", 2, 0, 146, 14],
+    static: {IsolateRunStateElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateRunStateElement_methods.Element$created$0(receiver);
+        C.IsolateRunStateElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier27: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateRunStateElement_pause_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_summary_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  IsolateRunStateElement_resume_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_summary_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  IsolateLocationElement: {
+    "^": "ObservatoryElement_ChangeNotifier28;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    static: {IsolateLocationElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateLocationElement_methods.Element$created$0(receiver);
+        C.IsolateLocationElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier28: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateSharedSummaryElement: {
+    "^": "ObservatoryElement_ChangeNotifier29;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    static: {IsolateSharedSummaryElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateSharedSummaryElement_methods.Element$created$0(receiver);
+        C.IsolateSharedSummaryElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier29: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  CounterChart: {
+    "^": "Object;_table,_chart",
+    update$1: function(counters) {
+      var t1, t2, t3, key, t4, t5;
+      t1 = this._table._app$_table;
+      if (J.$eq(t1.callMethod$1("getNumberOfColumns"), 0)) {
+        t1.callMethod$2("addColumn", ["string", "Name"]);
+        t1.callMethod$2("addColumn", ["number", "Value"]);
+      }
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      for (t2 = J.get$iterator$ax(counters.get$keys()), t3 = J.getInterceptor$asx(counters); t2.moveNext$0();) {
+        key = t2.get$current();
+        t4 = J.split$1$s(t3.$index(counters, key), "%");
+        if (0 >= t4.length)
+          return H.ioore(t4, 0);
+        t5 = [];
+        C.JSArray_methods.addAll$1(t5, C.JSArray_methods.map$1([key, H.Primitives_parseDouble(t4[0], null)], P._convertToJS$closure()));
+        t5 = new P.JsArray(t5);
+        t5.$builtinTypeInfo = [null];
+        t1.callMethod$2("addRow", [t5]);
+      }
+    }
+  },
+  IsolateCounterChartElement: {
+    "^": "ObservatoryElement_ChangeNotifier30;_isolate_summary_element$__$counters,chart,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$counters: function(receiver) {
+      return receiver._isolate_summary_element$__$counters;
+    },
+    set$counters: function(receiver, value) {
+      receiver._isolate_summary_element$__$counters = this.notifyPropertyChange$3(receiver, C.Symbol_counters, receiver._isolate_summary_element$__$counters, value);
+    },
+    countersChanged$1: [function(receiver, oldValue) {
+      var t1, element, t2;
+      if (receiver._isolate_summary_element$__$counters == null)
+        return;
+      if ($.get$GoogleChart__completer().future._state !== 0 && receiver.chart == null)
+        receiver.chart = new D.CounterChart(new G.DataTable(P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null)), null);
+      t1 = receiver.chart;
+      if (t1 == null)
+        return;
+      t1.update$1(receiver._isolate_summary_element$__$counters);
+      element = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#counterPieChart");
+      if (element != null) {
+        t1 = receiver.chart;
+        t2 = t1._chart;
+        if (t2 == null) {
+          t2 = new G.Chart(null, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null));
+          t2._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "PieChart"), [element]);
+          t1._chart = t2;
+        }
+        t2.draw$1(t1._table);
+      }
+    }, "call$1", "get$countersChanged", 2, 0, 20, 57],
+    static: {IsolateCounterChartElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateCounterChartElement_methods.Element$created$0(receiver);
+        C.IsolateCounterChartElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier30: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["isolate_view_element", "package:observatory/src/elements/isolate_view.dart", , L, {
+  "^": "",
+  TagProfileChart: {
+    "^": "Object;_isolate_view_element$_table,_isolate_view_element$_chart",
+    update$1: function(tagProfile) {
+      var t1, t2, tagName, idleIndex, t, i, snapshotTime, row, sum, j;
+      t1 = this._isolate_view_element$_table._app$_table;
+      if (J.$eq(t1.callMethod$1("getNumberOfColumns"), 0)) {
+        t1.callMethod$2("addColumn", ["string", "Time"]);
+        for (t2 = J.get$iterator$ax(tagProfile.get$names()); t2.moveNext$0();) {
+          tagName = t2._current;
+          if (J.$eq(tagName, "Idle"))
+            continue;
+          t1.callMethod$2("addColumn", ["number", tagName]);
+        }
+      }
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      idleIndex = J.indexOf$1$asx(tagProfile.get$names(), "Idle");
+      t = tagProfile.get$updatedAtSeconds();
+      for (i = 0; i < tagProfile.get$snapshots().length; ++i) {
+        t2 = tagProfile.get$snapshots();
+        if (i >= t2.length)
+          return H.ioore(t2, i);
+        snapshotTime = t2[i].seconds;
+        row = [];
+        if (snapshotTime > 0) {
+          if (typeof t !== "number")
+            return H.iae(t);
+          row.push("t " + C.JSNumber_methods.toStringAsFixed$1(snapshotTime - t, 2));
+        } else
+          row.push("");
+        t2 = tagProfile.get$snapshots();
+        if (i >= t2.length)
+          return H.ioore(t2, i);
+        sum = t2[i]._sum;
+        if (sum === 0) {
+          j = 0;
+          while (true) {
+            t2 = tagProfile.get$snapshots();
+            if (i >= t2.length)
+              return H.ioore(t2, i);
+            if (!(j < t2[i].counters.length))
+              break;
+            c$1: {
+              if (j === idleIndex)
+                break c$1;
+              row.push(0);
+            }
+            ++j;
+          }
+        } else {
+          j = 0;
+          while (true) {
+            t2 = tagProfile.get$snapshots();
+            if (i >= t2.length)
+              return H.ioore(t2, i);
+            if (!(j < t2[i].counters.length))
+              break;
+            c$1: {
+              if (j === idleIndex)
+                break c$1;
+              t2 = tagProfile.get$snapshots();
+              if (i >= t2.length)
+                return H.ioore(t2, i);
+              t2 = t2[i].counters;
+              if (j >= t2.length)
+                return H.ioore(t2, j);
+              row.push(C.JSNumber_methods.toInt$0(J.$div$n(t2[j], sum) * 100));
+            }
+            ++j;
+          }
+        }
+        t2 = [];
+        C.JSArray_methods.addAll$1(t2, C.JSArray_methods.map$1(row, P._convertToJS$closure()));
+        t2 = new P.JsArray(t2);
+        t2.$builtinTypeInfo = [null];
+        t1.callMethod$2("addRow", [t2]);
+      }
+    }
+  },
+  IsolateViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier31;_isolate_view_element$__$isolate,_isolate_view_element$_updateTimer,tagProfileChart,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_view_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_view_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_view_element$__$isolate, value);
+    },
+    eval$1: [function(receiver, text) {
+      var t1 = receiver._isolate_view_element$__$isolate;
+      return t1.get$1(J.$add$ns(J.get$id$x(t1.get$rootLib()), "/eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false)));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    _updateTagProfile$0: [function(receiver) {
+      receiver._isolate_view_element$__$isolate.updateTagProfile$0().then$1(new L.IsolateViewElement__updateTagProfile_closure(receiver));
+    }, "call$0", "get$_updateTagProfile", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._isolate_view_element$_updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateTagProfile(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._isolate_view_element$_updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._isolate_view_element$_updateTimer = null;
+      }
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._isolate_view_element$__$isolate).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    pause$1: [function(receiver, _) {
+      return receiver._isolate_view_element$__$isolate.get$1("debug/pause").then$1(new L.IsolateViewElement_pause_closure(receiver));
+    }, "call$1", "get$pause", 2, 0, 146, 14],
+    resume$1: [function(receiver, _) {
+      return receiver._isolate_view_element$__$isolate.get$1("resume").then$1(new L.IsolateViewElement_resume_closure(receiver));
+    }, "call$1", "get$resume", 2, 0, 146, 14],
+    static: {IsolateViewElement$created: function(receiver) {
+        var t1, t2, t3;
+        t1 = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null);
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t3 = P.String;
+        t3 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t3, null), null, null), [t3, null]);
+        receiver.tagProfileChart = new L.TagProfileChart(new G.DataTable(t1), null);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t2;
+        receiver.polymer$Polymer$$ = t3;
+        C.IsolateViewElement_methods.Element$created$0(receiver);
+        C.IsolateViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier31: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateViewElement__updateTagProfile_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(tagProfile) {
+      var t1, t2, element, t3, t4;
+      t1 = this.this_0;
+      t2 = t1.tagProfileChart;
+      t2.update$1(tagProfile);
+      element = (t1.shadowRoot || t1.webkitShadowRoot).querySelector("#tagProfileChart");
+      if (element != null) {
+        if (t2._isolate_view_element$_chart == null) {
+          t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+          t4 = new G.Chart(null, t3);
+          t4._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "SteppedAreaChart"), [element]);
+          t2._isolate_view_element$_chart = t4;
+          t3.$indexSet(0, "isStacked", true);
+          t2._isolate_view_element$_chart.options.$indexSet(0, "connectSteps", false);
+          t2._isolate_view_element$_chart.options.$indexSet(0, "vAxis", P.LinkedHashMap_LinkedHashMap$_literal(["minValue", 0, "maxValue", 100], null, null));
+        }
+        t2._isolate_view_element$_chart.draw$1(t2._isolate_view_element$_table);
+      }
+      if (t1._isolate_view_element$_updateTimer != null)
+        t1._isolate_view_element$_updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateTagProfile$x(t1));
+    }, "call$1", null, 2, 0, null, 147, "call"],
+    $isFunction: true
+  },
+  IsolateViewElement_pause_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_view_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  IsolateViewElement_resume_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_view_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  }
+}],
+["json_view_element", "package:observatory/src/elements/json_view.dart", , Z, {
+  "^": "",
+  JsonPrettyPrinter: {
+    "^": "Object;_json_view_element$_buffer,_seen",
+    _printMap$2: function(map, depth) {
+      var t1, t2, t3, t4, t5, k, v, t6;
+      t1 = this._seen;
+      if (t1.contains$1(0, map))
+        return;
+      t1.add$1(0, map);
+      for (t2 = J.get$iterator$ax(map.get$keys()), t3 = this._json_view_element$_buffer, t4 = J.getInterceptor$asx(map), t5 = depth + 1; t2.moveNext$0();) {
+        k = t2.get$current();
+        v = t4.$index(map, k);
+        t6 = J.getInterceptor(v);
+        if (!!t6.$isMap) {
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t6;
+          t6 = "\"" + H.S(k) + "\": {\n";
+          t3._contents += t6;
+          this._printMap$2(v, t5);
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t6 = t3._contents += t6;
+          t3._contents = t6 + "}\n";
+        } else if (!!t6.$isList) {
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t6;
+          t6 = "\"" + H.S(k) + "\": [\n";
+          t3._contents += t6;
+          this._printList$2(v, t5);
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t6 = t3._contents += t6;
+          t3._contents = t6 + "]\n";
+        } else {
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t6;
+          t6 = "\"" + H.S(k) + "\": " + H.S(v);
+          t6 = t3._contents += t6;
+          t3._contents = t6 + "\n";
+        }
+      }
+      t1.remove$1(0, map);
+    },
+    _printList$2: function(list, depth) {
+      var t1, t2, t3, t4, v, t5;
+      t1 = this._seen;
+      if (t1.contains$1(0, list))
+        return;
+      t1.add$1(0, list);
+      for (t2 = J.get$iterator$ax(list), t3 = this._json_view_element$_buffer, t4 = depth + 1; t2.moveNext$0();) {
+        v = t2.get$current();
+        t5 = J.getInterceptor(v);
+        if (!!t5.$isMap) {
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "{\n";
+          this._printMap$2(v, t4);
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "}\n";
+        } else if (!!t5.$isList) {
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "[\n";
+          this._printList$2(v, t4);
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "]\n";
+        } else {
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t5;
+          t5 = t3._contents += typeof v === "string" ? v : H.S(v);
+          t3._contents = t5 + "\n";
+        }
+      }
+      t1.remove$1(0, list);
+    }
+  },
+  JsonViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier32;_json_view_element$__$map,_json_view_element$__$mapAsString,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$map: function(receiver) {
+      return receiver._json_view_element$__$map;
+    },
+    map$1: function($receiver, arg0) {
+      return this.get$map($receiver).call$1(arg0);
+    },
+    set$map: function(receiver, value) {
+      receiver._json_view_element$__$map = this.notifyPropertyChange$3(receiver, C.Symbol_map, receiver._json_view_element$__$map, value);
+    },
+    get$mapAsString: function(receiver) {
+      return receiver._json_view_element$__$mapAsString;
+    },
+    set$mapAsString: function(receiver, value) {
+      receiver._json_view_element$__$mapAsString = this.notifyPropertyChange$3(receiver, C.Symbol_mapAsString, receiver._json_view_element$__$mapAsString, value);
+    },
+    mapChanged$1: [function(receiver, oldValue) {
+      var t1, t2, t3;
+      t1 = P.StringBuffer$("");
+      t2 = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+      t3 = receiver._json_view_element$__$map;
+      t1._contents = "";
+      t1.write$1("{\n");
+      new Z.JsonPrettyPrinter(t1, t2)._printMap$2(t3, 0);
+      t1.write$1("}\n");
+      t1 = t1._contents;
+      receiver._json_view_element$__$mapAsString = this.notifyPropertyChange$3(receiver, C.Symbol_mapAsString, receiver._json_view_element$__$mapAsString, t1);
+    }, "call$1", "get$mapChanged", 2, 0, 20, 57],
+    static: {JsonViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.JsonViewElement_methods.Element$created$0(receiver);
+        C.JsonViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier32: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["library_ref_element", "package:observatory/src/elements/library_ref.dart", , R, {
+  "^": "",
+  LibraryRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {LibraryRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.LibraryRefElement_methods.Element$created$0(receiver);
+        C.LibraryRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["library_view_element", "package:observatory/src/elements/library_view.dart", , M, {
+  "^": "",
+  LibraryViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier33;_library_view_element$__$library,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$library: function(receiver) {
+      return receiver._library_view_element$__$library;
+    },
+    set$library: function(receiver, value) {
+      receiver._library_view_element$__$library = this.notifyPropertyChange$3(receiver, C.Symbol_library, receiver._library_view_element$__$library, value);
+    },
+    eval$1: [function(receiver, text) {
+      return J.get$isolate$x(receiver._library_view_element$__$library).get$1(J.$add$ns(J.get$id$x(receiver._library_view_element$__$library), "/eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false)));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._library_view_element$__$library).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {LibraryViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.LibraryViewElement_methods.Element$created$0(receiver);
+        C.LibraryViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier33: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["logging", "package:logging/logging.dart", , N, {
+  "^": "",
+  Logger: {
+    "^": "Object;name>,parent>,_level,_children>,children>,_controller",
+    get$fullName: function() {
+      var t1, t2, t3;
+      t1 = this.parent;
+      t2 = t1 == null || J.$eq(J.get$name$x(t1), "");
+      t3 = this.name;
+      return t2 ? t3 : t1.get$fullName() + "." + t3;
+    },
+    get$level: function() {
+      if ($.hierarchicalLoggingEnabled) {
+        var t1 = this._level;
+        if (t1 != null)
+          return t1;
+        t1 = this.parent;
+        if (t1 != null)
+          return t1.get$level();
+      }
+      return $._rootLevel;
+    },
+    set$level: function(value) {
+      if ($.hierarchicalLoggingEnabled && this.parent != null)
+        this._level = value;
+      else {
+        if (this.parent != null)
+          throw H.wrapException(P.UnsupportedError$("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."));
+        $._rootLevel = value;
+      }
+    },
+    get$onRecord: function() {
+      return this._getStream$0();
+    },
+    isLoggable$1: function(value) {
+      return value.value >= this.get$level().value;
+    },
+    log$4: function(logLevel, message, error, stackTrace) {
+      var t1, t2, t3, record, target;
+      if (logLevel.value >= this.get$level().value) {
+        t1 = this.get$fullName();
+        t2 = new P.DateTime(Date.now(), false);
+        t2.DateTime$_now$0();
+        t3 = $.LogRecord__nextNumber;
+        $.LogRecord__nextNumber = t3 + 1;
+        record = new N.LogRecord(logLevel, message, t1, t2, t3, error, stackTrace);
+        if ($.hierarchicalLoggingEnabled)
+          for (target = this; target != null;) {
+            target._publish$1(record);
+            target = J.get$parent$x(target);
+          }
+        else
+          N.Logger_Logger("")._publish$1(record);
+      }
+    },
+    finer$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_FINER_400, message, error, stackTrace);
+    },
+    finer$1: function(message) {
+      return this.finer$3(message, null, null);
+    },
+    fine$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_FINE_500, message, error, stackTrace);
+    },
+    fine$1: function(message) {
+      return this.fine$3(message, null, null);
+    },
+    info$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_INFO_800, message, error, stackTrace);
+    },
+    info$1: function(message) {
+      return this.info$3(message, null, null);
+    },
+    warning$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_WARNING_900, message, error, stackTrace);
+    },
+    warning$1: function(message) {
+      return this.warning$3(message, null, null);
+    },
+    severe$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_SEVERE_1000, message, error, stackTrace);
+    },
+    severe$1: function(message) {
+      return this.severe$3(message, null, null);
+    },
+    _getStream$0: function() {
+      if ($.hierarchicalLoggingEnabled || this.parent == null) {
+        var t1 = this._controller;
+        if (t1 == null) {
+          t1 = P.StreamController_StreamController$broadcast(null, null, true, N.LogRecord);
+          this._controller = t1;
+        }
+        t1.toString;
+        return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+      } else
+        return N.Logger_Logger("")._getStream$0();
+    },
+    _publish$1: function(record) {
+      var t1 = this._controller;
+      if (t1 != null) {
+        if (t1._state >= 4)
+          H.throwExpression(t1._addEventError$0());
+        t1._sendData$1(record);
+      }
+    },
+    Logger$_internal$3: function($name, $parent, children) {
+      var t1 = this.parent;
+      if (t1 != null)
+        J.get$_children$x(t1).$indexSet(0, this.name, this);
+    },
+    $isLogger: true,
+    static: {"^": "Logger__loggers", Logger_Logger: function($name) {
+        return $.get$Logger__loggers().putIfAbsent$2($name, new N.Logger_Logger_closure($name));
+      }}
+  },
+  Logger_Logger_closure: {
+    "^": "Closure:69;name_0",
+    call$0: function() {
+      var thisName, dot, $parent, t1, t2;
+      thisName = this.name_0;
+      if (C.JSString_methods.startsWith$1(thisName, "."))
+        H.throwExpression(P.ArgumentError$("name shouldn't start with a '.'"));
+      dot = C.JSString_methods.lastIndexOf$1(thisName, ".");
+      if (dot === -1)
+        $parent = thisName !== "" ? N.Logger_Logger("") : null;
+      else {
+        $parent = N.Logger_Logger(C.JSString_methods.substring$2(thisName, 0, dot));
+        thisName = C.JSString_methods.substring$1(thisName, dot + 1);
+      }
+      t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, N.Logger);
+      t2 = new N.Logger(thisName, $parent, null, t1, H.setRuntimeTypeInfo(new Q.UnmodifiableMapView(t1), [null, null]), null);
+      t2.Logger$_internal$3(thisName, $parent, t1);
+      return t2;
+    },
+    $isFunction: true
+  },
+  Level: {
+    "^": "Object;name>,value>",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isLevel && this.value === other.value;
+    },
+    $lt: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value < t1;
+    },
+    $le: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value <= t1;
+    },
+    $gt: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value > t1;
+    },
+    $ge: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value >= t1;
+    },
+    compareTo$1: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value - t1;
+    },
+    get$hashCode: function(_) {
+      return this.value;
+    },
+    toString$0: function(_) {
+      return this.name;
+    },
+    $isLevel: true,
+    static: {"^": "Level_ALL,Level_OFF,Level_FINEST,Level_FINER,Level_FINE,Level_CONFIG,Level_INFO,Level_WARNING,Level_SEVERE,Level_SHOUT,Level_LEVELS"}
+  },
+  LogRecord: {
+    "^": "Object;level<,message>,loggerName,time<,sequenceNumber,error>,stackTrace<",
+    toString$0: function(_) {
+      return "[" + this.level.name + "] " + this.loggerName + ": " + this.message;
+    },
+    $isLogRecord: true,
+    static: {"^": "LogRecord__nextNumber"}
+  }
+}],
+["", "main.dart", , F, {
+  "^": "",
+  main: function() {
+    var t1, t2;
+    N.Logger_Logger("").set$level(C.Level_INFO_800);
+    N.Logger_Logger("").get$onRecord().listen$1(new F.main_closure414());
+    N.Logger_Logger("").info$1("Starting Observatory");
+    N.Logger_Logger("").info$1("Loading Google Charts API");
+    t1 = J.$index$asx($.get$context(), "google");
+    t2 = $.get$GoogleChart__completer();
+    t1.callMethod$2("load", ["visualization", "1", P.JsObject_JsObject$jsify(P.LinkedHashMap_LinkedHashMap$_literal(["packages", ["corechart", "table"], "callback", P.JsFunction_JsFunction$withThis(t2.get$complete(t2))], null, null))]);
+    $.get$GoogleChart__completer().future.then$1(G.GoogleChart__initOnceOnComplete$closure()).then$1(new F.main_closure415());
+  },
+  main_closure414: {
+    "^": "Closure:149;",
+    call$1: [function(rec) {
+      var t1;
+      if (J.$eq(rec.get$level(), C.Level_WARNING_900)) {
+        t1 = J.getInterceptor$x(rec);
+        if (J.startsWith$1$s(t1.get$message(rec), "Error evaluating expression"))
+          t1 = J.contains$1$asx(t1.get$message(rec), "Can't assign to null: ") === true || J.contains$1$asx(t1.get$message(rec), "Expression is not assignable: ") === true;
+        else
+          t1 = false;
+      } else
+        t1 = false;
+      if (t1)
+        return;
+      P.print(rec.get$level().name + ": " + rec.get$time().toString$0(0) + ": " + H.S(J.get$message$x(rec)));
+    }, "call$1", null, 2, 0, null, 148, "call"],
+    $isFunction: true
+  },
+  main_closure415: {
+    "^": "Closure:13;",
+    call$1: [function(_) {
+      N.Logger_Logger("").info$1("Initializing Polymer");
+      A.initPolymer();
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  }
+}],
+["nav_bar_element", "package:observatory/src/elements/nav_bar.dart", , A, {
+  "^": "",
+  NavBarElement: {
+    "^": "ObservatoryElement_ChangeNotifier34;_nav_bar_element$__$pad,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$pad: function(receiver) {
+      return receiver._nav_bar_element$__$pad;
+    },
+    set$pad: function(receiver, value) {
+      receiver._nav_bar_element$__$pad = this.notifyPropertyChange$3(receiver, C.Symbol_pad, receiver._nav_bar_element$__$pad, value);
+    },
+    static: {NavBarElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$pad = true;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavBarElement_methods.Element$created$0(receiver);
+        C.NavBarElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier34: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier35;_nav_bar_element$__$link,_nav_bar_element$__$anchor,_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$link: function(receiver) {
+      return receiver._nav_bar_element$__$link;
+    },
+    set$link: function(receiver, value) {
+      receiver._nav_bar_element$__$link = this.notifyPropertyChange$3(receiver, C.Symbol_link, receiver._nav_bar_element$__$link, value);
+    },
+    get$anchor: function(receiver) {
+      return receiver._nav_bar_element$__$anchor;
+    },
+    set$anchor: function(receiver, value) {
+      receiver._nav_bar_element$__$anchor = this.notifyPropertyChange$3(receiver, C.Symbol_anchor, receiver._nav_bar_element$__$anchor, value);
+    },
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {NavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$link = "#";
+        receiver._nav_bar_element$__$anchor = "---";
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavMenuElement_methods.Element$created$0(receiver);
+        C.NavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier35: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavMenuItemElement: {
+    "^": "ObservatoryElement_ChangeNotifier36;_nav_bar_element$__$link,_nav_bar_element$__$anchor,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$link: function(receiver) {
+      return receiver._nav_bar_element$__$link;
+    },
+    set$link: function(receiver, value) {
+      receiver._nav_bar_element$__$link = this.notifyPropertyChange$3(receiver, C.Symbol_link, receiver._nav_bar_element$__$link, value);
+    },
+    get$anchor: function(receiver) {
+      return receiver._nav_bar_element$__$anchor;
+    },
+    set$anchor: function(receiver, value) {
+      receiver._nav_bar_element$__$anchor = this.notifyPropertyChange$3(receiver, C.Symbol_anchor, receiver._nav_bar_element$__$anchor, value);
+    },
+    static: {NavMenuItemElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$link = "#";
+        receiver._nav_bar_element$__$anchor = "---";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavMenuItemElement_methods.Element$created$0(receiver);
+        C.NavMenuItemElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier36: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavRefreshElement: {
+    "^": "ObservatoryElement_ChangeNotifier37;_nav_bar_element$__$callback,_nav_bar_element$__$active,_nav_bar_element$__$label,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$callback: function(receiver) {
+      return receiver._nav_bar_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._nav_bar_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._nav_bar_element$__$callback, value);
+    },
+    get$active: function(receiver) {
+      return receiver._nav_bar_element$__$active;
+    },
+    set$active: function(receiver, value) {
+      receiver._nav_bar_element$__$active = this.notifyPropertyChange$3(receiver, C.Symbol_active, receiver._nav_bar_element$__$active, value);
+    },
+    get$label: function(receiver) {
+      return receiver._nav_bar_element$__$label;
+    },
+    set$label: function(receiver, value) {
+      receiver._nav_bar_element$__$label = this.notifyPropertyChange$3(receiver, C.Symbol_label, receiver._nav_bar_element$__$label, value);
+    },
+    buttonClick$3: [function(receiver, e, detail, target) {
+      var t1 = receiver._nav_bar_element$__$active;
+      if (t1 === true)
+        return;
+      receiver._nav_bar_element$__$active = this.notifyPropertyChange$3(receiver, C.Symbol_active, t1, true);
+      if (receiver._nav_bar_element$__$callback != null)
+        this.callback$1(receiver, this.get$refreshDone(receiver));
+    }, "call$3", "get$buttonClick", 6, 0, 102, 1, 93, 94],
+    refreshDone$0: [function(receiver) {
+      receiver._nav_bar_element$__$active = this.notifyPropertyChange$3(receiver, C.Symbol_active, receiver._nav_bar_element$__$active, false);
+    }, "call$0", "get$refreshDone", 0, 0, 18],
+    static: {NavRefreshElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$active = false;
+        receiver._nav_bar_element$__$label = "Refresh";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavRefreshElement_methods.Element$created$0(receiver);
+        C.NavRefreshElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier37: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavControlElement: {
+    "^": "ObservatoryElement;change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {NavControlElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavControlElement_methods.Element$created$0(receiver);
+        C.NavControlElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  TopNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier38;_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {TopNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.TopNavMenuElement_methods.Element$created$0(receiver);
+        C.TopNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier38: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier39;_nav_bar_element$__$last,_nav_bar_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    get$isolate: function(receiver) {
+      return receiver._nav_bar_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._nav_bar_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._nav_bar_element$__$isolate, value);
+    },
+    isolateChanged$1: [function(receiver, oldValue) {
+      this.notifyPropertyChange$3(receiver, C.Symbol_hashLinkWorkaround, 0, 1);
+    }, "call$1", "get$isolateChanged", 2, 0, 20, 57],
+    get$hashLinkWorkaround: function(receiver) {
+      var t1 = receiver._nav_bar_element$__$isolate;
+      if (t1 != null)
+        return J.get$link$x(t1);
+      else
+        return "";
+    },
+    set$hashLinkWorkaround: function(receiver, x) {
+    },
+    static: {IsolateNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateNavMenuElement_methods.Element$created$0(receiver);
+        C.IsolateNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier39: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  LibraryNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier40;_nav_bar_element$__$library,_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$library: function(receiver) {
+      return receiver._nav_bar_element$__$library;
+    },
+    set$library: function(receiver, value) {
+      receiver._nav_bar_element$__$library = this.notifyPropertyChange$3(receiver, C.Symbol_library, receiver._nav_bar_element$__$library, value);
+    },
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {LibraryNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.LibraryNavMenuElement_methods.Element$created$0(receiver);
+        C.LibraryNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier40: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ClassNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier41;_nav_bar_element$__$cls,_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$cls: function(receiver) {
+      return receiver._nav_bar_element$__$cls;
+    },
+    set$cls: function(receiver, value) {
+      receiver._nav_bar_element$__$cls = this.notifyPropertyChange$3(receiver, C.Symbol_cls, receiver._nav_bar_element$__$cls, value);
+    },
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {ClassNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassNavMenuElement_methods.Element$created$0(receiver);
+        C.ClassNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier41: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["observatory_application_element", "package:observatory/src/elements/observatory_application.dart", , V, {
+  "^": "",
+  ObservatoryApplicationElement: {
+    "^": "ObservatoryElement_ChangeNotifier42;_observatory_application_element$__$devtools,app,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$devtools: function(receiver) {
+      return receiver._observatory_application_element$__$devtools;
+    },
+    set$devtools: function(receiver, value) {
+      receiver._observatory_application_element$__$devtools = this.notifyPropertyChange$3(receiver, C.Symbol_devtools, receiver._observatory_application_element$__$devtools, value);
+    },
+    attached$0: function(receiver) {
+      var t1, t2;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      if (receiver._observatory_application_element$__$devtools === true) {
+        t1 = H.setRuntimeTypeInfo([], [G.Pane]);
+        t2 = new U.DartiumVM(P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Completer), 0, "unknown", "unknown", 0, false, false, "", null, P.StreamController_StreamController$broadcast(null, null, false, null), P.StreamController_StreamController$broadcast(null, null, false, null), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.ServiceObject), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.Isolate), null, null, null, null, null, false, null, null, null, null, null);
+        t2.VM$0();
+        t2.DartiumVM$0();
+        t2 = new G.ObservatoryApplication(t1, null, null, new G.HashLocationManager("/vm", null, null, null, null, null), t2, null, receiver, null, null, null);
+        t2.ObservatoryApplication$devtools$1(receiver);
+        receiver.app = t2;
+      } else {
+        t1 = H.setRuntimeTypeInfo([], [G.Pane]);
+        t2 = new U.HttpVM(null, "unknown", "unknown", 0, false, false, "", null, P.StreamController_StreamController$broadcast(null, null, false, null), P.StreamController_StreamController$broadcast(null, null, false, null), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.ServiceObject), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.Isolate), null, null, null, null, null, false, null, null, null, null, null);
+        t2.VM$0();
+        t2.HttpVM$0();
+        t2 = new G.ObservatoryApplication(t1, null, null, new G.HashLocationManager("/vm", null, null, null, null, null), t2, null, receiver, null, null, null);
+        t2.ObservatoryApplication$1(receiver);
+        receiver.app = t2;
+      }
+    },
+    static: {ObservatoryApplicationElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._observatory_application_element$__$devtools = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ObservatoryApplicationElement_methods.Element$created$0(receiver);
+        C.ObservatoryApplicationElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier42: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["observatory_element", "package:observatory/src/elements/observatory_element.dart", , Z, {
+  "^": "",
+  ObservatoryElement: {
+    "^": "PolymerElement;change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    attached$0: function(receiver) {
+      A.Polymer.prototype.attached$0.call(this, receiver);
+    },
+    attributeChanged$3: function(receiver, $name, oldValue, newValue) {
+      A.Polymer.prototype.attributeChanged$3.call(this, receiver, $name, oldValue, newValue);
+    },
+    detached$0: function(receiver) {
+      A.Polymer.prototype.detached$0.call(this, receiver);
+    },
+    ready$0: function(receiver) {
+      A.Polymer.prototype.ready$0.call(this, receiver);
+    },
+    goto$3: [function(receiver, $event, detail, target) {
+      $.location.onGoto$3($event, detail, target);
+    }, "call$3", "get$$goto", 6, 0, 150, 2, 93, 94],
+    gotoLink$1: [function(receiver, url) {
+      $.location.toString;
+      return "#" + H.S(url);
+    }, "call$1", "get$gotoLink", 2, 0, 151, 152],
+    formatTime$1: [function(receiver, time) {
+      return G.Utils_formatTime(time);
+    }, "call$1", "get$formatTime", 2, 0, 153, 154],
+    formatSize$1: [function(receiver, bytes) {
+      return G.Utils_formatSize(bytes);
+    }, "call$1", "get$formatSize", 2, 0, 15, 16],
+    isNull$1: [function(receiver, type) {
+      return J.$eq(type, "Null");
+    }, "call$1", "get$isNull", 2, 0, 155, 156],
+    isError$1: [function(receiver, type) {
+      return J.$eq(type, "Error");
+    }, "call$1", "get$isError", 2, 0, 155, 156],
+    isInt$1: [function(receiver, type) {
+      var t1 = J.getInterceptor(type);
+      return t1.$eq(type, "Smi") || t1.$eq(type, "Mint") || t1.$eq(type, "Bigint");
+    }, "call$1", "get$isInt", 2, 0, 155, 156],
+    isBool$1: [function(receiver, type) {
+      return J.$eq(type, "Bool");
+    }, "call$1", "get$isBool", 2, 0, 155, 156],
+    isString$1: [function(receiver, type) {
+      return J.$eq(type, "String");
+    }, "call$1", "get$isString", 2, 0, 155, 156],
+    isInstance$1: [function(receiver, type) {
+      return J.$eq(type, "Instance");
+    }, "call$1", "get$isInstance", 2, 0, 155, 156],
+    isDouble$1: [function(receiver, type) {
+      return J.$eq(type, "Double");
+    }, "call$1", "get$isDouble", 2, 0, 155, 156],
+    isList$1: [function(receiver, type) {
+      var t1 = J.getInterceptor(type);
+      return t1.$eq(type, "GrowableObjectArray") || t1.$eq(type, "Array");
+    }, "call$1", "get$isList", 2, 0, 155, 156],
+    isType$1: [function(receiver, type) {
+      return J.$eq(type, "Type");
+    }, "call$1", "get$isType", 2, 0, 155, 156],
+    isUnexpected$1: [function(receiver, type) {
+      return !C.JSArray_methods.contains$1(["Null", "Smi", "Mint", "Bigint", "Bool", "String", "Double", "Instance", "GrowableObjectArray", "Array", "Type", "Error"], type);
+    }, "call$1", "get$isUnexpected", 2, 0, 155, 156],
+    static: {ObservatoryElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ObservatoryElement_methods.Element$created$0(receiver);
+        C.ObservatoryElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["observe.src.bindable", "package:observe/src/bindable.dart", , A, {
+  "^": "",
+  Bindable: {
+    "^": "Object;",
+    set$value: function(_, newValue) {
+    },
+    $isBindable: true
+  }
+}],
+["observe.src.change_notifier", "package:observe/src/change_notifier.dart", , O, {
+  "^": "",
+  ChangeNotifier: {
+    "^": "Object;",
+    get$changes: function(receiver) {
+      var t1 = receiver.change_notifier$ChangeNotifier$_changes;
+      if (t1 == null) {
+        t1 = this.get$observed(receiver);
+        t1 = P.StreamController_StreamController$broadcast(this.get$unobserved(receiver), t1, true, null);
+        receiver.change_notifier$ChangeNotifier$_changes = t1;
+      }
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    observed$0: [function(receiver) {
+    }, "call$0", "get$observed", 0, 0, 18],
+    unobserved$0: [function(receiver) {
+      receiver.change_notifier$ChangeNotifier$_changes = null;
+    }, "call$0", "get$unobserved", 0, 0, 18],
+    deliverChanges$0: [function(receiver) {
+      var records, t1, t2;
+      records = receiver.change_notifier$ChangeNotifier$_change_notifier$_records;
+      receiver.change_notifier$ChangeNotifier$_change_notifier$_records = null;
+      if (this.get$hasObservers(receiver) && records != null) {
+        t1 = receiver.change_notifier$ChangeNotifier$_changes;
+        t2 = H.setRuntimeTypeInfo(new P.UnmodifiableListView(records), [T.ChangeRecord]);
+        if (t1._state >= 4)
+          H.throwExpression(t1._addEventError$0());
+        t1._sendData$1(t2);
+        return true;
+      }
+      return false;
+    }, "call$0", "get$deliverChanges", 0, 0, 111],
+    get$hasObservers: function(receiver) {
+      var t1, t2;
+      t1 = receiver.change_notifier$ChangeNotifier$_changes;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    notifyPropertyChange$3: function(receiver, field, oldValue, newValue) {
+      return F.notifyPropertyChangeHelper(receiver, field, oldValue, newValue);
+    },
+    notifyChange$1: function(receiver, record) {
+      if (!this.get$hasObservers(receiver))
+        return;
+      if (receiver.change_notifier$ChangeNotifier$_change_notifier$_records == null) {
+        receiver.change_notifier$ChangeNotifier$_change_notifier$_records = [];
+        P.scheduleMicrotask(this.get$deliverChanges(receiver));
+      }
+      receiver.change_notifier$ChangeNotifier$_change_notifier$_records.push(record);
+    },
+    $isObservable: true
+  }
+}],
+["observe.src.change_record", "package:observe/src/change_record.dart", , T, {
+  "^": "",
+  ChangeRecord: {
+    "^": "Object;",
+    $isChangeRecord: true
+  },
+  PropertyChangeRecord: {
+    "^": "ChangeRecord;object>,name>,oldValue,newValue",
+    toString$0: function(_) {
+      return "#<PropertyChangeRecord " + H.S(this.name) + " from: " + H.S(this.oldValue) + " to: " + H.S(this.newValue) + ">";
+    },
+    $isPropertyChangeRecord: true
+  }
+}],
+["observe.src.dirty_check", "package:observe/src/dirty_check.dart", , O, {
+  "^": "",
+  dirtyCheckObservables: function() {
+    var cycles, debugLoop, toCheck, t1, anyChanged, i, observer, t2, info, t3;
+    if ($._delivering)
+      return;
+    if ($._allObservables == null)
+      return;
+    $._delivering = true;
+    cycles = 0;
+    debugLoop = null;
+    do {
+      ++cycles;
+      if (cycles === 1000)
+        debugLoop = [];
+      toCheck = $._allObservables;
+      t1 = [];
+      t1.$builtinTypeInfo = [F.Observable];
+      $._allObservables = t1;
+      for (t1 = debugLoop != null, anyChanged = false, i = 0; i < toCheck.length; ++i) {
+        observer = toCheck[i];
+        t2 = J.getInterceptor$x(observer);
+        if (t2.get$hasObservers(observer)) {
+          if (t2.deliverChanges$0(observer)) {
+            if (t1)
+              debugLoop.push([i, observer]);
+            anyChanged = true;
+          }
+          $._allObservables.push(observer);
+        }
+      }
+    } while (cycles < 1000 && anyChanged);
+    if (t1 && anyChanged) {
+      t1 = $.get$_logger();
+      t1.warning$1("Possible loop in Observable.dirtyCheck, stopped checking.");
+      for (t2 = H.setRuntimeTypeInfo(new H.ListIterator(debugLoop, debugLoop.length, 0, null), [H.getTypeArgumentByIndex(debugLoop, 0)]); t2.moveNext$0();) {
+        info = t2._current;
+        t3 = J.getInterceptor$asx(info);
+        t1.warning$1("In last iteration Observable changed at index " + H.S(t3.$index(info, 0)) + ", object: " + H.S(t3.$index(info, 1)) + ".");
+      }
+    }
+    $._allObservablesCount = $._allObservables.length;
+    $._delivering = false;
+  },
+  dirtyCheckZoneSpec: function() {
+    var t1 = {};
+    t1.pending_0 = false;
+    t1 = new O.dirtyCheckZoneSpec_enqueueDirtyCheck(t1);
+    return new P._ZoneSpecification(null, null, null, null, new O.dirtyCheckZoneSpec_wrapCallback(t1), new O.dirtyCheckZoneSpec_wrapUnaryCallback(t1), null, null, null, null, null, null);
+  },
+  dirtyCheckZoneSpec_enqueueDirtyCheck: {
+    "^": "Closure:157;box_0",
+    call$2: function($parent, zone) {
+      var t1 = this.box_0;
+      if (t1.pending_0)
+        return;
+      t1.pending_0 = true;
+      $parent.scheduleMicrotask$2(zone, new O.dirtyCheckZoneSpec_enqueueDirtyCheck_closure(t1));
+    },
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_enqueueDirtyCheck_closure: {
+    "^": "Closure:69;box_0",
+    call$0: [function() {
+      this.box_0.pending_0 = false;
+      O.dirtyCheckObservables();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapCallback: {
+    "^": "Closure:30;enqueueDirtyCheck_1",
+    call$4: [function($self, $parent, zone, f) {
+      if (f == null)
+        return f;
+      return new O.dirtyCheckZoneSpec_wrapCallback_closure(this.enqueueDirtyCheck_1, $parent, zone, f);
+    }, "call$4", null, 8, 0, null, 27, 28, 29, 31, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapCallback_closure: {
+    "^": "Closure:69;enqueueDirtyCheck_2,parent_3,zone_4,f_5",
+    call$0: [function() {
+      this.enqueueDirtyCheck_2.call$2(this.parent_3, this.zone_4);
+      return this.f_5.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapUnaryCallback: {
+    "^": "Closure:158;enqueueDirtyCheck_6",
+    call$4: [function($self, $parent, zone, f) {
+      if (f == null)
+        return f;
+      return new O.dirtyCheckZoneSpec_wrapUnaryCallback_closure(this.enqueueDirtyCheck_6, $parent, zone, f);
+    }, "call$4", null, 8, 0, null, 27, 28, 29, 31, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapUnaryCallback_closure: {
+    "^": "Closure:13;enqueueDirtyCheck_7,parent_8,zone_9,f_10",
+    call$1: [function(x) {
+      this.enqueueDirtyCheck_7.call$2(this.parent_8, this.zone_9);
+      return this.f_10.call$1(x);
+    }, "call$1", null, 2, 0, null, 65, "call"],
+    $isFunction: true
+  }
+}],
+["observe.src.list_diff", "package:observe/src/list_diff.dart", , G, {
+  "^": "",
+  _calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
+    var rowCount, columnCount, distances, t1, i, t2, j, t3, t4, t5, t6, t7, t8, t9;
+    rowCount = oldEnd - oldStart + 1;
+    columnCount = J.$add$ns(J.$sub$n(currentEnd, currentStart), 1);
+    distances = Array(rowCount);
+    for (t1 = distances.length, i = 0; i < rowCount; ++i) {
+      if (typeof columnCount !== "number")
+        return H.iae(columnCount);
+      t2 = Array(columnCount);
+      if (i >= t1)
+        return H.ioore(distances, i);
+      distances[i] = t2;
+      if (0 >= t2.length)
+        return H.ioore(t2, 0);
+      t2[0] = i;
+    }
+    if (typeof columnCount !== "number")
+      return H.iae(columnCount);
+    j = 0;
+    for (; j < columnCount; ++j) {
+      if (0 >= t1)
+        return H.ioore(distances, 0);
+      t2 = distances[0];
+      if (j >= t2.length)
+        return H.ioore(t2, j);
+      t2[j] = j;
+    }
+    for (t2 = J.getInterceptor$ns(currentStart), t3 = J.getInterceptor$asx(current), i = 1; i < rowCount; ++i)
+      for (t4 = i - 1, t5 = oldStart + i - 1, j = 1; j < columnCount; ++j) {
+        if (t5 >>> 0 !== t5 || t5 >= old.length)
+          return H.ioore(old, t5);
+        t6 = J.$eq(old[t5], t3.$index(current, J.$sub$n(t2.$add(currentStart, j), 1)));
+        t7 = distances[i];
+        t8 = distances[t4];
+        t9 = j - 1;
+        if (t6) {
+          if (i >= t1)
+            return H.ioore(distances, i);
+          if (t4 >= t1)
+            return H.ioore(distances, t4);
+          if (t9 >= t8.length)
+            return H.ioore(t8, t9);
+          t6 = t8[t9];
+          if (j >= t7.length)
+            return H.ioore(t7, j);
+          t7[j] = t6;
+        } else {
+          if (t4 >= t1)
+            return H.ioore(distances, t4);
+          if (j >= t8.length)
+            return H.ioore(t8, j);
+          t6 = t8[j];
+          if (typeof t6 !== "number")
+            return t6.$add();
+          if (i >= t1)
+            return H.ioore(distances, i);
+          t8 = t7.length;
+          if (t9 >= t8)
+            return H.ioore(t7, t9);
+          t9 = t7[t9];
+          if (typeof t9 !== "number")
+            return t9.$add();
+          t9 = P.min(t6 + 1, t9 + 1);
+          if (j >= t8)
+            return H.ioore(t7, j);
+          t7[j] = t9;
+        }
+      }
+    return distances;
+  },
+  _spliceOperationsFromEditDistances: function(distances) {
+    var t1, i, j, t2, current, edits, t3, t4, t5, northWest, west, north, min;
+    t1 = distances.length;
+    i = t1 - 1;
+    if (0 >= t1)
+      return H.ioore(distances, 0);
+    j = distances[0].length - 1;
+    if (i < 0)
+      return H.ioore(distances, i);
+    t2 = distances[i];
+    if (j < 0 || j >= t2.length)
+      return H.ioore(t2, j);
+    current = t2[j];
+    edits = [];
+    while (true) {
+      if (!(i > 0 || j > 0))
+        break;
+      c$0: {
+        if (i === 0) {
+          edits.push(2);
+          --j;
+          break c$0;
+        }
+        if (j === 0) {
+          edits.push(3);
+          --i;
+          break c$0;
+        }
+        t2 = i - 1;
+        if (t2 < 0)
+          return H.ioore(distances, t2);
+        t3 = distances[t2];
+        t4 = j - 1;
+        t5 = t3.length;
+        if (t4 < 0 || t4 >= t5)
+          return H.ioore(t3, t4);
+        northWest = t3[t4];
+        if (j < 0 || j >= t5)
+          return H.ioore(t3, j);
+        west = t3[j];
+        if (i < 0)
+          return H.ioore(distances, i);
+        t3 = distances[i];
+        if (t4 >= t3.length)
+          return H.ioore(t3, t4);
+        north = t3[t4];
+        min = P.min(P.min(west, north), northWest);
+        if (min === northWest) {
+          if (northWest == null ? current == null : northWest === current)
+            edits.push(0);
+          else {
+            edits.push(1);
+            current = northWest;
+          }
+          j = t4;
+          i = t2;
+        } else if (min === west) {
+          edits.push(3);
+          current = west;
+          i = t2;
+        } else {
+          edits.push(2);
+          current = north;
+          j = t4;
+        }
+      }
+    }
+    return H.setRuntimeTypeInfo(new H.ReversedListIterable(edits), [null]).toList$0(0);
+  },
+  _sharedPrefix: function(arr1, arr2, searchLength) {
+    var t1, i, t2;
+    for (t1 = J.getInterceptor$asx(arr1), i = 0; i < searchLength; ++i) {
+      t2 = t1.$index(arr1, i);
+      if (i >= arr2.length)
+        return H.ioore(arr2, i);
+      if (!J.$eq(t2, arr2[i]))
+        return i;
+    }
+    return searchLength;
+  },
+  _sharedSuffix: function(arr1, arr2, searchLength) {
+    var t1, index1, index2, count, t2;
+    t1 = J.getInterceptor$asx(arr1);
+    index1 = t1.get$length(arr1);
+    index2 = arr2.length;
+    count = 0;
+    while (true) {
+      if (count < searchLength) {
+        --index1;
+        t2 = t1.$index(arr1, index1);
+        --index2;
+        if (index2 < 0 || index2 >= arr2.length)
+          return H.ioore(arr2, index2);
+        t2 = J.$eq(t2, arr2[index2]);
+      } else
+        t2 = false;
+      if (!t2)
+        break;
+      ++count;
+    }
+    return count;
+  },
+  calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
+    var t1, minLength, t2, prefixCount, suffixCount, removed, splice, oldStart0, ops, splices, oldIndex, index, i;
+    t1 = J.getInterceptor$n(currentEnd);
+    minLength = P.min(t1.$sub(currentEnd, currentStart), oldEnd - oldStart);
+    t2 = J.getInterceptor(currentStart);
+    prefixCount = t2.$eq(currentStart, 0) && oldStart === 0 ? G._sharedPrefix(current, old, minLength) : 0;
+    suffixCount = t1.$eq(currentEnd, J.get$length$asx(current)) && oldEnd === old.length ? G._sharedSuffix(current, old, minLength - prefixCount) : 0;
+    currentStart = t2.$add(currentStart, prefixCount);
+    oldStart += prefixCount;
+    currentEnd = t1.$sub(currentEnd, suffixCount);
+    oldEnd -= suffixCount;
+    t1 = J.getInterceptor$n(currentEnd);
+    if (J.$eq(t1.$sub(currentEnd, currentStart), 0) && oldEnd - oldStart === 0)
+      return C.List_empty;
+    if (J.$eq(currentStart, currentEnd)) {
+      removed = [];
+      t1 = new P.UnmodifiableListView(removed);
+      t1.$builtinTypeInfo = [null];
+      splice = new G.ListChangeRecord(current, t1, removed, currentStart, 0);
+      for (; oldStart < oldEnd; oldStart = oldStart0) {
+        t1 = splice._removed;
+        oldStart0 = oldStart + 1;
+        if (oldStart >>> 0 !== oldStart || oldStart >= old.length)
+          return H.ioore(old, oldStart);
+        J.add$1$ax(t1, old[oldStart]);
+      }
+      return [splice];
+    } else if (oldStart === oldEnd) {
+      t1 = t1.$sub(currentEnd, currentStart);
+      removed = [];
+      t2 = new P.UnmodifiableListView(removed);
+      t2.$builtinTypeInfo = [null];
+      return [new G.ListChangeRecord(current, t2, removed, currentStart, t1)];
+    }
+    ops = G._spliceOperationsFromEditDistances(G._calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));
+    splices = [];
+    splices.$builtinTypeInfo = [G.ListChangeRecord];
+    for (oldIndex = oldStart, index = currentStart, splice = null, i = 0; i < ops.length; ++i)
+      switch (ops[i]) {
+        case 0:
+          if (splice != null) {
+            splices.push(splice);
+            splice = null;
+          }
+          index = J.$add$ns(index, 1);
+          ++oldIndex;
+          break;
+        case 1:
+          if (splice == null) {
+            removed = [];
+            t1 = new P.UnmodifiableListView(removed);
+            t1.$builtinTypeInfo = [null];
+            splice = new G.ListChangeRecord(current, t1, removed, index, 0);
+          }
+          splice._addedCount = J.$add$ns(splice._addedCount, 1);
+          index = J.$add$ns(index, 1);
+          t1 = splice._removed;
+          if (oldIndex >>> 0 !== oldIndex || oldIndex >= old.length)
+            return H.ioore(old, oldIndex);
+          J.add$1$ax(t1, old[oldIndex]);
+          ++oldIndex;
+          break;
+        case 2:
+          if (splice == null) {
+            removed = [];
+            t1 = new P.UnmodifiableListView(removed);
+            t1.$builtinTypeInfo = [null];
+            splice = new G.ListChangeRecord(current, t1, removed, index, 0);
+          }
+          splice._addedCount = J.$add$ns(splice._addedCount, 1);
+          index = J.$add$ns(index, 1);
+          break;
+        case 3:
+          if (splice == null) {
+            removed = [];
+            t1 = new P.UnmodifiableListView(removed);
+            t1.$builtinTypeInfo = [null];
+            splice = new G.ListChangeRecord(current, t1, removed, index, 0);
+          }
+          t1 = splice._removed;
+          if (oldIndex >>> 0 !== oldIndex || oldIndex >= old.length)
+            return H.ioore(old, oldIndex);
+          J.add$1$ax(t1, old[oldIndex]);
+          ++oldIndex;
+          break;
+      }
+    if (splice != null)
+      splices.push(splice);
+    return splices;
+  },
+  _mergeSplice: function(splices, record) {
+    var t1, t2, t3, addedCount, t4, splice, inserted, insertionOffset, i, current, intersectCount, removed, offset;
+    t1 = J.getInterceptor$x(record);
+    t2 = t1.get$object(record);
+    t1 = t1.get$index(record);
+    t3 = J.toList$0$ax(record.get$_removed());
+    addedCount = record.get$addedCount();
+    if (addedCount == null)
+      addedCount = 0;
+    t4 = new P.UnmodifiableListView(t3);
+    t4.$builtinTypeInfo = [null];
+    splice = new G.ListChangeRecord(t2, t4, t3, t1, addedCount);
+    for (inserted = false, insertionOffset = 0, i = 0; t1 = splices.length, i < t1; ++i) {
+      if (i < 0)
+        return H.ioore(splices, i);
+      current = splices[i];
+      current._list_diff$_index = J.$add$ns(current._list_diff$_index, insertionOffset);
+      if (inserted)
+        continue;
+      t1 = splice._list_diff$_index;
+      t2 = J.$add$ns(t1, splice._unmodifiableRemoved._collection$_source.length);
+      t3 = current._list_diff$_index;
+      intersectCount = P.min(t2, J.$add$ns(t3, current._addedCount)) - P.max(t1, t3);
+      if (intersectCount >= 0) {
+        C.JSArray_methods.removeAt$1(splices, i);
+        --i;
+        t1 = J.$sub$n(current._addedCount, current._unmodifiableRemoved._collection$_source.length);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        insertionOffset -= t1;
+        t1 = J.$add$ns(splice._addedCount, J.$sub$n(current._addedCount, intersectCount));
+        splice._addedCount = t1;
+        t2 = splice._unmodifiableRemoved._collection$_source.length;
+        t3 = current._unmodifiableRemoved._collection$_source.length;
+        if (J.$eq(t1, 0) && t2 + t3 - intersectCount === 0)
+          inserted = true;
+        else {
+          removed = current._removed;
+          if (J.$lt$n(splice._list_diff$_index, current._list_diff$_index)) {
+            t1 = splice._unmodifiableRemoved;
+            t1 = t1.getRange$2(t1, 0, J.$sub$n(current._list_diff$_index, splice._list_diff$_index));
+            removed.toString;
+            if (typeof removed !== "object" || removed === null || !!removed.fixed$length)
+              H.throwExpression(P.UnsupportedError$("insertAll"));
+            H.IterableMixinWorkaround_insertAllList(removed, 0, t1);
+          }
+          if (J.$gt$n(J.$add$ns(splice._list_diff$_index, splice._unmodifiableRemoved._collection$_source.length), J.$add$ns(current._list_diff$_index, current._addedCount))) {
+            t1 = splice._unmodifiableRemoved;
+            J.addAll$1$ax(removed, t1.getRange$2(t1, J.$sub$n(J.$add$ns(current._list_diff$_index, current._addedCount), splice._list_diff$_index), splice._unmodifiableRemoved._collection$_source.length));
+          }
+          splice._removed = removed;
+          splice._unmodifiableRemoved = current._unmodifiableRemoved;
+          if (J.$lt$n(current._list_diff$_index, splice._list_diff$_index))
+            splice._list_diff$_index = current._list_diff$_index;
+          inserted = false;
+        }
+      } else if (J.$lt$n(splice._list_diff$_index, current._list_diff$_index)) {
+        C.JSArray_methods.insert$2(splices, i, splice);
+        ++i;
+        offset = J.$sub$n(splice._addedCount, splice._unmodifiableRemoved._collection$_source.length);
+        current._list_diff$_index = J.$add$ns(current._list_diff$_index, offset);
+        if (typeof offset !== "number")
+          return H.iae(offset);
+        insertionOffset += offset;
+        inserted = true;
+      } else
+        inserted = false;
+    }
+    if (!inserted)
+      splices.push(splice);
+  },
+  _createInitialSplices: function(list, records) {
+    var splices, t1;
+    splices = H.setRuntimeTypeInfo([], [G.ListChangeRecord]);
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(records, records.length, 0, null), [H.getTypeArgumentByIndex(records, 0)]); t1.moveNext$0();)
+      G._mergeSplice(splices, t1._current);
+    return splices;
+  },
+  projectListSplices: function(list, records) {
+    var splices, t1, t2, splice, t3, t4;
+    if (records.length <= 1)
+      return records;
+    splices = [];
+    for (t1 = G._createInitialSplices(list, records), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]), t2 = list._observable_list$_list; t1.moveNext$0();) {
+      splice = t1._current;
+      if (J.$eq(splice.get$addedCount(), 1) && splice.get$removed()._collection$_source.length === 1) {
+        t3 = splice.get$removed()._collection$_source;
+        if (0 >= t3.length)
+          return H.ioore(t3, 0);
+        t3 = t3[0];
+        t4 = J.get$index$x(splice);
+        if (t4 >>> 0 !== t4 || t4 >= t2.length)
+          return H.ioore(t2, t4);
+        if (!J.$eq(t3, t2[t4]))
+          splices.push(splice);
+        continue;
+      }
+      t3 = J.getInterceptor$x(splice);
+      C.JSArray_methods.addAll$1(splices, G.calcSplices(list, t3.get$index(splice), J.$add$ns(t3.get$index(splice), splice.get$addedCount()), splice.get$_removed(), 0, splice.get$removed()._collection$_source.length));
+    }
+    return splices;
+  },
+  ListChangeRecord: {
+    "^": "Object;object>,_unmodifiableRemoved,_removed<,_list_diff$_index,_addedCount",
+    get$index: function(_) {
+      return this._list_diff$_index;
+    },
+    get$removed: function() {
+      return this._unmodifiableRemoved;
+    },
+    get$addedCount: function() {
+      return this._addedCount;
+    },
+    indexChanged$1: function(key) {
+      var t1;
+      if (typeof key === "number" && Math.floor(key) === key) {
+        t1 = this._list_diff$_index;
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = key < t1;
+      } else
+        t1 = true;
+      if (t1)
+        return false;
+      if (!J.$eq(this._addedCount, this._unmodifiableRemoved._collection$_source.length))
+        return true;
+      return J.$lt$n(key, J.$add$ns(this._list_diff$_index, this._addedCount));
+    },
+    toString$0: function(_) {
+      var t1, t2;
+      t1 = "#<ListChangeRecord index: " + H.S(this._list_diff$_index) + ", removed: ";
+      t2 = this._unmodifiableRemoved;
+      return t1 + t2.toString$0(t2) + ", addedCount: " + H.S(this._addedCount) + ">";
+    },
+    $isListChangeRecord: true,
+    static: {ListChangeRecord_ListChangeRecord: function(object, index, addedCount, removed) {
+        var t1;
+        if (removed == null)
+          removed = [];
+        if (addedCount == null)
+          addedCount = 0;
+        t1 = new P.UnmodifiableListView(removed);
+        t1.$builtinTypeInfo = [null];
+        return new G.ListChangeRecord(object, t1, removed, index, addedCount);
+      }}
+  }
+}],
+["observe.src.metadata", "package:observe/src/metadata.dart", , K, {
+  "^": "",
+  ObservableProperty: {
+    "^": "Object;"
+  },
+  Reflectable: {
+    "^": "Object;"
+  }
+}],
+["observe.src.observable", "package:observe/src/observable.dart", , F, {
+  "^": "",
+  Observable_dirtyCheck: [function() {
+    return O.dirtyCheckObservables();
+  }, "call$0", "Observable_dirtyCheck$closure", 0, 0, 18],
+  notifyPropertyChangeHelper: function(obj, field, oldValue, newValue) {
+    var t1 = J.getInterceptor$x(obj);
+    if (t1.get$hasObservers(obj) && !J.$eq(oldValue, newValue))
+      t1.notifyChange$1(obj, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(obj, field, oldValue, newValue), [null]));
+    return newValue;
+  },
+  Observable: {
+    "^": "Object;_observable$_changes:observable$Observable$_observable$_changes%,_values:observable$Observable$_values%,_records:observable$Observable$_records%",
+    get$changes: function(receiver) {
+      var t1;
+      if (this.get$_observable$_changes(receiver) == null) {
+        t1 = this.get$_observable$_observed(receiver);
+        this.set$_observable$_changes(receiver, P.StreamController_StreamController$broadcast(this.get$_unobserved(receiver), t1, true, null));
+      }
+      t1 = this.get$_observable$_changes(receiver);
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$hasObservers: function(receiver) {
+      var t1, t2;
+      if (this.get$_observable$_changes(receiver) != null) {
+        t1 = this.get$_observable$_changes(receiver);
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    _observable$_observed$0: [function(receiver) {
+      var t1, values, $name, getter;
+      t1 = $._allObservables;
+      if (t1 == null) {
+        t1 = H.setRuntimeTypeInfo([], [F.Observable]);
+        $._allObservables = t1;
+      }
+      t1.push(receiver);
+      $._allObservablesCount = $._allObservablesCount + 1;
+      values = P.LinkedHashMap_LinkedHashMap(null, null, null, P.Symbol, P.Object);
+      for (t1 = this.get$runtimeType(receiver), t1 = $.get$typeInspector().query$2(0, t1, new A.QueryOptions(true, false, true, C.Type_HqF, false, false, C.List_GGa, null)), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        $name = J.get$name$x(t1._current);
+        getter = $.get$objectAccessor()._getters.$index(0, $name);
+        if (getter == null)
+          H.throwExpression(O.MissingCodeException$("getter \"" + H.S($name) + "\" in " + this.toString$0(receiver)));
+        values.$indexSet(0, $name, getter.call$1(receiver));
+      }
+      this.set$_values(receiver, values);
+    }, "call$0", "get$_observable$_observed", 0, 0, 18],
+    _unobserved$0: [function(receiver) {
+      if (this.get$_values(receiver) != null)
+        this.set$_values(receiver, null);
+    }, "call$0", "get$_unobserved", 0, 0, 18],
+    deliverChanges$0: function(receiver) {
+      var t1, t2;
+      t1 = {};
+      if (this.get$_values(receiver) == null || !this.get$hasObservers(receiver))
+        return false;
+      t1.records_0 = this.get$_records(receiver);
+      this.set$_records(receiver, null);
+      this.get$_values(receiver).forEach$1(0, new F.Observable_deliverChanges_closure(t1, receiver));
+      if (t1.records_0 == null)
+        return false;
+      t2 = this.get$_observable$_changes(receiver);
+      t1 = H.setRuntimeTypeInfo(new P.UnmodifiableListView(t1.records_0), [T.ChangeRecord]);
+      if (t2._state >= 4)
+        H.throwExpression(t2._addEventError$0());
+      t2._sendData$1(t1);
+      return true;
+    },
+    notifyChange$1: function(receiver, record) {
+      if (!this.get$hasObservers(receiver))
+        return;
+      if (this.get$_records(receiver) == null)
+        this.set$_records(receiver, []);
+      this.get$_records(receiver).push(record);
+    },
+    $isObservable: true
+  },
+  Observable_deliverChanges_closure: {
+    "^": "Closure:75;box_0,this_1",
+    call$2: function($name, oldValue) {
+      var t1, newValue, t2, t3, records;
+      t1 = this.this_1;
+      newValue = $.get$objectAccessor().read$2(t1, $name);
+      if (!J.$eq(oldValue, newValue)) {
+        t2 = this.box_0;
+        t3 = t2.records_0;
+        if (t3 == null) {
+          records = [];
+          t2.records_0 = records;
+          t2 = records;
+        } else
+          t2 = t3;
+        t2.push(H.setRuntimeTypeInfo(new T.PropertyChangeRecord(t1, $name, oldValue, newValue), [null]));
+        J.get$_values$x(t1).$indexSet(0, $name, newValue);
+      }
+    },
+    $isFunction: true
+  }
+}],
+["observe.src.observable_box", "package:observe/src/observable_box.dart", , A, {
+  "^": "",
+  ObservableBox: {
+    "^": "ChangeNotifier;",
+    get$value: function(_) {
+      return this._observable_box$_value;
+    },
+    set$value: function(_, newValue) {
+      this._observable_box$_value = F.notifyPropertyChangeHelper(this, C.Symbol_value, this._observable_box$_value, newValue);
+    },
+    toString$0: function(_) {
+      return "#<" + new H.TypeImpl(H.getRuntimeTypeString(this), null).toString$0(0) + " value: " + H.S(this._observable_box$_value) + ">";
+    }
+  }
+}],
+["observe.src.observable_list", "package:observe/src/observable_list.dart", , Q, {
+  "^": "",
+  ObservableList: {
+    "^": "ListBase_ChangeNotifier;_listRecords@,_listChanges,_observable_list$_list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$listChanges: function() {
+      var t1 = this._listChanges;
+      if (t1 == null) {
+        t1 = P.StreamController_StreamController$broadcast(new Q.ObservableList_listChanges_closure(this), null, true, null);
+        this._listChanges = t1;
+      }
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$length: function(_) {
+      return this._observable_list$_list.length;
+    },
+    set$length: function(_, value) {
+      var t1, len, t2, t3, removed;
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      if (len === value)
+        return;
+      this.notifyPropertyChange$3(this, C.Symbol_length, len, value);
+      t2 = len === 0;
+      t3 = value === 0;
+      this.notifyPropertyChange$3(this, C.Symbol_isEmpty, t2, t3);
+      this.notifyPropertyChange$3(this, C.Symbol_isNotEmpty, !t2, !t3);
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2)
+        if (value < len) {
+          if (value < 0 || value > t1.length)
+            H.throwExpression(P.RangeError$range(value, 0, t1.length));
+          if (len < value || len > t1.length)
+            H.throwExpression(P.RangeError$range(len, value, t1.length));
+          t2 = new H.SubListIterable(t1, value, len);
+          t2.$builtinTypeInfo = [null];
+          if (value < 0)
+            H.throwExpression(P.RangeError$value(value));
+          if (len < 0)
+            H.throwExpression(P.RangeError$value(len));
+          if (value > len)
+            H.throwExpression(P.RangeError$range(value, 0, len));
+          t2 = t2.toList$0(0);
+          t3 = new P.UnmodifiableListView(t2);
+          t3.$builtinTypeInfo = [null];
+          this._recordChange$1(new G.ListChangeRecord(this, t3, t2, value, 0));
+        } else {
+          removed = [];
+          t2 = new P.UnmodifiableListView(removed);
+          t2.$builtinTypeInfo = [null];
+          this._recordChange$1(new G.ListChangeRecord(this, t2, removed, len, value - len));
+        }
+      C.JSArray_methods.set$length(t1, value);
+    },
+    $index: function(_, index) {
+      var t1 = this._observable_list$_list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      var t1, oldValue, t2, t3;
+      t1 = this._observable_list$_list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      oldValue = t1[index];
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2) {
+        t2 = [oldValue];
+        t3 = new P.UnmodifiableListView(t2);
+        t3.$builtinTypeInfo = [null];
+        this._recordChange$1(new G.ListChangeRecord(this, t3, t2, index, 1));
+      }
+      if (index >= t1.length)
+        return H.ioore(t1, index);
+      t1[index] = value;
+    },
+    get$isEmpty: function(_) {
+      return P.ListMixin.prototype.get$isEmpty.call(this, this);
+    },
+    get$isNotEmpty: function(_) {
+      return P.ListMixin.prototype.get$isNotEmpty.call(this, this);
+    },
+    setAll$2: function(_, index, iterable) {
+      var t1, len, t2;
+      t1 = J.getInterceptor(iterable);
+      if (!t1.$isList && true)
+        iterable = t1.toList$0(iterable);
+      len = J.get$length$asx(iterable);
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (t1 && len > 0) {
+        t1 = this._observable_list$_list;
+        H.IterableMixinWorkaround__rangeCheck(t1, index, len);
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, index, len, H.SubListIterable$(t1, index, len, null).toList$0(0)));
+      }
+      H.IterableMixinWorkaround_setAllList(this._observable_list$_list, index, iterable);
+    },
+    add$1: function(_, value) {
+      var t1, len, t2, t3;
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      this._notifyChangeLength$2(len, len + 1);
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, len, 1, null));
+      C.JSArray_methods.add$1(t1, value);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, len, added, t2;
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      C.JSArray_methods.addAll$1(t1, iterable);
+      this._notifyChangeLength$2(len, t1.length);
+      added = t1.length - len;
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (t1 && added > 0)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, len, added, null));
+    },
+    removeRange$2: function(_, start, end) {
+      var t1, t2, rangeLength, t3, len, t4, t5;
+      t1 = start >= 0;
+      if (!t1 || start > this._observable_list$_list.length)
+        H.throwExpression(P.RangeError$range(start, 0, this.get$length(this)));
+      t2 = end >= start;
+      if (!t2 || end > this._observable_list$_list.length)
+        H.throwExpression(P.RangeError$range(end, start, this.get$length(this)));
+      rangeLength = end - start;
+      t3 = this._observable_list$_list;
+      len = t3.length;
+      t4 = len - rangeLength;
+      this.notifyPropertyChange$3(this, C.Symbol_length, len, t4);
+      t5 = len === 0;
+      t4 = t4 === 0;
+      this.notifyPropertyChange$3(this, C.Symbol_isEmpty, t5, t4);
+      this.notifyPropertyChange$3(this, C.Symbol_isNotEmpty, !t5, !t4);
+      t4 = this._listChanges;
+      if (t4 != null) {
+        t5 = t4._async$_next;
+        t4 = t5 == null ? t4 != null : t5 !== t4;
+      } else
+        t4 = false;
+      if (t4 && rangeLength > 0) {
+        if (!t1 || start > t3.length)
+          H.throwExpression(P.RangeError$range(start, 0, t3.length));
+        if (!t2 || end > t3.length)
+          H.throwExpression(P.RangeError$range(end, start, t3.length));
+        t1 = new H.SubListIterable(t3, start, end);
+        t1.$builtinTypeInfo = [null];
+        if (start < 0)
+          H.throwExpression(P.RangeError$value(start));
+        if (end < 0)
+          H.throwExpression(P.RangeError$value(end));
+        if (start > end)
+          H.throwExpression(P.RangeError$range(start, 0, end));
+        t1 = t1.toList$0(0);
+        t2 = new P.UnmodifiableListView(t1);
+        t2.$builtinTypeInfo = [null];
+        this._recordChange$1(new G.ListChangeRecord(this, t2, t1, start, 0));
+      }
+      C.JSArray_methods.removeRange$2(t3, start, end);
+    },
+    insertAll$2: function(_, index, iterable) {
+      var t1, insertionLength, len, t2;
+      if (index < 0 || index > this._observable_list$_list.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = J.getInterceptor(iterable);
+      if (!t1.$isList && true)
+        iterable = t1.toList$0(iterable);
+      insertionLength = J.get$length$asx(iterable);
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      C.JSArray_methods.set$length(t1, len + insertionLength);
+      t2 = t1.length;
+      H.IterableMixinWorkaround_setRangeList(t1, index + insertionLength, t2, this, index);
+      H.IterableMixinWorkaround_setAllList(t1, index, iterable);
+      this._notifyChangeLength$2(len, t1.length);
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (t1 && insertionLength > 0)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, index, insertionLength, null));
+    },
+    insert$2: function(_, index, element) {
+      var t1, t2, t3;
+      if (index > this._observable_list$_list.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = this._observable_list$_list;
+      t2 = t1.length;
+      if (index === t2) {
+        this.add$1(0, element);
+        return;
+      }
+      C.JSArray_methods.set$length(t1, t2 + 1);
+      t2 = t1.length;
+      H.IterableMixinWorkaround_setRangeList(t1, index + 1, t2, this, index);
+      t2 = t1.length;
+      this._notifyChangeLength$2(t2 - 1, t2);
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, index, 1, null));
+      if (index >= t1.length)
+        return H.ioore(t1, index);
+      t1[index] = element;
+    },
+    _recordChange$1: function(record) {
+      var t1, t2;
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (!t1)
+        return;
+      if (this._listRecords == null) {
+        this._listRecords = [];
+        P.scheduleMicrotask(this.get$deliverListChanges());
+      }
+      this._listRecords.push(record);
+    },
+    _notifyChangeLength$2: function(oldValue, newValue) {
+      var t1, t2;
+      this.notifyPropertyChange$3(this, C.Symbol_length, oldValue, newValue);
+      t1 = oldValue === 0;
+      t2 = newValue === 0;
+      this.notifyPropertyChange$3(this, C.Symbol_isEmpty, t1, t2);
+      this.notifyPropertyChange$3(this, C.Symbol_isNotEmpty, !t1, !t2);
+    },
+    deliverListChanges$0: [function() {
+      var t1, records, t2;
+      t1 = this._listRecords;
+      if (t1 == null)
+        return false;
+      records = G.projectListSplices(this, t1);
+      this._listRecords = null;
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t2 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t2 = false;
+      if (t2 && records.length !== 0) {
+        t2 = H.setRuntimeTypeInfo(new P.UnmodifiableListView(records), [G.ListChangeRecord]);
+        if (t1._state >= 4)
+          H.throwExpression(t1._addEventError$0());
+        t1._sendData$1(t2);
+        return true;
+      }
+      return false;
+    }, "call$0", "get$deliverListChanges", 0, 0, 111],
+    $isObservableList: true,
+    static: {ObservableList$: function($length, $E) {
+        var t1 = H.setRuntimeTypeInfo([], [$E]);
+        return H.setRuntimeTypeInfo(new Q.ObservableList(null, null, t1, null, null), [$E]);
+      }, ObservableList_applyChangeRecords: function(previous, current, changeRecords) {
+        var t1, t2, change, t3, addEnd, removeEnd, addedItems, t4, t5, removeLength, insertLength, delta, insertEnd, newEnd, newLength;
+        if (previous === current)
+          throw H.wrapException(P.ArgumentError$("can't use same list for previous and current"));
+        for (t1 = J.get$iterator$ax(changeRecords), t2 = J.getInterceptor$ax(current); t1.moveNext$0();) {
+          change = t1.get$current();
+          t3 = J.getInterceptor$x(change);
+          addEnd = J.$add$ns(t3.get$index(change), change.get$addedCount());
+          removeEnd = J.$add$ns(t3.get$index(change), change.get$removed()._collection$_source.length);
+          addedItems = t2.getRange$2(current, t3.get$index(change), addEnd);
+          t3 = t3.get$index(change);
+          t4 = J.getInterceptor$n(t3);
+          if (t4.$lt(t3, 0) || t4.$gt(t3, previous.length))
+            H.throwExpression(P.RangeError$range(t3, 0, previous.length));
+          t5 = J.getInterceptor$n(removeEnd);
+          if (t5.$lt(removeEnd, t3) || t5.$gt(removeEnd, previous.length))
+            H.throwExpression(P.RangeError$range(removeEnd, t3, previous.length));
+          removeLength = t5.$sub(removeEnd, t3);
+          insertLength = addedItems.get$length(addedItems);
+          t5 = J.getInterceptor$n(removeLength);
+          if (t5.$ge(removeLength, insertLength)) {
+            delta = t5.$sub(removeLength, insertLength);
+            insertEnd = t4.$add(t3, insertLength);
+            t4 = previous.length;
+            if (typeof delta !== "number")
+              return H.iae(delta);
+            newEnd = t4 - delta;
+            H.IterableMixinWorkaround_setRangeList(previous, t3, insertEnd, addedItems, 0);
+            if (delta !== 0) {
+              H.IterableMixinWorkaround_setRangeList(previous, insertEnd, newEnd, previous, removeEnd);
+              C.JSArray_methods.set$length(previous, newEnd);
+            }
+          } else {
+            delta = J.$sub$n(insertLength, removeLength);
+            t5 = previous.length;
+            if (typeof delta !== "number")
+              return H.iae(delta);
+            newLength = t5 + delta;
+            insertEnd = t4.$add(t3, insertLength);
+            C.JSArray_methods.set$length(previous, newLength);
+            H.IterableMixinWorkaround_setRangeList(previous, insertEnd, newLength, previous, removeEnd);
+            H.IterableMixinWorkaround_setRangeList(previous, t3, insertEnd, addedItems, 0);
+          }
+        }
+      }}
+  },
+  ListBase_ChangeNotifier: {
+    "^": "ListBase+ChangeNotifier;",
+    $isObservable: true
+  },
+  ObservableList_listChanges_closure: {
+    "^": "Closure:69;this_0",
+    call$0: function() {
+      this.this_0._listChanges = null;
+    },
+    $isFunction: true
+  }
+}],
+["observe.src.observable_map", "package:observe/src/observable_map.dart", , V, {
+  "^": "",
+  MapChangeRecord: {
+    "^": "ChangeRecord;key>,oldValue,newValue,isInsert,isRemove",
+    toString$0: function(_) {
+      var kind;
+      if (this.isInsert)
+        kind = "insert";
+      else
+        kind = this.isRemove ? "remove" : "set";
+      return "#<MapChangeRecord " + kind + " " + H.S(this.key) + " from: " + H.S(this.oldValue) + " to: " + H.S(this.newValue) + ">";
+    },
+    $isMapChangeRecord: true
+  },
+  ObservableMap: {
+    "^": "ChangeNotifier;_observable_map$_map,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$keys: function() {
+      return this._observable_map$_map.get$keys();
+    },
+    get$values: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$values(t1);
+    },
+    get$length: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$length(t1);
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$length(t1) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$length(t1) !== 0;
+    },
+    $index: function(_, key) {
+      return this._observable_map$_map.$index(0, key);
+    },
+    $indexSet: function(_, key, value) {
+      var t1, t2, len, oldValue;
+      t1 = this.change_notifier$ChangeNotifier$_changes;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (!t1) {
+        this._observable_map$_map.$indexSet(0, key, value);
+        return;
+      }
+      t1 = this._observable_map$_map;
+      len = t1.get$length(t1);
+      oldValue = t1.$index(0, key);
+      t1.$indexSet(0, key, value);
+      if (len !== t1.get$length(t1)) {
+        F.notifyPropertyChangeHelper(this, C.Symbol_length, len, t1.get$length(t1));
+        this.notifyChange$1(this, H.setRuntimeTypeInfo(new V.MapChangeRecord(key, null, value, true, false), [null, null]));
+        this._notifyKeysValuesChanged$0();
+      } else if (!J.$eq(oldValue, value)) {
+        this.notifyChange$1(this, H.setRuntimeTypeInfo(new V.MapChangeRecord(key, oldValue, value, false, false), [null, null]));
+        this.notifyChange$1(this, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(this, C.Symbol_values, null, null), [null]));
+      }
+    },
+    addAll$1: function(_, other) {
+      J.forEach$1$ax(other, new V.ObservableMap_addAll_closure(this));
+    },
+    clear$0: function(_) {
+      var t1, len, t2, t3;
+      t1 = this._observable_map$_map;
+      len = t1.get$length(t1);
+      t2 = this.change_notifier$ChangeNotifier$_changes;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2 && len > 0) {
+        t1.forEach$1(0, new V.ObservableMap_clear_closure(this));
+        F.notifyPropertyChangeHelper(this, C.Symbol_length, len, 0);
+        this._notifyKeysValuesChanged$0();
+      }
+      t1.clear$0(0);
+    },
+    forEach$1: function(_, f) {
+      return this._observable_map$_map.forEach$1(0, f);
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    _notifyKeysValuesChanged$0: function() {
+      this.notifyChange$1(this, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(this, C.Symbol_keys, null, null), [null]));
+      this.notifyChange$1(this, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(this, C.Symbol_values, null, null), [null]));
+    },
+    $isObservableMap: true,
+    $isMap: true,
+    static: {ObservableMap_ObservableMap$createFromType: function(other, $K, $V) {
+        var result;
+        if (!!other.$isSplayTreeMap)
+          result = H.setRuntimeTypeInfo(new V.ObservableMap(P.SplayTreeMap$(null, null, $K, $V), null, null), [$K, $V]);
+        else
+          result = !!other.$isLinkedHashMap ? H.setRuntimeTypeInfo(new V.ObservableMap(P.LinkedHashMap_LinkedHashMap(null, null, null, $K, $V), null, null), [$K, $V]) : H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, $K, $V), null, null), [$K, $V]);
+        return result;
+      }}
+  },
+  ObservableMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: [function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    }, "call$2", null, 4, 0, null, 76, 21, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V2", args: [K, V]};
+      }, this.this_0, "ObservableMap");
+    }
+  },
+  ObservableMap_clear_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(key, value) {
+      var t1 = this.this_0;
+      t1.notifyChange$1(t1, H.setRuntimeTypeInfo(new V.MapChangeRecord(key, value, null, false, true), [null, null]));
+    },
+    $isFunction: true
+  }
+}],
+["observe.src.observer_transform", "package:observe/src/observer_transform.dart", , Y, {
+  "^": "",
+  ObserverTransform: {
+    "^": "Bindable;_bindable,_getTransformer,_setTransformer,_observer_transform$_notifyCallback,_observer_transform$_value",
+    _getTransformer$1: function(arg0) {
+      return this._getTransformer.call$1(arg0);
+    },
+    _observer_transform$_notifyCallback$1: function(arg0) {
+      return this._observer_transform$_notifyCallback.call$1(arg0);
+    },
+    open$1: function(_, callback) {
+      var t1;
+      this._observer_transform$_notifyCallback = callback;
+      t1 = this._getTransformer$1(J.open$1$x(this._bindable, this.get$_observedCallback()));
+      this._observer_transform$_value = t1;
+      return t1;
+    },
+    _observedCallback$1: [function(newValue) {
+      var value = this._getTransformer$1(newValue);
+      if (J.$eq(value, this._observer_transform$_value))
+        return;
+      this._observer_transform$_value = value;
+      return this._observer_transform$_notifyCallback$1(value);
+    }, "call$1", "get$_observedCallback", 2, 0, 13, 58],
+    close$0: function(_) {
+      var t1 = this._bindable;
+      if (t1 != null)
+        J.close$0$x(t1);
+      this._bindable = null;
+      this._getTransformer = null;
+      this._setTransformer = null;
+      this._observer_transform$_notifyCallback = null;
+      this._observer_transform$_value = null;
+    },
+    get$value: function(_) {
+      var t1 = this._getTransformer$1(J.get$value$x(this._bindable));
+      this._observer_transform$_value = t1;
+      return t1;
+    },
+    set$value: function(_, newValue) {
+      J.set$value$x(this._bindable, newValue);
+    }
+  }
+}],
+["observe.src.path_observer", "package:observe/src/path_observer.dart", , L, {
+  "^": "",
+  _getObjectProperty: function(object, property) {
+    var t1, t2, getter, exception, decl;
+    if (object == null)
+      return;
+    t1 = property;
+    if (typeof t1 === "number" && Math.floor(t1) === t1) {
+      if (!!J.getInterceptor(object).$isList && J.$ge$n(property, 0) && J.$lt$n(property, J.get$length$asx(object)))
+        return J.$index$asx(object, property);
+    } else if (!!J.getInterceptor(property).$isSymbol) {
+      t1 = object;
+      t2 = H.checkSubtype(t1, "$isIndexable", [P.String, null], "$asIndexable");
+      if (!t2) {
+        t1 = object;
+        t2 = H.checkSubtype(t1, "$isMap", [P.String, null], "$asMap");
+        t1 = t2 && !C.JSArray_methods.contains$1(C.List_8QI, property);
+      } else
+        t1 = true;
+      if (t1)
+        return J.$index$asx(object, $.get$symbolConverter()._names.$index(0, property));
+      try {
+        t1 = object;
+        t2 = property;
+        getter = $.get$objectAccessor()._getters.$index(0, t2);
+        if (getter == null)
+          H.throwExpression(O.MissingCodeException$("getter \"" + H.S(t2) + "\" in " + H.S(t1)));
+        t1 = getter.call$1(t1);
+        return t1;
+      } catch (exception) {
+        if (!!J.getInterceptor(H.unwrapException(exception)).$isNoSuchMethodError) {
+          t1 = J.get$runtimeType$(object);
+          decl = $.get$typeInspector()._findDeclaration$2(t1, C.Symbol_noSuchMethod);
+          if (!(decl != null && decl.kind === C.DeclarationKind_2 && !decl.isStatic))
+            throw exception;
+        } else
+          throw exception;
+      }
+
+    }
+    t1 = $.get$_logger0();
+    if (t1.isLoggable$1(C.Level_FINER_400))
+      t1.finer$1("can't get " + H.S(property) + " in " + H.S(object));
+    return;
+  },
+  _setObjectProperty: function(object, property, value) {
+    var t1, t2, exception;
+    if (object == null)
+      return false;
+    t1 = property;
+    if (typeof t1 === "number" && Math.floor(t1) === t1) {
+      if (!!J.getInterceptor(object).$isList && J.$ge$n(property, 0) && J.$lt$n(property, J.get$length$asx(object))) {
+        J.$indexSet$ax(object, property, value);
+        return true;
+      }
+    } else if (!!J.getInterceptor(property).$isSymbol) {
+      t1 = object;
+      t2 = H.checkSubtype(t1, "$isIndexable", [P.String, null], "$asIndexable");
+      if (!t2) {
+        t1 = object;
+        t2 = H.checkSubtype(t1, "$isMap", [P.String, null], "$asMap");
+        t1 = t2 && !C.JSArray_methods.contains$1(C.List_8QI, property);
+      } else
+        t1 = true;
+      if (t1) {
+        J.$indexSet$ax(object, $.get$symbolConverter()._names.$index(0, property), value);
+        return true;
+      }
+      try {
+        $.get$objectAccessor().write$3(object, property, value);
+        return true;
+      } catch (exception) {
+        if (!!J.getInterceptor(H.unwrapException(exception)).$isNoSuchMethodError) {
+          t1 = J.get$runtimeType$(object);
+          if (!$.get$typeInspector().hasInstanceMethod$2(t1, C.Symbol_noSuchMethod))
+            throw exception;
+        } else
+          throw exception;
+      }
+
+    }
+    t1 = $.get$_logger0();
+    if (t1.isLoggable$1(C.Level_FINER_400))
+      t1.finer$1("can't set " + H.S(property) + " in " + H.S(object));
+    return false;
+  },
+  _isPathValid: function(s) {
+    s = J.trim$0$s(s);
+    if (s === "")
+      return true;
+    if (0 >= s.length)
+      return H.ioore(s, 0);
+    if (s[0] === ".")
+      return false;
+    return $.get$_pathRegExp().hasMatch$1(s);
+  },
+  PathObserver: {
+    "^": "_Observer;_path_observer$_path,_object,_directObserver,_birthId,_notifyCallback,_notifyArgumentCount,_path_observer$_value",
+    get$_path_observer$_isClosed: function() {
+      return this._path_observer$_path == null;
+    },
+    set$value: function(_, newValue) {
+      var t1 = this._path_observer$_path;
+      if (t1 != null)
+        t1.setValueFrom$2(this._object, newValue);
+    },
+    get$_reportArgumentCount: function() {
+      return 2;
+    },
+    open$1: function(_, callback) {
+      return L._Observer.prototype.open$1.call(this, this, callback);
+    },
+    _connect$0: function() {
+      this._directObserver = L._ObservedSet__ObservedSet(this, this._object);
+      this._check$1$skipChanges(true);
+    },
+    _disconnect$0: function() {
+      this._path_observer$_value = null;
+      this._path_observer$_path = null;
+      this._object = null;
+    },
+    _iterateObjects$1: function(observe) {
+      this._path_observer$_path._iterateObjects$2(this._object, observe);
+    },
+    _check$1$skipChanges: function(skipChanges) {
+      var oldValue, t1;
+      oldValue = this._path_observer$_value;
+      t1 = this._path_observer$_path.getValueFrom$1(this._object);
+      this._path_observer$_value = t1;
+      if (skipChanges || J.$eq(t1, oldValue))
+        return false;
+      this._report$2(this._path_observer$_value, oldValue);
+      return true;
+    },
+    _check$0: function() {
+      return this._check$1$skipChanges(false);
+    },
+    $isBindable: true
+  },
+  PropertyPath: {
+    "^": "Object;_segments",
+    get$length: function(_) {
+      return this._segments.length;
+    },
+    get$isEmpty: function(_) {
+      return this._segments.length === 0;
+    },
+    get$isValid: function() {
+      return true;
+    },
+    toString$0: function(_) {
+      if (!this.get$isValid())
+        return "<invalid path>";
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(this._segments, new L.PropertyPath_toString_closure()), [null, null]).join$1(0, ".");
+    },
+    $eq: function(_, other) {
+      var t1, len, t2, i, t3;
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!J.getInterceptor(other).$isPropertyPath)
+        return false;
+      if (this.get$isValid() !== other.get$isValid())
+        return false;
+      t1 = this._segments;
+      len = t1.length;
+      t2 = other._segments;
+      if (len !== t2.length)
+        return false;
+      for (i = 0; i < len; ++i) {
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t3 = t1[i];
+        if (i >= t2.length)
+          return H.ioore(t2, i);
+        if (!J.$eq(t3, t2[i]))
+          return false;
+      }
+      return true;
+    },
+    get$hashCode: function(_) {
+      var t1, len, hash, i, t2;
+      for (t1 = this._segments, len = t1.length, hash = 0, i = 0; i < len; ++i) {
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t2 = J.get$hashCode$(t1[i]);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        hash = 536870911 & hash + t2;
+        hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+        hash ^= hash >>> 6;
+      }
+      hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+      hash ^= hash >>> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    getValueFrom$1: function(obj) {
+      var t1, segment;
+      if (!this.get$isValid())
+        return;
+      for (t1 = this._segments, t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        segment = t1._current;
+        if (obj == null)
+          return;
+        obj = L._getObjectProperty(obj, segment);
+      }
+      return obj;
+    },
+    setValueFrom$2: function(obj, value) {
+      var t1, end, i;
+      t1 = this._segments;
+      end = t1.length - 1;
+      if (end < 0)
+        return false;
+      for (i = 0; i < end; ++i) {
+        if (obj == null)
+          return false;
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        obj = L._getObjectProperty(obj, t1[i]);
+      }
+      if (end >= t1.length)
+        return H.ioore(t1, end);
+      return L._setObjectProperty(obj, t1[end], value);
+    },
+    _iterateObjects$2: function(obj, observe) {
+      var t1, last, i, i0;
+      if (!this.get$isValid() || this._segments.length === 0)
+        return;
+      t1 = this._segments;
+      last = t1.length - 1;
+      for (i = 0; obj != null; i = i0) {
+        observe.call$1(obj);
+        if (i >= last)
+          break;
+        i0 = i + 1;
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        obj = L._getObjectProperty(obj, t1[i]);
+      }
+    },
+    $isPropertyPath: true,
+    static: {PropertyPath_PropertyPath: function(path) {
+        var copy, t1, segment, pathObj, segments, t2, index, it;
+        if (!!J.getInterceptor(path).$isList) {
+          copy = P.List_List$from(path, false, null);
+          t1 = new H.ListIterator(copy, copy.length, 0, null);
+          t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(copy, 0)];
+          for (; t1.moveNext$0();) {
+            segment = t1._current;
+            if ((typeof segment !== "number" || Math.floor(segment) !== segment) && !J.getInterceptor(segment).$isSymbol)
+              throw H.wrapException(P.ArgumentError$("List must contain only ints and Symbols"));
+          }
+          return new L.PropertyPath(copy);
+        }
+        if (path == null)
+          path = "";
+        pathObj = $.get$_pathCache().$index(0, path);
+        if (pathObj != null)
+          return pathObj;
+        if (!L._isPathValid(path))
+          return $.get$_InvalidPropertyPath__instance();
+        segments = [];
+        t1 = J.trim$0$s(path).split(".");
+        t2 = new H.ListIterator(t1, t1.length, 0, null);
+        t2.$builtinTypeInfo = [H.getTypeArgumentByIndex(t1, 0)];
+        for (; t2.moveNext$0();) {
+          segment = t2._current;
+          if (J.$eq(segment, ""))
+            continue;
+          index = H.Primitives_parseInt(segment, 10, new L.PropertyPath_PropertyPath_closure());
+          segments.push(index != null ? index : $.get$symbolConverter()._symbols.$index(0, segment));
+        }
+        pathObj = new L.PropertyPath(C.JSArray_methods.toList$1$growable(segments, false));
+        t1 = $.get$_pathCache();
+        if (t1._collection$_length >= 100) {
+          t1.toString;
+          t2 = new P.LinkedHashMapKeyIterable(t1);
+          t2.$builtinTypeInfo = [H.getTypeArgumentByIndex(t1, 0)];
+          it = t2.get$iterator(t2);
+          if (!it.moveNext$0())
+            H.throwExpression(H.IterableElementError_noElement());
+          t1.remove$1(0, it.get$current());
+        }
+        t1.$indexSet(0, path, pathObj);
+        return pathObj;
+      }}
+  },
+  PropertyPath_PropertyPath_closure: {
+    "^": "Closure:13;",
+    call$1: function(_) {
+      return;
+    },
+    $isFunction: true
+  },
+  PropertyPath_toString_closure: {
+    "^": "Closure:13;",
+    call$1: [function(s) {
+      return !!J.getInterceptor(s).$isSymbol ? $.get$symbolConverter()._names.$index(0, s) : s;
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  _InvalidPropertyPath: {
+    "^": "PropertyPath;_segments",
+    get$isValid: function() {
+      return false;
+    },
+    static: {"^": "_InvalidPropertyPath__instance"}
+  },
+  closure7: {
+    "^": "Closure:69;",
+    call$0: function() {
+      return new H.JSSyntaxRegExp("^(?:(?:[$_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.JSSyntaxRegExp_makeNative("^(?:(?:[$_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]+)))*$", false, true, false), null, null);
+    },
+    $isFunction: true
+  },
+  CompoundObserver: {
+    "^": "_Observer;_directObserver,_observed,_birthId,_notifyCallback,_notifyArgumentCount,_path_observer$_value",
+    get$_path_observer$_isClosed: function() {
+      return this._observed == null;
+    },
+    get$_reportArgumentCount: function() {
+      return 3;
+    },
+    open$1: function(_, callback) {
+      return L._Observer.prototype.open$1.call(this, this, callback);
+    },
+    _connect$0: function() {
+      var t1, t2, i, object;
+      this._check$1$skipChanges(true);
+      for (t1 = this._observed, t2 = t1.length, i = 0; i < t2; i += 2) {
+        object = t1[i];
+        if (object !== C.C__ObserverSentinel) {
+          t1 = $._ObservedSet__lastSet;
+          if (t1 != null) {
+            t2 = t1._rootObject;
+            t2 = t2 == null ? object != null : t2 !== object;
+          } else
+            t2 = true;
+          if (t2) {
+            t1 = new L._ObservedSet(object, P.SplayTreeMap$(null, null, null, null), null, null, false);
+            $._ObservedSet__lastSet = t1;
+          }
+          t1._path_observer$_observers.$indexSet(0, this._birthId, this);
+          this._iterateObjects$1(t1.get$observe(t1));
+          this._directObserver = null;
+          break;
+        }
+      }
+    },
+    _disconnect$0: function() {
+      var i, t1, t2, t3;
+      this._path_observer$_value = null;
+      for (i = 0; t1 = this._observed, t2 = t1.length, i < t2; i += 2)
+        if (t1[i] === C.C__ObserverSentinel) {
+          t3 = i + 1;
+          if (t3 >= t2)
+            return H.ioore(t1, t3);
+          J.close$0$x(t1[t3]);
+        }
+      this._observed = null;
+    },
+    addPath$2: function(object, path) {
+      var t1;
+      if (this._notifyCallback != null || this._observed == null)
+        throw H.wrapException(P.StateError$("Cannot add paths once started."));
+      if (!J.getInterceptor(path).$isPropertyPath)
+        path = L.PropertyPath_PropertyPath(path);
+      t1 = this._observed;
+      t1.push(object);
+      t1.push(path);
+    },
+    addPath$1: function(object) {
+      return this.addPath$2(object, null);
+    },
+    _iterateObjects$1: function(observe) {
+      var i, t1, t2, object, t3;
+      for (i = 0; t1 = this._observed, t2 = t1.length, i < t2; i += 2) {
+        object = t1[i];
+        if (object !== C.C__ObserverSentinel) {
+          t3 = i + 1;
+          if (t3 >= t2)
+            return H.ioore(t1, t3);
+          H.interceptedTypeCast(t1[t3], "$isPropertyPath")._iterateObjects$2(object, observe);
+        }
+      }
+    },
+    _check$1$skipChanges: function(skipChanges) {
+      var changed, oldValues, i, t1, t2, t3, pathOrObserver, object, value;
+      J.set$length$asx(this._path_observer$_value, C.JSInt_methods._tdivFast$1(this._observed.length, 2));
+      for (changed = false, oldValues = null, i = 0; t1 = this._observed, t2 = t1.length, i < t2; i += 2) {
+        t3 = i + 1;
+        if (t3 >= t2)
+          return H.ioore(t1, t3);
+        pathOrObserver = t1[t3];
+        object = t1[i];
+        if (object === C.C__ObserverSentinel) {
+          H.interceptedTypeCast(pathOrObserver, "$isBindable");
+          value = pathOrObserver.get$value(pathOrObserver);
+        } else
+          value = H.interceptedTypeCast(pathOrObserver, "$isPropertyPath").getValueFrom$1(object);
+        if (skipChanges) {
+          J.$indexSet$ax(this._path_observer$_value, C.JSInt_methods._tdivFast$1(i, 2), value);
+          continue;
+        }
+        t1 = this._path_observer$_value;
+        t2 = C.JSInt_methods._tdivFast$1(i, 2);
+        if (J.$eq(value, J.$index$asx(t1, t2)))
+          continue;
+        t1 = this._notifyArgumentCount;
+        if (typeof t1 !== "number")
+          return t1.$ge();
+        if (t1 >= 2) {
+          if (oldValues == null)
+            oldValues = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+          oldValues.$indexSet(0, t2, J.$index$asx(this._path_observer$_value, t2));
+        }
+        J.$indexSet$ax(this._path_observer$_value, t2, value);
+        changed = true;
+      }
+      if (!changed)
+        return false;
+      this._report$3(this._path_observer$_value, oldValues, t1);
+      return true;
+    },
+    _check$0: function() {
+      return this._check$1$skipChanges(false);
+    },
+    $isBindable: true
+  },
+  _ObserverSentinel: {
+    "^": "Object;"
+  },
+  _Observer: {
+    "^": "Bindable;_birthId<",
+    _notifyCallback$0: function() {
+      return this._notifyCallback.call$0();
+    },
+    _notifyCallback$1: function(arg0) {
+      return this._notifyCallback.call$1(arg0);
+    },
+    _notifyCallback$2: function(arg0, arg1) {
+      return this._notifyCallback.call$2(arg0, arg1);
+    },
+    _notifyCallback$3: function(arg0, arg1, arg2) {
+      return this._notifyCallback.call$3(arg0, arg1, arg2);
+    },
+    get$_isOpen: function() {
+      return this._notifyCallback != null;
+    },
+    open$1: function(_, callback) {
+      if (this._notifyCallback != null || this.get$_path_observer$_isClosed())
+        throw H.wrapException(P.StateError$("Observer has already been opened."));
+      if (X.minArgs(callback) > this.get$_reportArgumentCount())
+        throw H.wrapException(P.ArgumentError$("callback should take " + this.get$_reportArgumentCount() + " or fewer arguments"));
+      this._notifyCallback = callback;
+      this._notifyArgumentCount = P.min(this.get$_reportArgumentCount(), X.maxArgs(callback));
+      this._connect$0();
+      return this._path_observer$_value;
+    },
+    get$value: function(_) {
+      this._check$1$skipChanges(true);
+      return this._path_observer$_value;
+    },
+    close$0: function(_) {
+      if (this._notifyCallback == null)
+        return;
+      this._disconnect$0();
+      this._path_observer$_value = null;
+      this._notifyCallback = null;
+    },
+    _deliver$1: [function(_) {
+      if (this._notifyCallback != null)
+        this._dirtyCheck$0();
+    }, "call$1", "get$_deliver", 2, 0, 20, 14],
+    _dirtyCheck$0: function() {
+      var cycles = 0;
+      while (true) {
+        if (!(cycles < 1000 && this._check$0()))
+          break;
+        ++cycles;
+      }
+      return cycles > 0;
+    },
+    _report$3: function(newValue, oldValue, extraArg) {
+      var e, s, exception, t1;
+      try {
+        switch (this._notifyArgumentCount) {
+          case 0:
+            this._notifyCallback$0();
+            break;
+          case 1:
+            this._notifyCallback$1(newValue);
+            break;
+          case 2:
+            this._notifyCallback$2(newValue, oldValue);
+            break;
+          case 3:
+            this._notifyCallback$3(newValue, oldValue, extraArg);
+            break;
+        }
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2(e, s);
+      }
+
+    },
+    _report$2: function(newValue, oldValue) {
+      return this._report$3(newValue, oldValue, null);
+    }
+  },
+  _ObservedSet: {
+    "^": "Object;_rootObject,_path_observer$_observers,_objects,_toRemove,_resetNeeded",
+    open$1: function(_, obs) {
+      this._path_observer$_observers.$indexSet(0, obs.get$_birthId(), obs);
+      obs._iterateObjects$1(this.get$observe(this));
+    },
+    observe$1: [function(_, obj) {
+      var t1 = J.getInterceptor(obj);
+      if (!!t1.$isObservableList)
+        this._observeStream$1(obj.get$listChanges());
+      if (!!t1.$isObservable)
+        this._observeStream$1(t1.get$changes(obj));
+    }, "call$1", "get$observe", 2, 0, 159, 81],
+    _observeStream$1: function(stream) {
+      var t1, sub;
+      if (this._objects == null)
+        this._objects = P.HashMap_HashMap(null, null, null, null, null);
+      t1 = this._toRemove;
+      sub = t1 != null ? t1.remove$1(0, stream) : null;
+      if (sub != null)
+        this._objects.$indexSet(0, stream, sub);
+      else if (!this._objects.containsKey$1(stream))
+        this._objects.$indexSet(0, stream, stream.listen$1(this.get$_path_observer$_callback()));
+    },
+    reset$0: [function(_) {
+      var objs, t1, t2, t3, observer;
+      if (!this._resetNeeded)
+        return;
+      objs = this._toRemove;
+      if (objs == null)
+        objs = P.HashMap_HashMap(null, null, null, null, null);
+      this._toRemove = this._objects;
+      this._objects = objs;
+      for (t1 = this._path_observer$_observers, t1 = H.setRuntimeTypeInfo(new P._SplayTreeValueIterable(t1), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]), t2 = t1._map, t3 = H.getTypeArgumentByIndex(t1, 1), t1 = H.setRuntimeTypeInfo(new P._SplayTreeValueIterator(t2, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), t2._modificationCount, t2._splayCount, null), [H.getTypeArgumentByIndex(t1, 0), t3]), t1._SplayTreeIterator$1(t2, t3); t1.moveNext$0();) {
+        observer = t1.get$current();
+        if (observer.get$_isOpen())
+          observer._iterateObjects$1(this.get$observe(this));
+      }
+      for (t1 = this._toRemove, t1 = t1.get$values(t1), t1 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]); t1.moveNext$0();)
+        t1._current.cancel$0();
+      this._toRemove = null;
+    }, "call$0", "get$reset", 0, 0, 18],
+    _path_observer$_callback$1: [function(records) {
+      var t1, observer;
+      for (t1 = this._path_observer$_observers, t1 = H.setRuntimeTypeInfo(new P._SplayTreeValueIterable(t1), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]), t1 = P.List_List$from(t1, false, H.getRuntimeTypeArgument(t1, "IterableBase", 0)), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        observer = t1._current;
+        if (observer.get$_isOpen())
+          observer._check$0();
+      }
+      this._resetNeeded = true;
+      P.scheduleMicrotask(this.get$reset(this));
+    }, "call$1", "get$_path_observer$_callback", 2, 0, 20, 160],
+    static: {"^": "_ObservedSet__lastSet", _ObservedSet__ObservedSet: function(observer, rootObj) {
+        var t1, t2;
+        t1 = $._ObservedSet__lastSet;
+        if (t1 != null) {
+          t2 = t1._rootObject;
+          t2 = t2 == null ? rootObj != null : t2 !== rootObj;
+        } else
+          t2 = true;
+        if (t2) {
+          t1 = new L._ObservedSet(rootObj, P.SplayTreeMap$(null, null, null, null), null, null, false);
+          $._ObservedSet__lastSet = t1;
+        }
+        t1._path_observer$_observers.$indexSet(0, observer._birthId, observer);
+        observer._iterateObjects$1(t1.get$observe(t1));
+      }}
+  }
+}],
+["observe.src.to_observable", "package:observe/src/to_observable.dart", , R, {
+  "^": "",
+  _toObservableDeep: [function(value) {
+    var t1, result, t2;
+    t1 = J.getInterceptor(value);
+    if (!!t1.$isObservable)
+      return value;
+    if (!!t1.$isMap) {
+      result = V.ObservableMap_ObservableMap$createFromType(value, null, null);
+      t1.forEach$1(value, new R._toObservableDeep_closure(result));
+      return result;
+    }
+    if (!!t1.$isIterable) {
+      t1 = t1.map$1(value, R._toObservableDeep$closure());
+      t2 = Q.ObservableList$(null, null);
+      t2.addAll$1(0, t1);
+      return t2;
+    }
+    return value;
+  }, "call$1", "_toObservableDeep$closure", 2, 0, 13, 21],
+  _toObservableDeep_closure: {
+    "^": "Closure:75;result_0",
+    call$2: function(k, v) {
+      this.result_0.$indexSet(0, R._toObservableDeep(k), R._toObservableDeep(v));
+    },
+    $isFunction: true
+  }
+}],
+["polymer", "package:polymer/polymer.dart", , A, {
+  "^": "",
+  _shimShadowDomStyling: function(template, $name, extendee) {
+    if (template == null || $.get$_ShadowCss() == null)
+      return;
+    $.get$_ShadowCss().callMethod$2("shimStyling", [template, $name, extendee]);
+  },
+  _cssTextFromSheet: function(sheet) {
+    var href, e, t, t1, exception;
+    if (sheet == null)
+      return "";
+    if ($.deployMode)
+      return "";
+    t1 = J.getInterceptor$x(sheet);
+    href = t1.get$href(sheet);
+    if (J.$eq(href, ""))
+      href = t1.get$attributes(sheet)._html$_element.getAttribute("href");
+    try {
+      t1 = new XMLHttpRequest();
+      C.HttpRequest_methods.open$3$async(t1, "GET", href, false);
+      t1.send();
+      t1 = t1.responseText;
+      return t1;
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      if (!!J.getInterceptor(t1).$isDomException) {
+        e = t1;
+        t = new H._StackTrace(exception, null);
+        $.get$_sheetLog().fine$1("failed to XHR stylesheet text href=\"" + H.S(href) + "\" error: " + H.S(e) + ", trace: " + H.S(t));
+        return "";
+      } else
+        throw exception;
+    }
+
+  },
+  _isObserverMethod: [function(symbol) {
+    var $name, t1;
+    $name = $.get$symbolConverter()._names.$index(0, symbol);
+    if ($name == null)
+      return false;
+    t1 = J.getInterceptor$s($name);
+    return t1.endsWith$1($name, "Changed") && !t1.$eq($name, "attributeChanged");
+  }, "call$1", "_isObserverMethod$closure", 2, 0, 62, 63],
+  Polymer_register: function($name, type) {
+    $.get$_typesByName().$indexSet(0, $name, type);
+    H.interceptedTypeCast(J.$index$asx($.get$context(), "Polymer"), "$isJsFunction").apply$1([$name]);
+  },
+  Polymer_applyStyleToScope: function(style, scope) {
+    var clone, attr, refNode, styleElement;
+    if (style == null)
+      return;
+    document;
+    if ($.get$_hasShadowDomPolyfill() === true)
+      scope = document.head;
+    clone = document.createElement("style", null);
+    J.set$text$x(clone, J.get$text$x(style));
+    attr = style.getAttribute("element");
+    if (attr != null)
+      clone.setAttribute("element", attr);
+    refNode = scope.firstChild;
+    if (scope === document.head) {
+      styleElement = W._FrozenElementList$_wrap(document.head.querySelectorAll("style[element]"), null);
+      if (styleElement.get$isNotEmpty(styleElement))
+        refNode = J.get$nextElementSibling$x(C.NodeList_methods.get$last(styleElement._nodeList));
+    }
+    scope.insertBefore(clone, refNode);
+  },
+  initPolymer: function() {
+    if ($.deployMode) {
+      A.startPolymer($.initializers, true);
+      return $.Zone__current;
+    }
+    var t1 = $.Zone__current.fork$1$specification(O.dirtyCheckZoneSpec());
+    t1.run$1(new A.initPolymer_closure());
+    return t1;
+  },
+  startPolymer: function(initializers, deployMode) {
+    var poly, t1;
+    if ($._startPolymerCalled)
+      throw H.wrapException("Initialization was already done.");
+    $._startPolymerCalled = true;
+    A._hookJsPolymer();
+    $._deployMode = deployMode;
+    if (initializers == null)
+      throw H.wrapException("Missing initialization of polymer elements. Please check that the list of entry points in your pubspec.yaml is correct. If you are using pub-serve, you may need to restart it.");
+    A.Polymer_register("d-auto-binding", C.Type_s8b);
+    poly = document.createElement("polymer-element", null);
+    poly.setAttribute("name", "d-auto-binding");
+    poly.setAttribute("extends", "template");
+    J.$index$asx($.get$_polymerElementProto(), "init").apply$2$thisArg([], poly);
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(initializers, 74, 0, null), [H.getTypeArgumentByIndex(initializers, 0)]); t1.moveNext$0();)
+      t1._current.call$0();
+  },
+  _hookJsPolymer: function() {
+    var t1, polymerJs, zone, originalRegister;
+    t1 = $.get$context();
+    if (J.$index$asx(t1, "Platform") == null)
+      throw H.wrapException(P.StateError$("platform.js, dart_support.js must be loaded at the top of your application, before any other scripts or HTML imports that use polymer. Putting these two script tags at the top of your <head> element should address this issue: <script src=\"packages/web_components/platform.js\"></script> and  <script src=\"packages/web_components/dart_support.js\"></script>."));
+    polymerJs = J.$index$asx(t1, "Polymer");
+    if (polymerJs == null)
+      throw H.wrapException(P.StateError$("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."));
+    zone = $.Zone__current;
+    polymerJs.callMethod$2("whenPolymerReady", [zone.bindCallback$1(new A._hookJsPolymer_closure())]);
+    originalRegister = J.$index$asx($.get$_polymerElementProto(), "register");
+    if (originalRegister == null)
+      throw H.wrapException(P.StateError$("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."));
+    J.$indexSet$ax($.get$_polymerElementProto(), "register", P.JsFunction_JsFunction$withThis(new A._hookJsPolymer_registerDart(zone, originalRegister)));
+  },
+  PolymerDeclaration: {
+    "^": "Object;element>,type>,superDeclaration<,name>,_polymer$_publish<,_publishLC<,_observe>,_instanceAttributes<,_reflect<,_sheets,_styles,syntax>,_eventDelegates<,_templateDelegates,_rootUri",
+    get$templateContent: function() {
+      var template, t1;
+      template = J.querySelector$1$x(this.element, "template");
+      if (template != null)
+        t1 = J.get$content$x(!!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template));
+      else
+        t1 = null;
+      return t1;
+    },
+    registerType$1: function($name) {
+      var baseTag, decl, t1;
+      for (baseTag = null, decl = this; decl != null;) {
+        baseTag = J.get$attributes$x(J.get$element$x(decl))._html$_element.getAttribute("extends");
+        decl = decl.get$superDeclaration();
+      }
+      t1 = document;
+      W._registerCustomElement(window, t1, $name, this.type, baseTag);
+    },
+    resolveElementPaths$1: function(node) {
+      var t1 = $.get$_Platform();
+      if (t1 == null)
+        return;
+      J.$index$asx(t1, "urlResolver").callMethod$2("resolveDom", [node]);
+    },
+    publishAttributes$1: function(superDecl) {
+      var t1, t2, attrs, t3, attr, property, path, t4, decl;
+      if (superDecl != null) {
+        if (superDecl.get$_polymer$_publish() != null) {
+          t1 = superDecl.get$_polymer$_publish();
+          t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+          t2.addAll$1(0, t1);
+          this._polymer$_publish = t2;
+        }
+        if (superDecl.get$_reflect() != null) {
+          t1 = superDecl.get$_reflect();
+          t2 = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+          t2.addAll$1(0, t1);
+          this._reflect = t2;
+        }
+      }
+      t1 = this.type;
+      this._getPublishedProperties$1(t1);
+      attrs = J.get$attributes$x(this.element)._html$_element.getAttribute("attributes");
+      if (attrs != null)
+        for (t2 = C.JSString_methods.split$1(attrs, $.get$_ATTRIBUTES_REGEX()), t2 = H.setRuntimeTypeInfo(new H.ListIterator(t2, t2.length, 0, null), [H.getTypeArgumentByIndex(t2, 0)]), t3 = this.name; t2.moveNext$0();) {
+          attr = J.trim$0$s(t2._current);
+          if (attr === "")
+            continue;
+          property = $.get$symbolConverter()._symbols.$index(0, attr);
+          path = L.PropertyPath_PropertyPath([property]);
+          t4 = this._polymer$_publish;
+          if (t4 != null && t4.containsKey$1(path))
+            continue;
+          decl = $.get$typeInspector().getDeclaration$2(t1, property);
+          if (decl == null || decl.kind === C.DeclarationKind_2 || decl.isFinal) {
+            window;
+            t4 = "property for attribute " + attr + " of polymer-element name=" + H.S(t3) + " not found.";
+            if (typeof console != "undefined")
+              console.warn(t4);
+            continue;
+          }
+          t4 = this._polymer$_publish;
+          if (t4 == null) {
+            t4 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+            this._polymer$_publish = t4;
+          }
+          t4.$indexSet(0, path, decl);
+        }
+    },
+    _getPublishedProperties$1: function(type) {
+      var t1, decl, t2, t3;
+      for (t1 = $.get$typeInspector().query$2(0, type, C.QueryOptions_sAl), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        decl = t1._current;
+        t2 = J.getInterceptor$x(decl);
+        if (t2.get$isFinal(decl) === true)
+          continue;
+        t3 = this._polymer$_publish;
+        if (t3 == null) {
+          t3 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+          this._polymer$_publish = t3;
+        }
+        t3.$indexSet(0, L.PropertyPath_PropertyPath([t2.get$name(decl)]), decl);
+        t3 = new H.WhereIterable(decl.get$annotations(), new A.PolymerDeclaration__getPublishedProperties_closure());
+        t3.$builtinTypeInfo = [null];
+        if (t3.any$1(0, new A.PolymerDeclaration__getPublishedProperties_closure0())) {
+          t3 = this._reflect;
+          if (t3 == null) {
+            t3 = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+            this._reflect = t3;
+          }
+          t2 = t2.get$name(decl);
+          t3.add$1(0, $.get$symbolConverter()._names.$index(0, t2));
+        }
+      }
+    },
+    accumulateInstanceAttributes$0: function() {
+      var t1, t2;
+      t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Object);
+      this._instanceAttributes = t1;
+      t2 = this.superDeclaration;
+      if (t2 != null)
+        t1.addAll$1(0, t2.get$_instanceAttributes());
+      J.get$attributes$x(this.element).forEach$1(0, new A.PolymerDeclaration_accumulateInstanceAttributes_closure(this));
+    },
+    addAttributeDelegates$1: function(delegates) {
+      J.get$attributes$x(this.element).forEach$1(0, new A.PolymerDeclaration_addAttributeDelegates_closure(delegates));
+    },
+    cacheSheets$0: function() {
+      var t1 = this.findNodes$1("link[rel=stylesheet]");
+      this._sheets = t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.remove$0$ax(t1._current);
+    },
+    cacheStyles$0: function() {
+      var t1 = this.findNodes$1("style[polymer-scope]");
+      this._styles = t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.remove$0$ax(t1._current);
+    },
+    installLocalSheets$0: function() {
+      var t1, sheets, $content, cssText, t2, str, t3, style;
+      t1 = this._sheets;
+      t1.toString;
+      sheets = H.setRuntimeTypeInfo(new H.WhereIterable(t1, new A.PolymerDeclaration_installLocalSheets_closure()), [null]);
+      $content = this.get$templateContent();
+      if ($content != null) {
+        cssText = P.StringBuffer$("");
+        for (t1 = H.setRuntimeTypeInfo(new H.WhereIterator(J.get$iterator$ax(sheets._iterable), sheets._f), [H.getTypeArgumentByIndex(sheets, 0)]), t2 = t1._iterator; t1.moveNext$0();) {
+          str = A._cssTextFromSheet(t2.get$current());
+          t3 = cssText._contents += typeof str === "string" ? str : H.S(str);
+          cssText._contents = t3 + "\n";
+        }
+        if (cssText._contents.length > 0) {
+          style = J.get$ownerDocument$x(this.element).createElement("style", null);
+          J.set$text$x(style, H.S(cssText));
+          t1 = J.getInterceptor$x($content);
+          t1.insertBefore$2($content, style, t1.get$firstChild($content));
+        }
+      }
+    },
+    findNodes$2: function(selector, matcher) {
+      var t1, nodes, $content;
+      t1 = J.querySelectorAll$1$x(this.element, selector);
+      nodes = t1.toList$0(t1);
+      $content = this.get$templateContent();
+      if ($content != null)
+        C.JSArray_methods.addAll$1(nodes, J.querySelectorAll$1$x($content, selector));
+      return nodes;
+    },
+    findNodes$1: function(selector) {
+      return this.findNodes$2(selector, null);
+    },
+    cssTextForScope$1: function(scopeDescriptor) {
+      var cssText, t1, t2, t3, str, t4;
+      cssText = P.StringBuffer$("");
+      t1 = new A.PolymerDeclaration_cssTextForScope_matcher("[polymer-scope=" + scopeDescriptor + "]");
+      for (t2 = this._sheets, t2.toString, t2 = H.setRuntimeTypeInfo(new H.WhereIterable(t2, t1), [null]), t2 = H.setRuntimeTypeInfo(new H.WhereIterator(J.get$iterator$ax(t2._iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0)]), t3 = t2._iterator; t2.moveNext$0();) {
+        str = A._cssTextFromSheet(t3.get$current());
+        t4 = cssText._contents += typeof str === "string" ? str : H.S(str);
+        cssText._contents = t4 + "\n\n";
+      }
+      for (t2 = this._styles, t2.toString, t1 = H.setRuntimeTypeInfo(new H.WhereIterable(t2, t1), [null]), t1 = H.setRuntimeTypeInfo(new H.WhereIterator(J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0)]), t2 = t1._iterator; t1.moveNext$0();) {
+        str = J.get$text$x(t2.get$current());
+        t3 = cssText._contents += typeof str === "string" ? str : H.S(str);
+        cssText._contents = t3 + "\n\n";
+      }
+      return cssText._contents;
+    },
+    cssTextToScopeStyle$2: function(cssText, scopeDescriptor) {
+      var t1;
+      if (cssText === "")
+        return;
+      t1 = document.createElement("style", null);
+      J.set$text$x(t1, cssText);
+      t1.setAttribute("element", H.S(this.name) + "-" + scopeDescriptor);
+      return t1;
+    },
+    inferObservers$0: function() {
+      var t1, decl, t2, t3, $name;
+      for (t1 = $.get$_changedMethodQueryOptions(), t1 = $.get$typeInspector().query$2(0, this.type, t1), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        decl = t1._current;
+        if (this._observe == null)
+          this._observe = P.HashMap_HashMap(null, null, null, null, null);
+        t2 = J.getInterceptor$x(decl);
+        t3 = t2.get$name(decl);
+        $name = $.get$symbolConverter()._names.$index(0, t3);
+        t3 = J.getInterceptor$asx($name);
+        $name = t3.substring$2($name, 0, J.$sub$n(t3.get$length($name), 7));
+        this._observe.$indexSet(0, L.PropertyPath_PropertyPath($name), [t2.get$name(decl)]);
+      }
+    },
+    explodeObservers$0: function() {
+      var t1, t2, t3;
+      for (t1 = $.get$typeInspector().query$2(0, this.type, C.QueryOptions_xw8), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        t2 = t1._current.get$annotations();
+        t3 = new H.ListIterator(t2, t2.length, 0, null);
+        t3.$builtinTypeInfo = [H.getTypeArgumentByIndex(t2, 0)];
+        for (; t3.moveNext$0();)
+          continue;
+      }
+    },
+    _lowerCaseMap$1: function(properties) {
+      var map = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, null);
+      properties.forEach$1(0, new A.PolymerDeclaration__lowerCaseMap_closure(map));
+      return map;
+    },
+    $isPolymerDeclaration: true,
+    static: {"^": "PolymerDeclaration__polymerSyntax"}
+  },
+  PolymerDeclaration__getPublishedProperties_closure: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return !!J.getInterceptor(a).$isPublishedProperty;
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration__getPublishedProperties_closure0: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return a.get$reflect();
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_accumulateInstanceAttributes_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function($name, value) {
+      if (C.Map_EJn7R.containsKey$1($name) !== true && !J.startsWith$1$s($name, "on-"))
+        this.this_0._instanceAttributes.$indexSet(0, $name, value);
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_addAttributeDelegates_closure: {
+    "^": "Closure:75;delegates_0",
+    call$2: function($name, value) {
+      var t1, start, end;
+      t1 = J.getInterceptor$s($name);
+      if (t1.startsWith$1($name, "on-")) {
+        start = J.getInterceptor$asx(value).indexOf$1(value, "{{");
+        end = C.JSString_methods.lastIndexOf$1(value, "}}");
+        if (start >= 0 && end >= 0)
+          this.delegates_0.$indexSet(0, t1.substring$1($name, 3), C.JSString_methods.trim$0(C.JSString_methods.substring$2(value, start + 2, end)));
+      }
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_installLocalSheets_closure: {
+    "^": "Closure:13;",
+    call$1: function(s) {
+      return J.get$attributes$x(s)._html$_element.hasAttribute("polymer-scope") !== true;
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_cssTextForScope_matcher: {
+    "^": "Closure:13;selector_0",
+    call$1: function(s) {
+      return J.matches$1$x(s, this.selector_0);
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_explodeObservers_closure: {
+    "^": "Closure:69;",
+    call$0: function() {
+      return [];
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration__lowerCaseMap_closure: {
+    "^": "Closure:161;map_0",
+    call$2: function(path, value) {
+      this.map_0.$indexSet(0, H.S(path).toLowerCase(), value);
+    },
+    $isFunction: true
+  },
+  PolymerExpressions: {
+    "^": "BindingDelegate_PolymerEventBindings;_delegate,_bindingMaps",
+    prepareBinding$3: function(path, $name, node) {
+      if (J.startsWith$1$s($name, "on-"))
+        return this.prepareEventBinding$3(path, $name, node);
+      return this._delegate.prepareBinding$3(path, $name, node);
+    }
+  },
+  BindingDelegate_PolymerEventBindings: {
+    "^": "BindingDelegate+PolymerEventBindings;"
+  },
+  PolymerEventBindings: {
+    "^": "Object;",
+    findController$1: function(node) {
+      var t1;
+      for (; t1 = J.getInterceptor$x(node), t1.get$parentNode(node) != null;) {
+        if (!!t1.$isPolymer && J.$index$asx(node.polymer$Polymer$_jsElem, "eventController") != null)
+          return J.$index$asx(t1.get$_jsElem(node), "eventController");
+        node = t1.get$parentNode(node);
+      }
+      return !!t1.$isShadowRoot ? node.host : null;
+    },
+    getEventHandler$3: function(controller, target, method) {
+      var t1 = {};
+      t1.controller_0 = controller;
+      return new A.PolymerEventBindings_getEventHandler_closure(t1, this, target, method);
+    },
+    prepareEventBinding$3: function(path, $name, node) {
+      var t1, t2, eventType, translated;
+      t1 = {};
+      t2 = J.getInterceptor$s($name);
+      if (!t2.startsWith$1($name, "on-"))
+        return;
+      eventType = t2.substring$1($name, 3);
+      t1.eventType_0 = eventType;
+      translated = C.Map_AmMJ5.$index(0, eventType);
+      t1.eventType_0 = translated != null ? translated : t1.eventType_0;
+      return new A.PolymerEventBindings_prepareEventBinding_closure(t1, this, path);
+    }
+  },
+  PolymerEventBindings_getEventHandler_closure: {
+    "^": "Closure:13;box_0,this_1,target_2,method_3",
+    call$1: [function(e) {
+      var t1, t2, controller, detail;
+      t1 = this.box_0;
+      t2 = t1.controller_0;
+      if (t2 == null || !J.getInterceptor(t2).$isPolymer) {
+        controller = this.this_1.findController$1(this.target_2);
+        t1.controller_0 = controller;
+        t2 = controller;
+      }
+      if (!!J.getInterceptor(t2).$isPolymer) {
+        t2 = J.getInterceptor(e);
+        if (!!t2.$isCustomEvent) {
+          detail = t2.get$detail(e);
+          if (detail == null)
+            detail = J.$index$asx(P.JsObject_JsObject$fromBrowserObject(e), "detail");
+        } else
+          detail = null;
+        t2 = t2.get$currentTarget(e);
+        t1 = t1.controller_0;
+        J.dispatchMethod$3$x(t1, t1, this.method_3, [e, detail, t2]);
+      } else
+        throw H.wrapException(P.StateError$("controller " + H.S(t2) + " is not a Dart polymer-element."));
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  PolymerEventBindings_prepareEventBinding_closure: {
+    "^": "Closure:165;box_0,this_1,path_2",
+    call$3: [function(model, node, oneTime) {
+      var t1, handler, t2, sub;
+      t1 = this.path_2;
+      handler = this.this_1.getEventHandler$3(null, node, t1);
+      t2 = J.get$on$x(node).$index(0, this.box_0.eventType_0);
+      sub = H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t2._html$_target, t2._eventType, W._wrapZone(handler), t2._useCapture), [H.getTypeArgumentByIndex(t2, 0)]);
+      sub._tryResume$0();
+      if (oneTime === true)
+        return;
+      return new A._EventBindable(sub, t1);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  _EventBindable: {
+    "^": "Bindable;_sub,_polymer$_path",
+    get$value: function(_) {
+      return "{{ " + this._polymer$_path + " }}";
+    },
+    open$1: function(_, callback) {
+      return "{{ " + this._polymer$_path + " }}";
+    },
+    close$0: function(_) {
+      var t1 = this._sub;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._sub = null;
+      }
+    }
+  },
+  PublishedProperty: {
+    "^": "ObservableProperty;reflect<",
+    $isPublishedProperty: true
+  },
+  PolymerElement: {
+    "^": "HtmlElement_Polymer_ChangeNotifier;change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    PolymerElement$created$0: function(receiver) {
+      this.polymerCreated$0(receiver);
+    },
+    static: {PolymerElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.PolymerElement_methods.Element$created$0(receiver);
+        C.PolymerElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  HtmlElement_Polymer: {
+    "^": "HtmlElement+Polymer;_jsElem:polymer$Polymer$_jsElem=",
+    $isPolymer: true,
+    $isNodeBindExtension: true,
+    $isObservable: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true
+  },
+  HtmlElement_Polymer_ChangeNotifier: {
+    "^": "HtmlElement_Polymer+ChangeNotifier;",
+    $isObservable: true
+  },
+  Polymer: {
+    "^": "Object;_jsElem:polymer$Polymer$_jsElem=",
+    get$element: function(receiver) {
+      return receiver.polymer$Polymer$_polymer$_element;
+    },
+    get$syntax: function(receiver) {
+      return;
+    },
+    get$_polymer$_name: function(receiver) {
+      var t1, isAttr;
+      t1 = receiver.polymer$Polymer$_polymer$_element;
+      if (t1 != null)
+        return J.get$name$x(t1);
+      isAttr = this.get$attributes(receiver)._html$_element.getAttribute("is");
+      return isAttr == null || isAttr === "" ? this.get$localName(receiver) : isAttr;
+    },
+    polymerCreated$0: function(receiver) {
+      var t, t1;
+      t = this.get$templateInstance(receiver);
+      if (t != null && t.model != null) {
+        window;
+        t1 = "Attributes on " + H.S(this.get$_polymer$_name(receiver)) + " were data bound prior to Polymer upgrading the element. This may result in incorrect binding types.";
+        if (typeof console != "undefined")
+          console.warn(t1);
+      }
+      this.prepareElement$0(receiver);
+      t1 = this.get$ownerDocument(receiver);
+      if (!J.$eq($.get$_isStagingDocument().$index(0, t1), true) || $.get$_hasShadowDomPolyfill() === true)
+        this.makeElementReady$0(receiver);
+    },
+    prepareElement$0: function(receiver) {
+      var t1, t2;
+      if (receiver.polymer$Polymer$_polymer$_element != null) {
+        window;
+        t1 = "Element already prepared: " + H.S(this.get$_polymer$_name(receiver));
+        if (typeof console != "undefined")
+          console.warn(t1);
+        return;
+      }
+      receiver.polymer$Polymer$_jsElem = P.JsObject_JsObject$fromBrowserObject(receiver);
+      t1 = this.get$_polymer$_name(receiver);
+      receiver.polymer$Polymer$_polymer$_element = $.get$_declarations().$index(0, t1);
+      this.createPropertyObserver$0(receiver);
+      t1 = receiver.polymer$Polymer$_propertyObserver;
+      if (t1 != null) {
+        t2 = this.get$notifyPropertyChanges(receiver);
+        t1.toString;
+        L._Observer.prototype.open$1.call(J.getInterceptor(t1), t1, t2);
+      }
+      if (receiver.polymer$Polymer$_polymer$_element.get$_polymer$_publish() != null)
+        this.get$changes(receiver).listen$1(this.get$_propertyChange(receiver));
+      this.copyInstanceAttributes$0(receiver);
+      this.takeAttributes$0(receiver);
+      this.addHostListeners$0(receiver);
+    },
+    makeElementReady$0: function(receiver) {
+      if (receiver.polymer$Polymer$_readied)
+        return;
+      receiver.polymer$Polymer$_readied = true;
+      this.parseDeclarations$1(receiver, receiver.polymer$Polymer$_polymer$_element);
+      this.get$attributes(receiver).remove$1(0, "unresolved");
+      this.ready$0(receiver);
+    },
+    ready$0: function(receiver) {
+    },
+    attached$0: function(receiver) {
+      if (receiver.polymer$Polymer$_polymer$_element == null)
+        throw H.wrapException(P.StateError$("polymerCreated was not called for custom element " + H.S(this.get$_polymer$_name(receiver)) + ", this should normally be done in the .created() if Polymer is used as a mixin."));
+      this.cancelUnbindAll$0(receiver);
+      if (!receiver.polymer$Polymer$_hasBeenAttached) {
+        receiver.polymer$Polymer$_hasBeenAttached = true;
+        this.async$1(receiver, new A.Polymer_attached_closure(receiver));
+      }
+    },
+    detached$0: function(receiver) {
+      this.asyncUnbindAll$0(receiver);
+    },
+    parseDeclarations$1: function(receiver, declaration) {
+      if (declaration != null) {
+        this.parseDeclarations$1(receiver, declaration.get$superDeclaration());
+        this.parseDeclaration$1(receiver, J.get$element$x(declaration));
+      }
+    },
+    parseDeclaration$1: function(receiver, elementElement) {
+      var t1, template, root, $name;
+      t1 = J.getInterceptor$x(elementElement);
+      template = t1.querySelector$1(elementElement, "template");
+      if (template != null) {
+        root = this.shadowFromTemplate$1(receiver, template);
+        $name = t1.get$attributes(elementElement)._html$_element.getAttribute("name");
+        if ($name == null)
+          return;
+        receiver.polymer$Polymer$shadowRoots.$indexSet(0, $name, root);
+      }
+    },
+    shadowFromTemplate$1: function(receiver, template) {
+      var root, syntax, t, dom, ext, t1;
+      if (template == null)
+        return;
+      root = this.createShadowRoot$0(receiver);
+      syntax = this.get$syntax(receiver);
+      t = !!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template);
+      dom = J.createInstance$2$x(t, receiver, syntax == null && J.get$bindingDelegate$x(t) == null ? J.get$syntax$x(receiver.polymer$Polymer$_polymer$_element) : syntax);
+      ext = $.get$_instanceExtension().$index(0, dom);
+      t1 = ext != null ? ext.get$_bindings() : ext;
+      receiver.polymer$Polymer$_observers.push(t1);
+      root.appendChild(dom);
+      this.marshalNodeReferences$1(receiver, root);
+      t1 = $.get$_PolymerGestures();
+      if (t1 != null)
+        t1.callMethod$2("register", [root]);
+      return root;
+    },
+    marshalNodeReferences$1: function(receiver, root) {
+      var t1, t2, n;
+      if (root == null)
+        return;
+      for (t1 = J.querySelectorAll$1$x(root, "[id]"), t1 = t1.get$iterator(t1), t2 = receiver.polymer$Polymer$$; t1.moveNext$0();) {
+        n = t1._current;
+        t2.$indexSet(0, J.get$id$x(n), n);
+      }
+    },
+    attributeChanged$3: function(receiver, $name, oldValue, newValue) {
+      var t1 = J.getInterceptor($name);
+      if (!t1.$eq($name, "class") && !t1.$eq($name, "style"))
+        this.attributeToProperty$2(receiver, $name, newValue);
+    },
+    copyInstanceAttributes$0: function(receiver) {
+      receiver.polymer$Polymer$_polymer$_element.get$_instanceAttributes().forEach$1(0, new A.Polymer_copyInstanceAttributes_closure(receiver));
+    },
+    takeAttributes$0: function(receiver) {
+      if (receiver.polymer$Polymer$_polymer$_element.get$_publishLC() == null)
+        return;
+      this.get$attributes(receiver).forEach$1(0, this.get$attributeToProperty(receiver));
+    },
+    attributeToProperty$2: [function(receiver, $name, value) {
+      var decl, t1, t2, currentValue, type, newValue;
+      decl = this.propertyForAttribute$1(receiver, $name);
+      if (decl == null)
+        return;
+      if (value == null || J.contains$1$asx(value, $.get$Polymer_bindPattern()) === true)
+        return;
+      t1 = J.getInterceptor$x(decl);
+      t2 = t1.get$name(decl);
+      currentValue = $.get$objectAccessor().read$2(receiver, t2);
+      type = t1.get$type(decl);
+      t2 = J.getInterceptor(type);
+      newValue = Z.deserializeValue(value, currentValue, (t2.$eq(type, C.Type_HqF) || t2.$eq(type, C.Type_dynamic)) && currentValue != null ? J.get$runtimeType$(currentValue) : type);
+      if (newValue == null ? currentValue != null : newValue !== currentValue) {
+        t1 = t1.get$name(decl);
+        $.get$objectAccessor().write$3(receiver, t1, newValue);
+      }
+    }, "call$2", "get$attributeToProperty", 4, 0, 166],
+    propertyForAttribute$1: function(receiver, $name) {
+      var publishLC = receiver.polymer$Polymer$_polymer$_element.get$_publishLC();
+      if (publishLC == null)
+        return;
+      return publishLC.$index(0, $name);
+    },
+    serializeValue$1: function(receiver, value) {
+      if (value == null)
+        return;
+      if (typeof value === "boolean")
+        return value ? "" : null;
+      else if (typeof value === "string" || typeof value === "number")
+        return H.S(value);
+      return;
+    },
+    reflectPropertyToAttribute$1: function(receiver, path) {
+      var propValue, serializedValue, t1;
+      propValue = L.PropertyPath_PropertyPath(path).getValueFrom$1(receiver);
+      serializedValue = this.serializeValue$1(receiver, propValue);
+      if (serializedValue != null)
+        this.get$attributes(receiver)._html$_element.setAttribute(path, serializedValue);
+      else if (typeof propValue === "boolean") {
+        t1 = this.get$attributes(receiver)._html$_element;
+        t1.getAttribute(path);
+        t1.removeAttribute(path);
+      }
+    },
+    bind$3$oneTime: function(receiver, $name, bindable, oneTime) {
+      var decl, t1, t2, t3, observer, reflect, propName;
+      decl = this.propertyForAttribute$1(receiver, $name);
+      if (decl == null)
+        return J.bind$3$oneTime$x(M.nodeBindFallback(receiver), $name, bindable, oneTime);
+      else {
+        t1 = J.getInterceptor$x(decl);
+        t2 = t1.get$name(decl);
+        t3 = $.get$_bindLog();
+        if (t3.isLoggable$1(C.Level_FINE_500))
+          t3.fine$1("bindProperty: [" + H.S(bindable) + "] to [" + H.S(this.get$_polymer$_name(receiver)) + "].[" + H.S(t2) + "]");
+        t3 = J.getInterceptor$x(bindable);
+        if (t3.get$value(bindable) == null)
+          t3.set$value(bindable, $.get$objectAccessor().read$2(receiver, t2));
+        observer = new A._PolymerBinding(receiver, t2, bindable, null, null);
+        observer._sub = this.get$changes(receiver).listen$1(observer.get$_propertyValueChanged());
+        t3 = J.open$1$x(bindable, observer.get$_updateNode());
+        observer._lastValue = t3;
+        $.get$objectAccessor().write$3(receiver, t2, t3);
+        if ($.enableBindingsReflection && true) {
+          if (J.get$bindings$x(M.nodeBindFallback(receiver)) == null) {
+            t2 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+            J.set$bindings$x(M.nodeBindFallback(receiver), t2);
+          }
+          J.$indexSet$ax(J.get$bindings$x(M.nodeBindFallback(receiver)), $name, observer);
+        }
+        reflect = receiver.polymer$Polymer$_polymer$_element.get$_reflect();
+        t1 = t1.get$name(decl);
+        propName = $.get$symbolConverter()._names.$index(0, t1);
+        if (reflect != null && reflect.contains$1(0, propName))
+          this.reflectPropertyToAttribute$1(receiver, propName);
+        return observer;
+      }
+    },
+    bindFinished$0: function(receiver) {
+      return this.makeElementReady$0(receiver);
+    },
+    get$bindings: function(receiver) {
+      return J.get$bindings$x(M.nodeBindFallback(receiver));
+    },
+    set$bindings: function(receiver, value) {
+      J.set$bindings$x(M.nodeBindFallback(receiver), value);
+    },
+    get$templateInstance: function(receiver) {
+      return J.get$templateInstance$x(M.nodeBindFallback(receiver));
+    },
+    asyncUnbindAll$0: function(receiver) {
+      var job, t1;
+      if (receiver.polymer$Polymer$_unbound === true)
+        return;
+      $.get$_unbindLog().fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] asyncUnbindAll");
+      job = receiver.polymer$Polymer$_unbindAllJob;
+      t1 = this.get$unbindAll(receiver);
+      if (job == null)
+        job = new A.PolymerJob(null, null, null);
+      job.start$2(0, t1, null);
+      receiver.polymer$Polymer$_unbindAllJob = job;
+    },
+    unbindAll$0: [function(receiver) {
+      if (receiver.polymer$Polymer$_unbound === true)
+        return;
+      H.IterableMixinWorkaround_forEach(receiver.polymer$Polymer$_observers, this.get$closeObserverList(receiver));
+      receiver.polymer$Polymer$_observers = [];
+      this.closeNamedObservers$0(receiver);
+      receiver.polymer$Polymer$_unbound = true;
+    }, "call$0", "get$unbindAll", 0, 0, 18],
+    cancelUnbindAll$0: function(receiver) {
+      var t1;
+      if (receiver.polymer$Polymer$_unbound === true) {
+        $.get$_unbindLog().warning$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] already unbound, cannot cancel unbindAll");
+        return;
+      }
+      $.get$_unbindLog().fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] cancelUnbindAll");
+      t1 = receiver.polymer$Polymer$_unbindAllJob;
+      if (t1 != null) {
+        t1.stop$0(0);
+        receiver.polymer$Polymer$_unbindAllJob = null;
+      }
+    },
+    createPropertyObserver$0: function(receiver) {
+      var observe, t1, o, t2, path;
+      observe = J.get$_observe$x(receiver.polymer$Polymer$_polymer$_element);
+      if (observe != null) {
+        t1 = $._Observer__nextBirthId;
+        $._Observer__nextBirthId = t1 + 1;
+        o = new L.CompoundObserver(null, [], t1, null, null, null);
+        o._path_observer$_value = [];
+        receiver.polymer$Polymer$_propertyObserver = o;
+        receiver.polymer$Polymer$_observers.push([o]);
+        for (t1 = H.setRuntimeTypeInfo(new P.HashMapKeyIterable(observe), [H.getTypeArgumentByIndex(observe, 0)]), t2 = t1._map, t1 = H.setRuntimeTypeInfo(new P.HashMapKeyIterator(t2, t2._computeKeys$0(), 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+          path = t1._collection$_current;
+          o.addPath$2(receiver, path);
+          this.observeArrayValue$3(receiver, path, path.getValueFrom$1(receiver), null);
+        }
+      }
+    },
+    notifyPropertyChanges$3: [function(receiver, newValues, oldValues, paths) {
+      J.forEach$1$ax(oldValues, new A.Polymer_notifyPropertyChanges_closure(receiver, newValues, oldValues, paths, J.get$_observe$x(receiver.polymer$Polymer$_polymer$_element), P.HashSet_HashSet(null, null, null, null)));
+    }, "call$3", "get$notifyPropertyChanges", 6, 0, 167],
+    _propertyChange$1: [function(receiver, records) {
+      var t1, record, t2, $name, reflect;
+      for (t1 = J.get$iterator$ax(records); t1.moveNext$0();) {
+        record = t1.get$current();
+        if (!J.getInterceptor(record).$isPropertyChangeRecord)
+          continue;
+        t2 = record.name;
+        $name = $.get$symbolConverter()._names.$index(0, t2);
+        reflect = receiver.polymer$Polymer$_polymer$_element.get$_reflect();
+        if (reflect != null && reflect.contains$1(0, $name))
+          this.reflectPropertyToAttribute$1(receiver, $name);
+      }
+    }, "call$1", "get$_propertyChange", 2, 0, 168, 160],
+    observeArrayValue$3: function(receiver, $name, value, old) {
+      var observe, callbacks, t1, subscription, t2;
+      observe = J.get$_observe$x(receiver.polymer$Polymer$_polymer$_element);
+      if (observe == null)
+        return;
+      callbacks = observe.$index(0, $name);
+      if (callbacks == null)
+        return;
+      if (!!J.getInterceptor(old).$isObservableList) {
+        t1 = $.get$_observeLog();
+        if (t1.isLoggable$1(C.Level_FINE_500))
+          t1.fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] observeArrayValue: unregister " + H.S($name));
+        this.closeNamedObserver$1(receiver, H.S($name) + "__array");
+      }
+      if (!!J.getInterceptor(value).$isObservableList) {
+        t1 = $.get$_observeLog();
+        if (t1.isLoggable$1(C.Level_FINE_500))
+          t1.fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] observeArrayValue: register " + H.S($name));
+        subscription = value.get$listChanges()._createSubscription$1(false);
+        subscription.onData$1(new A.Polymer_observeArrayValue_closure(receiver, old, callbacks));
+        subscription.onError$1(0, null);
+        subscription.onDone$1(null);
+        t1 = H.S($name) + "__array";
+        t2 = receiver.polymer$Polymer$_namedObservers;
+        if (t2 == null) {
+          t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.StreamSubscription);
+          receiver.polymer$Polymer$_namedObservers = t2;
+        }
+        t2.$indexSet(0, t1, subscription);
+      }
+    },
+    closeObserverList$1: [function(receiver, observers) {
+      var t1, o;
+      for (t1 = J.get$iterator$ax(observers); t1.moveNext$0();) {
+        o = t1.get$current();
+        if (o != null)
+          J.close$0$x(o);
+      }
+    }, "call$1", "get$closeObserverList", 2, 0, 169],
+    closeNamedObserver$1: function(receiver, $name) {
+      var sub = receiver.polymer$Polymer$_namedObservers.remove$1(0, $name);
+      if (sub == null)
+        return false;
+      sub.cancel$0();
+      return true;
+    },
+    closeNamedObservers$0: function(receiver) {
+      var t1, sub;
+      t1 = receiver.polymer$Polymer$_namedObservers;
+      if (t1 == null)
+        return;
+      for (t1 = t1.get$values(t1), t1 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]); t1.moveNext$0();) {
+        sub = t1._current;
+        if (sub != null)
+          sub.cancel$0();
+      }
+      receiver.polymer$Polymer$_namedObservers.clear$0(0);
+      receiver.polymer$Polymer$_namedObservers = null;
+    },
+    addHostListeners$0: function(receiver) {
+      var events, t1;
+      events = receiver.polymer$Polymer$_polymer$_element.get$_eventDelegates();
+      if (events.get$isEmpty(events))
+        return;
+      t1 = $.get$_eventsLog();
+      if (t1.isLoggable$1(C.Level_FINE_500))
+        t1.fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] addHostListeners: " + events.toString$0(0));
+      events.forEach$1(0, new A.Polymer_addHostListeners_closure(receiver));
+    },
+    dispatchMethod$3: function(receiver, object, callbackOrMethod, args) {
+      var t1, log, maxArgs, t2;
+      t1 = $.get$_eventsLog();
+      log = t1.isLoggable$1(C.Level_FINE_500);
+      if (log)
+        t1.fine$1(">>> [" + H.S(this.get$_polymer$_name(receiver)) + "]: dispatch " + H.S(callbackOrMethod));
+      if (!!J.getInterceptor(callbackOrMethod).$isFunction) {
+        maxArgs = X.maxArgs(callbackOrMethod);
+        if (maxArgs === -1)
+          t1.warning$1("invalid callback: expected callback of 0, 1, 2, or 3 arguments");
+        C.JSArray_methods.set$length(args, maxArgs);
+        H.Primitives_applyFunction(callbackOrMethod, args, P.Function__toMangledNames(null));
+      } else if (typeof callbackOrMethod === "string") {
+        t2 = $.get$symbolConverter()._symbols.$index(0, callbackOrMethod);
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(object, t2, args, true, null);
+      } else
+        t1.warning$1("invalid callback");
+      if (log)
+        t1.info$1("<<< [" + H.S(this.get$_polymer$_name(receiver)) + "]: dispatch " + H.S(callbackOrMethod));
+    },
+    async$1: function(receiver, method) {
+      var t1;
+      P.scheduleMicrotask(F.Observable_dirtyCheck$closure());
+      $.get$_Platform().callMethod$1("flush");
+      t1 = window;
+      C.Window_methods._ensureRequestAnimationFrame$0(t1);
+      return C.Window_methods._requestAnimationFrame$1(t1, W._wrapZone(method));
+    },
+    fire$5$canBubble$cancelable$detail$onNode: function(receiver, type, canBubble, cancelable, detail, onNode) {
+      var $event = W.CustomEvent_CustomEvent(type, true, true, detail);
+      this.dispatchEvent$1(receiver, $event);
+      return $event;
+    },
+    fire$1: function($receiver, type) {
+      return this.fire$5$canBubble$cancelable$detail$onNode($receiver, type, null, null, null, null);
+    },
+    $isPolymer: true,
+    $isNodeBindExtension: true,
+    $isObservable: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true
+  },
+  Polymer_attached_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      return;
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  Polymer_copyInstanceAttributes_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function($name, value) {
+      var t1 = J.get$attributes$x(this.this_0);
+      if (t1.containsKey$1($name) !== true)
+        t1.$indexSet(0, $name, new A.Polymer_copyInstanceAttributes__closure(value).call$0());
+      t1.$index(0, $name);
+    },
+    $isFunction: true
+  },
+  Polymer_copyInstanceAttributes__closure: {
+    "^": "Closure:69;value_1",
+    call$0: function() {
+      return this.value_1;
+    },
+    $isFunction: true
+  },
+  Polymer_notifyPropertyChanges_closure: {
+    "^": "Closure:75;this_0,newValues_1,oldValues_2,paths_3,observe_4,called_5",
+    call$2: [function(i, oldValue) {
+      var t1, newValue, t2, t3, path, methods, t4, t5, t6, t7, method;
+      t1 = this.newValues_1;
+      newValue = J.$index$asx(t1, i);
+      t2 = this.paths_3;
+      if (typeof i !== "number")
+        return H.iae(i);
+      t3 = 2 * i + 1;
+      if (t3 >>> 0 !== t3 || t3 >= t2.length)
+        return H.ioore(t2, t3);
+      path = t2[t3];
+      t3 = this.observe_4;
+      if (t3 == null)
+        return;
+      methods = t3.$index(0, path);
+      if (methods == null)
+        return;
+      for (t3 = J.get$iterator$ax(methods), t4 = this.this_0, t5 = J.getInterceptor$x(t4), t6 = this.oldValues_2, t7 = this.called_5; t3.moveNext$0();) {
+        method = t3.get$current();
+        if (!t7.add$1(0, method))
+          continue;
+        t5.observeArrayValue$3(t4, path, newValue, oldValue);
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(t4, method, [oldValue, newValue, t1, t6, t2], true, null);
+      }
+    }, "call$2", null, 4, 0, null, 82, 57, "call"],
+    $isFunction: true
+  },
+  Polymer_observeArrayValue_closure: {
+    "^": "Closure:13;this_0,old_1,callbacks_2",
+    call$1: [function(changes) {
+      var t1, t2, t3, callback;
+      for (t1 = J.get$iterator$ax(this.callbacks_2), t2 = this.this_0, t3 = this.old_1; t1.moveNext$0();) {
+        callback = t1.get$current();
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(t2, callback, [t3], true, null);
+      }
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  Polymer_addHostListeners_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(type, methodName) {
+      var t1 = this.this_0;
+      J.addEventListener$2$x(t1, type, J.get$syntax$x(t1.polymer$Polymer$_polymer$_element).getEventHandler$3(t1, t1, methodName));
+    },
+    $isFunction: true
+  },
+  _PolymerBinding: {
+    "^": "Bindable;_polymer$_target,_property,_polymer$_bindable,_sub,_lastValue",
+    _updateNode$1: [function(newValue) {
+      this._lastValue = newValue;
+      $.get$objectAccessor().write$3(this._polymer$_target, this._property, newValue);
+    }, "call$1", "get$_updateNode", 2, 0, 20, 58],
+    _propertyValueChanged$1: [function(records) {
+      var t1, t2, record, getter, newValue;
+      for (t1 = J.get$iterator$ax(records), t2 = this._property; t1.moveNext$0();) {
+        record = t1.get$current();
+        if (!!J.getInterceptor(record).$isPropertyChangeRecord && J.$eq(record.name, t2)) {
+          t1 = this._polymer$_target;
+          getter = $.get$objectAccessor()._getters.$index(0, t2);
+          if (getter == null)
+            H.throwExpression(O.MissingCodeException$("getter \"" + H.S(t2) + "\" in " + J.toString$0(t1)));
+          newValue = getter.call$1(t1);
+          t1 = this._lastValue;
+          if (t1 == null ? newValue != null : t1 !== newValue)
+            J.set$value$x(this._polymer$_bindable, newValue);
+          return;
+        }
+      }
+    }, "call$1", "get$_propertyValueChanged", 2, 0, 168, 160],
+    open$1: function(_, callback) {
+      return J.open$1$x(this._polymer$_bindable, callback);
+    },
+    get$value: function(_) {
+      return J.get$value$x(this._polymer$_bindable);
+    },
+    set$value: function(_, newValue) {
+      J.set$value$x(this._polymer$_bindable, newValue);
+      return newValue;
+    },
+    close$0: function(_) {
+      var t1 = this._sub;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._sub = null;
+      }
+      J.close$0$x(this._polymer$_bindable);
+    }
+  },
+  PolymerJob: {
+    "^": "Object;_callback,_timer,_polymer$_id",
+    _callback$0: function() {
+      return this._callback.call$0();
+    },
+    start$2: function(_, callback, wait) {
+      var t1;
+      this.stop$0(0);
+      this._callback = callback;
+      t1 = window;
+      C.Window_methods._ensureRequestAnimationFrame$0(t1);
+      this._polymer$_id = C.Window_methods._requestAnimationFrame$1(t1, W._wrapZone(new A.PolymerJob_start_closure(this)));
+    },
+    stop$0: function(_) {
+      var t1, t2;
+      t1 = this._polymer$_id;
+      if (t1 != null) {
+        t2 = window;
+        C.Window_methods._ensureRequestAnimationFrame$0(t2);
+        t2.cancelAnimationFrame(t1);
+        this._polymer$_id = null;
+      }
+      t1 = this._timer;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._timer = null;
+      }
+    }
+  },
+  PolymerJob_start_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      var t1 = this.this_0;
+      if (t1._timer != null || t1._polymer$_id != null) {
+        t1.stop$0(0);
+        t1._callback$0();
+      }
+      return;
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  initPolymer_closure: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.startPolymer($.initializers, $.deployMode);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _hookJsPolymer_closure: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      var t1 = $.get$Polymer__onReady().future;
+      if (t1._state !== 0)
+        H.throwExpression(P.StateError$("Future already completed"));
+      t1._asyncComplete$1(null);
+      return;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _hookJsPolymer_registerDart: {
+    "^": "Closure:173;zone_0,originalRegister_1",
+    call$3: [function(jsElem, $name, extendee) {
+      var type = $.get$_typesByName().$index(0, $name);
+      if (type != null)
+        return this.zone_0.run$1(new A._hookJsPolymer_registerDart_closure(jsElem, $name, type, $.get$_declarations().$index(0, extendee)));
+      return this.originalRegister_1.apply$2$thisArg([$name, extendee], jsElem);
+    }, "call$3", null, 6, 0, null, 171, 56, 172, "call"],
+    $isFunction: true
+  },
+  _hookJsPolymer_registerDart_closure: {
+    "^": "Closure:69;jsElem_2,name_3,type_4,extendsDecl_5",
+    call$0: [function() {
+      var t1, t2, t3, t4, t5, t6, t7, t8, t9, assetPath, base, targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery;
+      t1 = this.jsElem_2;
+      t2 = this.name_3;
+      t3 = this.type_4;
+      t4 = this.extendsDecl_5;
+      t5 = $.get$PolymerDeclaration__polymerSyntax();
+      t6 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      t7 = new A.PolymerDeclaration(t1, t3, t4, t2, null, null, null, null, null, null, null, t5, t6, null, null);
+      $.get$_declarations().$indexSet(0, t2, t7);
+      t7.publishAttributes$1(t4);
+      t8 = t7._polymer$_publish;
+      if (t8 != null)
+        t7._publishLC = t7._lowerCaseMap$1(t8);
+      t7.inferObservers$0();
+      t7.explodeObservers$0();
+      t8 = J.getInterceptor$x(t1);
+      t9 = t8.querySelector$1(t1, "template");
+      if (t9 != null)
+        J.set$bindingDelegate$x(!!J.getInterceptor(t9).$isNodeBindExtension ? t9 : M.nodeBindFallback(t9), t5);
+      t7.cacheSheets$0();
+      t7.cacheStyles$0();
+      t7.installLocalSheets$0();
+      A.Polymer_applyStyleToScope(t7.cssTextToScopeStyle$2(t7.cssTextForScope$1("global"), "global"), document.head);
+      t7.resolveElementPaths$1(t1);
+      t7.accumulateInstanceAttributes$0();
+      t7.addAttributeDelegates$1(t6);
+      assetPath = t8.get$attributes(t1)._html$_element.getAttribute("assetpath");
+      if (assetPath == null)
+        assetPath = "";
+      base = P.Uri_parse(t8.get$ownerDocument(t1).baseURI);
+      t1 = P.Uri_parse(assetPath);
+      targetScheme = t1.scheme;
+      if (targetScheme !== "") {
+        targetUserInfo = t1.userInfo;
+        targetHost = t1.get$host(t1);
+        targetPort = t1.get$port(t1);
+        targetPath = base._removeDotSegments$1(t1._path);
+        targetQuery = t1.query;
+      } else {
+        if (t1.get$host(t1) !== "") {
+          targetUserInfo = t1.userInfo;
+          targetHost = t1.get$host(t1);
+          targetPort = t1.get$port(t1);
+          targetPath = base._removeDotSegments$1(t1._path);
+          targetQuery = t1.query;
+        } else {
+          t5 = t1._path;
+          if (t5 === "") {
+            targetPath = base._path;
+            targetQuery = t1.query;
+            targetQuery = targetQuery !== "" ? targetQuery : base.query;
+          } else {
+            t5 = J.startsWith$1$s(t5, "/");
+            t6 = t1._path;
+            targetPath = t5 ? base._removeDotSegments$1(t6) : base._removeDotSegments$1(base._merge$2(base._path, t6));
+            targetQuery = t1.query;
+          }
+          targetUserInfo = base.userInfo;
+          targetHost = base.get$host(base);
+          targetPort = base.get$port(base);
+        }
+        targetScheme = base.scheme;
+      }
+      t7._rootUri = P.Uri$(t1.fragment, targetHost, targetPath, null, targetPort, targetQuery, null, targetScheme, targetUserInfo);
+      t1 = t7.get$templateContent();
+      A._shimShadowDomStyling(t1, t2, t4 != null ? J.get$name$x(t4) : null);
+      if ($.get$typeInspector().hasStaticMethod$2(t3, C.Symbol_registerCallback))
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(t3, C.Symbol_registerCallback, [t7], false, null);
+      t7.registerType$1(t2);
+      return;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  closure: {
+    "^": "Closure:69;",
+    call$0: function() {
+      var proto = J.$index$asx(P.JsObject_JsObject$fromBrowserObject(document.createElement("polymer-element", null)), "__proto__");
+      return !!J.getInterceptor(proto).$isNode ? P.JsObject_JsObject$fromBrowserObject(proto) : proto;
+    },
+    $isFunction: true
+  }
+}],
+["polymer.auto_binding", "package:polymer/auto_binding.dart", , Y, {
+  "^": "",
+  AutoBindingElement: {
+    "^": "TemplateElement_Polymer_Observable;_auto_binding$_self,observable$Observable$_observable$_changes,observable$Observable$_values,observable$Observable$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$model: function(receiver) {
+      return J.get$model$x(receiver._auto_binding$_self);
+    },
+    get$bindingDelegate: function(receiver) {
+      return J.get$bindingDelegate$x(receiver._auto_binding$_self);
+    },
+    set$bindingDelegate: function(receiver, value) {
+      J.set$bindingDelegate$x(receiver._auto_binding$_self, value);
+    },
+    clear$0: function(receiver) {
+      return J.clear$0$ax(receiver._auto_binding$_self);
+    },
+    get$syntax: function(receiver) {
+      return J.get$bindingDelegate$x(receiver._auto_binding$_self);
+    },
+    createInstance$2: function(receiver, model, delegate) {
+      return J.createInstance$2$x(receiver._auto_binding$_self, model, delegate);
+    },
+    AutoBindingElement$created$0: function(receiver) {
+      var t1;
+      this.polymerCreated$0(receiver);
+      receiver._auto_binding$_self = M.nodeBindFallback(receiver);
+      t1 = T.PolymerExpressions$(null, C.C_ScopeFactory);
+      J.set$bindingDelegate$x(receiver._auto_binding$_self, new Y._AutoBindingSyntax(receiver, t1, null));
+      $.get$Polymer__onReady().future.then$1(new Y.AutoBindingElement$created_closure(receiver));
+    },
+    $isTemplateBindExtension: true,
+    $isNodeBindExtension: true,
+    static: {AutoBindingElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.AutoBindingElement_methods.Element$created$0(receiver);
+        C.AutoBindingElement_methods.AutoBindingElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  TemplateElement_Polymer: {
+    "^": "TemplateElement+Polymer;_jsElem:polymer$Polymer$_jsElem=",
+    $isPolymer: true,
+    $isNodeBindExtension: true,
+    $isObservable: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true
+  },
+  TemplateElement_Polymer_Observable: {
+    "^": "TemplateElement_Polymer+Observable;_observable$_changes:observable$Observable$_observable$_changes%,_values:observable$Observable$_values%,_records:observable$Observable$_records%",
+    $isObservable: true
+  },
+  AutoBindingElement$created_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      var t1 = this.this_0;
+      t1.setAttribute("bind", "");
+      J.async$1$x(t1, new Y.AutoBindingElement$created__closure(t1));
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  AutoBindingElement$created__closure: {
+    "^": "Closure:13;this_1",
+    call$1: [function(_) {
+      var t1, t2;
+      t1 = this.this_1;
+      t2 = J.getInterceptor$x(t1);
+      t2.marshalNodeReferences$1(t1, t1.parentNode);
+      t2.fire$1(t1, "template-bound");
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  _AutoBindingSyntax: {
+    "^": "PolymerExpressions;_auto_binding$_node,_delegate,_bindingMaps",
+    getEventHandler$3: function(controller, target, method) {
+      var t1 = {};
+      t1.controller_0 = controller;
+      return new Y._AutoBindingSyntax_getEventHandler_closure(t1, this, method);
+    }
+  },
+  _AutoBindingSyntax_getEventHandler_closure: {
+    "^": "Closure:13;box_0,this_1,method_2",
+    call$1: [function(e) {
+      var t1, t2, controller, t3, obj, t4;
+      t1 = this.box_0;
+      t2 = t1.controller_0;
+      if (t2 == null || !J.getInterceptor(t2).$isPolymer) {
+        controller = this.this_1._auto_binding$_node;
+        t1.controller_0 = controller;
+        t2 = controller;
+      }
+      t3 = J.getInterceptor(t2);
+      if (!!t3.$isPolymer) {
+        t2 = J.getInterceptor$x(e);
+        t3 = t2.get$detail(e);
+        t2 = t2.get$currentTarget(e);
+        obj = t1.controller_0;
+        t4 = this.this_1._auto_binding$_node;
+        if (obj === t4)
+          obj = J.get$model$x(t4._auto_binding$_self);
+        J.dispatchMethod$3$x(t1.controller_0, obj, this.method_2, [e, t3, t2]);
+      } else
+        throw H.wrapException(P.StateError$("controller " + t3.toString$0(t2) + " is not a Dart polymer-element."));
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  }
+}],
+["polymer.deserialize", "package:polymer/deserialize.dart", , Z, {
+  "^": "",
+  deserializeValue: function(value, currentValue, type) {
+    var handler, t1, exception;
+    handler = $.get$_typeHandlers().$index(0, type);
+    if (handler != null)
+      return handler.call$2(value, currentValue);
+    try {
+      t1 = C.JsonCodec_null_null.decode$1(J.replaceAll$2$s(value, "'", "\""));
+      return t1;
+    } catch (exception) {
+      H.unwrapException(exception);
+      return value;
+    }
+
+  },
+  closure0: {
+    "^": "Closure:75;",
+    call$2: function(x, _) {
+      return x;
+    },
+    $isFunction: true
+  },
+  closure1: {
+    "^": "Closure:75;",
+    call$2: function(x, _) {
+      return x;
+    },
+    $isFunction: true
+  },
+  closure2: {
+    "^": "Closure:75;",
+    call$2: function(x, def) {
+      var t1, exception;
+      try {
+        t1 = P.DateTime_parse(x);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return def;
+      }
+
+    },
+    $isFunction: true
+  },
+  closure3: {
+    "^": "Closure:75;",
+    call$2: function(x, _) {
+      return !J.$eq(x, "false");
+    },
+    $isFunction: true
+  },
+  closure4: {
+    "^": "Closure:75;",
+    call$2: function(x, def) {
+      return H.Primitives_parseInt(x, null, new Z._closure0(def));
+    },
+    $isFunction: true
+  },
+  _closure0: {
+    "^": "Closure:13;def_0",
+    call$1: function(_) {
+      return this.def_0;
+    },
+    $isFunction: true
+  },
+  closure5: {
+    "^": "Closure:75;",
+    call$2: function(x, def) {
+      return H.Primitives_parseDouble(x, new Z._closure(def));
+    },
+    $isFunction: true
+  },
+  _closure: {
+    "^": "Closure:13;def_1",
+    call$1: function(_) {
+      return this.def_1;
+    },
+    $isFunction: true
+  }
+}],
+["polymer_expressions", "package:polymer_expressions/polymer_expressions.dart", , T, {
+  "^": "",
+  _classAttributeConverter: [function(v) {
+    var t1 = J.getInterceptor(v);
+    if (!!t1.$isMap)
+      t1 = J.where$1$ax(v.get$keys(), new T._classAttributeConverter_closure(v)).join$1(0, " ");
+    else
+      t1 = !!t1.$isIterable ? t1.join$1(v, " ") : v;
+    return t1;
+  }, "call$1", "_classAttributeConverter$closure", 2, 0, 49, 64],
+  _styleAttributeConverter: [function(v) {
+    var t1 = J.getInterceptor(v);
+    if (!!t1.$isMap)
+      t1 = J.map$1$ax(v.get$keys(), new T._styleAttributeConverter_closure(v)).join$1(0, ";");
+    else
+      t1 = !!t1.$isIterable ? t1.join$1(v, ";") : v;
+    return t1;
+  }, "call$1", "_styleAttributeConverter$closure", 2, 0, 49, 64],
+  _identity: [function(x) {
+    return x;
+  }, "call$1", "_identity$closure", 2, 0, 13, 65],
+  _classAttributeConverter_closure: {
+    "^": "Closure:13;v_0",
+    call$1: function(k) {
+      return J.$eq(this.v_0.$index(0, k), true);
+    },
+    $isFunction: true
+  },
+  _styleAttributeConverter_closure: {
+    "^": "Closure:13;v_0",
+    call$1: [function(k) {
+      return H.S(k) + ": " + H.S(this.v_0.$index(0, k));
+    }, "call$1", null, 2, 0, null, 174, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions0: {
+    "^": "BindingDelegate;_scopeFactory,globals,_scopes,_scopeIdents,_bindingMaps",
+    prepareBinding$3: function(path, $name, boundNode) {
+      var t1, t2, t3, expr;
+      t1 = {};
+      t2 = new Y.Tokenizer(H.setRuntimeTypeInfo([], [Y.Token]), P.StringBuffer$(""), new P.RuneIterator(path, 0, 0, null), null);
+      t3 = new U.AstFactory();
+      t3 = new T.Parser(t3, t2, null, null);
+      t2 = t2.tokenize$0();
+      t3._tokens = t2;
+      t3._parser$_iterator = H.setRuntimeTypeInfo(new H.ListIterator(t2, t2.length, 0, null), [H.getTypeArgumentByIndex(t2, 0)]);
+      t3._advance$0();
+      expr = t3._parseExpression$0();
+      if (M.isSemanticTemplate(boundNode)) {
+        t2 = J.getInterceptor($name);
+        t2 = t2.$eq($name, "bind") || t2.$eq($name, "repeat");
+      } else
+        t2 = false;
+      if (t2) {
+        t1 = J.getInterceptor(expr);
+        if (!!t1.$isHasIdentifier)
+          return new T.PolymerExpressions_prepareBinding_closure(this, expr.get$identifier(), t1.get$expr(expr));
+        else
+          return new T.PolymerExpressions_prepareBinding_closure0(this, expr);
+      }
+      t1.converter_0 = null;
+      t2 = !!J.getInterceptor(boundNode).$isElement;
+      if (t2 && J.$eq($name, "class"))
+        t1.converter_0 = T._classAttributeConverter$closure();
+      else if (t2 && J.$eq($name, "style"))
+        t1.converter_0 = T._styleAttributeConverter$closure();
+      return new T.PolymerExpressions_prepareBinding_closure1(t1, this, expr);
+    },
+    prepareInstanceModel$1: function(template) {
+      var ident = this._scopeIdents.$index(0, template);
+      if (ident == null)
+        return new T.PolymerExpressions_prepareInstanceModel_closure(this, template);
+      return new T.PolymerExpressions_prepareInstanceModel_closure0(this, template, ident);
+    },
+    _getParentScope$1: function(node) {
+      var t1, $parent, templateExtension, templateInstance, model;
+      t1 = J.getInterceptor$x(node);
+      $parent = t1.get$parentNode(node);
+      if ($parent == null)
+        return;
+      if (M.isSemanticTemplate(node)) {
+        templateExtension = !!t1.$isNodeBindExtension ? node : M.nodeBindFallback(node);
+        t1 = J.getInterceptor$x(templateExtension);
+        templateInstance = t1.get$templateInstance(templateExtension);
+        model = templateInstance == null ? t1.get$model(templateExtension) : templateInstance.model;
+        if (!!J.getInterceptor(model).$isScope)
+          return model;
+        else
+          return this._scopes.$index(0, node);
+      }
+      return this._getParentScope$1($parent);
+    },
+    _getScopeForModel$2: function(node, model) {
+      var t1, t2;
+      if (node == null)
+        return K.Scope_Scope(model, this.globals);
+      t1 = J.getInterceptor(node);
+      if (!!t1.$isElement)
+        ;
+      if (!!J.getInterceptor(model).$isScope)
+        return model;
+      t2 = this._scopes;
+      if (t2.$index(0, node) != null) {
+        t2.$index(0, node);
+        return t2.$index(0, node);
+      } else if (t1.get$parentNode(node) != null)
+        return this._getContainingScope$2(t1.get$parentNode(node), model);
+      else {
+        if (!M.isSemanticTemplate(node))
+          throw H.wrapException("expected a template instead of " + H.S(node));
+        return this._getContainingScope$2(node, model);
+      }
+    },
+    _getContainingScope$2: function(node, model) {
+      var templateExtension, t1, scope;
+      if (M.isSemanticTemplate(node)) {
+        templateExtension = !!J.getInterceptor(node).$isNodeBindExtension ? node : M.nodeBindFallback(node);
+        t1 = J.getInterceptor$x(templateExtension);
+        if (t1.get$templateInstance(templateExtension) == null)
+          t1.get$model(templateExtension);
+        return this._scopes.$index(0, node);
+      } else {
+        t1 = J.getInterceptor$x(node);
+        if (t1.get$parent(node) == null) {
+          scope = this._scopes.$index(0, node);
+          return scope != null ? scope : K.Scope_Scope(model, this.globals);
+        } else
+          return this._getContainingScope$2(t1.get$parentNode(node), model);
+      }
+    },
+    static: {"^": "PolymerExpressions_DEFAULT_GLOBALS", PolymerExpressions$: function(globals, scopeFactory) {
+        var t1, t2, t3;
+        t1 = H.setRuntimeTypeInfo(new P.Expando(null), [K.Scope]);
+        t2 = H.setRuntimeTypeInfo(new P.Expando(null), [P.String]);
+        t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Object);
+        t3.addAll$1(0, C.Map_wgEsG);
+        return new T.PolymerExpressions0(scopeFactory, t3, t1, t2, null);
+      }}
+  },
+  PolymerExpressions_prepareBinding_closure: {
+    "^": "Closure:175;this_1,identifier_2,bindExpr_3",
+    call$3: [function(model, node, oneTime) {
+      var t1, scope;
+      t1 = this.this_1;
+      t1._scopeIdents.$indexSet(0, node, this.identifier_2);
+      scope = !!J.getInterceptor(model).$isScope ? model : K.Scope_Scope(model, t1.globals);
+      t1._scopes.$indexSet(0, node, scope);
+      t1 = T._identity$closure();
+      return new T._Binding(scope, t1, this.bindExpr_3, null, null, null, null);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareBinding_closure0: {
+    "^": "Closure:175;this_4,expr_5",
+    call$3: [function(model, node, oneTime) {
+      var t1, scope;
+      t1 = this.this_4;
+      scope = !!J.getInterceptor(model).$isScope ? model : K.Scope_Scope(model, t1.globals);
+      t1._scopes.$indexSet(0, node, scope);
+      if (oneTime === true)
+        return T._Binding__oneTime(this.expr_5, scope, null);
+      t1 = T._identity$closure();
+      return new T._Binding(scope, t1, this.expr_5, null, null, null, null);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareBinding_closure1: {
+    "^": "Closure:175;box_0,this_6,expr_7",
+    call$3: [function(model, node, oneTime) {
+      var scope, t1;
+      scope = this.this_6._getScopeForModel$2(node, model);
+      if (oneTime === true)
+        return T._Binding__oneTime(this.expr_7, scope, this.box_0.converter_0);
+      t1 = this.box_0.converter_0;
+      if (t1 == null)
+        t1 = T._identity$closure();
+      return new T._Binding(scope, t1, this.expr_7, null, null, null, null);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareInstanceModel_closure: {
+    "^": "Closure:13;this_0,template_1",
+    call$1: [function(model) {
+      var t1, t2, existingScope;
+      t1 = this.this_0;
+      t2 = this.template_1;
+      existingScope = t1._scopes.$index(0, t2);
+      if (existingScope != null) {
+        if (J.$eq(model, J.get$model$x(existingScope)))
+          return existingScope;
+        return K.Scope_Scope(model, t1.globals);
+      } else
+        return t1._getScopeForModel$2(t2, model);
+    }, "call$1", null, 2, 0, null, 162, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareInstanceModel_closure0: {
+    "^": "Closure:13;this_2,template_3,ident_4",
+    call$1: [function(model) {
+      var t1, t2, existingScope, t3;
+      t1 = this.this_2;
+      t2 = this.template_3;
+      existingScope = t1._scopes.$index(0, t2);
+      t3 = this.ident_4;
+      if (existingScope != null)
+        return existingScope.childScope$2(t3, model);
+      else
+        return t1._getParentScope$1(t2).childScope$2(t3, model);
+    }, "call$1", null, 2, 0, null, 162, "call"],
+    $isFunction: true
+  },
+  _Binding: {
+    "^": "Bindable;_scope,_converter,_polymer_expressions$_expr,_polymer_expressions$_callback,_polymer_expressions$_sub,_observer,_polymer_expressions$_value",
+    _converter$1: function(arg0) {
+      return this._converter.call$1(arg0);
+    },
+    _polymer_expressions$_callback$1: function(arg0) {
+      return this._polymer_expressions$_callback.call$1(arg0);
+    },
+    _polymer_expressions$_check$2$skipChanges: [function(v, skipChanges) {
+      var oldValue, t1;
+      oldValue = this._polymer_expressions$_value;
+      t1 = this._converter$1(v);
+      this._polymer_expressions$_value = t1;
+      if (skipChanges !== true && this._polymer_expressions$_callback != null && !J.$eq(oldValue, t1))
+        this._polymer_expressions$_callback$1(this._polymer_expressions$_value);
+    }, function(v) {
+      return this._polymer_expressions$_check$2$skipChanges(v, false);
+    }, "_polymer_expressions$_check$1", "call$2$skipChanges", "call$1", "get$_polymer_expressions$_check", 2, 3, 176, 177, 64, 178],
+    get$value: function(_) {
+      if (this._polymer_expressions$_callback != null)
+        return this._polymer_expressions$_value;
+      return T._Binding__oneTime(this._polymer_expressions$_expr, this._scope, this._converter);
+    },
+    set$value: function(_, v) {
+      var newValue, e, s, exception, t1;
+      try {
+        newValue = K.assign(this._polymer_expressions$_expr, v, this._scope, false);
+        this._polymer_expressions$_check$2$skipChanges(newValue, true);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(this._polymer_expressions$_expr) + "': " + H.S(e), s);
+      }
+
+    },
+    open$1: function(_, callback) {
+      var e, s, t1, observer, exception;
+      if (this._polymer_expressions$_callback != null)
+        throw H.wrapException(P.StateError$("already open"));
+      this._polymer_expressions$_callback = callback;
+      t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [null]);
+      t1.ListQueue$1(null, null);
+      observer = this._polymer_expressions$_expr.accept$1(0, new K.ObserverBuilder(t1));
+      this._observer = observer;
+      t1 = observer.get$onUpdate().listen$1(this.get$_polymer_expressions$_check());
+      t1.onError$1(0, new T._Binding_open_closure(this));
+      this._polymer_expressions$_sub = t1;
+      try {
+        t1 = this._observer;
+        J.accept$1$x(t1, new K.Updater(this._scope));
+        t1.get$currentValue();
+        this._polymer_expressions$_check$2$skipChanges(this._observer.get$currentValue(), true);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(this._observer) + "': " + H.S(e), s);
+      }
+
+      return this._polymer_expressions$_value;
+    },
+    close$0: function(_) {
+      var t1, t2;
+      if (this._polymer_expressions$_callback == null)
+        return;
+      this._polymer_expressions$_sub.cancel$0();
+      this._polymer_expressions$_sub = null;
+      this._polymer_expressions$_callback = null;
+      t1 = $.get$Closer__instance();
+      t2 = this._observer;
+      t1.toString;
+      J.accept$1$x(t2, t1);
+      this._observer = null;
+    },
+    static: {_Binding__oneTime: function(expr, scope, converter) {
+        var value, e, s, t1, exception;
+        try {
+          value = J.accept$1$x(expr, new K.EvalVisitor(scope));
+          t1 = converter == null ? value : converter.call$1(value);
+          return t1;
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          s = new H._StackTrace(exception, null);
+          H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(expr) + "': " + H.S(e), s);
+        }
+
+        return;
+      }}
+  },
+  _Binding_open_closure: {
+    "^": "Closure:75;this_0",
+    call$2: [function(e, s) {
+      H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(this.this_0._observer) + "': " + H.S(e), s);
+    }, "call$2", null, 4, 0, null, 1, 142, "call"],
+    $isFunction: true
+  },
+  ScopeFactory: {
+    "^": "Object;"
+  }
+}],
+["polymer_expressions.async", "package:polymer_expressions/async.dart", , B, {
+  "^": "",
+  StreamBinding: {
+    "^": "ObservableBox;stream,_observable_box$_value,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    StreamBinding$1: function(stream, $T) {
+      this.stream.listen$1(new B.StreamBinding_closure($T, this));
+    },
+    $asObservableBox: function($T) {
+      return [null];
+    },
+    static: {StreamBinding$: function(stream, $T) {
+        var t1 = H.setRuntimeTypeInfo(new B.StreamBinding(stream, null, null, null), [$T]);
+        t1.StreamBinding$1(stream, $T);
+        return t1;
+      }}
+  },
+  StreamBinding_closure: {
+    "^": "Closure;T_0,this_1",
+    call$1: [function(i) {
+      var t1 = this.this_1;
+      t1._observable_box$_value = F.notifyPropertyChangeHelper(t1, C.Symbol_value, t1._observable_box$_value, i);
+    }, "call$1", null, 2, 0, null, 82, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T0", args: [T]};
+      }, this.this_1, "StreamBinding");
+    }
+  }
+}],
+["polymer_expressions.eval", "package:polymer_expressions/eval.dart", , K, {
+  "^": "",
+  assign: function(expr, value, scope, checkAssignability) {
+    var filters, t1, property, expression, isIndex, filterExpr, o;
+    filters = H.setRuntimeTypeInfo([], [U.Expression]);
+    for (; t1 = J.getInterceptor(expr), !!t1.$isBinaryOperator;) {
+      if (!J.$eq(t1.get$operator(expr), "|"))
+        break;
+      filters.push(t1.get$right(expr));
+      expr = t1.get$left(expr);
+    }
+    if (!!t1.$isIdentifier) {
+      property = t1.get$value(expr);
+      expression = C.C_EmptyExpression;
+      isIndex = false;
+    } else if (!!t1.$isIndex) {
+      expression = expr.get$receiver();
+      property = expr.get$argument();
+      isIndex = true;
+    } else {
+      if (!!t1.$isGetter) {
+        expression = expr.get$receiver();
+        property = t1.get$name(expr);
+      } else {
+        if (checkAssignability)
+          throw H.wrapException(K.EvalException$("Expression is not assignable: " + H.S(expr)));
+        return;
+      }
+      isIndex = false;
+    }
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(filters, filters.length, 0, null), [H.getTypeArgumentByIndex(filters, 0)]); t1.moveNext$0();) {
+      filterExpr = t1._current;
+      J.accept$1$x(filterExpr, new K.EvalVisitor(scope));
+      if (checkAssignability)
+        throw H.wrapException(K.EvalException$("filter must implement Transformer to be assignable: " + H.S(filterExpr)));
+      else
+        return;
+    }
+    o = J.accept$1$x(expression, new K.EvalVisitor(scope));
+    if (o == null)
+      return;
+    if (isIndex)
+      J.$indexSet$ax(o, J.accept$1$x(property, new K.EvalVisitor(scope)), value);
+    else {
+      t1 = $.get$symbolConverter()._symbols.$index(0, property);
+      $.get$objectAccessor().write$3(o, t1, value);
+    }
+    return value;
+  },
+  Scope_Scope: function(model, variables) {
+    var scope, t1, t2;
+    scope = new K._ModelScope(model);
+    if (variables == null)
+      t1 = scope;
+    else {
+      t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Object);
+      t1.addAll$1(0, variables);
+      t2 = new K._GlobalsScope(scope, t1);
+      if (t1.containsKey$1("this"))
+        H.throwExpression(K.EvalException$("'this' cannot be used as a variable name."));
+      t1 = t2;
+    }
+    return t1;
+  },
+  closure14: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$add$ns(a, b);
+    },
+    $isFunction: true
+  },
+  closure15: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$sub$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure16: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$mul$ns(a, b);
+    },
+    $isFunction: true
+  },
+  closure17: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$div$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure18: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$mod$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure19: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$eq(a, b);
+    },
+    $isFunction: true
+  },
+  closure20: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return !J.$eq(a, b);
+    },
+    $isFunction: true
+  },
+  closure21: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a == null ? b == null : a === b;
+    },
+    $isFunction: true
+  },
+  closure22: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a == null ? b != null : a !== b;
+    },
+    $isFunction: true
+  },
+  closure23: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$gt$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure24: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$ge$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure25: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$lt$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure26: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$le$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure27: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a === true || b === true;
+    },
+    $isFunction: true
+  },
+  closure28: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a === true && b === true;
+    },
+    $isFunction: true
+  },
+  closure29: {
+    "^": "Closure:75;",
+    call$2: function(a, f) {
+      var t1 = H.buildInterfaceType(P.Object);
+      t1 = H.buildFunctionType(t1, [t1])._isTest$1(f);
+      if (t1)
+        return f.call$1(a);
+      throw H.wrapException(K.EvalException$("Filters must be a one-argument function."));
+    },
+    $isFunction: true
+  },
+  closure11: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return a;
+    },
+    $isFunction: true
+  },
+  closure12: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return J.$negate$n(a);
+    },
+    $isFunction: true
+  },
+  closure13: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return a !== true;
+    },
+    $isFunction: true
+  },
+  Scope: {
+    "^": "Object;",
+    $indexSet: function(_, $name, value) {
+      throw H.wrapException(P.UnsupportedError$("[]= is not supported in Scope."));
+    },
+    childScope$2: function($name, value) {
+      if (J.$eq($name, "this"))
+        H.throwExpression(K.EvalException$("'this' cannot be used as a variable name."));
+      return new K._LocalVariableScope(this, $name, value);
+    },
+    $isScope: true,
+    $isIndexable: true,
+    $asIndexable: function() {
+      return [P.String, P.Object];
+    }
+  },
+  _ModelScope: {
+    "^": "Scope;model>",
+    $index: function(_, $name) {
+      var symbol, t1;
+      if (J.$eq($name, "this"))
+        return this.model;
+      symbol = $.get$symbolConverter()._symbols.$index(0, $name);
+      t1 = this.model;
+      if (t1 == null || symbol == null)
+        throw H.wrapException(K.EvalException$("variable '" + H.S($name) + "' not found"));
+      t1 = $.get$objectAccessor().read$2(t1, symbol);
+      return !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+    },
+    _isModelProperty$1: function($name) {
+      return !J.$eq($name, "this");
+    },
+    toString$0: function(_) {
+      return "[model: " + H.S(this.model) + "]";
+    }
+  },
+  _LocalVariableScope: {
+    "^": "Scope;parent>,varName,value>",
+    get$model: function(_) {
+      var t1 = this.parent;
+      t1 = t1.get$model(t1);
+      return t1;
+    },
+    $index: function(_, $name) {
+      var t1;
+      if (J.$eq(this.varName, $name)) {
+        t1 = this.value;
+        return !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+      }
+      return this.parent.$index(0, $name);
+    },
+    _isModelProperty$1: function($name) {
+      if (J.$eq(this.varName, $name))
+        return false;
+      return this.parent._isModelProperty$1($name);
+    },
+    toString$0: function(_) {
+      return this.parent.toString$0(0) + " > [local: " + H.S(this.varName) + "]";
+    }
+  },
+  _GlobalsScope: {
+    "^": "Scope;parent>,variables<",
+    get$model: function(_) {
+      return this.parent.model;
+    },
+    $index: function(_, $name) {
+      var t1 = this.variables;
+      if (t1.containsKey$1($name)) {
+        t1 = t1.$index(0, $name);
+        return !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+      }
+      return this.parent.$index(0, $name);
+    },
+    _isModelProperty$1: function($name) {
+      if (this.variables.containsKey$1($name))
+        return false;
+      return !J.$eq($name, "this");
+    },
+    toString$0: function(_) {
+      var t1 = this.variables;
+      return "[model: " + H.S(this.parent.model) + "] > [global: " + P.IterableBase_iterableToShortString(H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(t1), [H.getTypeArgumentByIndex(t1, 0)]), "(", ")") + "]";
+    }
+  },
+  ExpressionObserver: {
+    "^": "Object;_parent?,_eval$_value<",
+    get$onUpdate: function() {
+      var t1 = this._eval$_controller;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$currentValue: function() {
+      return this._eval$_value;
+    },
+    _updateSelf$1: function(scope) {
+    },
+    _invalidate$1: function(scope) {
+      var t1;
+      this._eval$_observe$1(0, scope);
+      t1 = this._parent;
+      if (t1 != null)
+        t1._invalidate$1(scope);
+    },
+    _eval$_unobserve$0: function() {
+      var t1 = this._eval$_subscription;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._eval$_subscription = null;
+      }
+    },
+    _eval$_observe$1: function(_, scope) {
+      var _oldValue, t1, t2;
+      this._eval$_unobserve$0();
+      _oldValue = this._eval$_value;
+      this._updateSelf$1(scope);
+      t1 = this._eval$_value;
+      if (t1 == null ? _oldValue != null : t1 !== _oldValue) {
+        t2 = this._eval$_controller;
+        if (t2._state >= 4)
+          H.throwExpression(t2._addEventError$0());
+        t2._sendData$1(t1);
+      }
+    },
+    toString$0: function(_) {
+      return this._eval$_expr.toString$0(0);
+    },
+    $isExpression: true
+  },
+  Updater: {
+    "^": "RecursiveVisitor;scope",
+    visitExpression$1: function(e) {
+      e._eval$_observe$1(0, this.scope);
+    }
+  },
+  Closer: {
+    "^": "RecursiveVisitor;",
+    visitExpression$1: function(e) {
+      e._eval$_unobserve$0();
+    },
+    static: {"^": "Closer__instance"}
+  },
+  EvalVisitor: {
+    "^": "Visitor;scope",
+    visitEmptyExpression$1: function(e) {
+      return J.get$model$x(this.scope);
+    },
+    visitParenthesizedExpression$1: function(e) {
+      return e.child.accept$1(0, this);
+    },
+    visitGetter$1: function(g) {
+      var receiver, t1, symbol;
+      receiver = J.accept$1$x(g.get$receiver(), this);
+      if (receiver == null)
+        return;
+      t1 = g.get$name(g);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      return $.get$objectAccessor().read$2(receiver, symbol);
+    },
+    visitIndex$1: function(i) {
+      var receiver = J.accept$1$x(i.get$receiver(), this);
+      if (receiver == null)
+        return;
+      return J.$index$asx(receiver, J.accept$1$x(i.get$argument(), this));
+    },
+    visitInvoke$1: function(i) {
+      var receiver, args, t1, t2, symbol;
+      receiver = J.accept$1$x(i.get$receiver(), this);
+      if (receiver == null)
+        return;
+      if (i.get$arguments() == null)
+        args = null;
+      else {
+        t1 = i.get$arguments();
+        t2 = this.get$visit();
+        t1.toString;
+        args = H.setRuntimeTypeInfo(new H.MappedListIterable(t1, t2), [null, null]).toList$1$growable(0, false);
+      }
+      if (i.get$method(i) == null)
+        return H.Primitives_applyFunction(receiver, args, P.Function__toMangledNames(null));
+      t1 = i.get$method(i);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      return $.get$objectAccessor().invoke$5$adjust$namedArgs(receiver, symbol, args, false, null);
+    },
+    visitLiteral$1: function(l) {
+      return l.get$value(l);
+    },
+    visitListLiteral$1: function(l) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(l.get$items(), this.get$visit()), [null, null]).toList$0(0);
+    },
+    visitMapLiteral$1: function(l) {
+      var map, t1, entry;
+      map = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      for (t1 = l.get$entries(l), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        entry = t1._current;
+        map.$indexSet(0, J.accept$1$x(J.get$key$x(entry), this), J.accept$1$x(entry.get$entryValue(), this));
+      }
+      return map;
+    },
+    visitMapLiteralEntry$1: function(e) {
+      return H.throwExpression(P.UnsupportedError$("should never be called"));
+    },
+    visitIdentifier$1: function(i) {
+      return J.$index$asx(this.scope, i.get$value(i));
+    },
+    visitBinaryOperator$1: function(o) {
+      var operator, left, right, f, t1;
+      operator = o.get$operator(o);
+      left = J.accept$1$x(o.get$left(o), this);
+      right = J.accept$1$x(o.get$right(o), this);
+      f = $.get$_BINARY_OPERATORS().$index(0, operator);
+      t1 = J.getInterceptor(operator);
+      if (t1.$eq(operator, "&&") || t1.$eq(operator, "||")) {
+        t1 = left == null ? false : left;
+        return f.call$2(t1, right == null ? false : right);
+      } else if (t1.$eq(operator, "==") || t1.$eq(operator, "!="))
+        return f.call$2(left, right);
+      else if (left == null || right == null)
+        return;
+      return f.call$2(left, right);
+    },
+    visitUnaryOperator$1: function(o) {
+      var expr, f;
+      expr = J.accept$1$x(o.get$child(), this);
+      f = $.get$_UNARY_OPERATORS().$index(0, o.get$operator(o));
+      if (J.$eq(o.get$operator(o), "!"))
+        return f.call$1(expr == null ? false : expr);
+      return expr == null ? null : f.call$1(expr);
+    },
+    visitTernaryOperator$1: function(o) {
+      return J.$eq(J.accept$1$x(o.get$condition(), this), true) ? J.accept$1$x(o.get$trueExpr(), this) : J.accept$1$x(o.get$falseExpr(), this);
+    },
+    visitInExpression$1: function(i) {
+      return H.throwExpression(P.UnsupportedError$("can't eval an 'in' expression"));
+    },
+    visitAsExpression$1: function(i) {
+      return H.throwExpression(P.UnsupportedError$("can't eval an 'as' expression"));
+    }
+  },
+  ObserverBuilder: {
+    "^": "Visitor;parents",
+    visitEmptyExpression$1: function(e) {
+      return new K.EmptyObserver(e, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+    },
+    visitParenthesizedExpression$1: function(e) {
+      return e.child.accept$1(0, this);
+    },
+    visitGetter$1: function(g) {
+      var receiver, getter;
+      receiver = J.accept$1$x(g.get$receiver(), this);
+      getter = new K.GetterObserver(receiver, g, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      receiver.set$_parent(getter);
+      return getter;
+    },
+    visitIndex$1: function(i) {
+      var receiver, arg, index;
+      receiver = J.accept$1$x(i.get$receiver(), this);
+      arg = J.accept$1$x(i.get$argument(), this);
+      index = new K.IndexObserver(receiver, arg, i, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      receiver.set$_parent(index);
+      arg.set$_parent(index);
+      return index;
+    },
+    visitInvoke$1: function(i) {
+      var receiver, args, t1, t2, invoke;
+      receiver = J.accept$1$x(i.get$receiver(), this);
+      if (i.get$arguments() == null)
+        args = null;
+      else {
+        t1 = i.get$arguments();
+        t2 = this.get$visit();
+        t1.toString;
+        args = H.setRuntimeTypeInfo(new H.MappedListIterable(t1, t2), [null, null]).toList$1$growable(0, false);
+      }
+      invoke = new K.InvokeObserver(receiver, args, i, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      receiver.set$_parent(invoke);
+      if (args != null)
+        H.IterableMixinWorkaround_forEach(args, new K.ObserverBuilder_visitInvoke_closure(invoke));
+      return invoke;
+    },
+    visitLiteral$1: function(l) {
+      return new K.LiteralObserver(l, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+    },
+    visitListLiteral$1: function(l) {
+      var items, list;
+      items = H.setRuntimeTypeInfo(new H.MappedListIterable(l.get$items(), this.get$visit()), [null, null]).toList$1$growable(0, false);
+      list = new K.ListLiteralObserver(items, l, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      H.IterableMixinWorkaround_forEach(items, new K.ObserverBuilder_visitListLiteral_closure(list));
+      return list;
+    },
+    visitMapLiteral$1: function(l) {
+      var entries, map;
+      entries = H.setRuntimeTypeInfo(new H.MappedListIterable(l.get$entries(l), this.get$visit()), [null, null]).toList$1$growable(0, false);
+      map = new K.MapLiteralObserver(entries, l, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      H.IterableMixinWorkaround_forEach(entries, new K.ObserverBuilder_visitMapLiteral_closure(map));
+      return map;
+    },
+    visitMapLiteralEntry$1: function(e) {
+      var key, value, entry;
+      key = J.accept$1$x(e.get$key(e), this);
+      value = J.accept$1$x(e.get$entryValue(), this);
+      entry = new K.MapLiteralEntryObserver(key, value, e, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      key.set$_parent(entry);
+      value.set$_parent(entry);
+      return entry;
+    },
+    visitIdentifier$1: function(i) {
+      return new K.IdentifierObserver(i, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+    },
+    visitBinaryOperator$1: function(o) {
+      var left, right, binary;
+      left = J.accept$1$x(o.get$left(o), this);
+      right = J.accept$1$x(o.get$right(o), this);
+      binary = new K.BinaryObserver(left, right, o, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      left.set$_parent(binary);
+      right.set$_parent(binary);
+      return binary;
+    },
+    visitUnaryOperator$1: function(o) {
+      var expr, unary;
+      expr = J.accept$1$x(o.get$child(), this);
+      unary = new K.UnaryObserver(expr, o, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      expr.set$_parent(unary);
+      return unary;
+    },
+    visitTernaryOperator$1: function(o) {
+      var condition, trueExpr, falseExpr, ternary;
+      condition = J.accept$1$x(o.get$condition(), this);
+      trueExpr = J.accept$1$x(o.get$trueExpr(), this);
+      falseExpr = J.accept$1$x(o.get$falseExpr(), this);
+      ternary = new K.TernaryObserver(condition, trueExpr, falseExpr, o, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      condition.set$_parent(ternary);
+      trueExpr.set$_parent(ternary);
+      falseExpr.set$_parent(ternary);
+      return ternary;
+    },
+    visitInExpression$1: function(i) {
+      throw H.wrapException(P.UnsupportedError$("can't eval an 'in' expression"));
+    },
+    visitAsExpression$1: function(i) {
+      throw H.wrapException(P.UnsupportedError$("can't eval an 'as' expression"));
+    }
+  },
+  ObserverBuilder_visitInvoke_closure: {
+    "^": "Closure:13;invoke_0",
+    call$1: function(a) {
+      var t1 = this.invoke_0;
+      a.set$_parent(t1);
+      return t1;
+    },
+    $isFunction: true
+  },
+  ObserverBuilder_visitListLiteral_closure: {
+    "^": "Closure:13;list_0",
+    call$1: function(e) {
+      var t1 = this.list_0;
+      e.set$_parent(t1);
+      return t1;
+    },
+    $isFunction: true
+  },
+  ObserverBuilder_visitMapLiteral_closure: {
+    "^": "Closure:13;map_0",
+    call$1: function(e) {
+      var t1 = this.map_0;
+      e.set$_parent(t1);
+      return t1;
+    },
+    $isFunction: true
+  },
+  EmptyObserver: {
+    "^": "ExpressionObserver;_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      this._eval$_value = J.get$model$x(scope);
+    },
+    accept$1: function(_, v) {
+      return v.visitEmptyExpression$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.EmptyExpression];
+    },
+    $isEmptyExpression: true,
+    $isExpression: true
+  },
+  LiteralObserver: {
+    "^": "ExpressionObserver;_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$value: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$value(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1 = this._eval$_expr;
+      this._eval$_value = t1.get$value(t1);
+    },
+    accept$1: function(_, v) {
+      return v.visitLiteral$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Literal];
+    },
+    $asLiteral: function() {
+      return [null];
+    },
+    $isLiteral: true,
+    $isExpression: true
+  },
+  ListLiteralObserver: {
+    "^": "ExpressionObserver;items<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      this._eval$_value = H.setRuntimeTypeInfo(new H.MappedListIterable(this.items, new K.ListLiteralObserver__updateSelf_closure()), [null, null]).toList$0(0);
+    },
+    accept$1: function(_, v) {
+      return v.visitListLiteral$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.ListLiteral];
+    },
+    $isListLiteral: true,
+    $isExpression: true
+  },
+  ListLiteralObserver__updateSelf_closure: {
+    "^": "Closure:13;",
+    call$1: [function(i) {
+      return i.get$_eval$_value();
+    }, "call$1", null, 2, 0, null, 82, "call"],
+    $isFunction: true
+  },
+  MapLiteralObserver: {
+    "^": "ExpressionObserver;entries>,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      this._eval$_value = H.IterableMixinWorkaround_fold(this.entries, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null), new K.MapLiteralObserver__updateSelf_closure());
+    },
+    accept$1: function(_, v) {
+      return v.visitMapLiteral$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.MapLiteral];
+    },
+    $isMapLiteral: true,
+    $isExpression: true
+  },
+  MapLiteralObserver__updateSelf_closure: {
+    "^": "Closure:75;",
+    call$2: function(m, e) {
+      J.$indexSet$ax(m, J.get$key$x(e).get$_eval$_value(), e.get$entryValue().get$_eval$_value());
+      return m;
+    },
+    $isFunction: true
+  },
+  MapLiteralEntryObserver: {
+    "^": "ExpressionObserver;key>,entryValue<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    accept$1: function(_, v) {
+      return v.visitMapLiteralEntry$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.MapLiteralEntry];
+    },
+    $isMapLiteralEntry: true,
+    $isExpression: true
+  },
+  IdentifierObserver: {
+    "^": "ExpressionObserver;_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$value: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$value(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, t2, model, symbol;
+      t1 = this._eval$_expr;
+      t2 = J.getInterceptor$asx(scope);
+      this._eval$_value = t2.$index(scope, t1.get$value(t1));
+      if (!scope._isModelProperty$1(t1.get$value(t1)))
+        return;
+      model = t2.get$model(scope);
+      t2 = J.getInterceptor(model);
+      if (!t2.$isObservable)
+        return;
+      t1 = t1.get$value(t1);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      this._eval$_subscription = t2.get$changes(model).listen$1(new K.IdentifierObserver__updateSelf_closure(this, scope, symbol));
+    },
+    accept$1: function(_, v) {
+      return v.visitIdentifier$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Identifier];
+    },
+    $isIdentifier: true,
+    $isExpression: true
+  },
+  IdentifierObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1,symbol_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.IdentifierObserver__updateSelf__closure(this.symbol_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  IdentifierObserver__updateSelf__closure: {
+    "^": "Closure:13;symbol_3",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isPropertyChangeRecord && J.$eq(c.name, this.symbol_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  UnaryObserver: {
+    "^": "ExpressionObserver;child<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$operator: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$operator(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, f;
+      t1 = this._eval$_expr;
+      f = $.get$_UNARY_OPERATORS().$index(0, t1.get$operator(t1));
+      if (J.$eq(t1.get$operator(t1), "!")) {
+        t1 = this.child.get$_eval$_value();
+        this._eval$_value = f.call$1(t1 == null ? false : t1);
+      } else {
+        t1 = this.child;
+        this._eval$_value = t1.get$_eval$_value() == null ? null : f.call$1(t1.get$_eval$_value());
+      }
+    },
+    accept$1: function(_, v) {
+      return v.visitUnaryOperator$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.UnaryOperator];
+    },
+    $isUnaryOperator: true,
+    $isExpression: true
+  },
+  BinaryObserver: {
+    "^": "ExpressionObserver;left>,right>,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$operator: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$operator(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, f, t2;
+      t1 = this._eval$_expr;
+      f = $.get$_BINARY_OPERATORS().$index(0, t1.get$operator(t1));
+      if (J.$eq(t1.get$operator(t1), "&&") || J.$eq(t1.get$operator(t1), "||")) {
+        t1 = this.left.get$_eval$_value();
+        if (t1 == null)
+          t1 = false;
+        t2 = this.right.get$_eval$_value();
+        this._eval$_value = f.call$2(t1, t2 == null ? false : t2);
+      } else if (J.$eq(t1.get$operator(t1), "==") || J.$eq(t1.get$operator(t1), "!="))
+        this._eval$_value = f.call$2(this.left.get$_eval$_value(), this.right.get$_eval$_value());
+      else {
+        t2 = this.left;
+        if (t2.get$_eval$_value() == null || this.right.get$_eval$_value() == null)
+          this._eval$_value = null;
+        else {
+          if (J.$eq(t1.get$operator(t1), "|") && !!J.getInterceptor(t2.get$_eval$_value()).$isObservableList)
+            this._eval$_subscription = H.interceptedTypeCast(t2.get$_eval$_value(), "$isObservableList").get$listChanges().listen$1(new K.BinaryObserver__updateSelf_closure(this, scope));
+          this._eval$_value = f.call$2(t2.get$_eval$_value(), this.right.get$_eval$_value());
+        }
+      }
+    },
+    accept$1: function(_, v) {
+      return v.visitBinaryOperator$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.BinaryOperator];
+    },
+    $isBinaryOperator: true,
+    $isExpression: true
+  },
+  BinaryObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1",
+    call$1: [function(_) {
+      return this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  TernaryObserver: {
+    "^": "ExpressionObserver;condition<,trueExpr<,falseExpr<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      var t1 = this.condition.get$_eval$_value();
+      this._eval$_value = (t1 == null ? false : t1) === true ? this.trueExpr.get$_eval$_value() : this.falseExpr.get$_eval$_value();
+    },
+    accept$1: function(_, v) {
+      return v.visitTernaryOperator$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.TernaryOperator];
+    },
+    $isTernaryOperator: true,
+    $isExpression: true
+  },
+  GetterObserver: {
+    "^": "ExpressionObserver;receiver<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$name: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$name(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var receiverValue, t1, symbol;
+      receiverValue = this.receiver.get$_eval$_value();
+      if (receiverValue == null) {
+        this._eval$_value = null;
+        return;
+      }
+      t1 = this._eval$_expr;
+      t1 = t1.get$name(t1);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      this._eval$_value = $.get$objectAccessor().read$2(receiverValue, symbol);
+      t1 = J.getInterceptor(receiverValue);
+      if (!!t1.$isObservable)
+        this._eval$_subscription = t1.get$changes(receiverValue).listen$1(new K.GetterObserver__updateSelf_closure(this, scope, symbol));
+    },
+    accept$1: function(_, v) {
+      return v.visitGetter$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Getter];
+    },
+    $isGetter: true,
+    $isExpression: true
+  },
+  GetterObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1,symbol_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.GetterObserver__updateSelf__closure(this.symbol_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  GetterObserver__updateSelf__closure: {
+    "^": "Closure:13;symbol_3",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isPropertyChangeRecord && J.$eq(c.name, this.symbol_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  IndexObserver: {
+    "^": "ExpressionObserver;receiver<,argument<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      var receiverValue, key, t1;
+      receiverValue = this.receiver.get$_eval$_value();
+      if (receiverValue == null) {
+        this._eval$_value = null;
+        return;
+      }
+      key = this.argument.get$_eval$_value();
+      t1 = J.getInterceptor$asx(receiverValue);
+      this._eval$_value = t1.$index(receiverValue, key);
+      if (!!t1.$isObservableList)
+        this._eval$_subscription = receiverValue.get$listChanges().listen$1(new K.IndexObserver__updateSelf_closure(this, scope, key));
+      else if (!!t1.$isObservable)
+        this._eval$_subscription = t1.get$changes(receiverValue).listen$1(new K.IndexObserver__updateSelf_closure0(this, scope, key));
+    },
+    accept$1: function(_, v) {
+      return v.visitIndex$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Index];
+    },
+    $isIndex: true,
+    $isExpression: true
+  },
+  IndexObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1,key_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.IndexObserver__updateSelf__closure0(this.key_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  IndexObserver__updateSelf__closure0: {
+    "^": "Closure:13;key_3",
+    call$1: [function(c) {
+      return c.indexChanged$1(this.key_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  IndexObserver__updateSelf_closure0: {
+    "^": "Closure:13;this_4,scope_5,key_6",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.IndexObserver__updateSelf__closure(this.key_6)) === true)
+        this.this_4._invalidate$1(this.scope_5);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  IndexObserver__updateSelf__closure: {
+    "^": "Closure:13;key_7",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isMapChangeRecord && J.$eq(c.key, this.key_7);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  InvokeObserver: {
+    "^": "ExpressionObserver;receiver<,arguments<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$method: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$method(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, args, receiverValue, symbol;
+      t1 = this.arguments;
+      t1.toString;
+      args = H.setRuntimeTypeInfo(new H.MappedListIterable(t1, new K.InvokeObserver__updateSelf_closure()), [null, null]).toList$0(0);
+      receiverValue = this.receiver.get$_eval$_value();
+      if (receiverValue == null) {
+        this._eval$_value = null;
+        return;
+      }
+      t1 = this._eval$_expr;
+      if (t1.get$method(t1) == null) {
+        t1 = H.Primitives_applyFunction(receiverValue, args, P.Function__toMangledNames(null));
+        this._eval$_value = !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+      } else {
+        t1 = t1.get$method(t1);
+        symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+        this._eval$_value = $.get$objectAccessor().invoke$5$adjust$namedArgs(receiverValue, symbol, args, false, null);
+        t1 = J.getInterceptor(receiverValue);
+        if (!!t1.$isObservable)
+          this._eval$_subscription = t1.get$changes(receiverValue).listen$1(new K.InvokeObserver__updateSelf_closure0(this, scope, symbol));
+      }
+    },
+    accept$1: function(_, v) {
+      return v.visitInvoke$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Invoke];
+    },
+    $isInvoke: true,
+    $isExpression: true
+  },
+  InvokeObserver__updateSelf_closure: {
+    "^": "Closure:13;",
+    call$1: [function(a) {
+      return a.get$_eval$_value();
+    }, "call$1", null, 2, 0, null, 46, "call"],
+    $isFunction: true
+  },
+  InvokeObserver__updateSelf_closure0: {
+    "^": "Closure:179;this_0,scope_1,symbol_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.InvokeObserver__updateSelf__closure(this.symbol_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  InvokeObserver__updateSelf__closure: {
+    "^": "Closure:13;symbol_3",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isPropertyChangeRecord && J.$eq(c.name, this.symbol_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  EvalException: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      return "EvalException: " + this.message;
+    },
+    static: {EvalException$: function(message) {
+        return new K.EvalException(message);
+      }}
+  }
+}],
+["polymer_expressions.expression", "package:polymer_expressions/expression.dart", , U, {
+  "^": "",
+  _listEquals: function(a, b) {
+    var i, t1;
+    if (a == null ? b == null : a === b)
+      return true;
+    if (a == null || b == null)
+      return false;
+    if (a.length !== b.length)
+      return false;
+    for (i = 0; i < a.length; ++i) {
+      t1 = a[i];
+      if (i >= b.length)
+        return H.ioore(b, i);
+      if (!J.$eq(t1, b[i]))
+        return false;
+    }
+    return true;
+  },
+  _hashList: function(l) {
+    l.toString;
+    return U._JenkinsSmiHash_finish0(H.IterableMixinWorkaround_fold(l, 0, new U._hashList_closure()));
+  },
+  _JenkinsSmiHash_combine1: function(hash, value) {
+    var t1 = J.$add$ns(hash, value);
+    if (typeof t1 !== "number")
+      return H.iae(t1);
+    hash = 536870911 & t1;
+    hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+    return hash ^ hash >>> 6;
+  },
+  _JenkinsSmiHash_finish0: function(hash) {
+    if (typeof hash !== "number")
+      return H.iae(hash);
+    hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+    hash = (hash ^ hash >>> 11) >>> 0;
+    return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+  },
+  AstFactory: {
+    "^": "Object;",
+    index$2: [function(_, e, a) {
+      return new U.Index(e, a);
+    }, "call$2", "get$index", 4, 0, 180, 1, 46]
+  },
+  Expression: {
+    "^": "Object;",
+    $isExpression: true
+  },
+  EmptyExpression: {
+    "^": "Expression;",
+    accept$1: function(_, v) {
+      return v.visitEmptyExpression$1(this);
+    },
+    $isEmptyExpression: true
+  },
+  Literal: {
+    "^": "Expression;value>",
+    accept$1: function(_, v) {
+      return v.visitLiteral$1(this);
+    },
+    toString$0: function(_) {
+      var t1 = this.value;
+      return typeof t1 === "string" ? "\"" + H.S(t1) + "\"" : H.S(t1);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = H.checkSubtype(o, "$isLiteral", [H.getTypeArgumentByIndex(this, 0)], "$asLiteral");
+      return t1 && J.$eq(J.get$value$x(o), this.value);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.value);
+    },
+    $isLiteral: true
+  },
+  ListLiteral: {
+    "^": "Expression;items<",
+    accept$1: function(_, v) {
+      return v.visitListLiteral$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.items);
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isListLiteral && U._listEquals(o.get$items(), this.items);
+    },
+    get$hashCode: function(_) {
+      return U._hashList(this.items);
+    },
+    $isListLiteral: true
+  },
+  MapLiteral: {
+    "^": "Expression;entries>",
+    accept$1: function(_, v) {
+      return v.visitMapLiteral$1(this);
+    },
+    toString$0: function(_) {
+      return "{" + H.S(this.entries) + "}";
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isMapLiteral && U._listEquals(t1.get$entries(o), this.entries);
+    },
+    get$hashCode: function(_) {
+      return U._hashList(this.entries);
+    },
+    $isMapLiteral: true
+  },
+  MapLiteralEntry: {
+    "^": "Expression;key>,entryValue<",
+    accept$1: function(_, v) {
+      return v.visitMapLiteralEntry$1(this);
+    },
+    toString$0: function(_) {
+      return this.key.toString$0(0) + ": " + H.S(this.entryValue);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isMapLiteralEntry && J.$eq(t1.get$key(o), this.key) && J.$eq(o.get$entryValue(), this.entryValue);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.key.value);
+      t2 = J.get$hashCode$(this.entryValue);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isMapLiteralEntry: true
+  },
+  ParenthesizedExpression: {
+    "^": "Expression;child",
+    accept$1: function(_, v) {
+      return v.visitParenthesizedExpression$1(this);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.child) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isParenthesizedExpression && J.$eq(o.child, this.child);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.child);
+    },
+    $isParenthesizedExpression: true
+  },
+  Identifier: {
+    "^": "Expression;value>",
+    accept$1: function(_, v) {
+      return v.visitIdentifier$1(this);
+    },
+    toString$0: function(_) {
+      return this.value;
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isIdentifier && J.$eq(t1.get$value(o), this.value);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.value);
+    },
+    $isIdentifier: true
+  },
+  UnaryOperator: {
+    "^": "Expression;operator>,child<",
+    accept$1: function(_, v) {
+      return v.visitUnaryOperator$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.operator) + " " + H.S(this.child);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isUnaryOperator && J.$eq(t1.get$operator(o), this.operator) && J.$eq(o.get$child(), this.child);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.operator);
+      t2 = J.get$hashCode$(this.child);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isUnaryOperator: true
+  },
+  BinaryOperator: {
+    "^": "Expression;operator>,left>,right>",
+    accept$1: function(_, v) {
+      return v.visitBinaryOperator$1(this);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.left) + " " + H.S(this.operator) + " " + H.S(this.right) + ")";
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isBinaryOperator && J.$eq(t1.get$operator(o), this.operator) && J.$eq(t1.get$left(o), this.left) && J.$eq(t1.get$right(o), this.right);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.get$hashCode$(this.operator);
+      t2 = J.get$hashCode$(this.left);
+      t3 = J.get$hashCode$(this.right);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2), t3));
+    },
+    $isBinaryOperator: true
+  },
+  TernaryOperator: {
+    "^": "Expression;condition<,trueExpr<,falseExpr<",
+    accept$1: function(_, v) {
+      return v.visitTernaryOperator$1(this);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.condition) + " ? " + H.S(this.trueExpr) + " : " + H.S(this.falseExpr) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isTernaryOperator && J.$eq(o.get$condition(), this.condition) && J.$eq(o.get$trueExpr(), this.trueExpr) && J.$eq(o.get$falseExpr(), this.falseExpr);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.get$hashCode$(this.condition);
+      t2 = J.get$hashCode$(this.trueExpr);
+      t3 = J.get$hashCode$(this.falseExpr);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2), t3));
+    },
+    $isTernaryOperator: true
+  },
+  InExpression: {
+    "^": "Expression;left>,right>",
+    accept$1: function(_, v) {
+      return v.visitInExpression$1(this);
+    },
+    get$identifier: function() {
+      var t1 = this.left;
+      return t1.get$value(t1);
+    },
+    get$expr: function(_) {
+      return this.right;
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.left) + " in " + H.S(this.right) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isInExpression && o.left.$eq(0, this.left) && J.$eq(o.right, this.right);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = this.left;
+      t1 = t1.get$hashCode(t1);
+      t2 = J.get$hashCode$(this.right);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isInExpression: true,
+    $isHasIdentifier: true
+  },
+  AsExpression: {
+    "^": "Expression;left>,right>",
+    accept$1: function(_, v) {
+      return v.visitAsExpression$1(this);
+    },
+    get$identifier: function() {
+      var t1 = this.right;
+      return t1.get$value(t1);
+    },
+    get$expr: function(_) {
+      return this.left;
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.left) + " as " + H.S(this.right) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isAsExpression && J.$eq(o.left, this.left) && o.right.$eq(0, this.right);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.left);
+      t2 = this.right;
+      t2 = t2.get$hashCode(t2);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isAsExpression: true,
+    $isHasIdentifier: true
+  },
+  Index: {
+    "^": "Expression;receiver<,argument<",
+    accept$1: function(_, v) {
+      return v.visitIndex$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.receiver) + "[" + H.S(this.argument) + "]";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isIndex && J.$eq(o.get$receiver(), this.receiver) && J.$eq(o.get$argument(), this.argument);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.receiver);
+      t2 = J.get$hashCode$(this.argument);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isIndex: true
+  },
+  Getter: {
+    "^": "Expression;receiver<,name>",
+    accept$1: function(_, v) {
+      return v.visitGetter$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.receiver) + "." + H.S(this.name);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isGetter && J.$eq(o.get$receiver(), this.receiver) && J.$eq(t1.get$name(o), this.name);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.receiver);
+      t2 = J.get$hashCode$(this.name);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isGetter: true
+  },
+  Invoke: {
+    "^": "Expression;receiver<,method>,arguments<",
+    accept$1: function(_, v) {
+      return v.visitInvoke$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.receiver) + "." + H.S(this.method) + "(" + H.S(this.arguments) + ")";
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isInvoke && J.$eq(o.get$receiver(), this.receiver) && J.$eq(t1.get$method(o), this.method) && U._listEquals(o.get$arguments(), this.arguments);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.get$hashCode$(this.receiver);
+      t2 = J.get$hashCode$(this.method);
+      t3 = U._hashList(this.arguments);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2), t3));
+    },
+    $isInvoke: true
+  },
+  _hashList_closure: {
+    "^": "Closure:75;",
+    call$2: function(h, item) {
+      return U._JenkinsSmiHash_combine1(h, J.get$hashCode$(item));
+    },
+    $isFunction: true
+  }
+}],
+["polymer_expressions.parser", "package:polymer_expressions/parser.dart", , T, {
+  "^": "",
+  Parser: {
+    "^": "Object;_astFactory,_tokenizer,_tokens,_parser$_iterator",
+    get$_token: function() {
+      return this._parser$_iterator._current;
+    },
+    _advance$2: function(kind, value) {
+      var t1;
+      if (kind != null) {
+        t1 = this._parser$_iterator._current;
+        t1 = t1 == null || !J.$eq(J.get$kind$x(t1), kind);
+      } else
+        t1 = false;
+      if (!t1)
+        if (value != null) {
+          t1 = this._parser$_iterator._current;
+          t1 = t1 == null || !J.$eq(J.get$value$x(t1), value);
+        } else
+          t1 = false;
+      else
+        t1 = true;
+      if (t1)
+        throw H.wrapException(Y.ParseException$("Expected kind " + H.S(kind) + " (" + H.S(value) + "): " + H.S(this.get$_token())));
+      this._parser$_iterator.moveNext$0();
+    },
+    _advance$0: function() {
+      return this._advance$2(null, null);
+    },
+    _advance$1: function(kind) {
+      return this._advance$2(kind, null);
+    },
+    _parseExpression$0: function() {
+      if (this._parser$_iterator._current == null) {
+        this._astFactory.toString;
+        return C.C_EmptyExpression;
+      }
+      var expr = this._parseUnary$0();
+      return expr == null ? null : this._parsePrecedence$2(expr, 0);
+    },
+    _parsePrecedence$2: function(left, precedence) {
+      var t1, args, indexExpr, right, trueExpr, falseExpr;
+      for (; t1 = this._parser$_iterator._current, t1 != null;)
+        if (J.$eq(J.get$kind$x(t1), 9))
+          if (J.$eq(J.get$value$x(this._parser$_iterator._current), "(")) {
+            args = this._parseArguments$0();
+            this._astFactory.toString;
+            left = new U.Invoke(left, null, args);
+          } else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "[")) {
+            indexExpr = this._parseIndex$0();
+            this._astFactory.toString;
+            left = new U.Index(left, indexExpr);
+          } else
+            break;
+        else if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 3)) {
+          this._advance$0();
+          left = this._makeInvokeOrGetter$2(left, this._parseUnary$0());
+        } else if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 10))
+          if (J.$eq(J.get$value$x(this._parser$_iterator._current), "in")) {
+            if (!J.getInterceptor(left).$isIdentifier)
+              H.throwExpression(Y.ParseException$("in... statements must start with an identifier"));
+            this._advance$0();
+            right = this._parseExpression$0();
+            this._astFactory.toString;
+            left = new U.InExpression(left, right);
+          } else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "as")) {
+            this._advance$0();
+            right = this._parseExpression$0();
+            if (!J.getInterceptor(right).$isIdentifier)
+              H.throwExpression(Y.ParseException$("'as' statements must end with an identifier"));
+            this._astFactory.toString;
+            left = new U.AsExpression(left, right);
+          } else
+            break;
+        else {
+          if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 8)) {
+            t1 = this._parser$_iterator._current.get$precedence();
+            if (typeof t1 !== "number")
+              return t1.$ge();
+            if (typeof precedence !== "number")
+              return H.iae(precedence);
+            t1 = t1 >= precedence;
+          } else
+            t1 = false;
+          if (t1)
+            if (J.$eq(J.get$value$x(this._parser$_iterator._current), "?")) {
+              this._advance$2(8, "?");
+              trueExpr = this._parseExpression$0();
+              this._advance$1(5);
+              falseExpr = this._parseExpression$0();
+              this._astFactory.toString;
+              left = new U.TernaryOperator(left, trueExpr, falseExpr);
+            } else
+              left = this._parseBinary$1(left);
+          else
+            break;
+        }
+      return left;
+    },
+    _makeInvokeOrGetter$2: function(left, right) {
+      var t1, t2;
+      t1 = J.getInterceptor(right);
+      if (!!t1.$isIdentifier) {
+        t1 = t1.get$value(right);
+        this._astFactory.toString;
+        return new U.Getter(left, t1);
+      } else if (!!t1.$isInvoke && !!J.getInterceptor(right.get$receiver()).$isIdentifier) {
+        t1 = J.get$value$x(right.get$receiver());
+        t2 = right.get$arguments();
+        this._astFactory.toString;
+        return new U.Invoke(left, t1, t2);
+      } else
+        throw H.wrapException(Y.ParseException$("expected identifier: " + H.S(right)));
+    },
+    _parseBinary$1: function(left) {
+      var op, t1, right, t2, t3;
+      op = this._parser$_iterator._current;
+      t1 = J.getInterceptor$x(op);
+      if (!C.JSArray_methods.contains$1(C.List_EuK, t1.get$value(op)))
+        throw H.wrapException(Y.ParseException$("unknown operator: " + H.S(t1.get$value(op))));
+      this._advance$0();
+      right = this._parseUnary$0();
+      while (true) {
+        t2 = this._parser$_iterator._current;
+        if (t2 != null)
+          if (J.$eq(J.get$kind$x(t2), 8) || J.$eq(J.get$kind$x(this._parser$_iterator._current), 3) || J.$eq(J.get$kind$x(this._parser$_iterator._current), 9)) {
+            t2 = this._parser$_iterator._current.get$precedence();
+            t3 = op.get$precedence();
+            if (typeof t2 !== "number")
+              return t2.$gt();
+            if (typeof t3 !== "number")
+              return H.iae(t3);
+            t3 = t2 > t3;
+            t2 = t3;
+          } else
+            t2 = false;
+        else
+          t2 = false;
+        if (!t2)
+          break;
+        right = this._parsePrecedence$2(right, this._parser$_iterator._current.get$precedence());
+      }
+      t1 = t1.get$value(op);
+      this._astFactory.toString;
+      return new U.BinaryOperator(t1, left, right);
+    },
+    _parseUnary$0: function() {
+      var value, t1, t2, expr;
+      if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 8)) {
+        value = J.get$value$x(this._parser$_iterator._current);
+        t1 = J.getInterceptor(value);
+        if (t1.$eq(value, "+") || t1.$eq(value, "-")) {
+          this._advance$0();
+          if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 6)) {
+            t1 = H.Primitives_parseInt(H.S(value) + H.S(J.get$value$x(this._parser$_iterator._current)), null, null);
+            this._astFactory.toString;
+            value = new U.Literal(t1);
+            value.$builtinTypeInfo = [null];
+            this._advance$0();
+            return value;
+          } else {
+            t1 = this._astFactory;
+            if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 7)) {
+              t2 = H.Primitives_parseDouble(H.S(value) + H.S(J.get$value$x(this._parser$_iterator._current)), null);
+              t1.toString;
+              value = new U.Literal(t2);
+              value.$builtinTypeInfo = [null];
+              this._advance$0();
+              return value;
+            } else {
+              expr = this._parsePrecedence$2(this._parsePrimary$0(), 11);
+              t1.toString;
+              return new U.UnaryOperator(value, expr);
+            }
+          }
+        } else if (t1.$eq(value, "!")) {
+          this._advance$0();
+          expr = this._parsePrecedence$2(this._parsePrimary$0(), 11);
+          this._astFactory.toString;
+          return new U.UnaryOperator(value, expr);
+        } else
+          throw H.wrapException(Y.ParseException$("unexpected token: " + H.S(value)));
+      }
+      return this._parsePrimary$0();
+    },
+    _parsePrimary$0: function() {
+      var keyword, expr;
+      switch (J.get$kind$x(this._parser$_iterator._current)) {
+        case 10:
+          keyword = J.get$value$x(this._parser$_iterator._current);
+          if (J.$eq(keyword, "this")) {
+            this._advance$0();
+            this._astFactory.toString;
+            return new U.Identifier("this");
+          } else if (C.JSArray_methods.contains$1(C.List_as_in_this, keyword))
+            throw H.wrapException(Y.ParseException$("unexpected keyword: " + H.S(keyword)));
+          throw H.wrapException(Y.ParseException$("unrecognized keyword: " + H.S(keyword)));
+        case 2:
+          return this._parseInvokeOrIdentifier$0();
+        case 1:
+          return this._parseString$0();
+        case 6:
+          return this._parseInteger$0();
+        case 7:
+          return this._parseDecimal$0();
+        case 9:
+          if (J.$eq(J.get$value$x(this._parser$_iterator._current), "(")) {
+            this._advance$0();
+            expr = this._parseExpression$0();
+            this._advance$2(9, ")");
+            this._astFactory.toString;
+            return new U.ParenthesizedExpression(expr);
+          } else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "{"))
+            return this._parseMapLiteral$0();
+          else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "["))
+            return this._parseListLiteral$0();
+          return;
+        case 5:
+          throw H.wrapException(Y.ParseException$("unexpected token \":\""));
+        default:
+          return;
+      }
+    },
+    _parseListLiteral$0: function() {
+      var items, t1;
+      items = [];
+      do {
+        this._advance$0();
+        if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "]"))
+          break;
+        items.push(this._parseExpression$0());
+        t1 = this._parser$_iterator._current;
+      } while (t1 != null && J.$eq(J.get$value$x(t1), ","));
+      this._advance$2(9, "]");
+      return new U.ListLiteral(items);
+    },
+    _parseMapLiteral$0: function() {
+      var entries, t1, value;
+      entries = [];
+      do {
+        this._advance$0();
+        if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "}"))
+          break;
+        t1 = J.get$value$x(this._parser$_iterator._current);
+        this._astFactory.toString;
+        value = new U.Literal(t1);
+        value.$builtinTypeInfo = [null];
+        this._advance$0();
+        this._advance$2(5, ":");
+        entries.push(new U.MapLiteralEntry(value, this._parseExpression$0()));
+        t1 = this._parser$_iterator._current;
+      } while (t1 != null && J.$eq(J.get$value$x(t1), ","));
+      this._advance$2(9, "}");
+      return new U.MapLiteral(entries);
+    },
+    _parseInvokeOrIdentifier$0: function() {
+      var value, identifier, args;
+      if (J.$eq(J.get$value$x(this._parser$_iterator._current), "true")) {
+        this._advance$0();
+        this._astFactory.toString;
+        return H.setRuntimeTypeInfo(new U.Literal(true), [null]);
+      }
+      if (J.$eq(J.get$value$x(this._parser$_iterator._current), "false")) {
+        this._advance$0();
+        this._astFactory.toString;
+        return H.setRuntimeTypeInfo(new U.Literal(false), [null]);
+      }
+      if (J.$eq(J.get$value$x(this._parser$_iterator._current), "null")) {
+        this._advance$0();
+        this._astFactory.toString;
+        return H.setRuntimeTypeInfo(new U.Literal(null), [null]);
+      }
+      if (!J.$eq(J.get$kind$x(this._parser$_iterator._current), 2))
+        H.throwExpression(Y.ParseException$("expected identifier: " + H.S(this.get$_token()) + ".value"));
+      value = J.get$value$x(this._parser$_iterator._current);
+      this._advance$0();
+      this._astFactory.toString;
+      identifier = new U.Identifier(value);
+      args = this._parseArguments$0();
+      if (args == null)
+        return identifier;
+      else
+        return new U.Invoke(identifier, null, args);
+    },
+    _parseArguments$0: function() {
+      var t1, args;
+      t1 = this._parser$_iterator._current;
+      if (t1 != null && J.$eq(J.get$kind$x(t1), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "(")) {
+        args = [];
+        do {
+          this._advance$0();
+          if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), ")"))
+            break;
+          args.push(this._parseExpression$0());
+          t1 = this._parser$_iterator._current;
+        } while (t1 != null && J.$eq(J.get$value$x(t1), ","));
+        this._advance$2(9, ")");
+        return args;
+      }
+      return;
+    },
+    _parseIndex$0: function() {
+      var t1, expr;
+      t1 = this._parser$_iterator._current;
+      if (t1 != null && J.$eq(J.get$kind$x(t1), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "[")) {
+        this._advance$0();
+        expr = this._parseExpression$0();
+        this._advance$2(9, "]");
+        return expr;
+      }
+      return;
+    },
+    _parseString$0: function() {
+      var t1, value;
+      t1 = J.get$value$x(this._parser$_iterator._current);
+      this._astFactory.toString;
+      value = H.setRuntimeTypeInfo(new U.Literal(t1), [null]);
+      this._advance$0();
+      return value;
+    },
+    _parseInteger$1: function(prefix) {
+      var t1, value;
+      t1 = H.Primitives_parseInt(H.S(prefix) + H.S(J.get$value$x(this._parser$_iterator._current)), null, null);
+      this._astFactory.toString;
+      value = H.setRuntimeTypeInfo(new U.Literal(t1), [null]);
+      this._advance$0();
+      return value;
+    },
+    _parseInteger$0: function() {
+      return this._parseInteger$1("");
+    },
+    _parseDecimal$1: function(prefix) {
+      var t1, value;
+      t1 = H.Primitives_parseDouble(H.S(prefix) + H.S(J.get$value$x(this._parser$_iterator._current)), null);
+      this._astFactory.toString;
+      value = H.setRuntimeTypeInfo(new U.Literal(t1), [null]);
+      this._advance$0();
+      return value;
+    },
+    _parseDecimal$0: function() {
+      return this._parseDecimal$1("");
+    }
+  }
+}],
+["polymer_expressions.src.globals", "package:polymer_expressions/src/globals.dart", , K, {
+  "^": "",
+  enumerate: [function(iterable) {
+    return H.setRuntimeTypeInfo(new K.EnumerateIterable(iterable), [null]);
+  }, "call$1", "enumerate$closure", 2, 0, 66, 67],
+  IndexedValue: {
+    "^": "Object;index>,value>",
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isIndexedValue && J.$eq(o.index, this.index) && J.$eq(o.value, this.value);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.value);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.index) + ", " + H.S(this.value) + ")";
+    },
+    $isIndexedValue: true
+  },
+  EnumerateIterable: {
+    "^": "IterableBase;_globals$_iterable",
+    get$iterator: function(_) {
+      var t1 = new K.EnumerateIterator(J.get$iterator$ax(this._globals$_iterable), 0, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._globals$_iterable);
+    },
+    get$isEmpty: function(_) {
+      return J.get$isEmpty$asx(this._globals$_iterable);
+    },
+    get$last: function(_) {
+      var t1, t2;
+      t1 = this._globals$_iterable;
+      t2 = J.getInterceptor$asx(t1);
+      t1 = new K.IndexedValue(J.$sub$n(t2.get$length(t1), 1), t2.get$last(t1));
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    $asIterableBase: function($V) {
+      return [[K.IndexedValue, $V]];
+    },
+    $asIterable: function($V) {
+      return [[K.IndexedValue, $V]];
+    }
+  },
+  EnumerateIterator: {
+    "^": "Iterator;_globals$_iterator,_globals$_index,_globals$_current",
+    get$current: function() {
+      return this._globals$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._globals$_iterator;
+      if (t1.moveNext$0()) {
+        this._globals$_current = H.setRuntimeTypeInfo(new K.IndexedValue(this._globals$_index++, t1.get$current()), [null]);
+        return true;
+      }
+      this._globals$_current = null;
+      return false;
+    },
+    $asIterator: function($V) {
+      return [[K.IndexedValue, $V]];
+    }
+  }
+}],
+["polymer_expressions.tokenizer", "package:polymer_expressions/tokenizer.dart", , Y, {
+  "^": "",
+  escape: function(c) {
+    switch (c) {
+      case 102:
+        return 12;
+      case 110:
+        return 10;
+      case 114:
+        return 13;
+      case 116:
+        return 9;
+      case 118:
+        return 11;
+      default:
+        return c;
+    }
+  },
+  Token: {
+    "^": "Object;kind>,value>,precedence<",
+    toString$0: function(_) {
+      return "(" + this.kind + ", '" + this.value + "')";
+    },
+    $isToken: true
+  },
+  Tokenizer: {
+    "^": "Object;_tokenizer$_tokens,_sb,_tokenizer$_iterator,_tokenizer$_next",
+    tokenize$0: function() {
+      var t1, t2, t3, t4, startChar, op2, op, value;
+      t1 = this._tokenizer$_iterator;
+      this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+      for (t2 = this._tokenizer$_tokens; t3 = this._tokenizer$_next, t3 != null;)
+        if (t3 === 32 || t3 === 9 || t3 === 160)
+          this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+        else if (t3 === 34 || t3 === 39)
+          this.tokenizeString$0();
+        else {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(97 <= t3 && t3 <= 122))
+            t4 = 65 <= t3 && t3 <= 90 || t3 === 95 || t3 === 36 || t3 > 127;
+          else
+            t4 = true;
+          if (t4)
+            this.tokenizeIdentifierOrKeyword$0();
+          else if (48 <= t3 && t3 <= 57)
+            this.tokenizeNumber$0();
+          else if (t3 === 46) {
+            t3 = t1.moveNext$0() ? t1._currentCodePoint : null;
+            this._tokenizer$_next = t3;
+            if (typeof t3 !== "number")
+              return H.iae(t3);
+            if (48 <= t3 && t3 <= 57)
+              this.tokenizeFraction$0();
+            else
+              t2.push(new Y.Token(3, ".", 11));
+          } else if (t3 === 44) {
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+            t2.push(new Y.Token(4, ",", 0));
+          } else if (t3 === 58) {
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+            t2.push(new Y.Token(5, ":", 0));
+          } else if (C.JSArray_methods.contains$1(C.List_mC8, t3)) {
+            startChar = this._tokenizer$_next;
+            t3 = t1.moveNext$0() ? t1._currentCodePoint : null;
+            this._tokenizer$_next = t3;
+            if (C.JSArray_methods.contains$1(C.List_mC8, t3)) {
+              t3 = this._tokenizer$_next;
+              op2 = H.Primitives_stringFromCharCodes([startChar, t3]);
+              if (C.JSArray_methods.contains$1(C.List_Ynd, op2)) {
+                t3 = t1.moveNext$0() ? t1._currentCodePoint : null;
+                this._tokenizer$_next = t3;
+                if (t3 === 61)
+                  t3 = startChar === 33 || startChar === 61;
+                else
+                  t3 = false;
+                if (t3) {
+                  op = op2 + "=";
+                  this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+                } else
+                  op = op2;
+              } else
+                op = H.Primitives_stringFromCharCode(startChar);
+            } else
+              op = H.Primitives_stringFromCharCode(startChar);
+            t2.push(new Y.Token(8, op, C.Map_L0K61.$index(0, op)));
+          } else if (C.JSArray_methods.contains$1(C.List_ww8, this._tokenizer$_next)) {
+            value = H.Primitives_stringFromCharCode(this._tokenizer$_next);
+            t2.push(new Y.Token(9, value, C.Map_L0K61.$index(0, value)));
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+          } else
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+        }
+      return t2;
+    },
+    tokenizeString$0: function() {
+      var quoteChar, t1, t2, t3;
+      quoteChar = this._tokenizer$_next;
+      t1 = this._tokenizer$_iterator;
+      t2 = t1.moveNext$0() ? t1._currentCodePoint : null;
+      this._tokenizer$_next = t2;
+      for (t3 = this._sb; t2 == null ? quoteChar != null : t2 !== quoteChar;) {
+        if (t2 == null)
+          throw H.wrapException(Y.ParseException$("unterminated string"));
+        if (t2 === 92) {
+          t2 = t1.moveNext$0() ? t1._currentCodePoint : null;
+          this._tokenizer$_next = t2;
+          if (t2 == null)
+            throw H.wrapException(Y.ParseException$("unterminated string"));
+          t2 = H.Primitives_stringFromCharCode(Y.escape(t2));
+          t3._contents += t2;
+        } else {
+          t2 = H.Primitives_stringFromCharCode(t2);
+          t3._contents += t2;
+        }
+        t2 = t1.moveNext$0() ? t1._currentCodePoint : null;
+        this._tokenizer$_next = t2;
+      }
+      this._tokenizer$_tokens.push(new Y.Token(1, t3._contents, 0));
+      t3._contents = "";
+      this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+    },
+    tokenizeIdentifierOrKeyword$0: function() {
+      var t1, t2, t3, t4, value;
+      t1 = this._tokenizer$_iterator;
+      t2 = this._sb;
+      while (true) {
+        t3 = this._tokenizer$_next;
+        if (t3 != null) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(97 <= t3 && t3 <= 122))
+            if (!(65 <= t3 && t3 <= 90))
+              t4 = 48 <= t3 && t3 <= 57 || t3 === 95 || t3 === 36 || t3 > 127;
+            else
+              t4 = true;
+          else
+            t4 = true;
+        } else
+          t4 = false;
+        if (!t4)
+          break;
+        t3 = H.Primitives_stringFromCharCode(t3);
+        t2._contents += t3;
+        this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+      }
+      value = t2._contents;
+      t1 = this._tokenizer$_tokens;
+      if (C.JSArray_methods.contains$1(C.List_as_in_this, value))
+        t1.push(new Y.Token(10, value, 0));
+      else
+        t1.push(new Y.Token(2, value, 0));
+      t2._contents = "";
+    },
+    tokenizeNumber$0: function() {
+      var t1, t2, t3, t4;
+      t1 = this._tokenizer$_iterator;
+      t2 = this._sb;
+      while (true) {
+        t3 = this._tokenizer$_next;
+        if (t3 != null) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          t4 = 48 <= t3 && t3 <= 57;
+        } else
+          t4 = false;
+        if (!t4)
+          break;
+        t3 = H.Primitives_stringFromCharCode(t3);
+        t2._contents += t3;
+        this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+      }
+      if (t3 === 46) {
+        t1 = t1.moveNext$0() ? t1._currentCodePoint : null;
+        this._tokenizer$_next = t1;
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        if (48 <= t1 && t1 <= 57)
+          this.tokenizeFraction$0();
+        else
+          this._tokenizer$_tokens.push(new Y.Token(3, ".", 11));
+      } else {
+        this._tokenizer$_tokens.push(new Y.Token(6, t2._contents, 0));
+        t2._contents = "";
+      }
+    },
+    tokenizeFraction$0: function() {
+      var t1, t2, t3, t4;
+      t1 = this._sb;
+      t1.write$1(H.Primitives_stringFromCharCode(46));
+      t2 = this._tokenizer$_iterator;
+      while (true) {
+        t3 = this._tokenizer$_next;
+        if (t3 != null) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          t4 = 48 <= t3 && t3 <= 57;
+        } else
+          t4 = false;
+        if (!t4)
+          break;
+        t3 = H.Primitives_stringFromCharCode(t3);
+        t1._contents += t3;
+        this._tokenizer$_next = t2.moveNext$0() ? t2._currentCodePoint : null;
+      }
+      this._tokenizer$_tokens.push(new Y.Token(7, t1._contents, 0));
+      t1._contents = "";
+    }
+  },
+  ParseException: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      return "ParseException: " + this.message;
+    },
+    static: {ParseException$: function(message) {
+        return new Y.ParseException(message);
+      }}
+  }
+}],
+["polymer_expressions.visitor", "package:polymer_expressions/visitor.dart", , S, {
+  "^": "",
+  Visitor: {
+    "^": "Object;",
+    visit$1: [function(s) {
+      return J.accept$1$x(s, this);
+    }, "call$1", "get$visit", 2, 0, 181, 142]
+  },
+  RecursiveVisitor: {
+    "^": "Visitor;",
+    visitExpression$1: function(e) {
+    },
+    visitEmptyExpression$1: function(e) {
+      this.visitExpression$1(e);
+    },
+    visitParenthesizedExpression$1: function(e) {
+      e.child.accept$1(0, this);
+      this.visitExpression$1(e);
+    },
+    visitGetter$1: function(i) {
+      J.accept$1$x(i.get$receiver(), this);
+      this.visitExpression$1(i);
+    },
+    visitIndex$1: function(i) {
+      J.accept$1$x(i.get$receiver(), this);
+      J.accept$1$x(i.get$argument(), this);
+      this.visitExpression$1(i);
+    },
+    visitInvoke$1: function(i) {
+      var t1;
+      J.accept$1$x(i.get$receiver(), this);
+      if (i.get$arguments() != null)
+        for (t1 = i.get$arguments(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+          J.accept$1$x(t1._current, this);
+      this.visitExpression$1(i);
+    },
+    visitLiteral$1: function(l) {
+      this.visitExpression$1(l);
+    },
+    visitListLiteral$1: function(l) {
+      var t1;
+      for (t1 = l.get$items(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.accept$1$x(t1._current, this);
+      this.visitExpression$1(l);
+    },
+    visitMapLiteral$1: function(l) {
+      var t1;
+      for (t1 = l.get$entries(l), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.accept$1$x(t1._current, this);
+      this.visitExpression$1(l);
+    },
+    visitMapLiteralEntry$1: function(e) {
+      J.accept$1$x(e.get$key(e), this);
+      J.accept$1$x(e.get$entryValue(), this);
+      this.visitExpression$1(e);
+    },
+    visitIdentifier$1: function(i) {
+      this.visitExpression$1(i);
+    },
+    visitBinaryOperator$1: function(o) {
+      J.accept$1$x(o.get$left(o), this);
+      J.accept$1$x(o.get$right(o), this);
+      this.visitExpression$1(o);
+    },
+    visitUnaryOperator$1: function(o) {
+      J.accept$1$x(o.get$child(), this);
+      this.visitExpression$1(o);
+    },
+    visitTernaryOperator$1: function(o) {
+      J.accept$1$x(o.get$condition(), this);
+      J.accept$1$x(o.get$trueExpr(), this);
+      J.accept$1$x(o.get$falseExpr(), this);
+      this.visitExpression$1(o);
+    },
+    visitInExpression$1: function(c) {
+      c.left.accept$1(0, this);
+      c.right.accept$1(0, this);
+      this.visitExpression$1(c);
+    },
+    visitAsExpression$1: function(c) {
+      c.left.accept$1(0, this);
+      c.right.accept$1(0, this);
+      this.visitExpression$1(c);
+    }
+  }
+}],
+["script_inset_element", "package:observatory/src/elements/script_inset.dart", , T, {
+  "^": "",
+  ScriptInsetElement: {
+    "^": "ObservatoryElement_ChangeNotifier43;_script_inset_element$__$script,_script_inset_element$__$pos,_script_inset_element$__$endPos,lineNumbers=,_script_inset_element$__$startLine,_script_inset_element$__$endLine,_script_inset_element$__$lines,_updateFuture,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$script: function(receiver) {
+      return receiver._script_inset_element$__$script;
+    },
+    set$script: function(receiver, value) {
+      receiver._script_inset_element$__$script = this.notifyPropertyChange$3(receiver, C.Symbol_script, receiver._script_inset_element$__$script, value);
+    },
+    get$pos: function(receiver) {
+      return receiver._script_inset_element$__$pos;
+    },
+    set$pos: function(receiver, value) {
+      receiver._script_inset_element$__$pos = this.notifyPropertyChange$3(receiver, C.Symbol_pos, receiver._script_inset_element$__$pos, value);
+    },
+    get$endPos: function(receiver) {
+      return receiver._script_inset_element$__$endPos;
+    },
+    set$endPos: function(receiver, value) {
+      receiver._script_inset_element$__$endPos = this.notifyPropertyChange$3(receiver, C.Symbol_endPos, receiver._script_inset_element$__$endPos, value);
+    },
+    get$startLine: function(receiver) {
+      return receiver._script_inset_element$__$startLine;
+    },
+    set$startLine: function(receiver, value) {
+      receiver._script_inset_element$__$startLine = this.notifyPropertyChange$3(receiver, C.Symbol_startLine, receiver._script_inset_element$__$startLine, value);
+    },
+    get$endLine: function(receiver) {
+      return receiver._script_inset_element$__$endLine;
+    },
+    set$endLine: function(receiver, value) {
+      receiver._script_inset_element$__$endLine = this.notifyPropertyChange$3(receiver, C.Symbol_endLine, receiver._script_inset_element$__$endLine, value);
+    },
+    get$lines: function(receiver) {
+      return receiver._script_inset_element$__$lines;
+    },
+    set$lines: function(receiver, value) {
+      receiver._script_inset_element$__$lines = this.notifyPropertyChange$3(receiver, C.Symbol_lines, receiver._script_inset_element$__$lines, value);
+    },
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+    },
+    scriptChanged$1: [function(receiver, oldValue) {
+      this._updateLines$0(receiver);
+    }, "call$1", "get$scriptChanged", 2, 0, 20, 57],
+    posChanged$1: [function(receiver, oldValue) {
+      this._updateLines$0(receiver);
+    }, "call$1", "get$posChanged", 2, 0, 20, 57],
+    endPosChanged$1: [function(receiver, oldValue) {
+      this._updateLines$0(receiver);
+    }, "call$1", "get$endPosChanged", 2, 0, 20, 57],
+    styleForHits$1: [function(receiver, hits) {
+      if (hits == null)
+        return "min-width:32px;";
+      else if (J.$eq(hits, 0))
+        return "min-width:32px; background-color:red";
+      return "min-width:32px; background-color:green";
+    }, "call$1", "get$styleForHits", 2, 0, 15, 182],
+    _updateLines$0: function(receiver) {
+      var t1, t2, i;
+      if (receiver._updateFuture != null)
+        return;
+      if (J.get$loaded$x(receiver._script_inset_element$__$script) !== true) {
+        receiver._updateFuture = J.load$0$x(receiver._script_inset_element$__$script).then$1(new T.ScriptInsetElement__updateLines_closure(receiver));
+        return;
+      }
+      t1 = receiver._script_inset_element$__$pos;
+      t1 = t1 != null ? J.$sub$n(receiver._script_inset_element$__$script.tokenToLine$1(t1), 1) : 0;
+      receiver._script_inset_element$__$startLine = this.notifyPropertyChange$3(receiver, C.Symbol_startLine, receiver._script_inset_element$__$startLine, t1);
+      t1 = receiver._script_inset_element$__$endPos;
+      t2 = receiver._script_inset_element$__$script;
+      t1 = t1 != null ? t2.tokenToLine$1(t1) : J.get$length$asx(J.get$lines$x(t2));
+      receiver._script_inset_element$__$endLine = this.notifyPropertyChange$3(receiver, C.Symbol_endLine, receiver._script_inset_element$__$endLine, t1);
+      t1 = receiver.lineNumbers;
+      t1.clear$0(t1);
+      for (i = receiver._script_inset_element$__$startLine; t2 = J.getInterceptor$n(i), t2.$lt(i, receiver._script_inset_element$__$endLine); i = t2.$add(i, 1))
+        t1.add$1(0, i);
+    },
+    static: {"^": "ScriptInsetElement_hitStyleNone,ScriptInsetElement_hitStyleExecuted,ScriptInsetElement_hitStyleNotExecuted", ScriptInsetElement$created: function(receiver) {
+        var t1, t2, t3, t4;
+        t1 = Q.ObservableList$(null, P.$int);
+        t2 = R._toObservableDeep([]);
+        t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t4 = P.String;
+        t4 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t4, null), null, null), [t4, null]);
+        receiver.lineNumbers = t1;
+        receiver._script_inset_element$__$lines = t2;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t3;
+        receiver.polymer$Polymer$$ = t4;
+        C.ScriptInsetElement_methods.Element$created$0(receiver);
+        C.ScriptInsetElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier43: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ScriptInsetElement__updateLines_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      var t1 = this.this_0;
+      if (J.get$loaded$x(t1._script_inset_element$__$script) === true) {
+        t1._updateFuture = null;
+        J._updateLines$0$x(t1);
+      }
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  }
+}],
+["script_ref_element", "package:observatory/src/elements/script_ref.dart", , A, {
+  "^": "",
+  ScriptRefElement: {
+    "^": "ServiceRefElement_ChangeNotifier1;_script_ref_element$__$pos,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$pos: function(receiver) {
+      return receiver._script_ref_element$__$pos;
+    },
+    set$pos: function(receiver, value) {
+      receiver._script_ref_element$__$pos = this.notifyPropertyChange$3(receiver, C.Symbol_pos, receiver._script_ref_element$__$pos, value);
+    },
+    get$hoverText: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return Q.ServiceRefElement.prototype.get$hoverText.call(this, receiver);
+      return t1.get$vmName();
+    },
+    posChanged$1: [function(receiver, oldValue) {
+      this._updateProperties$1(receiver, null);
+    }, "call$1", "get$posChanged", 2, 0, 20, 57],
+    _updateProperties$1: [function(receiver, _) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 != null && J.get$loaded$x(t1) === true) {
+        this.notifyPropertyChange$3(receiver, C.Symbol_name, 0, 1);
+        this.notifyPropertyChange$3(receiver, C.Symbol_url, 0, 1);
+      }
+    }, "call$1", "get$_updateProperties", 2, 0, 20, 14],
+    get$name: function(receiver) {
+      var t1, script;
+      if (receiver._service_ref_element$__$ref == null)
+        return Q.ServiceRefElement.prototype.get$name.call(this, receiver);
+      if (J.$ge$n(receiver._script_ref_element$__$pos, 0)) {
+        t1 = J.get$loaded$x(receiver._service_ref_element$__$ref);
+        script = receiver._service_ref_element$__$ref;
+        if (t1 === true)
+          return H.S(Q.ServiceRefElement.prototype.get$name.call(this, receiver)) + ":" + H.S(script.tokenToLine$1(receiver._script_ref_element$__$pos));
+        else
+          J.load$0$x(script).then$1(this.get$_updateProperties(receiver));
+      }
+      return Q.ServiceRefElement.prototype.get$name.call(this, receiver);
+    },
+    get$url: function(receiver) {
+      var t1, script;
+      if (receiver._service_ref_element$__$ref == null)
+        return Q.ServiceRefElement.prototype.get$url.call(this, receiver);
+      if (J.$ge$n(receiver._script_ref_element$__$pos, 0)) {
+        t1 = J.get$loaded$x(receiver._service_ref_element$__$ref);
+        script = receiver._service_ref_element$__$ref;
+        if (t1 === true)
+          return Q.ServiceRefElement.prototype.get$url.call(this, receiver) + "#line=" + H.S(script.tokenToLine$1(receiver._script_ref_element$__$pos));
+        else
+          J.load$0$x(script).then$1(this.get$_updateProperties(receiver));
+      }
+      return Q.ServiceRefElement.prototype.get$url.call(this, receiver);
+    },
+    static: {ScriptRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._script_ref_element$__$pos = -1;
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ScriptRefElement_methods.Element$created$0(receiver);
+        C.ScriptRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ServiceRefElement_ChangeNotifier1: {
+    "^": "ServiceRefElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["script_view_element", "package:observatory/src/elements/script_view.dart", , U, {
+  "^": "",
+  ScriptViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier44;_script_view_element$__$script,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$script: function(receiver) {
+      return receiver._script_view_element$__$script;
+    },
+    set$script: function(receiver, value) {
+      receiver._script_view_element$__$script = this.notifyPropertyChange$3(receiver, C.Symbol_script, receiver._script_view_element$__$script, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = receiver._script_view_element$__$script;
+      if (t1 == null)
+        return;
+      J.load$0$x(t1);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._script_view_element$__$script).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    refreshCoverage$1: [function(receiver, done) {
+      J.refreshCoverage$0$x(J.get$isolate$x(receiver._script_view_element$__$script)).whenComplete$1(done);
+    }, "call$1", "get$refreshCoverage", 2, 0, 20, 89],
+    static: {ScriptViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ScriptViewElement_methods.Element$created$0(receiver);
+        C.ScriptViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier44: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service", "package:observatory/service.dart", , D, {
+  "^": "",
+  ServiceObject_ServiceObject$_fromMap: function(owner, map) {
+    var t1, type, t2, t3, t4, t5, t6, obj, t7;
+    if (map == null)
+      return;
+    t1 = J.getInterceptor$asx(map);
+    t1 = t1.$index(map, "id") != null && t1.$index(map, "type") != null;
+    if (!t1)
+      N.Logger_Logger("").severe$1("Malformed service object: " + H.S(map));
+    type = J.$index$asx(map, "type");
+    t1 = J.getInterceptor$s(type);
+    switch (t1.startsWith$1(type, "@") ? t1.substring$1(type, 1) : type) {
+      case "Class":
+        t1 = D.Class;
+        t2 = [];
+        t2.$builtinTypeInfo = [t1];
+        t2 = new Q.ObservableList(null, null, t2, null, null);
+        t2.$builtinTypeInfo = [t1];
+        t1 = D.Class;
+        t3 = [];
+        t3.$builtinTypeInfo = [t1];
+        t3 = new Q.ObservableList(null, null, t3, null, null);
+        t3.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t4 = [];
+        t4.$builtinTypeInfo = [t1];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t5 = [];
+        t5.$builtinTypeInfo = [t1];
+        t5 = new Q.ObservableList(null, null, t5, null, null);
+        t5.$builtinTypeInfo = [t1];
+        t1 = D.Class;
+        t6 = [];
+        t6.$builtinTypeInfo = [t1];
+        t6 = new Q.ObservableList(null, null, t6, null, null);
+        t6.$builtinTypeInfo = [t1];
+        obj = new D.Class(null, null, null, null, null, null, null, null, null, null, new D.Allocations(new D.AllocationCount(0, 0, null, null), new D.AllocationCount(0, 0, null, null)), new D.Allocations(new D.AllocationCount(0, 0, null, null), new D.AllocationCount(0, 0, null, null)), t2, t3, t4, t5, t6, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Code":
+        t1 = [];
+        t1.$builtinTypeInfo = [D.CodeCallCount];
+        t2 = [];
+        t2.$builtinTypeInfo = [D.CodeCallCount];
+        t3 = D.CodeInstruction;
+        t4 = [];
+        t4.$builtinTypeInfo = [t3];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t3];
+        t3 = P.$int;
+        t5 = D.CodeTick;
+        t6 = new V.ObservableMap(P.HashMap_HashMap(null, null, null, t3, t5), null, null);
+        t6.$builtinTypeInfo = [t3, t5];
+        obj = new D.Code(null, 0, 0, 0, 0, 0, t1, t2, t4, t6, "", "", null, null, null, false, null, null, false, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Error":
+        obj = new D.DartError(null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Isolate":
+        t1 = new V.ObservableMap(P.HashMap_HashMap(null, null, null, null, null), null, null);
+        t1.$builtinTypeInfo = [null, null];
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.ServiceObject);
+        t3 = [];
+        t3.$builtinTypeInfo = [P.String];
+        t4 = [];
+        t4.$builtinTypeInfo = [D.TagProfileSnapshot];
+        t5 = D.Class;
+        t6 = [];
+        t6.$builtinTypeInfo = [t5];
+        t6 = new Q.ObservableList(null, null, t6, null, null);
+        t6.$builtinTypeInfo = [t5];
+        t5 = D.Library;
+        t7 = [];
+        t7.$builtinTypeInfo = [t5];
+        t7 = new Q.ObservableList(null, null, t7, null, null);
+        t7.$builtinTypeInfo = [t5];
+        t5 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.$double);
+        t5 = R._toObservableDeep(t5);
+        obj = new D.Isolate(t1, null, false, false, true, false, t2, new D.TagProfile(t3, t4, null, null, 20, 0), null, t6, null, t7, null, null, null, null, null, t5, new D.HeapSpace(0, 0, 0, 0, 0, null, null), new D.HeapSpace(0, 0, 0, 0, 0, null, null), null, null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Library":
+        t1 = D.Library;
+        t2 = [];
+        t2.$builtinTypeInfo = [t1];
+        t2 = new Q.ObservableList(null, null, t2, null, null);
+        t2.$builtinTypeInfo = [t1];
+        t1 = D.Script;
+        t3 = [];
+        t3.$builtinTypeInfo = [t1];
+        t3 = new Q.ObservableList(null, null, t3, null, null);
+        t3.$builtinTypeInfo = [t1];
+        t1 = D.Class;
+        t4 = [];
+        t4.$builtinTypeInfo = [t1];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t5 = [];
+        t5.$builtinTypeInfo = [t1];
+        t5 = new Q.ObservableList(null, null, t5, null, null);
+        t5.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t6 = [];
+        t6.$builtinTypeInfo = [t1];
+        t6 = new Q.ObservableList(null, null, t6, null, null);
+        t6.$builtinTypeInfo = [t1];
+        obj = new D.Library(null, t2, t3, t4, t5, t6, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "ServiceError":
+        obj = new D.ServiceError(null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "ServiceException":
+        obj = new D.ServiceException(null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Script":
+        t1 = D.ScriptLine;
+        t2 = [];
+        t2.$builtinTypeInfo = [t1];
+        t2 = new Q.ObservableList(null, null, t2, null, null);
+        t2.$builtinTypeInfo = [t1];
+        obj = new D.Script(t2, P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, P.$int), null, null, null, null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Socket":
+        obj = new D.Socket(null, null, null, null, "", false, false, false, false, null, null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      default:
+        t1 = new V.ObservableMap(P.HashMap_HashMap(null, null, null, null, null), null, null);
+        t1.$builtinTypeInfo = [null, null];
+        obj = new D.ServiceMap(t1, owner, null, null, false, null, null, null, null, null);
+    }
+    obj.update$1(map);
+    return obj;
+  },
+  _isServiceMap: function(m) {
+    var t1;
+    if (m != null) {
+      t1 = J.getInterceptor$asx(m);
+      t1 = t1.$index(m, "id") != null && t1.$index(m, "type") != null;
+    } else
+      t1 = false;
+    return t1;
+  },
+  _upgradeCollection: function(collection, owner) {
+    var t1 = J.getInterceptor(collection);
+    if (!!t1.$isServiceMap)
+      return;
+    if (!!t1.$isObservableMap)
+      D._upgradeObservableMap(collection, owner);
+    else if (!!t1.$isObservableList)
+      D._upgradeObservableList(collection, owner);
+  },
+  _upgradeObservableMap: function(map, owner) {
+    map.forEach$1(0, new D._upgradeObservableMap_closure(map, owner));
+  },
+  _upgradeObservableList: function(list, owner) {
+    var t1, i, v, t2, t3, t4;
+    for (t1 = list._observable_list$_list, i = 0; i < t1.length; ++i) {
+      v = t1[i];
+      t2 = J.getInterceptor(v);
+      t3 = !!t2.$isObservableMap;
+      if (t3)
+        t4 = t2.$index(v, "id") != null && t2.$index(v, "type") != null;
+      else
+        t4 = false;
+      if (t4)
+        list.$indexSet(0, i, owner.getFromMap$1(v));
+      else if (!!t2.$isObservableList)
+        D._upgradeObservableList(v, owner);
+      else if (t3)
+        D._upgradeObservableMap(v, owner);
+    }
+  },
+  ServiceObject: {
+    "^": "ChangeNotifier;_service$__$name@,_service$__$vmName@",
+    get$vm: function(_) {
+      var t1 = this._owner;
+      return t1.get$vm(t1);
+    },
+    get$isolate: function(_) {
+      var t1 = this._owner;
+      return t1.get$isolate(t1);
+    },
+    get$id: function(_) {
+      return this._id;
+    },
+    get$serviceType: function() {
+      return this._serviceType;
+    },
+    get$link: function(_) {
+      return this._owner.relativeLink$1(this._id);
+    },
+    get$loaded: function(_) {
+      return this._loaded;
+    },
+    get$canCache: function() {
+      return false;
+    },
+    get$immutable: function() {
+      return false;
+    },
+    get$name: function(_) {
+      return this.get$_service$__$name();
+    },
+    set$name: function(_, value) {
+      this.set$_service$__$name(this.notifyPropertyChange$3(this, C.Symbol_name, this.get$_service$__$name(), value));
+    },
+    get$vmName: function() {
+      return this.get$_service$__$vmName();
+    },
+    set$vmName: function(value) {
+      this.set$_service$__$vmName(this.notifyPropertyChange$3(this, C.Symbol_vmName, this.get$_service$__$vmName(), value));
+    },
+    load$0: function(_) {
+      if (this._loaded)
+        return P._Future$immediate(this, null);
+      return this.reload$0(0);
+    },
+    reload$0: function(_) {
+      var t1;
+      if (J.$eq(this._id, ""))
+        return P._Future$immediate(this, null);
+      if (this._loaded && this.get$immutable())
+        return P._Future$immediate(this, null);
+      t1 = this._inProgressReload;
+      if (t1 == null) {
+        t1 = this.get$vm(this).getAsMap$1(this.get$link(this)).then$1(new D.ServiceObject_reload_closure(this)).whenComplete$1(new D.ServiceObject_reload_closure0(this));
+        this._inProgressReload = t1;
+      }
+      return t1;
+    },
+    update$1: function(map) {
+      var t1, mapIsRef, mapType, t2;
+      t1 = J.getInterceptor$asx(map);
+      mapIsRef = J.startsWith$1$s(t1.$index(map, "type"), "@");
+      mapType = t1.$index(map, "type");
+      t2 = J.getInterceptor$s(mapType);
+      if (t2.startsWith$1(mapType, "@"))
+        mapType = t2.substring$1(mapType, 1);
+      t2 = this._id;
+      if (t2 != null && !J.$eq(t2, t1.$index(map, "id")))
+        ;
+      this._id = t1.$index(map, "id");
+      this._serviceType = mapType;
+      this._service$_update$2(0, map, mapIsRef);
+    },
+    $isServiceObject: true
+  },
+  ServiceObject_reload_closure: {
+    "^": "Closure:184;this_0",
+    call$1: [function(map) {
+      var mapType, t1;
+      mapType = J.$index$asx(map, "type");
+      t1 = J.getInterceptor$s(mapType);
+      if (t1.startsWith$1(mapType, "@"))
+        mapType = t1.substring$1(mapType, 1);
+      t1 = this.this_0;
+      if (!J.$eq(mapType, t1._serviceType))
+        return D.ServiceObject_ServiceObject$_fromMap(t1._owner, map);
+      t1.update$1(map);
+      return t1;
+    }, "call$1", null, 2, 0, null, 183, "call"],
+    $isFunction: true
+  },
+  ServiceObject_reload_closure0: {
+    "^": "Closure:69;this_1",
+    call$0: [function() {
+      this.this_1._inProgressReload = null;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  ServiceObjectOwner: {
+    "^": "ServiceObject;"
+  },
+  VM: {
+    "^": "ServiceObjectOwner_ChangeNotifier;",
+    get$vm: function(_) {
+      return this;
+    },
+    get$isolate: function(_) {
+      return;
+    },
+    get$isolates: function() {
+      var t1 = this._isolateCache;
+      return t1.get$values(t1);
+    },
+    get$link: function(_) {
+      return H.S(this._id);
+    },
+    relativeLink$1: [function(id) {
+      return H.S(id);
+    }, "call$1", "get$relativeLink", 2, 0, 151, 185],
+    get$version: function(_) {
+      return this._service$__$version;
+    },
+    get$uptime: function() {
+      return this._service$__$uptime;
+    },
+    get$assertsEnabled: function() {
+      return this._service$__$assertsEnabled;
+    },
+    get$typeChecksEnabled: function() {
+      return this._service$__$typeChecksEnabled;
+    },
+    get$pid: function() {
+      return this._service$__$pid;
+    },
+    get$lastUpdate: function() {
+      return this._service$__$lastUpdate;
+    },
+    _parseObjectId$1: function(id) {
+      var m, t1, t2, t3;
+      m = $.get$VM__currentObjectMatcher().matchAsPrefix$1(0, id);
+      if (m == null)
+        return;
+      t1 = m._match;
+      t2 = t1.input;
+      t3 = t1.index;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1 = J.get$length$asx(t1[0]);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return C.JSString_methods.substring$1(t2, t3 + t1);
+    },
+    _parseIsolateId$1: function(id) {
+      var m, t1, t2;
+      m = $.get$VM__currentIsolateMatcher().matchAsPrefix$1(0, id);
+      if (m == null)
+        return "";
+      t1 = m._match;
+      t2 = t1.index;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1 = J.get$length$asx(t1[0]);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return J.substring$2$s(id, 0, t2 + t1);
+    },
+    getFromMap$1: function(map) {
+      throw H.wrapException(P.UnimplementedError$(null));
+    },
+    _getIsolate$1: function(isolateId) {
+      var isolate;
+      if (isolateId === "")
+        return P._Future$immediate(null, null);
+      isolate = this._isolateCache.$index(0, isolateId);
+      if (isolate != null)
+        return P._Future$immediate(isolate, null);
+      return this.reload$0(0).then$1(new D.VM__getIsolate_closure(this, isolateId));
+    },
+    get$1: function(id) {
+      var isolateId, objectId, obj;
+      if (J.startsWith$1$s(id, "isolates/")) {
+        isolateId = this._parseIsolateId$1(id);
+        objectId = this._parseObjectId$1(id);
+        return this._getIsolate$1(isolateId).then$1(new D.VM_get_closure(this, objectId));
+      }
+      obj = this._cache.$index(0, id);
+      if (obj != null)
+        return J.reload$0$x(obj);
+      return this.getAsMap$1(id).then$1(new D.VM_get_closure0(this, id));
+    },
+    _service$_reviver$2: [function(key, value) {
+      return value;
+    }, "call$2", "get$_service$_reviver", 4, 0, 75],
+    _parseJSON$1: function(response) {
+      var map, decoder, exception;
+      map = null;
+      try {
+        decoder = new P.JsonDecoder(this.get$_service$_reviver());
+        map = P._parseJson(response, decoder.get$_reviver());
+      } catch (exception) {
+        H.unwrapException(exception);
+        return;
+      }
+
+      return R._toObservableDeep(map);
+    },
+    _processMap$1: function(map) {
+      var t1;
+      if (!D._isServiceMap(map)) {
+        t1 = P.LinkedHashMap_LinkedHashMap$_literal(["type", "ServiceException", "id", "", "kind", "FormatException", "response", map, "message", "Top level service responses must be service maps."], null, null);
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this, R._toObservableDeep(t1)), null, null);
+      }
+      t1 = J.getInterceptor$asx(map);
+      if (J.$eq(t1.$index(map, "type"), "ServiceError"))
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this, map), null, null);
+      else if (J.$eq(t1.$index(map, "type"), "ServiceException"))
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this, map), null, null);
+      return P._Future$immediate(map, null);
+    },
+    getAsMap$1: function(id) {
+      return this.getString$1(0, id).then$1(new D.VM_getAsMap_closure(this)).catchError$2$test(new D.VM_getAsMap_closure0(this), new D.VM_getAsMap_closure1()).catchError$2$test(new D.VM_getAsMap_closure2(this), new D.VM_getAsMap_closure3());
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "version");
+      this._service$__$version = F.notifyPropertyChangeHelper(this, C.Symbol_version, this._service$__$version, t2);
+      t2 = t1.$index(map, "architecture");
+      this._service$__$architecture = F.notifyPropertyChangeHelper(this, C.Symbol_architecture, this._service$__$architecture, t2);
+      t2 = t1.$index(map, "uptime");
+      this._service$__$uptime = F.notifyPropertyChangeHelper(this, C.Symbol_uptime, this._service$__$uptime, t2);
+      t2 = P.DateTime$fromMillisecondsSinceEpoch(H.Primitives_parseInt(t1.$index(map, "date"), null, null), false);
+      this._service$__$lastUpdate = F.notifyPropertyChangeHelper(this, C.Symbol_lastUpdate, this._service$__$lastUpdate, t2);
+      t2 = t1.$index(map, "assertsEnabled");
+      this._service$__$assertsEnabled = F.notifyPropertyChangeHelper(this, C.Symbol_assertsEnabled, this._service$__$assertsEnabled, t2);
+      t2 = t1.$index(map, "pid");
+      this._service$__$pid = F.notifyPropertyChangeHelper(this, C.Symbol_pid, this._service$__$pid, t2);
+      t2 = t1.$index(map, "typeChecksEnabled");
+      this._service$__$typeChecksEnabled = F.notifyPropertyChangeHelper(this, C.Symbol_typeChecksEnabled, this._service$__$typeChecksEnabled, t2);
+      this._updateIsolates$1(t1.$index(map, "isolates"));
+    },
+    _updateIsolates$1: function(newIsolates) {
+      var oldIsolateCache, newIsolateCache, t1, isolateMap, isolateId, isolate;
+      oldIsolateCache = this._isolateCache;
+      newIsolateCache = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.Isolate);
+      for (t1 = J.get$iterator$ax(newIsolates); t1.moveNext$0();) {
+        isolateMap = t1.get$current();
+        isolateId = J.$index$asx(isolateMap, "id");
+        isolate = oldIsolateCache.$index(0, isolateId);
+        if (isolate != null)
+          newIsolateCache.$indexSet(0, isolateId, isolate);
+        else {
+          isolate = D.ServiceObject_ServiceObject$_fromMap(this, isolateMap);
+          newIsolateCache.$indexSet(0, isolateId, isolate);
+          N.Logger_Logger("").info$1("New isolate '" + H.S(isolate._id) + "'");
+        }
+      }
+      newIsolateCache.forEach$1(0, new D.VM__updateIsolates_closure());
+      this._isolateCache = newIsolateCache;
+    },
+    VM$0: function() {
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, "vm");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, "vm");
+      this._cache.$indexSet(0, "vm", this);
+      var t1 = P.LinkedHashMap_LinkedHashMap$_literal(["id", "vm", "type", "@VM"], null, null);
+      this.update$1(R._toObservableDeep(t1));
+    },
+    $isVM: true
+  },
+  ServiceObjectOwner_ChangeNotifier: {
+    "^": "ServiceObjectOwner+ChangeNotifier;",
+    $isObservable: true
+  },
+  VM__getIsolate_closure: {
+    "^": "Closure:13;this_0,isolateId_1",
+    call$1: [function(result) {
+      if (!J.getInterceptor(result).$isVM)
+        return;
+      return this.this_0._isolateCache.$index(0, this.isolateId_1);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  VM_get_closure: {
+    "^": "Closure:13;this_0,objectId_1",
+    call$1: [function(isolate) {
+      var t1;
+      if (isolate == null)
+        return this.this_0;
+      t1 = this.objectId_1;
+      if (t1 == null)
+        return J.reload$0$x(isolate);
+      else
+        return isolate.get$1(t1);
+    }, "call$1", null, 2, 0, null, 7, "call"],
+    $isFunction: true
+  },
+  VM_get_closure0: {
+    "^": "Closure:184;this_2,id_3",
+    call$1: [function(map) {
+      var t1, obj;
+      t1 = this.this_2;
+      obj = D.ServiceObject_ServiceObject$_fromMap(t1, map);
+      if (obj.get$canCache())
+        t1._cache.putIfAbsent$2(this.id_3, new D.VM_get__closure(obj));
+      return obj;
+    }, "call$1", null, 2, 0, null, 183, "call"],
+    $isFunction: true
+  },
+  VM_get__closure: {
+    "^": "Closure:69;obj_4",
+    call$0: function() {
+      return this.obj_4;
+    },
+    $isFunction: true
+  },
+  VM_getAsMap_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(response) {
+      var map, e, exception, t1;
+      map = null;
+      try {
+        map = this.this_0._parseJSON$1(response);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        P.print("Hit V8 bug.");
+        t1 = P.LinkedHashMap_LinkedHashMap$_literal(["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.S(e)], null, null);
+        t1 = R._toObservableDeep(t1);
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this.this_0, t1), null, null);
+      }
+
+      return this.this_0._processMap$1(map);
+    }, "call$1", null, 2, 0, null, 132, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure0: {
+    "^": "Closure:13;this_1",
+    call$1: [function(error) {
+      var t1 = this.this_1.errors;
+      if (t1._state >= 4)
+        H.throwExpression(t1._addEventError$0());
+      t1._sendData$1(error);
+      return P._Future$immediateError(error, null, null);
+    }, "call$1", null, 2, 0, null, 24, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure1: {
+    "^": "Closure:13;",
+    call$1: [function(e) {
+      return !!J.getInterceptor(e).$isServiceError;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure2: {
+    "^": "Closure:13;this_2",
+    call$1: [function(exception) {
+      var t1 = this.this_2.exceptions;
+      if (t1._state >= 4)
+        H.throwExpression(t1._addEventError$0());
+      t1._sendData$1(exception);
+      return P._Future$immediateError(exception, null, null);
+    }, "call$1", null, 2, 0, null, 85, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure3: {
+    "^": "Closure:13;",
+    call$1: [function(e) {
+      return !!J.getInterceptor(e).$isServiceException;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  VM__updateIsolates_closure: {
+    "^": "Closure:75;",
+    call$2: function(isolateId, isolate) {
+      J.reload$0$x(isolate);
+    },
+    $isFunction: true
+  },
+  TagProfileSnapshot: {
+    "^": "Object;seconds,counters>,_sum",
+    set$1: function(counters) {
+      var t1, t2, i, t3, t4;
+      t1 = this.counters;
+      H.IterableMixinWorkaround_setAllList(t1, 0, counters);
+      for (t2 = t1.length, i = 0; i < t2; ++i) {
+        t3 = this._sum;
+        t4 = t1[i];
+        if (typeof t4 !== "number")
+          return H.iae(t4);
+        this._sum = t3 + t4;
+      }
+    },
+    delta$2: function(counters, old_counters) {
+      var t1, t2, t3, t4, i, t5, t6;
+      for (t1 = this.counters, t2 = t1.length, t3 = J.getInterceptor$asx(counters), t4 = old_counters.length, i = 0; i < t2; ++i) {
+        t5 = t3.$index(counters, i);
+        if (i >= t4)
+          return H.ioore(old_counters, i);
+        t5 = J.$sub$n(t5, old_counters[i]);
+        t1[i] = t5;
+        t6 = this._sum;
+        if (typeof t5 !== "number")
+          return H.iae(t5);
+        this._sum = t6 + t5;
+      }
+    },
+    max$1: function(_, counters) {
+      var t1, t2, t3, i, t4, c;
+      t1 = J.getInterceptor$asx(counters);
+      t2 = this.counters;
+      t3 = t2.length;
+      i = 0;
+      while (true) {
+        t4 = t1.get$length(counters);
+        if (typeof t4 !== "number")
+          return H.iae(t4);
+        if (!(i < t4))
+          break;
+        c = t1.$index(counters, i);
+        if (i >= t3)
+          return H.ioore(t2, i);
+        t2[i] = J.$gt$n(t2[i], c) ? t2[i] : c;
+        ++i;
+      }
+    },
+    zero$0: function() {
+      var t1, t2, i;
+      for (t1 = this.counters, t2 = t1.length, i = 0; i < t2; ++i)
+        t1[i] = 0;
+    },
+    $isTagProfileSnapshot: true
+  },
+  TagProfile: {
+    "^": "Object;names<,snapshots<,_seconds,_maxSnapshot,_historySize,_countersLength",
+    get$updatedAtSeconds: function() {
+      return this._seconds;
+    },
+    _processTagProfile$2: function(seconds, tagProfile) {
+      var t1, counters, t2, i, t3, snapshot;
+      this._seconds = seconds;
+      t1 = J.getInterceptor$asx(tagProfile);
+      counters = t1.$index(tagProfile, "counters");
+      t2 = this.names;
+      if (t2.length === 0) {
+        C.JSArray_methods.addAll$1(t2, t1.$index(tagProfile, "names"));
+        this._countersLength = J.get$length$asx(t1.$index(tagProfile, "counters"));
+        for (t1 = this._historySize, t2 = this.snapshots, i = 0; t3 = this._countersLength, i < t1; ++i) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          t3 = Array(t3);
+          t3.fixed$length = init;
+          t3.$builtinTypeInfo = [P.$int];
+          snapshot = new D.TagProfileSnapshot(0, t3, 0);
+          snapshot.zero$0();
+          t2.push(snapshot);
+        }
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        t1 = Array(t3);
+        t1.fixed$length = init;
+        t1 = new D.TagProfileSnapshot(0, H.setRuntimeTypeInfo(t1, [P.$int]), 0);
+        this._maxSnapshot = t1;
+        t1.set$1(counters);
+        return;
+      }
+      t1 = this._countersLength;
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      t1 = Array(t1);
+      t1.fixed$length = init;
+      snapshot = new D.TagProfileSnapshot(seconds, H.setRuntimeTypeInfo(t1, [P.$int]), 0);
+      snapshot.delta$2(counters, this._maxSnapshot.counters);
+      this._maxSnapshot.max$1(0, counters);
+      t1 = this.snapshots;
+      t1.push(snapshot);
+      if (t1.length > this._historySize)
+        C.JSArray_methods.removeAt$1(t1, 0);
+    }
+  },
+  HeapSpace: {
+    "^": "ChangeNotifier;_service$__$used,_service$__$capacity,_service$__$external,_service$__$collections,_service$__$totalCollectionTimeInSeconds,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$used: function() {
+      return this._service$__$used;
+    },
+    get$capacity: function() {
+      return this._service$__$capacity;
+    },
+    get$external: function() {
+      return this._service$__$external;
+    },
+    get$collections: function() {
+      return this._service$__$collections;
+    },
+    get$totalCollectionTimeInSeconds: function() {
+      return this._service$__$totalCollectionTimeInSeconds;
+    },
+    update$1: function(heapMap) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(heapMap);
+      t2 = t1.$index(heapMap, "used");
+      this._service$__$used = F.notifyPropertyChangeHelper(this, C.Symbol_used, this._service$__$used, t2);
+      t2 = t1.$index(heapMap, "capacity");
+      this._service$__$capacity = F.notifyPropertyChangeHelper(this, C.Symbol_capacity, this._service$__$capacity, t2);
+      t2 = t1.$index(heapMap, "external");
+      this._service$__$external = F.notifyPropertyChangeHelper(this, C.Symbol_external, this._service$__$external, t2);
+      t2 = t1.$index(heapMap, "collections");
+      this._service$__$collections = F.notifyPropertyChangeHelper(this, C.Symbol_collections, this._service$__$collections, t2);
+      t1 = t1.$index(heapMap, "time");
+      this._service$__$totalCollectionTimeInSeconds = F.notifyPropertyChangeHelper(this, C.Symbol_totalCollectionTimeInSeconds, this._service$__$totalCollectionTimeInSeconds, t1);
+    }
+  },
+  Isolate: {
+    "^": "ServiceObjectOwner_ChangeNotifier0;_service$__$counters,_service$__$pauseEvent,_service$__$running,_service$__$idle,_service$__$loading,_service$__$ioEnabled,_cache,tagProfile,_service$__$objectClass,rootClasses,_service$__$rootLib,_service$__$libraries,_service$__$topFrame,_service$__$name:service$Isolate$_service$__$name@,_service$__$vmName:service$Isolate$_service$__$vmName@,_service$__$mainPort,_service$__$entry,timers,newSpace<,oldSpace<,_service$__$fileAndLine,_service$__$error,profileTrieRoot<,_trieDataCursor,_trieData,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$vm: function(_) {
+      return this._owner;
+    },
+    get$isolate: function(_) {
+      return this;
+    },
+    get$counters: function(_) {
+      return this._service$__$counters;
+    },
+    set$counters: function(_, value) {
+      this._service$__$counters = F.notifyPropertyChangeHelper(this, C.Symbol_counters, this._service$__$counters, value);
+    },
+    get$link: function(_) {
+      return "/" + H.S(this._id);
+    },
+    get$pauseEvent: function(_) {
+      return this._service$__$pauseEvent;
+    },
+    get$running: function() {
+      return this._service$__$running;
+    },
+    get$idle: function() {
+      return this._service$__$idle;
+    },
+    get$loading: function() {
+      return this._service$__$loading;
+    },
+    relativeLink$1: [function(id) {
+      return "/" + H.S(this._id) + "/" + H.S(id);
+    }, "call$1", "get$relativeLink", 2, 0, 151, 185],
+    processProfile$1: function(profile) {
+      var codeTable, t1, t2, exclusiveTrie;
+      codeTable = H.setRuntimeTypeInfo([], [D.Code]);
+      t1 = J.getInterceptor$asx(profile);
+      for (t2 = J.get$iterator$ax(t1.$index(profile, "codes")); t2.moveNext$0();)
+        codeTable.push(J.$index$asx(t2.get$current(), "code"));
+      this._resetProfileData$0();
+      this._updateProfileData$2(profile, codeTable);
+      exclusiveTrie = t1.$index(profile, "exclusive_trie");
+      if (exclusiveTrie != null)
+        this.profileTrieRoot = this._processProfileTrie$2(exclusiveTrie, codeTable);
+    },
+    _resetProfileData$0: function() {
+      var t1 = this._cache;
+      t1.get$values(t1).forEach$1(0, new D.Isolate__resetProfileData_closure());
+    },
+    _updateProfileData$2: function(profile, codeTable) {
+      var t1, codeRegions, sampleCount, codeRegion;
+      t1 = J.getInterceptor$asx(profile);
+      codeRegions = t1.$index(profile, "codes");
+      sampleCount = t1.$index(profile, "samples");
+      for (t1 = J.get$iterator$ax(codeRegions); t1.moveNext$0();) {
+        codeRegion = t1.get$current();
+        J.$index$asx(codeRegion, "code").updateProfileData$3(codeRegion, codeTable, sampleCount);
+      }
+    },
+    refreshCoverage$0: [function(_) {
+      return this.get$1("coverage").then$1(this.get$_processCoverage());
+    }, "call$0", "get$refreshCoverage", 0, 0, 186],
+    _processCoverage$1: [function(coverage) {
+      J.forEach$1$ax(J.$index$asx(coverage, "coverage"), new D.Isolate__processCoverage_closure(this));
+    }, "call$1", "get$_processCoverage", 2, 0, 134, 187],
+    getClassHierarchy$0: function() {
+      return this.get$1("classes").then$1(this.get$_loadClasses()).then$1(this.get$_buildClassHierarchy());
+    },
+    _loadClasses$1: [function(classList) {
+      var futureClasses, t1, cls, t2;
+      futureClasses = [];
+      for (t1 = J.get$iterator$ax(J.$index$asx(classList, "members")); t1.moveNext$0();) {
+        cls = t1.get$current();
+        t2 = J.getInterceptor(cls);
+        if (!!t2.$isClass)
+          futureClasses.push(t2.load$0(cls));
+      }
+      return P.Future_wait(futureClasses, false);
+    }, "call$1", "get$_loadClasses", 2, 0, 188, 189],
+    _buildClassHierarchy$1: [function(classes) {
+      var t1, t2, cls, t3;
+      t1 = this.rootClasses;
+      t1.clear$0(t1);
+      this._service$__$objectClass = F.notifyPropertyChangeHelper(this, C.Symbol_objectClass, this._service$__$objectClass, null);
+      for (t2 = J.get$iterator$ax(classes); t2.moveNext$0();) {
+        cls = t2.get$current();
+        if (cls.get$superClass() == null)
+          t1.add$1(0, cls);
+        if (J.$eq(cls.get$vmName(), "Object") && J.$eq(cls.get$isPatch(), false)) {
+          t3 = this._service$__$objectClass;
+          if (this.get$hasObservers(this) && !J.$eq(t3, cls)) {
+            t3 = new T.PropertyChangeRecord(this, C.Symbol_objectClass, t3, cls);
+            t3.$builtinTypeInfo = [null];
+            this.notifyChange$1(this, t3);
+          }
+          this._service$__$objectClass = cls;
+        }
+      }
+      return P._Future$immediate(this._service$__$objectClass, null);
+    }, "call$1", "get$_buildClassHierarchy", 2, 0, 190, 191],
+    getFromMap$1: function(map) {
+      var id, t1, obj;
+      if (map == null)
+        return;
+      id = J.$index$asx(map, "id");
+      t1 = this._cache;
+      obj = t1.$index(0, id);
+      if (obj != null)
+        return obj;
+      obj = D.ServiceObject_ServiceObject$_fromMap(this, map);
+      if (obj.get$canCache())
+        t1.$indexSet(0, id, obj);
+      return obj;
+    },
+    get$1: function(id) {
+      var obj = this._cache.$index(0, id);
+      if (obj != null)
+        return J.reload$0$x(obj);
+      return this._owner.getAsMap$1("/" + H.S(this._id) + "/" + H.S(id)).then$1(new D.Isolate_get_closure(this, id));
+    },
+    get$objectClass: function() {
+      return this._service$__$objectClass;
+    },
+    get$rootLib: function() {
+      return this._service$__$rootLib;
+    },
+    set$rootLib: function(value) {
+      this._service$__$rootLib = F.notifyPropertyChangeHelper(this, C.Symbol_rootLib, this._service$__$rootLib, value);
+    },
+    get$libraries: function() {
+      return this._service$__$libraries;
+    },
+    get$topFrame: function() {
+      return this._service$__$topFrame;
+    },
+    get$name: function(_) {
+      return this.service$Isolate$_service$__$name;
+    },
+    set$name: function(_, value) {
+      this.service$Isolate$_service$__$name = F.notifyPropertyChangeHelper(this, C.Symbol_name, this.service$Isolate$_service$__$name, value);
+    },
+    get$vmName: function() {
+      return this.service$Isolate$_service$__$vmName;
+    },
+    set$vmName: function(value) {
+      this.service$Isolate$_service$__$vmName = F.notifyPropertyChangeHelper(this, C.Symbol_vmName, this.service$Isolate$_service$__$vmName, value);
+    },
+    get$mainPort: function() {
+      return this._service$__$mainPort;
+    },
+    get$entry: function() {
+      return this._service$__$entry;
+    },
+    set$entry: function(value) {
+      this._service$__$entry = F.notifyPropertyChangeHelper(this, C.Symbol_entry, this._service$__$entry, value);
+    },
+    get$error: function(_) {
+      return this._service$__$error;
+    },
+    set$error: function(_, value) {
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, value);
+    },
+    updateHeapsFromMap$1: function(map) {
+      var t1 = J.getInterceptor$asx(map);
+      this.newSpace.update$1(t1.$index(map, "new"));
+      this.oldSpace.update$1(t1.$index(map, "old"));
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, countersMap, names, counts, sum, i, t3, t4, timerMap, features;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "mainPort");
+      this._service$__$mainPort = F.notifyPropertyChangeHelper(this, C.Symbol_mainPort, this._service$__$mainPort, t2);
+      t2 = t1.$index(map, "name");
+      this.service$Isolate$_service$__$name = F.notifyPropertyChangeHelper(this, C.Symbol_name, this.service$Isolate$_service$__$name, t2);
+      t2 = t1.$index(map, "name");
+      this.service$Isolate$_service$__$vmName = F.notifyPropertyChangeHelper(this, C.Symbol_vmName, this.service$Isolate$_service$__$vmName, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      this._service$__$loading = F.notifyPropertyChangeHelper(this, C.Symbol_loading, this._service$__$loading, false);
+      D._upgradeCollection(map, this);
+      if (t1.$index(map, "rootLib") == null || t1.$index(map, "timers") == null || t1.$index(map, "heaps") == null) {
+        N.Logger_Logger("").severe$1("Malformed 'Isolate' response: " + H.S(map));
+        return;
+      }
+      t2 = t1.$index(map, "rootLib");
+      this._service$__$rootLib = F.notifyPropertyChangeHelper(this, C.Symbol_rootLib, this._service$__$rootLib, t2);
+      if (t1.$index(map, "entry") != null) {
+        t2 = t1.$index(map, "entry");
+        this._service$__$entry = F.notifyPropertyChangeHelper(this, C.Symbol_entry, this._service$__$entry, t2);
+      }
+      if (t1.$index(map, "topFrame") != null) {
+        t2 = t1.$index(map, "topFrame");
+        this._service$__$topFrame = F.notifyPropertyChangeHelper(this, C.Symbol_topFrame, this._service$__$topFrame, t2);
+      } else
+        this._service$__$topFrame = F.notifyPropertyChangeHelper(this, C.Symbol_topFrame, this._service$__$topFrame, null);
+      countersMap = t1.$index(map, "tagCounters");
+      if (countersMap != null) {
+        t2 = J.getInterceptor$asx(countersMap);
+        names = t2.$index(countersMap, "names");
+        counts = t2.$index(countersMap, "counters");
+        t2 = J.getInterceptor$asx(counts);
+        sum = 0;
+        i = 0;
+        while (true) {
+          t3 = t2.get$length(counts);
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(i < t3))
+            break;
+          t3 = t2.$index(counts, i);
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          sum += t3;
+          ++i;
+        }
+        t3 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t3 = R._toObservableDeep(t3);
+        this._service$__$counters = F.notifyPropertyChangeHelper(this, C.Symbol_counters, this._service$__$counters, t3);
+        if (sum === 0) {
+          t2 = J.getInterceptor$asx(names);
+          i = 0;
+          while (true) {
+            t3 = t2.get$length(names);
+            if (typeof t3 !== "number")
+              return H.iae(t3);
+            if (!(i < t3))
+              break;
+            J.$indexSet$ax(this._service$__$counters, t2.$index(names, i), "0.0%");
+            ++i;
+          }
+        } else {
+          t3 = J.getInterceptor$asx(names);
+          i = 0;
+          while (true) {
+            t4 = t3.get$length(names);
+            if (typeof t4 !== "number")
+              return H.iae(t4);
+            if (!(i < t4))
+              break;
+            J.$indexSet$ax(this._service$__$counters, t3.$index(names, i), C.JSNumber_methods.toStringAsFixed$1(J.$div$n(t2.$index(counts, i), sum) * 100, 2) + "%");
+            ++i;
+          }
+        }
+      }
+      timerMap = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      J.forEach$1$ax(t1.$index(map, "timers"), new D.Isolate__update_closure(timerMap));
+      t2 = this.timers;
+      t3 = J.getInterceptor$ax(t2);
+      t3.$indexSet(t2, "total", timerMap.$index(0, "time_total_runtime"));
+      t3.$indexSet(t2, "compile", timerMap.$index(0, "time_compilation"));
+      t3.$indexSet(t2, "gc", 0);
+      t3.$indexSet(t2, "init", J.$add$ns(J.$add$ns(J.$add$ns(timerMap.$index(0, "time_script_loading"), timerMap.$index(0, "time_creating_snapshot")), timerMap.$index(0, "time_isolate_initialization")), timerMap.$index(0, "time_bootstrap")));
+      t3.$indexSet(t2, "dart", timerMap.$index(0, "time_dart_execution"));
+      this.updateHeapsFromMap$1(t1.$index(map, "heaps"));
+      features = t1.$index(map, "features");
+      if (features != null)
+        for (t2 = J.get$iterator$ax(features); t2.moveNext$0();)
+          if (J.$eq(t2.get$current(), "io")) {
+            t3 = this._service$__$ioEnabled;
+            if (this.get$hasObservers(this) && !J.$eq(t3, true)) {
+              t3 = new T.PropertyChangeRecord(this, C.Symbol_ioEnabled, t3, true);
+              t3.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t3);
+            }
+            this._service$__$ioEnabled = true;
+          }
+      t2 = t1.$index(map, "pauseEvent");
+      t2 = F.notifyPropertyChangeHelper(this, C.Symbol_pauseEvent, this._service$__$pauseEvent, t2);
+      this._service$__$pauseEvent = t2;
+      t2 = t2 == null && t1.$index(map, "topFrame") != null;
+      this._service$__$running = F.notifyPropertyChangeHelper(this, C.Symbol_running, this._service$__$running, t2);
+      t2 = this._service$__$pauseEvent == null && t1.$index(map, "topFrame") == null;
+      this._service$__$idle = F.notifyPropertyChangeHelper(this, C.Symbol_idle, this._service$__$idle, t2);
+      t2 = t1.$index(map, "error");
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, t2);
+      t2 = this._service$__$libraries;
+      t2.clear$0(t2);
+      for (t1 = J.get$iterator$ax(t1.$index(map, "libraries")); t1.moveNext$0();)
+        t2.add$1(0, t1.get$current());
+      t2.sort$1(t2, new D.Isolate__update_closure0());
+    },
+    updateTagProfile$0: function() {
+      return this._owner.getAsMap$1("/" + H.S(this._id) + "/profile/tag").then$1(new D.Isolate_updateTagProfile_closure(this));
+    },
+    _processProfileTrie$2: function(data, codeTable) {
+      this._trieDataCursor = 0;
+      this._trieData = data;
+      if (data == null)
+        return;
+      if (J.$lt$n(J.get$length$asx(data), 3))
+        return;
+      return this._readTrieNode$1(codeTable);
+    },
+    _readTrieNode$1: function(codeTable) {
+      var t1, t2, index, code, count, node, t3, children, i, child;
+      t1 = this._trieData;
+      t2 = this._trieDataCursor;
+      if (typeof t2 !== "number")
+        return t2.$add();
+      this._trieDataCursor = t2 + 1;
+      index = J.$index$asx(t1, t2);
+      if (index >>> 0 !== index || index >= codeTable.length)
+        return H.ioore(codeTable, index);
+      code = codeTable[index];
+      t2 = this._trieData;
+      t1 = this._trieDataCursor;
+      if (typeof t1 !== "number")
+        return t1.$add();
+      this._trieDataCursor = t1 + 1;
+      count = J.$index$asx(t2, t1);
+      t1 = [];
+      t1.$builtinTypeInfo = [D.CodeTrieNode];
+      node = new D.CodeTrieNode(code, count, t1, 0);
+      t2 = this._trieData;
+      t3 = this._trieDataCursor;
+      if (typeof t3 !== "number")
+        return t3.$add();
+      this._trieDataCursor = t3 + 1;
+      children = J.$index$asx(t2, t3);
+      if (typeof children !== "number")
+        return H.iae(children);
+      i = 0;
+      for (; i < children; ++i) {
+        child = this._readTrieNode$1(codeTable);
+        t1.push(child);
+        t2 = node.summedChildCount;
+        t3 = child.count;
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        node.summedChildCount = t2 + t3;
+      }
+      return node;
+    },
+    $isIsolate: true,
+    static: {"^": "Isolate_TAG_ROOT_ID"}
+  },
+  ServiceObjectOwner_ChangeNotifier0: {
+    "^": "ServiceObjectOwner+ChangeNotifier;",
+    $isObservable: true
+  },
+  Isolate__resetProfileData_closure: {
+    "^": "Closure:13;",
+    call$1: function(value) {
+      if (!!J.getInterceptor(value).$isCode) {
+        value._service$__$totalSamplesInProfile = F.notifyPropertyChangeHelper(value, C.Symbol_totalSamplesInProfile, value._service$__$totalSamplesInProfile, 0);
+        value.exclusiveTicks = 0;
+        value.inclusiveTicks = 0;
+        value._service$__$formattedInclusiveTicks = F.notifyPropertyChangeHelper(value, C.Symbol_formattedInclusiveTicks, value._service$__$formattedInclusiveTicks, "");
+        value._service$__$formattedExclusiveTicks = F.notifyPropertyChangeHelper(value, C.Symbol_formattedExclusiveTicks, value._service$__$formattedExclusiveTicks, "");
+        C.JSArray_methods.set$length(value.callers, 0);
+        C.JSArray_methods.set$length(value.callees, 0);
+        value.addressTicks.clear$0(0);
+      }
+    },
+    $isFunction: true
+  },
+  Isolate__processCoverage_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(scriptCoverage) {
+      var t1 = J.getInterceptor$asx(scriptCoverage);
+      t1.$index(scriptCoverage, "script")._processHits$1(t1.$index(scriptCoverage, "hits"));
+    }, "call$1", null, 2, 0, null, 192, "call"],
+    $isFunction: true
+  },
+  Isolate_get_closure: {
+    "^": "Closure:184;this_0,id_1",
+    call$1: [function(map) {
+      var t1, obj;
+      t1 = this.this_0;
+      obj = D.ServiceObject_ServiceObject$_fromMap(t1, map);
+      if (obj.get$canCache())
+        t1._cache.putIfAbsent$2(this.id_1, new D.Isolate_get__closure(obj));
+      return obj;
+    }, "call$1", null, 2, 0, null, 183, "call"],
+    $isFunction: true
+  },
+  Isolate_get__closure: {
+    "^": "Closure:69;obj_2",
+    call$0: function() {
+      return this.obj_2;
+    },
+    $isFunction: true
+  },
+  Isolate__update_closure: {
+    "^": "Closure:13;timerMap_0",
+    call$1: [function(timer) {
+      var t1 = J.getInterceptor$asx(timer);
+      this.timerMap_0.$indexSet(0, t1.$index(timer, "name"), t1.$index(timer, "time"));
+    }, "call$1", null, 2, 0, null, 193, "call"],
+    $isFunction: true
+  },
+  Isolate__update_closure0: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.compareTo$1$ns(J.get$name$x(a), J.get$name$x(b));
+    },
+    $isFunction: true
+  },
+  Isolate_updateTagProfile_closure: {
+    "^": "Closure:184;this_0",
+    call$1: [function(m) {
+      var t1, t2;
+      t1 = Date.now();
+      new P.DateTime(t1, false).DateTime$_now$0();
+      t2 = this.this_0.tagProfile;
+      t2._processTagProfile$2(t1 / 1000, m);
+      return t2;
+    }, "call$1", null, 2, 0, null, 145, "call"],
+    $isFunction: true
+  },
+  ServiceMap: {
+    "^": "ServiceObject;_service$_map,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$canCache: function() {
+      return (J.$eq(this._serviceType, "Class") || J.$eq(this._serviceType, "Function") || J.$eq(this._serviceType, "Field")) && !J.startsWith$1$s(this._id, $.ServiceMap_objectIdRingPrefix);
+    },
+    get$immutable: function() {
+      return false;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this._service$_map);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, t3;
+      this._loaded = !mapIsRef;
+      t1 = this._service$_map;
+      t1.clear$0(0);
+      t1.addAll$1(0, map);
+      t2 = t1._observable_map$_map;
+      t3 = t2.$index(0, "user_name");
+      this._service$__$name = this.notifyPropertyChange$3(0, C.Symbol_name, this._service$__$name, t3);
+      t2 = t2.$index(0, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(0, C.Symbol_vmName, this._service$__$vmName, t2);
+      D._upgradeCollection(t1, this._owner);
+    },
+    addAll$1: function(_, other) {
+      return this._service$_map.addAll$1(0, other);
+    },
+    clear$0: function(_) {
+      return this._service$_map.clear$0(0);
+    },
+    forEach$1: function(_, f) {
+      return this._service$_map._observable_map$_map.forEach$1(0, f);
+    },
+    $index: function(_, k) {
+      return this._service$_map._observable_map$_map.$index(0, k);
+    },
+    $indexSet: function(_, k, v) {
+      this._service$_map.$indexSet(0, k, v);
+      return v;
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$length(t1) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$length(t1) !== 0;
+    },
+    get$keys: function() {
+      return this._service$_map._observable_map$_map.get$keys();
+    },
+    get$values: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$values(t1);
+    },
+    get$length: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$length(t1);
+    },
+    deliverChanges$0: [function(_) {
+      var t1 = this._service$_map;
+      return t1.deliverChanges$0(t1);
+    }, "call$0", "get$deliverChanges", 0, 0, 111],
+    notifyChange$1: function(_, record) {
+      var t1 = this._service$_map;
+      return t1.notifyChange$1(t1, record);
+    },
+    notifyPropertyChange$3: function(_, field, oldValue, newValue) {
+      return F.notifyPropertyChangeHelper(this._service$_map, field, oldValue, newValue);
+    },
+    observed$0: [function(_) {
+      return;
+    }, "call$0", "get$observed", 0, 0, 18],
+    unobserved$0: [function(_) {
+      this._service$_map.change_notifier$ChangeNotifier$_changes = null;
+      return;
+    }, "call$0", "get$unobserved", 0, 0, 18],
+    get$changes: function(_) {
+      var t1 = this._service$_map;
+      return t1.get$changes(t1);
+    },
+    get$hasObservers: function(_) {
+      var t1, t2;
+      t1 = this._service$_map.change_notifier$ChangeNotifier$_changes;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isServiceMap: true,
+    $isObservableMap: true,
+    $asObservableMap: function() {
+      return [null, null];
+    },
+    $isMap: true,
+    $asMap: function() {
+      return [null, null];
+    },
+    $isObservable: true,
+    static: {"^": "ServiceMap_objectIdRingPrefix"}
+  },
+  DartError: {
+    "^": "ServiceObject_ChangeNotifier;_service$__$kind,_service$__$message,_service$__$exception,_service$__$stacktrace,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$message: function(_) {
+      return this._service$__$message;
+    },
+    get$exception: function(_) {
+      return this._service$__$exception;
+    },
+    set$exception: function(_, value) {
+      this._service$__$exception = F.notifyPropertyChangeHelper(this, C.Symbol_exception, this._service$__$exception, value);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, t3;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t2 = t1.$index(map, "message");
+      this._service$__$message = F.notifyPropertyChangeHelper(this, C.Symbol_message, this._service$__$message, t2);
+      t2 = this._owner;
+      t3 = D.ServiceObject_ServiceObject$_fromMap(t2, t1.$index(map, "exception"));
+      this._service$__$exception = F.notifyPropertyChangeHelper(this, C.Symbol_exception, this._service$__$exception, t3);
+      t1 = D.ServiceObject_ServiceObject$_fromMap(t2, t1.$index(map, "stacktrace"));
+      this._service$__$stacktrace = F.notifyPropertyChangeHelper(this, C.Symbol_stacktrace, this._service$__$stacktrace, t1);
+      t1 = "DartError " + H.S(this._service$__$kind);
+      t1 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t1);
+      this._service$__$name = t1;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t1);
+    }
+  },
+  ServiceObject_ChangeNotifier: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  ServiceError: {
+    "^": "ServiceObject_ChangeNotifier0;_service$__$kind,_service$__$message,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$message: function(_) {
+      return this._service$__$message;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      this._loaded = true;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t1 = t1.$index(map, "message");
+      this._service$__$message = F.notifyPropertyChangeHelper(this, C.Symbol_message, this._service$__$message, t1);
+      t1 = "ServiceError " + H.S(this._service$__$kind);
+      t1 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t1);
+      this._service$__$name = t1;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t1);
+    },
+    $isServiceError: true
+  },
+  ServiceObject_ChangeNotifier0: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  ServiceException: {
+    "^": "ServiceObject_ChangeNotifier1;_service$__$kind,_service$__$message,_service$__$response,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$message: function(_) {
+      return this._service$__$message;
+    },
+    get$response: function(_) {
+      return this._service$__$response;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t2 = t1.$index(map, "message");
+      this._service$__$message = F.notifyPropertyChangeHelper(this, C.Symbol_message, this._service$__$message, t2);
+      t1 = t1.$index(map, "response");
+      this._service$__$response = F.notifyPropertyChangeHelper(this, C.Symbol_response, this._service$__$response, t1);
+      t1 = "ServiceException " + H.S(this._service$__$kind);
+      t1 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t1);
+      this._service$__$name = t1;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t1);
+    },
+    $isServiceException: true
+  },
+  ServiceObject_ChangeNotifier1: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  Library: {
+    "^": "ServiceObject_ChangeNotifier2;_service$__$url,imports<,scripts<,classes>,variables<,functions<,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$url: function(_) {
+      return this._service$__$url;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return false;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, shortUrl, t3, t4;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "url");
+      shortUrl = F.notifyPropertyChangeHelper(this, C.Symbol_url, this._service$__$url, t2);
+      this._service$__$url = shortUrl;
+      if (J.startsWith$1$s(shortUrl, "file://") || J.startsWith$1$s(this._service$__$url, "http://")) {
+        t2 = this._service$__$url;
+        t3 = J.getInterceptor$asx(t2);
+        t4 = t3.lastIndexOf$1(t2, "/");
+        if (typeof t4 !== "number")
+          return t4.$add();
+        shortUrl = t3.substring$1(t2, t4 + 1);
+      }
+      t2 = t1.$index(map, "user_name");
+      t2 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t2);
+      this._service$__$name = t2;
+      if (J.get$isEmpty$asx(t2) === true)
+        this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, shortUrl);
+      t2 = t1.$index(map, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t2 = this._owner;
+      D._upgradeCollection(map, t2.get$isolate(t2));
+      t2 = this.imports;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "imports"));
+      t2 = this.scripts;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "scripts"));
+      t2 = this.classes;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "classes"));
+      t2 = this.variables;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "variables"));
+      t2 = this.functions;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "functions"));
+    },
+    $isLibrary: true
+  },
+  ServiceObject_ChangeNotifier2: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  AllocationCount: {
+    "^": "ChangeNotifier;_service$__$instances,_service$__$bytes,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$instances: function(_) {
+      return this._service$__$instances;
+    },
+    set$instances: function(_, value) {
+      this._service$__$instances = F.notifyPropertyChangeHelper(this, C.Symbol_instances, this._service$__$instances, value);
+    },
+    get$bytes: function() {
+      return this._service$__$bytes;
+    }
+  },
+  Allocations: {
+    "^": "Object;accumulated<,current<",
+    update$1: function(stats) {
+      var t1, t2, t3;
+      t1 = this.accumulated;
+      t2 = J.getInterceptor$asx(stats);
+      t3 = t2.$index(stats, 6);
+      t1._service$__$instances = F.notifyPropertyChangeHelper(t1, C.Symbol_instances, t1._service$__$instances, t3);
+      t3 = t2.$index(stats, 7);
+      t1._service$__$bytes = F.notifyPropertyChangeHelper(t1, C.Symbol_bytes, t1._service$__$bytes, t3);
+      t3 = this.current;
+      t1 = J.$add$ns(t2.$index(stats, 2), t2.$index(stats, 4));
+      t3._service$__$instances = F.notifyPropertyChangeHelper(t3, C.Symbol_instances, t3._service$__$instances, t1);
+      t2 = J.$add$ns(t2.$index(stats, 3), t2.$index(stats, 5));
+      t3._service$__$bytes = F.notifyPropertyChangeHelper(t3, C.Symbol_bytes, t3._service$__$bytes, t2);
+    },
+    static: {"^": "Allocations_ALLOCATED_BEFORE_GC,Allocations_ALLOCATED_BEFORE_GC_SIZE,Allocations_LIVE_AFTER_GC,Allocations_LIVE_AFTER_GC_SIZE,Allocations_ALLOCATED_SINCE_GC,Allocations_ALLOCATED_SINCE_GC_SIZE,Allocations_ACCUMULATED,Allocations_ACCUMULATED_SIZE"}
+  },
+  Class: {
+    "^": "ServiceObject_ChangeNotifier3;_service$__$library,_service$__$script,_service$__$superClass,_service$__$isAbstract,_service$__$isConst,_service$__$isFinalized,_service$__$isPatch,_service$__$isImplemented,_service$__$tokenPos,_service$__$error,newSpace<,oldSpace<,children>,subClasses<,fields<,functions<,interfaces<,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$library: function(_) {
+      return this._service$__$library;
+    },
+    set$library: function(_, value) {
+      this._service$__$library = F.notifyPropertyChangeHelper(this, C.Symbol_library, this._service$__$library, value);
+    },
+    get$script: function(_) {
+      return this._service$__$script;
+    },
+    set$script: function(_, value) {
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, value);
+    },
+    get$superClass: function() {
+      return this._service$__$superClass;
+    },
+    set$superClass: function(value) {
+      this._service$__$superClass = F.notifyPropertyChangeHelper(this, C.Symbol_superClass, this._service$__$superClass, value);
+    },
+    get$isAbstract: function() {
+      return this._service$__$isAbstract;
+    },
+    get$isPatch: function() {
+      return this._service$__$isPatch;
+    },
+    get$tokenPos: function() {
+      return this._service$__$tokenPos;
+    },
+    set$tokenPos: function(value) {
+      this._service$__$tokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_tokenPos, this._service$__$tokenPos, value);
+    },
+    get$error: function(_) {
+      return this._service$__$error;
+    },
+    set$error: function(_, value) {
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, value);
+    },
+    get$hasNoAllocations: function() {
+      var t1, t2;
+      t1 = this.newSpace;
+      t2 = t1.accumulated;
+      if (J.$eq(t2._service$__$instances, 0) && J.$eq(t2._service$__$bytes, 0)) {
+        t1 = t1.current;
+        t1 = J.$eq(t1._service$__$instances, 0) && J.$eq(t1._service$__$bytes, 0);
+      } else
+        t1 = false;
+      if (t1) {
+        t1 = this.oldSpace;
+        t2 = t1.accumulated;
+        if (J.$eq(t2._service$__$instances, 0) && J.$eq(t2._service$__$bytes, 0)) {
+          t1 = t1.current;
+          t1 = J.$eq(t1._service$__$instances, 0) && J.$eq(t1._service$__$bytes, 0);
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return false;
+    },
+    toString$0: function(_) {
+      return "Service Class: " + H.S(this._service$__$vmName);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, allocationStats;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "user_name");
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t2);
+      t2 = t1.$index(map, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t2 = this._owner;
+      D._upgradeCollection(map, t2.get$isolate(t2));
+      if (!!J.getInterceptor(t1.$index(map, "library")).$isLibrary) {
+        t2 = t1.$index(map, "library");
+        this._service$__$library = F.notifyPropertyChangeHelper(this, C.Symbol_library, this._service$__$library, t2);
+      } else
+        this._service$__$library = F.notifyPropertyChangeHelper(this, C.Symbol_library, this._service$__$library, null);
+      t2 = t1.$index(map, "script");
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, t2);
+      t2 = t1.$index(map, "abstract");
+      this._service$__$isAbstract = F.notifyPropertyChangeHelper(this, C.Symbol_isAbstract, this._service$__$isAbstract, t2);
+      t2 = t1.$index(map, "const");
+      this._service$__$isConst = F.notifyPropertyChangeHelper(this, C.Symbol_isConst, this._service$__$isConst, t2);
+      t2 = t1.$index(map, "finalized");
+      this._service$__$isFinalized = F.notifyPropertyChangeHelper(this, C.Symbol_isFinalized, this._service$__$isFinalized, t2);
+      t2 = t1.$index(map, "patch");
+      this._service$__$isPatch = F.notifyPropertyChangeHelper(this, C.Symbol_isPatch, this._service$__$isPatch, t2);
+      t2 = t1.$index(map, "implemented");
+      this._service$__$isImplemented = F.notifyPropertyChangeHelper(this, C.Symbol_isImplemented, this._service$__$isImplemented, t2);
+      t2 = t1.$index(map, "tokenPos");
+      this._service$__$tokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_tokenPos, this._service$__$tokenPos, t2);
+      t2 = this.subClasses;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "subclasses"));
+      t2 = this.fields;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "fields"));
+      t2 = this.functions;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "functions"));
+      t2 = t1.$index(map, "super");
+      t2 = F.notifyPropertyChangeHelper(this, C.Symbol_superClass, this._service$__$superClass, t2);
+      this._service$__$superClass = t2;
+      if (t2 != null)
+        t2._addToChildren$1(this);
+      t2 = t1.$index(map, "error");
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, t2);
+      allocationStats = t1.$index(map, "allocationStats");
+      if (allocationStats != null) {
+        t1 = J.getInterceptor$asx(allocationStats);
+        this.newSpace.update$1(t1.$index(allocationStats, "new"));
+        this.oldSpace.update$1(t1.$index(allocationStats, "old"));
+      }
+    },
+    _addToChildren$1: function(cls) {
+      var t1 = this.children;
+      if (t1.contains$1(t1, cls))
+        return;
+      t1.add$1(0, cls);
+    },
+    get$1: function(command) {
+      var t1 = this._owner;
+      return t1.get$isolate(t1).get$1(J.$add$ns(this._id, "/" + H.S(command)));
+    },
+    $isClass: true
+  },
+  ServiceObject_ChangeNotifier3: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  ScriptLine: {
+    "^": "ChangeNotifier;line<,text>,_service$__$hits,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$hits: function() {
+      return this._service$__$hits;
+    },
+    set$hits: function(value) {
+      this._service$__$hits = F.notifyPropertyChangeHelper(this, C.Symbol_hits, this._service$__$hits, value);
+    },
+    $isScriptLine: true
+  },
+  Script: {
+    "^": "ServiceObject_ChangeNotifier4;lines>,_hits,_service$__$kind,_service$__$firstTokenPos,_service$__$lastTokenPos,_shortUrl,_url,_tokenToLine,_tokenToCol,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$firstTokenPos: function() {
+      return this._service$__$firstTokenPos;
+    },
+    set$firstTokenPos: function(value) {
+      var t1 = this._service$__$firstTokenPos;
+      if (this.get$hasObservers(this) && !J.$eq(t1, value)) {
+        t1 = new T.PropertyChangeRecord(this, C.Symbol_firstTokenPos, t1, value);
+        t1.$builtinTypeInfo = [null];
+        this.notifyChange$1(this, t1);
+      }
+      this._service$__$firstTokenPos = value;
+    },
+    get$lastTokenPos: function() {
+      return this._service$__$lastTokenPos;
+    },
+    set$lastTokenPos: function(value) {
+      var t1 = this._service$__$lastTokenPos;
+      if (this.get$hasObservers(this) && !J.$eq(t1, value)) {
+        t1 = new T.PropertyChangeRecord(this, C.Symbol_lastTokenPos, t1, value);
+        t1.$builtinTypeInfo = [null];
+        this.notifyChange$1(this, t1);
+      }
+      this._service$__$lastTokenPos = value;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return true;
+    },
+    getLine$1: function(line) {
+      var t1, t2;
+      t1 = J.$sub$n(line, 1);
+      t2 = this.lines._observable_list$_list;
+      if (t1 >>> 0 !== t1 || t1 >= t2.length)
+        return H.ioore(t2, t1);
+      return t2[t1];
+    },
+    tokenToLine$1: function(token) {
+      return this._tokenToLine.$index(0, token);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, t3, t4;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t2 = t1.$index(map, "name");
+      this._url = t2;
+      t3 = J.getInterceptor$asx(t2);
+      t4 = t3.lastIndexOf$1(t2, "/");
+      if (typeof t4 !== "number")
+        return t4.$add();
+      t4 = t3.substring$1(t2, t4 + 1);
+      this._shortUrl = t4;
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t4);
+      t4 = this._url;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t4);
+      this._processSource$1(t1.$index(map, "source"));
+      this._parseTokenPosTable$1(t1.$index(map, "tokenPosTable"));
+    },
+    _parseTokenPosTable$1: function(table) {
+      var t1, line, t2, lineNumber, pos, t3, tokenOffset, colNumber, t4;
+      if (table == null)
+        return;
+      this._tokenToLine = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      this._tokenToCol = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      this._service$__$firstTokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_firstTokenPos, this._service$__$firstTokenPos, null);
+      this._service$__$lastTokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_lastTokenPos, this._service$__$lastTokenPos, null);
+      for (t1 = J.get$iterator$ax(table); t1.moveNext$0();) {
+        line = t1.get$current();
+        t2 = J.getInterceptor$asx(line);
+        lineNumber = t2.$index(line, 0);
+        pos = 1;
+        while (true) {
+          t3 = t2.get$length(line);
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(pos < t3))
+            break;
+          tokenOffset = t2.$index(line, pos);
+          colNumber = t2.$index(line, pos + 1);
+          t3 = this._service$__$firstTokenPos;
+          if (t3 == null) {
+            if (this.get$hasObservers(this) && !J.$eq(t3, tokenOffset)) {
+              t3 = new T.PropertyChangeRecord(this, C.Symbol_firstTokenPos, t3, tokenOffset);
+              t3.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t3);
+            }
+            this._service$__$firstTokenPos = tokenOffset;
+            t3 = this._service$__$lastTokenPos;
+            if (this.get$hasObservers(this) && !J.$eq(t3, tokenOffset)) {
+              t3 = new T.PropertyChangeRecord(this, C.Symbol_lastTokenPos, t3, tokenOffset);
+              t3.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t3);
+            }
+            this._service$__$lastTokenPos = tokenOffset;
+          } else {
+            t3 = J.$le$n(t3, tokenOffset) ? this._service$__$firstTokenPos : tokenOffset;
+            t4 = this._service$__$firstTokenPos;
+            if (this.get$hasObservers(this) && !J.$eq(t4, t3)) {
+              t4 = new T.PropertyChangeRecord(this, C.Symbol_firstTokenPos, t4, t3);
+              t4.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t4);
+            }
+            this._service$__$firstTokenPos = t3;
+            t3 = J.$ge$n(this._service$__$lastTokenPos, tokenOffset) ? this._service$__$lastTokenPos : tokenOffset;
+            t4 = this._service$__$lastTokenPos;
+            if (this.get$hasObservers(this) && !J.$eq(t4, t3)) {
+              t4 = new T.PropertyChangeRecord(this, C.Symbol_lastTokenPos, t4, t3);
+              t4.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t4);
+            }
+            this._service$__$lastTokenPos = t3;
+          }
+          this._tokenToLine.$indexSet(0, tokenOffset, lineNumber);
+          this._tokenToCol.$indexSet(0, tokenOffset, colNumber);
+          pos += 2;
+        }
+      }
+    },
+    _processHits$1: function(scriptHits) {
+      var t1, t2, i, t3, line, hit, oldHits;
+      t1 = J.getInterceptor$asx(scriptHits);
+      t2 = this._hits;
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(scriptHits);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        line = t1.$index(scriptHits, i);
+        hit = t1.$index(scriptHits, i + 1);
+        oldHits = t2.$index(0, line);
+        t2.$indexSet(0, line, oldHits != null ? J.$add$ns(hit, oldHits) : hit);
+        i += 2;
+      }
+      this._applyHitsToLines$0();
+    },
+    _processSource$1: function(source) {
+      var sourceLines, t1, i, i0;
+      this._loaded = false;
+      if (source == null)
+        return;
+      sourceLines = J.split$1$s(source, "\n");
+      if (sourceLines.length === 0)
+        return;
+      this._loaded = true;
+      t1 = this.lines;
+      t1.clear$0(t1);
+      N.Logger_Logger("").info$1("Adding " + sourceLines.length + " source lines for " + H.S(this._url));
+      for (i = 0; i < sourceLines.length; i = i0) {
+        i0 = i + 1;
+        t1.add$1(0, new D.ScriptLine(i0, sourceLines[i], null, null, null));
+      }
+      this._applyHitsToLines$0();
+    },
+    _applyHitsToLines$0: function() {
+      var t1, t2, line;
+      t1 = this.lines;
+      if (t1._observable_list$_list.length === 0)
+        return;
+      for (t1 = t1.get$iterator(t1), t2 = this._hits; t1.moveNext$0();) {
+        line = t1._current;
+        line.set$hits(t2.$index(0, line.get$line()));
+      }
+    },
+    $isScript: true
+  },
+  ServiceObject_ChangeNotifier4: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  CodeTick: {
+    "^": "Object;address<,exclusiveTicks<,inclusiveTicks<",
+    $isCodeTick: true
+  },
+  PcDescriptor: {
+    "^": "ChangeNotifier;address<,deoptId,tokenPos<,tryIndex,kind>,_service$__$script,_service$__$formattedLine,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$script: function(_) {
+      return this._service$__$script;
+    },
+    set$script: function(_, value) {
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, value);
+    },
+    get$formattedLine: function() {
+      return this._service$__$formattedLine;
+    },
+    formattedDeoptId$0: [function() {
+      var t1, t2;
+      t1 = this.deoptId;
+      t2 = J.getInterceptor(t1);
+      if (t2.$eq(t1, -1))
+        return "N/A";
+      return t2.toString$0(t1);
+    }, "call$0", "get$formattedDeoptId", 0, 0, 194],
+    processScript$1: function(script) {
+      var t1, line;
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, null);
+      t1 = this.tokenPos;
+      if (J.$eq(t1, -1))
+        return;
+      line = script.tokenToLine$1(t1);
+      if (line == null)
+        return;
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, script);
+      t1 = J.get$text$x(script.getLine$1(line));
+      this._service$__$formattedLine = F.notifyPropertyChangeHelper(this, C.Symbol_formattedLine, this._service$__$formattedLine, t1);
+    },
+    $isPcDescriptor: true
+  },
+  CodeInstruction: {
+    "^": "ChangeNotifier;address<,machine,human<,_service$__$jumpTarget,descriptors<,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$jumpTarget: function() {
+      return this._service$__$jumpTarget;
+    },
+    get$isComment: function() {
+      return J.$eq(this.address, 0);
+    },
+    get$hasDescriptors: function() {
+      return this.descriptors._observable_list$_list.length > 0;
+    },
+    formattedAddress$0: [function() {
+      var t1, t2;
+      t1 = this.address;
+      t2 = J.getInterceptor(t1);
+      if (t2.$eq(t1, 0))
+        return "";
+      return "0x" + t2.toRadixString$1(t1, 16);
+    }, "call$0", "get$formattedAddress", 0, 0, 194],
+    formattedInclusive$1: [function(code) {
+      var tick;
+      if (code == null)
+        return "";
+      tick = code.get$addressTicks()._observable_map$_map.$index(0, this.address);
+      if (tick == null)
+        return "";
+      if (J.$eq(tick.get$inclusiveTicks(), tick.get$exclusiveTicks()))
+        return "";
+      return D.CodeInstruction_formatPercent(tick.get$inclusiveTicks(), code.get$totalSamplesInProfile()) + " (" + H.S(tick.get$inclusiveTicks()) + ")";
+    }, "call$1", "get$formattedInclusive", 2, 0, 195, 71],
+    formattedExclusive$1: [function(code) {
+      var tick;
+      if (code == null)
+        return "";
+      tick = code.get$addressTicks()._observable_map$_map.$index(0, this.address);
+      if (tick == null)
+        return "";
+      return D.CodeInstruction_formatPercent(tick.get$exclusiveTicks(), code.get$totalSamplesInProfile()) + " (" + H.S(tick.get$exclusiveTicks()) + ")";
+    }, "call$1", "get$formattedExclusive", 2, 0, 195, 71],
+    _getJumpAddress$0: function() {
+      var address, chunks, t1, exception;
+      chunks = J.split$1$s(this.human, " ");
+      t1 = chunks.length;
+      if (t1 !== 2)
+        return 0;
+      if (1 >= t1)
+        return H.ioore(chunks, 1);
+      address = chunks[1];
+      if (J.startsWith$1$s(address, "0x"))
+        address = J.substring$1$s(address, 2);
+      try {
+        t1 = H.Primitives_parseInt(address, 16, null);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return 0;
+      }
+
+    },
+    _resolveJumpTarget$1: function(instructions) {
+      var t1, address, t2, i, instruction;
+      t1 = this.human;
+      if (!J.startsWith$1$s(t1, "j"))
+        return;
+      address = this._getJumpAddress$0();
+      t2 = J.getInterceptor(address);
+      if (t2.$eq(address, 0)) {
+        P.print("Could not determine jump address for " + H.S(t1));
+        return;
+      }
+      for (t1 = instructions._observable_list$_list, i = 0; i < t1.length; ++i) {
+        instruction = t1[i];
+        if (J.$eq(instruction.get$address(), address)) {
+          t1 = this._service$__$jumpTarget;
+          if (this.get$hasObservers(this) && !J.$eq(t1, instruction)) {
+            t1 = new T.PropertyChangeRecord(this, C.Symbol_jumpTarget, t1, instruction);
+            t1.$builtinTypeInfo = [null];
+            this.notifyChange$1(this, t1);
+          }
+          this._service$__$jumpTarget = instruction;
+          return;
+        }
+      }
+      P.print("Could not find instruction at " + t2.toRadixString$1(address, 16));
+    },
+    $isCodeInstruction: true,
+    static: {CodeInstruction_formatPercent: function(a, total) {
+        return C.JSNumber_methods.toStringAsFixed$1(100 * J.$div$n(a, total), 2) + "%";
+      }}
+  },
+  CodeKind: {
+    "^": "Object;_service$_value",
+    toString$0: function(_) {
+      return this._service$_value;
+    },
+    static: {"^": "CodeKind_Native0,CodeKind_Dart0,CodeKind_Collected0,CodeKind_Reused0,CodeKind_Tag0", CodeKind_fromString: function(s) {
+        var t1 = J.getInterceptor(s);
+        if (t1.$eq(s, "Native"))
+          return C.CodeKind_Native;
+        else if (t1.$eq(s, "Dart"))
+          return C.CodeKind_Dart;
+        else if (t1.$eq(s, "Collected"))
+          return C.CodeKind_Collected;
+        else if (t1.$eq(s, "Reused"))
+          return C.CodeKind_Reused;
+        else if (t1.$eq(s, "Tag"))
+          return C.CodeKind_Tag;
+        N.Logger_Logger("").warning$1("Unknown code kind " + H.S(s));
+        throw H.wrapException(P.FallThroughError$());
+      }}
+  },
+  CodeCallCount: {
+    "^": "Object;code>,count<",
+    $isCodeCallCount: true
+  },
+  CodeTrieNode: {
+    "^": "Object;code>,count<,children>,summedChildCount",
+    $isCodeTrieNode: true
+  },
+  Code: {
+    "^": "ServiceObject_ChangeNotifier5;_service$__$kind,_service$__$totalSamplesInProfile,exclusiveTicks<,inclusiveTicks<,startAddress,endAddress,callers,callees,instructions<,addressTicks<,_service$__$formattedInclusiveTicks,_service$__$formattedExclusiveTicks,_service$__$objectPool,_service$__$function,_service$__$script,_service$__$isOptimized,name*,vmName@,_service$__$hasDisassembly,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$totalSamplesInProfile: function() {
+      return this._service$__$totalSamplesInProfile;
+    },
+    get$formattedInclusiveTicks: function() {
+      return this._service$__$formattedInclusiveTicks;
+    },
+    get$formattedExclusiveTicks: function() {
+      return this._service$__$formattedExclusiveTicks;
+    },
+    get$objectPool: function() {
+      return this._service$__$objectPool;
+    },
+    set$objectPool: function(value) {
+      this._service$__$objectPool = F.notifyPropertyChangeHelper(this, C.Symbol_objectPool, this._service$__$objectPool, value);
+    },
+    get$$function: function(_) {
+      return this._service$__$function;
+    },
+    set$$function: function(_, value) {
+      this._service$__$function = F.notifyPropertyChangeHelper(this, C.Symbol_function, this._service$__$function, value);
+    },
+    get$script: function(_) {
+      return this._service$__$script;
+    },
+    set$script: function(_, value) {
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, value);
+    },
+    get$isOptimized: function() {
+      return this._service$__$isOptimized;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return true;
+    },
+    _updateDescriptors$1: [function(script) {
+      var t1, t2;
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, script);
+      for (t1 = this.instructions, t1 = t1.get$iterator(t1); t1.moveNext$0();)
+        for (t2 = t1._current.get$descriptors(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+          t2._current.processScript$1(script);
+    }, "call$1", "get$_updateDescriptors", 2, 0, 196, 197],
+    loadScript$0: function() {
+      if (this._service$__$script != null)
+        return;
+      if (!J.$eq(this._service$__$kind, C.CodeKind_Dart))
+        return;
+      var t1 = this._service$__$function;
+      if (t1 == null)
+        return;
+      if (J.$index$asx(t1, "script") == null) {
+        J.load$0$x(this._service$__$function).then$1(new D.Code_loadScript_closure(this));
+        return;
+      }
+      J.load$0$x(J.$index$asx(this._service$__$function, "script")).then$1(this.get$_updateDescriptors());
+    },
+    reload$0: function(_) {
+      if (J.$eq(this._service$__$kind, C.CodeKind_Dart))
+        return D.ServiceObject.prototype.reload$0.call(this, this);
+      return P._Future$immediate(this, null);
+    },
+    _resolveCalls$3: function(calls, data, codes) {
+      var t1, i, t2, index, count;
+      t1 = J.getInterceptor$asx(data);
+      i = 0;
+      while (true) {
+        t2 = t1.get$length(data);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        if (!(i < t2))
+          break;
+        index = H.Primitives_parseInt(t1.$index(data, i), null, null);
+        count = H.Primitives_parseInt(t1.$index(data, i + 1), null, null);
+        if (index >>> 0 !== index || index >= codes.length)
+          return H.ioore(codes, index);
+        calls.push(new D.CodeCallCount(codes[index], count));
+        i += 2;
+      }
+      H.IterableMixinWorkaround_sortList(calls, new D.Code__resolveCalls_closure());
+    },
+    updateProfileData$3: function(profileData, codeTable, sampleCount) {
+      var t1, ticks;
+      this._service$__$totalSamplesInProfile = F.notifyPropertyChangeHelper(this, C.Symbol_totalSamplesInProfile, this._service$__$totalSamplesInProfile, sampleCount);
+      t1 = J.getInterceptor$asx(profileData);
+      this.inclusiveTicks = H.Primitives_parseInt(t1.$index(profileData, "inclusive_ticks"), null, null);
+      this.exclusiveTicks = H.Primitives_parseInt(t1.$index(profileData, "exclusive_ticks"), null, null);
+      this._resolveCalls$3(this.callers, t1.$index(profileData, "callers"), codeTable);
+      this._resolveCalls$3(this.callees, t1.$index(profileData, "callees"), codeTable);
+      ticks = t1.$index(profileData, "ticks");
+      if (ticks != null)
+        this._processTicks$1(ticks);
+      t1 = D.Code_formatPercent(this.inclusiveTicks, this._service$__$totalSamplesInProfile) + " (" + H.S(this.inclusiveTicks) + ")";
+      this._service$__$formattedInclusiveTicks = F.notifyPropertyChangeHelper(this, C.Symbol_formattedInclusiveTicks, this._service$__$formattedInclusiveTicks, t1);
+      t1 = D.Code_formatPercent(this.exclusiveTicks, this._service$__$totalSamplesInProfile) + " (" + H.S(this.exclusiveTicks) + ")";
+      this._service$__$formattedExclusiveTicks = F.notifyPropertyChangeHelper(this, C.Symbol_formattedExclusiveTicks, this._service$__$formattedExclusiveTicks, t1);
+    },
+    _service$_update$2: function(_, m, mapIsRef) {
+      var t1, t2, t3, disassembly, descriptors;
+      t1 = J.getInterceptor$asx(m);
+      this.name = t1.$index(m, "user_name");
+      this.vmName = t1.$index(m, "name");
+      t2 = t1.$index(m, "isOptimized") != null && t1.$index(m, "isOptimized");
+      this._service$__$isOptimized = F.notifyPropertyChangeHelper(this, C.Symbol_isOptimized, this._service$__$isOptimized, t2);
+      t2 = D.CodeKind_fromString(t1.$index(m, "kind"));
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      this.startAddress = H.Primitives_parseInt(t1.$index(m, "start"), 16, null);
+      this.endAddress = H.Primitives_parseInt(t1.$index(m, "end"), 16, null);
+      t2 = this._owner;
+      t3 = t2.get$isolate(t2).getFromMap$1(t1.$index(m, "function"));
+      this._service$__$function = F.notifyPropertyChangeHelper(this, C.Symbol_function, this._service$__$function, t3);
+      t2 = t2.get$isolate(t2).getFromMap$1(t1.$index(m, "object_pool"));
+      this._service$__$objectPool = F.notifyPropertyChangeHelper(this, C.Symbol_objectPool, this._service$__$objectPool, t2);
+      disassembly = t1.$index(m, "disassembly");
+      if (disassembly != null)
+        this._processDisassembly$1(disassembly);
+      descriptors = t1.$index(m, "descriptors");
+      if (descriptors != null)
+        this._processDescriptors$1(J.$index$asx(descriptors, "members"));
+      t1 = this.instructions._observable_list$_list;
+      this._loaded = t1.length !== 0 || !J.$eq(this._service$__$kind, C.CodeKind_Dart);
+      t1 = t1.length !== 0 && J.$eq(this._service$__$kind, C.CodeKind_Dart);
+      this._service$__$hasDisassembly = F.notifyPropertyChangeHelper(this, C.Symbol_hasDisassembly, this._service$__$hasDisassembly, t1);
+    },
+    get$hasDisassembly: function() {
+      return this._service$__$hasDisassembly;
+    },
+    _processDisassembly$1: function(disassembly) {
+      var t1, t2, i, t3, machine, human, address, t4;
+      t1 = this.instructions;
+      t1.clear$0(t1);
+      t2 = J.getInterceptor$asx(disassembly);
+      i = 0;
+      while (true) {
+        t3 = t2.get$length(disassembly);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        machine = t2.$index(disassembly, i + 1);
+        human = t2.$index(disassembly, i + 2);
+        address = !J.$eq(t2.$index(disassembly, i), "") ? H.Primitives_parseInt(t2.$index(disassembly, i), null, null) : 0;
+        t3 = D.PcDescriptor;
+        t4 = [];
+        t4.$builtinTypeInfo = [t3];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t3];
+        t1.add$1(0, new D.CodeInstruction(address, machine, human, null, t4, null, null));
+        i += 3;
+      }
+      for (t2 = t1.get$iterator(t1); t2.moveNext$0();)
+        t2._current._resolveJumpTarget$1(t1);
+    },
+    _processDescriptor$1: function(d) {
+      var t1, address, deoptId, tokenPos, tryIndex, kind, instruction;
+      t1 = J.getInterceptor$asx(d);
+      address = H.Primitives_parseInt(t1.$index(d, "pc"), 16, null);
+      deoptId = t1.$index(d, "deoptId");
+      tokenPos = t1.$index(d, "tokenPos");
+      tryIndex = t1.$index(d, "tryIndex");
+      kind = J.trim$0$s(t1.$index(d, "kind"));
+      for (t1 = this.instructions, t1 = t1.get$iterator(t1); t1.moveNext$0();) {
+        instruction = t1._current;
+        if (J.$eq(instruction.get$address(), address)) {
+          instruction.get$descriptors().add$1(0, new D.PcDescriptor(address, deoptId, tokenPos, tryIndex, kind, null, null, null, null));
+          return;
+        }
+      }
+      N.Logger_Logger("").warning$1("Could not find instruction with pc descriptor address: " + H.S(address));
+    },
+    _processDescriptors$1: function(descriptors) {
+      var t1;
+      for (t1 = J.get$iterator$ax(descriptors); t1.moveNext$0();)
+        this._processDescriptor$1(t1.get$current());
+    },
+    _processTicks$1: function(profileTicks) {
+      var t1, t2, i, t3, address;
+      t1 = J.getInterceptor$asx(profileTicks);
+      t2 = this.addressTicks;
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(profileTicks);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        address = H.Primitives_parseInt(t1.$index(profileTicks, i), 16, null);
+        t2.$indexSet(0, address, new D.CodeTick(address, H.Primitives_parseInt(t1.$index(profileTicks, i + 1), null, null), H.Primitives_parseInt(t1.$index(profileTicks, i + 2), null, null)));
+        i += 3;
+      }
+    },
+    contains$1: function(_, address) {
+      J.$ge$n(address, this.startAddress);
+      return false;
+    },
+    get$isDartCode: function() {
+      return J.$eq(this._service$__$kind, C.CodeKind_Dart);
+    },
+    $isCode: true,
+    static: {Code_formatPercent: function(a, total) {
+        return C.JSNumber_methods.toStringAsFixed$1(100 * J.$div$n(a, total), 2) + "%";
+      }}
+  },
+  ServiceObject_ChangeNotifier5: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  Code_loadScript_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(func) {
+      var t1, script;
+      t1 = this.this_0;
+      script = J.$index$asx(t1._service$__$function, "script");
+      if (script == null)
+        return;
+      J.load$0$x(script).then$1(t1.get$_updateDescriptors());
+    }, "call$1", null, 2, 0, null, 198, "call"],
+    $isFunction: true
+  },
+  Code__resolveCalls_closure: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$sub$n(b.get$count(), a.get$count());
+    },
+    $isFunction: true
+  },
+  SocketKind: {
+    "^": "Object;_service$_value",
+    toString$0: function(_) {
+      return this._service$_value;
+    },
+    static: {"^": "SocketKind_Listening0,SocketKind_Normal0,SocketKind_Pipe0,SocketKind_Internal0", SocketKind_fromString: function(s) {
+        var t1 = J.getInterceptor(s);
+        if (t1.$eq(s, "Listening"))
+          return C.SocketKind_Listening;
+        else if (t1.$eq(s, "Normal"))
+          return C.SocketKind_Normal;
+        else if (t1.$eq(s, "Pipe"))
+          return C.SocketKind_Pipe;
+        else if (t1.$eq(s, "Internal"))
+          return C.SocketKind_Internal;
+        N.Logger_Logger("").warning$1("Unknown socket kind " + H.S(s));
+        throw H.wrapException(P.FallThroughError$());
+      }}
+  },
+  Socket: {
+    "^": "ServiceObject_ChangeNotifier6;socketOwner@,_service$__$latest,_service$__$previous,_service$__$kind,_service$__$protocol,_service$__$readClosed,_service$__$writeClosed,_service$__$closing,_service$__$listening,_service$__$fd,_service$__$localAddress,_service$__$localPort,_service$__$remoteAddress,_service$__$remotePort,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$canCache: function() {
+      return true;
+    },
+    get$isPipe: function() {
+      return J.$eq(this._service$__$kind, C.SocketKind_Pipe);
+    },
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$protocol: function(_) {
+      return this._service$__$protocol;
+    },
+    get$readClosed: function() {
+      return this._service$__$readClosed;
+    },
+    get$writeClosed: function() {
+      return this._service$__$writeClosed;
+    },
+    get$closing: function() {
+      return this._service$__$closing;
+    },
+    get$listening: function() {
+      return this._service$__$listening;
+    },
+    get$fd: function() {
+      return this._service$__$fd;
+    },
+    get$localAddress: function() {
+      return this._service$__$localAddress;
+    },
+    get$localPort: function() {
+      return this._service$__$localPort;
+    },
+    get$remoteAddress: function() {
+      return this._service$__$remoteAddress;
+    },
+    get$remotePort: function() {
+      return this._service$__$remotePort;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "name");
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t2);
+      t2 = t1.$index(map, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t2);
+      t2 = D.SocketKind_fromString(t1.$index(map, "kind"));
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t2 = this._owner;
+      D._upgradeCollection(map, t2.get$isolate(t2));
+      t2 = t1.$index(map, "readClosed");
+      this._service$__$readClosed = F.notifyPropertyChangeHelper(this, C.Symbol_readClosed, this._service$__$readClosed, t2);
+      t2 = t1.$index(map, "writeClosed");
+      this._service$__$writeClosed = F.notifyPropertyChangeHelper(this, C.Symbol_writeClosed, this._service$__$writeClosed, t2);
+      t2 = t1.$index(map, "closing");
+      this._service$__$closing = F.notifyPropertyChangeHelper(this, C.Symbol_closing, this._service$__$closing, t2);
+      t2 = t1.$index(map, "listening");
+      this._service$__$listening = F.notifyPropertyChangeHelper(this, C.Symbol_listening, this._service$__$listening, t2);
+      t2 = t1.$index(map, "protocol");
+      this._service$__$protocol = F.notifyPropertyChangeHelper(this, C.Symbol_protocol, this._service$__$protocol, t2);
+      t2 = t1.$index(map, "localAddress");
+      this._service$__$localAddress = F.notifyPropertyChangeHelper(this, C.Symbol_localAddress, this._service$__$localAddress, t2);
+      t2 = t1.$index(map, "localPort");
+      this._service$__$localPort = F.notifyPropertyChangeHelper(this, C.Symbol_localPort, this._service$__$localPort, t2);
+      t2 = t1.$index(map, "remoteAddress");
+      this._service$__$remoteAddress = F.notifyPropertyChangeHelper(this, C.Symbol_remoteAddress, this._service$__$remoteAddress, t2);
+      t2 = t1.$index(map, "remotePort");
+      this._service$__$remotePort = F.notifyPropertyChangeHelper(this, C.Symbol_remotePort, this._service$__$remotePort, t2);
+      t2 = t1.$index(map, "fd");
+      this._service$__$fd = F.notifyPropertyChangeHelper(this, C.Symbol_fd, this._service$__$fd, t2);
+      this.socketOwner = t1.$index(map, "owner");
+    }
+  },
+  ServiceObject_ChangeNotifier6: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  _upgradeObservableMap_closure: {
+    "^": "Closure:75;map_0,owner_1",
+    call$2: function(k, v) {
+      var t1, t2;
+      t1 = J.getInterceptor(v);
+      t2 = !!t1.$isObservableMap;
+      if (t2 && D._isServiceMap(v))
+        this.map_0.$indexSet(0, k, this.owner_1.getFromMap$1(v));
+      else if (!!t1.$isObservableList)
+        D._upgradeObservableList(v, this.owner_1);
+      else if (t2)
+        D._upgradeObservableMap(v, this.owner_1);
+    },
+    $isFunction: true
+  }
+}],
+["service_error_view_element", "package:observatory/src/elements/service_error_view.dart", , R, {
+  "^": "",
+  ServiceErrorViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier45;_service_error_view_element$__$error,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$error: function(receiver) {
+      return receiver._service_error_view_element$__$error;
+    },
+    set$error: function(receiver, value) {
+      receiver._service_error_view_element$__$error = this.notifyPropertyChange$3(receiver, C.Symbol_error, receiver._service_error_view_element$__$error, value);
+    },
+    static: {ServiceErrorViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceErrorViewElement_methods.Element$created$0(receiver);
+        C.ServiceErrorViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier45: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service_exception_view_element", "package:observatory/src/elements/service_exception_view.dart", , D, {
+  "^": "",
+  ServiceExceptionViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier46;_service_exception_view_element$__$exception,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$exception: function(receiver) {
+      return receiver._service_exception_view_element$__$exception;
+    },
+    set$exception: function(receiver, value) {
+      receiver._service_exception_view_element$__$exception = this.notifyPropertyChange$3(receiver, C.Symbol_exception, receiver._service_exception_view_element$__$exception, value);
+    },
+    static: {ServiceExceptionViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceExceptionViewElement_methods.Element$created$0(receiver);
+        C.ServiceExceptionViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier46: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service_html", "package:observatory/service_html.dart", , U, {
+  "^": "",
+  HttpVM: {
+    "^": "VM;host,_service$__$version,_service$__$architecture,_service$__$uptime,_service$__$assertsEnabled,_service$__$typeChecksEnabled,_service$__$pid,_service$__$lastUpdate,exceptions,errors,_cache,_isolateCache,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    getString$1: function(_, id) {
+      var t1;
+      if (J.endsWith$1$s(this.host, "/") && J.startsWith$1$s(id, "/"))
+        id = J.substring$1$s(id, 1);
+      N.Logger_Logger("").info$1("Fetching " + H.S(id) + " from " + H.S(this.host));
+      t1 = this.host;
+      if (typeof t1 !== "string")
+        return t1.$add();
+      return W.HttpRequest_request(J.$add$ns(t1, id), null, null, null, P.LinkedHashMap_LinkedHashMap$_literal(["Observatory-Version", "1.0"], null, null), null, null, null).then$1(new U.HttpVM_getString_closure()).catchError$1(new U.HttpVM_getString_closure0());
+    },
+    HttpVM$0: function() {
+      this.host = "http://" + H.S(window.location.host) + "/";
+    }
+  },
+  HttpVM_getString_closure: {
+    "^": "Closure:200;",
+    call$1: [function(request) {
+      return J.get$responseText$x(request);
+    }, "call$1", null, 2, 0, null, 199, "call"],
+    $isFunction: true
+  },
+  HttpVM_getString_closure0: {
+    "^": "Closure:13;",
+    call$1: [function(error) {
+      var request, t1;
+      N.Logger_Logger("").severe$1("HttpRequest.request failed.");
+      request = J.get$target$x(error);
+      t1 = J.getInterceptor$x(request);
+      return C.JsonCodec_null_null.encode$1(P.LinkedHashMap_LinkedHashMap$_literal(["type", "ServiceException", "id", "", "response", t1.get$responseText(request), "kind", "NetworkException", "message", "Could not connect to service (" + H.S(t1.get$statusText(request)) + "). Check that you started the VM with the following flags: --observe"], null, null));
+    }, "call$1", null, 2, 0, null, 24, "call"],
+    $isFunction: true
+  },
+  DartiumVM: {
+    "^": "VM;_pendingRequests,_requestSerial,_service$__$version,_service$__$architecture,_service$__$uptime,_service$__$assertsEnabled,_service$__$typeChecksEnabled,_service$__$pid,_service$__$lastUpdate,exceptions,errors,_cache,_isolateCache,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    _messageHandler$1: [function(msg) {
+      var t1, id, $name, data, completer;
+      t1 = J.getInterceptor$x(msg);
+      id = J.$index$asx(t1.get$data(msg), "id");
+      $name = J.$index$asx(t1.get$data(msg), "name");
+      data = J.$index$asx(t1.get$data(msg), "data");
+      if (!J.$eq($name, "observatoryData"))
+        return;
+      t1 = this._pendingRequests;
+      completer = t1.$index(0, id);
+      t1.remove$1(0, id);
+      J.complete$1$x(completer, data);
+    }, "call$1", "get$_messageHandler", 2, 0, 20, 72],
+    getString$1: function(_, path) {
+      var idString, message, completer;
+      idString = "" + this._requestSerial;
+      message = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      message.$indexSet(0, "id", idString);
+      message.$indexSet(0, "method", "observatoryQuery");
+      message.$indexSet(0, "query", H.S(path));
+      ++this._requestSerial;
+      completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+      this._pendingRequests.$indexSet(0, idString, completer);
+      J.postMessage$2$x(W._convertNativeToDart_Window(window.parent), C.JsonCodec_null_null.encode$1(message), "*");
+      return completer.future;
+    },
+    DartiumVM$0: function() {
+      var t1 = H.setRuntimeTypeInfo(new W._EventStream(window, C.EventStreamProvider_message._eventType, false), [null]);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(this.get$_messageHandler()), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+      N.Logger_Logger("").info$1("Connected to DartiumVM");
+    }
+  }
+}],
+["service_object_view_element", "package:observatory/src/elements/service_view.dart", , U, {
+  "^": "",
+  ServiceObjectViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier47;_service_object_view_element$__$object,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$object: function(receiver) {
+      return receiver._service_object_view_element$__$object;
+    },
+    set$object: function(receiver, value) {
+      receiver._service_object_view_element$__$object = this.notifyPropertyChange$3(receiver, C.Symbol_object, receiver._service_object_view_element$__$object, value);
+    },
+    _constructElementForObject$0: function(receiver) {
+      var element;
+      switch (receiver._service_object_view_element$__$object.get$serviceType()) {
+        case "AllocationProfile":
+          element = W._ElementFactoryProvider_createElement_tag("heap-profile", null);
+          J.set$profile$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "BreakpointList":
+          element = W._ElementFactoryProvider_createElement_tag("breakpoint-list", null);
+          J.set$msg$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Class":
+          element = W._ElementFactoryProvider_createElement_tag("class-view", null);
+          J.set$cls$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Code":
+          element = W._ElementFactoryProvider_createElement_tag("code-view", null);
+          J.set$code$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Error":
+          element = W._ElementFactoryProvider_createElement_tag("error-view", null);
+          J.set$error$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Field":
+          element = W._ElementFactoryProvider_createElement_tag("field-view", null);
+          J.set$field$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "FlagList":
+          element = W._ElementFactoryProvider_createElement_tag("flag-list", null);
+          J.set$flagList$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Function":
+          element = W._ElementFactoryProvider_createElement_tag("function-view", null);
+          J.set$$function$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HeapMap":
+          element = W._ElementFactoryProvider_createElement_tag("heap-map", null);
+          J.set$fragmentation$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "LibraryPrefix":
+        case "TypeRef":
+        case "TypeParameter":
+        case "BoundedType":
+        case "Int32x4":
+        case "Float32x4":
+        case "Float64x4":
+        case "TypedData":
+        case "ExternalTypedData":
+        case "Capability":
+        case "ReceivePort":
+        case "SendPort":
+        case "Stacktrace":
+        case "JSRegExp":
+        case "WeakProperty":
+        case "MirrorReference":
+        case "UserTag":
+        case "Type":
+        case "Array":
+        case "Bool":
+        case "Closure":
+        case "Double":
+        case "GrowableObjectArray":
+        case "Instance":
+        case "Smi":
+        case "Mint":
+        case "Bigint":
+        case "String":
+          element = W._ElementFactoryProvider_createElement_tag("instance-view", null);
+          J.set$instance$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "IO":
+          element = W._ElementFactoryProvider_createElement_tag("io-view", null);
+          J.set$io$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HttpServerList":
+          element = W._ElementFactoryProvider_createElement_tag("io-http-server-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HttpServer":
+          element = W._ElementFactoryProvider_createElement_tag("io-http-server-view", null);
+          J.set$httpServer$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HttpServerConnection":
+          element = W._ElementFactoryProvider_createElement_tag("io-http-server-connection-view", null);
+          J.set$connection$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "SocketList":
+          element = W._ElementFactoryProvider_createElement_tag("io-socket-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Socket":
+          element = W._ElementFactoryProvider_createElement_tag("io-socket-view", null);
+          J.set$socket$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "WebSocketList":
+          element = W._ElementFactoryProvider_createElement_tag("io-web-socket-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "WebSocket":
+          element = W._ElementFactoryProvider_createElement_tag("io-web-socket-view", null);
+          J.set$webSocket$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Isolate":
+          element = W._ElementFactoryProvider_createElement_tag("isolate-view", null);
+          J.set$isolate$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Library":
+          element = W._ElementFactoryProvider_createElement_tag("library-view", null);
+          J.set$library$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "ProcessList":
+          element = W._ElementFactoryProvider_createElement_tag("io-process-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Process":
+          element = W._ElementFactoryProvider_createElement_tag("io-process-view", null);
+          J.set$process$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Profile":
+          element = W._ElementFactoryProvider_createElement_tag("isolate-profile", null);
+          J.set$profile$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "RandomAccessFileList":
+          element = W._ElementFactoryProvider_createElement_tag("io-random-access-file-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "RandomAccessFile":
+          element = W._ElementFactoryProvider_createElement_tag("io-random-access-file-view", null);
+          J.set$file$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "ServiceError":
+          element = W._ElementFactoryProvider_createElement_tag("service-error-view", null);
+          J.set$error$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "ServiceException":
+          element = W._ElementFactoryProvider_createElement_tag("service-exception-view", null);
+          J.set$exception$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Script":
+          element = W._ElementFactoryProvider_createElement_tag("script-view", null);
+          J.set$script$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "StackTrace":
+          element = W._ElementFactoryProvider_createElement_tag("stack-trace", null);
+          J.set$trace$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "VM":
+          element = W._ElementFactoryProvider_createElement_tag("vm-view", null);
+          J.set$vm$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        default:
+          element = W._ElementFactoryProvider_createElement_tag("json-view", null);
+          J.set$map$ax(element, receiver._service_object_view_element$__$object);
+          return element;
+      }
+    },
+    objectChanged$1: [function(receiver, oldValue) {
+      var t1, type, element;
+      this._clearChildren$0(receiver);
+      t1 = receiver._service_object_view_element$__$object;
+      if (t1 == null) {
+        N.Logger_Logger("").info$1("Viewing null object.");
+        return;
+      }
+      type = t1.get$serviceType();
+      element = this._constructElementForObject$0(receiver);
+      if (element == null) {
+        N.Logger_Logger("").info$1("Unable to find a view element for '" + H.S(type) + "'");
+        return;
+      }
+      receiver.appendChild(element);
+      N.Logger_Logger("").info$1("Viewing object of '" + H.S(type) + "'");
+    }, "call$1", "get$objectChanged", 2, 0, 13, 57],
+    $isServiceObjectViewElement: true,
+    static: {ServiceObjectViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceObjectViewElement_methods.Element$created$0(receiver);
+        C.ServiceObjectViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier47: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service_ref_element", "package:observatory/src/elements/service_ref.dart", , Q, {
+  "^": "",
+  ServiceRefElement: {
+    "^": "ObservatoryElement_ChangeNotifier0;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$ref: function(receiver) {
+      return receiver._service_ref_element$__$ref;
+    },
+    set$ref: function(receiver, value) {
+      receiver._service_ref_element$__$ref = this.notifyPropertyChange$3(receiver, C.Symbol_ref, receiver._service_ref_element$__$ref, value);
+    },
+    get$internal: function(receiver) {
+      return receiver._service_ref_element$__$internal;
+    },
+    set$internal: function(receiver, value) {
+      receiver._service_ref_element$__$internal = this.notifyPropertyChange$3(receiver, C.Symbol_internal, receiver._service_ref_element$__$internal, value);
+    },
+    refChanged$1: [function(receiver, oldValue) {
+      this.notifyPropertyChange$3(receiver, C.Symbol_url, "", this.get$url(receiver));
+      this.notifyPropertyChange$3(receiver, C.Symbol_name, [], this.get$name(receiver));
+      this.notifyPropertyChange$3(receiver, C.Symbol_nameIsEmpty, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_hoverText, "", this.get$hoverText(receiver));
+    }, "call$1", "get$refChanged", 2, 0, 20, 57],
+    get$url: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return "NULL REF";
+      t1 = J.get$link$x(t1);
+      $.location.toString;
+      return "#" + H.S(t1);
+    },
+    get$hoverText: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return "NULL REF";
+      return t1.get$vmName();
+    },
+    get$name: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return "NULL REF";
+      return J.get$name$x(t1);
+    },
+    get$nameIsEmpty: function(receiver) {
+      return J.get$isEmpty$asx(this.get$name(receiver));
+    },
+    static: {ServiceRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceRefElement_methods.Element$created$0(receiver);
+        C.ServiceRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier0: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["sliding_checkbox_element", "package:observatory/src/elements/sliding_checkbox.dart", , Q, {
+  "^": "",
+  SlidingCheckboxElement: {
+    "^": "PolymerElement_ChangeNotifier2;_sliding_checkbox_element$__$checked,_sliding_checkbox_element$__$checkedText,_sliding_checkbox_element$__$uncheckedText,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$checked: function(receiver) {
+      return receiver._sliding_checkbox_element$__$checked;
+    },
+    set$checked: function(receiver, value) {
+      receiver._sliding_checkbox_element$__$checked = this.notifyPropertyChange$3(receiver, C.Symbol_checked, receiver._sliding_checkbox_element$__$checked, value);
+    },
+    get$checkedText: function(receiver) {
+      return receiver._sliding_checkbox_element$__$checkedText;
+    },
+    set$checkedText: function(receiver, value) {
+      receiver._sliding_checkbox_element$__$checkedText = this.notifyPropertyChange$3(receiver, C.Symbol_checkedText, receiver._sliding_checkbox_element$__$checkedText, value);
+    },
+    get$uncheckedText: function(receiver) {
+      return receiver._sliding_checkbox_element$__$uncheckedText;
+    },
+    set$uncheckedText: function(receiver, value) {
+      receiver._sliding_checkbox_element$__$uncheckedText = this.notifyPropertyChange$3(receiver, C.Symbol_uncheckedText, receiver._sliding_checkbox_element$__$uncheckedText, value);
+    },
+    change$3: [function(receiver, e, details, target) {
+      var t1 = J.get$checked$x((receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#slide-switch"));
+      receiver._sliding_checkbox_element$__$checked = this.notifyPropertyChange$3(receiver, C.Symbol_checked, receiver._sliding_checkbox_element$__$checked, t1);
+    }, "call$3", "get$change", 6, 0, 102, 1, 201, 94],
+    static: {SlidingCheckboxElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.SlidingCheckboxElement_methods.Element$created$0(receiver);
+        C.SlidingCheckboxElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier2: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["smoke", "package:smoke/smoke.dart", , A, {
+  "^": "",
+  QueryOptions: {
+    "^": "Object;includeFields,includeProperties,includeInherited,includeUpTo,excludeFinal,includeMethods,withAnnotations,matches",
+    matches$1: function($receiver, arg0) {
+      return this.matches.call$1(arg0);
+    },
+    toString$0: function(_) {
+      var t1 = P.StringBuffer$("");
+      t1.write$1("(options:");
+      t1.write$1(this.includeFields ? "fields " : "");
+      t1.write$1(this.includeProperties ? "properties " : "");
+      t1.write$1(this.includeMethods ? "methods " : "");
+      t1.write$1(this.includeInherited ? "inherited " : "_");
+      t1.write$1(this.excludeFinal ? "no finals " : "");
+      t1.write$1("annotations: " + H.S(this.withAnnotations));
+      t1.write$1(this.matches != null ? "with matcher" : "");
+      t1.write$1(")");
+      return t1._contents;
+    }
+  },
+  Declaration: {
+    "^": "Object;name>,kind>,isFinal>,type>,isStatic,annotations<",
+    get$isField: function() {
+      return this.kind === C.DeclarationKind_0;
+    },
+    get$isProperty: function() {
+      return this.kind === C.DeclarationKind_1;
+    },
+    get$isMethod: function() {
+      return this.kind === C.DeclarationKind_2;
+    },
+    get$hashCode: function(_) {
+      var t1 = this.name;
+      return t1.get$hashCode(t1);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isDeclaration && this.name.$eq(0, other.name) && this.kind === other.kind && this.isFinal === other.isFinal && this.type.$eq(0, other.type) && this.isStatic === other.isStatic && X.compareLists(this.annotations, other.annotations, false);
+    },
+    toString$0: function(_) {
+      var t1 = P.StringBuffer$("");
+      t1.write$1("(declaration ");
+      t1.write$1(this.name);
+      t1.write$1(this.kind === C.DeclarationKind_1 ? " (property) " : " (method) ");
+      t1.write$1(this.isFinal ? "final " : "");
+      t1.write$1(this.isStatic ? "static " : "");
+      t1.write$1(this.annotations);
+      t1.write$1(")");
+      return t1._contents;
+    },
+    $isDeclaration: true
+  },
+  DeclarationKind: {
+    "^": "Object;kind>"
+  }
+}],
+["smoke.src.common", "package:smoke/src/common.dart", , X, {
+  "^": "",
+  adjustList: function(input, min, max) {
+    var t1, t2;
+    t1 = input.length;
+    if (t1 < min) {
+      t2 = Array(min);
+      t2.fixed$length = init;
+      H.IterableMixinWorkaround_setRangeList(t2, 0, t1, input, 0);
+      return t2;
+    }
+    if (t1 > max) {
+      t1 = Array(max);
+      t1.fixed$length = init;
+      H.IterableMixinWorkaround_setRangeList(t1, 0, max, input, 0);
+      return t1;
+    }
+    return input;
+  },
+  matchesAnnotation: function(metadata, queryAnnotations) {
+    var t1, meta, t2, t3, queryMeta, t4;
+    t1 = new H.ListIterator(metadata, metadata.length, 0, null);
+    t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(metadata, 0)];
+    for (; t1.moveNext$0();) {
+      meta = t1._current;
+      queryAnnotations.length;
+      t2 = new H.ListIterator(queryAnnotations, 1, 0, null);
+      t2.$builtinTypeInfo = [H.getTypeArgumentByIndex(queryAnnotations, 0)];
+      t3 = J.getInterceptor(meta);
+      for (; t2.moveNext$0();) {
+        queryMeta = t2._current;
+        if (t3.$eq(meta, queryMeta))
+          return true;
+        if (!!J.getInterceptor(queryMeta).$isType) {
+          t4 = t3.get$runtimeType(meta);
+          t4 = $.get$typeInspector().isSubclassOf$2(t4, queryMeta);
+        } else
+          t4 = false;
+        if (t4)
+          return true;
+      }
+    }
+    return false;
+  },
+  minArgs: function(f) {
+    var t1, t2;
+    t1 = H.getDynamicRuntimeType();
+    t2 = H.buildFunctionType(t1)._isTest$1(f);
+    if (t2)
+      return 0;
+    t2 = H.buildFunctionType(t1, [t1])._isTest$1(f);
+    if (t2)
+      return 1;
+    t2 = H.buildFunctionType(t1, [t1, t1])._isTest$1(f);
+    if (t2)
+      return 2;
+    t1 = H.buildFunctionType(t1, [t1, t1, t1])._isTest$1(f);
+    if (t1)
+      return 3;
+    return 4;
+  },
+  maxArgs: function(f) {
+    var t1, t2;
+    t1 = H.getDynamicRuntimeType();
+    t2 = H.buildFunctionType(t1, [t1, t1, t1])._isTest$1(f);
+    if (t2)
+      return 3;
+    t2 = H.buildFunctionType(t1, [t1, t1])._isTest$1(f);
+    if (t2)
+      return 2;
+    t2 = H.buildFunctionType(t1, [t1])._isTest$1(f);
+    if (t2)
+      return 1;
+    t1 = H.buildFunctionType(t1)._isTest$1(f);
+    if (t1)
+      return 0;
+    return -1;
+  },
+  compareLists: function(a, b, unordered) {
+    var t1, t2, bSet, i, t3;
+    t1 = a.length;
+    t2 = b.length;
+    if (t1 !== t2)
+      return false;
+    if (unordered) {
+      bSet = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+      bSet.addAll$1(0, b);
+      for (i = 0; i < a.length; ++i)
+        if (!bSet.contains$1(0, a[i]))
+          return false;
+    } else
+      for (i = 0; i < t1; ++i) {
+        t3 = a[i];
+        if (i >= t2)
+          return H.ioore(b, i);
+        if (t3 !== b[i])
+          return false;
+      }
+    return true;
+  }
+}],
+["smoke.src.implementation", "package:smoke/src/implementation.dart", , D, {
+  "^": "",
+  throwNotConfiguredError: function() {
+    throw H.wrapException(P.Exception_Exception("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, {
+  "^": "",
+  StaticConfiguration: {
+    "^": "Object;getters,setters,parents,declarations,staticMethods,names<,checkedMode"
+  },
+  GeneratedObjectAccessorService: {
+    "^": "Object;_getters,_setters,_staticMethods",
+    read$2: function(object, $name) {
+      var getter = this._getters.$index(0, $name);
+      if (getter == null)
+        throw H.wrapException(O.MissingCodeException$("getter \"" + H.S($name) + "\" in " + H.S(object)));
+      return getter.call$1(object);
+    },
+    write$3: function(object, $name, value) {
+      var setter = this._setters.$index(0, $name);
+      if (setter == null)
+        throw H.wrapException(O.MissingCodeException$("setter \"" + H.S($name) + "\" in " + H.S(object)));
+      setter.call$2(object, value);
+    },
+    invoke$5$adjust$namedArgs: function(object, $name, args, adjust, namedArgs) {
+      var method, tentativeError, getter, min, max, t1, exception;
+      method = null;
+      if (!!J.getInterceptor(object).$isType) {
+        this._staticMethods.$index(0, object);
+        method = null;
+      } else {
+        getter = this._getters.$index(0, $name);
+        method = getter == null ? null : getter.call$1(object);
+      }
+      if (method == null)
+        throw H.wrapException(O.MissingCodeException$("method \"" + H.S($name) + "\" in " + H.S(object)));
+      tentativeError = null;
+      if (adjust) {
+        min = X.minArgs(method);
+        if (min > 3) {
+          tentativeError = "we tried to adjust the arguments for calling \"" + H.S($name) + "\", but we couldn't determine the exact number of arguments it expects (it is more than 3).";
+          args = X.adjustList(args, min, P.max(min, J.get$length$asx(args)));
+        } else {
+          max = X.maxArgs(method);
+          t1 = max >= 0 ? max : J.get$length$asx(args);
+          args = X.adjustList(args, min, t1);
+        }
+      }
+      try {
+        t1 = H.Primitives_applyFunction(method, args, P.Function__toMangledNames(null));
+        return t1;
+      } catch (exception) {
+        if (!!J.getInterceptor(H.unwrapException(exception)).$isNoSuchMethodError) {
+          if (tentativeError != null)
+            P.print(tentativeError);
+          throw exception;
+        } else
+          throw exception;
+      }
+
+    }
+  },
+  GeneratedTypeInspectorService: {
+    "^": "Object;_parents,_declarations,_checkedMode",
+    isSubclassOf$2: function(type, supertype) {
+      var t1, parentType, t2;
+      if (type.$eq(0, supertype) || supertype.$eq(0, C.Type_HqF))
+        return true;
+      for (t1 = this._parents; !J.$eq(type, C.Type_HqF); type = parentType) {
+        parentType = t1.$index(0, type);
+        t2 = J.getInterceptor(parentType);
+        if (t2.$eq(parentType, supertype))
+          return true;
+        if (parentType == null) {
+          if (!this._checkedMode)
+            return false;
+          throw H.wrapException(O.MissingCodeException$("superclass of \"" + H.S(type) + "\" (" + t2.toString$0(parentType) + ")"));
+        }
+      }
+      return false;
+    },
+    hasInstanceMethod$2: function(type, $name) {
+      var decl = this._findDeclaration$2(type, $name);
+      return decl != null && decl.kind === C.DeclarationKind_2 && !decl.isStatic;
+    },
+    hasStaticMethod$2: function(type, $name) {
+      var map, decl;
+      map = this._declarations.$index(0, type);
+      if (map == null) {
+        if (!this._checkedMode)
+          return false;
+        throw H.wrapException(O.MissingCodeException$("declarations for " + H.S(type)));
+      }
+      decl = map.$index(0, $name);
+      return decl != null && decl.kind === C.DeclarationKind_2 && decl.isStatic;
+    },
+    getDeclaration$2: function(type, $name) {
+      var decl = this._findDeclaration$2(type, $name);
+      if (decl == null) {
+        if (!this._checkedMode)
+          return;
+        throw H.wrapException(O.MissingCodeException$("declaration for " + H.S(type) + "." + H.S($name)));
+      }
+      return decl;
+    },
+    query$2: function(_, type, options) {
+      var result, superclass, map, t1, decl, t2;
+      result = [];
+      if (options.includeInherited) {
+        superclass = this._parents.$index(0, type);
+        if (superclass == null) {
+          if (this._checkedMode)
+            throw H.wrapException(O.MissingCodeException$("superclass of \"" + H.S(type) + "\""));
+        } else if (!superclass.$eq(0, options.includeUpTo))
+          result = this.query$2(0, superclass, options);
+      }
+      map = this._declarations.$index(0, type);
+      if (map == null) {
+        if (!this._checkedMode)
+          return result;
+        throw H.wrapException(O.MissingCodeException$("declarations for " + H.S(type)));
+      }
+      for (t1 = J.get$iterator$ax(map.get$values(map)); t1.moveNext$0();) {
+        decl = t1.get$current();
+        if (!options.includeFields && decl.get$isField())
+          continue;
+        if (!options.includeProperties && decl.get$isProperty())
+          continue;
+        if (options.excludeFinal && J.get$isFinal$x(decl) === true)
+          continue;
+        if (!options.includeMethods && decl.get$isMethod())
+          continue;
+        if (options.matches != null && options.matches$1(0, J.get$name$x(decl)) !== true)
+          continue;
+        t2 = options.withAnnotations;
+        if (t2 != null && !X.matchesAnnotation(decl.get$annotations(), t2))
+          continue;
+        result.push(decl);
+      }
+      return result;
+    },
+    _findDeclaration$2: function(type, $name) {
+      var t1, t2, declarations, declaration, parentType;
+      for (t1 = this._parents, t2 = this._declarations; !J.$eq(type, C.Type_HqF); type = parentType) {
+        declarations = t2.$index(0, type);
+        if (declarations != null) {
+          declaration = declarations.$index(0, $name);
+          if (declaration != null)
+            return declaration;
+        }
+        parentType = t1.$index(0, type);
+        if (parentType == null) {
+          if (!this._checkedMode)
+            return;
+          throw H.wrapException(O.MissingCodeException$("superclass of \"" + H.S(type) + "\""));
+        }
+      }
+      return;
+    }
+  },
+  GeneratedSymbolConverterService: {
+    "^": "Object;_names,_symbols",
+    GeneratedSymbolConverterService$1: function(configuration) {
+      this._names.forEach$1(0, new O.GeneratedSymbolConverterService_closure(this));
+    },
+    static: {GeneratedSymbolConverterService$: function(configuration) {
+        var t1 = new O.GeneratedSymbolConverterService(configuration.names, P.LinkedHashMap_LinkedHashMap$_empty(null, null));
+        t1.GeneratedSymbolConverterService$1(configuration);
+        return t1;
+      }}
+  },
+  GeneratedSymbolConverterService_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(k, v) {
+      this.this_0._symbols.$indexSet(0, v, k);
+    },
+    $isFunction: true
+  },
+  MissingCodeException: {
+    "^": "Object;description",
+    toString$0: function(_) {
+      return "Missing " + this.description + ". Code generation for the smoke package seems incomplete.";
+    },
+    static: {MissingCodeException$: function(description) {
+        return new O.MissingCodeException(description);
+      }}
+  }
+}],
+["stack_frame_element", "package:observatory/src/elements/stack_frame.dart", , K, {
+  "^": "",
+  StackFrameElement: {
+    "^": "ObservatoryElement_ChangeNotifier48;_stack_frame_element$__$frame,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$frame: function(receiver) {
+      return receiver._stack_frame_element$__$frame;
+    },
+    set$frame: function(receiver, value) {
+      receiver._stack_frame_element$__$frame = this.notifyPropertyChange$3(receiver, C.Symbol_frame, receiver._stack_frame_element$__$frame, value);
+    },
+    static: {StackFrameElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.StackFrameElement_methods.Element$created$0(receiver);
+        C.StackFrameElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier48: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["stack_trace_element", "package:observatory/src/elements/stack_trace.dart", , X, {
+  "^": "",
+  StackTraceElement: {
+    "^": "ObservatoryElement_ChangeNotifier49;_stack_trace_element$__$trace,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$trace: function(receiver) {
+      return receiver._stack_trace_element$__$trace;
+    },
+    set$trace: function(receiver, value) {
+      receiver._stack_trace_element$__$trace = this.notifyPropertyChange$3(receiver, C.Symbol_trace, receiver._stack_trace_element$__$trace, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._stack_trace_element$__$trace).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {StackTraceElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.StackTraceElement_methods.Element$created$0(receiver);
+        C.StackTraceElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier49: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["template_binding", "package:template_binding/template_binding.dart", , M, {
+  "^": "",
+  _updateAttribute: function(node, $name, conditional, value) {
+    var t1, t2;
+    if (conditional) {
+      t1 = null != value && false !== value;
+      t2 = J.getInterceptor$x(node);
+      if (t1)
+        t2.get$attributes(node)._html$_element.setAttribute($name, "");
+      else
+        t2.get$attributes(node).remove$1(0, $name);
+    } else {
+      t1 = J.get$attributes$x(node);
+      t2 = value == null ? "" : H.S(value);
+      t1._html$_element.setAttribute($name, t2);
+    }
+  },
+  _getTreeScope: function(node) {
+    var $parent;
+    for (; $parent = J.get$parentNode$x(node), $parent != null; node = $parent)
+      ;
+    return M._hasGetElementById(node) ? node : null;
+  },
+  _hasGetElementById: function(node) {
+    var t1 = J.getInterceptor(node);
+    return !!t1.$isDocument || !!t1.$isShadowRoot || !!t1.$isSvgSvgElement;
+  },
+  _createInstanceBindingMap: function(node, delegate) {
+    var map, t1, c, children, index, childMap;
+    map = M._getBindings(node, delegate);
+    if (map == null)
+      map = new M._InstanceBindingMap([], null, null);
+    for (t1 = J.getInterceptor$x(node), c = t1.get$firstChild(node), children = null, index = 0; c != null; c = c.nextSibling, ++index) {
+      childMap = M._createInstanceBindingMap(c, delegate);
+      if (childMap == null)
+        continue;
+      if (children == null) {
+        children = Array(t1.get$nodes(node)._this.childNodes.length);
+        children.fixed$length = init;
+      }
+      if (index >= children.length)
+        return H.ioore(children, index);
+      children[index] = childMap;
+    }
+    map.children = children;
+    return map;
+  },
+  _cloneAndBindInstance: function(node, $parent, stagingDocument, bindings, model, delegate, instanceBindings, instanceRecord) {
+    var clone, c, t1, i;
+    clone = $parent.appendChild(J.importNode$2$x(stagingDocument, node, false));
+    for (c = node.firstChild, t1 = bindings != null, i = 0; c != null; c = c.nextSibling, ++i)
+      M._cloneAndBindInstance(c, clone, stagingDocument, t1 ? bindings.getChild$1(i) : null, model, delegate, instanceBindings, null);
+    if (bindings.get$isTemplate()) {
+      M.nodeBindFallback(clone)._decorate$1(node);
+      if (delegate != null)
+        J.set$bindingDelegate$x(M.nodeBindFallback(clone), delegate);
+    }
+    M._processBindings(clone, bindings, model, instanceBindings);
+    return clone;
+  },
+  _getFragmentRoot: function(node) {
+    var p;
+    for (; p = J.get$parentNode$x(node), p != null; node = p)
+      ;
+    return node;
+  },
+  _searchRefId: function(node, id) {
+    var selector, t1, values, instance, ref, t2;
+    if (id == null || id === "")
+      return;
+    selector = "#" + H.S(id);
+    for (; true;) {
+      node = M._getFragmentRoot(node);
+      t1 = $.get$_instanceExtension();
+      t1.toString;
+      values = H.Primitives_getProperty(node, "expando$values");
+      instance = values == null ? null : H.Primitives_getProperty(values, t1._getKey$0());
+      t1 = instance == null;
+      if (!t1 && instance.get$_protoContent() != null)
+        ref = J.querySelector$1$x(instance.get$_protoContent(), selector);
+      else {
+        t2 = J.getInterceptor(node);
+        ref = !!t2.$isDocument || !!t2.$isShadowRoot || !!t2.$isSvgSvgElement ? t2.getElementById$1(node, id) : null;
+      }
+      if (ref != null)
+        return ref;
+      if (t1)
+        return;
+      node = instance.get$_templateCreator();
+      if (node == null)
+        return;
+    }
+  },
+  _getDelegateFactory: function($name, node, delegate) {
+    if (delegate == null)
+      return;
+    return new M._getDelegateFactory_closure($name, node, delegate);
+  },
+  _getBindings: function(node, delegate) {
+    var t1, tokens;
+    t1 = J.getInterceptor(node);
+    if (!!t1.$isElement)
+      return M._parseAttributeBindings(node, delegate);
+    if (!!t1.$isText) {
+      tokens = S.MustacheTokens_parse(node.textContent, M._getDelegateFactory("text", node, delegate));
+      if (tokens != null)
+        return new M._InstanceBindingMap(["text", tokens], null, null);
+    }
+    return;
+  },
+  _parseWithDefault: function(element, $name, delegate) {
+    var v = element.getAttribute($name);
+    if (v === "")
+      v = "{{}}";
+    return S.MustacheTokens_parse(v, M._getDelegateFactory($name, element, delegate));
+  },
+  _parseAttributeBindings: function(element, delegate) {
+    var t1, isTemplateNode, t2, bindings, result, t3;
+    t1 = {};
+    t1.bindings_0 = null;
+    isTemplateNode = M.isSemanticTemplate(element);
+    new W._ElementAttributeMap(element).forEach$1(0, new M._parseAttributeBindings_closure(t1, element, delegate, isTemplateNode));
+    if (isTemplateNode) {
+      t2 = t1.bindings_0;
+      if (t2 == null) {
+        bindings = [];
+        t1.bindings_0 = bindings;
+        t1 = bindings;
+      } else
+        t1 = t2;
+      result = new M._TemplateBindingMap(null, null, null, t1, null, null);
+      t1 = M._parseWithDefault(element, "if", delegate);
+      result._if = t1;
+      t2 = M._parseWithDefault(element, "bind", delegate);
+      result._bind = t2;
+      t3 = M._parseWithDefault(element, "repeat", delegate);
+      result._repeat = t3;
+      if (t1 != null && t2 == null && t3 == null)
+        result._bind = S.MustacheTokens_parse("{{}}", M._getDelegateFactory("bind", element, delegate));
+      return result;
+    }
+    t1 = t1.bindings_0;
+    return t1 == null ? null : new M._InstanceBindingMap(t1, null, null);
+  },
+  _processOneTimeBinding: function($name, tokens, node, model) {
+    var delegateFn, value, t1, t2, values, i, t3;
+    if (tokens.get$hasOnePath()) {
+      delegateFn = tokens.getPrepareBinding$1(0);
+      value = delegateFn != null ? delegateFn.call$3(model, node, true) : tokens.getPath$1(0).getValueFrom$1(model);
+      return tokens.get$isSimplePath() ? value : tokens.combinator$1(value);
+    }
+    t1 = J.getInterceptor$asx(tokens);
+    t2 = t1.get$length(tokens);
+    if (typeof t2 !== "number")
+      return H.iae(t2);
+    values = Array(t2);
+    values.fixed$length = init;
+    t2 = values.length;
+    i = 0;
+    while (true) {
+      t3 = t1.get$length(tokens);
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      if (!(i < t3))
+        break;
+      delegateFn = tokens.getPrepareBinding$1(i);
+      t3 = delegateFn != null ? delegateFn.call$3(model, node, false) : tokens.getPath$1(i).getValueFrom$1(model);
+      if (i >= t2)
+        return H.ioore(values, i);
+      values[i] = t3;
+      ++i;
+    }
+    return tokens.combinator$1(values);
+  },
+  _processBinding: function($name, tokens, node, model) {
+    var delegateFn, observer, t1, t2, i, oneTime, value, path;
+    if (tokens.get$onlyOneTime())
+      return M._processOneTimeBinding($name, tokens, node, model);
+    if (tokens.get$hasOnePath()) {
+      delegateFn = tokens.getPrepareBinding$1(0);
+      if (delegateFn != null)
+        observer = delegateFn.call$3(model, node, false);
+      else {
+        t1 = tokens.getPath$1(0);
+        t1 = !!J.getInterceptor(t1).$isPropertyPath ? t1 : L.PropertyPath_PropertyPath(t1);
+        t2 = $._Observer__nextBirthId;
+        $._Observer__nextBirthId = t2 + 1;
+        observer = new L.PathObserver(t1, model, null, t2, null, null, null);
+      }
+      return tokens.get$isSimplePath() ? observer : new Y.ObserverTransform(observer, tokens.get$combinator(), null, null, null);
+    }
+    t1 = $._Observer__nextBirthId;
+    $._Observer__nextBirthId = t1 + 1;
+    observer = new L.CompoundObserver(null, [], t1, null, null, null);
+    observer._path_observer$_value = [];
+    t1 = J.getInterceptor$asx(tokens);
+    i = 0;
+    while (true) {
+      t2 = t1.get$length(tokens);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      if (!(i < t2))
+        break;
+      c$0: {
+        oneTime = tokens.getOneTime$1(i);
+        delegateFn = tokens.getPrepareBinding$1(i);
+        if (delegateFn != null) {
+          value = delegateFn.call$3(model, node, oneTime);
+          if (oneTime === true)
+            observer.addPath$1(value);
+          else {
+            if (observer._notifyCallback != null || observer._observed == null)
+              H.throwExpression(P.StateError$("Cannot add observers once started."));
+            J.open$1$x(value, observer.get$_deliver());
+            t2 = observer._observed;
+            t2.push(C.C__ObserverSentinel);
+            t2.push(value);
+          }
+          break c$0;
+        }
+        path = tokens.getPath$1(i);
+        if (oneTime === true)
+          observer.addPath$1(path.getValueFrom$1(model));
+        else
+          observer.addPath$2(model, path);
+      }
+      ++i;
+    }
+    return new Y.ObserverTransform(observer, tokens.get$combinator(), null, null, null);
+  },
+  _processBindings: function(node, map, model, instanceBindings) {
+    var t1, bindings, nodeExt, t2, t3, i, $name, tokens, binding, templateExt, iter;
+    t1 = J.getInterceptor$x(map);
+    bindings = t1.get$bindings(map);
+    nodeExt = !!J.getInterceptor(node).$isNodeBindExtension ? node : M.nodeBindFallback(node);
+    for (t2 = J.getInterceptor$asx(bindings), t3 = J.getInterceptor$x(nodeExt), i = 0; i < t2.get$length(bindings); i += 2) {
+      $name = t2.$index(bindings, i);
+      tokens = t2.$index(bindings, i + 1);
+      binding = t3.bind$3$oneTime(nodeExt, $name, M._processBinding($name, tokens, node, model), tokens.get$onlyOneTime());
+      if (binding != null && true)
+        instanceBindings.push(binding);
+    }
+    t3.bindFinished$0(nodeExt);
+    if (!t1.$is_TemplateBindingMap)
+      return;
+    templateExt = M.nodeBindFallback(node);
+    templateExt.set$_model(model);
+    iter = templateExt._processBindingDirectives$1(map);
+    if (iter != null && true)
+      instanceBindings.push(iter);
+  },
+  nodeBindFallback: function(node) {
+    var t1, values, extension, t2;
+    t1 = $.get$_expando();
+    t1.toString;
+    values = H.Primitives_getProperty(node, "expando$values");
+    extension = values == null ? null : H.Primitives_getProperty(values, t1._getKey$0());
+    if (extension != null)
+      return extension;
+    t2 = J.getInterceptor(node);
+    if (!!t2.$isInputElement)
+      extension = new M._InputElementExtension(node, null, null);
+    else if (!!t2.$isSelectElement)
+      extension = new M._SelectElementExtension(node, null, null);
+    else if (!!t2.$isTextAreaElement)
+      extension = new M._TextAreaElementExtension(node, null, null);
+    else if (!!t2.$isElement) {
+      if (!(node.tagName === "TEMPLATE" && node.namespaceURI === "http://www.w3.org/1999/xhtml"))
+        if (!(t2.get$attributes(node)._html$_element.hasAttribute("template") === true && C.Map_05eTF.containsKey$1(t2.get$localName(node)) === true))
+          t2 = node.tagName === "template" && t2.get$namespaceUri(node) === "http://www.w3.org/2000/svg";
+        else
+          t2 = true;
+      else
+        t2 = true;
+      extension = t2 ? new M.TemplateBindExtension(null, null, null, false, null, null, null, null, null, null, node, null, null) : new M._ElementExtension(node, null, null);
+    } else
+      extension = !!t2.$isText ? new M._TextExtension(node, null, null) : new M.NodeBindExtension(node, null, null);
+    t1.$indexSet(0, node, extension);
+    return extension;
+  },
+  isSemanticTemplate: function(n) {
+    var t1 = J.getInterceptor(n);
+    if (!!t1.$isElement)
+      if (!(n.tagName === "TEMPLATE" && n.namespaceURI === "http://www.w3.org/1999/xhtml"))
+        if (!(t1.get$attributes(n)._html$_element.hasAttribute("template") === true && C.Map_05eTF.containsKey$1(t1.get$localName(n)) === true))
+          t1 = n.tagName === "template" && t1.get$namespaceUri(n) === "http://www.w3.org/2000/svg";
+        else
+          t1 = true;
+      else
+        t1 = true;
+    else
+      t1 = false;
+    return t1;
+  },
+  BindingDelegate: {
+    "^": "Object;_bindingMaps",
+    prepareBinding$3: function(path, $name, node) {
+      return;
+    },
+    static: {"^": "BindingDelegate__DEFAULT"}
+  },
+  _ElementExtension: {
+    "^": "NodeBindExtension;_node,bindings,_templateInstance",
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, node, t2, t3, t4, conditional;
+      t1 = {};
+      t1.name_0 = $name;
+      node = this.get$_node();
+      t2 = J.getInterceptor(node);
+      t3 = !!t2.$isOptionElement && J.$eq(t1.name_0, "value");
+      t4 = t1.name_0;
+      if (t3) {
+        new W._ElementAttributeMap(node).remove$1(0, t4);
+        if (oneTime)
+          return this._updateOption$1(value);
+        t2 = this.get$_updateOption();
+        t2.call$1(J.open$1$x(value, t2));
+      } else {
+        conditional = J.endsWith$1$s(t4, "?");
+        if (conditional) {
+          t2.get$attributes(node).remove$1(0, t1.name_0);
+          t2 = t1.name_0;
+          t3 = J.getInterceptor$asx(t2);
+          t1.name_0 = t3.substring$2(t2, 0, J.$sub$n(t3.get$length(t2), 1));
+        }
+        if (oneTime)
+          return M._updateAttribute(this.get$_node(), t1.name_0, conditional, value);
+        t2 = new M._ElementExtension_bind_closure(t1, this, conditional);
+        t2.call$1(J.open$1$x(value, t2));
+      }
+      t1 = t1.name_0;
+      return $.enableBindingsReflection ? this._updateBindings$2(t1, value) : value;
+    },
+    _updateOption$1: [function(newValue) {
+      var node, t1, select, t2, bindings, valueBinding, oldValue, selectBinding;
+      node = this.get$_node();
+      t1 = J.getInterceptor$x(node);
+      select = t1.get$parentNode(node);
+      t2 = J.getInterceptor(select);
+      if (!!t2.$isSelectElement) {
+        bindings = J.get$bindings$x(M.nodeBindFallback(select));
+        if (bindings != null) {
+          valueBinding = J.$index$asx(bindings, "value");
+          if (!!J.getInterceptor(valueBinding).$is_InputBinding) {
+            oldValue = select.value;
+            selectBinding = valueBinding;
+          } else {
+            oldValue = null;
+            selectBinding = null;
+          }
+        } else {
+          oldValue = null;
+          selectBinding = null;
+        }
+      } else {
+        oldValue = null;
+        selectBinding = null;
+      }
+      t1.set$value(node, newValue == null ? "" : H.S(newValue));
+      if (selectBinding != null && !J.$eq(t2.get$value(select), oldValue)) {
+        t1 = t2.get$value(select);
+        J.set$value$x(selectBinding.get$_template_binding$_bindable(), t1);
+      }
+    }, "call$1", "get$_updateOption", 2, 0, 20, 58]
+  },
+  _ElementExtension_bind_closure: {
+    "^": "Closure:13;box_0,this_1,conditional_2",
+    call$1: [function(x) {
+      return M._updateAttribute(this.this_1.get$_node(), this.box_0.name_0, this.conditional_2, x);
+    }, "call$1", null, 2, 0, null, 65, "call"],
+    $isFunction: true
+  },
+  _InputBinding: {
+    "^": "Bindable;_node<,_eventSub,_template_binding$_bindable<,_propertyName",
+    _template_binding$_updateNode$1: [function(newValue) {
+      return M._InputBinding__updateProperty(this._node, newValue, this._propertyName);
+    }, "call$1", "get$_template_binding$_updateNode", 2, 0, 20, 58],
+    _nodeChanged$1: [function(e) {
+      var t1, t2, t3, r, checkedBinding;
+      switch (this._propertyName) {
+        case "value":
+          t1 = J.get$value$x(this._node);
+          J.set$value$x(this._template_binding$_bindable, t1);
+          break;
+        case "checked":
+          t1 = this._node;
+          t2 = J.getInterceptor$x(t1);
+          t3 = t2.get$checked(t1);
+          J.set$value$x(this._template_binding$_bindable, t3);
+          if (!!t2.$isInputElement && J.$eq(t2.get$type(t1), "radio"))
+            for (t1 = J.get$iterator$ax(M._InputBinding__getAssociatedRadioButtons(t1)); t1.moveNext$0();) {
+              r = t1.get$current();
+              checkedBinding = J.$index$asx(J.get$bindings$x(!!J.getInterceptor(r).$isNodeBindExtension ? r : M.nodeBindFallback(r)), "checked");
+              if (checkedBinding != null)
+                J.set$value$x(checkedBinding, false);
+            }
+          break;
+        case "selectedIndex":
+          t1 = J.get$selectedIndex$x(this._node);
+          J.set$value$x(this._template_binding$_bindable, t1);
+          break;
+      }
+      O.dirtyCheckObservables();
+    }, "call$1", "get$_nodeChanged", 2, 0, 20, 1],
+    open$1: function(_, callback) {
+      return J.open$1$x(this._template_binding$_bindable, callback);
+    },
+    get$value: function(_) {
+      return J.get$value$x(this._template_binding$_bindable);
+    },
+    set$value: function(_, newValue) {
+      J.set$value$x(this._template_binding$_bindable, newValue);
+      return newValue;
+    },
+    close$0: function(_) {
+      var t1 = this._eventSub;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._eventSub = null;
+      }
+      t1 = this._template_binding$_bindable;
+      if (t1 != null) {
+        J.close$0$x(t1);
+        this._template_binding$_bindable = null;
+      }
+    },
+    $is_InputBinding: true,
+    static: {"^": "_InputBinding__checkboxEventType", _InputBinding__updateProperty: function(node, newValue, propertyName) {
+        switch (propertyName) {
+          case "checked":
+            J.set$checked$x(node, null != newValue && false !== newValue);
+            return;
+          case "selectedIndex":
+            J.set$selectedIndex$x(node, M._InputBinding__toInt(newValue));
+            return;
+          case "value":
+            J.set$value$x(node, newValue == null ? "" : H.S(newValue));
+            return;
+        }
+      }, _InputBinding__getStreamForInputType: function(element) {
+        var t1 = J.getInterceptor(element);
+        if (!!t1.$isOptionElement)
+          return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(element, C.EventStreamProvider_input._eventType, false), [null]);
+        switch (t1.get$type(element)) {
+          case "checkbox":
+            return $.get$_InputBinding__checkboxEventType().forTarget$1(element);
+          case "radio":
+          case "select-multiple":
+          case "select-one":
+            return t1.get$onChange(element);
+          case "range":
+            if (J.contains$1$asx(window.navigator.userAgent, new H.JSSyntaxRegExp("Trident|MSIE", H.JSSyntaxRegExp_makeNative("Trident|MSIE", false, true, false), null, null)))
+              return t1.get$onChange(element);
+            break;
+        }
+        return t1.get$onInput(element);
+      }, _InputBinding__getAssociatedRadioButtons: function(element) {
+        var t1, treeScope, radios;
+        t1 = J.getInterceptor$x(element);
+        if (t1.get$form(element) != null) {
+          t1 = t1.get$form(element);
+          t1.toString;
+          t1 = new W._ChildNodeListLazy(t1);
+          return t1.where$1(t1, new M._InputBinding__getAssociatedRadioButtons_closure(element));
+        } else {
+          treeScope = M._getTreeScope(element);
+          if (treeScope == null)
+            return C.List_empty;
+          radios = J.querySelectorAll$1$x(treeScope, "input[type=\"radio\"][name=\"" + H.S(t1.get$name(element)) + "\"]");
+          return radios.where$1(radios, new M._InputBinding__getAssociatedRadioButtons_closure0(element));
+        }
+      }, _InputBinding__toInt: function(value) {
+        if (typeof value === "string")
+          return H.Primitives_parseInt(value, null, new M._InputBinding__toInt_closure());
+        return typeof value === "number" && Math.floor(value) === value ? value : 0;
+      }}
+  },
+  closure10: {
+    "^": "Closure:69;",
+    call$0: function() {
+      var checkbox, t1, fired, t2, $event;
+      checkbox = document.createElement("div", null).appendChild(W.InputElement_InputElement(null));
+      t1 = J.getInterceptor$x(checkbox);
+      t1.set$type(checkbox, "checkbox");
+      fired = [];
+      t2 = t1.get$onClick(checkbox);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t2._html$_target, t2._eventType, W._wrapZone(new M._closure1(fired)), t2._useCapture), [H.getTypeArgumentByIndex(t2, 0)])._tryResume$0();
+      t1 = t1.get$onChange(checkbox);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(new M._closure2(fired)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+      t1 = window;
+      $event = document.createEvent("MouseEvent");
+      J._initMouseEvent$15$x($event, "click", true, true, t1, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+      checkbox.dispatchEvent($event);
+      return fired.length === 1 ? C.EventStreamProvider_change : C.JSArray_methods.get$first(fired);
+    },
+    $isFunction: true
+  },
+  _closure1: {
+    "^": "Closure:13;fired_0",
+    call$1: [function(e) {
+      this.fired_0.push(C.EventStreamProvider_click);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _closure2: {
+    "^": "Closure:13;fired_1",
+    call$1: [function(e) {
+      this.fired_1.push(C.EventStreamProvider_change);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _InputBinding__getAssociatedRadioButtons_closure: {
+    "^": "Closure:13;element_0",
+    call$1: function(el) {
+      var t1, t2;
+      t1 = this.element_0;
+      t2 = J.getInterceptor(el);
+      if (!t2.$eq(el, t1))
+        if (!!t2.$isInputElement)
+          if (el.type === "radio") {
+            t2 = el.name;
+            t1 = J.get$name$x(t1);
+            t1 = t2 == null ? t1 == null : t2 === t1;
+          } else
+            t1 = false;
+        else
+          t1 = false;
+      else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  _InputBinding__getAssociatedRadioButtons_closure0: {
+    "^": "Closure:13;element_1",
+    call$1: function(el) {
+      var t1 = J.getInterceptor(el);
+      return !t1.$eq(el, this.element_1) && t1.get$form(el) == null;
+    },
+    $isFunction: true
+  },
+  _InputBinding__toInt_closure: {
+    "^": "Closure:13;",
+    call$1: function(_) {
+      return 0;
+    },
+    $isFunction: true
+  },
+  _InputElementExtension: {
+    "^": "_ElementExtension;_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, t2, t3;
+      t1 = J.getInterceptor($name);
+      if (!t1.$eq($name, "value") && !t1.$eq($name, "checked"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      J.get$attributes$x(this._node).remove$1(0, $name);
+      if (oneTime) {
+        M._InputBinding__updateProperty(this._node, value, $name);
+        return;
+      }
+      t1 = this._node;
+      t2 = new M._InputBinding(t1, null, value, $name);
+      t2._eventSub = M._InputBinding__getStreamForInputType(t1).listen$1(t2.get$_nodeChanged());
+      t3 = t2.get$_template_binding$_updateNode();
+      M._InputBinding__updateProperty(t1, J.open$1$x(t2._template_binding$_bindable, t3), $name);
+      return this._updateBindings$2($name, t2);
+    }
+  },
+  _InstanceBindingMap: {
+    "^": "Object;bindings>,children>,content>",
+    get$isTemplate: function() {
+      return false;
+    },
+    getChild$1: function(index) {
+      var t1 = this.children;
+      if (t1 == null || index >= t1.length)
+        return;
+      if (index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    }
+  },
+  _TemplateBindingMap: {
+    "^": "_InstanceBindingMap;_if,_bind,_repeat,bindings,children,content",
+    get$isTemplate: function() {
+      return true;
+    },
+    $is_TemplateBindingMap: true
+  },
+  NodeBindExtension: {
+    "^": "Object;_node<,bindings*,_templateInstance?",
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1;
+      window;
+      t1 = "Unhandled binding to Node: " + H.Primitives_objectToString(this) + " " + H.S($name) + " " + H.S(value) + " " + oneTime;
+      if (typeof console != "undefined")
+        console.error(t1);
+      return;
+    },
+    bindFinished$0: function(_) {
+    },
+    get$templateInstance: function(_) {
+      var t1 = this._templateInstance;
+      if (t1 != null)
+        ;
+      else if (J.get$parent$x(this.get$_node()) != null) {
+        t1 = J.get$parent$x(this.get$_node());
+        t1 = J.get$templateInstance$x(!!J.getInterceptor(t1).$isNodeBindExtension ? t1 : M.nodeBindFallback(t1));
+      } else
+        t1 = null;
+      return t1;
+    },
+    _updateBindings$2: function($name, binding) {
+      var t1, old;
+      t1 = this.bindings;
+      if (t1 == null) {
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        this.bindings = t1;
+      }
+      old = t1.$index(0, $name);
+      if (old != null)
+        J.close$0$x(old);
+      this.bindings.$indexSet(0, $name, binding);
+      return binding;
+    },
+    $isNodeBindExtension: true
+  },
+  TemplateInstance: {
+    "^": "Object;model>,_firstNode,_lastNode"
+  },
+  _SelectElementExtension: {
+    "^": "_ElementExtension;_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, t2, t3;
+      if (J.$eq($name, "selectedindex"))
+        $name = "selectedIndex";
+      t1 = J.getInterceptor($name);
+      if (!t1.$eq($name, "selectedIndex") && !t1.$eq($name, "value"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      J.get$attributes$x(this._node).remove$1(0, $name);
+      if (oneTime) {
+        M._InputBinding__updateProperty(this._node, value, $name);
+        return;
+      }
+      t1 = this._node;
+      t2 = new M._InputBinding(t1, null, value, $name);
+      t2._eventSub = M._InputBinding__getStreamForInputType(t1).listen$1(t2.get$_nodeChanged());
+      t3 = t2.get$_template_binding$_updateNode();
+      M._InputBinding__updateProperty(t1, J.open$1$x(t2._template_binding$_bindable, t3), $name);
+      return this._updateBindings$2($name, t2);
+    }
+  },
+  TemplateBindExtension: {
+    "^": "_ElementExtension;_model?,_bindingDelegate,_template_binding$_iterator<,_setModelScheduled,_templateInstanceRef?,_content?,_templateIsDecorated?,_stagingDocument,_bindingMap,_refContent,_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var ref;
+      if (!J.$eq($name, "ref"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      ref = oneTime ? value : J.open$1$x(value, new M.TemplateBindExtension_bind_closure(this));
+      J.get$attributes$x(this._node)._html$_element.setAttribute("ref", ref);
+      this._refChanged$0();
+      if (oneTime)
+        return;
+      return this._updateBindings$2("ref", value);
+    },
+    _processBindingDirectives$1: function(directives) {
+      var t1 = this._template_binding$_iterator;
+      if (t1 != null)
+        t1._closeDependencies$0();
+      if (directives._if == null && directives._bind == null && directives._repeat == null) {
+        t1 = this._template_binding$_iterator;
+        if (t1 != null) {
+          t1.close$0(0);
+          this._template_binding$_iterator = null;
+        }
+        return;
+      }
+      t1 = this._template_binding$_iterator;
+      if (t1 == null) {
+        t1 = new M._TemplateIterator(this, [], [], null, false, null, null, null, null, null, null, null, false, null, null);
+        this._template_binding$_iterator = t1;
+      }
+      t1._updateDependencies$2(directives, this._model);
+      J.observe$3$attributeFilter$attributes$x($.get$TemplateBindExtension__templateObserver(), this._node, ["ref"], true);
+      return this._template_binding$_iterator;
+    },
+    createInstance$2: function(_, model, delegate) {
+      var t1, t2, delegate0, t3, map, owner, doc, instance, instanceExt, t4, instanceRecord, c, i, collectTerminator, childMap, clone;
+      if (delegate == null)
+        delegate = this._bindingDelegate;
+      t1 = this._refContent;
+      if (t1 == null) {
+        t1 = this.get$_ref();
+        t1 = J.get$content$x(!!J.getInterceptor(t1).$isNodeBindExtension ? t1 : M.nodeBindFallback(t1));
+        this._refContent = t1;
+      }
+      t2 = J.getInterceptor$x(t1);
+      if (t2.get$firstChild(t1) == null)
+        return $.get$_emptyInstance();
+      delegate0 = delegate == null ? $.get$BindingDelegate__DEFAULT() : delegate;
+      t3 = delegate0._bindingMaps;
+      if (t3 == null) {
+        t3 = H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+        delegate0._bindingMaps = t3;
+      }
+      map = t3.$index(0, t1);
+      if (map == null) {
+        map = M._createInstanceBindingMap(t1, delegate0);
+        delegate0._bindingMaps.$indexSet(0, t1, map);
+      }
+      t3 = this._stagingDocument;
+      if (t3 == null) {
+        owner = J.get$ownerDocument$x(this._node);
+        t3 = $.get$TemplateBindExtension__ownerStagingDocument();
+        doc = t3.$index(0, owner);
+        if (doc == null) {
+          doc = owner.implementation.createHTMLDocument("");
+          $.get$_isStagingDocument().$indexSet(0, doc, true);
+          M.TemplateBindExtension__baseUriWorkaround(doc);
+          t3.$indexSet(0, owner, doc);
+        }
+        this._stagingDocument = doc;
+        t3 = doc;
+      }
+      instance = J.createDocumentFragment$0$x(t3);
+      t3 = [];
+      instanceExt = new M._InstanceExtension(t3, null, null, null);
+      t4 = $.get$_instanceExtension();
+      instanceExt._templateCreator = this._node;
+      instanceExt._protoContent = t1;
+      t4.$indexSet(0, instance, instanceExt);
+      instanceRecord = new M.TemplateInstance(model, null, null);
+      M.nodeBindFallback(instance).set$_templateInstance(instanceRecord);
+      for (c = t2.get$firstChild(t1), t1 = map != null, i = 0, collectTerminator = false; c != null; c = c.nextSibling, ++i) {
+        if (c.nextSibling == null)
+          collectTerminator = true;
+        childMap = t1 ? map.getChild$1(i) : null;
+        clone = M._cloneAndBindInstance(c, instance, this._stagingDocument, childMap, model, delegate, t3, null);
+        M.nodeBindFallback(clone).set$_templateInstance(instanceRecord);
+        if (collectTerminator)
+          instanceExt._terminator = clone;
+      }
+      instanceRecord._firstNode = instance.firstChild;
+      instanceRecord._lastNode = instance.lastChild;
+      instanceExt._protoContent = null;
+      instanceExt._templateCreator = null;
+      return instance;
+    },
+    get$model: function(_) {
+      return this._model;
+    },
+    get$bindingDelegate: function(_) {
+      return this._bindingDelegate;
+    },
+    set$bindingDelegate: function(_, value) {
+      var t1;
+      if (this._bindingDelegate != null)
+        throw H.wrapException(P.StateError$("Template must be cleared before a new bindingDelegate can be assigned"));
+      this._bindingDelegate = value;
+      this._bindingMap = null;
+      t1 = this._template_binding$_iterator;
+      if (t1 != null) {
+        t1._initPrepareFunctions = false;
+        t1._instanceModelFn = null;
+        t1._instancePositionChangedFn = null;
+      }
+    },
+    _refChanged$0: function() {
+      var t1, t2;
+      if (this._template_binding$_iterator != null) {
+        t1 = this._refContent;
+        t2 = this.get$_ref();
+        t2 = J.get$content$x(!!J.getInterceptor(t2).$isNodeBindExtension ? t2 : M.nodeBindFallback(t2));
+        t2 = t1 == null ? t2 == null : t1 === t2;
+        t1 = t2;
+      } else
+        t1 = true;
+      if (t1)
+        return;
+      this._refContent = null;
+      this._template_binding$_iterator._valueChanged$1(null);
+      this._template_binding$_iterator._updateIteratedValue$1(null);
+    },
+    clear$0: function(_) {
+      var t1, ref;
+      this._model = null;
+      this._bindingDelegate = null;
+      t1 = this.bindings;
+      if (t1 != null) {
+        ref = t1.remove$1(0, "ref");
+        if (ref != null)
+          J.close$0$x(ref);
+      }
+      this._refContent = null;
+      t1 = this._template_binding$_iterator;
+      if (t1 == null)
+        return;
+      t1._valueChanged$1(null);
+      this._template_binding$_iterator.close$0(0);
+      this._template_binding$_iterator = null;
+    },
+    get$_ref: function() {
+      var ref, nextRef;
+      this._decorate$0();
+      ref = M._searchRefId(this._node, J.get$attributes$x(this._node)._html$_element.getAttribute("ref"));
+      if (ref == null) {
+        ref = this._templateInstanceRef;
+        if (ref == null)
+          return this._node;
+      }
+      nextRef = M.nodeBindFallback(ref).get$_ref();
+      return nextRef != null ? nextRef : ref;
+    },
+    get$content: function(_) {
+      var t1;
+      this._decorate$0();
+      t1 = this._content;
+      return t1 != null ? t1 : H.interceptedTypeCast(this._node, "$isTemplateElement").content;
+    },
+    _decorate$1: function(instanceRef) {
+      var isNativeHtmlTemplate, liftContents, t1, t2, templateElementExt, liftRoot, template;
+      if (this._templateIsDecorated === true)
+        return false;
+      M.TemplateBindExtension__injectStylesheet();
+      M.TemplateBindExtension__globalBaseUriWorkaround();
+      this._templateIsDecorated = true;
+      isNativeHtmlTemplate = !!J.getInterceptor(this._node).$isTemplateElement;
+      liftContents = !isNativeHtmlTemplate;
+      if (liftContents) {
+        t1 = this._node;
+        t2 = J.getInterceptor$x(t1);
+        if (t2.get$attributes(t1)._html$_element.hasAttribute("template") === true && C.Map_05eTF.containsKey$1(t2.get$localName(t1)) === true) {
+          if (instanceRef != null)
+            throw H.wrapException(P.ArgumentError$("instanceRef should not be supplied for attribute templates."));
+          templateElementExt = M.TemplateBindExtension__extractTemplateFromAttributeTemplate(this._node);
+          templateElementExt = !!J.getInterceptor(templateElementExt).$isNodeBindExtension ? templateElementExt : M.nodeBindFallback(templateElementExt);
+          templateElementExt.set$_templateIsDecorated(true);
+          isNativeHtmlTemplate = !!J.getInterceptor(templateElementExt.get$_node()).$isTemplateElement;
+          liftRoot = true;
+        } else {
+          t1 = this._node;
+          t2 = J.getInterceptor$x(t1);
+          if (t2.get$tagName(t1) === "template" && t2.get$namespaceUri(t1) === "http://www.w3.org/2000/svg") {
+            t1 = this._node;
+            t2 = J.getInterceptor$x(t1);
+            template = t2.get$ownerDocument(t1).createElement("template", null);
+            t2.get$parentNode(t1).insertBefore(template, t1);
+            template.toString;
+            new W._ElementAttributeMap(template).addAll$1(0, t2.get$attributes(t1));
+            t2.get$attributes(t1).clear$0(0);
+            t2.remove$0(t1);
+            templateElementExt = !!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template);
+            templateElementExt.set$_templateIsDecorated(true);
+            isNativeHtmlTemplate = !!J.getInterceptor(templateElementExt.get$_node()).$isTemplateElement;
+          } else {
+            templateElementExt = this;
+            isNativeHtmlTemplate = false;
+          }
+          liftRoot = false;
+        }
+      } else {
+        templateElementExt = this;
+        liftRoot = false;
+      }
+      if (!isNativeHtmlTemplate)
+        templateElementExt.set$_content(J.createDocumentFragment$0$x(M.TemplateBindExtension__getOrCreateTemplateContentsOwner(templateElementExt.get$_node())));
+      if (instanceRef != null)
+        templateElementExt.set$_templateInstanceRef(instanceRef);
+      else if (liftContents)
+        M.TemplateBindExtension__liftNonNativeChildrenIntoContent(templateElementExt, this._node, liftRoot);
+      else
+        M.TemplateBindExtension_bootstrap(J.get$content$x(templateElementExt));
+      return true;
+    },
+    _decorate$0: function() {
+      return this._decorate$1(null);
+    },
+    $isTemplateBindExtension: true,
+    static: {"^": "TemplateBindExtension__contentsOwner,TemplateBindExtension__ownerStagingDocument,TemplateBindExtension__allTemplatesSelectors,TemplateBindExtension__initStyles,TemplateBindExtension__initBaseUriWorkaround,TemplateBindExtension__templateObserver", TemplateBindExtension__getOrCreateTemplateContentsOwner: function(template) {
+        var doc, d, t1, t2;
+        doc = J.get$ownerDocument$x(template);
+        if (W._convertNativeToDart_Window(doc.defaultView) == null)
+          return doc;
+        d = $.get$TemplateBindExtension__contentsOwner().$index(0, doc);
+        if (d == null) {
+          d = doc.implementation.createHTMLDocument("");
+          for (; t1 = d.lastChild, t1 != null;) {
+            t2 = t1.parentNode;
+            if (t2 != null)
+              t2.removeChild(t1);
+          }
+          $.get$TemplateBindExtension__contentsOwner().$indexSet(0, doc, d);
+        }
+        return d;
+      }, TemplateBindExtension__extractTemplateFromAttributeTemplate: function(el) {
+        var t1, template, t2, $name, t3, value;
+        t1 = J.getInterceptor$x(el);
+        template = t1.get$ownerDocument(el).createElement("template", null);
+        t1.get$parentNode(el).insertBefore(template, el);
+        for (t2 = C.JSArray_methods.toList$0(t1.get$attributes(el).get$keys()), t2 = H.setRuntimeTypeInfo(new H.ListIterator(t2, t2.length, 0, null), [H.getTypeArgumentByIndex(t2, 0)]); t2.moveNext$0();) {
+          $name = t2._current;
+          switch ($name) {
+            case "template":
+              t3 = t1.get$attributes(el)._html$_element;
+              t3.getAttribute($name);
+              t3.removeAttribute($name);
+              break;
+            case "repeat":
+            case "bind":
+            case "ref":
+              template.toString;
+              t3 = t1.get$attributes(el)._html$_element;
+              value = t3.getAttribute($name);
+              t3.removeAttribute($name);
+              template.setAttribute($name, value);
+              break;
+          }
+        }
+        return template;
+      }, TemplateBindExtension__liftNonNativeChildrenIntoContent: function(template, el, useRoot) {
+        var $content, t1, t2, child;
+        $content = J.get$content$x(template);
+        if (useRoot) {
+          J.append$1$x($content, el);
+          return;
+        }
+        for (t1 = J.getInterceptor$x(el), t2 = J.getInterceptor$x($content); child = t1.get$firstChild(el), child != null;)
+          t2.append$1($content, child);
+      }, TemplateBindExtension_bootstrap: function($content) {
+        var t1, descendents;
+        t1 = new M.TemplateBindExtension_bootstrap__bootstrap();
+        descendents = J.querySelectorAll$1$x($content, $.get$TemplateBindExtension__allTemplatesSelectors());
+        if (M.isSemanticTemplate($content))
+          t1.call$1($content);
+        descendents.forEach$1(descendents, t1);
+      }, TemplateBindExtension__injectStylesheet: function() {
+        if ($.TemplateBindExtension__initStyles === true)
+          return;
+        $.TemplateBindExtension__initStyles = true;
+        var style = document.createElement("style", null);
+        J.set$text$x(style, H.S($.get$TemplateBindExtension__allTemplatesSelectors()) + " { display: none; }");
+        document.head.appendChild(style);
+      }, TemplateBindExtension__globalBaseUriWorkaround: function() {
+        var t, d;
+        if ($.TemplateBindExtension__initBaseUriWorkaround === true)
+          return;
+        $.TemplateBindExtension__initBaseUriWorkaround = true;
+        t = document.createElement("template", null);
+        if (!!J.getInterceptor(t).$isTemplateElement) {
+          d = t.content.ownerDocument;
+          if (d.documentElement == null)
+            d.appendChild(d.createElement("html", null)).appendChild(d.createElement("head", null));
+          if (J.get$head$x(d).querySelector("base") == null)
+            M.TemplateBindExtension__baseUriWorkaround(d);
+        }
+      }, TemplateBindExtension__baseUriWorkaround: function(doc) {
+        var base = doc.createElement("base", null);
+        J.set$href$x(base, document.baseURI);
+        J.get$head$x(doc).appendChild(base);
+      }}
+  },
+  TemplateBindExtension_bind_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(ref) {
+      var t1 = this.this_0;
+      J.get$attributes$x(t1._node)._html$_element.setAttribute("ref", ref);
+      t1._refChanged$0();
+    }, "call$1", null, 2, 0, null, 202, "call"],
+    $isFunction: true
+  },
+  TemplateBindExtension_bootstrap__bootstrap: {
+    "^": "Closure:20;",
+    call$1: function(template) {
+      if (!M.nodeBindFallback(template)._decorate$1(null))
+        M.TemplateBindExtension_bootstrap(J.get$content$x(!!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template)));
+    },
+    $isFunction: true
+  },
+  closure6: {
+    "^": "Closure:13;",
+    call$1: [function(k) {
+      return H.S(k) + "[template]";
+    }, "call$1", null, 2, 0, null, 174, "call"],
+    $isFunction: true
+  },
+  closure8: {
+    "^": "Closure:75;",
+    call$2: [function(records, _) {
+      var t1;
+      for (t1 = J.get$iterator$ax(records); t1.moveNext$0();)
+        M.nodeBindFallback(J.get$target$x(t1.get$current()))._refChanged$0();
+    }, "call$2", null, 4, 0, null, 160, 14, "call"],
+    $isFunction: true
+  },
+  closure9: {
+    "^": "Closure:69;",
+    call$0: function() {
+      var empty = document.createDocumentFragment();
+      $.get$_instanceExtension().$indexSet(0, empty, new M._InstanceExtension([], null, null, null));
+      return empty;
+    },
+    $isFunction: true
+  },
+  _InstanceExtension: {
+    "^": "Object;_bindings<,_terminator<,_templateCreator<,_protoContent<"
+  },
+  _getDelegateFactory_closure: {
+    "^": "Closure:13;name_0,node_1,delegate_2",
+    call$1: function(pathString) {
+      return this.delegate_2.prepareBinding$3(pathString, this.name_0, this.node_1);
+    },
+    $isFunction: true
+  },
+  _parseAttributeBindings_closure: {
+    "^": "Closure:75;box_0,element_1,delegate_2,isTemplateNode_3",
+    call$2: function($name, value) {
+      var t1, tokens, t2, bindings;
+      for (; t1 = J.getInterceptor$asx($name), J.$eq(t1.$index($name, 0), "_");)
+        $name = t1.substring$1($name, 1);
+      if (this.isTemplateNode_3)
+        t1 = t1.$eq($name, "bind") || t1.$eq($name, "if") || t1.$eq($name, "repeat");
+      else
+        t1 = false;
+      if (t1)
+        return;
+      tokens = S.MustacheTokens_parse(value, M._getDelegateFactory($name, this.element_1, this.delegate_2));
+      if (tokens != null) {
+        t1 = this.box_0;
+        t2 = t1.bindings_0;
+        if (t2 == null) {
+          bindings = [];
+          t1.bindings_0 = bindings;
+          t1 = bindings;
+        } else
+          t1 = t2;
+        t1.push($name);
+        t1.push(tokens);
+      }
+    },
+    $isFunction: true
+  },
+  _TemplateIterator: {
+    "^": "Bindable;_templateExt,_instances,_iteratedValue,_presentValue,_closed,_ifValue,_template_binding$_value,_hasIf,_hasRepeat,_ifOneTime,_oneTime,_listSub,_initPrepareFunctions,_instanceModelFn,_instancePositionChangedFn",
+    _instanceModelFn$1: function(arg0) {
+      return this._instanceModelFn.call$1(arg0);
+    },
+    open$1: function(_, callback) {
+      return H.throwExpression(P.StateError$("binding already opened"));
+    },
+    get$value: function(_) {
+      return this._template_binding$_value;
+    },
+    _closeDependencies$0: function() {
+      var t1, t2;
+      t1 = this._ifValue;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isBindable) {
+        t2.close$0(t1);
+        this._ifValue = null;
+      }
+      t1 = this._template_binding$_value;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isBindable) {
+        t2.close$0(t1);
+        this._template_binding$_value = null;
+      }
+    },
+    _updateDependencies$2: function(directives, model) {
+      var template, t1, t2;
+      this._closeDependencies$0();
+      template = this._templateExt._node;
+      t1 = directives._if;
+      t2 = t1 != null;
+      this._hasIf = t2;
+      this._hasRepeat = directives._repeat != null;
+      if (t2) {
+        this._ifOneTime = t1.onlyOneTime;
+        t1 = M._processBinding("if", t1, template, model);
+        this._ifValue = t1;
+        if (this._ifOneTime === true) {
+          if (!(null != t1 && false !== t1)) {
+            this._updateIteratedValue$1(null);
+            return;
+          }
+        } else
+          H.interceptedTypeCast(t1, "$isBindable").open$1(0, this.get$_updateIteratedValue());
+      }
+      if (this._hasRepeat === true) {
+        t1 = directives._repeat;
+        this._oneTime = t1.onlyOneTime;
+        t1 = M._processBinding("repeat", t1, template, model);
+        this._template_binding$_value = t1;
+      } else {
+        t1 = directives._bind;
+        this._oneTime = t1.onlyOneTime;
+        t1 = M._processBinding("bind", t1, template, model);
+        this._template_binding$_value = t1;
+      }
+      if (this._oneTime !== true)
+        J.open$1$x(t1, this.get$_updateIteratedValue());
+      this._updateIteratedValue$1(null);
+    },
+    _updateIteratedValue$1: [function(_) {
+      var ifValue, value;
+      if (this._hasIf === true) {
+        ifValue = this._ifValue;
+        if (this._ifOneTime !== true) {
+          H.interceptedTypeCast(ifValue, "$isBindable");
+          ifValue = ifValue.get$value(ifValue);
+        }
+        if (!(null != ifValue && false !== ifValue)) {
+          this._valueChanged$1([]);
+          return;
+        }
+      }
+      value = this._template_binding$_value;
+      if (this._oneTime !== true) {
+        H.interceptedTypeCast(value, "$isBindable");
+        value = value.get$value(value);
+      }
+      this._valueChanged$1(this._hasRepeat !== true ? [value] : value);
+    }, "call$1", "get$_updateIteratedValue", 2, 0, 20, 14],
+    _valueChanged$1: function(value) {
+      var t1, t2;
+      t1 = J.getInterceptor(value);
+      if (!t1.$isList)
+        value = !!t1.$isIterable ? t1.toList$0(value) : [];
+      t1 = this._iteratedValue;
+      if (value === t1)
+        return;
+      this._unobserve$0();
+      this._presentValue = value;
+      if (!!J.getInterceptor(value).$isObservableList && this._hasRepeat === true && this._oneTime !== true) {
+        if (value.get$_listRecords() != null)
+          value.set$_listRecords([]);
+        this._listSub = value.get$listChanges().listen$1(this.get$_handleSplices());
+      }
+      t2 = this._presentValue;
+      t2 = t2 != null ? t2 : [];
+      this._handleSplices$1(G.calcSplices(t2, 0, J.get$length$asx(t2), t1, 0, t1.length));
+    },
+    _getLastInstanceNode$1: function(index) {
+      var t1, t2, terminator, subtemplateIterator;
+      if (J.$eq(index, -1))
+        return this._templateExt._node;
+      t1 = $.get$_instanceExtension();
+      t2 = this._instances;
+      if (index >>> 0 !== index || index >= t2.length)
+        return H.ioore(t2, index);
+      terminator = t1.$index(0, t2[index]).get$_terminator();
+      if (terminator == null)
+        return this._getLastInstanceNode$1(index - 1);
+      if (!M.isSemanticTemplate(terminator) || terminator === this._templateExt._node)
+        return terminator;
+      subtemplateIterator = M.nodeBindFallback(terminator).get$_template_binding$_iterator();
+      if (subtemplateIterator == null)
+        return terminator;
+      return subtemplateIterator._getLastInstanceNode$1(subtemplateIterator._instances.length - 1);
+    },
+    _extractInstanceAt$1: function(index) {
+      var previousInstanceLast, lastNode, instance, t1, t2, node, t3;
+      previousInstanceLast = this._getLastInstanceNode$1(J.$sub$n(index, 1));
+      lastNode = this._getLastInstanceNode$1(index);
+      J.get$parentNode$x(this._templateExt._node);
+      instance = C.JSArray_methods.removeAt$1(this._instances, index);
+      for (t1 = J.getInterceptor$x(instance), t2 = J.getInterceptor$x(previousInstanceLast); !J.$eq(lastNode, previousInstanceLast);) {
+        node = t2.get$nextNode(previousInstanceLast);
+        if (node == null ? lastNode == null : node === lastNode)
+          lastNode = previousInstanceLast;
+        t3 = node.parentNode;
+        if (t3 != null)
+          t3.removeChild(node);
+        t1.append$1(instance, node);
+      }
+      return instance;
+    },
+    _handleSplices$1: [function(splices) {
+      var delegate, model, instance, e, s, t1, template, t2, delegate0, instanceCache, t3, t4, removeDelta, splice, t5, t6, model0, instance0, addIndex, exception, previousInstanceLast, $parent;
+      if (this._closed || J.get$isEmpty$asx(splices) === true)
+        return;
+      t1 = this._templateExt;
+      template = t1._node;
+      if (J.get$parentNode$x(template) == null) {
+        this.close$0(0);
+        return;
+      }
+      t2 = this._iteratedValue;
+      Q.ObservableList_applyChangeRecords(t2, this._presentValue, splices);
+      delegate = t1._bindingDelegate;
+      if (!this._initPrepareFunctions) {
+        this._initPrepareFunctions = true;
+        delegate0 = J.get$bindingDelegate$x(!!J.getInterceptor(t1._node).$isTemplateBindExtension ? t1._node : t1);
+        if (delegate0 != null) {
+          this._instanceModelFn = delegate0._delegate.prepareInstanceModel$1(template);
+          this._instancePositionChangedFn = null;
+        }
+      }
+      instanceCache = P.HashMap_HashMap(P.identical$closure(), null, null, null, null);
+      for (t3 = J.getInterceptor$ax(splices), t4 = t3.get$iterator(splices), removeDelta = 0; t4.moveNext$0();) {
+        splice = t4.get$current();
+        for (t5 = splice.get$removed(), t5 = t5.get$iterator(t5), t6 = J.getInterceptor$x(splice); t5.moveNext$0();) {
+          model0 = t5._current;
+          instance0 = this._extractInstanceAt$1(J.$add$ns(t6.get$index(splice), removeDelta));
+          if (!J.$eq(instance0, $.get$_emptyInstance()))
+            instanceCache.$indexSet(0, model0, instance0);
+        }
+        t5 = splice.get$addedCount();
+        if (typeof t5 !== "number")
+          return H.iae(t5);
+        removeDelta -= t5;
+      }
+      for (t3 = t3.get$iterator(splices); t3.moveNext$0();) {
+        splice = t3.get$current();
+        for (t4 = J.getInterceptor$x(splice), addIndex = t4.get$index(splice); J.$lt$n(addIndex, J.$add$ns(t4.get$index(splice), splice.get$addedCount())); ++addIndex) {
+          if (addIndex >>> 0 !== addIndex || addIndex >= t2.length)
+            return H.ioore(t2, addIndex);
+          model = t2[addIndex];
+          instance = instanceCache.remove$1(0, model);
+          if (instance == null)
+            try {
+              if (this._instanceModelFn != null)
+                model = this._instanceModelFn$1(model);
+              if (model == null)
+                instance = $.get$_emptyInstance();
+              else
+                instance = t1.createInstance$2(0, model, delegate);
+            } catch (exception) {
+              t5 = H.unwrapException(exception);
+              e = t5;
+              s = new H._StackTrace(exception, null);
+              t5 = new P._Future(0, $.Zone__current, null, null, null, null, null, null);
+              t5.$builtinTypeInfo = [null];
+              new P._AsyncCompleter(t5).$builtinTypeInfo = [null];
+              t6 = e;
+              if (t6 == null)
+                H.throwExpression(P.ArgumentError$("Error must not be null"));
+              if (t5._state !== 0)
+                H.throwExpression(P.StateError$("Future already completed"));
+              t5._asyncCompleteError$2(t6, s);
+              instance = $.get$_emptyInstance();
+            }
+
+          t5 = instance;
+          previousInstanceLast = this._getLastInstanceNode$1(addIndex - 1);
+          $parent = J.get$parentNode$x(t1._node);
+          C.JSArray_methods.insert$2(this._instances, addIndex, t5);
+          $parent.insertBefore(t5, J.get$nextNode$x(previousInstanceLast));
+        }
+      }
+      for (t1 = instanceCache.get$values(instanceCache), t1 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]); t1.moveNext$0();)
+        this._closeInstanceBindings$1(t1._current);
+    }, "call$1", "get$_handleSplices", 2, 0, 203, 204],
+    _closeInstanceBindings$1: [function(instance) {
+      var t1, values, bindings;
+      t1 = $.get$_instanceExtension();
+      t1.toString;
+      values = H.Primitives_getProperty(instance, "expando$values");
+      bindings = (values == null ? null : H.Primitives_getProperty(values, t1._getKey$0())).get$_bindings();
+      t1 = new H.ListIterator(bindings, bindings.length, 0, null);
+      t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(bindings, 0)];
+      for (; t1.moveNext$0();)
+        J.close$0$x(t1._current);
+    }, "call$1", "get$_closeInstanceBindings", 2, 0, 205],
+    _unobserve$0: function() {
+      var t1 = this._listSub;
+      if (t1 == null)
+        return;
+      t1.cancel$0();
+      this._listSub = null;
+    },
+    close$0: function(_) {
+      var t1;
+      if (this._closed)
+        return;
+      this._unobserve$0();
+      t1 = this._instances;
+      H.IterableMixinWorkaround_forEach(t1, this.get$_closeInstanceBindings());
+      C.JSArray_methods.set$length(t1, 0);
+      this._closeDependencies$0();
+      this._templateExt._template_binding$_iterator = null;
+      this._closed = true;
+    }
+  },
+  _TextExtension: {
+    "^": "NodeBindExtension;_node,bindings,_templateInstance",
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1;
+      if (!J.$eq($name, "text"))
+        return M.NodeBindExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      if (oneTime) {
+        t1 = value == null ? "" : H.S(value);
+        J.set$text$x(this._node, t1);
+        return;
+      }
+      t1 = this.get$_updateText();
+      t1.call$1(J.open$1$x(value, t1));
+      return $.enableBindingsReflection ? this._updateBindings$2($name, value) : value;
+    },
+    _updateText$1: [function(value) {
+      var t1 = value == null ? "" : H.S(value);
+      J.set$text$x(this._node, t1);
+    }, "call$1", "get$_updateText", 2, 0, 13, 21]
+  },
+  _TextAreaElementExtension: {
+    "^": "_ElementExtension;_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, t2, t3;
+      if (!J.$eq($name, "value"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      J.get$attributes$x(this._node).remove$1(0, $name);
+      if (oneTime) {
+        M._InputBinding__updateProperty(this._node, value, $name);
+        return;
+      }
+      t1 = this._node;
+      t2 = new M._InputBinding(t1, null, value, $name);
+      t2._eventSub = M._InputBinding__getStreamForInputType(t1).listen$1(t2.get$_nodeChanged());
+      t3 = t2.get$_template_binding$_updateNode();
+      M._InputBinding__updateProperty(t1, J.open$1$x(t2._template_binding$_bindable, t3), $name);
+      return $.enableBindingsReflection ? this._updateBindings$2($name, t2) : t2;
+    }
+  }
+}],
+["template_binding.src.mustache_tokens", "package:template_binding/src/mustache_tokens.dart", , S, {
+  "^": "",
+  MustacheTokens: {
+    "^": "Object;_mustache_tokens$_tokens,onlyOneTime<,_combinator",
+    get$hasOnePath: function() {
+      return this._mustache_tokens$_tokens.length === 5;
+    },
+    get$isSimplePath: function() {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = t1.length;
+      if (t2 === 5) {
+        if (0 >= t2)
+          return H.ioore(t1, 0);
+        if (J.$eq(t1[0], "")) {
+          if (4 >= t1.length)
+            return H.ioore(t1, 4);
+          t1 = J.$eq(t1[4], "");
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$combinator: function() {
+      return this._combinator;
+    },
+    combinator$1: function(arg0) {
+      return this.get$combinator().call$1(arg0);
+    },
+    get$length: function(_) {
+      return C.JSInt_methods._tdivFast$1(this._mustache_tokens$_tokens.length, 4);
+    },
+    getOneTime$1: function(i) {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = i * 4 + 1;
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    getPath$1: function(i) {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = i * 4 + 2;
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    getPrepareBinding$1: function(i) {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = i * 4 + 3;
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    _singleCombinator$1: [function(value) {
+      var t1, t2, t3, t4;
+      if (value == null)
+        value = "";
+      t1 = this._mustache_tokens$_tokens;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t2 = H.S(t1[0]) + H.S(value);
+      t3 = t1.length;
+      t4 = C.JSInt_methods._tdivFast$1(t3, 4) * 4;
+      if (t4 >= t3)
+        return H.ioore(t1, t4);
+      return t2 + H.S(t1[t4]);
+    }, "call$1", "get$_singleCombinator", 2, 0, 206, 21],
+    _listCombinator$1: [function(values) {
+      var t1, newValue, len, t2, i, value, t3, str;
+      t1 = this._mustache_tokens$_tokens;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      newValue = P.StringBuffer$(t1[0]);
+      len = C.JSInt_methods._tdivFast$1(t1.length, 4);
+      for (t2 = J.getInterceptor$asx(values), i = 0; i < len;) {
+        value = t2.$index(values, i);
+        if (value != null)
+          newValue._contents += typeof value === "string" ? value : H.S(value);
+        ++i;
+        t3 = i * 4;
+        if (t3 >= t1.length)
+          return H.ioore(t1, t3);
+        str = t1[t3];
+        newValue._contents += typeof str === "string" ? str : H.S(str);
+      }
+      return newValue._contents;
+    }, "call$1", "get$_listCombinator", 2, 0, 207, 208],
+    MustacheTokens$_$2: function(_tokens, onlyOneTime) {
+      this._combinator = this._mustache_tokens$_tokens.length === 5 ? this.get$_singleCombinator() : this.get$_listCombinator();
+    },
+    static: {"^": "MustacheTokens__TOKEN_TEXT,MustacheTokens__TOKEN_ONETIME,MustacheTokens__TOKEN_PATH,MustacheTokens__TOKEN_PREPAREFN,MustacheTokens__TOKEN_SIZE,MustacheTokens__TOKEN_ENDTEXT", MustacheTokens_parse: function(s, fnFactory) {
+        var $length, t1, t2, tokens, lastIndex, onlyOneTime, startIndex, oneTimeStart, t3, oneTime, terminator, endIndex, pathString, delegateFn;
+        if (s == null || s.length === 0)
+          return;
+        $length = s.length;
+        for (t1 = fnFactory == null, t2 = J.getInterceptor$asx(s), tokens = null, lastIndex = 0, onlyOneTime = true; lastIndex < $length;) {
+          startIndex = t2.indexOf$2(s, "{{", lastIndex);
+          oneTimeStart = C.JSString_methods.indexOf$2(s, "[[", lastIndex);
+          if (oneTimeStart >= 0)
+            t3 = startIndex < 0 || oneTimeStart < startIndex;
+          else
+            t3 = false;
+          if (t3) {
+            startIndex = oneTimeStart;
+            oneTime = true;
+            terminator = "]]";
+          } else {
+            oneTime = false;
+            terminator = "}}";
+          }
+          endIndex = startIndex >= 0 ? C.JSString_methods.indexOf$2(s, terminator, startIndex + 2) : -1;
+          if (endIndex < 0) {
+            if (tokens == null)
+              return;
+            tokens.push(C.JSString_methods.substring$1(s, lastIndex));
+            break;
+          }
+          if (tokens == null)
+            tokens = [];
+          tokens.push(C.JSString_methods.substring$2(s, lastIndex, startIndex));
+          pathString = C.JSString_methods.trim$0(C.JSString_methods.substring$2(s, startIndex + 2, endIndex));
+          tokens.push(oneTime);
+          onlyOneTime = onlyOneTime && oneTime;
+          delegateFn = t1 ? null : fnFactory.call$1(pathString);
+          if (delegateFn == null)
+            tokens.push(L.PropertyPath_PropertyPath(pathString));
+          else
+            tokens.push(null);
+          tokens.push(delegateFn);
+          lastIndex = endIndex + 2;
+        }
+        if (lastIndex === $length)
+          tokens.push("");
+        t1 = new S.MustacheTokens(tokens, onlyOneTime, null);
+        t1.MustacheTokens$_$2(tokens, onlyOneTime);
+        return t1;
+      }}
+  }
+}],
+["vm_ref_element", "package:observatory/src/elements/vm_ref.dart", , X, {
+  "^": "",
+  VMRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {VMRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.VMRefElement_methods.Element$created$0(receiver);
+        C.VMRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["vm_view_element", "package:observatory/src/elements/vm_view.dart", , U, {
+  "^": "",
+  VMViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier50;_vm_view_element$__$vm,_vm_view_element$__$error,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$vm: function(receiver) {
+      return receiver._vm_view_element$__$vm;
+    },
+    set$vm: function(receiver, value) {
+      receiver._vm_view_element$__$vm = this.notifyPropertyChange$3(receiver, C.Symbol_vm, receiver._vm_view_element$__$vm, value);
+    },
+    get$error: function(receiver) {
+      return receiver._vm_view_element$__$error;
+    },
+    set$error: function(receiver, value) {
+      receiver._vm_view_element$__$error = this.notifyPropertyChange$3(receiver, C.Symbol_error, receiver._vm_view_element$__$error, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._vm_view_element$__$vm).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {VMViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.VMViewElement_methods.Element$created$0(receiver);
+        C.VMViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier50: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+]);
+Isolate.$finishClasses($$, $, null);
+$$ = null;
+
+// Runtime type support
+P.$int.$is$int = true;
+P.$int.$isComparable = true;
+P.$int.$asComparable = [P.num];
+P.$int.$isObject = true;
+P.$double.$is$double = true;
+P.$double.$isComparable = true;
+P.$double.$asComparable = [P.num];
+P.$double.$isObject = true;
+W.Node.$isNode = true;
+W.Node.$isObject = true;
+W.SpeechRecognitionResult.$isObject = true;
+W.Entry.$isObject = true;
+P.String.$isString = true;
+P.String.$isComparable = true;
+P.String.$asComparable = [P.String];
+P.String.$isObject = true;
+P.num.$isComparable = true;
+P.num.$asComparable = [P.num];
+P.num.$isObject = true;
+N.Level.$isComparable = true;
+N.Level.$asComparable = [N.Level];
+N.Level.$isObject = true;
+P.Duration.$isDuration = true;
+P.Duration.$isComparable = true;
+P.Duration.$asComparable = [P.Duration];
+P.Duration.$isObject = true;
+W.Element.$isElement = true;
+W.Element.$isNode = true;
+W.Element.$isObject = true;
+P.List.$isList = true;
+P.List.$isIterable = true;
+P.List.$isObject = true;
+P._SplayTreeNode.$isObject = true;
+P.Object.$isObject = true;
+P.Match.$isObject = true;
+K.IndexedValue.$isIndexedValue = true;
+K.IndexedValue.$isObject = true;
+U.TernaryOperator.$isExpression = true;
+U.TernaryOperator.$isObject = true;
+U.UnaryOperator.$isExpression = true;
+U.UnaryOperator.$isObject = true;
+U.BinaryOperator.$isExpression = true;
+U.BinaryOperator.$isObject = true;
+U.Identifier.$isIdentifier = true;
+U.Identifier.$isExpression = true;
+U.Identifier.$isObject = true;
+U.MapLiteralEntry.$isExpression = true;
+U.MapLiteralEntry.$isObject = true;
+U.MapLiteral.$isExpression = true;
+U.MapLiteral.$isObject = true;
+U.ListLiteral.$isExpression = true;
+U.ListLiteral.$isObject = true;
+U.Literal.$isExpression = true;
+U.Literal.$isObject = true;
+U.Invoke.$isExpression = true;
+U.Invoke.$isObject = true;
+U.Index.$isIndex = true;
+U.Index.$isExpression = true;
+U.Index.$isObject = true;
+U.Getter.$isExpression = true;
+U.Getter.$isObject = true;
+U.EmptyExpression.$isEmptyExpression = true;
+U.EmptyExpression.$isExpression = true;
+U.EmptyExpression.$isObject = true;
+P.Symbol.$isSymbol = true;
+P.Symbol.$isObject = true;
+P.Type.$isType = true;
+P.Type.$isObject = true;
+N.Logger.$isObject = true;
+T.ChangeRecord.$isChangeRecord = true;
+T.ChangeRecord.$isObject = true;
+W.TableRowElement.$isElement = true;
+W.TableRowElement.$isNode = true;
+W.TableRowElement.$isObject = true;
+G.ListChangeRecord.$isListChangeRecord = true;
+G.ListChangeRecord.$isObject = true;
+G.TableTreeRow.$isTableTreeRow = true;
+G.TableTreeRow.$isObject = true;
+F.Observable.$isObject = true;
+A.PolymerDeclaration.$isObject = true;
+W.MouseEvent.$isMouseEvent = true;
+W.MouseEvent.$isEvent = true;
+W.MouseEvent.$isObject = true;
+P.bool.$isbool = true;
+P.bool.$isObject = true;
+G.Pane.$isObject = true;
+P.Completer.$isObject = true;
+D.ServiceObject.$isServiceObject = true;
+D.ServiceObject.$isObject = true;
+D.Isolate.$isServiceObject = true;
+D.Isolate.$isObject = true;
+W.PopStateEvent.$isPopStateEvent = true;
+W.PopStateEvent.$isEvent = true;
+W.PopStateEvent.$isObject = true;
+D.CodeCallCount.$isObject = true;
+D.TagProfileSnapshot.$isObject = true;
+D.Class.$isClass = true;
+D.Class.$isServiceObject = true;
+D.Class.$isObject = true;
+D.ServiceMap.$isServiceMap = true;
+D.ServiceMap.$isServiceObject = true;
+D.ServiceMap.$isObservableMap = true;
+D.ServiceMap.$asObservableMap = [null, null];
+D.ServiceMap.$isMap = true;
+D.ServiceMap.$asMap = [null, null];
+D.ServiceMap.$isObject = true;
+D.CodeInstruction.$isObject = true;
+D.CodeTick.$isObject = true;
+D.Library.$isServiceObject = true;
+D.Library.$isObject = true;
+D.Script.$isScript = true;
+D.Script.$isServiceObject = true;
+D.Script.$isObject = true;
+D.ScriptLine.$isObject = true;
+W.HttpRequest.$isHttpRequest = true;
+W.HttpRequest.$isObject = true;
+W.ProgressEvent.$isEvent = true;
+W.ProgressEvent.$isObject = true;
+D.Code.$isCode = true;
+D.Code.$isServiceObject = true;
+D.Code.$isObject = true;
+D.CodeTrieNode.$isObject = true;
+D.PcDescriptor.$isObject = true;
+W.MessageEvent.$isEvent = true;
+W.MessageEvent.$isObject = true;
+L.PropertyPath.$isPropertyPath = true;
+L.PropertyPath.$isObject = true;
+K.Scope.$isObject = true;
+N.LogRecord.$isLogRecord = true;
+N.LogRecord.$isObject = true;
+H.RawReceivePortImpl.$isObject = true;
+H._IsolateEvent.$isObject = true;
+H._IsolateContext.$isObject = true;
+W.ShadowRoot.$isDocumentFragment = true;
+W.ShadowRoot.$isNode = true;
+W.ShadowRoot.$isObject = true;
+W.Event.$isEvent = true;
+W.Event.$isObject = true;
+P.Stream.$isStream = true;
+P.Stream.$isObject = true;
+P.StreamSubscription.$isStreamSubscription = true;
+P.StreamSubscription.$isObject = true;
+Y.Token.$isObject = true;
+U.Expression.$isExpression = true;
+U.Expression.$isObject = true;
+G.SortedTableRow.$isObject = true;
+P.ZoneDelegate.$isZoneDelegate = true;
+P.ZoneDelegate.$isObject = true;
+P.Zone.$isZone = true;
+P.Zone.$isObject = true;
+P.StackTrace.$isStackTrace = true;
+P.StackTrace.$isObject = true;
+V.ObservableMap.$isObservableMap = true;
+V.ObservableMap.$isMap = true;
+V.ObservableMap.$isObject = true;
+P._BufferingStreamSubscription.$is_BufferingStreamSubscription = true;
+P._BufferingStreamSubscription.$is_EventSink = true;
+P._BufferingStreamSubscription.$isStreamSubscription = true;
+P._BufferingStreamSubscription.$isObject = true;
+P._BroadcastSubscription.$is_BroadcastSubscription = true;
+P._BroadcastSubscription.$is_BufferingStreamSubscription = true;
+P._BroadcastSubscription.$is_EventSink = true;
+P._BroadcastSubscription.$isStreamSubscription = true;
+P._BroadcastSubscription.$isObject = true;
+P.Comparable.$isComparable = true;
+P.Comparable.$isObject = true;
+P.ZoneSpecification.$isZoneSpecification = true;
+P.ZoneSpecification.$isObject = true;
+P.Map.$isMap = true;
+P.Map.$isObject = true;
+P.Timer.$isTimer = true;
+P.Timer.$isObject = true;
+P.Iterable.$isIterable = true;
+P.Iterable.$isObject = true;
+P.Future.$isFuture = true;
+P.Future.$isObject = true;
+P.Function.$isFunction = true;
+P.Function.$isObject = true;
+P._EventSink.$is_EventSink = true;
+P._EventSink.$isObject = true;
+P._DelayedEvent.$is_DelayedEvent = true;
+P._DelayedEvent.$isObject = true;
+P.DateTime.$isDateTime = true;
+P.DateTime.$isComparable = true;
+P.DateTime.$asComparable = [null];
+P.DateTime.$isObject = true;
+A.Bindable.$isBindable = true;
+A.Bindable.$isObject = true;
+O.PixelReference.$isPixelReference = true;
+O.PixelReference.$isObject = true;
+D.ServiceError.$isServiceError = true;
+D.ServiceError.$isServiceObject = true;
+D.ServiceError.$isObject = true;
+D.ServiceException.$isServiceException = true;
+D.ServiceException.$isServiceObject = true;
+D.ServiceException.$isObject = true;
+A.Declaration.$isDeclaration = true;
+A.Declaration.$isObject = true;
+A.QueryOptions.$isQueryOptions = true;
+A.QueryOptions.$isObject = true;
+L._Observer.$is_Observer = true;
+L._Observer.$isBindable = true;
+L._Observer.$isObject = true;
+W.DocumentFragment.$isDocumentFragment = true;
+W.DocumentFragment.$isNode = true;
+W.DocumentFragment.$isObject = true;
+// getInterceptor methods
+J.getInterceptor = function(receiver) {
+  if (typeof receiver == "number") {
+    if (Math.floor(receiver) == receiver)
+      return J.JSInt.prototype;
+    return J.JSDouble.prototype;
+  }
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return J.JSNull.prototype;
+  if (typeof receiver == "boolean")
+    return J.JSBool.prototype;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.getInterceptor$asx = function(receiver) {
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.getInterceptor$ax = function(receiver) {
+  if (receiver == null)
+    return receiver;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.getInterceptor$n = function(receiver) {
+  if (typeof receiver == "number")
+    return J.JSNumber.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$ns = function(receiver) {
+  if (typeof receiver == "number")
+    return J.JSNumber.prototype;
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$s = function(receiver) {
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$x = function(receiver) {
+  if (receiver == null)
+    return receiver;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.$add$ns = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver + a0;
+  return J.getInterceptor$ns(receiver).$add(receiver, a0);
+};
+J.$div$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver / a0;
+  return J.getInterceptor$n(receiver).$div(receiver, a0);
+};
+J.$eq = function(receiver, a0) {
+  if (receiver == null)
+    return a0 == null;
+  if (typeof receiver != "object")
+    return a0 != null && receiver === a0;
+  return J.getInterceptor(receiver).$eq(receiver, a0);
+};
+J.$ge$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver >= a0;
+  return J.getInterceptor$n(receiver).$ge(receiver, a0);
+};
+J.$gt$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver > a0;
+  return J.getInterceptor$n(receiver).$gt(receiver, a0);
+};
+J.$index$asx = function(receiver, a0) {
+  if (receiver.constructor == Array || typeof receiver == "string" || H.isJsIndexable(receiver, receiver[init.dispatchPropertyName]))
+    if (a0 >>> 0 === a0 && a0 < receiver.length)
+      return receiver[a0];
+  return J.getInterceptor$asx(receiver).$index(receiver, a0);
+};
+J.$indexSet$ax = function(receiver, a0, a1) {
+  if ((receiver.constructor == Array || H.isJsIndexable(receiver, receiver[init.dispatchPropertyName])) && !receiver.immutable$list && a0 >>> 0 === a0 && a0 < receiver.length)
+    return receiver[a0] = a1;
+  return J.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
+};
+J.$le$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver <= a0;
+  return J.getInterceptor$n(receiver).$le(receiver, a0);
+};
+J.$lt$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver < a0;
+  return J.getInterceptor$n(receiver).$lt(receiver, a0);
+};
+J.$mod$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).$mod(receiver, a0);
+};
+J.$mul$ns = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver * a0;
+  return J.getInterceptor$ns(receiver).$mul(receiver, a0);
+};
+J.$negate$n = function(receiver) {
+  if (typeof receiver == "number")
+    return -receiver;
+  return J.getInterceptor$n(receiver).$negate(receiver);
+};
+J.$shl$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).$shl(receiver, a0);
+};
+J.$sub$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver - a0;
+  return J.getInterceptor$n(receiver).$sub(receiver, a0);
+};
+J.$tdiv$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).$tdiv(receiver, a0);
+};
+J.$xor$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return (receiver ^ a0) >>> 0;
+  return J.getInterceptor$n(receiver).$xor(receiver, a0);
+};
+J.__isolate_helper$_add$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).__isolate_helper$_add$1(receiver, a0);
+};
+J._async$_add$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver)._async$_add$1(receiver, a0);
+};
+J._clearChildren$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver)._clearChildren$0(receiver);
+};
+J._initCustomEvent$4$x = function(receiver, a0, a1, a2, a3) {
+  return J.getInterceptor$x(receiver)._initCustomEvent$4(receiver, a0, a1, a2, a3);
+};
+J._initMouseEvent$15$x = function(receiver, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) {
+  return J.getInterceptor$x(receiver)._initMouseEvent$15(receiver, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
+};
+J._renderPages$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver)._renderPages$1(receiver, a0);
+};
+J._replaceChild$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver)._replaceChild$2(receiver, a0, a1);
+};
+J._update$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver)._update$1(receiver, a0);
+};
+J._updateFragmentationData$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver)._updateFragmentationData$0(receiver);
+};
+J._updateLines$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver)._updateLines$0(receiver);
+};
+J.abs$0$n = function(receiver) {
+  return J.getInterceptor$n(receiver).abs$0(receiver);
+};
+J.accept$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).accept$1(receiver, a0);
+};
+J.add$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).add$1(receiver, a0);
+};
+J.addAll$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).addAll$1(receiver, a0);
+};
+J.addEventListener$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).addEventListener$2(receiver, a0, a1);
+};
+J.addEventListener$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).addEventListener$3(receiver, a0, a1, a2);
+};
+J.addRow$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).addRow$1(receiver, a0);
+};
+J.any$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).any$1(receiver, a0);
+};
+J.append$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).append$1(receiver, a0);
+};
+J.async$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).async$1(receiver, a0);
+};
+J.attached$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).attached$0(receiver);
+};
+J.attributeChanged$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).attributeChanged$3(receiver, a0, a1, a2);
+};
+J.bind$3$oneTime$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).bind$3$oneTime(receiver, a0, a1, a2);
+};
+J.callback$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).callback$0(receiver);
+};
+J.clear$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).clear$0(receiver);
+};
+J.close$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).close$0(receiver);
+};
+J.codeUnitAt$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).codeUnitAt$1(receiver, a0);
+};
+J.compareTo$1$ns = function(receiver, a0) {
+  return J.getInterceptor$ns(receiver).compareTo$1(receiver, a0);
+};
+J.complete$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).complete$1(receiver, a0);
+};
+J.contains$1$asx = function(receiver, a0) {
+  return J.getInterceptor$asx(receiver).contains$1(receiver, a0);
+};
+J.contains$2$asx = function(receiver, a0, a1) {
+  return J.getInterceptor$asx(receiver).contains$2(receiver, a0, a1);
+};
+J.createDocumentFragment$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).createDocumentFragment$0(receiver);
+};
+J.createInstance$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).createInstance$2(receiver, a0, a1);
+};
+J.detached$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).detached$0(receiver);
+};
+J.dispatchMethod$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).dispatchMethod$3(receiver, a0, a1, a2);
+};
+J.elementAt$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).elementAt$1(receiver, a0);
+};
+J.endsWith$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).endsWith$1(receiver, a0);
+};
+J.eval$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).eval$1(receiver, a0);
+};
+J.forEach$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).forEach$1(receiver, a0);
+};
+J.get$$function$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$$function(receiver);
+};
+J.get$$goto$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$$goto(receiver);
+};
+J.get$__isolate_helper$_id$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$__isolate_helper$_id(receiver);
+};
+J.get$_children$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_children(receiver);
+};
+J.get$_element$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_element(receiver);
+};
+J.get$_name$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_name(receiver);
+};
+J.get$_observe$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_observe(receiver);
+};
+J.get$_updateFile$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_updateFile(receiver);
+};
+J.get$_updateHttpServer$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_updateHttpServer(receiver);
+};
+J.get$_updateTagProfile$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_updateTagProfile(receiver);
+};
+J.get$_values$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_values(receiver);
+};
+J.get$active$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$active(receiver);
+};
+J.get$anchor$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$anchor(receiver);
+};
+J.get$attributes$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$attributes(receiver);
+};
+J.get$bindingDelegate$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$bindingDelegate(receiver);
+};
+J.get$bindings$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$bindings(receiver);
+};
+J.get$busy$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$busy(receiver);
+};
+J.get$buttonClick$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$buttonClick(receiver);
+};
+J.get$callback$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$callback(receiver);
+};
+J.get$change$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$change(receiver);
+};
+J.get$changeSort$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$changeSort(receiver);
+};
+J.get$checked$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$checked(receiver);
+};
+J.get$checkedText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$checkedText(receiver);
+};
+J.get$children$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$children(receiver);
+};
+J.get$className$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$className(receiver);
+};
+J.get$classTable$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$classTable(receiver);
+};
+J.get$classes$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$classes(receiver);
+};
+J.get$cls$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$cls(receiver);
+};
+J.get$code$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$code(receiver);
+};
+J.get$coloring$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$coloring(receiver);
+};
+J.get$connection$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$connection(receiver);
+};
+J.get$content$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$content(receiver);
+};
+J.get$context2D$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$context2D(receiver);
+};
+J.get$counters$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$counters(receiver);
+};
+J.get$countersChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$countersChanged(receiver);
+};
+J.get$data$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$data(receiver);
+};
+J.get$devtools$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$devtools(receiver);
+};
+J.get$displayCutoff$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$displayCutoff(receiver);
+};
+J.get$doAction$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$doAction(receiver);
+};
+J.get$element$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$element(receiver);
+};
+J.get$endLine$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$endLine(receiver);
+};
+J.get$endPos$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$endPos(receiver);
+};
+J.get$endPosChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$endPosChanged(receiver);
+};
+J.get$error$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$error(receiver);
+};
+J.get$eval$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$eval(receiver);
+};
+J.get$evalNow$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$evalNow(receiver);
+};
+J.get$exception$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$exception(receiver);
+};
+J.get$expand$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$expand(receiver);
+};
+J.get$expandChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expandChanged(receiver);
+};
+J.get$expanded$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expanded(receiver);
+};
+J.get$expander$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expander(receiver);
+};
+J.get$expr$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expr(receiver);
+};
+J.get$field$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$field(receiver);
+};
+J.get$file$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$file(receiver);
+};
+J.get$flag$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$flag(receiver);
+};
+J.get$flagList$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$flagList(receiver);
+};
+J.get$formatSize$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formatSize(receiver);
+};
+J.get$formatTime$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formatTime(receiver);
+};
+J.get$formattedAverage$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formattedAverage(receiver);
+};
+J.get$formattedCollections$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formattedCollections(receiver);
+};
+J.get$formattedTotalCollectionTime$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formattedTotalCollectionTime(receiver);
+};
+J.get$fragmentation$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$fragmentation(receiver);
+};
+J.get$fragmentationChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$fragmentationChanged(receiver);
+};
+J.get$frame$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$frame(receiver);
+};
+J.get$functionChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$functionChanged(receiver);
+};
+J.get$gotoLink$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$gotoLink(receiver);
+};
+J.get$hasClass$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hasClass(receiver);
+};
+J.get$hasParent$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hasParent(receiver);
+};
+J.get$hashCode$ = function(receiver) {
+  return J.getInterceptor(receiver).get$hashCode(receiver);
+};
+J.get$hashLinkWorkaround$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hashLinkWorkaround(receiver);
+};
+J.get$head$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$head(receiver);
+};
+J.get$height$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$height(receiver);
+};
+J.get$hideTagsChecked$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hideTagsChecked(receiver);
+};
+J.get$hoverText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hoverText(receiver);
+};
+J.get$httpServer$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$httpServer(receiver);
+};
+J.get$id$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$id(receiver);
+};
+J.get$index$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$index(receiver);
+};
+J.get$instance$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$instance(receiver);
+};
+J.get$instances$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$instances(receiver);
+};
+J.get$internal$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$internal(receiver);
+};
+J.get$io$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$io(receiver);
+};
+J.get$isBool$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isBool(receiver);
+};
+J.get$isDart$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isDart(receiver);
+};
+J.get$isDouble$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isDouble(receiver);
+};
+J.get$isEmpty$asx = function(receiver) {
+  return J.getInterceptor$asx(receiver).get$isEmpty(receiver);
+};
+J.get$isError$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isError(receiver);
+};
+J.get$isFinal$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isFinal(receiver);
+};
+J.get$isInstance$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isInstance(receiver);
+};
+J.get$isInt$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isInt(receiver);
+};
+J.get$isList$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isList(receiver);
+};
+J.get$isNotEmpty$asx = function(receiver) {
+  return J.getInterceptor$asx(receiver).get$isNotEmpty(receiver);
+};
+J.get$isNull$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isNull(receiver);
+};
+J.get$isString$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isString(receiver);
+};
+J.get$isType$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isType(receiver);
+};
+J.get$isUnexpected$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isUnexpected(receiver);
+};
+J.get$isolate$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isolate(receiver);
+};
+J.get$isolateChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isolateChanged(receiver);
+};
+J.get$iterator$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$iterator(receiver);
+};
+J.get$key$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$key(receiver);
+};
+J.get$kind$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$kind(receiver);
+};
+J.get$label$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$label(receiver);
+};
+J.get$last$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$last(receiver);
+};
+J.get$lastAccumulatorReset$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lastAccumulatorReset(receiver);
+};
+J.get$lastServiceGC$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lastServiceGC(receiver);
+};
+J.get$length$asx = function(receiver) {
+  return J.getInterceptor$asx(receiver).get$length(receiver);
+};
+J.get$library$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$library(receiver);
+};
+J.get$lineMode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lineMode(receiver);
+};
+J.get$lineNumber$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lineNumber(receiver);
+};
+J.get$lineNumbers$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lineNumbers(receiver);
+};
+J.get$lines$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lines(receiver);
+};
+J.get$link$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$link(receiver);
+};
+J.get$list$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$list(receiver);
+};
+J.get$loaded$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$loaded(receiver);
+};
+J.get$map$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$map(receiver);
+};
+J.get$mapAsString$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mapAsString(receiver);
+};
+J.get$mapChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mapChanged(receiver);
+};
+J.get$message$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$message(receiver);
+};
+J.get$model$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$model(receiver);
+};
+J.get$mouseOut$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mouseOut(receiver);
+};
+J.get$mouseOver$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mouseOver(receiver);
+};
+J.get$msg$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$msg(receiver);
+};
+J.get$name$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$name(receiver);
+};
+J.get$nameIsEmpty$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$nameIsEmpty(receiver);
+};
+J.get$nextElementSibling$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$nextElementSibling(receiver);
+};
+J.get$nextNode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$nextNode(receiver);
+};
+J.get$object$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$object(receiver);
+};
+J.get$objectChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$objectChanged(receiver);
+};
+J.get$offset$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$offset(receiver);
+};
+J.get$on$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$on(receiver);
+};
+J.get$onMouseDown$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$onMouseDown(receiver);
+};
+J.get$onMouseMove$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$onMouseMove(receiver);
+};
+J.get$ownerDocument$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$ownerDocument(receiver);
+};
+J.get$pad$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pad(receiver);
+};
+J.get$padding$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$padding(receiver);
+};
+J.get$parent$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$parent(receiver);
+};
+J.get$parentNode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$parentNode(receiver);
+};
+J.get$path$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$path(receiver);
+};
+J.get$pause$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pause(receiver);
+};
+J.get$pauseEvent$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pauseEvent(receiver);
+};
+J.get$pos$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pos(receiver);
+};
+J.get$posChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$posChanged(receiver);
+};
+J.get$process$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$process(receiver);
+};
+J.get$profile$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$profile(receiver);
+};
+J.get$profileChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$profileChanged(receiver);
+};
+J.get$protocol$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$protocol(receiver);
+};
+J.get$qualified$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$qualified(receiver);
+};
+J.get$qualifiedName$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$qualifiedName(receiver);
+};
+J.get$reachable$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$reachable(receiver);
+};
+J.get$ref$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$ref(receiver);
+};
+J.get$refChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refChanged(receiver);
+};
+J.get$refresh$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refresh(receiver);
+};
+J.get$refreshCoverage$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refreshCoverage(receiver);
+};
+J.get$refreshGC$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refreshGC(receiver);
+};
+J.get$refreshTime$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refreshTime(receiver);
+};
+J.get$resetAccumulator$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$resetAccumulator(receiver);
+};
+J.get$response$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$response(receiver);
+};
+J.get$responseText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$responseText(receiver);
+};
+J.get$result$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$result(receiver);
+};
+J.get$results$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$results(receiver);
+};
+J.get$resume$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$resume(receiver);
+};
+J.get$retainedBytes$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$retainedBytes(receiver);
+};
+J.get$retainedSize$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$retainedSize(receiver);
+};
+J.get$retainingPath$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$retainingPath(receiver);
+};
+J.get$rowIndex$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$rowIndex(receiver);
+};
+J.get$rows$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$rows(receiver);
+};
+J.get$runtimeType$ = function(receiver) {
+  return J.getInterceptor(receiver).get$runtimeType(receiver);
+};
+J.get$sampleCount$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$sampleCount(receiver);
+};
+J.get$sampleDepth$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$sampleDepth(receiver);
+};
+J.get$sampleRate$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$sampleRate(receiver);
+};
+J.get$script$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$script(receiver);
+};
+J.get$scriptChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$scriptChanged(receiver);
+};
+J.get$selectExpr$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$selectExpr(receiver);
+};
+J.get$selectedIndex$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$selectedIndex(receiver);
+};
+J.get$small$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$small(receiver);
+};
+J.get$socket$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$socket(receiver);
+};
+J.get$startLine$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$startLine(receiver);
+};
+J.get$status$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$status(receiver);
+};
+J.get$styleForHits$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$styleForHits(receiver);
+};
+J.get$syntax$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$syntax(receiver);
+};
+J.get$tagSelector$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$tagSelector(receiver);
+};
+J.get$tagSelectorChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$tagSelectorChanged(receiver);
+};
+J.get$target$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$target(receiver);
+};
+J.get$templateInstance$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$templateInstance(receiver);
+};
+J.get$text$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$text(receiver);
+};
+J.get$timeSpan$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$timeSpan(receiver);
+};
+J.get$toggleExpand$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$toggleExpand(receiver);
+};
+J.get$toggleExpanded$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$toggleExpanded(receiver);
+};
+J.get$topLeft$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$topLeft(receiver);
+};
+J.get$trace$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$trace(receiver);
+};
+J.get$tree$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$tree(receiver);
+};
+J.get$uncheckedText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$uncheckedText(receiver);
+};
+J.get$updateLineMode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$updateLineMode(receiver);
+};
+J.get$url$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$url(receiver);
+};
+J.get$value$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$value(receiver);
+};
+J.get$values$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$values(receiver);
+};
+J.get$version$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$version(receiver);
+};
+J.get$vm$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$vm(receiver);
+};
+J.get$webSocket$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$webSocket(receiver);
+};
+J.get$width$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$width(receiver);
+};
+J.getAttribute$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).getAttribute$1(receiver, a0);
+};
+J.getBoundingClientRect$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).getBoundingClientRect$0(receiver);
+};
+J.importNode$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).importNode$2(receiver, a0, a1);
+};
+J.indexOf$1$asx = function(receiver, a0) {
+  return J.getInterceptor$asx(receiver).indexOf$1(receiver, a0);
+};
+J.indexOf$2$asx = function(receiver, a0, a1) {
+  return J.getInterceptor$asx(receiver).indexOf$2(receiver, a0, a1);
+};
+J.insert$2$ax = function(receiver, a0, a1) {
+  return J.getInterceptor$ax(receiver).insert$2(receiver, a0, a1);
+};
+J.insertAllBefore$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).insertAllBefore$2(receiver, a0, a1);
+};
+J.join$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).join$1(receiver, a0);
+};
+J.lastIndexOf$2$asx = function(receiver, a0, a1) {
+  return J.getInterceptor$asx(receiver).lastIndexOf$2(receiver, a0, a1);
+};
+J.load$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).load$0(receiver);
+};
+J.map$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).map$1(receiver, a0);
+};
+J.matches$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).matches$1(receiver, a0);
+};
+J.matchesWithAncestors$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).matchesWithAncestors$1(receiver, a0);
+};
+J.noSuchMethod$1 = function(receiver, a0) {
+  return J.getInterceptor(receiver).noSuchMethod$1(receiver, a0);
+};
+J.notifyPropertyChange$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).notifyPropertyChange$3(receiver, a0, a1, a2);
+};
+J.observe$3$attributeFilter$attributes$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).observe$3$attributeFilter$attributes(receiver, a0, a1, a2);
+};
+J.open$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).open$1(receiver, a0);
+};
+J.postMessage$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).postMessage$2(receiver, a0, a1);
+};
+J.preventDefault$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).preventDefault$0(receiver);
+};
+J.print$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).print$1(receiver, a0);
+};
+J.process$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).process$0(receiver);
+};
+J.putImageData$7$x = function(receiver, a0, a1, a2, a3, a4, a5, a6) {
+  return J.getInterceptor$x(receiver).putImageData$7(receiver, a0, a1, a2, a3, a4, a5, a6);
+};
+J.querySelector$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).querySelector$1(receiver, a0);
+};
+J.querySelectorAll$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).querySelectorAll$1(receiver, a0);
+};
+J.refreshCoverage$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).refreshCoverage$0(receiver);
+};
+J.reload$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).reload$0(receiver);
+};
+J.remove$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).remove$0(receiver);
+};
+J.remove$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).remove$1(receiver, a0);
+};
+J.removeEventListener$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).removeEventListener$3(receiver, a0, a1, a2);
+};
+J.removeRange$2$ax = function(receiver, a0, a1) {
+  return J.getInterceptor$ax(receiver).removeRange$2(receiver, a0, a1);
+};
+J.replaceAll$2$s = function(receiver, a0, a1) {
+  return J.getInterceptor$s(receiver).replaceAll$2(receiver, a0, a1);
+};
+J.replaceWith$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).replaceWith$1(receiver, a0);
+};
+J.round$0$n = function(receiver) {
+  return J.getInterceptor$n(receiver).round$0(receiver);
+};
+J.send$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).send$1(receiver, a0);
+};
+J.set$$function$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$$function(receiver, value);
+};
+J.set$_dartDetail$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$_dartDetail(receiver, value);
+};
+J.set$_selector$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$_selector(receiver, value);
+};
+J.set$active$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$active(receiver, value);
+};
+J.set$anchor$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$anchor(receiver, value);
+};
+J.set$bindingDelegate$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$bindingDelegate(receiver, value);
+};
+J.set$bindings$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$bindings(receiver, value);
+};
+J.set$busy$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$busy(receiver, value);
+};
+J.set$callback$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$callback(receiver, value);
+};
+J.set$checked$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$checked(receiver, value);
+};
+J.set$checkedText$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$checkedText(receiver, value);
+};
+J.set$className$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$className(receiver, value);
+};
+J.set$classTable$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$classTable(receiver, value);
+};
+J.set$cls$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$cls(receiver, value);
+};
+J.set$code$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$code(receiver, value);
+};
+J.set$connection$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$connection(receiver, value);
+};
+J.set$counters$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$counters(receiver, value);
+};
+J.set$devtools$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$devtools(receiver, value);
+};
+J.set$displayCutoff$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$displayCutoff(receiver, value);
+};
+J.set$endLine$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$endLine(receiver, value);
+};
+J.set$endPos$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$endPos(receiver, value);
+};
+J.set$error$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$error(receiver, value);
+};
+J.set$eval$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$eval(receiver, value);
+};
+J.set$exception$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$exception(receiver, value);
+};
+J.set$expand$ax = function(receiver, value) {
+  return J.getInterceptor$ax(receiver).set$expand(receiver, value);
+};
+J.set$expanded$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$expanded(receiver, value);
+};
+J.set$expr$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$expr(receiver, value);
+};
+J.set$field$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$field(receiver, value);
+};
+J.set$file$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$file(receiver, value);
+};
+J.set$flag$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$flag(receiver, value);
+};
+J.set$flagList$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$flagList(receiver, value);
+};
+J.set$fragmentation$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$fragmentation(receiver, value);
+};
+J.set$frame$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$frame(receiver, value);
+};
+J.set$hasClass$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hasClass(receiver, value);
+};
+J.set$hasParent$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hasParent(receiver, value);
+};
+J.set$hashLinkWorkaround$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hashLinkWorkaround(receiver, value);
+};
+J.set$height$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$height(receiver, value);
+};
+J.set$hideTagsChecked$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hideTagsChecked(receiver, value);
+};
+J.set$href$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$href(receiver, value);
+};
+J.set$httpServer$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$httpServer(receiver, value);
+};
+J.set$instance$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$instance(receiver, value);
+};
+J.set$instances$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$instances(receiver, value);
+};
+J.set$internal$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$internal(receiver, value);
+};
+J.set$io$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$io(receiver, value);
+};
+J.set$isDart$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$isDart(receiver, value);
+};
+J.set$isolate$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$isolate(receiver, value);
+};
+J.set$kind$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$kind(receiver, value);
+};
+J.set$label$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$label(receiver, value);
+};
+J.set$last$ax = function(receiver, value) {
+  return J.getInterceptor$ax(receiver).set$last(receiver, value);
+};
+J.set$lastAccumulatorReset$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lastAccumulatorReset(receiver, value);
+};
+J.set$lastServiceGC$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lastServiceGC(receiver, value);
+};
+J.set$length$asx = function(receiver, value) {
+  return J.getInterceptor$asx(receiver).set$length(receiver, value);
+};
+J.set$library$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$library(receiver, value);
+};
+J.set$lineMode$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lineMode(receiver, value);
+};
+J.set$lines$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lines(receiver, value);
+};
+J.set$link$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$link(receiver, value);
+};
+J.set$list$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$list(receiver, value);
+};
+J.set$map$ax = function(receiver, value) {
+  return J.getInterceptor$ax(receiver).set$map(receiver, value);
+};
+J.set$mapAsString$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$mapAsString(receiver, value);
+};
+J.set$msg$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$msg(receiver, value);
+};
+J.set$name$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$name(receiver, value);
+};
+J.set$object$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$object(receiver, value);
+};
+J.set$pad$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$pad(receiver, value);
+};
+J.set$path$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$path(receiver, value);
+};
+J.set$pause$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$pause(receiver, value);
+};
+J.set$pos$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$pos(receiver, value);
+};
+J.set$process$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$process(receiver, value);
+};
+J.set$profile$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$profile(receiver, value);
+};
+J.set$qualified$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$qualified(receiver, value);
+};
+J.set$qualifiedName$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$qualifiedName(receiver, value);
+};
+J.set$reachable$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$reachable(receiver, value);
+};
+J.set$ref$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$ref(receiver, value);
+};
+J.set$refresh$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refresh(receiver, value);
+};
+J.set$refreshCoverage$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refreshCoverage(receiver, value);
+};
+J.set$refreshGC$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refreshGC(receiver, value);
+};
+J.set$refreshTime$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refreshTime(receiver, value);
+};
+J.set$resetAccumulator$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$resetAccumulator(receiver, value);
+};
+J.set$result$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$result(receiver, value);
+};
+J.set$results$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$results(receiver, value);
+};
+J.set$resume$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$resume(receiver, value);
+};
+J.set$retainedBytes$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$retainedBytes(receiver, value);
+};
+J.set$retainedSize$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$retainedSize(receiver, value);
+};
+J.set$retainingPath$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$retainingPath(receiver, value);
+};
+J.set$sampleCount$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$sampleCount(receiver, value);
+};
+J.set$sampleDepth$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$sampleDepth(receiver, value);
+};
+J.set$sampleRate$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$sampleRate(receiver, value);
+};
+J.set$script$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$script(receiver, value);
+};
+J.set$selectedIndex$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$selectedIndex(receiver, value);
+};
+J.set$small$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$small(receiver, value);
+};
+J.set$socket$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$socket(receiver, value);
+};
+J.set$startLine$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$startLine(receiver, value);
+};
+J.set$status$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$status(receiver, value);
+};
+J.set$tagSelector$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$tagSelector(receiver, value);
+};
+J.set$text$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$text(receiver, value);
+};
+J.set$timeSpan$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$timeSpan(receiver, value);
+};
+J.set$trace$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$trace(receiver, value);
+};
+J.set$type$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$type(receiver, value);
+};
+J.set$uncheckedText$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$uncheckedText(receiver, value);
+};
+J.set$value$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$value(receiver, value);
+};
+J.set$vm$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$vm(receiver, value);
+};
+J.set$webSocket$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$webSocket(receiver, value);
+};
+J.set$width$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$width(receiver, value);
+};
+J.setRange$4$ax = function(receiver, a0, a1, a2, a3) {
+  return J.getInterceptor$ax(receiver).setRange$4(receiver, a0, a1, a2, a3);
+};
+J.skip$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).skip$1(receiver, a0);
+};
+J.sort$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).sort$0(receiver);
+};
+J.sort$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).sort$1(receiver, a0);
+};
+J.split$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).split$1(receiver, a0);
+};
+J.startsWith$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).startsWith$1(receiver, a0);
+};
+J.substring$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).substring$1(receiver, a0);
+};
+J.substring$2$s = function(receiver, a0, a1) {
+  return J.getInterceptor$s(receiver).substring$2(receiver, a0, a1);
+};
+J.toInt$0$n = function(receiver) {
+  return J.getInterceptor$n(receiver).toInt$0(receiver);
+};
+J.toList$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).toList$0(receiver);
+};
+J.toRadixString$1$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).toRadixString$1(receiver, a0);
+};
+J.toString$0 = function(receiver) {
+  return J.getInterceptor(receiver).toString$0(receiver);
+};
+J.toStringAsFixed$1$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).toStringAsFixed$1(receiver, a0);
+};
+J.trim$0$s = function(receiver) {
+  return J.getInterceptor$s(receiver).trim$0(receiver);
+};
+J.where$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).where$1(receiver, a0);
+};
+C.ActionLinkElement_methods = X.ActionLinkElement.prototype;
+C.AutoBindingElement_methods = Y.AutoBindingElement.prototype;
+C.BreakpointListElement_methods = B.BreakpointListElement.prototype;
+C.ClassNavMenuElement_methods = A.ClassNavMenuElement.prototype;
+C.ClassRefElement_methods = Q.ClassRefElement.prototype;
+C.ClassTreeElement_methods = O.ClassTreeElement.prototype;
+C.ClassViewElement_methods = Z.ClassViewElement.prototype;
+C.CodeRefElement_methods = O.CodeRefElement.prototype;
+C.CodeViewElement_methods = F.CodeViewElement.prototype;
+C.CurlyBlockElement_methods = R.CurlyBlockElement.prototype;
+C.ErrorViewElement_methods = F.ErrorViewElement.prototype;
+C.EvalBoxElement_methods = L.EvalBoxElement.prototype;
+C.EvalLinkElement_methods = R.EvalLinkElement.prototype;
+C.FieldRefElement_methods = D.FieldRefElement.prototype;
+C.FieldViewElement_methods = A.FieldViewElement.prototype;
+C.FlagItemElement_methods = X.FlagItemElement.prototype;
+C.FlagListElement_methods = X.FlagListElement.prototype;
+C.FunctionRefElement_methods = U.FunctionRefElement.prototype;
+C.FunctionViewElement_methods = N.FunctionViewElement.prototype;
+C.HeapMapElement_methods = O.HeapMapElement.prototype;
+C.HeapProfileElement_methods = K.HeapProfileElement.prototype;
+C.HttpRequest_methods = W.HttpRequest.prototype;
+C.IOHttpServerConnectionRefElement_methods = E.IOHttpServerConnectionRefElement.prototype;
+C.IOHttpServerConnectionViewElement_methods = E.IOHttpServerConnectionViewElement.prototype;
+C.IOHttpServerListViewElement_methods = E.IOHttpServerListViewElement.prototype;
+C.IOHttpServerRefElement_methods = E.IOHttpServerRefElement.prototype;
+C.IOHttpServerViewElement_methods = E.IOHttpServerViewElement.prototype;
+C.IOProcessListViewElement_methods = E.IOProcessListViewElement.prototype;
+C.IOProcessRefElement_methods = E.IOProcessRefElement.prototype;
+C.IOProcessViewElement_methods = E.IOProcessViewElement.prototype;
+C.IORandomAccessFileListViewElement_methods = E.IORandomAccessFileListViewElement.prototype;
+C.IORandomAccessFileRefElement_methods = E.IORandomAccessFileRefElement.prototype;
+C.IORandomAccessFileViewElement_methods = E.IORandomAccessFileViewElement.prototype;
+C.IORefElement_methods = E.IORefElement.prototype;
+C.IOSocketListViewElement_methods = E.IOSocketListViewElement.prototype;
+C.IOSocketRefElement_methods = E.IOSocketRefElement.prototype;
+C.IOSocketViewElement_methods = E.IOSocketViewElement.prototype;
+C.IOViewElement_methods = E.IOViewElement.prototype;
+C.IOWebSocketListViewElement_methods = E.IOWebSocketListViewElement.prototype;
+C.IOWebSocketRefElement_methods = E.IOWebSocketRefElement.prototype;
+C.IOWebSocketViewElement_methods = E.IOWebSocketViewElement.prototype;
+C.InstanceRefElement_methods = B.InstanceRefElement.prototype;
+C.InstanceViewElement_methods = Z.InstanceViewElement.prototype;
+C.IsolateCounterChartElement_methods = D.IsolateCounterChartElement.prototype;
+C.IsolateLocationElement_methods = D.IsolateLocationElement.prototype;
+C.IsolateNavMenuElement_methods = A.IsolateNavMenuElement.prototype;
+C.IsolateProfileElement_methods = X.IsolateProfileElement.prototype;
+C.IsolateRefElement_methods = N.IsolateRefElement.prototype;
+C.IsolateRunStateElement_methods = D.IsolateRunStateElement.prototype;
+C.IsolateSharedSummaryElement_methods = D.IsolateSharedSummaryElement.prototype;
+C.IsolateSummaryElement_methods = D.IsolateSummaryElement.prototype;
+C.IsolateViewElement_methods = L.IsolateViewElement.prototype;
+C.JSArray_methods = J.JSArray.prototype;
+C.JSDouble_methods = J.JSDouble.prototype;
+C.JSInt_methods = J.JSInt.prototype;
+C.JSNull_methods = J.JSNull.prototype;
+C.JSNumber_methods = J.JSNumber.prototype;
+C.JSString_methods = J.JSString.prototype;
+C.JsonViewElement_methods = Z.JsonViewElement.prototype;
+C.LibraryNavMenuElement_methods = A.LibraryNavMenuElement.prototype;
+C.LibraryRefElement_methods = R.LibraryRefElement.prototype;
+C.LibraryViewElement_methods = M.LibraryViewElement.prototype;
+C.NativeUint8ClampedList_methods = H.NativeUint8ClampedList.prototype;
+C.NavBarElement_methods = A.NavBarElement.prototype;
+C.NavControlElement_methods = A.NavControlElement.prototype;
+C.NavMenuElement_methods = A.NavMenuElement.prototype;
+C.NavMenuItemElement_methods = A.NavMenuItemElement.prototype;
+C.NavRefreshElement_methods = A.NavRefreshElement.prototype;
+C.NodeList_methods = W.NodeList.prototype;
+C.ObservatoryApplicationElement_methods = V.ObservatoryApplicationElement.prototype;
+C.ObservatoryElement_methods = Z.ObservatoryElement.prototype;
+C.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;
+C.PolymerElement_methods = A.PolymerElement.prototype;
+C.ScriptInsetElement_methods = T.ScriptInsetElement.prototype;
+C.ScriptRefElement_methods = A.ScriptRefElement.prototype;
+C.ScriptViewElement_methods = U.ScriptViewElement.prototype;
+C.ServiceErrorViewElement_methods = R.ServiceErrorViewElement.prototype;
+C.ServiceExceptionViewElement_methods = D.ServiceExceptionViewElement.prototype;
+C.ServiceObjectViewElement_methods = U.ServiceObjectViewElement.prototype;
+C.ServiceRefElement_methods = Q.ServiceRefElement.prototype;
+C.SlidingCheckboxElement_methods = Q.SlidingCheckboxElement.prototype;
+C.StackFrameElement_methods = K.StackFrameElement.prototype;
+C.StackTraceElement_methods = X.StackTraceElement.prototype;
+C.TopNavMenuElement_methods = A.TopNavMenuElement.prototype;
+C.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;
+C.VMRefElement_methods = X.VMRefElement.prototype;
+C.VMViewElement_methods = U.VMViewElement.prototype;
+C.Window_methods = W.Window.prototype;
+C.C_DynamicRuntimeType = new H.DynamicRuntimeType();
+C.C_EmptyExpression = new U.EmptyExpression();
+C.C_EmptyIterator = new H.EmptyIterator();
+C.C_OutOfMemoryError = new P.OutOfMemoryError();
+C.C_ScopeFactory = new T.ScopeFactory();
+C.C__DelayedDone = new P._DelayedDone();
+C.C__JSRandom = new P._JSRandom();
+C.C__ObserverSentinel = new L._ObserverSentinel();
+C.C__RootZone = new P._RootZone();
+C.C__RootZoneSpecification = new P._RootZoneSpecification();
+C.CodeKind_Collected = new D.CodeKind("Collected");
+C.CodeKind_Dart = new D.CodeKind("Dart");
+C.CodeKind_Native = new D.CodeKind("Native");
+C.CodeKind_Reused = new D.CodeKind("Reused");
+C.CodeKind_Tag = new D.CodeKind("Tag");
+C.DeclarationKind_0 = new A.DeclarationKind(0);
+C.DeclarationKind_1 = new A.DeclarationKind(1);
+C.DeclarationKind_2 = new A.DeclarationKind(2);
+C.Symbol_error = new H.Symbol0("error");
+C.Type_UOR = H.createRuntimeType('DartError');
+C.C_Reflectable = new K.Reflectable();
+C.PublishedProperty_false = new A.PublishedProperty(false);
+Isolate.makeConstantList = function(list) {
+  list.immutable$list = init;
+  list.fixed$length = init;
+  return list;
+};
+;
+C.List_bTJ = Isolate.makeConstantList([C.C_Reflectable, C.PublishedProperty_false]);
+C.Declaration_0 = new A.Declaration(C.Symbol_error, C.DeclarationKind_1, false, C.Type_UOR, false, C.List_bTJ);
+C.Symbol_last = new H.Symbol0("last");
+C.Type_EsU = H.createRuntimeType('bool');
+C.Declaration_06U = new A.Declaration(C.Symbol_last, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_fragmentation = new H.Symbol0("fragmentation");
+C.Type_bAc = H.createRuntimeType('ServiceMap');
+C.Declaration_0Y4 = new A.Declaration(C.Symbol_fragmentation, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_label = new H.Symbol0("label");
+C.Type_Ejg = H.createRuntimeType('String');
+C.Declaration_0g2 = new A.Declaration(C.Symbol_label, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_hasParent = new H.Symbol0("hasParent");
+C.C_ObservableProperty = new K.ObservableProperty();
+C.List_Reflectable_ObservableProperty = Isolate.makeConstantList([C.C_Reflectable, C.C_ObservableProperty]);
+C.Declaration_0qV = new A.Declaration(C.Symbol_hasParent, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_sampleDepth = new H.Symbol0("sampleDepth");
+C.Declaration_2AE = new A.Declaration(C.Symbol_sampleDepth, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_result = new H.Symbol0("result");
+C.Type_rPh = H.createRuntimeType('ServiceObject');
+C.Declaration_2No = new A.Declaration(C.Symbol_result, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Symbol_counters = new H.Symbol0("counters");
+C.Type_caQ = H.createRuntimeType('ObservableMap');
+C.Declaration_2Qn = new A.Declaration(C.Symbol_counters, C.DeclarationKind_1, false, C.Type_caQ, false, C.List_bTJ);
+C.Symbol_sampleRate = new H.Symbol0("sampleRate");
+C.Declaration_3VL = new A.Declaration(C.Symbol_sampleRate, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Type_Tby = H.createRuntimeType('ServiceError');
+C.Declaration_4eA = new A.Declaration(C.Symbol_error, C.DeclarationKind_1, false, C.Type_Tby, false, C.List_bTJ);
+C.Symbol_objectChanged = new H.Symbol0("objectChanged");
+C.Type_EjN = H.createRuntimeType('Function');
+C.List_empty = Isolate.makeConstantList([]);
+C.Declaration_4up = new A.Declaration(C.Symbol_objectChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_frame = new H.Symbol0("frame");
+C.Declaration_65l = new A.Declaration(C.Symbol_frame, C.DeclarationKind_1, false, C.Type_caQ, false, C.List_bTJ);
+C.Symbol_flag = new H.Symbol0("flag");
+C.Declaration_6YB = new A.Declaration(C.Symbol_flag, C.DeclarationKind_1, false, C.Type_caQ, false, C.List_bTJ);
+C.Symbol_library = new H.Symbol0("library");
+C.Type_azP = H.createRuntimeType('Library');
+C.Declaration_6ts = new A.Declaration(C.Symbol_library, C.DeclarationKind_1, false, C.Type_azP, false, C.List_bTJ);
+C.Symbol_status = new H.Symbol0("status");
+C.Declaration_8sn = new A.Declaration(C.Symbol_status, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_endPos = new H.Symbol0("endPos");
+C.Type_SnA = H.createRuntimeType('$int');
+C.Declaration_ACG = new A.Declaration(C.Symbol_endPos, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_bTJ);
+C.Symbol_code = new H.Symbol0("code");
+C.Type_Zyt = H.createRuntimeType('Code');
+C.List_ObservableProperty = Isolate.makeConstantList([C.C_ObservableProperty]);
+C.Declaration_AgZ = new A.Declaration(C.Symbol_code, C.DeclarationKind_1, true, C.Type_Zyt, false, C.List_ObservableProperty);
+C.Symbol_list = new H.Symbol0("list");
+C.Declaration_BKW = new A.Declaration(C.Symbol_list, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_httpServer = new H.Symbol0("httpServer");
+C.Declaration_BSX = new A.Declaration(C.Symbol_httpServer, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_retainedBytes = new H.Symbol0("retainedBytes");
+C.Declaration_CIB = new A.Declaration(C.Symbol_retainedBytes, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_displayCutoff = new H.Symbol0("displayCutoff");
+C.Declaration_CR6 = new A.Declaration(C.Symbol_displayCutoff, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_functionChanged = new H.Symbol0("functionChanged");
+C.Declaration_Chj = new A.Declaration(C.Symbol_functionChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_expandChanged = new H.Symbol0("expandChanged");
+C.Declaration_Dbk = new A.Declaration(C.Symbol_expandChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_tagSelectorChanged = new H.Symbol0("tagSelectorChanged");
+C.Declaration_ECn = new A.Declaration(C.Symbol_tagSelectorChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_profile = new H.Symbol0("profile");
+C.Declaration_EkK = new A.Declaration(C.Symbol_profile, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_pad = new H.Symbol0("pad");
+C.Declaration_EsU = new A.Declaration(C.Symbol_pad, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_object = new H.Symbol0("object");
+C.Declaration_HtW = new A.Declaration(C.Symbol_object, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Symbol_callback = new H.Symbol0("callback");
+C.Type_yvU = H.createRuntimeType('evalType');
+C.Declaration_IF7 = new A.Declaration(C.Symbol_callback, C.DeclarationKind_1, false, C.Type_yvU, false, C.List_bTJ);
+C.Symbol_uncheckedText = new H.Symbol0("uncheckedText");
+C.Declaration_IRg = new A.Declaration(C.Symbol_uncheckedText, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_socket = new H.Symbol0("socket");
+C.Type_Qs5 = H.createRuntimeType('Socket');
+C.Declaration_Iiu = new A.Declaration(C.Symbol_socket, C.DeclarationKind_1, false, C.Type_Qs5, false, C.List_bTJ);
+C.Symbol_file = new H.Symbol0("file");
+C.Declaration_Ix1 = new A.Declaration(C.Symbol_file, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_refChanged = new H.Symbol0("refChanged");
+C.Declaration_MJ5 = new A.Declaration(C.Symbol_refChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_tagSelector = new H.Symbol0("tagSelector");
+C.Declaration_Q0F = new A.Declaration(C.Symbol_tagSelector, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_endPosChanged = new H.Symbol0("endPosChanged");
+C.Declaration_QAa = new A.Declaration(C.Symbol_endPosChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_vm = new H.Symbol0("vm");
+C.Type_GP5 = H.createRuntimeType('VM');
+C.Declaration_Qi2 = new A.Declaration(C.Symbol_vm, C.DeclarationKind_1, false, C.Type_GP5, false, C.List_bTJ);
+C.Symbol_mapAsString = new H.Symbol0("mapAsString");
+C.Declaration_Qx4 = new A.Declaration(C.Symbol_mapAsString, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_expanded = new H.Symbol0("expanded");
+C.Declaration_RQo = new A.Declaration(C.Symbol_expanded, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_lines = new H.Symbol0("lines");
+C.Type_UWS = H.createRuntimeType('List');
+C.Declaration_WfA = new A.Declaration(C.Symbol_lines, C.DeclarationKind_1, false, C.Type_UWS, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_hasClass = new H.Symbol0("hasClass");
+C.Declaration_X8B = new A.Declaration(C.Symbol_hasClass, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_internal = new H.Symbol0("internal");
+C.Declaration_XBb = new A.Declaration(C.Symbol_internal, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_kind = new H.Symbol0("kind");
+C.Declaration_Xdi = new A.Declaration(C.Symbol_kind, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_endLine = new H.Symbol0("endLine");
+C.Declaration_ZcJ = new A.Declaration(C.Symbol_endLine, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_text = new H.Symbol0("text");
+C.Declaration_ZfX = new A.Declaration(C.Symbol_text, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_process = new H.Symbol0("process");
+C.Declaration_a13 = new A.Declaration(C.Symbol_process, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_hideTagsChecked = new H.Symbol0("hideTagsChecked");
+C.Declaration_a1A = new A.Declaration(C.Symbol_hideTagsChecked, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_sampleCount = new H.Symbol0("sampleCount");
+C.Declaration_ac8 = new A.Declaration(C.Symbol_sampleCount, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_isolate = new H.Symbol0("isolate");
+C.Type_B8J0 = H.createRuntimeType('Isolate');
+C.Declaration_agR = new A.Declaration(C.Symbol_isolate, C.DeclarationKind_1, false, C.Type_B8J0, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_io = new H.Symbol0("io");
+C.Declaration_bh9 = new A.Declaration(C.Symbol_io, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_devtools = new H.Symbol0("devtools");
+C.Declaration_c4R = new A.Declaration(C.Symbol_devtools, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_countersChanged = new H.Symbol0("countersChanged");
+C.Declaration_cJC = new A.Declaration(C.Symbol_countersChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_path = new H.Symbol0("path");
+C.Declaration_cMb = new A.Declaration(C.Symbol_path, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_checkedText = new H.Symbol0("checkedText");
+C.Declaration_cdS = new A.Declaration(C.Symbol_checkedText, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_timeSpan = new H.Symbol0("timeSpan");
+C.Declaration_dIf = new A.Declaration(C.Symbol_timeSpan, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_active = new H.Symbol0("active");
+C.Declaration_dw1 = new A.Declaration(C.Symbol_active, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_qualified = new H.Symbol0("qualified");
+C.Declaration_e24 = new A.Declaration(C.Symbol_qualified, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_isolateChanged = new H.Symbol0("isolateChanged");
+C.Declaration_e3c = new A.Declaration(C.Symbol_isolateChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_ref = new H.Symbol0("ref");
+C.Declaration_e3c0 = new A.Declaration(C.Symbol_ref, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Declaration_eea = new A.Declaration(C.Symbol_error, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Symbol_expr = new H.Symbol0("expr");
+C.Type_dynamic = H.createRuntimeType('dynamic');
+C.Declaration_gLQ = new A.Declaration(C.Symbol_expr, C.DeclarationKind_1, false, C.Type_dynamic, false, C.List_bTJ);
+C.Symbol_msg = new H.Symbol0("msg");
+C.Declaration_gc6 = new A.Declaration(C.Symbol_msg, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_results = new H.Symbol0("results");
+C.Type_pe4 = H.createRuntimeType('ObservableList');
+C.Declaration_ggw = new A.Declaration(C.Symbol_results, C.DeclarationKind_1, false, C.Type_pe4, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_classTable = new H.Symbol0("classTable");
+C.Type_Gx6 = H.createRuntimeType('ClassSortedTable');
+C.Declaration_gsm = new A.Declaration(C.Symbol_classTable, C.DeclarationKind_1, false, C.Type_Gx6, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_pos = new H.Symbol0("pos");
+C.Declaration_i3t = new A.Declaration(C.Symbol_pos, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_bTJ);
+C.Symbol_qualifiedName = new H.Symbol0("qualifiedName");
+C.Declaration_i3y = new A.Declaration(C.Symbol_qualifiedName, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_mapChanged = new H.Symbol0("mapChanged");
+C.Declaration_iLh = new A.Declaration(C.Symbol_mapChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_link = new H.Symbol0("link");
+C.Declaration_ibz = new A.Declaration(C.Symbol_link, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_refreshTime = new H.Symbol0("refreshTime");
+C.Declaration_ijl = new A.Declaration(C.Symbol_refreshTime, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_fragmentationChanged = new H.Symbol0("fragmentationChanged");
+C.Declaration_ivD = new A.Declaration(C.Symbol_fragmentationChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_scriptChanged = new H.Symbol0("scriptChanged");
+C.Declaration_ixB = new A.Declaration(C.Symbol_scriptChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_field = new H.Symbol0("field");
+C.Declaration_iyl = new A.Declaration(C.Symbol_field, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_busy = new H.Symbol0("busy");
+C.Declaration_izV = new A.Declaration(C.Symbol_busy, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_profileChanged = new H.Symbol0("profileChanged");
+C.Declaration_j3g = new A.Declaration(C.Symbol_profileChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_startLine = new H.Symbol0("startLine");
+C.Declaration_k6K = new A.Declaration(C.Symbol_startLine, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_lastServiceGC = new H.Symbol0("lastServiceGC");
+C.Declaration_mPk = new A.Declaration(C.Symbol_lastServiceGC, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_webSocket = new H.Symbol0("webSocket");
+C.Declaration_mT8 = new A.Declaration(C.Symbol_webSocket, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_instance = new H.Symbol0("instance");
+C.Declaration_o7L = new A.Declaration(C.Symbol_instance, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_isDart = new H.Symbol0("isDart");
+C.Declaration_o7e = new A.Declaration(C.Symbol_isDart, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_cls = new H.Symbol0("cls");
+C.Type_Tzp = H.createRuntimeType('Class');
+C.Declaration_okX = new A.Declaration(C.Symbol_cls, C.DeclarationKind_1, false, C.Type_Tzp, false, C.List_bTJ);
+C.Symbol_posChanged = new H.Symbol0("posChanged");
+C.Declaration_owq = new A.Declaration(C.Symbol_posChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_small = new H.Symbol0("small");
+C.Declaration_pPA = new A.Declaration(C.Symbol_small, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_instances = new H.Symbol0("instances");
+C.Declaration_qr9 = new A.Declaration(C.Symbol_instances, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_Reflectable_ObservableProperty);
+C.Declaration_qrv = new A.Declaration(C.Symbol_cls, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_checked = new H.Symbol0("checked");
+C.Declaration_siO = new A.Declaration(C.Symbol_checked, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_trace = new H.Symbol0("trace");
+C.Declaration_ssf = new A.Declaration(C.Symbol_trace, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_anchor = new H.Symbol0("anchor");
+C.Declaration_suy = new A.Declaration(C.Symbol_anchor, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_exception = new H.Symbol0("exception");
+C.Type_zzJ = H.createRuntimeType('ServiceException');
+C.Declaration_v0l = new A.Declaration(C.Symbol_exception, C.DeclarationKind_1, false, C.Type_zzJ, false, C.List_bTJ);
+C.Symbol_lastAccumulatorReset = new H.Symbol0("lastAccumulatorReset");
+C.Declaration_vA1 = new A.Declaration(C.Symbol_lastAccumulatorReset, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Declaration_voj = new A.Declaration(C.Symbol_isolate, C.DeclarationKind_1, false, C.Type_B8J0, false, C.List_bTJ);
+C.Symbol_flagList = new H.Symbol0("flagList");
+C.Declaration_wE9 = new A.Declaration(C.Symbol_flagList, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Declaration_woc = new A.Declaration(C.Symbol_code, C.DeclarationKind_1, false, C.Type_Zyt, false, C.List_bTJ);
+C.Symbol_lineMode = new H.Symbol0("lineMode");
+C.Declaration_ww8 = new A.Declaration(C.Symbol_lineMode, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_map = new H.Symbol0("map");
+C.Declaration_wzu = new A.Declaration(C.Symbol_map, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_function = new H.Symbol0("function");
+C.Declaration_y9n = new A.Declaration(C.Symbol_function, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_connection = new H.Symbol0("connection");
+C.Declaration_yDj = new A.Declaration(C.Symbol_connection, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Declaration_yXb = new A.Declaration(C.Symbol_callback, C.DeclarationKind_1, false, C.Type_dynamic, false, C.List_bTJ);
+C.Symbol_expand = new H.Symbol0("expand");
+C.Declaration_yXb0 = new A.Declaration(C.Symbol_expand, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_script = new H.Symbol0("script");
+C.Type_cgs = H.createRuntimeType('Script');
+C.Declaration_yx3 = new A.Declaration(C.Symbol_script, C.DeclarationKind_1, false, C.Type_cgs, false, C.List_bTJ);
+C.Duration_0 = new P.Duration(0);
+C.EventStreamProvider_change = H.setRuntimeTypeInfo(new W.EventStreamProvider("change"), [W.Event]);
+C.EventStreamProvider_click = H.setRuntimeTypeInfo(new W.EventStreamProvider("click"), [W.MouseEvent]);
+C.EventStreamProvider_error = H.setRuntimeTypeInfo(new W.EventStreamProvider("error"), [W.ProgressEvent]);
+C.EventStreamProvider_input = H.setRuntimeTypeInfo(new W.EventStreamProvider("input"), [W.Event]);
+C.EventStreamProvider_load = H.setRuntimeTypeInfo(new W.EventStreamProvider("load"), [W.ProgressEvent]);
+C.EventStreamProvider_message = H.setRuntimeTypeInfo(new W.EventStreamProvider("message"), [W.MessageEvent]);
+C.EventStreamProvider_mousedown = H.setRuntimeTypeInfo(new W.EventStreamProvider("mousedown"), [W.MouseEvent]);
+C.EventStreamProvider_mousemove = H.setRuntimeTypeInfo(new W.EventStreamProvider("mousemove"), [W.MouseEvent]);
+C.EventStreamProvider_popstate = H.setRuntimeTypeInfo(new W.EventStreamProvider("popstate"), [W.PopStateEvent]);
+C.JS_CONST_0 = function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
-}
-C.lR=function(hooks) {
+};
+C.JS_CONST_4hp = function(hooks) {
   var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
   if (userAgent.indexOf("Firefox") == -1) return hooks;
   var getTag = hooks.getTag;
@@ -19330,8 +35830,8 @@
     return quickMap[tag] || tag;
   }
   hooks.getTag = getTagFirefox;
-}
-C.w2=function getTagFallback(o) {
+};
+C.JS_CONST_8ZY = function getTagFallback(o) {
   var constructor = o.constructor;
   if (typeof constructor == "function") {
     var name = constructor.name;
@@ -19344,10 +35844,10 @@
   }
   var s = Object.prototype.toString.call(o);
   return s.substring(8, s.length - 1);
-}
-C.XQ=function(hooks) { return hooks; }
-
-C.ku=function(getTagFallback) {
+};
+C.JS_CONST_Fs4 = function(hooks) { return hooks; }
+;
+C.JS_CONST_QJm = function(getTagFallback) {
   return function(hooks) {
     if (typeof navigator != "object") return hooks;
     var ua = navigator.userAgent;
@@ -19360,8 +35860,8 @@
     }
     hooks.getTag = getTagFallback;
   };
-}
-C.MA=function() {
+};
+C.JS_CONST_aQP = function() {
   function typeNameInChrome(o) {
     var name = o.constructor.name;
     if (name) return name;
@@ -19393,8 +35893,8 @@
     getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
     prototypeForTag: prototypeForTag,
     discriminator: discriminator };
-}
-C.M1=function(hooks) {
+};
+C.JS_CONST_gkc = function(hooks) {
   var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
   if (userAgent.indexOf("Trident/") == -1) return hooks;
   var getTag = hooks.getTag;
@@ -19422,8 +35922,8 @@
   }
   hooks.getTag = getTagIE;
   hooks.prototypeForTag = prototypeForTagIE;
-}
-C.hQ=function(hooks) {
+};
+C.JS_CONST_rr7 = function(hooks) {
   var getTag = hooks.getTag;
   var prototypeForTag = hooks.prototypeForTag;
   function getTagFixed(o) {
@@ -19440,593 +35940,1171 @@
   }
   hooks.getTag = getTagFixed;
   hooks.prototypeForTag = prototypeForTagFixed;
-}
-C.xr=new P.pE(null,null)
-C.A3=new P.c5(null)
-C.Sr=new P.ojF(null,null)
-C.D8=new N.qV("FINER",400)
-C.eI=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.NG=I.uL([1,6])
-C.rs=I.uL([0,0,26624,1023,0,0,65534,2047])
-C.SV=new H.IN("keys")
-C.Uq=new H.IN("values")
-C.Wn=new H.IN("length")
-C.ai=new H.IN("isEmpty")
-C.nZ=new H.IN("isNotEmpty")
-C.Zw=I.uL([C.SV,C.Uq,C.Wn,C.ai,C.nZ])
-C.fW=H.VM(I.uL(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
-C.NL=I.uL([0,0,26624,1023,65534,2047,65534,2047])
-C.yD=I.uL([0,0,26498,1023,65534,34815,65534,18431])
-C.N4=H.Kx('nd')
-C.Cd=I.uL([C.N4])
-C.G8=I.uL(["==","!=","<=",">=","||","&&"])
-C.oP=I.uL(["as","in","this"])
-C.QC=I.uL(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
-C.bg=I.uL([43,45,42,47,33,38,37,60,61,62,63,94,124])
-C.B2=I.uL([0,0,24576,1023,65534,34815,65534,18431])
-C.aa=I.uL([0,0,32754,11263,65534,34815,65534,18431])
-C.ZJ=I.uL([0,0,32722,12287,65535,34815,65534,18431])
-C.iq=I.uL([40,41,91,93,123,125])
-C.zao=I.uL(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-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.Vgv=I.uL(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.fE=new H.Px(14,{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.Vgv)
-C.rW=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
-C.n7=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rW)
-C.Y1=I.uL(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.lx=new H.Px(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.Y1)
-C.CM=new H.Px(0,{},C.dn)
-C.MEG=I.uL(["enumerate"])
-C.va=new H.Px(1,{enumerate:K.y8()},C.MEG)
-C.tq=H.Kx('Bo')
-C.MS=H.Kx('wA')
-C.wE=I.uL([C.MS])
-C.Xk=new A.Wq(!1,!1,!0,C.tq,!1,!0,C.wE,null)
-C.uDk=H.Kx('hG')
-C.tmF=I.uL([C.uDk])
-C.aj=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.tmF,null)
-C.wj=new D.l8R("Internal")
-C.Cn=new D.l8R("Listening")
-C.fO=new D.l8R("Normal")
-C.FJ=new D.l8R("Pipe")
-C.IH=new H.IN("address")
-C.ke=new H.IN("architecture")
-C.ET=new H.IN("assertsEnabled")
-C.WC=new H.IN("bpt")
-C.Ro=new H.IN("buttonClick")
-C.hN=new H.IN("bytes")
-C.Ka=new H.IN("call")
-C.bV=new H.IN("capacity")
-C.C0=new H.IN("change")
-C.eZ=new H.IN("changeSort")
-C.OI=new H.IN("classes")
-C.To=new H.IN("closing")
-C.J6=new H.IN("collections")
-C.qt=new H.IN("coloring")
-C.p1=new H.IN("columns")
-C.Je=new H.IN("current")
-C.iE=new H.IN("descriptor")
-C.f4=new H.IN("descriptors")
-C.aK=new H.IN("doAction")
-C.GP=new H.IN("element")
-C.tP=new H.IN("entry")
-C.Zb=new H.IN("eval")
-C.u7=new H.IN("evalNow")
-C.Ek=new H.IN("expander")
-C.Pn=new H.IN("expanderStyle")
-C.h7=new H.IN("external")
-C.R3=new H.IN("fd")
-C.fV=new H.IN("fields")
-C.Gd=new H.IN("firstTokenPos")
-C.FP=new H.IN("formatSize")
-C.kF=new H.IN("formatTime")
-C.UD=new H.IN("formattedAddress")
-C.Aq=new H.IN("formattedAverage")
-C.DS=new H.IN("formattedCollections")
-C.C9=new H.IN("formattedDeoptId")
-C.VF=new H.IN("formattedExclusive")
-C.uU=new H.IN("formattedExclusiveTicks")
-C.YJ=new H.IN("formattedInclusive")
-C.eF=new H.IN("formattedInclusiveTicks")
-C.oI=new H.IN("formattedLine")
-C.ST=new H.IN("formattedTotalCollectionTime")
-C.EI=new H.IN("functions")
-C.JB=new H.IN("getColumnLabel")
-C.d4=new H.IN("goto")
-C.cF=new H.IN("gotoLink")
-C.SI=new H.IN("hasDescriptors")
-C.zS=new H.IN("hasDisassembly")
-C.YA=new H.IN("hasNoAllocations")
-C.Ge=new H.IN("hashLinkWorkaround")
-C.Ss=new H.IN("hits")
-C.k6=new H.IN("hoverText")
-C.PJ=new H.IN("human")
-C.q2=new H.IN("idle")
-C.d2=new H.IN("imp")
-C.kN=new H.IN("imports")
-C.yB=new H.IN("instances")
-C.eJ=new H.IN("instruction")
-C.iG=new H.IN("instructions")
-C.Py=new H.IN("interface")
-C.pC=new H.IN("interfaces")
-C.Bs=new H.IN("ioEnabled")
-C.XH=new H.IN("isAbstract")
-C.I9=new H.IN("isBool")
-C.C1=new H.IN("isComment")
-C.bD=new H.IN("isConst")
-C.Yg=new H.IN("isDartCode")
-C.bR=new H.IN("isDouble")
-C.ob=new H.IN("isError")
-C.WV=new H.IN("isFinalized")
-C.Ih=new H.IN("isImplemented")
-C.Iv=new H.IN("isInstance")
-C.Wg=new H.IN("isInt")
-C.tD=new H.IN("isList")
-C.Of=new H.IN("isNull")
-C.pY=new H.IN("isOptimized")
-C.XL=new H.IN("isPatch")
-C.LA=new H.IN("isPipe")
-C.Lk=new H.IN("isString")
-C.dK=new H.IN("isType")
-C.xf=new H.IN("isUnexpected")
-C.Jx=new H.IN("isolates")
-C.b5=new H.IN("jumpTarget")
-C.kA=new H.IN("lastTokenPos")
-C.GI=new H.IN("lastUpdate")
-C.ur=new H.IN("lib")
-C.VN=new H.IN("libraries")
-C.VI=new H.IN("line")
-C.r6=new H.IN("lineNumber")
-C.MW=new H.IN("lineNumbers")
-C.cc=new H.IN("listening")
-C.DY=new H.IN("loading")
-C.Lx=new H.IN("localAddress")
-C.M3=new H.IN("localPort")
-C.wT=new H.IN("mainPort")
-C.pX=new H.IN("message")
-C.VD=new H.IN("mouseOut")
-C.NN=new H.IN("mouseOver")
-C.YS=new H.IN("name")
-C.pu=new H.IN("nameIsEmpty")
-C.BJ=new H.IN("newSpace")
-C.OV=new H.IN("noSuchMethod")
-C.as=new H.IN("objectClass")
-C.zO=new H.IN("objectPool")
-C.vg=new H.IN("oldSpace")
-C.zm=new H.IN("padding")
-C.Ic=new H.IN("pause")
-C.yG=new H.IN("pauseEvent")
-C.uI=new H.IN("pid")
-C.AY=new H.IN("protocol")
-C.I7=new H.IN("readClosed")
-C.GR=new H.IN("refresh")
-C.KX=new H.IN("refreshCoverage")
-C.ja=new H.IN("refreshGC")
-C.MT=new H.IN("registerCallback")
-C.ir=new H.IN("relativeLink")
-C.dx=new H.IN("remoteAddress")
-C.ni=new H.IN("remotePort")
-C.X2=new H.IN("resetAccumulator")
-C.F3=new H.IN("response")
-C.nY=new H.IN("resume")
-C.HD=new H.IN("retainedSize")
-C.iU=new H.IN("retainingPath")
-C.eN=new H.IN("rootLib")
-C.ue=new H.IN("row")
-C.nh=new H.IN("rows")
-C.L2=new H.IN("running")
-C.EA=new H.IN("scripts")
-C.oW=new H.IN("selectExpr")
-C.hd=new H.IN("serviceType")
-C.jM=new H.IN("socketOwner")
-C.Pf=new H.IN("stacktrace")
-C.xA=new H.IN("styleForHits")
-C.k5=new H.IN("subClasses")
-C.Nv=new H.IN("subclass")
-C.Cw=new H.IN("superClass")
-C.hO=new H.IN("tipExclusive")
-C.ei=new H.IN("tipKind")
-C.HK=new H.IN("tipParent")
-C.je=new H.IN("tipTicks")
-C.Ef=new H.IN("tipTime")
-C.Q1=new H.IN("toggleExpand")
-C.ID=new H.IN("toggleExpanded")
-C.z6=new H.IN("tokenPos")
-C.bc=new H.IN("topFrame")
-C.Jl=new H.IN("totalCollectionTimeInSeconds")
-C.Kj=new H.IN("totalSamplesInProfile")
-C.ep=new H.IN("tree")
-C.J2=new H.IN("typeChecksEnabled")
-C.bn=new H.IN("updateLineMode")
-C.mh=new H.IN("uptime")
-C.Fh=new H.IN("url")
-C.LP=new H.IN("used")
-C.jh=new H.IN("v")
-C.Ha=new H.IN("value")
-C.fj=new H.IN("variable")
-C.xw=new H.IN("variables")
-C.zn=new H.IN("version")
-C.Tc=new H.IN("vmName")
-C.Uy=new H.IN("writeClosed")
-C.MI=H.Kx('hx')
-C.hP=H.Kx('uz')
-C.Mf=H.Kx('G1')
-C.q0S=H.Kx('Dg')
-C.Dl=H.Kx('F1')
-C.Jf=H.Kx('Mb')
-C.UJ=H.Kx('oa')
-C.E0=H.Kx('aI')
-C.Y3=H.Kx('CY')
-C.lU=H.Kx('Hl')
-C.kq=H.Kx('Nn')
-C.j4=H.Kx('IW')
-C.dP=H.Kx('vm')
-C.Vx=H.Kx('MJ')
-C.Vh=H.Kx('Pz')
-C.HC=H.Kx('F0')
-C.rR=H.Kx('wN')
-C.yS=H.Kx('G6')
-C.Sb=H.Kx('kn')
-C.FQ=H.Kx('a')
-C.Yc=H.Kx('iP')
-C.EZ=H.Kx('oF')
-C.vw=H.Kx('UK')
-C.Jo=H.Kx('i7')
-C.BL=H.Kx('Nr')
-C.ON=H.Kx('ov')
-C.jR=H.Kx('Be')
-C.al=H.Kx('es')
-C.PT=H.Kx('CX')
-C.iD=H.Kx('Vb')
-C.ce=H.Kx('kK')
-C.dD=H.Kx('av')
-C.FA=H.Kx('Ya')
-C.Th=H.Kx('fI')
-C.tU=H.Kx('L4')
-C.yT=H.Kx('FK')
-C.cK=H.Kx('I5')
-C.jA=H.Kx('Eg')
-C.K4=H.Kx('hV')
-C.Mt=H.Kx('hu')
-C.la=H.Kx('ZX')
-C.CR=H.Kx('CP')
-C.xE=H.Kx('aC')
-C.vu=H.Kx('uw')
-C.ca=H.Kx('Z4')
-C.pJ=H.Kx('Q6')
-C.Yy=H.Kx('uE')
-C.M5=H.Kx('yc')
-C.Yxm=H.Kx('Pg')
-C.il=H.Kx('xI')
-C.lk=H.Kx('mJ')
-C.lp=H.Kx('LU')
-C.oG=H.Kx('ds')
-C.EG=H.Kx('Oz')
-C.nw=H.Kx('eo')
-C.OG=H.Kx('eW')
-C.km=H.Kx('fl')
-C.jV=H.Kx('rF')
-C.Tq=H.Kx('vj')
-C.JW=H.Kx('Ww')
-C.xeh=H.Kx('ve')
-C.CT=H.Kx('St')
-C.wH=H.Kx('zM')
-C.l4=H.Kx('uL')
-C.LT=H.Kx('md')
-C.Wh=H.Kx('H8')
-C.Zj=H.Kx('U1')
-C.FG=H.Kx('qh')
-C.Fe=H.Kx('zt')
-C.NR=H.Kx('nm')
-C.DD=H.Kx('Zn')
-C.qF=H.Kx('mO')
-C.Ey=H.Kx('wM')
-C.pF=H.Kx('WS')
-C.nX=H.Kx('DE')
-C.jw=H.Kx('xc')
-C.NW=H.Kx('ye')
-C.ig=H.Kx('we')
-C.Xv=H.Kx('n5')
-C.XI=H.Kx('cn')
-C.KO=H.Kx('ZP')
-C.Jm=H.Kx('q6')
-C.Wz=H.Kx('pR')
-C.Ep=H.Kx('ou')
-C.tc=H.Kx('Ma')
-C.Io=H.Kx('Qh')
-C.wk=H.Kx('nJ')
-C.te=H.Kx('BS')
-C.ms=H.Kx('Bm')
-C.qJ=H.Kx('pG')
-C.pK=H.Kx('Rk')
-C.lE=H.Kx('DK')
-C.Az=H.Kx('Gk')
-C.GX=H.Kx('c8')
-C.X8=H.Kx('Ti')
-C.Lg=H.Kx('JI')
-C.Ju=H.Kx('Ly')
-C.mq=H.Kx('qk')
-C.XWY=H.Kx('uEY')
-C.oT=H.Kx('VY')
-C.jK=H.Kx('el')
-C.xM=new P.u5F(!1)
-$.libraries_to_load = {}
-$.Vz=1
-$.z7="$cachedFunction"
-$.eb="$cachedInvocation"
-$.OK=0
-$.bf=null
-$.P4=null
-$.Ot=!1
-$.NF=null
-$.TX=null
-$.x7=null
-$.q4=null
-$.vv=null
-$.Bv=null
-$.W5=null
-$.BY=null
-$.oK=null
-$.S6=null
-$.k8=null
-$.X3=C.NU
-$.Km=0
-$.Qz=null
-$.R6=null
-$.RL=!1
-$.Y4=C.IF
-$.xO=0
-$.ax=0
-$.Oo=null
-$.Td=!1
-$.ps=0
-$.xG=null
-$.ok=!1
-$.AC=!1
-$.M6=null
-$.UG=!0
-$.RQ="objects/"
-$.vU=null
-$.xV=null
-$.rK=!1
-$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.z1},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.D2},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.BL,X.Nr,{created:X.Ak},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.Dc},C.iD,O.Vb,{created:O.dF},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.Ci},C.FA,A.Ya,{created:A.vn},C.Th,U.fI,{created:U.dI},C.tU,E.L4,{created:E.MB},C.cK,X.I5,{created:X.pn},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.lW},C.vu,X.uw,{created:X.HI},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.P3},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.fd},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pI},C.EG,D.Oz,{created:D.RP},C.nw,O.eo,{created:O.l0},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.xeh,W.ve,{},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.Sc},C.NR,K.nm,{created:K.an},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.nX,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.Fv},C.ig,H.we,{"":H.ic},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Zg},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.tX},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.nz},C.ms,A.Bm,{created:A.AJm},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.nv},C.X8,U.Ti,{created:U.HP},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.US},C.mq,L.qk,{created:L.Qtp},C.XWY,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","vQ","Vr",function(){return $.jk().window})
-I.$lazy($,"globalWorker","u9","rm",function(){return $.jk().Worker})
-I.$lazy($,"globalPostMessageDefined","Wdn","ey",function(){return $.jk().postMessage!==void 0})
-I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.qo(null),[P.KN])})
-I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
-I.$lazy($,"notClosurePattern","k1","Up",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
-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","qi","rx",function(){return H.cM(H.S7(void 0))})
-I.$lazy($,"undefinedLiteralCallPattern","cz","kQ",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))})
-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","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.xg()})
-I.$lazy($,"_nullFuture","bq","mk",function(){return P.Ab(null,null)})
-I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
-I.$lazy($,"webkitEvents","fD","Vp",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","Si",function(){return P.ND(function(){return this}())})
-I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
-I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
-I.$lazy($,"_dartProxyCtor","fK","iW",function(){return function DartObject(a){this.o=a}})
-I.$lazy($,"_freeColor","nK","Rl",function(){return[255,255,255,255]})
-I.$lazy($,"_pageSeparationColor","Os","Qg",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.Rw)})
-I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","qr","V6",function(){return new L.vH([])})
-I.$lazy($,"_pathRegExp","tC","uC",function(){return new L.YJG().$0()})
-I.$lazy($,"_logger","y7Y","YV",function(){return N.QM("observe.PathObserver")})
-I.$lazy($,"_pathCache","un","aB",function(){return P.L5(null,null,null,P.qU,L.Tv)})
-I.$lazy($,"_polymerSyntax","Kb","Rs",function(){return new A.Li(T.GF(null,C.qY),null)})
-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)})
-I.$lazy($,"_hasShadowDomPolyfill","jQ","op",function(){return $.Si().Eg("ShadowDOMPolyfill")})
-I.$lazy($,"_ShadowCss","qP","AM",function(){var z=$.Kc()
-return z!=null?J.UQ(z,"ShadowCSS"):null})
-I.$lazy($,"_sheetLog","dz","Es",function(){return N.QM("polymer.stylesheet")})
-I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
-I.$lazy($,"_ATTRIBUTES_REGEX","mD","aQ",function(){return new H.VR("\\s|,",H.ol("\\s|,",!1,!0,!1),null,null)})
-I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Si(),"Platform")})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.ol("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_onReady","R9","iF",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_observeLog","i8","p2",function(){return N.QM("polymer.observe")})
-I.$lazy($,"_eventsLog","fo","eS",function(){return N.QM("polymer.events")})
-I.$lazy($,"_unbindLog","Ne","UW",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","xz","QX5",function(){return N.QM("polymer.bind")})
-I.$lazy($,"_PolymerGestures","NB","dg",function(){return J.UQ($.Si(),"PolymerGestures")})
-I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
-I.$lazy($,"_typeHandlers","lq","QL",function(){return P.EF([C.Db,new Z.lP(),C.GX,new Z.Uf(),C.Yc,new Z.Ra(),C.HL,new Z.wJY(),C.yw,new Z.zOQ(),C.CR,new Z.W6o()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","Af","Rab",function(){return P.EF(["+",new K.w10(),"-",new K.w11(),"*",new K.w12(),"/",new K.w13(),"%",new K.w14(),"==",new K.w15(),"!=",new K.w16(),"===",new K.w17(),"!==",new K.w18(),">",new K.w19(),">=",new K.w20(),"<",new K.w21(),"<=",new K.w22(),"||",new K.w23(),"&&",new K.w24(),"|",new K.w25()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","qM","qL",function(){return P.EF(["+",new K.Raa(),"-",new K.w0(),"!",new K.w5()],null,null)})
-I.$lazy($,"_instance","jC","Pk",function(){return new K.me()})
-I.$lazy($,"_currentIsolateMatcher","mb","vo",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($,"_DEFAULT","ac","HT",function(){return new M.vE(null)})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.Ufa().$0()})
-I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_ownerStagingDocument","EW","Lu",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","Ze",function(){return"template, "+J.kl(C.z5.gvc(),new M.MdQ()).zV(0,", ")})
-I.$lazy($,"_templateObserver","kY","pT",function(){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.Fs(new M.DOe()),2))})
-I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.lPa().$0()})
-I.$lazy($,"_instanceExtension","AH","It",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_isStagingDocument","Fg","AA",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.qo("template_binding"),[null])})
+};
+C.JsonCodec_null_null = new P.JsonCodec(null, null);
+C.JsonDecoder_null = new P.JsonDecoder(null);
+C.JsonEncoder_null_null = new P.JsonEncoder(null, null);
+C.Level_FINER_400 = new N.Level("FINER", 400);
+C.Level_FINE_500 = new N.Level("FINE", 500);
+C.Level_INFO_800 = new N.Level("INFO", 800);
+C.Level_SEVERE_1000 = new N.Level("SEVERE", 1000);
+C.Level_WARNING_900 = new N.Level("WARNING", 900);
+C.List_1_6 = Isolate.makeConstantList([1, 6]);
+C.List_6Pr = Isolate.makeConstantList([0, 0, 26624, 1023, 0, 0, 65534, 2047]);
+C.Symbol_keys = new H.Symbol0("keys");
+C.Symbol_values = new H.Symbol0("values");
+C.Symbol_length = new H.Symbol0("length");
+C.Symbol_isEmpty = new H.Symbol0("isEmpty");
+C.Symbol_isNotEmpty = new H.Symbol0("isNotEmpty");
+C.List_8QI = Isolate.makeConstantList([C.Symbol_keys, C.Symbol_values, C.Symbol_length, C.Symbol_isEmpty, C.Symbol_isNotEmpty]);
+C.List_EuK = H.setRuntimeTypeInfo(Isolate.makeConstantList(["+", "-", "*", "/", "%", "^", "==", "!=", ">", "<", ">=", "<=", "||", "&&", "&", "===", "!==", "|"]), [P.String]);
+C.Type_6WV = H.createRuntimeType('ObservableProperty');
+C.List_GGa = Isolate.makeConstantList([C.Type_6WV]);
+C.List_JYB = Isolate.makeConstantList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047]);
+C.List_KIf = Isolate.makeConstantList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431]);
+C.List_Ynd = Isolate.makeConstantList(["==", "!=", "<=", ">=", "||", "&&"]);
+C.List_as_in_this = Isolate.makeConstantList(["as", "in", "this"]);
+C.List_mBx = Isolate.makeConstantList(["rowColor0", "rowColor1", "rowColor2", "rowColor3", "rowColor4", "rowColor5", "rowColor6", "rowColor7", "rowColor8"]);
+C.List_mC8 = Isolate.makeConstantList([43, 45, 42, 47, 33, 38, 37, 60, 61, 62, 63, 94, 124]);
+C.List_nxB = Isolate.makeConstantList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431]);
+C.List_qNA = Isolate.makeConstantList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431]);
+C.List_qg4 = Isolate.makeConstantList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431]);
+C.List_ww8 = Isolate.makeConstantList([40, 41, 91, 93, 123, 125]);
+C.List_05B = Isolate.makeConstantList(["caption", "col", "colgroup", "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", "tr"]);
+C.Map_05eTF = new H.ConstantStringMap(11, {caption: null, col: null, colgroup: null, option: null, optgroup: null, tbody: null, td: null, tfoot: null, th: null, thead: null, tr: null}, C.List_05B);
+C.List_AmO = Isolate.makeConstantList(["domfocusout", "domfocusin", "dommousescroll", "animationend", "animationiteration", "animationstart", "doubleclick", "fullscreenchange", "fullscreenerror", "keyadded", "keyerror", "keymessage", "needkey", "speechchange"]);
+C.Map_AmMJ5 = new H.ConstantStringMap(14, {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.List_AmO);
+C.List_EJ5 = Isolate.makeConstantList(["name", "extends", "constructor", "noscript", "assetpath", "cache-csstext", "attributes"]);
+C.Map_EJn7R = new H.ConstantStringMap(7, {name: 1, extends: 1, constructor: 1, noscript: 1, assetpath: 1, "cache-csstext": 1, attributes: 1}, C.List_EJ5);
+C.List_L0C = Isolate.makeConstantList(["!", ":", ",", ")", "]", "}", "?", "||", "&&", "|", "^", "&", "!=", "==", "!==", "===", ">=", ">", "<=", "<", "+", "-", "%", "/", "*", "(", "[", ".", "{"]);
+C.Map_L0K61 = new H.ConstantStringMap(29, {"!": 0, ":": 0, ",": 0, ")": 0, "]": 0, "}": 0, "?": 1, "||": 2, "&&": 3, "|": 4, "^": 5, "&": 6, "!=": 7, "==": 7, "!==": 7, "===": 7, ">=": 8, ">": 8, "<=": 8, "<": 8, "+": 9, "-": 9, "%": 10, "/": 10, "*": 10, "(": 11, "[": 11, ".": 11, "{": 11}, C.List_L0C);
+C.Map_empty = new H.ConstantStringMap(0, {}, C.List_empty);
+C.List_enumerate = Isolate.makeConstantList(["enumerate"]);
+C.Map_wgEsG = new H.ConstantStringMap(1, {enumerate: K.enumerate$closure()}, C.List_enumerate);
+C.Type_fPs = H.createRuntimeType('HtmlElement');
+C.Type_oGx = H.createRuntimeType('PublishedProperty');
+C.List_JQl = Isolate.makeConstantList([C.Type_oGx]);
+C.QueryOptions_sAl = new A.QueryOptions(true, true, true, C.Type_fPs, false, false, C.List_JQl, null);
+C.Type_oqK = H.createRuntimeType('ObserveProperty');
+C.List_M2f = Isolate.makeConstantList([C.Type_oqK]);
+C.QueryOptions_xw8 = new A.QueryOptions(false, false, true, C.Type_fPs, false, true, C.List_M2f, null);
+C.SocketKind_Internal = new D.SocketKind("Internal");
+C.SocketKind_Listening = new D.SocketKind("Listening");
+C.SocketKind_Normal = new D.SocketKind("Normal");
+C.SocketKind_Pipe = new D.SocketKind("Pipe");
+C.Symbol_address = new H.Symbol0("address");
+C.Symbol_architecture = new H.Symbol0("architecture");
+C.Symbol_assertsEnabled = new H.Symbol0("assertsEnabled");
+C.Symbol_bpt = new H.Symbol0("bpt");
+C.Symbol_buttonClick = new H.Symbol0("buttonClick");
+C.Symbol_bytes = new H.Symbol0("bytes");
+C.Symbol_call = new H.Symbol0("call");
+C.Symbol_capacity = new H.Symbol0("capacity");
+C.Symbol_change = new H.Symbol0("change");
+C.Symbol_changeSort = new H.Symbol0("changeSort");
+C.Symbol_classes = new H.Symbol0("classes");
+C.Symbol_closing = new H.Symbol0("closing");
+C.Symbol_collections = new H.Symbol0("collections");
+C.Symbol_coloring = new H.Symbol0("coloring");
+C.Symbol_columns = new H.Symbol0("columns");
+C.Symbol_current = new H.Symbol0("current");
+C.Symbol_descriptor = new H.Symbol0("descriptor");
+C.Symbol_descriptors = new H.Symbol0("descriptors");
+C.Symbol_doAction = new H.Symbol0("doAction");
+C.Symbol_element = new H.Symbol0("element");
+C.Symbol_entry = new H.Symbol0("entry");
+C.Symbol_eval = new H.Symbol0("eval");
+C.Symbol_evalNow = new H.Symbol0("evalNow");
+C.Symbol_expander = new H.Symbol0("expander");
+C.Symbol_expanderStyle = new H.Symbol0("expanderStyle");
+C.Symbol_external = new H.Symbol0("external");
+C.Symbol_fd = new H.Symbol0("fd");
+C.Symbol_fields = new H.Symbol0("fields");
+C.Symbol_firstTokenPos = new H.Symbol0("firstTokenPos");
+C.Symbol_formatSize = new H.Symbol0("formatSize");
+C.Symbol_formatTime = new H.Symbol0("formatTime");
+C.Symbol_formattedAddress = new H.Symbol0("formattedAddress");
+C.Symbol_formattedAverage = new H.Symbol0("formattedAverage");
+C.Symbol_formattedCollections = new H.Symbol0("formattedCollections");
+C.Symbol_formattedDeoptId = new H.Symbol0("formattedDeoptId");
+C.Symbol_formattedExclusive = new H.Symbol0("formattedExclusive");
+C.Symbol_formattedExclusiveTicks = new H.Symbol0("formattedExclusiveTicks");
+C.Symbol_formattedInclusive = new H.Symbol0("formattedInclusive");
+C.Symbol_formattedInclusiveTicks = new H.Symbol0("formattedInclusiveTicks");
+C.Symbol_formattedLine = new H.Symbol0("formattedLine");
+C.Symbol_formattedTotalCollectionTime = new H.Symbol0("formattedTotalCollectionTime");
+C.Symbol_functions = new H.Symbol0("functions");
+C.Symbol_getColumnLabel = new H.Symbol0("getColumnLabel");
+C.Symbol_goto = new H.Symbol0("goto");
+C.Symbol_gotoLink = new H.Symbol0("gotoLink");
+C.Symbol_hasDescriptors = new H.Symbol0("hasDescriptors");
+C.Symbol_hasDisassembly = new H.Symbol0("hasDisassembly");
+C.Symbol_hasNoAllocations = new H.Symbol0("hasNoAllocations");
+C.Symbol_hashLinkWorkaround = new H.Symbol0("hashLinkWorkaround");
+C.Symbol_hits = new H.Symbol0("hits");
+C.Symbol_hoverText = new H.Symbol0("hoverText");
+C.Symbol_human = new H.Symbol0("human");
+C.Symbol_idle = new H.Symbol0("idle");
+C.Symbol_imp = new H.Symbol0("imp");
+C.Symbol_imports = new H.Symbol0("imports");
+C.Symbol_instruction = new H.Symbol0("instruction");
+C.Symbol_instructions = new H.Symbol0("instructions");
+C.Symbol_interface = new H.Symbol0("interface");
+C.Symbol_interfaces = new H.Symbol0("interfaces");
+C.Symbol_ioEnabled = new H.Symbol0("ioEnabled");
+C.Symbol_isAbstract = new H.Symbol0("isAbstract");
+C.Symbol_isBool = new H.Symbol0("isBool");
+C.Symbol_isComment = new H.Symbol0("isComment");
+C.Symbol_isConst = new H.Symbol0("isConst");
+C.Symbol_isDartCode = new H.Symbol0("isDartCode");
+C.Symbol_isDouble = new H.Symbol0("isDouble");
+C.Symbol_isError = new H.Symbol0("isError");
+C.Symbol_isFinalized = new H.Symbol0("isFinalized");
+C.Symbol_isImplemented = new H.Symbol0("isImplemented");
+C.Symbol_isInstance = new H.Symbol0("isInstance");
+C.Symbol_isInt = new H.Symbol0("isInt");
+C.Symbol_isList = new H.Symbol0("isList");
+C.Symbol_isNull = new H.Symbol0("isNull");
+C.Symbol_isOptimized = new H.Symbol0("isOptimized");
+C.Symbol_isPatch = new H.Symbol0("isPatch");
+C.Symbol_isPipe = new H.Symbol0("isPipe");
+C.Symbol_isString = new H.Symbol0("isString");
+C.Symbol_isType = new H.Symbol0("isType");
+C.Symbol_isUnexpected = new H.Symbol0("isUnexpected");
+C.Symbol_isolates = new H.Symbol0("isolates");
+C.Symbol_jumpTarget = new H.Symbol0("jumpTarget");
+C.Symbol_lastTokenPos = new H.Symbol0("lastTokenPos");
+C.Symbol_lastUpdate = new H.Symbol0("lastUpdate");
+C.Symbol_lib = new H.Symbol0("lib");
+C.Symbol_libraries = new H.Symbol0("libraries");
+C.Symbol_line = new H.Symbol0("line");
+C.Symbol_lineNumber = new H.Symbol0("lineNumber");
+C.Symbol_lineNumbers = new H.Symbol0("lineNumbers");
+C.Symbol_listening = new H.Symbol0("listening");
+C.Symbol_loading = new H.Symbol0("loading");
+C.Symbol_localAddress = new H.Symbol0("localAddress");
+C.Symbol_localPort = new H.Symbol0("localPort");
+C.Symbol_mainPort = new H.Symbol0("mainPort");
+C.Symbol_message = new H.Symbol0("message");
+C.Symbol_mouseOut = new H.Symbol0("mouseOut");
+C.Symbol_mouseOver = new H.Symbol0("mouseOver");
+C.Symbol_name = new H.Symbol0("name");
+C.Symbol_nameIsEmpty = new H.Symbol0("nameIsEmpty");
+C.Symbol_newSpace = new H.Symbol0("newSpace");
+C.Symbol_noSuchMethod = new H.Symbol0("noSuchMethod");
+C.Symbol_objectClass = new H.Symbol0("objectClass");
+C.Symbol_objectPool = new H.Symbol0("objectPool");
+C.Symbol_oldSpace = new H.Symbol0("oldSpace");
+C.Symbol_padding = new H.Symbol0("padding");
+C.Symbol_pause = new H.Symbol0("pause");
+C.Symbol_pauseEvent = new H.Symbol0("pauseEvent");
+C.Symbol_pid = new H.Symbol0("pid");
+C.Symbol_protocol = new H.Symbol0("protocol");
+C.Symbol_reachable = new H.Symbol0("reachable");
+C.Symbol_readClosed = new H.Symbol0("readClosed");
+C.Symbol_refresh = new H.Symbol0("refresh");
+C.Symbol_refreshCoverage = new H.Symbol0("refreshCoverage");
+C.Symbol_refreshGC = new H.Symbol0("refreshGC");
+C.Symbol_registerCallback = new H.Symbol0("registerCallback");
+C.Symbol_relativeLink = new H.Symbol0("relativeLink");
+C.Symbol_remoteAddress = new H.Symbol0("remoteAddress");
+C.Symbol_remotePort = new H.Symbol0("remotePort");
+C.Symbol_resetAccumulator = new H.Symbol0("resetAccumulator");
+C.Symbol_response = new H.Symbol0("response");
+C.Symbol_resume = new H.Symbol0("resume");
+C.Symbol_retainedSize = new H.Symbol0("retainedSize");
+C.Symbol_retainingPath = new H.Symbol0("retainingPath");
+C.Symbol_rootLib = new H.Symbol0("rootLib");
+C.Symbol_row = new H.Symbol0("row");
+C.Symbol_rows = new H.Symbol0("rows");
+C.Symbol_running = new H.Symbol0("running");
+C.Symbol_scripts = new H.Symbol0("scripts");
+C.Symbol_selectExpr = new H.Symbol0("selectExpr");
+C.Symbol_serviceType = new H.Symbol0("serviceType");
+C.Symbol_socketOwner = new H.Symbol0("socketOwner");
+C.Symbol_stacktrace = new H.Symbol0("stacktrace");
+C.Symbol_styleForHits = new H.Symbol0("styleForHits");
+C.Symbol_subClasses = new H.Symbol0("subClasses");
+C.Symbol_subclass = new H.Symbol0("subclass");
+C.Symbol_superClass = new H.Symbol0("superClass");
+C.Symbol_tipExclusive = new H.Symbol0("tipExclusive");
+C.Symbol_tipKind = new H.Symbol0("tipKind");
+C.Symbol_tipParent = new H.Symbol0("tipParent");
+C.Symbol_tipTicks = new H.Symbol0("tipTicks");
+C.Symbol_tipTime = new H.Symbol0("tipTime");
+C.Symbol_toggleExpand = new H.Symbol0("toggleExpand");
+C.Symbol_toggleExpanded = new H.Symbol0("toggleExpanded");
+C.Symbol_tokenPos = new H.Symbol0("tokenPos");
+C.Symbol_topFrame = new H.Symbol0("topFrame");
+C.Symbol_totalCollectionTimeInSeconds = new H.Symbol0("totalCollectionTimeInSeconds");
+C.Symbol_totalSamplesInProfile = new H.Symbol0("totalSamplesInProfile");
+C.Symbol_tree = new H.Symbol0("tree");
+C.Symbol_typeChecksEnabled = new H.Symbol0("typeChecksEnabled");
+C.Symbol_updateLineMode = new H.Symbol0("updateLineMode");
+C.Symbol_uptime = new H.Symbol0("uptime");
+C.Symbol_url = new H.Symbol0("url");
+C.Symbol_used = new H.Symbol0("used");
+C.Symbol_v = new H.Symbol0("v");
+C.Symbol_value = new H.Symbol0("value");
+C.Symbol_variable = new H.Symbol0("variable");
+C.Symbol_variables = new H.Symbol0("variables");
+C.Symbol_version = new H.Symbol0("version");
+C.Symbol_vmName = new H.Symbol0("vmName");
+C.Symbol_writeClosed = new H.Symbol0("writeClosed");
+C.Type_0e9 = H.createRuntimeType('ScriptViewElement');
+C.Type_2jN = H.createRuntimeType('CodeRefElement');
+C.Type_4IJ = H.createRuntimeType('FieldViewElement');
+C.Type_4m4 = H.createRuntimeType('IOSocketListViewElement');
+C.Type_61d = H.createRuntimeType('IOSocketViewElement');
+C.Type_6L0 = H.createRuntimeType('Uint8List');
+C.Type_7g3 = H.createRuntimeType('FlagItemElement');
+C.Type_8Gl = H.createRuntimeType('IsolateSharedSummaryElement');
+C.Type_8KD = H.createRuntimeType('IOProcessListViewElement');
+C.Type_8cK = H.createRuntimeType('IORandomAccessFileViewElement');
+C.Type_8eb = H.createRuntimeType('EvalBoxElement');
+C.Type_9ur = H.createRuntimeType('NavControlElement');
+C.Type_AD4 = H.createRuntimeType('NavMenuItemElement');
+C.Type_AHF = H.createRuntimeType('IOProcessViewElement');
+C.Type_AHF0 = H.createRuntimeType('NativeTypedArray');
+C.Type_Art = H.createRuntimeType('Float32List');
+C.Type_AyI = H.createRuntimeType('IOWebSocketViewElement');
+C.Type_Aym = H.createRuntimeType('CodeViewElement');
+C.Type_B8J = H.createRuntimeType('IOSocketRefElement');
+C.Type_C7R = H.createRuntimeType('TopNavMenuElement');
+C.Type_CAk = H.createRuntimeType('Uint16List');
+C.Type_E0k = H.createRuntimeType('VMViewElement');
+C.Type_ECh = H.createRuntimeType('IsolateLocationElement');
+C.Type_EOZ = H.createRuntimeType('_M1');
+C.Type_EQs = H.createRuntimeType('GlobalEventHandlers');
+C.Type_ES1 = H.createRuntimeType('IsolateRefElement');
+C.Type_EVD = H.createRuntimeType('InstanceRefElement');
+C.Type_Eue = H.createRuntimeType('VMRefElement');
+C.Type_FKd = H.createRuntimeType('ServiceErrorViewElement');
+C.Type_GNh = H.createRuntimeType('_M0');
+C.Type_HqF = H.createRuntimeType('Object');
+C.Type_I2I = H.createRuntimeType('PolymerElement');
+C.Type_IuH = H.createRuntimeType('IORandomAccessFileListViewElement');
+C.Type_JFX = H.createRuntimeType('ClassNavMenuElement');
+C.Type_Jcu = H.createRuntimeType('StackFrameElement');
+C.Type_JmU = H.createRuntimeType('IORefElement');
+C.Type_KMd = H.createRuntimeType('NavMenuElement');
+C.Type_Kyy = H.createRuntimeType('JsonViewElement');
+C.Type_L9j = H.createRuntimeType('IOHttpServerConnectionViewElement');
+C.Type_LV6 = H.createRuntimeType('HeapProfileElement');
+C.Type_M6L = H.createRuntimeType('IOHttpServerViewElement');
+C.Type_MUU = H.createRuntimeType('IOWebSocketRefElement');
+C.Type_Mu6 = H.createRuntimeType('ServiceObjectViewElement');
+C.Type_NlB = H.createRuntimeType('NativeTypedArrayOfDouble');
+C.Type_Npb = H.createRuntimeType('ErrorViewElement');
+C.Type_O5a = H.createRuntimeType('ClassViewElement');
+C.Type_ON8 = H.createRuntimeType('BreakpointListElement');
+C.Type_QuW = H.createRuntimeType('Uint8ClampedList');
+C.Type_QyU = H.createRuntimeType('WindowEventHandlers');
+C.Type_SoB = H.createRuntimeType('HeapMapElement');
+C.Type_Sxn = H.createRuntimeType('NavRefreshElement');
+C.Type_TEn = H.createRuntimeType('IOViewElement');
+C.Type_UJT = H.createRuntimeType('ServiceRefElement');
+C.Type_UoK = H.createRuntimeType('Int16List');
+C.Type_XXD = H.createRuntimeType('JSObject');
+C.Type_YgH = H.createRuntimeType('ObservatoryApplicationElement');
+C.Type_ZKG = H.createRuntimeType('IsolateViewElement');
+C.Type_a1Y = H.createRuntimeType('ScriptInsetElement');
+C.Type_aAD = H.createRuntimeType('IsolateRunStateElement');
+C.Type_bDN = H.createRuntimeType('FunctionViewElement');
+C.Type_cOY = H.createRuntimeType('IsolateProfileElement');
+C.Type_ckn = H.createRuntimeType('Float64List');
+C.Type_cop = H.createRuntimeType('CurlyBlockElement');
+C.Type_dRp = H.createRuntimeType('ClassTreeElement');
+C.Type_dTZ = H.createRuntimeType('Int32List');
+C.Type_dVs = H.createRuntimeType('DateTime');
+C.Type_eZO = H.createRuntimeType('Null');
+C.Type_f1j = H.createRuntimeType('FlagListElement');
+C.Type_gg4 = H.createRuntimeType('IOWebSocketListViewElement');
+C.Type_gqS = H.createRuntimeType('InstanceViewElement');
+C.Type_i7j = H.createRuntimeType('IOHttpServerRefElement');
+C.Type_iL9 = H.createRuntimeType('IsolateSummaryElement');
+C.Type_irB = H.createRuntimeType('Uint32List');
+C.Type_kA7 = H.createRuntimeType('ActionLinkElement');
+C.Type_kuc = H.createRuntimeType('SlidingCheckboxElement');
+C.Type_mWg = H.createRuntimeType('IORandomAccessFileRefElement');
+C.Type_mp3 = H.createRuntimeType('Int8List');
+C.Type_mpV = H.createRuntimeType('LibraryRefElement');
+C.Type_nV5 = H.createRuntimeType('NavBarElement');
+C.Type_nVV = H.createRuntimeType('StackTraceElement');
+C.Type_oGP = H.createRuntimeType('ByteData');
+C.Type_ohY = H.createRuntimeType('FieldRefElement');
+C.Type_oyU = H.createRuntimeType('_M2');
+C.Type_p2P = H.createRuntimeType('EvalLinkElement');
+C.Type_qMZ = H.createRuntimeType('IOProcessRefElement');
+C.Type_ql8 = H.createRuntimeType('ClassRefElement');
+C.Type_qph = H.createRuntimeType('LibraryViewElement');
+C.Type_qq1 = H.createRuntimeType('$double');
+C.Type_s2l = H.createRuntimeType('LibraryNavMenuElement');
+C.Type_s8b = H.createRuntimeType('AutoBindingElement');
+C.Type_sRP = H.createRuntimeType('ObservatoryElement');
+C.Type_uIL = H.createRuntimeType('IOHttpServerConnectionRefElement');
+C.Type_wAg = H.createRuntimeType('ByteBuffer');
+C.Type_wBh = H.createRuntimeType('ScriptRefElement');
+C.Type_wOW = H.createRuntimeType('NativeTypedArrayOfInt');
+C.Type_wT1 = H.createRuntimeType('IsolateCounterChartElement');
+C.Type_wgH = H.createRuntimeType('FunctionRefElement');
+C.Type_wsa = H.createRuntimeType('IsolateNavMenuElement');
+C.Type_xM7 = H.createRuntimeType('num');
+C.Type_y1j = H.createRuntimeType('ServiceExceptionViewElement');
+C.Type_yvP = H.createRuntimeType('IOHttpServerListViewElement');
+C.Utf8Codec_false = new P.Utf8Codec(false);
+$.libraries_to_load = {};
+$.RawReceivePortImpl__nextFreeId = 1;
+$.Primitives_mirrorFunctionCacheName = "$cachedFunction";
+$.Primitives_mirrorInvokeCacheName = "$cachedInvocation";
+$.Closure_functionCounter = 0;
+$.BoundClosure_selfFieldNameCache = null;
+$.BoundClosure_receiverFieldNameCache = null;
+$.RuntimeFunctionType_inAssert = false;
+$.getTagFunction = null;
+$.alternateTagFunction = null;
+$.prototypeForTagFunction = null;
+$.dispatchRecordsForInstanceTags = null;
+$.interceptorsForUncacheableTags = null;
+$.initNativeDispatchFlag = null;
+$.location = null;
+$.GoogleChart__api = null;
+$.printToZone = null;
+$._nextCallback = null;
+$._lastCallback = null;
+$.Zone__current = C.C__RootZone;
+$.Expando__keyCount = 0;
+$.Device__isOpera = null;
+$.Device__isWebKit = null;
+$.hierarchicalLoggingEnabled = false;
+$._rootLevel = C.Level_INFO_800;
+$.LogRecord__nextNumber = 0;
+$._allObservablesCount = 0;
+$._allObservables = null;
+$._delivering = false;
+$._Observer__nextBirthId = 0;
+$._ObservedSet__lastSet = null;
+$._deployMode = false;
+$._startPolymerCalled = false;
+$.initializers = null;
+$.deployMode = true;
+$.ServiceMap_objectIdRingPrefix = "objects/";
+$.TemplateBindExtension__initStyles = null;
+$.TemplateBindExtension__initBaseUriWorkaround = null;
+$.enableBindingsReflection = false;
+$.mapTypeToInterceptor = [C.Type_fPs, W.HtmlElement, {}, C.Type_0e9, U.ScriptViewElement, {created: U.ScriptViewElement$created}, C.Type_2jN, O.CodeRefElement, {created: O.CodeRefElement$created}, C.Type_4IJ, A.FieldViewElement, {created: A.FieldViewElement$created}, C.Type_4m4, E.IOSocketListViewElement, {created: E.IOSocketListViewElement$created}, C.Type_61d, E.IOSocketViewElement, {created: E.IOSocketViewElement$created}, C.Type_7g3, X.FlagItemElement, {created: X.FlagItemElement$created}, C.Type_8Gl, D.IsolateSharedSummaryElement, {created: D.IsolateSharedSummaryElement$created}, C.Type_8KD, E.IOProcessListViewElement, {created: E.IOProcessListViewElement$created}, C.Type_8cK, E.IORandomAccessFileViewElement, {created: E.IORandomAccessFileViewElement$created}, C.Type_8eb, L.EvalBoxElement, {created: L.EvalBoxElement$created}, C.Type_9ur, A.NavControlElement, {created: A.NavControlElement$created}, C.Type_AD4, A.NavMenuItemElement, {created: A.NavMenuItemElement$created}, C.Type_AHF, E.IOProcessViewElement, {created: E.IOProcessViewElement$created}, C.Type_AHF0, H.NativeTypedArray, {"": H.NativeTypedArray$}, C.Type_AyI, E.IOWebSocketViewElement, {created: E.IOWebSocketViewElement$created}, C.Type_Aym, F.CodeViewElement, {created: F.CodeViewElement$created}, C.Type_B8J, E.IOSocketRefElement, {created: E.IOSocketRefElement$created}, C.Type_C7R, A.TopNavMenuElement, {created: A.TopNavMenuElement$created}, C.Type_E0k, U.VMViewElement, {created: U.VMViewElement$created}, C.Type_ECh, D.IsolateLocationElement, {created: D.IsolateLocationElement$created}, C.Type_EQs, W.GlobalEventHandlers, {}, C.Type_ES1, N.IsolateRefElement, {created: N.IsolateRefElement$created}, C.Type_EVD, B.InstanceRefElement, {created: B.InstanceRefElement$created}, C.Type_Eue, X.VMRefElement, {created: X.VMRefElement$created}, C.Type_FKd, R.ServiceErrorViewElement, {created: R.ServiceErrorViewElement$created}, C.Type_I2I, A.PolymerElement, {created: A.PolymerElement$created}, C.Type_IuH, E.IORandomAccessFileListViewElement, {created: E.IORandomAccessFileListViewElement$created}, C.Type_JFX, A.ClassNavMenuElement, {created: A.ClassNavMenuElement$created}, C.Type_Jcu, K.StackFrameElement, {created: K.StackFrameElement$created}, C.Type_JmU, E.IORefElement, {created: E.IORefElement$created}, C.Type_KMd, A.NavMenuElement, {created: A.NavMenuElement$created}, C.Type_Kyy, Z.JsonViewElement, {created: Z.JsonViewElement$created}, C.Type_L9j, E.IOHttpServerConnectionViewElement, {created: E.IOHttpServerConnectionViewElement$created}, C.Type_LV6, K.HeapProfileElement, {created: K.HeapProfileElement$created}, C.Type_M6L, E.IOHttpServerViewElement, {created: E.IOHttpServerViewElement$created}, C.Type_MUU, E.IOWebSocketRefElement, {created: E.IOWebSocketRefElement$created}, C.Type_Mu6, U.ServiceObjectViewElement, {created: U.ServiceObjectViewElement$created}, C.Type_NlB, H.NativeTypedArrayOfDouble, {"": H.NativeTypedArrayOfDouble$}, C.Type_Npb, F.ErrorViewElement, {created: F.ErrorViewElement$created}, C.Type_O5a, Z.ClassViewElement, {created: Z.ClassViewElement$created}, C.Type_ON8, B.BreakpointListElement, {created: B.BreakpointListElement$created}, C.Type_QyU, W.WindowEventHandlers, {}, C.Type_SoB, O.HeapMapElement, {created: O.HeapMapElement$created}, C.Type_Sxn, A.NavRefreshElement, {created: A.NavRefreshElement$created}, C.Type_TEn, E.IOViewElement, {created: E.IOViewElement$created}, C.Type_UJT, Q.ServiceRefElement, {created: Q.ServiceRefElement$created}, C.Type_YgH, V.ObservatoryApplicationElement, {created: V.ObservatoryApplicationElement$created}, C.Type_ZKG, L.IsolateViewElement, {created: L.IsolateViewElement$created}, C.Type_a1Y, T.ScriptInsetElement, {created: T.ScriptInsetElement$created}, C.Type_aAD, D.IsolateRunStateElement, {created: D.IsolateRunStateElement$created}, C.Type_bDN, N.FunctionViewElement, {created: N.FunctionViewElement$created}, C.Type_cOY, X.IsolateProfileElement, {created: X.IsolateProfileElement$created}, C.Type_cop, R.CurlyBlockElement, {created: R.CurlyBlockElement$created}, C.Type_dRp, O.ClassTreeElement, {created: O.ClassTreeElement$created}, C.Type_f1j, X.FlagListElement, {created: X.FlagListElement$created}, C.Type_gg4, E.IOWebSocketListViewElement, {created: E.IOWebSocketListViewElement$created}, C.Type_gqS, Z.InstanceViewElement, {created: Z.InstanceViewElement$created}, C.Type_i7j, E.IOHttpServerRefElement, {created: E.IOHttpServerRefElement$created}, C.Type_iL9, D.IsolateSummaryElement, {created: D.IsolateSummaryElement$created}, C.Type_kA7, X.ActionLinkElement, {created: X.ActionLinkElement$created}, C.Type_kuc, Q.SlidingCheckboxElement, {created: Q.SlidingCheckboxElement$created}, C.Type_mWg, E.IORandomAccessFileRefElement, {created: E.IORandomAccessFileRefElement$created}, C.Type_mpV, R.LibraryRefElement, {created: R.LibraryRefElement$created}, C.Type_nV5, A.NavBarElement, {created: A.NavBarElement$created}, C.Type_nVV, X.StackTraceElement, {created: X.StackTraceElement$created}, C.Type_ohY, D.FieldRefElement, {created: D.FieldRefElement$created}, C.Type_p2P, R.EvalLinkElement, {created: R.EvalLinkElement$created}, C.Type_qMZ, E.IOProcessRefElement, {created: E.IOProcessRefElement$created}, C.Type_ql8, Q.ClassRefElement, {created: Q.ClassRefElement$created}, C.Type_qph, M.LibraryViewElement, {created: M.LibraryViewElement$created}, C.Type_s2l, A.LibraryNavMenuElement, {created: A.LibraryNavMenuElement$created}, C.Type_s8b, Y.AutoBindingElement, {created: Y.AutoBindingElement$created}, C.Type_sRP, Z.ObservatoryElement, {created: Z.ObservatoryElement$created}, C.Type_uIL, E.IOHttpServerConnectionRefElement, {created: E.IOHttpServerConnectionRefElement$created}, C.Type_wBh, A.ScriptRefElement, {created: A.ScriptRefElement$created}, C.Type_wOW, H.NativeTypedArrayOfInt, {"": H.NativeTypedArrayOfInt$}, C.Type_wT1, D.IsolateCounterChartElement, {created: D.IsolateCounterChartElement$created}, C.Type_wgH, U.FunctionRefElement, {created: U.FunctionRefElement$created}, C.Type_wsa, A.IsolateNavMenuElement, {created: A.IsolateNavMenuElement$created}, C.Type_y1j, D.ServiceExceptionViewElement, {created: D.ServiceExceptionViewElement$created}, C.Type_yvP, E.IOHttpServerListViewElement, {created: E.IOHttpServerListViewElement$created}];
+Isolate.$lazy($, "globalThis", "globalThis", "get$globalThis", function() {
+  return function() {
+    return this;
+  }();
+});
+Isolate.$lazy($, "globalWindow", "globalWindow", "get$globalWindow", function() {
+  return $.get$globalThis().window;
+});
+Isolate.$lazy($, "globalWorker", "globalWorker", "get$globalWorker", function() {
+  return $.get$globalThis().Worker;
+});
+Isolate.$lazy($, "globalPostMessageDefined", "globalPostMessageDefined", "get$globalPostMessageDefined", function() {
+  return $.get$globalThis().postMessage !== void 0;
+});
+Isolate.$lazy($, "thisScript", "IsolateNatives_thisScript", "get$IsolateNatives_thisScript", function() {
+  return H.IsolateNatives_computeThisScript();
+});
+Isolate.$lazy($, "workerIds", "IsolateNatives_workerIds", "get$IsolateNatives_workerIds", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [P.$int]);
+});
+Isolate.$lazy($, "noSuchMethodPattern", "TypeErrorDecoder_noSuchMethodPattern", "get$TypeErrorDecoder_noSuchMethodPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({toString: function() {
+      return "$receiver$";
+    }}));
+});
+Isolate.$lazy($, "notClosurePattern", "TypeErrorDecoder_notClosurePattern", "get$TypeErrorDecoder_notClosurePattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({$method$: null, toString: function() {
+      return "$receiver$";
+    }}));
+});
+Isolate.$lazy($, "nullCallPattern", "TypeErrorDecoder_nullCallPattern", "get$TypeErrorDecoder_nullCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(null));
+});
+Isolate.$lazy($, "nullLiteralCallPattern", "TypeErrorDecoder_nullLiteralCallPattern", "get$TypeErrorDecoder_nullLiteralCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    var $argumentsExpr$ = '$arguments$';
+    try {
+      null.$method$($argumentsExpr$);
+    } catch (e) {
+      return e.message;
+    }
 
-init.functionAliases={Sa:209}
-init.metadata=["sender","e","event","uri","onError",{func:"pd",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:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.mE]},,"error","stackTrace",{func:"pA",void:true,args:[P.dl,P.AN,P.dl,null,P.mE]},"self","parent","zone",{func:"QN",args:[P.dl,P.AN,P.dl,{func:"NT"}]},"f",{func:"wD",args:[P.dl,P.AN,P.dl,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.AN,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.AN,P.dl,{func:"NT"}]},{func:"v7",ret:{func:"aB",args:[null]},args:[P.dl,P.AN,P.dl,{func:"aB",args:[null]}]},{func:"Gt",ret:{func:"bh",args:[null,null]},args:[P.dl,P.AN,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.AN,P.dl,{func:"NT"}]},{func:"zo",ret:P.Xa,args:[P.dl,P.AN,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Xg",void:true,args:[P.dl,P.AN,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Jj",ret:P.dl,args:[P.dl,P.AN,P.dl,P.Ob,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:"P2",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",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:"VH",ret:P.a2,args:[P.GD]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable","invocation",{func:"NT"},{func:"rz",args:[P.EH]},"code","msg","errorMessage","message","key","val",{func:"bh",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c","obj","i",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"f4",void:true,args:[W.f5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Df",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"aK",ret:[P.b8,D.af],args:[null]},"dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.mE]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.mE]},{func:"N5",void:true,args:[null,P.mE]},"each","k",{func:"lv",args:[P.GD,null]},{func:"nY",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Dt",ret:P.KN,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"QO",void:true,args:[W.AjY]},"result",{func:"jH",args:[D.af]},{func:"Rb",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Yi",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"MG",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW2",ret:P.QV,args:[P.qU]}]},"s",{func:"S0",void:true,args:[P.a2,null]},"expand","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"Fe",void:true,args:[W.AjY,null,W.h4]},{func:"If",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"xc",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.AN,P.dl]},{func:"h2",args:[P.dl,P.AN,P.dl,{func:"aB",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"K7",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.Ap]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"MJ",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.hw,U.hw]},{func:"Qc",args:[U.hw]},"hits","map",{func:"JC",args:[V.qC]},"id",{func:"rl",ret:P.b8},"coverage",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"ze",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","scriptCoverage","timer",{func:"I6a",ret:P.qU},{func:"xA",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func","request",{func:"c3A",args:[W.fJ]},"details","ref",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"nl",void:true,args:[W.Aj]},{func:"en",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"VT",ret:P.b8,args:[P.qU]},];$=null
-I = I.$finishIsolateConstructor(I)
-$=new I()
-function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
-new MyClass()
-return a}
-A = convertToFastObject(A)
-B = convertToFastObject(B)
-C = convertToFastObject(C)
-D = convertToFastObject(D)
-E = convertToFastObject(E)
-F = convertToFastObject(F)
-G = convertToFastObject(G)
-H = convertToFastObject(H)
-J = convertToFastObject(J)
-K = convertToFastObject(K)
-L = convertToFastObject(L)
-M = convertToFastObject(M)
-N = convertToFastObject(N)
-O = convertToFastObject(O)
-P = convertToFastObject(P)
-Q = convertToFastObject(Q)
-R = convertToFastObject(R)
-S = convertToFastObject(S)
-T = convertToFastObject(T)
-U = convertToFastObject(U)
-V = convertToFastObject(V)
-W = convertToFastObject(W)
-X = convertToFastObject(X)
-Y = convertToFastObject(Y)
-Z = convertToFastObject(Z)
-!function(){function intern(a){var u={}
-u[a]=1
-return Object.keys(convertToFastObject(u))[0]}init.getIsolateTag=function(a){return intern("___dart_"+a+init.isolateTag)}
-var z="___dart_isolate_tags_"
-var y=Object[z]||(Object[z]=Object.create(null))
-var x="_ZxYxX"
-for(var w=0;;w++){var v=intern(x+"_"+w+"_")
-if(!(v in y)){y[v]=1
-init.isolateTag=v
-break}}}()
-init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
-;(function(a){if(typeof document==="undefined"){a(null)
-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.V7(),b)},[])}else{(function(b){H.wW(E.V7(),b)})([])}})
-function init(){I.p={}
-function generateAccessor(a,b,c){var y=a.split("-")
-var x=y[0]
-var w=x.length
-var v=x.charCodeAt(w-1)
-var u
-if(y.length>1)u=true
-else u=false
-v=v>=60&&v<=64?v-59:v>=123&&v<=126?v-117:v>=37&&v<=43?v-27:0
-if(v){var t=v&3
-var s=v>>2
-var r=x=x.substring(0,w-1)
-var q=x.indexOf(":")
-if(q>0){r=x.substring(0,q)
-x=x.substring(q+1)}if(t){var p=t&2?"r":""
-var o=t&1?"this":"r"
-var n="return "+o+"."+x
-var m=c+".prototype.g"+r+"="
-var l="function("+p+"){"+n+"}"
-if(u)b.push(m+"$reflectable("+l+");\n")
-else b.push(m+l+";\n")}if(s){var p=s&2?"r,v":"v"
-var o=s&1?"this":"r"
-var n=o+"."+x+"=v"
-var m=c+".prototype.s"+r+"="
-var l="function("+p+"){"+n+"}"
-if(u)b.push(m+"$reflectable("+l+");\n")
-else b.push(m+l+";\n")}}return x}I.p.$generateAccessor=generateAccessor
-function defineClass(a,b,c){var y=[]
-var x="function "+b+"("
-var w=""
-for(var v=0;v<c.length;v++){if(v!=0)x+=", "
-var u=generateAccessor(c[v],y,b)
-var t="parameter_"+u
-x+=t
-w+="this."+u+" = "+t+";\n"}x+=") {\n"+w+"}\n"
-x+=b+".builtin$cls=\""+a+"\";\n"
-x+="$desc=$collectedClasses."+b+";\n"
-x+="if($desc instanceof Array) $desc = $desc[1];\n"
-x+=b+".prototype = $desc;\n"
-if(typeof defineClass.name!="string"){x+=b+".name=\""+b+"\";\n"}x+=y.join("")
-return x}var z=function(){function tmp(){}var y=Object.prototype.hasOwnProperty
-return function(a,b){tmp.prototype=b.prototype
-var x=new tmp()
-var w=a.prototype
-for(var v in w)if(y.call(w,v))x[v]=w[v]
-x.constructor=a
-a.prototype=x
-return x}}()
-I.$finishClasses=function(a,b,c){var y={}
-if(!init.allClasses)init.allClasses={}
-var x=init.allClasses
-var w=Object.prototype.hasOwnProperty
-if(typeof dart_precompiled=="function"){var v=dart_precompiled(a)}else{var u="function $reflectable(fn){fn.$reflectable=1;return fn};\n"+"var $desc;\n"
-var t=[]}for(var s in a){if(w.call(a,s)){var r=a[s]
-if(r instanceof Array)r=r[1]
-var q=r["^"],p,o=s,n=q
-if(typeof q=="string"){var m=q.split("/")
-if(m.length==2){o=m[0]
-n=m[1]}}var l=n.split(";")
-n=l[1]==""?[]:l[1].split(",")
-p=l[0]
-m=p.split(":")
-if(m.length==2){p=m[0]
-var k=m[1]
-if(k)r.$signature=function(d){return function(){return init.metadata[d]}}(k)}if(p&&p.indexOf("+")>0){l=p.split("+")
-p=l[0]
-var j=a[l[1]]
-if(j instanceof Array)j=j[1]
-for(var i in j){if(w.call(j,i)&&!w.call(r,i))r[i]=j[i]}}if(typeof dart_precompiled!="function"){u+=defineClass(o,s,n)
-t.push(s)}if(p)y[s]=p}}if(typeof dart_precompiled!="function"){u+="return [\n  "+t.join(",\n  ")+"\n]"
-var v=new Function("$collectedClasses",u)(a)
-u=null}for(var h=0;h<v.length;h++){var g=v[h]
-var s=g.name
-var r=a[s]
-var f=b
-if(r instanceof Array){f=r[0]||b
-r=r[1]}x[s]=g
-f[s]=g}v=null
-var e={}
-init.interceptorsByTag=Object.create(null)
-init.leafTags={}
-function finishClass(a9){var d=Object.prototype.hasOwnProperty
-if(d.call(e,a9))return
-e[a9]=true
-var a0=y[a9]
-if(!a0||typeof a0!="string")return
-finishClass(a0)
-var a1=x[a9]
-var a2=x[a0]
-if(!a2)a2=c[a0]
-var a3=z(a1,a2)
-if(d.call(a3,"%")){var a4=a3["%"].split(";")
-if(a4[0]){var a5=a4[0].split("|")
-for(var a6=0;a6<a5.length;a6++){init.interceptorsByTag[a5[a6]]=a1
-init.leafTags[a5[a6]]=true}}if(a4[1]){a5=a4[1].split("|")
-if(a4[2]){var a7=a4[2].split("|")
-for(var a6=0;a6<a7.length;a6++){var a8=x[a7[a6]]
-a8.$nativeSuperclassTag=a5[0]}}for(a6=0;a6<a5.length;a6++){init.interceptorsByTag[a5[a6]]=a1
-init.leafTags[a5[a6]]=false}}}}for(var s in y)finishClass(s)}
-I.$lazy=function(a,b,c,d,e){var y={}
-var x={}
-a[c]=y
-a[d]=function(){var w=$[c]
-try{if(w===y){$[c]=x
-try{w=$[c]=e()}finally{if(w===y)if($[c]===x)$[c]=null}}else{if(w===x)H.ag(b)}return w}finally{$[d]=function(){return this[c]}}}}
-I.$finishIsolateConstructor=function(a){var y=a.p
-function Isolate(){var x=Object.prototype.hasOwnProperty
-for(var w in y)if(x.call(y,w))this[w]=y[w]
-function ForceEfficientMap(){}ForceEfficientMap.prototype=this
-new ForceEfficientMap()}Isolate.prototype=a.prototype
-Isolate.prototype.constructor=Isolate
-Isolate.p=y
-Isolate.$finishClasses=a.$finishClasses
-Isolate.uL=a.uL
-return Isolate}}
+  }());
+});
+Isolate.$lazy($, "undefinedCallPattern", "TypeErrorDecoder_undefinedCallPattern", "get$TypeErrorDecoder_undefinedCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(void 0));
+});
+Isolate.$lazy($, "undefinedLiteralCallPattern", "TypeErrorDecoder_undefinedLiteralCallPattern", "get$TypeErrorDecoder_undefinedLiteralCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    var $argumentsExpr$ = '$arguments$';
+    try {
+      (void 0).$method$($argumentsExpr$);
+    } catch (e) {
+      return e.message;
+    }
+
+  }());
+});
+Isolate.$lazy($, "nullPropertyPattern", "TypeErrorDecoder_nullPropertyPattern", "get$TypeErrorDecoder_nullPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(null));
+});
+Isolate.$lazy($, "nullLiteralPropertyPattern", "TypeErrorDecoder_nullLiteralPropertyPattern", "get$TypeErrorDecoder_nullLiteralPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    try {
+      null.$method$;
+    } catch (e) {
+      return e.message;
+    }
+
+  }());
+});
+Isolate.$lazy($, "undefinedPropertyPattern", "TypeErrorDecoder_undefinedPropertyPattern", "get$TypeErrorDecoder_undefinedPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(void 0));
+});
+Isolate.$lazy($, "undefinedLiteralPropertyPattern", "TypeErrorDecoder_undefinedLiteralPropertyPattern", "get$TypeErrorDecoder_undefinedLiteralPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    try {
+      (void 0).$method$;
+    } catch (e) {
+      return e.message;
+    }
+
+  }());
+});
+Isolate.$lazy($, "_completer", "GoogleChart__completer", "get$GoogleChart__completer", function() {
+  return H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+});
+Isolate.$lazy($, "scheduleImmediateClosure", "_AsyncRun_scheduleImmediateClosure", "get$_AsyncRun_scheduleImmediateClosure", function() {
+  return P._AsyncRun__initializeScheduleImmediate();
+});
+Isolate.$lazy($, "_nullFuture", "Future__nullFuture", "get$Future__nullFuture", function() {
+  return P._Future$immediate(null, null);
+});
+Isolate.$lazy($, "_toStringVisiting", "IterableBase__toStringVisiting", "get$IterableBase__toStringVisiting", function() {
+  return [];
+});
+Isolate.$lazy($, "webkitEvents", "ElementEvents_webkitEvents", "get$ElementEvents_webkitEvents", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal(["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);
+});
+Isolate.$lazy($, "context", "context", "get$context", function() {
+  return P._wrapToDart(function() {
+    return this;
+  }());
+});
+Isolate.$lazy($, "_DART_OBJECT_PROPERTY_NAME", "_DART_OBJECT_PROPERTY_NAME", "get$_DART_OBJECT_PROPERTY_NAME", function() {
+  return init.getIsolateTag("_$dart_dartObject");
+});
+Isolate.$lazy($, "_DART_CLOSURE_PROPERTY_NAME", "_DART_CLOSURE_PROPERTY_NAME", "get$_DART_CLOSURE_PROPERTY_NAME", function() {
+  return init.getIsolateTag("_$dart_dartClosure");
+});
+Isolate.$lazy($, "_dartProxyCtor", "_dartProxyCtor", "get$_dartProxyCtor", function() {
+  return function DartObject(o) {
+    this.o = o;
+  };
+});
+Isolate.$lazy($, "_freeColor", "HeapMapElement__freeColor", "get$HeapMapElement__freeColor", function() {
+  return [255, 255, 255, 255];
+});
+Isolate.$lazy($, "_pageSeparationColor", "HeapMapElement__pageSeparationColor", "get$HeapMapElement__pageSeparationColor", function() {
+  return [0, 0, 0, 255];
+});
+Isolate.$lazy($, "_loggers", "Logger__loggers", "get$Logger__loggers", function() {
+  return P.LinkedHashMap_LinkedHashMap$_empty(P.String, N.Logger);
+});
+Isolate.$lazy($, "_logger", "_logger", "get$_logger", function() {
+  return N.Logger_Logger("Observable.dirtyCheck");
+});
+Isolate.$lazy($, "_instance", "_InvalidPropertyPath__instance", "get$_InvalidPropertyPath__instance", function() {
+  return new L._InvalidPropertyPath([]);
+});
+Isolate.$lazy($, "_pathRegExp", "_pathRegExp", "get$_pathRegExp", function() {
+  return new L.closure7().call$0();
+});
+Isolate.$lazy($, "_logger", "_logger0", "get$_logger0", function() {
+  return N.Logger_Logger("observe.PathObserver");
+});
+Isolate.$lazy($, "_pathCache", "_pathCache", "get$_pathCache", function() {
+  return P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, L.PropertyPath);
+});
+Isolate.$lazy($, "_polymerSyntax", "PolymerDeclaration__polymerSyntax", "get$PolymerDeclaration__polymerSyntax", function() {
+  return new A.PolymerExpressions(T.PolymerExpressions$(null, C.C_ScopeFactory), null);
+});
+Isolate.$lazy($, "_typesByName", "_typesByName", "get$_typesByName", function() {
+  return P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Type);
+});
+Isolate.$lazy($, "_declarations", "_declarations", "get$_declarations", function() {
+  return P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, A.PolymerDeclaration);
+});
+Isolate.$lazy($, "_hasShadowDomPolyfill", "_hasShadowDomPolyfill", "get$_hasShadowDomPolyfill", function() {
+  return $.get$context().hasProperty$1("ShadowDOMPolyfill");
+});
+Isolate.$lazy($, "_ShadowCss", "_ShadowCss", "get$_ShadowCss", function() {
+  var t1 = $.get$_Platform();
+  return t1 != null ? J.$index$asx(t1, "ShadowCSS") : null;
+});
+Isolate.$lazy($, "_sheetLog", "_sheetLog", "get$_sheetLog", function() {
+  return N.Logger_Logger("polymer.stylesheet");
+});
+Isolate.$lazy($, "_changedMethodQueryOptions", "_changedMethodQueryOptions", "get$_changedMethodQueryOptions", function() {
+  return new A.QueryOptions(false, false, true, C.Type_fPs, false, true, null, A._isObserverMethod$closure());
+});
+Isolate.$lazy($, "_ATTRIBUTES_REGEX", "_ATTRIBUTES_REGEX", "get$_ATTRIBUTES_REGEX", function() {
+  return new H.JSSyntaxRegExp("\\s|,", H.JSSyntaxRegExp_makeNative("\\s|,", false, true, false), null, null);
+});
+Isolate.$lazy($, "_Platform", "_Platform", "get$_Platform", function() {
+  return J.$index$asx($.get$context(), "Platform");
+});
+Isolate.$lazy($, "bindPattern", "Polymer_bindPattern", "get$Polymer_bindPattern", function() {
+  return new H.JSSyntaxRegExp("\\{\\{([^{}]*)}}", H.JSSyntaxRegExp_makeNative("\\{\\{([^{}]*)}}", false, true, false), null, null);
+});
+Isolate.$lazy($, "_onReady", "Polymer__onReady", "get$Polymer__onReady", function() {
+  return H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+});
+Isolate.$lazy($, "_observeLog", "_observeLog", "get$_observeLog", function() {
+  return N.Logger_Logger("polymer.observe");
+});
+Isolate.$lazy($, "_eventsLog", "_eventsLog", "get$_eventsLog", function() {
+  return N.Logger_Logger("polymer.events");
+});
+Isolate.$lazy($, "_unbindLog", "_unbindLog", "get$_unbindLog", function() {
+  return N.Logger_Logger("polymer.unbind");
+});
+Isolate.$lazy($, "_bindLog", "_bindLog", "get$_bindLog", function() {
+  return N.Logger_Logger("polymer.bind");
+});
+Isolate.$lazy($, "_PolymerGestures", "_PolymerGestures", "get$_PolymerGestures", function() {
+  return J.$index$asx($.get$context(), "PolymerGestures");
+});
+Isolate.$lazy($, "_polymerElementProto", "_polymerElementProto", "get$_polymerElementProto", function() {
+  return new A.closure().call$0();
+});
+Isolate.$lazy($, "_typeHandlers", "_typeHandlers", "get$_typeHandlers", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal([C.Type_Ejg, new Z.closure0(), C.Type_eZO, new Z.closure1(), C.Type_dVs, new Z.closure2(), C.Type_EsU, new Z.closure3(), C.Type_SnA, new Z.closure4(), C.Type_qq1, new Z.closure5()], null, null);
+});
+Isolate.$lazy($, "_BINARY_OPERATORS", "_BINARY_OPERATORS", "get$_BINARY_OPERATORS", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal(["+", new K.closure14(), "-", new K.closure15(), "*", new K.closure16(), "/", new K.closure17(), "%", new K.closure18(), "==", new K.closure19(), "!=", new K.closure20(), "===", new K.closure21(), "!==", new K.closure22(), ">", new K.closure23(), ">=", new K.closure24(), "<", new K.closure25(), "<=", new K.closure26(), "||", new K.closure27(), "&&", new K.closure28(), "|", new K.closure29()], null, null);
+});
+Isolate.$lazy($, "_UNARY_OPERATORS", "_UNARY_OPERATORS", "get$_UNARY_OPERATORS", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal(["+", new K.closure11(), "-", new K.closure12(), "!", new K.closure13()], null, null);
+});
+Isolate.$lazy($, "_instance", "Closer__instance", "get$Closer__instance", function() {
+  return new K.Closer();
+});
+Isolate.$lazy($, "_currentIsolateMatcher", "VM__currentIsolateMatcher", "get$VM__currentIsolateMatcher", function() {
+  return new H.JSSyntaxRegExp("isolates/\\d+", H.JSSyntaxRegExp_makeNative("isolates/\\d+", false, true, false), null, null);
+});
+Isolate.$lazy($, "_currentObjectMatcher", "VM__currentObjectMatcher", "get$VM__currentObjectMatcher", function() {
+  return new H.JSSyntaxRegExp("isolates/\\d+/", H.JSSyntaxRegExp_makeNative("isolates/\\d+/", false, true, false), null, null);
+});
+Isolate.$lazy($, "objectAccessor", "objectAccessor", "get$objectAccessor", function() {
+  return D.throwNotConfiguredError();
+});
+Isolate.$lazy($, "typeInspector", "typeInspector", "get$typeInspector", function() {
+  return D.throwNotConfiguredError();
+});
+Isolate.$lazy($, "symbolConverter", "symbolConverter", "get$symbolConverter", function() {
+  return D.throwNotConfiguredError();
+});
+Isolate.$lazy($, "_DEFAULT", "BindingDelegate__DEFAULT", "get$BindingDelegate__DEFAULT", function() {
+  return new M.BindingDelegate(null);
+});
+Isolate.$lazy($, "_checkboxEventType", "_InputBinding__checkboxEventType", "get$_InputBinding__checkboxEventType", function() {
+  return new M.closure10().call$0();
+});
+Isolate.$lazy($, "_contentsOwner", "TemplateBindExtension__contentsOwner", "get$TemplateBindExtension__contentsOwner", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_ownerStagingDocument", "TemplateBindExtension__ownerStagingDocument", "get$TemplateBindExtension__ownerStagingDocument", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_allTemplatesSelectors", "TemplateBindExtension__allTemplatesSelectors", "get$TemplateBindExtension__allTemplatesSelectors", function() {
+  return "template, " + J.map$1$ax(C.Map_05eTF.get$keys(), new M.closure6()).join$1(0, ", ");
+});
+Isolate.$lazy($, "_templateObserver", "TemplateBindExtension__templateObserver", "get$TemplateBindExtension__templateObserver", function() {
+  return new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(H.convertDartClosureToJS(W._wrapBinaryZone(new M.closure8()), 2));
+});
+Isolate.$lazy($, "_emptyInstance", "_emptyInstance", "get$_emptyInstance", function() {
+  return new M.closure9().call$0();
+});
+Isolate.$lazy($, "_instanceExtension", "_instanceExtension", "get$_instanceExtension", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_isStagingDocument", "_isStagingDocument", "get$_isStagingDocument", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_expando", "_expando", "get$_expando", function() {
+  return H.setRuntimeTypeInfo(new P.Expando("template_binding"), [null]);
+});
+// Native classes
+
+init.functionAliases = {evalType: 209};
+;
+init.metadata = ["sender",
+"e",
+"event",
+"uri",
+"onError",
+{func: "dynamic__String", args: [P.String]},
+"closure",
+"isolate",
+"numberOfArguments",
+"arg1",
+"arg2",
+"arg3",
+"arg4",
+{func: "args1", args: [null]},
+"_",
+{func: "String__int", ret: P.String, args: [P.$int]},
+"bytes",
+{func: "String__dynamic", ret: P.String, args: [null]},
+{func: "void_", void: true},
+{func: "void__void_", void: true, args: [{func: "void_", void: true}]},
+{func: "void__dynamic", void: true, args: [null]},
+"value",
+{func: "void__dynamic__StackTrace", void: true, args: [null], opt: [P.StackTrace]},
+,
+"error",
+"stackTrace",
+{func: "void__Zone_ZoneDelegate_Zone_dynamic_StackTrace", void: true, args: [P.Zone, P.ZoneDelegate, P.Zone, null, P.StackTrace]},
+"self",
+"parent",
+"zone",
+{func: "dynamic__Zone_ZoneDelegate_Zone_args0", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args0"}]},
+"f",
+{func: "dynamic__Zone_ZoneDelegate_Zone_args1_dynamic", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args1", args: [null]}, null]},
+"arg",
+{func: "dynamic__Zone_ZoneDelegate_Zone_args2_dynamic_dynamic", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args2", args: [null, null]}, null, null]},
+{func: "ZoneCallback__Zone_ZoneDelegate_Zone_args0", ret: {func: "args0"}, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args0"}]},
+{func: "ZoneUnaryCallback__Zone_ZoneDelegate_Zone_args1", ret: {func: "args1", args: [null]}, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args1", args: [null]}]},
+{func: "ZoneBinaryCallback__Zone_ZoneDelegate_Zone_args2", ret: {func: "args2", args: [null, null]}, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args2", args: [null, null]}]},
+{func: "void__Zone_ZoneDelegate_Zone_args0", void: true, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args0"}]},
+{func: "Timer__Zone_ZoneDelegate_Zone_Duration_void_", ret: P.Timer, args: [P.Zone, P.ZoneDelegate, P.Zone, P.Duration, {func: "void_", void: true}]},
+"duration",
+"callback",
+{func: "void__Zone_ZoneDelegate_Zone_String", void: true, args: [P.Zone, P.ZoneDelegate, P.Zone, P.String]},
+{func: "void__String", void: true, args: [P.String]},
+{func: "Zone__Zone_ZoneDelegate_Zone_ZoneSpecification_Map", ret: P.Zone, args: [P.Zone, P.ZoneDelegate, P.Zone, P.ZoneSpecification, P.Map]},
+{func: "bool__dynamic_dynamic", ret: P.bool, args: [null, null]},
+"a",
+"b",
+{func: "int__dynamic", ret: P.$int, args: [null]},
+{func: "Object__dynamic", ret: P.Object, args: [null]},
+"object",
+{func: "int__Comparable_Comparable", ret: P.$int, args: [P.Comparable, P.Comparable]},
+{func: "bool__Object_Object", ret: P.bool, args: [P.Object, P.Object]},
+{func: "int__Object", ret: P.$int, args: [P.Object]},
+"receiver",
+{func: "args4", args: [null, null, null, null]},
+"name",
+"oldValue",
+"newValue",
+"captureThis",
+"arguments",
+"o",
+{func: "bool__Symbol", ret: P.bool, args: [P.Symbol]},
+"symbol",
+"v",
+"x",
+{func: "Iterable__Iterable", ret: [P.Iterable, K.IndexedValue], args: [P.Iterable]},
+"iterable",
+"invocation",
+{func: "args0"},
+{func: "dynamic__Function", args: [P.Function]},
+"code",
+"msg",
+"errorMessage",
+"message",
+{func: "args2", args: [null, null]},
+"key",
+{func: "dynamic__String_dynamic", args: [P.String, null]},
+{func: "dynamic__dynamic_String", args: [null, P.String]},
+{func: "void__dynamic_dynamic_dynamic", void: true, args: [null, null, null]},
+"c",
+"obj",
+"i",
+{func: "void__ServiceError", void: true, args: [D.ServiceError]},
+{func: "void__ServiceException", void: true, args: [D.ServiceException]},
+"exception",
+{func: "void__PopStateEvent", void: true, args: [W.PopStateEvent]},
+{func: "int__int_int", ret: P.$int, args: [P.$int, P.$int]},
+"column",
+"done",
+{func: "String__TableTreeRow", ret: P.String, args: [G.TableTreeRow]},
+"row",
+{func: "void__Event_dynamic_Element", void: true, args: [W.Event, null, W.Element]},
+"detail",
+"target",
+"objectClass",
+{func: "Future__String", ret: [P.Future, D.ServiceObject], args: [P.String]},
+"text",
+{func: "Future__dynamic", ret: [P.Future, D.ServiceObject], args: [null]},
+"limit",
+"dummy",
+{func: "dynamic__ServiceMap", args: [D.ServiceMap]},
+{func: "void__Event_dynamic_Node", void: true, args: [W.Event, null, W.Node]},
+{func: "dynamic__Code", args: [D.Code]},
+"data",
+{func: "void__Object__StackTrace", void: true, args: [P.Object], opt: [P.StackTrace]},
+"theError",
+"theStackTrace",
+{func: "dynamic__Object", args: [P.Object]},
+{func: "void___dynamic", void: true, opt: [null]},
+{func: "dynamic__dynamic__dynamic", args: [null], opt: [null]},
+{func: "bool_", ret: P.bool},
+"ignored",
+"convert",
+"element",
+{func: "dynamic__bool", args: [P.bool]},
+{func: "void___Future", void: true, opt: [P.Future]},
+"resumeSignal",
+{func: "dynamic__dynamic_StackTrace", args: [null, P.StackTrace]},
+{func: "void__dynamic_StackTrace", void: true, args: [null, P.StackTrace]},
+"each",
+{func: "dynamic__Symbol_dynamic", args: [P.Symbol, null]},
+{func: "int__String", ret: P.$int, args: [P.String]},
+{func: "double__String", ret: P.$double, args: [P.String]},
+{func: "bool__int", ret: P.bool, args: [P.$int]},
+{func: "int__int", ret: P.$int, args: [P.$int]},
+{func: "int__dynamic_dynamic", ret: P.$int, args: [null, null]},
+"byteString",
+{func: "void__MouseEvent", void: true, args: [W.MouseEvent]},
+"result",
+{func: "dynamic__ServiceObject", args: [D.ServiceObject]},
+{func: "PixelReference_", ret: O.PixelReference},
+"response",
+"st",
+{func: "void__ServiceMap", void: true, args: [D.ServiceMap]},
+"newProfile",
+{func: "String__bool", ret: P.String, args: [P.bool]},
+"newSpace",
+{func: "dynamic__int", args: [P.$int]},
+{func: "dynamic__int_dynamic", args: [P.$int, null]},
+{func: "Iterable__dynamic__String", ret: P.Iterable, args: [{func: "dynamic__String", args: [P.String]}]},
+{func: "Iterable__Iterable__String", ret: P.Iterable, args: [{func: "Iterable__String", ret: P.Iterable, args: [P.String]}]},
+"s",
+{func: "void__bool_dynamic", void: true, args: [P.bool, null]},
+"expand",
+"m",
+{func: "Future__dynamic0", ret: P.Future, args: [null]},
+"tagProfile",
+"rec",
+{func: "dynamic__LogRecord", args: [N.LogRecord]},
+{func: "void__MouseEvent_dynamic_Element", void: true, args: [W.MouseEvent, null, W.Element]},
+{func: "String__String", ret: P.String, args: [P.String]},
+"url",
+{func: "String__double", ret: P.String, args: [P.$double]},
+"time",
+{func: "bool__String", ret: P.bool, args: [P.String]},
+"type",
+{func: "dynamic__ZoneDelegate_Zone", args: [P.ZoneDelegate, P.Zone]},
+{func: "dynamic__Zone_ZoneDelegate_Zone_args1", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args1", args: [null]}]},
+{func: "void__Object", void: true, args: [P.Object]},
+"records",
+{func: "dynamic__PropertyPath_dynamic", args: [L.PropertyPath, null]},
+"model",
+"node",
+"oneTime",
+{func: "args3", args: [null, null, null]},
+{func: "void__String_String", void: true, args: [P.String, P.String]},
+{func: "void__List_Map_List", void: true, args: [P.List, P.Map, P.List]},
+{func: "void__List", void: true, args: [[P.List, T.ChangeRecord]]},
+{func: "void__Iterable", void: true, args: [[P.Iterable, A.Bindable]]},
+"changes",
+"jsElem",
+"extendee",
+{func: "dynamic__dynamic_String_String", args: [null, P.String, P.String]},
+"k",
+{func: "dynamic__dynamic_Node_bool", args: [null, W.Node, P.bool]},
+{func: "dynamic__dynamic__bool", args: [null], named: {skipChanges: P.bool}},
+false,
+"skipChanges",
+{func: "dynamic__List", args: [[P.List, T.ChangeRecord]]},
+{func: "Index__Expression_Expression", ret: U.Index, args: [U.Expression, U.Expression]},
+{func: "dynamic__Expression", args: [U.Expression]},
+"hits",
+"map",
+{func: "dynamic__ObservableMap", args: [V.ObservableMap]},
+"id",
+{func: "Future_", ret: P.Future},
+"coverage",
+{func: "Future__ServiceMap", ret: [P.Future, [P.List, D.Class]], args: [D.ServiceMap]},
+"classList",
+{func: "Future__List", ret: [P.Future, D.Class], args: [[P.List, D.Class]]},
+"classes",
+"scriptCoverage",
+"timer",
+{func: "String_", ret: P.String},
+{func: "String__Code", ret: P.String, args: [D.Code]},
+{func: "void__Script", void: true, args: [D.Script]},
+"script",
+"func",
+"request",
+{func: "dynamic__HttpRequest", args: [W.HttpRequest]},
+"details",
+"ref",
+{func: "void__List0", void: true, args: [[P.List, G.ListChangeRecord]]},
+"splices",
+{func: "void__DocumentFragment", void: true, args: [W.DocumentFragment]},
+{func: "String__Object", ret: P.String, args: [P.Object]},
+{func: "String__List", ret: P.String, args: [[P.List, P.Object]]},
+"values",
+{func: "Future__String0", ret: P.Future, args: [P.String]},
+];
+$ = null;
+Isolate = Isolate.$finishIsolateConstructor(Isolate);
+$ = new Isolate();
+function convertToFastObject(properties) {
+  function MyClass() {
+  }
+  MyClass.prototype = properties;
+  new MyClass();
+  return properties;
+}
+;
+A = convertToFastObject(A);
+B = convertToFastObject(B);
+C = convertToFastObject(C);
+D = convertToFastObject(D);
+E = convertToFastObject(E);
+F = convertToFastObject(F);
+G = convertToFastObject(G);
+H = convertToFastObject(H);
+J = convertToFastObject(J);
+K = convertToFastObject(K);
+L = convertToFastObject(L);
+M = convertToFastObject(M);
+N = convertToFastObject(N);
+O = convertToFastObject(O);
+P = convertToFastObject(P);
+Q = convertToFastObject(Q);
+R = convertToFastObject(R);
+S = convertToFastObject(S);
+T = convertToFastObject(T);
+U = convertToFastObject(U);
+V = convertToFastObject(V);
+W = convertToFastObject(W);
+X = convertToFastObject(X);
+Y = convertToFastObject(Y);
+Z = convertToFastObject(Z);
+!function() {
+  function intern(s) {
+    var o = {};
+    o[s] = 1;
+    return Object.keys(convertToFastObject(o))[0];
+  }
+  init.getIsolateTag = function(name) {
+    return intern("___dart_" + name + init.isolateTag);
+  };
+  var tableProperty = "___dart_isolate_tags_";
+  var usedProperties = Object[tableProperty] || (Object[tableProperty] = Object.create(null));
+  var rootProperty = "_ZxYxX";
+  for (var i = 0;; i++) {
+    var property = intern(rootProperty + "_" + i + "_");
+    if (!(property in usedProperties)) {
+      usedProperties[property] = 1;
+      init.isolateTag = property;
+      break;
+    }
+  }
+}();
+init.dispatchPropertyName = init.getIsolateTag("dispatch_record");
+// BEGIN invoke [main].
+;(function(callback) {
+  if (typeof document === "undefined") {
+    callback(null);
+    return;
+  }
+  if (document.currentScript) {
+    callback(document.currentScript);
+    return;
+  }
+  var scripts = document.scripts;
+  function onLoad(event) {
+    for (var i = 0; i < scripts.length; ++i) {
+      scripts[i].removeEventListener("load", onLoad, false);
+    }
+    callback(event.target);
+  }
+  for (var i = 0; i < scripts.length; ++i) {
+    scripts[i].addEventListener("load", onLoad, false);
+  }
+})(function(currentScript) {
+  init.currentScript = currentScript;
+  if (typeof dartMainRunner === "function") {
+    dartMainRunner(function(a) {
+      H.startRootIsolate(E.main0$closure(), a);
+    }, []);
+  } else {
+    (function(a) {
+      H.startRootIsolate(E.main0$closure(), a);
+    })([]);
+  }
+});
+;
+// END invoke [main].
+function init() {
+  Isolate.$isolateProperties = {};
+  function generateAccessor(fieldDescriptor, accessors, cls) {
+    var fieldInformation = fieldDescriptor.split("-");
+    var field = fieldInformation[0];
+    var len = field.length;
+    var code = field.charCodeAt(len - 1);
+    var reflectable;
+    if (fieldInformation.length > 1)
+      reflectable = true;
+    else
+      reflectable = false;
+    code = code >= 60 && code <= 64 ? code - 59 : code >= 123 && code <= 126 ? code - 117 : code >= 37 && code <= 43 ? code - 27 : 0;
+    if (code) {
+      var getterCode = code & 3;
+      var setterCode = code >> 2;
+      var accessorName = field = field.substring(0, len - 1);
+      var divider = field.indexOf(":");
+      if (divider > 0) {
+        accessorName = field.substring(0, divider);
+        field = field.substring(divider + 1);
+      }
+      if (getterCode) {
+        var args = getterCode & 2 ? "receiver" : "";
+        var receiver = getterCode & 1 ? "this" : "receiver";
+        var body = "return " + receiver + "." + field;
+        var property = cls + ".prototype.get$" + accessorName + "=";
+        var fn = "function(" + args + "){" + body + "}";
+        if (reflectable)
+          accessors.push(property + "$reflectable(" + fn + ");\n");
+        else
+          accessors.push(property + fn + ";\n");
+      }
+      if (setterCode) {
+        var args = setterCode & 2 ? "receiver, value" : "value";
+        var receiver = setterCode & 1 ? "this" : "receiver";
+        var body = receiver + "." + field + " = value";
+        var property = cls + ".prototype.set$" + accessorName + "=";
+        var fn = "function(" + args + "){" + body + "}";
+        if (reflectable)
+          accessors.push(property + "$reflectable(" + fn + ");\n");
+        else
+          accessors.push(property + fn + ";\n");
+      }
+    }
+    return field;
+  }
+  Isolate.$isolateProperties.$generateAccessor = generateAccessor;
+  function defineClass(name, cls, fields) {
+    var accessors = [];
+    var str = "function " + cls + "(";
+    var body = "";
+    for (var i = 0; i < fields.length; i++) {
+      if (i != 0)
+        str += ", ";
+      var field = generateAccessor(fields[i], accessors, cls);
+      var parameter = "parameter_" + field;
+      str += parameter;
+      body += "this." + field + " = " + parameter + ";\n";
+    }
+    str += ") {\n" + body + "}\n";
+    str += cls + ".builtin$cls=\"" + name + "\";\n";
+    str += "$desc=$collectedClasses." + cls + ";\n";
+    str += "if($desc instanceof Array) $desc = $desc[1];\n";
+    str += cls + ".prototype = $desc;\n";
+    if (typeof defineClass.name != "string") {
+      str += cls + ".name=\"" + cls + "\";\n";
+    }
+    str += accessors.join("");
+    return str;
+  }
+  var inheritFrom = function() {
+    function tmp() {
+    }
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+    return function(constructor, superConstructor) {
+      tmp.prototype = superConstructor.prototype;
+      var object = new tmp();
+      var properties = constructor.prototype;
+      for (var member in properties)
+        if (hasOwnProperty.call(properties, member))
+          object[member] = properties[member];
+      object.constructor = constructor;
+      constructor.prototype = object;
+      return object;
+    };
+  }();
+  Isolate.$finishClasses = function(collectedClasses, isolateProperties, existingIsolateProperties) {
+    var pendingClasses = {};
+    if (!init.allClasses)
+      init.allClasses = {};
+    var allClasses = init.allClasses;
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+    if (typeof dart_precompiled == "function") {
+      var constructors = dart_precompiled(collectedClasses);
+    } else {
+      var combinedConstructorFunction = "function $reflectable(fn){fn.$reflectable=1;return fn};\n" + "var $desc;\n";
+      var constructorsList = [];
+    }
+    for (var cls in collectedClasses) {
+      if (hasOwnProperty.call(collectedClasses, cls)) {
+        var desc = collectedClasses[cls];
+        if (desc instanceof Array)
+          desc = desc[1];
+        var classData = desc["^"], supr, name = cls, fields = classData;
+        if (typeof classData == "string") {
+          var split = classData.split("/");
+          if (split.length == 2) {
+            name = split[0];
+            fields = split[1];
+          }
+        }
+        var s = fields.split(";");
+        fields = s[1] == "" ? [] : s[1].split(",");
+        supr = s[0];
+        split = supr.split(":");
+        if (split.length == 2) {
+          supr = split[0];
+          var functionSignature = split[1];
+          if (functionSignature)
+            desc.$signature = function(s) {
+              return function() {
+                return init.metadata[s];
+              };
+            }(functionSignature);
+        }
+        if (supr && supr.indexOf("+") > 0) {
+          s = supr.split("+");
+          supr = s[0];
+          var mixin = collectedClasses[s[1]];
+          if (mixin instanceof Array)
+            mixin = mixin[1];
+          for (var d in mixin) {
+            if (hasOwnProperty.call(mixin, d) && !hasOwnProperty.call(desc, d))
+              desc[d] = mixin[d];
+          }
+        }
+        if (typeof dart_precompiled != "function") {
+          combinedConstructorFunction += defineClass(name, cls, fields);
+          constructorsList.push(cls);
+        }
+        if (supr)
+          pendingClasses[cls] = supr;
+      }
+    }
+    if (typeof dart_precompiled != "function") {
+      combinedConstructorFunction += "return [\n  " + constructorsList.join(",\n  ") + "\n]";
+      var constructors = new Function("$collectedClasses", combinedConstructorFunction)(collectedClasses);
+      combinedConstructorFunction = null;
+    }
+    for (var i = 0; i < constructors.length; i++) {
+      var constructor = constructors[i];
+      var cls = constructor.name;
+      var desc = collectedClasses[cls];
+      var globalObject = isolateProperties;
+      if (desc instanceof Array) {
+        globalObject = desc[0] || isolateProperties;
+        desc = desc[1];
+      }
+      allClasses[cls] = constructor;
+      globalObject[cls] = constructor;
+    }
+    constructors = null;
+    var finishedClasses = {};
+    init.interceptorsByTag = Object.create(null);
+    init.leafTags = {};
+    function finishClass(cls) {
+      var hasOwnProperty = Object.prototype.hasOwnProperty;
+      if (hasOwnProperty.call(finishedClasses, cls))
+        return;
+      finishedClasses[cls] = true;
+      var superclass = pendingClasses[cls];
+      if (!superclass || typeof superclass != "string")
+        return;
+      finishClass(superclass);
+      var constructor = allClasses[cls];
+      var superConstructor = allClasses[superclass];
+      if (!superConstructor)
+        superConstructor = existingIsolateProperties[superclass];
+      var prototype = inheritFrom(constructor, superConstructor);
+      if (hasOwnProperty.call(prototype, "%")) {
+        var nativeSpec = prototype["%"].split(";");
+        if (nativeSpec[0]) {
+          var tags = nativeSpec[0].split("|");
+          for (var i = 0; i < tags.length; i++) {
+            init.interceptorsByTag[tags[i]] = constructor;
+            init.leafTags[tags[i]] = true;
+          }
+        }
+        if (nativeSpec[1]) {
+          tags = nativeSpec[1].split("|");
+          if (nativeSpec[2]) {
+            var subclasses = nativeSpec[2].split("|");
+            for (var i = 0; i < subclasses.length; i++) {
+              var subclass = allClasses[subclasses[i]];
+              subclass.$nativeSuperclassTag = tags[0];
+            }
+          }
+          for (i = 0; i < tags.length; i++) {
+            init.interceptorsByTag[tags[i]] = constructor;
+            init.leafTags[tags[i]] = false;
+          }
+        }
+      }
+    }
+    for (var cls in pendingClasses)
+      finishClass(cls);
+  };
+  Isolate.$lazy = function(prototype, staticName, fieldName, getterName, lazyValue) {
+    var sentinelUndefined = {};
+    var sentinelInProgress = {};
+    prototype[fieldName] = sentinelUndefined;
+    prototype[getterName] = function() {
+      var result = $[fieldName];
+      try {
+        if (result === sentinelUndefined) {
+          $[fieldName] = sentinelInProgress;
+          try {
+            result = $[fieldName] = lazyValue();
+          } finally {
+            if (result === sentinelUndefined)
+              if ($[fieldName] === sentinelInProgress)
+                $[fieldName] = null;
+          }
+        } else {
+          if (result === sentinelInProgress)
+            H.throwCyclicInit(staticName);
+        }
+        return result;
+      } finally {
+        $[getterName] = function() {
+          return this[fieldName];
+        };
+      }
+    };
+  };
+  Isolate.$finishIsolateConstructor = function(oldIsolate) {
+    var isolateProperties = oldIsolate.$isolateProperties;
+    function Isolate() {
+      var hasOwnProperty = Object.prototype.hasOwnProperty;
+      for (var staticName in isolateProperties)
+        if (hasOwnProperty.call(isolateProperties, staticName))
+          this[staticName] = isolateProperties[staticName];
+      function ForceEfficientMap() {
+      }
+      ForceEfficientMap.prototype = this;
+      new ForceEfficientMap();
+    }
+    Isolate.prototype = oldIsolate.prototype;
+    Isolate.prototype.constructor = Isolate;
+    Isolate.$isolateProperties = isolateProperties;
+    Isolate.$finishClasses = oldIsolate.$finishClasses;
+    Isolate.makeConstantList = oldIsolate.makeConstantList;
+    return Isolate;
+  };
+}
 })()
+
+//# sourceMappingURL=index.html_bootstrap.dart.js.map
+//@ sourceMappingURL=index.html_bootstrap.dart.js.map
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index d7d3526..48f835d 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -3850,11 +3850,30 @@
       </template>
       
       <template if="{{ !cls.hasNoAllocations }}">
-        current instances ({{ cls.newSpace.current.instances + cls.oldSpace.current.instances }})
+        instances
           <div class="memberItem">
-            <div class="memberName">shallow size</div>
+            <div class="memberName">currently allocated</div>
             <div class="memberValue">
-              {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }}
+              count {{ cls.newSpace.current.instances + cls.oldSpace.current.instances }}
+              (shallow size {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }})
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">strongly reachable</div>
+            <div class="memberValue">
+              <template if="{{ instances == null }}">
+                <eval-link callback="{{ reachable }}" label="[find]" expr="100">
+                </eval-link>
+              </template>
+              <template if="{{ instances != null }}">
+                sample
+                <instance-ref ref="{{ instances['sample'] }}"></instance-ref>
+                <template if="{{ instances['totalCount'] > instances['sampleCount'] }}">
+                  <eval-link callback="{{ reachable }}" label="[more]" expr="{{ instances['sampleCount'] * 2 }}">
+                  </eval-link>
+                </template>
+                of total {{ instances['totalCount'] }}
+              </template>
             </div>
           </div>
           <div class="memberItem">
@@ -16525,4 +16544,4 @@
 
   <observatory-application devtools="true"></observatory-application>
 
-<script src="index_devtools.html_bootstrap.dart.js"></script></body></html>
\ No newline at end of file
+<script type="application/dart" src="index_devtools.html_bootstrap.dart"></script><script src="packages/browser/dart.js"></script></body></html>
\ 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 aabccc5..f80ce15 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
@@ -1,19320 +1,35820 @@
 // Generated by dart2js, the Dart to JavaScript compiler.
-(function($){function dart(){this.x=0}var A=new dart
-delete A.x
-var B=new dart
-delete B.x
-var C=new dart
-delete C.x
-var D=new dart
-delete D.x
-var E=new dart
-delete E.x
-var F=new dart
-delete F.x
-var G=new dart
-delete G.x
-var H=new dart
-delete H.x
-var J=new dart
-delete J.x
-var K=new dart
-delete K.x
-var L=new dart
-delete L.x
-var M=new dart
-delete M.x
-var N=new dart
-delete N.x
-var O=new dart
-delete O.x
-var P=new dart
-delete P.x
-var Q=new dart
-delete Q.x
-var R=new dart
-delete R.x
-var S=new dart
-delete S.x
-var T=new dart
-delete T.x
-var U=new dart
-delete U.x
-var V=new dart
-delete V.x
-var W=new dart
-delete W.x
-var X=new dart
-delete X.x
-var Y=new dart
-delete Y.x
-var Z=new dart
-delete Z.x
-function I(){}
-init()
-$=I.p
-var $$={}
-;(function(a){"use strict"
-function map(b){b={x:b}
-delete b.x
-return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
-if(h==="^")continue
-var g=a3[h]
-var f=h.substring(0,1)
-var e
-if(f==="+"){v[e]=h.substring(1)
-var d=a3[h]
-if(d>0)a3[e].$reflectable=d
-if(g&&g.length)init.typeInformation[e]=g}else if(f==="@"){h=h.substring(1)
-$[h]["@"]=g}else if(f==="*"){n[e].$defaultValues=g
-var c=a3.$methodsWithOptionalArguments
-if(!c){a3.$methodsWithOptionalArguments=c={}}c[h]=e}else if(typeof g==="function"){n[e=h]=g
-i.push(h)
-init.globalFunctions[h]=g}else if(g.constructor===Array){addStubs(n,g,h,true,a3,i)}else{e=h
-var b={}
-var a0
-for(var a1 in g){if(!u.call(g,a1))continue
-f=a1.substring(0,1)
-if(a1==="static"){processStatics(init.statics[h]=g[a1])}else if(f==="+"){w[a0]=a1.substring(1)
-var d=g[a1]
-if(d>0)g[a0].$reflectable=d}else if(f==="@"&&a1!=="@"){b[a1.substring(1)]["@"]=g[a1]}else if(f==="*"){b[a0].$defaultValues=g[a1]
-var c=b.$methodsWithOptionalArguments
-if(!c){b.$methodsWithOptionalArguments=c={}}c[a1]=a0}else{var a2=g[a1]
-if(a1!=="^"&&a2!=null&&a2.constructor===Array&&a1!=="<>"){addStubs(b,a2,a1,false,g,[])}else{b[a0=a1]=a2}}}$$[h]=[n,b]
-j.push(h)}}}function addStubs(b3,b4,b5,b6,b7,b8){var h,g=[b7[b5]=b3[b5]=h=b4[0]]
-h.$stubName=b5
-b8.push(b5)
-for(var f=0;f<b4.length;f+=2){h=b4[f+1]
-if(typeof h!="function")break
-h.$stubName=b4[f+2]
-g.push(h)
-if(h.$stubName){b7[h.$stubName]=b3[h.$stubName]=h
-b8.push(h.$stubName)}}for(var e=0;e<g.length;f++,e++){g[e].$callName=b4[f+1]}var d=b4[++f]
-b4=b4.slice(++f)
-var c=b4[0]
-var b=c>>1
-var a0=(c&1)===1
-var a1=c===3
-var a2=c===1
-var a3=b4[1]
-var a4=a3>>1
-var a5=(a3&1)===1
-var a6=b+a4!=g[0].length
-var a7=b4[2]
-var a8=2*a4+b+3
-var a9=b4.length>a8
-if(d){h=tearOff(g,b4,b6,b5,a6)
-b3[b5].$getter=h
-h.$getterStub=true
-if(b6)init.globalFunctions[b5]=h
-b7[d]=b3[d]=h
-g.push(h)
-if(d)b8.push(d)
-h.$stubName=d
-h.$callName=null
-if(a6)init.interceptedNames[d]=true}if(a9){for(var e=0;e<g.length;e++){g[e].$reflectable=1
-g[e].$reflectionInfo=b4}var b0=b6?init.mangledGlobalNames:init.mangledNames
-var b1=b4[a8]
-var b2=b1
-if(d)b0[d]=b2
-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.wh("+"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.wh("+"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.wh(this,b,c,false,[f],d)
-return new h(this,b[0],f,d)}:function(){if(h===null)h=H.wh(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.wh(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=[]
-if(!init.mangledNames)init.mangledNames=map()
-if(!init.mangledGlobalNames)init.mangledGlobalNames=map()
-if(!init.statics)init.statics=map()
-if(!init.typeInformation)init.typeInformation=map()
-if(!init.globalFunctions)init.globalFunctions=map()
-if(!init.interceptedNames)init.interceptedNames=map()
-var x=init.libraries
-var w=init.mangledNames
-var v=init.mangledGlobalNames
-var u=Object.prototype.hasOwnProperty
-var t=a.length
-for(var s=0;s<t;s++){var r=a[s]
-var q=r[0]
-var p=r[1]
-var o=r[2]
-var n=r[3]
-var m=r[4]
-var l=!!r[5]
-var k=m&&m["^"]
-if(k instanceof Array)k=k[0]
-var j=[]
-var i=[]
-processStatics(m)
-x.push([q,p,j,i,o,k,l,n])}})([["_foreign_helper","dart:_foreign_helper",,H,{
-"^":"",
-FK2:{
-"^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
-"^":"",
-x:function(a){return void 0},
-Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-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
-if(!1===y)return z.i
-if(!0===y)return a
-x=Object.getPrototypeOf(a)
-if(y===x)return z.i
-if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
-if(w==null){y=Object.getPrototypeOf(a)
-if(y==null||y===Object.prototype)return C.Sx
-else return C.vB}return w},
-TZ:function(a){var z,y,x,w
-z=$.Au
-if(z==null)return
-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},
-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]},
-KE:function(a,b){var z,y,x
-z=J.TZ(a)
-if(z==null)return
-y=$.Au
-x=z+2
-if(x>=y.length)return H.e(y,x)
-return y[x][b]},
-Gv:{
-"^":"a;",
-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,68],
-gbx:function(a){return new H.cu(H.dJ(a),null)},
-"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
-yEe:{
-"^":"Gv;",
-bu:function(a){return String(a)},
-giO:function(a){return a?519018:218159},
-gbx:function(a){return C.HL},
-$isa2:true},
-CDU:{
-"^":"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,68]},
-Ue1:{
-"^":"Gv;",
-giO:function(a){return 0},
-gbx:function(a){return C.lU}},
-Ai:{
-"^":"Ue1;"},
-kdQ:{
-"^":"Ue1;"},
-Q:{
-"^":"Gv;",
-h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},
-KI:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(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]},
-xe:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-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"))
-H.IC(a,b,c)},
-Rz:function(a,b){var z
-if(!!a.fixed$length)H.vh(P.f("remove"))
-for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
-return!0}return!1},
-ad:function(a,b){return H.VM(new H.U5(a,b),[null])},
-lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},31],
-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.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},31],
-zV:function(a,b){var z,y,x,w
-z=a.length
-y=Array(z)
-y.fixed$length=init
-for(x=0;x<a.length;++x){w=H.d(a[x])
-if(x>=z)return H.e(y,x)
-y[x]=w}return y.join(b)},
-eR:function(a,b){return H.q9(a,b,null,null)},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-aM:function(a,b,c){if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))
-if(b===c)return H.VM([],[H.Kp(a,0)])
-return H.VM(a.slice(b,c),[H.Kp(a,0)])},
-Mu:function(a,b,c){H.xF(a,b,c)
-return H.q9(a,b,c,null)},
-gtH: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]
-throw H.b(P.w("No elements"))},
-UZ:function(a,b,c){var z
-if(!!a.fixed$length)H.vh(P.f("removeRange"))
-z=a.length
-if(b<0||b>z)throw H.b(P.TE(b,0,z))
-if(c<b||c>z)throw H.b(P.TE(c,b,z))
-H.tb(a,c,a,b,z-c)
-this.sB(a,z-(c-b))},
-Vr:function(a,b){return H.Ck(a,b)},
-GT:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
-H.rd(a,b)},
-Jd:function(a){return this.GT(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)},
-Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
-cn:function(a,b){return this.Pk(a,b,null)},
-tg:function(a,b){var z
-for(z=0;z<a.length;++z)if(J.xC(a[z],b))return!0
-return!1},
-gl0:function(a){return a.length===0},
-gor:function(a){return a.length!==0},
-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)])
-z.fixed$length=init
-return z}},
-br:function(a){return this.tt(a,!0)},
-gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
-giO:function(a){return H.eQ(a)},
-gB:function(a){return a.length},
-sB:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0)throw H.b(P.N(b))
-if(!!a.fixed$length)H.vh(P.f("set length"))
-a.length=b},
-t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},
-u:function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
-if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b>=a.length||b<0)throw H.b(P.N(b))
-a[b]=c},
-$isQ:true,
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{Zz:function(a,b){var z
-if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(P.u("Length must be a non-negative integer: "+H.d(a)))
-z=H.VM(new Array(a),[b])
-z.fixed$length=init
-return z}}},
-P:{
-"^":"Gv;",
-iM:function(a,b){var z
-if(typeof b!=="number")throw H.b(P.u(b))
-if(a<b)return-1
-else if(a>b)return 1
-else if(a===b){if(a===0){z=this.gzP(b)
-if(this.gzP(a)===z)return 0
-if(this.gzP(a))return-1
-return 1}return 0}else if(isNaN(a)){if(this.gG0(b))return 0
-return 1}else return-1},
-gzP:function(a){return a===0?1/a<0:a<0},
-gG0:function(a){return isNaN(a)},
-gx8:function(a){return isFinite(a)},
-JV:function(a,b){return a%b},
-Vy:function(a){return Math.abs(a)},
-yu:function(a){var z
-if(a>=-2147483648&&a<=2147483647)return a|0
-if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
-return z+0}throw H.b(P.f(''+a))},
-HG:function(a){return this.yu(this.UD(a))},
-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.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.KP(b))
-return a.toString(b)},
-bu:function(a){if(a===0&&1/a<0)return"-0.0"
-else return""+a},
-giO:function(a){return a&0x1FFFFFFF},
-J:function(a){return-a},
-g:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a+b},
-W:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a-b},
-V:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a/b},
-U:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a*b},
-Y:function(a,b){var z
-if(typeof b!=="number")throw H.b(P.u(b))
-z=a%b
-if(z===0)return 0
-if(z>0)return z
-if(b<0)return z-b
-else return z+b},
-Z:function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
-else{if(typeof b!=="number")H.vh(P.u(b))
-return this.yu(a/b)}},
-cU:function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},
-O:function(a,b){if(b<0)throw H.b(P.u(b))
-return b>31?0:a<<b>>>0},
-W4:function(a,b){return b>31?0:a<<b>>>0},
-m:function(a,b){var z
-if(b<0)throw H.b(P.u(b))
-if(a>0)z=b>31?0:a>>>b
-else{z=b>31?31:b
-z=a>>z>>>0}return z},
-GG:function(a,b){var z
-if(a>0)z=b>31?0:a>>>b
-else{z=b>31?31:b
-z=a>>z>>>0}return z},
-i:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return(a&b)>>>0},
-w:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return(a^b)>>>0},
-C:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a<b},
-D:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a>b},
-E:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a<=b},
-F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a>=b},
-gbx:function(a){return C.yT},
-$isFK:true,
-static:{"^":"Ng,N6l"}},
-imn:{
-"^":"P;",
-gbx:function(a){return C.yw},
-$isCP:true,
-$isFK:true,
-$isKN:true},
-Yn:{
-"^":"P;",
-gbx:function(a){return C.CR},
-$isCP:true,
-$isFK:true},
-O:{
-"^":"Gv;",
-j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0)throw H.b(P.N(b))
-if(b>=a.length)throw H.b(P.N(b))
-return a.charCodeAt(b)},
-dd:function(a,b){return H.ZT(a,b)},
-wL:function(a,b,c){var z,y,x,w
-if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
-z=a.length
-y=b.length
-if(c+z>y)return
-for(x=0;x<z;++x){w=c+x
-if(w<0)H.vh(P.N(w))
-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.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
-z=b.length
-y=a.length
-if(z>y)return!1
-return b===this.yn(a,y-z)},
-h8:function(a,b,c){return H.ys(a,b,c)},
-Fr:function(a,b){if(b==null)H.vh(P.u(null))
-if(typeof b==="string")return a.split(b)
-else if(!!J.x(b).$isVR)return a.split(b.Ej)
-else throw H.b("String.split(Pattern) UNIMPLEMENTED")},
-Ys:function(a,b,c){var z
-if(c>a.length)throw H.b(P.TE(c,0,a.length))
-z=c+b.length
-if(z>a.length)return!1
-return b===a.substring(c,z)},
-nC:function(a,b){return this.Ys(a,b,0)},
-Nj:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
-if(c==null)c=a.length
-if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
-if(b<0)throw H.b(P.N(b))
-if(typeof c!=="number")return H.s(c)
-if(b>c)throw H.b(P.N(b))
-if(c>a.length)throw H.b(P.N(c))
-return a.substring(b,c)},
-yn:function(a,b){return this.Nj(a,b,null)},
-hc:function(a){return a.toLowerCase()},
-bS:function(a){var z,y,x,w,v
-z=a.trim()
-y=z.length
-if(y===0)return z
-if(this.j(z,0)===133){x=J.mm(z,1)
-if(x===y)return""}else x=0
-w=y-1
-v=this.j(z,w)===133?J.r9(z,w):y
-if(x===0&&v===y)return z
-return z.substring(x,v)},
-U:function(a,b){var z,y
-if(typeof b!=="number")return H.s(b)
-if(0>=b)return""
-if(b===1||a.length===0)return a
-if(b!==b>>>0)throw H.b(C.Eq)
-for(z=a,y="";!0;){if((b&1)===1)y=z+y
-b=b>>>1
-if(b===0)break
-z+=z}return y},
-XU:function(a,b,c){var z,y,x,w
-if(b==null)H.vh(P.u(null))
-if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
-if(typeof b==="string")return a.indexOf(b,c)
-z=J.x(b)
-if(!!z.$isVR){y=b.yk(a,c)
-return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},
-u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){var z,y
-c=a.length
-z=b.length
-y=a.length
-if(c+z>y)c=y-z
-return a.lastIndexOf(b,c)},
-cn:function(a,b){return this.Pk(a,b,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.b0(a,b,c)},
-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
-if(typeof b!=="string")throw H.b(P.u(b))
-if(a===b)z=0
-else z=a<b?-1:1
-return z},
-bu:function(a){return a},
-giO:function(a){var z,y,x
-for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
-y=536870911&y+((524287&y)<<10>>>0)
-y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
-y^=y>>11
-return 536870911&y+((16383&y)<<15>>>0)},
-gbx:function(a){return C.Db},
-gB:function(a){return a.length},
-t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},
-$isqU:true,
-static:{Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
-default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},mm:function(a,b){var z,y
-for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
-y=a.charCodeAt(b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y,x
-for(z=a.length;b>0;b=y){y=b-1
-if(y>=z)H.vh(P.N(y))
-x=a.charCodeAt(y)
-if(x!==32&&x!==13&&!J.Ga(x))break}return b}}}}],["_isolate_helper","dart:_isolate_helper",,H,{
-"^":"",
-dB:function(a,b){var z=a.vV(0,b)
-init.globalState.Xz.bL()
-return z},
-cv:function(){--init.globalState.Xz.GL},
-wW:function(a,b){var z,y,x,w,v,u
-z={}
-z.a=b
-b=b
-z.a=b
-if(b==null){b=[]
-z.a=b
-y=b}else y=b
-if(!J.x(y).$isWO)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
-y=new H.pq(0,0,1,null,null,null,null,null,null,null,null,null,a)
-y.qi(a)
-init.globalState=y
-if(init.globalState.EF===!0)return
-y=init.globalState.Hg++
-x=P.L5(null,null,null,P.KN,H.yo)
-w=P.Ls(null,null,null,P.KN)
-v=new H.yo(0,null,!1)
-u=new H.aX(y,x,w,new I(),v,P.N3(),P.N3(),!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.Nr=u
-init.globalState.N0=u
-y=H.G3()
-x=H.KT(y,[y]).BD(a)
-if(x)u.vV(0,new H.PK(z,a))
-else{y=H.KT(y,[y,y]).BD(a)
-if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},
-yl:function(){var z=init.currentScript
-if(z!=null)return String(z.src)
-if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.mf()
-if(typeof version=="function"&&typeof system=="function")return thisFilename()
-if(init.globalState.EF===!0)return H.mf()
-return},
-mf:function(){var z,y
-z=new Error().stack
-if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
-if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
-if(y!=null)return y[1]
-y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
-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
-z=H.Hh(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"))
-t=y.t(z,"isSpawnUri")
-s=y.t(z,"startPaused")
-r=H.Hh(y.t(z,"replyTo"))
-y=init.globalState.Hg++
-q=P.L5(null,null,null,P.KN,H.yo)
-p=P.Ls(null,null,null,P.KN)
-o=new H.yo(0,null,!1)
-n=new H.aX(y,q,p,new I(),o,P.N3(),P.N3(),!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)
-init.globalState.Xz.Rk.NZ(0,new H.IY(n,new H.mN(w,v,u,t,s,r),"worker-start"))
-init.globalState.N0=n
-init.globalState.Xz.bL()
-break
-case"spawn-worker":m=y.t(z,"replyPort")
-H.EN(y.t(z,"functionName"),y.t(z,"uri"),y.t(z,"args"),y.t(z,"msg"),!1,y.t(z,"isSpawnUri"),y.t(z,"startPaused")).Rx(new H.xn(m),new H.jl3(m))
-break
-case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
-init.globalState.Xz.bL()
-break
-case"close":init.globalState.XC.Rz(0,$.p6().t(0,a))
-a.terminate()
-init.globalState.Xz.bL()
-break
-case"log":H.ZF(y.t(z,"msg"))
-break
-case"print":if(init.globalState.EF===!0){y=init.globalState.rj
-q=H.t0(P.EF(["command","print","msg",z],null,null))
-y.toString
-self.postMessage(q)}else P.FL(y.t(z,"msg"))
-break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","nW",4,0,null,0,1],
-ZF:function(a){var z,y,x,w
-if(init.globalState.EF===!0){y=init.globalState.rj
-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.XO(w,null)
-throw H.b(P.FM(z))}},
-EN:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-if(b!=null&&J.VT(b,".dart"))b=J.ew(b,".js")
-z=P.hM()
-y=H.VM(new P.Zf(P.Dt(null)),[null])
-z.gtH(z).ml(new H.WK(y))
-x=new H.ws(z.vl,init.globalState.N0.jO)
-if(init.globalState.ji===!0&&!e)if(init.globalState.EF===!0){w=init.globalState.rj
-v=H.t0(P.EF(["command","spawn-worker","functionName",a,"args",c,"msg",d,"uri",b,"isSpawnUri",f,"startPaused",g,"replyPort",x],null,null))
-w.toString
-self.postMessage(v)}else{if(b==null)b=$.Zt()
-u=new Worker(b)
-u.onerror=function(h,i,j){return function(k){return h(k,i,j)}}(H.GA,b,new H.tZ(y))
-u.onmessage=function(h,i){return function(j){j.onerror=null
-return h(i,j)}}(H.Mg,u)
-w=init.globalState.Y7++
-$.p6().u(0,u,w)
-init.globalState.XC.u(0,w,u)
-u.postMessage(H.t0(P.EF(["command","start","id",w,"replyTo",H.t0(x),"args",c,"msg",H.t0(d),"isSpawnUri",f,"startPaused",g,"functionName",a],null,null)))}else H.Ff(a,b,c,d,f,g,x)
-return y.MM},
-Ff:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-z={}
-z.a=c
-z.b=d
-if(b!=null)throw H.b(P.f("Currently spawnUri is not supported without web workers."))
-z.b=H.t0(d)
-z.a=H.t0(z.a)
-y=init.globalState.Xz
-x=init.globalState.Hg++
-w=P.L5(null,null,null,P.KN,H.yo)
-v=P.Ls(null,null,null,P.KN)
-u=new H.yo(0,null,!1)
-w=new H.aX(x,w,v,new I(),u,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-v.h(0,0)
-w.O9(0,u)
-y.Rk.NZ(0,new H.IY(w,new H.hI(z,a,e,f,g),"nonworker start"))},
-Di:function(a,b,c,d,e,f){var z,y,x,w
-z=init.globalState.N0
-y=z.jO
-$.z7=$.z7+("_"+y)
-$.eb=$.eb+("_"+y)
-y=z.EE
-x=init.globalState.N0.jO
-w=z.um
-J.H4(f,["spawned",new H.ws(y,x),w,z.PX])
-x=new H.vK(a,b,c,d,z)
-if(e===!0){z.V0(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
-GA:[function(a,b,c){var z
-a.preventDefault()
-z=a.message
-c.$1(z==null?"Error spawning worker for "+H.d(b):"Error spawning worker for "+H.d(b)+" ("+z+")")
-return!0},"$3","dd",6,0,null,2,3,4],
-t0:function(a){var z
-if(init.globalState.ji===!0){z=new H.NA(0,new H.cx())
-z.mR=new H.m3(null)
-return z.Zo(a)}else{z=new H.Qt(new H.cx())
-z.mR=new H.m3(null)
-return z.Zo(a)}},
-Hh: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:{
-"^":"Tp:69;a,b",
-$0:function(){this.b.$1(this.a.a)},
-$isEH:true},
-JO:{
-"^":"Tp:69;a,c",
-$0:function(){this.c.$2(this.a.a,null)},
-$isEH:true},
-pq:{
-"^":"a;Hg,oL,Y7,N0,Nr,Xz,Ai,EF,ji,iR<,rj,XC,w2<",
-qi:function(a){var z,y,x,w
-z=$.Vr()==null
-y=$.rm()
-x=z&&$.ey()===!0
-this.EF=x
-if(!x)y=y!=null&&$.Zt()!=null
-else y=!0
-this.ji=y
-this.Ai=z&&!x
-y=H.IY
-x=H.VM(new P.Sw(null,0,0,0),[y])
-x.Eo(null,y)
-this.Xz=new H.cC(x,0)
-this.iR=P.L5(null,null,null,P.KN,H.aX)
-this.XC=P.L5(null,null,null,P.KN,null)
-if(this.EF===!0){z=new H.JH()
-this.rj=z
-w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
-$.jk().onmessage=w
-$.jk().dartPrint=function(b){}}}},
-aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lw,CN,M2,mf,pa,ir",
-V0:function(a,b){if(!this.um.n(0,a))return
-if(this.lw.h(0,b)&&!this.UF)this.UF=!0
-this.PC()},
-NR:function(a){var z,y,x,w,v,u
-if(!this.UF)return
-z=this.lw
-z.Rz(0,a)
-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
-v=y.v5
-u=v.length
-w=(w-1&u-1)>>>0
-y.av=w
-if(w<0||w>=u)return H.e(v,w)
-v[w]=x
-if(w===y.eZ)y.M9();++y.qT}this.UF=!1}this.PC()},
-iK:function(a){var z=this.CN
-if(z==null){z=[]
-this.CN=z}if(J.x5(z,a))return
-this.CN.push(a)},
-IB:function(a){var z=this.CN
-if(z==null)return
-J.V1(z,a)},
-JZ:function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},
-ZC:function(a,b){var z,y
-z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.mf
-else y=!0
-if(y){J.H4(a,null)
-return}y=new H.NY(a)
-if(z.n(b,2)){init.globalState.Xz.Rk.NZ(0,new H.IY(this,y,"ping"))
-return}z=this.M2
-if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Eo(null,null)
-this.M2=z}z.NZ(0,y)},
-bc:function(a,b){var z,y
-if(!this.PX.n(0,a))return
-z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.mf
-else y=!0
-if(y){this.Dm()
-return}if(z.n(b,2)){z=init.globalState.Xz
-y=this.gIm()
-z.Rk.NZ(0,new H.IY(this,y,"kill"))
-return}z=this.M2
-if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Eo(null,null)
-this.M2=z}z.NZ(0,this.gIm())},
-hk:function(a,b){var z,y
-z=this.ir
-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)
-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)
-for(z=H.VM(new P.zQ(z,z.zN,null,null),[null]),z.zq=z.O2.H9;z.G();)J.H4(z.fD,y)},
-vV:[function(a,b){var z,y,x,w,v,u
-z=init.globalState.N0
-init.globalState.N0=this
-$=this.En
-y=null
-this.mf=!0
-try{y=b.$0()}catch(v){u=H.Ru(v)
-x=u
-w=new H.XO(v,null)
-this.hk(x,w)
-if(this.pa===!0){this.Dm()
-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,70,71],
-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
-case"resume":this.NR(z.t(a,1))
-break
-case"add-ondone":this.iK(z.t(a,1))
-break
-case"remove-ondone":this.IB(z.t(a,1))
-break
-case"set-errors-fatal":this.JZ(z.t(a,1),z.t(a,2))
-break
-case"ping":this.ZC(z.t(a,1),z.t(a,2))
-break
-case"kill":this.bc(z.t(a,1),z.t(a,2))
-break
-case"getErrors":this.ir.h(0,z.t(a,1))
-break
-case"stopErrors":this.ir.Rz(0,z.t(a,1))
-break}},
-hV:function(a){return this.Gx.t(0,a)},
-O9:function(a,b){var z=this.Gx
-if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.u(0,a,b)},
-PC:function(){if(this.Gx.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.iR.u(0,this.jO,this)
-else this.Dm()},
-Dm:[function(){var z,y
-z=this.M2
-if(z!=null)z.V1(0)
-for(z=this.Gx,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.pr()
-z.V1(0)
-this.fW.V1(0)
-init.globalState.iR.Rz(0,this.jO)
-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.H4(z.lo,null)
-this.CN=null}},"$0","gIm",0,0,18],
-$isaX:true},
-NY:{
-"^":"Tp:18;a",
-$0:[function(){J.H4(this.a,null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-cC:{
-"^":"a;Rk,GL",
-mj:function(){var z=this.Rk
-if(z.av===z.eZ)return
-return z.AR()},
-xB:function(){var z,y,x
-z=this.mj()
-if(z==null){if(init.globalState.Nr!=null&&init.globalState.iR.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.iR.X5===0&&y.Xz.GL===0){y=y.rj
-x=H.t0(P.EF(["command","close"],null,null))
-y.toString
-self.postMessage(x)}return!1}J.R1(z)
-return!0},
-oV:function(){if($.Vr()!=null)new H.Rm(this).$0()
-else for(;this.xB(););},
-bL:function(){var z,y,x,w,v
-if(init.globalState.EF!==!0)this.oV()
-else try{this.oV()}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-w=init.globalState.rj
-v=H.t0(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
-w.toString
-self.postMessage(v)}}},
-Rm:{
-"^":"Tp:18;a",
-$0:[function(){if(!this.a.xB())return
-P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
-$isEH:true},
-IY:{
-"^":"a;od*,i3,G1>",
-Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
-return}J.QT(this.od,this.i3)},"$0","gNN",0,0,18],
-$isIY:true},
-JH:{
-"^":"a;"},
-mN:{
-"^":"Tp:69;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},
-xn:{
-"^":"Tp:13;UI",
-$1:[function(a){J.H4(this.UI,a)},"$1",null,2,0,null,72,"call"],
-$isEH:true},
-jl3:{
-"^":"Tp:5;bK",
-$1:[function(a){J.H4(this.bK,["spawn failed",a])},"$1",null,2,0,null,73,"call"],
-$isEH:true},
-WK:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y
-z=J.U6(a)
-y=this.a
-if(J.xC(z.t(a,0),"spawned")){z=y.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(a)}else y.pm(z.t(a,1))},"$1",null,2,0,null,72,"call"],
-$isEH:true},
-tZ:{
-"^":"Tp:5;b",
-$1:[function(a){return this.b.pm(a)},"$1",null,2,0,null,74,"call"],
-$isEH:true},
-hI:{
-"^":"Tp:69;a,b,c,d,e",
-$0:[function(){var z=this.a
-H.Di(init.globalFunctions[this.b](),z.a,z.b,this.c,this.d,this.e)},"$0",null,0,0,null,"call"],
-$isEH:true},
-vK:{
-"^":"Tp:18;a,b,c,d,e",
-$0:[function(){var z,y,x
-this.e.sxF(!0)
-if(this.d!==!0)this.a.$1(this.c)
-else{z=this.a
-y=H.G3()
-x=H.KT(y,[y,y]).BD(z)
-if(x)z.$2(this.b,this.c)
-else{y=H.KT(y,[y]).BD(z)
-if(y)z.$1(this.b)
-else z.$0()}}},"$0",null,0,0,null,"call"],
-$isEH:true},
-Iy4:{
-"^":"a;",
-$isbC:true,
-$isXY:true},
-ws:{
-"^":"Iy4;JE,tv",
-wR:function(a,b){var z,y,x,w,v
-z={}
-y=this.tv
-x=init.globalState.iR.t(0,y)
-if(x==null)return
-w=this.JE
-if(w.gKS())return
-v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
-z.a=b
-if(v)z.a=H.t0(b)
-if(x.gEE()===w){x.Ds(z.a)
-return}y=init.globalState.Xz
-w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isws&&J.xC(this.JE,b.JE)},
-giO:function(a){return J.ki(this.JE)},
-$isws:true,
-$isbC:true,
-$isXY:true},
-Ua:{
-"^":"Tp:69;a,b,c",
-$0:[function(){var z,y
-z=this.b.JE
-if(!z.gKS()){if(this.c){y=this.a
-y.a=H.Hh(y.a)}J.n0(z,this.a.a)}},"$0",null,0,0,null,"call"],
-$isEH:true},
-bM:{
-"^":"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.rj.toString
-self.postMessage(z)}else{y=init.globalState.XC.t(0,this.ZU)
-if(y!=null)y.postMessage(z)}},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isbM&&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.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},
-$isbM:true,
-$isbC:true,
-$isXY:true},
-yo:{
-"^":"a;qK>,D1,KS<",
-aV:function(a){return this.D1.$1(a)},
-pr:function(){this.KS=!0
-this.D1=null},
-S6:function(a){var z,y
-if(this.KS)return
-this.KS=!0
-this.D1=null
-z=init.globalState.N0
-y=this.qK
-z.Gx.Rz(0,y)
-z.fW.Rz(0,y)
-z.PC()},
-Rf:function(a,b){if(this.KS)return
-this.aV(b)},
-$isyo:true,
-static:{"^":"Vz"}},
-fc:{
-"^":"cb;vl,da",
-KR:function(a,b,c,d){var z=this.da
-z.toString
-return H.VM(new P.O9(z),[null]).KR(a,b,c,d)},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-S6:[function(a){this.vl.S6(0)
-this.da.S6(0)},"$0","gJK",0,0,18],
-TL:function(a){var z=P.x2(this.gJK(this),null,null,null,!0,null)
-this.da=z
-this.vl.D1=z.ght(z)},
-$ascb:function(){return[null]},
-$iscb:true},
-NA:{
-"^":"jP1;Ao,mR",
-DE:function(a){if(!!a.$isws)return["sendport",init.globalState.oL,a.tv,J.ki(a.JE)]
-if(!!a.$isbM)return["sendport",a.ZU,a.tv,a.bv]
-throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return["capability",a.qK]
-throw H.b("Capability not serializable: "+a.bu(0))}},
-Qt:{
-"^":"ooy;mR",
-DE:function(a){if(!!a.$isws)return new H.ws(a.JE,a.tv)
-if(!!a.$isbM)return new H.bM(a.ZU,a.bv,a.tv)
-throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return new H.iV(a.qK)
-throw H.b("Capability not serializable: "+a.bu(0))}},
-BV:{
-"^":"fPc;RZ",
-Vf:function(a){var z,y,x,w,v,u
-z=J.U6(a)
-y=z.t(a,1)
-x=z.t(a,2)
-w=z.t(a,3)
-if(J.xC(y,init.globalState.oL)){v=init.globalState.iR.t(0,x)
-if(v==null)return
-u=v.hV(w)
-if(u==null)return
-return new H.ws(u,x)}else return new H.bM(y,w,x)},
-Op:function(a){return new H.iV(J.UQ(a,1))}},
-m3:{
-"^":"a;MD",
-t:function(a,b){return b.__MessageTraverser__attached_info__},
-u:function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},
-CH:function(a){this.MD=[]},
-no:function(){var z,y,x
-for(z=this.MD.length,y=0;y<z;++y){x=this.MD
-if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.MD=null}},
-cx:{
-"^":"a;",
-t:function(a,b){return},
-u:function(a,b,c){},
-CH:function(a){},
-no:function(){}},
-BB:{
-"^":"a;",
-Zo:function(a){var z
-if(H.vM(a))return this.Pq(a)
-this.mR.CH(0)
-z=null
-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.$isbC)return this.DE(a)
-if(!!z.$isXY)return this.yf(a)
-return this.N1(a)},
-N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
-ooy:{
-"^":"BB;",
-Pq:function(a){return a},
-wb:function(a){var z,y,x,w
-z=this.mR.t(0,a)
-if(z!=null)return z
-y=J.U6(a)
-x=y.gB(a)
-z=Array(x)
-z.fixed$length=init
-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
-z={}
-y=this.mR.t(0,a)
-z.a=y
-if(y!=null)return y
-y=P.L5(null,null,null,null,null)
-z.a=y
-this.mR.u(0,a,y)
-a.aN(0,new H.OW(z,this))
-return z.a},
-DE:function(a){return H.vh(P.SY(null))},
-yf:function(a){return H.vh(P.SY(null))}},
-OW:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.Q9(a),z.Q9(b))},"$2",null,4,0,null,75,76,"call"],
-$isEH:true},
-jP1:{
-"^":"BB;",
-Pq:function(a){return a},
-wb: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["list",y,this.mE(a)]},
-TI: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)))]},
-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.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))},
-yf:function(a){return H.vh(P.SY(null))}},
-fPc:{
-"^":"a;",
-ug:function(a){if(H.ZR(a))return a
-this.RZ=P.YM(null,null,null,null,null)
-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)
-return this.RZ.t(0,y)
-case"list":return this.Dj(a)
-case"map":return this.GD(a)
-case"sendport":return this.Vf(a)
-case"capability":return this.Op(a)
-default:return this.PR(a)}},
-Dj:function(a){var z,y,x,w,v
-z=J.U6(a)
-y=z.t(a,1)
-x=z.t(a,2)
-this.RZ.u(0,y,x)
-z=J.U6(x)
-w=z.gB(x)
-if(typeof w!=="number")return H.s(w)
-v=0
-for(;v<w;++v)z.u(x,v,this.D5(z.t(x,v)))
-return x},
-GD:function(a){var z,y,x,w,v,u,t,s
-z=P.L5(null,null,null,null,null)
-y=J.U6(a)
-x=y.t(a,1)
-this.RZ.u(0,x,z)
-w=y.t(a,2)
-v=y.t(a,3)
-y=J.U6(w)
-u=y.gB(w)
-if(typeof u!=="number")return H.s(u)
-t=J.U6(v)
-s=0
-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")}},
-Oe:{
-"^":"a;Om,zu,p9",
-ed:function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
-if(this.p9==null)return
-H.cv()
-if(this.Om)$.jk().clearTimeout(this.p9)
-else $.jk().clearInterval(this.p9)
-this.p9=null}else throw H.b(P.f("Canceling a timer."))},
-Qa:function(a,b){var z,y
-if(a===0)z=$.jk().setTimeout==null||init.globalState.EF===!0
-else z=!1
-if(z){this.p9=1
-z=init.globalState.Xz
-y=init.globalState.N0
-z.Rk.NZ(0,new H.IY(y,new H.Av(this,b),"timer"))
-this.zu=!0}else{z=$.jk()
-if(z.setTimeout!=null){++init.globalState.Xz.GL
-this.p9=z.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))}},
-static:{cy:function(a,b){var z=new H.Oe(!0,!1,null)
-z.Qa(a,b)
-return z}}},
-Av:{
-"^":"Tp:18;a,b",
-$0:[function(){this.a.p9=null
-this.b.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-vt:{
-"^":"Tp:18;c,d",
-$0:[function(){this.c.p9=null
-H.cv()
-this.d.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-iV:{
-"^":"a;qK>",
-giO:function(a){var z,y,x
-z=this.qK
-y=J.Wx(z)
-x=y.m(z,0)
-y=y.Z(z,4294967296)
-if(typeof y!=="number")return H.s(y)
-z=x^y
-z=(~z>>>0)+(z<<15>>>0)&4294967295
-z=((z^z>>>12)>>>0)*5&4294967295
-z=((z^z>>>4)>>>0)*2057&4294967295
-return(z^z>>>16)>>>0},
-n:function(a,b){var z,y
-if(b==null)return!1
-if(b===this)return!0
-if(!!J.x(b).$isiV){z=this.qK
-y=b.qK
-return z==null?y==null:z===y}return!1},
-$isiV:true,
-$isXY:true}}],["_js_helper","dart:_js_helper",,H,{
-"^":"",
-Gp:function(a,b){var z
-if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(a).$isXj},
-d:function(a){var z
-if(typeof a==="string")return a
-if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
-else if(!1===a)return"false"
-else if(a==null)return"null"
-z=J.AG(a)
-if(typeof z!=="string")throw H.b(P.u(a))
-return z},
-eQ:function(a){var z=a.$identityHash
-if(z==null){z=Math.random()*0x3fffffff|0
-a.$identityHash=z}return z},
-rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,5],
-BU:function(a,b,c){var z,y,x,w,v,u
-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
-if(2>=y)return H.e(z,2)
-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.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)
-if(!(b<10)){if(3>=z.length)return H.e(z,3)
-y=z[3]==null}else y=!0
-if(y){x=b<=10?48+b-1:97+b-10-1
-if(1>=z.length)return H.e(z,1)
-w=z[1]
-y=J.U6(w)
-v=0
-while(!0){u=y.gB(w)
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-y.j(w,0)
-if(y.j(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
-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.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)
-if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.$1(a)}return z},
-lh:function(a){var z,y
-z=C.w2(J.x(a))
-if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
-if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
-return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
-a5:function(a){return"Instance of '"+H.lh(a)+"'"},
-Ms:function(){if(typeof window!="undefined"&&window!==null){var z=window.performance
-if(z!=null&&typeof z.webkitNow=="function")return C.CD.yu(Math.floor(1000*z.webkitNow()))}return 1000*Date.now()},
-Cb:function(a){var z,y,x,w,v,u
-z=a.length
-for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
-else{u=w+500
-u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},
-YF:function(a){var z,y,x
-z=[]
-z.$builtinTypeInfo=[P.KN]
-y=new H.a7(a,a.length,0,null)
-y.$builtinTypeInfo=[H.Kp(a,0)]
-for(;y.G();){x=y.lo
-if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
-if(x<=65535)z.push(x)
-else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.Cb(z)},
-eT:function(a){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
-if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
-if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.YF(a)}return H.Cb(a)},
-Lw:function(a){var z
-if(typeof a!=="number")return H.s(a)
-if(0<=a){if(a<=65535)return String.fromCharCode(a)
-if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
-fu:function(a,b,c,d,e,f,g,h){var z,y,x,w
-if(typeof a!=="number"||Math.floor(a)!==a)H.vh(P.u(a))
-if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
-if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
-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.bI(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)
-if(x.E(a,0)||x.C(a,100)){w=new Date(y)
-if(h)w.setUTCFullYear(a)
-else w.setFullYear(a)
-return w.valueOf()}return y},
-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]},
-wV: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={}
-z.a=0
-y=[]
-x=[]
-if(b!=null){z.a=b.length
-C.Nm.FV(y,b)}z.b=""
-if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"$"+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*"]
-if(y==null)return H.zo(a,b,c)
-x=H.zh(y)
-if(x==null||!x.Mo)return H.zo(a,b,c)
-b=b!=null?P.F(b,!0,null):[]
-w=x.Rv
-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.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))
-return y.apply(a,b)}r=[]
-if(b!=null){q=b.length
-C.Nm.FV(r,b)}else q=0
-y=a["$"+q]
-if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},
-s:function(a){throw H.b(P.u(a))},
-e:function(a,b){if(a==null)J.q8(a)
-if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},
-b:function(a){var z
-if(a==null)a=new P.LK()
-z=new Error()
-z.dartException=a
-if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.tM})
-z.name=""}else z.toString=H.tM
-return z},
-tM:[function(){return J.AG(this.dartException)},"$0","p3",0,0,null],
-vh:function(a){throw H.b(a)},
-Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=new H.Am(a)
-if(a==null)return
-if(typeof a!=="object")return a
-if("dartException" in a)return z.$1(a.dartException)
-else if(!("message" in a))return a
-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.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=$.Up()
-t=$.PH()
-s=$.D1()
-r=$.rx()
-q=$.kQ()
-p=$.W6()
-$.Bi()
-o=$.eA()
-n=$.ko()
-m=v.qS(y)
-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.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)
-if(m==null){m=p.qS(y)
-if(m==null){m=s.qS(y)
-if(m==null){m=o.qS(y)
-if(m==null){m=n.qS(y)
-v=m!=null}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0
-if(v){v=m==null?null:m.method
-return z.$1(new H.Zo(y,v))}}}v=typeof y==="string"?y:""
-return z.$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.KY()
-return z.$1(new P.AT(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.KY()
-return a},
-CU:function(a){if(a==null||typeof a!='object')return J.v1(a)
-else return H.eQ(a)},
-B7:function(a,b){var z,y,x,w
-z=a.length
-for(y=0;y<z;y=w){x=y+1
-w=x+1
-b.u(0,a[y],a[x])}return b},
-El:[function(a,b,c,d,e,f,g){var z=J.x(c)
-if(z.n(c,0))return H.dB(b,new H.dr(a))
-else if(z.n(c,1))return H.dB(b,new H.TL(a,d))
-else if(z.n(c,2))return H.dB(b,new H.uZ(a,d,e))
-else if(z.n(c,3))return H.dB(b,new H.OQ(a,d,e,f))
-else if(z.n(c,4))return H.dB(b,new H.Qx(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","ye5",14,0,null,6,7,8,9,10,11,12],
-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.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
-z=b[0]
-z.$stubName
-y=z.$callName
-z.$reflectionInfo=c
-x=H.zh(z).AM
-w=d?Object.create(new H.Bp().constructor.prototype):Object.create(new H.v(null,null,null,null).constructor.prototype)
-w.$initialize=w.constructor
-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.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.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)
-else if(u&&typeof x=="function"){q=t?H.HY:H.uj
-r=function(g,h){return function(){return g.apply({$receiver:h(this)},arguments)}}(x,q)}else throw H.b("Error in reflectionInfo.")
-w.$signature=r
-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.SD(a,o,t)
-w[n]=m}}w["call*"]=s
-return v},
-vq:function(a,b,c,d){var z=H.uj
-switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
-case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
-case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
-case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
-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)}},
-SD:function(a,b,c){var z,y,x,w,v,u
-if(c)return H.Hf(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.B3("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.B3("self")
-$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
-w=$.OK
-$.OK=J.ew(w,1)
-return new Function(v+H.d(w)+"}")()},
-Zq:function(a,b,c,d){var z,y
-z=H.uj
-y=H.HY
-switch(b?-1:a){case 0:throw H.b(H.Pa("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)
-case 4:return function(e,f,g){return function(h,i,j){return f(this)[e](g(this),h,i,j)}}(c,z,y)
-case 5:return function(e,f,g){return function(h,i,j,k){return f(this)[e](g(this),h,i,j,k)}}(c,z,y)
-case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
-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.bO()
-y=$.P4
-if(y==null){y=H.B3("receiver")
-$.P4=y}x=b.$stubName
-w=b.length
-v=typeof dart_precompiled=="function"
-u=a[x]
-t=b==null?u==null:b===u
-if(v||!t||w>=28)return H.Zq(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.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.ew(t,1)
-return new Function(y+H.d(t)+"}")()},
-wh:function(a,b,c,d,e,f){b.fixed$length=init
-c.fixed$length=init
-return H.HA(a,b,c,!!d,e,f)},
-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.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.Fp(z)
-return new H.KEA(z,b,null)},
-G3:function(){return C.KZ},
-Kx:function(a){return new H.cu(a,null)},
-VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},
-oX:function(a){if(a==null)return
-return a.$builtinTypeInfo},
-IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
-ip:function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},
-Kp:function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},
-Ko:function(a,b){if(a==null)return"dynamic"
-else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
-else if(typeof a=="function")return a.builtin$cls
-else if(typeof a==="number"&&Math.floor(a)===a)return C.jn.bu(a)
-else return},
-ia:function(a,b,c){var z,y,x,w,v,u
-if(a==null)return""
-z=P.p9("")
-for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
-else z.vM+=", "
-v=a[y]
-if(v!=null)w=!1
-u=H.Ko(v,c)
-z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
-dJ:function(a){var z=J.x(a).constructor.builtin$cls
-if(a==null)return z
-return z+H.ia(a.$builtinTypeInfo,0,null)},
-Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function"){a=H.ml(a,null,b)
-if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},
-RB:function(a,b,c,d){var z,y
-if(a==null)return!1
-z=H.oX(a)
-y=J.x(a)
-if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},
-hv:function(a,b){var z,y
-if(a==null||b==null)return!0
-z=a.length
-for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},
-XW:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
-IU:function(a,b){var z,y
-if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="c8"
-if(b==null)return!0
-z=H.oX(a)
-a=J.x(a)
-if(z!=null){y=z.slice()
-y.splice(0,0,a)}else y=a
-return H.t1(y,b)},
-t1:function(a,b){var z,y,x,w,v,u,t
-if(a===b)return!0
-if(a==null||b==null)return!0
-if("func" in b){if(!("func" in a)){if("$is_"+H.d(b.func) in a)return!0
-z=a.$signature
-if(z==null)return!1
-a=z.apply(a,null)}return H.J4(a,b)}if(b.builtin$cls==="EH"&&"func" in a)return!0
-y=typeof a==="object"&&a!==null&&a.constructor===Array
-x=y?a[0]:a
-w=typeof b==="object"&&b!==null&&b.constructor===Array
-v=w?b[0]:b
-u=H.Ko(v,null)
-if(v!==x){if(!("$is"+H.d(u) in x))return!1
-t=x["$as"+H.d(H.Ko(v,null))]}else t=null
-if(!y&&t==null||!w)return!0
-y=y?a.slice(1):null
-w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},
-Hc:function(a,b,c){var z,y,x,w,v
-if(b==null&&a==null)return!0
-if(b==null)return c
-if(a==null)return!1
-z=a.length
-y=b.length
-if(c){if(z<y)return!1}else if(z!==y)return!1
-for(x=0;x<y;++x){w=a[x]
-v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},
-Vt:function(a,b){var z,y,x,w,v,u
-if(b==null)return!0
-if(a==null)return!1
-z=Object.getOwnPropertyNames(b)
-z.fixed$length=init
-y=z
-for(z=y.length,x=0;x<z;++x){w=y[x]
-if(!Object.hasOwnProperty.call(a,w))return!1
-v=b[w]
-u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
-J4:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-if(!("func" in a))return!1
-if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
-y=b.ret
-if(!(H.t1(z,y)||H.t1(y,z)))return!1}x=a.args
-w=b.args
-v=a.opt
-u=b.opt
-t=x!=null?x.length:0
-s=w!=null?w.length:0
-r=v!=null?v.length:0
-q=u!=null?u.length:0
-if(t>s)return!1
-if(t+r<s+q)return!1
-if(t===s){if(!H.Hc(x,w,!1))return!1
-if(!H.Hc(v,u,!0))return!1}else{for(p=0;p<t;++p){o=x[p]
-n=w[p]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=p,l=0;m<s;++l,++m){o=v[l]
-n=w[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
-n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
-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))},
-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)
-y=$.q4[z]
-if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}x=$.vv[z]
-if(x!=null)return x
-w=init.interceptorsByTag[z]
-if(w==null){z=$.TX.$2(a,z)
-if(z!=null){y=$.q4[z]
-if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}x=$.vv[z]
-if(x!=null)return x
-w=init.interceptorsByTag[z]}}if(w==null)return
-x=w.prototype
-v=z[0]
-if(v==="!"){y=H.Va(x)
-$.q4[z]=y
-Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}if(v==="~"){$.vv[z]=x
-return x}if(v==="-"){u=H.Va(x)
-Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}if(v==="+")return H.B1(a,x)
-if(v==="*")throw H.b(P.SY(z))
-if(init.leafTags[z]===true){u=H.Va(x)
-Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.B1(a,x)},
-B1:function(a,b){var z,y
-z=Object.getPrototypeOf(a)
-y=J.Qu(b,z,null,null)
-Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return b},
-Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
-ow:function(a,b,c){var z=b.prototype
-if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},
-XD:function(){if(!0===$.Bv)return
-$.Bv=!0
-H.Z1()},
-Z1:function(){var z,y,x,w,v,u,t,s
-$.q4=Object.create(null)
-$.vv=Object.create(null)
-H.kO()
-z=init.interceptorsByTag
-y=Object.getOwnPropertyNames(z)
-if(typeof window!="undefined"){window
-x=function(){}
-for(w=0;w<y.length;++w){v=y[w]
-u=$.x7.$1(v)
-if(u!=null){t=H.ow(v,z[v],u)
-if(t!=null){Object.defineProperty(u,init.dispatchPropertyName,{value:t,enumerable:false,writable:true,configurable:true})
-x.prototype=u}}}}for(w=0;w<y.length;++w){v=y[w]
-if(/^[A-Za-z_]/.test(v)){s=z[v]
-z["!"+v]=s
-z["~"+v]=s
-z["-"+v]=s
-z["+"+v]=s
-z["*"+v]=s}}},
-kO:function(){var z,y,x,w,v,u,t
-z=C.MA()
-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]
-if(typeof w=="function")z=w(z)||z}}v=z.getTag
-u=z.getUnknownTag
-t=z.prototypeForTag
-$.NF=new H.dC(v)
-$.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.ns])
-y=b.length
-x=a.length
-for(w=0;!0;){v=C.xB.XU(b,a,w)
-if(v===-1)break
-z.push(new H.Vo(v,b,a))
-u=v+x
-if(u===y)break
-else w=v===u?w+1:u}return z},
-b0:function(a,b,c){var z,y
-if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
-else{z=J.x(b)
-if(!!z.$isVR){z=C.xB.yn(a,c)
-y=b.Ej
-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("")
-y=a.length
-z.KF(c)
-for(x=0;x<y;++x){w=a[x]
-w=z.vM+=w
-z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
-ysD:{
-"^":"a;",
-gl0:function(a){return J.xC(this.gB(this),0)},
-gor:function(a){return!J.xC(this.gB(this),0)},
-bu:function(a){return P.vW(this)},
-EP:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
-u:function(a,b,c){return this.EP()},
-V1:function(a){return this.EP()},
-FV:function(a,b){return this.EP()},
-$isZ0:true},
-Px:{
-"^":"ysD;B>,HV,tc",
-x4:function(a){if(typeof a!=="string")return!1
-if("__proto__"===a)return!1
-return this.HV.hasOwnProperty(a)},
-t:function(a,b){if(!this.x4(b))return
-return this.TZ(b)},
-TZ:function(a){return this.HV[a]},
-aN:function(a,b){var z,y,x
-z=this.tc
-for(y=0;y<z.length;++y){x=z[y]
-b.$2(x,this.TZ(x))}},
-gvc:function(){return H.VM(new H.XR(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Kp(this,0),H.Kp(this,1))},
-$isyN:true},
-hY:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,75,"call"],
-$isEH:true},
-XR:{
-"^":"mW;Y3",
-gA:function(a){return J.mY(this.Y3.tc)}},
-LI:{
-"^":"a;lK,uk,xI,rq,FX,Nc",
-gWa:function(){return this.lK},
-gUA:function(){return this.xI===0},
-gnd:function(){var z,y,x,w
-if(this.xI===1)return C.dn
-z=this.rq
-y=z.length-this.FX.length
-if(y===0)return C.dn
-x=[]
-for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
-x.push(z[w])}x.immutable$list=!0
-x.fixed$length=!0
-return x},
-gVm:function(){var z,y,x,w,v,u,t,s
-if(this.xI!==0)return P.Fl(P.GD,null)
-z=this.FX
-y=z.length
-x=this.rq
-w=x.length-y
-if(y===0)return P.Fl(P.GD,null)
-v=P.L5(null,null,null,P.GD,null)
-for(u=0;u<y;++u){if(u>=z.length)return H.e(z,u)
-t=z[u]
-s=w+u
-if(s<0||s>=x.length)return H.e(x,s)
-v.u(0,new H.IN(t),x[s])}return v},
-static:{"^":"hAw,oY,Y8"}},
-FD:{
-"^":"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()
-if(b<z)return
-return this.Rn[3+b-z]},
-Fk:function(a){var z=this.Rv
-if(a<z)return
-if(!this.Mo||this.hG===1)return this.BX(0,a)
-return this.BX(0,this.e4(a-z))},
-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))},
-e4:function(a){var z,y,x,w,v,u
-z={}
-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))
-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,H6",zh:function(a){var z,y,x
-z=a.$reflectionInfo
-if(z==null)return
-z.fixed$length=init
-z=z
-y=z[0]
-x=z[1]
-return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
-uV:{
-"^":"Tp:5;a,b,c",
-$1:function(a){var z,y,x
-z=this.b.NE
-y=this.a.a++
-x=this.c.t(0,a)
-if(y>=z.length)return H.e(z,y)
-z[y]=x},
-$isEH:true},
-Cj:{
-"^":"Tp:78;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:{
-"^":"Tp:78;a,b",
-$2:function(a,b){var z=this.b
-if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},
-$isEH:true},
-Zr:{
-"^":"a;bT,rq,Xs,Fa,Ga,cR",
-qS:function(a){var z,y,x
-z=new RegExp(this.bT).exec(a)
-if(z==null)return
-y={}
-x=this.rq
-if(x!==-1)y.arguments=z[x+1]
-x=this.Xs
-if(x!==-1)y.argumentsExpr=z[x+1]
-x=this.Fa
-if(x!==-1)y.expr=z[x+1]
-x=this.Ga
-if(x!==-1)y.method=z[x+1]
-x=this.cR
-if(x!==-1)y.receiver=z[x+1]
-return y},
-static:{"^":"lm,k1,Re,fN,qi,cz,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=[]
-y=z.indexOf("\\$arguments\\$")
-x=z.indexOf("\\$argumentsExpr\\$")
-w=z.indexOf("\\$expr\\$")
-v=z.indexOf("\\$method\\$")
-u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},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;K9,Ga",
-bu:function(a){var z=this.Ga
-if(z==null)return"NullError: "+H.d(this.K9)
-return"NullError: Cannot call \""+H.d(z)+"\" on null"},
-$isJS:true,
-$isXS:true},
-u0:{
-"^":"XS;K9,Ga,cR",
-bu:function(a){var z,y
-z=this.Ga
-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.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
-y=z?null:b.method
-z=z?null:b.receiver
-return new H.u0(a,y,z)}}},
-vV:{
-"^":"XS;K9",
-bu:function(a){var z=this.K9
-return C.xB.gl0(z)?"Error":"Error: "+z}},
-Am:{
-"^":"Tp:13;a",
-$1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},
-$isEH:true},
-XO:{
-"^":"a;lA,ui",
-bu:function(a){var z,y
-z=this.ui
-if(z!=null)return z
-z=this.lA
-y=typeof z==="object"?z.stack:null
-z=y==null?"":y
-this.ui=z
-return z}},
-dr:{
-"^":"Tp:69;a",
-$0:function(){return this.a.$0()},
-$isEH:true},
-TL:{
-"^":"Tp:69;b,c",
-$0:function(){return this.b.$1(this.c)},
-$isEH:true},
-uZ:{
-"^":"Tp:69;d,e,f",
-$0:function(){return this.d.$2(this.e,this.f)},
-$isEH:true},
-OQ:{
-"^":"Tp:69;UI,bK,Gq,Rm",
-$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
-$isEH:true},
-Qx:{
-"^":"Tp:69;w3,HZ,mG,xC,cj",
-$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
-$isEH:true},
-Tp:{
-"^":"a;",
-bu:function(a){return"Closure"},
-$isEH:true,
-gKu:function(){return this}},
-Bp:{
-"^":"Tp;"},
-v:{
-"^":"Bp;nw,jm,cR,RA",
-n:function(a,b){if(b==null)return!1
-if(this===b)return!0
-if(!J.x(b).$isv)return!1
-return this.nw===b.nw&&this.jm===b.jm&&this.cR===b.cR},
-giO:function(a){var z,y
-z=this.cR
-if(z==null)y=H.eQ(this.nw)
-else y=typeof z!=="object"?J.v1(z):H.eQ(z)
-return J.UN(y,H.eQ(this.jm))},
-$isv:true,
-static:{"^":"bf,P4",uj:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
-if(z==null){z=H.B3("self")
-$.bf=z}return z},B3:function(a){var z,y,x,w,v
-z=new H.v("self","target","receiver","name")
-y=Object.getOwnPropertyNames(z)
-y.fixed$length=init
-x=y
-for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}}}},
-Pe:{
-"^":"XS;G1>",
-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))}}},
-bb:{
-"^":"XS;G1>",
-bu:function(a){return"RuntimeError: "+H.d(this.G1)},
-static:{Pa:function(a){return new H.bb(a)}}},
-lbp:{
-"^":"a;"},
-GN:{
-"^":"lbp;dw,Iq,is,p6",
-BD:function(a){var z=this.rP(a)
-return z==null?!1:H.J4(z,this.za())},
-rP:function(a){var z=J.x(a)
-return"$signature" in z?z.$signature():null},
-za:function(){var z,y,x,w,v,u,t
-z={func:"dynafunc"}
-y=this.dw
-x=J.x(y)
-if(!!x.$isnr)z.void=true
-else if(!x.$ishJ)z.ret=y.za()
-y=this.Iq
-if(y!=null&&y.length!==0)z.args=H.Dz(y)
-y=this.is
-if(y!=null&&y.length!==0)z.opt=H.Dz(y)
-y=this.p6
-if(y!=null){w={}
-v=H.kU(y)
-for(x=v.length,u=0;u<x;++u){t=v[u]
-w[t]=y[t].za()}z.named=w}return z},
-bu:function(a){var z,y,x,w,v,u,t,s
-z=this.Iq
-if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
-if(w)x+=", "
-x+=H.d(u)}else{x="("
-w=!1}z=this.is
-if(z!=null&&z.length!==0){x=(w?x+", ":x)+"["
-for(y=z.length,w=!1,v=0;v<y;++v,w=!0){u=z[v]
-if(w)x+=", "
-x+=H.d(u)}x+="]"}else{z=this.p6
-if(z!=null){x=(w?x+", ":x)+"{"
-t=H.kU(z)
-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:{"^":"Ot",Dz:function(a){var z,y,x
-a=a
-z=[]
-for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z}}},
-hJ:{
-"^":"lbp;",
-bu:function(a){return"dynamic"},
-za:function(){return},
-$ishJ:true},
-Fp:{
-"^":"lbp;oc>",
-za:function(){var z,y
-z=this.oc
-y=init.allClasses[z]
-if(y==null)throw H.b("no type for '"+H.d(z)+"'")
-return y},
-bu:function(a){return this.oc}},
-KEA:{
-"^":"lbp;oc>,re,Et",
-za:function(){var z,y
-z=this.Et
-if(z!=null)return z
-z=this.oc
-y=[init.allClasses[z]]
-if(0>=y.length)return H.e(y,0)
-if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
-for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
-this.Et=y
-return y},
-bu:function(a){return H.d(this.oc)+"<"+J.Dn(this.re,", ")+">"}},
-cu:{
-"^":"a;LU,ke",
-bu:function(a){var z,y
-z=this.ke
-if(z!=null)return z
-y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
-this.ke=y
-return y},
-giO:function(a){return J.v1(this.LU)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iscu&&J.xC(this.LU,b.LU)},
-$iscu:true,
-$isuq:true},
-dC:{
-"^":"Tp:13;a",
-$1:function(a){return this.a(a)},
-$isEH:true},
-VX:{
-"^":"Tp:79;b",
-$2:function(a,b){return this.b(a,b)},
-$isEH:true},
-vZ:{
-"^":"Tp:5;c",
-$1:function(a){return this.c(a)},
-$isEH:true},
-VR:{
-"^":"a;zO,Ej,BT,xJ",
-gF4:function(){var z=this.BT
-if(z!=null)return z
-z=this.Ej
-z=H.ol(this.zO,z.multiline,!z.ignoreCase,!0)
-this.BT=z
-return z},
-gAT:function(){var z=this.xJ
-if(z!=null)return z
-z=this.Ej
-z=H.ol(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
-this.xJ=z
-return z},
-ej:function(a){var z
-if(typeof a!=="string")H.vh(P.u(a))
-z=this.Ej.exec(a)
-if(z==null)return
-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.gF4()
-z.lastIndex=b
-y=z.exec(a)
-if(y==null)return
-return H.Mr(this,y)},
-Bh:function(a,b){var z,y,x,w
-z=this.gAT()
-z.lastIndex=b
-y=z.exec(a)
-if(y==null)return
-x=y.length
-w=x-1
-if(w<0)return H.e(y,w)
-if(y[w]!=null)return
-C.Nm.sB(y,w)
-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)
-z=c>z}else z=!0
-if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},
-R4:function(a,b){return this.wL(a,b,0)},
-$isVR:true,
-$isSP:true,
-static:{ol:function(a,b,c,d){var z,y,x,w,v
-z=b?"m":""
-y=c?"":"i"
-x=d?"g":""
-w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
-if(w instanceof RegExp)return w
-v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
-AX:{
-"^":"a;zO,QK",
-t:function(a,b){var z=this.QK
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-VO:function(a,b){},
-$isns:true,
-static:{Mr:function(a,b){var z=new H.AX(a,b)
-z.VO(a,b)
-return z}}},
-KW:{
-"^":"mW;rN,rv",
-gA:function(a){return new H.Pb(this.rN,this.rv,null)},
-$asmW:function(){return[P.ns]},
-$asQV:function(){return[P.ns]}},
-Pb:{
-"^":"a;xz,rv,Wh",
-gl:function(){return this.Wh},
-G:function(){var z,y,x
-if(this.rv==null)return!1
-z=this.Wh
-if(z!=null){z=z.QK
-y=z.index
-if(0>=z.length)return H.e(z,0)
-z=J.q8(z[0])
-if(typeof z!=="number")return H.s(z)
-x=y+z
-if(this.Wh.QK.index===x)++x}else x=0
-z=this.xz.yk(this.rv,x)
-this.Wh=z
-if(z==null){this.rv=null
-return!1}return!0}},
-Vo:{
-"^":"a;M,f1,zO",
-t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
-return this.zO},
-$isns:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
-"^":"",
-hV:{
-"^":"LPc;fi,dB,KW,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.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.dB!=null){a.fi=this.ct(a,C.S4,z,!0)
-this.LY(a,null).Qy(new X.jE(a))}},"$3","gNa",6,0,80,46,47,81],
-static:{zy:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.fi=!1
-a.dB=null
-a.KW="action"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Df.ZL(a)
-C.Df.XI(a)
-return a}}},
-LPc:{
-"^":"xc+Pi;",
-$isd3:true},
-jE:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-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($.Si(),"google"),"visualization")
-$.BY=z
-return z},"$1","vN",2,0,13,14],
-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)},
-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","kh",2,0,15],
-P0:function(a){var z,y,x,w
-z=C.CD.yu(C.CD.UD(a*1000))
-y=C.jn.cU(z,3600000)
-z=C.jn.Y(z,3600000)
-x=C.jn.cU(z,60000)
-z=C.jn.Y(z,60000)
-w=C.jn.cU(z,1000)
-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)},
-As:[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.Sy(z.V(a,1024),1)+"KB"
-else if(z.C(a,1073741824))return C.CD.Sy(z.V(a,1048576),1)+"MB"
-else if(z.C(a,1099511627776))return C.CD.Sy(z.V(a,1073741824),1)+"GB"
-else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","YN",2,0,15,16],
-mG:function(a){var z,y,x,w
-if(a==null)return"-"
-z=J.LL(J.vX(a,1000))
-y=C.jn.cU(z,3600000)
-z=C.jn.Y(z,3600000)
-x=C.jn.cU(z,60000)
-w=C.jn.cU(C.jn.Y(z,60000),1000)
-P.p9("")
-if(y!==0)return""+y+"h "+x+"m "+w+"s"
-if(x!==0)return""+x+"m "+w+"s"
-return""+w+"s"},
-uG:{
-"^":"Pi;",
-gFL:function(a){return this.yF},
-$isuG:true},
-cZ:{
-"^":"uG;MR,yF,AP,fn",
-zw:function(){if(this.yF==null){var z=W.r3("service-view",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
-DV:function(a){if(J.xC(a,""))return
-this.MR.wv.cv(a).ml(new G.zv(this))},
-VU:function(a){return!0}},
-zv:{
-"^":"Tp:13;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,82,"call"],
-$isEH:true},
-Ez:{
-"^":"uG;MR,yF,AP,fn",
-zw:function(){if(this.yF==null){var z=W.r3("class-tree",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
-DV:function(a){this.MR.wv.cv(J.ZZ(a,11)).ml(new G.yk(this))},
-VU:function(a){return J.co(a,"class-tree/")},
-static:{"^":"o9x"}},
-yk:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a.yF
-if(z!=null)J.uM(z,a)},"$1",null,2,0,null,83,"call"],
-$isEH:true},
-f2:{
-"^":"uG;MR,yF,AP,fn",
-zw:function(){if(this.yF==null){var z=W.r3("service-view",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
-DV:function(a){var z,y
-z=H.Go(this.yF,"$isTi")
-y=this.MR.EC
-z.Ll=J.Q5(z,C.td,z.Ll,y)},
-VU:function(a){return J.co(a,"error/")}},
-mL:{
-"^":"Pi;cE,Lh,cL,Z6,wv>,Eb,bn,EC,AP,fn",
-god:function(a){return this.Eb},
-sod:function(a,b){this.Eb=F.Wi(this,C.rB,this.Eb,b)},
-Da:function(){var z,y
-this.om()
-z=this.wv
-y=z.G2
-H.VM(new P.Ik(y),[H.Kp(y,0)]).yI(this.gbf())
-z=z.Li
-H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())
-z=this.Z6
-$.W5=z
-z.ec=this
-y=H.VM(new W.RO(window,C.yf.Ph,!1),[null])
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(z.gjU()),y.Sg),[H.Kp(y,0)]).Zz()
-z.Cy()},
-om:function(){var z,y
-if(this.Lh!=null)return
-z=this.cE
-z.push(new G.Ez(this,null,null,null))
-z.push(new G.f2(this,null,null,null))
-y=new G.cZ(this,null,null,null)
-this.Lh=y
-z.push(y)},
-kj:[function(a){this.EC=a
-this.og("error/",null)},"$1","gbf",2,0,84,24],
-kI:[function(a){this.EC=a
-this.og("error/",null)},"$1","gXa",2,0,85,86],
-og:function(a,b){var z,y,x
-for(z=this.cE,y=0;y<z.length;++y){x=z[y]
-if(x.VU(a)){this.lJ(x)
-x.DV(a)
-return}}throw H.b(P.EY())},
-lJ:function(a){var z,y,x
-z="Installing "+J.AG(a)
-y=$.oK
-if(y==null)H.qw(z)
-else y.$1(z)
-y=this.cL
-if(y==null?a==null:y===a)return
-if(y!=null){x=y.yF
-if(y.gnz(y)&&x!=null){x=new T.qI(y,C.GP,x,null)
-x.$builtinTypeInfo=[null]
-y.nq(y,x)}y.yF=null}a.zw()
-y=this.bn
-J.r4(y)
-y.appendChild(a.yF)
-this.cL=a},
-Ty:function(a){this.Da()},
-E0:function(a){this.Da()}},
-Kf:{
-"^":"a;Yb",
-goH:function(){return this.Yb.nQ("getNumberOfColumns")},
-gvp:function(a){return this.Yb.nQ("getNumberOfRows")},
-B7:function(){var z=this.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
-Id:function(a,b){var z=[]
-C.Nm.FV(z,J.kl(b,P.En()))
-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.V7("draw",[a.Yb,z])}},
-yVe:{
-"^":"d3;",
-lU:function(a){var z,y,x
-if(J.rY(a).nC(a,"#"))a=C.xB.yn(a,1)
-if(C.xB.nC(a,"/"))a=C.xB.yn(a,1)
-if(C.xB.tg(a,"#")){z=a.split("#")
-y=z.length
-if(0>=y)return H.e(z,0)
-a=z[0]
-if(y>1&&!J.xC(z[1],"")){if(1>=z.length)return H.e(z,1)
-x=z[1]}else x=null}else x=null
-this.ec.og(a,x)},
-Bs:function(a,b,c){var z,y,x,w
-z=J.Vs(c).MW.getAttribute("href")
-y=J.RE(a)
-x=y.gpL(a)
-if(typeof x!=="number")return x.D()
-if(x>1||y.gNl(a)===!0||y.gEX(a)===!0||y.gqx(a)===!0||y.gGU(a)===!0)return
-x=$.W5
-w=x.c5
-if(w==null?z!=null:w!==z){N.QM("").To("Navigated to "+H.d(z))
-window.history.pushState(z,document.title,z)
-x.c5=z}x.lU(z)
-y.e6(a)}},
-OR:{
-"^":"yVe;hS,ec,c5,ro,dUC,pt",
-Cy:function(){var z=H.d(window.location.hash)
-if(window.location.hash===""||window.location.hash==="#")z="#"+this.hS
-window.history.pushState(z,document.title,z)
-this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gjU",2,0,87,14]},
-Y2:{
-"^":"Pi;eT>,yt<,ks>,oH<",
-gyX:function(a){return this.PU},
-gty:function(){return this.aZ},
-goE:function(a){return this.yq},
-soE:function(a,b){var z=J.xC(this.yq,b)
-this.yq=b
-if(!z){z=this.PU
-if(b===!0){this.PU=F.Wi(this,C.Ek,z,"\u21b3")
-this.C4(0)}else{this.PU=F.Wi(this,C.Ek,z,"\u2192")
-this.cO()}}},
-r8:function(){this.soE(0,this.yq!==!0)
-return this.yq},
-k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
-$isY2:true},
-XN:{
-"^":"Pi;vp>,AP,fn",
-rT:function(a){var z,y
-z=this.vp
-y=J.w1(z)
-y.V1(z)
-a.C4(0)
-y.FV(z,a.ks)},
-qU:function(a){var z,y,x
-z=this.vp
-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))
-if(y===0)return
-for(x=0;x<y;++x)if(J.Mz(J.UQ(z.gks(a),x))===!0)this.FS(J.UQ(z.gks(a),x))
-z.soE(a,!1)
-z=this.vp
-w=J.U6(z)
-v=w.u8(z,a)+1
-w.UZ(z,v,v+y)}},
-Kt:{
-"^":"a;ph>,OV<",
-static:{hg:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Q8",2,0,17]}},
-Ni:{
-"^":"a;UQ>",
-$isNi:true},
-Vz0:{
-"^":"Pi;oH<,vp>,zz<",
-sxp:function(a){this.pT=a
-F.Wi(this,C.JB,0,1)},
-gxp:function(){return this.pT},
-gT3:function(){return this.jV},
-sT3:function(a){this.jV=a
-F.Wi(this,C.JB,0,1)},
-eE:function(a,b){var z=this.vp
-if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8o(z[a]),b)},
-PV:[function(a,b){var z=this.eE(a,this.pT)
-return J.oE(this.eE(b,this.pT),z)},"$2","gCS",4,0,88],
-zF:[function(a,b){return J.oE(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gAZ",4,0,88],
-Jd:function(a){var z,y
-new P.VV(1000000,null,null).wE(0)
-z=this.zz
-if(this.jV){y=this.gCS()
-H.rd(z,y)}else{y=this.gAZ()
-H.rd(z,y)}},
-B7:function(){C.Nm.sB(this.vp,0)
-C.Nm.sB(this.zz,0)},
-Id:function(a,b){var z=this.vp
-this.zz.push(z.length)
-z.push(b)},
-Gu:function(a,b){var z,y
-z=this.vp
-if(a>=z.length)return H.e(z,a)
-y=J.UQ(J.U8o(z[a]),b)
-z=this.oH
-if(b>=z.length)return H.e(z,b)
-return z[b].gOV().$1(y)},
-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,15,89]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
-"^":"",
-Jz:[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.ET,new E.Cv(),C.WC,new E.ed(),C.S4,new E.wa(),C.Ro,new E.Or(),C.hN,new E.YL(),C.AV,new E.wf(),C.bV,new E.Oa(),C.C0,new E.emv(),C.eZ,new E.Lbd(),C.bk,new E.QAa(),C.lH,new E.CvS(),C.kG,new E.edy(),C.OI,new E.waE(),C.To,new E.Ore(),C.XA,new E.YLa(),C.i4,new E.wfa(),C.qt,new E.Oaa(),C.p1,new E.e0(),C.yL,new E.e1(),C.bJ,new E.e2(),C.ox,new E.e3(),C.Je,new E.e4(),C.iE,new E.e5(),C.f4,new E.e6(),C.VK,new E.e7(),C.aH,new E.e8(),C.aK,new E.e9(),C.GP,new E.e10(),C.vs,new E.e11(),C.Gr,new E.e12(),C.TU,new E.e13(),C.tP,new E.e14(),C.yh,new E.e15(),C.Zb,new E.e16(),C.u7,new E.e17(),C.ne,new E.e18(),C.B0,new E.e19(),C.r1,new E.e20(),C.mr,new E.e21(),C.Ek,new E.e22(),C.Pn,new E.e23(),C.YT,new E.e24(),C.h7,new E.e25(),C.R3,new E.e26(),C.WQ,new E.e27(),C.fV,new E.e28(),C.jU,new E.e29(),C.Gd,new E.e30(),C.OO,new E.e31(),C.Mc,new E.e32(),C.FP,new E.e33(),C.kF,new E.e34(),C.UD,new E.e35(),C.Aq,new E.e36(),C.DS,new E.e37(),C.C9,new E.e38(),C.VF,new E.e39(),C.uU,new E.e40(),C.YJ,new E.e41(),C.eF,new E.e42(),C.oI,new E.e43(),C.ST,new E.e44(),C.QH,new E.e45(),C.qX,new E.e46(),C.rE,new E.e47(),C.nf,new E.e48(),C.pO,new E.e49(),C.EI,new E.e50(),C.JB,new E.e51(),C.d4,new E.e52(),C.cF,new E.e53(),C.Ql,new E.e54(),C.SI,new E.e55(),C.zS,new E.e56(),C.YA,new E.e57(),C.ak,new E.e58(),C.Ge,new E.e59(),C.He,new E.e60(),C.Ss,new E.e61(),C.k6,new E.e62(),C.oj,new E.e63(),C.PJ,new E.e64(),C.q2,new E.e65(),C.d2,new E.e66(),C.kN,new E.e67(),C.fn,new E.e68(),C.yB,new E.e69(),C.eJ,new E.e70(),C.iG,new E.e71(),C.Py,new E.e72(),C.pC,new E.e73(),C.uu,new E.e74(),C.qs,new E.e75(),C.XH,new E.e76(),C.I9,new E.e77(),C.C1,new E.e78(),C.a0,new E.e79(),C.Yg,new E.e80(),C.bR,new E.e81(),C.ai,new E.e82(),C.ob,new E.e83(),C.Iv,new E.e84(),C.Wg,new E.e85(),C.tD,new E.e86(),C.nZ,new E.e87(),C.Of,new E.e88(),C.pY,new E.e89(),C.XL,new E.e90(),C.LA,new E.e91(),C.Lk,new E.e92(),C.dK,new E.e93(),C.xf,new E.e94(),C.rB,new E.e95(),C.bz,new E.e96(),C.Jx,new E.e97(),C.b5,new E.e98(),C.Lc,new E.e99(),C.hf,new E.e100(),C.uk,new E.e101(),C.Zi,new E.e102(),C.TN,new E.e103(),C.kA,new E.e104(),C.GI,new E.e105(),C.Wn,new E.e106(),C.ur,new E.e107(),C.VN,new E.e108(),C.EV,new E.e109(),C.VI,new E.e110(),C.eh,new E.e111(),C.r6,new E.e112(),C.MW,new E.e113(),C.SA,new E.e114(),C.kV,new E.e115(),C.vp,new E.e116(),C.cc,new E.e117(),C.DY,new E.e118(),C.Lx,new E.e119(),C.M3,new E.e120(),C.wT,new E.e121(),C.SR,new E.e122(),C.t6,new E.e123(),C.rP,new E.e124(),C.pX,new E.e125(),C.VD,new E.e126(),C.NN,new E.e127(),C.UX,new E.e128(),C.YS,new E.e129(),C.pu,new E.e130(),C.BJ,new E.e131(),C.td,new E.e132(),C.Gn,new E.e133(),C.zO,new E.e134(),C.vg,new E.e135(),C.Ys,new E.e136(),C.zm,new E.e137(),C.XM,new E.e138(),C.Ic,new E.e139(),C.yG,new E.e140(),C.uI,new E.e141(),C.tW,new E.e142(),C.CG,new E.e143(),C.Wj,new E.e144(),C.vb,new E.e145(),C.UL,new E.e146(),C.AY,new E.e147(),C.QK,new E.e148(),C.AO,new E.e149(),C.I7,new E.e150(),C.xP,new E.e151(),C.Wm,new E.e152(),C.GR,new E.e153(),C.KX,new E.e154(),C.ja,new E.e155(),C.Dj,new E.e156(),C.ir,new E.e157(),C.dx,new E.e158(),C.ni,new E.e159(),C.X2,new E.e160(),C.F3,new E.e161(),C.UY,new E.e162(),C.Aa,new E.e163(),C.nY,new E.e164(),C.tg,new E.e165(),C.HD,new E.e166(),C.iU,new E.e167(),C.eN,new E.e168(),C.ue,new E.e169(),C.nh,new E.e170(),C.L2,new E.e171(),C.Gs,new E.e172(),C.bE,new E.e173(),C.YD,new E.e174(),C.PX,new E.e175(),C.N8,new E.e176(),C.EA,new E.e177(),C.oW,new E.e178(),C.hd,new E.e179(),C.pH,new E.e180(),C.Ve,new E.e181(),C.jM,new E.e182(),C.nt,new E.e183(),C.PM,new E.e184(),C.xA,new E.e185(),C.k5,new E.e186(),C.Nv,new E.e187(),C.Cw,new E.e188(),C.TW,new E.e189(),C.xS,new E.e190(),C.mi,new E.e191(),C.zz,new E.e192(),C.hO,new E.e193(),C.ei,new E.e194(),C.HK,new E.e195(),C.je,new E.e196(),C.Ef,new E.e197(),C.Q1,new E.e198(),C.ID,new E.e199(),C.z6,new E.e200(),C.bc,new E.e201(),C.kw,new E.e202(),C.ep,new E.e203(),C.J2,new E.e204(),C.zU,new E.e205(),C.bn,new E.e206(),C.mh,new E.e207(),C.Fh,new E.e208(),C.LP,new E.e209(),C.jh,new E.e210(),C.fj,new E.e211(),C.xw,new E.e212(),C.zn,new E.e213(),C.RJ,new E.e214(),C.Tc,new E.e215(),C.YE,new E.e216(),C.Uy,new E.e217()],null,null)
-y=P.EF([C.aP,new E.e218(),C.cg,new E.e219(),C.S4,new E.e220(),C.AV,new E.e221(),C.bk,new E.e222(),C.lH,new E.e223(),C.kG,new E.e224(),C.XA,new E.e225(),C.i4,new E.e226(),C.yL,new E.e227(),C.bJ,new E.e228(),C.VK,new E.e229(),C.aH,new E.e230(),C.vs,new E.e231(),C.Gr,new E.e232(),C.tP,new E.e233(),C.yh,new E.e234(),C.Zb,new E.e235(),C.ne,new E.e236(),C.B0,new E.e237(),C.mr,new E.e238(),C.YT,new E.e239(),C.WQ,new E.e240(),C.jU,new E.e241(),C.Gd,new E.e242(),C.OO,new E.e243(),C.Mc,new E.e244(),C.QH,new E.e245(),C.rE,new E.e246(),C.nf,new E.e247(),C.Ql,new E.e248(),C.ak,new E.e249(),C.Ge,new E.e250(),C.He,new E.e251(),C.oj,new E.e252(),C.d2,new E.e253(),C.fn,new E.e254(),C.Py,new E.e255(),C.uu,new E.e256(),C.qs,new E.e257(),C.a0,new E.e258(),C.rB,new E.e259(),C.Lc,new E.e260(),C.hf,new E.e261(),C.uk,new E.e262(),C.Zi,new E.e263(),C.TN,new E.e264(),C.kA,new E.e265(),C.ur,new E.e266(),C.EV,new E.e267(),C.eh,new E.e268(),C.SA,new E.e269(),C.kV,new E.e270(),C.vp,new E.e271(),C.SR,new E.e272(),C.t6,new E.e273(),C.UX,new E.e274(),C.YS,new E.e275(),C.td,new E.e276(),C.zO,new E.e277(),C.Ys,new E.e278(),C.XM,new E.e279(),C.Ic,new E.e280(),C.tW,new E.e281(),C.Wj,new E.e282(),C.vb,new E.e283(),C.QK,new E.e284(),C.AO,new E.e285(),C.xP,new E.e286(),C.GR,new E.e287(),C.KX,new E.e288(),C.ja,new E.e289(),C.Dj,new E.e290(),C.X2,new E.e291(),C.UY,new E.e292(),C.Aa,new E.e293(),C.nY,new E.e294(),C.tg,new E.e295(),C.HD,new E.e296(),C.iU,new E.e297(),C.eN,new E.e298(),C.Gs,new E.e299(),C.bE,new E.e300(),C.YD,new E.e301(),C.PX,new E.e302(),C.pH,new E.e303(),C.Ve,new E.e304(),C.jM,new E.e305(),C.nt,new E.e306(),C.PM,new E.e307(),C.Nv,new E.e308(),C.Cw,new E.e309(),C.TW,new E.e310(),C.mi,new E.e311(),C.zz,new E.e312(),C.z6,new E.e313(),C.kw,new E.e314(),C.zU,new E.e315(),C.RJ,new E.e316(),C.YE,new E.e317()],null,null)
-x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.xE,C.Mt,C.oT,C.il,C.jR,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.MI,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Zj,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.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,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.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.jw,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.jw,C.Mt,C.l4,C.al,C.il],null,null)
-w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,C.CM,C.nw,P.EF([C.rB,C.hR,C.bz,C.Bk],null,null),C.xE,P.EF([C.XA,C.xY,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,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.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.BL,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.Yo,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.V3,C.pO,C.au,C.Lc,C.Pc,C.AO,C.fi],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.hR,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.Wz,C.CM,C.MI,P.EF([C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,C.CM,C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.nX,C.CM,C.Zj,P.EF([C.oj,C.GT],null,null),C.Ep,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.bw],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.dq,C.He,C.oV,C.vb,C.Mq,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.bB,C.zz,C.lS],null,null),C.UJ,C.CM,C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.hr,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.DZ,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,C.CM,C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,C.CM,C.ON,P.EF([C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.SA,C.KI,C.tW,C.kH,C.CG,C.Ml,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS],null,null),C.Sb,P.EF([C.tW,C.kH,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.rZ],null,null),C.il,P.EF([C.uu,C.yY,C.xP,C.TO,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.Zk,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.m2,C.RJ,C.BP],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.ET,"assertsEnabled",C.WC,"bpt",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",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.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",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.h7,"external",C.R3,"fd",C.WQ,"field",C.fV,"fields",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.d4,"goto",C.cF,"gotoLink",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.ak,"hasParent",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",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.XL,"isPatch",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.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.kA,"lastTokenPos",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.r6,"lineNumber",C.MW,"lineNumbers",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.BJ,"newSpace",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",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.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",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.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.nt,"startLine",C.PM,"status",C.xA,"styleForHits",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",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.Ef,"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.LP,"used",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.fH(z,y,C.CM)
-$.Yv=new O.bY(x,w,!1)
-$.qe=v
-$.M6=[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(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391()]
-$.UG=!0
-F.E2()},"$0","V7",0,0,18],
-em:{
-"^":"Tp:13;",
-$1:function(a){return J.Jp(a)},
-$isEH:true},
-Lb:{
-"^":"Tp:13;",
-$1:function(a){return a.gYu()},
-$isEH:true},
-QA:{
-"^":"Tp:13;",
-$1:function(a){return J.Ln(a)},
-$isEH:true},
-Cv:{
-"^":"Tp:13;",
-$1:function(a){return a.gA3()},
-$isEH:true},
-ed:{
-"^":"Tp:13;",
-$1:function(a){return a.gqr()},
-$isEH:true},
-wa:{
-"^":"Tp:13;",
-$1:function(a){return J.nG(a)},
-$isEH:true},
-Or:{
-"^":"Tp:13;",
-$1:function(a){return J.aA(a)},
-$isEH:true},
-YL:{
-"^":"Tp:13;",
-$1:function(a){return a.gfj()},
-$isEH:true},
-wf:{
-"^":"Tp:13;",
-$1:function(a){return J.WT(a)},
-$isEH:true},
-Oa:{
-"^":"Tp:13;",
-$1:function(a){return a.gCs()},
-$isEH:true},
-emv:{
-"^":"Tp:13;",
-$1:function(a){return J.Wp(a)},
-$isEH:true},
-Lbd:{
-"^":"Tp:13;",
-$1:function(a){return J.n9(a)},
-$isEH:true},
-QAa:{
-"^":"Tp:13;",
-$1:function(a){return J.K0(a)},
-$isEH:true},
-CvS:{
-"^":"Tp:13;",
-$1:function(a){return J.hn(a)},
-$isEH:true},
-edy:{
-"^":"Tp:13;",
-$1:function(a){return J.yz(a)},
-$isEH:true},
-waE:{
-"^":"Tp:13;",
-$1:function(a){return J.pP(a)},
-$isEH:true},
-Ore:{
-"^":"Tp:13;",
-$1:function(a){return a.gaP()},
-$isEH:true},
-YLa:{
-"^":"Tp:13;",
-$1:function(a){return J.E3(a)},
-$isEH:true},
-wfa:{
-"^":"Tp:13;",
-$1:function(a){return J.on(a)},
-$isEH:true},
-Oaa:{
-"^":"Tp:13;",
-$1:function(a){return J.SM(a)},
-$isEH:true},
-e0:{
-"^":"Tp:13;",
-$1:function(a){return a.goH()},
-$isEH:true},
-e1:{
-"^":"Tp:13;",
-$1:function(a){return J.xe(a)},
-$isEH:true},
-e2:{
-"^":"Tp:13;",
-$1:function(a){return J.OT(a)},
-$isEH:true},
-e3:{
-"^":"Tp:13;",
-$1:function(a){return J.Ok(a)},
-$isEH:true},
-e4:{
-"^":"Tp:13;",
-$1:function(a){return a.gl()},
-$isEH:true},
-e5:{
-"^":"Tp:13;",
-$1:function(a){return a.gSL()},
-$isEH:true},
-e6:{
-"^":"Tp:13;",
-$1:function(a){return a.guH()},
-$isEH:true},
-e7:{
-"^":"Tp:13;",
-$1:function(a){return J.mP(a)},
-$isEH:true},
-e8:{
-"^":"Tp:13;",
-$1:function(a){return J.BT(a)},
-$isEH:true},
-e9:{
-"^":"Tp:13;",
-$1:function(a){return J.vi(a)},
-$isEH:true},
-e10:{
-"^":"Tp:13;",
-$1:function(a){return J.nq(a)},
-$isEH:true},
-e11:{
-"^":"Tp:13;",
-$1:function(a){return J.k0(a)},
-$isEH:true},
-e12:{
-"^":"Tp:13;",
-$1:function(a){return J.rw(a)},
-$isEH:true},
-e13:{
-"^":"Tp:13;",
-$1:function(a){return J.wt(a)},
-$isEH:true},
-e14:{
-"^":"Tp:13;",
-$1:function(a){return a.gw2()},
-$isEH:true},
-e15:{
-"^":"Tp:13;",
-$1:function(a){return J.w8(a)},
-$isEH:true},
-e16:{
-"^":"Tp:13;",
-$1:function(a){return J.is(a)},
-$isEH:true},
-e17:{
-"^":"Tp:13;",
-$1:function(a){return J.yi(a)},
-$isEH:true},
-e18:{
-"^":"Tp:13;",
-$1:function(a){return J.Vl(a)},
-$isEH:true},
-e19:{
-"^":"Tp:13;",
-$1:function(a){return J.kE(a)},
-$isEH:true},
-e20:{
-"^":"Tp:13;",
-$1:function(a){return J.Gl(a)},
-$isEH:true},
-e21:{
-"^":"Tp:13;",
-$1:function(a){return J.Mz(a)},
-$isEH:true},
-e22:{
-"^":"Tp:13;",
-$1:function(a){return J.nb(a)},
-$isEH:true},
-e23:{
-"^":"Tp:13;",
-$1:function(a){return a.gty()},
-$isEH:true},
-e24:{
-"^":"Tp:13;",
-$1:function(a){return J.yn(a)},
-$isEH:true},
-e25:{
-"^":"Tp:13;",
-$1:function(a){return a.gMX()},
-$isEH:true},
-e26:{
-"^":"Tp:13;",
-$1:function(a){return a.gkE()},
-$isEH:true},
-e27:{
-"^":"Tp:13;",
-$1:function(a){return J.pm(a)},
-$isEH:true},
-e28:{
-"^":"Tp:13;",
-$1:function(a){return a.gtJ()},
-$isEH:true},
-e29:{
-"^":"Tp:13;",
-$1:function(a){return J.Ec(a)},
-$isEH:true},
-e30:{
-"^":"Tp:13;",
-$1:function(a){return a.ghY()},
-$isEH:true},
-e31:{
-"^":"Tp:13;",
-$1:function(a){return J.ra(a)},
-$isEH:true},
-e32:{
-"^":"Tp:13;",
-$1:function(a){return J.QZ(a)},
-$isEH:true},
-e33:{
-"^":"Tp:13;",
-$1:function(a){return J.WX(a)},
-$isEH:true},
-e34:{
-"^":"Tp:13;",
-$1:function(a){return J.JD(a)},
-$isEH:true},
-e35:{
-"^":"Tp:13;",
-$1:function(a){return a.gZd()},
-$isEH:true},
-e36:{
-"^":"Tp:13;",
-$1:function(a){return J.lT(a)},
-$isEH:true},
-e37:{
-"^":"Tp:13;",
-$1:function(a){return J.M4(a)},
-$isEH:true},
-e38:{
-"^":"Tp:13;",
-$1:function(a){return a.gkA()},
-$isEH:true},
-e39:{
-"^":"Tp:13;",
-$1:function(a){return a.gGK()},
-$isEH:true},
-e40:{
-"^":"Tp:13;",
-$1:function(a){return a.gan()},
-$isEH:true},
-e41:{
-"^":"Tp:13;",
-$1:function(a){return a.gcQ()},
-$isEH:true},
-e42:{
-"^":"Tp:13;",
-$1:function(a){return a.gS7()},
-$isEH:true},
-e43:{
-"^":"Tp:13;",
-$1:function(a){return a.gJz()},
-$isEH:true},
-e44:{
-"^":"Tp:13;",
-$1:function(a){return J.PY(a)},
-$isEH:true},
-e45:{
-"^":"Tp:13;",
-$1:function(a){return J.bu(a)},
-$isEH:true},
-e46:{
-"^":"Tp:13;",
-$1:function(a){return J.VL(a)},
-$isEH:true},
-e47:{
-"^":"Tp:13;",
-$1:function(a){return J.zN(a)},
-$isEH:true},
-e48:{
-"^":"Tp:13;",
-$1:function(a){return J.m4(a)},
-$isEH:true},
-e49:{
-"^":"Tp:13;",
-$1:function(a){return J.v8(a)},
-$isEH:true},
-e50:{
-"^":"Tp:13;",
-$1:function(a){return a.gmu()},
-$isEH:true},
-e51:{
-"^":"Tp:13;",
-$1:function(a){return a.gCO()},
-$isEH:true},
-e52:{
-"^":"Tp:13;",
-$1:function(a){return J.eU(a)},
-$isEH:true},
-e53:{
-"^":"Tp:13;",
-$1:function(a){return J.DB(a)},
-$isEH:true},
-e54:{
-"^":"Tp:13;",
-$1:function(a){return J.wO(a)},
-$isEH:true},
-e55:{
-"^":"Tp:13;",
-$1:function(a){return a.gGf()},
-$isEH:true},
-e56:{
-"^":"Tp:13;",
-$1:function(a){return a.gUa()},
-$isEH:true},
-e57:{
-"^":"Tp:13;",
-$1:function(a){return a.gMp()},
-$isEH:true},
-e58:{
-"^":"Tp:13;",
-$1:function(a){return J.u1(a)},
-$isEH:true},
-e59:{
-"^":"Tp:13;",
-$1:function(a){return J.z3(a)},
-$isEH:true},
-e60:{
-"^":"Tp:13;",
-$1:function(a){return J.YQ(a)},
-$isEH:true},
-e61:{
-"^":"Tp:13;",
-$1:function(a){return a.gu9()},
-$isEH:true},
-e62:{
-"^":"Tp:13;",
-$1:function(a){return J.fA(a)},
-$isEH:true},
-e63:{
-"^":"Tp:13;",
-$1:function(a){return J.cd(a)},
-$isEH:true},
-e64:{
-"^":"Tp:13;",
-$1:function(a){return a.gL4()},
-$isEH:true},
-e65:{
-"^":"Tp:13;",
-$1:function(a){return a.gaj()},
-$isEH:true},
-e66:{
-"^":"Tp:13;",
-$1:function(a){return a.giq()},
-$isEH:true},
-e67:{
-"^":"Tp:13;",
-$1:function(a){return a.gBm()},
-$isEH:true},
-e68:{
-"^":"Tp:13;",
-$1:function(a){return J.xR(a)},
-$isEH:true},
-e69:{
-"^":"Tp:13;",
-$1:function(a){return a.gWt()},
-$isEH:true},
-e70:{
-"^":"Tp:13;",
-$1:function(a){return a.gNI()},
-$isEH:true},
-e71:{
-"^":"Tp:13;",
-$1:function(a){return a.gva()},
-$isEH:true},
-e72:{
-"^":"Tp:13;",
-$1:function(a){return a.gKt()},
-$isEH:true},
-e73:{
-"^":"Tp:13;",
-$1:function(a){return a.gp2()},
-$isEH:true},
-e74:{
-"^":"Tp:13;",
-$1:function(a){return J.UU(a)},
-$isEH:true},
-e75:{
-"^":"Tp:13;",
-$1:function(a){return J.Ew(a)},
-$isEH:true},
-e76:{
-"^":"Tp:13;",
-$1:function(a){return a.gVM()},
-$isEH:true},
-e77:{
-"^":"Tp:13;",
-$1:function(a){return J.Ja(a)},
-$isEH:true},
-e78:{
-"^":"Tp:13;",
-$1:function(a){return a.gUB()},
-$isEH:true},
-e79:{
-"^":"Tp:13;",
-$1:function(a){return J.pd(a)},
-$isEH:true},
-e80:{
-"^":"Tp:13;",
-$1:function(a){return a.gkU()},
-$isEH:true},
-e81:{
-"^":"Tp:13;",
-$1:function(a){return J.wz(a)},
-$isEH:true},
-e82:{
-"^":"Tp:13;",
-$1:function(a){return J.FN(a)},
-$isEH:true},
-e83:{
-"^":"Tp:13;",
-$1:function(a){return J.ls(a)},
-$isEH:true},
-e84:{
-"^":"Tp:13;",
-$1:function(a){return J.yq(a)},
-$isEH:true},
-e85:{
-"^":"Tp:13;",
-$1:function(a){return J.SZ(a)},
-$isEH:true},
-e86:{
-"^":"Tp:13;",
-$1:function(a){return J.DL(a)},
-$isEH:true},
-e87:{
-"^":"Tp:13;",
-$1:function(a){return J.yx(a)},
-$isEH:true},
-e88:{
-"^":"Tp:13;",
-$1:function(a){return J.cU(a)},
-$isEH:true},
-e89:{
-"^":"Tp:13;",
-$1:function(a){return a.gYG()},
-$isEH:true},
-e90:{
-"^":"Tp:13;",
-$1:function(a){return a.gi2()},
-$isEH:true},
-e91:{
-"^":"Tp:13;",
-$1:function(a){return a.gHY()},
-$isEH:true},
-e92:{
-"^":"Tp:13;",
-$1:function(a){return J.UM(a)},
-$isEH:true},
-e93:{
-"^":"Tp:13;",
-$1:function(a){return J.ZN(a)},
-$isEH:true},
-e94:{
-"^":"Tp:13;",
-$1:function(a){return J.xa(a)},
-$isEH:true},
-e95:{
-"^":"Tp:13;",
-$1:function(a){return J.aT(a)},
-$isEH:true},
-e96:{
-"^":"Tp:13;",
-$1:function(a){return J.hb(a)},
-$isEH:true},
-e97:{
-"^":"Tp:13;",
-$1:function(a){return a.giR()},
-$isEH:true},
-e98:{
-"^":"Tp:13;",
-$1:function(a){return a.gEB()},
-$isEH:true},
-e99:{
-"^":"Tp:13;",
-$1:function(a){return J.Iz(a)},
-$isEH:true},
-e100:{
-"^":"Tp:13;",
-$1:function(a){return J.Q4(a)},
-$isEH:true},
-e101:{
-"^":"Tp:13;",
-$1:function(a){return J.MQ(a)},
-$isEH:true},
-e102:{
-"^":"Tp:13;",
-$1:function(a){return J.tx(a)},
-$isEH:true},
-e103:{
-"^":"Tp:13;",
-$1:function(a){return J.IR(a)},
-$isEH:true},
-e104:{
-"^":"Tp:13;",
-$1:function(a){return a.gSK()},
-$isEH:true},
-e105:{
-"^":"Tp:13;",
-$1:function(a){return a.gPE()},
-$isEH:true},
-e106:{
-"^":"Tp:13;",
-$1:function(a){return J.q8(a)},
-$isEH:true},
-e107:{
-"^":"Tp:13;",
-$1:function(a){return a.ghX()},
-$isEH:true},
-e108:{
-"^":"Tp:13;",
-$1:function(a){return a.gvU()},
-$isEH:true},
-e109:{
-"^":"Tp:13;",
-$1:function(a){return J.jl(a)},
-$isEH:true},
-e110:{
-"^":"Tp:13;",
-$1:function(a){return a.gRd()},
-$isEH:true},
-e111:{
-"^":"Tp:13;",
-$1:function(a){return J.zY(a)},
-$isEH:true},
-e112:{
-"^":"Tp:13;",
-$1:function(a){return J.Fd(a)},
-$isEH:true},
-e113:{
-"^":"Tp:13;",
-$1:function(a){return J.oZ(a)},
-$isEH:true},
-e114:{
-"^":"Tp:13;",
-$1:function(a){return J.de(a)},
-$isEH:true},
-e115:{
-"^":"Tp:13;",
-$1:function(a){return J.Ds(a)},
-$isEH:true},
-e116:{
-"^":"Tp:13;",
-$1:function(a){return J.cO(a)},
-$isEH:true},
-e117:{
-"^":"Tp:13;",
-$1:function(a){return a.gzM()},
-$isEH:true},
-e118:{
-"^":"Tp:13;",
-$1:function(a){return a.gjz()},
-$isEH:true},
-e119:{
-"^":"Tp:13;",
-$1:function(a){return a.giP()},
-$isEH:true},
-e120:{
-"^":"Tp:13;",
-$1:function(a){return a.gLw()},
-$isEH:true},
-e121:{
-"^":"Tp:13;",
-$1:function(a){return a.geH()},
-$isEH:true},
-e122:{
-"^":"Tp:13;",
-$1:function(a){return J.Yf(a)},
-$isEH:true},
-e123:{
-"^":"Tp:13;",
-$1:function(a){return J.kv(a)},
-$isEH:true},
-e124:{
-"^":"Tp:13;",
-$1:function(a){return J.ih(a)},
-$isEH:true},
-e125:{
-"^":"Tp:13;",
-$1:function(a){return J.z2(a)},
-$isEH:true},
-e126:{
-"^":"Tp:13;",
-$1:function(a){return J.ZL(a)},
-$isEH:true},
-e127:{
-"^":"Tp:13;",
-$1:function(a){return J.ba(a)},
-$isEH:true},
-e128:{
-"^":"Tp:13;",
-$1:function(a){return J.Zv(a)},
-$isEH:true},
-e129:{
-"^":"Tp:13;",
-$1:function(a){return J.O6(a)},
-$isEH:true},
-e130:{
-"^":"Tp:13;",
-$1:function(a){return J.HO(a)},
-$isEH:true},
-e131:{
-"^":"Tp:13;",
-$1:function(a){return a.gUY()},
-$isEH:true},
-e132:{
-"^":"Tp:13;",
-$1:function(a){return J.Jj(a)},
-$isEH:true},
-e133:{
-"^":"Tp:13;",
-$1:function(a){return J.t8(a)},
-$isEH:true},
-e134:{
-"^":"Tp:13;",
-$1:function(a){return a.gL1()},
-$isEH:true},
-e135:{
-"^":"Tp:13;",
-$1:function(a){return a.gxQ()},
-$isEH:true},
-e136:{
-"^":"Tp:13;",
-$1:function(a){return J.EC(a)},
-$isEH:true},
-e137:{
-"^":"Tp:13;",
-$1:function(a){return J.JG(a)},
-$isEH:true},
-e138:{
-"^":"Tp:13;",
-$1:function(a){return J.AF(a)},
-$isEH:true},
-e139:{
-"^":"Tp:13;",
-$1:function(a){return J.LB(a)},
-$isEH:true},
-e140:{
-"^":"Tp:13;",
-$1:function(a){return J.Kl(a)},
-$isEH:true},
-e141:{
-"^":"Tp:13;",
-$1:function(a){return a.gU6()},
-$isEH:true},
-e142:{
-"^":"Tp:13;",
-$1:function(a){return J.io(a)},
-$isEH:true},
-e143:{
-"^":"Tp:13;",
-$1:function(a){return J.fy(a)},
-$isEH:true},
-e144:{
-"^":"Tp:13;",
-$1:function(a){return J.Qa(a)},
-$isEH:true},
-e145:{
-"^":"Tp:13;",
-$1:function(a){return J.ks(a)},
-$isEH:true},
-e146:{
-"^":"Tp:13;",
-$1:function(a){return J.CN(a)},
-$isEH:true},
-e147:{
-"^":"Tp:13;",
-$1:function(a){return J.WM(a)},
-$isEH:true},
-e148:{
-"^":"Tp:13;",
-$1:function(a){return J.ul(a)},
-$isEH:true},
-e149:{
-"^":"Tp:13;",
-$1:function(a){return J.Sz(a)},
-$isEH:true},
-e150:{
-"^":"Tp:13;",
-$1:function(a){return a.gm8()},
-$isEH:true},
-e151:{
-"^":"Tp:13;",
-$1:function(a){return J.BZ(a)},
-$isEH:true},
-e152:{
-"^":"Tp:13;",
-$1:function(a){return J.Dd(a)},
-$isEH:true},
-e153:{
-"^":"Tp:13;",
-$1:function(a){return J.Cm(a)},
-$isEH:true},
-e154:{
-"^":"Tp:13;",
-$1:function(a){return J.fU(a)},
-$isEH:true},
-e155:{
-"^":"Tp:13;",
-$1:function(a){return J.GH(a)},
-$isEH:true},
-e156:{
-"^":"Tp:13;",
-$1:function(a){return J.QX(a)},
-$isEH:true},
-e157:{
-"^":"Tp:13;",
-$1:function(a){return a.gLc()},
-$isEH:true},
-e158:{
-"^":"Tp:13;",
-$1:function(a){return a.gNS()},
-$isEH:true},
-e159:{
-"^":"Tp:13;",
-$1:function(a){return a.guh()},
-$isEH:true},
-e160:{
-"^":"Tp:13;",
-$1:function(a){return J.iL(a)},
-$isEH:true},
-e161:{
-"^":"Tp:13;",
-$1:function(a){return J.k7(a)},
-$isEH:true},
-e162:{
-"^":"Tp:13;",
-$1:function(a){return J.uW(a)},
-$isEH:true},
-e163:{
-"^":"Tp:13;",
-$1:function(a){return J.W2(a)},
-$isEH:true},
-e164:{
-"^":"Tp:13;",
-$1:function(a){return J.UT(a)},
-$isEH:true},
-e165:{
-"^":"Tp:13;",
-$1:function(a){return J.Kd(a)},
-$isEH:true},
-e166:{
-"^":"Tp:13;",
-$1:function(a){return J.pU(a)},
-$isEH:true},
-e167:{
-"^":"Tp:13;",
-$1:function(a){return J.jo(a)},
-$isEH:true},
-e168:{
-"^":"Tp:13;",
-$1:function(a){return a.gVc()},
-$isEH:true},
-e169:{
-"^":"Tp:13;",
-$1:function(a){return a.gpF()},
-$isEH:true},
-e170:{
-"^":"Tp:13;",
-$1:function(a){return J.TY(a)},
-$isEH:true},
-e171:{
-"^":"Tp:13;",
-$1:function(a){return a.gA6()},
-$isEH:true},
-e172:{
-"^":"Tp:13;",
-$1:function(a){return J.Ry(a)},
-$isEH:true},
-e173:{
-"^":"Tp:13;",
-$1:function(a){return J.UP(a)},
-$isEH:true},
-e174:{
-"^":"Tp:13;",
-$1:function(a){return J.fw(a)},
-$isEH:true},
-e175:{
-"^":"Tp:13;",
-$1:function(a){return J.zH(a)},
-$isEH:true},
-e176:{
-"^":"Tp:13;",
-$1:function(a){return J.Vi(a)},
-$isEH:true},
-e177:{
-"^":"Tp:13;",
-$1:function(a){return a.gXR()},
-$isEH:true},
-e178:{
-"^":"Tp:13;",
-$1:function(a){return J.P5(a)},
-$isEH:true},
-e179:{
-"^":"Tp:13;",
-$1:function(a){return a.gzS()},
-$isEH:true},
-e180:{
-"^":"Tp:13;",
-$1:function(a){return J.U8(a)},
-$isEH:true},
-e181:{
-"^":"Tp:13;",
-$1:function(a){return J.oN(a)},
-$isEH:true},
-e182:{
-"^":"Tp:13;",
-$1:function(a){return a.gV8()},
-$isEH:true},
-e183:{
-"^":"Tp:13;",
-$1:function(a){return J.HB(a)},
-$isEH:true},
-e184:{
-"^":"Tp:13;",
-$1:function(a){return J.jB(a)},
-$isEH:true},
-e185:{
-"^":"Tp:13;",
-$1:function(a){return J.J0(a)},
-$isEH:true},
-e186:{
-"^":"Tp:13;",
-$1:function(a){return a.gS5()},
-$isEH:true},
-e187:{
-"^":"Tp:13;",
-$1:function(a){return a.gDo()},
-$isEH:true},
-e188:{
-"^":"Tp:13;",
-$1:function(a){return a.guj()},
-$isEH:true},
-e189:{
-"^":"Tp:13;",
-$1:function(a){return J.j1(a)},
-$isEH:true},
-e190:{
-"^":"Tp:13;",
-$1:function(a){return J.Aw(a)},
-$isEH:true},
-e191:{
-"^":"Tp:13;",
-$1:function(a){return J.dY(a)},
-$isEH:true},
-e192:{
-"^":"Tp:13;",
-$1:function(a){return J.OL(a)},
-$isEH:true},
-e193:{
-"^":"Tp:13;",
-$1:function(a){return a.gki()},
-$isEH:true},
-e194:{
-"^":"Tp:13;",
-$1:function(a){return a.gZn()},
-$isEH:true},
-e195:{
-"^":"Tp:13;",
-$1:function(a){return a.gvs()},
-$isEH:true},
-e196:{
-"^":"Tp:13;",
-$1:function(a){return a.gVh()},
-$isEH:true},
-e197:{
-"^":"Tp:13;",
-$1:function(a){return a.gZX()},
-$isEH:true},
-e198:{
-"^":"Tp:13;",
-$1:function(a){return J.SG(a)},
-$isEH:true},
-e199:{
-"^":"Tp:13;",
-$1:function(a){return J.L7(a)},
-$isEH:true},
-e200:{
-"^":"Tp:13;",
-$1:function(a){return a.gVF()},
-$isEH:true},
-e201:{
-"^":"Tp:13;",
-$1:function(a){return a.gkw()},
-$isEH:true},
-e202:{
-"^":"Tp:13;",
-$1:function(a){return J.K2(a)},
-$isEH:true},
-e203:{
-"^":"Tp:13;",
-$1:function(a){return J.uy(a)},
-$isEH:true},
-e204:{
-"^":"Tp:13;",
-$1:function(a){return a.gEy()},
-$isEH:true},
-e205:{
-"^":"Tp:13;",
-$1:function(a){return J.XJ(a)},
-$isEH:true},
-e206:{
-"^":"Tp:13;",
-$1:function(a){return J.Sl(a)},
-$isEH:true},
-e207:{
-"^":"Tp:13;",
-$1:function(a){return a.gJk()},
-$isEH:true},
-e208:{
-"^":"Tp:13;",
-$1:function(a){return J.Nl(a)},
-$isEH:true},
-e209:{
-"^":"Tp:13;",
-$1:function(a){return a.gSU()},
-$isEH:true},
-e210:{
-"^":"Tp:13;",
-$1:function(a){return a.gFc()},
-$isEH:true},
-e211:{
-"^":"Tp:13;",
-$1:function(a){return a.gYY()},
-$isEH:true},
-e212:{
-"^":"Tp:13;",
-$1:function(a){return a.gZ3()},
-$isEH:true},
-e213:{
-"^":"Tp:13;",
-$1:function(a){return J.ry(a)},
-$isEH:true},
-e214:{
-"^":"Tp:13;",
-$1:function(a){return J.I2(a)},
-$isEH:true},
-e215:{
-"^":"Tp:13;",
-$1:function(a){return a.gdN()},
-$isEH:true},
-e216:{
-"^":"Tp:13;",
-$1:function(a){return J.tp(a)},
-$isEH:true},
-e217:{
-"^":"Tp:13;",
-$1:function(a){return a.gaU()},
-$isEH:true},
-e218:{
-"^":"Tp:77;",
-$2:function(a,b){J.RX(a,b)},
-$isEH:true},
-e219:{
-"^":"Tp:77;",
-$2:function(a,b){J.a8(a,b)},
-$isEH:true},
-e220:{
-"^":"Tp:77;",
-$2:function(a,b){J.l7(a,b)},
-$isEH:true},
-e221:{
-"^":"Tp:77;",
-$2:function(a,b){J.kB(a,b)},
-$isEH:true},
-e222:{
-"^":"Tp:77;",
-$2:function(a,b){J.Ae(a,b)},
-$isEH:true},
-e223:{
-"^":"Tp:77;",
-$2:function(a,b){J.IX(a,b)},
-$isEH:true},
-e224:{
-"^":"Tp:77;",
-$2:function(a,b){J.WI(a,b)},
-$isEH:true},
-e225:{
-"^":"Tp:77;",
-$2:function(a,b){J.NZ(a,b)},
-$isEH:true},
-e226:{
-"^":"Tp:77;",
-$2:function(a,b){J.T5(a,b)},
-$isEH:true},
-e227:{
-"^":"Tp:77;",
-$2:function(a,b){J.i0(a,b)},
-$isEH:true},
-e228:{
-"^":"Tp:77;",
-$2:function(a,b){J.Sf(a,b)},
-$isEH:true},
-e229:{
-"^":"Tp:77;",
-$2:function(a,b){J.LM(a,b)},
-$isEH:true},
-e230:{
-"^":"Tp:77;",
-$2:function(a,b){J.qq(a,b)},
-$isEH:true},
-e231:{
-"^":"Tp:77;",
-$2:function(a,b){J.Ac(a,b)},
-$isEH:true},
-e232:{
-"^":"Tp:77;",
-$2:function(a,b){J.Yz(a,b)},
-$isEH:true},
-e233:{
-"^":"Tp:77;",
-$2:function(a,b){a.sw2(b)},
-$isEH:true},
-e234:{
-"^":"Tp:77;",
-$2:function(a,b){J.Qr(a,b)},
-$isEH:true},
-e235:{
-"^":"Tp:77;",
-$2:function(a,b){J.xW(a,b)},
-$isEH:true},
-e236:{
-"^":"Tp:77;",
-$2:function(a,b){J.BC(a,b)},
-$isEH:true},
-e237:{
-"^":"Tp:77;",
-$2:function(a,b){J.pB(a,b)},
-$isEH:true},
-e238:{
-"^":"Tp:77;",
-$2:function(a,b){J.NO(a,b)},
-$isEH:true},
-e239:{
-"^":"Tp:77;",
-$2:function(a,b){J.WB(a,b)},
-$isEH:true},
-e240:{
-"^":"Tp:77;",
-$2:function(a,b){J.JZ(a,b)},
-$isEH:true},
-e241:{
-"^":"Tp:77;",
-$2:function(a,b){J.fR(a,b)},
-$isEH:true},
-e242:{
-"^":"Tp:77;",
-$2:function(a,b){a.shY(b)},
-$isEH:true},
-e243:{
-"^":"Tp:77;",
-$2:function(a,b){J.uP(a,b)},
-$isEH:true},
-e244:{
-"^":"Tp:77;",
-$2:function(a,b){J.vJ(a,b)},
-$isEH:true},
-e245:{
-"^":"Tp:77;",
-$2:function(a,b){J.Nf(a,b)},
-$isEH:true},
-e246:{
-"^":"Tp:77;",
-$2:function(a,b){J.Pl(a,b)},
-$isEH:true},
-e247:{
-"^":"Tp:77;",
-$2:function(a,b){J.C3(a,b)},
-$isEH:true},
-e248:{
-"^":"Tp:77;",
-$2:function(a,b){J.xH(a,b)},
-$isEH:true},
-e249:{
-"^":"Tp:77;",
-$2:function(a,b){J.Nh(a,b)},
-$isEH:true},
-e250:{
-"^":"Tp:77;",
-$2:function(a,b){J.AI(a,b)},
-$isEH:true},
-e251:{
-"^":"Tp:77;",
-$2:function(a,b){J.nA(a,b)},
-$isEH:true},
-e252:{
-"^":"Tp:77;",
-$2:function(a,b){J.fb(a,b)},
-$isEH:true},
-e253:{
-"^":"Tp:77;",
-$2:function(a,b){a.siq(b)},
-$isEH:true},
-e254:{
-"^":"Tp:77;",
-$2:function(a,b){J.Qy(a,b)},
-$isEH:true},
-e255:{
-"^":"Tp:77;",
-$2:function(a,b){a.sKt(b)},
-$isEH:true},
-e256:{
-"^":"Tp:77;",
-$2:function(a,b){J.cV(a,b)},
-$isEH:true},
-e257:{
-"^":"Tp:77;",
-$2:function(a,b){J.mU(a,b)},
-$isEH:true},
-e258:{
-"^":"Tp:77;",
-$2:function(a,b){J.Kz(a,b)},
-$isEH:true},
-e259:{
-"^":"Tp:77;",
-$2:function(a,b){J.uM(a,b)},
-$isEH:true},
-e260:{
-"^":"Tp:77;",
-$2:function(a,b){J.Er(a,b)},
-$isEH:true},
-e261:{
-"^":"Tp:77;",
-$2:function(a,b){J.uX(a,b)},
-$isEH:true},
-e262:{
-"^":"Tp:77;",
-$2:function(a,b){J.hS(a,b)},
-$isEH:true},
-e263:{
-"^":"Tp:77;",
-$2:function(a,b){J.mz(a,b)},
-$isEH:true},
-e264:{
-"^":"Tp:77;",
-$2:function(a,b){J.pA(a,b)},
-$isEH:true},
-e265:{
-"^":"Tp:77;",
-$2:function(a,b){a.sSK(b)},
-$isEH:true},
-e266:{
-"^":"Tp:77;",
-$2:function(a,b){a.shX(b)},
-$isEH:true},
-e267:{
-"^":"Tp:77;",
-$2:function(a,b){J.cl(a,b)},
-$isEH:true},
-e268:{
-"^":"Tp:77;",
-$2:function(a,b){J.Jb(a,b)},
-$isEH:true},
-e269:{
-"^":"Tp:77;",
-$2:function(a,b){J.xQ(a,b)},
-$isEH:true},
-e270:{
-"^":"Tp:77;",
-$2:function(a,b){J.MX(a,b)},
-$isEH:true},
-e271:{
-"^":"Tp:77;",
-$2:function(a,b){J.A4(a,b)},
-$isEH:true},
-e272:{
-"^":"Tp:77;",
-$2:function(a,b){J.wD(a,b)},
-$isEH:true},
-e273:{
-"^":"Tp:77;",
-$2:function(a,b){J.wJ(a,b)},
-$isEH:true},
-e274:{
-"^":"Tp:77;",
-$2:function(a,b){J.oJ(a,b)},
-$isEH:true},
-e275:{
-"^":"Tp:77;",
-$2:function(a,b){J.DF(a,b)},
-$isEH:true},
-e276:{
-"^":"Tp:77;",
-$2:function(a,b){J.h9(a,b)},
-$isEH:true},
-e277:{
-"^":"Tp:77;",
-$2:function(a,b){a.sL1(b)},
-$isEH:true},
-e278:{
-"^":"Tp:77;",
-$2:function(a,b){J.XF(a,b)},
-$isEH:true},
-e279:{
-"^":"Tp:77;",
-$2:function(a,b){J.SF(a,b)},
-$isEH:true},
-e280:{
-"^":"Tp:77;",
-$2:function(a,b){J.Qv(a,b)},
-$isEH:true},
-e281:{
-"^":"Tp:77;",
-$2:function(a,b){J.Xg(a,b)},
-$isEH:true},
-e282:{
-"^":"Tp:77;",
-$2:function(a,b){J.aw(a,b)},
-$isEH:true},
-e283:{
-"^":"Tp:77;",
-$2:function(a,b){J.CJ(a,b)},
-$isEH:true},
-e284:{
-"^":"Tp:77;",
-$2:function(a,b){J.P2(a,b)},
-$isEH:true},
-e285:{
-"^":"Tp:77;",
-$2:function(a,b){J.fv(a,b)},
-$isEH:true},
-e286:{
-"^":"Tp:77;",
-$2:function(a,b){J.PP(a,b)},
-$isEH:true},
-e287:{
-"^":"Tp:77;",
-$2:function(a,b){J.Sj(a,b)},
-$isEH:true},
-e288:{
-"^":"Tp:77;",
-$2:function(a,b){J.tv(a,b)},
-$isEH:true},
-e289:{
-"^":"Tp:77;",
-$2:function(a,b){J.w7(a,b)},
-$isEH:true},
-e290:{
-"^":"Tp:77;",
-$2:function(a,b){J.ME(a,b)},
-$isEH:true},
-e291:{
-"^":"Tp:77;",
-$2:function(a,b){J.kX(a,b)},
-$isEH:true},
-e292:{
-"^":"Tp:77;",
-$2:function(a,b){J.q0(a,b)},
-$isEH:true},
-e293:{
-"^":"Tp:77;",
-$2:function(a,b){J.EJ(a,b)},
-$isEH:true},
-e294:{
-"^":"Tp:77;",
-$2:function(a,b){J.iH(a,b)},
-$isEH:true},
-e295:{
-"^":"Tp:77;",
-$2:function(a,b){J.SO(a,b)},
-$isEH:true},
-e296:{
-"^":"Tp:77;",
-$2:function(a,b){J.B9(a,b)},
-$isEH:true},
-e297:{
-"^":"Tp:77;",
-$2:function(a,b){J.PN(a,b)},
-$isEH:true},
-e298:{
-"^":"Tp:77;",
-$2:function(a,b){a.sVc(b)},
-$isEH:true},
-e299:{
-"^":"Tp:77;",
-$2:function(a,b){J.By(a,b)},
-$isEH:true},
-e300:{
-"^":"Tp:77;",
-$2:function(a,b){J.jd(a,b)},
-$isEH:true},
-e301:{
-"^":"Tp:77;",
-$2:function(a,b){J.Rx(a,b)},
-$isEH:true},
-e302:{
-"^":"Tp:77;",
-$2:function(a,b){J.ZI(a,b)},
-$isEH:true},
-e303:{
-"^":"Tp:77;",
-$2:function(a,b){J.fa(a,b)},
-$isEH:true},
-e304:{
-"^":"Tp:77;",
-$2:function(a,b){J.Cu(a,b)},
-$isEH:true},
-e305:{
-"^":"Tp:77;",
-$2:function(a,b){a.sV8(b)},
-$isEH:true},
-e306:{
-"^":"Tp:77;",
-$2:function(a,b){J.Hn(a,b)},
-$isEH:true},
-e307:{
-"^":"Tp:77;",
-$2:function(a,b){J.Tx(a,b)},
-$isEH:true},
-e308:{
-"^":"Tp:77;",
-$2:function(a,b){a.sDo(b)},
-$isEH:true},
-e309:{
-"^":"Tp:77;",
-$2:function(a,b){a.suj(b)},
-$isEH:true},
-e310:{
-"^":"Tp:77;",
-$2:function(a,b){J.H3(a,b)},
-$isEH:true},
-e311:{
-"^":"Tp:77;",
-$2:function(a,b){J.t3(a,b)},
-$isEH:true},
-e312:{
-"^":"Tp:77;",
-$2:function(a,b){J.my(a,b)},
-$isEH:true},
-e313:{
-"^":"Tp:77;",
-$2:function(a,b){a.sVF(b)},
-$isEH:true},
-e314:{
-"^":"Tp:77;",
-$2:function(a,b){J.yO(a,b)},
-$isEH:true},
-e315:{
-"^":"Tp:77;",
-$2:function(a,b){J.ZU(a,b)},
-$isEH:true},
-e316:{
-"^":"Tp:77;",
-$2:function(a,b){J.tQ(a,b)},
-$isEH:true},
-e317:{
-"^":"Tp:77;",
-$2:function(a,b){J.tH(a,b)},
-$isEH:true},
-e318:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e319:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e320:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e321:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e322:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e323:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e324:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e325:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e326:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e327:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e328:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e329:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e330:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e331:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e332:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e333:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e334:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e335:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e336:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e337:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e338:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e339:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e340:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e341:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e342:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e343:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e344:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e345:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e346:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e347:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("flag-list",C.BL)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e348:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e349:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e350:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e351:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e352:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e353:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e354:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e355:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e356:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e357:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e358:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e359:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e360:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e361:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e362:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e363:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e364:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e365:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e366:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e367:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e368:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-process-list-view",C.Ep)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e369:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e370:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e371:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e372:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e373:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e374:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e375:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e376:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e377:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e378:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e379:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e380:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e381:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e382:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e383:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e384:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e385:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e386:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e387:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e388:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e389:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e390:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e391:{
-"^":"Tp:69;",
-$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,{
-"^":"",
-G6:{
-"^":"Vc;BW,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.BW).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Dw:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.C8.ZL(a)
-C.C8.XI(a)
-return a}}},
-Vc:{
-"^":"uL+Pi;",
-$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
-"^":"",
-eW:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{rt:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.YZz.ZL(a)
-C.YZz.XI(a)
-return a}}}}],["class_tree_element","package:observatory/src/elements/class_tree.dart",,O,{
-"^":"",
-CZ:{
-"^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
-C4:function(a){var z,y,x,w,v,u,t
-z=this.ks
-if(z.length>0)return
-for(y=J.mY(J.Mx(this.Ru)),x=this.od,w=this.yt+1;y.G();){v=y.gl()
-if(v.gi2()===!0)continue
-u=[]
-u.$builtinTypeInfo=[G.Y2]
-t=new O.CZ(x,v,this,w,u,[],"\u2192","cursor: pointer;",!1,null,null)
-if(!t.Nh()){u=t.aZ
-if(t.gnz(t)&&!J.xC(u,"visibility:hidden;")){u=new T.qI(t,C.Pn,u,"visibility:hidden;")
-u.$builtinTypeInfo=[null]
-t.nq(t,u)}t.aZ="visibility:hidden;"}z.push(t)}},
-cO:function(){},
-Nh:function(){return J.q8(J.Mx(this.Ru))>0}},
-eo:{
-"^":"Vfx;CA,Hm=,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-god:function(a){return a.CA},
-sod:function(a,b){a.CA=this.ct(a,C.rB,a.CA,b)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=R.tB([])
-a.Hm=new G.XN(z,null,null)
-z=a.CA
-if(z!=null)this.hP(a,z.gDZ())},
-vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","gQ1",2,0,13,57],
-hP:function(a,b){var z,y,x,w,v,u,t,s,r,q
-try{w=a.CA
-v=H.VM([],[G.Y2])
-u=new O.CZ(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
-u.k7(null)
-z=u
-w=J.Mx(z)
-v=a.CA
-t=z
-s=H.VM([],[G.Y2])
-r=t!=null?t.gyt()+1:0
-s=new O.CZ(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
-s.k7(t)
-w.push(s)
-a.Hm.rT(z)}catch(q){w=H.Ru(q)
-y=w
-x=new H.XO(q,null)
-N.QM("").xH("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),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,91,92],
-Vj:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,91,92],
-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()
-w.qU(v-1)}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,93,1,94,95],
-static:{l0:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.RD.ZL(a)
-C.RD.XI(a)
-return a}}},
-Vfx:{
-"^":"uL+Pi;",
-$isd3:true},
-nc:{
-"^":"Tp:13;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
-"^":"",
-aC:{
-"^":"Dsd;yB,mN,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gRu:function(a){return a.yB},
-sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
-gCF:function(a){return a.mN},
-sCF:function(a,b){a.mN=this.ct(a,C.tg,a.mN,b)},
-vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,97,98],
-S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,99,100],
-RF:[function(a,b){J.r0(a.yB).Qy(b)},"$1","gvC",2,0,20,90],
-static:{lW:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ka.ZL(a)
-C.ka.XI(a)
-return a}}},
-Dsd:{
-"^":"uL+Pi;",
-$isd3:true},
-SS:{
-"^":"Tp:101;a",
-$1:[function(a){var z,y
-z=this.a
-y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,82,"call"],
-$isEH:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
-"^":"",
-VY:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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,13,57],
-static:{On:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.IK.ZL(a)
-C.IK.XI(a)
-return a}}}}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
-"^":"",
-Be:{
-"^":"tuj;Xx,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gtT:function(a){return a.Xx},
-stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=a.Xx
-if(z==null)return
-J.SK(z).ml(new F.Bc())},
-RF:[function(a,b){J.r0(a.Xx).Qy(b)},"$1","gvC",2,0,20,90],
-m2:function(a,b){var z,y,x
-z=J.Vs(b).MW.getAttribute("data-jump-target")
-if(z==="")return
-y=H.BU(z,null,null)
-x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
-if(x==null)return
-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,102,1,94,95],
-Lk:[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,102,1,94,95],
-static:{f9:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ux.ZL(a)
-C.ux.XI(a)
-return a}}},
-tuj:{
-"^":"uL+Pi;",
-$isd3:true},
-Bc:{
-"^":"Tp:103;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,81,"call"],
-$isEH:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
-"^":"",
-JI:{
-"^":"Xfs;GV,uo,nx,oM,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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},
-sv8:function(a,b){a.uo=this.ct(a,C.S4,a.uo,b)},
-gFR:function(a){return a.nx},
-Ki:function(a){return this.gFR(a).$0()},
-AV:function(a,b,c){return this.gFR(a).$2(b,c)},
-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,20,57],
-WM:[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,18],
-ko:[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,80,46,47,81],
-static:{U9:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.GV=!1
-a.uo=!1
-a.nx=null
-a.oM=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.O0.ZL(a)
-C.O0.XI(a)
-return a}}},
-Xfs:{
-"^":"xc+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
-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},
-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.bI(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.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
-if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-z=J.x(c)
-if(!z.$isyN)c=z.tt(c,!1)
-z=J.U6(c)
-y=z.gB(c)
-x=a.length
-if(typeof y!=="number")return H.s(y)
-C.Nm.sB(a,x+y)
-x=a.length
-if(!!a.immutable$list)H.vh(P.f("set range"))
-H.qG(a,b+y,x,a,b)
-for(z=z.gA(c);z.G();b=w){w=b+1
-C.Nm.u(a,b,z.gl())}},
-vf: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")},
-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.bI(z.g(b,e),1),x=J.bI(J.ew(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.bI(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)
-if(J.xC(a[z],b))return z}return-1},
-lO:function(a,b,c){var z,y
-if(typeof c!=="number")return c.C()
-if(c<0)return-1
-z=a.length
-if(c>=z)c=z-1
-for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.xC(a[y],b))return y}return-1},
-ZE:function(a,b,c,d){if(c-b<=32)H.w9(a,b,c,d)
-else H.wR(a,b,c,d)},
-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.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)}},
-wR:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
-z=C.jn.cU(c-b+1,6)
-y=b+z
-x=c-z
-w=C.jn.cU(b+c,2)
-v=w-z
-u=w+z
-t=J.U6(a)
-s=t.t(a,y)
-r=t.t(a,v)
-q=t.t(a,w)
-p=t.t(a,u)
-o=t.t(a,x)
-if(J.z8(d.$2(s,r),0)){n=r
-r=s
-s=n}if(J.z8(d.$2(p,o),0)){n=o
-o=p
-p=n}if(J.z8(d.$2(s,q),0)){n=q
-q=s
-s=n}if(J.z8(d.$2(r,q),0)){n=q
-q=r
-r=n}if(J.z8(d.$2(s,p),0)){n=p
-p=s
-s=n}if(J.z8(d.$2(q,p),0)){n=p
-p=q
-q=n}if(J.z8(d.$2(r,o),0)){n=o
-o=r
-r=n}if(J.z8(d.$2(r,q),0)){n=q
-q=r
-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)
-t.u(a,x,o)
-t.u(a,v,t.t(a,b))
-t.u(a,u,t.t(a,c))
-m=b+1
-l=c-1
-if(J.xC(d.$2(r,p),0)){for(k=m;k<=l;++k){j=t.t(a,k)
-i=d.$2(j,r)
-h=J.x(i)
-if(h.n(i,0))continue
-if(h.C(i,0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else for(;!0;){i=d.$2(t.t(a,l),r)
-h=J.Wx(i)
-if(h.D(i,0)){--l
-continue}else{g=l-1
-if(h.C(i,0)){t.u(a,k,t.t(a,m))
-f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
-l=g
-m=f
-break}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
-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.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))
-f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
-l=g
-m=f}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
-l=g}break}}e=!1}h=m-1
-t.u(a,b,t.t(a,h))
-t.u(a,h,r)
-h=l+1
-t.u(a,c,t.t(a,h))
-t.u(a,h,p)
-H.ZE(a,b,m-2,d)
-H.ZE(a,l+2,c,d)
-if(e)return
-if(m<y&&l>x){for(;J.xC(d.$2(t.t(a,m),r),0);)++m
-for(;J.xC(d.$2(t.t(a,l),p),0);)--l
-for(k=m;k<=l;++k){j=t.t(a,k)
-if(J.xC(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.xC(d.$2(j,p),0))for(;!0;)if(J.xC(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))
-f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
-l=g
-m=f}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
-l=g}break}}H.ZE(a,m,l,d)}else H.ZE(a,m,l,d)},
-aL:{
-"^":"mW;",
-gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
-aN:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
-y=0
-for(;y<z;++y){b.$1(this.Zv(0,y))
-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.bI(this.gB(this),1))},
-tg:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
-y=0
-for(;y<z;++y){if(J.xC(this.Zv(0,y),b))return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
-Vr:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
-y=0
-for(;y<z;++y){if(b.$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
-zV:function(a,b){var z,y,x,w,v,u
-z=this.gB(this)
-if(b.length!==0){y=J.x(z)
-if(y.n(z,0))return""
-x=H.d(this.Zv(0,0))
-if(!y.n(z,this.gB(this)))throw H.b(P.a4(this))
-w=P.p9(x)
-if(typeof z!=="number")return H.s(z)
-v=1
-for(;v<z;++v){w.vM+=b
-u=this.Zv(0,v)
-w.vM+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}else{w=P.p9("")
-if(typeof z!=="number")return H.s(z)
-v=0
-for(;v<z;++v){u=this.Zv(0,v)
-w.vM+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
-ad:function(a,b){return P.mW.prototype.ad.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"kY",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},31],
-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)
-if(typeof y!=="number")return H.s(y)
-y=Array(y)
-y.fixed$length=init
-z=H.VM(y,[H.ip(this,"aL",0)])}x=0
-while(!0){y=this.gB(this)
-if(typeof y!=="number")return H.s(y)
-if(!(x<y))break
-y=this.Zv(0,x)
-if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},
-br:function(a){return this.tt(a,!0)},
-$isyN:true},
-bX:{
-"^":"aL;l6,SH,AN",
-gMa:function(){var z,y
-z=J.q8(this.l6)
-y=this.AN
-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.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.bI(z,y)
-return J.bI(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.q9(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.q9(this.l6,y,J.ew(y,b),null)
-else{x=J.ew(y,b)
-if(J.u6(z,x))return this
-return H.q9(this.l6,y,x,null)}},
-Hd:function(a,b,c,d){var z,y,x
-z=this.SH
-y=J.Wx(z)
-if(y.C(z,0))throw H.b(P.N(z))
-x=this.AN
-if(x!=null){if(J.u6(x,0))throw H.b(P.N(x))
-if(y.D(z,x))throw H.b(P.TE(z,0,x))}},
-static:{q9:function(a,b,c,d){var z=H.VM(new H.bX(a,b,c),[d])
-z.Hd(a,b,c,d)
-return z}}},
-a7:{
-"^":"a;l6,SW,G7,lo",
-gl:function(){return this.lo},
-G:function(){var z,y,x,w
-z=this.l6
-y=J.U6(z)
-x=y.gB(z)
-if(!J.xC(this.SW,x))throw H.b(P.a4(z))
-w=this.G7
-if(typeof x!=="number")return H.s(x)
-if(w>=x){this.lo=null
-return!1}this.lo=y.Zv(z,w);++this.G7
-return!0}},
-i1:{
-"^":"mW;l6,T6",
-mb:function(a){return this.T6.$1(a)},
-gA:function(a){var z=new H.MH(null,J.mY(this.l6),this.T6)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-gB:function(a){return J.q8(this.l6)},
-gl0:function(a){return J.FN(this.l6)},
-grZ:function(a){return this.mb(J.MQ(this.l6))},
-$asmW: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:{
-"^":"Dk;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},
-$asDk:function(a,b){return[b]}},
-A8:{
-"^":"aL;CR,T6",
-mb:function(a){return this.T6.$1(a)},
-gB:function(a){return J.q8(this.CR)},
-Zv:function(a,b){return this.mb(J.i9(this.CR,b))},
-$asaL:function(a,b){return[b]},
-$asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
-$isyN:true},
-U5:{
-"^":"mW;l6,T6",
-gA:function(a){var z=new H.Mo(J.mY(this.l6),this.T6)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z}},
-Mo:{
-"^":"Dk;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()}},
-oA:{
-"^":"mW;l6,T6",
-gA:function(a){var z=new H.Wy(J.mY(this.l6),this.T6,C.Gw,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-$asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]}},
-Wy:{
-"^":"a;OI,T6,e0,lo",
-mb:function(a){return this.T6.$1(a)},
-gl:function(){return this.lo},
-G:function(){var z,y
-z=this.e0
-if(z==null)return!1
-for(y=this.OI;!z.G();){this.lo=null
-if(y.G()){this.e0=null
-z=J.mY(this.mb(y.gl()))
-this.e0=z}else return!1}this.lo=this.e0.gl()
-return!0}},
-FuS:{
-"^":"a;",
-G:function(){return!1},
-gl:function(){return}},
-SU7:{
-"^":"a;",
-sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
-h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
-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:{
-"^":"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"))},
-h:function(a,b){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"))},
-GT:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
-Jd:function(a){return this.GT(a,null)},
-V1:function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},
-YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable 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 remove from an unmodifiable list"))},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-w2Y:{
-"^":"ark+Zl;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-iK:{
-"^":"aL;CR",
-gB:function(a){return J.q8(this.CR)},
-Zv:function(a,b){var z,y,x
-z=this.CR
-y=J.U6(z)
-x=y.gB(z)
-if(typeof b!=="number")return H.s(b)
-return y.Zv(z,x-1-b)}},
-IN:{
-"^":"a;fN>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isIN&&J.xC(this.fN,b.fN)},
-giO:function(a){var z=J.v1(this.fN)
-if(typeof z!=="number")return H.s(z)
-return 536870911&664597*z},
-bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
-$isIN:true,
-$isGD:true,
-static:{"^":"RWj,ES1,quP,KGP,eD,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,{
-"^":"",
-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,19],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,19],
-VH:function(a,b){var z=H.G3()
-z=H.KT(z,[z,z]).BD(a)
-if(z)return b.O8(a)
-else return b.wY(a)},
-Iw:function(a,b){var z=P.Dt(b)
-P.rT(C.ny,new P.w4(a,z))
-return z},
-YZ:function(a,b){var z,y,x,w,v
-z={}
-z.a=null
-z.b=null
-z.c=0
-z.d=null
-z.e=null
-y=new P.mQ(z,b)
-for(x=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
-y=z.c
-if(y===0)return P.Ab(C.dn,null)
-w=Array(y)
-w.fixed$length=init
-z.b=w
-y=P.WO
-v=H.VM(new P.Zf(P.Dt(y)),[y])
-z.a=v
-return v.MM},
-Cx:function(){var z=$.S6
-for(;z!=null;){J.cG(z)
-z=z.gaw()
-$.S6=z}$.k8=null},
-BG:[function(){var z
-try{P.Cx()}catch(z){H.Ru(z)
-$.ej().$1(P.qZ())
-$.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,18],
-IA:function(a){var z,y
-z=$.k8
-if(z==null){z=new P.OM(a,null)
-$.k8=z
-$.S6=z
-$.ej().$1(P.qZ())}else{y=new P.OM(a,null)
-z.aw=y
-$.k8=y}},
-rb:function(a){var z
-if(J.xC($.X3,C.NU)){$.X3.wr(a)
-return}z=$.X3
-z.wr(z.xi(a,!0))},
-x2:function(a,b,c,d,e,f){return e?H.VM(new P.Xq(b,c,d,a,null,0,null),[f]):H.VM(new P.Gh(b,c,d,a,null,0,null),[f])},
-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
-z.iE=z}else{z=H.VM(new P.HX(b,a,0,null,null,null,null),[d])
-z.SJ=z
-z.iE=z}return z},
-ot:function(a){var z,y,x,w,v
-if(a==null)return
-try{z=a.$0()
-if(!!J.x(z).$isb8)return z
-return}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-$.X3.hk(y,x)}},
-SN:[function(a){},"$1","Ax",2,0,20,21],
-vF:[function(a,b){$.X3.hk(a,b)},function(a){return P.vF(a,null)},null,"$2","$1","Mm",2,2,22,23,24,25],
-p0:[function(){},"$0","od",0,0,18],
-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.XO(x,null)
-c.$2(z,y)}},
-NX:function(a,b,c,d){var z=a.ed()
-if(!!J.x(z).$isb8)z.Qy(new P.dR(b,c,d))
-else b.K5(c,d)},
-TB:function(a,b){return new P.uR(a,b)},
-Bb:function(a,b,c){var z=a.ed()
-if(!!J.x(z).$isb8)z.Qy(new P.Q0(b,c))
-else b.rX(c)},
-rT: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){a.Gr(new P.FO(d,e))},"$5","wL",10,0,26,27,28,29,24,25],
-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}},"$4","lw",8,0,30,27,28,29,31],
-yv:[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}},"$5","Un",10,0,32,27,28,29,31,33],
-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}},"$6","iy",12,0,34,27,28,29,31,9,10],
-Ee:[function(a,b,c,d){return d},"$4","Qk",8,0,35,27,28,29,31],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,36,27,28,29,31],
-dL:[function(a,b,c,d){return d},"$4","v3",8,0,37,27,28,29,31],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,38],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,39,27,28,29,40,41],
-XB:[function(a,b,c,d){H.qw(d)},"$4","aW",8,0,42],
-CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,43],
-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,44],
-C6:{
-"^":"Tp:69;a",
-$0:[function(){H.cv()
-this.a.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-Ca:{
-"^":"a;kc>,I4<",
-$isXS:true},
-Ik:{
-"^":"O9;Y8"},
-LR:{
-"^":"yU;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,Ri",
-gY8:function(){return this.Y8},
-uR:function(a){var z=this.Ae
-if(typeof z!=="number")return z.i()
-return(z&1)===a},
-Ac:function(){var z=this.Ae
-if(typeof z!=="number")return z.w()
-this.Ae=z^1},
-gP4:function(){var z=this.Ae
-if(typeof z!=="number")return z.i()
-return(z&2)!==0},
-dK:function(){var z=this.Ae
-if(typeof z!=="number")return z.k()
-this.Ae=z|4},
-gHj:function(){var z=this.Ae
-if(typeof z!=="number")return z.i()
-return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
-static:{"^":"E2b,PR,id"}},
-Ks:{
-"^":"a;iE@,SJ@",
-gUF:function(){return!1},
-im:function(){var z=this.yx
-if(z!=null)return z
-z=P.Dt(null)
-this.yx=z
-return z},
-p1:function(a){var z,y
-z=a.gSJ()
-y=a.giE()
-z.siE(y)
-y.sSJ(z)
-a.sSJ(a)
-a.siE(a)},
-ET:function(a){var z,y,x
-if((this.Gv&4)!==0){z=new P.EM($.X3,0,P.od())
-z.$builtinTypeInfo=this.$builtinTypeInfo
-z.yc()
-return z}z=$.X3
-y=a?1:0
-x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
-x.$builtinTypeInfo=this.$builtinTypeInfo
-x.SJ=x
-x.iE=x
-y=this.SJ
-x.SJ=y
-x.iE=this
-y.siE(x)
-this.SJ=x
-x.Ae=this.Gv&1
-if(this.iE===x)P.ot(this.nL)
-return x},
-j0:function(a){if(a.giE()===a)return
-if(a.gP4())a.dK()
-else{this.p1(a)
-if((this.Gv&2)===0&&this.iE===this)this.Of()}},
-mO:function(a){},
-m4:function(a){},
-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.XW(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"Ks")},104],
-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,105,23,24,25],
-S6:function(a){var z,y
-z=this.Gv
-if((z&4)!==0)return this.yx
-if(z>=4)throw H.b(this.q7())
-this.Gv=z|4
-y=this.im()
-this.Pl()
-return y},
-Rg:function(a,b){this.Iv(b)},
-oJ:function(a,b){this.pb(a,b)},
-YB:function(){var z=this.WX
-this.WX=null
-this.Gv&=4294967287
-C.jN.tZ(z)},
-FW:function(a){var z,y,x,w
-z=this.Gv
-if((z&2)!==0)throw H.b(P.w("Cannot fire new event. Controller is already firing an event"))
-y=this.iE
-if(y===this)return
-x=z&1
-this.Gv=z^3
-for(;y!==this;)if(y.uR(x)){z=y.gAe()
-if(typeof z!=="number")return z.k()
-y.sAe(z|2)
-a.$1(y)
-y.Ac()
-w=y.giE()
-if(y.gHj())this.p1(y)
-z=y.gAe()
-if(typeof z!=="number")return z.i()
-y.sAe(z&4294967293)
-y=w}else y=y.giE()
-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.Ym)}},
-zW:{
-"^":"Ks;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
-this.iE.Rg(0,a)
-this.Gv&=4294967293
-if(this.iE===this)this.Of()
-return}this.FW(new P.tK(this,a))},
-pb:function(a,b){if(this.iE===this)return
-this.FW(new P.ORH(this,a,b))},
-Pl:function(){if(this.iE!==this)this.FW(new P.eB(this))
-else this.yx.OH(null)}},
-tK:{
-"^":"Tp;a,b",
-$1:function(a){a.Rg(0,this.b)},
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
-ORH:{
-"^":"Tp;a,b,c",
-$1:function(a){a.oJ(this.b,this.c)},
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
-eB:{
-"^":"Tp;a",
-$1:function(a){a.YB()},
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Mc",args:[[P.LR,a]]}},this.a,"zW")}},
-HX:{
-"^":"Ks;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.w6(y)}},
-pb:function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.WG(a,b,null))},
-Pl:function(){var z=this.iE
-if(z!==this)for(;z!==this;z=z.giE())z.w6(C.ZB)
-else this.yx.OH(null)}},
-b8:{
-"^":"a;",
-$isb8:true},
-w4:{
-"^":"Tp:69;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.XO(x,null)
-this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
-$isEH:true},
-mQ:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){var z,y,x
-z=this.a
-y=z.b
-z.b=null
-x=--z.c
-if(y!=null)if(x===0||this.b)z.a.w0(a,b)
-else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,106,107,"call"],
-$isEH:true},
-Tw:{
-"^":"Tp:108;a,c,d",
-$1:[function(a){var z,y,x,w
-z=this.a
-y=--z.c
-x=z.b
-if(x!=null){w=this.d
-if(w<0||w>=x.length)return H.e(x,w)
-x[w]=a
-if(y===0){z=z.a.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,21,"call"],
-$isEH:true},
-oh:{
-"^":"a;",
-$isoh:true},
-Pf0:{
-"^":"a;",
-$isoh:true},
-Zf:{
-"^":"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,109,23,21],
-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)},"pm","$2","$1","gyr",2,2,105,23,24,25]},
-Gc:{
-"^":"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},
-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},
-go7:function(){return this.Gv===2?null:this.qV},
-gIa:function(){return this.Gv===2?null:this.o4},
-Rx:function(a,b){var z,y
-z=$.X3
-y=H.VM(new P.Gc(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)
-x=H.VM(new P.Gc(0,z,null,null,null,$.X3.wY(b),y,null),[null])
-this.au(x)
-return x},
-OA:function(a){return this.co(a,null)},
-Qy:function(a){var z,y
-z=$.X3
-y=new P.Gc(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},
-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){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
-this.jk=null
-for(y=null;z!=null;y=z,z=x){x=z.gBQ()
-z.sBQ(y)}return y},
-rX:function(a){var z,y
-z=J.x(a)
-if(!!z.$isb8)if(!!z.$isGc)P.A9(a,this)
-else P.k3(a,this)
-else{y=this.L3()
-this.Am(a)
-P.HZ(this,y)}},
-R8:function(a){var z=this.L3()
-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,22,23,24,25],
-OH:function(a){var z
-if(a==null);else{z=J.x(a)
-if(!!z.$isb8){if(!!z.$isGc){z=a.Gv
-if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.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
-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
-this.Lj.wr(new P.iX(this,a,b))},
-J9:function(a,b){this.OH(a)},
-X8:function(a,b,c){this.CG(a,b)},
-$isGc:true,
-$isb8:true,
-static:{"^":"ewM,JE,C3n,oN1,dh",Dt:function(a){return H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[b])
-z.J9(a,b)
-return z},Vu:function(a,b,c){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[c])
-z.X8(a,b,c)
-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
-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()
-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
-u=z.e.gWj()?z.e.gDL():null
-x.c=u
-x.d=!1
-y=!w
-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=(u==null?y!=null:u!==y)&&!!J.x(y).$isb8}else y=!1
-if(y){r=x.c
-if(!!J.x(r).$isGc)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=q}}}},
-da:{
-"^":"Tp:69;a,b",
-$0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-U7:{
-"^":"Tp:13;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,21,"call"],
-$isEH:true},
-vr:{
-"^":"Tp:110;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
-$isEH:true},
-cX:{
-"^":"Tp:69;a,b",
-$0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
-eX:{
-"^":"Tp:69;c,d",
-$0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-iX:{
-"^":"Tp:69;a,b,c",
-$0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
-rq:{
-"^":"Tp:111;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:{
-"^":"Tp:18;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{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
-w=r
-v=new H.XO(q,null)
-r=J.w8(z)
-p=w
-o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
-r=this.b
-r.c=o
-r.b=!1
-return}u=r.go7()
-if(x===!0&&u!=null){try{r=u
-p=H.G3()
-p=H.KT(p,[p,p]).BD(r)
-n=this.bK
-m=this.b
-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.XO(q,null)
-r=J.w8(z)
-p=t
-o=(r==null?p==null:r===p)?z:new P.Ca(t,s)
-r=this.b
-r.c=o
-r.b=!1
-return}this.b.b=!0}else{r=this.b
-r.c=z
-r.b=!1}},
-$isEH:true},
-RT:{
-"^":"Tp:18;c,b,Gq,Rm,w3",
-$0:function(){var z,y,x,w,v,u
-z={}
-z.a=null
-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,v),new P.FZ(z,v))}},
-$isEH:true},
-jZ:{
-"^":"Tp:13;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,112,"call"],
-$isEH:true},
-FZ:{
-"^":"Tp:110;a,mG",
-$2:[function(a,b){var z,y
-z=this.a
-if(!J.x(z.a).$isGc){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,23,24,25,"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.XW(function(a){return{func:"bp",ret:P.cb,args:[{func:"Lf",args:[a]}]}},this.$receiver,"cb")},113],
-lM:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"cb",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"xv",ret:P.cb,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},113],
-tg:function(a,b){var z,y
-z={}
-y=P.Dt(P.a2)
-z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.kb(y),y.gaq())
-return y},
-aN:function(a,b){var z,y
-z={}
-y=P.Dt(null)
-z.a=null
-z.a=this.KR(new P.lz(z,this,b,y),!0,new P.ib(y),y.gaq())
-return y},
-Vr:function(a,b){var z,y
-z={}
-y=P.Dt(P.a2)
-z.a=null
-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={}
-y=P.Dt(P.KN)
-z.a=0
-this.KR(new P.PI(z),!0,new P.uO(z,y),y.gaq())
-return y},
-gl0:function(a){var z,y
-z={}
-y=P.Dt(P.a2)
-z.a=null
-z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gaq())
-return y},
-gtH:function(a){var z,y
-z={}
-y=P.Dt(H.ip(this,"cb",0))
-z.a=null
-z.a=this.KR(new P.xp(z,this,y),!0,new P.OC(y),y.gaq())
-return y},
-grZ:function(a){var z,y
-z={}
-y=P.Dt(H.ip(this,"cb",0))
-z.a=null
-z.b=!1
-this.KR(new P.UH(z,this),!0,new P.Z5(z,y),y.gaq())
-return y},
-$iscb:true},
-Sd:{
-"^":"Tp;a,b,c,d",
-$1:[function(a){var z,y
-z=this.a
-y=this.d
-P.FE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,114,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-Oh:{
-"^":"Tp:69;e,f",
-$0:function(){return J.xC(this.f,this.e)},
-$isEH:true},
-jvH:{
-"^":"Tp:115;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
-$isEH:true},
-kb:{
-"^":"Tp:69;bK",
-$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
-$isEH:true},
-lz:{
-"^":"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,114,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-at:{
-"^":"Tp:69;e,f",
-$0:function(){return this.e.$1(this.f)},
-$isEH:true},
-mj:{
-"^":"Tp:13;",
-$1:function(a){},
-$isEH:true},
-ib:{
-"^":"Tp:69;UI",
-$0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-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,114,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-WN:{
-"^":"Tp:69;e,f",
-$0:function(){return this.e.$1(this.f)},
-$isEH:true},
-XPB:{
-"^":"Tp:115;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
-$isEH:true},
-BSd:{
-"^":"Tp:69;bK",
-$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
-$isEH:true},
-PI:{
-"^":"Tp:13;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-uO:{
-"^":"Tp:69;a,b",
-$0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
-qg:{
-"^":"Tp:13;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-Wd:{
-"^":"Tp:69;c",
-$0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
-$isEH:true},
-xp:{
-"^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-OC:{
-"^":"Tp:69;d",
-$0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
-$isEH:true},
-UH:{
-"^":"Tp;a,b",
-$1:[function(a){var z=this.a
-z.b=!0
-z.a=a},"$1",null,2,0,null,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-Z5:{
-"^":"Tp:69;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"],
-$isEH:true},
-Oy:{
-"^":"a;",
-$isOy:true},
-nR:{
-"^":"a;",
-gUF:function(){var z=this.Gv
-return(z&1)!==0?this.gEe().gyD():(z&2)===0},
-gh6:function(){if((this.Gv&8)===0)return this.xG
-return this.xG.gmT()},
-kW:function(){var z,y
-if((this.Gv&8)===0){z=this.xG
-if(z==null){z=new P.qm(null,null,0)
-this.xG=z}return z}y=this.xG
-y.gmT()
-return y.gmT()},
-gEe:function(){if((this.Gv&8)!==0)return this.xG.gmT()
-return this.xG},
-nG:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add event after closing")
-return new P.lj("Cannot add event while adding a stream")},
-im:function(){var z=this.yx
-if(z==null){z=(this.Gv&2)!==0?$.mk():P.Dt(null)
-this.yx=z}return z},
-h:[function(a,b){var z=this.Gv
-if(z>=4)throw H.b(this.nG())
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"nR")}],
-S6:function(a){var z=this.Gv
-if((z&4)!==0)return this.im()
-if(z>=4)throw H.b(this.nG())
-z|=4
-this.Gv=z
-if((z&1)!==0)this.Pl()
-else if((z&3)===0)this.kW().h(0,C.ZB)
-return this.im()},
-Rg:function(a,b){var z=this.Gv
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},
-oJ:function(a,b){var z=this.Gv
-if((z&1)!==0)this.pb(a,b)
-else if((z&3)===0)this.kW().h(0,new P.WG(a,b,null))},
-ET:function(a){var z,y,x,w,v
-if((this.Gv&3)!==0)throw H.b(P.w("Stream has already been listened to."))
-z=$.X3
-y=a?1:0
-x=H.VM(new P.yU(this,null,null,null,z,y,null,null),[null])
-w=this.gh6()
-y=this.Gv|=1
-if((y&8)!==0){v=this.xG
-v.smT(x)
-v.QE(0)}else this.xG=x
-x.WN(w)
-x.J7(new P.UO(this))
-return x},
-j0:function(a){var z,y,x,w,v,u
-z=null
-if((this.Gv&8)!==0)z=this.xG.ed()
-this.xG=null
-this.Gv=this.Gv&4294967286|2
-if(this.gYm()!=null)if(z==null)try{z=this.tA()}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-u=P.Dt(null)
-u.CG(y,x)
-z=u}else z=z.Qy(this.gYm())
-v=new P.A1(this)
-if(z!=null)z=z.Qy(v)
-else v.$0()
-return z},
-mO:function(a){if((this.Gv&8)!==0)this.xG.yy(0)
-P.ot(this.gp4())},
-m4:function(a){if((this.Gv&8)!==0)this.xG.QE(0)
-P.ot(this.gZ9())}},
-UO:{
-"^":"Tp:69;a",
-$0:function(){P.ot(this.a.gnL())},
-$isEH:true},
-A1:{
-"^":"Tp:18;a",
-$0:[function(){var z=this.a.yx
-if(z!=null&&z.Gv===0)z.OH(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-TT:{
-"^":"a;",
-Iv:function(a){this.gEe().Rg(0,a)},
-pb:function(a,b){this.gEe().oJ(a,b)},
-Pl:function(){this.gEe().YB()}},
-of2:{
-"^":"a;",
-Iv:function(a){this.gEe().w6(H.VM(new P.fZ(a,null),[null]))},
-pb:function(a,b){this.gEe().w6(new P.WG(a,b,null))},
-Pl:function(){this.gEe().w6(C.ZB)}},
-Gh:{
-"^":"ZzD;nL<,p4<,Z9<,Ym<,xG,Gv,yx",
-tA:function(){return this.Ym.$0()}},
-ZzD:{
-"^":"nR+of2;"},
-Xq:{
-"^":"pe;nL<,p4<,Z9<,Ym<,xG,Gv,yx",
-tA:function(){return this.Ym.$0()}},
-pe:{
-"^":"nR+TT;"},
-O9:{
-"^":"ez;Y8",
-w4:function(a){return this.Y8.ET(a)},
-giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
-n:function(a,b){if(b==null)return!1
-if(this===b)return!0
-if(!J.x(b).$isO9)return!1
-return b.Y8===this.Y8},
-$isO9:true},
-yU:{
-"^":"KA;Y8<,pN,o7,Bd,Lj,Gv,lz,Ri",
-tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8().mO(this)},"$0","gp4",0,0,18],
-LP:[function(){this.gY8().m4(this)},"$0","gZ9",0,0,18]},
-NOT:{
-"^":"a;"},
-KA:{
-"^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
-WN:function(a){if(a==null)return
-this.Ri=a
-if(!a.gl0(a)){this.Gv=(this.Gv|64)>>>0
-this.Ri.t2(this)}},
-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.od()
-this.Bd=this.Lj.Al(a)},
-Fv:[function(a,b){var z=this.Gv
-if((z&8)!==0)return
-this.Gv=(z+128|4)>>>0
-if(b!=null)b.Qy(this.gDQ(this))
-if(z<128&&this.Ri!=null)this.Ri.FK()
-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,116,23,117],
-QE:[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){z=this.Ri
-z=!z.gl0(z)}else z=!1
-if(z)this.Ri.t2(this)
-else{z=(this.Gv&4294967291)>>>0
-this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}}},"$0","gDQ",0,0,18],
-ed:function(){var z=(this.Gv&4294967279)>>>0
-this.Gv=z
-if((z&8)!==0)return this.lz
-this.tk()
-return this.lz},
-gyD:function(){return(this.Gv&4)!==0},
-gUF:function(){return this.Gv>=128},
-tk:function(){var z=(this.Gv|8)>>>0
-this.Gv=z
-if((z&64)!==0)this.Ri.FK()
-if((this.Gv&32)===0)this.Ri=null
-this.lz=this.tA()},
-Rg:function(a,b){var z=this.Gv
-if((z&8)!==0)return
-if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.fZ(b,null),[null]))},
-oJ:function(a,b){var z=this.Gv
-if((z&8)!==0)return
-if(z<32)this.pb(a,b)
-else this.w6(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.w6(C.ZB)},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
-tA:function(){},
-w6:function(a){var z,y
-z=this.Ri
-if(z==null){z=new P.qm(null,null,0)
-this.Ri=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)}},
-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)},
-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
-this.tk()
-z=this.lz
-if(!!J.x(z).$isb8)z.Qy(y)
-else y.$0()}else{y.$0()
-this.Kl((z&4)!==0)}},
-Pl:function(){var z,y
-z=new P.qQ(this)
-this.tk()
-this.Gv=(this.Gv|16)>>>0
-y=this.lz
-if(!!J.x(y).$isb8)y.Qy(z)
-else z.$0()},
-J7:function(a){var z=this.Gv
-this.Gv=(z|32)>>>0
-a.$0()
-this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},
-Kl:function(a){var z,y
-if((this.Gv&64)!==0){z=this.Ri
-z=z.gl0(z)}else z=!1
-if(z){z=(this.Gv&4294967231)>>>0
-this.Gv=z
-if((z&4)!==0)if(z<128){z=this.Ri
-z=z==null||z.gl0(z)}else z=!1
-else z=!1
-if(z)this.Gv=(this.Gv&4294967291)>>>0}for(;!0;a=y){z=this.Gv
-if((z&8)!==0){this.Ri=null
-return}y=(z&4)!==0
-if(a===y)break
-this.Gv=(z^32)>>>0
-if(y)this.uO()
-else this.LP()
-this.Gv=(this.Gv&4294967263)>>>0}z=this.Gv
-if((z&64)!==0&&z<128)this.Ri.t2(this)},
-$isOy:true,
-static:{"^":"Xx,bG,zC,Ir,nav,Dr,JAK,N3S,bsZ"}},
-x1:{
-"^":"Tp:18;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
-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.M8(v,u)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
-$isEH:true},
-qQ:{
-"^":"Tp:18;a",
-$0:[function(){var z,y
-z=this.a
-y=z.Gv
-if((y&16)===0)return
-z.Gv=(y|42)>>>0
-z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
-$isEH:true},
-ez:{
-"^":"cb;",
-KR:function(a,b,c,d){var z=this.w4(!0===b)
-z.yl(a)
-z.fm(0,d)
-z.y5(c)
-return z},
-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.KA(null,null,null,z,y,null,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y}},
-ti:{
-"^":"a;aw@"},
-fZ:{
-"^":"ti;P>,aw",
-dP:function(a){a.Iv(this.P)}},
-WG:{
-"^":"ti;kc>,I4<,aw",
-dP:function(a){a.pb(this.kc,this.I4)}},
-yRf:{
-"^":"a;",
-dP:function(a){a.Pl()},
-gaw:function(){return},
-saw:function(a){throw H.b(P.w("No events after a done."))}},
-B3P:{
-"^":"a;",
-t2:function(a){var z=this.Gv
-if(z===1)return
-if(z>=1){this.Gv=1
-return}P.rb(new P.lg(this,a))
-this.Gv=1},
-FK:function(){if(this.Gv===1)this.Gv=3}},
-lg:{
-"^":"Tp:69;a,b",
-$0:[function(){var z,y
-z=this.a
-y=z.Gv
-z.Gv=0
-if(y===3)return
-z.TO(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-qm:{
-"^":"B3P;zR,N6,Gv",
-gl0:function(a){return this.N6==null},
-h:function(a,b){var z=this.N6
-if(z==null){this.N6=b
-this.zR=b}else{z.saw(b)
-this.N6=b}},
-TO:function(a){var z,y
-z=this.zR
-y=z.gaw()
-this.zR=y
-if(y==null)this.N6=null
-z.dP(a)},
-V1:function(a){if(this.Gv===1)this.Gv=3
-this.N6=null
-this.zR=null}},
-EM:{
-"^":"a;Lj<,Gv,Bd",
-gUF:function(){return this.Gv>=4},
-yc:function(){if((this.Gv&2)!==0)return
-this.Lj.wr(this.gXm())
-this.Gv=(this.Gv|2)>>>0},
-yl:function(a){},
-fm:function(a,b){},
-y5:function(a){this.Bd=a},
-Fv:[function(a,b){this.Gv+=4
-if(b!=null)b.Qy(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,116,23,117],
-QE:[function(a){var z=this.Gv
-if(z>=4){z-=4
-this.Gv=z
-if(z<4&&(z&1)===0)this.yc()}},"$0","gDQ",0,0,18],
-ed:function(){return},
-Pl:[function(){var z=(this.Gv&4294967293)>>>0
-this.Gv=z
-if(z>=4)return
-this.Gv=(z|1)>>>0
-z=this.Bd
-if(z!=null)this.Lj.bH(z)},"$0","gXm",0,0,18],
-$isOy:true,
-static:{"^":"D4,ED7,Yi"}},
-dR:{
-"^":"Tp:69;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
-uR:{
-"^":"Tp:118;a,b",
-$2:function(a,b){return P.NX(this.a,this.b,a,b)},
-$isEH:true},
-Q0:{
-"^":"Tp:69;a,b",
-$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-og:{
-"^":"cb;",
-KR:function(a,b,c,d){var z,y,x,w,v
-b=!0===b
-z=H.ip(this,"og",0)
-y=H.ip(this,"og",1)
-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.yl(a)
-v.fm(0,d)
-v.y5(c)
-return v},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-ut:function(a,b){b.Rg(0,a)},
-$ascb:function(a,b){return[b]}},
-fB:{
-"^":"KA;KQ,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
-Rg:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.Rg.call(this,this,b)},
-oJ:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.oJ.call(this,a,b)},
-uO:[function(){var z=this.Ee
-if(z==null)return
-z.yy(0)},"$0","gp4",0,0,18],
-LP:[function(){var z=this.Ee
-if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,18],
-tA:function(){var z=this.Ee
-if(z!=null){this.Ee=null
-z.ed()}return},
-vx:[function(a){this.KQ.ut(a,this)},"$1","gOa",2,0,function(){return H.XW(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},104],
-xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,119,24,25],
-nn:[function(){this.YB()},"$0","gH1",0,0,18],
-S8:function(a,b,c,d){var z,y
-z=this.gOa()
-y=this.gve()
-this.Ee=this.KQ.Sb.zC(z,this.gH1(),y)},
-$asKA:function(a,b){return[b]},
-$asOy:function(a,b){return[b]}},
-nO:{
-"^":"og;qs,Sb",
-wW:function(a){return this.qs.$1(a)},
-ut:function(a,b){var z,y,x,w,v
-z=null
-try{z=this.wW(a)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-b.oJ(y,x)
-return}if(z===!0)J.z4(b,a)},
-$asog:function(a){return[a,a]},
-$ascb:null},
-c9:{
-"^":"og;TN,Sb",
-kn:function(a){return this.TN.$1(a)},
-ut:function(a,b){var z,y,x,w,v
-z=null
-try{z=this.kn(a)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-b.oJ(y,x)
-return}J.z4(b,z)}},
-Bg:{
-"^":"og;pK,Sb",
-GW:function(a){return this.pK.$1(a)},
-ut:function(a,b){var z,y,x,w,v
-try{for(w=J.mY(this.GW(a));w.G();){z=w.gl()
-J.z4(b,z)}}catch(v){w=H.Ru(v)
-y=w
-x=new H.XO(v,null)
-b.oJ(y,x)}}},
-Xa:{
-"^":"a;"},
-Ob:{
-"^":"a;"},
-yQ:{
-"^":"a;E2<,cP<,Ot<,eo<,Ka<,Xp<,fb<,rb<,Zq<,NW,JS>,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.JS.$1(b)},
-qp:function(a){return this.il.$1$specification(a)}},
-AN:{
-"^":"a;"},
-dl:{
-"^":"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.gJS(y)==null;)z=z.geT(z)
-y=z.gtp()
-y.gJS(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)}},
-fZi:{
-"^":"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.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.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.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.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)},
-up:function(a,b){var z=this.O8(a)
-if(b)return new P.dv(this,z)
-else return new P.wd(this,z)}},
-TF:{
-"^":"Tp:69;a,b",
-$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Xz:{
-"^":"Tp:69;c,d",
-$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Cg:{
-"^":"Tp:13;a,b",
-$1:[function(a){return this.a.M8(this.b,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-Hs:{
-"^":"Tp:13;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-dv:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-wd:{
-"^":"Tp:77;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-uo:{
-"^":"fZi;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:{
-"^":"Tp:69;a,b",
-$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
-$isEH:true},
-eM:{
-"^":"Tp:69;c,d",
-$0:[function(){var z,y
-z=this.c
-P.FL("Uncaught Error: "+H.d(z))
-y=this.d
-if(y==null&&!!J.x(z).$isXS)y=z.gI4()
-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:77;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true},
-AHi:{
-"^":"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.Un()},
-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)},
-gJS:function(a){return P.aW()},
-Ch:function(a,b){return this.gJS(this).$1(b)},
-gil:function(){return P.Is()},
-qp:function(a){return this.gil().$1$specification(a)}},
-R81:{
-"^":"fZi;",
-geT:function(a){return},
-gtp:function(){return C.dS},
-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.yv(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},
-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])},
-R2:[function(a,b){return J.xC(a,b)},"$2","lZ",4,0,45,46,47],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,48,46],
-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]
-return z}b=P.py()
-return P.c7(a,b,c,d,e)},
-RN:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
-l1:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
-Ix:function(a,b,c){var z,y
-if(P.nH(a)){if(b==="("&&c===")")return"(...)"
-return b+"..."+c}z=[]
-y=$.Ex()
-y.push(a)
-try{P.T4(a,z)}finally{if(0>=y.length)return H.e(y,0)
-y.pop()}y=P.p9(b)
-y.We(z,", ")
-y.KF(c)
-return y.vM},
-WE:function(a,b,c){var z,y
-if(P.nH(a))return b+"..."+c
-z=P.p9(b)
-y=$.Ex()
-y.push(a)
-try{z.We(a,", ")}finally{if(0>=y.length)return H.e(y,0)
-y.pop()}z.KF(c)
-return z.gvM()},
-nH:function(a){var z,y
-for(z=0;y=$.Ex(),z<y.length;++z)if(a===y[z])return!0
-return!1},
-T4:function(a,b){var z,y,x,w,v,u,t,s,r,q
-z=a.gA(a)
-y=0
-x=0
-while(!0){if(!(y<80||x<3))break
-if(!z.G())return
-w=H.d(z.gl())
-b.push(w)
-y+=w.length+2;++x}if(!z.G()){if(x<=5)return
-if(0>=b.length)return H.e(b,0)
-v=b.pop()
-if(0>=b.length)return H.e(b,0)
-u=b.pop()}else{t=z.gl();++x
-if(!z.G()){if(x<=4){b.push(H.d(t))
-return}v=H.d(t)
-if(0>=b.length)return H.e(b,0)
-u=b.pop()
-y+=v.length+2}else{s=z.gl();++x
-for(;z.G();t=s,s=r){r=z.gl();++x
-if(x>100){while(!0){if(!(y>75&&x>3))break
-if(0>=b.length)return H.e(b,0)
-y-=b.pop().length+2;--x}b.push("...")
-return}}u=H.d(t)
-v=H.d(s)
-y+=v.length+u.length+4}}if(x>b.length+2){y+=5
-q="..."}else q=null
-while(!0){if(!(y>80&&b.length>3))break
-if(0>=b.length)return H.e(b,0)
-y-=b.pop().length+2
-if(q==null){y+=5
-q="..."}}if(q!=null)b.push(q)
-b.push(u)
-b.push(v)},
-L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
-Ls:function(a,b,c,d){return H.VM(new P.D0(0,null,null,null,null,null,0),[d])},
-vW:function(a){var z,y
-z={}
-if(P.nH(a))return"{...}"
-y=P.p9("")
-try{$.Ex().push(a)
-y.KF("{")
-z.a=!0
-J.Me(a,new P.W0(z,y))
-y.KF("}")}finally{z=$.Ex()
-if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},
-bA:{
-"^":"a;X5,vv,OX,OB,wV",
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-gvc:function(){return H.VM(new P.fG(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.fG(this),[H.Kp(this,0)]),new P.oi(this),H.Kp(this,0),H.Kp(this,1))},
-x4:function(a){var z,y
-if(typeof a==="string"&&a!=="__proto__"){z=this.vv
-return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
-return y==null?!1:y[a]!=null}else return this.Zt(a)},
-Zt:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-FV:function(a,b){H.bQ(b,new P.DJ(this))},
-t:function(a,b){var z,y,x,w
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null)y=null
-else{x=z[b]
-y=x===z?null:x}return y}else if(typeof b==="number"&&(b&0x3ffffff)===b){w=this.OX
-if(w==null)y=null
-else{x=w[b]
-y=x===w?null:x}return y}else return this.Dl(b)},
-Dl:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-return x<0?null:y[x+1]},
-u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){z=P.SQ()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null){y=P.SQ()
-this.OX=y}this.dg(y,b,c)}else this.ms(b,c)},
-ms:function(a,b){var z,y,x,w
-z=this.OB
-if(z==null){z=P.SQ()
-this.OB=z}y=this.nm(a)
-x=z[y]
-if(x==null){P.cW(z,y,[a,b]);++this.X5
-this.wV=null}else{w=this.aH(x,a)
-if(w>=0)x[w+1]=b
-else{x.push(a,b);++this.X5
-this.wV=null}}},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return;--this.X5
-this.wV=null
-return y.splice(x,2)[1]},
-V1:function(a){if(this.X5>0){this.wV=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0}},
-aN:function(a,b){var z,y,x,w
-z=this.Ig()
-for(y=z.length,x=0;x<y;++x){w=z[x]
-b.$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},
-Ig:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.wV
-if(z!=null)return z
-y=Array(this.X5)
-y.fixed$length=init
-x=this.vv
-if(x!=null){w=Object.getOwnPropertyNames(x)
-v=w.length
-for(u=0,t=0;t<v;++t){y[u]=w[t];++u}}else u=0
-s=this.OX
-if(s!=null){w=Object.getOwnPropertyNames(s)
-v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.OB
-if(r!=null){w=Object.getOwnPropertyNames(r)
-v=w.length
-for(t=0;t<v;++t){q=r[w[t]]
-p=q.length
-for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
-return y},
-dg:function(a,b,c){if(a[b]==null){++this.X5
-this.wV=null}P.cW(a,b,c)},
-Nv:function(a,b){var z
-if(a!=null&&a[b]!=null){z=P.vL(a,b)
-delete a[b];--this.X5
-this.wV=null
-return z}else return},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;y+=2)if(J.xC(a[y],b))return y
-return-1},
-$isZ0:true,
-static:{vL:function(a,b){var z=a[b]
-return z===a?null:z},cW:function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},SQ:function(){var z=Object.create(null)
-P.cW(z,"<non-identifier-key>",z)
-delete z["<non-identifier-key>"]
-return z}}},
-oi:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,120,"call"],
-$isEH:true},
-DJ:{
-"^":"Tp;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
-PL:{
-"^":"bA;X5,vv,OX,OB,wV",
-nm:function(a){return H.CU(a)&0x3ffffff},
-aH:function(a,b){var z,y,x
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1}},
-Fq:{
-"^":"bA;m6,Q6,hg,X5,vv,OX,OB,wV",
-C2:function(a,b){return this.m6.$2(a,b)},
-H5:function(a){return this.Q6.$1(a)},
-Ef:function(a){return this.hg.$1(a)},
-t:function(a,b){if(this.Ef(b)!==!0)return
-return P.bA.prototype.Dl.call(this,b)},
-u:function(a,b,c){P.bA.prototype.ms.call(this,b,c)},
-x4:function(a){if(this.Ef(a)!==!0)return!1
-return P.bA.prototype.Zt.call(this,a)},
-Rz:function(a,b){if(this.Ef(b)!==!0)return
-return P.bA.prototype.bB.call(this,b)},
-nm:function(a){return this.H5(a)&0x3ffffff},
-aH:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
-return-1},
-bu:function(a){return P.vW(this)},
-static:{c7:function(a,b,c,d,e){var z=new P.jG(d)
-return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
-jG:{
-"^":"Tp:13;a",
-$1:function(a){var z=H.IU(a,this.a)
-return z},
-$isEH:true},
-fG:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.X5},
-gl0:function(a){return this.Fb.X5===0},
-gA:function(a){var z=this.Fb
-z=new P.EQ(z,z.Ig(),0,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-tg:function(a,b){return this.Fb.x4(b)},
-aN:function(a,b){var z,y,x,w
-z=this.Fb
-y=z.Ig()
-for(x=y.length,w=0;w<x;++w){b.$1(y[w])
-if(y!==z.wV)throw H.b(P.a4(z))}},
-$isyN:true},
-EQ:{
-"^":"a;Fb,wV,zi,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.wV
-y=this.zi
-x=this.Fb
-if(z!==x.wV)throw H.b(P.a4(x))
-else if(y>=z.length){this.fD=null
-return!1}else{this.fD=z[y]
-this.zi=y+1
-return!0}}},
-YB:{
-"^":"a;X5,vv,OX,OB,H9,lX,zN",
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-gvc:function(){return H.VM(new P.i5(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.i5(this),[H.Kp(this,0)]),new P.a1(this),H.Kp(this,0),H.Kp(this,1))},
-x4:function(a){var z,y
-if(typeof a==="string"&&a!=="__proto__"){z=this.vv
-if(z==null)return!1
-return z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
-if(y==null)return!1
-return y[a]!=null}else return this.Zt(a)},
-Zt:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-FV:function(a,b){J.Me(b,new P.pk(this))},
-t:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null)return
-y=z[b]
-return y==null?null:y.gcA()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
-if(x==null)return
-y=x[b]
-return y==null?null:y.gcA()}else return this.Dl(b)},
-Dl:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-return y[x].gcA()},
-u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){z=P.Jc()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null){y=P.Jc()
-this.OX=y}this.dg(y,b,c)}else this.ms(b,c)},
-ms:function(a,b){var z,y,x,w
-z=this.OB
-if(z==null){z=P.Jc()
-this.OB=z}y=this.nm(a)
-x=z[y]
-if(x==null)z[y]=[this.pE(a,b)]
-else{w=this.aH(x,a)
-if(w>=0)x[w].scA(b)
-else x.push(this.pE(a,b))}},
-to:function(a,b){var z
-if(this.x4(a))return this.t(0,a)
-z=b.$0()
-this.u(0,a,z)
-return z},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x,w
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-w=y.splice(x,1)[0]
-this.Vb(w)
-return w.gcA()},
-V1:function(a){if(this.X5>0){this.lX=null
-this.H9=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0
-this.zN=this.zN+1&67108863}},
-aN:function(a,b){var z,y
-z=this.H9
-y=this.zN
-for(;z!=null;){b.$2(z.gkh(),z.gcA())
-if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},
-dg:function(a,b,c){var z=a[b]
-if(z==null)a[b]=this.pE(b,c)
-else z.scA(c)},
-Nv:function(a,b){var z
-if(a==null)return
-z=a[b]
-if(z==null)return
-this.Vb(z)
-delete a[b]
-return z.gcA()},
-pE:function(a,b){var z,y
-z=new P.db(a,b,null,null)
-if(this.H9==null){this.lX=z
-this.H9=z}else{y=this.lX
-z.zQ=y
-y.sDG(z)
-this.lX=z}++this.X5
-this.zN=this.zN+1&67108863
-return z},
-Vb:function(a){var z,y
-z=a.gzQ()
-y=a.gDG()
-if(z==null)this.H9=y
-else z.sDG(y)
-if(y==null)this.lX=z
-else y.szQ(z);--this.X5
-this.zN=this.zN+1&67108863},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y)if(J.xC(a[y].gkh(),b))return y
-return-1},
-bu:function(a){return P.vW(this)},
-$isFo:true,
-$isZ0:true,
-static:{Jc:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-a1:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,120,"call"],
-$isEH:true},
-pk:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
-db:{
-"^":"a;kh<,cA@,DG@,zQ@"},
-i5:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.X5},
-gl0:function(a){return this.Fb.X5===0},
-gA:function(a){var z,y
-z=this.Fb
-y=new P.N6(z,z.zN,null,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-y.zq=z.H9
-return y},
-tg:function(a,b){return this.Fb.x4(b)},
-aN:function(a,b){var z,y,x
-z=this.Fb
-y=z.H9
-x=z.zN
-for(;y!=null;){b.$1(y.gkh())
-if(x!==z.zN)throw H.b(P.a4(z))
-y=y.gDG()}},
-$isyN:true},
-N6:{
-"^":"a;Fb,zN,zq,fD",
-gl:function(){return this.fD},
-G:function(){var z=this.Fb
-if(this.zN!==z.zN)throw H.b(P.a4(z))
-else{z=this.zq
-if(z==null){this.fD=null
-return!1}else{this.fD=z.gkh()
-this.zq=this.zq.gDG()
-return!0}}}},
-jg:{
-"^":"lN;X5,vv,OX,OB,DM",
-gA:function(a){var z=new P.cN(this,this.Zl(),0,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-return y==null?!1:y[b]!=null}else return this.bk(b)},
-bk:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-hV:function(a){var z
-if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
-else z=!0
-if(z)return this.tg(0,a)?a:null
-return this.AD(a)},
-AD:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-return J.UQ(y,x)},
-h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
-if(x==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.OX=y
-x=y}return this.jn(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
-z=this.OB
-if(z==null){z=P.V5()
-this.OB=z}y=this.nm(b)
-x=z[y]
-if(x==null)z[y]=[b]
-else{if(this.aH(x,b)>=0)return!1
-x.push(b)}++this.X5
-this.DM=null
-return!0},
-FV:function(a,b){var z
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
-if(z==null)return!1
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return!1;--this.X5
-this.DM=null
-y.splice(x,1)
-return!0},
-V1:function(a){if(this.X5>0){this.DM=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0}},
-Zl:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.DM
-if(z!=null)return z
-y=Array(this.X5)
-y.fixed$length=init
-x=this.vv
-if(x!=null){w=Object.getOwnPropertyNames(x)
-v=w.length
-for(u=0,t=0;t<v;++t){y[u]=w[t];++u}}else u=0
-s=this.OX
-if(s!=null){w=Object.getOwnPropertyNames(s)
-v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.OB
-if(r!=null){w=Object.getOwnPropertyNames(r)
-v=w.length
-for(t=0;t<v;++t){q=r[w[t]]
-p=q.length
-for(o=0;o<p;++o){y[u]=q[o];++u}}}this.DM=y
-return y},
-jn:function(a,b){if(a[b]!=null)return!1
-a[b]=0;++this.X5
-this.DM=null
-return!0},
-Nv:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.X5
-this.DM=null
-return!0}else return!1},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y)if(J.xC(a[y],b))return y
-return-1},
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{V5:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-cN:{
-"^":"a;O2,DM,zi,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.DM
-y=this.zi
-x=this.O2
-if(z!==x.DM)throw H.b(P.a4(x))
-else if(y>=z.length){this.fD=null
-return!1}else{this.fD=z[y]
-this.zi=y+1
-return!0}}},
-D0:{
-"^":"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},
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null)return!1
-return y[b]!=null}else return this.bk(b)},
-bk:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-hV:function(a){var z
-if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
-else z=!0
-if(z)return this.tg(0,a)?a:null
-else return this.AD(a)},
-AD:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-return J.Nq(J.UQ(y,x))},
-aN:function(a,b){var z,y
-z=this.H9
-y=this.zN
-for(;z!=null;){b.$1(z.gGc(z))
-if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},
-grZ:function(a){var z=this.lX
-if(z==null)throw H.b(P.w("No elements"))
-return z.gGc(z)},
-h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
-if(x==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.OX=y
-x=y}return this.jn(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
-z=this.OB
-if(z==null){z=P.T2()
-this.OB=z}y=this.nm(b)
-x=z[y]
-if(x==null)z[y]=[this.xf(b)]
-else{if(this.aH(x,b)>=0)return!1
-x.push(this.xf(b))}return!0},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
-if(z==null)return!1
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return!1
-this.Vb(y.splice(x,1)[0])
-return!0},
-V1:function(a){if(this.X5>0){this.lX=null
-this.H9=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0
-this.zN=this.zN+1&67108863}},
-jn:function(a,b){if(a[b]!=null)return!1
-a[b]=this.xf(b)
-return!0},
-Nv:function(a,b){var z
-if(a==null)return!1
-z=a[b]
-if(z==null)return!1
-this.Vb(z)
-delete a[b]
-return!0},
-xf:function(a){var z,y
-z=new P.tj(a,null,null)
-if(this.H9==null){this.lX=z
-this.H9=z}else{y=this.lX
-z.zQ=y
-y.sDG(z)
-this.lX=z}++this.X5
-this.zN=this.zN+1&67108863
-return z},
-Vb:function(a){var z,y
-z=a.gzQ()
-y=a.gDG()
-if(z==null)this.H9=y
-else z.sDG(y)
-if(y==null)this.lX=z
-else y.szQ(z);--this.X5
-this.zN=this.zN+1&67108863},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y)if(J.xC(J.Nq(a[y]),b))return y
-return-1},
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{T2:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-tj:{
-"^":"a;Gc>,DG@,zQ@"},
-zQ:{
-"^":"a;O2,zN,zq,fD",
-gl:function(){return this.fD},
-G:function(){var z=this.O2
-if(this.zN!==z.zN)throw H.b(P.a4(z))
-else{z=this.zq
-if(z==null){this.fD=null
-return!1}else{this.fD=z.gGc(z)
-this.zq=this.zq.gDG()
-return!0}}}},
-Yp:{
-"^":"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]}},
-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.XW(function(a){return{func:"Uy",ret:P.QV,args:[{func:"YM",args:[a]}]}},this.$receiver,"mW")},31],
-ad:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"RS",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},31],
-tg:function(a,b){var z
-for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
-return!1},
-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
-z=this.gA(this)
-if(!z.G())return""
-y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
-for(;z.G();){y.vM+=b
-x=H.d(z.gl())
-y.vM+=x}}return y.vM},
-Vr:function(a,b){var z
-for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
-return!1},
-tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
-br:function(a){return this.tt(a,!0)},
-gB:function(a){var z,y
-z=this.gA(this)
-for(y=0;z.G();)++y
-return y},
-gl0:function(a){return!this.gA(this).G()},
-gor:function(a){return this.gl0(this)!==!0},
-grZ:function(a){var z,y
-z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
-do y=z.gl()
-while(z.G())
-return y},
-Zv:function(a,b){var z,y,x,w
-if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
-for(z=this.gA(this),y=b;z.G();){x=z.gl()
-w=J.x(y)
-if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(P.N(b))},
-bu:function(a){return P.Ix(this,"(",")")},
-$isQV:true,
-$asQV:null},
-ark:{
-"^":"E9h;"},
-E9h:{
-"^":"a+lD;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$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)])},
-Zv:function(a,b){return this.t(a,b)},
-aN:function(a,b){var z,y
-z=this.gB(a)
-for(y=0;y<z;++y){b.$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},
-gl0:function(a){return this.gB(a)===0},
-gor:function(a){return!this.gl0(a)},
-grZ:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
-return this.t(a,this.gB(a)-1)},
-tg:function(a,b){var z,y
-z=this.gB(a)
-for(y=0;y<this.gB(a);++y){if(J.xC(this.t(a,y),b))return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
-Vr:function(a,b){var z,y
-z=this.gB(a)
-for(y=0;y<z;++y){if(b.$1(this.t(a,y))===!0)return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
-zV:function(a,b){var z
-if(this.gB(a)===0)return""
-z=P.p9("")
-z.We(a,b)
-return z.vM},
-ad: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.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"fQO",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"lD")},31],
-lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"mh",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},31],
-eR:function(a,b){return H.q9(a,b,null,null)},
-tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.ip(a,"lD",0)])
-C.Nm.sB(z,this.gB(a))}else{y=Array(this.gB(a))
-y.fixed$length=init
-z=H.VM(y,[H.ip(a,"lD",0)])}for(x=0;x<this.gB(a);++x){y=this.t(a,x)
-if(x>=z.length)return H.e(z,x)
-z[x]=y}return z},
-br:function(a){return this.tt(a,!0)},
-h:function(a,b){var z=this.gB(a)
-this.sB(a,z+1)
-this.u(a,z,b)},
-FV:function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
-x=this.gB(a)
-this.sB(a,x+1)
-this.u(a,x,y)}},
-V1:function(a){this.sB(a,0)},
-GT:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,this.gB(a)-1,b)},
-Jd:function(a){return this.GT(a,null)},
-pZ:function(a,b,c){var z=J.Wx(b)
-if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
-z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},
-Mu:function(a,b,c){this.pZ(a,b,c)
-return H.q9(a,b,c,null)},
-UZ:function(a,b,c){var z
-this.pZ(a,b,c)
-z=c-b
-this.YW(a,b,this.gB(a)-z,a,c)
-this.sB(a,this.gB(a)-z)},
-YW:function(a,b,c,d,e){var z,y,x,w,v
-if(b<0||b>this.gB(a))H.vh(P.TE(b,0,this.gB(a)))
-if(c<b||c>this.gB(a))H.vh(P.TE(c,b,this.gB(a)))
-z=c-b
-if(z===0)return
-if(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}y=J.U6(w)
-if(x+z>y.gB(w))throw H.b(P.w("Not enough elements"))
-if(x<b)for(v=z-1;v>=0;--v)this.u(a,b+v,y.t(w,x+v))
-else for(v=0;v<z;++v)this.u(a,b+v,y.t(w,x+v))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-XU:function(a,b,c){var z
-if(c>=this.gB(a))return-1
-for(z=c;z<this.gB(a);++z)if(J.xC(this.t(a,z),b))return z
-return-1},
-u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){var z
-c=this.gB(a)-1
-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)},
-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)
-this.u(a,b,c)},
-UG:function(a,b,c){var z,y
-if(b<0||b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
-z=J.x(c)
-if(!!z.$isyN)c=z.br(c)
-y=J.q8(c)
-this.sB(a,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
-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){return P.WE(a,"[","]")},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-W0:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){var z=this.a
-if(!z.a)this.b.KF(", ")
-z.a=!1
-z=this.b
-z.KF(a)
-z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,121,64,"call"],
-$isEH:true},
-Sw:{
-"^":"mW;v5,av,eZ,qT",
-gA:function(a){var z=new P.KG(this,this.eZ,this.qT,this.av,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-aN:function(a,b){var z,y,x
-z=this.qT
-for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
-if(y<0||y>=x.length)return H.e(x,y)
-b.$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},
-gl0:function(a){return this.av===this.eZ},
-gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
-grZ:function(a){var z,y,x
-z=this.av
-y=this.eZ
-if(z===y)throw H.b(H.DU())
-z=this.v5
-x=z.length
-y=(y-1&x-1)>>>0
-if(y<0||y>=x)return H.e(z,y)
-return z[y]},
-tt:function(a,b){var z,y
-if(b){z=H.VM([],[H.Kp(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}this.GP(z)
-return z},
-br:function(a){return this.tt(a,!0)},
-h:function(a,b){this.NZ(0,b)},
-FV:function(a,b){var z,y,x,w,v,u,t,s,r
-z=b.length
-y=this.gB(this)
-x=y+z
-w=this.v5
-v=w.length
-if(x>=v){u=P.Pd(x)
-if(typeof u!=="number")return H.s(u)
-w=Array(u)
-w.fixed$length=init
-t=H.VM(w,[H.Kp(this,0)])
-this.eZ=this.GP(t)
-this.v5=t
-this.av=0
-H.qG(t,y,x,b,0)
-this.eZ+=z}else{x=this.eZ
-s=v-x
-if(z<s){H.qG(w,x,x+z,b,0)
-this.eZ+=z}else{r=z-s
-H.qG(w,x,x+s,b,0)
-x=this.v5
-H.qG(x,0,r,b,s)
-this.eZ=r}}++this.qT},
-V1:function(a){var z,y,x,w,v
-z=this.av
-y=this.eZ
-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.WE(this,"{","}")},
-AR:function(){var z,y,x,w
-z=this.av
-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)
-w=y[z]
-y[z]=null
-this.av=(z+1&x-1)>>>0
-return w},
-NZ:function(a,b){var z,y,x
-z=this.v5
-y=this.eZ
-x=z.length
-if(y<0||y>=x)return H.e(z,y)
-z[y]=b
-x=(y+1&x-1)>>>0
-this.eZ=x
-if(this.av===x)this.M9();++this.qT},
-M9:function(){var z,y,x,w
-z=Array(this.v5.length*2)
-z.fixed$length=init
-y=H.VM(z,[H.Kp(this,0)])
-z=this.v5
-x=this.av
-w=z.length-x
-H.qG(y,0,w,z,x)
-z=this.av
-x=this.v5
-H.qG(y,w,w+z,x,0)
-this.av=0
-this.eZ=this.v5.length
-this.v5=y},
-GP:function(a){var z,y,x,w,v
-z=this.av
-y=this.eZ
-x=this.v5
-if(z<=y){w=y-z
-H.qG(a,0,w,x,z)
-return w}else{v=x.length-z
-H.qG(a,0,v,x,z)
-z=this.eZ
-y=this.v5
-H.qG(a,v,v+z,y,0)
-return this.eZ+v}},
-Eo:function(a,b){var z=Array(8)
-z.fixed$length=init
-this.v5=H.VM(z,[b])},
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{"^":"TNe",Pd:function(a){var z
-if(typeof a!=="number")return a.O()
-a=(a<<2>>>0)-1
-for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}}}},
-KG:{
-"^":"a;Lz,pP,qT,Dc,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.Lz
-if(this.qT!==z.qT)H.vh(P.a4(z))
-y=this.Dc
-if(y===this.pP){this.fD=null
-return!1}z=z.v5
-x=z.length
-if(y>=x)return H.e(z,y)
-this.fD=z[y]
-this.Dc=(y+1&x-1)>>>0
-return!0}},
-lfu:{
-"^":"a;",
-gl0:function(a){return this.gB(this)===0},
-gor:function(a){return this.gB(this)!==0},
-V1:function(a){this.Ex(this.br(0))},
-FV:function(a,b){var z
-for(z=J.mY(b);z.G();)this.h(0,z.gl())},
-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.Kp(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}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.Kp(this,0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"xPo",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lfu")},31],
-bu:function(a){return P.WE(this,"{","}")},
-ad:function(a,b){var z=new H.U5(this,b)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.Kp(this,0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gba",ret:P.QV,args:[{func:"D6",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},31],
-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
-z=this.gA(this)
-if(!z.G())return""
-y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
-for(;z.G();){y.vM+=b
-x=H.d(z.gl())
-y.vM+=x}}return y.vM},
-Vr:function(a,b){var z
-for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
-return!1},
-grZ:function(a){var z,y
-z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
-do y=z.gl()
-while(z.G())
-return y},
-$isyN:true,
-$isQV:true,
-$asQV:null},
-Vj:{
-"^":"lfu;"},
-oz:{
-"^":"a;G3>,Bb>,T8>",
-$isoz:true},
-jp:{
-"^":"oz;P*,G3,Bb,T8",
-$asoz:function(a,b){return[a]}},
-Xt:{
-"^":"a;",
-vh:function(a){var z,y,x,w,v,u,t,s
-z=this.aY
-if(z==null)return-1
-y=this.iW
-for(x=y,w=x,v=null;!0;){v=this.yV(z.G3,a)
-u=J.Wx(v)
-if(u.D(v,0)){u=z.Bb
-if(u==null)break
-v=this.yV(u.G3,a)
-if(J.z8(v,0)){t=z.Bb
-z.Bb=t.T8
-t.T8=z
-if(t.Bb==null){z=t
-break}z=t}x.Bb=z
-s=z.Bb
-x=z
-z=s}else{if(u.C(v,0)){u=z.T8
-if(u==null)break
-v=this.yV(u.G3,a)
-if(J.u6(v,0)){t=z.T8
-z.T8=t.Bb
-t.Bb=z
-if(t.T8==null){z=t
-break}z=t}w.T8=z
-s=z.T8}else break
-w=z
-z=s}}w.T8=z.Bb
-x.Bb=z.T8
-z.Bb=y.T8
-z.T8=y.Bb
-this.aY=z
-y.T8=null
-y.Bb=null;++this.bb
-return v},
-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
-if(z){a.Bb=y
-a.T8=y.T8
-y.T8=null}else{a.T8=y
-a.Bb=y.Bb
-y.Bb=null}this.aY=a}},
-Ba:{
-"^":"Xt;qW,hg,aY,iW,J0,qT,bb",
-wS:function(a,b){return this.qW.$2(a,b)},
-Ef:function(a){return this.hg.$1(a)},
-yV:function(a,b){return this.wS(a,b)},
-t:function(a,b){if(b==null)throw H.b(P.u(b))
-if(this.Ef(b)!==!0)return
-if(this.aY!=null)if(J.xC(this.vh(b),0))return this.aY.P
-return},
-u:function(a,b,c){var z
-if(b==null)throw H.b(P.u(b))
-z=this.vh(b)
-if(J.xC(z,0)){this.aY.P=c
-return}this.K8(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
-FV:function(a,b){H.bQ(b,new P.QG(this))},
-gl0:function(a){return this.aY==null},
-gor:function(a){return this.aY!=null},
-aN:function(a,b){var z,y,x
-z=H.Kp(this,0)
-y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.qT,this.bb,null),[z])
-y.Qf(this,[P.oz,z])
-for(;y.G();){x=y.gl()
-z=J.RE(x)
-b.$2(z.gG3(x),z.gP(x))}},
-gB:function(a){return this.J0},
-V1:function(a){this.aY=null
-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]},
-$asZ0:null,
-$isZ0:true,
-static:{GV:function(a,b,c,d){var z,y
-z=P.n4()
-y=new P.An(c)
-return H.VM(new P.Ba(z,y,null,H.VM(new P.oz(null,null,null),[c]),0,0,0),[c,d])}}},
-An:{
-"^":"Tp:13;a",
-$1:function(a){var z=H.IU(a,this.a)
-return z},
-$isEH:true},
-QG:{
-"^":"Tp;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"lb",args:[a,b]}},this.a,"Ba")}},
-S6B:{
-"^":"a;",
-gl:function(){var z=this.ya
-if(z==null)return
-return this.Wb(z)},
-Az:function(a){var z
-for(z=this.Jt;a!=null;){z.push(a)
-a=a.Bb}},
-G:function(){var z,y,x
-z=this.lT
-if(this.qT!==z.qT)throw H.b(P.a4(z))
-y=this.Jt
-if(y.length===0){this.ya=null
-return!1}if(z.bb!==this.bb&&this.ya!=null){x=this.ya
-C.Nm.sB(y,0)
-if(x==null)this.Az(z.aY)
-else{z.vh(x.G3)
-this.Az(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
-z=y.pop()
-this.ya=z
-this.Az(z.T8)
-return!0},
-Qf:function(a,b){this.Az(a.aY)}},
-nF:{
-"^":"mW;lT",
-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.oz]),z.qT,z.bb,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.Kp(this,0))
-return y},
-$isyN:true},
-ro:{
-"^":"mW;Fb",
-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.oz]),z.qT,z.bb,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.Kp(this,1))
-return y},
-$asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
-$isyN:true},
-DN:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a.G3}},
-ZM:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a.P},
-$asS6B:function(a,b){return[b]}},
-HW:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a},
-$asS6B:function(a){return[[P.oz,a]]}}}],["dart.convert","dart:convert",,P,{
-"^":"",
-VQ: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
-if(typeof x!=="string")throw H.b(P.u(a))
-z=null
-try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
-y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
-NC:[function(a){return a.Lt()},"$1","bx",2,0,49,50],
-hW:{
-"^":"Tp:77;",
-$2:function(a,b){return b},
-$isEH:true},
-f1:{
-"^":"Tp:13;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
-for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
-return z}w=Object.keys(a)
-v=P.Fl(null,null)
-for(y=this.a,x=0;x<w.length;++x){u=w[x]
-v.u(0,u,y.$2(u,this.$1(a[u])))}t=a.__proto__
-if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.$2("__proto__",this.$1(t)))
-return v},
-$isEH:true},
-Ukr:{
-"^":"a;"},
-zF:{
-"^":"a;"},
-Ziv:{
-"^":"Ukr;",
-$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
-AJ:{
-"^":"XS;Ct,FN",
-bu:function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
-else return"Converting object did not return an encodable object."},
-static:{Gy:function(a,b){return new P.AJ(a,b)}}},
-K8:{
-"^":"AJ;Ct,FN",
-bu:function(a){return"Cyclic error in JSON stringify"},
-static:{TP:function(a){return new P.K8(a,null)}}},
-pE:{
-"^":"Ukr;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()
-return P.Vg(a,z.SI,z.UM)},
-KP:function(a){return this.Q0(a,null)},
-gZE:function(){return C.Sr},
-gHe:function(){return C.A3},
-$asUkr:function(){return[P.a,P.qU]}},
-ojF:{
-"^":"zF;UM,SI",
-$aszF:function(){return[P.a,P.qU]}},
-c5:{
-"^":"zF;qa<",
-$aszF:function(){return[P.qU,P.a]}},
-Sh:{
-"^":"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.p8
-w=0
-v=0
-for(;v<y;++v){u=z.j(a,v)
-if(u>92)continue
-if(u<32){if(v>w){t=z.Nj(a,w,v)
-x.vM+=t}w=v+1
-t=H.Lw(92)
-x.vM+=t
-switch(u){case 8:t=H.Lw(98)
-x.vM+=t
-break
-case 9:t=H.Lw(116)
-x.vM+=t
-break
-case 10:t=H.Lw(110)
-x.vM+=t
-break
-case 12:t=H.Lw(102)
-x.vM+=t
-break
-case 13:t=H.Lw(114)
-x.vM+=t
-break
-default:t=H.Lw(117)
-x.vM+=t
-t=H.Lw(48)
-x.vM+=t
-t=H.Lw(48)
-x.vM+=t
-t=u>>>4&15
-t=H.Lw(t<10?48+t:87+t)
-x.vM+=t
-t=u&15
-t=H.Lw(t<10?48+t:87+t)
-x.vM+=t
-break}}else if(u===34||u===92){if(v>w){t=z.Nj(a,w,v)
-x.vM+=t}w=v+1
-t=H.Lw(92)
-x.vM+=t
-t=H.Lw(u)
-x.vM+=t}}if(w===0)x.vM+=typeof a==="string"?a:H.d(a)
-else if(w<y){z=z.Nj(a,w,y)
-x.vM+=z}},
-WD:function(a){var z,y,x,w
-for(z=this.ol,y=z.length,x=0;x<y;++x){w=z[x]
-if(a==null?w==null:a===w)throw H.b(P.TP(a))}z.push(a)},
-C7:function(a){var z,y,x,w
-if(!this.IS(a)){this.WD(a)
-try{z=this.iY(a)
-if(!this.IS(z)){x=P.Gy(a,null)
-throw H.b(x)}x=this.ol
-if(0>=x.length)return H.e(x,0)
-x.pop()}catch(w){x=H.Ru(w)
-y=x
-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.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.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.p8
-y.KF("{")
-for(w=J.mY(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
-y.vM+=v
-this.Ip(u)
-y.vM+="\":"
-this.C7(z.t(a,u))}y.KF("}")
-this.pg(a)
-return!0}else return!1}},
-pg:function(a){var z=this.ol
-if(0>=z.length)return H.e(z,0)
-z.pop()},
-static:{"^":"Gsm,hyY,IE,Jyf,NoV,HVe,tF,BLm,KQz,i6,ql,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
-b=P.bx()
-z=P.p9("")
-P.xl(z,b,c).C7(a)
-return z.vM}}},
-u5F:{
-"^":"Ziv;Iy",
-goc:function(a){return"utf-8"},
-gZE:function(){return new P.om()}},
-om:{
-"^":"zF;",
-WJ:function(a){var z,y,x
-z=J.U6(a)
-y=J.vX(z.gB(a),3)
-if(typeof y!=="number")return H.s(y)
-y=Array(y)
-y.fixed$length=init
-y=H.VM(y,[P.KN])
-x=new P.Yu(0,0,y)
-if(x.rw(a,0,z.gB(a))!==z.gB(a))x.I7(z.j(a,J.bI(z.gB(a),1)),0)
-return C.Nm.aM(y,0,x.L8)},
-$aszF:function(){return[P.qU,[P.WO,P.KN]]}},
-Yu:{
-"^":"a;aQ,L8,IT",
-I7:function(a,b){var z,y,x,w,v
-z=this.IT
-y=this.L8
-if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
-w=y+1
-this.L8=w
-v=z.length
-if(y>=v)return H.e(z,y)
-z[y]=(240|x>>>18)>>>0
-y=w+1
-this.L8=y
-if(w>=v)return H.e(z,w)
-z[w]=128|x>>>12&63
-w=y+1
-this.L8=w
-if(y>=v)return H.e(z,y)
-z[y]=128|x>>>6&63
-this.L8=w+1
-if(w>=v)return H.e(z,w)
-z[w]=128|x&63
-return!0}else{w=y+1
-this.L8=w
-v=z.length
-if(y>=v)return H.e(z,y)
-z[y]=224|a>>>12
-y=w+1
-this.L8=y
-if(w>=v)return H.e(z,w)
-z[w]=128|a>>>6&63
-this.L8=y+1
-if(y>=v)return H.e(z,y)
-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.Pp(a,J.bI(c,1))&64512)===55296)c=J.bI(c,1)
-if(typeof c!=="number")return H.s(c)
-z=this.IT
-y=z.length
-x=J.rY(a)
-w=b
-for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.L8
-if(u>=y)break
-this.L8=u+1
-z[u]=v}else if((v&64512)===55296){if(this.L8+3>=y)break
-t=w+1
-if(this.I7(v,x.j(a,t)))w=t}else if(v<=2047){u=this.L8
-s=u+1
-if(s>=y)break
-this.L8=s
-if(u>=y)return H.e(z,u)
-z[u]=192|v>>>6
-this.L8=s+1
-z[s]=128|v&63}else{u=this.L8
-if(u+2>=y)break
-s=u+1
-this.L8=s
-if(u>=y)return H.e(z,u)
-z[u]=224|v>>>12
-u=s+1
-this.L8=u
-if(s>=y)return H.e(z,s)
-z[s]=128|v>>>6&63
-this.L8=u+1
-if(u>=y)return H.e(z,u)
-z[u]=128|v&63}}return w},
-static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
-"^":"",
-Te:function(a){return},
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,51,46,47],
-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("")
-z.vM="\""
-for(y=a.length,x=0,w="\"";x<y;++x){v=C.xB.j(a,x)
-if(v<=31)if(v===10)w=z.vM+="\\n"
-else if(v===13)w=z.vM+="\\r"
-else if(v===9)w=z.vM+="\\t"
-else{w=z.vM+="\\x"
-if(v<16)z.vM=w+"0"
-else{z.vM=w+"1"
-v-=16}w=H.Lw(v<10?48+v:87+v)
-w=z.vM+=w}else if(v===92)w=z.vM+="\\\\"
-else if(v===34)w=z.vM+="\\\""
-else{w=H.Lw(v)
-w=z.vM+=w}}y=w+"\""
-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","N3R",4,0,52],
-xv:[function(a){return H.CU(a)},"$1","J2K",2,0,53],
-O8:function(a,b,c){var z,y,x
-z=J.Zz(a,c)
-if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
-return z},
-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,y
-z=H.d(a)
-y=$.oK
-if(y==null)H.qw(z)
-else y.$1(z)},
-qa:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.u(0,a.gfN(a),b)},
-$isEH:true},
-CL:{
-"^":"Tp:122;a",
-$2:function(a,b){var z=this.a
-if(z.b>0)z.a.KF(", ")
-z.a.KF(J.GL(a))
-z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},
-$isEH:true},
-a2:{
-"^":"a;",
-$isa2:true},
-"+bool":0,
-Rz:{
-"^":"a;"},
-iP:{
-"^":"a;y3<,aL",
-n:function(a,b){if(b==null)return!1
-if(!J.x(b).$isiP)return!1
-return J.xC(this.y3,b.y3)&&this.aL===b.aL},
-iM:function(a,b){return J.oE(this.y3,b.gy3())},
-giO:function(a){return this.y3},
-bu:function(a){var z,y,x,w,v,u,t,s
-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(J.ew(this.y3,b.gVs()),this.aL)},
-EK:function(){H.o2(this)},
-RM:function(a,b){if(J.yH(a)>8640000000000000)throw H.b(P.u(a))},
-$isiP:true,
-static:{"^":"bS,Vp8,Hq,Kw,h2,KL,EQe,NXt,Hm,Xs,Fz,cRS,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,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
-if(1>=x.length)return H.e(x,1)
-w=H.BU(x[1],null,null)
-if(2>=x.length)return H.e(x,2)
-v=H.BU(x[2],null,null)
-if(3>=x.length)return H.e(x,3)
-u=H.BU(x[3],null,null)
-if(4>=x.length)return H.e(x,4)
-t=y.$1(x[4])
-if(5>=x.length)return H.e(x,5)
-s=y.$1(x[5])
-if(6>=x.length)return H.e(x,6)
-r=y.$1(x[6])
-if(7>=x.length)return H.e(x,7)
-q=J.LL(J.vX(new P.Rq().$1(x[7]),1000))
-if(q===1000){p=!0
-q=999}else p=!1
-o=x.length
-if(8>=o)return H.e(x,8)
-if(x[8]!=null){if(9>=o)return H.e(x,9)
-o=x[9]
-if(o!=null){n=J.xC(o,"-")?-1:1
-if(10>=x.length)return H.e(x,10)
-m=H.BU(x[10],null,null)
-if(11>=x.length)return H.e(x,11)
-l=y.$1(x[11])
-if(typeof m!=="number")return H.s(m)
-l=J.ew(l,60*m)
-if(typeof l!=="number")return H.s(l)
-s=J.bI(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)
-return z},Gq:function(a){var z,y
-z=Math.abs(a)
-y=a<0?"-":""
-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)},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:{
-"^":"Tp:123;",
-$1:function(a){if(a==null)return 0
-return H.BU(a,null,null)},
-$isEH:true},
-Rq:{
-"^":"Tp:124;",
-$1:function(a){if(a==null)return 0
-return H.RR(a,null)},
-$isEH:true},
-CP:{
-"^":"FK;",
-$isCP:true},
-"+double":0,
-a6:{
-"^":"a;Fq<",
-g:function(a,b){return P.ii(0,0,this.Fq+b.gFq(),0,0,0)},
-W:function(a,b){return P.ii(0,0,this.Fq-b.gFq(),0,0,0)},
-U:function(a,b){if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},
-Z:function(a,b){if(J.xC(b,0))throw H.b(P.ts())
-if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.Z(this.Fq,b),0,0,0)},
-C:function(a,b){return this.Fq<b.gFq()},
-D:function(a,b){return this.Fq>b.gFq()},
-E:function(a,b){return this.Fq<=b.gFq()},
-F:function(a,b){return this.Fq>=b.gFq()},
-gVs:function(){return C.CD.cU(this.Fq,1000)},
-n:function(a,b){if(b==null)return!1
-if(!J.x(b).$isa6)return!1
-return this.Fq===b.Fq},
-giO:function(a){return this.Fq&0x1FFFFFFF},
-iM:function(a,b){return C.CD.iM(this.Fq,b.gFq())},
-bu:function(a){var z,y,x,w,v
-z=new P.DW()
-y=this.Fq
-if(y<0)return"-"+P.ii(0,0,-y,0,0,0).bu(0)
-x=z.$1(C.CD.JV(C.CD.cU(y,60000000),60))
-w=z.$1(C.CD.JV(C.CD.cU(y,1000000),60))
-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:{"^":"Bp7,v7,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,MV,IJZ,D9,Wr,fm,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:{
-"^":"Tp:15;",
-$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)
-if(a>=100)return"000"+H.d(a)
-if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},
-$isEH:true},
-DW:{
-"^":"Tp:15;",
-$1:function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},
-$isEH:true},
-XS:{
-"^":"a;",
-gI4:function(){return new H.XO(this.$thrownJsError,null)},
-$isXS:true},
-LK:{
-"^":"XS;",
-bu:function(a){return"Throw of null."}},
-AT:{
-"^":"XS;G1>",
-bu:function(a){var z=this.G1
-if(z!=null)return"Illegal argument(s): "+H.d(z)
-return"Illegal argument(s)"},
-static:{u:function(a){return new P.AT(a)}}},
-Sn:{
-"^":"AT;G1",
-bu:function(a){return"RangeError: "+H.d(this.G1)},
-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:{EY:function(){return new P.Np()}}},
-JS:{
-"^":"XS;uF,UP,mP,SA,vG",
-bu:function(a){var z,y,x,w,v,u
-z={}
-z.a=P.p9("")
-z.b=0
-for(y=this.mP,x=0;w=y.length,x<w;x=++z.b){if(x>0){v=z.a
-v.vM+=", "}v=z.a
-if(x<0)return H.e(y,x)
-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+"]"},
-$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)}}},
-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.rM(a)}}},
-lj:{
-"^":"XS;G1>",
-bu:function(a){return"Bad state: "+this.G1},
-static:{w:function(a){return new P.lj(a)}}},
-UV:{
-"^":"XS;YA",
-bu:function(a){var z=this.YA
-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)}}},
-qn:{
-"^":"a;",
-bu:function(a){return"Out of Memory"},
-gI4:function(){return},
-$isXS:true},
-KY:{
-"^":"a;",
-bu:function(a){return"Stack Overflow"},
-gI4:function(){return},
-$isXS:true},
-t7:{
-"^":"XS;Wo",
-bu:function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},
-static:{Gz:function(a){return new P.t7(a)}}},
-HG:{
-"^":"a;G1>",
-bu:function(a){var z=this.G1
-if(z==null)return"Exception"
-return"Exception: "+H.d(z)}},
-oe:{
-"^":"a;G1>",
-bu:function(a){return"FormatException: "+H.d(this.G1)},
-static:{cD:function(a){return new P.oe(a)}}},
-eV:{
-"^":"a;",
-bu:function(a){return"IntegerDivisionByZeroException"},
-static:{ts:function(){return new P.eV()}}},
-qo:{
-"^":"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())},
-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.J4(),c)},
-J4:function(){var z,y
-z=H.of(this,"expando$key")
-if(z==null){y=$.Km
-$.Km=y+1
-z="expando$key$"+y
-H.wV(this,"expando$key",z)}return z},
-static:{"^":"Bq,rly,Km"}},
-EH:{
-"^":"a;",
-$isEH:true},
-KN:{
-"^":"FK;",
-$isKN:true},
-"+int":0,
-QV:{
-"^":"a;",
-$isQV:true,
-$asQV:null},
-Dk:{
-"^":"a;"},
-WO:{
-"^":"a;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-"+List":0,
-Z0:{
-"^":"a;",
-$isZ0:true},
-c8:{
-"^":"a;",
-bu:function(a){return"null"}},
-"+Null":0,
-FK:{
-"^":"a;",
-$isFK:true},
-"+num":0,
-a:{
-"^":";",
-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.gVm(),null))},
-gbx:function(a){return new H.cu(H.dJ(this),null)},
-$isa:true},
-ns:{
-"^":"a;",
-$isns:true},
-mE:{
-"^":"a;"},
-VV:{
-"^":"a;dI,yz,wj",
-wE:function(a){var z,y,x
-z=this.yz==null
-if(!z&&this.wj==null)return
-if(z)this.yz=H.Ms()
-else{z=H.Ms()
-y=this.wj
-x=this.yz
-if(typeof y!=="number")return y.W()
-if(typeof x!=="number")return H.s(x)
-this.yz=z-(y-x)
-this.wj=null}}},
-qU:{
-"^":"a;",
-$isqU:true},
-"+String":0,
-WU:{
-"^":"a;Cb,R7,C3,Wn",
-gl:function(){return this.Wn},
-G:function(){var z,y,x,w,v,u
-z=this.C3
-this.R7=z
-y=this.Cb
-x=y.length
-if(z===x){this.Wn=null
-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
-this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
-return!0}}this.C3=v
-this.Wn=w
-return!0}},
-Rn:{
-"^":"a;vM<",
-gB:function(a){return this.vM.length},
-gl0:function(a){return this.vM.length===0},
-gor:function(a){return this.vM.length!==0},
-KF:function(a){this.vM+=typeof a==="string"?a:H.d(a)},
-We:function(a,b){var z,y
-z=J.mY(a)
-if(!z.G())return
-if(b.length===0)do{y=z.gl()
-this.vM+=typeof y==="string"?y:H.d(y)}while(z.G())
-else{this.KF(z.gl())
-for(;z.G();){this.vM+=b
-y=z.gl()
-this.vM+=typeof y==="string"?y:H.d(y)}}},
-V1:function(a){this.vM=""},
-bu:function(a){return this.vM},
-PD:function(a){if(typeof a==="string")this.vM=a
-else this.KF(a)},
-static:{p9:function(a){var z=new P.Rn("")
-z.PD(a)
-return z}}},
-GD:{
-"^":"a;",
-$isGD:true},
-uq:{
-"^":"a;",
-$isuq:true},
-q5:{
-"^":"a;Bo,IE,pO,Fi,ku,tP,BJ,hO,lH",
-gJf:function(a){var z
-if(C.xB.nC(this.Bo,"[")){z=this.Bo
-return C.xB.Nj(z,1,z.length-1)}return this.Bo},
-gkb:function(a){var z
-if(J.xC(this.IE,0)){z=this.Fi
-if(z==="http")return 80
-if(z==="https")return 443}return this.IE},
-gIi:function(a){return this.pO},
-x6:function(a,b){var z,y
-z=a==null
-if(z&&!0)return""
-z=!z
-if(z);y=z?P.Xc(a):C.jN.ez(b,new P.uF()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
-return y},
-Ky:function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
-K2:function(a){if(a.length>0&&J.Pp(a,0)===58)return!0
-return J.R7(a,"/.")!==-1},
-KO:function(a){var z,y,x,w,v
-if(!this.K2(a))return a
-z=[]
-for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=!1;y.G();){w=y.lo
-if(J.xC(w,"..")){v=z.length
-if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
-v=!J.xC(z[0],"")}else v=!0
-else v=!1
-if(v){if(0>=z.length)return H.e(z,0)
-z.pop()}x=!0}else if("."===w)x=!0
-else{z.push(w)
-x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},
-bu:function(a){var z,y
-z=P.p9("")
-y=this.Fi
-if(""!==y){z.KF(y)
-z.KF(":")}if(this.gJf(this)!==""||y==="file"){z.KF("//")
-y=this.ku
-if(""!==y){z.KF(y)
-z.KF("@")}z.KF(this.Bo)
-if(!J.xC(this.IE,0)){z.KF(":")
-z.KF(J.AG(this.IE))}}z.KF(this.pO)
-y=this.tP
-if(""!==y){z.KF("?")
-z.KF(y)}y=this.BJ
-if(""!==y){z.KF("#")
-z.KF(y)}return z.vM},
-n:function(a,b){var z,y,x
-if(b==null)return!1
-z=J.x(b)
-if(!z.$isq5)return!1
-y=this.Fi
-x=b.Fi
-if(y==null?x==null:y===x)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.xC(this.gkb(this),z.gkb(b))){z=this.pO
-y=b.pO
-if(z==null?y==null:z===y){z=this.tP
-y=b.tP
-if(z==null?y==null:z===y){z=this.BJ
-y=b.BJ
-y=z==null?y==null:z===y
-z=y}else z=!1}else z=!1}else z=!1
-else z=!1
-else z=!1
-else z=!1
-return z},
-giO:function(a){var z=new P.XZ()
-return z.$2(this.Fi,z.$2(this.ku,z.$2(this.gJf(this),z.$2(this.gkb(this),z.$2(this.pO,z.$2(this.tP,z.$2(this.BJ,1)))))))},
-n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.xC(e,80))this.IE=0
-else if(h==="https"&&J.xC(e,443))this.IE=0
-else this.IE=e
-this.pO=this.x6(c,d)},
-$isq5:true,
-static:{"^":"QqF,q7,rU,v5,vI,ilf,Imi,IL,Bd,XrJ,G9,fC,O5i,FsP,j3,mo,u0I,TGN,Yk,Qxt,lL,Bx,Hiw,H5,zst,VFG,nJd,Sp,GPf,JA7,wo,xd,fbQ",hK:function(a0){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a
-x=new P.jY()
-w=new P.Uo(a0)
-v=a0.length
-if(v===0)return P.Wo("","",null,null,0,null,null,null,"")
-if(J.Pp(a0,0)!==47)for(u=0;t=0,u<v;u=s){s=u+1
-if(u>=v)H.vh(P.N(u))
-r=a0.charCodeAt(u)
-if(r<128){q=r>>>4
-if(q>=8)return H.e(C.NL,q)
-q=(C.NL[q]&C.jn.W4(1,r&15))!==0}else q=!1
-if(!q){if(r===58){t=s
-u=t}else{u=s-1
-t=0}break}}else{u=0
-t=0}if(t===u){q=t+1
-q=q<v&&C.xB.j(a0,t)===47&&C.xB.j(a0,q)===47}else q=!1
-if(q){p=t+2
-for(o=-1;q=J.Wx(p),n=-1,q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(J.xC(o,-1)&&r===58);else{q=r===64||r===58
-p=m-1
-if(q){n=C.xB.XU(a0,"@",p)
-if(n===-1){p=u
-break}p=n+1
-for(o=-1;q=J.Wx(p),q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(r===58){if(!J.xC(o,-1))throw H.b(P.cD("Double port in host"))}else{p=m-1
-break}p=m
-o=p}else p=m}break}else{n=-1
-break}}p=m
-o=p}else p=m}}else{p=t
-n=-1
-o=-1}for(l=p;x=J.Wx(l),x.C(l,v);l=k){k=x.g(l,1)
-if(typeof l!=="number"||Math.floor(l)!==l)H.vh(P.u(l))
-if(x.C(l,0))H.vh(P.N(l))
-if(x.F(l,v))H.vh(P.N(l))
-r=a0.charCodeAt(l)
-if(r===63||r===35){l=k-1
-break}}x=J.Wx(l)
-if(x.C(l,v)&&C.xB.j(a0,l)===63)for(j=l;w=J.Wx(j),w.C(j,v);j=i){i=w.g(j,1)
-if(typeof j!=="number"||Math.floor(j)!==j)H.vh(P.u(j))
-if(w.C(j,0))H.vh(P.N(j))
-if(w.F(j,v))H.vh(P.N(j))
-if(a0.charCodeAt(j)===35){j=i-1
-break}}else j=l
-h=t>0?C.xB.Nj(a0,0,t-1):null
-z=0
-if(t!==p){g=t+2
-if(n>0){f=C.xB.Nj(a0,g,n)
-g=n+1}else f=""
-w=J.Wx(o)
-if(w.D(o,0)){y=C.xB.Nj(a0,o,p)
-try{z=H.BU(y,null,null)}catch(e){H.Ru(e)
-throw H.b(P.cD("Invalid port: '"+H.d(y)+"'"))}d=C.xB.Nj(a0,g,w.W(o,1))}else d=C.xB.Nj(a0,g,p)}else{d=""
-f=""}c=C.xB.Nj(a0,p,l)
-b=x.C(l,j)?C.xB.Nj(a0,x.g(l,1),j):""
-x=J.Wx(j)
-a=x.C(j,v)?C.xB.Nj(a0,x.g(j,1),v):""
-return P.Wo(a,d,c,null,z,b,null,h,f)},Wo:function(a,b,c,d,e,f,g,h,i){var z=P.Wf(h)
-z=new P.q5(P.mA(b),null,null,z,i,P.LE(f,g),P.o6(a),null,null)
-z.n3(a,b,c,d,e,f,g,h,i)
-return z},mA:function(a){var z,y
-if(a.length===0)return a
-if(C.xB.j(a,0)===91){z=a.length-1
-if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
-P.Uw(C.xB.Nj(a,1,z))
-return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
-if(a.charCodeAt(y)===58){P.Uw(a)
-return"["+a+"]"}}return a},Wf:function(a){var z,y,x,w,v,u
-z=new P.QU()
-if(a==null)return""
-y=a.length
-for(x=!0,w=0;w<y;++w){if(w>=y)H.vh(P.N(w))
-v=a.charCodeAt(w)
-if(w===0){if(!(v>=97&&v<=122))u=v>=65&&v<=90
-else u=!0
-u=!u}else u=!1
-if(u)throw H.b(P.u("Illegal scheme: "+a))
-if(z.$1(v)!==!0){if(v<128){u=v>>>4
-if(u>=8)return H.e(C.NL,u)
-u=(C.NL[u]&C.jn.W4(1,v&15))!==0}else u=!1
-if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},LE:function(a,b){var z,y,x
-z={}
-y=a==null
-if(y&&!0)return""
-y=!y
-if(y);if(y)return P.Xc(a)
-x=P.p9("")
-z.a=!0
-C.jN.aN(b,new P.yZ(z,x))
-return x.vM},o6:function(a){if(a==null)return""
-return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z={}
-y=J.U6(a).u8(a,"%")
-z.a=y
-if(y<0)return a
-x=new P.Al()
-w=new P.KM()
-v=new P.wm(a,x,new P.tS())
-u=new P.QE(a)
-z.b=null
-t=a.length
-z.c=0
-s=new P.YP(z,a)
-for(r=y;r<t;){if(t<r+2)throw H.b(P.u("Invalid percent-encoding in URI component: "+a))
-q=C.xB.j(a,r+1)
-p=C.xB.j(a,z.a+2)
-o=u.$1(z.a+1)
-if(x.$1(q)===!0&&x.$1(p)===!0&&w.$1(o)!==!0)r=z.a+=3
-else{s.$0()
-r=w.$1(o)
-n=z.b
-if(r===!0){n.toString
-r=H.Lw(o)
-n.vM+=r}else{n.toString
-n.vM+="%"
-r=v.$1(z.a+1)
-n.toString
-r=H.Lw(r)
-n.vM+=r
-r=z.b
-n=v.$1(z.a+2)
-r.toString
-n=H.Lw(n)
-r.vM+=n}r=z.a+=3
-z.c=r}m=C.xB.XU(a,"%",r)
-if(m>=z.a){z.a=m
-r=m}else{z.a=t
-r=t}}if(z.b==null)return a
-if(z.c!==r)s.$0()
-return J.AG(z.b)},Dy:function(a){var z,y
-z=new P.JV()
-y=a.split(".")
-if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.Nw(z)),[null,null]).br(0)},Uw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=new P.x8()
-y=new P.JT(a,z)
-if(J.q8(a)<2)z.$1("address is too short")
-x=[]
-w=0
-u=!1
-t=0
-while(!0){s=J.q8(a)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-s=a
-r=J.q8(s)
-if(typeof r!=="number")return H.s(r)
-if(t>=r)H.vh(P.N(t))
-if(s.charCodeAt(t)===58){if(t===0){++t
-s=a
-if(t>=J.q8(s))H.vh(P.N(t))
-if(s.charCodeAt(t)!==58)z.$1("invalid start colon.")
-w=t}if(t===w){if(u)z.$1("only one wildcard `::` is allowed")
-J.bi(x,-1)
-u=!0}else J.bi(x,y.$2(w,t))
-w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
-q=J.xC(w,J.q8(a))
-p=J.xC(J.MQ(x),-1)
-if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.bi(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
-try{v=P.Dy(J.ZZ(a,w))
-s=J.lf(J.UQ(v,0),8)
-r=J.UQ(v,1)
-if(typeof r!=="number")return H.s(r)
-J.bi(x,(s|r)>>>0)
-r=J.lf(J.UQ(v,2),8)
-s=J.UQ(v,3)
-if(typeof s!=="number")return H.s(s)
-J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
-z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
-s=new H.oA(x,new P.d9(x))
-s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},jW:function(a,b,c,d){var z,y,x,w,v,u,t
-z=new P.rI()
-y=P.p9("")
-x=c.gZE().WJ(b)
-for(w=0;w<x.length;++w){v=x[w]
-u=J.Wx(v)
-if(u.C(v,128)){t=u.m(v,4)
-if(t>=8)return H.e(a,t)
-t=(a[t]&C.jn.W4(1,u.i(v,15)))!==0}else t=!1
-if(t){u=H.Lw(v)
-y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
-y.vM+=u}else{u=H.Lw(37)
-y.vM+=u
-z.$2(v,y)}}return y.vM}}},
-jY:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.aa,z)
-z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-Uo:{
-"^":"Tp:126;a",
-$1:function(a){a=J.G0(this.a,"]",a)
-if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},
-$isEH:true},
-QU:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.rs,z)
-z=(C.rs[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-uF:{
-"^":"Tp:13;",
-$1:function(a){return P.jW(C.ZJ,a,C.xM,!1)},
-$isEH:true},
-yZ:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z=this.a
-if(!z.a)this.b.KF("&")
-z.a=!1
-z=this.b
-z.KF(P.jW(C.B2,a,C.xM,!0))
-b.gl0(b)
-z.KF("=")
-z.KF(P.jW(C.B2,b,C.xM,!0))},
-$isEH:true},
-Al:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(!(48<=a&&a<=57))z=65<=a&&a<=70
-else z=!0
-return z},
-$isEH:true},
-tS:{
-"^":"Tp:125;",
-$1:function(a){return 97<=a&&a<=102},
-$isEH:true},
-KM:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(a<128){z=C.jn.GG(a,4)
-if(z>=8)return H.e(C.B2,z)
-z=(C.B2[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-wm:{
-"^":"Tp:126;b,c,d",
-$1:function(a){var z,y
-z=this.b
-y=J.Pp(z,a)
-if(this.d.$1(y)===!0)return y-32
-else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},
-$isEH:true},
-QE:{
-"^":"Tp:126;e",
-$1:function(a){var z,y,x,w,v
-for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
-if(48<=v&&v<=57)x=x*16+v-48
-else{v|=32
-if(97<=v&&v<=102)x=x*16+v-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return x},
-$isEH:true},
-YP:{
-"^":"Tp:18;a,f",
-$0:function(){var z,y,x,w,v
-z=this.a
-y=z.b
-x=z.c
-w=this.f
-v=z.a
-if(y==null)z.b=P.p9(J.Nj(w,x,v))
-else y.KF(J.Nj(w,x,v))},
-$isEH:true},
-XZ:{
-"^":"Tp:127;",
-$2:function(a,b){var z=J.v1(a)
-if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},
-$isEH:true},
-JV:{
-"^":"Tp:43;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
-$isEH:true},
-Nw:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y
-z=H.BU(a,null,null)
-y=J.Wx(z)
-if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,128,"call"],
-$isEH:true},
-x8:{
-"^":"Tp:43;",
-$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
-$isEH:true},
-JT:{
-"^":"Tp:88;a,b",
-$2:function(a,b){var z,y
-if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
-z=H.BU(C.xB.Nj(this.a,a,b),16,null)
-y=J.Wx(z)
-if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
-return z},
-$isEH:true},
-d9:{
-"^":"Tp:13;c",
-$1:function(a){var z=J.x(a)
-if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},
-$isEH:true},
-rI:{
-"^":"Tp:77;",
-$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,{
-"^":"",
-H9:function(a,b,c,d){var z,y,x
-z=document.createEvent("CustomEvent")
-J.QD(z,d)
-if(!J.x(d).$isWO)if(!J.x(d).$isZ0){y=d
-if(typeof y!=="string"){y=d
-y=typeof y==="number"}else y=!0}else y=!0
-else y=!0
-if(y)try{d=P.bL(d)
-J.avD(z,a,b,c,d)}catch(x){H.Ru(x)
-J.avD(z,a,b,c,null)}else J.avD(z,a,b,c,null)
-return z},
-r3:function(a,b){return document.createElement(a)},
-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.kP(x,"GET",a,!0)
-e.aN(0,new W.bU(x))
-z=H.VM(new W.RO(x,C.LF.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(new W.Tf(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.Ov(0,z.DK,z.Ph,W.aF(y.gyr()),z.Sg),[H.Kp(z,0)]).Zz()
-x.send()
-return y.MM},
-ED:function(a){var z,y
-z=document.createElement("input",null)
-if(a!=null)try{J.iM(z,a)}catch(y){H.Ru(y)}return z},
-VC:function(a,b){a=536870911&a+b
-a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-Pv:function(a){if(a==null)return
-return W.P1(a)},
-qc:function(a){var z
-if(a==null)return
-if("setInterval" in a){z=W.P1(a)
-if(!!J.x(z).$isPZ)return z
-return}else return a},
-ju:function(a){return a},
-Z9:function(a){if(!!J.x(a).$isQF)return a
-return P.o7(a,!0)},
-Gi:function(a,b){return new W.uY(a,b)},
-w6:[function(a){return J.N1(a)},"$1","B4",2,0,13,54],
-Hx:[function(a){return J.Z2(a)},"$1","HM",2,0,13,54],
-zI:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","QN",8,0,55,54,56,57,58],
-Ct:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
-z=J.Xr(d)
-if(z==null)throw H.b(P.u(d))
-y=z.prototype
-x=J.KE(d,"created")
-if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.m0(W.r3("article",null))
-w=z.$nativeSuperclassTag
-if(w==null)throw H.b(P.u(d))
-v=e==null
-if(v){if(!J.xC(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
-u=a[w]
-t={}
-t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Gi(x,y),1))}
-t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.B4(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.HM(),1))}
-t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.QN(),4))}
-s=Object.create(u.prototype,t)
-r=H.Va(y)
-Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
-q={prototype:s}
-if(!v)q.extends=e
-b.registerElement(c,q)},
-aF:function(a){if(J.xC($.X3,C.NU))return a
-if(a==null)return
-return $.X3.Nf(a,!0)},
-Fs:function(a){if(J.xC($.X3,C.NU))return a
-return $.X3.up(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|Ao|xc|LPc|hV|uL|Vc|G6|pv|xI|eW|Vfx|eo|Dsd|aC|VY|tuj|Be|Xfs|JI|Vct|ZP|D13|nJ|SaM|Eg|i7|WZq|Gk|pva|Nr|cda|MJ|T53|DK|waa|BS|V4|Vb|V10|Ly|pR|V11|hx|V12|L4|Mb|V13|mO|DE|V14|U1|V15|H8|WS|qh|V16|oF|V17|Q6|uE|V18|Zn|V19|n5|V20|Ma|wN|V21|ds|V22|ou|ZzR|av|V23|uz|V24|kK|oa|V25|St|V26|IW|V27|Qh|V28|Oz|V29|Z4|V30|qk|V31|vj|LU|V32|CX|V33|md|V34|Bm|V35|Ya|V36|Ww|ye|V37|G1|V38|fl|V39|UK|V40|wM|V41|F1|V42|ov|oEY|kn|V43|fI|V44|zM|V45|Rk|V46|Ti|KAf|CY|V47|nm|V48|uw|I5|V49|el"},
-Yyn:{
-"^":"Gv;",
-$isWO:true,
-$asWO:function(){return[W.QI]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.QI]},
-"%":"EntryArray"},
-Ps:{
-"^":"Bo;N:target=,t5:type%,mH:href%,yv:protocol=",
-bu:function(a){return a.toString()},
-"%":"HTMLAnchorElement"},
-fY:{
-"^":"Bo;N:target=,mH:href%,yv:protocol=",
-bu:function(a){return a.toString()},
-"%":"HTMLAreaElement"},
-rZg:{
-"^":"Bo;mH:href%,N:target=",
-"%":"HTMLBaseElement"},
-O4:{
-"^":"Gv;t5:type=",
-$isO4:true,
-"%":";Blob"},
-Fy:{
-"^":"Bo;",
-$isPZ:true,
-"%":"HTMLBodyElement"},
-Ox:{
-"^":"Bo;MB:form=,oc:name%,t5:type%,P:value%",
-"%":"HTMLButtonElement"},
-Ny:{
-"^":"Bo;fg:height},R:width}",
-gVE:function(a){return a.getContext("2d")},
-"%":"HTMLCanvasElement"},
-Oi:{
-"^":"Gv;",
-"%":";CanvasRenderingContext"},
-Gcw:{
-"^":"Oi;",
-A8:function(a,b,c,d,e,f,g,h){var z
-if(g!=null)z=!0
-else z=!1
-if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
-return}throw H.b(P.u("Incorrect number or type of arguments"))},
-"%":"CanvasRenderingContext2D"},
-nx:{
-"^":"KV;Rn:data=,B:length=,Wq:nextElementSibling=",
-"%":"Comment;CharacterData"},
-QQS:{
-"^":"ea;tT:code=",
-"%":"CloseEvent"},
-di:{
-"^":"w6O;Rn:data=",
-"%":"CompositionEvent"},
-eC:{
-"^":"ea;M3:_dartDetail}",
-gey:function(a){var z=a._dartDetail
-if(z!=null)return z
-return P.o7(a.detail,!0)},
-dF:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
-$iseC:true,
-"%":"CustomEvent"},
-Q3:{
-"^":"Bo;",
-TR:function(a,b){return a.open.$1(b)},
-"%":"HTMLDetailsElement"},
-rV:{
-"^":"Bo;",
-TR:function(a,b){return a.open.$1(b)},
-"%":"HTMLDialogElement"},
-QF:{
-"^":"KV;",
-Xf:function(a){return a.createDocumentFragment()},
-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)},
-gEr: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.T1.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)},
-$isQF:true,
-"%":"XMLDocument;Document"},
-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.vD(a.querySelectorAll(b),null)},
-Wk:function(a,b){return a.querySelector(b)},
-"%":";DocumentFragment"},
-rz:{
-"^":"Gv;G1:message=,oc:name=",
-"%":";DOMError"},
-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()},
-$isBK:true,
-"%":"DOMException"},
-h4:{
-"^":"KV;mk:title},xr:className%,jO:id=,ns:tagName=,Wq:nextElementSibling=",
-gQg:function(a){return new W.E9(a)},
-gks:function(a){return new W.VG(a,a.children)},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-gDD:function(a){return new W.I4(a)},
-gD7:function(a){return P.T7(C.CD.yu(C.CD.UD(a.offsetLeft)),C.CD.yu(C.CD.UD(a.offsetTop)),C.CD.yu(C.CD.UD(a.offsetWidth)),C.CD.yu(C.CD.UD(a.offsetHeight)),null)},
-Es:function(a){},
-dQ:function(a){},
-wN:function(a,b,c,d){},
-gqn:function(a){return a.localName},
-gKD:function(a){return a.namespaceURI},
-bu:function(a){return a.localName},
-WO:function(a,b){if(!!a.matches)return a.matches(b)
-else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
-else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
-else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
-else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
-else throw H.b(P.f("Not supported on this platform"))},
-X3:function(a,b){var z=a
-do{if(J.RF(z,b))return!0
-z=z.parentElement}while(z!=null)
-return!1},
-er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
-gI:function(a){return new W.DM(a,a)},
-GE:function(a,b){return a.getAttribute(b)},
-Zi:function(a){return a.getBoundingClientRect()},
-Wk:function(a,b){return a.querySelector(b)},
-gEr:function(a){return H.VM(new W.eu(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.eu(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.eu(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.eu(a,C.uh.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.eu(a,C.Kq.Ph,!1),[null])},
-ZL:function(a){},
-$ish4:true,
-$isPZ:true,
-"%":";Element"},
-lC:{
-"^":"Bo;fg:height},oc:name%,t5:type%,R:width}",
-"%":"HTMLEmbedElement"},
-Ty:{
-"^":"ea;kc:error=,G1:message=",
-"%":"ErrorEvent"},
-ea:{
-"^":"Gv;It:_selector},Ii:path=,t5:type=",
-gCa:function(a){return W.qc(a.currentTarget)},
-gN:function(a){return W.qc(a.target)},
-e6:function(a){return a.preventDefault()},
-$isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
-PZ:{
-"^":"Gv;",
-gI:function(a){return new W.Jn(a)},
-YJ:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-BG:function(a,b,c){c=H.tR(c,1)
-return a.addEventListener(b,c)},
-H2:function(a,b){return a.dispatchEvent(b)},
-Si:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isPZ:true,
-"%":";EventTarget"},
-hD:{
-"^":"Bo;MB:form=,oc:name%,t5:type=",
-"%":"HTMLFieldSetElement"},
-hH:{
-"^":"O4;oc:name=",
-$ishH:true,
-"%":"File"},
-nS:{
-"^":"rz;tT:code=",
-"%":"FileError"},
-jH:{
-"^":"Bo;B:length=,oc:name%,N:target=",
-"%":"HTMLFormElement"},
-c4:{
-"^":"Gv;B:length=",
-"%":"History"},
-xnd:{
-"^":"ecX;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
-Vbi:{
-"^":"QF;",
-gQr:function(a){return a.head},
-smk:function(a,b){a.title=b},
-"%":"HTMLDocument"},
-fJ:{
-"^":"rk;xN:responseText=,pf:status=,po:statusText=",
-gbA:function(a){return W.Z9(a.response)},
-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"},
-GJ:{
-"^":"Bo;fg:height},oc:name%,R:width}",
-"%":"HTMLIFrameElement"},
-Sg:{
-"^":"Gv;Rn:data=,fg:height=,R:width=",
-$isSg:true,
-"%":"ImageData"},
-SL:{
-"^":"Bo;fg:height},R:width}",
-j3:function(a,b){return a.complete.$1(b)},
-"%":"HTMLImageElement"},
-Mi:{
-"^":"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,
-$ish4:true,
-$isPZ:true,
-$isKV:true,
-"%":"HTMLInputElement"},
-Gt:{
-"^":"w6O;GU:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-"%":"KeyboardEvent"},
-ttH:{
-"^":"Bo;MB:form=,oc:name%,t5:type=",
-"%":"HTMLKeygenElement"},
-Gx:{
-"^":"Bo;P:value%",
-"%":"HTMLLIElement"},
-xT:{
-"^":"Bo;MB:form=",
-"%":"HTMLLabelElement"},
-mF:{
-"^":"Bo;MB:form=",
-"%":"HTMLLegendElement"},
-Ogt:{
-"^":"Bo;mH:href%,t5:type%",
-"%":"HTMLLinkElement"},
-ZD:{
-"^":"Gv;mH:href=,yv:protocol=",
-RE:function(a){return a.reload()},
-bu:function(a){return a.toString()},
-"%":"Location"},
-p8:{
-"^":"Bo;oc:name%",
-"%":"HTMLMapElement"},
-eL:{
-"^":"Bo;kc:error=",
-xW:function(a){return a.load()},
-yy:[function(a){return a.pause()},"$0","gX0",0,0,18],
-"%":"HTMLAudioElement;HTMLMediaElement",
-static:{"^":"TH<"}},
-mCi:{
-"^":"Gv;tT:code=",
-"%":"MediaError"},
-Br:{
-"^":"Gv;tT:code=",
-"%":"MediaKeyError"},
-wq:{
-"^":"ea;G1:message=",
-"%":"MediaKeyEvent"},
-W7:{
-"^":"ea;G1:message=",
-"%":"MediaKeyMessageEvent"},
-Rv:{
-"^":"PZ;jO:id=,ph:label=",
-"%":"MediaStream"},
-AW:{
-"^":"ea;",
-gRn:function(a){return P.o7(a.data,!0)},
-$isAW:true,
-"%":"MessageEvent"},
-EeC:{
-"^":"Bo;jb:content=,oc:name%",
-"%":"HTMLMetaElement"},
-tJ:{
-"^":"Bo;P:value%",
-"%":"HTMLMeterElement"},
-Hw:{
-"^":"ea;Rn:data=",
-"%":"MIDIMessageEvent"},
-yt:{
-"^":"Imr;",
-fZ:function(a,b,c){return a.send(b,c)},
-wR:function(a,b){return a.send(b)},
-"%":"MIDIOutput"},
-Imr:{
-"^":"PZ;jO:id=,oc:name=,t5:type=,Ye:version=",
-"%":"MIDIInput;MIDIPort"},
-AjY:{
-"^":"w6O;GU:altKey=,pL:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-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.hL(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.hL(a.clientX,a.clientY),[null]).W(0,J.Yq(J.tG(z)))
-return H.VM(new P.hL(J.Kn(y.x),J.Kn(y.y)),[null])}},
-$isAjY:true,
-"%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-x76:{
-"^":"Gv;",
-jh:function(a,b,c,d,e,f,g,h,i){var z,y
-z={}
-y=new W.tN(z)
-y.$2("childList",h)
-y.$2("attributes",e)
-y.$2("characterData",f)
-y.$2("subtree",i)
-y.$2("attributeOldValue",d)
-y.$2("characterDataOldValue",g)
-y.$2("attributeFilter",c)
-a.observe(b,z)},
-MS:function(a,b,c,d){return this.jh(a,b,c,null,d,null,null,null,null)},
-"%":"MutationObserver|WebKitMutationObserver"},
-Vv:{
-"^":"Gv;N:target=,t5:type=",
-"%":"MutationRecord"},
-qT:{
-"^":"Gv;G1:message=,oc:name=",
-"%":"NavigatorUserMediaError"},
-KV:{
-"^":"PZ;PZ:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,By:parentNode=,a4:textContent%",
-gyT:function(a){return new W.wi(a)},
-wg:function(a){var z=a.parentNode
-if(z!=null)z.removeChild(a)},
-Tk:function(a,b){var z,y
-try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},
-aD:function(a,b,c){var z,y,x
-z=J.x(b)
-if(!!z.$iswi){z=b.NL
-if(z===a)throw H.b(P.u(b))
-for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},
-pj:function(a){var z
-for(;z=a.firstChild,z!=null;)a.removeChild(z)},
-bu:function(a){var z=a.nodeValue
-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)},
-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"},
-BH3:{
-"^":"w1p;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"NodeList|RadioNodeList"},
-VSm:{
-"^":"Bo;t5:type%",
-"%":"HTMLOListElement"},
-G77:{
-"^":"Bo;Rn:data=,MB:form=,fg:height},oc:name%,t5:type%,R:width}",
-"%":"HTMLObjectElement"},
-l9:{
-"^":"Bo;ph:label%",
-"%":"HTMLOptGroupElement"},
-Qlt:{
-"^":"Bo;MB:form=,vH:index=,ph:label%,P:value%",
-$isQlt:true,
-"%":"HTMLOptionElement"},
-wL2:{
-"^":"Bo;MB:form=,oc:name%,t5:type=,P:value%",
-"%":"HTMLOutputElement"},
-HDy:{
-"^":"Bo;oc:name%,P:value%",
-"%":"HTMLParamElement"},
-f5:{
-"^":"ea;",
-$isf5:true,
-"%":"PopStateEvent"},
-mg:{
-"^":"Gv;tT:code=,G1:message=",
-"%":"PositionError"},
-qW:{
-"^":"nx;N:target=",
-"%":"ProcessingInstruction"},
-KR:{
-"^":"Bo;P:value%",
-"%":"HTMLProgressElement"},
-kf:{
-"^":"ea;ox:loaded=",
-$iskf:true,
-"%":"XMLHttpRequestProgressEvent;ProgressEvent"},
-LY:{
-"^":"kf;O3:url=",
-"%":"ResourceProgressEvent"},
-j2:{
-"^":"Bo;t5:type%",
-"%":"HTMLScriptElement"},
-Eag:{
-"^":"ea;i6:lineNumber=",
-"%":"SecurityPolicyViolationEvent"},
-bs:{
-"^":"Bo;MB:form=,B:length%,oc:name%,Mj:selectedIndex%,t5:type=,P:value%",
-$isbs:true,
-"%":"HTMLSelectElement"},
-I0:{
-"^":"Aj;",
-Kb:function(a,b){return a.getElementById(b)},
-$isI0:true,
-"%":"ShadowRoot"},
-yNV:{
-"^":"Bo;t5:type%",
-"%":"HTMLSourceElement"},
-S2:{
-"^":"ea;kc:error=,G1:message=",
-"%":"SpeechRecognitionError"},
-r5:{
-"^":"ea;Cf:results=",
-"%":"SpeechRecognitionEvent"},
-vKL:{
-"^":"Gv;V5:isFinal=,B:length=",
-"%":"SpeechRecognitionResult"},
-G5:{
-"^":"ea;oc:name=",
-"%":"SpeechSynthesisEvent"},
-kI:{
-"^":"ea;G3:key=,O3:url=",
-"%":"StorageEvent"},
-fqq:{
-"^":"Bo;t5:type%",
-"%":"HTMLStyleElement"},
-v6:{
-"^":"Bo;",
-$isv6:true,
-"%":"HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"},
-inA:{
-"^":"Bo;",
-gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
-"%":"HTMLTableElement"},
-tV:{
-"^":"Bo;RH:rowIndex=",
-iF:function(a,b){return a.insertCell(b)},
-$istV:true,
-"%":"HTMLTableRowElement"},
-BTK:{
-"^":"Bo;",
-gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
-"%":"HTMLTableSectionElement"},
-OH:{
-"^":"Bo;jb:content=",
-$isOH:true,
-"%":";HTMLTemplateElement;GLL|wc|q6"},
-mw:{
-"^":"nx;",
-$ismw:true,
-"%":"CDATASection|Text"},
-AE:{
-"^":"Bo;MB:form=,oc:name%,vp:rows=,t5:type=,P:value%",
-$isAE:true,
-"%":"HTMLTextAreaElement"},
-R0:{
-"^":"w6O;Rn:data=",
-"%":"TextEvent"},
-y6:{
-"^":"w6O;GU:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-"%":"TouchEvent"},
-RH:{
-"^":"Bo;fY:kind%,ph:label%",
-"%":"HTMLTrackElement"},
-w6O:{
-"^":"ea;ey:detail=",
-"%":"FocusEvent|SVGZoomEvent;UIEvent"},
-SW:{
-"^":"eL;fg:height},R:width}",
-"%":"HTMLVideoElement"},
-K5:{
-"^":"PZ;oc:name%,pf:status%",
-oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
-hr:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
-for(var y=0;y<z.length&&!b.requestAnimationFrame;++y){b.requestAnimationFrame=b[z[y]+'RequestAnimationFrame']
-b.cancelAnimationFrame=b[z[y]+'CancelAnimationFrame']||b[z[y]+'CancelRequestAnimationFrame']}if(b.requestAnimationFrame&&b.cancelAnimationFrame)return
-b.requestAnimationFrame=function(c){return window.setTimeout(function(){c(Date.now())},16)}
-b.cancelAnimationFrame=function(c){clearTimeout(c)}})(a)},
-geT:function(a){return W.Pv(a.parent)},
-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()},
-gEr: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])},
-$isK5:true,
-$isPZ:true,
-"%":"DOMWindow|Window"},
-Bn:{
-"^":"KV;oc:name=,P:value%",
-"%":"Attr"},
-o5:{
-"^":"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
-z=J.x(b)
-if(!z.$istn)return!1
-y=a.left
-x=z.gBb(b)
-if(y==null?x==null:y===x){y=a.top
-x=z.gG6(b)
-if(y==null?x==null:y===x){y=a.width
-x=z.gR(b)
-if(y==null?x==null:y===x){y=a.height
-z=z.gfg(b)
-z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
-return z},
-giO:function(a){var z,y,x,w,v
-z=J.v1(a.left)
-y=J.v1(a.top)
-x=J.v1(a.width)
-w=J.v1(a.height)
-w=W.VC(W.VC(W.VC(W.VC(0,z),y),x),w)
-v=536870911&w+((67108863&w)<<3>>>0)
-v^=v>>>11
-return 536870911&v+((16383&v)<<15>>>0)},
-gSR:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
-$istn:true,
-$astn:function(){return[null]},
-"%":"ClientRect|DOMRect"},
-NfA:{
-"^":"Bo;",
-$isPZ:true,
-"%":"HTMLFrameSetElement"},
-rh:{
-"^":"kEI;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"MozNamedAttrMap|NamedNodeMap"},
-IT:{
-"^":"x5e;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.vKL]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.vKL]},
-$isXj:true,
-"%":"SpeechRecognitionResultList"},
-VG:{
-"^":"ark;MW,wM",
-tg:function(a,b){return J.x5(this.wM,b)},
-gl0:function(a){return this.MW.firstElementChild==null},
-gB:function(a){return this.wM.length},
-t:function(a,b){var z=this.wM
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-u:function(a,b,c){var z=this.wM
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},
-sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
-h:function(a,b){this.MW.appendChild(b)
-return b},
-gA:function(a){var z=this.br(this)
-return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
-FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},
-GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
-Jd:function(a){return this.GT(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)},
-xe:function(a,b,c){var z,y,x
-if(b>this.wM.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.wM
-y=z.length
-x=this.MW
-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))},
-V1:function(a){J.r4(this.MW)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)this.MW.removeChild(z)
-return z},
-grZ:function(a){var z=this.MW.lastElementChild
-if(z==null)throw H.b(P.w("No elements"))
-return z},
-$asark:function(){return[W.h4]},
-$asE9h:function(){return[W.h4]},
-$asWO:function(){return[W.h4]},
-$asQV:function(){return[W.h4]}},
-TS:{
-"^":"ark;Sn,Sc",
-gB:function(a){return this.Sn.length},
-t:function(a,b){var z=this.Sn
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot modify list"))},
-sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
-GT:function(a,b){throw H.b(P.f("Cannot sort list"))},
-Jd:function(a){return this.GT(a,null)},
-grZ:function(a){return C.t5.grZ(this.Sn)},
-gDD:function(a){return W.or(this.Sc)},
-gEr: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.ad(this.Sn,new W.HU())
-this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{vD:function(a,b){var z=H.VM(new W.TS(a,null),[b])
-z.nJ(a,b)
-return z}}},
-HU:{
-"^":"Tp:13;",
-$1:function(a){return!!J.x(a).$ish4},
-$isEH:true},
-QI:{
-"^":"Gv;"},
-Jn:{
-"^":"a;WK<",
-t:function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])}},
-DM:{
-"^":"Jn;WK:YO<,WK",
-t:function(a,b){var z,y
-z=$.Vp()
-y=J.rY(b)
-if(z.gvc().Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.eu(this.YO,z.t(0,y.hc(b)),!1),[null])
-return H.VM(new W.eu(this.YO,b,!1),[null])},
-static:{"^":"fD"}},
-RAp:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-ecX:{
-"^":"RAp+Gm;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-bU:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.setRequestHeader(a,b)},
-$isEH:true},
-Tf:{
-"^":"Tp:13;b,c",
-$1:[function(a){var z,y,x
-z=this.c
-y=z.status
-if(typeof y!=="number")return y.F()
-y=y>=200&&y<300||y===0||y===304
-x=this.b
-if(y){y=x.MM
-if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(z)}else x.pm(a)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-tN:{
-"^":"Tp:77;a",
-$2:function(a,b){if(b!=null)this.a[a]=b},
-$isEH:true},
-wi:{
-"^":"ark;NL",
-grZ:function(a){var z=this.NL.lastChild
-if(z==null)throw H.b(P.w("No elements"))
-return z},
-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)},
-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
-x=y.length
-if(b===x)z.appendChild(c)
-else{if(b>=x)return H.e(y,b)
-z.insertBefore(c,y[b])}},
-UG:function(a,b,c){var z,y
-z=this.NL
-y=z.childNodes
-if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
-Mh: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
-y=z.childNodes
-if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},
-gA:function(a){return C.t5.gA(this.NL.childNodes)},
-GT:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
-Jd:function(a){return this.GT(a,null)},
-YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-gB:function(a){return this.NL.childNodes.length},
-sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
-t:function(a,b){var z=this.NL.childNodes
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-$iswi:true,
-$asark:function(){return[W.KV]},
-$asE9h:function(){return[W.KV]},
-$asWO:function(){return[W.KV]},
-$asQV:function(){return[W.KV]}},
-nNL:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-w1p:{
-"^":"nNL+Gm;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-yoo:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-kEI:{
-"^":"yoo+Gm;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-zLC:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.vKL]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.vKL]}},
-x5e:{
-"^":"zLC+Gm;",
-$isWO:true,
-$asWO:function(){return[W.vKL]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.vKL]}},
-a7B:{
-"^":"a;",
-FV:function(a,b){J.Me(b,new W.Zc(this))},
-V1:function(a){var z
-for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},
-aN:function(a,b){var z,y
-for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-b.$2(y,this.t(0,y))}},
-gvc:function(){var z,y,x,w
-z=this.MW.attributes
-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.O6(z[w]))}}return y},
-gUQ:function(a){var z,y,x,w
-z=this.MW.attributes
-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.Vm(z[w]))}}return y},
-gl0:function(a){return this.gB(this)===0},
-gor:function(a){return this.gB(this)!==0},
-$isZ0:true,
-$asZ0:function(){return[P.qU,P.qU]}},
-Zc:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true},
-E9:{
-"^":"a7B;MW",
-x4:function(a){return this.MW.hasAttribute(a)},
-t:function(a,b){return this.MW.getAttribute(b)},
-u:function(a,b,c){this.MW.setAttribute(b,c)},
-Rz:function(a,b){var z,y
-z=this.MW
-y=z.getAttribute(b)
-z.removeAttribute(b)
-return y},
-gB:function(a){return this.gvc().length},
-FJ:function(a){return a.namespaceURI==null}},
-hZ:{
-"^":"As3;n8,Kd",
-lF:function(){var z=P.Ls(null,null,null,P.qU)
-this.Kd.aN(0,new W.Siz(z))
-return z},
-p5:function(a){var z,y
-z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.n8,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.Jt(a))},
-yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.n8,!0,null),new W.Xw()),[null,null])},
-static:{or:function(a){var z=new W.hZ(a,null)
-z.yJ(a)
-return z}}},
-Xw:{
-"^":"Tp:13;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-Siz:{
-"^":"Tp:13;a",
-$1:function(a){return this.a.FV(0,a.lF())},
-$isEH:true},
-Jt:{
-"^":"Tp:13;a",
-$1:function(a){return a.OS(this.a)},
-$isEH:true},
-I4:{
-"^":"As3;MW",
-lF:function(){var z,y,x
-z=P.Ls(null,null,null,P.qU)
-for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
-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," "))}},
-FkO:{
-"^":"a;Ph",
-ly:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
-LX:function(a){return this.ly(a,!1)}},
-RO:{
-"^":"cb;DK,Ph,Sg",
-KR:function(a,b,c,d){var z=new W.Ov(0,this.DK,this.Ph,W.aF(a),this.Sg)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-z.Zz()
-return z},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)}},
-eu:{
-"^":"RO;DK,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])},
-$iscb:true},
-ie:{
-"^":"Tp:13;a",
-$1:function(a){return J.So(J.l2(a),this.a)},
-$isEH:true},
-rg:{
-"^":"Tp:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-Uc:{
-"^":"cb;Qx,Sg,Ph",
-WO:function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"cb",0)])
-return H.VM(new P.c9(new W.Hb(b),z),[H.ip(z,"cb",0),null])},
-KR:function(a,b,c,d){var z,y,x,w,v
-z=H.VM(new W.qO(null,P.L5(null,null,null,[P.cb,null],[P.Oy,null])),[null])
-z.xd(null)
-for(y=this.Qx,y=y.gA(y),x=this.Ph,w=this.Sg;y.G();){v=new W.RO(y.lo,x,w)
-v.$builtinTypeInfo=[null]
-z.h(0,v)}y=z.pY
-y.toString
-return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-$iscb:true},
-i2:{
-"^":"Tp:13;a",
-$1:function(a){return J.So(J.l2(a),this.a)},
-$isEH:true},
-Hb:{
-"^":"Tp:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-Ov:{
-"^":"Oy;VP,DK,Ph,G9,Sg",
-ed:function(){if(this.DK==null)return
-this.Jc()
-this.DK=null
-this.G9=null
-return},
-Fv:[function(a,b){if(this.DK==null)return;++this.VP
-this.Jc()
-if(b!=null)b.Qy(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,116,23,117],
-gUF:function(){return this.VP>0},
-QE:[function(a){if(this.DK==null||this.VP<=0)return;--this.VP
-this.Zz()},"$0","gDQ",0,0,18],
-Zz:function(){var z=this.G9
-if(z!=null&&this.VP<=0)J.FI(this.DK,this.Ph,z,this.Sg)},
-Jc:function(){var z=this.G9
-if(z!=null)J.pW(this.DK,this.Ph,z,this.Sg)}},
-qO:{
-"^":"a;pY,uZ",
-h:function(a,b){var z,y
-z=this.uZ
-if(z.x4(b))return
-y=this.pY
-z.u(0,b,b.zC(y.ght(y),new W.rC(this,b),this.pY.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.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.pY.S6(0)},"$0","gJK",0,0,18],
-xd:function(a){this.pY=P.bK(this.gJK(this),null,!0,a)}},
-rC:{
-"^":"Tp:69;a,b",
-$0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Gm:{
-"^":"a;",
-gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
-h:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
-FV:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
-GT:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
-Jd:function(a){return this.GT(a,null)},
-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."))},
-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,
-$isQV:true,
-$asQV:null},
-uB:{
-"^":"ark;xa",
-gA:function(a){return H.VM(new W.LV(J.mY(this.xa)),[null])},
-gB:function(a){return this.xa.length},
-h:function(a,b){J.bi(this.xa,b)},
-V1:function(a){J.U2(this.xa)},
-t:function(a,b){var z=this.xa
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-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)},
-GT:function(a,b){J.LH(this.xa,b)},
-Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.G0(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)},
-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.O2(this.xa,b,c)}},
-LV:{
-"^":"a;qD",
-G:function(){return this.qD.G()},
-gl:function(){return this.qD.QZ}},
-W9:{
-"^":"a;nj,vN,Nq,QZ",
-G:function(){var z,y
-z=this.Nq+1
-y=this.vN
-if(z<y){this.QZ=J.UQ(this.nj,z)
-this.Nq=z
-return!0}this.QZ=null
-this.Nq=y
-return!1},
-gl:function(){return this.QZ}},
-uY:{
-"^":"Tp:13;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,54,"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(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."))},
-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
-else return new W.dW(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
-"^":"",
-hF:{
-"^":"Gv;",
-$ishF:true,
-"%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
-"^":"",
-Y0Y:{
-"^":"tpr;N:target=,mH:href=",
-"%":"SVGAElement"},
-nI:{
-"^":"Rc;mH:href=",
-"%":"SVGAltGlyphElement"},
-eG:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEBlendElement"},
-bd:{
-"^":"d5;t5:type=,UQ:values=,yG:result=,x=,y=",
-"%":"SVGFEColorMatrixElement"},
-pf:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEComponentTransferElement"},
-nQ:{
-"^":"d5;kp:operator=,yG:result=,x=,y=",
-"%":"SVGFECompositeElement"},
-W1:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEConvolveMatrixElement"},
-mCz:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEDiffuseLightingElement"},
-wfu:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEDisplacementMapElement"},
-ha:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEFloodElement"},
-ym:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEGaussianBlurElement"},
-meI:{
-"^":"d5;yG:result=,x=,y=,mH:href=",
-"%":"SVGFEImageElement"},
-oBW:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEMergeElement"},
-wC:{
-"^":"d5;kp:operator=,yG:result=,x=,y=",
-"%":"SVGFEMorphologyElement"},
-MI8:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEOffsetElement"},
-Ubr:{
-"^":"d5;x=,y=",
-"%":"SVGFEPointLightElement"},
-bMB:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFESpecularLightingElement"},
-pQ:{
-"^":"d5;x=,y=",
-"%":"SVGFESpotLightElement"},
-Qya:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFETileElement"},
-Fu:{
-"^":"d5;t5:type=,yG:result=,x=,y=",
-"%":"SVGFETurbulenceElement"},
-OE5:{
-"^":"d5;x=,y=,mH:href=",
-"%":"SVGFilterElement"},
-N9:{
-"^":"tpr;x=,y=",
-"%":"SVGForeignObjectElement"},
-d0D:{
-"^":"tpr;",
-"%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
-tpr:{
-"^":"d5;",
-"%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
-pAv:{
-"^":"tpr;x=,y=,mH:href=",
-"%":"SVGImageElement"},
-NBZ:{
-"^":"d5;x=,y=",
-"%":"SVGMaskElement"},
-Gr5:{
-"^":"d5;x=,y=,mH:href=",
-"%":"SVGPatternElement"},
-MU:{
-"^":"d0D;x=,y=",
-"%":"SVGRectElement"},
-j24:{
-"^":"d5;t5:type%,mH:href=",
-"%":"SVGScriptElement"},
-EUL:{
-"^":"d5;t5:type%",
-smk:function(a,b){a.title=b},
-"%":"SVGStyleElement"},
-d5:{
-"^":"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])},
-gEr:function(a){return H.VM(new W.eu(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.eu(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.eu(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.eu(a,C.uh.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.eu(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:{"^":"JQ<"}},
-hy:{
-"^":"tpr;x=,y=",
-Kb:function(a,b){return a.getElementById(b)},
-$ishy:true,
-"%":"SVGSVGElement"},
-mHq:{
-"^":"tpr;",
-"%":";SVGTextContentElement"},
-Rk4:{
-"^":"mHq;mH:href=",
-"%":"SVGTextPathElement"},
-Rc:{
-"^":"mHq;x=,y=",
-"%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
-ci:{
-"^":"tpr;x=,y=,mH:href=",
-"%":"SVGUseElement"},
-cuU:{
-"^":"d5;mH:href=",
-"%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-O7:{
-"^":"As3;LO",
-lF:function(){var z,y,x,w
-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.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
-"^":"",
-QmI:{
-"^":"Gv;tT:code=,G1:message=",
-"%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
-"^":"",
-hM:function(){var z,y,x
-z=$.Vz
-$.Vz=z+1
-y=new H.yo(z,null,!1)
-x=init.globalState.N0
-x.O9(z,y)
-x.PC()
-x=new H.fc(y,null)
-x.TL(y)
-return x},
-XY:{
-"^":"a;",
-$isXY:true,
-static:{N3: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,41,59,27,60],
-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},
-Om:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},
-wY:[function(a){var z
-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.$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($.iW()))}},"$1","En",2,0,13,61],
-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.$isK5}else z=!1
-if(z)return a
-else if(a instanceof Date)return P.Wu(a.getTime(),!1)
-else if(a.constructor===$.iW())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,49,61],
-ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
-else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),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},
-E4:{
-"^":"a;eh",
-t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
-return P.dU(this.eh[b])},
-u:function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
-this.eh[b]=P.wY(c)},
-giO:function(a){return 0},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isE4&&this.eh===b.eh},
-Eg:function(a){return a in this.eh},
-bu:function(a){var z,y
-try{z=String(this.eh)
-return z}catch(y){H.Ru(y)
-return P.a.prototype.bu.call(this,this)}},
-V7:function(a,b){var z,y
-z=this.eh
-y=b==null?null:P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)
-return P.dU(z[a].apply(z,y))},
-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.ND(new z())
-y=[null]
-C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
-x=z.bind.apply(z,y)
-String(x)
-return P.ND(new x())},Cq: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:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y,x,w,v
-z=this.a
-if(z.x4(a))return z.t(0,a)
-y=J.x(a)
-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.$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,61,"call"],
-$isEH:true},
-r7:{
-"^":"E4;eh",
-qP:function(a,b){var z,y
-z=P.wY(b)
-y=P.F(H.VM(new H.A8(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,
-static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
-Tz:{
-"^":"Wk;eh",
-t:function(a,b){var z
-if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
-else z=!1
-if(z)H.vh(P.TE(b,0,this.gB(this)))}return P.E4.prototype.t.call(this,this,b)},
-u:function(a,b,c){var z
-if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
-else z=!1
-if(z)H.vh(P.TE(b,0,this.gB(this)))}P.E4.prototype.u.call(this,this,b,c)},
-gB:function(a){var z=this.eh.length
-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.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.BE(b,c,this.gB(this))
-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))
-if(c<b||c>z)H.vh(P.TE(c,b,z))
-y=c-b
-if(y===0)return
-if(e<0)throw H.b(P.u(e))
-x=[b,y]
-C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
-this.V7("splice",x)},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-GT:function(a,b){this.V7("sort",[b])},
-Jd:function(a){return this.GT(a,null)},
-static:{BE: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))}}},
-Wk:{
-"^":"E4+lD;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-DV:{
-"^":"Tp:13;",
-$1:function(a){var z=P.xZ(a,!1)
-P.Dm(z,$.Dp(),a)
-return z},
-$isEH:true},
-Hp:{
-"^":"Tp:13;a",
-$1:function(a){return new this.a(a)},
-$isEH:true},
-Nz:{
-"^":"Tp:13;",
-$1:function(a){return new P.r7(a)},
-$isEH:true},
-Jd:{
-"^":"Tp:13;",
-$1:function(a){return H.VM(new P.Tz(a),[null])},
-$isEH:true},
-QS:{
-"^":"Tp:13;",
-$1:function(a){return new P.E4(a)},
-$isEH:true}}],["dart.math","dart:math",,P,{
-"^":"",
-Zm:function(a,b){a=536870911&a+b
-a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-xk:function(a){a=536870911&a+((67108863&a)<<3>>>0)
-a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},
-J:function(a,b){var z
-if(typeof a!=="number")throw H.b(P.u(a))
-if(typeof b!=="number")throw H.b(P.u(b))
-if(a>b)return b
-if(a<b)return a
-if(typeof b==="number"){if(typeof a==="number")if(a===0)return(a+b)*a*b
-if(a===0)z=b===0?1/b<0:b<0
-else z=!1
-if(z||isNaN(b))return b
-return a}return a},
-y:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
-if(typeof b!=="number")throw H.b(P.u(b))
-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.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.KP("max must be in range 0 < max \u2264 2^32, was "+a))
-return Math.random()*a>>>0}},
-vY:{
-"^":"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.Ak
-z=(u&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.KP("max must be in range 0 < max \u2264 2^32, was "+a))
-z=a-1
-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},
-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)
-a=J.Ts(y.W(a,x),4294967296)
-y=J.Wx(a)
-w=y.i(a,4294967295)
-a=J.Ts(y.W(a,w),4294967296)
-v=((~x&4294967295)>>>0)+(x<<21>>>0)
-u=(v&4294967295)>>>0
-w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.cU(v-u,4294967296)&4294967295
-v=((u^(u>>>24|w<<8))>>>0)*265
-x=(v&4294967295)>>>0
-w=((w^w>>>24)>>>0)*265+C.jn.cU(v-x,4294967296)&4294967295
-v=((x^(x>>>14|w<<18))>>>0)*21
-x=(v&4294967295)>>>0
-w=((w^w>>>14)>>>0)*21+C.jn.cU(v-x,4294967296)&4294967295
-x=(x^(x>>>28|w<<4))>>>0
-w=(w^w>>>28)>>>0
-v=(x<<31>>>0)+x
-u=(v&4294967295)>>>0
-y=C.jn.cU(v-u,4294967296)
-v=this.Pd*1037
-t=(v&4294967295)>>>0
-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,PZi,JYU",r2:function(a){var z=new P.vY(0,0)
-z.qR(a)
-return z}}},
-hL:{
-"^":"a;x>,y>",
-bu:function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},
-n:function(a,b){var z,y
-if(b==null)return!1
-if(!J.x(b).$ishL)return!1
-z=this.x
-y=b.x
-if(z==null?y==null:z===y){z=this.y
-y=b.y
-y=z==null?y==null:z===y
-z=y}else z=!1
-return z},
-giO:function(a){var z,y
-z=J.v1(this.x)
-y=J.v1(this.y)
-return P.xk(P.Zm(P.Zm(0,z),y))},
-g:function(a,b){var z,y,x,w
-z=this.x
-y=J.RE(b)
-x=y.gx(b)
-if(typeof z!=="number")return z.g()
-if(typeof x!=="number")return H.s(x)
-w=this.y
-y=y.gy(b)
-if(typeof w!=="number")return w.g()
-if(typeof y!=="number")return H.s(y)
-y=new P.hL(z+x,w+y)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},
-W:function(a,b){var z,y,x,w
-z=this.x
-y=J.RE(b)
-x=y.gx(b)
-if(typeof z!=="number")return z.W()
-if(typeof x!=="number")return H.s(x)
-w=this.y
-y=y.gy(b)
-if(typeof w!=="number")return w.W()
-if(typeof y!=="number")return H.s(y)
-y=new P.hL(z-x,w-y)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},
-U:function(a,b){var z,y
-z=this.x
-if(typeof z!=="number")return z.U()
-if(typeof b!=="number")return H.s(b)
-y=this.y
-if(typeof y!=="number")return y.U()
-y=new P.hL(z*b,y*b)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},
-$ishL:true},
-HDe:{
-"^":"a;",
-gT8:function(a){return this.gBb(this)+this.R},
-gQG:function(a){return this.gG6(this)+this.fg},
-bu:function(a){return"Rectangle ("+this.gBb(this)+", "+this.G6+") "+this.R+" x "+this.fg},
-n:function(a,b){var z,y
-if(b==null)return!1
-z=J.x(b)
-if(!z.$istn)return!1
-if(this.gBb(this)===z.gBb(b)){y=this.G6
-z=y===z.gG6(b)&&this.Bb+this.R===z.gT8(b)&&y+this.fg===z.gQG(b)}else z=!1
-return z},
-giO:function(a){var z=this.G6
-return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Bb+this.R&0x1FFFFFFF),z+this.fg&0x1FFFFFFF))},
-gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z}},
-tn:{
-"^":"HDe;Bb>,G6>,R>,fg>",
-$istn:true,
-$astn:null,
-static:{T7:function(a,b,c,d,e){var z,y
-z=c<0?-c*0:c
-y=d<0?-d*0:d
-return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
-"^":"",
-qp:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
-A2:{
-"^":"mAS;Rp"},
-mAS:{
-"^":"Nx+cw;",
-$isZ0:true},
-cw:{
-"^":"a;",
-u:function(a,b,c){return Q.qp()},
-FV:function(a,b){return Q.qp()},
-V1:function(a){return Q.qp()},
-$isZ0:true},
-Nx:{
-"^":"a;",
-t:function(a,b){return this.Rp.t(0,b)},
-u:function(a,b,c){this.Rp.u(0,b,c)},
-FV:function(a,b){this.Rp.FV(0,b)},
-V1:function(a){this.Rp.V1(0)},
-aN:function(a,b){this.Rp.aN(0,b)},
-gl0:function(a){return this.Rp.X5===0},
-gor:function(a){return this.Rp.X5!==0},
-gvc:function(){var z=this.Rp
-return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gB:function(a){return this.Rp.X5},
-gUQ:function(a){var z=this.Rp
-return z.gUQ(z)},
-bu:function(a){return P.vW(this.Rp)},
-$isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
-"^":"",
-ic:function(a){a.toString
-return a},
-jZN:function(a){a.toString
-return a},
-aRu:function(a){a.toString
-return a},
-WZ:{
-"^":"Gv;",
-gbx:function(a){return C.E0},
-$isWZ:true,
-"%":"ArrayBuffer"},
-eH:{
-"^":"Gv;",
-J2:function(a,b,c){var z=J.Wx(b)
-if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(P.u("Invalid list index "+H.d(b)))},
-ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
-$iseH:true,
-$isAS:true,
-"%":";ArrayBufferView;we|Ui|Ip|Dg|ObS|GVy|Pg"},
-dfL:{
-"^":"eH;",
-gbx:function(a){return C.dP},
-$isAS:true,
-"%":"DataView"},
-zU7:{
-"^":"Dg;",
-gbx:function(a){return C.kq},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]},
-$isAS:true,
-"%":"Float32Array"},
-fS:{
-"^":"Dg;",
-gbx:function(a){return C.lk},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]},
-$isAS:true,
-"%":"Float64Array"},
-PS:{
-"^":"Pg;",
-gbx:function(a){return C.jV},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Int16Array"},
-dE:{
-"^":"Pg;",
-gbx:function(a){return C.XI},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Int32Array"},
-Eb:{
-"^":"Pg;",
-gbx:function(a){return C.la},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Int8Array"},
-wfF:{
-"^":"Pg;",
-gbx:function(a){return C.M5},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Uint16Array"},
-Pqh:{
-"^":"Pg;",
-gbx:function(a){return C.Vh},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Uint32Array"},
-eEV:{
-"^":"Pg;",
-gbx:function(a){return C.Fe},
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"CanvasPixelArray|Uint8ClampedArray"},
-V6a:{
-"^":"Pg;",
-gbx:function(a){return C.HC},
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":";Uint8Array"},
-we:{
-"^":"eH;",
-gB:function(a){return a.length},
-oZ:function(a,b,c,d,e){var z,y,x
-z=a.length+1
-this.ZF(a,b,z)
-this.ZF(a,c,z)
-if(b>c)throw H.b(P.TE(b,0,c))
-y=c-b
-if(e<0)throw H.b(P.u(e))
-x=d.length
-if(x-e<y)throw H.b(P.w("Not enough elements"))
-if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},
-$isXj:true},
-Dg:{
-"^":"Ip;",
-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)},
-$isDg:true,
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]}},
-Ui:{
-"^":"we+lD;",
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]}},
-Ip:{
-"^":"Ui+SU7;"},
-Pg:{
-"^":"GVy;",
-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)},
-$isPg:true,
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]}},
-ObS:{
-"^":"we+lD;",
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]}},
-GVy:{
-"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
-"^":"",
-qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
-return}if(typeof console=="object"&&typeof console.log!="undefined"){console.log(a)
-return}if(typeof window=="object")return
-if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
-"^":"",
-ZP:{
-"^":"Vct;Py,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gkc:function(a){return a.Py},
-skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
-static:{Zg:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.OD.ZL(a)
-C.OD.XI(a)
-return a}}},
-Vct:{
-"^":"uL+Pi;",
-$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
-"^":"",
-nJ:{
-"^":"D13;a3,Ek,Ln,y4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-ga4:function(a){return a.a3},
-sa4:function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},
-gdu:function(a){return a.Ek},
-sdu:function(a,b){a.Ek=this.ct(a,C.eh,a.Ek,b)},
-gFR:function(a){return a.Ln},
-Ki:function(a){return this.gFR(a).$0()},
-LY:function(a,b){return this.gFR(a).$1(b)},
-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
-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,102,1,94,95],
-Z1:[function(a,b,c,d){var z,y,x
-J.Kr(b)
-z=a.a3
-a.a3=this.ct(a,C.mi,z,"")
-if(a.Ln!=null){y=P.Fl(null,null)
-x=R.tB(y)
-J.kW(x,"expr",z)
-J.Vk(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,102,1,94,95],
-o5:[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,129,1],
-static:{Rp:function(a){var z,y,x
-z=R.tB([])
-y=P.L5(null,null,null,P.qU,W.I0)
-x=P.qU
-x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
-a.Ek="1-line"
-a.y4=z
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=y
-a.ZQ=x
-C.tT.ZL(a)
-C.tT.XI(a)
-return a}}},
-D13:{
-"^":"uL+Pi;",
-$isd3:true},
-YW:{
-"^":"Tp:13;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,130,"call"],
-$isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
-"^":"",
-Eg:{
-"^":"SaM;fe,l1,bY,jv,oy,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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},
-sph:function(a,b){a.l1=this.ct(a,C.hf,a.l1,b)},
-gFR:function(a){return a.bY},
-Ki:function(a){return this.gFR(a).$0()},
-LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},
-gkZ:function(a){return a.jv},
-skZ:function(a,b){a.jv=this.ct(a,C.YT,a.jv,b)},
-gyG:function(a){return a.oy},
-syG:function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},
-wB:[function(a,b,c,d){var z=a.fe
-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.uv(a)).Qy(new R.Ou(a))}},"$3","gbN",6,0,80,46,47,81],
-static:{fL:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.fe=!1
-a.l1="[evaluate]"
-a.bY=null
-a.jv=""
-a.oy=null
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.UF.ZL(a)
-C.UF.XI(a)
-return a}}},
-SaM:{
-"^":"xc+Pi;",
-$isd3:true},
-uv:{
-"^":"Tp:131;a",
-$1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,82,"call"],
-$isEH:true},
-Ou:{
-"^":"Tp:69;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,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{hSW:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-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,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.KV).Qy(b)},"$1","gvC",2,0,20,90],
-static:{nv:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.by.ZL(a)
-C.by.XI(a)
-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,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.DC).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Ak:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Mh.ZL(a)
-C.Mh.XI(a)
-return a}}},
-pva:{
-"^":"uL+Pi;",
-$isd3:true},
-MJ:{
-"^":"cda;Zc,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gJ6:function(a){return a.Zc},
-sJ6:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
-static:{IfX:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-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:{
-"^":"T53;lh,Qz,zg,Fs,AP,fn,tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gU4:function(a){return a.lh},
-sU4:function(a,b){a.lh=this.ct(a,C.QK,a.lh,b)},
-Qj:[function(a,b){var z,y,x
-Q.xI.prototype.Qj.call(this,a,b)
-this.ct(a,C.ak,0,1)
-this.ct(a,C.Ql,0,1)
-z=a.tY
-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)
-x=y&&J.UQ(z,"parent")!=null
-a.Qz=this.ct(a,C.ak,a.Qz,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,20,57],
-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)},
-static:{v9:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.lh=!0
-a.Qz=!1
-a.zg=!1
-a.Fs=!1
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Xo.ZL(a)
-C.Xo.XI(a)
-return a}}},
-T53:{
-"^":"xI+Pi;",
-$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
-"^":"",
-BS:{
-"^":"waa;P6,Sq,ZZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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},
-sfY:function(a,b){a.ZZ=this.ct(a,C.Lc,a.ZZ,b)},
-W7:function(a,b){var z,y,x
-z=b!=null
-y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
-if(y!=null)return this.W7(a,y)+"."+H.d(J.UQ(b,"user_name"))
-if(z){z=J.U6(b)
-z=z.t(b,"owner")!=null&&J.xC(z.t(b,"owner").gzS(),"Class")}else z=!1
-x=z?J.UQ(b,"owner"):null
-if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},
-jC:[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.P6)
-a.Sq=this.ct(a,C.AO,a.Sq,z)
-z=J.UQ(a.P6,"kind")
-y=a.ZZ
-switch(z){case"kRegularFunction":a.ZZ=this.ct(a,C.Lc,y,"function")
-break
-case"kClosureFunction":a.ZZ=this.ct(a,C.Lc,y,"closure function")
-break
-case"kSignatureFunction":a.ZZ=this.ct(a,C.Lc,y,"signature function")
-break
-case"kGetterFunction":a.ZZ=this.ct(a,C.Lc,y,"getter function")
-break
-case"kSetterFunction":a.ZZ=this.ct(a,C.Lc,y,"setter function")
-break
-case"kConstructor":a.ZZ=this.ct(a,C.Lc,y,"constructor")
-break
-case"kImplicitGetterFunction":a.ZZ=this.ct(a,C.Lc,y,"implicit getter function")
-break
-case"kImplicitSetterFunction":a.ZZ=this.ct(a,C.Lc,y,"implicit setter function")
-break
-case"kStaticInitializer":a.ZZ=this.ct(a,C.Lc,y,"static initializer")
-break
-case"kMethodExtractor":a.ZZ=this.ct(a,C.Lc,y,"method extractor")
-break
-case"kNoSuchMethodDispatcher":a.ZZ=this.ct(a,C.Lc,y,"noSuchMethod dispatcher")
-break
-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,20,57],
-RF:[function(a,b){J.r0(a.P6).Qy(b)},"$1","gvC",2,0,20,90],
-static:{nz:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.PJ8.ZL(a)
-C.PJ8.XI(a)
-return a}}},
-waa:{
-"^":"uL+Pi;",
-$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
-"^":"",
-Hz:{
-"^":"a;zE,mS",
-PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,132],
-gvH:function(a){return C.CD.cU(this.mS,4)},
-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()
-if(typeof y!=="number")return H.s(y)
-x=b.gx(b)
-if(typeof x!=="number")return H.s(x)
-return new O.Hz(a,(z*y+x)*4)}}},
-uc:{
-"^":"a;Yu<,tL"},
-Vb:{
-"^":"V4;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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},
-syw:function(a,b){a.oj=this.ct(a,C.QH,a.oj,b)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
-a.hi=z
-z=J.Q9(z)
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gmo(a)),z.Sg),[H.Kp(z,0)]).Zz()
-z=J.GW(a.hi)
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gJb(a)),z.Sg),[H.Kp(z,0)]).Zz()},
-LV:function(a,b){var z,y,x
-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,"@")
-if(0>=z.length)return H.e(z,0)
-a.UL.u(0,b,z[0])
-a.rM.u(0,b,d)
-a.Ge.u(0,this.LV(a,d),b)},
-eD:function(a,b,c){var z,y,x,w,v,u,t,s,r
-for(z=J.mY(J.UQ(b,"members")),y=a.UL,x=a.rM,w=a.Ge;z.G();){v=z.gl()
-if(!J.x(v).$isdy){N.QM("").To(H.d(v))
-continue}u=H.BU(C.Nm.grZ(J.uH(v.r0,"/")),null,null)
-t=u==null?C.pr:P.r2(u)
-s=[t.j1(128),t.j1(128),t.j1(128),255]
-r=J.uH(v.px,"@")
-if(0>=r.length)return H.e(r,0)
-y.u(0,u,r[0])
-x.u(0,u,s)
-w.u(0,this.LV(a,s),u)}this.fJ(a,c,"Free",$.Rl())
-this.fJ(a,0,"",$.Qg())},
-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.x6(a.An,b).mS,4)
-v=C.CD.Z(w,x)
-u=C.CD.Y(w,x)
-t=J.UQ(a.oj,"pages")
-if(!(v<0)){z=J.q8(t)
-if(typeof z!=="number")return H.s(z)
-z=v>=z}else z=!0
-if(z)return
-s=J.UQ(t,v)
-z=J.U6(s)
-r=z.t(s,"objects")
-y=J.U6(r)
-q=0
-p=0
-o=0
-while(!0){n=y.gB(r)
-if(typeof n!=="number")return H.s(n)
-if(!(o<n))break
-p=y.t(r,o)
-if(typeof p!=="number")return H.s(p)
-q+=p
-if(q>u){u=q-p
-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.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.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,129,2],
-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,129,2],
-My:function(a){var z,y,x,w,v
-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
-z.toString
-x=P.T7(C.CD.yu(C.CD.UD(z.clientLeft)),C.CD.yu(C.CD.UD(z.clientTop)),C.CD.yu(C.CD.UD(z.clientWidth)),C.CD.yu(C.CD.UD(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
-a.dW=z
-w=J.q8(y)
-if(typeof w!=="number")return H.s(w)
-v=P.J(z*w,6000)
-w=P.J3(J.Vf(a.hi).createImageData(x,v))
-a.An=w
-J.No(a.hi,J.DO(w))
-J.OE(a.hi,J.OB(a.An))
-this.ps(a,0)},
-ps:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-z=J.UQ(a.oj,"pages")
-y=J.U6(z)
-x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
-a.PA=this.ct(a,C.PM,a.PA,x)
-x=a.dW
-if(typeof x!=="number")return H.s(x)
-w=b*x
-v=w+x
-x=y.gB(z)
-if(typeof x!=="number")return H.s(x)
-if(!(b>=x)){x=J.OB(a.An)
-if(typeof x!=="number")return H.s(x)
-x=v>x}else x=!0
-if(x)return
-u=O.x6(a.An,H.VM(new P.hL(0,w),[null]))
-t=J.UQ(y.t(z,b),"objects")
-y=J.U6(t)
-x=a.rM
-s=0
-while(!0){r=y.gB(t)
-if(typeof r!=="number")return H.s(r)
-if(!(s<r))break
-q=y.t(t,s)
-p=x.t(0,y.t(t,s+1))
-for(;r=J.Wx(q),o=r.W(q,1),r.D(q,0);q=o){r=u.zE
-n=u.mS
-m=n+4
-C.yp.vg(J.Qd(r),n,m,p)
-u=new O.Hz(r,m)}s+=2}while(!0){y=u.mS
-x=C.CD.cU(y,4)
-r=u.zE
-n=J.RE(r)
-m=n.gR(r)
-if(typeof m!=="number")return H.s(m)
-m=C.CD.Y(x,m)
-l=n.gR(r)
-if(typeof l!=="number")return H.s(l)
-l=C.CD.Z(x,l)
-new P.hL(m,l).$builtinTypeInfo=[null]
-if(!(l<v))break
-x=$.Qg()
-m=y+4
-C.yp.vg(n.gRn(r),y,m,x)
-u=new O.Hz(r,m)}y=J.Vf(a.hi)
-x=a.An
-J.kZ(y,x,0,0,0,w,J.DO(x),v)
-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.wx()).Qy(b)},"$1","gvC",2,0,20,90],
-YS7:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,20,57],
-static:{"^":"nK,Os,SoT,WBO",dF:function(a){var z,y,x,w,v
-z=P.Fl(null,null)
-y=P.Fl(null,null)
-x=P.Fl(null,null)
-w=P.L5(null,null,null,P.qU,W.I0)
-v=P.qU
-v=H.VM(new V.qC(P.YM(null,null,null,v,null),null,null),[v,null])
-a.rM=z
-a.Ge=y
-a.UL=x
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=w
-a.ZQ=v
-C.Cs.ZL(a)
-C.Cs.XI(a)
-return a}}},
-V4:{
-"^":"uL+Pi;",
-$isd3:true},
-R5:{
-"^":"Tp:69;a,b",
-$0:function(){J.EK(this.a,this.b+1)},
-$isEH:true},
-aG:{
-"^":"Tp:101;a",
-$1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,133,"call"],
-$isEH:true},
-wx:{
-"^":"Tp:77;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,134,"call"],
-$isEH:true},
-oc:{
-"^":"Tp:69;a",
-$0:function(){J.vP(this.a)},
-$isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
-"^":"",
-UC:{
-"^":"Vz0;oH,vp,zz,pT,jV,AP,fn",
-eE:function(a,b){var z
-if(b===0){z=this.vp
-if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.O6(J.UQ(J.U8o(z[a]),b))}return G.Vz0.prototype.eE.call(this,a,b)}},
-Ly:{
-"^":"V10;MF,uY,GQ,I8,Oc,GM,nc,pp,Ol,Sk,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gYt:function(a){return a.MF},
-sYt:function(a,b){a.MF=this.ct(a,C.TN,a.MF,b)},
-gcH:function(a){return a.uY},
-scH:function(a,b){a.uY=this.ct(a,C.Zi,a.uY,b)},
-gLF:function(a){return a.nc},
-sLF:function(a,b){a.nc=this.ct(a,C.kG,a.nc,b)},
-gB1:function(a){return a.Ol},
-sB1:function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},
-god:function(a){return a.Sk},
-sod:function(a,b){a.Sk=this.ct(a,C.rB,a.Sk,b)},
-Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
-z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.zV(J.UQ($.BY,"PieChart"),[z])
-a.I8=y
-y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-a.GM=z
-a.pp=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
-Og:function(a){var z,y,x,w
-for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
-x=J.U6(y)
-w=x.t(y,"class")
-if(w==null)continue
-w.gUY().eC(x.t(y,"new"))
-w.gxQ().eC(x.t(y,"old"))}},
-Yz:function(a){var z,y,x,w,v,u,t,s,r,q
-a.nc.B7()
-for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=J.UQ(z.gl(),"class")
-if(y==null)continue
-if(y.gMp())continue
-x=y.gUY().gbi().yg
-w=y.gUY().gbi().wf
-v=y.gUY().gl().yg
-u=y.gUY().gl().wf
-t=y.gxQ().gbi().yg
-s=y.gxQ().gbi().wf
-r=y.gxQ().gl().yg
-q=y.gxQ().gl().wf
-J.Jr(a.nc,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.tO(a.nc)},
-E4:function(a,b,c){var z,y,x,w,v,u
-z=J.UQ(J.TY(a.nc),c)
-y=J.RE(b)
-x=J.RE(z)
-J.PP(J.UQ(J.Mx(J.UQ(y.gks(b),0)),0),J.UQ(x.gUQ(z),0))
-w=1
-while(!0){v=J.q8(x.gUQ(z))
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-c$0:{if(C.Nm.tg(C.NG,w))break c$0
-u=J.UQ(y.gks(b),w)
-v=J.RE(u)
-v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
-v.sa4(u,a.nc.Gu(c,w))}++w}},
-Jh:function(a){var z,y,x,w,v,u,t,s
-z=J.Mx(a.pp)
-if(z.gB(z)>a.nc.gzz().length){z=J.Mx(a.pp)
-y=z.gB(z)-a.nc.gzz().length
-for(x=0;x<y;++x)J.Mx(a.pp).mv(0)}else{z=J.Mx(a.pp)
-if(z.gB(z)<a.nc.gzz().length){z=a.nc.gzz().length
-w=J.Mx(a.pp)
-v=z-w.gB(w)
-for(x=0;x<v;++x){u=document.createElement("tr",null)
-z=J.RE(u)
-z.iF(u,-1).appendChild(W.r3("class-ref",null))
-t=z.iF(u,-1)
-t.toString
-new W.I4(t).h(0,"left-border-spacer")
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-t=z.iF(u,-1)
-t.toString
-new W.I4(t).h(0,"left-border-spacer")
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-J.Mx(a.pp).h(0,u)}}}for(x=0;x<a.nc.gzz().length;++x){z=a.nc.gzz()
-if(x>=z.length)return H.e(z,x)
-s=z[x]
-this.E4(a,J.Mx(a.pp).t(0,x),s)}},
-BB:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.nc.gxp()
-y=d.cellIndex
-x=a.nc
-if(z==null?y!=null:z!==y){x.sxp(y)
-a.nc.sT3(!0)}else x.sT3(!x.gT3())
-J.tO(a.nc)
-this.Jh(a)}},"$3","gQq",6,0,93,1,94,95],
-RF:[function(a,b){var z=a.Ol
-if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).Qy(b)},"$1","gvC",2,0,20,90],
-zT:[function(a,b){var z=a.Ol
-if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).Qy(b)},"$1","gyW",2,0,20,90],
-eJ:[function(a,b){var z=a.Ol
-if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).Qy(b)},"$1","gNb",2,0,20,90],
-hz:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,135,136],
-n1:[function(a,b){var z,y,x,w,v
-z=a.Ol
-if(z==null)return
-z=J.aT(z)
-z=this.ct(a,C.rB,a.Sk,z)
-a.Sk=z
-z.WU(J.UQ(a.Ol,"heaps"))
-y=H.BU(J.UQ(a.Ol,"dateLastAccumulatorReset"),null,null)
-if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
-a.uY=this.ct(a,C.Zi,a.uY,z)}y=H.BU(J.UQ(a.Ol,"dateLastServiceGC"),null,null)
-if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
-a.MF=this.ct(a,C.TN,a.MF,z)}z=a.GQ.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-x=J.aT(a.Ol)
-z=a.GQ
-w=x.gUY().gSU()
-z=z.Yb
-v=[]
-C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
-z.V7("addRow",[H.VM(new P.Tz(v),[null])])
-v=a.GQ
-z=J.bI(x.gUY().gCs(),x.gUY().gSU())
-v=v.Yb
-w=[]
-C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.V7("addRow",[H.VM(new P.Tz(w),[null])])
-w=a.GQ
-v=x.gUY().gMX()
-w=w.Yb
-z=[]
-C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
-w.V7("addRow",[H.VM(new P.Tz(z),[null])])
-z=a.Oc.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-z=a.Oc
-w=x.gxQ().gSU()
-z=z.Yb
-v=[]
-C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
-z.V7("addRow",[H.VM(new P.Tz(v),[null])])
-v=a.Oc
-z=J.bI(x.gxQ().gCs(),x.gxQ().gSU())
-v=v.Yb
-w=[]
-C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.V7("addRow",[H.VM(new P.Tz(w),[null])])
-w=a.Oc
-v=x.gxQ().gMX()
-w=w.Yb
-z=[]
-C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
-w.V7("addRow",[H.VM(new P.Tz(z),[null])])
-this.Og(a)
-this.Yz(a)
-this.Jh(a)
-a.I8.W2(a.GQ)
-a.GM.W2(a.Oc)
-this.ct(a,C.Aq,0,1)
-this.ct(a,C.ST,0,1)
-this.ct(a,C.DS,0,1)},"$1","gd0",2,0,20,57],
-Ar:[function(a,b){var z,y,x
-z=a.Ol
-if(z==null)return""
-y=J.RE(z)
-x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.L9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,137,138],
-uW:[function(a,b){var z,y
-z=a.Ol
-if(z==null)return""
-y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,137,138],
-F9:[function(a,b){var z,y
-z=a.Ol
-if(z==null)return""
-y=J.RE(z)
-return J.cI((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,137,138],
-Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.GQ=new G.Kf(z)
-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.V7("addColumn",["string","Type"])
-a.Oc.Yb.V7("addColumn",["number","Size"])
-z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.nc,new K.UC([new G.Kt("Class",G.Q8()),new G.Kt("",G.Q8()),new G.Kt("Accumulated Size (New)",G.YN()),new G.Kt("Accumulated Instances",G.kh()),new G.Kt("Current Size",G.YN()),new G.Kt("Current Instances",G.kh()),new G.Kt("",G.Q8()),new G.Kt("Accumulator Size (Old)",G.YN()),new G.Kt("Accumulator Instances",G.kh()),new G.Kt("Current Size",G.YN()),new G.Kt("Current Instances",G.kh())],z,[],0,!0,null,null))
-a.nc=z
-z.sxp(2)},
-static:{US:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.MF="---"
-a.uY="---"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.xu.ZL(a)
-C.xu.XI(a)
-C.xu.Zy(a)
-return a}}},
-V10:{
-"^":"uL+Pi;",
-$isd3:true}}],["html_common","dart:html_common",,P,{
-"^":"",
-bL:function(a){var z,y
-z=[]
-y=new P.Tm(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.a9([],z),new P.D6(z),new P.KC(z)).$1(a)},
-J3:function(a){var z,y
-z=J.x(a)
-if(!!z.$isSg){y=z.gRn(a)
-if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.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=$.R6
-if(z==null){z=$.Qz
-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:{
-"^":"Tp:48;b,c",
-$1:function(a){var z,y,x
-z=this.b
-y=z.length
-for(x=0;x<y;++x)if(z[x]===a)return x
-z.push(a)
-this.c.push(null)
-return y},
-$isEH:true},
-rG:{
-"^":"Tp:139;d",
-$1:function(a){var z=this.d
-if(a>=z.length)return H.e(z,a)
-return z[a]},
-$isEH:true},
-fh:{
-"^":"Tp:140;e",
-$2:function(a,b){var z=this.e
-if(a>=z.length)return H.e(z,a)
-z[a]=b},
-$isEH:true},
-uS:{
-"^":"Tp:69;",
-$0:function(){},
-$isEH:true},
-Tm:{
-"^":"Tp:13;f,UI,bK",
-$1:function(a){var z,y,x,w,v,u
-z={}
-if(a==null)return a
-if(typeof a==="boolean")return a
-if(typeof a==="number")return a
-if(typeof a==="string")return a
-y=J.x(a)
-if(!!y.$isiP)return new Date(a.y3)
-if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
-if(!!y.$ishH)return a
-if(!!y.$isO4)return a
-if(!!y.$isSg)return a
-if(!!y.$isWZ)return a
-if(!!y.$iseH)return a
-if(!!y.$isZ0){x=this.f.$1(a)
-w=this.UI.$1(x)
-z.a=w
-if(w!=null)return w
-w={}
-z.a=w
-this.bK.$2(x,w)
-y.aN(a,new P.q1(z,this))
-return z.a}if(!!y.$isWO){v=y.gB(a)
-x=this.f.$1(a)
-w=this.UI.$1(x)
-if(w!=null){if(!0===w){w=new Array(v)
-this.bK.$2(x,w)}return w}w=new Array(v)
-this.bK.$2(x,w)
-for(u=0;u<v;++u){z=this.$1(y.t(a,u))
-if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
-$isEH:true},
-q1:{
-"^":"Tp:77;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true},
-a9:{
-"^":"Tp:48;a,b",
-$1:function(a){var z,y,x,w
-z=this.a
-y=z.length
-for(x=0;x<y;++x){w=z[x]
-if(w==null?a==null:w===a)return x}z.push(a)
-this.b.push(null)
-return y},
-$isEH:true},
-D6:{
-"^":"Tp:139;c",
-$1:function(a){var z=this.c
-if(a>=z.length)return H.e(z,a)
-return z[a]},
-$isEH:true},
-KC:{
-"^":"Tp:140;d",
-$2:function(a,b){var z=this.d
-if(a>=z.length)return H.e(z,a)
-z[a]=b},
-$isEH:true},
-xL:{
-"^":"Tp:13;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
-if(typeof a==="number")return a
-if(typeof a==="string")return a
-if(a instanceof Date)return P.Wu(a.getTime(),!0)
-if(a instanceof RegExp)throw H.b(P.SY("structured clone of RegExp"))
-if(Object.getPrototypeOf(a)===Object.prototype){z=this.f.$1(a)
-y=this.UI.$1(z)
-if(y!=null)return y
-y=P.Fl(null,null)
-this.bK.$2(z,y)
-for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=x.lo
-y.u(0,w,this.$1(a[w]))}return y}if(a instanceof Array){z=this.f.$1(a)
-y=this.UI.$1(z)
-if(y!=null)return y
-x=J.U6(a)
-v=x.gB(a)
-y=this.e?new Array(v):a
-this.bK.$2(z,y)
-if(typeof v!=="number")return H.s(v)
-u=J.w1(y)
-t=0
-for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
-return y}return a},
-$isEH:true},
-nl:{
-"^":"a;Rn>,fg>,R>",
-$isnl:true,
-$isSg:true},
-As3:{
-"^":"a;",
-bu:function(a){return this.lF().zV(0," ")},
-gA:function(a){var z=this.lF()
-z=H.VM(new P.zQ(z,z.zN,null,null),[null])
-z.zq=z.O2.H9
-return z},
-aN:function(a,b){this.lF().aN(0,b)},
-zV:function(a,b){return this.lF().zV(0,b)},
-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,141,31],
-ad:function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.Kp(z,0)])},
-lM:[function(a,b){var z=this.lF()
-return H.VM(new H.oA(z,b),[H.Kp(z,0),null])},"$1","git",2,0,142,31],
-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},
-gB:function(a){return this.lF().X5},
-tg:function(a,b){return this.lF().tg(0,b)},
-hV:function(a){return this.lF().tg(0,a)?a:null},
-h:function(a,b){return this.OS(new P.GE(b))},
-Rz:function(a,b){var z,y
-z=this.lF()
-y=z.Rz(0,b)
-this.p5(z)
-return y},
-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(z)},
-tt:function(a,b){return this.lF().tt(0,b)},
-br:function(a){return this.tt(a,!0)},
-V1:function(a){this.OS(new P.uQ())},
-OS:function(a){var z,y
-z=this.lF()
-y=a.$1(z)
-this.p5(z)
-return y},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.qU]}},
-GE:{
-"^":"Tp:13;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-rl:{
-"^":"Tp:13;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-uQ:{
-"^":"Tp:13;",
-$1:[function(a){return J.U2(a)},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-D7:{
-"^":"ark;Yn,iz",
-gye:function(){var z=this.iz
-return P.F(z.ad(z,new P.hT()),!0,W.h4)},
-aN:function(a,b){H.bQ(this.gye(),b)},
-u:function(a,b,c){var z=this.gye()
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.Bj(z[b],c)},
-sB:function(a,b){var z=this.gye().length
-if(b>=z)return
-else if(b<0)throw H.b(P.u("Invalid list length"))
-this.UZ(0,b,z)},
-h:function(a,b){this.iz.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.iz.NL;z.G();)y.appendChild(z.lo)},
-tg:function(a,b){return!1},
-GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
-Jd:function(a){return this.GT(a,null)},
-YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},
-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)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)J.Mp(z)
-return z},
-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.qD(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)
-return z[b]},
-gA:function(a){var z=this.gye()
-return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
-hT:{
-"^":"Tp:13;",
-$1:function(a){return!!J.x(a).$ish4},
-$isEH:true},
-GS:{
-"^":"Tp:13;",
-$1:function(a){return J.Mp(a)},
-$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
-"^":"",
-pR:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gJp:function(a){var z=a.tY
-if(z!=null)if(J.xC(z.gzS(),"Null"))if(J.xC(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
-else if(J.xC(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
-else if(J.xC(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
-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)},
-Gn:[function(a){return this.gNe(a)},"$0","gyX",0,0,69],
-vQ:[function(a,b,c){var z,y
-z=a.tY
-if(b===!0)J.r0(z).ml(new B.qB(a)).Qy(c)
-else{y=J.w1(z)
-y.u(z,"fields",null)
-y.u(z,"elements",null)
-c.$0()}},"$2","gNe",4,0,144,145,90],
-static:{lu:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.EL.ZL(a)
-C.EL.XI(a)
-return a}}},
-qB:{
-"^":"Tp:13;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.sdN(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,130,"call"],
-$isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
-"^":"",
-hx:{
-"^":"V11;Xh,f2,Rr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-gCF:function(a){return a.Rr},
-sCF:function(a,b){a.Rr=this.ct(a,C.tg,a.Rr,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,97,98],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,99,100],
-Pr:[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,99,33],
-RF:[function(a,b){J.r0(a.Xh).Qy(b)},"$1","gvC",2,0,20,90],
-static:{CoW:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Rr=null
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.yd.ZL(a)
-C.yd.XI(a)
-return a}}},
-V11:{
-"^":"uL+Pi;",
-$isd3:true},
-wU:{
-"^":"Tp:101;a",
-$1:[function(a){var z,y
-z=this.a
-y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,82,"call"],
-$isEH:true},
-cL:{
-"^":"Tp:131;a",
-$1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,82,"call"],
-$isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
-"^":"",
-L4:{
-"^":"V12;PM,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.PM).Qy(b)},"$1","gvC",2,0,20,90],
-static:{MB:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.za.ZL(a)
-C.za.XI(a)
-return a}}},
-V12:{
-"^":"uL+Pi;",
-$isd3:true},
-Mb:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{RVI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ag.ZL(a)
-C.Ag.XI(a)
-return a}}},
-mO:{
-"^":"V13;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Ch:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ie.ZL(a)
-C.Ie.XI(a)
-return a}}},
-V13:{
-"^":"uL+Pi;",
-$isd3:true},
-DE:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{oB:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ig.ZL(a)
-C.Ig.XI(a)
-return a}}},
-U1:{
-"^":"V14;yR,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.yR).Qy(b)},"$1","gvC",2,0,20,90],
-TY:[function(a){J.r0(a.yR).Qy(new E.Kv(a))},"$0","gW6",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{hm:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.VLs.ZL(a)
-C.VLs.XI(a)
-return a}}},
-V14:{
-"^":"uL+Pi;",
-$isd3:true},
-Kv:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
-$isEH:true},
-H8:{
-"^":"V15;vd,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gPB:function(a){return a.vd},
-sPB:function(a,b){a.vd=this.ct(a,C.yL,a.vd,b)},
-RF:[function(a,b){J.r0(a.vd).Qy(b)},"$1","gvC",2,0,20,90],
-TY:[function(a){J.r0(a.vd).Qy(new E.uN(a))},"$0","gW6",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{ZhX:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.hh.ZL(a)
-C.hh.XI(a)
-return a}}},
-V15:{
-"^":"uL+Pi;",
-$isd3:true},
-uN:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
-$isEH:true},
-WS:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{jS:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.bP.ZL(a)
-C.bP.XI(a)
-return a}}},
-qh:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{Sc:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wK.ZL(a)
-C.wK.XI(a)
-return a}}},
-oF:{
-"^":"V16;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{UE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Tl.ZL(a)
-C.Tl.XI(a)
-return a}}},
-V16:{
-"^":"uL+Pi;",
-$isd3:true},
-Q6:{
-"^":"V17;uv,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.uv).Qy(b)},"$1","gvC",2,0,20,90],
-static:{chF:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.to.ZL(a)
-C.to.XI(a)
-return a}}},
-V17:{
-"^":"uL+Pi;",
-$isd3:true},
-uE:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{P3:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Rr.ZL(a)
-C.Rr.XI(a)
-return a}}},
-Zn:{
-"^":"V18;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{xK:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ij.ZL(a)
-C.ij.XI(a)
-return a}}},
-V18:{
-"^":"uL+Pi;",
-$isd3:true},
-n5:{
-"^":"V19;h1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.h1).Qy(b)},"$1","gvC",2,0,20,90],
-static:{iOo:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.aV.ZL(a)
-C.aV.XI(a)
-return a}}},
-V19:{
-"^":"uL+Pi;",
-$isd3:true},
-Ma:{
-"^":"V20;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Ii:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.iR.ZL(a)
-C.iR.XI(a)
-return a}}},
-V20:{
-"^":"uL+Pi;",
-$isd3:true},
-wN:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{ML:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.L6.ZL(a)
-C.L6.XI(a)
-return a}}},
-ds:{
-"^":"V21;wT,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.wT).Qy(b)},"$1","gvC",2,0,20,90],
-nK:[function(a){J.r0(a.wT).Qy(new E.Gf(a))},"$0","guT",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{pI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wP.ZL(a)
-C.wP.XI(a)
-return a}}},
-V21:{
-"^":"uL+Pi;",
-$isd3:true},
-Gf:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
-$isEH:true},
-ou:{
-"^":"V22;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{tX:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.lX.ZL(a)
-C.lX.XI(a)
-return a}}},
-V22:{
-"^":"uL+Pi;",
-$isd3:true},
-av:{
-"^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gEQ:function(a){return a.CB},
-sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
-static:{Ci:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.CB=!1
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Wa.ZL(a)
-C.Wa.XI(a)
-return a}}},
-ZzR:{
-"^":"xI+Pi;",
-$isd3:true},
-uz:{
-"^":"V23;RX,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.RX).Qy(b)},"$1","gvC",2,0,20,90],
-nK:[function(a){J.r0(a.RX).Qy(new E.Cc(a))},"$0","guT",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{z1:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.bZ.ZL(a)
-C.bZ.XI(a)
-return a}}},
-V23:{
-"^":"uL+Pi;",
-$isd3:true},
-Cc:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(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:{
-"^":"Y2;B1>,YK,H,Zn<,vs<,ki<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
-gtT:function(a){return J.on(this.H)},
-C4:function(a){var z,y,x,w,v,u,t,s
-z=this.B1
-y=J.UQ(z,"threshold")
-x=this.ks
-if(x.length>0)return
-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.Mx(this.H))>0},
-mW:function(a,b,c,d){var z,y
-z=this.H
-this.Vh=H.d(z.gAv())
-this.ZX=G.P0(J.L9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
-y=J.RE(z)
-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"
-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())
-this.ki=G.dj(y.gtT(z).gDu(),this.YK.Av)}z=this.oH
-z.push(this.vs)
-z.push(this.ki)},
-static:{SJ:function(a,b,c,d){var z,y
-z=H.VM([],[G.Y2])
-y=d!=null?d.yt+1:0
-z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
-z.k7(d)
-z.mW(a,b,c,d)
-return z}}},
-kK:{
-"^":"V24;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,WC,Hm=,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gB1:function(a){return a.oi},
-sB1:function(a,b){a.oi=this.ct(a,C.vb,a.oi,b)},
-gPL:function(a){return a.TH},
-sPL:function(a,b){a.TH=this.ct(a,C.He,a.TH,b)},
-gLW:function(a){return a.WT},
-sLW:function(a,b){a.WT=this.ct(a,C.Gs,a.WT,b)},
-gUo:function(a){return a.Uw},
-sUo:function(a,b){a.Uw=this.ct(a,C.Dj,a.Uw,b)},
-gEl:function(a){return a.Ik},
-sEl:function(a,b){a.Ik=this.ct(a,C.YD,a.Ik,b)},
-gnZ:function(a){return a.oo},
-snZ:function(a,b){a.oo=this.ct(a,C.bE,a.oo,b)},
-gNG:function(a){return a.fE},
-sNG:function(a,b){a.fE=this.ct(a,C.aH,a.fE,b)},
-gQl:function(a){return a.ev},
-sQl:function(a,b){a.ev=this.ct(a,C.zz,a.ev,b)},
-gZA:function(a){return a.TM},
-sZA:function(a,b){a.TM=this.ct(a,C.TW,a.TM,b)},
-n1:[function(a,b){var z,y,x,w,v
-z=a.oi
-if(z==null)return
-y=J.UQ(z,"samples")
-x=new P.iP(Date.now(),!1)
-x.EK()
-z=J.AG(y)
-a.WT=this.ct(a,C.Gs,a.WT,z)
-z=x.bu(0)
-a.Uw=this.ct(a,C.Dj,a.Uw,z)
-z=J.AG(J.UQ(a.oi,"depth"))
-a.oo=this.ct(a,C.bE,a.oo,z)
-w=J.UQ(a.oi,"period")
-if(typeof w!=="number")return H.s(w)
-z=C.CD.Sy(1000000/w,0)
-a.Ik=this.ct(a,C.YD,a.Ik,z)
-z=G.mG(J.UQ(a.oi,"timeSpan"))
-a.ev=this.ct(a,C.zz,a.ev,z)
-z=a.XX
-v=C.YI.bu(z*100)+"%"
-a.fE=this.ct(a,C.aH,a.fE,v)
-J.aT(a.oi).N3(a.oi)
-J.kW(a.oi,"threshold",z)
-this.Zb(a)},"$1","gd0",2,0,20,57],
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=R.tB([])
-a.Hm=new G.XN(z,null,null)
-this.Zb(a)},
-m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,20,57],
-RF:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).Qy(b)},"$1","gvC",2,0,20,90],
-Zb:function(a){if(a.oi==null)return
-this.GN(a)},
-GN:function(a){var z,y,x,w,v
-z=J.aT(a.oi).gBC()
-if(z==null)return
-try{a.Hm.rT(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-N.QM("").xH("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),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,91,92],
-Vj:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,91,92],
-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()
-w.qU(v-1)}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,93,1,94,95],
-static:{"^":"B6",jD:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.WT=""
-a.Uw=""
-a.Ik=""
-a.oo=""
-a.fE=""
-a.ev=""
-a.XX=0.0002
-a.TM="uv"
-a.WC="#tableTree"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.kS.ZL(a)
-C.kS.XI(a)
-return a}}},
-V24:{
-"^":"uL+Pi;",
-$isd3:true},
-Xy:{
-"^":"Tp:101;a",
-$1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,146,"call"],
-$isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
-"^":"",
-oa:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{IB:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.LN.ZL(a)
-C.LN.XI(a)
-return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
-"^":"",
-St:{
-"^":"V25;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.OoF.ZL(a)
-C.OoF.XI(a)
-return a}}},
-V25:{
-"^":"uL+Pi;",
-$isd3:true},
-IW:{
-"^":"V26;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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,147,14],
-kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,147,14],
-static:{zr:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.F2.ZL(a)
-C.F2.XI(a)
-return a}}},
-V26:{
-"^":"uL+Pi;",
-$isd3:true},
-GG:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ow)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-r8:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ow)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-Qh:{
-"^":"V27;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.kd.ZL(a)
-C.kd.XI(a)
-return a}}},
-V27:{
-"^":"uL+Pi;",
-$isd3:true},
-Oz:{
-"^":"V28;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ji.ZL(a)
-C.Ji.XI(a)
-return a}}},
-V28:{
-"^":"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.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)
-u=[]
-C.Nm.FV(u,C.Nm.ez([w,H.RR(v[0],null)],P.En()))
-u=new P.Tz(u)
-u.$builtinTypeInfo=[null]
-z.V7("addRow",[u])}}},
-Z4:{
-"^":"V29;wd,iw,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.iw==null)a.iw=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
-z=a.iw
-if(z==null)return
-z.eC(a.wd)
-y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
-if(y!=null){z=a.iw
-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,20,57],
-static:{d7:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wQ.ZL(a)
-C.wQ.XI(a)
-return a}}},
-V29:{
-"^":"uL+Pi;",
-$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
-"^":"",
-If:{
-"^":"a;X6,YT",
-eC:function(a){var z,y,x,w,v,u,t,s,r,q
-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.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-w=J.R7(a.gaf(),"Idle")
-v=a.gij()
-for(u=0;u<a.glI().length;++u){y=a.glI()
-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()
-if(u>=y.length)return H.e(y,u)
-r=y[u].wZ
-if(r===0){q=0
-while(!0){y=a.glI()
-if(u>=y.length)return H.e(y,u)
-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()
-if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].XE.length))break
-c$1:{if(q===w)break c$1
-y=a.glI()
-if(u>=y.length)return H.e(y,u)
-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.V7("addRow",[y])}}},
-qk:{
-"^":"V30;ck,ts,LR,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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,97,98],
-Vp:[function(a){a.ck.m7().ml(new L.LX(a))},"$0","gJD",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.ts=P.rT(P.ii(0,0,0,0,0,1),this.gJD(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.ts
-if(z!=null){z.ed()
-a.ts=null}},
-RF:[function(a,b){J.r0(a.ck).Qy(b)},"$1","gvC",2,0,20,90],
-Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,147,14],
-kf:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,147,14],
-static:{Qtp:function(a){var z,y,x
-z=P.zV(J.UQ($.BY,"DataTable"),null)
-y=P.L5(null,null,null,P.qU,W.I0)
-x=P.qU
-x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
-a.LR=new L.If(new G.Kf(z),null)
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=y
-a.ZQ=x
-C.Xe.ZL(a)
-C.Xe.XI(a)
-return a}}},
-V30:{
-"^":"uL+Pi;",
-$isd3:true},
-LX:{
-"^":"Tp:13;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.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.YT=v
-w.u(0,"isStacked",!0)
-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)}if(z.ts!=null)z.ts=P.rT(P.ii(0,0,0,0,0,1),J.OY(z))},"$1",null,2,0,null,148,"call"],
-$isEH:true},
-CV:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ck)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-Vq:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ck)},"$1",null,2,0,null,130,"call"],
-$isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
-"^":"",
-xh:{
-"^":"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.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.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.QC(t,v)
-s=C.xB.U("  ",b)
-s=x.vM+=s
-x.vM=s+"]\n"}else{s=C.xB.U("  ",b)
-x.vM+=s
-s="\""+H.d(u)+"\": "+H.d(t)
-s=x.vM+=s
-x.vM=s+"\n"}}z.Rz(0,a)},
-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.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.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.QC(v,w)
-u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"]\n"}else{u=C.xB.U("  ",b)
-x.vM+=u
-u=x.vM+=typeof v==="string"?v:H.d(v)
-x.vM=u+"\n"}}z.Rz(0,a)}},
-vj:{
-"^":"V31;Ly,cs,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gIr:function(a){return a.Ly},
-ez:function(a,b){return this.gIr(a).$1(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.Ly
-z.vM=""
-z.KF("{\n")
-new Z.xh(z,y).LE(x,0)
-z.KF("}\n")
-z=z.vM
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,20,57],
-static:{M7:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Yt.ZL(a)
-C.Yt.XI(a)
-return a}}},
-V31:{
-"^":"uL+Pi;",
-$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
-"^":"",
-LU:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{rA:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Z3.ZL(a)
-C.Z3.XI(a)
-return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
-"^":"",
-CX:{
-"^":"V32;iI,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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,97,98],
-RF:[function(a,b){J.r0(a.iI).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Dc:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.MG.ZL(a)
-C.MG.XI(a)
-return a}}},
-V32:{
-"^":"uL+Pi;",
-$isd3:true}}],["logging","package:logging/logging.dart",,N,{
-"^":"",
-Rw:{
-"^":"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.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.tQ()},
-mL: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()
-y=new P.iP(Date.now(),!1)
-y.EK()
-x=$.xO
-$.xO=x+1
-w=new N.HV(a,b,z,y,x,c,d)
-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.D8,a,b,c)},
-kS: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)},
-ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
-To:function(a){return this.ZG(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)},
-tQ: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("").tQ()},
-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)},
-$isRw:true,
-static:{"^":"Uj",QM:function(a){return $.Iu().to(a,new N.aO(a))}}},
-aO:{
-"^":"Tp:69;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.Rw)
-v=new N.Rw(z,x,null,w,H.VM(new Q.A2(w),[null,null]),null)
-v.QL(z,x,w)
-return v},
-$isEH:true},
-qV:{
-"^":"a;oc>,P>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isqV&&this.P===b.P},
-C:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P<z},
-E:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P<=z},
-D:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P>z},
-F:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P>=z},
-iM:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P-z},
-giO:function(a){return this.P},
-bu:function(a){return this.oc},
-$isqV:true,
-static:{"^":"X9,tmj,Enk,LkO,tY,kH8,hlK,MHK,fM,lDu,uxc"}},
-HV:{
-"^":"a;OR<,G1>,iJ,Fl<,c0,kc>,I4<",
-bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
-$isHV:true,
-static:{"^":"xO"}}}],["","main.dart",,F,{
-"^":"",
-E2:function(){var z,y
-N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e392())
-N.QM("").To("Starting Observatory")
-N.QM("").To("Loading Google Charts API")
-z=J.UQ($.Si(),"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.e393())},
-e392:{
-"^":"Tp:150;",
-$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,149,"call"],
-$isEH:true},
-e393:{
-"^":"Tp:13;",
-$1:[function(a){N.QM("").To("Initializing Polymer")
-A.YK()},"$1",null,2,0,null,14,"call"],
-$isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
-"^":"",
-md:{
-"^":"V33;i4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-giC:function(a){return a.i4},
-siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
-static:{DCi:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.i4=!0
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.kD.ZL(a)
-C.kD.XI(a)
-return a}}},
-V33:{
-"^":"uL+Pi;",
-$isd3:true},
-Bm:{
-"^":"V34;KU,V4,Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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:{AJm:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.KU="#"
-a.V4="---"
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.IG.ZL(a)
-C.IG.XI(a)
-return a}}},
-V34:{
-"^":"uL+Pi;",
-$isd3:true},
-Ya:{
-"^":"V35;KU,V4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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:{vn:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.KU="#"
-a.V4="---"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.nn.ZL(a)
-C.nn.XI(a)
-return a}}},
-V35:{
-"^":"uL+Pi;",
-$isd3:true},
-Ww:{
-"^":"V36;rU,SB,z2,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.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)},
-W1:[function(a,b,c,d){var z=a.SB
-if(z===!0)return
-a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,102,1,94,95],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,18],
-static:{ZC:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.SB=!1
-a.z2="Refresh"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.J7.ZL(a)
-C.J7.XI(a)
-return a}}},
-V36:{
-"^":"uL+Pi;",
-$isd3:true},
-ye:{
-"^":"uL;AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{Fv:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.br.ZL(a)
-C.br.XI(a)
-return a}}},
-G1:{
-"^":"V37;Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.OKl.ZL(a)
-C.OKl.XI(a)
-return a}}},
-V37:{
-"^":"uL+Pi;",
-$isd3:true},
-fl:{
-"^":"V38;Jo,iy,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","gQ1",2,0,20,57],
-gu6:function(a){var z=a.iy
-if(z!=null)return J.Ds(z)
-else return""},
-su6:function(a,b){},
-static:{zf:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.RRl.ZL(a)
-C.RRl.XI(a)
-return a}}},
-V38:{
-"^":"uL+Pi;",
-$isd3:true},
-UK:{
-"^":"V39;VW,Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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:{IV:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ct.ZL(a)
-C.ct.XI(a)
-return a}}},
-V39:{
-"^":"uL+Pi;",
-$isd3:true},
-wM:{
-"^":"V40;Au,Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.HR.ZL(a)
-C.HR.XI(a)
-return a}}},
-V40:{
-"^":"uL+Pi;",
-$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
-"^":"",
-F1:{
-"^":"V41;qC,MR,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gzj:function(a){return a.qC},
-szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
-Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
-if(a.qC===!0){z=H.VM([],[G.uG])
-y=new U.ho(P.L5(null,null,null,P.qU,P.oh),0,"unknown","unknown",0,!1,!1,"",null,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)
-y.md()
-y.PI()
-y=new G.mL(z,null,null,new G.OR("/vm",null,null,null,null,null),y,null,a,null,null,null)
-y.E0(a)
-a.MR=y}else{z=H.VM([],[G.uG])
-y=new U.XK(null,"unknown","unknown",0,!1,!1,"",null,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)
-y.md()
-y.eY()
-y=new G.mL(z,null,null,new G.OR("/vm",null,null,null,null,null),y,null,a,null,null,null)
-y.Ty(a)
-a.MR=y}},
-static:{JT8:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.qC=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.BH.ZL(a)
-C.BH.XI(a)
-return a}}},
-V41:{
-"^":"uL+Pi;",
-$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
-"^":"",
-uL:{
-"^":"xc;AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-Es:function(a){A.zs.prototype.Es.call(this,a)},
-wN:function(a,b,c,d){A.zs.prototype.wN.call(this,a,b,c,d)},
-dQ:function(a){A.zs.prototype.dQ.call(this,a)},
-aR:function(a){A.zs.prototype.aR.call(this,a)},
-cD:[function(a,b,c,d){$.W5.Bs(b,c,d)},"$3","gRh",6,0,151,2,94,95],
-XD:[function(a,b){$.W5.toString
-return"#"+H.d(b)},"$1","gn0",2,0,152,153],
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,154,155],
-Ze:[function(a,b){return G.As(b)},"$1","gbJ",2,0,15,16],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,156,157],
-i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,156,157],
-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,156,157],
-GA:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,156,157],
-ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,156,157],
-wm:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,156,157],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,156,157],
-Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,156,157],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,156,157],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,156,157],
-static:{EE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Pfz.ZL(a)
-C.Pfz.XI(a)
-return a}}}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
-"^":"",
-Ap:{
-"^":"a;",
-sP:function(a,b){},
-$isAp:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
-"^":"",
-Pi:{
-"^":"a;",
-gqh:function(a){var z=a.AP
-if(z==null){z=this.gqw(a)
-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","gqw",0,0,18],
-NB:[function(a){a.AP=null},"$0","gym",0,0,18],
-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,111],
-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)},
-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,{
-"^":"",
-yj:{
-"^":"a;",
-$isyj:true},
-qI:{
-"^":"yj;WA>,oc>,jL,zZ",
-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
-if($.Td)return
-if($.Oo==null)return
-$.Td=!0
-z=0
-y=null
-do{++z
-if(z===1000)y=[]
-x=$.Oo
-w=[]
-w.$builtinTypeInfo=[F.d3]
-$.Oo=w
-for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
-s=J.RE(t)
-if(s.gnz(t)){if(s.HC(t)){if(w)y.push([u,t])
-v=!0}$.Oo.push(t)}}}while(z<1000&&v)
-if(w&&v){w=$.S5()
-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
-$.Td=!1},
-Ht:function(){var z={}
-z.a=!1
-z=new O.YC(z)
-return new P.yQ(null,null,null,null,new O.u3(z),new O.bF(z),null,null,null,null,null,null)},
-YC:{
-"^":"Tp:158;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:69;a",
-$0:[function(){this.a.a=!1
-O.N0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-u3:{
-"^":"Tp:30;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,27,28,29,31,"call"],
-$isEH:true},
-yJ:{
-"^":"Tp:69;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:159;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,27,28,29,31,"call"],
-$isEH:true},
-f6:{
-"^":"Tp:13;bK,Gq,Rm,w3",
-$1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,65,"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.ew(J.bI(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)
-if(v>=w)return H.e(x,v)
-x[v]=u
-if(0>=u.length)return H.e(u,0)
-u[0]=v}if(typeof y!=="number")return H.s(y)
-t=0
-for(;t<y;++t){if(0>=w)return H.e(x,0)
-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.bI(u.g(b,t),1)))
-o=x[v]
-n=x[r]
-m=t-1
-if(p){if(v>=w)return H.e(x,v)
-if(r>=w)return H.e(x,r)
-if(m>=n.length)return H.e(n,m)
-p=n[m]
-if(t>=o.length)return H.e(o,t)
-o[t]=p}else{if(r>=w)return H.e(x,r)
-if(t>=n.length)return H.e(n,t)
-p=n[t]
-if(typeof p!=="number")return p.g()
-if(v>=w)return H.e(x,v)
-n=o.length
-if(m>=n)return H.e(o,m)
-m=o[m]
-if(typeof m!=="number")return m.g()
-m=P.J(p+1,m+1)
-if(t>=n)return H.e(o,t)
-o[t]=m}}return x},
-kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=a.length
-y=z-1
-if(0>=z)return H.e(a,0)
-x=a[0].length-1
-if(y<0)return H.e(a,y)
-w=a[y]
-if(x<0||x>=w.length)return H.e(w,x)
-v=w[x]
-u=[]
-while(!0){if(!(y>0||x>0))break
-c$0:{if(y===0){u.push(2);--x
-break c$0}if(x===0){u.push(3);--y
-break c$0}w=y-1
-if(w<0)return H.e(a,w)
-t=a[w]
-s=x-1
-r=t.length
-if(s<0||s>=r)return H.e(t,s)
-q=t[s]
-if(x<0||x>=r)return H.e(t,x)
-p=t[x]
-if(y<0)return H.e(a,y)
-t=a[y]
-if(s>=t.length)return H.e(t,s)
-o=t[s]
-n=P.J(P.J(p,o),q)
-if(n===q){if(q==null?v==null:q===v)u.push(0)
-else{u.push(1)
-v=q}x=s
-y=w}else if(n===p){u.push(3)
-v=p
-y=w}else{u.push(2)
-v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},
-rN:function(a,b,c){var z,y,x
-for(z=J.U6(a),y=0;y<c;++y){x=z.t(a,y)
-if(y>=b.length)return H.e(b,y)
-if(!J.xC(x,b[y]))return y}return c},
-xU:function(a,b,c){var z,y,x,w,v
-z=J.U6(a)
-y=z.gB(a)
-x=b.length
-w=0
-while(!0){if(w<c){--y
-v=z.t(a,y);--x
-if(x<0||x>=b.length)return H.e(b,x)
-v=J.xC(v,b[x])}else v=!1
-if(!v)break;++w}return w},
-jj:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.Wx(c)
-y=P.J(z.W(c,b),f-e)
-x=J.x(b)
-w=x.n(b,0)&&e===0?G.rN(a,d,y):0
-v=z.n(c,J.q8(a))&&f===d.length?G.xU(a,d,y-w):0
-b=x.g(b,w)
-e+=w
-c=z.W(c,v)
-f-=v
-z=J.Wx(c)
-if(J.xC(z.W(c,b),0)&&f-e===0)return C.dn
-if(J.xC(b,c)){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,b,0)
-for(;e<f;e=s){z=t.em
-s=e+1
-if(e>>>0!==e||e>=d.length)return H.e(d,e)
-J.bi(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
-u=[]
-x=new P.Yp(u)
-x.$builtinTypeInfo=[null]
-return[new G.DA(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
-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.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.Ld=J.ew(t.Ld,1)
-o=J.ew(o,1)
-z=t.em
-if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
-break
-case 2:if(t==null){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}t.Ld=J.ew(t.Ld,1)
-o=J.ew(o,1)
-break
-case 3:if(t==null){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}z=t.em
-if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
-break}if(t!=null)q.push(t)
-return q},
-m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.RE(b)
-y=z.gWA(b)
-z=z.gvH(b)
-x=J.qA(b.gem())
-w=b.gNg()
-if(w==null)w=0
-v=new P.Yp(x)
-v.$builtinTypeInfo=[null]
-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.Ft=J.ew(q.Ft,s)
-if(t)continue
-z=u.Ft
-y=J.ew(z,u.VD.G4.length)
-x=q.Ft
-p=P.J(y,J.ew(x,q.Ld))-P.y(z,x)
-if(p>=0){C.Nm.KI(a,r);--r
-z=J.bI(q.Ld,q.VD.G4.length)
-if(typeof z!=="number")return H.s(z)
-s-=z
-z=J.ew(u.Ld,J.bI(q.Ld,p))
-u.Ld=z
-y=u.VD.G4.length
-x=q.VD.G4.length
-if(J.xC(z,0)&&y+x-p===0)t=!0
-else{o=q.em
-if(J.u6(u.Ft,q.Ft)){z=u.VD
-z=z.Mu(z,0,J.bI(q.Ft,u.Ft))
-o.toString
-if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
-H.IC(o,0,z)}if(J.z8(J.ew(u.Ft,u.VD.G4.length),J.ew(q.Ft,q.Ld))){z=u.VD
-J.bj(o,z.Mu(z,J.bI(J.ew(q.Ft,q.Ld),u.Ft),u.VD.G4.length))}u.em=o
-u.VD=q.VD
-if(J.u6(q.Ft,u.Ft))u.Ft=q.Ft
-t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.xe(a,r,u);++r
-n=J.bI(u.Ld,u.VD.G4.length)
-q.Ft=J.ew(q.Ft,n)
-if(typeof n!=="number")return H.s(n)
-s+=n
-t=!0}else t=!1}if(!t)a.push(u)},
-hs:function(a,b){var z,y
-z=H.VM([],[G.DA])
-for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},
-Qi:function(a,b){var z,y,x,w,v,u
-if(b.length<=1)return b
-z=[]
-for(y=G.hs(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]
-u=J.zj(w)
-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.ew(v.gvH(w),w.gNg()),w.gem(),0,w.gRt().G4.length))}return z},
-DA:{
-"^":"a;WA>,VD,em<,Ft,Ld",
-gvH:function(a){return this.Ft},
-gRt:function(){return this.VD},
-gNg:function(){return this.Ld},
-XP:function(a){var z
-if(typeof a==="number"&&Math.floor(a)===a){z=this.Ft
-if(typeof z!=="number")return H.s(z)
-z=a<z}else z=!0
-if(z)return!1
-if(!J.xC(this.Ld,this.VD.G4.length))return!0
-return J.u6(a,J.ew(this.Ft,this.Ld))},
-bu:function(a){var z,y
-z="#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "
-y=this.VD
-return z+y.bu(y)+", addedCount: "+H.d(this.Ld)+">"},
-$isDA:true,
-static:{K6:function(a,b,c,d){var z
-if(d==null)d=[]
-if(c==null)c=0
-z=new P.Yp(d)
-z.$builtinTypeInfo=[null]
-return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
-"^":"",
-nd:{
-"^":"a;"},
-vly:{
-"^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
-"^":"",
-kM:[function(){return O.N0()},"$0","Jy",0,0,18],
-Wi:function(a,b,c,d){var z=J.RE(a)
-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;R9:ro%,V2:dUC%,me:pt%",
-gqh:function(a){var z
-if(this.gR9(a)==null){z=this.glZ(a)
-this.sR9(a,P.bK(this.gkk(a),z,!0,null))}z=this.gR9(a)
-z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gnz:function(a){var z,y
-if(this.gR9(a)!=null){z=this.gR9(a)
-y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-W7Y:[function(a){var z,y,x,w
-z=$.Oo
-if(z==null){z=H.VM([],[F.d3])
-$.Oo=z}z.push(a)
-$.ax=$.ax+1
-y=P.L5(null,null,null,P.GD,P.a)
-for(z=this.gbx(a),z=$.mX().Me(0,z,new A.Wq(!0,!1,!0,C.FQ,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=J.O6(z.lo)
-w=$.cp().eA.t(0,x)
-if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+this.bu(a)))
-y.u(0,x,w.$1(a))}this.sV2(a,y)},"$0","glZ",0,0,18],
-L5:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,18],
-HC:function(a){var z,y
-z={}
-if(this.gV2(a)==null||!this.gnz(a))return!1
-z.a=this.gme(a)
-this.sme(a,null)
-this.gV2(a).aN(0,new F.X6(z,a))
-if(z.a==null)return!1
-y=this.gR9(a)
-z=H.VM(new P.Yp(z.a),[T.yj])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
-return!0},
-nq:function(a,b){if(!this.gnz(a))return
-if(this.gme(a)==null)this.sme(a,[])
-this.gme(a).push(b)},
-$isd3:true},
-X6:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z,y,x,w,v
-z=this.b
-y=$.cp().jD(z,a)
-if(!J.xC(b,y)){x=this.a
-w=x.a
-if(w==null){v=[]
-x.a=v
-x=v}else x=w
-x.push(H.VM(new T.qI(z,a,b,y),[null]))
-J.iv(z).u(0,a,y)}},
-$isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
-"^":"",
-Sk:{
-"^":"Pi;",
-gP:function(a){return this.DA},
-sP:function(a,b){this.DA=F.Wi(this,C.Ha,this.DA,b)},
-bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.DA)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
-"^":"",
-wn:{
-"^":"uFU;b3@,iT,ao,AP,fn",
-gQV:function(){var z=this.iT
-if(z==null){z=P.bK(new Q.cj(this),null,!0,null)
-this.iT=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:function(a){return this.ao.length},
-sB:function(a,b){var z,y,x,w,v
-z=this.ao
-y=z.length
-if(y===b)return
-this.ct(this,C.Wn,y,b)
-x=y===0
-w=b===0
-this.ct(this,C.ai,x,w)
-this.ct(this,C.nZ,!x,!w)
-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))
-if(y<b||y>z.length)H.vh(P.TE(y,b,z.length))
-x=new H.bX(z,b,y)
-x.$builtinTypeInfo=[null]
-if(b<0)H.vh(P.N(b))
-if(y<0)H.vh(P.N(y))
-if(b>y)H.vh(P.TE(b,0,y))
-x=x.br(0)
-w=new P.Yp(x)
-w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,0))}else{v=[]
-x=new P.Yp(v)
-x.$builtinTypeInfo=[null]
-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.ao
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-y=z[b]
-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.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
-z=J.x(c)
-if(!z.$isWO&&!0)c=z.br(c)
-y=J.q8(c)
-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.ao
-H.xF(z,b,y)
-this.iH(G.K6(this,b,y,H.q9(z,b,y,null).br(0)))}H.vf(this.ao,b,c)},
-h:function(a,b){var z,y,x,w
-z=this.ao
-y=z.length
-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.iH(G.K6(this,y,1,null))
-C.Nm.h(z,b)},
-FV:function(a,b){var z,y,x,w
-z=this.ao
-y=z.length
-C.Nm.FV(z,b)
-this.On(y,z.length)
-x=z.length-y
-z=this.iT
-if(z!=null){w=z.iE
-z=w==null?z!=null:w!==z}else z=!1
-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.ao.length)H.vh(P.TE(b,0,this.gB(this)))
-y=c>=b
-if(!y||c>this.ao.length)H.vh(P.TE(c,b,this.gB(this)))
-x=c-b
-w=this.ao
-v=w.length
-u=v-x
-this.ct(this,C.Wn,v,u)
-t=v===0
-u=u===0
-this.ct(this,C.ai,t,u)
-this.ct(this,C.nZ,!t,!u)
-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))
-if(!y||c>w.length)H.vh(P.TE(c,b,w.length))
-z=new H.bX(w,b,c)
-z.$builtinTypeInfo=[null]
-if(b<0)H.vh(P.N(b))
-if(c<0)H.vh(P.N(c))
-if(b>c)H.vh(P.TE(b,0,c))
-z=z.br(0)
-y=new P.Yp(z)
-y.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
-UG:function(a,b,c){var z,y,x,w
-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.ao
-x=z.length
-C.Nm.sB(z,x+y)
-w=z.length
-H.qG(z,b+y,w,this,b)
-H.vf(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.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.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.iH(G.K6(this,b,1,null))
-if(b>=z.length)return H.e(z,b)
-z[b]=c},
-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.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.b3
-if(z==null)return!1
-y=G.Qi(this,z)
-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,111],
-$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
-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.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)
-if(s.C(w,0)||s.D(w,a.length))H.vh(P.TE(w,0,a.length))
-r=J.Wx(u)
-if(r.C(u,w)||r.D(u,a.length))H.vh(P.TE(u,w,a.length))
-q=r.W(u,w)
-p=t.gB(t)
-r=J.Wx(q)
-if(r.F(q,p)){o=r.W(q,p)
-n=s.g(w,p)
-s=a.length
-if(typeof o!=="number")return H.s(o)
-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.bI(p,q)
-r=a.length
-if(typeof o!=="number")return H.s(o)
-l=r+o
-n=s.g(w,p)
-C.Nm.sB(a,l)
-H.qG(a,n,l,a,u)
-H.qG(a,w,n,t,0)}}}}},
-uFU:{
-"^":"ark+Pi;",
-$isd3:true},
-cj:{
-"^":"Tp:69;a",
-$0:function(){this.a.iT=null},
-$isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
-"^":"",
-ya:{
-"^":"yj;G3>,jL,zZ,aC,w5",
-bu:function(a){var z
-if(this.aC)z="insert"
-else z=this.w5?"remove":"set"
-return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
-$isya:true},
-qC:{
-"^":"Pi;Zp,AP,fn",
-gvc:function(){return this.Zp.gvc()},
-gUQ:function(a){var z=this.Zp
-return z.gUQ(z)},
-gB:function(a){var z=this.Zp
-return z.gB(z)},
-gl0:function(a){var z=this.Zp
-return z.gB(z)===0},
-gor:function(a){var z=this.Zp
-return z.gB(z)!==0},
-t:function(a,b){return this.Zp.t(0,b)},
-u:function(a,b,c){var z,y,x,w
-z=this.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z){this.Zp.u(0,b,c)
-return}z=this.Zp
-x=z.gB(z)
-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.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.Uq,null,null),[null]))}},
-FV:function(a,b){J.Me(b,new V.zT(this))},
-V1:function(a){var z,y,x,w
-z=this.Zp
-y=z.gB(z)
-x=this.AP
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(x&&y>0){z.aN(0,new V.Lo(this))
-F.Wi(this,C.Wn,y,0)
-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.SV,null,null),[null]))
-this.nq(this,H.VM(new T.qI(this,C.Uq,null,null),[null]))},
-$isqC:true,
-$isZ0:true,
-static:{AB:function(a,b,c){var z
-if(!!a.$isBa)z=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-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:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"qC")}},
-Lo:{
-"^":"Tp:77;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,{
-"^":"",
-Qw:{
-"^":"Ap;TA,xy,i7,at,Cg",
-e5:function(a){return this.xy.$1(a)},
-nM:function(a){return this.at.$1(a)},
-TR:function(a,b){var z
-this.at=b
-z=this.e5(J.mu(this.TA,this.gqy()))
-this.Cg=z
-return z},
-cf:[function(a){var z=this.e5(a)
-if(J.xC(z,this.Cg))return
-this.Cg=z
-return this.nM(z)},"$1","gqy",2,0,13,58],
-S6:function(a){var z=this.TA
-if(z!=null)J.x0(z)
-this.TA=null
-this.xy=null
-this.i7=null
-this.at=null
-this.Cg=null},
-gP:function(a){var z=this.e5(J.Vm(this.TA))
-this.Cg=z
-return z},
-sP:function(a,b){J.ta(this.TA,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
-"^":"",
-Hj:function(a,b){var z,y,x,w,v
-if(a==null)return
-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)))return J.UQ(a,b)}else if(!!J.x(b).$isGD){z=a
-y=H.RB(z,"$isab",[P.qU,null],"$asab")
-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().ep.t(0,b))
-try{z=a
-y=b
-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)).$isJS){z=J.Lm(a)
-v=$.mX().F1(z,C.OV)
-if(!(v!=null&&v.fY===C.WH&&!v.Fo))throw w}else throw w}}z=$.YV()
-if(z.mL(C.D8))z.kS("can't get "+H.d(b)+" in "+H.d(a))
-return},
-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)
-return!0}}else if(!!J.x(b).$isGD){z=a
-y=H.RB(z,"$isab",[P.qU,null],"$asab")
-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().ep.t(0,b),c)
-return!0}try{$.cp().Cq(a,b,c)
-return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.Lm(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.YV()
-if(z.mL(C.D8))z.kS("can't set "+H.d(b)+" in "+H.d(a))
-return!1},
-cB:function(a){a=J.rr(a)
-if(a==="")return!0
-if(0>=a.length)return H.e(a,0)
-if(a[0]===".")return!1
-return $.uC().zD(a)},
-WR:{
-"^":"qK;HS,XF,xE,cX,GX,vA,Wf",
-gqc:function(){return this.HS==null},
-sP:function(a,b){var z=this.HS
-if(z!=null)z.rL(this.XF,b)},
-gIn:function(){return 2},
-TR:function(a,b){return L.qK.prototype.TR.call(this,this,b)},
-NJ:function(){this.xE=L.SE(this,this.XF)
-this.hQ(!0)},
-kH:function(){this.Wf=null
-this.HS=null
-this.XF=null},
-nf:function(a){this.HS.VV(this.XF,a)},
-hQ:function(a){var z,y
-z=this.Wf
-y=this.HS.Tl(this.XF)
-this.Wf=y
-if(a||J.xC(y,z))return!1
-this.zc(this.Wf,z)
-return!0},
-tF:function(){return this.hQ(!1)},
-$isAp:true},
-Tv:{
-"^":"a;OK",
-gB:function(a){return this.OK.length},
-gl0:function(a){return this.OK.length===0},
-gPu:function(){return!0},
-bu:function(a){if(!this.gPu())return"<invalid path>"
-return H.VM(new H.A8(this.OK,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.OK
-y=z.length
-x=b.OK
-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.OK,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
-x=536870911&x+((524287&x)<<10>>>0)
-x^=x>>>6}x=536870911&x+((67108863&x)<<3>>>0)
-x^=x>>>11
-return 536870911&x+((16383&x)<<15>>>0)},
-Tl:function(a){var z,y
-if(!this.gPu())return
-for(z=this.OK,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.Hj(a,y)}return a},
-rL:function(a,b){var z,y,x
-z=this.OK
-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.Hj(a,z[x])}if(y>=z.length)return H.e(z,y)
-return L.iu(a,z[y],b)},
-VV:function(a,b){var z,y,x,w
-if(!this.gPu()||this.OK.length===0)return
-z=this.OK
-y=z.length-1
-for(x=0;a!=null;x=w){b.$1(a)
-if(x>=y)break
-w=x+1
-if(x>=z.length)return H.e(z,x)
-a=L.Hj(a,z[x])}},
-$isTv:true,
-static:{hk:function(a){var z,y,x,w,v,u,t,s
-if(!!J.x(a).$isWO){z=P.F(a,!1,null)
-y=new H.a7(z,z.length,0,null)
-y.$builtinTypeInfo=[H.Kp(z,0)]
-for(;y.G();){x=y.lo
-if((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isGD)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Tv(z)}if(a==null)a=""
-w=$.aB().t(0,a)
-if(w!=null)return w
-if(!L.cB(a))return $.V6()
-v=[]
-y=J.rr(a).split(".")
-u=new H.a7(y,y.length,0,null)
-u.$builtinTypeInfo=[H.Kp(y,0)]
-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().Nz.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
-y=$.aB()
-if(y.X5>=100){y.toString
-u=new P.i5(y)
-u.$builtinTypeInfo=[H.Kp(y,0)]
-s=u.gA(u)
-if(!s.G())H.vh(H.DU())
-y.Rz(0,s.gl())}y.u(0,a,w)
-return w}}},
-oq:{
-"^":"Tp:13;",
-$1:function(a){return},
-$isEH:true},
-f7:{
-"^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isGD?$.b7().ep.t(0,a):a},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-vH:{
-"^":"Tv;OK",
-gPu:function(){return!1},
-static:{"^":"qr"}},
-YJG:{
-"^":"Tp:69;",
-$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},
-ww:{
-"^":"qK;xE,cb,cX,GX,vA,Wf",
-gqc:function(){return this.cb==null},
-gIn:function(){return 3},
-TR:function(a,b){return L.qK.prototype.TR.call(this,this,b)},
-NJ:function(){var z,y,x,w
-this.hQ(!0)
-for(z=this.cb,y=z.length,x=0;x<y;x+=2){w=z[x]
-if(w!==C.dV){z=$.xG
-if(z!=null){y=z.IU
-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.yj.u(0,this.cX,this)
-this.nf(z.gTT(z))
-this.xE=null
-break}}},
-kH:function(){var z,y,x,w
-this.Wf=null
-for(z=0;y=this.cb,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.cb=null},
-yN:function(a,b){var z
-if(this.GX!=null||this.cb==null)throw H.b(P.w("Cannot add paths once started."))
-if(!J.x(b).$isTv)b=L.hk(b)
-z=this.cb
-z.push(a)
-z.push(b)},
-ti:function(a){return this.yN(a,null)},
-nf:function(a){var z,y,x,w,v
-for(z=0;y=this.cb,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").VV(w,a)}}},
-hQ:function(a){var z,y,x,w,v,u,t,s,r
-J.wg(this.Wf,C.jn.cU(this.cb.length,2))
-for(z=!1,y=null,x=0;w=this.cb,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.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.vA
-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.Wf,v))}J.kW(this.Wf,v,r)
-z=!0}if(!z)return!1
-this.Aw(this.Wf,y,w)
-return!0},
-tF:function(){return this.hQ(!1)},
-$isAp:true},
-iNc:{
-"^":"a;"},
-qK:{
-"^":"Ap;cX<",
-CC:function(){return this.GX.$0()},
-K0:function(a){return this.GX.$1(a)},
-cF:function(a,b){return this.GX.$2(a,b)},
-Mm:function(a,b,c){return this.GX.$3(a,b,c)},
-ga8: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.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
-this.GX=b
-this.vA=P.J(this.gIn(),X.RI(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,20,14],
-SG:function(){var z=0
-while(!0){if(!(z<1000&&this.tF()))break;++z}return z>0},
-Aw:function(a,b,c){var z,y,x,w
-try{switch(this.vA){case 0:this.CC()
-break
-case 1:this.K0(a)
-break
-case 2:this.cF(a,b)
-break
-case 3:this.Mm(a,b,c)
-break}}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}},
-zc:function(a,b){return this.Aw(a,b,null)}},
-zG:{
-"^":"a;IU,yj,rS,HN,op",
-TR:function(a,b){this.yj.u(0,b.gcX(),b)
-b.nf(this.gTT(this))},
-we:[function(a,b){var z=J.x(b)
-if(!!z.$iswn)this.wq(b.gQV())
-if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,160,82],
-wq: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.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.op)return
-z=this.HN
-if(z==null)z=P.YM(null,null,null,null,null)
-this.HN=this.rS
-this.rS=z
-for(y=this.yj,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.oz]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
-if(v.ga8())v.nf(this.gTT(this))}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","gTh",0,0,18],
-t9:[function(a){var z,y
-for(z=this.yj,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.ga8())y.tF()}this.op=!0
-P.rb(this.gTh(this))},"$1","gCP",2,0,20,161],
-static:{"^":"xG",SE:function(a,b){var z,y
-z=$.xG
-if(z!=null){y=z.IU
-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.yj.u(0,a.cX,a)
-a.nf(z.gTT(z))}}}}],["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.Qe(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,13,21],
-Qe:{
-"^":"Tp:77;a",
-$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,121,64,"call"],
-$isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
-"^":"",
-YG:function(a,b,c){if(a==null||$.AM()==null)return
-$.AM().V7("shimStyling",[a,b,c])},
-q3:function(a){var z,y,x,w,v
-if(a==null)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.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.XO(v,null)
-$.Es().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw v}},
-M8:[function(a){var z,y
-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","F4",2,0,62,63],
-Ad:function(a,b){$.Ej().u(0,a,b)
-H.Go(J.UQ($.Si(),"Polymer"),"$isr7").PO([a])},
-h6:function(a,b){var z,y,x,w
-if(a==null)return
-document
-if($.op()===!0)b=document.head
-z=document.createElement("style",null)
-J.t3(z,J.dY(a))
-y=a.getAttribute("element")
-if(y!=null)z.setAttribute("element",y)
-x=b.firstChild
-if(b===document.head){w=W.vD(document.head.querySelectorAll("style[element]"),null)
-if(w.gor(w))x=J.QP(C.t5.grZ(w.Sn))}b.insertBefore(z,x)},
-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,y
-if($.AC)throw H.b("Initialization was already done.")
-$.AC=!0
-A.JP()
-$.ok=b
-if(a==null)throw H.b("Missing initialization of polymer elements. Please check that the list of entry points in your pubspec.yaml is correct. If you are using pub-serve, you may need to restart it.")
-A.Ad("d-auto-binding",C.Jm)
-z=document.createElement("polymer-element",null)
-z.setAttribute("name","d-auto-binding")
-z.setAttribute("extends","template")
-J.UQ($.XX(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,74,0,null),[H.Kp(a,0)]);y.G();)y.lo.$0()},
-JP:function(){var z,y,x,w
-z=$.Si()
-if(J.UQ(z,"Platform")==null)throw H.b(P.w("platform.js, dart_support.js must be loaded at the top of your application, before any other scripts or HTML imports that use polymer. Putting these two script tags at the top of your <head> element should address this issue: <script src=\"packages/web_components/platform.js\"></script> and  <script src=\"packages/web_components/dart_support.js\"></script>."))
-y=J.UQ(z,"Polymer")
-if(y==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."))
-x=$.X3
-y.V7("whenPolymerReady",[x.ce(new A.hp())])
-w=J.UQ($.XX(),"register")
-if(w==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
-J.kW($.XX(),"register",P.mt(new A.k2(x,w)))},
-XP:{
-"^":"a;FL>,t5>,P1<,oc>,Q7<,NF<,cK>,kK<,Bj<,Qk,lD,Uj>,PS<,Ve,t4",
-gZf:function(){var z,y
-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},
-Ba:function(a){var z,y,x
-for(z=null,y=this;y!=null;){z=J.Vs(J.nq(y)).MW.getAttribute("extends")
-y=y.gP1()}x=document
-W.Ct(window,x,a,this.t5,z)},
-Cw:function(a){var z=$.Kc()
-if(z==null)return
-J.UQ(z,"urlResolver").V7("resolveDom",[a])},
-Zw:function(a){var z,y,x,w,v,u,t,s,r
-if(a!=null){if(a.gQ7()!=null){z=a.gQ7()
-y=P.L5(null,null,null,null,null)
-y.FV(0,z)
-this.Q7=y}if(a.gBj()!=null){z=a.gBj()
-y=P.Ls(null,null,null,null)
-y.FV(0,z)
-this.Bj=y}}z=this.t5
-this.pI(z)
-x=J.Vs(this.FL).MW.getAttribute("attributes")
-if(x!=null)for(y=C.xB.Fr(x,$.aQ()),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().Nz.t(0,v)
-t=L.hk([u])
-s=this.Q7
-if(s!=null&&s.x4(t))continue
-r=$.mX().CV(z,u)
-if(r==null||r.fY===C.WH||r.V5){window
-s="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
-if(typeof console!="undefined")console.warn(s)
-continue}s=this.Q7
-if(s==null){s=P.Fl(null,null)
-this.Q7=s}s.u(0,t,r)}},
-pI:function(a){var z,y,x,w
-for(z=$.mX().Me(0,a,C.aj),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
-w=this.Q7
-if(w==null){w=P.Fl(null,null)
-this.Q7=w}w.u(0,L.hk([x.goc(y)]),y)
-w=new H.U5(y.gDv(),new A.Zd())
-w.$builtinTypeInfo=[null]
-if(w.Vr(0,new A.Da())){w=this.Bj
-if(w==null){w=P.Ls(null,null,null,null)
-this.Bj=w}x=x.goc(y)
-w.h(0,$.b7().ep.t(0,x))}}},
-Vk:function(){var z,y
-z=P.L5(null,null,null,P.qU,P.a)
-this.kK=z
-y=this.P1
-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.Bg("link[rel=stylesheet]")
-this.Qk=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Mp(z.lo)},
-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.Mp(z.lo)},
-m1:function(){var z,y,x,w,v,u,t,s
-z=this.Qk
-z.toString
-y=H.VM(new H.U5(z,new A.ZG()),[null])
-x=this.gZf()
-if(x!=null){w=P.p9("")
-for(z=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.Kp(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
-t=w.vM+=typeof u==="string"?u:H.d(u)
-w.vM=t+"\n"}if(w.vM.length>0){s=J.Do(this.FL).createElement("style",null)
-J.t3(s,H.d(w))
-z=J.RE(x)
-z.mK(x,s,z.gPZ(x))}}},
-oP: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},
-Bg:function(a){return this.oP(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.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.Mo(J.mY(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.q3(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.Mo(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)
-z.vM=w+"\n\n"}return z.vM},
-J3:function(a,b){var z
-if(a==="")return
-z=document.createElement("style",null)
-J.t3(z,a)
-z.setAttribute("element",H.d(this.oc)+"-"+b)
-return z},
-rH:function(){var z,y,x,w,v
-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.cK==null)this.cK=P.YM(null,null,null,null,null)
-x=J.RE(y)
-w=x.goc(y)
-v=$.b7().ep.t(0,w)
-w=J.U6(v)
-v=w.Nj(v,0,J.bI(w.gB(v),7))
-this.cK.u(0,L.hk(v),[x.goc(y)])}},
-I9: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()
-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.Tj(z))
-return z},
-$isXP:true,
-static:{"^":"Kb"}},
-Zd:{
-"^":"Tp:13;",
-$1:function(a){return!!J.x(a).$ishG},
-$isEH:true},
-Da:{
-"^":"Tp:13;",
-$1:function(a){return a.gvn()},
-$isEH:true},
-eY:{
-"^":"Tp:77;a",
-$2:function(a,b){if(C.n7.x4(a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
-$isEH:true},
-BO:{
-"^":"Tp:77;a",
-$2:function(a,b){var z,y,x
-z=J.rY(a)
-if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
-x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
-$isEH:true},
-ZG:{
-"^":"Tp:13;",
-$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
-$isEH:true},
-ua:{
-"^":"Tp:13;a",
-$1:function(a){return J.RF(a,this.a)},
-$isEH:true},
-ix:{
-"^":"Tp:69;",
-$0:function(){return[]},
-$isEH:true},
-Tj:{
-"^":"Tp:162;a",
-$2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
-$isEH:true},
-Li:{
-"^":"BG9;Mn,cJ",
-US:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
-return this.Mn.US(a,b,c)}},
-BG9:{
-"^":"vE+vA;"},
-vA:{
-"^":"a;",
-XB:function(a){var z
-for(;z=J.RE(a),z.gBy(a)!=null;){if(!!z.$iszs&&J.UQ(a.SD,"eventController")!=null)return J.UQ(z.gXG(a),"eventController")
-a=z.gBy(a)}return!!z.$isI0?a.host:null},
-Y2:function(a,b,c){var z={}
-z.a=a
-return new A.l5(z,this,b,c)},
-CZ:function(a,b,c){var z,y,x,w
-z={}
-y=J.rY(b)
-if(!y.nC(b,"on-"))return
-x=y.yn(b,3)
-z.a=x
-w=C.fE.t(0,x)
-z.a=w!=null?w:z.a
-return new A.li(z,this,a)}},
-l5:{
-"^":"Tp:13;a,b,c,d",
-$1:[function(a){var z,y,x,w
-z=this.a
-y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
-z.a=x
-y=x}if(!!J.x(y).$iszs){y=J.x(a)
-if(!!y.$iseC){w=y.gey(a)
-if(w==null)w=J.UQ(P.Cq(a),"detail")}else w=null
-y=y.gCa(a)
-z=z.a
-J.Pj(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-li:{
-"^":"Tp:166;a,b,c",
-$3:[function(a,b,c){var z,y,x,w
-z=this.c
-y=this.b.Y2(null,b,z)
-x=J.Ei(b).t(0,this.a.a)
-w=H.VM(new W.Ov(0,x.DK,x.Ph,W.aF(y),x.Sg),[H.Kp(x,0)])
-w.Zz()
-if(c===!0)return
-return new A.d6(w,z)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-d6:{
-"^":"Ap;Jq,ED",
-gP:function(a){return"{{ "+this.ED+" }}"},
-TR:function(a,b){return"{{ "+this.ED+" }}"},
-S6:function(a){var z=this.Jq
-if(z!=null){z.ed()
-this.Jq=null}}},
-hG:{
-"^":"nd;vn<",
-$ishG:true},
-xc:{
-"^":"Ao;AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-XI:function(a){this.Pa(a)},
-static:{G7:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ki.ZL(a)
-C.Ki.XI(a)
-return a}}},
-jpR:{
-"^":"Bo+zs;XG:SD=",
-$iszs:true,
-$isvy:true,
-$isd3:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true},
-Ao:{
-"^":"jpR+Pi;",
-$isd3:true},
-zs:{
-"^":"a;XG:SD=",
-gFL:function(a){return a.IX},
-gUj:function(a){return},
-gRT:function(a){var z,y
-z=a.IX
-if(z!=null)return J.O6(z)
-y=this.gQg(a).MW.getAttribute("is")
-return y==null||y===""?this.gqn(a):y},
-Pa:function(a){var z,y
-z=this.gCn(a)
-if(z!=null&&z.k8!=null){window
-y="Attributes on "+H.d(this.gRT(a))+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."
-if(typeof console!="undefined")console.warn(y)}this.es(a)
-y=this.gM0(a)
-if(!J.xC($.AA().t(0,y),!0)||$.op()===!0)this.rf(a)},
-es:function(a){var z,y
-if(a.IX!=null){window
-z="Element already prepared: "+H.d(this.gRT(a))
-if(typeof console!="undefined")console.warn(z)
-return}a.SD=P.Cq(a)
-z=this.gRT(a)
-a.IX=$.RA().t(0,z)
-this.nt(a)
-z=a.Wz
-if(z!=null){y=this.gnu(a)
-z.toString
-L.qK.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gqY(a))
-this.oR(a)
-this.fk(a)
-this.Uc(a)},
-rf:function(a){if(a.q1)return
-a.q1=!0
-this.Oh(a,a.IX)
-this.gQg(a).Rz(0,"unresolved")
-this.aR(a)},
-aR:function(a){},
-Es:function(a){if(a.IX==null)throw H.b(P.w("polymerCreated was not called for custom element "+H.d(this.gRT(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
-this.oW(a)
-if(!a.XN){a.XN=!0
-this.rW(a,new A.bl(a))}},
-dQ:function(a){this.x3(a)},
-Oh:function(a,b){if(b!=null){this.Oh(a,b.gP1())
-this.aI(a,J.nq(b))}},
-aI:function(a,b){var z,y,x,w
-z=J.RE(b)
-y=z.Wk(b,"template")
-if(y!=null){x=this.Tp(a,y)
-w=z.gQg(b).MW.getAttribute("name")
-if(w==null)return
-a.Xy.u(0,w,x)}},
-Tp:function(a,b){var z,y,x,w,v,u
-if(b==null)return
-z=this.er(a)
-y=this.gUj(a)
-x=!!J.x(b).$isvy?b:M.Ky(b)
-w=J.MO(x,a,y==null&&J.Xp(x)==null?J.xq(a.IX):y)
-v=$.It().t(0,w)
-u=v!=null?v.gu2():v
-a.Sa.push(u)
-z.appendChild(w)
-this.Ec(a,z)
-u=$.dg()
-if(u!=null)u.V7("register",[z])
-return z},
-Ec:function(a,b){var z,y,x
-if(b==null)return
-for(z=J.MK(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
-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.IX.gkK().aN(0,new A.Sv(a))},
-fk:function(a){if(a.IX.gNF()==null)return
-this.gQg(a).aN(0,this.ghW(a))},
-D3:[function(a,b,c){var z,y,x,w,v,u
-z=this.B2(a,b)
-if(z==null)return
-if(c==null||J.x5(c,$.iB())===!0)return
-y=J.RE(z)
-x=y.goc(z)
-w=$.cp().jD(a,x)
-v=y.gt5(z)
-x=J.x(v)
-u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.eP))&&w!=null?J.Lm(w):v)
-if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,167],
-B2:function(a,b){var z=a.IX.gNF()
-if(z==null)return
-return z.t(0,b)},
-TW:function(a,b){if(b==null)return
-if(typeof b==="boolean")return b?"":null
-else if(typeof b==="string"||typeof b==="number")return H.d(b)
-return},
-JY:function(a,b){var z,y,x
-z=L.hk(b).Tl(a)
-y=this.TW(a,z)
-if(y!=null)this.gQg(a).MW.setAttribute(b,y)
-else if(typeof z==="boolean"){x=this.gQg(a).MW
-x.getAttribute(b)
-x.removeAttribute(b)}},
-nR:function(a,b,c,d){var z,y,x,w,v,u,t
-z=this.B2(a,b)
-if(z==null)return J.FS(M.Ky(a),b,c,d)
-else{y=J.RE(z)
-x=y.goc(z)
-w=$.QX5()
-if(w.mL(C.eI))w.Ny("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gRT(a))+"].["+H.d(x)+"]")
-w=J.RE(c)
-if(w.gP(c)==null)w.sP(c,$.cp().jD(a,x))
-v=new A.lK(a,x,c,null,null)
-v.Jq=this.gqh(a).yI(v.gXQ())
-w=J.mu(c,v.gap())
-v.dY=w
-$.cp().Cq(a,x,w)
-if($.rK&&!0){if(J.C5(M.Ky(a))==null){x=P.Fl(null,null)
-J.nC(M.Ky(a),x)}J.kW(J.C5(M.Ky(a)),b,v)}u=a.IX.gBj()
-y=y.goc(z)
-t=$.b7().ep.t(0,y)
-if(u!=null&&u.tg(0,t))this.JY(a,t)
-return v}},
-Vz:function(a){return this.rf(a)},
-gCd:function(a){return J.C5(M.Ky(a))},
-sCd:function(a,b){J.nC(M.Ky(a),b)},
-gCn:function(a){return J.fe(M.Ky(a))},
-x3:function(a){var z,y
-if(a.Uk===!0)return
-$.UW().Ny("["+H.d(this.gRT(a))+"] asyncUnbindAll")
-z=a.oq
-y=this.gJg(a)
-if(z==null)z=new A.FT(null,null,null)
-z.t6(0,y,null)
-a.oq=z},
-BM:[function(a){if(a.Uk===!0)return
-H.bQ(a.Sa,this.ghb(a))
-a.Sa=[]
-this.Uq(a)
-a.Uk=!0},"$0","gJg",0,0,18],
-oW:function(a){var z
-if(a.Uk===!0){$.UW().j2("["+H.d(this.gRT(a))+"] already unbound, cannot cancel unbindAll")
-return}$.UW().Ny("["+H.d(this.gRT(a))+"] cancelUnbindAll")
-z=a.oq
-if(z!=null){z.TP(0)
-a.oq=null}},
-nt:function(a){var z,y,x,w,v
-z=J.JR(a.IX)
-if(z!=null){y=$.ps
-$.ps=y+1
-x=new L.ww(null,[],y,null,null,null)
-x.Wf=[]
-a.Wz=x
-a.Sa.push([x])
-for(y=H.VM(new P.fG(z),[H.Kp(z,0)]),w=y.Fb,y=H.VM(new P.EQ(w,w.Ig(),0,null),[H.Kp(y,0)]);y.G();){v=y.fD
-x.yN(a,v)
-this.rJ(a,v,v.Tl(a),null)}}},
-FQ:[function(a,b,c,d){J.Me(c,new A.n1(a,b,c,d,J.JR(a.IX),P.l1(null,null,null,null)))},"$3","gnu",6,0,168],
-hu:[function(a,b){var z,y,x,w,v
-for(z=J.mY(b);z.G();){y=z.gl()
-if(!J.x(y).$isqI)continue
-x=y.oc
-w=$.b7().ep.t(0,x)
-v=a.IX.gBj()
-if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gqY",2,0,169,161],
-rJ:function(a,b,c,d){var z,y,x,w,v
-z=J.JR(a.IX)
-if(z==null)return
-y=z.t(0,b)
-if(y==null)return
-if(!!J.x(d).$iswn){x=$.p2()
-if(x.mL(C.eI))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: unregister "+H.d(b))
-this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.p2()
-if(x.mL(C.eI))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: register "+H.d(b))
-w=c.gQV().w4(!1)
-w.yl(new A.R8(a,d,y))
-w.fm(0,null)
-w.y5(null)
-x=H.d(b)+"__array"
-v=a.q9
-if(v==null){v=P.L5(null,null,null,P.qU,P.Oy)
-a.q9=v}v.u(0,x,w)}},
-dvq:[function(a,b){var z,y
-for(z=J.mY(b);z.G();){y=z.gl()
-if(y!=null)J.x0(y)}},"$1","ghb",2,0,170],
-iQ:function(a,b){var z=a.q9.Rz(0,b)
-if(z==null)return!1
-z.ed()
-return!0},
-Uq:function(a){var z,y
-z=a.q9
-if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
-if(y!=null)y.ed()}a.q9.V1(0)
-a.q9=null},
-Uc:function(a){var z,y
-z=a.IX.gPS()
-if(z.gl0(z))return
-y=$.eS()
-if(y.mL(C.eI))y.Ny("["+H.d(this.gRT(a))+"] addHostListeners: "+z.bu(0))
-z.aN(0,new A.SX(a))},
-ea:function(a,b,c,d){var z,y,x,w
-z=$.eS()
-y=z.mL(C.eI)
-if(y)z.Ny(">>> ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))
-if(!!J.x(c).$isEH){x=X.RI(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().Nz.t(0,c)
-$.cp().Ck(b,w,d,!0,null)}else z.j2("invalid callback")
-if(y)z.To("<<< ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))},
-rW:function(a,b){var z
-P.rb(F.Jy())
-$.Kc().nQ("flush")
-z=window
-C.ma.hr(z)
-return C.ma.oB(z,W.aF(b))},
-SE:function(a,b,c,d,e,f){var z=W.H9(b,!0,!0,e)
-this.H2(a,z)
-return z},
-Tj:function(a,b){return this.SE(a,b,null,null,null,null)},
-$iszs:true,
-$isvy:true,
-$isd3:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true},
-bl:{
-"^":"Tp:13;a",
-$1:[function(a){return},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-Sv:{
-"^":"Tp:77;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:{
-"^":"Tp:69;b",
-$0:function(){return this.b},
-$isEH:true},
-n1:{
-"^":"Tp:77;a,b,c,d,e,f",
-$2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
-z=this.b
-y=J.UQ(z,a)
-x=this.d
-if(typeof a!=="number")return H.s(a)
-w=2*a+1
-if(w>>>0!==w||w>=x.length)return H.e(x,w)
-v=x[w]
-w=this.e
-if(w==null)return
-u=w.t(0,v)
-if(u==null)return
-for(w=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;w.G();){p=w.gl()
-if(!q.h(0,p))continue
-s.rJ(t,v,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,83,57,"call"],
-$isEH:true},
-R8:{
-"^":"Tp:13;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,171,"call"],
-$isEH:true},
-SX:{
-"^":"Tp:77;a",
-$2:function(a,b){var z=this.a
-J.mZ(z,a,J.xq(z.IX).Y2(z,z,b))},
-$isEH:true},
-lK:{
-"^":"Ap;I6,iU,q0,Jq,dY",
-AB:[function(a){this.dY=a
-$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,20,58],
-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().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.ta(this.q0,v)
-return}}},"$1","gXQ",2,0,169,161],
-TR:function(a,b){return J.mu(this.q0,b)},
-gP:function(a){return J.Vm(this.q0)},
-sP:function(a,b){J.ta(this.q0,b)
-return b},
-S6:function(a){var z=this.Jq
-if(z!=null){z.ed()
-this.Jq=null}J.x0(this.q0)}},
-FT:{
-"^":"a;jd,ih,lS",
-Ws:function(){return this.jd.$0()},
-t6:function(a,b,c){var z
-this.TP(0)
-this.jd=b
-z=window
-C.ma.hr(z)
-this.lS=C.ma.oB(z,W.aF(new A.K3(this)))},
-TP:function(a){var z,y
-z=this.lS
-if(z!=null){y=window
-C.ma.hr(y)
-y.cancelAnimationFrame(z)
-this.lS=null}z=this.ih
-if(z!=null){z.ed()
-this.ih=null}}},
-K3:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-if(z.ih!=null||z.lS!=null){z.TP(0)
-z.Ws()}return},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-mS:{
-"^":"Tp:69;",
-$0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-hp:{
-"^":"Tp:69;",
-$0:[function(){var z=$.iF().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:{
-"^":"Tp:174;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,172,56,173,"call"],
-$isEH:true},
-v4:{
-"^":"Tp:69;c,d,e,f",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=this.c
-y=this.d
-x=this.e
-w=this.f
-v=$.Rs()
-u=P.Fl(null,null)
-t=new A.XP(z,x,w,y,null,null,null,null,null,null,null,v,u,null,null)
-$.RA().u(0,y,t)
-t.Zw(w)
-s=t.Q7
-if(s!=null)t.NF=t.Yl(s)
-t.rH()
-t.I9()
-s=J.RE(z)
-r=s.Wk(z,"template")
-if(r!=null)J.Co(!!J.x(r).$isvy?r:M.Ky(r),v)
-t.Mi()
-t.f6()
-t.m1()
-A.h6(t.J3(t.kO("global"),"global"),document.head)
-t.Cw(z)
-t.Vk()
-t.W3(u)
-q=s.gQg(z).MW.getAttribute("assetpath")
-if(q==null)q=""
-p=P.hK(s.gM0(z).baseURI)
-z=P.hK(q)
-o=z.Fi
-if(o!==""){n=z.ku
-m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{if(z.gJf(z)!==""){n=z.ku
-m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{v=z.pO
-if(v===""){k=p.pO
-j=z.tP
-j=j!==""?j:p.tP}else{v=J.co(v,"/")
-u=z.pO
-k=v?p.KO(u):p.KO(p.Ky(p.pO,u))
-j=z.tP}n=p.ku
-m=p.gJf(p)
-l=p.gkb(p)}o=p.Fi}t.t4=P.Wo(z.BJ,m,k,null,l,j,null,o,n)
-z=t.gZf()
-A.YG(z,y,w!=null?J.O6(w):null)
-if($.mX().n6(x,C.MT))$.cp().Ck(x,C.MT,[t],!1,null)
-t.Ba(y)
-return},"$0",null,0,0,null,"call"],
-$isEH:true},
-Md:{
-"^":"Tp:69;",
-$0:function(){var z=J.UQ(P.Cq(document.createElement("polymer-element",null)),"__proto__")
-return!!J.x(z).$isKV?P.Cq(z):z},
-$isEH:true}}],["polymer.auto_binding","package:polymer/auto_binding.dart",,Y,{
-"^":"",
-q6:{
-"^":"wc;Hf,ro,dUC,pt,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gk8:function(a){return J.ZH(a.Hf)},
-gzH:function(a){return J.Xp(a.Hf)},
-szH:function(a,b){J.Co(a.Hf,b)},
-V1:function(a){return J.U2(a.Hf)},
-gUj:function(a){return J.Xp(a.Hf)},
-ZK:function(a,b,c){return J.MO(a.Hf,b,c)},
-dX:function(a){var z
-this.Pa(a)
-a.Hf=M.Ky(a)
-z=T.GF(null,C.qY)
-J.Co(a.Hf,new Y.zp(a,z,null))
-$.iF().MM.ml(new Y.lkK(a))},
-$isDT:true,
-$isvy:true,
-static:{zE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Gkp.ZL(a)
-C.Gkp.dX(a)
-return a}}},
-GLL:{
-"^":"OH+zs;XG:SD=",
-$iszs:true,
-$isvy:true,
-$isd3:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true},
-wc:{
-"^":"GLL+d3;R9:ro%,V2:dUC%,me:pt%",
-$isd3:true},
-lkK:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-z.setAttribute("bind","")
-J.mI(z,new Y.oO(z))},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-oO:{
-"^":"Tp:13;b",
-$1:[function(a){var z,y
-z=this.b
-y=J.RE(z)
-y.Ec(z,z.parentNode)
-y.Tj(z,"template-bound")},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-zp:{
-"^":"Li;dq,Mn,cJ",
-Y2:function(a,b,c){var z={}
-z.a=a
-return new Y.PA(z,this,c)}},
-PA:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){var z,y,x,w,v,u
-z=this.a
-y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.dq
-z.a=x
-y=x}w=J.x(y)
-if(!!w.$iszs){y=J.RE(a)
-w=y.gey(a)
-y=y.gCa(a)
-v=z.a
-u=this.b.dq
-if(v===u)v=J.ZH(u.Hf)
-J.Pj(z.a,v,this.c,[a,w,y])}else throw H.b(P.w("controller "+w.bu(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,1,"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.xr.kV(J.JA(a,"'","\""))
-return y}catch(x){H.Ru(x)
-return a}},
-lP:{
-"^":"Tp:77;",
-$2:function(a,b){return a},
-$isEH:true},
-Uf:{
-"^":"Tp:77;",
-$2:function(a,b){return a},
-$isEH:true},
-Ra:{
-"^":"Tp:77;",
-$2:function(a,b){var z,y
-try{z=P.zu(a)
-return z}catch(y){H.Ru(y)
-return b}},
-$isEH:true},
-wJY:{
-"^":"Tp:77;",
-$2:function(a,b){return!J.xC(a,"false")},
-$isEH:true},
-zOQ:{
-"^":"Tp:77;",
-$2:function(a,b){return H.BU(a,null,new Z.fT(b))},
-$isEH:true},
-fT:{
-"^":"Tp:13;a",
-$1:function(a){return this.a},
-$isEH:true},
-W6o:{
-"^":"Tp:77;",
-$2:function(a,b){return H.RR(a,new Z.Lf(b))},
-$isEH:true},
-Lf:{
-"^":"Tp:13;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.zg(a.gvc(),new T.Fi(a)).zV(0," ")
-else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","v0",2,0,49,64],
-qN:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.kl(a.gvc(),new T.k9(a)).zV(0,";")
-else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Gu",2,0,49,64],
-Fm:[function(a){return a},"$1","m9",2,0,13,65],
-Fi:{
-"^":"Tp:13;a",
-$1:function(a){return J.xC(this.a.t(0,a),!0)},
-$isEH:true},
-k9:{
-"^":"Tp:13;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-QB:{
-"^":"vE;uc,jw,YD,zA,cJ",
-US:function(a,b,c){var z,y,x,w
-z={}
-y=new Y.pa(H.VM([],[Y.qS]),P.p9(""),new P.WU(a,0,0,null),null)
-x=new U.tu()
-x=new T.FX(x,y,null,null)
-y=y.zl()
-x.jQ=y
-x.vi=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)])
-x.Bp()
-w=x.Te()
-if(M.CF(c)){y=J.x(b)
-y=y.n(b,"bind")||y.n(b,"repeat")}else y=!1
-if(y){z=J.x(w)
-if(!!z.$isb4)return new T.H1(this,w.gF5(),z.gkZ(w))
-else return new T.kj(this,w)}z.a=null
-y=!!J.x(c).$ish4
-if(y&&J.xC(b,"class"))z.a=T.v0()
-else if(y&&J.xC(b,"style"))z.a=T.Gu()
-return new T.qb(z,this,w)},
-CE:function(a){var z=this.zA.t(0,a)
-if(z==null)return new T.uK(this,a)
-return new T.Wb(this,a,z)},
-qF:function(a){var z,y,x,w,v
-z=J.RE(a)
-y=z.gBy(a)
-if(y==null)return
-if(M.CF(a)){x=!!z.$isvy?a:M.Ky(a)
-z=J.RE(x)
-w=z.gCn(x)
-v=w==null?z.gk8(x):w.k8
-if(!!J.x(v).$isGK)return v
-else return this.YD.t(0,a)}return this.qF(y)},
-hm:function(a,b){var z,y
-if(a==null)return K.dZ(b,this.jw)
-z=J.x(a)
-if(!!z.$ish4);if(!!J.x(b).$isGK)return b
-y=this.YD
-if(y.t(0,a)!=null){y.t(0,a)
-return y.t(0,a)}else if(z.gBy(a)!=null)return this.b8(z.gBy(a),b)
-else{if(!M.CF(a))throw H.b("expected a template instead of "+H.d(a))
-return this.b8(a,b)}},
-b8:function(a,b){var z,y,x
-if(M.CF(a)){z=!!J.x(a).$isvy?a:M.Ky(a)
-y=J.RE(z)
-if(y.gCn(z)==null)y.gk8(z)
-return this.YD.t(0,a)}else{y=J.RE(a)
-if(y.geT(a)==null){x=this.YD.t(0,a)
-return x!=null?x:K.dZ(b,this.jw)}else return this.b8(y.gBy(a),b)}},
-static:{"^":"DI",GF:function(a,b){var z,y,x
-z=H.VM(new P.qo(null),[K.GK])
-y=H.VM(new P.qo(null),[P.qU])
-x=P.L5(null,null,null,P.qU,P.a)
-x.FV(0,C.va)
-return new T.QB(b,x,z,y,null)}}},
-H1:{
-"^":"Tp:175;b,c,d",
-$3:[function(a,b,c){var z,y
-z=this.b
-z.zA.u(0,b,this.c)
-y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
-z.YD.u(0,b,y)
-z=T.m9()
-return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-kj:{
-"^":"Tp:175;e,f",
-$3:[function(a,b,c){var z,y
-z=this.e
-y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
-z.YD.u(0,b,y)
-if(c===!0)return T.rD(this.f,y,null)
-z=T.m9()
-return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-qb:{
-"^":"Tp:175;a,UI,bK",
-$3:[function(a,b,c){var z,y
-z=this.UI.hm(b,a)
-if(c===!0)return T.rD(this.bK,z,this.a.a)
-y=this.a.a
-if(y==null)y=T.m9()
-return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-uK:{
-"^":"Tp:13;a,b",
-$1:[function(a){var z,y,x
-z=this.a
-y=this.b
-x=z.YD.t(0,y)
-if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.dZ(a,z.jw)}else return z.hm(y,a)},"$1",null,2,0,null,163,"call"],
-$isEH:true},
-Wb:{
-"^":"Tp:13;c,d,e",
-$1:[function(a){var z,y,x,w
-z=this.c
-y=this.d
-x=z.YD.t(0,y)
-w=this.e
-if(x!=null)return x.t1(w,a)
-else return z.qF(y).t1(w,a)},"$1",null,2,0,null,163,"call"],
-$isEH:true},
-tI:{
-"^":"Ap;FT,pk,oF,RU,EU,q5,pU",
-Qv:function(a){return this.pk.$1(a)},
-ZW:function(a){return this.RU.$1(a)},
-LZ:[function(a,b){var z,y
-z=this.pU
-y=this.Qv(a)
-this.pU=y
-if(b!==!0&&this.RU!=null&&!J.xC(z,y))this.ZW(this.pU)},function(a){return this.LZ(a,!1)},"Ro","$2$skipChanges","$1","gTJ",2,3,176,177,64,178],
-gP:function(a){if(this.RU!=null)return this.pU
-return T.rD(this.oF,this.FT,this.pk)},
-sP:function(a,b){var z,y,x,w,v
-try{z=K.jX(this.oF,b,this.FT,!1)
-this.LZ(z,!0)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.oF)+"': "+H.d(y),x)}},
-TR:function(a,b){var z,y,x,w,v
-if(this.RU!=null)throw H.b(P.w("already open"))
-this.RU=b
-x=H.VM(new P.Sw(null,0,0,0),[null])
-x.Eo(null,null)
-w=this.oF.RR(0,new K.rdH(x))
-this.q5=w
-x=w.glr().yI(this.gTJ())
-x.fm(0,new T.Tg(this))
-this.EU=x
-try{x=this.q5
-J.NV(x,new K.Ed(this.FT))
-x.gXr()
-this.LZ(this.q5.gXr(),!0)}catch(v){x=H.Ru(v)
-z=x
-y=new H.XO(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.q5)+"': "+H.d(z),y)}return this.pU},
-S6:function(a){var z,y
-if(this.RU==null)return
-this.EU.ed()
-this.EU=null
-this.RU=null
-z=$.Pk()
-y=this.q5
-z.toString
-J.NV(y,z)
-this.q5=null},
-static:{rD:function(a,b,c){var z,y,x,w,v
-try{z=J.NV(a,new K.GQ(b))
-w=c==null?z:c.$1(z)
-return w}catch(v){w=H.Ru(v)
-y=w
-x=new H.XO(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
-Tg:{
-"^":"Tp:77;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.q5)+"': "+H.d(a),b)},"$2",null,4,0,null,1,143,"call"],
-$isEH:true},
-yy:{
-"^":"a;"}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
-"^":"",
-De:{
-"^":"Sk;vq,DA,AP,fn",
-vb:function(a,b){this.vq.yI(new B.fg(b,this))},
-$asSk:function(a){return[null]},
-static:{zR:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
-z.vb(a,b)
-return z}}},
-fg:{
-"^":"Tp;a,b",
-$1:[function(a){var z=this.b
-z.DA=F.Wi(z,C.Ha,z.DA,a)},"$1",null,2,0,null,83,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
-"^":"",
-jX:function(a,b,c,d){var z,y,x,w,v,u,t
-z=H.VM([],[U.hw])
-for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gkp(a),"|"))break
-z.push(y.gT8(a))
-a=y.gBb(a)}if(!!y.$isfp){x=y.gP(a)
-w=C.x4
-v=!1}else if(!!y.$iszX){w=a.gTf()
-x=a.gJn()
-v=!0}else{if(!!y.$isx9){w=a.gTf()
-x=y.goc(a)}else{if(d)throw H.b(K.zq("Expression is not assignable: "+H.d(a)))
-return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);y.G();){u=y.lo
-J.NV(u,new K.GQ(c))
-if(d)throw H.b(K.zq("filter must implement Transformer to be assignable: "+H.d(u)))
-else return}t=J.NV(w,new K.GQ(c))
-if(t==null)return
-if(v)J.kW(t,J.NV(x,new K.GQ(c)),b)
-else{y=$.b7().Nz.t(0,x)
-$.cp().Cq(t,y,b)}return b},
-dZ:function(a,b){var z,y,x
-z=new K.nk(a)
-if(b==null)y=z
-else{y=P.L5(null,null,null,P.qU,P.a)
-y.FV(0,b)
-x=new K.Ph(z,y)
-if(y.x4("this"))H.vh(K.zq("'this' cannot be used as a variable name."))
-y=x}return y},
-w10:{
-"^":"Tp:77;",
-$2:function(a,b){return J.ew(a,b)},
-$isEH:true},
-w11:{
-"^":"Tp:77;",
-$2:function(a,b){return J.bI(a,b)},
-$isEH:true},
-w12:{
-"^":"Tp:77;",
-$2:function(a,b){return J.vX(a,b)},
-$isEH:true},
-w13:{
-"^":"Tp:77;",
-$2:function(a,b){return J.L9(a,b)},
-$isEH:true},
-w14:{
-"^":"Tp:77;",
-$2:function(a,b){return J.jO(a,b)},
-$isEH:true},
-w15:{
-"^":"Tp:77;",
-$2:function(a,b){return J.xC(a,b)},
-$isEH:true},
-w16:{
-"^":"Tp:77;",
-$2:function(a,b){return!J.xC(a,b)},
-$isEH:true},
-w17:{
-"^":"Tp:77;",
-$2:function(a,b){return a==null?b==null:a===b},
-$isEH:true},
-w18:{
-"^":"Tp:77;",
-$2:function(a,b){return a==null?b!=null:a!==b},
-$isEH:true},
-w19:{
-"^":"Tp:77;",
-$2:function(a,b){return J.z8(a,b)},
-$isEH:true},
-w20:{
-"^":"Tp:77;",
-$2:function(a,b){return J.J5(a,b)},
-$isEH:true},
-w21:{
-"^":"Tp:77;",
-$2:function(a,b){return J.u6(a,b)},
-$isEH:true},
-w22:{
-"^":"Tp:77;",
-$2:function(a,b){return J.Bl(a,b)},
-$isEH:true},
-w23:{
-"^":"Tp:77;",
-$2:function(a,b){return a===!0||b===!0},
-$isEH:true},
-w24:{
-"^":"Tp:77;",
-$2:function(a,b){return a===!0&&b===!0},
-$isEH:true},
-w25:{
-"^":"Tp:77;",
-$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.zq("Filters must be a one-argument function."))},
-$isEH:true},
-Raa:{
-"^":"Tp:13;",
-$1:function(a){return a},
-$isEH:true},
-w0:{
-"^":"Tp:13;",
-$1:function(a){return J.jzo(a)},
-$isEH:true},
-w5:{
-"^":"Tp:13;",
-$1:function(a){return a!==!0},
-$isEH:true},
-GK:{
-"^":"a;",
-u:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
-t1:function(a,b){if(J.xC(a,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
-return new K.PO(this,a,b)},
-$isGK:true,
-$isab:true,
-$asab:function(){return[P.qU,P.a]}},
-nk:{
-"^":"GK;k8>",
-t:function(a,b){var z,y
-if(J.xC(b,"this"))return this.k8
-z=$.b7().Nz.t(0,b)
-y=this.k8
-if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
-y=$.cp().jD(y,z)
-return!!J.x(y).$iscb?B.zR(y,null):y},
-NX:function(a){return!J.xC(a,"this")},
-bu:function(a){return"[model: "+H.d(this.k8)+"]"}},
-PO:{
-"^":"GK;eT>,Z0,P>",
-gk8:function(a){var z=this.eT
-z=z.gk8(z)
-return z},
-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)},
-NX:function(a){if(J.xC(this.Z0,a))return!1
-return this.eT.NX(a)},
-bu:function(a){return this.eT.bu(0)+" > [local: "+H.d(this.Z0)+"]"}},
-Ph:{
-"^":"GK;eT>,Z3<",
-gk8:function(a){return this.eT.k8},
-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)},
-NX:function(a){if(this.Z3.x4(a))return!1
-return!J.xC(a,"this")},
-bu:function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.Kp(z,0)]),"(",")")+"]"}},
-Ay0:{
-"^":"a;NV?,Y4<",
-glr:function(){var z=this.Zj
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gXr:function(){return this.Y4},
-ab:function(a){},
-tf:function(a){var z
-this.Ra(0,a)
-z=this.NV
-if(z!=null)z.tf(a)},
-PK:function(){var z=this.a9
-if(z!=null){z.ed()
-this.a9=null}},
-Ra:function(a,b){var z,y,x
-this.PK()
-z=this.Y4
-this.ab(b)
-y=this.Y4
-if(y==null?z!=null:y!==z){x=this.Zj
-if(x.Gv>=4)H.vh(x.q7())
-x.Iv(y)}},
-bu:function(a){return this.r3.bu(0)},
-$ishw:true},
-Ed:{
-"^":"cfS;qu",
-xn:function(a){a.Ra(0,this.qu)}},
-me:{
-"^":"cfS;",
-xn:function(a){a.PK()},
-static:{"^":"jC"}},
-GQ:{
-"^":"P55;qu",
-W9:function(a){return J.ZH(this.qu)},
-LT:function(a){return a.wz.RR(0,this)},
-fV:function(a){var z,y,x
-z=J.NV(a.gTf(),this)
-if(z==null)return
-y=a.goc(a)
-x=$.b7().Nz.t(0,y)
-return $.cp().jD(z,x)},
-CU:function(a){var z=J.NV(a.gTf(),this)
-if(z==null)return
-return J.UQ(z,J.NV(a.gJn(),this))},
-ZR:function(a){var z,y,x,w,v
-z=J.NV(a.gTf(),this)
-if(z==null)return
-if(a.gre()==null)y=null
-else{x=a.gre()
-w=this.gay()
-x.toString
-y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gSf(a)==null)return H.im(z,y,P.Te(null))
-x=a.gSf(a)
-v=$.b7().Nz.t(0,x)
-return $.cp().Ck(z,v,y,!1,null)},
-oD:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.ghL(),this.gay()),[null,null]).br(0)},
-o0:function(a){var z,y,x
-z=P.Fl(null,null)
-for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=y.lo
-z.u(0,J.NV(J.A6(x),this),J.NV(x.gv4(),this))}return z},
-YV:function(a){return H.vh(P.f("should never be called"))},
-qv:function(a){return J.UQ(this.qu,a.gP(a))},
-ex:function(a){var z,y,x,w,v
-z=a.gkp(a)
-y=J.NV(a.gBb(a),this)
-x=J.NV(a.gT8(a),this)
-w=$.Rab().t(0,z)
-v=J.x(z)
-if(v.n(z,"&&")||v.n(z,"||")){v=y==null?!1:y
-return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
-else if(y==null||x==null)return
-return w.$2(y,x)},
-Hx:function(a){var z,y
-z=J.NV(a.gwz(),this)
-y=$.qL().t(0,a.gkp(a))
-if(J.xC(a.gkp(a),"!"))return y.$1(z==null?!1:z)
-return z==null?null:y.$1(z)},
-RD:function(a){return J.xC(J.NV(a.gdc(),this),!0)?J.NV(a.gSl(),this):J.NV(a.gru(),this)},
-kz:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
-xt:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
-rdH:{
-"^":"P55;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)},
-fV:function(a){var z,y
-z=J.NV(a.gTf(),this)
-y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(y)
-return y},
-CU:function(a){var z,y,x
-z=J.NV(a.gTf(),this)
-y=J.NV(a.gJn(),this)
-x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(x)
-y.sNV(x)
-return x},
-ZR:function(a){var z,y,x,w,v
-z=J.NV(a.gTf(),this)
-if(a.gre()==null)y=null
-else{x=a.gre()
-w=this.gay()
-x.toString
-y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.c3(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(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.A8(a.ghL(),this.gay()),[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))
-return y},
-o0:function(a){var z,y
-z=H.VM(new H.A8(a.gRl(a),this.gay()),[null,null]).tt(0,!1)
-y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.B8(y))
-return y},
-YV:function(a){var z,y,x
-z=J.NV(a.gG3(a),this)
-y=J.NV(a.gv4(),this)
-x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(x)
-y.sNV(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.NV(a.gBb(a),this)
-y=J.NV(a.gT8(a),this)
-x=new K.kyp(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(x)
-y.sNV(x)
-return x},
-Hx:function(a){var z,y
-z=J.NV(a.gwz(),this)
-y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(y)
-return y},
-RD:function(a){var z,y,x,w
-z=J.NV(a.gdc(),this)
-y=J.NV(a.gSl(),this)
-x=J.NV(a.gru(),this)
-w=new K.WW(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(w)
-y.sNV(w)
-x.sNV(w)
-return w},
-kz:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
-xt:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
-zD:{
-"^":"Tp:13;a",
-$1:function(a){var z=this.a
-a.sNV(z)
-return z},
-$isEH:true},
-XV:{
-"^":"Tp:13;a",
-$1:function(a){var z=this.a
-a.sNV(z)
-return z},
-$isEH:true},
-B8:{
-"^":"Tp:13;a",
-$1:function(a){var z=this.a
-a.sNV(z)
-return z},
-$isEH:true},
-uD:{
-"^":"Ay0;r3,NV,a9,Y4,Zj",
-ab:function(a){this.Y4=J.ZH(a)},
-RR:function(a,b){return b.W9(this)},
-$asAy0:function(){return[U.EO]},
-$isEO:true,
-$ishw:true},
-z0:{
-"^":"Ay0;r3,NV,a9,Y4,Zj",
-gP:function(a){var z=this.r3
-return z.gP(z)},
-ab:function(a){var z=this.r3
-this.Y4=z.gP(z)},
-RR:function(a,b){return b.oD(this)},
-$asAy0:function(){return[U.no]},
-$asno:function(){return[null]},
-$isno:true,
-$ishw:true},
-kL:{
-"^":"Ay0;hL<,r3,NV,a9,Y4,Zj",
-ab:function(a){this.Y4=H.VM(new H.A8(this.hL,new K.Hv()),[null,null]).br(0)},
-RR:function(a,b){return b.Zh(this)},
-$asAy0:function(){return[U.c0]},
-$isc0:true,
-$ishw:true},
-Hv:{
-"^":"Tp:13;",
-$1:[function(a){return a.gY4()},"$1",null,2,0,null,83,"call"],
-$isEH:true},
-ev:{
-"^":"Ay0;Rl>,r3,NV,a9,Y4,Zj",
-ab:function(a){this.Y4=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Ku())},
-RR:function(a,b){return b.o0(this)},
-$asAy0:function(){return[U.Qb]},
-$isQb:true,
-$ishw:true},
-Ku:{
-"^":"Tp:77;",
-$2:function(a,b){J.kW(a,J.A6(b).gY4(),b.gv4().gY4())
-return a},
-$isEH:true},
-qR:{
-"^":"Ay0;G3>,v4<,r3,NV,a9,Y4,Zj",
-RR:function(a,b){return b.YV(this)},
-$asAy0:function(){return[U.ae]},
-$isae:true,
-$ishw:true},
-ek:{
-"^":"Ay0;r3,NV,a9,Y4,Zj",
-gP:function(a){var z=this.r3
-return z.gP(z)},
-ab:function(a){var z,y,x,w
-z=this.r3
-y=J.U6(a)
-this.Y4=y.t(a,z.gP(z))
-if(!a.NX(z.gP(z)))return
-x=y.gk8(a)
-y=J.x(x)
-if(!y.$isd3)return
-z=z.gP(z)
-w=$.b7().Nz.t(0,z)
-this.a9=y.gqh(x).yI(new K.j9(this,a,w))},
-RR:function(a,b){return b.qv(this)},
-$asAy0:function(){return[U.fp]},
-$isfp:true,
-$ishw:true},
-j9:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-GC:{
-"^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-mv:{
-"^":"Ay0;wz<,r3,NV,a9,Y4,Zj",
-gkp:function(a){var z=this.r3
-return z.gkp(z)},
-ab:function(a){var z,y
-z=this.r3
-y=$.qL().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"!")){z=this.wz.gY4()
-this.Y4=y.$1(z==null?!1:z)}else{z=this.wz
-this.Y4=z.gY4()==null?null:y.$1(z.gY4())}},
-RR:function(a,b){return b.Hx(this)},
-$asAy0:function(){return[U.cJ]},
-$iscJ:true,
-$ishw:true},
-kyp:{
-"^":"Ay0;Bb>,T8>,r3,NV,a9,Y4,Zj",
-gkp:function(a){var z=this.r3
-return z.gkp(z)},
-ab:function(a){var z,y,x
-z=this.r3
-y=$.Rab().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"&&")||J.xC(z.gkp(z),"||")){z=this.Bb.gY4()
-if(z==null)z=!1
-x=this.T8.gY4()
-this.Y4=y.$2(z,x==null?!1:x)}else if(J.xC(z.gkp(z),"==")||J.xC(z.gkp(z),"!="))this.Y4=y.$2(this.Bb.gY4(),this.T8.gY4())
-else{x=this.Bb
-if(x.gY4()==null||this.T8.gY4()==null)this.Y4=null
-else{if(J.xC(z.gkp(z),"|")&&!!J.x(x.gY4()).$iswn)this.a9=H.Go(x.gY4(),"$iswn").gQV().yI(new K.P8(this,a))
-this.Y4=y.$2(x.gY4(),this.T8.gY4())}}},
-RR:function(a,b){return b.ex(this)},
-$asAy0:function(){return[U.uku]},
-$isuku:true,
-$ishw:true},
-P8:{
-"^":"Tp:13;a,b",
-$1:[function(a){return this.a.tf(this.b)},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-WW:{
-"^":"Ay0;dc<,Sl<,ru<,r3,NV,a9,Y4,Zj",
-ab:function(a){var z=this.dc.gY4()
-this.Y4=(z==null?!1:z)===!0?this.Sl.gY4():this.ru.gY4()},
-RR:function(a,b){return b.RD(this)},
-$asAy0:function(){return[U.mc]},
-$ismc:true,
-$ishw:true},
-vl:{
-"^":"Ay0;Tf<,r3,NV,a9,Y4,Zj",
-goc:function(a){var z=this.r3
-return z.goc(z)},
-ab:function(a){var z,y,x
-z=this.Tf.gY4()
-if(z==null){this.Y4=null
-return}y=this.r3
-y=y.goc(y)
-x=$.b7().Nz.t(0,y)
-this.Y4=$.cp().jD(z,x)
-y=J.x(z)
-if(!!y.$isd3)this.a9=y.gqh(z).yI(new K.fk(this,a,x))},
-RR:function(a,b){return b.fV(this)},
-$asAy0:function(){return[U.x9]},
-$isx9:true,
-$ishw:true},
-fk:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-WKb:{
-"^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-iT:{
-"^":"Ay0;Tf<,Jn<,r3,NV,a9,Y4,Zj",
-ab:function(a){var z,y,x
-z=this.Tf.gY4()
-if(z==null){this.Y4=null
-return}y=this.Jn.gY4()
-x=J.U6(z)
-this.Y4=x.t(z,y)
-if(!!x.$iswn)this.a9=z.gQV().yI(new K.tE(this,a,y))
-else if(!!x.$isd3)this.a9=x.gqh(z).yI(new K.na(this,a,y))},
-RR:function(a,b){return b.CU(this)},
-$asAy0:function(){return[U.zX]},
-$iszX:true,
-$ishw:true},
-tE:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GST(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-GST:{
-"^":"Tp:13;d",
-$1:[function(a){return a.XP(this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-na:{
-"^":"Tp:13;e,f,UI",
-$1:[function(a){if(J.VA(a,new K.zw(this.UI))===!0)this.e.tf(this.f)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-zw:{
-"^":"Tp:13;bK",
-$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-c3:{
-"^":"Ay0;Tf<,re<,r3,NV,a9,Y4,Zj",
-gSf:function(a){var z=this.r3
-return z.gSf(z)},
-ab:function(a){var z,y,x,w
-z=this.re
-z.toString
-y=H.VM(new H.A8(z,new K.Xh()),[null,null]).br(0)
-x=this.Tf.gY4()
-if(x==null){this.Y4=null
-return}z=this.r3
-if(z.gSf(z)==null){z=H.im(x,y,P.Te(null))
-this.Y4=!!J.x(z).$iscb?B.zR(z,null):z}else{z=z.gSf(z)
-w=$.b7().Nz.t(0,z)
-this.Y4=$.cp().Ck(x,w,y,!1,null)
-z=J.x(x)
-if(!!z.$isd3)this.a9=z.gqh(x).yI(new K.BGc(this,a,w))}},
-RR:function(a,b){return b.ZR(this)},
-$asAy0:function(){return[U.Nb]},
-$isNb:true,
-$ishw:true},
-Xh:{
-"^":"Tp:13;",
-$1:[function(a){return a.gY4()},"$1",null,2,0,null,46,"call"],
-$isEH:true},
-BGc:{
-"^":"Tp:179;a,b,c",
-$1:[function(a){if(J.VA(a,new K.vk(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-vk:{
-"^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-nD:{
-"^":"a;G1>",
-bu:function(a){return"EvalException: "+this.G1},
-static:{zq:function(a){return new K.nD(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
-"^":"",
-Pu:function(a,b){var z,y
-if(a==null?b==null:a===b)return!0
-if(a==null||b==null)return!1
-if(a.length!==b.length)return!1
-for(z=0;z<a.length;++z){y=a[z]
-if(z>=b.length)return H.e(b,z)
-if(!J.xC(y,b[z]))return!1}return!0},
-b1:function(a){a.toString
-return U.Le(H.n3(a,0,new U.xs()))},
-C0C: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},
-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)},
-tu:{
-"^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,180,1,46]},
-hw:{
-"^":"a;",
-$ishw:true},
-EO:{
-"^":"hw;",
-RR:function(a,b){return b.W9(this)},
-$isEO:true},
-no:{
-"^":"hw;P>",
-RR:function(a,b){return b.oD(this)},
-bu:function(a){var z=this.P
-return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},
-n:function(a,b){var z
-if(b==null)return!1
-z=H.RB(b,"$isno",[H.Kp(this,0)],"$asno")
-return z&&J.xC(J.Vm(b),this.P)},
-giO:function(a){return J.v1(this.P)},
-$isno:true},
-c0:{
-"^":"hw;hL<",
-RR:function(a,b){return b.Zh(this)},
-bu:function(a){return H.d(this.hL)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isc0&&U.Pu(b.ghL(),this.hL)},
-giO:function(a){return U.b1(this.hL)},
-$isc0:true},
-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.$isQb&&U.Pu(z.gRl(b),this.Rl)},
-giO:function(a){return U.b1(this.Rl)},
-$isQb:true},
-ae:{
-"^":"hw;G3>,v4<",
-RR:function(a,b){return b.YV(this)},
-bu:function(a){return this.G3.bu(0)+": "+H.d(this.v4)},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isae&&J.xC(z.gG3(b),this.G3)&&J.xC(b.gv4(),this.v4)},
-giO:function(a){var z,y
-z=J.v1(this.G3.P)
-y=J.v1(this.v4)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$isae:true},
-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).$isXC&&J.xC(b.wz,this.wz)},
-giO:function(a){return J.v1(this.wz)},
-$isXC:true},
-fp:{
-"^":"hw;P>",
-RR:function(a,b){return b.qv(this)},
-bu:function(a){return this.P},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isfp&&J.xC(z.gP(b),this.P)},
-giO:function(a){return J.v1(this.P)},
-$isfp:true},
-cJ:{
-"^":"hw;kp>,wz<",
-RR:function(a,b){return b.Hx(this)},
-bu:function(a){return H.d(this.kp)+" "+H.d(this.wz)},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$iscJ&&J.xC(z.gkp(b),this.kp)&&J.xC(b.gwz(),this.wz)},
-giO:function(a){var z,y
-z=J.v1(this.kp)
-y=J.v1(this.wz)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$iscJ:true},
-uku:{
-"^":"hw;kp>,Bb>,T8>",
-RR:function(a,b){return b.ex(this)},
-bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isuku&&J.xC(z.gkp(b),this.kp)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
-giO:function(a){var z,y,x
-z=J.v1(this.kp)
-y=J.v1(this.Bb)
-x=J.v1(this.T8)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$isuku:true},
-mc:{
-"^":"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).$ismc&&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.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$ismc:true},
-K9:{
-"^":"hw;Bb>,T8>",
-RR:function(a,b){return b.kz(this)},
-gF5:function(){var z=this.Bb
-return z.gP(z)},
-gkZ:function(a){return this.T8},
-bu:function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isK9&&b.Bb.n(0,this.Bb)&&J.xC(b.T8,this.T8)},
-giO:function(a){var z,y
-z=this.Bb
-z=z.giO(z)
-y=J.v1(this.T8)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$isK9:true,
-$isb4:true},
-px:{
-"^":"hw;Bb>,T8>",
-RR:function(a,b){return b.xt(this)},
-gF5:function(){var z=this.T8
-return z.gP(z)},
-gkZ:function(a){return this.Bb},
-bu:function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$ispx&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
-giO:function(a){var z,y
-z=J.v1(this.Bb)
-y=this.T8
-y=y.giO(y)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$ispx:true,
-$isb4:true},
-zX:{
-"^":"hw;Tf<,Jn<",
-RR:function(a,b){return b.CU(this)},
-bu:function(a){return H.d(this.Tf)+"["+H.d(this.Jn)+"]"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iszX&&J.xC(b.gTf(),this.Tf)&&J.xC(b.gJn(),this.Jn)},
-giO:function(a){var z,y
-z=J.v1(this.Tf)
-y=J.v1(this.Jn)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$iszX:true},
-x9:{
-"^":"hw;Tf<,oc>",
-RR:function(a,b){return b.fV(this)},
-bu:function(a){return H.d(this.Tf)+"."+H.d(this.oc)},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isx9&&J.xC(b.gTf(),this.Tf)&&J.xC(z.goc(b),this.oc)},
-giO:function(a){var z,y
-z=J.v1(this.Tf)
-y=J.v1(this.oc)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$isx9:true},
-Nb:{
-"^":"hw;Tf<,Sf>,re<",
-RR:function(a,b){return b.ZR(this)},
-bu:function(a){return H.d(this.Tf)+"."+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.$isNb&&J.xC(b.gTf(),this.Tf)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
-giO:function(a){var z,y,x
-z=J.v1(this.Tf)
-y=J.v1(this.Sf)
-x=U.b1(this.re)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$isNb:true},
-xs:{
-"^":"Tp:77;",
-$2:function(a,b){return U.C0C(a,J.v1(b))},
-$isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
-"^":"",
-FX:{
-"^":"a;rp,Yf,jQ,vi",
-gQi:function(){return this.vi.lo},
-lx: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.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
-this.vi.G()},
-Bp:function(){return this.lx(null,null)},
-GI:function(a){return this.lx(a,null)},
-Te:function(){if(this.vi.lo==null){this.rp.toString
-return C.x4}var z=this.Yq()
-return z==null?null:this.G5(z,0)},
-G5: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.rD()
-this.rp.toString
-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))if(J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
-this.Bp()
-w=this.Te()
-this.rp.toString
-a=new U.K9(a,w)}else if(J.xC(J.Vm(this.vi.lo),"as")){this.Bp()
-w=this.Te()
-if(!J.x(w).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
-this.rp.toString
-a=new U.px(a,w)}else break
-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.lx(8,"?")
-v=this.Te()
-this.GI(5)
-u=this.Te()
-this.rp.toString
-a=new U.mc(a,v,u)}else a=this.T1(a)
-else break}return a},
-j6:function(a,b){var z,y
-z=J.x(b)
-if(!!z.$isfp){z=z.gP(b)
-this.rp.toString
-return new U.x9(a,z)}else if(!!z.$isNb&&!!J.x(b.gTf()).$isfp){z=J.Vm(b.gTf())
-y=b.gre()
-this.rp.toString
-return new U.Nb(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-T1:function(a){var z,y,x,w,v
-z=this.vi.lo
-y=J.RE(z)
-if(!C.Nm.tg(C.fW,y.gP(z)))throw H.b(Y.RV("unknown operator: "+H.d(y.gP(z))))
-this.Bp()
-x=this.Yq()
-while(!0){w=this.vi.lo
-if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.vi.lo),3)||J.xC(J.Iz(this.vi.lo),9)){w=this.vi.lo.gP9()
-v=z.gP9()
-if(typeof w!=="number")return w.D()
-if(typeof v!=="number")return H.s(v)
-v=w>v
-w=v}else w=!1
-else w=!1
-if(!w)break
-x=this.G5(x,this.vi.lo.gP9())}y=y.gP(z)
-this.rp.toString
-return new U.uku(y,a,x)},
-Yq:function(){var z,y,x,w
-if(J.xC(J.Iz(this.vi.lo),8)){z=J.Vm(this.vi.lo)
-y=J.x(z)
-if(y.n(z,"+")||y.n(z,"-")){this.Bp()
-if(J.xC(J.Iz(this.vi.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.vi.lo)),null,null)
-this.rp.toString
-z=new U.no(y)
-z.$builtinTypeInfo=[null]
-this.Bp()
-return z}else{y=this.rp
-if(J.xC(J.Iz(this.vi.lo),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.vi.lo)),null)
-y.toString
-z=new U.no(x)
-z.$builtinTypeInfo=[null]
-this.Bp()
-return z}else{w=this.G5(this.LL(),11)
-y.toString
-return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
-w=this.G5(this.LL(),11)
-this.rp.toString
-return new U.cJ(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LL()},
-LL:function(){var z,y
-switch(J.Iz(this.vi.lo)){case 10:z=J.Vm(this.vi.lo)
-if(J.xC(z,"this")){this.Bp()
-this.rp.toString
-return new U.fp("this")}else if(C.Nm.tg(C.oP,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
-throw H.b(Y.RV("unrecognized keyword: "+H.d(z)))
-case 2:return this.jf()
-case 1:return this.ef()
-case 6:return this.DS()
-case 7:return this.Xk()
-case 9:if(J.xC(J.Vm(this.vi.lo),"(")){this.Bp()
-y=this.Te()
-this.lx(9,")")
-this.rp.toString
-return new U.XC(y)}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(Y.RV("unexpected token \":\""))
-default:return}},
-S9:function(){var z,y
-z=[]
-do{this.Bp()
-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.lx(9,"]")
-return new U.c0(z)},
-pH:function(){var z,y,x
-z=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"}"))break
-y=J.Vm(this.vi.lo)
-this.rp.toString
-x=new U.no(y)
-x.$builtinTypeInfo=[null]
-this.Bp()
-this.lx(5,":")
-z.push(new U.ae(x,this.Te()))
-y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"}")
-return new U.Qb(z)},
-jf:function(){var z,y,x
-if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(!0),[null])}if(J.xC(J.Vm(this.vi.lo),"false")){this.Bp()
-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.RV("expected identifier: "+H.d(this.gQi())+".value"))
-z=J.Vm(this.vi.lo)
-this.Bp()
-this.rp.toString
-y=new U.fp(z)
-x=this.rD()
-if(x==null)return y
-else return new U.Nb(y,null,x)},
-rD: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=[]
-do{this.Bp()
-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.lx(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.lx(9,"]")
-return y}return},
-ef:function(){var z,y
-z=J.Vm(this.vi.lo)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
-this.Bp()
-return y},
-Bu: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.Bu("")},
-u3:function(a){var z,y
-z=H.RR(H.d(a)+H.d(J.Vm(this.vi.lo)),null)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
-this.Bp()
-return y},
-Xk:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
-"^":"",
-RS:[function(a){return H.VM(new K.Bt(a),[null])},"$1","y8",2,0,66,67],
-Aep:{
-"^":"a;vH>,P>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isAep&&J.xC(b.vH,this.vH)&&J.xC(b.P,this.P)},
-giO:function(a){return J.v1(this.P)},
-bu:function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},
-$isAep:true},
-Bt:{
-"^":"mW;YR",
-gA:function(a){var z=new K.vR(J.mY(this.YR),0,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-gB:function(a){return J.q8(this.YR)},
-gl0:function(a){return J.FN(this.YR)},
-grZ:function(a){var z,y
-z=this.YR
-y=J.U6(z)
-z=new K.Aep(J.bI(y.gB(z),1),y.grZ(z))
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-$asmW:function(a){return[[K.Aep,a]]},
-$asQV:function(a){return[[K.Aep,a]]}},
-vR:{
-"^":"Dk;WS,wX,CD",
-gl:function(){return this.CD},
-G:function(){var z=this.WS
-if(z.G()){this.CD=H.VM(new K.Aep(this.wX++,z.gl()),[null])
-return!0}this.CD=null
-return!1},
-$asDk:function(a){return[[K.Aep,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
-"^":"",
-wX:function(a){switch(a){case 102:return 12
-case 110:return 10
-case 114:return 13
-case 116:return 9
-case 118:return 11
-default:return a}},
-qS:{
-"^":"a;fY>,P>,P9<",
-bu:function(a){return"("+this.fY+", '"+this.P+"')"},
-$isqS:true},
-pa:{
-"^":"a;MV,zy,jI,x0",
-zl:function(){var z,y,x,w,v,u,t,s
-z=this.jI
-this.x0=z.G()?z.Wn:null
-for(y=this.MV;x=this.x0,x!=null;)if(x===32||x===9||x===160)this.x0=z.G()?z.Wn:null
-else if(x===34||x===39)this.WG()
-else{if(typeof x!=="number")return H.s(x)
-if(!(97<=x&&x<=122))w=65<=x&&x<=90||x===95||x===36||x>127
-else w=!0
-if(w)this.zI()
-else if(48<=x&&x<=57)this.jj()
-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.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])
-if(C.Nm.tg(C.G8,u)){x=z.G()?z.Wn:null
-this.x0=x
-if(x===61)x=v===33||v===61
-else x=!1
-if(x){t=u+"="
-this.x0=z.G()?z.Wn:null}else t=u}else t=H.Lw(v)}else t=H.Lw(v)
-y.push(new Y.qS(8,t,C.lx.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.Lw(this.x0)
-y.push(new Y.qS(9,s,C.lx.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
-z=this.x0
-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.RV("unterminated string"))
-if(x===92){x=y.G()?y.Wn:null
-this.x0=x
-if(x==null)throw H.b(Y.RV("unterminated string"))
-x=H.Lw(Y.wX(x))
-w.vM+=x}else{x=H.Lw(x)
-w.vM+=x}x=y.G()?y.Wn:null
-this.x0=x}this.MV.push(new Y.qS(1,w.vM,0))
-w.vM=""
-this.x0=y.G()?y.Wn:null},
-zI:function(){var z,y,x,w,v
-z=this.jI
-y=this.zy
-while(!0){x=this.x0
-if(x!=null){if(typeof x!=="number")return H.s(x)
-if(!(97<=x&&x<=122))if(!(65<=x&&x<=90))w=48<=x&&x<=57||x===95||x===36||x>127
-else w=!0
-else w=!0}else w=!1
-if(!w)break
-x=H.Lw(x)
-y.vM+=x
-this.x0=z.G()?z.Wn:null}v=y.vM
-z=this.MV
-if(C.Nm.tg(C.oP,v))z.push(new Y.qS(10,v,0))
-else z.push(new Y.qS(2,v,0))
-y.vM=""},
-jj:function(){var z,y,x,w
-z=this.jI
-y=this.zy
-while(!0){x=this.x0
-if(x!=null){if(typeof x!=="number")return H.s(x)
-w=48<=x&&x<=57}else w=!1
-if(!w)break
-x=H.Lw(x)
-y.vM+=x
-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.oz()
-else this.MV.push(new Y.qS(3,".",11))}else{this.MV.push(new Y.qS(6,y.vM,0))
-y.vM=""}},
-oz:function(){var z,y,x,w
-z=this.zy
-z.KF(H.Lw(46))
-y=this.jI
-while(!0){x=this.x0
-if(x!=null){if(typeof x!=="number")return H.s(x)
-w=48<=x&&x<=57}else w=!1
-if(!w)break
-x=H.Lw(x)
-z.vM+=x
-this.x0=y.G()?y.Wn:null}this.MV.push(new Y.qS(7,z.vM,0))
-z.vM=""}},
-hA:{
-"^":"a;G1>",
-bu:function(a){return"ParseException: "+this.G1},
-static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
-"^":"",
-P55:{
-"^":"a;",
-DV:[function(a){return J.NV(a,this)},"$1","gay",2,0,181,143]},
-cfS:{
-"^":"P55;",
-xn:function(a){},
-W9:function(a){this.xn(a)},
-LT:function(a){a.wz.RR(0,this)
-this.xn(a)},
-fV:function(a){J.NV(a.gTf(),this)
-this.xn(a)},
-CU:function(a){J.NV(a.gTf(),this)
-J.NV(a.gJn(),this)
-this.xn(a)},
-ZR:function(a){var z
-J.NV(a.gTf(),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.NV(z.lo,this)
-this.xn(a)},
-oD:function(a){this.xn(a)},
-Zh:function(a){var z
-for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.NV(z.lo,this)
-this.xn(a)},
-o0:function(a){var z
-for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.NV(z.lo,this)
-this.xn(a)},
-YV:function(a){J.NV(a.gG3(a),this)
-J.NV(a.gv4(),this)
-this.xn(a)},
-qv:function(a){this.xn(a)},
-ex:function(a){J.NV(a.gBb(a),this)
-J.NV(a.gT8(a),this)
-this.xn(a)},
-Hx:function(a){J.NV(a.gwz(),this)
-this.xn(a)},
-RD:function(a){J.NV(a.gdc(),this)
-J.NV(a.gSl(),this)
-J.NV(a.gru(),this)
-this.xn(a)},
-kz:function(a){a.Bb.RR(0,this)
-a.T8.RR(0,this)
-this.xn(a)},
-xt:function(a){a.Bb.RR(0,this)
-a.T8.RR(0,this)
-this.xn(a)}}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
-"^":"",
-ov:{
-"^":"V42;oX,GR,cI,Bi=,xo,ZJ,Kf,Oq,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gIs:function(a){return a.oX},
-sIs:function(a,b){a.oX=this.ct(a,C.PX,a.oX,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},
-sMl:function(a,b){a.cI=this.ct(a,C.Gr,a.cI,b)},
-gxT:function(a){return a.xo},
-sxT:function(a,b){a.xo=this.ct(a,C.nt,a.xo,b)},
-giZ:function(a){return a.ZJ},
-siZ:function(a,b){a.ZJ=this.ct(a,C.vs,a.ZJ,b)},
-gGd:function(a){return a.Kf},
-sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-Es:function(a){Z.uL.prototype.Es.call(this,a)},
-rh:[function(a,b){this.mC(a)},"$1","grO",2,0,20,57],
-fX:[function(a,b){this.mC(a)},"$1","gIF",2,0,20,57],
-rA:[function(a,b){this.mC(a)},"$1","gP3",2,0,20,57],
-DJ:[function(a,b){if(b==null)return"min-width:32px;"
-else if(J.xC(b,0))return"min-width:32px; background-color:red"
-return"min-width:32px; background-color:green"},"$1","gfq",2,0,15,182],
-mC:function(a){var z,y,x
-if(a.Oq!=null)return
-if(J.iS(a.oX)!==!0){a.Oq=J.SK(a.oX).ml(new T.FW(a))
-return}z=a.GR
-z=z!=null?J.bI(a.oX.q6(z),1):0
-a.xo=this.ct(a,C.nt,a.xo,z)
-z=a.cI
-y=a.oX
-z=z!=null?y.q6(z):J.q8(J.de(y))
-a.ZJ=this.ct(a,C.vs,a.ZJ,z)
-z=a.Bi
-z.V1(z)
-for(x=a.xo;y=J.Wx(x),y.C(x,a.ZJ);x=y.g(x,1))z.h(0,x)},
-static:{"^":"bN,MRW,VnP",T5i:function(a){var z,y,x,w
-z=Q.ch(null,P.KN)
-y=R.tB([])
-x=P.L5(null,null,null,P.qU,W.I0)
-w=P.qU
-w=H.VM(new V.qC(P.YM(null,null,null,w,null),null,null),[w,null])
-a.Bi=z
-a.Kf=y
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=x
-a.ZQ=w
-C.Fa.ZL(a)
-C.Fa.XI(a)
-return a}}},
-V42:{
-"^":"uL+Pi;",
-$isd3:true},
-FW:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0){z.Oq=null
-J.TG(z)}},"$1",null,2,0,null,14,"call"],
-$isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
-"^":"",
-kn:{
-"^":"oEY;jJ,AP,fn,tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.gdN()},
-fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,20,57],
-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,20,14],
-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.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.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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.jJ=-1
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Yj.ZL(a)
-C.Yj.XI(a)
-return a}}},
-oEY:{
-"^":"xI+Pi;",
-$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
-"^":"",
-fI:{
-"^":"V43;Uz,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gIs:function(a){return a.Uz},
-sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=a.Uz
-if(z==null)return
-J.SK(z)},
-RF:[function(a,b){J.r0(a.Uz).Qy(b)},"$1","gvC",2,0,20,90],
-Ur:[function(a,b){J.eg(J.aT(a.Uz)).Qy(b)},"$1","gDX",2,0,20,90],
-static:{dI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.FH.ZL(a)
-C.FH.XI(a)
-return a}}},
-V43:{
-"^":"uL+Pi;",
-$isd3:true}}],["service","package:observatory/service.dart",,D,{
-"^":"",
-hi:function(a,b){var z,y,x,w,v,u,t,s,r
-if(b==null)return
-z=J.U6(b)
-z=z.t(b,"id")!=null&&z.t(b,"type")!=null
-if(!z)N.QM("").YX("Malformed service object: "+H.d(b))
-y=J.UQ(b,"type")
-z=J.rY(y)
-switch(z.nC(y,"@")?z.yn(y,1):y){case"Class":z=D.dy
-x=[]
-x.$builtinTypeInfo=[z]
-x=new Q.wn(null,null,x,null,null)
-x.$builtinTypeInfo=[z]
-z=D.dy
-w=[]
-w.$builtinTypeInfo=[z]
-w=new Q.wn(null,null,w,null,null)
-w.$builtinTypeInfo=[z]
-z=D.vO
-v=[]
-v.$builtinTypeInfo=[z]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[z]
-z=D.vO
-u=[]
-u.$builtinTypeInfo=[z]
-u=new Q.wn(null,null,u,null,null)
-u.$builtinTypeInfo=[z]
-z=D.dy
-t=[]
-t.$builtinTypeInfo=[z]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[z]
-s=new D.dy(null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Code":z=[]
-z.$builtinTypeInfo=[D.Fc]
-x=[]
-x.$builtinTypeInfo=[D.Fc]
-w=D.DP
-v=[]
-v.$builtinTypeInfo=[w]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[w]
-w=P.KN
-u=D.uA
-t=new V.qC(P.YM(null,null,null,w,u),null,null)
-t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Error":s=new D.ft(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Isolate":z=new V.qC(P.YM(null,null,null,null,null),null,null)
-z.$builtinTypeInfo=[null,null]
-x=P.L5(null,null,null,P.qU,D.af)
-w=[]
-w.$builtinTypeInfo=[P.qU]
-v=[]
-v.$builtinTypeInfo=[D.ER]
-u=D.dy
-t=[]
-t.$builtinTypeInfo=[u]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[u]
-u=D.U4
-r=[]
-r.$builtinTypeInfo=[u]
-r=new Q.wn(null,null,r,null,null)
-r.$builtinTypeInfo=[u]
-u=P.L5(null,null,null,P.qU,P.CP)
-u=R.tB(u)
-s=new D.bv(z,null,!1,!1,!0,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,r,null,null,null,null,null,u,new D.eK(0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,null,null),null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Library":z=D.U4
-x=[]
-x.$builtinTypeInfo=[z]
-x=new Q.wn(null,null,x,null,null)
-x.$builtinTypeInfo=[z]
-z=D.vx
-w=[]
-w.$builtinTypeInfo=[z]
-w=new Q.wn(null,null,w,null,null)
-w.$builtinTypeInfo=[z]
-z=D.dy
-v=[]
-v.$builtinTypeInfo=[z]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[z]
-z=D.vO
-u=[]
-u.$builtinTypeInfo=[z]
-u=new Q.wn(null,null,u,null,null)
-u.$builtinTypeInfo=[z]
-z=D.vO
-t=[]
-t.$builtinTypeInfo=[z]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[z]
-s=new D.U4(null,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"ServiceException":s=new D.EP(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Script":z=D.c2
-x=[]
-x.$builtinTypeInfo=[z]
-x=new Q.wn(null,null,x,null,null)
-x.$builtinTypeInfo=[z]
-s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),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},
-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},
-kT:function(a,b){var z=J.x(a)
-if(!!z.$isvO)return
-if(!!z.$isqC)D.yX(a,b)
-else if(!!z.$iswn)D.f3(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.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.yX(x,b)}},
-af:{
-"^":"Pi;px@,t7@",
-gwv:function(a){var z=this.Q4
-return z.gwv(z)},
-god:function(a){var z=this.Q4
-return z.god(z)},
-gjO:function(a){return this.r0},
-gzS:function(){return this.mQ},
-gPj:function(a){return this.Q4.Mq(this.r0)},
-gox:function(a){return this.kT},
-gUm:function(){return!1},
-gfS:function(){return!1},
-goc:function(a){return this.gpx()},
-soc:function(a,b){this.spx(this.ct(this,C.YS,this.gpx(),b))},
-gdN:function(){return this.gt7()},
-sdN:function(a){this.st7(this.ct(this,C.Tc,this.gt7(),a))},
-xW:function(a){if(this.kT)return P.Ab(this,null)
-return this.RE(0)},
-RE:function(a){var z
-if(J.xC(this.r0,""))return P.Ab(this,null)
-if(this.kT&&this.gfS())return P.Ab(this,null)
-z=this.VR
-if(z==null){z=this.gwv(this).HL(this.gPj(this)).ml(new D.JM(this)).Qy(new D.Bf(this))
-this.VR=z}return z},
-eC:function(a){var z,y,x,w
-z=J.U6(a)
-y=J.co(z.t(a,"type"),"@")
-x=z.t(a,"type")
-w=J.rY(x)
-if(w.nC(x,"@"))x=w.yn(x,1)
-w=this.r0
-if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
-this.mQ=x
-this.bF(0,a,y)},
-$isaf:true},
-JM:{
-"^":"Tp:184;a",
-$1:[function(a){var z,y
-z=J.UQ(a,"type")
-y=J.rY(z)
-if(y.nC(z,"@"))z=y.yn(z,1)
-y=this.a
-if(!J.xC(z,y.mQ))return D.hi(y.Q4,a)
-y.eC(a)
-return y},"$1",null,2,0,null,183,"call"],
-$isEH:true},
-Bf:{
-"^":"Tp:69;b",
-$0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
-$isEH:true},
-xm:{
-"^":"af;"},
-wv:{
-"^":"O1w;",
-gwv:function(a){return this},
-god:function(a){return},
-giR:function(){var z=this.z7
-return z.gUQ(z)},
-gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gLc",2,0,152,185],
-gYe:function(a){return this.Ox},
-gJk:function(){return this.RW},
-gA3:function(){return this.Ts},
-gEy:function(){return this.Va},
-gU6:function(){return this.bQ},
-gPE:function(){return this.l7},
-jq:function(a){var z,y,x,w
-z=$.rc().R4(0,a)
-if(z==null)return
-y=z.QK
-x=y.input
-w=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return C.xB.yn(x,w+y)},
-TV:function(a){var z,y,x
-z=$.vo().R4(0,a)
-if(z==null)return""
-y=z.QK
-x=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return J.Nj(a,0,x+y)},
-Qn:function(a){throw H.b(P.SY(null))},
-Tn:function(a){var z
-if(a==="")return P.Ab(null,null)
-z=this.z7.t(0,a)
-if(z!=null)return P.Ab(z,null)
-return this.RE(0).ml(new D.MZ(this,a))},
-cv:function(a){var z,y,x
-if(J.co(a,"isolates/")){z=this.TV(a)
-y=this.jq(a)
-return this.Tn(z).ml(new D.it(this,y))}x=this.yM.t(0,a)
-if(x!=null)return J.r0(x)
-return this.HL(a).ml(new D.lb(this,a))},
-nJm:[function(a,b){return b},"$2","ge1",4,0,77],
-ng:function(a){var z,y,x
-z=null
-try{y=new P.c5(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.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)
-return P.Ab(a,null)},
-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
-z=J.U6(b)
-y=z.t(b,"version")
-this.Ox=F.Wi(this,C.zn,this.Ox,y)
-y=z.t(b,"architecture")
-this.GY=F.Wi(this,C.ke,this.GY,y)
-y=z.t(b,"uptime")
-this.RW=F.Wi(this,C.mh,this.RW,y)
-y=P.Wu(H.BU(z.t(b,"date"),null,null),!1)
-this.l7=F.Wi(this,C.GI,this.l7,y)
-y=z.t(b,"assertsEnabled")
-this.Ts=F.Wi(this,C.ET,this.Ts,y)
-y=z.t(b,"pid")
-this.bQ=F.Wi(this,C.uI,this.bQ,y)
-y=z.t(b,"typeChecksEnabled")
-this.Va=F.Wi(this,C.J2,this.Va,y)
-this.l9(z.t(b,"isolates"))},
-l9:function(a){var z,y,x,w,v,u
-z=this.z7
-y=P.L5(null,null,null,P.qU,D.bv)
-for(x=J.mY(a);x.G();){w=x.gl()
-v=J.UQ(w,"id")
-u=z.t(0,v)
-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.y2())
-this.z7=y},
-md:function(){this.px=this.ct(this,C.YS,this.px,"vm")
-this.t7=this.ct(this,C.Tc,this.t7,"vm")
-this.yM.u(0,"vm",this)
-var z=P.EF(["id","vm","type","@VM"],null,null)
-this.eC(R.tB(z))},
-$iswv:true},
-O1w:{
-"^":"xm+Pi;",
-$isd3:true},
-MZ:{
-"^":"Tp:13;a,b",
-$1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-it:{
-"^":"Tp:13;a,b",
-$1:[function(a){var z
-if(a==null)return this.a
-z=this.b
-if(z==null)return J.r0(a)
-else return a.cv(z)},"$1",null,2,0,null,7,"call"],
-$isEH:true},
-lb:{
-"^":"Tp:184;c,d",
-$1:[function(a){var z,y
-z=this.c
-y=D.hi(z,a)
-if(y.gUm())z.yM.to(this.d,new D.zK(y))
-return y},"$1",null,2,0,null,183,"call"],
-$isEH:true},
-zK:{
-"^":"Tp:69;e",
-$0:function(){return this.e},
-$isEH:true},
-zA:{
-"^":"Tp:13;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.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,133,"call"],
-$isEH:true},
-tm:{
-"^":"Tp:13;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,24,"call"],
-$isEH:true},
-mR:{
-"^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-bp:{
-"^":"Tp:13;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,86,"call"],
-$isEH:true},
-hc:{
-"^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-y2:{
-"^":"Tp:77;",
-$2:function(a,b){J.r0(b)},
-$isEH:true},
-ER:{
-"^":"a;SP,XE>,wZ",
-eK:function(a){var z,y,x,w,v
-z=this.XE
-H.vf(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.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.bI(u,b[v])
-z[v]=u
-t=this.wZ
-if(typeof u!=="number")return H.s(u)
-this.wZ=t+u}},
-k5:function(a,b){var z,y,x,w,v,u
-z=J.U6(b)
-y=this.XE
-x=y.length
-w=0
-while(!0){v=z.gB(b)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=z.t(b,w)
-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.XE,y=z.length,x=0;x<y;++x)z[x]=0},
-$isER:true},
-tL:{
-"^":"a;af<,lI<,h7,yP,hD,QS",
-gij:function(){return this.h7},
-xZ:function(a,b){var z,y,x,w,v,u
-this.h7=a
-z=J.U6(b)
-y=z.t(b,"counters")
-x=this.af
-if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
-this.QS=J.q8(z.t(b,"counters"))
-for(z=this.hD,x=this.lI,w=0;v=this.QS,w<z;++w){if(typeof v!=="number")return H.s(v)
-v=Array(v)
-v.fixed$length=init
-v.$builtinTypeInfo=[P.KN]
-u=new D.ER(0,v,0)
-u.CJ()
-x.push(u)}if(typeof v!=="number")return H.s(v)
-z=Array(v)
-z.fixed$length=init
-z=new D.ER(0,H.VM(z,[P.KN]),0)
-this.yP=z
-z.eK(y)
-return}z=this.QS
-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.XE)
-this.yP.k5(0,y)
-z=this.lI
-z.push(u)
-if(z.length>this.hD)C.Nm.KI(z,0)}},
-eK:{
-"^":"Pi;mV,ob,pX,yp,uK,AP,fn",
-gSU:function(){return this.mV},
-gCs:function(){return this.ob},
-gMX:function(){return this.pX},
-gYk:function(){return this.yp},
-gpy:function(){return this.uK},
-eC:function(a){var z,y
-z=J.U6(a)
-y=z.t(a,"used")
-this.mV=F.Wi(this,C.LP,this.mV,y)
-y=z.t(a,"capacity")
-this.ob=F.Wi(this,C.bV,this.ob,y)
-y=z.t(a,"external")
-this.pX=F.Wi(this,C.h7,this.pX,y)
-y=z.t(a,"collections")
-this.yp=F.Wi(this,C.J6,this.yp,y)
-z=z.t(a,"time")
-this.uK=F.Wi(this,C.Jl,this.uK,z)}},
-bv:{
-"^":"uz4;V3,Jr,EY,eU,zG,XV,yM,GH,Z2,AI,v9,tW,zb,px:KT@,t7:f5@,i9,SF,Dr,UY<,xQ<,vJ,zf,BC<,FF,bj,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gwv:function(a){return this.Q4},
-god:function(a){return this},
-gXE:function(a){return this.V3},
-sXE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
-gPj:function(a){return"/"+H.d(this.r0)},
-gBP:function(a){return this.Jr},
-gA6:function(){return this.EY},
-gaj:function(){return this.eU},
-gjz:function(){return this.zG},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,152,185],
-N3:function(a){var z,y,x,w
-z=H.VM([],[D.kx])
-y=J.U6(a)
-for(x=J.mY(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
-this.c2()
-this.pl(a,z)
-w=y.t(a,"exclusive_trie")
-if(w!=null)this.BC=this.Q3(w,z)},
-c2:function(){var z=this.yM
-z.gUQ(z).aN(0,new D.TV())},
-pl:function(a,b){var z,y,x,w
-z=J.U6(a)
-y=z.t(a,"codes")
-x=z.t(a,"samples")
-for(z=J.mY(y);z.G();){w=z.gl()
-J.UQ(w,"code").Il(w,b,x)}},
-Ms:[function(a){return this.cv("coverage").ml(this.gJJ())},"$0","gDX",0,0,186],
-cNN:[function(a){J.Me(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,135,187],
-WR:function(){return this.cv("classes").ml(this.geL()).ml(this.gjR())},
-Dw:[function(a){var z,y,x,w
-z=[]
-for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
-w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.YZ(z,!1)},"$1","geL",2,0,188,189],
-xk:[function(a){var z,y,x,w
-z=this.AI
-z.V1(z)
-this.Z2=F.Wi(this,C.as,this.Z2,null)
-for(y=J.mY(a);y.G();){x=y.gl()
-if(x.guj()==null)z.h(0,x)
-if(J.xC(x.gdN(),"Object")&&J.xC(x.gi2(),!1)){w=this.Z2
-if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.as,w,x)
-w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Z2=x}}return P.Ab(this.Z2,null)},"$1","gjR",2,0,190,191],
-Qn:function(a){var z,y,x
-if(a==null)return
-z=J.UQ(a,"id")
-y=this.yM
-x=y.t(0,z)
-if(x!=null)return x
-x=D.hi(this,a)
-if(x.gUm())y.u(0,z,x)
-return x},
-cv:function(a){var z=this.yM.t(0,a)
-if(z!=null)return J.r0(z)
-return this.Q4.HL("/"+H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gDZ:function(){return this.Z2},
-gVc:function(){return this.v9},
-sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
-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)},
-gdN:function(){return this.f5},
-sdN:function(a){this.f5=F.Wi(this,C.Tc,this.f5,a)},
-geH:function(){return this.i9},
-gw2:function(){return this.SF},
-sw2:function(a){this.SF=F.Wi(this,C.tP,this.SF,a)},
-gkc:function(a){return this.zf},
-skc:function(a,b){this.zf=F.Wi(this,C.yh,this.zf,b)},
-WU:function(a){var z=J.U6(a)
-this.UY.eC(z.t(a,"new"))
-this.xQ.eC(z.t(a,"old"))},
-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")
-this.i9=F.Wi(this,C.wT,this.i9,y)
-y=z.t(b,"name")
-this.KT=F.Wi(this,C.YS,this.KT,y)
-y=z.t(b,"name")
-this.f5=F.Wi(this,C.Tc,this.f5,y)
-if(c)return
-this.kT=!0
-this.zG=F.Wi(this,C.DY,this.zG,!1)
-D.kT(b,this)
-if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heaps")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
-return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.eN,this.v9,y)
-if(z.t(b,"entry")!=null){y=z.t(b,"entry")
-this.SF=F.Wi(this,C.tP,this.SF,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
-this.zb=F.Wi(this,C.bc,this.zb,y)}else this.zb=F.Wi(this,C.bc,this.zb,null)
-x=z.t(b,"tagCounters")
-if(x!=null){y=J.U6(x)
-w=y.t(x,"names")
-v=y.t(x,"counters")
-y=J.U6(v)
-u=0
-t=0
-while(!0){s=y.gB(v)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-s=y.t(v,t)
-if(typeof s!=="number")return H.s(s)
-u+=s;++t}s=P.Fl(null,null)
-s=R.tB(s)
-this.V3=F.Wi(this,C.bJ,this.V3,s)
-if(u===0){y=J.U6(w)
-t=0
-while(!0){s=y.gB(w)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-J.kW(this.V3,y.t(w,t),"0.0%");++t}}else{s=J.U6(w)
-t=0
-while(!0){r=s.gB(w)
-if(typeof r!=="number")return H.s(r)
-if(!(t<r))break
-J.kW(this.V3,s.t(w,t),C.CD.Sy(J.L9(y.t(v,t),u)*100,2)+"%");++t}}}q=P.Fl(null,null)
-J.Me(z.t(b,"timers"),new D.Qq(q))
-y=this.Dr
-s=J.w1(y)
-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.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"))
-this.WU(z.t(b,"heaps"))
-p=z.t(b,"features")
-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.Bs,s,!0)
-s.$builtinTypeInfo=[null]
-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
-this.EY=F.Wi(this,C.L2,this.EY,y)
-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.zf=F.Wi(this,C.yh,this.zf,y)
-y=this.tW
-y.V1(y)
-for(z=J.mY(z.t(b,"libraries"));z.G();)y.h(0,z.gl())
-y.GT(y,new D.hU())},
-m7:function(){return this.Q4.HL("/"+H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
-Q3:function(a,b){this.FF=0
-this.bj=a
-if(a==null)return
-if(J.u6(J.q8(a),3))return
-return this.AW(b)},
-AW:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.bj
-y=this.FF
-if(typeof y!=="number")return y.g()
-this.FF=y+1
-x=J.UQ(z,y)
-if(x>>>0!==x||x>=a.length)return H.e(a,x)
-w=a[x]
-y=this.bj
-z=this.FF
-if(typeof z!=="number")return z.g()
-this.FF=z+1
-v=J.UQ(y,z)
-z=[]
-z.$builtinTypeInfo=[D.t9]
-u=new D.t9(w,v,z,0)
-y=this.bj
-t=this.FF
-if(typeof t!=="number")return t.g()
-this.FF=t+1
-s=J.UQ(y,t)
-if(typeof s!=="number")return H.s(s)
-r=0
-for(;r<s;++r){q=this.AW(a)
-z.push(q)
-y=u.Jv
-t=q.Av
-if(typeof t!=="number")return H.s(t)
-u.Jv=y+t}return u},
-$isbv:true,
-static:{"^":"ZGx"}},
-uz4:{
-"^":"xm+Pi;",
-$isd3:true},
-TV:{
-"^":"Tp:13;",
-$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.hw,0)
-a.Oo.V1(0)}},
-$isEH:true},
-Yb:{
-"^":"Tp:13;a",
-$1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,192,"call"],
-$isEH:true},
-KQ:{
-"^":"Tp:184;a,b",
-$1:[function(a){var z,y
-z=this.a
-y=D.hi(z,a)
-if(y.gUm())z.yM.to(this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,183,"call"],
-$isEH:true},
-Ea:{
-"^":"Tp:69;c",
-$0:function(){return this.c},
-$isEH:true},
-Qq:{
-"^":"Tp:13;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,193,"call"],
-$isEH:true},
-hU:{
-"^":"Tp:77;",
-$2:function(a,b){return J.oE(J.O6(a),J.O6(b))},
-$isEH:true},
-AP:{
-"^":"Tp:184;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,146,"call"],
-$isEH:true},
-vO:{
-"^":"af;Ce,Q4,r0,mQ,kT,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
-z=this.Ce
-z.V1(0)
-z.FV(0,b)
-y=z.Zp
-x=y.t(0,"user_name")
-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.kT(z,this.Q4)},
-FV:function(a,b){return this.Ce.FV(0,b)},
-V1:function(a){return this.Ce.V1(0)},
-aN:function(a,b){return this.Ce.Zp.aN(0,b)},
-t:function(a,b){return this.Ce.Zp.t(0,b)},
-u:function(a,b,c){this.Ce.u(0,b,c)
-return c},
-gl0:function(a){var z=this.Ce.Zp
-return z.gB(z)===0},
-gor:function(a){var z=this.Ce.Zp
-return z.gB(z)!==0},
-gvc:function(){return this.Ce.Zp.gvc()},
-gUQ:function(a){var z=this.Ce.Zp
-return z.gUQ(z)},
-gB:function(a){var z=this.Ce.Zp
-return z.gB(z)},
-HC:[function(a){var z=this.Ce
-return z.HC(z)},"$0","gDx",0,0,111],
-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","gqw",0,0,18],
-NB:[function(a){this.Ce.AP=null
-return},"$0","gym",0,0,18],
-gqh:function(a){var z=this.Ce
-return z.gqh(z)},
-gnz:function(a){var z,y
-z=this.Ce.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-$isvO:true,
-$isqC:true,
-$asqC:function(){return[null,null]},
-$isZ0:true,
-$asZ0:function(){return[null,null]},
-$isd3:true,
-static:{"^":"RQ"}},
-ft:{
-"^":"D3;I0,LD,jo,YS,AP,fn,Q4,r0,mQ,kT,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.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.Q4
-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.YS=F.Wi(this,C.Pf,this.YS,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;I0,LD,AP,fn,Q4,r0,mQ,kT,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
-z=J.U6(b)
-y=z.t(b,"kind")
-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.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;I0,LD,IV,AP,fn,Q4,r0,mQ,kT,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},
-bF:function(a,b,c){var z,y
-z=J.U6(b)
-y=z.t(b,"kind")
-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.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<,XR<,DD>,Z3<,mu<,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gO3:function(a){return this.dj},
-gUm:function(){return!0},
-gfS:function(){return!1},
-bF:function(a,b,c){var z,y,x,w,v
-z=J.U6(b)
-y=z.t(b,"url")
-x=F.Wi(this,C.Fh,this.dj,y)
-this.dj=x
-if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
-w=J.U6(y)
-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.px,y)
-this.px=y
-if(J.FN(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
-y=this.Q4
-D.kT(b,y.god(y))
-y=this.Bm
-y.V1(y)
-y.FV(0,z.t(b,"imports"))
-y=this.XR
-y.V1(y)
-y.FV(0,z.t(b,"scripts"))
-y=this.DD
-y.V1(y)
-y.FV(0,z.t(b,"classes"))
-y=this.Z3
-y.V1(y)
-y.FV(0,z.t(b,"variables"))
-y=this.mu
-y.V1(y)
-y.FV(0,z.t(b,"functions"))},
-$isU4:true},
-w8F:{
-"^":"af+Pi;",
-$isd3:true},
-mT:{
-"^":"Pi;wf,yg,AP,fn",
-gWt:function(){return this.wf},
-gfj:function(){return this.yg}},
-Iy:{
-"^":"a;bi<,l<",
-eC:function(a){var z,y,x
-z=this.bi
-y=J.U6(a)
-x=y.t(a,6)
-z.wf=F.Wi(z,C.yB,z.wf,x)
-x=y.t(a,7)
-z.yg=F.Wi(z,C.hN,z.yg,x)
-x=this.l
-z=J.ew(y.t(a,2),y.t(a,4))
-x.wf=F.Wi(x,C.yB,x.wf,z)
-y=J.ew(y.t(a,3),y.t(a,5))
-x.yg=F.Wi(x,C.hN,x.yg,y)},
-static:{"^":"jZx,xxx,qWF,oQ,S1O,wXu,WVi,Whu"}},
-dy:{
-"^":"V4b;Gz,ar,qX,Xj,vY,u0,J1,E8,Aj,zf,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gHt:function(a){return this.Gz},
-sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-guj:function(){return this.qX},
-suj:function(a){this.qX=F.Wi(this,C.Cw,this.qX,a)},
-gVM:function(){return this.Xj},
-gi2:function(){return this.J1},
-gVF:function(){return this.Aj},
-sVF:function(a){this.Aj=F.Wi(this,C.z6,this.Aj,a)},
-gkc:function(a){return this.zf},
-skc:function(a,b){this.zf=F.Wi(this,C.yh,this.zf,b)},
-gMp:function(){var z,y
-z=this.UY
-y=z.bi
-if(J.xC(y.wf,0)&&J.xC(y.yg,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.yg,0)}else z=!1
-if(z){z=this.xQ
-y=z.bi
-if(J.xC(y.wf,0)&&J.xC(y.yg,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.yg,0)}else z=!1}else z=!1
-return z},
-gUm:function(){return!0},
-gfS:function(){return!1},
-bu:function(a){return"Service Class: "+H.d(this.t7)},
-bF:function(a,b,c){var z,y,x
-z=J.U6(b)
-y=z.t(b,"user_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)
-if(c)return
-this.kT=!0
-y=this.Q4
-D.kT(b,y.god(y))
-if(!!J.x(z.t(b,"library")).$isU4){y=z.t(b,"library")
-this.Gz=F.Wi(this,C.EV,this.Gz,y)}else this.Gz=F.Wi(this,C.EV,this.Gz,null)
-y=z.t(b,"script")
-this.ar=F.Wi(this,C.PX,this.ar,y)
-y=z.t(b,"abstract")
-this.Xj=F.Wi(this,C.XH,this.Xj,y)
-y=z.t(b,"const")
-this.vY=F.Wi(this,C.bD,this.vY,y)
-y=z.t(b,"finalized")
-this.u0=F.Wi(this,C.WV,this.u0,y)
-y=z.t(b,"patch")
-this.J1=F.Wi(this,C.XL,this.J1,y)
-y=z.t(b,"implemented")
-this.E8=F.Wi(this,C.Ih,this.E8,y)
-y=z.t(b,"tokenPos")
-this.Aj=F.Wi(this,C.z6,this.Aj,y)
-y=this.S5
-y.V1(y)
-y.FV(0,z.t(b,"subclasses"))
-y=this.tJ
-y.V1(y)
-y.FV(0,z.t(b,"fields"))
-y=this.mu
-y.V1(y)
-y.FV(0,z.t(b,"functions"))
-y=z.t(b,"super")
-y=F.Wi(this,C.Cw,this.qX,y)
-this.qX=y
-if(y!=null)y.Ib(this)
-y=z.t(b,"error")
-this.zf=F.Wi(this,C.yh,this.zf,y)
-x=z.t(b,"allocationStats")
-if(x!=null){z=J.U6(x)
-this.UY.eC(z.t(x,"new"))
-this.xQ.eC(z.t(x,"old"))}},
-Ib:function(a){var z=this.ks
-if(z.tg(z,a))return
-z.h(0,a)},
-cv:function(a){var z=this.Q4
-return z.god(z).cv(J.ew(this.r0,"/"+H.d(a)))},
-$isdy:true},
-V4b:{
-"^":"af+Pi;",
-$isd3:true},
-c2:{
-"^":"Pi;Rd<,a4>,x9,AP,fn",
-gu9:function(){return this.x9},
-su9:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
-$isc2:true},
-vx:{
-"^":"Zqa;Gd>,d6,I0,U9,nE,mB,wA,y6,FB,AP,fn,Q4,r0,mQ,kT,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.U9},
-shY:function(a){var z=this.U9
-if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.Gd,z,a)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.U9=a},
-gSK:function(){return this.nE},
-sSK:function(a){var z=this.nE
-if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.kA,z,a)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.nE=a},
-gUm:function(){return!0},
-gfS:function(){return!0},
-rK:function(a){var z,y
-z=J.bI(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.I0=F.Wi(this,C.Lc,this.I0,y)
-y=z.t(b,"name")
-this.wA=y
-x=J.U6(y)
-w=x.cn(y,"/")
-if(typeof w!=="number")return w.g()
-w=x.yn(y,w+1)
-this.mB=w
-this.px=this.ct(this,C.YS,this.px,w)
-w=this.wA
-this.t7=this.ct(this,C.Tc,this.t7,w)
-this.W8(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.nE=F.Wi(this,C.kA,this.nE,null)
-for(z=J.mY(a);z.G();){y=z.gl()
-x=J.U6(y)
-w=x.t(y,0)
-v=1
-while(!0){u=x.gB(y)
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-t=x.t(y,v)
-s=x.t(y,v+1)
-u=this.U9
-if(u==null){if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.Gd,u,t)
-u.$builtinTypeInfo=[null]
-this.nq(this,u)}this.U9=t
-u=this.nE
-if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.kA,u,t)
-u.$builtinTypeInfo=[null]
-this.nq(this,u)}this.nE=t}else{u=J.Bl(u,t)?this.U9:t
-r=this.U9
-if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.Gd,r,u)
-r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.U9=u
-u=J.J5(this.nE,t)?this.nE:t
-r=this.nE
-if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.kA,r,u)
-r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.nE=u}this.y6.u(0,t,w)
-this.FB.u(0,t,s)
-v+=2}}},
-SC:function(a){var z,y,x,w,v,u,t
-z=J.U6(a)
-y=this.d6
-x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-v=z.t(a,x)
-u=z.t(a,x+1)
-t=y.t(0,v)
-y.u(0,v,t!=null?J.ew(u,t):u)
-x+=2}this.zL()},
-W8:function(a){var z,y,x,w
-this.kT=!1
-if(a==null)return
-z=J.uH(a,"\n")
-if(z.length===0)return
-this.kT=!0
-y=this.Gd
-y.V1(y)
-N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
-for(x=0;x<z.length;x=w){w=x+1
-y.h(0,new D.c2(w,z[x],null,null,null))}this.zL()},
-zL:function(){var z,y,x
-z=this.Gd
-if(z.ao.length===0)return
-for(z=z.gA(z),y=this.d6;z.G();){x=z.lo
-x.su9(y.t(0,x.gRd()))}},
-$isvx:true},
-Zqa:{
-"^":"af+Pi;",
-$isd3:true},
-uA:{
-"^":"a;Yu<,Du<,fF<",
-$isuA:true},
-xb:{
-"^":"Pi;Yu<,JP,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)},
-gJz:function(){return this.MT},
-JM:[function(){var z,y
-z=this.JP
-y=J.x(z)
-if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,194],
-bR:function(a){var z,y
-this.ar=F.Wi(this,C.PX,this.ar,null)
-z=this.VF
-if(J.xC(z,-1))return
-y=a.q6(z)
-if(y==null)return
-this.ar=F.Wi(this,C.PX,this.ar,a)
-z=J.dY(a.rK(y))
-this.MT=F.Wi(this,C.oI,this.MT,z)},
-$isxb:true},
-DP:{
-"^":"Pi;Yu<,jA,L4<,dh,uH<,AP,fn",
-gEB:function(){return this.dh},
-gUB:function(){return J.xC(this.Yu,0)},
-gGf:function(){return this.uH.ao.length>0},
-dV:[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,194],
-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,195,71],
-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,195,71],
-eQ:function(){var z,y,x,w
-y=J.uH(this.L4," ")
-x=y.length
-if(x!==2)return 0
-if(1>=x)return H.e(y,1)
-z=y[1]
-if(J.co(z,"0x"))z=J.ZZ(z,2)
-try{x=H.BU(z,16,null)
-return x}catch(w){H.Ru(w)
-return 0}},
-Sd:function(a){var z,y,x,w,v
-z=this.L4
-if(!J.co(z,"j"))return
-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.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.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)
-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,"Reused"))return C.yP
-else if(z.n(a,"Tag"))return C.Z7
-N.QM("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.EY())}}},
-Fc:{
-"^":"a;tT>,Av<",
-$isFc:true},
-t9:{
-"^":"a;tT>,Av<,ks>,Jv",
-$ist9:true},
-kx:{
-"^":"D3i;I0,xM,Du<,fF<,Oj,Mb,VS,hw,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,dN@,TD,AP,fn,Q4,r0,mQ,kT,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},
-gL1:function(){return this.Ni},
-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)},
-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","gUH",2,0,196,197],
-OF:function(){if(this.ar!=null)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.gUH())},
-RE:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.RE.call(this,this)
-return P.Ab(this,null)},
-bd:function(a,b,c){var z,y,x,w,v
-z=J.U6(b)
-y=0
-while(!0){x=z.gB(b)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-w=H.BU(z.t(b,y),null,null)
-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.Fc(c[w],v))
-y+=2}H.rd(a,new D.fx())},
-Il: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.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)+")"
-this.mM=F.Wi(this,C.eF,this.mM,z)
-z=D.Rd(this.Du,this.xM)+" ("+H.d(this.Du)+")"
-this.qH=F.Wi(this,C.uU,this.qH,z)},
-bF:function(a,b,c){var z,y,x,w,v
-z=J.U6(b)
-this.oc=z.t(b,"user_name")
-this.dN=z.t(b,"name")
-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.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.Q4
-x=y.god(y).Qn(z.t(b,"function"))
-this.MO=F.Wi(this,C.nf,this.MO,x)
-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.xs(w)
-v=z.t(b,"descriptors")
-if(v!=null)this.WY(J.UQ(v,"members"))
-z=this.va.ao
-this.kT=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},
-xs:function(a){var z,y,x,w,v,u,t,s
-z=this.va
-z.V1(z)
-y=J.U6(a)
-x=0
-while(!0){w=y.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-v=y.t(a,x+1)
-u=y.t(a,x+2)
-t=!J.xC(y.t(a,x),"")?H.BU(y.t(a,x),null,null):0
-w=D.xb
-s=[]
-s.$builtinTypeInfo=[w]
-s=new Q.wn(null,null,s,null,null)
-s.$builtinTypeInfo=[w]
-z.h(0,new D.DP(t,v,u,null,s,null,null))
-x+=3}for(y=z.gA(z);y.G();)y.lo.Sd(z)},
-QX:function(a){var z,y,x,w,v,u,t
-z=J.U6(a)
-y=H.BU(z.t(a,"pc"),16,null)
-x=z.t(a,"deoptId")
-w=z.t(a,"tokenPos")
-v=z.t(a,"tryIndex")
-u=J.rr(z.t(a,"kind"))
-for(z=this.va,z=z.gA(z);z.G();){t=z.lo
-if(J.xC(t.gYu(),y)){t.guH().h(0,new D.xb(y,x,w,v,u,null,null,null,null))
-return}}N.QM("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
-WY:function(a){var z
-for(z=J.mY(a);z.G();)this.QX(z.gl())},
-qL:function(a){var z,y,x,w,v
-z=J.U6(a)
-y=this.Oo
-x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-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){J.J5(b,this.Oj)
-return!1},
-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)+"%"}}},
-D3i:{
-"^":"af+Pi;",
-$isd3:true},
-Em:{
-"^":"Tp:13;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.gUH())},"$1",null,2,0,null,198,"call"],
-$isEH:true},
-fx:{
-"^":"Tp:77;",
-$2:function(a,b){return J.bI(b.gAv(),a.gAv())},
-$isEH:true},
-l8R:{
-"^":"a;uX",
-bu:function(a){return this.uX},
-static:{"^":"Ll,lTU,FJy,wr",AR:function(a){var z=J.x(a)
-if(z.n(a,"Listening"))return C.Cn
-else if(z.n(a,"Normal"))return C.fO
-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.EY())}}},
-WP:{
-"^":"Pqb;V8@,je,mI,I0,vu,DB,XK,FH,L7,Wu,tO,HO,kJ,Wm,AP,fn,Q4,r0,mQ,kT,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.vu},
-gm8:function(){return this.DB},
-gaU:function(){return this.XK},
-gaP:function(){return this.FH},
-gzM:function(){return this.L7},
-gkE:function(){return this.Wu},
-giP:function(){return this.tO},
-gLw:function(){return this.HO},
-gNS:function(){return this.kJ},
-guh:function(){return this.Wm},
-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.AR(z.t(b,"kind"))
-this.I0=F.Wi(this,C.Lc,this.I0,y)
-if(c)return
-this.kT=!0
-y=this.Q4
-D.kT(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.FH=F.Wi(this,C.To,this.FH,y)
-y=z.t(b,"listening")
-this.L7=F.Wi(this,C.cc,this.L7,y)
-y=z.t(b,"protocol")
-this.vu=F.Wi(this,C.AY,this.vu,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.dx,this.kJ,y)
-y=z.t(b,"remotePort")
-this.Wm=F.Wi(this,C.ni,this.Wm,y)
-y=z.t(b,"fd")
-this.Wu=F.Wi(this,C.R3,this.Wu,y)
-this.V8=z.t(b,"owner")}},
-Pqb:{
-"^":"af+Pi;",
-$isd3:true},
-Qf:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z,y
-z=J.x(b)
-y=!!z.$isqC
-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.yX(b,this.b)},
-$isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
-"^":"",
-zM:{
-"^":"V44;S4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gkc:function(a){return a.S4},
-skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
-static:{cE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.n8.ZL(a)
-C.n8.XI(a)
-return a}}},
-V44:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
-"^":"",
-Rk:{
-"^":"V45;Xc,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Vd.ZL(a)
-C.Vd.XI(a)
-return a}}},
-V45:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
-"^":"",
-XK:{
-"^":"wv;Jf,Ox,GY,RW,Ts,Va,bQ,l7,Li,G2,yM,z7,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-z6:function(a,b){var z
-if(J.VT(this.Jf,"/")&&J.co(b,"/"))b=J.ZZ(b,1)
-N.QM("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
-z=this.Jf
-if(typeof z!=="string")return z.g()
-return W.lt(J.ew(z,b),null,null,null,P.EF(["Observatory-Version","1.0"],null,null),null,null,null).ml(new U.dT()).OA(new U.E7())},
-eY:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
-dT:{
-"^":"Tp:200;",
-$1:[function(a){return J.Du(a)},"$1",null,2,0,null,199,"call"],
-$isEH:true},
-E7:{
-"^":"Tp:13;",
-$1:[function(a){var z,y
-N.QM("").YX("HttpRequest.request failed.")
-z=J.l2(a)
-y=J.RE(z)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",y.gxN(z),"kind","NetworkException","message","Could not connect to service ("+H.d(y.gpo(z))+"). Check that you started the VM with the following flags: --observe"],null,null))},"$1",null,2,0,null,24,"call"],
-$isEH:true},
-ho:{
-"^":"wv;S3,yb,Ox,GY,RW,Ts,Va,bQ,l7,Li,G2,yM,z7,AP,fn,Q4,r0,mQ,kT,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")
-x=J.UQ(z.gRn(a),"name")
-w=J.UQ(z.gRn(a),"data")
-if(!J.xC(x,"observatoryData"))return
-z=this.S3
-v=z.t(0,y)
-z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,20,72],
-z6:function(a,b){var z,y,x
-z=""+this.yb
-y=P.Fl(null,null)
-y.u(0,"id",z)
-y.u(0,"method","observatoryQuery")
-y.u(0,"query",H.d(b));++this.yb
-x=H.VM(new P.Zf(P.Dt(null)),[null])
-this.S3.u(0,z,x)
-J.iA(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.Ov(0,z.DK,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:{
-"^":"V46;Ll,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-switch(a.Ll.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
-J.CJ(z,a.Ll)
-return z
-case"BreakpointList":z=W.r3("breakpoint-list",null)
-J.oJ(z,a.Ll)
-return z
-case"Class":z=W.r3("class-view",null)
-J.NZ(z,a.Ll)
-return z
-case"Code":z=W.r3("code-view",null)
-J.T5(z,a.Ll)
-return z
-case"Error":z=W.r3("error-view",null)
-J.Qr(z,a.Ll)
-return z
-case"Field":z=W.r3("field-view",null)
-J.JZ(z,a.Ll)
-return z
-case"FlagList":z=W.r3("flag-list",null)
-J.vJ(z,a.Ll)
-return z
-case"Function":z=W.r3("function-view",null)
-J.C3(z,a.Ll)
-return z
-case"HeapMap":z=W.r3("heap-map",null)
-J.Nf(z,a.Ll)
-return z
-case"LibraryPrefix":case"TypeRef":case"TypeParameter":case"BoundedType":case"Int32x4":case"Float32x4":case"Float64x4":case"TypedData":case"ExternalTypedData":case"Capability":case"ReceivePort":case"SendPort":case"Stacktrace":case"JSRegExp":case"WeakProperty":case"MirrorReference":case"UserTag":case"Type":case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"Mint":case"Bigint":case"String":z=W.r3("instance-view",null)
-J.Qy(z,a.Ll)
-return z
-case"IO":z=W.r3("io-view",null)
-J.mU(z,a.Ll)
-return z
-case"HttpServerList":z=W.r3("io-http-server-list-view",null)
-J.A4(z,a.Ll)
-return z
-case"HttpServer":z=W.r3("io-http-server-view",null)
-J.fb(z,a.Ll)
-return z
-case"HttpServerConnection":z=W.r3("io-http-server-connection-view",null)
-J.i0(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
-case"ServiceException":z=W.r3("service-exception-view",null)
-J.BC(z,a.Ll)
-return z
-case"Script":z=W.r3("script-view",null)
-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.tQ(z,a.Ll)
-return z
-default:z=W.r3("json-view",null)
-J.wD(z,a.Ll)
-return z}},
-rm:[function(a,b){var z,y,x
-this.pj(a)
-z=a.Ll
-if(z==null){N.QM("").To("Viewing null object.")
-return}y=z.gzS()
-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,13,57],
-$isTi:true,
-static:{HP:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ns.ZL(a)
-C.Ns.XI(a)
-return a}}},
-V46:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
-"^":"",
-xI:{
-"^":"pv;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gnv:function(a){return a.tY},
-snv:function(a,b){a.tY=this.ct(a,C.xP,a.tY,b)},
-gjT:function(a){return a.Pe},
-sjT:function(a,b){a.Pe=this.ct(a,C.uu,a.Pe,b)},
-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,20,57],
-gO3:function(a){var z=a.tY
-if(z==null)return"NULL REF"
-z=J.Ds(z)
-$.W5.toString
-return"#"+H.d(z)},
-gJp:function(a){var z=a.tY
-if(z==null)return"NULL REF"
-return z.gdN()},
-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))},
-static:{fd:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.HRc.ZL(a)
-C.HRc.XI(a)
-return a}}},
-pv:{
-"^":"uL+Pi;",
-$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
-"^":"",
-CY:{
-"^":"KAf;kF,IK,bP,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-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,102,1,201,95],
-static:{Sm:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.zb.ZL(a)
-C.zb.XI(a)
-return a}}},
-KAf:{
-"^":"xc+Pi;",
-$isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
-"^":"",
-Wq:{
-"^":"a;c1,IW,Mg,nN,ER,Ja,WI,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.IW?"properties ":"")
-z.KF(this.Ja?"methods ":"")
-z.KF(this.Mg?"inherited ":"_")
-z.KF(this.ER?"no finals ":"")
-z.KF("annotations: "+H.d(this.WI))
-z.KF(this.tu!=null?"with matcher":"")
-z.KF(")")
-return z.vM}},
-ES:{
-"^":"a;oc>,fY>,V5>,t5>,Fo,Dv<",
-gZI:function(){return this.fY===C.nU},
-gUd:function(){return this.fY===C.BM},
-gUA:function(){return this.fY===C.WH},
-giO:function(a){var z=this.oc
-return z.giO(z)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isES&&this.oc.n(0,b.oc)&&this.fY===b.fY&&this.V5===b.V5&&this.t5.n(0,b.t5)&&this.Fo===b.Fo&&X.W4(this.Dv,b.Dv,!1)},
-bu:function(a){var z=P.p9("")
-z.KF("(declaration ")
-z.KF(this.oc)
-z.KF(this.fY===C.BM?" (property) ":" (method) ")
-z.KF(this.V5?"final ":"")
-z.KF(this.Fo?"static ":"")
-z.KF(this.Dv)
-z.KF(")")
-return z.vM},
-$isES:true},
-iYn:{
-"^":"a;fY>"}}],["smoke.src.common","package:smoke/src/common.dart",,X,{
-"^":"",
-Na:function(a,b,c){var z,y
-z=a.length
-if(z<b){y=Array(b)
-y.fixed$length=init
-H.qG(y,0,z,a,0)
-return y}if(z>c){z=Array(c)
-z.fixed$length=init
-H.qG(z,0,c,a,0)
-return z}return a},
-ZO:function(a,b){var z,y,x,w,v,u
-z=new H.a7(a,a.length,0,null)
-z.$builtinTypeInfo=[H.Kp(a,0)]
-for(;z.G();){y=z.lo
-b.length
-x=new H.a7(b,1,0,null)
-x.$builtinTypeInfo=[H.Kp(b,0)]
-w=J.x(y)
-for(;x.G();){v=x.lo
-if(w.n(y,v))return!0
-if(!!J.x(v).$isuq){u=w.gbx(y)
-u=$.mX().dM(u,v)}else u=!1
-if(u)return!0}}return!1},
-OS:function(a){var z,y
-z=H.G3()
-y=H.KT(z).BD(a)
-if(y)return 0
-y=H.KT(z,[z]).BD(a)
-if(y)return 1
-y=H.KT(z,[z,z]).BD(a)
-if(y)return 2
-z=H.KT(z,[z,z,z]).BD(a)
-if(z)return 3
-return 4},
-RI:function(a){var z,y
-z=H.G3()
-y=H.KT(z,[z,z,z]).BD(a)
-if(y)return 3
-y=H.KT(z,[z,z]).BD(a)
-if(y)return 2
-y=H.KT(z,[z]).BD(a)
-if(y)return 1
-z=H.KT(z).BD(a)
-if(z)return 0
-return-1},
-W4:function(a,b,c){var z,y,x,w,v
-z=a.length
-y=b.length
-if(z!==y)return!1
-if(c){x=P.Ls(null,null,null,null)
-x.FV(0,b)
-for(w=0;w<a.length;++w)if(!x.tg(0,a[w]))return!1}else for(w=0;w<z;++w){v=a[w]
-if(w>=y)return H.e(b,w)
-if(v!==b[w])return!1}return!0}}],["smoke.src.implementation","package:smoke/src/implementation.dart",,D,{
-"^":"",
-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;E4e,AH,lk,XO,Yp,af<,yQ"},
-fH:{
-"^":"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.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.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.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.RI(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)).$isJS){if(y!=null)P.FL(y)
-throw t}else throw t}}},
-bY:{
-"^":"a;TB,WF,wa",
-dM:function(a,b){var z,y,x
-if(a.n(0,b)||b.n(0,C.FQ))return!0
-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.wa)return!1
-throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+x.bu(y)+")"))}}return!1},
-UK:function(a,b){var z=this.F1(a,b)
-return z!=null&&z.fY===C.WH&&!z.Fo},
-n6:function(a,b){var z,y
-z=this.WF.t(0,a)
-if(z==null){if(!this.wa)return!1
-throw H.b(O.lA("declarations for "+H.d(a)))}y=z.t(0,b)
-return y!=null&&y.fY===C.WH&&y.Fo},
-CV:function(a,b){var z=this.F1(a,b)
-if(z==null){if(!this.wa)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.TB.t(0,b)
-if(y==null){if(this.wa)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.nN))z=this.Me(0,y,c)}x=this.WF.t(0,b)
-if(x==null){if(!this.wa)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.gZI())continue
-if(!c.IW&&v.gUd())continue
-if(c.ER&&J.Z6(v)===!0)continue
-if(!c.Ja&&v.gUA())continue
-if(c.tu!=null&&c.WO(0,J.O6(v))!==!0)continue
-u=c.WI
-if(u!=null&&!X.ZO(v.gDv(),u))continue
-z.push(v)}return z},
-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.wa)return
-throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
-ut:{
-"^":"a;ep,Nz",
-Ut:function(a){this.ep.aN(0,new O.m8(this))},
-static:{ty:function(a){var z=new O.ut(a.af,P.Fl(null,null))
-z.Ut(a)
-return z}}},
-m8:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.Nz.u(0,b,a)},
-$isEH:true},
-tk:{
-"^":"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:{
-"^":"V47;xP,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.dX.ZL(a)
-C.dX.XI(a)
-return a}}},
-V47:{
-"^":"uL+Pi;",
-$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
-"^":"",
-uw:{
-"^":"V48;ju,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.ju).Qy(b)},"$1","gvC",2,0,20,90],
-static:{HI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wB.ZL(a)
-C.wB.XI(a)
-return a}}},
-V48:{
-"^":"uL+Pi;",
-$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
-"^":"",
-AD:function(a,b,c,d){var z,y
-if(c){z=null!=d&&!1!==d
-y=J.RE(a)
-if(z)y.gQg(a).MW.setAttribute(b,"")
-else y.gQg(a).Rz(0,b)}else{z=J.Vs(a)
-y=d==null?"":H.d(d)
-z.MW.setAttribute(b,y)}},
-y9:function(a){var z
-for(;z=J.TmB(a),z!=null;a=z);return M.wp(a)?a:null},
-wp:function(a){var z=J.x(a)
-return!!z.$isQF||!!z.$isI0||!!z.$ishy},
-Lj:function(a,b){var z,y,x,w,v,u
-z=M.pN(a,b)
-if(z==null)z=new M.PW([],null,null)
-for(y=J.RE(a),x=y.gPZ(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.Lj(x,b)
-if(u==null)continue
-if(w==null){w=Array(y.gyT(a).NL.childNodes.length)
-w.fixed$length=init}if(v>=w.length)return H.e(w,v)
-w[v]=u}z.ks=w
-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)
-if(d.ghK()){M.Ky(z).bt(a)
-if(f!=null)J.Co(M.Ky(z),f)}M.mV(z,d,e,g)
-return z},
-tA:function(a){var z
-for(;z=J.TmB(a),z!=null;a=z);return a},
-cS:function(a,b){var z,y,x,w,v,u
-if(b==null||b==="")return
-z="#"+H.d(b)
-for(;!0;){a=M.tA(a)
-y=$.It()
-y.toString
-x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.J4())
-y=w==null
-if(!y&&w.gO5()!=null)v=J.Eh(w.gO5(),z)
-else{u=J.x(a)
-v=!!u.$isQF||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
-if(y)return
-a=w.gCi()
-if(a==null)return}},
-fX:function(a,b,c){if(c==null)return
-return new M.aR(a,b,c)},
-pN:function(a,b){var z,y
-z=J.x(a)
-if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$ismw){y=S.iw(a.textContent,M.fX("text",a,b))
-if(y!=null)return new M.PW(["text",y],null,null)}return},
-rJ:function(a,b,c){var z=a.getAttribute(b)
-if(z==="")z="{{}}"
-return S.iw(z,M.fX(b,a,c))},
-F5:function(a,b){var z,y,x,w,v,u
-z={}
-z.a=null
-y=M.CF(a)
-new W.E9(a).aN(0,new M.Uk(z,a,b,y))
-if(y){x=z.a
-if(x==null){w=[]
-z.a=w
-z=w}else z=x
-v=new M.qf(null,null,null,z,null,null)
-z=M.rJ(a,"if",b)
-v.qd=z
-x=M.rJ(a,"bind",b)
-v.fu=x
-u=M.rJ(a,"repeat",b)
-v.cw=u
-if(z!=null&&x==null&&u==null)v.fu=S.iw("{{}}",M.fX("bind",a,b))
-return v}z=z.a
-return z==null?null:new M.PW(z,null,null)},
-KH:function(a,b,c,d){var z,y,x,w,v,u,t
-if(b.gqz()){z=b.HH(0)
-y=z!=null?z.$3(d,c,!0):b.Pn(0).Tl(d)
-return b.gaW()?y:b.qm(y)}x=J.U6(b)
-w=x.gB(b)
-if(typeof w!=="number")return H.s(w)
-v=Array(w)
-v.fixed$length=init
-w=v.length
-u=0
-while(!0){t=x.gB(b)
-if(typeof t!=="number")return H.s(t)
-if(!(u<t))break
-z=b.HH(u)
-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)},
-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)
-else{x=b.Pn(0)
-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.Qw(y,b.gEO(),null,null,null)}x=$.ps
-$.ps=x+1
-y=new L.ww(null,[],x,null,null,null)
-y.Wf=[]
-x=J.U6(b)
-v=0
-while(!0){w=x.gB(b)
-if(typeof w!=="number")return H.s(w)
-if(!(v<w))break
-c$0:{u=b.AX(v)
-z=b.HH(v)
-if(z!=null){t=z.$3(d,c,u)
-if(u===!0)y.ti(t)
-else{if(y.GX!=null||y.cb==null)H.vh(P.w("Cannot add observers once started."))
-J.mu(t,y.gjM())
-w=y.cb
-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.Qw(y,b.gEO(),null,null,null)},
-mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p
-z=J.RE(b)
-y=z.gCd(b)
-x=!!J.x(a).$isvy?a:M.Ky(a)
-for(w=J.U6(y),v=J.RE(x),u=0;u<w.gB(y);u+=2){t=w.t(y,u)
-s=w.t(y,u+1)
-r=v.nR(x,t,M.GZ(t,s,a,c),s.geq())
-if(r!=null&&!0)d.push(r)}v.Vz(x)
-if(!z.$isqf)return
-q=M.Ky(a)
-q.sQ2(c)
-p=q.A5(b)
-if(p!=null&&!0)d.push(p)},
-Ky:function(a){var z,y,x,w
-z=$.cm()
-z.toString
-y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.J4())
-if(x!=null)return x
-w=J.x(a)
-if(!!w.$isMi)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.bH(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,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$ismw?new M.XT(a,null,null):new M.vy(a,null,null)
-z.u(0,a,x)
-return x},
-CF: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
-return z},
-vE:{
-"^":"a;cJ",
-US:function(a,b,c){return},
-static:{"^":"ac"}},
-V2:{
-"^":"vy;rF,Cd,Vw",
-nR:function(a,b,c,d){var z,y,x,w,v,u
-z={}
-z.a=b
-y=this.grF()
-x=J.x(y)
-w=!!x.$isQlt&&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.VT(v,"?")
-if(u){x.gQg(y).Rz(0,z.a)
-x=z.a
-w=J.U6(x)
-z.a=w.Nj(x,0,J.bI(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
-x=new M.IoZ(z,this,u)
-x.$1(J.mu(c,x))}z=z.a
-return $.rK?this.Un(z,c):c},
-nD:[function(a){var z,y,x,w,v,u,t,s
-z=this.grF()
-y=J.RE(z)
-x=y.gBy(z)
-w=J.x(x)
-if(!!w.$isbs){v=J.C5(M.Ky(x))
-if(v!=null){u=J.UQ(v,"value")
-if(!!J.x(u).$isb2){t=x.value
-s=u}else{t=null
-s=null}}else{t=null
-s=null}}else{t=null
-s=null}y.sP(z,a==null?"":H.d(a))
-if(s!=null&&!J.xC(w.gP(x),t)){y=w.gP(x)
-J.ta(s.gvt(),y)}},"$1","ge2",2,0,20,58]},
-IoZ:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,65,"call"],
-$isEH:true},
-b2:{
-"^":"Ap;rF<,E3,vt<,jS",
-zJ:[function(a){return M.pw(this.rF,a,this.jS)},"$1","ghZ",2,0,20,58],
-O2A:[function(a){var z,y,x,w,v
-switch(this.jS){case"value":z=J.Vm(this.rF)
-J.ta(this.vt,z)
-break
-case"checked":z=this.rF
-y=J.RE(z)
-x=y.gd4(z)
-J.ta(this.vt,x)
-if(!!y.$isMi&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
-v=J.UQ(J.C5(!!J.x(w).$isvy?w:M.Ky(w)),"checked")
-if(v!=null)J.ta(v,!1)}break
-case"selectedIndex":z=J.Lr(this.rF)
-J.ta(this.vt,z)
-break}O.N0()},"$1","gCL",2,0,20,1],
-TR:function(a,b){return J.mu(this.vt,b)},
-gP:function(a){return J.Vm(this.vt)},
-sP:function(a,b){J.ta(this.vt,b)
-return b},
-S6:function(a){var z=this.E3
-if(z!=null){z.ed()
-this.E3=null}z=this.vt
-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)
-return
-case"selectedIndex":J.dk(a,M.h5(b))
-return
-case"value":J.ta(a,b==null?"":H.d(b))
-return}},IP:function(a){var z=J.x(a)
-if(!!z.$isQlt)return H.VM(new W.eu(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.gEr(a)
-case"range":if(J.x5(window.navigator.userAgent,new H.VR("Trident|MSIE",H.ol("Trident|MSIE",!1,!0,!1),null,null)))return z.gEr(a)
-break}return z.gLm(a)},pt:function(a){var z,y,x
-z=J.RE(a)
-if(z.gMB(a)!=null){z=z.gMB(a)
-z.toString
-z=new W.wi(z)
-return z.ad(z,new M.qx(a))}else{y=M.y9(a)
-if(y==null)return C.dn
-x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ad(x,new M.y4(a))}},h5:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
-return typeof a==="number"&&Math.floor(a)===a?a:0}}},
-Ufa:{
-"^":"Tp:69;",
-$0:function(){var z,y,x,w,v
-z=document.createElement("div",null).appendChild(W.ED(null))
-y=J.RE(z)
-y.st5(z,"checkbox")
-x=[]
-w=y.gVl(z)
-H.VM(new W.Ov(0,w.DK,w.Ph,W.aF(new M.pp(x)),w.Sg),[H.Kp(w,0)]).Zz()
-y=y.gEr(z)
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(new M.ik(x)),y.Sg),[H.Kp(y,0)]).Zz()
-y=window
-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)},
-$isEH:true},
-pp:{
-"^":"Tp:13;a",
-$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-ik:{
-"^":"Tp:13;b",
-$1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-qx:{
-"^":"Tp:13;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.O6(z)
-z=y==null?z==null:y===z}else z=!1
-else z=!1
-else z=!1
-return z},
-$isEH:true},
-y4:{
-"^":"Tp:13;b",
-$1:function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},
-$isEH:true},
-LG:{
-"^":"Tp:13;",
-$1:function(a){return 0},
-$isEH:true},
-ee:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z,y,x
-z=J.x(b)
-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}z=this.rF
-y=new M.b2(z,null,c,b)
-y.E3=M.IP(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return this.Un(b,y)}},
-PW:{
-"^":"a;Cd>,ks>,jb>",
-ghK:function(){return!1},
-JW: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]}},
-qf:{
-"^":"PW;qd,fu,cw,Cd,ks,jb",
-ghK:function(){return!0},
-$isqf:true},
-vy:{
-"^":"a;rF<,Cd*,Vw?",
-nR:function(a,b,c,d){var z
-window
-z="Unhandled binding to Node: "+H.a5(this)+" "+H.d(b)+" "+H.d(c)+" "+d
-if(typeof console!="undefined")console.error(z)
-return},
-Vz:function(a){},
-gCn:function(a){var z=this.Vw
-if(z!=null);else if(J.Lp(this.grF())!=null){z=J.Lp(this.grF())
-z=J.fe(!!J.x(z).$isvy?z:M.Ky(z))}else z=null
-return z},
-Un:function(a,b){var z,y
-z=this.Cd
-if(z==null){z=P.Fl(null,null)
-this.Cd=z}y=z.t(0,a)
-if(y!=null)J.x0(y)
-this.Cd.u(0,a,b)
-return b},
-$isvy:true},
-DH:{
-"^":"a;k8>,EA,Po"},
-ug:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z,y,x
-if(J.xC(b,"selectedindex"))b="selectedIndex"
-z=J.x(b)
-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}z=this.rF
-y=new M.b2(z,null,c,b)
-y.E3=M.IP(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return this.Un(b,y)}},
-DT:{
-"^":"V2;Q2?,nF,os<,xU,q4?,IO?,M5?,le,VZ,q8,rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z
-if(!J.xC(b,"ref"))return M.V2.prototype.nR.call(this,this,b,c,d)
-z=d?c:J.mu(c,new M.pi(this))
-J.Vs(this.rF).MW.setAttribute("ref",z)
-this.aX()
-if(d)return
-return this.Un("ref",c)},
-A5:function(a){var z=this.os
-if(z!=null)z.NC()
-if(a.qd==null&&a.fu==null&&a.cw==null){z=this.os
-if(z!=null){z.S6(0)
-this.os=null}return}z=this.os
-if(z==null){z=new M.aY(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
-this.os=z}z.dE(a,this.Q2)
-J.ZW($.pT(),this.rF,["ref"],!0)
-return this.os},
-ZK:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-if(c==null)c=this.nF
-z=this.q8
-if(z==null){z=this.gNK()
-z=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
-this.q8=z}y=J.RE(z)
-if(y.gPZ(z)==null)return $.zl()
-x=c==null?$.HT():c
-w=x.cJ
-if(w==null){w=H.VM(new P.qo(null),[null])
-x.cJ=w}v=w.t(0,z)
-if(v==null){v=M.Lj(z,x)
-x.cJ.u(0,z,v)}w=this.le
-if(w==null){u=J.Do(this.rF)
-w=$.Lu()
-t=w.t(0,u)
-if(t==null){t=u.implementation.createHTMLDocument("")
-$.AA().u(0,t,!0)
-M.lo(t)
-w.u(0,u,t)}this.le=t
-w=t}s=J.mx(w)
-w=[]
-r=new M.NK(w,null,null,null)
-q=$.It()
-r.Ci=this.rF
-r.O5=z
-q.u(0,s,r)
-p=new M.DH(b,null,null)
-M.Ky(s).sVw(p)
-for(o=y.gPZ(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
-l=z?v.JW(n):null
-k=M.X7(o,s,this.le,l,b,c,w,null)
-M.Ky(k).sVw(p)
-if(m)r.Qo=k}p.EA=s.firstChild
-p.Po=s.lastChild
-r.O5=null
-r.Ci=null
-return s},
-gk8:function(a){return this.Q2},
-gzH:function(a){return this.nF},
-szH:function(a,b){var z
-if(this.nF!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
-this.nF=b
-this.VZ=null
-z=this.os
-if(z!=null){z.Wv=!1
-z.LH=null
-z.TC=null}},
-aX:function(){var z,y
-if(this.os!=null){z=this.q8
-y=this.gNK()
-y=J.NQ(!!J.x(y).$isvy?y:M.Ky(y))
-y=z==null?y==null:z===y
-z=y}else z=!0
-if(z)return
-this.q8=null
-this.os.Io(null)
-this.os.vr(null)},
-V1:function(a){var z,y
-this.Q2=null
-this.nF=null
-z=this.Cd
-if(z!=null){y=z.Rz(0,"ref")
-if(y!=null)J.x0(y)}this.q8=null
-z=this.os
-if(z==null)return
-z.Io(null)
-this.os.S6(0)
-this.os=null},
-gNK:function(){var z,y
-this.GC()
-z=M.cS(this.rF,J.Vs(this.rF).MW.getAttribute("ref"))
-if(z==null){z=this.q4
-if(z==null)return this.rF}y=M.Ky(z).gNK()
-return y!=null?y:z},
-gjb:function(a){var z
-this.GC()
-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()
-M.HS()
-this.M5=!0
-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.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
-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
-w=J.RE(x)
-t=w.gM0(x).createElement("template",null)
-w.gBy(x).insertBefore(t,x)
-t.toString
-new W.E9(t).FV(0,w.gQg(x))
-w.gQg(x).V1(0)
-w.wg(x)
-v=!!J.x(t).$isvy?t:M.Ky(t)
-v.sM5(!0)
-z=!!J.x(v.grF()).$isOH}else{v=this
-z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sIO(J.mx(M.TA(v.grF())))
-if(a!=null)v.sq4(a)
-else if(y)M.O1(v,this.rF,u)
-else M.GM(J.NQ(v))
-return!0},
-GC:function(){return this.bt(null)},
-$isDT:true,
-static:{"^":"mn,EW,YO,vU,xV,kY",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},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)
-for(x=C.Nm.br(z.gQg(a).gvc()),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=x.lo
-switch(w){case"template":v=z.gQg(a).MW
-v.getAttribute(w)
-v.removeAttribute(w)
-break
-case"repeat":case"bind":case"ref":y.toString
-v=z.gQg(a).MW
-u=v.getAttribute(w)
-v.removeAttribute(w)
-y.setAttribute(w,u)
-break}}return y},O1:function(a,b,c){var z,y,x,w
-z=J.NQ(a)
-if(c){J.TQ(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,$.Ze())
-if(M.CF(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($.Ze())+" { display: none; }")
-document.head.appendChild(z)},HS:function(){var z,y
-if($.xV===!0)return
-$.xV=!0
-z=document.createElement("template",null)
-if(!!J.x(z).$isOH){y=z.content.ownerDocument
-if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
-if(J.m5(y).querySelector("base")==null)M.lo(y)}},lo:function(a){var z=a.createElement("base",null)
-J.O5(z,document.baseURI)
-J.m5(a).appendChild(z)}}},
-pi:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-J.Vs(z.rF).MW.setAttribute("ref",a)
-z.aX()},"$1",null,2,0,null,202,"call"],
-$isEH:true},
-CE:{
-"^":"Tp:20;",
-$1:function(a){if(!M.Ky(a).bt(null))M.GM(J.NQ(!!J.x(a).$isvy?a:M.Ky(a)))},
-$isEH:true},
-MdQ:{
-"^":"Tp:13;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-DOe:{
-"^":"Tp:77;",
-$2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.Ky(J.l2(z.gl())).aX()},"$2",null,4,0,null,161,14,"call"],
-$isEH:true},
-lPa:{
-"^":"Tp:69;",
-$0:function(){var z=document.createDocumentFragment()
-$.It().u(0,z,new M.NK([],null,null,null))
-return z},
-$isEH:true},
-NK:{
-"^":"a;u2<,Qo<,Ci<,O5<"},
-aR:{
-"^":"Tp:13;a,b,c",
-$1:function(a){return this.c.US(a,this.a,this.b)},
-$isEH:true},
-Uk:{
-"^":"Tp:77;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")
-else z=!1
-if(z)return
-y=S.iw(b,M.fX(a,this.b,this.c))
-if(y!=null){z=this.a
-x=z.a
-if(x==null){w=[]
-z.a=w
-z=w}else z=x
-z.push(a)
-z.push(y)}},
-$isEH:true},
-aY:{
-"^":"Ap;bE,Rj,vy,qg,ky,vL,wC,D2,cM,qe,ur,VC,Wv,LH,TC",
-RV:function(a){return this.LH.$1(a)},
-TR:function(a,b){return H.vh(P.w("binding already opened"))},
-gP:function(a){return this.wC},
-NC:function(){var z,y
-z=this.vL
-y=J.x(z)
-if(!!y.$isAp){y.S6(z)
-this.vL=null}z=this.wC
-y=J.x(z)
-if(!!y.$isAp){y.S6(z)
-this.wC=null}},
-dE:function(a,b){var z,y,x
-this.NC()
-z=this.bE.rF
-y=a.qd
-x=y!=null
-this.D2=x
-this.cM=a.cw!=null
-if(x){this.qe=y.eq
-y=M.GZ("if",y,z,b)
-this.vL=y
-if(this.qe===!0){if(!(null!=y&&!1!==y)){this.vr(null)
-return}}else H.Go(y,"$isAp").TR(0,this.gNt())}if(this.cM===!0){y=a.cw
-this.ur=y.eq
-y=M.GZ("repeat",y,z,b)
-this.wC=y}else{y=a.fu
-this.ur=y.eq
-y=M.GZ("bind",y,z,b)
-this.wC=y}if(this.ur!==!0)J.mu(y,this.gNt())
-this.vr(null)},
-vr:[function(a){var z,y
-if(this.D2===!0){z=this.vL
-if(this.qe!==!0){H.Go(z,"$isAp")
-z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
-return}}y=this.wC
-if(this.ur!==!0){H.Go(y,"$isAp")
-y=y.gP(y)}this.Io(this.cM!==!0?[y]:y)},"$1","gNt",2,0,20,14],
-Io:function(a){var z,y
-z=J.x(a)
-if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
-z=this.vy
-if(a===z)return
-this.Ke()
-this.qg=a
-if(!!J.x(a).$iswn&&this.cM===!0&&this.ur!==!0){if(a.gb3()!=null)a.sb3([])
-this.VC=a.gQV().yI(this.gU0())}y=this.qg
-y=y!=null?y:[]
-this.Vi(G.jj(y,0,J.q8(y),z,0,z.length))},
-xS:function(a){var z,y,x,w
-if(J.xC(a,-1))return this.bE.rF
-z=$.It()
-y=this.Rj
-if(a>>>0!==a||a>=y.length)return H.e(y,a)
-x=z.t(0,y[a]).gQo()
-if(x==null)return this.xS(a-1)
-if(!M.CF(x)||x===this.bE.rF)return x
-w=M.Ky(x).gos()
-if(w==null)return x
-return w.xS(w.Rj.length-1)},
-ne:function(a){var z,y,x,w,v,u,t
-z=this.xS(J.bI(a,1))
-y=this.xS(a)
-J.TmB(this.bE.rF)
-x=C.Nm.KI(this.Rj,a)
-for(w=J.RE(x),v=J.RE(z);!J.xC(y,z);){u=v.guD(z)
-if(u==null?y==null:u===y)y=z
-t=u.parentNode
-if(t!=null)t.removeChild(u)
-w.mx(x,u)}return x},
-Vi:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
-if(this.ky||J.FN(a)===!0)return
-u=this.bE
-t=u.rF
-if(J.TmB(t)==null){this.S6(0)
-return}s=this.vy
-Q.Y5(s,this.qg,a)
-z=u.nF
-if(!this.Wv){this.Wv=!0
-r=J.Xp(!!J.x(u.rF).$isDT?u.rF:u)
-if(r!=null){this.LH=r.Mn.CE(t)
-this.TC=null}}q=P.YM(P.N3R(),null,null,null,null)
-for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
-for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.lo
-i=this.ne(J.ew(k.gvH(m),n))
-if(!J.xC(i,$.zl()))q.u(0,j,i)}l=m.gNg()
-if(typeof l!=="number")return H.s(l)
-n-=l}for(p=p.gA(a);p.G();){m=p.gl()
-for(o=J.RE(m),h=o.gvH(m);J.u6(h,J.ew(o.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
-y=s[h]
-x=q.Rz(0,y)
-if(x==null)try{if(this.LH!=null)y=this.RV(y)
-if(y==null)x=$.zl()
-else x=u.ZK(0,y,z)}catch(g){l=H.Ru(g)
-w=l
-v=new H.XO(g,null)
-l=new P.Gc(0,$.X3,null,null,null,null,null,null)
-l.$builtinTypeInfo=[null]
-new P.Zf(l).$builtinTypeInfo=[null]
-k=w
-if(k==null)H.vh(P.u("Error must not be null"))
-if(l.Gv!==0)H.vh(P.w("Future already completed"))
-l.CG(k,v)
-x=$.zl()}l=x
-f=this.xS(h-1)
-e=J.TmB(u.rF)
-C.Nm.xe(this.Rj,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Kp(u,0),H.Kp(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,203,204],
-Ep:[function(a){var z,y,x
-z=$.It()
-z.toString
-y=H.of(a,"expando$values")
-x=(y==null?null:H.of(y,z.J4())).gu2()
-z=new H.a7(x,x.length,0,null)
-z.$builtinTypeInfo=[H.Kp(x,0)]
-for(;z.G();)J.x0(z.lo)},"$1","gV6",2,0,205],
-Ke:function(){var z=this.VC
-if(z==null)return
-z.ed()
-this.VC=null},
-S6:function(a){var z
-if(this.ky)return
-this.Ke()
-z=this.Rj
-H.bQ(z,this.gV6())
-C.Nm.sB(z,0)
-this.NC()
-this.bE.os=null
-this.ky=!0}},
-XT:{
-"^":"vy;rF,Cd,Vw",
-nR:function(a,b,c,d){var z
-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}z=this.gmt()
-z.$1(J.mu(c,z))
-return $.rK?this.Un(b,c):c},
-ux:[function(a){var z=a==null?"":H.d(a)
-J.t3(this.rF,z)},"$1","gmt",2,0,13,21]},
-bH:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z,y,x
-if(!J.xC(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}z=this.rF
-y=new M.b2(z,null,c,b)
-y.E3=M.IP(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return $.rK?this.Un(b,y):y}}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
-"^":"",
-jb:{
-"^":"a;iB,eq<,O0",
-gqz:function(){return this.iB.length===5},
-gaW:function(){var z,y
-z=this.iB
-y=z.length
-if(y===5){if(0>=y)return H.e(z,0)
-if(J.xC(z[0],"")){if(4>=z.length)return H.e(z,4)
-z=J.xC(z[4],"")}else z=!1}else z=!1
-return z},
-gEO:function(){return this.O0},
-qm:function(a){return this.gEO().$1(a)},
-gB:function(a){return C.jn.cU(this.iB.length,4)},
-AX:function(a){var z,y
-z=this.iB
-y=a*4+1
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-Pn:function(a){var z,y
-z=this.iB
-y=a*4+2
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-HH:function(a){var z,y
-z=this.iB
-y=a*4+3
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-ln:[function(a){var z,y,x,w
-if(a==null)a=""
-z=this.iB
-if(0>=z.length)return H.e(z,0)
-y=H.d(z[0])+H.d(a)
-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","geb",2,0,206,21],
-Xb:[function(a){var z,y,x,w,v,u,t,s
-z=this.iB
-if(0>=z.length)return H.e(z,0)
-y=P.p9(z[0])
-x=C.jn.cU(z.length,4)
-for(w=J.U6(a),v=0;v<x;){u=w.t(a,v)
-if(u!=null)y.vM+=typeof u==="string"?u:H.d(u);++v
-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","gqt",2,0,207,208],
-l3:function(a,b){this.O0=this.iB.length===5?this.geb():this.gqt()},
-static:{"^":"rz5,xN8,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)
-s=C.xB.XU(a,"[[",v)
-if(s>=0)r=t<0||s<t
-else r=!1
-if(r){t=s
-q=!0
-p="]]"}else{q=!1
-p="}}"}o=t>=0?C.xB.XU(a,p,t+2):-1
-if(o<0){if(w==null)return
-w.push(C.xB.yn(a,v))
-break}if(w==null)w=[]
-w.push(C.xB.Nj(a,v,t))
-n=C.xB.bS(C.xB.Nj(a,t+2,o))
-w.push(q)
-u=u&&q
-m=y?null:b.$1(n)
-if(m==null)w.push(L.hk(n))
-else w.push(null)
-w.push(m)
-v=o+2}if(v===z)w.push("")
-y=new S.jb(w,u,null)
-y.l3(w,u)
-return y}}}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
-"^":"",
-I5:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{pn:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.u2.ZL(a)
-C.u2.XI(a)
-return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
-"^":"",
-el:{
-"^":"V49;uB,lc,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.r0(a.uB).Qy(b)},"$1","gvC",2,0,20,90],
-static:{oH:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.dm.ZL(a)
-C.dm.XI(a)
-return a}}},
-V49:{
-"^":"uL+Pi;",
-$isd3:true}}],])
-I.$finishClasses($$,$,null)
-$$=null
-P.KN.$isKN=true
-P.KN.$isRz=true
-P.KN.$asRz=[P.FK]
-P.KN.$isa=true
-P.CP.$isCP=true
-P.CP.$isRz=true
-P.CP.$asRz=[P.FK]
-P.CP.$isa=true
-W.KV.$isKV=true
-W.KV.$isa=true
-W.vKL.$isa=true
-W.QI.$isa=true
-P.qU.$isqU=true
-P.qU.$isRz=true
-P.qU.$asRz=[P.qU]
-P.qU.$isa=true
-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.$isRz=true
-P.a6.$asRz=[P.a6]
-P.a6.$isa=true
-W.h4.$ish4=true
-W.h4.$isKV=true
-W.h4.$isa=true
-P.WO.$isWO=true
-P.WO.$isQV=true
-P.WO.$isa=true
-P.oz.$isa=true
-P.a.$isa=true
-P.ns.$isa=true
-K.Aep.$isAep=true
-K.Aep.$isa=true
-U.mc.$ishw=true
-U.mc.$isa=true
-U.cJ.$ishw=true
-U.cJ.$isa=true
-U.uku.$ishw=true
-U.uku.$isa=true
-U.fp.$isfp=true
-U.fp.$ishw=true
-U.fp.$isa=true
-U.ae.$ishw=true
-U.ae.$isa=true
-U.Qb.$ishw=true
-U.Qb.$isa=true
-U.c0.$ishw=true
-U.c0.$isa=true
-U.no.$ishw=true
-U.no.$isa=true
-U.Nb.$ishw=true
-U.Nb.$isa=true
-U.zX.$iszX=true
-U.zX.$ishw=true
-U.zX.$isa=true
-U.x9.$ishw=true
-U.x9.$isa=true
-U.EO.$isEO=true
-U.EO.$ishw=true
-U.EO.$isa=true
-P.GD.$isGD=true
-P.GD.$isa=true
-P.uq.$isuq=true
-P.uq.$isa=true
-N.Rw.$isa=true
-T.yj.$isyj=true
-T.yj.$isa=true
-W.tV.$ish4=true
-W.tV.$isKV=true
-W.tV.$isa=true
-G.DA.$isDA=true
-G.DA.$isa=true
-G.Y2.$isY2=true
-G.Y2.$isa=true
-F.d3.$isa=true
-A.XP.$isa=true
-W.AjY.$isAjY=true
-W.AjY.$isea=true
-W.AjY.$isa=true
-P.a2.$isa2=true
-P.a2.$isa=true
-G.uG.$isa=true
-P.oh.$isa=true
-D.af.$isaf=true
-D.af.$isa=true
-D.bv.$isaf=true
-D.bv.$isa=true
-W.f5.$isf5=true
-W.f5.$isea=true
-W.f5.$isa=true
-D.Fc.$isa=true
-D.ER.$isa=true
-D.dy.$isdy=true
-D.dy.$isaf=true
-D.dy.$isa=true
-D.vO.$isvO=true
-D.vO.$isaf=true
-D.vO.$isqC=true
-D.vO.$asqC=[null,null]
-D.vO.$isZ0=true
-D.vO.$asZ0=[null,null]
-D.vO.$isa=true
-D.DP.$isa=true
-D.uA.$isa=true
-D.U4.$isaf=true
-D.U4.$isa=true
-D.vx.$isvx=true
-D.vx.$isaf=true
-D.vx.$isa=true
-D.c2.$isa=true
-W.fJ.$isfJ=true
-W.fJ.$isa=true
-W.kf.$isea=true
-W.kf.$isa=true
-D.kx.$iskx=true
-D.kx.$isaf=true
-D.kx.$isa=true
-D.t9.$isa=true
-D.xb.$isa=true
-W.AW.$isea=true
-W.AW.$isa=true
-L.Tv.$isTv=true
-L.Tv.$isa=true
-K.GK.$isa=true
-N.HV.$isHV=true
-N.HV.$isa=true
-H.yo.$isa=true
-H.IY.$isa=true
-H.aX.$isa=true
-W.I0.$isAj=true
-W.I0.$isKV=true
-W.I0.$isa=true
-W.ea.$isea=true
-W.ea.$isa=true
-P.cb.$iscb=true
-P.cb.$isa=true
-P.Oy.$isOy=true
-P.Oy.$isa=true
-Y.qS.$isa=true
-U.hw.$ishw=true
-U.hw.$isa=true
-G.Ni.$isa=true
-P.AN.$isAN=true
-P.AN.$isa=true
-P.dl.$isdl=true
-P.dl.$isa=true
-P.mE.$ismE=true
-P.mE.$isa=true
-V.qC.$isqC=true
-V.qC.$isZ0=true
-V.qC.$isa=true
-P.KA.$isKA=true
-P.KA.$isNOT=true
-P.KA.$isOy=true
-P.KA.$isa=true
-P.LR.$isLR=true
-P.LR.$isKA=true
-P.LR.$isNOT=true
-P.LR.$isOy=true
-P.LR.$isa=true
-P.Rz.$isRz=true
-P.Rz.$isa=true
-P.Ob.$isOb=true
-P.Ob.$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.NOT.$isNOT=true
-P.NOT.$isa=true
-P.ti.$isti=true
-P.ti.$isa=true
-P.iP.$isiP=true
-P.iP.$isRz=true
-P.iP.$asRz=[null]
-P.iP.$isa=true
-A.Ap.$isAp=true
-A.Ap.$isa=true
-O.Hz.$isHz=true
-O.Hz.$isa=true
-D.N7.$isN7=true
-D.N7.$isaf=true
-D.N7.$isa=true
-D.EP.$isEP=true
-D.EP.$isaf=true
-D.EP.$isa=true
-A.ES.$isES=true
-A.ES.$isa=true
-A.Wq.$isWq=true
-A.Wq.$isa=true
-L.qK.$isqK=true
-L.qK.$isAp=true
-L.qK.$isa=true
-W.Aj.$isAj=true
-W.Aj.$isKV=true
-W.Aj.$isa=true
-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.kdQ.prototype
-return a}
-J.RE=function(a){if(a==null)return a
-if(typeof a!="object")return a
-if(a instanceof P.a)return 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.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
-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.kdQ.prototype
-return a}
-J.w1=function(a){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.m0(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
-return J.Yn.prototype}if(typeof a=="string")return J.O.prototype
-if(a==null)return J.CDU.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.m0(a)}
-J.A4=function(a,b){return J.RE(a).sjx(a,b)}
-J.A6=function(a){return J.RE(a).gG3(a)}
-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.AL=function(a){return J.RE(a).gW6(a)}
-J.Ac=function(a,b){return J.RE(a).siZ(a,b)}
-J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
-J.Aw=function(a){return J.RE(a).gb6(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.BZ=function(a){return J.RE(a).gnv(a)}
-J.Bj=function(a,b){return J.RE(a).Tk(a,b)}
-J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
-return J.Wx(a).E(a,b)}
-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.C5=function(a){return J.RE(a).gCd(a)}
-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.Co=function(a,b){return J.RE(a).szH(a,b)}
-J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
-J.DB=function(a){return J.RE(a).gn0(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)}
-J.Dd=function(a){return J.RE(a).gLe(a)}
-J.Dh=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
-J.Dn=function(a,b){return J.w1(a).zV(a,b)}
-J.Do=function(a){return J.RE(a).gM0(a)}
-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.EK=function(a,b){return J.RE(a).ps(a,b)}
-J.Ec=function(a){return J.RE(a).gMZ(a)}
-J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
-J.Ei=function(a){return J.RE(a).gI(a)}
-J.Er=function(a,b){return J.RE(a).sfY(a,b)}
-J.Ew=function(a){return J.RE(a).gkm(a)}
-J.F8=function(a){return J.RE(a).gjO(a)}
-J.FI=function(a,b,c,d){return J.RE(a).YJ(a,b,c,d)}
-J.FN=function(a){return J.U6(a).gl0(a)}
-J.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
-J.Fd=function(a){return J.RE(a).gi6(a)}
-J.G0=function(a,b,c){return J.U6(a).XU(a,b,c)}
-J.GH=function(a){return J.RE(a).gyW(a)}
-J.GL=function(a){return J.RE(a).gfN(a)}
-J.GW=function(a){return J.RE(a).gVY(a)}
-J.Gl=function(a){return J.RE(a).ghy(a)}
-J.H3=function(a,b){return J.RE(a).sZA(a,b)}
-J.H4=function(a,b){return J.RE(a).wR(a,b)}
-J.HB=function(a){return J.RE(a).gxT(a)}
-J.HF=function(a){return J.RE(a).gD7(a)}
-J.HO=function(a){return J.RE(a).gWw(a)}
-J.Hn=function(a,b){return J.RE(a).sxT(a,b)}
-J.I2=function(a){return J.RE(a).gwv(a)}
-J.IO=function(a){return J.RE(a).gRH(a)}
-J.IR=function(a){return J.RE(a).gYt(a)}
-J.IX=function(a,b){return J.RE(a).sEu(a,b)}
-J.Iz=function(a){return J.RE(a).gfY(a)}
-J.J0=function(a){return J.RE(a).gfq(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.JR=function(a){return J.RE(a).gcK(a)}
-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.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)}
-J.K2=function(a){return J.RE(a).gtN(a)}
-J.KD=function(a,b){return J.RE(a).j3(a,b)}
-J.Kd=function(a){return J.RE(a).gCF(a)}
-J.Kl=function(a){return J.RE(a).gBP(a)}
-J.Kn=function(a){return J.Wx(a).yu(a)}
-J.Kr=function(a){return J.RE(a).e6(a)}
-J.Kz=function(a,b){return J.RE(a).sni(a,b)}
-J.L7=function(a){return J.RE(a).gY9(a)}
-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.LH=function(a,b){return J.w1(a).GT(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.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.Lm=function(a){return J.x(a).gbx(a)}
-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.MO=function(a,b,c){return J.RE(a).ZK(a,b,c)}
-J.MQ=function(a){return J.w1(a).grZ(a)}
-J.MX=function(a,b){return J.RE(a).sPj(a,b)}
-J.Me=function(a,b){return J.w1(a).aN(a,b)}
-J.Mp=function(a){return J.w1(a).wg(a)}
-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,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.NV=function(a,b){return J.RE(a).RR(a,b)}
-J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
-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.No=function(a,b){return J.RE(a).sR(a,b)}
-J.Nq=function(a){return J.RE(a).gGc(a)}
-J.O2=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.O5=function(a,b){return J.RE(a).smH(a,b)}
-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.OT=function(a){return J.RE(a).gXE(a)}
-J.OY=function(a){return J.RE(a).gJD(a)}
-J.Ok=function(a){return J.RE(a).ghU(a)}
-J.P2=function(a,b){return J.RE(a).sU4(a,b)}
-J.P5=function(a){return J.RE(a).gHo(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.Pj=function(a,b,c,d){return J.RE(a).ea(a,b,c,d)}
-J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
-J.Pp=function(a,b){return J.rY(a).j(a,b)}
-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,b){return J.RE(a).sM3(a,b)}
-J.QP=function(a){return J.RE(a).gWq(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.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.R7=function(a,b){return J.U6(a).u8(a,b)}
-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.Rx=function(a,b){return J.RE(a).sEl(a,b)}
-J.Ry=function(a){return J.RE(a).gLW(a)}
-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.SO=function(a,b){return J.RE(a).sCF(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.So=function(a,b){return J.RE(a).X3(a,b)}
-J.Sz=function(a){return J.RE(a).gUx(a)}
-J.T5=function(a,b){return J.RE(a).stT(a,b)}
-J.TG=function(a){return J.RE(a).mC(a)}
-J.TQ=function(a,b){return J.RE(a).mx(a,b)}
-J.TY=function(a){return J.RE(a).gvp(a)}
-J.TmB=function(a){return J.RE(a).gBy(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.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)}
-J.UP=function(a){return J.RE(a).gnZ(a)}
-J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.Gp(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
-return J.U6(a).t(a,b)}
-J.UT=function(a){return J.RE(a).gDQ(a)}
-J.UU=function(a){return J.RE(a).gjT(a)}
-J.V1=function(a,b){return J.w1(a).Rz(a,b)}
-J.VA=function(a,b){return J.w1(a).Vr(a,b)}
-J.VL=function(a){return J.RE(a).gR2(a)}
-J.VT=function(a,b){return J.rY(a).Tc(a,b)}
-J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
-J.Vf=function(a){return J.RE(a).gVE(a)}
-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.Vs=function(a){return J.RE(a).gQg(a)}
-J.W2=function(a){return J.RE(a).gCf(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.Wp=function(a){return J.RE(a).gQU(a)}
-J.XF=function(a,b){return J.RE(a).siC(a,b)}
-J.XJ=function(a){return J.RE(a).gRY(a)}
-J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
-J.Xp=function(a){return J.RE(a).gzH(a)}
-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)}
-J.Z2=function(a){return J.RE(a).dQ(a)}
-J.Z6=function(a){return J.RE(a).gV5(a)}
-J.ZH=function(a){return J.RE(a).gk8(a)}
-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.ZW=function(a,b,c,d){return J.RE(a).MS(a,b,c,d)}
-J.ZZ=function(a,b){return J.rY(a).yn(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.avD=function(a,b,c,d,e){return J.RE(a).dF(a,b,c,d,e)}
-J.aw=function(a,b){return J.RE(a).sNN(a,b)}
-J.bI=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
-return J.Wx(a).W(a,b)}
-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.bu=function(a){return J.RE(a).gyw(a)}
-J.cG=function(a){return J.RE(a).Ki(a)}
-J.cI=function(a,b){return J.Wx(a).Sy(a,b)}
-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.cV=function(a,b){return J.RE(a).sjT(a,b)}
-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)}
-J.dY=function(a){return J.RE(a).ga4(a)}
-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.eU=function(a){return J.RE(a).gRh(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.fR=function(a,b){return J.RE(a).sMZ(a,b)}
-J.fU=function(a){return J.RE(a).gDX(a)}
-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.fe=function(a){return J.RE(a).gCn(a)}
-J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
-J.fv=function(a,b){return J.RE(a).sUx(a,b)}
-J.fw=function(a){return J.RE(a).gEl(a)}
-J.fy=function(a){return J.RE(a).gIF(a)}
-J.h9=function(a,b){return J.RE(a).sWA(a,b)}
-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.i0=function(a,b){return J.RE(a).sPB(a,b)}
-J.i9=function(a,b){return J.w1(a).Zv(a,b)}
-J.iA=function(a,b,c){return J.RE(a).D9(a,b,c)}
-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.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.iv=function(a){return J.RE(a).gV2(a)}
-J.iz=function(a,b){return J.RE(a).GE(a,b)}
-J.j1=function(a){return J.RE(a).gZA(a)}
-J.jB=function(a){return J.RE(a).gpf(a)}
-J.jO=function(a,b){return J.Wx(a).Y(a,b)}
-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.k0=function(a){return J.RE(a).giZ(a)}
-J.k7=function(a){return J.RE(a).gbA(a)}
-J.kB=function(a,b){return J.RE(a).sFR(a,b)}
-J.kE=function(a){return J.w1(a).git(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)}
-J.kZ=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
-J.ki=function(a){return J.RE(a).gqK(a)}
-J.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.ks=function(a){return J.RE(a).gB1(a)}
-J.kv=function(a){return J.RE(a).glp(a)}
-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.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.m5=function(a){return J.RE(a).gQr(a)}
-J.mI=function(a,b){return J.RE(a).rW(a,b)}
-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.mZ=function(a,b,c){return J.RE(a).BG(a,b,c)}
-J.mu=function(a,b){return J.RE(a).TR(a,b)}
-J.mx=function(a){return J.RE(a).Xf(a)}
-J.my=function(a,b){return J.RE(a).sQl(a,b)}
-J.mz=function(a,b){return J.RE(a).scH(a,b)}
-J.n0=function(a,b){return J.RE(a).Rf(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.nC=function(a,b){return J.RE(a).sCd(a,b)}
-J.nG=function(a){return J.RE(a).gv8(a)}
-J.nb=function(a){return J.RE(a).gyX(a)}
-J.nq=function(a){return J.RE(a).gFL(a)}
-J.oD=function(a,b){return J.RE(a).hP(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.oN=function(a){return J.RE(a).gj4(a)}
-J.oZ=function(a){return J.RE(a).gBi(a)}
-J.on=function(a){return J.RE(a).gtT(a)}
-J.p7=function(a){return J.RE(a).guD(a)}
-J.pA=function(a,b){return J.RE(a).sYt(a,b)}
-J.pB=function(a,b){return J.w1(a).sit(a,b)}
-J.pP=function(a){return J.RE(a).gDD(a)}
-J.pU=function(a){return J.RE(a).ghN(a)}
-J.pW=function(a,b,c,d){return J.RE(a).Si(a,b,c,d)}
-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.q8=function(a){return J.U6(a).gB(a)}
-J.qA=function(a){return J.w1(a).br(a)}
-J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
-J.qd=function(a,b){return J.RE(a).sIt(a,b)}
-J.qq=function(a,b){return J.RE(a).sNG(a,b)}
-J.r0=function(a){return J.RE(a).RE(a)}
-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){return J.RE(a).gYe(a)}
-J.t3=function(a,b){return J.RE(a).sa4(a,b)}
-J.t8=function(a){return J.RE(a).gYQ(a)}
-J.tG=function(a){return J.RE(a).Zi(a)}
-J.tH=function(a,b){return J.RE(a).sHy(a,b)}
-J.tO=function(a){return J.w1(a).Jd(a)}
-J.tQ=function(a,b){return J.RE(a).swv(a,b)}
-J.ta=function(a,b){return J.RE(a).sP(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).gcH(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.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,b){return J.RE(a).sJ6(a,b)}
-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){return J.RE(a).gU4(a)}
-J.uy=function(a){return J.RE(a).gHm(a)}
-J.v1=function(a){return J.x(a).giO(a)}
-J.v8=function(a){return J.RE(a).gnp(a)}
-J.vJ=function(a,b){return J.RE(a).spM(a,b)}
-J.vP=function(a){return J.RE(a).My(a)}
-J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
-return J.Qc(a).U(a,b)}
-J.vi=function(a){return J.RE(a).gNa(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.wl=function(a,b){return J.RE(a).Ch(a,b)}
-J.wt=function(a){return J.RE(a).gP3(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
-return J.x(a).n(a,b)}
-J.xH=function(a,b){return J.RE(a).sE7(a,b)}
-J.xQ=function(a,b){return J.RE(a).sGd(a,b)}
-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.xe=function(a){return J.RE(a).gPB(a)}
-J.xq=function(a){return J.RE(a).gUj(a)}
-J.yH=function(a){return J.Wx(a).Vy(a)}
-J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yi=function(a){return J.RE(a).gbN(a)}
-J.yn=function(a){return J.RE(a).gkZ(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,b){return J.RE(a).Rg(a,b)}
-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,b){return J.w1(a).ad(a,b)}
-J.zj=function(a){return J.RE(a).gvH(a)}
-C.Df=X.hV.prototype
-C.Gkp=Y.q6.prototype
-C.C8=B.G6.prototype
-C.HR=A.wM.prototype
-C.YZz=Q.eW.prototype
-C.RD=O.eo.prototype
-C.ka=Z.aC.prototype
-C.IK=O.VY.prototype
-C.ux=F.Be.prototype
-C.O0=R.JI.prototype
-C.OD=F.ZP.prototype
-C.tT=L.nJ.prototype
-C.UF=R.Eg.prototype
-C.MC=D.i7.prototype
-C.by=A.Gk.prototype
-C.Cl=X.MJ.prototype
-C.Mh=X.Nr.prototype
-C.Xo=U.DK.prototype
-C.PJ8=N.BS.prototype
-C.Cs=O.Vb.prototype
-C.xu=K.Ly.prototype
-C.W3=W.fJ.prototype
-C.bP=E.WS.prototype
-C.hh=E.H8.prototype
-C.Ie=E.mO.prototype
-C.Ig=E.DE.prototype
-C.VLs=E.U1.prototype
-C.lX=E.ou.prototype
-C.Wa=E.av.prototype
-C.bZ=E.uz.prototype
-C.iR=E.Ma.prototype
-C.L6=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.Z4.prototype
-C.kd=D.Qh.prototype
-C.RRl=A.fl.prototype
-C.kS=X.kK.prototype
-C.LN=N.oa.prototype
-C.F2=D.IW.prototype
-C.Ji=D.Oz.prototype
-C.OoF=D.St.prototype
-C.Xe=L.qk.prototype
-C.Nm=J.Q.prototype
-C.YI=J.Yn.prototype
-C.jn=J.imn.prototype
-C.jN=J.CDU.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.yp=H.eEV.prototype
-C.kD=A.md.prototype
-C.br=A.ye.prototype
-C.IG=A.Bm.prototype
-C.nn=A.Ya.prototype
-C.J7=A.Ww.prototype
-C.t5=W.BH3.prototype
-C.BH=V.F1.prototype
-C.Pfz=Z.uL.prototype
-C.Sx=J.Ai.prototype
-C.Ki=A.xc.prototype
-C.Fa=T.ov.prototype
-C.Yj=A.kn.prototype
-C.FH=U.fI.prototype
-C.n8=R.zM.prototype
-C.Vd=D.Rk.prototype
-C.Ns=U.Ti.prototype
-C.HRc=Q.xI.prototype
-C.zb=Q.CY.prototype
-C.dX=K.nm.prototype
-C.wB=X.uw.prototype
-C.OKl=A.G1.prototype
-C.vB=J.kdQ.prototype
-C.u2=X.I5.prototype
-C.dm=U.el.prototype
-C.ma=W.K5.prototype
-C.KZ=new H.hJ()
-C.x4=new U.EO()
-C.Gw=new H.FuS()
-C.Eq=new P.qn()
-C.qY=new T.yy()
-C.ZB=new P.yRf()
-C.pr=new P.mgb()
-C.dV=new L.iNc()
-C.NU=new P.R81()
-C.dS=new P.AHi()
-C.WA=new D.WAE("Collected")
-C.l8=new D.WAE("Dart")
-C.Oc=new D.WAE("Native")
-C.yP=new D.WAE("Reused")
-C.Z7=new D.WAE("Tag")
-C.nU=new A.iYn(0)
-C.BM=new A.iYn(1)
-C.WH=new A.iYn(2)
-C.hf=new H.IN("label")
-C.Db=H.Kx('qU')
-C.NS=new K.vly()
-C.vrd=new A.hG(!1)
-I.uL=function(a){a.immutable$list=init
-a.fixed$length=init
-return a}
-C.ucP=I.uL([C.NS,C.vrd])
-C.V0=new A.ES(C.hf,C.BM,!1,C.Db,!1,C.ucP)
-C.EV=new H.IN("library")
-C.Jny=H.Kx('U4')
-C.ZQ=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.ucP)
-C.SR=new H.IN("map")
-C.MR1=H.Kx('vO')
-C.S9=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.ucP)
-C.UL=new H.IN("profileChanged")
-C.yQP=H.Kx('EH')
-C.dn=I.uL([])
-C.mM=new A.ES(C.UL,C.WH,!1,C.yQP,!1,C.dn)
-C.Ql=new H.IN("hasClass")
-C.HL=H.Kx('a2')
-C.J19=new K.nd()
-C.X0=I.uL([C.NS,C.J19])
-C.TJ=new A.ES(C.Ql,C.BM,!1,C.HL,!1,C.X0)
-C.TU=new H.IN("endPosChanged")
-C.Cp=new A.ES(C.TU,C.WH,!1,C.yQP,!1,C.dn)
-C.ne=new H.IN("exception")
-C.SNu=H.Kx('EP')
-C.rZ=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.ucP)
-C.Wm=new H.IN("refChanged")
-C.QW=new A.ES(C.Wm,C.WH,!1,C.yQP,!1,C.dn)
-C.UY=new H.IN("result")
-C.SmN=H.Kx('af')
-C.n6=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.ucP)
-C.QK=new H.IN("qualified")
-C.Yo=new A.ES(C.QK,C.BM,!1,C.HL,!1,C.ucP)
-C.SA=new H.IN("lines")
-C.hAX=H.Kx('WO')
-C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.X0)
-C.zU=new H.IN("uncheckedText")
-C.uT=new A.ES(C.zU,C.BM,!1,C.Db,!1,C.ucP)
-C.yh=new H.IN("error")
-C.k5t=H.Kx('ft')
-C.m2=new A.ES(C.yh,C.BM,!1,C.k5t,!1,C.ucP)
-C.aH=new H.IN("displayCutoff")
-C.dq=new A.ES(C.aH,C.BM,!1,C.Db,!1,C.X0)
-C.rB=new H.IN("isolate")
-C.a2p=H.Kx('bv')
-C.hR=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.X0)
-C.XA=new H.IN("cls")
-C.jF=H.Kx('dy')
-C.xY=new A.ES(C.XA,C.BM,!1,C.jF,!1,C.ucP)
-C.bz=new H.IN("isolateChanged")
-C.Bk=new A.ES(C.bz,C.WH,!1,C.yQP,!1,C.dn)
-C.CG=new H.IN("posChanged")
-C.Ml=new A.ES(C.CG,C.WH,!1,C.yQP,!1,C.dn)
-C.oUD=H.Kx('N7')
-C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
-C.Gs=new H.IN("sampleCount")
-C.iO=new A.ES(C.Gs,C.BM,!1,C.Db,!1,C.X0)
-C.oj=new H.IN("httpServer")
-C.GT=new A.ES(C.oj,C.BM,!1,C.MR1,!1,C.ucP)
-C.td=new H.IN("object")
-C.Zk=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.ucP)
-C.TW=new H.IN("tagSelector")
-C.H0=new A.ES(C.TW,C.BM,!1,C.Db,!1,C.X0)
-C.He=new H.IN("hideTagsChecked")
-C.oV=new A.ES(C.He,C.BM,!1,C.HL,!1,C.X0)
-C.zz=new H.IN("timeSpan")
-C.lS=new A.ES(C.zz,C.BM,!1,C.Db,!1,C.X0)
-C.AO=new H.IN("qualifiedName")
-C.fi=new A.ES(C.AO,C.BM,!1,C.Db,!1,C.ucP)
-C.mr=new H.IN("expanded")
-C.HE=new A.ES(C.mr,C.BM,!1,C.HL,!1,C.X0)
-C.kw=new H.IN("trace")
-C.oC=new A.ES(C.kw,C.BM,!1,C.MR1,!1,C.ucP)
-C.qX=new H.IN("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.WH,!1,C.yQP,!1,C.dn)
-C.UX=new H.IN("msg")
-C.Pt=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.ucP)
-C.pO=new H.IN("functionChanged")
-C.au=new A.ES(C.pO,C.WH,!1,C.yQP,!1,C.dn)
-C.rP=new H.IN("mapChanged")
-C.Nt=new A.ES(C.rP,C.WH,!1,C.yQP,!1,C.dn)
-C.bk=new H.IN("checked")
-C.Ud=new A.ES(C.bk,C.BM,!1,C.HL,!1,C.ucP)
-C.kV=new H.IN("link")
-C.vz=new A.ES(C.kV,C.BM,!1,C.Db,!1,C.ucP)
-C.Ve=new H.IN("socket")
-C.Xmq=H.Kx('WP')
-C.X4=new A.ES(C.Ve,C.BM,!1,C.Xmq,!1,C.ucP)
-C.nt=new H.IN("startLine")
-C.yw=H.Kx('KN')
-C.VS=new A.ES(C.nt,C.BM,!1,C.yw,!1,C.X0)
-C.tg=new H.IN("retainedBytes")
-C.DC=new A.ES(C.tg,C.BM,!1,C.yw,!1,C.X0)
-C.YD=new H.IN("sampleRate")
-C.fP=new A.ES(C.YD,C.BM,!1,C.Db,!1,C.X0)
-C.Aa=new H.IN("results")
-C.Gsc=H.Kx('wn')
-C.Uz=new A.ES(C.Aa,C.BM,!1,C.Gsc,!1,C.X0)
-C.B0=new H.IN("expand")
-C.b6=new A.ES(C.B0,C.BM,!1,C.HL,!1,C.ucP)
-C.t6=new H.IN("mapAsString")
-C.hr=new A.ES(C.t6,C.BM,!1,C.Db,!1,C.X0)
-C.qs=new H.IN("io")
-C.MN=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.ucP)
-C.QH=new H.IN("fragmentation")
-C.C4=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.ucP)
-C.VK=new H.IN("devtools")
-C.Od=new A.ES(C.VK,C.BM,!1,C.HL,!1,C.ucP)
-C.uu=new H.IN("internal")
-C.yY=new A.ES(C.uu,C.BM,!1,C.HL,!1,C.ucP)
-C.yL=new H.IN("connection")
-C.j5=new A.ES(C.yL,C.BM,!1,C.MR1,!1,C.ucP)
-C.Wj=new H.IN("process")
-C.Ah=new A.ES(C.Wj,C.BM,!1,C.MR1,!1,C.ucP)
-C.nf=new H.IN("function")
-C.V3=new A.ES(C.nf,C.BM,!1,C.MR1,!1,C.ucP)
-C.Lc=new H.IN("kind")
-C.Pc=new A.ES(C.Lc,C.BM,!1,C.Db,!1,C.ucP)
-C.S4=new H.IN("busy")
-C.FB=new A.ES(C.S4,C.BM,!1,C.HL,!1,C.X0)
-C.eh=new H.IN("lineMode")
-C.rH=new A.ES(C.eh,C.BM,!1,C.Db,!1,C.X0)
-C.PM=new H.IN("status")
-C.jv=new A.ES(C.PM,C.BM,!1,C.Db,!1,C.X0)
-C.Zi=new H.IN("lastAccumulatorReset")
-C.xx=new A.ES(C.Zi,C.BM,!1,C.Db,!1,C.X0)
-C.lH=new H.IN("checkedText")
-C.dG=new A.ES(C.lH,C.BM,!1,C.Db,!1,C.ucP)
-C.AV=new H.IN("callback")
-C.wu=H.Kx('Sa')
-C.fr=new A.ES(C.AV,C.BM,!1,C.wu,!1,C.ucP)
-C.vs=new H.IN("endLine")
-C.MP=new A.ES(C.vs,C.BM,!1,C.yw,!1,C.X0)
-C.pH=new H.IN("small")
-C.Fk=new A.ES(C.pH,C.BM,!1,C.HL,!1,C.ucP)
-C.ox=new H.IN("countersChanged")
-C.Rh=new A.ES(C.ox,C.WH,!1,C.yQP,!1,C.dn)
-C.XM=new H.IN("path")
-C.Tt=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.ucP)
-C.bJ=new H.IN("counters")
-C.jJ=H.Kx('qC')
-C.UI=new A.ES(C.bJ,C.BM,!1,C.jJ,!1,C.ucP)
-C.bE=new H.IN("sampleDepth")
-C.h3=new A.ES(C.bE,C.BM,!1,C.Db,!1,C.X0)
-C.Ys=new H.IN("pad")
-C.Ce=new A.ES(C.Ys,C.BM,!1,C.HL,!1,C.ucP)
-C.N8=new H.IN("scriptChanged")
-C.qE=new A.ES(C.N8,C.WH,!1,C.yQP,!1,C.dn)
-C.YT=new H.IN("expr")
-C.eP=H.Kx('dynamic')
-C.LC=new A.ES(C.YT,C.BM,!1,C.eP,!1,C.ucP)
-C.ak=new H.IN("hasParent")
-C.yI=new A.ES(C.ak,C.BM,!1,C.HL,!1,C.X0)
-C.xS=new H.IN("tagSelectorChanged")
-C.bB=new A.ES(C.xS,C.WH,!1,C.yQP,!1,C.dn)
-C.jU=new H.IN("file")
-C.bw=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.ucP)
-C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
-C.DZ=new A.ES(C.XA,C.BM,!1,C.MR1,!1,C.ucP)
-C.YE=new H.IN("webSocket")
-C.Wl=new A.ES(C.YE,C.BM,!1,C.MR1,!1,C.ucP)
-C.Dj=new H.IN("refreshTime")
-C.Ay=new A.ES(C.Dj,C.BM,!1,C.Db,!1,C.X0)
-C.Gr=new H.IN("endPos")
-C.VJ=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.ucP)
-C.RJ=new H.IN("vm")
-C.n8S=H.Kx('wv')
-C.BP=new A.ES(C.RJ,C.BM,!1,C.n8S,!1,C.ucP)
-C.a0=new H.IN("isDart")
-C.P9=new A.ES(C.a0,C.BM,!1,C.HL,!1,C.X0)
-C.PX=new H.IN("script")
-C.KB=H.Kx('vx')
-C.jz=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.ucP)
-C.aP=new H.IN("active")
-C.xD=new A.ES(C.aP,C.BM,!1,C.HL,!1,C.ucP)
-C.Gn=new H.IN("objectChanged")
-C.az=new A.ES(C.Gn,C.WH,!1,C.yQP,!1,C.dn)
-C.vp=new H.IN("list")
-C.o0=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.ucP)
-C.i4=new H.IN("code")
-C.pM=H.Kx('kx')
-C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.ucP)
-C.kG=new H.IN("classTable")
-C.F9=H.Kx('UC')
-C.Pr=new A.ES(C.kG,C.BM,!1,C.F9,!1,C.X0)
-C.TN=new H.IN("lastServiceGC")
-C.Gj=new A.ES(C.TN,C.BM,!1,C.Db,!1,C.X0)
-C.zd=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.ucP)
-C.OO=new H.IN("flag")
-C.Cf=new A.ES(C.OO,C.BM,!1,C.jJ,!1,C.ucP)
-C.uk=new H.IN("last")
-C.p4=new A.ES(C.uk,C.BM,!1,C.HL,!1,C.ucP)
-C.WQ=new H.IN("field")
-C.ah=new A.ES(C.WQ,C.BM,!1,C.MR1,!1,C.ucP)
-C.r1=new H.IN("expandChanged")
-C.nP=new A.ES(C.r1,C.WH,!1,C.yQP,!1,C.dn)
-C.Mc=new H.IN("flagList")
-C.f0=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.ucP)
-C.fn=new H.IN("instance")
-C.fz=new A.ES(C.fn,C.BM,!1,C.MR1,!1,C.ucP)
-C.rE=new H.IN("frame")
-C.KS=new A.ES(C.rE,C.BM,!1,C.jJ,!1,C.ucP)
-C.cg=new H.IN("anchor")
-C.ll=new A.ES(C.cg,C.BM,!1,C.Db,!1,C.ucP)
-C.ng=I.uL([C.J19])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.pM,!1,C.ng)
-C.mi=new H.IN("text")
-C.yV=new A.ES(C.mi,C.BM,!1,C.Db,!1,C.X0)
-C.tW=new H.IN("pos")
-C.kH=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.ucP)
-C.xP=new H.IN("ref")
-C.TO=new A.ES(C.xP,C.BM,!1,C.SmN,!1,C.ucP)
-C.Qp=new A.ES(C.AV,C.BM,!1,C.eP,!1,C.ucP)
-C.vb=new H.IN("profile")
-C.Mq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.ucP)
-C.ny=new P.a6(0)
-C.U3=H.VM(new W.FkO("change"),[W.ea])
-C.T1=H.VM(new W.FkO("click"),[W.AjY])
-C.MD=H.VM(new W.FkO("error"),[W.kf])
-C.i3=H.VM(new W.FkO("input"),[W.ea])
-C.LF=H.VM(new W.FkO("load"),[W.kf])
-C.ph=H.VM(new W.FkO("message"),[W.AW])
-C.uh=H.VM(new W.FkO("mousedown"),[W.AjY])
-C.Kq=H.VM(new W.FkO("mousemove"),[W.AjY])
-C.yf=H.VM(new W.FkO("popstate"),[W.f5])
-C.mp=function(hooks) {
+// The code supports the following hooks:
+// dartPrint(message):
+//    if this function is defined it is called instead of the Dart [print]
+//    method.
+//
+// dartMainRunner(main, args):
+//    if this function is defined, the Dart [main] method will not be invoked
+//    directly. Instead, a closure that will invoke [main], and its arguments
+//    [args] is passed to [dartMainRunner].
+(function($) {
+function dart(){ this.x = 0 }var A = new dart;
+delete A.x;
+var B = new dart;
+delete B.x;
+var C = new dart;
+delete C.x;
+var D = new dart;
+delete D.x;
+var E = new dart;
+delete E.x;
+var F = new dart;
+delete F.x;
+var G = new dart;
+delete G.x;
+var H = new dart;
+delete H.x;
+var J = new dart;
+delete J.x;
+var K = new dart;
+delete K.x;
+var L = new dart;
+delete L.x;
+var M = new dart;
+delete M.x;
+var N = new dart;
+delete N.x;
+var O = new dart;
+delete O.x;
+var P = new dart;
+delete P.x;
+var Q = new dart;
+delete Q.x;
+var R = new dart;
+delete R.x;
+var S = new dart;
+delete S.x;
+var T = new dart;
+delete T.x;
+var U = new dart;
+delete U.x;
+var V = new dart;
+delete V.x;
+var W = new dart;
+delete W.x;
+var X = new dart;
+delete X.x;
+var Y = new dart;
+delete Y.x;
+var Z = new dart;
+delete Z.x;
+function Isolate() {}
+init();
+
+$ = Isolate.$isolateProperties;
+var $$ = {};
+
+// Native classes
+(function(reflectionData) {
+  "use strict";
+  function map(x) {
+    x = {x: x};
+    delete x.x;
+    return x;
+  }
+  function processStatics(descriptor) {
+    for (var property in descriptor) {
+      if (!hasOwnProperty.call(descriptor, property))
+        continue;
+      if (property === "^")
+        continue;
+      var element = descriptor[property];
+      var firstChar = property.substring(0, 1);
+      var previousProperty;
+      if (firstChar === "+") {
+        mangledGlobalNames[previousProperty] = property.substring(1);
+        var flag = descriptor[property];
+        if (flag > 0)
+          descriptor[previousProperty].$reflectable = flag;
+        if (element && element.length)
+          init.typeInformation[previousProperty] = element;
+      } else if (firstChar === "@") {
+        property = property.substring(1);
+        $[property]["@"] = element;
+      } else if (firstChar === "*") {
+        globalObject[previousProperty].$defaultValues = element;
+        var optionalMethods = descriptor.$methodsWithOptionalArguments;
+        if (!optionalMethods) {
+          descriptor.$methodsWithOptionalArguments = optionalMethods = {};
+        }
+        optionalMethods[property] = previousProperty;
+      } else if (typeof element === "function") {
+        globalObject[previousProperty = property] = element;
+        functions.push(property);
+        init.globalFunctions[property] = element;
+      } else if (element.constructor === Array) {
+        addStubs(globalObject, element, property, true, descriptor, functions);
+      } else {
+        previousProperty = property;
+        var newDesc = {};
+        var previousProp;
+        for (var prop in element) {
+          if (!hasOwnProperty.call(element, prop))
+            continue;
+          firstChar = prop.substring(0, 1);
+          if (prop === "static") {
+            processStatics(init.statics[property] = element[prop]);
+          } else if (firstChar === "+") {
+            mangledNames[previousProp] = prop.substring(1);
+            var flag = element[prop];
+            if (flag > 0)
+              element[previousProp].$reflectable = flag;
+          } else if (firstChar === "@" && prop !== "@") {
+            newDesc[prop.substring(1)]["@"] = element[prop];
+          } else if (firstChar === "*") {
+            newDesc[previousProp].$defaultValues = element[prop];
+            var optionalMethods = newDesc.$methodsWithOptionalArguments;
+            if (!optionalMethods) {
+              newDesc.$methodsWithOptionalArguments = optionalMethods = {};
+            }
+            optionalMethods[prop] = previousProp;
+          } else {
+            var elem = element[prop];
+            if (prop !== "^" && elem != null && elem.constructor === Array && prop !== "<>") {
+              addStubs(newDesc, elem, prop, false, element, []);
+            } else {
+              newDesc[previousProp = prop] = elem;
+            }
+          }
+        }
+        $$[property] = [globalObject, newDesc];
+        classes.push(property);
+      }
+    }
+  }
+  function addStubs(descriptor, array, name, isStatic, originalDescriptor, functions) {
+    var f, funcs = [originalDescriptor[name] = descriptor[name] = f = array[0]];
+    f.$stubName = name;
+    functions.push(name);
+    for (var index = 0; index < array.length; index += 2) {
+      f = array[index + 1];
+      if (typeof f != "function")
+        break;
+      f.$stubName = array[index + 2];
+      funcs.push(f);
+      if (f.$stubName) {
+        originalDescriptor[f.$stubName] = descriptor[f.$stubName] = f;
+        functions.push(f.$stubName);
+      }
+    }
+    for (var i = 0; i < funcs.length; index++, i++) {
+      funcs[i].$callName = array[index + 1];
+    }
+    var getterStubName = array[++index];
+    array = array.slice(++index);
+    var requiredParameterInfo = array[0];
+    var requiredParameterCount = requiredParameterInfo >> 1;
+    var isAccessor = (requiredParameterInfo & 1) === 1;
+    var isSetter = requiredParameterInfo === 3;
+    var isGetter = requiredParameterInfo === 1;
+    var optionalParameterInfo = array[1];
+    var optionalParameterCount = optionalParameterInfo >> 1;
+    var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
+    var isIntercepted = requiredParameterCount + optionalParameterCount != funcs[0].length;
+    var functionTypeIndex = array[2];
+    var unmangledNameIndex = 2 * optionalParameterCount + requiredParameterCount + 3;
+    var isReflectable = array.length > unmangledNameIndex;
+    if (getterStubName) {
+      f = tearOff(funcs, array, isStatic, name, isIntercepted);
+      descriptor[name].$getter = f;
+      f.$getterStub = true;
+      if (isStatic)
+        init.globalFunctions[name] = f;
+      originalDescriptor[getterStubName] = descriptor[getterStubName] = f;
+      funcs.push(f);
+      if (getterStubName)
+        functions.push(getterStubName);
+      f.$stubName = getterStubName;
+      f.$callName = null;
+      if (isIntercepted)
+        init.interceptedNames[getterStubName] = true;
+    }
+    if (isReflectable) {
+      for (var i = 0; i < funcs.length; i++) {
+        funcs[i].$reflectable = 1;
+        funcs[i].$reflectionInfo = array;
+      }
+      var mangledNames = isStatic ? init.mangledGlobalNames : init.mangledNames;
+      var unmangledName = array[unmangledNameIndex];
+      var reflectionName = unmangledName;
+      if (getterStubName)
+        mangledNames[getterStubName] = reflectionName;
+      if (isSetter) {
+        reflectionName += "=";
+      } else if (!isGetter) {
+        reflectionName += ":" + requiredParameterCount + ":" + optionalParameterCount;
+      }
+      mangledNames[name] = reflectionName;
+      funcs[0].$reflectionName = reflectionName;
+      funcs[0].$metadataIndex = unmangledNameIndex + 1;
+      if (optionalParameterCount)
+        descriptor[unmangledName + "*"] = funcs[0];
+    }
+  }
+  function tearOffGetterNoCsp(funcs, reflectionInfo, name, isIntercepted) {
+    return isIntercepted ? new Function("funcs", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "(x) {" + "if (c === null) c = H.closureFromTearOff(" + "this, funcs, reflectionInfo, false, [x], name);" + "return new c(this, funcs[0], x, name);" + "}")(funcs, reflectionInfo, name, H, null) : new Function("funcs", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "() {" + "if (c === null) c = H.closureFromTearOff(" + "this, funcs, reflectionInfo, false, [], name);" + "return new c(this, funcs[0], null, name);" + "}")(funcs, reflectionInfo, name, H, null);
+  }
+  function tearOffGetterCsp(funcs, reflectionInfo, name, isIntercepted) {
+    var cache = null;
+    return isIntercepted ? function(x) {
+      if (cache === null)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, false, [x], name);
+      return new cache(this, funcs[0], x, name);
+    } : function() {
+      if (cache === null)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, false, [], name);
+      return new cache(this, funcs[0], null, name);
+    };
+  }
+  function tearOff(funcs, reflectionInfo, isStatic, name, isIntercepted) {
+    var cache;
+    return isStatic ? function() {
+      if (cache === void 0)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, true, [], name).prototype;
+      return cache;
+    } : tearOffGetter(funcs, reflectionInfo, name, isIntercepted);
+  }
+  var functionCounter = 0;
+  var tearOffGetter = typeof dart_precompiled == "function" ? tearOffGetterCsp : tearOffGetterNoCsp;
+  if (!init.libraries)
+    init.libraries = [];
+  if (!init.mangledNames)
+    init.mangledNames = map();
+  if (!init.mangledGlobalNames)
+    init.mangledGlobalNames = map();
+  if (!init.statics)
+    init.statics = map();
+  if (!init.typeInformation)
+    init.typeInformation = map();
+  if (!init.globalFunctions)
+    init.globalFunctions = map();
+  if (!init.interceptedNames)
+    init.interceptedNames = map();
+  var libraries = init.libraries;
+  var mangledNames = init.mangledNames;
+  var mangledGlobalNames = init.mangledGlobalNames;
+  var hasOwnProperty = Object.prototype.hasOwnProperty;
+  var length = reflectionData.length;
+  for (var i = 0; i < length; i++) {
+    var data = reflectionData[i];
+    var name = data[0];
+    var uri = data[1];
+    var metadata = data[2];
+    var globalObject = data[3];
+    var descriptor = data[4];
+    var isRoot = !!data[5];
+    var fields = descriptor && descriptor["^"];
+    if (fields instanceof Array)
+      fields = fields[0];
+    var classes = [];
+    var functions = [];
+    processStatics(descriptor);
+    libraries.push([name, uri, classes, functions, metadata, fields, isRoot, globalObject]);
+  }
+})([
+["_foreign_helper", "dart:_foreign_helper", , H, {
+  "^": "",
+  JS_CONST: {
+    "^": "Object;code>"
+  }
+}],
+["_interceptors", "dart:_interceptors", , J, {
+  "^": "",
+  getInterceptor: function(object) {
+    return void 0;
+  },
+  makeDispatchRecord: function(interceptor, proto, extension, indexability) {
+    return {i: interceptor, p: proto, e: extension, x: indexability};
+  },
+  getNativeInterceptor: function(object) {
+    var record, proto, objectProto, interceptor;
+    record = object[init.dispatchPropertyName];
+    if (record == null)
+      if ($.initNativeDispatchFlag == null) {
+        H.initNativeDispatch();
+        record = object[init.dispatchPropertyName];
+      }
+    if (record != null) {
+      proto = record.p;
+      if (false === proto)
+        return record.i;
+      if (true === proto)
+        return object;
+      objectProto = Object.getPrototypeOf(object);
+      if (proto === objectProto)
+        return record.i;
+      if (record.e === objectProto)
+        throw H.wrapException(P.UnimplementedError$("Return interceptor for " + H.S(proto(object, record))));
+    }
+    interceptor = H.lookupAndCacheInterceptor(object);
+    if (interceptor == null) {
+      proto = Object.getPrototypeOf(object);
+      if (proto == null || proto === Object.prototype)
+        return C.PlainJavaScriptObject_methods;
+      else
+        return C.UnknownJavaScriptObject_methods;
+    }
+    return interceptor;
+  },
+  findIndexForNativeSubclassType: function(type) {
+    var t1, map, t2, i;
+    t1 = $.mapTypeToInterceptor;
+    if (t1 == null)
+      return;
+    map = t1;
+    for (t1 = map.length, t2 = J.getInterceptor(type), i = 0; i + 1 < t1; i += 3) {
+      if (i >= t1)
+        return H.ioore(map, i);
+      if (t2.$eq(type, map[i]))
+        return i;
+    }
+    return;
+  },
+  findInterceptorConstructorForType: function(type) {
+    var index, map, t1;
+    index = J.findIndexForNativeSubclassType(type);
+    if (index == null)
+      return;
+    map = $.mapTypeToInterceptor;
+    t1 = index + 1;
+    if (t1 >= map.length)
+      return H.ioore(map, t1);
+    return map[t1];
+  },
+  findConstructorForNativeSubclassType: function(type, $name) {
+    var index, map, t1;
+    index = J.findIndexForNativeSubclassType(type);
+    if (index == null)
+      return;
+    map = $.mapTypeToInterceptor;
+    t1 = index + 2;
+    if (t1 >= map.length)
+      return H.ioore(map, t1);
+    return map[t1][$name];
+  },
+  Interceptor: {
+    "^": "Object;",
+    $eq: function(receiver, other) {
+      return receiver === other;
+    },
+    get$hashCode: function(receiver) {
+      return H.Primitives_objectHashCode(receiver);
+    },
+    toString$0: function(receiver) {
+      return H.Primitives_objectToString(receiver);
+    },
+    noSuchMethod$1: [function(receiver, invocation) {
+      throw H.wrapException(P.NoSuchMethodError$(receiver, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments(), null));
+    }, "call$1", "get$noSuchMethod", 2, 0, null, 68],
+    get$runtimeType: function(receiver) {
+      return new H.TypeImpl(H.getRuntimeTypeString(receiver), null);
+    },
+    "%": "DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"
+  },
+  JSBool: {
+    "^": "Interceptor;",
+    toString$0: function(receiver) {
+      return String(receiver);
+    },
+    get$hashCode: function(receiver) {
+      return receiver ? 519018 : 218159;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_EsU;
+    },
+    $isbool: true
+  },
+  JSNull: {
+    "^": "Interceptor;",
+    $eq: function(receiver, other) {
+      return null == other;
+    },
+    toString$0: function(receiver) {
+      return "null";
+    },
+    get$hashCode: function(receiver) {
+      return 0;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_eZO;
+    },
+    noSuchMethod$1: [function(receiver, invocation) {
+      return J.Interceptor.prototype.noSuchMethod$1.call(this, receiver, invocation);
+    }, "call$1", "get$noSuchMethod", 2, 0, null, 68]
+  },
+  JavaScriptObject: {
+    "^": "Interceptor;",
+    get$hashCode: function(_) {
+      return 0;
+    },
+    get$runtimeType: function(_) {
+      return C.Type_XXD;
+    }
+  },
+  PlainJavaScriptObject: {
+    "^": "JavaScriptObject;"
+  },
+  UnknownJavaScriptObject: {
+    "^": "JavaScriptObject;"
+  },
+  JSArray: {
+    "^": "Interceptor;",
+    add$1: function(receiver, value) {
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("add"));
+      receiver.push(value);
+    },
+    removeAt$1: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index < 0 || index >= receiver.length)
+        throw H.wrapException(P.RangeError$value(index));
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("removeAt"));
+      return receiver.splice(index, 1)[0];
+    },
+    insert$2: function(receiver, index, value) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index < 0 || index > receiver.length)
+        throw H.wrapException(P.RangeError$value(index));
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("insert"));
+      receiver.splice(index, 0, value);
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("insertAll"));
+      H.IterableMixinWorkaround_insertAllList(receiver, index, iterable);
+    },
+    remove$1: function(receiver, element) {
+      var i;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("remove"));
+      for (i = 0; i < receiver.length; ++i)
+        if (J.$eq(receiver[i], element)) {
+          receiver.splice(i, 1);
+          return true;
+        }
+      return false;
+    },
+    where$1: function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.WhereIterable(receiver, f), [null]);
+    },
+    expand$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(receiver, f), [null, null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E", ret: P.Iterable, args: [{func: "Iterable__E", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "JSArray");
+    }, 31],
+    addAll$1: function(receiver, collection) {
+      var t1;
+      for (t1 = J.get$iterator$ax(collection); t1.moveNext$0();)
+        this.add$1(receiver, t1.get$current());
+    },
+    clear$0: function(receiver) {
+      this.set$length(receiver, 0);
+    },
+    forEach$1: function(receiver, f) {
+      return H.IterableMixinWorkaround_forEach(receiver, f);
+    },
+    map$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(receiver, f), [null, null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E", ret: P.Iterable, args: [{func: "dynamic__E", args: [E]}]};
+      }, this.$receiver, "JSArray");
+    }, 31],
+    join$1: function(receiver, separator) {
+      var t1, list, i, t2;
+      t1 = receiver.length;
+      list = Array(t1);
+      list.fixed$length = init;
+      for (i = 0; i < receiver.length; ++i) {
+        t2 = H.S(receiver[i]);
+        if (i >= t1)
+          return H.ioore(list, i);
+        list[i] = t2;
+      }
+      return list.join(separator);
+    },
+    skip$1: function(receiver, n) {
+      return H.SubListIterable$(receiver, n, null, null);
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    sublist$2: function(receiver, start, end) {
+      if (start < 0 || start > receiver.length)
+        throw H.wrapException(P.RangeError$range(start, 0, receiver.length));
+      if (end < start || end > receiver.length)
+        throw H.wrapException(P.RangeError$range(end, start, receiver.length));
+      if (start === end)
+        return H.setRuntimeTypeInfo([], [H.getTypeArgumentByIndex(receiver, 0)]);
+      return H.setRuntimeTypeInfo(receiver.slice(start, end), [H.getTypeArgumentByIndex(receiver, 0)]);
+    },
+    getRange$2: function(receiver, start, end) {
+      H.IterableMixinWorkaround__rangeCheck(receiver, start, end);
+      return H.SubListIterable$(receiver, start, end, null);
+    },
+    get$first: function(receiver) {
+      if (receiver.length > 0)
+        return receiver[0];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    get$last: function(receiver) {
+      var t1 = receiver.length;
+      if (t1 > 0)
+        return receiver[t1 - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    removeRange$2: function(receiver, start, end) {
+      var receiverLength;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("removeRange"));
+      receiverLength = receiver.length;
+      if (start < 0 || start > receiverLength)
+        throw H.wrapException(P.RangeError$range(start, 0, receiverLength));
+      if (end < start || end > receiverLength)
+        throw H.wrapException(P.RangeError$range(end, start, receiverLength));
+      H.Lists_copy(receiver, end, receiver, start, receiverLength - end);
+      this.set$length(receiver, receiverLength - (end - start));
+    },
+    any$1: function(receiver, f) {
+      return H.IterableMixinWorkaround_any(receiver, f);
+    },
+    sort$1: function(receiver, compare) {
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("sort"));
+      H.IterableMixinWorkaround_sortList(receiver, compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    indexOf$2: function(receiver, element, start) {
+      return H.Lists_indexOf(receiver, element, start, receiver.length);
+    },
+    indexOf$1: function($receiver, element) {
+      return this.indexOf$2($receiver, element, 0);
+    },
+    lastIndexOf$2: function(receiver, element, start) {
+      return H.Lists_lastIndexOf(receiver, element, receiver.length - 1);
+    },
+    lastIndexOf$1: function($receiver, element) {
+      return this.lastIndexOf$2($receiver, element, null);
+    },
+    contains$1: function(receiver, other) {
+      var i;
+      for (i = 0; i < receiver.length; ++i)
+        if (J.$eq(receiver[i], other))
+          return true;
+      return false;
+    },
+    get$isEmpty: function(receiver) {
+      return receiver.length === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return receiver.length !== 0;
+    },
+    toString$0: function(receiver) {
+      return P.IterableBase_iterableToFullString(receiver, "[", "]");
+    },
+    toList$1$growable: function(receiver, growable) {
+      var t1;
+      if (growable)
+        return H.setRuntimeTypeInfo(receiver.slice(), [H.getTypeArgumentByIndex(receiver, 0)]);
+      else {
+        t1 = H.setRuntimeTypeInfo(receiver.slice(), [H.getTypeArgumentByIndex(receiver, 0)]);
+        t1.fixed$length = init;
+        return t1;
+      }
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    get$iterator: function(receiver) {
+      return H.setRuntimeTypeInfo(new H.ListIterator(receiver, receiver.length, 0, null), [H.getTypeArgumentByIndex(receiver, 0)]);
+    },
+    get$hashCode: function(receiver) {
+      return H.Primitives_objectHashCode(receiver);
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    set$length: function(receiver, newLength) {
+      if (typeof newLength !== "number" || Math.floor(newLength) !== newLength)
+        throw H.wrapException(P.ArgumentError$(newLength));
+      if (newLength < 0)
+        throw H.wrapException(P.RangeError$value(newLength));
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("set length"));
+      receiver.length = newLength;
+    },
+    $index: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("indexed set"));
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      receiver[index] = value;
+    },
+    $isJSArray: true,
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {JSArray_JSArray$fixed: function($length, $E) {
+        var t1;
+        if (typeof $length !== "number" || Math.floor($length) !== $length || $length < 0)
+          throw H.wrapException(P.ArgumentError$("Length must be a non-negative integer: " + H.S($length)));
+        t1 = H.setRuntimeTypeInfo(new Array($length), [$E]);
+        t1.fixed$length = init;
+        return t1;
+      }}
+  },
+  JSNumber: {
+    "^": "Interceptor;",
+    compareTo$1: function(receiver, b) {
+      var bIsNegative;
+      if (typeof b !== "number")
+        throw H.wrapException(P.ArgumentError$(b));
+      if (receiver < b)
+        return -1;
+      else if (receiver > b)
+        return 1;
+      else if (receiver === b) {
+        if (receiver === 0) {
+          bIsNegative = this.get$isNegative(b);
+          if (this.get$isNegative(receiver) === bIsNegative)
+            return 0;
+          if (this.get$isNegative(receiver))
+            return -1;
+          return 1;
+        }
+        return 0;
+      } else if (isNaN(receiver)) {
+        if (this.get$isNaN(b))
+          return 0;
+        return 1;
+      } else
+        return -1;
+    },
+    get$isNegative: function(receiver) {
+      return receiver === 0 ? 1 / receiver < 0 : receiver < 0;
+    },
+    get$isNaN: function(receiver) {
+      return isNaN(receiver);
+    },
+    get$isFinite: function(receiver) {
+      return isFinite(receiver);
+    },
+    remainder$1: function(receiver, b) {
+      return receiver % b;
+    },
+    abs$0: function(receiver) {
+      return Math.abs(receiver);
+    },
+    toInt$0: function(receiver) {
+      var t1;
+      if (receiver >= -2147483648 && receiver <= 2147483647)
+        return receiver | 0;
+      if (isFinite(receiver)) {
+        t1 = receiver < 0 ? Math.ceil(receiver) : Math.floor(receiver);
+        return t1 + 0;
+      }
+      throw H.wrapException(P.UnsupportedError$('' + receiver));
+    },
+    round$0: function(receiver) {
+      return this.toInt$0(this.roundToDouble$0(receiver));
+    },
+    roundToDouble$0: function(receiver) {
+      if (receiver < 0)
+        return -Math.round(-receiver);
+      else
+        return Math.round(receiver);
+    },
+    toStringAsFixed$1: function(receiver, fractionDigits) {
+      var result;
+      if (fractionDigits > 20)
+        throw H.wrapException(P.RangeError$(fractionDigits));
+      result = receiver.toFixed(fractionDigits);
+      if (receiver === 0 && this.get$isNegative(receiver))
+        return "-" + result;
+      return result;
+    },
+    toRadixString$1: function(receiver, radix) {
+      if (radix < 2 || radix > 36)
+        throw H.wrapException(P.RangeError$(radix));
+      return receiver.toString(radix);
+    },
+    toString$0: function(receiver) {
+      if (receiver === 0 && 1 / receiver < 0)
+        return "-0.0";
+      else
+        return "" + receiver;
+    },
+    get$hashCode: function(receiver) {
+      return receiver & 0x1FFFFFFF;
+    },
+    $negate: function(receiver) {
+      return -receiver;
+    },
+    $add: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver + other;
+    },
+    $sub: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver - other;
+    },
+    $div: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver / other;
+    },
+    $mul: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver * other;
+    },
+    $mod: function(receiver, other) {
+      var result;
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      result = receiver % other;
+      if (result === 0)
+        return 0;
+      if (result > 0)
+        return result;
+      if (other < 0)
+        return result - other;
+      else
+        return result + other;
+    },
+    $tdiv: function(receiver, other) {
+      if ((receiver | 0) === receiver && (other | 0) === other && 0 !== other && -1 !== other)
+        return receiver / other | 0;
+      else {
+        if (typeof other !== "number")
+          H.throwExpression(P.ArgumentError$(other));
+        return this.toInt$0(receiver / other);
+      }
+    },
+    _tdivFast$1: function(receiver, other) {
+      return (receiver | 0) === receiver ? receiver / other | 0 : this.toInt$0(receiver / other);
+    },
+    $shl: function(receiver, other) {
+      if (other < 0)
+        throw H.wrapException(P.ArgumentError$(other));
+      return other > 31 ? 0 : receiver << other >>> 0;
+    },
+    _shlPositive$1: function(receiver, other) {
+      return other > 31 ? 0 : receiver << other >>> 0;
+    },
+    $shr: function(receiver, other) {
+      var t1;
+      if (other < 0)
+        throw H.wrapException(P.ArgumentError$(other));
+      if (receiver > 0)
+        t1 = other > 31 ? 0 : receiver >>> other;
+      else {
+        t1 = other > 31 ? 31 : other;
+        t1 = receiver >> t1 >>> 0;
+      }
+      return t1;
+    },
+    _shrOtherPositive$1: function(receiver, other) {
+      var t1;
+      if (receiver > 0)
+        t1 = other > 31 ? 0 : receiver >>> other;
+      else {
+        t1 = other > 31 ? 31 : other;
+        t1 = receiver >> t1 >>> 0;
+      }
+      return t1;
+    },
+    $and: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return (receiver & other) >>> 0;
+    },
+    $xor: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return (receiver ^ other) >>> 0;
+    },
+    $lt: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver < other;
+    },
+    $gt: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver > other;
+    },
+    $le: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver <= other;
+    },
+    $ge: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver >= other;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_xM7;
+    },
+    $isnum: true,
+    static: {"^": "JSNumber__MIN_INT32,JSNumber__MAX_INT32"}
+  },
+  JSInt: {
+    "^": "JSNumber;",
+    get$runtimeType: function(receiver) {
+      return C.Type_SnA;
+    },
+    $is$double: true,
+    $isnum: true,
+    $is$int: true
+  },
+  JSDouble: {
+    "^": "JSNumber;",
+    get$runtimeType: function(receiver) {
+      return C.Type_qq1;
+    },
+    $is$double: true,
+    $isnum: true
+  },
+  JSString: {
+    "^": "Interceptor;",
+    codeUnitAt$1: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      if (index >= receiver.length)
+        throw H.wrapException(P.RangeError$value(index));
+      return receiver.charCodeAt(index);
+    },
+    allMatches$1: function(receiver, str) {
+      return H.allMatchesInStringUnchecked(receiver, str);
+    },
+    matchAsPrefix$2: function(receiver, string, start) {
+      var t1, t2, i, t3;
+      if (start < 0 || start > string.length)
+        throw H.wrapException(P.RangeError$range(start, 0, string.length));
+      t1 = receiver.length;
+      t2 = string.length;
+      if (start + t1 > t2)
+        return;
+      for (i = 0; i < t1; ++i) {
+        t3 = start + i;
+        if (t3 < 0)
+          H.throwExpression(P.RangeError$value(t3));
+        if (t3 >= t2)
+          H.throwExpression(P.RangeError$value(t3));
+        t3 = string.charCodeAt(t3);
+        if (i >= t1)
+          H.throwExpression(P.RangeError$value(i));
+        if (t3 !== receiver.charCodeAt(i))
+          return;
+      }
+      return new H.StringMatch(start, string, receiver);
+    },
+    $add: function(receiver, other) {
+      if (typeof other !== "string")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver + other;
+    },
+    endsWith$1: function(receiver, other) {
+      var otherLength, t1;
+      otherLength = other.length;
+      t1 = receiver.length;
+      if (otherLength > t1)
+        return false;
+      return other === this.substring$1(receiver, t1 - otherLength);
+    },
+    replaceAll$2: function(receiver, from, to) {
+      return H.stringReplaceAllUnchecked(receiver, from, to);
+    },
+    split$1: function(receiver, pattern) {
+      if (pattern == null)
+        H.throwExpression(P.ArgumentError$(null));
+      if (typeof pattern === "string")
+        return receiver.split(pattern);
+      else if (!!J.getInterceptor(pattern).$isJSSyntaxRegExp)
+        return receiver.split(pattern._nativeRegExp);
+      else
+        throw H.wrapException("String.split(Pattern) UNIMPLEMENTED");
+    },
+    startsWith$2: function(receiver, pattern, index) {
+      var endIndex;
+      if (index > receiver.length)
+        throw H.wrapException(P.RangeError$range(index, 0, receiver.length));
+      endIndex = index + pattern.length;
+      if (endIndex > receiver.length)
+        return false;
+      return pattern === receiver.substring(index, endIndex);
+    },
+    startsWith$1: function($receiver, pattern) {
+      return this.startsWith$2($receiver, pattern, 0);
+    },
+    substring$2: function(receiver, startIndex, endIndex) {
+      if (typeof startIndex !== "number" || Math.floor(startIndex) !== startIndex)
+        H.throwExpression(P.ArgumentError$(startIndex));
+      if (endIndex == null)
+        endIndex = receiver.length;
+      if (typeof endIndex !== "number" || Math.floor(endIndex) !== endIndex)
+        H.throwExpression(P.ArgumentError$(endIndex));
+      if (startIndex < 0)
+        throw H.wrapException(P.RangeError$value(startIndex));
+      if (typeof endIndex !== "number")
+        return H.iae(endIndex);
+      if (startIndex > endIndex)
+        throw H.wrapException(P.RangeError$value(startIndex));
+      if (endIndex > receiver.length)
+        throw H.wrapException(P.RangeError$value(endIndex));
+      return receiver.substring(startIndex, endIndex);
+    },
+    substring$1: function($receiver, startIndex) {
+      return this.substring$2($receiver, startIndex, null);
+    },
+    toLowerCase$0: function(receiver) {
+      return receiver.toLowerCase();
+    },
+    trim$0: function(receiver) {
+      var result, endIndex, startIndex, t1, endIndex0;
+      result = receiver.trim();
+      endIndex = result.length;
+      if (endIndex === 0)
+        return result;
+      if (this.codeUnitAt$1(result, 0) === 133) {
+        startIndex = J.JSString__skipLeadingWhitespace(result, 1);
+        if (startIndex === endIndex)
+          return "";
+      } else
+        startIndex = 0;
+      t1 = endIndex - 1;
+      endIndex0 = this.codeUnitAt$1(result, t1) === 133 ? J.JSString__skipTrailingWhitespace(result, t1) : endIndex;
+      if (startIndex === 0 && endIndex0 === endIndex)
+        return result;
+      return result.substring(startIndex, endIndex0);
+    },
+    $mul: function(receiver, times) {
+      var s, result;
+      if (typeof times !== "number")
+        return H.iae(times);
+      if (0 >= times)
+        return "";
+      if (times === 1 || receiver.length === 0)
+        return receiver;
+      if (times !== times >>> 0)
+        throw H.wrapException(C.C_OutOfMemoryError);
+      for (s = receiver, result = ""; true;) {
+        if ((times & 1) === 1)
+          result = s + result;
+        times = times >>> 1;
+        if (times === 0)
+          break;
+        s += s;
+      }
+      return result;
+    },
+    indexOf$2: function(receiver, pattern, start) {
+      var t1, match, t2, i;
+      if (pattern == null)
+        H.throwExpression(P.ArgumentError$(null));
+      if (start < 0 || start > receiver.length)
+        throw H.wrapException(P.RangeError$range(start, 0, receiver.length));
+      if (typeof pattern === "string")
+        return receiver.indexOf(pattern, start);
+      t1 = J.getInterceptor(pattern);
+      if (!!t1.$isJSSyntaxRegExp) {
+        match = pattern._execGlobal$2(receiver, start);
+        return match == null ? -1 : match._match.index;
+      }
+      for (t2 = receiver.length, i = start; i <= t2; ++i)
+        if (t1.matchAsPrefix$2(pattern, receiver, i) != null)
+          return i;
+      return -1;
+    },
+    indexOf$1: function($receiver, pattern) {
+      return this.indexOf$2($receiver, pattern, 0);
+    },
+    lastIndexOf$2: function(receiver, pattern, start) {
+      var t1, t2;
+      start = receiver.length;
+      t1 = pattern.length;
+      t2 = receiver.length;
+      if (start + t1 > t2)
+        start = t2 - t1;
+      return receiver.lastIndexOf(pattern, start);
+    },
+    lastIndexOf$1: function($receiver, pattern) {
+      return this.lastIndexOf$2($receiver, pattern, null);
+    },
+    contains$2: function(receiver, other, startIndex) {
+      if (other == null)
+        H.throwExpression(P.ArgumentError$(null));
+      if (startIndex > receiver.length)
+        throw H.wrapException(P.RangeError$range(startIndex, 0, receiver.length));
+      return H.stringContainsUnchecked(receiver, other, startIndex);
+    },
+    contains$1: function($receiver, other) {
+      return this.contains$2($receiver, other, 0);
+    },
+    get$isEmpty: function(receiver) {
+      return receiver.length === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return receiver.length !== 0;
+    },
+    compareTo$1: function(receiver, other) {
+      var t1;
+      if (typeof other !== "string")
+        throw H.wrapException(P.ArgumentError$(other));
+      if (receiver === other)
+        t1 = 0;
+      else
+        t1 = receiver < other ? -1 : 1;
+      return t1;
+    },
+    toString$0: function(receiver) {
+      return receiver;
+    },
+    get$hashCode: function(receiver) {
+      var t1, hash, i;
+      for (t1 = receiver.length, hash = 0, i = 0; i < t1; ++i) {
+        hash = 536870911 & hash + receiver.charCodeAt(i);
+        hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+        hash ^= hash >> 6;
+      }
+      hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+      hash ^= hash >> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_Ejg;
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      return receiver[index];
+    },
+    $isString: true,
+    static: {JSString__isWhitespace: function(codeUnit) {
+        if (codeUnit < 256)
+          switch (codeUnit) {
+            case 9:
+            case 10:
+            case 11:
+            case 12:
+            case 13:
+            case 32:
+            case 133:
+            case 160:
+              return true;
+            default:
+              return false;
+          }
+        switch (codeUnit) {
+          case 5760:
+          case 6158:
+          case 8192:
+          case 8193:
+          case 8194:
+          case 8195:
+          case 8196:
+          case 8197:
+          case 8198:
+          case 8199:
+          case 8200:
+          case 8201:
+          case 8202:
+          case 8232:
+          case 8233:
+          case 8239:
+          case 8287:
+          case 12288:
+          case 65279:
+            return true;
+          default:
+            return false;
+        }
+      }, JSString__skipLeadingWhitespace: function(string, index) {
+        var t1, codeUnit;
+        for (t1 = string.length; index < t1;) {
+          if (index >= t1)
+            H.throwExpression(P.RangeError$value(index));
+          codeUnit = string.charCodeAt(index);
+          if (codeUnit !== 32 && codeUnit !== 13 && !J.JSString__isWhitespace(codeUnit))
+            break;
+          ++index;
+        }
+        return index;
+      }, JSString__skipTrailingWhitespace: function(string, index) {
+        var t1, index0, codeUnit;
+        for (t1 = string.length; index > 0; index = index0) {
+          index0 = index - 1;
+          if (index0 >= t1)
+            H.throwExpression(P.RangeError$value(index0));
+          codeUnit = string.charCodeAt(index0);
+          if (codeUnit !== 32 && codeUnit !== 13 && !J.JSString__isWhitespace(codeUnit))
+            break;
+        }
+        return index;
+      }}
+  }
+}],
+["_isolate_helper", "dart:_isolate_helper", , H, {
+  "^": "",
+  _callInIsolate: function(isolate, $function) {
+    var result = isolate.eval$1(0, $function);
+    init.globalState.topEventLoop.run$0();
+    return result;
+  },
+  leaveJsAsync: function() {
+    --init.globalState.topEventLoop._activeJsAsyncCount;
+  },
+  startRootIsolate: function(entry, args) {
+    var t1, t2, t3, t4, t5, rootContext;
+    t1 = {};
+    t1.args_0 = args;
+    args = args;
+    t1.args_0 = args;
+    if (args == null) {
+      args = [];
+      t1.args_0 = args;
+      t2 = args;
+    } else
+      t2 = args;
+    if (!J.getInterceptor(t2).$isList)
+      throw H.wrapException(P.ArgumentError$("Arguments to main must be a List: " + H.S(t2)));
+    t2 = new H._Manager(0, 0, 1, null, null, null, null, null, null, null, null, null, entry);
+    t2._Manager$1(entry);
+    init.globalState = t2;
+    if (init.globalState.isWorker === true)
+      return;
+    t2 = init.globalState.nextIsolateId++;
+    t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+    t4 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+    t5 = new H.RawReceivePortImpl(0, null, false);
+    rootContext = new H._IsolateContext(t2, t3, t4, new Isolate(), t5, P.Capability_Capability(), P.Capability_Capability(), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+    t4.add$1(0, 0);
+    rootContext._addRegistration$2(0, t5);
+    init.globalState.rootContext = rootContext;
+    init.globalState.currentContext = rootContext;
+    t2 = H.getDynamicRuntimeType();
+    t3 = H.buildFunctionType(t2, [t2])._isTest$1(entry);
+    if (t3)
+      rootContext.eval$1(0, new H.startRootIsolate_closure(t1, entry));
+    else {
+      t2 = H.buildFunctionType(t2, [t2, t2])._isTest$1(entry);
+      if (t2)
+        rootContext.eval$1(0, new H.startRootIsolate_closure0(t1, entry));
+      else
+        rootContext.eval$1(0, entry);
+    }
+    init.globalState.topEventLoop.run$0();
+  },
+  IsolateNatives_computeThisScript: function() {
+    var currentScript = init.currentScript;
+    if (currentScript != null)
+      return String(currentScript.src);
+    if (typeof version == "function" && typeof os == "object" && "system" in os)
+      return H.IsolateNatives_computeThisScriptFromTrace();
+    if (typeof version == "function" && typeof system == "function")
+      return thisFilename();
+    if (init.globalState.isWorker === true)
+      return H.IsolateNatives_computeThisScriptFromTrace();
+    return;
+  },
+  IsolateNatives_computeThisScriptFromTrace: function() {
+    var stack, matches;
+    stack = new Error().stack;
+    if (stack == null) {
+      stack = function() {
+        try {
+          throw new Error();
+        } catch (e) {
+          return e.stack;
+        }
+
+      }();
+      if (stack == null)
+        throw H.wrapException(P.UnsupportedError$("No stack trace"));
+    }
+    matches = stack.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m"));
+    if (matches != null)
+      return matches[1];
+    matches = stack.match(new RegExp("^[^@]*@(.*):[0-9]*$", "m"));
+    if (matches != null)
+      return matches[1];
+    throw H.wrapException(P.UnsupportedError$("Cannot extract URI from \"" + H.S(stack) + "\""));
+  },
+  IsolateNatives__processWorkerMessage: [function(sender, e) {
+    var msg, t1, functionName, entryPoint, args, message, isSpawnUri, startPaused, replyTo, t2, t3, t4, context, replyPort;
+    msg = H._deserializeMessage(e.data);
+    t1 = J.getInterceptor$asx(msg);
+    switch (t1.$index(msg, "command")) {
+      case "start":
+        init.globalState.currentManagerId = t1.$index(msg, "id");
+        functionName = t1.$index(msg, "functionName");
+        entryPoint = functionName == null ? init.globalState.entry : init.globalFunctions[functionName]();
+        args = t1.$index(msg, "args");
+        message = H._deserializeMessage(t1.$index(msg, "msg"));
+        isSpawnUri = t1.$index(msg, "isSpawnUri");
+        startPaused = t1.$index(msg, "startPaused");
+        replyTo = H._deserializeMessage(t1.$index(msg, "replyTo"));
+        t1 = init.globalState.nextIsolateId++;
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+        t3 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+        t4 = new H.RawReceivePortImpl(0, null, false);
+        context = new H._IsolateContext(t1, t2, t3, new Isolate(), t4, P.Capability_Capability(), P.Capability_Capability(), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+        t3.add$1(0, 0);
+        context._addRegistration$2(0, t4);
+        init.globalState.topEventLoop.events._add$1(0, new H._IsolateEvent(context, new H.IsolateNatives__processWorkerMessage_closure(entryPoint, args, message, isSpawnUri, startPaused, replyTo), "worker-start"));
+        init.globalState.currentContext = context;
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "spawn-worker":
+        replyPort = t1.$index(msg, "replyPort");
+        H.IsolateNatives_spawn(t1.$index(msg, "functionName"), t1.$index(msg, "uri"), t1.$index(msg, "args"), t1.$index(msg, "msg"), false, t1.$index(msg, "isSpawnUri"), t1.$index(msg, "startPaused")).then$2$onError(new H.IsolateNatives__processWorkerMessage_closure0(replyPort), new H.IsolateNatives__processWorkerMessage_closure1(replyPort));
+        break;
+      case "message":
+        if (t1.$index(msg, "port") != null)
+          J.send$1$x(t1.$index(msg, "port"), t1.$index(msg, "msg"));
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "close":
+        init.globalState.managers.remove$1(0, $.get$IsolateNatives_workerIds().$index(0, sender));
+        sender.terminate();
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "log":
+        H.IsolateNatives__log(t1.$index(msg, "msg"));
+        break;
+      case "print":
+        if (init.globalState.isWorker === true) {
+          t1 = init.globalState.mainManager;
+          t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "print", "msg", msg], null, null));
+          t1.toString;
+          self.postMessage(t2);
+        } else
+          P.print(t1.$index(msg, "msg"));
+        break;
+      case "error":
+        throw H.wrapException(t1.$index(msg, "msg"));
+    }
+  }, "call$2", "IsolateNatives__processWorkerMessage$closure", 4, 0, null, 0, 1],
+  IsolateNatives__log: function(msg) {
+    var trace, t1, t2, exception;
+    if (init.globalState.isWorker === true) {
+      t1 = init.globalState.mainManager;
+      t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "log", "msg", msg], null, null));
+      t1.toString;
+      self.postMessage(t2);
+    } else
+      try {
+        $.get$globalThis().console.log(msg);
+      } catch (exception) {
+        H.unwrapException(exception);
+        trace = new H._StackTrace(exception, null);
+        throw H.wrapException(P.Exception_Exception(trace));
+      }
+
+  },
+  IsolateNatives_spawn: function(functionName, uri, args, message, isLight, isSpawnUri, startPaused) {
+    var port, completer, signalReply, t1, t2, worker;
+    if (uri != null && J.endsWith$1$s(uri, ".dart"))
+      uri = J.$add$ns(uri, ".js");
+    port = P.ReceivePort_ReceivePort();
+    completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+    port.get$first(port).then$1(new H.IsolateNatives_spawn_closure(completer));
+    signalReply = new H._NativeJsSendPort(port._rawPort, init.globalState.currentContext.id);
+    if (init.globalState.supportsWorkers === true && !isLight)
+      if (init.globalState.isWorker === true) {
+        t1 = init.globalState.mainManager;
+        t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "spawn-worker", "functionName", functionName, "args", args, "msg", message, "uri", uri, "isSpawnUri", isSpawnUri, "startPaused", startPaused, "replyPort", signalReply], null, null));
+        t1.toString;
+        self.postMessage(t2);
+      } else {
+        if (uri == null)
+          uri = $.get$IsolateNatives_thisScript();
+        worker = new Worker(uri);
+        worker.onerror = function(f, u, c) {
+          return function(e) {
+            return f(e, u, c);
+          };
+        }(H.IsolateNatives_workerOnError, uri, new H.IsolateNatives_spawn_closure0(completer));
+        worker.onmessage = function(f, a) {
+          return function(e) {
+            e.onerror = null;
+            return f(a, e);
+          };
+        }(H.IsolateNatives__processWorkerMessage, worker);
+        t1 = init.globalState.nextManagerId++;
+        $.get$IsolateNatives_workerIds().$indexSet(0, worker, t1);
+        init.globalState.managers.$indexSet(0, t1, worker);
+        worker.postMessage(H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "start", "id", t1, "replyTo", H._serializeMessage(signalReply), "args", args, "msg", H._serializeMessage(message), "isSpawnUri", isSpawnUri, "startPaused", startPaused, "functionName", functionName], null, null)));
+      }
+    else
+      H.IsolateNatives__startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply);
+    return completer.future;
+  },
+  IsolateNatives__startNonWorker: function(functionName, uri, args, message, isSpawnUri, startPaused, replyPort) {
+    var t1, t2, t3, t4, t5, t6;
+    t1 = {};
+    t1.args_0 = args;
+    t1.message_1 = message;
+    if (uri != null)
+      throw H.wrapException(P.UnsupportedError$("Currently spawnUri is not supported without web workers."));
+    t1.message_1 = H._serializeMessage(message);
+    t1.args_0 = H._serializeMessage(t1.args_0);
+    t2 = init.globalState.topEventLoop;
+    t3 = init.globalState.nextIsolateId++;
+    t4 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+    t5 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+    t6 = new H.RawReceivePortImpl(0, null, false);
+    t4 = new H._IsolateContext(t3, t4, t5, new Isolate(), t6, P.Capability_Capability(), P.Capability_Capability(), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+    t5.add$1(0, 0);
+    t4._addRegistration$2(0, t6);
+    t2.events._add$1(0, new H._IsolateEvent(t4, new H.IsolateNatives__startNonWorker_closure(t1, functionName, isSpawnUri, startPaused, replyPort), "nonworker start"));
+  },
+  IsolateNatives__startIsolate: function(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
+    var context, t1, t2, t3;
+    context = init.globalState.currentContext;
+    t1 = context.id;
+    $.Primitives_mirrorFunctionCacheName = $.Primitives_mirrorFunctionCacheName + ("_" + t1);
+    $.Primitives_mirrorInvokeCacheName = $.Primitives_mirrorInvokeCacheName + ("_" + t1);
+    t1 = context.controlPort;
+    t2 = init.globalState.currentContext.id;
+    t3 = context.pauseCapability;
+    J.send$1$x(replyTo, ["spawned", new H._NativeJsSendPort(t1, t2), t3, context.terminateCapability]);
+    t2 = new H.IsolateNatives__startIsolate_runStartFunction(topLevel, args, message, isSpawnUri, context);
+    if (startPaused === true) {
+      context.addPause$2(t3, t3);
+      init.globalState.topEventLoop.events._add$1(0, new H._IsolateEvent(context, t2, "start isolate"));
+    } else
+      t2.call$0();
+  },
+  IsolateNatives_workerOnError: [function($event, uri, onError) {
+    var message;
+    $event.preventDefault();
+    message = $event.message;
+    onError.call$1(message == null ? "Error spawning worker for " + H.S(uri) : "Error spawning worker for " + H.S(uri) + " (" + message + ")");
+    return true;
+  }, "call$3", "IsolateNatives_workerOnError$closure", 6, 0, null, 2, 3, 4],
+  _serializeMessage: function(message) {
+    var t1;
+    if (init.globalState.supportsWorkers === true) {
+      t1 = new H._JsSerializer(0, new H._MessageTraverserVisitedMap());
+      t1._visited = new H._JsVisitedMap(null);
+      return t1.traverse$1(message);
+    } else {
+      t1 = new H._JsCopier(new H._MessageTraverserVisitedMap());
+      t1._visited = new H._JsVisitedMap(null);
+      return t1.traverse$1(message);
+    }
+  },
+  _deserializeMessage: function(message) {
+    if (init.globalState.supportsWorkers === true)
+      return new H._JsDeserializer(null).deserialize$1(message);
+    else
+      return message;
+  },
+  _MessageTraverser_isPrimitive: function(x) {
+    return x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean";
+  },
+  _Deserializer_isPrimitive: function(x) {
+    return x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean";
+  },
+  startRootIsolate_closure: {
+    "^": "Closure:69;box_0,entry_1",
+    call$0: function() {
+      this.entry_1.call$1(this.box_0.args_0);
+    },
+    $isFunction: true
+  },
+  startRootIsolate_closure0: {
+    "^": "Closure:69;box_0,entry_2",
+    call$0: function() {
+      this.entry_2.call$2(this.box_0.args_0, null);
+    },
+    $isFunction: true
+  },
+  _Manager: {
+    "^": "Object;nextIsolateId,currentManagerId,nextManagerId,currentContext,rootContext,topEventLoop,fromCommandLine,isWorker,supportsWorkers,isolates<,mainManager,managers,entry<",
+    _Manager$1: function(entry) {
+      var t1, t2, t3, $function;
+      t1 = $.get$globalWindow() == null;
+      t2 = $.get$globalWorker();
+      t3 = t1 && $.get$globalPostMessageDefined() === true;
+      this.isWorker = t3;
+      if (!t3)
+        t2 = t2 != null && $.get$IsolateNatives_thisScript() != null;
+      else
+        t2 = true;
+      this.supportsWorkers = t2;
+      this.fromCommandLine = t1 && !t3;
+      t2 = H._IsolateEvent;
+      t3 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [t2]);
+      t3.ListQueue$1(null, t2);
+      this.topEventLoop = new H._EventLoop(t3, 0);
+      this.isolates = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H._IsolateContext);
+      this.managers = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, null);
+      if (this.isWorker === true) {
+        t1 = new H._MainManagerStub();
+        this.mainManager = t1;
+        $function = function(f, a) {
+          return function(e) {
+            f(a, e);
+          };
+        }(H.IsolateNatives__processWorkerMessage, t1);
+        $.get$globalThis().onmessage = $function;
+        $.get$globalThis().dartPrint = function(object) {
+        };
+      }
+    }
+  },
+  _IsolateContext: {
+    "^": "Object;id>,ports,weakPorts,isolateStatics<,controlPort<,pauseCapability,terminateCapability,initialized?,isPaused<,delayedEvents<,pauseTokens,doneHandlers,_scheduledControlEvents,_isExecutingEvent,errorsAreFatal,errorPorts",
+    addPause$2: function(authentification, resume) {
+      if (!this.pauseCapability.$eq(0, authentification))
+        return;
+      if (this.pauseTokens.add$1(0, resume) && !this.isPaused)
+        this.isPaused = true;
+      this._updateGlobalState$0();
+    },
+    removePause$1: function(resume) {
+      var t1, t2, $event, t3, t4, t5;
+      if (!this.isPaused)
+        return;
+      t1 = this.pauseTokens;
+      t1.remove$1(0, resume);
+      if (t1._collection$_length === 0) {
+        for (t1 = this.delayedEvents; t2 = t1.length, t2 !== 0;) {
+          if (0 >= t2)
+            return H.ioore(t1, 0);
+          $event = t1.pop();
+          t2 = init.globalState.topEventLoop.events;
+          t3 = t2._head;
+          t4 = t2._collection$_table;
+          t5 = t4.length;
+          t3 = (t3 - 1 & t5 - 1) >>> 0;
+          t2._head = t3;
+          if (t3 < 0 || t3 >= t5)
+            return H.ioore(t4, t3);
+          t4[t3] = $event;
+          if (t3 === t2._tail)
+            t2._grow$0();
+          ++t2._modificationCount;
+        }
+        this.isPaused = false;
+      }
+      this._updateGlobalState$0();
+    },
+    addDoneListener$1: function(responsePort) {
+      var t1 = this.doneHandlers;
+      if (t1 == null) {
+        t1 = [];
+        this.doneHandlers = t1;
+      }
+      if (J.contains$1$asx(t1, responsePort))
+        return;
+      this.doneHandlers.push(responsePort);
+    },
+    removeDoneListener$1: function(responsePort) {
+      var t1 = this.doneHandlers;
+      if (t1 == null)
+        return;
+      J.remove$1$ax(t1, responsePort);
+    },
+    setErrorsFatal$2: function(authentification, errorsAreFatal) {
+      if (!this.terminateCapability.$eq(0, authentification))
+        return;
+      this.errorsAreFatal = errorsAreFatal;
+    },
+    handlePing$2: function(responsePort, pingType) {
+      var t1, t2;
+      t1 = J.getInterceptor(pingType);
+      if (!t1.$eq(pingType, 0))
+        t2 = t1.$eq(pingType, 1) && !this._isExecutingEvent;
+      else
+        t2 = true;
+      if (t2) {
+        J.send$1$x(responsePort, null);
+        return;
+      }
+      t2 = new H._IsolateContext_handlePing_respond(responsePort);
+      if (t1.$eq(pingType, 2)) {
+        init.globalState.topEventLoop.events._add$1(0, new H._IsolateEvent(this, t2, "ping"));
+        return;
+      }
+      t1 = this._scheduledControlEvents;
+      if (t1 == null) {
+        t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [null]);
+        t1.ListQueue$1(null, null);
+        this._scheduledControlEvents = t1;
+      }
+      t1._add$1(0, t2);
+    },
+    handleKill$2: function(authentification, priority) {
+      var t1, t2;
+      if (!this.terminateCapability.$eq(0, authentification))
+        return;
+      t1 = J.getInterceptor(priority);
+      if (!t1.$eq(priority, 0))
+        t2 = t1.$eq(priority, 1) && !this._isExecutingEvent;
+      else
+        t2 = true;
+      if (t2) {
+        this.kill$0();
+        return;
+      }
+      if (t1.$eq(priority, 2)) {
+        t1 = init.globalState.topEventLoop;
+        t2 = this.get$kill();
+        t1.events._add$1(0, new H._IsolateEvent(this, t2, "kill"));
+        return;
+      }
+      t1 = this._scheduledControlEvents;
+      if (t1 == null) {
+        t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [null]);
+        t1.ListQueue$1(null, null);
+        this._scheduledControlEvents = t1;
+      }
+      t1._add$1(0, this.get$kill());
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      var t1, message;
+      t1 = this.errorPorts;
+      if (t1._collection$_length === 0) {
+        if (this.errorsAreFatal === true && this === init.globalState.rootContext)
+          return;
+        t1 = $.get$globalThis();
+        if (t1.console != null && typeof t1.console.error == "function")
+          t1.console.error(error, stackTrace);
+        else {
+          P.print(error);
+          if (stackTrace != null)
+            P.print(stackTrace);
+        }
+        return;
+      }
+      message = Array(2);
+      message.fixed$length = init;
+      message[0] = J.toString$0(error);
+      message[1] = stackTrace == null ? null : J.toString$0(stackTrace);
+      for (t1 = H.setRuntimeTypeInfo(new P.LinkedHashSetIterator(t1, t1._modifications, null, null), [null]), t1._cell = t1._set._first; t1.moveNext$0();)
+        J.send$1$x(t1._collection$_current, message);
+    },
+    eval$1: [function(_, code) {
+      var old, result, e, s, exception, t1;
+      old = init.globalState.currentContext;
+      init.globalState.currentContext = this;
+      $ = this.isolateStatics;
+      result = null;
+      this._isExecutingEvent = true;
+      try {
+        result = code.call$0();
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        this.handleUncaughtError$2(e, s);
+        if (this.errorsAreFatal === true) {
+          this.kill$0();
+          if (this === init.globalState.rootContext)
+            throw exception;
+        }
+      }
+ finally {
+        this._isExecutingEvent = false;
+        init.globalState.currentContext = old;
+        if (old != null)
+          $ = old.get$isolateStatics();
+        if (this._scheduledControlEvents != null)
+          for (; t1 = this._scheduledControlEvents, !t1.get$isEmpty(t1);)
+            this._scheduledControlEvents.removeFirst$0().call$0();
+      }
+      return result;
+    }, "call$1", "get$eval", 2, 0, 70, 71],
+    handleControlMessage$1: function(message) {
+      var t1 = J.getInterceptor$asx(message);
+      switch (t1.$index(message, 0)) {
+        case "pause":
+          this.addPause$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "resume":
+          this.removePause$1(t1.$index(message, 1));
+          break;
+        case "add-ondone":
+          this.addDoneListener$1(t1.$index(message, 1));
+          break;
+        case "remove-ondone":
+          this.removeDoneListener$1(t1.$index(message, 1));
+          break;
+        case "set-errors-fatal":
+          this.setErrorsFatal$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "ping":
+          this.handlePing$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "kill":
+          this.handleKill$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "getErrors":
+          this.errorPorts.add$1(0, t1.$index(message, 1));
+          break;
+        case "stopErrors":
+          this.errorPorts.remove$1(0, t1.$index(message, 1));
+          break;
+      }
+    },
+    lookup$1: function(portId) {
+      return this.ports.$index(0, portId);
+    },
+    _addRegistration$2: function(portId, port) {
+      var t1 = this.ports;
+      if (t1.containsKey$1(portId))
+        throw H.wrapException(P.Exception_Exception("Registry: ports must be registered only once."));
+      t1.$indexSet(0, portId, port);
+    },
+    _updateGlobalState$0: function() {
+      if (this.ports._collection$_length - this.weakPorts._collection$_length > 0 || this.isPaused || !this.initialized)
+        init.globalState.isolates.$indexSet(0, this.id, this);
+      else
+        this.kill$0();
+    },
+    kill$0: [function() {
+      var t1, t2;
+      t1 = this._scheduledControlEvents;
+      if (t1 != null)
+        t1.clear$0(0);
+      for (t1 = this.ports, t2 = t1.get$values(t1), t2 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t2._iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0), H.getTypeArgumentByIndex(t2, 1)]); t2.moveNext$0();)
+        t2._current.__isolate_helper$_close$0();
+      t1.clear$0(0);
+      this.weakPorts.clear$0(0);
+      init.globalState.isolates.remove$1(0, this.id);
+      this.errorPorts.clear$0(0);
+      t1 = this.doneHandlers;
+      if (t1 != null) {
+        for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+          J.send$1$x(t1._current, null);
+        this.doneHandlers = null;
+      }
+    }, "call$0", "get$kill", 0, 0, 18],
+    $is_IsolateContext: true
+  },
+  _IsolateContext_handlePing_respond: {
+    "^": "Closure:18;responsePort_0",
+    call$0: [function() {
+      J.send$1$x(this.responsePort_0, null);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _EventLoop: {
+    "^": "Object;events,_activeJsAsyncCount",
+    dequeue$0: function() {
+      var t1 = this.events;
+      if (t1._head === t1._tail)
+        return;
+      return t1.removeFirst$0();
+    },
+    runIteration$0: function() {
+      var $event, t1, t2;
+      $event = this.dequeue$0();
+      if ($event == null) {
+        if (init.globalState.rootContext != null && init.globalState.isolates.containsKey$1(init.globalState.rootContext.id) && init.globalState.fromCommandLine === true && init.globalState.rootContext.ports._collection$_length === 0)
+          H.throwExpression(P.Exception_Exception("Program exited with open ReceivePorts."));
+        t1 = init.globalState;
+        if (t1.isWorker === true && t1.isolates._collection$_length === 0 && t1.topEventLoop._activeJsAsyncCount === 0) {
+          t1 = t1.mainManager;
+          t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "close"], null, null));
+          t1.toString;
+          self.postMessage(t2);
+        }
+        return false;
+      }
+      J.process$0$x($event);
+      return true;
+    },
+    _runHelper$0: function() {
+      if ($.get$globalWindow() != null)
+        new H._EventLoop__runHelper_next(this).call$0();
+      else
+        for (; this.runIteration$0();)
+          ;
+    },
+    run$0: function() {
+      var e, trace, exception, t1, t2;
+      if (init.globalState.isWorker !== true)
+        this._runHelper$0();
+      else
+        try {
+          this._runHelper$0();
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          trace = new H._StackTrace(exception, null);
+          t1 = init.globalState.mainManager;
+          t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "error", "msg", H.S(e) + "\n" + H.S(trace)], null, null));
+          t1.toString;
+          self.postMessage(t2);
+        }
+
+    }
+  },
+  _EventLoop__runHelper_next: {
+    "^": "Closure:18;this_0",
+    call$0: [function() {
+      if (!this.this_0.runIteration$0())
+        return;
+      P.Timer_Timer(C.Duration_0, this);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _IsolateEvent: {
+    "^": "Object;isolate*,fn,message>",
+    process$0: [function(_) {
+      if (this.isolate.get$isPaused()) {
+        this.isolate.get$delayedEvents().push(this);
+        return;
+      }
+      J.eval$1$x(this.isolate, this.fn);
+    }, "call$0", "get$process", 0, 0, 18],
+    $is_IsolateEvent: true
+  },
+  _MainManagerStub: {
+    "^": "Object;"
+  },
+  IsolateNatives__processWorkerMessage_closure: {
+    "^": "Closure:69;entryPoint_0,args_1,message_2,isSpawnUri_3,startPaused_4,replyTo_5",
+    call$0: [function() {
+      H.IsolateNatives__startIsolate(this.entryPoint_0, this.args_1, this.message_2, this.isSpawnUri_3, this.startPaused_4, this.replyTo_5);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__processWorkerMessage_closure0: {
+    "^": "Closure:13;replyPort_6",
+    call$1: [function(msg) {
+      J.send$1$x(this.replyPort_6, msg);
+    }, "call$1", null, 2, 0, null, 72, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__processWorkerMessage_closure1: {
+    "^": "Closure:5;replyPort_7",
+    call$1: [function(errorMessage) {
+      J.send$1$x(this.replyPort_7, ["spawn failed", errorMessage]);
+    }, "call$1", null, 2, 0, null, 73, "call"],
+    $isFunction: true
+  },
+  IsolateNatives_spawn_closure: {
+    "^": "Closure:13;completer_0",
+    call$1: [function(msg) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(msg);
+      t2 = this.completer_0;
+      if (J.$eq(t1.$index(msg, 0), "spawned")) {
+        t1 = t2.future;
+        if (t1._state !== 0)
+          H.throwExpression(P.StateError$("Future already completed"));
+        t1._asyncComplete$1(msg);
+      } else
+        t2.completeError$1(t1.$index(msg, 1));
+    }, "call$1", null, 2, 0, null, 72, "call"],
+    $isFunction: true
+  },
+  IsolateNatives_spawn_closure0: {
+    "^": "Closure:5;completer_1",
+    call$1: [function(message) {
+      return this.completer_1.completeError$1(message);
+    }, "call$1", null, 2, 0, null, 74, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__startNonWorker_closure: {
+    "^": "Closure:69;box_0,functionName_1,isSpawnUri_2,startPaused_3,replyPort_4",
+    call$0: [function() {
+      var t1 = this.box_0;
+      H.IsolateNatives__startIsolate(init.globalFunctions[this.functionName_1](), t1.args_0, t1.message_1, this.isSpawnUri_2, this.startPaused_3, this.replyPort_4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__startIsolate_runStartFunction: {
+    "^": "Closure:18;topLevel_0,args_1,message_2,isSpawnUri_3,context_4",
+    call$0: [function() {
+      var t1, t2, t3;
+      this.context_4.set$initialized(true);
+      if (this.isSpawnUri_3 !== true)
+        this.topLevel_0.call$1(this.message_2);
+      else {
+        t1 = this.topLevel_0;
+        t2 = H.getDynamicRuntimeType();
+        t3 = H.buildFunctionType(t2, [t2, t2])._isTest$1(t1);
+        if (t3)
+          t1.call$2(this.args_1, this.message_2);
+        else {
+          t2 = H.buildFunctionType(t2, [t2])._isTest$1(t1);
+          if (t2)
+            t1.call$1(this.args_1);
+          else
+            t1.call$0();
+        }
+      }
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BaseSendPort: {
+    "^": "Object;",
+    $isSendPort: true,
+    $isCapability: true
+  },
+  _NativeJsSendPort: {
+    "^": "_BaseSendPort;_receivePort,_isolateId",
+    send$1: function(_, message) {
+      var t1, t2, isolate, t3, shouldSerialize;
+      t1 = {};
+      t2 = this._isolateId;
+      isolate = init.globalState.isolates.$index(0, t2);
+      if (isolate == null)
+        return;
+      t3 = this._receivePort;
+      if (t3.get$_isClosed())
+        return;
+      shouldSerialize = init.globalState.currentContext != null && init.globalState.currentContext.id !== t2;
+      t1.msg_0 = message;
+      if (shouldSerialize)
+        t1.msg_0 = H._serializeMessage(message);
+      if (isolate.get$controlPort() === t3) {
+        isolate.handleControlMessage$1(t1.msg_0);
+        return;
+      }
+      t2 = init.globalState.topEventLoop;
+      t3 = "receive " + H.S(message);
+      t2.events._add$1(0, new H._IsolateEvent(isolate, new H._NativeJsSendPort_send_closure(t1, this, shouldSerialize), t3));
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$is_NativeJsSendPort && J.$eq(this._receivePort, other._receivePort);
+    },
+    get$hashCode: function(_) {
+      return J.get$__isolate_helper$_id$x(this._receivePort);
+    },
+    $is_NativeJsSendPort: true,
+    $isSendPort: true,
+    $isCapability: true
+  },
+  _NativeJsSendPort_send_closure: {
+    "^": "Closure:69;box_0,this_1,shouldSerialize_2",
+    call$0: [function() {
+      var t1, t2;
+      t1 = this.this_1._receivePort;
+      if (!t1.get$_isClosed()) {
+        if (this.shouldSerialize_2) {
+          t2 = this.box_0;
+          t2.msg_0 = H._deserializeMessage(t2.msg_0);
+        }
+        J.__isolate_helper$_add$1$x(t1, this.box_0.msg_0);
+      }
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _WorkerSendPort: {
+    "^": "_BaseSendPort;_workerId,_receivePortId,_isolateId",
+    send$1: function(_, message) {
+      var workerMessage, manager;
+      workerMessage = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "message", "port", this, "msg", message], null, null));
+      if (init.globalState.isWorker === true) {
+        init.globalState.mainManager.toString;
+        self.postMessage(workerMessage);
+      } else {
+        manager = init.globalState.managers.$index(0, this._workerId);
+        if (manager != null)
+          manager.postMessage(workerMessage);
+      }
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$is_WorkerSendPort && J.$eq(this._workerId, other._workerId) && J.$eq(this._isolateId, other._isolateId) && J.$eq(this._receivePortId, other._receivePortId);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.$shl$n(this._workerId, 16);
+      t2 = J.$shl$n(this._isolateId, 8);
+      t3 = this._receivePortId;
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      return (t1 ^ t2 ^ t3) >>> 0;
+    },
+    $is_WorkerSendPort: true,
+    $isSendPort: true,
+    $isCapability: true
+  },
+  RawReceivePortImpl: {
+    "^": "Object;__isolate_helper$_id>,_handler,_isClosed<",
+    _handler$1: function(arg0) {
+      return this._handler.call$1(arg0);
+    },
+    __isolate_helper$_close$0: function() {
+      this._isClosed = true;
+      this._handler = null;
+    },
+    close$0: function(_) {
+      var t1, t2;
+      if (this._isClosed)
+        return;
+      this._isClosed = true;
+      this._handler = null;
+      t1 = init.globalState.currentContext;
+      t2 = this.__isolate_helper$_id;
+      t1.ports.remove$1(0, t2);
+      t1.weakPorts.remove$1(0, t2);
+      t1._updateGlobalState$0();
+    },
+    __isolate_helper$_add$1: function(_, dataEvent) {
+      if (this._isClosed)
+        return;
+      this._handler$1(dataEvent);
+    },
+    $isRawReceivePortImpl: true,
+    static: {"^": "RawReceivePortImpl__nextFreeId"}
+  },
+  ReceivePortImpl: {
+    "^": "Stream;_rawPort,__isolate_helper$_controller",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var t1 = this.__isolate_helper$_controller;
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._ControllerStream(t1), [null]).listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError);
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    close$0: [function(_) {
+      this._rawPort.close$0(0);
+      this.__isolate_helper$_controller.close$0(0);
+    }, "call$0", "get$close", 0, 0, 18],
+    ReceivePortImpl$fromRawReceivePort$1: function(_rawPort) {
+      var t1 = P.StreamController_StreamController(this.get$close(this), null, null, null, true, null);
+      this.__isolate_helper$_controller = t1;
+      this._rawPort._handler = t1.get$add(t1);
+    },
+    $asStream: function() {
+      return [null];
+    },
+    $isStream: true
+  },
+  _JsSerializer: {
+    "^": "_Serializer;_nextFreeRefId,_visited",
+    visitSendPort$1: function(x) {
+      if (!!x.$is_NativeJsSendPort)
+        return ["sendport", init.globalState.currentManagerId, x._isolateId, J.get$__isolate_helper$_id$x(x._receivePort)];
+      if (!!x.$is_WorkerSendPort)
+        return ["sendport", x._workerId, x._isolateId, x._receivePortId];
+      throw H.wrapException("Illegal underlying port " + x.toString$0(0));
+    },
+    visitCapability$1: function(x) {
+      if (!!x.$isCapabilityImpl)
+        return ["capability", x.__isolate_helper$_id];
+      throw H.wrapException("Capability not serializable: " + x.toString$0(0));
+    }
+  },
+  _JsCopier: {
+    "^": "_Copier;_visited",
+    visitSendPort$1: function(x) {
+      if (!!x.$is_NativeJsSendPort)
+        return new H._NativeJsSendPort(x._receivePort, x._isolateId);
+      if (!!x.$is_WorkerSendPort)
+        return new H._WorkerSendPort(x._workerId, x._receivePortId, x._isolateId);
+      throw H.wrapException("Illegal underlying port " + x.toString$0(0));
+    },
+    visitCapability$1: function(x) {
+      if (!!x.$isCapabilityImpl)
+        return new H.CapabilityImpl(x.__isolate_helper$_id);
+      throw H.wrapException("Capability not serializable: " + x.toString$0(0));
+    }
+  },
+  _JsDeserializer: {
+    "^": "_Deserializer;_deserialized",
+    deserializeSendPort$1: function(list) {
+      var t1, managerId, isolateId, receivePortId, isolate, receivePort;
+      t1 = J.getInterceptor$asx(list);
+      managerId = t1.$index(list, 1);
+      isolateId = t1.$index(list, 2);
+      receivePortId = t1.$index(list, 3);
+      if (J.$eq(managerId, init.globalState.currentManagerId)) {
+        isolate = init.globalState.isolates.$index(0, isolateId);
+        if (isolate == null)
+          return;
+        receivePort = isolate.lookup$1(receivePortId);
+        if (receivePort == null)
+          return;
+        return new H._NativeJsSendPort(receivePort, isolateId);
+      } else
+        return new H._WorkerSendPort(managerId, receivePortId, isolateId);
+    },
+    deserializeCapability$1: function(list) {
+      return new H.CapabilityImpl(J.$index$asx(list, 1));
+    }
+  },
+  _JsVisitedMap: {
+    "^": "Object;tagged",
+    $index: function(_, object) {
+      return object.__MessageTraverser__attached_info__;
+    },
+    $indexSet: function(_, object, info) {
+      this.tagged.push(object);
+      object.__MessageTraverser__attached_info__ = info;
+    },
+    reset$0: function(_) {
+      this.tagged = [];
+    },
+    cleanup$0: function() {
+      var $length, i, t1;
+      for ($length = this.tagged.length, i = 0; i < $length; ++i) {
+        t1 = this.tagged;
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t1[i].__MessageTraverser__attached_info__ = null;
+      }
+      this.tagged = null;
+    }
+  },
+  _MessageTraverserVisitedMap: {
+    "^": "Object;",
+    $index: function(_, object) {
+      return;
+    },
+    $indexSet: function(_, object, info) {
+    },
+    reset$0: function(_) {
+    },
+    cleanup$0: function() {
+    }
+  },
+  _MessageTraverser: {
+    "^": "Object;",
+    traverse$1: function(x) {
+      var result;
+      if (H._MessageTraverser_isPrimitive(x))
+        return this.visitPrimitive$1(x);
+      this._visited.reset$0(0);
+      result = null;
+      try {
+        result = this._dispatch$1(x);
+      } finally {
+        this._visited.cleanup$0();
+      }
+      return result;
+    },
+    _dispatch$1: function(x) {
+      var t1;
+      if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
+        return this.visitPrimitive$1(x);
+      t1 = J.getInterceptor(x);
+      if (!!t1.$isList)
+        return this.visitList$1(x);
+      if (!!t1.$isMap)
+        return this.visitMap$1(x);
+      if (!!t1.$isSendPort)
+        return this.visitSendPort$1(x);
+      if (!!t1.$isCapability)
+        return this.visitCapability$1(x);
+      return this.visitObject$1(x);
+    },
+    visitObject$1: function(x) {
+      throw H.wrapException("Message serialization: Illegal value " + H.S(x) + " passed");
+    }
+  },
+  _Copier: {
+    "^": "_MessageTraverser;",
+    visitPrimitive$1: function(x) {
+      return x;
+    },
+    visitList$1: function(list) {
+      var copy, t1, len, i;
+      copy = this._visited.$index(0, list);
+      if (copy != null)
+        return copy;
+      t1 = J.getInterceptor$asx(list);
+      len = t1.get$length(list);
+      copy = Array(len);
+      copy.fixed$length = init;
+      this._visited.$indexSet(0, list, copy);
+      for (i = 0; i < len; ++i)
+        copy[i] = this._dispatch$1(t1.$index(list, i));
+      return copy;
+    },
+    visitMap$1: function(map) {
+      var t1, copy;
+      t1 = {};
+      copy = this._visited.$index(0, map);
+      t1.copy_0 = copy;
+      if (copy != null)
+        return copy;
+      copy = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+      t1.copy_0 = copy;
+      this._visited.$indexSet(0, map, copy);
+      map.forEach$1(0, new H._Copier_visitMap_closure(t1, this));
+      return t1.copy_0;
+    },
+    visitSendPort$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    },
+    visitCapability$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    }
+  },
+  _Copier_visitMap_closure: {
+    "^": "Closure:75;box_0,this_1",
+    call$2: function(key, val) {
+      var t1 = this.this_1;
+      J.$indexSet$ax(this.box_0.copy_0, t1._dispatch$1(key), t1._dispatch$1(val));
+    },
+    $isFunction: true
+  },
+  _Serializer: {
+    "^": "_MessageTraverser;",
+    visitPrimitive$1: function(x) {
+      return x;
+    },
+    visitList$1: function(list) {
+      var copyId, t1;
+      copyId = this._visited.$index(0, list);
+      if (copyId != null)
+        return ["ref", copyId];
+      t1 = this._nextFreeRefId++;
+      this._visited.$indexSet(0, list, t1);
+      return ["list", t1, this._serializeList$1(list)];
+    },
+    visitMap$1: function(map) {
+      var copyId, t1;
+      copyId = this._visited.$index(0, map);
+      if (copyId != null)
+        return ["ref", copyId];
+      t1 = this._nextFreeRefId++;
+      this._visited.$indexSet(0, map, t1);
+      return ["map", t1, this._serializeList$1(J.toList$0$ax(map.get$keys())), this._serializeList$1(J.toList$0$ax(map.get$values(map)))];
+    },
+    _serializeList$1: function(list) {
+      var t1, len, result, i, t2;
+      t1 = J.getInterceptor$asx(list);
+      len = t1.get$length(list);
+      result = [];
+      C.JSArray_methods.set$length(result, len);
+      for (i = 0; i < len; ++i) {
+        t2 = this._dispatch$1(t1.$index(list, i));
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t2;
+      }
+      return result;
+    },
+    visitSendPort$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    },
+    visitCapability$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    }
+  },
+  _Deserializer: {
+    "^": "Object;",
+    deserialize$1: function(x) {
+      if (H._Deserializer_isPrimitive(x))
+        return x;
+      this._deserialized = P.HashMap_HashMap(null, null, null, null, null);
+      return this._deserializeHelper$1(x);
+    },
+    _deserializeHelper$1: function(x) {
+      var t1, id;
+      if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
+        return x;
+      t1 = J.getInterceptor$asx(x);
+      switch (t1.$index(x, 0)) {
+        case "ref":
+          id = t1.$index(x, 1);
+          return this._deserialized.$index(0, id);
+        case "list":
+          return this._deserializeList$1(x);
+        case "map":
+          return this._deserializeMap$1(x);
+        case "sendport":
+          return this.deserializeSendPort$1(x);
+        case "capability":
+          return this.deserializeCapability$1(x);
+        default:
+          return this.deserializeObject$1(x);
+      }
+    },
+    _deserializeList$1: function(x) {
+      var t1, id, dartList, len, i;
+      t1 = J.getInterceptor$asx(x);
+      id = t1.$index(x, 1);
+      dartList = t1.$index(x, 2);
+      this._deserialized.$indexSet(0, id, dartList);
+      t1 = J.getInterceptor$asx(dartList);
+      len = t1.get$length(dartList);
+      if (typeof len !== "number")
+        return H.iae(len);
+      i = 0;
+      for (; i < len; ++i)
+        t1.$indexSet(dartList, i, this._deserializeHelper$1(t1.$index(dartList, i)));
+      return dartList;
+    },
+    _deserializeMap$1: function(x) {
+      var result, t1, id, keys, values, len, t2, i;
+      result = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+      t1 = J.getInterceptor$asx(x);
+      id = t1.$index(x, 1);
+      this._deserialized.$indexSet(0, id, result);
+      keys = t1.$index(x, 2);
+      values = t1.$index(x, 3);
+      t1 = J.getInterceptor$asx(keys);
+      len = t1.get$length(keys);
+      if (typeof len !== "number")
+        return H.iae(len);
+      t2 = J.getInterceptor$asx(values);
+      i = 0;
+      for (; i < len; ++i)
+        result.$indexSet(0, this._deserializeHelper$1(t1.$index(keys, i)), this._deserializeHelper$1(t2.$index(values, i)));
+      return result;
+    },
+    deserializeObject$1: function(x) {
+      throw H.wrapException("Unexpected serialized object");
+    }
+  },
+  TimerImpl: {
+    "^": "Object;_once,_inEventLoop,_handle",
+    cancel$0: function() {
+      if ($.get$globalThis().setTimeout != null) {
+        if (this._inEventLoop)
+          throw H.wrapException(P.UnsupportedError$("Timer in event loop cannot be canceled."));
+        if (this._handle == null)
+          return;
+        H.leaveJsAsync();
+        if (this._once)
+          $.get$globalThis().clearTimeout(this._handle);
+        else
+          $.get$globalThis().clearInterval(this._handle);
+        this._handle = null;
+      } else
+        throw H.wrapException(P.UnsupportedError$("Canceling a timer."));
+    },
+    TimerImpl$2: function(milliseconds, callback) {
+      var t1, t2;
+      if (milliseconds === 0)
+        t1 = $.get$globalThis().setTimeout == null || init.globalState.isWorker === true;
+      else
+        t1 = false;
+      if (t1) {
+        this._handle = 1;
+        t1 = init.globalState.topEventLoop;
+        t2 = init.globalState.currentContext;
+        t1.events._add$1(0, new H._IsolateEvent(t2, new H.TimerImpl_internalCallback(this, callback), "timer"));
+        this._inEventLoop = true;
+      } else {
+        t1 = $.get$globalThis();
+        if (t1.setTimeout != null) {
+          ++init.globalState.topEventLoop._activeJsAsyncCount;
+          this._handle = t1.setTimeout(H.convertDartClosureToJS(new H.TimerImpl_internalCallback0(this, callback), 0), milliseconds);
+        } else
+          throw H.wrapException(P.UnsupportedError$("Timer greater than 0."));
+      }
+    },
+    static: {TimerImpl$: function(milliseconds, callback) {
+        var t1 = new H.TimerImpl(true, false, null);
+        t1.TimerImpl$2(milliseconds, callback);
+        return t1;
+      }}
+  },
+  TimerImpl_internalCallback: {
+    "^": "Closure:18;this_0,callback_1",
+    call$0: [function() {
+      this.this_0._handle = null;
+      this.callback_1.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  TimerImpl_internalCallback0: {
+    "^": "Closure:18;this_2,callback_3",
+    call$0: [function() {
+      this.this_2._handle = null;
+      H.leaveJsAsync();
+      this.callback_3.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  CapabilityImpl: {
+    "^": "Object;__isolate_helper$_id>",
+    get$hashCode: function(_) {
+      var hash, t1, t2;
+      hash = this.__isolate_helper$_id;
+      t1 = J.getInterceptor$n(hash);
+      t2 = t1.$shr(hash, 0);
+      t1 = t1.$tdiv(hash, 4294967296);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      hash = t2 ^ t1;
+      hash = (~hash >>> 0) + (hash << 15 >>> 0) & 4294967295;
+      hash = ((hash ^ hash >>> 12) >>> 0) * 5 & 4294967295;
+      hash = ((hash ^ hash >>> 4) >>> 0) * 2057 & 4294967295;
+      return (hash ^ hash >>> 16) >>> 0;
+    },
+    $eq: function(_, other) {
+      var t1, t2;
+      if (other == null)
+        return false;
+      if (other === this)
+        return true;
+      if (!!J.getInterceptor(other).$isCapabilityImpl) {
+        t1 = this.__isolate_helper$_id;
+        t2 = other.__isolate_helper$_id;
+        return t1 == null ? t2 == null : t1 === t2;
+      }
+      return false;
+    },
+    $isCapabilityImpl: true,
+    $isCapability: true
+  }
+}],
+["_js_helper", "dart:_js_helper", , H, {
+  "^": "",
+  isJsIndexable: function(object, record) {
+    var result;
+    if (record != null) {
+      result = record.x;
+      if (result != null)
+        return result;
+    }
+    return !!J.getInterceptor(object).$isJavaScriptIndexingBehavior;
+  },
+  S: function(value) {
+    var res;
+    if (typeof value === "string")
+      return value;
+    if (typeof value === "number") {
+      if (value !== 0)
+        return "" + value;
+    } else if (true === value)
+      return "true";
+    else if (false === value)
+      return "false";
+    else if (value == null)
+      return "null";
+    res = J.toString$0(value);
+    if (typeof res !== "string")
+      throw H.wrapException(P.ArgumentError$(value));
+    return res;
+  },
+  Primitives_objectHashCode: function(object) {
+    var hash = object.$identityHash;
+    if (hash == null) {
+      hash = Math.random() * 0x3fffffff | 0;
+      object.$identityHash = hash;
+    }
+    return hash;
+  },
+  Primitives__throwFormatException: [function(string) {
+    throw H.wrapException(P.FormatException$(string));
+  }, "call$1", "Primitives__throwFormatException$closure", 2, 0, 5],
+  Primitives_parseInt: function(source, radix, handleError) {
+    var match, t1, maxCharCode, digitsPart, i, t2;
+    if (handleError == null)
+      handleError = H.Primitives__throwFormatException$closure();
+    if (typeof source !== "string")
+      H.throwExpression(P.ArgumentError$(source));
+    match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
+    if (radix == null) {
+      if (match != null) {
+        t1 = match.length;
+        if (2 >= t1)
+          return H.ioore(match, 2);
+        if (match[2] != null)
+          return parseInt(source, 16);
+        if (3 >= t1)
+          return H.ioore(match, 3);
+        if (match[3] != null)
+          return parseInt(source, 10);
+        return handleError.call$1(source);
+      }
+      radix = 10;
+    } else {
+      if (radix < 2 || radix > 36)
+        throw H.wrapException(P.RangeError$("Radix " + H.S(radix) + " not in range 2..36"));
+      if (match != null) {
+        if (radix === 10) {
+          if (3 >= match.length)
+            return H.ioore(match, 3);
+          t1 = match[3] != null;
+        } else
+          t1 = false;
+        if (t1)
+          return parseInt(source, 10);
+        if (!(radix < 10)) {
+          if (3 >= match.length)
+            return H.ioore(match, 3);
+          t1 = match[3] == null;
+        } else
+          t1 = true;
+        if (t1) {
+          maxCharCode = radix <= 10 ? 48 + radix - 1 : 97 + radix - 10 - 1;
+          if (1 >= match.length)
+            return H.ioore(match, 1);
+          digitsPart = match[1];
+          t1 = J.getInterceptor$asx(digitsPart);
+          i = 0;
+          while (true) {
+            t2 = t1.get$length(digitsPart);
+            if (typeof t2 !== "number")
+              return H.iae(t2);
+            if (!(i < t2))
+              break;
+            t1.codeUnitAt$1(digitsPart, 0);
+            if (t1.codeUnitAt$1(digitsPart, i) > maxCharCode)
+              return handleError.call$1(source);
+            ++i;
+          }
+        }
+      }
+    }
+    if (match == null)
+      return handleError.call$1(source);
+    return parseInt(source, radix);
+  },
+  Primitives_parseDouble: function(source, handleError) {
+    var result, trimmed;
+    if (typeof source !== "string")
+      H.throwExpression(P.ArgumentError$(source));
+    if (handleError == null)
+      handleError = H.Primitives__throwFormatException$closure();
+    if (!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(source))
+      return handleError.call$1(source);
+    result = parseFloat(source);
+    if (isNaN(result)) {
+      trimmed = J.trim$0$s(source);
+      if (trimmed === "NaN" || trimmed === "+NaN" || trimmed === "-NaN")
+        return result;
+      return handleError.call$1(source);
+    }
+    return result;
+  },
+  Primitives_objectTypeName: function(object) {
+    var $name, decompiled;
+    $name = C.JS_CONST_8ZY(J.getInterceptor(object));
+    if ($name === "Object") {
+      decompiled = String(object.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1];
+      if (typeof decompiled === "string")
+        $name = /^\w+$/.test(decompiled) ? decompiled : $name;
+    }
+    if ($name.length > 1 && C.JSString_methods.codeUnitAt$1($name, 0) === 36)
+      $name = C.JSString_methods.substring$1($name, 1);
+    return ($name + H.joinArguments(H.getRuntimeTypeInfo(object), 0, null)).replace(/[^<,> ]+/g, function(m) {
+      return init.mangledGlobalNames[m] || m;
+    });
+  },
+  Primitives_objectToString: function(object) {
+    return "Instance of '" + H.Primitives_objectTypeName(object) + "'";
+  },
+  Primitives_numMicroseconds: function() {
+    if (typeof window != "undefined" && window !== null) {
+      var performance = window.performance;
+      if (performance != null && typeof performance.webkitNow == "function")
+        return C.JSNumber_methods.toInt$0(Math.floor(1000 * performance.webkitNow()));
+    }
+    return 1000 * Date.now();
+  },
+  Primitives__fromCharCodeApply: function(array) {
+    var end, t1, result, i, subarray, t2;
+    end = array.length;
+    for (t1 = end <= 500, result = "", i = 0; i < end; i += 500) {
+      if (t1)
+        subarray = array;
+      else {
+        t2 = i + 500;
+        t2 = t2 < end ? t2 : end;
+        subarray = array.slice(i, t2);
+      }
+      result += String.fromCharCode.apply(null, subarray);
+    }
+    return result;
+  },
+  Primitives_stringFromCodePoints: function(codePoints) {
+    var a, t1, i;
+    a = [];
+    a.$builtinTypeInfo = [P.$int];
+    t1 = new H.ListIterator(codePoints, codePoints.length, 0, null);
+    t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(codePoints, 0)];
+    for (; t1.moveNext$0();) {
+      i = t1._current;
+      if (typeof i !== "number" || Math.floor(i) !== i)
+        throw H.wrapException(P.ArgumentError$(i));
+      if (i <= 65535)
+        a.push(i);
+      else if (i <= 1114111) {
+        a.push(55296 + (C.JSInt_methods._shrOtherPositive$1(i - 65536, 10) & 1023));
+        a.push(56320 + (i & 1023));
+      } else
+        throw H.wrapException(P.ArgumentError$(i));
+    }
+    return H.Primitives__fromCharCodeApply(a);
+  },
+  Primitives_stringFromCharCodes: function(charCodes) {
+    var t1, i;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(charCodes, charCodes.length, 0, null), [H.getTypeArgumentByIndex(charCodes, 0)]); t1.moveNext$0();) {
+      i = t1._current;
+      if (typeof i !== "number" || Math.floor(i) !== i)
+        throw H.wrapException(P.ArgumentError$(i));
+      if (i < 0)
+        throw H.wrapException(P.ArgumentError$(i));
+      if (i > 65535)
+        return H.Primitives_stringFromCodePoints(charCodes);
+    }
+    return H.Primitives__fromCharCodeApply(charCodes);
+  },
+  Primitives_stringFromCharCode: function(charCode) {
+    var bits;
+    if (typeof charCode !== "number")
+      return H.iae(charCode);
+    if (0 <= charCode) {
+      if (charCode <= 65535)
+        return String.fromCharCode(charCode);
+      if (charCode <= 1114111) {
+        bits = charCode - 65536;
+        return String.fromCharCode((55296 | C.JSNumber_methods._shrOtherPositive$1(bits, 10)) >>> 0, (56320 | bits & 1023) >>> 0);
+      }
+    }
+    throw H.wrapException(P.RangeError$range(charCode, 0, 1114111));
+  },
+  Primitives_valueFromDecomposedDate: function(years, month, day, hours, minutes, seconds, milliseconds, isUtc) {
+    var jsMonth, value, t1, date;
+    if (typeof years !== "number" || Math.floor(years) !== years)
+      H.throwExpression(P.ArgumentError$(years));
+    if (typeof month !== "number" || Math.floor(month) !== month)
+      H.throwExpression(P.ArgumentError$(month));
+    if (typeof day !== "number" || Math.floor(day) !== day)
+      H.throwExpression(P.ArgumentError$(day));
+    if (typeof hours !== "number" || Math.floor(hours) !== hours)
+      H.throwExpression(P.ArgumentError$(hours));
+    if (typeof minutes !== "number" || Math.floor(minutes) !== minutes)
+      H.throwExpression(P.ArgumentError$(minutes));
+    if (typeof seconds !== "number" || Math.floor(seconds) !== seconds)
+      H.throwExpression(P.ArgumentError$(seconds));
+    jsMonth = J.$sub$n(month, 1);
+    value = isUtc ? Date.UTC(years, jsMonth, day, hours, minutes, seconds, milliseconds) : new Date(years, jsMonth, day, hours, minutes, seconds, milliseconds).valueOf();
+    if (isNaN(value) || value < -8640000000000000 || value > 8640000000000000)
+      throw H.wrapException(P.ArgumentError$(null));
+    t1 = J.getInterceptor$n(years);
+    if (t1.$le(years, 0) || t1.$lt(years, 100)) {
+      date = new Date(value);
+      if (isUtc)
+        date.setUTCFullYear(years);
+      else
+        date.setFullYear(years);
+      return date.valueOf();
+    }
+    return value;
+  },
+  Primitives_lazyAsJsDate: function(receiver) {
+    if (receiver.date === void 0)
+      receiver.date = new Date(receiver.millisecondsSinceEpoch);
+    return receiver.date;
+  },
+  Primitives_getProperty: function(object, key) {
+    if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
+      throw H.wrapException(P.ArgumentError$(object));
+    return object[key];
+  },
+  Primitives_setProperty: function(object, key, value) {
+    if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
+      throw H.wrapException(P.ArgumentError$(object));
+    object[key] = value;
+  },
+  Primitives_functionNoSuchMethod: function($function, positionalArguments, namedArguments) {
+    var t1, $arguments, namedArgumentList;
+    t1 = {};
+    t1.argumentCount_0 = 0;
+    $arguments = [];
+    namedArgumentList = [];
+    if (positionalArguments != null) {
+      t1.argumentCount_0 = positionalArguments.length;
+      C.JSArray_methods.addAll$1($arguments, positionalArguments);
+    }
+    t1.names_1 = "";
+    if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments))
+      namedArguments.forEach$1(0, new H.Primitives_functionNoSuchMethod_closure(t1, $arguments, namedArgumentList));
+    return J.noSuchMethod$1($function, new H.JSInvocationMirror(C.Symbol_call, "call$" + t1.argumentCount_0 + t1.names_1, 0, $arguments, namedArgumentList, null));
+  },
+  Primitives_applyFunction: function($function, positionalArguments, namedArguments) {
+    var t1, jsFunction, info, t2, defaultArguments, t3, i, index, $arguments, argumentCount;
+    t1 = {};
+    if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments)) {
+      jsFunction = J.getInterceptor($function)["call*"];
+      if (jsFunction == null)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      info = H.ReflectionInfo_ReflectionInfo(jsFunction);
+      if (info == null || !info.areOptionalParametersNamed)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      positionalArguments = positionalArguments != null ? P.List_List$from(positionalArguments, true, null) : [];
+      t2 = info.requiredParameterCount;
+      if (t2 !== positionalArguments.length)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      defaultArguments = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+      for (t3 = info.optionalParameterCount, i = 0; i < t3; ++i) {
+        index = i + t2;
+        defaultArguments.$indexSet(0, info.parameterNameInOrder$1(index), init.metadata[info.defaultValueInOrder$1(index)]);
+      }
+      t1.bad_0 = false;
+      namedArguments.forEach$1(0, new H.Primitives_applyFunction_closure(t1, defaultArguments));
+      if (t1.bad_0)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      C.JSArray_methods.addAll$1(positionalArguments, defaultArguments.get$values(defaultArguments));
+      return jsFunction.apply($function, positionalArguments);
+    }
+    $arguments = [];
+    if (positionalArguments != null) {
+      argumentCount = positionalArguments.length;
+      C.JSArray_methods.addAll$1($arguments, positionalArguments);
+    } else
+      argumentCount = 0;
+    jsFunction = $function["call$" + argumentCount];
+    if (jsFunction == null)
+      return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+    return jsFunction.apply($function, $arguments);
+  },
+  iae: function(argument) {
+    throw H.wrapException(P.ArgumentError$(argument));
+  },
+  ioore: function(receiver, index) {
+    if (receiver == null)
+      J.get$length$asx(receiver);
+    if (typeof index !== "number" || Math.floor(index) !== index)
+      H.iae(index);
+    throw H.wrapException(P.RangeError$value(index));
+  },
+  wrapException: function(ex) {
+    var wrapper;
+    if (ex == null)
+      ex = new P.NullThrownError();
+    wrapper = new Error();
+    wrapper.dartException = ex;
+    if ("defineProperty" in Object) {
+      Object.defineProperty(wrapper, "message", {get: H.toStringWrapper});
+      wrapper.name = "";
+    } else
+      wrapper.toString = H.toStringWrapper;
+    return wrapper;
+  },
+  toStringWrapper: [function() {
+    return J.toString$0(this.dartException);
+  }, "call$0", "toStringWrapper$closure", 0, 0, null],
+  throwExpression: function(ex) {
+    throw H.wrapException(ex);
+  },
+  unwrapException: function(ex) {
+    var t1, message, number, ieErrorCode, t2, t3, t4, nullLiteralCall, t5, t6, t7, t8, t9, match;
+    t1 = new H.unwrapException_saveStackTrace(ex);
+    if (ex == null)
+      return;
+    if (typeof ex !== "object")
+      return ex;
+    if ("dartException" in ex)
+      return t1.call$1(ex.dartException);
+    else if (!("message" in ex))
+      return ex;
+    message = ex.message;
+    if ("number" in ex && typeof ex.number == "number") {
+      number = ex.number;
+      ieErrorCode = number & 65535;
+      if ((C.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
+        switch (ieErrorCode) {
+          case 438:
+            return t1.call$1(H.JsNoSuchMethodError$(H.S(message) + " (Error " + ieErrorCode + ")", null));
+          case 445:
+          case 5007:
+            t2 = H.S(message) + " (Error " + ieErrorCode + ")";
+            return t1.call$1(new H.NullError(t2, null));
+        }
+    }
+    if (ex instanceof TypeError) {
+      t2 = $.get$TypeErrorDecoder_noSuchMethodPattern();
+      t3 = $.get$TypeErrorDecoder_notClosurePattern();
+      t4 = $.get$TypeErrorDecoder_nullCallPattern();
+      nullLiteralCall = $.get$TypeErrorDecoder_nullLiteralCallPattern();
+      t5 = $.get$TypeErrorDecoder_undefinedCallPattern();
+      t6 = $.get$TypeErrorDecoder_undefinedLiteralCallPattern();
+      t7 = $.get$TypeErrorDecoder_nullPropertyPattern();
+      $.get$TypeErrorDecoder_nullLiteralPropertyPattern();
+      t8 = $.get$TypeErrorDecoder_undefinedPropertyPattern();
+      t9 = $.get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
+      match = t2.matchTypeError$1(message);
+      if (match != null)
+        return t1.call$1(H.JsNoSuchMethodError$(message, match));
+      else {
+        match = t3.matchTypeError$1(message);
+        if (match != null) {
+          match.method = "call";
+          return t1.call$1(H.JsNoSuchMethodError$(message, match));
+        } else {
+          match = t4.matchTypeError$1(message);
+          if (match == null) {
+            match = nullLiteralCall.matchTypeError$1(message);
+            if (match == null) {
+              match = t5.matchTypeError$1(message);
+              if (match == null) {
+                match = t6.matchTypeError$1(message);
+                if (match == null) {
+                  match = t7.matchTypeError$1(message);
+                  if (match == null) {
+                    match = nullLiteralCall.matchTypeError$1(message);
+                    if (match == null) {
+                      match = t8.matchTypeError$1(message);
+                      if (match == null) {
+                        match = t9.matchTypeError$1(message);
+                        t2 = match != null;
+                      } else
+                        t2 = true;
+                    } else
+                      t2 = true;
+                  } else
+                    t2 = true;
+                } else
+                  t2 = true;
+              } else
+                t2 = true;
+            } else
+              t2 = true;
+          } else
+            t2 = true;
+          if (t2) {
+            t2 = match == null ? null : match.method;
+            return t1.call$1(new H.NullError(message, t2));
+          }
+        }
+      }
+      t2 = typeof message === "string" ? message : "";
+      return t1.call$1(new H.UnknownJsTypeError(t2));
+    }
+    if (ex instanceof RangeError) {
+      if (typeof message === "string" && message.indexOf("call stack") !== -1)
+        return new P.StackOverflowError();
+      return t1.call$1(new P.ArgumentError(null));
+    }
+    if (typeof InternalError == "function" && ex instanceof InternalError)
+      if (typeof message === "string" && message === "too much recursion")
+        return new P.StackOverflowError();
+    return ex;
+  },
+  objectHashCode: function(object) {
+    if (object == null || typeof object != 'object')
+      return J.get$hashCode$(object);
+    else
+      return H.Primitives_objectHashCode(object);
+  },
+  fillLiteralMap: function(keyValuePairs, result) {
+    var $length, index, index0, index1;
+    $length = keyValuePairs.length;
+    for (index = 0; index < $length; index = index1) {
+      index0 = index + 1;
+      index1 = index0 + 1;
+      result.$indexSet(0, keyValuePairs[index], keyValuePairs[index0]);
+    }
+    return result;
+  },
+  invokeClosure: [function(closure, isolate, numberOfArguments, arg1, arg2, arg3, arg4) {
+    var t1 = J.getInterceptor(numberOfArguments);
+    if (t1.$eq(numberOfArguments, 0))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure(closure));
+    else if (t1.$eq(numberOfArguments, 1))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure0(closure, arg1));
+    else if (t1.$eq(numberOfArguments, 2))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure1(closure, arg1, arg2));
+    else if (t1.$eq(numberOfArguments, 3))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure2(closure, arg1, arg2, arg3));
+    else if (t1.$eq(numberOfArguments, 4))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure3(closure, arg1, arg2, arg3, arg4));
+    else
+      throw H.wrapException(P.Exception_Exception("Unsupported number of arguments for wrapped closure"));
+  }, "call$7", "invokeClosure$closure", 14, 0, null, 6, 7, 8, 9, 10, 11, 12],
+  convertDartClosureToJS: function(closure, arity) {
+    var $function;
+    if (closure == null)
+      return;
+    $function = closure.$identity;
+    if (!!$function)
+      return $function;
+    $function = function(closure, arity, context, invoke) {
+      return function(a1, a2, a3, a4) {
+        return invoke(closure, context, arity, a1, a2, a3, a4);
+      };
+    }(closure, arity, init.globalState.currentContext, H.invokeClosure);
+    closure.$identity = $function;
+    return $function;
+  },
+  Closure_fromTearOff: function(receiver, functions, reflectionInfo, isStatic, jsArguments, propertyName) {
+    var $function, callName, functionType, $prototype, $constructor, t1, isIntercepted, trampoline, signatureFunction, getReceiver, i, stub, stubCallName, t2;
+    $function = functions[0];
+    $function.$stubName;
+    callName = $function.$callName;
+    $function.$reflectionInfo = reflectionInfo;
+    functionType = H.ReflectionInfo_ReflectionInfo($function).functionType;
+    $prototype = isStatic ? Object.create(new H.TearOffClosure().constructor.prototype) : Object.create(new H.BoundClosure(null, null, null, null).constructor.prototype);
+    $prototype.$initialize = $prototype.constructor;
+    if (isStatic)
+      $constructor = function() {
+        this.$initialize();
+      };
+    else if (typeof dart_precompiled == "function") {
+      t1 = function(a, b, c, d) {
+        this.$initialize(a, b, c, d);
+      };
+      $constructor = t1;
+    } else {
+      t1 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t1, 1);
+      t1 = new Function("a", "b", "c", "d", "this.$initialize(a,b,c,d);" + t1);
+      $constructor = t1;
+    }
+    $prototype.constructor = $constructor;
+    $constructor.prototype = $prototype;
+    t1 = !isStatic;
+    if (t1) {
+      isIntercepted = jsArguments.length == 1 && true;
+      trampoline = H.Closure_forwardCallTo(receiver, $function, isIntercepted);
+      trampoline.$reflectionInfo = reflectionInfo;
+    } else {
+      $prototype.$name = propertyName;
+      trampoline = $function;
+      isIntercepted = false;
+    }
+    if (typeof functionType == "number")
+      signatureFunction = function(s) {
+        return function() {
+          return init.metadata[s];
+        };
+      }(functionType);
+    else if (t1 && typeof functionType == "function") {
+      getReceiver = isIntercepted ? H.BoundClosure_receiverOf : H.BoundClosure_selfOf;
+      signatureFunction = function(f, r) {
+        return function() {
+          return f.apply({$receiver: r(this)}, arguments);
+        };
+      }(functionType, getReceiver);
+    } else
+      throw H.wrapException("Error in reflectionInfo.");
+    $prototype.$signature = signatureFunction;
+    $prototype[callName] = trampoline;
+    for (t1 = functions.length, i = 1; i < t1; ++i) {
+      stub = functions[i];
+      stubCallName = stub.$callName;
+      if (stubCallName != null) {
+        t2 = isStatic ? stub : H.Closure_forwardCallTo(receiver, stub, isIntercepted);
+        $prototype[stubCallName] = t2;
+      }
+    }
+    $prototype["call*"] = trampoline;
+    return $constructor;
+  },
+  Closure_cspForwardCall: function(arity, isSuperCall, stubName, $function) {
+    var getSelf = H.BoundClosure_selfOf;
+    switch (isSuperCall ? -1 : arity) {
+      case 0:
+        return function(n, S) {
+          return function() {
+            return S(this)[n]();
+          };
+        }(stubName, getSelf);
+      case 1:
+        return function(n, S) {
+          return function(a) {
+            return S(this)[n](a);
+          };
+        }(stubName, getSelf);
+      case 2:
+        return function(n, S) {
+          return function(a, b) {
+            return S(this)[n](a, b);
+          };
+        }(stubName, getSelf);
+      case 3:
+        return function(n, S) {
+          return function(a, b, c) {
+            return S(this)[n](a, b, c);
+          };
+        }(stubName, getSelf);
+      case 4:
+        return function(n, S) {
+          return function(a, b, c, d) {
+            return S(this)[n](a, b, c, d);
+          };
+        }(stubName, getSelf);
+      case 5:
+        return function(n, S) {
+          return function(a, b, c, d, e) {
+            return S(this)[n](a, b, c, d, e);
+          };
+        }(stubName, getSelf);
+      default:
+        return function(f, s) {
+          return function() {
+            return f.apply(s(this), arguments);
+          };
+        }($function, getSelf);
+    }
+  },
+  Closure_forwardCallTo: function(receiver, $function, isIntercepted) {
+    var stubName, arity, lookedUpFunction, t1, t2, $arguments;
+    if (isIntercepted)
+      return H.Closure_forwardInterceptedCallTo(receiver, $function);
+    stubName = $function.$stubName;
+    arity = $function.length;
+    lookedUpFunction = receiver[stubName];
+    t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+    if (typeof dart_precompiled == "function" || !t1 || arity >= 27)
+      return H.Closure_cspForwardCall(arity, !t1, stubName, $function);
+    if (arity === 0) {
+      t1 = $.BoundClosure_selfFieldNameCache;
+      if (t1 == null) {
+        t1 = H.BoundClosure_computeFieldNamed("self");
+        $.BoundClosure_selfFieldNameCache = t1;
+      }
+      t1 = "return function(){return this." + H.S(t1) + "." + H.S(stubName) + "();";
+      t2 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t2, 1);
+      return new Function(t1 + H.S(t2) + "}")();
+    }
+    $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity).join(",");
+    t1 = "return function(" + $arguments + "){return this.";
+    t2 = $.BoundClosure_selfFieldNameCache;
+    if (t2 == null) {
+      t2 = H.BoundClosure_computeFieldNamed("self");
+      $.BoundClosure_selfFieldNameCache = t2;
+    }
+    t2 = t1 + H.S(t2) + "." + H.S(stubName) + "(" + $arguments + ");";
+    t1 = $.Closure_functionCounter;
+    $.Closure_functionCounter = J.$add$ns(t1, 1);
+    return new Function(t2 + H.S(t1) + "}")();
+  },
+  Closure_cspForwardInterceptedCall: function(arity, isSuperCall, $name, $function) {
+    var getSelf, getReceiver;
+    getSelf = H.BoundClosure_selfOf;
+    getReceiver = H.BoundClosure_receiverOf;
+    switch (isSuperCall ? -1 : arity) {
+      case 0:
+        throw H.wrapException(H.RuntimeError$("Intercepted function with no arguments."));
+      case 1:
+        return function(n, s, r) {
+          return function() {
+            return s(this)[n](r(this));
+          };
+        }($name, getSelf, getReceiver);
+      case 2:
+        return function(n, s, r) {
+          return function(a) {
+            return s(this)[n](r(this), a);
+          };
+        }($name, getSelf, getReceiver);
+      case 3:
+        return function(n, s, r) {
+          return function(a, b) {
+            return s(this)[n](r(this), a, b);
+          };
+        }($name, getSelf, getReceiver);
+      case 4:
+        return function(n, s, r) {
+          return function(a, b, c) {
+            return s(this)[n](r(this), a, b, c);
+          };
+        }($name, getSelf, getReceiver);
+      case 5:
+        return function(n, s, r) {
+          return function(a, b, c, d) {
+            return s(this)[n](r(this), a, b, c, d);
+          };
+        }($name, getSelf, getReceiver);
+      case 6:
+        return function(n, s, r) {
+          return function(a, b, c, d, e) {
+            return s(this)[n](r(this), a, b, c, d, e);
+          };
+        }($name, getSelf, getReceiver);
+      default:
+        return function(f, s, r, a) {
+          return function() {
+            a = [r(this)];
+            Array.prototype.push.apply(a, arguments);
+            return f.apply(s(this), a);
+          };
+        }($function, getSelf, getReceiver);
+    }
+  },
+  Closure_forwardInterceptedCallTo: function(receiver, $function) {
+    var selfField, t1, stubName, arity, isCsp, lookedUpFunction, t2, $arguments;
+    selfField = H.BoundClosure_selfFieldName();
+    t1 = $.BoundClosure_receiverFieldNameCache;
+    if (t1 == null) {
+      t1 = H.BoundClosure_computeFieldNamed("receiver");
+      $.BoundClosure_receiverFieldNameCache = t1;
+    }
+    stubName = $function.$stubName;
+    arity = $function.length;
+    isCsp = typeof dart_precompiled == "function";
+    lookedUpFunction = receiver[stubName];
+    t2 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+    if (isCsp || !t2 || arity >= 28)
+      return H.Closure_cspForwardInterceptedCall(arity, !t2, stubName, $function);
+    if (arity === 1) {
+      t1 = "return function(){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + H.S(t1) + ");";
+      t2 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t2, 1);
+      return new Function(t1 + H.S(t2) + "}")();
+    }
+    $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity - 1).join(",");
+    t1 = "return function(" + $arguments + "){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + H.S(t1) + ", " + $arguments + ");";
+    t2 = $.Closure_functionCounter;
+    $.Closure_functionCounter = J.$add$ns(t2, 1);
+    return new Function(t1 + H.S(t2) + "}")();
+  },
+  closureFromTearOff: function(receiver, functions, reflectionInfo, isStatic, jsArguments, $name) {
+    functions.fixed$length = init;
+    reflectionInfo.fixed$length = init;
+    return H.Closure_fromTearOff(receiver, functions, reflectionInfo, !!isStatic, jsArguments, $name);
+  },
+  propertyTypeCastError: function(value, property) {
+    var t1 = J.getInterceptor$asx(property);
+    throw H.wrapException(H.CastErrorImplementation$(H.Primitives_objectTypeName(value), t1.substring$2(property, 3, t1.get$length(property))));
+  },
+  interceptedTypeCast: function(value, property) {
+    var t1;
+    if (value != null)
+      t1 = typeof value === "object" && J.getInterceptor(value)[property];
+    else
+      t1 = true;
+    if (t1)
+      return value;
+    H.propertyTypeCastError(value, property);
+  },
+  throwCyclicInit: function(staticName) {
+    throw H.wrapException(P.CyclicInitializationError$("Cyclic initialization for static " + H.S(staticName)));
+  },
+  buildFunctionType: function(returnType, parameterTypes, optionalParameterTypes) {
+    return new H.RuntimeFunctionType(returnType, parameterTypes, optionalParameterTypes, null);
+  },
+  buildInterfaceType: function(rti, typeArguments) {
+    var $name = rti.name;
+    if (typeArguments == null || typeArguments.length === 0)
+      return new H.RuntimeTypePlain($name);
+    return new H.RuntimeTypeGeneric($name, typeArguments, null);
+  },
+  getDynamicRuntimeType: function() {
+    return C.C_DynamicRuntimeType;
+  },
+  createRuntimeType: function($name) {
+    return new H.TypeImpl($name, null);
+  },
+  setRuntimeTypeInfo: function(target, typeInfo) {
+    if (target != null)
+      target.$builtinTypeInfo = typeInfo;
+    return target;
+  },
+  getRuntimeTypeInfo: function(target) {
+    if (target == null)
+      return;
+    return target.$builtinTypeInfo;
+  },
+  getRuntimeTypeArguments: function(target, substitutionName) {
+    return H.substitute(target["$as" + H.S(substitutionName)], H.getRuntimeTypeInfo(target));
+  },
+  getRuntimeTypeArgument: function(target, substitutionName, index) {
+    var $arguments = H.getRuntimeTypeArguments(target, substitutionName);
+    return $arguments == null ? null : $arguments[index];
+  },
+  getTypeArgumentByIndex: function(target, index) {
+    var rti = H.getRuntimeTypeInfo(target);
+    return rti == null ? null : rti[index];
+  },
+  runtimeTypeToString: function(type, onTypeVariable) {
+    if (type == null)
+      return "dynamic";
+    else if (typeof type === "object" && type !== null && type.constructor === Array)
+      return type[0].builtin$cls + H.joinArguments(type, 1, onTypeVariable);
+    else if (typeof type == "function")
+      return type.builtin$cls;
+    else if (typeof type === "number" && Math.floor(type) === type)
+      return C.JSInt_methods.toString$0(type);
+    else
+      return;
+  },
+  joinArguments: function(types, startIndex, onTypeVariable) {
+    var buffer, index, firstArgument, allDynamic, argument, str;
+    if (types == null)
+      return "";
+    buffer = P.StringBuffer$("");
+    for (index = startIndex, firstArgument = true, allDynamic = true; index < types.length; ++index) {
+      if (firstArgument)
+        firstArgument = false;
+      else
+        buffer._contents += ", ";
+      argument = types[index];
+      if (argument != null)
+        allDynamic = false;
+      str = H.runtimeTypeToString(argument, onTypeVariable);
+      buffer._contents += typeof str === "string" ? str : H.S(str);
+    }
+    return allDynamic ? "" : "<" + H.S(buffer) + ">";
+  },
+  getRuntimeTypeString: function(object) {
+    var className = J.getInterceptor(object).constructor.builtin$cls;
+    if (object == null)
+      return className;
+    return className + H.joinArguments(object.$builtinTypeInfo, 0, null);
+  },
+  substitute: function(substitution, $arguments) {
+    if (typeof substitution === "object" && substitution !== null && substitution.constructor === Array)
+      $arguments = substitution;
+    else if (typeof substitution == "function") {
+      substitution = H.invokeOn(substitution, null, $arguments);
+      if (typeof substitution === "object" && substitution !== null && substitution.constructor === Array)
+        $arguments = substitution;
+      else if (typeof substitution == "function")
+        $arguments = H.invokeOn(substitution, null, $arguments);
+    }
+    return $arguments;
+  },
+  checkSubtype: function(object, isField, checks, asField) {
+    var $arguments, interceptor;
+    if (object == null)
+      return false;
+    $arguments = H.getRuntimeTypeInfo(object);
+    interceptor = J.getInterceptor(object);
+    if (interceptor[isField] == null)
+      return false;
+    return H.areSubtypes(H.substitute(interceptor[asField], $arguments), checks);
+  },
+  areSubtypes: function(s, t) {
+    var len, i;
+    if (s == null || t == null)
+      return true;
+    len = s.length;
+    for (i = 0; i < len; ++i)
+      if (!H.isSubtype(s[i], t[i]))
+        return false;
+    return true;
+  },
+  computeSignature: function(signature, context, contextName) {
+    return H.invokeOn(signature, context, H.getRuntimeTypeArguments(context, contextName));
+  },
+  checkSubtypeOfRuntimeType: function(o, t) {
+    var rti, type;
+    if (o == null)
+      return t == null || t.builtin$cls === "Object" || t.builtin$cls === "Null";
+    if (t == null)
+      return true;
+    rti = H.getRuntimeTypeInfo(o);
+    o = J.getInterceptor(o);
+    if (rti != null) {
+      type = rti.slice();
+      type.splice(0, 0, o);
+    } else
+      type = o;
+    return H.isSubtype(type, t);
+  },
+  isSubtype: function(s, t) {
+    var targetSignatureFunction, t1, typeOfS, t2, typeOfT, $name, substitution;
+    if (s === t)
+      return true;
+    if (s == null || t == null)
+      return true;
+    if ("func" in t) {
+      if (!("func" in s)) {
+        if ("$is_" + H.S(t.func) in s)
+          return true;
+        targetSignatureFunction = s.$signature;
+        if (targetSignatureFunction == null)
+          return false;
+        s = targetSignatureFunction.apply(s, null);
+      }
+      return H.isFunctionSubtype(s, t);
+    }
+    if (t.builtin$cls === "Function" && "func" in s)
+      return true;
+    t1 = typeof s === "object" && s !== null && s.constructor === Array;
+    typeOfS = t1 ? s[0] : s;
+    t2 = typeof t === "object" && t !== null && t.constructor === Array;
+    typeOfT = t2 ? t[0] : t;
+    $name = H.runtimeTypeToString(typeOfT, null);
+    if (typeOfT !== typeOfS) {
+      if (!("$is" + H.S($name) in typeOfS))
+        return false;
+      substitution = typeOfS["$as" + H.S(H.runtimeTypeToString(typeOfT, null))];
+    } else
+      substitution = null;
+    if (!t1 && substitution == null || !t2)
+      return true;
+    t1 = t1 ? s.slice(1) : null;
+    t2 = t2 ? t.slice(1) : null;
+    return H.areSubtypes(H.substitute(substitution, t1), t2);
+  },
+  areAssignable: function(s, t, allowShorter) {
+    var sLength, tLength, i, t1, t2;
+    if (t == null && s == null)
+      return true;
+    if (t == null)
+      return allowShorter;
+    if (s == null)
+      return false;
+    sLength = s.length;
+    tLength = t.length;
+    if (allowShorter) {
+      if (sLength < tLength)
+        return false;
+    } else if (sLength !== tLength)
+      return false;
+    for (i = 0; i < tLength; ++i) {
+      t1 = s[i];
+      t2 = t[i];
+      if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+        return false;
+    }
+    return true;
+  },
+  areAssignableMaps: function(s, t) {
+    var t1, names, i, $name, tType, sType;
+    if (t == null)
+      return true;
+    if (s == null)
+      return false;
+    t1 = Object.getOwnPropertyNames(t);
+    t1.fixed$length = init;
+    names = t1;
+    for (t1 = names.length, i = 0; i < t1; ++i) {
+      $name = names[i];
+      if (!Object.hasOwnProperty.call(s, $name))
+        return false;
+      tType = t[$name];
+      sType = s[$name];
+      if (!(H.isSubtype(tType, sType) || H.isSubtype(sType, tType)))
+        return false;
+    }
+    return true;
+  },
+  isFunctionSubtype: function(s, t) {
+    var sReturnType, tReturnType, sParameterTypes, tParameterTypes, sOptionalParameterTypes, tOptionalParameterTypes, sParametersLen, tParametersLen, sOptionalParametersLen, tOptionalParametersLen, pos, t1, t2, tPos, sPos;
+    if (!("func" in s))
+      return false;
+    if ("void" in s) {
+      if (!("void" in t) && "ret" in t)
+        return false;
+    } else if (!("void" in t)) {
+      sReturnType = s.ret;
+      tReturnType = t.ret;
+      if (!(H.isSubtype(sReturnType, tReturnType) || H.isSubtype(tReturnType, sReturnType)))
+        return false;
+    }
+    sParameterTypes = s.args;
+    tParameterTypes = t.args;
+    sOptionalParameterTypes = s.opt;
+    tOptionalParameterTypes = t.opt;
+    sParametersLen = sParameterTypes != null ? sParameterTypes.length : 0;
+    tParametersLen = tParameterTypes != null ? tParameterTypes.length : 0;
+    sOptionalParametersLen = sOptionalParameterTypes != null ? sOptionalParameterTypes.length : 0;
+    tOptionalParametersLen = tOptionalParameterTypes != null ? tOptionalParameterTypes.length : 0;
+    if (sParametersLen > tParametersLen)
+      return false;
+    if (sParametersLen + sOptionalParametersLen < tParametersLen + tOptionalParametersLen)
+      return false;
+    if (sParametersLen === tParametersLen) {
+      if (!H.areAssignable(sParameterTypes, tParameterTypes, false))
+        return false;
+      if (!H.areAssignable(sOptionalParameterTypes, tOptionalParameterTypes, true))
+        return false;
+    } else {
+      for (pos = 0; pos < sParametersLen; ++pos) {
+        t1 = sParameterTypes[pos];
+        t2 = tParameterTypes[pos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+      for (tPos = pos, sPos = 0; tPos < tParametersLen; ++sPos, ++tPos) {
+        t1 = sOptionalParameterTypes[sPos];
+        t2 = tParameterTypes[tPos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+      for (tPos = 0; tPos < tOptionalParametersLen; ++sPos, ++tPos) {
+        t1 = sOptionalParameterTypes[sPos];
+        t2 = tOptionalParameterTypes[tPos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+    }
+    return H.areAssignableMaps(s.named, t.named);
+  },
+  invokeOn: function($function, receiver, $arguments) {
+    return $function.apply(receiver, $arguments);
+  },
+  toStringForNativeObject: function(obj) {
+    var t1 = $.getTagFunction;
+    return "Instance of " + (t1 == null ? "<Unknown>" : t1.call$1(obj));
+  },
+  hashCodeForNativeObject: function(object) {
+    return H.Primitives_objectHashCode(object);
+  },
+  defineProperty: function(obj, property, value) {
+    Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
+  },
+  lookupAndCacheInterceptor: function(obj) {
+    var tag, record, interceptor, interceptorClass, mark, t1;
+    tag = $.getTagFunction.call$1(obj);
+    record = $.dispatchRecordsForInstanceTags[tag];
+    if (record != null) {
+      Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+      return record.i;
+    }
+    interceptor = $.interceptorsForUncacheableTags[tag];
+    if (interceptor != null)
+      return interceptor;
+    interceptorClass = init.interceptorsByTag[tag];
+    if (interceptorClass == null) {
+      tag = $.alternateTagFunction.call$2(obj, tag);
+      if (tag != null) {
+        record = $.dispatchRecordsForInstanceTags[tag];
+        if (record != null) {
+          Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+          return record.i;
+        }
+        interceptor = $.interceptorsForUncacheableTags[tag];
+        if (interceptor != null)
+          return interceptor;
+        interceptorClass = init.interceptorsByTag[tag];
+      }
+    }
+    if (interceptorClass == null)
+      return;
+    interceptor = interceptorClass.prototype;
+    mark = tag[0];
+    if (mark === "!") {
+      record = H.makeLeafDispatchRecord(interceptor);
+      $.dispatchRecordsForInstanceTags[tag] = record;
+      Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+      return record.i;
+    }
+    if (mark === "~") {
+      $.interceptorsForUncacheableTags[tag] = interceptor;
+      return interceptor;
+    }
+    if (mark === "-") {
+      t1 = H.makeLeafDispatchRecord(interceptor);
+      Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+      return t1.i;
+    }
+    if (mark === "+")
+      return H.patchInteriorProto(obj, interceptor);
+    if (mark === "*")
+      throw H.wrapException(P.UnimplementedError$(tag));
+    if (init.leafTags[tag] === true) {
+      t1 = H.makeLeafDispatchRecord(interceptor);
+      Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+      return t1.i;
+    } else
+      return H.patchInteriorProto(obj, interceptor);
+  },
+  patchInteriorProto: function(obj, interceptor) {
+    var proto, record;
+    proto = Object.getPrototypeOf(obj);
+    record = J.makeDispatchRecord(interceptor, proto, null, null);
+    Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+    return interceptor;
+  },
+  makeLeafDispatchRecord: function(interceptor) {
+    return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
+  },
+  makeDefaultDispatchRecord: function(tag, interceptorClass, proto) {
+    var interceptor = interceptorClass.prototype;
+    if (init.leafTags[tag] === true)
+      return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
+    else
+      return J.makeDispatchRecord(interceptor, proto, null, null);
+  },
+  initNativeDispatch: function() {
+    if (true === $.initNativeDispatchFlag)
+      return;
+    $.initNativeDispatchFlag = true;
+    H.initNativeDispatchContinue();
+  },
+  initNativeDispatchContinue: function() {
+    var map, tags, fun, i, tag, proto, record, interceptorClass;
+    $.dispatchRecordsForInstanceTags = Object.create(null);
+    $.interceptorsForUncacheableTags = Object.create(null);
+    H.initHooks();
+    map = init.interceptorsByTag;
+    tags = Object.getOwnPropertyNames(map);
+    if (typeof window != "undefined") {
+      window;
+      fun = function() {
+      };
+      for (i = 0; i < tags.length; ++i) {
+        tag = tags[i];
+        proto = $.prototypeForTagFunction.call$1(tag);
+        if (proto != null) {
+          record = H.makeDefaultDispatchRecord(tag, map[tag], proto);
+          if (record != null) {
+            Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+            fun.prototype = proto;
+          }
+        }
+      }
+    }
+    for (i = 0; i < tags.length; ++i) {
+      tag = tags[i];
+      if (/^[A-Za-z_]/.test(tag)) {
+        interceptorClass = map[tag];
+        map["!" + tag] = interceptorClass;
+        map["~" + tag] = interceptorClass;
+        map["-" + tag] = interceptorClass;
+        map["+" + tag] = interceptorClass;
+        map["*" + tag] = interceptorClass;
+      }
+    }
+  },
+  initHooks: function() {
+    var hooks, transformers, i, transformer, getTag, getUnknownTag, prototypeForTag;
+    hooks = C.JS_CONST_aQP();
+    hooks = H.applyHooksTransformer(C.JS_CONST_0, H.applyHooksTransformer(C.JS_CONST_rr7, H.applyHooksTransformer(C.JS_CONST_Fs4, H.applyHooksTransformer(C.JS_CONST_Fs4, H.applyHooksTransformer(C.JS_CONST_gkc, H.applyHooksTransformer(C.JS_CONST_4hp, H.applyHooksTransformer(C.JS_CONST_QJm(C.JS_CONST_8ZY), hooks)))))));
+    if (typeof dartNativeDispatchHooksTransformer != "undefined") {
+      transformers = dartNativeDispatchHooksTransformer;
+      if (typeof transformers == "function")
+        transformers = [transformers];
+      if (transformers.constructor == Array)
+        for (i = 0; i < transformers.length; ++i) {
+          transformer = transformers[i];
+          if (typeof transformer == "function")
+            hooks = transformer(hooks) || hooks;
+        }
+    }
+    getTag = hooks.getTag;
+    getUnknownTag = hooks.getUnknownTag;
+    prototypeForTag = hooks.prototypeForTag;
+    $.getTagFunction = new H.initHooks_closure(getTag);
+    $.alternateTagFunction = new H.initHooks_closure0(getUnknownTag);
+    $.prototypeForTagFunction = new H.initHooks_closure1(prototypeForTag);
+  },
+  applyHooksTransformer: function(transformer, hooks) {
+    return transformer(hooks) || hooks;
+  },
+  allMatchesInStringUnchecked: function(needle, haystack) {
+    var result, $length, patternLength, startIndex, position, endIndex;
+    result = H.setRuntimeTypeInfo([], [P.Match]);
+    $length = haystack.length;
+    patternLength = needle.length;
+    for (startIndex = 0; true;) {
+      position = C.JSString_methods.indexOf$2(haystack, needle, startIndex);
+      if (position === -1)
+        break;
+      result.push(new H.StringMatch(position, haystack, needle));
+      endIndex = position + patternLength;
+      if (endIndex === $length)
+        break;
+      else
+        startIndex = position === endIndex ? startIndex + 1 : endIndex;
+    }
+    return result;
+  },
+  stringContainsUnchecked: function(receiver, other, startIndex) {
+    var t1, t2;
+    if (typeof other === "string")
+      return C.JSString_methods.indexOf$2(receiver, other, startIndex) !== -1;
+    else {
+      t1 = J.getInterceptor(other);
+      if (!!t1.$isJSSyntaxRegExp) {
+        t1 = C.JSString_methods.substring$1(receiver, startIndex);
+        t2 = other._nativeRegExp;
+        return t2.test(t1);
+      } else
+        return J.get$isNotEmpty$asx(t1.allMatches$1(other, C.JSString_methods.substring$1(receiver, startIndex)));
+    }
+  },
+  stringReplaceAllUnchecked: function(receiver, from, to) {
+    var result, $length, i, t1;
+    if (from === "")
+      if (receiver === "")
+        return to;
+      else {
+        result = P.StringBuffer$("");
+        $length = receiver.length;
+        result.write$1(to);
+        for (i = 0; i < $length; ++i) {
+          t1 = receiver[i];
+          t1 = result._contents += t1;
+          result._contents = t1 + to;
+        }
+        return result._contents;
+      }
+    else
+      return receiver.replace(new RegExp(from.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]", 'g'), "\\$&"), 'g'), to.replace(/\$/g, "$$$$"));
+  },
+  ConstantMap: {
+    "^": "Object;",
+    get$isEmpty: function(_) {
+      return J.$eq(this.get$length(this), 0);
+    },
+    get$isNotEmpty: function(_) {
+      return !J.$eq(this.get$length(this), 0);
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    _throwUnmodifiable$0: function() {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable Map"));
+    },
+    $indexSet: function(_, key, val) {
+      return this._throwUnmodifiable$0();
+    },
+    clear$0: function(_) {
+      return this._throwUnmodifiable$0();
+    },
+    addAll$1: function(_, other) {
+      return this._throwUnmodifiable$0();
+    },
+    $isMap: true
+  },
+  ConstantStringMap: {
+    "^": "ConstantMap;length>,_jsObject,_keys",
+    containsKey$1: function(key) {
+      if (typeof key !== "string")
+        return false;
+      if ("__proto__" === key)
+        return false;
+      return this._jsObject.hasOwnProperty(key);
+    },
+    $index: function(_, key) {
+      if (!this.containsKey$1(key))
+        return;
+      return this._fetch$1(key);
+    },
+    _fetch$1: function(key) {
+      return this._jsObject[key];
+    },
+    forEach$1: function(_, f) {
+      var keys, i, key;
+      keys = this._keys;
+      for (i = 0; i < keys.length; ++i) {
+        key = keys[i];
+        f.call$2(key, this._fetch$1(key));
+      }
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new H._ConstantMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      return H.MappedIterable_MappedIterable(this._keys, new H.ConstantStringMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    $isEfficientLength: true
+  },
+  ConstantStringMap_values_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(key) {
+      return this.this_0._fetch$1(key);
+    }, "call$1", null, 2, 0, null, 76, "call"],
+    $isFunction: true
+  },
+  _ConstantMapKeyIterable: {
+    "^": "IterableBase;__js_helper$_map",
+    get$iterator: function(_) {
+      return J.get$iterator$ax(this.__js_helper$_map._keys);
+    }
+  },
+  JSInvocationMirror: {
+    "^": "Object;__js_helper$_memberName,_internalName,_kind,_arguments,_namedArgumentNames,_namedIndices",
+    get$memberName: function() {
+      return this.__js_helper$_memberName;
+    },
+    get$isMethod: function() {
+      return this._kind === 0;
+    },
+    get$positionalArguments: function() {
+      var t1, argumentCount, list, index;
+      if (this._kind === 1)
+        return C.List_empty;
+      t1 = this._arguments;
+      argumentCount = t1.length - this._namedArgumentNames.length;
+      if (argumentCount === 0)
+        return C.List_empty;
+      list = [];
+      for (index = 0; index < argumentCount; ++index) {
+        if (index >= t1.length)
+          return H.ioore(t1, index);
+        list.push(t1[index]);
+      }
+      list.immutable$list = true;
+      list.fixed$length = true;
+      return list;
+    },
+    get$namedArguments: function() {
+      var t1, namedArgumentCount, t2, namedArgumentsStartIndex, map, i, t3, t4;
+      if (this._kind !== 0)
+        return P.LinkedHashMap_LinkedHashMap$_empty(P.Symbol, null);
+      t1 = this._namedArgumentNames;
+      namedArgumentCount = t1.length;
+      t2 = this._arguments;
+      namedArgumentsStartIndex = t2.length - namedArgumentCount;
+      if (namedArgumentCount === 0)
+        return P.LinkedHashMap_LinkedHashMap$_empty(P.Symbol, null);
+      map = P.LinkedHashMap_LinkedHashMap(null, null, null, P.Symbol, null);
+      for (i = 0; i < namedArgumentCount; ++i) {
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t3 = t1[i];
+        t4 = namedArgumentsStartIndex + i;
+        if (t4 < 0 || t4 >= t2.length)
+          return H.ioore(t2, t4);
+        map.$indexSet(0, new H.Symbol0(t3), t2[t4]);
+      }
+      return map;
+    },
+    static: {"^": "JSInvocationMirror_METHOD,JSInvocationMirror_GETTER,JSInvocationMirror_SETTER"}
+  },
+  ReflectionInfo: {
+    "^": "Object;jsFunction,data>,isAccessor,requiredParameterCount,optionalParameterCount,areOptionalParametersNamed,functionType,cachedSortedIndices",
+    parameterName$1: function(parameter) {
+      var metadataIndex = this.data[parameter + this.optionalParameterCount + 3];
+      return init.metadata[metadataIndex];
+    },
+    defaultValue$1: function(_, parameter) {
+      var t1 = this.requiredParameterCount;
+      if (typeof parameter !== "number")
+        return parameter.$lt();
+      if (parameter < t1)
+        return;
+      return this.data[3 + parameter - t1];
+    },
+    defaultValueInOrder$1: function(parameter) {
+      var t1 = this.requiredParameterCount;
+      if (parameter < t1)
+        return;
+      if (!this.areOptionalParametersNamed || this.optionalParameterCount === 1)
+        return this.defaultValue$1(0, parameter);
+      return this.defaultValue$1(0, this.sortedIndex$1(parameter - t1));
+    },
+    parameterNameInOrder$1: function(parameter) {
+      var t1 = this.requiredParameterCount;
+      if (parameter < t1)
+        return;
+      if (!this.areOptionalParametersNamed || this.optionalParameterCount === 1)
+        return this.parameterName$1(parameter);
+      return this.parameterName$1(this.sortedIndex$1(parameter - t1));
+    },
+    sortedIndex$1: function(unsortedIndex) {
+      var t1, t2, positions, t3, i, index;
+      t1 = {};
+      if (this.cachedSortedIndices == null) {
+        t2 = this.optionalParameterCount;
+        this.cachedSortedIndices = Array(t2);
+        positions = P.LinkedHashMap_LinkedHashMap$_empty(P.String, P.$int);
+        for (t3 = this.requiredParameterCount, i = 0; i < t2; ++i) {
+          index = t3 + i;
+          positions.$indexSet(0, this.parameterName$1(index), index);
+        }
+        t1.index_0 = 0;
+        t2 = positions.get$keys();
+        t2 = P.List_List$from(t2, true, H.getRuntimeTypeArgument(t2, "IterableBase", 0));
+        H.IterableMixinWorkaround_sortList(t2, null);
+        H.IterableMixinWorkaround_forEach(t2, new H.ReflectionInfo_sortedIndex_closure(t1, this, positions));
+      }
+      t1 = this.cachedSortedIndices;
+      if (unsortedIndex < 0 || unsortedIndex >= t1.length)
+        return H.ioore(t1, unsortedIndex);
+      return t1[unsortedIndex];
+    },
+    static: {"^": "ReflectionInfo_REQUIRED_PARAMETERS_INFO,ReflectionInfo_OPTIONAL_PARAMETERS_INFO,ReflectionInfo_FUNCTION_TYPE_INDEX,ReflectionInfo_FIRST_DEFAULT_ARGUMENT", ReflectionInfo_ReflectionInfo: function(jsFunction) {
+        var data, requiredParametersInfo, optionalParametersInfo;
+        data = jsFunction.$reflectionInfo;
+        if (data == null)
+          return;
+        data.fixed$length = init;
+        data = data;
+        requiredParametersInfo = data[0];
+        optionalParametersInfo = data[1];
+        return new H.ReflectionInfo(jsFunction, data, (requiredParametersInfo & 1) === 1, requiredParametersInfo >> 1, optionalParametersInfo >> 1, (optionalParametersInfo & 1) === 1, data[2], null);
+      }}
+  },
+  ReflectionInfo_sortedIndex_closure: {
+    "^": "Closure:5;box_0,this_1,positions_2",
+    call$1: function($name) {
+      var t1, t2, t3;
+      t1 = this.this_1.cachedSortedIndices;
+      t2 = this.box_0.index_0++;
+      t3 = this.positions_2.$index(0, $name);
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      t1[t2] = t3;
+    },
+    $isFunction: true
+  },
+  Primitives_functionNoSuchMethod_closure: {
+    "^": "Closure:77;box_0,arguments_1,namedArgumentList_2",
+    call$2: function($name, argument) {
+      var t1 = this.box_0;
+      t1.names_1 = t1.names_1 + "$" + H.S($name);
+      this.namedArgumentList_2.push($name);
+      this.arguments_1.push(argument);
+      ++t1.argumentCount_0;
+    },
+    $isFunction: true
+  },
+  Primitives_applyFunction_closure: {
+    "^": "Closure:77;box_0,defaultArguments_1",
+    call$2: function(parameter, value) {
+      var t1 = this.defaultArguments_1;
+      if (t1.containsKey$1(parameter))
+        t1.$indexSet(0, parameter, value);
+      else
+        this.box_0.bad_0 = true;
+    },
+    $isFunction: true
+  },
+  TypeErrorDecoder: {
+    "^": "Object;_pattern,_arguments,_argumentsExpr,_expr,_method,_receiver",
+    matchTypeError$1: function(message) {
+      var match, result, t1;
+      match = new RegExp(this._pattern).exec(message);
+      if (match == null)
+        return;
+      result = {};
+      t1 = this._arguments;
+      if (t1 !== -1)
+        result.arguments = match[t1 + 1];
+      t1 = this._argumentsExpr;
+      if (t1 !== -1)
+        result.argumentsExpr = match[t1 + 1];
+      t1 = this._expr;
+      if (t1 !== -1)
+        result.expr = match[t1 + 1];
+      t1 = this._method;
+      if (t1 !== -1)
+        result.method = match[t1 + 1];
+      t1 = this._receiver;
+      if (t1 !== -1)
+        result.receiver = match[t1 + 1];
+      return result;
+    },
+    static: {"^": "TypeErrorDecoder_noSuchMethodPattern,TypeErrorDecoder_notClosurePattern,TypeErrorDecoder_nullCallPattern,TypeErrorDecoder_nullLiteralCallPattern,TypeErrorDecoder_undefinedCallPattern,TypeErrorDecoder_undefinedLiteralCallPattern,TypeErrorDecoder_nullPropertyPattern,TypeErrorDecoder_nullLiteralPropertyPattern,TypeErrorDecoder_undefinedPropertyPattern,TypeErrorDecoder_undefinedLiteralPropertyPattern", TypeErrorDecoder_extractPattern: function(message) {
+        var match, $arguments, argumentsExpr, expr, method, receiver;
+        message = message.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]", 'g'), '\\$&');
+        match = message.match(/\\\$[a-zA-Z]+\\\$/g);
+        if (match == null)
+          match = [];
+        $arguments = match.indexOf("\\$arguments\\$");
+        argumentsExpr = match.indexOf("\\$argumentsExpr\\$");
+        expr = match.indexOf("\\$expr\\$");
+        method = match.indexOf("\\$method\\$");
+        receiver = match.indexOf("\\$receiver\\$");
+        return new H.TypeErrorDecoder(message.replace('\\$arguments\\$', '((?:x|[^x])*)').replace('\\$argumentsExpr\\$', '((?:x|[^x])*)').replace('\\$expr\\$', '((?:x|[^x])*)').replace('\\$method\\$', '((?:x|[^x])*)').replace('\\$receiver\\$', '((?:x|[^x])*)'), $arguments, argumentsExpr, expr, method, receiver);
+      }, TypeErrorDecoder_provokeCallErrorOn: function(expression) {
+        return function($expr$) {
+          var $argumentsExpr$ = '$arguments$';
+          try {
+            $expr$.$method$($argumentsExpr$);
+          } catch (e) {
+            return e.message;
+          }
+
+        }(expression);
+      }, TypeErrorDecoder_provokePropertyErrorOn: function(expression) {
+        return function($expr$) {
+          try {
+            $expr$.$method$;
+          } catch (e) {
+            return e.message;
+          }
+
+        }(expression);
+      }}
+  },
+  NullError: {
+    "^": "Error;_message,_method",
+    toString$0: function(_) {
+      var t1 = this._method;
+      if (t1 == null)
+        return "NullError: " + H.S(this._message);
+      return "NullError: Cannot call \"" + H.S(t1) + "\" on null";
+    },
+    $isNoSuchMethodError: true,
+    $isError: true
+  },
+  JsNoSuchMethodError: {
+    "^": "Error;_message,_method,_receiver",
+    toString$0: function(_) {
+      var t1, t2;
+      t1 = this._method;
+      if (t1 == null)
+        return "NoSuchMethodError: " + H.S(this._message);
+      t2 = this._receiver;
+      if (t2 == null)
+        return "NoSuchMethodError: Cannot call \"" + H.S(t1) + "\" (" + H.S(this._message) + ")";
+      return "NoSuchMethodError: Cannot call \"" + H.S(t1) + "\" on \"" + H.S(t2) + "\" (" + H.S(this._message) + ")";
+    },
+    $isNoSuchMethodError: true,
+    $isError: true,
+    static: {JsNoSuchMethodError$: function(_message, match) {
+        var t1, t2;
+        t1 = match == null;
+        t2 = t1 ? null : match.method;
+        t1 = t1 ? null : match.receiver;
+        return new H.JsNoSuchMethodError(_message, t2, t1);
+      }}
+  },
+  UnknownJsTypeError: {
+    "^": "Error;_message",
+    toString$0: function(_) {
+      var t1 = this._message;
+      return C.JSString_methods.get$isEmpty(t1) ? "Error" : "Error: " + t1;
+    }
+  },
+  unwrapException_saveStackTrace: {
+    "^": "Closure:13;ex_0",
+    call$1: function(error) {
+      if (!!J.getInterceptor(error).$isError)
+        if (error.$thrownJsError == null)
+          error.$thrownJsError = this.ex_0;
+      return error;
+    },
+    $isFunction: true
+  },
+  _StackTrace: {
+    "^": "Object;_exception,_trace",
+    toString$0: function(_) {
+      var t1, trace;
+      t1 = this._trace;
+      if (t1 != null)
+        return t1;
+      t1 = this._exception;
+      trace = typeof t1 === "object" ? t1.stack : null;
+      t1 = trace == null ? "" : trace;
+      this._trace = t1;
+      return t1;
+    }
+  },
+  invokeClosure_closure: {
+    "^": "Closure:69;closure_0",
+    call$0: function() {
+      return this.closure_0.call$0();
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure0: {
+    "^": "Closure:69;closure_1,arg1_2",
+    call$0: function() {
+      return this.closure_1.call$1(this.arg1_2);
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure1: {
+    "^": "Closure:69;closure_3,arg1_4,arg2_5",
+    call$0: function() {
+      return this.closure_3.call$2(this.arg1_4, this.arg2_5);
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure2: {
+    "^": "Closure:69;closure_6,arg1_7,arg2_8,arg3_9",
+    call$0: function() {
+      return this.closure_6.call$3(this.arg1_7, this.arg2_8, this.arg3_9);
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure3: {
+    "^": "Closure:69;closure_10,arg1_11,arg2_12,arg3_13,arg4_14",
+    call$0: function() {
+      return this.closure_10.call$4(this.arg1_11, this.arg2_12, this.arg3_13, this.arg4_14);
+    },
+    $isFunction: true
+  },
+  Closure: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Closure";
+    },
+    $isFunction: true,
+    get$$call: function() {
+      return this;
+    }
+  },
+  TearOffClosure: {
+    "^": "Closure;"
+  },
+  BoundClosure: {
+    "^": "TearOffClosure;_self,_target,_receiver,__js_helper$_name",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!J.getInterceptor(other).$isBoundClosure)
+        return false;
+      return this._self === other._self && this._target === other._target && this._receiver === other._receiver;
+    },
+    get$hashCode: function(_) {
+      var t1, receiverHashCode;
+      t1 = this._receiver;
+      if (t1 == null)
+        receiverHashCode = H.Primitives_objectHashCode(this._self);
+      else
+        receiverHashCode = typeof t1 !== "object" ? J.get$hashCode$(t1) : H.Primitives_objectHashCode(t1);
+      return J.$xor$n(receiverHashCode, H.Primitives_objectHashCode(this._target));
+    },
+    $isBoundClosure: true,
+    static: {"^": "BoundClosure_selfFieldNameCache,BoundClosure_receiverFieldNameCache", BoundClosure_selfOf: function(closure) {
+        return closure._self;
+      }, BoundClosure_receiverOf: function(closure) {
+        return closure._receiver;
+      }, BoundClosure_selfFieldName: function() {
+        var t1 = $.BoundClosure_selfFieldNameCache;
+        if (t1 == null) {
+          t1 = H.BoundClosure_computeFieldNamed("self");
+          $.BoundClosure_selfFieldNameCache = t1;
+        }
+        return t1;
+      }, BoundClosure_computeFieldNamed: function(fieldName) {
+        var template, t1, names, i, $name;
+        template = new H.BoundClosure("self", "target", "receiver", "name");
+        t1 = Object.getOwnPropertyNames(template);
+        t1.fixed$length = init;
+        names = t1;
+        for (t1 = names.length, i = 0; i < t1; ++i) {
+          $name = names[i];
+          if (template[$name] === fieldName)
+            return $name;
+        }
+      }}
+  },
+  CastErrorImplementation: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return this.message;
+    },
+    $isError: true,
+    static: {CastErrorImplementation$: function(actualType, expectedType) {
+        return new H.CastErrorImplementation("CastError: Casting value of type " + H.S(actualType) + " to incompatible type " + H.S(expectedType));
+      }}
+  },
+  RuntimeError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return "RuntimeError: " + H.S(this.message);
+    },
+    static: {RuntimeError$: function(message) {
+        return new H.RuntimeError(message);
+      }}
+  },
+  RuntimeType: {
+    "^": "Object;"
+  },
+  RuntimeFunctionType: {
+    "^": "RuntimeType;returnType,parameterTypes,optionalParameterTypes,namedParameters",
+    _isTest$1: function(expression) {
+      var functionTypeObject = this._extractFunctionTypeObjectFrom$1(expression);
+      return functionTypeObject == null ? false : H.isFunctionSubtype(functionTypeObject, this.toRti$0());
+    },
+    _extractFunctionTypeObjectFrom$1: function(o) {
+      var interceptor = J.getInterceptor(o);
+      return "$signature" in interceptor ? interceptor.$signature() : null;
+    },
+    toRti$0: function() {
+      var result, t1, t2, namedRti, keys, i, $name;
+      result = {func: "dynafunc"};
+      t1 = this.returnType;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isVoidRuntimeType)
+        result.void = true;
+      else if (!t2.$isDynamicRuntimeType)
+        result.ret = t1.toRti$0();
+      t1 = this.parameterTypes;
+      if (t1 != null && t1.length !== 0)
+        result.args = H.RuntimeFunctionType_listToRti(t1);
+      t1 = this.optionalParameterTypes;
+      if (t1 != null && t1.length !== 0)
+        result.opt = H.RuntimeFunctionType_listToRti(t1);
+      t1 = this.namedParameters;
+      if (t1 != null) {
+        namedRti = {};
+        keys = H.extractKeys(t1);
+        for (t2 = keys.length, i = 0; i < t2; ++i) {
+          $name = keys[i];
+          namedRti[$name] = t1[$name].toRti$0();
+        }
+        result.named = namedRti;
+      }
+      return result;
+    },
+    toString$0: function(_) {
+      var t1, t2, result, needsComma, i, type, keys, $name;
+      t1 = this.parameterTypes;
+      if (t1 != null)
+        for (t2 = t1.length, result = "(", needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+          type = t1[i];
+          if (needsComma)
+            result += ", ";
+          result += H.S(type);
+        }
+      else {
+        result = "(";
+        needsComma = false;
+      }
+      t1 = this.optionalParameterTypes;
+      if (t1 != null && t1.length !== 0) {
+        result = (needsComma ? result + ", " : result) + "[";
+        for (t2 = t1.length, needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+          type = t1[i];
+          if (needsComma)
+            result += ", ";
+          result += H.S(type);
+        }
+        result += "]";
+      } else {
+        t1 = this.namedParameters;
+        if (t1 != null) {
+          result = (needsComma ? result + ", " : result) + "{";
+          keys = H.extractKeys(t1);
+          for (t2 = keys.length, needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+            $name = keys[i];
+            if (needsComma)
+              result += ", ";
+            result += H.S(t1[$name].toRti$0()) + " " + $name;
+          }
+          result += "}";
+        }
+      }
+      return result + (") -> " + H.S(this.returnType));
+    },
+    static: {"^": "RuntimeFunctionType_inAssert", RuntimeFunctionType_listToRti: function(list) {
+        var result, t1, i;
+        list = list;
+        result = [];
+        for (t1 = list.length, i = 0; i < t1; ++i)
+          result.push(list[i].toRti$0());
+        return result;
+      }}
+  },
+  DynamicRuntimeType: {
+    "^": "RuntimeType;",
+    toString$0: function(_) {
+      return "dynamic";
+    },
+    toRti$0: function() {
+      return;
+    },
+    $isDynamicRuntimeType: true
+  },
+  RuntimeTypePlain: {
+    "^": "RuntimeType;name>",
+    toRti$0: function() {
+      var t1, rti;
+      t1 = this.name;
+      rti = init.allClasses[t1];
+      if (rti == null)
+        throw H.wrapException("no type for '" + H.S(t1) + "'");
+      return rti;
+    },
+    toString$0: function(_) {
+      return this.name;
+    }
+  },
+  RuntimeTypeGeneric: {
+    "^": "RuntimeType;name>,arguments,rti",
+    toRti$0: function() {
+      var t1, result;
+      t1 = this.rti;
+      if (t1 != null)
+        return t1;
+      t1 = this.name;
+      result = [init.allClasses[t1]];
+      if (0 >= result.length)
+        return H.ioore(result, 0);
+      if (result[0] == null)
+        throw H.wrapException("no type for '" + H.S(t1) + "<...>'");
+      for (t1 = this.arguments, t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        result.push(t1._current.toRti$0());
+      this.rti = result;
+      return result;
+    },
+    toString$0: function(_) {
+      return H.S(this.name) + "<" + J.join$1$ax(this.arguments, ", ") + ">";
+    }
+  },
+  TypeImpl: {
+    "^": "Object;_typeName,_unmangledName",
+    toString$0: function(_) {
+      var t1, unmangledName;
+      t1 = this._unmangledName;
+      if (t1 != null)
+        return t1;
+      unmangledName = this._typeName.replace(/[^<,> ]+/g, function(m) {
+        return init.mangledGlobalNames[m] || m;
+      });
+      this._unmangledName = unmangledName;
+      return unmangledName;
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this._typeName);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isTypeImpl && J.$eq(this._typeName, other._typeName);
+    },
+    $isTypeImpl: true,
+    $isType: true
+  },
+  initHooks_closure: {
+    "^": "Closure:13;getTag_0",
+    call$1: function(o) {
+      return this.getTag_0(o);
+    },
+    $isFunction: true
+  },
+  initHooks_closure0: {
+    "^": "Closure:78;getUnknownTag_1",
+    call$2: function(o, tag) {
+      return this.getUnknownTag_1(o, tag);
+    },
+    $isFunction: true
+  },
+  initHooks_closure1: {
+    "^": "Closure:5;prototypeForTag_2",
+    call$1: function(tag) {
+      return this.prototypeForTag_2(tag);
+    },
+    $isFunction: true
+  },
+  JSSyntaxRegExp: {
+    "^": "Object;pattern,_nativeRegExp,_nativeGlobalRegExp,_nativeAnchoredRegExp",
+    get$_nativeGlobalVersion: function() {
+      var t1 = this._nativeGlobalRegExp;
+      if (t1 != null)
+        return t1;
+      t1 = this._nativeRegExp;
+      t1 = H.JSSyntaxRegExp_makeNative(this.pattern, t1.multiline, !t1.ignoreCase, true);
+      this._nativeGlobalRegExp = t1;
+      return t1;
+    },
+    get$_nativeAnchoredVersion: function() {
+      var t1 = this._nativeAnchoredRegExp;
+      if (t1 != null)
+        return t1;
+      t1 = this._nativeRegExp;
+      t1 = H.JSSyntaxRegExp_makeNative(this.pattern + "|()", t1.multiline, !t1.ignoreCase, true);
+      this._nativeAnchoredRegExp = t1;
+      return t1;
+    },
+    firstMatch$1: function(str) {
+      var m;
+      if (typeof str !== "string")
+        H.throwExpression(P.ArgumentError$(str));
+      m = this._nativeRegExp.exec(str);
+      if (m == null)
+        return;
+      return H._MatchImplementation$(this, m);
+    },
+    hasMatch$1: function(str) {
+      if (typeof str !== "string")
+        H.throwExpression(P.ArgumentError$(str));
+      return this._nativeRegExp.test(str);
+    },
+    allMatches$1: function(_, str) {
+      return new H._AllMatchesIterable(this, str);
+    },
+    _execGlobal$2: function(string, start) {
+      var regexp, match;
+      regexp = this.get$_nativeGlobalVersion();
+      regexp.lastIndex = start;
+      match = regexp.exec(string);
+      if (match == null)
+        return;
+      return H._MatchImplementation$(this, match);
+    },
+    _execAnchored$2: function(string, start) {
+      var regexp, match, t1, t2;
+      regexp = this.get$_nativeAnchoredVersion();
+      regexp.lastIndex = start;
+      match = regexp.exec(string);
+      if (match == null)
+        return;
+      t1 = match.length;
+      t2 = t1 - 1;
+      if (t2 < 0)
+        return H.ioore(match, t2);
+      if (match[t2] != null)
+        return;
+      C.JSArray_methods.set$length(match, t2);
+      return H._MatchImplementation$(this, match);
+    },
+    matchAsPrefix$2: function(_, string, start) {
+      var t1;
+      if (start >= 0) {
+        t1 = J.get$length$asx(string);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = start > t1;
+      } else
+        t1 = true;
+      if (t1)
+        throw H.wrapException(P.RangeError$range(start, 0, J.get$length$asx(string)));
+      return this._execAnchored$2(string, start);
+    },
+    matchAsPrefix$1: function($receiver, string) {
+      return this.matchAsPrefix$2($receiver, string, 0);
+    },
+    $isJSSyntaxRegExp: true,
+    $isRegExp: true,
+    static: {JSSyntaxRegExp_makeNative: function(source, multiLine, caseSensitive, global) {
+        var m, i, g, regexp, errorMessage;
+        m = multiLine ? "m" : "";
+        i = caseSensitive ? "" : "i";
+        g = global ? "g" : "";
+        regexp = function() {
+          try {
+            return new RegExp(source, m + i + g);
+          } catch (e) {
+            return e;
+          }
+
+        }();
+        if (regexp instanceof RegExp)
+          return regexp;
+        errorMessage = String(regexp);
+        throw H.wrapException(P.FormatException$("Illegal RegExp pattern: " + source + ", " + errorMessage));
+      }}
+  },
+  _MatchImplementation: {
+    "^": "Object;pattern,_match",
+    $index: function(_, index) {
+      var t1 = this._match;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    _MatchImplementation$2: function(pattern, _match) {
+    },
+    $isMatch: true,
+    static: {_MatchImplementation$: function(pattern, _match) {
+        var t1 = new H._MatchImplementation(pattern, _match);
+        t1._MatchImplementation$2(pattern, _match);
+        return t1;
+      }}
+  },
+  _AllMatchesIterable: {
+    "^": "IterableBase;_re,_string",
+    get$iterator: function(_) {
+      return new H._AllMatchesIterator(this._re, this._string, null);
+    },
+    $asIterableBase: function() {
+      return [P.Match];
+    },
+    $asIterable: function() {
+      return [P.Match];
+    }
+  },
+  _AllMatchesIterator: {
+    "^": "Object;_regExp,_string,__js_helper$_current",
+    get$current: function() {
+      return this.__js_helper$_current;
+    },
+    moveNext$0: function() {
+      var t1, t2, index;
+      if (this._string == null)
+        return false;
+      t1 = this.__js_helper$_current;
+      if (t1 != null) {
+        t1 = t1._match;
+        t2 = t1.index;
+        if (0 >= t1.length)
+          return H.ioore(t1, 0);
+        t1 = J.get$length$asx(t1[0]);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        index = t2 + t1;
+        if (this.__js_helper$_current._match.index === index)
+          ++index;
+      } else
+        index = 0;
+      t1 = this._regExp._execGlobal$2(this._string, index);
+      this.__js_helper$_current = t1;
+      if (t1 == null) {
+        this._string = null;
+        return false;
+      }
+      return true;
+    }
+  },
+  StringMatch: {
+    "^": "Object;start,input,pattern",
+    $index: function(_, g) {
+      if (!J.$eq(g, 0))
+        H.throwExpression(P.RangeError$value(g));
+      return this.pattern;
+    },
+    $isMatch: true
+  }
+}],
+["action_link_element", "package:observatory/src/elements/action_link.dart", , X, {
+  "^": "",
+  ActionLinkElement: {
+    "^": "PolymerElement_ChangeNotifier;_action_link_element$__$busy,_action_link_element$__$callback,_action_link_element$__$label,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$busy: function(receiver) {
+      return receiver._action_link_element$__$busy;
+    },
+    set$busy: function(receiver, value) {
+      receiver._action_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._action_link_element$__$busy, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._action_link_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._action_link_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._action_link_element$__$callback, value);
+    },
+    get$label: function(receiver) {
+      return receiver._action_link_element$__$label;
+    },
+    set$label: function(receiver, value) {
+      receiver._action_link_element$__$label = this.notifyPropertyChange$3(receiver, C.Symbol_label, receiver._action_link_element$__$label, value);
+    },
+    doAction$3: [function(receiver, a, b, c) {
+      var t1 = receiver._action_link_element$__$busy;
+      if (t1 === true)
+        return;
+      if (receiver._action_link_element$__$callback != null) {
+        receiver._action_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, t1, true);
+        this.callback$1(receiver, null).whenComplete$1(new X.ActionLinkElement_doAction_closure(receiver));
+      }
+    }, "call$3", "get$doAction", 6, 0, 79, 46, 47, 80],
+    static: {ActionLinkElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._action_link_element$__$busy = false;
+        receiver._action_link_element$__$callback = null;
+        receiver._action_link_element$__$label = "action";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ActionLinkElement_methods.Element$created$0(receiver);
+        C.ActionLinkElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ActionLinkElement_doAction_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      t1._action_link_element$__$busy = J.notifyPropertyChange$3$x(t1, C.Symbol_busy, t1._action_link_element$__$busy, false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+}],
+["app", "package:observatory/app.dart", , G, {
+  "^": "",
+  GoogleChart__initOnceOnComplete: [function(_) {
+    var t1;
+    N.Logger_Logger("").info$1("Google Charts API loaded");
+    t1 = J.$index$asx(J.$index$asx($.get$context(), "google"), "visualization");
+    $.GoogleChart__api = t1;
+    return t1;
+  }, "call$1", "GoogleChart__initOnceOnComplete$closure", 2, 0, 13, 14],
+  Utils_formatPercent: function(a, total) {
+    return C.JSNumber_methods.toStringAsFixed$1(100 * J.$div$n(a, total), 2) + "%";
+  },
+  Utils_zeroPad: function(value, pad) {
+    var prefix;
+    for (prefix = ""; pad > 1;) {
+      --pad;
+      if (value < Math.pow(10, pad))
+        prefix += "0";
+    }
+    return prefix + H.S(value);
+  },
+  Utils_formatCommaSeparated: [function(v) {
+    var t1, mod, r;
+    t1 = J.getInterceptor$n(v);
+    if (t1.$lt(v, 1000))
+      return t1.toString$0(v);
+    mod = t1.$mod(v, 1000);
+    v = t1.$tdiv(v, 1000);
+    r = G.Utils_zeroPad(mod, 3);
+    for (; t1 = J.getInterceptor$n(v), t1.$gt(v, 1000);) {
+      r = G.Utils_zeroPad(t1.$mod(v, 1000), 3) + "," + r;
+      v = t1.$tdiv(v, 1000);
+    }
+    return !t1.$eq(v, 0) ? H.S(v) + "," + r : r;
+  }, "call$1", "Utils_formatCommaSeparated$closure", 2, 0, 15],
+  Utils_formatTimePrecise: function(time) {
+    var millis, hours, minutes, seconds;
+    millis = C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(time * 1000));
+    hours = C.JSInt_methods._tdivFast$1(millis, 3600000);
+    millis = C.JSInt_methods.$mod(millis, 3600000);
+    minutes = C.JSInt_methods._tdivFast$1(millis, 60000);
+    millis = C.JSInt_methods.$mod(millis, 60000);
+    seconds = C.JSInt_methods._tdivFast$1(millis, 1000);
+    millis = C.JSInt_methods.$mod(millis, 1000);
+    if (hours > 0)
+      return G.Utils_zeroPad(hours, 2) + ":" + G.Utils_zeroPad(minutes, 2) + ":" + G.Utils_zeroPad(seconds, 2) + "." + G.Utils_zeroPad(millis, 3);
+    else
+      return G.Utils_zeroPad(minutes, 2) + ":" + G.Utils_zeroPad(seconds, 2) + "." + G.Utils_zeroPad(millis, 3);
+  },
+  Utils_formatSize: [function(bytes) {
+    var t1 = J.getInterceptor$n(bytes);
+    if (t1.$lt(bytes, 1024))
+      return H.S(bytes) + "B";
+    else if (t1.$lt(bytes, 1048576))
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1024), 1) + "KB";
+    else if (t1.$lt(bytes, 1073741824))
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1048576), 1) + "MB";
+    else if (t1.$lt(bytes, 1099511627776))
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1073741824), 1) + "GB";
+    else
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1099511627776), 1) + "TB";
+  }, "call$1", "Utils_formatSize$closure", 2, 0, 15, 16],
+  Utils_formatTime: function(time) {
+    var millis, hours, minutes, seconds;
+    if (time == null)
+      return "-";
+    millis = J.round$0$n(J.$mul$ns(time, 1000));
+    hours = C.JSInt_methods._tdivFast$1(millis, 3600000);
+    millis = C.JSInt_methods.$mod(millis, 3600000);
+    minutes = C.JSInt_methods._tdivFast$1(millis, 60000);
+    seconds = C.JSInt_methods._tdivFast$1(C.JSInt_methods.$mod(millis, 60000), 1000);
+    P.StringBuffer$("");
+    if (hours !== 0)
+      return "" + hours + "h " + minutes + "m " + seconds + "s";
+    if (minutes !== 0)
+      return "" + minutes + "m " + seconds + "s";
+    return "" + seconds + "s";
+  },
+  Pane: {
+    "^": "ChangeNotifier;",
+    get$element: function(_) {
+      return this._app$__$element;
+    },
+    $isPane: true
+  },
+  ServiceObjectPane: {
+    "^": "Pane;app,_app$__$element,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onInstall$0: function() {
+      if (this._app$__$element == null) {
+        var t1 = W._ElementFactoryProvider_createElement_tag("service-view", null);
+        this._app$__$element = F.notifyPropertyChangeHelper(this, C.Symbol_element, this._app$__$element, t1);
+      }
+    },
+    visit$1: function(url) {
+      if (J.$eq(url, ""))
+        return;
+      this.app.vm.get$1(url).then$1(new G.ServiceObjectPane_visit_closure(this));
+    },
+    canVisit$1: function(url) {
+      return true;
+    }
+  },
+  ServiceObjectPane_visit_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(obj) {
+      J.set$object$x(this.this_0._app$__$element, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  ClassTreePane: {
+    "^": "Pane;app,_app$__$element,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onInstall$0: function() {
+      if (this._app$__$element == null) {
+        var t1 = W._ElementFactoryProvider_createElement_tag("class-tree", null);
+        this._app$__$element = F.notifyPropertyChangeHelper(this, C.Symbol_element, this._app$__$element, t1);
+      }
+    },
+    visit$1: function(url) {
+      this.app.vm.get$1(J.substring$1$s(url, 11)).then$1(new G.ClassTreePane_visit_closure(this));
+    },
+    canVisit$1: function(url) {
+      return J.startsWith$1$s(url, "class-tree/");
+    },
+    static: {"^": "ClassTreePane__urlPrefix"}
+  },
+  ClassTreePane_visit_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(i) {
+      var t1 = this.this_0._app$__$element;
+      if (t1 != null)
+        J.set$isolate$x(t1, i);
+    }, "call$1", null, 2, 0, null, 82, "call"],
+    $isFunction: true
+  },
+  ErrorViewPane: {
+    "^": "Pane;app,_app$__$element,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onInstall$0: function() {
+      if (this._app$__$element == null) {
+        var t1 = W._ElementFactoryProvider_createElement_tag("service-view", null);
+        this._app$__$element = F.notifyPropertyChangeHelper(this, C.Symbol_element, this._app$__$element, t1);
+      }
+    },
+    visit$1: function(url) {
+      var t1, t2;
+      t1 = H.interceptedTypeCast(this._app$__$element, "$isServiceObjectViewElement");
+      t2 = this.app.lastErrorOrException;
+      t1._service_object_view_element$__$object = J.notifyPropertyChange$3$x(t1, C.Symbol_object, t1._service_object_view_element$__$object, t2);
+    },
+    canVisit$1: function(url) {
+      return J.startsWith$1$s(url, "error/");
+    }
+  },
+  ObservatoryApplication: {
+    "^": "ChangeNotifier;_paneRegistry,_serviceObjectPane,_currentPane,locationManager,vm>,_app$__$isolate,rootElement,lastErrorOrException,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$isolate: function(_) {
+      return this._app$__$isolate;
+    },
+    set$isolate: function(_, value) {
+      this._app$__$isolate = F.notifyPropertyChangeHelper(this, C.Symbol_isolate, this._app$__$isolate, value);
+    },
+    _initOnce$0: function() {
+      var t1, t2;
+      this._registerPanes$0();
+      t1 = this.vm;
+      t2 = t1.errors;
+      H.setRuntimeTypeInfo(new P._BroadcastStream(t2), [H.getTypeArgumentByIndex(t2, 0)]).listen$1(this.get$_app$_onError());
+      t1 = t1.exceptions;
+      H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]).listen$1(this.get$_onException());
+      t1 = this.locationManager;
+      $.location = t1;
+      t1._app = this;
+      t2 = H.setRuntimeTypeInfo(new W._EventStream(window, C.EventStreamProvider_popstate._eventType, false), [null]);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t2._html$_target, t2._eventType, W._wrapZone(t1.get$_onLocationChange()), t2._useCapture), [H.getTypeArgumentByIndex(t2, 0)])._tryResume$0();
+      t1._onStartup$0();
+    },
+    _registerPanes$0: function() {
+      var t1, t2;
+      if (this._serviceObjectPane != null)
+        return;
+      t1 = this._paneRegistry;
+      t1.push(new G.ClassTreePane(this, null, null, null));
+      t1.push(new G.ErrorViewPane(this, null, null, null));
+      t2 = new G.ServiceObjectPane(this, null, null, null);
+      this._serviceObjectPane = t2;
+      t1.push(t2);
+    },
+    _app$_onError$1: [function(error) {
+      this.lastErrorOrException = error;
+      this._visit$2("error/", null);
+    }, "call$1", "get$_app$_onError", 2, 0, 83, 24],
+    _onException$1: [function(exception) {
+      this.lastErrorOrException = exception;
+      this._visit$2("error/", null);
+    }, "call$1", "get$_onException", 2, 0, 84, 85],
+    _visit$2: function(url, args) {
+      var t1, i, pane;
+      for (t1 = this._paneRegistry, i = 0; i < t1.length; ++i) {
+        pane = t1[i];
+        if (pane.canVisit$1(url)) {
+          this._installPane$1(pane);
+          pane.visit$1(url);
+          return;
+        }
+      }
+      throw H.wrapException(P.FallThroughError$());
+    },
+    _installPane$1: function(pane) {
+      var line, t1, t2;
+      line = "Installing " + J.toString$0(pane);
+      t1 = $.printToZone;
+      if (t1 == null)
+        H.printString(line);
+      else
+        t1.call$1(line);
+      t1 = this._currentPane;
+      if (t1 == null ? pane == null : t1 === pane)
+        return;
+      if (t1 != null) {
+        t2 = t1._app$__$element;
+        if (t1.get$hasObservers(t1) && t2 != null) {
+          t2 = new T.PropertyChangeRecord(t1, C.Symbol_element, t2, null);
+          t2.$builtinTypeInfo = [null];
+          t1.notifyChange$1(t1, t2);
+        }
+        t1._app$__$element = null;
+      }
+      pane.onInstall$0();
+      t1 = this.rootElement;
+      J._clearChildren$0$x(t1);
+      t1.appendChild(pane._app$__$element);
+      this._currentPane = pane;
+    },
+    ObservatoryApplication$1: function(rootElement) {
+      this._initOnce$0();
+    },
+    ObservatoryApplication$devtools$1: function(rootElement) {
+      this._initOnce$0();
+    }
+  },
+  DataTable: {
+    "^": "Object;_app$_table",
+    get$columns: function() {
+      return this._app$_table.callMethod$1("getNumberOfColumns");
+    },
+    get$rows: function(_) {
+      return this._app$_table.callMethod$1("getNumberOfRows");
+    },
+    clearRows$0: function() {
+      var t1 = this._app$_table;
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+    },
+    addRow$1: function(_, row) {
+      var t1 = [];
+      C.JSArray_methods.addAll$1(t1, J.map$1$ax(row, P._convertToJS$closure()));
+      this._app$_table.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t1), [null])]);
+    }
+  },
+  Chart: {
+    "^": "Object;_app$_chart,options",
+    draw$1: function(table) {
+      var jsOptions = P.JsObject_JsObject$jsify(this.options);
+      this._app$_chart.callMethod$2("draw", [table._app$_table, jsOptions]);
+    }
+  },
+  LocationManager: {
+    "^": "Observable;",
+    _go$1: function(url) {
+      var chunks, t1, args;
+      if (J.getInterceptor$s(url).startsWith$1(url, "#"))
+        url = C.JSString_methods.substring$1(url, 1);
+      if (C.JSString_methods.startsWith$1(url, "/"))
+        url = C.JSString_methods.substring$1(url, 1);
+      if (C.JSString_methods.contains$1(url, "#")) {
+        chunks = url.split("#");
+        t1 = chunks.length;
+        if (0 >= t1)
+          return H.ioore(chunks, 0);
+        url = chunks[0];
+        if (t1 > 1 && !J.$eq(chunks[1], "")) {
+          if (1 >= chunks.length)
+            return H.ioore(chunks, 1);
+          args = chunks[1];
+        } else
+          args = null;
+      } else
+        args = null;
+      this._app._visit$2(url, args);
+    },
+    onGoto$3: function($event, detail, target) {
+      var href, t1, t2, t3;
+      href = J.get$attributes$x(target)._html$_element.getAttribute("href");
+      t1 = J.getInterceptor$x($event);
+      t2 = t1.get$button($event);
+      if (typeof t2 !== "number")
+        return t2.$gt();
+      if (t2 > 1 || t1.get$metaKey($event) === true || t1.get$ctrlKey($event) === true || t1.get$shiftKey($event) === true || t1.get$altKey($event) === true)
+        return;
+      t2 = $.location;
+      t3 = t2._lastUrl;
+      if (t3 == null ? href != null : t3 !== href) {
+        N.Logger_Logger("").info$1("Navigated to " + H.S(href));
+        window.history.pushState(href, document.title, href);
+        t2._lastUrl = href;
+      }
+      t2._go$1(href);
+      t1.preventDefault$0($event);
+    }
+  },
+  HashLocationManager: {
+    "^": "LocationManager;_initialPath,_app,_lastUrl,observable$Observable$_observable$_changes,observable$Observable$_values,observable$Observable$_records",
+    _onStartup$0: function() {
+      var initialPath = H.S(window.location.hash);
+      if (window.location.hash === "" || window.location.hash === "#")
+        initialPath = "#" + this._initialPath;
+      window.history.pushState(initialPath, document.title, initialPath);
+      this._go$1(window.location.hash);
+    },
+    _onLocationChange$1: [function(_) {
+      this._go$1(window.location.hash);
+    }, "call$1", "get$_onLocationChange", 2, 0, 86, 14]
+  },
+  TableTreeRow: {
+    "^": "ChangeNotifier;parent>,depth<,children>,columns<",
+    get$expander: function(_) {
+      return this._app$__$expander;
+    },
+    get$expanderStyle: function() {
+      return this._app$__$expanderStyle;
+    },
+    get$expanded: function(_) {
+      return this._expanded;
+    },
+    set$expanded: function(_, expanded) {
+      var t1 = J.$eq(this._expanded, expanded);
+      this._expanded = expanded;
+      if (!t1) {
+        t1 = this._app$__$expander;
+        if (expanded === true) {
+          this._app$__$expander = F.notifyPropertyChangeHelper(this, C.Symbol_expander, t1, "\u21b3");
+          this.onShow$0(0);
+        } else {
+          this._app$__$expander = F.notifyPropertyChangeHelper(this, C.Symbol_expander, t1, "\u2192");
+          this.onHide$0();
+        }
+      }
+    },
+    toggle$0: function() {
+      this.set$expanded(0, this._expanded !== true);
+      return this._expanded;
+    },
+    TableTreeRow$1: function($parent) {
+      if (!this.hasChildren$0())
+        this._app$__$expanderStyle = F.notifyPropertyChangeHelper(this, C.Symbol_expanderStyle, this._app$__$expanderStyle, "visibility:hidden;");
+    },
+    $isTableTreeRow: true
+  },
+  TableTree: {
+    "^": "ChangeNotifier;rows>,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    initialize$1: function(root) {
+      var t1, t2;
+      t1 = this.rows;
+      t2 = J.getInterceptor$ax(t1);
+      t2.clear$0(t1);
+      root.onShow$0(0);
+      t2.addAll$1(t1, root.children);
+    },
+    toggle$1: function(rowIndex) {
+      var t1, t2, row;
+      t1 = this.rows;
+      t2 = J.getInterceptor$asx(t1);
+      row = t2.$index(t1, rowIndex);
+      if (row.toggle$0() === true)
+        t2.insertAll$2(t1, t2.indexOf$1(t1, row) + 1, J.get$children$x(row));
+      else
+        this._collapse$1(row);
+    },
+    _collapse$1: function(row) {
+      var t1, childCount, i, t2, t3;
+      t1 = J.getInterceptor$x(row);
+      childCount = J.get$length$asx(t1.get$children(row));
+      if (childCount === 0)
+        return;
+      for (i = 0; i < childCount; ++i)
+        if (J.get$expanded$x(J.$index$asx(t1.get$children(row), i)) === true)
+          this._collapse$1(J.$index$asx(t1.get$children(row), i));
+      t1.set$expanded(row, false);
+      t1 = this.rows;
+      t2 = J.getInterceptor$asx(t1);
+      t3 = t2.indexOf$1(t1, row) + 1;
+      t2.removeRange$2(t1, t3, t3 + childCount);
+    }
+  },
+  SortedTableColumn: {
+    "^": "Object;label>,formatter<",
+    static: {SortedTableColumn_toStringFormatter: [function(v) {
+        return v != null ? J.toString$0(v) : "<null>";
+      }, "call$1", "SortedTableColumn_toStringFormatter$closure", 2, 0, 17]}
+  },
+  SortedTableRow: {
+    "^": "Object;values>",
+    $isSortedTableRow: true
+  },
+  SortedTable: {
+    "^": "ChangeNotifier;columns<,rows>,sortedRows<",
+    set$sortColumnIndex: function(index) {
+      this._sortColumnIndex = index;
+      F.notifyPropertyChangeHelper(this, C.Symbol_getColumnLabel, 0, 1);
+    },
+    get$sortColumnIndex: function() {
+      return this._sortColumnIndex;
+    },
+    get$sortDescending: function() {
+      return this._sortDescending;
+    },
+    set$sortDescending: function(descending) {
+      this._sortDescending = descending;
+      F.notifyPropertyChangeHelper(this, C.Symbol_getColumnLabel, 0, 1);
+    },
+    getSortKeyFor$2: function(row, col) {
+      var t1 = this.rows;
+      if (row >>> 0 !== row || row >= t1.length)
+        return H.ioore(t1, row);
+      return J.$index$asx(J.get$values$x(t1[row]), col);
+    },
+    _sortFuncDescending$2: [function(i, j) {
+      var a = this.getSortKeyFor$2(i, this._sortColumnIndex);
+      return J.compareTo$1$ns(this.getSortKeyFor$2(j, this._sortColumnIndex), a);
+    }, "call$2", "get$_sortFuncDescending", 4, 0, 87],
+    _sortFuncAscending$2: [function(i, j) {
+      return J.compareTo$1$ns(this.getSortKeyFor$2(i, this._sortColumnIndex), this.getSortKeyFor$2(j, this._sortColumnIndex));
+    }, "call$2", "get$_sortFuncAscending", 4, 0, 87],
+    sort$0: function(_) {
+      var t1, t2;
+      new P.Stopwatch(1000000, null, null).start$0(0);
+      t1 = this.sortedRows;
+      if (this._sortDescending) {
+        t2 = this.get$_sortFuncDescending();
+        H.IterableMixinWorkaround_sortList(t1, t2);
+      } else {
+        t2 = this.get$_sortFuncAscending();
+        H.IterableMixinWorkaround_sortList(t1, t2);
+      }
+    },
+    clearRows$0: function() {
+      C.JSArray_methods.set$length(this.rows, 0);
+      C.JSArray_methods.set$length(this.sortedRows, 0);
+    },
+    addRow$1: function(_, row) {
+      var t1 = this.rows;
+      this.sortedRows.push(t1.length);
+      t1.push(row);
+    },
+    getFormattedValue$2: function(row, column) {
+      var t1, value;
+      t1 = this.rows;
+      if (row >= t1.length)
+        return H.ioore(t1, row);
+      value = J.$index$asx(J.get$values$x(t1[row]), column);
+      t1 = this.columns;
+      if (column >= t1.length)
+        return H.ioore(t1, column);
+      return t1[column].get$formatter().call$1(value);
+    },
+    getColumnLabel$1: [function(column) {
+      var t1;
+      if (!J.$eq(column, this._sortColumnIndex)) {
+        t1 = this.columns;
+        if (column >>> 0 !== column || column >= t1.length)
+          return H.ioore(t1, column);
+        return J.$add$ns(J.get$label$x(t1[column]), "\u2003");
+      }
+      t1 = this.columns;
+      if (column >>> 0 !== column || column >= t1.length)
+        return H.ioore(t1, column);
+      t1 = J.get$label$x(t1[column]);
+      return J.$add$ns(t1, this._sortDescending ? "\u25bc" : "\u25b2");
+    }, "call$1", "get$getColumnLabel", 2, 0, 15, 88]
+  }
+}],
+["app_bootstrap", "index_devtools.html_bootstrap.dart", , E, {
+  "^": "",
+  main0: [function() {
+    var t1, t2, t3, t4, t5;
+    t1 = P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, new E.main_closure(), C.Symbol_address, new E.main_closure0(), C.Symbol_anchor, new E.main_closure1(), C.Symbol_assertsEnabled, new E.main_closure2(), C.Symbol_bpt, new E.main_closure3(), C.Symbol_busy, new E.main_closure4(), C.Symbol_buttonClick, new E.main_closure5(), C.Symbol_bytes, new E.main_closure6(), C.Symbol_callback, new E.main_closure7(), C.Symbol_capacity, new E.main_closure8(), C.Symbol_change, new E.main_closure9(), C.Symbol_changeSort, new E.main_closure10(), C.Symbol_checked, new E.main_closure11(), C.Symbol_checkedText, new E.main_closure12(), C.Symbol_classTable, new E.main_closure13(), C.Symbol_classes, new E.main_closure14(), C.Symbol_closing, new E.main_closure15(), C.Symbol_cls, new E.main_closure16(), C.Symbol_code, new E.main_closure17(), C.Symbol_coloring, new E.main_closure18(), C.Symbol_columns, new E.main_closure19(), C.Symbol_connection, new E.main_closure20(), C.Symbol_counters, new E.main_closure21(), C.Symbol_countersChanged, new E.main_closure22(), C.Symbol_current, new E.main_closure23(), C.Symbol_descriptor, new E.main_closure24(), C.Symbol_descriptors, new E.main_closure25(), C.Symbol_devtools, new E.main_closure26(), C.Symbol_displayCutoff, new E.main_closure27(), C.Symbol_doAction, new E.main_closure28(), C.Symbol_element, new E.main_closure29(), C.Symbol_endLine, new E.main_closure30(), C.Symbol_endPos, new E.main_closure31(), C.Symbol_endPosChanged, new E.main_closure32(), C.Symbol_entry, new E.main_closure33(), C.Symbol_error, new E.main_closure34(), C.Symbol_eval, new E.main_closure35(), C.Symbol_evalNow, new E.main_closure36(), C.Symbol_exception, new E.main_closure37(), C.Symbol_expand, new E.main_closure38(), C.Symbol_expandChanged, new E.main_closure39(), C.Symbol_expanded, new E.main_closure40(), C.Symbol_expander, new E.main_closure41(), C.Symbol_expanderStyle, new E.main_closure42(), C.Symbol_expr, new E.main_closure43(), C.Symbol_external, new E.main_closure44(), C.Symbol_fd, new E.main_closure45(), C.Symbol_field, new E.main_closure46(), C.Symbol_fields, new E.main_closure47(), C.Symbol_file, new E.main_closure48(), C.Symbol_firstTokenPos, new E.main_closure49(), C.Symbol_flag, new E.main_closure50(), C.Symbol_flagList, new E.main_closure51(), C.Symbol_formatSize, new E.main_closure52(), C.Symbol_formatTime, new E.main_closure53(), C.Symbol_formattedAddress, new E.main_closure54(), C.Symbol_formattedAverage, new E.main_closure55(), C.Symbol_formattedCollections, new E.main_closure56(), C.Symbol_formattedDeoptId, new E.main_closure57(), C.Symbol_formattedExclusive, new E.main_closure58(), C.Symbol_formattedExclusiveTicks, new E.main_closure59(), C.Symbol_formattedInclusive, new E.main_closure60(), C.Symbol_formattedInclusiveTicks, new E.main_closure61(), C.Symbol_formattedLine, new E.main_closure62(), C.Symbol_formattedTotalCollectionTime, new E.main_closure63(), C.Symbol_fragmentation, new E.main_closure64(), C.Symbol_fragmentationChanged, new E.main_closure65(), C.Symbol_frame, new E.main_closure66(), C.Symbol_function, new E.main_closure67(), C.Symbol_functionChanged, new E.main_closure68(), C.Symbol_functions, new E.main_closure69(), C.Symbol_getColumnLabel, new E.main_closure70(), C.Symbol_goto, new E.main_closure71(), C.Symbol_gotoLink, new E.main_closure72(), C.Symbol_hasClass, new E.main_closure73(), C.Symbol_hasDescriptors, new E.main_closure74(), C.Symbol_hasDisassembly, new E.main_closure75(), C.Symbol_hasNoAllocations, new E.main_closure76(), C.Symbol_hasParent, new E.main_closure77(), C.Symbol_hashLinkWorkaround, new E.main_closure78(), C.Symbol_hideTagsChecked, new E.main_closure79(), C.Symbol_hits, new E.main_closure80(), C.Symbol_hoverText, new E.main_closure81(), C.Symbol_httpServer, new E.main_closure82(), C.Symbol_human, new E.main_closure83(), C.Symbol_idle, new E.main_closure84(), C.Symbol_imp, new E.main_closure85(), C.Symbol_imports, new E.main_closure86(), C.Symbol_instance, new E.main_closure87(), C.Symbol_instances, new E.main_closure88(), C.Symbol_instruction, new E.main_closure89(), C.Symbol_instructions, new E.main_closure90(), C.Symbol_interface, new E.main_closure91(), C.Symbol_interfaces, new E.main_closure92(), C.Symbol_internal, new E.main_closure93(), C.Symbol_io, new E.main_closure94(), C.Symbol_isAbstract, new E.main_closure95(), C.Symbol_isBool, new E.main_closure96(), C.Symbol_isComment, new E.main_closure97(), C.Symbol_isDart, new E.main_closure98(), C.Symbol_isDartCode, new E.main_closure99(), C.Symbol_isDouble, new E.main_closure100(), C.Symbol_isEmpty, new E.main_closure101(), C.Symbol_isError, new E.main_closure102(), C.Symbol_isInstance, new E.main_closure103(), C.Symbol_isInt, new E.main_closure104(), C.Symbol_isList, new E.main_closure105(), C.Symbol_isNotEmpty, new E.main_closure106(), C.Symbol_isNull, new E.main_closure107(), C.Symbol_isOptimized, new E.main_closure108(), C.Symbol_isPatch, new E.main_closure109(), C.Symbol_isPipe, new E.main_closure110(), C.Symbol_isString, new E.main_closure111(), C.Symbol_isType, new E.main_closure112(), C.Symbol_isUnexpected, new E.main_closure113(), C.Symbol_isolate, new E.main_closure114(), C.Symbol_isolateChanged, new E.main_closure115(), C.Symbol_isolates, new E.main_closure116(), C.Symbol_jumpTarget, new E.main_closure117(), C.Symbol_kind, new E.main_closure118(), C.Symbol_label, new E.main_closure119(), C.Symbol_last, new E.main_closure120(), C.Symbol_lastAccumulatorReset, new E.main_closure121(), C.Symbol_lastServiceGC, new E.main_closure122(), C.Symbol_lastTokenPos, new E.main_closure123(), C.Symbol_lastUpdate, new E.main_closure124(), C.Symbol_length, new E.main_closure125(), C.Symbol_lib, new E.main_closure126(), C.Symbol_libraries, new E.main_closure127(), C.Symbol_library, new E.main_closure128(), C.Symbol_line, new E.main_closure129(), C.Symbol_lineMode, new E.main_closure130(), C.Symbol_lineNumber, new E.main_closure131(), C.Symbol_lineNumbers, new E.main_closure132(), C.Symbol_lines, new E.main_closure133(), C.Symbol_link, new E.main_closure134(), C.Symbol_list, new E.main_closure135(), C.Symbol_listening, new E.main_closure136(), C.Symbol_loading, new E.main_closure137(), C.Symbol_localAddress, new E.main_closure138(), C.Symbol_localPort, new E.main_closure139(), C.Symbol_mainPort, new E.main_closure140(), C.Symbol_map, new E.main_closure141(), C.Symbol_mapAsString, new E.main_closure142(), C.Symbol_mapChanged, new E.main_closure143(), C.Symbol_message, new E.main_closure144(), C.Symbol_mouseOut, new E.main_closure145(), C.Symbol_mouseOver, new E.main_closure146(), C.Symbol_msg, new E.main_closure147(), C.Symbol_name, new E.main_closure148(), C.Symbol_nameIsEmpty, new E.main_closure149(), C.Symbol_newSpace, new E.main_closure150(), C.Symbol_object, new E.main_closure151(), C.Symbol_objectChanged, new E.main_closure152(), C.Symbol_objectPool, new E.main_closure153(), C.Symbol_oldSpace, new E.main_closure154(), C.Symbol_pad, new E.main_closure155(), C.Symbol_padding, new E.main_closure156(), C.Symbol_path, new E.main_closure157(), C.Symbol_pause, new E.main_closure158(), C.Symbol_pauseEvent, new E.main_closure159(), C.Symbol_pid, new E.main_closure160(), C.Symbol_pos, new E.main_closure161(), C.Symbol_posChanged, new E.main_closure162(), C.Symbol_process, new E.main_closure163(), C.Symbol_profile, new E.main_closure164(), C.Symbol_profileChanged, new E.main_closure165(), C.Symbol_protocol, new E.main_closure166(), C.Symbol_qualified, new E.main_closure167(), C.Symbol_qualifiedName, new E.main_closure168(), C.Symbol_reachable, new E.main_closure169(), C.Symbol_readClosed, new E.main_closure170(), C.Symbol_ref, new E.main_closure171(), C.Symbol_refChanged, new E.main_closure172(), C.Symbol_refresh, new E.main_closure173(), C.Symbol_refreshCoverage, new E.main_closure174(), C.Symbol_refreshGC, new E.main_closure175(), C.Symbol_refreshTime, new E.main_closure176(), C.Symbol_relativeLink, new E.main_closure177(), C.Symbol_remoteAddress, new E.main_closure178(), C.Symbol_remotePort, new E.main_closure179(), C.Symbol_resetAccumulator, new E.main_closure180(), C.Symbol_response, new E.main_closure181(), C.Symbol_result, new E.main_closure182(), C.Symbol_results, new E.main_closure183(), C.Symbol_resume, new E.main_closure184(), C.Symbol_retainedBytes, new E.main_closure185(), C.Symbol_retainedSize, new E.main_closure186(), C.Symbol_retainingPath, new E.main_closure187(), C.Symbol_rootLib, new E.main_closure188(), C.Symbol_row, new E.main_closure189(), C.Symbol_rows, new E.main_closure190(), C.Symbol_running, new E.main_closure191(), C.Symbol_sampleCount, new E.main_closure192(), C.Symbol_sampleDepth, new E.main_closure193(), C.Symbol_sampleRate, new E.main_closure194(), C.Symbol_script, new E.main_closure195(), C.Symbol_scriptChanged, new E.main_closure196(), C.Symbol_scripts, new E.main_closure197(), C.Symbol_selectExpr, new E.main_closure198(), C.Symbol_serviceType, new E.main_closure199(), C.Symbol_small, new E.main_closure200(), C.Symbol_socket, new E.main_closure201(), C.Symbol_socketOwner, new E.main_closure202(), C.Symbol_startLine, new E.main_closure203(), C.Symbol_status, new E.main_closure204(), C.Symbol_styleForHits, new E.main_closure205(), C.Symbol_subClasses, new E.main_closure206(), C.Symbol_subclass, new E.main_closure207(), C.Symbol_superClass, new E.main_closure208(), C.Symbol_tagSelector, new E.main_closure209(), C.Symbol_tagSelectorChanged, new E.main_closure210(), C.Symbol_text, new E.main_closure211(), C.Symbol_timeSpan, new E.main_closure212(), C.Symbol_tipExclusive, new E.main_closure213(), C.Symbol_tipKind, new E.main_closure214(), C.Symbol_tipParent, new E.main_closure215(), C.Symbol_tipTicks, new E.main_closure216(), C.Symbol_tipTime, new E.main_closure217(), C.Symbol_toggleExpand, new E.main_closure218(), C.Symbol_toggleExpanded, new E.main_closure219(), C.Symbol_tokenPos, new E.main_closure220(), C.Symbol_topFrame, new E.main_closure221(), C.Symbol_trace, new E.main_closure222(), C.Symbol_tree, new E.main_closure223(), C.Symbol_typeChecksEnabled, new E.main_closure224(), C.Symbol_uncheckedText, new E.main_closure225(), C.Symbol_updateLineMode, new E.main_closure226(), C.Symbol_uptime, new E.main_closure227(), C.Symbol_url, new E.main_closure228(), C.Symbol_used, new E.main_closure229(), C.Symbol_v, new E.main_closure230(), C.Symbol_variable, new E.main_closure231(), C.Symbol_variables, new E.main_closure232(), C.Symbol_version, new E.main_closure233(), C.Symbol_vm, new E.main_closure234(), C.Symbol_vmName, new E.main_closure235(), C.Symbol_webSocket, new E.main_closure236(), C.Symbol_writeClosed, new E.main_closure237()], null, null);
+    t2 = P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, new E.main_closure238(), C.Symbol_anchor, new E.main_closure239(), C.Symbol_busy, new E.main_closure240(), C.Symbol_callback, new E.main_closure241(), C.Symbol_checked, new E.main_closure242(), C.Symbol_checkedText, new E.main_closure243(), C.Symbol_classTable, new E.main_closure244(), C.Symbol_cls, new E.main_closure245(), C.Symbol_code, new E.main_closure246(), C.Symbol_connection, new E.main_closure247(), C.Symbol_counters, new E.main_closure248(), C.Symbol_devtools, new E.main_closure249(), C.Symbol_displayCutoff, new E.main_closure250(), C.Symbol_endLine, new E.main_closure251(), C.Symbol_endPos, new E.main_closure252(), C.Symbol_entry, new E.main_closure253(), C.Symbol_error, new E.main_closure254(), C.Symbol_eval, new E.main_closure255(), C.Symbol_exception, new E.main_closure256(), C.Symbol_expand, new E.main_closure257(), C.Symbol_expanded, new E.main_closure258(), C.Symbol_expr, new E.main_closure259(), C.Symbol_field, new E.main_closure260(), C.Symbol_file, new E.main_closure261(), C.Symbol_firstTokenPos, new E.main_closure262(), C.Symbol_flag, new E.main_closure263(), C.Symbol_flagList, new E.main_closure264(), C.Symbol_fragmentation, new E.main_closure265(), C.Symbol_frame, new E.main_closure266(), C.Symbol_function, new E.main_closure267(), C.Symbol_hasClass, new E.main_closure268(), C.Symbol_hasParent, new E.main_closure269(), C.Symbol_hashLinkWorkaround, new E.main_closure270(), C.Symbol_hideTagsChecked, new E.main_closure271(), C.Symbol_httpServer, new E.main_closure272(), C.Symbol_imp, new E.main_closure273(), C.Symbol_instance, new E.main_closure274(), C.Symbol_instances, new E.main_closure275(), C.Symbol_interface, new E.main_closure276(), C.Symbol_internal, new E.main_closure277(), C.Symbol_io, new E.main_closure278(), C.Symbol_isDart, new E.main_closure279(), C.Symbol_isolate, new E.main_closure280(), C.Symbol_kind, new E.main_closure281(), C.Symbol_label, new E.main_closure282(), C.Symbol_last, new E.main_closure283(), C.Symbol_lastAccumulatorReset, new E.main_closure284(), C.Symbol_lastServiceGC, new E.main_closure285(), C.Symbol_lastTokenPos, new E.main_closure286(), C.Symbol_lib, new E.main_closure287(), C.Symbol_library, new E.main_closure288(), C.Symbol_lineMode, new E.main_closure289(), C.Symbol_lines, new E.main_closure290(), C.Symbol_link, new E.main_closure291(), C.Symbol_list, new E.main_closure292(), C.Symbol_map, new E.main_closure293(), C.Symbol_mapAsString, new E.main_closure294(), C.Symbol_msg, new E.main_closure295(), C.Symbol_name, new E.main_closure296(), C.Symbol_object, new E.main_closure297(), C.Symbol_objectPool, new E.main_closure298(), C.Symbol_pad, new E.main_closure299(), C.Symbol_path, new E.main_closure300(), C.Symbol_pause, new E.main_closure301(), C.Symbol_pos, new E.main_closure302(), C.Symbol_process, new E.main_closure303(), C.Symbol_profile, new E.main_closure304(), C.Symbol_qualified, new E.main_closure305(), C.Symbol_qualifiedName, new E.main_closure306(), C.Symbol_reachable, new E.main_closure307(), C.Symbol_ref, new E.main_closure308(), C.Symbol_refresh, new E.main_closure309(), C.Symbol_refreshCoverage, new E.main_closure310(), C.Symbol_refreshGC, new E.main_closure311(), C.Symbol_refreshTime, new E.main_closure312(), C.Symbol_resetAccumulator, new E.main_closure313(), C.Symbol_result, new E.main_closure314(), C.Symbol_results, new E.main_closure315(), C.Symbol_resume, new E.main_closure316(), C.Symbol_retainedBytes, new E.main_closure317(), C.Symbol_retainedSize, new E.main_closure318(), C.Symbol_retainingPath, new E.main_closure319(), C.Symbol_rootLib, new E.main_closure320(), C.Symbol_sampleCount, new E.main_closure321(), C.Symbol_sampleDepth, new E.main_closure322(), C.Symbol_sampleRate, new E.main_closure323(), C.Symbol_script, new E.main_closure324(), C.Symbol_small, new E.main_closure325(), C.Symbol_socket, new E.main_closure326(), C.Symbol_socketOwner, new E.main_closure327(), C.Symbol_startLine, new E.main_closure328(), C.Symbol_status, new E.main_closure329(), C.Symbol_subclass, new E.main_closure330(), C.Symbol_superClass, new E.main_closure331(), C.Symbol_tagSelector, new E.main_closure332(), C.Symbol_text, new E.main_closure333(), C.Symbol_timeSpan, new E.main_closure334(), C.Symbol_tokenPos, new E.main_closure335(), C.Symbol_trace, new E.main_closure336(), C.Symbol_uncheckedText, new E.main_closure337(), C.Symbol_vm, new E.main_closure338(), C.Symbol_webSocket, new E.main_closure339()], null, null);
+    t3 = P.LinkedHashMap_LinkedHashMap$_literal([C.Type_kA7, C.Type_GNh, C.Type_ON8, C.Type_EOZ, C.Type_ql8, C.Type_UJT, C.Type_dRp, C.Type_EOZ, C.Type_O5a, C.Type_EOZ, C.Type_2jN, C.Type_UJT, C.Type_Aym, C.Type_EOZ, C.Type_cop, C.Type_GNh, C.Type_Npb, C.Type_EOZ, C.Type_8eb, C.Type_EOZ, C.Type_p2P, C.Type_GNh, C.Type_ohY, C.Type_UJT, C.Type_4IJ, C.Type_EOZ, C.Type_7g3, C.Type_EOZ, C.Type_f1j, C.Type_EOZ, C.Type_wgH, C.Type_oyU, C.Type_bDN, C.Type_EOZ, C.Type_SoB, C.Type_EOZ, C.Type_LV6, C.Type_EOZ, C.Type_EVD, C.Type_UJT, C.Type_gqS, C.Type_EOZ, C.Type_uIL, C.Type_UJT, C.Type_L9j, C.Type_EOZ, C.Type_yvP, C.Type_EOZ, C.Type_i7j, C.Type_UJT, C.Type_M6L, C.Type_EOZ, C.Type_8KD, C.Type_EOZ, C.Type_qMZ, C.Type_oyU, C.Type_AHF, C.Type_EOZ, C.Type_IuH, C.Type_EOZ, C.Type_mWg, C.Type_UJT, C.Type_8cK, C.Type_EOZ, C.Type_JmU, C.Type_UJT, C.Type_4m4, C.Type_EOZ, C.Type_B8J, C.Type_UJT, C.Type_61d, C.Type_EOZ, C.Type_TEn, C.Type_EOZ, C.Type_gg4, C.Type_EOZ, C.Type_MUU, C.Type_UJT, C.Type_AyI, C.Type_EOZ, C.Type_cOY, C.Type_EOZ, C.Type_ES1, C.Type_UJT, C.Type_wT1, C.Type_EOZ, C.Type_ECh, C.Type_EOZ, C.Type_aAD, C.Type_EOZ, C.Type_8Gl, C.Type_EOZ, C.Type_iL9, C.Type_EOZ, C.Type_ZKG, C.Type_EOZ, C.Type_Kyy, C.Type_EOZ, C.Type_mpV, C.Type_UJT, C.Type_qph, C.Type_EOZ, C.Type_JFX, C.Type_EOZ, C.Type_wsa, C.Type_EOZ, C.Type_s2l, C.Type_EOZ, C.Type_nV5, C.Type_EOZ, C.Type_9ur, C.Type_sRP, C.Type_KMd, C.Type_EOZ, C.Type_AD4, C.Type_EOZ, C.Type_Sxn, C.Type_EOZ, C.Type_C7R, C.Type_EOZ, C.Type_YgH, C.Type_EOZ, C.Type_sRP, C.Type_I2I, C.Type_a1Y, C.Type_EOZ, C.Type_wBh, C.Type_oyU, C.Type_0e9, C.Type_EOZ, C.Type_FKd, C.Type_EOZ, C.Type_y1j, C.Type_EOZ, C.Type_UJT, C.Type_EOZ, C.Type_Mu6, C.Type_EOZ, C.Type_kuc, C.Type_GNh, C.Type_Jcu, C.Type_EOZ, C.Type_nVV, C.Type_EOZ, C.Type_Eue, C.Type_UJT, C.Type_E0k, C.Type_EOZ, C.Type_GNh, C.Type_I2I, C.Type_EOZ, C.Type_sRP, C.Type_oyU, C.Type_UJT], null, null);
+    t4 = P.LinkedHashMap_LinkedHashMap$_literal([C.Type_kA7, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_busy, C.Declaration_izV, C.Symbol_callback, C.Declaration_yXb, C.Symbol_label, C.Declaration_0g2], null, null), C.Type_ON8, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_msg, C.Declaration_gc6], null, null), C.Type_ql8, C.Map_empty, C.Type_dRp, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_agR, C.Symbol_isolateChanged, C.Declaration_e3c], null, null), C.Type_O5a, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_cls, C.Declaration_okX, C.Symbol_instances, C.Declaration_qr9, C.Symbol_retainedBytes, C.Declaration_CIB], null, null), C.Type_2jN, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_code, C.Declaration_AgZ, C.Symbol_refChanged, C.Declaration_MJ5], null, null), C.Type_Aym, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_code, C.Declaration_woc], null, null), C.Type_cop, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_busy, C.Declaration_izV, C.Symbol_callback, C.Declaration_yXb, C.Symbol_expand, C.Declaration_yXb0, C.Symbol_expandChanged, C.Declaration_Dbk, C.Symbol_expanded, C.Declaration_RQo], null, null), C.Type_Npb, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_error, C.Declaration_eea], null, null), C.Type_8eb, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_callback, C.Declaration_IF7, C.Symbol_lineMode, C.Declaration_ww8, C.Symbol_results, C.Declaration_ggw, C.Symbol_text, C.Declaration_ZfX], null, null), C.Type_p2P, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_busy, C.Declaration_izV, C.Symbol_callback, C.Declaration_yXb, C.Symbol_expr, C.Declaration_gLQ, C.Symbol_label, C.Declaration_0g2, C.Symbol_result, C.Declaration_2No], null, null), C.Type_ohY, C.Map_empty, C.Type_4IJ, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_field, C.Declaration_iyl], null, null), C.Type_7g3, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_flag, C.Declaration_6YB], null, null), C.Type_f1j, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_flagList, C.Declaration_wE9], null, null), C.Type_wgH, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_hasClass, C.Declaration_X8B, C.Symbol_hasParent, C.Declaration_0qV, C.Symbol_isDart, C.Declaration_o7e, C.Symbol_qualified, C.Declaration_e24, C.Symbol_refChanged, C.Declaration_MJ5], null, null), C.Type_bDN, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_function, C.Declaration_y9n, C.Symbol_functionChanged, C.Declaration_Chj, C.Symbol_kind, C.Declaration_Xdi, C.Symbol_qualifiedName, C.Declaration_i3y], null, null), C.Type_SoB, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_fragmentation, C.Declaration_0Y4, C.Symbol_fragmentationChanged, C.Declaration_ivD, C.Symbol_status, C.Declaration_8sn], null, null), C.Type_LV6, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_classTable, C.Declaration_gsm, C.Symbol_isolate, C.Declaration_agR, C.Symbol_lastAccumulatorReset, C.Declaration_vA1, C.Symbol_lastServiceGC, C.Declaration_mPk, C.Symbol_profile, C.Declaration_EkK, C.Symbol_profileChanged, C.Declaration_j3g], null, null), C.Type_EVD, C.Map_empty, C.Type_gqS, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_instance, C.Declaration_o7L, C.Symbol_path, C.Declaration_cMb, C.Symbol_retainedBytes, C.Declaration_CIB], null, null), C.Type_uIL, C.Map_empty, C.Type_L9j, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_connection, C.Declaration_yDj], null, null), C.Type_yvP, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_i7j, C.Map_empty, C.Type_M6L, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_httpServer, C.Declaration_BSX], null, null), C.Type_8KD, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_qMZ, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_small, C.Declaration_pPA], null, null), C.Type_AHF, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_process, C.Declaration_a13], null, null), C.Type_IuH, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_mWg, C.Map_empty, C.Type_8cK, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_file, C.Declaration_Ix1], null, null), C.Type_JmU, C.Map_empty, C.Type_4m4, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_B8J, C.Map_empty, C.Type_61d, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_socket, C.Declaration_Iiu], null, null), C.Type_TEn, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_io, C.Declaration_bh9], null, null), C.Type_gg4, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_MUU, C.Map_empty, C.Type_AyI, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_webSocket, C.Declaration_mT8], null, null), C.Type_cOY, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_displayCutoff, C.Declaration_CR6, C.Symbol_hideTagsChecked, C.Declaration_a1A, C.Symbol_profile, C.Declaration_EkK, C.Symbol_profileChanged, C.Declaration_j3g, C.Symbol_refreshTime, C.Declaration_ijl, C.Symbol_sampleCount, C.Declaration_ac8, C.Symbol_sampleDepth, C.Declaration_2AE, C.Symbol_sampleRate, C.Declaration_3VL, C.Symbol_tagSelector, C.Declaration_Q0F, C.Symbol_tagSelectorChanged, C.Declaration_ECn, C.Symbol_timeSpan, C.Declaration_dIf], null, null), C.Type_ES1, C.Map_empty, C.Type_wT1, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_counters, C.Declaration_2Qn, C.Symbol_countersChanged, C.Declaration_cJC], null, null), C.Type_ECh, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_aAD, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_8Gl, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_iL9, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_ZKG, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_Kyy, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_map, C.Declaration_wzu, C.Symbol_mapAsString, C.Declaration_Qx4, C.Symbol_mapChanged, C.Declaration_iLh], null, null), C.Type_mpV, C.Map_empty, C.Type_qph, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_library, C.Declaration_6ts], null, null), C.Type_JFX, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_cls, C.Declaration_qrv, C.Symbol_last, C.Declaration_06U], null, null), C.Type_wsa, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj, C.Symbol_isolateChanged, C.Declaration_e3c, C.Symbol_last, C.Declaration_06U], null, null), C.Type_s2l, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_last, C.Declaration_06U, C.Symbol_library, C.Declaration_6ts], null, null), C.Type_nV5, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_pad, C.Declaration_EsU], null, null), C.Type_9ur, C.Map_empty, C.Type_KMd, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_anchor, C.Declaration_suy, C.Symbol_last, C.Declaration_06U, C.Symbol_link, C.Declaration_ibz], null, null), C.Type_AD4, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_anchor, C.Declaration_suy, C.Symbol_link, C.Declaration_ibz], null, null), C.Type_Sxn, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, C.Declaration_dw1, C.Symbol_callback, C.Declaration_yXb, C.Symbol_label, C.Declaration_0g2], null, null), C.Type_C7R, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_last, C.Declaration_06U], null, null), C.Type_YgH, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_devtools, C.Declaration_c4R], null, null), C.Type_sRP, C.Map_empty, C.Type_a1Y, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_endLine, C.Declaration_ZcJ, C.Symbol_endPos, C.Declaration_ACG, C.Symbol_endPosChanged, C.Declaration_QAa, C.Symbol_lines, C.Declaration_WfA, C.Symbol_pos, C.Declaration_i3t, C.Symbol_posChanged, C.Declaration_owq, C.Symbol_script, C.Declaration_yx3, C.Symbol_scriptChanged, C.Declaration_ixB, C.Symbol_startLine, C.Declaration_k6K], null, null), C.Type_wBh, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_pos, C.Declaration_i3t, C.Symbol_posChanged, C.Declaration_owq], null, null), C.Type_0e9, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_script, C.Declaration_yx3], null, null), C.Type_FKd, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_error, C.Declaration_4eA], null, null), C.Type_y1j, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_exception, C.Declaration_v0l], null, null), C.Type_UJT, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_internal, C.Declaration_XBb, C.Symbol_ref, C.Declaration_e3c0, C.Symbol_refChanged, C.Declaration_MJ5], null, null), C.Type_Mu6, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_object, C.Declaration_HtW, C.Symbol_objectChanged, C.Declaration_4up], null, null), C.Type_kuc, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_checked, C.Declaration_siO, C.Symbol_checkedText, C.Declaration_cdS, C.Symbol_uncheckedText, C.Declaration_IRg], null, null), C.Type_Jcu, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_frame, C.Declaration_65l], null, null), C.Type_nVV, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_trace, C.Declaration_ssf], null, null), C.Type_Eue, C.Map_empty, C.Type_E0k, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_error, C.Declaration_0, C.Symbol_vm, C.Declaration_Qi2], null, null)], null, null);
+    t5 = O.GeneratedSymbolConverterService$(new O.StaticConfiguration(t1, t2, t3, t4, C.Map_empty, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, "active", C.Symbol_address, "address", C.Symbol_anchor, "anchor", C.Symbol_assertsEnabled, "assertsEnabled", C.Symbol_bpt, "bpt", C.Symbol_busy, "busy", C.Symbol_buttonClick, "buttonClick", C.Symbol_bytes, "bytes", C.Symbol_callback, "callback", C.Symbol_capacity, "capacity", C.Symbol_change, "change", C.Symbol_changeSort, "changeSort", C.Symbol_checked, "checked", C.Symbol_checkedText, "checkedText", C.Symbol_classTable, "classTable", C.Symbol_classes, "classes", C.Symbol_closing, "closing", C.Symbol_cls, "cls", C.Symbol_code, "code", C.Symbol_coloring, "coloring", C.Symbol_columns, "columns", C.Symbol_connection, "connection", C.Symbol_counters, "counters", C.Symbol_countersChanged, "countersChanged", C.Symbol_current, "current", C.Symbol_descriptor, "descriptor", C.Symbol_descriptors, "descriptors", C.Symbol_devtools, "devtools", C.Symbol_displayCutoff, "displayCutoff", C.Symbol_doAction, "doAction", C.Symbol_element, "element", C.Symbol_endLine, "endLine", C.Symbol_endPos, "endPos", C.Symbol_endPosChanged, "endPosChanged", C.Symbol_entry, "entry", C.Symbol_error, "error", C.Symbol_eval, "eval", C.Symbol_evalNow, "evalNow", C.Symbol_exception, "exception", C.Symbol_expand, "expand", C.Symbol_expandChanged, "expandChanged", C.Symbol_expanded, "expanded", C.Symbol_expander, "expander", C.Symbol_expanderStyle, "expanderStyle", C.Symbol_expr, "expr", C.Symbol_external, "external", C.Symbol_fd, "fd", C.Symbol_field, "field", C.Symbol_fields, "fields", C.Symbol_file, "file", C.Symbol_firstTokenPos, "firstTokenPos", C.Symbol_flag, "flag", C.Symbol_flagList, "flagList", C.Symbol_formatSize, "formatSize", C.Symbol_formatTime, "formatTime", C.Symbol_formattedAddress, "formattedAddress", C.Symbol_formattedAverage, "formattedAverage", C.Symbol_formattedCollections, "formattedCollections", C.Symbol_formattedDeoptId, "formattedDeoptId", C.Symbol_formattedExclusive, "formattedExclusive", C.Symbol_formattedExclusiveTicks, "formattedExclusiveTicks", C.Symbol_formattedInclusive, "formattedInclusive", C.Symbol_formattedInclusiveTicks, "formattedInclusiveTicks", C.Symbol_formattedLine, "formattedLine", C.Symbol_formattedTotalCollectionTime, "formattedTotalCollectionTime", C.Symbol_fragmentation, "fragmentation", C.Symbol_fragmentationChanged, "fragmentationChanged", C.Symbol_frame, "frame", C.Symbol_function, "function", C.Symbol_functionChanged, "functionChanged", C.Symbol_functions, "functions", C.Symbol_getColumnLabel, "getColumnLabel", C.Symbol_goto, "goto", C.Symbol_gotoLink, "gotoLink", C.Symbol_hasClass, "hasClass", C.Symbol_hasDescriptors, "hasDescriptors", C.Symbol_hasDisassembly, "hasDisassembly", C.Symbol_hasNoAllocations, "hasNoAllocations", C.Symbol_hasParent, "hasParent", C.Symbol_hashLinkWorkaround, "hashLinkWorkaround", C.Symbol_hideTagsChecked, "hideTagsChecked", C.Symbol_hits, "hits", C.Symbol_hoverText, "hoverText", C.Symbol_httpServer, "httpServer", C.Symbol_human, "human", C.Symbol_idle, "idle", C.Symbol_imp, "imp", C.Symbol_imports, "imports", C.Symbol_instance, "instance", C.Symbol_instances, "instances", C.Symbol_instruction, "instruction", C.Symbol_instructions, "instructions", C.Symbol_interface, "interface", C.Symbol_interfaces, "interfaces", C.Symbol_internal, "internal", C.Symbol_io, "io", C.Symbol_isAbstract, "isAbstract", C.Symbol_isBool, "isBool", C.Symbol_isComment, "isComment", C.Symbol_isDart, "isDart", C.Symbol_isDartCode, "isDartCode", C.Symbol_isDouble, "isDouble", C.Symbol_isEmpty, "isEmpty", C.Symbol_isError, "isError", C.Symbol_isInstance, "isInstance", C.Symbol_isInt, "isInt", C.Symbol_isList, "isList", C.Symbol_isNotEmpty, "isNotEmpty", C.Symbol_isNull, "isNull", C.Symbol_isOptimized, "isOptimized", C.Symbol_isPatch, "isPatch", C.Symbol_isPipe, "isPipe", C.Symbol_isString, "isString", C.Symbol_isType, "isType", C.Symbol_isUnexpected, "isUnexpected", C.Symbol_isolate, "isolate", C.Symbol_isolateChanged, "isolateChanged", C.Symbol_isolates, "isolates", C.Symbol_jumpTarget, "jumpTarget", C.Symbol_kind, "kind", C.Symbol_label, "label", C.Symbol_last, "last", C.Symbol_lastAccumulatorReset, "lastAccumulatorReset", C.Symbol_lastServiceGC, "lastServiceGC", C.Symbol_lastTokenPos, "lastTokenPos", C.Symbol_lastUpdate, "lastUpdate", C.Symbol_length, "length", C.Symbol_lib, "lib", C.Symbol_libraries, "libraries", C.Symbol_library, "library", C.Symbol_line, "line", C.Symbol_lineMode, "lineMode", C.Symbol_lineNumber, "lineNumber", C.Symbol_lineNumbers, "lineNumbers", C.Symbol_lines, "lines", C.Symbol_link, "link", C.Symbol_list, "list", C.Symbol_listening, "listening", C.Symbol_loading, "loading", C.Symbol_localAddress, "localAddress", C.Symbol_localPort, "localPort", C.Symbol_mainPort, "mainPort", C.Symbol_map, "map", C.Symbol_mapAsString, "mapAsString", C.Symbol_mapChanged, "mapChanged", C.Symbol_message, "message", C.Symbol_mouseOut, "mouseOut", C.Symbol_mouseOver, "mouseOver", C.Symbol_msg, "msg", C.Symbol_name, "name", C.Symbol_nameIsEmpty, "nameIsEmpty", C.Symbol_newSpace, "newSpace", C.Symbol_object, "object", C.Symbol_objectChanged, "objectChanged", C.Symbol_objectPool, "objectPool", C.Symbol_oldSpace, "oldSpace", C.Symbol_pad, "pad", C.Symbol_padding, "padding", C.Symbol_path, "path", C.Symbol_pause, "pause", C.Symbol_pauseEvent, "pauseEvent", C.Symbol_pid, "pid", C.Symbol_pos, "pos", C.Symbol_posChanged, "posChanged", C.Symbol_process, "process", C.Symbol_profile, "profile", C.Symbol_profileChanged, "profileChanged", C.Symbol_protocol, "protocol", C.Symbol_qualified, "qualified", C.Symbol_qualifiedName, "qualifiedName", C.Symbol_reachable, "reachable", C.Symbol_readClosed, "readClosed", C.Symbol_ref, "ref", C.Symbol_refChanged, "refChanged", C.Symbol_refresh, "refresh", C.Symbol_refreshCoverage, "refreshCoverage", C.Symbol_refreshGC, "refreshGC", C.Symbol_refreshTime, "refreshTime", C.Symbol_relativeLink, "relativeLink", C.Symbol_remoteAddress, "remoteAddress", C.Symbol_remotePort, "remotePort", C.Symbol_resetAccumulator, "resetAccumulator", C.Symbol_response, "response", C.Symbol_result, "result", C.Symbol_results, "results", C.Symbol_resume, "resume", C.Symbol_retainedBytes, "retainedBytes", C.Symbol_retainedSize, "retainedSize", C.Symbol_retainingPath, "retainingPath", C.Symbol_rootLib, "rootLib", C.Symbol_row, "row", C.Symbol_rows, "rows", C.Symbol_running, "running", C.Symbol_sampleCount, "sampleCount", C.Symbol_sampleDepth, "sampleDepth", C.Symbol_sampleRate, "sampleRate", C.Symbol_script, "script", C.Symbol_scriptChanged, "scriptChanged", C.Symbol_scripts, "scripts", C.Symbol_selectExpr, "selectExpr", C.Symbol_serviceType, "serviceType", C.Symbol_small, "small", C.Symbol_socket, "socket", C.Symbol_socketOwner, "socketOwner", C.Symbol_startLine, "startLine", C.Symbol_status, "status", C.Symbol_styleForHits, "styleForHits", C.Symbol_subClasses, "subClasses", C.Symbol_subclass, "subclass", C.Symbol_superClass, "superClass", C.Symbol_tagSelector, "tagSelector", C.Symbol_tagSelectorChanged, "tagSelectorChanged", C.Symbol_text, "text", C.Symbol_timeSpan, "timeSpan", C.Symbol_tipExclusive, "tipExclusive", C.Symbol_tipKind, "tipKind", C.Symbol_tipParent, "tipParent", C.Symbol_tipTicks, "tipTicks", C.Symbol_tipTime, "tipTime", C.Symbol_toggleExpand, "toggleExpand", C.Symbol_toggleExpanded, "toggleExpanded", C.Symbol_tokenPos, "tokenPos", C.Symbol_topFrame, "topFrame", C.Symbol_trace, "trace", C.Symbol_tree, "tree", C.Symbol_typeChecksEnabled, "typeChecksEnabled", C.Symbol_uncheckedText, "uncheckedText", C.Symbol_updateLineMode, "updateLineMode", C.Symbol_uptime, "uptime", C.Symbol_url, "url", C.Symbol_used, "used", C.Symbol_v, "v", C.Symbol_variable, "variable", C.Symbol_variables, "variables", C.Symbol_version, "version", C.Symbol_vm, "vm", C.Symbol_vmName, "vmName", C.Symbol_webSocket, "webSocket", C.Symbol_writeClosed, "writeClosed"], null, null), false));
+    $.objectAccessor = new O.GeneratedObjectAccessorService(t1, t2, C.Map_empty);
+    $.typeInspector = new O.GeneratedTypeInspectorService(t3, t4, false);
+    $.symbolConverter = t5;
+    $.initializers = [new E.main_closure340(), new E.main_closure341(), new E.main_closure342(), new E.main_closure343(), new E.main_closure344(), new E.main_closure345(), new E.main_closure346(), new E.main_closure347(), new E.main_closure348(), new E.main_closure349(), new E.main_closure350(), new E.main_closure351(), new E.main_closure352(), new E.main_closure353(), new E.main_closure354(), new E.main_closure355(), new E.main_closure356(), new E.main_closure357(), new E.main_closure358(), new E.main_closure359(), new E.main_closure360(), new E.main_closure361(), new E.main_closure362(), new E.main_closure363(), new E.main_closure364(), new E.main_closure365(), new E.main_closure366(), new E.main_closure367(), new E.main_closure368(), new E.main_closure369(), new E.main_closure370(), new E.main_closure371(), new E.main_closure372(), new E.main_closure373(), new E.main_closure374(), new E.main_closure375(), new E.main_closure376(), new E.main_closure377(), new E.main_closure378(), new E.main_closure379(), new E.main_closure380(), new E.main_closure381(), new E.main_closure382(), new E.main_closure383(), new E.main_closure384(), new E.main_closure385(), new E.main_closure386(), new E.main_closure387(), new E.main_closure388(), new E.main_closure389(), new E.main_closure390(), new E.main_closure391(), new E.main_closure392(), new E.main_closure393(), new E.main_closure394(), new E.main_closure395(), new E.main_closure396(), new E.main_closure397(), new E.main_closure398(), new E.main_closure399(), new E.main_closure400(), new E.main_closure401(), new E.main_closure402(), new E.main_closure403(), new E.main_closure404(), new E.main_closure405(), new E.main_closure406(), new E.main_closure407(), new E.main_closure408(), new E.main_closure409(), new E.main_closure410(), new E.main_closure411(), new E.main_closure412(), new E.main_closure413()];
+    $.deployMode = true;
+    F.main();
+  }, "call$0", "main0$closure", 0, 0, 18],
+  main_closure: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$active$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure0: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$address();
+    },
+    $isFunction: true
+  },
+  main_closure1: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$anchor$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure2: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$assertsEnabled();
+    },
+    $isFunction: true
+  },
+  main_closure3: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$bpt();
+    },
+    $isFunction: true
+  },
+  main_closure4: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$busy$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure5: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$buttonClick$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure6: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$bytes();
+    },
+    $isFunction: true
+  },
+  main_closure7: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$callback$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure8: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$capacity();
+    },
+    $isFunction: true
+  },
+  main_closure9: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$change$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure10: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$changeSort$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure11: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$checked$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure12: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$checkedText$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure13: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$classTable$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure14: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$classes$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure15: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$closing();
+    },
+    $isFunction: true
+  },
+  main_closure16: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$cls$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure17: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$code$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure18: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$coloring$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure19: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$columns();
+    },
+    $isFunction: true
+  },
+  main_closure20: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$connection$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure21: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$counters$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure22: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$countersChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure23: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$current();
+    },
+    $isFunction: true
+  },
+  main_closure24: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$descriptor();
+    },
+    $isFunction: true
+  },
+  main_closure25: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$descriptors();
+    },
+    $isFunction: true
+  },
+  main_closure26: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$devtools$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure27: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$displayCutoff$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure28: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$doAction$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure29: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$element$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure30: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$endLine$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure31: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$endPos$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure32: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$endPosChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure33: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$entry();
+    },
+    $isFunction: true
+  },
+  main_closure34: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$error$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure35: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$eval$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure36: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$evalNow$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure37: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$exception$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure38: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expand$ax(o);
+    },
+    $isFunction: true
+  },
+  main_closure39: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expandChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure40: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expanded$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure41: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expander$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure42: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$expanderStyle();
+    },
+    $isFunction: true
+  },
+  main_closure43: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expr$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure44: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$external();
+    },
+    $isFunction: true
+  },
+  main_closure45: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$fd();
+    },
+    $isFunction: true
+  },
+  main_closure46: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$field$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure47: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$fields();
+    },
+    $isFunction: true
+  },
+  main_closure48: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$file$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure49: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$firstTokenPos();
+    },
+    $isFunction: true
+  },
+  main_closure50: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$flag$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure51: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$flagList$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure52: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formatSize$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure53: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formatTime$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure54: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedAddress();
+    },
+    $isFunction: true
+  },
+  main_closure55: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formattedAverage$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure56: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formattedCollections$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure57: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedDeoptId();
+    },
+    $isFunction: true
+  },
+  main_closure58: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedExclusive();
+    },
+    $isFunction: true
+  },
+  main_closure59: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedExclusiveTicks();
+    },
+    $isFunction: true
+  },
+  main_closure60: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedInclusive();
+    },
+    $isFunction: true
+  },
+  main_closure61: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedInclusiveTicks();
+    },
+    $isFunction: true
+  },
+  main_closure62: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedLine();
+    },
+    $isFunction: true
+  },
+  main_closure63: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formattedTotalCollectionTime$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure64: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$fragmentation$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure65: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$fragmentationChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure66: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$frame$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure67: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$$function$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure68: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$functionChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure69: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$functions();
+    },
+    $isFunction: true
+  },
+  main_closure70: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$getColumnLabel();
+    },
+    $isFunction: true
+  },
+  main_closure71: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$$goto$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure72: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$gotoLink$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure73: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hasClass$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure74: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hasDescriptors();
+    },
+    $isFunction: true
+  },
+  main_closure75: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hasDisassembly();
+    },
+    $isFunction: true
+  },
+  main_closure76: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hasNoAllocations();
+    },
+    $isFunction: true
+  },
+  main_closure77: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hasParent$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure78: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hashLinkWorkaround$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure79: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hideTagsChecked$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure80: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hits();
+    },
+    $isFunction: true
+  },
+  main_closure81: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hoverText$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure82: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$httpServer$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure83: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$human();
+    },
+    $isFunction: true
+  },
+  main_closure84: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$idle();
+    },
+    $isFunction: true
+  },
+  main_closure85: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$imp();
+    },
+    $isFunction: true
+  },
+  main_closure86: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$imports();
+    },
+    $isFunction: true
+  },
+  main_closure87: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$instance$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure88: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$instances$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure89: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$instruction();
+    },
+    $isFunction: true
+  },
+  main_closure90: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$instructions();
+    },
+    $isFunction: true
+  },
+  main_closure91: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$$interface();
+    },
+    $isFunction: true
+  },
+  main_closure92: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$interfaces();
+    },
+    $isFunction: true
+  },
+  main_closure93: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$internal$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure94: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$io$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure95: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isAbstract();
+    },
+    $isFunction: true
+  },
+  main_closure96: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isBool$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure97: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isComment();
+    },
+    $isFunction: true
+  },
+  main_closure98: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isDart$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure99: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isDartCode();
+    },
+    $isFunction: true
+  },
+  main_closure100: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isDouble$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure101: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isEmpty$asx(o);
+    },
+    $isFunction: true
+  },
+  main_closure102: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isError$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure103: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isInstance$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure104: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isInt$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure105: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isList$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure106: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isNotEmpty$asx(o);
+    },
+    $isFunction: true
+  },
+  main_closure107: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isNull$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure108: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isOptimized();
+    },
+    $isFunction: true
+  },
+  main_closure109: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isPatch();
+    },
+    $isFunction: true
+  },
+  main_closure110: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isPipe();
+    },
+    $isFunction: true
+  },
+  main_closure111: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isString$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure112: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isType$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure113: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isUnexpected$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure114: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isolate$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure115: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isolateChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure116: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isolates();
+    },
+    $isFunction: true
+  },
+  main_closure117: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$jumpTarget();
+    },
+    $isFunction: true
+  },
+  main_closure118: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$kind$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure119: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$label$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure120: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$last$ax(o);
+    },
+    $isFunction: true
+  },
+  main_closure121: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lastAccumulatorReset$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure122: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lastServiceGC$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure123: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$lastTokenPos();
+    },
+    $isFunction: true
+  },
+  main_closure124: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$lastUpdate();
+    },
+    $isFunction: true
+  },
+  main_closure125: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$length$asx(o);
+    },
+    $isFunction: true
+  },
+  main_closure126: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$lib();
+    },
+    $isFunction: true
+  },
+  main_closure127: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$libraries();
+    },
+    $isFunction: true
+  },
+  main_closure128: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$library$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure129: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$line();
+    },
+    $isFunction: true
+  },
+  main_closure130: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lineMode$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure131: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lineNumber$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure132: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lineNumbers$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure133: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lines$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure134: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$link$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure135: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$list$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure136: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$listening();
+    },
+    $isFunction: true
+  },
+  main_closure137: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$loading();
+    },
+    $isFunction: true
+  },
+  main_closure138: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$localAddress();
+    },
+    $isFunction: true
+  },
+  main_closure139: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$localPort();
+    },
+    $isFunction: true
+  },
+  main_closure140: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$mainPort();
+    },
+    $isFunction: true
+  },
+  main_closure141: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$map$ax(o);
+    },
+    $isFunction: true
+  },
+  main_closure142: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mapAsString$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure143: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mapChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure144: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$message$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure145: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mouseOut$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure146: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mouseOver$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure147: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$msg$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure148: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$name$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure149: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$nameIsEmpty$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure150: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$newSpace();
+    },
+    $isFunction: true
+  },
+  main_closure151: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$object$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure152: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$objectChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure153: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$objectPool();
+    },
+    $isFunction: true
+  },
+  main_closure154: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$oldSpace();
+    },
+    $isFunction: true
+  },
+  main_closure155: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pad$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure156: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$padding$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure157: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$path$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure158: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pause$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure159: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pauseEvent$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure160: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$pid();
+    },
+    $isFunction: true
+  },
+  main_closure161: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pos$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure162: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$posChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure163: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$process$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure164: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$profile$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure165: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$profileChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure166: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$protocol$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure167: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$qualified$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure168: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$qualifiedName$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure169: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$reachable$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure170: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$readClosed();
+    },
+    $isFunction: true
+  },
+  main_closure171: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$ref$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure172: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure173: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refresh$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure174: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refreshCoverage$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure175: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refreshGC$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure176: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refreshTime$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure177: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$relativeLink();
+    },
+    $isFunction: true
+  },
+  main_closure178: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$remoteAddress();
+    },
+    $isFunction: true
+  },
+  main_closure179: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$remotePort();
+    },
+    $isFunction: true
+  },
+  main_closure180: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$resetAccumulator$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure181: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$response$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure182: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$result$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure183: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$results$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure184: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$resume$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure185: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$retainedBytes$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure186: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$retainedSize$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure187: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$retainingPath$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure188: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$rootLib();
+    },
+    $isFunction: true
+  },
+  main_closure189: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$row();
+    },
+    $isFunction: true
+  },
+  main_closure190: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$rows$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure191: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$running();
+    },
+    $isFunction: true
+  },
+  main_closure192: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$sampleCount$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure193: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$sampleDepth$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure194: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$sampleRate$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure195: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$script$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure196: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$scriptChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure197: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$scripts();
+    },
+    $isFunction: true
+  },
+  main_closure198: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$selectExpr$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure199: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$serviceType();
+    },
+    $isFunction: true
+  },
+  main_closure200: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$small$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure201: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$socket$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure202: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$socketOwner();
+    },
+    $isFunction: true
+  },
+  main_closure203: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$startLine$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure204: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$status$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure205: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$styleForHits$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure206: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$subClasses();
+    },
+    $isFunction: true
+  },
+  main_closure207: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$subclass();
+    },
+    $isFunction: true
+  },
+  main_closure208: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$superClass();
+    },
+    $isFunction: true
+  },
+  main_closure209: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$tagSelector$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure210: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$tagSelectorChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure211: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$text$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure212: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$timeSpan$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure213: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipExclusive();
+    },
+    $isFunction: true
+  },
+  main_closure214: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipKind();
+    },
+    $isFunction: true
+  },
+  main_closure215: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipParent();
+    },
+    $isFunction: true
+  },
+  main_closure216: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipTicks();
+    },
+    $isFunction: true
+  },
+  main_closure217: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipTime();
+    },
+    $isFunction: true
+  },
+  main_closure218: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$toggleExpand$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure219: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$toggleExpanded$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure220: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tokenPos();
+    },
+    $isFunction: true
+  },
+  main_closure221: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$topFrame();
+    },
+    $isFunction: true
+  },
+  main_closure222: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$trace$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure223: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$tree$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure224: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$typeChecksEnabled();
+    },
+    $isFunction: true
+  },
+  main_closure225: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$uncheckedText$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure226: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$updateLineMode$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure227: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$uptime();
+    },
+    $isFunction: true
+  },
+  main_closure228: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$url$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure229: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$used();
+    },
+    $isFunction: true
+  },
+  main_closure230: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$v();
+    },
+    $isFunction: true
+  },
+  main_closure231: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$variable();
+    },
+    $isFunction: true
+  },
+  main_closure232: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$variables();
+    },
+    $isFunction: true
+  },
+  main_closure233: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$version$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure234: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$vm$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure235: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$vmName();
+    },
+    $isFunction: true
+  },
+  main_closure236: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$webSocket$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure237: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$writeClosed();
+    },
+    $isFunction: true
+  },
+  main_closure238: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$active$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure239: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$anchor$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure240: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$busy$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure241: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$callback$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure242: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$checked$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure243: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$checkedText$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure244: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$classTable$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure245: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$cls$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure246: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$code$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure247: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$connection$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure248: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$counters$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure249: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$devtools$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure250: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$displayCutoff$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure251: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$endLine$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure252: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$endPos$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure253: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$entry(v);
+    },
+    $isFunction: true
+  },
+  main_closure254: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$error$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure255: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$eval$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure256: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$exception$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure257: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$expand$ax(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure258: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$expanded$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure259: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$expr$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure260: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$field$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure261: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$file$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure262: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$firstTokenPos(v);
+    },
+    $isFunction: true
+  },
+  main_closure263: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$flag$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure264: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$flagList$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure265: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$fragmentation$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure266: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$frame$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure267: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$$function$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure268: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hasClass$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure269: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hasParent$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure270: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hashLinkWorkaround$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure271: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hideTagsChecked$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure272: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$httpServer$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure273: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$imp(v);
+    },
+    $isFunction: true
+  },
+  main_closure274: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$instance$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure275: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$instances$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure276: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$$interface(v);
+    },
+    $isFunction: true
+  },
+  main_closure277: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$internal$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure278: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$io$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure279: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$isDart$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure280: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$isolate$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure281: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$kind$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure282: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$label$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure283: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$last$ax(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure284: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lastAccumulatorReset$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure285: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lastServiceGC$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure286: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$lastTokenPos(v);
+    },
+    $isFunction: true
+  },
+  main_closure287: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$lib(v);
+    },
+    $isFunction: true
+  },
+  main_closure288: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$library$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure289: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lineMode$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure290: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lines$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure291: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$link$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure292: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$list$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure293: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$map$ax(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure294: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$mapAsString$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure295: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$msg$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure296: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$name$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure297: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$object$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure298: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$objectPool(v);
+    },
+    $isFunction: true
+  },
+  main_closure299: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$pad$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure300: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$path$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure301: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$pause$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure302: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$pos$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure303: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$process$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure304: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$profile$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure305: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$qualified$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure306: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$qualifiedName$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure307: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$reachable$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure308: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$ref$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure309: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refresh$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure310: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refreshCoverage$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure311: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refreshGC$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure312: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refreshTime$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure313: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$resetAccumulator$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure314: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$result$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure315: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$results$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure316: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$resume$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure317: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$retainedBytes$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure318: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$retainedSize$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure319: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$retainingPath$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure320: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$rootLib(v);
+    },
+    $isFunction: true
+  },
+  main_closure321: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$sampleCount$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure322: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$sampleDepth$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure323: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$sampleRate$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure324: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$script$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure325: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$small$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure326: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$socket$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure327: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$socketOwner(v);
+    },
+    $isFunction: true
+  },
+  main_closure328: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$startLine$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure329: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$status$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure330: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$subclass(v);
+    },
+    $isFunction: true
+  },
+  main_closure331: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$superClass(v);
+    },
+    $isFunction: true
+  },
+  main_closure332: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$tagSelector$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure333: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$text$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure334: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$timeSpan$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure335: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$tokenPos(v);
+    },
+    $isFunction: true
+  },
+  main_closure336: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$trace$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure337: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$uncheckedText$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure338: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$vm$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure339: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$webSocket$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure340: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("curly-block", C.Type_cop);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure341: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("observatory-element", C.Type_sRP);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure342: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-ref", C.Type_UJT);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure343: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("instance-ref", C.Type_EVD);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure344: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("action-link", C.Type_kA7);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure345: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-bar", C.Type_nV5);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure346: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-menu", C.Type_KMd);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure347: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-menu-item", C.Type_AD4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure348: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-refresh", C.Type_Sxn);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure349: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-control", C.Type_9ur);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure350: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("top-nav-menu", C.Type_C7R);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure351: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-nav-menu", C.Type_wsa);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure352: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("library-nav-menu", C.Type_s2l);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure353: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-nav-menu", C.Type_JFX);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure354: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("breakpoint-list", C.Type_ON8);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure355: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-ref", C.Type_ql8);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure356: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-tree", C.Type_dRp);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure357: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("eval-box", C.Type_8eb);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure358: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("eval-link", C.Type_p2P);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure359: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("field-ref", C.Type_ohY);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure360: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("function-ref", C.Type_wgH);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure361: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("library-ref", C.Type_mpV);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure362: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("script-ref", C.Type_wBh);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure363: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-view", C.Type_O5a);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure364: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("code-ref", C.Type_2jN);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure365: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("code-view", C.Type_Aym);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure366: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("error-view", C.Type_Npb);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure367: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("field-view", C.Type_4IJ);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure368: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("stack-frame", C.Type_Jcu);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure369: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("flag-list", C.Type_f1j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure370: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("flag-item", C.Type_7g3);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure371: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("script-inset", C.Type_a1Y);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure372: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("function-view", C.Type_bDN);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure373: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("heap-map", C.Type_SoB);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure374: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-view", C.Type_TEn);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure375: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-ref", C.Type_JmU);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure376: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-list-view", C.Type_yvP);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure377: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-ref", C.Type_i7j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure378: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-view", C.Type_M6L);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure379: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-connection-view", C.Type_L9j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure380: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-connection-ref", C.Type_uIL);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure381: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-socket-ref", C.Type_B8J);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure382: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-socket-list-view", C.Type_4m4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure383: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-socket-view", C.Type_61d);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure384: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-web-socket-ref", C.Type_MUU);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure385: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-web-socket-list-view", C.Type_gg4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure386: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-web-socket-view", C.Type_AyI);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure387: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-random-access-file-list-view", C.Type_IuH);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure388: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-random-access-file-ref", C.Type_mWg);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure389: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-random-access-file-view", C.Type_8cK);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure390: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-process-list-view", C.Type_8KD);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure391: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-process-ref", C.Type_qMZ);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure392: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-process-view", C.Type_AHF);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure393: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-ref", C.Type_ES1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure394: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-summary", C.Type_iL9);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure395: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-run-state", C.Type_aAD);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure396: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-location", C.Type_ECh);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure397: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-shared-summary", C.Type_8Gl);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure398: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-counter-chart", C.Type_wT1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure399: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-view", C.Type_ZKG);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure400: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("instance-view", C.Type_gqS);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure401: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("json-view", C.Type_Kyy);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure402: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("library-view", C.Type_qph);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure403: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("heap-profile", C.Type_LV6);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure404: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("sliding-checkbox", C.Type_kuc);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure405: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-profile", C.Type_cOY);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure406: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("script-view", C.Type_0e9);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure407: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("stack-trace", C.Type_nVV);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure408: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("vm-view", C.Type_E0k);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure409: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-view", C.Type_Mu6);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure410: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("observatory-application", C.Type_YgH);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure411: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-exception-view", C.Type_y1j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure412: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-error-view", C.Type_FKd);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure413: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("vm-ref", C.Type_Eue);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+},
+1],
+["breakpoint_list_element", "package:observatory/src/elements/breakpoint_list.dart", , B, {
+  "^": "",
+  BreakpointListElement: {
+    "^": "ObservatoryElement_ChangeNotifier;_breakpoint_list_element$__$msg,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$msg: function(receiver) {
+      return receiver._breakpoint_list_element$__$msg;
+    },
+    set$msg: function(receiver, value) {
+      receiver._breakpoint_list_element$__$msg = this.notifyPropertyChange$3(receiver, C.Symbol_msg, receiver._breakpoint_list_element$__$msg, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._breakpoint_list_element$__$msg).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {BreakpointListElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.BreakpointListElement_methods.Element$created$0(receiver);
+        C.BreakpointListElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["class_ref_element", "package:observatory/src/elements/class_ref.dart", , Q, {
+  "^": "",
+  ClassRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {ClassRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassRefElement_methods.Element$created$0(receiver);
+        C.ClassRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["class_tree_element", "package:observatory/src/elements/class_tree.dart", , O, {
+  "^": "",
+  ClassTreeRow: {
+    "^": "TableTreeRow;isolate>,cls>,parent,depth,children,columns,_app$__$expander,_app$__$expanderStyle,_expanded,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onShow$0: function(_) {
+      var t1, t2, t3, t4, subClass, t5, row;
+      t1 = this.children;
+      if (t1.length > 0)
+        return;
+      for (t2 = J.get$iterator$ax(J.get$children$x(this.cls)), t3 = this.isolate, t4 = this.depth + 1; t2.moveNext$0();) {
+        subClass = t2.get$current();
+        if (subClass.get$isPatch() === true)
+          continue;
+        t5 = [];
+        t5.$builtinTypeInfo = [G.TableTreeRow];
+        row = new O.ClassTreeRow(t3, subClass, this, t4, t5, [], "\u2192", "cursor: pointer;", false, null, null);
+        if (!row.hasChildren$0()) {
+          t5 = row._app$__$expanderStyle;
+          if (row.get$hasObservers(row) && !J.$eq(t5, "visibility:hidden;")) {
+            t5 = new T.PropertyChangeRecord(row, C.Symbol_expanderStyle, t5, "visibility:hidden;");
+            t5.$builtinTypeInfo = [null];
+            row.notifyChange$1(row, t5);
+          }
+          row._app$__$expanderStyle = "visibility:hidden;";
+        }
+        t1.push(row);
+      }
+    },
+    onHide$0: function() {
+    },
+    hasChildren$0: function() {
+      return J.get$length$asx(J.get$children$x(this.cls)) > 0;
+    }
+  },
+  ClassTreeElement: {
+    "^": "ObservatoryElement_ChangeNotifier1;_class_tree_element$__$isolate,tree=,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._class_tree_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._class_tree_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._class_tree_element$__$isolate, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = R._toObservableDeep([]);
+      receiver.tree = new G.TableTree(t1, null, null);
+      t1 = receiver._class_tree_element$__$isolate;
+      if (t1 != null)
+        this._update$1(receiver, t1.get$objectClass());
+    },
+    isolateChanged$1: [function(receiver, oldValue) {
+      receiver._class_tree_element$__$isolate.getClassHierarchy$0().then$1(new O.ClassTreeElement_isolateChanged_closure(receiver));
+    }, "call$1", "get$isolateChanged", 2, 0, 13, 57],
+    _update$1: function(receiver, root) {
+      var rootRow, e, stackTrace, t1, t2, rootRow0, t3, t4, t5, exception;
+      try {
+        t1 = receiver._class_tree_element$__$isolate;
+        t2 = H.setRuntimeTypeInfo([], [G.TableTreeRow]);
+        rootRow0 = new O.ClassTreeRow(t1, root, null, 0, t2, [], "\u2192", "cursor: pointer;", false, null, null);
+        rootRow0.TableTreeRow$1(null);
+        rootRow = rootRow0;
+        t1 = J.get$children$x(rootRow);
+        t2 = receiver._class_tree_element$__$isolate;
+        t3 = rootRow;
+        t4 = H.setRuntimeTypeInfo([], [G.TableTreeRow]);
+        t5 = t3 != null ? t3.get$depth() + 1 : 0;
+        t4 = new O.ClassTreeRow(t2, root, t3, t5, t4, [], "\u2192", "cursor: pointer;", false, null, null);
+        t4.TableTreeRow$1(t3);
+        t1.push(t4);
+        receiver.tree.initialize$1(rootRow);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        stackTrace = new H._StackTrace(exception, null);
+        N.Logger_Logger("").warning$3("_update", e, stackTrace);
+      }
+
+      if (J.$eq(J.get$length$asx(receiver.tree.rows), 1))
+        receiver.tree.toggle$1(0);
+      this.notifyPropertyChange$3(receiver, C.Symbol_tree, null, receiver.tree);
+    },
+    padding$1: [function(receiver, row) {
+      return "padding-left: " + row.get$depth() * 16 + "px;";
+    }, "call$1", "get$padding", 2, 0, 90, 91],
+    coloring$1: [function(receiver, row) {
+      return C.List_mBx[C.JSInt_methods.$mod(row.get$depth() - 1, 9)];
+    }, "call$1", "get$coloring", 2, 0, 90, 91],
+    toggleExpanded$3: [function(receiver, e, detail, target) {
+      var row, e0, stackTrace, t1, t2, exception;
+      t1 = J.getInterceptor$x(e);
+      if (!J.$eq(J.get$id$x(t1.get$target(e)), "expand") && !J.$eq(t1.get$target(e), target))
+        return;
+      row = J.get$parent$x(target);
+      if (!!J.getInterceptor(row).$isTableRowElement)
+        try {
+          t1 = receiver.tree;
+          t2 = J.get$rowIndex$x(row);
+          if (typeof t2 !== "number")
+            return t2.$sub();
+          t1.toggle$1(t2 - 1);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          stackTrace = new H._StackTrace(exception, null);
+          N.Logger_Logger("").warning$3("toggleExpanded", e0, stackTrace);
+        }
+
+    }, "call$3", "get$toggleExpanded", 6, 0, 92, 1, 93, 94],
+    static: {ClassTreeElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassTreeElement_methods.Element$created$0(receiver);
+        C.ClassTreeElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier1: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ClassTreeElement_isolateChanged_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(objectClass) {
+      J._update$1$x(this.this_0, objectClass);
+    }, "call$1", null, 2, 0, null, 95, "call"],
+    $isFunction: true
+  }
+}],
+["class_view_element", "package:observatory/src/elements/class_view.dart", , Z, {
+  "^": "",
+  ClassViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier2;_class_view_element$__$cls,_class_view_element$__$instances,_class_view_element$__$retainedBytes,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$cls: function(receiver) {
+      return receiver._class_view_element$__$cls;
+    },
+    set$cls: function(receiver, value) {
+      receiver._class_view_element$__$cls = this.notifyPropertyChange$3(receiver, C.Symbol_cls, receiver._class_view_element$__$cls, value);
+    },
+    get$instances: function(receiver) {
+      return receiver._class_view_element$__$instances;
+    },
+    set$instances: function(receiver, value) {
+      receiver._class_view_element$__$instances = this.notifyPropertyChange$3(receiver, C.Symbol_instances, receiver._class_view_element$__$instances, value);
+    },
+    get$retainedBytes: function(receiver) {
+      return receiver._class_view_element$__$retainedBytes;
+    },
+    set$retainedBytes: function(receiver, value) {
+      receiver._class_view_element$__$retainedBytes = this.notifyPropertyChange$3(receiver, C.Symbol_retainedBytes, receiver._class_view_element$__$retainedBytes, value);
+    },
+    eval$1: [function(receiver, text) {
+      return receiver._class_view_element$__$cls.get$1("eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    reachable$1: [function(receiver, limit) {
+      return receiver._class_view_element$__$cls.get$1("instances?limit=" + H.S(limit)).then$1(new Z.ClassViewElement_reachable_closure(receiver));
+    }, "call$1", "get$reachable", 2, 0, 98, 99],
+    retainedSize$1: [function(receiver, dummy) {
+      return receiver._class_view_element$__$cls.get$1("retained").then$1(new Z.ClassViewElement_retainedSize_closure(receiver));
+    }, "call$1", "get$retainedSize", 2, 0, 98, 100],
+    refresh$1: [function(receiver, done) {
+      receiver._class_view_element$__$instances = this.notifyPropertyChange$3(receiver, C.Symbol_instances, receiver._class_view_element$__$instances, null);
+      receiver._class_view_element$__$retainedBytes = this.notifyPropertyChange$3(receiver, C.Symbol_retainedBytes, receiver._class_view_element$__$retainedBytes, null);
+      J.reload$0$x(receiver._class_view_element$__$cls).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {ClassViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassViewElement_methods.Element$created$0(receiver);
+        C.ClassViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier2: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ClassViewElement_reachable_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(obj) {
+      var t1 = this.this_0;
+      t1._class_view_element$__$instances = J.notifyPropertyChange$3$x(t1, C.Symbol_instances, t1._class_view_element$__$instances, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  ClassViewElement_retainedSize_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(obj) {
+      var t1, t2;
+      t1 = this.this_0;
+      t2 = H.Primitives_parseInt(J.$index$asx(obj, "valueAsString"), null, null);
+      t1._class_view_element$__$retainedBytes = J.notifyPropertyChange$3$x(t1, C.Symbol_retainedBytes, t1._class_view_element$__$retainedBytes, t2);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  }
+}],
+["code_ref_element", "package:observatory/src/elements/code_ref.dart", , O, {
+  "^": "",
+  CodeRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$code: function(receiver) {
+      return receiver._service_ref_element$__$ref;
+    },
+    refChanged$1: [function(receiver, oldValue) {
+      Q.ServiceRefElement.prototype.refChanged$1.call(this, receiver, oldValue);
+      this.notifyPropertyChange$3(receiver, C.Symbol_code, 0, 1);
+    }, "call$1", "get$refChanged", 2, 0, 13, 57],
+    static: {CodeRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.CodeRefElement_methods.Element$created$0(receiver);
+        C.CodeRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["code_view_element", "package:observatory/src/elements/code_view.dart", , F, {
+  "^": "",
+  CodeViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier3;_code_view_element$__$code,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$code: function(receiver) {
+      return receiver._code_view_element$__$code;
+    },
+    set$code: function(receiver, value) {
+      receiver._code_view_element$__$code = this.notifyPropertyChange$3(receiver, C.Symbol_code, receiver._code_view_element$__$code, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = receiver._code_view_element$__$code;
+      if (t1 == null)
+        return;
+      J.load$0$x(t1).then$1(new F.CodeViewElement_attached_closure());
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._code_view_element$__$code).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _findJumpTarget$1: function(receiver, target) {
+      var jumpTarget, address, node;
+      jumpTarget = J.get$attributes$x(target)._html$_element.getAttribute("data-jump-target");
+      if (jumpTarget === "")
+        return;
+      address = H.Primitives_parseInt(jumpTarget, null, null);
+      node = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#addr-" + H.S(address));
+      if (node == null)
+        return;
+      return node;
+    },
+    mouseOver$3: [function(receiver, e, detail, target) {
+      var jt = this._findJumpTarget$1(receiver, target);
+      if (jt == null)
+        return;
+      J.get$classes$x(jt).add$1(0, "highlight");
+    }, "call$3", "get$mouseOver", 6, 0, 102, 1, 93, 94],
+    mouseOut$3: [function(receiver, e, detail, target) {
+      var jt = this._findJumpTarget$1(receiver, target);
+      if (jt == null)
+        return;
+      J.get$classes$x(jt).remove$1(0, "highlight");
+    }, "call$3", "get$mouseOut", 6, 0, 102, 1, 93, 94],
+    static: {CodeViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.CodeViewElement_methods.Element$created$0(receiver);
+        C.CodeViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier3: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  CodeViewElement_attached_closure: {
+    "^": "Closure:103;",
+    call$1: [function(c) {
+      c.loadScript$0();
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  }
+}],
+["curly_block_element", "package:observatory/src/elements/curly_block.dart", , R, {
+  "^": "",
+  CurlyBlockElement: {
+    "^": "PolymerElement_ChangeNotifier0;_curly_block_element$__$expanded,_curly_block_element$__$busy,_curly_block_element$__$callback,_curly_block_element$__$expand,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$expanded: function(receiver) {
+      return receiver._curly_block_element$__$expanded;
+    },
+    set$expanded: function(receiver, value) {
+      receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, receiver._curly_block_element$__$expanded, value);
+    },
+    get$busy: function(receiver) {
+      return receiver._curly_block_element$__$busy;
+    },
+    set$busy: function(receiver, value) {
+      receiver._curly_block_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._curly_block_element$__$busy, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._curly_block_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$2: function($receiver, arg0, arg1) {
+      return this.get$callback($receiver).call$2(arg0, arg1);
+    },
+    set$callback: function(receiver, value) {
+      receiver._curly_block_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._curly_block_element$__$callback, value);
+    },
+    get$expand: function(receiver) {
+      return receiver._curly_block_element$__$expand;
+    },
+    set$expand: function(receiver, value) {
+      receiver._curly_block_element$__$expand = this.notifyPropertyChange$3(receiver, C.Symbol_expand, receiver._curly_block_element$__$expand, value);
+    },
+    expandChanged$1: [function(receiver, oldValue) {
+      var t1 = receiver._curly_block_element$__$expand;
+      receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, receiver._curly_block_element$__$expanded, t1);
+    }, "call$1", "get$expandChanged", 2, 0, 20, 57],
+    doneCallback$0: [function(receiver) {
+      var t1 = receiver._curly_block_element$__$expanded;
+      receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, t1, t1 !== true);
+      receiver._curly_block_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._curly_block_element$__$busy, false);
+    }, "call$0", "get$doneCallback", 0, 0, 18],
+    toggleExpand$3: [function(receiver, a, b, c) {
+      var t1 = receiver._curly_block_element$__$busy;
+      if (t1 === true)
+        return;
+      if (receiver._curly_block_element$__$callback != null) {
+        receiver._curly_block_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, t1, true);
+        this.callback$2(receiver, receiver._curly_block_element$__$expanded !== true, this.get$doneCallback(receiver));
+      } else {
+        t1 = receiver._curly_block_element$__$expanded;
+        receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, t1, t1 !== true);
+      }
+    }, "call$3", "get$toggleExpand", 6, 0, 79, 46, 47, 80],
+    static: {CurlyBlockElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._curly_block_element$__$expanded = false;
+        receiver._curly_block_element$__$busy = false;
+        receiver._curly_block_element$__$callback = null;
+        receiver._curly_block_element$__$expand = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.CurlyBlockElement_methods.Element$created$0(receiver);
+        C.CurlyBlockElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier0: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["dart._internal", "dart:_internal", , H, {
+  "^": "",
+  IterableMixinWorkaround_forEach: function(iterable, f) {
+    var t1;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();)
+      f.call$1(t1._current);
+  },
+  IterableMixinWorkaround_any: function(iterable, f) {
+    var t1;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();)
+      if (f.call$1(t1._current) === true)
+        return true;
+    return false;
+  },
+  IterableMixinWorkaround_fold: function(iterable, initialValue, combine) {
+    var t1;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();)
+      initialValue = combine.call$2(initialValue, t1._current);
+    return initialValue;
+  },
+  IterableMixinWorkaround_sortList: function(list, compare) {
+    if (compare == null)
+      compare = P.Comparable_compare$closure();
+    H.Sort__doSort(list, 0, list.length - 1, compare);
+  },
+  IterableMixinWorkaround__rangeCheck: function(list, start, end) {
+    var t1 = J.getInterceptor$n(start);
+    if (t1.$lt(start, 0) || t1.$gt(start, list.length))
+      throw H.wrapException(P.RangeError$range(start, 0, list.length));
+    t1 = J.getInterceptor$n(end);
+    if (t1.$lt(end, start) || t1.$gt(end, list.length))
+      throw H.wrapException(P.RangeError$range(end, start, list.length));
+  },
+  IterableMixinWorkaround_setRangeList: function(list, start, end, from, skipCount) {
+    var $length, t1, otherStart, otherList;
+    H.IterableMixinWorkaround__rangeCheck(list, start, end);
+    $length = J.$sub$n(end, start);
+    if (J.$eq($length, 0))
+      return;
+    if (J.$lt$n(skipCount, 0))
+      throw H.wrapException(P.ArgumentError$(skipCount));
+    t1 = J.getInterceptor(from);
+    if (!!t1.$isList) {
+      otherStart = skipCount;
+      otherList = from;
+    } else {
+      otherList = t1.skip$1(from, skipCount).toList$1$growable(0, false);
+      otherStart = 0;
+    }
+    if (J.$gt$n(J.$add$ns(otherStart, $length), J.get$length$asx(otherList)))
+      throw H.wrapException(H.IterableElementError_tooFew());
+    H.Lists_copy(otherList, otherStart, list, start, $length);
+  },
+  IterableMixinWorkaround_insertAllList: function(list, index, iterable) {
+    var t1, insertionLength, t2, index0;
+    if (index < 0 || index > list.length)
+      throw H.wrapException(P.RangeError$range(index, 0, list.length));
+    t1 = J.getInterceptor(iterable);
+    if (!t1.$isEfficientLength)
+      iterable = t1.toList$1$growable(iterable, false);
+    t1 = J.getInterceptor$asx(iterable);
+    insertionLength = t1.get$length(iterable);
+    t2 = list.length;
+    if (typeof insertionLength !== "number")
+      return H.iae(insertionLength);
+    C.JSArray_methods.set$length(list, t2 + insertionLength);
+    t2 = list.length;
+    if (!!list.immutable$list)
+      H.throwExpression(P.UnsupportedError$("set range"));
+    H.IterableMixinWorkaround_setRangeList(list, index + insertionLength, t2, list, index);
+    for (t1 = t1.get$iterator(iterable); t1.moveNext$0(); index = index0) {
+      index0 = index + 1;
+      C.JSArray_methods.$indexSet(list, index, t1.get$current());
+    }
+  },
+  IterableMixinWorkaround_setAllList: function(list, index, iterable) {
+    var t1, index0;
+    if (index < 0 || index > list.length)
+      throw H.wrapException(P.RangeError$range(index, 0, list.length));
+    for (t1 = J.get$iterator$ax(iterable); t1.moveNext$0(); index = index0) {
+      index0 = index + 1;
+      C.JSArray_methods.$indexSet(list, index, t1.get$current());
+    }
+  },
+  IterableElementError_noElement: function() {
+    return new P.StateError("No element");
+  },
+  IterableElementError_tooFew: function() {
+    return new P.StateError("Too few elements");
+  },
+  Lists_copy: function(src, srcStart, dst, dstStart, count) {
+    var t1, i, j, t2, t3;
+    t1 = J.getInterceptor$n(srcStart);
+    if (t1.$lt(srcStart, dstStart))
+      for (i = J.$sub$n(t1.$add(srcStart, count), 1), j = J.$sub$n(J.$add$ns(dstStart, count), 1), t1 = J.getInterceptor$asx(src); t2 = J.getInterceptor$n(i), t2.$ge(i, srcStart); i = t2.$sub(i, 1), j = J.$sub$n(j, 1))
+        C.JSArray_methods.$indexSet(dst, j, t1.$index(src, i));
+    else
+      for (t2 = J.getInterceptor$asx(src), j = dstStart, i = srcStart; t3 = J.getInterceptor$n(i), t3.$lt(i, t1.$add(srcStart, count)); i = t3.$add(i, 1), j = J.$add$ns(j, 1))
+        C.JSArray_methods.$indexSet(dst, j, t2.$index(src, i));
+  },
+  Lists_indexOf: function(a, element, startIndex, endIndex) {
+    var i;
+    if (startIndex >= a.length)
+      return -1;
+    for (i = startIndex; i < endIndex; ++i) {
+      if (i >= a.length)
+        return H.ioore(a, i);
+      if (J.$eq(a[i], element))
+        return i;
+    }
+    return -1;
+  },
+  Lists_lastIndexOf: function(a, element, startIndex) {
+    var t1, i;
+    if (typeof startIndex !== "number")
+      return startIndex.$lt();
+    if (startIndex < 0)
+      return -1;
+    t1 = a.length;
+    if (startIndex >= t1)
+      startIndex = t1 - 1;
+    for (i = startIndex; i >= 0; --i) {
+      if (i >= a.length)
+        return H.ioore(a, i);
+      if (J.$eq(a[i], element))
+        return i;
+    }
+    return -1;
+  },
+  Sort__doSort: function(a, left, right, compare) {
+    if (right - left <= 32)
+      H.Sort__insertionSort(a, left, right, compare);
+    else
+      H.Sort__dualPivotQuicksort(a, left, right, compare);
+  },
+  Sort__insertionSort: function(a, left, right, compare) {
+    var i, t1, el, j, j0;
+    for (i = left + 1, t1 = J.getInterceptor$asx(a); i <= right; ++i) {
+      el = t1.$index(a, i);
+      j = i;
+      while (true) {
+        if (!(j > left && J.$gt$n(compare.call$2(t1.$index(a, j - 1), el), 0)))
+          break;
+        j0 = j - 1;
+        t1.$indexSet(a, j, t1.$index(a, j0));
+        j = j0;
+      }
+      t1.$indexSet(a, j, el);
+    }
+  },
+  Sort__dualPivotQuicksort: function(a, left, right, compare) {
+    var sixth, index1, index5, index3, index2, index4, t1, el1, el2, el3, el4, el5, t0, less, great, k, ak, comp, t2, great0, less0, pivots_are_equal;
+    sixth = C.JSInt_methods._tdivFast$1(right - left + 1, 6);
+    index1 = left + sixth;
+    index5 = right - sixth;
+    index3 = C.JSInt_methods._tdivFast$1(left + right, 2);
+    index2 = index3 - sixth;
+    index4 = index3 + sixth;
+    t1 = J.getInterceptor$asx(a);
+    el1 = t1.$index(a, index1);
+    el2 = t1.$index(a, index2);
+    el3 = t1.$index(a, index3);
+    el4 = t1.$index(a, index4);
+    el5 = t1.$index(a, index5);
+    if (J.$gt$n(compare.call$2(el1, el2), 0)) {
+      t0 = el2;
+      el2 = el1;
+      el1 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el4, el5), 0)) {
+      t0 = el5;
+      el5 = el4;
+      el4 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el1, el3), 0)) {
+      t0 = el3;
+      el3 = el1;
+      el1 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el2, el3), 0)) {
+      t0 = el3;
+      el3 = el2;
+      el2 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el1, el4), 0)) {
+      t0 = el4;
+      el4 = el1;
+      el1 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el3, el4), 0)) {
+      t0 = el4;
+      el4 = el3;
+      el3 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el2, el5), 0)) {
+      t0 = el5;
+      el5 = el2;
+      el2 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el2, el3), 0)) {
+      t0 = el3;
+      el3 = el2;
+      el2 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el4, el5), 0)) {
+      t0 = el5;
+      el5 = el4;
+      el4 = t0;
+    }
+    t1.$indexSet(a, index1, el1);
+    t1.$indexSet(a, index3, el3);
+    t1.$indexSet(a, index5, el5);
+    t1.$indexSet(a, index2, t1.$index(a, left));
+    t1.$indexSet(a, index4, t1.$index(a, right));
+    less = left + 1;
+    great = right - 1;
+    if (J.$eq(compare.call$2(el2, el4), 0)) {
+      for (k = less; k <= great; ++k) {
+        ak = t1.$index(a, k);
+        comp = compare.call$2(ak, el2);
+        t2 = J.getInterceptor(comp);
+        if (t2.$eq(comp, 0))
+          continue;
+        if (t2.$lt(comp, 0)) {
+          if (k !== less) {
+            t1.$indexSet(a, k, t1.$index(a, less));
+            t1.$indexSet(a, less, ak);
+          }
+          ++less;
+        } else
+          for (; true;) {
+            comp = compare.call$2(t1.$index(a, great), el2);
+            t2 = J.getInterceptor$n(comp);
+            if (t2.$gt(comp, 0)) {
+              --great;
+              continue;
+            } else {
+              great0 = great - 1;
+              if (t2.$lt(comp, 0)) {
+                t1.$indexSet(a, k, t1.$index(a, less));
+                less0 = less + 1;
+                t1.$indexSet(a, less, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                less = less0;
+                break;
+              } else {
+                t1.$indexSet(a, k, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                break;
+              }
+            }
+          }
+      }
+      pivots_are_equal = true;
+    } else {
+      for (k = less; k <= great; ++k) {
+        ak = t1.$index(a, k);
+        if (J.$lt$n(compare.call$2(ak, el2), 0)) {
+          if (k !== less) {
+            t1.$indexSet(a, k, t1.$index(a, less));
+            t1.$indexSet(a, less, ak);
+          }
+          ++less;
+        } else if (J.$gt$n(compare.call$2(ak, el4), 0))
+          for (; true;)
+            if (J.$gt$n(compare.call$2(t1.$index(a, great), el4), 0)) {
+              --great;
+              if (great < k)
+                break;
+              continue;
+            } else {
+              great0 = great - 1;
+              if (J.$lt$n(compare.call$2(t1.$index(a, great), el2), 0)) {
+                t1.$indexSet(a, k, t1.$index(a, less));
+                less0 = less + 1;
+                t1.$indexSet(a, less, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                less = less0;
+              } else {
+                t1.$indexSet(a, k, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+              }
+              break;
+            }
+      }
+      pivots_are_equal = false;
+    }
+    t2 = less - 1;
+    t1.$indexSet(a, left, t1.$index(a, t2));
+    t1.$indexSet(a, t2, el2);
+    t2 = great + 1;
+    t1.$indexSet(a, right, t1.$index(a, t2));
+    t1.$indexSet(a, t2, el4);
+    H.Sort__doSort(a, left, less - 2, compare);
+    H.Sort__doSort(a, great + 2, right, compare);
+    if (pivots_are_equal)
+      return;
+    if (less < index1 && great > index5) {
+      for (; J.$eq(compare.call$2(t1.$index(a, less), el2), 0);)
+        ++less;
+      for (; J.$eq(compare.call$2(t1.$index(a, great), el4), 0);)
+        --great;
+      for (k = less; k <= great; ++k) {
+        ak = t1.$index(a, k);
+        if (J.$eq(compare.call$2(ak, el2), 0)) {
+          if (k !== less) {
+            t1.$indexSet(a, k, t1.$index(a, less));
+            t1.$indexSet(a, less, ak);
+          }
+          ++less;
+        } else if (J.$eq(compare.call$2(ak, el4), 0))
+          for (; true;)
+            if (J.$eq(compare.call$2(t1.$index(a, great), el4), 0)) {
+              --great;
+              if (great < k)
+                break;
+              continue;
+            } else {
+              great0 = great - 1;
+              if (J.$lt$n(compare.call$2(t1.$index(a, great), el2), 0)) {
+                t1.$indexSet(a, k, t1.$index(a, less));
+                less0 = less + 1;
+                t1.$indexSet(a, less, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                less = less0;
+              } else {
+                t1.$indexSet(a, k, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+              }
+              break;
+            }
+      }
+      H.Sort__doSort(a, less, great, compare);
+    } else
+      H.Sort__doSort(a, less, great, compare);
+  },
+  ListIterable: {
+    "^": "IterableBase;",
+    get$iterator: function(_) {
+      return H.setRuntimeTypeInfo(new H.ListIterator(this, this.get$length(this), 0, null), [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+    },
+    forEach$1: function(_, action) {
+      var $length, i;
+      $length = this.get$length(this);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      i = 0;
+      for (; i < $length; ++i) {
+        action.call$1(this.elementAt$1(0, i));
+        if ($length !== this.get$length(this))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+    },
+    get$isEmpty: function(_) {
+      return J.$eq(this.get$length(this), 0);
+    },
+    get$last: function(_) {
+      if (J.$eq(this.get$length(this), 0))
+        throw H.wrapException(H.IterableElementError_noElement());
+      return this.elementAt$1(0, J.$sub$n(this.get$length(this), 1));
+    },
+    contains$1: function(_, element) {
+      var $length, i;
+      $length = this.get$length(this);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      i = 0;
+      for (; i < $length; ++i) {
+        if (J.$eq(this.elementAt$1(0, i), element))
+          return true;
+        if ($length !== this.get$length(this))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+      return false;
+    },
+    any$1: function(_, test) {
+      var $length, i;
+      $length = this.get$length(this);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      i = 0;
+      for (; i < $length; ++i) {
+        if (test.call$1(this.elementAt$1(0, i)) === true)
+          return true;
+        if ($length !== this.get$length(this))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+      return false;
+    },
+    join$1: function(_, separator) {
+      var $length, t1, first, buffer, i, str;
+      $length = this.get$length(this);
+      if (separator.length !== 0) {
+        t1 = J.getInterceptor($length);
+        if (t1.$eq($length, 0))
+          return "";
+        first = H.S(this.elementAt$1(0, 0));
+        if (!t1.$eq($length, this.get$length(this)))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+        buffer = P.StringBuffer$(first);
+        if (typeof $length !== "number")
+          return H.iae($length);
+        i = 1;
+        for (; i < $length; ++i) {
+          buffer._contents += separator;
+          str = this.elementAt$1(0, i);
+          buffer._contents += typeof str === "string" ? str : H.S(str);
+          if ($length !== this.get$length(this))
+            throw H.wrapException(P.ConcurrentModificationError$(this));
+        }
+        return buffer._contents;
+      } else {
+        buffer = P.StringBuffer$("");
+        if (typeof $length !== "number")
+          return H.iae($length);
+        i = 0;
+        for (; i < $length; ++i) {
+          str = this.elementAt$1(0, i);
+          buffer._contents += typeof str === "string" ? str : H.S(str);
+          if ($length !== this.get$length(this))
+            throw H.wrapException(P.ConcurrentModificationError$(this));
+        }
+        return buffer._contents;
+      }
+    },
+    where$1: function(_, test) {
+      return P.IterableBase.prototype.where$1.call(this, this, test);
+    },
+    map$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(this, f), [null, null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E0", ret: P.Iterable, args: [{func: "dynamic__E0", args: [E]}]};
+      }, this.$receiver, "ListIterable");
+    }, 31],
+    toList$1$growable: function(_, growable) {
+      var result, t1, i;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(this));
+      } else {
+        t1 = this.get$length(this);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = Array(t1);
+        t1.fixed$length = init;
+        result = H.setRuntimeTypeInfo(t1, [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+      }
+      i = 0;
+      while (true) {
+        t1 = this.get$length(this);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        if (!(i < t1))
+          break;
+        t1 = this.elementAt$1(0, i);
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t1;
+        ++i;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    $isEfficientLength: true
+  },
+  SubListIterable: {
+    "^": "ListIterable;_iterable,_start,_endOrLength",
+    get$_endIndex: function() {
+      var $length, t1;
+      $length = J.get$length$asx(this._iterable);
+      t1 = this._endOrLength;
+      if (t1 == null || J.$gt$n(t1, $length))
+        return $length;
+      return t1;
+    },
+    get$_startIndex: function() {
+      var $length, t1;
+      $length = J.get$length$asx(this._iterable);
+      t1 = this._start;
+      if (J.$gt$n(t1, $length))
+        return $length;
+      return t1;
+    },
+    get$length: function(_) {
+      var $length, t1, t2;
+      $length = J.get$length$asx(this._iterable);
+      t1 = this._start;
+      if (J.$ge$n(t1, $length))
+        return 0;
+      t2 = this._endOrLength;
+      if (t2 == null || J.$ge$n(t2, $length))
+        return J.$sub$n($length, t1);
+      return J.$sub$n(t2, t1);
+    },
+    elementAt$1: function(_, index) {
+      var realIndex = J.$add$ns(this.get$_startIndex(), index);
+      if (J.$lt$n(index, 0) || J.$ge$n(realIndex, this.get$_endIndex()))
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      return J.elementAt$1$ax(this._iterable, realIndex);
+    },
+    skip$1: function(_, count) {
+      if (J.$lt$n(count, 0))
+        throw H.wrapException(P.RangeError$value(count));
+      return H.SubListIterable$(this._iterable, J.$add$ns(this._start, count), this._endOrLength, null);
+    },
+    take$1: function(_, count) {
+      var t1, t2, newEnd;
+      if (count < 0)
+        throw H.wrapException(P.RangeError$value(count));
+      t1 = this._endOrLength;
+      t2 = this._start;
+      if (t1 == null)
+        return H.SubListIterable$(this._iterable, t2, J.$add$ns(t2, count), null);
+      else {
+        newEnd = J.$add$ns(t2, count);
+        if (J.$lt$n(t1, newEnd))
+          return this;
+        return H.SubListIterable$(this._iterable, t2, newEnd, null);
+      }
+    },
+    SubListIterable$3: function(_iterable, _start, _endOrLength, $E) {
+      var t1, t2, t3;
+      t1 = this._start;
+      t2 = J.getInterceptor$n(t1);
+      if (t2.$lt(t1, 0))
+        throw H.wrapException(P.RangeError$value(t1));
+      t3 = this._endOrLength;
+      if (t3 != null) {
+        if (J.$lt$n(t3, 0))
+          throw H.wrapException(P.RangeError$value(t3));
+        if (t2.$gt(t1, t3))
+          throw H.wrapException(P.RangeError$range(t1, 0, t3));
+      }
+    },
+    static: {SubListIterable$: function(_iterable, _start, _endOrLength, $E) {
+        var t1 = H.setRuntimeTypeInfo(new H.SubListIterable(_iterable, _start, _endOrLength), [$E]);
+        t1.SubListIterable$3(_iterable, _start, _endOrLength, $E);
+        return t1;
+      }}
+  },
+  ListIterator: {
+    "^": "Object;_iterable,_length,_index,_current",
+    get$current: function() {
+      return this._current;
+    },
+    moveNext$0: function() {
+      var t1, t2, $length, t3;
+      t1 = this._iterable;
+      t2 = J.getInterceptor$asx(t1);
+      $length = t2.get$length(t1);
+      if (!J.$eq(this._length, $length))
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      t3 = this._index;
+      if (typeof $length !== "number")
+        return H.iae($length);
+      if (t3 >= $length) {
+        this._current = null;
+        return false;
+      }
+      this._current = t2.elementAt$1(t1, t3);
+      ++this._index;
+      return true;
+    }
+  },
+  MappedIterable: {
+    "^": "IterableBase;_iterable,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    get$iterator: function(_) {
+      var t1 = new H.MappedIterator(null, J.get$iterator$ax(this._iterable), this._f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._iterable);
+    },
+    get$isEmpty: function(_) {
+      return J.get$isEmpty$asx(this._iterable);
+    },
+    get$last: function(_) {
+      return this._f$1(J.get$last$ax(this._iterable));
+    },
+    $asIterableBase: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    },
+    static: {MappedIterable_MappedIterable: function(iterable, $function, $S, $T) {
+        if (!!J.getInterceptor(iterable).$isEfficientLength)
+          return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(iterable, $function), [$S, $T]);
+        return H.setRuntimeTypeInfo(new H.MappedIterable(iterable, $function), [$S, $T]);
+      }}
+  },
+  EfficientLengthMappedIterable: {
+    "^": "MappedIterable;_iterable,_f",
+    $isEfficientLength: true
+  },
+  MappedIterator: {
+    "^": "Iterator;_current,_iterator,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    moveNext$0: function() {
+      var t1 = this._iterator;
+      if (t1.moveNext$0()) {
+        this._current = this._f$1(t1.get$current());
+        return true;
+      }
+      this._current = null;
+      return false;
+    },
+    get$current: function() {
+      return this._current;
+    },
+    $asIterator: function($S, $T) {
+      return [$T];
+    }
+  },
+  MappedListIterable: {
+    "^": "ListIterable;_source,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._source);
+    },
+    elementAt$1: function(_, index) {
+      return this._f$1(J.elementAt$1$ax(this._source, index));
+    },
+    $asListIterable: function($S, $T) {
+      return [$T];
+    },
+    $asIterableBase: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    },
+    $isEfficientLength: true
+  },
+  WhereIterable: {
+    "^": "IterableBase;_iterable,_f",
+    get$iterator: function(_) {
+      var t1 = new H.WhereIterator(J.get$iterator$ax(this._iterable), this._f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    }
+  },
+  WhereIterator: {
+    "^": "Iterator;_iterator,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    moveNext$0: function() {
+      for (var t1 = this._iterator; t1.moveNext$0();)
+        if (this._f$1(t1.get$current()) === true)
+          return true;
+      return false;
+    },
+    get$current: function() {
+      return this._iterator.get$current();
+    }
+  },
+  ExpandIterable: {
+    "^": "IterableBase;_iterable,_f",
+    get$iterator: function(_) {
+      var t1 = new H.ExpandIterator(J.get$iterator$ax(this._iterable), this._f, C.C_EmptyIterator, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    $asIterableBase: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    }
+  },
+  ExpandIterator: {
+    "^": "Object;_iterator,_f,_currentExpansion,_current",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    get$current: function() {
+      return this._current;
+    },
+    moveNext$0: function() {
+      var t1, t2;
+      t1 = this._currentExpansion;
+      if (t1 == null)
+        return false;
+      for (t2 = this._iterator; !t1.moveNext$0();) {
+        this._current = null;
+        if (t2.moveNext$0()) {
+          this._currentExpansion = null;
+          t1 = J.get$iterator$ax(this._f$1(t2.get$current()));
+          this._currentExpansion = t1;
+        } else
+          return false;
+      }
+      this._current = this._currentExpansion.get$current();
+      return true;
+    }
+  },
+  EmptyIterator: {
+    "^": "Object;",
+    moveNext$0: function() {
+      return false;
+    },
+    get$current: function() {
+      return;
+    }
+  },
+  FixedLengthListMixin: {
+    "^": "Object;",
+    set$length: function(receiver, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change the length of a fixed-length list"));
+    },
+    add$1: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    insert$2: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    insertAll$2: function(receiver, at, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    addAll$1: function(receiver, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    clear$0: function(receiver) {
+      throw H.wrapException(P.UnsupportedError$("Cannot clear a fixed-length list"));
+    },
+    removeRange$2: function(receiver, start, end) {
+      throw H.wrapException(P.UnsupportedError$("Cannot remove from a fixed-length list"));
+    }
+  },
+  UnmodifiableListMixin: {
+    "^": "Object;",
+    $indexSet: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change the length of an unmodifiable list"));
+    },
+    setAll$2: function(_, at, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    add$1: function(_, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    insert$2: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    insertAll$2: function(_, at, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    addAll$1: function(_, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    clear$0: function(_) {
+      throw H.wrapException(P.UnsupportedError$("Cannot clear an unmodifiable list"));
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(_, start, end) {
+      throw H.wrapException(P.UnsupportedError$("Cannot remove from an unmodifiable list"));
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  UnmodifiableListBase: {
+    "^": "ListBase+UnmodifiableListMixin;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  ReversedListIterable: {
+    "^": "ListIterable;_source",
+    get$length: function(_) {
+      return J.get$length$asx(this._source);
+    },
+    elementAt$1: function(_, index) {
+      var t1, t2, t3;
+      t1 = this._source;
+      t2 = J.getInterceptor$asx(t1);
+      t3 = t2.get$length(t1);
+      if (typeof index !== "number")
+        return H.iae(index);
+      return t2.elementAt$1(t1, t3 - 1 - index);
+    }
+  },
+  Symbol0: {
+    "^": "Object;_name>",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isSymbol0 && J.$eq(this._name, other._name);
+    },
+    get$hashCode: function(_) {
+      var t1 = J.get$hashCode$(this._name);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return 536870911 & 664597 * t1;
+    },
+    toString$0: function(_) {
+      return "Symbol(\"" + H.S(this._name) + "\")";
+    },
+    $isSymbol0: true,
+    $isSymbol: true,
+    static: {"^": "Symbol_reservedWordRE,Symbol_publicIdentifierRE,Symbol_identifierRE,Symbol_operatorRE,Symbol_publicSymbolPattern,Symbol_symbolPattern"}
+  }
+}],
+["dart._js_names", "dart:_js_names", , H, {
+  "^": "",
+  extractKeys: function(victim) {
+    var t1 = H.setRuntimeTypeInfo(function(victim, hasOwnProperty) {
+      var result = [];
+      for (var key in victim) {
+        if (hasOwnProperty.call(victim, key))
+          result.push(key);
+      }
+      return result;
+    }(victim, Object.prototype.hasOwnProperty), [null]);
+    t1.fixed$length = init;
+    return t1;
+  }
+}],
+["dart.async", "dart:async", , P, {
+  "^": "",
+  _AsyncRun__initializeScheduleImmediate: function() {
+    if ($.get$globalThis().scheduleImmediate != null)
+      return P._AsyncRun__scheduleImmediateJsOverride$closure();
+    return P._AsyncRun__scheduleImmediateWithTimer$closure();
+  },
+  _AsyncRun__scheduleImmediateJsOverride: [function(callback) {
+    ++init.globalState.topEventLoop._activeJsAsyncCount;
+    $.get$globalThis().scheduleImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateJsOverride_internalCallback(callback), 0));
+  }, "call$1", "_AsyncRun__scheduleImmediateJsOverride$closure", 2, 0, 19],
+  _AsyncRun__scheduleImmediateWithTimer: [function(callback) {
+    P._createTimer(C.Duration_0, callback);
+  }, "call$1", "_AsyncRun__scheduleImmediateWithTimer$closure", 2, 0, 19],
+  _registerErrorHandler: function(errorHandler, zone) {
+    var t1 = H.getDynamicRuntimeType();
+    t1 = H.buildFunctionType(t1, [t1, t1])._isTest$1(errorHandler);
+    if (t1)
+      return zone.registerBinaryCallback$1(errorHandler);
+    else
+      return zone.registerUnaryCallback$1(errorHandler);
+  },
+  Future_Future: function(computation, $T) {
+    var result = P._Future$($T);
+    P.Timer_Timer(C.Duration_0, new P.Future_Future_closure(computation, result));
+    return result;
+  },
+  Future_wait: function(futures, eagerError) {
+    var t1, t2, t3, values, completer;
+    t1 = {};
+    t1.completer_0 = null;
+    t1.values_1 = null;
+    t1.remaining_2 = 0;
+    t1.error_3 = null;
+    t1.stackTrace_4 = null;
+    t2 = new P.Future_wait_handleError(t1, eagerError);
+    for (t3 = H.setRuntimeTypeInfo(new H.ListIterator(futures, futures.length, 0, null), [H.getTypeArgumentByIndex(futures, 0)]); t3.moveNext$0();)
+      t3._current.then$2$onError(new P.Future_wait_closure(t1, eagerError, t1.remaining_2++), t2);
+    t2 = t1.remaining_2;
+    if (t2 === 0)
+      return P._Future$immediate(C.List_empty, null);
+    values = Array(t2);
+    values.fixed$length = init;
+    t1.values_1 = values;
+    t2 = P.List;
+    completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(t2)), [t2]);
+    t1.completer_0 = completer;
+    return completer.future;
+  },
+  _asyncRunCallbackLoop: function() {
+    var entry = $._nextCallback;
+    for (; entry != null;) {
+      J.callback$0$x(entry);
+      entry = entry.get$next();
+      $._nextCallback = entry;
+    }
+    $._lastCallback = null;
+  },
+  _asyncRunCallback: [function() {
+    var exception;
+    try {
+      P._asyncRunCallbackLoop();
+    } catch (exception) {
+      H.unwrapException(exception);
+      $.get$_AsyncRun_scheduleImmediateClosure().call$1(P._asyncRunCallback$closure());
+      $._nextCallback = $._nextCallback.get$next();
+      throw exception;
+    }
+
+  }, "call$0", "_asyncRunCallback$closure", 0, 0, 18],
+  _scheduleAsyncCallback: function(callback) {
+    var t1, t2;
+    t1 = $._lastCallback;
+    if (t1 == null) {
+      t1 = new P._AsyncCallbackEntry(callback, null);
+      $._lastCallback = t1;
+      $._nextCallback = t1;
+      $.get$_AsyncRun_scheduleImmediateClosure().call$1(P._asyncRunCallback$closure());
+    } else {
+      t2 = new P._AsyncCallbackEntry(callback, null);
+      t1.next = t2;
+      $._lastCallback = t2;
+    }
+  },
+  scheduleMicrotask: function(callback) {
+    var t1;
+    if (J.$eq($.Zone__current, C.C__RootZone)) {
+      $.Zone__current.scheduleMicrotask$1(callback);
+      return;
+    }
+    t1 = $.Zone__current;
+    t1.scheduleMicrotask$1(t1.bindCallback$2$runGuarded(callback, true));
+  },
+  StreamController_StreamController: function(onCancel, onListen, onPause, onResume, sync, $T) {
+    return sync ? H.setRuntimeTypeInfo(new P._SyncStreamController(onListen, onPause, onResume, onCancel, null, 0, null), [$T]) : H.setRuntimeTypeInfo(new P._AsyncStreamController(onListen, onPause, onResume, onCancel, null, 0, null), [$T]);
+  },
+  StreamController_StreamController$broadcast: function(onCancel, onListen, sync, $T) {
+    var t1;
+    if (sync) {
+      t1 = H.setRuntimeTypeInfo(new P._SyncBroadcastStreamController(onListen, onCancel, 0, null, null, null, null), [$T]);
+      t1._async$_previous = t1;
+      t1._async$_next = t1;
+    } else {
+      t1 = H.setRuntimeTypeInfo(new P._AsyncBroadcastStreamController(onListen, onCancel, 0, null, null, null, null), [$T]);
+      t1._async$_previous = t1;
+      t1._async$_next = t1;
+    }
+    return t1;
+  },
+  _runGuarded: function(notificationHandler) {
+    var result, e, s, exception, t1;
+    if (notificationHandler == null)
+      return;
+    try {
+      result = notificationHandler.call$0();
+      if (!!J.getInterceptor(result).$isFuture)
+        return result;
+      return;
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      e = t1;
+      s = new H._StackTrace(exception, null);
+      $.Zone__current.handleUncaughtError$2(e, s);
+    }
+
+  },
+  _nullDataHandler: [function(value) {
+  }, "call$1", "_nullDataHandler$closure", 2, 0, 20, 21],
+  _nullErrorHandler: [function(error, stackTrace) {
+    $.Zone__current.handleUncaughtError$2(error, stackTrace);
+  }, function(error) {
+    return P._nullErrorHandler(error, null);
+  }, null, "call$2", "call$1", "_nullErrorHandler$closure", 2, 2, 22, 23, 24, 25],
+  _nullDoneHandler: [function() {
+  }, "call$0", "_nullDoneHandler$closure", 0, 0, 18],
+  _runUserCode: function(userCode, onSuccess, onError) {
+    var e, s, exception, t1;
+    try {
+      onSuccess.call$1(userCode.call$0());
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      e = t1;
+      s = new H._StackTrace(exception, null);
+      onError.call$2(e, s);
+    }
+
+  },
+  _cancelAndError: function(subscription, future, error, stackTrace) {
+    var cancelFuture = subscription.cancel$0();
+    if (!!J.getInterceptor(cancelFuture).$isFuture)
+      cancelFuture.whenComplete$1(new P._cancelAndError_closure(future, error, stackTrace));
+    else
+      future._completeError$2(error, stackTrace);
+  },
+  _cancelAndErrorClosure: function(subscription, future) {
+    return new P._cancelAndErrorClosure_closure(subscription, future);
+  },
+  _cancelAndValue: function(subscription, future, value) {
+    var cancelFuture = subscription.cancel$0();
+    if (!!J.getInterceptor(cancelFuture).$isFuture)
+      cancelFuture.whenComplete$1(new P._cancelAndValue_closure(future, value));
+    else
+      future._complete$1(value);
+  },
+  Timer_Timer: function(duration, callback) {
+    var t1;
+    if (J.$eq($.Zone__current, C.C__RootZone))
+      return $.Zone__current.createTimer$2(duration, callback);
+    t1 = $.Zone__current;
+    return t1.createTimer$2(duration, t1.bindCallback$2$runGuarded(callback, true));
+  },
+  _createTimer: function(duration, callback) {
+    var milliseconds = duration.get$inMilliseconds();
+    return H.TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
+  },
+  Zone__enter: function(zone) {
+    var previous = $.Zone__current;
+    $.Zone__current = zone;
+    return previous;
+  },
+  _rootHandleUncaughtError: [function($self, $parent, zone, error, stackTrace) {
+    $self.run$1(new P._rootHandleUncaughtError_closure(error, stackTrace));
+  }, "call$5", "_rootHandleUncaughtError$closure", 10, 0, 26, 27, 28, 29, 24, 25],
+  _rootRun: [function($self, $parent, zone, f) {
+    var old, t1;
+    if (J.$eq($.Zone__current, zone))
+      return f.call$0();
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$0();
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  }, "call$4", "_rootRun$closure", 8, 0, 30, 27, 28, 29, 31],
+  _rootRunUnary: [function($self, $parent, zone, f, arg) {
+    var old, t1;
+    if (J.$eq($.Zone__current, zone))
+      return f.call$1(arg);
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$1(arg);
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  }, "call$5", "_rootRunUnary$closure", 10, 0, 32, 27, 28, 29, 31, 33],
+  _rootRunBinary: [function($self, $parent, zone, f, arg1, arg2) {
+    var old, t1;
+    if (J.$eq($.Zone__current, zone))
+      return f.call$2(arg1, arg2);
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$2(arg1, arg2);
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  }, "call$6", "_rootRunBinary$closure", 12, 0, 34, 27, 28, 29, 31, 9, 10],
+  _rootRegisterCallback: [function($self, $parent, zone, f) {
+    return f;
+  }, "call$4", "_rootRegisterCallback$closure", 8, 0, 35, 27, 28, 29, 31],
+  _rootRegisterUnaryCallback: [function($self, $parent, zone, f) {
+    return f;
+  }, "call$4", "_rootRegisterUnaryCallback$closure", 8, 0, 36, 27, 28, 29, 31],
+  _rootRegisterBinaryCallback: [function($self, $parent, zone, f) {
+    return f;
+  }, "call$4", "_rootRegisterBinaryCallback$closure", 8, 0, 37, 27, 28, 29, 31],
+  _rootScheduleMicrotask: [function($self, $parent, zone, f) {
+    P._scheduleAsyncCallback(C.C__RootZone !== zone ? zone.bindCallback$1(f) : f);
+  }, "call$4", "_rootScheduleMicrotask$closure", 8, 0, 38],
+  _rootCreateTimer: [function($self, $parent, zone, duration, callback) {
+    return P._createTimer(duration, C.C__RootZone !== zone ? zone.bindCallback$1(callback) : callback);
+  }, "call$5", "_rootCreateTimer$closure", 10, 0, 39, 27, 28, 29, 40, 41],
+  _rootPrint: [function($self, $parent, zone, line) {
+    H.printString(line);
+  }, "call$4", "_rootPrint$closure", 8, 0, 42],
+  _printToZone: [function(line) {
+    J.print$1$x($.Zone__current, line);
+  }, "call$1", "_printToZone$closure", 2, 0, 43],
+  _rootFork: [function($self, $parent, zone, specification, zoneValues) {
+    var copiedMap;
+    $.printToZone = P._printToZone$closure();
+    copiedMap = P.HashMap_HashMap(null, null, null, null, null);
+    return new P._CustomizedZone(zone, specification, copiedMap);
+  }, "call$5", "_rootFork$closure", 10, 0, 44],
+  _AsyncRun__scheduleImmediateJsOverride_internalCallback: {
+    "^": "Closure:69;callback_0",
+    call$0: [function() {
+      H.leaveJsAsync();
+      this.callback_0.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _AsyncError: {
+    "^": "Object;error>,stackTrace<",
+    $isError: true
+  },
+  _BroadcastStream: {
+    "^": "_ControllerStream;_async$_controller"
+  },
+  _BroadcastSubscription: {
+    "^": "_ControllerSubscription;_eventState@,_async$_next@,_async$_previous@,_async$_controller,_onData,_onError,_onDone,_zone,_state,_cancelFuture,_pending",
+    get$_async$_controller: function() {
+      return this._async$_controller;
+    },
+    _expectsEvent$1: function(eventId) {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$and();
+      return (t1 & 1) === eventId;
+    },
+    _toggleEventId$0: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$xor();
+      this._eventState = t1 ^ 1;
+    },
+    get$_isFiring: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$and();
+      return (t1 & 2) !== 0;
+    },
+    _setRemoveAfterFiring$0: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$or();
+      this._eventState = t1 | 4;
+    },
+    get$_removeAfterFiring: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$and();
+      return (t1 & 4) !== 0;
+    },
+    _onPause$0: [function() {
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+    }, "call$0", "get$_onResume", 0, 0, 18],
+    static: {"^": "_BroadcastSubscription__STATE_EVENT_ID,_BroadcastSubscription__STATE_FIRING,_BroadcastSubscription__STATE_REMOVE_AFTER_FIRING"}
+  },
+  _BroadcastStreamController: {
+    "^": "Object;_async$_next@,_async$_previous@",
+    get$isPaused: function() {
+      return false;
+    },
+    _ensureDoneFuture$0: function() {
+      var t1 = this._doneFuture;
+      if (t1 != null)
+        return t1;
+      t1 = P._Future$(null);
+      this._doneFuture = t1;
+      return t1;
+    },
+    _removeListener$1: function(subscription) {
+      var previous, next;
+      previous = subscription.get$_async$_previous();
+      next = subscription.get$_async$_next();
+      previous.set$_async$_next(next);
+      next.set$_async$_previous(previous);
+      subscription.set$_async$_previous(subscription);
+      subscription.set$_async$_next(subscription);
+    },
+    _subscribe$1: function(cancelOnError) {
+      var t1, t2, subscription;
+      if ((this._state & 4) !== 0) {
+        t1 = new P._DoneStreamSubscription($.Zone__current, 0, P._nullDoneHandler$closure());
+        t1.$builtinTypeInfo = this.$builtinTypeInfo;
+        t1._schedule$0();
+        return t1;
+      }
+      t1 = $.Zone__current;
+      t2 = cancelOnError ? 1 : 0;
+      subscription = new P._BroadcastSubscription(null, null, null, this, null, null, null, t1, t2, null, null);
+      subscription.$builtinTypeInfo = this.$builtinTypeInfo;
+      subscription._async$_previous = subscription;
+      subscription._async$_next = subscription;
+      t2 = this._async$_previous;
+      subscription._async$_previous = t2;
+      subscription._async$_next = this;
+      t2.set$_async$_next(subscription);
+      this._async$_previous = subscription;
+      subscription._eventState = this._state & 1;
+      if (this._async$_next === subscription)
+        P._runGuarded(this._onListen);
+      return subscription;
+    },
+    _recordCancel$1: function(subscription) {
+      if (subscription.get$_async$_next() === subscription)
+        return;
+      if (subscription.get$_isFiring())
+        subscription._setRemoveAfterFiring$0();
+      else {
+        this._removeListener$1(subscription);
+        if ((this._state & 2) === 0 && this._async$_next === this)
+          this._callOnCancel$0();
+      }
+    },
+    _recordPause$1: function(subscription) {
+    },
+    _recordResume$1: function(subscription) {
+    },
+    _addEventError$0: function() {
+      if ((this._state & 4) !== 0)
+        return new P.StateError("Cannot add new events after calling close");
+      return new P.StateError("Cannot add new events while doing an addStream");
+    },
+    add$1: [function(_, data) {
+      if (this._state >= 4)
+        throw H.wrapException(this._addEventError$0());
+      this._sendData$1(data);
+    }, "call$1", "get$add", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "void__T", void: true, args: [T]};
+      }, this.$receiver, "_BroadcastStreamController");
+    }, 104],
+    addError$2: [function(error, stackTrace) {
+      if (this._state >= 4)
+        throw H.wrapException(this._addEventError$0());
+      this._sendError$2(error, stackTrace);
+    }, function(error) {
+      return this.addError$2(error, null);
+    }, "addError$1", "call$2", "call$1", "get$addError", 2, 2, 105, 23, 24, 25],
+    close$0: function(_) {
+      var t1, doneFuture;
+      t1 = this._state;
+      if ((t1 & 4) !== 0)
+        return this._doneFuture;
+      if (t1 >= 4)
+        throw H.wrapException(this._addEventError$0());
+      this._state = t1 | 4;
+      doneFuture = this._ensureDoneFuture$0();
+      this._sendDone$0();
+      return doneFuture;
+    },
+    _async$_add$1: function(_, data) {
+      this._sendData$1(data);
+    },
+    _addError$2: function(error, stackTrace) {
+      this._sendError$2(error, stackTrace);
+    },
+    _close$0: function() {
+      var addState = this._addStreamState;
+      this._addStreamState = null;
+      this._state &= 4294967287;
+      C.JSNull_methods.complete$0(addState);
+    },
+    _forEachListener$1: function(action) {
+      var t1, link, id, link0;
+      t1 = this._state;
+      if ((t1 & 2) !== 0)
+        throw H.wrapException(P.StateError$("Cannot fire new event. Controller is already firing an event"));
+      link = this._async$_next;
+      if (link === this)
+        return;
+      id = t1 & 1;
+      this._state = t1 ^ 3;
+      for (; link !== this;)
+        if (link._expectsEvent$1(id)) {
+          t1 = link.get$_eventState();
+          if (typeof t1 !== "number")
+            return t1.$or();
+          link.set$_eventState(t1 | 2);
+          action.call$1(link);
+          link._toggleEventId$0();
+          link0 = link.get$_async$_next();
+          if (link.get$_removeAfterFiring())
+            this._removeListener$1(link);
+          t1 = link.get$_eventState();
+          if (typeof t1 !== "number")
+            return t1.$and();
+          link.set$_eventState(t1 & 4294967293);
+          link = link0;
+        } else
+          link = link.get$_async$_next();
+      this._state &= 4294967293;
+      if (this._async$_next === this)
+        this._callOnCancel$0();
+    },
+    _callOnCancel$0: function() {
+      if ((this._state & 4) !== 0 && this._doneFuture._state === 0)
+        this._doneFuture._asyncComplete$1(null);
+      P._runGuarded(this._onCancel);
+    }
+  },
+  _SyncBroadcastStreamController: {
+    "^": "_BroadcastStreamController;_onListen,_onCancel,_state,_async$_next,_async$_previous,_addStreamState,_doneFuture",
+    _sendData$1: function(data) {
+      var t1 = this._async$_next;
+      if (t1 === this)
+        return;
+      if (t1.get$_async$_next() === this) {
+        this._state |= 2;
+        this._async$_next._async$_add$1(0, data);
+        this._state &= 4294967293;
+        if (this._async$_next === this)
+          this._callOnCancel$0();
+        return;
+      }
+      this._forEachListener$1(new P._SyncBroadcastStreamController__sendData_closure(this, data));
+    },
+    _sendError$2: function(error, stackTrace) {
+      if (this._async$_next === this)
+        return;
+      this._forEachListener$1(new P._SyncBroadcastStreamController__sendError_closure(this, error, stackTrace));
+    },
+    _sendDone$0: function() {
+      if (this._async$_next !== this)
+        this._forEachListener$1(new P._SyncBroadcastStreamController__sendDone_closure(this));
+      else
+        this._doneFuture._asyncComplete$1(null);
+    }
+  },
+  _SyncBroadcastStreamController__sendData_closure: {
+    "^": "Closure;this_0,data_1",
+    call$1: function(subscription) {
+      subscription._async$_add$1(0, this.data_1);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic___BufferingStreamSubscription", args: [[P._BufferingStreamSubscription, T]]};
+      }, this.this_0, "_SyncBroadcastStreamController");
+    }
+  },
+  _SyncBroadcastStreamController__sendError_closure: {
+    "^": "Closure;this_0,error_1,stackTrace_2",
+    call$1: function(subscription) {
+      subscription._addError$2(this.error_1, this.stackTrace_2);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic___BufferingStreamSubscription", args: [[P._BufferingStreamSubscription, T]]};
+      }, this.this_0, "_SyncBroadcastStreamController");
+    }
+  },
+  _SyncBroadcastStreamController__sendDone_closure: {
+    "^": "Closure;this_0",
+    call$1: function(subscription) {
+      subscription._close$0();
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic___BroadcastSubscription", args: [[P._BroadcastSubscription, T]]};
+      }, this.this_0, "_SyncBroadcastStreamController");
+    }
+  },
+  _AsyncBroadcastStreamController: {
+    "^": "_BroadcastStreamController;_onListen,_onCancel,_state,_async$_next,_async$_previous,_addStreamState,_doneFuture",
+    _sendData$1: function(data) {
+      var link, t1;
+      for (link = this._async$_next; link !== this; link = link.get$_async$_next()) {
+        t1 = new P._DelayedData(data, null);
+        t1.$builtinTypeInfo = [null];
+        link._addPending$1(t1);
+      }
+    },
+    _sendError$2: function(error, stackTrace) {
+      var link;
+      for (link = this._async$_next; link !== this; link = link.get$_async$_next())
+        link._addPending$1(new P._DelayedError(error, stackTrace, null));
+    },
+    _sendDone$0: function() {
+      var link = this._async$_next;
+      if (link !== this)
+        for (; link !== this; link = link.get$_async$_next())
+          link._addPending$1(C.C__DelayedDone);
+      else
+        this._doneFuture._asyncComplete$1(null);
+    }
+  },
+  Future: {
+    "^": "Object;",
+    $isFuture: true
+  },
+  Future_Future_closure: {
+    "^": "Closure:69;computation_0,result_1",
+    call$0: [function() {
+      var e, s, exception, t1;
+      try {
+        this.result_1._complete$1(this.computation_0.call$0());
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        this.result_1._completeError$2(e, s);
+      }
+
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Future_wait_handleError: {
+    "^": "Closure:75;box_0,eagerError_1",
+    call$2: [function(theError, theStackTrace) {
+      var t1, t2, t3;
+      t1 = this.box_0;
+      t2 = t1.values_1;
+      t1.values_1 = null;
+      t3 = --t1.remaining_2;
+      if (t2 != null)
+        if (t3 === 0 || this.eagerError_1)
+          t1.completer_0.completeError$2(theError, theStackTrace);
+        else {
+          t1.error_3 = theError;
+          t1.stackTrace_4 = theStackTrace;
+        }
+      else if (t3 === 0 && !this.eagerError_1)
+        t1.completer_0.completeError$2(t1.error_3, t1.stackTrace_4);
+    }, "call$2", null, 4, 0, null, 106, 107, "call"],
+    $isFunction: true
+  },
+  Future_wait_closure: {
+    "^": "Closure:108;box_0,eagerError_2,pos_3",
+    call$1: [function(value) {
+      var t1, t2, t3, t4;
+      t1 = this.box_0;
+      t2 = --t1.remaining_2;
+      t3 = t1.values_1;
+      if (t3 != null) {
+        t4 = this.pos_3;
+        if (t4 < 0 || t4 >= t3.length)
+          return H.ioore(t3, t4);
+        t3[t4] = value;
+        if (t2 === 0) {
+          t1 = t1.completer_0.future;
+          if (t1._state !== 0)
+            H.throwExpression(P.StateError$("Future already completed"));
+          t1._asyncComplete$1(t3);
+        }
+      } else if (t2 === 0 && !this.eagerError_2)
+        t1.completer_0.completeError$2(t1.error_3, t1.stackTrace_4);
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true
+  },
+  Completer: {
+    "^": "Object;",
+    $isCompleter: true
+  },
+  _Completer: {
+    "^": "Object;",
+    $isCompleter: true
+  },
+  _AsyncCompleter: {
+    "^": "_Completer;future",
+    complete$1: [function(_, value) {
+      var t1 = this.future;
+      if (t1._state !== 0)
+        throw H.wrapException(P.StateError$("Future already completed"));
+      t1._asyncComplete$1(value);
+    }, function($receiver) {
+      return this.complete$1($receiver, null);
+    }, "complete$0", "call$1", "call$0", "get$complete", 0, 2, 109, 23, 21],
+    completeError$2: [function(error, stackTrace) {
+      var t1;
+      if (error == null)
+        throw H.wrapException(P.ArgumentError$("Error must not be null"));
+      t1 = this.future;
+      if (t1._state !== 0)
+        throw H.wrapException(P.StateError$("Future already completed"));
+      t1._asyncCompleteError$2(error, stackTrace);
+    }, function(error) {
+      return this.completeError$2(error, null);
+    }, "completeError$1", "call$2", "call$1", "get$completeError", 2, 2, 105, 23, 24, 25]
+  },
+  _Future: {
+    "^": "Object;_state,_zone<,_resultOrListeners,_nextListener@,_onValueCallback,_errorTestCallback,_onErrorCallback,_whenCompleteActionCallback",
+    get$_isComplete: function() {
+      return this._state >= 4;
+    },
+    get$_hasValue: function() {
+      return this._state === 4;
+    },
+    get$_hasError: function() {
+      return this._state === 8;
+    },
+    set$_isChained: function(value) {
+      if (value)
+        this._state = 2;
+      else
+        this._state = 0;
+    },
+    get$_onValue: function() {
+      return this._state === 2 ? null : this._onValueCallback;
+    },
+    get$_errorTest: function() {
+      return this._state === 2 ? null : this._errorTestCallback;
+    },
+    get$_onError: function() {
+      return this._state === 2 ? null : this._onErrorCallback;
+    },
+    get$_whenCompleteAction: function() {
+      return this._state === 2 ? null : this._whenCompleteActionCallback;
+    },
+    then$2$onError: function(f, onError) {
+      var t1, result;
+      t1 = $.Zone__current;
+      result = H.setRuntimeTypeInfo(new P._Future(0, t1, null, null, t1.registerUnaryCallback$1(f), null, P._registerErrorHandler(onError, $.Zone__current), null), [null]);
+      this._addListener$1(result);
+      return result;
+    },
+    then$1: function(f) {
+      return this.then$2$onError(f, null);
+    },
+    catchError$2$test: function(onError, test) {
+      var t1, t2, result;
+      t1 = $.Zone__current;
+      t2 = P._registerErrorHandler(onError, t1);
+      result = H.setRuntimeTypeInfo(new P._Future(0, t1, null, null, null, $.Zone__current.registerUnaryCallback$1(test), t2, null), [null]);
+      this._addListener$1(result);
+      return result;
+    },
+    catchError$1: function(onError) {
+      return this.catchError$2$test(onError, null);
+    },
+    whenComplete$1: function(action) {
+      var t1, result;
+      t1 = $.Zone__current;
+      result = new P._Future(0, t1, null, null, null, null, null, t1.registerCallback$1(action));
+      result.$builtinTypeInfo = this.$builtinTypeInfo;
+      this._addListener$1(result);
+      return result;
+    },
+    get$_async$_value: function() {
+      return this._resultOrListeners;
+    },
+    get$_error: function() {
+      return this._resultOrListeners;
+    },
+    _setValue$1: function(value) {
+      this._state = 4;
+      this._resultOrListeners = value;
+    },
+    _setError$2: function(error, stackTrace) {
+      this._state = 8;
+      this._resultOrListeners = new P._AsyncError(error, stackTrace);
+    },
+    _addListener$1: function(listener) {
+      if (this._state >= 4)
+        this._zone.scheduleMicrotask$1(new P._Future__addListener_closure(this, listener));
+      else {
+        listener.set$_nextListener(this._resultOrListeners);
+        this._resultOrListeners = listener;
+      }
+    },
+    _removeListeners$0: function() {
+      var current, prev, next;
+      current = this._resultOrListeners;
+      this._resultOrListeners = null;
+      for (prev = null; current != null; prev = current, current = next) {
+        next = current.get$_nextListener();
+        current.set$_nextListener(prev);
+      }
+      return prev;
+    },
+    _complete$1: function(value) {
+      var t1, listeners;
+      t1 = J.getInterceptor(value);
+      if (!!t1.$isFuture)
+        if (!!t1.$is_Future)
+          P._Future__chainCoreFuture(value, this);
+        else
+          P._Future__chainForeignFuture(value, this);
+      else {
+        listeners = this._removeListeners$0();
+        this._setValue$1(value);
+        P._Future__propagateToListeners(this, listeners);
+      }
+    },
+    _completeWithValue$1: function(value) {
+      var listeners = this._removeListeners$0();
+      this._setValue$1(value);
+      P._Future__propagateToListeners(this, listeners);
+    },
+    _completeError$2: [function(error, stackTrace) {
+      var listeners = this._removeListeners$0();
+      this._setError$2(error, stackTrace);
+      P._Future__propagateToListeners(this, listeners);
+    }, function(error) {
+      return this._completeError$2(error, null);
+    }, "_completeError$1", "call$2", "call$1", "get$_completeError", 2, 2, 22, 23, 24, 25],
+    _asyncComplete$1: function(value) {
+      var t1;
+      if (value == null)
+        ;
+      else {
+        t1 = J.getInterceptor(value);
+        if (!!t1.$isFuture) {
+          if (!!t1.$is_Future) {
+            t1 = value._state;
+            if (t1 >= 4 && t1 === 8) {
+              if (this._state !== 0)
+                H.throwExpression(P.StateError$("Future already completed"));
+              this._state = 1;
+              this._zone.scheduleMicrotask$1(new P._Future__asyncComplete_closure(this, value));
+            } else
+              P._Future__chainCoreFuture(value, this);
+          } else
+            P._Future__chainForeignFuture(value, this);
+          return;
+        }
+      }
+      if (this._state !== 0)
+        H.throwExpression(P.StateError$("Future already completed"));
+      this._state = 1;
+      this._zone.scheduleMicrotask$1(new P._Future__asyncComplete_closure0(this, value));
+    },
+    _asyncCompleteError$2: function(error, stackTrace) {
+      if (this._state !== 0)
+        H.throwExpression(P.StateError$("Future already completed"));
+      this._state = 1;
+      this._zone.scheduleMicrotask$1(new P._Future__asyncCompleteError_closure(this, error, stackTrace));
+    },
+    _async$_Future$immediate$1: function(value, $T) {
+      this._asyncComplete$1(value);
+    },
+    _async$_Future$immediateError$2: function(error, stackTrace, $T) {
+      this._asyncCompleteError$2(error, stackTrace);
+    },
+    $is_Future: true,
+    $isFuture: true,
+    static: {"^": "_Future__INCOMPLETE,_Future__PENDING_COMPLETE,_Future__CHAINED,_Future__VALUE,_Future__ERROR", _Future$: function($T) {
+        return H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null, null, null, null, null, null), [$T]);
+      }, _Future$immediate: function(value, $T) {
+        var t1 = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null, null, null, null, null, null), [$T]);
+        t1._async$_Future$immediate$1(value, $T);
+        return t1;
+      }, _Future$immediateError: function(error, stackTrace, $T) {
+        var t1 = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null, null, null, null, null, null), [$T]);
+        t1._async$_Future$immediateError$2(error, stackTrace, $T);
+        return t1;
+      }, _Future__chainForeignFuture: function(source, target) {
+        target.set$_isChained(true);
+        source.then$2$onError(new P._Future__chainForeignFuture_closure(target), new P._Future__chainForeignFuture_closure0(target));
+      }, _Future__chainCoreFuture: function(source, target) {
+        target.set$_isChained(true);
+        if (source._state >= 4)
+          P._Future__propagateToListeners(source, target);
+        else
+          source._addListener$1(target);
+      }, _Future__propagateMultipleListeners: function(source, listeners) {
+        var listeners0;
+        do {
+          listeners0 = listeners.get$_nextListener();
+          listeners.set$_nextListener(null);
+          P._Future__propagateToListeners(source, listeners);
+          if (listeners0 != null) {
+            listeners = listeners0;
+            continue;
+          } else
+            break;
+        } while (true);
+      }, _Future__propagateToListeners: function(source, listeners) {
+        var t1, t2, t3, hasError, asyncError, sourceValue, zone, oldZone, chainSource, listeners0;
+        t1 = {};
+        t1.source_4 = source;
+        for (t2 = source; true;) {
+          t3 = {};
+          if (!t2.get$_isComplete())
+            return;
+          hasError = t1.source_4.get$_hasError();
+          if (hasError && listeners == null) {
+            asyncError = t1.source_4.get$_error();
+            t1.source_4.get$_zone().handleUncaughtError$2(J.get$error$x(asyncError), asyncError.get$stackTrace());
+            return;
+          }
+          if (listeners == null)
+            return;
+          if (listeners.get$_nextListener() != null) {
+            P._Future__propagateMultipleListeners(t1.source_4, listeners);
+            return;
+          }
+          t3.listenerHasValue_1 = true;
+          sourceValue = t1.source_4.get$_hasValue() ? t1.source_4.get$_async$_value() : null;
+          t3.listenerValueOrError_2 = sourceValue;
+          t3.isPropagationAborted_3 = false;
+          t2 = !hasError;
+          if (!t2 || listeners.get$_onValue() != null || listeners.get$_whenCompleteAction() != null) {
+            zone = listeners.get$_zone();
+            if (hasError && !t1.source_4.get$_zone().inSameErrorZone$1(zone)) {
+              asyncError = t1.source_4.get$_error();
+              t1.source_4.get$_zone().handleUncaughtError$2(J.get$error$x(asyncError), asyncError.get$stackTrace());
+              return;
+            }
+            oldZone = $.Zone__current;
+            if (oldZone == null ? zone != null : oldZone !== zone)
+              $.Zone__current = zone;
+            else
+              oldZone = null;
+            if (t2) {
+              if (listeners.get$_onValue() != null)
+                t3.listenerHasValue_1 = new P._Future__propagateToListeners_handleValueCallback(t3, listeners, sourceValue, zone).call$0();
+            } else
+              new P._Future__propagateToListeners_handleError(t1, t3, listeners, zone).call$0();
+            if (listeners.get$_whenCompleteAction() != null)
+              new P._Future__propagateToListeners_handleWhenCompleteCallback(t1, t3, hasError, listeners, zone).call$0();
+            if (oldZone != null)
+              $.Zone__current = oldZone;
+            if (t3.isPropagationAborted_3)
+              return;
+            if (t3.listenerHasValue_1 === true) {
+              t2 = t3.listenerValueOrError_2;
+              t2 = (sourceValue == null ? t2 != null : sourceValue !== t2) && !!J.getInterceptor(t2).$isFuture;
+            } else
+              t2 = false;
+            if (t2) {
+              chainSource = t3.listenerValueOrError_2;
+              if (!!J.getInterceptor(chainSource).$is_Future)
+                if (chainSource._state >= 4) {
+                  listeners.set$_isChained(true);
+                  t1.source_4 = chainSource;
+                  t2 = chainSource;
+                  continue;
+                } else
+                  P._Future__chainCoreFuture(chainSource, listeners);
+              else
+                P._Future__chainForeignFuture(chainSource, listeners);
+              return;
+            }
+          }
+          if (t3.listenerHasValue_1 === true) {
+            listeners0 = listeners._removeListeners$0();
+            listeners._setValue$1(t3.listenerValueOrError_2);
+          } else {
+            listeners0 = listeners._removeListeners$0();
+            asyncError = t3.listenerValueOrError_2;
+            listeners._setError$2(J.get$error$x(asyncError), asyncError.get$stackTrace());
+          }
+          t1.source_4 = listeners;
+          t2 = listeners;
+          listeners = listeners0;
+        }
+      }}
+  },
+  _Future__addListener_closure: {
+    "^": "Closure:69;this_0,listener_1",
+    call$0: [function() {
+      P._Future__propagateToListeners(this.this_0, this.listener_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__chainForeignFuture_closure: {
+    "^": "Closure:13;target_0",
+    call$1: [function(value) {
+      this.target_0._completeWithValue$1(value);
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true
+  },
+  _Future__chainForeignFuture_closure0: {
+    "^": "Closure:110;target_1",
+    call$2: [function(error, stackTrace) {
+      this.target_1._completeError$2(error, stackTrace);
+    }, function(error) {
+      return this.call$2(error, null);
+    }, "call$1", "call$2", null, null, 2, 2, null, 23, 24, 25, "call"],
+    $isFunction: true
+  },
+  _Future__asyncComplete_closure: {
+    "^": "Closure:69;this_0,coreFuture_1",
+    call$0: [function() {
+      P._Future__chainCoreFuture(this.coreFuture_1, this.this_0);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__asyncComplete_closure0: {
+    "^": "Closure:69;this_2,value_3",
+    call$0: [function() {
+      this.this_2._completeWithValue$1(this.value_3);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__asyncCompleteError_closure: {
+    "^": "Closure:69;this_0,error_1,stackTrace_2",
+    call$0: [function() {
+      this.this_0._completeError$2(this.error_1, this.stackTrace_2);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleValueCallback: {
+    "^": "Closure:111;box_1,listener_3,sourceValue_4,zone_5",
+    call$0: function() {
+      var e, s, exception, t1;
+      try {
+        this.box_1.listenerValueOrError_2 = this.zone_5.runUnary$2(this.listener_3.get$_onValue(), this.sourceValue_4);
+        return true;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        this.box_1.listenerValueOrError_2 = new P._AsyncError(e, s);
+        return false;
+      }
+
+    },
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleError: {
+    "^": "Closure:18;box_2,box_1,listener_6,zone_7",
+    call$0: function() {
+      var asyncError, test, matchesTest, e, s, errorCallback, e0, s0, t1, exception, t2, listenerValueOrError, t3, t4;
+      asyncError = this.box_2.source_4.get$_error();
+      t1 = this.listener_6;
+      test = t1.get$_errorTest();
+      matchesTest = true;
+      if (test != null)
+        try {
+          matchesTest = this.zone_7.runUnary$2(test, J.get$error$x(asyncError));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          s = new H._StackTrace(exception, null);
+          t1 = J.get$error$x(asyncError);
+          t2 = e;
+          listenerValueOrError = (t1 == null ? t2 == null : t1 === t2) ? asyncError : new P._AsyncError(e, s);
+          t1 = this.box_1;
+          t1.listenerValueOrError_2 = listenerValueOrError;
+          t1.listenerHasValue_1 = false;
+          return;
+        }
+
+      errorCallback = t1.get$_onError();
+      if (matchesTest === true && errorCallback != null) {
+        try {
+          t1 = errorCallback;
+          t2 = H.getDynamicRuntimeType();
+          t2 = H.buildFunctionType(t2, [t2, t2])._isTest$1(t1);
+          t3 = this.zone_7;
+          t4 = this.box_1;
+          if (t2)
+            t4.listenerValueOrError_2 = t3.runBinary$3(errorCallback, J.get$error$x(asyncError), asyncError.get$stackTrace());
+          else
+            t4.listenerValueOrError_2 = t3.runUnary$2(errorCallback, J.get$error$x(asyncError));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          s0 = new H._StackTrace(exception, null);
+          t1 = J.get$error$x(asyncError);
+          t2 = e0;
+          listenerValueOrError = (t1 == null ? t2 == null : t1 === t2) ? asyncError : new P._AsyncError(e0, s0);
+          t1 = this.box_1;
+          t1.listenerValueOrError_2 = listenerValueOrError;
+          t1.listenerHasValue_1 = false;
+          return;
+        }
+
+        this.box_1.listenerHasValue_1 = true;
+      } else {
+        t1 = this.box_1;
+        t1.listenerValueOrError_2 = asyncError;
+        t1.listenerHasValue_1 = false;
+      }
+    },
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback: {
+    "^": "Closure:18;box_2,box_1,hasError_8,listener_9,zone_10",
+    call$0: function() {
+      var t1, e, s, exception, t2, t3;
+      t1 = {};
+      t1.completeResult_0 = null;
+      try {
+        t1.completeResult_0 = this.zone_10.run$1(this.listener_9.get$_whenCompleteAction());
+      } catch (exception) {
+        t2 = H.unwrapException(exception);
+        e = t2;
+        s = new H._StackTrace(exception, null);
+        if (this.hasError_8) {
+          t2 = J.get$error$x(this.box_2.source_4.get$_error());
+          t3 = e;
+          t3 = t2 == null ? t3 == null : t2 === t3;
+          t2 = t3;
+        } else
+          t2 = false;
+        t3 = this.box_1;
+        if (t2)
+          t3.listenerValueOrError_2 = this.box_2.source_4.get$_error();
+        else
+          t3.listenerValueOrError_2 = new P._AsyncError(e, s);
+        t3.listenerHasValue_1 = false;
+      }
+
+      if (!!J.getInterceptor(t1.completeResult_0).$isFuture) {
+        t2 = this.listener_9;
+        t2.set$_isChained(true);
+        this.box_1.isPropagationAborted_3 = true;
+        t1.completeResult_0.then$2$onError(new P._Future__propagateToListeners_handleWhenCompleteCallback_closure(this.box_2, t2), new P._Future__propagateToListeners_handleWhenCompleteCallback_closure0(t1, t2));
+      }
+    },
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback_closure: {
+    "^": "Closure:13;box_2,listener_11",
+    call$1: [function(ignored) {
+      P._Future__propagateToListeners(this.box_2.source_4, this.listener_11);
+    }, "call$1", null, 2, 0, null, 112, "call"],
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback_closure0: {
+    "^": "Closure:110;box_0,listener_12",
+    call$2: [function(error, stackTrace) {
+      var t1, completeResult;
+      t1 = this.box_0;
+      if (!J.getInterceptor(t1.completeResult_0).$is_Future) {
+        completeResult = P._Future$(null);
+        t1.completeResult_0 = completeResult;
+        completeResult._setError$2(error, stackTrace);
+      }
+      P._Future__propagateToListeners(t1.completeResult_0, this.listener_12);
+    }, function(error) {
+      return this.call$2(error, null);
+    }, "call$1", "call$2", null, null, 2, 2, null, 23, 24, 25, "call"],
+    $isFunction: true
+  },
+  _AsyncCallbackEntry: {
+    "^": "Object;callback>,next@",
+    callback$0: function($receiver) {
+      return this.callback.call$0();
+    }
+  },
+  Stream: {
+    "^": "Object;",
+    map$1: [function(_, convert) {
+      return H.setRuntimeTypeInfo(new P._MapStream(convert, this), [H.getRuntimeTypeArgument(this, "Stream", 0), null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "Stream__dynamic__T", ret: P.Stream, args: [{func: "dynamic__T", args: [T]}]};
+      }, this.$receiver, "Stream");
+    }, 113],
+    expand$1: [function(_, convert) {
+      return H.setRuntimeTypeInfo(new P._ExpandStream(convert, this), [H.getRuntimeTypeArgument(this, "Stream", 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "Stream__Iterable__T", ret: P.Stream, args: [{func: "Iterable__T", ret: P.Iterable, args: [T]}]};
+      }, this.$receiver, "Stream");
+    }, 113],
+    contains$1: function(_, needle) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.bool);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_contains_closure(t1, this, needle, future), true, new P.Stream_contains_closure0(future), future.get$_completeError());
+      return future;
+    },
+    forEach$1: function(_, action) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(null);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_forEach_closure(t1, this, action, future), true, new P.Stream_forEach_closure0(future), future.get$_completeError());
+      return future;
+    },
+    any$1: function(_, test) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.bool);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_any_closure(t1, this, test, future), true, new P.Stream_any_closure0(future), future.get$_completeError());
+      return future;
+    },
+    get$length: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.$int);
+      t1.count_0 = 0;
+      this.listen$4$cancelOnError$onDone$onError(new P.Stream_length_closure(t1), true, new P.Stream_length_closure0(t1, future), future.get$_completeError());
+      return future;
+    },
+    get$isEmpty: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.bool);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_isEmpty_closure(t1, future), true, new P.Stream_isEmpty_closure0(future), future.get$_completeError());
+      return future;
+    },
+    get$first: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(H.getRuntimeTypeArgument(this, "Stream", 0));
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_first_closure(t1, this, future), true, new P.Stream_first_closure0(future), future.get$_completeError());
+      return future;
+    },
+    get$last: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(H.getRuntimeTypeArgument(this, "Stream", 0));
+      t1.result_0 = null;
+      t1.foundResult_1 = false;
+      this.listen$4$cancelOnError$onDone$onError(new P.Stream_last_closure(t1, this), true, new P.Stream_last_closure0(t1, future), future.get$_completeError());
+      return future;
+    },
+    $isStream: true
+  },
+  Stream_contains_closure: {
+    "^": "Closure;box_0,this_1,needle_2,future_3",
+    call$1: [function(element) {
+      var t1, t2;
+      t1 = this.box_0;
+      t2 = this.future_3;
+      P._runUserCode(new P.Stream_contains__closure(this.needle_2, element), new P.Stream_contains__closure0(t1, t2), P._cancelAndErrorClosure(t1.subscription_0, t2));
+    }, "call$1", null, 2, 0, null, 114, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_contains__closure: {
+    "^": "Closure:69;needle_4,element_5",
+    call$0: function() {
+      return J.$eq(this.element_5, this.needle_4);
+    },
+    $isFunction: true
+  },
+  Stream_contains__closure0: {
+    "^": "Closure:115;box_0,future_6",
+    call$1: function(isMatch) {
+      if (isMatch === true)
+        P._cancelAndValue(this.box_0.subscription_0, this.future_6, true);
+    },
+    $isFunction: true
+  },
+  Stream_contains_closure0: {
+    "^": "Closure:69;future_7",
+    call$0: [function() {
+      this.future_7._complete$1(false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_forEach_closure: {
+    "^": "Closure;box_0,this_1,action_2,future_3",
+    call$1: [function(element) {
+      P._runUserCode(new P.Stream_forEach__closure(this.action_2, element), new P.Stream_forEach__closure0(), P._cancelAndErrorClosure(this.box_0.subscription_0, this.future_3));
+    }, "call$1", null, 2, 0, null, 114, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_forEach__closure: {
+    "^": "Closure:69;action_4,element_5",
+    call$0: function() {
+      return this.action_4.call$1(this.element_5);
+    },
+    $isFunction: true
+  },
+  Stream_forEach__closure0: {
+    "^": "Closure:13;",
+    call$1: function(_) {
+    },
+    $isFunction: true
+  },
+  Stream_forEach_closure0: {
+    "^": "Closure:69;future_6",
+    call$0: [function() {
+      this.future_6._complete$1(null);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_any_closure: {
+    "^": "Closure;box_0,this_1,test_2,future_3",
+    call$1: [function(element) {
+      var t1, t2;
+      t1 = this.box_0;
+      t2 = this.future_3;
+      P._runUserCode(new P.Stream_any__closure(this.test_2, element), new P.Stream_any__closure0(t1, t2), P._cancelAndErrorClosure(t1.subscription_0, t2));
+    }, "call$1", null, 2, 0, null, 114, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_any__closure: {
+    "^": "Closure:69;test_4,element_5",
+    call$0: function() {
+      return this.test_4.call$1(this.element_5);
+    },
+    $isFunction: true
+  },
+  Stream_any__closure0: {
+    "^": "Closure:115;box_0,future_6",
+    call$1: function(isMatch) {
+      if (isMatch === true)
+        P._cancelAndValue(this.box_0.subscription_0, this.future_6, true);
+    },
+    $isFunction: true
+  },
+  Stream_any_closure0: {
+    "^": "Closure:69;future_7",
+    call$0: [function() {
+      this.future_7._complete$1(false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_length_closure: {
+    "^": "Closure:13;box_0",
+    call$1: [function(_) {
+      ++this.box_0.count_0;
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  Stream_length_closure0: {
+    "^": "Closure:69;box_0,future_1",
+    call$0: [function() {
+      this.future_1._complete$1(this.box_0.count_0);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_isEmpty_closure: {
+    "^": "Closure:13;box_0,future_1",
+    call$1: [function(_) {
+      P._cancelAndValue(this.box_0.subscription_0, this.future_1, false);
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  Stream_isEmpty_closure0: {
+    "^": "Closure:69;future_2",
+    call$0: [function() {
+      this.future_2._complete$1(true);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_first_closure: {
+    "^": "Closure;box_0,this_1,future_2",
+    call$1: [function(value) {
+      P._cancelAndValue(this.box_0.subscription_0, this.future_2, value);
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_first_closure0: {
+    "^": "Closure:69;future_3",
+    call$0: [function() {
+      this.future_3._completeError$1(new P.StateError("No elements"));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_last_closure: {
+    "^": "Closure;box_0,this_1",
+    call$1: [function(value) {
+      var t1 = this.box_0;
+      t1.foundResult_1 = true;
+      t1.result_0 = value;
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_last_closure0: {
+    "^": "Closure:69;box_0,future_2",
+    call$0: [function() {
+      var t1 = this.box_0;
+      if (t1.foundResult_1) {
+        this.future_2._complete$1(t1.result_0);
+        return;
+      }
+      this.future_2._completeError$1(new P.StateError("No elements"));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  StreamSubscription: {
+    "^": "Object;",
+    $isStreamSubscription: true
+  },
+  _StreamController: {
+    "^": "Object;",
+    get$isPaused: function() {
+      var t1 = this._state;
+      return (t1 & 1) !== 0 ? this.get$_subscription().get$_isInputPaused() : (t1 & 2) === 0;
+    },
+    get$_pendingEvents: function() {
+      if ((this._state & 8) === 0)
+        return this._varData;
+      return this._varData.get$varData();
+    },
+    _ensurePendingEvents$0: function() {
+      var t1, state;
+      if ((this._state & 8) === 0) {
+        t1 = this._varData;
+        if (t1 == null) {
+          t1 = new P._StreamImplEvents(null, null, 0);
+          this._varData = t1;
+        }
+        return t1;
+      }
+      state = this._varData;
+      state.get$varData();
+      return state.get$varData();
+    },
+    get$_subscription: function() {
+      if ((this._state & 8) !== 0)
+        return this._varData.get$varData();
+      return this._varData;
+    },
+    _badEventState$0: function() {
+      if ((this._state & 4) !== 0)
+        return new P.StateError("Cannot add event after closing");
+      return new P.StateError("Cannot add event while adding a stream");
+    },
+    _ensureDoneFuture$0: function() {
+      var t1 = this._doneFuture;
+      if (t1 == null) {
+        t1 = (this._state & 2) !== 0 ? $.get$Future__nullFuture() : P._Future$(null);
+        this._doneFuture = t1;
+      }
+      return t1;
+    },
+    add$1: [function(_, value) {
+      var t1 = this._state;
+      if (t1 >= 4)
+        throw H.wrapException(this._badEventState$0());
+      if ((t1 & 1) !== 0)
+        this._sendData$1(value);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, H.setRuntimeTypeInfo(new P._DelayedData(value, null), [H.getRuntimeTypeArgument(this, "_StreamController", 0)]));
+    }, "call$1", "get$add", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "void__T0", void: true, args: [T]};
+      }, this.$receiver, "_StreamController");
+    }],
+    close$0: function(_) {
+      var t1 = this._state;
+      if ((t1 & 4) !== 0)
+        return this._ensureDoneFuture$0();
+      if (t1 >= 4)
+        throw H.wrapException(this._badEventState$0());
+      t1 |= 4;
+      this._state = t1;
+      if ((t1 & 1) !== 0)
+        this._sendDone$0();
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, C.C__DelayedDone);
+      return this._ensureDoneFuture$0();
+    },
+    _async$_add$1: function(_, value) {
+      var t1 = this._state;
+      if ((t1 & 1) !== 0)
+        this._sendData$1(value);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, H.setRuntimeTypeInfo(new P._DelayedData(value, null), [H.getRuntimeTypeArgument(this, "_StreamController", 0)]));
+    },
+    _addError$2: function(error, stackTrace) {
+      var t1 = this._state;
+      if ((t1 & 1) !== 0)
+        this._sendError$2(error, stackTrace);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, new P._DelayedError(error, stackTrace, null));
+    },
+    _subscribe$1: function(cancelOnError) {
+      var t1, t2, subscription, pendingEvents, addState;
+      if ((this._state & 3) !== 0)
+        throw H.wrapException(P.StateError$("Stream has already been listened to."));
+      t1 = $.Zone__current;
+      t2 = cancelOnError ? 1 : 0;
+      subscription = H.setRuntimeTypeInfo(new P._ControllerSubscription(this, null, null, null, t1, t2, null, null), [null]);
+      pendingEvents = this.get$_pendingEvents();
+      t2 = this._state |= 1;
+      if ((t2 & 8) !== 0) {
+        addState = this._varData;
+        addState.set$varData(subscription);
+        addState.resume$0(0);
+      } else
+        this._varData = subscription;
+      subscription._setPendingEvents$1(pendingEvents);
+      subscription._guardCallback$1(new P._StreamController__subscribe_closure(this));
+      return subscription;
+    },
+    _recordCancel$1: function(subscription) {
+      var result, e, s, exception, t1, result0;
+      result = null;
+      if ((this._state & 8) !== 0)
+        result = this._varData.cancel$0();
+      this._varData = null;
+      this._state = this._state & 4294967286 | 2;
+      if (this.get$_onCancel() != null)
+        if (result == null)
+          try {
+            result = this._onCancel$0();
+          } catch (exception) {
+            t1 = H.unwrapException(exception);
+            e = t1;
+            s = new H._StackTrace(exception, null);
+            result0 = P._Future$(null);
+            result0._asyncCompleteError$2(e, s);
+            result = result0;
+          }
+
+        else
+          result = result.whenComplete$1(this.get$_onCancel());
+      t1 = new P._StreamController__recordCancel_complete(this);
+      if (result != null)
+        result = result.whenComplete$1(t1);
+      else
+        t1.call$0();
+      return result;
+    },
+    _recordPause$1: function(subscription) {
+      if ((this._state & 8) !== 0)
+        this._varData.pause$0(0);
+      P._runGuarded(this.get$_onPause());
+    },
+    _recordResume$1: function(subscription) {
+      if ((this._state & 8) !== 0)
+        this._varData.resume$0(0);
+      P._runGuarded(this.get$_onResume());
+    }
+  },
+  _StreamController__subscribe_closure: {
+    "^": "Closure:69;this_0",
+    call$0: function() {
+      P._runGuarded(this.this_0.get$_onListen());
+    },
+    $isFunction: true
+  },
+  _StreamController__recordCancel_complete: {
+    "^": "Closure:18;this_0",
+    call$0: [function() {
+      var t1 = this.this_0._doneFuture;
+      if (t1 != null && t1._state === 0)
+        t1._asyncComplete$1(null);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _SyncStreamControllerDispatch: {
+    "^": "Object;",
+    _sendData$1: function(data) {
+      this.get$_subscription()._async$_add$1(0, data);
+    },
+    _sendError$2: function(error, stackTrace) {
+      this.get$_subscription()._addError$2(error, stackTrace);
+    },
+    _sendDone$0: function() {
+      this.get$_subscription()._close$0();
+    }
+  },
+  _AsyncStreamControllerDispatch: {
+    "^": "Object;",
+    _sendData$1: function(data) {
+      this.get$_subscription()._addPending$1(H.setRuntimeTypeInfo(new P._DelayedData(data, null), [null]));
+    },
+    _sendError$2: function(error, stackTrace) {
+      this.get$_subscription()._addPending$1(new P._DelayedError(error, stackTrace, null));
+    },
+    _sendDone$0: function() {
+      this.get$_subscription()._addPending$1(C.C__DelayedDone);
+    }
+  },
+  _AsyncStreamController: {
+    "^": "_StreamController__AsyncStreamControllerDispatch;_onListen<,_onPause<,_onResume<,_onCancel<,_varData,_state,_doneFuture",
+    _onCancel$0: function() {
+      return this._onCancel.call$0();
+    }
+  },
+  _StreamController__AsyncStreamControllerDispatch: {
+    "^": "_StreamController+_AsyncStreamControllerDispatch;"
+  },
+  _SyncStreamController: {
+    "^": "_StreamController__SyncStreamControllerDispatch;_onListen<,_onPause<,_onResume<,_onCancel<,_varData,_state,_doneFuture",
+    _onCancel$0: function() {
+      return this._onCancel.call$0();
+    }
+  },
+  _StreamController__SyncStreamControllerDispatch: {
+    "^": "_StreamController+_SyncStreamControllerDispatch;"
+  },
+  _ControllerStream: {
+    "^": "_StreamImpl;_async$_controller",
+    _createSubscription$1: function(cancelOnError) {
+      return this._async$_controller._subscribe$1(cancelOnError);
+    },
+    get$hashCode: function(_) {
+      return (H.Primitives_objectHashCode(this._async$_controller) ^ 892482866) >>> 0;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!J.getInterceptor(other).$is_ControllerStream)
+        return false;
+      return other._async$_controller === this._async$_controller;
+    },
+    $is_ControllerStream: true
+  },
+  _ControllerSubscription: {
+    "^": "_BufferingStreamSubscription;_async$_controller<,_onData,_onError,_onDone,_zone,_state,_cancelFuture,_pending",
+    _onCancel$0: function() {
+      return this.get$_async$_controller()._recordCancel$1(this);
+    },
+    _onPause$0: [function() {
+      this.get$_async$_controller()._recordPause$1(this);
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+      this.get$_async$_controller()._recordResume$1(this);
+    }, "call$0", "get$_onResume", 0, 0, 18]
+  },
+  _EventSink: {
+    "^": "Object;"
+  },
+  _BufferingStreamSubscription: {
+    "^": "Object;_onData,_onError<,_onDone,_zone<,_state,_cancelFuture,_pending",
+    _setPendingEvents$1: function(pendingEvents) {
+      if (pendingEvents == null)
+        return;
+      this._pending = pendingEvents;
+      if (!pendingEvents.get$isEmpty(pendingEvents)) {
+        this._state = (this._state | 64) >>> 0;
+        this._pending.schedule$1(this);
+      }
+    },
+    onData$1: function(handleData) {
+      this._onData = this._zone.registerUnaryCallback$1(handleData);
+    },
+    onError$1: function(_, handleError) {
+      if (handleError == null)
+        handleError = P._nullErrorHandler$closure();
+      this._onError = P._registerErrorHandler(handleError, this._zone);
+    },
+    onDone$1: function(handleDone) {
+      if (handleDone == null)
+        handleDone = P._nullDoneHandler$closure();
+      this._onDone = this._zone.registerCallback$1(handleDone);
+    },
+    pause$1: [function(_, resumeSignal) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      this._state = (t1 + 128 | 4) >>> 0;
+      if (resumeSignal != null)
+        resumeSignal.whenComplete$1(this.get$resume(this));
+      if (t1 < 128 && this._pending != null)
+        this._pending.cancelSchedule$0();
+      if ((t1 & 4) === 0 && (this._state & 32) === 0)
+        this._guardCallback$1(this.get$_onPause());
+    }, function($receiver) {
+      return this.pause$1($receiver, null);
+    }, "pause$0", "call$1", "call$0", "get$pause", 0, 2, 116, 23, 117],
+    resume$0: [function(_) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 >= 128) {
+        t1 -= 128;
+        this._state = t1;
+        if (t1 < 128) {
+          if ((t1 & 64) !== 0) {
+            t1 = this._pending;
+            t1 = !t1.get$isEmpty(t1);
+          } else
+            t1 = false;
+          if (t1)
+            this._pending.schedule$1(this);
+          else {
+            t1 = (this._state & 4294967291) >>> 0;
+            this._state = t1;
+            if ((t1 & 32) === 0)
+              this._guardCallback$1(this.get$_onResume());
+          }
+        }
+      }
+    }, "call$0", "get$resume", 0, 0, 18],
+    cancel$0: function() {
+      var t1 = (this._state & 4294967279) >>> 0;
+      this._state = t1;
+      if ((t1 & 8) !== 0)
+        return this._cancelFuture;
+      this._cancel$0();
+      return this._cancelFuture;
+    },
+    get$_isInputPaused: function() {
+      return (this._state & 4) !== 0;
+    },
+    get$isPaused: function() {
+      return this._state >= 128;
+    },
+    _cancel$0: function() {
+      var t1 = (this._state | 8) >>> 0;
+      this._state = t1;
+      if ((t1 & 64) !== 0)
+        this._pending.cancelSchedule$0();
+      if ((this._state & 32) === 0)
+        this._pending = null;
+      this._cancelFuture = this._onCancel$0();
+    },
+    _async$_add$1: function(_, data) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 < 32)
+        this._sendData$1(data);
+      else
+        this._addPending$1(H.setRuntimeTypeInfo(new P._DelayedData(data, null), [null]));
+    },
+    _addError$2: function(error, stackTrace) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 < 32)
+        this._sendError$2(error, stackTrace);
+      else
+        this._addPending$1(new P._DelayedError(error, stackTrace, null));
+    },
+    _close$0: function() {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      t1 = (t1 | 2) >>> 0;
+      this._state = t1;
+      if (t1 < 32)
+        this._sendDone$0();
+      else
+        this._addPending$1(C.C__DelayedDone);
+    },
+    _onPause$0: [function() {
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+    }, "call$0", "get$_onResume", 0, 0, 18],
+    _onCancel$0: function() {
+    },
+    _addPending$1: function($event) {
+      var pending, t1;
+      pending = this._pending;
+      if (pending == null) {
+        pending = new P._StreamImplEvents(null, null, 0);
+        this._pending = pending;
+      }
+      pending.add$1(0, $event);
+      t1 = this._state;
+      if ((t1 & 64) === 0) {
+        t1 = (t1 | 64) >>> 0;
+        this._state = t1;
+        if (t1 < 128)
+          this._pending.schedule$1(this);
+      }
+    },
+    _sendData$1: function(data) {
+      var t1 = this._state;
+      this._state = (t1 | 32) >>> 0;
+      this._zone.runUnaryGuarded$2(this._onData, data);
+      this._state = (this._state & 4294967263) >>> 0;
+      this._checkState$1((t1 & 4) !== 0);
+    },
+    _sendError$2: function(error, stackTrace) {
+      var t1, t2;
+      t1 = this._state;
+      t2 = new P._BufferingStreamSubscription__sendError_sendError(this, error, stackTrace);
+      if ((t1 & 1) !== 0) {
+        this._state = (t1 | 16) >>> 0;
+        this._cancel$0();
+        t1 = this._cancelFuture;
+        if (!!J.getInterceptor(t1).$isFuture)
+          t1.whenComplete$1(t2);
+        else
+          t2.call$0();
+      } else {
+        t2.call$0();
+        this._checkState$1((t1 & 4) !== 0);
+      }
+    },
+    _sendDone$0: function() {
+      var t1, t2;
+      t1 = new P._BufferingStreamSubscription__sendDone_sendDone(this);
+      this._cancel$0();
+      this._state = (this._state | 16) >>> 0;
+      t2 = this._cancelFuture;
+      if (!!J.getInterceptor(t2).$isFuture)
+        t2.whenComplete$1(t1);
+      else
+        t1.call$0();
+    },
+    _guardCallback$1: function(callback) {
+      var t1 = this._state;
+      this._state = (t1 | 32) >>> 0;
+      callback.call$0();
+      this._state = (this._state & 4294967263) >>> 0;
+      this._checkState$1((t1 & 4) !== 0);
+    },
+    _checkState$1: function(wasInputPaused) {
+      var t1, isInputPaused;
+      if ((this._state & 64) !== 0) {
+        t1 = this._pending;
+        t1 = t1.get$isEmpty(t1);
+      } else
+        t1 = false;
+      if (t1) {
+        t1 = (this._state & 4294967231) >>> 0;
+        this._state = t1;
+        if ((t1 & 4) !== 0)
+          if (t1 < 128) {
+            t1 = this._pending;
+            t1 = t1 == null || t1.get$isEmpty(t1);
+          } else
+            t1 = false;
+        else
+          t1 = false;
+        if (t1)
+          this._state = (this._state & 4294967291) >>> 0;
+      }
+      for (; true; wasInputPaused = isInputPaused) {
+        t1 = this._state;
+        if ((t1 & 8) !== 0) {
+          this._pending = null;
+          return;
+        }
+        isInputPaused = (t1 & 4) !== 0;
+        if (wasInputPaused === isInputPaused)
+          break;
+        this._state = (t1 ^ 32) >>> 0;
+        if (isInputPaused)
+          this._onPause$0();
+        else
+          this._onResume$0();
+        this._state = (this._state & 4294967263) >>> 0;
+      }
+      t1 = this._state;
+      if ((t1 & 64) !== 0 && t1 < 128)
+        this._pending.schedule$1(this);
+    },
+    $isStreamSubscription: true,
+    static: {"^": "_BufferingStreamSubscription__STATE_CANCEL_ON_ERROR,_BufferingStreamSubscription__STATE_CLOSED,_BufferingStreamSubscription__STATE_INPUT_PAUSED,_BufferingStreamSubscription__STATE_CANCELED,_BufferingStreamSubscription__STATE_WAIT_FOR_CANCEL,_BufferingStreamSubscription__STATE_IN_CALLBACK,_BufferingStreamSubscription__STATE_HAS_PENDING,_BufferingStreamSubscription__STATE_PAUSE_COUNT,_BufferingStreamSubscription__STATE_PAUSE_COUNT_SHIFT"}
+  },
+  _BufferingStreamSubscription__sendError_sendError: {
+    "^": "Closure:18;this_0,error_1,stackTrace_2",
+    call$0: [function() {
+      var t1, t2, t3, t4, t5, t6;
+      t1 = this.this_0;
+      t2 = t1._state;
+      if ((t2 & 8) !== 0 && (t2 & 16) === 0)
+        return;
+      t1._state = (t2 | 32) >>> 0;
+      t2 = t1._zone;
+      if (!t2.inSameErrorZone$1($.Zone__current))
+        $.Zone__current.handleUncaughtError$2(this.error_1, this.stackTrace_2);
+      else {
+        t3 = t1._onError;
+        t4 = H.getDynamicRuntimeType();
+        t4 = H.buildFunctionType(t4, [t4, t4])._isTest$1(t3);
+        t5 = t1._onError;
+        t6 = this.error_1;
+        if (t4)
+          t2.runBinaryGuarded$3(t5, t6, this.stackTrace_2);
+        else
+          t2.runUnaryGuarded$2(t5, t6);
+      }
+      t1._state = (t1._state & 4294967263) >>> 0;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BufferingStreamSubscription__sendDone_sendDone: {
+    "^": "Closure:18;this_0",
+    call$0: [function() {
+      var t1, t2;
+      t1 = this.this_0;
+      t2 = t1._state;
+      if ((t2 & 16) === 0)
+        return;
+      t1._state = (t2 | 42) >>> 0;
+      t1._zone.runGuarded$1(t1._onDone);
+      t1._state = (t1._state & 4294967263) >>> 0;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _StreamImpl: {
+    "^": "Stream;",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var subscription = this._createSubscription$1(true === cancelOnError);
+      subscription.onData$1(onData);
+      subscription.onError$1(0, onError);
+      subscription.onDone$1(onDone);
+      return subscription;
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    _createSubscription$1: function(cancelOnError) {
+      var t1, t2;
+      t1 = $.Zone__current;
+      t2 = cancelOnError ? 1 : 0;
+      t2 = new P._BufferingStreamSubscription(null, null, null, t1, t2, null, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    }
+  },
+  _DelayedEvent: {
+    "^": "Object;next@"
+  },
+  _DelayedData: {
+    "^": "_DelayedEvent;value>,next",
+    perform$1: function(dispatch) {
+      dispatch._sendData$1(this.value);
+    }
+  },
+  _DelayedError: {
+    "^": "_DelayedEvent;error>,stackTrace<,next",
+    perform$1: function(dispatch) {
+      dispatch._sendError$2(this.error, this.stackTrace);
+    }
+  },
+  _DelayedDone: {
+    "^": "Object;",
+    perform$1: function(dispatch) {
+      dispatch._sendDone$0();
+    },
+    get$next: function() {
+      return;
+    },
+    set$next: function(_) {
+      throw H.wrapException(P.StateError$("No events after a done."));
+    }
+  },
+  _PendingEvents: {
+    "^": "Object;",
+    schedule$1: function(dispatch) {
+      var t1 = this._state;
+      if (t1 === 1)
+        return;
+      if (t1 >= 1) {
+        this._state = 1;
+        return;
+      }
+      P.scheduleMicrotask(new P._PendingEvents_schedule_closure(this, dispatch));
+      this._state = 1;
+    },
+    cancelSchedule$0: function() {
+      if (this._state === 1)
+        this._state = 3;
+    }
+  },
+  _PendingEvents_schedule_closure: {
+    "^": "Closure:69;this_0,dispatch_1",
+    call$0: [function() {
+      var t1, oldState;
+      t1 = this.this_0;
+      oldState = t1._state;
+      t1._state = 0;
+      if (oldState === 3)
+        return;
+      t1.handleNext$1(this.dispatch_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _StreamImplEvents: {
+    "^": "_PendingEvents;firstPendingEvent,lastPendingEvent,_state",
+    get$isEmpty: function(_) {
+      return this.lastPendingEvent == null;
+    },
+    add$1: function(_, $event) {
+      var t1 = this.lastPendingEvent;
+      if (t1 == null) {
+        this.lastPendingEvent = $event;
+        this.firstPendingEvent = $event;
+      } else {
+        t1.set$next($event);
+        this.lastPendingEvent = $event;
+      }
+    },
+    handleNext$1: function(dispatch) {
+      var $event, t1;
+      $event = this.firstPendingEvent;
+      t1 = $event.get$next();
+      this.firstPendingEvent = t1;
+      if (t1 == null)
+        this.lastPendingEvent = null;
+      $event.perform$1(dispatch);
+    },
+    clear$0: function(_) {
+      if (this._state === 1)
+        this._state = 3;
+      this.lastPendingEvent = null;
+      this.firstPendingEvent = null;
+    }
+  },
+  _DoneStreamSubscription: {
+    "^": "Object;_zone<,_state,_onDone",
+    get$isPaused: function() {
+      return this._state >= 4;
+    },
+    _schedule$0: function() {
+      if ((this._state & 2) !== 0)
+        return;
+      this._zone.scheduleMicrotask$1(this.get$_sendDone());
+      this._state = (this._state | 2) >>> 0;
+    },
+    onData$1: function(handleData) {
+    },
+    onError$1: function(_, handleError) {
+    },
+    onDone$1: function(handleDone) {
+      this._onDone = handleDone;
+    },
+    pause$1: [function(_, resumeSignal) {
+      this._state += 4;
+      if (resumeSignal != null)
+        resumeSignal.whenComplete$1(this.get$resume(this));
+    }, function($receiver) {
+      return this.pause$1($receiver, null);
+    }, "pause$0", "call$1", "call$0", "get$pause", 0, 2, 116, 23, 117],
+    resume$0: [function(_) {
+      var t1 = this._state;
+      if (t1 >= 4) {
+        t1 -= 4;
+        this._state = t1;
+        if (t1 < 4 && (t1 & 1) === 0)
+          this._schedule$0();
+      }
+    }, "call$0", "get$resume", 0, 0, 18],
+    cancel$0: function() {
+      return;
+    },
+    _sendDone$0: [function() {
+      var t1 = (this._state & 4294967293) >>> 0;
+      this._state = t1;
+      if (t1 >= 4)
+        return;
+      this._state = (t1 | 1) >>> 0;
+      t1 = this._onDone;
+      if (t1 != null)
+        this._zone.runGuarded$1(t1);
+    }, "call$0", "get$_sendDone", 0, 0, 18],
+    $isStreamSubscription: true,
+    static: {"^": "_DoneStreamSubscription__DONE_SENT,_DoneStreamSubscription__SCHEDULED,_DoneStreamSubscription__PAUSED"}
+  },
+  _cancelAndError_closure: {
+    "^": "Closure:69;future_0,error_1,stackTrace_2",
+    call$0: [function() {
+      return this.future_0._completeError$2(this.error_1, this.stackTrace_2);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _cancelAndErrorClosure_closure: {
+    "^": "Closure:118;subscription_0,future_1",
+    call$2: function(error, stackTrace) {
+      return P._cancelAndError(this.subscription_0, this.future_1, error, stackTrace);
+    },
+    $isFunction: true
+  },
+  _cancelAndValue_closure: {
+    "^": "Closure:69;future_0,value_1",
+    call$0: [function() {
+      return this.future_0._complete$1(this.value_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _ForwardingStream: {
+    "^": "Stream;",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var t1, t2, t3, t4, result;
+      cancelOnError = true === cancelOnError;
+      t1 = H.getRuntimeTypeArgument(this, "_ForwardingStream", 0);
+      t2 = H.getRuntimeTypeArgument(this, "_ForwardingStream", 1);
+      t3 = $.Zone__current;
+      t4 = cancelOnError ? 1 : 0;
+      result = H.setRuntimeTypeInfo(new P._ForwardingStreamSubscription(this, null, null, null, null, t3, t4, null, null), [t1, t2]);
+      result._ForwardingStreamSubscription$2(this, cancelOnError, t1, t2);
+      result.onData$1(onData);
+      result.onError$1(0, onError);
+      result.onDone$1(onDone);
+      return result;
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    _handleData$2: function(data, sink) {
+      sink._async$_add$1(0, data);
+    },
+    $asStream: function($S, $T) {
+      return [$T];
+    }
+  },
+  _ForwardingStreamSubscription: {
+    "^": "_BufferingStreamSubscription;_stream,_subscription,_onData,_onError,_onDone,_zone,_state,_cancelFuture,_pending",
+    _async$_add$1: function(_, data) {
+      if ((this._state & 2) !== 0)
+        return;
+      P._BufferingStreamSubscription.prototype._async$_add$1.call(this, this, data);
+    },
+    _addError$2: function(error, stackTrace) {
+      if ((this._state & 2) !== 0)
+        return;
+      P._BufferingStreamSubscription.prototype._addError$2.call(this, error, stackTrace);
+    },
+    _onPause$0: [function() {
+      var t1 = this._subscription;
+      if (t1 == null)
+        return;
+      t1.pause$0(0);
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+      var t1 = this._subscription;
+      if (t1 == null)
+        return;
+      t1.resume$0(0);
+    }, "call$0", "get$_onResume", 0, 0, 18],
+    _onCancel$0: function() {
+      var t1 = this._subscription;
+      if (t1 != null) {
+        this._subscription = null;
+        t1.cancel$0();
+      }
+      return;
+    },
+    _handleData$1: [function(data) {
+      this._stream._handleData$2(data, this);
+    }, "call$1", "get$_handleData", 2, 0, function() {
+      return H.computeSignature(function(S, T) {
+        return {func: "void__S", void: true, args: [S]};
+      }, this.$receiver, "_ForwardingStreamSubscription");
+    }, 104],
+    _handleError$2: [function(error, stackTrace) {
+      this._addError$2(error, stackTrace);
+    }, "call$2", "get$_handleError", 4, 0, 119, 24, 25],
+    _handleDone$0: [function() {
+      this._close$0();
+    }, "call$0", "get$_handleDone", 0, 0, 18],
+    _ForwardingStreamSubscription$2: function(_stream, cancelOnError, $S, $T) {
+      var t1, t2;
+      t1 = this.get$_handleData();
+      t2 = this.get$_handleError();
+      this._subscription = this._stream._async$_source.listen$3$onDone$onError(t1, this.get$_handleDone(), t2);
+    },
+    $as_BufferingStreamSubscription: function($S, $T) {
+      return [$T];
+    },
+    $asStreamSubscription: function($S, $T) {
+      return [$T];
+    }
+  },
+  _WhereStream: {
+    "^": "_ForwardingStream;_test,_async$_source",
+    _test$1: function(arg0) {
+      return this._test.call$1(arg0);
+    },
+    _handleData$2: function(inputEvent, sink) {
+      var satisfies, e, s, exception, t1;
+      satisfies = null;
+      try {
+        satisfies = this._test$1(inputEvent);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        sink._addError$2(e, s);
+        return;
+      }
+
+      if (satisfies === true)
+        J._async$_add$1$x(sink, inputEvent);
+    },
+    $as_ForwardingStream: function($T) {
+      return [$T, $T];
+    },
+    $asStream: null
+  },
+  _MapStream: {
+    "^": "_ForwardingStream;_transform,_async$_source",
+    _transform$1: function(arg0) {
+      return this._transform.call$1(arg0);
+    },
+    _handleData$2: function(inputEvent, sink) {
+      var outputEvent, e, s, exception, t1;
+      outputEvent = null;
+      try {
+        outputEvent = this._transform$1(inputEvent);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        sink._addError$2(e, s);
+        return;
+      }
+
+      J._async$_add$1$x(sink, outputEvent);
+    }
+  },
+  _ExpandStream: {
+    "^": "_ForwardingStream;_expand,_async$_source",
+    _expand$1: function(arg0) {
+      return this._expand.call$1(arg0);
+    },
+    _handleData$2: function(inputEvent, sink) {
+      var value, e, s, t1, exception;
+      try {
+        for (t1 = J.get$iterator$ax(this._expand$1(inputEvent)); t1.moveNext$0();) {
+          value = t1.get$current();
+          J._async$_add$1$x(sink, value);
+        }
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        sink._addError$2(e, s);
+      }
+
+    }
+  },
+  Timer: {
+    "^": "Object;"
+  },
+  ZoneSpecification: {
+    "^": "Object;"
+  },
+  _ZoneSpecification: {
+    "^": "Object;handleUncaughtError<,run<,runUnary<,runBinary<,registerCallback<,registerUnaryCallback<,registerBinaryCallback<,scheduleMicrotask<,createTimer<,createPeriodicTimer,print>,fork<",
+    handleUncaughtError$2: function(arg0, arg1) {
+      return this.handleUncaughtError.call$2(arg0, arg1);
+    },
+    run$1: function(arg0) {
+      return this.run.call$1(arg0);
+    },
+    runUnary$2: function(arg0, arg1) {
+      return this.runUnary.call$2(arg0, arg1);
+    },
+    runBinary$3: function(arg0, arg1, arg2) {
+      return this.runBinary.call$3(arg0, arg1, arg2);
+    },
+    registerCallback$1: function(arg0) {
+      return this.registerCallback.call$1(arg0);
+    },
+    registerUnaryCallback$1: function(arg0) {
+      return this.registerUnaryCallback.call$1(arg0);
+    },
+    registerBinaryCallback$1: function(arg0) {
+      return this.registerBinaryCallback.call$1(arg0);
+    },
+    scheduleMicrotask$1: function(arg0) {
+      return this.scheduleMicrotask.call$1(arg0);
+    },
+    scheduleMicrotask$2: function(arg0, arg1) {
+      return this.scheduleMicrotask.call$2(arg0, arg1);
+    },
+    createTimer$2: function(arg0, arg1) {
+      return this.createTimer.call$2(arg0, arg1);
+    },
+    print$1: function($receiver, arg0) {
+      return this.print.call$1(arg0);
+    },
+    fork$1$specification: function(arg0) {
+      return this.fork.call$1$specification(arg0);
+    }
+  },
+  ZoneDelegate: {
+    "^": "Object;"
+  },
+  Zone: {
+    "^": "Object;"
+  },
+  _ZoneDelegate: {
+    "^": "Object;_degelationTarget",
+    get$_zone: function() {
+      return this._degelationTarget;
+    },
+    handleUncaughtError$3: function(zone, error, stackTrace) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$handleUncaughtError() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$handleUncaughtError().call$5($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, error, stackTrace);
+    },
+    run$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$run() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$run().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    runUnary$3: function(zone, f, arg) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$runUnary() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$runUnary().call$5($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f, arg);
+    },
+    runBinary$4: function(zone, f, arg1, arg2) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$runBinary() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$runBinary().call$6($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f, arg1, arg2);
+    },
+    registerCallback$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$registerCallback() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$registerCallback().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    registerUnaryCallback$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$registerUnaryCallback() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$registerUnaryCallback().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    registerBinaryCallback$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$registerBinaryCallback() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$registerBinaryCallback().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    scheduleMicrotask$2: function(zone, f) {
+      var $parent, t1;
+      $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$scheduleMicrotask() == null;)
+        $parent = $parent.get$parent($parent);
+      t1 = $parent.get$parent($parent);
+      $parent.get$_specification().get$scheduleMicrotask().call$4($parent, new P._ZoneDelegate(t1), zone, f);
+    },
+    createTimer$3: function(zone, duration, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$createTimer() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$createTimer().call$5($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, duration, f);
+    },
+    print$2: function(_, zone, line) {
+      var $parent, t1;
+      $parent = this._degelationTarget;
+      for (; t1 = $parent.get$_specification(), t1.get$print(t1) == null;)
+        $parent = $parent.get$parent($parent);
+      t1 = $parent.get$_specification();
+      t1.get$print(t1).call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, line);
+    },
+    fork$3: function(zone, specification, zoneValues) {
+      var $parent, t1;
+      $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$fork() == null;)
+        $parent = $parent.get$parent($parent);
+      t1 = $parent.get$parent($parent);
+      return $parent.get$_specification().get$fork().call$5($parent, new P._ZoneDelegate(t1), zone, specification, zoneValues);
+    }
+  },
+  _BaseZone: {
+    "^": "Object;",
+    inSameErrorZone$1: function(otherZone) {
+      return this.get$_errorZone() === otherZone.get$_errorZone();
+    },
+    runGuarded$1: function(f) {
+      var e, s, t1, exception;
+      try {
+        t1 = this.run$1(f);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        return this.handleUncaughtError$2(e, s);
+      }
+
+    },
+    runUnaryGuarded$2: function(f, arg) {
+      var e, s, t1, exception;
+      try {
+        t1 = this.runUnary$2(f, arg);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        return this.handleUncaughtError$2(e, s);
+      }
+
+    },
+    runBinaryGuarded$3: function(f, arg1, arg2) {
+      var e, s, t1, exception;
+      try {
+        t1 = this.runBinary$3(f, arg1, arg2);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        return this.handleUncaughtError$2(e, s);
+      }
+
+    },
+    bindCallback$2$runGuarded: function(f, runGuarded) {
+      var registered = this.registerCallback$1(f);
+      if (runGuarded)
+        return new P._BaseZone_bindCallback_closure(this, registered);
+      else
+        return new P._BaseZone_bindCallback_closure0(this, registered);
+    },
+    bindCallback$1: function(f) {
+      return this.bindCallback$2$runGuarded(f, true);
+    },
+    bindUnaryCallback$2$runGuarded: function(f, runGuarded) {
+      var registered = this.registerUnaryCallback$1(f);
+      if (runGuarded)
+        return new P._BaseZone_bindUnaryCallback_closure(this, registered);
+      else
+        return new P._BaseZone_bindUnaryCallback_closure0(this, registered);
+    },
+    bindBinaryCallback$2$runGuarded: function(f, runGuarded) {
+      var registered = this.registerBinaryCallback$1(f);
+      if (runGuarded)
+        return new P._BaseZone_bindBinaryCallback_closure(this, registered);
+      else
+        return new P._BaseZone_bindBinaryCallback_closure0(this, registered);
+    }
+  },
+  _BaseZone_bindCallback_closure: {
+    "^": "Closure:69;this_0,registered_1",
+    call$0: [function() {
+      return this.this_0.runGuarded$1(this.registered_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindCallback_closure0: {
+    "^": "Closure:69;this_2,registered_3",
+    call$0: [function() {
+      return this.this_2.run$1(this.registered_3);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindUnaryCallback_closure: {
+    "^": "Closure:13;this_0,registered_1",
+    call$1: [function(arg) {
+      return this.this_0.runUnaryGuarded$2(this.registered_1, arg);
+    }, "call$1", null, 2, 0, null, 33, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindUnaryCallback_closure0: {
+    "^": "Closure:13;this_2,registered_3",
+    call$1: [function(arg) {
+      return this.this_2.runUnary$2(this.registered_3, arg);
+    }, "call$1", null, 2, 0, null, 33, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindBinaryCallback_closure: {
+    "^": "Closure:75;this_0,registered_1",
+    call$2: [function(arg1, arg2) {
+      return this.this_0.runBinaryGuarded$3(this.registered_1, arg1, arg2);
+    }, "call$2", null, 4, 0, null, 9, 10, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindBinaryCallback_closure0: {
+    "^": "Closure:75;this_2,registered_3",
+    call$2: [function(arg1, arg2) {
+      return this.this_2.runBinary$3(this.registered_3, arg1, arg2);
+    }, "call$2", null, 4, 0, null, 9, 10, "call"],
+    $isFunction: true
+  },
+  _CustomizedZone: {
+    "^": "_BaseZone;parent>,_specification<,_async$_map",
+    get$_errorZone: function() {
+      return this.parent.get$_errorZone();
+    },
+    $index: function(_, key) {
+      var t1, result;
+      t1 = this._async$_map;
+      result = t1.$index(0, key);
+      if (result != null || t1.containsKey$1(key))
+        return result;
+      return this.parent.$index(0, key);
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      return new P._ZoneDelegate(this).handleUncaughtError$3(this, error, stackTrace);
+    },
+    fork$2$specification$zoneValues: function(specification, zoneValues) {
+      return new P._ZoneDelegate(this).fork$3(this, specification, zoneValues);
+    },
+    fork$1$specification: function(specification) {
+      return this.fork$2$specification$zoneValues(specification, null);
+    },
+    run$1: function(f) {
+      return new P._ZoneDelegate(this).run$2(this, f);
+    },
+    runUnary$2: function(f, arg) {
+      return new P._ZoneDelegate(this).runUnary$3(this, f, arg);
+    },
+    runBinary$3: function(f, arg1, arg2) {
+      return new P._ZoneDelegate(this).runBinary$4(this, f, arg1, arg2);
+    },
+    registerCallback$1: function(f) {
+      return new P._ZoneDelegate(this).registerCallback$2(this, f);
+    },
+    registerUnaryCallback$1: function(f) {
+      return new P._ZoneDelegate(this).registerUnaryCallback$2(this, f);
+    },
+    registerBinaryCallback$1: function(f) {
+      return new P._ZoneDelegate(this).registerBinaryCallback$2(this, f);
+    },
+    scheduleMicrotask$1: function(f) {
+      new P._ZoneDelegate(this).scheduleMicrotask$2(this, f);
+    },
+    createTimer$2: function(duration, f) {
+      return new P._ZoneDelegate(this).createTimer$3(this, duration, f);
+    },
+    print$1: function(_, line) {
+      new P._ZoneDelegate(this).print$2(0, this, line);
+    }
+  },
+  _rootHandleUncaughtError_closure: {
+    "^": "Closure:69;error_0,stackTrace_1",
+    call$0: [function() {
+      P._scheduleAsyncCallback(new P._rootHandleUncaughtError__closure(this.error_0, this.stackTrace_1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _rootHandleUncaughtError__closure: {
+    "^": "Closure:69;error_2,stackTrace_3",
+    call$0: [function() {
+      var t1, trace;
+      t1 = this.error_2;
+      P.print("Uncaught Error: " + H.S(t1));
+      trace = this.stackTrace_3;
+      if (trace == null && !!J.getInterceptor(t1).$isError)
+        trace = t1.get$stackTrace();
+      if (trace != null)
+        P.print("Stack Trace: \n" + H.S(trace) + "\n");
+      throw H.wrapException(t1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _rootFork_closure: {
+    "^": "Closure:75;copiedMap_0",
+    call$2: [function(key, value) {
+      this.copiedMap_0.$indexSet(0, key, value);
+    }, "call$2", null, 4, 0, null, 76, 21, "call"],
+    $isFunction: true
+  },
+  _RootZoneSpecification: {
+    "^": "Object;",
+    get$handleUncaughtError: function() {
+      return P._rootHandleUncaughtError$closure();
+    },
+    handleUncaughtError$2: function(arg0, arg1) {
+      return this.get$handleUncaughtError().call$2(arg0, arg1);
+    },
+    get$run: function() {
+      return P._rootRun$closure();
+    },
+    run$1: function(arg0) {
+      return this.get$run().call$1(arg0);
+    },
+    get$runUnary: function() {
+      return P._rootRunUnary$closure();
+    },
+    runUnary$2: function(arg0, arg1) {
+      return this.get$runUnary().call$2(arg0, arg1);
+    },
+    get$runBinary: function() {
+      return P._rootRunBinary$closure();
+    },
+    runBinary$3: function(arg0, arg1, arg2) {
+      return this.get$runBinary().call$3(arg0, arg1, arg2);
+    },
+    get$registerCallback: function() {
+      return P._rootRegisterCallback$closure();
+    },
+    registerCallback$1: function(arg0) {
+      return this.get$registerCallback().call$1(arg0);
+    },
+    get$registerUnaryCallback: function() {
+      return P._rootRegisterUnaryCallback$closure();
+    },
+    registerUnaryCallback$1: function(arg0) {
+      return this.get$registerUnaryCallback().call$1(arg0);
+    },
+    get$registerBinaryCallback: function() {
+      return P._rootRegisterBinaryCallback$closure();
+    },
+    registerBinaryCallback$1: function(arg0) {
+      return this.get$registerBinaryCallback().call$1(arg0);
+    },
+    get$scheduleMicrotask: function() {
+      return P._rootScheduleMicrotask$closure();
+    },
+    scheduleMicrotask$1: function(arg0) {
+      return this.get$scheduleMicrotask().call$1(arg0);
+    },
+    scheduleMicrotask$2: function(arg0, arg1) {
+      return this.get$scheduleMicrotask().call$2(arg0, arg1);
+    },
+    get$createTimer: function() {
+      return P._rootCreateTimer$closure();
+    },
+    createTimer$2: function(arg0, arg1) {
+      return this.get$createTimer().call$2(arg0, arg1);
+    },
+    get$print: function(_) {
+      return P._rootPrint$closure();
+    },
+    print$1: function($receiver, arg0) {
+      return this.get$print(this).call$1(arg0);
+    },
+    get$fork: function() {
+      return P._rootFork$closure();
+    },
+    fork$1$specification: function(arg0) {
+      return this.get$fork().call$1$specification(arg0);
+    }
+  },
+  _RootZone: {
+    "^": "_BaseZone;",
+    get$parent: function(_) {
+      return;
+    },
+    get$_specification: function() {
+      return C.C__RootZoneSpecification;
+    },
+    get$_errorZone: function() {
+      return this;
+    },
+    inSameErrorZone$1: function(otherZone) {
+      return otherZone.get$_errorZone() === this;
+    },
+    $index: function(_, key) {
+      return;
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      return P._rootHandleUncaughtError(this, null, this, error, stackTrace);
+    },
+    fork$2$specification$zoneValues: function(specification, zoneValues) {
+      return P._rootFork(this, null, this, specification, zoneValues);
+    },
+    fork$1$specification: function(specification) {
+      return this.fork$2$specification$zoneValues(specification, null);
+    },
+    run$1: function(f) {
+      return P._rootRun(this, null, this, f);
+    },
+    runUnary$2: function(f, arg) {
+      return P._rootRunUnary(this, null, this, f, arg);
+    },
+    runBinary$3: function(f, arg1, arg2) {
+      return P._rootRunBinary(this, null, this, f, arg1, arg2);
+    },
+    registerCallback$1: function(f) {
+      return f;
+    },
+    registerUnaryCallback$1: function(f) {
+      return f;
+    },
+    registerBinaryCallback$1: function(f) {
+      return f;
+    },
+    scheduleMicrotask$1: function(f) {
+      P._rootScheduleMicrotask(this, null, this, f);
+    },
+    createTimer$2: function(duration, f) {
+      return P._rootCreateTimer(this, null, this, duration, f);
+    },
+    print$1: function(_, line) {
+      H.printString(line);
+      return;
+    }
+  }
+}],
+["dart.collection", "dart:collection", , P, {
+  "^": "",
+  LinkedHashMap_LinkedHashMap$_literal: function(keyValuePairs, $K, $V) {
+    return H.fillLiteralMap(keyValuePairs, H.setRuntimeTypeInfo(new P._LinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]));
+  },
+  LinkedHashMap_LinkedHashMap$_empty: function($K, $V) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]);
+  },
+  _defaultEquals: [function(a, b) {
+    return J.$eq(a, b);
+  }, "call$2", "_defaultEquals$closure", 4, 0, 45, 46, 47],
+  _defaultHashCode: [function(a) {
+    return J.get$hashCode$(a);
+  }, "call$1", "_defaultHashCode$closure", 2, 0, 48, 46],
+  HashMap_HashMap: function(equals, hashCode, isValidKey, $K, $V) {
+    var t1;
+    if (equals == null) {
+      t1 = new P._HashMap(0, null, null, null, null);
+      t1.$builtinTypeInfo = [$K, $V];
+      return t1;
+    }
+    hashCode = P._defaultHashCode$closure();
+    return P._CustomHashMap$(equals, hashCode, isValidKey, $K, $V);
+  },
+  HashMap_HashMap$identity: function($K, $V) {
+    return H.setRuntimeTypeInfo(new P._IdentityHashMap(0, null, null, null, null), [$K, $V]);
+  },
+  HashSet_HashSet: function(equals, hashCode, isValidKey, $E) {
+    return H.setRuntimeTypeInfo(new P._HashSet(0, null, null, null, null), [$E]);
+  },
+  IterableBase_iterableToShortString: function(iterable, leftDelimiter, rightDelimiter) {
+    var parts, t1;
+    if (P.IterableBase__isToStringVisiting(iterable)) {
+      if (leftDelimiter === "(" && rightDelimiter === ")")
+        return "(...)";
+      return leftDelimiter + "..." + rightDelimiter;
+    }
+    parts = [];
+    t1 = $.get$IterableBase__toStringVisiting();
+    t1.push(iterable);
+    try {
+      P.IterableBase__iterablePartsToStrings(iterable, parts);
+    } finally {
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    t1 = P.StringBuffer$(leftDelimiter);
+    t1.writeAll$2(parts, ", ");
+    t1.write$1(rightDelimiter);
+    return t1._contents;
+  },
+  IterableBase_iterableToFullString: function(iterable, leftDelimiter, rightDelimiter) {
+    var buffer, t1;
+    if (P.IterableBase__isToStringVisiting(iterable))
+      return leftDelimiter + "..." + rightDelimiter;
+    buffer = P.StringBuffer$(leftDelimiter);
+    t1 = $.get$IterableBase__toStringVisiting();
+    t1.push(iterable);
+    try {
+      buffer.writeAll$2(iterable, ", ");
+    } finally {
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    buffer.write$1(rightDelimiter);
+    return buffer.get$_contents();
+  },
+  IterableBase__isToStringVisiting: function(o) {
+    var i, t1;
+    for (i = 0; t1 = $.get$IterableBase__toStringVisiting(), i < t1.length; ++i)
+      if (o === t1[i])
+        return true;
+    return false;
+  },
+  IterableBase__iterablePartsToStrings: function(iterable, parts) {
+    var it, $length, count, next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision;
+    it = iterable.get$iterator(iterable);
+    $length = 0;
+    count = 0;
+    while (true) {
+      if (!($length < 80 || count < 3))
+        break;
+      if (!it.moveNext$0())
+        return;
+      next = H.S(it.get$current());
+      parts.push(next);
+      $length += next.length + 2;
+      ++count;
+    }
+    if (!it.moveNext$0()) {
+      if (count <= 5)
+        return;
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      ultimateString = parts.pop();
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      penultimateString = parts.pop();
+    } else {
+      penultimate = it.get$current();
+      ++count;
+      if (!it.moveNext$0()) {
+        if (count <= 4) {
+          parts.push(H.S(penultimate));
+          return;
+        }
+        ultimateString = H.S(penultimate);
+        if (0 >= parts.length)
+          return H.ioore(parts, 0);
+        penultimateString = parts.pop();
+        $length += ultimateString.length + 2;
+      } else {
+        ultimate = it.get$current();
+        ++count;
+        for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
+          ultimate0 = it.get$current();
+          ++count;
+          if (count > 100) {
+            while (true) {
+              if (!($length > 75 && count > 3))
+                break;
+              if (0 >= parts.length)
+                return H.ioore(parts, 0);
+              $length -= parts.pop().length + 2;
+              --count;
+            }
+            parts.push("...");
+            return;
+          }
+        }
+        penultimateString = H.S(penultimate);
+        ultimateString = H.S(ultimate);
+        $length += ultimateString.length + penultimateString.length + 4;
+      }
+    }
+    if (count > parts.length + 2) {
+      $length += 5;
+      elision = "...";
+    } else
+      elision = null;
+    while (true) {
+      if (!($length > 80 && parts.length > 3))
+        break;
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      $length -= parts.pop().length + 2;
+      if (elision == null) {
+        $length += 5;
+        elision = "...";
+      }
+    }
+    if (elision != null)
+      parts.push(elision);
+    parts.push(penultimateString);
+    parts.push(ultimateString);
+  },
+  LinkedHashMap_LinkedHashMap: function(equals, hashCode, isValidKey, $K, $V) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]);
+  },
+  LinkedHashSet_LinkedHashSet: function(equals, hashCode, isValidKey, $E) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashSet(0, null, null, null, null, null, 0), [$E]);
+  },
+  Maps_mapToString: function(m) {
+    var t1, result;
+    t1 = {};
+    if (P.IterableBase__isToStringVisiting(m))
+      return "{...}";
+    result = P.StringBuffer$("");
+    try {
+      $.get$IterableBase__toStringVisiting().push(m);
+      result.write$1("{");
+      t1.first_0 = true;
+      J.forEach$1$ax(m, new P.Maps_mapToString_closure(t1, result));
+      result.write$1("}");
+    } finally {
+      t1 = $.get$IterableBase__toStringVisiting();
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    return result.get$_contents();
+  },
+  _HashMap: {
+    "^": "Object;_collection$_length,_strings,_nums,_rest,_collection$_keys",
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new P.HashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      return H.MappedIterable_MappedIterable(H.setRuntimeTypeInfo(new P.HashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]), new P._HashMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    containsKey$1: function(key) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        return strings == null ? false : strings[key] != null;
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        return nums == null ? false : nums[key] != null;
+      } else
+        return this._containsKey$1(key);
+    },
+    _containsKey$1: function(key) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(key)], key) >= 0;
+    },
+    addAll$1: function(_, other) {
+      H.IterableMixinWorkaround_forEach(other, new P._HashMap_addAll_closure(this));
+    },
+    $index: function(_, key) {
+      var strings, t1, entry, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          t1 = null;
+        else {
+          entry = strings[key];
+          t1 = entry === strings ? null : entry;
+        }
+        return t1;
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          t1 = null;
+        else {
+          entry = nums[key];
+          t1 = entry === nums ? null : entry;
+        }
+        return t1;
+      } else
+        return this._get$1(key);
+    },
+    _get$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      return index < 0 ? null : bucket[index + 1];
+    },
+    $indexSet: function(_, key, value) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          strings = P._HashMap__newHashTable();
+          this._strings = strings;
+        }
+        this._addHashTableEntry$3(strings, key, value);
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null) {
+          nums = P._HashMap__newHashTable();
+          this._nums = nums;
+        }
+        this._addHashTableEntry$3(nums, key, value);
+      } else
+        this._set$2(key, value);
+    },
+    _set$2: function(key, value) {
+      var rest, hash, bucket, index;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._HashMap__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(key);
+      bucket = rest[hash];
+      if (bucket == null) {
+        P._HashMap__setTableEntry(rest, hash, [key, value]);
+        ++this._collection$_length;
+        this._collection$_keys = null;
+      } else {
+        index = this._findBucketIndex$2(bucket, key);
+        if (index >= 0)
+          bucket[index + 1] = value;
+        else {
+          bucket.push(key, value);
+          ++this._collection$_length;
+          this._collection$_keys = null;
+        }
+      }
+    },
+    remove$1: function(_, key) {
+      if (typeof key === "string" && key !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, key);
+      else if (typeof key === "number" && (key & 0x3ffffff) === key)
+        return this._removeHashTableEntry$2(this._nums, key);
+      else
+        return this._remove$1(key);
+    },
+    _remove$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      --this._collection$_length;
+      this._collection$_keys = null;
+      return bucket.splice(index, 2)[1];
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._collection$_keys = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+      }
+    },
+    forEach$1: function(_, action) {
+      var keys, $length, i, key;
+      keys = this._computeKeys$0();
+      for ($length = keys.length, i = 0; i < $length; ++i) {
+        key = keys[i];
+        action.call$2(key, this.$index(0, key));
+        if (keys !== this._collection$_keys)
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+    },
+    _computeKeys$0: function() {
+      var t1, result, strings, names, entries, index, i, nums, rest, bucket, $length, i0;
+      t1 = this._collection$_keys;
+      if (t1 != null)
+        return t1;
+      result = Array(this._collection$_length);
+      result.fixed$length = init;
+      strings = this._strings;
+      if (strings != null) {
+        names = Object.getOwnPropertyNames(strings);
+        entries = names.length;
+        for (index = 0, i = 0; i < entries; ++i) {
+          result[index] = names[i];
+          ++index;
+        }
+      } else
+        index = 0;
+      nums = this._nums;
+      if (nums != null) {
+        names = Object.getOwnPropertyNames(nums);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          result[index] = +names[i];
+          ++index;
+        }
+      }
+      rest = this._rest;
+      if (rest != null) {
+        names = Object.getOwnPropertyNames(rest);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          bucket = rest[names[i]];
+          $length = bucket.length;
+          for (i0 = 0; i0 < $length; i0 += 2) {
+            result[index] = bucket[i0];
+            ++index;
+          }
+        }
+      }
+      this._collection$_keys = result;
+      return result;
+    },
+    _addHashTableEntry$3: function(table, key, value) {
+      if (table[key] == null) {
+        ++this._collection$_length;
+        this._collection$_keys = null;
+      }
+      P._HashMap__setTableEntry(table, key, value);
+    },
+    _removeHashTableEntry$2: function(table, key) {
+      var value;
+      if (table != null && table[key] != null) {
+        value = P._HashMap__getTableEntry(table, key);
+        delete table[key];
+        --this._collection$_length;
+        this._collection$_keys = null;
+        return value;
+      } else
+        return;
+    },
+    _computeHashCode$1: function(key) {
+      return J.get$hashCode$(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2)
+        if (J.$eq(bucket[i], key))
+          return i;
+      return -1;
+    },
+    $isMap: true,
+    static: {_HashMap__getTableEntry: function(table, key) {
+        var entry = table[key];
+        return entry === table ? null : entry;
+      }, _HashMap__setTableEntry: function(table, key, value) {
+        if (value == null)
+          table[key] = table;
+        else
+          table[key] = value;
+      }, _HashMap__newHashTable: function() {
+        var table = Object.create(null);
+        P._HashMap__setTableEntry(table, "<non-identifier-key>", table);
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  _HashMap_values_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(each) {
+      return this.this_0.$index(0, each);
+    }, "call$1", null, 2, 0, null, 120, "call"],
+    $isFunction: true
+  },
+  _HashMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V", args: [K, V]};
+      }, this.this_0, "_HashMap");
+    }
+  },
+  _IdentityHashMap: {
+    "^": "_HashMap;_collection$_length,_strings,_nums,_rest,_collection$_keys",
+    _computeHashCode$1: function(key) {
+      return H.objectHashCode(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i, t1;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2) {
+        t1 = bucket[i];
+        if (t1 == null ? key == null : t1 === key)
+          return i;
+      }
+      return -1;
+    }
+  },
+  _CustomHashMap: {
+    "^": "_HashMap;_equals,_hashCode,_validKey,_collection$_length,_strings,_nums,_rest,_collection$_keys",
+    _equals$2: function(arg0, arg1) {
+      return this._equals.call$2(arg0, arg1);
+    },
+    _hashCode$1: function(arg0) {
+      return this._hashCode.call$1(arg0);
+    },
+    _validKey$1: function(arg0) {
+      return this._validKey.call$1(arg0);
+    },
+    $index: function(_, key) {
+      if (this._validKey$1(key) !== true)
+        return;
+      return P._HashMap.prototype._get$1.call(this, key);
+    },
+    $indexSet: function(_, key, value) {
+      P._HashMap.prototype._set$2.call(this, key, value);
+    },
+    containsKey$1: function(key) {
+      if (this._validKey$1(key) !== true)
+        return false;
+      return P._HashMap.prototype._containsKey$1.call(this, key);
+    },
+    remove$1: function(_, key) {
+      if (this._validKey$1(key) !== true)
+        return;
+      return P._HashMap.prototype._remove$1.call(this, key);
+    },
+    _computeHashCode$1: function(key) {
+      return this._hashCode$1(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2)
+        if (this._equals$2(bucket[i], key) === true)
+          return i;
+      return -1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    static: {_CustomHashMap$: function(_equals, _hashCode, validKey, $K, $V) {
+        var t1 = new P._CustomHashMap_closure($K);
+        return H.setRuntimeTypeInfo(new P._CustomHashMap(_equals, _hashCode, t1, 0, null, null, null, null), [$K, $V]);
+      }}
+  },
+  _CustomHashMap_closure: {
+    "^": "Closure:13;K_0",
+    call$1: function(v) {
+      var t1 = H.checkSubtypeOfRuntimeType(v, this.K_0);
+      return t1;
+    },
+    $isFunction: true
+  },
+  HashMapKeyIterable: {
+    "^": "IterableBase;_map",
+    get$length: function(_) {
+      return this._map._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._map._collection$_length === 0;
+    },
+    get$iterator: function(_) {
+      var t1 = this._map;
+      t1 = new P.HashMapKeyIterator(t1, t1._computeKeys$0(), 0, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    contains$1: function(_, element) {
+      return this._map.containsKey$1(element);
+    },
+    forEach$1: function(_, f) {
+      var t1, keys, $length, i;
+      t1 = this._map;
+      keys = t1._computeKeys$0();
+      for ($length = keys.length, i = 0; i < $length; ++i) {
+        f.call$1(keys[i]);
+        if (keys !== t1._collection$_keys)
+          throw H.wrapException(P.ConcurrentModificationError$(t1));
+      }
+    },
+    $isEfficientLength: true
+  },
+  HashMapKeyIterator: {
+    "^": "Object;_map,_collection$_keys,_offset,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var keys, offset, t1;
+      keys = this._collection$_keys;
+      offset = this._offset;
+      t1 = this._map;
+      if (keys !== t1._collection$_keys)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else if (offset >= keys.length) {
+        this._collection$_current = null;
+        return false;
+      } else {
+        this._collection$_current = keys[offset];
+        this._offset = offset + 1;
+        return true;
+      }
+    }
+  },
+  _LinkedHashMap: {
+    "^": "Object;_collection$_length,_strings,_nums,_rest,_first,_last,_modifications",
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      return H.MappedIterable_MappedIterable(H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]), new P._LinkedHashMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    containsKey$1: function(key) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          return false;
+        return strings[key] != null;
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          return false;
+        return nums[key] != null;
+      } else
+        return this._containsKey$1(key);
+    },
+    _containsKey$1: function(key) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(key)], key) >= 0;
+    },
+    addAll$1: function(_, other) {
+      J.forEach$1$ax(other, new P._LinkedHashMap_addAll_closure(this));
+    },
+    $index: function(_, key) {
+      var strings, cell, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          return;
+        cell = strings[key];
+        return cell == null ? null : cell.get$_value();
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          return;
+        cell = nums[key];
+        return cell == null ? null : cell.get$_value();
+      } else
+        return this._get$1(key);
+    },
+    _get$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      return bucket[index].get$_value();
+    },
+    $indexSet: function(_, key, value) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          strings = P._LinkedHashMap__newHashTable();
+          this._strings = strings;
+        }
+        this._addHashTableEntry$3(strings, key, value);
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null) {
+          nums = P._LinkedHashMap__newHashTable();
+          this._nums = nums;
+        }
+        this._addHashTableEntry$3(nums, key, value);
+      } else
+        this._set$2(key, value);
+    },
+    _set$2: function(key, value) {
+      var rest, hash, bucket, index;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._LinkedHashMap__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(key);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [this._newLinkedCell$2(key, value)];
+      else {
+        index = this._findBucketIndex$2(bucket, key);
+        if (index >= 0)
+          bucket[index].set$_value(value);
+        else
+          bucket.push(this._newLinkedCell$2(key, value));
+      }
+    },
+    putIfAbsent$2: function(key, ifAbsent) {
+      var value;
+      if (this.containsKey$1(key))
+        return this.$index(0, key);
+      value = ifAbsent.call$0();
+      this.$indexSet(0, key, value);
+      return value;
+    },
+    remove$1: function(_, key) {
+      if (typeof key === "string" && key !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, key);
+      else if (typeof key === "number" && (key & 0x3ffffff) === key)
+        return this._removeHashTableEntry$2(this._nums, key);
+      else
+        return this._remove$1(key);
+    },
+    _remove$1: function(key) {
+      var rest, bucket, index, cell;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      cell = bucket.splice(index, 1)[0];
+      this._unlinkCell$1(cell);
+      return cell.get$_value();
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._last = null;
+        this._first = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+        this._modifications = this._modifications + 1 & 67108863;
+      }
+    },
+    forEach$1: function(_, action) {
+      var cell, modifications;
+      cell = this._first;
+      modifications = this._modifications;
+      for (; cell != null;) {
+        action.call$2(cell.get$_key(), cell.get$_value());
+        if (modifications !== this._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+        cell = cell.get$_next();
+      }
+    },
+    _addHashTableEntry$3: function(table, key, value) {
+      var cell = table[key];
+      if (cell == null)
+        table[key] = this._newLinkedCell$2(key, value);
+      else
+        cell.set$_value(value);
+    },
+    _removeHashTableEntry$2: function(table, key) {
+      var cell;
+      if (table == null)
+        return;
+      cell = table[key];
+      if (cell == null)
+        return;
+      this._unlinkCell$1(cell);
+      delete table[key];
+      return cell.get$_value();
+    },
+    _newLinkedCell$2: function(key, value) {
+      var cell, last;
+      cell = new P.LinkedHashMapCell(key, value, null, null);
+      if (this._first == null) {
+        this._last = cell;
+        this._first = cell;
+      } else {
+        last = this._last;
+        cell._previous = last;
+        last.set$_next(cell);
+        this._last = cell;
+      }
+      ++this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+      return cell;
+    },
+    _unlinkCell$1: function(cell) {
+      var previous, next;
+      previous = cell.get$_previous();
+      next = cell.get$_next();
+      if (previous == null)
+        this._first = next;
+      else
+        previous.set$_next(next);
+      if (next == null)
+        this._last = previous;
+      else
+        next.set$_previous(previous);
+      --this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+    },
+    _computeHashCode$1: function(key) {
+      return J.get$hashCode$(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(bucket[i].get$_key(), key))
+          return i;
+      return -1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    $isLinkedHashMap: true,
+    $isMap: true,
+    static: {_LinkedHashMap__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  _LinkedHashMap_values_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(each) {
+      return this.this_0.$index(0, each);
+    }, "call$1", null, 2, 0, null, 120, "call"],
+    $isFunction: true
+  },
+  _LinkedHashMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V0", args: [K, V]};
+      }, this.this_0, "_LinkedHashMap");
+    }
+  },
+  LinkedHashMapCell: {
+    "^": "Object;_key<,_value@,_next@,_previous@"
+  },
+  LinkedHashMapKeyIterable: {
+    "^": "IterableBase;_map",
+    get$length: function(_) {
+      return this._map._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._map._collection$_length === 0;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._map;
+      t2 = new P.LinkedHashMapKeyIterator(t1, t1._modifications, null, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      t2._cell = t1._first;
+      return t2;
+    },
+    contains$1: function(_, element) {
+      return this._map.containsKey$1(element);
+    },
+    forEach$1: function(_, f) {
+      var t1, cell, modifications;
+      t1 = this._map;
+      cell = t1._first;
+      modifications = t1._modifications;
+      for (; cell != null;) {
+        f.call$1(cell.get$_key());
+        if (modifications !== t1._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(t1));
+        cell = cell.get$_next();
+      }
+    },
+    $isEfficientLength: true
+  },
+  LinkedHashMapKeyIterator: {
+    "^": "Object;_map,_modifications,_cell,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._map;
+      if (this._modifications !== t1._modifications)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else {
+        t1 = this._cell;
+        if (t1 == null) {
+          this._collection$_current = null;
+          return false;
+        } else {
+          this._collection$_current = t1.get$_key();
+          this._cell = this._cell.get$_next();
+          return true;
+        }
+      }
+    }
+  },
+  _HashSet: {
+    "^": "_HashSetBase;_collection$_length,_strings,_nums,_rest,_elements",
+    get$iterator: function(_) {
+      var t1 = new P.HashSetIterator(this, this._computeElements$0(), 0, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    contains$1: function(_, object) {
+      var strings, nums;
+      if (typeof object === "string" && object !== "__proto__") {
+        strings = this._strings;
+        return strings == null ? false : strings[object] != null;
+      } else if (typeof object === "number" && (object & 0x3ffffff) === object) {
+        nums = this._nums;
+        return nums == null ? false : nums[object] != null;
+      } else
+        return this._contains$1(object);
+    },
+    _contains$1: function(object) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
+    },
+    lookup$1: function(object) {
+      var t1;
+      if (!(typeof object === "string" && object !== "__proto__"))
+        t1 = typeof object === "number" && (object & 0x3ffffff) === object;
+      else
+        t1 = true;
+      if (t1)
+        return this.contains$1(0, object) ? object : null;
+      return this._lookup$1(object);
+    },
+    _lookup$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return;
+      return J.$index$asx(bucket, index);
+    },
+    add$1: function(_, element) {
+      var strings, table, nums;
+      if (typeof element === "string" && element !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._strings = table;
+          strings = table;
+        }
+        return this._addHashTableEntry$2(strings, element);
+      } else if (typeof element === "number" && (element & 0x3ffffff) === element) {
+        nums = this._nums;
+        if (nums == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._nums = table;
+          nums = table;
+        }
+        return this._addHashTableEntry$2(nums, element);
+      } else
+        return this._add$1(0, element);
+    },
+    _add$1: function(_, element) {
+      var rest, hash, bucket;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._HashSet__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(element);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [element];
+      else {
+        if (this._findBucketIndex$2(bucket, element) >= 0)
+          return false;
+        bucket.push(element);
+      }
+      ++this._collection$_length;
+      this._elements = null;
+      return true;
+    },
+    addAll$1: function(_, objects) {
+      var t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(objects, objects.length, 0, null), [H.getTypeArgumentByIndex(objects, 0)]); t1.moveNext$0();)
+        this.add$1(0, t1._current);
+    },
+    remove$1: function(_, object) {
+      if (typeof object === "string" && object !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, object);
+      else if (typeof object === "number" && (object & 0x3ffffff) === object)
+        return this._removeHashTableEntry$2(this._nums, object);
+      else
+        return this._remove$1(object);
+    },
+    _remove$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return false;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return false;
+      --this._collection$_length;
+      this._elements = null;
+      bucket.splice(index, 1);
+      return true;
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._elements = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+      }
+    },
+    _computeElements$0: function() {
+      var t1, result, strings, names, entries, index, i, nums, rest, bucket, $length, i0;
+      t1 = this._elements;
+      if (t1 != null)
+        return t1;
+      result = Array(this._collection$_length);
+      result.fixed$length = init;
+      strings = this._strings;
+      if (strings != null) {
+        names = Object.getOwnPropertyNames(strings);
+        entries = names.length;
+        for (index = 0, i = 0; i < entries; ++i) {
+          result[index] = names[i];
+          ++index;
+        }
+      } else
+        index = 0;
+      nums = this._nums;
+      if (nums != null) {
+        names = Object.getOwnPropertyNames(nums);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          result[index] = +names[i];
+          ++index;
+        }
+      }
+      rest = this._rest;
+      if (rest != null) {
+        names = Object.getOwnPropertyNames(rest);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          bucket = rest[names[i]];
+          $length = bucket.length;
+          for (i0 = 0; i0 < $length; ++i0) {
+            result[index] = bucket[i0];
+            ++index;
+          }
+        }
+      }
+      this._elements = result;
+      return result;
+    },
+    _addHashTableEntry$2: function(table, element) {
+      if (table[element] != null)
+        return false;
+      table[element] = 0;
+      ++this._collection$_length;
+      this._elements = null;
+      return true;
+    },
+    _removeHashTableEntry$2: function(table, element) {
+      if (table != null && table[element] != null) {
+        delete table[element];
+        --this._collection$_length;
+        this._elements = null;
+        return true;
+      } else
+        return false;
+    },
+    _computeHashCode$1: function(element) {
+      return J.get$hashCode$(element) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, element) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(bucket[i], element))
+          return i;
+      return -1;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {_HashSet__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  HashSetIterator: {
+    "^": "Object;_set,_elements,_offset,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var elements, offset, t1;
+      elements = this._elements;
+      offset = this._offset;
+      t1 = this._set;
+      if (elements !== t1._elements)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else if (offset >= elements.length) {
+        this._collection$_current = null;
+        return false;
+      } else {
+        this._collection$_current = elements[offset];
+        this._offset = offset + 1;
+        return true;
+      }
+    }
+  },
+  _LinkedHashSet: {
+    "^": "_HashSetBase;_collection$_length,_strings,_nums,_rest,_first,_last,_modifications",
+    get$iterator: function(_) {
+      var t1 = H.setRuntimeTypeInfo(new P.LinkedHashSetIterator(this, this._modifications, null, null), [null]);
+      t1._cell = t1._set._first;
+      return t1;
+    },
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    contains$1: function(_, object) {
+      var strings, nums;
+      if (typeof object === "string" && object !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          return false;
+        return strings[object] != null;
+      } else if (typeof object === "number" && (object & 0x3ffffff) === object) {
+        nums = this._nums;
+        if (nums == null)
+          return false;
+        return nums[object] != null;
+      } else
+        return this._contains$1(object);
+    },
+    _contains$1: function(object) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
+    },
+    lookup$1: function(object) {
+      var t1;
+      if (!(typeof object === "string" && object !== "__proto__"))
+        t1 = typeof object === "number" && (object & 0x3ffffff) === object;
+      else
+        t1 = true;
+      if (t1)
+        return this.contains$1(0, object) ? object : null;
+      else
+        return this._lookup$1(object);
+    },
+    _lookup$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return;
+      return J.get$_element$x(J.$index$asx(bucket, index));
+    },
+    forEach$1: function(_, action) {
+      var cell, modifications;
+      cell = this._first;
+      modifications = this._modifications;
+      for (; cell != null;) {
+        action.call$1(cell.get$_element(cell));
+        if (modifications !== this._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+        cell = cell.get$_next();
+      }
+    },
+    get$last: function(_) {
+      var t1 = this._last;
+      if (t1 == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return t1.get$_element(t1);
+    },
+    add$1: function(_, element) {
+      var strings, table, nums;
+      if (typeof element === "string" && element !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._strings = table;
+          strings = table;
+        }
+        return this._addHashTableEntry$2(strings, element);
+      } else if (typeof element === "number" && (element & 0x3ffffff) === element) {
+        nums = this._nums;
+        if (nums == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._nums = table;
+          nums = table;
+        }
+        return this._addHashTableEntry$2(nums, element);
+      } else
+        return this._add$1(0, element);
+    },
+    _add$1: function(_, element) {
+      var rest, hash, bucket;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._LinkedHashSet__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(element);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [this._newLinkedCell$1(element)];
+      else {
+        if (this._findBucketIndex$2(bucket, element) >= 0)
+          return false;
+        bucket.push(this._newLinkedCell$1(element));
+      }
+      return true;
+    },
+    remove$1: function(_, object) {
+      if (typeof object === "string" && object !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, object);
+      else if (typeof object === "number" && (object & 0x3ffffff) === object)
+        return this._removeHashTableEntry$2(this._nums, object);
+      else
+        return this._remove$1(object);
+    },
+    _remove$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return false;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return false;
+      this._unlinkCell$1(bucket.splice(index, 1)[0]);
+      return true;
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._last = null;
+        this._first = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+        this._modifications = this._modifications + 1 & 67108863;
+      }
+    },
+    _addHashTableEntry$2: function(table, element) {
+      if (table[element] != null)
+        return false;
+      table[element] = this._newLinkedCell$1(element);
+      return true;
+    },
+    _removeHashTableEntry$2: function(table, element) {
+      var cell;
+      if (table == null)
+        return false;
+      cell = table[element];
+      if (cell == null)
+        return false;
+      this._unlinkCell$1(cell);
+      delete table[element];
+      return true;
+    },
+    _newLinkedCell$1: function(element) {
+      var cell, last;
+      cell = new P.LinkedHashSetCell(element, null, null);
+      if (this._first == null) {
+        this._last = cell;
+        this._first = cell;
+      } else {
+        last = this._last;
+        cell._previous = last;
+        last.set$_next(cell);
+        this._last = cell;
+      }
+      ++this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+      return cell;
+    },
+    _unlinkCell$1: function(cell) {
+      var previous, next;
+      previous = cell.get$_previous();
+      next = cell.get$_next();
+      if (previous == null)
+        this._first = next;
+      else
+        previous.set$_next(next);
+      if (next == null)
+        this._last = previous;
+      else
+        next.set$_previous(previous);
+      --this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+    },
+    _computeHashCode$1: function(element) {
+      return J.get$hashCode$(element) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, element) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(J.get$_element$x(bucket[i]), element))
+          return i;
+      return -1;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {_LinkedHashSet__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  LinkedHashSetCell: {
+    "^": "Object;_element>,_next@,_previous@"
+  },
+  LinkedHashSetIterator: {
+    "^": "Object;_set,_modifications,_cell,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._set;
+      if (this._modifications !== t1._modifications)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else {
+        t1 = this._cell;
+        if (t1 == null) {
+          this._collection$_current = null;
+          return false;
+        } else {
+          this._collection$_current = t1.get$_element(t1);
+          this._cell = this._cell.get$_next();
+          return true;
+        }
+      }
+    }
+  },
+  UnmodifiableListView: {
+    "^": "UnmodifiableListBase;_collection$_source",
+    get$length: function(_) {
+      return this._collection$_source.length;
+    },
+    $index: function(_, index) {
+      var t1 = this._collection$_source;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    }
+  },
+  _HashSetBase: {
+    "^": "SetBase;"
+  },
+  IterableBase: {
+    "^": "Object;",
+    map$1: [function(_, f) {
+      return H.MappedIterable_MappedIterable(this, f, H.getRuntimeTypeArgument(this, "IterableBase", 0), null);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E1", ret: P.Iterable, args: [{func: "dynamic__E1", args: [E]}]};
+      }, this.$receiver, "IterableBase");
+    }, 31],
+    where$1: function(_, f) {
+      return H.setRuntimeTypeInfo(new H.WhereIterable(this, f), [H.getRuntimeTypeArgument(this, "IterableBase", 0)]);
+    },
+    expand$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(this, f), [H.getRuntimeTypeArgument(this, "IterableBase", 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E0", ret: P.Iterable, args: [{func: "Iterable__E0", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "IterableBase");
+    }, 31],
+    contains$1: function(_, element) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (J.$eq(t1.get$current(), element))
+          return true;
+      return false;
+    },
+    forEach$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        f.call$1(t1.get$current());
+    },
+    join$1: function(_, separator) {
+      var iterator, buffer, t1;
+      iterator = this.get$iterator(this);
+      if (!iterator.moveNext$0())
+        return "";
+      buffer = P.StringBuffer$("");
+      if (separator === "")
+        do {
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        } while (iterator.moveNext$0());
+      else {
+        buffer.write$1(H.S(iterator.get$current()));
+        for (; iterator.moveNext$0();) {
+          buffer._contents += separator;
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        }
+      }
+      return buffer._contents;
+    },
+    any$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (f.call$1(t1.get$current()) === true)
+          return true;
+      return false;
+    },
+    toList$1$growable: function(_, growable) {
+      return P.List_List$from(this, growable, H.getRuntimeTypeArgument(this, "IterableBase", 0));
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    get$length: function(_) {
+      var it, count;
+      it = this.get$iterator(this);
+      for (count = 0; it.moveNext$0();)
+        ++count;
+      return count;
+    },
+    get$isEmpty: function(_) {
+      return !this.get$iterator(this).moveNext$0();
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$isEmpty(this) !== true;
+    },
+    get$last: function(_) {
+      var it, result;
+      it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      do
+        result = it.get$current();
+      while (it.moveNext$0());
+      return result;
+    },
+    elementAt$1: function(_, index) {
+      var t1, remaining, element, t2;
+      if (typeof index !== "number" || Math.floor(index) !== index || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      for (t1 = this.get$iterator(this), remaining = index; t1.moveNext$0();) {
+        element = t1.get$current();
+        t2 = J.getInterceptor(remaining);
+        if (t2.$eq(remaining, 0))
+          return element;
+        remaining = t2.$sub(remaining, 1);
+      }
+      throw H.wrapException(P.RangeError$value(index));
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToShortString(this, "(", ")");
+    },
+    $isIterable: true,
+    $asIterable: null
+  },
+  ListBase: {
+    "^": "Object_ListMixin;"
+  },
+  Object_ListMixin: {
+    "^": "Object+ListMixin;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  ListMixin: {
+    "^": "Object;",
+    get$iterator: function(receiver) {
+      return H.setRuntimeTypeInfo(new H.ListIterator(receiver, this.get$length(receiver), 0, null), [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+    },
+    elementAt$1: function(receiver, index) {
+      return this.$index(receiver, index);
+    },
+    forEach$1: function(receiver, action) {
+      var $length, i;
+      $length = this.get$length(receiver);
+      for (i = 0; i < $length; ++i) {
+        action.call$1(this.$index(receiver, i));
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+    },
+    get$isEmpty: function(receiver) {
+      return this.get$length(receiver) === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return !this.get$isEmpty(receiver);
+    },
+    get$last: function(receiver) {
+      if (this.get$length(receiver) === 0)
+        throw H.wrapException(P.StateError$("No elements"));
+      return this.$index(receiver, this.get$length(receiver) - 1);
+    },
+    contains$1: function(receiver, element) {
+      var $length, i;
+      $length = this.get$length(receiver);
+      for (i = 0; i < this.get$length(receiver); ++i) {
+        if (J.$eq(this.$index(receiver, i), element))
+          return true;
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return false;
+    },
+    any$1: function(receiver, test) {
+      var $length, i;
+      $length = this.get$length(receiver);
+      for (i = 0; i < $length; ++i) {
+        if (test.call$1(this.$index(receiver, i)) === true)
+          return true;
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return false;
+    },
+    join$1: function(receiver, separator) {
+      var buffer;
+      if (this.get$length(receiver) === 0)
+        return "";
+      buffer = P.StringBuffer$("");
+      buffer.writeAll$2(receiver, separator);
+      return buffer._contents;
+    },
+    where$1: function(receiver, test) {
+      return H.setRuntimeTypeInfo(new H.WhereIterable(receiver, test), [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+    },
+    map$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(receiver, f), [null, null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E2", ret: P.Iterable, args: [{func: "dynamic__E2", args: [E]}]};
+      }, this.$receiver, "ListMixin");
+    }, 31],
+    expand$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(receiver, f), [H.getRuntimeTypeArgument(receiver, "ListMixin", 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E1", ret: P.Iterable, args: [{func: "Iterable__E1", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "ListMixin");
+    }, 31],
+    skip$1: function(receiver, count) {
+      return H.SubListIterable$(receiver, count, null, null);
+    },
+    toList$1$growable: function(receiver, growable) {
+      var result, t1, i;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(receiver));
+      } else {
+        t1 = Array(this.get$length(receiver));
+        t1.fixed$length = init;
+        result = H.setRuntimeTypeInfo(t1, [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+      }
+      for (i = 0; i < this.get$length(receiver); ++i) {
+        t1 = this.$index(receiver, i);
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t1;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    add$1: function(receiver, element) {
+      var t1 = this.get$length(receiver);
+      this.set$length(receiver, t1 + 1);
+      this.$indexSet(receiver, t1, element);
+    },
+    addAll$1: function(receiver, iterable) {
+      var t1, element, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();) {
+        element = t1._current;
+        t2 = this.get$length(receiver);
+        this.set$length(receiver, t2 + 1);
+        this.$indexSet(receiver, t2, element);
+      }
+    },
+    clear$0: function(receiver) {
+      this.set$length(receiver, 0);
+    },
+    sort$1: function(receiver, compare) {
+      if (compare == null)
+        compare = P.Comparable_compare$closure();
+      H.Sort__doSort(receiver, 0, this.get$length(receiver) - 1, compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    _rangeCheck$2: function(receiver, start, end) {
+      var t1 = J.getInterceptor$n(start);
+      if (t1.$lt(start, 0) || t1.$gt(start, this.get$length(receiver)))
+        throw H.wrapException(P.RangeError$range(start, 0, this.get$length(receiver)));
+      t1 = J.getInterceptor$n(end);
+      if (t1.$lt(end, start) || t1.$gt(end, this.get$length(receiver)))
+        throw H.wrapException(P.RangeError$range(end, start, this.get$length(receiver)));
+    },
+    getRange$2: function(receiver, start, end) {
+      this._rangeCheck$2(receiver, start, end);
+      return H.SubListIterable$(receiver, start, end, null);
+    },
+    removeRange$2: function(receiver, start, end) {
+      var $length;
+      this._rangeCheck$2(receiver, start, end);
+      $length = end - start;
+      this.setRange$4(receiver, start, this.get$length(receiver) - $length, receiver, end);
+      this.set$length(receiver, this.get$length(receiver) - $length);
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      var $length, t1, otherStart, otherList, i;
+      if (start < 0 || start > this.get$length(receiver))
+        H.throwExpression(P.RangeError$range(start, 0, this.get$length(receiver)));
+      if (end < start || end > this.get$length(receiver))
+        H.throwExpression(P.RangeError$range(end, start, this.get$length(receiver)));
+      $length = end - start;
+      if ($length === 0)
+        return;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      t1 = J.getInterceptor(iterable);
+      if (!!t1.$isList) {
+        otherStart = skipCount;
+        otherList = iterable;
+      } else {
+        otherList = t1.skip$1(iterable, skipCount).toList$1$growable(0, false);
+        otherStart = 0;
+      }
+      t1 = J.getInterceptor$asx(otherList);
+      if (otherStart + $length > t1.get$length(otherList))
+        throw H.wrapException(P.StateError$("Not enough elements"));
+      if (otherStart < start)
+        for (i = $length - 1; i >= 0; --i)
+          this.$indexSet(receiver, start + i, t1.$index(otherList, otherStart + i));
+      else
+        for (i = 0; i < $length; ++i)
+          this.$indexSet(receiver, start + i, t1.$index(otherList, otherStart + i));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    indexOf$2: function(receiver, element, startIndex) {
+      var i;
+      if (startIndex >= this.get$length(receiver))
+        return -1;
+      for (i = startIndex; i < this.get$length(receiver); ++i)
+        if (J.$eq(this.$index(receiver, i), element))
+          return i;
+      return -1;
+    },
+    indexOf$1: function($receiver, element) {
+      return this.indexOf$2($receiver, element, 0);
+    },
+    lastIndexOf$2: function(receiver, element, startIndex) {
+      var i;
+      startIndex = this.get$length(receiver) - 1;
+      for (i = startIndex; i >= 0; --i)
+        if (J.$eq(this.$index(receiver, i), element))
+          return i;
+      return -1;
+    },
+    lastIndexOf$1: function($receiver, element) {
+      return this.lastIndexOf$2($receiver, element, null);
+    },
+    insert$2: function(receiver, index, element) {
+      if (index > this.get$length(receiver))
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(receiver)));
+      if (index === this.get$length(receiver)) {
+        this.add$1(receiver, element);
+        return;
+      }
+      this.set$length(receiver, this.get$length(receiver) + 1);
+      this.setRange$4(receiver, index + 1, this.get$length(receiver), receiver, index);
+      this.$indexSet(receiver, index, element);
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      var t1, insertionLength;
+      if (index < 0 || index > this.get$length(receiver))
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(receiver)));
+      t1 = J.getInterceptor(iterable);
+      if (!!t1.$isEfficientLength)
+        iterable = t1.toList$0(iterable);
+      insertionLength = J.get$length$asx(iterable);
+      this.set$length(receiver, this.get$length(receiver) + insertionLength);
+      this.setRange$4(receiver, index + insertionLength, this.get$length(receiver), receiver, index);
+      this.setAll$2(receiver, index, iterable);
+    },
+    setAll$2: function(receiver, index, iterable) {
+      var t1, index0;
+      t1 = J.getInterceptor(iterable);
+      if (!!t1.$isList)
+        this.setRange$3(receiver, index, index + t1.get$length(iterable), iterable);
+      else
+        for (t1 = t1.get$iterator(iterable); t1.moveNext$0(); index = index0) {
+          index0 = index + 1;
+          this.$indexSet(receiver, index, t1.get$current());
+        }
+    },
+    toString$0: function(receiver) {
+      return P.IterableBase_iterableToFullString(receiver, "[", "]");
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  Maps_mapToString_closure: {
+    "^": "Closure:75;box_0,result_1",
+    call$2: function(k, v) {
+      var t1 = this.box_0;
+      if (!t1.first_0)
+        this.result_1.write$1(", ");
+      t1.first_0 = false;
+      t1 = this.result_1;
+      t1.write$1(k);
+      t1.write$1(": ");
+      t1.write$1(v);
+    },
+    $isFunction: true
+  },
+  ListQueue: {
+    "^": "IterableBase;_collection$_table,_head,_tail,_modificationCount",
+    get$iterator: function(_) {
+      var t1 = new P._ListQueueIterator(this, this._tail, this._modificationCount, this._head, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    forEach$1: function(_, action) {
+      var modificationCount, i, t1;
+      modificationCount = this._modificationCount;
+      for (i = this._head; i !== this._tail; i = (i + 1 & this._collection$_table.length - 1) >>> 0) {
+        t1 = this._collection$_table;
+        if (i < 0 || i >= t1.length)
+          return H.ioore(t1, i);
+        action.call$1(t1[i]);
+        if (modificationCount !== this._modificationCount)
+          H.throwExpression(P.ConcurrentModificationError$(this));
+      }
+    },
+    get$isEmpty: function(_) {
+      return this._head === this._tail;
+    },
+    get$length: function(_) {
+      return (this._tail - this._head & this._collection$_table.length - 1) >>> 0;
+    },
+    get$last: function(_) {
+      var t1, t2, t3;
+      t1 = this._head;
+      t2 = this._tail;
+      if (t1 === t2)
+        throw H.wrapException(H.IterableElementError_noElement());
+      t1 = this._collection$_table;
+      t3 = t1.length;
+      t2 = (t2 - 1 & t3 - 1) >>> 0;
+      if (t2 < 0 || t2 >= t3)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    toList$1$growable: function(_, growable) {
+      var list, t1;
+      if (growable) {
+        list = H.setRuntimeTypeInfo([], [H.getTypeArgumentByIndex(this, 0)]);
+        C.JSArray_methods.set$length(list, this.get$length(this));
+      } else {
+        t1 = Array(this.get$length(this));
+        t1.fixed$length = init;
+        list = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      }
+      this._writeToList$1(list);
+      return list;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    add$1: function(_, element) {
+      this._add$1(0, element);
+    },
+    addAll$1: function(_, elements) {
+      var addCount, $length, t1, t2, t3, newCapacity, newTable, endSpace, preSpace;
+      addCount = elements.length;
+      $length = this.get$length(this);
+      t1 = $length + addCount;
+      t2 = this._collection$_table;
+      t3 = t2.length;
+      if (t1 >= t3) {
+        newCapacity = P.ListQueue__nextPowerOf2(t1);
+        if (typeof newCapacity !== "number")
+          return H.iae(newCapacity);
+        t2 = Array(newCapacity);
+        t2.fixed$length = init;
+        newTable = H.setRuntimeTypeInfo(t2, [H.getTypeArgumentByIndex(this, 0)]);
+        this._tail = this._writeToList$1(newTable);
+        this._collection$_table = newTable;
+        this._head = 0;
+        H.IterableMixinWorkaround_setRangeList(newTable, $length, t1, elements, 0);
+        this._tail += addCount;
+      } else {
+        t1 = this._tail;
+        endSpace = t3 - t1;
+        if (addCount < endSpace) {
+          H.IterableMixinWorkaround_setRangeList(t2, t1, t1 + addCount, elements, 0);
+          this._tail += addCount;
+        } else {
+          preSpace = addCount - endSpace;
+          H.IterableMixinWorkaround_setRangeList(t2, t1, t1 + endSpace, elements, 0);
+          t1 = this._collection$_table;
+          H.IterableMixinWorkaround_setRangeList(t1, 0, preSpace, elements, endSpace);
+          this._tail = preSpace;
+        }
+      }
+      ++this._modificationCount;
+    },
+    clear$0: function(_) {
+      var i, t1, t2, t3, t4;
+      i = this._head;
+      t1 = this._tail;
+      if (i !== t1) {
+        for (t2 = this._collection$_table, t3 = t2.length, t4 = t3 - 1; i !== t1; i = (i + 1 & t4) >>> 0) {
+          if (i < 0 || i >= t3)
+            return H.ioore(t2, i);
+          t2[i] = null;
+        }
+        this._tail = 0;
+        this._head = 0;
+        ++this._modificationCount;
+      }
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    removeFirst$0: function() {
+      var t1, t2, t3, result;
+      t1 = this._head;
+      if (t1 === this._tail)
+        throw H.wrapException(H.IterableElementError_noElement());
+      ++this._modificationCount;
+      t2 = this._collection$_table;
+      t3 = t2.length;
+      if (t1 >= t3)
+        return H.ioore(t2, t1);
+      result = t2[t1];
+      t2[t1] = null;
+      this._head = (t1 + 1 & t3 - 1) >>> 0;
+      return result;
+    },
+    _add$1: function(_, element) {
+      var t1, t2, t3;
+      t1 = this._collection$_table;
+      t2 = this._tail;
+      t3 = t1.length;
+      if (t2 < 0 || t2 >= t3)
+        return H.ioore(t1, t2);
+      t1[t2] = element;
+      t3 = (t2 + 1 & t3 - 1) >>> 0;
+      this._tail = t3;
+      if (this._head === t3)
+        this._grow$0();
+      ++this._modificationCount;
+    },
+    _grow$0: function() {
+      var t1, newTable, t2, split;
+      t1 = Array(this._collection$_table.length * 2);
+      t1.fixed$length = init;
+      newTable = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      t1 = this._collection$_table;
+      t2 = this._head;
+      split = t1.length - t2;
+      H.IterableMixinWorkaround_setRangeList(newTable, 0, split, t1, t2);
+      t1 = this._head;
+      t2 = this._collection$_table;
+      H.IterableMixinWorkaround_setRangeList(newTable, split, split + t1, t2, 0);
+      this._head = 0;
+      this._tail = this._collection$_table.length;
+      this._collection$_table = newTable;
+    },
+    _writeToList$1: function(target) {
+      var t1, t2, t3, $length, firstPartSize;
+      t1 = this._head;
+      t2 = this._tail;
+      t3 = this._collection$_table;
+      if (t1 <= t2) {
+        $length = t2 - t1;
+        H.IterableMixinWorkaround_setRangeList(target, 0, $length, t3, t1);
+        return $length;
+      } else {
+        firstPartSize = t3.length - t1;
+        H.IterableMixinWorkaround_setRangeList(target, 0, firstPartSize, t3, t1);
+        t1 = this._tail;
+        t2 = this._collection$_table;
+        H.IterableMixinWorkaround_setRangeList(target, firstPartSize, firstPartSize + t1, t2, 0);
+        return this._tail + firstPartSize;
+      }
+    },
+    ListQueue$1: function(initialCapacity, $E) {
+      var t1 = Array(8);
+      t1.fixed$length = init;
+      this._collection$_table = H.setRuntimeTypeInfo(t1, [$E]);
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {"^": "ListQueue__INITIAL_CAPACITY", ListQueue__nextPowerOf2: function(number) {
+        var nextNumber;
+        if (typeof number !== "number")
+          return number.$shl();
+        number = (number << 2 >>> 0) - 1;
+        for (; true; number = nextNumber) {
+          nextNumber = (number & number - 1) >>> 0;
+          if (nextNumber === 0)
+            return number;
+        }
+      }}
+  },
+  _ListQueueIterator: {
+    "^": "Object;_queue,_end,_modificationCount,_collection$_position,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1, t2, t3;
+      t1 = this._queue;
+      if (this._modificationCount !== t1._modificationCount)
+        H.throwExpression(P.ConcurrentModificationError$(t1));
+      t2 = this._collection$_position;
+      if (t2 === this._end) {
+        this._collection$_current = null;
+        return false;
+      }
+      t1 = t1._collection$_table;
+      t3 = t1.length;
+      if (t2 >= t3)
+        return H.ioore(t1, t2);
+      this._collection$_current = t1[t2];
+      this._collection$_position = (t2 + 1 & t3 - 1) >>> 0;
+      return true;
+    }
+  },
+  SetMixin: {
+    "^": "Object;",
+    get$isEmpty: function(_) {
+      return this.get$length(this) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$length(this) !== 0;
+    },
+    clear$0: function(_) {
+      this.removeAll$1(this.toList$0(0));
+    },
+    addAll$1: function(_, elements) {
+      var t1;
+      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
+        this.add$1(0, t1.get$current());
+    },
+    removeAll$1: function(elements) {
+      var t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(elements, elements.length, 0, null), [H.getTypeArgumentByIndex(elements, 0)]); t1.moveNext$0();)
+        this.remove$1(0, t1._current);
+    },
+    toList$1$growable: function(_, growable) {
+      var result, t1, i, element, i0;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getTypeArgumentByIndex(this, 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(this));
+      } else {
+        t1 = Array(this.get$length(this));
+        t1.fixed$length = init;
+        result = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      }
+      for (t1 = this.get$iterator(this), i = 0; t1.moveNext$0(); i = i0) {
+        element = t1.get$current();
+        i0 = i + 1;
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = element;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    map$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(this, f), [H.getTypeArgumentByIndex(this, 0), null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E3", ret: P.Iterable, args: [{func: "dynamic__E3", args: [E]}]};
+      }, this.$receiver, "SetMixin");
+    }, 31],
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    where$1: function(_, f) {
+      var t1 = new H.WhereIterable(this, f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    expand$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(this, f), [H.getTypeArgumentByIndex(this, 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E2", ret: P.Iterable, args: [{func: "Iterable__E2", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "SetMixin");
+    }, 31],
+    forEach$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        f.call$1(t1.get$current());
+    },
+    join$1: function(_, separator) {
+      var iterator, buffer, t1;
+      iterator = this.get$iterator(this);
+      if (!iterator.moveNext$0())
+        return "";
+      buffer = P.StringBuffer$("");
+      if (separator === "")
+        do {
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        } while (iterator.moveNext$0());
+      else {
+        buffer.write$1(H.S(iterator.get$current()));
+        for (; iterator.moveNext$0();) {
+          buffer._contents += separator;
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        }
+      }
+      return buffer._contents;
+    },
+    any$1: function(_, test) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (test.call$1(t1.get$current()) === true)
+          return true;
+      return false;
+    },
+    get$last: function(_) {
+      var it, result;
+      it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      do
+        result = it.get$current();
+      while (it.moveNext$0());
+      return result;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  SetBase: {
+    "^": "SetMixin;"
+  },
+  _SplayTreeNode: {
+    "^": "Object;key>,left>,right>",
+    $is_SplayTreeNode: true
+  },
+  _SplayTreeMapNode: {
+    "^": "_SplayTreeNode;value*,key,left,right",
+    $as_SplayTreeNode: function($K, $V) {
+      return [$K];
+    }
+  },
+  _SplayTree: {
+    "^": "Object;",
+    _splay$1: function(key) {
+      var current, left, right, left0, comp, t1, tmp, current0;
+      current = this._root;
+      if (current == null)
+        return -1;
+      left = this._dummy;
+      for (right = left, left0 = right, comp = null; true;) {
+        comp = this._compare$2(current.key, key);
+        t1 = J.getInterceptor$n(comp);
+        if (t1.$gt(comp, 0)) {
+          t1 = current.left;
+          if (t1 == null)
+            break;
+          comp = this._compare$2(t1.key, key);
+          if (J.$gt$n(comp, 0)) {
+            tmp = current.left;
+            current.left = tmp.right;
+            tmp.right = current;
+            if (tmp.left == null) {
+              current = tmp;
+              break;
+            }
+            current = tmp;
+          }
+          right.left = current;
+          current0 = current.left;
+          right = current;
+          current = current0;
+        } else {
+          if (t1.$lt(comp, 0)) {
+            t1 = current.right;
+            if (t1 == null)
+              break;
+            comp = this._compare$2(t1.key, key);
+            if (J.$lt$n(comp, 0)) {
+              tmp = current.right;
+              current.right = tmp.left;
+              tmp.left = current;
+              if (tmp.right == null) {
+                current = tmp;
+                break;
+              }
+              current = tmp;
+            }
+            left0.right = current;
+            current0 = current.right;
+          } else
+            break;
+          left0 = current;
+          current = current0;
+        }
+      }
+      left0.right = current.left;
+      right.left = current.right;
+      current.left = left.right;
+      current.right = left.left;
+      this._root = current;
+      left.right = null;
+      left.left = null;
+      ++this._splayCount;
+      return comp;
+    },
+    _addNewRoot$2: function(node, comp) {
+      var t1, t2;
+      ++this._count;
+      ++this._modificationCount;
+      if (this._root == null) {
+        this._root = node;
+        return;
+      }
+      t1 = J.$lt$n(comp, 0);
+      t2 = this._root;
+      if (t1) {
+        node.left = t2;
+        node.right = t2.right;
+        t2.right = null;
+      } else {
+        node.right = t2;
+        node.left = t2.left;
+        t2.left = null;
+      }
+      this._root = node;
+    }
+  },
+  SplayTreeMap: {
+    "^": "_SplayTree;_comparator,_validKey,_root,_dummy,_count,_modificationCount,_splayCount",
+    _comparator$2: function(arg0, arg1) {
+      return this._comparator.call$2(arg0, arg1);
+    },
+    _validKey$1: function(arg0) {
+      return this._validKey.call$1(arg0);
+    },
+    _compare$2: function(key1, key2) {
+      return this._comparator$2(key1, key2);
+    },
+    $index: function(_, key) {
+      if (key == null)
+        throw H.wrapException(P.ArgumentError$(key));
+      if (this._validKey$1(key) !== true)
+        return;
+      if (this._root != null)
+        if (J.$eq(this._splay$1(key), 0))
+          return this._root.value;
+      return;
+    },
+    $indexSet: function(_, key, value) {
+      var comp;
+      if (key == null)
+        throw H.wrapException(P.ArgumentError$(key));
+      comp = this._splay$1(key);
+      if (J.$eq(comp, 0)) {
+        this._root.value = value;
+        return;
+      }
+      this._addNewRoot$2(H.setRuntimeTypeInfo(new P._SplayTreeMapNode(value, key, null, null), [null, null]), comp);
+    },
+    addAll$1: function(_, other) {
+      H.IterableMixinWorkaround_forEach(other, new P.SplayTreeMap_addAll_closure(this));
+    },
+    get$isEmpty: function(_) {
+      return this._root == null;
+    },
+    get$isNotEmpty: function(_) {
+      return this._root != null;
+    },
+    forEach$1: function(_, f) {
+      var t1, nodes, node;
+      t1 = H.getTypeArgumentByIndex(this, 0);
+      nodes = H.setRuntimeTypeInfo(new P._SplayTreeNodeIterator(this, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), this._modificationCount, this._splayCount, null), [t1]);
+      nodes._SplayTreeIterator$1(this, [P._SplayTreeNode, t1]);
+      for (; nodes.moveNext$0();) {
+        node = nodes.get$current();
+        t1 = J.getInterceptor$x(node);
+        f.call$2(t1.get$key(node), t1.get$value(node));
+      }
+    },
+    get$length: function(_) {
+      return this._count;
+    },
+    clear$0: function(_) {
+      this._root = null;
+      this._count = 0;
+      ++this._modificationCount;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new P._SplayTreeKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      var t1 = new P._SplayTreeValueIterable(this);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    $isSplayTreeMap: true,
+    $as_SplayTree: function($K, $V) {
+      return [$K];
+    },
+    $asMap: null,
+    $isMap: true,
+    static: {SplayTreeMap$: function(compare, isValidKey, $K, $V) {
+        var t1, t2;
+        t1 = P.Comparable_compare$closure();
+        t2 = new P.SplayTreeMap_closure($K);
+        return H.setRuntimeTypeInfo(new P.SplayTreeMap(t1, t2, null, H.setRuntimeTypeInfo(new P._SplayTreeNode(null, null, null), [$K]), 0, 0, 0), [$K, $V]);
+      }}
+  },
+  SplayTreeMap_closure: {
+    "^": "Closure:13;K_0",
+    call$1: function(v) {
+      var t1 = H.checkSubtypeOfRuntimeType(v, this.K_0);
+      return t1;
+    },
+    $isFunction: true
+  },
+  SplayTreeMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V1", args: [K, V]};
+      }, this.this_0, "SplayTreeMap");
+    }
+  },
+  _SplayTreeIterator: {
+    "^": "Object;",
+    get$current: function() {
+      var t1 = this._currentNode;
+      if (t1 == null)
+        return;
+      return this._getValue$1(t1);
+    },
+    _findLeftMostDescendent$1: function(node) {
+      var t1;
+      for (t1 = this._workList; node != null;) {
+        t1.push(node);
+        node = node.left;
+      }
+    },
+    moveNext$0: function() {
+      var t1, t2, t3;
+      t1 = this._tree;
+      if (this._modificationCount !== t1._modificationCount)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      t2 = this._workList;
+      if (t2.length === 0) {
+        this._currentNode = null;
+        return false;
+      }
+      if (t1._splayCount !== this._splayCount && this._currentNode != null) {
+        t3 = this._currentNode;
+        C.JSArray_methods.set$length(t2, 0);
+        if (t3 == null)
+          this._findLeftMostDescendent$1(t1._root);
+        else {
+          t1._splay$1(t3.key);
+          this._findLeftMostDescendent$1(t1._root.right);
+        }
+      }
+      if (0 >= t2.length)
+        return H.ioore(t2, 0);
+      t1 = t2.pop();
+      this._currentNode = t1;
+      this._findLeftMostDescendent$1(t1.right);
+      return true;
+    },
+    _SplayTreeIterator$1: function(tree, $T) {
+      this._findLeftMostDescendent$1(tree._root);
+    }
+  },
+  _SplayTreeKeyIterable: {
+    "^": "IterableBase;_tree",
+    get$length: function(_) {
+      return this._tree._count;
+    },
+    get$isEmpty: function(_) {
+      return this._tree._count === 0;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._tree;
+      t2 = new P._SplayTreeKeyIterator(t1, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), t1._modificationCount, t1._splayCount, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      t2._SplayTreeIterator$1(t1, H.getTypeArgumentByIndex(this, 0));
+      return t2;
+    },
+    $isEfficientLength: true
+  },
+  _SplayTreeValueIterable: {
+    "^": "IterableBase;_map",
+    get$length: function(_) {
+      return this._map._count;
+    },
+    get$isEmpty: function(_) {
+      return this._map._count === 0;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._map;
+      t2 = new P._SplayTreeValueIterator(t1, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), t1._modificationCount, t1._splayCount, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      t2._SplayTreeIterator$1(t1, H.getTypeArgumentByIndex(this, 1));
+      return t2;
+    },
+    $asIterableBase: function($K, $V) {
+      return [$V];
+    },
+    $asIterable: function($K, $V) {
+      return [$V];
+    },
+    $isEfficientLength: true
+  },
+  _SplayTreeKeyIterator: {
+    "^": "_SplayTreeIterator;_tree,_workList,_modificationCount,_splayCount,_currentNode",
+    _getValue$1: function(node) {
+      return node.key;
+    }
+  },
+  _SplayTreeValueIterator: {
+    "^": "_SplayTreeIterator;_tree,_workList,_modificationCount,_splayCount,_currentNode",
+    _getValue$1: function(node) {
+      return node.value;
+    },
+    $as_SplayTreeIterator: function($K, $V) {
+      return [$V];
+    }
+  },
+  _SplayTreeNodeIterator: {
+    "^": "_SplayTreeIterator;_tree,_workList,_modificationCount,_splayCount,_currentNode",
+    _getValue$1: function(node) {
+      return node;
+    },
+    $as_SplayTreeIterator: function($K) {
+      return [[P._SplayTreeNode, $K]];
+    }
+  }
+}],
+["dart.convert", "dart:convert", , P, {
+  "^": "",
+  _convertJsonToDart: function(json, reviver) {
+    var revive = reviver == null ? new P._convertJsonToDart_closure() : reviver;
+    return revive.call$2(null, new P._convertJsonToDart_walk(revive).call$1(json));
+  },
+  _parseJson: function(source, reviver) {
+    var parsed, e, t1, exception;
+    t1 = source;
+    if (typeof t1 !== "string")
+      throw H.wrapException(P.ArgumentError$(source));
+    parsed = null;
+    try {
+      parsed = JSON.parse(source);
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      e = t1;
+      throw H.wrapException(P.FormatException$(String(e)));
+    }
+
+    return P._convertJsonToDart(parsed, reviver);
+  },
+  _defaultToEncodable: [function(object) {
+    return object.toJson$0();
+  }, "call$1", "_defaultToEncodable$closure", 2, 0, 49, 50],
+  _convertJsonToDart_closure: {
+    "^": "Closure:75;",
+    call$2: function(key, value) {
+      return value;
+    },
+    $isFunction: true
+  },
+  _convertJsonToDart_walk: {
+    "^": "Closure:13;revive_0",
+    call$1: function(e) {
+      var list, t1, i, keys, map, key, proto;
+      if (e == null || typeof e != "object")
+        return e;
+      if (Object.getPrototypeOf(e) === Array.prototype) {
+        list = e;
+        for (t1 = this.revive_0, i = 0; i < list.length; ++i)
+          list[i] = t1.call$2(i, this.call$1(list[i]));
+        return list;
+      }
+      keys = Object.keys(e);
+      map = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      for (t1 = this.revive_0, i = 0; i < keys.length; ++i) {
+        key = keys[i];
+        map.$indexSet(0, key, t1.call$2(key, this.call$1(e[key])));
+      }
+      proto = e.__proto__;
+      if (typeof proto !== "undefined" && proto !== Object.prototype)
+        map.$indexSet(0, "__proto__", t1.call$2("__proto__", this.call$1(proto)));
+      return map;
+    },
+    $isFunction: true
+  },
+  Codec: {
+    "^": "Object;"
+  },
+  Converter: {
+    "^": "Object;"
+  },
+  Encoding: {
+    "^": "Codec;",
+    $asCodec: function() {
+      return [P.String, [P.List, P.$int]];
+    }
+  },
+  JsonUnsupportedObjectError: {
+    "^": "Error;unsupportedObject,cause",
+    toString$0: function(_) {
+      if (this.cause != null)
+        return "Converting object to an encodable object failed.";
+      else
+        return "Converting object did not return an encodable object.";
+    },
+    static: {JsonUnsupportedObjectError$: function(unsupportedObject, cause) {
+        return new P.JsonUnsupportedObjectError(unsupportedObject, cause);
+      }}
+  },
+  JsonCyclicError: {
+    "^": "JsonUnsupportedObjectError;unsupportedObject,cause",
+    toString$0: function(_) {
+      return "Cyclic error in JSON stringify";
+    },
+    static: {JsonCyclicError$: function(object) {
+        return new P.JsonCyclicError(object, null);
+      }}
+  },
+  JsonCodec: {
+    "^": "Codec;_reviver<,_toEncodable",
+    decode$2$reviver: function(source, reviver) {
+      return P._parseJson(source, this.get$decoder()._reviver);
+    },
+    decode$1: function(source) {
+      return this.decode$2$reviver(source, null);
+    },
+    encode$2$toEncodable: function(value, toEncodable) {
+      var t1 = this.get$encoder();
+      return P._JsonStringifier_stringify(value, t1._toEncodableFunction, t1.indent);
+    },
+    encode$1: function(value) {
+      return this.encode$2$toEncodable(value, null);
+    },
+    get$encoder: function() {
+      return C.JsonEncoder_null_null;
+    },
+    get$decoder: function() {
+      return C.JsonDecoder_null;
+    },
+    $asCodec: function() {
+      return [P.Object, P.String];
+    }
+  },
+  JsonEncoder: {
+    "^": "Converter;indent,_toEncodableFunction",
+    $asConverter: function() {
+      return [P.Object, P.String];
+    }
+  },
+  JsonDecoder: {
+    "^": "Converter;_reviver<",
+    $asConverter: function() {
+      return [P.String, P.Object];
+    }
+  },
+  _JsonStringifier: {
+    "^": "Object;_toEncodable,_sink,_convert$_seen",
+    _toEncodable$1: function(arg0) {
+      return this._toEncodable.call$1(arg0);
+    },
+    escape$1: function(s) {
+      var t1, $length, t2, offset, i, charCode, t3;
+      t1 = J.getInterceptor$asx(s);
+      $length = t1.get$length(s);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      t2 = this._sink;
+      offset = 0;
+      i = 0;
+      for (; i < $length; ++i) {
+        charCode = t1.codeUnitAt$1(s, i);
+        if (charCode > 92)
+          continue;
+        if (charCode < 32) {
+          if (i > offset) {
+            t3 = t1.substring$2(s, offset, i);
+            t2._contents += t3;
+          }
+          offset = i + 1;
+          t3 = H.Primitives_stringFromCharCode(92);
+          t2._contents += t3;
+          switch (charCode) {
+            case 8:
+              t3 = H.Primitives_stringFromCharCode(98);
+              t2._contents += t3;
+              break;
+            case 9:
+              t3 = H.Primitives_stringFromCharCode(116);
+              t2._contents += t3;
+              break;
+            case 10:
+              t3 = H.Primitives_stringFromCharCode(110);
+              t2._contents += t3;
+              break;
+            case 12:
+              t3 = H.Primitives_stringFromCharCode(102);
+              t2._contents += t3;
+              break;
+            case 13:
+              t3 = H.Primitives_stringFromCharCode(114);
+              t2._contents += t3;
+              break;
+            default:
+              t3 = H.Primitives_stringFromCharCode(117);
+              t2._contents += t3;
+              t3 = H.Primitives_stringFromCharCode(48);
+              t2._contents += t3;
+              t3 = H.Primitives_stringFromCharCode(48);
+              t2._contents += t3;
+              t3 = charCode >>> 4 & 15;
+              t3 = H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t2._contents += t3;
+              t3 = charCode & 15;
+              t3 = H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t2._contents += t3;
+              break;
+          }
+        } else if (charCode === 34 || charCode === 92) {
+          if (i > offset) {
+            t3 = t1.substring$2(s, offset, i);
+            t2._contents += t3;
+          }
+          offset = i + 1;
+          t3 = H.Primitives_stringFromCharCode(92);
+          t2._contents += t3;
+          t3 = H.Primitives_stringFromCharCode(charCode);
+          t2._contents += t3;
+        }
+      }
+      if (offset === 0)
+        t2._contents += typeof s === "string" ? s : H.S(s);
+      else if (offset < $length) {
+        t1 = t1.substring$2(s, offset, $length);
+        t2._contents += t1;
+      }
+    },
+    checkCycle$1: function(object) {
+      var t1, t2, i, t3;
+      for (t1 = this._convert$_seen, t2 = t1.length, i = 0; i < t2; ++i) {
+        t3 = t1[i];
+        if (object == null ? t3 == null : object === t3)
+          throw H.wrapException(P.JsonCyclicError$(object));
+      }
+      t1.push(object);
+    },
+    stringifyValue$1: function(object) {
+      var customJson, e, t1, exception;
+      if (!this.stringifyJsonValue$1(object)) {
+        this.checkCycle$1(object);
+        try {
+          customJson = this._toEncodable$1(object);
+          if (!this.stringifyJsonValue$1(customJson)) {
+            t1 = P.JsonUnsupportedObjectError$(object, null);
+            throw H.wrapException(t1);
+          }
+          t1 = this._convert$_seen;
+          if (0 >= t1.length)
+            return H.ioore(t1, 0);
+          t1.pop();
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          throw H.wrapException(P.JsonUnsupportedObjectError$(object, e));
+        }
+
+      }
+    },
+    stringifyJsonValue$1: function(object) {
+      var t1, t2, i, t3, separator, key;
+      if (typeof object === "number") {
+        if (!C.JSNumber_methods.get$isFinite(object))
+          return false;
+        this._sink.write$1(C.JSNumber_methods.toString$0(object));
+        return true;
+      } else if (object === true) {
+        this._sink.write$1("true");
+        return true;
+      } else if (object === false) {
+        this._sink.write$1("false");
+        return true;
+      } else if (object == null) {
+        this._sink.write$1("null");
+        return true;
+      } else if (typeof object === "string") {
+        t1 = this._sink;
+        t1.write$1("\"");
+        this.escape$1(object);
+        t1.write$1("\"");
+        return true;
+      } else {
+        t1 = J.getInterceptor(object);
+        if (!!t1.$isList) {
+          this.checkCycle$1(object);
+          t2 = this._sink;
+          t2.write$1("[");
+          if (t1.get$length(object) > 0) {
+            this.stringifyValue$1(t1.$index(object, 0));
+            for (i = 1; i < t1.get$length(object); ++i) {
+              t2._contents += ",";
+              this.stringifyValue$1(t1.$index(object, i));
+            }
+          }
+          t2.write$1("]");
+          this._removeSeen$1(object);
+          return true;
+        } else if (!!t1.$isMap) {
+          this.checkCycle$1(object);
+          t2 = this._sink;
+          t2.write$1("{");
+          for (t3 = J.get$iterator$ax(object.get$keys()), separator = "\""; t3.moveNext$0(); separator = ",\"") {
+            key = t3.get$current();
+            t2._contents += separator;
+            this.escape$1(key);
+            t2._contents += "\":";
+            this.stringifyValue$1(t1.$index(object, key));
+          }
+          t2.write$1("}");
+          this._removeSeen$1(object);
+          return true;
+        } else
+          return false;
+      }
+    },
+    _removeSeen$1: function(object) {
+      var t1 = this._convert$_seen;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    },
+    static: {"^": "_JsonStringifier_BACKSPACE,_JsonStringifier_TAB,_JsonStringifier_NEWLINE,_JsonStringifier_CARRIAGE_RETURN,_JsonStringifier_FORM_FEED,_JsonStringifier_QUOTE,_JsonStringifier_CHAR_0,_JsonStringifier_BACKSLASH,_JsonStringifier_CHAR_b,_JsonStringifier_CHAR_f,_JsonStringifier_CHAR_n,_JsonStringifier_CHAR_r,_JsonStringifier_CHAR_t,_JsonStringifier_CHAR_u", _JsonStringifier__JsonStringifier: function(sink, toEncodable, indent) {
+        return new P._JsonStringifier(toEncodable, sink, []);
+      }, _JsonStringifier_stringify: function(object, toEncodable, indent) {
+        var output;
+        toEncodable = P._defaultToEncodable$closure();
+        output = P.StringBuffer$("");
+        P._JsonStringifier__JsonStringifier(output, toEncodable, indent).stringifyValue$1(object);
+        return output._contents;
+      }}
+  },
+  Utf8Codec: {
+    "^": "Encoding;_allowMalformed",
+    get$name: function(_) {
+      return "utf-8";
+    },
+    get$encoder: function() {
+      return new P.Utf8Encoder();
+    }
+  },
+  Utf8Encoder: {
+    "^": "Converter;",
+    convert$1: function(string) {
+      var t1, t2, encoder;
+      t1 = J.getInterceptor$asx(string);
+      t2 = J.$mul$ns(t1.get$length(string), 3);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      t2 = H.setRuntimeTypeInfo(Array(t2), [P.$int]);
+      encoder = new P._Utf8Encoder(0, 0, t2);
+      if (encoder._fillBuffer$3(string, 0, t1.get$length(string)) !== t1.get$length(string))
+        encoder._writeSurrogate$2(t1.codeUnitAt$1(string, J.$sub$n(t1.get$length(string), 1)), 0);
+      return C.JSArray_methods.sublist$2(t2, 0, encoder._bufferIndex);
+    },
+    $asConverter: function() {
+      return [P.String, [P.List, P.$int]];
+    }
+  },
+  _Utf8Encoder: {
+    "^": "Object;_carry,_bufferIndex,_buffer",
+    _writeSurrogate$2: function(leadingSurrogate, nextCodeUnit) {
+      var t1, t2, rune, t3, t4;
+      t1 = this._buffer;
+      t2 = this._bufferIndex;
+      if ((nextCodeUnit & 64512) === 56320) {
+        rune = 65536 + ((leadingSurrogate & 1023) << 10 >>> 0) | nextCodeUnit & 1023;
+        t3 = t2 + 1;
+        this._bufferIndex = t3;
+        t4 = t1.length;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = (240 | rune >>> 18) >>> 0;
+        t2 = t3 + 1;
+        this._bufferIndex = t2;
+        if (t3 >= t4)
+          return H.ioore(t1, t3);
+        t1[t3] = 128 | rune >>> 12 & 63;
+        t3 = t2 + 1;
+        this._bufferIndex = t3;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = 128 | rune >>> 6 & 63;
+        this._bufferIndex = t3 + 1;
+        if (t3 >= t4)
+          return H.ioore(t1, t3);
+        t1[t3] = 128 | rune & 63;
+        return true;
+      } else {
+        t3 = t2 + 1;
+        this._bufferIndex = t3;
+        t4 = t1.length;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = 224 | leadingSurrogate >>> 12;
+        t2 = t3 + 1;
+        this._bufferIndex = t2;
+        if (t3 >= t4)
+          return H.ioore(t1, t3);
+        t1[t3] = 128 | leadingSurrogate >>> 6 & 63;
+        this._bufferIndex = t2 + 1;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = 128 | leadingSurrogate & 63;
+        return false;
+      }
+    },
+    _fillBuffer$3: function(str, start, end) {
+      var t1, t2, t3, stringIndex, codeUnit, t4, stringIndex0, t5;
+      if (start !== end && (J.codeUnitAt$1$s(str, J.$sub$n(end, 1)) & 64512) === 55296)
+        end = J.$sub$n(end, 1);
+      if (typeof end !== "number")
+        return H.iae(end);
+      t1 = this._buffer;
+      t2 = t1.length;
+      t3 = J.getInterceptor$s(str);
+      stringIndex = start;
+      for (; stringIndex < end; ++stringIndex) {
+        codeUnit = t3.codeUnitAt$1(str, stringIndex);
+        if (codeUnit <= 127) {
+          t4 = this._bufferIndex;
+          if (t4 >= t2)
+            break;
+          this._bufferIndex = t4 + 1;
+          t1[t4] = codeUnit;
+        } else if ((codeUnit & 64512) === 55296) {
+          if (this._bufferIndex + 3 >= t2)
+            break;
+          stringIndex0 = stringIndex + 1;
+          if (this._writeSurrogate$2(codeUnit, t3.codeUnitAt$1(str, stringIndex0)))
+            stringIndex = stringIndex0;
+        } else if (codeUnit <= 2047) {
+          t4 = this._bufferIndex;
+          t5 = t4 + 1;
+          if (t5 >= t2)
+            break;
+          this._bufferIndex = t5;
+          if (t4 >= t2)
+            return H.ioore(t1, t4);
+          t1[t4] = 192 | codeUnit >>> 6;
+          this._bufferIndex = t5 + 1;
+          t1[t5] = 128 | codeUnit & 63;
+        } else {
+          t4 = this._bufferIndex;
+          if (t4 + 2 >= t2)
+            break;
+          t5 = t4 + 1;
+          this._bufferIndex = t5;
+          if (t4 >= t2)
+            return H.ioore(t1, t4);
+          t1[t4] = 224 | codeUnit >>> 12;
+          t4 = t5 + 1;
+          this._bufferIndex = t4;
+          if (t5 >= t2)
+            return H.ioore(t1, t5);
+          t1[t5] = 128 | codeUnit >>> 6 & 63;
+          this._bufferIndex = t4 + 1;
+          if (t4 >= t2)
+            return H.ioore(t1, t4);
+          t1[t4] = 128 | codeUnit & 63;
+        }
+      }
+      return stringIndex;
+    },
+    static: {"^": "_Utf8Encoder__DEFAULT_BYTE_BUFFER_SIZE"}
+  }
+}],
+["dart.core", "dart:core", , P, {
+  "^": "",
+  Function__toMangledNames: function(namedArguments) {
+    return;
+  },
+  Comparable_compare: [function(a, b) {
+    return J.compareTo$1$ns(a, b);
+  }, "call$2", "Comparable_compare$closure", 4, 0, 51, 46, 47],
+  Error_safeToString: function(object) {
+    var buffer, t1, i, t2, codeUnit;
+    if (typeof object === "number" || typeof object === "boolean" || null == object)
+      return J.toString$0(object);
+    if (typeof object === "string") {
+      buffer = new P.StringBuffer("");
+      buffer._contents = "\"";
+      for (t1 = object.length, i = 0, t2 = "\""; i < t1; ++i) {
+        codeUnit = C.JSString_methods.codeUnitAt$1(object, i);
+        if (codeUnit <= 31)
+          if (codeUnit === 10)
+            t2 = buffer._contents += "\\n";
+          else if (codeUnit === 13)
+            t2 = buffer._contents += "\\r";
+          else if (codeUnit === 9)
+            t2 = buffer._contents += "\\t";
+          else {
+            t2 = buffer._contents += "\\x";
+            if (codeUnit < 16)
+              buffer._contents = t2 + "0";
+            else {
+              buffer._contents = t2 + "1";
+              codeUnit -= 16;
+            }
+            t2 = H.Primitives_stringFromCharCode(codeUnit < 10 ? 48 + codeUnit : 87 + codeUnit);
+            t2 = buffer._contents += t2;
+          }
+        else if (codeUnit === 92)
+          t2 = buffer._contents += "\\\\";
+        else if (codeUnit === 34)
+          t2 = buffer._contents += "\\\"";
+        else {
+          t2 = H.Primitives_stringFromCharCode(codeUnit);
+          t2 = buffer._contents += t2;
+        }
+      }
+      t1 = t2 + "\"";
+      buffer._contents = t1;
+      return t1;
+    }
+    return "Instance of '" + H.Primitives_objectTypeName(object) + "'";
+  },
+  Exception_Exception: function(message) {
+    return new P._ExceptionImplementation(message);
+  },
+  identical: [function(a, b) {
+    return a == null ? b == null : a === b;
+  }, "call$2", "identical$closure", 4, 0, 52],
+  identityHashCode: [function(object) {
+    return H.objectHashCode(object);
+  }, "call$1", "identityHashCode$closure", 2, 0, 53],
+  List_List$filled: function($length, fill, $E) {
+    var result, t1, i;
+    result = J.JSArray_JSArray$fixed($length, $E);
+    if ($length !== 0 && true)
+      for (t1 = result.length, i = 0; i < t1; ++i)
+        result[i] = fill;
+    return result;
+  },
+  List_List$from: function(other, growable, $E) {
+    var list, t1;
+    list = H.setRuntimeTypeInfo([], [$E]);
+    for (t1 = J.get$iterator$ax(other); t1.moveNext$0();)
+      list.push(t1.get$current());
+    if (growable)
+      return list;
+    list.fixed$length = init;
+    return list;
+  },
+  print: function(object) {
+    var line, t1;
+    line = H.S(object);
+    t1 = $.printToZone;
+    if (t1 == null)
+      H.printString(line);
+    else
+      t1.call$1(line);
+  },
+  Function__toMangledNames_closure: {
+    "^": "Closure:75;result_0",
+    call$2: function(symbol, value) {
+      this.result_0.$indexSet(0, symbol.get$_name(symbol), value);
+    },
+    $isFunction: true
+  },
+  NoSuchMethodError_toString_closure: {
+    "^": "Closure:121;box_0",
+    call$2: function(key, value) {
+      var t1 = this.box_0;
+      if (t1.i_1 > 0)
+        t1.sb_0.write$1(", ");
+      t1.sb_0.write$1(J.get$_name$x(key));
+      t1.sb_0.write$1(": ");
+      t1.sb_0.write$1(P.Error_safeToString(value));
+      ++t1.i_1;
+    },
+    $isFunction: true
+  },
+  bool: {
+    "^": "Object;",
+    $isbool: true
+  },
+  "+bool": 0,
+  Comparable: {
+    "^": "Object;"
+  },
+  DateTime: {
+    "^": "Object;millisecondsSinceEpoch<,isUtc",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (!J.getInterceptor(other).$isDateTime)
+        return false;
+      return J.$eq(this.millisecondsSinceEpoch, other.millisecondsSinceEpoch) && this.isUtc === other.isUtc;
+    },
+    compareTo$1: function(_, other) {
+      return J.compareTo$1$ns(this.millisecondsSinceEpoch, other.get$millisecondsSinceEpoch());
+    },
+    get$hashCode: function(_) {
+      return this.millisecondsSinceEpoch;
+    },
+    toString$0: function(_) {
+      var t1, y, m, d, h, min, sec, ms;
+      t1 = this.isUtc;
+      y = P.DateTime__fourDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCFullYear() + 0 : H.Primitives_lazyAsJsDate(this).getFullYear() + 0);
+      m = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCMonth() + 1 : H.Primitives_lazyAsJsDate(this).getMonth() + 1);
+      d = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCDate() + 0 : H.Primitives_lazyAsJsDate(this).getDate() + 0);
+      h = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCHours() + 0 : H.Primitives_lazyAsJsDate(this).getHours() + 0);
+      min = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCMinutes() + 0 : H.Primitives_lazyAsJsDate(this).getMinutes() + 0);
+      sec = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCSeconds() + 0 : H.Primitives_lazyAsJsDate(this).getSeconds() + 0);
+      ms = P.DateTime__threeDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCMilliseconds() + 0 : H.Primitives_lazyAsJsDate(this).getMilliseconds() + 0);
+      if (t1)
+        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms + "Z";
+      else
+        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms;
+    },
+    add$1: function(_, duration) {
+      return P.DateTime$fromMillisecondsSinceEpoch(J.$add$ns(this.millisecondsSinceEpoch, duration.get$inMilliseconds()), this.isUtc);
+    },
+    DateTime$_now$0: function() {
+      H.Primitives_lazyAsJsDate(this);
+    },
+    DateTime$fromMillisecondsSinceEpoch$2$isUtc: function(millisecondsSinceEpoch, isUtc) {
+      if (J.abs$0$n(millisecondsSinceEpoch) > 8640000000000000)
+        throw H.wrapException(P.ArgumentError$(millisecondsSinceEpoch));
+    },
+    $isDateTime: true,
+    static: {"^": "DateTime_MONDAY,DateTime_TUESDAY,DateTime_WEDNESDAY,DateTime_THURSDAY,DateTime_FRIDAY,DateTime_SATURDAY,DateTime_SUNDAY,DateTime_DAYS_PER_WEEK,DateTime_JANUARY,DateTime_FEBRUARY,DateTime_MARCH,DateTime_APRIL,DateTime_MAY,DateTime_JUNE,DateTime_JULY,DateTime_AUGUST,DateTime_SEPTEMBER,DateTime_OCTOBER,DateTime_NOVEMBER,DateTime_DECEMBER,DateTime_MONTHS_PER_YEAR,DateTime__MAX_MILLISECONDS_SINCE_EPOCH", DateTime_parse: function(formattedString) {
+        var match, t1, t2, years, month, day, hour, minute, second, millisecond, addOneMillisecond, t3, sign, hourDifference, minuteDifference, isUtc, millisecondsSinceEpoch;
+        match = new H.JSSyntaxRegExp("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$", H.JSSyntaxRegExp_makeNative("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$", false, true, false), null, null).firstMatch$1(formattedString);
+        if (match != null) {
+          t1 = new P.DateTime_parse_parseIntOrZero();
+          t2 = match._match;
+          if (1 >= t2.length)
+            return H.ioore(t2, 1);
+          years = H.Primitives_parseInt(t2[1], null, null);
+          if (2 >= t2.length)
+            return H.ioore(t2, 2);
+          month = H.Primitives_parseInt(t2[2], null, null);
+          if (3 >= t2.length)
+            return H.ioore(t2, 3);
+          day = H.Primitives_parseInt(t2[3], null, null);
+          if (4 >= t2.length)
+            return H.ioore(t2, 4);
+          hour = t1.call$1(t2[4]);
+          if (5 >= t2.length)
+            return H.ioore(t2, 5);
+          minute = t1.call$1(t2[5]);
+          if (6 >= t2.length)
+            return H.ioore(t2, 6);
+          second = t1.call$1(t2[6]);
+          if (7 >= t2.length)
+            return H.ioore(t2, 7);
+          millisecond = J.round$0$n(J.$mul$ns(new P.DateTime_parse_parseDoubleOrZero().call$1(t2[7]), 1000));
+          if (millisecond === 1000) {
+            addOneMillisecond = true;
+            millisecond = 999;
+          } else
+            addOneMillisecond = false;
+          t3 = t2.length;
+          if (8 >= t3)
+            return H.ioore(t2, 8);
+          if (t2[8] != null) {
+            if (9 >= t3)
+              return H.ioore(t2, 9);
+            t3 = t2[9];
+            if (t3 != null) {
+              sign = J.$eq(t3, "-") ? -1 : 1;
+              if (10 >= t2.length)
+                return H.ioore(t2, 10);
+              hourDifference = H.Primitives_parseInt(t2[10], null, null);
+              if (11 >= t2.length)
+                return H.ioore(t2, 11);
+              minuteDifference = t1.call$1(t2[11]);
+              if (typeof hourDifference !== "number")
+                return H.iae(hourDifference);
+              minuteDifference = J.$add$ns(minuteDifference, 60 * hourDifference);
+              if (typeof minuteDifference !== "number")
+                return H.iae(minuteDifference);
+              minute = J.$sub$n(minute, sign * minuteDifference);
+            }
+            isUtc = true;
+          } else
+            isUtc = false;
+          millisecondsSinceEpoch = H.Primitives_valueFromDecomposedDate(years, month, day, hour, minute, second, millisecond, isUtc);
+          return P.DateTime$fromMillisecondsSinceEpoch(addOneMillisecond ? millisecondsSinceEpoch + 1 : millisecondsSinceEpoch, isUtc);
+        } else
+          throw H.wrapException(P.FormatException$(formattedString));
+      }, DateTime$fromMillisecondsSinceEpoch: function(millisecondsSinceEpoch, isUtc) {
+        var t1 = new P.DateTime(millisecondsSinceEpoch, isUtc);
+        t1.DateTime$fromMillisecondsSinceEpoch$2$isUtc(millisecondsSinceEpoch, isUtc);
+        return t1;
+      }, DateTime__fourDigits: function(n) {
+        var absN, sign;
+        absN = Math.abs(n);
+        sign = n < 0 ? "-" : "";
+        if (absN >= 1000)
+          return "" + n;
+        if (absN >= 100)
+          return sign + "0" + H.S(absN);
+        if (absN >= 10)
+          return sign + "00" + H.S(absN);
+        return sign + "000" + H.S(absN);
+      }, DateTime__threeDigits: function(n) {
+        if (n >= 100)
+          return "" + n;
+        if (n >= 10)
+          return "0" + n;
+        return "00" + n;
+      }, DateTime__twoDigits: function(n) {
+        if (n >= 10)
+          return "" + n;
+        return "0" + n;
+      }}
+  },
+  DateTime_parse_parseIntOrZero: {
+    "^": "Closure:122;",
+    call$1: function(matched) {
+      if (matched == null)
+        return 0;
+      return H.Primitives_parseInt(matched, null, null);
+    },
+    $isFunction: true
+  },
+  DateTime_parse_parseDoubleOrZero: {
+    "^": "Closure:123;",
+    call$1: function(matched) {
+      if (matched == null)
+        return 0;
+      return H.Primitives_parseDouble(matched, null);
+    },
+    $isFunction: true
+  },
+  $double: {
+    "^": "num;",
+    $is$double: true
+  },
+  "+double": 0,
+  Duration: {
+    "^": "Object;_duration<",
+    $add: function(_, other) {
+      return P.Duration$(0, 0, this._duration + other.get$_duration(), 0, 0, 0);
+    },
+    $sub: function(_, other) {
+      return P.Duration$(0, 0, this._duration - other.get$_duration(), 0, 0, 0);
+    },
+    $mul: function(_, factor) {
+      if (typeof factor !== "number")
+        return H.iae(factor);
+      return P.Duration$(0, 0, C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(this._duration * factor)), 0, 0, 0);
+    },
+    $tdiv: function(_, quotient) {
+      if (J.$eq(quotient, 0))
+        throw H.wrapException(P.IntegerDivisionByZeroException$());
+      if (typeof quotient !== "number")
+        return H.iae(quotient);
+      return P.Duration$(0, 0, C.JSNumber_methods.$tdiv(this._duration, quotient), 0, 0, 0);
+    },
+    $lt: function(_, other) {
+      return this._duration < other.get$_duration();
+    },
+    $gt: function(_, other) {
+      return this._duration > other.get$_duration();
+    },
+    $le: function(_, other) {
+      return this._duration <= other.get$_duration();
+    },
+    $ge: function(_, other) {
+      return this._duration >= other.get$_duration();
+    },
+    get$inMilliseconds: function() {
+      return C.JSNumber_methods._tdivFast$1(this._duration, 1000);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (!J.getInterceptor(other).$isDuration)
+        return false;
+      return this._duration === other._duration;
+    },
+    get$hashCode: function(_) {
+      return this._duration & 0x1FFFFFFF;
+    },
+    compareTo$1: function(_, other) {
+      return C.JSNumber_methods.compareTo$1(this._duration, other.get$_duration());
+    },
+    toString$0: function(_) {
+      var t1, t2, twoDigitMinutes, twoDigitSeconds, sixDigitUs;
+      t1 = new P.Duration_toString_twoDigits();
+      t2 = this._duration;
+      if (t2 < 0)
+        return "-" + P.Duration$(0, 0, -t2, 0, 0, 0).toString$0(0);
+      twoDigitMinutes = t1.call$1(C.JSNumber_methods.remainder$1(C.JSNumber_methods._tdivFast$1(t2, 60000000), 60));
+      twoDigitSeconds = t1.call$1(C.JSNumber_methods.remainder$1(C.JSNumber_methods._tdivFast$1(t2, 1000000), 60));
+      sixDigitUs = new P.Duration_toString_sixDigits().call$1(C.JSNumber_methods.remainder$1(t2, 1000000));
+      return H.S(C.JSNumber_methods._tdivFast$1(t2, 3600000000)) + ":" + H.S(twoDigitMinutes) + ":" + H.S(twoDigitSeconds) + "." + H.S(sixDigitUs);
+    },
+    $isDuration: true,
+    static: {"^": "Duration_MICROSECONDS_PER_MILLISECOND,Duration_MILLISECONDS_PER_SECOND,Duration_SECONDS_PER_MINUTE,Duration_MINUTES_PER_HOUR,Duration_HOURS_PER_DAY,Duration_MICROSECONDS_PER_SECOND,Duration_MICROSECONDS_PER_MINUTE,Duration_MICROSECONDS_PER_HOUR,Duration_MICROSECONDS_PER_DAY,Duration_MILLISECONDS_PER_MINUTE,Duration_MILLISECONDS_PER_HOUR,Duration_MILLISECONDS_PER_DAY,Duration_SECONDS_PER_HOUR,Duration_SECONDS_PER_DAY,Duration_MINUTES_PER_DAY,Duration_ZERO", Duration$: function(days, hours, microseconds, milliseconds, minutes, seconds) {
+        return new P.Duration(days * 86400000000 + hours * 3600000000 + minutes * 60000000 + seconds * 1000000 + milliseconds * 1000 + microseconds);
+      }}
+  },
+  Duration_toString_sixDigits: {
+    "^": "Closure:15;",
+    call$1: function(n) {
+      if (n >= 100000)
+        return H.S(n);
+      if (n >= 10000)
+        return "0" + H.S(n);
+      if (n >= 1000)
+        return "00" + H.S(n);
+      if (n >= 100)
+        return "000" + H.S(n);
+      if (n >= 10)
+        return "0000" + H.S(n);
+      return "00000" + H.S(n);
+    },
+    $isFunction: true
+  },
+  Duration_toString_twoDigits: {
+    "^": "Closure:15;",
+    call$1: function(n) {
+      if (n >= 10)
+        return H.S(n);
+      return "0" + H.S(n);
+    },
+    $isFunction: true
+  },
+  Error: {
+    "^": "Object;",
+    get$stackTrace: function() {
+      return new H._StackTrace(this.$thrownJsError, null);
+    },
+    $isError: true
+  },
+  NullThrownError: {
+    "^": "Error;",
+    toString$0: function(_) {
+      return "Throw of null.";
+    }
+  },
+  ArgumentError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      var t1 = this.message;
+      if (t1 != null)
+        return "Illegal argument(s): " + H.S(t1);
+      return "Illegal argument(s)";
+    },
+    static: {ArgumentError$: function(message) {
+        return new P.ArgumentError(message);
+      }}
+  },
+  RangeError: {
+    "^": "ArgumentError;message",
+    toString$0: function(_) {
+      return "RangeError: " + H.S(this.message);
+    },
+    static: {RangeError$: function(message) {
+        return new P.RangeError(message);
+      }, RangeError$value: function(value) {
+        return new P.RangeError("value " + H.S(value));
+      }, RangeError$range: function(value, start, end) {
+        return new P.RangeError("value " + H.S(value) + " not in range " + H.S(start) + ".." + H.S(end));
+      }}
+  },
+  FallThroughError: {
+    "^": "Error;",
+    static: {FallThroughError$: function() {
+        return new P.FallThroughError();
+      }}
+  },
+  NoSuchMethodError: {
+    "^": "Error;_core$_receiver,_memberName,_core$_arguments,_namedArguments,_existingArgumentNames",
+    toString$0: function(_) {
+      var t1, t2, t3, t4, t5, str;
+      t1 = {};
+      t1.sb_0 = P.StringBuffer$("");
+      t1.i_1 = 0;
+      for (t2 = this._core$_arguments, t3 = 0; t4 = t2.length, t3 < t4; t3 = ++t1.i_1) {
+        if (t3 > 0) {
+          t5 = t1.sb_0;
+          t5._contents += ", ";
+        }
+        t5 = t1.sb_0;
+        if (t3 < 0)
+          return H.ioore(t2, t3);
+        str = P.Error_safeToString(t2[t3]);
+        t5._contents += typeof str === "string" ? str : H.S(str);
+      }
+      this._namedArguments.forEach$1(0, new P.NoSuchMethodError_toString_closure(t1));
+      return "NoSuchMethodError : method not found: '" + this._memberName.toString$0(0) + "'\nReceiver: " + H.S(P.Error_safeToString(this._core$_receiver)) + "\nArguments: [" + t1.sb_0._contents + "]";
+    },
+    $isNoSuchMethodError: true,
+    static: {NoSuchMethodError$: function(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames) {
+        return new P.NoSuchMethodError(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames);
+      }}
+  },
+  UnsupportedError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return "Unsupported operation: " + this.message;
+    },
+    static: {UnsupportedError$: function(message) {
+        return new P.UnsupportedError(message);
+      }}
+  },
+  UnimplementedError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      var t1 = this.message;
+      return t1 != null ? "UnimplementedError: " + H.S(t1) : "UnimplementedError";
+    },
+    $isError: true,
+    static: {UnimplementedError$: function(message) {
+        return new P.UnimplementedError(message);
+      }}
+  },
+  StateError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return "Bad state: " + this.message;
+    },
+    static: {StateError$: function(message) {
+        return new P.StateError(message);
+      }}
+  },
+  ConcurrentModificationError: {
+    "^": "Error;modifiedObject",
+    toString$0: function(_) {
+      var t1 = this.modifiedObject;
+      if (t1 == null)
+        return "Concurrent modification during iteration.";
+      return "Concurrent modification during iteration: " + H.S(P.Error_safeToString(t1)) + ".";
+    },
+    static: {ConcurrentModificationError$: function(modifiedObject) {
+        return new P.ConcurrentModificationError(modifiedObject);
+      }}
+  },
+  OutOfMemoryError: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Out of Memory";
+    },
+    get$stackTrace: function() {
+      return;
+    },
+    $isError: true
+  },
+  StackOverflowError: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Stack Overflow";
+    },
+    get$stackTrace: function() {
+      return;
+    },
+    $isError: true
+  },
+  CyclicInitializationError: {
+    "^": "Error;variableName",
+    toString$0: function(_) {
+      return "Reading static variable '" + this.variableName + "' during its initialization";
+    },
+    static: {CyclicInitializationError$: function(variableName) {
+        return new P.CyclicInitializationError(variableName);
+      }}
+  },
+  _ExceptionImplementation: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      var t1 = this.message;
+      if (t1 == null)
+        return "Exception";
+      return "Exception: " + H.S(t1);
+    }
+  },
+  FormatException: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      return "FormatException: " + H.S(this.message);
+    },
+    static: {FormatException$: function(message) {
+        return new P.FormatException(message);
+      }}
+  },
+  IntegerDivisionByZeroException: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "IntegerDivisionByZeroException";
+    },
+    static: {IntegerDivisionByZeroException$: function() {
+        return new P.IntegerDivisionByZeroException();
+      }}
+  },
+  Expando: {
+    "^": "Object;name>",
+    toString$0: function(_) {
+      return "Expando:" + H.S(this.name);
+    },
+    $index: function(_, object) {
+      var values = H.Primitives_getProperty(object, "expando$values");
+      return values == null ? null : H.Primitives_getProperty(values, this._getKey$0());
+    },
+    $indexSet: function(_, object, value) {
+      var values = H.Primitives_getProperty(object, "expando$values");
+      if (values == null) {
+        values = new P.Object();
+        H.Primitives_setProperty(object, "expando$values", values);
+      }
+      H.Primitives_setProperty(values, this._getKey$0(), value);
+    },
+    _getKey$0: function() {
+      var key, t1;
+      key = H.Primitives_getProperty(this, "expando$key");
+      if (key == null) {
+        t1 = $.Expando__keyCount;
+        $.Expando__keyCount = t1 + 1;
+        key = "expando$key$" + t1;
+        H.Primitives_setProperty(this, "expando$key", key);
+      }
+      return key;
+    },
+    static: {"^": "Expando__KEY_PROPERTY_NAME,Expando__EXPANDO_PROPERTY_NAME,Expando__keyCount"}
+  },
+  Function: {
+    "^": "Object;",
+    $isFunction: true
+  },
+  $int: {
+    "^": "num;",
+    $is$int: true
+  },
+  "+int": 0,
+  Iterable: {
+    "^": "Object;",
+    $isIterable: true,
+    $asIterable: null
+  },
+  Iterator: {
+    "^": "Object;"
+  },
+  List: {
+    "^": "Object;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  "+List": 0,
+  Map: {
+    "^": "Object;",
+    $isMap: true
+  },
+  Null: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "null";
+    }
+  },
+  "+Null": 0,
+  num: {
+    "^": "Object;",
+    $isnum: true
+  },
+  "+num": 0,
+  Object: {
+    "^": ";",
+    $eq: function(_, other) {
+      return this === other;
+    },
+    get$hashCode: function(_) {
+      return H.Primitives_objectHashCode(this);
+    },
+    toString$0: function(_) {
+      return H.Primitives_objectToString(this);
+    },
+    noSuchMethod$1: function(_, invocation) {
+      throw H.wrapException(P.NoSuchMethodError$(this, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments(), null));
+    },
+    get$runtimeType: function(_) {
+      return new H.TypeImpl(H.getRuntimeTypeString(this), null);
+    },
+    $isObject: true
+  },
+  Match: {
+    "^": "Object;",
+    $isMatch: true
+  },
+  StackTrace: {
+    "^": "Object;"
+  },
+  Stopwatch: {
+    "^": "Object;frequency,_core$_start,_stop",
+    start$0: function(_) {
+      var t1, t2, t3;
+      t1 = this._core$_start == null;
+      if (!t1 && this._stop == null)
+        return;
+      if (t1)
+        this._core$_start = H.Primitives_numMicroseconds();
+      else {
+        t1 = H.Primitives_numMicroseconds();
+        t2 = this._stop;
+        t3 = this._core$_start;
+        if (typeof t2 !== "number")
+          return t2.$sub();
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        this._core$_start = t1 - (t2 - t3);
+        this._stop = null;
+      }
+    }
+  },
+  String: {
+    "^": "Object;",
+    $isString: true
+  },
+  "+String": 0,
+  RuneIterator: {
+    "^": "Object;string,_core$_position,_nextPosition,_currentCodePoint",
+    get$current: function() {
+      return this._currentCodePoint;
+    },
+    moveNext$0: function() {
+      var t1, t2, t3, codeUnit, nextPosition, nextCodeUnit;
+      t1 = this._nextPosition;
+      this._core$_position = t1;
+      t2 = this.string;
+      t3 = t2.length;
+      if (t1 === t3) {
+        this._currentCodePoint = null;
+        return false;
+      }
+      codeUnit = C.JSString_methods.codeUnitAt$1(t2, t1);
+      nextPosition = this._core$_position + 1;
+      if ((codeUnit & 64512) === 55296 && nextPosition < t3) {
+        nextCodeUnit = C.JSString_methods.codeUnitAt$1(t2, nextPosition);
+        if ((nextCodeUnit & 64512) === 56320) {
+          this._nextPosition = nextPosition + 1;
+          this._currentCodePoint = 65536 + ((codeUnit & 1023) << 10 >>> 0) + (nextCodeUnit & 1023);
+          return true;
+        }
+      }
+      this._nextPosition = nextPosition;
+      this._currentCodePoint = codeUnit;
+      return true;
+    }
+  },
+  StringBuffer: {
+    "^": "Object;_contents<",
+    get$length: function(_) {
+      return this._contents.length;
+    },
+    get$isEmpty: function(_) {
+      return this._contents.length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._contents.length !== 0;
+    },
+    write$1: function(obj) {
+      this._contents += typeof obj === "string" ? obj : H.S(obj);
+    },
+    writeAll$2: function(objects, separator) {
+      var iterator, str;
+      iterator = J.get$iterator$ax(objects);
+      if (!iterator.moveNext$0())
+        return;
+      if (separator.length === 0)
+        do {
+          str = iterator.get$current();
+          this._contents += typeof str === "string" ? str : H.S(str);
+        } while (iterator.moveNext$0());
+      else {
+        this.write$1(iterator.get$current());
+        for (; iterator.moveNext$0();) {
+          this._contents += separator;
+          str = iterator.get$current();
+          this._contents += typeof str === "string" ? str : H.S(str);
+        }
+      }
+    },
+    clear$0: function(_) {
+      this._contents = "";
+    },
+    toString$0: function(_) {
+      return this._contents;
+    },
+    StringBuffer$1: function($content) {
+      if (typeof $content === "string")
+        this._contents = $content;
+      else
+        this.write$1($content);
+    },
+    static: {StringBuffer$: function($content) {
+        var t1 = new P.StringBuffer("");
+        t1.StringBuffer$1($content);
+        return t1;
+      }}
+  },
+  Symbol: {
+    "^": "Object;",
+    $isSymbol: true
+  },
+  Type: {
+    "^": "Object;",
+    $isType: true
+  },
+  Uri: {
+    "^": "Object;_host,_port,_path,scheme,userInfo,query,fragment,_pathSegments,_queryParameters",
+    get$host: function(_) {
+      var t1;
+      if (C.JSString_methods.startsWith$1(this._host, "[")) {
+        t1 = this._host;
+        return C.JSString_methods.substring$2(t1, 1, t1.length - 1);
+      }
+      return this._host;
+    },
+    get$port: function(_) {
+      var t1;
+      if (J.$eq(this._port, 0)) {
+        t1 = this.scheme;
+        if (t1 === "http")
+          return 80;
+        if (t1 === "https")
+          return 443;
+      }
+      return this._port;
+    },
+    get$path: function(_) {
+      return this._path;
+    },
+    _makePath$2: function(path, pathSegments) {
+      var t1, result;
+      t1 = path == null;
+      if (t1 && true)
+        return "";
+      t1 = !t1;
+      if (t1)
+        ;
+      result = t1 ? P.Uri__normalize(path) : C.JSNull_methods.map$1(pathSegments, new P.Uri__makePath_closure()).join$1(0, "/");
+      if ((this.get$host(this) !== "" || this.scheme === "file") && J.getInterceptor$asx(result).get$isNotEmpty(result) && !C.JSString_methods.startsWith$1(result, "/"))
+        return "/" + H.S(result);
+      return result;
+    },
+    _merge$2: function(base, reference) {
+      if (base === "")
+        return "/" + H.S(reference);
+      return C.JSString_methods.substring$2(base, 0, J.getInterceptor$asx(base).lastIndexOf$1(base, "/") + 1) + H.S(reference);
+    },
+    _hasDotSegments$1: function(path) {
+      if (path.length > 0 && J.codeUnitAt$1$s(path, 0) === 58)
+        return true;
+      return J.indexOf$1$asx(path, "/.") !== -1;
+    },
+    _removeDotSegments$1: function(path) {
+      var output, t1, appendSlash, segment, t2;
+      if (!this._hasDotSegments$1(path))
+        return path;
+      output = [];
+      for (t1 = path.split("/"), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]), appendSlash = false; t1.moveNext$0();) {
+        segment = t1._current;
+        if (J.$eq(segment, "..")) {
+          t2 = output.length;
+          if (t2 !== 0)
+            if (t2 === 1) {
+              if (0 >= t2)
+                return H.ioore(output, 0);
+              t2 = !J.$eq(output[0], "");
+            } else
+              t2 = true;
+          else
+            t2 = false;
+          if (t2) {
+            if (0 >= output.length)
+              return H.ioore(output, 0);
+            output.pop();
+          }
+          appendSlash = true;
+        } else if ("." === segment)
+          appendSlash = true;
+        else {
+          output.push(segment);
+          appendSlash = false;
+        }
+      }
+      if (appendSlash)
+        output.push("");
+      return C.JSArray_methods.join$1(output, "/");
+    },
+    toString$0: function(_) {
+      var sb, t1;
+      sb = P.StringBuffer$("");
+      t1 = this.scheme;
+      if ("" !== t1) {
+        sb.write$1(t1);
+        sb.write$1(":");
+      }
+      if (this.get$host(this) !== "" || t1 === "file") {
+        sb.write$1("//");
+        t1 = this.userInfo;
+        if ("" !== t1) {
+          sb.write$1(t1);
+          sb.write$1("@");
+        }
+        sb.write$1(this._host);
+        if (!J.$eq(this._port, 0)) {
+          sb.write$1(":");
+          sb.write$1(J.toString$0(this._port));
+        }
+      }
+      sb.write$1(this._path);
+      t1 = this.query;
+      if ("" !== t1) {
+        sb.write$1("?");
+        sb.write$1(t1);
+      }
+      t1 = this.fragment;
+      if ("" !== t1) {
+        sb.write$1("#");
+        sb.write$1(t1);
+      }
+      return sb._contents;
+    },
+    $eq: function(_, other) {
+      var t1, t2, t3;
+      if (other == null)
+        return false;
+      t1 = J.getInterceptor(other);
+      if (!t1.$isUri)
+        return false;
+      t2 = this.scheme;
+      t3 = other.scheme;
+      if (t2 == null ? t3 == null : t2 === t3)
+        if (this.userInfo === other.userInfo)
+          if (this.get$host(this) === t1.get$host(other))
+            if (J.$eq(this.get$port(this), t1.get$port(other))) {
+              t1 = this._path;
+              t2 = other._path;
+              if (t1 == null ? t2 == null : t1 === t2) {
+                t1 = this.query;
+                t2 = other.query;
+                if (t1 == null ? t2 == null : t1 === t2) {
+                  t1 = this.fragment;
+                  t2 = other.fragment;
+                  t2 = t1 == null ? t2 == null : t1 === t2;
+                  t1 = t2;
+                } else
+                  t1 = false;
+              } else
+                t1 = false;
+            } else
+              t1 = false;
+          else
+            t1 = false;
+        else
+          t1 = false;
+      else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = new P.Uri_hashCode_combine();
+      return t1.call$2(this.scheme, t1.call$2(this.userInfo, t1.call$2(this.get$host(this), t1.call$2(this.get$port(this), t1.call$2(this._path, t1.call$2(this.query, t1.call$2(this.fragment, 1)))))));
+    },
+    Uri$9$fragment$host$path$pathSegments$port$query$queryParameters$scheme$userInfo: function(fragment, host, path, pathSegments, port, query, queryParameters, scheme, userInfo) {
+      if (scheme === "http" && J.$eq(port, 80))
+        this._port = 0;
+      else if (scheme === "https" && J.$eq(port, 443))
+        this._port = 0;
+      else
+        this._port = port;
+      this._path = this._makePath$2(path, pathSegments);
+    },
+    $isUri: true,
+    static: {"^": "Uri__SPACE,Uri__DOUBLE_QUOTE,Uri__NUMBER_SIGN,Uri__PERCENT,Uri__ASTERISK,Uri__PLUS,Uri__SLASH,Uri__ZERO,Uri__NINE,Uri__COLON,Uri__LESS,Uri__GREATER,Uri__QUESTION,Uri__AT_SIGN,Uri__UPPER_CASE_A,Uri__UPPER_CASE_F,Uri__UPPER_CASE_Z,Uri__LEFT_BRACKET,Uri__BACKSLASH,Uri__RIGHT_BRACKET,Uri__LOWER_CASE_A,Uri__LOWER_CASE_F,Uri__LOWER_CASE_Z,Uri__BAR,Uri__unreservedTable,Uri__unreserved2396Table,Uri__encodeFullTable,Uri__schemeTable,Uri__schemeLowerTable,Uri__subDelimitersTable,Uri__regNameTable,Uri__pathCharTable,Uri__queryCharTable", Uri_parse: function(uri) {
+        var port, portStr, t1, t2, $length, index, schemeEndIndex, index0, codeUnit, t3, authorityEndIndex, portIndex, userInfoEndIndex, authorityEndIndex0, pathEndIndex, pathEndIndex0, queryEndIndex, queryEndIndex0, scheme, startIndex, userInfo, exception, host, path, query, fragment;
+        t1 = new P.Uri_parse_isRegName();
+        t2 = new P.Uri_parse_ipV6Address(uri);
+        $length = uri.length;
+        if ($length === 0)
+          return P.Uri$("", "", null, null, 0, null, null, null, "");
+        if (J.codeUnitAt$1$s(uri, 0) !== 47)
+          for (index = 0; schemeEndIndex = 0, index < $length; index = index0) {
+            index0 = index + 1;
+            if (index >= $length)
+              H.throwExpression(P.RangeError$value(index));
+            codeUnit = uri.charCodeAt(index);
+            if (codeUnit < 128) {
+              t3 = codeUnit >>> 4;
+              if (t3 >= 8)
+                return H.ioore(C.List_JYB, t3);
+              t3 = (C.List_JYB[t3] & C.JSInt_methods._shlPositive$1(1, codeUnit & 15)) !== 0;
+            } else
+              t3 = false;
+            if (!t3) {
+              if (codeUnit === 58) {
+                schemeEndIndex = index0;
+                index = schemeEndIndex;
+              } else {
+                index = index0 - 1;
+                schemeEndIndex = 0;
+              }
+              break;
+            }
+          }
+        else {
+          index = 0;
+          schemeEndIndex = 0;
+        }
+        if (schemeEndIndex === index) {
+          t3 = schemeEndIndex + 1;
+          t3 = t3 < $length && C.JSString_methods.codeUnitAt$1(uri, schemeEndIndex) === 47 && C.JSString_methods.codeUnitAt$1(uri, t3) === 47;
+        } else
+          t3 = false;
+        if (t3) {
+          authorityEndIndex = schemeEndIndex + 2;
+          for (portIndex = -1; t3 = J.getInterceptor$n(authorityEndIndex), userInfoEndIndex = -1, t3.$lt(authorityEndIndex, $length);) {
+            authorityEndIndex0 = t3.$add(authorityEndIndex, 1);
+            if (typeof authorityEndIndex !== "number" || Math.floor(authorityEndIndex) !== authorityEndIndex)
+              H.throwExpression(P.ArgumentError$(authorityEndIndex));
+            if (t3.$lt(authorityEndIndex, 0))
+              H.throwExpression(P.RangeError$value(authorityEndIndex));
+            if (t3.$ge(authorityEndIndex, $length))
+              H.throwExpression(P.RangeError$value(authorityEndIndex));
+            codeUnit = uri.charCodeAt(authorityEndIndex);
+            if (t1.call$1(codeUnit) !== true)
+              if (codeUnit === 91)
+                authorityEndIndex = t2.call$1(authorityEndIndex0);
+              else {
+                if (J.$eq(portIndex, -1) && codeUnit === 58)
+                  ;
+                else {
+                  t3 = codeUnit === 64 || codeUnit === 58;
+                  authorityEndIndex = authorityEndIndex0 - 1;
+                  if (t3) {
+                    userInfoEndIndex = C.JSString_methods.indexOf$2(uri, "@", authorityEndIndex);
+                    if (userInfoEndIndex === -1) {
+                      authorityEndIndex = index;
+                      break;
+                    }
+                    authorityEndIndex = userInfoEndIndex + 1;
+                    for (portIndex = -1; t3 = J.getInterceptor$n(authorityEndIndex), t3.$lt(authorityEndIndex, $length);) {
+                      authorityEndIndex0 = t3.$add(authorityEndIndex, 1);
+                      if (typeof authorityEndIndex !== "number" || Math.floor(authorityEndIndex) !== authorityEndIndex)
+                        H.throwExpression(P.ArgumentError$(authorityEndIndex));
+                      if (t3.$lt(authorityEndIndex, 0))
+                        H.throwExpression(P.RangeError$value(authorityEndIndex));
+                      if (t3.$ge(authorityEndIndex, $length))
+                        H.throwExpression(P.RangeError$value(authorityEndIndex));
+                      codeUnit = uri.charCodeAt(authorityEndIndex);
+                      if (t1.call$1(codeUnit) !== true)
+                        if (codeUnit === 91)
+                          authorityEndIndex = t2.call$1(authorityEndIndex0);
+                        else {
+                          if (codeUnit === 58) {
+                            if (!J.$eq(portIndex, -1))
+                              throw H.wrapException(P.FormatException$("Double port in host"));
+                          } else {
+                            authorityEndIndex = authorityEndIndex0 - 1;
+                            break;
+                          }
+                          authorityEndIndex = authorityEndIndex0;
+                          portIndex = authorityEndIndex;
+                        }
+                      else
+                        authorityEndIndex = authorityEndIndex0;
+                    }
+                    break;
+                  } else {
+                    userInfoEndIndex = -1;
+                    break;
+                  }
+                }
+                authorityEndIndex = authorityEndIndex0;
+                portIndex = authorityEndIndex;
+              }
+            else
+              authorityEndIndex = authorityEndIndex0;
+          }
+        } else {
+          authorityEndIndex = schemeEndIndex;
+          userInfoEndIndex = -1;
+          portIndex = -1;
+        }
+        for (pathEndIndex = authorityEndIndex; t1 = J.getInterceptor$n(pathEndIndex), t1.$lt(pathEndIndex, $length); pathEndIndex = pathEndIndex0) {
+          pathEndIndex0 = t1.$add(pathEndIndex, 1);
+          if (typeof pathEndIndex !== "number" || Math.floor(pathEndIndex) !== pathEndIndex)
+            H.throwExpression(P.ArgumentError$(pathEndIndex));
+          if (t1.$lt(pathEndIndex, 0))
+            H.throwExpression(P.RangeError$value(pathEndIndex));
+          if (t1.$ge(pathEndIndex, $length))
+            H.throwExpression(P.RangeError$value(pathEndIndex));
+          codeUnit = uri.charCodeAt(pathEndIndex);
+          if (codeUnit === 63 || codeUnit === 35) {
+            pathEndIndex = pathEndIndex0 - 1;
+            break;
+          }
+        }
+        t1 = J.getInterceptor$n(pathEndIndex);
+        if (t1.$lt(pathEndIndex, $length) && C.JSString_methods.codeUnitAt$1(uri, pathEndIndex) === 63)
+          for (queryEndIndex = pathEndIndex; t2 = J.getInterceptor$n(queryEndIndex), t2.$lt(queryEndIndex, $length); queryEndIndex = queryEndIndex0) {
+            queryEndIndex0 = t2.$add(queryEndIndex, 1);
+            if (typeof queryEndIndex !== "number" || Math.floor(queryEndIndex) !== queryEndIndex)
+              H.throwExpression(P.ArgumentError$(queryEndIndex));
+            if (t2.$lt(queryEndIndex, 0))
+              H.throwExpression(P.RangeError$value(queryEndIndex));
+            if (t2.$ge(queryEndIndex, $length))
+              H.throwExpression(P.RangeError$value(queryEndIndex));
+            if (uri.charCodeAt(queryEndIndex) === 35) {
+              queryEndIndex = queryEndIndex0 - 1;
+              break;
+            }
+          }
+        else
+          queryEndIndex = pathEndIndex;
+        scheme = schemeEndIndex > 0 ? C.JSString_methods.substring$2(uri, 0, schemeEndIndex - 1) : null;
+        port = 0;
+        if (schemeEndIndex !== authorityEndIndex) {
+          startIndex = schemeEndIndex + 2;
+          if (userInfoEndIndex > 0) {
+            userInfo = C.JSString_methods.substring$2(uri, startIndex, userInfoEndIndex);
+            startIndex = userInfoEndIndex + 1;
+          } else
+            userInfo = "";
+          t2 = J.getInterceptor$n(portIndex);
+          if (t2.$gt(portIndex, 0)) {
+            portStr = C.JSString_methods.substring$2(uri, portIndex, authorityEndIndex);
+            try {
+              port = H.Primitives_parseInt(portStr, null, null);
+            } catch (exception) {
+              H.unwrapException(exception);
+              throw H.wrapException(P.FormatException$("Invalid port: '" + H.S(portStr) + "'"));
+            }
+
+            host = C.JSString_methods.substring$2(uri, startIndex, t2.$sub(portIndex, 1));
+          } else
+            host = C.JSString_methods.substring$2(uri, startIndex, authorityEndIndex);
+        } else {
+          host = "";
+          userInfo = "";
+        }
+        path = C.JSString_methods.substring$2(uri, authorityEndIndex, pathEndIndex);
+        query = t1.$lt(pathEndIndex, queryEndIndex) ? C.JSString_methods.substring$2(uri, t1.$add(pathEndIndex, 1), queryEndIndex) : "";
+        t1 = J.getInterceptor$n(queryEndIndex);
+        fragment = t1.$lt(queryEndIndex, $length) ? C.JSString_methods.substring$2(uri, t1.$add(queryEndIndex, 1), $length) : "";
+        return P.Uri$(fragment, host, path, null, port, query, null, scheme, userInfo);
+      }, Uri$: function(fragment, host, path, pathSegments, port, query, queryParameters, scheme, userInfo) {
+        var t1 = P.Uri__makeScheme(scheme);
+        t1 = new P.Uri(P.Uri__makeHost(host), null, null, t1, userInfo, P.Uri__makeQuery(query, queryParameters), P.Uri__makeFragment(fragment), null, null);
+        t1.Uri$9$fragment$host$path$pathSegments$port$query$queryParameters$scheme$userInfo(fragment, host, path, pathSegments, port, query, queryParameters, scheme, userInfo);
+        return t1;
+      }, Uri__makeHost: function(host) {
+        var t1, i;
+        if (host.length === 0)
+          return host;
+        if (C.JSString_methods.codeUnitAt$1(host, 0) === 91) {
+          t1 = host.length - 1;
+          if (C.JSString_methods.codeUnitAt$1(host, t1) !== 93)
+            throw H.wrapException(P.FormatException$("Missing end `]` to match `[` in host"));
+          P.Uri_parseIPv6Address(C.JSString_methods.substring$2(host, 1, t1));
+          return host;
+        }
+        for (t1 = host.length, i = 0; i < t1; ++i) {
+          if (i >= t1)
+            H.throwExpression(P.RangeError$value(i));
+          if (host.charCodeAt(i) === 58) {
+            P.Uri_parseIPv6Address(host);
+            return "[" + host + "]";
+          }
+        }
+        return host;
+      }, Uri__makeScheme: function(scheme) {
+        var t1, $length, allLowercase, i, codeUnit, t2;
+        t1 = new P.Uri__makeScheme_isSchemeLowerCharacter();
+        if (scheme == null)
+          return "";
+        $length = scheme.length;
+        for (allLowercase = true, i = 0; i < $length; ++i) {
+          if (i >= $length)
+            H.throwExpression(P.RangeError$value(i));
+          codeUnit = scheme.charCodeAt(i);
+          if (i === 0) {
+            if (!(codeUnit >= 97 && codeUnit <= 122))
+              t2 = codeUnit >= 65 && codeUnit <= 90;
+            else
+              t2 = true;
+            t2 = !t2;
+          } else
+            t2 = false;
+          if (t2)
+            throw H.wrapException(P.ArgumentError$("Illegal scheme: " + scheme));
+          if (t1.call$1(codeUnit) !== true) {
+            if (codeUnit < 128) {
+              t2 = codeUnit >>> 4;
+              if (t2 >= 8)
+                return H.ioore(C.List_JYB, t2);
+              t2 = (C.List_JYB[t2] & C.JSInt_methods._shlPositive$1(1, codeUnit & 15)) !== 0;
+            } else
+              t2 = false;
+            if (t2)
+              ;
+            else
+              throw H.wrapException(P.ArgumentError$("Illegal scheme: " + scheme));
+            allLowercase = false;
+          }
+        }
+        return allLowercase ? scheme : scheme.toLowerCase();
+      }, Uri__makeQuery: function(query, queryParameters) {
+        var t1, t2, result;
+        t1 = {};
+        t2 = query == null;
+        if (t2 && true)
+          return "";
+        t2 = !t2;
+        if (t2)
+          ;
+        if (t2)
+          return P.Uri__normalize(query);
+        result = P.StringBuffer$("");
+        t1.first_0 = true;
+        C.JSNull_methods.forEach$1(queryParameters, new P.Uri__makeQuery_closure(t1, result));
+        return result._contents;
+      }, Uri__makeFragment: function(fragment) {
+        if (fragment == null)
+          return "";
+        return P.Uri__normalize(fragment);
+      }, Uri__normalize: function(component) {
+        var t1, index, t2, t3, t4, t5, $length, t6, t7, codeUnit1, codeUnit2, decodedCodeUnit, t8, next;
+        t1 = {};
+        index = J.getInterceptor$asx(component).indexOf$1(component, "%");
+        t1.index_0 = index;
+        if (index < 0)
+          return component;
+        t2 = new P.Uri__normalize_isNormalizedHexDigit();
+        t3 = new P.Uri__normalize_isUnreserved();
+        t4 = new P.Uri__normalize_normalizeHexDigit(component, t2, new P.Uri__normalize_isLowerCaseHexDigit());
+        t5 = new P.Uri__normalize_decodeHexDigitPair(component);
+        t1.result_1 = null;
+        $length = component.length;
+        t1.prevIndex_2 = 0;
+        t6 = new P.Uri__normalize_fillResult(t1, component);
+        for (t7 = index; t7 < $length;) {
+          if ($length < t7 + 2)
+            throw H.wrapException(P.ArgumentError$("Invalid percent-encoding in URI component: " + component));
+          codeUnit1 = C.JSString_methods.codeUnitAt$1(component, t7 + 1);
+          codeUnit2 = C.JSString_methods.codeUnitAt$1(component, t1.index_0 + 2);
+          decodedCodeUnit = t5.call$1(t1.index_0 + 1);
+          if (t2.call$1(codeUnit1) === true && t2.call$1(codeUnit2) === true && t3.call$1(decodedCodeUnit) !== true)
+            t7 = t1.index_0 += 3;
+          else {
+            t6.call$0();
+            t7 = t3.call$1(decodedCodeUnit);
+            t8 = t1.result_1;
+            if (t7 === true) {
+              t8.toString;
+              t7 = H.Primitives_stringFromCharCode(decodedCodeUnit);
+              t8._contents += t7;
+            } else {
+              t8.toString;
+              t8._contents += "%";
+              t7 = t4.call$1(t1.index_0 + 1);
+              t8.toString;
+              t7 = H.Primitives_stringFromCharCode(t7);
+              t8._contents += t7;
+              t7 = t1.result_1;
+              t8 = t4.call$1(t1.index_0 + 2);
+              t7.toString;
+              t8 = H.Primitives_stringFromCharCode(t8);
+              t7._contents += t8;
+            }
+            t7 = t1.index_0 += 3;
+            t1.prevIndex_2 = t7;
+          }
+          next = C.JSString_methods.indexOf$2(component, "%", t7);
+          if (next >= t1.index_0) {
+            t1.index_0 = next;
+            t7 = next;
+          } else {
+            t1.index_0 = $length;
+            t7 = $length;
+          }
+        }
+        if (t1.result_1 == null)
+          return component;
+        if (t1.prevIndex_2 !== t7)
+          t6.call$0();
+        return J.toString$0(t1.result_1);
+      }, Uri_parseIPv4Address: function(host) {
+        var t1, bytes;
+        t1 = new P.Uri_parseIPv4Address_error();
+        bytes = host.split(".");
+        if (bytes.length !== 4)
+          t1.call$1("IPv4 address should contain exactly 4 parts");
+        return H.setRuntimeTypeInfo(new H.MappedListIterable(bytes, new P.Uri_parseIPv4Address_closure(t1)), [null, null]).toList$0(0);
+      }, Uri_parseIPv6Address: function(host) {
+        var error, parseHex, parts, partStart, last, wildcardSeen, i, t1, t2, atEnd, isLastWildcard, exception;
+        error = new P.Uri_parseIPv6Address_error();
+        parseHex = new P.Uri_parseIPv6Address_parseHex(host, error);
+        if (J.get$length$asx(host) < 2)
+          error.call$1("address is too short");
+        parts = [];
+        partStart = 0;
+        wildcardSeen = false;
+        i = 0;
+        while (true) {
+          t1 = J.get$length$asx(host);
+          if (typeof t1 !== "number")
+            return H.iae(t1);
+          if (!(i < t1))
+            break;
+          t1 = host;
+          t2 = J.get$length$asx(t1);
+          if (typeof t2 !== "number")
+            return H.iae(t2);
+          if (i >= t2)
+            H.throwExpression(P.RangeError$value(i));
+          if (t1.charCodeAt(i) === 58) {
+            if (i === 0) {
+              ++i;
+              t1 = host;
+              if (i >= J.get$length$asx(t1))
+                H.throwExpression(P.RangeError$value(i));
+              if (t1.charCodeAt(i) !== 58)
+                error.call$1("invalid start colon.");
+              partStart = i;
+            }
+            if (i === partStart) {
+              if (wildcardSeen)
+                error.call$1("only one wildcard `::` is allowed");
+              J.add$1$ax(parts, -1);
+              wildcardSeen = true;
+            } else
+              J.add$1$ax(parts, parseHex.call$2(partStart, i));
+            partStart = i + 1;
+          }
+          ++i;
+        }
+        if (J.get$length$asx(parts) === 0)
+          error.call$1("too few parts");
+        atEnd = J.$eq(partStart, J.get$length$asx(host));
+        isLastWildcard = J.$eq(J.get$last$ax(parts), -1);
+        if (atEnd && !isLastWildcard)
+          error.call$1("expected a part after last `:`");
+        if (!atEnd)
+          try {
+            J.add$1$ax(parts, parseHex.call$2(partStart, J.get$length$asx(host)));
+          } catch (exception) {
+            H.unwrapException(exception);
+            try {
+              last = P.Uri_parseIPv4Address(J.substring$1$s(host, partStart));
+              t1 = J.$shl$n(J.$index$asx(last, 0), 8);
+              t2 = J.$index$asx(last, 1);
+              if (typeof t2 !== "number")
+                return H.iae(t2);
+              J.add$1$ax(parts, (t1 | t2) >>> 0);
+              t2 = J.$shl$n(J.$index$asx(last, 2), 8);
+              t1 = J.$index$asx(last, 3);
+              if (typeof t1 !== "number")
+                return H.iae(t1);
+              J.add$1$ax(parts, (t2 | t1) >>> 0);
+            } catch (exception) {
+              H.unwrapException(exception);
+              error.call$1("invalid end of IPv6 address.");
+            }
+
+          }
+
+        if (wildcardSeen) {
+          if (J.get$length$asx(parts) > 7)
+            error.call$1("an address with a wildcard must have less than 7 parts");
+        } else if (J.get$length$asx(parts) !== 8)
+          error.call$1("an address without a wildcard must contain exactly 8 parts");
+        t1 = new H.ExpandIterable(parts, new P.Uri_parseIPv6Address_closure(parts));
+        t1.$builtinTypeInfo = [null, null];
+        return P.List_List$from(t1, true, H.getRuntimeTypeArgument(t1, "IterableBase", 0));
+      }, Uri__uriEncode: function(canonicalTable, text, encoding, spaceToPlus) {
+        var t1, result, bytes, i, $byte, t2, t3;
+        t1 = new P.Uri__uriEncode_byteToHex();
+        result = P.StringBuffer$("");
+        bytes = encoding.get$encoder().convert$1(text);
+        for (i = 0; i < bytes.length; ++i) {
+          $byte = bytes[i];
+          t2 = J.getInterceptor$n($byte);
+          if (t2.$lt($byte, 128)) {
+            t3 = t2.$shr($byte, 4);
+            if (t3 >= 8)
+              return H.ioore(canonicalTable, t3);
+            t3 = (canonicalTable[t3] & C.JSInt_methods._shlPositive$1(1, t2.$and($byte, 15))) !== 0;
+          } else
+            t3 = false;
+          if (t3) {
+            t2 = H.Primitives_stringFromCharCode($byte);
+            result._contents += t2;
+          } else if (spaceToPlus && t2.$eq($byte, 32)) {
+            t2 = H.Primitives_stringFromCharCode(43);
+            result._contents += t2;
+          } else {
+            t2 = H.Primitives_stringFromCharCode(37);
+            result._contents += t2;
+            t1.call$2($byte, result);
+          }
+        }
+        return result._contents;
+      }}
+  },
+  Uri_parse_isRegName: {
+    "^": "Closure:124;",
+    call$1: function(ch) {
+      var t1;
+      if (ch < 128) {
+        t1 = ch >>> 4;
+        if (t1 >= 8)
+          return H.ioore(C.List_qNA, t1);
+        t1 = (C.List_qNA[t1] & C.JSInt_methods._shlPositive$1(1, ch & 15)) !== 0;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri_parse_ipV6Address: {
+    "^": "Closure:125;uri_0",
+    call$1: function(index) {
+      index = J.indexOf$2$asx(this.uri_0, "]", index);
+      if (index === -1)
+        throw H.wrapException(P.FormatException$("Bad end of IPv6 host"));
+      return index + 1;
+    },
+    $isFunction: true
+  },
+  Uri__makeScheme_isSchemeLowerCharacter: {
+    "^": "Closure:124;",
+    call$1: function(ch) {
+      var t1;
+      if (ch < 128) {
+        t1 = ch >>> 4;
+        if (t1 >= 8)
+          return H.ioore(C.List_6Pr, t1);
+        t1 = (C.List_6Pr[t1] & C.JSInt_methods._shlPositive$1(1, ch & 15)) !== 0;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri__makePath_closure: {
+    "^": "Closure:13;",
+    call$1: function(s) {
+      return P.Uri__uriEncode(C.List_qg4, s, C.Utf8Codec_false, false);
+    },
+    $isFunction: true
+  },
+  Uri__makeQuery_closure: {
+    "^": "Closure:75;box_0,result_1",
+    call$2: function(key, value) {
+      var t1 = this.box_0;
+      if (!t1.first_0)
+        this.result_1.write$1("&");
+      t1.first_0 = false;
+      t1 = this.result_1;
+      t1.write$1(P.Uri__uriEncode(C.List_nxB, key, C.Utf8Codec_false, true));
+      value.get$isEmpty(value);
+      t1.write$1("=");
+      t1.write$1(P.Uri__uriEncode(C.List_nxB, value, C.Utf8Codec_false, true));
+    },
+    $isFunction: true
+  },
+  Uri__normalize_isNormalizedHexDigit: {
+    "^": "Closure:124;",
+    call$1: function(digit) {
+      var t1;
+      if (!(48 <= digit && digit <= 57))
+        t1 = 65 <= digit && digit <= 70;
+      else
+        t1 = true;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_isLowerCaseHexDigit: {
+    "^": "Closure:124;",
+    call$1: function(digit) {
+      return 97 <= digit && digit <= 102;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_isUnreserved: {
+    "^": "Closure:124;",
+    call$1: function(ch) {
+      var t1;
+      if (ch < 128) {
+        t1 = C.JSInt_methods._shrOtherPositive$1(ch, 4);
+        if (t1 >= 8)
+          return H.ioore(C.List_nxB, t1);
+        t1 = (C.List_nxB[t1] & C.JSInt_methods._shlPositive$1(1, ch & 15)) !== 0;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_normalizeHexDigit: {
+    "^": "Closure:125;component_1,isNormalizedHexDigit_2,isLowerCaseHexDigit_3",
+    call$1: function(index) {
+      var t1, codeUnit;
+      t1 = this.component_1;
+      codeUnit = J.codeUnitAt$1$s(t1, index);
+      if (this.isLowerCaseHexDigit_3.call$1(codeUnit) === true)
+        return codeUnit - 32;
+      else if (this.isNormalizedHexDigit_2.call$1(codeUnit) !== true)
+        throw H.wrapException(P.ArgumentError$("Invalid URI component: " + t1));
+      else
+        return codeUnit;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_decodeHexDigitPair: {
+    "^": "Closure:125;component_4",
+    call$1: function(index) {
+      var t1, t2, $byte, i, codeUnit;
+      for (t1 = this.component_4, t2 = J.getInterceptor$s(t1), $byte = 0, i = 0; i < 2; ++i) {
+        codeUnit = t2.codeUnitAt$1(t1, index + i);
+        if (48 <= codeUnit && codeUnit <= 57)
+          $byte = $byte * 16 + codeUnit - 48;
+        else {
+          codeUnit |= 32;
+          if (97 <= codeUnit && codeUnit <= 102)
+            $byte = $byte * 16 + codeUnit - 97 + 10;
+          else
+            throw H.wrapException(P.ArgumentError$("Invalid percent-encoding in URI component: " + t1));
+        }
+      }
+      return $byte;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_fillResult: {
+    "^": "Closure:18;box_0,component_5",
+    call$0: function() {
+      var t1, t2, t3, t4, t5;
+      t1 = this.box_0;
+      t2 = t1.result_1;
+      t3 = t1.prevIndex_2;
+      t4 = this.component_5;
+      t5 = t1.index_0;
+      if (t2 == null)
+        t1.result_1 = P.StringBuffer$(J.substring$2$s(t4, t3, t5));
+      else
+        t2.write$1(J.substring$2$s(t4, t3, t5));
+    },
+    $isFunction: true
+  },
+  Uri_hashCode_combine: {
+    "^": "Closure:126;",
+    call$2: function(part, current) {
+      var t1 = J.get$hashCode$(part);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return current * 31 + t1 & 1073741823;
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv4Address_error: {
+    "^": "Closure:43;",
+    call$1: function(msg) {
+      throw H.wrapException(P.FormatException$("Illegal IPv4 address, " + msg));
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv4Address_closure: {
+    "^": "Closure:13;error_0",
+    call$1: [function(byteString) {
+      var $byte, t1;
+      $byte = H.Primitives_parseInt(byteString, null, null);
+      t1 = J.getInterceptor$n($byte);
+      if (t1.$lt($byte, 0) || t1.$gt($byte, 255))
+        this.error_0.call$1("each part must be in the range of `0..255`");
+      return $byte;
+    }, "call$1", null, 2, 0, null, 127, "call"],
+    $isFunction: true
+  },
+  Uri_parseIPv6Address_error: {
+    "^": "Closure:43;",
+    call$1: function(msg) {
+      throw H.wrapException(P.FormatException$("Illegal IPv6 address, " + msg));
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv6Address_parseHex: {
+    "^": "Closure:87;host_0,error_1",
+    call$2: function(start, end) {
+      var value, t1;
+      if (end - start > 4)
+        this.error_1.call$1("an IPv6 part can only contain a maximum of 4 hex digits");
+      value = H.Primitives_parseInt(C.JSString_methods.substring$2(this.host_0, start, end), 16, null);
+      t1 = J.getInterceptor$n(value);
+      if (t1.$lt(value, 0) || t1.$gt(value, 65535))
+        this.error_1.call$1("each part must be in the range of `0x0..0xFFFF`");
+      return value;
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv6Address_closure: {
+    "^": "Closure:13;parts_2",
+    call$1: function(value) {
+      var t1 = J.getInterceptor(value);
+      if (t1.$eq(value, -1))
+        return P.List_List$filled((9 - this.parts_2.length) * 2, 0, null);
+      else
+        return [t1.$shr(value, 8) & 255, t1.$and(value, 255)];
+    },
+    $isFunction: true
+  },
+  Uri__uriEncode_byteToHex: {
+    "^": "Closure:75;",
+    call$2: function($byte, buffer) {
+      var t1 = J.getInterceptor$n($byte);
+      buffer.write$1(H.Primitives_stringFromCharCode(C.JSString_methods.codeUnitAt$1("0123456789ABCDEF", t1.$shr($byte, 4))));
+      buffer.write$1(H.Primitives_stringFromCharCode(C.JSString_methods.codeUnitAt$1("0123456789ABCDEF", t1.$and($byte, 15))));
+    },
+    $isFunction: true
+  }
+}],
+["dart.dom.html", "dart:html", , W, {
+  "^": "",
+  CustomEvent_CustomEvent: function(type, canBubble, cancelable, detail) {
+    var e, t1, exception;
+    e = document.createEvent("CustomEvent");
+    J.set$_dartDetail$x(e, detail);
+    if (!J.getInterceptor(detail).$isList)
+      if (!J.getInterceptor(detail).$isMap) {
+        t1 = detail;
+        if (typeof t1 !== "string") {
+          t1 = detail;
+          t1 = typeof t1 === "number";
+        } else
+          t1 = true;
+      } else
+        t1 = true;
+    else
+      t1 = true;
+    if (t1)
+      try {
+        detail = P._convertDartToNative_PrepareForStructuredClone(detail);
+        J._initCustomEvent$4$x(e, type, canBubble, cancelable, detail);
+      } catch (exception) {
+        H.unwrapException(exception);
+        J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
+      }
+
+    else
+      J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
+    return e;
+  },
+  _ElementFactoryProvider_createElement_tag: function(tag, typeExtension) {
+    return document.createElement(tag);
+  },
+  HttpRequest_request: function(url, method, mimeType, onProgress, requestHeaders, responseType, sendData, withCredentials) {
+    var t1, completer, xhr;
+    t1 = W.HttpRequest;
+    completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(t1)), [t1]);
+    xhr = new XMLHttpRequest();
+    C.HttpRequest_methods.open$3$async(xhr, "GET", url, true);
+    requestHeaders.forEach$1(0, new W.HttpRequest_request_closure(xhr));
+    t1 = H.setRuntimeTypeInfo(new W._EventStream(xhr, C.EventStreamProvider_load._eventType, false), [null]);
+    H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(new W.HttpRequest_request_closure0(completer, xhr)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+    t1 = H.setRuntimeTypeInfo(new W._EventStream(xhr, C.EventStreamProvider_error._eventType, false), [null]);
+    H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(completer.get$completeError()), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+    xhr.send();
+    return completer.future;
+  },
+  InputElement_InputElement: function(type) {
+    var e, exception;
+    e = document.createElement("input", null);
+    if (type != null)
+      try {
+        J.set$type$x(e, type);
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+
+    return e;
+  },
+  _JenkinsSmiHash_combine: function(hash, value) {
+    hash = 536870911 & hash + value;
+    hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+    return hash ^ hash >>> 6;
+  },
+  _convertNativeToDart_Window: function(win) {
+    if (win == null)
+      return;
+    return W._DOMWindowCrossFrame__createSafe(win);
+  },
+  _convertNativeToDart_EventTarget: function(e) {
+    var $window;
+    if (e == null)
+      return;
+    if ("setInterval" in e) {
+      $window = W._DOMWindowCrossFrame__createSafe(e);
+      if (!!J.getInterceptor($window).$isEventTarget)
+        return $window;
+      return;
+    } else
+      return e;
+  },
+  _convertDartToNative_EventTarget: function(e) {
+    return e;
+  },
+  _convertNativeToDart_XHR_Response: function(o) {
+    if (!!J.getInterceptor(o).$isDocument)
+      return o;
+    return P.convertNativeToDart_AcceptStructuredClone(o, true);
+  },
+  _callConstructor: function($constructor, interceptor) {
+    return new W._callConstructor_closure($constructor, interceptor);
+  },
+  _callAttached: [function(receiver) {
+    return J.attached$0$x(receiver);
+  }, "call$1", "_callAttached$closure", 2, 0, 13, 54],
+  _callDetached: [function(receiver) {
+    return J.detached$0$x(receiver);
+  }, "call$1", "_callDetached$closure", 2, 0, 13, 54],
+  _callAttributeChanged: [function(receiver, $name, oldValue, newValue) {
+    return J.attributeChanged$3$x(receiver, $name, oldValue, newValue);
+  }, "call$4", "_callAttributeChanged$closure", 8, 0, 55, 54, 56, 57, 58],
+  _registerCustomElement: function(context, $document, tag, type, extendsTagName) {
+    var interceptorClass, interceptor, $constructor, baseClassName, t1, baseConstructor, properties, proto, t2, options;
+    interceptorClass = J.findInterceptorConstructorForType(type);
+    if (interceptorClass == null)
+      throw H.wrapException(P.ArgumentError$(type));
+    interceptor = interceptorClass.prototype;
+    $constructor = J.findConstructorForNativeSubclassType(type, "created");
+    if ($constructor == null)
+      throw H.wrapException(P.ArgumentError$(H.S(type) + " has no constructor called 'created'"));
+    J.getNativeInterceptor(W._ElementFactoryProvider_createElement_tag("article", null));
+    baseClassName = interceptorClass.$nativeSuperclassTag;
+    if (baseClassName == null)
+      throw H.wrapException(P.ArgumentError$(type));
+    t1 = extendsTagName == null;
+    if (t1) {
+      if (!J.$eq(baseClassName, "HTMLElement"))
+        throw H.wrapException(P.UnsupportedError$("Class must provide extendsTag if base native class is not HtmlElement"));
+    } else if (!($document.createElement(extendsTagName) instanceof window[baseClassName]))
+      throw H.wrapException(P.UnsupportedError$("extendsTag does not match base native class"));
+    baseConstructor = context[baseClassName];
+    properties = {};
+    properties.createdCallback = {value: function(invokeCallback) {
+        return function() {
+          return invokeCallback(this);
+        };
+      }(H.convertDartClosureToJS(W._callConstructor($constructor, interceptor), 1))};
+    properties.attachedCallback = {value: function(invokeCallback) {
+        return function() {
+          return invokeCallback(this);
+        };
+      }(H.convertDartClosureToJS(W._callAttached$closure(), 1))};
+    properties.detachedCallback = {value: function(invokeCallback) {
+        return function() {
+          return invokeCallback(this);
+        };
+      }(H.convertDartClosureToJS(W._callDetached$closure(), 1))};
+    properties.attributeChangedCallback = {value: function(invokeCallback) {
+        return function(arg1, arg2, arg3) {
+          return invokeCallback(this, arg1, arg2, arg3);
+        };
+      }(H.convertDartClosureToJS(W._callAttributeChanged$closure(), 4))};
+    proto = Object.create(baseConstructor.prototype, properties);
+    t2 = H.makeLeafDispatchRecord(interceptor);
+    Object.defineProperty(proto, init.dispatchPropertyName, {value: t2, enumerable: false, writable: true, configurable: true});
+    options = {prototype: proto};
+    if (!t1)
+      options.extends = extendsTagName;
+    $document.registerElement(tag, options);
+  },
+  _wrapZone: function(callback) {
+    if (J.$eq($.Zone__current, C.C__RootZone))
+      return callback;
+    if (callback == null)
+      return;
+    return $.Zone__current.bindUnaryCallback$2$runGuarded(callback, true);
+  },
+  _wrapBinaryZone: function(callback) {
+    if (J.$eq($.Zone__current, C.C__RootZone))
+      return callback;
+    return $.Zone__current.bindBinaryCallback$2$runGuarded(callback, true);
+  },
+  HtmlElement: {
+    "^": "Element;",
+    "%": "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;HtmlElement_Polymer|HtmlElement_Polymer_ChangeNotifier|PolymerElement|PolymerElement_ChangeNotifier|ActionLinkElement|ObservatoryElement|ObservatoryElement_ChangeNotifier|BreakpointListElement|ObservatoryElement_ChangeNotifier0|ServiceRefElement|ClassRefElement|ObservatoryElement_ChangeNotifier1|ClassTreeElement|ObservatoryElement_ChangeNotifier2|ClassViewElement|CodeRefElement|ObservatoryElement_ChangeNotifier3|CodeViewElement|PolymerElement_ChangeNotifier0|CurlyBlockElement|ObservatoryElement_ChangeNotifier4|ErrorViewElement|ObservatoryElement_ChangeNotifier5|EvalBoxElement|PolymerElement_ChangeNotifier1|EvalLinkElement|FieldRefElement|ObservatoryElement_ChangeNotifier6|FieldViewElement|ObservatoryElement_ChangeNotifier7|FlagListElement|ObservatoryElement_ChangeNotifier8|FlagItemElement|ServiceRefElement_ChangeNotifier|FunctionRefElement|ObservatoryElement_ChangeNotifier9|FunctionViewElement|ObservatoryElement_ChangeNotifier10|HeapMapElement|ObservatoryElement_ChangeNotifier11|HeapProfileElement|InstanceRefElement|ObservatoryElement_ChangeNotifier12|InstanceViewElement|ObservatoryElement_ChangeNotifier13|IOViewElement|IORefElement|ObservatoryElement_ChangeNotifier14|IOHttpServerListViewElement|IOHttpServerRefElement|ObservatoryElement_ChangeNotifier15|IOHttpServerViewElement|ObservatoryElement_ChangeNotifier16|IOHttpServerConnectionViewElement|IOHttpServerConnectionRefElement|IOSocketRefElement|ObservatoryElement_ChangeNotifier17|IOSocketListViewElement|ObservatoryElement_ChangeNotifier18|IOSocketViewElement|IOWebSocketRefElement|ObservatoryElement_ChangeNotifier19|IOWebSocketListViewElement|ObservatoryElement_ChangeNotifier20|IOWebSocketViewElement|ObservatoryElement_ChangeNotifier21|IORandomAccessFileListViewElement|IORandomAccessFileRefElement|ObservatoryElement_ChangeNotifier22|IORandomAccessFileViewElement|ObservatoryElement_ChangeNotifier23|IOProcessListViewElement|ServiceRefElement_ChangeNotifier0|IOProcessRefElement|ObservatoryElement_ChangeNotifier24|IOProcessViewElement|ObservatoryElement_ChangeNotifier25|IsolateProfileElement|IsolateRefElement|ObservatoryElement_ChangeNotifier26|IsolateSummaryElement|ObservatoryElement_ChangeNotifier27|IsolateRunStateElement|ObservatoryElement_ChangeNotifier28|IsolateLocationElement|ObservatoryElement_ChangeNotifier29|IsolateSharedSummaryElement|ObservatoryElement_ChangeNotifier30|IsolateCounterChartElement|ObservatoryElement_ChangeNotifier31|IsolateViewElement|ObservatoryElement_ChangeNotifier32|JsonViewElement|LibraryRefElement|ObservatoryElement_ChangeNotifier33|LibraryViewElement|ObservatoryElement_ChangeNotifier34|NavBarElement|ObservatoryElement_ChangeNotifier35|NavMenuElement|ObservatoryElement_ChangeNotifier36|NavMenuItemElement|ObservatoryElement_ChangeNotifier37|NavRefreshElement|NavControlElement|ObservatoryElement_ChangeNotifier38|TopNavMenuElement|ObservatoryElement_ChangeNotifier39|IsolateNavMenuElement|ObservatoryElement_ChangeNotifier40|LibraryNavMenuElement|ObservatoryElement_ChangeNotifier41|ClassNavMenuElement|ObservatoryElement_ChangeNotifier42|ObservatoryApplicationElement|ObservatoryElement_ChangeNotifier43|ScriptInsetElement|ServiceRefElement_ChangeNotifier1|ScriptRefElement|ObservatoryElement_ChangeNotifier44|ScriptViewElement|ObservatoryElement_ChangeNotifier45|ServiceErrorViewElement|ObservatoryElement_ChangeNotifier46|ServiceExceptionViewElement|ObservatoryElement_ChangeNotifier47|ServiceObjectViewElement|PolymerElement_ChangeNotifier2|SlidingCheckboxElement|ObservatoryElement_ChangeNotifier48|StackFrameElement|ObservatoryElement_ChangeNotifier49|StackTraceElement|VMRefElement|ObservatoryElement_ChangeNotifier50|VMViewElement"
+  },
+  _EntryArray: {
+    "^": "Interceptor;",
+    $isList: true,
+    $asList: function() {
+      return [W.Entry];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Entry];
+    },
+    "%": "EntryArray"
+  },
+  AnchorElement: {
+    "^": "HtmlElement;target=,type%,href%,protocol=",
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    "%": "HTMLAnchorElement"
+  },
+  AreaElement: {
+    "^": "HtmlElement;target=,href%,protocol=",
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    "%": "HTMLAreaElement"
+  },
+  BaseElement: {
+    "^": "HtmlElement;href%,target=",
+    "%": "HTMLBaseElement"
+  },
+  Blob: {
+    "^": "Interceptor;type=",
+    $isBlob: true,
+    "%": ";Blob"
+  },
+  BodyElement: {
+    "^": "HtmlElement;",
+    $isEventTarget: true,
+    "%": "HTMLBodyElement"
+  },
+  ButtonElement: {
+    "^": "HtmlElement;form=,name%,type%,value%",
+    "%": "HTMLButtonElement"
+  },
+  CanvasElement: {
+    "^": "HtmlElement;height},width}",
+    get$context2D: function(receiver) {
+      return receiver.getContext("2d");
+    },
+    "%": "HTMLCanvasElement"
+  },
+  CanvasRenderingContext: {
+    "^": "Interceptor;",
+    "%": ";CanvasRenderingContext"
+  },
+  CanvasRenderingContext2D: {
+    "^": "CanvasRenderingContext;",
+    putImageData$7: function(receiver, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
+      var t1;
+      if (dirtyWidth != null)
+        t1 = true;
+      else
+        t1 = false;
+      if (t1) {
+        receiver.putImageData(P.convertDartToNative_ImageData(imagedata), dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+        return;
+      }
+      throw H.wrapException(P.ArgumentError$("Incorrect number or type of arguments"));
+    },
+    "%": "CanvasRenderingContext2D"
+  },
+  CharacterData: {
+    "^": "Node;data=,length=,nextElementSibling=",
+    "%": "Comment;CharacterData"
+  },
+  CloseEvent: {
+    "^": "Event;code=",
+    "%": "CloseEvent"
+  },
+  CompositionEvent: {
+    "^": "UIEvent;data=",
+    "%": "CompositionEvent"
+  },
+  CustomEvent: {
+    "^": "Event;_dartDetail}",
+    get$detail: function(receiver) {
+      var t1 = receiver._dartDetail;
+      if (t1 != null)
+        return t1;
+      return P.convertNativeToDart_AcceptStructuredClone(receiver.detail, true);
+    },
+    _initCustomEvent$4: function(receiver, typeArg, canBubbleArg, cancelableArg, detailArg) {
+      return receiver.initCustomEvent(typeArg, canBubbleArg, cancelableArg, detailArg);
+    },
+    $isCustomEvent: true,
+    "%": "CustomEvent"
+  },
+  DetailsElement: {
+    "^": "HtmlElement;",
+    open$1: function($receiver, arg0) {
+      return $receiver.open.call$1(arg0);
+    },
+    "%": "HTMLDetailsElement"
+  },
+  DialogElement: {
+    "^": "HtmlElement;",
+    open$1: function($receiver, arg0) {
+      return $receiver.open.call$1(arg0);
+    },
+    "%": "HTMLDialogElement"
+  },
+  Document: {
+    "^": "Node;",
+    createDocumentFragment$0: function(receiver) {
+      return receiver.createDocumentFragment();
+    },
+    getElementById$1: function(receiver, elementId) {
+      return receiver.getElementById(elementId);
+    },
+    importNode$2: function(receiver, node, deep) {
+      return receiver.importNode(node, deep);
+    },
+    querySelector$1: function(receiver, selectors) {
+      return receiver.querySelector(selectors);
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onClick: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_click._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    querySelectorAll$1: function(receiver, selectors) {
+      return W._FrozenElementList$_wrap(receiver.querySelectorAll(selectors), null);
+    },
+    $isDocument: true,
+    "%": "XMLDocument;Document"
+  },
+  DocumentFragment: {
+    "^": "Node;",
+    get$children: function(receiver) {
+      if (receiver._docChildren == null)
+        receiver._docChildren = H.setRuntimeTypeInfo(new P.FilteredElementList(receiver, new W._ChildNodeListLazy(receiver)), [null]);
+      return receiver._docChildren;
+    },
+    querySelectorAll$1: function(receiver, selectors) {
+      return W._FrozenElementList$_wrap(receiver.querySelectorAll(selectors), null);
+    },
+    querySelector$1: function(receiver, selectors) {
+      return receiver.querySelector(selectors);
+    },
+    "%": ";DocumentFragment"
+  },
+  DomError: {
+    "^": "Interceptor;message=,name=",
+    "%": ";DOMError"
+  },
+  DomException: {
+    "^": "Interceptor;message=",
+    get$name: function(receiver) {
+      var errorName = receiver.name;
+      if (P.Device_isWebKit() === true && errorName === "SECURITY_ERR")
+        return "SecurityError";
+      if (P.Device_isWebKit() === true && errorName === "SYNTAX_ERR")
+        return "SyntaxError";
+      return errorName;
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    $isDomException: true,
+    "%": "DOMException"
+  },
+  Element: {
+    "^": "Node;title},className%,id=,tagName=,nextElementSibling=",
+    get$attributes: function(receiver) {
+      return new W._ElementAttributeMap(receiver);
+    },
+    get$children: function(receiver) {
+      return new W._ChildrenElementList(receiver, receiver.children);
+    },
+    querySelectorAll$1: function(receiver, selectors) {
+      return W._FrozenElementList$_wrap(receiver.querySelectorAll(selectors), null);
+    },
+    get$classes: function(receiver) {
+      return new W._ElementCssClassSet(receiver);
+    },
+    get$offset: function(receiver) {
+      return P.Rectangle$(C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetLeft)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetTop)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetWidth)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetHeight)), null);
+    },
+    attached$0: function(receiver) {
+    },
+    detached$0: function(receiver) {
+    },
+    attributeChanged$3: function(receiver, $name, oldValue, newValue) {
+    },
+    get$localName: function(receiver) {
+      return receiver.localName;
+    },
+    get$namespaceUri: function(receiver) {
+      return receiver.namespaceURI;
+    },
+    toString$0: function(receiver) {
+      return receiver.localName;
+    },
+    matches$1: function(receiver, selectors) {
+      if (!!receiver.matches)
+        return receiver.matches(selectors);
+      else if (!!receiver.webkitMatchesSelector)
+        return receiver.webkitMatchesSelector(selectors);
+      else if (!!receiver.mozMatchesSelector)
+        return receiver.mozMatchesSelector(selectors);
+      else if (!!receiver.msMatchesSelector)
+        return receiver.msMatchesSelector(selectors);
+      else if (!!receiver.oMatchesSelector)
+        return receiver.oMatchesSelector(selectors);
+      else
+        throw H.wrapException(P.UnsupportedError$("Not supported on this platform"));
+    },
+    matchesWithAncestors$1: function(receiver, selectors) {
+      var elem = receiver;
+      do {
+        if (J.matches$1$x(elem, selectors))
+          return true;
+        elem = elem.parentElement;
+      } while (elem != null);
+      return false;
+    },
+    createShadowRoot$0: function(receiver) {
+      return (receiver.createShadowRoot || receiver.webkitCreateShadowRoot).call(receiver);
+    },
+    get$on: function(receiver) {
+      return new W.ElementEvents(receiver, receiver);
+    },
+    getAttribute$1: function(receiver, $name) {
+      return receiver.getAttribute($name);
+    },
+    getBoundingClientRect$0: function(receiver) {
+      return receiver.getBoundingClientRect();
+    },
+    querySelector$1: function(receiver, selectors) {
+      return receiver.querySelector(selectors);
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onClick: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_click._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    get$onMouseDown: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousedown._eventType, false), [null]);
+    },
+    get$onMouseMove: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousemove._eventType, false), [null]);
+    },
+    Element$created$0: function(receiver) {
+    },
+    $isElement: true,
+    $isEventTarget: true,
+    "%": ";Element"
+  },
+  EmbedElement: {
+    "^": "HtmlElement;height},name%,type%,width}",
+    "%": "HTMLEmbedElement"
+  },
+  ErrorEvent: {
+    "^": "Event;error=,message=",
+    "%": "ErrorEvent"
+  },
+  Event: {
+    "^": "Interceptor;_selector},path=,type=",
+    get$currentTarget: function(receiver) {
+      return W._convertNativeToDart_EventTarget(receiver.currentTarget);
+    },
+    get$target: function(receiver) {
+      return W._convertNativeToDart_EventTarget(receiver.target);
+    },
+    preventDefault$0: function(receiver) {
+      return receiver.preventDefault();
+    },
+    $isEvent: true,
+    "%": "AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"
+  },
+  EventTarget: {
+    "^": "Interceptor;",
+    get$on: function(receiver) {
+      return new W.Events(receiver);
+    },
+    addEventListener$3: function(receiver, type, listener, useCapture) {
+      return receiver.addEventListener(type, H.convertDartClosureToJS(listener, 1), useCapture);
+    },
+    addEventListener$2: function($receiver, type, listener) {
+      listener = H.convertDartClosureToJS(listener, 1);
+      return $receiver.addEventListener(type, listener);
+    },
+    dispatchEvent$1: function(receiver, $event) {
+      return receiver.dispatchEvent($event);
+    },
+    removeEventListener$3: function(receiver, type, listener, useCapture) {
+      return receiver.removeEventListener(type, H.convertDartClosureToJS(listener, 1), useCapture);
+    },
+    $isEventTarget: true,
+    "%": ";EventTarget"
+  },
+  FieldSetElement: {
+    "^": "HtmlElement;form=,name%,type=",
+    "%": "HTMLFieldSetElement"
+  },
+  File: {
+    "^": "Blob;name=",
+    $isFile: true,
+    "%": "File"
+  },
+  FileError: {
+    "^": "DomError;code=",
+    "%": "FileError"
+  },
+  FormElement: {
+    "^": "HtmlElement;length=,name%,target=",
+    "%": "HTMLFormElement"
+  },
+  History: {
+    "^": "Interceptor;length=",
+    "%": "History"
+  },
+  HtmlCollection: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"
+  },
+  HtmlDocument: {
+    "^": "Document;",
+    get$head: function(receiver) {
+      return receiver.head;
+    },
+    set$title: function(receiver, value) {
+      receiver.title = value;
+    },
+    "%": "HTMLDocument"
+  },
+  HttpRequest: {
+    "^": "HttpRequestEventTarget;responseText=,status=,statusText=",
+    get$response: function(receiver) {
+      return W._convertNativeToDart_XHR_Response(receiver.response);
+    },
+    open$5$async$password$user: function(receiver, method, url, async, password, user) {
+      return receiver.open(method, url, async, user, password);
+    },
+    open$3$async: function($receiver, method, url, async) {
+      return $receiver.open(method, url, async);
+    },
+    send$1: function(receiver, data) {
+      return receiver.send(data);
+    },
+    $isHttpRequest: true,
+    "%": "XMLHttpRequest"
+  },
+  HttpRequestEventTarget: {
+    "^": "EventTarget;",
+    "%": ";XMLHttpRequestEventTarget"
+  },
+  IFrameElement: {
+    "^": "HtmlElement;height},name%,width}",
+    "%": "HTMLIFrameElement"
+  },
+  ImageData: {
+    "^": "Interceptor;data=,height=,width=",
+    $isImageData: true,
+    "%": "ImageData"
+  },
+  ImageElement: {
+    "^": "HtmlElement;height},width}",
+    complete$1: function($receiver, arg0) {
+      return $receiver.complete.call$1(arg0);
+    },
+    "%": "HTMLImageElement"
+  },
+  InputElement: {
+    "^": "HtmlElement;checked%,form=,height},list=,name%,type%,value%,width}",
+    accept$1: function($receiver, arg0) {
+      return $receiver.accept.call$1(arg0);
+    },
+    $isInputElement: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true,
+    "%": "HTMLInputElement"
+  },
+  KeyboardEvent: {
+    "^": "UIEvent;altKey=,ctrlKey=,metaKey=,shiftKey=",
+    "%": "KeyboardEvent"
+  },
+  KeygenElement: {
+    "^": "HtmlElement;form=,name%,type=",
+    "%": "HTMLKeygenElement"
+  },
+  LIElement: {
+    "^": "HtmlElement;value%",
+    "%": "HTMLLIElement"
+  },
+  LabelElement: {
+    "^": "HtmlElement;form=",
+    "%": "HTMLLabelElement"
+  },
+  LegendElement: {
+    "^": "HtmlElement;form=",
+    "%": "HTMLLegendElement"
+  },
+  LinkElement: {
+    "^": "HtmlElement;href%,type%",
+    "%": "HTMLLinkElement"
+  },
+  Location: {
+    "^": "Interceptor;href=,protocol=",
+    reload$0: function(receiver) {
+      return receiver.reload();
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    "%": "Location"
+  },
+  MapElement: {
+    "^": "HtmlElement;name%",
+    "%": "HTMLMapElement"
+  },
+  MediaElement: {
+    "^": "HtmlElement;error=",
+    load$0: function(receiver) {
+      return receiver.load();
+    },
+    pause$0: [function(receiver) {
+      return receiver.pause();
+    }, "call$0", "get$pause", 0, 0, 18],
+    "%": "HTMLAudioElement;HTMLMediaElement",
+    static: {"^": "MediaElement_pauseEvent<"}
+  },
+  MediaError: {
+    "^": "Interceptor;code=",
+    "%": "MediaError"
+  },
+  MediaKeyError: {
+    "^": "Interceptor;code=",
+    "%": "MediaKeyError"
+  },
+  MediaKeyEvent: {
+    "^": "Event;message=",
+    "%": "MediaKeyEvent"
+  },
+  MediaKeyMessageEvent: {
+    "^": "Event;message=",
+    "%": "MediaKeyMessageEvent"
+  },
+  MediaStream: {
+    "^": "EventTarget;id=,label=",
+    "%": "MediaStream"
+  },
+  MessageEvent: {
+    "^": "Event;",
+    get$data: function(receiver) {
+      return P.convertNativeToDart_AcceptStructuredClone(receiver.data, true);
+    },
+    $isMessageEvent: true,
+    "%": "MessageEvent"
+  },
+  MetaElement: {
+    "^": "HtmlElement;content=,name%",
+    "%": "HTMLMetaElement"
+  },
+  MeterElement: {
+    "^": "HtmlElement;value%",
+    "%": "HTMLMeterElement"
+  },
+  MidiMessageEvent: {
+    "^": "Event;data=",
+    "%": "MIDIMessageEvent"
+  },
+  MidiOutput: {
+    "^": "MidiPort;",
+    send$2: function(receiver, data, timestamp) {
+      return receiver.send(data, timestamp);
+    },
+    send$1: function($receiver, data) {
+      return $receiver.send(data);
+    },
+    "%": "MIDIOutput"
+  },
+  MidiPort: {
+    "^": "EventTarget;id=,name=,type=,version=",
+    "%": "MIDIInput;MIDIPort"
+  },
+  MouseEvent: {
+    "^": "UIEvent;altKey=,button=,ctrlKey=,metaKey=,shiftKey=",
+    _initMouseEvent$15: function(receiver, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
+      receiver.initMouseEvent(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, W._convertDartToNative_EventTarget(relatedTarget));
+      return;
+    },
+    get$offset: function(receiver) {
+      var target, point;
+      if (!!receiver.offsetX)
+        return H.setRuntimeTypeInfo(new P.Point(receiver.offsetX, receiver.offsetY), [null]);
+      else {
+        if (!J.getInterceptor(W._convertNativeToDart_EventTarget(receiver.target)).$isElement)
+          throw H.wrapException(P.UnsupportedError$("offsetX is only supported on elements"));
+        target = W._convertNativeToDart_EventTarget(receiver.target);
+        point = H.setRuntimeTypeInfo(new P.Point(receiver.clientX, receiver.clientY), [null]).$sub(0, J.get$topLeft$x(J.getBoundingClientRect$0$x(target)));
+        return H.setRuntimeTypeInfo(new P.Point(J.toInt$0$n(point.x), J.toInt$0$n(point.y)), [null]);
+      }
+    },
+    $isMouseEvent: true,
+    "%": "DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"
+  },
+  MutationObserver: {
+    "^": "Interceptor;",
+    observe$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree: function(receiver, target, attributeFilter, attributeOldValue, attributes, characterData, characterDataOldValue, childList, subtree) {
+      var parsedOptions, t1;
+      parsedOptions = {};
+      t1 = new W.MutationObserver_observe_override(parsedOptions);
+      t1.call$2("childList", childList);
+      t1.call$2("attributes", attributes);
+      t1.call$2("characterData", characterData);
+      t1.call$2("subtree", subtree);
+      t1.call$2("attributeOldValue", attributeOldValue);
+      t1.call$2("characterDataOldValue", characterDataOldValue);
+      t1.call$2("attributeFilter", attributeFilter);
+      receiver.observe(target, parsedOptions);
+    },
+    observe$3$attributeFilter$attributes: function($receiver, target, attributeFilter, attributes) {
+      return this.observe$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree($receiver, target, attributeFilter, null, attributes, null, null, null, null);
+    },
+    "%": "MutationObserver|WebKitMutationObserver"
+  },
+  MutationRecord: {
+    "^": "Interceptor;target=,type=",
+    "%": "MutationRecord"
+  },
+  NavigatorUserMediaError: {
+    "^": "Interceptor;message=,name=",
+    "%": "NavigatorUserMediaError"
+  },
+  Node: {
+    "^": "EventTarget;firstChild=,nextNode:nextSibling=,ownerDocument=,parent:parentElement=,parentNode=,text:textContent%",
+    get$nodes: function(receiver) {
+      return new W._ChildNodeListLazy(receiver);
+    },
+    remove$0: function(receiver) {
+      var t1 = receiver.parentNode;
+      if (t1 != null)
+        t1.removeChild(receiver);
+    },
+    replaceWith$1: function(receiver, otherNode) {
+      var $parent, exception;
+      try {
+        $parent = receiver.parentNode;
+        J._replaceChild$2$x($parent, otherNode, receiver);
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+
+      return receiver;
+    },
+    insertAllBefore$2: function(receiver, newNodes, refChild) {
+      var t1, len, i;
+      t1 = J.getInterceptor(newNodes);
+      if (!!t1.$is_ChildNodeListLazy) {
+        t1 = newNodes._this;
+        if (t1 === receiver)
+          throw H.wrapException(P.ArgumentError$(newNodes));
+        for (len = t1.childNodes.length, i = 0; i < len; ++i)
+          receiver.insertBefore(t1.firstChild, refChild);
+      } else
+        for (t1 = t1.get$iterator(newNodes); t1.moveNext$0();)
+          receiver.insertBefore(t1.get$current(), refChild);
+    },
+    _clearChildren$0: function(receiver) {
+      var t1;
+      for (; t1 = receiver.firstChild, t1 != null;)
+        receiver.removeChild(t1);
+    },
+    toString$0: function(receiver) {
+      var t1 = receiver.nodeValue;
+      return t1 == null ? J.Interceptor.prototype.toString$0.call(this, receiver) : t1;
+    },
+    append$1: function(receiver, newChild) {
+      return receiver.appendChild(newChild);
+    },
+    contains$1: function(receiver, other) {
+      return receiver.contains(other);
+    },
+    insertBefore$2: function(receiver, newChild, refChild) {
+      return receiver.insertBefore(newChild, refChild);
+    },
+    _replaceChild$2: function(receiver, newChild, oldChild) {
+      return receiver.replaceChild(newChild, oldChild);
+    },
+    $isNode: true,
+    "%": "DocumentType|Notation;Node"
+  },
+  NodeList: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin0;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "NodeList|RadioNodeList"
+  },
+  OListElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLOListElement"
+  },
+  ObjectElement: {
+    "^": "HtmlElement;data=,form=,height},name%,type%,width}",
+    "%": "HTMLObjectElement"
+  },
+  OptGroupElement: {
+    "^": "HtmlElement;label%",
+    "%": "HTMLOptGroupElement"
+  },
+  OptionElement: {
+    "^": "HtmlElement;form=,index=,label%,value%",
+    $isOptionElement: true,
+    "%": "HTMLOptionElement"
+  },
+  OutputElement: {
+    "^": "HtmlElement;form=,name%,type=,value%",
+    "%": "HTMLOutputElement"
+  },
+  ParamElement: {
+    "^": "HtmlElement;name%,value%",
+    "%": "HTMLParamElement"
+  },
+  PopStateEvent: {
+    "^": "Event;",
+    $isPopStateEvent: true,
+    "%": "PopStateEvent"
+  },
+  PositionError: {
+    "^": "Interceptor;code=,message=",
+    "%": "PositionError"
+  },
+  ProcessingInstruction: {
+    "^": "CharacterData;target=",
+    "%": "ProcessingInstruction"
+  },
+  ProgressElement: {
+    "^": "HtmlElement;value%",
+    "%": "HTMLProgressElement"
+  },
+  ProgressEvent: {
+    "^": "Event;loaded=",
+    $isProgressEvent: true,
+    "%": "XMLHttpRequestProgressEvent;ProgressEvent"
+  },
+  ResourceProgressEvent: {
+    "^": "ProgressEvent;url=",
+    "%": "ResourceProgressEvent"
+  },
+  ScriptElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLScriptElement"
+  },
+  SecurityPolicyViolationEvent: {
+    "^": "Event;lineNumber=",
+    "%": "SecurityPolicyViolationEvent"
+  },
+  SelectElement: {
+    "^": "HtmlElement;form=,length%,name%,selectedIndex%,type=,value%",
+    $isSelectElement: true,
+    "%": "HTMLSelectElement"
+  },
+  ShadowRoot: {
+    "^": "DocumentFragment;",
+    getElementById$1: function(receiver, elementId) {
+      return receiver.getElementById(elementId);
+    },
+    $isShadowRoot: true,
+    "%": "ShadowRoot"
+  },
+  SourceElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLSourceElement"
+  },
+  SpeechRecognitionError: {
+    "^": "Event;error=,message=",
+    "%": "SpeechRecognitionError"
+  },
+  SpeechRecognitionEvent: {
+    "^": "Event;results=",
+    "%": "SpeechRecognitionEvent"
+  },
+  SpeechRecognitionResult: {
+    "^": "Interceptor;isFinal=,length=",
+    "%": "SpeechRecognitionResult"
+  },
+  SpeechSynthesisEvent: {
+    "^": "Event;name=",
+    "%": "SpeechSynthesisEvent"
+  },
+  StorageEvent: {
+    "^": "Event;key=,url=",
+    "%": "StorageEvent"
+  },
+  StyleElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLStyleElement"
+  },
+  TableCellElement: {
+    "^": "HtmlElement;",
+    $isTableCellElement: true,
+    "%": "HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"
+  },
+  TableElement: {
+    "^": "HtmlElement;",
+    get$rows: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._WrappedList(receiver.rows), [W.TableRowElement]);
+    },
+    "%": "HTMLTableElement"
+  },
+  TableRowElement: {
+    "^": "HtmlElement;rowIndex=",
+    insertCell$1: function(receiver, index) {
+      return receiver.insertCell(index);
+    },
+    $isTableRowElement: true,
+    "%": "HTMLTableRowElement"
+  },
+  TableSectionElement: {
+    "^": "HtmlElement;",
+    get$rows: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._WrappedList(receiver.rows), [W.TableRowElement]);
+    },
+    "%": "HTMLTableSectionElement"
+  },
+  TemplateElement: {
+    "^": "HtmlElement;content=",
+    $isTemplateElement: true,
+    "%": ";HTMLTemplateElement;TemplateElement_Polymer|TemplateElement_Polymer_Observable|AutoBindingElement"
+  },
+  Text: {
+    "^": "CharacterData;",
+    $isText: true,
+    "%": "CDATASection|Text"
+  },
+  TextAreaElement: {
+    "^": "HtmlElement;form=,name%,rows=,type=,value%",
+    $isTextAreaElement: true,
+    "%": "HTMLTextAreaElement"
+  },
+  TextEvent: {
+    "^": "UIEvent;data=",
+    "%": "TextEvent"
+  },
+  TouchEvent: {
+    "^": "UIEvent;altKey=,ctrlKey=,metaKey=,shiftKey=",
+    "%": "TouchEvent"
+  },
+  TrackElement: {
+    "^": "HtmlElement;kind%,label%",
+    "%": "HTMLTrackElement"
+  },
+  UIEvent: {
+    "^": "Event;detail=",
+    "%": "FocusEvent|SVGZoomEvent;UIEvent"
+  },
+  VideoElement: {
+    "^": "MediaElement;height},width}",
+    "%": "HTMLVideoElement"
+  },
+  Window: {
+    "^": "EventTarget;name%,status%",
+    _requestAnimationFrame$1: function(receiver, callback) {
+      return receiver.requestAnimationFrame(H.convertDartClosureToJS(callback, 1));
+    },
+    _ensureRequestAnimationFrame$0: function(receiver) {
+      if (!!(receiver.requestAnimationFrame && receiver.cancelAnimationFrame))
+        return;
+      (function($this) {
+        var vendors = ['ms', 'moz', 'webkit', 'o'];
+        for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
+          $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
+          $this.cancelAnimationFrame = $this[vendors[i] + 'CancelAnimationFrame'] || $this[vendors[i] + 'CancelRequestAnimationFrame'];
+        }
+        if ($this.requestAnimationFrame && $this.cancelAnimationFrame)
+          return;
+        $this.requestAnimationFrame = function(callback) {
+          return window.setTimeout(function() {
+            callback(Date.now());
+          }, 16);
+        };
+        $this.cancelAnimationFrame = function(id) {
+          clearTimeout(id);
+        };
+      })(receiver);
+    },
+    get$parent: function(receiver) {
+      return W._convertNativeToDart_Window(receiver.parent);
+    },
+    close$0: function(receiver) {
+      return receiver.close();
+    },
+    postMessage$3: function(receiver, message, targetOrigin, messagePorts) {
+      receiver.postMessage(P._convertDartToNative_PrepareForStructuredClone(message), targetOrigin);
+      return;
+    },
+    postMessage$2: function($receiver, message, targetOrigin) {
+      return this.postMessage$3($receiver, message, targetOrigin, null);
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    $isWindow: true,
+    $isEventTarget: true,
+    "%": "DOMWindow|Window"
+  },
+  _Attr: {
+    "^": "Node;name=,value%",
+    "%": "Attr"
+  },
+  _ClientRect: {
+    "^": "Interceptor;bottom=,height=,left=,right=,top=,width=",
+    toString$0: function(receiver) {
+      return "Rectangle (" + H.S(receiver.left) + ", " + H.S(receiver.top) + ") " + H.S(receiver.width) + " x " + H.S(receiver.height);
+    },
+    $eq: function(receiver, other) {
+      var t1, t2, t3;
+      if (other == null)
+        return false;
+      t1 = J.getInterceptor(other);
+      if (!t1.$isRectangle)
+        return false;
+      t2 = receiver.left;
+      t3 = t1.get$left(other);
+      if (t2 == null ? t3 == null : t2 === t3) {
+        t2 = receiver.top;
+        t3 = t1.get$top(other);
+        if (t2 == null ? t3 == null : t2 === t3) {
+          t2 = receiver.width;
+          t3 = t1.get$width(other);
+          if (t2 == null ? t3 == null : t2 === t3) {
+            t2 = receiver.height;
+            t1 = t1.get$height(other);
+            t1 = t2 == null ? t1 == null : t2 === t1;
+          } else
+            t1 = false;
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(receiver) {
+      var t1, t2, t3, t4, hash;
+      t1 = J.get$hashCode$(receiver.left);
+      t2 = J.get$hashCode$(receiver.top);
+      t3 = J.get$hashCode$(receiver.width);
+      t4 = J.get$hashCode$(receiver.height);
+      t4 = W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(0, t1), t2), t3), t4);
+      hash = 536870911 & t4 + ((67108863 & t4) << 3 >>> 0);
+      hash ^= hash >>> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    get$topLeft: function(receiver) {
+      return H.setRuntimeTypeInfo(new P.Point(receiver.left, receiver.top), [null]);
+    },
+    $isRectangle: true,
+    $asRectangle: function() {
+      return [null];
+    },
+    "%": "ClientRect|DOMRect"
+  },
+  _HTMLFrameSetElement: {
+    "^": "HtmlElement;",
+    $isEventTarget: true,
+    "%": "HTMLFrameSetElement"
+  },
+  _NamedNodeMap: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin1;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "MozNamedAttrMap|NamedNodeMap"
+  },
+  _SpeechRecognitionResultList: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin2;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "SpeechRecognitionResultList"
+  },
+  _ChildrenElementList: {
+    "^": "ListBase;_html$_element,_childElements",
+    contains$1: function(_, element) {
+      return J.contains$1$asx(this._childElements, element);
+    },
+    get$isEmpty: function(_) {
+      return this._html$_element.firstElementChild == null;
+    },
+    get$length: function(_) {
+      return this._childElements.length;
+    },
+    $index: function(_, index) {
+      var t1 = this._childElements;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      var t1 = this._childElements;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      this._html$_element.replaceChild(value, t1[index]);
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize element lists"));
+    },
+    add$1: function(_, value) {
+      this._html$_element.appendChild(value);
+      return value;
+    },
+    get$iterator: function(_) {
+      var t1 = this.toList$0(this);
+      return H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]), t2 = this._html$_element; t1.moveNext$0();)
+        t2.appendChild(t1._current);
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort element lists"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnimplementedError$(null));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    insert$2: function(_, index, element) {
+      var t1, t2, t3;
+      if (index > this._childElements.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = this._childElements;
+      t2 = t1.length;
+      t3 = this._html$_element;
+      if (index === t2)
+        t3.appendChild(element);
+      else {
+        if (index >= t2)
+          return H.ioore(t1, index);
+        t3.insertBefore(element, t1[index]);
+      }
+    },
+    setAll$2: function(_, index, iterable) {
+      throw H.wrapException(P.UnimplementedError$(null));
+    },
+    clear$0: function(_) {
+      J._clearChildren$0$x(this._html$_element);
+    },
+    removeLast$0: function(_) {
+      var result = this.get$last(this);
+      if (result != null)
+        this._html$_element.removeChild(result);
+      return result;
+    },
+    get$last: function(_) {
+      var result = this._html$_element.lastElementChild;
+      if (result == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return result;
+    },
+    $asListBase: function() {
+      return [W.Element];
+    },
+    $asObject_ListMixin: function() {
+      return [W.Element];
+    },
+    $asList: function() {
+      return [W.Element];
+    },
+    $asIterable: function() {
+      return [W.Element];
+    }
+  },
+  _FrozenElementList: {
+    "^": "ListBase;_nodeList,_elementList",
+    get$length: function(_) {
+      return this._nodeList.length;
+    },
+    $index: function(_, index) {
+      var t1 = this._nodeList;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify list"));
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify list"));
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    get$last: function(_) {
+      return C.NodeList_methods.get$last(this._nodeList);
+    },
+    get$classes: function(_) {
+      return W._MultiElementCssClassSet$(this._elementList);
+    },
+    get$onChange: function(_) {
+      return H.setRuntimeTypeInfo(new W._ElementListEventStreamImpl(this, false, C.EventStreamProvider_change._eventType), [null]);
+    },
+    get$onInput: function(_) {
+      return H.setRuntimeTypeInfo(new W._ElementListEventStreamImpl(this, false, C.EventStreamProvider_input._eventType), [null]);
+    },
+    _html$_FrozenElementList$_wrap$1: function(_nodeList, $T) {
+      var t1 = C.NodeList_methods.where$1(this._nodeList, new W._FrozenElementList$_wrap_closure());
+      this._elementList = P.List_List$from(t1, true, H.getRuntimeTypeArgument(t1, "IterableBase", 0));
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {_FrozenElementList$_wrap: function(_nodeList, $T) {
+        var t1 = H.setRuntimeTypeInfo(new W._FrozenElementList(_nodeList, null), [$T]);
+        t1._html$_FrozenElementList$_wrap$1(_nodeList, $T);
+        return t1;
+      }}
+  },
+  _FrozenElementList$_wrap_closure: {
+    "^": "Closure:13;",
+    call$1: function(e) {
+      return !!J.getInterceptor(e).$isElement;
+    },
+    $isFunction: true
+  },
+  Entry: {
+    "^": "Interceptor;"
+  },
+  Events: {
+    "^": "Object;_ptr<",
+    $index: function(_, type) {
+      return H.setRuntimeTypeInfo(new W._EventStream(this.get$_ptr(), type, false), [null]);
+    }
+  },
+  ElementEvents: {
+    "^": "Events;_ptr:html$ElementEvents$_ptr<,_ptr",
+    $index: function(_, type) {
+      var t1, t2;
+      t1 = $.get$ElementEvents_webkitEvents();
+      t2 = J.getInterceptor$s(type);
+      if (t1.get$keys()._map.containsKey$1(t2.toLowerCase$0(type)))
+        if (P.Device_isWebKit() === true)
+          return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(this.html$ElementEvents$_ptr, t1.$index(0, t2.toLowerCase$0(type)), false), [null]);
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(this.html$ElementEvents$_ptr, type, false), [null]);
+    },
+    static: {"^": "ElementEvents_webkitEvents"}
+  },
+  Interceptor_ListMixin: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin: {
+    "^": "Interceptor_ListMixin+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  HttpRequest_request_closure: {
+    "^": "Closure:75;xhr_0",
+    call$2: function(header, value) {
+      this.xhr_0.setRequestHeader(header, value);
+    },
+    $isFunction: true
+  },
+  HttpRequest_request_closure0: {
+    "^": "Closure:13;completer_1,xhr_2",
+    call$1: [function(e) {
+      var t1, t2, t3;
+      t1 = this.xhr_2;
+      t2 = t1.status;
+      if (typeof t2 !== "number")
+        return t2.$ge();
+      t2 = t2 >= 200 && t2 < 300 || t2 === 0 || t2 === 304;
+      t3 = this.completer_1;
+      if (t2) {
+        t2 = t3.future;
+        if (t2._state !== 0)
+          H.throwExpression(P.StateError$("Future already completed"));
+        t2._asyncComplete$1(t1);
+      } else
+        t3.completeError$1(e);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  MutationObserver_observe_override: {
+    "^": "Closure:75;parsedOptions_0",
+    call$2: function(key, value) {
+      if (value != null)
+        this.parsedOptions_0[key] = value;
+    },
+    $isFunction: true
+  },
+  _ChildNodeListLazy: {
+    "^": "ListBase;_this",
+    get$last: function(_) {
+      var result = this._this.lastChild;
+      if (result == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return result;
+    },
+    add$1: function(_, value) {
+      this._this.appendChild(value);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]), t2 = this._this; t1.moveNext$0();)
+        t2.appendChild(t1._current);
+    },
+    insert$2: function(_, index, node) {
+      var t1, t2, t3;
+      if (index > this._this.childNodes.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = this._this;
+      t2 = t1.childNodes;
+      t3 = t2.length;
+      if (index === t3)
+        t1.appendChild(node);
+      else {
+        if (index >= t3)
+          return H.ioore(t2, index);
+        t1.insertBefore(node, t2[index]);
+      }
+    },
+    insertAll$2: function(_, index, iterable) {
+      var t1, t2;
+      t1 = this._this;
+      t2 = t1.childNodes;
+      if (index < 0 || index >= t2.length)
+        return H.ioore(t2, index);
+      J.insertAllBefore$2$x(t1, iterable, t2[index]);
+    },
+    setAll$2: function(_, index, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setAll on Node list"));
+    },
+    clear$0: function(_) {
+      J._clearChildren$0$x(this._this);
+    },
+    $indexSet: function(_, index, value) {
+      var t1, t2;
+      t1 = this._this;
+      t2 = t1.childNodes;
+      if (index >>> 0 !== index || index >= t2.length)
+        return H.ioore(t2, index);
+      t1.replaceChild(value, t2[index]);
+    },
+    get$iterator: function(_) {
+      return C.NodeList_methods.get$iterator(this._this.childNodes);
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort Node list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setRange on Node list"));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    get$length: function(_) {
+      return this._this.childNodes.length;
+    },
+    set$length: function(_, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot set length on immutable List."));
+    },
+    $index: function(_, index) {
+      var t1 = this._this.childNodes;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $is_ChildNodeListLazy: true,
+    $asListBase: function() {
+      return [W.Node];
+    },
+    $asObject_ListMixin: function() {
+      return [W.Node];
+    },
+    $asList: function() {
+      return [W.Node];
+    },
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin0: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin0: {
+    "^": "Interceptor_ListMixin0+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin1: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin1: {
+    "^": "Interceptor_ListMixin1+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin2: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.SpeechRecognitionResult];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin2: {
+    "^": "Interceptor_ListMixin2+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.SpeechRecognitionResult];
+    }
+  },
+  _AttributeMap: {
+    "^": "Object;",
+    addAll$1: function(_, other) {
+      J.forEach$1$ax(other, new W._AttributeMap_addAll_closure(this));
+    },
+    clear$0: function(_) {
+      var t1;
+      for (t1 = this.get$keys(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        this.remove$1(0, t1._current);
+    },
+    forEach$1: function(_, f) {
+      var t1, key;
+      for (t1 = this.get$keys(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        key = t1._current;
+        f.call$2(key, this.$index(0, key));
+      }
+    },
+    get$keys: function() {
+      var attributes, keys, len, i;
+      attributes = this._html$_element.attributes;
+      keys = H.setRuntimeTypeInfo([], [P.String]);
+      for (len = attributes.length, i = 0; i < len; ++i) {
+        if (i >= attributes.length)
+          return H.ioore(attributes, i);
+        if (this._matches$1(attributes[i])) {
+          if (i >= attributes.length)
+            return H.ioore(attributes, i);
+          keys.push(J.get$name$x(attributes[i]));
+        }
+      }
+      return keys;
+    },
+    get$values: function(_) {
+      var attributes, values, len, i;
+      attributes = this._html$_element.attributes;
+      values = H.setRuntimeTypeInfo([], [P.String]);
+      for (len = attributes.length, i = 0; i < len; ++i) {
+        if (i >= attributes.length)
+          return H.ioore(attributes, i);
+        if (this._matches$1(attributes[i])) {
+          if (i >= attributes.length)
+            return H.ioore(attributes, i);
+          values.push(J.get$value$x(attributes[i]));
+        }
+      }
+      return values;
+    },
+    get$isEmpty: function(_) {
+      return this.get$length(this) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$length(this) !== 0;
+    },
+    $isMap: true,
+    $asMap: function() {
+      return [P.String, P.String];
+    }
+  },
+  _AttributeMap_addAll_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(k, v) {
+      this.this_0.$indexSet(0, k, v);
+    },
+    $isFunction: true
+  },
+  _ElementAttributeMap: {
+    "^": "_AttributeMap;_html$_element",
+    containsKey$1: function(key) {
+      return this._html$_element.hasAttribute(key);
+    },
+    $index: function(_, key) {
+      return this._html$_element.getAttribute(key);
+    },
+    $indexSet: function(_, key, value) {
+      this._html$_element.setAttribute(key, value);
+    },
+    remove$1: function(_, key) {
+      var t1, value;
+      t1 = this._html$_element;
+      value = t1.getAttribute(key);
+      t1.removeAttribute(key);
+      return value;
+    },
+    get$length: function(_) {
+      return this.get$keys().length;
+    },
+    _matches$1: function(node) {
+      return node.namespaceURI == null;
+    }
+  },
+  _MultiElementCssClassSet: {
+    "^": "CssClassSetImpl;_elementIterable,_elementCssClassSetIterable",
+    readClasses$0: function() {
+      var s = P.LinkedHashSet_LinkedHashSet(null, null, null, P.String);
+      this._elementCssClassSetIterable.forEach$1(0, new W._MultiElementCssClassSet_readClasses_closure(s));
+      return s;
+    },
+    writeClasses$1: function(s) {
+      var classes, t1;
+      classes = C.JSArray_methods.join$1(P.List_List$from(s, true, null), " ");
+      for (t1 = this._elementIterable, t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.set$className$x(t1._current, classes);
+    },
+    modify$1: function(f) {
+      this._elementCssClassSetIterable.forEach$1(0, new W._MultiElementCssClassSet_modify_closure(f));
+    },
+    _MultiElementCssClassSet$1: function(_elementIterable) {
+      this._elementCssClassSetIterable = H.setRuntimeTypeInfo(new H.MappedListIterable(P.List_List$from(this._elementIterable, true, null), new W._MultiElementCssClassSet_closure()), [null, null]);
+    },
+    static: {_MultiElementCssClassSet$: function(_elementIterable) {
+        var t1 = new W._MultiElementCssClassSet(_elementIterable, null);
+        t1._MultiElementCssClassSet$1(_elementIterable);
+        return t1;
+      }}
+  },
+  _MultiElementCssClassSet_closure: {
+    "^": "Closure:13;",
+    call$1: [function(e) {
+      return new W._ElementCssClassSet(e);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _MultiElementCssClassSet_readClasses_closure: {
+    "^": "Closure:13;s_0",
+    call$1: function(e) {
+      return this.s_0.addAll$1(0, e.readClasses$0());
+    },
+    $isFunction: true
+  },
+  _MultiElementCssClassSet_modify_closure: {
+    "^": "Closure:13;f_0",
+    call$1: function(e) {
+      return e.modify$1(this.f_0);
+    },
+    $isFunction: true
+  },
+  _ElementCssClassSet: {
+    "^": "CssClassSetImpl;_html$_element",
+    readClasses$0: function() {
+      var s, t1, trimmed;
+      s = P.LinkedHashSet_LinkedHashSet(null, null, null, P.String);
+      for (t1 = J.get$className$x(this._html$_element).split(" "), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        trimmed = J.trim$0$s(t1._current);
+        if (trimmed.length !== 0)
+          s.add$1(0, trimmed);
+      }
+      return s;
+    },
+    writeClasses$1: function(s) {
+      P.List_List$from(s, true, null);
+      J.set$className$x(this._html$_element, s.join$1(0, " "));
+    }
+  },
+  EventStreamProvider: {
+    "^": "Object;_eventType",
+    forTarget$2$useCapture: function(e, useCapture) {
+      return H.setRuntimeTypeInfo(new W._EventStream(e, this._eventType, useCapture), [null]);
+    },
+    forTarget$1: function(e) {
+      return this.forTarget$2$useCapture(e, false);
+    }
+  },
+  _EventStream: {
+    "^": "Stream;_html$_target,_eventType,_useCapture",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var t1 = new W._EventStreamSubscription(0, this._html$_target, this._eventType, W._wrapZone(onData), this._useCapture);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      t1._tryResume$0();
+      return t1;
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    }
+  },
+  _ElementEventStreamImpl: {
+    "^": "_EventStream;_html$_target,_eventType,_useCapture",
+    matches$1: function(_, selector) {
+      var t1 = H.setRuntimeTypeInfo(new P._WhereStream(new W._ElementEventStreamImpl_matches_closure(selector), this), [H.getRuntimeTypeArgument(this, "Stream", 0)]);
+      return H.setRuntimeTypeInfo(new P._MapStream(new W._ElementEventStreamImpl_matches_closure0(selector), t1), [H.getRuntimeTypeArgument(t1, "Stream", 0), null]);
+    },
+    $isStream: true
+  },
+  _ElementEventStreamImpl_matches_closure: {
+    "^": "Closure:13;selector_0",
+    call$1: function($event) {
+      return J.matchesWithAncestors$1$x(J.get$target$x($event), this.selector_0);
+    },
+    $isFunction: true
+  },
+  _ElementEventStreamImpl_matches_closure0: {
+    "^": "Closure:13;selector_1",
+    call$1: [function(e) {
+      J.set$_selector$x(e, this.selector_1);
+      return e;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _ElementListEventStreamImpl: {
+    "^": "Stream;_targetList,_useCapture,_eventType",
+    matches$1: function(_, selector) {
+      var t1 = H.setRuntimeTypeInfo(new P._WhereStream(new W._ElementListEventStreamImpl_matches_closure(selector), this), [H.getRuntimeTypeArgument(this, "Stream", 0)]);
+      return H.setRuntimeTypeInfo(new P._MapStream(new W._ElementListEventStreamImpl_matches_closure0(selector), t1), [H.getRuntimeTypeArgument(t1, "Stream", 0), null]);
+    },
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var pool, t1, t2, t3, t4;
+      pool = H.setRuntimeTypeInfo(new W._StreamPool(null, P.LinkedHashMap_LinkedHashMap(null, null, null, [P.Stream, null], [P.StreamSubscription, null])), [null]);
+      pool._html$_StreamPool$broadcast$0(null);
+      for (t1 = this._targetList, t1 = t1.get$iterator(t1), t2 = this._eventType, t3 = this._useCapture; t1.moveNext$0();) {
+        t4 = new W._EventStream(t1._current, t2, t3);
+        t4.$builtinTypeInfo = [null];
+        pool.add$1(0, t4);
+      }
+      t1 = pool._html$_controller;
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]).listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError);
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    $isStream: true
+  },
+  _ElementListEventStreamImpl_matches_closure: {
+    "^": "Closure:13;selector_0",
+    call$1: function($event) {
+      return J.matchesWithAncestors$1$x(J.get$target$x($event), this.selector_0);
+    },
+    $isFunction: true
+  },
+  _ElementListEventStreamImpl_matches_closure0: {
+    "^": "Closure:13;selector_1",
+    call$1: [function(e) {
+      J.set$_selector$x(e, this.selector_1);
+      return e;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _EventStreamSubscription: {
+    "^": "StreamSubscription;_pauseCount,_html$_target,_eventType,_html$_onData,_useCapture",
+    cancel$0: function() {
+      if (this._html$_target == null)
+        return;
+      this._unlisten$0();
+      this._html$_target = null;
+      this._html$_onData = null;
+      return;
+    },
+    pause$1: [function(_, resumeSignal) {
+      if (this._html$_target == null)
+        return;
+      ++this._pauseCount;
+      this._unlisten$0();
+      if (resumeSignal != null)
+        resumeSignal.whenComplete$1(this.get$resume(this));
+    }, function($receiver) {
+      return this.pause$1($receiver, null);
+    }, "pause$0", "call$1", "call$0", "get$pause", 0, 2, 116, 23, 117],
+    get$isPaused: function() {
+      return this._pauseCount > 0;
+    },
+    resume$0: [function(_) {
+      if (this._html$_target == null || this._pauseCount <= 0)
+        return;
+      --this._pauseCount;
+      this._tryResume$0();
+    }, "call$0", "get$resume", 0, 0, 18],
+    _tryResume$0: function() {
+      var t1 = this._html$_onData;
+      if (t1 != null && this._pauseCount <= 0)
+        J.addEventListener$3$x(this._html$_target, this._eventType, t1, this._useCapture);
+    },
+    _unlisten$0: function() {
+      var t1 = this._html$_onData;
+      if (t1 != null)
+        J.removeEventListener$3$x(this._html$_target, this._eventType, t1, this._useCapture);
+    }
+  },
+  _StreamPool: {
+    "^": "Object;_html$_controller,_subscriptions",
+    add$1: function(_, stream) {
+      var t1, t2;
+      t1 = this._subscriptions;
+      if (t1.containsKey$1(stream))
+        return;
+      t2 = this._html$_controller;
+      t1.$indexSet(0, stream, stream.listen$3$onDone$onError(t2.get$add(t2), new W._StreamPool_add_closure(this, stream), this._html$_controller.get$addError()));
+    },
+    remove$1: function(_, stream) {
+      var subscription = this._subscriptions.remove$1(0, stream);
+      if (subscription != null)
+        subscription.cancel$0();
+    },
+    close$0: [function(_) {
+      var t1, t2;
+      for (t1 = this._subscriptions, t2 = t1.get$values(t1), t2 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t2._iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0), H.getTypeArgumentByIndex(t2, 1)]); t2.moveNext$0();)
+        t2._current.cancel$0();
+      t1.clear$0(0);
+      this._html$_controller.close$0(0);
+    }, "call$0", "get$close", 0, 0, 18],
+    _html$_StreamPool$broadcast$0: function($T) {
+      this._html$_controller = P.StreamController_StreamController$broadcast(this.get$close(this), null, true, $T);
+    }
+  },
+  _StreamPool_add_closure: {
+    "^": "Closure:69;this_0,stream_1",
+    call$0: [function() {
+      return this.this_0.remove$1(0, this.stream_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  ImmutableListMixin: {
+    "^": "Object;",
+    get$iterator: function(receiver) {
+      return H.setRuntimeTypeInfo(new W.FixedSizeListIterator(receiver, this.get$length(receiver), -1, null), [H.getRuntimeTypeArgument(receiver, "ImmutableListMixin", 0)]);
+    },
+    add$1: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    addAll$1: function(receiver, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    sort$1: function(receiver, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort immutable List."));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    insert$2: function(receiver, index, element) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    setAll$2: function(receiver, index, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an immutable List."));
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setRange on immutable List."));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(receiver, start, end) {
+      throw H.wrapException(P.UnsupportedError$("Cannot removeRange on immutable List."));
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  _WrappedList: {
+    "^": "ListBase;_list",
+    get$iterator: function(_) {
+      return H.setRuntimeTypeInfo(new W._WrappedIterator(J.get$iterator$ax(this._list)), [null]);
+    },
+    get$length: function(_) {
+      return this._list.length;
+    },
+    add$1: function(_, element) {
+      J.add$1$ax(this._list, element);
+    },
+    clear$0: function(_) {
+      J.clear$0$ax(this._list);
+    },
+    $index: function(_, index) {
+      var t1 = this._list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      var t1 = this._list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      t1[index] = value;
+    },
+    set$length: function(_, newLength) {
+      J.set$length$asx(this._list, newLength);
+    },
+    sort$1: function(_, compare) {
+      J.sort$1$ax(this._list, compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    indexOf$2: function(_, element, start) {
+      return J.indexOf$2$asx(this._list, element, start);
+    },
+    indexOf$1: function($receiver, element) {
+      return this.indexOf$2($receiver, element, 0);
+    },
+    lastIndexOf$2: function(_, element, start) {
+      return J.lastIndexOf$2$asx(this._list, element, start);
+    },
+    lastIndexOf$1: function($receiver, element) {
+      return this.lastIndexOf$2($receiver, element, null);
+    },
+    insert$2: function(_, index, element) {
+      return J.insert$2$ax(this._list, index, element);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      J.setRange$4$ax(this._list, start, end, iterable, skipCount);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(_, start, end) {
+      J.removeRange$2$ax(this._list, start, end);
+    }
+  },
+  _WrappedIterator: {
+    "^": "Object;_html$_iterator",
+    moveNext$0: function() {
+      return this._html$_iterator.moveNext$0();
+    },
+    get$current: function() {
+      return this._html$_iterator._html$_current;
+    }
+  },
+  FixedSizeListIterator: {
+    "^": "Object;_array,_html$_length,_position,_html$_current",
+    moveNext$0: function() {
+      var nextPosition, t1;
+      nextPosition = this._position + 1;
+      t1 = this._html$_length;
+      if (nextPosition < t1) {
+        this._html$_current = J.$index$asx(this._array, nextPosition);
+        this._position = nextPosition;
+        return true;
+      }
+      this._html$_current = null;
+      this._position = t1;
+      return false;
+    },
+    get$current: function() {
+      return this._html$_current;
+    }
+  },
+  _callConstructor_closure: {
+    "^": "Closure:13;constructor_0,interceptor_1",
+    call$1: [function(receiver) {
+      var t1 = H.makeLeafDispatchRecord(this.interceptor_1);
+      Object.defineProperty(receiver, init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+      receiver.constructor = receiver.__proto__.constructor;
+      return this.constructor_0(receiver);
+    }, "call$1", null, 2, 0, null, 54, "call"],
+    $isFunction: true
+  },
+  _DOMWindowCrossFrame: {
+    "^": "Object;_window",
+    get$parent: function(_) {
+      return W._DOMWindowCrossFrame__createSafe(this._window.parent);
+    },
+    close$0: function(_) {
+      return this._window.close();
+    },
+    postMessage$3: function(_, message, targetOrigin, messagePorts) {
+      this._window.postMessage(P._convertDartToNative_PrepareForStructuredClone(message), targetOrigin);
+    },
+    postMessage$2: function($receiver, message, targetOrigin) {
+      return this.postMessage$3($receiver, message, targetOrigin, null);
+    },
+    get$on: function(_) {
+      return H.throwExpression(P.UnsupportedError$("You can only attach EventListeners to your own window."));
+    },
+    addEventListener$3: function(_, type, listener, useCapture) {
+      return H.throwExpression(P.UnsupportedError$("You can only attach EventListeners to your own window."));
+    },
+    removeEventListener$3: function(_, type, listener, useCapture) {
+      return H.throwExpression(P.UnsupportedError$("You can only attach EventListeners to your own window."));
+    },
+    $isEventTarget: true,
+    static: {_DOMWindowCrossFrame__createSafe: function(w) {
+        if (w === window)
+          return w;
+        else
+          return new W._DOMWindowCrossFrame(w);
+      }}
+  }
+}],
+["dart.dom.indexed_db", "dart:indexed_db", , P, {
+  "^": "",
+  KeyRange: {
+    "^": "Interceptor;",
+    $isKeyRange: true,
+    "%": "IDBKeyRange"
+  }
+}],
+["dart.dom.svg", "dart:svg", , P, {
+  "^": "",
+  AElement: {
+    "^": "GraphicsElement;target=,href=",
+    "%": "SVGAElement"
+  },
+  AltGlyphElement: {
+    "^": "TextPositioningElement;href=",
+    "%": "SVGAltGlyphElement"
+  },
+  FEBlendElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEBlendElement"
+  },
+  FEColorMatrixElement: {
+    "^": "SvgElement;type=,values=,result=,x=,y=",
+    "%": "SVGFEColorMatrixElement"
+  },
+  FEComponentTransferElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEComponentTransferElement"
+  },
+  FECompositeElement: {
+    "^": "SvgElement;operator=,result=,x=,y=",
+    "%": "SVGFECompositeElement"
+  },
+  FEConvolveMatrixElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEConvolveMatrixElement"
+  },
+  FEDiffuseLightingElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEDiffuseLightingElement"
+  },
+  FEDisplacementMapElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEDisplacementMapElement"
+  },
+  FEFloodElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEFloodElement"
+  },
+  FEGaussianBlurElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEGaussianBlurElement"
+  },
+  FEImageElement: {
+    "^": "SvgElement;result=,x=,y=,href=",
+    "%": "SVGFEImageElement"
+  },
+  FEMergeElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEMergeElement"
+  },
+  FEMorphologyElement: {
+    "^": "SvgElement;operator=,result=,x=,y=",
+    "%": "SVGFEMorphologyElement"
+  },
+  FEOffsetElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEOffsetElement"
+  },
+  FEPointLightElement: {
+    "^": "SvgElement;x=,y=",
+    "%": "SVGFEPointLightElement"
+  },
+  FESpecularLightingElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFESpecularLightingElement"
+  },
+  FESpotLightElement: {
+    "^": "SvgElement;x=,y=",
+    "%": "SVGFESpotLightElement"
+  },
+  FETileElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFETileElement"
+  },
+  FETurbulenceElement: {
+    "^": "SvgElement;type=,result=,x=,y=",
+    "%": "SVGFETurbulenceElement"
+  },
+  FilterElement: {
+    "^": "SvgElement;x=,y=,href=",
+    "%": "SVGFilterElement"
+  },
+  ForeignObjectElement: {
+    "^": "GraphicsElement;x=,y=",
+    "%": "SVGForeignObjectElement"
+  },
+  GeometryElement: {
+    "^": "GraphicsElement;",
+    "%": "SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"
+  },
+  GraphicsElement: {
+    "^": "SvgElement;",
+    "%": "SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"
+  },
+  ImageElement0: {
+    "^": "GraphicsElement;x=,y=,href=",
+    "%": "SVGImageElement"
+  },
+  MaskElement: {
+    "^": "SvgElement;x=,y=",
+    "%": "SVGMaskElement"
+  },
+  PatternElement: {
+    "^": "SvgElement;x=,y=,href=",
+    "%": "SVGPatternElement"
+  },
+  RectElement: {
+    "^": "GeometryElement;x=,y=",
+    "%": "SVGRectElement"
+  },
+  ScriptElement0: {
+    "^": "SvgElement;type%,href=",
+    "%": "SVGScriptElement"
+  },
+  StyleElement0: {
+    "^": "SvgElement;type%",
+    set$title: function(receiver, value) {
+      receiver.title = value;
+    },
+    "%": "SVGStyleElement"
+  },
+  SvgElement: {
+    "^": "Element;",
+    get$classes: function(receiver) {
+      if (receiver._cssClassSet == null)
+        receiver._cssClassSet = new P._AttributeClassSet(receiver);
+      return receiver._cssClassSet;
+    },
+    get$children: function(receiver) {
+      return H.setRuntimeTypeInfo(new P.FilteredElementList(receiver, new W._ChildNodeListLazy(receiver)), [W.Element]);
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onClick: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_click._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    get$onMouseDown: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousedown._eventType, false), [null]);
+    },
+    get$onMouseMove: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousemove._eventType, false), [null]);
+    },
+    $isEventTarget: 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: {"^": "SvgElement_pauseEvent<"}
+  },
+  SvgSvgElement: {
+    "^": "GraphicsElement;x=,y=",
+    getElementById$1: function(receiver, elementId) {
+      return receiver.getElementById(elementId);
+    },
+    $isSvgSvgElement: true,
+    "%": "SVGSVGElement"
+  },
+  TextContentElement: {
+    "^": "GraphicsElement;",
+    "%": ";SVGTextContentElement"
+  },
+  TextPathElement: {
+    "^": "TextContentElement;href=",
+    "%": "SVGTextPathElement"
+  },
+  TextPositioningElement: {
+    "^": "TextContentElement;x=,y=",
+    "%": "SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"
+  },
+  UseElement: {
+    "^": "GraphicsElement;x=,y=,href=",
+    "%": "SVGUseElement"
+  },
+  _GradientElement: {
+    "^": "SvgElement;href=",
+    "%": "SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"
+  },
+  _AttributeClassSet: {
+    "^": "CssClassSetImpl;_svg$_element",
+    readClasses$0: function() {
+      var classname, s, t1, trimmed;
+      classname = this._svg$_element.getAttribute("class");
+      s = P.LinkedHashSet_LinkedHashSet(null, null, null, P.String);
+      if (classname == null)
+        return s;
+      for (t1 = classname.split(" "), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        trimmed = J.trim$0$s(t1._current);
+        if (trimmed.length !== 0)
+          s.add$1(0, trimmed);
+      }
+      return s;
+    },
+    writeClasses$1: function(s) {
+      this._svg$_element.setAttribute("class", s.join$1(0, " "));
+    }
+  }
+}],
+["dart.dom.web_sql", "dart:web_sql", , P, {
+  "^": "",
+  SqlError: {
+    "^": "Interceptor;code=,message=",
+    "%": "SQLError"
+  }
+}],
+["dart.isolate", "dart:isolate", , P, {
+  "^": "",
+  ReceivePort_ReceivePort: function() {
+    var t1, t2, t3;
+    t1 = $.RawReceivePortImpl__nextFreeId;
+    $.RawReceivePortImpl__nextFreeId = t1 + 1;
+    t2 = new H.RawReceivePortImpl(t1, null, false);
+    t3 = init.globalState.currentContext;
+    t3._addRegistration$2(t1, t2);
+    t3._updateGlobalState$0();
+    t3 = new H.ReceivePortImpl(t2, null);
+    t3.ReceivePortImpl$fromRawReceivePort$1(t2);
+    return t3;
+  },
+  Capability: {
+    "^": "Object;",
+    $isCapability: true,
+    static: {Capability_Capability: function() {
+        return new H.CapabilityImpl((Math.random() * 0x100000000 >>> 0) + (Math.random() * 0x100000000 >>> 0) * 4294967296);
+      }}
+  }
+}],
+["dart.js", "dart:js", , P, {
+  "^": "",
+  _convertDartFunction: function(f, captureThis) {
+    return function(_call, f, captureThis) {
+      return function() {
+        return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));
+      };
+    }(P._callDartFunction, f, captureThis);
+  },
+  _callDartFunction: [function(callback, captureThis, $self, $arguments) {
+    var arguments0;
+    if (captureThis === true) {
+      arguments0 = [$self];
+      C.JSArray_methods.addAll$1(arguments0, $arguments);
+      $arguments = arguments0;
+    }
+    return P._convertToJS(H.Primitives_applyFunction(callback, P.List_List$from(J.map$1$ax($arguments, P._convertToDart$closure()), true, null), P.Function__toMangledNames(null)));
+  }, "call$4", "_callDartFunction$closure", 8, 0, null, 41, 59, 27, 60],
+  _defineProperty: function(o, $name, value) {
+    var exception;
+    if (Object.isExtensible(o))
+      try {
+        Object.defineProperty(o, $name, {value: value});
+        return true;
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+
+    return false;
+  },
+  _getOwnProperty: function(o, $name) {
+    if (Object.prototype.hasOwnProperty.call(o, $name))
+      return o[$name];
+    return;
+  },
+  _convertToJS: [function(o) {
+    var t1;
+    if (o == null)
+      return;
+    else if (typeof o === "string" || typeof o === "number" || typeof o === "boolean")
+      return o;
+    else {
+      t1 = J.getInterceptor(o);
+      if (!!t1.$isBlob || !!t1.$isEvent || !!t1.$isKeyRange || !!t1.$isImageData || !!t1.$isNode || !!t1.$isTypedData || !!t1.$isWindow)
+        return o;
+      else if (!!t1.$isDateTime)
+        return H.Primitives_lazyAsJsDate(o);
+      else if (!!t1.$isJsObject)
+        return o._js$_jsObject;
+      else if (!!t1.$isFunction)
+        return P._getJsProxy(o, "$dart_jsFunction", new P._convertToJS_closure());
+      else
+        return P._getJsProxy(o, "_$dart_jsObject", new P._convertToJS_closure0($.get$_dartProxyCtor()));
+    }
+  }, "call$1", "_convertToJS$closure", 2, 0, 13, 61],
+  _getJsProxy: function(o, propertyName, createProxy) {
+    var jsProxy = P._getOwnProperty(o, propertyName);
+    if (jsProxy == null) {
+      jsProxy = createProxy.call$1(o);
+      P._defineProperty(o, propertyName, jsProxy);
+    }
+    return jsProxy;
+  },
+  _convertToDart: [function(o) {
+    var t1;
+    if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean")
+      return o;
+    else {
+      if (o instanceof Object) {
+        t1 = J.getInterceptor(o);
+        t1 = !!t1.$isBlob || !!t1.$isEvent || !!t1.$isKeyRange || !!t1.$isImageData || !!t1.$isNode || !!t1.$isTypedData || !!t1.$isWindow;
+      } else
+        t1 = false;
+      if (t1)
+        return o;
+      else if (o instanceof Date)
+        return P.DateTime$fromMillisecondsSinceEpoch(o.getTime(), false);
+      else if (o.constructor === $.get$_dartProxyCtor())
+        return o.o;
+      else
+        return P._wrapToDart(o);
+    }
+  }, "call$1", "_convertToDart$closure", 2, 0, 49, 61],
+  _wrapToDart: function(o) {
+    if (typeof o == "function")
+      return P._getDartProxy(o, $.get$_DART_CLOSURE_PROPERTY_NAME(), new P._wrapToDart_closure());
+    else if (o instanceof Array)
+      return P._getDartProxy(o, $.get$_DART_OBJECT_PROPERTY_NAME(), new P._wrapToDart_closure0());
+    else
+      return P._getDartProxy(o, $.get$_DART_OBJECT_PROPERTY_NAME(), new P._wrapToDart_closure1());
+  },
+  _getDartProxy: function(o, propertyName, createProxy) {
+    var dartProxy = P._getOwnProperty(o, propertyName);
+    if (dartProxy == null || !(o instanceof Object)) {
+      dartProxy = createProxy.call$1(o);
+      P._defineProperty(o, propertyName, dartProxy);
+    }
+    return dartProxy;
+  },
+  JsObject: {
+    "^": "Object;_js$_jsObject",
+    $index: function(_, property) {
+      if (typeof property !== "string" && typeof property !== "number")
+        throw H.wrapException(P.ArgumentError$("property is not a String or num"));
+      return P._convertToDart(this._js$_jsObject[property]);
+    },
+    $indexSet: function(_, property, value) {
+      if (typeof property !== "string" && typeof property !== "number")
+        throw H.wrapException(P.ArgumentError$("property is not a String or num"));
+      this._js$_jsObject[property] = P._convertToJS(value);
+    },
+    get$hashCode: function(_) {
+      return 0;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isJsObject && this._js$_jsObject === other._js$_jsObject;
+    },
+    hasProperty$1: function(property) {
+      return property in this._js$_jsObject;
+    },
+    toString$0: function(_) {
+      var t1, exception;
+      try {
+        t1 = String(this._js$_jsObject);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return P.Object.prototype.toString$0.call(this, this);
+      }
+
+    },
+    callMethod$2: function(method, args) {
+      var t1, t2;
+      t1 = this._js$_jsObject;
+      t2 = args == null ? null : P.List_List$from(H.setRuntimeTypeInfo(new H.MappedListIterable(args, P._convertToJS$closure()), [null, null]), true, null);
+      return P._convertToDart(t1[method].apply(t1, t2));
+    },
+    callMethod$1: function(method) {
+      return this.callMethod$2(method, null);
+    },
+    $isJsObject: true,
+    static: {JsObject_JsObject: function($constructor, $arguments) {
+        var constr, args, factoryFunction;
+        constr = P._convertToJS($constructor);
+        if ($arguments == null)
+          return P._wrapToDart(new constr());
+        args = [null];
+        C.JSArray_methods.addAll$1(args, H.setRuntimeTypeInfo(new H.MappedListIterable($arguments, P._convertToJS$closure()), [null, null]));
+        factoryFunction = constr.bind.apply(constr, args);
+        String(factoryFunction);
+        return P._wrapToDart(new factoryFunction());
+      }, JsObject_JsObject$fromBrowserObject: function(object) {
+        if (object == null)
+          throw H.wrapException(P.ArgumentError$("object cannot be a num, string, bool, or null"));
+        return P._wrapToDart(P._convertToJS(object));
+      }, JsObject_JsObject$jsify: function(object) {
+        return P._wrapToDart(P.JsObject__convertDataTree(object));
+      }, JsObject__convertDataTree: function(data) {
+        return new P.JsObject__convertDataTree__convert(P.HashMap_HashMap$identity(null, null)).call$1(data);
+      }}
+  },
+  JsObject__convertDataTree__convert: {
+    "^": "Closure:13;_convertedObjects_0",
+    call$1: [function(o) {
+      var t1, t2, convertedMap, key, convertedList;
+      t1 = this._convertedObjects_0;
+      if (t1.containsKey$1(o))
+        return t1.$index(0, o);
+      t2 = J.getInterceptor(o);
+      if (!!t2.$isMap) {
+        convertedMap = {};
+        t1.$indexSet(0, o, convertedMap);
+        for (t1 = J.get$iterator$ax(o.get$keys()); t1.moveNext$0();) {
+          key = t1.get$current();
+          convertedMap[key] = this.call$1(t2.$index(o, key));
+        }
+        return convertedMap;
+      } else if (!!t2.$isIterable) {
+        convertedList = [];
+        t1.$indexSet(0, o, convertedList);
+        C.JSArray_methods.addAll$1(convertedList, t2.map$1(o, this));
+        return convertedList;
+      } else
+        return P._convertToJS(o);
+    }, "call$1", null, 2, 0, null, 61, "call"],
+    $isFunction: true
+  },
+  JsFunction: {
+    "^": "JsObject;_js$_jsObject",
+    apply$2$thisArg: function(args, thisArg) {
+      var t1, t2;
+      t1 = P._convertToJS(thisArg);
+      t2 = P.List_List$from(H.setRuntimeTypeInfo(new H.MappedListIterable(args, P._convertToJS$closure()), [null, null]), true, null);
+      return P._convertToDart(this._js$_jsObject.apply(t1, t2));
+    },
+    apply$1: function(args) {
+      return this.apply$2$thisArg(args, null);
+    },
+    $isJsFunction: true,
+    static: {JsFunction_JsFunction$withThis: function(f) {
+        return new P.JsFunction(P._convertDartFunction(f, true));
+      }}
+  },
+  JsArray: {
+    "^": "JsObject_ListMixin;_js$_jsObject",
+    $index: function(_, index) {
+      var t1;
+      if (typeof index === "number" && index === C.JSNumber_methods.toInt$0(index)) {
+        if (typeof index === "number" && Math.floor(index) === index)
+          t1 = index < 0 || index >= this.get$length(this);
+        else
+          t1 = false;
+        if (t1)
+          H.throwExpression(P.RangeError$range(index, 0, this.get$length(this)));
+      }
+      return P.JsObject.prototype.$index.call(this, this, index);
+    },
+    $indexSet: function(_, index, value) {
+      var t1;
+      if (typeof index === "number" && index === C.JSNumber_methods.toInt$0(index)) {
+        if (typeof index === "number" && Math.floor(index) === index)
+          t1 = index < 0 || index >= this.get$length(this);
+        else
+          t1 = false;
+        if (t1)
+          H.throwExpression(P.RangeError$range(index, 0, this.get$length(this)));
+      }
+      P.JsObject.prototype.$indexSet.call(this, this, index, value);
+    },
+    get$length: function(_) {
+      var len = this._js$_jsObject.length;
+      if (typeof len === "number" && len >>> 0 === len)
+        return len;
+      throw H.wrapException(P.StateError$("Bad JsArray length"));
+    },
+    set$length: function(_, $length) {
+      P.JsObject.prototype.$indexSet.call(this, this, "length", $length);
+    },
+    add$1: function(_, value) {
+      this.callMethod$2("push", [value]);
+    },
+    addAll$1: function(_, iterable) {
+      this.callMethod$2("push", iterable instanceof Array ? iterable : P.List_List$from(iterable, true, null));
+    },
+    insert$2: function(_, index, element) {
+      if (index >= this.get$length(this) + 1)
+        H.throwExpression(P.RangeError$range(index, 0, this.get$length(this)));
+      this.callMethod$2("splice", [index, 0, element]);
+    },
+    removeRange$2: function(_, start, end) {
+      P.JsArray__checkRange(start, end, this.get$length(this));
+      this.callMethod$2("splice", [start, end - start]);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      var t1, $length, args;
+      t1 = this.get$length(this);
+      if (start < 0 || start > t1)
+        H.throwExpression(P.RangeError$range(start, 0, t1));
+      if (end < start || end > t1)
+        H.throwExpression(P.RangeError$range(end, start, t1));
+      $length = end - start;
+      if ($length === 0)
+        return;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      args = [start, $length];
+      C.JSArray_methods.addAll$1(args, J.skip$1$ax(iterable, skipCount).take$1(0, $length));
+      this.callMethod$2("splice", args);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    sort$1: function(_, compare) {
+      this.callMethod$2("sort", [compare]);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    static: {JsArray__checkRange: function(start, end, $length) {
+        if (start < 0 || start > $length)
+          throw H.wrapException(P.RangeError$range(start, 0, $length));
+        if (end < start || end > $length)
+          throw H.wrapException(P.RangeError$range(end, start, $length));
+      }}
+  },
+  JsObject_ListMixin: {
+    "^": "JsObject+ListMixin;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  _convertToJS_closure: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      var jsFunction = P._convertDartFunction(o, false);
+      P._defineProperty(jsFunction, $.get$_DART_CLOSURE_PROPERTY_NAME(), o);
+      return jsFunction;
+    },
+    $isFunction: true
+  },
+  _convertToJS_closure0: {
+    "^": "Closure:13;ctor_0",
+    call$1: function(o) {
+      return new this.ctor_0(o);
+    },
+    $isFunction: true
+  },
+  _wrapToDart_closure: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return new P.JsFunction(o);
+    },
+    $isFunction: true
+  },
+  _wrapToDart_closure0: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return H.setRuntimeTypeInfo(new P.JsArray(o), [null]);
+    },
+    $isFunction: true
+  },
+  _wrapToDart_closure1: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return new P.JsObject(o);
+    },
+    $isFunction: true
+  }
+}],
+["dart.math", "dart:math", , P, {
+  "^": "",
+  _JenkinsSmiHash_combine0: function(hash, value) {
+    hash = 536870911 & hash + value;
+    hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+    return hash ^ hash >>> 6;
+  },
+  _JenkinsSmiHash_finish: function(hash) {
+    hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+    hash ^= hash >>> 11;
+    return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+  },
+  min: function(a, b) {
+    var t1;
+    if (typeof a !== "number")
+      throw H.wrapException(P.ArgumentError$(a));
+    if (typeof b !== "number")
+      throw H.wrapException(P.ArgumentError$(b));
+    if (a > b)
+      return b;
+    if (a < b)
+      return a;
+    if (typeof b === "number") {
+      if (typeof a === "number")
+        if (a === 0)
+          return (a + b) * a * b;
+      if (a === 0)
+        t1 = b === 0 ? 1 / b < 0 : b < 0;
+      else
+        t1 = false;
+      if (t1 || isNaN(b))
+        return b;
+      return a;
+    }
+    return a;
+  },
+  max: function(a, b) {
+    if (typeof a !== "number")
+      throw H.wrapException(P.ArgumentError$(a));
+    if (typeof b !== "number")
+      throw H.wrapException(P.ArgumentError$(b));
+    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.JSDouble_methods.get$isNaN(b))
+        return b;
+      return a;
+    }
+    if (b === 0 && C.JSNumber_methods.get$isNegative(a))
+      return b;
+    return a;
+  },
+  _JSRandom: {
+    "^": "Object;",
+    nextInt$1: function(max) {
+      if (max <= 0 || max > 4294967296)
+        throw H.wrapException(P.RangeError$("max must be in range 0 < max \u2264 2^32, was " + max));
+      return Math.random() * max >>> 0;
+    }
+  },
+  _Random: {
+    "^": "Object;_lo,_hi",
+    _nextState$0: function() {
+      var t1, tmpHi, tmpHiLo, tmpLo, tmpLoLo, newLo;
+      t1 = this._lo;
+      tmpHi = 4294901760 * t1;
+      tmpHiLo = (tmpHi & 4294967295) >>> 0;
+      tmpLo = 55905 * t1;
+      tmpLoLo = (tmpLo & 4294967295) >>> 0;
+      newLo = tmpLoLo + tmpHiLo + this._hi;
+      t1 = (newLo & 4294967295) >>> 0;
+      this._lo = t1;
+      this._hi = (C.JSInt_methods._tdivFast$1(tmpLo - tmpLoLo + (tmpHi - tmpHiLo) + (newLo - t1), 4294967296) & 4294967295) >>> 0;
+    },
+    nextInt$1: function(max) {
+      var t1, rnd32, result;
+      if (max <= 0 || max > 4294967296)
+        throw H.wrapException(P.RangeError$("max must be in range 0 < max \u2264 2^32, was " + max));
+      t1 = max - 1;
+      if ((max & t1) === 0) {
+        this._nextState$0();
+        return (this._lo & t1) >>> 0;
+      }
+      do {
+        this._nextState$0();
+        rnd32 = this._lo;
+        result = rnd32 % max;
+      } while (rnd32 - result + max >= 4294967296);
+      return result;
+    },
+    _Random$1: function(seed) {
+      var empty_seed, t1, low, high, tmplow, low0, t2, t3;
+      empty_seed = J.$lt$n(seed, 0) ? -1 : 0;
+      do {
+        t1 = J.getInterceptor$n(seed);
+        low = t1.$and(seed, 4294967295);
+        seed = J.$tdiv$n(t1.$sub(seed, low), 4294967296);
+        t1 = J.getInterceptor$n(seed);
+        high = t1.$and(seed, 4294967295);
+        seed = J.$tdiv$n(t1.$sub(seed, high), 4294967296);
+        tmplow = ((~low & 4294967295) >>> 0) + (low << 21 >>> 0);
+        low0 = (tmplow & 4294967295) >>> 0;
+        high = (~high >>> 0) + ((high << 21 | low >>> 11) >>> 0) + C.JSInt_methods._tdivFast$1(tmplow - low0, 4294967296) & 4294967295;
+        tmplow = ((low0 ^ (low0 >>> 24 | high << 8)) >>> 0) * 265;
+        low = (tmplow & 4294967295) >>> 0;
+        high = ((high ^ high >>> 24) >>> 0) * 265 + C.JSInt_methods._tdivFast$1(tmplow - low, 4294967296) & 4294967295;
+        tmplow = ((low ^ (low >>> 14 | high << 18)) >>> 0) * 21;
+        low = (tmplow & 4294967295) >>> 0;
+        high = ((high ^ high >>> 14) >>> 0) * 21 + C.JSInt_methods._tdivFast$1(tmplow - low, 4294967296) & 4294967295;
+        low = (low ^ (low >>> 28 | high << 4)) >>> 0;
+        high = (high ^ high >>> 28) >>> 0;
+        tmplow = (low << 31 >>> 0) + low;
+        low0 = (tmplow & 4294967295) >>> 0;
+        t1 = C.JSInt_methods._tdivFast$1(tmplow - low0, 4294967296);
+        tmplow = this._lo * 1037;
+        t2 = (tmplow & 4294967295) >>> 0;
+        this._lo = t2;
+        t3 = (this._hi * 1037 + C.JSInt_methods._tdivFast$1(tmplow - t2, 4294967296) & 4294967295) >>> 0;
+        this._hi = t3;
+        this._lo = (t2 ^ low0) >>> 0;
+        this._hi = (t3 ^ high + ((high << 31 | low >>> 1) >>> 0) + t1 & 4294967295) >>> 0;
+      } while (!J.$eq(seed, empty_seed));
+      if (this._hi === 0 && this._lo === 0)
+        this._lo = 23063;
+      this._nextState$0();
+      this._nextState$0();
+      this._nextState$0();
+      this._nextState$0();
+    },
+    static: {"^": "_Random__POW2_53_D,_Random__POW2_27_D,_Random__MASK32", _Random$: function(seed) {
+        var t1 = new P._Random(0, 0);
+        t1._Random$1(seed);
+        return t1;
+      }}
+  },
+  Point: {
+    "^": "Object;x>,y>",
+    toString$0: function(_) {
+      return "Point(" + H.S(this.x) + ", " + H.S(this.y) + ")";
+    },
+    $eq: function(_, other) {
+      var t1, t2;
+      if (other == null)
+        return false;
+      if (!J.getInterceptor(other).$isPoint)
+        return false;
+      t1 = this.x;
+      t2 = other.x;
+      if (t1 == null ? t2 == null : t1 === t2) {
+        t1 = this.y;
+        t2 = other.y;
+        t2 = t1 == null ? t2 == null : t1 === t2;
+        t1 = t2;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.x);
+      t2 = J.get$hashCode$(this.y);
+      return P._JenkinsSmiHash_finish(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(0, t1), t2));
+    },
+    $add: function(_, other) {
+      var t1, t2, t3, t4;
+      t1 = this.x;
+      t2 = J.getInterceptor$x(other);
+      t3 = t2.get$x(other);
+      if (typeof t1 !== "number")
+        return t1.$add();
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      t4 = this.y;
+      t2 = t2.get$y(other);
+      if (typeof t4 !== "number")
+        return t4.$add();
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      t2 = new P.Point(t1 + t3, t4 + t2);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    },
+    $sub: function(_, other) {
+      var t1, t2, t3, t4;
+      t1 = this.x;
+      t2 = J.getInterceptor$x(other);
+      t3 = t2.get$x(other);
+      if (typeof t1 !== "number")
+        return t1.$sub();
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      t4 = this.y;
+      t2 = t2.get$y(other);
+      if (typeof t4 !== "number")
+        return t4.$sub();
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      t2 = new P.Point(t1 - t3, t4 - t2);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    },
+    $mul: function(_, factor) {
+      var t1, t2;
+      t1 = this.x;
+      if (typeof t1 !== "number")
+        return t1.$mul();
+      if (typeof factor !== "number")
+        return H.iae(factor);
+      t2 = this.y;
+      if (typeof t2 !== "number")
+        return t2.$mul();
+      t2 = new P.Point(t1 * factor, t2 * factor);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    },
+    $isPoint: true
+  },
+  _RectangleBase: {
+    "^": "Object;",
+    get$right: function(_) {
+      return this.get$left(this) + this.width;
+    },
+    get$bottom: function(_) {
+      return this.get$top(this) + this.height;
+    },
+    toString$0: function(_) {
+      return "Rectangle (" + this.get$left(this) + ", " + this.top + ") " + this.width + " x " + this.height;
+    },
+    $eq: function(_, other) {
+      var t1, t2;
+      if (other == null)
+        return false;
+      t1 = J.getInterceptor(other);
+      if (!t1.$isRectangle)
+        return false;
+      if (this.get$left(this) === t1.get$left(other)) {
+        t2 = this.top;
+        t1 = t2 === t1.get$top(other) && this.left + this.width === t1.get$right(other) && t2 + this.height === t1.get$bottom(other);
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = this.top;
+      return P._JenkinsSmiHash_finish(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(0, this.get$left(this) & 0x1FFFFFFF), t1 & 0x1FFFFFFF), this.left + this.width & 0x1FFFFFFF), t1 + this.height & 0x1FFFFFFF));
+    },
+    get$topLeft: function(_) {
+      var t1 = new P.Point(this.get$left(this), this.top);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    }
+  },
+  Rectangle: {
+    "^": "_RectangleBase;left>,top>,width>,height>",
+    $isRectangle: true,
+    $asRectangle: null,
+    static: {Rectangle$: function(left, $top, width, height, $T) {
+        var t1, t2;
+        t1 = width < 0 ? -width * 0 : width;
+        t2 = height < 0 ? -height * 0 : height;
+        return H.setRuntimeTypeInfo(new P.Rectangle(left, $top, t1, t2), [$T]);
+      }}
+  }
+}],
+["dart.pkg.collection.wrappers", "package:collection/wrappers.dart", , Q, {
+  "^": "",
+  UnmodifiableMapMixin__throw: function() {
+    throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable Map"));
+  },
+  UnmodifiableMapView: {
+    "^": "DelegatingMap_UnmodifiableMapMixin;_base"
+  },
+  DelegatingMap_UnmodifiableMapMixin: {
+    "^": "DelegatingMap+UnmodifiableMapMixin;",
+    $isMap: true
+  },
+  UnmodifiableMapMixin: {
+    "^": "Object;",
+    $indexSet: function(_, key, value) {
+      return Q.UnmodifiableMapMixin__throw();
+    },
+    addAll$1: function(_, other) {
+      return Q.UnmodifiableMapMixin__throw();
+    },
+    clear$0: function(_) {
+      return Q.UnmodifiableMapMixin__throw();
+    },
+    $isMap: true
+  },
+  DelegatingMap: {
+    "^": "Object;",
+    $index: function(_, key) {
+      return this._base.$index(0, key);
+    },
+    $indexSet: function(_, key, value) {
+      this._base.$indexSet(0, key, value);
+    },
+    addAll$1: function(_, other) {
+      this._base.addAll$1(0, other);
+    },
+    clear$0: function(_) {
+      this._base.clear$0(0);
+    },
+    forEach$1: function(_, f) {
+      this._base.forEach$1(0, f);
+    },
+    get$isEmpty: function(_) {
+      return this._base._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._base._collection$_length !== 0;
+    },
+    get$keys: function() {
+      var t1 = this._base;
+      return H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$length: function(_) {
+      return this._base._collection$_length;
+    },
+    get$values: function(_) {
+      var t1 = this._base;
+      return t1.get$values(t1);
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this._base);
+    },
+    $isMap: true
+  }
+}],
+["dart.typed_data.implementation", "dart:_native_typed_data", , H, {
+  "^": "",
+  NativeTypedArray$: function(receiver) {
+    receiver.toString;
+    return receiver;
+  },
+  NativeTypedArrayOfDouble$: function(receiver) {
+    receiver.toString;
+    return receiver;
+  },
+  NativeTypedArrayOfInt$: function(receiver) {
+    receiver.toString;
+    return receiver;
+  },
+  NativeByteBuffer: {
+    "^": "Interceptor;",
+    get$runtimeType: function(receiver) {
+      return C.Type_wAg;
+    },
+    $isNativeByteBuffer: true,
+    "%": "ArrayBuffer"
+  },
+  NativeTypedData: {
+    "^": "Interceptor;",
+    _invalidIndex$2: function(receiver, index, $length) {
+      var t1 = J.getInterceptor$n(index);
+      if (t1.$lt(index, 0) || t1.$ge(index, $length))
+        throw H.wrapException(P.RangeError$range(index, 0, $length));
+      else
+        throw H.wrapException(P.ArgumentError$("Invalid list index " + H.S(index)));
+    },
+    _checkIndex$2: function(receiver, index, $length) {
+      if (index >>> 0 !== index || index >= $length)
+        this._invalidIndex$2(receiver, index, $length);
+    },
+    $isNativeTypedData: true,
+    $isTypedData: true,
+    "%": ";ArrayBufferView;NativeTypedArray|NativeTypedArray_ListMixin|NativeTypedArray_ListMixin_FixedLengthListMixin|NativeTypedArrayOfDouble|NativeTypedArray_ListMixin0|NativeTypedArray_ListMixin_FixedLengthListMixin0|NativeTypedArrayOfInt"
+  },
+  NativeByteData: {
+    "^": "NativeTypedData;",
+    get$runtimeType: function(receiver) {
+      return C.Type_oGP;
+    },
+    $isTypedData: true,
+    "%": "DataView"
+  },
+  NativeFloat32List: {
+    "^": "NativeTypedArrayOfDouble;",
+    get$runtimeType: function(receiver) {
+      return C.Type_Art;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    },
+    $isTypedData: true,
+    "%": "Float32Array"
+  },
+  NativeFloat64List: {
+    "^": "NativeTypedArrayOfDouble;",
+    get$runtimeType: function(receiver) {
+      return C.Type_ckn;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    },
+    $isTypedData: true,
+    "%": "Float64Array"
+  },
+  NativeInt16List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_UoK;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Int16Array"
+  },
+  NativeInt32List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_dTZ;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Int32Array"
+  },
+  NativeInt8List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_mp3;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Int8Array"
+  },
+  NativeUint16List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_CAk;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Uint16Array"
+  },
+  NativeUint32List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_irB;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Uint32Array"
+  },
+  NativeUint8ClampedList: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_QuW;
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "CanvasPixelArray|Uint8ClampedArray"
+  },
+  NativeUint8List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_6L0;
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": ";Uint8Array"
+  },
+  NativeTypedArray: {
+    "^": "NativeTypedData;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    _setRangeFast$4: function(receiver, start, end, source, skipCount) {
+      var t1, count, sourceLength;
+      t1 = receiver.length + 1;
+      this._checkIndex$2(receiver, start, t1);
+      this._checkIndex$2(receiver, end, t1);
+      if (start > end)
+        throw H.wrapException(P.RangeError$range(start, 0, end));
+      count = end - start;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      sourceLength = source.length;
+      if (sourceLength - skipCount < count)
+        throw H.wrapException(P.StateError$("Not enough elements"));
+      if (skipCount !== 0 || sourceLength !== count)
+        source = source.subarray(skipCount, skipCount + count);
+      receiver.set(source, start);
+    },
+    $isJavaScriptIndexingBehavior: true
+  },
+  NativeTypedArrayOfDouble: {
+    "^": "NativeTypedArray_ListMixin_FixedLengthListMixin;",
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      if (!!J.getInterceptor(iterable).$isNativeTypedArrayOfDouble) {
+        this._setRangeFast$4(receiver, start, end, iterable, skipCount);
+        return;
+      }
+      P.ListMixin.prototype.setRange$4.call(this, receiver, start, end, iterable, skipCount);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    $isNativeTypedArrayOfDouble: true,
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    }
+  },
+  NativeTypedArray_ListMixin: {
+    "^": "NativeTypedArray+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    }
+  },
+  NativeTypedArray_ListMixin_FixedLengthListMixin: {
+    "^": "NativeTypedArray_ListMixin+FixedLengthListMixin;"
+  },
+  NativeTypedArrayOfInt: {
+    "^": "NativeTypedArray_ListMixin_FixedLengthListMixin0;",
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      if (!!J.getInterceptor(iterable).$isNativeTypedArrayOfInt) {
+        this._setRangeFast$4(receiver, start, end, iterable, skipCount);
+        return;
+      }
+      P.ListMixin.prototype.setRange$4.call(this, receiver, start, end, iterable, skipCount);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    $isNativeTypedArrayOfInt: true,
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    }
+  },
+  NativeTypedArray_ListMixin0: {
+    "^": "NativeTypedArray+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    }
+  },
+  NativeTypedArray_ListMixin_FixedLengthListMixin0: {
+    "^": "NativeTypedArray_ListMixin0+FixedLengthListMixin;"
+  }
+}],
+["dart2js._js_primitives", "dart:_js_primitives", , H, {
+  "^": "",
+  printString: function(string) {
+    if (typeof dartPrint == "function") {
+      dartPrint(string);
+      return;
+    }
+    if (typeof console == "object" && typeof console.log != "undefined") {
+      console.log(string);
+      return;
+    }
+    if (typeof window == "object")
+      return;
+    if (typeof print == "function") {
+      print(string);
+      return;
+    }
+    throw "Unable to print message: " + String(string);
+  }
+}],
+["error_view_element", "package:observatory/src/elements/error_view.dart", , F, {
+  "^": "",
+  ErrorViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier4;_error_view_element$__$error,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$error: function(receiver) {
+      return receiver._error_view_element$__$error;
+    },
+    set$error: function(receiver, value) {
+      receiver._error_view_element$__$error = this.notifyPropertyChange$3(receiver, C.Symbol_error, receiver._error_view_element$__$error, value);
+    },
+    static: {ErrorViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ErrorViewElement_methods.Element$created$0(receiver);
+        C.ErrorViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier4: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["eval_box_element", "package:observatory/src/elements/eval_box.dart", , L, {
+  "^": "",
+  EvalBoxElement: {
+    "^": "ObservatoryElement_ChangeNotifier5;_eval_box_element$__$text,_eval_box_element$__$lineMode,_eval_box_element$__$callback,_eval_box_element$__$results,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$text: function(receiver) {
+      return receiver._eval_box_element$__$text;
+    },
+    set$text: function(receiver, value) {
+      receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, receiver._eval_box_element$__$text, value);
+    },
+    get$lineMode: function(receiver) {
+      return receiver._eval_box_element$__$lineMode;
+    },
+    set$lineMode: function(receiver, value) {
+      receiver._eval_box_element$__$lineMode = this.notifyPropertyChange$3(receiver, C.Symbol_lineMode, receiver._eval_box_element$__$lineMode, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._eval_box_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._eval_box_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._eval_box_element$__$callback, value);
+    },
+    get$results: function(receiver) {
+      return receiver._eval_box_element$__$results;
+    },
+    set$results: function(receiver, value) {
+      receiver._eval_box_element$__$results = this.notifyPropertyChange$3(receiver, C.Symbol_results, receiver._eval_box_element$__$results, value);
+    },
+    updateLineMode$3: [function(receiver, e, detail, target) {
+      var t1 = H.interceptedTypeCast(J.get$target$x(e), "$isInputElement").value;
+      t1 = this.notifyPropertyChange$3(receiver, C.Symbol_lineMode, receiver._eval_box_element$__$lineMode, t1);
+      receiver._eval_box_element$__$lineMode = t1;
+      if (J.$eq(t1, "1-line")) {
+        t1 = J.replaceAll$2$s(receiver._eval_box_element$__$text, "\n", " ");
+        receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, receiver._eval_box_element$__$text, t1);
+      }
+    }, "call$3", "get$updateLineMode", 6, 0, 102, 1, 93, 94],
+    eval$3: [function(receiver, e, detail, target) {
+      var expr, t1, map;
+      J.preventDefault$0$x(e);
+      expr = receiver._eval_box_element$__$text;
+      receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, expr, "");
+      if (receiver._eval_box_element$__$callback != null) {
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        map = R._toObservableDeep(t1);
+        J.$indexSet$ax(map, "expr", expr);
+        J.insert$2$ax(receiver._eval_box_element$__$results, 0, map);
+        this.callback$1(receiver, expr).then$1(new L.EvalBoxElement_eval_closure(map));
+      }
+    }, "call$3", "get$eval", 6, 0, 102, 1, 93, 94],
+    selectExpr$1: [function(receiver, e) {
+      var t1 = J.getAttribute$1$x(J.get$target$x(e), "expr");
+      receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, receiver._eval_box_element$__$text, t1);
+    }, "call$1", "get$selectExpr", 2, 0, 128, 1],
+    static: {EvalBoxElement$created: function(receiver) {
+        var t1, t2, t3;
+        t1 = R._toObservableDeep([]);
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t3 = P.String;
+        t3 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t3, null), null, null), [t3, null]);
+        receiver._eval_box_element$__$lineMode = "1-line";
+        receiver._eval_box_element$__$results = t1;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t2;
+        receiver.polymer$Polymer$$ = t3;
+        C.EvalBoxElement_methods.Element$created$0(receiver);
+        C.EvalBoxElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier5: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  EvalBoxElement_eval_closure: {
+    "^": "Closure:13;map_0",
+    call$1: [function(result) {
+      J.$indexSet$ax(this.map_0, "value", result);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  }
+}],
+["eval_link_element", "package:observatory/src/elements/eval_link.dart", , R, {
+  "^": "",
+  EvalLinkElement: {
+    "^": "PolymerElement_ChangeNotifier1;_eval_link_element$__$busy,_eval_link_element$__$label,_eval_link_element$__$callback,_eval_link_element$__$expr,_eval_link_element$__$result,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$busy: function(receiver) {
+      return receiver._eval_link_element$__$busy;
+    },
+    set$busy: function(receiver, value) {
+      receiver._eval_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._eval_link_element$__$busy, value);
+    },
+    get$label: function(receiver) {
+      return receiver._eval_link_element$__$label;
+    },
+    set$label: function(receiver, value) {
+      receiver._eval_link_element$__$label = this.notifyPropertyChange$3(receiver, C.Symbol_label, receiver._eval_link_element$__$label, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._eval_link_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._eval_link_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._eval_link_element$__$callback, value);
+    },
+    get$expr: function(receiver) {
+      return receiver._eval_link_element$__$expr;
+    },
+    set$expr: function(receiver, value) {
+      receiver._eval_link_element$__$expr = this.notifyPropertyChange$3(receiver, C.Symbol_expr, receiver._eval_link_element$__$expr, value);
+    },
+    get$result: function(receiver) {
+      return receiver._eval_link_element$__$result;
+    },
+    set$result: function(receiver, value) {
+      receiver._eval_link_element$__$result = this.notifyPropertyChange$3(receiver, C.Symbol_result, receiver._eval_link_element$__$result, value);
+    },
+    evalNow$3: [function(receiver, a, b, c) {
+      var t1 = receiver._eval_link_element$__$busy;
+      if (t1 === true)
+        return;
+      if (receiver._eval_link_element$__$callback != null) {
+        receiver._eval_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, t1, true);
+        receiver._eval_link_element$__$result = this.notifyPropertyChange$3(receiver, C.Symbol_result, receiver._eval_link_element$__$result, null);
+        this.callback$1(receiver, receiver._eval_link_element$__$expr).then$1(new R.EvalLinkElement_evalNow_closure(receiver)).whenComplete$1(new R.EvalLinkElement_evalNow_closure0(receiver));
+      }
+    }, "call$3", "get$evalNow", 6, 0, 79, 46, 47, 80],
+    static: {EvalLinkElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._eval_link_element$__$busy = false;
+        receiver._eval_link_element$__$label = "[evaluate]";
+        receiver._eval_link_element$__$callback = null;
+        receiver._eval_link_element$__$expr = "";
+        receiver._eval_link_element$__$result = null;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.EvalLinkElement_methods.Element$created$0(receiver);
+        C.EvalLinkElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier1: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  EvalLinkElement_evalNow_closure: {
+    "^": "Closure:130;this_0",
+    call$1: [function(obj) {
+      var t1 = this.this_0;
+      t1._eval_link_element$__$result = J.notifyPropertyChange$3$x(t1, C.Symbol_result, t1._eval_link_element$__$result, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  EvalLinkElement_evalNow_closure0: {
+    "^": "Closure:69;this_1",
+    call$0: [function() {
+      var t1 = this.this_1;
+      t1._eval_link_element$__$busy = J.notifyPropertyChange$3$x(t1, C.Symbol_busy, t1._eval_link_element$__$busy, false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+}],
+["field_ref_element", "package:observatory/src/elements/field_ref.dart", , D, {
+  "^": "",
+  FieldRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {FieldRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FieldRefElement_methods.Element$created$0(receiver);
+        C.FieldRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["field_view_element", "package:observatory/src/elements/field_view.dart", , A, {
+  "^": "",
+  FieldViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier6;_field_view_element$__$field,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$field: function(receiver) {
+      return receiver._field_view_element$__$field;
+    },
+    set$field: function(receiver, value) {
+      receiver._field_view_element$__$field = this.notifyPropertyChange$3(receiver, C.Symbol_field, receiver._field_view_element$__$field, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._field_view_element$__$field).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {FieldViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FieldViewElement_methods.Element$created$0(receiver);
+        C.FieldViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier6: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["flag_list_element", "package:observatory/src/elements/flag_list.dart", , X, {
+  "^": "",
+  FlagListElement: {
+    "^": "ObservatoryElement_ChangeNotifier7;_flag_list_element$__$flagList,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$flagList: function(receiver) {
+      return receiver._flag_list_element$__$flagList;
+    },
+    set$flagList: function(receiver, value) {
+      receiver._flag_list_element$__$flagList = this.notifyPropertyChange$3(receiver, C.Symbol_flagList, receiver._flag_list_element$__$flagList, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._flag_list_element$__$flagList).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {FlagListElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FlagListElement_methods.Element$created$0(receiver);
+        C.FlagListElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier7: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  FlagItemElement: {
+    "^": "ObservatoryElement_ChangeNotifier8;_flag_list_element$__$flag,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$flag: function(receiver) {
+      return receiver._flag_list_element$__$flag;
+    },
+    set$flag: function(receiver, value) {
+      receiver._flag_list_element$__$flag = this.notifyPropertyChange$3(receiver, C.Symbol_flag, receiver._flag_list_element$__$flag, value);
+    },
+    static: {FlagItemElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FlagItemElement_methods.Element$created$0(receiver);
+        C.FlagItemElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier8: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["function_ref_element", "package:observatory/src/elements/function_ref.dart", , U, {
+  "^": "",
+  FunctionRefElement: {
+    "^": "ServiceRefElement_ChangeNotifier;_function_ref_element$__$qualified,_function_ref_element$__$hasParent,_function_ref_element$__$hasClass,_function_ref_element$__$isDart,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$qualified: function(receiver) {
+      return receiver._function_ref_element$__$qualified;
+    },
+    set$qualified: function(receiver, value) {
+      receiver._function_ref_element$__$qualified = this.notifyPropertyChange$3(receiver, C.Symbol_qualified, receiver._function_ref_element$__$qualified, value);
+    },
+    refChanged$1: [function(receiver, oldValue) {
+      var refMap, t1, t2;
+      Q.ServiceRefElement.prototype.refChanged$1.call(this, receiver, oldValue);
+      this.notifyPropertyChange$3(receiver, C.Symbol_hasParent, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_hasClass, 0, 1);
+      refMap = receiver._service_ref_element$__$ref;
+      t1 = refMap != null;
+      if (t1) {
+        t2 = J.getInterceptor$asx(refMap);
+        t2 = !J.$eq(t2.$index(refMap, "kind"), "Collected") && !J.$eq(t2.$index(refMap, "kind"), "Native") && !J.$eq(t2.$index(refMap, "kind"), "Tag") && !J.$eq(t2.$index(refMap, "kind"), "Reused");
+      } else
+        t2 = false;
+      receiver._function_ref_element$__$isDart = this.notifyPropertyChange$3(receiver, C.Symbol_isDart, receiver._function_ref_element$__$isDart, t2);
+      t2 = t1 && J.$index$asx(refMap, "parent") != null;
+      receiver._function_ref_element$__$hasParent = this.notifyPropertyChange$3(receiver, C.Symbol_hasParent, receiver._function_ref_element$__$hasParent, t2);
+      if (t1) {
+        t1 = J.getInterceptor$asx(refMap);
+        t1 = t1.$index(refMap, "owner") != null && J.$eq(t1.$index(refMap, "owner").get$serviceType(), "Class");
+      } else
+        t1 = false;
+      receiver._function_ref_element$__$hasClass = this.notifyPropertyChange$3(receiver, C.Symbol_hasClass, receiver._function_ref_element$__$hasClass, t1);
+    }, "call$1", "get$refChanged", 2, 0, 20, 57],
+    get$hasParent: function(receiver) {
+      return receiver._function_ref_element$__$hasParent;
+    },
+    set$hasParent: function(receiver, value) {
+      receiver._function_ref_element$__$hasParent = this.notifyPropertyChange$3(receiver, C.Symbol_hasParent, receiver._function_ref_element$__$hasParent, value);
+    },
+    get$hasClass: function(receiver) {
+      return receiver._function_ref_element$__$hasClass;
+    },
+    set$hasClass: function(receiver, value) {
+      receiver._function_ref_element$__$hasClass = this.notifyPropertyChange$3(receiver, C.Symbol_hasClass, receiver._function_ref_element$__$hasClass, value);
+    },
+    get$isDart: function(receiver) {
+      return receiver._function_ref_element$__$isDart;
+    },
+    set$isDart: function(receiver, value) {
+      receiver._function_ref_element$__$isDart = this.notifyPropertyChange$3(receiver, C.Symbol_isDart, receiver._function_ref_element$__$isDart, value);
+    },
+    static: {FunctionRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._function_ref_element$__$qualified = true;
+        receiver._function_ref_element$__$hasParent = false;
+        receiver._function_ref_element$__$hasClass = false;
+        receiver._function_ref_element$__$isDart = false;
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FunctionRefElement_methods.Element$created$0(receiver);
+        C.FunctionRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ServiceRefElement_ChangeNotifier: {
+    "^": "ServiceRefElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["function_view_element", "package:observatory/src/elements/function_view.dart", , N, {
+  "^": "",
+  FunctionViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier9;_function_view_element$__$function,_function_view_element$__$qualifiedName,_function_view_element$__$kind,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$$function: function(receiver) {
+      return receiver._function_view_element$__$function;
+    },
+    set$$function: function(receiver, value) {
+      receiver._function_view_element$__$function = this.notifyPropertyChange$3(receiver, C.Symbol_function, receiver._function_view_element$__$function, value);
+    },
+    get$qualifiedName: function(receiver) {
+      return receiver._function_view_element$__$qualifiedName;
+    },
+    set$qualifiedName: function(receiver, value) {
+      receiver._function_view_element$__$qualifiedName = this.notifyPropertyChange$3(receiver, C.Symbol_qualifiedName, receiver._function_view_element$__$qualifiedName, value);
+    },
+    get$kind: function(receiver) {
+      return receiver._function_view_element$__$kind;
+    },
+    set$kind: function(receiver, value) {
+      receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, receiver._function_view_element$__$kind, value);
+    },
+    _getQualifiedName$1: function(receiver, $function) {
+      var t1, $parent, cls;
+      t1 = $function != null;
+      $parent = t1 && J.$index$asx($function, "parent") != null ? J.$index$asx($function, "parent") : null;
+      if ($parent != null)
+        return this._getQualifiedName$1(receiver, $parent) + "." + H.S(J.$index$asx($function, "user_name"));
+      if (t1) {
+        t1 = J.getInterceptor$asx($function);
+        t1 = t1.$index($function, "owner") != null && J.$eq(t1.$index($function, "owner").get$serviceType(), "Class");
+      } else
+        t1 = false;
+      cls = t1 ? J.$index$asx($function, "owner") : null;
+      if (cls != null)
+        return H.S(J.$index$asx(cls, "user_name")) + "." + H.S(J.$index$asx($function, "user_name"));
+      return H.S(J.$index$asx($function, "user_name"));
+    },
+    functionChanged$1: [function(receiver, oldValue) {
+      var t1, t2;
+      this.notifyPropertyChange$3(receiver, C.Symbol_qualifiedName, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_kind, 0, 1);
+      t1 = this._getQualifiedName$1(receiver, receiver._function_view_element$__$function);
+      receiver._function_view_element$__$qualifiedName = this.notifyPropertyChange$3(receiver, C.Symbol_qualifiedName, receiver._function_view_element$__$qualifiedName, t1);
+      t1 = J.$index$asx(receiver._function_view_element$__$function, "kind");
+      t2 = receiver._function_view_element$__$kind;
+      switch (t1) {
+        case "kRegularFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "function");
+          break;
+        case "kClosureFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "closure function");
+          break;
+        case "kSignatureFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "signature function");
+          break;
+        case "kGetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "getter function");
+          break;
+        case "kSetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "setter function");
+          break;
+        case "kConstructor":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "constructor");
+          break;
+        case "kImplicitGetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "implicit getter function");
+          break;
+        case "kImplicitSetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "implicit setter function");
+          break;
+        case "kStaticInitializer":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "static initializer");
+          break;
+        case "kMethodExtractor":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "method extractor");
+          break;
+        case "kNoSuchMethodDispatcher":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "noSuchMethod dispatcher");
+          break;
+        case "kInvokeFieldDispatcher":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "invoke field dispatcher");
+          break;
+        default:
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "UNKNOWN");
+          break;
+      }
+    }, "call$1", "get$functionChanged", 2, 0, 20, 57],
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._function_view_element$__$function).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {FunctionViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FunctionViewElement_methods.Element$created$0(receiver);
+        C.FunctionViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier9: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["heap_map_element", "package:observatory/src/elements/heap_map.dart", , O, {
+  "^": "",
+  PixelReference: {
+    "^": "Object;_data,_dataIndex",
+    next$0: [function() {
+      return new O.PixelReference(this._data, this._dataIndex + 4);
+    }, "call$0", "get$next", 0, 0, 131],
+    get$index: function(_) {
+      return C.JSNumber_methods._tdivFast$1(this._dataIndex, 4);
+    },
+    static: {"^": "PixelReference_NUM_COLOR_COMPONENTS", PixelReference$: function(data, point) {
+        var t1, t2, t3;
+        t1 = point.get$y(point);
+        t2 = J.get$width$x(data);
+        if (typeof t1 !== "number")
+          return t1.$mul();
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        t3 = point.get$x(point);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        return new O.PixelReference(data, (t1 * t2 + t3) * 4);
+      }}
+  },
+  ObjectInfo: {
+    "^": "Object;address<,size"
+  },
+  HeapMapElement: {
+    "^": "ObservatoryElement_ChangeNotifier10;_fragmentationCanvas,_fragmentationData,_pageHeight,_classIdToColor,_colorToClassId,_classIdToName,_heap_map_element$__$status,_heap_map_element$__$fragmentation,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$status: function(receiver) {
+      return receiver._heap_map_element$__$status;
+    },
+    set$status: function(receiver, value) {
+      receiver._heap_map_element$__$status = this.notifyPropertyChange$3(receiver, C.Symbol_status, receiver._heap_map_element$__$status, value);
+    },
+    get$fragmentation: function(receiver) {
+      return receiver._heap_map_element$__$fragmentation;
+    },
+    set$fragmentation: function(receiver, value) {
+      receiver._heap_map_element$__$fragmentation = this.notifyPropertyChange$3(receiver, C.Symbol_fragmentation, receiver._heap_map_element$__$fragmentation, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#fragmentation");
+      receiver._fragmentationCanvas = t1;
+      t1 = J.get$onMouseMove$x(t1);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(this.get$_handleMouseMove(receiver)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+      t1 = J.get$onMouseDown$x(receiver._fragmentationCanvas);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(this.get$_handleClick(receiver)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+    },
+    _packColor$1: function(receiver, color) {
+      var t1, packed, component;
+      for (t1 = J.get$iterator$ax(color), packed = 0; t1.moveNext$0();) {
+        component = t1._current;
+        if (typeof component !== "number")
+          return H.iae(component);
+        packed = packed * 256 + component;
+      }
+      return packed;
+    },
+    _addClass$3: function(receiver, classId, $name, color) {
+      var t1 = J.split$1$s($name, "@");
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      receiver._classIdToName.$indexSet(0, classId, t1[0]);
+      receiver._classIdToColor.$indexSet(0, classId, color);
+      receiver._colorToClassId.$indexSet(0, this._packColor$1(receiver, color), classId);
+    },
+    _updateClassList$2: function(receiver, classList, freeClassId) {
+      var t1, t2, t3, t4, member, classId, rng, color, t5;
+      for (t1 = J.get$iterator$ax(J.$index$asx(classList, "members")), t2 = receiver._classIdToName, t3 = receiver._classIdToColor, t4 = receiver._colorToClassId; t1.moveNext$0();) {
+        member = t1.get$current();
+        if (!J.getInterceptor(member).$isClass) {
+          N.Logger_Logger("").info$1(H.S(member));
+          continue;
+        }
+        classId = H.Primitives_parseInt(C.JSArray_methods.get$last(J.split$1$s(member._id, "/")), null, null);
+        rng = classId == null ? C.C__JSRandom : P._Random$(classId);
+        color = [rng.nextInt$1(128), rng.nextInt$1(128), rng.nextInt$1(128), 255];
+        t5 = J.split$1$s(member._service$__$name, "@");
+        if (0 >= t5.length)
+          return H.ioore(t5, 0);
+        t2.$indexSet(0, classId, t5[0]);
+        t3.$indexSet(0, classId, color);
+        t4.$indexSet(0, this._packColor$1(receiver, color), classId);
+      }
+      this._addClass$3(receiver, freeClassId, "Free", $.get$HeapMapElement__freeColor());
+      this._addClass$3(receiver, 0, "", $.get$HeapMapElement__pageSeparationColor());
+    },
+    _objectAt$1: function(receiver, point) {
+      var t1, t2, pagePixels, index, pageIndex, pageOffset, pages, page, objects, offset, size, i, t3;
+      t1 = receiver._pageHeight;
+      t2 = J.get$width$x(receiver._fragmentationData);
+      if (typeof t1 !== "number")
+        return t1.$mul();
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      pagePixels = t1 * t2;
+      index = C.JSNumber_methods._tdivFast$1(O.PixelReference$(receiver._fragmentationData, point)._dataIndex, 4);
+      pageIndex = C.JSNumber_methods.$tdiv(index, pagePixels);
+      pageOffset = C.JSNumber_methods.$mod(index, pagePixels);
+      pages = J.$index$asx(receiver._heap_map_element$__$fragmentation, "pages");
+      if (!(pageIndex < 0)) {
+        t1 = J.get$length$asx(pages);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = pageIndex >= t1;
+      } else
+        t1 = true;
+      if (t1)
+        return;
+      page = J.$index$asx(pages, pageIndex);
+      t1 = J.getInterceptor$asx(page);
+      objects = t1.$index(page, "objects");
+      t2 = J.getInterceptor$asx(objects);
+      offset = 0;
+      size = 0;
+      i = 0;
+      while (true) {
+        t3 = t2.get$length(objects);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        size = t2.$index(objects, i);
+        if (typeof size !== "number")
+          return H.iae(size);
+        offset += size;
+        if (offset > pageOffset) {
+          pageOffset = offset - size;
+          break;
+        }
+        i += 2;
+      }
+      t1 = H.Primitives_parseInt(t1.$index(page, "object_start"), null, null);
+      t2 = J.$index$asx(receiver._heap_map_element$__$fragmentation, "unit_size_bytes");
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      return new O.ObjectInfo(J.$add$ns(t1, pageOffset * t2), J.$mul$ns(size, J.$index$asx(receiver._heap_map_element$__$fragmentation, "unit_size_bytes")));
+    },
+    _handleMouseMove$1: [function(receiver, $event) {
+      var t1, info, addressString, t2, className;
+      t1 = J.getInterceptor$x($event);
+      info = this._objectAt$1(receiver, t1.get$offset($event));
+      addressString = H.S(info.size) + "B @ 0x" + J.toRadixString$1$n(info.address, 16);
+      t1 = t1.get$offset($event);
+      t1 = O.PixelReference$(receiver._fragmentationData, t1);
+      t2 = t1._dataIndex;
+      className = receiver._classIdToName.$index(0, receiver._colorToClassId.$index(0, this._packColor$1(receiver, C.NativeUint8ClampedList_methods.getRange$2(J.get$data$x(t1._data), t2, t2 + 4))));
+      t1 = J.$eq(className, "") ? "-" : H.S(className) + " " + addressString;
+      receiver._heap_map_element$__$status = this.notifyPropertyChange$3(receiver, C.Symbol_status, receiver._heap_map_element$__$status, t1);
+    }, "call$1", "get$_handleMouseMove", 2, 0, 128, 2],
+    _handleClick$1: [function(receiver, $event) {
+      var address = J.toRadixString$1$n(this._objectAt$1(receiver, J.get$offset$x($event)).address, 16);
+      window.location.hash = "/" + H.S(J.get$link$x(J.get$isolate$x(receiver._heap_map_element$__$fragmentation))) + "/address/" + address;
+    }, "call$1", "get$_handleClick", 2, 0, 128, 2],
+    _updateFragmentationData$0: function(receiver) {
+      var t1, pages, width, t2, height;
+      t1 = receiver._heap_map_element$__$fragmentation;
+      if (t1 == null || receiver._fragmentationCanvas == null)
+        return;
+      this._updateClassList$2(receiver, J.$index$asx(t1, "class_list"), J.$index$asx(receiver._heap_map_element$__$fragmentation, "free_class_id"));
+      pages = J.$index$asx(receiver._heap_map_element$__$fragmentation, "pages");
+      t1 = receiver._fragmentationCanvas.parentElement;
+      t1.toString;
+      width = P.Rectangle$(C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientLeft)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientTop)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientWidth)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientHeight)), null).width;
+      t1 = J.$tdiv$n(J.$tdiv$n(J.$index$asx(receiver._heap_map_element$__$fragmentation, "page_size_bytes"), J.$index$asx(receiver._heap_map_element$__$fragmentation, "unit_size_bytes")), width);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      t1 = 4 + t1;
+      receiver._pageHeight = t1;
+      t2 = J.get$length$asx(pages);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      height = P.min(t1 * t2, 6000);
+      t2 = P.convertNativeToDart_ImageData(J.get$context2D$x(receiver._fragmentationCanvas).createImageData(width, height));
+      receiver._fragmentationData = t2;
+      J.set$width$x(receiver._fragmentationCanvas, J.get$width$x(t2));
+      J.set$height$x(receiver._fragmentationCanvas, J.get$height$x(receiver._fragmentationData));
+      this._renderPages$1(receiver, 0);
+    },
+    _renderPages$1: function(receiver, startPage) {
+      var pages, t1, t2, startY, endY, pixel, objects, i, t3, count, color, count0, t4, t5, t6;
+      pages = J.$index$asx(receiver._heap_map_element$__$fragmentation, "pages");
+      t1 = J.getInterceptor$asx(pages);
+      t2 = "Loaded " + startPage + " of " + H.S(t1.get$length(pages)) + " pages";
+      receiver._heap_map_element$__$status = this.notifyPropertyChange$3(receiver, C.Symbol_status, receiver._heap_map_element$__$status, t2);
+      t2 = receiver._pageHeight;
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      startY = startPage * t2;
+      endY = startY + t2;
+      t2 = t1.get$length(pages);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      if (!(startPage >= t2)) {
+        t2 = J.get$height$x(receiver._fragmentationData);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        t2 = endY > t2;
+      } else
+        t2 = true;
+      if (t2)
+        return;
+      pixel = O.PixelReference$(receiver._fragmentationData, H.setRuntimeTypeInfo(new P.Point(0, startY), [null]));
+      objects = J.$index$asx(t1.$index(pages, startPage), "objects");
+      t1 = J.getInterceptor$asx(objects);
+      t2 = receiver._classIdToColor;
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(objects);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        count = t1.$index(objects, i);
+        color = t2.$index(0, t1.$index(objects, i + 1));
+        for (; t3 = J.getInterceptor$n(count), count0 = t3.$sub(count, 1), t3.$gt(count, 0); count = count0) {
+          t3 = pixel._data;
+          t4 = pixel._dataIndex;
+          t5 = t4 + 4;
+          C.NativeUint8ClampedList_methods.setRange$3(J.get$data$x(t3), t4, t5, color);
+          pixel = new O.PixelReference(t3, t5);
+        }
+        i += 2;
+      }
+      while (true) {
+        t1 = pixel._dataIndex;
+        t2 = C.JSNumber_methods._tdivFast$1(t1, 4);
+        t3 = pixel._data;
+        t4 = J.getInterceptor$x(t3);
+        t5 = t4.get$width(t3);
+        if (typeof t5 !== "number")
+          return H.iae(t5);
+        t5 = C.JSNumber_methods.$mod(t2, t5);
+        t6 = t4.get$width(t3);
+        if (typeof t6 !== "number")
+          return H.iae(t6);
+        t6 = C.JSNumber_methods.$tdiv(t2, t6);
+        new P.Point(t5, t6).$builtinTypeInfo = [null];
+        if (!(t6 < endY))
+          break;
+        t2 = $.get$HeapMapElement__pageSeparationColor();
+        t5 = t1 + 4;
+        C.NativeUint8ClampedList_methods.setRange$3(t4.get$data(t3), t1, t5, t2);
+        pixel = new O.PixelReference(t3, t5);
+      }
+      t1 = J.get$context2D$x(receiver._fragmentationCanvas);
+      t2 = receiver._fragmentationData;
+      J.putImageData$7$x(t1, t2, 0, 0, 0, startY, J.get$width$x(t2), endY);
+      P.Future_Future(new O.HeapMapElement__renderPages_closure(receiver, startPage), null);
+    },
+    refresh$1: [function(receiver, done) {
+      var t1 = receiver._heap_map_element$__$fragmentation;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("heapmap").then$1(new O.HeapMapElement_refresh_closure(receiver)).catchError$1(new O.HeapMapElement_refresh_closure0()).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    fragmentationChanged$1: [function(receiver, oldValue) {
+      P.Future_Future(new O.HeapMapElement_fragmentationChanged_closure(receiver), null);
+    }, "call$1", "get$fragmentationChanged", 2, 0, 20, 57],
+    static: {"^": "HeapMapElement__freeColor,HeapMapElement__pageSeparationColor,HeapMapElement__PAGE_SEPARATION_HEIGHT,HeapMapElement__MAX_CANVAS_HEIGHT", HeapMapElement$created: function(receiver) {
+        var t1, t2, t3, t4, t5;
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t2 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t3 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t4 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t5 = P.String;
+        t5 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t5, null), null, null), [t5, null]);
+        receiver._classIdToColor = t1;
+        receiver._colorToClassId = t2;
+        receiver._classIdToName = t3;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t4;
+        receiver.polymer$Polymer$$ = t5;
+        C.HeapMapElement_methods.Element$created$0(receiver);
+        C.HeapMapElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier10: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  HeapMapElement__renderPages_closure: {
+    "^": "Closure:69;this_0,startPage_1",
+    call$0: function() {
+      J._renderPages$1$x(this.this_0, this.startPage_1 + 1);
+    },
+    $isFunction: true
+  },
+  HeapMapElement_refresh_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(response) {
+      var t1 = this.this_0;
+      t1._heap_map_element$__$fragmentation = J.notifyPropertyChange$3$x(t1, C.Symbol_fragmentation, t1._heap_map_element$__$fragmentation, response);
+    }, "call$1", null, 2, 0, null, 132, "call"],
+    $isFunction: true
+  },
+  HeapMapElement_refresh_closure0: {
+    "^": "Closure:75;",
+    call$2: [function(e, st) {
+      N.Logger_Logger("").info$1(H.S(e) + " " + H.S(st));
+    }, "call$2", null, 4, 0, null, 1, 133, "call"],
+    $isFunction: true
+  },
+  HeapMapElement_fragmentationChanged_closure: {
+    "^": "Closure:69;this_0",
+    call$0: function() {
+      J._updateFragmentationData$0$x(this.this_0);
+    },
+    $isFunction: true
+  }
+}],
+["heap_profile_element", "package:observatory/src/elements/heap_profile.dart", , K, {
+  "^": "",
+  ClassSortedTable: {
+    "^": "SortedTable;columns,rows,sortedRows,_sortColumnIndex,_sortDescending,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    getSortKeyFor$2: function(row, col) {
+      var t1;
+      if (col === 0) {
+        t1 = this.rows;
+        if (row >>> 0 !== row || row >= t1.length)
+          return H.ioore(t1, row);
+        return J.get$name$x(J.$index$asx(J.get$values$x(t1[row]), col));
+      }
+      return G.SortedTable.prototype.getSortKeyFor$2.call(this, row, col);
+    }
+  },
+  HeapProfileElement: {
+    "^": "ObservatoryElement_ChangeNotifier11;_heap_profile_element$__$lastServiceGC,_heap_profile_element$__$lastAccumulatorReset,_newPieDataTable,_newPieChart,_oldPieDataTable,_oldPieChart,_heap_profile_element$__$classTable,_classTableBody,_heap_profile_element$__$profile,_heap_profile_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$lastServiceGC: function(receiver) {
+      return receiver._heap_profile_element$__$lastServiceGC;
+    },
+    set$lastServiceGC: function(receiver, value) {
+      receiver._heap_profile_element$__$lastServiceGC = this.notifyPropertyChange$3(receiver, C.Symbol_lastServiceGC, receiver._heap_profile_element$__$lastServiceGC, value);
+    },
+    get$lastAccumulatorReset: function(receiver) {
+      return receiver._heap_profile_element$__$lastAccumulatorReset;
+    },
+    set$lastAccumulatorReset: function(receiver, value) {
+      receiver._heap_profile_element$__$lastAccumulatorReset = this.notifyPropertyChange$3(receiver, C.Symbol_lastAccumulatorReset, receiver._heap_profile_element$__$lastAccumulatorReset, value);
+    },
+    get$classTable: function(receiver) {
+      return receiver._heap_profile_element$__$classTable;
+    },
+    set$classTable: function(receiver, value) {
+      receiver._heap_profile_element$__$classTable = this.notifyPropertyChange$3(receiver, C.Symbol_classTable, receiver._heap_profile_element$__$classTable, value);
+    },
+    get$profile: function(receiver) {
+      return receiver._heap_profile_element$__$profile;
+    },
+    set$profile: function(receiver, value) {
+      receiver._heap_profile_element$__$profile = this.notifyPropertyChange$3(receiver, C.Symbol_profile, receiver._heap_profile_element$__$profile, value);
+    },
+    get$isolate: function(receiver) {
+      return receiver._heap_profile_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._heap_profile_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._heap_profile_element$__$isolate, value);
+    },
+    attached$0: function(receiver) {
+      var t1, t2;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#newPieChart");
+      t2 = new G.Chart(null, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null));
+      t2._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "PieChart"), [t1]);
+      receiver._newPieChart = t2;
+      t2 = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#oldPieChart");
+      t1 = new G.Chart(null, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null));
+      t1._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "PieChart"), [t2]);
+      receiver._oldPieChart = t1;
+      receiver._classTableBody = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#classTableBody");
+    },
+    _updateClasses$0: function(receiver) {
+      var t1, clsAllocations, t2, cls;
+      for (t1 = J.get$iterator$ax(J.$index$asx(receiver._heap_profile_element$__$profile, "members")); t1.moveNext$0();) {
+        clsAllocations = t1.get$current();
+        t2 = J.getInterceptor$asx(clsAllocations);
+        cls = t2.$index(clsAllocations, "class");
+        if (cls == null)
+          continue;
+        cls.get$newSpace().update$1(t2.$index(clsAllocations, "new"));
+        cls.get$oldSpace().update$1(t2.$index(clsAllocations, "old"));
+      }
+    },
+    _updateClassTable$0: function(receiver) {
+      var t1, cls, t2, t3, t4, t5, t6, t7, t8, t9;
+      receiver._heap_profile_element$__$classTable.clearRows$0();
+      for (t1 = J.get$iterator$ax(J.$index$asx(receiver._heap_profile_element$__$profile, "members")); t1.moveNext$0();) {
+        cls = J.$index$asx(t1.get$current(), "class");
+        if (cls == null)
+          continue;
+        if (cls.get$hasNoAllocations())
+          continue;
+        t2 = cls.get$newSpace().get$accumulated()._service$__$bytes;
+        t3 = cls.get$newSpace().get$accumulated()._service$__$instances;
+        t4 = cls.get$newSpace().get$current()._service$__$bytes;
+        t5 = cls.get$newSpace().get$current()._service$__$instances;
+        t6 = cls.get$oldSpace().get$accumulated()._service$__$bytes;
+        t7 = cls.get$oldSpace().get$accumulated()._service$__$instances;
+        t8 = cls.get$oldSpace().get$current()._service$__$bytes;
+        t9 = cls.get$oldSpace().get$current()._service$__$instances;
+        J.addRow$1$x(receiver._heap_profile_element$__$classTable, new G.SortedTableRow([cls, "", t2, t3, t4, t5, "", t6, t7, t8, t9]));
+      }
+      J.sort$0$ax(receiver._heap_profile_element$__$classTable);
+    },
+    _fillClassTableDomRow$2: function(receiver, tr, rowIndex) {
+      var row, t1, t2, i, t3, cell;
+      row = J.$index$asx(J.get$rows$x(receiver._heap_profile_element$__$classTable), rowIndex);
+      t1 = J.getInterceptor$x(tr);
+      t2 = J.getInterceptor$x(row);
+      J.set$ref$x(J.$index$asx(J.get$children$x(J.$index$asx(t1.get$children(tr), 0)), 0), J.$index$asx(t2.get$values(row), 0));
+      i = 1;
+      while (true) {
+        t3 = J.get$length$asx(t2.get$values(row));
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        c$0: {
+          if (C.JSArray_methods.contains$1(C.List_1_6, i))
+            break c$0;
+          cell = J.$index$asx(t1.get$children(tr), i);
+          t3 = J.getInterceptor$x(cell);
+          t3.set$title(cell, J.toString$0(J.$index$asx(t2.get$values(row), i)));
+          t3.set$text(cell, receiver._heap_profile_element$__$classTable.getFormattedValue$2(rowIndex, i));
+        }
+        ++i;
+      }
+    },
+    _updateClassTableInDom$0: function(receiver) {
+      var t1, deadRows, i, t2, newRows, tr, cell, rowIndex;
+      t1 = J.get$children$x(receiver._classTableBody);
+      if (t1.get$length(t1) > receiver._heap_profile_element$__$classTable.get$sortedRows().length) {
+        t1 = J.get$children$x(receiver._classTableBody);
+        deadRows = t1.get$length(t1) - receiver._heap_profile_element$__$classTable.get$sortedRows().length;
+        for (i = 0; i < deadRows; ++i)
+          J.get$children$x(receiver._classTableBody).removeLast$0(0);
+      } else {
+        t1 = J.get$children$x(receiver._classTableBody);
+        if (t1.get$length(t1) < receiver._heap_profile_element$__$classTable.get$sortedRows().length) {
+          t1 = receiver._heap_profile_element$__$classTable.get$sortedRows().length;
+          t2 = J.get$children$x(receiver._classTableBody);
+          newRows = t1 - t2.get$length(t2);
+          for (i = 0; i < newRows; ++i) {
+            tr = document.createElement("tr", null);
+            t1 = J.getInterceptor$x(tr);
+            t1.insertCell$1(tr, -1).appendChild(W._ElementFactoryProvider_createElement_tag("class-ref", null));
+            cell = t1.insertCell$1(tr, -1);
+            cell.toString;
+            new W._ElementCssClassSet(cell).add$1(0, "left-border-spacer");
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            cell = t1.insertCell$1(tr, -1);
+            cell.toString;
+            new W._ElementCssClassSet(cell).add$1(0, "left-border-spacer");
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            J.get$children$x(receiver._classTableBody).add$1(0, tr);
+          }
+        }
+      }
+      for (i = 0; i < receiver._heap_profile_element$__$classTable.get$sortedRows().length; ++i) {
+        t1 = receiver._heap_profile_element$__$classTable.get$sortedRows();
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        rowIndex = t1[i];
+        this._fillClassTableDomRow$2(receiver, J.get$children$x(receiver._classTableBody).$index(0, i), rowIndex);
+      }
+    },
+    changeSort$3: [function(receiver, e, detail, target) {
+      var t1, t2, t3;
+      if (!!J.getInterceptor(target).$isTableCellElement) {
+        t1 = receiver._heap_profile_element$__$classTable.get$sortColumnIndex();
+        t2 = target.cellIndex;
+        t3 = receiver._heap_profile_element$__$classTable;
+        if (t1 == null ? t2 != null : t1 !== t2) {
+          t3.set$sortColumnIndex(t2);
+          receiver._heap_profile_element$__$classTable.set$sortDescending(true);
+        } else
+          t3.set$sortDescending(!t3.get$sortDescending());
+        J.sort$0$ax(receiver._heap_profile_element$__$classTable);
+        this._updateClassTableInDom$0(receiver);
+      }
+    }, "call$3", "get$changeSort", 6, 0, 92, 1, 93, 94],
+    refresh$1: [function(receiver, done) {
+      var t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("/allocationprofile").then$1(this.get$_heap_profile_element$_update(receiver)).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    refreshGC$1: [function(receiver, done) {
+      var t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("/allocationprofile?gc=full").then$1(this.get$_heap_profile_element$_update(receiver)).whenComplete$1(done);
+    }, "call$1", "get$refreshGC", 2, 0, 20, 89],
+    resetAccumulator$1: [function(receiver, done) {
+      var t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("/allocationprofile?reset=true").then$1(this.get$_heap_profile_element$_update(receiver)).whenComplete$1(done);
+    }, "call$1", "get$resetAccumulator", 2, 0, 20, 89],
+    _heap_profile_element$_update$1: [function(receiver, newProfile) {
+      receiver._heap_profile_element$__$profile = this.notifyPropertyChange$3(receiver, C.Symbol_profile, receiver._heap_profile_element$__$profile, newProfile);
+    }, "call$1", "get$_heap_profile_element$_update", 2, 0, 134, 135],
+    profileChanged$1: [function(receiver, oldValue) {
+      var t1, millis, isolate, t2, t3;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      t1 = J.get$isolate$x(t1);
+      t1 = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._heap_profile_element$__$isolate, t1);
+      receiver._heap_profile_element$__$isolate = t1;
+      t1.updateHeapsFromMap$1(J.$index$asx(receiver._heap_profile_element$__$profile, "heaps"));
+      millis = H.Primitives_parseInt(J.$index$asx(receiver._heap_profile_element$__$profile, "dateLastAccumulatorReset"), null, null);
+      if (!J.$eq(millis, 0)) {
+        t1 = P.DateTime$fromMillisecondsSinceEpoch(millis, false).toString$0(0);
+        receiver._heap_profile_element$__$lastAccumulatorReset = this.notifyPropertyChange$3(receiver, C.Symbol_lastAccumulatorReset, receiver._heap_profile_element$__$lastAccumulatorReset, t1);
+      }
+      millis = H.Primitives_parseInt(J.$index$asx(receiver._heap_profile_element$__$profile, "dateLastServiceGC"), null, null);
+      if (!J.$eq(millis, 0)) {
+        t1 = P.DateTime$fromMillisecondsSinceEpoch(millis, false).toString$0(0);
+        receiver._heap_profile_element$__$lastServiceGC = this.notifyPropertyChange$3(receiver, C.Symbol_lastServiceGC, receiver._heap_profile_element$__$lastServiceGC, t1);
+      }
+      t1 = receiver._newPieDataTable._app$_table;
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      isolate = J.get$isolate$x(receiver._heap_profile_element$__$profile);
+      t1 = receiver._newPieDataTable;
+      t2 = isolate.get$newSpace().get$used();
+      t1 = t1._app$_table;
+      t3 = [];
+      C.JSArray_methods.addAll$1(t3, C.JSArray_methods.map$1(["Used", t2], P._convertToJS$closure()));
+      t1.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t3), [null])]);
+      t3 = receiver._newPieDataTable;
+      t1 = J.$sub$n(isolate.get$newSpace().get$capacity(), isolate.get$newSpace().get$used());
+      t3 = t3._app$_table;
+      t2 = [];
+      C.JSArray_methods.addAll$1(t2, C.JSArray_methods.map$1(["Free", t1], P._convertToJS$closure()));
+      t3.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t2), [null])]);
+      t2 = receiver._newPieDataTable;
+      t3 = isolate.get$newSpace().get$external();
+      t2 = t2._app$_table;
+      t1 = [];
+      C.JSArray_methods.addAll$1(t1, C.JSArray_methods.map$1(["External", t3], P._convertToJS$closure()));
+      t2.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t1), [null])]);
+      t1 = receiver._oldPieDataTable._app$_table;
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      t1 = receiver._oldPieDataTable;
+      t2 = isolate.get$oldSpace().get$used();
+      t1 = t1._app$_table;
+      t3 = [];
+      C.JSArray_methods.addAll$1(t3, C.JSArray_methods.map$1(["Used", t2], P._convertToJS$closure()));
+      t1.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t3), [null])]);
+      t3 = receiver._oldPieDataTable;
+      t1 = J.$sub$n(isolate.get$oldSpace().get$capacity(), isolate.get$oldSpace().get$used());
+      t3 = t3._app$_table;
+      t2 = [];
+      C.JSArray_methods.addAll$1(t2, C.JSArray_methods.map$1(["Free", t1], P._convertToJS$closure()));
+      t3.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t2), [null])]);
+      t2 = receiver._oldPieDataTable;
+      t3 = isolate.get$oldSpace().get$external();
+      t2 = t2._app$_table;
+      t1 = [];
+      C.JSArray_methods.addAll$1(t1, C.JSArray_methods.map$1(["External", t3], P._convertToJS$closure()));
+      t2.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t1), [null])]);
+      this._updateClasses$0(receiver);
+      this._updateClassTable$0(receiver);
+      this._updateClassTableInDom$0(receiver);
+      receiver._newPieChart.draw$1(receiver._newPieDataTable);
+      receiver._oldPieChart.draw$1(receiver._oldPieDataTable);
+      this.notifyPropertyChange$3(receiver, C.Symbol_formattedAverage, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_formattedTotalCollectionTime, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_formattedCollections, 0, 1);
+    }, "call$1", "get$profileChanged", 2, 0, 20, 57],
+    formattedAverage$1: [function(receiver, newSpace) {
+      var t1, t2, heap;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return "";
+      t2 = J.getInterceptor$x(t1);
+      heap = newSpace === true ? t2.get$isolate(t1).get$newSpace() : t2.get$isolate(t1).get$oldSpace();
+      return C.JSNumber_methods.toStringAsFixed$1(J.$div$n(J.$mul$ns(heap.get$totalCollectionTimeInSeconds(), 1000), heap.get$collections()), 2) + " ms";
+    }, "call$1", "get$formattedAverage", 2, 0, 136, 137],
+    formattedCollections$1: [function(receiver, newSpace) {
+      var t1, t2;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return "";
+      t2 = J.getInterceptor$x(t1);
+      return J.toString$0((newSpace === true ? t2.get$isolate(t1).get$newSpace() : t2.get$isolate(t1).get$oldSpace()).get$collections());
+    }, "call$1", "get$formattedCollections", 2, 0, 136, 137],
+    formattedTotalCollectionTime$1: [function(receiver, newSpace) {
+      var t1, t2;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return "";
+      t2 = J.getInterceptor$x(t1);
+      return J.toStringAsFixed$1$n((newSpace === true ? t2.get$isolate(t1).get$newSpace() : t2.get$isolate(t1).get$oldSpace()).get$totalCollectionTimeInSeconds(), 2) + " secs";
+    }, "call$1", "get$formattedTotalCollectionTime", 2, 0, 136, 137],
+    HeapProfileElement$created$0: function(receiver) {
+      var t1 = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null);
+      receiver._newPieDataTable = new G.DataTable(t1);
+      t1.callMethod$2("addColumn", ["string", "Type"]);
+      receiver._newPieDataTable._app$_table.callMethod$2("addColumn", ["number", "Size"]);
+      t1 = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null);
+      receiver._oldPieDataTable = new G.DataTable(t1);
+      t1.callMethod$2("addColumn", ["string", "Type"]);
+      receiver._oldPieDataTable._app$_table.callMethod$2("addColumn", ["number", "Size"]);
+      t1 = H.setRuntimeTypeInfo([], [G.SortedTableRow]);
+      t1 = this.notifyPropertyChange$3(receiver, C.Symbol_classTable, receiver._heap_profile_element$__$classTable, new K.ClassSortedTable([new G.SortedTableColumn("Class", G.SortedTableColumn_toStringFormatter$closure()), new G.SortedTableColumn("", G.SortedTableColumn_toStringFormatter$closure()), new G.SortedTableColumn("Accumulated Size (New)", G.Utils_formatSize$closure()), new G.SortedTableColumn("Accumulated Instances", G.Utils_formatCommaSeparated$closure()), new G.SortedTableColumn("Current Size", G.Utils_formatSize$closure()), new G.SortedTableColumn("Current Instances", G.Utils_formatCommaSeparated$closure()), new G.SortedTableColumn("", G.SortedTableColumn_toStringFormatter$closure()), new G.SortedTableColumn("Accumulator Size (Old)", G.Utils_formatSize$closure()), new G.SortedTableColumn("Accumulator Instances", G.Utils_formatCommaSeparated$closure()), new G.SortedTableColumn("Current Size", G.Utils_formatSize$closure()), new G.SortedTableColumn("Current Instances", G.Utils_formatCommaSeparated$closure())], t1, [], 0, true, null, null));
+      receiver._heap_profile_element$__$classTable = t1;
+      t1.set$sortColumnIndex(2);
+    },
+    static: {HeapProfileElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._heap_profile_element$__$lastServiceGC = "---";
+        receiver._heap_profile_element$__$lastAccumulatorReset = "---";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.HeapProfileElement_methods.Element$created$0(receiver);
+        C.HeapProfileElement_methods.PolymerElement$created$0(receiver);
+        C.HeapProfileElement_methods.HeapProfileElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier11: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["html_common", "dart:html_common", , P, {
+  "^": "",
+  _convertDartToNative_PrepareForStructuredClone: function(value) {
+    var copies, copy;
+    copies = [];
+    copy = new P._convertDartToNative_PrepareForStructuredClone_walk(new P._convertDartToNative_PrepareForStructuredClone_findSlot([], copies), new P._convertDartToNative_PrepareForStructuredClone_readSlot(copies), new P._convertDartToNative_PrepareForStructuredClone_writeSlot(copies)).call$1(value);
+    new P._convertDartToNative_PrepareForStructuredClone_cleanupSlots().call$0();
+    return copy;
+  },
+  convertNativeToDart_AcceptStructuredClone: function(object, mustCopy) {
+    var copies = [];
+    return new P.convertNativeToDart_AcceptStructuredClone_walk(mustCopy, new P.convertNativeToDart_AcceptStructuredClone_findSlot([], copies), new P.convertNativeToDart_AcceptStructuredClone_readSlot(copies), new P.convertNativeToDart_AcceptStructuredClone_writeSlot(copies)).call$1(object);
+  },
+  convertNativeToDart_ImageData: function(nativeImageData) {
+    var t1, data;
+    t1 = J.getInterceptor(nativeImageData);
+    if (!!t1.$isImageData) {
+      data = t1.get$data(nativeImageData);
+      if (data.constructor === Array)
+        if (typeof CanvasPixelArray !== "undefined") {
+          data.constructor = CanvasPixelArray;
+          data.BYTES_PER_ELEMENT = 1;
+        }
+      return nativeImageData;
+    }
+    return new P._TypedImageData(nativeImageData.data, nativeImageData.height, nativeImageData.width);
+  },
+  convertDartToNative_ImageData: function(imageData) {
+    if (!!J.getInterceptor(imageData).$is_TypedImageData)
+      return {data: imageData.data, height: imageData.height, width: imageData.width};
+    return imageData;
+  },
+  Device_isWebKit: function() {
+    var t1 = $.Device__isWebKit;
+    if (t1 == null) {
+      t1 = $.Device__isOpera;
+      if (t1 == null) {
+        t1 = J.contains$2$asx(window.navigator.userAgent, "Opera", 0);
+        $.Device__isOpera = t1;
+      }
+      t1 = t1 !== true && J.contains$2$asx(window.navigator.userAgent, "WebKit", 0);
+      $.Device__isWebKit = t1;
+    }
+    return t1;
+  },
+  _convertDartToNative_PrepareForStructuredClone_findSlot: {
+    "^": "Closure:48;values_1,copies_2",
+    call$1: function(value) {
+      var t1, $length, i;
+      t1 = this.values_1;
+      $length = t1.length;
+      for (i = 0; i < $length; ++i)
+        if (t1[i] === value)
+          return i;
+      t1.push(value);
+      this.copies_2.push(null);
+      return $length;
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_readSlot: {
+    "^": "Closure:138;copies_3",
+    call$1: function(i) {
+      var t1 = this.copies_3;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      return t1[i];
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_writeSlot: {
+    "^": "Closure:139;copies_4",
+    call$2: function(i, x) {
+      var t1 = this.copies_4;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      t1[i] = x;
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_cleanupSlots: {
+    "^": "Closure:69;",
+    call$0: function() {
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_walk: {
+    "^": "Closure:13;findSlot_5,readSlot_6,writeSlot_7",
+    call$1: function(e) {
+      var t1, t2, slot, copy, $length, i;
+      t1 = {};
+      if (e == null)
+        return e;
+      if (typeof e === "boolean")
+        return e;
+      if (typeof e === "number")
+        return e;
+      if (typeof e === "string")
+        return e;
+      t2 = J.getInterceptor(e);
+      if (!!t2.$isDateTime)
+        return new Date(e.millisecondsSinceEpoch);
+      if (!!t2.$isRegExp)
+        throw H.wrapException(P.UnimplementedError$("structured clone of RegExp"));
+      if (!!t2.$isFile)
+        return e;
+      if (!!t2.$isBlob)
+        return e;
+      if (!!t2.$isImageData)
+        return e;
+      if (!!t2.$isNativeByteBuffer)
+        return e;
+      if (!!t2.$isNativeTypedData)
+        return e;
+      if (!!t2.$isMap) {
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        t1.copy_0 = copy;
+        if (copy != null)
+          return copy;
+        copy = {};
+        t1.copy_0 = copy;
+        this.writeSlot_7.call$2(slot, copy);
+        t2.forEach$1(e, new P._convertDartToNative_PrepareForStructuredClone_walk_closure(t1, this));
+        return t1.copy_0;
+      }
+      if (!!t2.$isList) {
+        $length = t2.get$length(e);
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        if (copy != null) {
+          if (true === copy) {
+            copy = new Array($length);
+            this.writeSlot_7.call$2(slot, copy);
+          }
+          return copy;
+        }
+        copy = new Array($length);
+        this.writeSlot_7.call$2(slot, copy);
+        for (i = 0; i < $length; ++i) {
+          t1 = this.call$1(t2.$index(e, i));
+          if (i >= copy.length)
+            return H.ioore(copy, i);
+          copy[i] = t1;
+        }
+        return copy;
+      }
+      throw H.wrapException(P.UnimplementedError$("structured clone of other type"));
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_walk_closure: {
+    "^": "Closure:75;box_0,walk_8",
+    call$2: function(key, value) {
+      this.box_0.copy_0[key] = this.walk_8.call$1(value);
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_findSlot: {
+    "^": "Closure:48;values_0,copies_1",
+    call$1: function(value) {
+      var t1, $length, i, t2;
+      t1 = this.values_0;
+      $length = t1.length;
+      for (i = 0; i < $length; ++i) {
+        t2 = t1[i];
+        if (t2 == null ? value == null : t2 === value)
+          return i;
+      }
+      t1.push(value);
+      this.copies_1.push(null);
+      return $length;
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_readSlot: {
+    "^": "Closure:138;copies_2",
+    call$1: function(i) {
+      var t1 = this.copies_2;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      return t1[i];
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_writeSlot: {
+    "^": "Closure:139;copies_3",
+    call$2: function(i, x) {
+      var t1 = this.copies_3;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      t1[i] = x;
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_walk: {
+    "^": "Closure:13;mustCopy_4,findSlot_5,readSlot_6,writeSlot_7",
+    call$1: function(e) {
+      var slot, copy, t1, key, $length, t2, i;
+      if (e == null)
+        return e;
+      if (typeof e === "boolean")
+        return e;
+      if (typeof e === "number")
+        return e;
+      if (typeof e === "string")
+        return e;
+      if (e instanceof Date)
+        return P.DateTime$fromMillisecondsSinceEpoch(e.getTime(), true);
+      if (e instanceof RegExp)
+        throw H.wrapException(P.UnimplementedError$("structured clone of RegExp"));
+      if (Object.getPrototypeOf(e) === Object.prototype) {
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        if (copy != null)
+          return copy;
+        copy = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        this.writeSlot_7.call$2(slot, copy);
+        for (t1 = Object.keys(e), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+          key = t1._current;
+          copy.$indexSet(0, key, this.call$1(e[key]));
+        }
+        return copy;
+      }
+      if (e instanceof Array) {
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        if (copy != null)
+          return copy;
+        t1 = J.getInterceptor$asx(e);
+        $length = t1.get$length(e);
+        copy = this.mustCopy_4 ? new Array($length) : e;
+        this.writeSlot_7.call$2(slot, copy);
+        if (typeof $length !== "number")
+          return H.iae($length);
+        t2 = J.getInterceptor$ax(copy);
+        i = 0;
+        for (; i < $length; ++i)
+          t2.$indexSet(copy, i, this.call$1(t1.$index(e, i)));
+        return copy;
+      }
+      return e;
+    },
+    $isFunction: true
+  },
+  _TypedImageData: {
+    "^": "Object;data>,height>,width>",
+    $is_TypedImageData: true,
+    $isImageData: true
+  },
+  CssClassSetImpl: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return this.readClasses$0().join$1(0, " ");
+    },
+    get$iterator: function(_) {
+      var t1 = this.readClasses$0();
+      t1 = H.setRuntimeTypeInfo(new P.LinkedHashSetIterator(t1, t1._modifications, null, null), [null]);
+      t1._cell = t1._set._first;
+      return t1;
+    },
+    forEach$1: function(_, f) {
+      this.readClasses$0().forEach$1(0, f);
+    },
+    join$1: function(_, separator) {
+      return this.readClasses$0().join$1(0, separator);
+    },
+    map$1: [function(_, f) {
+      var t1 = this.readClasses$0();
+      return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(t1, f), [H.getTypeArgumentByIndex(t1, 0), null]);
+    }, "call$1", "get$map", 2, 0, 140, 31],
+    where$1: function(_, f) {
+      var t1 = this.readClasses$0();
+      return H.setRuntimeTypeInfo(new H.WhereIterable(t1, f), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    expand$1: [function(_, f) {
+      var t1 = this.readClasses$0();
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(t1, f), [H.getTypeArgumentByIndex(t1, 0), null]);
+    }, "call$1", "get$expand", 2, 0, 141, 31],
+    any$1: function(_, f) {
+      return this.readClasses$0().any$1(0, f);
+    },
+    get$isEmpty: function(_) {
+      return this.readClasses$0()._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.readClasses$0()._collection$_length !== 0;
+    },
+    get$length: function(_) {
+      return this.readClasses$0()._collection$_length;
+    },
+    contains$1: function(_, value) {
+      return this.readClasses$0().contains$1(0, value);
+    },
+    lookup$1: function(value) {
+      return this.readClasses$0().contains$1(0, value) ? value : null;
+    },
+    add$1: function(_, value) {
+      return this.modify$1(new P.CssClassSetImpl_add_closure(value));
+    },
+    remove$1: function(_, value) {
+      var s, result;
+      s = this.readClasses$0();
+      result = s.remove$1(0, value);
+      this.writeClasses$1(s);
+      return result;
+    },
+    addAll$1: function(_, iterable) {
+      this.modify$1(new P.CssClassSetImpl_addAll_closure(iterable));
+    },
+    get$last: function(_) {
+      var t1 = this.readClasses$0()._last;
+      if (t1 == null)
+        H.throwExpression(P.StateError$("No elements"));
+      return t1.get$_element(t1);
+    },
+    toList$1$growable: function(_, growable) {
+      return this.readClasses$0().toList$1$growable(0, growable);
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    clear$0: function(_) {
+      this.modify$1(new P.CssClassSetImpl_clear_closure());
+    },
+    modify$1: function(f) {
+      var s, ret;
+      s = this.readClasses$0();
+      ret = f.call$1(s);
+      this.writeClasses$1(s);
+      return ret;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.String];
+    }
+  },
+  CssClassSetImpl_add_closure: {
+    "^": "Closure:13;value_0",
+    call$1: [function(s) {
+      return J.add$1$ax(s, this.value_0);
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  CssClassSetImpl_addAll_closure: {
+    "^": "Closure:13;iterable_0",
+    call$1: [function(s) {
+      return J.addAll$1$ax(s, this.iterable_0);
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  CssClassSetImpl_clear_closure: {
+    "^": "Closure:13;",
+    call$1: [function(s) {
+      return J.clear$0$ax(s);
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  FilteredElementList: {
+    "^": "ListBase;_html_common$_node,_childNodes",
+    get$_filtered: function() {
+      var t1 = this._childNodes;
+      return P.List_List$from(t1.where$1(t1, new P.FilteredElementList__filtered_closure()), true, W.Element);
+    },
+    forEach$1: function(_, f) {
+      H.IterableMixinWorkaround_forEach(this.get$_filtered(), f);
+    },
+    $indexSet: function(_, index, value) {
+      var t1 = this.get$_filtered();
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      J.replaceWith$1$x(t1[index], value);
+    },
+    set$length: function(_, newLength) {
+      var len = this.get$_filtered().length;
+      if (newLength >= len)
+        return;
+      else if (newLength < 0)
+        throw H.wrapException(P.ArgumentError$("Invalid list length"));
+      this.removeRange$2(0, newLength, len);
+    },
+    add$1: function(_, value) {
+      this._childNodes._this.appendChild(value);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]), t2 = this._childNodes._this; t1.moveNext$0();)
+        t2.appendChild(t1._current);
+    },
+    contains$1: function(_, needle) {
+      return false;
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort filtered list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setRange on filtered list"));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(_, start, end) {
+      H.IterableMixinWorkaround_forEach(C.JSArray_methods.sublist$2(this.get$_filtered(), start, end), new P.FilteredElementList_removeRange_closure());
+    },
+    clear$0: function(_) {
+      J._clearChildren$0$x(this._childNodes._this);
+    },
+    removeLast$0: function(_) {
+      var result = this.get$last(this);
+      if (result != null)
+        J.remove$0$ax(result);
+      return result;
+    },
+    insert$2: function(_, index, value) {
+      this._childNodes.insert$2(0, index, value);
+    },
+    insertAll$2: function(_, index, iterable) {
+      var t1, t2;
+      t1 = this._childNodes._this;
+      t2 = t1.childNodes;
+      if (index < 0 || index >= t2.length)
+        return H.ioore(t2, index);
+      J.insertAllBefore$2$x(t1, iterable, t2[index]);
+    },
+    get$length: function(_) {
+      return this.get$_filtered().length;
+    },
+    $index: function(_, index) {
+      var t1 = this.get$_filtered();
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    get$iterator: function(_) {
+      var t1 = this.get$_filtered();
+      return H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]);
+    }
+  },
+  FilteredElementList__filtered_closure: {
+    "^": "Closure:13;",
+    call$1: function(n) {
+      return !!J.getInterceptor(n).$isElement;
+    },
+    $isFunction: true
+  },
+  FilteredElementList_removeRange_closure: {
+    "^": "Closure:13;",
+    call$1: function(el) {
+      return J.remove$0$ax(el);
+    },
+    $isFunction: true
+  }
+}],
+["instance_ref_element", "package:observatory/src/elements/instance_ref.dart", , B, {
+  "^": "",
+  InstanceRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$hoverText: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 != null)
+        if (J.$eq(t1.get$serviceType(), "Null"))
+          if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/optimized-out"))
+            return "This object is no longer needed and has been removed by the optimizing compiler.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/collected"))
+            return "This object has been reclaimed by the garbage collector.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/expired"))
+            return "The handle to this object has expired.  Consider refreshing the page.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/not-initialized"))
+            return "This object will be initialized once it is accessed by the program.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/being-initialized"))
+            return "This object is currently being initialized.";
+      return Q.ServiceRefElement.prototype.get$hoverText.call(this, receiver);
+    },
+    expander$0: [function(receiver) {
+      return this.get$expandEvent(receiver);
+    }, "call$0", "get$expander", 0, 0, 69],
+    expandEvent$2: [function(receiver, expand, done) {
+      var t1, t2;
+      t1 = receiver._service_ref_element$__$ref;
+      if (expand === true)
+        J.reload$0$x(t1).then$1(new B.InstanceRefElement_expandEvent_closure(receiver)).whenComplete$1(done);
+      else {
+        t2 = J.getInterceptor$ax(t1);
+        t2.$indexSet(t1, "fields", null);
+        t2.$indexSet(t1, "elements", null);
+        done.call$0();
+      }
+    }, "call$2", "get$expandEvent", 4, 0, 143, 144, 89],
+    static: {InstanceRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.InstanceRefElement_methods.Element$created$0(receiver);
+        C.InstanceRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  InstanceRefElement_expandEvent_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(result);
+      if (t1.$index(result, "valueAsString") != null) {
+        t1.set$name(result, t1.$index(result, "valueAsString"));
+        result.set$vmName(t1.$index(result, "valueAsString"));
+      }
+      t1 = this.this_0;
+      t2 = J.getInterceptor$x(t1);
+      t1._service_ref_element$__$ref = t2.notifyPropertyChange$3(t1, C.Symbol_ref, t1._service_ref_element$__$ref, result);
+      t2.notifyPropertyChange$3(t1, C.Symbol_ref, 0, 1);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  }
+}],
+["instance_view_element", "package:observatory/src/elements/instance_view.dart", , Z, {
+  "^": "",
+  InstanceViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier12;_instance_view_element$__$instance,_instance_view_element$__$path,_instance_view_element$__$retainedBytes,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$instance: function(receiver) {
+      return receiver._instance_view_element$__$instance;
+    },
+    set$instance: function(receiver, value) {
+      receiver._instance_view_element$__$instance = this.notifyPropertyChange$3(receiver, C.Symbol_instance, receiver._instance_view_element$__$instance, value);
+    },
+    get$path: function(receiver) {
+      return receiver._instance_view_element$__$path;
+    },
+    set$path: function(receiver, value) {
+      receiver._instance_view_element$__$path = this.notifyPropertyChange$3(receiver, C.Symbol_path, receiver._instance_view_element$__$path, value);
+    },
+    get$retainedBytes: function(receiver) {
+      return receiver._instance_view_element$__$retainedBytes;
+    },
+    set$retainedBytes: function(receiver, value) {
+      receiver._instance_view_element$__$retainedBytes = this.notifyPropertyChange$3(receiver, C.Symbol_retainedBytes, receiver._instance_view_element$__$retainedBytes, value);
+    },
+    eval$1: [function(receiver, text) {
+      return J.get$isolate$x(receiver._instance_view_element$__$instance).get$1(J.$add$ns(J.get$id$x(receiver._instance_view_element$__$instance), "/eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false)));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    retainedSize$1: [function(receiver, dummy) {
+      return J.get$isolate$x(receiver._instance_view_element$__$instance).get$1(J.$add$ns(J.get$id$x(receiver._instance_view_element$__$instance), "/retained")).then$1(new Z.InstanceViewElement_retainedSize_closure(receiver));
+    }, "call$1", "get$retainedSize", 2, 0, 98, 100],
+    retainingPath$1: [function(receiver, arg) {
+      return J.get$isolate$x(receiver._instance_view_element$__$instance).get$1(J.$add$ns(J.get$id$x(receiver._instance_view_element$__$instance), "/retaining_path?limit=" + H.S(arg))).then$1(new Z.InstanceViewElement_retainingPath_closure(receiver));
+    }, "call$1", "get$retainingPath", 2, 0, 98, 33],
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._instance_view_element$__$instance).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {InstanceViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._instance_view_element$__$retainedBytes = null;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.InstanceViewElement_methods.Element$created$0(receiver);
+        C.InstanceViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier12: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  InstanceViewElement_retainedSize_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(obj) {
+      var t1, t2;
+      t1 = this.this_0;
+      t2 = H.Primitives_parseInt(J.$index$asx(obj, "valueAsString"), null, null);
+      t1._instance_view_element$__$retainedBytes = J.notifyPropertyChange$3$x(t1, C.Symbol_retainedBytes, t1._instance_view_element$__$retainedBytes, t2);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  InstanceViewElement_retainingPath_closure: {
+    "^": "Closure:130;this_0",
+    call$1: [function(obj) {
+      var t1 = this.this_0;
+      t1._instance_view_element$__$path = J.notifyPropertyChange$3$x(t1, C.Symbol_path, t1._instance_view_element$__$path, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  }
+}],
+["io_view_element", "package:observatory/src/elements/io_view.dart", , E, {
+  "^": "",
+  IOViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier13;_io_view_element$__$io,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$io: function(receiver) {
+      return receiver._io_view_element$__$io;
+    },
+    set$io: function(receiver, value) {
+      receiver._io_view_element$__$io = this.notifyPropertyChange$3(receiver, C.Symbol_io, receiver._io_view_element$__$io, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$io).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOViewElement_methods.Element$created$0(receiver);
+        C.IOViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier13: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IORefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORefElement_methods.Element$created$0(receiver);
+        C.IORefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOHttpServerListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier14;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOHttpServerListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerListViewElement_methods.Element$created$0(receiver);
+        C.IOHttpServerListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier14: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOHttpServerRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOHttpServerRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerRefElement_methods.Element$created$0(receiver);
+        C.IOHttpServerRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOHttpServerViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier15;_io_view_element$__$httpServer,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$httpServer: function(receiver) {
+      return receiver._io_view_element$__$httpServer;
+    },
+    set$httpServer: function(receiver, value) {
+      receiver._io_view_element$__$httpServer = this.notifyPropertyChange$3(receiver, C.Symbol_httpServer, receiver._io_view_element$__$httpServer, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$httpServer).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateHttpServer$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$httpServer).whenComplete$1(new E.IOHttpServerViewElement__updateHttpServer_closure(receiver));
+    }, "call$0", "get$_updateHttpServer", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateHttpServer(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IOHttpServerViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerViewElement_methods.Element$created$0(receiver);
+        C.IOHttpServerViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier15: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOHttpServerViewElement__updateHttpServer_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateHttpServer$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IOHttpServerConnectionViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier16;_io_view_element$__$connection,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$connection: function(receiver) {
+      return receiver._io_view_element$__$connection;
+    },
+    set$connection: function(receiver, value) {
+      receiver._io_view_element$__$connection = this.notifyPropertyChange$3(receiver, C.Symbol_connection, receiver._io_view_element$__$connection, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$connection).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateHttpServer$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$connection).whenComplete$1(new E.IOHttpServerConnectionViewElement__updateHttpServer_closure(receiver));
+    }, "call$0", "get$_updateHttpServer", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateHttpServer(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IOHttpServerConnectionViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerConnectionViewElement_methods.Element$created$0(receiver);
+        C.IOHttpServerConnectionViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier16: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOHttpServerConnectionViewElement__updateHttpServer_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateHttpServer$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IOHttpServerConnectionRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOHttpServerConnectionRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerConnectionRefElement_methods.Element$created$0(receiver);
+        C.IOHttpServerConnectionRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOSocketRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOSocketRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOSocketRefElement_methods.Element$created$0(receiver);
+        C.IOSocketRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOSocketListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier17;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOSocketListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOSocketListViewElement_methods.Element$created$0(receiver);
+        C.IOSocketListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier17: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOSocketViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier18;_io_view_element$__$socket,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$socket: function(receiver) {
+      return receiver._io_view_element$__$socket;
+    },
+    set$socket: function(receiver, value) {
+      receiver._io_view_element$__$socket = this.notifyPropertyChange$3(receiver, C.Symbol_socket, receiver._io_view_element$__$socket, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$socket).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOSocketViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOSocketViewElement_methods.Element$created$0(receiver);
+        C.IOSocketViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier18: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOWebSocketRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOWebSocketRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOWebSocketRefElement_methods.Element$created$0(receiver);
+        C.IOWebSocketRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOWebSocketListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier19;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOWebSocketListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOWebSocketListViewElement_methods.Element$created$0(receiver);
+        C.IOWebSocketListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier19: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOWebSocketViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier20;_io_view_element$__$webSocket,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$webSocket: function(receiver) {
+      return receiver._io_view_element$__$webSocket;
+    },
+    set$webSocket: function(receiver, value) {
+      receiver._io_view_element$__$webSocket = this.notifyPropertyChange$3(receiver, C.Symbol_webSocket, receiver._io_view_element$__$webSocket, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$webSocket).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOWebSocketViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOWebSocketViewElement_methods.Element$created$0(receiver);
+        C.IOWebSocketViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier20: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORandomAccessFileListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier21;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IORandomAccessFileListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORandomAccessFileListViewElement_methods.Element$created$0(receiver);
+        C.IORandomAccessFileListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier21: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORandomAccessFileRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IORandomAccessFileRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORandomAccessFileRefElement_methods.Element$created$0(receiver);
+        C.IORandomAccessFileRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IORandomAccessFileViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier22;_io_view_element$__$file,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$file: function(receiver) {
+      return receiver._io_view_element$__$file;
+    },
+    set$file: function(receiver, value) {
+      receiver._io_view_element$__$file = this.notifyPropertyChange$3(receiver, C.Symbol_file, receiver._io_view_element$__$file, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$file).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateFile$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$file).whenComplete$1(new E.IORandomAccessFileViewElement__updateFile_closure(receiver));
+    }, "call$0", "get$_updateFile", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateFile(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IORandomAccessFileViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORandomAccessFileViewElement_methods.Element$created$0(receiver);
+        C.IORandomAccessFileViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier22: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORandomAccessFileViewElement__updateFile_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateFile$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IOProcessListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier23;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOProcessListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOProcessListViewElement_methods.Element$created$0(receiver);
+        C.IOProcessListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier23: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOProcessRefElement: {
+    "^": "ServiceRefElement_ChangeNotifier0;_io_view_element$__$small,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$small: function(receiver) {
+      return receiver._io_view_element$__$small;
+    },
+    set$small: function(receiver, value) {
+      receiver._io_view_element$__$small = this.notifyPropertyChange$3(receiver, C.Symbol_small, receiver._io_view_element$__$small, value);
+    },
+    static: {IOProcessRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._io_view_element$__$small = false;
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOProcessRefElement_methods.Element$created$0(receiver);
+        C.IOProcessRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ServiceRefElement_ChangeNotifier0: {
+    "^": "ServiceRefElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOProcessViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier24;_io_view_element$__$process,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$process: function(receiver) {
+      return receiver._io_view_element$__$process;
+    },
+    process$0: function($receiver) {
+      return this.get$process($receiver).call$0();
+    },
+    set$process: function(receiver, value) {
+      receiver._io_view_element$__$process = this.notifyPropertyChange$3(receiver, C.Symbol_process, receiver._io_view_element$__$process, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$process).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateFile$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$process).whenComplete$1(new E.IOProcessViewElement__updateFile_closure(receiver));
+    }, "call$0", "get$_updateFile", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateFile(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IOProcessViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOProcessViewElement_methods.Element$created$0(receiver);
+        C.IOProcessViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier24: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOProcessViewElement__updateFile_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateFile$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+}],
+["isolate_profile_element", "package:observatory/src/elements/isolate_profile.dart", , X, {
+  "^": "",
+  ProfileCodeTrieNodeTreeRow: {
+    "^": "TableTreeRow;profile>,root,node,tipKind<,tipParent<,tipExclusive<,tipTicks<,tipTime<,parent,depth,children,columns,_app$__$expander,_app$__$expanderStyle,_expanded,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$code: function(_) {
+      return J.get$code$x(this.node);
+    },
+    onShow$0: function(_) {
+      var t1, threshold, t2, t3, t4, t5, childNode, t6;
+      t1 = this.profile;
+      threshold = J.$index$asx(t1, "threshold");
+      t2 = this.children;
+      if (t2.length > 0)
+        return;
+      for (t3 = this.node, t4 = J.get$iterator$ax(J.get$children$x(t3)), t5 = this.root; t4.moveNext$0();) {
+        childNode = t4.get$current();
+        t6 = J.$div$n(childNode.get$count(), t3.get$count());
+        if (typeof threshold !== "number")
+          return H.iae(threshold);
+        if (!(t6 > threshold || J.$div$n(J.get$code$x(childNode).get$exclusiveTicks(), t5.count) > threshold))
+          continue;
+        t2.push(X.ProfileCodeTrieNodeTreeRow$(t1, t5, childNode, this));
+      }
+    },
+    onHide$0: function() {
+    },
+    hasChildren$0: function() {
+      return J.get$length$asx(J.get$children$x(this.node)) > 0;
+    },
+    ProfileCodeTrieNodeTreeRow$4: function(profile, root, node, $parent) {
+      var t1, t2;
+      t1 = this.node;
+      this.tipTicks = H.S(t1.get$count());
+      this.tipTime = G.Utils_formatTimePrecise(J.$div$n(J.$mul$ns(J.$index$asx(this.profile, "period"), t1.get$count()), 1000000));
+      t2 = J.getInterceptor$x(t1);
+      if (J.$eq(J.get$kind$x(t2.get$code(t1)), C.CodeKind_Tag)) {
+        this.tipKind = "Tag (category)";
+        if ($parent == null)
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), this.root.count);
+        else
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), $parent.node.get$count());
+        this.tipExclusive = G.Utils_formatPercent(t1.get$count(), this.root.count);
+      } else {
+        if (J.$eq(J.get$kind$x(t2.get$code(t1)), C.CodeKind_Collected) || J.$eq(J.get$kind$x(t2.get$code(t1)), C.CodeKind_Reused))
+          this.tipKind = "Garbage Collected Code";
+        else
+          this.tipKind = H.S(J.get$kind$x(t2.get$code(t1))) + " (Function)";
+        if ($parent == null)
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), this.root.count);
+        else
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), $parent.node.get$count());
+        this.tipExclusive = G.Utils_formatPercent(t2.get$code(t1).get$exclusiveTicks(), this.root.count);
+      }
+      t1 = this.columns;
+      t1.push(this.tipParent);
+      t1.push(this.tipExclusive);
+    },
+    static: {ProfileCodeTrieNodeTreeRow$: function(profile, root, node, $parent) {
+        var t1, t2;
+        t1 = H.setRuntimeTypeInfo([], [G.TableTreeRow]);
+        t2 = $parent != null ? $parent.depth + 1 : 0;
+        t1 = new X.ProfileCodeTrieNodeTreeRow(profile, root, node, "", "", "", "", "", $parent, t2, t1, [], "\u2192", "cursor: pointer;", false, null, null);
+        t1.TableTreeRow$1($parent);
+        t1.ProfileCodeTrieNodeTreeRow$4(profile, root, node, $parent);
+        return t1;
+      }}
+  },
+  IsolateProfileElement: {
+    "^": "ObservatoryElement_ChangeNotifier25;_isolate_profile_element$__$profile,_isolate_profile_element$__$hideTagsChecked,_isolate_profile_element$__$sampleCount,_isolate_profile_element$__$refreshTime,_isolate_profile_element$__$sampleRate,_isolate_profile_element$__$sampleDepth,_isolate_profile_element$__$displayCutoff,_isolate_profile_element$__$timeSpan,displayThreshold,_isolate_profile_element$__$tagSelector,_isolate_profile_element$_id,tree=,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$profile: function(receiver) {
+      return receiver._isolate_profile_element$__$profile;
+    },
+    set$profile: function(receiver, value) {
+      receiver._isolate_profile_element$__$profile = this.notifyPropertyChange$3(receiver, C.Symbol_profile, receiver._isolate_profile_element$__$profile, value);
+    },
+    get$hideTagsChecked: function(receiver) {
+      return receiver._isolate_profile_element$__$hideTagsChecked;
+    },
+    set$hideTagsChecked: function(receiver, value) {
+      receiver._isolate_profile_element$__$hideTagsChecked = this.notifyPropertyChange$3(receiver, C.Symbol_hideTagsChecked, receiver._isolate_profile_element$__$hideTagsChecked, value);
+    },
+    get$sampleCount: function(receiver) {
+      return receiver._isolate_profile_element$__$sampleCount;
+    },
+    set$sampleCount: function(receiver, value) {
+      receiver._isolate_profile_element$__$sampleCount = this.notifyPropertyChange$3(receiver, C.Symbol_sampleCount, receiver._isolate_profile_element$__$sampleCount, value);
+    },
+    get$refreshTime: function(receiver) {
+      return receiver._isolate_profile_element$__$refreshTime;
+    },
+    set$refreshTime: function(receiver, value) {
+      receiver._isolate_profile_element$__$refreshTime = this.notifyPropertyChange$3(receiver, C.Symbol_refreshTime, receiver._isolate_profile_element$__$refreshTime, value);
+    },
+    get$sampleRate: function(receiver) {
+      return receiver._isolate_profile_element$__$sampleRate;
+    },
+    set$sampleRate: function(receiver, value) {
+      receiver._isolate_profile_element$__$sampleRate = this.notifyPropertyChange$3(receiver, C.Symbol_sampleRate, receiver._isolate_profile_element$__$sampleRate, value);
+    },
+    get$sampleDepth: function(receiver) {
+      return receiver._isolate_profile_element$__$sampleDepth;
+    },
+    set$sampleDepth: function(receiver, value) {
+      receiver._isolate_profile_element$__$sampleDepth = this.notifyPropertyChange$3(receiver, C.Symbol_sampleDepth, receiver._isolate_profile_element$__$sampleDepth, value);
+    },
+    get$displayCutoff: function(receiver) {
+      return receiver._isolate_profile_element$__$displayCutoff;
+    },
+    set$displayCutoff: function(receiver, value) {
+      receiver._isolate_profile_element$__$displayCutoff = this.notifyPropertyChange$3(receiver, C.Symbol_displayCutoff, receiver._isolate_profile_element$__$displayCutoff, value);
+    },
+    get$timeSpan: function(receiver) {
+      return receiver._isolate_profile_element$__$timeSpan;
+    },
+    set$timeSpan: function(receiver, value) {
+      receiver._isolate_profile_element$__$timeSpan = this.notifyPropertyChange$3(receiver, C.Symbol_timeSpan, receiver._isolate_profile_element$__$timeSpan, value);
+    },
+    get$tagSelector: function(receiver) {
+      return receiver._isolate_profile_element$__$tagSelector;
+    },
+    set$tagSelector: function(receiver, value) {
+      receiver._isolate_profile_element$__$tagSelector = this.notifyPropertyChange$3(receiver, C.Symbol_tagSelector, receiver._isolate_profile_element$__$tagSelector, value);
+    },
+    profileChanged$1: [function(receiver, oldValue) {
+      var t1, totalSamples, now, period, t2;
+      t1 = receiver._isolate_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      totalSamples = J.$index$asx(t1, "samples");
+      now = new P.DateTime(Date.now(), false);
+      now.DateTime$_now$0();
+      t1 = J.toString$0(totalSamples);
+      receiver._isolate_profile_element$__$sampleCount = this.notifyPropertyChange$3(receiver, C.Symbol_sampleCount, receiver._isolate_profile_element$__$sampleCount, t1);
+      t1 = now.toString$0(0);
+      receiver._isolate_profile_element$__$refreshTime = this.notifyPropertyChange$3(receiver, C.Symbol_refreshTime, receiver._isolate_profile_element$__$refreshTime, t1);
+      t1 = J.toString$0(J.$index$asx(receiver._isolate_profile_element$__$profile, "depth"));
+      receiver._isolate_profile_element$__$sampleDepth = this.notifyPropertyChange$3(receiver, C.Symbol_sampleDepth, receiver._isolate_profile_element$__$sampleDepth, t1);
+      period = J.$index$asx(receiver._isolate_profile_element$__$profile, "period");
+      if (typeof period !== "number")
+        return H.iae(period);
+      t1 = C.JSNumber_methods.toStringAsFixed$1(1000000 / period, 0);
+      receiver._isolate_profile_element$__$sampleRate = this.notifyPropertyChange$3(receiver, C.Symbol_sampleRate, receiver._isolate_profile_element$__$sampleRate, t1);
+      t1 = G.Utils_formatTime(J.$index$asx(receiver._isolate_profile_element$__$profile, "timeSpan"));
+      receiver._isolate_profile_element$__$timeSpan = this.notifyPropertyChange$3(receiver, C.Symbol_timeSpan, receiver._isolate_profile_element$__$timeSpan, t1);
+      t1 = receiver.displayThreshold;
+      t2 = C.JSDouble_methods.toString$0(t1 * 100) + "%";
+      receiver._isolate_profile_element$__$displayCutoff = this.notifyPropertyChange$3(receiver, C.Symbol_displayCutoff, receiver._isolate_profile_element$__$displayCutoff, t2);
+      J.get$isolate$x(receiver._isolate_profile_element$__$profile).processProfile$1(receiver._isolate_profile_element$__$profile);
+      J.$indexSet$ax(receiver._isolate_profile_element$__$profile, "threshold", t1);
+      this._isolate_profile_element$_update$0(receiver);
+    }, "call$1", "get$profileChanged", 2, 0, 20, 57],
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = R._toObservableDeep([]);
+      receiver.tree = new G.TableTree(t1, null, null);
+      this._isolate_profile_element$_update$0(receiver);
+    },
+    tagSelectorChanged$1: [function(receiver, oldValue) {
+      this.refresh$1(receiver, null);
+    }, "call$1", "get$tagSelectorChanged", 2, 0, 20, 57],
+    refresh$1: [function(receiver, done) {
+      var request = "profile?tags=" + H.S(receiver._isolate_profile_element$__$tagSelector);
+      J.get$isolate$x(receiver._isolate_profile_element$__$profile).get$1(request).then$1(new X.IsolateProfileElement_refresh_closure(receiver)).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _isolate_profile_element$_update$0: function(receiver) {
+      if (receiver._isolate_profile_element$__$profile == null)
+        return;
+      this._buildStackTree$0(receiver);
+    },
+    _buildStackTree$0: function(receiver) {
+      var root, e, stackTrace, exception, t1;
+      root = J.get$isolate$x(receiver._isolate_profile_element$__$profile).get$profileTrieRoot();
+      if (root == null)
+        return;
+      try {
+        receiver.tree.initialize$1(X.ProfileCodeTrieNodeTreeRow$(receiver._isolate_profile_element$__$profile, root, root, null));
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        stackTrace = new H._StackTrace(exception, null);
+        N.Logger_Logger("").warning$3("_buildStackTree", e, stackTrace);
+      }
+
+      if (J.$eq(J.get$length$asx(receiver.tree.rows), 1))
+        receiver.tree.toggle$1(0);
+      this.notifyPropertyChange$3(receiver, C.Symbol_tree, null, receiver.tree);
+    },
+    padding$1: [function(receiver, row) {
+      return "padding-left: " + row.get$depth() * 16 + "px;";
+    }, "call$1", "get$padding", 2, 0, 90, 91],
+    coloring$1: [function(receiver, row) {
+      return C.List_mBx[C.JSInt_methods.$mod(row.get$depth() - 1, 9)];
+    }, "call$1", "get$coloring", 2, 0, 90, 91],
+    toggleExpanded$3: [function(receiver, e, detail, target) {
+      var row, e0, stackTrace, t1, t2, exception;
+      t1 = J.getInterceptor$x(e);
+      if (!J.$eq(J.get$id$x(t1.get$target(e)), "expand") && !J.$eq(t1.get$target(e), target))
+        return;
+      row = J.get$parent$x(target);
+      if (!!J.getInterceptor(row).$isTableRowElement)
+        try {
+          t1 = receiver.tree;
+          t2 = J.get$rowIndex$x(row);
+          if (typeof t2 !== "number")
+            return t2.$sub();
+          t1.toggle$1(t2 - 1);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          stackTrace = new H._StackTrace(exception, null);
+          N.Logger_Logger("").warning$3("toggleExpanded", e0, stackTrace);
+        }
+
+    }, "call$3", "get$toggleExpanded", 6, 0, 92, 1, 93, 94],
+    static: {"^": "IsolateProfileElement_MICROSECONDS_PER_SECOND", IsolateProfileElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._isolate_profile_element$__$sampleCount = "";
+        receiver._isolate_profile_element$__$refreshTime = "";
+        receiver._isolate_profile_element$__$sampleRate = "";
+        receiver._isolate_profile_element$__$sampleDepth = "";
+        receiver._isolate_profile_element$__$displayCutoff = "";
+        receiver._isolate_profile_element$__$timeSpan = "";
+        receiver.displayThreshold = 0.0002;
+        receiver._isolate_profile_element$__$tagSelector = "uv";
+        receiver._isolate_profile_element$_id = "#tableTree";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateProfileElement_methods.Element$created$0(receiver);
+        C.IsolateProfileElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier25: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateProfileElement_refresh_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(m) {
+      var t1 = this.this_0;
+      t1._isolate_profile_element$__$profile = J.notifyPropertyChange$3$x(t1, C.Symbol_profile, t1._isolate_profile_element$__$profile, m);
+    }, "call$1", null, 2, 0, null, 145, "call"],
+    $isFunction: true
+  }
+}],
+["isolate_ref_element", "package:observatory/src/elements/isolate_ref.dart", , N, {
+  "^": "",
+  IsolateRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IsolateRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateRefElement_methods.Element$created$0(receiver);
+        C.IsolateRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["isolate_summary_element", "package:observatory/src/elements/isolate_summary.dart", , D, {
+  "^": "",
+  IsolateSummaryElement: {
+    "^": "ObservatoryElement_ChangeNotifier26;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    static: {IsolateSummaryElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateSummaryElement_methods.Element$created$0(receiver);
+        C.IsolateSummaryElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier26: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateRunStateElement: {
+    "^": "ObservatoryElement_ChangeNotifier27;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    pause$1: [function(receiver, _) {
+      return receiver._isolate_summary_element$__$isolate.get$1("debug/pause").then$1(new D.IsolateRunStateElement_pause_closure(receiver));
+    }, "call$1", "get$pause", 2, 0, 146, 14],
+    resume$1: [function(receiver, _) {
+      return receiver._isolate_summary_element$__$isolate.get$1("debug/resume").then$1(new D.IsolateRunStateElement_resume_closure(receiver));
+    }, "call$1", "get$resume", 2, 0, 146, 14],
+    static: {IsolateRunStateElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateRunStateElement_methods.Element$created$0(receiver);
+        C.IsolateRunStateElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier27: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateRunStateElement_pause_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_summary_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  IsolateRunStateElement_resume_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_summary_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  IsolateLocationElement: {
+    "^": "ObservatoryElement_ChangeNotifier28;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    static: {IsolateLocationElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateLocationElement_methods.Element$created$0(receiver);
+        C.IsolateLocationElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier28: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateSharedSummaryElement: {
+    "^": "ObservatoryElement_ChangeNotifier29;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    static: {IsolateSharedSummaryElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateSharedSummaryElement_methods.Element$created$0(receiver);
+        C.IsolateSharedSummaryElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier29: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  CounterChart: {
+    "^": "Object;_table,_chart",
+    update$1: function(counters) {
+      var t1, t2, t3, key, t4, t5;
+      t1 = this._table._app$_table;
+      if (J.$eq(t1.callMethod$1("getNumberOfColumns"), 0)) {
+        t1.callMethod$2("addColumn", ["string", "Name"]);
+        t1.callMethod$2("addColumn", ["number", "Value"]);
+      }
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      for (t2 = J.get$iterator$ax(counters.get$keys()), t3 = J.getInterceptor$asx(counters); t2.moveNext$0();) {
+        key = t2.get$current();
+        t4 = J.split$1$s(t3.$index(counters, key), "%");
+        if (0 >= t4.length)
+          return H.ioore(t4, 0);
+        t5 = [];
+        C.JSArray_methods.addAll$1(t5, C.JSArray_methods.map$1([key, H.Primitives_parseDouble(t4[0], null)], P._convertToJS$closure()));
+        t5 = new P.JsArray(t5);
+        t5.$builtinTypeInfo = [null];
+        t1.callMethod$2("addRow", [t5]);
+      }
+    }
+  },
+  IsolateCounterChartElement: {
+    "^": "ObservatoryElement_ChangeNotifier30;_isolate_summary_element$__$counters,chart,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$counters: function(receiver) {
+      return receiver._isolate_summary_element$__$counters;
+    },
+    set$counters: function(receiver, value) {
+      receiver._isolate_summary_element$__$counters = this.notifyPropertyChange$3(receiver, C.Symbol_counters, receiver._isolate_summary_element$__$counters, value);
+    },
+    countersChanged$1: [function(receiver, oldValue) {
+      var t1, element, t2;
+      if (receiver._isolate_summary_element$__$counters == null)
+        return;
+      if ($.get$GoogleChart__completer().future._state !== 0 && receiver.chart == null)
+        receiver.chart = new D.CounterChart(new G.DataTable(P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null)), null);
+      t1 = receiver.chart;
+      if (t1 == null)
+        return;
+      t1.update$1(receiver._isolate_summary_element$__$counters);
+      element = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#counterPieChart");
+      if (element != null) {
+        t1 = receiver.chart;
+        t2 = t1._chart;
+        if (t2 == null) {
+          t2 = new G.Chart(null, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null));
+          t2._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "PieChart"), [element]);
+          t1._chart = t2;
+        }
+        t2.draw$1(t1._table);
+      }
+    }, "call$1", "get$countersChanged", 2, 0, 20, 57],
+    static: {IsolateCounterChartElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateCounterChartElement_methods.Element$created$0(receiver);
+        C.IsolateCounterChartElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier30: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["isolate_view_element", "package:observatory/src/elements/isolate_view.dart", , L, {
+  "^": "",
+  TagProfileChart: {
+    "^": "Object;_isolate_view_element$_table,_isolate_view_element$_chart",
+    update$1: function(tagProfile) {
+      var t1, t2, tagName, idleIndex, t, i, snapshotTime, row, sum, j;
+      t1 = this._isolate_view_element$_table._app$_table;
+      if (J.$eq(t1.callMethod$1("getNumberOfColumns"), 0)) {
+        t1.callMethod$2("addColumn", ["string", "Time"]);
+        for (t2 = J.get$iterator$ax(tagProfile.get$names()); t2.moveNext$0();) {
+          tagName = t2._current;
+          if (J.$eq(tagName, "Idle"))
+            continue;
+          t1.callMethod$2("addColumn", ["number", tagName]);
+        }
+      }
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      idleIndex = J.indexOf$1$asx(tagProfile.get$names(), "Idle");
+      t = tagProfile.get$updatedAtSeconds();
+      for (i = 0; i < tagProfile.get$snapshots().length; ++i) {
+        t2 = tagProfile.get$snapshots();
+        if (i >= t2.length)
+          return H.ioore(t2, i);
+        snapshotTime = t2[i].seconds;
+        row = [];
+        if (snapshotTime > 0) {
+          if (typeof t !== "number")
+            return H.iae(t);
+          row.push("t " + C.JSNumber_methods.toStringAsFixed$1(snapshotTime - t, 2));
+        } else
+          row.push("");
+        t2 = tagProfile.get$snapshots();
+        if (i >= t2.length)
+          return H.ioore(t2, i);
+        sum = t2[i]._sum;
+        if (sum === 0) {
+          j = 0;
+          while (true) {
+            t2 = tagProfile.get$snapshots();
+            if (i >= t2.length)
+              return H.ioore(t2, i);
+            if (!(j < t2[i].counters.length))
+              break;
+            c$1: {
+              if (j === idleIndex)
+                break c$1;
+              row.push(0);
+            }
+            ++j;
+          }
+        } else {
+          j = 0;
+          while (true) {
+            t2 = tagProfile.get$snapshots();
+            if (i >= t2.length)
+              return H.ioore(t2, i);
+            if (!(j < t2[i].counters.length))
+              break;
+            c$1: {
+              if (j === idleIndex)
+                break c$1;
+              t2 = tagProfile.get$snapshots();
+              if (i >= t2.length)
+                return H.ioore(t2, i);
+              t2 = t2[i].counters;
+              if (j >= t2.length)
+                return H.ioore(t2, j);
+              row.push(C.JSNumber_methods.toInt$0(J.$div$n(t2[j], sum) * 100));
+            }
+            ++j;
+          }
+        }
+        t2 = [];
+        C.JSArray_methods.addAll$1(t2, C.JSArray_methods.map$1(row, P._convertToJS$closure()));
+        t2 = new P.JsArray(t2);
+        t2.$builtinTypeInfo = [null];
+        t1.callMethod$2("addRow", [t2]);
+      }
+    }
+  },
+  IsolateViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier31;_isolate_view_element$__$isolate,_isolate_view_element$_updateTimer,tagProfileChart,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_view_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_view_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_view_element$__$isolate, value);
+    },
+    eval$1: [function(receiver, text) {
+      var t1 = receiver._isolate_view_element$__$isolate;
+      return t1.get$1(J.$add$ns(J.get$id$x(t1.get$rootLib()), "/eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false)));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    _updateTagProfile$0: [function(receiver) {
+      receiver._isolate_view_element$__$isolate.updateTagProfile$0().then$1(new L.IsolateViewElement__updateTagProfile_closure(receiver));
+    }, "call$0", "get$_updateTagProfile", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._isolate_view_element$_updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateTagProfile(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._isolate_view_element$_updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._isolate_view_element$_updateTimer = null;
+      }
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._isolate_view_element$__$isolate).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    pause$1: [function(receiver, _) {
+      return receiver._isolate_view_element$__$isolate.get$1("debug/pause").then$1(new L.IsolateViewElement_pause_closure(receiver));
+    }, "call$1", "get$pause", 2, 0, 146, 14],
+    resume$1: [function(receiver, _) {
+      return receiver._isolate_view_element$__$isolate.get$1("resume").then$1(new L.IsolateViewElement_resume_closure(receiver));
+    }, "call$1", "get$resume", 2, 0, 146, 14],
+    static: {IsolateViewElement$created: function(receiver) {
+        var t1, t2, t3;
+        t1 = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null);
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t3 = P.String;
+        t3 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t3, null), null, null), [t3, null]);
+        receiver.tagProfileChart = new L.TagProfileChart(new G.DataTable(t1), null);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t2;
+        receiver.polymer$Polymer$$ = t3;
+        C.IsolateViewElement_methods.Element$created$0(receiver);
+        C.IsolateViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier31: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateViewElement__updateTagProfile_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(tagProfile) {
+      var t1, t2, element, t3, t4;
+      t1 = this.this_0;
+      t2 = t1.tagProfileChart;
+      t2.update$1(tagProfile);
+      element = (t1.shadowRoot || t1.webkitShadowRoot).querySelector("#tagProfileChart");
+      if (element != null) {
+        if (t2._isolate_view_element$_chart == null) {
+          t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+          t4 = new G.Chart(null, t3);
+          t4._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "SteppedAreaChart"), [element]);
+          t2._isolate_view_element$_chart = t4;
+          t3.$indexSet(0, "isStacked", true);
+          t2._isolate_view_element$_chart.options.$indexSet(0, "connectSteps", false);
+          t2._isolate_view_element$_chart.options.$indexSet(0, "vAxis", P.LinkedHashMap_LinkedHashMap$_literal(["minValue", 0, "maxValue", 100], null, null));
+        }
+        t2._isolate_view_element$_chart.draw$1(t2._isolate_view_element$_table);
+      }
+      if (t1._isolate_view_element$_updateTimer != null)
+        t1._isolate_view_element$_updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateTagProfile$x(t1));
+    }, "call$1", null, 2, 0, null, 147, "call"],
+    $isFunction: true
+  },
+  IsolateViewElement_pause_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_view_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  IsolateViewElement_resume_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_view_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  }
+}],
+["json_view_element", "package:observatory/src/elements/json_view.dart", , Z, {
+  "^": "",
+  JsonPrettyPrinter: {
+    "^": "Object;_json_view_element$_buffer,_seen",
+    _printMap$2: function(map, depth) {
+      var t1, t2, t3, t4, t5, k, v, t6;
+      t1 = this._seen;
+      if (t1.contains$1(0, map))
+        return;
+      t1.add$1(0, map);
+      for (t2 = J.get$iterator$ax(map.get$keys()), t3 = this._json_view_element$_buffer, t4 = J.getInterceptor$asx(map), t5 = depth + 1; t2.moveNext$0();) {
+        k = t2.get$current();
+        v = t4.$index(map, k);
+        t6 = J.getInterceptor(v);
+        if (!!t6.$isMap) {
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t6;
+          t6 = "\"" + H.S(k) + "\": {\n";
+          t3._contents += t6;
+          this._printMap$2(v, t5);
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t6 = t3._contents += t6;
+          t3._contents = t6 + "}\n";
+        } else if (!!t6.$isList) {
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t6;
+          t6 = "\"" + H.S(k) + "\": [\n";
+          t3._contents += t6;
+          this._printList$2(v, t5);
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t6 = t3._contents += t6;
+          t3._contents = t6 + "]\n";
+        } else {
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t6;
+          t6 = "\"" + H.S(k) + "\": " + H.S(v);
+          t6 = t3._contents += t6;
+          t3._contents = t6 + "\n";
+        }
+      }
+      t1.remove$1(0, map);
+    },
+    _printList$2: function(list, depth) {
+      var t1, t2, t3, t4, v, t5;
+      t1 = this._seen;
+      if (t1.contains$1(0, list))
+        return;
+      t1.add$1(0, list);
+      for (t2 = J.get$iterator$ax(list), t3 = this._json_view_element$_buffer, t4 = depth + 1; t2.moveNext$0();) {
+        v = t2.get$current();
+        t5 = J.getInterceptor(v);
+        if (!!t5.$isMap) {
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "{\n";
+          this._printMap$2(v, t4);
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "}\n";
+        } else if (!!t5.$isList) {
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "[\n";
+          this._printList$2(v, t4);
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "]\n";
+        } else {
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t5;
+          t5 = t3._contents += typeof v === "string" ? v : H.S(v);
+          t3._contents = t5 + "\n";
+        }
+      }
+      t1.remove$1(0, list);
+    }
+  },
+  JsonViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier32;_json_view_element$__$map,_json_view_element$__$mapAsString,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$map: function(receiver) {
+      return receiver._json_view_element$__$map;
+    },
+    map$1: function($receiver, arg0) {
+      return this.get$map($receiver).call$1(arg0);
+    },
+    set$map: function(receiver, value) {
+      receiver._json_view_element$__$map = this.notifyPropertyChange$3(receiver, C.Symbol_map, receiver._json_view_element$__$map, value);
+    },
+    get$mapAsString: function(receiver) {
+      return receiver._json_view_element$__$mapAsString;
+    },
+    set$mapAsString: function(receiver, value) {
+      receiver._json_view_element$__$mapAsString = this.notifyPropertyChange$3(receiver, C.Symbol_mapAsString, receiver._json_view_element$__$mapAsString, value);
+    },
+    mapChanged$1: [function(receiver, oldValue) {
+      var t1, t2, t3;
+      t1 = P.StringBuffer$("");
+      t2 = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+      t3 = receiver._json_view_element$__$map;
+      t1._contents = "";
+      t1.write$1("{\n");
+      new Z.JsonPrettyPrinter(t1, t2)._printMap$2(t3, 0);
+      t1.write$1("}\n");
+      t1 = t1._contents;
+      receiver._json_view_element$__$mapAsString = this.notifyPropertyChange$3(receiver, C.Symbol_mapAsString, receiver._json_view_element$__$mapAsString, t1);
+    }, "call$1", "get$mapChanged", 2, 0, 20, 57],
+    static: {JsonViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.JsonViewElement_methods.Element$created$0(receiver);
+        C.JsonViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier32: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["library_ref_element", "package:observatory/src/elements/library_ref.dart", , R, {
+  "^": "",
+  LibraryRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {LibraryRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.LibraryRefElement_methods.Element$created$0(receiver);
+        C.LibraryRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["library_view_element", "package:observatory/src/elements/library_view.dart", , M, {
+  "^": "",
+  LibraryViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier33;_library_view_element$__$library,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$library: function(receiver) {
+      return receiver._library_view_element$__$library;
+    },
+    set$library: function(receiver, value) {
+      receiver._library_view_element$__$library = this.notifyPropertyChange$3(receiver, C.Symbol_library, receiver._library_view_element$__$library, value);
+    },
+    eval$1: [function(receiver, text) {
+      return J.get$isolate$x(receiver._library_view_element$__$library).get$1(J.$add$ns(J.get$id$x(receiver._library_view_element$__$library), "/eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false)));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._library_view_element$__$library).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {LibraryViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.LibraryViewElement_methods.Element$created$0(receiver);
+        C.LibraryViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier33: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["logging", "package:logging/logging.dart", , N, {
+  "^": "",
+  Logger: {
+    "^": "Object;name>,parent>,_level,_children>,children>,_controller",
+    get$fullName: function() {
+      var t1, t2, t3;
+      t1 = this.parent;
+      t2 = t1 == null || J.$eq(J.get$name$x(t1), "");
+      t3 = this.name;
+      return t2 ? t3 : t1.get$fullName() + "." + t3;
+    },
+    get$level: function() {
+      if ($.hierarchicalLoggingEnabled) {
+        var t1 = this._level;
+        if (t1 != null)
+          return t1;
+        t1 = this.parent;
+        if (t1 != null)
+          return t1.get$level();
+      }
+      return $._rootLevel;
+    },
+    set$level: function(value) {
+      if ($.hierarchicalLoggingEnabled && this.parent != null)
+        this._level = value;
+      else {
+        if (this.parent != null)
+          throw H.wrapException(P.UnsupportedError$("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."));
+        $._rootLevel = value;
+      }
+    },
+    get$onRecord: function() {
+      return this._getStream$0();
+    },
+    isLoggable$1: function(value) {
+      return value.value >= this.get$level().value;
+    },
+    log$4: function(logLevel, message, error, stackTrace) {
+      var t1, t2, t3, record, target;
+      if (logLevel.value >= this.get$level().value) {
+        t1 = this.get$fullName();
+        t2 = new P.DateTime(Date.now(), false);
+        t2.DateTime$_now$0();
+        t3 = $.LogRecord__nextNumber;
+        $.LogRecord__nextNumber = t3 + 1;
+        record = new N.LogRecord(logLevel, message, t1, t2, t3, error, stackTrace);
+        if ($.hierarchicalLoggingEnabled)
+          for (target = this; target != null;) {
+            target._publish$1(record);
+            target = J.get$parent$x(target);
+          }
+        else
+          N.Logger_Logger("")._publish$1(record);
+      }
+    },
+    finer$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_FINER_400, message, error, stackTrace);
+    },
+    finer$1: function(message) {
+      return this.finer$3(message, null, null);
+    },
+    fine$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_FINE_500, message, error, stackTrace);
+    },
+    fine$1: function(message) {
+      return this.fine$3(message, null, null);
+    },
+    info$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_INFO_800, message, error, stackTrace);
+    },
+    info$1: function(message) {
+      return this.info$3(message, null, null);
+    },
+    warning$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_WARNING_900, message, error, stackTrace);
+    },
+    warning$1: function(message) {
+      return this.warning$3(message, null, null);
+    },
+    severe$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_SEVERE_1000, message, error, stackTrace);
+    },
+    severe$1: function(message) {
+      return this.severe$3(message, null, null);
+    },
+    _getStream$0: function() {
+      if ($.hierarchicalLoggingEnabled || this.parent == null) {
+        var t1 = this._controller;
+        if (t1 == null) {
+          t1 = P.StreamController_StreamController$broadcast(null, null, true, N.LogRecord);
+          this._controller = t1;
+        }
+        t1.toString;
+        return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+      } else
+        return N.Logger_Logger("")._getStream$0();
+    },
+    _publish$1: function(record) {
+      var t1 = this._controller;
+      if (t1 != null) {
+        if (t1._state >= 4)
+          H.throwExpression(t1._addEventError$0());
+        t1._sendData$1(record);
+      }
+    },
+    Logger$_internal$3: function($name, $parent, children) {
+      var t1 = this.parent;
+      if (t1 != null)
+        J.get$_children$x(t1).$indexSet(0, this.name, this);
+    },
+    $isLogger: true,
+    static: {"^": "Logger__loggers", Logger_Logger: function($name) {
+        return $.get$Logger__loggers().putIfAbsent$2($name, new N.Logger_Logger_closure($name));
+      }}
+  },
+  Logger_Logger_closure: {
+    "^": "Closure:69;name_0",
+    call$0: function() {
+      var thisName, dot, $parent, t1, t2;
+      thisName = this.name_0;
+      if (C.JSString_methods.startsWith$1(thisName, "."))
+        H.throwExpression(P.ArgumentError$("name shouldn't start with a '.'"));
+      dot = C.JSString_methods.lastIndexOf$1(thisName, ".");
+      if (dot === -1)
+        $parent = thisName !== "" ? N.Logger_Logger("") : null;
+      else {
+        $parent = N.Logger_Logger(C.JSString_methods.substring$2(thisName, 0, dot));
+        thisName = C.JSString_methods.substring$1(thisName, dot + 1);
+      }
+      t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, N.Logger);
+      t2 = new N.Logger(thisName, $parent, null, t1, H.setRuntimeTypeInfo(new Q.UnmodifiableMapView(t1), [null, null]), null);
+      t2.Logger$_internal$3(thisName, $parent, t1);
+      return t2;
+    },
+    $isFunction: true
+  },
+  Level: {
+    "^": "Object;name>,value>",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isLevel && this.value === other.value;
+    },
+    $lt: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value < t1;
+    },
+    $le: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value <= t1;
+    },
+    $gt: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value > t1;
+    },
+    $ge: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value >= t1;
+    },
+    compareTo$1: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value - t1;
+    },
+    get$hashCode: function(_) {
+      return this.value;
+    },
+    toString$0: function(_) {
+      return this.name;
+    },
+    $isLevel: true,
+    static: {"^": "Level_ALL,Level_OFF,Level_FINEST,Level_FINER,Level_FINE,Level_CONFIG,Level_INFO,Level_WARNING,Level_SEVERE,Level_SHOUT,Level_LEVELS"}
+  },
+  LogRecord: {
+    "^": "Object;level<,message>,loggerName,time<,sequenceNumber,error>,stackTrace<",
+    toString$0: function(_) {
+      return "[" + this.level.name + "] " + this.loggerName + ": " + this.message;
+    },
+    $isLogRecord: true,
+    static: {"^": "LogRecord__nextNumber"}
+  }
+}],
+["", "main.dart", , F, {
+  "^": "",
+  main: function() {
+    var t1, t2;
+    N.Logger_Logger("").set$level(C.Level_INFO_800);
+    N.Logger_Logger("").get$onRecord().listen$1(new F.main_closure414());
+    N.Logger_Logger("").info$1("Starting Observatory");
+    N.Logger_Logger("").info$1("Loading Google Charts API");
+    t1 = J.$index$asx($.get$context(), "google");
+    t2 = $.get$GoogleChart__completer();
+    t1.callMethod$2("load", ["visualization", "1", P.JsObject_JsObject$jsify(P.LinkedHashMap_LinkedHashMap$_literal(["packages", ["corechart", "table"], "callback", P.JsFunction_JsFunction$withThis(t2.get$complete(t2))], null, null))]);
+    $.get$GoogleChart__completer().future.then$1(G.GoogleChart__initOnceOnComplete$closure()).then$1(new F.main_closure415());
+  },
+  main_closure414: {
+    "^": "Closure:149;",
+    call$1: [function(rec) {
+      var t1;
+      if (J.$eq(rec.get$level(), C.Level_WARNING_900)) {
+        t1 = J.getInterceptor$x(rec);
+        if (J.startsWith$1$s(t1.get$message(rec), "Error evaluating expression"))
+          t1 = J.contains$1$asx(t1.get$message(rec), "Can't assign to null: ") === true || J.contains$1$asx(t1.get$message(rec), "Expression is not assignable: ") === true;
+        else
+          t1 = false;
+      } else
+        t1 = false;
+      if (t1)
+        return;
+      P.print(rec.get$level().name + ": " + rec.get$time().toString$0(0) + ": " + H.S(J.get$message$x(rec)));
+    }, "call$1", null, 2, 0, null, 148, "call"],
+    $isFunction: true
+  },
+  main_closure415: {
+    "^": "Closure:13;",
+    call$1: [function(_) {
+      N.Logger_Logger("").info$1("Initializing Polymer");
+      A.initPolymer();
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  }
+}],
+["nav_bar_element", "package:observatory/src/elements/nav_bar.dart", , A, {
+  "^": "",
+  NavBarElement: {
+    "^": "ObservatoryElement_ChangeNotifier34;_nav_bar_element$__$pad,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$pad: function(receiver) {
+      return receiver._nav_bar_element$__$pad;
+    },
+    set$pad: function(receiver, value) {
+      receiver._nav_bar_element$__$pad = this.notifyPropertyChange$3(receiver, C.Symbol_pad, receiver._nav_bar_element$__$pad, value);
+    },
+    static: {NavBarElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$pad = true;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavBarElement_methods.Element$created$0(receiver);
+        C.NavBarElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier34: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier35;_nav_bar_element$__$link,_nav_bar_element$__$anchor,_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$link: function(receiver) {
+      return receiver._nav_bar_element$__$link;
+    },
+    set$link: function(receiver, value) {
+      receiver._nav_bar_element$__$link = this.notifyPropertyChange$3(receiver, C.Symbol_link, receiver._nav_bar_element$__$link, value);
+    },
+    get$anchor: function(receiver) {
+      return receiver._nav_bar_element$__$anchor;
+    },
+    set$anchor: function(receiver, value) {
+      receiver._nav_bar_element$__$anchor = this.notifyPropertyChange$3(receiver, C.Symbol_anchor, receiver._nav_bar_element$__$anchor, value);
+    },
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {NavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$link = "#";
+        receiver._nav_bar_element$__$anchor = "---";
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavMenuElement_methods.Element$created$0(receiver);
+        C.NavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier35: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavMenuItemElement: {
+    "^": "ObservatoryElement_ChangeNotifier36;_nav_bar_element$__$link,_nav_bar_element$__$anchor,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$link: function(receiver) {
+      return receiver._nav_bar_element$__$link;
+    },
+    set$link: function(receiver, value) {
+      receiver._nav_bar_element$__$link = this.notifyPropertyChange$3(receiver, C.Symbol_link, receiver._nav_bar_element$__$link, value);
+    },
+    get$anchor: function(receiver) {
+      return receiver._nav_bar_element$__$anchor;
+    },
+    set$anchor: function(receiver, value) {
+      receiver._nav_bar_element$__$anchor = this.notifyPropertyChange$3(receiver, C.Symbol_anchor, receiver._nav_bar_element$__$anchor, value);
+    },
+    static: {NavMenuItemElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$link = "#";
+        receiver._nav_bar_element$__$anchor = "---";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavMenuItemElement_methods.Element$created$0(receiver);
+        C.NavMenuItemElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier36: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavRefreshElement: {
+    "^": "ObservatoryElement_ChangeNotifier37;_nav_bar_element$__$callback,_nav_bar_element$__$active,_nav_bar_element$__$label,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$callback: function(receiver) {
+      return receiver._nav_bar_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._nav_bar_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._nav_bar_element$__$callback, value);
+    },
+    get$active: function(receiver) {
+      return receiver._nav_bar_element$__$active;
+    },
+    set$active: function(receiver, value) {
+      receiver._nav_bar_element$__$active = this.notifyPropertyChange$3(receiver, C.Symbol_active, receiver._nav_bar_element$__$active, value);
+    },
+    get$label: function(receiver) {
+      return receiver._nav_bar_element$__$label;
+    },
+    set$label: function(receiver, value) {
+      receiver._nav_bar_element$__$label = this.notifyPropertyChange$3(receiver, C.Symbol_label, receiver._nav_bar_element$__$label, value);
+    },
+    buttonClick$3: [function(receiver, e, detail, target) {
+      var t1 = receiver._nav_bar_element$__$active;
+      if (t1 === true)
+        return;
+      receiver._nav_bar_element$__$active = this.notifyPropertyChange$3(receiver, C.Symbol_active, t1, true);
+      if (receiver._nav_bar_element$__$callback != null)
+        this.callback$1(receiver, this.get$refreshDone(receiver));
+    }, "call$3", "get$buttonClick", 6, 0, 102, 1, 93, 94],
+    refreshDone$0: [function(receiver) {
+      receiver._nav_bar_element$__$active = this.notifyPropertyChange$3(receiver, C.Symbol_active, receiver._nav_bar_element$__$active, false);
+    }, "call$0", "get$refreshDone", 0, 0, 18],
+    static: {NavRefreshElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$active = false;
+        receiver._nav_bar_element$__$label = "Refresh";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavRefreshElement_methods.Element$created$0(receiver);
+        C.NavRefreshElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier37: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavControlElement: {
+    "^": "ObservatoryElement;change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {NavControlElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavControlElement_methods.Element$created$0(receiver);
+        C.NavControlElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  TopNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier38;_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {TopNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.TopNavMenuElement_methods.Element$created$0(receiver);
+        C.TopNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier38: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier39;_nav_bar_element$__$last,_nav_bar_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    get$isolate: function(receiver) {
+      return receiver._nav_bar_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._nav_bar_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._nav_bar_element$__$isolate, value);
+    },
+    isolateChanged$1: [function(receiver, oldValue) {
+      this.notifyPropertyChange$3(receiver, C.Symbol_hashLinkWorkaround, 0, 1);
+    }, "call$1", "get$isolateChanged", 2, 0, 20, 57],
+    get$hashLinkWorkaround: function(receiver) {
+      var t1 = receiver._nav_bar_element$__$isolate;
+      if (t1 != null)
+        return J.get$link$x(t1);
+      else
+        return "";
+    },
+    set$hashLinkWorkaround: function(receiver, x) {
+    },
+    static: {IsolateNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateNavMenuElement_methods.Element$created$0(receiver);
+        C.IsolateNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier39: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  LibraryNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier40;_nav_bar_element$__$library,_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$library: function(receiver) {
+      return receiver._nav_bar_element$__$library;
+    },
+    set$library: function(receiver, value) {
+      receiver._nav_bar_element$__$library = this.notifyPropertyChange$3(receiver, C.Symbol_library, receiver._nav_bar_element$__$library, value);
+    },
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {LibraryNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.LibraryNavMenuElement_methods.Element$created$0(receiver);
+        C.LibraryNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier40: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ClassNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier41;_nav_bar_element$__$cls,_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$cls: function(receiver) {
+      return receiver._nav_bar_element$__$cls;
+    },
+    set$cls: function(receiver, value) {
+      receiver._nav_bar_element$__$cls = this.notifyPropertyChange$3(receiver, C.Symbol_cls, receiver._nav_bar_element$__$cls, value);
+    },
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {ClassNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassNavMenuElement_methods.Element$created$0(receiver);
+        C.ClassNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier41: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["observatory_application_element", "package:observatory/src/elements/observatory_application.dart", , V, {
+  "^": "",
+  ObservatoryApplicationElement: {
+    "^": "ObservatoryElement_ChangeNotifier42;_observatory_application_element$__$devtools,app,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$devtools: function(receiver) {
+      return receiver._observatory_application_element$__$devtools;
+    },
+    set$devtools: function(receiver, value) {
+      receiver._observatory_application_element$__$devtools = this.notifyPropertyChange$3(receiver, C.Symbol_devtools, receiver._observatory_application_element$__$devtools, value);
+    },
+    attached$0: function(receiver) {
+      var t1, t2;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      if (receiver._observatory_application_element$__$devtools === true) {
+        t1 = H.setRuntimeTypeInfo([], [G.Pane]);
+        t2 = new U.DartiumVM(P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Completer), 0, "unknown", "unknown", 0, false, false, "", null, P.StreamController_StreamController$broadcast(null, null, false, null), P.StreamController_StreamController$broadcast(null, null, false, null), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.ServiceObject), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.Isolate), null, null, null, null, null, false, null, null, null, null, null);
+        t2.VM$0();
+        t2.DartiumVM$0();
+        t2 = new G.ObservatoryApplication(t1, null, null, new G.HashLocationManager("/vm", null, null, null, null, null), t2, null, receiver, null, null, null);
+        t2.ObservatoryApplication$devtools$1(receiver);
+        receiver.app = t2;
+      } else {
+        t1 = H.setRuntimeTypeInfo([], [G.Pane]);
+        t2 = new U.HttpVM(null, "unknown", "unknown", 0, false, false, "", null, P.StreamController_StreamController$broadcast(null, null, false, null), P.StreamController_StreamController$broadcast(null, null, false, null), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.ServiceObject), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.Isolate), null, null, null, null, null, false, null, null, null, null, null);
+        t2.VM$0();
+        t2.HttpVM$0();
+        t2 = new G.ObservatoryApplication(t1, null, null, new G.HashLocationManager("/vm", null, null, null, null, null), t2, null, receiver, null, null, null);
+        t2.ObservatoryApplication$1(receiver);
+        receiver.app = t2;
+      }
+    },
+    static: {ObservatoryApplicationElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._observatory_application_element$__$devtools = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ObservatoryApplicationElement_methods.Element$created$0(receiver);
+        C.ObservatoryApplicationElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier42: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["observatory_element", "package:observatory/src/elements/observatory_element.dart", , Z, {
+  "^": "",
+  ObservatoryElement: {
+    "^": "PolymerElement;change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    attached$0: function(receiver) {
+      A.Polymer.prototype.attached$0.call(this, receiver);
+    },
+    attributeChanged$3: function(receiver, $name, oldValue, newValue) {
+      A.Polymer.prototype.attributeChanged$3.call(this, receiver, $name, oldValue, newValue);
+    },
+    detached$0: function(receiver) {
+      A.Polymer.prototype.detached$0.call(this, receiver);
+    },
+    ready$0: function(receiver) {
+      A.Polymer.prototype.ready$0.call(this, receiver);
+    },
+    goto$3: [function(receiver, $event, detail, target) {
+      $.location.onGoto$3($event, detail, target);
+    }, "call$3", "get$$goto", 6, 0, 150, 2, 93, 94],
+    gotoLink$1: [function(receiver, url) {
+      $.location.toString;
+      return "#" + H.S(url);
+    }, "call$1", "get$gotoLink", 2, 0, 151, 152],
+    formatTime$1: [function(receiver, time) {
+      return G.Utils_formatTime(time);
+    }, "call$1", "get$formatTime", 2, 0, 153, 154],
+    formatSize$1: [function(receiver, bytes) {
+      return G.Utils_formatSize(bytes);
+    }, "call$1", "get$formatSize", 2, 0, 15, 16],
+    isNull$1: [function(receiver, type) {
+      return J.$eq(type, "Null");
+    }, "call$1", "get$isNull", 2, 0, 155, 156],
+    isError$1: [function(receiver, type) {
+      return J.$eq(type, "Error");
+    }, "call$1", "get$isError", 2, 0, 155, 156],
+    isInt$1: [function(receiver, type) {
+      var t1 = J.getInterceptor(type);
+      return t1.$eq(type, "Smi") || t1.$eq(type, "Mint") || t1.$eq(type, "Bigint");
+    }, "call$1", "get$isInt", 2, 0, 155, 156],
+    isBool$1: [function(receiver, type) {
+      return J.$eq(type, "Bool");
+    }, "call$1", "get$isBool", 2, 0, 155, 156],
+    isString$1: [function(receiver, type) {
+      return J.$eq(type, "String");
+    }, "call$1", "get$isString", 2, 0, 155, 156],
+    isInstance$1: [function(receiver, type) {
+      return J.$eq(type, "Instance");
+    }, "call$1", "get$isInstance", 2, 0, 155, 156],
+    isDouble$1: [function(receiver, type) {
+      return J.$eq(type, "Double");
+    }, "call$1", "get$isDouble", 2, 0, 155, 156],
+    isList$1: [function(receiver, type) {
+      var t1 = J.getInterceptor(type);
+      return t1.$eq(type, "GrowableObjectArray") || t1.$eq(type, "Array");
+    }, "call$1", "get$isList", 2, 0, 155, 156],
+    isType$1: [function(receiver, type) {
+      return J.$eq(type, "Type");
+    }, "call$1", "get$isType", 2, 0, 155, 156],
+    isUnexpected$1: [function(receiver, type) {
+      return !C.JSArray_methods.contains$1(["Null", "Smi", "Mint", "Bigint", "Bool", "String", "Double", "Instance", "GrowableObjectArray", "Array", "Type", "Error"], type);
+    }, "call$1", "get$isUnexpected", 2, 0, 155, 156],
+    static: {ObservatoryElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ObservatoryElement_methods.Element$created$0(receiver);
+        C.ObservatoryElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["observe.src.bindable", "package:observe/src/bindable.dart", , A, {
+  "^": "",
+  Bindable: {
+    "^": "Object;",
+    set$value: function(_, newValue) {
+    },
+    $isBindable: true
+  }
+}],
+["observe.src.change_notifier", "package:observe/src/change_notifier.dart", , O, {
+  "^": "",
+  ChangeNotifier: {
+    "^": "Object;",
+    get$changes: function(receiver) {
+      var t1 = receiver.change_notifier$ChangeNotifier$_changes;
+      if (t1 == null) {
+        t1 = this.get$observed(receiver);
+        t1 = P.StreamController_StreamController$broadcast(this.get$unobserved(receiver), t1, true, null);
+        receiver.change_notifier$ChangeNotifier$_changes = t1;
+      }
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    observed$0: [function(receiver) {
+    }, "call$0", "get$observed", 0, 0, 18],
+    unobserved$0: [function(receiver) {
+      receiver.change_notifier$ChangeNotifier$_changes = null;
+    }, "call$0", "get$unobserved", 0, 0, 18],
+    deliverChanges$0: [function(receiver) {
+      var records, t1, t2;
+      records = receiver.change_notifier$ChangeNotifier$_change_notifier$_records;
+      receiver.change_notifier$ChangeNotifier$_change_notifier$_records = null;
+      if (this.get$hasObservers(receiver) && records != null) {
+        t1 = receiver.change_notifier$ChangeNotifier$_changes;
+        t2 = H.setRuntimeTypeInfo(new P.UnmodifiableListView(records), [T.ChangeRecord]);
+        if (t1._state >= 4)
+          H.throwExpression(t1._addEventError$0());
+        t1._sendData$1(t2);
+        return true;
+      }
+      return false;
+    }, "call$0", "get$deliverChanges", 0, 0, 111],
+    get$hasObservers: function(receiver) {
+      var t1, t2;
+      t1 = receiver.change_notifier$ChangeNotifier$_changes;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    notifyPropertyChange$3: function(receiver, field, oldValue, newValue) {
+      return F.notifyPropertyChangeHelper(receiver, field, oldValue, newValue);
+    },
+    notifyChange$1: function(receiver, record) {
+      if (!this.get$hasObservers(receiver))
+        return;
+      if (receiver.change_notifier$ChangeNotifier$_change_notifier$_records == null) {
+        receiver.change_notifier$ChangeNotifier$_change_notifier$_records = [];
+        P.scheduleMicrotask(this.get$deliverChanges(receiver));
+      }
+      receiver.change_notifier$ChangeNotifier$_change_notifier$_records.push(record);
+    },
+    $isObservable: true
+  }
+}],
+["observe.src.change_record", "package:observe/src/change_record.dart", , T, {
+  "^": "",
+  ChangeRecord: {
+    "^": "Object;",
+    $isChangeRecord: true
+  },
+  PropertyChangeRecord: {
+    "^": "ChangeRecord;object>,name>,oldValue,newValue",
+    toString$0: function(_) {
+      return "#<PropertyChangeRecord " + H.S(this.name) + " from: " + H.S(this.oldValue) + " to: " + H.S(this.newValue) + ">";
+    },
+    $isPropertyChangeRecord: true
+  }
+}],
+["observe.src.dirty_check", "package:observe/src/dirty_check.dart", , O, {
+  "^": "",
+  dirtyCheckObservables: function() {
+    var cycles, debugLoop, toCheck, t1, anyChanged, i, observer, t2, info, t3;
+    if ($._delivering)
+      return;
+    if ($._allObservables == null)
+      return;
+    $._delivering = true;
+    cycles = 0;
+    debugLoop = null;
+    do {
+      ++cycles;
+      if (cycles === 1000)
+        debugLoop = [];
+      toCheck = $._allObservables;
+      t1 = [];
+      t1.$builtinTypeInfo = [F.Observable];
+      $._allObservables = t1;
+      for (t1 = debugLoop != null, anyChanged = false, i = 0; i < toCheck.length; ++i) {
+        observer = toCheck[i];
+        t2 = J.getInterceptor$x(observer);
+        if (t2.get$hasObservers(observer)) {
+          if (t2.deliverChanges$0(observer)) {
+            if (t1)
+              debugLoop.push([i, observer]);
+            anyChanged = true;
+          }
+          $._allObservables.push(observer);
+        }
+      }
+    } while (cycles < 1000 && anyChanged);
+    if (t1 && anyChanged) {
+      t1 = $.get$_logger();
+      t1.warning$1("Possible loop in Observable.dirtyCheck, stopped checking.");
+      for (t2 = H.setRuntimeTypeInfo(new H.ListIterator(debugLoop, debugLoop.length, 0, null), [H.getTypeArgumentByIndex(debugLoop, 0)]); t2.moveNext$0();) {
+        info = t2._current;
+        t3 = J.getInterceptor$asx(info);
+        t1.warning$1("In last iteration Observable changed at index " + H.S(t3.$index(info, 0)) + ", object: " + H.S(t3.$index(info, 1)) + ".");
+      }
+    }
+    $._allObservablesCount = $._allObservables.length;
+    $._delivering = false;
+  },
+  dirtyCheckZoneSpec: function() {
+    var t1 = {};
+    t1.pending_0 = false;
+    t1 = new O.dirtyCheckZoneSpec_enqueueDirtyCheck(t1);
+    return new P._ZoneSpecification(null, null, null, null, new O.dirtyCheckZoneSpec_wrapCallback(t1), new O.dirtyCheckZoneSpec_wrapUnaryCallback(t1), null, null, null, null, null, null);
+  },
+  dirtyCheckZoneSpec_enqueueDirtyCheck: {
+    "^": "Closure:157;box_0",
+    call$2: function($parent, zone) {
+      var t1 = this.box_0;
+      if (t1.pending_0)
+        return;
+      t1.pending_0 = true;
+      $parent.scheduleMicrotask$2(zone, new O.dirtyCheckZoneSpec_enqueueDirtyCheck_closure(t1));
+    },
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_enqueueDirtyCheck_closure: {
+    "^": "Closure:69;box_0",
+    call$0: [function() {
+      this.box_0.pending_0 = false;
+      O.dirtyCheckObservables();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapCallback: {
+    "^": "Closure:30;enqueueDirtyCheck_1",
+    call$4: [function($self, $parent, zone, f) {
+      if (f == null)
+        return f;
+      return new O.dirtyCheckZoneSpec_wrapCallback_closure(this.enqueueDirtyCheck_1, $parent, zone, f);
+    }, "call$4", null, 8, 0, null, 27, 28, 29, 31, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapCallback_closure: {
+    "^": "Closure:69;enqueueDirtyCheck_2,parent_3,zone_4,f_5",
+    call$0: [function() {
+      this.enqueueDirtyCheck_2.call$2(this.parent_3, this.zone_4);
+      return this.f_5.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapUnaryCallback: {
+    "^": "Closure:158;enqueueDirtyCheck_6",
+    call$4: [function($self, $parent, zone, f) {
+      if (f == null)
+        return f;
+      return new O.dirtyCheckZoneSpec_wrapUnaryCallback_closure(this.enqueueDirtyCheck_6, $parent, zone, f);
+    }, "call$4", null, 8, 0, null, 27, 28, 29, 31, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapUnaryCallback_closure: {
+    "^": "Closure:13;enqueueDirtyCheck_7,parent_8,zone_9,f_10",
+    call$1: [function(x) {
+      this.enqueueDirtyCheck_7.call$2(this.parent_8, this.zone_9);
+      return this.f_10.call$1(x);
+    }, "call$1", null, 2, 0, null, 65, "call"],
+    $isFunction: true
+  }
+}],
+["observe.src.list_diff", "package:observe/src/list_diff.dart", , G, {
+  "^": "",
+  _calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
+    var rowCount, columnCount, distances, t1, i, t2, j, t3, t4, t5, t6, t7, t8, t9;
+    rowCount = oldEnd - oldStart + 1;
+    columnCount = J.$add$ns(J.$sub$n(currentEnd, currentStart), 1);
+    distances = Array(rowCount);
+    for (t1 = distances.length, i = 0; i < rowCount; ++i) {
+      if (typeof columnCount !== "number")
+        return H.iae(columnCount);
+      t2 = Array(columnCount);
+      if (i >= t1)
+        return H.ioore(distances, i);
+      distances[i] = t2;
+      if (0 >= t2.length)
+        return H.ioore(t2, 0);
+      t2[0] = i;
+    }
+    if (typeof columnCount !== "number")
+      return H.iae(columnCount);
+    j = 0;
+    for (; j < columnCount; ++j) {
+      if (0 >= t1)
+        return H.ioore(distances, 0);
+      t2 = distances[0];
+      if (j >= t2.length)
+        return H.ioore(t2, j);
+      t2[j] = j;
+    }
+    for (t2 = J.getInterceptor$ns(currentStart), t3 = J.getInterceptor$asx(current), i = 1; i < rowCount; ++i)
+      for (t4 = i - 1, t5 = oldStart + i - 1, j = 1; j < columnCount; ++j) {
+        if (t5 >>> 0 !== t5 || t5 >= old.length)
+          return H.ioore(old, t5);
+        t6 = J.$eq(old[t5], t3.$index(current, J.$sub$n(t2.$add(currentStart, j), 1)));
+        t7 = distances[i];
+        t8 = distances[t4];
+        t9 = j - 1;
+        if (t6) {
+          if (i >= t1)
+            return H.ioore(distances, i);
+          if (t4 >= t1)
+            return H.ioore(distances, t4);
+          if (t9 >= t8.length)
+            return H.ioore(t8, t9);
+          t6 = t8[t9];
+          if (j >= t7.length)
+            return H.ioore(t7, j);
+          t7[j] = t6;
+        } else {
+          if (t4 >= t1)
+            return H.ioore(distances, t4);
+          if (j >= t8.length)
+            return H.ioore(t8, j);
+          t6 = t8[j];
+          if (typeof t6 !== "number")
+            return t6.$add();
+          if (i >= t1)
+            return H.ioore(distances, i);
+          t8 = t7.length;
+          if (t9 >= t8)
+            return H.ioore(t7, t9);
+          t9 = t7[t9];
+          if (typeof t9 !== "number")
+            return t9.$add();
+          t9 = P.min(t6 + 1, t9 + 1);
+          if (j >= t8)
+            return H.ioore(t7, j);
+          t7[j] = t9;
+        }
+      }
+    return distances;
+  },
+  _spliceOperationsFromEditDistances: function(distances) {
+    var t1, i, j, t2, current, edits, t3, t4, t5, northWest, west, north, min;
+    t1 = distances.length;
+    i = t1 - 1;
+    if (0 >= t1)
+      return H.ioore(distances, 0);
+    j = distances[0].length - 1;
+    if (i < 0)
+      return H.ioore(distances, i);
+    t2 = distances[i];
+    if (j < 0 || j >= t2.length)
+      return H.ioore(t2, j);
+    current = t2[j];
+    edits = [];
+    while (true) {
+      if (!(i > 0 || j > 0))
+        break;
+      c$0: {
+        if (i === 0) {
+          edits.push(2);
+          --j;
+          break c$0;
+        }
+        if (j === 0) {
+          edits.push(3);
+          --i;
+          break c$0;
+        }
+        t2 = i - 1;
+        if (t2 < 0)
+          return H.ioore(distances, t2);
+        t3 = distances[t2];
+        t4 = j - 1;
+        t5 = t3.length;
+        if (t4 < 0 || t4 >= t5)
+          return H.ioore(t3, t4);
+        northWest = t3[t4];
+        if (j < 0 || j >= t5)
+          return H.ioore(t3, j);
+        west = t3[j];
+        if (i < 0)
+          return H.ioore(distances, i);
+        t3 = distances[i];
+        if (t4 >= t3.length)
+          return H.ioore(t3, t4);
+        north = t3[t4];
+        min = P.min(P.min(west, north), northWest);
+        if (min === northWest) {
+          if (northWest == null ? current == null : northWest === current)
+            edits.push(0);
+          else {
+            edits.push(1);
+            current = northWest;
+          }
+          j = t4;
+          i = t2;
+        } else if (min === west) {
+          edits.push(3);
+          current = west;
+          i = t2;
+        } else {
+          edits.push(2);
+          current = north;
+          j = t4;
+        }
+      }
+    }
+    return H.setRuntimeTypeInfo(new H.ReversedListIterable(edits), [null]).toList$0(0);
+  },
+  _sharedPrefix: function(arr1, arr2, searchLength) {
+    var t1, i, t2;
+    for (t1 = J.getInterceptor$asx(arr1), i = 0; i < searchLength; ++i) {
+      t2 = t1.$index(arr1, i);
+      if (i >= arr2.length)
+        return H.ioore(arr2, i);
+      if (!J.$eq(t2, arr2[i]))
+        return i;
+    }
+    return searchLength;
+  },
+  _sharedSuffix: function(arr1, arr2, searchLength) {
+    var t1, index1, index2, count, t2;
+    t1 = J.getInterceptor$asx(arr1);
+    index1 = t1.get$length(arr1);
+    index2 = arr2.length;
+    count = 0;
+    while (true) {
+      if (count < searchLength) {
+        --index1;
+        t2 = t1.$index(arr1, index1);
+        --index2;
+        if (index2 < 0 || index2 >= arr2.length)
+          return H.ioore(arr2, index2);
+        t2 = J.$eq(t2, arr2[index2]);
+      } else
+        t2 = false;
+      if (!t2)
+        break;
+      ++count;
+    }
+    return count;
+  },
+  calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
+    var t1, minLength, t2, prefixCount, suffixCount, removed, splice, oldStart0, ops, splices, oldIndex, index, i;
+    t1 = J.getInterceptor$n(currentEnd);
+    minLength = P.min(t1.$sub(currentEnd, currentStart), oldEnd - oldStart);
+    t2 = J.getInterceptor(currentStart);
+    prefixCount = t2.$eq(currentStart, 0) && oldStart === 0 ? G._sharedPrefix(current, old, minLength) : 0;
+    suffixCount = t1.$eq(currentEnd, J.get$length$asx(current)) && oldEnd === old.length ? G._sharedSuffix(current, old, minLength - prefixCount) : 0;
+    currentStart = t2.$add(currentStart, prefixCount);
+    oldStart += prefixCount;
+    currentEnd = t1.$sub(currentEnd, suffixCount);
+    oldEnd -= suffixCount;
+    t1 = J.getInterceptor$n(currentEnd);
+    if (J.$eq(t1.$sub(currentEnd, currentStart), 0) && oldEnd - oldStart === 0)
+      return C.List_empty;
+    if (J.$eq(currentStart, currentEnd)) {
+      removed = [];
+      t1 = new P.UnmodifiableListView(removed);
+      t1.$builtinTypeInfo = [null];
+      splice = new G.ListChangeRecord(current, t1, removed, currentStart, 0);
+      for (; oldStart < oldEnd; oldStart = oldStart0) {
+        t1 = splice._removed;
+        oldStart0 = oldStart + 1;
+        if (oldStart >>> 0 !== oldStart || oldStart >= old.length)
+          return H.ioore(old, oldStart);
+        J.add$1$ax(t1, old[oldStart]);
+      }
+      return [splice];
+    } else if (oldStart === oldEnd) {
+      t1 = t1.$sub(currentEnd, currentStart);
+      removed = [];
+      t2 = new P.UnmodifiableListView(removed);
+      t2.$builtinTypeInfo = [null];
+      return [new G.ListChangeRecord(current, t2, removed, currentStart, t1)];
+    }
+    ops = G._spliceOperationsFromEditDistances(G._calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));
+    splices = [];
+    splices.$builtinTypeInfo = [G.ListChangeRecord];
+    for (oldIndex = oldStart, index = currentStart, splice = null, i = 0; i < ops.length; ++i)
+      switch (ops[i]) {
+        case 0:
+          if (splice != null) {
+            splices.push(splice);
+            splice = null;
+          }
+          index = J.$add$ns(index, 1);
+          ++oldIndex;
+          break;
+        case 1:
+          if (splice == null) {
+            removed = [];
+            t1 = new P.UnmodifiableListView(removed);
+            t1.$builtinTypeInfo = [null];
+            splice = new G.ListChangeRecord(current, t1, removed, index, 0);
+          }
+          splice._addedCount = J.$add$ns(splice._addedCount, 1);
+          index = J.$add$ns(index, 1);
+          t1 = splice._removed;
+          if (oldIndex >>> 0 !== oldIndex || oldIndex >= old.length)
+            return H.ioore(old, oldIndex);
+          J.add$1$ax(t1, old[oldIndex]);
+          ++oldIndex;
+          break;
+        case 2:
+          if (splice == null) {
+            removed = [];
+            t1 = new P.UnmodifiableListView(removed);
+            t1.$builtinTypeInfo = [null];
+            splice = new G.ListChangeRecord(current, t1, removed, index, 0);
+          }
+          splice._addedCount = J.$add$ns(splice._addedCount, 1);
+          index = J.$add$ns(index, 1);
+          break;
+        case 3:
+          if (splice == null) {
+            removed = [];
+            t1 = new P.UnmodifiableListView(removed);
+            t1.$builtinTypeInfo = [null];
+            splice = new G.ListChangeRecord(current, t1, removed, index, 0);
+          }
+          t1 = splice._removed;
+          if (oldIndex >>> 0 !== oldIndex || oldIndex >= old.length)
+            return H.ioore(old, oldIndex);
+          J.add$1$ax(t1, old[oldIndex]);
+          ++oldIndex;
+          break;
+      }
+    if (splice != null)
+      splices.push(splice);
+    return splices;
+  },
+  _mergeSplice: function(splices, record) {
+    var t1, t2, t3, addedCount, t4, splice, inserted, insertionOffset, i, current, intersectCount, removed, offset;
+    t1 = J.getInterceptor$x(record);
+    t2 = t1.get$object(record);
+    t1 = t1.get$index(record);
+    t3 = J.toList$0$ax(record.get$_removed());
+    addedCount = record.get$addedCount();
+    if (addedCount == null)
+      addedCount = 0;
+    t4 = new P.UnmodifiableListView(t3);
+    t4.$builtinTypeInfo = [null];
+    splice = new G.ListChangeRecord(t2, t4, t3, t1, addedCount);
+    for (inserted = false, insertionOffset = 0, i = 0; t1 = splices.length, i < t1; ++i) {
+      if (i < 0)
+        return H.ioore(splices, i);
+      current = splices[i];
+      current._list_diff$_index = J.$add$ns(current._list_diff$_index, insertionOffset);
+      if (inserted)
+        continue;
+      t1 = splice._list_diff$_index;
+      t2 = J.$add$ns(t1, splice._unmodifiableRemoved._collection$_source.length);
+      t3 = current._list_diff$_index;
+      intersectCount = P.min(t2, J.$add$ns(t3, current._addedCount)) - P.max(t1, t3);
+      if (intersectCount >= 0) {
+        C.JSArray_methods.removeAt$1(splices, i);
+        --i;
+        t1 = J.$sub$n(current._addedCount, current._unmodifiableRemoved._collection$_source.length);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        insertionOffset -= t1;
+        t1 = J.$add$ns(splice._addedCount, J.$sub$n(current._addedCount, intersectCount));
+        splice._addedCount = t1;
+        t2 = splice._unmodifiableRemoved._collection$_source.length;
+        t3 = current._unmodifiableRemoved._collection$_source.length;
+        if (J.$eq(t1, 0) && t2 + t3 - intersectCount === 0)
+          inserted = true;
+        else {
+          removed = current._removed;
+          if (J.$lt$n(splice._list_diff$_index, current._list_diff$_index)) {
+            t1 = splice._unmodifiableRemoved;
+            t1 = t1.getRange$2(t1, 0, J.$sub$n(current._list_diff$_index, splice._list_diff$_index));
+            removed.toString;
+            if (typeof removed !== "object" || removed === null || !!removed.fixed$length)
+              H.throwExpression(P.UnsupportedError$("insertAll"));
+            H.IterableMixinWorkaround_insertAllList(removed, 0, t1);
+          }
+          if (J.$gt$n(J.$add$ns(splice._list_diff$_index, splice._unmodifiableRemoved._collection$_source.length), J.$add$ns(current._list_diff$_index, current._addedCount))) {
+            t1 = splice._unmodifiableRemoved;
+            J.addAll$1$ax(removed, t1.getRange$2(t1, J.$sub$n(J.$add$ns(current._list_diff$_index, current._addedCount), splice._list_diff$_index), splice._unmodifiableRemoved._collection$_source.length));
+          }
+          splice._removed = removed;
+          splice._unmodifiableRemoved = current._unmodifiableRemoved;
+          if (J.$lt$n(current._list_diff$_index, splice._list_diff$_index))
+            splice._list_diff$_index = current._list_diff$_index;
+          inserted = false;
+        }
+      } else if (J.$lt$n(splice._list_diff$_index, current._list_diff$_index)) {
+        C.JSArray_methods.insert$2(splices, i, splice);
+        ++i;
+        offset = J.$sub$n(splice._addedCount, splice._unmodifiableRemoved._collection$_source.length);
+        current._list_diff$_index = J.$add$ns(current._list_diff$_index, offset);
+        if (typeof offset !== "number")
+          return H.iae(offset);
+        insertionOffset += offset;
+        inserted = true;
+      } else
+        inserted = false;
+    }
+    if (!inserted)
+      splices.push(splice);
+  },
+  _createInitialSplices: function(list, records) {
+    var splices, t1;
+    splices = H.setRuntimeTypeInfo([], [G.ListChangeRecord]);
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(records, records.length, 0, null), [H.getTypeArgumentByIndex(records, 0)]); t1.moveNext$0();)
+      G._mergeSplice(splices, t1._current);
+    return splices;
+  },
+  projectListSplices: function(list, records) {
+    var splices, t1, t2, splice, t3, t4;
+    if (records.length <= 1)
+      return records;
+    splices = [];
+    for (t1 = G._createInitialSplices(list, records), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]), t2 = list._observable_list$_list; t1.moveNext$0();) {
+      splice = t1._current;
+      if (J.$eq(splice.get$addedCount(), 1) && splice.get$removed()._collection$_source.length === 1) {
+        t3 = splice.get$removed()._collection$_source;
+        if (0 >= t3.length)
+          return H.ioore(t3, 0);
+        t3 = t3[0];
+        t4 = J.get$index$x(splice);
+        if (t4 >>> 0 !== t4 || t4 >= t2.length)
+          return H.ioore(t2, t4);
+        if (!J.$eq(t3, t2[t4]))
+          splices.push(splice);
+        continue;
+      }
+      t3 = J.getInterceptor$x(splice);
+      C.JSArray_methods.addAll$1(splices, G.calcSplices(list, t3.get$index(splice), J.$add$ns(t3.get$index(splice), splice.get$addedCount()), splice.get$_removed(), 0, splice.get$removed()._collection$_source.length));
+    }
+    return splices;
+  },
+  ListChangeRecord: {
+    "^": "Object;object>,_unmodifiableRemoved,_removed<,_list_diff$_index,_addedCount",
+    get$index: function(_) {
+      return this._list_diff$_index;
+    },
+    get$removed: function() {
+      return this._unmodifiableRemoved;
+    },
+    get$addedCount: function() {
+      return this._addedCount;
+    },
+    indexChanged$1: function(key) {
+      var t1;
+      if (typeof key === "number" && Math.floor(key) === key) {
+        t1 = this._list_diff$_index;
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = key < t1;
+      } else
+        t1 = true;
+      if (t1)
+        return false;
+      if (!J.$eq(this._addedCount, this._unmodifiableRemoved._collection$_source.length))
+        return true;
+      return J.$lt$n(key, J.$add$ns(this._list_diff$_index, this._addedCount));
+    },
+    toString$0: function(_) {
+      var t1, t2;
+      t1 = "#<ListChangeRecord index: " + H.S(this._list_diff$_index) + ", removed: ";
+      t2 = this._unmodifiableRemoved;
+      return t1 + t2.toString$0(t2) + ", addedCount: " + H.S(this._addedCount) + ">";
+    },
+    $isListChangeRecord: true,
+    static: {ListChangeRecord_ListChangeRecord: function(object, index, addedCount, removed) {
+        var t1;
+        if (removed == null)
+          removed = [];
+        if (addedCount == null)
+          addedCount = 0;
+        t1 = new P.UnmodifiableListView(removed);
+        t1.$builtinTypeInfo = [null];
+        return new G.ListChangeRecord(object, t1, removed, index, addedCount);
+      }}
+  }
+}],
+["observe.src.metadata", "package:observe/src/metadata.dart", , K, {
+  "^": "",
+  ObservableProperty: {
+    "^": "Object;"
+  },
+  Reflectable: {
+    "^": "Object;"
+  }
+}],
+["observe.src.observable", "package:observe/src/observable.dart", , F, {
+  "^": "",
+  Observable_dirtyCheck: [function() {
+    return O.dirtyCheckObservables();
+  }, "call$0", "Observable_dirtyCheck$closure", 0, 0, 18],
+  notifyPropertyChangeHelper: function(obj, field, oldValue, newValue) {
+    var t1 = J.getInterceptor$x(obj);
+    if (t1.get$hasObservers(obj) && !J.$eq(oldValue, newValue))
+      t1.notifyChange$1(obj, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(obj, field, oldValue, newValue), [null]));
+    return newValue;
+  },
+  Observable: {
+    "^": "Object;_observable$_changes:observable$Observable$_observable$_changes%,_values:observable$Observable$_values%,_records:observable$Observable$_records%",
+    get$changes: function(receiver) {
+      var t1;
+      if (this.get$_observable$_changes(receiver) == null) {
+        t1 = this.get$_observable$_observed(receiver);
+        this.set$_observable$_changes(receiver, P.StreamController_StreamController$broadcast(this.get$_unobserved(receiver), t1, true, null));
+      }
+      t1 = this.get$_observable$_changes(receiver);
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$hasObservers: function(receiver) {
+      var t1, t2;
+      if (this.get$_observable$_changes(receiver) != null) {
+        t1 = this.get$_observable$_changes(receiver);
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    _observable$_observed$0: [function(receiver) {
+      var t1, values, $name, getter;
+      t1 = $._allObservables;
+      if (t1 == null) {
+        t1 = H.setRuntimeTypeInfo([], [F.Observable]);
+        $._allObservables = t1;
+      }
+      t1.push(receiver);
+      $._allObservablesCount = $._allObservablesCount + 1;
+      values = P.LinkedHashMap_LinkedHashMap(null, null, null, P.Symbol, P.Object);
+      for (t1 = this.get$runtimeType(receiver), t1 = $.get$typeInspector().query$2(0, t1, new A.QueryOptions(true, false, true, C.Type_HqF, false, false, C.List_GGa, null)), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        $name = J.get$name$x(t1._current);
+        getter = $.get$objectAccessor()._getters.$index(0, $name);
+        if (getter == null)
+          H.throwExpression(O.MissingCodeException$("getter \"" + H.S($name) + "\" in " + this.toString$0(receiver)));
+        values.$indexSet(0, $name, getter.call$1(receiver));
+      }
+      this.set$_values(receiver, values);
+    }, "call$0", "get$_observable$_observed", 0, 0, 18],
+    _unobserved$0: [function(receiver) {
+      if (this.get$_values(receiver) != null)
+        this.set$_values(receiver, null);
+    }, "call$0", "get$_unobserved", 0, 0, 18],
+    deliverChanges$0: function(receiver) {
+      var t1, t2;
+      t1 = {};
+      if (this.get$_values(receiver) == null || !this.get$hasObservers(receiver))
+        return false;
+      t1.records_0 = this.get$_records(receiver);
+      this.set$_records(receiver, null);
+      this.get$_values(receiver).forEach$1(0, new F.Observable_deliverChanges_closure(t1, receiver));
+      if (t1.records_0 == null)
+        return false;
+      t2 = this.get$_observable$_changes(receiver);
+      t1 = H.setRuntimeTypeInfo(new P.UnmodifiableListView(t1.records_0), [T.ChangeRecord]);
+      if (t2._state >= 4)
+        H.throwExpression(t2._addEventError$0());
+      t2._sendData$1(t1);
+      return true;
+    },
+    notifyChange$1: function(receiver, record) {
+      if (!this.get$hasObservers(receiver))
+        return;
+      if (this.get$_records(receiver) == null)
+        this.set$_records(receiver, []);
+      this.get$_records(receiver).push(record);
+    },
+    $isObservable: true
+  },
+  Observable_deliverChanges_closure: {
+    "^": "Closure:75;box_0,this_1",
+    call$2: function($name, oldValue) {
+      var t1, newValue, t2, t3, records;
+      t1 = this.this_1;
+      newValue = $.get$objectAccessor().read$2(t1, $name);
+      if (!J.$eq(oldValue, newValue)) {
+        t2 = this.box_0;
+        t3 = t2.records_0;
+        if (t3 == null) {
+          records = [];
+          t2.records_0 = records;
+          t2 = records;
+        } else
+          t2 = t3;
+        t2.push(H.setRuntimeTypeInfo(new T.PropertyChangeRecord(t1, $name, oldValue, newValue), [null]));
+        J.get$_values$x(t1).$indexSet(0, $name, newValue);
+      }
+    },
+    $isFunction: true
+  }
+}],
+["observe.src.observable_box", "package:observe/src/observable_box.dart", , A, {
+  "^": "",
+  ObservableBox: {
+    "^": "ChangeNotifier;",
+    get$value: function(_) {
+      return this._observable_box$_value;
+    },
+    set$value: function(_, newValue) {
+      this._observable_box$_value = F.notifyPropertyChangeHelper(this, C.Symbol_value, this._observable_box$_value, newValue);
+    },
+    toString$0: function(_) {
+      return "#<" + new H.TypeImpl(H.getRuntimeTypeString(this), null).toString$0(0) + " value: " + H.S(this._observable_box$_value) + ">";
+    }
+  }
+}],
+["observe.src.observable_list", "package:observe/src/observable_list.dart", , Q, {
+  "^": "",
+  ObservableList: {
+    "^": "ListBase_ChangeNotifier;_listRecords@,_listChanges,_observable_list$_list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$listChanges: function() {
+      var t1 = this._listChanges;
+      if (t1 == null) {
+        t1 = P.StreamController_StreamController$broadcast(new Q.ObservableList_listChanges_closure(this), null, true, null);
+        this._listChanges = t1;
+      }
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$length: function(_) {
+      return this._observable_list$_list.length;
+    },
+    set$length: function(_, value) {
+      var t1, len, t2, t3, removed;
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      if (len === value)
+        return;
+      this.notifyPropertyChange$3(this, C.Symbol_length, len, value);
+      t2 = len === 0;
+      t3 = value === 0;
+      this.notifyPropertyChange$3(this, C.Symbol_isEmpty, t2, t3);
+      this.notifyPropertyChange$3(this, C.Symbol_isNotEmpty, !t2, !t3);
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2)
+        if (value < len) {
+          if (value < 0 || value > t1.length)
+            H.throwExpression(P.RangeError$range(value, 0, t1.length));
+          if (len < value || len > t1.length)
+            H.throwExpression(P.RangeError$range(len, value, t1.length));
+          t2 = new H.SubListIterable(t1, value, len);
+          t2.$builtinTypeInfo = [null];
+          if (value < 0)
+            H.throwExpression(P.RangeError$value(value));
+          if (len < 0)
+            H.throwExpression(P.RangeError$value(len));
+          if (value > len)
+            H.throwExpression(P.RangeError$range(value, 0, len));
+          t2 = t2.toList$0(0);
+          t3 = new P.UnmodifiableListView(t2);
+          t3.$builtinTypeInfo = [null];
+          this._recordChange$1(new G.ListChangeRecord(this, t3, t2, value, 0));
+        } else {
+          removed = [];
+          t2 = new P.UnmodifiableListView(removed);
+          t2.$builtinTypeInfo = [null];
+          this._recordChange$1(new G.ListChangeRecord(this, t2, removed, len, value - len));
+        }
+      C.JSArray_methods.set$length(t1, value);
+    },
+    $index: function(_, index) {
+      var t1 = this._observable_list$_list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      var t1, oldValue, t2, t3;
+      t1 = this._observable_list$_list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      oldValue = t1[index];
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2) {
+        t2 = [oldValue];
+        t3 = new P.UnmodifiableListView(t2);
+        t3.$builtinTypeInfo = [null];
+        this._recordChange$1(new G.ListChangeRecord(this, t3, t2, index, 1));
+      }
+      if (index >= t1.length)
+        return H.ioore(t1, index);
+      t1[index] = value;
+    },
+    get$isEmpty: function(_) {
+      return P.ListMixin.prototype.get$isEmpty.call(this, this);
+    },
+    get$isNotEmpty: function(_) {
+      return P.ListMixin.prototype.get$isNotEmpty.call(this, this);
+    },
+    setAll$2: function(_, index, iterable) {
+      var t1, len, t2;
+      t1 = J.getInterceptor(iterable);
+      if (!t1.$isList && true)
+        iterable = t1.toList$0(iterable);
+      len = J.get$length$asx(iterable);
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (t1 && len > 0) {
+        t1 = this._observable_list$_list;
+        H.IterableMixinWorkaround__rangeCheck(t1, index, len);
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, index, len, H.SubListIterable$(t1, index, len, null).toList$0(0)));
+      }
+      H.IterableMixinWorkaround_setAllList(this._observable_list$_list, index, iterable);
+    },
+    add$1: function(_, value) {
+      var t1, len, t2, t3;
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      this._notifyChangeLength$2(len, len + 1);
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, len, 1, null));
+      C.JSArray_methods.add$1(t1, value);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, len, added, t2;
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      C.JSArray_methods.addAll$1(t1, iterable);
+      this._notifyChangeLength$2(len, t1.length);
+      added = t1.length - len;
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (t1 && added > 0)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, len, added, null));
+    },
+    removeRange$2: function(_, start, end) {
+      var t1, t2, rangeLength, t3, len, t4, t5;
+      t1 = start >= 0;
+      if (!t1 || start > this._observable_list$_list.length)
+        H.throwExpression(P.RangeError$range(start, 0, this.get$length(this)));
+      t2 = end >= start;
+      if (!t2 || end > this._observable_list$_list.length)
+        H.throwExpression(P.RangeError$range(end, start, this.get$length(this)));
+      rangeLength = end - start;
+      t3 = this._observable_list$_list;
+      len = t3.length;
+      t4 = len - rangeLength;
+      this.notifyPropertyChange$3(this, C.Symbol_length, len, t4);
+      t5 = len === 0;
+      t4 = t4 === 0;
+      this.notifyPropertyChange$3(this, C.Symbol_isEmpty, t5, t4);
+      this.notifyPropertyChange$3(this, C.Symbol_isNotEmpty, !t5, !t4);
+      t4 = this._listChanges;
+      if (t4 != null) {
+        t5 = t4._async$_next;
+        t4 = t5 == null ? t4 != null : t5 !== t4;
+      } else
+        t4 = false;
+      if (t4 && rangeLength > 0) {
+        if (!t1 || start > t3.length)
+          H.throwExpression(P.RangeError$range(start, 0, t3.length));
+        if (!t2 || end > t3.length)
+          H.throwExpression(P.RangeError$range(end, start, t3.length));
+        t1 = new H.SubListIterable(t3, start, end);
+        t1.$builtinTypeInfo = [null];
+        if (start < 0)
+          H.throwExpression(P.RangeError$value(start));
+        if (end < 0)
+          H.throwExpression(P.RangeError$value(end));
+        if (start > end)
+          H.throwExpression(P.RangeError$range(start, 0, end));
+        t1 = t1.toList$0(0);
+        t2 = new P.UnmodifiableListView(t1);
+        t2.$builtinTypeInfo = [null];
+        this._recordChange$1(new G.ListChangeRecord(this, t2, t1, start, 0));
+      }
+      C.JSArray_methods.removeRange$2(t3, start, end);
+    },
+    insertAll$2: function(_, index, iterable) {
+      var t1, insertionLength, len, t2;
+      if (index < 0 || index > this._observable_list$_list.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = J.getInterceptor(iterable);
+      if (!t1.$isList && true)
+        iterable = t1.toList$0(iterable);
+      insertionLength = J.get$length$asx(iterable);
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      C.JSArray_methods.set$length(t1, len + insertionLength);
+      t2 = t1.length;
+      H.IterableMixinWorkaround_setRangeList(t1, index + insertionLength, t2, this, index);
+      H.IterableMixinWorkaround_setAllList(t1, index, iterable);
+      this._notifyChangeLength$2(len, t1.length);
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (t1 && insertionLength > 0)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, index, insertionLength, null));
+    },
+    insert$2: function(_, index, element) {
+      var t1, t2, t3;
+      if (index > this._observable_list$_list.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = this._observable_list$_list;
+      t2 = t1.length;
+      if (index === t2) {
+        this.add$1(0, element);
+        return;
+      }
+      C.JSArray_methods.set$length(t1, t2 + 1);
+      t2 = t1.length;
+      H.IterableMixinWorkaround_setRangeList(t1, index + 1, t2, this, index);
+      t2 = t1.length;
+      this._notifyChangeLength$2(t2 - 1, t2);
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, index, 1, null));
+      if (index >= t1.length)
+        return H.ioore(t1, index);
+      t1[index] = element;
+    },
+    _recordChange$1: function(record) {
+      var t1, t2;
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (!t1)
+        return;
+      if (this._listRecords == null) {
+        this._listRecords = [];
+        P.scheduleMicrotask(this.get$deliverListChanges());
+      }
+      this._listRecords.push(record);
+    },
+    _notifyChangeLength$2: function(oldValue, newValue) {
+      var t1, t2;
+      this.notifyPropertyChange$3(this, C.Symbol_length, oldValue, newValue);
+      t1 = oldValue === 0;
+      t2 = newValue === 0;
+      this.notifyPropertyChange$3(this, C.Symbol_isEmpty, t1, t2);
+      this.notifyPropertyChange$3(this, C.Symbol_isNotEmpty, !t1, !t2);
+    },
+    deliverListChanges$0: [function() {
+      var t1, records, t2;
+      t1 = this._listRecords;
+      if (t1 == null)
+        return false;
+      records = G.projectListSplices(this, t1);
+      this._listRecords = null;
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t2 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t2 = false;
+      if (t2 && records.length !== 0) {
+        t2 = H.setRuntimeTypeInfo(new P.UnmodifiableListView(records), [G.ListChangeRecord]);
+        if (t1._state >= 4)
+          H.throwExpression(t1._addEventError$0());
+        t1._sendData$1(t2);
+        return true;
+      }
+      return false;
+    }, "call$0", "get$deliverListChanges", 0, 0, 111],
+    $isObservableList: true,
+    static: {ObservableList$: function($length, $E) {
+        var t1 = H.setRuntimeTypeInfo([], [$E]);
+        return H.setRuntimeTypeInfo(new Q.ObservableList(null, null, t1, null, null), [$E]);
+      }, ObservableList_applyChangeRecords: function(previous, current, changeRecords) {
+        var t1, t2, change, t3, addEnd, removeEnd, addedItems, t4, t5, removeLength, insertLength, delta, insertEnd, newEnd, newLength;
+        if (previous === current)
+          throw H.wrapException(P.ArgumentError$("can't use same list for previous and current"));
+        for (t1 = J.get$iterator$ax(changeRecords), t2 = J.getInterceptor$ax(current); t1.moveNext$0();) {
+          change = t1.get$current();
+          t3 = J.getInterceptor$x(change);
+          addEnd = J.$add$ns(t3.get$index(change), change.get$addedCount());
+          removeEnd = J.$add$ns(t3.get$index(change), change.get$removed()._collection$_source.length);
+          addedItems = t2.getRange$2(current, t3.get$index(change), addEnd);
+          t3 = t3.get$index(change);
+          t4 = J.getInterceptor$n(t3);
+          if (t4.$lt(t3, 0) || t4.$gt(t3, previous.length))
+            H.throwExpression(P.RangeError$range(t3, 0, previous.length));
+          t5 = J.getInterceptor$n(removeEnd);
+          if (t5.$lt(removeEnd, t3) || t5.$gt(removeEnd, previous.length))
+            H.throwExpression(P.RangeError$range(removeEnd, t3, previous.length));
+          removeLength = t5.$sub(removeEnd, t3);
+          insertLength = addedItems.get$length(addedItems);
+          t5 = J.getInterceptor$n(removeLength);
+          if (t5.$ge(removeLength, insertLength)) {
+            delta = t5.$sub(removeLength, insertLength);
+            insertEnd = t4.$add(t3, insertLength);
+            t4 = previous.length;
+            if (typeof delta !== "number")
+              return H.iae(delta);
+            newEnd = t4 - delta;
+            H.IterableMixinWorkaround_setRangeList(previous, t3, insertEnd, addedItems, 0);
+            if (delta !== 0) {
+              H.IterableMixinWorkaround_setRangeList(previous, insertEnd, newEnd, previous, removeEnd);
+              C.JSArray_methods.set$length(previous, newEnd);
+            }
+          } else {
+            delta = J.$sub$n(insertLength, removeLength);
+            t5 = previous.length;
+            if (typeof delta !== "number")
+              return H.iae(delta);
+            newLength = t5 + delta;
+            insertEnd = t4.$add(t3, insertLength);
+            C.JSArray_methods.set$length(previous, newLength);
+            H.IterableMixinWorkaround_setRangeList(previous, insertEnd, newLength, previous, removeEnd);
+            H.IterableMixinWorkaround_setRangeList(previous, t3, insertEnd, addedItems, 0);
+          }
+        }
+      }}
+  },
+  ListBase_ChangeNotifier: {
+    "^": "ListBase+ChangeNotifier;",
+    $isObservable: true
+  },
+  ObservableList_listChanges_closure: {
+    "^": "Closure:69;this_0",
+    call$0: function() {
+      this.this_0._listChanges = null;
+    },
+    $isFunction: true
+  }
+}],
+["observe.src.observable_map", "package:observe/src/observable_map.dart", , V, {
+  "^": "",
+  MapChangeRecord: {
+    "^": "ChangeRecord;key>,oldValue,newValue,isInsert,isRemove",
+    toString$0: function(_) {
+      var kind;
+      if (this.isInsert)
+        kind = "insert";
+      else
+        kind = this.isRemove ? "remove" : "set";
+      return "#<MapChangeRecord " + kind + " " + H.S(this.key) + " from: " + H.S(this.oldValue) + " to: " + H.S(this.newValue) + ">";
+    },
+    $isMapChangeRecord: true
+  },
+  ObservableMap: {
+    "^": "ChangeNotifier;_observable_map$_map,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$keys: function() {
+      return this._observable_map$_map.get$keys();
+    },
+    get$values: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$values(t1);
+    },
+    get$length: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$length(t1);
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$length(t1) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$length(t1) !== 0;
+    },
+    $index: function(_, key) {
+      return this._observable_map$_map.$index(0, key);
+    },
+    $indexSet: function(_, key, value) {
+      var t1, t2, len, oldValue;
+      t1 = this.change_notifier$ChangeNotifier$_changes;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (!t1) {
+        this._observable_map$_map.$indexSet(0, key, value);
+        return;
+      }
+      t1 = this._observable_map$_map;
+      len = t1.get$length(t1);
+      oldValue = t1.$index(0, key);
+      t1.$indexSet(0, key, value);
+      if (len !== t1.get$length(t1)) {
+        F.notifyPropertyChangeHelper(this, C.Symbol_length, len, t1.get$length(t1));
+        this.notifyChange$1(this, H.setRuntimeTypeInfo(new V.MapChangeRecord(key, null, value, true, false), [null, null]));
+        this._notifyKeysValuesChanged$0();
+      } else if (!J.$eq(oldValue, value)) {
+        this.notifyChange$1(this, H.setRuntimeTypeInfo(new V.MapChangeRecord(key, oldValue, value, false, false), [null, null]));
+        this.notifyChange$1(this, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(this, C.Symbol_values, null, null), [null]));
+      }
+    },
+    addAll$1: function(_, other) {
+      J.forEach$1$ax(other, new V.ObservableMap_addAll_closure(this));
+    },
+    clear$0: function(_) {
+      var t1, len, t2, t3;
+      t1 = this._observable_map$_map;
+      len = t1.get$length(t1);
+      t2 = this.change_notifier$ChangeNotifier$_changes;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2 && len > 0) {
+        t1.forEach$1(0, new V.ObservableMap_clear_closure(this));
+        F.notifyPropertyChangeHelper(this, C.Symbol_length, len, 0);
+        this._notifyKeysValuesChanged$0();
+      }
+      t1.clear$0(0);
+    },
+    forEach$1: function(_, f) {
+      return this._observable_map$_map.forEach$1(0, f);
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    _notifyKeysValuesChanged$0: function() {
+      this.notifyChange$1(this, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(this, C.Symbol_keys, null, null), [null]));
+      this.notifyChange$1(this, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(this, C.Symbol_values, null, null), [null]));
+    },
+    $isObservableMap: true,
+    $isMap: true,
+    static: {ObservableMap_ObservableMap$createFromType: function(other, $K, $V) {
+        var result;
+        if (!!other.$isSplayTreeMap)
+          result = H.setRuntimeTypeInfo(new V.ObservableMap(P.SplayTreeMap$(null, null, $K, $V), null, null), [$K, $V]);
+        else
+          result = !!other.$isLinkedHashMap ? H.setRuntimeTypeInfo(new V.ObservableMap(P.LinkedHashMap_LinkedHashMap(null, null, null, $K, $V), null, null), [$K, $V]) : H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, $K, $V), null, null), [$K, $V]);
+        return result;
+      }}
+  },
+  ObservableMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: [function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    }, "call$2", null, 4, 0, null, 76, 21, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V2", args: [K, V]};
+      }, this.this_0, "ObservableMap");
+    }
+  },
+  ObservableMap_clear_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(key, value) {
+      var t1 = this.this_0;
+      t1.notifyChange$1(t1, H.setRuntimeTypeInfo(new V.MapChangeRecord(key, value, null, false, true), [null, null]));
+    },
+    $isFunction: true
+  }
+}],
+["observe.src.observer_transform", "package:observe/src/observer_transform.dart", , Y, {
+  "^": "",
+  ObserverTransform: {
+    "^": "Bindable;_bindable,_getTransformer,_setTransformer,_observer_transform$_notifyCallback,_observer_transform$_value",
+    _getTransformer$1: function(arg0) {
+      return this._getTransformer.call$1(arg0);
+    },
+    _observer_transform$_notifyCallback$1: function(arg0) {
+      return this._observer_transform$_notifyCallback.call$1(arg0);
+    },
+    open$1: function(_, callback) {
+      var t1;
+      this._observer_transform$_notifyCallback = callback;
+      t1 = this._getTransformer$1(J.open$1$x(this._bindable, this.get$_observedCallback()));
+      this._observer_transform$_value = t1;
+      return t1;
+    },
+    _observedCallback$1: [function(newValue) {
+      var value = this._getTransformer$1(newValue);
+      if (J.$eq(value, this._observer_transform$_value))
+        return;
+      this._observer_transform$_value = value;
+      return this._observer_transform$_notifyCallback$1(value);
+    }, "call$1", "get$_observedCallback", 2, 0, 13, 58],
+    close$0: function(_) {
+      var t1 = this._bindable;
+      if (t1 != null)
+        J.close$0$x(t1);
+      this._bindable = null;
+      this._getTransformer = null;
+      this._setTransformer = null;
+      this._observer_transform$_notifyCallback = null;
+      this._observer_transform$_value = null;
+    },
+    get$value: function(_) {
+      var t1 = this._getTransformer$1(J.get$value$x(this._bindable));
+      this._observer_transform$_value = t1;
+      return t1;
+    },
+    set$value: function(_, newValue) {
+      J.set$value$x(this._bindable, newValue);
+    }
+  }
+}],
+["observe.src.path_observer", "package:observe/src/path_observer.dart", , L, {
+  "^": "",
+  _getObjectProperty: function(object, property) {
+    var t1, t2, getter, exception, decl;
+    if (object == null)
+      return;
+    t1 = property;
+    if (typeof t1 === "number" && Math.floor(t1) === t1) {
+      if (!!J.getInterceptor(object).$isList && J.$ge$n(property, 0) && J.$lt$n(property, J.get$length$asx(object)))
+        return J.$index$asx(object, property);
+    } else if (!!J.getInterceptor(property).$isSymbol) {
+      t1 = object;
+      t2 = H.checkSubtype(t1, "$isIndexable", [P.String, null], "$asIndexable");
+      if (!t2) {
+        t1 = object;
+        t2 = H.checkSubtype(t1, "$isMap", [P.String, null], "$asMap");
+        t1 = t2 && !C.JSArray_methods.contains$1(C.List_8QI, property);
+      } else
+        t1 = true;
+      if (t1)
+        return J.$index$asx(object, $.get$symbolConverter()._names.$index(0, property));
+      try {
+        t1 = object;
+        t2 = property;
+        getter = $.get$objectAccessor()._getters.$index(0, t2);
+        if (getter == null)
+          H.throwExpression(O.MissingCodeException$("getter \"" + H.S(t2) + "\" in " + H.S(t1)));
+        t1 = getter.call$1(t1);
+        return t1;
+      } catch (exception) {
+        if (!!J.getInterceptor(H.unwrapException(exception)).$isNoSuchMethodError) {
+          t1 = J.get$runtimeType$(object);
+          decl = $.get$typeInspector()._findDeclaration$2(t1, C.Symbol_noSuchMethod);
+          if (!(decl != null && decl.kind === C.DeclarationKind_2 && !decl.isStatic))
+            throw exception;
+        } else
+          throw exception;
+      }
+
+    }
+    t1 = $.get$_logger0();
+    if (t1.isLoggable$1(C.Level_FINER_400))
+      t1.finer$1("can't get " + H.S(property) + " in " + H.S(object));
+    return;
+  },
+  _setObjectProperty: function(object, property, value) {
+    var t1, t2, exception;
+    if (object == null)
+      return false;
+    t1 = property;
+    if (typeof t1 === "number" && Math.floor(t1) === t1) {
+      if (!!J.getInterceptor(object).$isList && J.$ge$n(property, 0) && J.$lt$n(property, J.get$length$asx(object))) {
+        J.$indexSet$ax(object, property, value);
+        return true;
+      }
+    } else if (!!J.getInterceptor(property).$isSymbol) {
+      t1 = object;
+      t2 = H.checkSubtype(t1, "$isIndexable", [P.String, null], "$asIndexable");
+      if (!t2) {
+        t1 = object;
+        t2 = H.checkSubtype(t1, "$isMap", [P.String, null], "$asMap");
+        t1 = t2 && !C.JSArray_methods.contains$1(C.List_8QI, property);
+      } else
+        t1 = true;
+      if (t1) {
+        J.$indexSet$ax(object, $.get$symbolConverter()._names.$index(0, property), value);
+        return true;
+      }
+      try {
+        $.get$objectAccessor().write$3(object, property, value);
+        return true;
+      } catch (exception) {
+        if (!!J.getInterceptor(H.unwrapException(exception)).$isNoSuchMethodError) {
+          t1 = J.get$runtimeType$(object);
+          if (!$.get$typeInspector().hasInstanceMethod$2(t1, C.Symbol_noSuchMethod))
+            throw exception;
+        } else
+          throw exception;
+      }
+
+    }
+    t1 = $.get$_logger0();
+    if (t1.isLoggable$1(C.Level_FINER_400))
+      t1.finer$1("can't set " + H.S(property) + " in " + H.S(object));
+    return false;
+  },
+  _isPathValid: function(s) {
+    s = J.trim$0$s(s);
+    if (s === "")
+      return true;
+    if (0 >= s.length)
+      return H.ioore(s, 0);
+    if (s[0] === ".")
+      return false;
+    return $.get$_pathRegExp().hasMatch$1(s);
+  },
+  PathObserver: {
+    "^": "_Observer;_path_observer$_path,_object,_directObserver,_birthId,_notifyCallback,_notifyArgumentCount,_path_observer$_value",
+    get$_path_observer$_isClosed: function() {
+      return this._path_observer$_path == null;
+    },
+    set$value: function(_, newValue) {
+      var t1 = this._path_observer$_path;
+      if (t1 != null)
+        t1.setValueFrom$2(this._object, newValue);
+    },
+    get$_reportArgumentCount: function() {
+      return 2;
+    },
+    open$1: function(_, callback) {
+      return L._Observer.prototype.open$1.call(this, this, callback);
+    },
+    _connect$0: function() {
+      this._directObserver = L._ObservedSet__ObservedSet(this, this._object);
+      this._check$1$skipChanges(true);
+    },
+    _disconnect$0: function() {
+      this._path_observer$_value = null;
+      this._path_observer$_path = null;
+      this._object = null;
+    },
+    _iterateObjects$1: function(observe) {
+      this._path_observer$_path._iterateObjects$2(this._object, observe);
+    },
+    _check$1$skipChanges: function(skipChanges) {
+      var oldValue, t1;
+      oldValue = this._path_observer$_value;
+      t1 = this._path_observer$_path.getValueFrom$1(this._object);
+      this._path_observer$_value = t1;
+      if (skipChanges || J.$eq(t1, oldValue))
+        return false;
+      this._report$2(this._path_observer$_value, oldValue);
+      return true;
+    },
+    _check$0: function() {
+      return this._check$1$skipChanges(false);
+    },
+    $isBindable: true
+  },
+  PropertyPath: {
+    "^": "Object;_segments",
+    get$length: function(_) {
+      return this._segments.length;
+    },
+    get$isEmpty: function(_) {
+      return this._segments.length === 0;
+    },
+    get$isValid: function() {
+      return true;
+    },
+    toString$0: function(_) {
+      if (!this.get$isValid())
+        return "<invalid path>";
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(this._segments, new L.PropertyPath_toString_closure()), [null, null]).join$1(0, ".");
+    },
+    $eq: function(_, other) {
+      var t1, len, t2, i, t3;
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!J.getInterceptor(other).$isPropertyPath)
+        return false;
+      if (this.get$isValid() !== other.get$isValid())
+        return false;
+      t1 = this._segments;
+      len = t1.length;
+      t2 = other._segments;
+      if (len !== t2.length)
+        return false;
+      for (i = 0; i < len; ++i) {
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t3 = t1[i];
+        if (i >= t2.length)
+          return H.ioore(t2, i);
+        if (!J.$eq(t3, t2[i]))
+          return false;
+      }
+      return true;
+    },
+    get$hashCode: function(_) {
+      var t1, len, hash, i, t2;
+      for (t1 = this._segments, len = t1.length, hash = 0, i = 0; i < len; ++i) {
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t2 = J.get$hashCode$(t1[i]);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        hash = 536870911 & hash + t2;
+        hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+        hash ^= hash >>> 6;
+      }
+      hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+      hash ^= hash >>> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    getValueFrom$1: function(obj) {
+      var t1, segment;
+      if (!this.get$isValid())
+        return;
+      for (t1 = this._segments, t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        segment = t1._current;
+        if (obj == null)
+          return;
+        obj = L._getObjectProperty(obj, segment);
+      }
+      return obj;
+    },
+    setValueFrom$2: function(obj, value) {
+      var t1, end, i;
+      t1 = this._segments;
+      end = t1.length - 1;
+      if (end < 0)
+        return false;
+      for (i = 0; i < end; ++i) {
+        if (obj == null)
+          return false;
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        obj = L._getObjectProperty(obj, t1[i]);
+      }
+      if (end >= t1.length)
+        return H.ioore(t1, end);
+      return L._setObjectProperty(obj, t1[end], value);
+    },
+    _iterateObjects$2: function(obj, observe) {
+      var t1, last, i, i0;
+      if (!this.get$isValid() || this._segments.length === 0)
+        return;
+      t1 = this._segments;
+      last = t1.length - 1;
+      for (i = 0; obj != null; i = i0) {
+        observe.call$1(obj);
+        if (i >= last)
+          break;
+        i0 = i + 1;
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        obj = L._getObjectProperty(obj, t1[i]);
+      }
+    },
+    $isPropertyPath: true,
+    static: {PropertyPath_PropertyPath: function(path) {
+        var copy, t1, segment, pathObj, segments, t2, index, it;
+        if (!!J.getInterceptor(path).$isList) {
+          copy = P.List_List$from(path, false, null);
+          t1 = new H.ListIterator(copy, copy.length, 0, null);
+          t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(copy, 0)];
+          for (; t1.moveNext$0();) {
+            segment = t1._current;
+            if ((typeof segment !== "number" || Math.floor(segment) !== segment) && !J.getInterceptor(segment).$isSymbol)
+              throw H.wrapException(P.ArgumentError$("List must contain only ints and Symbols"));
+          }
+          return new L.PropertyPath(copy);
+        }
+        if (path == null)
+          path = "";
+        pathObj = $.get$_pathCache().$index(0, path);
+        if (pathObj != null)
+          return pathObj;
+        if (!L._isPathValid(path))
+          return $.get$_InvalidPropertyPath__instance();
+        segments = [];
+        t1 = J.trim$0$s(path).split(".");
+        t2 = new H.ListIterator(t1, t1.length, 0, null);
+        t2.$builtinTypeInfo = [H.getTypeArgumentByIndex(t1, 0)];
+        for (; t2.moveNext$0();) {
+          segment = t2._current;
+          if (J.$eq(segment, ""))
+            continue;
+          index = H.Primitives_parseInt(segment, 10, new L.PropertyPath_PropertyPath_closure());
+          segments.push(index != null ? index : $.get$symbolConverter()._symbols.$index(0, segment));
+        }
+        pathObj = new L.PropertyPath(C.JSArray_methods.toList$1$growable(segments, false));
+        t1 = $.get$_pathCache();
+        if (t1._collection$_length >= 100) {
+          t1.toString;
+          t2 = new P.LinkedHashMapKeyIterable(t1);
+          t2.$builtinTypeInfo = [H.getTypeArgumentByIndex(t1, 0)];
+          it = t2.get$iterator(t2);
+          if (!it.moveNext$0())
+            H.throwExpression(H.IterableElementError_noElement());
+          t1.remove$1(0, it.get$current());
+        }
+        t1.$indexSet(0, path, pathObj);
+        return pathObj;
+      }}
+  },
+  PropertyPath_PropertyPath_closure: {
+    "^": "Closure:13;",
+    call$1: function(_) {
+      return;
+    },
+    $isFunction: true
+  },
+  PropertyPath_toString_closure: {
+    "^": "Closure:13;",
+    call$1: [function(s) {
+      return !!J.getInterceptor(s).$isSymbol ? $.get$symbolConverter()._names.$index(0, s) : s;
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  _InvalidPropertyPath: {
+    "^": "PropertyPath;_segments",
+    get$isValid: function() {
+      return false;
+    },
+    static: {"^": "_InvalidPropertyPath__instance"}
+  },
+  closure7: {
+    "^": "Closure:69;",
+    call$0: function() {
+      return new H.JSSyntaxRegExp("^(?:(?:[$_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.JSSyntaxRegExp_makeNative("^(?:(?:[$_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]+)))*$", false, true, false), null, null);
+    },
+    $isFunction: true
+  },
+  CompoundObserver: {
+    "^": "_Observer;_directObserver,_observed,_birthId,_notifyCallback,_notifyArgumentCount,_path_observer$_value",
+    get$_path_observer$_isClosed: function() {
+      return this._observed == null;
+    },
+    get$_reportArgumentCount: function() {
+      return 3;
+    },
+    open$1: function(_, callback) {
+      return L._Observer.prototype.open$1.call(this, this, callback);
+    },
+    _connect$0: function() {
+      var t1, t2, i, object;
+      this._check$1$skipChanges(true);
+      for (t1 = this._observed, t2 = t1.length, i = 0; i < t2; i += 2) {
+        object = t1[i];
+        if (object !== C.C__ObserverSentinel) {
+          t1 = $._ObservedSet__lastSet;
+          if (t1 != null) {
+            t2 = t1._rootObject;
+            t2 = t2 == null ? object != null : t2 !== object;
+          } else
+            t2 = true;
+          if (t2) {
+            t1 = new L._ObservedSet(object, P.SplayTreeMap$(null, null, null, null), null, null, false);
+            $._ObservedSet__lastSet = t1;
+          }
+          t1._path_observer$_observers.$indexSet(0, this._birthId, this);
+          this._iterateObjects$1(t1.get$observe(t1));
+          this._directObserver = null;
+          break;
+        }
+      }
+    },
+    _disconnect$0: function() {
+      var i, t1, t2, t3;
+      this._path_observer$_value = null;
+      for (i = 0; t1 = this._observed, t2 = t1.length, i < t2; i += 2)
+        if (t1[i] === C.C__ObserverSentinel) {
+          t3 = i + 1;
+          if (t3 >= t2)
+            return H.ioore(t1, t3);
+          J.close$0$x(t1[t3]);
+        }
+      this._observed = null;
+    },
+    addPath$2: function(object, path) {
+      var t1;
+      if (this._notifyCallback != null || this._observed == null)
+        throw H.wrapException(P.StateError$("Cannot add paths once started."));
+      if (!J.getInterceptor(path).$isPropertyPath)
+        path = L.PropertyPath_PropertyPath(path);
+      t1 = this._observed;
+      t1.push(object);
+      t1.push(path);
+    },
+    addPath$1: function(object) {
+      return this.addPath$2(object, null);
+    },
+    _iterateObjects$1: function(observe) {
+      var i, t1, t2, object, t3;
+      for (i = 0; t1 = this._observed, t2 = t1.length, i < t2; i += 2) {
+        object = t1[i];
+        if (object !== C.C__ObserverSentinel) {
+          t3 = i + 1;
+          if (t3 >= t2)
+            return H.ioore(t1, t3);
+          H.interceptedTypeCast(t1[t3], "$isPropertyPath")._iterateObjects$2(object, observe);
+        }
+      }
+    },
+    _check$1$skipChanges: function(skipChanges) {
+      var changed, oldValues, i, t1, t2, t3, pathOrObserver, object, value;
+      J.set$length$asx(this._path_observer$_value, C.JSInt_methods._tdivFast$1(this._observed.length, 2));
+      for (changed = false, oldValues = null, i = 0; t1 = this._observed, t2 = t1.length, i < t2; i += 2) {
+        t3 = i + 1;
+        if (t3 >= t2)
+          return H.ioore(t1, t3);
+        pathOrObserver = t1[t3];
+        object = t1[i];
+        if (object === C.C__ObserverSentinel) {
+          H.interceptedTypeCast(pathOrObserver, "$isBindable");
+          value = pathOrObserver.get$value(pathOrObserver);
+        } else
+          value = H.interceptedTypeCast(pathOrObserver, "$isPropertyPath").getValueFrom$1(object);
+        if (skipChanges) {
+          J.$indexSet$ax(this._path_observer$_value, C.JSInt_methods._tdivFast$1(i, 2), value);
+          continue;
+        }
+        t1 = this._path_observer$_value;
+        t2 = C.JSInt_methods._tdivFast$1(i, 2);
+        if (J.$eq(value, J.$index$asx(t1, t2)))
+          continue;
+        t1 = this._notifyArgumentCount;
+        if (typeof t1 !== "number")
+          return t1.$ge();
+        if (t1 >= 2) {
+          if (oldValues == null)
+            oldValues = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+          oldValues.$indexSet(0, t2, J.$index$asx(this._path_observer$_value, t2));
+        }
+        J.$indexSet$ax(this._path_observer$_value, t2, value);
+        changed = true;
+      }
+      if (!changed)
+        return false;
+      this._report$3(this._path_observer$_value, oldValues, t1);
+      return true;
+    },
+    _check$0: function() {
+      return this._check$1$skipChanges(false);
+    },
+    $isBindable: true
+  },
+  _ObserverSentinel: {
+    "^": "Object;"
+  },
+  _Observer: {
+    "^": "Bindable;_birthId<",
+    _notifyCallback$0: function() {
+      return this._notifyCallback.call$0();
+    },
+    _notifyCallback$1: function(arg0) {
+      return this._notifyCallback.call$1(arg0);
+    },
+    _notifyCallback$2: function(arg0, arg1) {
+      return this._notifyCallback.call$2(arg0, arg1);
+    },
+    _notifyCallback$3: function(arg0, arg1, arg2) {
+      return this._notifyCallback.call$3(arg0, arg1, arg2);
+    },
+    get$_isOpen: function() {
+      return this._notifyCallback != null;
+    },
+    open$1: function(_, callback) {
+      if (this._notifyCallback != null || this.get$_path_observer$_isClosed())
+        throw H.wrapException(P.StateError$("Observer has already been opened."));
+      if (X.minArgs(callback) > this.get$_reportArgumentCount())
+        throw H.wrapException(P.ArgumentError$("callback should take " + this.get$_reportArgumentCount() + " or fewer arguments"));
+      this._notifyCallback = callback;
+      this._notifyArgumentCount = P.min(this.get$_reportArgumentCount(), X.maxArgs(callback));
+      this._connect$0();
+      return this._path_observer$_value;
+    },
+    get$value: function(_) {
+      this._check$1$skipChanges(true);
+      return this._path_observer$_value;
+    },
+    close$0: function(_) {
+      if (this._notifyCallback == null)
+        return;
+      this._disconnect$0();
+      this._path_observer$_value = null;
+      this._notifyCallback = null;
+    },
+    _deliver$1: [function(_) {
+      if (this._notifyCallback != null)
+        this._dirtyCheck$0();
+    }, "call$1", "get$_deliver", 2, 0, 20, 14],
+    _dirtyCheck$0: function() {
+      var cycles = 0;
+      while (true) {
+        if (!(cycles < 1000 && this._check$0()))
+          break;
+        ++cycles;
+      }
+      return cycles > 0;
+    },
+    _report$3: function(newValue, oldValue, extraArg) {
+      var e, s, exception, t1;
+      try {
+        switch (this._notifyArgumentCount) {
+          case 0:
+            this._notifyCallback$0();
+            break;
+          case 1:
+            this._notifyCallback$1(newValue);
+            break;
+          case 2:
+            this._notifyCallback$2(newValue, oldValue);
+            break;
+          case 3:
+            this._notifyCallback$3(newValue, oldValue, extraArg);
+            break;
+        }
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2(e, s);
+      }
+
+    },
+    _report$2: function(newValue, oldValue) {
+      return this._report$3(newValue, oldValue, null);
+    }
+  },
+  _ObservedSet: {
+    "^": "Object;_rootObject,_path_observer$_observers,_objects,_toRemove,_resetNeeded",
+    open$1: function(_, obs) {
+      this._path_observer$_observers.$indexSet(0, obs.get$_birthId(), obs);
+      obs._iterateObjects$1(this.get$observe(this));
+    },
+    observe$1: [function(_, obj) {
+      var t1 = J.getInterceptor(obj);
+      if (!!t1.$isObservableList)
+        this._observeStream$1(obj.get$listChanges());
+      if (!!t1.$isObservable)
+        this._observeStream$1(t1.get$changes(obj));
+    }, "call$1", "get$observe", 2, 0, 159, 81],
+    _observeStream$1: function(stream) {
+      var t1, sub;
+      if (this._objects == null)
+        this._objects = P.HashMap_HashMap(null, null, null, null, null);
+      t1 = this._toRemove;
+      sub = t1 != null ? t1.remove$1(0, stream) : null;
+      if (sub != null)
+        this._objects.$indexSet(0, stream, sub);
+      else if (!this._objects.containsKey$1(stream))
+        this._objects.$indexSet(0, stream, stream.listen$1(this.get$_path_observer$_callback()));
+    },
+    reset$0: [function(_) {
+      var objs, t1, t2, t3, observer;
+      if (!this._resetNeeded)
+        return;
+      objs = this._toRemove;
+      if (objs == null)
+        objs = P.HashMap_HashMap(null, null, null, null, null);
+      this._toRemove = this._objects;
+      this._objects = objs;
+      for (t1 = this._path_observer$_observers, t1 = H.setRuntimeTypeInfo(new P._SplayTreeValueIterable(t1), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]), t2 = t1._map, t3 = H.getTypeArgumentByIndex(t1, 1), t1 = H.setRuntimeTypeInfo(new P._SplayTreeValueIterator(t2, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), t2._modificationCount, t2._splayCount, null), [H.getTypeArgumentByIndex(t1, 0), t3]), t1._SplayTreeIterator$1(t2, t3); t1.moveNext$0();) {
+        observer = t1.get$current();
+        if (observer.get$_isOpen())
+          observer._iterateObjects$1(this.get$observe(this));
+      }
+      for (t1 = this._toRemove, t1 = t1.get$values(t1), t1 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]); t1.moveNext$0();)
+        t1._current.cancel$0();
+      this._toRemove = null;
+    }, "call$0", "get$reset", 0, 0, 18],
+    _path_observer$_callback$1: [function(records) {
+      var t1, observer;
+      for (t1 = this._path_observer$_observers, t1 = H.setRuntimeTypeInfo(new P._SplayTreeValueIterable(t1), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]), t1 = P.List_List$from(t1, false, H.getRuntimeTypeArgument(t1, "IterableBase", 0)), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        observer = t1._current;
+        if (observer.get$_isOpen())
+          observer._check$0();
+      }
+      this._resetNeeded = true;
+      P.scheduleMicrotask(this.get$reset(this));
+    }, "call$1", "get$_path_observer$_callback", 2, 0, 20, 160],
+    static: {"^": "_ObservedSet__lastSet", _ObservedSet__ObservedSet: function(observer, rootObj) {
+        var t1, t2;
+        t1 = $._ObservedSet__lastSet;
+        if (t1 != null) {
+          t2 = t1._rootObject;
+          t2 = t2 == null ? rootObj != null : t2 !== rootObj;
+        } else
+          t2 = true;
+        if (t2) {
+          t1 = new L._ObservedSet(rootObj, P.SplayTreeMap$(null, null, null, null), null, null, false);
+          $._ObservedSet__lastSet = t1;
+        }
+        t1._path_observer$_observers.$indexSet(0, observer._birthId, observer);
+        observer._iterateObjects$1(t1.get$observe(t1));
+      }}
+  }
+}],
+["observe.src.to_observable", "package:observe/src/to_observable.dart", , R, {
+  "^": "",
+  _toObservableDeep: [function(value) {
+    var t1, result, t2;
+    t1 = J.getInterceptor(value);
+    if (!!t1.$isObservable)
+      return value;
+    if (!!t1.$isMap) {
+      result = V.ObservableMap_ObservableMap$createFromType(value, null, null);
+      t1.forEach$1(value, new R._toObservableDeep_closure(result));
+      return result;
+    }
+    if (!!t1.$isIterable) {
+      t1 = t1.map$1(value, R._toObservableDeep$closure());
+      t2 = Q.ObservableList$(null, null);
+      t2.addAll$1(0, t1);
+      return t2;
+    }
+    return value;
+  }, "call$1", "_toObservableDeep$closure", 2, 0, 13, 21],
+  _toObservableDeep_closure: {
+    "^": "Closure:75;result_0",
+    call$2: function(k, v) {
+      this.result_0.$indexSet(0, R._toObservableDeep(k), R._toObservableDeep(v));
+    },
+    $isFunction: true
+  }
+}],
+["polymer", "package:polymer/polymer.dart", , A, {
+  "^": "",
+  _shimShadowDomStyling: function(template, $name, extendee) {
+    if (template == null || $.get$_ShadowCss() == null)
+      return;
+    $.get$_ShadowCss().callMethod$2("shimStyling", [template, $name, extendee]);
+  },
+  _cssTextFromSheet: function(sheet) {
+    var href, e, t, t1, exception;
+    if (sheet == null)
+      return "";
+    if ($.deployMode)
+      return "";
+    t1 = J.getInterceptor$x(sheet);
+    href = t1.get$href(sheet);
+    if (J.$eq(href, ""))
+      href = t1.get$attributes(sheet)._html$_element.getAttribute("href");
+    try {
+      t1 = new XMLHttpRequest();
+      C.HttpRequest_methods.open$3$async(t1, "GET", href, false);
+      t1.send();
+      t1 = t1.responseText;
+      return t1;
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      if (!!J.getInterceptor(t1).$isDomException) {
+        e = t1;
+        t = new H._StackTrace(exception, null);
+        $.get$_sheetLog().fine$1("failed to XHR stylesheet text href=\"" + H.S(href) + "\" error: " + H.S(e) + ", trace: " + H.S(t));
+        return "";
+      } else
+        throw exception;
+    }
+
+  },
+  _isObserverMethod: [function(symbol) {
+    var $name, t1;
+    $name = $.get$symbolConverter()._names.$index(0, symbol);
+    if ($name == null)
+      return false;
+    t1 = J.getInterceptor$s($name);
+    return t1.endsWith$1($name, "Changed") && !t1.$eq($name, "attributeChanged");
+  }, "call$1", "_isObserverMethod$closure", 2, 0, 62, 63],
+  Polymer_register: function($name, type) {
+    $.get$_typesByName().$indexSet(0, $name, type);
+    H.interceptedTypeCast(J.$index$asx($.get$context(), "Polymer"), "$isJsFunction").apply$1([$name]);
+  },
+  Polymer_applyStyleToScope: function(style, scope) {
+    var clone, attr, refNode, styleElement;
+    if (style == null)
+      return;
+    document;
+    if ($.get$_hasShadowDomPolyfill() === true)
+      scope = document.head;
+    clone = document.createElement("style", null);
+    J.set$text$x(clone, J.get$text$x(style));
+    attr = style.getAttribute("element");
+    if (attr != null)
+      clone.setAttribute("element", attr);
+    refNode = scope.firstChild;
+    if (scope === document.head) {
+      styleElement = W._FrozenElementList$_wrap(document.head.querySelectorAll("style[element]"), null);
+      if (styleElement.get$isNotEmpty(styleElement))
+        refNode = J.get$nextElementSibling$x(C.NodeList_methods.get$last(styleElement._nodeList));
+    }
+    scope.insertBefore(clone, refNode);
+  },
+  initPolymer: function() {
+    if ($.deployMode) {
+      A.startPolymer($.initializers, true);
+      return $.Zone__current;
+    }
+    var t1 = $.Zone__current.fork$1$specification(O.dirtyCheckZoneSpec());
+    t1.run$1(new A.initPolymer_closure());
+    return t1;
+  },
+  startPolymer: function(initializers, deployMode) {
+    var poly, t1;
+    if ($._startPolymerCalled)
+      throw H.wrapException("Initialization was already done.");
+    $._startPolymerCalled = true;
+    A._hookJsPolymer();
+    $._deployMode = deployMode;
+    if (initializers == null)
+      throw H.wrapException("Missing initialization of polymer elements. Please check that the list of entry points in your pubspec.yaml is correct. If you are using pub-serve, you may need to restart it.");
+    A.Polymer_register("d-auto-binding", C.Type_s8b);
+    poly = document.createElement("polymer-element", null);
+    poly.setAttribute("name", "d-auto-binding");
+    poly.setAttribute("extends", "template");
+    J.$index$asx($.get$_polymerElementProto(), "init").apply$2$thisArg([], poly);
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(initializers, 74, 0, null), [H.getTypeArgumentByIndex(initializers, 0)]); t1.moveNext$0();)
+      t1._current.call$0();
+  },
+  _hookJsPolymer: function() {
+    var t1, polymerJs, zone, originalRegister;
+    t1 = $.get$context();
+    if (J.$index$asx(t1, "Platform") == null)
+      throw H.wrapException(P.StateError$("platform.js, dart_support.js must be loaded at the top of your application, before any other scripts or HTML imports that use polymer. Putting these two script tags at the top of your <head> element should address this issue: <script src=\"packages/web_components/platform.js\"></script> and  <script src=\"packages/web_components/dart_support.js\"></script>."));
+    polymerJs = J.$index$asx(t1, "Polymer");
+    if (polymerJs == null)
+      throw H.wrapException(P.StateError$("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."));
+    zone = $.Zone__current;
+    polymerJs.callMethod$2("whenPolymerReady", [zone.bindCallback$1(new A._hookJsPolymer_closure())]);
+    originalRegister = J.$index$asx($.get$_polymerElementProto(), "register");
+    if (originalRegister == null)
+      throw H.wrapException(P.StateError$("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."));
+    J.$indexSet$ax($.get$_polymerElementProto(), "register", P.JsFunction_JsFunction$withThis(new A._hookJsPolymer_registerDart(zone, originalRegister)));
+  },
+  PolymerDeclaration: {
+    "^": "Object;element>,type>,superDeclaration<,name>,_polymer$_publish<,_publishLC<,_observe>,_instanceAttributes<,_reflect<,_sheets,_styles,syntax>,_eventDelegates<,_templateDelegates,_rootUri",
+    get$templateContent: function() {
+      var template, t1;
+      template = J.querySelector$1$x(this.element, "template");
+      if (template != null)
+        t1 = J.get$content$x(!!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template));
+      else
+        t1 = null;
+      return t1;
+    },
+    registerType$1: function($name) {
+      var baseTag, decl, t1;
+      for (baseTag = null, decl = this; decl != null;) {
+        baseTag = J.get$attributes$x(J.get$element$x(decl))._html$_element.getAttribute("extends");
+        decl = decl.get$superDeclaration();
+      }
+      t1 = document;
+      W._registerCustomElement(window, t1, $name, this.type, baseTag);
+    },
+    resolveElementPaths$1: function(node) {
+      var t1 = $.get$_Platform();
+      if (t1 == null)
+        return;
+      J.$index$asx(t1, "urlResolver").callMethod$2("resolveDom", [node]);
+    },
+    publishAttributes$1: function(superDecl) {
+      var t1, t2, attrs, t3, attr, property, path, t4, decl;
+      if (superDecl != null) {
+        if (superDecl.get$_polymer$_publish() != null) {
+          t1 = superDecl.get$_polymer$_publish();
+          t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+          t2.addAll$1(0, t1);
+          this._polymer$_publish = t2;
+        }
+        if (superDecl.get$_reflect() != null) {
+          t1 = superDecl.get$_reflect();
+          t2 = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+          t2.addAll$1(0, t1);
+          this._reflect = t2;
+        }
+      }
+      t1 = this.type;
+      this._getPublishedProperties$1(t1);
+      attrs = J.get$attributes$x(this.element)._html$_element.getAttribute("attributes");
+      if (attrs != null)
+        for (t2 = C.JSString_methods.split$1(attrs, $.get$_ATTRIBUTES_REGEX()), t2 = H.setRuntimeTypeInfo(new H.ListIterator(t2, t2.length, 0, null), [H.getTypeArgumentByIndex(t2, 0)]), t3 = this.name; t2.moveNext$0();) {
+          attr = J.trim$0$s(t2._current);
+          if (attr === "")
+            continue;
+          property = $.get$symbolConverter()._symbols.$index(0, attr);
+          path = L.PropertyPath_PropertyPath([property]);
+          t4 = this._polymer$_publish;
+          if (t4 != null && t4.containsKey$1(path))
+            continue;
+          decl = $.get$typeInspector().getDeclaration$2(t1, property);
+          if (decl == null || decl.kind === C.DeclarationKind_2 || decl.isFinal) {
+            window;
+            t4 = "property for attribute " + attr + " of polymer-element name=" + H.S(t3) + " not found.";
+            if (typeof console != "undefined")
+              console.warn(t4);
+            continue;
+          }
+          t4 = this._polymer$_publish;
+          if (t4 == null) {
+            t4 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+            this._polymer$_publish = t4;
+          }
+          t4.$indexSet(0, path, decl);
+        }
+    },
+    _getPublishedProperties$1: function(type) {
+      var t1, decl, t2, t3;
+      for (t1 = $.get$typeInspector().query$2(0, type, C.QueryOptions_sAl), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        decl = t1._current;
+        t2 = J.getInterceptor$x(decl);
+        if (t2.get$isFinal(decl) === true)
+          continue;
+        t3 = this._polymer$_publish;
+        if (t3 == null) {
+          t3 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+          this._polymer$_publish = t3;
+        }
+        t3.$indexSet(0, L.PropertyPath_PropertyPath([t2.get$name(decl)]), decl);
+        t3 = new H.WhereIterable(decl.get$annotations(), new A.PolymerDeclaration__getPublishedProperties_closure());
+        t3.$builtinTypeInfo = [null];
+        if (t3.any$1(0, new A.PolymerDeclaration__getPublishedProperties_closure0())) {
+          t3 = this._reflect;
+          if (t3 == null) {
+            t3 = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+            this._reflect = t3;
+          }
+          t2 = t2.get$name(decl);
+          t3.add$1(0, $.get$symbolConverter()._names.$index(0, t2));
+        }
+      }
+    },
+    accumulateInstanceAttributes$0: function() {
+      var t1, t2;
+      t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Object);
+      this._instanceAttributes = t1;
+      t2 = this.superDeclaration;
+      if (t2 != null)
+        t1.addAll$1(0, t2.get$_instanceAttributes());
+      J.get$attributes$x(this.element).forEach$1(0, new A.PolymerDeclaration_accumulateInstanceAttributes_closure(this));
+    },
+    addAttributeDelegates$1: function(delegates) {
+      J.get$attributes$x(this.element).forEach$1(0, new A.PolymerDeclaration_addAttributeDelegates_closure(delegates));
+    },
+    cacheSheets$0: function() {
+      var t1 = this.findNodes$1("link[rel=stylesheet]");
+      this._sheets = t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.remove$0$ax(t1._current);
+    },
+    cacheStyles$0: function() {
+      var t1 = this.findNodes$1("style[polymer-scope]");
+      this._styles = t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.remove$0$ax(t1._current);
+    },
+    installLocalSheets$0: function() {
+      var t1, sheets, $content, cssText, t2, str, t3, style;
+      t1 = this._sheets;
+      t1.toString;
+      sheets = H.setRuntimeTypeInfo(new H.WhereIterable(t1, new A.PolymerDeclaration_installLocalSheets_closure()), [null]);
+      $content = this.get$templateContent();
+      if ($content != null) {
+        cssText = P.StringBuffer$("");
+        for (t1 = H.setRuntimeTypeInfo(new H.WhereIterator(J.get$iterator$ax(sheets._iterable), sheets._f), [H.getTypeArgumentByIndex(sheets, 0)]), t2 = t1._iterator; t1.moveNext$0();) {
+          str = A._cssTextFromSheet(t2.get$current());
+          t3 = cssText._contents += typeof str === "string" ? str : H.S(str);
+          cssText._contents = t3 + "\n";
+        }
+        if (cssText._contents.length > 0) {
+          style = J.get$ownerDocument$x(this.element).createElement("style", null);
+          J.set$text$x(style, H.S(cssText));
+          t1 = J.getInterceptor$x($content);
+          t1.insertBefore$2($content, style, t1.get$firstChild($content));
+        }
+      }
+    },
+    findNodes$2: function(selector, matcher) {
+      var t1, nodes, $content;
+      t1 = J.querySelectorAll$1$x(this.element, selector);
+      nodes = t1.toList$0(t1);
+      $content = this.get$templateContent();
+      if ($content != null)
+        C.JSArray_methods.addAll$1(nodes, J.querySelectorAll$1$x($content, selector));
+      return nodes;
+    },
+    findNodes$1: function(selector) {
+      return this.findNodes$2(selector, null);
+    },
+    cssTextForScope$1: function(scopeDescriptor) {
+      var cssText, t1, t2, t3, str, t4;
+      cssText = P.StringBuffer$("");
+      t1 = new A.PolymerDeclaration_cssTextForScope_matcher("[polymer-scope=" + scopeDescriptor + "]");
+      for (t2 = this._sheets, t2.toString, t2 = H.setRuntimeTypeInfo(new H.WhereIterable(t2, t1), [null]), t2 = H.setRuntimeTypeInfo(new H.WhereIterator(J.get$iterator$ax(t2._iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0)]), t3 = t2._iterator; t2.moveNext$0();) {
+        str = A._cssTextFromSheet(t3.get$current());
+        t4 = cssText._contents += typeof str === "string" ? str : H.S(str);
+        cssText._contents = t4 + "\n\n";
+      }
+      for (t2 = this._styles, t2.toString, t1 = H.setRuntimeTypeInfo(new H.WhereIterable(t2, t1), [null]), t1 = H.setRuntimeTypeInfo(new H.WhereIterator(J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0)]), t2 = t1._iterator; t1.moveNext$0();) {
+        str = J.get$text$x(t2.get$current());
+        t3 = cssText._contents += typeof str === "string" ? str : H.S(str);
+        cssText._contents = t3 + "\n\n";
+      }
+      return cssText._contents;
+    },
+    cssTextToScopeStyle$2: function(cssText, scopeDescriptor) {
+      var t1;
+      if (cssText === "")
+        return;
+      t1 = document.createElement("style", null);
+      J.set$text$x(t1, cssText);
+      t1.setAttribute("element", H.S(this.name) + "-" + scopeDescriptor);
+      return t1;
+    },
+    inferObservers$0: function() {
+      var t1, decl, t2, t3, $name;
+      for (t1 = $.get$_changedMethodQueryOptions(), t1 = $.get$typeInspector().query$2(0, this.type, t1), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        decl = t1._current;
+        if (this._observe == null)
+          this._observe = P.HashMap_HashMap(null, null, null, null, null);
+        t2 = J.getInterceptor$x(decl);
+        t3 = t2.get$name(decl);
+        $name = $.get$symbolConverter()._names.$index(0, t3);
+        t3 = J.getInterceptor$asx($name);
+        $name = t3.substring$2($name, 0, J.$sub$n(t3.get$length($name), 7));
+        this._observe.$indexSet(0, L.PropertyPath_PropertyPath($name), [t2.get$name(decl)]);
+      }
+    },
+    explodeObservers$0: function() {
+      var t1, t2, t3;
+      for (t1 = $.get$typeInspector().query$2(0, this.type, C.QueryOptions_xw8), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        t2 = t1._current.get$annotations();
+        t3 = new H.ListIterator(t2, t2.length, 0, null);
+        t3.$builtinTypeInfo = [H.getTypeArgumentByIndex(t2, 0)];
+        for (; t3.moveNext$0();)
+          continue;
+      }
+    },
+    _lowerCaseMap$1: function(properties) {
+      var map = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, null);
+      properties.forEach$1(0, new A.PolymerDeclaration__lowerCaseMap_closure(map));
+      return map;
+    },
+    $isPolymerDeclaration: true,
+    static: {"^": "PolymerDeclaration__polymerSyntax"}
+  },
+  PolymerDeclaration__getPublishedProperties_closure: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return !!J.getInterceptor(a).$isPublishedProperty;
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration__getPublishedProperties_closure0: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return a.get$reflect();
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_accumulateInstanceAttributes_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function($name, value) {
+      if (C.Map_EJn7R.containsKey$1($name) !== true && !J.startsWith$1$s($name, "on-"))
+        this.this_0._instanceAttributes.$indexSet(0, $name, value);
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_addAttributeDelegates_closure: {
+    "^": "Closure:75;delegates_0",
+    call$2: function($name, value) {
+      var t1, start, end;
+      t1 = J.getInterceptor$s($name);
+      if (t1.startsWith$1($name, "on-")) {
+        start = J.getInterceptor$asx(value).indexOf$1(value, "{{");
+        end = C.JSString_methods.lastIndexOf$1(value, "}}");
+        if (start >= 0 && end >= 0)
+          this.delegates_0.$indexSet(0, t1.substring$1($name, 3), C.JSString_methods.trim$0(C.JSString_methods.substring$2(value, start + 2, end)));
+      }
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_installLocalSheets_closure: {
+    "^": "Closure:13;",
+    call$1: function(s) {
+      return J.get$attributes$x(s)._html$_element.hasAttribute("polymer-scope") !== true;
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_cssTextForScope_matcher: {
+    "^": "Closure:13;selector_0",
+    call$1: function(s) {
+      return J.matches$1$x(s, this.selector_0);
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_explodeObservers_closure: {
+    "^": "Closure:69;",
+    call$0: function() {
+      return [];
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration__lowerCaseMap_closure: {
+    "^": "Closure:161;map_0",
+    call$2: function(path, value) {
+      this.map_0.$indexSet(0, H.S(path).toLowerCase(), value);
+    },
+    $isFunction: true
+  },
+  PolymerExpressions: {
+    "^": "BindingDelegate_PolymerEventBindings;_delegate,_bindingMaps",
+    prepareBinding$3: function(path, $name, node) {
+      if (J.startsWith$1$s($name, "on-"))
+        return this.prepareEventBinding$3(path, $name, node);
+      return this._delegate.prepareBinding$3(path, $name, node);
+    }
+  },
+  BindingDelegate_PolymerEventBindings: {
+    "^": "BindingDelegate+PolymerEventBindings;"
+  },
+  PolymerEventBindings: {
+    "^": "Object;",
+    findController$1: function(node) {
+      var t1;
+      for (; t1 = J.getInterceptor$x(node), t1.get$parentNode(node) != null;) {
+        if (!!t1.$isPolymer && J.$index$asx(node.polymer$Polymer$_jsElem, "eventController") != null)
+          return J.$index$asx(t1.get$_jsElem(node), "eventController");
+        node = t1.get$parentNode(node);
+      }
+      return !!t1.$isShadowRoot ? node.host : null;
+    },
+    getEventHandler$3: function(controller, target, method) {
+      var t1 = {};
+      t1.controller_0 = controller;
+      return new A.PolymerEventBindings_getEventHandler_closure(t1, this, target, method);
+    },
+    prepareEventBinding$3: function(path, $name, node) {
+      var t1, t2, eventType, translated;
+      t1 = {};
+      t2 = J.getInterceptor$s($name);
+      if (!t2.startsWith$1($name, "on-"))
+        return;
+      eventType = t2.substring$1($name, 3);
+      t1.eventType_0 = eventType;
+      translated = C.Map_AmMJ5.$index(0, eventType);
+      t1.eventType_0 = translated != null ? translated : t1.eventType_0;
+      return new A.PolymerEventBindings_prepareEventBinding_closure(t1, this, path);
+    }
+  },
+  PolymerEventBindings_getEventHandler_closure: {
+    "^": "Closure:13;box_0,this_1,target_2,method_3",
+    call$1: [function(e) {
+      var t1, t2, controller, detail;
+      t1 = this.box_0;
+      t2 = t1.controller_0;
+      if (t2 == null || !J.getInterceptor(t2).$isPolymer) {
+        controller = this.this_1.findController$1(this.target_2);
+        t1.controller_0 = controller;
+        t2 = controller;
+      }
+      if (!!J.getInterceptor(t2).$isPolymer) {
+        t2 = J.getInterceptor(e);
+        if (!!t2.$isCustomEvent) {
+          detail = t2.get$detail(e);
+          if (detail == null)
+            detail = J.$index$asx(P.JsObject_JsObject$fromBrowserObject(e), "detail");
+        } else
+          detail = null;
+        t2 = t2.get$currentTarget(e);
+        t1 = t1.controller_0;
+        J.dispatchMethod$3$x(t1, t1, this.method_3, [e, detail, t2]);
+      } else
+        throw H.wrapException(P.StateError$("controller " + H.S(t2) + " is not a Dart polymer-element."));
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  PolymerEventBindings_prepareEventBinding_closure: {
+    "^": "Closure:165;box_0,this_1,path_2",
+    call$3: [function(model, node, oneTime) {
+      var t1, handler, t2, sub;
+      t1 = this.path_2;
+      handler = this.this_1.getEventHandler$3(null, node, t1);
+      t2 = J.get$on$x(node).$index(0, this.box_0.eventType_0);
+      sub = H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t2._html$_target, t2._eventType, W._wrapZone(handler), t2._useCapture), [H.getTypeArgumentByIndex(t2, 0)]);
+      sub._tryResume$0();
+      if (oneTime === true)
+        return;
+      return new A._EventBindable(sub, t1);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  _EventBindable: {
+    "^": "Bindable;_sub,_polymer$_path",
+    get$value: function(_) {
+      return "{{ " + this._polymer$_path + " }}";
+    },
+    open$1: function(_, callback) {
+      return "{{ " + this._polymer$_path + " }}";
+    },
+    close$0: function(_) {
+      var t1 = this._sub;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._sub = null;
+      }
+    }
+  },
+  PublishedProperty: {
+    "^": "ObservableProperty;reflect<",
+    $isPublishedProperty: true
+  },
+  PolymerElement: {
+    "^": "HtmlElement_Polymer_ChangeNotifier;change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    PolymerElement$created$0: function(receiver) {
+      this.polymerCreated$0(receiver);
+    },
+    static: {PolymerElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.PolymerElement_methods.Element$created$0(receiver);
+        C.PolymerElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  HtmlElement_Polymer: {
+    "^": "HtmlElement+Polymer;_jsElem:polymer$Polymer$_jsElem=",
+    $isPolymer: true,
+    $isNodeBindExtension: true,
+    $isObservable: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true
+  },
+  HtmlElement_Polymer_ChangeNotifier: {
+    "^": "HtmlElement_Polymer+ChangeNotifier;",
+    $isObservable: true
+  },
+  Polymer: {
+    "^": "Object;_jsElem:polymer$Polymer$_jsElem=",
+    get$element: function(receiver) {
+      return receiver.polymer$Polymer$_polymer$_element;
+    },
+    get$syntax: function(receiver) {
+      return;
+    },
+    get$_polymer$_name: function(receiver) {
+      var t1, isAttr;
+      t1 = receiver.polymer$Polymer$_polymer$_element;
+      if (t1 != null)
+        return J.get$name$x(t1);
+      isAttr = this.get$attributes(receiver)._html$_element.getAttribute("is");
+      return isAttr == null || isAttr === "" ? this.get$localName(receiver) : isAttr;
+    },
+    polymerCreated$0: function(receiver) {
+      var t, t1;
+      t = this.get$templateInstance(receiver);
+      if (t != null && t.model != null) {
+        window;
+        t1 = "Attributes on " + H.S(this.get$_polymer$_name(receiver)) + " were data bound prior to Polymer upgrading the element. This may result in incorrect binding types.";
+        if (typeof console != "undefined")
+          console.warn(t1);
+      }
+      this.prepareElement$0(receiver);
+      t1 = this.get$ownerDocument(receiver);
+      if (!J.$eq($.get$_isStagingDocument().$index(0, t1), true) || $.get$_hasShadowDomPolyfill() === true)
+        this.makeElementReady$0(receiver);
+    },
+    prepareElement$0: function(receiver) {
+      var t1, t2;
+      if (receiver.polymer$Polymer$_polymer$_element != null) {
+        window;
+        t1 = "Element already prepared: " + H.S(this.get$_polymer$_name(receiver));
+        if (typeof console != "undefined")
+          console.warn(t1);
+        return;
+      }
+      receiver.polymer$Polymer$_jsElem = P.JsObject_JsObject$fromBrowserObject(receiver);
+      t1 = this.get$_polymer$_name(receiver);
+      receiver.polymer$Polymer$_polymer$_element = $.get$_declarations().$index(0, t1);
+      this.createPropertyObserver$0(receiver);
+      t1 = receiver.polymer$Polymer$_propertyObserver;
+      if (t1 != null) {
+        t2 = this.get$notifyPropertyChanges(receiver);
+        t1.toString;
+        L._Observer.prototype.open$1.call(J.getInterceptor(t1), t1, t2);
+      }
+      if (receiver.polymer$Polymer$_polymer$_element.get$_polymer$_publish() != null)
+        this.get$changes(receiver).listen$1(this.get$_propertyChange(receiver));
+      this.copyInstanceAttributes$0(receiver);
+      this.takeAttributes$0(receiver);
+      this.addHostListeners$0(receiver);
+    },
+    makeElementReady$0: function(receiver) {
+      if (receiver.polymer$Polymer$_readied)
+        return;
+      receiver.polymer$Polymer$_readied = true;
+      this.parseDeclarations$1(receiver, receiver.polymer$Polymer$_polymer$_element);
+      this.get$attributes(receiver).remove$1(0, "unresolved");
+      this.ready$0(receiver);
+    },
+    ready$0: function(receiver) {
+    },
+    attached$0: function(receiver) {
+      if (receiver.polymer$Polymer$_polymer$_element == null)
+        throw H.wrapException(P.StateError$("polymerCreated was not called for custom element " + H.S(this.get$_polymer$_name(receiver)) + ", this should normally be done in the .created() if Polymer is used as a mixin."));
+      this.cancelUnbindAll$0(receiver);
+      if (!receiver.polymer$Polymer$_hasBeenAttached) {
+        receiver.polymer$Polymer$_hasBeenAttached = true;
+        this.async$1(receiver, new A.Polymer_attached_closure(receiver));
+      }
+    },
+    detached$0: function(receiver) {
+      this.asyncUnbindAll$0(receiver);
+    },
+    parseDeclarations$1: function(receiver, declaration) {
+      if (declaration != null) {
+        this.parseDeclarations$1(receiver, declaration.get$superDeclaration());
+        this.parseDeclaration$1(receiver, J.get$element$x(declaration));
+      }
+    },
+    parseDeclaration$1: function(receiver, elementElement) {
+      var t1, template, root, $name;
+      t1 = J.getInterceptor$x(elementElement);
+      template = t1.querySelector$1(elementElement, "template");
+      if (template != null) {
+        root = this.shadowFromTemplate$1(receiver, template);
+        $name = t1.get$attributes(elementElement)._html$_element.getAttribute("name");
+        if ($name == null)
+          return;
+        receiver.polymer$Polymer$shadowRoots.$indexSet(0, $name, root);
+      }
+    },
+    shadowFromTemplate$1: function(receiver, template) {
+      var root, syntax, t, dom, ext, t1;
+      if (template == null)
+        return;
+      root = this.createShadowRoot$0(receiver);
+      syntax = this.get$syntax(receiver);
+      t = !!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template);
+      dom = J.createInstance$2$x(t, receiver, syntax == null && J.get$bindingDelegate$x(t) == null ? J.get$syntax$x(receiver.polymer$Polymer$_polymer$_element) : syntax);
+      ext = $.get$_instanceExtension().$index(0, dom);
+      t1 = ext != null ? ext.get$_bindings() : ext;
+      receiver.polymer$Polymer$_observers.push(t1);
+      root.appendChild(dom);
+      this.marshalNodeReferences$1(receiver, root);
+      t1 = $.get$_PolymerGestures();
+      if (t1 != null)
+        t1.callMethod$2("register", [root]);
+      return root;
+    },
+    marshalNodeReferences$1: function(receiver, root) {
+      var t1, t2, n;
+      if (root == null)
+        return;
+      for (t1 = J.querySelectorAll$1$x(root, "[id]"), t1 = t1.get$iterator(t1), t2 = receiver.polymer$Polymer$$; t1.moveNext$0();) {
+        n = t1._current;
+        t2.$indexSet(0, J.get$id$x(n), n);
+      }
+    },
+    attributeChanged$3: function(receiver, $name, oldValue, newValue) {
+      var t1 = J.getInterceptor($name);
+      if (!t1.$eq($name, "class") && !t1.$eq($name, "style"))
+        this.attributeToProperty$2(receiver, $name, newValue);
+    },
+    copyInstanceAttributes$0: function(receiver) {
+      receiver.polymer$Polymer$_polymer$_element.get$_instanceAttributes().forEach$1(0, new A.Polymer_copyInstanceAttributes_closure(receiver));
+    },
+    takeAttributes$0: function(receiver) {
+      if (receiver.polymer$Polymer$_polymer$_element.get$_publishLC() == null)
+        return;
+      this.get$attributes(receiver).forEach$1(0, this.get$attributeToProperty(receiver));
+    },
+    attributeToProperty$2: [function(receiver, $name, value) {
+      var decl, t1, t2, currentValue, type, newValue;
+      decl = this.propertyForAttribute$1(receiver, $name);
+      if (decl == null)
+        return;
+      if (value == null || J.contains$1$asx(value, $.get$Polymer_bindPattern()) === true)
+        return;
+      t1 = J.getInterceptor$x(decl);
+      t2 = t1.get$name(decl);
+      currentValue = $.get$objectAccessor().read$2(receiver, t2);
+      type = t1.get$type(decl);
+      t2 = J.getInterceptor(type);
+      newValue = Z.deserializeValue(value, currentValue, (t2.$eq(type, C.Type_HqF) || t2.$eq(type, C.Type_dynamic)) && currentValue != null ? J.get$runtimeType$(currentValue) : type);
+      if (newValue == null ? currentValue != null : newValue !== currentValue) {
+        t1 = t1.get$name(decl);
+        $.get$objectAccessor().write$3(receiver, t1, newValue);
+      }
+    }, "call$2", "get$attributeToProperty", 4, 0, 166],
+    propertyForAttribute$1: function(receiver, $name) {
+      var publishLC = receiver.polymer$Polymer$_polymer$_element.get$_publishLC();
+      if (publishLC == null)
+        return;
+      return publishLC.$index(0, $name);
+    },
+    serializeValue$1: function(receiver, value) {
+      if (value == null)
+        return;
+      if (typeof value === "boolean")
+        return value ? "" : null;
+      else if (typeof value === "string" || typeof value === "number")
+        return H.S(value);
+      return;
+    },
+    reflectPropertyToAttribute$1: function(receiver, path) {
+      var propValue, serializedValue, t1;
+      propValue = L.PropertyPath_PropertyPath(path).getValueFrom$1(receiver);
+      serializedValue = this.serializeValue$1(receiver, propValue);
+      if (serializedValue != null)
+        this.get$attributes(receiver)._html$_element.setAttribute(path, serializedValue);
+      else if (typeof propValue === "boolean") {
+        t1 = this.get$attributes(receiver)._html$_element;
+        t1.getAttribute(path);
+        t1.removeAttribute(path);
+      }
+    },
+    bind$3$oneTime: function(receiver, $name, bindable, oneTime) {
+      var decl, t1, t2, t3, observer, reflect, propName;
+      decl = this.propertyForAttribute$1(receiver, $name);
+      if (decl == null)
+        return J.bind$3$oneTime$x(M.nodeBindFallback(receiver), $name, bindable, oneTime);
+      else {
+        t1 = J.getInterceptor$x(decl);
+        t2 = t1.get$name(decl);
+        t3 = $.get$_bindLog();
+        if (t3.isLoggable$1(C.Level_FINE_500))
+          t3.fine$1("bindProperty: [" + H.S(bindable) + "] to [" + H.S(this.get$_polymer$_name(receiver)) + "].[" + H.S(t2) + "]");
+        t3 = J.getInterceptor$x(bindable);
+        if (t3.get$value(bindable) == null)
+          t3.set$value(bindable, $.get$objectAccessor().read$2(receiver, t2));
+        observer = new A._PolymerBinding(receiver, t2, bindable, null, null);
+        observer._sub = this.get$changes(receiver).listen$1(observer.get$_propertyValueChanged());
+        t3 = J.open$1$x(bindable, observer.get$_updateNode());
+        observer._lastValue = t3;
+        $.get$objectAccessor().write$3(receiver, t2, t3);
+        if ($.enableBindingsReflection && true) {
+          if (J.get$bindings$x(M.nodeBindFallback(receiver)) == null) {
+            t2 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+            J.set$bindings$x(M.nodeBindFallback(receiver), t2);
+          }
+          J.$indexSet$ax(J.get$bindings$x(M.nodeBindFallback(receiver)), $name, observer);
+        }
+        reflect = receiver.polymer$Polymer$_polymer$_element.get$_reflect();
+        t1 = t1.get$name(decl);
+        propName = $.get$symbolConverter()._names.$index(0, t1);
+        if (reflect != null && reflect.contains$1(0, propName))
+          this.reflectPropertyToAttribute$1(receiver, propName);
+        return observer;
+      }
+    },
+    bindFinished$0: function(receiver) {
+      return this.makeElementReady$0(receiver);
+    },
+    get$bindings: function(receiver) {
+      return J.get$bindings$x(M.nodeBindFallback(receiver));
+    },
+    set$bindings: function(receiver, value) {
+      J.set$bindings$x(M.nodeBindFallback(receiver), value);
+    },
+    get$templateInstance: function(receiver) {
+      return J.get$templateInstance$x(M.nodeBindFallback(receiver));
+    },
+    asyncUnbindAll$0: function(receiver) {
+      var job, t1;
+      if (receiver.polymer$Polymer$_unbound === true)
+        return;
+      $.get$_unbindLog().fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] asyncUnbindAll");
+      job = receiver.polymer$Polymer$_unbindAllJob;
+      t1 = this.get$unbindAll(receiver);
+      if (job == null)
+        job = new A.PolymerJob(null, null, null);
+      job.start$2(0, t1, null);
+      receiver.polymer$Polymer$_unbindAllJob = job;
+    },
+    unbindAll$0: [function(receiver) {
+      if (receiver.polymer$Polymer$_unbound === true)
+        return;
+      H.IterableMixinWorkaround_forEach(receiver.polymer$Polymer$_observers, this.get$closeObserverList(receiver));
+      receiver.polymer$Polymer$_observers = [];
+      this.closeNamedObservers$0(receiver);
+      receiver.polymer$Polymer$_unbound = true;
+    }, "call$0", "get$unbindAll", 0, 0, 18],
+    cancelUnbindAll$0: function(receiver) {
+      var t1;
+      if (receiver.polymer$Polymer$_unbound === true) {
+        $.get$_unbindLog().warning$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] already unbound, cannot cancel unbindAll");
+        return;
+      }
+      $.get$_unbindLog().fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] cancelUnbindAll");
+      t1 = receiver.polymer$Polymer$_unbindAllJob;
+      if (t1 != null) {
+        t1.stop$0(0);
+        receiver.polymer$Polymer$_unbindAllJob = null;
+      }
+    },
+    createPropertyObserver$0: function(receiver) {
+      var observe, t1, o, t2, path;
+      observe = J.get$_observe$x(receiver.polymer$Polymer$_polymer$_element);
+      if (observe != null) {
+        t1 = $._Observer__nextBirthId;
+        $._Observer__nextBirthId = t1 + 1;
+        o = new L.CompoundObserver(null, [], t1, null, null, null);
+        o._path_observer$_value = [];
+        receiver.polymer$Polymer$_propertyObserver = o;
+        receiver.polymer$Polymer$_observers.push([o]);
+        for (t1 = H.setRuntimeTypeInfo(new P.HashMapKeyIterable(observe), [H.getTypeArgumentByIndex(observe, 0)]), t2 = t1._map, t1 = H.setRuntimeTypeInfo(new P.HashMapKeyIterator(t2, t2._computeKeys$0(), 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+          path = t1._collection$_current;
+          o.addPath$2(receiver, path);
+          this.observeArrayValue$3(receiver, path, path.getValueFrom$1(receiver), null);
+        }
+      }
+    },
+    notifyPropertyChanges$3: [function(receiver, newValues, oldValues, paths) {
+      J.forEach$1$ax(oldValues, new A.Polymer_notifyPropertyChanges_closure(receiver, newValues, oldValues, paths, J.get$_observe$x(receiver.polymer$Polymer$_polymer$_element), P.HashSet_HashSet(null, null, null, null)));
+    }, "call$3", "get$notifyPropertyChanges", 6, 0, 167],
+    _propertyChange$1: [function(receiver, records) {
+      var t1, record, t2, $name, reflect;
+      for (t1 = J.get$iterator$ax(records); t1.moveNext$0();) {
+        record = t1.get$current();
+        if (!J.getInterceptor(record).$isPropertyChangeRecord)
+          continue;
+        t2 = record.name;
+        $name = $.get$symbolConverter()._names.$index(0, t2);
+        reflect = receiver.polymer$Polymer$_polymer$_element.get$_reflect();
+        if (reflect != null && reflect.contains$1(0, $name))
+          this.reflectPropertyToAttribute$1(receiver, $name);
+      }
+    }, "call$1", "get$_propertyChange", 2, 0, 168, 160],
+    observeArrayValue$3: function(receiver, $name, value, old) {
+      var observe, callbacks, t1, subscription, t2;
+      observe = J.get$_observe$x(receiver.polymer$Polymer$_polymer$_element);
+      if (observe == null)
+        return;
+      callbacks = observe.$index(0, $name);
+      if (callbacks == null)
+        return;
+      if (!!J.getInterceptor(old).$isObservableList) {
+        t1 = $.get$_observeLog();
+        if (t1.isLoggable$1(C.Level_FINE_500))
+          t1.fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] observeArrayValue: unregister " + H.S($name));
+        this.closeNamedObserver$1(receiver, H.S($name) + "__array");
+      }
+      if (!!J.getInterceptor(value).$isObservableList) {
+        t1 = $.get$_observeLog();
+        if (t1.isLoggable$1(C.Level_FINE_500))
+          t1.fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] observeArrayValue: register " + H.S($name));
+        subscription = value.get$listChanges()._createSubscription$1(false);
+        subscription.onData$1(new A.Polymer_observeArrayValue_closure(receiver, old, callbacks));
+        subscription.onError$1(0, null);
+        subscription.onDone$1(null);
+        t1 = H.S($name) + "__array";
+        t2 = receiver.polymer$Polymer$_namedObservers;
+        if (t2 == null) {
+          t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.StreamSubscription);
+          receiver.polymer$Polymer$_namedObservers = t2;
+        }
+        t2.$indexSet(0, t1, subscription);
+      }
+    },
+    closeObserverList$1: [function(receiver, observers) {
+      var t1, o;
+      for (t1 = J.get$iterator$ax(observers); t1.moveNext$0();) {
+        o = t1.get$current();
+        if (o != null)
+          J.close$0$x(o);
+      }
+    }, "call$1", "get$closeObserverList", 2, 0, 169],
+    closeNamedObserver$1: function(receiver, $name) {
+      var sub = receiver.polymer$Polymer$_namedObservers.remove$1(0, $name);
+      if (sub == null)
+        return false;
+      sub.cancel$0();
+      return true;
+    },
+    closeNamedObservers$0: function(receiver) {
+      var t1, sub;
+      t1 = receiver.polymer$Polymer$_namedObservers;
+      if (t1 == null)
+        return;
+      for (t1 = t1.get$values(t1), t1 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]); t1.moveNext$0();) {
+        sub = t1._current;
+        if (sub != null)
+          sub.cancel$0();
+      }
+      receiver.polymer$Polymer$_namedObservers.clear$0(0);
+      receiver.polymer$Polymer$_namedObservers = null;
+    },
+    addHostListeners$0: function(receiver) {
+      var events, t1;
+      events = receiver.polymer$Polymer$_polymer$_element.get$_eventDelegates();
+      if (events.get$isEmpty(events))
+        return;
+      t1 = $.get$_eventsLog();
+      if (t1.isLoggable$1(C.Level_FINE_500))
+        t1.fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] addHostListeners: " + events.toString$0(0));
+      events.forEach$1(0, new A.Polymer_addHostListeners_closure(receiver));
+    },
+    dispatchMethod$3: function(receiver, object, callbackOrMethod, args) {
+      var t1, log, maxArgs, t2;
+      t1 = $.get$_eventsLog();
+      log = t1.isLoggable$1(C.Level_FINE_500);
+      if (log)
+        t1.fine$1(">>> [" + H.S(this.get$_polymer$_name(receiver)) + "]: dispatch " + H.S(callbackOrMethod));
+      if (!!J.getInterceptor(callbackOrMethod).$isFunction) {
+        maxArgs = X.maxArgs(callbackOrMethod);
+        if (maxArgs === -1)
+          t1.warning$1("invalid callback: expected callback of 0, 1, 2, or 3 arguments");
+        C.JSArray_methods.set$length(args, maxArgs);
+        H.Primitives_applyFunction(callbackOrMethod, args, P.Function__toMangledNames(null));
+      } else if (typeof callbackOrMethod === "string") {
+        t2 = $.get$symbolConverter()._symbols.$index(0, callbackOrMethod);
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(object, t2, args, true, null);
+      } else
+        t1.warning$1("invalid callback");
+      if (log)
+        t1.info$1("<<< [" + H.S(this.get$_polymer$_name(receiver)) + "]: dispatch " + H.S(callbackOrMethod));
+    },
+    async$1: function(receiver, method) {
+      var t1;
+      P.scheduleMicrotask(F.Observable_dirtyCheck$closure());
+      $.get$_Platform().callMethod$1("flush");
+      t1 = window;
+      C.Window_methods._ensureRequestAnimationFrame$0(t1);
+      return C.Window_methods._requestAnimationFrame$1(t1, W._wrapZone(method));
+    },
+    fire$5$canBubble$cancelable$detail$onNode: function(receiver, type, canBubble, cancelable, detail, onNode) {
+      var $event = W.CustomEvent_CustomEvent(type, true, true, detail);
+      this.dispatchEvent$1(receiver, $event);
+      return $event;
+    },
+    fire$1: function($receiver, type) {
+      return this.fire$5$canBubble$cancelable$detail$onNode($receiver, type, null, null, null, null);
+    },
+    $isPolymer: true,
+    $isNodeBindExtension: true,
+    $isObservable: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true
+  },
+  Polymer_attached_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      return;
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  Polymer_copyInstanceAttributes_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function($name, value) {
+      var t1 = J.get$attributes$x(this.this_0);
+      if (t1.containsKey$1($name) !== true)
+        t1.$indexSet(0, $name, new A.Polymer_copyInstanceAttributes__closure(value).call$0());
+      t1.$index(0, $name);
+    },
+    $isFunction: true
+  },
+  Polymer_copyInstanceAttributes__closure: {
+    "^": "Closure:69;value_1",
+    call$0: function() {
+      return this.value_1;
+    },
+    $isFunction: true
+  },
+  Polymer_notifyPropertyChanges_closure: {
+    "^": "Closure:75;this_0,newValues_1,oldValues_2,paths_3,observe_4,called_5",
+    call$2: [function(i, oldValue) {
+      var t1, newValue, t2, t3, path, methods, t4, t5, t6, t7, method;
+      t1 = this.newValues_1;
+      newValue = J.$index$asx(t1, i);
+      t2 = this.paths_3;
+      if (typeof i !== "number")
+        return H.iae(i);
+      t3 = 2 * i + 1;
+      if (t3 >>> 0 !== t3 || t3 >= t2.length)
+        return H.ioore(t2, t3);
+      path = t2[t3];
+      t3 = this.observe_4;
+      if (t3 == null)
+        return;
+      methods = t3.$index(0, path);
+      if (methods == null)
+        return;
+      for (t3 = J.get$iterator$ax(methods), t4 = this.this_0, t5 = J.getInterceptor$x(t4), t6 = this.oldValues_2, t7 = this.called_5; t3.moveNext$0();) {
+        method = t3.get$current();
+        if (!t7.add$1(0, method))
+          continue;
+        t5.observeArrayValue$3(t4, path, newValue, oldValue);
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(t4, method, [oldValue, newValue, t1, t6, t2], true, null);
+      }
+    }, "call$2", null, 4, 0, null, 82, 57, "call"],
+    $isFunction: true
+  },
+  Polymer_observeArrayValue_closure: {
+    "^": "Closure:13;this_0,old_1,callbacks_2",
+    call$1: [function(changes) {
+      var t1, t2, t3, callback;
+      for (t1 = J.get$iterator$ax(this.callbacks_2), t2 = this.this_0, t3 = this.old_1; t1.moveNext$0();) {
+        callback = t1.get$current();
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(t2, callback, [t3], true, null);
+      }
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  Polymer_addHostListeners_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(type, methodName) {
+      var t1 = this.this_0;
+      J.addEventListener$2$x(t1, type, J.get$syntax$x(t1.polymer$Polymer$_polymer$_element).getEventHandler$3(t1, t1, methodName));
+    },
+    $isFunction: true
+  },
+  _PolymerBinding: {
+    "^": "Bindable;_polymer$_target,_property,_polymer$_bindable,_sub,_lastValue",
+    _updateNode$1: [function(newValue) {
+      this._lastValue = newValue;
+      $.get$objectAccessor().write$3(this._polymer$_target, this._property, newValue);
+    }, "call$1", "get$_updateNode", 2, 0, 20, 58],
+    _propertyValueChanged$1: [function(records) {
+      var t1, t2, record, getter, newValue;
+      for (t1 = J.get$iterator$ax(records), t2 = this._property; t1.moveNext$0();) {
+        record = t1.get$current();
+        if (!!J.getInterceptor(record).$isPropertyChangeRecord && J.$eq(record.name, t2)) {
+          t1 = this._polymer$_target;
+          getter = $.get$objectAccessor()._getters.$index(0, t2);
+          if (getter == null)
+            H.throwExpression(O.MissingCodeException$("getter \"" + H.S(t2) + "\" in " + J.toString$0(t1)));
+          newValue = getter.call$1(t1);
+          t1 = this._lastValue;
+          if (t1 == null ? newValue != null : t1 !== newValue)
+            J.set$value$x(this._polymer$_bindable, newValue);
+          return;
+        }
+      }
+    }, "call$1", "get$_propertyValueChanged", 2, 0, 168, 160],
+    open$1: function(_, callback) {
+      return J.open$1$x(this._polymer$_bindable, callback);
+    },
+    get$value: function(_) {
+      return J.get$value$x(this._polymer$_bindable);
+    },
+    set$value: function(_, newValue) {
+      J.set$value$x(this._polymer$_bindable, newValue);
+      return newValue;
+    },
+    close$0: function(_) {
+      var t1 = this._sub;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._sub = null;
+      }
+      J.close$0$x(this._polymer$_bindable);
+    }
+  },
+  PolymerJob: {
+    "^": "Object;_callback,_timer,_polymer$_id",
+    _callback$0: function() {
+      return this._callback.call$0();
+    },
+    start$2: function(_, callback, wait) {
+      var t1;
+      this.stop$0(0);
+      this._callback = callback;
+      t1 = window;
+      C.Window_methods._ensureRequestAnimationFrame$0(t1);
+      this._polymer$_id = C.Window_methods._requestAnimationFrame$1(t1, W._wrapZone(new A.PolymerJob_start_closure(this)));
+    },
+    stop$0: function(_) {
+      var t1, t2;
+      t1 = this._polymer$_id;
+      if (t1 != null) {
+        t2 = window;
+        C.Window_methods._ensureRequestAnimationFrame$0(t2);
+        t2.cancelAnimationFrame(t1);
+        this._polymer$_id = null;
+      }
+      t1 = this._timer;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._timer = null;
+      }
+    }
+  },
+  PolymerJob_start_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      var t1 = this.this_0;
+      if (t1._timer != null || t1._polymer$_id != null) {
+        t1.stop$0(0);
+        t1._callback$0();
+      }
+      return;
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  initPolymer_closure: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.startPolymer($.initializers, $.deployMode);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _hookJsPolymer_closure: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      var t1 = $.get$Polymer__onReady().future;
+      if (t1._state !== 0)
+        H.throwExpression(P.StateError$("Future already completed"));
+      t1._asyncComplete$1(null);
+      return;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _hookJsPolymer_registerDart: {
+    "^": "Closure:173;zone_0,originalRegister_1",
+    call$3: [function(jsElem, $name, extendee) {
+      var type = $.get$_typesByName().$index(0, $name);
+      if (type != null)
+        return this.zone_0.run$1(new A._hookJsPolymer_registerDart_closure(jsElem, $name, type, $.get$_declarations().$index(0, extendee)));
+      return this.originalRegister_1.apply$2$thisArg([$name, extendee], jsElem);
+    }, "call$3", null, 6, 0, null, 171, 56, 172, "call"],
+    $isFunction: true
+  },
+  _hookJsPolymer_registerDart_closure: {
+    "^": "Closure:69;jsElem_2,name_3,type_4,extendsDecl_5",
+    call$0: [function() {
+      var t1, t2, t3, t4, t5, t6, t7, t8, t9, assetPath, base, targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery;
+      t1 = this.jsElem_2;
+      t2 = this.name_3;
+      t3 = this.type_4;
+      t4 = this.extendsDecl_5;
+      t5 = $.get$PolymerDeclaration__polymerSyntax();
+      t6 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      t7 = new A.PolymerDeclaration(t1, t3, t4, t2, null, null, null, null, null, null, null, t5, t6, null, null);
+      $.get$_declarations().$indexSet(0, t2, t7);
+      t7.publishAttributes$1(t4);
+      t8 = t7._polymer$_publish;
+      if (t8 != null)
+        t7._publishLC = t7._lowerCaseMap$1(t8);
+      t7.inferObservers$0();
+      t7.explodeObservers$0();
+      t8 = J.getInterceptor$x(t1);
+      t9 = t8.querySelector$1(t1, "template");
+      if (t9 != null)
+        J.set$bindingDelegate$x(!!J.getInterceptor(t9).$isNodeBindExtension ? t9 : M.nodeBindFallback(t9), t5);
+      t7.cacheSheets$0();
+      t7.cacheStyles$0();
+      t7.installLocalSheets$0();
+      A.Polymer_applyStyleToScope(t7.cssTextToScopeStyle$2(t7.cssTextForScope$1("global"), "global"), document.head);
+      t7.resolveElementPaths$1(t1);
+      t7.accumulateInstanceAttributes$0();
+      t7.addAttributeDelegates$1(t6);
+      assetPath = t8.get$attributes(t1)._html$_element.getAttribute("assetpath");
+      if (assetPath == null)
+        assetPath = "";
+      base = P.Uri_parse(t8.get$ownerDocument(t1).baseURI);
+      t1 = P.Uri_parse(assetPath);
+      targetScheme = t1.scheme;
+      if (targetScheme !== "") {
+        targetUserInfo = t1.userInfo;
+        targetHost = t1.get$host(t1);
+        targetPort = t1.get$port(t1);
+        targetPath = base._removeDotSegments$1(t1._path);
+        targetQuery = t1.query;
+      } else {
+        if (t1.get$host(t1) !== "") {
+          targetUserInfo = t1.userInfo;
+          targetHost = t1.get$host(t1);
+          targetPort = t1.get$port(t1);
+          targetPath = base._removeDotSegments$1(t1._path);
+          targetQuery = t1.query;
+        } else {
+          t5 = t1._path;
+          if (t5 === "") {
+            targetPath = base._path;
+            targetQuery = t1.query;
+            targetQuery = targetQuery !== "" ? targetQuery : base.query;
+          } else {
+            t5 = J.startsWith$1$s(t5, "/");
+            t6 = t1._path;
+            targetPath = t5 ? base._removeDotSegments$1(t6) : base._removeDotSegments$1(base._merge$2(base._path, t6));
+            targetQuery = t1.query;
+          }
+          targetUserInfo = base.userInfo;
+          targetHost = base.get$host(base);
+          targetPort = base.get$port(base);
+        }
+        targetScheme = base.scheme;
+      }
+      t7._rootUri = P.Uri$(t1.fragment, targetHost, targetPath, null, targetPort, targetQuery, null, targetScheme, targetUserInfo);
+      t1 = t7.get$templateContent();
+      A._shimShadowDomStyling(t1, t2, t4 != null ? J.get$name$x(t4) : null);
+      if ($.get$typeInspector().hasStaticMethod$2(t3, C.Symbol_registerCallback))
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(t3, C.Symbol_registerCallback, [t7], false, null);
+      t7.registerType$1(t2);
+      return;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  closure: {
+    "^": "Closure:69;",
+    call$0: function() {
+      var proto = J.$index$asx(P.JsObject_JsObject$fromBrowserObject(document.createElement("polymer-element", null)), "__proto__");
+      return !!J.getInterceptor(proto).$isNode ? P.JsObject_JsObject$fromBrowserObject(proto) : proto;
+    },
+    $isFunction: true
+  }
+}],
+["polymer.auto_binding", "package:polymer/auto_binding.dart", , Y, {
+  "^": "",
+  AutoBindingElement: {
+    "^": "TemplateElement_Polymer_Observable;_auto_binding$_self,observable$Observable$_observable$_changes,observable$Observable$_values,observable$Observable$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$model: function(receiver) {
+      return J.get$model$x(receiver._auto_binding$_self);
+    },
+    get$bindingDelegate: function(receiver) {
+      return J.get$bindingDelegate$x(receiver._auto_binding$_self);
+    },
+    set$bindingDelegate: function(receiver, value) {
+      J.set$bindingDelegate$x(receiver._auto_binding$_self, value);
+    },
+    clear$0: function(receiver) {
+      return J.clear$0$ax(receiver._auto_binding$_self);
+    },
+    get$syntax: function(receiver) {
+      return J.get$bindingDelegate$x(receiver._auto_binding$_self);
+    },
+    createInstance$2: function(receiver, model, delegate) {
+      return J.createInstance$2$x(receiver._auto_binding$_self, model, delegate);
+    },
+    AutoBindingElement$created$0: function(receiver) {
+      var t1;
+      this.polymerCreated$0(receiver);
+      receiver._auto_binding$_self = M.nodeBindFallback(receiver);
+      t1 = T.PolymerExpressions$(null, C.C_ScopeFactory);
+      J.set$bindingDelegate$x(receiver._auto_binding$_self, new Y._AutoBindingSyntax(receiver, t1, null));
+      $.get$Polymer__onReady().future.then$1(new Y.AutoBindingElement$created_closure(receiver));
+    },
+    $isTemplateBindExtension: true,
+    $isNodeBindExtension: true,
+    static: {AutoBindingElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.AutoBindingElement_methods.Element$created$0(receiver);
+        C.AutoBindingElement_methods.AutoBindingElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  TemplateElement_Polymer: {
+    "^": "TemplateElement+Polymer;_jsElem:polymer$Polymer$_jsElem=",
+    $isPolymer: true,
+    $isNodeBindExtension: true,
+    $isObservable: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true
+  },
+  TemplateElement_Polymer_Observable: {
+    "^": "TemplateElement_Polymer+Observable;_observable$_changes:observable$Observable$_observable$_changes%,_values:observable$Observable$_values%,_records:observable$Observable$_records%",
+    $isObservable: true
+  },
+  AutoBindingElement$created_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      var t1 = this.this_0;
+      t1.setAttribute("bind", "");
+      J.async$1$x(t1, new Y.AutoBindingElement$created__closure(t1));
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  AutoBindingElement$created__closure: {
+    "^": "Closure:13;this_1",
+    call$1: [function(_) {
+      var t1, t2;
+      t1 = this.this_1;
+      t2 = J.getInterceptor$x(t1);
+      t2.marshalNodeReferences$1(t1, t1.parentNode);
+      t2.fire$1(t1, "template-bound");
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  _AutoBindingSyntax: {
+    "^": "PolymerExpressions;_auto_binding$_node,_delegate,_bindingMaps",
+    getEventHandler$3: function(controller, target, method) {
+      var t1 = {};
+      t1.controller_0 = controller;
+      return new Y._AutoBindingSyntax_getEventHandler_closure(t1, this, method);
+    }
+  },
+  _AutoBindingSyntax_getEventHandler_closure: {
+    "^": "Closure:13;box_0,this_1,method_2",
+    call$1: [function(e) {
+      var t1, t2, controller, t3, obj, t4;
+      t1 = this.box_0;
+      t2 = t1.controller_0;
+      if (t2 == null || !J.getInterceptor(t2).$isPolymer) {
+        controller = this.this_1._auto_binding$_node;
+        t1.controller_0 = controller;
+        t2 = controller;
+      }
+      t3 = J.getInterceptor(t2);
+      if (!!t3.$isPolymer) {
+        t2 = J.getInterceptor$x(e);
+        t3 = t2.get$detail(e);
+        t2 = t2.get$currentTarget(e);
+        obj = t1.controller_0;
+        t4 = this.this_1._auto_binding$_node;
+        if (obj === t4)
+          obj = J.get$model$x(t4._auto_binding$_self);
+        J.dispatchMethod$3$x(t1.controller_0, obj, this.method_2, [e, t3, t2]);
+      } else
+        throw H.wrapException(P.StateError$("controller " + t3.toString$0(t2) + " is not a Dart polymer-element."));
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  }
+}],
+["polymer.deserialize", "package:polymer/deserialize.dart", , Z, {
+  "^": "",
+  deserializeValue: function(value, currentValue, type) {
+    var handler, t1, exception;
+    handler = $.get$_typeHandlers().$index(0, type);
+    if (handler != null)
+      return handler.call$2(value, currentValue);
+    try {
+      t1 = C.JsonCodec_null_null.decode$1(J.replaceAll$2$s(value, "'", "\""));
+      return t1;
+    } catch (exception) {
+      H.unwrapException(exception);
+      return value;
+    }
+
+  },
+  closure0: {
+    "^": "Closure:75;",
+    call$2: function(x, _) {
+      return x;
+    },
+    $isFunction: true
+  },
+  closure1: {
+    "^": "Closure:75;",
+    call$2: function(x, _) {
+      return x;
+    },
+    $isFunction: true
+  },
+  closure2: {
+    "^": "Closure:75;",
+    call$2: function(x, def) {
+      var t1, exception;
+      try {
+        t1 = P.DateTime_parse(x);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return def;
+      }
+
+    },
+    $isFunction: true
+  },
+  closure3: {
+    "^": "Closure:75;",
+    call$2: function(x, _) {
+      return !J.$eq(x, "false");
+    },
+    $isFunction: true
+  },
+  closure4: {
+    "^": "Closure:75;",
+    call$2: function(x, def) {
+      return H.Primitives_parseInt(x, null, new Z._closure0(def));
+    },
+    $isFunction: true
+  },
+  _closure0: {
+    "^": "Closure:13;def_0",
+    call$1: function(_) {
+      return this.def_0;
+    },
+    $isFunction: true
+  },
+  closure5: {
+    "^": "Closure:75;",
+    call$2: function(x, def) {
+      return H.Primitives_parseDouble(x, new Z._closure(def));
+    },
+    $isFunction: true
+  },
+  _closure: {
+    "^": "Closure:13;def_1",
+    call$1: function(_) {
+      return this.def_1;
+    },
+    $isFunction: true
+  }
+}],
+["polymer_expressions", "package:polymer_expressions/polymer_expressions.dart", , T, {
+  "^": "",
+  _classAttributeConverter: [function(v) {
+    var t1 = J.getInterceptor(v);
+    if (!!t1.$isMap)
+      t1 = J.where$1$ax(v.get$keys(), new T._classAttributeConverter_closure(v)).join$1(0, " ");
+    else
+      t1 = !!t1.$isIterable ? t1.join$1(v, " ") : v;
+    return t1;
+  }, "call$1", "_classAttributeConverter$closure", 2, 0, 49, 64],
+  _styleAttributeConverter: [function(v) {
+    var t1 = J.getInterceptor(v);
+    if (!!t1.$isMap)
+      t1 = J.map$1$ax(v.get$keys(), new T._styleAttributeConverter_closure(v)).join$1(0, ";");
+    else
+      t1 = !!t1.$isIterable ? t1.join$1(v, ";") : v;
+    return t1;
+  }, "call$1", "_styleAttributeConverter$closure", 2, 0, 49, 64],
+  _identity: [function(x) {
+    return x;
+  }, "call$1", "_identity$closure", 2, 0, 13, 65],
+  _classAttributeConverter_closure: {
+    "^": "Closure:13;v_0",
+    call$1: function(k) {
+      return J.$eq(this.v_0.$index(0, k), true);
+    },
+    $isFunction: true
+  },
+  _styleAttributeConverter_closure: {
+    "^": "Closure:13;v_0",
+    call$1: [function(k) {
+      return H.S(k) + ": " + H.S(this.v_0.$index(0, k));
+    }, "call$1", null, 2, 0, null, 174, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions0: {
+    "^": "BindingDelegate;_scopeFactory,globals,_scopes,_scopeIdents,_bindingMaps",
+    prepareBinding$3: function(path, $name, boundNode) {
+      var t1, t2, t3, expr;
+      t1 = {};
+      t2 = new Y.Tokenizer(H.setRuntimeTypeInfo([], [Y.Token]), P.StringBuffer$(""), new P.RuneIterator(path, 0, 0, null), null);
+      t3 = new U.AstFactory();
+      t3 = new T.Parser(t3, t2, null, null);
+      t2 = t2.tokenize$0();
+      t3._tokens = t2;
+      t3._parser$_iterator = H.setRuntimeTypeInfo(new H.ListIterator(t2, t2.length, 0, null), [H.getTypeArgumentByIndex(t2, 0)]);
+      t3._advance$0();
+      expr = t3._parseExpression$0();
+      if (M.isSemanticTemplate(boundNode)) {
+        t2 = J.getInterceptor($name);
+        t2 = t2.$eq($name, "bind") || t2.$eq($name, "repeat");
+      } else
+        t2 = false;
+      if (t2) {
+        t1 = J.getInterceptor(expr);
+        if (!!t1.$isHasIdentifier)
+          return new T.PolymerExpressions_prepareBinding_closure(this, expr.get$identifier(), t1.get$expr(expr));
+        else
+          return new T.PolymerExpressions_prepareBinding_closure0(this, expr);
+      }
+      t1.converter_0 = null;
+      t2 = !!J.getInterceptor(boundNode).$isElement;
+      if (t2 && J.$eq($name, "class"))
+        t1.converter_0 = T._classAttributeConverter$closure();
+      else if (t2 && J.$eq($name, "style"))
+        t1.converter_0 = T._styleAttributeConverter$closure();
+      return new T.PolymerExpressions_prepareBinding_closure1(t1, this, expr);
+    },
+    prepareInstanceModel$1: function(template) {
+      var ident = this._scopeIdents.$index(0, template);
+      if (ident == null)
+        return new T.PolymerExpressions_prepareInstanceModel_closure(this, template);
+      return new T.PolymerExpressions_prepareInstanceModel_closure0(this, template, ident);
+    },
+    _getParentScope$1: function(node) {
+      var t1, $parent, templateExtension, templateInstance, model;
+      t1 = J.getInterceptor$x(node);
+      $parent = t1.get$parentNode(node);
+      if ($parent == null)
+        return;
+      if (M.isSemanticTemplate(node)) {
+        templateExtension = !!t1.$isNodeBindExtension ? node : M.nodeBindFallback(node);
+        t1 = J.getInterceptor$x(templateExtension);
+        templateInstance = t1.get$templateInstance(templateExtension);
+        model = templateInstance == null ? t1.get$model(templateExtension) : templateInstance.model;
+        if (!!J.getInterceptor(model).$isScope)
+          return model;
+        else
+          return this._scopes.$index(0, node);
+      }
+      return this._getParentScope$1($parent);
+    },
+    _getScopeForModel$2: function(node, model) {
+      var t1, t2;
+      if (node == null)
+        return K.Scope_Scope(model, this.globals);
+      t1 = J.getInterceptor(node);
+      if (!!t1.$isElement)
+        ;
+      if (!!J.getInterceptor(model).$isScope)
+        return model;
+      t2 = this._scopes;
+      if (t2.$index(0, node) != null) {
+        t2.$index(0, node);
+        return t2.$index(0, node);
+      } else if (t1.get$parentNode(node) != null)
+        return this._getContainingScope$2(t1.get$parentNode(node), model);
+      else {
+        if (!M.isSemanticTemplate(node))
+          throw H.wrapException("expected a template instead of " + H.S(node));
+        return this._getContainingScope$2(node, model);
+      }
+    },
+    _getContainingScope$2: function(node, model) {
+      var templateExtension, t1, scope;
+      if (M.isSemanticTemplate(node)) {
+        templateExtension = !!J.getInterceptor(node).$isNodeBindExtension ? node : M.nodeBindFallback(node);
+        t1 = J.getInterceptor$x(templateExtension);
+        if (t1.get$templateInstance(templateExtension) == null)
+          t1.get$model(templateExtension);
+        return this._scopes.$index(0, node);
+      } else {
+        t1 = J.getInterceptor$x(node);
+        if (t1.get$parent(node) == null) {
+          scope = this._scopes.$index(0, node);
+          return scope != null ? scope : K.Scope_Scope(model, this.globals);
+        } else
+          return this._getContainingScope$2(t1.get$parentNode(node), model);
+      }
+    },
+    static: {"^": "PolymerExpressions_DEFAULT_GLOBALS", PolymerExpressions$: function(globals, scopeFactory) {
+        var t1, t2, t3;
+        t1 = H.setRuntimeTypeInfo(new P.Expando(null), [K.Scope]);
+        t2 = H.setRuntimeTypeInfo(new P.Expando(null), [P.String]);
+        t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Object);
+        t3.addAll$1(0, C.Map_wgEsG);
+        return new T.PolymerExpressions0(scopeFactory, t3, t1, t2, null);
+      }}
+  },
+  PolymerExpressions_prepareBinding_closure: {
+    "^": "Closure:175;this_1,identifier_2,bindExpr_3",
+    call$3: [function(model, node, oneTime) {
+      var t1, scope;
+      t1 = this.this_1;
+      t1._scopeIdents.$indexSet(0, node, this.identifier_2);
+      scope = !!J.getInterceptor(model).$isScope ? model : K.Scope_Scope(model, t1.globals);
+      t1._scopes.$indexSet(0, node, scope);
+      t1 = T._identity$closure();
+      return new T._Binding(scope, t1, this.bindExpr_3, null, null, null, null);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareBinding_closure0: {
+    "^": "Closure:175;this_4,expr_5",
+    call$3: [function(model, node, oneTime) {
+      var t1, scope;
+      t1 = this.this_4;
+      scope = !!J.getInterceptor(model).$isScope ? model : K.Scope_Scope(model, t1.globals);
+      t1._scopes.$indexSet(0, node, scope);
+      if (oneTime === true)
+        return T._Binding__oneTime(this.expr_5, scope, null);
+      t1 = T._identity$closure();
+      return new T._Binding(scope, t1, this.expr_5, null, null, null, null);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareBinding_closure1: {
+    "^": "Closure:175;box_0,this_6,expr_7",
+    call$3: [function(model, node, oneTime) {
+      var scope, t1;
+      scope = this.this_6._getScopeForModel$2(node, model);
+      if (oneTime === true)
+        return T._Binding__oneTime(this.expr_7, scope, this.box_0.converter_0);
+      t1 = this.box_0.converter_0;
+      if (t1 == null)
+        t1 = T._identity$closure();
+      return new T._Binding(scope, t1, this.expr_7, null, null, null, null);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareInstanceModel_closure: {
+    "^": "Closure:13;this_0,template_1",
+    call$1: [function(model) {
+      var t1, t2, existingScope;
+      t1 = this.this_0;
+      t2 = this.template_1;
+      existingScope = t1._scopes.$index(0, t2);
+      if (existingScope != null) {
+        if (J.$eq(model, J.get$model$x(existingScope)))
+          return existingScope;
+        return K.Scope_Scope(model, t1.globals);
+      } else
+        return t1._getScopeForModel$2(t2, model);
+    }, "call$1", null, 2, 0, null, 162, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareInstanceModel_closure0: {
+    "^": "Closure:13;this_2,template_3,ident_4",
+    call$1: [function(model) {
+      var t1, t2, existingScope, t3;
+      t1 = this.this_2;
+      t2 = this.template_3;
+      existingScope = t1._scopes.$index(0, t2);
+      t3 = this.ident_4;
+      if (existingScope != null)
+        return existingScope.childScope$2(t3, model);
+      else
+        return t1._getParentScope$1(t2).childScope$2(t3, model);
+    }, "call$1", null, 2, 0, null, 162, "call"],
+    $isFunction: true
+  },
+  _Binding: {
+    "^": "Bindable;_scope,_converter,_polymer_expressions$_expr,_polymer_expressions$_callback,_polymer_expressions$_sub,_observer,_polymer_expressions$_value",
+    _converter$1: function(arg0) {
+      return this._converter.call$1(arg0);
+    },
+    _polymer_expressions$_callback$1: function(arg0) {
+      return this._polymer_expressions$_callback.call$1(arg0);
+    },
+    _polymer_expressions$_check$2$skipChanges: [function(v, skipChanges) {
+      var oldValue, t1;
+      oldValue = this._polymer_expressions$_value;
+      t1 = this._converter$1(v);
+      this._polymer_expressions$_value = t1;
+      if (skipChanges !== true && this._polymer_expressions$_callback != null && !J.$eq(oldValue, t1))
+        this._polymer_expressions$_callback$1(this._polymer_expressions$_value);
+    }, function(v) {
+      return this._polymer_expressions$_check$2$skipChanges(v, false);
+    }, "_polymer_expressions$_check$1", "call$2$skipChanges", "call$1", "get$_polymer_expressions$_check", 2, 3, 176, 177, 64, 178],
+    get$value: function(_) {
+      if (this._polymer_expressions$_callback != null)
+        return this._polymer_expressions$_value;
+      return T._Binding__oneTime(this._polymer_expressions$_expr, this._scope, this._converter);
+    },
+    set$value: function(_, v) {
+      var newValue, e, s, exception, t1;
+      try {
+        newValue = K.assign(this._polymer_expressions$_expr, v, this._scope, false);
+        this._polymer_expressions$_check$2$skipChanges(newValue, true);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(this._polymer_expressions$_expr) + "': " + H.S(e), s);
+      }
+
+    },
+    open$1: function(_, callback) {
+      var e, s, t1, observer, exception;
+      if (this._polymer_expressions$_callback != null)
+        throw H.wrapException(P.StateError$("already open"));
+      this._polymer_expressions$_callback = callback;
+      t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [null]);
+      t1.ListQueue$1(null, null);
+      observer = this._polymer_expressions$_expr.accept$1(0, new K.ObserverBuilder(t1));
+      this._observer = observer;
+      t1 = observer.get$onUpdate().listen$1(this.get$_polymer_expressions$_check());
+      t1.onError$1(0, new T._Binding_open_closure(this));
+      this._polymer_expressions$_sub = t1;
+      try {
+        t1 = this._observer;
+        J.accept$1$x(t1, new K.Updater(this._scope));
+        t1.get$currentValue();
+        this._polymer_expressions$_check$2$skipChanges(this._observer.get$currentValue(), true);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(this._observer) + "': " + H.S(e), s);
+      }
+
+      return this._polymer_expressions$_value;
+    },
+    close$0: function(_) {
+      var t1, t2;
+      if (this._polymer_expressions$_callback == null)
+        return;
+      this._polymer_expressions$_sub.cancel$0();
+      this._polymer_expressions$_sub = null;
+      this._polymer_expressions$_callback = null;
+      t1 = $.get$Closer__instance();
+      t2 = this._observer;
+      t1.toString;
+      J.accept$1$x(t2, t1);
+      this._observer = null;
+    },
+    static: {_Binding__oneTime: function(expr, scope, converter) {
+        var value, e, s, t1, exception;
+        try {
+          value = J.accept$1$x(expr, new K.EvalVisitor(scope));
+          t1 = converter == null ? value : converter.call$1(value);
+          return t1;
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          s = new H._StackTrace(exception, null);
+          H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(expr) + "': " + H.S(e), s);
+        }
+
+        return;
+      }}
+  },
+  _Binding_open_closure: {
+    "^": "Closure:75;this_0",
+    call$2: [function(e, s) {
+      H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(this.this_0._observer) + "': " + H.S(e), s);
+    }, "call$2", null, 4, 0, null, 1, 142, "call"],
+    $isFunction: true
+  },
+  ScopeFactory: {
+    "^": "Object;"
+  }
+}],
+["polymer_expressions.async", "package:polymer_expressions/async.dart", , B, {
+  "^": "",
+  StreamBinding: {
+    "^": "ObservableBox;stream,_observable_box$_value,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    StreamBinding$1: function(stream, $T) {
+      this.stream.listen$1(new B.StreamBinding_closure($T, this));
+    },
+    $asObservableBox: function($T) {
+      return [null];
+    },
+    static: {StreamBinding$: function(stream, $T) {
+        var t1 = H.setRuntimeTypeInfo(new B.StreamBinding(stream, null, null, null), [$T]);
+        t1.StreamBinding$1(stream, $T);
+        return t1;
+      }}
+  },
+  StreamBinding_closure: {
+    "^": "Closure;T_0,this_1",
+    call$1: [function(i) {
+      var t1 = this.this_1;
+      t1._observable_box$_value = F.notifyPropertyChangeHelper(t1, C.Symbol_value, t1._observable_box$_value, i);
+    }, "call$1", null, 2, 0, null, 82, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T0", args: [T]};
+      }, this.this_1, "StreamBinding");
+    }
+  }
+}],
+["polymer_expressions.eval", "package:polymer_expressions/eval.dart", , K, {
+  "^": "",
+  assign: function(expr, value, scope, checkAssignability) {
+    var filters, t1, property, expression, isIndex, filterExpr, o;
+    filters = H.setRuntimeTypeInfo([], [U.Expression]);
+    for (; t1 = J.getInterceptor(expr), !!t1.$isBinaryOperator;) {
+      if (!J.$eq(t1.get$operator(expr), "|"))
+        break;
+      filters.push(t1.get$right(expr));
+      expr = t1.get$left(expr);
+    }
+    if (!!t1.$isIdentifier) {
+      property = t1.get$value(expr);
+      expression = C.C_EmptyExpression;
+      isIndex = false;
+    } else if (!!t1.$isIndex) {
+      expression = expr.get$receiver();
+      property = expr.get$argument();
+      isIndex = true;
+    } else {
+      if (!!t1.$isGetter) {
+        expression = expr.get$receiver();
+        property = t1.get$name(expr);
+      } else {
+        if (checkAssignability)
+          throw H.wrapException(K.EvalException$("Expression is not assignable: " + H.S(expr)));
+        return;
+      }
+      isIndex = false;
+    }
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(filters, filters.length, 0, null), [H.getTypeArgumentByIndex(filters, 0)]); t1.moveNext$0();) {
+      filterExpr = t1._current;
+      J.accept$1$x(filterExpr, new K.EvalVisitor(scope));
+      if (checkAssignability)
+        throw H.wrapException(K.EvalException$("filter must implement Transformer to be assignable: " + H.S(filterExpr)));
+      else
+        return;
+    }
+    o = J.accept$1$x(expression, new K.EvalVisitor(scope));
+    if (o == null)
+      return;
+    if (isIndex)
+      J.$indexSet$ax(o, J.accept$1$x(property, new K.EvalVisitor(scope)), value);
+    else {
+      t1 = $.get$symbolConverter()._symbols.$index(0, property);
+      $.get$objectAccessor().write$3(o, t1, value);
+    }
+    return value;
+  },
+  Scope_Scope: function(model, variables) {
+    var scope, t1, t2;
+    scope = new K._ModelScope(model);
+    if (variables == null)
+      t1 = scope;
+    else {
+      t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Object);
+      t1.addAll$1(0, variables);
+      t2 = new K._GlobalsScope(scope, t1);
+      if (t1.containsKey$1("this"))
+        H.throwExpression(K.EvalException$("'this' cannot be used as a variable name."));
+      t1 = t2;
+    }
+    return t1;
+  },
+  closure14: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$add$ns(a, b);
+    },
+    $isFunction: true
+  },
+  closure15: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$sub$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure16: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$mul$ns(a, b);
+    },
+    $isFunction: true
+  },
+  closure17: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$div$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure18: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$mod$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure19: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$eq(a, b);
+    },
+    $isFunction: true
+  },
+  closure20: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return !J.$eq(a, b);
+    },
+    $isFunction: true
+  },
+  closure21: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a == null ? b == null : a === b;
+    },
+    $isFunction: true
+  },
+  closure22: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a == null ? b != null : a !== b;
+    },
+    $isFunction: true
+  },
+  closure23: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$gt$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure24: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$ge$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure25: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$lt$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure26: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$le$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure27: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a === true || b === true;
+    },
+    $isFunction: true
+  },
+  closure28: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a === true && b === true;
+    },
+    $isFunction: true
+  },
+  closure29: {
+    "^": "Closure:75;",
+    call$2: function(a, f) {
+      var t1 = H.buildInterfaceType(P.Object);
+      t1 = H.buildFunctionType(t1, [t1])._isTest$1(f);
+      if (t1)
+        return f.call$1(a);
+      throw H.wrapException(K.EvalException$("Filters must be a one-argument function."));
+    },
+    $isFunction: true
+  },
+  closure11: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return a;
+    },
+    $isFunction: true
+  },
+  closure12: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return J.$negate$n(a);
+    },
+    $isFunction: true
+  },
+  closure13: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return a !== true;
+    },
+    $isFunction: true
+  },
+  Scope: {
+    "^": "Object;",
+    $indexSet: function(_, $name, value) {
+      throw H.wrapException(P.UnsupportedError$("[]= is not supported in Scope."));
+    },
+    childScope$2: function($name, value) {
+      if (J.$eq($name, "this"))
+        H.throwExpression(K.EvalException$("'this' cannot be used as a variable name."));
+      return new K._LocalVariableScope(this, $name, value);
+    },
+    $isScope: true,
+    $isIndexable: true,
+    $asIndexable: function() {
+      return [P.String, P.Object];
+    }
+  },
+  _ModelScope: {
+    "^": "Scope;model>",
+    $index: function(_, $name) {
+      var symbol, t1;
+      if (J.$eq($name, "this"))
+        return this.model;
+      symbol = $.get$symbolConverter()._symbols.$index(0, $name);
+      t1 = this.model;
+      if (t1 == null || symbol == null)
+        throw H.wrapException(K.EvalException$("variable '" + H.S($name) + "' not found"));
+      t1 = $.get$objectAccessor().read$2(t1, symbol);
+      return !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+    },
+    _isModelProperty$1: function($name) {
+      return !J.$eq($name, "this");
+    },
+    toString$0: function(_) {
+      return "[model: " + H.S(this.model) + "]";
+    }
+  },
+  _LocalVariableScope: {
+    "^": "Scope;parent>,varName,value>",
+    get$model: function(_) {
+      var t1 = this.parent;
+      t1 = t1.get$model(t1);
+      return t1;
+    },
+    $index: function(_, $name) {
+      var t1;
+      if (J.$eq(this.varName, $name)) {
+        t1 = this.value;
+        return !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+      }
+      return this.parent.$index(0, $name);
+    },
+    _isModelProperty$1: function($name) {
+      if (J.$eq(this.varName, $name))
+        return false;
+      return this.parent._isModelProperty$1($name);
+    },
+    toString$0: function(_) {
+      return this.parent.toString$0(0) + " > [local: " + H.S(this.varName) + "]";
+    }
+  },
+  _GlobalsScope: {
+    "^": "Scope;parent>,variables<",
+    get$model: function(_) {
+      return this.parent.model;
+    },
+    $index: function(_, $name) {
+      var t1 = this.variables;
+      if (t1.containsKey$1($name)) {
+        t1 = t1.$index(0, $name);
+        return !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+      }
+      return this.parent.$index(0, $name);
+    },
+    _isModelProperty$1: function($name) {
+      if (this.variables.containsKey$1($name))
+        return false;
+      return !J.$eq($name, "this");
+    },
+    toString$0: function(_) {
+      var t1 = this.variables;
+      return "[model: " + H.S(this.parent.model) + "] > [global: " + P.IterableBase_iterableToShortString(H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(t1), [H.getTypeArgumentByIndex(t1, 0)]), "(", ")") + "]";
+    }
+  },
+  ExpressionObserver: {
+    "^": "Object;_parent?,_eval$_value<",
+    get$onUpdate: function() {
+      var t1 = this._eval$_controller;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$currentValue: function() {
+      return this._eval$_value;
+    },
+    _updateSelf$1: function(scope) {
+    },
+    _invalidate$1: function(scope) {
+      var t1;
+      this._eval$_observe$1(0, scope);
+      t1 = this._parent;
+      if (t1 != null)
+        t1._invalidate$1(scope);
+    },
+    _eval$_unobserve$0: function() {
+      var t1 = this._eval$_subscription;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._eval$_subscription = null;
+      }
+    },
+    _eval$_observe$1: function(_, scope) {
+      var _oldValue, t1, t2;
+      this._eval$_unobserve$0();
+      _oldValue = this._eval$_value;
+      this._updateSelf$1(scope);
+      t1 = this._eval$_value;
+      if (t1 == null ? _oldValue != null : t1 !== _oldValue) {
+        t2 = this._eval$_controller;
+        if (t2._state >= 4)
+          H.throwExpression(t2._addEventError$0());
+        t2._sendData$1(t1);
+      }
+    },
+    toString$0: function(_) {
+      return this._eval$_expr.toString$0(0);
+    },
+    $isExpression: true
+  },
+  Updater: {
+    "^": "RecursiveVisitor;scope",
+    visitExpression$1: function(e) {
+      e._eval$_observe$1(0, this.scope);
+    }
+  },
+  Closer: {
+    "^": "RecursiveVisitor;",
+    visitExpression$1: function(e) {
+      e._eval$_unobserve$0();
+    },
+    static: {"^": "Closer__instance"}
+  },
+  EvalVisitor: {
+    "^": "Visitor;scope",
+    visitEmptyExpression$1: function(e) {
+      return J.get$model$x(this.scope);
+    },
+    visitParenthesizedExpression$1: function(e) {
+      return e.child.accept$1(0, this);
+    },
+    visitGetter$1: function(g) {
+      var receiver, t1, symbol;
+      receiver = J.accept$1$x(g.get$receiver(), this);
+      if (receiver == null)
+        return;
+      t1 = g.get$name(g);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      return $.get$objectAccessor().read$2(receiver, symbol);
+    },
+    visitIndex$1: function(i) {
+      var receiver = J.accept$1$x(i.get$receiver(), this);
+      if (receiver == null)
+        return;
+      return J.$index$asx(receiver, J.accept$1$x(i.get$argument(), this));
+    },
+    visitInvoke$1: function(i) {
+      var receiver, args, t1, t2, symbol;
+      receiver = J.accept$1$x(i.get$receiver(), this);
+      if (receiver == null)
+        return;
+      if (i.get$arguments() == null)
+        args = null;
+      else {
+        t1 = i.get$arguments();
+        t2 = this.get$visit();
+        t1.toString;
+        args = H.setRuntimeTypeInfo(new H.MappedListIterable(t1, t2), [null, null]).toList$1$growable(0, false);
+      }
+      if (i.get$method(i) == null)
+        return H.Primitives_applyFunction(receiver, args, P.Function__toMangledNames(null));
+      t1 = i.get$method(i);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      return $.get$objectAccessor().invoke$5$adjust$namedArgs(receiver, symbol, args, false, null);
+    },
+    visitLiteral$1: function(l) {
+      return l.get$value(l);
+    },
+    visitListLiteral$1: function(l) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(l.get$items(), this.get$visit()), [null, null]).toList$0(0);
+    },
+    visitMapLiteral$1: function(l) {
+      var map, t1, entry;
+      map = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      for (t1 = l.get$entries(l), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        entry = t1._current;
+        map.$indexSet(0, J.accept$1$x(J.get$key$x(entry), this), J.accept$1$x(entry.get$entryValue(), this));
+      }
+      return map;
+    },
+    visitMapLiteralEntry$1: function(e) {
+      return H.throwExpression(P.UnsupportedError$("should never be called"));
+    },
+    visitIdentifier$1: function(i) {
+      return J.$index$asx(this.scope, i.get$value(i));
+    },
+    visitBinaryOperator$1: function(o) {
+      var operator, left, right, f, t1;
+      operator = o.get$operator(o);
+      left = J.accept$1$x(o.get$left(o), this);
+      right = J.accept$1$x(o.get$right(o), this);
+      f = $.get$_BINARY_OPERATORS().$index(0, operator);
+      t1 = J.getInterceptor(operator);
+      if (t1.$eq(operator, "&&") || t1.$eq(operator, "||")) {
+        t1 = left == null ? false : left;
+        return f.call$2(t1, right == null ? false : right);
+      } else if (t1.$eq(operator, "==") || t1.$eq(operator, "!="))
+        return f.call$2(left, right);
+      else if (left == null || right == null)
+        return;
+      return f.call$2(left, right);
+    },
+    visitUnaryOperator$1: function(o) {
+      var expr, f;
+      expr = J.accept$1$x(o.get$child(), this);
+      f = $.get$_UNARY_OPERATORS().$index(0, o.get$operator(o));
+      if (J.$eq(o.get$operator(o), "!"))
+        return f.call$1(expr == null ? false : expr);
+      return expr == null ? null : f.call$1(expr);
+    },
+    visitTernaryOperator$1: function(o) {
+      return J.$eq(J.accept$1$x(o.get$condition(), this), true) ? J.accept$1$x(o.get$trueExpr(), this) : J.accept$1$x(o.get$falseExpr(), this);
+    },
+    visitInExpression$1: function(i) {
+      return H.throwExpression(P.UnsupportedError$("can't eval an 'in' expression"));
+    },
+    visitAsExpression$1: function(i) {
+      return H.throwExpression(P.UnsupportedError$("can't eval an 'as' expression"));
+    }
+  },
+  ObserverBuilder: {
+    "^": "Visitor;parents",
+    visitEmptyExpression$1: function(e) {
+      return new K.EmptyObserver(e, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+    },
+    visitParenthesizedExpression$1: function(e) {
+      return e.child.accept$1(0, this);
+    },
+    visitGetter$1: function(g) {
+      var receiver, getter;
+      receiver = J.accept$1$x(g.get$receiver(), this);
+      getter = new K.GetterObserver(receiver, g, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      receiver.set$_parent(getter);
+      return getter;
+    },
+    visitIndex$1: function(i) {
+      var receiver, arg, index;
+      receiver = J.accept$1$x(i.get$receiver(), this);
+      arg = J.accept$1$x(i.get$argument(), this);
+      index = new K.IndexObserver(receiver, arg, i, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      receiver.set$_parent(index);
+      arg.set$_parent(index);
+      return index;
+    },
+    visitInvoke$1: function(i) {
+      var receiver, args, t1, t2, invoke;
+      receiver = J.accept$1$x(i.get$receiver(), this);
+      if (i.get$arguments() == null)
+        args = null;
+      else {
+        t1 = i.get$arguments();
+        t2 = this.get$visit();
+        t1.toString;
+        args = H.setRuntimeTypeInfo(new H.MappedListIterable(t1, t2), [null, null]).toList$1$growable(0, false);
+      }
+      invoke = new K.InvokeObserver(receiver, args, i, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      receiver.set$_parent(invoke);
+      if (args != null)
+        H.IterableMixinWorkaround_forEach(args, new K.ObserverBuilder_visitInvoke_closure(invoke));
+      return invoke;
+    },
+    visitLiteral$1: function(l) {
+      return new K.LiteralObserver(l, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+    },
+    visitListLiteral$1: function(l) {
+      var items, list;
+      items = H.setRuntimeTypeInfo(new H.MappedListIterable(l.get$items(), this.get$visit()), [null, null]).toList$1$growable(0, false);
+      list = new K.ListLiteralObserver(items, l, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      H.IterableMixinWorkaround_forEach(items, new K.ObserverBuilder_visitListLiteral_closure(list));
+      return list;
+    },
+    visitMapLiteral$1: function(l) {
+      var entries, map;
+      entries = H.setRuntimeTypeInfo(new H.MappedListIterable(l.get$entries(l), this.get$visit()), [null, null]).toList$1$growable(0, false);
+      map = new K.MapLiteralObserver(entries, l, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      H.IterableMixinWorkaround_forEach(entries, new K.ObserverBuilder_visitMapLiteral_closure(map));
+      return map;
+    },
+    visitMapLiteralEntry$1: function(e) {
+      var key, value, entry;
+      key = J.accept$1$x(e.get$key(e), this);
+      value = J.accept$1$x(e.get$entryValue(), this);
+      entry = new K.MapLiteralEntryObserver(key, value, e, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      key.set$_parent(entry);
+      value.set$_parent(entry);
+      return entry;
+    },
+    visitIdentifier$1: function(i) {
+      return new K.IdentifierObserver(i, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+    },
+    visitBinaryOperator$1: function(o) {
+      var left, right, binary;
+      left = J.accept$1$x(o.get$left(o), this);
+      right = J.accept$1$x(o.get$right(o), this);
+      binary = new K.BinaryObserver(left, right, o, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      left.set$_parent(binary);
+      right.set$_parent(binary);
+      return binary;
+    },
+    visitUnaryOperator$1: function(o) {
+      var expr, unary;
+      expr = J.accept$1$x(o.get$child(), this);
+      unary = new K.UnaryObserver(expr, o, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      expr.set$_parent(unary);
+      return unary;
+    },
+    visitTernaryOperator$1: function(o) {
+      var condition, trueExpr, falseExpr, ternary;
+      condition = J.accept$1$x(o.get$condition(), this);
+      trueExpr = J.accept$1$x(o.get$trueExpr(), this);
+      falseExpr = J.accept$1$x(o.get$falseExpr(), this);
+      ternary = new K.TernaryObserver(condition, trueExpr, falseExpr, o, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      condition.set$_parent(ternary);
+      trueExpr.set$_parent(ternary);
+      falseExpr.set$_parent(ternary);
+      return ternary;
+    },
+    visitInExpression$1: function(i) {
+      throw H.wrapException(P.UnsupportedError$("can't eval an 'in' expression"));
+    },
+    visitAsExpression$1: function(i) {
+      throw H.wrapException(P.UnsupportedError$("can't eval an 'as' expression"));
+    }
+  },
+  ObserverBuilder_visitInvoke_closure: {
+    "^": "Closure:13;invoke_0",
+    call$1: function(a) {
+      var t1 = this.invoke_0;
+      a.set$_parent(t1);
+      return t1;
+    },
+    $isFunction: true
+  },
+  ObserverBuilder_visitListLiteral_closure: {
+    "^": "Closure:13;list_0",
+    call$1: function(e) {
+      var t1 = this.list_0;
+      e.set$_parent(t1);
+      return t1;
+    },
+    $isFunction: true
+  },
+  ObserverBuilder_visitMapLiteral_closure: {
+    "^": "Closure:13;map_0",
+    call$1: function(e) {
+      var t1 = this.map_0;
+      e.set$_parent(t1);
+      return t1;
+    },
+    $isFunction: true
+  },
+  EmptyObserver: {
+    "^": "ExpressionObserver;_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      this._eval$_value = J.get$model$x(scope);
+    },
+    accept$1: function(_, v) {
+      return v.visitEmptyExpression$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.EmptyExpression];
+    },
+    $isEmptyExpression: true,
+    $isExpression: true
+  },
+  LiteralObserver: {
+    "^": "ExpressionObserver;_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$value: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$value(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1 = this._eval$_expr;
+      this._eval$_value = t1.get$value(t1);
+    },
+    accept$1: function(_, v) {
+      return v.visitLiteral$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Literal];
+    },
+    $asLiteral: function() {
+      return [null];
+    },
+    $isLiteral: true,
+    $isExpression: true
+  },
+  ListLiteralObserver: {
+    "^": "ExpressionObserver;items<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      this._eval$_value = H.setRuntimeTypeInfo(new H.MappedListIterable(this.items, new K.ListLiteralObserver__updateSelf_closure()), [null, null]).toList$0(0);
+    },
+    accept$1: function(_, v) {
+      return v.visitListLiteral$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.ListLiteral];
+    },
+    $isListLiteral: true,
+    $isExpression: true
+  },
+  ListLiteralObserver__updateSelf_closure: {
+    "^": "Closure:13;",
+    call$1: [function(i) {
+      return i.get$_eval$_value();
+    }, "call$1", null, 2, 0, null, 82, "call"],
+    $isFunction: true
+  },
+  MapLiteralObserver: {
+    "^": "ExpressionObserver;entries>,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      this._eval$_value = H.IterableMixinWorkaround_fold(this.entries, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null), new K.MapLiteralObserver__updateSelf_closure());
+    },
+    accept$1: function(_, v) {
+      return v.visitMapLiteral$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.MapLiteral];
+    },
+    $isMapLiteral: true,
+    $isExpression: true
+  },
+  MapLiteralObserver__updateSelf_closure: {
+    "^": "Closure:75;",
+    call$2: function(m, e) {
+      J.$indexSet$ax(m, J.get$key$x(e).get$_eval$_value(), e.get$entryValue().get$_eval$_value());
+      return m;
+    },
+    $isFunction: true
+  },
+  MapLiteralEntryObserver: {
+    "^": "ExpressionObserver;key>,entryValue<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    accept$1: function(_, v) {
+      return v.visitMapLiteralEntry$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.MapLiteralEntry];
+    },
+    $isMapLiteralEntry: true,
+    $isExpression: true
+  },
+  IdentifierObserver: {
+    "^": "ExpressionObserver;_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$value: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$value(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, t2, model, symbol;
+      t1 = this._eval$_expr;
+      t2 = J.getInterceptor$asx(scope);
+      this._eval$_value = t2.$index(scope, t1.get$value(t1));
+      if (!scope._isModelProperty$1(t1.get$value(t1)))
+        return;
+      model = t2.get$model(scope);
+      t2 = J.getInterceptor(model);
+      if (!t2.$isObservable)
+        return;
+      t1 = t1.get$value(t1);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      this._eval$_subscription = t2.get$changes(model).listen$1(new K.IdentifierObserver__updateSelf_closure(this, scope, symbol));
+    },
+    accept$1: function(_, v) {
+      return v.visitIdentifier$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Identifier];
+    },
+    $isIdentifier: true,
+    $isExpression: true
+  },
+  IdentifierObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1,symbol_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.IdentifierObserver__updateSelf__closure(this.symbol_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  IdentifierObserver__updateSelf__closure: {
+    "^": "Closure:13;symbol_3",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isPropertyChangeRecord && J.$eq(c.name, this.symbol_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  UnaryObserver: {
+    "^": "ExpressionObserver;child<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$operator: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$operator(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, f;
+      t1 = this._eval$_expr;
+      f = $.get$_UNARY_OPERATORS().$index(0, t1.get$operator(t1));
+      if (J.$eq(t1.get$operator(t1), "!")) {
+        t1 = this.child.get$_eval$_value();
+        this._eval$_value = f.call$1(t1 == null ? false : t1);
+      } else {
+        t1 = this.child;
+        this._eval$_value = t1.get$_eval$_value() == null ? null : f.call$1(t1.get$_eval$_value());
+      }
+    },
+    accept$1: function(_, v) {
+      return v.visitUnaryOperator$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.UnaryOperator];
+    },
+    $isUnaryOperator: true,
+    $isExpression: true
+  },
+  BinaryObserver: {
+    "^": "ExpressionObserver;left>,right>,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$operator: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$operator(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, f, t2;
+      t1 = this._eval$_expr;
+      f = $.get$_BINARY_OPERATORS().$index(0, t1.get$operator(t1));
+      if (J.$eq(t1.get$operator(t1), "&&") || J.$eq(t1.get$operator(t1), "||")) {
+        t1 = this.left.get$_eval$_value();
+        if (t1 == null)
+          t1 = false;
+        t2 = this.right.get$_eval$_value();
+        this._eval$_value = f.call$2(t1, t2 == null ? false : t2);
+      } else if (J.$eq(t1.get$operator(t1), "==") || J.$eq(t1.get$operator(t1), "!="))
+        this._eval$_value = f.call$2(this.left.get$_eval$_value(), this.right.get$_eval$_value());
+      else {
+        t2 = this.left;
+        if (t2.get$_eval$_value() == null || this.right.get$_eval$_value() == null)
+          this._eval$_value = null;
+        else {
+          if (J.$eq(t1.get$operator(t1), "|") && !!J.getInterceptor(t2.get$_eval$_value()).$isObservableList)
+            this._eval$_subscription = H.interceptedTypeCast(t2.get$_eval$_value(), "$isObservableList").get$listChanges().listen$1(new K.BinaryObserver__updateSelf_closure(this, scope));
+          this._eval$_value = f.call$2(t2.get$_eval$_value(), this.right.get$_eval$_value());
+        }
+      }
+    },
+    accept$1: function(_, v) {
+      return v.visitBinaryOperator$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.BinaryOperator];
+    },
+    $isBinaryOperator: true,
+    $isExpression: true
+  },
+  BinaryObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1",
+    call$1: [function(_) {
+      return this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  TernaryObserver: {
+    "^": "ExpressionObserver;condition<,trueExpr<,falseExpr<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      var t1 = this.condition.get$_eval$_value();
+      this._eval$_value = (t1 == null ? false : t1) === true ? this.trueExpr.get$_eval$_value() : this.falseExpr.get$_eval$_value();
+    },
+    accept$1: function(_, v) {
+      return v.visitTernaryOperator$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.TernaryOperator];
+    },
+    $isTernaryOperator: true,
+    $isExpression: true
+  },
+  GetterObserver: {
+    "^": "ExpressionObserver;receiver<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$name: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$name(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var receiverValue, t1, symbol;
+      receiverValue = this.receiver.get$_eval$_value();
+      if (receiverValue == null) {
+        this._eval$_value = null;
+        return;
+      }
+      t1 = this._eval$_expr;
+      t1 = t1.get$name(t1);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      this._eval$_value = $.get$objectAccessor().read$2(receiverValue, symbol);
+      t1 = J.getInterceptor(receiverValue);
+      if (!!t1.$isObservable)
+        this._eval$_subscription = t1.get$changes(receiverValue).listen$1(new K.GetterObserver__updateSelf_closure(this, scope, symbol));
+    },
+    accept$1: function(_, v) {
+      return v.visitGetter$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Getter];
+    },
+    $isGetter: true,
+    $isExpression: true
+  },
+  GetterObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1,symbol_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.GetterObserver__updateSelf__closure(this.symbol_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  GetterObserver__updateSelf__closure: {
+    "^": "Closure:13;symbol_3",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isPropertyChangeRecord && J.$eq(c.name, this.symbol_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  IndexObserver: {
+    "^": "ExpressionObserver;receiver<,argument<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      var receiverValue, key, t1;
+      receiverValue = this.receiver.get$_eval$_value();
+      if (receiverValue == null) {
+        this._eval$_value = null;
+        return;
+      }
+      key = this.argument.get$_eval$_value();
+      t1 = J.getInterceptor$asx(receiverValue);
+      this._eval$_value = t1.$index(receiverValue, key);
+      if (!!t1.$isObservableList)
+        this._eval$_subscription = receiverValue.get$listChanges().listen$1(new K.IndexObserver__updateSelf_closure(this, scope, key));
+      else if (!!t1.$isObservable)
+        this._eval$_subscription = t1.get$changes(receiverValue).listen$1(new K.IndexObserver__updateSelf_closure0(this, scope, key));
+    },
+    accept$1: function(_, v) {
+      return v.visitIndex$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Index];
+    },
+    $isIndex: true,
+    $isExpression: true
+  },
+  IndexObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1,key_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.IndexObserver__updateSelf__closure0(this.key_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  IndexObserver__updateSelf__closure0: {
+    "^": "Closure:13;key_3",
+    call$1: [function(c) {
+      return c.indexChanged$1(this.key_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  IndexObserver__updateSelf_closure0: {
+    "^": "Closure:13;this_4,scope_5,key_6",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.IndexObserver__updateSelf__closure(this.key_6)) === true)
+        this.this_4._invalidate$1(this.scope_5);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  IndexObserver__updateSelf__closure: {
+    "^": "Closure:13;key_7",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isMapChangeRecord && J.$eq(c.key, this.key_7);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  InvokeObserver: {
+    "^": "ExpressionObserver;receiver<,arguments<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$method: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$method(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, args, receiverValue, symbol;
+      t1 = this.arguments;
+      t1.toString;
+      args = H.setRuntimeTypeInfo(new H.MappedListIterable(t1, new K.InvokeObserver__updateSelf_closure()), [null, null]).toList$0(0);
+      receiverValue = this.receiver.get$_eval$_value();
+      if (receiverValue == null) {
+        this._eval$_value = null;
+        return;
+      }
+      t1 = this._eval$_expr;
+      if (t1.get$method(t1) == null) {
+        t1 = H.Primitives_applyFunction(receiverValue, args, P.Function__toMangledNames(null));
+        this._eval$_value = !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+      } else {
+        t1 = t1.get$method(t1);
+        symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+        this._eval$_value = $.get$objectAccessor().invoke$5$adjust$namedArgs(receiverValue, symbol, args, false, null);
+        t1 = J.getInterceptor(receiverValue);
+        if (!!t1.$isObservable)
+          this._eval$_subscription = t1.get$changes(receiverValue).listen$1(new K.InvokeObserver__updateSelf_closure0(this, scope, symbol));
+      }
+    },
+    accept$1: function(_, v) {
+      return v.visitInvoke$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Invoke];
+    },
+    $isInvoke: true,
+    $isExpression: true
+  },
+  InvokeObserver__updateSelf_closure: {
+    "^": "Closure:13;",
+    call$1: [function(a) {
+      return a.get$_eval$_value();
+    }, "call$1", null, 2, 0, null, 46, "call"],
+    $isFunction: true
+  },
+  InvokeObserver__updateSelf_closure0: {
+    "^": "Closure:179;this_0,scope_1,symbol_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.InvokeObserver__updateSelf__closure(this.symbol_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  InvokeObserver__updateSelf__closure: {
+    "^": "Closure:13;symbol_3",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isPropertyChangeRecord && J.$eq(c.name, this.symbol_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  EvalException: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      return "EvalException: " + this.message;
+    },
+    static: {EvalException$: function(message) {
+        return new K.EvalException(message);
+      }}
+  }
+}],
+["polymer_expressions.expression", "package:polymer_expressions/expression.dart", , U, {
+  "^": "",
+  _listEquals: function(a, b) {
+    var i, t1;
+    if (a == null ? b == null : a === b)
+      return true;
+    if (a == null || b == null)
+      return false;
+    if (a.length !== b.length)
+      return false;
+    for (i = 0; i < a.length; ++i) {
+      t1 = a[i];
+      if (i >= b.length)
+        return H.ioore(b, i);
+      if (!J.$eq(t1, b[i]))
+        return false;
+    }
+    return true;
+  },
+  _hashList: function(l) {
+    l.toString;
+    return U._JenkinsSmiHash_finish0(H.IterableMixinWorkaround_fold(l, 0, new U._hashList_closure()));
+  },
+  _JenkinsSmiHash_combine1: function(hash, value) {
+    var t1 = J.$add$ns(hash, value);
+    if (typeof t1 !== "number")
+      return H.iae(t1);
+    hash = 536870911 & t1;
+    hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+    return hash ^ hash >>> 6;
+  },
+  _JenkinsSmiHash_finish0: function(hash) {
+    if (typeof hash !== "number")
+      return H.iae(hash);
+    hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+    hash = (hash ^ hash >>> 11) >>> 0;
+    return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+  },
+  AstFactory: {
+    "^": "Object;",
+    index$2: [function(_, e, a) {
+      return new U.Index(e, a);
+    }, "call$2", "get$index", 4, 0, 180, 1, 46]
+  },
+  Expression: {
+    "^": "Object;",
+    $isExpression: true
+  },
+  EmptyExpression: {
+    "^": "Expression;",
+    accept$1: function(_, v) {
+      return v.visitEmptyExpression$1(this);
+    },
+    $isEmptyExpression: true
+  },
+  Literal: {
+    "^": "Expression;value>",
+    accept$1: function(_, v) {
+      return v.visitLiteral$1(this);
+    },
+    toString$0: function(_) {
+      var t1 = this.value;
+      return typeof t1 === "string" ? "\"" + H.S(t1) + "\"" : H.S(t1);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = H.checkSubtype(o, "$isLiteral", [H.getTypeArgumentByIndex(this, 0)], "$asLiteral");
+      return t1 && J.$eq(J.get$value$x(o), this.value);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.value);
+    },
+    $isLiteral: true
+  },
+  ListLiteral: {
+    "^": "Expression;items<",
+    accept$1: function(_, v) {
+      return v.visitListLiteral$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.items);
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isListLiteral && U._listEquals(o.get$items(), this.items);
+    },
+    get$hashCode: function(_) {
+      return U._hashList(this.items);
+    },
+    $isListLiteral: true
+  },
+  MapLiteral: {
+    "^": "Expression;entries>",
+    accept$1: function(_, v) {
+      return v.visitMapLiteral$1(this);
+    },
+    toString$0: function(_) {
+      return "{" + H.S(this.entries) + "}";
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isMapLiteral && U._listEquals(t1.get$entries(o), this.entries);
+    },
+    get$hashCode: function(_) {
+      return U._hashList(this.entries);
+    },
+    $isMapLiteral: true
+  },
+  MapLiteralEntry: {
+    "^": "Expression;key>,entryValue<",
+    accept$1: function(_, v) {
+      return v.visitMapLiteralEntry$1(this);
+    },
+    toString$0: function(_) {
+      return this.key.toString$0(0) + ": " + H.S(this.entryValue);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isMapLiteralEntry && J.$eq(t1.get$key(o), this.key) && J.$eq(o.get$entryValue(), this.entryValue);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.key.value);
+      t2 = J.get$hashCode$(this.entryValue);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isMapLiteralEntry: true
+  },
+  ParenthesizedExpression: {
+    "^": "Expression;child",
+    accept$1: function(_, v) {
+      return v.visitParenthesizedExpression$1(this);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.child) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isParenthesizedExpression && J.$eq(o.child, this.child);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.child);
+    },
+    $isParenthesizedExpression: true
+  },
+  Identifier: {
+    "^": "Expression;value>",
+    accept$1: function(_, v) {
+      return v.visitIdentifier$1(this);
+    },
+    toString$0: function(_) {
+      return this.value;
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isIdentifier && J.$eq(t1.get$value(o), this.value);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.value);
+    },
+    $isIdentifier: true
+  },
+  UnaryOperator: {
+    "^": "Expression;operator>,child<",
+    accept$1: function(_, v) {
+      return v.visitUnaryOperator$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.operator) + " " + H.S(this.child);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isUnaryOperator && J.$eq(t1.get$operator(o), this.operator) && J.$eq(o.get$child(), this.child);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.operator);
+      t2 = J.get$hashCode$(this.child);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isUnaryOperator: true
+  },
+  BinaryOperator: {
+    "^": "Expression;operator>,left>,right>",
+    accept$1: function(_, v) {
+      return v.visitBinaryOperator$1(this);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.left) + " " + H.S(this.operator) + " " + H.S(this.right) + ")";
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isBinaryOperator && J.$eq(t1.get$operator(o), this.operator) && J.$eq(t1.get$left(o), this.left) && J.$eq(t1.get$right(o), this.right);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.get$hashCode$(this.operator);
+      t2 = J.get$hashCode$(this.left);
+      t3 = J.get$hashCode$(this.right);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2), t3));
+    },
+    $isBinaryOperator: true
+  },
+  TernaryOperator: {
+    "^": "Expression;condition<,trueExpr<,falseExpr<",
+    accept$1: function(_, v) {
+      return v.visitTernaryOperator$1(this);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.condition) + " ? " + H.S(this.trueExpr) + " : " + H.S(this.falseExpr) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isTernaryOperator && J.$eq(o.get$condition(), this.condition) && J.$eq(o.get$trueExpr(), this.trueExpr) && J.$eq(o.get$falseExpr(), this.falseExpr);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.get$hashCode$(this.condition);
+      t2 = J.get$hashCode$(this.trueExpr);
+      t3 = J.get$hashCode$(this.falseExpr);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2), t3));
+    },
+    $isTernaryOperator: true
+  },
+  InExpression: {
+    "^": "Expression;left>,right>",
+    accept$1: function(_, v) {
+      return v.visitInExpression$1(this);
+    },
+    get$identifier: function() {
+      var t1 = this.left;
+      return t1.get$value(t1);
+    },
+    get$expr: function(_) {
+      return this.right;
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.left) + " in " + H.S(this.right) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isInExpression && o.left.$eq(0, this.left) && J.$eq(o.right, this.right);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = this.left;
+      t1 = t1.get$hashCode(t1);
+      t2 = J.get$hashCode$(this.right);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isInExpression: true,
+    $isHasIdentifier: true
+  },
+  AsExpression: {
+    "^": "Expression;left>,right>",
+    accept$1: function(_, v) {
+      return v.visitAsExpression$1(this);
+    },
+    get$identifier: function() {
+      var t1 = this.right;
+      return t1.get$value(t1);
+    },
+    get$expr: function(_) {
+      return this.left;
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.left) + " as " + H.S(this.right) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isAsExpression && J.$eq(o.left, this.left) && o.right.$eq(0, this.right);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.left);
+      t2 = this.right;
+      t2 = t2.get$hashCode(t2);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isAsExpression: true,
+    $isHasIdentifier: true
+  },
+  Index: {
+    "^": "Expression;receiver<,argument<",
+    accept$1: function(_, v) {
+      return v.visitIndex$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.receiver) + "[" + H.S(this.argument) + "]";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isIndex && J.$eq(o.get$receiver(), this.receiver) && J.$eq(o.get$argument(), this.argument);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.receiver);
+      t2 = J.get$hashCode$(this.argument);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isIndex: true
+  },
+  Getter: {
+    "^": "Expression;receiver<,name>",
+    accept$1: function(_, v) {
+      return v.visitGetter$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.receiver) + "." + H.S(this.name);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isGetter && J.$eq(o.get$receiver(), this.receiver) && J.$eq(t1.get$name(o), this.name);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.receiver);
+      t2 = J.get$hashCode$(this.name);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isGetter: true
+  },
+  Invoke: {
+    "^": "Expression;receiver<,method>,arguments<",
+    accept$1: function(_, v) {
+      return v.visitInvoke$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.receiver) + "." + H.S(this.method) + "(" + H.S(this.arguments) + ")";
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isInvoke && J.$eq(o.get$receiver(), this.receiver) && J.$eq(t1.get$method(o), this.method) && U._listEquals(o.get$arguments(), this.arguments);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.get$hashCode$(this.receiver);
+      t2 = J.get$hashCode$(this.method);
+      t3 = U._hashList(this.arguments);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2), t3));
+    },
+    $isInvoke: true
+  },
+  _hashList_closure: {
+    "^": "Closure:75;",
+    call$2: function(h, item) {
+      return U._JenkinsSmiHash_combine1(h, J.get$hashCode$(item));
+    },
+    $isFunction: true
+  }
+}],
+["polymer_expressions.parser", "package:polymer_expressions/parser.dart", , T, {
+  "^": "",
+  Parser: {
+    "^": "Object;_astFactory,_tokenizer,_tokens,_parser$_iterator",
+    get$_token: function() {
+      return this._parser$_iterator._current;
+    },
+    _advance$2: function(kind, value) {
+      var t1;
+      if (kind != null) {
+        t1 = this._parser$_iterator._current;
+        t1 = t1 == null || !J.$eq(J.get$kind$x(t1), kind);
+      } else
+        t1 = false;
+      if (!t1)
+        if (value != null) {
+          t1 = this._parser$_iterator._current;
+          t1 = t1 == null || !J.$eq(J.get$value$x(t1), value);
+        } else
+          t1 = false;
+      else
+        t1 = true;
+      if (t1)
+        throw H.wrapException(Y.ParseException$("Expected kind " + H.S(kind) + " (" + H.S(value) + "): " + H.S(this.get$_token())));
+      this._parser$_iterator.moveNext$0();
+    },
+    _advance$0: function() {
+      return this._advance$2(null, null);
+    },
+    _advance$1: function(kind) {
+      return this._advance$2(kind, null);
+    },
+    _parseExpression$0: function() {
+      if (this._parser$_iterator._current == null) {
+        this._astFactory.toString;
+        return C.C_EmptyExpression;
+      }
+      var expr = this._parseUnary$0();
+      return expr == null ? null : this._parsePrecedence$2(expr, 0);
+    },
+    _parsePrecedence$2: function(left, precedence) {
+      var t1, args, indexExpr, right, trueExpr, falseExpr;
+      for (; t1 = this._parser$_iterator._current, t1 != null;)
+        if (J.$eq(J.get$kind$x(t1), 9))
+          if (J.$eq(J.get$value$x(this._parser$_iterator._current), "(")) {
+            args = this._parseArguments$0();
+            this._astFactory.toString;
+            left = new U.Invoke(left, null, args);
+          } else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "[")) {
+            indexExpr = this._parseIndex$0();
+            this._astFactory.toString;
+            left = new U.Index(left, indexExpr);
+          } else
+            break;
+        else if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 3)) {
+          this._advance$0();
+          left = this._makeInvokeOrGetter$2(left, this._parseUnary$0());
+        } else if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 10))
+          if (J.$eq(J.get$value$x(this._parser$_iterator._current), "in")) {
+            if (!J.getInterceptor(left).$isIdentifier)
+              H.throwExpression(Y.ParseException$("in... statements must start with an identifier"));
+            this._advance$0();
+            right = this._parseExpression$0();
+            this._astFactory.toString;
+            left = new U.InExpression(left, right);
+          } else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "as")) {
+            this._advance$0();
+            right = this._parseExpression$0();
+            if (!J.getInterceptor(right).$isIdentifier)
+              H.throwExpression(Y.ParseException$("'as' statements must end with an identifier"));
+            this._astFactory.toString;
+            left = new U.AsExpression(left, right);
+          } else
+            break;
+        else {
+          if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 8)) {
+            t1 = this._parser$_iterator._current.get$precedence();
+            if (typeof t1 !== "number")
+              return t1.$ge();
+            if (typeof precedence !== "number")
+              return H.iae(precedence);
+            t1 = t1 >= precedence;
+          } else
+            t1 = false;
+          if (t1)
+            if (J.$eq(J.get$value$x(this._parser$_iterator._current), "?")) {
+              this._advance$2(8, "?");
+              trueExpr = this._parseExpression$0();
+              this._advance$1(5);
+              falseExpr = this._parseExpression$0();
+              this._astFactory.toString;
+              left = new U.TernaryOperator(left, trueExpr, falseExpr);
+            } else
+              left = this._parseBinary$1(left);
+          else
+            break;
+        }
+      return left;
+    },
+    _makeInvokeOrGetter$2: function(left, right) {
+      var t1, t2;
+      t1 = J.getInterceptor(right);
+      if (!!t1.$isIdentifier) {
+        t1 = t1.get$value(right);
+        this._astFactory.toString;
+        return new U.Getter(left, t1);
+      } else if (!!t1.$isInvoke && !!J.getInterceptor(right.get$receiver()).$isIdentifier) {
+        t1 = J.get$value$x(right.get$receiver());
+        t2 = right.get$arguments();
+        this._astFactory.toString;
+        return new U.Invoke(left, t1, t2);
+      } else
+        throw H.wrapException(Y.ParseException$("expected identifier: " + H.S(right)));
+    },
+    _parseBinary$1: function(left) {
+      var op, t1, right, t2, t3;
+      op = this._parser$_iterator._current;
+      t1 = J.getInterceptor$x(op);
+      if (!C.JSArray_methods.contains$1(C.List_EuK, t1.get$value(op)))
+        throw H.wrapException(Y.ParseException$("unknown operator: " + H.S(t1.get$value(op))));
+      this._advance$0();
+      right = this._parseUnary$0();
+      while (true) {
+        t2 = this._parser$_iterator._current;
+        if (t2 != null)
+          if (J.$eq(J.get$kind$x(t2), 8) || J.$eq(J.get$kind$x(this._parser$_iterator._current), 3) || J.$eq(J.get$kind$x(this._parser$_iterator._current), 9)) {
+            t2 = this._parser$_iterator._current.get$precedence();
+            t3 = op.get$precedence();
+            if (typeof t2 !== "number")
+              return t2.$gt();
+            if (typeof t3 !== "number")
+              return H.iae(t3);
+            t3 = t2 > t3;
+            t2 = t3;
+          } else
+            t2 = false;
+        else
+          t2 = false;
+        if (!t2)
+          break;
+        right = this._parsePrecedence$2(right, this._parser$_iterator._current.get$precedence());
+      }
+      t1 = t1.get$value(op);
+      this._astFactory.toString;
+      return new U.BinaryOperator(t1, left, right);
+    },
+    _parseUnary$0: function() {
+      var value, t1, t2, expr;
+      if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 8)) {
+        value = J.get$value$x(this._parser$_iterator._current);
+        t1 = J.getInterceptor(value);
+        if (t1.$eq(value, "+") || t1.$eq(value, "-")) {
+          this._advance$0();
+          if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 6)) {
+            t1 = H.Primitives_parseInt(H.S(value) + H.S(J.get$value$x(this._parser$_iterator._current)), null, null);
+            this._astFactory.toString;
+            value = new U.Literal(t1);
+            value.$builtinTypeInfo = [null];
+            this._advance$0();
+            return value;
+          } else {
+            t1 = this._astFactory;
+            if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 7)) {
+              t2 = H.Primitives_parseDouble(H.S(value) + H.S(J.get$value$x(this._parser$_iterator._current)), null);
+              t1.toString;
+              value = new U.Literal(t2);
+              value.$builtinTypeInfo = [null];
+              this._advance$0();
+              return value;
+            } else {
+              expr = this._parsePrecedence$2(this._parsePrimary$0(), 11);
+              t1.toString;
+              return new U.UnaryOperator(value, expr);
+            }
+          }
+        } else if (t1.$eq(value, "!")) {
+          this._advance$0();
+          expr = this._parsePrecedence$2(this._parsePrimary$0(), 11);
+          this._astFactory.toString;
+          return new U.UnaryOperator(value, expr);
+        } else
+          throw H.wrapException(Y.ParseException$("unexpected token: " + H.S(value)));
+      }
+      return this._parsePrimary$0();
+    },
+    _parsePrimary$0: function() {
+      var keyword, expr;
+      switch (J.get$kind$x(this._parser$_iterator._current)) {
+        case 10:
+          keyword = J.get$value$x(this._parser$_iterator._current);
+          if (J.$eq(keyword, "this")) {
+            this._advance$0();
+            this._astFactory.toString;
+            return new U.Identifier("this");
+          } else if (C.JSArray_methods.contains$1(C.List_as_in_this, keyword))
+            throw H.wrapException(Y.ParseException$("unexpected keyword: " + H.S(keyword)));
+          throw H.wrapException(Y.ParseException$("unrecognized keyword: " + H.S(keyword)));
+        case 2:
+          return this._parseInvokeOrIdentifier$0();
+        case 1:
+          return this._parseString$0();
+        case 6:
+          return this._parseInteger$0();
+        case 7:
+          return this._parseDecimal$0();
+        case 9:
+          if (J.$eq(J.get$value$x(this._parser$_iterator._current), "(")) {
+            this._advance$0();
+            expr = this._parseExpression$0();
+            this._advance$2(9, ")");
+            this._astFactory.toString;
+            return new U.ParenthesizedExpression(expr);
+          } else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "{"))
+            return this._parseMapLiteral$0();
+          else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "["))
+            return this._parseListLiteral$0();
+          return;
+        case 5:
+          throw H.wrapException(Y.ParseException$("unexpected token \":\""));
+        default:
+          return;
+      }
+    },
+    _parseListLiteral$0: function() {
+      var items, t1;
+      items = [];
+      do {
+        this._advance$0();
+        if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "]"))
+          break;
+        items.push(this._parseExpression$0());
+        t1 = this._parser$_iterator._current;
+      } while (t1 != null && J.$eq(J.get$value$x(t1), ","));
+      this._advance$2(9, "]");
+      return new U.ListLiteral(items);
+    },
+    _parseMapLiteral$0: function() {
+      var entries, t1, value;
+      entries = [];
+      do {
+        this._advance$0();
+        if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "}"))
+          break;
+        t1 = J.get$value$x(this._parser$_iterator._current);
+        this._astFactory.toString;
+        value = new U.Literal(t1);
+        value.$builtinTypeInfo = [null];
+        this._advance$0();
+        this._advance$2(5, ":");
+        entries.push(new U.MapLiteralEntry(value, this._parseExpression$0()));
+        t1 = this._parser$_iterator._current;
+      } while (t1 != null && J.$eq(J.get$value$x(t1), ","));
+      this._advance$2(9, "}");
+      return new U.MapLiteral(entries);
+    },
+    _parseInvokeOrIdentifier$0: function() {
+      var value, identifier, args;
+      if (J.$eq(J.get$value$x(this._parser$_iterator._current), "true")) {
+        this._advance$0();
+        this._astFactory.toString;
+        return H.setRuntimeTypeInfo(new U.Literal(true), [null]);
+      }
+      if (J.$eq(J.get$value$x(this._parser$_iterator._current), "false")) {
+        this._advance$0();
+        this._astFactory.toString;
+        return H.setRuntimeTypeInfo(new U.Literal(false), [null]);
+      }
+      if (J.$eq(J.get$value$x(this._parser$_iterator._current), "null")) {
+        this._advance$0();
+        this._astFactory.toString;
+        return H.setRuntimeTypeInfo(new U.Literal(null), [null]);
+      }
+      if (!J.$eq(J.get$kind$x(this._parser$_iterator._current), 2))
+        H.throwExpression(Y.ParseException$("expected identifier: " + H.S(this.get$_token()) + ".value"));
+      value = J.get$value$x(this._parser$_iterator._current);
+      this._advance$0();
+      this._astFactory.toString;
+      identifier = new U.Identifier(value);
+      args = this._parseArguments$0();
+      if (args == null)
+        return identifier;
+      else
+        return new U.Invoke(identifier, null, args);
+    },
+    _parseArguments$0: function() {
+      var t1, args;
+      t1 = this._parser$_iterator._current;
+      if (t1 != null && J.$eq(J.get$kind$x(t1), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "(")) {
+        args = [];
+        do {
+          this._advance$0();
+          if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), ")"))
+            break;
+          args.push(this._parseExpression$0());
+          t1 = this._parser$_iterator._current;
+        } while (t1 != null && J.$eq(J.get$value$x(t1), ","));
+        this._advance$2(9, ")");
+        return args;
+      }
+      return;
+    },
+    _parseIndex$0: function() {
+      var t1, expr;
+      t1 = this._parser$_iterator._current;
+      if (t1 != null && J.$eq(J.get$kind$x(t1), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "[")) {
+        this._advance$0();
+        expr = this._parseExpression$0();
+        this._advance$2(9, "]");
+        return expr;
+      }
+      return;
+    },
+    _parseString$0: function() {
+      var t1, value;
+      t1 = J.get$value$x(this._parser$_iterator._current);
+      this._astFactory.toString;
+      value = H.setRuntimeTypeInfo(new U.Literal(t1), [null]);
+      this._advance$0();
+      return value;
+    },
+    _parseInteger$1: function(prefix) {
+      var t1, value;
+      t1 = H.Primitives_parseInt(H.S(prefix) + H.S(J.get$value$x(this._parser$_iterator._current)), null, null);
+      this._astFactory.toString;
+      value = H.setRuntimeTypeInfo(new U.Literal(t1), [null]);
+      this._advance$0();
+      return value;
+    },
+    _parseInteger$0: function() {
+      return this._parseInteger$1("");
+    },
+    _parseDecimal$1: function(prefix) {
+      var t1, value;
+      t1 = H.Primitives_parseDouble(H.S(prefix) + H.S(J.get$value$x(this._parser$_iterator._current)), null);
+      this._astFactory.toString;
+      value = H.setRuntimeTypeInfo(new U.Literal(t1), [null]);
+      this._advance$0();
+      return value;
+    },
+    _parseDecimal$0: function() {
+      return this._parseDecimal$1("");
+    }
+  }
+}],
+["polymer_expressions.src.globals", "package:polymer_expressions/src/globals.dart", , K, {
+  "^": "",
+  enumerate: [function(iterable) {
+    return H.setRuntimeTypeInfo(new K.EnumerateIterable(iterable), [null]);
+  }, "call$1", "enumerate$closure", 2, 0, 66, 67],
+  IndexedValue: {
+    "^": "Object;index>,value>",
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isIndexedValue && J.$eq(o.index, this.index) && J.$eq(o.value, this.value);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.value);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.index) + ", " + H.S(this.value) + ")";
+    },
+    $isIndexedValue: true
+  },
+  EnumerateIterable: {
+    "^": "IterableBase;_globals$_iterable",
+    get$iterator: function(_) {
+      var t1 = new K.EnumerateIterator(J.get$iterator$ax(this._globals$_iterable), 0, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._globals$_iterable);
+    },
+    get$isEmpty: function(_) {
+      return J.get$isEmpty$asx(this._globals$_iterable);
+    },
+    get$last: function(_) {
+      var t1, t2;
+      t1 = this._globals$_iterable;
+      t2 = J.getInterceptor$asx(t1);
+      t1 = new K.IndexedValue(J.$sub$n(t2.get$length(t1), 1), t2.get$last(t1));
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    $asIterableBase: function($V) {
+      return [[K.IndexedValue, $V]];
+    },
+    $asIterable: function($V) {
+      return [[K.IndexedValue, $V]];
+    }
+  },
+  EnumerateIterator: {
+    "^": "Iterator;_globals$_iterator,_globals$_index,_globals$_current",
+    get$current: function() {
+      return this._globals$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._globals$_iterator;
+      if (t1.moveNext$0()) {
+        this._globals$_current = H.setRuntimeTypeInfo(new K.IndexedValue(this._globals$_index++, t1.get$current()), [null]);
+        return true;
+      }
+      this._globals$_current = null;
+      return false;
+    },
+    $asIterator: function($V) {
+      return [[K.IndexedValue, $V]];
+    }
+  }
+}],
+["polymer_expressions.tokenizer", "package:polymer_expressions/tokenizer.dart", , Y, {
+  "^": "",
+  escape: function(c) {
+    switch (c) {
+      case 102:
+        return 12;
+      case 110:
+        return 10;
+      case 114:
+        return 13;
+      case 116:
+        return 9;
+      case 118:
+        return 11;
+      default:
+        return c;
+    }
+  },
+  Token: {
+    "^": "Object;kind>,value>,precedence<",
+    toString$0: function(_) {
+      return "(" + this.kind + ", '" + this.value + "')";
+    },
+    $isToken: true
+  },
+  Tokenizer: {
+    "^": "Object;_tokenizer$_tokens,_sb,_tokenizer$_iterator,_tokenizer$_next",
+    tokenize$0: function() {
+      var t1, t2, t3, t4, startChar, op2, op, value;
+      t1 = this._tokenizer$_iterator;
+      this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+      for (t2 = this._tokenizer$_tokens; t3 = this._tokenizer$_next, t3 != null;)
+        if (t3 === 32 || t3 === 9 || t3 === 160)
+          this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+        else if (t3 === 34 || t3 === 39)
+          this.tokenizeString$0();
+        else {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(97 <= t3 && t3 <= 122))
+            t4 = 65 <= t3 && t3 <= 90 || t3 === 95 || t3 === 36 || t3 > 127;
+          else
+            t4 = true;
+          if (t4)
+            this.tokenizeIdentifierOrKeyword$0();
+          else if (48 <= t3 && t3 <= 57)
+            this.tokenizeNumber$0();
+          else if (t3 === 46) {
+            t3 = t1.moveNext$0() ? t1._currentCodePoint : null;
+            this._tokenizer$_next = t3;
+            if (typeof t3 !== "number")
+              return H.iae(t3);
+            if (48 <= t3 && t3 <= 57)
+              this.tokenizeFraction$0();
+            else
+              t2.push(new Y.Token(3, ".", 11));
+          } else if (t3 === 44) {
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+            t2.push(new Y.Token(4, ",", 0));
+          } else if (t3 === 58) {
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+            t2.push(new Y.Token(5, ":", 0));
+          } else if (C.JSArray_methods.contains$1(C.List_mC8, t3)) {
+            startChar = this._tokenizer$_next;
+            t3 = t1.moveNext$0() ? t1._currentCodePoint : null;
+            this._tokenizer$_next = t3;
+            if (C.JSArray_methods.contains$1(C.List_mC8, t3)) {
+              t3 = this._tokenizer$_next;
+              op2 = H.Primitives_stringFromCharCodes([startChar, t3]);
+              if (C.JSArray_methods.contains$1(C.List_Ynd, op2)) {
+                t3 = t1.moveNext$0() ? t1._currentCodePoint : null;
+                this._tokenizer$_next = t3;
+                if (t3 === 61)
+                  t3 = startChar === 33 || startChar === 61;
+                else
+                  t3 = false;
+                if (t3) {
+                  op = op2 + "=";
+                  this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+                } else
+                  op = op2;
+              } else
+                op = H.Primitives_stringFromCharCode(startChar);
+            } else
+              op = H.Primitives_stringFromCharCode(startChar);
+            t2.push(new Y.Token(8, op, C.Map_L0K61.$index(0, op)));
+          } else if (C.JSArray_methods.contains$1(C.List_ww8, this._tokenizer$_next)) {
+            value = H.Primitives_stringFromCharCode(this._tokenizer$_next);
+            t2.push(new Y.Token(9, value, C.Map_L0K61.$index(0, value)));
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+          } else
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+        }
+      return t2;
+    },
+    tokenizeString$0: function() {
+      var quoteChar, t1, t2, t3;
+      quoteChar = this._tokenizer$_next;
+      t1 = this._tokenizer$_iterator;
+      t2 = t1.moveNext$0() ? t1._currentCodePoint : null;
+      this._tokenizer$_next = t2;
+      for (t3 = this._sb; t2 == null ? quoteChar != null : t2 !== quoteChar;) {
+        if (t2 == null)
+          throw H.wrapException(Y.ParseException$("unterminated string"));
+        if (t2 === 92) {
+          t2 = t1.moveNext$0() ? t1._currentCodePoint : null;
+          this._tokenizer$_next = t2;
+          if (t2 == null)
+            throw H.wrapException(Y.ParseException$("unterminated string"));
+          t2 = H.Primitives_stringFromCharCode(Y.escape(t2));
+          t3._contents += t2;
+        } else {
+          t2 = H.Primitives_stringFromCharCode(t2);
+          t3._contents += t2;
+        }
+        t2 = t1.moveNext$0() ? t1._currentCodePoint : null;
+        this._tokenizer$_next = t2;
+      }
+      this._tokenizer$_tokens.push(new Y.Token(1, t3._contents, 0));
+      t3._contents = "";
+      this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+    },
+    tokenizeIdentifierOrKeyword$0: function() {
+      var t1, t2, t3, t4, value;
+      t1 = this._tokenizer$_iterator;
+      t2 = this._sb;
+      while (true) {
+        t3 = this._tokenizer$_next;
+        if (t3 != null) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(97 <= t3 && t3 <= 122))
+            if (!(65 <= t3 && t3 <= 90))
+              t4 = 48 <= t3 && t3 <= 57 || t3 === 95 || t3 === 36 || t3 > 127;
+            else
+              t4 = true;
+          else
+            t4 = true;
+        } else
+          t4 = false;
+        if (!t4)
+          break;
+        t3 = H.Primitives_stringFromCharCode(t3);
+        t2._contents += t3;
+        this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+      }
+      value = t2._contents;
+      t1 = this._tokenizer$_tokens;
+      if (C.JSArray_methods.contains$1(C.List_as_in_this, value))
+        t1.push(new Y.Token(10, value, 0));
+      else
+        t1.push(new Y.Token(2, value, 0));
+      t2._contents = "";
+    },
+    tokenizeNumber$0: function() {
+      var t1, t2, t3, t4;
+      t1 = this._tokenizer$_iterator;
+      t2 = this._sb;
+      while (true) {
+        t3 = this._tokenizer$_next;
+        if (t3 != null) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          t4 = 48 <= t3 && t3 <= 57;
+        } else
+          t4 = false;
+        if (!t4)
+          break;
+        t3 = H.Primitives_stringFromCharCode(t3);
+        t2._contents += t3;
+        this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+      }
+      if (t3 === 46) {
+        t1 = t1.moveNext$0() ? t1._currentCodePoint : null;
+        this._tokenizer$_next = t1;
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        if (48 <= t1 && t1 <= 57)
+          this.tokenizeFraction$0();
+        else
+          this._tokenizer$_tokens.push(new Y.Token(3, ".", 11));
+      } else {
+        this._tokenizer$_tokens.push(new Y.Token(6, t2._contents, 0));
+        t2._contents = "";
+      }
+    },
+    tokenizeFraction$0: function() {
+      var t1, t2, t3, t4;
+      t1 = this._sb;
+      t1.write$1(H.Primitives_stringFromCharCode(46));
+      t2 = this._tokenizer$_iterator;
+      while (true) {
+        t3 = this._tokenizer$_next;
+        if (t3 != null) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          t4 = 48 <= t3 && t3 <= 57;
+        } else
+          t4 = false;
+        if (!t4)
+          break;
+        t3 = H.Primitives_stringFromCharCode(t3);
+        t1._contents += t3;
+        this._tokenizer$_next = t2.moveNext$0() ? t2._currentCodePoint : null;
+      }
+      this._tokenizer$_tokens.push(new Y.Token(7, t1._contents, 0));
+      t1._contents = "";
+    }
+  },
+  ParseException: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      return "ParseException: " + this.message;
+    },
+    static: {ParseException$: function(message) {
+        return new Y.ParseException(message);
+      }}
+  }
+}],
+["polymer_expressions.visitor", "package:polymer_expressions/visitor.dart", , S, {
+  "^": "",
+  Visitor: {
+    "^": "Object;",
+    visit$1: [function(s) {
+      return J.accept$1$x(s, this);
+    }, "call$1", "get$visit", 2, 0, 181, 142]
+  },
+  RecursiveVisitor: {
+    "^": "Visitor;",
+    visitExpression$1: function(e) {
+    },
+    visitEmptyExpression$1: function(e) {
+      this.visitExpression$1(e);
+    },
+    visitParenthesizedExpression$1: function(e) {
+      e.child.accept$1(0, this);
+      this.visitExpression$1(e);
+    },
+    visitGetter$1: function(i) {
+      J.accept$1$x(i.get$receiver(), this);
+      this.visitExpression$1(i);
+    },
+    visitIndex$1: function(i) {
+      J.accept$1$x(i.get$receiver(), this);
+      J.accept$1$x(i.get$argument(), this);
+      this.visitExpression$1(i);
+    },
+    visitInvoke$1: function(i) {
+      var t1;
+      J.accept$1$x(i.get$receiver(), this);
+      if (i.get$arguments() != null)
+        for (t1 = i.get$arguments(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+          J.accept$1$x(t1._current, this);
+      this.visitExpression$1(i);
+    },
+    visitLiteral$1: function(l) {
+      this.visitExpression$1(l);
+    },
+    visitListLiteral$1: function(l) {
+      var t1;
+      for (t1 = l.get$items(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.accept$1$x(t1._current, this);
+      this.visitExpression$1(l);
+    },
+    visitMapLiteral$1: function(l) {
+      var t1;
+      for (t1 = l.get$entries(l), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.accept$1$x(t1._current, this);
+      this.visitExpression$1(l);
+    },
+    visitMapLiteralEntry$1: function(e) {
+      J.accept$1$x(e.get$key(e), this);
+      J.accept$1$x(e.get$entryValue(), this);
+      this.visitExpression$1(e);
+    },
+    visitIdentifier$1: function(i) {
+      this.visitExpression$1(i);
+    },
+    visitBinaryOperator$1: function(o) {
+      J.accept$1$x(o.get$left(o), this);
+      J.accept$1$x(o.get$right(o), this);
+      this.visitExpression$1(o);
+    },
+    visitUnaryOperator$1: function(o) {
+      J.accept$1$x(o.get$child(), this);
+      this.visitExpression$1(o);
+    },
+    visitTernaryOperator$1: function(o) {
+      J.accept$1$x(o.get$condition(), this);
+      J.accept$1$x(o.get$trueExpr(), this);
+      J.accept$1$x(o.get$falseExpr(), this);
+      this.visitExpression$1(o);
+    },
+    visitInExpression$1: function(c) {
+      c.left.accept$1(0, this);
+      c.right.accept$1(0, this);
+      this.visitExpression$1(c);
+    },
+    visitAsExpression$1: function(c) {
+      c.left.accept$1(0, this);
+      c.right.accept$1(0, this);
+      this.visitExpression$1(c);
+    }
+  }
+}],
+["script_inset_element", "package:observatory/src/elements/script_inset.dart", , T, {
+  "^": "",
+  ScriptInsetElement: {
+    "^": "ObservatoryElement_ChangeNotifier43;_script_inset_element$__$script,_script_inset_element$__$pos,_script_inset_element$__$endPos,lineNumbers=,_script_inset_element$__$startLine,_script_inset_element$__$endLine,_script_inset_element$__$lines,_updateFuture,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$script: function(receiver) {
+      return receiver._script_inset_element$__$script;
+    },
+    set$script: function(receiver, value) {
+      receiver._script_inset_element$__$script = this.notifyPropertyChange$3(receiver, C.Symbol_script, receiver._script_inset_element$__$script, value);
+    },
+    get$pos: function(receiver) {
+      return receiver._script_inset_element$__$pos;
+    },
+    set$pos: function(receiver, value) {
+      receiver._script_inset_element$__$pos = this.notifyPropertyChange$3(receiver, C.Symbol_pos, receiver._script_inset_element$__$pos, value);
+    },
+    get$endPos: function(receiver) {
+      return receiver._script_inset_element$__$endPos;
+    },
+    set$endPos: function(receiver, value) {
+      receiver._script_inset_element$__$endPos = this.notifyPropertyChange$3(receiver, C.Symbol_endPos, receiver._script_inset_element$__$endPos, value);
+    },
+    get$startLine: function(receiver) {
+      return receiver._script_inset_element$__$startLine;
+    },
+    set$startLine: function(receiver, value) {
+      receiver._script_inset_element$__$startLine = this.notifyPropertyChange$3(receiver, C.Symbol_startLine, receiver._script_inset_element$__$startLine, value);
+    },
+    get$endLine: function(receiver) {
+      return receiver._script_inset_element$__$endLine;
+    },
+    set$endLine: function(receiver, value) {
+      receiver._script_inset_element$__$endLine = this.notifyPropertyChange$3(receiver, C.Symbol_endLine, receiver._script_inset_element$__$endLine, value);
+    },
+    get$lines: function(receiver) {
+      return receiver._script_inset_element$__$lines;
+    },
+    set$lines: function(receiver, value) {
+      receiver._script_inset_element$__$lines = this.notifyPropertyChange$3(receiver, C.Symbol_lines, receiver._script_inset_element$__$lines, value);
+    },
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+    },
+    scriptChanged$1: [function(receiver, oldValue) {
+      this._updateLines$0(receiver);
+    }, "call$1", "get$scriptChanged", 2, 0, 20, 57],
+    posChanged$1: [function(receiver, oldValue) {
+      this._updateLines$0(receiver);
+    }, "call$1", "get$posChanged", 2, 0, 20, 57],
+    endPosChanged$1: [function(receiver, oldValue) {
+      this._updateLines$0(receiver);
+    }, "call$1", "get$endPosChanged", 2, 0, 20, 57],
+    styleForHits$1: [function(receiver, hits) {
+      if (hits == null)
+        return "min-width:32px;";
+      else if (J.$eq(hits, 0))
+        return "min-width:32px; background-color:red";
+      return "min-width:32px; background-color:green";
+    }, "call$1", "get$styleForHits", 2, 0, 15, 182],
+    _updateLines$0: function(receiver) {
+      var t1, t2, i;
+      if (receiver._updateFuture != null)
+        return;
+      if (J.get$loaded$x(receiver._script_inset_element$__$script) !== true) {
+        receiver._updateFuture = J.load$0$x(receiver._script_inset_element$__$script).then$1(new T.ScriptInsetElement__updateLines_closure(receiver));
+        return;
+      }
+      t1 = receiver._script_inset_element$__$pos;
+      t1 = t1 != null ? J.$sub$n(receiver._script_inset_element$__$script.tokenToLine$1(t1), 1) : 0;
+      receiver._script_inset_element$__$startLine = this.notifyPropertyChange$3(receiver, C.Symbol_startLine, receiver._script_inset_element$__$startLine, t1);
+      t1 = receiver._script_inset_element$__$endPos;
+      t2 = receiver._script_inset_element$__$script;
+      t1 = t1 != null ? t2.tokenToLine$1(t1) : J.get$length$asx(J.get$lines$x(t2));
+      receiver._script_inset_element$__$endLine = this.notifyPropertyChange$3(receiver, C.Symbol_endLine, receiver._script_inset_element$__$endLine, t1);
+      t1 = receiver.lineNumbers;
+      t1.clear$0(t1);
+      for (i = receiver._script_inset_element$__$startLine; t2 = J.getInterceptor$n(i), t2.$lt(i, receiver._script_inset_element$__$endLine); i = t2.$add(i, 1))
+        t1.add$1(0, i);
+    },
+    static: {"^": "ScriptInsetElement_hitStyleNone,ScriptInsetElement_hitStyleExecuted,ScriptInsetElement_hitStyleNotExecuted", ScriptInsetElement$created: function(receiver) {
+        var t1, t2, t3, t4;
+        t1 = Q.ObservableList$(null, P.$int);
+        t2 = R._toObservableDeep([]);
+        t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t4 = P.String;
+        t4 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t4, null), null, null), [t4, null]);
+        receiver.lineNumbers = t1;
+        receiver._script_inset_element$__$lines = t2;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t3;
+        receiver.polymer$Polymer$$ = t4;
+        C.ScriptInsetElement_methods.Element$created$0(receiver);
+        C.ScriptInsetElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier43: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ScriptInsetElement__updateLines_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      var t1 = this.this_0;
+      if (J.get$loaded$x(t1._script_inset_element$__$script) === true) {
+        t1._updateFuture = null;
+        J._updateLines$0$x(t1);
+      }
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  }
+}],
+["script_ref_element", "package:observatory/src/elements/script_ref.dart", , A, {
+  "^": "",
+  ScriptRefElement: {
+    "^": "ServiceRefElement_ChangeNotifier1;_script_ref_element$__$pos,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$pos: function(receiver) {
+      return receiver._script_ref_element$__$pos;
+    },
+    set$pos: function(receiver, value) {
+      receiver._script_ref_element$__$pos = this.notifyPropertyChange$3(receiver, C.Symbol_pos, receiver._script_ref_element$__$pos, value);
+    },
+    get$hoverText: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return Q.ServiceRefElement.prototype.get$hoverText.call(this, receiver);
+      return t1.get$vmName();
+    },
+    posChanged$1: [function(receiver, oldValue) {
+      this._updateProperties$1(receiver, null);
+    }, "call$1", "get$posChanged", 2, 0, 20, 57],
+    _updateProperties$1: [function(receiver, _) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 != null && J.get$loaded$x(t1) === true) {
+        this.notifyPropertyChange$3(receiver, C.Symbol_name, 0, 1);
+        this.notifyPropertyChange$3(receiver, C.Symbol_url, 0, 1);
+      }
+    }, "call$1", "get$_updateProperties", 2, 0, 20, 14],
+    get$name: function(receiver) {
+      var t1, script;
+      if (receiver._service_ref_element$__$ref == null)
+        return Q.ServiceRefElement.prototype.get$name.call(this, receiver);
+      if (J.$ge$n(receiver._script_ref_element$__$pos, 0)) {
+        t1 = J.get$loaded$x(receiver._service_ref_element$__$ref);
+        script = receiver._service_ref_element$__$ref;
+        if (t1 === true)
+          return H.S(Q.ServiceRefElement.prototype.get$name.call(this, receiver)) + ":" + H.S(script.tokenToLine$1(receiver._script_ref_element$__$pos));
+        else
+          J.load$0$x(script).then$1(this.get$_updateProperties(receiver));
+      }
+      return Q.ServiceRefElement.prototype.get$name.call(this, receiver);
+    },
+    get$url: function(receiver) {
+      var t1, script;
+      if (receiver._service_ref_element$__$ref == null)
+        return Q.ServiceRefElement.prototype.get$url.call(this, receiver);
+      if (J.$ge$n(receiver._script_ref_element$__$pos, 0)) {
+        t1 = J.get$loaded$x(receiver._service_ref_element$__$ref);
+        script = receiver._service_ref_element$__$ref;
+        if (t1 === true)
+          return Q.ServiceRefElement.prototype.get$url.call(this, receiver) + "#line=" + H.S(script.tokenToLine$1(receiver._script_ref_element$__$pos));
+        else
+          J.load$0$x(script).then$1(this.get$_updateProperties(receiver));
+      }
+      return Q.ServiceRefElement.prototype.get$url.call(this, receiver);
+    },
+    static: {ScriptRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._script_ref_element$__$pos = -1;
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ScriptRefElement_methods.Element$created$0(receiver);
+        C.ScriptRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ServiceRefElement_ChangeNotifier1: {
+    "^": "ServiceRefElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["script_view_element", "package:observatory/src/elements/script_view.dart", , U, {
+  "^": "",
+  ScriptViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier44;_script_view_element$__$script,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$script: function(receiver) {
+      return receiver._script_view_element$__$script;
+    },
+    set$script: function(receiver, value) {
+      receiver._script_view_element$__$script = this.notifyPropertyChange$3(receiver, C.Symbol_script, receiver._script_view_element$__$script, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = receiver._script_view_element$__$script;
+      if (t1 == null)
+        return;
+      J.load$0$x(t1);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._script_view_element$__$script).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    refreshCoverage$1: [function(receiver, done) {
+      J.refreshCoverage$0$x(J.get$isolate$x(receiver._script_view_element$__$script)).whenComplete$1(done);
+    }, "call$1", "get$refreshCoverage", 2, 0, 20, 89],
+    static: {ScriptViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ScriptViewElement_methods.Element$created$0(receiver);
+        C.ScriptViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier44: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service", "package:observatory/service.dart", , D, {
+  "^": "",
+  ServiceObject_ServiceObject$_fromMap: function(owner, map) {
+    var t1, type, t2, t3, t4, t5, t6, obj, t7;
+    if (map == null)
+      return;
+    t1 = J.getInterceptor$asx(map);
+    t1 = t1.$index(map, "id") != null && t1.$index(map, "type") != null;
+    if (!t1)
+      N.Logger_Logger("").severe$1("Malformed service object: " + H.S(map));
+    type = J.$index$asx(map, "type");
+    t1 = J.getInterceptor$s(type);
+    switch (t1.startsWith$1(type, "@") ? t1.substring$1(type, 1) : type) {
+      case "Class":
+        t1 = D.Class;
+        t2 = [];
+        t2.$builtinTypeInfo = [t1];
+        t2 = new Q.ObservableList(null, null, t2, null, null);
+        t2.$builtinTypeInfo = [t1];
+        t1 = D.Class;
+        t3 = [];
+        t3.$builtinTypeInfo = [t1];
+        t3 = new Q.ObservableList(null, null, t3, null, null);
+        t3.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t4 = [];
+        t4.$builtinTypeInfo = [t1];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t5 = [];
+        t5.$builtinTypeInfo = [t1];
+        t5 = new Q.ObservableList(null, null, t5, null, null);
+        t5.$builtinTypeInfo = [t1];
+        t1 = D.Class;
+        t6 = [];
+        t6.$builtinTypeInfo = [t1];
+        t6 = new Q.ObservableList(null, null, t6, null, null);
+        t6.$builtinTypeInfo = [t1];
+        obj = new D.Class(null, null, null, null, null, null, null, null, null, null, new D.Allocations(new D.AllocationCount(0, 0, null, null), new D.AllocationCount(0, 0, null, null)), new D.Allocations(new D.AllocationCount(0, 0, null, null), new D.AllocationCount(0, 0, null, null)), t2, t3, t4, t5, t6, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Code":
+        t1 = [];
+        t1.$builtinTypeInfo = [D.CodeCallCount];
+        t2 = [];
+        t2.$builtinTypeInfo = [D.CodeCallCount];
+        t3 = D.CodeInstruction;
+        t4 = [];
+        t4.$builtinTypeInfo = [t3];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t3];
+        t3 = P.$int;
+        t5 = D.CodeTick;
+        t6 = new V.ObservableMap(P.HashMap_HashMap(null, null, null, t3, t5), null, null);
+        t6.$builtinTypeInfo = [t3, t5];
+        obj = new D.Code(null, 0, 0, 0, 0, 0, t1, t2, t4, t6, "", "", null, null, null, false, null, null, false, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Error":
+        obj = new D.DartError(null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Isolate":
+        t1 = new V.ObservableMap(P.HashMap_HashMap(null, null, null, null, null), null, null);
+        t1.$builtinTypeInfo = [null, null];
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.ServiceObject);
+        t3 = [];
+        t3.$builtinTypeInfo = [P.String];
+        t4 = [];
+        t4.$builtinTypeInfo = [D.TagProfileSnapshot];
+        t5 = D.Class;
+        t6 = [];
+        t6.$builtinTypeInfo = [t5];
+        t6 = new Q.ObservableList(null, null, t6, null, null);
+        t6.$builtinTypeInfo = [t5];
+        t5 = D.Library;
+        t7 = [];
+        t7.$builtinTypeInfo = [t5];
+        t7 = new Q.ObservableList(null, null, t7, null, null);
+        t7.$builtinTypeInfo = [t5];
+        t5 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.$double);
+        t5 = R._toObservableDeep(t5);
+        obj = new D.Isolate(t1, null, false, false, true, false, t2, new D.TagProfile(t3, t4, null, null, 20, 0), null, t6, null, t7, null, null, null, null, null, t5, new D.HeapSpace(0, 0, 0, 0, 0, null, null), new D.HeapSpace(0, 0, 0, 0, 0, null, null), null, null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Library":
+        t1 = D.Library;
+        t2 = [];
+        t2.$builtinTypeInfo = [t1];
+        t2 = new Q.ObservableList(null, null, t2, null, null);
+        t2.$builtinTypeInfo = [t1];
+        t1 = D.Script;
+        t3 = [];
+        t3.$builtinTypeInfo = [t1];
+        t3 = new Q.ObservableList(null, null, t3, null, null);
+        t3.$builtinTypeInfo = [t1];
+        t1 = D.Class;
+        t4 = [];
+        t4.$builtinTypeInfo = [t1];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t5 = [];
+        t5.$builtinTypeInfo = [t1];
+        t5 = new Q.ObservableList(null, null, t5, null, null);
+        t5.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t6 = [];
+        t6.$builtinTypeInfo = [t1];
+        t6 = new Q.ObservableList(null, null, t6, null, null);
+        t6.$builtinTypeInfo = [t1];
+        obj = new D.Library(null, t2, t3, t4, t5, t6, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "ServiceError":
+        obj = new D.ServiceError(null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "ServiceException":
+        obj = new D.ServiceException(null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Script":
+        t1 = D.ScriptLine;
+        t2 = [];
+        t2.$builtinTypeInfo = [t1];
+        t2 = new Q.ObservableList(null, null, t2, null, null);
+        t2.$builtinTypeInfo = [t1];
+        obj = new D.Script(t2, P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, P.$int), null, null, null, null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Socket":
+        obj = new D.Socket(null, null, null, null, "", false, false, false, false, null, null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      default:
+        t1 = new V.ObservableMap(P.HashMap_HashMap(null, null, null, null, null), null, null);
+        t1.$builtinTypeInfo = [null, null];
+        obj = new D.ServiceMap(t1, owner, null, null, false, null, null, null, null, null);
+    }
+    obj.update$1(map);
+    return obj;
+  },
+  _isServiceMap: function(m) {
+    var t1;
+    if (m != null) {
+      t1 = J.getInterceptor$asx(m);
+      t1 = t1.$index(m, "id") != null && t1.$index(m, "type") != null;
+    } else
+      t1 = false;
+    return t1;
+  },
+  _upgradeCollection: function(collection, owner) {
+    var t1 = J.getInterceptor(collection);
+    if (!!t1.$isServiceMap)
+      return;
+    if (!!t1.$isObservableMap)
+      D._upgradeObservableMap(collection, owner);
+    else if (!!t1.$isObservableList)
+      D._upgradeObservableList(collection, owner);
+  },
+  _upgradeObservableMap: function(map, owner) {
+    map.forEach$1(0, new D._upgradeObservableMap_closure(map, owner));
+  },
+  _upgradeObservableList: function(list, owner) {
+    var t1, i, v, t2, t3, t4;
+    for (t1 = list._observable_list$_list, i = 0; i < t1.length; ++i) {
+      v = t1[i];
+      t2 = J.getInterceptor(v);
+      t3 = !!t2.$isObservableMap;
+      if (t3)
+        t4 = t2.$index(v, "id") != null && t2.$index(v, "type") != null;
+      else
+        t4 = false;
+      if (t4)
+        list.$indexSet(0, i, owner.getFromMap$1(v));
+      else if (!!t2.$isObservableList)
+        D._upgradeObservableList(v, owner);
+      else if (t3)
+        D._upgradeObservableMap(v, owner);
+    }
+  },
+  ServiceObject: {
+    "^": "ChangeNotifier;_service$__$name@,_service$__$vmName@",
+    get$vm: function(_) {
+      var t1 = this._owner;
+      return t1.get$vm(t1);
+    },
+    get$isolate: function(_) {
+      var t1 = this._owner;
+      return t1.get$isolate(t1);
+    },
+    get$id: function(_) {
+      return this._id;
+    },
+    get$serviceType: function() {
+      return this._serviceType;
+    },
+    get$link: function(_) {
+      return this._owner.relativeLink$1(this._id);
+    },
+    get$loaded: function(_) {
+      return this._loaded;
+    },
+    get$canCache: function() {
+      return false;
+    },
+    get$immutable: function() {
+      return false;
+    },
+    get$name: function(_) {
+      return this.get$_service$__$name();
+    },
+    set$name: function(_, value) {
+      this.set$_service$__$name(this.notifyPropertyChange$3(this, C.Symbol_name, this.get$_service$__$name(), value));
+    },
+    get$vmName: function() {
+      return this.get$_service$__$vmName();
+    },
+    set$vmName: function(value) {
+      this.set$_service$__$vmName(this.notifyPropertyChange$3(this, C.Symbol_vmName, this.get$_service$__$vmName(), value));
+    },
+    load$0: function(_) {
+      if (this._loaded)
+        return P._Future$immediate(this, null);
+      return this.reload$0(0);
+    },
+    reload$0: function(_) {
+      var t1;
+      if (J.$eq(this._id, ""))
+        return P._Future$immediate(this, null);
+      if (this._loaded && this.get$immutable())
+        return P._Future$immediate(this, null);
+      t1 = this._inProgressReload;
+      if (t1 == null) {
+        t1 = this.get$vm(this).getAsMap$1(this.get$link(this)).then$1(new D.ServiceObject_reload_closure(this)).whenComplete$1(new D.ServiceObject_reload_closure0(this));
+        this._inProgressReload = t1;
+      }
+      return t1;
+    },
+    update$1: function(map) {
+      var t1, mapIsRef, mapType, t2;
+      t1 = J.getInterceptor$asx(map);
+      mapIsRef = J.startsWith$1$s(t1.$index(map, "type"), "@");
+      mapType = t1.$index(map, "type");
+      t2 = J.getInterceptor$s(mapType);
+      if (t2.startsWith$1(mapType, "@"))
+        mapType = t2.substring$1(mapType, 1);
+      t2 = this._id;
+      if (t2 != null && !J.$eq(t2, t1.$index(map, "id")))
+        ;
+      this._id = t1.$index(map, "id");
+      this._serviceType = mapType;
+      this._service$_update$2(0, map, mapIsRef);
+    },
+    $isServiceObject: true
+  },
+  ServiceObject_reload_closure: {
+    "^": "Closure:184;this_0",
+    call$1: [function(map) {
+      var mapType, t1;
+      mapType = J.$index$asx(map, "type");
+      t1 = J.getInterceptor$s(mapType);
+      if (t1.startsWith$1(mapType, "@"))
+        mapType = t1.substring$1(mapType, 1);
+      t1 = this.this_0;
+      if (!J.$eq(mapType, t1._serviceType))
+        return D.ServiceObject_ServiceObject$_fromMap(t1._owner, map);
+      t1.update$1(map);
+      return t1;
+    }, "call$1", null, 2, 0, null, 183, "call"],
+    $isFunction: true
+  },
+  ServiceObject_reload_closure0: {
+    "^": "Closure:69;this_1",
+    call$0: [function() {
+      this.this_1._inProgressReload = null;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  ServiceObjectOwner: {
+    "^": "ServiceObject;"
+  },
+  VM: {
+    "^": "ServiceObjectOwner_ChangeNotifier;",
+    get$vm: function(_) {
+      return this;
+    },
+    get$isolate: function(_) {
+      return;
+    },
+    get$isolates: function() {
+      var t1 = this._isolateCache;
+      return t1.get$values(t1);
+    },
+    get$link: function(_) {
+      return H.S(this._id);
+    },
+    relativeLink$1: [function(id) {
+      return H.S(id);
+    }, "call$1", "get$relativeLink", 2, 0, 151, 185],
+    get$version: function(_) {
+      return this._service$__$version;
+    },
+    get$uptime: function() {
+      return this._service$__$uptime;
+    },
+    get$assertsEnabled: function() {
+      return this._service$__$assertsEnabled;
+    },
+    get$typeChecksEnabled: function() {
+      return this._service$__$typeChecksEnabled;
+    },
+    get$pid: function() {
+      return this._service$__$pid;
+    },
+    get$lastUpdate: function() {
+      return this._service$__$lastUpdate;
+    },
+    _parseObjectId$1: function(id) {
+      var m, t1, t2, t3;
+      m = $.get$VM__currentObjectMatcher().matchAsPrefix$1(0, id);
+      if (m == null)
+        return;
+      t1 = m._match;
+      t2 = t1.input;
+      t3 = t1.index;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1 = J.get$length$asx(t1[0]);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return C.JSString_methods.substring$1(t2, t3 + t1);
+    },
+    _parseIsolateId$1: function(id) {
+      var m, t1, t2;
+      m = $.get$VM__currentIsolateMatcher().matchAsPrefix$1(0, id);
+      if (m == null)
+        return "";
+      t1 = m._match;
+      t2 = t1.index;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1 = J.get$length$asx(t1[0]);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return J.substring$2$s(id, 0, t2 + t1);
+    },
+    getFromMap$1: function(map) {
+      throw H.wrapException(P.UnimplementedError$(null));
+    },
+    _getIsolate$1: function(isolateId) {
+      var isolate;
+      if (isolateId === "")
+        return P._Future$immediate(null, null);
+      isolate = this._isolateCache.$index(0, isolateId);
+      if (isolate != null)
+        return P._Future$immediate(isolate, null);
+      return this.reload$0(0).then$1(new D.VM__getIsolate_closure(this, isolateId));
+    },
+    get$1: function(id) {
+      var isolateId, objectId, obj;
+      if (J.startsWith$1$s(id, "isolates/")) {
+        isolateId = this._parseIsolateId$1(id);
+        objectId = this._parseObjectId$1(id);
+        return this._getIsolate$1(isolateId).then$1(new D.VM_get_closure(this, objectId));
+      }
+      obj = this._cache.$index(0, id);
+      if (obj != null)
+        return J.reload$0$x(obj);
+      return this.getAsMap$1(id).then$1(new D.VM_get_closure0(this, id));
+    },
+    _service$_reviver$2: [function(key, value) {
+      return value;
+    }, "call$2", "get$_service$_reviver", 4, 0, 75],
+    _parseJSON$1: function(response) {
+      var map, decoder, exception;
+      map = null;
+      try {
+        decoder = new P.JsonDecoder(this.get$_service$_reviver());
+        map = P._parseJson(response, decoder.get$_reviver());
+      } catch (exception) {
+        H.unwrapException(exception);
+        return;
+      }
+
+      return R._toObservableDeep(map);
+    },
+    _processMap$1: function(map) {
+      var t1;
+      if (!D._isServiceMap(map)) {
+        t1 = P.LinkedHashMap_LinkedHashMap$_literal(["type", "ServiceException", "id", "", "kind", "FormatException", "response", map, "message", "Top level service responses must be service maps."], null, null);
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this, R._toObservableDeep(t1)), null, null);
+      }
+      t1 = J.getInterceptor$asx(map);
+      if (J.$eq(t1.$index(map, "type"), "ServiceError"))
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this, map), null, null);
+      else if (J.$eq(t1.$index(map, "type"), "ServiceException"))
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this, map), null, null);
+      return P._Future$immediate(map, null);
+    },
+    getAsMap$1: function(id) {
+      return this.getString$1(0, id).then$1(new D.VM_getAsMap_closure(this)).catchError$2$test(new D.VM_getAsMap_closure0(this), new D.VM_getAsMap_closure1()).catchError$2$test(new D.VM_getAsMap_closure2(this), new D.VM_getAsMap_closure3());
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "version");
+      this._service$__$version = F.notifyPropertyChangeHelper(this, C.Symbol_version, this._service$__$version, t2);
+      t2 = t1.$index(map, "architecture");
+      this._service$__$architecture = F.notifyPropertyChangeHelper(this, C.Symbol_architecture, this._service$__$architecture, t2);
+      t2 = t1.$index(map, "uptime");
+      this._service$__$uptime = F.notifyPropertyChangeHelper(this, C.Symbol_uptime, this._service$__$uptime, t2);
+      t2 = P.DateTime$fromMillisecondsSinceEpoch(H.Primitives_parseInt(t1.$index(map, "date"), null, null), false);
+      this._service$__$lastUpdate = F.notifyPropertyChangeHelper(this, C.Symbol_lastUpdate, this._service$__$lastUpdate, t2);
+      t2 = t1.$index(map, "assertsEnabled");
+      this._service$__$assertsEnabled = F.notifyPropertyChangeHelper(this, C.Symbol_assertsEnabled, this._service$__$assertsEnabled, t2);
+      t2 = t1.$index(map, "pid");
+      this._service$__$pid = F.notifyPropertyChangeHelper(this, C.Symbol_pid, this._service$__$pid, t2);
+      t2 = t1.$index(map, "typeChecksEnabled");
+      this._service$__$typeChecksEnabled = F.notifyPropertyChangeHelper(this, C.Symbol_typeChecksEnabled, this._service$__$typeChecksEnabled, t2);
+      this._updateIsolates$1(t1.$index(map, "isolates"));
+    },
+    _updateIsolates$1: function(newIsolates) {
+      var oldIsolateCache, newIsolateCache, t1, isolateMap, isolateId, isolate;
+      oldIsolateCache = this._isolateCache;
+      newIsolateCache = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.Isolate);
+      for (t1 = J.get$iterator$ax(newIsolates); t1.moveNext$0();) {
+        isolateMap = t1.get$current();
+        isolateId = J.$index$asx(isolateMap, "id");
+        isolate = oldIsolateCache.$index(0, isolateId);
+        if (isolate != null)
+          newIsolateCache.$indexSet(0, isolateId, isolate);
+        else {
+          isolate = D.ServiceObject_ServiceObject$_fromMap(this, isolateMap);
+          newIsolateCache.$indexSet(0, isolateId, isolate);
+          N.Logger_Logger("").info$1("New isolate '" + H.S(isolate._id) + "'");
+        }
+      }
+      newIsolateCache.forEach$1(0, new D.VM__updateIsolates_closure());
+      this._isolateCache = newIsolateCache;
+    },
+    VM$0: function() {
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, "vm");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, "vm");
+      this._cache.$indexSet(0, "vm", this);
+      var t1 = P.LinkedHashMap_LinkedHashMap$_literal(["id", "vm", "type", "@VM"], null, null);
+      this.update$1(R._toObservableDeep(t1));
+    },
+    $isVM: true
+  },
+  ServiceObjectOwner_ChangeNotifier: {
+    "^": "ServiceObjectOwner+ChangeNotifier;",
+    $isObservable: true
+  },
+  VM__getIsolate_closure: {
+    "^": "Closure:13;this_0,isolateId_1",
+    call$1: [function(result) {
+      if (!J.getInterceptor(result).$isVM)
+        return;
+      return this.this_0._isolateCache.$index(0, this.isolateId_1);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  VM_get_closure: {
+    "^": "Closure:13;this_0,objectId_1",
+    call$1: [function(isolate) {
+      var t1;
+      if (isolate == null)
+        return this.this_0;
+      t1 = this.objectId_1;
+      if (t1 == null)
+        return J.reload$0$x(isolate);
+      else
+        return isolate.get$1(t1);
+    }, "call$1", null, 2, 0, null, 7, "call"],
+    $isFunction: true
+  },
+  VM_get_closure0: {
+    "^": "Closure:184;this_2,id_3",
+    call$1: [function(map) {
+      var t1, obj;
+      t1 = this.this_2;
+      obj = D.ServiceObject_ServiceObject$_fromMap(t1, map);
+      if (obj.get$canCache())
+        t1._cache.putIfAbsent$2(this.id_3, new D.VM_get__closure(obj));
+      return obj;
+    }, "call$1", null, 2, 0, null, 183, "call"],
+    $isFunction: true
+  },
+  VM_get__closure: {
+    "^": "Closure:69;obj_4",
+    call$0: function() {
+      return this.obj_4;
+    },
+    $isFunction: true
+  },
+  VM_getAsMap_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(response) {
+      var map, e, exception, t1;
+      map = null;
+      try {
+        map = this.this_0._parseJSON$1(response);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        P.print("Hit V8 bug.");
+        t1 = P.LinkedHashMap_LinkedHashMap$_literal(["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.S(e)], null, null);
+        t1 = R._toObservableDeep(t1);
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this.this_0, t1), null, null);
+      }
+
+      return this.this_0._processMap$1(map);
+    }, "call$1", null, 2, 0, null, 132, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure0: {
+    "^": "Closure:13;this_1",
+    call$1: [function(error) {
+      var t1 = this.this_1.errors;
+      if (t1._state >= 4)
+        H.throwExpression(t1._addEventError$0());
+      t1._sendData$1(error);
+      return P._Future$immediateError(error, null, null);
+    }, "call$1", null, 2, 0, null, 24, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure1: {
+    "^": "Closure:13;",
+    call$1: [function(e) {
+      return !!J.getInterceptor(e).$isServiceError;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure2: {
+    "^": "Closure:13;this_2",
+    call$1: [function(exception) {
+      var t1 = this.this_2.exceptions;
+      if (t1._state >= 4)
+        H.throwExpression(t1._addEventError$0());
+      t1._sendData$1(exception);
+      return P._Future$immediateError(exception, null, null);
+    }, "call$1", null, 2, 0, null, 85, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure3: {
+    "^": "Closure:13;",
+    call$1: [function(e) {
+      return !!J.getInterceptor(e).$isServiceException;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  VM__updateIsolates_closure: {
+    "^": "Closure:75;",
+    call$2: function(isolateId, isolate) {
+      J.reload$0$x(isolate);
+    },
+    $isFunction: true
+  },
+  TagProfileSnapshot: {
+    "^": "Object;seconds,counters>,_sum",
+    set$1: function(counters) {
+      var t1, t2, i, t3, t4;
+      t1 = this.counters;
+      H.IterableMixinWorkaround_setAllList(t1, 0, counters);
+      for (t2 = t1.length, i = 0; i < t2; ++i) {
+        t3 = this._sum;
+        t4 = t1[i];
+        if (typeof t4 !== "number")
+          return H.iae(t4);
+        this._sum = t3 + t4;
+      }
+    },
+    delta$2: function(counters, old_counters) {
+      var t1, t2, t3, t4, i, t5, t6;
+      for (t1 = this.counters, t2 = t1.length, t3 = J.getInterceptor$asx(counters), t4 = old_counters.length, i = 0; i < t2; ++i) {
+        t5 = t3.$index(counters, i);
+        if (i >= t4)
+          return H.ioore(old_counters, i);
+        t5 = J.$sub$n(t5, old_counters[i]);
+        t1[i] = t5;
+        t6 = this._sum;
+        if (typeof t5 !== "number")
+          return H.iae(t5);
+        this._sum = t6 + t5;
+      }
+    },
+    max$1: function(_, counters) {
+      var t1, t2, t3, i, t4, c;
+      t1 = J.getInterceptor$asx(counters);
+      t2 = this.counters;
+      t3 = t2.length;
+      i = 0;
+      while (true) {
+        t4 = t1.get$length(counters);
+        if (typeof t4 !== "number")
+          return H.iae(t4);
+        if (!(i < t4))
+          break;
+        c = t1.$index(counters, i);
+        if (i >= t3)
+          return H.ioore(t2, i);
+        t2[i] = J.$gt$n(t2[i], c) ? t2[i] : c;
+        ++i;
+      }
+    },
+    zero$0: function() {
+      var t1, t2, i;
+      for (t1 = this.counters, t2 = t1.length, i = 0; i < t2; ++i)
+        t1[i] = 0;
+    },
+    $isTagProfileSnapshot: true
+  },
+  TagProfile: {
+    "^": "Object;names<,snapshots<,_seconds,_maxSnapshot,_historySize,_countersLength",
+    get$updatedAtSeconds: function() {
+      return this._seconds;
+    },
+    _processTagProfile$2: function(seconds, tagProfile) {
+      var t1, counters, t2, i, t3, snapshot;
+      this._seconds = seconds;
+      t1 = J.getInterceptor$asx(tagProfile);
+      counters = t1.$index(tagProfile, "counters");
+      t2 = this.names;
+      if (t2.length === 0) {
+        C.JSArray_methods.addAll$1(t2, t1.$index(tagProfile, "names"));
+        this._countersLength = J.get$length$asx(t1.$index(tagProfile, "counters"));
+        for (t1 = this._historySize, t2 = this.snapshots, i = 0; t3 = this._countersLength, i < t1; ++i) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          t3 = Array(t3);
+          t3.fixed$length = init;
+          t3.$builtinTypeInfo = [P.$int];
+          snapshot = new D.TagProfileSnapshot(0, t3, 0);
+          snapshot.zero$0();
+          t2.push(snapshot);
+        }
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        t1 = Array(t3);
+        t1.fixed$length = init;
+        t1 = new D.TagProfileSnapshot(0, H.setRuntimeTypeInfo(t1, [P.$int]), 0);
+        this._maxSnapshot = t1;
+        t1.set$1(counters);
+        return;
+      }
+      t1 = this._countersLength;
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      t1 = Array(t1);
+      t1.fixed$length = init;
+      snapshot = new D.TagProfileSnapshot(seconds, H.setRuntimeTypeInfo(t1, [P.$int]), 0);
+      snapshot.delta$2(counters, this._maxSnapshot.counters);
+      this._maxSnapshot.max$1(0, counters);
+      t1 = this.snapshots;
+      t1.push(snapshot);
+      if (t1.length > this._historySize)
+        C.JSArray_methods.removeAt$1(t1, 0);
+    }
+  },
+  HeapSpace: {
+    "^": "ChangeNotifier;_service$__$used,_service$__$capacity,_service$__$external,_service$__$collections,_service$__$totalCollectionTimeInSeconds,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$used: function() {
+      return this._service$__$used;
+    },
+    get$capacity: function() {
+      return this._service$__$capacity;
+    },
+    get$external: function() {
+      return this._service$__$external;
+    },
+    get$collections: function() {
+      return this._service$__$collections;
+    },
+    get$totalCollectionTimeInSeconds: function() {
+      return this._service$__$totalCollectionTimeInSeconds;
+    },
+    update$1: function(heapMap) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(heapMap);
+      t2 = t1.$index(heapMap, "used");
+      this._service$__$used = F.notifyPropertyChangeHelper(this, C.Symbol_used, this._service$__$used, t2);
+      t2 = t1.$index(heapMap, "capacity");
+      this._service$__$capacity = F.notifyPropertyChangeHelper(this, C.Symbol_capacity, this._service$__$capacity, t2);
+      t2 = t1.$index(heapMap, "external");
+      this._service$__$external = F.notifyPropertyChangeHelper(this, C.Symbol_external, this._service$__$external, t2);
+      t2 = t1.$index(heapMap, "collections");
+      this._service$__$collections = F.notifyPropertyChangeHelper(this, C.Symbol_collections, this._service$__$collections, t2);
+      t1 = t1.$index(heapMap, "time");
+      this._service$__$totalCollectionTimeInSeconds = F.notifyPropertyChangeHelper(this, C.Symbol_totalCollectionTimeInSeconds, this._service$__$totalCollectionTimeInSeconds, t1);
+    }
+  },
+  Isolate: {
+    "^": "ServiceObjectOwner_ChangeNotifier0;_service$__$counters,_service$__$pauseEvent,_service$__$running,_service$__$idle,_service$__$loading,_service$__$ioEnabled,_cache,tagProfile,_service$__$objectClass,rootClasses,_service$__$rootLib,_service$__$libraries,_service$__$topFrame,_service$__$name:service$Isolate$_service$__$name@,_service$__$vmName:service$Isolate$_service$__$vmName@,_service$__$mainPort,_service$__$entry,timers,newSpace<,oldSpace<,_service$__$fileAndLine,_service$__$error,profileTrieRoot<,_trieDataCursor,_trieData,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$vm: function(_) {
+      return this._owner;
+    },
+    get$isolate: function(_) {
+      return this;
+    },
+    get$counters: function(_) {
+      return this._service$__$counters;
+    },
+    set$counters: function(_, value) {
+      this._service$__$counters = F.notifyPropertyChangeHelper(this, C.Symbol_counters, this._service$__$counters, value);
+    },
+    get$link: function(_) {
+      return "/" + H.S(this._id);
+    },
+    get$pauseEvent: function(_) {
+      return this._service$__$pauseEvent;
+    },
+    get$running: function() {
+      return this._service$__$running;
+    },
+    get$idle: function() {
+      return this._service$__$idle;
+    },
+    get$loading: function() {
+      return this._service$__$loading;
+    },
+    relativeLink$1: [function(id) {
+      return "/" + H.S(this._id) + "/" + H.S(id);
+    }, "call$1", "get$relativeLink", 2, 0, 151, 185],
+    processProfile$1: function(profile) {
+      var codeTable, t1, t2, exclusiveTrie;
+      codeTable = H.setRuntimeTypeInfo([], [D.Code]);
+      t1 = J.getInterceptor$asx(profile);
+      for (t2 = J.get$iterator$ax(t1.$index(profile, "codes")); t2.moveNext$0();)
+        codeTable.push(J.$index$asx(t2.get$current(), "code"));
+      this._resetProfileData$0();
+      this._updateProfileData$2(profile, codeTable);
+      exclusiveTrie = t1.$index(profile, "exclusive_trie");
+      if (exclusiveTrie != null)
+        this.profileTrieRoot = this._processProfileTrie$2(exclusiveTrie, codeTable);
+    },
+    _resetProfileData$0: function() {
+      var t1 = this._cache;
+      t1.get$values(t1).forEach$1(0, new D.Isolate__resetProfileData_closure());
+    },
+    _updateProfileData$2: function(profile, codeTable) {
+      var t1, codeRegions, sampleCount, codeRegion;
+      t1 = J.getInterceptor$asx(profile);
+      codeRegions = t1.$index(profile, "codes");
+      sampleCount = t1.$index(profile, "samples");
+      for (t1 = J.get$iterator$ax(codeRegions); t1.moveNext$0();) {
+        codeRegion = t1.get$current();
+        J.$index$asx(codeRegion, "code").updateProfileData$3(codeRegion, codeTable, sampleCount);
+      }
+    },
+    refreshCoverage$0: [function(_) {
+      return this.get$1("coverage").then$1(this.get$_processCoverage());
+    }, "call$0", "get$refreshCoverage", 0, 0, 186],
+    _processCoverage$1: [function(coverage) {
+      J.forEach$1$ax(J.$index$asx(coverage, "coverage"), new D.Isolate__processCoverage_closure(this));
+    }, "call$1", "get$_processCoverage", 2, 0, 134, 187],
+    getClassHierarchy$0: function() {
+      return this.get$1("classes").then$1(this.get$_loadClasses()).then$1(this.get$_buildClassHierarchy());
+    },
+    _loadClasses$1: [function(classList) {
+      var futureClasses, t1, cls, t2;
+      futureClasses = [];
+      for (t1 = J.get$iterator$ax(J.$index$asx(classList, "members")); t1.moveNext$0();) {
+        cls = t1.get$current();
+        t2 = J.getInterceptor(cls);
+        if (!!t2.$isClass)
+          futureClasses.push(t2.load$0(cls));
+      }
+      return P.Future_wait(futureClasses, false);
+    }, "call$1", "get$_loadClasses", 2, 0, 188, 189],
+    _buildClassHierarchy$1: [function(classes) {
+      var t1, t2, cls, t3;
+      t1 = this.rootClasses;
+      t1.clear$0(t1);
+      this._service$__$objectClass = F.notifyPropertyChangeHelper(this, C.Symbol_objectClass, this._service$__$objectClass, null);
+      for (t2 = J.get$iterator$ax(classes); t2.moveNext$0();) {
+        cls = t2.get$current();
+        if (cls.get$superClass() == null)
+          t1.add$1(0, cls);
+        if (J.$eq(cls.get$vmName(), "Object") && J.$eq(cls.get$isPatch(), false)) {
+          t3 = this._service$__$objectClass;
+          if (this.get$hasObservers(this) && !J.$eq(t3, cls)) {
+            t3 = new T.PropertyChangeRecord(this, C.Symbol_objectClass, t3, cls);
+            t3.$builtinTypeInfo = [null];
+            this.notifyChange$1(this, t3);
+          }
+          this._service$__$objectClass = cls;
+        }
+      }
+      return P._Future$immediate(this._service$__$objectClass, null);
+    }, "call$1", "get$_buildClassHierarchy", 2, 0, 190, 191],
+    getFromMap$1: function(map) {
+      var id, t1, obj;
+      if (map == null)
+        return;
+      id = J.$index$asx(map, "id");
+      t1 = this._cache;
+      obj = t1.$index(0, id);
+      if (obj != null)
+        return obj;
+      obj = D.ServiceObject_ServiceObject$_fromMap(this, map);
+      if (obj.get$canCache())
+        t1.$indexSet(0, id, obj);
+      return obj;
+    },
+    get$1: function(id) {
+      var obj = this._cache.$index(0, id);
+      if (obj != null)
+        return J.reload$0$x(obj);
+      return this._owner.getAsMap$1("/" + H.S(this._id) + "/" + H.S(id)).then$1(new D.Isolate_get_closure(this, id));
+    },
+    get$objectClass: function() {
+      return this._service$__$objectClass;
+    },
+    get$rootLib: function() {
+      return this._service$__$rootLib;
+    },
+    set$rootLib: function(value) {
+      this._service$__$rootLib = F.notifyPropertyChangeHelper(this, C.Symbol_rootLib, this._service$__$rootLib, value);
+    },
+    get$libraries: function() {
+      return this._service$__$libraries;
+    },
+    get$topFrame: function() {
+      return this._service$__$topFrame;
+    },
+    get$name: function(_) {
+      return this.service$Isolate$_service$__$name;
+    },
+    set$name: function(_, value) {
+      this.service$Isolate$_service$__$name = F.notifyPropertyChangeHelper(this, C.Symbol_name, this.service$Isolate$_service$__$name, value);
+    },
+    get$vmName: function() {
+      return this.service$Isolate$_service$__$vmName;
+    },
+    set$vmName: function(value) {
+      this.service$Isolate$_service$__$vmName = F.notifyPropertyChangeHelper(this, C.Symbol_vmName, this.service$Isolate$_service$__$vmName, value);
+    },
+    get$mainPort: function() {
+      return this._service$__$mainPort;
+    },
+    get$entry: function() {
+      return this._service$__$entry;
+    },
+    set$entry: function(value) {
+      this._service$__$entry = F.notifyPropertyChangeHelper(this, C.Symbol_entry, this._service$__$entry, value);
+    },
+    get$error: function(_) {
+      return this._service$__$error;
+    },
+    set$error: function(_, value) {
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, value);
+    },
+    updateHeapsFromMap$1: function(map) {
+      var t1 = J.getInterceptor$asx(map);
+      this.newSpace.update$1(t1.$index(map, "new"));
+      this.oldSpace.update$1(t1.$index(map, "old"));
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, countersMap, names, counts, sum, i, t3, t4, timerMap, features;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "mainPort");
+      this._service$__$mainPort = F.notifyPropertyChangeHelper(this, C.Symbol_mainPort, this._service$__$mainPort, t2);
+      t2 = t1.$index(map, "name");
+      this.service$Isolate$_service$__$name = F.notifyPropertyChangeHelper(this, C.Symbol_name, this.service$Isolate$_service$__$name, t2);
+      t2 = t1.$index(map, "name");
+      this.service$Isolate$_service$__$vmName = F.notifyPropertyChangeHelper(this, C.Symbol_vmName, this.service$Isolate$_service$__$vmName, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      this._service$__$loading = F.notifyPropertyChangeHelper(this, C.Symbol_loading, this._service$__$loading, false);
+      D._upgradeCollection(map, this);
+      if (t1.$index(map, "rootLib") == null || t1.$index(map, "timers") == null || t1.$index(map, "heaps") == null) {
+        N.Logger_Logger("").severe$1("Malformed 'Isolate' response: " + H.S(map));
+        return;
+      }
+      t2 = t1.$index(map, "rootLib");
+      this._service$__$rootLib = F.notifyPropertyChangeHelper(this, C.Symbol_rootLib, this._service$__$rootLib, t2);
+      if (t1.$index(map, "entry") != null) {
+        t2 = t1.$index(map, "entry");
+        this._service$__$entry = F.notifyPropertyChangeHelper(this, C.Symbol_entry, this._service$__$entry, t2);
+      }
+      if (t1.$index(map, "topFrame") != null) {
+        t2 = t1.$index(map, "topFrame");
+        this._service$__$topFrame = F.notifyPropertyChangeHelper(this, C.Symbol_topFrame, this._service$__$topFrame, t2);
+      } else
+        this._service$__$topFrame = F.notifyPropertyChangeHelper(this, C.Symbol_topFrame, this._service$__$topFrame, null);
+      countersMap = t1.$index(map, "tagCounters");
+      if (countersMap != null) {
+        t2 = J.getInterceptor$asx(countersMap);
+        names = t2.$index(countersMap, "names");
+        counts = t2.$index(countersMap, "counters");
+        t2 = J.getInterceptor$asx(counts);
+        sum = 0;
+        i = 0;
+        while (true) {
+          t3 = t2.get$length(counts);
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(i < t3))
+            break;
+          t3 = t2.$index(counts, i);
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          sum += t3;
+          ++i;
+        }
+        t3 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t3 = R._toObservableDeep(t3);
+        this._service$__$counters = F.notifyPropertyChangeHelper(this, C.Symbol_counters, this._service$__$counters, t3);
+        if (sum === 0) {
+          t2 = J.getInterceptor$asx(names);
+          i = 0;
+          while (true) {
+            t3 = t2.get$length(names);
+            if (typeof t3 !== "number")
+              return H.iae(t3);
+            if (!(i < t3))
+              break;
+            J.$indexSet$ax(this._service$__$counters, t2.$index(names, i), "0.0%");
+            ++i;
+          }
+        } else {
+          t3 = J.getInterceptor$asx(names);
+          i = 0;
+          while (true) {
+            t4 = t3.get$length(names);
+            if (typeof t4 !== "number")
+              return H.iae(t4);
+            if (!(i < t4))
+              break;
+            J.$indexSet$ax(this._service$__$counters, t3.$index(names, i), C.JSNumber_methods.toStringAsFixed$1(J.$div$n(t2.$index(counts, i), sum) * 100, 2) + "%");
+            ++i;
+          }
+        }
+      }
+      timerMap = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      J.forEach$1$ax(t1.$index(map, "timers"), new D.Isolate__update_closure(timerMap));
+      t2 = this.timers;
+      t3 = J.getInterceptor$ax(t2);
+      t3.$indexSet(t2, "total", timerMap.$index(0, "time_total_runtime"));
+      t3.$indexSet(t2, "compile", timerMap.$index(0, "time_compilation"));
+      t3.$indexSet(t2, "gc", 0);
+      t3.$indexSet(t2, "init", J.$add$ns(J.$add$ns(J.$add$ns(timerMap.$index(0, "time_script_loading"), timerMap.$index(0, "time_creating_snapshot")), timerMap.$index(0, "time_isolate_initialization")), timerMap.$index(0, "time_bootstrap")));
+      t3.$indexSet(t2, "dart", timerMap.$index(0, "time_dart_execution"));
+      this.updateHeapsFromMap$1(t1.$index(map, "heaps"));
+      features = t1.$index(map, "features");
+      if (features != null)
+        for (t2 = J.get$iterator$ax(features); t2.moveNext$0();)
+          if (J.$eq(t2.get$current(), "io")) {
+            t3 = this._service$__$ioEnabled;
+            if (this.get$hasObservers(this) && !J.$eq(t3, true)) {
+              t3 = new T.PropertyChangeRecord(this, C.Symbol_ioEnabled, t3, true);
+              t3.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t3);
+            }
+            this._service$__$ioEnabled = true;
+          }
+      t2 = t1.$index(map, "pauseEvent");
+      t2 = F.notifyPropertyChangeHelper(this, C.Symbol_pauseEvent, this._service$__$pauseEvent, t2);
+      this._service$__$pauseEvent = t2;
+      t2 = t2 == null && t1.$index(map, "topFrame") != null;
+      this._service$__$running = F.notifyPropertyChangeHelper(this, C.Symbol_running, this._service$__$running, t2);
+      t2 = this._service$__$pauseEvent == null && t1.$index(map, "topFrame") == null;
+      this._service$__$idle = F.notifyPropertyChangeHelper(this, C.Symbol_idle, this._service$__$idle, t2);
+      t2 = t1.$index(map, "error");
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, t2);
+      t2 = this._service$__$libraries;
+      t2.clear$0(t2);
+      for (t1 = J.get$iterator$ax(t1.$index(map, "libraries")); t1.moveNext$0();)
+        t2.add$1(0, t1.get$current());
+      t2.sort$1(t2, new D.Isolate__update_closure0());
+    },
+    updateTagProfile$0: function() {
+      return this._owner.getAsMap$1("/" + H.S(this._id) + "/profile/tag").then$1(new D.Isolate_updateTagProfile_closure(this));
+    },
+    _processProfileTrie$2: function(data, codeTable) {
+      this._trieDataCursor = 0;
+      this._trieData = data;
+      if (data == null)
+        return;
+      if (J.$lt$n(J.get$length$asx(data), 3))
+        return;
+      return this._readTrieNode$1(codeTable);
+    },
+    _readTrieNode$1: function(codeTable) {
+      var t1, t2, index, code, count, node, t3, children, i, child;
+      t1 = this._trieData;
+      t2 = this._trieDataCursor;
+      if (typeof t2 !== "number")
+        return t2.$add();
+      this._trieDataCursor = t2 + 1;
+      index = J.$index$asx(t1, t2);
+      if (index >>> 0 !== index || index >= codeTable.length)
+        return H.ioore(codeTable, index);
+      code = codeTable[index];
+      t2 = this._trieData;
+      t1 = this._trieDataCursor;
+      if (typeof t1 !== "number")
+        return t1.$add();
+      this._trieDataCursor = t1 + 1;
+      count = J.$index$asx(t2, t1);
+      t1 = [];
+      t1.$builtinTypeInfo = [D.CodeTrieNode];
+      node = new D.CodeTrieNode(code, count, t1, 0);
+      t2 = this._trieData;
+      t3 = this._trieDataCursor;
+      if (typeof t3 !== "number")
+        return t3.$add();
+      this._trieDataCursor = t3 + 1;
+      children = J.$index$asx(t2, t3);
+      if (typeof children !== "number")
+        return H.iae(children);
+      i = 0;
+      for (; i < children; ++i) {
+        child = this._readTrieNode$1(codeTable);
+        t1.push(child);
+        t2 = node.summedChildCount;
+        t3 = child.count;
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        node.summedChildCount = t2 + t3;
+      }
+      return node;
+    },
+    $isIsolate: true,
+    static: {"^": "Isolate_TAG_ROOT_ID"}
+  },
+  ServiceObjectOwner_ChangeNotifier0: {
+    "^": "ServiceObjectOwner+ChangeNotifier;",
+    $isObservable: true
+  },
+  Isolate__resetProfileData_closure: {
+    "^": "Closure:13;",
+    call$1: function(value) {
+      if (!!J.getInterceptor(value).$isCode) {
+        value._service$__$totalSamplesInProfile = F.notifyPropertyChangeHelper(value, C.Symbol_totalSamplesInProfile, value._service$__$totalSamplesInProfile, 0);
+        value.exclusiveTicks = 0;
+        value.inclusiveTicks = 0;
+        value._service$__$formattedInclusiveTicks = F.notifyPropertyChangeHelper(value, C.Symbol_formattedInclusiveTicks, value._service$__$formattedInclusiveTicks, "");
+        value._service$__$formattedExclusiveTicks = F.notifyPropertyChangeHelper(value, C.Symbol_formattedExclusiveTicks, value._service$__$formattedExclusiveTicks, "");
+        C.JSArray_methods.set$length(value.callers, 0);
+        C.JSArray_methods.set$length(value.callees, 0);
+        value.addressTicks.clear$0(0);
+      }
+    },
+    $isFunction: true
+  },
+  Isolate__processCoverage_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(scriptCoverage) {
+      var t1 = J.getInterceptor$asx(scriptCoverage);
+      t1.$index(scriptCoverage, "script")._processHits$1(t1.$index(scriptCoverage, "hits"));
+    }, "call$1", null, 2, 0, null, 192, "call"],
+    $isFunction: true
+  },
+  Isolate_get_closure: {
+    "^": "Closure:184;this_0,id_1",
+    call$1: [function(map) {
+      var t1, obj;
+      t1 = this.this_0;
+      obj = D.ServiceObject_ServiceObject$_fromMap(t1, map);
+      if (obj.get$canCache())
+        t1._cache.putIfAbsent$2(this.id_1, new D.Isolate_get__closure(obj));
+      return obj;
+    }, "call$1", null, 2, 0, null, 183, "call"],
+    $isFunction: true
+  },
+  Isolate_get__closure: {
+    "^": "Closure:69;obj_2",
+    call$0: function() {
+      return this.obj_2;
+    },
+    $isFunction: true
+  },
+  Isolate__update_closure: {
+    "^": "Closure:13;timerMap_0",
+    call$1: [function(timer) {
+      var t1 = J.getInterceptor$asx(timer);
+      this.timerMap_0.$indexSet(0, t1.$index(timer, "name"), t1.$index(timer, "time"));
+    }, "call$1", null, 2, 0, null, 193, "call"],
+    $isFunction: true
+  },
+  Isolate__update_closure0: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.compareTo$1$ns(J.get$name$x(a), J.get$name$x(b));
+    },
+    $isFunction: true
+  },
+  Isolate_updateTagProfile_closure: {
+    "^": "Closure:184;this_0",
+    call$1: [function(m) {
+      var t1, t2;
+      t1 = Date.now();
+      new P.DateTime(t1, false).DateTime$_now$0();
+      t2 = this.this_0.tagProfile;
+      t2._processTagProfile$2(t1 / 1000, m);
+      return t2;
+    }, "call$1", null, 2, 0, null, 145, "call"],
+    $isFunction: true
+  },
+  ServiceMap: {
+    "^": "ServiceObject;_service$_map,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$canCache: function() {
+      return (J.$eq(this._serviceType, "Class") || J.$eq(this._serviceType, "Function") || J.$eq(this._serviceType, "Field")) && !J.startsWith$1$s(this._id, $.ServiceMap_objectIdRingPrefix);
+    },
+    get$immutable: function() {
+      return false;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this._service$_map);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, t3;
+      this._loaded = !mapIsRef;
+      t1 = this._service$_map;
+      t1.clear$0(0);
+      t1.addAll$1(0, map);
+      t2 = t1._observable_map$_map;
+      t3 = t2.$index(0, "user_name");
+      this._service$__$name = this.notifyPropertyChange$3(0, C.Symbol_name, this._service$__$name, t3);
+      t2 = t2.$index(0, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(0, C.Symbol_vmName, this._service$__$vmName, t2);
+      D._upgradeCollection(t1, this._owner);
+    },
+    addAll$1: function(_, other) {
+      return this._service$_map.addAll$1(0, other);
+    },
+    clear$0: function(_) {
+      return this._service$_map.clear$0(0);
+    },
+    forEach$1: function(_, f) {
+      return this._service$_map._observable_map$_map.forEach$1(0, f);
+    },
+    $index: function(_, k) {
+      return this._service$_map._observable_map$_map.$index(0, k);
+    },
+    $indexSet: function(_, k, v) {
+      this._service$_map.$indexSet(0, k, v);
+      return v;
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$length(t1) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$length(t1) !== 0;
+    },
+    get$keys: function() {
+      return this._service$_map._observable_map$_map.get$keys();
+    },
+    get$values: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$values(t1);
+    },
+    get$length: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$length(t1);
+    },
+    deliverChanges$0: [function(_) {
+      var t1 = this._service$_map;
+      return t1.deliverChanges$0(t1);
+    }, "call$0", "get$deliverChanges", 0, 0, 111],
+    notifyChange$1: function(_, record) {
+      var t1 = this._service$_map;
+      return t1.notifyChange$1(t1, record);
+    },
+    notifyPropertyChange$3: function(_, field, oldValue, newValue) {
+      return F.notifyPropertyChangeHelper(this._service$_map, field, oldValue, newValue);
+    },
+    observed$0: [function(_) {
+      return;
+    }, "call$0", "get$observed", 0, 0, 18],
+    unobserved$0: [function(_) {
+      this._service$_map.change_notifier$ChangeNotifier$_changes = null;
+      return;
+    }, "call$0", "get$unobserved", 0, 0, 18],
+    get$changes: function(_) {
+      var t1 = this._service$_map;
+      return t1.get$changes(t1);
+    },
+    get$hasObservers: function(_) {
+      var t1, t2;
+      t1 = this._service$_map.change_notifier$ChangeNotifier$_changes;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isServiceMap: true,
+    $isObservableMap: true,
+    $asObservableMap: function() {
+      return [null, null];
+    },
+    $isMap: true,
+    $asMap: function() {
+      return [null, null];
+    },
+    $isObservable: true,
+    static: {"^": "ServiceMap_objectIdRingPrefix"}
+  },
+  DartError: {
+    "^": "ServiceObject_ChangeNotifier;_service$__$kind,_service$__$message,_service$__$exception,_service$__$stacktrace,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$message: function(_) {
+      return this._service$__$message;
+    },
+    get$exception: function(_) {
+      return this._service$__$exception;
+    },
+    set$exception: function(_, value) {
+      this._service$__$exception = F.notifyPropertyChangeHelper(this, C.Symbol_exception, this._service$__$exception, value);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, t3;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t2 = t1.$index(map, "message");
+      this._service$__$message = F.notifyPropertyChangeHelper(this, C.Symbol_message, this._service$__$message, t2);
+      t2 = this._owner;
+      t3 = D.ServiceObject_ServiceObject$_fromMap(t2, t1.$index(map, "exception"));
+      this._service$__$exception = F.notifyPropertyChangeHelper(this, C.Symbol_exception, this._service$__$exception, t3);
+      t1 = D.ServiceObject_ServiceObject$_fromMap(t2, t1.$index(map, "stacktrace"));
+      this._service$__$stacktrace = F.notifyPropertyChangeHelper(this, C.Symbol_stacktrace, this._service$__$stacktrace, t1);
+      t1 = "DartError " + H.S(this._service$__$kind);
+      t1 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t1);
+      this._service$__$name = t1;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t1);
+    }
+  },
+  ServiceObject_ChangeNotifier: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  ServiceError: {
+    "^": "ServiceObject_ChangeNotifier0;_service$__$kind,_service$__$message,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$message: function(_) {
+      return this._service$__$message;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      this._loaded = true;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t1 = t1.$index(map, "message");
+      this._service$__$message = F.notifyPropertyChangeHelper(this, C.Symbol_message, this._service$__$message, t1);
+      t1 = "ServiceError " + H.S(this._service$__$kind);
+      t1 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t1);
+      this._service$__$name = t1;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t1);
+    },
+    $isServiceError: true
+  },
+  ServiceObject_ChangeNotifier0: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  ServiceException: {
+    "^": "ServiceObject_ChangeNotifier1;_service$__$kind,_service$__$message,_service$__$response,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$message: function(_) {
+      return this._service$__$message;
+    },
+    get$response: function(_) {
+      return this._service$__$response;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t2 = t1.$index(map, "message");
+      this._service$__$message = F.notifyPropertyChangeHelper(this, C.Symbol_message, this._service$__$message, t2);
+      t1 = t1.$index(map, "response");
+      this._service$__$response = F.notifyPropertyChangeHelper(this, C.Symbol_response, this._service$__$response, t1);
+      t1 = "ServiceException " + H.S(this._service$__$kind);
+      t1 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t1);
+      this._service$__$name = t1;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t1);
+    },
+    $isServiceException: true
+  },
+  ServiceObject_ChangeNotifier1: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  Library: {
+    "^": "ServiceObject_ChangeNotifier2;_service$__$url,imports<,scripts<,classes>,variables<,functions<,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$url: function(_) {
+      return this._service$__$url;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return false;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, shortUrl, t3, t4;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "url");
+      shortUrl = F.notifyPropertyChangeHelper(this, C.Symbol_url, this._service$__$url, t2);
+      this._service$__$url = shortUrl;
+      if (J.startsWith$1$s(shortUrl, "file://") || J.startsWith$1$s(this._service$__$url, "http://")) {
+        t2 = this._service$__$url;
+        t3 = J.getInterceptor$asx(t2);
+        t4 = t3.lastIndexOf$1(t2, "/");
+        if (typeof t4 !== "number")
+          return t4.$add();
+        shortUrl = t3.substring$1(t2, t4 + 1);
+      }
+      t2 = t1.$index(map, "user_name");
+      t2 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t2);
+      this._service$__$name = t2;
+      if (J.get$isEmpty$asx(t2) === true)
+        this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, shortUrl);
+      t2 = t1.$index(map, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t2 = this._owner;
+      D._upgradeCollection(map, t2.get$isolate(t2));
+      t2 = this.imports;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "imports"));
+      t2 = this.scripts;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "scripts"));
+      t2 = this.classes;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "classes"));
+      t2 = this.variables;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "variables"));
+      t2 = this.functions;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "functions"));
+    },
+    $isLibrary: true
+  },
+  ServiceObject_ChangeNotifier2: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  AllocationCount: {
+    "^": "ChangeNotifier;_service$__$instances,_service$__$bytes,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$instances: function(_) {
+      return this._service$__$instances;
+    },
+    set$instances: function(_, value) {
+      this._service$__$instances = F.notifyPropertyChangeHelper(this, C.Symbol_instances, this._service$__$instances, value);
+    },
+    get$bytes: function() {
+      return this._service$__$bytes;
+    }
+  },
+  Allocations: {
+    "^": "Object;accumulated<,current<",
+    update$1: function(stats) {
+      var t1, t2, t3;
+      t1 = this.accumulated;
+      t2 = J.getInterceptor$asx(stats);
+      t3 = t2.$index(stats, 6);
+      t1._service$__$instances = F.notifyPropertyChangeHelper(t1, C.Symbol_instances, t1._service$__$instances, t3);
+      t3 = t2.$index(stats, 7);
+      t1._service$__$bytes = F.notifyPropertyChangeHelper(t1, C.Symbol_bytes, t1._service$__$bytes, t3);
+      t3 = this.current;
+      t1 = J.$add$ns(t2.$index(stats, 2), t2.$index(stats, 4));
+      t3._service$__$instances = F.notifyPropertyChangeHelper(t3, C.Symbol_instances, t3._service$__$instances, t1);
+      t2 = J.$add$ns(t2.$index(stats, 3), t2.$index(stats, 5));
+      t3._service$__$bytes = F.notifyPropertyChangeHelper(t3, C.Symbol_bytes, t3._service$__$bytes, t2);
+    },
+    static: {"^": "Allocations_ALLOCATED_BEFORE_GC,Allocations_ALLOCATED_BEFORE_GC_SIZE,Allocations_LIVE_AFTER_GC,Allocations_LIVE_AFTER_GC_SIZE,Allocations_ALLOCATED_SINCE_GC,Allocations_ALLOCATED_SINCE_GC_SIZE,Allocations_ACCUMULATED,Allocations_ACCUMULATED_SIZE"}
+  },
+  Class: {
+    "^": "ServiceObject_ChangeNotifier3;_service$__$library,_service$__$script,_service$__$superClass,_service$__$isAbstract,_service$__$isConst,_service$__$isFinalized,_service$__$isPatch,_service$__$isImplemented,_service$__$tokenPos,_service$__$error,newSpace<,oldSpace<,children>,subClasses<,fields<,functions<,interfaces<,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$library: function(_) {
+      return this._service$__$library;
+    },
+    set$library: function(_, value) {
+      this._service$__$library = F.notifyPropertyChangeHelper(this, C.Symbol_library, this._service$__$library, value);
+    },
+    get$script: function(_) {
+      return this._service$__$script;
+    },
+    set$script: function(_, value) {
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, value);
+    },
+    get$superClass: function() {
+      return this._service$__$superClass;
+    },
+    set$superClass: function(value) {
+      this._service$__$superClass = F.notifyPropertyChangeHelper(this, C.Symbol_superClass, this._service$__$superClass, value);
+    },
+    get$isAbstract: function() {
+      return this._service$__$isAbstract;
+    },
+    get$isPatch: function() {
+      return this._service$__$isPatch;
+    },
+    get$tokenPos: function() {
+      return this._service$__$tokenPos;
+    },
+    set$tokenPos: function(value) {
+      this._service$__$tokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_tokenPos, this._service$__$tokenPos, value);
+    },
+    get$error: function(_) {
+      return this._service$__$error;
+    },
+    set$error: function(_, value) {
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, value);
+    },
+    get$hasNoAllocations: function() {
+      var t1, t2;
+      t1 = this.newSpace;
+      t2 = t1.accumulated;
+      if (J.$eq(t2._service$__$instances, 0) && J.$eq(t2._service$__$bytes, 0)) {
+        t1 = t1.current;
+        t1 = J.$eq(t1._service$__$instances, 0) && J.$eq(t1._service$__$bytes, 0);
+      } else
+        t1 = false;
+      if (t1) {
+        t1 = this.oldSpace;
+        t2 = t1.accumulated;
+        if (J.$eq(t2._service$__$instances, 0) && J.$eq(t2._service$__$bytes, 0)) {
+          t1 = t1.current;
+          t1 = J.$eq(t1._service$__$instances, 0) && J.$eq(t1._service$__$bytes, 0);
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return false;
+    },
+    toString$0: function(_) {
+      return "Service Class: " + H.S(this._service$__$vmName);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, allocationStats;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "user_name");
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t2);
+      t2 = t1.$index(map, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t2 = this._owner;
+      D._upgradeCollection(map, t2.get$isolate(t2));
+      if (!!J.getInterceptor(t1.$index(map, "library")).$isLibrary) {
+        t2 = t1.$index(map, "library");
+        this._service$__$library = F.notifyPropertyChangeHelper(this, C.Symbol_library, this._service$__$library, t2);
+      } else
+        this._service$__$library = F.notifyPropertyChangeHelper(this, C.Symbol_library, this._service$__$library, null);
+      t2 = t1.$index(map, "script");
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, t2);
+      t2 = t1.$index(map, "abstract");
+      this._service$__$isAbstract = F.notifyPropertyChangeHelper(this, C.Symbol_isAbstract, this._service$__$isAbstract, t2);
+      t2 = t1.$index(map, "const");
+      this._service$__$isConst = F.notifyPropertyChangeHelper(this, C.Symbol_isConst, this._service$__$isConst, t2);
+      t2 = t1.$index(map, "finalized");
+      this._service$__$isFinalized = F.notifyPropertyChangeHelper(this, C.Symbol_isFinalized, this._service$__$isFinalized, t2);
+      t2 = t1.$index(map, "patch");
+      this._service$__$isPatch = F.notifyPropertyChangeHelper(this, C.Symbol_isPatch, this._service$__$isPatch, t2);
+      t2 = t1.$index(map, "implemented");
+      this._service$__$isImplemented = F.notifyPropertyChangeHelper(this, C.Symbol_isImplemented, this._service$__$isImplemented, t2);
+      t2 = t1.$index(map, "tokenPos");
+      this._service$__$tokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_tokenPos, this._service$__$tokenPos, t2);
+      t2 = this.subClasses;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "subclasses"));
+      t2 = this.fields;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "fields"));
+      t2 = this.functions;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "functions"));
+      t2 = t1.$index(map, "super");
+      t2 = F.notifyPropertyChangeHelper(this, C.Symbol_superClass, this._service$__$superClass, t2);
+      this._service$__$superClass = t2;
+      if (t2 != null)
+        t2._addToChildren$1(this);
+      t2 = t1.$index(map, "error");
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, t2);
+      allocationStats = t1.$index(map, "allocationStats");
+      if (allocationStats != null) {
+        t1 = J.getInterceptor$asx(allocationStats);
+        this.newSpace.update$1(t1.$index(allocationStats, "new"));
+        this.oldSpace.update$1(t1.$index(allocationStats, "old"));
+      }
+    },
+    _addToChildren$1: function(cls) {
+      var t1 = this.children;
+      if (t1.contains$1(t1, cls))
+        return;
+      t1.add$1(0, cls);
+    },
+    get$1: function(command) {
+      var t1 = this._owner;
+      return t1.get$isolate(t1).get$1(J.$add$ns(this._id, "/" + H.S(command)));
+    },
+    $isClass: true
+  },
+  ServiceObject_ChangeNotifier3: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  ScriptLine: {
+    "^": "ChangeNotifier;line<,text>,_service$__$hits,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$hits: function() {
+      return this._service$__$hits;
+    },
+    set$hits: function(value) {
+      this._service$__$hits = F.notifyPropertyChangeHelper(this, C.Symbol_hits, this._service$__$hits, value);
+    },
+    $isScriptLine: true
+  },
+  Script: {
+    "^": "ServiceObject_ChangeNotifier4;lines>,_hits,_service$__$kind,_service$__$firstTokenPos,_service$__$lastTokenPos,_shortUrl,_url,_tokenToLine,_tokenToCol,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$firstTokenPos: function() {
+      return this._service$__$firstTokenPos;
+    },
+    set$firstTokenPos: function(value) {
+      var t1 = this._service$__$firstTokenPos;
+      if (this.get$hasObservers(this) && !J.$eq(t1, value)) {
+        t1 = new T.PropertyChangeRecord(this, C.Symbol_firstTokenPos, t1, value);
+        t1.$builtinTypeInfo = [null];
+        this.notifyChange$1(this, t1);
+      }
+      this._service$__$firstTokenPos = value;
+    },
+    get$lastTokenPos: function() {
+      return this._service$__$lastTokenPos;
+    },
+    set$lastTokenPos: function(value) {
+      var t1 = this._service$__$lastTokenPos;
+      if (this.get$hasObservers(this) && !J.$eq(t1, value)) {
+        t1 = new T.PropertyChangeRecord(this, C.Symbol_lastTokenPos, t1, value);
+        t1.$builtinTypeInfo = [null];
+        this.notifyChange$1(this, t1);
+      }
+      this._service$__$lastTokenPos = value;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return true;
+    },
+    getLine$1: function(line) {
+      var t1, t2;
+      t1 = J.$sub$n(line, 1);
+      t2 = this.lines._observable_list$_list;
+      if (t1 >>> 0 !== t1 || t1 >= t2.length)
+        return H.ioore(t2, t1);
+      return t2[t1];
+    },
+    tokenToLine$1: function(token) {
+      return this._tokenToLine.$index(0, token);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, t3, t4;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t2 = t1.$index(map, "name");
+      this._url = t2;
+      t3 = J.getInterceptor$asx(t2);
+      t4 = t3.lastIndexOf$1(t2, "/");
+      if (typeof t4 !== "number")
+        return t4.$add();
+      t4 = t3.substring$1(t2, t4 + 1);
+      this._shortUrl = t4;
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t4);
+      t4 = this._url;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t4);
+      this._processSource$1(t1.$index(map, "source"));
+      this._parseTokenPosTable$1(t1.$index(map, "tokenPosTable"));
+    },
+    _parseTokenPosTable$1: function(table) {
+      var t1, line, t2, lineNumber, pos, t3, tokenOffset, colNumber, t4;
+      if (table == null)
+        return;
+      this._tokenToLine = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      this._tokenToCol = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      this._service$__$firstTokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_firstTokenPos, this._service$__$firstTokenPos, null);
+      this._service$__$lastTokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_lastTokenPos, this._service$__$lastTokenPos, null);
+      for (t1 = J.get$iterator$ax(table); t1.moveNext$0();) {
+        line = t1.get$current();
+        t2 = J.getInterceptor$asx(line);
+        lineNumber = t2.$index(line, 0);
+        pos = 1;
+        while (true) {
+          t3 = t2.get$length(line);
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(pos < t3))
+            break;
+          tokenOffset = t2.$index(line, pos);
+          colNumber = t2.$index(line, pos + 1);
+          t3 = this._service$__$firstTokenPos;
+          if (t3 == null) {
+            if (this.get$hasObservers(this) && !J.$eq(t3, tokenOffset)) {
+              t3 = new T.PropertyChangeRecord(this, C.Symbol_firstTokenPos, t3, tokenOffset);
+              t3.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t3);
+            }
+            this._service$__$firstTokenPos = tokenOffset;
+            t3 = this._service$__$lastTokenPos;
+            if (this.get$hasObservers(this) && !J.$eq(t3, tokenOffset)) {
+              t3 = new T.PropertyChangeRecord(this, C.Symbol_lastTokenPos, t3, tokenOffset);
+              t3.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t3);
+            }
+            this._service$__$lastTokenPos = tokenOffset;
+          } else {
+            t3 = J.$le$n(t3, tokenOffset) ? this._service$__$firstTokenPos : tokenOffset;
+            t4 = this._service$__$firstTokenPos;
+            if (this.get$hasObservers(this) && !J.$eq(t4, t3)) {
+              t4 = new T.PropertyChangeRecord(this, C.Symbol_firstTokenPos, t4, t3);
+              t4.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t4);
+            }
+            this._service$__$firstTokenPos = t3;
+            t3 = J.$ge$n(this._service$__$lastTokenPos, tokenOffset) ? this._service$__$lastTokenPos : tokenOffset;
+            t4 = this._service$__$lastTokenPos;
+            if (this.get$hasObservers(this) && !J.$eq(t4, t3)) {
+              t4 = new T.PropertyChangeRecord(this, C.Symbol_lastTokenPos, t4, t3);
+              t4.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t4);
+            }
+            this._service$__$lastTokenPos = t3;
+          }
+          this._tokenToLine.$indexSet(0, tokenOffset, lineNumber);
+          this._tokenToCol.$indexSet(0, tokenOffset, colNumber);
+          pos += 2;
+        }
+      }
+    },
+    _processHits$1: function(scriptHits) {
+      var t1, t2, i, t3, line, hit, oldHits;
+      t1 = J.getInterceptor$asx(scriptHits);
+      t2 = this._hits;
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(scriptHits);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        line = t1.$index(scriptHits, i);
+        hit = t1.$index(scriptHits, i + 1);
+        oldHits = t2.$index(0, line);
+        t2.$indexSet(0, line, oldHits != null ? J.$add$ns(hit, oldHits) : hit);
+        i += 2;
+      }
+      this._applyHitsToLines$0();
+    },
+    _processSource$1: function(source) {
+      var sourceLines, t1, i, i0;
+      this._loaded = false;
+      if (source == null)
+        return;
+      sourceLines = J.split$1$s(source, "\n");
+      if (sourceLines.length === 0)
+        return;
+      this._loaded = true;
+      t1 = this.lines;
+      t1.clear$0(t1);
+      N.Logger_Logger("").info$1("Adding " + sourceLines.length + " source lines for " + H.S(this._url));
+      for (i = 0; i < sourceLines.length; i = i0) {
+        i0 = i + 1;
+        t1.add$1(0, new D.ScriptLine(i0, sourceLines[i], null, null, null));
+      }
+      this._applyHitsToLines$0();
+    },
+    _applyHitsToLines$0: function() {
+      var t1, t2, line;
+      t1 = this.lines;
+      if (t1._observable_list$_list.length === 0)
+        return;
+      for (t1 = t1.get$iterator(t1), t2 = this._hits; t1.moveNext$0();) {
+        line = t1._current;
+        line.set$hits(t2.$index(0, line.get$line()));
+      }
+    },
+    $isScript: true
+  },
+  ServiceObject_ChangeNotifier4: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  CodeTick: {
+    "^": "Object;address<,exclusiveTicks<,inclusiveTicks<",
+    $isCodeTick: true
+  },
+  PcDescriptor: {
+    "^": "ChangeNotifier;address<,deoptId,tokenPos<,tryIndex,kind>,_service$__$script,_service$__$formattedLine,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$script: function(_) {
+      return this._service$__$script;
+    },
+    set$script: function(_, value) {
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, value);
+    },
+    get$formattedLine: function() {
+      return this._service$__$formattedLine;
+    },
+    formattedDeoptId$0: [function() {
+      var t1, t2;
+      t1 = this.deoptId;
+      t2 = J.getInterceptor(t1);
+      if (t2.$eq(t1, -1))
+        return "N/A";
+      return t2.toString$0(t1);
+    }, "call$0", "get$formattedDeoptId", 0, 0, 194],
+    processScript$1: function(script) {
+      var t1, line;
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, null);
+      t1 = this.tokenPos;
+      if (J.$eq(t1, -1))
+        return;
+      line = script.tokenToLine$1(t1);
+      if (line == null)
+        return;
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, script);
+      t1 = J.get$text$x(script.getLine$1(line));
+      this._service$__$formattedLine = F.notifyPropertyChangeHelper(this, C.Symbol_formattedLine, this._service$__$formattedLine, t1);
+    },
+    $isPcDescriptor: true
+  },
+  CodeInstruction: {
+    "^": "ChangeNotifier;address<,machine,human<,_service$__$jumpTarget,descriptors<,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$jumpTarget: function() {
+      return this._service$__$jumpTarget;
+    },
+    get$isComment: function() {
+      return J.$eq(this.address, 0);
+    },
+    get$hasDescriptors: function() {
+      return this.descriptors._observable_list$_list.length > 0;
+    },
+    formattedAddress$0: [function() {
+      var t1, t2;
+      t1 = this.address;
+      t2 = J.getInterceptor(t1);
+      if (t2.$eq(t1, 0))
+        return "";
+      return "0x" + t2.toRadixString$1(t1, 16);
+    }, "call$0", "get$formattedAddress", 0, 0, 194],
+    formattedInclusive$1: [function(code) {
+      var tick;
+      if (code == null)
+        return "";
+      tick = code.get$addressTicks()._observable_map$_map.$index(0, this.address);
+      if (tick == null)
+        return "";
+      if (J.$eq(tick.get$inclusiveTicks(), tick.get$exclusiveTicks()))
+        return "";
+      return D.CodeInstruction_formatPercent(tick.get$inclusiveTicks(), code.get$totalSamplesInProfile()) + " (" + H.S(tick.get$inclusiveTicks()) + ")";
+    }, "call$1", "get$formattedInclusive", 2, 0, 195, 71],
+    formattedExclusive$1: [function(code) {
+      var tick;
+      if (code == null)
+        return "";
+      tick = code.get$addressTicks()._observable_map$_map.$index(0, this.address);
+      if (tick == null)
+        return "";
+      return D.CodeInstruction_formatPercent(tick.get$exclusiveTicks(), code.get$totalSamplesInProfile()) + " (" + H.S(tick.get$exclusiveTicks()) + ")";
+    }, "call$1", "get$formattedExclusive", 2, 0, 195, 71],
+    _getJumpAddress$0: function() {
+      var address, chunks, t1, exception;
+      chunks = J.split$1$s(this.human, " ");
+      t1 = chunks.length;
+      if (t1 !== 2)
+        return 0;
+      if (1 >= t1)
+        return H.ioore(chunks, 1);
+      address = chunks[1];
+      if (J.startsWith$1$s(address, "0x"))
+        address = J.substring$1$s(address, 2);
+      try {
+        t1 = H.Primitives_parseInt(address, 16, null);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return 0;
+      }
+
+    },
+    _resolveJumpTarget$1: function(instructions) {
+      var t1, address, t2, i, instruction;
+      t1 = this.human;
+      if (!J.startsWith$1$s(t1, "j"))
+        return;
+      address = this._getJumpAddress$0();
+      t2 = J.getInterceptor(address);
+      if (t2.$eq(address, 0)) {
+        P.print("Could not determine jump address for " + H.S(t1));
+        return;
+      }
+      for (t1 = instructions._observable_list$_list, i = 0; i < t1.length; ++i) {
+        instruction = t1[i];
+        if (J.$eq(instruction.get$address(), address)) {
+          t1 = this._service$__$jumpTarget;
+          if (this.get$hasObservers(this) && !J.$eq(t1, instruction)) {
+            t1 = new T.PropertyChangeRecord(this, C.Symbol_jumpTarget, t1, instruction);
+            t1.$builtinTypeInfo = [null];
+            this.notifyChange$1(this, t1);
+          }
+          this._service$__$jumpTarget = instruction;
+          return;
+        }
+      }
+      P.print("Could not find instruction at " + t2.toRadixString$1(address, 16));
+    },
+    $isCodeInstruction: true,
+    static: {CodeInstruction_formatPercent: function(a, total) {
+        return C.JSNumber_methods.toStringAsFixed$1(100 * J.$div$n(a, total), 2) + "%";
+      }}
+  },
+  CodeKind: {
+    "^": "Object;_service$_value",
+    toString$0: function(_) {
+      return this._service$_value;
+    },
+    static: {"^": "CodeKind_Native0,CodeKind_Dart0,CodeKind_Collected0,CodeKind_Reused0,CodeKind_Tag0", CodeKind_fromString: function(s) {
+        var t1 = J.getInterceptor(s);
+        if (t1.$eq(s, "Native"))
+          return C.CodeKind_Native;
+        else if (t1.$eq(s, "Dart"))
+          return C.CodeKind_Dart;
+        else if (t1.$eq(s, "Collected"))
+          return C.CodeKind_Collected;
+        else if (t1.$eq(s, "Reused"))
+          return C.CodeKind_Reused;
+        else if (t1.$eq(s, "Tag"))
+          return C.CodeKind_Tag;
+        N.Logger_Logger("").warning$1("Unknown code kind " + H.S(s));
+        throw H.wrapException(P.FallThroughError$());
+      }}
+  },
+  CodeCallCount: {
+    "^": "Object;code>,count<",
+    $isCodeCallCount: true
+  },
+  CodeTrieNode: {
+    "^": "Object;code>,count<,children>,summedChildCount",
+    $isCodeTrieNode: true
+  },
+  Code: {
+    "^": "ServiceObject_ChangeNotifier5;_service$__$kind,_service$__$totalSamplesInProfile,exclusiveTicks<,inclusiveTicks<,startAddress,endAddress,callers,callees,instructions<,addressTicks<,_service$__$formattedInclusiveTicks,_service$__$formattedExclusiveTicks,_service$__$objectPool,_service$__$function,_service$__$script,_service$__$isOptimized,name*,vmName@,_service$__$hasDisassembly,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$totalSamplesInProfile: function() {
+      return this._service$__$totalSamplesInProfile;
+    },
+    get$formattedInclusiveTicks: function() {
+      return this._service$__$formattedInclusiveTicks;
+    },
+    get$formattedExclusiveTicks: function() {
+      return this._service$__$formattedExclusiveTicks;
+    },
+    get$objectPool: function() {
+      return this._service$__$objectPool;
+    },
+    set$objectPool: function(value) {
+      this._service$__$objectPool = F.notifyPropertyChangeHelper(this, C.Symbol_objectPool, this._service$__$objectPool, value);
+    },
+    get$$function: function(_) {
+      return this._service$__$function;
+    },
+    set$$function: function(_, value) {
+      this._service$__$function = F.notifyPropertyChangeHelper(this, C.Symbol_function, this._service$__$function, value);
+    },
+    get$script: function(_) {
+      return this._service$__$script;
+    },
+    set$script: function(_, value) {
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, value);
+    },
+    get$isOptimized: function() {
+      return this._service$__$isOptimized;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return true;
+    },
+    _updateDescriptors$1: [function(script) {
+      var t1, t2;
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, script);
+      for (t1 = this.instructions, t1 = t1.get$iterator(t1); t1.moveNext$0();)
+        for (t2 = t1._current.get$descriptors(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+          t2._current.processScript$1(script);
+    }, "call$1", "get$_updateDescriptors", 2, 0, 196, 197],
+    loadScript$0: function() {
+      if (this._service$__$script != null)
+        return;
+      if (!J.$eq(this._service$__$kind, C.CodeKind_Dart))
+        return;
+      var t1 = this._service$__$function;
+      if (t1 == null)
+        return;
+      if (J.$index$asx(t1, "script") == null) {
+        J.load$0$x(this._service$__$function).then$1(new D.Code_loadScript_closure(this));
+        return;
+      }
+      J.load$0$x(J.$index$asx(this._service$__$function, "script")).then$1(this.get$_updateDescriptors());
+    },
+    reload$0: function(_) {
+      if (J.$eq(this._service$__$kind, C.CodeKind_Dart))
+        return D.ServiceObject.prototype.reload$0.call(this, this);
+      return P._Future$immediate(this, null);
+    },
+    _resolveCalls$3: function(calls, data, codes) {
+      var t1, i, t2, index, count;
+      t1 = J.getInterceptor$asx(data);
+      i = 0;
+      while (true) {
+        t2 = t1.get$length(data);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        if (!(i < t2))
+          break;
+        index = H.Primitives_parseInt(t1.$index(data, i), null, null);
+        count = H.Primitives_parseInt(t1.$index(data, i + 1), null, null);
+        if (index >>> 0 !== index || index >= codes.length)
+          return H.ioore(codes, index);
+        calls.push(new D.CodeCallCount(codes[index], count));
+        i += 2;
+      }
+      H.IterableMixinWorkaround_sortList(calls, new D.Code__resolveCalls_closure());
+    },
+    updateProfileData$3: function(profileData, codeTable, sampleCount) {
+      var t1, ticks;
+      this._service$__$totalSamplesInProfile = F.notifyPropertyChangeHelper(this, C.Symbol_totalSamplesInProfile, this._service$__$totalSamplesInProfile, sampleCount);
+      t1 = J.getInterceptor$asx(profileData);
+      this.inclusiveTicks = H.Primitives_parseInt(t1.$index(profileData, "inclusive_ticks"), null, null);
+      this.exclusiveTicks = H.Primitives_parseInt(t1.$index(profileData, "exclusive_ticks"), null, null);
+      this._resolveCalls$3(this.callers, t1.$index(profileData, "callers"), codeTable);
+      this._resolveCalls$3(this.callees, t1.$index(profileData, "callees"), codeTable);
+      ticks = t1.$index(profileData, "ticks");
+      if (ticks != null)
+        this._processTicks$1(ticks);
+      t1 = D.Code_formatPercent(this.inclusiveTicks, this._service$__$totalSamplesInProfile) + " (" + H.S(this.inclusiveTicks) + ")";
+      this._service$__$formattedInclusiveTicks = F.notifyPropertyChangeHelper(this, C.Symbol_formattedInclusiveTicks, this._service$__$formattedInclusiveTicks, t1);
+      t1 = D.Code_formatPercent(this.exclusiveTicks, this._service$__$totalSamplesInProfile) + " (" + H.S(this.exclusiveTicks) + ")";
+      this._service$__$formattedExclusiveTicks = F.notifyPropertyChangeHelper(this, C.Symbol_formattedExclusiveTicks, this._service$__$formattedExclusiveTicks, t1);
+    },
+    _service$_update$2: function(_, m, mapIsRef) {
+      var t1, t2, t3, disassembly, descriptors;
+      t1 = J.getInterceptor$asx(m);
+      this.name = t1.$index(m, "user_name");
+      this.vmName = t1.$index(m, "name");
+      t2 = t1.$index(m, "isOptimized") != null && t1.$index(m, "isOptimized");
+      this._service$__$isOptimized = F.notifyPropertyChangeHelper(this, C.Symbol_isOptimized, this._service$__$isOptimized, t2);
+      t2 = D.CodeKind_fromString(t1.$index(m, "kind"));
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      this.startAddress = H.Primitives_parseInt(t1.$index(m, "start"), 16, null);
+      this.endAddress = H.Primitives_parseInt(t1.$index(m, "end"), 16, null);
+      t2 = this._owner;
+      t3 = t2.get$isolate(t2).getFromMap$1(t1.$index(m, "function"));
+      this._service$__$function = F.notifyPropertyChangeHelper(this, C.Symbol_function, this._service$__$function, t3);
+      t2 = t2.get$isolate(t2).getFromMap$1(t1.$index(m, "object_pool"));
+      this._service$__$objectPool = F.notifyPropertyChangeHelper(this, C.Symbol_objectPool, this._service$__$objectPool, t2);
+      disassembly = t1.$index(m, "disassembly");
+      if (disassembly != null)
+        this._processDisassembly$1(disassembly);
+      descriptors = t1.$index(m, "descriptors");
+      if (descriptors != null)
+        this._processDescriptors$1(J.$index$asx(descriptors, "members"));
+      t1 = this.instructions._observable_list$_list;
+      this._loaded = t1.length !== 0 || !J.$eq(this._service$__$kind, C.CodeKind_Dart);
+      t1 = t1.length !== 0 && J.$eq(this._service$__$kind, C.CodeKind_Dart);
+      this._service$__$hasDisassembly = F.notifyPropertyChangeHelper(this, C.Symbol_hasDisassembly, this._service$__$hasDisassembly, t1);
+    },
+    get$hasDisassembly: function() {
+      return this._service$__$hasDisassembly;
+    },
+    _processDisassembly$1: function(disassembly) {
+      var t1, t2, i, t3, machine, human, address, t4;
+      t1 = this.instructions;
+      t1.clear$0(t1);
+      t2 = J.getInterceptor$asx(disassembly);
+      i = 0;
+      while (true) {
+        t3 = t2.get$length(disassembly);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        machine = t2.$index(disassembly, i + 1);
+        human = t2.$index(disassembly, i + 2);
+        address = !J.$eq(t2.$index(disassembly, i), "") ? H.Primitives_parseInt(t2.$index(disassembly, i), null, null) : 0;
+        t3 = D.PcDescriptor;
+        t4 = [];
+        t4.$builtinTypeInfo = [t3];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t3];
+        t1.add$1(0, new D.CodeInstruction(address, machine, human, null, t4, null, null));
+        i += 3;
+      }
+      for (t2 = t1.get$iterator(t1); t2.moveNext$0();)
+        t2._current._resolveJumpTarget$1(t1);
+    },
+    _processDescriptor$1: function(d) {
+      var t1, address, deoptId, tokenPos, tryIndex, kind, instruction;
+      t1 = J.getInterceptor$asx(d);
+      address = H.Primitives_parseInt(t1.$index(d, "pc"), 16, null);
+      deoptId = t1.$index(d, "deoptId");
+      tokenPos = t1.$index(d, "tokenPos");
+      tryIndex = t1.$index(d, "tryIndex");
+      kind = J.trim$0$s(t1.$index(d, "kind"));
+      for (t1 = this.instructions, t1 = t1.get$iterator(t1); t1.moveNext$0();) {
+        instruction = t1._current;
+        if (J.$eq(instruction.get$address(), address)) {
+          instruction.get$descriptors().add$1(0, new D.PcDescriptor(address, deoptId, tokenPos, tryIndex, kind, null, null, null, null));
+          return;
+        }
+      }
+      N.Logger_Logger("").warning$1("Could not find instruction with pc descriptor address: " + H.S(address));
+    },
+    _processDescriptors$1: function(descriptors) {
+      var t1;
+      for (t1 = J.get$iterator$ax(descriptors); t1.moveNext$0();)
+        this._processDescriptor$1(t1.get$current());
+    },
+    _processTicks$1: function(profileTicks) {
+      var t1, t2, i, t3, address;
+      t1 = J.getInterceptor$asx(profileTicks);
+      t2 = this.addressTicks;
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(profileTicks);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        address = H.Primitives_parseInt(t1.$index(profileTicks, i), 16, null);
+        t2.$indexSet(0, address, new D.CodeTick(address, H.Primitives_parseInt(t1.$index(profileTicks, i + 1), null, null), H.Primitives_parseInt(t1.$index(profileTicks, i + 2), null, null)));
+        i += 3;
+      }
+    },
+    contains$1: function(_, address) {
+      J.$ge$n(address, this.startAddress);
+      return false;
+    },
+    get$isDartCode: function() {
+      return J.$eq(this._service$__$kind, C.CodeKind_Dart);
+    },
+    $isCode: true,
+    static: {Code_formatPercent: function(a, total) {
+        return C.JSNumber_methods.toStringAsFixed$1(100 * J.$div$n(a, total), 2) + "%";
+      }}
+  },
+  ServiceObject_ChangeNotifier5: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  Code_loadScript_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(func) {
+      var t1, script;
+      t1 = this.this_0;
+      script = J.$index$asx(t1._service$__$function, "script");
+      if (script == null)
+        return;
+      J.load$0$x(script).then$1(t1.get$_updateDescriptors());
+    }, "call$1", null, 2, 0, null, 198, "call"],
+    $isFunction: true
+  },
+  Code__resolveCalls_closure: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$sub$n(b.get$count(), a.get$count());
+    },
+    $isFunction: true
+  },
+  SocketKind: {
+    "^": "Object;_service$_value",
+    toString$0: function(_) {
+      return this._service$_value;
+    },
+    static: {"^": "SocketKind_Listening0,SocketKind_Normal0,SocketKind_Pipe0,SocketKind_Internal0", SocketKind_fromString: function(s) {
+        var t1 = J.getInterceptor(s);
+        if (t1.$eq(s, "Listening"))
+          return C.SocketKind_Listening;
+        else if (t1.$eq(s, "Normal"))
+          return C.SocketKind_Normal;
+        else if (t1.$eq(s, "Pipe"))
+          return C.SocketKind_Pipe;
+        else if (t1.$eq(s, "Internal"))
+          return C.SocketKind_Internal;
+        N.Logger_Logger("").warning$1("Unknown socket kind " + H.S(s));
+        throw H.wrapException(P.FallThroughError$());
+      }}
+  },
+  Socket: {
+    "^": "ServiceObject_ChangeNotifier6;socketOwner@,_service$__$latest,_service$__$previous,_service$__$kind,_service$__$protocol,_service$__$readClosed,_service$__$writeClosed,_service$__$closing,_service$__$listening,_service$__$fd,_service$__$localAddress,_service$__$localPort,_service$__$remoteAddress,_service$__$remotePort,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$canCache: function() {
+      return true;
+    },
+    get$isPipe: function() {
+      return J.$eq(this._service$__$kind, C.SocketKind_Pipe);
+    },
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$protocol: function(_) {
+      return this._service$__$protocol;
+    },
+    get$readClosed: function() {
+      return this._service$__$readClosed;
+    },
+    get$writeClosed: function() {
+      return this._service$__$writeClosed;
+    },
+    get$closing: function() {
+      return this._service$__$closing;
+    },
+    get$listening: function() {
+      return this._service$__$listening;
+    },
+    get$fd: function() {
+      return this._service$__$fd;
+    },
+    get$localAddress: function() {
+      return this._service$__$localAddress;
+    },
+    get$localPort: function() {
+      return this._service$__$localPort;
+    },
+    get$remoteAddress: function() {
+      return this._service$__$remoteAddress;
+    },
+    get$remotePort: function() {
+      return this._service$__$remotePort;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "name");
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t2);
+      t2 = t1.$index(map, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t2);
+      t2 = D.SocketKind_fromString(t1.$index(map, "kind"));
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t2 = this._owner;
+      D._upgradeCollection(map, t2.get$isolate(t2));
+      t2 = t1.$index(map, "readClosed");
+      this._service$__$readClosed = F.notifyPropertyChangeHelper(this, C.Symbol_readClosed, this._service$__$readClosed, t2);
+      t2 = t1.$index(map, "writeClosed");
+      this._service$__$writeClosed = F.notifyPropertyChangeHelper(this, C.Symbol_writeClosed, this._service$__$writeClosed, t2);
+      t2 = t1.$index(map, "closing");
+      this._service$__$closing = F.notifyPropertyChangeHelper(this, C.Symbol_closing, this._service$__$closing, t2);
+      t2 = t1.$index(map, "listening");
+      this._service$__$listening = F.notifyPropertyChangeHelper(this, C.Symbol_listening, this._service$__$listening, t2);
+      t2 = t1.$index(map, "protocol");
+      this._service$__$protocol = F.notifyPropertyChangeHelper(this, C.Symbol_protocol, this._service$__$protocol, t2);
+      t2 = t1.$index(map, "localAddress");
+      this._service$__$localAddress = F.notifyPropertyChangeHelper(this, C.Symbol_localAddress, this._service$__$localAddress, t2);
+      t2 = t1.$index(map, "localPort");
+      this._service$__$localPort = F.notifyPropertyChangeHelper(this, C.Symbol_localPort, this._service$__$localPort, t2);
+      t2 = t1.$index(map, "remoteAddress");
+      this._service$__$remoteAddress = F.notifyPropertyChangeHelper(this, C.Symbol_remoteAddress, this._service$__$remoteAddress, t2);
+      t2 = t1.$index(map, "remotePort");
+      this._service$__$remotePort = F.notifyPropertyChangeHelper(this, C.Symbol_remotePort, this._service$__$remotePort, t2);
+      t2 = t1.$index(map, "fd");
+      this._service$__$fd = F.notifyPropertyChangeHelper(this, C.Symbol_fd, this._service$__$fd, t2);
+      this.socketOwner = t1.$index(map, "owner");
+    }
+  },
+  ServiceObject_ChangeNotifier6: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  _upgradeObservableMap_closure: {
+    "^": "Closure:75;map_0,owner_1",
+    call$2: function(k, v) {
+      var t1, t2;
+      t1 = J.getInterceptor(v);
+      t2 = !!t1.$isObservableMap;
+      if (t2 && D._isServiceMap(v))
+        this.map_0.$indexSet(0, k, this.owner_1.getFromMap$1(v));
+      else if (!!t1.$isObservableList)
+        D._upgradeObservableList(v, this.owner_1);
+      else if (t2)
+        D._upgradeObservableMap(v, this.owner_1);
+    },
+    $isFunction: true
+  }
+}],
+["service_error_view_element", "package:observatory/src/elements/service_error_view.dart", , R, {
+  "^": "",
+  ServiceErrorViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier45;_service_error_view_element$__$error,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$error: function(receiver) {
+      return receiver._service_error_view_element$__$error;
+    },
+    set$error: function(receiver, value) {
+      receiver._service_error_view_element$__$error = this.notifyPropertyChange$3(receiver, C.Symbol_error, receiver._service_error_view_element$__$error, value);
+    },
+    static: {ServiceErrorViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceErrorViewElement_methods.Element$created$0(receiver);
+        C.ServiceErrorViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier45: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service_exception_view_element", "package:observatory/src/elements/service_exception_view.dart", , D, {
+  "^": "",
+  ServiceExceptionViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier46;_service_exception_view_element$__$exception,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$exception: function(receiver) {
+      return receiver._service_exception_view_element$__$exception;
+    },
+    set$exception: function(receiver, value) {
+      receiver._service_exception_view_element$__$exception = this.notifyPropertyChange$3(receiver, C.Symbol_exception, receiver._service_exception_view_element$__$exception, value);
+    },
+    static: {ServiceExceptionViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceExceptionViewElement_methods.Element$created$0(receiver);
+        C.ServiceExceptionViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier46: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service_html", "package:observatory/service_html.dart", , U, {
+  "^": "",
+  HttpVM: {
+    "^": "VM;host,_service$__$version,_service$__$architecture,_service$__$uptime,_service$__$assertsEnabled,_service$__$typeChecksEnabled,_service$__$pid,_service$__$lastUpdate,exceptions,errors,_cache,_isolateCache,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    getString$1: function(_, id) {
+      var t1;
+      if (J.endsWith$1$s(this.host, "/") && J.startsWith$1$s(id, "/"))
+        id = J.substring$1$s(id, 1);
+      N.Logger_Logger("").info$1("Fetching " + H.S(id) + " from " + H.S(this.host));
+      t1 = this.host;
+      if (typeof t1 !== "string")
+        return t1.$add();
+      return W.HttpRequest_request(J.$add$ns(t1, id), null, null, null, P.LinkedHashMap_LinkedHashMap$_literal(["Observatory-Version", "1.0"], null, null), null, null, null).then$1(new U.HttpVM_getString_closure()).catchError$1(new U.HttpVM_getString_closure0());
+    },
+    HttpVM$0: function() {
+      this.host = "http://" + H.S(window.location.host) + "/";
+    }
+  },
+  HttpVM_getString_closure: {
+    "^": "Closure:200;",
+    call$1: [function(request) {
+      return J.get$responseText$x(request);
+    }, "call$1", null, 2, 0, null, 199, "call"],
+    $isFunction: true
+  },
+  HttpVM_getString_closure0: {
+    "^": "Closure:13;",
+    call$1: [function(error) {
+      var request, t1;
+      N.Logger_Logger("").severe$1("HttpRequest.request failed.");
+      request = J.get$target$x(error);
+      t1 = J.getInterceptor$x(request);
+      return C.JsonCodec_null_null.encode$1(P.LinkedHashMap_LinkedHashMap$_literal(["type", "ServiceException", "id", "", "response", t1.get$responseText(request), "kind", "NetworkException", "message", "Could not connect to service (" + H.S(t1.get$statusText(request)) + "). Check that you started the VM with the following flags: --observe"], null, null));
+    }, "call$1", null, 2, 0, null, 24, "call"],
+    $isFunction: true
+  },
+  DartiumVM: {
+    "^": "VM;_pendingRequests,_requestSerial,_service$__$version,_service$__$architecture,_service$__$uptime,_service$__$assertsEnabled,_service$__$typeChecksEnabled,_service$__$pid,_service$__$lastUpdate,exceptions,errors,_cache,_isolateCache,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    _messageHandler$1: [function(msg) {
+      var t1, id, $name, data, completer;
+      t1 = J.getInterceptor$x(msg);
+      id = J.$index$asx(t1.get$data(msg), "id");
+      $name = J.$index$asx(t1.get$data(msg), "name");
+      data = J.$index$asx(t1.get$data(msg), "data");
+      if (!J.$eq($name, "observatoryData"))
+        return;
+      t1 = this._pendingRequests;
+      completer = t1.$index(0, id);
+      t1.remove$1(0, id);
+      J.complete$1$x(completer, data);
+    }, "call$1", "get$_messageHandler", 2, 0, 20, 72],
+    getString$1: function(_, path) {
+      var idString, message, completer;
+      idString = "" + this._requestSerial;
+      message = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      message.$indexSet(0, "id", idString);
+      message.$indexSet(0, "method", "observatoryQuery");
+      message.$indexSet(0, "query", H.S(path));
+      ++this._requestSerial;
+      completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+      this._pendingRequests.$indexSet(0, idString, completer);
+      J.postMessage$2$x(W._convertNativeToDart_Window(window.parent), C.JsonCodec_null_null.encode$1(message), "*");
+      return completer.future;
+    },
+    DartiumVM$0: function() {
+      var t1 = H.setRuntimeTypeInfo(new W._EventStream(window, C.EventStreamProvider_message._eventType, false), [null]);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(this.get$_messageHandler()), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+      N.Logger_Logger("").info$1("Connected to DartiumVM");
+    }
+  }
+}],
+["service_object_view_element", "package:observatory/src/elements/service_view.dart", , U, {
+  "^": "",
+  ServiceObjectViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier47;_service_object_view_element$__$object,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$object: function(receiver) {
+      return receiver._service_object_view_element$__$object;
+    },
+    set$object: function(receiver, value) {
+      receiver._service_object_view_element$__$object = this.notifyPropertyChange$3(receiver, C.Symbol_object, receiver._service_object_view_element$__$object, value);
+    },
+    _constructElementForObject$0: function(receiver) {
+      var element;
+      switch (receiver._service_object_view_element$__$object.get$serviceType()) {
+        case "AllocationProfile":
+          element = W._ElementFactoryProvider_createElement_tag("heap-profile", null);
+          J.set$profile$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "BreakpointList":
+          element = W._ElementFactoryProvider_createElement_tag("breakpoint-list", null);
+          J.set$msg$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Class":
+          element = W._ElementFactoryProvider_createElement_tag("class-view", null);
+          J.set$cls$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Code":
+          element = W._ElementFactoryProvider_createElement_tag("code-view", null);
+          J.set$code$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Error":
+          element = W._ElementFactoryProvider_createElement_tag("error-view", null);
+          J.set$error$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Field":
+          element = W._ElementFactoryProvider_createElement_tag("field-view", null);
+          J.set$field$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "FlagList":
+          element = W._ElementFactoryProvider_createElement_tag("flag-list", null);
+          J.set$flagList$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Function":
+          element = W._ElementFactoryProvider_createElement_tag("function-view", null);
+          J.set$$function$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HeapMap":
+          element = W._ElementFactoryProvider_createElement_tag("heap-map", null);
+          J.set$fragmentation$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "LibraryPrefix":
+        case "TypeRef":
+        case "TypeParameter":
+        case "BoundedType":
+        case "Int32x4":
+        case "Float32x4":
+        case "Float64x4":
+        case "TypedData":
+        case "ExternalTypedData":
+        case "Capability":
+        case "ReceivePort":
+        case "SendPort":
+        case "Stacktrace":
+        case "JSRegExp":
+        case "WeakProperty":
+        case "MirrorReference":
+        case "UserTag":
+        case "Type":
+        case "Array":
+        case "Bool":
+        case "Closure":
+        case "Double":
+        case "GrowableObjectArray":
+        case "Instance":
+        case "Smi":
+        case "Mint":
+        case "Bigint":
+        case "String":
+          element = W._ElementFactoryProvider_createElement_tag("instance-view", null);
+          J.set$instance$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "IO":
+          element = W._ElementFactoryProvider_createElement_tag("io-view", null);
+          J.set$io$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HttpServerList":
+          element = W._ElementFactoryProvider_createElement_tag("io-http-server-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HttpServer":
+          element = W._ElementFactoryProvider_createElement_tag("io-http-server-view", null);
+          J.set$httpServer$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HttpServerConnection":
+          element = W._ElementFactoryProvider_createElement_tag("io-http-server-connection-view", null);
+          J.set$connection$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "SocketList":
+          element = W._ElementFactoryProvider_createElement_tag("io-socket-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Socket":
+          element = W._ElementFactoryProvider_createElement_tag("io-socket-view", null);
+          J.set$socket$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "WebSocketList":
+          element = W._ElementFactoryProvider_createElement_tag("io-web-socket-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "WebSocket":
+          element = W._ElementFactoryProvider_createElement_tag("io-web-socket-view", null);
+          J.set$webSocket$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Isolate":
+          element = W._ElementFactoryProvider_createElement_tag("isolate-view", null);
+          J.set$isolate$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Library":
+          element = W._ElementFactoryProvider_createElement_tag("library-view", null);
+          J.set$library$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "ProcessList":
+          element = W._ElementFactoryProvider_createElement_tag("io-process-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Process":
+          element = W._ElementFactoryProvider_createElement_tag("io-process-view", null);
+          J.set$process$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Profile":
+          element = W._ElementFactoryProvider_createElement_tag("isolate-profile", null);
+          J.set$profile$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "RandomAccessFileList":
+          element = W._ElementFactoryProvider_createElement_tag("io-random-access-file-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "RandomAccessFile":
+          element = W._ElementFactoryProvider_createElement_tag("io-random-access-file-view", null);
+          J.set$file$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "ServiceError":
+          element = W._ElementFactoryProvider_createElement_tag("service-error-view", null);
+          J.set$error$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "ServiceException":
+          element = W._ElementFactoryProvider_createElement_tag("service-exception-view", null);
+          J.set$exception$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Script":
+          element = W._ElementFactoryProvider_createElement_tag("script-view", null);
+          J.set$script$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "StackTrace":
+          element = W._ElementFactoryProvider_createElement_tag("stack-trace", null);
+          J.set$trace$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "VM":
+          element = W._ElementFactoryProvider_createElement_tag("vm-view", null);
+          J.set$vm$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        default:
+          element = W._ElementFactoryProvider_createElement_tag("json-view", null);
+          J.set$map$ax(element, receiver._service_object_view_element$__$object);
+          return element;
+      }
+    },
+    objectChanged$1: [function(receiver, oldValue) {
+      var t1, type, element;
+      this._clearChildren$0(receiver);
+      t1 = receiver._service_object_view_element$__$object;
+      if (t1 == null) {
+        N.Logger_Logger("").info$1("Viewing null object.");
+        return;
+      }
+      type = t1.get$serviceType();
+      element = this._constructElementForObject$0(receiver);
+      if (element == null) {
+        N.Logger_Logger("").info$1("Unable to find a view element for '" + H.S(type) + "'");
+        return;
+      }
+      receiver.appendChild(element);
+      N.Logger_Logger("").info$1("Viewing object of '" + H.S(type) + "'");
+    }, "call$1", "get$objectChanged", 2, 0, 13, 57],
+    $isServiceObjectViewElement: true,
+    static: {ServiceObjectViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceObjectViewElement_methods.Element$created$0(receiver);
+        C.ServiceObjectViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier47: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service_ref_element", "package:observatory/src/elements/service_ref.dart", , Q, {
+  "^": "",
+  ServiceRefElement: {
+    "^": "ObservatoryElement_ChangeNotifier0;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$ref: function(receiver) {
+      return receiver._service_ref_element$__$ref;
+    },
+    set$ref: function(receiver, value) {
+      receiver._service_ref_element$__$ref = this.notifyPropertyChange$3(receiver, C.Symbol_ref, receiver._service_ref_element$__$ref, value);
+    },
+    get$internal: function(receiver) {
+      return receiver._service_ref_element$__$internal;
+    },
+    set$internal: function(receiver, value) {
+      receiver._service_ref_element$__$internal = this.notifyPropertyChange$3(receiver, C.Symbol_internal, receiver._service_ref_element$__$internal, value);
+    },
+    refChanged$1: [function(receiver, oldValue) {
+      this.notifyPropertyChange$3(receiver, C.Symbol_url, "", this.get$url(receiver));
+      this.notifyPropertyChange$3(receiver, C.Symbol_name, [], this.get$name(receiver));
+      this.notifyPropertyChange$3(receiver, C.Symbol_nameIsEmpty, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_hoverText, "", this.get$hoverText(receiver));
+    }, "call$1", "get$refChanged", 2, 0, 20, 57],
+    get$url: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return "NULL REF";
+      t1 = J.get$link$x(t1);
+      $.location.toString;
+      return "#" + H.S(t1);
+    },
+    get$hoverText: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return "NULL REF";
+      return t1.get$vmName();
+    },
+    get$name: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return "NULL REF";
+      return J.get$name$x(t1);
+    },
+    get$nameIsEmpty: function(receiver) {
+      return J.get$isEmpty$asx(this.get$name(receiver));
+    },
+    static: {ServiceRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceRefElement_methods.Element$created$0(receiver);
+        C.ServiceRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier0: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["sliding_checkbox_element", "package:observatory/src/elements/sliding_checkbox.dart", , Q, {
+  "^": "",
+  SlidingCheckboxElement: {
+    "^": "PolymerElement_ChangeNotifier2;_sliding_checkbox_element$__$checked,_sliding_checkbox_element$__$checkedText,_sliding_checkbox_element$__$uncheckedText,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$checked: function(receiver) {
+      return receiver._sliding_checkbox_element$__$checked;
+    },
+    set$checked: function(receiver, value) {
+      receiver._sliding_checkbox_element$__$checked = this.notifyPropertyChange$3(receiver, C.Symbol_checked, receiver._sliding_checkbox_element$__$checked, value);
+    },
+    get$checkedText: function(receiver) {
+      return receiver._sliding_checkbox_element$__$checkedText;
+    },
+    set$checkedText: function(receiver, value) {
+      receiver._sliding_checkbox_element$__$checkedText = this.notifyPropertyChange$3(receiver, C.Symbol_checkedText, receiver._sliding_checkbox_element$__$checkedText, value);
+    },
+    get$uncheckedText: function(receiver) {
+      return receiver._sliding_checkbox_element$__$uncheckedText;
+    },
+    set$uncheckedText: function(receiver, value) {
+      receiver._sliding_checkbox_element$__$uncheckedText = this.notifyPropertyChange$3(receiver, C.Symbol_uncheckedText, receiver._sliding_checkbox_element$__$uncheckedText, value);
+    },
+    change$3: [function(receiver, e, details, target) {
+      var t1 = J.get$checked$x((receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#slide-switch"));
+      receiver._sliding_checkbox_element$__$checked = this.notifyPropertyChange$3(receiver, C.Symbol_checked, receiver._sliding_checkbox_element$__$checked, t1);
+    }, "call$3", "get$change", 6, 0, 102, 1, 201, 94],
+    static: {SlidingCheckboxElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.SlidingCheckboxElement_methods.Element$created$0(receiver);
+        C.SlidingCheckboxElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier2: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["smoke", "package:smoke/smoke.dart", , A, {
+  "^": "",
+  QueryOptions: {
+    "^": "Object;includeFields,includeProperties,includeInherited,includeUpTo,excludeFinal,includeMethods,withAnnotations,matches",
+    matches$1: function($receiver, arg0) {
+      return this.matches.call$1(arg0);
+    },
+    toString$0: function(_) {
+      var t1 = P.StringBuffer$("");
+      t1.write$1("(options:");
+      t1.write$1(this.includeFields ? "fields " : "");
+      t1.write$1(this.includeProperties ? "properties " : "");
+      t1.write$1(this.includeMethods ? "methods " : "");
+      t1.write$1(this.includeInherited ? "inherited " : "_");
+      t1.write$1(this.excludeFinal ? "no finals " : "");
+      t1.write$1("annotations: " + H.S(this.withAnnotations));
+      t1.write$1(this.matches != null ? "with matcher" : "");
+      t1.write$1(")");
+      return t1._contents;
+    }
+  },
+  Declaration: {
+    "^": "Object;name>,kind>,isFinal>,type>,isStatic,annotations<",
+    get$isField: function() {
+      return this.kind === C.DeclarationKind_0;
+    },
+    get$isProperty: function() {
+      return this.kind === C.DeclarationKind_1;
+    },
+    get$isMethod: function() {
+      return this.kind === C.DeclarationKind_2;
+    },
+    get$hashCode: function(_) {
+      var t1 = this.name;
+      return t1.get$hashCode(t1);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isDeclaration && this.name.$eq(0, other.name) && this.kind === other.kind && this.isFinal === other.isFinal && this.type.$eq(0, other.type) && this.isStatic === other.isStatic && X.compareLists(this.annotations, other.annotations, false);
+    },
+    toString$0: function(_) {
+      var t1 = P.StringBuffer$("");
+      t1.write$1("(declaration ");
+      t1.write$1(this.name);
+      t1.write$1(this.kind === C.DeclarationKind_1 ? " (property) " : " (method) ");
+      t1.write$1(this.isFinal ? "final " : "");
+      t1.write$1(this.isStatic ? "static " : "");
+      t1.write$1(this.annotations);
+      t1.write$1(")");
+      return t1._contents;
+    },
+    $isDeclaration: true
+  },
+  DeclarationKind: {
+    "^": "Object;kind>"
+  }
+}],
+["smoke.src.common", "package:smoke/src/common.dart", , X, {
+  "^": "",
+  adjustList: function(input, min, max) {
+    var t1, t2;
+    t1 = input.length;
+    if (t1 < min) {
+      t2 = Array(min);
+      t2.fixed$length = init;
+      H.IterableMixinWorkaround_setRangeList(t2, 0, t1, input, 0);
+      return t2;
+    }
+    if (t1 > max) {
+      t1 = Array(max);
+      t1.fixed$length = init;
+      H.IterableMixinWorkaround_setRangeList(t1, 0, max, input, 0);
+      return t1;
+    }
+    return input;
+  },
+  matchesAnnotation: function(metadata, queryAnnotations) {
+    var t1, meta, t2, t3, queryMeta, t4;
+    t1 = new H.ListIterator(metadata, metadata.length, 0, null);
+    t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(metadata, 0)];
+    for (; t1.moveNext$0();) {
+      meta = t1._current;
+      queryAnnotations.length;
+      t2 = new H.ListIterator(queryAnnotations, 1, 0, null);
+      t2.$builtinTypeInfo = [H.getTypeArgumentByIndex(queryAnnotations, 0)];
+      t3 = J.getInterceptor(meta);
+      for (; t2.moveNext$0();) {
+        queryMeta = t2._current;
+        if (t3.$eq(meta, queryMeta))
+          return true;
+        if (!!J.getInterceptor(queryMeta).$isType) {
+          t4 = t3.get$runtimeType(meta);
+          t4 = $.get$typeInspector().isSubclassOf$2(t4, queryMeta);
+        } else
+          t4 = false;
+        if (t4)
+          return true;
+      }
+    }
+    return false;
+  },
+  minArgs: function(f) {
+    var t1, t2;
+    t1 = H.getDynamicRuntimeType();
+    t2 = H.buildFunctionType(t1)._isTest$1(f);
+    if (t2)
+      return 0;
+    t2 = H.buildFunctionType(t1, [t1])._isTest$1(f);
+    if (t2)
+      return 1;
+    t2 = H.buildFunctionType(t1, [t1, t1])._isTest$1(f);
+    if (t2)
+      return 2;
+    t1 = H.buildFunctionType(t1, [t1, t1, t1])._isTest$1(f);
+    if (t1)
+      return 3;
+    return 4;
+  },
+  maxArgs: function(f) {
+    var t1, t2;
+    t1 = H.getDynamicRuntimeType();
+    t2 = H.buildFunctionType(t1, [t1, t1, t1])._isTest$1(f);
+    if (t2)
+      return 3;
+    t2 = H.buildFunctionType(t1, [t1, t1])._isTest$1(f);
+    if (t2)
+      return 2;
+    t2 = H.buildFunctionType(t1, [t1])._isTest$1(f);
+    if (t2)
+      return 1;
+    t1 = H.buildFunctionType(t1)._isTest$1(f);
+    if (t1)
+      return 0;
+    return -1;
+  },
+  compareLists: function(a, b, unordered) {
+    var t1, t2, bSet, i, t3;
+    t1 = a.length;
+    t2 = b.length;
+    if (t1 !== t2)
+      return false;
+    if (unordered) {
+      bSet = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+      bSet.addAll$1(0, b);
+      for (i = 0; i < a.length; ++i)
+        if (!bSet.contains$1(0, a[i]))
+          return false;
+    } else
+      for (i = 0; i < t1; ++i) {
+        t3 = a[i];
+        if (i >= t2)
+          return H.ioore(b, i);
+        if (t3 !== b[i])
+          return false;
+      }
+    return true;
+  }
+}],
+["smoke.src.implementation", "package:smoke/src/implementation.dart", , D, {
+  "^": "",
+  throwNotConfiguredError: function() {
+    throw H.wrapException(P.Exception_Exception("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, {
+  "^": "",
+  StaticConfiguration: {
+    "^": "Object;getters,setters,parents,declarations,staticMethods,names<,checkedMode"
+  },
+  GeneratedObjectAccessorService: {
+    "^": "Object;_getters,_setters,_staticMethods",
+    read$2: function(object, $name) {
+      var getter = this._getters.$index(0, $name);
+      if (getter == null)
+        throw H.wrapException(O.MissingCodeException$("getter \"" + H.S($name) + "\" in " + H.S(object)));
+      return getter.call$1(object);
+    },
+    write$3: function(object, $name, value) {
+      var setter = this._setters.$index(0, $name);
+      if (setter == null)
+        throw H.wrapException(O.MissingCodeException$("setter \"" + H.S($name) + "\" in " + H.S(object)));
+      setter.call$2(object, value);
+    },
+    invoke$5$adjust$namedArgs: function(object, $name, args, adjust, namedArgs) {
+      var method, tentativeError, getter, min, max, t1, exception;
+      method = null;
+      if (!!J.getInterceptor(object).$isType) {
+        this._staticMethods.$index(0, object);
+        method = null;
+      } else {
+        getter = this._getters.$index(0, $name);
+        method = getter == null ? null : getter.call$1(object);
+      }
+      if (method == null)
+        throw H.wrapException(O.MissingCodeException$("method \"" + H.S($name) + "\" in " + H.S(object)));
+      tentativeError = null;
+      if (adjust) {
+        min = X.minArgs(method);
+        if (min > 3) {
+          tentativeError = "we tried to adjust the arguments for calling \"" + H.S($name) + "\", but we couldn't determine the exact number of arguments it expects (it is more than 3).";
+          args = X.adjustList(args, min, P.max(min, J.get$length$asx(args)));
+        } else {
+          max = X.maxArgs(method);
+          t1 = max >= 0 ? max : J.get$length$asx(args);
+          args = X.adjustList(args, min, t1);
+        }
+      }
+      try {
+        t1 = H.Primitives_applyFunction(method, args, P.Function__toMangledNames(null));
+        return t1;
+      } catch (exception) {
+        if (!!J.getInterceptor(H.unwrapException(exception)).$isNoSuchMethodError) {
+          if (tentativeError != null)
+            P.print(tentativeError);
+          throw exception;
+        } else
+          throw exception;
+      }
+
+    }
+  },
+  GeneratedTypeInspectorService: {
+    "^": "Object;_parents,_declarations,_checkedMode",
+    isSubclassOf$2: function(type, supertype) {
+      var t1, parentType, t2;
+      if (type.$eq(0, supertype) || supertype.$eq(0, C.Type_HqF))
+        return true;
+      for (t1 = this._parents; !J.$eq(type, C.Type_HqF); type = parentType) {
+        parentType = t1.$index(0, type);
+        t2 = J.getInterceptor(parentType);
+        if (t2.$eq(parentType, supertype))
+          return true;
+        if (parentType == null) {
+          if (!this._checkedMode)
+            return false;
+          throw H.wrapException(O.MissingCodeException$("superclass of \"" + H.S(type) + "\" (" + t2.toString$0(parentType) + ")"));
+        }
+      }
+      return false;
+    },
+    hasInstanceMethod$2: function(type, $name) {
+      var decl = this._findDeclaration$2(type, $name);
+      return decl != null && decl.kind === C.DeclarationKind_2 && !decl.isStatic;
+    },
+    hasStaticMethod$2: function(type, $name) {
+      var map, decl;
+      map = this._declarations.$index(0, type);
+      if (map == null) {
+        if (!this._checkedMode)
+          return false;
+        throw H.wrapException(O.MissingCodeException$("declarations for " + H.S(type)));
+      }
+      decl = map.$index(0, $name);
+      return decl != null && decl.kind === C.DeclarationKind_2 && decl.isStatic;
+    },
+    getDeclaration$2: function(type, $name) {
+      var decl = this._findDeclaration$2(type, $name);
+      if (decl == null) {
+        if (!this._checkedMode)
+          return;
+        throw H.wrapException(O.MissingCodeException$("declaration for " + H.S(type) + "." + H.S($name)));
+      }
+      return decl;
+    },
+    query$2: function(_, type, options) {
+      var result, superclass, map, t1, decl, t2;
+      result = [];
+      if (options.includeInherited) {
+        superclass = this._parents.$index(0, type);
+        if (superclass == null) {
+          if (this._checkedMode)
+            throw H.wrapException(O.MissingCodeException$("superclass of \"" + H.S(type) + "\""));
+        } else if (!superclass.$eq(0, options.includeUpTo))
+          result = this.query$2(0, superclass, options);
+      }
+      map = this._declarations.$index(0, type);
+      if (map == null) {
+        if (!this._checkedMode)
+          return result;
+        throw H.wrapException(O.MissingCodeException$("declarations for " + H.S(type)));
+      }
+      for (t1 = J.get$iterator$ax(map.get$values(map)); t1.moveNext$0();) {
+        decl = t1.get$current();
+        if (!options.includeFields && decl.get$isField())
+          continue;
+        if (!options.includeProperties && decl.get$isProperty())
+          continue;
+        if (options.excludeFinal && J.get$isFinal$x(decl) === true)
+          continue;
+        if (!options.includeMethods && decl.get$isMethod())
+          continue;
+        if (options.matches != null && options.matches$1(0, J.get$name$x(decl)) !== true)
+          continue;
+        t2 = options.withAnnotations;
+        if (t2 != null && !X.matchesAnnotation(decl.get$annotations(), t2))
+          continue;
+        result.push(decl);
+      }
+      return result;
+    },
+    _findDeclaration$2: function(type, $name) {
+      var t1, t2, declarations, declaration, parentType;
+      for (t1 = this._parents, t2 = this._declarations; !J.$eq(type, C.Type_HqF); type = parentType) {
+        declarations = t2.$index(0, type);
+        if (declarations != null) {
+          declaration = declarations.$index(0, $name);
+          if (declaration != null)
+            return declaration;
+        }
+        parentType = t1.$index(0, type);
+        if (parentType == null) {
+          if (!this._checkedMode)
+            return;
+          throw H.wrapException(O.MissingCodeException$("superclass of \"" + H.S(type) + "\""));
+        }
+      }
+      return;
+    }
+  },
+  GeneratedSymbolConverterService: {
+    "^": "Object;_names,_symbols",
+    GeneratedSymbolConverterService$1: function(configuration) {
+      this._names.forEach$1(0, new O.GeneratedSymbolConverterService_closure(this));
+    },
+    static: {GeneratedSymbolConverterService$: function(configuration) {
+        var t1 = new O.GeneratedSymbolConverterService(configuration.names, P.LinkedHashMap_LinkedHashMap$_empty(null, null));
+        t1.GeneratedSymbolConverterService$1(configuration);
+        return t1;
+      }}
+  },
+  GeneratedSymbolConverterService_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(k, v) {
+      this.this_0._symbols.$indexSet(0, v, k);
+    },
+    $isFunction: true
+  },
+  MissingCodeException: {
+    "^": "Object;description",
+    toString$0: function(_) {
+      return "Missing " + this.description + ". Code generation for the smoke package seems incomplete.";
+    },
+    static: {MissingCodeException$: function(description) {
+        return new O.MissingCodeException(description);
+      }}
+  }
+}],
+["stack_frame_element", "package:observatory/src/elements/stack_frame.dart", , K, {
+  "^": "",
+  StackFrameElement: {
+    "^": "ObservatoryElement_ChangeNotifier48;_stack_frame_element$__$frame,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$frame: function(receiver) {
+      return receiver._stack_frame_element$__$frame;
+    },
+    set$frame: function(receiver, value) {
+      receiver._stack_frame_element$__$frame = this.notifyPropertyChange$3(receiver, C.Symbol_frame, receiver._stack_frame_element$__$frame, value);
+    },
+    static: {StackFrameElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.StackFrameElement_methods.Element$created$0(receiver);
+        C.StackFrameElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier48: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["stack_trace_element", "package:observatory/src/elements/stack_trace.dart", , X, {
+  "^": "",
+  StackTraceElement: {
+    "^": "ObservatoryElement_ChangeNotifier49;_stack_trace_element$__$trace,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$trace: function(receiver) {
+      return receiver._stack_trace_element$__$trace;
+    },
+    set$trace: function(receiver, value) {
+      receiver._stack_trace_element$__$trace = this.notifyPropertyChange$3(receiver, C.Symbol_trace, receiver._stack_trace_element$__$trace, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._stack_trace_element$__$trace).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {StackTraceElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.StackTraceElement_methods.Element$created$0(receiver);
+        C.StackTraceElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier49: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["template_binding", "package:template_binding/template_binding.dart", , M, {
+  "^": "",
+  _updateAttribute: function(node, $name, conditional, value) {
+    var t1, t2;
+    if (conditional) {
+      t1 = null != value && false !== value;
+      t2 = J.getInterceptor$x(node);
+      if (t1)
+        t2.get$attributes(node)._html$_element.setAttribute($name, "");
+      else
+        t2.get$attributes(node).remove$1(0, $name);
+    } else {
+      t1 = J.get$attributes$x(node);
+      t2 = value == null ? "" : H.S(value);
+      t1._html$_element.setAttribute($name, t2);
+    }
+  },
+  _getTreeScope: function(node) {
+    var $parent;
+    for (; $parent = J.get$parentNode$x(node), $parent != null; node = $parent)
+      ;
+    return M._hasGetElementById(node) ? node : null;
+  },
+  _hasGetElementById: function(node) {
+    var t1 = J.getInterceptor(node);
+    return !!t1.$isDocument || !!t1.$isShadowRoot || !!t1.$isSvgSvgElement;
+  },
+  _createInstanceBindingMap: function(node, delegate) {
+    var map, t1, c, children, index, childMap;
+    map = M._getBindings(node, delegate);
+    if (map == null)
+      map = new M._InstanceBindingMap([], null, null);
+    for (t1 = J.getInterceptor$x(node), c = t1.get$firstChild(node), children = null, index = 0; c != null; c = c.nextSibling, ++index) {
+      childMap = M._createInstanceBindingMap(c, delegate);
+      if (childMap == null)
+        continue;
+      if (children == null) {
+        children = Array(t1.get$nodes(node)._this.childNodes.length);
+        children.fixed$length = init;
+      }
+      if (index >= children.length)
+        return H.ioore(children, index);
+      children[index] = childMap;
+    }
+    map.children = children;
+    return map;
+  },
+  _cloneAndBindInstance: function(node, $parent, stagingDocument, bindings, model, delegate, instanceBindings, instanceRecord) {
+    var clone, c, t1, i;
+    clone = $parent.appendChild(J.importNode$2$x(stagingDocument, node, false));
+    for (c = node.firstChild, t1 = bindings != null, i = 0; c != null; c = c.nextSibling, ++i)
+      M._cloneAndBindInstance(c, clone, stagingDocument, t1 ? bindings.getChild$1(i) : null, model, delegate, instanceBindings, null);
+    if (bindings.get$isTemplate()) {
+      M.nodeBindFallback(clone)._decorate$1(node);
+      if (delegate != null)
+        J.set$bindingDelegate$x(M.nodeBindFallback(clone), delegate);
+    }
+    M._processBindings(clone, bindings, model, instanceBindings);
+    return clone;
+  },
+  _getFragmentRoot: function(node) {
+    var p;
+    for (; p = J.get$parentNode$x(node), p != null; node = p)
+      ;
+    return node;
+  },
+  _searchRefId: function(node, id) {
+    var selector, t1, values, instance, ref, t2;
+    if (id == null || id === "")
+      return;
+    selector = "#" + H.S(id);
+    for (; true;) {
+      node = M._getFragmentRoot(node);
+      t1 = $.get$_instanceExtension();
+      t1.toString;
+      values = H.Primitives_getProperty(node, "expando$values");
+      instance = values == null ? null : H.Primitives_getProperty(values, t1._getKey$0());
+      t1 = instance == null;
+      if (!t1 && instance.get$_protoContent() != null)
+        ref = J.querySelector$1$x(instance.get$_protoContent(), selector);
+      else {
+        t2 = J.getInterceptor(node);
+        ref = !!t2.$isDocument || !!t2.$isShadowRoot || !!t2.$isSvgSvgElement ? t2.getElementById$1(node, id) : null;
+      }
+      if (ref != null)
+        return ref;
+      if (t1)
+        return;
+      node = instance.get$_templateCreator();
+      if (node == null)
+        return;
+    }
+  },
+  _getDelegateFactory: function($name, node, delegate) {
+    if (delegate == null)
+      return;
+    return new M._getDelegateFactory_closure($name, node, delegate);
+  },
+  _getBindings: function(node, delegate) {
+    var t1, tokens;
+    t1 = J.getInterceptor(node);
+    if (!!t1.$isElement)
+      return M._parseAttributeBindings(node, delegate);
+    if (!!t1.$isText) {
+      tokens = S.MustacheTokens_parse(node.textContent, M._getDelegateFactory("text", node, delegate));
+      if (tokens != null)
+        return new M._InstanceBindingMap(["text", tokens], null, null);
+    }
+    return;
+  },
+  _parseWithDefault: function(element, $name, delegate) {
+    var v = element.getAttribute($name);
+    if (v === "")
+      v = "{{}}";
+    return S.MustacheTokens_parse(v, M._getDelegateFactory($name, element, delegate));
+  },
+  _parseAttributeBindings: function(element, delegate) {
+    var t1, isTemplateNode, t2, bindings, result, t3;
+    t1 = {};
+    t1.bindings_0 = null;
+    isTemplateNode = M.isSemanticTemplate(element);
+    new W._ElementAttributeMap(element).forEach$1(0, new M._parseAttributeBindings_closure(t1, element, delegate, isTemplateNode));
+    if (isTemplateNode) {
+      t2 = t1.bindings_0;
+      if (t2 == null) {
+        bindings = [];
+        t1.bindings_0 = bindings;
+        t1 = bindings;
+      } else
+        t1 = t2;
+      result = new M._TemplateBindingMap(null, null, null, t1, null, null);
+      t1 = M._parseWithDefault(element, "if", delegate);
+      result._if = t1;
+      t2 = M._parseWithDefault(element, "bind", delegate);
+      result._bind = t2;
+      t3 = M._parseWithDefault(element, "repeat", delegate);
+      result._repeat = t3;
+      if (t1 != null && t2 == null && t3 == null)
+        result._bind = S.MustacheTokens_parse("{{}}", M._getDelegateFactory("bind", element, delegate));
+      return result;
+    }
+    t1 = t1.bindings_0;
+    return t1 == null ? null : new M._InstanceBindingMap(t1, null, null);
+  },
+  _processOneTimeBinding: function($name, tokens, node, model) {
+    var delegateFn, value, t1, t2, values, i, t3;
+    if (tokens.get$hasOnePath()) {
+      delegateFn = tokens.getPrepareBinding$1(0);
+      value = delegateFn != null ? delegateFn.call$3(model, node, true) : tokens.getPath$1(0).getValueFrom$1(model);
+      return tokens.get$isSimplePath() ? value : tokens.combinator$1(value);
+    }
+    t1 = J.getInterceptor$asx(tokens);
+    t2 = t1.get$length(tokens);
+    if (typeof t2 !== "number")
+      return H.iae(t2);
+    values = Array(t2);
+    values.fixed$length = init;
+    t2 = values.length;
+    i = 0;
+    while (true) {
+      t3 = t1.get$length(tokens);
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      if (!(i < t3))
+        break;
+      delegateFn = tokens.getPrepareBinding$1(i);
+      t3 = delegateFn != null ? delegateFn.call$3(model, node, false) : tokens.getPath$1(i).getValueFrom$1(model);
+      if (i >= t2)
+        return H.ioore(values, i);
+      values[i] = t3;
+      ++i;
+    }
+    return tokens.combinator$1(values);
+  },
+  _processBinding: function($name, tokens, node, model) {
+    var delegateFn, observer, t1, t2, i, oneTime, value, path;
+    if (tokens.get$onlyOneTime())
+      return M._processOneTimeBinding($name, tokens, node, model);
+    if (tokens.get$hasOnePath()) {
+      delegateFn = tokens.getPrepareBinding$1(0);
+      if (delegateFn != null)
+        observer = delegateFn.call$3(model, node, false);
+      else {
+        t1 = tokens.getPath$1(0);
+        t1 = !!J.getInterceptor(t1).$isPropertyPath ? t1 : L.PropertyPath_PropertyPath(t1);
+        t2 = $._Observer__nextBirthId;
+        $._Observer__nextBirthId = t2 + 1;
+        observer = new L.PathObserver(t1, model, null, t2, null, null, null);
+      }
+      return tokens.get$isSimplePath() ? observer : new Y.ObserverTransform(observer, tokens.get$combinator(), null, null, null);
+    }
+    t1 = $._Observer__nextBirthId;
+    $._Observer__nextBirthId = t1 + 1;
+    observer = new L.CompoundObserver(null, [], t1, null, null, null);
+    observer._path_observer$_value = [];
+    t1 = J.getInterceptor$asx(tokens);
+    i = 0;
+    while (true) {
+      t2 = t1.get$length(tokens);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      if (!(i < t2))
+        break;
+      c$0: {
+        oneTime = tokens.getOneTime$1(i);
+        delegateFn = tokens.getPrepareBinding$1(i);
+        if (delegateFn != null) {
+          value = delegateFn.call$3(model, node, oneTime);
+          if (oneTime === true)
+            observer.addPath$1(value);
+          else {
+            if (observer._notifyCallback != null || observer._observed == null)
+              H.throwExpression(P.StateError$("Cannot add observers once started."));
+            J.open$1$x(value, observer.get$_deliver());
+            t2 = observer._observed;
+            t2.push(C.C__ObserverSentinel);
+            t2.push(value);
+          }
+          break c$0;
+        }
+        path = tokens.getPath$1(i);
+        if (oneTime === true)
+          observer.addPath$1(path.getValueFrom$1(model));
+        else
+          observer.addPath$2(model, path);
+      }
+      ++i;
+    }
+    return new Y.ObserverTransform(observer, tokens.get$combinator(), null, null, null);
+  },
+  _processBindings: function(node, map, model, instanceBindings) {
+    var t1, bindings, nodeExt, t2, t3, i, $name, tokens, binding, templateExt, iter;
+    t1 = J.getInterceptor$x(map);
+    bindings = t1.get$bindings(map);
+    nodeExt = !!J.getInterceptor(node).$isNodeBindExtension ? node : M.nodeBindFallback(node);
+    for (t2 = J.getInterceptor$asx(bindings), t3 = J.getInterceptor$x(nodeExt), i = 0; i < t2.get$length(bindings); i += 2) {
+      $name = t2.$index(bindings, i);
+      tokens = t2.$index(bindings, i + 1);
+      binding = t3.bind$3$oneTime(nodeExt, $name, M._processBinding($name, tokens, node, model), tokens.get$onlyOneTime());
+      if (binding != null && true)
+        instanceBindings.push(binding);
+    }
+    t3.bindFinished$0(nodeExt);
+    if (!t1.$is_TemplateBindingMap)
+      return;
+    templateExt = M.nodeBindFallback(node);
+    templateExt.set$_model(model);
+    iter = templateExt._processBindingDirectives$1(map);
+    if (iter != null && true)
+      instanceBindings.push(iter);
+  },
+  nodeBindFallback: function(node) {
+    var t1, values, extension, t2;
+    t1 = $.get$_expando();
+    t1.toString;
+    values = H.Primitives_getProperty(node, "expando$values");
+    extension = values == null ? null : H.Primitives_getProperty(values, t1._getKey$0());
+    if (extension != null)
+      return extension;
+    t2 = J.getInterceptor(node);
+    if (!!t2.$isInputElement)
+      extension = new M._InputElementExtension(node, null, null);
+    else if (!!t2.$isSelectElement)
+      extension = new M._SelectElementExtension(node, null, null);
+    else if (!!t2.$isTextAreaElement)
+      extension = new M._TextAreaElementExtension(node, null, null);
+    else if (!!t2.$isElement) {
+      if (!(node.tagName === "TEMPLATE" && node.namespaceURI === "http://www.w3.org/1999/xhtml"))
+        if (!(t2.get$attributes(node)._html$_element.hasAttribute("template") === true && C.Map_05eTF.containsKey$1(t2.get$localName(node)) === true))
+          t2 = node.tagName === "template" && t2.get$namespaceUri(node) === "http://www.w3.org/2000/svg";
+        else
+          t2 = true;
+      else
+        t2 = true;
+      extension = t2 ? new M.TemplateBindExtension(null, null, null, false, null, null, null, null, null, null, node, null, null) : new M._ElementExtension(node, null, null);
+    } else
+      extension = !!t2.$isText ? new M._TextExtension(node, null, null) : new M.NodeBindExtension(node, null, null);
+    t1.$indexSet(0, node, extension);
+    return extension;
+  },
+  isSemanticTemplate: function(n) {
+    var t1 = J.getInterceptor(n);
+    if (!!t1.$isElement)
+      if (!(n.tagName === "TEMPLATE" && n.namespaceURI === "http://www.w3.org/1999/xhtml"))
+        if (!(t1.get$attributes(n)._html$_element.hasAttribute("template") === true && C.Map_05eTF.containsKey$1(t1.get$localName(n)) === true))
+          t1 = n.tagName === "template" && t1.get$namespaceUri(n) === "http://www.w3.org/2000/svg";
+        else
+          t1 = true;
+      else
+        t1 = true;
+    else
+      t1 = false;
+    return t1;
+  },
+  BindingDelegate: {
+    "^": "Object;_bindingMaps",
+    prepareBinding$3: function(path, $name, node) {
+      return;
+    },
+    static: {"^": "BindingDelegate__DEFAULT"}
+  },
+  _ElementExtension: {
+    "^": "NodeBindExtension;_node,bindings,_templateInstance",
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, node, t2, t3, t4, conditional;
+      t1 = {};
+      t1.name_0 = $name;
+      node = this.get$_node();
+      t2 = J.getInterceptor(node);
+      t3 = !!t2.$isOptionElement && J.$eq(t1.name_0, "value");
+      t4 = t1.name_0;
+      if (t3) {
+        new W._ElementAttributeMap(node).remove$1(0, t4);
+        if (oneTime)
+          return this._updateOption$1(value);
+        t2 = this.get$_updateOption();
+        t2.call$1(J.open$1$x(value, t2));
+      } else {
+        conditional = J.endsWith$1$s(t4, "?");
+        if (conditional) {
+          t2.get$attributes(node).remove$1(0, t1.name_0);
+          t2 = t1.name_0;
+          t3 = J.getInterceptor$asx(t2);
+          t1.name_0 = t3.substring$2(t2, 0, J.$sub$n(t3.get$length(t2), 1));
+        }
+        if (oneTime)
+          return M._updateAttribute(this.get$_node(), t1.name_0, conditional, value);
+        t2 = new M._ElementExtension_bind_closure(t1, this, conditional);
+        t2.call$1(J.open$1$x(value, t2));
+      }
+      t1 = t1.name_0;
+      return $.enableBindingsReflection ? this._updateBindings$2(t1, value) : value;
+    },
+    _updateOption$1: [function(newValue) {
+      var node, t1, select, t2, bindings, valueBinding, oldValue, selectBinding;
+      node = this.get$_node();
+      t1 = J.getInterceptor$x(node);
+      select = t1.get$parentNode(node);
+      t2 = J.getInterceptor(select);
+      if (!!t2.$isSelectElement) {
+        bindings = J.get$bindings$x(M.nodeBindFallback(select));
+        if (bindings != null) {
+          valueBinding = J.$index$asx(bindings, "value");
+          if (!!J.getInterceptor(valueBinding).$is_InputBinding) {
+            oldValue = select.value;
+            selectBinding = valueBinding;
+          } else {
+            oldValue = null;
+            selectBinding = null;
+          }
+        } else {
+          oldValue = null;
+          selectBinding = null;
+        }
+      } else {
+        oldValue = null;
+        selectBinding = null;
+      }
+      t1.set$value(node, newValue == null ? "" : H.S(newValue));
+      if (selectBinding != null && !J.$eq(t2.get$value(select), oldValue)) {
+        t1 = t2.get$value(select);
+        J.set$value$x(selectBinding.get$_template_binding$_bindable(), t1);
+      }
+    }, "call$1", "get$_updateOption", 2, 0, 20, 58]
+  },
+  _ElementExtension_bind_closure: {
+    "^": "Closure:13;box_0,this_1,conditional_2",
+    call$1: [function(x) {
+      return M._updateAttribute(this.this_1.get$_node(), this.box_0.name_0, this.conditional_2, x);
+    }, "call$1", null, 2, 0, null, 65, "call"],
+    $isFunction: true
+  },
+  _InputBinding: {
+    "^": "Bindable;_node<,_eventSub,_template_binding$_bindable<,_propertyName",
+    _template_binding$_updateNode$1: [function(newValue) {
+      return M._InputBinding__updateProperty(this._node, newValue, this._propertyName);
+    }, "call$1", "get$_template_binding$_updateNode", 2, 0, 20, 58],
+    _nodeChanged$1: [function(e) {
+      var t1, t2, t3, r, checkedBinding;
+      switch (this._propertyName) {
+        case "value":
+          t1 = J.get$value$x(this._node);
+          J.set$value$x(this._template_binding$_bindable, t1);
+          break;
+        case "checked":
+          t1 = this._node;
+          t2 = J.getInterceptor$x(t1);
+          t3 = t2.get$checked(t1);
+          J.set$value$x(this._template_binding$_bindable, t3);
+          if (!!t2.$isInputElement && J.$eq(t2.get$type(t1), "radio"))
+            for (t1 = J.get$iterator$ax(M._InputBinding__getAssociatedRadioButtons(t1)); t1.moveNext$0();) {
+              r = t1.get$current();
+              checkedBinding = J.$index$asx(J.get$bindings$x(!!J.getInterceptor(r).$isNodeBindExtension ? r : M.nodeBindFallback(r)), "checked");
+              if (checkedBinding != null)
+                J.set$value$x(checkedBinding, false);
+            }
+          break;
+        case "selectedIndex":
+          t1 = J.get$selectedIndex$x(this._node);
+          J.set$value$x(this._template_binding$_bindable, t1);
+          break;
+      }
+      O.dirtyCheckObservables();
+    }, "call$1", "get$_nodeChanged", 2, 0, 20, 1],
+    open$1: function(_, callback) {
+      return J.open$1$x(this._template_binding$_bindable, callback);
+    },
+    get$value: function(_) {
+      return J.get$value$x(this._template_binding$_bindable);
+    },
+    set$value: function(_, newValue) {
+      J.set$value$x(this._template_binding$_bindable, newValue);
+      return newValue;
+    },
+    close$0: function(_) {
+      var t1 = this._eventSub;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._eventSub = null;
+      }
+      t1 = this._template_binding$_bindable;
+      if (t1 != null) {
+        J.close$0$x(t1);
+        this._template_binding$_bindable = null;
+      }
+    },
+    $is_InputBinding: true,
+    static: {"^": "_InputBinding__checkboxEventType", _InputBinding__updateProperty: function(node, newValue, propertyName) {
+        switch (propertyName) {
+          case "checked":
+            J.set$checked$x(node, null != newValue && false !== newValue);
+            return;
+          case "selectedIndex":
+            J.set$selectedIndex$x(node, M._InputBinding__toInt(newValue));
+            return;
+          case "value":
+            J.set$value$x(node, newValue == null ? "" : H.S(newValue));
+            return;
+        }
+      }, _InputBinding__getStreamForInputType: function(element) {
+        var t1 = J.getInterceptor(element);
+        if (!!t1.$isOptionElement)
+          return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(element, C.EventStreamProvider_input._eventType, false), [null]);
+        switch (t1.get$type(element)) {
+          case "checkbox":
+            return $.get$_InputBinding__checkboxEventType().forTarget$1(element);
+          case "radio":
+          case "select-multiple":
+          case "select-one":
+            return t1.get$onChange(element);
+          case "range":
+            if (J.contains$1$asx(window.navigator.userAgent, new H.JSSyntaxRegExp("Trident|MSIE", H.JSSyntaxRegExp_makeNative("Trident|MSIE", false, true, false), null, null)))
+              return t1.get$onChange(element);
+            break;
+        }
+        return t1.get$onInput(element);
+      }, _InputBinding__getAssociatedRadioButtons: function(element) {
+        var t1, treeScope, radios;
+        t1 = J.getInterceptor$x(element);
+        if (t1.get$form(element) != null) {
+          t1 = t1.get$form(element);
+          t1.toString;
+          t1 = new W._ChildNodeListLazy(t1);
+          return t1.where$1(t1, new M._InputBinding__getAssociatedRadioButtons_closure(element));
+        } else {
+          treeScope = M._getTreeScope(element);
+          if (treeScope == null)
+            return C.List_empty;
+          radios = J.querySelectorAll$1$x(treeScope, "input[type=\"radio\"][name=\"" + H.S(t1.get$name(element)) + "\"]");
+          return radios.where$1(radios, new M._InputBinding__getAssociatedRadioButtons_closure0(element));
+        }
+      }, _InputBinding__toInt: function(value) {
+        if (typeof value === "string")
+          return H.Primitives_parseInt(value, null, new M._InputBinding__toInt_closure());
+        return typeof value === "number" && Math.floor(value) === value ? value : 0;
+      }}
+  },
+  closure10: {
+    "^": "Closure:69;",
+    call$0: function() {
+      var checkbox, t1, fired, t2, $event;
+      checkbox = document.createElement("div", null).appendChild(W.InputElement_InputElement(null));
+      t1 = J.getInterceptor$x(checkbox);
+      t1.set$type(checkbox, "checkbox");
+      fired = [];
+      t2 = t1.get$onClick(checkbox);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t2._html$_target, t2._eventType, W._wrapZone(new M._closure1(fired)), t2._useCapture), [H.getTypeArgumentByIndex(t2, 0)])._tryResume$0();
+      t1 = t1.get$onChange(checkbox);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(new M._closure2(fired)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+      t1 = window;
+      $event = document.createEvent("MouseEvent");
+      J._initMouseEvent$15$x($event, "click", true, true, t1, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+      checkbox.dispatchEvent($event);
+      return fired.length === 1 ? C.EventStreamProvider_change : C.JSArray_methods.get$first(fired);
+    },
+    $isFunction: true
+  },
+  _closure1: {
+    "^": "Closure:13;fired_0",
+    call$1: [function(e) {
+      this.fired_0.push(C.EventStreamProvider_click);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _closure2: {
+    "^": "Closure:13;fired_1",
+    call$1: [function(e) {
+      this.fired_1.push(C.EventStreamProvider_change);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _InputBinding__getAssociatedRadioButtons_closure: {
+    "^": "Closure:13;element_0",
+    call$1: function(el) {
+      var t1, t2;
+      t1 = this.element_0;
+      t2 = J.getInterceptor(el);
+      if (!t2.$eq(el, t1))
+        if (!!t2.$isInputElement)
+          if (el.type === "radio") {
+            t2 = el.name;
+            t1 = J.get$name$x(t1);
+            t1 = t2 == null ? t1 == null : t2 === t1;
+          } else
+            t1 = false;
+        else
+          t1 = false;
+      else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  _InputBinding__getAssociatedRadioButtons_closure0: {
+    "^": "Closure:13;element_1",
+    call$1: function(el) {
+      var t1 = J.getInterceptor(el);
+      return !t1.$eq(el, this.element_1) && t1.get$form(el) == null;
+    },
+    $isFunction: true
+  },
+  _InputBinding__toInt_closure: {
+    "^": "Closure:13;",
+    call$1: function(_) {
+      return 0;
+    },
+    $isFunction: true
+  },
+  _InputElementExtension: {
+    "^": "_ElementExtension;_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, t2, t3;
+      t1 = J.getInterceptor($name);
+      if (!t1.$eq($name, "value") && !t1.$eq($name, "checked"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      J.get$attributes$x(this._node).remove$1(0, $name);
+      if (oneTime) {
+        M._InputBinding__updateProperty(this._node, value, $name);
+        return;
+      }
+      t1 = this._node;
+      t2 = new M._InputBinding(t1, null, value, $name);
+      t2._eventSub = M._InputBinding__getStreamForInputType(t1).listen$1(t2.get$_nodeChanged());
+      t3 = t2.get$_template_binding$_updateNode();
+      M._InputBinding__updateProperty(t1, J.open$1$x(t2._template_binding$_bindable, t3), $name);
+      return this._updateBindings$2($name, t2);
+    }
+  },
+  _InstanceBindingMap: {
+    "^": "Object;bindings>,children>,content>",
+    get$isTemplate: function() {
+      return false;
+    },
+    getChild$1: function(index) {
+      var t1 = this.children;
+      if (t1 == null || index >= t1.length)
+        return;
+      if (index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    }
+  },
+  _TemplateBindingMap: {
+    "^": "_InstanceBindingMap;_if,_bind,_repeat,bindings,children,content",
+    get$isTemplate: function() {
+      return true;
+    },
+    $is_TemplateBindingMap: true
+  },
+  NodeBindExtension: {
+    "^": "Object;_node<,bindings*,_templateInstance?",
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1;
+      window;
+      t1 = "Unhandled binding to Node: " + H.Primitives_objectToString(this) + " " + H.S($name) + " " + H.S(value) + " " + oneTime;
+      if (typeof console != "undefined")
+        console.error(t1);
+      return;
+    },
+    bindFinished$0: function(_) {
+    },
+    get$templateInstance: function(_) {
+      var t1 = this._templateInstance;
+      if (t1 != null)
+        ;
+      else if (J.get$parent$x(this.get$_node()) != null) {
+        t1 = J.get$parent$x(this.get$_node());
+        t1 = J.get$templateInstance$x(!!J.getInterceptor(t1).$isNodeBindExtension ? t1 : M.nodeBindFallback(t1));
+      } else
+        t1 = null;
+      return t1;
+    },
+    _updateBindings$2: function($name, binding) {
+      var t1, old;
+      t1 = this.bindings;
+      if (t1 == null) {
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        this.bindings = t1;
+      }
+      old = t1.$index(0, $name);
+      if (old != null)
+        J.close$0$x(old);
+      this.bindings.$indexSet(0, $name, binding);
+      return binding;
+    },
+    $isNodeBindExtension: true
+  },
+  TemplateInstance: {
+    "^": "Object;model>,_firstNode,_lastNode"
+  },
+  _SelectElementExtension: {
+    "^": "_ElementExtension;_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, t2, t3;
+      if (J.$eq($name, "selectedindex"))
+        $name = "selectedIndex";
+      t1 = J.getInterceptor($name);
+      if (!t1.$eq($name, "selectedIndex") && !t1.$eq($name, "value"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      J.get$attributes$x(this._node).remove$1(0, $name);
+      if (oneTime) {
+        M._InputBinding__updateProperty(this._node, value, $name);
+        return;
+      }
+      t1 = this._node;
+      t2 = new M._InputBinding(t1, null, value, $name);
+      t2._eventSub = M._InputBinding__getStreamForInputType(t1).listen$1(t2.get$_nodeChanged());
+      t3 = t2.get$_template_binding$_updateNode();
+      M._InputBinding__updateProperty(t1, J.open$1$x(t2._template_binding$_bindable, t3), $name);
+      return this._updateBindings$2($name, t2);
+    }
+  },
+  TemplateBindExtension: {
+    "^": "_ElementExtension;_model?,_bindingDelegate,_template_binding$_iterator<,_setModelScheduled,_templateInstanceRef?,_content?,_templateIsDecorated?,_stagingDocument,_bindingMap,_refContent,_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var ref;
+      if (!J.$eq($name, "ref"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      ref = oneTime ? value : J.open$1$x(value, new M.TemplateBindExtension_bind_closure(this));
+      J.get$attributes$x(this._node)._html$_element.setAttribute("ref", ref);
+      this._refChanged$0();
+      if (oneTime)
+        return;
+      return this._updateBindings$2("ref", value);
+    },
+    _processBindingDirectives$1: function(directives) {
+      var t1 = this._template_binding$_iterator;
+      if (t1 != null)
+        t1._closeDependencies$0();
+      if (directives._if == null && directives._bind == null && directives._repeat == null) {
+        t1 = this._template_binding$_iterator;
+        if (t1 != null) {
+          t1.close$0(0);
+          this._template_binding$_iterator = null;
+        }
+        return;
+      }
+      t1 = this._template_binding$_iterator;
+      if (t1 == null) {
+        t1 = new M._TemplateIterator(this, [], [], null, false, null, null, null, null, null, null, null, false, null, null);
+        this._template_binding$_iterator = t1;
+      }
+      t1._updateDependencies$2(directives, this._model);
+      J.observe$3$attributeFilter$attributes$x($.get$TemplateBindExtension__templateObserver(), this._node, ["ref"], true);
+      return this._template_binding$_iterator;
+    },
+    createInstance$2: function(_, model, delegate) {
+      var t1, t2, delegate0, t3, map, owner, doc, instance, instanceExt, t4, instanceRecord, c, i, collectTerminator, childMap, clone;
+      if (delegate == null)
+        delegate = this._bindingDelegate;
+      t1 = this._refContent;
+      if (t1 == null) {
+        t1 = this.get$_ref();
+        t1 = J.get$content$x(!!J.getInterceptor(t1).$isNodeBindExtension ? t1 : M.nodeBindFallback(t1));
+        this._refContent = t1;
+      }
+      t2 = J.getInterceptor$x(t1);
+      if (t2.get$firstChild(t1) == null)
+        return $.get$_emptyInstance();
+      delegate0 = delegate == null ? $.get$BindingDelegate__DEFAULT() : delegate;
+      t3 = delegate0._bindingMaps;
+      if (t3 == null) {
+        t3 = H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+        delegate0._bindingMaps = t3;
+      }
+      map = t3.$index(0, t1);
+      if (map == null) {
+        map = M._createInstanceBindingMap(t1, delegate0);
+        delegate0._bindingMaps.$indexSet(0, t1, map);
+      }
+      t3 = this._stagingDocument;
+      if (t3 == null) {
+        owner = J.get$ownerDocument$x(this._node);
+        t3 = $.get$TemplateBindExtension__ownerStagingDocument();
+        doc = t3.$index(0, owner);
+        if (doc == null) {
+          doc = owner.implementation.createHTMLDocument("");
+          $.get$_isStagingDocument().$indexSet(0, doc, true);
+          M.TemplateBindExtension__baseUriWorkaround(doc);
+          t3.$indexSet(0, owner, doc);
+        }
+        this._stagingDocument = doc;
+        t3 = doc;
+      }
+      instance = J.createDocumentFragment$0$x(t3);
+      t3 = [];
+      instanceExt = new M._InstanceExtension(t3, null, null, null);
+      t4 = $.get$_instanceExtension();
+      instanceExt._templateCreator = this._node;
+      instanceExt._protoContent = t1;
+      t4.$indexSet(0, instance, instanceExt);
+      instanceRecord = new M.TemplateInstance(model, null, null);
+      M.nodeBindFallback(instance).set$_templateInstance(instanceRecord);
+      for (c = t2.get$firstChild(t1), t1 = map != null, i = 0, collectTerminator = false; c != null; c = c.nextSibling, ++i) {
+        if (c.nextSibling == null)
+          collectTerminator = true;
+        childMap = t1 ? map.getChild$1(i) : null;
+        clone = M._cloneAndBindInstance(c, instance, this._stagingDocument, childMap, model, delegate, t3, null);
+        M.nodeBindFallback(clone).set$_templateInstance(instanceRecord);
+        if (collectTerminator)
+          instanceExt._terminator = clone;
+      }
+      instanceRecord._firstNode = instance.firstChild;
+      instanceRecord._lastNode = instance.lastChild;
+      instanceExt._protoContent = null;
+      instanceExt._templateCreator = null;
+      return instance;
+    },
+    get$model: function(_) {
+      return this._model;
+    },
+    get$bindingDelegate: function(_) {
+      return this._bindingDelegate;
+    },
+    set$bindingDelegate: function(_, value) {
+      var t1;
+      if (this._bindingDelegate != null)
+        throw H.wrapException(P.StateError$("Template must be cleared before a new bindingDelegate can be assigned"));
+      this._bindingDelegate = value;
+      this._bindingMap = null;
+      t1 = this._template_binding$_iterator;
+      if (t1 != null) {
+        t1._initPrepareFunctions = false;
+        t1._instanceModelFn = null;
+        t1._instancePositionChangedFn = null;
+      }
+    },
+    _refChanged$0: function() {
+      var t1, t2;
+      if (this._template_binding$_iterator != null) {
+        t1 = this._refContent;
+        t2 = this.get$_ref();
+        t2 = J.get$content$x(!!J.getInterceptor(t2).$isNodeBindExtension ? t2 : M.nodeBindFallback(t2));
+        t2 = t1 == null ? t2 == null : t1 === t2;
+        t1 = t2;
+      } else
+        t1 = true;
+      if (t1)
+        return;
+      this._refContent = null;
+      this._template_binding$_iterator._valueChanged$1(null);
+      this._template_binding$_iterator._updateIteratedValue$1(null);
+    },
+    clear$0: function(_) {
+      var t1, ref;
+      this._model = null;
+      this._bindingDelegate = null;
+      t1 = this.bindings;
+      if (t1 != null) {
+        ref = t1.remove$1(0, "ref");
+        if (ref != null)
+          J.close$0$x(ref);
+      }
+      this._refContent = null;
+      t1 = this._template_binding$_iterator;
+      if (t1 == null)
+        return;
+      t1._valueChanged$1(null);
+      this._template_binding$_iterator.close$0(0);
+      this._template_binding$_iterator = null;
+    },
+    get$_ref: function() {
+      var ref, nextRef;
+      this._decorate$0();
+      ref = M._searchRefId(this._node, J.get$attributes$x(this._node)._html$_element.getAttribute("ref"));
+      if (ref == null) {
+        ref = this._templateInstanceRef;
+        if (ref == null)
+          return this._node;
+      }
+      nextRef = M.nodeBindFallback(ref).get$_ref();
+      return nextRef != null ? nextRef : ref;
+    },
+    get$content: function(_) {
+      var t1;
+      this._decorate$0();
+      t1 = this._content;
+      return t1 != null ? t1 : H.interceptedTypeCast(this._node, "$isTemplateElement").content;
+    },
+    _decorate$1: function(instanceRef) {
+      var isNativeHtmlTemplate, liftContents, t1, t2, templateElementExt, liftRoot, template;
+      if (this._templateIsDecorated === true)
+        return false;
+      M.TemplateBindExtension__injectStylesheet();
+      M.TemplateBindExtension__globalBaseUriWorkaround();
+      this._templateIsDecorated = true;
+      isNativeHtmlTemplate = !!J.getInterceptor(this._node).$isTemplateElement;
+      liftContents = !isNativeHtmlTemplate;
+      if (liftContents) {
+        t1 = this._node;
+        t2 = J.getInterceptor$x(t1);
+        if (t2.get$attributes(t1)._html$_element.hasAttribute("template") === true && C.Map_05eTF.containsKey$1(t2.get$localName(t1)) === true) {
+          if (instanceRef != null)
+            throw H.wrapException(P.ArgumentError$("instanceRef should not be supplied for attribute templates."));
+          templateElementExt = M.TemplateBindExtension__extractTemplateFromAttributeTemplate(this._node);
+          templateElementExt = !!J.getInterceptor(templateElementExt).$isNodeBindExtension ? templateElementExt : M.nodeBindFallback(templateElementExt);
+          templateElementExt.set$_templateIsDecorated(true);
+          isNativeHtmlTemplate = !!J.getInterceptor(templateElementExt.get$_node()).$isTemplateElement;
+          liftRoot = true;
+        } else {
+          t1 = this._node;
+          t2 = J.getInterceptor$x(t1);
+          if (t2.get$tagName(t1) === "template" && t2.get$namespaceUri(t1) === "http://www.w3.org/2000/svg") {
+            t1 = this._node;
+            t2 = J.getInterceptor$x(t1);
+            template = t2.get$ownerDocument(t1).createElement("template", null);
+            t2.get$parentNode(t1).insertBefore(template, t1);
+            template.toString;
+            new W._ElementAttributeMap(template).addAll$1(0, t2.get$attributes(t1));
+            t2.get$attributes(t1).clear$0(0);
+            t2.remove$0(t1);
+            templateElementExt = !!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template);
+            templateElementExt.set$_templateIsDecorated(true);
+            isNativeHtmlTemplate = !!J.getInterceptor(templateElementExt.get$_node()).$isTemplateElement;
+          } else {
+            templateElementExt = this;
+            isNativeHtmlTemplate = false;
+          }
+          liftRoot = false;
+        }
+      } else {
+        templateElementExt = this;
+        liftRoot = false;
+      }
+      if (!isNativeHtmlTemplate)
+        templateElementExt.set$_content(J.createDocumentFragment$0$x(M.TemplateBindExtension__getOrCreateTemplateContentsOwner(templateElementExt.get$_node())));
+      if (instanceRef != null)
+        templateElementExt.set$_templateInstanceRef(instanceRef);
+      else if (liftContents)
+        M.TemplateBindExtension__liftNonNativeChildrenIntoContent(templateElementExt, this._node, liftRoot);
+      else
+        M.TemplateBindExtension_bootstrap(J.get$content$x(templateElementExt));
+      return true;
+    },
+    _decorate$0: function() {
+      return this._decorate$1(null);
+    },
+    $isTemplateBindExtension: true,
+    static: {"^": "TemplateBindExtension__contentsOwner,TemplateBindExtension__ownerStagingDocument,TemplateBindExtension__allTemplatesSelectors,TemplateBindExtension__initStyles,TemplateBindExtension__initBaseUriWorkaround,TemplateBindExtension__templateObserver", TemplateBindExtension__getOrCreateTemplateContentsOwner: function(template) {
+        var doc, d, t1, t2;
+        doc = J.get$ownerDocument$x(template);
+        if (W._convertNativeToDart_Window(doc.defaultView) == null)
+          return doc;
+        d = $.get$TemplateBindExtension__contentsOwner().$index(0, doc);
+        if (d == null) {
+          d = doc.implementation.createHTMLDocument("");
+          for (; t1 = d.lastChild, t1 != null;) {
+            t2 = t1.parentNode;
+            if (t2 != null)
+              t2.removeChild(t1);
+          }
+          $.get$TemplateBindExtension__contentsOwner().$indexSet(0, doc, d);
+        }
+        return d;
+      }, TemplateBindExtension__extractTemplateFromAttributeTemplate: function(el) {
+        var t1, template, t2, $name, t3, value;
+        t1 = J.getInterceptor$x(el);
+        template = t1.get$ownerDocument(el).createElement("template", null);
+        t1.get$parentNode(el).insertBefore(template, el);
+        for (t2 = C.JSArray_methods.toList$0(t1.get$attributes(el).get$keys()), t2 = H.setRuntimeTypeInfo(new H.ListIterator(t2, t2.length, 0, null), [H.getTypeArgumentByIndex(t2, 0)]); t2.moveNext$0();) {
+          $name = t2._current;
+          switch ($name) {
+            case "template":
+              t3 = t1.get$attributes(el)._html$_element;
+              t3.getAttribute($name);
+              t3.removeAttribute($name);
+              break;
+            case "repeat":
+            case "bind":
+            case "ref":
+              template.toString;
+              t3 = t1.get$attributes(el)._html$_element;
+              value = t3.getAttribute($name);
+              t3.removeAttribute($name);
+              template.setAttribute($name, value);
+              break;
+          }
+        }
+        return template;
+      }, TemplateBindExtension__liftNonNativeChildrenIntoContent: function(template, el, useRoot) {
+        var $content, t1, t2, child;
+        $content = J.get$content$x(template);
+        if (useRoot) {
+          J.append$1$x($content, el);
+          return;
+        }
+        for (t1 = J.getInterceptor$x(el), t2 = J.getInterceptor$x($content); child = t1.get$firstChild(el), child != null;)
+          t2.append$1($content, child);
+      }, TemplateBindExtension_bootstrap: function($content) {
+        var t1, descendents;
+        t1 = new M.TemplateBindExtension_bootstrap__bootstrap();
+        descendents = J.querySelectorAll$1$x($content, $.get$TemplateBindExtension__allTemplatesSelectors());
+        if (M.isSemanticTemplate($content))
+          t1.call$1($content);
+        descendents.forEach$1(descendents, t1);
+      }, TemplateBindExtension__injectStylesheet: function() {
+        if ($.TemplateBindExtension__initStyles === true)
+          return;
+        $.TemplateBindExtension__initStyles = true;
+        var style = document.createElement("style", null);
+        J.set$text$x(style, H.S($.get$TemplateBindExtension__allTemplatesSelectors()) + " { display: none; }");
+        document.head.appendChild(style);
+      }, TemplateBindExtension__globalBaseUriWorkaround: function() {
+        var t, d;
+        if ($.TemplateBindExtension__initBaseUriWorkaround === true)
+          return;
+        $.TemplateBindExtension__initBaseUriWorkaround = true;
+        t = document.createElement("template", null);
+        if (!!J.getInterceptor(t).$isTemplateElement) {
+          d = t.content.ownerDocument;
+          if (d.documentElement == null)
+            d.appendChild(d.createElement("html", null)).appendChild(d.createElement("head", null));
+          if (J.get$head$x(d).querySelector("base") == null)
+            M.TemplateBindExtension__baseUriWorkaround(d);
+        }
+      }, TemplateBindExtension__baseUriWorkaround: function(doc) {
+        var base = doc.createElement("base", null);
+        J.set$href$x(base, document.baseURI);
+        J.get$head$x(doc).appendChild(base);
+      }}
+  },
+  TemplateBindExtension_bind_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(ref) {
+      var t1 = this.this_0;
+      J.get$attributes$x(t1._node)._html$_element.setAttribute("ref", ref);
+      t1._refChanged$0();
+    }, "call$1", null, 2, 0, null, 202, "call"],
+    $isFunction: true
+  },
+  TemplateBindExtension_bootstrap__bootstrap: {
+    "^": "Closure:20;",
+    call$1: function(template) {
+      if (!M.nodeBindFallback(template)._decorate$1(null))
+        M.TemplateBindExtension_bootstrap(J.get$content$x(!!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template)));
+    },
+    $isFunction: true
+  },
+  closure6: {
+    "^": "Closure:13;",
+    call$1: [function(k) {
+      return H.S(k) + "[template]";
+    }, "call$1", null, 2, 0, null, 174, "call"],
+    $isFunction: true
+  },
+  closure8: {
+    "^": "Closure:75;",
+    call$2: [function(records, _) {
+      var t1;
+      for (t1 = J.get$iterator$ax(records); t1.moveNext$0();)
+        M.nodeBindFallback(J.get$target$x(t1.get$current()))._refChanged$0();
+    }, "call$2", null, 4, 0, null, 160, 14, "call"],
+    $isFunction: true
+  },
+  closure9: {
+    "^": "Closure:69;",
+    call$0: function() {
+      var empty = document.createDocumentFragment();
+      $.get$_instanceExtension().$indexSet(0, empty, new M._InstanceExtension([], null, null, null));
+      return empty;
+    },
+    $isFunction: true
+  },
+  _InstanceExtension: {
+    "^": "Object;_bindings<,_terminator<,_templateCreator<,_protoContent<"
+  },
+  _getDelegateFactory_closure: {
+    "^": "Closure:13;name_0,node_1,delegate_2",
+    call$1: function(pathString) {
+      return this.delegate_2.prepareBinding$3(pathString, this.name_0, this.node_1);
+    },
+    $isFunction: true
+  },
+  _parseAttributeBindings_closure: {
+    "^": "Closure:75;box_0,element_1,delegate_2,isTemplateNode_3",
+    call$2: function($name, value) {
+      var t1, tokens, t2, bindings;
+      for (; t1 = J.getInterceptor$asx($name), J.$eq(t1.$index($name, 0), "_");)
+        $name = t1.substring$1($name, 1);
+      if (this.isTemplateNode_3)
+        t1 = t1.$eq($name, "bind") || t1.$eq($name, "if") || t1.$eq($name, "repeat");
+      else
+        t1 = false;
+      if (t1)
+        return;
+      tokens = S.MustacheTokens_parse(value, M._getDelegateFactory($name, this.element_1, this.delegate_2));
+      if (tokens != null) {
+        t1 = this.box_0;
+        t2 = t1.bindings_0;
+        if (t2 == null) {
+          bindings = [];
+          t1.bindings_0 = bindings;
+          t1 = bindings;
+        } else
+          t1 = t2;
+        t1.push($name);
+        t1.push(tokens);
+      }
+    },
+    $isFunction: true
+  },
+  _TemplateIterator: {
+    "^": "Bindable;_templateExt,_instances,_iteratedValue,_presentValue,_closed,_ifValue,_template_binding$_value,_hasIf,_hasRepeat,_ifOneTime,_oneTime,_listSub,_initPrepareFunctions,_instanceModelFn,_instancePositionChangedFn",
+    _instanceModelFn$1: function(arg0) {
+      return this._instanceModelFn.call$1(arg0);
+    },
+    open$1: function(_, callback) {
+      return H.throwExpression(P.StateError$("binding already opened"));
+    },
+    get$value: function(_) {
+      return this._template_binding$_value;
+    },
+    _closeDependencies$0: function() {
+      var t1, t2;
+      t1 = this._ifValue;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isBindable) {
+        t2.close$0(t1);
+        this._ifValue = null;
+      }
+      t1 = this._template_binding$_value;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isBindable) {
+        t2.close$0(t1);
+        this._template_binding$_value = null;
+      }
+    },
+    _updateDependencies$2: function(directives, model) {
+      var template, t1, t2;
+      this._closeDependencies$0();
+      template = this._templateExt._node;
+      t1 = directives._if;
+      t2 = t1 != null;
+      this._hasIf = t2;
+      this._hasRepeat = directives._repeat != null;
+      if (t2) {
+        this._ifOneTime = t1.onlyOneTime;
+        t1 = M._processBinding("if", t1, template, model);
+        this._ifValue = t1;
+        if (this._ifOneTime === true) {
+          if (!(null != t1 && false !== t1)) {
+            this._updateIteratedValue$1(null);
+            return;
+          }
+        } else
+          H.interceptedTypeCast(t1, "$isBindable").open$1(0, this.get$_updateIteratedValue());
+      }
+      if (this._hasRepeat === true) {
+        t1 = directives._repeat;
+        this._oneTime = t1.onlyOneTime;
+        t1 = M._processBinding("repeat", t1, template, model);
+        this._template_binding$_value = t1;
+      } else {
+        t1 = directives._bind;
+        this._oneTime = t1.onlyOneTime;
+        t1 = M._processBinding("bind", t1, template, model);
+        this._template_binding$_value = t1;
+      }
+      if (this._oneTime !== true)
+        J.open$1$x(t1, this.get$_updateIteratedValue());
+      this._updateIteratedValue$1(null);
+    },
+    _updateIteratedValue$1: [function(_) {
+      var ifValue, value;
+      if (this._hasIf === true) {
+        ifValue = this._ifValue;
+        if (this._ifOneTime !== true) {
+          H.interceptedTypeCast(ifValue, "$isBindable");
+          ifValue = ifValue.get$value(ifValue);
+        }
+        if (!(null != ifValue && false !== ifValue)) {
+          this._valueChanged$1([]);
+          return;
+        }
+      }
+      value = this._template_binding$_value;
+      if (this._oneTime !== true) {
+        H.interceptedTypeCast(value, "$isBindable");
+        value = value.get$value(value);
+      }
+      this._valueChanged$1(this._hasRepeat !== true ? [value] : value);
+    }, "call$1", "get$_updateIteratedValue", 2, 0, 20, 14],
+    _valueChanged$1: function(value) {
+      var t1, t2;
+      t1 = J.getInterceptor(value);
+      if (!t1.$isList)
+        value = !!t1.$isIterable ? t1.toList$0(value) : [];
+      t1 = this._iteratedValue;
+      if (value === t1)
+        return;
+      this._unobserve$0();
+      this._presentValue = value;
+      if (!!J.getInterceptor(value).$isObservableList && this._hasRepeat === true && this._oneTime !== true) {
+        if (value.get$_listRecords() != null)
+          value.set$_listRecords([]);
+        this._listSub = value.get$listChanges().listen$1(this.get$_handleSplices());
+      }
+      t2 = this._presentValue;
+      t2 = t2 != null ? t2 : [];
+      this._handleSplices$1(G.calcSplices(t2, 0, J.get$length$asx(t2), t1, 0, t1.length));
+    },
+    _getLastInstanceNode$1: function(index) {
+      var t1, t2, terminator, subtemplateIterator;
+      if (J.$eq(index, -1))
+        return this._templateExt._node;
+      t1 = $.get$_instanceExtension();
+      t2 = this._instances;
+      if (index >>> 0 !== index || index >= t2.length)
+        return H.ioore(t2, index);
+      terminator = t1.$index(0, t2[index]).get$_terminator();
+      if (terminator == null)
+        return this._getLastInstanceNode$1(index - 1);
+      if (!M.isSemanticTemplate(terminator) || terminator === this._templateExt._node)
+        return terminator;
+      subtemplateIterator = M.nodeBindFallback(terminator).get$_template_binding$_iterator();
+      if (subtemplateIterator == null)
+        return terminator;
+      return subtemplateIterator._getLastInstanceNode$1(subtemplateIterator._instances.length - 1);
+    },
+    _extractInstanceAt$1: function(index) {
+      var previousInstanceLast, lastNode, instance, t1, t2, node, t3;
+      previousInstanceLast = this._getLastInstanceNode$1(J.$sub$n(index, 1));
+      lastNode = this._getLastInstanceNode$1(index);
+      J.get$parentNode$x(this._templateExt._node);
+      instance = C.JSArray_methods.removeAt$1(this._instances, index);
+      for (t1 = J.getInterceptor$x(instance), t2 = J.getInterceptor$x(previousInstanceLast); !J.$eq(lastNode, previousInstanceLast);) {
+        node = t2.get$nextNode(previousInstanceLast);
+        if (node == null ? lastNode == null : node === lastNode)
+          lastNode = previousInstanceLast;
+        t3 = node.parentNode;
+        if (t3 != null)
+          t3.removeChild(node);
+        t1.append$1(instance, node);
+      }
+      return instance;
+    },
+    _handleSplices$1: [function(splices) {
+      var delegate, model, instance, e, s, t1, template, t2, delegate0, instanceCache, t3, t4, removeDelta, splice, t5, t6, model0, instance0, addIndex, exception, previousInstanceLast, $parent;
+      if (this._closed || J.get$isEmpty$asx(splices) === true)
+        return;
+      t1 = this._templateExt;
+      template = t1._node;
+      if (J.get$parentNode$x(template) == null) {
+        this.close$0(0);
+        return;
+      }
+      t2 = this._iteratedValue;
+      Q.ObservableList_applyChangeRecords(t2, this._presentValue, splices);
+      delegate = t1._bindingDelegate;
+      if (!this._initPrepareFunctions) {
+        this._initPrepareFunctions = true;
+        delegate0 = J.get$bindingDelegate$x(!!J.getInterceptor(t1._node).$isTemplateBindExtension ? t1._node : t1);
+        if (delegate0 != null) {
+          this._instanceModelFn = delegate0._delegate.prepareInstanceModel$1(template);
+          this._instancePositionChangedFn = null;
+        }
+      }
+      instanceCache = P.HashMap_HashMap(P.identical$closure(), null, null, null, null);
+      for (t3 = J.getInterceptor$ax(splices), t4 = t3.get$iterator(splices), removeDelta = 0; t4.moveNext$0();) {
+        splice = t4.get$current();
+        for (t5 = splice.get$removed(), t5 = t5.get$iterator(t5), t6 = J.getInterceptor$x(splice); t5.moveNext$0();) {
+          model0 = t5._current;
+          instance0 = this._extractInstanceAt$1(J.$add$ns(t6.get$index(splice), removeDelta));
+          if (!J.$eq(instance0, $.get$_emptyInstance()))
+            instanceCache.$indexSet(0, model0, instance0);
+        }
+        t5 = splice.get$addedCount();
+        if (typeof t5 !== "number")
+          return H.iae(t5);
+        removeDelta -= t5;
+      }
+      for (t3 = t3.get$iterator(splices); t3.moveNext$0();) {
+        splice = t3.get$current();
+        for (t4 = J.getInterceptor$x(splice), addIndex = t4.get$index(splice); J.$lt$n(addIndex, J.$add$ns(t4.get$index(splice), splice.get$addedCount())); ++addIndex) {
+          if (addIndex >>> 0 !== addIndex || addIndex >= t2.length)
+            return H.ioore(t2, addIndex);
+          model = t2[addIndex];
+          instance = instanceCache.remove$1(0, model);
+          if (instance == null)
+            try {
+              if (this._instanceModelFn != null)
+                model = this._instanceModelFn$1(model);
+              if (model == null)
+                instance = $.get$_emptyInstance();
+              else
+                instance = t1.createInstance$2(0, model, delegate);
+            } catch (exception) {
+              t5 = H.unwrapException(exception);
+              e = t5;
+              s = new H._StackTrace(exception, null);
+              t5 = new P._Future(0, $.Zone__current, null, null, null, null, null, null);
+              t5.$builtinTypeInfo = [null];
+              new P._AsyncCompleter(t5).$builtinTypeInfo = [null];
+              t6 = e;
+              if (t6 == null)
+                H.throwExpression(P.ArgumentError$("Error must not be null"));
+              if (t5._state !== 0)
+                H.throwExpression(P.StateError$("Future already completed"));
+              t5._asyncCompleteError$2(t6, s);
+              instance = $.get$_emptyInstance();
+            }
+
+          t5 = instance;
+          previousInstanceLast = this._getLastInstanceNode$1(addIndex - 1);
+          $parent = J.get$parentNode$x(t1._node);
+          C.JSArray_methods.insert$2(this._instances, addIndex, t5);
+          $parent.insertBefore(t5, J.get$nextNode$x(previousInstanceLast));
+        }
+      }
+      for (t1 = instanceCache.get$values(instanceCache), t1 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]); t1.moveNext$0();)
+        this._closeInstanceBindings$1(t1._current);
+    }, "call$1", "get$_handleSplices", 2, 0, 203, 204],
+    _closeInstanceBindings$1: [function(instance) {
+      var t1, values, bindings;
+      t1 = $.get$_instanceExtension();
+      t1.toString;
+      values = H.Primitives_getProperty(instance, "expando$values");
+      bindings = (values == null ? null : H.Primitives_getProperty(values, t1._getKey$0())).get$_bindings();
+      t1 = new H.ListIterator(bindings, bindings.length, 0, null);
+      t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(bindings, 0)];
+      for (; t1.moveNext$0();)
+        J.close$0$x(t1._current);
+    }, "call$1", "get$_closeInstanceBindings", 2, 0, 205],
+    _unobserve$0: function() {
+      var t1 = this._listSub;
+      if (t1 == null)
+        return;
+      t1.cancel$0();
+      this._listSub = null;
+    },
+    close$0: function(_) {
+      var t1;
+      if (this._closed)
+        return;
+      this._unobserve$0();
+      t1 = this._instances;
+      H.IterableMixinWorkaround_forEach(t1, this.get$_closeInstanceBindings());
+      C.JSArray_methods.set$length(t1, 0);
+      this._closeDependencies$0();
+      this._templateExt._template_binding$_iterator = null;
+      this._closed = true;
+    }
+  },
+  _TextExtension: {
+    "^": "NodeBindExtension;_node,bindings,_templateInstance",
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1;
+      if (!J.$eq($name, "text"))
+        return M.NodeBindExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      if (oneTime) {
+        t1 = value == null ? "" : H.S(value);
+        J.set$text$x(this._node, t1);
+        return;
+      }
+      t1 = this.get$_updateText();
+      t1.call$1(J.open$1$x(value, t1));
+      return $.enableBindingsReflection ? this._updateBindings$2($name, value) : value;
+    },
+    _updateText$1: [function(value) {
+      var t1 = value == null ? "" : H.S(value);
+      J.set$text$x(this._node, t1);
+    }, "call$1", "get$_updateText", 2, 0, 13, 21]
+  },
+  _TextAreaElementExtension: {
+    "^": "_ElementExtension;_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, t2, t3;
+      if (!J.$eq($name, "value"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      J.get$attributes$x(this._node).remove$1(0, $name);
+      if (oneTime) {
+        M._InputBinding__updateProperty(this._node, value, $name);
+        return;
+      }
+      t1 = this._node;
+      t2 = new M._InputBinding(t1, null, value, $name);
+      t2._eventSub = M._InputBinding__getStreamForInputType(t1).listen$1(t2.get$_nodeChanged());
+      t3 = t2.get$_template_binding$_updateNode();
+      M._InputBinding__updateProperty(t1, J.open$1$x(t2._template_binding$_bindable, t3), $name);
+      return $.enableBindingsReflection ? this._updateBindings$2($name, t2) : t2;
+    }
+  }
+}],
+["template_binding.src.mustache_tokens", "package:template_binding/src/mustache_tokens.dart", , S, {
+  "^": "",
+  MustacheTokens: {
+    "^": "Object;_mustache_tokens$_tokens,onlyOneTime<,_combinator",
+    get$hasOnePath: function() {
+      return this._mustache_tokens$_tokens.length === 5;
+    },
+    get$isSimplePath: function() {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = t1.length;
+      if (t2 === 5) {
+        if (0 >= t2)
+          return H.ioore(t1, 0);
+        if (J.$eq(t1[0], "")) {
+          if (4 >= t1.length)
+            return H.ioore(t1, 4);
+          t1 = J.$eq(t1[4], "");
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$combinator: function() {
+      return this._combinator;
+    },
+    combinator$1: function(arg0) {
+      return this.get$combinator().call$1(arg0);
+    },
+    get$length: function(_) {
+      return C.JSInt_methods._tdivFast$1(this._mustache_tokens$_tokens.length, 4);
+    },
+    getOneTime$1: function(i) {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = i * 4 + 1;
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    getPath$1: function(i) {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = i * 4 + 2;
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    getPrepareBinding$1: function(i) {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = i * 4 + 3;
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    _singleCombinator$1: [function(value) {
+      var t1, t2, t3, t4;
+      if (value == null)
+        value = "";
+      t1 = this._mustache_tokens$_tokens;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t2 = H.S(t1[0]) + H.S(value);
+      t3 = t1.length;
+      t4 = C.JSInt_methods._tdivFast$1(t3, 4) * 4;
+      if (t4 >= t3)
+        return H.ioore(t1, t4);
+      return t2 + H.S(t1[t4]);
+    }, "call$1", "get$_singleCombinator", 2, 0, 206, 21],
+    _listCombinator$1: [function(values) {
+      var t1, newValue, len, t2, i, value, t3, str;
+      t1 = this._mustache_tokens$_tokens;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      newValue = P.StringBuffer$(t1[0]);
+      len = C.JSInt_methods._tdivFast$1(t1.length, 4);
+      for (t2 = J.getInterceptor$asx(values), i = 0; i < len;) {
+        value = t2.$index(values, i);
+        if (value != null)
+          newValue._contents += typeof value === "string" ? value : H.S(value);
+        ++i;
+        t3 = i * 4;
+        if (t3 >= t1.length)
+          return H.ioore(t1, t3);
+        str = t1[t3];
+        newValue._contents += typeof str === "string" ? str : H.S(str);
+      }
+      return newValue._contents;
+    }, "call$1", "get$_listCombinator", 2, 0, 207, 208],
+    MustacheTokens$_$2: function(_tokens, onlyOneTime) {
+      this._combinator = this._mustache_tokens$_tokens.length === 5 ? this.get$_singleCombinator() : this.get$_listCombinator();
+    },
+    static: {"^": "MustacheTokens__TOKEN_TEXT,MustacheTokens__TOKEN_ONETIME,MustacheTokens__TOKEN_PATH,MustacheTokens__TOKEN_PREPAREFN,MustacheTokens__TOKEN_SIZE,MustacheTokens__TOKEN_ENDTEXT", MustacheTokens_parse: function(s, fnFactory) {
+        var $length, t1, t2, tokens, lastIndex, onlyOneTime, startIndex, oneTimeStart, t3, oneTime, terminator, endIndex, pathString, delegateFn;
+        if (s == null || s.length === 0)
+          return;
+        $length = s.length;
+        for (t1 = fnFactory == null, t2 = J.getInterceptor$asx(s), tokens = null, lastIndex = 0, onlyOneTime = true; lastIndex < $length;) {
+          startIndex = t2.indexOf$2(s, "{{", lastIndex);
+          oneTimeStart = C.JSString_methods.indexOf$2(s, "[[", lastIndex);
+          if (oneTimeStart >= 0)
+            t3 = startIndex < 0 || oneTimeStart < startIndex;
+          else
+            t3 = false;
+          if (t3) {
+            startIndex = oneTimeStart;
+            oneTime = true;
+            terminator = "]]";
+          } else {
+            oneTime = false;
+            terminator = "}}";
+          }
+          endIndex = startIndex >= 0 ? C.JSString_methods.indexOf$2(s, terminator, startIndex + 2) : -1;
+          if (endIndex < 0) {
+            if (tokens == null)
+              return;
+            tokens.push(C.JSString_methods.substring$1(s, lastIndex));
+            break;
+          }
+          if (tokens == null)
+            tokens = [];
+          tokens.push(C.JSString_methods.substring$2(s, lastIndex, startIndex));
+          pathString = C.JSString_methods.trim$0(C.JSString_methods.substring$2(s, startIndex + 2, endIndex));
+          tokens.push(oneTime);
+          onlyOneTime = onlyOneTime && oneTime;
+          delegateFn = t1 ? null : fnFactory.call$1(pathString);
+          if (delegateFn == null)
+            tokens.push(L.PropertyPath_PropertyPath(pathString));
+          else
+            tokens.push(null);
+          tokens.push(delegateFn);
+          lastIndex = endIndex + 2;
+        }
+        if (lastIndex === $length)
+          tokens.push("");
+        t1 = new S.MustacheTokens(tokens, onlyOneTime, null);
+        t1.MustacheTokens$_$2(tokens, onlyOneTime);
+        return t1;
+      }}
+  }
+}],
+["vm_ref_element", "package:observatory/src/elements/vm_ref.dart", , X, {
+  "^": "",
+  VMRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {VMRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.VMRefElement_methods.Element$created$0(receiver);
+        C.VMRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["vm_view_element", "package:observatory/src/elements/vm_view.dart", , U, {
+  "^": "",
+  VMViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier50;_vm_view_element$__$vm,_vm_view_element$__$error,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$vm: function(receiver) {
+      return receiver._vm_view_element$__$vm;
+    },
+    set$vm: function(receiver, value) {
+      receiver._vm_view_element$__$vm = this.notifyPropertyChange$3(receiver, C.Symbol_vm, receiver._vm_view_element$__$vm, value);
+    },
+    get$error: function(receiver) {
+      return receiver._vm_view_element$__$error;
+    },
+    set$error: function(receiver, value) {
+      receiver._vm_view_element$__$error = this.notifyPropertyChange$3(receiver, C.Symbol_error, receiver._vm_view_element$__$error, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._vm_view_element$__$vm).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {VMViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.VMViewElement_methods.Element$created$0(receiver);
+        C.VMViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier50: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+]);
+Isolate.$finishClasses($$, $, null);
+$$ = null;
+
+// Runtime type support
+P.$int.$is$int = true;
+P.$int.$isComparable = true;
+P.$int.$asComparable = [P.num];
+P.$int.$isObject = true;
+P.$double.$is$double = true;
+P.$double.$isComparable = true;
+P.$double.$asComparable = [P.num];
+P.$double.$isObject = true;
+W.Node.$isNode = true;
+W.Node.$isObject = true;
+W.SpeechRecognitionResult.$isObject = true;
+W.Entry.$isObject = true;
+P.String.$isString = true;
+P.String.$isComparable = true;
+P.String.$asComparable = [P.String];
+P.String.$isObject = true;
+P.num.$isComparable = true;
+P.num.$asComparable = [P.num];
+P.num.$isObject = true;
+N.Level.$isComparable = true;
+N.Level.$asComparable = [N.Level];
+N.Level.$isObject = true;
+P.Duration.$isDuration = true;
+P.Duration.$isComparable = true;
+P.Duration.$asComparable = [P.Duration];
+P.Duration.$isObject = true;
+W.Element.$isElement = true;
+W.Element.$isNode = true;
+W.Element.$isObject = true;
+P.List.$isList = true;
+P.List.$isIterable = true;
+P.List.$isObject = true;
+P._SplayTreeNode.$isObject = true;
+P.Object.$isObject = true;
+P.Match.$isObject = true;
+K.IndexedValue.$isIndexedValue = true;
+K.IndexedValue.$isObject = true;
+U.TernaryOperator.$isExpression = true;
+U.TernaryOperator.$isObject = true;
+U.UnaryOperator.$isExpression = true;
+U.UnaryOperator.$isObject = true;
+U.BinaryOperator.$isExpression = true;
+U.BinaryOperator.$isObject = true;
+U.Identifier.$isIdentifier = true;
+U.Identifier.$isExpression = true;
+U.Identifier.$isObject = true;
+U.MapLiteralEntry.$isExpression = true;
+U.MapLiteralEntry.$isObject = true;
+U.MapLiteral.$isExpression = true;
+U.MapLiteral.$isObject = true;
+U.ListLiteral.$isExpression = true;
+U.ListLiteral.$isObject = true;
+U.Literal.$isExpression = true;
+U.Literal.$isObject = true;
+U.Invoke.$isExpression = true;
+U.Invoke.$isObject = true;
+U.Index.$isIndex = true;
+U.Index.$isExpression = true;
+U.Index.$isObject = true;
+U.Getter.$isExpression = true;
+U.Getter.$isObject = true;
+U.EmptyExpression.$isEmptyExpression = true;
+U.EmptyExpression.$isExpression = true;
+U.EmptyExpression.$isObject = true;
+P.Symbol.$isSymbol = true;
+P.Symbol.$isObject = true;
+P.Type.$isType = true;
+P.Type.$isObject = true;
+N.Logger.$isObject = true;
+T.ChangeRecord.$isChangeRecord = true;
+T.ChangeRecord.$isObject = true;
+W.TableRowElement.$isElement = true;
+W.TableRowElement.$isNode = true;
+W.TableRowElement.$isObject = true;
+G.ListChangeRecord.$isListChangeRecord = true;
+G.ListChangeRecord.$isObject = true;
+G.TableTreeRow.$isTableTreeRow = true;
+G.TableTreeRow.$isObject = true;
+F.Observable.$isObject = true;
+A.PolymerDeclaration.$isObject = true;
+W.MouseEvent.$isMouseEvent = true;
+W.MouseEvent.$isEvent = true;
+W.MouseEvent.$isObject = true;
+P.bool.$isbool = true;
+P.bool.$isObject = true;
+G.Pane.$isObject = true;
+P.Completer.$isObject = true;
+D.ServiceObject.$isServiceObject = true;
+D.ServiceObject.$isObject = true;
+D.Isolate.$isServiceObject = true;
+D.Isolate.$isObject = true;
+W.PopStateEvent.$isPopStateEvent = true;
+W.PopStateEvent.$isEvent = true;
+W.PopStateEvent.$isObject = true;
+D.CodeCallCount.$isObject = true;
+D.TagProfileSnapshot.$isObject = true;
+D.Class.$isClass = true;
+D.Class.$isServiceObject = true;
+D.Class.$isObject = true;
+D.ServiceMap.$isServiceMap = true;
+D.ServiceMap.$isServiceObject = true;
+D.ServiceMap.$isObservableMap = true;
+D.ServiceMap.$asObservableMap = [null, null];
+D.ServiceMap.$isMap = true;
+D.ServiceMap.$asMap = [null, null];
+D.ServiceMap.$isObject = true;
+D.CodeInstruction.$isObject = true;
+D.CodeTick.$isObject = true;
+D.Library.$isServiceObject = true;
+D.Library.$isObject = true;
+D.Script.$isScript = true;
+D.Script.$isServiceObject = true;
+D.Script.$isObject = true;
+D.ScriptLine.$isObject = true;
+W.HttpRequest.$isHttpRequest = true;
+W.HttpRequest.$isObject = true;
+W.ProgressEvent.$isEvent = true;
+W.ProgressEvent.$isObject = true;
+D.Code.$isCode = true;
+D.Code.$isServiceObject = true;
+D.Code.$isObject = true;
+D.CodeTrieNode.$isObject = true;
+D.PcDescriptor.$isObject = true;
+W.MessageEvent.$isEvent = true;
+W.MessageEvent.$isObject = true;
+L.PropertyPath.$isPropertyPath = true;
+L.PropertyPath.$isObject = true;
+K.Scope.$isObject = true;
+N.LogRecord.$isLogRecord = true;
+N.LogRecord.$isObject = true;
+H.RawReceivePortImpl.$isObject = true;
+H._IsolateEvent.$isObject = true;
+H._IsolateContext.$isObject = true;
+W.ShadowRoot.$isDocumentFragment = true;
+W.ShadowRoot.$isNode = true;
+W.ShadowRoot.$isObject = true;
+W.Event.$isEvent = true;
+W.Event.$isObject = true;
+P.Stream.$isStream = true;
+P.Stream.$isObject = true;
+P.StreamSubscription.$isStreamSubscription = true;
+P.StreamSubscription.$isObject = true;
+Y.Token.$isObject = true;
+U.Expression.$isExpression = true;
+U.Expression.$isObject = true;
+G.SortedTableRow.$isObject = true;
+P.ZoneDelegate.$isZoneDelegate = true;
+P.ZoneDelegate.$isObject = true;
+P.Zone.$isZone = true;
+P.Zone.$isObject = true;
+P.StackTrace.$isStackTrace = true;
+P.StackTrace.$isObject = true;
+V.ObservableMap.$isObservableMap = true;
+V.ObservableMap.$isMap = true;
+V.ObservableMap.$isObject = true;
+P._BufferingStreamSubscription.$is_BufferingStreamSubscription = true;
+P._BufferingStreamSubscription.$is_EventSink = true;
+P._BufferingStreamSubscription.$isStreamSubscription = true;
+P._BufferingStreamSubscription.$isObject = true;
+P._BroadcastSubscription.$is_BroadcastSubscription = true;
+P._BroadcastSubscription.$is_BufferingStreamSubscription = true;
+P._BroadcastSubscription.$is_EventSink = true;
+P._BroadcastSubscription.$isStreamSubscription = true;
+P._BroadcastSubscription.$isObject = true;
+P.Comparable.$isComparable = true;
+P.Comparable.$isObject = true;
+P.ZoneSpecification.$isZoneSpecification = true;
+P.ZoneSpecification.$isObject = true;
+P.Map.$isMap = true;
+P.Map.$isObject = true;
+P.Timer.$isTimer = true;
+P.Timer.$isObject = true;
+P.Iterable.$isIterable = true;
+P.Iterable.$isObject = true;
+P.Future.$isFuture = true;
+P.Future.$isObject = true;
+P.Function.$isFunction = true;
+P.Function.$isObject = true;
+P._EventSink.$is_EventSink = true;
+P._EventSink.$isObject = true;
+P._DelayedEvent.$is_DelayedEvent = true;
+P._DelayedEvent.$isObject = true;
+P.DateTime.$isDateTime = true;
+P.DateTime.$isComparable = true;
+P.DateTime.$asComparable = [null];
+P.DateTime.$isObject = true;
+A.Bindable.$isBindable = true;
+A.Bindable.$isObject = true;
+O.PixelReference.$isPixelReference = true;
+O.PixelReference.$isObject = true;
+D.ServiceError.$isServiceError = true;
+D.ServiceError.$isServiceObject = true;
+D.ServiceError.$isObject = true;
+D.ServiceException.$isServiceException = true;
+D.ServiceException.$isServiceObject = true;
+D.ServiceException.$isObject = true;
+A.Declaration.$isDeclaration = true;
+A.Declaration.$isObject = true;
+A.QueryOptions.$isQueryOptions = true;
+A.QueryOptions.$isObject = true;
+L._Observer.$is_Observer = true;
+L._Observer.$isBindable = true;
+L._Observer.$isObject = true;
+W.DocumentFragment.$isDocumentFragment = true;
+W.DocumentFragment.$isNode = true;
+W.DocumentFragment.$isObject = true;
+// getInterceptor methods
+J.getInterceptor = function(receiver) {
+  if (typeof receiver == "number") {
+    if (Math.floor(receiver) == receiver)
+      return J.JSInt.prototype;
+    return J.JSDouble.prototype;
+  }
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return J.JSNull.prototype;
+  if (typeof receiver == "boolean")
+    return J.JSBool.prototype;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.getInterceptor$asx = function(receiver) {
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.getInterceptor$ax = function(receiver) {
+  if (receiver == null)
+    return receiver;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.getInterceptor$n = function(receiver) {
+  if (typeof receiver == "number")
+    return J.JSNumber.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$ns = function(receiver) {
+  if (typeof receiver == "number")
+    return J.JSNumber.prototype;
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$s = function(receiver) {
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$x = function(receiver) {
+  if (receiver == null)
+    return receiver;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.$add$ns = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver + a0;
+  return J.getInterceptor$ns(receiver).$add(receiver, a0);
+};
+J.$div$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver / a0;
+  return J.getInterceptor$n(receiver).$div(receiver, a0);
+};
+J.$eq = function(receiver, a0) {
+  if (receiver == null)
+    return a0 == null;
+  if (typeof receiver != "object")
+    return a0 != null && receiver === a0;
+  return J.getInterceptor(receiver).$eq(receiver, a0);
+};
+J.$ge$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver >= a0;
+  return J.getInterceptor$n(receiver).$ge(receiver, a0);
+};
+J.$gt$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver > a0;
+  return J.getInterceptor$n(receiver).$gt(receiver, a0);
+};
+J.$index$asx = function(receiver, a0) {
+  if (receiver.constructor == Array || typeof receiver == "string" || H.isJsIndexable(receiver, receiver[init.dispatchPropertyName]))
+    if (a0 >>> 0 === a0 && a0 < receiver.length)
+      return receiver[a0];
+  return J.getInterceptor$asx(receiver).$index(receiver, a0);
+};
+J.$indexSet$ax = function(receiver, a0, a1) {
+  if ((receiver.constructor == Array || H.isJsIndexable(receiver, receiver[init.dispatchPropertyName])) && !receiver.immutable$list && a0 >>> 0 === a0 && a0 < receiver.length)
+    return receiver[a0] = a1;
+  return J.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
+};
+J.$le$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver <= a0;
+  return J.getInterceptor$n(receiver).$le(receiver, a0);
+};
+J.$lt$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver < a0;
+  return J.getInterceptor$n(receiver).$lt(receiver, a0);
+};
+J.$mod$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).$mod(receiver, a0);
+};
+J.$mul$ns = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver * a0;
+  return J.getInterceptor$ns(receiver).$mul(receiver, a0);
+};
+J.$negate$n = function(receiver) {
+  if (typeof receiver == "number")
+    return -receiver;
+  return J.getInterceptor$n(receiver).$negate(receiver);
+};
+J.$shl$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).$shl(receiver, a0);
+};
+J.$sub$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver - a0;
+  return J.getInterceptor$n(receiver).$sub(receiver, a0);
+};
+J.$tdiv$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).$tdiv(receiver, a0);
+};
+J.$xor$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return (receiver ^ a0) >>> 0;
+  return J.getInterceptor$n(receiver).$xor(receiver, a0);
+};
+J.__isolate_helper$_add$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).__isolate_helper$_add$1(receiver, a0);
+};
+J._async$_add$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver)._async$_add$1(receiver, a0);
+};
+J._clearChildren$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver)._clearChildren$0(receiver);
+};
+J._initCustomEvent$4$x = function(receiver, a0, a1, a2, a3) {
+  return J.getInterceptor$x(receiver)._initCustomEvent$4(receiver, a0, a1, a2, a3);
+};
+J._initMouseEvent$15$x = function(receiver, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) {
+  return J.getInterceptor$x(receiver)._initMouseEvent$15(receiver, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
+};
+J._renderPages$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver)._renderPages$1(receiver, a0);
+};
+J._replaceChild$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver)._replaceChild$2(receiver, a0, a1);
+};
+J._update$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver)._update$1(receiver, a0);
+};
+J._updateFragmentationData$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver)._updateFragmentationData$0(receiver);
+};
+J._updateLines$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver)._updateLines$0(receiver);
+};
+J.abs$0$n = function(receiver) {
+  return J.getInterceptor$n(receiver).abs$0(receiver);
+};
+J.accept$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).accept$1(receiver, a0);
+};
+J.add$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).add$1(receiver, a0);
+};
+J.addAll$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).addAll$1(receiver, a0);
+};
+J.addEventListener$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).addEventListener$2(receiver, a0, a1);
+};
+J.addEventListener$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).addEventListener$3(receiver, a0, a1, a2);
+};
+J.addRow$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).addRow$1(receiver, a0);
+};
+J.any$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).any$1(receiver, a0);
+};
+J.append$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).append$1(receiver, a0);
+};
+J.async$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).async$1(receiver, a0);
+};
+J.attached$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).attached$0(receiver);
+};
+J.attributeChanged$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).attributeChanged$3(receiver, a0, a1, a2);
+};
+J.bind$3$oneTime$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).bind$3$oneTime(receiver, a0, a1, a2);
+};
+J.callback$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).callback$0(receiver);
+};
+J.clear$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).clear$0(receiver);
+};
+J.close$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).close$0(receiver);
+};
+J.codeUnitAt$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).codeUnitAt$1(receiver, a0);
+};
+J.compareTo$1$ns = function(receiver, a0) {
+  return J.getInterceptor$ns(receiver).compareTo$1(receiver, a0);
+};
+J.complete$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).complete$1(receiver, a0);
+};
+J.contains$1$asx = function(receiver, a0) {
+  return J.getInterceptor$asx(receiver).contains$1(receiver, a0);
+};
+J.contains$2$asx = function(receiver, a0, a1) {
+  return J.getInterceptor$asx(receiver).contains$2(receiver, a0, a1);
+};
+J.createDocumentFragment$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).createDocumentFragment$0(receiver);
+};
+J.createInstance$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).createInstance$2(receiver, a0, a1);
+};
+J.detached$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).detached$0(receiver);
+};
+J.dispatchMethod$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).dispatchMethod$3(receiver, a0, a1, a2);
+};
+J.elementAt$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).elementAt$1(receiver, a0);
+};
+J.endsWith$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).endsWith$1(receiver, a0);
+};
+J.eval$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).eval$1(receiver, a0);
+};
+J.forEach$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).forEach$1(receiver, a0);
+};
+J.get$$function$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$$function(receiver);
+};
+J.get$$goto$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$$goto(receiver);
+};
+J.get$__isolate_helper$_id$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$__isolate_helper$_id(receiver);
+};
+J.get$_children$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_children(receiver);
+};
+J.get$_element$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_element(receiver);
+};
+J.get$_name$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_name(receiver);
+};
+J.get$_observe$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_observe(receiver);
+};
+J.get$_updateFile$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_updateFile(receiver);
+};
+J.get$_updateHttpServer$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_updateHttpServer(receiver);
+};
+J.get$_updateTagProfile$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_updateTagProfile(receiver);
+};
+J.get$_values$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_values(receiver);
+};
+J.get$active$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$active(receiver);
+};
+J.get$anchor$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$anchor(receiver);
+};
+J.get$attributes$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$attributes(receiver);
+};
+J.get$bindingDelegate$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$bindingDelegate(receiver);
+};
+J.get$bindings$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$bindings(receiver);
+};
+J.get$busy$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$busy(receiver);
+};
+J.get$buttonClick$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$buttonClick(receiver);
+};
+J.get$callback$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$callback(receiver);
+};
+J.get$change$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$change(receiver);
+};
+J.get$changeSort$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$changeSort(receiver);
+};
+J.get$checked$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$checked(receiver);
+};
+J.get$checkedText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$checkedText(receiver);
+};
+J.get$children$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$children(receiver);
+};
+J.get$className$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$className(receiver);
+};
+J.get$classTable$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$classTable(receiver);
+};
+J.get$classes$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$classes(receiver);
+};
+J.get$cls$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$cls(receiver);
+};
+J.get$code$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$code(receiver);
+};
+J.get$coloring$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$coloring(receiver);
+};
+J.get$connection$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$connection(receiver);
+};
+J.get$content$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$content(receiver);
+};
+J.get$context2D$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$context2D(receiver);
+};
+J.get$counters$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$counters(receiver);
+};
+J.get$countersChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$countersChanged(receiver);
+};
+J.get$data$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$data(receiver);
+};
+J.get$devtools$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$devtools(receiver);
+};
+J.get$displayCutoff$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$displayCutoff(receiver);
+};
+J.get$doAction$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$doAction(receiver);
+};
+J.get$element$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$element(receiver);
+};
+J.get$endLine$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$endLine(receiver);
+};
+J.get$endPos$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$endPos(receiver);
+};
+J.get$endPosChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$endPosChanged(receiver);
+};
+J.get$error$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$error(receiver);
+};
+J.get$eval$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$eval(receiver);
+};
+J.get$evalNow$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$evalNow(receiver);
+};
+J.get$exception$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$exception(receiver);
+};
+J.get$expand$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$expand(receiver);
+};
+J.get$expandChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expandChanged(receiver);
+};
+J.get$expanded$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expanded(receiver);
+};
+J.get$expander$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expander(receiver);
+};
+J.get$expr$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expr(receiver);
+};
+J.get$field$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$field(receiver);
+};
+J.get$file$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$file(receiver);
+};
+J.get$flag$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$flag(receiver);
+};
+J.get$flagList$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$flagList(receiver);
+};
+J.get$formatSize$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formatSize(receiver);
+};
+J.get$formatTime$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formatTime(receiver);
+};
+J.get$formattedAverage$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formattedAverage(receiver);
+};
+J.get$formattedCollections$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formattedCollections(receiver);
+};
+J.get$formattedTotalCollectionTime$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formattedTotalCollectionTime(receiver);
+};
+J.get$fragmentation$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$fragmentation(receiver);
+};
+J.get$fragmentationChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$fragmentationChanged(receiver);
+};
+J.get$frame$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$frame(receiver);
+};
+J.get$functionChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$functionChanged(receiver);
+};
+J.get$gotoLink$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$gotoLink(receiver);
+};
+J.get$hasClass$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hasClass(receiver);
+};
+J.get$hasParent$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hasParent(receiver);
+};
+J.get$hashCode$ = function(receiver) {
+  return J.getInterceptor(receiver).get$hashCode(receiver);
+};
+J.get$hashLinkWorkaround$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hashLinkWorkaround(receiver);
+};
+J.get$head$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$head(receiver);
+};
+J.get$height$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$height(receiver);
+};
+J.get$hideTagsChecked$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hideTagsChecked(receiver);
+};
+J.get$hoverText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hoverText(receiver);
+};
+J.get$httpServer$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$httpServer(receiver);
+};
+J.get$id$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$id(receiver);
+};
+J.get$index$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$index(receiver);
+};
+J.get$instance$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$instance(receiver);
+};
+J.get$instances$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$instances(receiver);
+};
+J.get$internal$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$internal(receiver);
+};
+J.get$io$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$io(receiver);
+};
+J.get$isBool$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isBool(receiver);
+};
+J.get$isDart$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isDart(receiver);
+};
+J.get$isDouble$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isDouble(receiver);
+};
+J.get$isEmpty$asx = function(receiver) {
+  return J.getInterceptor$asx(receiver).get$isEmpty(receiver);
+};
+J.get$isError$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isError(receiver);
+};
+J.get$isFinal$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isFinal(receiver);
+};
+J.get$isInstance$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isInstance(receiver);
+};
+J.get$isInt$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isInt(receiver);
+};
+J.get$isList$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isList(receiver);
+};
+J.get$isNotEmpty$asx = function(receiver) {
+  return J.getInterceptor$asx(receiver).get$isNotEmpty(receiver);
+};
+J.get$isNull$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isNull(receiver);
+};
+J.get$isString$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isString(receiver);
+};
+J.get$isType$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isType(receiver);
+};
+J.get$isUnexpected$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isUnexpected(receiver);
+};
+J.get$isolate$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isolate(receiver);
+};
+J.get$isolateChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isolateChanged(receiver);
+};
+J.get$iterator$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$iterator(receiver);
+};
+J.get$key$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$key(receiver);
+};
+J.get$kind$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$kind(receiver);
+};
+J.get$label$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$label(receiver);
+};
+J.get$last$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$last(receiver);
+};
+J.get$lastAccumulatorReset$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lastAccumulatorReset(receiver);
+};
+J.get$lastServiceGC$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lastServiceGC(receiver);
+};
+J.get$length$asx = function(receiver) {
+  return J.getInterceptor$asx(receiver).get$length(receiver);
+};
+J.get$library$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$library(receiver);
+};
+J.get$lineMode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lineMode(receiver);
+};
+J.get$lineNumber$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lineNumber(receiver);
+};
+J.get$lineNumbers$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lineNumbers(receiver);
+};
+J.get$lines$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lines(receiver);
+};
+J.get$link$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$link(receiver);
+};
+J.get$list$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$list(receiver);
+};
+J.get$loaded$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$loaded(receiver);
+};
+J.get$map$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$map(receiver);
+};
+J.get$mapAsString$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mapAsString(receiver);
+};
+J.get$mapChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mapChanged(receiver);
+};
+J.get$message$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$message(receiver);
+};
+J.get$model$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$model(receiver);
+};
+J.get$mouseOut$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mouseOut(receiver);
+};
+J.get$mouseOver$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mouseOver(receiver);
+};
+J.get$msg$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$msg(receiver);
+};
+J.get$name$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$name(receiver);
+};
+J.get$nameIsEmpty$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$nameIsEmpty(receiver);
+};
+J.get$nextElementSibling$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$nextElementSibling(receiver);
+};
+J.get$nextNode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$nextNode(receiver);
+};
+J.get$object$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$object(receiver);
+};
+J.get$objectChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$objectChanged(receiver);
+};
+J.get$offset$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$offset(receiver);
+};
+J.get$on$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$on(receiver);
+};
+J.get$onMouseDown$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$onMouseDown(receiver);
+};
+J.get$onMouseMove$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$onMouseMove(receiver);
+};
+J.get$ownerDocument$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$ownerDocument(receiver);
+};
+J.get$pad$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pad(receiver);
+};
+J.get$padding$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$padding(receiver);
+};
+J.get$parent$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$parent(receiver);
+};
+J.get$parentNode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$parentNode(receiver);
+};
+J.get$path$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$path(receiver);
+};
+J.get$pause$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pause(receiver);
+};
+J.get$pauseEvent$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pauseEvent(receiver);
+};
+J.get$pos$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pos(receiver);
+};
+J.get$posChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$posChanged(receiver);
+};
+J.get$process$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$process(receiver);
+};
+J.get$profile$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$profile(receiver);
+};
+J.get$profileChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$profileChanged(receiver);
+};
+J.get$protocol$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$protocol(receiver);
+};
+J.get$qualified$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$qualified(receiver);
+};
+J.get$qualifiedName$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$qualifiedName(receiver);
+};
+J.get$reachable$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$reachable(receiver);
+};
+J.get$ref$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$ref(receiver);
+};
+J.get$refChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refChanged(receiver);
+};
+J.get$refresh$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refresh(receiver);
+};
+J.get$refreshCoverage$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refreshCoverage(receiver);
+};
+J.get$refreshGC$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refreshGC(receiver);
+};
+J.get$refreshTime$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refreshTime(receiver);
+};
+J.get$resetAccumulator$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$resetAccumulator(receiver);
+};
+J.get$response$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$response(receiver);
+};
+J.get$responseText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$responseText(receiver);
+};
+J.get$result$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$result(receiver);
+};
+J.get$results$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$results(receiver);
+};
+J.get$resume$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$resume(receiver);
+};
+J.get$retainedBytes$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$retainedBytes(receiver);
+};
+J.get$retainedSize$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$retainedSize(receiver);
+};
+J.get$retainingPath$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$retainingPath(receiver);
+};
+J.get$rowIndex$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$rowIndex(receiver);
+};
+J.get$rows$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$rows(receiver);
+};
+J.get$runtimeType$ = function(receiver) {
+  return J.getInterceptor(receiver).get$runtimeType(receiver);
+};
+J.get$sampleCount$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$sampleCount(receiver);
+};
+J.get$sampleDepth$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$sampleDepth(receiver);
+};
+J.get$sampleRate$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$sampleRate(receiver);
+};
+J.get$script$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$script(receiver);
+};
+J.get$scriptChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$scriptChanged(receiver);
+};
+J.get$selectExpr$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$selectExpr(receiver);
+};
+J.get$selectedIndex$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$selectedIndex(receiver);
+};
+J.get$small$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$small(receiver);
+};
+J.get$socket$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$socket(receiver);
+};
+J.get$startLine$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$startLine(receiver);
+};
+J.get$status$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$status(receiver);
+};
+J.get$styleForHits$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$styleForHits(receiver);
+};
+J.get$syntax$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$syntax(receiver);
+};
+J.get$tagSelector$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$tagSelector(receiver);
+};
+J.get$tagSelectorChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$tagSelectorChanged(receiver);
+};
+J.get$target$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$target(receiver);
+};
+J.get$templateInstance$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$templateInstance(receiver);
+};
+J.get$text$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$text(receiver);
+};
+J.get$timeSpan$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$timeSpan(receiver);
+};
+J.get$toggleExpand$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$toggleExpand(receiver);
+};
+J.get$toggleExpanded$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$toggleExpanded(receiver);
+};
+J.get$topLeft$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$topLeft(receiver);
+};
+J.get$trace$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$trace(receiver);
+};
+J.get$tree$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$tree(receiver);
+};
+J.get$uncheckedText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$uncheckedText(receiver);
+};
+J.get$updateLineMode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$updateLineMode(receiver);
+};
+J.get$url$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$url(receiver);
+};
+J.get$value$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$value(receiver);
+};
+J.get$values$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$values(receiver);
+};
+J.get$version$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$version(receiver);
+};
+J.get$vm$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$vm(receiver);
+};
+J.get$webSocket$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$webSocket(receiver);
+};
+J.get$width$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$width(receiver);
+};
+J.getAttribute$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).getAttribute$1(receiver, a0);
+};
+J.getBoundingClientRect$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).getBoundingClientRect$0(receiver);
+};
+J.importNode$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).importNode$2(receiver, a0, a1);
+};
+J.indexOf$1$asx = function(receiver, a0) {
+  return J.getInterceptor$asx(receiver).indexOf$1(receiver, a0);
+};
+J.indexOf$2$asx = function(receiver, a0, a1) {
+  return J.getInterceptor$asx(receiver).indexOf$2(receiver, a0, a1);
+};
+J.insert$2$ax = function(receiver, a0, a1) {
+  return J.getInterceptor$ax(receiver).insert$2(receiver, a0, a1);
+};
+J.insertAllBefore$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).insertAllBefore$2(receiver, a0, a1);
+};
+J.join$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).join$1(receiver, a0);
+};
+J.lastIndexOf$2$asx = function(receiver, a0, a1) {
+  return J.getInterceptor$asx(receiver).lastIndexOf$2(receiver, a0, a1);
+};
+J.load$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).load$0(receiver);
+};
+J.map$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).map$1(receiver, a0);
+};
+J.matches$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).matches$1(receiver, a0);
+};
+J.matchesWithAncestors$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).matchesWithAncestors$1(receiver, a0);
+};
+J.noSuchMethod$1 = function(receiver, a0) {
+  return J.getInterceptor(receiver).noSuchMethod$1(receiver, a0);
+};
+J.notifyPropertyChange$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).notifyPropertyChange$3(receiver, a0, a1, a2);
+};
+J.observe$3$attributeFilter$attributes$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).observe$3$attributeFilter$attributes(receiver, a0, a1, a2);
+};
+J.open$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).open$1(receiver, a0);
+};
+J.postMessage$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).postMessage$2(receiver, a0, a1);
+};
+J.preventDefault$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).preventDefault$0(receiver);
+};
+J.print$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).print$1(receiver, a0);
+};
+J.process$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).process$0(receiver);
+};
+J.putImageData$7$x = function(receiver, a0, a1, a2, a3, a4, a5, a6) {
+  return J.getInterceptor$x(receiver).putImageData$7(receiver, a0, a1, a2, a3, a4, a5, a6);
+};
+J.querySelector$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).querySelector$1(receiver, a0);
+};
+J.querySelectorAll$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).querySelectorAll$1(receiver, a0);
+};
+J.refreshCoverage$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).refreshCoverage$0(receiver);
+};
+J.reload$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).reload$0(receiver);
+};
+J.remove$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).remove$0(receiver);
+};
+J.remove$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).remove$1(receiver, a0);
+};
+J.removeEventListener$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).removeEventListener$3(receiver, a0, a1, a2);
+};
+J.removeRange$2$ax = function(receiver, a0, a1) {
+  return J.getInterceptor$ax(receiver).removeRange$2(receiver, a0, a1);
+};
+J.replaceAll$2$s = function(receiver, a0, a1) {
+  return J.getInterceptor$s(receiver).replaceAll$2(receiver, a0, a1);
+};
+J.replaceWith$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).replaceWith$1(receiver, a0);
+};
+J.round$0$n = function(receiver) {
+  return J.getInterceptor$n(receiver).round$0(receiver);
+};
+J.send$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).send$1(receiver, a0);
+};
+J.set$$function$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$$function(receiver, value);
+};
+J.set$_dartDetail$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$_dartDetail(receiver, value);
+};
+J.set$_selector$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$_selector(receiver, value);
+};
+J.set$active$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$active(receiver, value);
+};
+J.set$anchor$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$anchor(receiver, value);
+};
+J.set$bindingDelegate$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$bindingDelegate(receiver, value);
+};
+J.set$bindings$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$bindings(receiver, value);
+};
+J.set$busy$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$busy(receiver, value);
+};
+J.set$callback$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$callback(receiver, value);
+};
+J.set$checked$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$checked(receiver, value);
+};
+J.set$checkedText$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$checkedText(receiver, value);
+};
+J.set$className$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$className(receiver, value);
+};
+J.set$classTable$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$classTable(receiver, value);
+};
+J.set$cls$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$cls(receiver, value);
+};
+J.set$code$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$code(receiver, value);
+};
+J.set$connection$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$connection(receiver, value);
+};
+J.set$counters$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$counters(receiver, value);
+};
+J.set$devtools$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$devtools(receiver, value);
+};
+J.set$displayCutoff$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$displayCutoff(receiver, value);
+};
+J.set$endLine$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$endLine(receiver, value);
+};
+J.set$endPos$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$endPos(receiver, value);
+};
+J.set$error$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$error(receiver, value);
+};
+J.set$eval$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$eval(receiver, value);
+};
+J.set$exception$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$exception(receiver, value);
+};
+J.set$expand$ax = function(receiver, value) {
+  return J.getInterceptor$ax(receiver).set$expand(receiver, value);
+};
+J.set$expanded$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$expanded(receiver, value);
+};
+J.set$expr$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$expr(receiver, value);
+};
+J.set$field$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$field(receiver, value);
+};
+J.set$file$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$file(receiver, value);
+};
+J.set$flag$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$flag(receiver, value);
+};
+J.set$flagList$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$flagList(receiver, value);
+};
+J.set$fragmentation$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$fragmentation(receiver, value);
+};
+J.set$frame$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$frame(receiver, value);
+};
+J.set$hasClass$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hasClass(receiver, value);
+};
+J.set$hasParent$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hasParent(receiver, value);
+};
+J.set$hashLinkWorkaround$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hashLinkWorkaround(receiver, value);
+};
+J.set$height$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$height(receiver, value);
+};
+J.set$hideTagsChecked$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hideTagsChecked(receiver, value);
+};
+J.set$href$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$href(receiver, value);
+};
+J.set$httpServer$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$httpServer(receiver, value);
+};
+J.set$instance$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$instance(receiver, value);
+};
+J.set$instances$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$instances(receiver, value);
+};
+J.set$internal$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$internal(receiver, value);
+};
+J.set$io$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$io(receiver, value);
+};
+J.set$isDart$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$isDart(receiver, value);
+};
+J.set$isolate$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$isolate(receiver, value);
+};
+J.set$kind$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$kind(receiver, value);
+};
+J.set$label$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$label(receiver, value);
+};
+J.set$last$ax = function(receiver, value) {
+  return J.getInterceptor$ax(receiver).set$last(receiver, value);
+};
+J.set$lastAccumulatorReset$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lastAccumulatorReset(receiver, value);
+};
+J.set$lastServiceGC$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lastServiceGC(receiver, value);
+};
+J.set$length$asx = function(receiver, value) {
+  return J.getInterceptor$asx(receiver).set$length(receiver, value);
+};
+J.set$library$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$library(receiver, value);
+};
+J.set$lineMode$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lineMode(receiver, value);
+};
+J.set$lines$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lines(receiver, value);
+};
+J.set$link$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$link(receiver, value);
+};
+J.set$list$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$list(receiver, value);
+};
+J.set$map$ax = function(receiver, value) {
+  return J.getInterceptor$ax(receiver).set$map(receiver, value);
+};
+J.set$mapAsString$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$mapAsString(receiver, value);
+};
+J.set$msg$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$msg(receiver, value);
+};
+J.set$name$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$name(receiver, value);
+};
+J.set$object$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$object(receiver, value);
+};
+J.set$pad$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$pad(receiver, value);
+};
+J.set$path$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$path(receiver, value);
+};
+J.set$pause$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$pause(receiver, value);
+};
+J.set$pos$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$pos(receiver, value);
+};
+J.set$process$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$process(receiver, value);
+};
+J.set$profile$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$profile(receiver, value);
+};
+J.set$qualified$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$qualified(receiver, value);
+};
+J.set$qualifiedName$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$qualifiedName(receiver, value);
+};
+J.set$reachable$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$reachable(receiver, value);
+};
+J.set$ref$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$ref(receiver, value);
+};
+J.set$refresh$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refresh(receiver, value);
+};
+J.set$refreshCoverage$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refreshCoverage(receiver, value);
+};
+J.set$refreshGC$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refreshGC(receiver, value);
+};
+J.set$refreshTime$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refreshTime(receiver, value);
+};
+J.set$resetAccumulator$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$resetAccumulator(receiver, value);
+};
+J.set$result$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$result(receiver, value);
+};
+J.set$results$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$results(receiver, value);
+};
+J.set$resume$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$resume(receiver, value);
+};
+J.set$retainedBytes$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$retainedBytes(receiver, value);
+};
+J.set$retainedSize$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$retainedSize(receiver, value);
+};
+J.set$retainingPath$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$retainingPath(receiver, value);
+};
+J.set$sampleCount$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$sampleCount(receiver, value);
+};
+J.set$sampleDepth$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$sampleDepth(receiver, value);
+};
+J.set$sampleRate$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$sampleRate(receiver, value);
+};
+J.set$script$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$script(receiver, value);
+};
+J.set$selectedIndex$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$selectedIndex(receiver, value);
+};
+J.set$small$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$small(receiver, value);
+};
+J.set$socket$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$socket(receiver, value);
+};
+J.set$startLine$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$startLine(receiver, value);
+};
+J.set$status$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$status(receiver, value);
+};
+J.set$tagSelector$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$tagSelector(receiver, value);
+};
+J.set$text$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$text(receiver, value);
+};
+J.set$timeSpan$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$timeSpan(receiver, value);
+};
+J.set$trace$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$trace(receiver, value);
+};
+J.set$type$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$type(receiver, value);
+};
+J.set$uncheckedText$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$uncheckedText(receiver, value);
+};
+J.set$value$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$value(receiver, value);
+};
+J.set$vm$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$vm(receiver, value);
+};
+J.set$webSocket$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$webSocket(receiver, value);
+};
+J.set$width$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$width(receiver, value);
+};
+J.setRange$4$ax = function(receiver, a0, a1, a2, a3) {
+  return J.getInterceptor$ax(receiver).setRange$4(receiver, a0, a1, a2, a3);
+};
+J.skip$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).skip$1(receiver, a0);
+};
+J.sort$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).sort$0(receiver);
+};
+J.sort$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).sort$1(receiver, a0);
+};
+J.split$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).split$1(receiver, a0);
+};
+J.startsWith$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).startsWith$1(receiver, a0);
+};
+J.substring$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).substring$1(receiver, a0);
+};
+J.substring$2$s = function(receiver, a0, a1) {
+  return J.getInterceptor$s(receiver).substring$2(receiver, a0, a1);
+};
+J.toInt$0$n = function(receiver) {
+  return J.getInterceptor$n(receiver).toInt$0(receiver);
+};
+J.toList$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).toList$0(receiver);
+};
+J.toRadixString$1$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).toRadixString$1(receiver, a0);
+};
+J.toString$0 = function(receiver) {
+  return J.getInterceptor(receiver).toString$0(receiver);
+};
+J.toStringAsFixed$1$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).toStringAsFixed$1(receiver, a0);
+};
+J.trim$0$s = function(receiver) {
+  return J.getInterceptor$s(receiver).trim$0(receiver);
+};
+J.where$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).where$1(receiver, a0);
+};
+C.ActionLinkElement_methods = X.ActionLinkElement.prototype;
+C.AutoBindingElement_methods = Y.AutoBindingElement.prototype;
+C.BreakpointListElement_methods = B.BreakpointListElement.prototype;
+C.ClassNavMenuElement_methods = A.ClassNavMenuElement.prototype;
+C.ClassRefElement_methods = Q.ClassRefElement.prototype;
+C.ClassTreeElement_methods = O.ClassTreeElement.prototype;
+C.ClassViewElement_methods = Z.ClassViewElement.prototype;
+C.CodeRefElement_methods = O.CodeRefElement.prototype;
+C.CodeViewElement_methods = F.CodeViewElement.prototype;
+C.CurlyBlockElement_methods = R.CurlyBlockElement.prototype;
+C.ErrorViewElement_methods = F.ErrorViewElement.prototype;
+C.EvalBoxElement_methods = L.EvalBoxElement.prototype;
+C.EvalLinkElement_methods = R.EvalLinkElement.prototype;
+C.FieldRefElement_methods = D.FieldRefElement.prototype;
+C.FieldViewElement_methods = A.FieldViewElement.prototype;
+C.FlagItemElement_methods = X.FlagItemElement.prototype;
+C.FlagListElement_methods = X.FlagListElement.prototype;
+C.FunctionRefElement_methods = U.FunctionRefElement.prototype;
+C.FunctionViewElement_methods = N.FunctionViewElement.prototype;
+C.HeapMapElement_methods = O.HeapMapElement.prototype;
+C.HeapProfileElement_methods = K.HeapProfileElement.prototype;
+C.HttpRequest_methods = W.HttpRequest.prototype;
+C.IOHttpServerConnectionRefElement_methods = E.IOHttpServerConnectionRefElement.prototype;
+C.IOHttpServerConnectionViewElement_methods = E.IOHttpServerConnectionViewElement.prototype;
+C.IOHttpServerListViewElement_methods = E.IOHttpServerListViewElement.prototype;
+C.IOHttpServerRefElement_methods = E.IOHttpServerRefElement.prototype;
+C.IOHttpServerViewElement_methods = E.IOHttpServerViewElement.prototype;
+C.IOProcessListViewElement_methods = E.IOProcessListViewElement.prototype;
+C.IOProcessRefElement_methods = E.IOProcessRefElement.prototype;
+C.IOProcessViewElement_methods = E.IOProcessViewElement.prototype;
+C.IORandomAccessFileListViewElement_methods = E.IORandomAccessFileListViewElement.prototype;
+C.IORandomAccessFileRefElement_methods = E.IORandomAccessFileRefElement.prototype;
+C.IORandomAccessFileViewElement_methods = E.IORandomAccessFileViewElement.prototype;
+C.IORefElement_methods = E.IORefElement.prototype;
+C.IOSocketListViewElement_methods = E.IOSocketListViewElement.prototype;
+C.IOSocketRefElement_methods = E.IOSocketRefElement.prototype;
+C.IOSocketViewElement_methods = E.IOSocketViewElement.prototype;
+C.IOViewElement_methods = E.IOViewElement.prototype;
+C.IOWebSocketListViewElement_methods = E.IOWebSocketListViewElement.prototype;
+C.IOWebSocketRefElement_methods = E.IOWebSocketRefElement.prototype;
+C.IOWebSocketViewElement_methods = E.IOWebSocketViewElement.prototype;
+C.InstanceRefElement_methods = B.InstanceRefElement.prototype;
+C.InstanceViewElement_methods = Z.InstanceViewElement.prototype;
+C.IsolateCounterChartElement_methods = D.IsolateCounterChartElement.prototype;
+C.IsolateLocationElement_methods = D.IsolateLocationElement.prototype;
+C.IsolateNavMenuElement_methods = A.IsolateNavMenuElement.prototype;
+C.IsolateProfileElement_methods = X.IsolateProfileElement.prototype;
+C.IsolateRefElement_methods = N.IsolateRefElement.prototype;
+C.IsolateRunStateElement_methods = D.IsolateRunStateElement.prototype;
+C.IsolateSharedSummaryElement_methods = D.IsolateSharedSummaryElement.prototype;
+C.IsolateSummaryElement_methods = D.IsolateSummaryElement.prototype;
+C.IsolateViewElement_methods = L.IsolateViewElement.prototype;
+C.JSArray_methods = J.JSArray.prototype;
+C.JSDouble_methods = J.JSDouble.prototype;
+C.JSInt_methods = J.JSInt.prototype;
+C.JSNull_methods = J.JSNull.prototype;
+C.JSNumber_methods = J.JSNumber.prototype;
+C.JSString_methods = J.JSString.prototype;
+C.JsonViewElement_methods = Z.JsonViewElement.prototype;
+C.LibraryNavMenuElement_methods = A.LibraryNavMenuElement.prototype;
+C.LibraryRefElement_methods = R.LibraryRefElement.prototype;
+C.LibraryViewElement_methods = M.LibraryViewElement.prototype;
+C.NativeUint8ClampedList_methods = H.NativeUint8ClampedList.prototype;
+C.NavBarElement_methods = A.NavBarElement.prototype;
+C.NavControlElement_methods = A.NavControlElement.prototype;
+C.NavMenuElement_methods = A.NavMenuElement.prototype;
+C.NavMenuItemElement_methods = A.NavMenuItemElement.prototype;
+C.NavRefreshElement_methods = A.NavRefreshElement.prototype;
+C.NodeList_methods = W.NodeList.prototype;
+C.ObservatoryApplicationElement_methods = V.ObservatoryApplicationElement.prototype;
+C.ObservatoryElement_methods = Z.ObservatoryElement.prototype;
+C.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;
+C.PolymerElement_methods = A.PolymerElement.prototype;
+C.ScriptInsetElement_methods = T.ScriptInsetElement.prototype;
+C.ScriptRefElement_methods = A.ScriptRefElement.prototype;
+C.ScriptViewElement_methods = U.ScriptViewElement.prototype;
+C.ServiceErrorViewElement_methods = R.ServiceErrorViewElement.prototype;
+C.ServiceExceptionViewElement_methods = D.ServiceExceptionViewElement.prototype;
+C.ServiceObjectViewElement_methods = U.ServiceObjectViewElement.prototype;
+C.ServiceRefElement_methods = Q.ServiceRefElement.prototype;
+C.SlidingCheckboxElement_methods = Q.SlidingCheckboxElement.prototype;
+C.StackFrameElement_methods = K.StackFrameElement.prototype;
+C.StackTraceElement_methods = X.StackTraceElement.prototype;
+C.TopNavMenuElement_methods = A.TopNavMenuElement.prototype;
+C.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;
+C.VMRefElement_methods = X.VMRefElement.prototype;
+C.VMViewElement_methods = U.VMViewElement.prototype;
+C.Window_methods = W.Window.prototype;
+C.C_DynamicRuntimeType = new H.DynamicRuntimeType();
+C.C_EmptyExpression = new U.EmptyExpression();
+C.C_EmptyIterator = new H.EmptyIterator();
+C.C_OutOfMemoryError = new P.OutOfMemoryError();
+C.C_ScopeFactory = new T.ScopeFactory();
+C.C__DelayedDone = new P._DelayedDone();
+C.C__JSRandom = new P._JSRandom();
+C.C__ObserverSentinel = new L._ObserverSentinel();
+C.C__RootZone = new P._RootZone();
+C.C__RootZoneSpecification = new P._RootZoneSpecification();
+C.CodeKind_Collected = new D.CodeKind("Collected");
+C.CodeKind_Dart = new D.CodeKind("Dart");
+C.CodeKind_Native = new D.CodeKind("Native");
+C.CodeKind_Reused = new D.CodeKind("Reused");
+C.CodeKind_Tag = new D.CodeKind("Tag");
+C.DeclarationKind_0 = new A.DeclarationKind(0);
+C.DeclarationKind_1 = new A.DeclarationKind(1);
+C.DeclarationKind_2 = new A.DeclarationKind(2);
+C.Symbol_error = new H.Symbol0("error");
+C.Type_UOR = H.createRuntimeType('DartError');
+C.C_Reflectable = new K.Reflectable();
+C.PublishedProperty_false = new A.PublishedProperty(false);
+Isolate.makeConstantList = function(list) {
+  list.immutable$list = init;
+  list.fixed$length = init;
+  return list;
+};
+;
+C.List_bTJ = Isolate.makeConstantList([C.C_Reflectable, C.PublishedProperty_false]);
+C.Declaration_0 = new A.Declaration(C.Symbol_error, C.DeclarationKind_1, false, C.Type_UOR, false, C.List_bTJ);
+C.Symbol_last = new H.Symbol0("last");
+C.Type_EsU = H.createRuntimeType('bool');
+C.Declaration_06U = new A.Declaration(C.Symbol_last, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_fragmentation = new H.Symbol0("fragmentation");
+C.Type_bAc = H.createRuntimeType('ServiceMap');
+C.Declaration_0Y4 = new A.Declaration(C.Symbol_fragmentation, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_label = new H.Symbol0("label");
+C.Type_Ejg = H.createRuntimeType('String');
+C.Declaration_0g2 = new A.Declaration(C.Symbol_label, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_hasParent = new H.Symbol0("hasParent");
+C.C_ObservableProperty = new K.ObservableProperty();
+C.List_Reflectable_ObservableProperty = Isolate.makeConstantList([C.C_Reflectable, C.C_ObservableProperty]);
+C.Declaration_0qV = new A.Declaration(C.Symbol_hasParent, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_sampleDepth = new H.Symbol0("sampleDepth");
+C.Declaration_2AE = new A.Declaration(C.Symbol_sampleDepth, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_result = new H.Symbol0("result");
+C.Type_rPh = H.createRuntimeType('ServiceObject');
+C.Declaration_2No = new A.Declaration(C.Symbol_result, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Symbol_counters = new H.Symbol0("counters");
+C.Type_caQ = H.createRuntimeType('ObservableMap');
+C.Declaration_2Qn = new A.Declaration(C.Symbol_counters, C.DeclarationKind_1, false, C.Type_caQ, false, C.List_bTJ);
+C.Symbol_sampleRate = new H.Symbol0("sampleRate");
+C.Declaration_3VL = new A.Declaration(C.Symbol_sampleRate, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Type_Tby = H.createRuntimeType('ServiceError');
+C.Declaration_4eA = new A.Declaration(C.Symbol_error, C.DeclarationKind_1, false, C.Type_Tby, false, C.List_bTJ);
+C.Symbol_objectChanged = new H.Symbol0("objectChanged");
+C.Type_EjN = H.createRuntimeType('Function');
+C.List_empty = Isolate.makeConstantList([]);
+C.Declaration_4up = new A.Declaration(C.Symbol_objectChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_frame = new H.Symbol0("frame");
+C.Declaration_65l = new A.Declaration(C.Symbol_frame, C.DeclarationKind_1, false, C.Type_caQ, false, C.List_bTJ);
+C.Symbol_flag = new H.Symbol0("flag");
+C.Declaration_6YB = new A.Declaration(C.Symbol_flag, C.DeclarationKind_1, false, C.Type_caQ, false, C.List_bTJ);
+C.Symbol_library = new H.Symbol0("library");
+C.Type_azP = H.createRuntimeType('Library');
+C.Declaration_6ts = new A.Declaration(C.Symbol_library, C.DeclarationKind_1, false, C.Type_azP, false, C.List_bTJ);
+C.Symbol_status = new H.Symbol0("status");
+C.Declaration_8sn = new A.Declaration(C.Symbol_status, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_endPos = new H.Symbol0("endPos");
+C.Type_SnA = H.createRuntimeType('$int');
+C.Declaration_ACG = new A.Declaration(C.Symbol_endPos, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_bTJ);
+C.Symbol_code = new H.Symbol0("code");
+C.Type_Zyt = H.createRuntimeType('Code');
+C.List_ObservableProperty = Isolate.makeConstantList([C.C_ObservableProperty]);
+C.Declaration_AgZ = new A.Declaration(C.Symbol_code, C.DeclarationKind_1, true, C.Type_Zyt, false, C.List_ObservableProperty);
+C.Symbol_list = new H.Symbol0("list");
+C.Declaration_BKW = new A.Declaration(C.Symbol_list, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_httpServer = new H.Symbol0("httpServer");
+C.Declaration_BSX = new A.Declaration(C.Symbol_httpServer, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_retainedBytes = new H.Symbol0("retainedBytes");
+C.Declaration_CIB = new A.Declaration(C.Symbol_retainedBytes, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_displayCutoff = new H.Symbol0("displayCutoff");
+C.Declaration_CR6 = new A.Declaration(C.Symbol_displayCutoff, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_functionChanged = new H.Symbol0("functionChanged");
+C.Declaration_Chj = new A.Declaration(C.Symbol_functionChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_expandChanged = new H.Symbol0("expandChanged");
+C.Declaration_Dbk = new A.Declaration(C.Symbol_expandChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_tagSelectorChanged = new H.Symbol0("tagSelectorChanged");
+C.Declaration_ECn = new A.Declaration(C.Symbol_tagSelectorChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_profile = new H.Symbol0("profile");
+C.Declaration_EkK = new A.Declaration(C.Symbol_profile, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_pad = new H.Symbol0("pad");
+C.Declaration_EsU = new A.Declaration(C.Symbol_pad, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_object = new H.Symbol0("object");
+C.Declaration_HtW = new A.Declaration(C.Symbol_object, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Symbol_callback = new H.Symbol0("callback");
+C.Type_yvU = H.createRuntimeType('evalType');
+C.Declaration_IF7 = new A.Declaration(C.Symbol_callback, C.DeclarationKind_1, false, C.Type_yvU, false, C.List_bTJ);
+C.Symbol_uncheckedText = new H.Symbol0("uncheckedText");
+C.Declaration_IRg = new A.Declaration(C.Symbol_uncheckedText, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_socket = new H.Symbol0("socket");
+C.Type_Qs5 = H.createRuntimeType('Socket');
+C.Declaration_Iiu = new A.Declaration(C.Symbol_socket, C.DeclarationKind_1, false, C.Type_Qs5, false, C.List_bTJ);
+C.Symbol_file = new H.Symbol0("file");
+C.Declaration_Ix1 = new A.Declaration(C.Symbol_file, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_refChanged = new H.Symbol0("refChanged");
+C.Declaration_MJ5 = new A.Declaration(C.Symbol_refChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_tagSelector = new H.Symbol0("tagSelector");
+C.Declaration_Q0F = new A.Declaration(C.Symbol_tagSelector, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_endPosChanged = new H.Symbol0("endPosChanged");
+C.Declaration_QAa = new A.Declaration(C.Symbol_endPosChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_vm = new H.Symbol0("vm");
+C.Type_GP5 = H.createRuntimeType('VM');
+C.Declaration_Qi2 = new A.Declaration(C.Symbol_vm, C.DeclarationKind_1, false, C.Type_GP5, false, C.List_bTJ);
+C.Symbol_mapAsString = new H.Symbol0("mapAsString");
+C.Declaration_Qx4 = new A.Declaration(C.Symbol_mapAsString, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_expanded = new H.Symbol0("expanded");
+C.Declaration_RQo = new A.Declaration(C.Symbol_expanded, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_lines = new H.Symbol0("lines");
+C.Type_UWS = H.createRuntimeType('List');
+C.Declaration_WfA = new A.Declaration(C.Symbol_lines, C.DeclarationKind_1, false, C.Type_UWS, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_hasClass = new H.Symbol0("hasClass");
+C.Declaration_X8B = new A.Declaration(C.Symbol_hasClass, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_internal = new H.Symbol0("internal");
+C.Declaration_XBb = new A.Declaration(C.Symbol_internal, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_kind = new H.Symbol0("kind");
+C.Declaration_Xdi = new A.Declaration(C.Symbol_kind, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_endLine = new H.Symbol0("endLine");
+C.Declaration_ZcJ = new A.Declaration(C.Symbol_endLine, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_text = new H.Symbol0("text");
+C.Declaration_ZfX = new A.Declaration(C.Symbol_text, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_process = new H.Symbol0("process");
+C.Declaration_a13 = new A.Declaration(C.Symbol_process, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_hideTagsChecked = new H.Symbol0("hideTagsChecked");
+C.Declaration_a1A = new A.Declaration(C.Symbol_hideTagsChecked, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_sampleCount = new H.Symbol0("sampleCount");
+C.Declaration_ac8 = new A.Declaration(C.Symbol_sampleCount, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_isolate = new H.Symbol0("isolate");
+C.Type_B8J0 = H.createRuntimeType('Isolate');
+C.Declaration_agR = new A.Declaration(C.Symbol_isolate, C.DeclarationKind_1, false, C.Type_B8J0, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_io = new H.Symbol0("io");
+C.Declaration_bh9 = new A.Declaration(C.Symbol_io, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_devtools = new H.Symbol0("devtools");
+C.Declaration_c4R = new A.Declaration(C.Symbol_devtools, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_countersChanged = new H.Symbol0("countersChanged");
+C.Declaration_cJC = new A.Declaration(C.Symbol_countersChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_path = new H.Symbol0("path");
+C.Declaration_cMb = new A.Declaration(C.Symbol_path, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_checkedText = new H.Symbol0("checkedText");
+C.Declaration_cdS = new A.Declaration(C.Symbol_checkedText, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_timeSpan = new H.Symbol0("timeSpan");
+C.Declaration_dIf = new A.Declaration(C.Symbol_timeSpan, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_active = new H.Symbol0("active");
+C.Declaration_dw1 = new A.Declaration(C.Symbol_active, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_qualified = new H.Symbol0("qualified");
+C.Declaration_e24 = new A.Declaration(C.Symbol_qualified, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_isolateChanged = new H.Symbol0("isolateChanged");
+C.Declaration_e3c = new A.Declaration(C.Symbol_isolateChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_ref = new H.Symbol0("ref");
+C.Declaration_e3c0 = new A.Declaration(C.Symbol_ref, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Declaration_eea = new A.Declaration(C.Symbol_error, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Symbol_expr = new H.Symbol0("expr");
+C.Type_dynamic = H.createRuntimeType('dynamic');
+C.Declaration_gLQ = new A.Declaration(C.Symbol_expr, C.DeclarationKind_1, false, C.Type_dynamic, false, C.List_bTJ);
+C.Symbol_msg = new H.Symbol0("msg");
+C.Declaration_gc6 = new A.Declaration(C.Symbol_msg, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_results = new H.Symbol0("results");
+C.Type_pe4 = H.createRuntimeType('ObservableList');
+C.Declaration_ggw = new A.Declaration(C.Symbol_results, C.DeclarationKind_1, false, C.Type_pe4, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_classTable = new H.Symbol0("classTable");
+C.Type_Gx6 = H.createRuntimeType('ClassSortedTable');
+C.Declaration_gsm = new A.Declaration(C.Symbol_classTable, C.DeclarationKind_1, false, C.Type_Gx6, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_pos = new H.Symbol0("pos");
+C.Declaration_i3t = new A.Declaration(C.Symbol_pos, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_bTJ);
+C.Symbol_qualifiedName = new H.Symbol0("qualifiedName");
+C.Declaration_i3y = new A.Declaration(C.Symbol_qualifiedName, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_mapChanged = new H.Symbol0("mapChanged");
+C.Declaration_iLh = new A.Declaration(C.Symbol_mapChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_link = new H.Symbol0("link");
+C.Declaration_ibz = new A.Declaration(C.Symbol_link, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_refreshTime = new H.Symbol0("refreshTime");
+C.Declaration_ijl = new A.Declaration(C.Symbol_refreshTime, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_fragmentationChanged = new H.Symbol0("fragmentationChanged");
+C.Declaration_ivD = new A.Declaration(C.Symbol_fragmentationChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_scriptChanged = new H.Symbol0("scriptChanged");
+C.Declaration_ixB = new A.Declaration(C.Symbol_scriptChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_field = new H.Symbol0("field");
+C.Declaration_iyl = new A.Declaration(C.Symbol_field, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_busy = new H.Symbol0("busy");
+C.Declaration_izV = new A.Declaration(C.Symbol_busy, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_profileChanged = new H.Symbol0("profileChanged");
+C.Declaration_j3g = new A.Declaration(C.Symbol_profileChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_startLine = new H.Symbol0("startLine");
+C.Declaration_k6K = new A.Declaration(C.Symbol_startLine, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_lastServiceGC = new H.Symbol0("lastServiceGC");
+C.Declaration_mPk = new A.Declaration(C.Symbol_lastServiceGC, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_webSocket = new H.Symbol0("webSocket");
+C.Declaration_mT8 = new A.Declaration(C.Symbol_webSocket, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_instance = new H.Symbol0("instance");
+C.Declaration_o7L = new A.Declaration(C.Symbol_instance, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_isDart = new H.Symbol0("isDart");
+C.Declaration_o7e = new A.Declaration(C.Symbol_isDart, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_cls = new H.Symbol0("cls");
+C.Type_Tzp = H.createRuntimeType('Class');
+C.Declaration_okX = new A.Declaration(C.Symbol_cls, C.DeclarationKind_1, false, C.Type_Tzp, false, C.List_bTJ);
+C.Symbol_posChanged = new H.Symbol0("posChanged");
+C.Declaration_owq = new A.Declaration(C.Symbol_posChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_small = new H.Symbol0("small");
+C.Declaration_pPA = new A.Declaration(C.Symbol_small, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_instances = new H.Symbol0("instances");
+C.Declaration_qr9 = new A.Declaration(C.Symbol_instances, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_Reflectable_ObservableProperty);
+C.Declaration_qrv = new A.Declaration(C.Symbol_cls, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_checked = new H.Symbol0("checked");
+C.Declaration_siO = new A.Declaration(C.Symbol_checked, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_trace = new H.Symbol0("trace");
+C.Declaration_ssf = new A.Declaration(C.Symbol_trace, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_anchor = new H.Symbol0("anchor");
+C.Declaration_suy = new A.Declaration(C.Symbol_anchor, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_exception = new H.Symbol0("exception");
+C.Type_zzJ = H.createRuntimeType('ServiceException');
+C.Declaration_v0l = new A.Declaration(C.Symbol_exception, C.DeclarationKind_1, false, C.Type_zzJ, false, C.List_bTJ);
+C.Symbol_lastAccumulatorReset = new H.Symbol0("lastAccumulatorReset");
+C.Declaration_vA1 = new A.Declaration(C.Symbol_lastAccumulatorReset, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Declaration_voj = new A.Declaration(C.Symbol_isolate, C.DeclarationKind_1, false, C.Type_B8J0, false, C.List_bTJ);
+C.Symbol_flagList = new H.Symbol0("flagList");
+C.Declaration_wE9 = new A.Declaration(C.Symbol_flagList, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Declaration_woc = new A.Declaration(C.Symbol_code, C.DeclarationKind_1, false, C.Type_Zyt, false, C.List_bTJ);
+C.Symbol_lineMode = new H.Symbol0("lineMode");
+C.Declaration_ww8 = new A.Declaration(C.Symbol_lineMode, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_map = new H.Symbol0("map");
+C.Declaration_wzu = new A.Declaration(C.Symbol_map, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_function = new H.Symbol0("function");
+C.Declaration_y9n = new A.Declaration(C.Symbol_function, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_connection = new H.Symbol0("connection");
+C.Declaration_yDj = new A.Declaration(C.Symbol_connection, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Declaration_yXb = new A.Declaration(C.Symbol_callback, C.DeclarationKind_1, false, C.Type_dynamic, false, C.List_bTJ);
+C.Symbol_expand = new H.Symbol0("expand");
+C.Declaration_yXb0 = new A.Declaration(C.Symbol_expand, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_script = new H.Symbol0("script");
+C.Type_cgs = H.createRuntimeType('Script');
+C.Declaration_yx3 = new A.Declaration(C.Symbol_script, C.DeclarationKind_1, false, C.Type_cgs, false, C.List_bTJ);
+C.Duration_0 = new P.Duration(0);
+C.EventStreamProvider_change = H.setRuntimeTypeInfo(new W.EventStreamProvider("change"), [W.Event]);
+C.EventStreamProvider_click = H.setRuntimeTypeInfo(new W.EventStreamProvider("click"), [W.MouseEvent]);
+C.EventStreamProvider_error = H.setRuntimeTypeInfo(new W.EventStreamProvider("error"), [W.ProgressEvent]);
+C.EventStreamProvider_input = H.setRuntimeTypeInfo(new W.EventStreamProvider("input"), [W.Event]);
+C.EventStreamProvider_load = H.setRuntimeTypeInfo(new W.EventStreamProvider("load"), [W.ProgressEvent]);
+C.EventStreamProvider_message = H.setRuntimeTypeInfo(new W.EventStreamProvider("message"), [W.MessageEvent]);
+C.EventStreamProvider_mousedown = H.setRuntimeTypeInfo(new W.EventStreamProvider("mousedown"), [W.MouseEvent]);
+C.EventStreamProvider_mousemove = H.setRuntimeTypeInfo(new W.EventStreamProvider("mousemove"), [W.MouseEvent]);
+C.EventStreamProvider_popstate = H.setRuntimeTypeInfo(new W.EventStreamProvider("popstate"), [W.PopStateEvent]);
+C.JS_CONST_0 = function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
-}
-C.lR=function(hooks) {
+};
+C.JS_CONST_4hp = function(hooks) {
   var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
   if (userAgent.indexOf("Firefox") == -1) return hooks;
   var getTag = hooks.getTag;
@@ -19330,8 +35830,8 @@
     return quickMap[tag] || tag;
   }
   hooks.getTag = getTagFirefox;
-}
-C.w2=function getTagFallback(o) {
+};
+C.JS_CONST_8ZY = function getTagFallback(o) {
   var constructor = o.constructor;
   if (typeof constructor == "function") {
     var name = constructor.name;
@@ -19344,10 +35844,10 @@
   }
   var s = Object.prototype.toString.call(o);
   return s.substring(8, s.length - 1);
-}
-C.XQ=function(hooks) { return hooks; }
-
-C.ku=function(getTagFallback) {
+};
+C.JS_CONST_Fs4 = function(hooks) { return hooks; }
+;
+C.JS_CONST_QJm = function(getTagFallback) {
   return function(hooks) {
     if (typeof navigator != "object") return hooks;
     var ua = navigator.userAgent;
@@ -19360,8 +35860,8 @@
     }
     hooks.getTag = getTagFallback;
   };
-}
-C.MA=function() {
+};
+C.JS_CONST_aQP = function() {
   function typeNameInChrome(o) {
     var name = o.constructor.name;
     if (name) return name;
@@ -19393,8 +35893,8 @@
     getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
     prototypeForTag: prototypeForTag,
     discriminator: discriminator };
-}
-C.M1=function(hooks) {
+};
+C.JS_CONST_gkc = function(hooks) {
   var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
   if (userAgent.indexOf("Trident/") == -1) return hooks;
   var getTag = hooks.getTag;
@@ -19422,8 +35922,8 @@
   }
   hooks.getTag = getTagIE;
   hooks.prototypeForTag = prototypeForTagIE;
-}
-C.hQ=function(hooks) {
+};
+C.JS_CONST_rr7 = function(hooks) {
   var getTag = hooks.getTag;
   var prototypeForTag = hooks.prototypeForTag;
   function getTagFixed(o) {
@@ -19440,593 +35940,1171 @@
   }
   hooks.getTag = getTagFixed;
   hooks.prototypeForTag = prototypeForTagFixed;
-}
-C.xr=new P.pE(null,null)
-C.A3=new P.c5(null)
-C.Sr=new P.ojF(null,null)
-C.D8=new N.qV("FINER",400)
-C.eI=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.NG=I.uL([1,6])
-C.rs=I.uL([0,0,26624,1023,0,0,65534,2047])
-C.SV=new H.IN("keys")
-C.Uq=new H.IN("values")
-C.Wn=new H.IN("length")
-C.ai=new H.IN("isEmpty")
-C.nZ=new H.IN("isNotEmpty")
-C.Zw=I.uL([C.SV,C.Uq,C.Wn,C.ai,C.nZ])
-C.fW=H.VM(I.uL(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
-C.NL=I.uL([0,0,26624,1023,65534,2047,65534,2047])
-C.yD=I.uL([0,0,26498,1023,65534,34815,65534,18431])
-C.N4=H.Kx('nd')
-C.Cd=I.uL([C.N4])
-C.G8=I.uL(["==","!=","<=",">=","||","&&"])
-C.oP=I.uL(["as","in","this"])
-C.QC=I.uL(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
-C.bg=I.uL([43,45,42,47,33,38,37,60,61,62,63,94,124])
-C.B2=I.uL([0,0,24576,1023,65534,34815,65534,18431])
-C.aa=I.uL([0,0,32754,11263,65534,34815,65534,18431])
-C.ZJ=I.uL([0,0,32722,12287,65535,34815,65534,18431])
-C.iq=I.uL([40,41,91,93,123,125])
-C.zao=I.uL(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-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.Vgv=I.uL(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.fE=new H.Px(14,{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.Vgv)
-C.rW=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
-C.n7=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rW)
-C.Y1=I.uL(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.lx=new H.Px(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.Y1)
-C.CM=new H.Px(0,{},C.dn)
-C.MEG=I.uL(["enumerate"])
-C.va=new H.Px(1,{enumerate:K.y8()},C.MEG)
-C.tq=H.Kx('Bo')
-C.MS=H.Kx('wA')
-C.wE=I.uL([C.MS])
-C.Xk=new A.Wq(!1,!1,!0,C.tq,!1,!0,C.wE,null)
-C.uDk=H.Kx('hG')
-C.tmF=I.uL([C.uDk])
-C.aj=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.tmF,null)
-C.wj=new D.l8R("Internal")
-C.Cn=new D.l8R("Listening")
-C.fO=new D.l8R("Normal")
-C.FJ=new D.l8R("Pipe")
-C.IH=new H.IN("address")
-C.ke=new H.IN("architecture")
-C.ET=new H.IN("assertsEnabled")
-C.WC=new H.IN("bpt")
-C.Ro=new H.IN("buttonClick")
-C.hN=new H.IN("bytes")
-C.Ka=new H.IN("call")
-C.bV=new H.IN("capacity")
-C.C0=new H.IN("change")
-C.eZ=new H.IN("changeSort")
-C.OI=new H.IN("classes")
-C.To=new H.IN("closing")
-C.J6=new H.IN("collections")
-C.qt=new H.IN("coloring")
-C.p1=new H.IN("columns")
-C.Je=new H.IN("current")
-C.iE=new H.IN("descriptor")
-C.f4=new H.IN("descriptors")
-C.aK=new H.IN("doAction")
-C.GP=new H.IN("element")
-C.tP=new H.IN("entry")
-C.Zb=new H.IN("eval")
-C.u7=new H.IN("evalNow")
-C.Ek=new H.IN("expander")
-C.Pn=new H.IN("expanderStyle")
-C.h7=new H.IN("external")
-C.R3=new H.IN("fd")
-C.fV=new H.IN("fields")
-C.Gd=new H.IN("firstTokenPos")
-C.FP=new H.IN("formatSize")
-C.kF=new H.IN("formatTime")
-C.UD=new H.IN("formattedAddress")
-C.Aq=new H.IN("formattedAverage")
-C.DS=new H.IN("formattedCollections")
-C.C9=new H.IN("formattedDeoptId")
-C.VF=new H.IN("formattedExclusive")
-C.uU=new H.IN("formattedExclusiveTicks")
-C.YJ=new H.IN("formattedInclusive")
-C.eF=new H.IN("formattedInclusiveTicks")
-C.oI=new H.IN("formattedLine")
-C.ST=new H.IN("formattedTotalCollectionTime")
-C.EI=new H.IN("functions")
-C.JB=new H.IN("getColumnLabel")
-C.d4=new H.IN("goto")
-C.cF=new H.IN("gotoLink")
-C.SI=new H.IN("hasDescriptors")
-C.zS=new H.IN("hasDisassembly")
-C.YA=new H.IN("hasNoAllocations")
-C.Ge=new H.IN("hashLinkWorkaround")
-C.Ss=new H.IN("hits")
-C.k6=new H.IN("hoverText")
-C.PJ=new H.IN("human")
-C.q2=new H.IN("idle")
-C.d2=new H.IN("imp")
-C.kN=new H.IN("imports")
-C.yB=new H.IN("instances")
-C.eJ=new H.IN("instruction")
-C.iG=new H.IN("instructions")
-C.Py=new H.IN("interface")
-C.pC=new H.IN("interfaces")
-C.Bs=new H.IN("ioEnabled")
-C.XH=new H.IN("isAbstract")
-C.I9=new H.IN("isBool")
-C.C1=new H.IN("isComment")
-C.bD=new H.IN("isConst")
-C.Yg=new H.IN("isDartCode")
-C.bR=new H.IN("isDouble")
-C.ob=new H.IN("isError")
-C.WV=new H.IN("isFinalized")
-C.Ih=new H.IN("isImplemented")
-C.Iv=new H.IN("isInstance")
-C.Wg=new H.IN("isInt")
-C.tD=new H.IN("isList")
-C.Of=new H.IN("isNull")
-C.pY=new H.IN("isOptimized")
-C.XL=new H.IN("isPatch")
-C.LA=new H.IN("isPipe")
-C.Lk=new H.IN("isString")
-C.dK=new H.IN("isType")
-C.xf=new H.IN("isUnexpected")
-C.Jx=new H.IN("isolates")
-C.b5=new H.IN("jumpTarget")
-C.kA=new H.IN("lastTokenPos")
-C.GI=new H.IN("lastUpdate")
-C.ur=new H.IN("lib")
-C.VN=new H.IN("libraries")
-C.VI=new H.IN("line")
-C.r6=new H.IN("lineNumber")
-C.MW=new H.IN("lineNumbers")
-C.cc=new H.IN("listening")
-C.DY=new H.IN("loading")
-C.Lx=new H.IN("localAddress")
-C.M3=new H.IN("localPort")
-C.wT=new H.IN("mainPort")
-C.pX=new H.IN("message")
-C.VD=new H.IN("mouseOut")
-C.NN=new H.IN("mouseOver")
-C.YS=new H.IN("name")
-C.pu=new H.IN("nameIsEmpty")
-C.BJ=new H.IN("newSpace")
-C.OV=new H.IN("noSuchMethod")
-C.as=new H.IN("objectClass")
-C.zO=new H.IN("objectPool")
-C.vg=new H.IN("oldSpace")
-C.zm=new H.IN("padding")
-C.Ic=new H.IN("pause")
-C.yG=new H.IN("pauseEvent")
-C.uI=new H.IN("pid")
-C.AY=new H.IN("protocol")
-C.I7=new H.IN("readClosed")
-C.GR=new H.IN("refresh")
-C.KX=new H.IN("refreshCoverage")
-C.ja=new H.IN("refreshGC")
-C.MT=new H.IN("registerCallback")
-C.ir=new H.IN("relativeLink")
-C.dx=new H.IN("remoteAddress")
-C.ni=new H.IN("remotePort")
-C.X2=new H.IN("resetAccumulator")
-C.F3=new H.IN("response")
-C.nY=new H.IN("resume")
-C.HD=new H.IN("retainedSize")
-C.iU=new H.IN("retainingPath")
-C.eN=new H.IN("rootLib")
-C.ue=new H.IN("row")
-C.nh=new H.IN("rows")
-C.L2=new H.IN("running")
-C.EA=new H.IN("scripts")
-C.oW=new H.IN("selectExpr")
-C.hd=new H.IN("serviceType")
-C.jM=new H.IN("socketOwner")
-C.Pf=new H.IN("stacktrace")
-C.xA=new H.IN("styleForHits")
-C.k5=new H.IN("subClasses")
-C.Nv=new H.IN("subclass")
-C.Cw=new H.IN("superClass")
-C.hO=new H.IN("tipExclusive")
-C.ei=new H.IN("tipKind")
-C.HK=new H.IN("tipParent")
-C.je=new H.IN("tipTicks")
-C.Ef=new H.IN("tipTime")
-C.Q1=new H.IN("toggleExpand")
-C.ID=new H.IN("toggleExpanded")
-C.z6=new H.IN("tokenPos")
-C.bc=new H.IN("topFrame")
-C.Jl=new H.IN("totalCollectionTimeInSeconds")
-C.Kj=new H.IN("totalSamplesInProfile")
-C.ep=new H.IN("tree")
-C.J2=new H.IN("typeChecksEnabled")
-C.bn=new H.IN("updateLineMode")
-C.mh=new H.IN("uptime")
-C.Fh=new H.IN("url")
-C.LP=new H.IN("used")
-C.jh=new H.IN("v")
-C.Ha=new H.IN("value")
-C.fj=new H.IN("variable")
-C.xw=new H.IN("variables")
-C.zn=new H.IN("version")
-C.Tc=new H.IN("vmName")
-C.Uy=new H.IN("writeClosed")
-C.MI=H.Kx('hx')
-C.hP=H.Kx('uz')
-C.Mf=H.Kx('G1')
-C.q0S=H.Kx('Dg')
-C.Dl=H.Kx('F1')
-C.Jf=H.Kx('Mb')
-C.UJ=H.Kx('oa')
-C.E0=H.Kx('aI')
-C.Y3=H.Kx('CY')
-C.lU=H.Kx('Hl')
-C.kq=H.Kx('Nn')
-C.j4=H.Kx('IW')
-C.dP=H.Kx('vm')
-C.Vx=H.Kx('MJ')
-C.Vh=H.Kx('Pz')
-C.HC=H.Kx('F0')
-C.rR=H.Kx('wN')
-C.yS=H.Kx('G6')
-C.Sb=H.Kx('kn')
-C.FQ=H.Kx('a')
-C.Yc=H.Kx('iP')
-C.EZ=H.Kx('oF')
-C.vw=H.Kx('UK')
-C.Jo=H.Kx('i7')
-C.BL=H.Kx('Nr')
-C.ON=H.Kx('ov')
-C.jR=H.Kx('Be')
-C.al=H.Kx('es')
-C.PT=H.Kx('CX')
-C.iD=H.Kx('Vb')
-C.ce=H.Kx('kK')
-C.dD=H.Kx('av')
-C.FA=H.Kx('Ya')
-C.Th=H.Kx('fI')
-C.tU=H.Kx('L4')
-C.yT=H.Kx('FK')
-C.cK=H.Kx('I5')
-C.jA=H.Kx('Eg')
-C.K4=H.Kx('hV')
-C.Mt=H.Kx('hu')
-C.la=H.Kx('ZX')
-C.CR=H.Kx('CP')
-C.xE=H.Kx('aC')
-C.vu=H.Kx('uw')
-C.ca=H.Kx('Z4')
-C.pJ=H.Kx('Q6')
-C.Yy=H.Kx('uE')
-C.M5=H.Kx('yc')
-C.Yxm=H.Kx('Pg')
-C.il=H.Kx('xI')
-C.lk=H.Kx('mJ')
-C.lp=H.Kx('LU')
-C.oG=H.Kx('ds')
-C.EG=H.Kx('Oz')
-C.nw=H.Kx('eo')
-C.OG=H.Kx('eW')
-C.km=H.Kx('fl')
-C.jV=H.Kx('rF')
-C.Tq=H.Kx('vj')
-C.JW=H.Kx('Ww')
-C.xeh=H.Kx('ve')
-C.CT=H.Kx('St')
-C.wH=H.Kx('zM')
-C.l4=H.Kx('uL')
-C.LT=H.Kx('md')
-C.Wh=H.Kx('H8')
-C.Zj=H.Kx('U1')
-C.FG=H.Kx('qh')
-C.Fe=H.Kx('zt')
-C.NR=H.Kx('nm')
-C.DD=H.Kx('Zn')
-C.qF=H.Kx('mO')
-C.Ey=H.Kx('wM')
-C.pF=H.Kx('WS')
-C.nX=H.Kx('DE')
-C.jw=H.Kx('xc')
-C.NW=H.Kx('ye')
-C.ig=H.Kx('we')
-C.Xv=H.Kx('n5')
-C.XI=H.Kx('cn')
-C.KO=H.Kx('ZP')
-C.Jm=H.Kx('q6')
-C.Wz=H.Kx('pR')
-C.Ep=H.Kx('ou')
-C.tc=H.Kx('Ma')
-C.Io=H.Kx('Qh')
-C.wk=H.Kx('nJ')
-C.te=H.Kx('BS')
-C.ms=H.Kx('Bm')
-C.qJ=H.Kx('pG')
-C.pK=H.Kx('Rk')
-C.lE=H.Kx('DK')
-C.Az=H.Kx('Gk')
-C.GX=H.Kx('c8')
-C.X8=H.Kx('Ti')
-C.Lg=H.Kx('JI')
-C.Ju=H.Kx('Ly')
-C.mq=H.Kx('qk')
-C.XWY=H.Kx('uEY')
-C.oT=H.Kx('VY')
-C.jK=H.Kx('el')
-C.xM=new P.u5F(!1)
-$.libraries_to_load = {}
-$.Vz=1
-$.z7="$cachedFunction"
-$.eb="$cachedInvocation"
-$.OK=0
-$.bf=null
-$.P4=null
-$.Ot=!1
-$.NF=null
-$.TX=null
-$.x7=null
-$.q4=null
-$.vv=null
-$.Bv=null
-$.W5=null
-$.BY=null
-$.oK=null
-$.S6=null
-$.k8=null
-$.X3=C.NU
-$.Km=0
-$.Qz=null
-$.R6=null
-$.RL=!1
-$.Y4=C.IF
-$.xO=0
-$.ax=0
-$.Oo=null
-$.Td=!1
-$.ps=0
-$.xG=null
-$.ok=!1
-$.AC=!1
-$.M6=null
-$.UG=!0
-$.RQ="objects/"
-$.vU=null
-$.xV=null
-$.rK=!1
-$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.z1},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.D2},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.BL,X.Nr,{created:X.Ak},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.Dc},C.iD,O.Vb,{created:O.dF},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.Ci},C.FA,A.Ya,{created:A.vn},C.Th,U.fI,{created:U.dI},C.tU,E.L4,{created:E.MB},C.cK,X.I5,{created:X.pn},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.lW},C.vu,X.uw,{created:X.HI},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.P3},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.fd},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pI},C.EG,D.Oz,{created:D.RP},C.nw,O.eo,{created:O.l0},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.xeh,W.ve,{},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.Sc},C.NR,K.nm,{created:K.an},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.nX,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.Fv},C.ig,H.we,{"":H.ic},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Zg},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.tX},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.nz},C.ms,A.Bm,{created:A.AJm},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.nv},C.X8,U.Ti,{created:U.HP},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.US},C.mq,L.qk,{created:L.Qtp},C.XWY,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","vQ","Vr",function(){return $.jk().window})
-I.$lazy($,"globalWorker","u9","rm",function(){return $.jk().Worker})
-I.$lazy($,"globalPostMessageDefined","Wdn","ey",function(){return $.jk().postMessage!==void 0})
-I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.qo(null),[P.KN])})
-I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
-I.$lazy($,"notClosurePattern","k1","Up",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
-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","qi","rx",function(){return H.cM(H.S7(void 0))})
-I.$lazy($,"undefinedLiteralCallPattern","cz","kQ",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))})
-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","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.xg()})
-I.$lazy($,"_nullFuture","bq","mk",function(){return P.Ab(null,null)})
-I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
-I.$lazy($,"webkitEvents","fD","Vp",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","Si",function(){return P.ND(function(){return this}())})
-I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
-I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
-I.$lazy($,"_dartProxyCtor","fK","iW",function(){return function DartObject(a){this.o=a}})
-I.$lazy($,"_freeColor","nK","Rl",function(){return[255,255,255,255]})
-I.$lazy($,"_pageSeparationColor","Os","Qg",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.Rw)})
-I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","qr","V6",function(){return new L.vH([])})
-I.$lazy($,"_pathRegExp","tC","uC",function(){return new L.YJG().$0()})
-I.$lazy($,"_logger","y7Y","YV",function(){return N.QM("observe.PathObserver")})
-I.$lazy($,"_pathCache","un","aB",function(){return P.L5(null,null,null,P.qU,L.Tv)})
-I.$lazy($,"_polymerSyntax","Kb","Rs",function(){return new A.Li(T.GF(null,C.qY),null)})
-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)})
-I.$lazy($,"_hasShadowDomPolyfill","jQ","op",function(){return $.Si().Eg("ShadowDOMPolyfill")})
-I.$lazy($,"_ShadowCss","qP","AM",function(){var z=$.Kc()
-return z!=null?J.UQ(z,"ShadowCSS"):null})
-I.$lazy($,"_sheetLog","dz","Es",function(){return N.QM("polymer.stylesheet")})
-I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
-I.$lazy($,"_ATTRIBUTES_REGEX","mD","aQ",function(){return new H.VR("\\s|,",H.ol("\\s|,",!1,!0,!1),null,null)})
-I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Si(),"Platform")})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.ol("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_onReady","R9","iF",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_observeLog","i8","p2",function(){return N.QM("polymer.observe")})
-I.$lazy($,"_eventsLog","fo","eS",function(){return N.QM("polymer.events")})
-I.$lazy($,"_unbindLog","Ne","UW",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","xz","QX5",function(){return N.QM("polymer.bind")})
-I.$lazy($,"_PolymerGestures","NB","dg",function(){return J.UQ($.Si(),"PolymerGestures")})
-I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
-I.$lazy($,"_typeHandlers","lq","QL",function(){return P.EF([C.Db,new Z.lP(),C.GX,new Z.Uf(),C.Yc,new Z.Ra(),C.HL,new Z.wJY(),C.yw,new Z.zOQ(),C.CR,new Z.W6o()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","Af","Rab",function(){return P.EF(["+",new K.w10(),"-",new K.w11(),"*",new K.w12(),"/",new K.w13(),"%",new K.w14(),"==",new K.w15(),"!=",new K.w16(),"===",new K.w17(),"!==",new K.w18(),">",new K.w19(),">=",new K.w20(),"<",new K.w21(),"<=",new K.w22(),"||",new K.w23(),"&&",new K.w24(),"|",new K.w25()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","qM","qL",function(){return P.EF(["+",new K.Raa(),"-",new K.w0(),"!",new K.w5()],null,null)})
-I.$lazy($,"_instance","jC","Pk",function(){return new K.me()})
-I.$lazy($,"_currentIsolateMatcher","mb","vo",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($,"_DEFAULT","ac","HT",function(){return new M.vE(null)})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.Ufa().$0()})
-I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_ownerStagingDocument","EW","Lu",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","Ze",function(){return"template, "+J.kl(C.z5.gvc(),new M.MdQ()).zV(0,", ")})
-I.$lazy($,"_templateObserver","kY","pT",function(){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.Fs(new M.DOe()),2))})
-I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.lPa().$0()})
-I.$lazy($,"_instanceExtension","AH","It",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_isStagingDocument","Fg","AA",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.qo("template_binding"),[null])})
+};
+C.JsonCodec_null_null = new P.JsonCodec(null, null);
+C.JsonDecoder_null = new P.JsonDecoder(null);
+C.JsonEncoder_null_null = new P.JsonEncoder(null, null);
+C.Level_FINER_400 = new N.Level("FINER", 400);
+C.Level_FINE_500 = new N.Level("FINE", 500);
+C.Level_INFO_800 = new N.Level("INFO", 800);
+C.Level_SEVERE_1000 = new N.Level("SEVERE", 1000);
+C.Level_WARNING_900 = new N.Level("WARNING", 900);
+C.List_1_6 = Isolate.makeConstantList([1, 6]);
+C.List_6Pr = Isolate.makeConstantList([0, 0, 26624, 1023, 0, 0, 65534, 2047]);
+C.Symbol_keys = new H.Symbol0("keys");
+C.Symbol_values = new H.Symbol0("values");
+C.Symbol_length = new H.Symbol0("length");
+C.Symbol_isEmpty = new H.Symbol0("isEmpty");
+C.Symbol_isNotEmpty = new H.Symbol0("isNotEmpty");
+C.List_8QI = Isolate.makeConstantList([C.Symbol_keys, C.Symbol_values, C.Symbol_length, C.Symbol_isEmpty, C.Symbol_isNotEmpty]);
+C.List_EuK = H.setRuntimeTypeInfo(Isolate.makeConstantList(["+", "-", "*", "/", "%", "^", "==", "!=", ">", "<", ">=", "<=", "||", "&&", "&", "===", "!==", "|"]), [P.String]);
+C.Type_6WV = H.createRuntimeType('ObservableProperty');
+C.List_GGa = Isolate.makeConstantList([C.Type_6WV]);
+C.List_JYB = Isolate.makeConstantList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047]);
+C.List_KIf = Isolate.makeConstantList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431]);
+C.List_Ynd = Isolate.makeConstantList(["==", "!=", "<=", ">=", "||", "&&"]);
+C.List_as_in_this = Isolate.makeConstantList(["as", "in", "this"]);
+C.List_mBx = Isolate.makeConstantList(["rowColor0", "rowColor1", "rowColor2", "rowColor3", "rowColor4", "rowColor5", "rowColor6", "rowColor7", "rowColor8"]);
+C.List_mC8 = Isolate.makeConstantList([43, 45, 42, 47, 33, 38, 37, 60, 61, 62, 63, 94, 124]);
+C.List_nxB = Isolate.makeConstantList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431]);
+C.List_qNA = Isolate.makeConstantList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431]);
+C.List_qg4 = Isolate.makeConstantList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431]);
+C.List_ww8 = Isolate.makeConstantList([40, 41, 91, 93, 123, 125]);
+C.List_05B = Isolate.makeConstantList(["caption", "col", "colgroup", "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", "tr"]);
+C.Map_05eTF = new H.ConstantStringMap(11, {caption: null, col: null, colgroup: null, option: null, optgroup: null, tbody: null, td: null, tfoot: null, th: null, thead: null, tr: null}, C.List_05B);
+C.List_AmO = Isolate.makeConstantList(["domfocusout", "domfocusin", "dommousescroll", "animationend", "animationiteration", "animationstart", "doubleclick", "fullscreenchange", "fullscreenerror", "keyadded", "keyerror", "keymessage", "needkey", "speechchange"]);
+C.Map_AmMJ5 = new H.ConstantStringMap(14, {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.List_AmO);
+C.List_EJ5 = Isolate.makeConstantList(["name", "extends", "constructor", "noscript", "assetpath", "cache-csstext", "attributes"]);
+C.Map_EJn7R = new H.ConstantStringMap(7, {name: 1, extends: 1, constructor: 1, noscript: 1, assetpath: 1, "cache-csstext": 1, attributes: 1}, C.List_EJ5);
+C.List_L0C = Isolate.makeConstantList(["!", ":", ",", ")", "]", "}", "?", "||", "&&", "|", "^", "&", "!=", "==", "!==", "===", ">=", ">", "<=", "<", "+", "-", "%", "/", "*", "(", "[", ".", "{"]);
+C.Map_L0K61 = new H.ConstantStringMap(29, {"!": 0, ":": 0, ",": 0, ")": 0, "]": 0, "}": 0, "?": 1, "||": 2, "&&": 3, "|": 4, "^": 5, "&": 6, "!=": 7, "==": 7, "!==": 7, "===": 7, ">=": 8, ">": 8, "<=": 8, "<": 8, "+": 9, "-": 9, "%": 10, "/": 10, "*": 10, "(": 11, "[": 11, ".": 11, "{": 11}, C.List_L0C);
+C.Map_empty = new H.ConstantStringMap(0, {}, C.List_empty);
+C.List_enumerate = Isolate.makeConstantList(["enumerate"]);
+C.Map_wgEsG = new H.ConstantStringMap(1, {enumerate: K.enumerate$closure()}, C.List_enumerate);
+C.Type_fPs = H.createRuntimeType('HtmlElement');
+C.Type_oGx = H.createRuntimeType('PublishedProperty');
+C.List_JQl = Isolate.makeConstantList([C.Type_oGx]);
+C.QueryOptions_sAl = new A.QueryOptions(true, true, true, C.Type_fPs, false, false, C.List_JQl, null);
+C.Type_oqK = H.createRuntimeType('ObserveProperty');
+C.List_M2f = Isolate.makeConstantList([C.Type_oqK]);
+C.QueryOptions_xw8 = new A.QueryOptions(false, false, true, C.Type_fPs, false, true, C.List_M2f, null);
+C.SocketKind_Internal = new D.SocketKind("Internal");
+C.SocketKind_Listening = new D.SocketKind("Listening");
+C.SocketKind_Normal = new D.SocketKind("Normal");
+C.SocketKind_Pipe = new D.SocketKind("Pipe");
+C.Symbol_address = new H.Symbol0("address");
+C.Symbol_architecture = new H.Symbol0("architecture");
+C.Symbol_assertsEnabled = new H.Symbol0("assertsEnabled");
+C.Symbol_bpt = new H.Symbol0("bpt");
+C.Symbol_buttonClick = new H.Symbol0("buttonClick");
+C.Symbol_bytes = new H.Symbol0("bytes");
+C.Symbol_call = new H.Symbol0("call");
+C.Symbol_capacity = new H.Symbol0("capacity");
+C.Symbol_change = new H.Symbol0("change");
+C.Symbol_changeSort = new H.Symbol0("changeSort");
+C.Symbol_classes = new H.Symbol0("classes");
+C.Symbol_closing = new H.Symbol0("closing");
+C.Symbol_collections = new H.Symbol0("collections");
+C.Symbol_coloring = new H.Symbol0("coloring");
+C.Symbol_columns = new H.Symbol0("columns");
+C.Symbol_current = new H.Symbol0("current");
+C.Symbol_descriptor = new H.Symbol0("descriptor");
+C.Symbol_descriptors = new H.Symbol0("descriptors");
+C.Symbol_doAction = new H.Symbol0("doAction");
+C.Symbol_element = new H.Symbol0("element");
+C.Symbol_entry = new H.Symbol0("entry");
+C.Symbol_eval = new H.Symbol0("eval");
+C.Symbol_evalNow = new H.Symbol0("evalNow");
+C.Symbol_expander = new H.Symbol0("expander");
+C.Symbol_expanderStyle = new H.Symbol0("expanderStyle");
+C.Symbol_external = new H.Symbol0("external");
+C.Symbol_fd = new H.Symbol0("fd");
+C.Symbol_fields = new H.Symbol0("fields");
+C.Symbol_firstTokenPos = new H.Symbol0("firstTokenPos");
+C.Symbol_formatSize = new H.Symbol0("formatSize");
+C.Symbol_formatTime = new H.Symbol0("formatTime");
+C.Symbol_formattedAddress = new H.Symbol0("formattedAddress");
+C.Symbol_formattedAverage = new H.Symbol0("formattedAverage");
+C.Symbol_formattedCollections = new H.Symbol0("formattedCollections");
+C.Symbol_formattedDeoptId = new H.Symbol0("formattedDeoptId");
+C.Symbol_formattedExclusive = new H.Symbol0("formattedExclusive");
+C.Symbol_formattedExclusiveTicks = new H.Symbol0("formattedExclusiveTicks");
+C.Symbol_formattedInclusive = new H.Symbol0("formattedInclusive");
+C.Symbol_formattedInclusiveTicks = new H.Symbol0("formattedInclusiveTicks");
+C.Symbol_formattedLine = new H.Symbol0("formattedLine");
+C.Symbol_formattedTotalCollectionTime = new H.Symbol0("formattedTotalCollectionTime");
+C.Symbol_functions = new H.Symbol0("functions");
+C.Symbol_getColumnLabel = new H.Symbol0("getColumnLabel");
+C.Symbol_goto = new H.Symbol0("goto");
+C.Symbol_gotoLink = new H.Symbol0("gotoLink");
+C.Symbol_hasDescriptors = new H.Symbol0("hasDescriptors");
+C.Symbol_hasDisassembly = new H.Symbol0("hasDisassembly");
+C.Symbol_hasNoAllocations = new H.Symbol0("hasNoAllocations");
+C.Symbol_hashLinkWorkaround = new H.Symbol0("hashLinkWorkaround");
+C.Symbol_hits = new H.Symbol0("hits");
+C.Symbol_hoverText = new H.Symbol0("hoverText");
+C.Symbol_human = new H.Symbol0("human");
+C.Symbol_idle = new H.Symbol0("idle");
+C.Symbol_imp = new H.Symbol0("imp");
+C.Symbol_imports = new H.Symbol0("imports");
+C.Symbol_instruction = new H.Symbol0("instruction");
+C.Symbol_instructions = new H.Symbol0("instructions");
+C.Symbol_interface = new H.Symbol0("interface");
+C.Symbol_interfaces = new H.Symbol0("interfaces");
+C.Symbol_ioEnabled = new H.Symbol0("ioEnabled");
+C.Symbol_isAbstract = new H.Symbol0("isAbstract");
+C.Symbol_isBool = new H.Symbol0("isBool");
+C.Symbol_isComment = new H.Symbol0("isComment");
+C.Symbol_isConst = new H.Symbol0("isConst");
+C.Symbol_isDartCode = new H.Symbol0("isDartCode");
+C.Symbol_isDouble = new H.Symbol0("isDouble");
+C.Symbol_isError = new H.Symbol0("isError");
+C.Symbol_isFinalized = new H.Symbol0("isFinalized");
+C.Symbol_isImplemented = new H.Symbol0("isImplemented");
+C.Symbol_isInstance = new H.Symbol0("isInstance");
+C.Symbol_isInt = new H.Symbol0("isInt");
+C.Symbol_isList = new H.Symbol0("isList");
+C.Symbol_isNull = new H.Symbol0("isNull");
+C.Symbol_isOptimized = new H.Symbol0("isOptimized");
+C.Symbol_isPatch = new H.Symbol0("isPatch");
+C.Symbol_isPipe = new H.Symbol0("isPipe");
+C.Symbol_isString = new H.Symbol0("isString");
+C.Symbol_isType = new H.Symbol0("isType");
+C.Symbol_isUnexpected = new H.Symbol0("isUnexpected");
+C.Symbol_isolates = new H.Symbol0("isolates");
+C.Symbol_jumpTarget = new H.Symbol0("jumpTarget");
+C.Symbol_lastTokenPos = new H.Symbol0("lastTokenPos");
+C.Symbol_lastUpdate = new H.Symbol0("lastUpdate");
+C.Symbol_lib = new H.Symbol0("lib");
+C.Symbol_libraries = new H.Symbol0("libraries");
+C.Symbol_line = new H.Symbol0("line");
+C.Symbol_lineNumber = new H.Symbol0("lineNumber");
+C.Symbol_lineNumbers = new H.Symbol0("lineNumbers");
+C.Symbol_listening = new H.Symbol0("listening");
+C.Symbol_loading = new H.Symbol0("loading");
+C.Symbol_localAddress = new H.Symbol0("localAddress");
+C.Symbol_localPort = new H.Symbol0("localPort");
+C.Symbol_mainPort = new H.Symbol0("mainPort");
+C.Symbol_message = new H.Symbol0("message");
+C.Symbol_mouseOut = new H.Symbol0("mouseOut");
+C.Symbol_mouseOver = new H.Symbol0("mouseOver");
+C.Symbol_name = new H.Symbol0("name");
+C.Symbol_nameIsEmpty = new H.Symbol0("nameIsEmpty");
+C.Symbol_newSpace = new H.Symbol0("newSpace");
+C.Symbol_noSuchMethod = new H.Symbol0("noSuchMethod");
+C.Symbol_objectClass = new H.Symbol0("objectClass");
+C.Symbol_objectPool = new H.Symbol0("objectPool");
+C.Symbol_oldSpace = new H.Symbol0("oldSpace");
+C.Symbol_padding = new H.Symbol0("padding");
+C.Symbol_pause = new H.Symbol0("pause");
+C.Symbol_pauseEvent = new H.Symbol0("pauseEvent");
+C.Symbol_pid = new H.Symbol0("pid");
+C.Symbol_protocol = new H.Symbol0("protocol");
+C.Symbol_reachable = new H.Symbol0("reachable");
+C.Symbol_readClosed = new H.Symbol0("readClosed");
+C.Symbol_refresh = new H.Symbol0("refresh");
+C.Symbol_refreshCoverage = new H.Symbol0("refreshCoverage");
+C.Symbol_refreshGC = new H.Symbol0("refreshGC");
+C.Symbol_registerCallback = new H.Symbol0("registerCallback");
+C.Symbol_relativeLink = new H.Symbol0("relativeLink");
+C.Symbol_remoteAddress = new H.Symbol0("remoteAddress");
+C.Symbol_remotePort = new H.Symbol0("remotePort");
+C.Symbol_resetAccumulator = new H.Symbol0("resetAccumulator");
+C.Symbol_response = new H.Symbol0("response");
+C.Symbol_resume = new H.Symbol0("resume");
+C.Symbol_retainedSize = new H.Symbol0("retainedSize");
+C.Symbol_retainingPath = new H.Symbol0("retainingPath");
+C.Symbol_rootLib = new H.Symbol0("rootLib");
+C.Symbol_row = new H.Symbol0("row");
+C.Symbol_rows = new H.Symbol0("rows");
+C.Symbol_running = new H.Symbol0("running");
+C.Symbol_scripts = new H.Symbol0("scripts");
+C.Symbol_selectExpr = new H.Symbol0("selectExpr");
+C.Symbol_serviceType = new H.Symbol0("serviceType");
+C.Symbol_socketOwner = new H.Symbol0("socketOwner");
+C.Symbol_stacktrace = new H.Symbol0("stacktrace");
+C.Symbol_styleForHits = new H.Symbol0("styleForHits");
+C.Symbol_subClasses = new H.Symbol0("subClasses");
+C.Symbol_subclass = new H.Symbol0("subclass");
+C.Symbol_superClass = new H.Symbol0("superClass");
+C.Symbol_tipExclusive = new H.Symbol0("tipExclusive");
+C.Symbol_tipKind = new H.Symbol0("tipKind");
+C.Symbol_tipParent = new H.Symbol0("tipParent");
+C.Symbol_tipTicks = new H.Symbol0("tipTicks");
+C.Symbol_tipTime = new H.Symbol0("tipTime");
+C.Symbol_toggleExpand = new H.Symbol0("toggleExpand");
+C.Symbol_toggleExpanded = new H.Symbol0("toggleExpanded");
+C.Symbol_tokenPos = new H.Symbol0("tokenPos");
+C.Symbol_topFrame = new H.Symbol0("topFrame");
+C.Symbol_totalCollectionTimeInSeconds = new H.Symbol0("totalCollectionTimeInSeconds");
+C.Symbol_totalSamplesInProfile = new H.Symbol0("totalSamplesInProfile");
+C.Symbol_tree = new H.Symbol0("tree");
+C.Symbol_typeChecksEnabled = new H.Symbol0("typeChecksEnabled");
+C.Symbol_updateLineMode = new H.Symbol0("updateLineMode");
+C.Symbol_uptime = new H.Symbol0("uptime");
+C.Symbol_url = new H.Symbol0("url");
+C.Symbol_used = new H.Symbol0("used");
+C.Symbol_v = new H.Symbol0("v");
+C.Symbol_value = new H.Symbol0("value");
+C.Symbol_variable = new H.Symbol0("variable");
+C.Symbol_variables = new H.Symbol0("variables");
+C.Symbol_version = new H.Symbol0("version");
+C.Symbol_vmName = new H.Symbol0("vmName");
+C.Symbol_writeClosed = new H.Symbol0("writeClosed");
+C.Type_0e9 = H.createRuntimeType('ScriptViewElement');
+C.Type_2jN = H.createRuntimeType('CodeRefElement');
+C.Type_4IJ = H.createRuntimeType('FieldViewElement');
+C.Type_4m4 = H.createRuntimeType('IOSocketListViewElement');
+C.Type_61d = H.createRuntimeType('IOSocketViewElement');
+C.Type_6L0 = H.createRuntimeType('Uint8List');
+C.Type_7g3 = H.createRuntimeType('FlagItemElement');
+C.Type_8Gl = H.createRuntimeType('IsolateSharedSummaryElement');
+C.Type_8KD = H.createRuntimeType('IOProcessListViewElement');
+C.Type_8cK = H.createRuntimeType('IORandomAccessFileViewElement');
+C.Type_8eb = H.createRuntimeType('EvalBoxElement');
+C.Type_9ur = H.createRuntimeType('NavControlElement');
+C.Type_AD4 = H.createRuntimeType('NavMenuItemElement');
+C.Type_AHF = H.createRuntimeType('IOProcessViewElement');
+C.Type_AHF0 = H.createRuntimeType('NativeTypedArray');
+C.Type_Art = H.createRuntimeType('Float32List');
+C.Type_AyI = H.createRuntimeType('IOWebSocketViewElement');
+C.Type_Aym = H.createRuntimeType('CodeViewElement');
+C.Type_B8J = H.createRuntimeType('IOSocketRefElement');
+C.Type_C7R = H.createRuntimeType('TopNavMenuElement');
+C.Type_CAk = H.createRuntimeType('Uint16List');
+C.Type_E0k = H.createRuntimeType('VMViewElement');
+C.Type_ECh = H.createRuntimeType('IsolateLocationElement');
+C.Type_EOZ = H.createRuntimeType('_M1');
+C.Type_EQs = H.createRuntimeType('GlobalEventHandlers');
+C.Type_ES1 = H.createRuntimeType('IsolateRefElement');
+C.Type_EVD = H.createRuntimeType('InstanceRefElement');
+C.Type_Eue = H.createRuntimeType('VMRefElement');
+C.Type_FKd = H.createRuntimeType('ServiceErrorViewElement');
+C.Type_GNh = H.createRuntimeType('_M0');
+C.Type_HqF = H.createRuntimeType('Object');
+C.Type_I2I = H.createRuntimeType('PolymerElement');
+C.Type_IuH = H.createRuntimeType('IORandomAccessFileListViewElement');
+C.Type_JFX = H.createRuntimeType('ClassNavMenuElement');
+C.Type_Jcu = H.createRuntimeType('StackFrameElement');
+C.Type_JmU = H.createRuntimeType('IORefElement');
+C.Type_KMd = H.createRuntimeType('NavMenuElement');
+C.Type_Kyy = H.createRuntimeType('JsonViewElement');
+C.Type_L9j = H.createRuntimeType('IOHttpServerConnectionViewElement');
+C.Type_LV6 = H.createRuntimeType('HeapProfileElement');
+C.Type_M6L = H.createRuntimeType('IOHttpServerViewElement');
+C.Type_MUU = H.createRuntimeType('IOWebSocketRefElement');
+C.Type_Mu6 = H.createRuntimeType('ServiceObjectViewElement');
+C.Type_NlB = H.createRuntimeType('NativeTypedArrayOfDouble');
+C.Type_Npb = H.createRuntimeType('ErrorViewElement');
+C.Type_O5a = H.createRuntimeType('ClassViewElement');
+C.Type_ON8 = H.createRuntimeType('BreakpointListElement');
+C.Type_QuW = H.createRuntimeType('Uint8ClampedList');
+C.Type_QyU = H.createRuntimeType('WindowEventHandlers');
+C.Type_SoB = H.createRuntimeType('HeapMapElement');
+C.Type_Sxn = H.createRuntimeType('NavRefreshElement');
+C.Type_TEn = H.createRuntimeType('IOViewElement');
+C.Type_UJT = H.createRuntimeType('ServiceRefElement');
+C.Type_UoK = H.createRuntimeType('Int16List');
+C.Type_XXD = H.createRuntimeType('JSObject');
+C.Type_YgH = H.createRuntimeType('ObservatoryApplicationElement');
+C.Type_ZKG = H.createRuntimeType('IsolateViewElement');
+C.Type_a1Y = H.createRuntimeType('ScriptInsetElement');
+C.Type_aAD = H.createRuntimeType('IsolateRunStateElement');
+C.Type_bDN = H.createRuntimeType('FunctionViewElement');
+C.Type_cOY = H.createRuntimeType('IsolateProfileElement');
+C.Type_ckn = H.createRuntimeType('Float64List');
+C.Type_cop = H.createRuntimeType('CurlyBlockElement');
+C.Type_dRp = H.createRuntimeType('ClassTreeElement');
+C.Type_dTZ = H.createRuntimeType('Int32List');
+C.Type_dVs = H.createRuntimeType('DateTime');
+C.Type_eZO = H.createRuntimeType('Null');
+C.Type_f1j = H.createRuntimeType('FlagListElement');
+C.Type_gg4 = H.createRuntimeType('IOWebSocketListViewElement');
+C.Type_gqS = H.createRuntimeType('InstanceViewElement');
+C.Type_i7j = H.createRuntimeType('IOHttpServerRefElement');
+C.Type_iL9 = H.createRuntimeType('IsolateSummaryElement');
+C.Type_irB = H.createRuntimeType('Uint32List');
+C.Type_kA7 = H.createRuntimeType('ActionLinkElement');
+C.Type_kuc = H.createRuntimeType('SlidingCheckboxElement');
+C.Type_mWg = H.createRuntimeType('IORandomAccessFileRefElement');
+C.Type_mp3 = H.createRuntimeType('Int8List');
+C.Type_mpV = H.createRuntimeType('LibraryRefElement');
+C.Type_nV5 = H.createRuntimeType('NavBarElement');
+C.Type_nVV = H.createRuntimeType('StackTraceElement');
+C.Type_oGP = H.createRuntimeType('ByteData');
+C.Type_ohY = H.createRuntimeType('FieldRefElement');
+C.Type_oyU = H.createRuntimeType('_M2');
+C.Type_p2P = H.createRuntimeType('EvalLinkElement');
+C.Type_qMZ = H.createRuntimeType('IOProcessRefElement');
+C.Type_ql8 = H.createRuntimeType('ClassRefElement');
+C.Type_qph = H.createRuntimeType('LibraryViewElement');
+C.Type_qq1 = H.createRuntimeType('$double');
+C.Type_s2l = H.createRuntimeType('LibraryNavMenuElement');
+C.Type_s8b = H.createRuntimeType('AutoBindingElement');
+C.Type_sRP = H.createRuntimeType('ObservatoryElement');
+C.Type_uIL = H.createRuntimeType('IOHttpServerConnectionRefElement');
+C.Type_wAg = H.createRuntimeType('ByteBuffer');
+C.Type_wBh = H.createRuntimeType('ScriptRefElement');
+C.Type_wOW = H.createRuntimeType('NativeTypedArrayOfInt');
+C.Type_wT1 = H.createRuntimeType('IsolateCounterChartElement');
+C.Type_wgH = H.createRuntimeType('FunctionRefElement');
+C.Type_wsa = H.createRuntimeType('IsolateNavMenuElement');
+C.Type_xM7 = H.createRuntimeType('num');
+C.Type_y1j = H.createRuntimeType('ServiceExceptionViewElement');
+C.Type_yvP = H.createRuntimeType('IOHttpServerListViewElement');
+C.Utf8Codec_false = new P.Utf8Codec(false);
+$.libraries_to_load = {};
+$.RawReceivePortImpl__nextFreeId = 1;
+$.Primitives_mirrorFunctionCacheName = "$cachedFunction";
+$.Primitives_mirrorInvokeCacheName = "$cachedInvocation";
+$.Closure_functionCounter = 0;
+$.BoundClosure_selfFieldNameCache = null;
+$.BoundClosure_receiverFieldNameCache = null;
+$.RuntimeFunctionType_inAssert = false;
+$.getTagFunction = null;
+$.alternateTagFunction = null;
+$.prototypeForTagFunction = null;
+$.dispatchRecordsForInstanceTags = null;
+$.interceptorsForUncacheableTags = null;
+$.initNativeDispatchFlag = null;
+$.location = null;
+$.GoogleChart__api = null;
+$.printToZone = null;
+$._nextCallback = null;
+$._lastCallback = null;
+$.Zone__current = C.C__RootZone;
+$.Expando__keyCount = 0;
+$.Device__isOpera = null;
+$.Device__isWebKit = null;
+$.hierarchicalLoggingEnabled = false;
+$._rootLevel = C.Level_INFO_800;
+$.LogRecord__nextNumber = 0;
+$._allObservablesCount = 0;
+$._allObservables = null;
+$._delivering = false;
+$._Observer__nextBirthId = 0;
+$._ObservedSet__lastSet = null;
+$._deployMode = false;
+$._startPolymerCalled = false;
+$.initializers = null;
+$.deployMode = true;
+$.ServiceMap_objectIdRingPrefix = "objects/";
+$.TemplateBindExtension__initStyles = null;
+$.TemplateBindExtension__initBaseUriWorkaround = null;
+$.enableBindingsReflection = false;
+$.mapTypeToInterceptor = [C.Type_fPs, W.HtmlElement, {}, C.Type_0e9, U.ScriptViewElement, {created: U.ScriptViewElement$created}, C.Type_2jN, O.CodeRefElement, {created: O.CodeRefElement$created}, C.Type_4IJ, A.FieldViewElement, {created: A.FieldViewElement$created}, C.Type_4m4, E.IOSocketListViewElement, {created: E.IOSocketListViewElement$created}, C.Type_61d, E.IOSocketViewElement, {created: E.IOSocketViewElement$created}, C.Type_7g3, X.FlagItemElement, {created: X.FlagItemElement$created}, C.Type_8Gl, D.IsolateSharedSummaryElement, {created: D.IsolateSharedSummaryElement$created}, C.Type_8KD, E.IOProcessListViewElement, {created: E.IOProcessListViewElement$created}, C.Type_8cK, E.IORandomAccessFileViewElement, {created: E.IORandomAccessFileViewElement$created}, C.Type_8eb, L.EvalBoxElement, {created: L.EvalBoxElement$created}, C.Type_9ur, A.NavControlElement, {created: A.NavControlElement$created}, C.Type_AD4, A.NavMenuItemElement, {created: A.NavMenuItemElement$created}, C.Type_AHF, E.IOProcessViewElement, {created: E.IOProcessViewElement$created}, C.Type_AHF0, H.NativeTypedArray, {"": H.NativeTypedArray$}, C.Type_AyI, E.IOWebSocketViewElement, {created: E.IOWebSocketViewElement$created}, C.Type_Aym, F.CodeViewElement, {created: F.CodeViewElement$created}, C.Type_B8J, E.IOSocketRefElement, {created: E.IOSocketRefElement$created}, C.Type_C7R, A.TopNavMenuElement, {created: A.TopNavMenuElement$created}, C.Type_E0k, U.VMViewElement, {created: U.VMViewElement$created}, C.Type_ECh, D.IsolateLocationElement, {created: D.IsolateLocationElement$created}, C.Type_EQs, W.GlobalEventHandlers, {}, C.Type_ES1, N.IsolateRefElement, {created: N.IsolateRefElement$created}, C.Type_EVD, B.InstanceRefElement, {created: B.InstanceRefElement$created}, C.Type_Eue, X.VMRefElement, {created: X.VMRefElement$created}, C.Type_FKd, R.ServiceErrorViewElement, {created: R.ServiceErrorViewElement$created}, C.Type_I2I, A.PolymerElement, {created: A.PolymerElement$created}, C.Type_IuH, E.IORandomAccessFileListViewElement, {created: E.IORandomAccessFileListViewElement$created}, C.Type_JFX, A.ClassNavMenuElement, {created: A.ClassNavMenuElement$created}, C.Type_Jcu, K.StackFrameElement, {created: K.StackFrameElement$created}, C.Type_JmU, E.IORefElement, {created: E.IORefElement$created}, C.Type_KMd, A.NavMenuElement, {created: A.NavMenuElement$created}, C.Type_Kyy, Z.JsonViewElement, {created: Z.JsonViewElement$created}, C.Type_L9j, E.IOHttpServerConnectionViewElement, {created: E.IOHttpServerConnectionViewElement$created}, C.Type_LV6, K.HeapProfileElement, {created: K.HeapProfileElement$created}, C.Type_M6L, E.IOHttpServerViewElement, {created: E.IOHttpServerViewElement$created}, C.Type_MUU, E.IOWebSocketRefElement, {created: E.IOWebSocketRefElement$created}, C.Type_Mu6, U.ServiceObjectViewElement, {created: U.ServiceObjectViewElement$created}, C.Type_NlB, H.NativeTypedArrayOfDouble, {"": H.NativeTypedArrayOfDouble$}, C.Type_Npb, F.ErrorViewElement, {created: F.ErrorViewElement$created}, C.Type_O5a, Z.ClassViewElement, {created: Z.ClassViewElement$created}, C.Type_ON8, B.BreakpointListElement, {created: B.BreakpointListElement$created}, C.Type_QyU, W.WindowEventHandlers, {}, C.Type_SoB, O.HeapMapElement, {created: O.HeapMapElement$created}, C.Type_Sxn, A.NavRefreshElement, {created: A.NavRefreshElement$created}, C.Type_TEn, E.IOViewElement, {created: E.IOViewElement$created}, C.Type_UJT, Q.ServiceRefElement, {created: Q.ServiceRefElement$created}, C.Type_YgH, V.ObservatoryApplicationElement, {created: V.ObservatoryApplicationElement$created}, C.Type_ZKG, L.IsolateViewElement, {created: L.IsolateViewElement$created}, C.Type_a1Y, T.ScriptInsetElement, {created: T.ScriptInsetElement$created}, C.Type_aAD, D.IsolateRunStateElement, {created: D.IsolateRunStateElement$created}, C.Type_bDN, N.FunctionViewElement, {created: N.FunctionViewElement$created}, C.Type_cOY, X.IsolateProfileElement, {created: X.IsolateProfileElement$created}, C.Type_cop, R.CurlyBlockElement, {created: R.CurlyBlockElement$created}, C.Type_dRp, O.ClassTreeElement, {created: O.ClassTreeElement$created}, C.Type_f1j, X.FlagListElement, {created: X.FlagListElement$created}, C.Type_gg4, E.IOWebSocketListViewElement, {created: E.IOWebSocketListViewElement$created}, C.Type_gqS, Z.InstanceViewElement, {created: Z.InstanceViewElement$created}, C.Type_i7j, E.IOHttpServerRefElement, {created: E.IOHttpServerRefElement$created}, C.Type_iL9, D.IsolateSummaryElement, {created: D.IsolateSummaryElement$created}, C.Type_kA7, X.ActionLinkElement, {created: X.ActionLinkElement$created}, C.Type_kuc, Q.SlidingCheckboxElement, {created: Q.SlidingCheckboxElement$created}, C.Type_mWg, E.IORandomAccessFileRefElement, {created: E.IORandomAccessFileRefElement$created}, C.Type_mpV, R.LibraryRefElement, {created: R.LibraryRefElement$created}, C.Type_nV5, A.NavBarElement, {created: A.NavBarElement$created}, C.Type_nVV, X.StackTraceElement, {created: X.StackTraceElement$created}, C.Type_ohY, D.FieldRefElement, {created: D.FieldRefElement$created}, C.Type_p2P, R.EvalLinkElement, {created: R.EvalLinkElement$created}, C.Type_qMZ, E.IOProcessRefElement, {created: E.IOProcessRefElement$created}, C.Type_ql8, Q.ClassRefElement, {created: Q.ClassRefElement$created}, C.Type_qph, M.LibraryViewElement, {created: M.LibraryViewElement$created}, C.Type_s2l, A.LibraryNavMenuElement, {created: A.LibraryNavMenuElement$created}, C.Type_s8b, Y.AutoBindingElement, {created: Y.AutoBindingElement$created}, C.Type_sRP, Z.ObservatoryElement, {created: Z.ObservatoryElement$created}, C.Type_uIL, E.IOHttpServerConnectionRefElement, {created: E.IOHttpServerConnectionRefElement$created}, C.Type_wBh, A.ScriptRefElement, {created: A.ScriptRefElement$created}, C.Type_wOW, H.NativeTypedArrayOfInt, {"": H.NativeTypedArrayOfInt$}, C.Type_wT1, D.IsolateCounterChartElement, {created: D.IsolateCounterChartElement$created}, C.Type_wgH, U.FunctionRefElement, {created: U.FunctionRefElement$created}, C.Type_wsa, A.IsolateNavMenuElement, {created: A.IsolateNavMenuElement$created}, C.Type_y1j, D.ServiceExceptionViewElement, {created: D.ServiceExceptionViewElement$created}, C.Type_yvP, E.IOHttpServerListViewElement, {created: E.IOHttpServerListViewElement$created}];
+Isolate.$lazy($, "globalThis", "globalThis", "get$globalThis", function() {
+  return function() {
+    return this;
+  }();
+});
+Isolate.$lazy($, "globalWindow", "globalWindow", "get$globalWindow", function() {
+  return $.get$globalThis().window;
+});
+Isolate.$lazy($, "globalWorker", "globalWorker", "get$globalWorker", function() {
+  return $.get$globalThis().Worker;
+});
+Isolate.$lazy($, "globalPostMessageDefined", "globalPostMessageDefined", "get$globalPostMessageDefined", function() {
+  return $.get$globalThis().postMessage !== void 0;
+});
+Isolate.$lazy($, "thisScript", "IsolateNatives_thisScript", "get$IsolateNatives_thisScript", function() {
+  return H.IsolateNatives_computeThisScript();
+});
+Isolate.$lazy($, "workerIds", "IsolateNatives_workerIds", "get$IsolateNatives_workerIds", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [P.$int]);
+});
+Isolate.$lazy($, "noSuchMethodPattern", "TypeErrorDecoder_noSuchMethodPattern", "get$TypeErrorDecoder_noSuchMethodPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({toString: function() {
+      return "$receiver$";
+    }}));
+});
+Isolate.$lazy($, "notClosurePattern", "TypeErrorDecoder_notClosurePattern", "get$TypeErrorDecoder_notClosurePattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({$method$: null, toString: function() {
+      return "$receiver$";
+    }}));
+});
+Isolate.$lazy($, "nullCallPattern", "TypeErrorDecoder_nullCallPattern", "get$TypeErrorDecoder_nullCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(null));
+});
+Isolate.$lazy($, "nullLiteralCallPattern", "TypeErrorDecoder_nullLiteralCallPattern", "get$TypeErrorDecoder_nullLiteralCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    var $argumentsExpr$ = '$arguments$';
+    try {
+      null.$method$($argumentsExpr$);
+    } catch (e) {
+      return e.message;
+    }
 
-init.functionAliases={Sa:209}
-init.metadata=["sender","e","event","uri","onError",{func:"pd",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:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.mE]},,"error","stackTrace",{func:"pA",void:true,args:[P.dl,P.AN,P.dl,null,P.mE]},"self","parent","zone",{func:"QN",args:[P.dl,P.AN,P.dl,{func:"NT"}]},"f",{func:"wD",args:[P.dl,P.AN,P.dl,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.AN,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.AN,P.dl,{func:"NT"}]},{func:"v7",ret:{func:"aB",args:[null]},args:[P.dl,P.AN,P.dl,{func:"aB",args:[null]}]},{func:"Gt",ret:{func:"bh",args:[null,null]},args:[P.dl,P.AN,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.AN,P.dl,{func:"NT"}]},{func:"zo",ret:P.Xa,args:[P.dl,P.AN,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Xg",void:true,args:[P.dl,P.AN,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Jj",ret:P.dl,args:[P.dl,P.AN,P.dl,P.Ob,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:"P2",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",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:"VH",ret:P.a2,args:[P.GD]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable","invocation",{func:"NT"},{func:"rz",args:[P.EH]},"code","msg","errorMessage","message","key","val",{func:"bh",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c","obj","i",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"f4",void:true,args:[W.f5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Df",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"aK",ret:[P.b8,D.af],args:[null]},"dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.mE]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.mE]},{func:"N5",void:true,args:[null,P.mE]},"each","k",{func:"lv",args:[P.GD,null]},{func:"nY",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Dt",ret:P.KN,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"QO",void:true,args:[W.AjY]},"result",{func:"jH",args:[D.af]},{func:"Rb",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Yi",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"MG",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW2",ret:P.QV,args:[P.qU]}]},"s",{func:"S0",void:true,args:[P.a2,null]},"expand","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"Fe",void:true,args:[W.AjY,null,W.h4]},{func:"If",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"xc",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.AN,P.dl]},{func:"h2",args:[P.dl,P.AN,P.dl,{func:"aB",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"K7",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.Ap]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"MJ",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.hw,U.hw]},{func:"Qc",args:[U.hw]},"hits","map",{func:"JC",args:[V.qC]},"id",{func:"rl",ret:P.b8},"coverage",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"ze",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","scriptCoverage","timer",{func:"I6a",ret:P.qU},{func:"xA",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func","request",{func:"c3A",args:[W.fJ]},"details","ref",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"nl",void:true,args:[W.Aj]},{func:"en",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"VT",ret:P.b8,args:[P.qU]},];$=null
-I = I.$finishIsolateConstructor(I)
-$=new I()
-function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
-new MyClass()
-return a}
-A = convertToFastObject(A)
-B = convertToFastObject(B)
-C = convertToFastObject(C)
-D = convertToFastObject(D)
-E = convertToFastObject(E)
-F = convertToFastObject(F)
-G = convertToFastObject(G)
-H = convertToFastObject(H)
-J = convertToFastObject(J)
-K = convertToFastObject(K)
-L = convertToFastObject(L)
-M = convertToFastObject(M)
-N = convertToFastObject(N)
-O = convertToFastObject(O)
-P = convertToFastObject(P)
-Q = convertToFastObject(Q)
-R = convertToFastObject(R)
-S = convertToFastObject(S)
-T = convertToFastObject(T)
-U = convertToFastObject(U)
-V = convertToFastObject(V)
-W = convertToFastObject(W)
-X = convertToFastObject(X)
-Y = convertToFastObject(Y)
-Z = convertToFastObject(Z)
-!function(){function intern(a){var u={}
-u[a]=1
-return Object.keys(convertToFastObject(u))[0]}init.getIsolateTag=function(a){return intern("___dart_"+a+init.isolateTag)}
-var z="___dart_isolate_tags_"
-var y=Object[z]||(Object[z]=Object.create(null))
-var x="_ZxYxX"
-for(var w=0;;w++){var v=intern(x+"_"+w+"_")
-if(!(v in y)){y[v]=1
-init.isolateTag=v
-break}}}()
-init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
-;(function(a){if(typeof document==="undefined"){a(null)
-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.V7(),b)},[])}else{(function(b){H.wW(E.V7(),b)})([])}})
-function init(){I.p={}
-function generateAccessor(a,b,c){var y=a.split("-")
-var x=y[0]
-var w=x.length
-var v=x.charCodeAt(w-1)
-var u
-if(y.length>1)u=true
-else u=false
-v=v>=60&&v<=64?v-59:v>=123&&v<=126?v-117:v>=37&&v<=43?v-27:0
-if(v){var t=v&3
-var s=v>>2
-var r=x=x.substring(0,w-1)
-var q=x.indexOf(":")
-if(q>0){r=x.substring(0,q)
-x=x.substring(q+1)}if(t){var p=t&2?"r":""
-var o=t&1?"this":"r"
-var n="return "+o+"."+x
-var m=c+".prototype.g"+r+"="
-var l="function("+p+"){"+n+"}"
-if(u)b.push(m+"$reflectable("+l+");\n")
-else b.push(m+l+";\n")}if(s){var p=s&2?"r,v":"v"
-var o=s&1?"this":"r"
-var n=o+"."+x+"=v"
-var m=c+".prototype.s"+r+"="
-var l="function("+p+"){"+n+"}"
-if(u)b.push(m+"$reflectable("+l+");\n")
-else b.push(m+l+";\n")}}return x}I.p.$generateAccessor=generateAccessor
-function defineClass(a,b,c){var y=[]
-var x="function "+b+"("
-var w=""
-for(var v=0;v<c.length;v++){if(v!=0)x+=", "
-var u=generateAccessor(c[v],y,b)
-var t="parameter_"+u
-x+=t
-w+="this."+u+" = "+t+";\n"}x+=") {\n"+w+"}\n"
-x+=b+".builtin$cls=\""+a+"\";\n"
-x+="$desc=$collectedClasses."+b+";\n"
-x+="if($desc instanceof Array) $desc = $desc[1];\n"
-x+=b+".prototype = $desc;\n"
-if(typeof defineClass.name!="string"){x+=b+".name=\""+b+"\";\n"}x+=y.join("")
-return x}var z=function(){function tmp(){}var y=Object.prototype.hasOwnProperty
-return function(a,b){tmp.prototype=b.prototype
-var x=new tmp()
-var w=a.prototype
-for(var v in w)if(y.call(w,v))x[v]=w[v]
-x.constructor=a
-a.prototype=x
-return x}}()
-I.$finishClasses=function(a,b,c){var y={}
-if(!init.allClasses)init.allClasses={}
-var x=init.allClasses
-var w=Object.prototype.hasOwnProperty
-if(typeof dart_precompiled=="function"){var v=dart_precompiled(a)}else{var u="function $reflectable(fn){fn.$reflectable=1;return fn};\n"+"var $desc;\n"
-var t=[]}for(var s in a){if(w.call(a,s)){var r=a[s]
-if(r instanceof Array)r=r[1]
-var q=r["^"],p,o=s,n=q
-if(typeof q=="string"){var m=q.split("/")
-if(m.length==2){o=m[0]
-n=m[1]}}var l=n.split(";")
-n=l[1]==""?[]:l[1].split(",")
-p=l[0]
-m=p.split(":")
-if(m.length==2){p=m[0]
-var k=m[1]
-if(k)r.$signature=function(d){return function(){return init.metadata[d]}}(k)}if(p&&p.indexOf("+")>0){l=p.split("+")
-p=l[0]
-var j=a[l[1]]
-if(j instanceof Array)j=j[1]
-for(var i in j){if(w.call(j,i)&&!w.call(r,i))r[i]=j[i]}}if(typeof dart_precompiled!="function"){u+=defineClass(o,s,n)
-t.push(s)}if(p)y[s]=p}}if(typeof dart_precompiled!="function"){u+="return [\n  "+t.join(",\n  ")+"\n]"
-var v=new Function("$collectedClasses",u)(a)
-u=null}for(var h=0;h<v.length;h++){var g=v[h]
-var s=g.name
-var r=a[s]
-var f=b
-if(r instanceof Array){f=r[0]||b
-r=r[1]}x[s]=g
-f[s]=g}v=null
-var e={}
-init.interceptorsByTag=Object.create(null)
-init.leafTags={}
-function finishClass(a9){var d=Object.prototype.hasOwnProperty
-if(d.call(e,a9))return
-e[a9]=true
-var a0=y[a9]
-if(!a0||typeof a0!="string")return
-finishClass(a0)
-var a1=x[a9]
-var a2=x[a0]
-if(!a2)a2=c[a0]
-var a3=z(a1,a2)
-if(d.call(a3,"%")){var a4=a3["%"].split(";")
-if(a4[0]){var a5=a4[0].split("|")
-for(var a6=0;a6<a5.length;a6++){init.interceptorsByTag[a5[a6]]=a1
-init.leafTags[a5[a6]]=true}}if(a4[1]){a5=a4[1].split("|")
-if(a4[2]){var a7=a4[2].split("|")
-for(var a6=0;a6<a7.length;a6++){var a8=x[a7[a6]]
-a8.$nativeSuperclassTag=a5[0]}}for(a6=0;a6<a5.length;a6++){init.interceptorsByTag[a5[a6]]=a1
-init.leafTags[a5[a6]]=false}}}}for(var s in y)finishClass(s)}
-I.$lazy=function(a,b,c,d,e){var y={}
-var x={}
-a[c]=y
-a[d]=function(){var w=$[c]
-try{if(w===y){$[c]=x
-try{w=$[c]=e()}finally{if(w===y)if($[c]===x)$[c]=null}}else{if(w===x)H.ag(b)}return w}finally{$[d]=function(){return this[c]}}}}
-I.$finishIsolateConstructor=function(a){var y=a.p
-function Isolate(){var x=Object.prototype.hasOwnProperty
-for(var w in y)if(x.call(y,w))this[w]=y[w]
-function ForceEfficientMap(){}ForceEfficientMap.prototype=this
-new ForceEfficientMap()}Isolate.prototype=a.prototype
-Isolate.prototype.constructor=Isolate
-Isolate.p=y
-Isolate.$finishClasses=a.$finishClasses
-Isolate.uL=a.uL
-return Isolate}}
+  }());
+});
+Isolate.$lazy($, "undefinedCallPattern", "TypeErrorDecoder_undefinedCallPattern", "get$TypeErrorDecoder_undefinedCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(void 0));
+});
+Isolate.$lazy($, "undefinedLiteralCallPattern", "TypeErrorDecoder_undefinedLiteralCallPattern", "get$TypeErrorDecoder_undefinedLiteralCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    var $argumentsExpr$ = '$arguments$';
+    try {
+      (void 0).$method$($argumentsExpr$);
+    } catch (e) {
+      return e.message;
+    }
+
+  }());
+});
+Isolate.$lazy($, "nullPropertyPattern", "TypeErrorDecoder_nullPropertyPattern", "get$TypeErrorDecoder_nullPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(null));
+});
+Isolate.$lazy($, "nullLiteralPropertyPattern", "TypeErrorDecoder_nullLiteralPropertyPattern", "get$TypeErrorDecoder_nullLiteralPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    try {
+      null.$method$;
+    } catch (e) {
+      return e.message;
+    }
+
+  }());
+});
+Isolate.$lazy($, "undefinedPropertyPattern", "TypeErrorDecoder_undefinedPropertyPattern", "get$TypeErrorDecoder_undefinedPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(void 0));
+});
+Isolate.$lazy($, "undefinedLiteralPropertyPattern", "TypeErrorDecoder_undefinedLiteralPropertyPattern", "get$TypeErrorDecoder_undefinedLiteralPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    try {
+      (void 0).$method$;
+    } catch (e) {
+      return e.message;
+    }
+
+  }());
+});
+Isolate.$lazy($, "_completer", "GoogleChart__completer", "get$GoogleChart__completer", function() {
+  return H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+});
+Isolate.$lazy($, "scheduleImmediateClosure", "_AsyncRun_scheduleImmediateClosure", "get$_AsyncRun_scheduleImmediateClosure", function() {
+  return P._AsyncRun__initializeScheduleImmediate();
+});
+Isolate.$lazy($, "_nullFuture", "Future__nullFuture", "get$Future__nullFuture", function() {
+  return P._Future$immediate(null, null);
+});
+Isolate.$lazy($, "_toStringVisiting", "IterableBase__toStringVisiting", "get$IterableBase__toStringVisiting", function() {
+  return [];
+});
+Isolate.$lazy($, "webkitEvents", "ElementEvents_webkitEvents", "get$ElementEvents_webkitEvents", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal(["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);
+});
+Isolate.$lazy($, "context", "context", "get$context", function() {
+  return P._wrapToDart(function() {
+    return this;
+  }());
+});
+Isolate.$lazy($, "_DART_OBJECT_PROPERTY_NAME", "_DART_OBJECT_PROPERTY_NAME", "get$_DART_OBJECT_PROPERTY_NAME", function() {
+  return init.getIsolateTag("_$dart_dartObject");
+});
+Isolate.$lazy($, "_DART_CLOSURE_PROPERTY_NAME", "_DART_CLOSURE_PROPERTY_NAME", "get$_DART_CLOSURE_PROPERTY_NAME", function() {
+  return init.getIsolateTag("_$dart_dartClosure");
+});
+Isolate.$lazy($, "_dartProxyCtor", "_dartProxyCtor", "get$_dartProxyCtor", function() {
+  return function DartObject(o) {
+    this.o = o;
+  };
+});
+Isolate.$lazy($, "_freeColor", "HeapMapElement__freeColor", "get$HeapMapElement__freeColor", function() {
+  return [255, 255, 255, 255];
+});
+Isolate.$lazy($, "_pageSeparationColor", "HeapMapElement__pageSeparationColor", "get$HeapMapElement__pageSeparationColor", function() {
+  return [0, 0, 0, 255];
+});
+Isolate.$lazy($, "_loggers", "Logger__loggers", "get$Logger__loggers", function() {
+  return P.LinkedHashMap_LinkedHashMap$_empty(P.String, N.Logger);
+});
+Isolate.$lazy($, "_logger", "_logger", "get$_logger", function() {
+  return N.Logger_Logger("Observable.dirtyCheck");
+});
+Isolate.$lazy($, "_instance", "_InvalidPropertyPath__instance", "get$_InvalidPropertyPath__instance", function() {
+  return new L._InvalidPropertyPath([]);
+});
+Isolate.$lazy($, "_pathRegExp", "_pathRegExp", "get$_pathRegExp", function() {
+  return new L.closure7().call$0();
+});
+Isolate.$lazy($, "_logger", "_logger0", "get$_logger0", function() {
+  return N.Logger_Logger("observe.PathObserver");
+});
+Isolate.$lazy($, "_pathCache", "_pathCache", "get$_pathCache", function() {
+  return P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, L.PropertyPath);
+});
+Isolate.$lazy($, "_polymerSyntax", "PolymerDeclaration__polymerSyntax", "get$PolymerDeclaration__polymerSyntax", function() {
+  return new A.PolymerExpressions(T.PolymerExpressions$(null, C.C_ScopeFactory), null);
+});
+Isolate.$lazy($, "_typesByName", "_typesByName", "get$_typesByName", function() {
+  return P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Type);
+});
+Isolate.$lazy($, "_declarations", "_declarations", "get$_declarations", function() {
+  return P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, A.PolymerDeclaration);
+});
+Isolate.$lazy($, "_hasShadowDomPolyfill", "_hasShadowDomPolyfill", "get$_hasShadowDomPolyfill", function() {
+  return $.get$context().hasProperty$1("ShadowDOMPolyfill");
+});
+Isolate.$lazy($, "_ShadowCss", "_ShadowCss", "get$_ShadowCss", function() {
+  var t1 = $.get$_Platform();
+  return t1 != null ? J.$index$asx(t1, "ShadowCSS") : null;
+});
+Isolate.$lazy($, "_sheetLog", "_sheetLog", "get$_sheetLog", function() {
+  return N.Logger_Logger("polymer.stylesheet");
+});
+Isolate.$lazy($, "_changedMethodQueryOptions", "_changedMethodQueryOptions", "get$_changedMethodQueryOptions", function() {
+  return new A.QueryOptions(false, false, true, C.Type_fPs, false, true, null, A._isObserverMethod$closure());
+});
+Isolate.$lazy($, "_ATTRIBUTES_REGEX", "_ATTRIBUTES_REGEX", "get$_ATTRIBUTES_REGEX", function() {
+  return new H.JSSyntaxRegExp("\\s|,", H.JSSyntaxRegExp_makeNative("\\s|,", false, true, false), null, null);
+});
+Isolate.$lazy($, "_Platform", "_Platform", "get$_Platform", function() {
+  return J.$index$asx($.get$context(), "Platform");
+});
+Isolate.$lazy($, "bindPattern", "Polymer_bindPattern", "get$Polymer_bindPattern", function() {
+  return new H.JSSyntaxRegExp("\\{\\{([^{}]*)}}", H.JSSyntaxRegExp_makeNative("\\{\\{([^{}]*)}}", false, true, false), null, null);
+});
+Isolate.$lazy($, "_onReady", "Polymer__onReady", "get$Polymer__onReady", function() {
+  return H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+});
+Isolate.$lazy($, "_observeLog", "_observeLog", "get$_observeLog", function() {
+  return N.Logger_Logger("polymer.observe");
+});
+Isolate.$lazy($, "_eventsLog", "_eventsLog", "get$_eventsLog", function() {
+  return N.Logger_Logger("polymer.events");
+});
+Isolate.$lazy($, "_unbindLog", "_unbindLog", "get$_unbindLog", function() {
+  return N.Logger_Logger("polymer.unbind");
+});
+Isolate.$lazy($, "_bindLog", "_bindLog", "get$_bindLog", function() {
+  return N.Logger_Logger("polymer.bind");
+});
+Isolate.$lazy($, "_PolymerGestures", "_PolymerGestures", "get$_PolymerGestures", function() {
+  return J.$index$asx($.get$context(), "PolymerGestures");
+});
+Isolate.$lazy($, "_polymerElementProto", "_polymerElementProto", "get$_polymerElementProto", function() {
+  return new A.closure().call$0();
+});
+Isolate.$lazy($, "_typeHandlers", "_typeHandlers", "get$_typeHandlers", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal([C.Type_Ejg, new Z.closure0(), C.Type_eZO, new Z.closure1(), C.Type_dVs, new Z.closure2(), C.Type_EsU, new Z.closure3(), C.Type_SnA, new Z.closure4(), C.Type_qq1, new Z.closure5()], null, null);
+});
+Isolate.$lazy($, "_BINARY_OPERATORS", "_BINARY_OPERATORS", "get$_BINARY_OPERATORS", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal(["+", new K.closure14(), "-", new K.closure15(), "*", new K.closure16(), "/", new K.closure17(), "%", new K.closure18(), "==", new K.closure19(), "!=", new K.closure20(), "===", new K.closure21(), "!==", new K.closure22(), ">", new K.closure23(), ">=", new K.closure24(), "<", new K.closure25(), "<=", new K.closure26(), "||", new K.closure27(), "&&", new K.closure28(), "|", new K.closure29()], null, null);
+});
+Isolate.$lazy($, "_UNARY_OPERATORS", "_UNARY_OPERATORS", "get$_UNARY_OPERATORS", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal(["+", new K.closure11(), "-", new K.closure12(), "!", new K.closure13()], null, null);
+});
+Isolate.$lazy($, "_instance", "Closer__instance", "get$Closer__instance", function() {
+  return new K.Closer();
+});
+Isolate.$lazy($, "_currentIsolateMatcher", "VM__currentIsolateMatcher", "get$VM__currentIsolateMatcher", function() {
+  return new H.JSSyntaxRegExp("isolates/\\d+", H.JSSyntaxRegExp_makeNative("isolates/\\d+", false, true, false), null, null);
+});
+Isolate.$lazy($, "_currentObjectMatcher", "VM__currentObjectMatcher", "get$VM__currentObjectMatcher", function() {
+  return new H.JSSyntaxRegExp("isolates/\\d+/", H.JSSyntaxRegExp_makeNative("isolates/\\d+/", false, true, false), null, null);
+});
+Isolate.$lazy($, "objectAccessor", "objectAccessor", "get$objectAccessor", function() {
+  return D.throwNotConfiguredError();
+});
+Isolate.$lazy($, "typeInspector", "typeInspector", "get$typeInspector", function() {
+  return D.throwNotConfiguredError();
+});
+Isolate.$lazy($, "symbolConverter", "symbolConverter", "get$symbolConverter", function() {
+  return D.throwNotConfiguredError();
+});
+Isolate.$lazy($, "_DEFAULT", "BindingDelegate__DEFAULT", "get$BindingDelegate__DEFAULT", function() {
+  return new M.BindingDelegate(null);
+});
+Isolate.$lazy($, "_checkboxEventType", "_InputBinding__checkboxEventType", "get$_InputBinding__checkboxEventType", function() {
+  return new M.closure10().call$0();
+});
+Isolate.$lazy($, "_contentsOwner", "TemplateBindExtension__contentsOwner", "get$TemplateBindExtension__contentsOwner", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_ownerStagingDocument", "TemplateBindExtension__ownerStagingDocument", "get$TemplateBindExtension__ownerStagingDocument", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_allTemplatesSelectors", "TemplateBindExtension__allTemplatesSelectors", "get$TemplateBindExtension__allTemplatesSelectors", function() {
+  return "template, " + J.map$1$ax(C.Map_05eTF.get$keys(), new M.closure6()).join$1(0, ", ");
+});
+Isolate.$lazy($, "_templateObserver", "TemplateBindExtension__templateObserver", "get$TemplateBindExtension__templateObserver", function() {
+  return new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(H.convertDartClosureToJS(W._wrapBinaryZone(new M.closure8()), 2));
+});
+Isolate.$lazy($, "_emptyInstance", "_emptyInstance", "get$_emptyInstance", function() {
+  return new M.closure9().call$0();
+});
+Isolate.$lazy($, "_instanceExtension", "_instanceExtension", "get$_instanceExtension", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_isStagingDocument", "_isStagingDocument", "get$_isStagingDocument", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_expando", "_expando", "get$_expando", function() {
+  return H.setRuntimeTypeInfo(new P.Expando("template_binding"), [null]);
+});
+// Native classes
+
+init.functionAliases = {evalType: 209};
+;
+init.metadata = ["sender",
+"e",
+"event",
+"uri",
+"onError",
+{func: "dynamic__String", args: [P.String]},
+"closure",
+"isolate",
+"numberOfArguments",
+"arg1",
+"arg2",
+"arg3",
+"arg4",
+{func: "args1", args: [null]},
+"_",
+{func: "String__int", ret: P.String, args: [P.$int]},
+"bytes",
+{func: "String__dynamic", ret: P.String, args: [null]},
+{func: "void_", void: true},
+{func: "void__void_", void: true, args: [{func: "void_", void: true}]},
+{func: "void__dynamic", void: true, args: [null]},
+"value",
+{func: "void__dynamic__StackTrace", void: true, args: [null], opt: [P.StackTrace]},
+,
+"error",
+"stackTrace",
+{func: "void__Zone_ZoneDelegate_Zone_dynamic_StackTrace", void: true, args: [P.Zone, P.ZoneDelegate, P.Zone, null, P.StackTrace]},
+"self",
+"parent",
+"zone",
+{func: "dynamic__Zone_ZoneDelegate_Zone_args0", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args0"}]},
+"f",
+{func: "dynamic__Zone_ZoneDelegate_Zone_args1_dynamic", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args1", args: [null]}, null]},
+"arg",
+{func: "dynamic__Zone_ZoneDelegate_Zone_args2_dynamic_dynamic", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args2", args: [null, null]}, null, null]},
+{func: "ZoneCallback__Zone_ZoneDelegate_Zone_args0", ret: {func: "args0"}, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args0"}]},
+{func: "ZoneUnaryCallback__Zone_ZoneDelegate_Zone_args1", ret: {func: "args1", args: [null]}, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args1", args: [null]}]},
+{func: "ZoneBinaryCallback__Zone_ZoneDelegate_Zone_args2", ret: {func: "args2", args: [null, null]}, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args2", args: [null, null]}]},
+{func: "void__Zone_ZoneDelegate_Zone_args0", void: true, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args0"}]},
+{func: "Timer__Zone_ZoneDelegate_Zone_Duration_void_", ret: P.Timer, args: [P.Zone, P.ZoneDelegate, P.Zone, P.Duration, {func: "void_", void: true}]},
+"duration",
+"callback",
+{func: "void__Zone_ZoneDelegate_Zone_String", void: true, args: [P.Zone, P.ZoneDelegate, P.Zone, P.String]},
+{func: "void__String", void: true, args: [P.String]},
+{func: "Zone__Zone_ZoneDelegate_Zone_ZoneSpecification_Map", ret: P.Zone, args: [P.Zone, P.ZoneDelegate, P.Zone, P.ZoneSpecification, P.Map]},
+{func: "bool__dynamic_dynamic", ret: P.bool, args: [null, null]},
+"a",
+"b",
+{func: "int__dynamic", ret: P.$int, args: [null]},
+{func: "Object__dynamic", ret: P.Object, args: [null]},
+"object",
+{func: "int__Comparable_Comparable", ret: P.$int, args: [P.Comparable, P.Comparable]},
+{func: "bool__Object_Object", ret: P.bool, args: [P.Object, P.Object]},
+{func: "int__Object", ret: P.$int, args: [P.Object]},
+"receiver",
+{func: "args4", args: [null, null, null, null]},
+"name",
+"oldValue",
+"newValue",
+"captureThis",
+"arguments",
+"o",
+{func: "bool__Symbol", ret: P.bool, args: [P.Symbol]},
+"symbol",
+"v",
+"x",
+{func: "Iterable__Iterable", ret: [P.Iterable, K.IndexedValue], args: [P.Iterable]},
+"iterable",
+"invocation",
+{func: "args0"},
+{func: "dynamic__Function", args: [P.Function]},
+"code",
+"msg",
+"errorMessage",
+"message",
+{func: "args2", args: [null, null]},
+"key",
+{func: "dynamic__String_dynamic", args: [P.String, null]},
+{func: "dynamic__dynamic_String", args: [null, P.String]},
+{func: "void__dynamic_dynamic_dynamic", void: true, args: [null, null, null]},
+"c",
+"obj",
+"i",
+{func: "void__ServiceError", void: true, args: [D.ServiceError]},
+{func: "void__ServiceException", void: true, args: [D.ServiceException]},
+"exception",
+{func: "void__PopStateEvent", void: true, args: [W.PopStateEvent]},
+{func: "int__int_int", ret: P.$int, args: [P.$int, P.$int]},
+"column",
+"done",
+{func: "String__TableTreeRow", ret: P.String, args: [G.TableTreeRow]},
+"row",
+{func: "void__Event_dynamic_Element", void: true, args: [W.Event, null, W.Element]},
+"detail",
+"target",
+"objectClass",
+{func: "Future__String", ret: [P.Future, D.ServiceObject], args: [P.String]},
+"text",
+{func: "Future__dynamic", ret: [P.Future, D.ServiceObject], args: [null]},
+"limit",
+"dummy",
+{func: "dynamic__ServiceMap", args: [D.ServiceMap]},
+{func: "void__Event_dynamic_Node", void: true, args: [W.Event, null, W.Node]},
+{func: "dynamic__Code", args: [D.Code]},
+"data",
+{func: "void__Object__StackTrace", void: true, args: [P.Object], opt: [P.StackTrace]},
+"theError",
+"theStackTrace",
+{func: "dynamic__Object", args: [P.Object]},
+{func: "void___dynamic", void: true, opt: [null]},
+{func: "dynamic__dynamic__dynamic", args: [null], opt: [null]},
+{func: "bool_", ret: P.bool},
+"ignored",
+"convert",
+"element",
+{func: "dynamic__bool", args: [P.bool]},
+{func: "void___Future", void: true, opt: [P.Future]},
+"resumeSignal",
+{func: "dynamic__dynamic_StackTrace", args: [null, P.StackTrace]},
+{func: "void__dynamic_StackTrace", void: true, args: [null, P.StackTrace]},
+"each",
+{func: "dynamic__Symbol_dynamic", args: [P.Symbol, null]},
+{func: "int__String", ret: P.$int, args: [P.String]},
+{func: "double__String", ret: P.$double, args: [P.String]},
+{func: "bool__int", ret: P.bool, args: [P.$int]},
+{func: "int__int", ret: P.$int, args: [P.$int]},
+{func: "int__dynamic_dynamic", ret: P.$int, args: [null, null]},
+"byteString",
+{func: "void__MouseEvent", void: true, args: [W.MouseEvent]},
+"result",
+{func: "dynamic__ServiceObject", args: [D.ServiceObject]},
+{func: "PixelReference_", ret: O.PixelReference},
+"response",
+"st",
+{func: "void__ServiceMap", void: true, args: [D.ServiceMap]},
+"newProfile",
+{func: "String__bool", ret: P.String, args: [P.bool]},
+"newSpace",
+{func: "dynamic__int", args: [P.$int]},
+{func: "dynamic__int_dynamic", args: [P.$int, null]},
+{func: "Iterable__dynamic__String", ret: P.Iterable, args: [{func: "dynamic__String", args: [P.String]}]},
+{func: "Iterable__Iterable__String", ret: P.Iterable, args: [{func: "Iterable__String", ret: P.Iterable, args: [P.String]}]},
+"s",
+{func: "void__bool_dynamic", void: true, args: [P.bool, null]},
+"expand",
+"m",
+{func: "Future__dynamic0", ret: P.Future, args: [null]},
+"tagProfile",
+"rec",
+{func: "dynamic__LogRecord", args: [N.LogRecord]},
+{func: "void__MouseEvent_dynamic_Element", void: true, args: [W.MouseEvent, null, W.Element]},
+{func: "String__String", ret: P.String, args: [P.String]},
+"url",
+{func: "String__double", ret: P.String, args: [P.$double]},
+"time",
+{func: "bool__String", ret: P.bool, args: [P.String]},
+"type",
+{func: "dynamic__ZoneDelegate_Zone", args: [P.ZoneDelegate, P.Zone]},
+{func: "dynamic__Zone_ZoneDelegate_Zone_args1", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args1", args: [null]}]},
+{func: "void__Object", void: true, args: [P.Object]},
+"records",
+{func: "dynamic__PropertyPath_dynamic", args: [L.PropertyPath, null]},
+"model",
+"node",
+"oneTime",
+{func: "args3", args: [null, null, null]},
+{func: "void__String_String", void: true, args: [P.String, P.String]},
+{func: "void__List_Map_List", void: true, args: [P.List, P.Map, P.List]},
+{func: "void__List", void: true, args: [[P.List, T.ChangeRecord]]},
+{func: "void__Iterable", void: true, args: [[P.Iterable, A.Bindable]]},
+"changes",
+"jsElem",
+"extendee",
+{func: "dynamic__dynamic_String_String", args: [null, P.String, P.String]},
+"k",
+{func: "dynamic__dynamic_Node_bool", args: [null, W.Node, P.bool]},
+{func: "dynamic__dynamic__bool", args: [null], named: {skipChanges: P.bool}},
+false,
+"skipChanges",
+{func: "dynamic__List", args: [[P.List, T.ChangeRecord]]},
+{func: "Index__Expression_Expression", ret: U.Index, args: [U.Expression, U.Expression]},
+{func: "dynamic__Expression", args: [U.Expression]},
+"hits",
+"map",
+{func: "dynamic__ObservableMap", args: [V.ObservableMap]},
+"id",
+{func: "Future_", ret: P.Future},
+"coverage",
+{func: "Future__ServiceMap", ret: [P.Future, [P.List, D.Class]], args: [D.ServiceMap]},
+"classList",
+{func: "Future__List", ret: [P.Future, D.Class], args: [[P.List, D.Class]]},
+"classes",
+"scriptCoverage",
+"timer",
+{func: "String_", ret: P.String},
+{func: "String__Code", ret: P.String, args: [D.Code]},
+{func: "void__Script", void: true, args: [D.Script]},
+"script",
+"func",
+"request",
+{func: "dynamic__HttpRequest", args: [W.HttpRequest]},
+"details",
+"ref",
+{func: "void__List0", void: true, args: [[P.List, G.ListChangeRecord]]},
+"splices",
+{func: "void__DocumentFragment", void: true, args: [W.DocumentFragment]},
+{func: "String__Object", ret: P.String, args: [P.Object]},
+{func: "String__List", ret: P.String, args: [[P.List, P.Object]]},
+"values",
+{func: "Future__String0", ret: P.Future, args: [P.String]},
+];
+$ = null;
+Isolate = Isolate.$finishIsolateConstructor(Isolate);
+$ = new Isolate();
+function convertToFastObject(properties) {
+  function MyClass() {
+  }
+  MyClass.prototype = properties;
+  new MyClass();
+  return properties;
+}
+;
+A = convertToFastObject(A);
+B = convertToFastObject(B);
+C = convertToFastObject(C);
+D = convertToFastObject(D);
+E = convertToFastObject(E);
+F = convertToFastObject(F);
+G = convertToFastObject(G);
+H = convertToFastObject(H);
+J = convertToFastObject(J);
+K = convertToFastObject(K);
+L = convertToFastObject(L);
+M = convertToFastObject(M);
+N = convertToFastObject(N);
+O = convertToFastObject(O);
+P = convertToFastObject(P);
+Q = convertToFastObject(Q);
+R = convertToFastObject(R);
+S = convertToFastObject(S);
+T = convertToFastObject(T);
+U = convertToFastObject(U);
+V = convertToFastObject(V);
+W = convertToFastObject(W);
+X = convertToFastObject(X);
+Y = convertToFastObject(Y);
+Z = convertToFastObject(Z);
+!function() {
+  function intern(s) {
+    var o = {};
+    o[s] = 1;
+    return Object.keys(convertToFastObject(o))[0];
+  }
+  init.getIsolateTag = function(name) {
+    return intern("___dart_" + name + init.isolateTag);
+  };
+  var tableProperty = "___dart_isolate_tags_";
+  var usedProperties = Object[tableProperty] || (Object[tableProperty] = Object.create(null));
+  var rootProperty = "_ZxYxX";
+  for (var i = 0;; i++) {
+    var property = intern(rootProperty + "_" + i + "_");
+    if (!(property in usedProperties)) {
+      usedProperties[property] = 1;
+      init.isolateTag = property;
+      break;
+    }
+  }
+}();
+init.dispatchPropertyName = init.getIsolateTag("dispatch_record");
+// BEGIN invoke [main].
+;(function(callback) {
+  if (typeof document === "undefined") {
+    callback(null);
+    return;
+  }
+  if (document.currentScript) {
+    callback(document.currentScript);
+    return;
+  }
+  var scripts = document.scripts;
+  function onLoad(event) {
+    for (var i = 0; i < scripts.length; ++i) {
+      scripts[i].removeEventListener("load", onLoad, false);
+    }
+    callback(event.target);
+  }
+  for (var i = 0; i < scripts.length; ++i) {
+    scripts[i].addEventListener("load", onLoad, false);
+  }
+})(function(currentScript) {
+  init.currentScript = currentScript;
+  if (typeof dartMainRunner === "function") {
+    dartMainRunner(function(a) {
+      H.startRootIsolate(E.main0$closure(), a);
+    }, []);
+  } else {
+    (function(a) {
+      H.startRootIsolate(E.main0$closure(), a);
+    })([]);
+  }
+});
+;
+// END invoke [main].
+function init() {
+  Isolate.$isolateProperties = {};
+  function generateAccessor(fieldDescriptor, accessors, cls) {
+    var fieldInformation = fieldDescriptor.split("-");
+    var field = fieldInformation[0];
+    var len = field.length;
+    var code = field.charCodeAt(len - 1);
+    var reflectable;
+    if (fieldInformation.length > 1)
+      reflectable = true;
+    else
+      reflectable = false;
+    code = code >= 60 && code <= 64 ? code - 59 : code >= 123 && code <= 126 ? code - 117 : code >= 37 && code <= 43 ? code - 27 : 0;
+    if (code) {
+      var getterCode = code & 3;
+      var setterCode = code >> 2;
+      var accessorName = field = field.substring(0, len - 1);
+      var divider = field.indexOf(":");
+      if (divider > 0) {
+        accessorName = field.substring(0, divider);
+        field = field.substring(divider + 1);
+      }
+      if (getterCode) {
+        var args = getterCode & 2 ? "receiver" : "";
+        var receiver = getterCode & 1 ? "this" : "receiver";
+        var body = "return " + receiver + "." + field;
+        var property = cls + ".prototype.get$" + accessorName + "=";
+        var fn = "function(" + args + "){" + body + "}";
+        if (reflectable)
+          accessors.push(property + "$reflectable(" + fn + ");\n");
+        else
+          accessors.push(property + fn + ";\n");
+      }
+      if (setterCode) {
+        var args = setterCode & 2 ? "receiver, value" : "value";
+        var receiver = setterCode & 1 ? "this" : "receiver";
+        var body = receiver + "." + field + " = value";
+        var property = cls + ".prototype.set$" + accessorName + "=";
+        var fn = "function(" + args + "){" + body + "}";
+        if (reflectable)
+          accessors.push(property + "$reflectable(" + fn + ");\n");
+        else
+          accessors.push(property + fn + ";\n");
+      }
+    }
+    return field;
+  }
+  Isolate.$isolateProperties.$generateAccessor = generateAccessor;
+  function defineClass(name, cls, fields) {
+    var accessors = [];
+    var str = "function " + cls + "(";
+    var body = "";
+    for (var i = 0; i < fields.length; i++) {
+      if (i != 0)
+        str += ", ";
+      var field = generateAccessor(fields[i], accessors, cls);
+      var parameter = "parameter_" + field;
+      str += parameter;
+      body += "this." + field + " = " + parameter + ";\n";
+    }
+    str += ") {\n" + body + "}\n";
+    str += cls + ".builtin$cls=\"" + name + "\";\n";
+    str += "$desc=$collectedClasses." + cls + ";\n";
+    str += "if($desc instanceof Array) $desc = $desc[1];\n";
+    str += cls + ".prototype = $desc;\n";
+    if (typeof defineClass.name != "string") {
+      str += cls + ".name=\"" + cls + "\";\n";
+    }
+    str += accessors.join("");
+    return str;
+  }
+  var inheritFrom = function() {
+    function tmp() {
+    }
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+    return function(constructor, superConstructor) {
+      tmp.prototype = superConstructor.prototype;
+      var object = new tmp();
+      var properties = constructor.prototype;
+      for (var member in properties)
+        if (hasOwnProperty.call(properties, member))
+          object[member] = properties[member];
+      object.constructor = constructor;
+      constructor.prototype = object;
+      return object;
+    };
+  }();
+  Isolate.$finishClasses = function(collectedClasses, isolateProperties, existingIsolateProperties) {
+    var pendingClasses = {};
+    if (!init.allClasses)
+      init.allClasses = {};
+    var allClasses = init.allClasses;
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+    if (typeof dart_precompiled == "function") {
+      var constructors = dart_precompiled(collectedClasses);
+    } else {
+      var combinedConstructorFunction = "function $reflectable(fn){fn.$reflectable=1;return fn};\n" + "var $desc;\n";
+      var constructorsList = [];
+    }
+    for (var cls in collectedClasses) {
+      if (hasOwnProperty.call(collectedClasses, cls)) {
+        var desc = collectedClasses[cls];
+        if (desc instanceof Array)
+          desc = desc[1];
+        var classData = desc["^"], supr, name = cls, fields = classData;
+        if (typeof classData == "string") {
+          var split = classData.split("/");
+          if (split.length == 2) {
+            name = split[0];
+            fields = split[1];
+          }
+        }
+        var s = fields.split(";");
+        fields = s[1] == "" ? [] : s[1].split(",");
+        supr = s[0];
+        split = supr.split(":");
+        if (split.length == 2) {
+          supr = split[0];
+          var functionSignature = split[1];
+          if (functionSignature)
+            desc.$signature = function(s) {
+              return function() {
+                return init.metadata[s];
+              };
+            }(functionSignature);
+        }
+        if (supr && supr.indexOf("+") > 0) {
+          s = supr.split("+");
+          supr = s[0];
+          var mixin = collectedClasses[s[1]];
+          if (mixin instanceof Array)
+            mixin = mixin[1];
+          for (var d in mixin) {
+            if (hasOwnProperty.call(mixin, d) && !hasOwnProperty.call(desc, d))
+              desc[d] = mixin[d];
+          }
+        }
+        if (typeof dart_precompiled != "function") {
+          combinedConstructorFunction += defineClass(name, cls, fields);
+          constructorsList.push(cls);
+        }
+        if (supr)
+          pendingClasses[cls] = supr;
+      }
+    }
+    if (typeof dart_precompiled != "function") {
+      combinedConstructorFunction += "return [\n  " + constructorsList.join(",\n  ") + "\n]";
+      var constructors = new Function("$collectedClasses", combinedConstructorFunction)(collectedClasses);
+      combinedConstructorFunction = null;
+    }
+    for (var i = 0; i < constructors.length; i++) {
+      var constructor = constructors[i];
+      var cls = constructor.name;
+      var desc = collectedClasses[cls];
+      var globalObject = isolateProperties;
+      if (desc instanceof Array) {
+        globalObject = desc[0] || isolateProperties;
+        desc = desc[1];
+      }
+      allClasses[cls] = constructor;
+      globalObject[cls] = constructor;
+    }
+    constructors = null;
+    var finishedClasses = {};
+    init.interceptorsByTag = Object.create(null);
+    init.leafTags = {};
+    function finishClass(cls) {
+      var hasOwnProperty = Object.prototype.hasOwnProperty;
+      if (hasOwnProperty.call(finishedClasses, cls))
+        return;
+      finishedClasses[cls] = true;
+      var superclass = pendingClasses[cls];
+      if (!superclass || typeof superclass != "string")
+        return;
+      finishClass(superclass);
+      var constructor = allClasses[cls];
+      var superConstructor = allClasses[superclass];
+      if (!superConstructor)
+        superConstructor = existingIsolateProperties[superclass];
+      var prototype = inheritFrom(constructor, superConstructor);
+      if (hasOwnProperty.call(prototype, "%")) {
+        var nativeSpec = prototype["%"].split(";");
+        if (nativeSpec[0]) {
+          var tags = nativeSpec[0].split("|");
+          for (var i = 0; i < tags.length; i++) {
+            init.interceptorsByTag[tags[i]] = constructor;
+            init.leafTags[tags[i]] = true;
+          }
+        }
+        if (nativeSpec[1]) {
+          tags = nativeSpec[1].split("|");
+          if (nativeSpec[2]) {
+            var subclasses = nativeSpec[2].split("|");
+            for (var i = 0; i < subclasses.length; i++) {
+              var subclass = allClasses[subclasses[i]];
+              subclass.$nativeSuperclassTag = tags[0];
+            }
+          }
+          for (i = 0; i < tags.length; i++) {
+            init.interceptorsByTag[tags[i]] = constructor;
+            init.leafTags[tags[i]] = false;
+          }
+        }
+      }
+    }
+    for (var cls in pendingClasses)
+      finishClass(cls);
+  };
+  Isolate.$lazy = function(prototype, staticName, fieldName, getterName, lazyValue) {
+    var sentinelUndefined = {};
+    var sentinelInProgress = {};
+    prototype[fieldName] = sentinelUndefined;
+    prototype[getterName] = function() {
+      var result = $[fieldName];
+      try {
+        if (result === sentinelUndefined) {
+          $[fieldName] = sentinelInProgress;
+          try {
+            result = $[fieldName] = lazyValue();
+          } finally {
+            if (result === sentinelUndefined)
+              if ($[fieldName] === sentinelInProgress)
+                $[fieldName] = null;
+          }
+        } else {
+          if (result === sentinelInProgress)
+            H.throwCyclicInit(staticName);
+        }
+        return result;
+      } finally {
+        $[getterName] = function() {
+          return this[fieldName];
+        };
+      }
+    };
+  };
+  Isolate.$finishIsolateConstructor = function(oldIsolate) {
+    var isolateProperties = oldIsolate.$isolateProperties;
+    function Isolate() {
+      var hasOwnProperty = Object.prototype.hasOwnProperty;
+      for (var staticName in isolateProperties)
+        if (hasOwnProperty.call(isolateProperties, staticName))
+          this[staticName] = isolateProperties[staticName];
+      function ForceEfficientMap() {
+      }
+      ForceEfficientMap.prototype = this;
+      new ForceEfficientMap();
+    }
+    Isolate.prototype = oldIsolate.prototype;
+    Isolate.prototype.constructor = Isolate;
+    Isolate.$isolateProperties = isolateProperties;
+    Isolate.$finishClasses = oldIsolate.$finishClasses;
+    Isolate.makeConstantList = oldIsolate.makeConstantList;
+    return Isolate;
+  };
+}
 })()
+
+//# sourceMappingURL=index_devtools.html_bootstrap.dart.js.map
+//@ sourceMappingURL=index_devtools.html_bootstrap.dart.js.map
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 e1479c3..28c5e00 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
@@ -134,11 +134,34 @@
       </template>
       
       <template if="{{ !cls.hasNoAllocations }}">
-        current instances ({{ cls.newSpace.current.instances + cls.oldSpace.current.instances }})
+        instances
           <div class="memberItem">
-            <div class="memberName">shallow size</div>
+            <div class="memberName">currently allocated</div>
             <div class="memberValue">
-              {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }}
+              count {{ cls.newSpace.current.instances + cls.oldSpace.current.instances }}
+              (shallow size {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }})
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">strongly reachable</div>
+            <div class="memberValue">
+              <template if="{{ instances == null }}">
+                <eval-link callback="{{ reachable }}"
+                           label="[find]"
+                           expr="100">
+                </eval-link>
+              </template>
+              <template if="{{ instances != null }}">
+                sample
+                <instance-ref ref="{{ instances['sample'] }}"></instance-ref>
+                <template if="{{ instances['totalCount'] > instances['sampleCount'] }}">
+                  <eval-link callback="{{ reachable }}"
+                           label="[more]"
+                           expr="{{ instances['sampleCount'] * 2 }}">
+                  </eval-link>
+                </template>
+                of total {{ instances['totalCount'] }}
+              </template>
             </div>
           </div>
           <div class="memberItem">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js
deleted file mode 100644
index 85a6554..0000000
--- a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js
+++ /dev/null
@@ -1,2392 +0,0 @@
-/*
- * 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.
- */
-Polymer = {};
-
-/*
- * 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.
- */
-
-// TODO(sorvell): this ensures Polymer is an object and not a function
-// Platform is currently defining it as a function to allow for async loading
-// of polymer; once we refine the loading process this likely goes away.
-if (typeof window.Polymer === 'function') {
-  Polymer = {};
-}
-
-
-/*
- * 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.
- */
-(function(scope) {
-
-  // copy own properties from 'api' to 'prototype, with name hinting for 'super'
-  function extend(prototype, api) {
-    if (prototype && api) {
-      // use only own properties of 'api'
-      Object.getOwnPropertyNames(api).forEach(function(n) {
-        // acquire property descriptor
-        var pd = Object.getOwnPropertyDescriptor(api, n);
-        if (pd) {
-          // clone property via descriptor
-          Object.defineProperty(prototype, n, pd);
-          // cache name-of-method for 'super' engine
-          if (typeof pd.value == 'function') {
-            // hint the 'super' engine
-            pd.value.nom = n;
-          }
-        }
-      });
-    }
-    return prototype;
-  }
-  
-  // exports
-
-  scope.extend = extend;
-
-})(Polymer);
-
-/* 
- * 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.
- */
-
-(function(scope) {
-  
-  // usage
-  
-  // invoke cb.call(this) in 100ms, unless the job is re-registered,
-  // which resets the timer
-  // 
-  // this.myJob = this.job(this.myJob, cb, 100)
-  //
-  // returns a job handle which can be used to re-register a job
-
-  var Job = function(inContext) {
-    this.context = inContext;
-    this.boundComplete = this.complete.bind(this)
-  };
-  Job.prototype = {
-    go: function(callback, wait) {
-      this.callback = callback;
-      var h;
-      if (!wait) {
-        h = requestAnimationFrame(this.boundComplete);
-        this.handle = function() {
-          cancelAnimationFrame(h);
-        }
-      } else {
-        h = setTimeout(this.boundComplete, wait);
-        this.handle = function() {
-          clearTimeout(h);
-        }
-      }
-    },
-    stop: function() {
-      if (this.handle) {
-        this.handle();
-        this.handle = null;
-      }
-    },
-    complete: function() {
-      if (this.handle) {
-        this.stop();
-        this.callback.call(this.context);
-      }
-    }
-  };
-  
-  function job(job, callback, wait) {
-    if (job) {
-      job.stop();
-    } else {
-      job = new Job(this);
-    }
-    job.go(callback, wait);
-    return job;
-  }
-  
-  // exports 
-
-  scope.job = job;
-  
-})(Polymer);
-
-/*
- * 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.
- */
-(function(scope) {
-
-  var registry = {};
-
-  HTMLElement.register = function(tag, prototype) {
-    registry[tag] = prototype;
-  }
-
-  // get prototype mapped to node <tag>
-  HTMLElement.getPrototypeForTag = function(tag) {
-    var prototype = !tag ? HTMLElement.prototype : registry[tag];
-    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects
-    return prototype || Object.getPrototypeOf(document.createElement(tag));
-  };
-
-  // we have to flag propagation stoppage for the event dispatcher
-  var originalStopPropagation = Event.prototype.stopPropagation;
-  Event.prototype.stopPropagation = function() {
-    this.cancelBubble = true;
-    originalStopPropagation.apply(this, arguments);
-  };
-  
-  // TODO(sorvell): remove when we're sure imports does not need
-  // to load stylesheets
-  /*
-  HTMLImports.importer.preloadSelectors += 
-      ', polymer-element link[rel=stylesheet]';
-  */
-})(Polymer);
-
-/*
- * 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.
- */
- (function(scope) {
-    // super
-
-    // `arrayOfArgs` is an optional array of args like one might pass
-    // to `Function.apply`
-
-    // TODO(sjmiles):
-    //    $super must be installed on an instance or prototype chain
-    //    as `super`, and invoked via `this`, e.g.
-    //      `this.super();`
-
-    //    will not work if function objects are not unique, for example,
-    //    when using mixins.
-    //    The memoization strategy assumes each function exists on only one 
-    //    prototype chain i.e. we use the function object for memoizing)
-    //    perhaps we can bookkeep on the prototype itself instead
-    function $super(arrayOfArgs) {
-      // since we are thunking a method call, performance is important here: 
-      // memoize all lookups, once memoized the fast path calls no other 
-      // functions
-      //
-      // find the caller (cannot be `strict` because of 'caller')
-      var caller = $super.caller;
-      // memoized 'name of method' 
-      var nom = caller.nom;
-      // memoized next implementation prototype
-      var _super = caller._super;
-      if (!_super) {
-        if (!nom) {
-          nom = caller.nom = nameInThis.call(this, caller);
-        }
-        if (!nom) {
-          console.warn('called super() on a method not installed declaratively (has no .nom property)');
-        }
-        // super prototype is either cached or we have to find it
-        // by searching __proto__ (at the 'top')
-        _super = memoizeSuper(caller, nom, getPrototypeOf(this));
-      }
-      if (!_super) {
-        // if _super is falsey, there is no super implementation
-        //console.warn('called $super(' + nom + ') where there is no super implementation');
-      } else {
-        // our super function
-        var fn = _super[nom];
-        // memoize information so 'fn' can call 'super'
-        if (!fn._super) {
-          memoizeSuper(fn, nom, _super);
-        }
-        // invoke the inherited method
-        // if 'fn' is not function valued, this will throw
-        return fn.apply(this, arrayOfArgs || []);
-      }
-    }
-
-    function nextSuper(proto, name, caller) {
-      // look for an inherited prototype that implements name
-      while (proto) {
-        if ((proto[name] !== caller) && proto[name]) {
-          return proto;
-        }
-        proto = getPrototypeOf(proto);
-      }
-    }
-
-    function memoizeSuper(method, name, proto) {
-      // find and cache next prototype containing `name`
-      // we need the prototype so we can do another lookup
-      // from here
-      method._super = nextSuper(proto, name, method);
-      if (method._super) {
-        // _super is a prototype, the actual method is _super[name]
-        // tag super method with it's name for further lookups
-        method._super[name].nom = name;
-      }
-      return method._super;
-    }
-
-    function nameInThis(value) {
-      var p = this.__proto__;
-      while (p && p !== HTMLElement.prototype) {
-        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive
-        var n$ = Object.getOwnPropertyNames(p);
-        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {
-          var d = Object.getOwnPropertyDescriptor(p, n);
-          if (typeof d.value === 'function' && d.value === value) {
-            return n;
-          }
-        }
-        p = p.__proto__;
-      }
-    }
-
-    // NOTE: In some platforms (IE10) the prototype chain is faked via 
-    // __proto__. Therefore, always get prototype via __proto__ instead of
-    // the more standard Object.getPrototypeOf.
-    function getPrototypeOf(prototype) {
-      return prototype.__proto__;
-    }
-
-    // utility function to precompute name tags for functions
-    // in a (unchained) prototype
-    function hintSuper(prototype) {
-      // tag functions with their prototype name to optimize
-      // super call invocations
-      for (var n in prototype) {
-        var pd = Object.getOwnPropertyDescriptor(prototype, n);
-        if (pd && typeof pd.value === 'function') {
-          pd.value.nom = n;
-        }
-      }
-    }
-
-    // exports
-
-    scope.super = $super;
-
-})(Polymer);
-
-/* 
- * 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.
- */
-
-(function(scope) {
-
-  var typeHandlers = {
-    string: function(value) {
-      return value;
-    },
-    date: function(value) {
-      return new Date(Date.parse(value) || Date.now());
-    },
-    boolean: function(value) {
-      if (value === '') {
-        return true;
-      }
-      return value === 'false' ? false : !!value;
-    },
-    number: function(value) {
-      var n = parseFloat(value);
-      // hex values like "0xFFFF" parseFloat as 0
-      if (n === 0) {
-        n = parseInt(value);
-      }
-      return isNaN(n) ? value : n;
-      // this code disabled because encoded values (like "0xFFFF")
-      // do not round trip to their original format
-      //return (String(floatVal) === value) ? floatVal : value;
-    },
-    object: function(value, currentValue) {
-      if (currentValue === null) {
-        return value;
-      }
-      try {
-        // If the string is an object, we can parse is with the JSON library.
-        // include convenience replace for single-quotes. If the author omits
-        // quotes altogether, parse will fail.
-        return JSON.parse(value.replace(/'/g, '"'));
-      } catch(e) {
-        // The object isn't valid JSON, return the raw value
-        return value;
-      }
-    },
-    // avoid deserialization of functions
-    'function': function(value, currentValue) {
-      return currentValue;
-    }
-  };
-
-  function deserializeValue(value, currentValue) {
-    // attempt to infer type from default value
-    var inferredType = typeof currentValue;
-    // invent 'date' type value for Date
-    if (currentValue instanceof Date) {
-      inferredType = 'date';
-    }
-    // delegate deserialization via type string
-    return typeHandlers[inferredType](value, currentValue);
-  }
-
-  // exports
-
-  scope.deserializeValue = deserializeValue;
-
-})(Polymer);
-
-/*
- * 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.
- */
-(function(scope) {
-
-  // imports
-
-  var extend = scope.extend;
-
-  // module
-
-  var api = {};
-
-  api.declaration = {};
-  api.instance = {};
-
-  api.publish = function(apis, prototype) {
-    for (var n in apis) {
-      extend(prototype, apis[n]);
-    }
-  }
-
-  // exports
-
-  scope.api = api;
-
-})(Polymer);
-
-/*
- * 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.
- */
-(function(scope) {
-
-  var utils = {
-    /**
-      * Invokes a function asynchronously. The context of the callback
-      * function is bound to 'this' automatically.
-      * @method async
-      * @param {Function|String} method
-      * @param {any|Array} args
-      * @param {number} timeout
-      */
-    async: function(method, args, timeout) {
-      // when polyfilling Object.observe, ensure changes 
-      // propagate before executing the async method
-      Platform.flush();
-      // second argument to `apply` must be an array
-      args = (args && args.length) ? args : [args];
-      // function to invoke
-      var fn = function() {
-        (this[method] || method).apply(this, args);
-      }.bind(this);
-      // execute `fn` sooner or later
-      var handle = timeout ? setTimeout(fn, timeout) :
-          requestAnimationFrame(fn);
-      // NOTE: switch on inverting handle to determine which time is used.
-      return timeout ? handle : ~handle;
-    },
-    cancelAsync: function(handle) {
-      if (handle < 0) {
-        cancelAnimationFrame(~handle);
-      } else {
-        clearTimeout(handle);
-      }
-    },
-    /**
-      * Fire an event.
-      * @method fire
-      * @returns {Object} event
-      * @param {string} type An event name.
-      * @param {any} detail
-      * @param {Node} onNode Target node.
-      */
-    fire: function(type, detail, onNode, bubbles, cancelable) {
-      var node = onNode || this;
-      var detail = detail || {};
-      var event = new CustomEvent(type, {
-        bubbles: (bubbles !== undefined ? bubbles : true), 
-        cancelable: (cancelable !== undefined ? cancelable : true), 
-        detail: detail
-      });
-      node.dispatchEvent(event);
-      return event;
-    },
-    /**
-      * Fire an event asynchronously.
-      * @method asyncFire
-      * @param {string} type An event name.
-      * @param detail
-      * @param {Node} toNode Target node.
-      */
-    asyncFire: function(/*inType, inDetail*/) {
-      this.async("fire", arguments);
-    },
-    /**
-      * Remove class from old, add class to anew, if they exist
-      * @param classFollows
-      * @param anew A node.
-      * @param old A node
-      * @param className
-      */
-    classFollows: function(anew, old, className) {
-      if (old) {
-        old.classList.remove(className);
-      }
-      if (anew) {
-        anew.classList.add(className);
-      }
-    }
-  };
-
-  // no-operation function for handy stubs
-  var nop = function() {};
-
-  // null-object for handy stubs
-  var nob = {};
-
-  // deprecated
-
-  utils.asyncMethod = utils.async;
-
-  // exports
-
-  scope.api.instance.utils = utils;
-  scope.nop = nop;
-  scope.nob = nob;
-
-})(Polymer);
-
-/*
- * 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.
- */
-
-(function(scope) {
-
-  // imports
-
-  var log = window.logFlags || {};
-  var EVENT_PREFIX = 'on-';
-
-  // instance events api
-  var events = {
-    // read-only
-    EVENT_PREFIX: EVENT_PREFIX,
-    // event listeners on host
-    addHostListeners: function() {
-      var events = this.eventDelegates;
-      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);
-      // NOTE: host events look like bindings but really are not;
-      // (1) we don't want the attribute to be set and (2) we want to support
-      // multiple event listeners ('host' and 'instance') and Node.bind
-      // by default supports 1 thing being bound.
-      // We do, however, leverage the event hookup code in PolymerExpressions
-      // so that we have a common code path for handling declarative events.
-      var self = this, bindable, eventName;
-      for (var n in events) {
-        eventName = EVENT_PREFIX + n;
-        bindable = PolymerExpressions.prepareEventBinding(
-          Path.get(events[n]),
-          eventName, 
-          {
-            resolveEventHandler: function(model, path, node) {
-              var fn = path.getValueFrom(self);
-              if (fn) {
-                return fn.bind(self);
-              }
-            }
-          }
-        );
-        bindable(this, this, false);
-      }
-    },
-    // call 'method' or function method on 'obj' with 'args', if the method exists
-    dispatchMethod: function(obj, method, args) {
-      if (obj) {
-        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);
-        var fn = typeof method === 'function' ? method : obj[method];
-        if (fn) {
-          fn[args ? 'apply' : 'call'](obj, args);
-        }
-        log.events && console.groupEnd();
-        Platform.flush();
-      }
-    }
-  };
-
-  // exports
-
-  scope.api.instance.events = events;
-
-})(Polymer);
-
-/*

- * 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.

- */

-(function(scope) {

-

-  // instance api for attributes

-

-  var attributes = {

-    copyInstanceAttributes: function () {

-      var a$ = this._instanceAttributes;

-      for (var k in a$) {

-        if (!this.hasAttribute(k)) {

-          this.setAttribute(k, a$[k]);

-        }

-      }

-    },

-    // for each attribute on this, deserialize value to property as needed

-    takeAttributes: function() {

-      // if we have no publish lookup table, we have no attributes to take

-      // TODO(sjmiles): ad hoc

-      if (this._publishLC) {

-        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {

-          this.attributeToProperty(a.name, a.value);

-        }

-      }

-    },

-    // if attribute 'name' is mapped to a property, deserialize

-    // 'value' into that property

-    attributeToProperty: function(name, value) {

-      // try to match this attribute to a property (attributes are

-      // all lower-case, so this is case-insensitive search)

-      var name = this.propertyForAttribute(name);

-      if (name) {

-        // filter out 'mustached' values, these are to be

-        // replaced with bound-data and are not yet values

-        // themselves

-        if (value && value.search(scope.bindPattern) >= 0) {

-          return;

-        }

-        // get original value

-        var currentValue = this[name];

-        // deserialize Boolean or Number values from attribute

-        var value = this.deserializeValue(value, currentValue);

-        // only act if the value has changed

-        if (value !== currentValue) {

-          // install new value (has side-effects)

-          this[name] = value;

-        }

-      }

-    },

-    // return the published property matching name, or undefined

-    propertyForAttribute: function(name) {

-      var match = this._publishLC && this._publishLC[name];

-      //console.log('propertyForAttribute:', name, 'matches', match);

-      return match;

-    },

-    // convert representation of 'stringValue' based on type of 'currentValue'

-    deserializeValue: function(stringValue, currentValue) {

-      return scope.deserializeValue(stringValue, currentValue);

-    },

-    serializeValue: function(value, inferredType) {

-      if (inferredType === 'boolean') {

-        return value ? '' : undefined;

-      } else if (inferredType !== 'object' && inferredType !== 'function'

-          && value !== undefined) {

-        return value;

-      }

-    },

-    reflectPropertyToAttribute: function(name) {

-      var inferredType = typeof this[name];

-      // try to intelligently serialize property value

-      var serializedValue = this.serializeValue(this[name], inferredType);

-      // boolean properties must reflect as boolean attributes

-      if (serializedValue !== undefined) {

-        this.setAttribute(name, serializedValue);

-        // TODO(sorvell): we should remove attr for all properties

-        // that have undefined serialization; however, we will need to

-        // refine the attr reflection system to achieve this; pica, for example,

-        // relies on having inferredType object properties not removed as

-        // attrs.

-      } else if (inferredType === 'boolean') {

-        this.removeAttribute(name);

-      }

-    }

-  };

-

-  // exports

-

-  scope.api.instance.attributes = attributes;

-

-})(Polymer);

-
-/*
- * 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.
- */
-(function(scope) {
-
-  // imports
-
-  var log = window.logFlags || {};
-
-  // magic words
-
-  var OBSERVE_SUFFIX = 'Changed';
-
-  // element api
-
-  var empty = [];
-
-  var properties = {
-    observeProperties: function() {
-      var n$ = this._observeNames, pn$ = this._publishNames;
-      if ((n$ && n$.length) || (pn$ && pn$.length)) {
-        var self = this;
-        var o = this._propertyObserver = new CompoundObserver();
-        // keep track of property observer so we can shut it down
-        this.registerObservers([o]);
-        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
-          o.addPath(this, n);
-          // observer array properties
-          var pd = Object.getOwnPropertyDescriptor(this.__proto__, n);
-          if (pd && pd.value) {
-            this.observeArrayValue(n, pd.value, null);
-          }
-        }
-        for (var i=0, l=pn$.length, n; (i<l) && (n=pn$[i]); i++) {
-          if (!this.observe || (this.observe[n] === undefined)) {
-            o.addPath(this, n);
-          }
-        }
-        o.open(this.notifyPropertyChanges, this);
-      }
-    },
-    notifyPropertyChanges: function(newValues, oldValues, paths) {
-      var name, method, called = {};
-      for (var i in oldValues) {
-        // note: paths is of form [object, path, object, path]
-        name = paths[2 * i + 1];
-        if (this.publish[name] !== undefined) {
-          this.reflectPropertyToAttribute(name);
-        }
-        method = this.observe[name];
-        if (method) {
-          this.observeArrayValue(name, newValues[i], oldValues[i]);
-          if (!called[method]) {
-            called[method] = true;
-            // observes the value if it is an array
-            this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);
-          }
-        }
-      }
-    },
-    observeArrayValue: function(name, value, old) {
-      // we only care if there are registered side-effects
-      var callbackName = this.observe[name];
-      if (callbackName) {
-        // if we are observing the previous value, stop
-        if (Array.isArray(old)) {
-          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);
-          this.closeNamedObserver(name + '__array');
-        }
-        // if the new value is an array, being observing it
-        if (Array.isArray(value)) {
-          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);
-          var observer = new ArrayObserver(value);
-          observer.open(function(value, old) {
-            this.invokeMethod(callbackName, [old]);
-          }, this);
-          this.registerNamedObserver(name + '__array', observer);
-        }
-      }
-    },
-    bindProperty: function(property, observable) {
-      // apply Polymer two-way reference binding
-      return bindProperties(this, property, observable);
-    },
-    invokeMethod: function(method, args) {
-      var fn = this[method] || method;
-      if (typeof fn === 'function') {
-        fn.apply(this, args);
-      }
-    },
-    registerObservers: function(observers) {
-      this._observers.push(observers);
-    },
-    // observer array items are arrays of observers.
-    closeObservers: function() {
-      for (var i=0, l=this._observers.length; i<l; i++) {
-        this.closeObserverArray(this._observers[i]);
-      }
-      this._observers = [];
-    },
-    closeObserverArray: function(observerArray) {
-      for (var i=0, l=observerArray.length, o; i<l; i++) {
-        o = observerArray[i];
-        if (o && o.close) {
-          o.close();
-        }
-      }
-    },
-    // bookkeeping observers for memory management
-    registerNamedObserver: function(name, observer) {
-      var o$ = this._namedObservers || (this._namedObservers = {});
-      o$[name] = observer;
-    },
-    closeNamedObserver: function(name) {
-      var o$ = this._namedObservers;
-      if (o$ && o$[name]) {
-        o$[name].close();
-        o$[name] = null;
-        return true;
-      }
-    },
-    closeNamedObservers: function() {
-      if (this._namedObservers) {
-        var keys=Object.keys(this._namedObservers);
-        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {
-          o = this._namedObservers[k];
-          o.close();
-        }
-        this._namedObservers = {};
-      }
-    }
-  };
-
-  // property binding
-  // bind a property in A to a path in B by converting A[property] to a
-  // getter/setter pair that accesses B[...path...]
-  function bindProperties(inA, inProperty, observable) {
-    log.bind && console.log(LOG_BIND_PROPS, inB.localName || 'object', inPath, inA.localName, inProperty);
-    // capture A's value if B's value is null or undefined,
-    // otherwise use B's value
-    // TODO(sorvell): need to review, can do with ObserverTransform
-    var v = observable.discardChanges();
-    if (v === null || v === undefined) {
-      observable.setValue(inA[inProperty]);
-    }
-    return Observer.defineComputedProperty(inA, inProperty, observable);
-  }
-
-  // logging
-  var LOG_OBSERVE = '[%s] watching [%s]';
-  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';
-  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';
-  var LOG_BIND_PROPS = "[%s]: bindProperties: [%s] to [%s].[%s]";
-
-  // exports
-
-  scope.api.instance.properties = properties;
-
-})(Polymer);
-
-/*
- * 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.
- */
-(function(scope) {
-
-  // imports
-
-  var log = window.logFlags || 0;
-  var events = scope.api.instance.events;
-
-  var syntax = new PolymerExpressions();
-  syntax.resolveEventHandler = function(model, path, node) {
-    var ctlr = findEventController(node);
-    if (ctlr) {
-      var fn = path.getValueFrom(ctlr);
-      if (fn) {
-        return fn.bind(ctlr);
-      }
-    }
-  }
-
-  // An event controller is the host element for the shadowRoot in which 
-  // the node exists, or the first ancestor with a 'lightDomController'
-  // property.
-  function findEventController(node) {
-    while (node.parentNode) {
-      if (node.lightDomController) {
-        return node;
-      }
-      node = node.parentNode;
-    }
-    return node.host;
-  };
-
-  // element api supporting mdv
-
-  var mdv = {
-    syntax: syntax,
-    instanceTemplate: function(template) {
-      var dom = template.createInstance(this, this.syntax);
-      this.registerObservers(dom.bindings_);
-      return dom;
-    },
-    bind: function(name, observable, oneTime) {
-      var property = this.propertyForAttribute(name);
-      if (!property) {
-        // TODO(sjmiles): this mixin method must use the special form
-        // of `super` installed by `mixinMethod` in declaration/prototype.js
-        return this.mixinSuper(arguments);
-      } else {
-        // use n-way Polymer binding
-        var observer = this.bindProperty(property, observable);
-        this.reflectPropertyToAttribute(property);
-        // NOTE: reflecting binding information is typically required only for
-        // tooling. It has a performance cost so it's opt-in in Node.bind.
-        if (Platform.enableBindingsReflection) {
-          observer.path = observable.path_;
-          this.bindings_ = this.bindings_ || {};
-          this.bindings_[name] = observer;
-        }
-        return observer;
-      }
-    },
-    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from
-    // TemplateBinding. We still need to close/dispose of observers but perhaps
-    // we should choose a more explicit name.
-    asyncUnbindAll: function() {
-      if (!this._unbound) {
-        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);
-        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);
-      }
-    },
-    unbindAll: function() {
-      if (!this._unbound) {
-        this.closeObservers();
-        this.closeNamedObservers();
-        this._unbound = true;
-      }
-    },
-    cancelUnbindAll: function() {
-      if (this._unbound) {
-        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);
-        return;
-      }
-      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);
-      if (this._unbindAllJob) {
-        this._unbindAllJob = this._unbindAllJob.stop();
-      }
-    }
-  };
-
-  function unbindNodeTree(node) {
-    forNodeTree(node, _nodeUnbindAll);
-  }
-
-  function _nodeUnbindAll(node) {
-    node.unbindAll();
-  }
-
-  function forNodeTree(node, callback) {
-    if (node) {
-      callback(node);
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        forNodeTree(child, callback);
-      }
-    }
-  }
-
-  var mustachePattern = /\{\{([^{}]*)}}/;
-
-  // exports
-
-  scope.bindPattern = mustachePattern;
-  scope.api.instance.mdv = mdv;
-
-})(Polymer);
-
-/*
- * 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.
- */
-(function(scope) {
-
-  var base = {
-    PolymerBase: true,
-    job: function(job, callback, wait) {
-      if (typeof job === 'string') {
-        var n = '___' + job;
-        this[n] = Polymer.job.call(this, this[n], callback, wait);
-      } else {
-        return Polymer.job.call(this, job, callback, wait);
-      }
-    },
-    super: Polymer.super,
-    // user entry point for element has had its createdCallback called
-    created: function() {
-    },
-    // user entry point for element has shadowRoot and is ready for
-    // api interaction
-    ready: function() {
-    },
-    createdCallback: function() {
-      if (this.templateInstance && this.templateInstance.model) {
-        console.warn('Attributes on ' + this.localName + ' were data bound ' +
-            'prior to Polymer upgrading the element. This may result in ' +
-            'incorrect binding types.');
-      }
-      this.created();
-      this.prepareElement();
-    },
-    // system entry point, do not override
-    prepareElement: function() {
-      this._elementPrepared = true;
-      // install shadowRoots storage
-      this.shadowRoots = {};
-      // storage for closeable observers.
-      this._observers = [];
-      // install property observers
-      this.observeProperties();
-      // install boilerplate attributes
-      this.copyInstanceAttributes();
-      // process input attributes
-      this.takeAttributes();
-      // add event listeners
-      this.addHostListeners();
-      // process declarative resources
-      this.parseDeclarations(this.__proto__);
-      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate
-      // :unresolved; remove this attribute to be compatible with native
-      // CE.
-      this.removeAttribute('unresolved');
-      // user entry point
-      this.ready();
-    },
-    attachedCallback: function() {
-      this.cancelUnbindAll();
-      // invoke user action
-      if (this.attached) {
-        this.attached();
-      }
-      // TODO(sorvell): bc
-      if (this.enteredView) {
-        this.enteredView();
-      }
-      // NOTE: domReady can be used to access elements in dom (descendants, 
-      // ancestors, siblings) such that the developer is enured to upgrade
-      // ordering. If the element definitions have loaded, domReady
-      // can be used to access upgraded elements.
-      if (!this.hasBeenAttached) {
-        this.hasBeenAttached = true;
-        if (this.domReady) {
-          this.async('domReady');
-        }
-      }
-    },
-    detachedCallback: function() {
-      if (!this.preventDispose) {
-        this.asyncUnbindAll();
-      }
-      // invoke user action
-      if (this.detached) {
-        this.detached();
-      }
-      // TODO(sorvell): bc
-      if (this.leftView) {
-        this.leftView();
-      }
-    },
-    // TODO(sorvell): bc
-    enteredViewCallback: function() {
-      this.attachedCallback();
-    },
-    // TODO(sorvell): bc
-    leftViewCallback: function() {
-      this.detachedCallback();
-    },
-    // TODO(sorvell): bc
-    enteredDocumentCallback: function() {
-      this.attachedCallback();
-    },
-    // TODO(sorvell): bc
-    leftDocumentCallback: function() {
-      this.detachedCallback();
-    },
-    // recursive ancestral <element> initialization, oldest first
-    parseDeclarations: function(p) {
-      if (p && p.element) {
-        this.parseDeclarations(p.__proto__);
-        p.parseDeclaration.call(this, p.element);
-      }
-    },
-    // parse input <element> as needed, override for custom behavior
-    parseDeclaration: function(elementElement) {
-      var template = this.fetchTemplate(elementElement);
-      if (template) {
-        var root = this.shadowFromTemplate(template);
-        this.shadowRoots[elementElement.name] = root;
-      }
-    },
-    // return a shadow-root template (if desired), override for custom behavior
-    fetchTemplate: function(elementElement) {
-      return elementElement.querySelector('template');
-    },
-    // utility function that creates a shadow root from a <template>
-    shadowFromTemplate: function(template) {
-      if (template) {
-        // make a shadow root
-        var root = this.createShadowRoot();
-        // stamp template
-        // which includes parsing and applying MDV bindings before being 
-        // inserted (to avoid {{}} in attribute values)
-        // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
-        var dom = this.instanceTemplate(template);
-        // append to shadow dom
-        root.appendChild(dom);
-        // perform post-construction initialization tasks on shadow root
-        this.shadowRootReady(root, template);
-        // return the created shadow root
-        return root;
-      }
-    },
-    // utility function that stamps a <template> into light-dom
-    lightFromTemplate: function(template, refNode) {
-      if (template) {
-        // TODO(sorvell): mark this element as a lightDOMController so that
-        // event listeners on bound nodes inside it will be called on it.
-        // Note, the expectation here is that events on all descendants 
-        // should be handled by this element.
-        this.lightDomController = true;
-        // stamp template
-        // which includes parsing and applying MDV bindings before being 
-        // inserted (to avoid {{}} in attribute values)
-        // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
-        var dom = this.instanceTemplate(template);
-        // append to shadow dom
-        if (refNode) {
-          this.insertBefore(dom, refNode);          
-        } else {
-          this.appendChild(dom);
-        }
-        // perform post-construction initialization tasks on ahem, light root
-        this.shadowRootReady(this);
-        // return the created shadow root
-        return dom;
-      }
-    },
-    shadowRootReady: function(root) {
-      // locate nodes with id and store references to them in this.$ hash
-      this.marshalNodeReferences(root);
-      // set up pointer gestures
-      PointerGestures.register(root);
-    },
-    // locate nodes with id and store references to them in this.$ hash
-    marshalNodeReferences: function(root) {
-      // establish $ instance variable
-      var $ = this.$ = this.$ || {};
-      // populate $ from nodes with ID from the LOCAL tree
-      if (root) {
-        var n$ = root.querySelectorAll("[id]");
-        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
-          $[n.id] = n;
-        };
-      }
-    },
-    attributeChangedCallback: function(name, oldValue) {
-      // TODO(sjmiles): adhoc filter
-      if (name !== 'class' && name !== 'style') {
-        this.attributeToProperty(name, this.getAttribute(name));
-      }
-      if (this.attributeChanged) {
-        this.attributeChanged.apply(this, arguments);
-      }
-    },
-    onMutation: function(node, listener) {
-      var observer = new MutationObserver(function(mutations) {
-        listener.call(this, observer, mutations);
-        observer.disconnect();
-      }.bind(this));
-      observer.observe(node, {childList: true, subtree: true});
-    }
-  };
-
-  // true if object has own PolymerBase api
-  function isBase(object) {
-    return object.hasOwnProperty('PolymerBase') 
-  }
-
-  // name a base constructor for dev tools
-
-  function PolymerBase() {};
-  PolymerBase.prototype = base;
-  base.constructor = PolymerBase;
-  
-  // exports
-
-  scope.Base = PolymerBase;
-  scope.isBase = isBase;
-  scope.api.instance.base = base;
-  
-})(Polymer);
-
-/*
- * 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.
- */
-(function(scope) {
-
-  // imports
-
-  var log = window.logFlags || {};
-  
-  // magic words
-  
-  var STYLE_SCOPE_ATTRIBUTE = 'element';
-  var STYLE_CONTROLLER_SCOPE = 'controller';
-  
-  var styles = {
-    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,
-    /**
-     * Installs external stylesheets and <style> elements with the attribute 
-     * polymer-scope='controller' into the scope of element. This is intended
-     * to be a called during custom element construction.
-    */
-    installControllerStyles: function() {
-      // apply controller styles, but only if they are not yet applied
-      var scope = this.findStyleScope();
-      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {
-        // allow inherited controller styles
-        var proto = getPrototypeOf(this), cssText = '';
-        while (proto && proto.element) {
-          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);
-          proto = getPrototypeOf(proto);
-        }
-        if (cssText) {
-          this.installScopeCssText(cssText, scope);
-        }
-      }
-    },
-    installScopeStyle: function(style, name, scope) {
-      var scope = scope || this.findStyleScope(), name = name || '';
-      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {
-        var cssText = '';
-        if (style instanceof Array) {
-          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {
-            cssText += s.textContent + '\n\n';
-          }
-        } else {
-          cssText = style.textContent;
-        }
-        this.installScopeCssText(cssText, scope, name);
-      }
-    },
-    installScopeCssText: function(cssText, scope, name) {
-      scope = scope || this.findStyleScope();
-      name = name || '';
-      if (!scope) {
-        return;
-      }
-      if (window.ShadowDOMPolyfill) {
-        cssText = shimCssText(cssText, scope.host);
-      }
-      var style = this.element.cssTextToScopeStyle(cssText,
-          STYLE_CONTROLLER_SCOPE);
-      Polymer.applyStyleToScope(style, scope);
-      // cache that this style has been applied
-      scope._scopeStyles[this.localName + name] = true;
-    },
-    findStyleScope: function(node) {
-      // find the shadow root that contains this element
-      var n = node || this;
-      while (n.parentNode) {
-        n = n.parentNode;
-      }
-      return n;
-    },
-    scopeHasNamedStyle: function(scope, name) {
-      scope._scopeStyles = scope._scopeStyles || {};
-      return scope._scopeStyles[name];
-    }
-  };
-  
-  // NOTE: use raw prototype traversal so that we ensure correct traversal
-  // on platforms where the protoype chain is simulated via __proto__ (IE10)
-  function getPrototypeOf(prototype) {
-    return prototype.__proto__;
-  }
-
-  function shimCssText(cssText, host) {
-    var name = '', is = false;
-    if (host) {
-      name = host.localName;
-      is = host.hasAttribute('is');
-    }
-    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);
-    return Platform.ShadowCSS.shimCssText(cssText, selector);
-  }
-
-  // exports
-
-  scope.api.instance.styles = styles;
-  
-})(Polymer);
-
-/*
- * 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.
- */
-(function(scope) {
-
-  // imports
-
-  var extend = scope.extend;
-  var api = scope.api;
-
-  // imperative implementation: Polymer()
-
-  // specify an 'own' prototype for tag `name`
-  function element(name, prototype) {
-    if (arguments.length === 1 && typeof arguments[0] !== 'string') {
-      prototype = name;
-      var script = document._currentScript;
-      name = script && script.parentNode && script.parentNode.getAttribute ?
-          script.parentNode.getAttribute('name') : '';
-      if (!name) {
-        throw 'Element name could not be inferred.';
-      }
-    }
-    if (getRegisteredPrototype[name]) {
-      throw 'Already registered (Polymer) prototype for element ' + name;
-    }
-    // cache the prototype
-    registerPrototype(name, prototype);
-    // notify the registrar waiting for 'name', if any
-    notifyPrototype(name);
-  }
-
-  // async prototype source
-
-  function waitingForPrototype(name, client) {
-    waitPrototype[name] = client;
-  }
-
-  var waitPrototype = {};
-
-  function notifyPrototype(name) {
-    if (waitPrototype[name]) {
-      waitPrototype[name].registerWhenReady();
-      delete waitPrototype[name];
-    }
-  }
-
-  // utility and bookkeeping
-
-  // maps tag names to prototypes, as registered with
-  // Polymer. Prototypes associated with a tag name
-  // using document.registerElement are available from
-  // HTMLElement.getPrototypeForTag().
-  // If an element was fully registered by Polymer, then
-  // Polymer.getRegisteredPrototype(name) === 
-  //   HTMLElement.getPrototypeForTag(name)
-
-  var prototypesByName = {};
-
-  function registerPrototype(name, prototype) {
-    return prototypesByName[name] = prototype || {};
-  }
-
-  function getRegisteredPrototype(name) {
-    return prototypesByName[name];
-  }
-
-  // exports
-
-  scope.getRegisteredPrototype = getRegisteredPrototype;
-  scope.waitingForPrototype = waitingForPrototype;
-
-  // namespace shenanigans so we can expose our scope on the registration 
-  // function
-
-  // make window.Polymer reference `element()`
-
-  window.Polymer = element;
-
-  // TODO(sjmiles): find a way to do this that is less terrible
-  // copy window.Polymer properties onto `element()`
-
-  extend(Polymer, scope);
-
-  // Under the HTMLImports polyfill, scripts in the main document
-  // do not block on imports; we want to allow calls to Polymer in the main
-  // document. Platform collects those calls until we can process them, which
-  // we do here.
-
-  var declarations = Platform.deliverDeclarations();
-  if (declarations) {
-    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {
-      element.apply(null, d);
-    }
-  }
-
-})(Polymer);
-
-/* 
- * 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.
- */
-
-(function(scope) {
-
-var path = {
-  resolveElementPaths: function(node) {
-    Platform.urlResolver.resolveDom(node);
-  },
-  addResolvePathApi: function() {
-    // let assetpath attribute modify the resolve path
-    var assetPath = this.getAttribute('assetpath') || '';
-    var root = new URL(assetPath, this.ownerDocument.baseURI);
-    this.prototype.resolvePath = function(urlPath, base) {
-      var u = new URL(urlPath, base || root);
-      return u.href;
-    };
-  }
-};
-
-// exports
-scope.api.declaration.path = path;
-
-})(Polymer);
-
-/*
- * 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.
- */
-(function(scope) {
-
-  // imports
-
-  var log = window.logFlags || {};
-  var api = scope.api.instance.styles;
-  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;
-
-  // magic words
-
-  var STYLE_SELECTOR = 'style';
-  var STYLE_LOADABLE_MATCH = '@import';
-  var SHEET_SELECTOR = 'link[rel=stylesheet]';
-  var STYLE_GLOBAL_SCOPE = 'global';
-  var SCOPE_ATTR = 'polymer-scope';
-
-  var styles = {
-    // returns true if resources are loading
-    loadStyles: function(callback) {
-      var content = this.templateContent();
-      if (content) {
-        this.convertSheetsToStyles(content);
-      }
-      var styles = this.findLoadableStyles(content);
-      if (styles.length) {
-        Platform.styleResolver.loadStyles(styles, callback);
-      } else if (callback) {
-        callback();
-      }
-    },
-    convertSheetsToStyles: function(root) {
-      var s$ = root.querySelectorAll(SHEET_SELECTOR);
-      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {
-        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),
-            this.ownerDocument);
-        this.copySheetAttributes(c, s);
-        s.parentNode.replaceChild(c, s);
-      }
-    },
-    copySheetAttributes: function(style, link) {
-      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {
-        if (a.name !== 'rel' && a.name !== 'href') {
-          style.setAttribute(a.name, a.value);
-        }
-      }
-    },
-    findLoadableStyles: function(root) {
-      var loadables = [];
-      if (root) {
-        var s$ = root.querySelectorAll(STYLE_SELECTOR);
-        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {
-          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {
-            loadables.push(s);
-          }
-        }
-      }
-      return loadables;
-    },
-    /**
-     * Install external stylesheets loaded in <polymer-element> elements into the 
-     * element's template.
-     * @param elementElement The <element> element to style.
-     */
-    installSheets: function() {
-      this.cacheSheets();
-      this.cacheStyles();
-      this.installLocalSheets();
-      this.installGlobalStyles();
-    },
-    /**
-     * Remove all sheets from element and store for later use.
-     */
-    cacheSheets: function() {
-      this.sheets = this.findNodes(SHEET_SELECTOR);
-      this.sheets.forEach(function(s) {
-        if (s.parentNode) {
-          s.parentNode.removeChild(s);
-        }
-      });
-    },
-    cacheStyles: function() {
-      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');
-      this.styles.forEach(function(s) {
-        if (s.parentNode) {
-          s.parentNode.removeChild(s);
-        }
-      });
-    },
-    /**
-     * Takes external stylesheets loaded in an <element> element and moves
-     * their content into a <style> element inside the <element>'s template.
-     * The sheet is then removed from the <element>. This is done only so 
-     * that if the element is loaded in the main document, the sheet does
-     * not become active.
-     * Note, ignores sheets with the attribute 'polymer-scope'.
-     * @param elementElement The <element> element to style.
-     */
-    installLocalSheets: function () {
-      var sheets = this.sheets.filter(function(s) {
-        return !s.hasAttribute(SCOPE_ATTR);
-      });
-      var content = this.templateContent();
-      if (content) {
-        var cssText = '';
-        sheets.forEach(function(sheet) {
-          cssText += cssTextFromSheet(sheet) + '\n';
-        });
-        if (cssText) {
-          var style = createStyleElement(cssText, this.ownerDocument);
-          content.insertBefore(style, content.firstChild);
-        }
-      }
-    },
-    findNodes: function(selector, matcher) {
-      var nodes = this.querySelectorAll(selector).array();
-      var content = this.templateContent();
-      if (content) {
-        var templateNodes = content.querySelectorAll(selector).array();
-        nodes = nodes.concat(templateNodes);
-      }
-      return matcher ? nodes.filter(matcher) : nodes;
-    },
-    templateContent: function() {
-      var template = this.querySelector('template');
-      return template && templateContent(template);
-    },
-    /**
-     * Promotes external stylesheets and <style> elements with the attribute 
-     * polymer-scope='global' into global scope.
-     * This is particularly useful for defining @keyframe rules which 
-     * currently do not function in scoped or shadow style elements.
-     * (See wkb.ug/72462)
-     * @param elementElement The <element> element to style.
-    */
-    // TODO(sorvell): remove when wkb.ug/72462 is addressed.
-    installGlobalStyles: function() {
-      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);
-      applyStyleToScope(style, document.head);
-    },
-    cssTextForScope: function(scopeDescriptor) {
-      var cssText = '';
-      // handle stylesheets
-      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';
-      var matcher = function(s) {
-        return matchesSelector(s, selector);
-      };
-      var sheets = this.sheets.filter(matcher);
-      sheets.forEach(function(sheet) {
-        cssText += cssTextFromSheet(sheet) + '\n\n';
-      });
-      // handle cached style elements
-      var styles = this.styles.filter(matcher);
-      styles.forEach(function(style) {
-        cssText += style.textContent + '\n\n';
-      });
-      return cssText;
-    },
-    styleForScope: function(scopeDescriptor) {
-      var cssText = this.cssTextForScope(scopeDescriptor);
-      return this.cssTextToScopeStyle(cssText, scopeDescriptor);
-    },
-    cssTextToScopeStyle: function(cssText, scopeDescriptor) {
-      if (cssText) {
-        var style = createStyleElement(cssText);
-        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +
-            '-' + scopeDescriptor);
-        return style;
-      }
-    }
-  };
-
-  function importRuleForSheet(sheet, baseUrl) {
-    var href = new URL(sheet.getAttribute('href'), baseUrl).href;
-    return '@import \'' + href + '\';';
-  }
-
-  function applyStyleToScope(style, scope) {
-    if (style) {
-      if (scope === document) {
-        scope = document.head;
-      }
-      if (window.ShadowDOMPolyfill) {
-        scope = document.head;
-      }
-      // TODO(sorvell): necessary for IE
-      // see https://connect.microsoft.com/IE/feedback/details/790212/
-      // cloning-a-style-element-and-adding-to-document-produces
-      // -unexpected-result#details
-      // var clone = style.cloneNode(true);
-      var clone = createStyleElement(style.textContent);
-      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);
-      if (attr) {
-        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);
-      }
-      // TODO(sorvell): probably too brittle; try to figure out 
-      // where to put the element.
-      var refNode = scope.firstElementChild;
-      if (scope === document.head) {
-        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';
-        var s$ = document.head.querySelectorAll(selector);
-        if (s$.length) {
-          refNode = s$[s$.length-1].nextElementSibling;
-        }
-      }
-      scope.insertBefore(clone, refNode);
-    }
-  }
-
-  function createStyleElement(cssText, scope) {
-    scope = scope || document;
-    scope = scope.createElement ? scope : scope.ownerDocument;
-    var style = scope.createElement('style');
-    style.textContent = cssText;
-    return style;
-  }
-
-  function cssTextFromSheet(sheet) {
-    return (sheet && sheet.__resource) || '';
-  }
-
-  function matchesSelector(node, inSelector) {
-    if (matches) {
-      return matches.call(node, inSelector);
-    }
-  }
-  var p = HTMLElement.prototype;
-  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector 
-      || p.mozMatchesSelector;
-  
-  // exports
-
-  scope.api.declaration.styles = styles;
-  scope.applyStyleToScope = applyStyleToScope;
-  
-})(Polymer);
-
-/*
- * 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.
- */
-
-(function(scope) {
-
-  // imports
-
-  var log = window.logFlags || {};
-  var api = scope.api.instance.events;
-  var EVENT_PREFIX = api.EVENT_PREFIX;
-  // polymer-element declarative api: events feature
-
-  var events = { 
-    parseHostEvents: function() {
-      // our delegates map
-      var delegates = this.prototype.eventDelegates;
-      // extract data from attributes into delegates
-      this.addAttributeDelegates(delegates);
-    },
-    addAttributeDelegates: function(delegates) {
-      // for each attribute
-      for (var i=0, a; a=this.attributes[i]; i++) {
-        // does it have magic marker identifying it as an event delegate?
-        if (this.hasEventPrefix(a.name)) {
-          // if so, add the info to delegates
-          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')
-              .replace('}}', '').trim();
-        }
-      }
-    },
-    // starts with 'on-'
-    hasEventPrefix: function (n) {
-      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');
-    },
-    removeEventPrefix: function(n) {
-      return n.slice(prefixLength);
-    }
-  };
-
-  var prefixLength = EVENT_PREFIX.length;
-
-  // exports
-  scope.api.declaration.events = events;
-
-})(Polymer);
-/*

- * 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.

- */

-(function(scope) {

-

-  // element api

-

-  var properties = {

-    inferObservers: function(prototype) {

-      // called before prototype.observe is chained to inherited object

-      var observe = prototype.observe, property;

-      for (var n in prototype) {

-        if (n.slice(-7) === 'Changed') {

-          if (!observe) {

-            observe  = (prototype.observe = {});

-          }

-          property = n.slice(0, -7)

-          observe[property] = observe[property] || n;

-        }

-      }

-    },

-    explodeObservers: function(prototype) {

-      // called before prototype.observe is chained to inherited object

-      var o = prototype.observe;

-      if (o) {

-        var exploded = {};

-        for (var n in o) {

-          var names = n.split(' ');

-          for (var i=0, ni; ni=names[i]; i++) {

-            exploded[ni] = o[n];

-          }

-        }

-        prototype.observe = exploded;

-      }

-    },

-    optimizePropertyMaps: function(prototype) {

-      if (prototype.observe) {

-        // construct name list

-        var a = prototype._observeNames = [];

-        for (var n in prototype.observe) {

-          var names = n.split(' ');

-          for (var i=0, ni; ni=names[i]; i++) {

-            a.push(ni);

-          }

-        }

-      }

-      if (prototype.publish) {

-        // construct name list

-        var a = prototype._publishNames = [];

-        for (var n in prototype.publish) {

-          a.push(n);

-        }

-      }

-    },

-    publishProperties: function(prototype, base) {

-      // if we have any properties to publish

-      var publish = prototype.publish;

-      if (publish) {

-        // transcribe `publish` entries onto own prototype

-        this.requireProperties(publish, prototype, base);

-        // construct map of lower-cased property names

-        prototype._publishLC = this.lowerCaseMap(publish);

-      }

-    },

-    requireProperties: function(properties, prototype, base) {

-      // ensure a prototype value for each property

-      for (var n in properties) {

-        if (prototype[n] === undefined && base[n] === undefined) {

-          prototype[n] = properties[n];

-        }

-      }

-    },

-    lowerCaseMap: function(properties) {

-      var map = {};

-      for (var n in properties) {

-        map[n.toLowerCase()] = n;

-      }

-      return map;

-    }

-  };

-

-  // exports

-

-  scope.api.declaration.properties = properties;

-

-})(Polymer);

-
-/*
- * 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.
- */
-(function(scope) {
-
-  // magic words
-
-  var ATTRIBUTES_ATTRIBUTE = 'attributes';
-  var ATTRIBUTES_REGEX = /\s|,/;
-
-  // attributes api
-
-  var attributes = {
-    inheritAttributesObjects: function(prototype) {
-      // chain our lower-cased publish map to the inherited version
-      this.inheritObject(prototype, 'publishLC');
-      // chain our instance attributes map to the inherited version
-      this.inheritObject(prototype, '_instanceAttributes');
-    },
-    publishAttributes: function(prototype, base) {
-      // merge names from 'attributes' attribute
-      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);
-      if (attributes) {
-        // get properties to publish
-        var publish = prototype.publish || (prototype.publish = {});
-        // names='a b c' or names='a,b,c'
-        var names = attributes.split(ATTRIBUTES_REGEX);
-        // record each name for publishing
-        for (var i=0, l=names.length, n; i<l; i++) {
-          // remove excess ws
-          n = names[i].trim();
-          // do not override explicit entries
-          if (n && publish[n] === undefined && base[n] === undefined) {
-            publish[n] = null;
-          }
-        }
-      }
-    },
-    // record clonable attributes from <element>
-    accumulateInstanceAttributes: function() {
-      // inherit instance attributes
-      var clonable = this.prototype._instanceAttributes;
-      // merge attributes from element
-      var a$ = this.attributes;
-      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  
-        if (this.isInstanceAttribute(a.name)) {
-          clonable[a.name] = a.value;
-        }
-      }
-    },
-    isInstanceAttribute: function(name) {
-      return !this.blackList[name] && name.slice(0,3) !== 'on-';
-    },
-    // do not clone these attributes onto instances
-    blackList: {
-      name: 1,
-      'extends': 1,
-      constructor: 1,
-      noscript: 1,
-      assetpath: 1,
-      'cache-csstext': 1
-    }
-  };
-
-  // add ATTRIBUTES_ATTRIBUTE to the blacklist
-  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;
-
-  // exports
-
-  scope.api.declaration.attributes = attributes;
-
-})(Polymer);
-
-/*
- * 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.
- */
-(function(scope) {
-
-  // imports
-  
-  var api = scope.api;
-  var isBase = scope.isBase;
-  var extend = scope.extend;
-
-  // prototype api
-
-  var prototype = {
-
-    register: function(name, extendeeName) {
-      // build prototype combining extendee, Polymer base, and named api
-      this.buildPrototype(name, extendeeName);
-      // register our custom element with the platform
-      this.registerPrototype(name, extendeeName);
-      // reference constructor in a global named by 'constructor' attribute
-      this.publishConstructor();
-    },
-
-    buildPrototype: function(name, extendeeName) {
-      // get our custom prototype (before chaining)
-      var extension = scope.getRegisteredPrototype(name);
-      // get basal prototype
-      var base = this.generateBasePrototype(extendeeName);
-      // implement declarative features
-      this.desugarBeforeChaining(extension, base);
-      // join prototypes
-      this.prototype = this.chainPrototypes(extension, base);
-      // more declarative features
-      this.desugarAfterChaining(name, extendeeName);
-    },
-
-    desugarBeforeChaining: function(prototype, base) {
-      // back reference declaration element
-      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`
-      prototype.element = this;
-      // transcribe `attributes` declarations onto own prototype's `publish`
-      this.publishAttributes(prototype, base);
-      // `publish` properties to the prototype and to attribute watch
-      this.publishProperties(prototype, base);
-      // infer observers for `observe` list based on method names
-      this.inferObservers(prototype);
-      // desugar compound observer syntax, e.g. 'a b c' 
-      this.explodeObservers(prototype);
-    },
-
-    chainPrototypes: function(prototype, base) {
-      // chain various meta-data objects to inherited versions
-      this.inheritMetaData(prototype, base);
-      // chain custom api to inherited
-      var chained = this.chainObject(prototype, base);
-      // x-platform fixup
-      ensurePrototypeTraversal(chained);
-      return chained;
-    },
-
-    inheritMetaData: function(prototype, base) {
-      // chain observe object to inherited
-      this.inheritObject('observe', prototype, base);
-      // chain publish object to inherited
-      this.inheritObject('publish', prototype, base);
-      // chain our lower-cased publish map to the inherited version
-      this.inheritObject('_publishLC', prototype, base);
-      // chain our instance attributes map to the inherited version
-      this.inheritObject('_instanceAttributes', prototype, base);
-      // chain our event delegates map to the inherited version
-      this.inheritObject('eventDelegates', prototype, base);
-    },
-
-    // implement various declarative features
-    desugarAfterChaining: function(name, extendee) {
-      // build side-chained lists to optimize iterations
-      this.optimizePropertyMaps(this.prototype);
-      // install external stylesheets as if they are inline
-      this.installSheets();
-      // adjust any paths in dom from imports
-      this.resolveElementPaths(this);
-      // compile list of attributes to copy to instances
-      this.accumulateInstanceAttributes();
-      // parse on-* delegates declared on `this` element
-      this.parseHostEvents();
-      //
-      // install a helper method this.resolvePath to aid in 
-      // setting resource urls. e.g.
-      // this.$.image.src = this.resolvePath('images/foo.png')
-      this.addResolvePathApi();
-      // under ShadowDOMPolyfill, transforms to approximate missing CSS features
-      if (window.ShadowDOMPolyfill) {
-        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);
-      }
-      // allow custom element access to the declarative context
-      if (this.prototype.registerCallback) {
-        this.prototype.registerCallback(this);
-      }
-    },
-
-    // if a named constructor is requested in element, map a reference
-    // to the constructor to the given symbol
-    publishConstructor: function() {
-      var symbol = this.getAttribute('constructor');
-      if (symbol) {
-        window[symbol] = this.ctor;
-      }
-    },
-
-    // build prototype combining extendee, Polymer base, and named api
-    generateBasePrototype: function(extnds) {
-      var prototype = this.findBasePrototype(extnds);
-      if (!prototype) {
-        // create a prototype based on tag-name extension
-        var prototype = HTMLElement.getPrototypeForTag(extnds);
-        // insert base api in inheritance chain (if needed)
-        prototype = this.ensureBaseApi(prototype);
-        // memoize this base
-        memoizedBases[extnds] = prototype;
-      }
-      return prototype;
-    },
-
-    findBasePrototype: function(name) {
-      return memoizedBases[name];
-    },
-
-    // install Polymer instance api into prototype chain, as needed 
-    ensureBaseApi: function(prototype) {
-      if (prototype.PolymerBase) {
-        return prototype;
-      }
-      var extended = Object.create(prototype);
-      // we need a unique copy of base api for each base prototype
-      // therefore we 'extend' here instead of simply chaining
-      api.publish(api.instance, extended);
-      // TODO(sjmiles): sharing methods across prototype chains is
-      // not supported by 'super' implementation which optimizes
-      // by memoizing prototype relationships.
-      // Probably we should have a version of 'extend' that is 
-      // share-aware: it could study the text of each function,
-      // look for usage of 'super', and wrap those functions in
-      // closures.
-      // As of now, there is only one problematic method, so 
-      // we just patch it manually.
-      // To avoid re-entrancy problems, the special super method
-      // installed is called `mixinSuper` and the mixin method
-      // must use this method instead of the default `super`.
-      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');
-      // return buffed-up prototype
-      return extended;
-    },
-
-    mixinMethod: function(extended, prototype, api, name) {
-      var $super = function(args) {
-        return prototype[name].apply(this, args);
-      };
-      extended[name] = function() {
-        this.mixinSuper = $super;
-        return api[name].apply(this, arguments);
-      }
-    },
-
-    // ensure prototype[name] inherits from a prototype.prototype[name]
-    inheritObject: function(name, prototype, base) {
-      // require an object
-      var source = prototype[name] || {};
-      // chain inherited properties onto a new object
-      prototype[name] = this.chainObject(source, base[name]);
-    },
-
-    // register 'prototype' to custom element 'name', store constructor 
-    registerPrototype: function(name, extendee) { 
-      var info = {
-        prototype: this.prototype
-      }
-      // native element must be specified in extends
-      var typeExtension = this.findTypeExtension(extendee);
-      if (typeExtension) {
-        info.extends = typeExtension;
-      }
-      // register the prototype with HTMLElement for name lookup
-      HTMLElement.register(name, this.prototype);
-      // register the custom type
-      this.ctor = document.registerElement(name, info);
-    },
-
-    findTypeExtension: function(name) {
-      if (name && name.indexOf('-') < 0) {
-        return name;
-      } else {
-        var p = this.findBasePrototype(name);
-        if (p.element) {
-          return this.findTypeExtension(p.element.extends);
-        }
-      }
-    }
-
-  };
-
-  // memoize base prototypes
-  var memoizedBases = {};
-
-  // implementation of 'chainObject' depends on support for __proto__
-  if (Object.__proto__) {
-    prototype.chainObject = function(object, inherited) {
-      if (object && inherited && object !== inherited) {
-        object.__proto__ = inherited;
-      }
-      return object;
-    }
-  } else {
-    prototype.chainObject = function(object, inherited) {
-      if (object && inherited && object !== inherited) {
-        var chained = Object.create(inherited);
-        object = extend(chained, object);
-      }
-      return object;
-    }
-  }
-
-  // On platforms that do not support __proto__ (versions of IE), the prototype
-  // chain of a custom element is simulated via installation of __proto__.
-  // Although custom elements manages this, we install it here so it's
-  // available during desugaring.
-  function ensurePrototypeTraversal(prototype) {
-    if (!Object.__proto__) {
-      var ancestor = Object.getPrototypeOf(prototype);
-      prototype.__proto__ = ancestor;
-      if (isBase(ancestor)) {
-        ancestor.__proto__ = Object.getPrototypeOf(ancestor);
-      }
-    }
-  }
-
-  // exports
-
-  api.declaration.prototype = prototype;
-
-})(Polymer);
-
-/*
- * 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.
- */
-(function(scope) {
-
-  var queue = {
-    // tell the queue to wait for an element to be ready
-    wait: function(element, check, go) {
-      if (this.indexOf(element) === -1) {
-        this.add(element);
-        element.__check = check;
-        element.__go = go;
-      }
-      return (this.indexOf(element) !== 0);
-    },
-    add: function(element) {
-      //console.log('queueing', element.name);
-      queueForElement(element).push(element);
-    },
-    indexOf: function(element) {
-      var i = queueForElement(element).indexOf(element);
-      if (i >= 0 && document.contains(element)) {
-        i += (HTMLImports.useNative || HTMLImports.ready) ? 
-          importQueue.length : 1e9;
-      }
-      return i;  
-    },
-    // tell the queue an element is ready to be registered
-    go: function(element) {
-      var readied = this.remove(element);
-      if (readied) {
-        readied.__go.call(readied);
-        readied.__check = readied.__go = null;
-        this.check();
-      }
-    },
-    remove: function(element) {
-      var i = this.indexOf(element);
-      if (i !== 0) {
-        //console.warn('queue order wrong', i);
-        return;
-      }
-      return queueForElement(element).shift();
-    },
-    check: function() {
-      // next
-      var element = this.nextElement();
-      if (element) {
-        element.__check.call(element);
-      }
-      if (this.canReady()) {
-        this.ready();
-        return true;
-      }
-    },
-    nextElement: function() {
-      return nextQueued();
-    },
-    canReady: function() {
-      return !this.waitToReady && this.isEmpty();
-    },
-    isEmpty: function() {
-      return !importQueue.length && !mainQueue.length;
-    },
-    ready: function() {
-      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading
-      // while registering. This way we avoid having to upgrade each document
-      // piecemeal per registration and can instead register all elements
-      // and upgrade once in a batch. Without this optimization, upgrade time
-      // degrades significantly when SD polyfill is used. This is mainly because
-      // querying the document tree for elements is slow under the SD polyfill.
-      if (CustomElements.ready === false) {
-        CustomElements.upgradeDocumentTree(document);
-        CustomElements.ready = true;
-      }
-      if (readyCallbacks) {
-        var fn;
-        while (readyCallbacks.length) {
-          fn = readyCallbacks.shift();
-          fn();
-        }
-      }
-    },
-    addReadyCallback: function(callback) {
-      if (callback) {
-        readyCallbacks.push(callback);
-      }
-    },
-    waitToReady: true
-  };
-
-  var importQueue = [];
-  var mainQueue = [];
-  var readyCallbacks = [];
-
-  function queueForElement(element) {
-    return document.contains(element) ? mainQueue : importQueue;
-  }
-
-  function nextQueued() {
-    return importQueue.length ? importQueue[0] : mainQueue[0];
-  }
-
-  var polymerReadied = false; 
-
-  document.addEventListener('WebComponentsReady', function() {
-    CustomElements.ready = false;
-  });
-  
-  function whenPolymerReady(callback) {
-    queue.waitToReady = true;
-    CustomElements.ready = false;
-    HTMLImports.whenImportsReady(function() {
-      queue.addReadyCallback(callback);
-      queue.waitToReady = false;
-      queue.check();
-    });
-  }
-
-  // exports
-  scope.queue = queue;
-  scope.whenPolymerReady = whenPolymerReady;
-})(Polymer);
-
-/*
- * 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.
- */
-(function(scope) {
-
-  var whenPolymerReady = scope.whenPolymerReady;
-
-  function importElements(elementOrFragment, callback) {
-    if (elementOrFragment) {
-      document.head.appendChild(elementOrFragment);
-      whenPolymerReady(callback);
-    } else if (callback) {
-      callback();
-    }
-  }
-
-  function importUrls(urls, callback) {
-    if (urls && urls.length) {
-        var frag = document.createDocumentFragment();
-        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {
-          link = document.createElement('link');
-          link.rel = 'import';
-          link.href = url;
-          frag.appendChild(link);
-        }
-        importElements(frag, callback);
-    } else if (callback) {
-      callback();
-    }
-  }
-
-  // exports
-  scope.import = importUrls;
-  scope.importElements = importElements;
-
-})(Polymer);
-
-/*
- * 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.
- */
-(function(scope) {
-
-  // imports
-
-  var extend = scope.extend;
-  var api = scope.api;
-  var queue = scope.queue;
-  var whenPolymerReady = scope.whenPolymerReady;
-  var getRegisteredPrototype = scope.getRegisteredPrototype;
-  var waitingForPrototype = scope.waitingForPrototype;
-
-  // declarative implementation: <polymer-element>
-
-  var prototype = extend(Object.create(HTMLElement.prototype), {
-
-    createdCallback: function() {
-      if (this.getAttribute('name')) {
-        this.init();
-      }
-    },
-
-    init: function() {
-      // fetch declared values
-      this.name = this.getAttribute('name');
-      this.extends = this.getAttribute('extends');
-      // initiate any async resource fetches
-      this.loadResources();
-      // register when all constraints are met
-      this.registerWhenReady();
-    },
-
-    registerWhenReady: function() {
-     if (this.registered
-       || this.waitingForPrototype(this.name)
-       || this.waitingForQueue()
-       || this.waitingForResources()) {
-          return;
-      }
-      // TODO(sorvell): ends up calling '_register' by virtue
-      // of `waitingForQueue` (see below)
-      queue.go(this);
-    },
-
-    // TODO(sorvell): refactor, this method is private-ish, but it's being
-    // called by the queue object.
-    _register: function() {
-      //console.log('registering', this.name);
-      //console.group('registering', this.name);
-      // warn if extending from a custom element not registered via Polymer
-      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {
-        console.warn('%s is attempting to extend %s, an unregistered element ' +
-            'or one that was not registered with Polymer.', this.name,
-            this.extends);
-      }
-      this.register(this.name, this.extends);
-      this.registered = true;
-      //console.groupEnd();
-    },
-
-    waitingForPrototype: function(name) {
-      if (!getRegisteredPrototype(name)) {
-        // then wait for a prototype
-        waitingForPrototype(name, this);
-        // emulate script if user is not supplying one
-        this.handleNoScript(name);
-        // prototype not ready yet
-        return true;
-      }
-    },
-
-    handleNoScript: function(name) {
-      // if explicitly marked as 'noscript'
-      if (this.hasAttribute('noscript') && !this.noscript) {
-        this.noscript = true;
-        // TODO(sorvell): CustomElements polyfill awareness:
-        // noscript elements should upgrade in logical order
-        // script injection ensures this under native custom elements;
-        // under imports + ce polyfills, scripts run before upgrades.
-        // dependencies should be ready at upgrade time so register
-        // prototype at this time.
-        if (window.CustomElements && !CustomElements.useNative) {
-          Polymer(name);
-        } else {
-          var script = document.createElement('script');
-          script.textContent = 'Polymer(\'' + name + '\');';
-          this.appendChild(script);
-        }
-      }
-    },
-
-    waitingForResources: function() {
-      return this._needsResources;
-    },
-
-    // NOTE: Elements must be queued in proper order for inheritance/composition
-    // dependency resolution. Previously this was enforced for inheritance,
-    // and by rule for composition. It's now entirely by rule.
-    waitingForQueue: function() {
-      return queue.wait(this, this.registerWhenReady, this._register);
-    },
-
-    loadResources: function() {
-      this._needsResources = true;
-      this.loadStyles(function() {
-        this._needsResources = false;
-        this.registerWhenReady();
-      }.bind(this));
-    }
-
-  });
-
-  // semi-pluggable APIs 
-
-  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently
-  // the various plugins are allowed to depend on each other directly)
-  api.publish(api.declaration, prototype);
-
-  // utility and bookkeeping
-
-  function isRegistered(name) {
-    return Boolean(HTMLElement.getPrototypeForTag(name));
-  }
-
-  function isCustomTag(name) {
-    return (name && name.indexOf('-') >= 0);
-  }
-
-  // exports
-
-  scope.getRegisteredPrototype = getRegisteredPrototype;
-  
-  // boot tasks
-
-  whenPolymerReady(function() {
-    document.body.removeAttribute('unresolved');
-    document.dispatchEvent(
-      new CustomEvent('polymer-ready', {bubbles: true})
-    );
-  });
-
-  // register polymer-element with document
-
-  document.registerElement('polymer-element', {prototype: prototype});
-
-})(Polymer);
-
-//# sourceMappingURL=polymer.concat.js.map
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.concat.js b/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.concat.js
deleted file mode 100644
index 9fa19b5..0000000
--- a/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.concat.js
+++ /dev/null
@@ -1,17703 +0,0 @@
-/*
- * Copyright 2012 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.
- */
-
-if (typeof WeakMap === 'undefined') {
-  (function() {
-    var defineProperty = Object.defineProperty;
-    var counter = Date.now() % 1e9;
-
-    var WeakMap = function() {
-      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');
-    };
-
-    WeakMap.prototype = {
-      set: function(key, value) {
-        var entry = key[this.name];
-        if (entry && entry[0] === key)
-          entry[1] = value;
-        else
-          defineProperty(key, this.name, {value: [key, value], writable: true});
-      },
-      get: function(key) {
-        var entry;
-        return (entry = key[this.name]) && entry[0] === key ?
-            entry[1] : undefined;
-      },
-      delete: function(key) {
-        this.set(key, undefined);
-      }
-    };
-
-    window.WeakMap = WeakMap;
-  })();
-}
-
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(global) {
-  'use strict';
-
-  // Detect and do basic sanity checking on Object/Array.observe.
-  function detectObjectObserve() {
-    if (typeof Object.observe !== 'function' ||
-        typeof Array.observe !== 'function') {
-      return false;
-    }
-
-    var records = [];
-
-    function callback(recs) {
-      records = recs;
-    }
-
-    var test = {};
-    var arr = [];
-    Object.observe(test, callback);
-    Array.observe(arr, callback);
-    test.id = 1;
-    test.id = 2;
-    delete test.id;
-    arr.push(1, 2);
-    arr.length = 0;
-
-    Object.deliverChangeRecords(callback);
-    if (records.length !== 5)
-      return false;
-
-    if (records[0].type != 'add' ||
-        records[1].type != 'update' ||
-        records[2].type != 'delete' ||
-        records[3].type != 'splice' ||
-        records[4].type != 'splice') {
-      return false;
-    }
-
-    Object.unobserve(test, callback);
-    Array.unobserve(arr, callback);
-
-    return true;
-  }
-
-  var hasObserve = detectObjectObserve();
-
-  function detectEval() {
-    // don't test for eval if document has CSP securityPolicy object and we can see that
-    // eval is not supported. This avoids an error message in console even when the exception
-    // is caught
-    if (global.document &&
-        'securityPolicy' in global.document &&
-        !global.document.securityPolicy.allowsEval) {
-      return false;
-    }
-
-    try {
-      var f = new Function('', 'return true;');
-      return f();
-    } catch (ex) {
-      return false;
-    }
-  }
-
-  var hasEval = detectEval();
-
-  function isIndex(s) {
-    return +s === s >>> 0;
-  }
-
-  function toNumber(s) {
-    return +s;
-  }
-
-  function isObject(obj) {
-    return obj === Object(obj);
-  }
-
-  var numberIsNaN = global.Number.isNaN || function isNaN(value) {
-    return typeof value === 'number' && global.isNaN(value);
-  }
-
-  function areSameValue(left, right) {
-    if (left === right)
-      return left !== 0 || 1 / left === 1 / right;
-    if (numberIsNaN(left) && numberIsNaN(right))
-      return true;
-
-    return left !== left && right !== right;
-  }
-
-  var createObject = ('__proto__' in {}) ?
-    function(obj) { return obj; } :
-    function(obj) {
-      var proto = obj.__proto__;
-      if (!proto)
-        return obj;
-      var newObject = Object.create(proto);
-      Object.getOwnPropertyNames(obj).forEach(function(name) {
-        Object.defineProperty(newObject, name,
-                             Object.getOwnPropertyDescriptor(obj, name));
-      });
-      return newObject;
-    };
-
-  var identStart = '[\$_a-zA-Z]';
-  var identPart = '[\$_a-zA-Z0-9]';
-  var ident = identStart + '+' + identPart + '*';
-  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';
-  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';
-  var path = '(?:' + identOrElementIndex + ')(?:\\s*\\.\\s*' + identOrElementIndex + ')*';
-  var pathRegExp = new RegExp('^' + path + '$');
-
-  function isPathValid(s) {
-    if (typeof s != 'string')
-      return false;
-    s = s.trim();
-
-    if (s == '')
-      return true;
-
-    if (s[0] == '.')
-      return false;
-
-    return pathRegExp.test(s);
-  }
-
-  var constructorIsPrivate = {};
-
-  function Path(s, privateToken) {
-    if (privateToken !== constructorIsPrivate)
-      throw Error('Use Path.get to retrieve path objects');
-
-    if (s.trim() == '')
-      return this;
-
-    if (isIndex(s)) {
-      this.push(s);
-      return this;
-    }
-
-    s.split(/\s*\.\s*/).filter(function(part) {
-      return part;
-    }).forEach(function(part) {
-      this.push(part);
-    }, this);
-
-    if (hasEval && this.length) {
-      this.getValueFrom = this.compiledGetValueFromFn();
-    }
-  }
-
-  // TODO(rafaelw): Make simple LRU cache
-  var pathCache = {};
-
-  function getPath(pathString) {
-    if (pathString instanceof Path)
-      return pathString;
-
-    if (pathString == null)
-      pathString = '';
-
-    if (typeof pathString !== 'string')
-      pathString = String(pathString);
-
-    var path = pathCache[pathString];
-    if (path)
-      return path;
-    if (!isPathValid(pathString))
-      return invalidPath;
-    var path = new Path(pathString, constructorIsPrivate);
-    pathCache[pathString] = path;
-    return path;
-  }
-
-  Path.get = getPath;
-
-  Path.prototype = createObject({
-    __proto__: [],
-    valid: true,
-
-    toString: function() {
-      return this.join('.');
-    },
-
-    getValueFrom: function(obj, directObserver) {
-      for (var i = 0; i < this.length; i++) {
-        if (obj == null)
-          return;
-        obj = obj[this[i]];
-      }
-      return obj;
-    },
-
-    iterateObjects: function(obj, observe) {
-      for (var i = 0; i < this.length; i++) {
-        if (i)
-          obj = obj[this[i - 1]];
-        if (!isObject(obj))
-          return;
-        observe(obj);
-      }
-    },
-
-    compiledGetValueFromFn: function() {
-      var accessors = this.map(function(ident) {
-        return isIndex(ident) ? '["' + ident + '"]' : '.' + ident;
-      });
-
-      var str = '';
-      var pathString = 'obj';
-      str += 'if (obj != null';
-      var i = 0;
-      for (; i < (this.length - 1); i++) {
-        var ident = this[i];
-        pathString += accessors[i];
-        str += ' &&\n     ' + pathString + ' != null';
-      }
-      str += ')\n';
-
-      pathString += accessors[i];
-
-      str += '  return ' + pathString + ';\nelse\n  return undefined;';
-      return new Function('obj', str);
-    },
-
-    setValueFrom: function(obj, value) {
-      if (!this.length)
-        return false;
-
-      for (var i = 0; i < this.length - 1; i++) {
-        if (!isObject(obj))
-          return false;
-        obj = obj[this[i]];
-      }
-
-      if (!isObject(obj))
-        return false;
-
-      obj[this[i]] = value;
-      return true;
-    }
-  });
-
-  var invalidPath = new Path('', constructorIsPrivate);
-  invalidPath.valid = false;
-  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};
-
-  var MAX_DIRTY_CHECK_CYCLES = 1000;
-
-  function dirtyCheck(observer) {
-    var cycles = 0;
-    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {
-      cycles++;
-    }
-    if (global.testingExposeCycleCount)
-      global.dirtyCheckCycleCount = cycles;
-
-    return cycles > 0;
-  }
-
-  function objectIsEmpty(object) {
-    for (var prop in object)
-      return false;
-    return true;
-  }
-
-  function diffIsEmpty(diff) {
-    return objectIsEmpty(diff.added) &&
-           objectIsEmpty(diff.removed) &&
-           objectIsEmpty(diff.changed);
-  }
-
-  function diffObjectFromOldObject(object, oldObject) {
-    var added = {};
-    var removed = {};
-    var changed = {};
-
-    for (var prop in oldObject) {
-      var newValue = object[prop];
-
-      if (newValue !== undefined && newValue === oldObject[prop])
-        continue;
-
-      if (!(prop in object)) {
-        removed[prop] = undefined;
-        continue;
-      }
-
-      if (newValue !== oldObject[prop])
-        changed[prop] = newValue;
-    }
-
-    for (var prop in object) {
-      if (prop in oldObject)
-        continue;
-
-      added[prop] = object[prop];
-    }
-
-    if (Array.isArray(object) && object.length !== oldObject.length)
-      changed.length = object.length;
-
-    return {
-      added: added,
-      removed: removed,
-      changed: changed
-    };
-  }
-
-  var eomTasks = [];
-  function runEOMTasks() {
-    if (!eomTasks.length)
-      return false;
-
-    for (var i = 0; i < eomTasks.length; i++) {
-      eomTasks[i]();
-    }
-    eomTasks.length = 0;
-    return true;
-  }
-
-  var runEOM = hasObserve ? (function(){
-    var eomObj = { pingPong: true };
-    var eomRunScheduled = false;
-
-    Object.observe(eomObj, function() {
-      runEOMTasks();
-      eomRunScheduled = false;
-    });
-
-    return function(fn) {
-      eomTasks.push(fn);
-      if (!eomRunScheduled) {
-        eomRunScheduled = true;
-        eomObj.pingPong = !eomObj.pingPong;
-      }
-    };
-  })() :
-  (function() {
-    return function(fn) {
-      eomTasks.push(fn);
-    };
-  })();
-
-  var observedObjectCache = [];
-
-  function newObservedObject() {
-    var observer;
-    var object;
-    var discardRecords = false;
-    var first = true;
-
-    function callback(records) {
-      if (observer && observer.state_ === OPENED && !discardRecords)
-        observer.check_(records);
-    }
-
-    return {
-      open: function(obs) {
-        if (observer)
-          throw Error('ObservedObject in use');
-
-        if (!first)
-          Object.deliverChangeRecords(callback);
-
-        observer = obs;
-        first = false;
-      },
-      observe: function(obj, arrayObserve) {
-        object = obj;
-        if (arrayObserve)
-          Array.observe(object, callback);
-        else
-          Object.observe(object, callback);
-      },
-      deliver: function(discard) {
-        discardRecords = discard;
-        Object.deliverChangeRecords(callback);
-        discardRecords = false;
-      },
-      close: function() {
-        observer = undefined;
-        Object.unobserve(object, callback);
-        observedObjectCache.push(this);
-      }
-    };
-  }
-
-  function getObservedObject(observer, object, arrayObserve) {
-    var dir = observedObjectCache.pop() || newObservedObject();
-    dir.open(observer);
-    dir.observe(object, arrayObserve);
-    return dir;
-  }
-
-  var emptyArray = [];
-  var observedSetCache = [];
-
-  function newObservedSet() {
-    var observers = [];
-    var observerCount = 0;
-    var objects = [];
-    var toRemove = emptyArray;
-    var resetNeeded = false;
-    var resetScheduled = false;
-
-    function observe(obj) {
-      if (!obj)
-        return;
-
-      var index = toRemove.indexOf(obj);
-      if (index >= 0) {
-        toRemove[index] = undefined;
-        objects.push(obj);
-      } else if (objects.indexOf(obj) < 0) {
-        objects.push(obj);
-        Object.observe(obj, callback);
-      }
-
-      observe(Object.getPrototypeOf(obj));
-    }
-
-    function reset() {
-      var objs = toRemove === emptyArray ? [] : toRemove;
-      toRemove = objects;
-      objects = objs;
-
-      var observer;
-      for (var id in observers) {
-        observer = observers[id];
-        if (!observer || observer.state_ != OPENED)
-          continue;
-
-        observer.iterateObjects_(observe);
-      }
-
-      for (var i = 0; i < toRemove.length; i++) {
-        var obj = toRemove[i];
-        if (obj)
-          Object.unobserve(obj, callback);
-      }
-
-      toRemove.length = 0;
-    }
-
-    function scheduledReset() {
-      resetScheduled = false;
-      if (!resetNeeded)
-        return;
-
-      reset();
-    }
-
-    function scheduleReset() {
-      if (resetScheduled)
-        return;
-
-      resetNeeded = true;
-      resetScheduled = true;
-      runEOM(scheduledReset);
-    }
-
-    function callback() {
-      reset();
-
-      var observer;
-
-      for (var id in observers) {
-        observer = observers[id];
-        if (!observer || observer.state_ != OPENED)
-          continue;
-
-        observer.check_();
-      }
-    }
-
-    var record = {
-      object: undefined,
-      objects: objects,
-      open: function(obs) {
-        observers[obs.id_] = obs;
-        observerCount++;
-        obs.iterateObjects_(observe);
-      },
-      close: function(obs) {
-        var anyLeft = false;
-
-        observers[obs.id_] = undefined;
-        observerCount--;
-
-        if (observerCount) {
-          scheduleReset();
-          return;
-        }
-        resetNeeded = false;
-
-        for (var i = 0; i < objects.length; i++) {
-          Object.unobserve(objects[i], callback);
-          Observer.unobservedCount++;
-        }
-
-        observers.length = 0;
-        objects.length = 0;
-        observedSetCache.push(this);
-      },
-      reset: scheduleReset
-    };
-
-    return record;
-  }
-
-  var lastObservedSet;
-
-  function getObservedSet(observer, obj) {
-    if (!lastObservedSet || lastObservedSet.object !== obj) {
-      lastObservedSet = observedSetCache.pop() || newObservedSet();
-      lastObservedSet.object = obj;
-    }
-    lastObservedSet.open(observer);
-    return lastObservedSet;
-  }
-
-  var UNOPENED = 0;
-  var OPENED = 1;
-  var CLOSED = 2;
-  var RESETTING = 3;
-
-  var nextObserverId = 1;
-
-  function Observer() {
-    this.state_ = UNOPENED;
-    this.callback_ = undefined;
-    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef
-    this.directObserver_ = undefined;
-    this.value_ = undefined;
-    this.id_ = nextObserverId++;
-  }
-
-  Observer.prototype = {
-    open: function(callback, target) {
-      if (this.state_ != UNOPENED)
-        throw Error('Observer has already been opened.');
-
-      addToAll(this);
-      this.callback_ = callback;
-      this.target_ = target;
-      this.state_ = OPENED;
-      this.connect_();
-      return this.value_;
-    },
-
-    close: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      removeFromAll(this);
-      this.state_ = CLOSED;
-      this.disconnect_();
-      this.value_ = undefined;
-      this.callback_ = undefined;
-      this.target_ = undefined;
-    },
-
-    deliver: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      dirtyCheck(this);
-    },
-
-    report_: function(changes) {
-      try {
-        this.callback_.apply(this.target_, changes);
-      } catch (ex) {
-        Observer._errorThrownDuringCallback = true;
-        console.error('Exception caught during observer callback: ' +
-                       (ex.stack || ex));
-      }
-    },
-
-    discardChanges: function() {
-      this.check_(undefined, true);
-      return this.value_;
-    }
-  }
-
-  var collectObservers = !hasObserve;
-  var allObservers;
-  Observer._allObserversCount = 0;
-
-  if (collectObservers) {
-    allObservers = [];
-  }
-
-  function addToAll(observer) {
-    Observer._allObserversCount++;
-    if (!collectObservers)
-      return;
-
-    allObservers.push(observer);
-  }
-
-  function removeFromAll(observer) {
-    Observer._allObserversCount--;
-  }
-
-  var runningMicrotaskCheckpoint = false;
-
-  var hasDebugForceFullDelivery = hasObserve && (function() {
-    try {
-      eval('%RunMicrotasks()');
-      return true;
-    } catch (ex) {
-      return false;
-    }
-  })();
-
-  global.Platform = global.Platform || {};
-
-  global.Platform.performMicrotaskCheckpoint = function() {
-    if (runningMicrotaskCheckpoint)
-      return;
-
-    if (hasDebugForceFullDelivery) {
-      eval('%RunMicrotasks()');
-      return;
-    }
-
-    if (!collectObservers)
-      return;
-
-    runningMicrotaskCheckpoint = true;
-
-    var cycles = 0;
-    var anyChanged, toCheck;
-
-    do {
-      cycles++;
-      toCheck = allObservers;
-      allObservers = [];
-      anyChanged = false;
-
-      for (var i = 0; i < toCheck.length; i++) {
-        var observer = toCheck[i];
-        if (observer.state_ != OPENED)
-          continue;
-
-        if (observer.check_())
-          anyChanged = true;
-
-        allObservers.push(observer);
-      }
-      if (runEOMTasks())
-        anyChanged = true;
-    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);
-
-    if (global.testingExposeCycleCount)
-      global.dirtyCheckCycleCount = cycles;
-
-    runningMicrotaskCheckpoint = false;
-  };
-
-  if (collectObservers) {
-    global.Platform.clearObservers = function() {
-      allObservers = [];
-    };
-  }
-
-  function ObjectObserver(object) {
-    Observer.call(this);
-    this.value_ = object;
-    this.oldObject_ = undefined;
-  }
-
-  ObjectObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    arrayObserve: false,
-
-    connect_: function(callback, target) {
-      if (hasObserve) {
-        this.directObserver_ = getObservedObject(this, this.value_,
-                                                 this.arrayObserve);
-      } else {
-        this.oldObject_ = this.copyObject(this.value_);
-      }
-
-    },
-
-    copyObject: function(object) {
-      var copy = Array.isArray(object) ? [] : {};
-      for (var prop in object) {
-        copy[prop] = object[prop];
-      };
-      if (Array.isArray(object))
-        copy.length = object.length;
-      return copy;
-    },
-
-    check_: function(changeRecords, skipChanges) {
-      var diff;
-      var oldValues;
-      if (hasObserve) {
-        if (!changeRecords)
-          return false;
-
-        oldValues = {};
-        diff = diffObjectFromChangeRecords(this.value_, changeRecords,
-                                           oldValues);
-      } else {
-        oldValues = this.oldObject_;
-        diff = diffObjectFromOldObject(this.value_, this.oldObject_);
-      }
-
-      if (diffIsEmpty(diff))
-        return false;
-
-      if (!hasObserve)
-        this.oldObject_ = this.copyObject(this.value_);
-
-      this.report_([
-        diff.added || {},
-        diff.removed || {},
-        diff.changed || {},
-        function(property) {
-          return oldValues[property];
-        }
-      ]);
-
-      return true;
-    },
-
-    disconnect_: function() {
-      if (hasObserve) {
-        this.directObserver_.close();
-        this.directObserver_ = undefined;
-      } else {
-        this.oldObject_ = undefined;
-      }
-    },
-
-    deliver: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      if (hasObserve)
-        this.directObserver_.deliver(false);
-      else
-        dirtyCheck(this);
-    },
-
-    discardChanges: function() {
-      if (this.directObserver_)
-        this.directObserver_.deliver(true);
-      else
-        this.oldObject_ = this.copyObject(this.value_);
-
-      return this.value_;
-    }
-  });
-
-  function ArrayObserver(array) {
-    if (!Array.isArray(array))
-      throw Error('Provided object is not an Array');
-    ObjectObserver.call(this, array);
-  }
-
-  ArrayObserver.prototype = createObject({
-
-    __proto__: ObjectObserver.prototype,
-
-    arrayObserve: true,
-
-    copyObject: function(arr) {
-      return arr.slice();
-    },
-
-    check_: function(changeRecords) {
-      var splices;
-      if (hasObserve) {
-        if (!changeRecords)
-          return false;
-        splices = projectArraySplices(this.value_, changeRecords);
-      } else {
-        splices = calcSplices(this.value_, 0, this.value_.length,
-                              this.oldObject_, 0, this.oldObject_.length);
-      }
-
-      if (!splices || !splices.length)
-        return false;
-
-      if (!hasObserve)
-        this.oldObject_ = this.copyObject(this.value_);
-
-      this.report_([splices]);
-      return true;
-    }
-  });
-
-  ArrayObserver.applySplices = function(previous, current, splices) {
-    splices.forEach(function(splice) {
-      var spliceArgs = [splice.index, splice.removed.length];
-      var addIndex = splice.index;
-      while (addIndex < splice.index + splice.addedCount) {
-        spliceArgs.push(current[addIndex]);
-        addIndex++;
-      }
-
-      Array.prototype.splice.apply(previous, spliceArgs);
-    });
-  };
-
-  function PathObserver(object, path) {
-    Observer.call(this);
-
-    this.object_ = object;
-    this.path_ = path instanceof Path ? path : getPath(path);
-    this.directObserver_ = undefined;
-  }
-
-  PathObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    connect_: function() {
-      if (hasObserve)
-        this.directObserver_ = getObservedSet(this, this.object_);
-
-      this.check_(undefined, true);
-    },
-
-    disconnect_: function() {
-      this.value_ = undefined;
-
-      if (this.directObserver_) {
-        this.directObserver_.close(this);
-        this.directObserver_ = undefined;
-      }
-    },
-
-    iterateObjects_: function(observe) {
-      this.path_.iterateObjects(this.object_, observe);
-    },
-
-    check_: function(changeRecords, skipChanges) {
-      var oldValue = this.value_;
-      this.value_ = this.path_.getValueFrom(this.object_);
-      if (skipChanges || areSameValue(this.value_, oldValue))
-        return false;
-
-      this.report_([this.value_, oldValue]);
-      return true;
-    },
-
-    setValue: function(newValue) {
-      if (this.path_)
-        this.path_.setValueFrom(this.object_, newValue);
-    }
-  });
-
-  function CompoundObserver() {
-    Observer.call(this);
-
-    this.value_ = [];
-    this.directObserver_ = undefined;
-    this.observed_ = [];
-  }
-
-  var observerSentinel = {};
-
-  CompoundObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    connect_: function() {
-      this.check_(undefined, true);
-
-      if (!hasObserve)
-        return;
-
-      var object;
-      var needsDirectObserver = false;
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        object = this.observed_[i]
-        if (object !== observerSentinel) {
-          needsDirectObserver = true;
-          break;
-        }
-      }
-
-      if (this.directObserver_) {
-        if (needsDirectObserver) {
-          this.directObserver_.reset();
-          return;
-        }
-        this.directObserver_.close();
-        this.directObserver_ = undefined;
-        return;
-      }
-
-      if (needsDirectObserver)
-        this.directObserver_ = getObservedSet(this, object);
-    },
-
-    closeObservers_: function() {
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        if (this.observed_[i] === observerSentinel)
-          this.observed_[i + 1].close();
-      }
-      this.observed_.length = 0;
-    },
-
-    disconnect_: function() {
-      this.value_ = undefined;
-
-      if (this.directObserver_) {
-        this.directObserver_.close(this);
-        this.directObserver_ = undefined;
-      }
-
-      this.closeObservers_();
-    },
-
-    addPath: function(object, path) {
-      if (this.state_ != UNOPENED && this.state_ != RESETTING)
-        throw Error('Cannot add paths once started.');
-
-      this.observed_.push(object, path instanceof Path ? path : getPath(path));
-    },
-
-    addObserver: function(observer) {
-      if (this.state_ != UNOPENED && this.state_ != RESETTING)
-        throw Error('Cannot add observers once started.');
-
-      observer.open(this.deliver, this);
-      this.observed_.push(observerSentinel, observer);
-    },
-
-    startReset: function() {
-      if (this.state_ != OPENED)
-        throw Error('Can only reset while open');
-
-      this.state_ = RESETTING;
-      this.closeObservers_();
-    },
-
-    finishReset: function() {
-      if (this.state_ != RESETTING)
-        throw Error('Can only finishReset after startReset');
-      this.state_ = OPENED;
-      this.connect_();
-
-      return this.value_;
-    },
-
-    iterateObjects_: function(observe) {
-      var object;
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        object = this.observed_[i]
-        if (object !== observerSentinel)
-          this.observed_[i + 1].iterateObjects(object, observe)
-      }
-    },
-
-    check_: function(changeRecords, skipChanges) {
-      var oldValues;
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        var pathOrObserver = this.observed_[i+1];
-        var object = this.observed_[i];
-        var value = object === observerSentinel ?
-            pathOrObserver.discardChanges() :
-            pathOrObserver.getValueFrom(object)
-
-        if (skipChanges) {
-          this.value_[i / 2] = value;
-          continue;
-        }
-
-        if (areSameValue(value, this.value_[i / 2]))
-          continue;
-
-        oldValues = oldValues || [];
-        oldValues[i / 2] = this.value_[i / 2];
-        this.value_[i / 2] = value;
-      }
-
-      if (!oldValues)
-        return false;
-
-      // TODO(rafaelw): Having observed_ as the third callback arg here is
-      // pretty lame API. Fix.
-      this.report_([this.value_, oldValues, this.observed_]);
-      return true;
-    }
-  });
-
-  function identFn(value) { return value; }
-
-  function ObserverTransform(observable, getValueFn, setValueFn,
-                             dontPassThroughSet) {
-    this.callback_ = undefined;
-    this.target_ = undefined;
-    this.value_ = undefined;
-    this.observable_ = observable;
-    this.getValueFn_ = getValueFn || identFn;
-    this.setValueFn_ = setValueFn || identFn;
-    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this
-    // at the moment because of a bug in it's dependency tracking.
-    this.dontPassThroughSet_ = dontPassThroughSet;
-  }
-
-  ObserverTransform.prototype = {
-    open: function(callback, target) {
-      this.callback_ = callback;
-      this.target_ = target;
-      this.value_ =
-          this.getValueFn_(this.observable_.open(this.observedCallback_, this));
-      return this.value_;
-    },
-
-    observedCallback_: function(value) {
-      value = this.getValueFn_(value);
-      if (areSameValue(value, this.value_))
-        return;
-      var oldValue = this.value_;
-      this.value_ = value;
-      this.callback_.call(this.target_, this.value_, oldValue);
-    },
-
-    discardChanges: function() {
-      this.value_ = this.getValueFn_(this.observable_.discardChanges());
-      return this.value_;
-    },
-
-    deliver: function() {
-      return this.observable_.deliver();
-    },
-
-    setValue: function(value) {
-      value = this.setValueFn_(value);
-      if (!this.dontPassThroughSet_ && this.observable_.setValue)
-        return this.observable_.setValue(value);
-    },
-
-    close: function() {
-      if (this.observable_)
-        this.observable_.close();
-      this.callback_ = undefined;
-      this.target_ = undefined;
-      this.observable_ = undefined;
-      this.value_ = undefined;
-      this.getValueFn_ = undefined;
-      this.setValueFn_ = undefined;
-    }
-  }
-
-  var expectedRecordTypes = {
-    add: true,
-    update: true,
-    delete: true
-  };
-
-  function notifyFunction(object, name) {
-    if (typeof Object.observe !== 'function')
-      return;
-
-    var notifier = Object.getNotifier(object);
-    return function(type, oldValue) {
-      var changeRecord = {
-        object: object,
-        type: type,
-        name: name
-      };
-      if (arguments.length === 2)
-        changeRecord.oldValue = oldValue;
-      notifier.notify(changeRecord);
-    }
-  }
-
-  Observer.defineComputedProperty = function(target, name, observable) {
-    var notify = notifyFunction(target, name);
-    var value = observable.open(function(newValue, oldValue) {
-      value = newValue;
-      if (notify)
-        notify('update', oldValue);
-    });
-
-    Object.defineProperty(target, name, {
-      get: function() {
-        observable.deliver();
-        return value;
-      },
-      set: function(newValue) {
-        observable.setValue(newValue);
-        return newValue;
-      },
-      configurable: true
-    });
-
-    return {
-      close: function() {
-        observable.close();
-        Object.defineProperty(target, name, {
-          value: value,
-          writable: true,
-          configurable: true
-        });
-      }
-    };
-  }
-
-  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {
-    var added = {};
-    var removed = {};
-
-    for (var i = 0; i < changeRecords.length; i++) {
-      var record = changeRecords[i];
-      if (!expectedRecordTypes[record.type]) {
-        console.error('Unknown changeRecord type: ' + record.type);
-        console.error(record);
-        continue;
-      }
-
-      if (!(record.name in oldValues))
-        oldValues[record.name] = record.oldValue;
-
-      if (record.type == 'update')
-        continue;
-
-      if (record.type == 'add') {
-        if (record.name in removed)
-          delete removed[record.name];
-        else
-          added[record.name] = true;
-
-        continue;
-      }
-
-      // type = 'delete'
-      if (record.name in added) {
-        delete added[record.name];
-        delete oldValues[record.name];
-      } else {
-        removed[record.name] = true;
-      }
-    }
-
-    for (var prop in added)
-      added[prop] = object[prop];
-
-    for (var prop in removed)
-      removed[prop] = undefined;
-
-    var changed = {};
-    for (var prop in oldValues) {
-      if (prop in added || prop in removed)
-        continue;
-
-      var newValue = object[prop];
-      if (oldValues[prop] !== newValue)
-        changed[prop] = newValue;
-    }
-
-    return {
-      added: added,
-      removed: removed,
-      changed: changed
-    };
-  }
-
-  function newSplice(index, removed, addedCount) {
-    return {
-      index: index,
-      removed: removed,
-      addedCount: addedCount
-    };
-  }
-
-  var EDIT_LEAVE = 0;
-  var EDIT_UPDATE = 1;
-  var EDIT_ADD = 2;
-  var EDIT_DELETE = 3;
-
-  function ArraySplice() {}
-
-  ArraySplice.prototype = {
-
-    // Note: This function is *based* on the computation of the Levenshtein
-    // "edit" distance. The one change is that "updates" are treated as two
-    // edits - not one. With Array splices, an update is really a delete
-    // followed by an add. By retaining this, we optimize for "keeping" the
-    // maximum array items in the original array. For example:
-    //
-    //   'xxxx123' -> '123yyyy'
-    //
-    // With 1-edit updates, the shortest path would be just to update all seven
-    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
-    // leaves the substring '123' intact.
-    calcEditDistances: function(current, currentStart, currentEnd,
-                                old, oldStart, oldEnd) {
-      // "Deletion" columns
-      var rowCount = oldEnd - oldStart + 1;
-      var columnCount = currentEnd - currentStart + 1;
-      var distances = new Array(rowCount);
-
-      // "Addition" rows. Initialize null column.
-      for (var i = 0; i < rowCount; i++) {
-        distances[i] = new Array(columnCount);
-        distances[i][0] = i;
-      }
-
-      // Initialize null row
-      for (var j = 0; j < columnCount; j++)
-        distances[0][j] = j;
-
-      for (var i = 1; i < rowCount; i++) {
-        for (var j = 1; j < columnCount; j++) {
-          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))
-            distances[i][j] = distances[i - 1][j - 1];
-          else {
-            var north = distances[i - 1][j] + 1;
-            var west = distances[i][j - 1] + 1;
-            distances[i][j] = north < west ? north : west;
-          }
-        }
-      }
-
-      return distances;
-    },
-
-    // This starts at the final weight, and walks "backward" by finding
-    // the minimum previous weight recursively until the origin of the weight
-    // matrix.
-    spliceOperationsFromEditDistances: function(distances) {
-      var i = distances.length - 1;
-      var j = distances[0].length - 1;
-      var current = distances[i][j];
-      var edits = [];
-      while (i > 0 || j > 0) {
-        if (i == 0) {
-          edits.push(EDIT_ADD);
-          j--;
-          continue;
-        }
-        if (j == 0) {
-          edits.push(EDIT_DELETE);
-          i--;
-          continue;
-        }
-        var northWest = distances[i - 1][j - 1];
-        var west = distances[i - 1][j];
-        var north = distances[i][j - 1];
-
-        var min;
-        if (west < north)
-          min = west < northWest ? west : northWest;
-        else
-          min = north < northWest ? north : northWest;
-
-        if (min == northWest) {
-          if (northWest == current) {
-            edits.push(EDIT_LEAVE);
-          } else {
-            edits.push(EDIT_UPDATE);
-            current = northWest;
-          }
-          i--;
-          j--;
-        } else if (min == west) {
-          edits.push(EDIT_DELETE);
-          i--;
-          current = west;
-        } else {
-          edits.push(EDIT_ADD);
-          j--;
-          current = north;
-        }
-      }
-
-      edits.reverse();
-      return edits;
-    },
-
-    /**
-     * Splice Projection functions:
-     *
-     * A splice map is a representation of how a previous array of items
-     * was transformed into a new array of items. Conceptually it is a list of
-     * tuples of
-     *
-     *   <index, removed, addedCount>
-     *
-     * which are kept in ascending index order of. The tuple represents that at
-     * the |index|, |removed| sequence of items were removed, and counting forward
-     * from |index|, |addedCount| items were added.
-     */
-
-    /**
-     * Lacking individual splice mutation information, the minimal set of
-     * splices can be synthesized given the previous state and final state of an
-     * array. The basic approach is to calculate the edit distance matrix and
-     * choose the shortest path through it.
-     *
-     * Complexity: O(l * p)
-     *   l: The length of the current array
-     *   p: The length of the old array
-     */
-    calcSplices: function(current, currentStart, currentEnd,
-                          old, oldStart, oldEnd) {
-      var prefixCount = 0;
-      var suffixCount = 0;
-
-      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
-      if (currentStart == 0 && oldStart == 0)
-        prefixCount = this.sharedPrefix(current, old, minLength);
-
-      if (currentEnd == current.length && oldEnd == old.length)
-        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
-
-      currentStart += prefixCount;
-      oldStart += prefixCount;
-      currentEnd -= suffixCount;
-      oldEnd -= suffixCount;
-
-      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
-        return [];
-
-      if (currentStart == currentEnd) {
-        var splice = newSplice(currentStart, [], 0);
-        while (oldStart < oldEnd)
-          splice.removed.push(old[oldStart++]);
-
-        return [ splice ];
-      } else if (oldStart == oldEnd)
-        return [ newSplice(currentStart, [], currentEnd - currentStart) ];
-
-      var ops = this.spliceOperationsFromEditDistances(
-          this.calcEditDistances(current, currentStart, currentEnd,
-                                 old, oldStart, oldEnd));
-
-      var splice = undefined;
-      var splices = [];
-      var index = currentStart;
-      var oldIndex = oldStart;
-      for (var i = 0; i < ops.length; i++) {
-        switch(ops[i]) {
-          case EDIT_LEAVE:
-            if (splice) {
-              splices.push(splice);
-              splice = undefined;
-            }
-
-            index++;
-            oldIndex++;
-            break;
-          case EDIT_UPDATE:
-            if (!splice)
-              splice = newSplice(index, [], 0);
-
-            splice.addedCount++;
-            index++;
-
-            splice.removed.push(old[oldIndex]);
-            oldIndex++;
-            break;
-          case EDIT_ADD:
-            if (!splice)
-              splice = newSplice(index, [], 0);
-
-            splice.addedCount++;
-            index++;
-            break;
-          case EDIT_DELETE:
-            if (!splice)
-              splice = newSplice(index, [], 0);
-
-            splice.removed.push(old[oldIndex]);
-            oldIndex++;
-            break;
-        }
-      }
-
-      if (splice) {
-        splices.push(splice);
-      }
-      return splices;
-    },
-
-    sharedPrefix: function(current, old, searchLength) {
-      for (var i = 0; i < searchLength; i++)
-        if (!this.equals(current[i], old[i]))
-          return i;
-      return searchLength;
-    },
-
-    sharedSuffix: function(current, old, searchLength) {
-      var index1 = current.length;
-      var index2 = old.length;
-      var count = 0;
-      while (count < searchLength && this.equals(current[--index1], old[--index2]))
-        count++;
-
-      return count;
-    },
-
-    calculateSplices: function(current, previous) {
-      return this.calcSplices(current, 0, current.length, previous, 0,
-                              previous.length);
-    },
-
-    equals: function(currentValue, previousValue) {
-      return currentValue === previousValue;
-    }
-  };
-
-  var arraySplice = new ArraySplice();
-
-  function calcSplices(current, currentStart, currentEnd,
-                       old, oldStart, oldEnd) {
-    return arraySplice.calcSplices(current, currentStart, currentEnd,
-                                   old, oldStart, oldEnd);
-  }
-
-  function intersect(start1, end1, start2, end2) {
-    // Disjoint
-    if (end1 < start2 || end2 < start1)
-      return -1;
-
-    // Adjacent
-    if (end1 == start2 || end2 == start1)
-      return 0;
-
-    // Non-zero intersect, span1 first
-    if (start1 < start2) {
-      if (end1 < end2)
-        return end1 - start2; // Overlap
-      else
-        return end2 - start2; // Contained
-    } else {
-      // Non-zero intersect, span2 first
-      if (end2 < end1)
-        return end2 - start1; // Overlap
-      else
-        return end1 - start1; // Contained
-    }
-  }
-
-  function mergeSplice(splices, index, removed, addedCount) {
-
-    var splice = newSplice(index, removed, addedCount);
-
-    var inserted = false;
-    var insertionOffset = 0;
-
-    for (var i = 0; i < splices.length; i++) {
-      var current = splices[i];
-      current.index += insertionOffset;
-
-      if (inserted)
-        continue;
-
-      var intersectCount = intersect(splice.index,
-                                     splice.index + splice.removed.length,
-                                     current.index,
-                                     current.index + current.addedCount);
-
-      if (intersectCount >= 0) {
-        // Merge the two splices
-
-        splices.splice(i, 1);
-        i--;
-
-        insertionOffset -= current.addedCount - current.removed.length;
-
-        splice.addedCount += current.addedCount - intersectCount;
-        var deleteCount = splice.removed.length +
-                          current.removed.length - intersectCount;
-
-        if (!splice.addedCount && !deleteCount) {
-          // merged splice is a noop. discard.
-          inserted = true;
-        } else {
-          var removed = current.removed;
-
-          if (splice.index < current.index) {
-            // some prefix of splice.removed is prepended to current.removed.
-            var prepend = splice.removed.slice(0, current.index - splice.index);
-            Array.prototype.push.apply(prepend, removed);
-            removed = prepend;
-          }
-
-          if (splice.index + splice.removed.length > current.index + current.addedCount) {
-            // some suffix of splice.removed is appended to current.removed.
-            var append = splice.removed.slice(current.index + current.addedCount - splice.index);
-            Array.prototype.push.apply(removed, append);
-          }
-
-          splice.removed = removed;
-          if (current.index < splice.index) {
-            splice.index = current.index;
-          }
-        }
-      } else if (splice.index < current.index) {
-        // Insert splice here.
-
-        inserted = true;
-
-        splices.splice(i, 0, splice);
-        i++;
-
-        var offset = splice.addedCount - splice.removed.length
-        current.index += offset;
-        insertionOffset += offset;
-      }
-    }
-
-    if (!inserted)
-      splices.push(splice);
-  }
-
-  function createInitialSplices(array, changeRecords) {
-    var splices = [];
-
-    for (var i = 0; i < changeRecords.length; i++) {
-      var record = changeRecords[i];
-      switch(record.type) {
-        case 'splice':
-          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);
-          break;
-        case 'add':
-        case 'update':
-        case 'delete':
-          if (!isIndex(record.name))
-            continue;
-          var index = toNumber(record.name);
-          if (index < 0)
-            continue;
-          mergeSplice(splices, index, [record.oldValue], 1);
-          break;
-        default:
-          console.error('Unexpected record type: ' + JSON.stringify(record));
-          break;
-      }
-    }
-
-    return splices;
-  }
-
-  function projectArraySplices(array, changeRecords) {
-    var splices = [];
-
-    createInitialSplices(array, changeRecords).forEach(function(splice) {
-      if (splice.addedCount == 1 && splice.removed.length == 1) {
-        if (splice.removed[0] !== array[splice.index])
-          splices.push(splice);
-
-        return
-      };
-
-      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,
-                                           splice.removed, 0, splice.removed.length));
-    });
-
-    return splices;
-  }
-
-  global.Observer = Observer;
-  global.Observer.runEOM_ = runEOM;
-  global.Observer.hasObjectObserve = hasObserve;
-  global.ArrayObserver = ArrayObserver;
-  global.ArrayObserver.calculateSplices = function(current, previous) {
-    return arraySplice.calculateSplices(current, previous);
-  };
-
-  global.ArraySplice = ArraySplice;
-  global.ObjectObserver = ObjectObserver;
-  global.PathObserver = PathObserver;
-  global.CompoundObserver = CompoundObserver;
-  global.Path = Path;
-  global.ObserverTransform = ObserverTransform;
-})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
-
-// prepoulate window.Platform.flags for default controls

-window.Platform = window.Platform || {};

-// prepopulate window.logFlags if necessary

-window.logFlags = window.logFlags || {};

-// process flags

-(function(scope){

-  // import

-  var flags = scope.flags || {};

-  // populate flags from location

-  location.search.slice(1).split('&').forEach(function(o) {

-    o = o.split('=');

-    o[0] && (flags[o[0]] = o[1] || true);

-  });

-  var entryPoint = document.currentScript ||

-      document.querySelector('script[src*="platform.js"]');

-  if (entryPoint) {

-    var a = entryPoint.attributes;

-    for (var i = 0, n; i < a.length; i++) {

-      n = a[i];

-      if (n.name !== 'src') {

-        flags[n.name] = n.value || true;

-      }

-    }

-  }

-  if (flags.log) {

-    flags.log.split(',').forEach(function(f) {

-      window.logFlags[f] = true;

-    });

-  }

-  // If any of these flags match 'native', then force native ShadowDOM; any

-  // other truthy value, or failure to detect native

-  // ShadowDOM, results in polyfill

-  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;

-  if (flags.shadow === 'native') {

-    flags.shadow = false;

-  } else {

-    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;

-  }

-

-  if (flags.shadow && document.querySelectorAll('script').length > 1) {

-    console.warn('platform.js is not the first script on the page. ' +

-        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +

-        'for details.');

-  }

-

-  // CustomElements polyfill flag

-  if (flags.register) {

-    window.CustomElements = window.CustomElements || {flags: {}};

-    window.CustomElements.flags.register = flags.register;

-  }

-

-  if (flags.imports) {

-    window.HTMLImports = window.HTMLImports || {flags: {}};

-    window.HTMLImports.flags.imports = flags.imports;

-  }

-

-  // export

-  scope.flags = flags;

-})(Platform);

-

-// select ShadowDOM impl

-if (Platform.flags.shadow) {

-
-// Copyright 2012 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-window.ShadowDOMPolyfill = {};
-
-(function(scope) {
-  'use strict';
-
-  var constructorTable = new WeakMap();
-  var nativePrototypeTable = new WeakMap();
-  var wrappers = Object.create(null);
-
-  // Don't test for eval if document has CSP securityPolicy object and we can
-  // see that eval is not supported. This avoids an error message in console
-  // even when the exception is caught
-  var hasEval = !('securityPolicy' in document) ||
-      document.securityPolicy.allowsEval;
-  if (hasEval) {
-    try {
-      var f = new Function('', 'return true;');
-      hasEval = f();
-    } catch (ex) {
-      hasEval = false;
-    }
-  }
-
-  function assert(b) {
-    if (!b)
-      throw new Error('Assertion failed');
-  };
-
-  var defineProperty = Object.defineProperty;
-  var getOwnPropertyNames = Object.getOwnPropertyNames;
-  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
-
-  function mixin(to, from) {
-    getOwnPropertyNames(from).forEach(function(name) {
-      defineProperty(to, name, getOwnPropertyDescriptor(from, name));
-    });
-    return to;
-  };
-
-  function mixinStatics(to, from) {
-    getOwnPropertyNames(from).forEach(function(name) {
-      switch (name) {
-        case 'arguments':
-        case 'caller':
-        case 'length':
-        case 'name':
-        case 'prototype':
-        case 'toString':
-          return;
-      }
-      defineProperty(to, name, getOwnPropertyDescriptor(from, name));
-    });
-    return to;
-  };
-
-  function oneOf(object, propertyNames) {
-    for (var i = 0; i < propertyNames.length; i++) {
-      if (propertyNames[i] in object)
-        return propertyNames[i];
-    }
-  }
-
-  // Mozilla's old DOM bindings are bretty busted:
-  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844
-  // Make sure they are create before we start modifying things.
-  getOwnPropertyNames(window);
-
-  function getWrapperConstructor(node) {
-    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);
-    var wrapperConstructor = constructorTable.get(nativePrototype);
-    if (wrapperConstructor)
-      return wrapperConstructor;
-
-    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);
-
-    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);
-    registerInternal(nativePrototype, GeneratedWrapper, node);
-
-    return GeneratedWrapper;
-  }
-
-  function addForwardingProperties(nativePrototype, wrapperPrototype) {
-    installProperty(nativePrototype, wrapperPrototype, true);
-  }
-
-  function registerInstanceProperties(wrapperPrototype, instanceObject) {
-    installProperty(instanceObject, wrapperPrototype, false);
-  }
-
-  var isFirefox = /Firefox/.test(navigator.userAgent);
-
-  // This is used as a fallback when getting the descriptor fails in
-  // installProperty.
-  var dummyDescriptor = {
-    get: function() {},
-    set: function(v) {},
-    configurable: true,
-    enumerable: true
-  };
-
-  function isEventHandlerName(name) {
-    return /^on[a-z]+$/.test(name);
-  }
-
-  function isIdentifierName(name) {
-    return /^\w[a-zA-Z_0-9]*$/.test(name);
-  }
-
-  function getGetter(name) {
-    return hasEval && isIdentifierName(name) ?
-        new Function('return this.impl.' + name) :
-        function() { return this.impl[name]; };
-  }
-
-  function getSetter(name) {
-    return hasEval && isIdentifierName(name) ?
-        new Function('v', 'this.impl.' + name + ' = v') :
-        function(v) { this.impl[name] = v; };
-  }
-
-  function getMethod(name) {
-    return hasEval && isIdentifierName(name) ?
-        new Function('return this.impl.' + name +
-                     '.apply(this.impl, arguments)') :
-        function() { return this.impl[name].apply(this.impl, arguments); };
-  }
-
-  function getDescriptor(source, name) {
-    try {
-      return Object.getOwnPropertyDescriptor(source, name);
-    } catch (ex) {
-      // JSC and V8 both use data properties instead of accessors which can
-      // cause getting the property desciptor to throw an exception.
-      // https://bugs.webkit.org/show_bug.cgi?id=49739
-      return dummyDescriptor;
-    }
-  }
-
-  function installProperty(source, target, allowMethod, opt_blacklist) {
-    var names = getOwnPropertyNames(source);
-    for (var i = 0; i < names.length; i++) {
-      var name = names[i];
-      if (name === 'polymerBlackList_')
-        continue;
-
-      if (name in target)
-        continue;
-
-      if (source.polymerBlackList_ && source.polymerBlackList_[name])
-        continue;
-
-      if (isFirefox) {
-        // Tickle Firefox's old bindings.
-        source.__lookupGetter__(name);
-      }
-      var descriptor = getDescriptor(source, name);
-      var getter, setter;
-      if (allowMethod && typeof descriptor.value === 'function') {
-        target[name] = getMethod(name);
-        continue;
-      }
-
-      var isEvent = isEventHandlerName(name);
-      if (isEvent)
-        getter = scope.getEventHandlerGetter(name);
-      else
-        getter = getGetter(name);
-
-      if (descriptor.writable || descriptor.set) {
-        if (isEvent)
-          setter = scope.getEventHandlerSetter(name);
-        else
-          setter = getSetter(name);
-      }
-
-      defineProperty(target, name, {
-        get: getter,
-        set: setter,
-        configurable: descriptor.configurable,
-        enumerable: descriptor.enumerable
-      });
-    }
-  }
-
-  /**
-   * @param {Function} nativeConstructor
-   * @param {Function} wrapperConstructor
-   * @param {Object=} opt_instance If present, this is used to extract
-   *     properties from an instance object.
-   */
-  function register(nativeConstructor, wrapperConstructor, opt_instance) {
-    var nativePrototype = nativeConstructor.prototype;
-    registerInternal(nativePrototype, wrapperConstructor, opt_instance);
-    mixinStatics(wrapperConstructor, nativeConstructor);
-  }
-
-  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {
-    var wrapperPrototype = wrapperConstructor.prototype;
-    assert(constructorTable.get(nativePrototype) === undefined);
-
-    constructorTable.set(nativePrototype, wrapperConstructor);
-    nativePrototypeTable.set(wrapperPrototype, nativePrototype);
-
-    addForwardingProperties(nativePrototype, wrapperPrototype);
-    if (opt_instance)
-      registerInstanceProperties(wrapperPrototype, opt_instance);
-    defineProperty(wrapperPrototype, 'constructor', {
-      value: wrapperConstructor,
-      configurable: true,
-      enumerable: false,
-      writable: true
-    });
-    // Set it again. Some VMs optimizes objects that are used as prototypes.
-    wrapperConstructor.prototype = wrapperPrototype;
-  }
-
-  function isWrapperFor(wrapperConstructor, nativeConstructor) {
-    return constructorTable.get(nativeConstructor.prototype) ===
-        wrapperConstructor;
-  }
-
-  /**
-   * Creates a generic wrapper constructor based on |object| and its
-   * constructor.
-   * @param {Node} object
-   * @return {Function} The generated constructor.
-   */
-  function registerObject(object) {
-    var nativePrototype = Object.getPrototypeOf(object);
-
-    var superWrapperConstructor = getWrapperConstructor(nativePrototype);
-    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);
-    registerInternal(nativePrototype, GeneratedWrapper, object);
-
-    return GeneratedWrapper;
-  }
-
-  function createWrapperConstructor(superWrapperConstructor) {
-    function GeneratedWrapper(node) {
-      superWrapperConstructor.call(this, node);
-    }
-    var p = Object.create(superWrapperConstructor.prototype);
-    p.constructor = GeneratedWrapper;
-    GeneratedWrapper.prototype = p;
-
-    return GeneratedWrapper;
-  }
-
-  var OriginalDOMImplementation = window.DOMImplementation;
-  var OriginalEventTarget = window.EventTarget;
-  var OriginalEvent = window.Event;
-  var OriginalNode = window.Node;
-  var OriginalWindow = window.Window;
-  var OriginalRange = window.Range;
-  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
-  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
-  var OriginalSVGElementInstance = window.SVGElementInstance;
-
-  function isWrapper(object) {
-    return object instanceof wrappers.EventTarget ||
-           object instanceof wrappers.Event ||
-           object instanceof wrappers.Range ||
-           object instanceof wrappers.DOMImplementation ||
-           object instanceof wrappers.CanvasRenderingContext2D ||
-           wrappers.WebGLRenderingContext &&
-               object instanceof wrappers.WebGLRenderingContext;
-  }
-
-  function isNative(object) {
-    return OriginalEventTarget && object instanceof OriginalEventTarget ||
-           object instanceof OriginalNode ||
-           object instanceof OriginalEvent ||
-           object instanceof OriginalWindow ||
-           object instanceof OriginalRange ||
-           object instanceof OriginalDOMImplementation ||
-           object instanceof OriginalCanvasRenderingContext2D ||
-           OriginalWebGLRenderingContext &&
-               object instanceof OriginalWebGLRenderingContext ||
-           OriginalSVGElementInstance &&
-               object instanceof OriginalSVGElementInstance;
-  }
-
-  /**
-   * Wraps a node in a WrapperNode. If there already exists a wrapper for the
-   * |node| that wrapper is returned instead.
-   * @param {Node} node
-   * @return {WrapperNode}
-   */
-  function wrap(impl) {
-    if (impl === null)
-      return null;
-
-    assert(isNative(impl));
-    return impl.polymerWrapper_ ||
-        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));
-  }
-
-  /**
-   * Unwraps a wrapper and returns the node it is wrapping.
-   * @param {WrapperNode} wrapper
-   * @return {Node}
-   */
-  function unwrap(wrapper) {
-    if (wrapper === null)
-      return null;
-    assert(isWrapper(wrapper));
-    return wrapper.impl;
-  }
-
-  /**
-   * Unwraps object if it is a wrapper.
-   * @param {Object} object
-   * @return {Object} The native implementation object.
-   */
-  function unwrapIfNeeded(object) {
-    return object && isWrapper(object) ? unwrap(object) : object;
-  }
-
-  /**
-   * Wraps object if it is not a wrapper.
-   * @param {Object} object
-   * @return {Object} The wrapper for object.
-   */
-  function wrapIfNeeded(object) {
-    return object && !isWrapper(object) ? wrap(object) : object;
-  }
-
-  /**
-   * Overrides the current wrapper (if any) for node.
-   * @param {Node} node
-   * @param {WrapperNode=} wrapper If left out the wrapper will be created as
-   *     needed next time someone wraps the node.
-   */
-  function rewrap(node, wrapper) {
-    if (wrapper === null)
-      return;
-    assert(isNative(node));
-    assert(wrapper === undefined || isWrapper(wrapper));
-    node.polymerWrapper_ = wrapper;
-  }
-
-  function defineGetter(constructor, name, getter) {
-    defineProperty(constructor.prototype, name, {
-      get: getter,
-      configurable: true,
-      enumerable: true
-    });
-  }
-
-  function defineWrapGetter(constructor, name) {
-    defineGetter(constructor, name, function() {
-      return wrap(this.impl[name]);
-    });
-  }
-
-  /**
-   * Forwards existing methods on the native object to the wrapper methods.
-   * This does not wrap any of the arguments or the return value since the
-   * wrapper implementation already takes care of that.
-   * @param {Array.<Function>} constructors
-   * @parem {Array.<string>} names
-   */
-  function forwardMethodsToWrapper(constructors, names) {
-    constructors.forEach(function(constructor) {
-      names.forEach(function(name) {
-        constructor.prototype[name] = function() {
-          var w = wrapIfNeeded(this);
-          return w[name].apply(w, arguments);
-        };
-      });
-    });
-  }
-
-  scope.assert = assert;
-  scope.constructorTable = constructorTable;
-  scope.defineGetter = defineGetter;
-  scope.defineWrapGetter = defineWrapGetter;
-  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;
-  scope.isWrapper = isWrapper;
-  scope.isWrapperFor = isWrapperFor;
-  scope.mixin = mixin;
-  scope.nativePrototypeTable = nativePrototypeTable;
-  scope.oneOf = oneOf;
-  scope.registerObject = registerObject;
-  scope.registerWrapper = register;
-  scope.rewrap = rewrap;
-  scope.unwrap = unwrap;
-  scope.unwrapIfNeeded = unwrapIfNeeded;
-  scope.wrap = wrap;
-  scope.wrapIfNeeded = wrapIfNeeded;
-  scope.wrappers = wrappers;
-
-})(window.ShadowDOMPolyfill);
-
-/*
- * Copyright 2013 The Polymer Authors. All rights reserved.
- * Use of this source code is goverened by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-(function(context) {
-  'use strict';
-
-  var OriginalMutationObserver = window.MutationObserver;
-  var callbacks = [];
-  var pending = false;
-  var timerFunc;
-
-  function handle() {
-    pending = false;
-    var copies = callbacks.slice(0);
-    callbacks = [];
-    for (var i = 0; i < copies.length; i++) {
-      (0, copies[i])();
-    }
-  }
-
-  if (OriginalMutationObserver) {
-    var counter = 1;
-    var observer = new OriginalMutationObserver(handle);
-    var textNode = document.createTextNode(counter);
-    observer.observe(textNode, {characterData: true});
-
-    timerFunc = function() {
-      counter = (counter + 1) % 2;
-      textNode.data = counter;
-    };
-
-  } else {
-    timerFunc = window.setImmediate || window.setTimeout;
-  }
-
-  function setEndOfMicrotask(func) {
-    callbacks.push(func);
-    if (pending)
-      return;
-    pending = true;
-    timerFunc(handle, 0);
-  }
-
-  context.setEndOfMicrotask = setEndOfMicrotask;
-
-})(window.ShadowDOMPolyfill);
-
-/*
- * Copyright 2013 The Polymer Authors. All rights reserved.
- * Use of this source code is goverened by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-(function(scope) {
-  'use strict';
-
-  var setEndOfMicrotask = scope.setEndOfMicrotask
-  var wrapIfNeeded = scope.wrapIfNeeded
-  var wrappers = scope.wrappers;
-
-  var registrationsTable = new WeakMap();
-  var globalMutationObservers = [];
-  var isScheduled = false;
-
-  function scheduleCallback(observer) {
-    if (isScheduled)
-      return;
-    setEndOfMicrotask(notifyObservers);
-    isScheduled = true;
-  }
-
-  // http://dom.spec.whatwg.org/#mutation-observers
-  function notifyObservers() {
-    isScheduled = false;
-
-    do {
-      var notifyList = globalMutationObservers.slice();
-      var anyNonEmpty = false;
-      for (var i = 0; i < notifyList.length; i++) {
-        var mo = notifyList[i];
-        var queue = mo.takeRecords();
-        removeTransientObserversFor(mo);
-        if (queue.length) {
-          mo.callback_(queue, mo);
-          anyNonEmpty = true;
-        }
-      }
-    } while (anyNonEmpty);
-  }
-
-  /**
-   * @param {string} type
-   * @param {Node} target
-   * @constructor
-   */
-  function MutationRecord(type, target) {
-    this.type = type;
-    this.target = target;
-    this.addedNodes = new wrappers.NodeList();
-    this.removedNodes = new wrappers.NodeList();
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.attributeName = null;
-    this.attributeNamespace = null;
-    this.oldValue = null;
-  }
-
-  /**
-   * Registers transient observers to ancestor and its ancesors for the node
-   * which was removed.
-   * @param {!Node} ancestor
-   * @param {!Node} node
-   */
-  function registerTransientObservers(ancestor, node) {
-    for (; ancestor; ancestor = ancestor.parentNode) {
-      var registrations = registrationsTable.get(ancestor);
-      if (!registrations)
-        continue;
-      for (var i = 0; i < registrations.length; i++) {
-        var registration = registrations[i];
-        if (registration.options.subtree)
-          registration.addTransientObserver(node);
-      }
-    }
-  }
-
-  function removeTransientObserversFor(observer) {
-    for (var i = 0; i < observer.nodes_.length; i++) {
-      var node = observer.nodes_[i];
-      var registrations = registrationsTable.get(node);
-      if (!registrations)
-        return;
-      for (var j = 0; j < registrations.length; j++) {
-        var registration = registrations[j];
-        if (registration.observer === observer)
-          registration.removeTransientObservers();
-      }
-    }
-  }
-
-  // http://dom.spec.whatwg.org/#queue-a-mutation-record
-  function enqueueMutation(target, type, data) {
-    // 1.
-    var interestedObservers = Object.create(null);
-    var associatedStrings = Object.create(null);
-
-    // 2.
-    for (var node = target; node; node = node.parentNode) {
-      // 3.
-      var registrations = registrationsTable.get(node);
-      if (!registrations)
-        continue;
-      for (var j = 0; j < registrations.length; j++) {
-        var registration = registrations[j];
-        var options = registration.options;
-        // 1.
-        if (node !== target && !options.subtree)
-          continue;
-
-        // 2.
-        if (type === 'attributes' && !options.attributes)
-          continue;
-
-        // 3. If type is "attributes", options's attributeFilter is present, and
-        // either options's attributeFilter does not contain name or namespace
-        // is non-null, continue.
-        if (type === 'attributes' && options.attributeFilter &&
-            (data.namespace !== null ||
-             options.attributeFilter.indexOf(data.name) === -1)) {
-          continue;
-        }
-
-        // 4.
-        if (type === 'characterData' && !options.characterData)
-          continue;
-
-        // 5.
-        if (type === 'childList' && !options.childList)
-          continue;
-
-        // 6.
-        var observer = registration.observer;
-        interestedObservers[observer.uid_] = observer;
-
-        // 7. If either type is "attributes" and options's attributeOldValue is
-        // true, or type is "characterData" and options's characterDataOldValue
-        // is true, set the paired string of registered observer's observer in
-        // interested observers to oldValue.
-        if (type === 'attributes' && options.attributeOldValue ||
-            type === 'characterData' && options.characterDataOldValue) {
-          associatedStrings[observer.uid_] = data.oldValue;
-        }
-      }
-    }
-
-    var anyRecordsEnqueued = false;
-
-    // 4.
-    for (var uid in interestedObservers) {
-      var observer = interestedObservers[uid];
-      var record = new MutationRecord(type, target);
-
-      // 2.
-      if ('name' in data && 'namespace' in data) {
-        record.attributeName = data.name;
-        record.attributeNamespace = data.namespace;
-      }
-
-      // 3.
-      if (data.addedNodes)
-        record.addedNodes = data.addedNodes;
-
-      // 4.
-      if (data.removedNodes)
-        record.removedNodes = data.removedNodes;
-
-      // 5.
-      if (data.previousSibling)
-        record.previousSibling = data.previousSibling;
-
-      // 6.
-      if (data.nextSibling)
-        record.nextSibling = data.nextSibling;
-
-      // 7.
-      if (associatedStrings[uid] !== undefined)
-        record.oldValue = associatedStrings[uid];
-
-      // 8.
-      observer.records_.push(record);
-
-      anyRecordsEnqueued = true;
-    }
-
-    if (anyRecordsEnqueued)
-      scheduleCallback();
-  }
-
-  var slice = Array.prototype.slice;
-
-  /**
-   * @param {!Object} options
-   * @constructor
-   */
-  function MutationObserverOptions(options) {
-    this.childList = !!options.childList;
-    this.subtree = !!options.subtree;
-
-    // 1. If either options' attributeOldValue or attributeFilter is present
-    // and options' attributes is omitted, set options' attributes to true.
-    if (!('attributes' in options) &&
-        ('attributeOldValue' in options || 'attributeFilter' in options)) {
-      this.attributes = true;
-    } else {
-      this.attributes = !!options.attributes;
-    }
-
-    // 2. If options' characterDataOldValue is present and options'
-    // characterData is omitted, set options' characterData to true.
-    if ('characterDataOldValue' in options && !('characterData' in options))
-      this.characterData = true;
-    else
-      this.characterData = !!options.characterData;
-
-    // 3. & 4.
-    if (!this.attributes &&
-        (options.attributeOldValue || 'attributeFilter' in options) ||
-        // 5.
-        !this.characterData && options.characterDataOldValue) {
-      throw new TypeError();
-    }
-
-    this.characterData = !!options.characterData;
-    this.attributeOldValue = !!options.attributeOldValue;
-    this.characterDataOldValue = !!options.characterDataOldValue;
-    if ('attributeFilter' in options) {
-      if (options.attributeFilter == null ||
-          typeof options.attributeFilter !== 'object') {
-        throw new TypeError();
-      }
-      this.attributeFilter = slice.call(options.attributeFilter);
-    } else {
-      this.attributeFilter = null;
-    }
-  }
-
-  var uidCounter = 0;
-
-  /**
-   * The class that maps to the DOM MutationObserver interface.
-   * @param {Function} callback.
-   * @constructor
-   */
-  function MutationObserver(callback) {
-    this.callback_ = callback;
-    this.nodes_ = [];
-    this.records_ = [];
-    this.uid_ = ++uidCounter;
-
-    // This will leak. There is no way to implement this without WeakRefs :'(
-    globalMutationObservers.push(this);
-  }
-
-  MutationObserver.prototype = {
-    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe
-    observe: function(target, options) {
-      target = wrapIfNeeded(target);
-
-      var newOptions = new MutationObserverOptions(options);
-
-      // 6.
-      var registration;
-      var registrations = registrationsTable.get(target);
-      if (!registrations)
-        registrationsTable.set(target, registrations = []);
-
-      for (var i = 0; i < registrations.length; i++) {
-        if (registrations[i].observer === this) {
-          registration = registrations[i];
-          // 6.1.
-          registration.removeTransientObservers();
-          // 6.2.
-          registration.options = newOptions;
-        }
-      }
-
-      // 7.
-      if (!registration) {
-        registration = new Registration(this, target, newOptions);
-        registrations.push(registration);
-        this.nodes_.push(target);
-      }
-    },
-
-    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect
-    disconnect: function() {
-      this.nodes_.forEach(function(node) {
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          var registration = registrations[i];
-          if (registration.observer === this) {
-            registrations.splice(i, 1);
-            // Each node can only have one registered observer associated with
-            // this observer.
-            break;
-          }
-        }
-      }, this);
-      this.records_ = [];
-    },
-
-    takeRecords: function() {
-      var copyOfRecords = this.records_;
-      this.records_ = [];
-      return copyOfRecords;
-    }
-  };
-
-  /**
-   * Class used to represent a registered observer.
-   * @param {MutationObserver} observer
-   * @param {Node} target
-   * @param {MutationObserverOptions} options
-   * @constructor
-   */
-  function Registration(observer, target, options) {
-    this.observer = observer;
-    this.target = target;
-    this.options = options;
-    this.transientObservedNodes = [];
-  }
-
-  Registration.prototype = {
-    /**
-     * Adds a transient observer on node. The transient observer gets removed
-     * next time we deliver the change records.
-     * @param {Node} node
-     */
-    addTransientObserver: function(node) {
-      // Don't add transient observers on the target itself. We already have all
-      // the required listeners set up on the target.
-      if (node === this.target)
-        return;
-
-      this.transientObservedNodes.push(node);
-      var registrations = registrationsTable.get(node);
-      if (!registrations)
-        registrationsTable.set(node, registrations = []);
-
-      // We know that registrations does not contain this because we already
-      // checked if node === this.target.
-      registrations.push(this);
-    },
-
-    removeTransientObservers: function() {
-      var transientObservedNodes = this.transientObservedNodes;
-      this.transientObservedNodes = [];
-
-      for (var i = 0; i < transientObservedNodes.length; i++) {
-        var node = transientObservedNodes[i];
-        var registrations = registrationsTable.get(node);
-        for (var j = 0; j < registrations.length; j++) {
-          if (registrations[j] === this) {
-            registrations.splice(j, 1);
-            // Each node can only have one registered observer associated with
-            // this observer.
-            break;
-          }
-        }
-      }
-    }
-  };
-
-  scope.enqueueMutation = enqueueMutation;
-  scope.registerTransientObservers = registerTransientObservers;
-  scope.wrappers.MutationObserver = MutationObserver;
-  scope.wrappers.MutationRecord = MutationRecord;
-
-})(window.ShadowDOMPolyfill);
-
-/**
- * Copyright 2014 The Polymer Authors. All rights reserved.
- * Use of this source code is goverened by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-(function(scope) {
-  'use strict';
-
-  /**
-   * A tree scope represents the root of a tree. All nodes in a tree point to
-   * the same TreeScope object. The tree scope of a node get set the first time
-   * it is accessed or when a node is added or remove to a tree.
-   * @constructor
-   */
-  function TreeScope(root, parent) {
-    this.root = root;
-    this.parent = parent;
-  }
-
-  TreeScope.prototype = {
-    get renderer() {
-      if (this.root instanceof scope.wrappers.ShadowRoot) {
-        return scope.getRendererForHost(this.root.host);
-      }
-      return null;
-    },
-
-    contains: function(treeScope) {
-      for (; treeScope; treeScope = treeScope.parent) {
-        if (treeScope === this)
-          return true;
-      }
-      return false;
-    }
-  };
-
-  function setTreeScope(node, treeScope) {
-    if (node.treeScope_ !== treeScope) {
-      node.treeScope_ = treeScope;
-      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {
-        sr.treeScope_.parent = treeScope;
-      }
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        setTreeScope(child, treeScope);
-      }
-    }
-  }
-
-  function getTreeScope(node) {
-    if (node.treeScope_)
-      return node.treeScope_;
-    var parent = node.parentNode;
-    var treeScope;
-    if (parent)
-      treeScope = getTreeScope(parent);
-    else
-      treeScope = new TreeScope(node, null);
-    return node.treeScope_ = treeScope;
-  }
-
-  scope.TreeScope = TreeScope;
-  scope.getTreeScope = getTreeScope;
-  scope.setTreeScope = setTreeScope;
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
-  var getTreeScope = scope.getTreeScope;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var wrappers = scope.wrappers;
-
-  var wrappedFuns = new WeakMap();
-  var listenersTable = new WeakMap();
-  var handledEventsTable = new WeakMap();
-  var currentlyDispatchingEvents = new WeakMap();
-  var targetTable = new WeakMap();
-  var currentTargetTable = new WeakMap();
-  var relatedTargetTable = new WeakMap();
-  var eventPhaseTable = new WeakMap();
-  var stopPropagationTable = new WeakMap();
-  var stopImmediatePropagationTable = new WeakMap();
-  var eventHandlersTable = new WeakMap();
-  var eventPathTable = new WeakMap();
-
-  function isShadowRoot(node) {
-    return node instanceof wrappers.ShadowRoot;
-  }
-
-  function isInsertionPoint(node) {
-    var localName = node.localName;
-    return localName === 'content' || localName === 'shadow';
-  }
-
-  function isShadowHost(node) {
-    return !!node.shadowRoot;
-  }
-
-  function getEventParent(node) {
-    var dv;
-    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;
-  }
-
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-parent
-  function calculateParents(node, context, ancestors) {
-    if (ancestors.length)
-      return ancestors.shift();
-
-    // 1.
-    if (isShadowRoot(node))
-      return getInsertionParent(node) || node.host;
-
-    // 2.
-    var eventParents = scope.eventParentsTable.get(node);
-    if (eventParents) {
-      // Copy over the remaining event parents for next iteration.
-      for (var i = 1; i < eventParents.length; i++) {
-        ancestors[i - 1] = eventParents[i];
-      }
-      return eventParents[0];
-    }
-
-    // 3.
-    if (context && isInsertionPoint(node)) {
-      var parentNode = node.parentNode;
-      if (parentNode && isShadowHost(parentNode)) {
-        var trees = scope.getShadowTrees(parentNode);
-        var p = getInsertionParent(context);
-        for (var i = 0; i < trees.length; i++) {
-          if (trees[i].contains(p))
-            return p;
-        }
-      }
-    }
-
-    return getEventParent(node);
-  }
-
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#event-retargeting
-  function retarget(node) {
-    var stack = [];  // 1.
-    var ancestor = node;  // 2.
-    var targets = [];
-    var ancestors = [];
-    while (ancestor) {  // 3.
-      var context = null;  // 3.2.
-      // TODO(arv): Change order of these. If the stack is empty we always end
-      // up pushing ancestor, no matter what.
-      if (isInsertionPoint(ancestor)) {  // 3.1.
-        context = topMostNotInsertionPoint(stack);  // 3.1.1.
-        var top = stack[stack.length - 1] || ancestor;  // 3.1.2.
-        stack.push(top);
-      } else if (!stack.length) {
-        stack.push(ancestor);  // 3.3.
-      }
-      var target = stack[stack.length - 1];  // 3.4.
-      targets.push({target: target, currentTarget: ancestor});  // 3.5.
-      if (isShadowRoot(ancestor))  // 3.6.
-        stack.pop();  // 3.6.1.
-
-      ancestor = calculateParents(ancestor, context, ancestors);  // 3.7.
-    }
-    return targets;
-  }
-
-  function topMostNotInsertionPoint(stack) {
-    for (var i = stack.length - 1; i >= 0; i--) {
-      if (!isInsertionPoint(stack[i]))
-        return stack[i];
-    }
-    return null;
-  }
-
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-related-target
-  function adjustRelatedTarget(target, related) {
-    var ancestors = [];
-    while (target) {  // 3.
-      var stack = [];  // 3.1.
-      var ancestor = related;  // 3.2.
-      var last = undefined;  // 3.3. Needs to be reset every iteration.
-      while (ancestor) {
-        var context = null;
-        if (!stack.length) {
-          stack.push(ancestor);
-        } else {
-          if (isInsertionPoint(ancestor)) {  // 3.4.3.
-            context = topMostNotInsertionPoint(stack);
-            // isDistributed is more general than checking whether last is
-            // assigned into ancestor.
-            if (isDistributed(last)) {  // 3.4.3.2.
-              var head = stack[stack.length - 1];
-              stack.push(head);
-            }
-          }
-        }
-
-        if (inSameTree(ancestor, target))  // 3.4.4.
-          return stack[stack.length - 1];
-
-        if (isShadowRoot(ancestor))  // 3.4.5.
-          stack.pop();
-
-        last = ancestor;  // 3.4.6.
-        ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.
-      }
-      if (isShadowRoot(target))  // 3.5.
-        target = target.host;
-      else
-        target = target.parentNode;  // 3.6.
-    }
-  }
-
-  function getInsertionParent(node) {
-    return scope.insertionParentTable.get(node);
-  }
-
-  function isDistributed(node) {
-    return getInsertionParent(node);
-  }
-
-  function inSameTree(a, b) {
-    return getTreeScope(a) === getTreeScope(b);
-  }
-
-  function dispatchOriginalEvent(originalEvent) {
-    // Make sure this event is only dispatched once.
-    if (handledEventsTable.get(originalEvent))
-      return;
-    handledEventsTable.set(originalEvent, true);
-    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));
-  }
-
-  function isLoadLikeEvent(event) {
-    switch (event.type) {
-      case 'beforeunload':
-      case 'load':
-      case 'unload':
-        return true;
-    }
-    return false;
-  }
-
-  function dispatchEvent(event, originalWrapperTarget) {
-    if (currentlyDispatchingEvents.get(event))
-      throw new Error('InvalidStateError')
-    currentlyDispatchingEvents.set(event, true);
-
-    // Render to ensure that the event path is correct.
-    scope.renderAllPending();
-    var eventPath = retarget(originalWrapperTarget);
-
-    // For window "load" events the "load" event is dispatched at the window but
-    // the target is set to the document.
-    //
-    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end
-    //
-    // TODO(arv): Find a less hacky way to do this.
-    if (eventPath.length === 2 &&
-        eventPath[0].target instanceof wrappers.Document &&
-        isLoadLikeEvent(event)) {
-      eventPath.shift();
-    }
-
-    eventPathTable.set(event, eventPath);
-
-    if (dispatchCapturing(event, eventPath)) {
-      if (dispatchAtTarget(event, eventPath)) {
-        dispatchBubbling(event, eventPath);
-      }
-    }
-
-    eventPhaseTable.set(event, Event.NONE);
-    currentTargetTable.delete(event, null);
-    currentlyDispatchingEvents.delete(event);
-
-    return event.defaultPrevented;
-  }
-
-  function dispatchCapturing(event, eventPath) {
-    var phase;
-
-    for (var i = eventPath.length - 1; i > 0; i--) {
-      var target = eventPath[i].target;
-      var currentTarget = eventPath[i].currentTarget;
-      if (target === currentTarget)
-        continue;
-
-      phase = Event.CAPTURING_PHASE;
-      if (!invoke(eventPath[i], event, phase))
-        return false;
-    }
-
-    return true;
-  }
-
-  function dispatchAtTarget(event, eventPath) {
-    var phase = Event.AT_TARGET;
-    return invoke(eventPath[0], event, phase);
-  }
-
-  function dispatchBubbling(event, eventPath) {
-    var bubbles = event.bubbles;
-    var phase;
-
-    for (var i = 1; i < eventPath.length; i++) {
-      var target = eventPath[i].target;
-      var currentTarget = eventPath[i].currentTarget;
-      if (target === currentTarget)
-        phase = Event.AT_TARGET;
-      else if (bubbles && !stopImmediatePropagationTable.get(event))
-        phase = Event.BUBBLING_PHASE;
-      else
-        continue;
-
-      if (!invoke(eventPath[i], event, phase))
-        return;
-    }
-  }
-
-  function invoke(tuple, event, phase) {
-    var target = tuple.target;
-    var currentTarget = tuple.currentTarget;
-
-    var listeners = listenersTable.get(currentTarget);
-    if (!listeners)
-      return true;
-
-    if ('relatedTarget' in event) {
-      var originalEvent = unwrap(event);
-      var unwrappedRelatedTarget = originalEvent.relatedTarget;
-
-      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no
-      // way to have relatedTarget return the adjusted target but worse is that
-      // the originalEvent might not have a relatedTarget so we hit an assert
-      // when we try to wrap it.
-      if (unwrappedRelatedTarget) {
-        // In IE we can get objects that are not EventTargets at this point.
-        // Safari does not have an EventTarget interface so revert to checking
-        // for addEventListener as an approximation.
-        if (unwrappedRelatedTarget instanceof Object &&
-            unwrappedRelatedTarget.addEventListener) {
-          var relatedTarget = wrap(unwrappedRelatedTarget);
-
-          var adjusted = adjustRelatedTarget(currentTarget, relatedTarget);
-          if (adjusted === target)
-            return true;
-        } else {
-          adjusted = null;
-        }
-        relatedTargetTable.set(event, adjusted);
-      }
-    }
-
-    eventPhaseTable.set(event, phase);
-    var type = event.type;
-
-    var anyRemoved = false;
-    targetTable.set(event, target);
-    currentTargetTable.set(event, currentTarget);
-
-    for (var i = 0; i < listeners.length; i++) {
-      var listener = listeners[i];
-      if (listener.removed) {
-        anyRemoved = true;
-        continue;
-      }
-
-      if (listener.type !== type ||
-          !listener.capture && phase === Event.CAPTURING_PHASE ||
-          listener.capture && phase === Event.BUBBLING_PHASE) {
-        continue;
-      }
-
-      try {
-        if (typeof listener.handler === 'function')
-          listener.handler.call(currentTarget, event);
-        else
-          listener.handler.handleEvent(event);
-
-        if (stopImmediatePropagationTable.get(event))
-          return false;
-
-      } catch (ex) {
-        if (window.onerror)
-          window.onerror(ex.message);
-        else
-          console.error(ex, ex.stack);
-      }
-    }
-
-    if (anyRemoved) {
-      var copy = listeners.slice();
-      listeners.length = 0;
-      for (var i = 0; i < copy.length; i++) {
-        if (!copy[i].removed)
-          listeners.push(copy[i]);
-      }
-    }
-
-    return !stopPropagationTable.get(event);
-  }
-
-  function Listener(type, handler, capture) {
-    this.type = type;
-    this.handler = handler;
-    this.capture = Boolean(capture);
-  }
-  Listener.prototype = {
-    equals: function(that) {
-      return this.handler === that.handler && this.type === that.type &&
-          this.capture === that.capture;
-    },
-    get removed() {
-      return this.handler === null;
-    },
-    remove: function() {
-      this.handler = null;
-    }
-  };
-
-  var OriginalEvent = window.Event;
-  OriginalEvent.prototype.polymerBlackList_ = {
-    returnValue: true,
-    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not
-    // support constructable KeyboardEvent so we keep it here for now.
-    keyLocation: true
-  };
-
-  /**
-   * Creates a new Event wrapper or wraps an existin native Event object.
-   * @param {string|Event} type
-   * @param {Object=} options
-   * @constructor
-   */
-  function Event(type, options) {
-    if (type instanceof OriginalEvent) {
-      var impl = type;
-      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')
-        return new BeforeUnloadEvent(impl);
-      this.impl = impl;
-    } else {
-      return wrap(constructEvent(OriginalEvent, 'Event', type, options));
-    }
-  }
-  Event.prototype = {
-    get target() {
-      return targetTable.get(this);
-    },
-    get currentTarget() {
-      return currentTargetTable.get(this);
-    },
-    get eventPhase() {
-      return eventPhaseTable.get(this);
-    },
-    get path() {
-      var nodeList = new wrappers.NodeList();
-      var eventPath = eventPathTable.get(this);
-      if (eventPath) {
-        var index = 0;
-        var lastIndex = eventPath.length - 1;
-        var baseRoot = getTreeScope(currentTargetTable.get(this));
-
-        for (var i = 0; i <= lastIndex; i++) {
-          var currentTarget = eventPath[i].currentTarget;
-          var currentRoot = getTreeScope(currentTarget);
-          if (currentRoot.contains(baseRoot) &&
-              // Make sure we do not add Window to the path.
-              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {
-            nodeList[index++] = currentTarget;
-          }
-        }
-        nodeList.length = index;
-      }
-      return nodeList;
-    },
-    stopPropagation: function() {
-      stopPropagationTable.set(this, true);
-    },
-    stopImmediatePropagation: function() {
-      stopPropagationTable.set(this, true);
-      stopImmediatePropagationTable.set(this, true);
-    }
-  };
-  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));
-
-  function unwrapOptions(options) {
-    if (!options || !options.relatedTarget)
-      return options;
-    return Object.create(options, {
-      relatedTarget: {value: unwrap(options.relatedTarget)}
-    });
-  }
-
-  function registerGenericEvent(name, SuperEvent, prototype) {
-    var OriginalEvent = window[name];
-    var GenericEvent = function(type, options) {
-      if (type instanceof OriginalEvent)
-        this.impl = type;
-      else
-        return wrap(constructEvent(OriginalEvent, name, type, options));
-    };
-    GenericEvent.prototype = Object.create(SuperEvent.prototype);
-    if (prototype)
-      mixin(GenericEvent.prototype, prototype);
-    if (OriginalEvent) {
-      // - Old versions of Safari fails on new FocusEvent (and others?).
-      // - IE does not support event constructors.
-      // - createEvent('FocusEvent') throws in Firefox.
-      // => Try the best practice solution first and fallback to the old way
-      // if needed.
-      try {
-        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));
-      } catch (ex) {
-        registerWrapper(OriginalEvent, GenericEvent,
-                        document.createEvent(name));
-      }
-    }
-    return GenericEvent;
-  }
-
-  var UIEvent = registerGenericEvent('UIEvent', Event);
-  var CustomEvent = registerGenericEvent('CustomEvent', Event);
-
-  var relatedTargetProto = {
-    get relatedTarget() {
-      var relatedTarget = relatedTargetTable.get(this);
-      // relatedTarget can be null.
-      if (relatedTarget !== undefined)
-        return relatedTarget;
-      return wrap(unwrap(this).relatedTarget);
-    }
-  };
-
-  function getInitFunction(name, relatedTargetIndex) {
-    return function() {
-      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);
-      var impl = unwrap(this);
-      impl[name].apply(impl, arguments);
-    };
-  }
-
-  var mouseEventProto = mixin({
-    initMouseEvent: getInitFunction('initMouseEvent', 14)
-  }, relatedTargetProto);
-
-  var focusEventProto = mixin({
-    initFocusEvent: getInitFunction('initFocusEvent', 5)
-  }, relatedTargetProto);
-
-  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);
-  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);
-
-  // In case the browser does not support event constructors we polyfill that
-  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to
-  // `initFooEvent` are derived from the registered default event init dict.
-  var defaultInitDicts = Object.create(null);
-
-  var supportsEventConstructors = (function() {
-    try {
-      new window.FocusEvent('focus');
-    } catch (ex) {
-      return false;
-    }
-    return true;
-  })();
-
-  /**
-   * Constructs a new native event.
-   */
-  function constructEvent(OriginalEvent, name, type, options) {
-    if (supportsEventConstructors)
-      return new OriginalEvent(type, unwrapOptions(options));
-
-    // Create the arguments from the default dictionary.
-    var event = unwrap(document.createEvent(name));
-    var defaultDict = defaultInitDicts[name];
-    var args = [type];
-    Object.keys(defaultDict).forEach(function(key) {
-      var v = options != null && key in options ?
-          options[key] : defaultDict[key];
-      if (key === 'relatedTarget')
-        v = unwrap(v);
-      args.push(v);
-    });
-    event['init' + name].apply(event, args);
-    return event;
-  }
-
-  if (!supportsEventConstructors) {
-    var configureEventConstructor = function(name, initDict, superName) {
-      if (superName) {
-        var superDict = defaultInitDicts[superName];
-        initDict = mixin(mixin({}, superDict), initDict);
-      }
-
-      defaultInitDicts[name] = initDict;
-    };
-
-    // The order of the default event init dictionary keys is important, the
-    // arguments to initFooEvent is derived from that.
-    configureEventConstructor('Event', {bubbles: false, cancelable: false});
-    configureEventConstructor('CustomEvent', {detail: null}, 'Event');
-    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');
-    configureEventConstructor('MouseEvent', {
-      screenX: 0,
-      screenY: 0,
-      clientX: 0,
-      clientY: 0,
-      ctrlKey: false,
-      altKey: false,
-      shiftKey: false,
-      metaKey: false,
-      button: 0,
-      relatedTarget: null
-    }, 'UIEvent');
-    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');
-  }
-
-  // Safari 7 does not yet have BeforeUnloadEvent.
-  // https://bugs.webkit.org/show_bug.cgi?id=120849
-  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;
-
-  function BeforeUnloadEvent(impl) {
-    Event.call(this, impl);
-  }
-  BeforeUnloadEvent.prototype = Object.create(Event.prototype);
-  mixin(BeforeUnloadEvent.prototype, {
-    get returnValue() {
-      return this.impl.returnValue;
-    },
-    set returnValue(v) {
-      this.impl.returnValue = v;
-    }
-  });
-
-  if (OriginalBeforeUnloadEvent)
-    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);
-
-  function isValidListener(fun) {
-    if (typeof fun === 'function')
-      return true;
-    return fun && fun.handleEvent;
-  }
-
-  function isMutationEvent(type) {
-    switch (type) {
-      case 'DOMAttrModified':
-      case 'DOMAttributeNameChanged':
-      case 'DOMCharacterDataModified':
-      case 'DOMElementNameChanged':
-      case 'DOMNodeInserted':
-      case 'DOMNodeInsertedIntoDocument':
-      case 'DOMNodeRemoved':
-      case 'DOMNodeRemovedFromDocument':
-      case 'DOMSubtreeModified':
-        return true;
-    }
-    return false;
-  }
-
-  var OriginalEventTarget = window.EventTarget;
-
-  /**
-   * This represents a wrapper for an EventTarget.
-   * @param {!EventTarget} impl The original event target.
-   * @constructor
-   */
-  function EventTarget(impl) {
-    this.impl = impl;
-  }
-
-  // Node and Window have different internal type checks in WebKit so we cannot
-  // use the same method as the original function.
-  var methodNames = [
-    'addEventListener',
-    'removeEventListener',
-    'dispatchEvent'
-  ];
-
-  [Node, Window].forEach(function(constructor) {
-    var p = constructor.prototype;
-    methodNames.forEach(function(name) {
-      Object.defineProperty(p, name + '_', {value: p[name]});
-    });
-  });
-
-  function getTargetToListenAt(wrapper) {
-    if (wrapper instanceof wrappers.ShadowRoot)
-      wrapper = wrapper.host;
-    return unwrap(wrapper);
-  }
-
-  EventTarget.prototype = {
-    addEventListener: function(type, fun, capture) {
-      if (!isValidListener(fun) || isMutationEvent(type))
-        return;
-
-      var listener = new Listener(type, fun, capture);
-      var listeners = listenersTable.get(this);
-      if (!listeners) {
-        listeners = [];
-        listenersTable.set(this, listeners);
-      } else {
-        // Might have a duplicate.
-        for (var i = 0; i < listeners.length; i++) {
-          if (listener.equals(listeners[i]))
-            return;
-        }
-      }
-
-      listeners.push(listener);
-
-      var target = getTargetToListenAt(this);
-      target.addEventListener_(type, dispatchOriginalEvent, true);
-    },
-    removeEventListener: function(type, fun, capture) {
-      capture = Boolean(capture);
-      var listeners = listenersTable.get(this);
-      if (!listeners)
-        return;
-      var count = 0, found = false;
-      for (var i = 0; i < listeners.length; i++) {
-        if (listeners[i].type === type && listeners[i].capture === capture) {
-          count++;
-          if (listeners[i].handler === fun) {
-            found = true;
-            listeners[i].remove();
-          }
-        }
-      }
-
-      if (found && count === 1) {
-        var target = getTargetToListenAt(this);
-        target.removeEventListener_(type, dispatchOriginalEvent, true);
-      }
-    },
-    dispatchEvent: function(event) {
-      // We want to use the native dispatchEvent because it triggers the default
-      // actions (like checking a checkbox). However, if there are no listeners
-      // in the composed tree then there are no events that will trigger and
-      // listeners in the non composed tree that are part of the event path are
-      // not notified.
-      //
-      // If we find out that there are no listeners in the composed tree we add
-      // a temporary listener to the target which makes us get called back even
-      // in that case.
-
-      var nativeEvent = unwrap(event);
-      var eventType = nativeEvent.type;
-
-      // Allow dispatching the same event again. This is safe because if user
-      // code calls this during an existing dispatch of the same event the
-      // native dispatchEvent throws (that is required by the spec).
-      handledEventsTable.set(nativeEvent, false);
-
-      // Force rendering since we prefer native dispatch and that works on the
-      // composed tree.
-      scope.renderAllPending();
-
-      var tempListener;
-      if (!hasListenerInAncestors(this, eventType)) {
-        tempListener = function() {};
-        this.addEventListener(eventType, tempListener, true);
-      }
-
-      try {
-        return unwrap(this).dispatchEvent_(nativeEvent);
-      } finally {
-        if (tempListener)
-          this.removeEventListener(eventType, tempListener, true);
-      }
-    }
-  };
-
-  function hasListener(node, type) {
-    var listeners = listenersTable.get(node);
-    if (listeners) {
-      for (var i = 0; i < listeners.length; i++) {
-        if (!listeners[i].removed && listeners[i].type === type)
-          return true;
-      }
-    }
-    return false;
-  }
-
-  function hasListenerInAncestors(target, type) {
-    for (var node = unwrap(target); node; node = node.parentNode) {
-      if (hasListener(wrap(node), type))
-        return true;
-    }
-    return false;
-  }
-
-  if (OriginalEventTarget)
-    registerWrapper(OriginalEventTarget, EventTarget);
-
-  function wrapEventTargetMethods(constructors) {
-    forwardMethodsToWrapper(constructors, methodNames);
-  }
-
-  var originalElementFromPoint = document.elementFromPoint;
-
-  function elementFromPoint(self, document, x, y) {
-    scope.renderAllPending();
-
-    var element = wrap(originalElementFromPoint.call(document.impl, x, y));
-    var targets = retarget(element, this)
-    for (var i = 0; i < targets.length; i++) {
-      var target = targets[i];
-      if (target.currentTarget === self)
-        return target.target;
-    }
-    return null;
-  }
-
-  /**
-   * Returns a function that is to be used as a getter for `onfoo` properties.
-   * @param {string} name
-   * @return {Function}
-   */
-  function getEventHandlerGetter(name) {
-    return function() {
-      var inlineEventHandlers = eventHandlersTable.get(this);
-      return inlineEventHandlers && inlineEventHandlers[name] &&
-          inlineEventHandlers[name].value || null;
-     };
-  }
-
-  /**
-   * Returns a function that is to be used as a setter for `onfoo` properties.
-   * @param {string} name
-   * @return {Function}
-   */
-  function getEventHandlerSetter(name) {
-    var eventType = name.slice(2);
-    return function(value) {
-      var inlineEventHandlers = eventHandlersTable.get(this);
-      if (!inlineEventHandlers) {
-        inlineEventHandlers = Object.create(null);
-        eventHandlersTable.set(this, inlineEventHandlers);
-      }
-
-      var old = inlineEventHandlers[name];
-      if (old)
-        this.removeEventListener(eventType, old.wrapped, false);
-
-      if (typeof value === 'function') {
-        var wrapped = function(e) {
-          var rv = value.call(this, e);
-          if (rv === false)
-            e.preventDefault();
-          else if (name === 'onbeforeunload' && typeof rv === 'string')
-            e.returnValue = rv;
-          // mouseover uses true for preventDefault but preventDefault for
-          // mouseover is ignored by browsers these day.
-        };
-
-        this.addEventListener(eventType, wrapped, false);
-        inlineEventHandlers[name] = {
-          value: value,
-          wrapped: wrapped
-        };
-      }
-    };
-  }
-
-  scope.adjustRelatedTarget = adjustRelatedTarget;
-  scope.elementFromPoint = elementFromPoint;
-  scope.getEventHandlerGetter = getEventHandlerGetter;
-  scope.getEventHandlerSetter = getEventHandlerSetter;
-  scope.wrapEventTargetMethods = wrapEventTargetMethods;
-  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;
-  scope.wrappers.CustomEvent = CustomEvent;
-  scope.wrappers.Event = Event;
-  scope.wrappers.EventTarget = EventTarget;
-  scope.wrappers.FocusEvent = FocusEvent;
-  scope.wrappers.MouseEvent = MouseEvent;
-  scope.wrappers.UIEvent = UIEvent;
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2012 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var wrap = scope.wrap;
-
-  function nonEnum(obj, prop) {
-    Object.defineProperty(obj, prop, {enumerable: false});
-  }
-
-  function NodeList() {
-    this.length = 0;
-    nonEnum(this, 'length');
-  }
-  NodeList.prototype = {
-    item: function(index) {
-      return this[index];
-    }
-  };
-  nonEnum(NodeList.prototype, 'item');
-
-  function wrapNodeList(list) {
-    if (list == null)
-      return list;
-    var wrapperList = new NodeList();
-    for (var i = 0, length = list.length; i < length; i++) {
-      wrapperList[i] = wrap(list[i]);
-    }
-    wrapperList.length = length;
-    return wrapperList;
-  }
-
-  function addWrapNodeListMethod(wrapperConstructor, name) {
-    wrapperConstructor.prototype[name] = function() {
-      return wrapNodeList(this.impl[name].apply(this.impl, arguments));
-    };
-  }
-
-  scope.wrappers.NodeList = NodeList;
-  scope.addWrapNodeListMethod = addWrapNodeListMethod;
-  scope.wrapNodeList = wrapNodeList;
-
-})(window.ShadowDOMPolyfill);
-
-/*
- * Copyright 2014 The Polymer Authors. All rights reserved.
- * Use of this source code is goverened by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-(function(scope) {
-  'use strict';
-
-  // TODO(arv): Implement.
-
-  scope.wrapHTMLCollection = scope.wrapNodeList;
-  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;
-
-})(window.ShadowDOMPolyfill);
-
-/**
- * Copyright 2012 The Polymer Authors. All rights reserved.
- * Use of this source code is goverened by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-(function(scope) {
-  'use strict';
-
-  var EventTarget = scope.wrappers.EventTarget;
-  var NodeList = scope.wrappers.NodeList;
-  var TreeScope = scope.TreeScope;
-  var assert = scope.assert;
-  var defineWrapGetter = scope.defineWrapGetter;
-  var enqueueMutation = scope.enqueueMutation;
-  var getTreeScope = scope.getTreeScope;
-  var isWrapper = scope.isWrapper;
-  var mixin = scope.mixin;
-  var registerTransientObservers = scope.registerTransientObservers;
-  var registerWrapper = scope.registerWrapper;
-  var setTreeScope = scope.setTreeScope;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-  var wrapIfNeeded = scope.wrapIfNeeded;
-  var wrappers = scope.wrappers;
-
-  function assertIsNodeWrapper(node) {
-    assert(node instanceof Node);
-  }
-
-  function createOneElementNodeList(node) {
-    var nodes = new NodeList();
-    nodes[0] = node;
-    nodes.length = 1;
-    return nodes;
-  }
-
-  var surpressMutations = false;
-
-  /**
-   * Called before node is inserted into a node to enqueue its removal from its
-   * old parent.
-   * @param {!Node} node The node that is about to be removed.
-   * @param {!Node} parent The parent node that the node is being removed from.
-   * @param {!NodeList} nodes The collected nodes.
-   */
-  function enqueueRemovalForInsertedNodes(node, parent, nodes) {
-    enqueueMutation(parent, 'childList', {
-      removedNodes: nodes,
-      previousSibling: node.previousSibling,
-      nextSibling: node.nextSibling
-    });
-  }
-
-  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {
-    enqueueMutation(df, 'childList', {
-      removedNodes: nodes
-    });
-  }
-
-  /**
-   * Collects nodes from a DocumentFragment or a Node for removal followed
-   * by an insertion.
-   *
-   * This updates the internal pointers for node, previousNode and nextNode.
-   */
-  function collectNodes(node, parentNode, previousNode, nextNode) {
-    if (node instanceof DocumentFragment) {
-      var nodes = collectNodesForDocumentFragment(node);
-
-      // The extra loop is to work around bugs with DocumentFragments in IE.
-      surpressMutations = true;
-      for (var i = nodes.length - 1; i >= 0; i--) {
-        node.removeChild(nodes[i]);
-        nodes[i].parentNode_ = parentNode;
-      }
-      surpressMutations = false;
-
-      for (var i = 0; i < nodes.length; i++) {
-        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;
-        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;
-      }
-
-      if (previousNode)
-        previousNode.nextSibling_ = nodes[0];
-      if (nextNode)
-        nextNode.previousSibling_ = nodes[nodes.length - 1];
-
-      return nodes;
-    }
-
-    var nodes = createOneElementNodeList(node);
-    var oldParent = node.parentNode;
-    if (oldParent) {
-      // This will enqueue the mutation record for the removal as needed.
-      oldParent.removeChild(node);
-    }
-
-    node.parentNode_ = parentNode;
-    node.previousSibling_ = previousNode;
-    node.nextSibling_ = nextNode;
-    if (previousNode)
-      previousNode.nextSibling_ = node;
-    if (nextNode)
-      nextNode.previousSibling_ = node;
-
-    return nodes;
-  }
-
-  function collectNodesNative(node) {
-    if (node instanceof DocumentFragment)
-      return collectNodesForDocumentFragment(node);
-
-    var nodes = createOneElementNodeList(node);
-    var oldParent = node.parentNode;
-    if (oldParent)
-      enqueueRemovalForInsertedNodes(node, oldParent, nodes);
-    return nodes;
-  }
-
-  function collectNodesForDocumentFragment(node) {
-    var nodes = new NodeList();
-    var i = 0;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      nodes[i++] = child;
-    }
-    nodes.length = i;
-    enqueueRemovalForInsertedDocumentFragment(node, nodes);
-    return nodes;
-  }
-
-  function snapshotNodeList(nodeList) {
-    // NodeLists are not live at the moment so just return the same object.
-    return nodeList;
-  }
-
-  // http://dom.spec.whatwg.org/#node-is-inserted
-  function nodeWasAdded(node, treeScope) {
-    setTreeScope(node, treeScope);
-    node.nodeIsInserted_();
-  }
-
-  function nodesWereAdded(nodes, parent) {
-    var treeScope = getTreeScope(parent);
-    for (var i = 0; i < nodes.length; i++) {
-      nodeWasAdded(nodes[i], treeScope);
-    }
-  }
-
-  // http://dom.spec.whatwg.org/#node-is-removed
-  function nodeWasRemoved(node) {
-    setTreeScope(node, new TreeScope(node, null));
-  }
-
-  function nodesWereRemoved(nodes) {
-    for (var i = 0; i < nodes.length; i++) {
-      nodeWasRemoved(nodes[i]);
-    }
-  }
-
-  function ensureSameOwnerDocument(parent, child) {
-    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?
-        parent : parent.ownerDocument;
-    if (ownerDoc !== child.ownerDocument)
-      ownerDoc.adoptNode(child);
-  }
-
-  function adoptNodesIfNeeded(owner, nodes) {
-    if (!nodes.length)
-      return;
-
-    var ownerDoc = owner.ownerDocument;
-
-    // All nodes have the same ownerDocument when we get here.
-    if (ownerDoc === nodes[0].ownerDocument)
-      return;
-
-    for (var i = 0; i < nodes.length; i++) {
-      scope.adoptNodeNoRemove(nodes[i], ownerDoc);
-    }
-  }
-
-  function unwrapNodesForInsertion(owner, nodes) {
-    adoptNodesIfNeeded(owner, nodes);
-    var length = nodes.length;
-
-    if (length === 1)
-      return unwrap(nodes[0]);
-
-    var df = unwrap(owner.ownerDocument.createDocumentFragment());
-    for (var i = 0; i < length; i++) {
-      df.appendChild(unwrap(nodes[i]));
-    }
-    return df;
-  }
-
-  function clearChildNodes(wrapper) {
-    if (wrapper.firstChild_ !== undefined) {
-      var child = wrapper.firstChild_;
-      while (child) {
-        var tmp = child;
-        child = child.nextSibling_;
-        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;
-      }
-    }
-    wrapper.firstChild_ = wrapper.lastChild_ = undefined;
-  }
-
-  function removeAllChildNodes(wrapper) {
-    if (wrapper.invalidateShadowRenderer()) {
-      var childWrapper = wrapper.firstChild;
-      while (childWrapper) {
-        assert(childWrapper.parentNode === wrapper);
-        var nextSibling = childWrapper.nextSibling;
-        var childNode = unwrap(childWrapper);
-        var parentNode = childNode.parentNode;
-        if (parentNode)
-          originalRemoveChild.call(parentNode, childNode);
-        childWrapper.previousSibling_ = childWrapper.nextSibling_ =
-            childWrapper.parentNode_ = null;
-        childWrapper = nextSibling;
-      }
-      wrapper.firstChild_ = wrapper.lastChild_ = null;
-    } else {
-      var node = unwrap(wrapper);
-      var child = node.firstChild;
-      var nextSibling;
-      while (child) {
-        nextSibling = child.nextSibling;
-        originalRemoveChild.call(node, child);
-        child = nextSibling;
-      }
-    }
-  }
-
-  function invalidateParent(node) {
-    var p = node.parentNode;
-    return p && p.invalidateShadowRenderer();
-  }
-
-  function cleanupNodes(nodes) {
-    for (var i = 0, n; i < nodes.length; i++) {
-      n = nodes[i];
-      n.parentNode.removeChild(n);
-    }
-  }
-
-  var originalImportNode = document.importNode;
-  var originalCloneNode = window.Node.prototype.cloneNode;
-
-  function cloneNode(node, deep, opt_doc) {
-    var clone;
-    if (opt_doc)
-      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));
-    else
-      clone = wrap(originalCloneNode.call(node.impl, false));
-
-    if (deep) {
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        clone.appendChild(cloneNode(child, true, opt_doc));
-      }
-
-      if (node instanceof wrappers.HTMLTemplateElement) {
-        var cloneContent = clone.content;
-        for (var child = node.content.firstChild;
-             child;
-             child = child.nextSibling) {
-         cloneContent.appendChild(cloneNode(child, true, opt_doc));
-        }
-      }
-    }
-    // TODO(arv): Some HTML elements also clone other data like value.
-    return clone;
-  }
-
-  function contains(self, child) {
-    if (!child || getTreeScope(self) !== getTreeScope(child))
-      return false;
-
-    for (var node = child; node; node = node.parentNode) {
-      if (node === self)
-        return true;
-    }
-    return false;
-  }
-
-  var OriginalNode = window.Node;
-
-  /**
-   * This represents a wrapper of a native DOM node.
-   * @param {!Node} original The original DOM node, aka, the visual DOM node.
-   * @constructor
-   * @extends {EventTarget}
-   */
-  function Node(original) {
-    assert(original instanceof OriginalNode);
-
-    EventTarget.call(this, original);
-
-    // These properties are used to override the visual references with the
-    // logical ones. If the value is undefined it means that the logical is the
-    // same as the visual.
-
-    /**
-     * @type {Node|undefined}
-     * @private
-     */
-    this.parentNode_ = undefined;
-
-    /**
-     * @type {Node|undefined}
-     * @private
-     */
-    this.firstChild_ = undefined;
-
-    /**
-     * @type {Node|undefined}
-     * @private
-     */
-    this.lastChild_ = undefined;
-
-    /**
-     * @type {Node|undefined}
-     * @private
-     */
-    this.nextSibling_ = undefined;
-
-    /**
-     * @type {Node|undefined}
-     * @private
-     */
-    this.previousSibling_ = undefined;
-
-    this.treeScope_ = undefined;
-  }
-
-  var OriginalDocumentFragment = window.DocumentFragment;
-  var originalAppendChild = OriginalNode.prototype.appendChild;
-  var originalCompareDocumentPosition =
-      OriginalNode.prototype.compareDocumentPosition;
-  var originalInsertBefore = OriginalNode.prototype.insertBefore;
-  var originalRemoveChild = OriginalNode.prototype.removeChild;
-  var originalReplaceChild = OriginalNode.prototype.replaceChild;
-
-  var isIe = /Trident/.test(navigator.userAgent);
-
-  var removeChildOriginalHelper = isIe ?
-      function(parent, child) {
-        try {
-          originalRemoveChild.call(parent, child);
-        } catch (ex) {
-          if (!(parent instanceof OriginalDocumentFragment))
-            throw ex;
-        }
-      } :
-      function(parent, child) {
-        originalRemoveChild.call(parent, child);
-      };
-
-  Node.prototype = Object.create(EventTarget.prototype);
-  mixin(Node.prototype, {
-    appendChild: function(childWrapper) {
-      return this.insertBefore(childWrapper, null);
-    },
-
-    insertBefore: function(childWrapper, refWrapper) {
-      assertIsNodeWrapper(childWrapper);
-
-      var refNode;
-      if (refWrapper) {
-        if (isWrapper(refWrapper)) {
-          refNode = unwrap(refWrapper);
-        } else {
-          refNode = refWrapper;
-          refWrapper = wrap(refNode);
-        }
-      } else {
-        refWrapper = null;
-        refNode = null;
-      }
-
-      refWrapper && assert(refWrapper.parentNode === this);
-
-      var nodes;
-      var previousNode =
-          refWrapper ? refWrapper.previousSibling : this.lastChild;
-
-      var useNative = !this.invalidateShadowRenderer() &&
-                      !invalidateParent(childWrapper);
-
-      if (useNative)
-        nodes = collectNodesNative(childWrapper);
-      else
-        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);
-
-      if (useNative) {
-        ensureSameOwnerDocument(this, childWrapper);
-        clearChildNodes(this);
-        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);
-      } else {
-        if (!previousNode)
-          this.firstChild_ = nodes[0];
-        if (!refWrapper)
-          this.lastChild_ = nodes[nodes.length - 1];
-
-        var parentNode = refNode ? refNode.parentNode : this.impl;
-
-        // insertBefore refWrapper no matter what the parent is?
-        if (parentNode) {
-          originalInsertBefore.call(parentNode,
-              unwrapNodesForInsertion(this, nodes), refNode);
-        } else {
-          adoptNodesIfNeeded(this, nodes);
-        }
-      }
-
-      enqueueMutation(this, 'childList', {
-        addedNodes: nodes,
-        nextSibling: refWrapper,
-        previousSibling: previousNode
-      });
-
-      nodesWereAdded(nodes, this);
-
-      return childWrapper;
-    },
-
-    removeChild: function(childWrapper) {
-      assertIsNodeWrapper(childWrapper);
-      if (childWrapper.parentNode !== this) {
-        // IE has invalid DOM trees at times.
-        var found = false;
-        var childNodes = this.childNodes;
-        for (var ieChild = this.firstChild; ieChild;
-             ieChild = ieChild.nextSibling) {
-          if (ieChild === childWrapper) {
-            found = true;
-            break;
-          }
-        }
-        if (!found) {
-          // TODO(arv): DOMException
-          throw new Error('NotFoundError');
-        }
-      }
-
-      var childNode = unwrap(childWrapper);
-      var childWrapperNextSibling = childWrapper.nextSibling;
-      var childWrapperPreviousSibling = childWrapper.previousSibling;
-
-      if (this.invalidateShadowRenderer()) {
-        // We need to remove the real node from the DOM before updating the
-        // pointers. This is so that that mutation event is dispatched before
-        // the pointers have changed.
-        var thisFirstChild = this.firstChild;
-        var thisLastChild = this.lastChild;
-
-        var parentNode = childNode.parentNode;
-        if (parentNode)
-          removeChildOriginalHelper(parentNode, childNode);
-
-        if (thisFirstChild === childWrapper)
-          this.firstChild_ = childWrapperNextSibling;
-        if (thisLastChild === childWrapper)
-          this.lastChild_ = childWrapperPreviousSibling;
-        if (childWrapperPreviousSibling)
-          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;
-        if (childWrapperNextSibling) {
-          childWrapperNextSibling.previousSibling_ =
-              childWrapperPreviousSibling;
-        }
-
-        childWrapper.previousSibling_ = childWrapper.nextSibling_ =
-            childWrapper.parentNode_ = undefined;
-      } else {
-        clearChildNodes(this);
-        removeChildOriginalHelper(this.impl, childNode);
-      }
-
-      if (!surpressMutations) {
-        enqueueMutation(this, 'childList', {
-          removedNodes: createOneElementNodeList(childWrapper),
-          nextSibling: childWrapperNextSibling,
-          previousSibling: childWrapperPreviousSibling
-        });
-      }
-
-      registerTransientObservers(this, childWrapper);
-
-      return childWrapper;
-    },
-
-    replaceChild: function(newChildWrapper, oldChildWrapper) {
-      assertIsNodeWrapper(newChildWrapper);
-
-      var oldChildNode;
-      if (isWrapper(oldChildWrapper)) {
-        oldChildNode = unwrap(oldChildWrapper);
-      } else {
-        oldChildNode = oldChildWrapper;
-        oldChildWrapper = wrap(oldChildNode);
-      }
-
-      if (oldChildWrapper.parentNode !== this) {
-        // TODO(arv): DOMException
-        throw new Error('NotFoundError');
-      }
-
-      var nextNode = oldChildWrapper.nextSibling;
-      var previousNode = oldChildWrapper.previousSibling;
-      var nodes;
-
-      var useNative = !this.invalidateShadowRenderer() &&
-                      !invalidateParent(newChildWrapper);
-
-      if (useNative) {
-        nodes = collectNodesNative(newChildWrapper);
-      } else {
-        if (nextNode === newChildWrapper)
-          nextNode = newChildWrapper.nextSibling;
-        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);
-      }
-
-      if (!useNative) {
-        if (this.firstChild === oldChildWrapper)
-          this.firstChild_ = nodes[0];
-        if (this.lastChild === oldChildWrapper)
-          this.lastChild_ = nodes[nodes.length - 1];
-
-        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =
-            oldChildWrapper.parentNode_ = undefined;
-
-        // replaceChild no matter what the parent is?
-        if (oldChildNode.parentNode) {
-          originalReplaceChild.call(
-              oldChildNode.parentNode,
-              unwrapNodesForInsertion(this, nodes),
-              oldChildNode);
-        }
-      } else {
-        ensureSameOwnerDocument(this, newChildWrapper);
-        clearChildNodes(this);
-        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),
-                                  oldChildNode);
-      }
-
-      enqueueMutation(this, 'childList', {
-        addedNodes: nodes,
-        removedNodes: createOneElementNodeList(oldChildWrapper),
-        nextSibling: nextNode,
-        previousSibling: previousNode
-      });
-
-      nodeWasRemoved(oldChildWrapper);
-      nodesWereAdded(nodes, this);
-
-      return oldChildWrapper;
-    },
-
-    /**
-     * Called after a node was inserted. Subclasses override this to invalidate
-     * the renderer as needed.
-     * @private
-     */
-    nodeIsInserted_: function() {
-      for (var child = this.firstChild; child; child = child.nextSibling) {
-        child.nodeIsInserted_();
-      }
-    },
-
-    hasChildNodes: function() {
-      return this.firstChild !== null;
-    },
-
-    /** @type {Node} */
-    get parentNode() {
-      // If the parentNode has not been overridden, use the original parentNode.
-      return this.parentNode_ !== undefined ?
-          this.parentNode_ : wrap(this.impl.parentNode);
-    },
-
-    /** @type {Node} */
-    get firstChild() {
-      return this.firstChild_ !== undefined ?
-          this.firstChild_ : wrap(this.impl.firstChild);
-    },
-
-    /** @type {Node} */
-    get lastChild() {
-      return this.lastChild_ !== undefined ?
-          this.lastChild_ : wrap(this.impl.lastChild);
-    },
-
-    /** @type {Node} */
-    get nextSibling() {
-      return this.nextSibling_ !== undefined ?
-          this.nextSibling_ : wrap(this.impl.nextSibling);
-    },
-
-    /** @type {Node} */
-    get previousSibling() {
-      return this.previousSibling_ !== undefined ?
-          this.previousSibling_ : wrap(this.impl.previousSibling);
-    },
-
-    get parentElement() {
-      var p = this.parentNode;
-      while (p && p.nodeType !== Node.ELEMENT_NODE) {
-        p = p.parentNode;
-      }
-      return p;
-    },
-
-    get textContent() {
-      // TODO(arv): This should fallback to this.impl.textContent if there
-      // are no shadow trees below or above the context node.
-      var s = '';
-      for (var child = this.firstChild; child; child = child.nextSibling) {
-        if (child.nodeType != Node.COMMENT_NODE) {
-          s += child.textContent;
-        }
-      }
-      return s;
-    },
-    set textContent(textContent) {
-      var removedNodes = snapshotNodeList(this.childNodes);
-
-      if (this.invalidateShadowRenderer()) {
-        removeAllChildNodes(this);
-        if (textContent !== '') {
-          var textNode = this.impl.ownerDocument.createTextNode(textContent);
-          this.appendChild(textNode);
-        }
-      } else {
-        clearChildNodes(this);
-        this.impl.textContent = textContent;
-      }
-
-      var addedNodes = snapshotNodeList(this.childNodes);
-
-      enqueueMutation(this, 'childList', {
-        addedNodes: addedNodes,
-        removedNodes: removedNodes
-      });
-
-      nodesWereRemoved(removedNodes);
-      nodesWereAdded(addedNodes, this);
-    },
-
-    get childNodes() {
-      var wrapperList = new NodeList();
-      var i = 0;
-      for (var child = this.firstChild; child; child = child.nextSibling) {
-        wrapperList[i++] = child;
-      }
-      wrapperList.length = i;
-      return wrapperList;
-    },
-
-    cloneNode: function(deep) {
-      return cloneNode(this, deep);
-    },
-
-    contains: function(child) {
-      return contains(this, wrapIfNeeded(child));
-    },
-
-    compareDocumentPosition: function(otherNode) {
-      // This only wraps, it therefore only operates on the composed DOM and not
-      // the logical DOM.
-      return originalCompareDocumentPosition.call(this.impl,
-                                                  unwrapIfNeeded(otherNode));
-    },
-
-    normalize: function() {
-      var nodes = snapshotNodeList(this.childNodes);
-      var remNodes = [];
-      var s = '';
-      var modNode;
-
-      for (var i = 0, n; i < nodes.length; i++) {
-        n = nodes[i];
-        if (n.nodeType === Node.TEXT_NODE) {
-          if (!modNode && !n.data.length)
-            this.removeNode(n);
-          else if (!modNode)
-            modNode = n;
-          else {
-            s += n.data;
-            remNodes.push(n);
-          }
-        } else {
-          if (modNode && remNodes.length) {
-            modNode.data += s;
-            cleanUpNodes(remNodes);
-          }
-          remNodes = [];
-          s = '';
-          modNode = null;
-          if (n.childNodes.length)
-            n.normalize();
-        }
-      }
-
-      // handle case where >1 text nodes are the last children
-      if (modNode && remNodes.length) {
-        modNode.data += s;
-        cleanupNodes(remNodes);
-      }
-    }
-  });
-
-  defineWrapGetter(Node, 'ownerDocument');
-
-  // We use a DocumentFragment as a base and then delete the properties of
-  // DocumentFragment.prototype from the wrapper Node. Since delete makes
-  // objects slow in some JS engines we recreate the prototype object.
-  registerWrapper(OriginalNode, Node, document.createDocumentFragment());
-  delete Node.prototype.querySelector;
-  delete Node.prototype.querySelectorAll;
-  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);
-
-  scope.cloneNode = cloneNode;
-  scope.nodeWasAdded = nodeWasAdded;
-  scope.nodeWasRemoved = nodeWasRemoved;
-  scope.nodesWereAdded = nodesWereAdded;
-  scope.nodesWereRemoved = nodesWereRemoved;
-  scope.snapshotNodeList = snapshotNodeList;
-  scope.wrappers.Node = Node;
-
-})(window.ShadowDOMPolyfill);
-
-// 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.
-
-(function(scope) {
-  'use strict';
-
-  function findOne(node, selector) {
-    var m, el = node.firstElementChild;
-    while (el) {
-      if (el.matches(selector))
-        return el;
-      m = findOne(el, selector);
-      if (m)
-        return m;
-      el = el.nextElementSibling;
-    }
-    return null;
-  }
-
-  function findAll(node, selector, results) {
-    var el = node.firstElementChild;
-    while (el) {
-      if (el.matches(selector))
-        results[results.length++] = el;
-      findAll(el, selector, results);
-      el = el.nextElementSibling;
-    }
-    return results;
-  }
-
-  // find and findAll will only match Simple Selectors,
-  // Structural Pseudo Classes are not guarenteed to be correct
-  // http://www.w3.org/TR/css3-selectors/#simple-selectors
-
-  var SelectorsInterface = {
-    querySelector: function(selector) {
-      return findOne(this, selector);
-    },
-    querySelectorAll: function(selector) {
-      return findAll(this, selector, new NodeList())
-    }
-  };
-
-  var GetElementsByInterface = {
-    getElementsByTagName: function(tagName) {
-      // TODO(arv): Check tagName?
-      return this.querySelectorAll(tagName);
-    },
-    getElementsByClassName: function(className) {
-      // TODO(arv): Check className?
-      return this.querySelectorAll('.' + className);
-    },
-    getElementsByTagNameNS: function(ns, tagName) {
-      if (ns === '*')
-        return this.getElementsByTagName(tagName);
-
-      // TODO(arv): Check tagName?
-      var result = new NodeList;
-      var els = this.getElementsByTagName(tagName);
-      for (var i = 0, j = 0; i < els.length; i++) {
-        if (els[i].namespaceURI === ns)
-          result[j++] = els[i];
-      }
-      result.length = j;
-      return result;
-    }
-  };
-
-  scope.GetElementsByInterface = GetElementsByInterface;
-  scope.SelectorsInterface = SelectorsInterface;
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var NodeList = scope.wrappers.NodeList;
-
-  function forwardElement(node) {
-    while (node && node.nodeType !== Node.ELEMENT_NODE) {
-      node = node.nextSibling;
-    }
-    return node;
-  }
-
-  function backwardsElement(node) {
-    while (node && node.nodeType !== Node.ELEMENT_NODE) {
-      node = node.previousSibling;
-    }
-    return node;
-  }
-
-  var ParentNodeInterface = {
-    get firstElementChild() {
-      return forwardElement(this.firstChild);
-    },
-
-    get lastElementChild() {
-      return backwardsElement(this.lastChild);
-    },
-
-    get childElementCount() {
-      var count = 0;
-      for (var child = this.firstElementChild;
-           child;
-           child = child.nextElementSibling) {
-        count++;
-      }
-      return count;
-    },
-
-    get children() {
-      var wrapperList = new NodeList();
-      var i = 0;
-      for (var child = this.firstElementChild;
-           child;
-           child = child.nextElementSibling) {
-        wrapperList[i++] = child;
-      }
-      wrapperList.length = i;
-      return wrapperList;
-    },
-
-    remove: function() {
-      var p = this.parentNode;
-      if (p)
-        p.removeChild(this);
-    }
-  };
-
-  var ChildNodeInterface = {
-    get nextElementSibling() {
-      return forwardElement(this.nextSibling);
-    },
-
-    get previousElementSibling() {
-      return backwardsElement(this.previousSibling);
-    }
-  };
-
-  scope.ChildNodeInterface = ChildNodeInterface;
-  scope.ParentNodeInterface = ParentNodeInterface;
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var ChildNodeInterface = scope.ChildNodeInterface;
-  var Node = scope.wrappers.Node;
-  var enqueueMutation = scope.enqueueMutation;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-
-  var OriginalCharacterData = window.CharacterData;
-
-  function CharacterData(node) {
-    Node.call(this, node);
-  }
-  CharacterData.prototype = Object.create(Node.prototype);
-  mixin(CharacterData.prototype, {
-    get textContent() {
-      return this.data;
-    },
-    set textContent(value) {
-      this.data = value;
-    },
-    get data() {
-      return this.impl.data;
-    },
-    set data(value) {
-      var oldValue = this.impl.data;
-      enqueueMutation(this, 'characterData', {
-        oldValue: oldValue
-      });
-      this.impl.data = value;
-    }
-  });
-
-  mixin(CharacterData.prototype, ChildNodeInterface);
-
-  registerWrapper(OriginalCharacterData, CharacterData,
-                  document.createTextNode(''));
-
-  scope.wrappers.CharacterData = CharacterData;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2014 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var CharacterData = scope.wrappers.CharacterData;
-  var enqueueMutation = scope.enqueueMutation;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-
-  function toUInt32(x) {
-    return x >>> 0;
-  }
-
-  var OriginalText = window.Text;
-
-  function Text(node) {
-    CharacterData.call(this, node);
-  }
-  Text.prototype = Object.create(CharacterData.prototype);
-  mixin(Text.prototype, {
-    splitText: function(offset) {
-      offset = toUInt32(offset);
-      var s = this.data;
-      if (offset > s.length)
-        throw new Error('IndexSizeError');
-      var head = s.slice(0, offset);
-      var tail = s.slice(offset);
-      this.data = head;
-      var newTextNode = this.ownerDocument.createTextNode(tail);
-      if (this.parentNode)
-        this.parentNode.insertBefore(newTextNode, this.nextSibling);
-      return newTextNode;
-    }
-  });
-
-  registerWrapper(OriginalText, Text, document.createTextNode(''));
-
-  scope.wrappers.Text = Text;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var ChildNodeInterface = scope.ChildNodeInterface;
-  var GetElementsByInterface = scope.GetElementsByInterface;
-  var Node = scope.wrappers.Node;
-  var ParentNodeInterface = scope.ParentNodeInterface;
-  var SelectorsInterface = scope.SelectorsInterface;
-  var addWrapNodeListMethod = scope.addWrapNodeListMethod;
-  var enqueueMutation = scope.enqueueMutation;
-  var mixin = scope.mixin;
-  var oneOf = scope.oneOf;
-  var registerWrapper = scope.registerWrapper;
-  var wrappers = scope.wrappers;
-
-  var OriginalElement = window.Element;
-
-  var matchesNames = [
-    'matches',  // needs to come first.
-    'mozMatchesSelector',
-    'msMatchesSelector',
-    'webkitMatchesSelector',
-  ].filter(function(name) {
-    return OriginalElement.prototype[name];
-  });
-
-  var matchesName = matchesNames[0];
-
-  var originalMatches = OriginalElement.prototype[matchesName];
-
-  function invalidateRendererBasedOnAttribute(element, name) {
-    // Only invalidate if parent node is a shadow host.
-    var p = element.parentNode;
-    if (!p || !p.shadowRoot)
-      return;
-
-    var renderer = scope.getRendererForHost(p);
-    if (renderer.dependsOnAttribute(name))
-      renderer.invalidate();
-  }
-
-  function enqueAttributeChange(element, name, oldValue) {
-    // This is not fully spec compliant. We should use localName (which might
-    // have a different case than name) and the namespace (which requires us
-    // to get the Attr object).
-    enqueueMutation(element, 'attributes', {
-      name: name,
-      namespace: null,
-      oldValue: oldValue
-    });
-  }
-
-  function Element(node) {
-    Node.call(this, node);
-  }
-  Element.prototype = Object.create(Node.prototype);
-  mixin(Element.prototype, {
-    createShadowRoot: function() {
-      var newShadowRoot = new wrappers.ShadowRoot(this);
-      this.impl.polymerShadowRoot_ = newShadowRoot;
-
-      var renderer = scope.getRendererForHost(this);
-      renderer.invalidate();
-
-      return newShadowRoot;
-    },
-
-    get shadowRoot() {
-      return this.impl.polymerShadowRoot_ || null;
-    },
-
-    setAttribute: function(name, value) {
-      var oldValue = this.impl.getAttribute(name);
-      this.impl.setAttribute(name, value);
-      enqueAttributeChange(this, name, oldValue);
-      invalidateRendererBasedOnAttribute(this, name);
-    },
-
-    removeAttribute: function(name) {
-      var oldValue = this.impl.getAttribute(name);
-      this.impl.removeAttribute(name);
-      enqueAttributeChange(this, name, oldValue);
-      invalidateRendererBasedOnAttribute(this, name);
-    },
-
-    matches: function(selector) {
-      return originalMatches.call(this.impl, selector);
-    }
-  });
-
-  matchesNames.forEach(function(name) {
-    if (name !== 'matches') {
-      Element.prototype[name] = function(selector) {
-        return this.matches(selector);
-      };
-    }
-  });
-
-  if (OriginalElement.prototype.webkitCreateShadowRoot) {
-    Element.prototype.webkitCreateShadowRoot =
-        Element.prototype.createShadowRoot;
-  }
-
-  /**
-   * Useful for generating the accessor pair for a property that reflects an
-   * attribute.
-   */
-  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {
-    var attrName = opt_attrName || propertyName;
-    Object.defineProperty(prototype, propertyName, {
-      get: function() {
-        return this.impl[propertyName];
-      },
-      set: function(v) {
-        this.impl[propertyName] = v;
-        invalidateRendererBasedOnAttribute(this, attrName);
-      },
-      configurable: true,
-      enumerable: true
-    });
-  }
-
-  setterDirtiesAttribute(Element.prototype, 'id');
-  setterDirtiesAttribute(Element.prototype, 'className', 'class');
-
-  mixin(Element.prototype, ChildNodeInterface);
-  mixin(Element.prototype, GetElementsByInterface);
-  mixin(Element.prototype, ParentNodeInterface);
-  mixin(Element.prototype, SelectorsInterface);
-
-  registerWrapper(OriginalElement, Element,
-                  document.createElementNS(null, 'x'));
-
-  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings
-  // that reflect attributes.
-  scope.matchesNames = matchesNames;
-  scope.wrappers.Element = Element;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var Element = scope.wrappers.Element;
-  var defineGetter = scope.defineGetter;
-  var enqueueMutation = scope.enqueueMutation;
-  var mixin = scope.mixin;
-  var nodesWereAdded = scope.nodesWereAdded;
-  var nodesWereRemoved = scope.nodesWereRemoved;
-  var registerWrapper = scope.registerWrapper;
-  var snapshotNodeList = scope.snapshotNodeList;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var wrappers = scope.wrappers;
-
-  /////////////////////////////////////////////////////////////////////////////
-  // innerHTML and outerHTML
-
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString
-  var escapeAttrRegExp = /[&\u00A0"]/g;
-  var escapeDataRegExp = /[&\u00A0<>]/g;
-
-  function escapeReplace(c) {
-    switch (c) {
-      case '&':
-        return '&amp;';
-      case '<':
-        return '&lt;';
-      case '>':
-        return '&gt;';
-      case '"':
-        return '&quot;'
-      case '\u00A0':
-        return '&nbsp;';
-    }
-  }
-
-  function escapeAttr(s) {
-    return s.replace(escapeAttrRegExp, escapeReplace);
-  }
-
-  function escapeData(s) {
-    return s.replace(escapeDataRegExp, escapeReplace);
-  }
-
-  function makeSet(arr) {
-    var set = {};
-    for (var i = 0; i < arr.length; i++) {
-      set[arr[i]] = true;
-    }
-    return set;
-  }
-
-  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements
-  var voidElements = makeSet([
-    'area',
-    'base',
-    'br',
-    'col',
-    'command',
-    'embed',
-    'hr',
-    'img',
-    'input',
-    'keygen',
-    'link',
-    'meta',
-    'param',
-    'source',
-    'track',
-    'wbr'
-  ]);
-
-  var plaintextParents = makeSet([
-    'style',
-    'script',
-    'xmp',
-    'iframe',
-    'noembed',
-    'noframes',
-    'plaintext',
-    'noscript'
-  ]);
-
-  function getOuterHTML(node, parentNode) {
-    switch (node.nodeType) {
-      case Node.ELEMENT_NODE:
-        var tagName = node.tagName.toLowerCase();
-        var s = '<' + tagName;
-        var attrs = node.attributes;
-        for (var i = 0, attr; attr = attrs[i]; i++) {
-          s += ' ' + attr.name + '="' + escapeAttr(attr.value) + '"';
-        }
-        s += '>';
-        if (voidElements[tagName])
-          return s;
-
-        return s + getInnerHTML(node) + '</' + tagName + '>';
-
-      case Node.TEXT_NODE:
-        var data = node.data;
-        if (parentNode && plaintextParents[parentNode.localName])
-          return data;
-        return escapeData(data);
-
-      case Node.COMMENT_NODE:
-        return '<!--' + node.data + '-->';
-
-      default:
-        console.error(node);
-        throw new Error('not implemented');
-    }
-  }
-
-  function getInnerHTML(node) {
-    if (node instanceof wrappers.HTMLTemplateElement)
-      node = node.content;
-
-    var s = '';
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      s += getOuterHTML(child, node);
-    }
-    return s;
-  }
-
-  function setInnerHTML(node, value, opt_tagName) {
-    var tagName = opt_tagName || 'div';
-    node.textContent = '';
-    var tempElement = unwrap(node.ownerDocument.createElement(tagName));
-    tempElement.innerHTML = value;
-    var firstChild;
-    while (firstChild = tempElement.firstChild) {
-      node.appendChild(wrap(firstChild));
-    }
-  }
-
-  // IE11 does not have MSIE in the user agent string.
-  var oldIe = /MSIE/.test(navigator.userAgent);
-
-  var OriginalHTMLElement = window.HTMLElement;
-  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
-
-  function HTMLElement(node) {
-    Element.call(this, node);
-  }
-  HTMLElement.prototype = Object.create(Element.prototype);
-  mixin(HTMLElement.prototype, {
-    get innerHTML() {
-      return getInnerHTML(this);
-    },
-    set innerHTML(value) {
-      // IE9 does not handle set innerHTML correctly on plaintextParents. It
-      // creates element children. For example
-      //
-      //   scriptElement.innerHTML = '<a>test</a>'
-      //
-      // Creates a single HTMLAnchorElement child.
-      if (oldIe && plaintextParents[this.localName]) {
-        this.textContent = value;
-        return;
-      }
-
-      var removedNodes = snapshotNodeList(this.childNodes);
-
-      if (this.invalidateShadowRenderer()) {
-        if (this instanceof wrappers.HTMLTemplateElement)
-          setInnerHTML(this.content, value);
-        else
-          setInnerHTML(this, value, this.tagName);
-
-      // If we have a non native template element we need to handle this
-      // manually since setting impl.innerHTML would add the html as direct
-      // children and not be moved over to the content fragment.
-      } else if (!OriginalHTMLTemplateElement &&
-                 this instanceof wrappers.HTMLTemplateElement) {
-        setInnerHTML(this.content, value);
-      } else {
-        this.impl.innerHTML = value;
-      }
-
-      var addedNodes = snapshotNodeList(this.childNodes);
-
-      enqueueMutation(this, 'childList', {
-        addedNodes: addedNodes,
-        removedNodes: removedNodes
-      });
-
-      nodesWereRemoved(removedNodes);
-      nodesWereAdded(addedNodes, this);
-    },
-
-    get outerHTML() {
-      return getOuterHTML(this, this.parentNode);
-    },
-    set outerHTML(value) {
-      var p = this.parentNode;
-      if (p) {
-        p.invalidateShadowRenderer();
-        var df = frag(p, value);
-        p.replaceChild(df, this);
-      }
-    },
-
-    insertAdjacentHTML: function(position, text) {
-      var contextElement, refNode;
-      switch (String(position).toLowerCase()) {
-        case 'beforebegin':
-          contextElement = this.parentNode;
-          refNode = this;
-          break;
-        case 'afterend':
-          contextElement = this.parentNode;
-          refNode = this.nextSibling;
-          break;
-        case 'afterbegin':
-          contextElement = this;
-          refNode = this.firstChild;
-          break;
-        case 'beforeend':
-          contextElement = this;
-          refNode = null;
-          break;
-        default:
-          return;
-      }
-
-      var df = frag(contextElement, text);
-      contextElement.insertBefore(df, refNode);
-    }
-  });
-
-  function frag(contextElement, html) {
-    // TODO(arv): This does not work with SVG and other non HTML elements.
-    var p = unwrap(contextElement.cloneNode(false));
-    p.innerHTML = html;
-    var df = unwrap(document.createDocumentFragment());
-    var c;
-    while (c = p.firstChild) {
-      df.appendChild(c);
-    }
-    return wrap(df);
-  }
-
-  function getter(name) {
-    return function() {
-      scope.renderAllPending();
-      return this.impl[name];
-    };
-  }
-
-  function getterRequiresRendering(name) {
-    defineGetter(HTMLElement, name, getter(name));
-  }
-
-  [
-    'clientHeight',
-    'clientLeft',
-    'clientTop',
-    'clientWidth',
-    'offsetHeight',
-    'offsetLeft',
-    'offsetTop',
-    'offsetWidth',
-    'scrollHeight',
-    'scrollWidth',
-  ].forEach(getterRequiresRendering);
-
-  function getterAndSetterRequiresRendering(name) {
-    Object.defineProperty(HTMLElement.prototype, name, {
-      get: getter(name),
-      set: function(v) {
-        scope.renderAllPending();
-        this.impl[name] = v;
-      },
-      configurable: true,
-      enumerable: true
-    });
-  }
-
-  [
-    'scrollLeft',
-    'scrollTop',
-  ].forEach(getterAndSetterRequiresRendering);
-
-  function methodRequiresRendering(name) {
-    Object.defineProperty(HTMLElement.prototype, name, {
-      value: function() {
-        scope.renderAllPending();
-        return this.impl[name].apply(this.impl, arguments);
-      },
-      configurable: true,
-      enumerable: true
-    });
-  }
-
-  [
-    'getBoundingClientRect',
-    'getClientRects',
-    'scrollIntoView'
-  ].forEach(methodRequiresRendering);
-
-  // HTMLElement is abstract so we use a subclass that has no members.
-  registerWrapper(OriginalHTMLElement, HTMLElement,
-                  document.createElement('b'));
-
-  scope.wrappers.HTMLElement = HTMLElement;
-
-  // TODO: Find a better way to share these two with WrapperShadowRoot.
-  scope.getInnerHTML = getInnerHTML;
-  scope.setInnerHTML = setInnerHTML
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var wrap = scope.wrap;
-
-  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;
-
-  function HTMLCanvasElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);
-
-  mixin(HTMLCanvasElement.prototype, {
-    getContext: function() {
-      var context = this.impl.getContext.apply(this.impl, arguments);
-      return context && wrap(context);
-    }
-  });
-
-  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,
-                  document.createElement('canvas'));
-
-  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-
-  var OriginalHTMLContentElement = window.HTMLContentElement;
-
-  function HTMLContentElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLContentElement.prototype, {
-    get select() {
-      return this.getAttribute('select');
-    },
-    set select(value) {
-      this.setAttribute('select', value);
-    },
-
-    setAttribute: function(n, v) {
-      HTMLElement.prototype.setAttribute.call(this, n, v);
-      if (String(n).toLowerCase() === 'select')
-        this.invalidateShadowRenderer(true);
-    }
-
-    // getDistributedNodes is added in ShadowRenderer
-
-    // TODO: attribute boolean resetStyleInheritance;
-  });
-
-  if (OriginalHTMLContentElement)
-    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);
-
-  scope.wrappers.HTMLContentElement = HTMLContentElement;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var rewrap = scope.rewrap;
-
-  var OriginalHTMLImageElement = window.HTMLImageElement;
-
-  function HTMLImageElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);
-
-  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,
-                  document.createElement('img'));
-
-  function Image(width, height) {
-    if (!(this instanceof Image)) {
-      throw new TypeError(
-          'DOM object constructor cannot be called as a function.');
-    }
-
-    var node = unwrap(document.createElement('img'));
-    HTMLElement.call(this, node);
-    rewrap(node, this);
-
-    if (width !== undefined)
-      node.width = width;
-    if (height !== undefined)
-      node.height = height;
-  }
-
-  Image.prototype = HTMLImageElement.prototype;
-
-  scope.wrappers.HTMLImageElement = HTMLImageElement;
-  scope.wrappers.Image = Image;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-
-  var OriginalHTMLShadowElement = window.HTMLShadowElement;
-
-  function HTMLShadowElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLShadowElement.prototype, {
-    // TODO: attribute boolean resetStyleInheritance;
-  });
-
-  if (OriginalHTMLShadowElement)
-    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);
-
-  scope.wrappers.HTMLShadowElement = HTMLShadowElement;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var contentTable = new WeakMap();
-  var templateContentsOwnerTable = new WeakMap();
-
-  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner
-  function getTemplateContentsOwner(doc) {
-    if (!doc.defaultView)
-      return doc;
-    var d = templateContentsOwnerTable.get(doc);
-    if (!d) {
-      // TODO(arv): This should either be a Document or HTMLDocument depending
-      // on doc.
-      d = doc.implementation.createHTMLDocument('');
-      while (d.lastChild) {
-        d.removeChild(d.lastChild);
-      }
-      templateContentsOwnerTable.set(doc, d);
-    }
-    return d;
-  }
-
-  function extractContent(templateElement) {
-    // templateElement is not a wrapper here.
-    var doc = getTemplateContentsOwner(templateElement.ownerDocument);
-    var df = unwrap(doc.createDocumentFragment());
-    var child;
-    while (child = templateElement.firstChild) {
-      df.appendChild(child);
-    }
-    return df;
-  }
-
-  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
-
-  function HTMLTemplateElement(node) {
-    HTMLElement.call(this, node);
-    if (!OriginalHTMLTemplateElement) {
-      var content = extractContent(node);
-      contentTable.set(this, wrap(content));
-    }
-  }
-  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);
-
-  mixin(HTMLTemplateElement.prototype, {
-    get content() {
-      if (OriginalHTMLTemplateElement)
-        return wrap(this.impl.content);
-      return contentTable.get(this);
-    },
-
-    // TODO(arv): cloneNode needs to clone content.
-
-  });
-
-  if (OriginalHTMLTemplateElement)
-    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);
-
-  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var registerWrapper = scope.registerWrapper;
-
-  var OriginalHTMLMediaElement = window.HTMLMediaElement;
-
-  function HTMLMediaElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);
-
-  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,
-                  document.createElement('audio'));
-
-  scope.wrappers.HTMLMediaElement = HTMLMediaElement;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var rewrap = scope.rewrap;
-
-  var OriginalHTMLAudioElement = window.HTMLAudioElement;
-
-  function HTMLAudioElement(node) {
-    HTMLMediaElement.call(this, node);
-  }
-  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);
-
-  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,
-                  document.createElement('audio'));
-
-  function Audio(src) {
-    if (!(this instanceof Audio)) {
-      throw new TypeError(
-          'DOM object constructor cannot be called as a function.');
-    }
-
-    var node = unwrap(document.createElement('audio'));
-    HTMLMediaElement.call(this, node);
-    rewrap(node, this);
-
-    node.setAttribute('preload', 'auto');
-    if (src !== undefined)
-      node.setAttribute('src', src);
-  }
-
-  Audio.prototype = HTMLAudioElement.prototype;
-
-  scope.wrappers.HTMLAudioElement = HTMLAudioElement;
-  scope.wrappers.Audio = Audio;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var rewrap = scope.rewrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var OriginalHTMLOptionElement = window.HTMLOptionElement;
-
-  function trimText(s) {
-    return s.replace(/\s+/g, ' ').trim();
-  }
-
-  function HTMLOptionElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLOptionElement.prototype, {
-    get text() {
-      return trimText(this.textContent);
-    },
-    set text(value) {
-      this.textContent = trimText(String(value));
-    },
-    get form() {
-      return wrap(unwrap(this).form);
-    }
-  });
-
-  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,
-                  document.createElement('option'));
-
-  function Option(text, value, defaultSelected, selected) {
-    if (!(this instanceof Option)) {
-      throw new TypeError(
-          'DOM object constructor cannot be called as a function.');
-    }
-
-    var node = unwrap(document.createElement('option'));
-    HTMLElement.call(this, node);
-    rewrap(node, this);
-
-    if (text !== undefined)
-      node.text = text;
-    if (value !== undefined)
-      node.setAttribute('value', value);
-    if (defaultSelected === true)
-      node.setAttribute('selected', '');
-    node.selected = selected === true;
-  }
-
-  Option.prototype = HTMLOptionElement.prototype;
-
-  scope.wrappers.HTMLOptionElement = HTMLOptionElement;
-  scope.wrappers.Option = Option;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2014 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var OriginalHTMLSelectElement = window.HTMLSelectElement;
-
-  function HTMLSelectElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLSelectElement.prototype, {
-    add: function(element, before) {
-      if (typeof before === 'object')  // also includes null
-        before = unwrap(before);
-      unwrap(this).add(unwrap(element), before);
-    },
-
-    remove: function(indexOrNode) {
-      // Spec only allows index but implementations allow index or node.
-      // remove() is also allowed which is same as remove(undefined)
-      if (indexOrNode === undefined) {
-        HTMLElement.prototype.remove.call(this);
-        return;
-      }
-
-      if (typeof indexOrNode === 'object')
-        indexOrNode = unwrap(indexOrNode);
-
-      unwrap(this).remove(indexOrNode);
-    },
-
-    get form() {
-      return wrap(unwrap(this).form);
-    }
-  });
-
-  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,
-                  document.createElement('select'));
-
-  scope.wrappers.HTMLSelectElement = HTMLSelectElement;
-})(window.ShadowDOMPolyfill);
-
-/*
- * Copyright 2014 The Polymer Authors. All rights reserved.
- * Use of this source code is goverened by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var wrapHTMLCollection = scope.wrapHTMLCollection;
-
-  var OriginalHTMLTableElement = window.HTMLTableElement;
-
-  function HTMLTableElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLTableElement.prototype, {
-    get caption() {
-      return wrap(unwrap(this).caption);
-    },
-    createCaption: function() {
-      return wrap(unwrap(this).createCaption());
-    },
-
-    get tHead() {
-      return wrap(unwrap(this).tHead);
-    },
-    createTHead: function() {
-      return wrap(unwrap(this).createTHead());
-    },
-
-    createTFoot: function() {
-      return wrap(unwrap(this).createTFoot());
-    },
-    get tFoot() {
-      return wrap(unwrap(this).tFoot);
-    },
-
-    get tBodies() {
-      return wrapHTMLCollection(unwrap(this).tBodies);
-    },
-    createTBody: function() {
-      return wrap(unwrap(this).createTBody());
-    },
-
-    get rows() {
-      return wrapHTMLCollection(unwrap(this).rows);
-    },
-    insertRow: function(index) {
-      return wrap(unwrap(this).insertRow(index));
-    }
-  });
-
-  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,
-                  document.createElement('table'));
-
-  scope.wrappers.HTMLTableElement = HTMLTableElement;
-})(window.ShadowDOMPolyfill);
-
-/*
- * Copyright 2014 The Polymer Authors. All rights reserved.
- * Use of this source code is goverened by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var wrapHTMLCollection = scope.wrapHTMLCollection;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;
-
-  function HTMLTableSectionElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLTableSectionElement.prototype, {
-    get rows() {
-      return wrapHTMLCollection(unwrap(this).rows);
-    },
-    insertRow: function(index) {
-      return wrap(unwrap(this).insertRow(index));
-    }
-  });
-
-  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,
-                  document.createElement('thead'));
-
-  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;
-})(window.ShadowDOMPolyfill);
-
-/*
- * Copyright 2014 The Polymer Authors. All rights reserved.
- * Use of this source code is goverened by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var wrapHTMLCollection = scope.wrapHTMLCollection;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;
-
-  function HTMLTableRowElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLTableRowElement.prototype, {
-    get cells() {
-      return wrapHTMLCollection(unwrap(this).cells);
-    },
-
-    insertCell: function(index) {
-      return wrap(unwrap(this).insertCell(index));
-    }
-  });
-
-  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,
-                  document.createElement('tr'));
-
-  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLContentElement = scope.wrappers.HTMLContentElement;
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
-  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-
-  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;
-
-  function HTMLUnknownElement(node) {
-    switch (node.localName) {
-      case 'content':
-        return new HTMLContentElement(node);
-      case 'shadow':
-        return new HTMLShadowElement(node);
-      case 'template':
-        return new HTMLTemplateElement(node);
-    }
-    HTMLElement.call(this, node);
-  }
-  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);
-  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);
-  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2014 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var registerObject = scope.registerObject;
-
-  var SVG_NS = 'http://www.w3.org/2000/svg';
-  var svgTitleElement = document.createElementNS(SVG_NS, 'title');
-  var SVGTitleElement = registerObject(svgTitleElement);
-  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;
-
-  scope.wrappers.SVGElement = SVGElement;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2014 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var OriginalSVGUseElement = window.SVGUseElement;
-
-  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses
-  // SVGGraphicsElement. Use the <g> element to get the right prototype.
-
-  var SVG_NS = 'http://www.w3.org/2000/svg';
-  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));
-  var useElement = document.createElementNS(SVG_NS, 'use');
-  var SVGGElement = gWrapper.constructor;
-  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);
-  var parentInterface = parentInterfacePrototype.constructor;
-
-  function SVGUseElement(impl) {
-    parentInterface.call(this, impl);
-  }
-
-  SVGUseElement.prototype = Object.create(parentInterfacePrototype);
-
-  // Firefox does not expose instanceRoot.
-  if ('instanceRoot' in useElement) {
-    mixin(SVGUseElement.prototype, {
-      get instanceRoot() {
-        return wrap(unwrap(this).instanceRoot);
-      },
-      get animatedInstanceRoot() {
-        return wrap(unwrap(this).animatedInstanceRoot);
-      },
-    });
-  }
-
-  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);
-
-  scope.wrappers.SVGUseElement = SVGUseElement;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2014 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var EventTarget = scope.wrappers.EventTarget;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var wrap = scope.wrap;
-
-  var OriginalSVGElementInstance = window.SVGElementInstance;
-  if (!OriginalSVGElementInstance)
-    return;
-
-  function SVGElementInstance(impl) {
-    EventTarget.call(this, impl);
-  }
-
-  SVGElementInstance.prototype = Object.create(EventTarget.prototype);
-  mixin(SVGElementInstance.prototype, {
-    /** @type {SVGElement} */
-    get correspondingElement() {
-      return wrap(this.impl.correspondingElement);
-    },
-
-    /** @type {SVGUseElement} */
-    get correspondingUseElement() {
-      return wrap(this.impl.correspondingUseElement);
-    },
-
-    /** @type {SVGElementInstance} */
-    get parentNode() {
-      return wrap(this.impl.parentNode);
-    },
-
-    /** @type {SVGElementInstanceList} */
-    get childNodes() {
-      throw new Error('Not implemented');
-    },
-
-    /** @type {SVGElementInstance} */
-    get firstChild() {
-      return wrap(this.impl.firstChild);
-    },
-
-    /** @type {SVGElementInstance} */
-    get lastChild() {
-      return wrap(this.impl.lastChild);
-    },
-
-    /** @type {SVGElementInstance} */
-    get previousSibling() {
-      return wrap(this.impl.previousSibling);
-    },
-
-    /** @type {SVGElementInstance} */
-    get nextSibling() {
-      return wrap(this.impl.nextSibling);
-    }
-  });
-
-  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);
-
-  scope.wrappers.SVGElementInstance = SVGElementInstance;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
-
-  function CanvasRenderingContext2D(impl) {
-    this.impl = impl;
-  }
-
-  mixin(CanvasRenderingContext2D.prototype, {
-    get canvas() {
-      return wrap(this.impl.canvas);
-    },
-
-    drawImage: function() {
-      arguments[0] = unwrapIfNeeded(arguments[0]);
-      this.impl.drawImage.apply(this.impl, arguments);
-    },
-
-    createPattern: function() {
-      arguments[0] = unwrap(arguments[0]);
-      return this.impl.createPattern.apply(this.impl, arguments);
-    }
-  });
-
-  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,
-                  document.createElement('canvas').getContext('2d'));
-
-  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
-
-  // IE10 does not have WebGL.
-  if (!OriginalWebGLRenderingContext)
-    return;
-
-  function WebGLRenderingContext(impl) {
-    this.impl = impl;
-  }
-
-  mixin(WebGLRenderingContext.prototype, {
-    get canvas() {
-      return wrap(this.impl.canvas);
-    },
-
-    texImage2D: function() {
-      arguments[5] = unwrapIfNeeded(arguments[5]);
-      this.impl.texImage2D.apply(this.impl, arguments);
-    },
-
-    texSubImage2D: function() {
-      arguments[6] = unwrapIfNeeded(arguments[6]);
-      this.impl.texSubImage2D.apply(this.impl, arguments);
-    }
-  });
-
-  // Blink/WebKit has broken DOM bindings. Usually we would create an instance
-  // of the object and pass it into registerWrapper as a "blueprint" but
-  // creating WebGL contexts is expensive and might fail so we use a dummy
-  // object with dummy instance properties for these broken browsers.
-  var instanceProperties = /WebKit/.test(navigator.userAgent) ?
-      {drawingBufferHeight: null, drawingBufferWidth: null} : {};
-
-  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,
-      instanceProperties);
-
-  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalRange = window.Range;
-
-  function Range(impl) {
-    this.impl = impl;
-  }
-  Range.prototype = {
-    get startContainer() {
-      return wrap(this.impl.startContainer);
-    },
-    get endContainer() {
-      return wrap(this.impl.endContainer);
-    },
-    get commonAncestorContainer() {
-      return wrap(this.impl.commonAncestorContainer);
-    },
-    setStart: function(refNode,offset) {
-      this.impl.setStart(unwrapIfNeeded(refNode), offset);
-    },
-    setEnd: function(refNode,offset) {
-      this.impl.setEnd(unwrapIfNeeded(refNode), offset);
-    },
-    setStartBefore: function(refNode) {
-      this.impl.setStartBefore(unwrapIfNeeded(refNode));
-    },
-    setStartAfter: function(refNode) {
-      this.impl.setStartAfter(unwrapIfNeeded(refNode));
-    },
-    setEndBefore: function(refNode) {
-      this.impl.setEndBefore(unwrapIfNeeded(refNode));
-    },
-    setEndAfter: function(refNode) {
-      this.impl.setEndAfter(unwrapIfNeeded(refNode));
-    },
-    selectNode: function(refNode) {
-      this.impl.selectNode(unwrapIfNeeded(refNode));
-    },
-    selectNodeContents: function(refNode) {
-      this.impl.selectNodeContents(unwrapIfNeeded(refNode));
-    },
-    compareBoundaryPoints: function(how, sourceRange) {
-      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));
-    },
-    extractContents: function() {
-      return wrap(this.impl.extractContents());
-    },
-    cloneContents: function() {
-      return wrap(this.impl.cloneContents());
-    },
-    insertNode: function(node) {
-      this.impl.insertNode(unwrapIfNeeded(node));
-    },
-    surroundContents: function(newParent) {
-      this.impl.surroundContents(unwrapIfNeeded(newParent));
-    },
-    cloneRange: function() {
-      return wrap(this.impl.cloneRange());
-    },
-    isPointInRange: function(node, offset) {
-      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);
-    },
-    comparePoint: function(node, offset) {
-      return this.impl.comparePoint(unwrapIfNeeded(node), offset);
-    },
-    intersectsNode: function(node) {
-      return this.impl.intersectsNode(unwrapIfNeeded(node));
-    },
-    toString: function() {
-      return this.impl.toString();
-    }
-  };
-
-  // IE9 does not have createContextualFragment.
-  if (OriginalRange.prototype.createContextualFragment) {
-    Range.prototype.createContextualFragment = function(html) {
-      return wrap(this.impl.createContextualFragment(html));
-    };
-  }
-
-  registerWrapper(window.Range, Range, document.createRange());
-
-  scope.wrappers.Range = Range;
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var GetElementsByInterface = scope.GetElementsByInterface;
-  var ParentNodeInterface = scope.ParentNodeInterface;
-  var SelectorsInterface = scope.SelectorsInterface;
-  var mixin = scope.mixin;
-  var registerObject = scope.registerObject;
-
-  var DocumentFragment = registerObject(document.createDocumentFragment());
-  mixin(DocumentFragment.prototype, ParentNodeInterface);
-  mixin(DocumentFragment.prototype, SelectorsInterface);
-  mixin(DocumentFragment.prototype, GetElementsByInterface);
-
-  var Comment = registerObject(document.createComment(''));
-
-  scope.wrappers.Comment = Comment;
-  scope.wrappers.DocumentFragment = DocumentFragment;
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var DocumentFragment = scope.wrappers.DocumentFragment;
-  var TreeScope = scope.TreeScope;
-  var elementFromPoint = scope.elementFromPoint;
-  var getInnerHTML = scope.getInnerHTML;
-  var getTreeScope = scope.getTreeScope;
-  var mixin = scope.mixin;
-  var rewrap = scope.rewrap;
-  var setInnerHTML = scope.setInnerHTML;
-  var unwrap = scope.unwrap;
-
-  var shadowHostTable = new WeakMap();
-  var nextOlderShadowTreeTable = new WeakMap();
-
-  var spaceCharRe = /[ \t\n\r\f]/;
-
-  function ShadowRoot(hostWrapper) {
-    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());
-    DocumentFragment.call(this, node);
-
-    // createDocumentFragment associates the node with a wrapper
-    // DocumentFragment instance. Override that.
-    rewrap(node, this);
-
-    this.treeScope_ = new TreeScope(this, getTreeScope(hostWrapper));
-
-    var oldShadowRoot = hostWrapper.shadowRoot;
-    nextOlderShadowTreeTable.set(this, oldShadowRoot);
-
-    shadowHostTable.set(this, hostWrapper);
-  }
-  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);
-  mixin(ShadowRoot.prototype, {
-    get innerHTML() {
-      return getInnerHTML(this);
-    },
-    set innerHTML(value) {
-      setInnerHTML(this, value);
-      this.invalidateShadowRenderer();
-    },
-
-    get olderShadowRoot() {
-      return nextOlderShadowTreeTable.get(this) || null;
-    },
-
-    get host() {
-      return shadowHostTable.get(this) || null;
-    },
-
-    invalidateShadowRenderer: function() {
-      return shadowHostTable.get(this).invalidateShadowRenderer();
-    },
-
-    elementFromPoint: function(x, y) {
-      return elementFromPoint(this, this.ownerDocument, x, y);
-    },
-
-    getElementById: function(id) {
-      if (spaceCharRe.test(id))
-        return null;
-      return this.querySelector('[id="' + id + '"]');
-    }
-  });
-
-  scope.wrappers.ShadowRoot = ShadowRoot;
-
-})(window.ShadowDOMPolyfill);
-
-// 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.
-
-(function(scope) {
-  'use strict';
-
-  var Element = scope.wrappers.Element;
-  var HTMLContentElement = scope.wrappers.HTMLContentElement;
-  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
-  var Node = scope.wrappers.Node;
-  var ShadowRoot = scope.wrappers.ShadowRoot;
-  var assert = scope.assert;
-  var getTreeScope = scope.getTreeScope;
-  var mixin = scope.mixin;
-  var oneOf = scope.oneOf;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  /**
-   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.
-   * Up means parentNode
-   * Sideways means previous and next sibling.
-   * @param {!Node} wrapper
-   */
-  function updateWrapperUpAndSideways(wrapper) {
-    wrapper.previousSibling_ = wrapper.previousSibling;
-    wrapper.nextSibling_ = wrapper.nextSibling;
-    wrapper.parentNode_ = wrapper.parentNode;
-  }
-
-  /**
-   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.
-   * Down means first and last child
-   * @param {!Node} wrapper
-   */
-  function updateWrapperDown(wrapper) {
-    wrapper.firstChild_ = wrapper.firstChild;
-    wrapper.lastChild_ = wrapper.lastChild;
-  }
-
-  function updateAllChildNodes(parentNodeWrapper) {
-    assert(parentNodeWrapper instanceof Node);
-    for (var childWrapper = parentNodeWrapper.firstChild;
-         childWrapper;
-         childWrapper = childWrapper.nextSibling) {
-      updateWrapperUpAndSideways(childWrapper);
-    }
-    updateWrapperDown(parentNodeWrapper);
-  }
-
-  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {
-    var parentNode = unwrap(parentNodeWrapper);
-    var newChild = unwrap(newChildWrapper);
-    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;
-
-    remove(newChildWrapper);
-    updateWrapperUpAndSideways(newChildWrapper);
-
-    if (!refChildWrapper) {
-      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;
-      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)
-        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;
-
-      var lastChildWrapper = wrap(parentNode.lastChild);
-      if (lastChildWrapper)
-        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;
-    } else {
-      if (parentNodeWrapper.firstChild === refChildWrapper)
-        parentNodeWrapper.firstChild_ = refChildWrapper;
-
-      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;
-    }
-
-    parentNode.insertBefore(newChild, refChild);
-  }
-
-  function remove(nodeWrapper) {
-    var node = unwrap(nodeWrapper)
-    var parentNode = node.parentNode;
-    if (!parentNode)
-      return;
-
-    var parentNodeWrapper = wrap(parentNode);
-    updateWrapperUpAndSideways(nodeWrapper);
-
-    if (nodeWrapper.previousSibling)
-      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;
-    if (nodeWrapper.nextSibling)
-      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;
-
-    if (parentNodeWrapper.lastChild === nodeWrapper)
-      parentNodeWrapper.lastChild_ = nodeWrapper;
-    if (parentNodeWrapper.firstChild === nodeWrapper)
-      parentNodeWrapper.firstChild_ = nodeWrapper;
-
-    parentNode.removeChild(node);
-  }
-
-  var distributedChildNodesTable = new WeakMap();
-  var eventParentsTable = new WeakMap();
-  var insertionParentTable = new WeakMap();
-  var rendererForHostTable = new WeakMap();
-
-  function distributeChildToInsertionPoint(child, insertionPoint) {
-    getDistributedChildNodes(insertionPoint).push(child);
-    assignToInsertionPoint(child, insertionPoint);
-
-    var eventParents = eventParentsTable.get(child);
-    if (!eventParents)
-      eventParentsTable.set(child, eventParents = []);
-    eventParents.push(insertionPoint);
-  }
-
-  function resetDistributedChildNodes(insertionPoint) {
-    distributedChildNodesTable.set(insertionPoint, []);
-  }
-
-  function getDistributedChildNodes(insertionPoint) {
-    var rv = distributedChildNodesTable.get(insertionPoint);
-    if (!rv)
-      distributedChildNodesTable.set(insertionPoint, rv = []);
-    return rv;
-  }
-
-  function getChildNodesSnapshot(node) {
-    var result = [], i = 0;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      result[i++] = child;
-    }
-    return result;
-  }
-
-  /**
-   * Visits all nodes in the tree that fulfils the |predicate|. If the |visitor|
-   * function returns |false| the traversal is aborted.
-   * @param {!Node} tree
-   * @param {function(!Node) : boolean} predicate
-   * @param {function(!Node) : *} visitor
-   */
-  function visit(tree, predicate, visitor) {
-    // This operates on logical DOM.
-    for (var node = tree.firstChild; node; node = node.nextSibling) {
-      if (predicate(node)) {
-        if (visitor(node) === false)
-          return;
-      } else {
-        visit(node, predicate, visitor);
-      }
-    }
-  }
-
-  // Matching Insertion Points
-  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#matching-insertion-points
-
-  // TODO(arv): Verify this... I don't remember why I picked this regexp.
-  var selectorMatchRegExp = /^[*.:#[a-zA-Z_|]/;
-
-  var allowedPseudoRegExp = new RegExp('^:(' + [
-    'link',
-    'visited',
-    'target',
-    'enabled',
-    'disabled',
-    'checked',
-    'indeterminate',
-    'nth-child',
-    'nth-last-child',
-    'nth-of-type',
-    'nth-last-of-type',
-    'first-child',
-    'last-child',
-    'first-of-type',
-    'last-of-type',
-    'only-of-type',
-  ].join('|') + ')');
-
-
-  /**
-   * @param {Element} node
-   * @oaram {Element} point The insertion point element.
-   * @return {boolean} Whether the node matches the insertion point.
-   */
-  function matchesCriteria(node, point) {
-    var select = point.getAttribute('select');
-    if (!select)
-      return true;
-
-    // Here we know the select attribute is a non empty string.
-    select = select.trim();
-    if (!select)
-      return true;
-
-    if (!(node instanceof Element))
-      return false;
-
-    // The native matches function in IE9 does not correctly work with elements
-    // that are not in the document.
-    // TODO(arv): Implement matching in JS.
-    // https://github.com/Polymer/ShadowDOM/issues/361
-    if (select === '*' || select === node.localName)
-      return true;
-
-    // TODO(arv): This does not seem right. Need to check for a simple selector.
-    if (!selectorMatchRegExp.test(select))
-      return false;
-
-    // TODO(arv): This no longer matches the spec.
-    if (select[0] === ':' && !allowedPseudoRegExp.test(select))
-      return false;
-
-    try {
-      return node.matches(select);
-    } catch (ex) {
-      // Invalid selector.
-      return false;
-    }
-  }
-
-  var request = oneOf(window, [
-    'requestAnimationFrame',
-    'mozRequestAnimationFrame',
-    'webkitRequestAnimationFrame',
-    'setTimeout'
-  ]);
-
-  var pendingDirtyRenderers = [];
-  var renderTimer;
-
-  function renderAllPending() {
-    // TODO(arv): Order these in document order. That way we do not have to
-    // render something twice.
-    for (var i = 0; i < pendingDirtyRenderers.length; i++) {
-      var renderer = pendingDirtyRenderers[i];
-      var parentRenderer = renderer.parentRenderer;
-      if (parentRenderer && parentRenderer.dirty)
-        continue;
-      renderer.render();
-    }
-
-    pendingDirtyRenderers = [];
-  }
-
-  function handleRequestAnimationFrame() {
-    renderTimer = null;
-    renderAllPending();
-  }
-
-  /**
-   * Returns existing shadow renderer for a host or creates it if it is needed.
-   * @params {!Element} host
-   * @return {!ShadowRenderer}
-   */
-  function getRendererForHost(host) {
-    var renderer = rendererForHostTable.get(host);
-    if (!renderer) {
-      renderer = new ShadowRenderer(host);
-      rendererForHostTable.set(host, renderer);
-    }
-    return renderer;
-  }
-
-  function getShadowRootAncestor(node) {
-    var root = getTreeScope(node).root;
-    if (root instanceof ShadowRoot)
-      return root;
-    return null;
-  }
-
-  function getRendererForShadowRoot(shadowRoot) {
-    return getRendererForHost(shadowRoot.host);
-  }
-
-  var spliceDiff = new ArraySplice();
-  spliceDiff.equals = function(renderNode, rawNode) {
-    return unwrap(renderNode.node) === rawNode;
-  };
-
-  /**
-   * RenderNode is used as an in memory "render tree". When we render the
-   * composed tree we create a tree of RenderNodes, then we diff this against
-   * the real DOM tree and make minimal changes as needed.
-   */
-  function RenderNode(node) {
-    this.skip = false;
-    this.node = node;
-    this.childNodes = [];
-  }
-
-  RenderNode.prototype = {
-    append: function(node) {
-      var rv = new RenderNode(node);
-      this.childNodes.push(rv);
-      return rv;
-    },
-
-    sync: function(opt_added) {
-      if (this.skip)
-        return;
-
-      var nodeWrapper = this.node;
-      // plain array of RenderNodes
-      var newChildren = this.childNodes;
-      // plain array of real nodes.
-      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));
-      var added = opt_added || new WeakMap();
-
-      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);
-
-      var newIndex = 0, oldIndex = 0;
-      var lastIndex = 0;
-      for (var i = 0; i < splices.length; i++) {
-        var splice = splices[i];
-        for (; lastIndex < splice.index; lastIndex++) {
-          oldIndex++;
-          newChildren[newIndex++].sync(added);
-        }
-
-        var removedCount = splice.removed.length;
-        for (var j = 0; j < removedCount; j++) {
-          var wrapper = wrap(oldChildren[oldIndex++]);
-          if (!added.get(wrapper))
-            remove(wrapper);
-        }
-
-        var addedCount = splice.addedCount;
-        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);
-        for (var j = 0; j < addedCount; j++) {
-          var newChildRenderNode = newChildren[newIndex++];
-          var newChildWrapper = newChildRenderNode.node;
-          insertBefore(nodeWrapper, newChildWrapper, refNode);
-
-          // Keep track of added so that we do not remove the node after it
-          // has been added.
-          added.set(newChildWrapper, true);
-
-          newChildRenderNode.sync(added);
-        }
-
-        lastIndex += addedCount;
-      }
-
-      for (var i = lastIndex; i < newChildren.length; i++) {
-        newChildren[i].sync(added);
-      }
-    }
-  };
-
-  function ShadowRenderer(host) {
-    this.host = host;
-    this.dirty = false;
-    this.invalidateAttributes();
-    this.associateNode(host);
-  }
-
-  ShadowRenderer.prototype = {
-
-    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees
-    render: function(opt_renderNode) {
-      if (!this.dirty)
-        return;
-
-      this.invalidateAttributes();
-      this.treeComposition();
-
-      var host = this.host;
-      var shadowRoot = host.shadowRoot;
-
-      this.associateNode(host);
-      var topMostRenderer = !renderNode;
-      var renderNode = opt_renderNode || new RenderNode(host);
-
-      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {
-        this.renderNode(shadowRoot, renderNode, node, false);
-      }
-
-      if (topMostRenderer)
-        renderNode.sync();
-
-      this.dirty = false;
-    },
-
-    get parentRenderer() {
-      return getTreeScope(this.host).renderer;
-    },
-
-    invalidate: function() {
-      if (!this.dirty) {
-        this.dirty = true;
-        pendingDirtyRenderers.push(this);
-        if (renderTimer)
-          return;
-        renderTimer = window[request](handleRequestAnimationFrame, 0);
-      }
-    },
-
-    renderNode: function(shadowRoot, renderNode, node, isNested) {
-      if (isShadowHost(node)) {
-        renderNode = renderNode.append(node);
-        var renderer = getRendererForHost(node);
-        renderer.dirty = true;  // Need to rerender due to reprojection.
-        renderer.render(renderNode);
-      } else if (isInsertionPoint(node)) {
-        this.renderInsertionPoint(shadowRoot, renderNode, node, isNested);
-      } else if (isShadowInsertionPoint(node)) {
-        this.renderShadowInsertionPoint(shadowRoot, renderNode, node);
-      } else {
-        this.renderAsAnyDomTree(shadowRoot, renderNode, node, isNested);
-      }
-    },
-
-    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {
-      renderNode = renderNode.append(node);
-
-      if (isShadowHost(node)) {
-        var renderer = getRendererForHost(node);
-        renderNode.skip = !renderer.dirty;
-        renderer.render(renderNode);
-      } else {
-        for (var child = node.firstChild; child; child = child.nextSibling) {
-          this.renderNode(shadowRoot, renderNode, child, isNested);
-        }
-      }
-    },
-
-    renderInsertionPoint: function(shadowRoot, renderNode, insertionPoint,
-                                   isNested) {
-      var distributedChildNodes = getDistributedChildNodes(insertionPoint);
-      if (distributedChildNodes.length) {
-        this.associateNode(insertionPoint);
-
-        for (var i = 0; i < distributedChildNodes.length; i++) {
-          var child = distributedChildNodes[i];
-          if (isInsertionPoint(child) && isNested)
-            this.renderInsertionPoint(shadowRoot, renderNode, child, isNested);
-          else
-            this.renderAsAnyDomTree(shadowRoot, renderNode, child, isNested);
-        }
-      } else {
-        this.renderFallbackContent(shadowRoot, renderNode, insertionPoint);
-      }
-      this.associateNode(insertionPoint.parentNode);
-    },
-
-    renderShadowInsertionPoint: function(shadowRoot, renderNode,
-                                         shadowInsertionPoint) {
-      var nextOlderTree = shadowRoot.olderShadowRoot;
-      if (nextOlderTree) {
-        assignToInsertionPoint(nextOlderTree, shadowInsertionPoint);
-        this.associateNode(shadowInsertionPoint.parentNode);
-        for (var node = nextOlderTree.firstChild;
-             node;
-             node = node.nextSibling) {
-          this.renderNode(nextOlderTree, renderNode, node, true);
-        }
-      } else {
-        this.renderFallbackContent(shadowRoot, renderNode,
-                                   shadowInsertionPoint);
-      }
-    },
-
-    renderFallbackContent: function(shadowRoot, renderNode, fallbackHost) {
-      this.associateNode(fallbackHost);
-      this.associateNode(fallbackHost.parentNode);
-      for (var node = fallbackHost.firstChild; node; node = node.nextSibling) {
-        this.renderAsAnyDomTree(shadowRoot, renderNode, node, false);
-      }
-    },
-
-    /**
-     * Invalidates the attributes used to keep track of which attributes may
-     * cause the renderer to be invalidated.
-     */
-    invalidateAttributes: function() {
-      this.attributes = Object.create(null);
-    },
-
-    /**
-     * Parses the selector and makes this renderer dependent on the attribute
-     * being used in the selector.
-     * @param {string} selector
-     */
-    updateDependentAttributes: function(selector) {
-      if (!selector)
-        return;
-
-      var attributes = this.attributes;
-
-      // .class
-      if (/\.\w+/.test(selector))
-        attributes['class'] = true;
-
-      // #id
-      if (/#\w+/.test(selector))
-        attributes['id'] = true;
-
-      selector.replace(/\[\s*([^\s=\|~\]]+)/g, function(_, name) {
-        attributes[name] = true;
-      });
-
-      // Pseudo selectors have been removed from the spec.
-    },
-
-    dependsOnAttribute: function(name) {
-      return this.attributes[name];
-    },
-
-    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-distribution-algorithm
-    distribute: function(tree, pool) {
-      var self = this;
-
-      visit(tree, isActiveInsertionPoint,
-          function(insertionPoint) {
-            resetDistributedChildNodes(insertionPoint);
-            self.updateDependentAttributes(
-                insertionPoint.getAttribute('select'));
-
-            for (var i = 0; i < pool.length; i++) {  // 1.2
-              var node = pool[i];  // 1.2.1
-              if (node === undefined)  // removed
-                continue;
-              if (matchesCriteria(node, insertionPoint)) {  // 1.2.2
-                distributeChildToInsertionPoint(node, insertionPoint);  // 1.2.2.1
-                pool[i] = undefined;  // 1.2.2.2
-              }
-            }
-          });
-    },
-
-    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-tree-composition
-    treeComposition: function () {
-      var shadowHost = this.host;
-      var tree = shadowHost.shadowRoot;  // 1.
-      var pool = [];  // 2.
-
-      for (var child = shadowHost.firstChild;
-           child;
-           child = child.nextSibling) {  // 3.
-        if (isInsertionPoint(child)) {  // 3.2.
-          var reprojected = getDistributedChildNodes(child);  // 3.2.1.
-          // if reprojected is undef... reset it?
-          if (!reprojected || !reprojected.length)  // 3.2.2.
-            reprojected = getChildNodesSnapshot(child);
-          pool.push.apply(pool, reprojected);  // 3.2.3.
-        } else {
-          pool.push(child); // 3.3.
-        }
-      }
-
-      var shadowInsertionPoint, point;
-      while (tree) {  // 4.
-        // 4.1.
-        shadowInsertionPoint = undefined;  // Reset every iteration.
-        visit(tree, isActiveShadowInsertionPoint, function(point) {
-          shadowInsertionPoint = point;
-          return false;
-        });
-        point = shadowInsertionPoint;
-
-        this.distribute(tree, pool);  // 4.2.
-        if (point) {  // 4.3.
-          var nextOlderTree = tree.olderShadowRoot;  // 4.3.1.
-          if (!nextOlderTree) {
-            break;  // 4.3.1.1.
-          } else {
-            tree = nextOlderTree;  // 4.3.2.2.
-            assignToInsertionPoint(tree, point);  // 4.3.2.2.
-            continue;  // 4.3.2.3.
-          }
-        } else {
-          break;  // 4.4.
-        }
-      }
-    },
-
-    associateNode: function(node) {
-      node.impl.polymerShadowRenderer_ = this;
-    }
-  };
-
-  function isInsertionPoint(node) {
-    // Should this include <shadow>?
-    return node instanceof HTMLContentElement;
-  }
-
-  function isActiveInsertionPoint(node) {
-    // <content> inside another <content> or <shadow> is considered inactive.
-    return node instanceof HTMLContentElement;
-  }
-
-  function isShadowInsertionPoint(node) {
-    return node instanceof HTMLShadowElement;
-  }
-
-  function isActiveShadowInsertionPoint(node) {
-    // <shadow> inside another <content> or <shadow> is considered inactive.
-    return node instanceof HTMLShadowElement;
-  }
-
-  function isShadowHost(shadowHost) {
-    return shadowHost.shadowRoot;
-  }
-
-  function getShadowTrees(host) {
-    var trees = [];
-
-    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {
-      trees.push(tree);
-    }
-    return trees;
-  }
-
-  function assignToInsertionPoint(tree, point) {
-    insertionParentTable.set(tree, point);
-  }
-
-  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees
-  function render(host) {
-    new ShadowRenderer(host).render();
-  };
-
-  // Need to rerender shadow host when:
-  //
-  // - a direct child to the ShadowRoot is added or removed
-  // - a direct child to the host is added or removed
-  // - a new shadow root is created
-  // - a direct child to a content/shadow element is added or removed
-  // - a sibling to a content/shadow element is added or removed
-  // - content[select] is changed
-  // - an attribute in a direct child to a host is modified
-
-  /**
-   * This gets called when a node was added or removed to it.
-   */
-  Node.prototype.invalidateShadowRenderer = function(force) {
-    var renderer = this.impl.polymerShadowRenderer_;
-    if (renderer) {
-      renderer.invalidate();
-      return true;
-    }
-
-    return false;
-  };
-
-  HTMLContentElement.prototype.getDistributedNodes = function() {
-    // TODO(arv): We should only rerender the dirty ancestor renderers (from
-    // the root and down).
-    renderAllPending();
-    return getDistributedChildNodes(this);
-  };
-
-  HTMLShadowElement.prototype.nodeIsInserted_ =
-  HTMLContentElement.prototype.nodeIsInserted_ = function() {
-    // Invalidate old renderer if any.
-    this.invalidateShadowRenderer();
-
-    var shadowRoot = getShadowRootAncestor(this);
-    var renderer;
-    if (shadowRoot)
-      renderer = getRendererForShadowRoot(shadowRoot);
-    this.impl.polymerShadowRenderer_ = renderer;
-    if (renderer)
-      renderer.invalidate();
-  };
-
-  scope.eventParentsTable = eventParentsTable;
-  scope.getRendererForHost = getRendererForHost;
-  scope.getShadowTrees = getShadowTrees;
-  scope.insertionParentTable = insertionParentTable;
-  scope.renderAllPending = renderAllPending;
-
-  // Exposed for testing
-  scope.visual = {
-    insertBefore: insertBefore,
-    remove: remove,
-  };
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var assert = scope.assert;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var elementsWithFormProperty = [
-    'HTMLButtonElement',
-    'HTMLFieldSetElement',
-    'HTMLInputElement',
-    'HTMLKeygenElement',
-    'HTMLLabelElement',
-    'HTMLLegendElement',
-    'HTMLObjectElement',
-    // HTMLOptionElement is handled in HTMLOptionElement.js
-    'HTMLOutputElement',
-    // HTMLSelectElement is handled in HTMLSelectElement.js
-    'HTMLTextAreaElement',
-  ];
-
-  function createWrapperConstructor(name) {
-    if (!window[name])
-      return;
-
-    // Ensure we are not overriding an already existing constructor.
-    assert(!scope.wrappers[name]);
-
-    var GeneratedWrapper = function(node) {
-      // At this point all of them extend HTMLElement.
-      HTMLElement.call(this, node);
-    }
-    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);
-    mixin(GeneratedWrapper.prototype, {
-      get form() {
-        return wrap(unwrap(this).form);
-      },
-    });
-
-    registerWrapper(window[name], GeneratedWrapper,
-        document.createElement(name.slice(4, -7)));
-    scope.wrappers[name] = GeneratedWrapper;
-  }
-
-  elementsWithFormProperty.forEach(createWrapperConstructor);
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2014 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalSelection = window.Selection;
-
-  function Selection(impl) {
-    this.impl = impl;
-  }
-  Selection.prototype = {
-    get anchorNode() {
-      return wrap(this.impl.anchorNode);
-    },
-    get focusNode() {
-      return wrap(this.impl.focusNode);
-    },
-    addRange: function(range) {
-      this.impl.addRange(unwrap(range));
-    },
-    collapse: function(node, index) {
-      this.impl.collapse(unwrapIfNeeded(node), index);
-    },
-    containsNode: function(node, allowPartial) {
-      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);
-    },
-    extend: function(node, offset) {
-      this.impl.extend(unwrapIfNeeded(node), offset);
-    },
-    getRangeAt: function(index) {
-      return wrap(this.impl.getRangeAt(index));
-    },
-    removeRange: function(range) {
-      this.impl.removeRange(unwrap(range));
-    },
-    selectAllChildren: function(node) {
-      this.impl.selectAllChildren(unwrapIfNeeded(node));
-    },
-    toString: function() {
-      return this.impl.toString();
-    }
-  };
-
-  // WebKit extensions. Not implemented.
-  // readonly attribute Node baseNode;
-  // readonly attribute long baseOffset;
-  // readonly attribute Node extentNode;
-  // readonly attribute long extentOffset;
-  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,
-  //                       [Default=Undefined] optional long baseOffset,
-  //                       [Default=Undefined] optional Node extentNode,
-  //                       [Default=Undefined] optional long extentOffset);
-  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,
-  //                  [Default=Undefined] optional long offset);
-
-  registerWrapper(window.Selection, Selection, window.getSelection());
-
-  scope.wrappers.Selection = Selection;
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var GetElementsByInterface = scope.GetElementsByInterface;
-  var Node = scope.wrappers.Node;
-  var ParentNodeInterface = scope.ParentNodeInterface;
-  var Selection = scope.wrappers.Selection;
-  var SelectorsInterface = scope.SelectorsInterface;
-  var ShadowRoot = scope.wrappers.ShadowRoot;
-  var TreeScope = scope.TreeScope;
-  var cloneNode = scope.cloneNode;
-  var defineWrapGetter = scope.defineWrapGetter;
-  var elementFromPoint = scope.elementFromPoint;
-  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
-  var matchesNames = scope.matchesNames;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var renderAllPending = scope.renderAllPending;
-  var rewrap = scope.rewrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var wrapEventTargetMethods = scope.wrapEventTargetMethods;
-  var wrapNodeList = scope.wrapNodeList;
-
-  var implementationTable = new WeakMap();
-
-  function Document(node) {
-    Node.call(this, node);
-    this.treeScope_ = new TreeScope(this, null);
-  }
-  Document.prototype = Object.create(Node.prototype);
-
-  defineWrapGetter(Document, 'documentElement');
-
-  // Conceptually both body and head can be in a shadow but suporting that seems
-  // overkill at this point.
-  defineWrapGetter(Document, 'body');
-  defineWrapGetter(Document, 'head');
-
-  // document cannot be overridden so we override a bunch of its methods
-  // directly on the instance.
-
-  function wrapMethod(name) {
-    var original = document[name];
-    Document.prototype[name] = function() {
-      return wrap(original.apply(this.impl, arguments));
-    };
-  }
-
-  [
-    'createComment',
-    'createDocumentFragment',
-    'createElement',
-    'createElementNS',
-    'createEvent',
-    'createEventNS',
-    'createRange',
-    'createTextNode',
-    'getElementById'
-  ].forEach(wrapMethod);
-
-  var originalAdoptNode = document.adoptNode;
-
-  function adoptNodeNoRemove(node, doc) {
-    originalAdoptNode.call(doc.impl, unwrap(node));
-    adoptSubtree(node, doc);
-  }
-
-  function adoptSubtree(node, doc) {
-    if (node.shadowRoot)
-      doc.adoptNode(node.shadowRoot);
-    if (node instanceof ShadowRoot)
-      adoptOlderShadowRoots(node, doc);
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      adoptSubtree(child, doc);
-    }
-  }
-
-  function adoptOlderShadowRoots(shadowRoot, doc) {
-    var oldShadowRoot = shadowRoot.olderShadowRoot;
-    if (oldShadowRoot)
-      doc.adoptNode(oldShadowRoot);
-  }
-
-  var originalGetSelection = document.getSelection;
-
-  mixin(Document.prototype, {
-    adoptNode: function(node) {
-      if (node.parentNode)
-        node.parentNode.removeChild(node);
-      adoptNodeNoRemove(node, this);
-      return node;
-    },
-    elementFromPoint: function(x, y) {
-      return elementFromPoint(this, this, x, y);
-    },
-    importNode: function(node, deep) {
-      return cloneNode(node, deep, this.impl);
-    },
-    getSelection: function() {
-      renderAllPending();
-      return new Selection(originalGetSelection.call(unwrap(this)));
-    }
-  });
-
-  if (document.registerElement) {
-    var originalRegisterElement = document.registerElement;
-    Document.prototype.registerElement = function(tagName, object) {
-      var prototype, extendsOption;
-      if (object !== undefined) {
-        prototype = object.prototype;
-        extendsOption = object.extends;
-      }
-
-      if (!prototype)
-        prototype = Object.create(HTMLElement.prototype);
-
-
-      // If we already used the object as a prototype for another custom
-      // element.
-      if (scope.nativePrototypeTable.get(prototype)) {
-        // TODO(arv): DOMException
-        throw new Error('NotSupportedError');
-      }
-
-      // Find first object on the prototype chain that already have a native
-      // prototype. Keep track of all the objects before that so we can create
-      // a similar structure for the native case.
-      var proto = Object.getPrototypeOf(prototype);
-      var nativePrototype;
-      var prototypes = [];
-      while (proto) {
-        nativePrototype = scope.nativePrototypeTable.get(proto);
-        if (nativePrototype)
-          break;
-        prototypes.push(proto);
-        proto = Object.getPrototypeOf(proto);
-      }
-
-      if (!nativePrototype) {
-        // TODO(arv): DOMException
-        throw new Error('NotSupportedError');
-      }
-
-      // This works by creating a new prototype object that is empty, but has
-      // the native prototype as its proto. The original prototype object
-      // passed into register is used as the wrapper prototype.
-
-      var newPrototype = Object.create(nativePrototype);
-      for (var i = prototypes.length - 1; i >= 0; i--) {
-        newPrototype = Object.create(newPrototype);
-      }
-
-      // Add callbacks if present.
-      // Names are taken from:
-      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156
-      // and not from the spec since the spec is out of date.
-      [
-        'createdCallback',
-        'attachedCallback',
-        'detachedCallback',
-        'attributeChangedCallback',
-      ].forEach(function(name) {
-        var f = prototype[name];
-        if (!f)
-          return;
-        newPrototype[name] = function() {
-          // if this element has been wrapped prior to registration,
-          // the wrapper is stale; in this case rewrap
-          if (!(wrap(this) instanceof CustomElementConstructor)) {
-            rewrap(this);
-          }
-          f.apply(wrap(this), arguments);
-        };
-      });
-
-      var p = {prototype: newPrototype};
-      if (extendsOption)
-        p.extends = extendsOption;
-
-      function CustomElementConstructor(node) {
-        if (!node) {
-          if (extendsOption) {
-            return document.createElement(extendsOption, tagName);
-          } else {
-            return document.createElement(tagName);
-          }
-        }
-        this.impl = node;
-      }
-      CustomElementConstructor.prototype = prototype;
-      CustomElementConstructor.prototype.constructor = CustomElementConstructor;
-
-      scope.constructorTable.set(newPrototype, CustomElementConstructor);
-      scope.nativePrototypeTable.set(prototype, newPrototype);
-
-      // registration is synchronous so do it last
-      var nativeConstructor = originalRegisterElement.call(unwrap(this),
-          tagName, p);
-      return CustomElementConstructor;
-    };
-
-    forwardMethodsToWrapper([
-      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument
-    ], [
-      'registerElement',
-    ]);
-  }
-
-  // We also override some of the methods on document.body and document.head
-  // for convenience.
-  forwardMethodsToWrapper([
-    window.HTMLBodyElement,
-    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument
-    window.HTMLHeadElement,
-    window.HTMLHtmlElement,
-  ], [
-    'appendChild',
-    'compareDocumentPosition',
-    'contains',
-    'getElementsByClassName',
-    'getElementsByTagName',
-    'getElementsByTagNameNS',
-    'insertBefore',
-    'querySelector',
-    'querySelectorAll',
-    'removeChild',
-    'replaceChild',
-  ].concat(matchesNames));
-
-  forwardMethodsToWrapper([
-    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument
-  ], [
-    'adoptNode',
-    'importNode',
-    'contains',
-    'createComment',
-    'createDocumentFragment',
-    'createElement',
-    'createElementNS',
-    'createEvent',
-    'createEventNS',
-    'createRange',
-    'createTextNode',
-    'elementFromPoint',
-    'getElementById',
-    'getSelection',
-  ]);
-
-  mixin(Document.prototype, GetElementsByInterface);
-  mixin(Document.prototype, ParentNodeInterface);
-  mixin(Document.prototype, SelectorsInterface);
-
-  mixin(Document.prototype, {
-    get implementation() {
-      var implementation = implementationTable.get(this);
-      if (implementation)
-        return implementation;
-      implementation =
-          new DOMImplementation(unwrap(this).implementation);
-      implementationTable.set(this, implementation);
-      return implementation;
-    }
-  });
-
-  registerWrapper(window.Document, Document,
-      document.implementation.createHTMLDocument(''));
-
-  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has
-  // one Document interface and IE implements the standard correctly.
-  if (window.HTMLDocument)
-    registerWrapper(window.HTMLDocument, Document);
-
-  wrapEventTargetMethods([
-    window.HTMLBodyElement,
-    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument
-    window.HTMLHeadElement,
-  ]);
-
-  function DOMImplementation(impl) {
-    this.impl = impl;
-  }
-
-  function wrapImplMethod(constructor, name) {
-    var original = document.implementation[name];
-    constructor.prototype[name] = function() {
-      return wrap(original.apply(this.impl, arguments));
-    };
-  }
-
-  function forwardImplMethod(constructor, name) {
-    var original = document.implementation[name];
-    constructor.prototype[name] = function() {
-      return original.apply(this.impl, arguments);
-    };
-  }
-
-  wrapImplMethod(DOMImplementation, 'createDocumentType');
-  wrapImplMethod(DOMImplementation, 'createDocument');
-  wrapImplMethod(DOMImplementation, 'createHTMLDocument');
-  forwardImplMethod(DOMImplementation, 'hasFeature');
-
-  registerWrapper(window.DOMImplementation, DOMImplementation);
-
-  forwardMethodsToWrapper([
-    window.DOMImplementation,
-  ], [
-    'createDocumentType',
-    'createDocument',
-    'createHTMLDocument',
-    'hasFeature',
-  ]);
-
-  scope.adoptNodeNoRemove = adoptNodeNoRemove;
-  scope.wrappers.DOMImplementation = DOMImplementation;
-  scope.wrappers.Document = Document;
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var EventTarget = scope.wrappers.EventTarget;
-  var Selection = scope.wrappers.Selection;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var renderAllPending = scope.renderAllPending;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalWindow = window.Window;
-  var originalGetComputedStyle = window.getComputedStyle;
-  var originalGetSelection = window.getSelection;
-
-  function Window(impl) {
-    EventTarget.call(this, impl);
-  }
-  Window.prototype = Object.create(EventTarget.prototype);
-
-  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {
-    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);
-  };
-
-  OriginalWindow.prototype.getSelection = function() {
-    return wrap(this || window).getSelection();
-  };
-
-  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065
-  delete window.getComputedStyle;
-  delete window.getSelection;
-
-  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(
-      function(name) {
-        OriginalWindow.prototype[name] = function() {
-          var w = wrap(this || window);
-          return w[name].apply(w, arguments);
-        };
-
-        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065
-        delete window[name];
-      });
-
-  mixin(Window.prototype, {
-    getComputedStyle: function(el, pseudo) {
-      renderAllPending();
-      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),
-                                           pseudo);
-    },
-    getSelection: function() {
-      renderAllPending();
-      return new Selection(originalGetSelection.call(unwrap(this)));
-    },
-  });
-
-  registerWrapper(OriginalWindow, Window);
-
-  scope.wrappers.Window = Window;
-
-})(window.ShadowDOMPolyfill);
-
-/**
- * Copyright 2014 The Polymer Authors. All rights reserved.
- * Use of this source code is goverened by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-(function(scope) {
-  'use strict';
-
-  var unwrap = scope.unwrap;
-
-  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that
-  // requires wrapping. Since it is only a method we do not need a real wrapper,
-  // we can just override the method.
-
-  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;
-  var OriginalDataTransferSetDragImage =
-      OriginalDataTransfer.prototype.setDragImage;
-
-  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {
-    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);
-  };
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var isWrapperFor = scope.isWrapperFor;
-
-  // This is a list of the elements we currently override the global constructor
-  // for.
-  var elements = {
-    'a': 'HTMLAnchorElement',
-    // Do not create an applet element by default since it shows a warning in
-    // IE.
-    // https://github.com/Polymer/polymer/issues/217
-    // 'applet': 'HTMLAppletElement',
-    'area': 'HTMLAreaElement',
-    'audio': 'HTMLAudioElement',
-    'base': 'HTMLBaseElement',
-    'body': 'HTMLBodyElement',
-    'br': 'HTMLBRElement',
-    'button': 'HTMLButtonElement',
-    'canvas': 'HTMLCanvasElement',
-    'caption': 'HTMLTableCaptionElement',
-    'col': 'HTMLTableColElement',
-    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.
-    'content': 'HTMLContentElement',
-    'data': 'HTMLDataElement',
-    'datalist': 'HTMLDataListElement',
-    'del': 'HTMLModElement',
-    'dir': 'HTMLDirectoryElement',
-    'div': 'HTMLDivElement',
-    'dl': 'HTMLDListElement',
-    'embed': 'HTMLEmbedElement',
-    'fieldset': 'HTMLFieldSetElement',
-    'font': 'HTMLFontElement',
-    'form': 'HTMLFormElement',
-    'frame': 'HTMLFrameElement',
-    'frameset': 'HTMLFrameSetElement',
-    'h1': 'HTMLHeadingElement',
-    'head': 'HTMLHeadElement',
-    'hr': 'HTMLHRElement',
-    'html': 'HTMLHtmlElement',
-    'iframe': 'HTMLIFrameElement',
-    'img': 'HTMLImageElement',
-    'input': 'HTMLInputElement',
-    'keygen': 'HTMLKeygenElement',
-    'label': 'HTMLLabelElement',
-    'legend': 'HTMLLegendElement',
-    'li': 'HTMLLIElement',
-    'link': 'HTMLLinkElement',
-    'map': 'HTMLMapElement',
-    'marquee': 'HTMLMarqueeElement',
-    'menu': 'HTMLMenuElement',
-    'menuitem': 'HTMLMenuItemElement',
-    'meta': 'HTMLMetaElement',
-    'meter': 'HTMLMeterElement',
-    'object': 'HTMLObjectElement',
-    'ol': 'HTMLOListElement',
-    'optgroup': 'HTMLOptGroupElement',
-    'option': 'HTMLOptionElement',
-    'output': 'HTMLOutputElement',
-    'p': 'HTMLParagraphElement',
-    'param': 'HTMLParamElement',
-    'pre': 'HTMLPreElement',
-    'progress': 'HTMLProgressElement',
-    'q': 'HTMLQuoteElement',
-    'script': 'HTMLScriptElement',
-    'select': 'HTMLSelectElement',
-    'shadow': 'HTMLShadowElement',
-    'source': 'HTMLSourceElement',
-    'span': 'HTMLSpanElement',
-    'style': 'HTMLStyleElement',
-    'table': 'HTMLTableElement',
-    'tbody': 'HTMLTableSectionElement',
-    // WebKit and Moz are wrong:
-    // https://bugs.webkit.org/show_bug.cgi?id=111469
-    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096
-    // 'td': 'HTMLTableCellElement',
-    'template': 'HTMLTemplateElement',
-    'textarea': 'HTMLTextAreaElement',
-    'thead': 'HTMLTableSectionElement',
-    'time': 'HTMLTimeElement',
-    'title': 'HTMLTitleElement',
-    'tr': 'HTMLTableRowElement',
-    'track': 'HTMLTrackElement',
-    'ul': 'HTMLUListElement',
-    'video': 'HTMLVideoElement',
-  };
-
-  function overrideConstructor(tagName) {
-    var nativeConstructorName = elements[tagName];
-    var nativeConstructor = window[nativeConstructorName];
-    if (!nativeConstructor)
-      return;
-    var element = document.createElement(tagName);
-    var wrapperConstructor = element.constructor;
-    window[nativeConstructorName] = wrapperConstructor;
-  }
-
-  Object.keys(elements).forEach(overrideConstructor);
-
-  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {
-    window[name] = scope.wrappers[name]
-  });
-
-})(window.ShadowDOMPolyfill);
-
-/*
- * 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.
- */
-(function() {
-
-  // convenient global
-  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;
-  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;
-
-  // users may want to customize other types
-  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but
-  // I've left this code here in case we need to temporarily patch another
-  // type
-  /*
-  (function() {
-    var elts = {HTMLButtonElement: 'button'};
-    for (var c in elts) {
-      window[c] = function() { throw 'Patched Constructor'; };
-      window[c].prototype = Object.getPrototypeOf(
-          document.createElement(elts[c]));
-    }
-  })();
-  */
-
-  // patch in prefixed name
-  Object.defineProperty(Element.prototype, 'webkitShadowRoot',
-      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));
-
-  var originalCreateShadowRoot = Element.prototype.createShadowRoot;
-  Element.prototype.createShadowRoot = function() {
-    var root = originalCreateShadowRoot.call(this);
-    CustomElements.watchShadow(this);
-    return root;
-  };
-
-  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;
-})();
-
-/*
- * Copyright 2012 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.
- */
-
-/*
-  This is a limited shim for ShadowDOM css styling.
-  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles
-  
-  The intention here is to support only the styling features which can be 
-  relatively simply implemented. The goal is to allow users to avoid the 
-  most obvious pitfalls and do so without compromising performance significantly. 
-  For ShadowDOM styling that's not covered here, a set of best practices
-  can be provided that should allow users to accomplish more complex styling.
-
-  The following is a list of specific ShadowDOM styling features and a brief
-  discussion of the approach used to shim.
-
-  Shimmed features:
-
-  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host
-  element using the :host rule. To shim this feature, the :host styles are 
-  reformatted and prefixed with a given scope name and promoted to a 
-  document level stylesheet.
-  For example, given a scope name of .foo, a rule like this:
-  
-    :host {
-        background: red;
-      }
-    }
-  
-  becomes:
-  
-    .foo {
-      background: red;
-    }
-  
-  * encapsultion: Styles defined within ShadowDOM, apply only to 
-  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement
-  this feature.
-  
-  By default, rules are prefixed with the host element tag name 
-  as a descendant selector. This ensures styling does not leak out of the 'top'
-  of the element's ShadowDOM. For example,
-
-  div {
-      font-weight: bold;
-    }
-  
-  becomes:
-
-  x-foo div {
-      font-weight: bold;
-    }
-  
-  becomes:
-
-
-  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then 
-  selectors are scoped by adding an attribute selector suffix to each
-  simple selector that contains the host element tag name. Each element 
-  in the element's ShadowDOM template is also given the scope attribute. 
-  Thus, these rules match only elements that have the scope attribute.
-  For example, given a scope name of x-foo, a rule like this:
-  
-    div {
-      font-weight: bold;
-    }
-  
-  becomes:
-  
-    div[x-foo] {
-      font-weight: bold;
-    }
-
-  Note that elements that are dynamically added to a scope must have the scope
-  selector added to them manually.
-
-  * upper/lower bound encapsulation: Styles which are defined outside a
-  shadowRoot should not cross the ShadowDOM boundary and should not apply
-  inside a shadowRoot.
-
-  This styling behavior is not emulated. Some possible ways to do this that 
-  were rejected due to complexity and/or performance concerns include: (1) reset
-  every possible property for every possible selector for a given scope name;
-  (2) re-implement css in javascript.
-  
-  As an alternative, users should make sure to use selectors
-  specific to the scope in which they are working.
-  
-  * ::distributed: This behavior is not emulated. It's often not necessary
-  to style the contents of a specific insertion point and instead, descendants
-  of the host element can be styled selectively. Users can also create an 
-  extra node around an insertion point and style that node's contents
-  via descendent selectors. For example, with a shadowRoot like this:
-  
-    <style>
-      ::content(div) {
-        background: red;
-      }
-    </style>
-    <content></content>
-  
-  could become:
-  
-    <style>
-      / *@polyfill .content-container div * / 
-      ::content(div) {
-        background: red;
-      }
-    </style>
-    <div class="content-container">
-      <content></content>
-    </div>
-  
-  Note the use of @polyfill in the comment above a ShadowDOM specific style
-  declaration. This is a directive to the styling shim to use the selector 
-  in comments in lieu of the next selector when running under polyfill.
-*/
-(function(scope) {
-
-var ShadowCSS = {
-  strictStyling: false,
-  registry: {},
-  // Shim styles for a given root associated with a name and extendsName
-  // 1. cache root styles by name
-  // 2. optionally tag root nodes with scope name
-  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */
-  // 4. shim :host and scoping
-  shimStyling: function(root, name, extendsName) {
-    var scopeStyles = this.prepareRoot(root, name, extendsName);
-    var typeExtension = this.isTypeExtension(extendsName);
-    var scopeSelector = this.makeScopeSelector(name, typeExtension);
-    // use caching to make working with styles nodes easier and to facilitate
-    // lookup of extendee
-    var cssText = stylesToCssText(scopeStyles, true);
-    cssText = this.scopeCssText(cssText, scopeSelector);
-    // cache shimmed css on root for user extensibility
-    if (root) {
-      root.shimmedStyle = cssText;
-    }
-    // add style to document
-    this.addCssToDocument(cssText, name);
-  },
-  /*
-  * Shim a style element with the given selector. Returns cssText that can
-  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).
-  */
-  shimStyle: function(style, selector) {
-    return this.shimCssText(style.textContent, selector);
-  },
-  /*
-  * Shim some cssText with the given selector. Returns cssText that can
-  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).
-  */
-  shimCssText: function(cssText, selector) {
-    cssText = this.insertDirectives(cssText);
-    return this.scopeCssText(cssText, selector);
-  },
-  makeScopeSelector: function(name, typeExtension) {
-    if (name) {
-      return typeExtension ? '[is=' + name + ']' : name;
-    }
-    return '';
-  },
-  isTypeExtension: function(extendsName) {
-    return extendsName && extendsName.indexOf('-') < 0;
-  },
-  prepareRoot: function(root, name, extendsName) {
-    var def = this.registerRoot(root, name, extendsName);
-    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);
-    // remove existing style elements
-    this.removeStyles(root, def.rootStyles);
-    // apply strict attr
-    if (this.strictStyling) {
-      this.applyScopeToContent(root, name);
-    }
-    return def.scopeStyles;
-  },
-  removeStyles: function(root, styles) {
-    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {
-      s.parentNode.removeChild(s);
-    }
-  },
-  registerRoot: function(root, name, extendsName) {
-    var def = this.registry[name] = {
-      root: root,
-      name: name,
-      extendsName: extendsName
-    }
-    var styles = this.findStyles(root);
-    def.rootStyles = styles;
-    def.scopeStyles = def.rootStyles;
-    var extendee = this.registry[def.extendsName];
-    if (extendee) {
-      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);
-    }
-    return def;
-  },
-  findStyles: function(root) {
-    if (!root) {
-      return [];
-    }
-    var styles = root.querySelectorAll('style');
-    return Array.prototype.filter.call(styles, function(s) {
-      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);
-    });
-  },
-  applyScopeToContent: function(root, name) {
-    if (root) {
-      // add the name attribute to each node in root.
-      Array.prototype.forEach.call(root.querySelectorAll('*'),
-          function(node) {
-            node.setAttribute(name, '');
-          });
-      // and template contents too
-      Array.prototype.forEach.call(root.querySelectorAll('template'),
-          function(template) {
-            this.applyScopeToContent(template.content, name);
-          },
-          this);
-    }
-  },
-  insertDirectives: function(cssText) {
-    cssText = this.insertPolyfillDirectivesInCssText(cssText);
-    return this.insertPolyfillRulesInCssText(cssText);
-  },
-  /*
-   * Process styles to convert native ShadowDOM rules that will trip
-   * up the css parser; we rely on decorating the stylesheet with inert rules.
-   * 
-   * For example, we convert this rule:
-   * 
-   * polyfill-next-selector { content: ':host menu-item'; }
-   * ::content menu-item {
-   * 
-   * to this:
-   * 
-   * scopeName menu-item {
-   *
-  **/
-  insertPolyfillDirectivesInCssText: function(cssText) {
-    // TODO(sorvell): remove either content or comment
-    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {
-      // remove end comment delimiter and add block start
-      return p1.slice(0, -2) + '{';
-    });
-    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {
-      return p1 + ' {';
-    });
-  },
-  /*
-   * Process styles to add rules which will only apply under the polyfill
-   * 
-   * For example, we convert this rule:
-   * 
-   * polyfill-rule {
-   *   content: ':host menu-item';
-   * ...
-   * }
-   * 
-   * to this:
-   * 
-   * scopeName menu-item {...}
-   *
-  **/
-  insertPolyfillRulesInCssText: function(cssText) {
-    // TODO(sorvell): remove either content or comment
-    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {
-      // remove end comment delimiter
-      return p1.slice(0, -1);
-    });
-    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {
-      var rule = match.replace(p1, '').replace(p2, '');
-      return p3 + rule;
-    });
-  },
-  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
-   * 
-   *  .foo {... } 
-   *  
-   *  and converts this to
-   *  
-   *  scopeName .foo { ... }
-  */
-  scopeCssText: function(cssText, scopeSelector) {
-    var unscoped = this.extractUnscopedRulesFromCssText(cssText);
-    cssText = this.insertPolyfillHostInCssText(cssText);
-    cssText = this.convertColonHost(cssText);
-    cssText = this.convertColonHostContext(cssText);
-    cssText = this.convertCombinators(cssText);
-    if (scopeSelector) {
-      var self = this, cssText;
-      withCssRules(cssText, function(rules) {
-        cssText = self.scopeRules(rules, scopeSelector);
-      });
-
-    }
-    cssText = cssText + '\n' + unscoped;
-    return cssText.trim();
-  },
-  /*
-   * Process styles to add rules which will only apply under the polyfill
-   * and do not process via CSSOM. (CSSOM is destructive to rules on rare 
-   * occasions, e.g. -webkit-calc on Safari.)
-   * For example, we convert this rule:
-   * 
-   * (comment start) @polyfill-unscoped-rule menu-item { 
-   * ... } (comment end)
-   * 
-   * to this:
-   * 
-   * menu-item {...}
-   *
-  **/
-  extractUnscopedRulesFromCssText: function(cssText) {
-    // TODO(sorvell): remove either content or comment
-    var r = '', m;
-    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {
-      r += m[1].slice(0, -1) + '\n\n';
-    }
-    while (m = cssContentUnscopedRuleRe.exec(cssText)) {
-      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\n\n';
-    }
-    return r;
-  },
-  /*
-   * convert a rule like :host(.foo) > .bar { }
-   *
-   * to
-   *
-   * scopeName.foo > .bar
-  */
-  convertColonHost: function(cssText) {
-    return this.convertColonRule(cssText, cssColonHostRe,
-        this.colonHostPartReplacer);
-  },
-  /*
-   * convert a rule like :host-context(.foo) > .bar { }
-   *
-   * to
-   *
-   * scopeName.foo > .bar, .foo scopeName > .bar { }
-   * 
-   * and
-   *
-   * :host-context(.foo:host) .bar { ... }
-   * 
-   * to
-   * 
-   * scopeName.foo .bar { ... }
-  */
-  convertColonHostContext: function(cssText) {
-    return this.convertColonRule(cssText, cssColonHostContextRe,
-        this.colonHostContextPartReplacer);
-  },
-  convertColonRule: function(cssText, regExp, partReplacer) {
-    // p1 = :host, p2 = contents of (), p3 rest of rule
-    return cssText.replace(regExp, function(m, p1, p2, p3) {
-      p1 = polyfillHostNoCombinator;
-      if (p2) {
-        var parts = p2.split(','), r = [];
-        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {
-          p = p.trim();
-          r.push(partReplacer(p1, p, p3));
-        }
-        return r.join(',');
-      } else {
-        return p1 + p3;
-      }
-    });
-  },
-  colonHostContextPartReplacer: function(host, part, suffix) {
-    if (part.match(polyfillHost)) {
-      return this.colonHostPartReplacer(host, part, suffix);
-    } else {
-      return host + part + suffix + ', ' + part + ' ' + host + suffix;
-    }
-  },
-  colonHostPartReplacer: function(host, part, suffix) {
-    return host + part.replace(polyfillHost, '') + suffix;
-  },
-  /*
-   * Convert ^ and ^^ combinators by replacing with space.
-  */
-  convertCombinators: function(cssText) {
-    for (var i=0; i < combinatorsRe.length; i++) {
-      cssText = cssText.replace(combinatorsRe[i], ' ');
-    }
-    return cssText;
-  },
-  // change a selector like 'div' to 'name div'
-  scopeRules: function(cssRules, scopeSelector) {
-    var cssText = '';
-    if (cssRules) {
-      Array.prototype.forEach.call(cssRules, function(rule) {
-        if (rule.selectorText && (rule.style && rule.style.cssText)) {
-          cssText += this.scopeSelector(rule.selectorText, scopeSelector, 
-            this.strictStyling) + ' {\n\t';
-          cssText += this.propertiesFromRule(rule) + '\n}\n\n';
-        } else if (rule.type === CSSRule.MEDIA_RULE) {
-          cssText += '@media ' + rule.media.mediaText + ' {\n';
-          cssText += this.scopeRules(rule.cssRules, scopeSelector);
-          cssText += '\n}\n\n';
-        } else if (rule.cssText) {
-          cssText += rule.cssText + '\n\n';
-        }
-      }, this);
-    }
-    return cssText;
-  },
-  scopeSelector: function(selector, scopeSelector, strict) {
-    var r = [], parts = selector.split(',');
-    parts.forEach(function(p) {
-      p = p.trim();
-      if (this.selectorNeedsScoping(p, scopeSelector)) {
-        p = (strict && !p.match(polyfillHostNoCombinator)) ? 
-            this.applyStrictSelectorScope(p, scopeSelector) :
-            this.applySimpleSelectorScope(p, scopeSelector);
-      }
-      r.push(p);
-    }, this);
-    return r.join(', ');
-  },
-  selectorNeedsScoping: function(selector, scopeSelector) {
-    var re = this.makeScopeMatcher(scopeSelector);
-    return !selector.match(re);
-  },
-  makeScopeMatcher: function(scopeSelector) {
-    scopeSelector = scopeSelector.replace(/\[/g, '\\[').replace(/\[/g, '\\]');
-    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');
-  },
-  // scope via name and [is=name]
-  applySimpleSelectorScope: function(selector, scopeSelector) {
-    if (selector.match(polyfillHostRe)) {
-      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);
-      return selector.replace(polyfillHostRe, scopeSelector + ' ');
-    } else {
-      return scopeSelector + ' ' + selector;
-    }
-  },
-  // return a selector with [name] suffix on each simple selector
-  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]
-  applyStrictSelectorScope: function(selector, scopeSelector) {
-    scopeSelector = scopeSelector.replace(/\[is=([^\]]*)\]/g, '$1');
-    var splits = [' ', '>', '+', '~'],
-      scoped = selector,
-      attrName = '[' + scopeSelector + ']';
-    splits.forEach(function(sep) {
-      var parts = scoped.split(sep);
-      scoped = parts.map(function(p) {
-        // remove :host since it should be unnecessary
-        var t = p.trim().replace(polyfillHostRe, '');
-        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {
-          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')
-        }
-        return p;
-      }).join(sep);
-    });
-    return scoped;
-  },
-  insertPolyfillHostInCssText: function(selector) {
-    return selector.replace(colonHostContextRe, polyfillHostContext).replace(
-        colonHostRe, polyfillHost);
-  },
-  propertiesFromRule: function(rule) {
-    var cssText = rule.style.cssText;
-    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content
-    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)
-    // don't replace attr rules
-    if (rule.style.content && !rule.style.content.match(/['"]+|attr/)) {
-      cssText = cssText.replace(/content:[^;]*;/g, 'content: \'' + 
-          rule.style.content + '\';');
-    }
-    // TODO(sorvell): we can workaround this issue here, but we need a list
-    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53
-    //
-    // inherit rules can be omitted from cssText
-    // TODO(sorvell): remove when Blink bug is fixed:
-    // https://code.google.com/p/chromium/issues/detail?id=358273
-    var style = rule.style;
-    for (var i in style) {
-      if (style[i] === 'initial') {
-        cssText += i + ': initial; ';
-      }
-    }
-    return cssText;
-  },
-  replaceTextInStyles: function(styles, action) {
-    if (styles && action) {
-      if (!(styles instanceof Array)) {
-        styles = [styles];
-      }
-      Array.prototype.forEach.call(styles, function(s) {
-        s.textContent = action.call(this, s.textContent);
-      }, this);
-    }
-  },
-  addCssToDocument: function(cssText, name) {
-    if (cssText.match('@import')) {
-      addOwnSheet(cssText, name);
-    } else {
-      addCssToDocument(cssText);
-    }
-  }
-};
-
-var selectorRe = /([^{]*)({[\s\S]*?})/gim,
-    cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
-    // TODO(sorvell): remove either content or comment
-    cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,
-    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*'([^']*)'[^}]*}([^{]*?){/gim,
-    // TODO(sorvell): remove either content or comment
-    cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
-    cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,
-    // TODO(sorvell): remove either content or comment
-    cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
-    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,
-    cssPseudoRe = /::(x-[^\s{,(]*)/gim,
-    cssPartRe = /::part\(([^)]*)\)/gim,
-    // note: :host pre-processed to -shadowcsshost.
-    polyfillHost = '-shadowcsshost',
-    // note: :host-context pre-processed to -shadowcsshostcontext.
-    polyfillHostContext = '-shadowcsscontext',
-    parenSuffix = ')(?:\\((' +
-        '(?:\\([^)(]*\\)|[^)(]*)+?' +
-        ')\\))?([^,{]*)';
-    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),
-    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),
-    selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$',
-    colonHostRe = /\:host/gim,
-    colonHostContextRe = /\:host-context/gim,
-    /* host name without combinator */
-    polyfillHostNoCombinator = polyfillHost + '-no-combinator',
-    polyfillHostRe = new RegExp(polyfillHost, 'gim'),
-    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),
-    combinatorsRe = [
-      /\^\^/g,
-      /\^/g,
-      /\/shadow\//g,
-      /\/shadow-deep\//g,
-      /::shadow/g,
-      /\/deep\//g
-    ];
-
-function stylesToCssText(styles, preserveComments) {
-  var cssText = '';
-  Array.prototype.forEach.call(styles, function(s) {
-    cssText += s.textContent + '\n\n';
-  });
-  // strip comments for easier processing
-  if (!preserveComments) {
-    cssText = cssText.replace(cssCommentRe, '');
-  }
-  return cssText;
-}
-
-function cssTextToStyle(cssText) {
-  var style = document.createElement('style');
-  style.textContent = cssText;
-  return style;
-}
-
-function cssToRules(cssText) {
-  var style = cssTextToStyle(cssText);
-  document.head.appendChild(style);
-  var rules = [];
-  if (style.sheet) {
-    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet
-    // with an @import
-    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013
-    try {
-      rules = style.sheet.cssRules;
-    } catch(e) {
-      //
-    }
-  } else {
-    console.warn('sheet not found', style);
-  }
-  style.parentNode.removeChild(style);
-  return rules;
-}
-
-var frame = document.createElement('iframe');
-frame.style.display = 'none';
-
-function initFrame() {
-  frame.initialized = true;
-  document.body.appendChild(frame);
-  var doc = frame.contentDocument;
-  var base = doc.createElement('base');
-  base.href = document.baseURI;
-  doc.head.appendChild(base);
-}
-
-function inFrame(fn) {
-  if (!frame.initialized) {
-    initFrame();
-  }
-  document.body.appendChild(frame);
-  fn(frame.contentDocument);
-  document.body.removeChild(frame);
-}
-
-// TODO(sorvell): use an iframe if the cssText contains an @import to workaround
-// https://code.google.com/p/chromium/issues/detail?id=345114
-var isChrome = navigator.userAgent.match('Chrome');
-function withCssRules(cssText, callback) {
-  if (!callback) {
-    return;
-  }
-  var rules;
-  if (cssText.match('@import') && isChrome) {
-    var style = cssTextToStyle(cssText);
-    inFrame(function(doc) {
-      doc.head.appendChild(style.impl);
-      rules = style.sheet.cssRules;
-      callback(rules);
-    });
-  } else {
-    rules = cssToRules(cssText);
-    callback(rules);
-  }
-}
-
-function rulesToCss(cssRules) {
-  for (var i=0, css=[]; i < cssRules.length; i++) {
-    css.push(cssRules[i].cssText);
-  }
-  return css.join('\n\n');
-}
-
-function addCssToDocument(cssText) {
-  if (cssText) {
-    getSheet().appendChild(document.createTextNode(cssText));
-  }
-}
-
-function addOwnSheet(cssText, name) {
-  var style = cssTextToStyle(cssText);
-  style.setAttribute(name, '');
-  style.setAttribute(SHIMMED_ATTRIBUTE, '');
-  document.head.appendChild(style);
-}
-
-var SHIM_ATTRIBUTE = 'shim-shadowdom';
-var SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';
-var NO_SHIM_ATTRIBUTE = 'no-shim';
-
-var sheet;
-function getSheet() {
-  if (!sheet) {
-    sheet = document.createElement("style");
-    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');
-    sheet[SHIMMED_ATTRIBUTE] = true;
-  }
-  return sheet;
-}
-
-// add polyfill stylesheet to document
-if (window.ShadowDOMPolyfill) {
-  addCssToDocument('style { display: none !important; }\n');
-  var doc = wrap(document);
-  var head = doc.querySelector('head');
-  head.insertBefore(getSheet(), head.childNodes[0]);
-
-  // TODO(sorvell): monkey-patching HTMLImports is abusive;
-  // consider a better solution.
-  document.addEventListener('DOMContentLoaded', function() {
-    var urlResolver = scope.urlResolver;
-    
-    if (window.HTMLImports && !HTMLImports.useNative) {
-      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +
-          '[' + SHIM_ATTRIBUTE + ']';
-      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';
-      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;
-      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;
-
-      HTMLImports.parser.documentSelectors = [
-        HTMLImports.parser.documentSelectors,
-        SHIM_SHEET_SELECTOR,
-        SHIM_STYLE_SELECTOR
-      ].join(',');
-  
-      var originalParseGeneric = HTMLImports.parser.parseGeneric;
-
-      HTMLImports.parser.parseGeneric = function(elt) {
-        if (elt[SHIMMED_ATTRIBUTE]) {
-          return;
-        }
-        var style = elt.__importElement || elt;
-        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {
-          originalParseGeneric.call(this, elt);
-          return;
-        }
-        if (elt.__resource) {
-          style = elt.ownerDocument.createElement('style');
-          style.textContent = urlResolver.resolveCssText(
-              elt.__resource, elt.href);
-        } else {
-          urlResolver.resolveStyle(style);  
-        }
-        style.textContent = ShadowCSS.shimStyle(style);
-        style.removeAttribute(SHIM_ATTRIBUTE, '');
-        style.setAttribute(SHIMMED_ATTRIBUTE, '');
-        style[SHIMMED_ATTRIBUTE] = true;
-        // place in document
-        if (style.parentNode !== head) {
-          // replace links in head
-          if (elt.parentNode === head) {
-            head.replaceChild(style, elt);
-          } else {
-            head.appendChild(style);
-          }
-        }
-        style.__importParsed = true;
-        this.markParsingComplete(elt);
-      }
-
-      var hasResource = HTMLImports.parser.hasResource;
-      HTMLImports.parser.hasResource = function(node) {
-        if (node.localName === 'link' && node.rel === 'stylesheet' &&
-            node.hasAttribute(SHIM_ATTRIBUTE)) {
-          return (node.__resource);
-        } else {
-          return hasResource.call(this, node);
-        }
-      }
-
-    }
-  });
-}
-
-// exports
-scope.ShadowCSS = ShadowCSS;
-
-})(window.Platform);
-} else {
-/*
- * 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.
- */
-(function() {
-
-  // poor man's adapter for template.content on various platform scenarios
-  window.templateContent = window.templateContent || function(inTemplate) {
-    return inTemplate.content;
-  };
-
-  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill
-
-  window.wrap = window.unwrap = function(n){
-    return n;
-  }
-  
-  addEventListener('DOMContentLoaded', function() {
-    if (CustomElements.useNative === false) {
-      var originalCreateShadowRoot = Element.prototype.createShadowRoot;
-      Element.prototype.createShadowRoot = function() {
-        var root = originalCreateShadowRoot.call(this);
-        CustomElements.watchShadow(this);
-        return root;
-      };
-    }
-  });
-  
-  window.templateContent = function(inTemplate) {
-    // if MDV exists, it may need to boostrap this template to reveal content
-    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
-      HTMLTemplateElement.bootstrap(inTemplate);
-    }
-    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no
-    // native template support
-    if (!inTemplate.content && !inTemplate._content) {
-      var frag = document.createDocumentFragment();
-      while (inTemplate.firstChild) {
-        frag.appendChild(inTemplate.firstChild);
-      }
-      inTemplate._content = frag;
-    }
-    return inTemplate.content || inTemplate._content;
-  };
-
-})();
-}
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-(function(scope) {
-  'use strict';
-
-  // feature detect for URL constructor
-  var hasWorkingUrl = false;
-  if (!scope.forceJURL) {
-    try {
-      var u = new URL('b', 'http://a');
-      hasWorkingUrl = u.href === 'http://a/b';
-    } catch(e) {}
-  }
-
-  if (hasWorkingUrl)
-    return;
-
-  var relative = Object.create(null);
-  relative['ftp'] = 21;
-  relative['file'] = 0;
-  relative['gopher'] = 70;
-  relative['http'] = 80;
-  relative['https'] = 443;
-  relative['ws'] = 80;
-  relative['wss'] = 443;
-
-  var relativePathDotMapping = Object.create(null);
-  relativePathDotMapping['%2e'] = '.';
-  relativePathDotMapping['.%2e'] = '..';
-  relativePathDotMapping['%2e.'] = '..';
-  relativePathDotMapping['%2e%2e'] = '..';
-
-  function isRelativeScheme(scheme) {
-    return relative[scheme] !== undefined;
-  }
-
-  function invalid() {
-    clear.call(this);
-    this._isInvalid = true;
-  }
-
-  function IDNAToASCII(h) {
-    if ('' == h) {
-      invalid.call(this)
-    }
-    // XXX
-    return h.toLowerCase()
-  }
-
-  function percentEscape(c) {
-    var unicode = c.charCodeAt(0);
-    if (unicode > 0x20 &&
-       unicode < 0x7F &&
-       // " # < > ? `
-       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1
-      ) {
-      return c;
-    }
-    return encodeURIComponent(c);
-  }
-
-  function percentEscapeQuery(c) {
-    // XXX This actually needs to encode c using encoding and then
-    // convert the bytes one-by-one.
-
-    var unicode = c.charCodeAt(0);
-    if (unicode > 0x20 &&
-       unicode < 0x7F &&
-       // " # < > ` (do not escape '?')
-       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1
-      ) {
-      return c;
-    }
-    return encodeURIComponent(c);
-  }
-
-  var EOF = undefined,
-      ALPHA = /[a-zA-Z]/,
-      ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;
-
-  function parse(input, stateOverride, base) {
-    function err(message) {
-      errors.push(message)
-    }
-
-    var state = stateOverride || 'scheme start',
-        cursor = 0,
-        buffer = '',
-        seenAt = false,
-        seenBracket = false,
-        errors = [];
-
-    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {
-      var c = input[cursor];
-      switch (state) {
-        case 'scheme start':
-          if (c && ALPHA.test(c)) {
-            buffer += c.toLowerCase(); // ASCII-safe
-            state = 'scheme';
-          } else if (!stateOverride) {
-            buffer = '';
-            state = 'no scheme';
-            continue;
-          } else {
-            err('Invalid scheme.');
-            break loop;
-          }
-          break;
-
-        case 'scheme':
-          if (c && ALPHANUMERIC.test(c)) {
-            buffer += c.toLowerCase(); // ASCII-safe
-          } else if (':' == c) {
-            this._scheme = buffer;
-            buffer = '';
-            if (stateOverride) {
-              break loop;
-            }
-            if (isRelativeScheme(this._scheme)) {
-              this._isRelative = true;
-            }
-            if ('file' == this._scheme) {
-              state = 'relative';
-            } else if (this._isRelative && base && base._scheme == this._scheme) {
-              state = 'relative or authority';
-            } else if (this._isRelative) {
-              state = 'authority first slash';
-            } else {
-              state = 'scheme data';
-            }
-          } else if (!stateOverride) {
-            buffer = '';
-            cursor = 0;
-            state = 'no scheme';
-            continue;
-          } else if (EOF == c) {
-            break loop;
-          } else {
-            err('Code point not allowed in scheme: ' + c)
-            break loop;
-          }
-          break;
-
-        case 'scheme data':
-          if ('?' == c) {
-            query = '?';
-            state = 'query';
-          } else if ('#' == c) {
-            this._fragment = '#';
-            state = 'fragment';
-          } else {
-            // XXX error handling
-            if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
-              this._schemeData += percentEscape(c);
-            }
-          }
-          break;
-
-        case 'no scheme':
-          if (!base || !(isRelativeScheme(base._scheme))) {
-            err('Missing scheme.');
-            invalid.call(this);
-          } else {
-            state = 'relative';
-            continue;
-          }
-          break;
-
-        case 'relative or authority':
-          if ('/' == c && '/' == input[cursor+1]) {
-            state = 'authority ignore slashes';
-          } else {
-            err('Expected /, got: ' + c);
-            state = 'relative';
-            continue
-          }
-          break;
-
-        case 'relative':
-          this._isRelative = true;
-          if ('file' != this._scheme)
-            this._scheme = base._scheme;
-          if (EOF == c) {
-            this._host = base._host;
-            this._port = base._port;
-            this._path = base._path.slice();
-            this._query = base._query;
-            break loop;
-          } else if ('/' == c || '\\' == c) {
-            if ('\\' == c)
-              err('\\ is an invalid code point.');
-            state = 'relative slash';
-          } else if ('?' == c) {
-            this._host = base._host;
-            this._port = base._port;
-            this._path = base._path.slice();
-            this._query = '?';
-            state = 'query';
-          } else if ('#' == c) {
-            this._host = base._host;
-            this._port = base._port;
-            this._path = base._path.slice();
-            this._query = base._query;
-            this._fragment = '#';
-            state = 'fragment';
-          } else {
-            var nextC = input[cursor+1]
-            var nextNextC = input[cursor+2]
-            if (
-              'file' != this._scheme || !ALPHA.test(c) ||
-              (nextC != ':' && nextC != '|') ||
-              (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {
-              this._host = base._host;
-              this._port = base._port;
-              this._path = base._path.slice();
-              this._path.pop();
-            }
-            state = 'relative path';
-            continue;
-          }
-          break;
-
-        case 'relative slash':
-          if ('/' == c || '\\' == c) {
-            if ('\\' == c) {
-              err('\\ is an invalid code point.');
-            }
-            if ('file' == this._scheme) {
-              state = 'file host';
-            } else {
-              state = 'authority ignore slashes';
-            }
-          } else {
-            if ('file' != this._scheme) {
-              this._host = base._host;
-              this._port = base._port;
-            }
-            state = 'relative path';
-            continue;
-          }
-          break;
-
-        case 'authority first slash':
-          if ('/' == c) {
-            state = 'authority second slash';
-          } else {
-            err("Expected '/', got: " + c);
-            state = 'authority ignore slashes';
-            continue;
-          }
-          break;
-
-        case 'authority second slash':
-          state = 'authority ignore slashes';
-          if ('/' != c) {
-            err("Expected '/', got: " + c);
-            continue;
-          }
-          break;
-
-        case 'authority ignore slashes':
-          if ('/' != c && '\\' != c) {
-            state = 'authority';
-            continue;
-          } else {
-            err('Expected authority, got: ' + c);
-          }
-          break;
-
-        case 'authority':
-          if ('@' == c) {
-            if (seenAt) {
-              err('@ already seen.');
-              buffer += '%40';
-            }
-            seenAt = true;
-            for (var i = 0; i < buffer.length; i++) {
-              var cp = buffer[i];
-              if ('\t' == cp || '\n' == cp || '\r' == cp) {
-                err('Invalid whitespace in authority.');
-                continue;
-              }
-              // XXX check URL code points
-              if (':' == cp && null === this._password) {
-                this._password = '';
-                continue;
-              }
-              var tempC = percentEscape(cp);
-              (null !== this._password) ? this._password += tempC : this._username += tempC;
-            }
-            buffer = '';
-          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
-            cursor -= buffer.length;
-            buffer = '';
-            state = 'host';
-            continue;
-          } else {
-            buffer += c;
-          }
-          break;
-
-        case 'file host':
-          if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
-            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {
-              state = 'relative path';
-            } else if (buffer.length == 0) {
-              state = 'relative path start';
-            } else {
-              this._host = IDNAToASCII.call(this, buffer);
-              buffer = '';
-              state = 'relative path start';
-            }
-            continue;
-          } else if ('\t' == c || '\n' == c || '\r' == c) {
-            err('Invalid whitespace in file host.');
-          } else {
-            buffer += c;
-          }
-          break;
-
-        case 'host':
-        case 'hostname':
-          if (':' == c && !seenBracket) {
-            // XXX host parsing
-            this._host = IDNAToASCII.call(this, buffer);
-            buffer = '';
-            state = 'port';
-            if ('hostname' == stateOverride) {
-              break loop;
-            }
-          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
-            this._host = IDNAToASCII.call(this, buffer);
-            buffer = '';
-            state = 'relative path start';
-            if (stateOverride) {
-              break loop;
-            }
-            continue;
-          } else if ('\t' != c && '\n' != c && '\r' != c) {
-            if ('[' == c) {
-              seenBracket = true;
-            } else if (']' == c) {
-              seenBracket = false;
-            }
-            buffer += c;
-          } else {
-            err('Invalid code point in host/hostname: ' + c);
-          }
-          break;
-
-        case 'port':
-          if (/[0-9]/.test(c)) {
-            buffer += c;
-          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) {
-            if ('' != buffer) {
-              var temp = parseInt(buffer, 10);
-              if (temp != relative[this._scheme]) {
-                this._port = temp + '';
-              }
-              buffer = '';
-            }
-            if (stateOverride) {
-              break loop;
-            }
-            state = 'relative path start';
-            continue;
-          } else if ('\t' == c || '\n' == c || '\r' == c) {
-            err('Invalid code point in port: ' + c);
-          } else {
-            invalid.call(this);
-          }
-          break;
-
-        case 'relative path start':
-          if ('\\' == c)
-            err("'\\' not allowed in path.");
-          state = 'relative path';
-          if ('/' != c && '\\' != c) {
-            continue;
-          }
-          break;
-
-        case 'relative path':
-          if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) {
-            if ('\\' == c) {
-              err('\\ not allowed in relative path.');
-            }
-            var tmp;
-            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {
-              buffer = tmp;
-            }
-            if ('..' == buffer) {
-              this._path.pop();
-              if ('/' != c && '\\' != c) {
-                this._path.push('');
-              }
-            } else if ('.' == buffer && '/' != c && '\\' != c) {
-              this._path.push('');
-            } else if ('.' != buffer) {
-              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {
-                buffer = buffer[0] + ':';
-              }
-              this._path.push(buffer);
-            }
-            buffer = '';
-            if ('?' == c) {
-              this._query = '?';
-              state = 'query';
-            } else if ('#' == c) {
-              this._fragment = '#';
-              state = 'fragment';
-            }
-          } else if ('\t' != c && '\n' != c && '\r' != c) {
-            buffer += percentEscape(c);
-          }
-          break;
-
-        case 'query':
-          if (!stateOverride && '#' == c) {
-            this._fragment = '#';
-            state = 'fragment';
-          } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
-            this._query += percentEscapeQuery(c);
-          }
-          break;
-
-        case 'fragment':
-          if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
-            this._fragment += c;
-          }
-          break;
-      }
-
-      cursor++;
-    }
-  }
-
-  function clear() {
-    this._scheme = '';
-    this._schemeData = '';
-    this._username = '';
-    this._password = null;
-    this._host = '';
-    this._port = '';
-    this._path = [];
-    this._query = '';
-    this._fragment = '';
-    this._isInvalid = false;
-    this._isRelative = false;
-  }
-
-  // Does not process domain names or IP addresses.
-  // Does not handle encoding for the query parameter.
-  function jURL(url, base /* , encoding */) {
-    if (base !== undefined && !(base instanceof jURL))
-      base = new jURL(String(base));
-
-    this._url = url;
-    clear.call(this);
-
-    var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, '');
-    // encoding = encoding || 'utf-8'
-
-    parse.call(this, input, null, base);
-  }
-
-  jURL.prototype = {
-    get href() {
-      if (this._isInvalid)
-        return this._url;
-
-      var authority = '';
-      if ('' != this._username || null != this._password) {
-        authority = this._username +
-            (null != this._password ? ':' + this._password : '') + '@';
-      }
-
-      return this.protocol +
-          (this._isRelative ? '//' + authority + this.host : '') +
-          this.pathname + this._query + this._fragment;
-    },
-    set href(href) {
-      clear.call(this);
-      parse.call(this, href);
-    },
-
-    get protocol() {
-      return this._scheme + ':';
-    },
-    set protocol(protocol) {
-      if (this._isInvalid)
-        return;
-      parse.call(this, protocol + ':', 'scheme start');
-    },
-
-    get host() {
-      return this._isInvalid ? '' : this._port ?
-          this._host + ':' + this._port : this._host;
-    },
-    set host(host) {
-      if (this._isInvalid || !this._isRelative)
-        return;
-      parse.call(this, host, 'host');
-    },
-
-    get hostname() {
-      return this._host;
-    },
-    set hostname(hostname) {
-      if (this._isInvalid || !this._isRelative)
-        return;
-      parse.call(this, hostname, 'hostname');
-    },
-
-    get port() {
-      return this._port;
-    },
-    set port(port) {
-      if (this._isInvalid || !this._isRelative)
-        return;
-      parse.call(this, port, 'port');
-    },
-
-    get pathname() {
-      return this._isInvalid ? '' : this._isRelative ?
-          '/' + this._path.join('/') : this._schemeData;
-    },
-    set pathname(pathname) {
-      if (this._isInvalid || !this._isRelative)
-        return;
-      this._path = [];
-      parse.call(this, pathname, 'relative path start');
-    },
-
-    get search() {
-      return this._isInvalid || !this._query || '?' == this._query ?
-          '' : this._query;
-    },
-    set search(search) {
-      if (this._isInvalid || !this._isRelative)
-        return;
-      this._query = '?';
-      if ('?' == search[0])
-        search = search.slice(1);
-      parse.call(this, search, 'query');
-    },
-
-    get hash() {
-      return this._isInvalid || !this._fragment || '#' == this._fragment ?
-          '' : this._fragment;
-    },
-    set hash(hash) {
-      if (this._isInvalid)
-        return;
-      this._fragment = '#';
-      if ('#' == hash[0])
-        hash = hash.slice(1);
-      parse.call(this, hash, 'fragment');
-    }
-  };
-
-  scope.URL = jURL;
-
-})(window);
-
-/*
- * 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.
- */
-
-(function(scope) {
-
-// Old versions of iOS do not have bind.
-
-if (!Function.prototype.bind) {
-  Function.prototype.bind = function(scope) {
-    var self = this;
-    var args = Array.prototype.slice.call(arguments, 1);
-    return function() {
-      var args2 = args.slice();
-      args2.push.apply(args2, arguments);
-      return self.apply(scope, args2);
-    };
-  };
-}
-
-// mixin
-
-// copy all properties from inProps (et al) to inObj
-function mixin(inObj/*, inProps, inMoreProps, ...*/) {
-  var obj = inObj || {};
-  for (var i = 1; i < arguments.length; i++) {
-    var p = arguments[i];
-    try {
-      for (var n in p) {
-        copyProperty(n, p, obj);
-      }
-    } catch(x) {
-    }
-  }
-  return obj;
-}
-
-// copy property inName from inSource object to inTarget object
-function copyProperty(inName, inSource, inTarget) {
-  var pd = getPropertyDescriptor(inSource, inName);
-  Object.defineProperty(inTarget, inName, pd);
-}
-
-// get property descriptor for inName on inObject, even if
-// inName exists on some link in inObject's prototype chain
-function getPropertyDescriptor(inObject, inName) {
-  if (inObject) {
-    var pd = Object.getOwnPropertyDescriptor(inObject, inName);
-    return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);
-  }
-}
-
-// export
-
-scope.mixin = mixin;
-
-})(window.Platform);
-// Copyright 2011 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope) {
-
-  'use strict';
-
-  // polyfill DOMTokenList
-  // * add/remove: allow these methods to take multiple classNames
-  // * toggle: add a 2nd argument which forces the given state rather
-  //  than toggling.
-
-  var add = DOMTokenList.prototype.add;
-  var remove = DOMTokenList.prototype.remove;
-  DOMTokenList.prototype.add = function() {
-    for (var i = 0; i < arguments.length; i++) {
-      add.call(this, arguments[i]);
-    }
-  };
-  DOMTokenList.prototype.remove = function() {
-    for (var i = 0; i < arguments.length; i++) {
-      remove.call(this, arguments[i]);
-    }
-  };
-  DOMTokenList.prototype.toggle = function(name, bool) {
-    if (arguments.length == 1) {
-      bool = !this.contains(name);
-    }
-    bool ? this.add(name) : this.remove(name);
-  };
-  DOMTokenList.prototype.switch = function(oldName, newName) {
-    oldName && this.remove(oldName);
-    newName && this.add(newName);
-  };
-
-  // add array() to NodeList, NamedNodeMap, HTMLCollection
-
-  var ArraySlice = function() {
-    return Array.prototype.slice.call(this);
-  };
-
-  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});
-
-  NodeList.prototype.array = ArraySlice;
-  namedNodeMap.prototype.array = ArraySlice;
-  HTMLCollection.prototype.array = ArraySlice;
-
-  // polyfill performance.now
-
-  if (!window.performance) {
-    var start = Date.now();
-    // only at millisecond precision
-    window.performance = {now: function(){ return Date.now() - start }};
-  }
-
-  // polyfill for requestAnimationFrame
-
-  if (!window.requestAnimationFrame) {
-    window.requestAnimationFrame = (function() {
-      var nativeRaf = window.webkitRequestAnimationFrame ||
-        window.mozRequestAnimationFrame;
-
-      return nativeRaf ?
-        function(callback) {
-          return nativeRaf(function() {
-            callback(performance.now());
-          });
-        } :
-        function( callback ){
-          return window.setTimeout(callback, 1000 / 60);
-        };
-    })();
-  }
-
-  if (!window.cancelAnimationFrame) {
-    window.cancelAnimationFrame = (function() {
-      return  window.webkitCancelAnimationFrame ||
-        window.mozCancelAnimationFrame ||
-        function(id) {
-          clearTimeout(id);
-        };
-    })();
-  }
-
-  // utility
-
-  function createDOM(inTagOrNode, inHTML, inAttrs) {
-    var dom = typeof inTagOrNode == 'string' ?
-        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);
-    dom.innerHTML = inHTML;
-    if (inAttrs) {
-      for (var n in inAttrs) {
-        dom.setAttribute(n, inAttrs[n]);
-      }
-    }
-    return dom;
-  }
-  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports
-  // polyfill, scripts in the main document run before imports. That means
-  // if (1) polymer is imported and (2) Polymer() is called in the main document
-  // in a script after the import, 2 occurs before 1. We correct this here
-  // by specfiically patching Polymer(); this is not necessary under native
-  // HTMLImports.
-  var elementDeclarations = [];
-
-  var polymerStub = function(name, dictionary) {
-    elementDeclarations.push(arguments);
-  }
-  window.Polymer = polymerStub;
-
-  // deliver queued delcarations
-  scope.deliverDeclarations = function() {
-    scope.deliverDeclarations = function() {
-     throw 'Possible attempt to load Polymer twice';
-    };
-    return elementDeclarations;
-  }
-
-  // Once DOMContent has loaded, any main document scripts that depend on
-  // Polymer() should have run. Calling Polymer() now is an error until
-  // polymer is imported.
-  window.addEventListener('DOMContentLoaded', function() {
-    if (window.Polymer === polymerStub) {
-      window.Polymer = function() {
-        console.error('You tried to use polymer without loading it first. To ' +
-          'load polymer, <link rel="import" href="' + 
-          'components/polymer/polymer.html">');
-      };
-    }
-  });
-
-  // exports
-  scope.createDOM = createDOM;
-
-})(window.Platform);
-
-/*
- * 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.
- */
-
-// poor man's adapter for template.content on various platform scenarios
-window.templateContent = window.templateContent || function(inTemplate) {
-  return inTemplate.content;
-};
-(function(scope) {
-  
-  scope = scope || (window.Inspector = {});
-  
-  var inspector;
-
-  window.sinspect = function(inNode, inProxy) {
-    if (!inspector) {
-      inspector = window.open('', 'ShadowDOM Inspector', null, true);
-      inspector.document.write(inspectorHTML);
-      //inspector.document.close();
-      inspector.api = {
-        shadowize: shadowize
-      };
-    }
-    inspect(inNode || wrap(document.body), inProxy);
-  };
-
-  var inspectorHTML = [
-    '<!DOCTYPE html>',
-    '<html>',
-    '  <head>',
-    '    <title>ShadowDOM Inspector</title>',
-    '    <style>',
-    '      body {',
-    '      }',
-    '      pre {',
-    '        font: 9pt "Courier New", monospace;',
-    '        line-height: 1.5em;',
-    '      }',
-    '      tag {',
-    '        color: purple;',
-    '      }',
-    '      ul {',
-    '         margin: 0;',
-    '         padding: 0;',
-    '         list-style: none;',
-    '      }',
-    '      li {',
-    '         display: inline-block;',
-    '         background-color: #f1f1f1;',
-    '         padding: 4px 6px;',
-    '         border-radius: 4px;',
-    '         margin-right: 4px;',
-    '      }',
-    '    </style>',
-    '  </head>',
-    '  <body>',
-    '    <ul id="crumbs">',
-    '    </ul>',
-    '    <div id="tree"></div>',
-    '  </body>',
-    '</html>'
-  ].join('\n');
-  
-  var crumbs = [];
-
-  var displayCrumbs = function() {
-    // alias our document
-    var d = inspector.document;
-    // get crumbbar
-    var cb = d.querySelector('#crumbs');
-    // clear crumbs
-    cb.textContent = '';
-    // build new crumbs
-    for (var i=0, c; c=crumbs[i]; i++) {
-      var a = d.createElement('a');
-      a.href = '#';
-      a.textContent = c.localName;
-      a.idx = i;
-      a.onclick = function(event) {
-        var c;
-        while (crumbs.length > this.idx) {
-          c = crumbs.pop();
-        }
-        inspect(c.shadow || c, c);
-        event.preventDefault();
-      };
-      cb.appendChild(d.createElement('li')).appendChild(a);
-    }
-  };
-
-  var inspect = function(inNode, inProxy) {
-    // alias our document
-    var d = inspector.document;
-    // reset list of drillable nodes
-    drillable = [];
-    // memoize our crumb proxy
-    var proxy = inProxy || inNode;
-    crumbs.push(proxy);
-    // update crumbs
-    displayCrumbs();
-    // reflect local tree
-    d.body.querySelector('#tree').innerHTML =
-        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';
-  };
-
-  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-
-  var blacklisted = {STYLE:1, SCRIPT:1, "#comment": 1, TEMPLATE: 1};
-  var blacklist = function(inNode) {
-    return blacklisted[inNode.nodeName];
-  };
-
-  var output = function(inNode, inChildNodes, inIndent) {
-    if (blacklist(inNode)) {
-      return '';
-    }
-    var indent = inIndent || '';
-    if (inNode.localName || inNode.nodeType == 11) {
-      var name = inNode.localName || 'shadow-root';
-      //inChildNodes = ShadowDOM.localNodes(inNode);
-      var info = indent + describe(inNode);
-      // if only textNodes
-      // TODO(sjmiles): make correct for ShadowDOM
-      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {
-        info += catTextContent(inChildNodes);
-      } else*/ {
-        // TODO(sjmiles): native <shadow> has no reference to its projection
-        if (name == 'content' /*|| name == 'shadow'*/) {
-          inChildNodes = inNode.getDistributedNodes();
-        }
-        info += '<br/>';
-        var ind = indent + '&nbsp;&nbsp;';
-        forEach(inChildNodes, function(n) {
-          info += output(n, n.childNodes, ind);
-        });
-        info += indent;
-      }
-      if (!({br:1}[name])) {
-        info += '<tag>&lt;/' + name + '&gt;</tag>';
-        info += '<br/>';
-      }
-    } else {
-      var text = inNode.textContent.trim();
-      info = text ? indent + '"' + text + '"' + '<br/>' : '';
-    }
-    return info;
-  };
-
-  var catTextContent = function(inChildNodes) {
-    var info = '';
-    forEach(inChildNodes, function(n) {
-      info += n.textContent.trim();
-    });
-    return info;
-  };
-
-  var drillable = [];
-
-  var describe = function(inNode) {
-    var tag = '<tag>' + '&lt;';
-    var name = inNode.localName || 'shadow-root';
-    if (inNode.webkitShadowRoot || inNode.shadowRoot) {
-      tag += ' <button idx="' + drillable.length +
-        '" onclick="api.shadowize.call(this)">' + name + '</button>';
-      drillable.push(inNode);
-    } else {
-      tag += name || 'shadow-root';
-    }
-    if (inNode.attributes) {
-      forEach(inNode.attributes, function(a) {
-        tag += ' ' + a.name + (a.value ? '="' + a.value + '"' : '');
-      });
-    }
-    tag += '&gt;'+ '</tag>';
-    return tag;
-  };
-
-  // remote api
-
-  shadowize = function() {
-    var idx = Number(this.attributes.idx.value);
-    //alert(idx);
-    var node = drillable[idx];
-    if (node) {
-      inspect(node.webkitShadowRoot || node.shadowRoot, node)
-    } else {
-      console.log("bad shadowize node");
-      console.dir(this);
-    }
-  };
-  
-  // export
-  
-  scope.output = output;
-  
-})(window.Inspector);
-
-
-
-/*
- * 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.
- */
-(function(scope) {
-
-  // TODO(sorvell): It's desireable to provide a default stylesheet 
-  // that's convenient for styling unresolved elements, but
-  // it's cumbersome to have to include this manually in every page.
-  // It would make sense to put inside some HTMLImport but 
-  // the HTMLImports polyfill does not allow loading of stylesheets 
-  // that block rendering. Therefore this injection is tolerated here.
-
-  var style = document.createElement('style');
-  style.textContent = ''
-      + 'body {'
-      + 'transition: opacity ease-in 0.2s;' 
-      + ' } \n'
-      + 'body[unresolved] {'
-      + 'opacity: 0; display: block; overflow: hidden;' 
-      + ' } \n'
-      ;
-  var head = document.querySelector('head');
-  head.insertBefore(style, head.firstChild);
-
-})(Platform);
-
-(function(scope) {
-
-  function withDependencies(task, depends) {
-    depends = depends || [];
-    if (!depends.map) {
-      depends = [depends];
-    }
-    return task.apply(this, depends.map(marshal));
-  }
-
-  function module(name, dependsOrFactory, moduleFactory) {
-    var module;
-    switch (arguments.length) {
-      case 0:
-        return;
-      case 1:
-        module = null;
-        break;
-      case 2:
-        module = dependsOrFactory.apply(this);
-        break;
-      default:
-        module = withDependencies(moduleFactory, dependsOrFactory);
-        break;
-    }
-    modules[name] = module;
-  };
-
-  function marshal(name) {
-    return modules[name];
-  }
-
-  var modules = {};
-
-  function using(depends, task) {
-    HTMLImports.whenImportsReady(function() {
-      withDependencies(task, depends);
-    });
-  };
-
-  // exports
-
-  scope.marshal = marshal;
-  scope.module = module;
-  scope.using = using;
-
-})(window);
-/*
- * 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.
- */
-(function(scope) {
-
-var iterations = 0;
-var callbacks = [];
-var twiddle = document.createTextNode('');
-
-function endOfMicrotask(callback) {
-  twiddle.textContent = iterations++;
-  callbacks.push(callback);
-}
-
-function atEndOfMicrotask() {
-  while (callbacks.length) {
-    callbacks.shift()();
-  }
-}
-
-new (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)
-  .observe(twiddle, {characterData: true})
-  ;
-
-// exports
-
-scope.endOfMicrotask = endOfMicrotask;
-
-})(Platform);
-
-
-/*
- * 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.
- */
-
-(function(scope) {
-
-var urlResolver = {
-  resolveDom: function(root, url) {
-    url = url || root.ownerDocument.baseURI;
-    this.resolveAttributes(root, url);
-    this.resolveStyles(root, url);
-    // handle template.content
-    var templates = root.querySelectorAll('template');
-    if (templates) {
-      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {
-        if (t.content) {
-          this.resolveDom(t.content, url);
-        }
-      }
-    }
-  },
-  resolveTemplate: function(template) {
-    this.resolveDom(template.content, template.ownerDocument.baseURI);
-  },
-  resolveStyles: function(root, url) {
-    var styles = root.querySelectorAll('style');
-    if (styles) {
-      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {
-        this.resolveStyle(s, url);
-      }
-    }
-  },
-  resolveStyle: function(style, url) {
-    url = url || style.ownerDocument.baseURI;
-    style.textContent = this.resolveCssText(style.textContent, url);
-  },
-  resolveCssText: function(cssText, baseUrl) {
-    cssText = replaceUrlsInCssText(cssText, baseUrl, CSS_URL_REGEXP);
-    return replaceUrlsInCssText(cssText, baseUrl, CSS_IMPORT_REGEXP);
-  },
-  resolveAttributes: function(root, url) {
-    if (root.hasAttributes && root.hasAttributes()) {
-      this.resolveElementAttributes(root, url);
-    }
-    // search for attributes that host urls
-    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);
-    if (nodes) {
-      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {
-        this.resolveElementAttributes(n, url);
-      }
-    }
-  },
-  resolveElementAttributes: function(node, url) {
-    url = url || node.ownerDocument.baseURI;
-    URL_ATTRS.forEach(function(v) {
-      var attr = node.attributes[v];
-      if (attr && attr.value &&
-         (attr.value.search(URL_TEMPLATE_SEARCH) < 0)) {
-        var urlPath = resolveRelativeUrl(url, attr.value);
-        attr.value = urlPath;
-      }
-    });
-  }
-};
-
-var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
-var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
-var URL_ATTRS = ['href', 'src', 'action'];
-var URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';
-var URL_TEMPLATE_SEARCH = '{{.*}}';
-
-function replaceUrlsInCssText(cssText, baseUrl, regexp) {
-  return cssText.replace(regexp, function(m, pre, url, post) {
-    var urlPath = url.replace(/["']/g, '');
-    urlPath = resolveRelativeUrl(baseUrl, urlPath);
-    return pre + '\'' + urlPath + '\'' + post;
-  });
-}
-
-function resolveRelativeUrl(baseUrl, url) {
-  var u = new URL(url, baseUrl);
-  return makeDocumentRelPath(u.href);
-}
-
-function makeDocumentRelPath(url) {
-  var root = document.baseURI;
-  var u = new URL(url, root);
-  if (u.host === root.host && u.port === root.port &&
-      u.protocol === root.protocol) {
-    return makeRelPath(root.pathname, u.pathname);
-  } else {
-    return url;
-  }
-}
-
-// make a relative path from source to target
-function makeRelPath(source, target) {
-  var s = source.split('/');
-  var t = target.split('/');
-  while (s.length && s[0] === t[0]){
-    s.shift();
-    t.shift();
-  }
-  for (var i = 0, l = s.length - 1; i < l; i++) {
-    t.unshift('..');
-  }
-  return t.join('/');
-}
-
-// exports
-scope.urlResolver = urlResolver;
-
-})(Platform);
-
-/*
- * Copyright 2012 The Polymer Authors. All rights reserved.
- * Use of this source code is goverened by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-(function(global) {
-
-  var registrationsTable = new WeakMap();
-
-  // We use setImmediate or postMessage for our future callback.
-  var setImmediate = window.msSetImmediate;
-
-  // Use post message to emulate setImmediate.
-  if (!setImmediate) {
-    var setImmediateQueue = [];
-    var sentinel = String(Math.random());
-    window.addEventListener('message', function(e) {
-      if (e.data === sentinel) {
-        var queue = setImmediateQueue;
-        setImmediateQueue = [];
-        queue.forEach(function(func) {
-          func();
-        });
-      }
-    });
-    setImmediate = function(func) {
-      setImmediateQueue.push(func);
-      window.postMessage(sentinel, '*');
-    };
-  }
-
-  // This is used to ensure that we never schedule 2 callas to setImmediate
-  var isScheduled = false;
-
-  // Keep track of observers that needs to be notified next time.
-  var scheduledObservers = [];
-
-  /**
-   * Schedules |dispatchCallback| to be called in the future.
-   * @param {MutationObserver} observer
-   */
-  function scheduleCallback(observer) {
-    scheduledObservers.push(observer);
-    if (!isScheduled) {
-      isScheduled = true;
-      setImmediate(dispatchCallbacks);
-    }
-  }
-
-  function wrapIfNeeded(node) {
-    return window.ShadowDOMPolyfill &&
-        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||
-        node;
-  }
-
-  function dispatchCallbacks() {
-    // http://dom.spec.whatwg.org/#mutation-observers
-
-    isScheduled = false; // Used to allow a new setImmediate call above.
-
-    var observers = scheduledObservers;
-    scheduledObservers = [];
-    // Sort observers based on their creation UID (incremental).
-    observers.sort(function(o1, o2) {
-      return o1.uid_ - o2.uid_;
-    });
-
-    var anyNonEmpty = false;
-    observers.forEach(function(observer) {
-
-      // 2.1, 2.2
-      var queue = observer.takeRecords();
-      // 2.3. Remove all transient registered observers whose observer is mo.
-      removeTransientObserversFor(observer);
-
-      // 2.4
-      if (queue.length) {
-        observer.callback_(queue, observer);
-        anyNonEmpty = true;
-      }
-    });
-
-    // 3.
-    if (anyNonEmpty)
-      dispatchCallbacks();
-  }
-
-  function removeTransientObserversFor(observer) {
-    observer.nodes_.forEach(function(node) {
-      var registrations = registrationsTable.get(node);
-      if (!registrations)
-        return;
-      registrations.forEach(function(registration) {
-        if (registration.observer === observer)
-          registration.removeTransientObservers();
-      });
-    });
-  }
-
-  /**
-   * This function is used for the "For each registered observer observer (with
-   * observer's options as options) in target's list of registered observers,
-   * run these substeps:" and the "For each ancestor ancestor of target, and for
-   * each registered observer observer (with options options) in ancestor's list
-   * of registered observers, run these substeps:" part of the algorithms. The
-   * |options.subtree| is checked to ensure that the callback is called
-   * correctly.
-   *
-   * @param {Node} target
-   * @param {function(MutationObserverInit):MutationRecord} callback
-   */
-  function forEachAncestorAndObserverEnqueueRecord(target, callback) {
-    for (var node = target; node; node = node.parentNode) {
-      var registrations = registrationsTable.get(node);
-
-      if (registrations) {
-        for (var j = 0; j < registrations.length; j++) {
-          var registration = registrations[j];
-          var options = registration.options;
-
-          // Only target ignores subtree.
-          if (node !== target && !options.subtree)
-            continue;
-
-          var record = callback(options);
-          if (record)
-            registration.enqueue(record);
-        }
-      }
-    }
-  }
-
-  var uidCounter = 0;
-
-  /**
-   * The class that maps to the DOM MutationObserver interface.
-   * @param {Function} callback.
-   * @constructor
-   */
-  function JsMutationObserver(callback) {
-    this.callback_ = callback;
-    this.nodes_ = [];
-    this.records_ = [];
-    this.uid_ = ++uidCounter;
-  }
-
-  JsMutationObserver.prototype = {
-    observe: function(target, options) {
-      target = wrapIfNeeded(target);
-
-      // 1.1
-      if (!options.childList && !options.attributes && !options.characterData ||
-
-          // 1.2
-          options.attributeOldValue && !options.attributes ||
-
-          // 1.3
-          options.attributeFilter && options.attributeFilter.length &&
-              !options.attributes ||
-
-          // 1.4
-          options.characterDataOldValue && !options.characterData) {
-
-        throw new SyntaxError();
-      }
-
-      var registrations = registrationsTable.get(target);
-      if (!registrations)
-        registrationsTable.set(target, registrations = []);
-
-      // 2
-      // If target's list of registered observers already includes a registered
-      // observer associated with the context object, replace that registered
-      // observer's options with options.
-      var registration;
-      for (var i = 0; i < registrations.length; i++) {
-        if (registrations[i].observer === this) {
-          registration = registrations[i];
-          registration.removeListeners();
-          registration.options = options;
-          break;
-        }
-      }
-
-      // 3.
-      // Otherwise, add a new registered observer to target's list of registered
-      // observers with the context object as the observer and options as the
-      // options, and add target to context object's list of nodes on which it
-      // is registered.
-      if (!registration) {
-        registration = new Registration(this, target, options);
-        registrations.push(registration);
-        this.nodes_.push(target);
-      }
-
-      registration.addListeners();
-    },
-
-    disconnect: function() {
-      this.nodes_.forEach(function(node) {
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          var registration = registrations[i];
-          if (registration.observer === this) {
-            registration.removeListeners();
-            registrations.splice(i, 1);
-            // Each node can only have one registered observer associated with
-            // this observer.
-            break;
-          }
-        }
-      }, this);
-      this.records_ = [];
-    },
-
-    takeRecords: function() {
-      var copyOfRecords = this.records_;
-      this.records_ = [];
-      return copyOfRecords;
-    }
-  };
-
-  /**
-   * @param {string} type
-   * @param {Node} target
-   * @constructor
-   */
-  function MutationRecord(type, target) {
-    this.type = type;
-    this.target = target;
-    this.addedNodes = [];
-    this.removedNodes = [];
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.attributeName = null;
-    this.attributeNamespace = null;
-    this.oldValue = null;
-  }
-
-  function copyMutationRecord(original) {
-    var record = new MutationRecord(original.type, original.target);
-    record.addedNodes = original.addedNodes.slice();
-    record.removedNodes = original.removedNodes.slice();
-    record.previousSibling = original.previousSibling;
-    record.nextSibling = original.nextSibling;
-    record.attributeName = original.attributeName;
-    record.attributeNamespace = original.attributeNamespace;
-    record.oldValue = original.oldValue;
-    return record;
-  };
-
-  // We keep track of the two (possibly one) records used in a single mutation.
-  var currentRecord, recordWithOldValue;
-
-  /**
-   * Creates a record without |oldValue| and caches it as |currentRecord| for
-   * later use.
-   * @param {string} oldValue
-   * @return {MutationRecord}
-   */
-  function getRecord(type, target) {
-    return currentRecord = new MutationRecord(type, target);
-  }
-
-  /**
-   * Gets or creates a record with |oldValue| based in the |currentRecord|
-   * @param {string} oldValue
-   * @return {MutationRecord}
-   */
-  function getRecordWithOldValue(oldValue) {
-    if (recordWithOldValue)
-      return recordWithOldValue;
-    recordWithOldValue = copyMutationRecord(currentRecord);
-    recordWithOldValue.oldValue = oldValue;
-    return recordWithOldValue;
-  }
-
-  function clearRecords() {
-    currentRecord = recordWithOldValue = undefined;
-  }
-
-  /**
-   * @param {MutationRecord} record
-   * @return {boolean} Whether the record represents a record from the current
-   * mutation event.
-   */
-  function recordRepresentsCurrentMutation(record) {
-    return record === recordWithOldValue || record === currentRecord;
-  }
-
-  /**
-   * Selects which record, if any, to replace the last record in the queue.
-   * This returns |null| if no record should be replaced.
-   *
-   * @param {MutationRecord} lastRecord
-   * @param {MutationRecord} newRecord
-   * @param {MutationRecord}
-   */
-  function selectRecord(lastRecord, newRecord) {
-    if (lastRecord === newRecord)
-      return lastRecord;
-
-    // Check if the the record we are adding represents the same record. If
-    // so, we keep the one with the oldValue in it.
-    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))
-      return recordWithOldValue;
-
-    return null;
-  }
-
-  /**
-   * Class used to represent a registered observer.
-   * @param {MutationObserver} observer
-   * @param {Node} target
-   * @param {MutationObserverInit} options
-   * @constructor
-   */
-  function Registration(observer, target, options) {
-    this.observer = observer;
-    this.target = target;
-    this.options = options;
-    this.transientObservedNodes = [];
-  }
-
-  Registration.prototype = {
-    enqueue: function(record) {
-      var records = this.observer.records_;
-      var length = records.length;
-
-      // There are cases where we replace the last record with the new record.
-      // For example if the record represents the same mutation we need to use
-      // the one with the oldValue. If we get same record (this can happen as we
-      // walk up the tree) we ignore the new record.
-      if (records.length > 0) {
-        var lastRecord = records[length - 1];
-        var recordToReplaceLast = selectRecord(lastRecord, record);
-        if (recordToReplaceLast) {
-          records[length - 1] = recordToReplaceLast;
-          return;
-        }
-      } else {
-        scheduleCallback(this.observer);
-      }
-
-      records[length] = record;
-    },
-
-    addListeners: function() {
-      this.addListeners_(this.target);
-    },
-
-    addListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes)
-        node.addEventListener('DOMAttrModified', this, true);
-
-      if (options.characterData)
-        node.addEventListener('DOMCharacterDataModified', this, true);
-
-      if (options.childList)
-        node.addEventListener('DOMNodeInserted', this, true);
-
-      if (options.childList || options.subtree)
-        node.addEventListener('DOMNodeRemoved', this, true);
-    },
-
-    removeListeners: function() {
-      this.removeListeners_(this.target);
-    },
-
-    removeListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes)
-        node.removeEventListener('DOMAttrModified', this, true);
-
-      if (options.characterData)
-        node.removeEventListener('DOMCharacterDataModified', this, true);
-
-      if (options.childList)
-        node.removeEventListener('DOMNodeInserted', this, true);
-
-      if (options.childList || options.subtree)
-        node.removeEventListener('DOMNodeRemoved', this, true);
-    },
-
-    /**
-     * Adds a transient observer on node. The transient observer gets removed
-     * next time we deliver the change records.
-     * @param {Node} node
-     */
-    addTransientObserver: function(node) {
-      // Don't add transient observers on the target itself. We already have all
-      // the required listeners set up on the target.
-      if (node === this.target)
-        return;
-
-      this.addListeners_(node);
-      this.transientObservedNodes.push(node);
-      var registrations = registrationsTable.get(node);
-      if (!registrations)
-        registrationsTable.set(node, registrations = []);
-
-      // We know that registrations does not contain this because we already
-      // checked if node === this.target.
-      registrations.push(this);
-    },
-
-    removeTransientObservers: function() {
-      var transientObservedNodes = this.transientObservedNodes;
-      this.transientObservedNodes = [];
-
-      transientObservedNodes.forEach(function(node) {
-        // Transient observers are never added to the target.
-        this.removeListeners_(node);
-
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          if (registrations[i] === this) {
-            registrations.splice(i, 1);
-            // Each node can only have one registered observer associated with
-            // this observer.
-            break;
-          }
-        }
-      }, this);
-    },
-
-    handleEvent: function(e) {
-      // Stop propagation since we are managing the propagation manually.
-      // This means that other mutation events on the page will not work
-      // correctly but that is by design.
-      e.stopImmediatePropagation();
-
-      switch (e.type) {
-        case 'DOMAttrModified':
-          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes
-
-          var name = e.attrName;
-          var namespace = e.relatedNode.namespaceURI;
-          var target = e.target;
-
-          // 1.
-          var record = new getRecord('attributes', target);
-          record.attributeName = name;
-          record.attributeNamespace = namespace;
-
-          // 2.
-          var oldValue =
-              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
-
-          forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-            // 3.1, 4.2
-            if (!options.attributes)
-              return;
-
-            // 3.2, 4.3
-            if (options.attributeFilter && options.attributeFilter.length &&
-                options.attributeFilter.indexOf(name) === -1 &&
-                options.attributeFilter.indexOf(namespace) === -1) {
-              return;
-            }
-            // 3.3, 4.4
-            if (options.attributeOldValue)
-              return getRecordWithOldValue(oldValue);
-
-            // 3.4, 4.5
-            return record;
-          });
-
-          break;
-
-        case 'DOMCharacterDataModified':
-          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata
-          var target = e.target;
-
-          // 1.
-          var record = getRecord('characterData', target);
-
-          // 2.
-          var oldValue = e.prevValue;
-
-
-          forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-            // 3.1, 4.2
-            if (!options.characterData)
-              return;
-
-            // 3.2, 4.3
-            if (options.characterDataOldValue)
-              return getRecordWithOldValue(oldValue);
-
-            // 3.3, 4.4
-            return record;
-          });
-
-          break;
-
-        case 'DOMNodeRemoved':
-          this.addTransientObserver(e.target);
-          // Fall through.
-        case 'DOMNodeInserted':
-          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist
-          var target = e.relatedNode;
-          var changedNode = e.target;
-          var addedNodes, removedNodes;
-          if (e.type === 'DOMNodeInserted') {
-            addedNodes = [changedNode];
-            removedNodes = [];
-          } else {
-
-            addedNodes = [];
-            removedNodes = [changedNode];
-          }
-          var previousSibling = changedNode.previousSibling;
-          var nextSibling = changedNode.nextSibling;
-
-          // 1.
-          var record = getRecord('childList', target);
-          record.addedNodes = addedNodes;
-          record.removedNodes = removedNodes;
-          record.previousSibling = previousSibling;
-          record.nextSibling = nextSibling;
-
-          forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-            // 2.1, 3.2
-            if (!options.childList)
-              return;
-
-            // 2.2, 3.3
-            return record;
-          });
-
-      }
-
-      clearRecords();
-    }
-  };
-
-  global.JsMutationObserver = JsMutationObserver;
-
-  if (!global.MutationObserver)
-    global.MutationObserver = JsMutationObserver;
-
-
-})(this);
-
-/*
- * 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.
- */
-window.HTMLImports = window.HTMLImports || {flags:{}};
-/*
- * 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.
- */
-
-(function(scope) {
-
-  // imports
-  var path = scope.path;
-  var xhr = scope.xhr;
-  var flags = scope.flags;
-
-  // TODO(sorvell): this loader supports a dynamic list of urls
-  // and an oncomplete callback that is called when the loader is done.
-  // The polyfill currently does *not* need this dynamism or the onComplete
-  // concept. Because of this, the loader could be simplified quite a bit.
-  var Loader = function(onLoad, onComplete) {
-    this.cache = {};
-    this.onload = onLoad;
-    this.oncomplete = onComplete;
-    this.inflight = 0;
-    this.pending = {};
-  };
-
-  Loader.prototype = {
-    addNodes: function(nodes) {
-      // number of transactions to complete
-      this.inflight += nodes.length;
-      // commence transactions
-      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
-        this.require(n);
-      }
-      // anything to do?
-      this.checkDone();
-    },
-    addNode: function(node) {
-      // number of transactions to complete
-      this.inflight++;
-      // commence transactions
-      this.require(node);
-      // anything to do?
-      this.checkDone();
-    },
-    require: function(elt) {
-      var url = elt.src || elt.href;
-      // ensure we have a standard url that can be used
-      // reliably for deduping.
-      // TODO(sjmiles): ad-hoc
-      elt.__nodeUrl = url;
-      // deduplication
-      if (!this.dedupe(url, elt)) {
-        // fetch this resource
-        this.fetch(url, elt);
-      }
-    },
-    dedupe: function(url, elt) {
-      if (this.pending[url]) {
-        // add to list of nodes waiting for inUrl
-        this.pending[url].push(elt);
-        // don't need fetch
-        return true;
-      }
-      var resource;
-      if (this.cache[url]) {
-        this.onload(url, elt, this.cache[url]);
-        // finished this transaction
-        this.tail();
-        // don't need fetch
-        return true;
-      }
-      // first node waiting for inUrl
-      this.pending[url] = [elt];
-      // need fetch (not a dupe)
-      return false;
-    },
-    fetch: function(url, elt) {
-      flags.load && console.log('fetch', url, elt);
-      if (url.match(/^data:/)) {
-        // Handle Data URI Scheme
-        var pieces = url.split(',');
-        var header = pieces[0];
-        var body = pieces[1];
-        if(header.indexOf(';base64') > -1) {
-          body = atob(body);
-        } else {
-          body = decodeURIComponent(body);
-        }
-        setTimeout(function() {
-            this.receive(url, elt, null, body);
-        }.bind(this), 0);
-      } else {
-        var receiveXhr = function(err, resource) {
-          this.receive(url, elt, err, resource);
-        }.bind(this);
-        xhr.load(url, receiveXhr);
-        // TODO(sorvell): blocked on)
-        // https://code.google.com/p/chromium/issues/detail?id=257221
-        // xhr'ing for a document makes scripts in imports runnable; otherwise
-        // they are not; however, it requires that we have doctype=html in
-        // the import which is unacceptable. This is only needed on Chrome
-        // to avoid the bug above.
-        /*
-        if (isDocumentLink(elt)) {
-          xhr.loadDocument(url, receiveXhr);
-        } else {
-          xhr.load(url, receiveXhr);
-        }
-        */
-      }
-    },
-    receive: function(url, elt, err, resource) {
-      this.cache[url] = resource;
-      var $p = this.pending[url];
-      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {
-        //if (!err) {
-          this.onload(url, p, resource);
-        //}
-        this.tail();
-      }
-      this.pending[url] = null;
-    },
-    tail: function() {
-      --this.inflight;
-      this.checkDone();
-    },
-    checkDone: function() {
-      if (!this.inflight) {
-        this.oncomplete();
-      }
-    }
-  };
-
-  xhr = xhr || {
-    async: true,
-    ok: function(request) {
-      return (request.status >= 200 && request.status < 300)
-          || (request.status === 304)
-          || (request.status === 0);
-    },
-    load: function(url, next, nextContext) {
-      var request = new XMLHttpRequest();
-      if (scope.flags.debug || scope.flags.bust) {
-        url += '?' + Math.random();
-      }
-      request.open('GET', url, xhr.async);
-      request.addEventListener('readystatechange', function(e) {
-        if (request.readyState === 4) {
-          next.call(nextContext, !xhr.ok(request) && request,
-              request.response || request.responseText, url);
-        }
-      });
-      request.send();
-      return request;
-    },
-    loadDocument: function(url, next, nextContext) {
-      this.load(url, next, nextContext).responseType = 'document';
-    }
-  };
-
-  // exports
-  scope.xhr = xhr;
-  scope.Loader = Loader;
-
-})(window.HTMLImports);
-
-/*
- * 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.
- */
-
-(function(scope) {
-
-var IMPORT_LINK_TYPE = 'import';
-var flags = scope.flags;
-var isIe = /Trident/.test(navigator.userAgent);
-// TODO(sorvell): SD polyfill intrusion
-var mainDoc = window.ShadowDOMPolyfill ? 
-    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;
-
-// importParser
-// highlander object to manage parsing of imports
-// parses import related elements
-// and ensures proper parse order
-// parse order is enforced by crawling the tree and monitoring which elements
-// have been parsed; async parsing is also supported.
-
-// highlander object for parsing a document tree
-var importParser = {
-  // parse selectors for main document elements
-  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',
-  // parse selectors for import document elements
-  importsSelectors: [
-    'link[rel=' + IMPORT_LINK_TYPE + ']',
-    'link[rel=stylesheet]',
-    'style',
-    'script:not([type])',
-    'script[type="text/javascript"]'
-  ].join(','),
-  map: {
-    link: 'parseLink',
-    script: 'parseScript',
-    style: 'parseStyle'
-  },
-  // try to parse the next import in the tree
-  parseNext: function() {
-    var next = this.nextToParse();
-    if (next) {
-      this.parse(next);
-    }
-  },
-  parse: function(elt) {
-    if (this.isParsed(elt)) {
-      flags.parse && console.log('[%s] is already parsed', elt.localName);
-      return;
-    }
-    var fn = this[this.map[elt.localName]];
-    if (fn) {
-      this.markParsing(elt);
-      fn.call(this, elt);
-    }
-  },
-  // only 1 element may be parsed at a time; parsing is async so, each
-  // parsing implementation must inform the system that parsing is complete
-  // via markParsingComplete.
-  markParsing: function(elt) {
-    flags.parse && console.log('parsing', elt);
-    this.parsingElement = elt;
-  },
-  markParsingComplete: function(elt) {
-    elt.__importParsed = true;
-    if (elt.__importElement) {
-      elt.__importElement.__importParsed = true;
-    }
-    this.parsingElement = null;
-    flags.parse && console.log('completed', elt);
-    this.parseNext();
-  },
-  parseImport: function(elt) {
-    elt.import.__importParsed = true;
-    // TODO(sorvell): consider if there's a better way to do this;
-    // expose an imports parsing hook; this is needed, for example, by the
-    // CustomElements polyfill.
-    if (HTMLImports.__importsParsingHook) {
-      HTMLImports.__importsParsingHook(elt);
-    }
-    // fire load event
-    if (elt.__resource) {
-      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    
-    } else {
-      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));
-    }
-    // TODO(sorvell): workaround for Safari addEventListener not working
-    // for elements not in the main document.
-    if (elt.__pending) {
-      var fn;
-      while (elt.__pending.length) {
-        fn = elt.__pending.shift();
-        if (fn) {
-          fn({target: elt});
-        }
-      }
-    }
-    this.markParsingComplete(elt);
-  },
-  parseLink: function(linkElt) {
-    if (nodeIsImport(linkElt)) {
-      this.parseImport(linkElt);
-    } else {
-      // make href absolute
-      linkElt.href = linkElt.href;
-      this.parseGeneric(linkElt);
-    }
-  },
-  parseStyle: function(elt) {
-    // TODO(sorvell): style element load event can just not fire so clone styles
-    var src = elt;
-    elt = cloneStyle(elt);
-    elt.__importElement = src;
-    this.parseGeneric(elt);
-  },
-  parseGeneric: function(elt) {
-    this.trackElement(elt);
-    document.head.appendChild(elt);
-  },
-  // tracks when a loadable element has loaded
-  trackElement: function(elt, callback) {
-    var self = this;
-    var done = function(e) {
-      if (callback) {
-        callback(e);
-      }
-      self.markParsingComplete(elt);
-    };
-    elt.addEventListener('load', done);
-    elt.addEventListener('error', done);
-
-    // NOTE: IE does not fire "load" event for styles that have already loaded
-    // This is in violation of the spec, so we try our hardest to work around it
-    if (isIe && elt.localName === 'style') {
-      var fakeLoad = false;
-      // If there's not @import in the textContent, assume it has loaded
-      if (elt.textContent.indexOf('@import') == -1) {
-        fakeLoad = true;
-      // if we have a sheet, we have been parsed
-      } else if (elt.sheet) {
-        fakeLoad = true;
-        var csr = elt.sheet.cssRules;
-        var len = csr ? csr.length : 0;
-        // search the rules for @import's
-        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {
-          if (r.type === CSSRule.IMPORT_RULE) {
-            // if every @import has resolved, fake the load
-            fakeLoad = fakeLoad && Boolean(r.styleSheet);
-          }
-        }
-      }
-      // dispatch a fake load event and continue parsing
-      if (fakeLoad) {
-        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));
-      }
-    }
-  },
-  // NOTE: execute scripts by injecting them and watching for the load/error
-  // event. Inline scripts are handled via dataURL's because browsers tend to
-  // provide correct parsing errors in this case. If this has any compatibility
-  // issues, we can switch to injecting the inline script with textContent.
-  // Scripts with dataURL's do not appear to generate load events and therefore
-  // we assume they execute synchronously.
-  parseScript: function(scriptElt) {
-    var script = document.createElement('script');
-    script.__importElement = scriptElt;
-    script.src = scriptElt.src ? scriptElt.src : 
-        generateScriptDataUrl(scriptElt);
-    scope.currentScript = scriptElt;
-    this.trackElement(script, function(e) {
-      script.parentNode.removeChild(script);
-      scope.currentScript = null;  
-    });
-    document.head.appendChild(script);
-  },
-  // determine the next element in the tree which should be parsed
-  nextToParse: function() {
-    return !this.parsingElement && this.nextToParseInDoc(mainDoc);
-  },
-  nextToParseInDoc: function(doc, link) {
-    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));
-    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {
-      if (!this.isParsed(n)) {
-        if (this.hasResource(n)) {
-          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;
-        } else {
-          return;
-        }
-      }
-    }
-    // all nodes have been parsed, ready to parse import, if any
-    return link;
-  },
-  // return the set of parse selectors relevant for this node.
-  parseSelectorsForNode: function(node) {
-    var doc = node.ownerDocument || node;
-    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;
-  },
-  isParsed: function(node) {
-    return node.__importParsed;
-  },
-  hasResource: function(node) {
-    if (nodeIsImport(node) && !node.import) {
-      return false;
-    }
-    return true;
-  }
-};
-
-function nodeIsImport(elt) {
-  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);
-}
-
-function generateScriptDataUrl(script) {
-  var scriptContent = generateScriptContent(script), b64;
-  try {
-    b64 = btoa(scriptContent);
-  } catch(e) {
-    b64 = btoa(unescape(encodeURIComponent(scriptContent)));
-    console.warn('Script contained non-latin characters that were forced ' +
-      'to latin. Some characters may be wrong.', script);
-  }
-  return 'data:text/javascript;base64,' + b64;
-}
-
-function generateScriptContent(script) {
-  return script.textContent + generateSourceMapHint(script);
-}
-
-// calculate source map hint
-function generateSourceMapHint(script) {
-  var moniker = script.__nodeUrl;
-  if (!moniker) {
-    moniker = script.ownerDocument.baseURI;
-    // there could be more than one script this url
-    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';
-    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow 
-    // this sort of thing
-    var matches = script.textContent.match(/Polymer\(['"]([^'"]*)/);
-    tag = matches && matches[1] || tag;
-    // tag the moniker
-    moniker += '/' + tag + '.js';
-  }
-  return '\n//# sourceURL=' + moniker + '\n';
-}
-
-// style/stylesheet handling
-
-// clone style with proper path resolution for main document
-// NOTE: styles are the only elements that require direct path fixup.
-function cloneStyle(style) {
-  var clone = style.ownerDocument.createElement('style');
-  clone.textContent = style.textContent;
-  path.resolveUrlsInStyle(clone);
-  return clone;
-}
-
-// path fixup: style elements in imports must be made relative to the main 
-// document. We fixup url's in url() and @import.
-var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
-var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
-
-var path = {
-  resolveUrlsInStyle: function(style) {
-    var doc = style.ownerDocument;
-    var resolver = doc.createElement('a');
-    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);
-    return style;  
-  },
-  resolveUrlsInCssText: function(cssText, urlObj) {
-    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);
-    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);
-    return r;
-  },
-  replaceUrls: function(text, urlObj, regexp) {
-    return text.replace(regexp, function(m, pre, url, post) {
-      var urlPath = url.replace(/["']/g, '');
-      urlObj.href = urlPath;
-      urlPath = urlObj.href;
-      return pre + '\'' + urlPath + '\'' + post;
-    });    
-  }
-}
-
-// exports
-scope.parser = importParser;
-scope.path = path;
-scope.isIE = isIe;
-
-})(HTMLImports);
-
-/*
- * 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.
- */
-
-(function(scope) {
-
-var hasNative = ('import' in document.createElement('link'));
-var useNative = hasNative;
-var flags = scope.flags;
-var IMPORT_LINK_TYPE = 'import';
-
-// TODO(sorvell): SD polyfill intrusion
-var mainDoc = window.ShadowDOMPolyfill ? 
-    ShadowDOMPolyfill.wrapIfNeeded(document) : document;
-
-if (!useNative) {
-
-  // imports
-  var xhr = scope.xhr;
-  var Loader = scope.Loader;
-  var parser = scope.parser;
-
-  // importer
-  // highlander object to manage loading of imports
-
-  // for any document, importer:
-  // - loads any linked import documents (with deduping)
-
-  var importer = {
-    documents: {},
-    // nodes to load in the mian document
-    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',
-    // nodes to load in imports
-    importsPreloadSelectors: [
-      'link[rel=' + IMPORT_LINK_TYPE + ']'
-    ].join(','),
-    loadNode: function(node) {
-      importLoader.addNode(node);
-    },
-    // load all loadable elements within the parent element
-    loadSubtree: function(parent) {
-      var nodes = this.marshalNodes(parent);
-      // add these nodes to loader's queue
-      importLoader.addNodes(nodes);
-    },
-    marshalNodes: function(parent) {
-      // all preloadable nodes in inDocument
-      return parent.querySelectorAll(this.loadSelectorsForNode(parent));
-    },
-    // find the proper set of load selectors for a given node
-    loadSelectorsForNode: function(node) {
-      var doc = node.ownerDocument || node;
-      return doc === mainDoc ? this.documentPreloadSelectors :
-          this.importsPreloadSelectors;
-    },
-    loaded: function(url, elt, resource) {
-      flags.load && console.log('loaded', url, elt);
-      // store generic resource
-      // TODO(sorvell): fails for nodes inside <template>.content
-      // see https://code.google.com/p/chromium/issues/detail?id=249381.
-      elt.__resource = resource;
-      if (isDocumentLink(elt)) {
-        var doc = this.documents[url];
-        // if we've never seen a document at this url
-        if (!doc) {
-          // generate an HTMLDocument from data
-          doc = makeDocument(resource, url);
-          doc.__importLink = elt;
-          // TODO(sorvell): we cannot use MO to detect parsed nodes because
-          // SD polyfill does not report these as mutations.
-          this.bootDocument(doc);
-          // cache document
-          this.documents[url] = doc;
-        }
-        // don't store import record until we're actually loaded
-        // store document resource
-        elt.import = doc;
-      }
-      parser.parseNext();
-    },
-    bootDocument: function(doc) {
-      this.loadSubtree(doc);
-      this.observe(doc);
-      parser.parseNext();
-    },
-    loadedAll: function() {
-      parser.parseNext();
-    }
-  };
-
-  // loader singleton
-  var importLoader = new Loader(importer.loaded.bind(importer), 
-      importer.loadedAll.bind(importer));
-
-  function isDocumentLink(elt) {
-    return isLinkRel(elt, IMPORT_LINK_TYPE);
-  }
-
-  function isLinkRel(elt, rel) {
-    return elt.localName === 'link' && elt.getAttribute('rel') === rel;
-  }
-
-  function isScript(elt) {
-    return elt.localName === 'script';
-  }
-
-  function makeDocument(resource, url) {
-    // create a new HTML document
-    var doc = resource;
-    if (!(doc instanceof Document)) {
-      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);
-    }
-    // cache the new document's source url
-    doc._URL = url;
-    // establish a relative path via <base>
-    var base = doc.createElement('base');
-    base.setAttribute('href', url);
-    // add baseURI support to browsers (IE) that lack it.
-    if (!doc.baseURI) {
-      doc.baseURI = url;
-    }
-    // ensure UTF-8 charset
-    var meta = doc.createElement('meta');
-    meta.setAttribute('charset', 'utf-8');
-
-    doc.head.appendChild(meta);
-    doc.head.appendChild(base);
-    // install HTML last as it may trigger CustomElement upgrades
-    // TODO(sjmiles): problem wrt to template boostrapping below,
-    // template bootstrapping must (?) come before element upgrade
-    // but we cannot bootstrap templates until they are in a document
-    // which is too late
-    if (!(resource instanceof Document)) {
-      // install html
-      doc.body.innerHTML = resource;
-    }
-    // TODO(sorvell): ideally this code is not aware of Template polyfill,
-    // but for now the polyfill needs help to bootstrap these templates
-    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
-      HTMLTemplateElement.bootstrap(doc);
-    }
-    return doc;
-  }
-} else {
-  // do nothing if using native imports
-  var importer = {};
-}
-
-// NOTE: We cannot polyfill document.currentScript because it's not possible
-// both to override and maintain the ability to capture the native value;
-// therefore we choose to expose _currentScript both when native imports
-// and the polyfill are in use.
-var currentScriptDescriptor = {
-  get: function() {
-    return HTMLImports.currentScript || document.currentScript;
-  },
-  configurable: true
-};
-
-Object.defineProperty(document, '_currentScript', currentScriptDescriptor);
-Object.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);
-
-// Polyfill document.baseURI for browsers without it.
-if (!document.baseURI) {
-  var baseURIDescriptor = {
-    get: function() {
-      return window.location.href;
-    },
-    configurable: true
-  };
-
-  Object.defineProperty(document, 'baseURI', baseURIDescriptor);
-  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);
-}
-
-// call a callback when all HTMLImports in the document at call (or at least
-//  document ready) time have loaded.
-// 1. ensure the document is in a ready state (has dom), then 
-// 2. watch for loading of imports and call callback when done
-function whenImportsReady(callback, doc) {
-  doc = doc || mainDoc;
-  // if document is loading, wait and try again
-  whenDocumentReady(function() {
-    watchImportsLoad(callback, doc);
-  }, doc);
-}
-
-// call the callback when the document is in a ready state (has dom)
-var requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';
-var READY_EVENT = 'readystatechange';
-function isDocumentReady(doc) {
-  return (doc.readyState === 'complete' ||
-      doc.readyState === requiredReadyState);
-}
-
-// call <callback> when we ensure the document is in a ready state
-function whenDocumentReady(callback, doc) {
-  if (!isDocumentReady(doc)) {
-    var checkReady = function() {
-      if (doc.readyState === 'complete' || 
-          doc.readyState === requiredReadyState) {
-        doc.removeEventListener(READY_EVENT, checkReady);
-        whenDocumentReady(callback, doc);
-      }
-    }
-    doc.addEventListener(READY_EVENT, checkReady);
-  } else if (callback) {
-    callback();
-  }
-}
-
-// call <callback> when we ensure all imports have loaded
-function watchImportsLoad(callback, doc) {
-  var imports = doc.querySelectorAll('link[rel=import]');
-  var loaded = 0, l = imports.length;
-  function checkDone(d) { 
-    if (loaded == l) {
-      // go async to ensure parser isn't stuck on a script tag
-      requestAnimationFrame(callback);
-    }
-  }
-  function loadedImport(e) {
-    loaded++;
-    checkDone();
-  }
-  if (l) {
-    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {
-      if (isImportLoaded(imp)) {
-        loadedImport.call(imp);
-      } else {
-        imp.addEventListener('load', loadedImport);
-        imp.addEventListener('error', loadedImport);
-      }
-    }
-  } else {
-    checkDone();
-  }
-}
-
-function isImportLoaded(link) {
-  return useNative ? (link.import && (link.import.readyState !== 'loading')) :
-      link.__importParsed;
-}
-
-// exports
-scope.hasNative = hasNative;
-scope.useNative = useNative;
-scope.importer = importer;
-scope.whenImportsReady = whenImportsReady;
-scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
-scope.isImportLoaded = isImportLoaded;
-scope.importLoader = importLoader;
-
-})(window.HTMLImports);
-
- /*
-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.
-*/
-
-(function(scope){
-
-var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-var importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';
-var importer = scope.importer;
-
-// we track mutations for addedNodes, looking for imports
-function handler(mutations) {
-  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {
-    if (m.type === 'childList' && m.addedNodes.length) {
-      addedNodes(m.addedNodes);
-    }
-  }
-}
-
-// find loadable elements and add them to the importer
-function addedNodes(nodes) {
-  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
-    if (shouldLoadNode(n)) {
-      importer.loadNode(n);
-    }
-    if (n.children && n.children.length) {
-      addedNodes(n.children);
-    }
-  }
-}
-
-function shouldLoadNode(node) {
-  return (node.nodeType === 1) && matches.call(node,
-      importer.loadSelectorsForNode(node));
-}
-
-// x-plat matches
-var matches = HTMLElement.prototype.matches || 
-    HTMLElement.prototype.matchesSelector || 
-    HTMLElement.prototype.webkitMatchesSelector ||
-    HTMLElement.prototype.mozMatchesSelector ||
-    HTMLElement.prototype.msMatchesSelector;
-
-var observer = new MutationObserver(handler);
-
-// observe the given root for loadable elements
-function observe(root) {
-  observer.observe(root, {childList: true, subtree: true});
-}
-
-// exports
-// TODO(sorvell): factor so can put on scope
-scope.observe = observe;
-importer.observe = observe;
-
-})(HTMLImports);
-
-/*
- * 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.
- */
-(function(){
-
-// bootstrap
-
-// IE shim for CustomEvent
-if (typeof window.CustomEvent !== 'function') {
-  window.CustomEvent = function(inType, dictionary) {
-     var e = document.createEvent('HTMLEvents');
-     e.initEvent(inType,
-        dictionary.bubbles === false ? false : true,
-        dictionary.cancelable === false ? false : true,
-        dictionary.detail);
-     return e;
-  };
-}
-
-// TODO(sorvell): SD polyfill intrusion
-var doc = window.ShadowDOMPolyfill ? 
-    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;
-
-// Fire the 'HTMLImportsLoaded' event when imports in document at load time 
-// have loaded. This event is required to simulate the script blocking 
-// behavior of native imports. A main document script that needs to be sure
-// imports have loaded should wait for this event.
-HTMLImports.whenImportsReady(function() {
-  HTMLImports.ready = true;
-  HTMLImports.readyTime = new Date().getTime();
-  doc.dispatchEvent(
-    new CustomEvent('HTMLImportsLoaded', {bubbles: true})
-  );
-});
-
-
-// no need to bootstrap the polyfill when native imports is available.
-if (!HTMLImports.useNative) {
-  function bootstrap() {
-    HTMLImports.importer.bootDocument(doc);
-  }
-    
-  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added
-  // by the parser. For this reason, we must wait until the dom exists to 
-  // bootstrap.
-  if (document.readyState === 'complete' ||
-      (document.readyState === 'interactive' && !window.attachEvent)) {
-    bootstrap();
-  } else {
-    document.addEventListener('DOMContentLoaded', bootstrap);
-  }
-}
-
-})();
-
-/*
- * 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.
- */
-window.CustomElements = window.CustomElements || {flags:{}};
- /*

-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.

-*/

-

-(function(scope){

-

-var logFlags = window.logFlags || {};

-var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';

-

-// walk the subtree rooted at node, applying 'find(element, data)' function

-// to each element

-// if 'find' returns true for 'element', do not search element's subtree

-function findAll(node, find, data) {

-  var e = node.firstElementChild;

-  if (!e) {

-    e = node.firstChild;

-    while (e && e.nodeType !== Node.ELEMENT_NODE) {

-      e = e.nextSibling;

-    }

-  }

-  while (e) {

-    if (find(e, data) !== true) {

-      findAll(e, find, data);

-    }

-    e = e.nextElementSibling;

-  }

-  return null;

-}

-

-// walk all shadowRoots on a given node.

-function forRoots(node, cb) {

-  var root = node.shadowRoot;

-  while(root) {

-    forSubtree(root, cb);

-    root = root.olderShadowRoot;

-  }

-}

-

-// walk the subtree rooted at node, including descent into shadow-roots,

-// applying 'cb' to each element

-function forSubtree(node, cb) {

-  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);

-  findAll(node, function(e) {

-    if (cb(e)) {

-      return true;

-    }

-    forRoots(e, cb);

-  });

-  forRoots(node, cb);

-  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();

-}

-

-// manage lifecycle on added node

-function added(node) {

-  if (upgrade(node)) {

-    insertedNode(node);

-    return true;

-  }

-  inserted(node);

-}

-

-// manage lifecycle on added node's subtree only

-function addedSubtree(node) {

-  forSubtree(node, function(e) {

-    if (added(e)) {

-      return true;

-    }

-  });

-}

-

-// manage lifecycle on added node and it's subtree

-function addedNode(node) {

-  return added(node) || addedSubtree(node);

-}

-

-// upgrade custom elements at node, if applicable

-function upgrade(node) {

-  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {

-    var type = node.getAttribute('is') || node.localName;

-    var definition = scope.registry[type];

-    if (definition) {

-      logFlags.dom && console.group('upgrade:', node.localName);

-      scope.upgrade(node);

-      logFlags.dom && console.groupEnd();

-      return true;

-    }

-  }

-}

-

-function insertedNode(node) {

-  inserted(node);

-  if (inDocument(node)) {

-    forSubtree(node, function(e) {

-      inserted(e);

-    });

-  }

-}

-

-// TODO(sorvell): on platforms without MutationObserver, mutations may not be

-// reliable and therefore attached/detached are not reliable.

-// To make these callbacks less likely to fail, we defer all inserts and removes

-// to give a chance for elements to be inserted into dom.

-// This ensures attachedCallback fires for elements that are created and

-// immediately added to dom.

-var hasPolyfillMutations = (!window.MutationObserver ||

-    (window.MutationObserver === window.JsMutationObserver));

-scope.hasPolyfillMutations = hasPolyfillMutations;

-

-var isPendingMutations = false;

-var pendingMutations = [];

-function deferMutation(fn) {

-  pendingMutations.push(fn);

-  if (!isPendingMutations) {

-    isPendingMutations = true;

-    var async = (window.Platform && window.Platform.endOfMicrotask) ||

-        setTimeout;

-    async(takeMutations);

-  }

-}

-

-function takeMutations() {

-  isPendingMutations = false;

-  var $p = pendingMutations;

-  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {

-    p();

-  }

-  pendingMutations = [];

-}

-

-function inserted(element) {

-  if (hasPolyfillMutations) {

-    deferMutation(function() {

-      _inserted(element);

-    });

-  } else {

-    _inserted(element);

-  }

-}

-

-// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this

-function _inserted(element) {

-  // TODO(sjmiles): it's possible we were inserted and removed in the space

-  // of one microtask, in which case we won't be 'inDocument' here

-  // But there are other cases where we are testing for inserted without

-  // specific knowledge of mutations, and must test 'inDocument' to determine

-  // whether to call inserted

-  // If we can factor these cases into separate code paths we can have

-  // better diagnostics.

-  // TODO(sjmiles): when logging, do work on all custom elements so we can

-  // track behavior even when callbacks not defined

-  //console.log('inserted: ', element.localName);

-  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {

-    logFlags.dom && console.group('inserted:', element.localName);

-    if (inDocument(element)) {

-      element.__inserted = (element.__inserted || 0) + 1;

-      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state

-      if (element.__inserted < 1) {

-        element.__inserted = 1;

-      }

-      // if we are 'over inserted', squelch the callback

-      if (element.__inserted > 1) {

-        logFlags.dom && console.warn('inserted:', element.localName,

-          'insert/remove count:', element.__inserted)

-      } else if (element.attachedCallback) {

-        logFlags.dom && console.log('inserted:', element.localName);

-        element.attachedCallback();

-      }

-    }

-    logFlags.dom && console.groupEnd();

-  }

-}

-

-function removedNode(node) {

-  removed(node);

-  forSubtree(node, function(e) {

-    removed(e);

-  });

-}

-

-function removed(element) {

-  if (hasPolyfillMutations) {

-    deferMutation(function() {

-      _removed(element);

-    });

-  } else {

-    _removed(element);

-  }

-}

-

-function _removed(element) {

-  // TODO(sjmiles): temporary: do work on all custom elements so we can track

-  // behavior even when callbacks not defined

-  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {

-    logFlags.dom && console.group('removed:', element.localName);

-    if (!inDocument(element)) {

-      element.__inserted = (element.__inserted || 0) - 1;

-      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state

-      if (element.__inserted > 0) {

-        element.__inserted = 0;

-      }

-      // if we are 'over removed', squelch the callback

-      if (element.__inserted < 0) {

-        logFlags.dom && console.warn('removed:', element.localName,

-            'insert/remove count:', element.__inserted)

-      } else if (element.detachedCallback) {

-        element.detachedCallback();

-      }

-    }

-    logFlags.dom && console.groupEnd();

-  }

-}

-

-// SD polyfill intrustion due mainly to the fact that 'document'

-// is not entirely wrapped

-function wrapIfNeeded(node) {

-  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)

-      : node;

-}

-

-function inDocument(element) {

-  var p = element;

-  var doc = wrapIfNeeded(document);

-  while (p) {

-    if (p == doc) {

-      return true;

-    }

-    p = p.parentNode || p.host;

-  }

-}

-

-function watchShadow(node) {

-  if (node.shadowRoot && !node.shadowRoot.__watched) {

-    logFlags.dom && console.log('watching shadow-root for: ', node.localName);

-    // watch all unwatched roots...

-    var root = node.shadowRoot;

-    while (root) {

-      watchRoot(root);

-      root = root.olderShadowRoot;

-    }

-  }

-}

-

-function watchRoot(root) {

-  if (!root.__watched) {

-    observe(root);

-    root.__watched = true;

-  }

-}

-

-function handler(mutations) {

-  //

-  if (logFlags.dom) {

-    var mx = mutations[0];

-    if (mx && mx.type === 'childList' && mx.addedNodes) {

-        if (mx.addedNodes) {

-          var d = mx.addedNodes[0];

-          while (d && d !== document && !d.host) {

-            d = d.parentNode;

-          }

-          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';

-          u = u.split('/?').shift().split('/').pop();

-        }

-    }

-    console.group('mutations (%d) [%s]', mutations.length, u || '');

-  }

-  //

-  mutations.forEach(function(mx) {

-    //logFlags.dom && console.group('mutation');

-    if (mx.type === 'childList') {

-      forEach(mx.addedNodes, function(n) {

-        //logFlags.dom && console.log(n.localName);

-        if (!n.localName) {

-          return;

-        }

-        // nodes added may need lifecycle management

-        addedNode(n);

-      });

-      // removed nodes may need lifecycle management

-      forEach(mx.removedNodes, function(n) {

-        //logFlags.dom && console.log(n.localName);

-        if (!n.localName) {

-          return;

-        }

-        removedNode(n);

-      });

-    }

-    //logFlags.dom && console.groupEnd();

-  });

-  logFlags.dom && console.groupEnd();

-};

-

-var observer = new MutationObserver(handler);

-

-function takeRecords() {

-  // TODO(sjmiles): ask Raf why we have to call handler ourselves

-  handler(observer.takeRecords());

-  takeMutations();

-}

-

-var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);

-

-function observe(inRoot) {

-  observer.observe(inRoot, {childList: true, subtree: true});

-}

-

-function observeDocument(doc) {

-  observe(doc);

-}

-

-function upgradeDocument(doc) {

-  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());

-  addedNode(doc);

-  logFlags.dom && console.groupEnd();

-}

-

-function upgradeDocumentTree(doc) {

-  doc = wrapIfNeeded(doc);

-  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());

-  // upgrade contained imported documents

-  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');

-  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {

-    if (n.import && n.import.__parsed) {

-      upgradeDocumentTree(n.import);

-    }

-  }

-  upgradeDocument(doc);

-}

-

-// exports

-scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;

-scope.watchShadow = watchShadow;

-scope.upgradeDocumentTree = upgradeDocumentTree;

-scope.upgradeAll = addedNode;

-scope.upgradeSubtree = addedSubtree;

-scope.insertedNode = insertedNode;

-

-scope.observeDocument = observeDocument;

-scope.upgradeDocument = upgradeDocument;

-

-scope.takeRecords = takeRecords;

-

-})(window.CustomElements);

-
-/*
- * 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.
- */
-
-/**
- * Implements `document.register`
- * @module CustomElements
-*/
-
-/**
- * Polyfilled extensions to the `document` object.
- * @class Document
-*/
-
-(function(scope) {
-
-// imports
-
-if (!scope) {
-  scope = window.CustomElements = {flags:{}};
-}
-var flags = scope.flags;
-
-// native document.registerElement?
-
-var hasNative = Boolean(document.registerElement);
-// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399
-// we'll address this by defaulting to CE polyfill in the presence of the SD
-// polyfill. This will avoid spamming excess attached/detached callbacks.
-// If there is a compelling need to run CE native with SD polyfill,
-// we'll need to fix this issue.
-var useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;
-
-if (useNative) {
-
-  // stub
-  var nop = function() {};
-
-  // exports
-  scope.registry = {};
-  scope.upgradeElement = nop;
-
-  scope.watchShadow = nop;
-  scope.upgrade = nop;
-  scope.upgradeAll = nop;
-  scope.upgradeSubtree = nop;
-  scope.observeDocument = nop;
-  scope.upgradeDocument = nop;
-  scope.upgradeDocumentTree = nop;
-  scope.takeRecords = nop;
-  scope.reservedTagList = [];
-
-} else {
-
-  /**
-   * Registers a custom tag name with the document.
-   *
-   * When a registered element is created, a `readyCallback` method is called
-   * in the scope of the element. The `readyCallback` method can be specified on
-   * either `options.prototype` or `options.lifecycle` with the latter taking
-   * precedence.
-   *
-   * @method register
-   * @param {String} name The tag name to register. Must include a dash ('-'),
-   *    for example 'x-component'.
-   * @param {Object} options
-   *    @param {String} [options.extends]
-   *      (_off spec_) Tag name of an element to extend (or blank for a new
-   *      element). This parameter is not part of the specification, but instead
-   *      is a hint for the polyfill because the extendee is difficult to infer.
-   *      Remember that the input prototype must chain to the extended element's
-   *      prototype (or HTMLElement.prototype) regardless of the value of
-   *      `extends`.
-   *    @param {Object} options.prototype The prototype to use for the new
-   *      element. The prototype must inherit from HTMLElement.
-   *    @param {Object} [options.lifecycle]
-   *      Callbacks that fire at important phases in the life of the custom
-   *      element.
-   *
-   * @example
-   *      FancyButton = document.registerElement("fancy-button", {
-   *        extends: 'button',
-   *        prototype: Object.create(HTMLButtonElement.prototype, {
-   *          readyCallback: {
-   *            value: function() {
-   *              console.log("a fancy-button was created",
-   *            }
-   *          }
-   *        })
-   *      });
-   * @return {Function} Constructor for the newly registered type.
-   */
-  function register(name, options) {
-    //console.warn('document.registerElement("' + name + '", ', options, ')');
-    // construct a defintion out of options
-    // TODO(sjmiles): probably should clone options instead of mutating it
-    var definition = options || {};
-    if (!name) {
-      // TODO(sjmiles): replace with more appropriate error (EricB can probably
-      // offer guidance)
-      throw new Error('document.registerElement: first argument `name` must not be empty');
-    }
-    if (name.indexOf('-') < 0) {
-      // TODO(sjmiles): replace with more appropriate error (EricB can probably
-      // offer guidance)
-      throw new Error('document.registerElement: first argument (\'name\') must contain a dash (\'-\'). Argument provided was \'' + String(name) + '\'.');
-    }
-    // prevent registering reserved names
-    if (isReservedTag(name)) {
-      throw new Error('Failed to execute \'registerElement\' on \'Document\': Registration failed for type \'' + String(name) + '\'. The type name is invalid.');
-    }
-    // elements may only be registered once
-    if (getRegisteredDefinition(name)) {
-      throw new Error('DuplicateDefinitionError: a type with name \'' + String(name) + '\' is already registered');
-    }
-    // must have a prototype, default to an extension of HTMLElement
-    // TODO(sjmiles): probably should throw if no prototype, check spec
-    if (!definition.prototype) {
-      // TODO(sjmiles): replace with more appropriate error (EricB can probably
-      // offer guidance)
-      throw new Error('Options missing required prototype property');
-    }
-    // record name
-    definition.__name = name.toLowerCase();
-    // ensure a lifecycle object so we don't have to null test it
-    definition.lifecycle = definition.lifecycle || {};
-    // build a list of ancestral custom elements (for native base detection)
-    // TODO(sjmiles): we used to need to store this, but current code only
-    // uses it in 'resolveTagName': it should probably be inlined
-    definition.ancestry = ancestry(definition.extends);
-    // extensions of native specializations of HTMLElement require localName
-    // to remain native, and use secondary 'is' specifier for extension type
-    resolveTagName(definition);
-    // some platforms require modifications to the user-supplied prototype
-    // chain
-    resolvePrototypeChain(definition);
-    // overrides to implement attributeChanged callback
-    overrideAttributeApi(definition.prototype);
-    // 7.1.5: Register the DEFINITION with DOCUMENT
-    registerDefinition(definition.__name, definition);
-    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE
-    // 7.1.8. Return the output of the previous step.
-    definition.ctor = generateConstructor(definition);
-    definition.ctor.prototype = definition.prototype;
-    // force our .constructor to be our actual constructor
-    definition.prototype.constructor = definition.ctor;
-    // if initial parsing is complete
-    if (scope.ready) {
-      // upgrade any pre-existing nodes of this type
-      scope.upgradeDocumentTree(document);
-    }
-    return definition.ctor;
-  }
-
-  function isReservedTag(name) {
-    for (var i = 0; i < reservedTagList.length; i++) {
-      if (name === reservedTagList[i]) {
-        return true;
-      }
-    }
-  }
-
-  var reservedTagList = [
-    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',
-    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'
-  ];
-
-  function ancestry(extnds) {
-    var extendee = getRegisteredDefinition(extnds);
-    if (extendee) {
-      return ancestry(extendee.extends).concat([extendee]);
-    }
-    return [];
-  }
-
-  function resolveTagName(definition) {
-    // if we are explicitly extending something, that thing is our
-    // baseTag, unless it represents a custom component
-    var baseTag = definition.extends;
-    // if our ancestry includes custom components, we only have a
-    // baseTag if one of them does
-    for (var i=0, a; (a=definition.ancestry[i]); i++) {
-      baseTag = a.is && a.tag;
-    }
-    // our tag is our baseTag, if it exists, and otherwise just our name
-    definition.tag = baseTag || definition.__name;
-    if (baseTag) {
-      // if there is a base tag, use secondary 'is' specifier
-      definition.is = definition.__name;
-    }
-  }
-
-  function resolvePrototypeChain(definition) {
-    // if we don't support __proto__ we need to locate the native level
-    // prototype for precise mixing in
-    if (!Object.__proto__) {
-      // default prototype
-      var nativePrototype = HTMLElement.prototype;
-      // work out prototype when using type-extension
-      if (definition.is) {
-        var inst = document.createElement(definition.tag);
-        nativePrototype = Object.getPrototypeOf(inst);
-      }
-      // ensure __proto__ reference is installed at each point on the prototype
-      // chain.
-      // NOTE: On platforms without __proto__, a mixin strategy is used instead
-      // of prototype swizzling. In this case, this generated __proto__ provides
-      // limited support for prototype traversal.
-      var proto = definition.prototype, ancestor;
-      while (proto && (proto !== nativePrototype)) {
-        var ancestor = Object.getPrototypeOf(proto);
-        proto.__proto__ = ancestor;
-        proto = ancestor;
-      }
-    }
-    // cache this in case of mixin
-    definition.native = nativePrototype;
-  }
-
-  // SECTION 4
-
-  function instantiate(definition) {
-    // 4.a.1. Create a new object that implements PROTOTYPE
-    // 4.a.2. Let ELEMENT by this new object
-    //
-    // the custom element instantiation algorithm must also ensure that the
-    // output is a valid DOM element with the proper wrapper in place.
-    //
-    return upgrade(domCreateElement(definition.tag), definition);
-  }
-
-  function upgrade(element, definition) {
-    // some definitions specify an 'is' attribute
-    if (definition.is) {
-      element.setAttribute('is', definition.is);
-    }
-    // remove 'unresolved' attr, which is a standin for :unresolved.
-    element.removeAttribute('unresolved');
-    // make 'element' implement definition.prototype
-    implement(element, definition);
-    // flag as upgraded
-    element.__upgraded__ = true;
-    // lifecycle management
-    created(element);
-    // attachedCallback fires in tree order, call before recursing
-    scope.insertedNode(element);
-    // there should never be a shadow root on element at this point
-    scope.upgradeSubtree(element);
-    // OUTPUT
-    return element;
-  }
-
-  function implement(element, definition) {
-    // prototype swizzling is best
-    if (Object.__proto__) {
-      element.__proto__ = definition.prototype;
-    } else {
-      // where above we can re-acquire inPrototype via
-      // getPrototypeOf(Element), we cannot do so when
-      // we use mixin, so we install a magic reference
-      customMixin(element, definition.prototype, definition.native);
-      element.__proto__ = definition.prototype;
-    }
-  }
-
-  function customMixin(inTarget, inSrc, inNative) {
-    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of
-    // any property. This set should be precalculated. We also need to
-    // consider this for supporting 'super'.
-    var used = {};
-    // start with inSrc
-    var p = inSrc;
-    // The default is HTMLElement.prototype, so we add a test to avoid mixing in
-    // native prototypes
-    while (p !== inNative && p !== HTMLElement.prototype) {
-      var keys = Object.getOwnPropertyNames(p);
-      for (var i=0, k; k=keys[i]; i++) {
-        if (!used[k]) {
-          Object.defineProperty(inTarget, k,
-              Object.getOwnPropertyDescriptor(p, k));
-          used[k] = 1;
-        }
-      }
-      p = Object.getPrototypeOf(p);
-    }
-  }
-
-  function created(element) {
-    // invoke createdCallback
-    if (element.createdCallback) {
-      element.createdCallback();
-    }
-  }
-
-  // attribute watching
-
-  function overrideAttributeApi(prototype) {
-    // overrides to implement callbacks
-    // TODO(sjmiles): should support access via .attributes NamedNodeMap
-    // TODO(sjmiles): preserves user defined overrides, if any
-    if (prototype.setAttribute._polyfilled) {
-      return;
-    }
-    var setAttribute = prototype.setAttribute;
-    prototype.setAttribute = function(name, value) {
-      changeAttribute.call(this, name, value, setAttribute);
-    }
-    var removeAttribute = prototype.removeAttribute;
-    prototype.removeAttribute = function(name) {
-      changeAttribute.call(this, name, null, removeAttribute);
-    }
-    prototype.setAttribute._polyfilled = true;
-  }
-
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/
-  // index.html#dfn-attribute-changed-callback
-  function changeAttribute(name, value, operation) {
-    var oldValue = this.getAttribute(name);
-    operation.apply(this, arguments);
-    var newValue = this.getAttribute(name);
-    if (this.attributeChangedCallback
-        && (newValue !== oldValue)) {
-      this.attributeChangedCallback(name, oldValue, newValue);
-    }
-  }
-
-  // element registry (maps tag names to definitions)
-
-  var registry = {};
-
-  function getRegisteredDefinition(name) {
-    if (name) {
-      return registry[name.toLowerCase()];
-    }
-  }
-
-  function registerDefinition(name, definition) {
-    registry[name] = definition;
-  }
-
-  function generateConstructor(definition) {
-    return function() {
-      return instantiate(definition);
-    };
-  }
-
-  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
-  function createElementNS(namespace, tag, typeExtension) {
-    // NOTE: we do not support non-HTML elements,
-    // just call createElementNS for non HTML Elements
-    if (namespace === HTML_NAMESPACE) {
-      return createElement(tag, typeExtension);
-    } else {
-      return domCreateElementNS(namespace, tag);
-    }
-  }
-
-  function createElement(tag, typeExtension) {
-    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could
-    // error check it, or perhaps there should only ever be one argument
-    var definition = getRegisteredDefinition(typeExtension || tag);
-    if (definition) {
-      if (tag == definition.tag && typeExtension == definition.is) {
-        return new definition.ctor();
-      }
-      // Handle empty string for type extension.
-      if (!typeExtension && !definition.is) {
-        return new definition.ctor();
-      }
-    }
-
-    if (typeExtension) {
-      var element = createElement(tag);
-      element.setAttribute('is', typeExtension);
-      return element;
-    }
-    var element = domCreateElement(tag);
-    // Custom tags should be HTMLElements even if not upgraded.
-    if (tag.indexOf('-') >= 0) {
-      implement(element, HTMLElement);
-    }
-    return element;
-  }
-
-  function upgradeElement(element) {
-    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {
-      var is = element.getAttribute('is');
-      var definition = getRegisteredDefinition(is || element.localName);
-      if (definition) {
-        if (is && definition.tag == element.localName) {
-          return upgrade(element, definition);
-        } else if (!is && !definition.extends) {
-          return upgrade(element, definition);
-        }
-      }
-    }
-  }
-
-  function cloneNode(deep) {
-    // call original clone
-    var n = domCloneNode.call(this, deep);
-    // upgrade the element and subtree
-    scope.upgradeAll(n);
-    // return the clone
-    return n;
-  }
-  // capture native createElement before we override it
-
-  var domCreateElement = document.createElement.bind(document);
-  var domCreateElementNS = document.createElementNS.bind(document);
-
-  // capture native cloneNode before we override it
-
-  var domCloneNode = Node.prototype.cloneNode;
-
-  // exports
-
-  document.registerElement = register;
-  document.createElement = createElement; // override
-  document.createElementNS = createElementNS; // override
-  Node.prototype.cloneNode = cloneNode; // override
-
-  scope.registry = registry;
-
-  /**
-   * Upgrade an element to a custom element. Upgrading an element
-   * causes the custom prototype to be applied, an `is` attribute
-   * to be attached (as needed), and invocation of the `readyCallback`.
-   * `upgrade` does nothing if the element is already upgraded, or
-   * if it matches no registered custom tag name.
-   *
-   * @method ugprade
-   * @param {Element} element The element to upgrade.
-   * @return {Element} The upgraded element.
-   */
-  scope.upgrade = upgradeElement;
-}
-
-// Create a custom 'instanceof'. This is necessary when CustomElements
-// are implemented via a mixin strategy, as for example on IE10.
-var isInstance;
-if (!Object.__proto__ && !useNative) {
-  isInstance = function(obj, ctor) {
-    var p = obj;
-    while (p) {
-      // NOTE: this is not technically correct since we're not checking if
-      // an object is an instance of a constructor; however, this should
-      // be good enough for the mixin strategy.
-      if (p === ctor.prototype) {
-        return true;
-      }
-      p = p.__proto__;
-    }
-    return false;
-  }
-} else {
-  isInstance = function(obj, base) {
-    return obj instanceof base;
-  }
-}
-
-// exports
-scope.instanceof = isInstance;
-scope.reservedTagList = reservedTagList;
-
-// bc
-document.register = document.registerElement;
-
-scope.hasNative = hasNative;
-scope.useNative = useNative;
-
-})(window.CustomElements);
-
-/*
- * 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.
- */
-
-(function(scope) {
-
-// import
-
-var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-
-// highlander object for parsing a document tree
-
-var parser = {
-  selectors: [
-    'link[rel=' + IMPORT_LINK_TYPE + ']'
-  ],
-  map: {
-    link: 'parseLink'
-  },
-  parse: function(inDocument) {
-    if (!inDocument.__parsed) {
-      // only parse once
-      inDocument.__parsed = true;
-      // all parsable elements in inDocument (depth-first pre-order traversal)
-      var elts = inDocument.querySelectorAll(parser.selectors);
-      // for each parsable node type, call the mapped parsing method
-      forEach(elts, function(e) {
-        parser[parser.map[e.localName]](e);
-      });
-      // upgrade all upgradeable static elements, anything dynamically
-      // created should be caught by observer
-      CustomElements.upgradeDocument(inDocument);
-      // observe document for dom changes
-      CustomElements.observeDocument(inDocument);
-    }
-  },
-  parseLink: function(linkElt) {
-    // imports
-    if (isDocumentLink(linkElt)) {
-      this.parseImport(linkElt);
-    }
-  },
-  parseImport: function(linkElt) {
-    if (linkElt.import) {
-      parser.parse(linkElt.import);
-    }
-  }
-};
-
-function isDocumentLink(inElt) {
-  return (inElt.localName === 'link'
-      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);
-}
-
-var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-
-// exports
-
-scope.parser = parser;
-scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
-
-})(window.CustomElements);
-/*
- * 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.
- */
-(function(scope){
-
-// bootstrap parsing
-function bootstrap() {
-  // parse document
-  CustomElements.parser.parse(document);
-  // one more pass before register is 'live'
-  CustomElements.upgradeDocument(document);
-  // choose async
-  var async = window.Platform && Platform.endOfMicrotask ? 
-    Platform.endOfMicrotask :
-    setTimeout;
-  async(function() {
-    // set internal 'ready' flag, now document.registerElement will trigger 
-    // synchronous upgrades
-    CustomElements.ready = true;
-    // capture blunt profiling data
-    CustomElements.readyTime = Date.now();
-    if (window.HTMLImports) {
-      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;
-    }
-    // notify the system that we are bootstrapped
-    document.dispatchEvent(
-      new CustomEvent('WebComponentsReady', {bubbles: true})
-    );
-
-    // install upgrade hook if HTMLImports are available
-    if (window.HTMLImports) {
-      HTMLImports.__importsParsingHook = function(elt) {
-        CustomElements.parser.parse(elt.import);
-      }
-    }
-  });
-}
-
-// CustomEvent shim for IE
-if (typeof window.CustomEvent !== 'function') {
-  window.CustomEvent = function(inType) {
-    var e = document.createEvent('HTMLEvents');
-    e.initEvent(inType, true, true);
-    return e;
-  };
-}
-
-// When loading at readyState complete time (or via flag), boot custom elements
-// immediately.
-// If relevant, HTMLImports must already be loaded.
-if (document.readyState === 'complete' || scope.flags.eager) {
-  bootstrap();
-// When loading at readyState interactive time, bootstrap only if HTMLImports
-// are not pending. Also avoid IE as the semantics of this state are unreliable.
-} else if (document.readyState === 'interactive' && !window.attachEvent &&
-    (!window.HTMLImports || window.HTMLImports.ready)) {
-  bootstrap();
-// When loading at other readyStates, wait for the appropriate DOM event to 
-// bootstrap.
-} else {
-  var loadEvent = window.HTMLImports && !HTMLImports.ready ?
-      'HTMLImportsLoaded' : 'DOMContentLoaded';
-  window.addEventListener(loadEvent, bootstrap);
-}
-
-})(window.CustomElements);
-
-/*
- * 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.
- */
-(function() {
-
-if (window.ShadowDOMPolyfill) {
-
-  // ensure wrapped inputs for these functions
-  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',
-      'upgradeDocument'];
-
-  // cache originals
-  var original = {};
-  fns.forEach(function(fn) {
-    original[fn] = CustomElements[fn];
-  });
-
-  // override
-  fns.forEach(function(fn) {
-    CustomElements[fn] = function(inNode) {
-      return original[fn](wrap(inNode));
-    };
-  });
-
-}
-
-})();
-
-/*
- * Copyright 2014 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.
- */
-(function(scope) {
-  var endOfMicrotask = scope.endOfMicrotask;
-
-  // Generic url loader
-  function Loader(regex) {
-    this.regex = regex;
-  }
-  Loader.prototype = {
-    // TODO(dfreedm): there may be a better factoring here
-    // extract absolute urls from the text (full of relative urls)
-    extractUrls: function(text, base) {
-      var matches = [];
-      var matched, u;
-      while ((matched = this.regex.exec(text))) {
-        u = new URL(matched[1], base);
-        matches.push({matched: matched[0], url: u.href});
-      }
-      return matches;
-    },
-    // take a text blob, a root url, and a callback and load all the urls found within the text
-    // returns a map of absolute url to text
-    process: function(text, root, callback) {
-      var matches = this.extractUrls(text, root);
-      this.fetch(matches, {}, callback);
-    },
-    // build a mapping of url -> text from matches
-    fetch: function(matches, map, callback) {
-      var inflight = matches.length;
-
-      // return early if there is no fetching to be done
-      if (!inflight) {
-        return callback(map);
-      }
-
-      var done = function() {
-        if (--inflight === 0) {
-          callback(map);
-        }
-      };
-
-      // map url -> responseText
-      var handleXhr = function(err, request) {
-        var match = request.match;
-        var key = match.url;
-        // handle errors with an empty string
-        if (err) {
-          map[key] = '';
-          return done();
-        }
-        var response = request.response || request.responseText;
-        map[key] = response;
-        this.fetch(this.extractUrls(response, key), map, done);
-      };
-
-      var m, req, url;
-      for (var i = 0; i < inflight; i++) {
-        m = matches[i];
-        url = m.url;
-        // if this url has already been requested, skip requesting it again
-        if (map[url]) {
-          // Async call to done to simplify the inflight logic
-          endOfMicrotask(done);
-          continue;
-        }
-        req = this.xhr(url, handleXhr, this);
-        req.match = m;
-        // tag the map with an XHR request to deduplicate at the same level
-        map[url] = req;
-      }
-    },
-    xhr: function(url, callback, scope) {
-      var request = new XMLHttpRequest();
-      request.open('GET', url, true);
-      request.send();
-      request.onload = function() {
-        callback.call(scope, null, request);
-      };
-      request.onerror = function() {
-        callback.call(scope, null, request);
-      };
-      return request;
-    }
-  };
-
-  scope.Loader = Loader;
-})(window.Platform);
-
-/*
- * Copyright 2014 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.
- */
-(function(scope) {
-
-var urlResolver = scope.urlResolver;
-var Loader = scope.Loader;
-
-function StyleResolver() {
-  this.loader = new Loader(this.regex);
-}
-StyleResolver.prototype = {
-  regex: /@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,
-  // Recursively replace @imports with the text at that url
-  resolve: function(text, url, callback) {
-    var done = function(map) {
-      callback(this.flatten(text, url, map));
-    }.bind(this);
-    this.loader.process(text, url, done);
-  },
-  // resolve the textContent of a style node
-  resolveNode: function(style, callback) {
-    var text = style.textContent;
-    var url = style.ownerDocument.baseURI;
-    var done = function(text) {
-      style.textContent = text;
-      callback(style);
-    };
-    this.resolve(text, url, done);
-  },
-  // flatten all the @imports to text
-  flatten: function(text, base, map) {
-    var matches = this.loader.extractUrls(text, base);
-    var match, url, intermediate;
-    for (var i = 0; i < matches.length; i++) {
-      match = matches[i];
-      url = match.url;
-      // resolve any css text to be relative to the importer
-      intermediate = urlResolver.resolveCssText(map[url], url);
-      // flatten intermediate @imports
-      intermediate = this.flatten(intermediate, url, map);
-      text = text.replace(match.matched, intermediate);
-    }
-    return text;
-  },
-  loadStyles: function(styles, callback) {
-    var loaded=0, l = styles.length;
-    // called in the context of the style
-    function loadedStyle(style) {
-      loaded++;
-      if (loaded === l && callback) {
-        callback();
-      }
-    }
-    for (var i=0, s; (i<l) && (s=styles[i]); i++) {
-      this.resolveNode(s, loadedStyle);
-    }
-  }
-};
-
-var styleResolver = new StyleResolver();
-
-// exports
-scope.styleResolver = styleResolver;
-
-})(window.Platform);
-
-/*
- * 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.
- */
-
-(function(scope) {
-  scope = scope || {};
-  scope.external = scope.external || {};
-  var target = {
-    shadow: function(inEl) {
-      if (inEl) {
-        return inEl.shadowRoot || inEl.webkitShadowRoot;
-      }
-    },
-    canTarget: function(shadow) {
-      return shadow && Boolean(shadow.elementFromPoint);
-    },
-    targetingShadow: function(inEl) {
-      var s = this.shadow(inEl);
-      if (this.canTarget(s)) {
-        return s;
-      }
-    },
-    olderShadow: function(shadow) {
-      var os = shadow.olderShadowRoot;
-      if (!os) {
-        var se = shadow.querySelector('shadow');
-        if (se) {
-          os = se.olderShadowRoot;
-        }
-      }
-      return os;
-    },
-    allShadows: function(element) {
-      var shadows = [], s = this.shadow(element);
-      while(s) {
-        shadows.push(s);
-        s = this.olderShadow(s);
-      }
-      return shadows;
-    },
-    searchRoot: function(inRoot, x, y) {
-      if (inRoot) {
-        var t = inRoot.elementFromPoint(x, y);
-        var st, sr, os;
-        // is element a shadow host?
-        sr = this.targetingShadow(t);
-        while (sr) {
-          // find the the element inside the shadow root
-          st = sr.elementFromPoint(x, y);
-          if (!st) {
-            // check for older shadows
-            sr = this.olderShadow(sr);
-          } else {
-            // shadowed element may contain a shadow root
-            var ssr = this.targetingShadow(st);
-            return this.searchRoot(ssr, x, y) || st;
-          }
-        }
-        // light dom element is the target
-        return t;
-      }
-    },
-    owner: function(element) {
-      var s = element;
-      // walk up until you hit the shadow root or document
-      while (s.parentNode) {
-        s = s.parentNode;
-      }
-      // the owner element is expected to be a Document or ShadowRoot
-      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {
-        s = document;
-      }
-      return s;
-    },
-    findTarget: function(inEvent) {
-      var x = inEvent.clientX, y = inEvent.clientY;
-      // if the listener is in the shadow root, it is much faster to start there
-      var s = this.owner(inEvent.target);
-      // if x, y is not in this root, fall back to document search
-      if (!s.elementFromPoint(x, y)) {
-        s = document;
-      }
-      return this.searchRoot(s, x, y);
-    }
-  };
-  scope.targetFinding = target;
-  scope.findTarget = target.findTarget.bind(target);
-
-  window.PointerEventsPolyfill = scope;
-})(window.PointerEventsPolyfill);
-
-/*
- * 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.
- */
-(function() {
-  function shadowSelector(v) {
-    return 'body /shadow-deep/ ' + selector(v);
-  }
-  function selector(v) {
-    return '[touch-action="' + v + '"]';
-  }
-  function rule(v) {
-    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + '; touch-action-delay: none; }';
-  }
-  var attrib2css = [
-    'none',
-    'auto',
-    'pan-x',
-    'pan-y',
-    {
-      rule: 'pan-x pan-y',
-      selectors: [
-        'pan-x pan-y',
-        'pan-y pan-x'
-      ]
-    }
-  ];
-  var styles = '';
-  // only install stylesheet if the browser has touch action support
-  var head = document.head;
-  var hasNativePE = window.PointerEvent || window.MSPointerEvent;
-  // only add shadow selectors if shadowdom is supported
-  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;
-
-  if (hasNativePE) {
-    attrib2css.forEach(function(r) {
-      if (String(r) === r) {
-        styles += selector(r) + rule(r) + '\n';
-        if (hasShadowRoot) {
-          styles += shadowSelector(r) + rule(r) + '\n';
-        }
-      } else {
-        styles += r.selectors.map(selector) + rule(r.rule) + '\n';
-        if (hasShadowRoot) {
-          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\n';
-        }
-      }
-    });
-
-    var el = document.createElement('style');
-    el.textContent = styles;
-    document.head.appendChild(el);
-  }
-})();
-
-/*
- * 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.
- */
-
-/**
- * This is the constructor for new PointerEvents.
- *
- * New Pointer Events must be given a type, and an optional dictionary of
- * initialization properties.
- *
- * Due to certain platform requirements, events returned from the constructor
- * identify as MouseEvents.
- *
- * @constructor
- * @param {String} inType The type of the event to create.
- * @param {Object} [inDict] An optional dictionary of initial event properties.
- * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.
- */
-(function(scope) {
-
-  var MOUSE_PROPS = [
-    'bubbles',
-    'cancelable',
-    'view',
-    'detail',
-    'screenX',
-    'screenY',
-    'clientX',
-    'clientY',
-    'ctrlKey',
-    'altKey',
-    'shiftKey',
-    'metaKey',
-    'button',
-    'relatedTarget',
-    'pageX',
-    'pageY'
-  ];
-
-  var MOUSE_DEFAULTS = [
-    false,
-    false,
-    null,
-    null,
-    0,
-    0,
-    0,
-    0,
-    false,
-    false,
-    false,
-    false,
-    0,
-    null,
-    0,
-    0
-  ];
-
-  function PointerEvent(inType, inDict) {
-    inDict = inDict || Object.create(null);
-
-    var e = document.createEvent('Event');
-    e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);
-
-    // define inherited MouseEvent properties
-    for(var i = 0, p; i < MOUSE_PROPS.length; i++) {
-      p = MOUSE_PROPS[i];
-      e[p] = inDict[p] || MOUSE_DEFAULTS[i];
-    }
-    e.buttons = inDict.buttons || 0;
-
-    // Spec requires that pointers without pressure specified use 0.5 for down
-    // state and 0 for up state.
-    var pressure = 0;
-    if (inDict.pressure) {
-      pressure = inDict.pressure;
-    } else {
-      pressure = e.buttons ? 0.5 : 0;
-    }
-
-    // add x/y properties aliased to clientX/Y
-    e.x = e.clientX;
-    e.y = e.clientY;
-
-    // define the properties of the PointerEvent interface
-    e.pointerId = inDict.pointerId || 0;
-    e.width = inDict.width || 0;
-    e.height = inDict.height || 0;
-    e.pressure = pressure;
-    e.tiltX = inDict.tiltX || 0;
-    e.tiltY = inDict.tiltY || 0;
-    e.pointerType = inDict.pointerType || '';
-    e.hwTimestamp = inDict.hwTimestamp || 0;
-    e.isPrimary = inDict.isPrimary || false;
-    return e;
-  }
-
-  // attach to window
-  if (!scope.PointerEvent) {
-    scope.PointerEvent = PointerEvent;
-  }
-})(window);
-
-/*
- * 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.
- */
-
-/**
- * This module implements an map of pointer states
- */
-(function(scope) {
-  var USE_MAP = window.Map && window.Map.prototype.forEach;
-  var POINTERS_FN = function(){ return this.size; };
-  function PointerMap() {
-    if (USE_MAP) {
-      var m = new Map();
-      m.pointers = POINTERS_FN;
-      return m;
-    } else {
-      this.keys = [];
-      this.values = [];
-    }
-  }
-
-  PointerMap.prototype = {
-    set: function(inId, inEvent) {
-      var i = this.keys.indexOf(inId);
-      if (i > -1) {
-        this.values[i] = inEvent;
-      } else {
-        this.keys.push(inId);
-        this.values.push(inEvent);
-      }
-    },
-    has: function(inId) {
-      return this.keys.indexOf(inId) > -1;
-    },
-    'delete': function(inId) {
-      var i = this.keys.indexOf(inId);
-      if (i > -1) {
-        this.keys.splice(i, 1);
-        this.values.splice(i, 1);
-      }
-    },
-    get: function(inId) {
-      var i = this.keys.indexOf(inId);
-      return this.values[i];
-    },
-    clear: function() {
-      this.keys.length = 0;
-      this.values.length = 0;
-    },
-    // return value, key, map
-    forEach: function(callback, thisArg) {
-      this.values.forEach(function(v, i) {
-        callback.call(thisArg, v, this.keys[i], this);
-      }, this);
-    },
-    pointers: function() {
-      return this.keys.length;
-    }
-  };
-
-  scope.PointerMap = PointerMap;
-})(window.PointerEventsPolyfill);
-
-/*
- * 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.
- */
-
-(function(scope) {
-  var CLONE_PROPS = [
-    // MouseEvent
-    'bubbles',
-    'cancelable',
-    'view',
-    'detail',
-    'screenX',
-    'screenY',
-    'clientX',
-    'clientY',
-    'ctrlKey',
-    'altKey',
-    'shiftKey',
-    'metaKey',
-    'button',
-    'relatedTarget',
-    // DOM Level 3
-    'buttons',
-    // PointerEvent
-    'pointerId',
-    'width',
-    'height',
-    'pressure',
-    'tiltX',
-    'tiltY',
-    'pointerType',
-    'hwTimestamp',
-    'isPrimary',
-    // event instance
-    'type',
-    'target',
-    'currentTarget',
-    'which',
-    'pageX',
-    'pageY'
-  ];
-
-  var CLONE_DEFAULTS = [
-    // MouseEvent
-    false,
-    false,
-    null,
-    null,
-    0,
-    0,
-    0,
-    0,
-    false,
-    false,
-    false,
-    false,
-    0,
-    null,
-    // DOM Level 3
-    0,
-    // PointerEvent
-    0,
-    0,
-    0,
-    0,
-    0,
-    0,
-    '',
-    0,
-    false,
-    // event instance
-    '',
-    null,
-    null,
-    0,
-    0,
-    0
-  ];
-
-  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');
-
-  /**
-   * This module is for normalizing events. Mouse and Touch events will be
-   * collected here, and fire PointerEvents that have the same semantics, no
-   * matter the source.
-   * Events fired:
-   *   - pointerdown: a pointing is added
-   *   - pointerup: a pointer is removed
-   *   - pointermove: a pointer is moved
-   *   - pointerover: a pointer crosses into an element
-   *   - pointerout: a pointer leaves an element
-   *   - pointercancel: a pointer will no longer generate events
-   */
-  var dispatcher = {
-    pointermap: new scope.PointerMap(),
-    eventMap: Object.create(null),
-    captureInfo: Object.create(null),
-    // Scope objects for native events.
-    // This exists for ease of testing.
-    eventSources: Object.create(null),
-    eventSourceList: [],
-    /**
-     * Add a new event source that will generate pointer events.
-     *
-     * `inSource` must contain an array of event names named `events`, and
-     * functions with the names specified in the `events` array.
-     * @param {string} name A name for the event source
-     * @param {Object} source A new source of platform events.
-     */
-    registerSource: function(name, source) {
-      var s = source;
-      var newEvents = s.events;
-      if (newEvents) {
-        newEvents.forEach(function(e) {
-          if (s[e]) {
-            this.eventMap[e] = s[e].bind(s);
-          }
-        }, this);
-        this.eventSources[name] = s;
-        this.eventSourceList.push(s);
-      }
-    },
-    register: function(element) {
-      var l = this.eventSourceList.length;
-      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
-        // call eventsource register
-        es.register.call(es, element);
-      }
-    },
-    unregister: function(element) {
-      var l = this.eventSourceList.length;
-      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
-        // call eventsource register
-        es.unregister.call(es, element);
-      }
-    },
-    contains: scope.external.contains || function(container, contained) {
-      return container.contains(contained);
-    },
-    // EVENTS
-    down: function(inEvent) {
-      inEvent.bubbles = true;
-      this.fireEvent('pointerdown', inEvent);
-    },
-    move: function(inEvent) {
-      inEvent.bubbles = true;
-      this.fireEvent('pointermove', inEvent);
-    },
-    up: function(inEvent) {
-      inEvent.bubbles = true;
-      this.fireEvent('pointerup', inEvent);
-    },
-    enter: function(inEvent) {
-      inEvent.bubbles = false;
-      this.fireEvent('pointerenter', inEvent);
-    },
-    leave: function(inEvent) {
-      inEvent.bubbles = false;
-      this.fireEvent('pointerleave', inEvent);
-    },
-    over: function(inEvent) {
-      inEvent.bubbles = true;
-      this.fireEvent('pointerover', inEvent);
-    },
-    out: function(inEvent) {
-      inEvent.bubbles = true;
-      this.fireEvent('pointerout', inEvent);
-    },
-    cancel: function(inEvent) {
-      inEvent.bubbles = true;
-      this.fireEvent('pointercancel', inEvent);
-    },
-    leaveOut: function(event) {
-      this.out(event);
-      if (!this.contains(event.target, event.relatedTarget)) {
-        this.leave(event);
-      }
-    },
-    enterOver: function(event) {
-      this.over(event);
-      if (!this.contains(event.target, event.relatedTarget)) {
-        this.enter(event);
-      }
-    },
-    // LISTENER LOGIC
-    eventHandler: function(inEvent) {
-      // This is used to prevent multiple dispatch of pointerevents from
-      // platform events. This can happen when two elements in different scopes
-      // are set up to create pointer events, which is relevant to Shadow DOM.
-      if (inEvent._handledByPE) {
-        return;
-      }
-      var type = inEvent.type;
-      var fn = this.eventMap && this.eventMap[type];
-      if (fn) {
-        fn(inEvent);
-      }
-      inEvent._handledByPE = true;
-    },
-    // set up event listeners
-    listen: function(target, events) {
-      events.forEach(function(e) {
-        this.addEvent(target, e);
-      }, this);
-    },
-    // remove event listeners
-    unlisten: function(target, events) {
-      events.forEach(function(e) {
-        this.removeEvent(target, e);
-      }, this);
-    },
-    addEvent: scope.external.addEvent || function(target, eventName) {
-      target.addEventListener(eventName, this.boundHandler);
-    },
-    removeEvent: scope.external.removeEvent || function(target, eventName) {
-      target.removeEventListener(eventName, this.boundHandler);
-    },
-    // EVENT CREATION AND TRACKING
-    /**
-     * Creates a new Event of type `inType`, based on the information in
-     * `inEvent`.
-     *
-     * @param {string} inType A string representing the type of event to create
-     * @param {Event} inEvent A platform event with a target
-     * @return {Event} A PointerEvent of type `inType`
-     */
-    makeEvent: function(inType, inEvent) {
-      // relatedTarget must be null if pointer is captured
-      if (this.captureInfo[inEvent.pointerId]) {
-        inEvent.relatedTarget = null;
-      }
-      var e = new PointerEvent(inType, inEvent);
-      if (inEvent.preventDefault) {
-        e.preventDefault = inEvent.preventDefault;
-      }
-      e._target = e._target || inEvent.target;
-      return e;
-    },
-    // make and dispatch an event in one call
-    fireEvent: function(inType, inEvent) {
-      var e = this.makeEvent(inType, inEvent);
-      return this.dispatchEvent(e);
-    },
-    /**
-     * Returns a snapshot of inEvent, with writable properties.
-     *
-     * @param {Event} inEvent An event that contains properties to copy.
-     * @return {Object} An object containing shallow copies of `inEvent`'s
-     *    properties.
-     */
-    cloneEvent: function(inEvent) {
-      var eventCopy = Object.create(null), p;
-      for (var i = 0; i < CLONE_PROPS.length; i++) {
-        p = CLONE_PROPS[i];
-        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];
-        // Work around SVGInstanceElement shadow tree
-        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.
-        // This is the behavior implemented by Firefox.
-        if (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) {
-          if (eventCopy[p] instanceof SVGElementInstance) {
-            eventCopy[p] = eventCopy[p].correspondingUseElement;
-          }
-        }
-      }
-      // keep the semantics of preventDefault
-      if (inEvent.preventDefault) {
-        eventCopy.preventDefault = function() {
-          inEvent.preventDefault();
-        };
-      }
-      return eventCopy;
-    },
-    getTarget: function(inEvent) {
-      // if pointer capture is set, route all events for the specified pointerId
-      // to the capture target
-      return this.captureInfo[inEvent.pointerId] || inEvent._target;
-    },
-    setCapture: function(inPointerId, inTarget) {
-      if (this.captureInfo[inPointerId]) {
-        this.releaseCapture(inPointerId);
-      }
-      this.captureInfo[inPointerId] = inTarget;
-      var e = document.createEvent('Event');
-      e.initEvent('gotpointercapture', true, false);
-      e.pointerId = inPointerId;
-      this.implicitRelease = this.releaseCapture.bind(this, inPointerId);
-      document.addEventListener('pointerup', this.implicitRelease);
-      document.addEventListener('pointercancel', this.implicitRelease);
-      e._target = inTarget;
-      this.asyncDispatchEvent(e);
-    },
-    releaseCapture: function(inPointerId) {
-      var t = this.captureInfo[inPointerId];
-      if (t) {
-        var e = document.createEvent('Event');
-        e.initEvent('lostpointercapture', true, false);
-        e.pointerId = inPointerId;
-        this.captureInfo[inPointerId] = undefined;
-        document.removeEventListener('pointerup', this.implicitRelease);
-        document.removeEventListener('pointercancel', this.implicitRelease);
-        e._target = t;
-        this.asyncDispatchEvent(e);
-      }
-    },
-    /**
-     * Dispatches the event to its target.
-     *
-     * @param {Event} inEvent The event to be dispatched.
-     * @return {Boolean} True if an event handler returns true, false otherwise.
-     */
-    dispatchEvent: scope.external.dispatchEvent || function(inEvent) {
-      var t = this.getTarget(inEvent);
-      if (t) {
-        return t.dispatchEvent(inEvent);
-      }
-    },
-    asyncDispatchEvent: function(inEvent) {
-      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent));
-    }
-  };
-  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
-  scope.dispatcher = dispatcher;
-  scope.register = dispatcher.register.bind(dispatcher);
-  scope.unregister = dispatcher.unregister.bind(dispatcher);
-})(window.PointerEventsPolyfill);
-
-/*
- * 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.
- */
-
-/**
- * This module uses Mutation Observers to dynamically adjust which nodes will
- * generate Pointer Events.
- *
- * All nodes that wish to generate Pointer Events must have the attribute
- * `touch-action` set to `none`.
- */
-(function(scope) {
-  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-  var map = Array.prototype.map.call.bind(Array.prototype.map);
-  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);
-  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);
-  var MO = window.MutationObserver || window.WebKitMutationObserver;
-  var SELECTOR = '[touch-action]';
-  var OBSERVER_INIT = {
-    subtree: true,
-    childList: true,
-    attributes: true,
-    attributeOldValue: true,
-    attributeFilter: ['touch-action']
-  };
-
-  function Installer(add, remove, changed, binder) {
-    this.addCallback = add.bind(binder);
-    this.removeCallback = remove.bind(binder);
-    this.changedCallback = changed.bind(binder);
-    if (MO) {
-      this.observer = new MO(this.mutationWatcher.bind(this));
-    }
-  }
-
-  Installer.prototype = {
-    watchSubtree: function(target) {
-      // Only watch scopes that can target find, as these are top-level.
-      // Otherwise we can see duplicate additions and removals that add noise.
-      //
-      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see
-      // a removal without an insertion when a node is redistributed among
-      // shadows. Since it all ends up correct in the document, watching only
-      // the document will yield the correct mutations to watch.
-      if (scope.targetFinding.canTarget(target)) {
-        this.observer.observe(target, OBSERVER_INIT);
-      }
-    },
-    enableOnSubtree: function(target) {
-      this.watchSubtree(target);
-      if (target === document && document.readyState !== 'complete') {
-        this.installOnLoad();
-      } else {
-        this.installNewSubtree(target);
-      }
-    },
-    installNewSubtree: function(target) {
-      forEach(this.findElements(target), this.addElement, this);
-    },
-    findElements: function(target) {
-      if (target.querySelectorAll) {
-        return target.querySelectorAll(SELECTOR);
-      }
-      return [];
-    },
-    removeElement: function(el) {
-      this.removeCallback(el);
-    },
-    addElement: function(el) {
-      this.addCallback(el);
-    },
-    elementChanged: function(el, oldValue) {
-      this.changedCallback(el, oldValue);
-    },
-    concatLists: function(accum, list) {
-      return accum.concat(toArray(list));
-    },
-    // register all touch-action = none nodes on document load
-    installOnLoad: function() {
-      document.addEventListener('readystatechange', function() {
-        if (document.readyState === 'complete') {
-          this.installNewSubtree(document);
-        }
-      }.bind(this));
-    },
-    isElement: function(n) {
-      return n.nodeType === Node.ELEMENT_NODE;
-    },
-    flattenMutationTree: function(inNodes) {
-      // find children with touch-action
-      var tree = map(inNodes, this.findElements, this);
-      // make sure the added nodes are accounted for
-      tree.push(filter(inNodes, this.isElement));
-      // flatten the list
-      return tree.reduce(this.concatLists, []);
-    },
-    mutationWatcher: function(mutations) {
-      mutations.forEach(this.mutationHandler, this);
-    },
-    mutationHandler: function(m) {
-      if (m.type === 'childList') {
-        var added = this.flattenMutationTree(m.addedNodes);
-        added.forEach(this.addElement, this);
-        var removed = this.flattenMutationTree(m.removedNodes);
-        removed.forEach(this.removeElement, this);
-      } else if (m.type === 'attributes') {
-        this.elementChanged(m.target, m.oldValue);
-      }
-    }
-  };
-
-  if (!MO) {
-    Installer.prototype.watchSubtree = function(){
-      console.warn('PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected');
-    };
-  }
-
-  scope.Installer = Installer;
-})(window.PointerEventsPolyfill);
-
-/*
- * 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.
- */
-
-(function (scope) {
-  var dispatcher = scope.dispatcher;
-  var pointermap = dispatcher.pointermap;
-  // radius around touchend that swallows mouse events
-  var DEDUP_DIST = 25;
-
-  var WHICH_TO_BUTTONS = [0, 1, 4, 2];
-
-  var HAS_BUTTONS = false;
-  try {
-    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;
-  } catch (e) {}
-
-  // handler block for native mouse events
-  var mouseEvents = {
-    POINTER_ID: 1,
-    POINTER_TYPE: 'mouse',
-    events: [
-      'mousedown',
-      'mousemove',
-      'mouseup',
-      'mouseover',
-      'mouseout'
-    ],
-    register: function(target) {
-      dispatcher.listen(target, this.events);
-    },
-    unregister: function(target) {
-      dispatcher.unlisten(target, this.events);
-    },
-    lastTouches: [],
-    // collide with the global mouse listener
-    isEventSimulatedFromTouch: function(inEvent) {
-      var lts = this.lastTouches;
-      var x = inEvent.clientX, y = inEvent.clientY;
-      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {
-        // simulated mouse events will be swallowed near a primary touchend
-        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);
-        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {
-          return true;
-        }
-      }
-    },
-    prepareEvent: function(inEvent) {
-      var e = dispatcher.cloneEvent(inEvent);
-      // forward mouse preventDefault
-      var pd = e.preventDefault;
-      e.preventDefault = function() {
-        inEvent.preventDefault();
-        pd();
-      };
-      e.pointerId = this.POINTER_ID;
-      e.isPrimary = true;
-      e.pointerType = this.POINTER_TYPE;
-      if (!HAS_BUTTONS) {
-        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;
-      }
-      return e;
-    },
-    mousedown: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var p = pointermap.has(this.POINTER_ID);
-        // TODO(dfreedman) workaround for some elements not sending mouseup
-        // http://crbug/149091
-        if (p) {
-          this.cancel(inEvent);
-        }
-        var e = this.prepareEvent(inEvent);
-        pointermap.set(this.POINTER_ID, inEvent);
-        dispatcher.down(e);
-      }
-    },
-    mousemove: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var e = this.prepareEvent(inEvent);
-        dispatcher.move(e);
-      }
-    },
-    mouseup: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var p = pointermap.get(this.POINTER_ID);
-        if (p && p.button === inEvent.button) {
-          var e = this.prepareEvent(inEvent);
-          dispatcher.up(e);
-          this.cleanupMouse();
-        }
-      }
-    },
-    mouseover: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var e = this.prepareEvent(inEvent);
-        dispatcher.enterOver(e);
-      }
-    },
-    mouseout: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var e = this.prepareEvent(inEvent);
-        dispatcher.leaveOut(e);
-      }
-    },
-    cancel: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      dispatcher.cancel(e);
-      this.cleanupMouse();
-    },
-    cleanupMouse: function() {
-      pointermap['delete'](this.POINTER_ID);
-    }
-  };
-
-  scope.mouseEvents = mouseEvents;
-})(window.PointerEventsPolyfill);
-
-/*
- * 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.
- */
-
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  var captureInfo = dispatcher.captureInfo;
-  var findTarget = scope.findTarget;
-  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);
-  var pointermap = dispatcher.pointermap;
-  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);
-  // This should be long enough to ignore compat mouse events made by touch
-  var DEDUP_TIMEOUT = 2500;
-  var CLICK_COUNT_TIMEOUT = 200;
-  var ATTRIB = 'touch-action';
-  var INSTALLER;
-  // The presence of touch event handlers blocks scrolling, and so we must be careful to
-  // avoid adding handlers unnecessarily.  Chrome plans to add a touch-action-delay property
-  // (crbug.com/329559) to address this, and once we have that we can opt-in to a simpler
-  // handler registration mechanism.  Rather than try to predict how exactly to opt-in to
-  // that we'll just leave this disabled until there is a build of Chrome to test.
-  var HAS_TOUCH_ACTION_DELAY = false;
-  
-  // handler block for native touch events
-  var touchEvents = {
-    events: [
-      'touchstart',
-      'touchmove',
-      'touchend',
-      'touchcancel'
-    ],
-    register: function(target) {
-      if (HAS_TOUCH_ACTION_DELAY) {
-        dispatcher.listen(target, this.events);
-      } else {
-        INSTALLER.enableOnSubtree(target);
-      }
-    },
-    unregister: function(target) {
-      if (HAS_TOUCH_ACTION_DELAY) {
-        dispatcher.unlisten(target, this.events);
-      } else {
-        // TODO(dfreedman): is it worth it to disconnect the MO?
-      }
-    },
-    elementAdded: function(el) {
-      var a = el.getAttribute(ATTRIB);
-      var st = this.touchActionToScrollType(a);
-      if (st) {
-        el._scrollType = st;
-        dispatcher.listen(el, this.events);
-        // set touch-action on shadows as well
-        allShadows(el).forEach(function(s) {
-          s._scrollType = st;
-          dispatcher.listen(s, this.events);
-        }, this);
-      }
-    },
-    elementRemoved: function(el) {
-      el._scrollType = undefined;
-      dispatcher.unlisten(el, this.events);
-      // remove touch-action from shadow
-      allShadows(el).forEach(function(s) {
-        s._scrollType = undefined;
-        dispatcher.unlisten(s, this.events);
-      }, this);
-    },
-    elementChanged: function(el, oldValue) {
-      var a = el.getAttribute(ATTRIB);
-      var st = this.touchActionToScrollType(a);
-      var oldSt = this.touchActionToScrollType(oldValue);
-      // simply update scrollType if listeners are already established
-      if (st && oldSt) {
-        el._scrollType = st;
-        allShadows(el).forEach(function(s) {
-          s._scrollType = st;
-        }, this);
-      } else if (oldSt) {
-        this.elementRemoved(el);
-      } else if (st) {
-        this.elementAdded(el);
-      }
-    },
-    scrollTypes: {
-      EMITTER: 'none',
-      XSCROLLER: 'pan-x',
-      YSCROLLER: 'pan-y',
-      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/
-    },
-    touchActionToScrollType: function(touchAction) {
-      var t = touchAction;
-      var st = this.scrollTypes;
-      if (t === 'none') {
-        return 'none';
-      } else if (t === st.XSCROLLER) {
-        return 'X';
-      } else if (t === st.YSCROLLER) {
-        return 'Y';
-      } else if (st.SCROLLER.exec(t)) {
-        return 'XY';
-      }
-    },
-    POINTER_TYPE: 'touch',
-    firstTouch: null,
-    isPrimaryTouch: function(inTouch) {
-      return this.firstTouch === inTouch.identifier;
-    },
-    setPrimaryTouch: function(inTouch) {
-      // set primary touch if there no pointers, or the only pointer is the mouse
-      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {
-        this.firstTouch = inTouch.identifier;
-        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};
-        this.scrolling = false;
-        this.cancelResetClickCount();
-      }
-    },
-    removePrimaryPointer: function(inPointer) {
-      if (inPointer.isPrimary) {
-        this.firstTouch = null;
-        this.firstXY = null;
-        this.resetClickCount();
-      }
-    },
-    clickCount: 0,
-    resetId: null,
-    resetClickCount: function() {
-      var fn = function() {
-        this.clickCount = 0;
-        this.resetId = null;
-      }.bind(this);
-      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);
-    },
-    cancelResetClickCount: function() {
-      if (this.resetId) {
-        clearTimeout(this.resetId);
-      }
-    },
-    typeToButtons: function(type) {
-      var ret = 0;
-      if (type === 'touchstart' || type === 'touchmove') {
-        ret = 1;
-      }
-      return ret;
-    },
-    touchToPointer: function(inTouch) {
-      var cte = this.currentTouchEvent;
-      var e = dispatcher.cloneEvent(inTouch);
-      // Spec specifies that pointerId 1 is reserved for Mouse.
-      // Touch identifiers can start at 0.
-      // Add 2 to the touch identifier for compatibility.
-      var id = e.pointerId = inTouch.identifier + 2;
-      e.target = captureInfo[id] || findTarget(e);
-      e.bubbles = true;
-      e.cancelable = true;
-      e.detail = this.clickCount;
-      e.button = 0;
-      e.buttons = this.typeToButtons(cte.type);
-      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;
-      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;
-      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;
-      e.isPrimary = this.isPrimaryTouch(inTouch);
-      e.pointerType = this.POINTER_TYPE;
-      // forward touch preventDefaults
-      var self = this;
-      e.preventDefault = function() {
-        self.scrolling = false;
-        self.firstXY = null;
-        cte.preventDefault();
-      };
-      return e;
-    },
-    processTouches: function(inEvent, inFunction) {
-      var tl = inEvent.changedTouches;
-      this.currentTouchEvent = inEvent;
-      for (var i = 0, t; i < tl.length; i++) {
-        t = tl[i];
-        inFunction.call(this, this.touchToPointer(t));
-      }
-    },
-    // For single axis scrollers, determines whether the element should emit
-    // pointer events or behave as a scroller
-    shouldScroll: function(inEvent) {
-      if (this.firstXY) {
-        var ret;
-        var scrollAxis = inEvent.currentTarget._scrollType;
-        if (scrollAxis === 'none') {
-          // this element is a touch-action: none, should never scroll
-          ret = false;
-        } else if (scrollAxis === 'XY') {
-          // this element should always scroll
-          ret = true;
-        } else {
-          var t = inEvent.changedTouches[0];
-          // check the intended scroll axis, and other axis
-          var a = scrollAxis;
-          var oa = scrollAxis === 'Y' ? 'X' : 'Y';
-          var da = Math.abs(t['client' + a] - this.firstXY[a]);
-          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);
-          // if delta in the scroll axis > delta other axis, scroll instead of
-          // making events
-          ret = da >= doa;
-        }
-        this.firstXY = null;
-        return ret;
-      }
-    },
-    findTouch: function(inTL, inId) {
-      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {
-        if (t.identifier === inId) {
-          return true;
-        }
-      }
-    },
-    // In some instances, a touchstart can happen without a touchend. This
-    // leaves the pointermap in a broken state.
-    // Therefore, on every touchstart, we remove the touches that did not fire a
-    // touchend event.
-    // To keep state globally consistent, we fire a
-    // pointercancel for this "abandoned" touch
-    vacuumTouches: function(inEvent) {
-      var tl = inEvent.touches;
-      // pointermap.pointers() should be < tl.length here, as the touchstart has not
-      // been processed yet.
-      if (pointermap.pointers() >= tl.length) {
-        var d = [];
-        pointermap.forEach(function(value, key) {
-          // Never remove pointerId == 1, which is mouse.
-          // Touch identifiers are 2 smaller than their pointerId, which is the
-          // index in pointermap.
-          if (key !== 1 && !this.findTouch(tl, key - 2)) {
-            var p = value.out;
-            d.push(p);
-          }
-        }, this);
-        d.forEach(this.cancelOut, this);
-      }
-    },
-    touchstart: function(inEvent) {
-      this.vacuumTouches(inEvent);
-      this.setPrimaryTouch(inEvent.changedTouches[0]);
-      this.dedupSynthMouse(inEvent);
-      if (!this.scrolling) {
-        this.clickCount++;
-        this.processTouches(inEvent, this.overDown);
-      }
-    },
-    overDown: function(inPointer) {
-      var p = pointermap.set(inPointer.pointerId, {
-        target: inPointer.target,
-        out: inPointer,
-        outTarget: inPointer.target
-      });
-      dispatcher.over(inPointer);
-      dispatcher.enter(inPointer);
-      dispatcher.down(inPointer);
-    },
-    touchmove: function(inEvent) {
-      if (!this.scrolling) {
-        if (this.shouldScroll(inEvent)) {
-          this.scrolling = true;
-          this.touchcancel(inEvent);
-        } else {
-          inEvent.preventDefault();
-          this.processTouches(inEvent, this.moveOverOut);
-        }
-      }
-    },
-    moveOverOut: function(inPointer) {
-      var event = inPointer;
-      var pointer = pointermap.get(event.pointerId);
-      // a finger drifted off the screen, ignore it
-      if (!pointer) {
-        return;
-      }
-      var outEvent = pointer.out;
-      var outTarget = pointer.outTarget;
-      dispatcher.move(event);
-      if (outEvent && outTarget !== event.target) {
-        outEvent.relatedTarget = event.target;
-        event.relatedTarget = outTarget;
-        // recover from retargeting by shadow
-        outEvent.target = outTarget;
-        if (event.target) {
-          dispatcher.leaveOut(outEvent);
-          dispatcher.enterOver(event);
-        } else {
-          // clean up case when finger leaves the screen
-          event.target = outTarget;
-          event.relatedTarget = null;
-          this.cancelOut(event);
-        }
-      }
-      pointer.out = event;
-      pointer.outTarget = event.target;
-    },
-    touchend: function(inEvent) {
-      this.dedupSynthMouse(inEvent);
-      this.processTouches(inEvent, this.upOut);
-    },
-    upOut: function(inPointer) {
-      if (!this.scrolling) {
-        dispatcher.up(inPointer);
-        dispatcher.out(inPointer);
-        dispatcher.leave(inPointer);
-      }
-      this.cleanUpPointer(inPointer);
-    },
-    touchcancel: function(inEvent) {
-      this.processTouches(inEvent, this.cancelOut);
-    },
-    cancelOut: function(inPointer) {
-      dispatcher.cancel(inPointer);
-      dispatcher.out(inPointer);
-      dispatcher.leave(inPointer);
-      this.cleanUpPointer(inPointer);
-    },
-    cleanUpPointer: function(inPointer) {
-      pointermap['delete'](inPointer.pointerId);
-      this.removePrimaryPointer(inPointer);
-    },
-    // prevent synth mouse events from creating pointer events
-    dedupSynthMouse: function(inEvent) {
-      var lts = scope.mouseEvents.lastTouches;
-      var t = inEvent.changedTouches[0];
-      // only the primary finger will synth mouse events
-      if (this.isPrimaryTouch(t)) {
-        // remember x/y of last touch
-        var lt = {x: t.clientX, y: t.clientY};
-        lts.push(lt);
-        var fn = (function(lts, lt){
-          var i = lts.indexOf(lt);
-          if (i > -1) {
-            lts.splice(i, 1);
-          }
-        }).bind(null, lts, lt);
-        setTimeout(fn, DEDUP_TIMEOUT);
-      }
-    }
-  };
-
-  if (!HAS_TOUCH_ACTION_DELAY) {
-    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);
-  }
-
-  scope.touchEvents = touchEvents;
-})(window.PointerEventsPolyfill);
-
-/*
- * 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.
- */
-
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  var pointermap = dispatcher.pointermap;
-  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';
-  var msEvents = {
-    events: [
-      'MSPointerDown',
-      'MSPointerMove',
-      'MSPointerUp',
-      'MSPointerOut',
-      'MSPointerOver',
-      'MSPointerCancel',
-      'MSGotPointerCapture',
-      'MSLostPointerCapture'
-    ],
-    register: function(target) {
-      dispatcher.listen(target, this.events);
-    },
-    unregister: function(target) {
-      dispatcher.unlisten(target, this.events);
-    },
-    POINTER_TYPES: [
-      '',
-      'unavailable',
-      'touch',
-      'pen',
-      'mouse'
-    ],
-    prepareEvent: function(inEvent) {
-      var e = inEvent;
-      if (HAS_BITMAP_TYPE) {
-        e = dispatcher.cloneEvent(inEvent);
-        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];
-      }
-      return e;
-    },
-    cleanup: function(id) {
-      pointermap['delete'](id);
-    },
-    MSPointerDown: function(inEvent) {
-      pointermap.set(inEvent.pointerId, inEvent);
-      var e = this.prepareEvent(inEvent);
-      dispatcher.down(e);
-    },
-    MSPointerMove: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      dispatcher.move(e);
-    },
-    MSPointerUp: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      dispatcher.up(e);
-      this.cleanup(inEvent.pointerId);
-    },
-    MSPointerOut: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      dispatcher.leaveOut(e);
-    },
-    MSPointerOver: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      dispatcher.enterOver(e);
-    },
-    MSPointerCancel: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      dispatcher.cancel(e);
-      this.cleanup(inEvent.pointerId);
-    },
-    MSLostPointerCapture: function(inEvent) {
-      var e = dispatcher.makeEvent('lostpointercapture', inEvent);
-      dispatcher.dispatchEvent(e);
-    },
-    MSGotPointerCapture: function(inEvent) {
-      var e = dispatcher.makeEvent('gotpointercapture', inEvent);
-      dispatcher.dispatchEvent(e);
-    }
-  };
-
-  scope.msEvents = msEvents;
-})(window.PointerEventsPolyfill);
-
-/*
- * 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.
- */
-
-/**
- * This module contains the handlers for native platform events.
- * From here, the dispatcher is called to create unified pointer events.
- * Included are touch events (v1), mouse events, and MSPointerEvents.
- */
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-
-  // only activate if this platform does not have pointer events
-  if (window.PointerEvent !== scope.PointerEvent) {
-
-    if (window.navigator.msPointerEnabled) {
-      var tp = window.navigator.msMaxTouchPoints;
-      Object.defineProperty(window.navigator, 'maxTouchPoints', {
-        value: tp,
-        enumerable: true
-      });
-      dispatcher.registerSource('ms', scope.msEvents);
-    } else {
-      dispatcher.registerSource('mouse', scope.mouseEvents);
-      if (window.ontouchstart !== undefined) {
-        dispatcher.registerSource('touch', scope.touchEvents);
-      }
-    }
-
-    dispatcher.register(document);
-  }
-})(window.PointerEventsPolyfill);
-
-/*
- * 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.
- */
-
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  var n = window.navigator;
-  var s, r;
-  function assertDown(id) {
-    if (!dispatcher.pointermap.has(id)) {
-      throw new Error('InvalidPointerId');
-    }
-  }
-  if (n.msPointerEnabled) {
-    s = function(pointerId) {
-      assertDown(pointerId);
-      this.msSetPointerCapture(pointerId);
-    };
-    r = function(pointerId) {
-      assertDown(pointerId);
-      this.msReleasePointerCapture(pointerId);
-    };
-  } else {
-    s = function setPointerCapture(pointerId) {
-      assertDown(pointerId);
-      dispatcher.setCapture(pointerId, this);
-    };
-    r = function releasePointerCapture(pointerId) {
-      assertDown(pointerId);
-      dispatcher.releaseCapture(pointerId, this);
-    };
-  }
-  if (window.Element && !Element.prototype.setPointerCapture) {
-    Object.defineProperties(Element.prototype, {
-      'setPointerCapture': {
-        value: s
-      },
-      'releasePointerCapture': {
-        value: r
-      }
-    });
-  }
-})(window.PointerEventsPolyfill);
-
-/*
- * 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.
- */
-
-/**
- * PointerGestureEvent is the constructor for all PointerGesture events.
- *
- * @module PointerGestures
- * @class PointerGestureEvent
- * @extends UIEvent
- * @constructor
- * @param {String} inType Event type
- * @param {Object} [inDict] Dictionary of properties to initialize on the event
- */
-
-function PointerGestureEvent(inType, inDict) {
-  var dict = inDict || {};
-  var e = document.createEvent('Event');
-  var props = {
-    bubbles: Boolean(dict.bubbles) === dict.bubbles || true,
-    cancelable: Boolean(dict.cancelable) === dict.cancelable || true
-  };
-
-  e.initEvent(inType, props.bubbles, props.cancelable);
-
-  var keys = Object.keys(dict), k;
-  for (var i = 0; i < keys.length; i++) {
-    k = keys[i];
-    e[k] = dict[k];
-  }
-
-  e.preventTap = this.preventTap;
-
-  return e;
-}
-
-/**
- * Allows for any gesture to prevent the tap gesture.
- *
- * @method preventTap
- */
-PointerGestureEvent.prototype.preventTap = function() {
-  this.tapPrevented = true;
-};
-
-
-/*
- * 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.
- */
-
-(function(scope) {
-  /**
-   * This class contains the gesture recognizers that create the PointerGesture
-   * events.
-   *
-   * @class PointerGestures
-   * @static
-   */
-  scope = scope || {};
-  scope.utils = {
-    LCA: {
-      // Determines the lowest node in the ancestor chain of a and b
-      find: function(a, b) {
-        if (a === b) {
-          return a;
-        }
-        // fast case, a is a direct descendant of b or vice versa
-        if (a.contains) {
-          if (a.contains(b)) {
-            return a;
-          }
-          if (b.contains(a)) {
-            return b;
-          }
-        }
-        var adepth = this.depth(a);
-        var bdepth = this.depth(b);
-        var d = adepth - bdepth;
-        if (d > 0) {
-          a = this.walk(a, d);
-        } else {
-          b = this.walk(b, -d);
-        }
-        while(a && b && a !== b) {
-          a = this.walk(a, 1);
-          b = this.walk(b, 1);
-        }
-        return a;
-      },
-      walk: function(n, u) {
-        for (var i = 0; i < u; i++) {
-          n = n.parentNode;
-        }
-        return n;
-      },
-      depth: function(n) {
-        var d = 0;
-        while(n) {
-          d++;
-          n = n.parentNode;
-        }
-        return d;
-      }
-    }
-  };
-  scope.findLCA = function(a, b) {
-    return scope.utils.LCA.find(a, b);
-  }
-  window.PointerGestures = scope;
-})(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/**
- * This module implements an map of pointer states
- */
-(function(scope) {
-  var USE_MAP = window.Map && window.Map.prototype.forEach;
-  var POINTERS_FN = function(){ return this.size; };
-  function PointerMap() {
-    if (USE_MAP) {
-      var m = new Map();
-      m.pointers = POINTERS_FN;
-      return m;
-    } else {
-      this.keys = [];
-      this.values = [];
-    }
-  }
-
-  PointerMap.prototype = {
-    set: function(inId, inEvent) {
-      var i = this.keys.indexOf(inId);
-      if (i > -1) {
-        this.values[i] = inEvent;
-      } else {
-        this.keys.push(inId);
-        this.values.push(inEvent);
-      }
-    },
-    has: function(inId) {
-      return this.keys.indexOf(inId) > -1;
-    },
-    'delete': function(inId) {
-      var i = this.keys.indexOf(inId);
-      if (i > -1) {
-        this.keys.splice(i, 1);
-        this.values.splice(i, 1);
-      }
-    },
-    get: function(inId) {
-      var i = this.keys.indexOf(inId);
-      return this.values[i];
-    },
-    clear: function() {
-      this.keys.length = 0;
-      this.values.length = 0;
-    },
-    // return value, key, map
-    forEach: function(callback, thisArg) {
-      this.values.forEach(function(v, i) {
-        callback.call(thisArg, v, this.keys[i], this);
-      }, this);
-    },
-    pointers: function() {
-      return this.keys.length;
-    }
-  };
-
-  scope.PointerMap = PointerMap;
-})(window.PointerGestures);
-
-/*
- * 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.
- */
-
-(function(scope) {
-  var CLONE_PROPS = [
-    // MouseEvent
-    'bubbles',
-    'cancelable',
-    'view',
-    'detail',
-    'screenX',
-    'screenY',
-    'clientX',
-    'clientY',
-    'ctrlKey',
-    'altKey',
-    'shiftKey',
-    'metaKey',
-    'button',
-    'relatedTarget',
-    // DOM Level 3
-    'buttons',
-    // PointerEvent
-    'pointerId',
-    'width',
-    'height',
-    'pressure',
-    'tiltX',
-    'tiltY',
-    'pointerType',
-    'hwTimestamp',
-    'isPrimary',
-    // event instance
-    'type',
-    'target',
-    'currentTarget',
-    'screenX',
-    'screenY',
-    'pageX',
-    'pageY',
-    'tapPrevented'
-  ];
-
-  var CLONE_DEFAULTS = [
-    // MouseEvent
-    false,
-    false,
-    null,
-    null,
-    0,
-    0,
-    0,
-    0,
-    false,
-    false,
-    false,
-    false,
-    0,
-    null,
-    // DOM Level 3
-    0,
-    // PointerEvent
-    0,
-    0,
-    0,
-    0,
-    0,
-    0,
-    '',
-    0,
-    false,
-    // event instance
-    '',
-    null,
-    null,
-    0,
-    0,
-    0,
-    0
-  ];
-
-  var dispatcher = {
-    handledEvents: new WeakMap(),
-    targets: new WeakMap(),
-    handlers: {},
-    recognizers: {},
-    events: {},
-    // Add a new gesture recognizer to the event listeners.
-    // Recognizer needs an `events` property.
-    registerRecognizer: function(inName, inRecognizer) {
-      var r = inRecognizer;
-      this.recognizers[inName] = r;
-      r.events.forEach(function(e) {
-        if (r[e]) {
-          this.events[e] = true;
-          var f = r[e].bind(r);
-          this.addHandler(e, f);
-        }
-      }, this);
-    },
-    addHandler: function(inEvent, inFn) {
-      var e = inEvent;
-      if (!this.handlers[e]) {
-        this.handlers[e] = [];
-      }
-      this.handlers[e].push(inFn);
-    },
-    // add event listeners for inTarget
-    registerTarget: function(inTarget) {
-      this.listen(Object.keys(this.events), inTarget);
-    },
-    // remove event listeners for inTarget
-    unregisterTarget: function(inTarget) {
-      this.unlisten(Object.keys(this.events), inTarget);
-    },
-    // LISTENER LOGIC
-    eventHandler: function(inEvent) {
-      if (this.handledEvents.get(inEvent)) {
-        return;
-      }
-      var type = inEvent.type, fns = this.handlers[type];
-      if (fns) {
-        this.makeQueue(fns, inEvent);
-      }
-      this.handledEvents.set(inEvent, true);
-    },
-    // queue event for async dispatch
-    makeQueue: function(inHandlerFns, inEvent) {
-      // must clone events to keep the (possibly shadowed) target correct for
-      // async dispatching
-      var e = this.cloneEvent(inEvent);
-      requestAnimationFrame(this.runQueue.bind(this, inHandlerFns, e));
-    },
-    // Dispatch the queued events
-    runQueue: function(inHandlers, inEvent) {
-      this.currentPointerId = inEvent.pointerId;
-      for (var i = 0, f, l = inHandlers.length; (i < l) && (f = inHandlers[i]); i++) {
-        f(inEvent);
-      }
-      this.currentPointerId = 0;
-    },
-    // set up event listeners
-    listen: function(inEvents, inTarget) {
-      inEvents.forEach(function(e) {
-        this.addEvent(e, this.boundHandler, false, inTarget);
-      }, this);
-    },
-    // remove event listeners
-    unlisten: function(inEvents) {
-      inEvents.forEach(function(e) {
-        this.removeEvent(e, this.boundHandler, false, inTarget);
-      }, this);
-    },
-    addEvent: function(inEventName, inEventHandler, inCapture, inTarget) {
-      inTarget.addEventListener(inEventName, inEventHandler, inCapture);
-    },
-    removeEvent: function(inEventName, inEventHandler, inCapture, inTarget) {
-      inTarget.removeEventListener(inEventName, inEventHandler, inCapture);
-    },
-    // EVENT CREATION AND TRACKING
-    // Creates a new Event of type `inType`, based on the information in
-    // `inEvent`.
-    makeEvent: function(inType, inDict) {
-      return new PointerGestureEvent(inType, inDict);
-    },
-    /*
-     * Returns a snapshot of inEvent, with writable properties.
-     *
-     * @method cloneEvent
-     * @param {Event} inEvent An event that contains properties to copy.
-     * @return {Object} An object containing shallow copies of `inEvent`'s
-     *    properties.
-     */
-    cloneEvent: function(inEvent) {
-      var eventCopy = {}, p;
-      for (var i = 0; i < CLONE_PROPS.length; i++) {
-        p = CLONE_PROPS[i];
-        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];
-      }
-      return eventCopy;
-    },
-    // Dispatches the event to its target.
-    dispatchEvent: function(inEvent, inTarget) {
-      var t = inTarget || this.targets.get(inEvent);
-      if (t) {
-        t.dispatchEvent(inEvent);
-        if (inEvent.tapPrevented) {
-          this.preventTap(this.currentPointerId);
-        }
-      }
-    },
-    asyncDispatchEvent: function(inEvent, inTarget) {
-      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent, inTarget));
-    },
-    preventTap: function(inPointerId) {
-      var t = this.recognizers.tap;
-      if (t){
-        t.preventTap(inPointerId);
-      }
-    }
-  };
-  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
-  // recognizers call into the dispatcher and load later
-  // solve the chicken and egg problem by having registerScopes module run last
-  dispatcher.registerQueue = [];
-  dispatcher.immediateRegister = false;
-  scope.dispatcher = dispatcher;
-  /**
-   * Enable gesture events for a given scope, typically
-   * [ShadowRoots](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-root-object).
-   *
-   * @for PointerGestures
-   * @method register
-   * @param {ShadowRoot} scope A top level scope to enable gesture
-   * support on.
-   */
-  scope.register = function(inScope) {
-    if (dispatcher.immediateRegister) {
-      var pe = window.PointerEventsPolyfill;
-      if (pe) {
-        pe.register(inScope);
-      }
-      scope.dispatcher.registerTarget(inScope);
-    } else {
-      dispatcher.registerQueue.push(inScope);
-    }
-  };
-  scope.register(document);
-})(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/**
- * This event is fired when a pointer is held down for 200ms.
- *
- * @module PointerGestures
- * @submodule Events
- * @class hold
- */
-/**
- * Type of pointer that made the holding event.
- * @type String
- * @property pointerType
- */
-/**
- * Screen X axis position of the held pointer
- * @type Number
- * @property clientX
- */
-/**
- * Screen Y axis position of the held pointer
- * @type Number
- * @property clientY
- */
-/**
- * Type of pointer that made the holding event.
- * @type String
- * @property pointerType
- */
-/**
- * This event is fired every 200ms while a pointer is held down.
- *
- * @class holdpulse
- * @extends hold
- */
-/**
- * Milliseconds pointer has been held down.
- * @type Number
- * @property holdTime
- */
-/**
- * This event is fired when a held pointer is released or moved.
- *
- * @class released
- */
-
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  var hold = {
-    // wait at least HOLD_DELAY ms between hold and pulse events
-    HOLD_DELAY: 200,
-    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold
-    WIGGLE_THRESHOLD: 16,
-    events: [
-      'pointerdown',
-      'pointermove',
-      'pointerup',
-      'pointercancel'
-    ],
-    heldPointer: null,
-    holdJob: null,
-    pulse: function() {
-      var hold = Date.now() - this.heldPointer.timeStamp;
-      var type = this.held ? 'holdpulse' : 'hold';
-      this.fireHold(type, hold);
-      this.held = true;
-    },
-    cancel: function() {
-      clearInterval(this.holdJob);
-      if (this.held) {
-        this.fireHold('release');
-      }
-      this.held = false;
-      this.heldPointer = null;
-      this.target = null;
-      this.holdJob = null;
-    },
-    pointerdown: function(inEvent) {
-      if (inEvent.isPrimary && !this.heldPointer) {
-        this.heldPointer = inEvent;
-        this.target = inEvent.target;
-        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);
-      }
-    },
-    pointerup: function(inEvent) {
-      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {
-        this.cancel();
-      }
-    },
-    pointercancel: function(inEvent) {
-      this.cancel();
-    },
-    pointermove: function(inEvent) {
-      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {
-        var x = inEvent.clientX - this.heldPointer.clientX;
-        var y = inEvent.clientY - this.heldPointer.clientY;
-        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {
-          this.cancel();
-        }
-      }
-    },
-    fireHold: function(inType, inHoldTime) {
-      var p = {
-        pointerType: this.heldPointer.pointerType,
-        clientX: this.heldPointer.clientX,
-        clientY: this.heldPointer.clientY
-      };
-      if (inHoldTime) {
-        p.holdTime = inHoldTime;
-      }
-      var e = dispatcher.makeEvent(inType, p);
-      dispatcher.dispatchEvent(e, this.target);
-      if (e.tapPrevented) {
-        dispatcher.preventTap(this.heldPointer.pointerId);
-      }
-    }
-  };
-  dispatcher.registerRecognizer('hold', hold);
-})(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/**
- * This event denotes the beginning of a series of tracking events.
- *
- * @module PointerGestures
- * @submodule Events
- * @class trackstart
- */
-/**
- * Pixels moved in the x direction since trackstart.
- * @type Number
- * @property dx
- */
-/**
- * Pixes moved in the y direction since trackstart.
- * @type Number
- * @property dy
- */
-/**
- * Pixels moved in the x direction since the last track.
- * @type Number
- * @property ddx
- */
-/**
- * Pixles moved in the y direction since the last track.
- * @type Number
- * @property ddy
- */
-/**
- * The clientX position of the track gesture.
- * @type Number
- * @property clientX
- */
-/**
- * The clientY position of the track gesture.
- * @type Number
- * @property clientY
- */
-/**
- * The pageX position of the track gesture.
- * @type Number
- * @property pageX
- */
-/**
- * The pageY position of the track gesture.
- * @type Number
- * @property pageY
- */
-/**
- * The screenX position of the track gesture.
- * @type Number
- * @property screenX
- */
-/**
- * The screenY position of the track gesture.
- * @type Number
- * @property screenY
- */
-/**
- * The last x axis direction of the pointer.
- * @type Number
- * @property xDirection
- */
-/**
- * The last y axis direction of the pointer.
- * @type Number
- * @property yDirection
- */
-/**
- * A shared object between all tracking events.
- * @type Object
- * @property trackInfo
- */
-/**
- * The element currently under the pointer.
- * @type Element
- * @property relatedTarget
- */
-/**
- * The type of pointer that make the track gesture.
- * @type String
- * @property pointerType
- */
-/**
- *
- * This event fires for all pointer movement being tracked.
- *
- * @class track
- * @extends trackstart
- */
-/**
- * This event fires when the pointer is no longer being tracked.
- *
- * @class trackend
- * @extends trackstart
- */
-
- (function(scope) {
-   var dispatcher = scope.dispatcher;
-   var pointermap = new scope.PointerMap();
-   var track = {
-     events: [
-       'pointerdown',
-       'pointermove',
-       'pointerup',
-       'pointercancel'
-     ],
-     WIGGLE_THRESHOLD: 4,
-     clampDir: function(inDelta) {
-       return inDelta > 0 ? 1 : -1;
-     },
-     calcPositionDelta: function(inA, inB) {
-       var x = 0, y = 0;
-       if (inA && inB) {
-         x = inB.pageX - inA.pageX;
-         y = inB.pageY - inA.pageY;
-       }
-       return {x: x, y: y};
-     },
-     fireTrack: function(inType, inEvent, inTrackingData) {
-       var t = inTrackingData;
-       var d = this.calcPositionDelta(t.downEvent, inEvent);
-       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);
-       if (dd.x) {
-         t.xDirection = this.clampDir(dd.x);
-       }
-       if (dd.y) {
-         t.yDirection = this.clampDir(dd.y);
-       }
-       var trackData = {
-         dx: d.x,
-         dy: d.y,
-         ddx: dd.x,
-         ddy: dd.y,
-         clientX: inEvent.clientX,
-         clientY: inEvent.clientY,
-         pageX: inEvent.pageX,
-         pageY: inEvent.pageY,
-         screenX: inEvent.screenX,
-         screenY: inEvent.screenY,
-         xDirection: t.xDirection,
-         yDirection: t.yDirection,
-         trackInfo: t.trackInfo,
-         relatedTarget: inEvent.target,
-         pointerType: inEvent.pointerType
-       };
-       var e = dispatcher.makeEvent(inType, trackData);
-       t.lastMoveEvent = inEvent;
-       dispatcher.dispatchEvent(e, t.downTarget);
-     },
-     pointerdown: function(inEvent) {
-       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {
-         var p = {
-           downEvent: inEvent,
-           downTarget: inEvent.target,
-           trackInfo: {},
-           lastMoveEvent: null,
-           xDirection: 0,
-           yDirection: 0,
-           tracking: false
-         };
-         pointermap.set(inEvent.pointerId, p);
-       }
-     },
-     pointermove: function(inEvent) {
-       var p = pointermap.get(inEvent.pointerId);
-       if (p) {
-         if (!p.tracking) {
-           var d = this.calcPositionDelta(p.downEvent, inEvent);
-           var move = d.x * d.x + d.y * d.y;
-           // start tracking only if finger moves more than WIGGLE_THRESHOLD
-           if (move > this.WIGGLE_THRESHOLD) {
-             p.tracking = true;
-             this.fireTrack('trackstart', p.downEvent, p);
-             this.fireTrack('track', inEvent, p);
-           }
-         } else {
-           this.fireTrack('track', inEvent, p);
-         }
-       }
-     },
-     pointerup: function(inEvent) {
-       var p = pointermap.get(inEvent.pointerId);
-       if (p) {
-         if (p.tracking) {
-           this.fireTrack('trackend', inEvent, p);
-         }
-         pointermap.delete(inEvent.pointerId);
-       }
-     },
-     pointercancel: function(inEvent) {
-       this.pointerup(inEvent);
-     }
-   };
-   dispatcher.registerRecognizer('track', track);
- })(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/**
- * This event denotes a rapid down/move/up sequence from a pointer.
- *
- * The event is sent to the first element the pointer went down on.
- *
- * @module PointerGestures
- * @submodule Events
- * @class flick
- */
-/**
- * Signed velocity of the flick in the x direction.
- * @property xVelocity
- * @type Number
- */
-/**
- * Signed velocity of the flick in the y direction.
- * @type Number
- * @property yVelocity
- */
-/**
- * Unsigned total velocity of the flick.
- * @type Number
- * @property velocity
- */
-/**
- * Angle of the flick in degrees, with 0 along the
- * positive x axis.
- * @type Number
- * @property angle
- */
-/**
- * Axis with the greatest absolute velocity. Denoted
- * with 'x' or 'y'.
- * @type String
- * @property majorAxis
- */
-/**
- * Type of the pointer that made the flick.
- * @type String
- * @property pointerType
- */
-
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  var flick = {
-    // TODO(dfreedman): value should be low enough for low speed flicks, but
-    // high enough to remove accidental flicks
-    MIN_VELOCITY: 0.5 /* px/ms */,
-    MAX_QUEUE: 4,
-    moveQueue: [],
-    target: null,
-    pointerId: null,
-    events: [
-      'pointerdown',
-      'pointermove',
-      'pointerup',
-      'pointercancel'
-    ],
-    pointerdown: function(inEvent) {
-      if (inEvent.isPrimary && !this.pointerId) {
-        this.pointerId = inEvent.pointerId;
-        this.target = inEvent.target;
-        this.addMove(inEvent);
-      }
-    },
-    pointermove: function(inEvent) {
-      if (inEvent.pointerId === this.pointerId) {
-        this.addMove(inEvent);
-      }
-    },
-    pointerup: function(inEvent) {
-      if (inEvent.pointerId === this.pointerId) {
-        this.fireFlick(inEvent);
-      }
-      this.cleanup();
-    },
-    pointercancel: function(inEvent) {
-      this.cleanup();
-    },
-    cleanup: function() {
-      this.moveQueue = [];
-      this.target = null;
-      this.pointerId = null;
-    },
-    addMove: function(inEvent) {
-      if (this.moveQueue.length >= this.MAX_QUEUE) {
-        this.moveQueue.shift();
-      }
-      this.moveQueue.push(inEvent);
-    },
-    fireFlick: function(inEvent) {
-      var e = inEvent;
-      var l = this.moveQueue.length;
-      var dt, dx, dy, tx, ty, tv, x = 0, y = 0, v = 0;
-      // flick based off the fastest segment of movement
-      for (var i = 0, m; i < l && (m = this.moveQueue[i]); i++) {
-        dt = e.timeStamp - m.timeStamp;
-        dx = e.clientX - m.clientX, dy = e.clientY - m.clientY;
-        tx = dx / dt, ty = dy / dt, tv = Math.sqrt(tx * tx + ty * ty);
-        if (tv > v) {
-          x = tx, y = ty, v = tv;
-        }
-      }
-      var ma = Math.abs(x) > Math.abs(y) ? 'x' : 'y';
-      var a = this.calcAngle(x, y);
-      if (Math.abs(v) >= this.MIN_VELOCITY) {
-        var ev = dispatcher.makeEvent('flick', {
-          xVelocity: x,
-          yVelocity: y,
-          velocity: v,
-          angle: a,
-          majorAxis: ma,
-          pointerType: inEvent.pointerType
-        });
-        dispatcher.dispatchEvent(ev, this.target);
-      }
-    },
-    calcAngle: function(inX, inY) {
-      return (Math.atan2(inY, inX) * 180 / Math.PI);
-    }
-  };
-  dispatcher.registerRecognizer('flick', flick);
-})(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/*
- * Basic strategy: find the farthest apart points, use as diameter of circle
- * react to size change and rotation of the chord
- */
-
-/**
- * @module PointerGestures
- * @submodule Events
- * @class pinch
- */
-/**
- * Scale of the pinch zoom gesture
- * @property scale
- * @type Number
- */
-/**
- * Center X position of pointers causing pinch
- * @property centerX
- * @type Number
- */
-/**
- * Center Y position of pointers causing pinch
- * @property centerY
- * @type Number
- */
-
-/**
- * @module PointerGestures
- * @submodule Events
- * @class rotate
- */
-/**
- * Angle (in degrees) of rotation. Measured from starting positions of pointers.
- * @property angle
- * @type Number
- */
-/**
- * Center X position of pointers causing rotation
- * @property centerX
- * @type Number
- */
-/**
- * Center Y position of pointers causing rotation
- * @property centerY
- * @type Number
- */
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  var pointermap = new scope.PointerMap();
-  var RAD_TO_DEG = 180 / Math.PI;
-  var pinch = {
-    events: [
-      'pointerdown',
-      'pointermove',
-      'pointerup',
-      'pointercancel'
-    ],
-    reference: {},
-    pointerdown: function(ev) {
-      pointermap.set(ev.pointerId, ev);
-      if (pointermap.pointers() == 2) {
-        var points = this.calcChord();
-        var angle = this.calcAngle(points);
-        this.reference = {
-          angle: angle,
-          diameter: points.diameter,
-          target: scope.findLCA(points.a.target, points.b.target)
-        };
-      }
-    },
-    pointerup: function(ev) {
-      pointermap.delete(ev.pointerId);
-    },
-    pointermove: function(ev) {
-      if (pointermap.has(ev.pointerId)) {
-        pointermap.set(ev.pointerId, ev);
-        if (pointermap.pointers() > 1) {
-          this.calcPinchRotate();
-        }
-      }
-    },
-    pointercancel: function(ev) {
-      this.pointerup(ev);
-    },
-    dispatchPinch: function(diameter, points) {
-      var zoom = diameter / this.reference.diameter;
-      var ev = dispatcher.makeEvent('pinch', {
-        scale: zoom,
-        centerX: points.center.x,
-        centerY: points.center.y
-      });
-      dispatcher.dispatchEvent(ev, this.reference.target);
-    },
-    dispatchRotate: function(angle, points) {
-      var diff = Math.round((angle - this.reference.angle) % 360);
-      var ev = dispatcher.makeEvent('rotate', {
-        angle: diff,
-        centerX: points.center.x,
-        centerY: points.center.y
-      });
-      dispatcher.dispatchEvent(ev, this.reference.target);
-    },
-    calcPinchRotate: function() {
-      var points = this.calcChord();
-      var diameter = points.diameter;
-      var angle = this.calcAngle(points);
-      if (diameter != this.reference.diameter) {
-        this.dispatchPinch(diameter, points);
-      }
-      if (angle != this.reference.angle) {
-        this.dispatchRotate(angle, points);
-      }
-    },
-    calcChord: function() {
-      var pointers = [];
-      pointermap.forEach(function(p) {
-        pointers.push(p);
-      });
-      var dist = 0;
-      // start with at least two pointers
-      var points = {a: pointers[0], b: pointers[1]};
-      var x, y, d;
-      for (var i = 0; i < pointers.length; i++) {
-        var a = pointers[i];
-        for (var j = i + 1; j < pointers.length; j++) {
-          var b = pointers[j];
-          x = Math.abs(a.clientX - b.clientX);
-          y = Math.abs(a.clientY - b.clientY);
-          d = x + y;
-          if (d > dist) {
-            dist = d;
-            points = {a: a, b: b};
-          }
-        }
-      }
-      x = Math.abs(points.a.clientX + points.b.clientX) / 2;
-      y = Math.abs(points.a.clientY + points.b.clientY) / 2;
-      points.center = { x: x, y: y };
-      points.diameter = dist;
-      return points;
-    },
-    calcAngle: function(points) {
-      var x = points.a.clientX - points.b.clientX;
-      var y = points.a.clientY - points.b.clientY;
-      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;
-    },
-  };
-  dispatcher.registerRecognizer('pinch', pinch);
-})(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/**
- * This event is fired when a pointer quickly goes down and up, and is used to
- * denote activation.
- *
- * Any gesture event can prevent the tap event from being created by calling
- * `event.preventTap`.
- *
- * Any pointer event can prevent the tap by setting the `tapPrevented` property
- * on itself.
- *
- * @module PointerGestures
- * @submodule Events
- * @class tap
- */
-/**
- * X axis position of the tap.
- * @property x
- * @type Number
- */
-/**
- * Y axis position of the tap.
- * @property y
- * @type Number
- */
-/**
- * Type of the pointer that made the tap.
- * @property pointerType
- * @type String
- */
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  var pointermap = new scope.PointerMap();
-  var tap = {
-    events: [
-      'pointerdown',
-      'pointermove',
-      'pointerup',
-      'pointercancel',
-      'keyup'
-    ],
-    pointerdown: function(inEvent) {
-      if (inEvent.isPrimary && !inEvent.tapPrevented) {
-        pointermap.set(inEvent.pointerId, {
-          target: inEvent.target,
-          buttons: inEvent.buttons,
-          x: inEvent.clientX,
-          y: inEvent.clientY
-        });
-      }
-    },
-    pointermove: function(inEvent) {
-      if (inEvent.isPrimary) {
-        var start = pointermap.get(inEvent.pointerId);
-        if (start) {
-          if (inEvent.tapPrevented) {
-            pointermap.delete(inEvent.pointerId);
-          }
-        }
-      }
-    },
-    shouldTap: function(e, downState) {
-      if (!e.tapPrevented) {
-        if (e.pointerType === 'mouse') {
-          // only allow left click to tap for mouse
-          return downState.buttons === 1;
-        } else {
-          return true;
-        }
-      }
-    },
-    pointerup: function(inEvent) {
-      var start = pointermap.get(inEvent.pointerId);
-      if (start && this.shouldTap(inEvent, start)) {
-        var t = scope.findLCA(start.target, inEvent.target);
-        if (t) {
-          var e = dispatcher.makeEvent('tap', {
-            x: inEvent.clientX,
-            y: inEvent.clientY,
-            detail: inEvent.detail,
-            pointerType: inEvent.pointerType
-          });
-          dispatcher.dispatchEvent(e, t);
-        }
-      }
-      pointermap.delete(inEvent.pointerId);
-    },
-    pointercancel: function(inEvent) {
-      pointermap.delete(inEvent.pointerId);
-    },
-    keyup: function(inEvent) {
-      var code = inEvent.keyCode;
-      // 32 == spacebar
-      if (code === 32) {
-        var t = inEvent.target;
-        if (!(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement)) {
-          dispatcher.dispatchEvent(dispatcher.makeEvent('tap', {
-            x: 0,
-            y: 0,
-            detail: 0,
-            pointerType: 'unavailable'
-          }), t);
-        }
-      }
-    },
-    preventTap: function(inPointerId) {
-      pointermap.delete(inPointerId);
-    }
-  };
-  dispatcher.registerRecognizer('tap', tap);
-})(window.PointerGestures);
-
-/*
- * Copyright 2014 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.
- */
-
-/**
- * Because recognizers are loaded after dispatcher, we have to wait to register
- * scopes until after all the recognizers.
- */
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  function registerScopes() {
-    dispatcher.immediateRegister = true;
-    var rq = dispatcher.registerQueue;
-    rq.forEach(scope.register);
-    rq.length = 0;
-  }
-  if (document.readyState === 'complete') {
-    registerScopes();
-  } else {
-    // register scopes after a steadystate is reached
-    // less MutationObserver churn
-    document.addEventListener('readystatechange', function() {
-      if (document.readyState === 'complete') {
-        registerScopes();
-      }
-    });
-  }
-})(window.PointerGestures);
-
-// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-// Code distributed by Google as part of the polymer project is also
-// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-
-(function(global) {
-  'use strict';
-
-  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);
-
-  function getTreeScope(node) {
-    while (node.parentNode) {
-      node = node.parentNode;
-    }
-
-    return typeof node.getElementById === 'function' ? node : null;
-  }
-
-  Node.prototype.bind = function(name, observable) {
-    console.error('Unhandled binding to Node: ', this, name, observable);
-  };
-
-  function updateBindings(node, name, binding) {
-    var bindings = node.bindings_;
-    if (!bindings)
-      bindings = node.bindings_ = {};
-
-    if (bindings[name])
-      binding[name].close();
-
-    return bindings[name] = binding;
-  }
-
-  function returnBinding(node, name, binding) {
-    return binding;
-  }
-
-  function sanitizeValue(value) {
-    return value == null ? '' : value;
-  }
-
-  function updateText(node, value) {
-    node.data = sanitizeValue(value);
-  }
-
-  function textBinding(node) {
-    return function(value) {
-      return updateText(node, value);
-    };
-  }
-
-  var maybeUpdateBindings = returnBinding;
-
-  Object.defineProperty(Platform, 'enableBindingsReflection', {
-    get: function() {
-      return maybeUpdateBindings === updateBindings;
-    },
-    set: function(enable) {
-      maybeUpdateBindings = enable ? updateBindings : returnBinding;
-      return enable;
-    },
-    configurable: true
-  });
-
-  Text.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'textContent')
-      return Node.prototype.bind.call(this, name, value, oneTime);
-
-    if (oneTime)
-      return updateText(this, value);
-
-    var observable = value;
-    updateText(this, observable.open(textBinding(this)));
-    return maybeUpdateBindings(this, name, observable);
-  }
-
-  function updateAttribute(el, name, conditional, value) {
-    if (conditional) {
-      if (value)
-        el.setAttribute(name, '');
-      else
-        el.removeAttribute(name);
-      return;
-    }
-
-    el.setAttribute(name, sanitizeValue(value));
-  }
-
-  function attributeBinding(el, name, conditional) {
-    return function(value) {
-      updateAttribute(el, name, conditional, value);
-    };
-  }
-
-  Element.prototype.bind = function(name, value, oneTime) {
-    var conditional = name[name.length - 1] == '?';
-    if (conditional) {
-      this.removeAttribute(name);
-      name = name.slice(0, -1);
-    }
-
-    if (oneTime)
-      return updateAttribute(this, name, conditional, value);
-
-
-    var observable = value;
-    updateAttribute(this, name, conditional,
-        observable.open(attributeBinding(this, name, conditional)));
-
-    return maybeUpdateBindings(this, name, observable);
-  };
-
-  var checkboxEventType;
-  (function() {
-    // Attempt to feature-detect which event (change or click) is fired first
-    // for checkboxes.
-    var div = document.createElement('div');
-    var checkbox = div.appendChild(document.createElement('input'));
-    checkbox.setAttribute('type', 'checkbox');
-    var first;
-    var count = 0;
-    checkbox.addEventListener('click', function(e) {
-      count++;
-      first = first || 'click';
-    });
-    checkbox.addEventListener('change', function() {
-      count++;
-      first = first || 'change';
-    });
-
-    var event = document.createEvent('MouseEvent');
-    event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false,
-        false, false, false, 0, null);
-    checkbox.dispatchEvent(event);
-    // WebKit/Blink don't fire the change event if the element is outside the
-    // document, so assume 'change' for that case.
-    checkboxEventType = count == 1 ? 'change' : first;
-  })();
-
-  function getEventForInputType(element) {
-    switch (element.type) {
-      case 'checkbox':
-        return checkboxEventType;
-      case 'radio':
-      case 'select-multiple':
-      case 'select-one':
-        return 'change';
-      case 'range':
-        if (/Trident|MSIE/.test(navigator.userAgent))
-          return 'change';
-      default:
-        return 'input';
-    }
-  }
-
-  function updateInput(input, property, value, santizeFn) {
-    input[property] = (santizeFn || sanitizeValue)(value);
-  }
-
-  function inputBinding(input, property, santizeFn) {
-    return function(value) {
-      return updateInput(input, property, value, santizeFn);
-    }
-  }
-
-  function noop() {}
-
-  function bindInputEvent(input, property, observable, postEventFn) {
-    var eventType = getEventForInputType(input);
-
-    function eventHandler() {
-      observable.setValue(input[property]);
-      observable.discardChanges();
-      (postEventFn || noop)(input);
-      Platform.performMicrotaskCheckpoint();
-    }
-    input.addEventListener(eventType, eventHandler);
-
-    return {
-      close: function() {
-        input.removeEventListener(eventType, eventHandler);
-        observable.close();
-      },
-
-      observable_: observable
-    }
-  }
-
-  function booleanSanitize(value) {
-    return Boolean(value);
-  }
-
-  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.
-  // Returns an array containing all radio buttons other than |element| that
-  // have the same |name|, either in the form that |element| belongs to or,
-  // if no form, in the document tree to which |element| belongs.
-  //
-  // This implementation is based upon the HTML spec definition of a
-  // "radio button group":
-  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group
-  //
-  function getAssociatedRadioButtons(element) {
-    if (element.form) {
-      return filter(element.form.elements, function(el) {
-        return el != element &&
-            el.tagName == 'INPUT' &&
-            el.type == 'radio' &&
-            el.name == element.name;
-      });
-    } else {
-      var treeScope = getTreeScope(element);
-      if (!treeScope)
-        return [];
-      var radios = treeScope.querySelectorAll(
-          'input[type="radio"][name="' + element.name + '"]');
-      return filter(radios, function(el) {
-        return el != element && !el.form;
-      });
-    }
-  }
-
-  function checkedPostEvent(input) {
-    // Only the radio button that is getting checked gets an event. We
-    // therefore find all the associated radio buttons and update their
-    // check binding manually.
-    if (input.tagName === 'INPUT' &&
-        input.type === 'radio') {
-      getAssociatedRadioButtons(input).forEach(function(radio) {
-        var checkedBinding = radio.bindings_.checked;
-        if (checkedBinding) {
-          // Set the value directly to avoid an infinite call stack.
-          checkedBinding.observable_.setValue(false);
-        }
-      });
-    }
-  }
-
-  HTMLInputElement.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'value' && name !== 'checked')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute(name);
-    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;
-    var postEventFn = name == 'checked' ? checkedPostEvent : noop;
-
-    if (oneTime)
-      return updateInput(this, name, value, sanitizeFn);
-
-
-    var observable = value;
-    var binding = bindInputEvent(this, name, observable, postEventFn);
-    updateInput(this, name,
-                observable.open(inputBinding(this, name, sanitizeFn)),
-                sanitizeFn);
-
-    // Checkboxes may need to update bindings of other checkboxes.
-    return updateBindings(this, name, binding);
-  }
-
-  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'value')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute('value');
-
-    if (oneTime)
-      return updateInput(this, 'value', value);
-
-    var observable = value;
-    var binding = bindInputEvent(this, 'value', observable);
-    updateInput(this, 'value',
-                observable.open(inputBinding(this, 'value', sanitizeValue)));
-    return maybeUpdateBindings(this, name, binding);
-  }
-
-  function updateOption(option, value) {
-    var parentNode = option.parentNode;;
-    var select;
-    var selectBinding;
-    var oldValue;
-    if (parentNode instanceof HTMLSelectElement &&
-        parentNode.bindings_ &&
-        parentNode.bindings_.value) {
-      select = parentNode;
-      selectBinding = select.bindings_.value;
-      oldValue = select.value;
-    }
-
-    option.value = sanitizeValue(value);
-
-    if (select && select.value != oldValue) {
-      selectBinding.observable_.setValue(select.value);
-      selectBinding.observable_.discardChanges();
-      Platform.performMicrotaskCheckpoint();
-    }
-  }
-
-  function optionBinding(option) {
-    return function(value) {
-      updateOption(option, value);
-    }
-  }
-
-  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'value')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute('value');
-
-    if (oneTime)
-      return updateOption(this, value);
-
-    var observable = value;
-    var binding = bindInputEvent(this, 'value', observable);
-    updateOption(this, observable.open(optionBinding(this)));
-    return maybeUpdateBindings(this, name, binding);
-  }
-
-  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {
-    if (name === 'selectedindex')
-      name = 'selectedIndex';
-
-    if (name !== 'selectedIndex' && name !== 'value')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute(name);
-
-    if (oneTime)
-      return updateInput(this, name, value);
-
-    var observable = value;
-    var binding = bindInputEvent(this, name, observable);
-    updateInput(this, name,
-                observable.open(inputBinding(this, name)));
-
-    // Option update events may need to access select bindings.
-    return updateBindings(this, name, binding);
-  }
-})(this);
-
-// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-// Code distributed by Google as part of the polymer project is also
-// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-
-(function(global) {
-  'use strict';
-
-  function assert(v) {
-    if (!v)
-      throw new Error('Assertion failed');
-  }
-
-  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-
-  function getFragmentRoot(node) {
-    var p;
-    while (p = node.parentNode) {
-      node = p;
-    }
-
-    return node;
-  }
-
-  function searchRefId(node, id) {
-    if (!id)
-      return;
-
-    var ref;
-    var selector = '#' + id;
-    while (!ref) {
-      node = getFragmentRoot(node);
-
-      if (node.protoContent_)
-        ref = node.protoContent_.querySelector(selector);
-      else if (node.getElementById)
-        ref = node.getElementById(id);
-
-      if (ref || !node.templateCreator_)
-        break
-
-      node = node.templateCreator_;
-    }
-
-    return ref;
-  }
-
-  function getInstanceRoot(node) {
-    while (node.parentNode) {
-      node = node.parentNode;
-    }
-    return node.templateCreator_ ? node : null;
-  }
-
-  var Map;
-  if (global.Map && typeof global.Map.prototype.forEach === 'function') {
-    Map = global.Map;
-  } else {
-    Map = function() {
-      this.keys = [];
-      this.values = [];
-    };
-
-    Map.prototype = {
-      set: function(key, value) {
-        var index = this.keys.indexOf(key);
-        if (index < 0) {
-          this.keys.push(key);
-          this.values.push(value);
-        } else {
-          this.values[index] = value;
-        }
-      },
-
-      get: function(key) {
-        var index = this.keys.indexOf(key);
-        if (index < 0)
-          return;
-
-        return this.values[index];
-      },
-
-      delete: function(key, value) {
-        var index = this.keys.indexOf(key);
-        if (index < 0)
-          return false;
-
-        this.keys.splice(index, 1);
-        this.values.splice(index, 1);
-        return true;
-      },
-
-      forEach: function(f, opt_this) {
-        for (var i = 0; i < this.keys.length; i++)
-          f.call(opt_this || this, this.values[i], this.keys[i], this);
-      }
-    };
-  }
-
-  // JScript does not have __proto__. We wrap all object literals with
-  // createObject which uses Object.create, Object.defineProperty and
-  // Object.getOwnPropertyDescriptor to create a new object that does the exact
-  // same thing. The main downside to this solution is that we have to extract
-  // all those property descriptors for IE.
-  var createObject = ('__proto__' in {}) ?
-      function(obj) { return obj; } :
-      function(obj) {
-        var proto = obj.__proto__;
-        if (!proto)
-          return obj;
-        var newObject = Object.create(proto);
-        Object.getOwnPropertyNames(obj).forEach(function(name) {
-          Object.defineProperty(newObject, name,
-                               Object.getOwnPropertyDescriptor(obj, name));
-        });
-        return newObject;
-      };
-
-  // IE does not support have Document.prototype.contains.
-  if (typeof document.contains != 'function') {
-    Document.prototype.contains = function(node) {
-      if (node === this || node.parentNode === this)
-        return true;
-      return this.documentElement.contains(node);
-    }
-  }
-
-  var BIND = 'bind';
-  var REPEAT = 'repeat';
-  var IF = 'if';
-
-  var templateAttributeDirectives = {
-    'template': true,
-    'repeat': true,
-    'bind': true,
-    'ref': true
-  };
-
-  var semanticTemplateElements = {
-    'THEAD': true,
-    'TBODY': true,
-    'TFOOT': true,
-    'TH': true,
-    'TR': true,
-    'TD': true,
-    'COLGROUP': true,
-    'COL': true,
-    'CAPTION': true,
-    'OPTION': true,
-    'OPTGROUP': true
-  };
-
-  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';
-  if (hasTemplateElement) {
-    // TODO(rafaelw): Remove when fix for
-    // https://codereview.chromium.org/164803002/
-    // makes it to Chrome release.
-    (function() {
-      var t = document.createElement('template');
-      var d = t.content.ownerDocument;
-      var html = d.appendChild(d.createElement('html'));
-      var head = html.appendChild(d.createElement('head'));
-      var base = d.createElement('base');
-      base.href = document.baseURI;
-      head.appendChild(base);
-    })();
-  }
-
-  var allTemplatesSelectors = 'template, ' +
-      Object.keys(semanticTemplateElements).map(function(tagName) {
-        return tagName.toLowerCase() + '[template]';
-      }).join(', ');
-
-  function isSVGTemplate(el) {
-    return el.tagName == 'template' &&
-           el.namespaceURI == 'http://www.w3.org/2000/svg';
-  }
-
-  function isHTMLTemplate(el) {
-    return el.tagName == 'TEMPLATE' &&
-           el.namespaceURI == 'http://www.w3.org/1999/xhtml';
-  }
-
-  function isAttributeTemplate(el) {
-    return Boolean(semanticTemplateElements[el.tagName] &&
-                   el.hasAttribute('template'));
-  }
-
-  function isTemplate(el) {
-    if (el.isTemplate_ === undefined)
-      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);
-
-    return el.isTemplate_;
-  }
-
-  // FIXME: Observe templates being added/removed from documents
-  // FIXME: Expose imperative API to decorate and observe templates in
-  // "disconnected tress" (e.g. ShadowRoot)
-  document.addEventListener('DOMContentLoaded', function(e) {
-    bootstrapTemplatesRecursivelyFrom(document);
-    // FIXME: Is this needed? Seems like it shouldn't be.
-    Platform.performMicrotaskCheckpoint();
-  }, false);
-
-  function forAllTemplatesFrom(node, fn) {
-    var subTemplates = node.querySelectorAll(allTemplatesSelectors);
-
-    if (isTemplate(node))
-      fn(node)
-    forEach(subTemplates, fn);
-  }
-
-  function bootstrapTemplatesRecursivelyFrom(node) {
-    function bootstrap(template) {
-      if (!HTMLTemplateElement.decorate(template))
-        bootstrapTemplatesRecursivelyFrom(template.content);
-    }
-
-    forAllTemplatesFrom(node, bootstrap);
-  }
-
-  if (!hasTemplateElement) {
-    /**
-     * This represents a <template> element.
-     * @constructor
-     * @extends {HTMLElement}
-     */
-    global.HTMLTemplateElement = function() {
-      throw TypeError('Illegal constructor');
-    };
-  }
-
-  var hasProto = '__proto__' in {};
-
-  function mixin(to, from) {
-    Object.getOwnPropertyNames(from).forEach(function(name) {
-      Object.defineProperty(to, name,
-                            Object.getOwnPropertyDescriptor(from, name));
-    });
-  }
-
-  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner
-  function getOrCreateTemplateContentsOwner(template) {
-    var doc = template.ownerDocument
-    if (!doc.defaultView)
-      return doc;
-    var d = doc.templateContentsOwner_;
-    if (!d) {
-      // TODO(arv): This should either be a Document or HTMLDocument depending
-      // on doc.
-      d = doc.implementation.createHTMLDocument('');
-      while (d.lastChild) {
-        d.removeChild(d.lastChild);
-      }
-      doc.templateContentsOwner_ = d;
-    }
-    return d;
-  }
-
-  function getTemplateStagingDocument(template) {
-    if (!template.stagingDocument_) {
-      var owner = template.ownerDocument;
-      if (!owner.stagingDocument_) {
-        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');
-
-        // TODO(rafaelw): Remove when fix for
-        // https://codereview.chromium.org/164803002/
-        // makes it to Chrome release.
-        var base = owner.stagingDocument_.createElement('base');
-        base.href = document.baseURI;
-        owner.stagingDocument_.head.appendChild(base);
-
-        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;
-      }
-
-      template.stagingDocument_ = owner.stagingDocument_;
-    }
-
-    return template.stagingDocument_;
-  }
-
-  // For non-template browsers, the parser will disallow <template> in certain
-  // locations, so we allow "attribute templates" which combine the template
-  // element with the top-level container node of the content, e.g.
-  //
-  //   <tr template repeat="{{ foo }}"" class="bar"><td>Bar</td></tr>
-  //
-  // becomes
-  //
-  //   <template repeat="{{ foo }}">
-  //   + #document-fragment
-  //     + <tr class="bar">
-  //       + <td>Bar</td>
-  //
-  function extractTemplateFromAttributeTemplate(el) {
-    var template = el.ownerDocument.createElement('template');
-    el.parentNode.insertBefore(template, el);
-
-    var attribs = el.attributes;
-    var count = attribs.length;
-    while (count-- > 0) {
-      var attrib = attribs[count];
-      if (templateAttributeDirectives[attrib.name]) {
-        if (attrib.name !== 'template')
-          template.setAttribute(attrib.name, attrib.value);
-        el.removeAttribute(attrib.name);
-      }
-    }
-
-    return template;
-  }
-
-  function extractTemplateFromSVGTemplate(el) {
-    var template = el.ownerDocument.createElement('template');
-    el.parentNode.insertBefore(template, el);
-
-    var attribs = el.attributes;
-    var count = attribs.length;
-    while (count-- > 0) {
-      var attrib = attribs[count];
-      template.setAttribute(attrib.name, attrib.value);
-      el.removeAttribute(attrib.name);
-    }
-
-    el.parentNode.removeChild(el);
-    return template;
-  }
-
-  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {
-    var content = template.content;
-    if (useRoot) {
-      content.appendChild(el);
-      return;
-    }
-
-    var child;
-    while (child = el.firstChild) {
-      content.appendChild(child);
-    }
-  }
-
-  var templateObserver;
-  if (typeof MutationObserver == 'function') {
-    templateObserver = new MutationObserver(function(records) {
-      for (var i = 0; i < records.length; i++) {
-        records[i].target.refChanged_();
-      }
-    });
-  }
-
-  /**
-   * Ensures proper API and content model for template elements.
-   * @param {HTMLTemplateElement} opt_instanceRef The template element which
-   *     |el| template element will return as the value of its ref(), and whose
-   *     content will be used as source when createInstance() is invoked.
-   */
-  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {
-    if (el.templateIsDecorated_)
-      return false;
-
-    var templateElement = el;
-    templateElement.templateIsDecorated_ = true;
-
-    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&
-                               hasTemplateElement;
-    var bootstrapContents = isNativeHTMLTemplate;
-    var liftContents = !isNativeHTMLTemplate;
-    var liftRoot = false;
-
-    if (!isNativeHTMLTemplate) {
-      if (isAttributeTemplate(templateElement)) {
-        assert(!opt_instanceRef);
-        templateElement = extractTemplateFromAttributeTemplate(el);
-        templateElement.templateIsDecorated_ = true;
-        isNativeHTMLTemplate = hasTemplateElement;
-        liftRoot = true;
-      } else if (isSVGTemplate(templateElement)) {
-        templateElement = extractTemplateFromSVGTemplate(el);
-        templateElement.templateIsDecorated_ = true;
-        isNativeHTMLTemplate = hasTemplateElement;
-      }
-    }
-
-    if (!isNativeHTMLTemplate) {
-      fixTemplateElementPrototype(templateElement);
-      var doc = getOrCreateTemplateContentsOwner(templateElement);
-      templateElement.content_ = doc.createDocumentFragment();
-    }
-
-    if (opt_instanceRef) {
-      // template is contained within an instance, its direct content must be
-      // empty
-      templateElement.instanceRef_ = opt_instanceRef;
-    } else if (liftContents) {
-      liftNonNativeTemplateChildrenIntoContent(templateElement,
-                                               el,
-                                               liftRoot);
-    } else if (bootstrapContents) {
-      bootstrapTemplatesRecursivelyFrom(templateElement.content);
-    }
-
-    return true;
-  };
-
-  // TODO(rafaelw): This used to decorate recursively all templates from a given
-  // node. This happens by default on 'DOMContentLoaded', but may be needed
-  // in subtrees not descendent from document (e.g. ShadowRoot).
-  // Review whether this is the right public API.
-  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;
-
-  var htmlElement = global.HTMLUnknownElement || HTMLElement;
-
-  var contentDescriptor = {
-    get: function() {
-      return this.content_;
-    },
-    enumerable: true,
-    configurable: true
-  };
-
-  if (!hasTemplateElement) {
-    // Gecko is more picky with the prototype than WebKit. Make sure to use the
-    // same prototype as created in the constructor.
-    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);
-
-    Object.defineProperty(HTMLTemplateElement.prototype, 'content',
-                          contentDescriptor);
-  }
-
-  function fixTemplateElementPrototype(el) {
-    if (hasProto)
-      el.__proto__ = HTMLTemplateElement.prototype;
-    else
-      mixin(el, HTMLTemplateElement.prototype);
-  }
-
-  function ensureSetModelScheduled(template) {
-    if (!template.setModelFn_) {
-      template.setModelFn_ = function() {
-        template.setModelFnScheduled_ = false;
-        var map = getBindings(template,
-            template.delegate_ && template.delegate_.prepareBinding);
-        processBindings(template, map, template.model_);
-      };
-    }
-
-    if (!template.setModelFnScheduled_) {
-      template.setModelFnScheduled_ = true;
-      Observer.runEOM_(template.setModelFn_);
-    }
-  }
-
-  mixin(HTMLTemplateElement.prototype, {
-    bind: function(name, value, oneTime) {
-      if (name != 'ref')
-        return Element.prototype.bind.call(this, name, value, oneTime);
-
-      var self = this;
-      var ref = oneTime ? value : value.open(function(ref) {
-        self.setAttribute('ref', ref);
-        self.refChanged_();
-      });
-
-      this.setAttribute('ref', ref);
-      this.refChanged_();
-      if (oneTime)
-        return;
-
-      if (!this.bindings_) {
-        this.bindings_ = { ref: value };
-      } else {
-        this.bindings_.ref = value;
-      }
-
-      return value;
-    },
-
-    processBindingDirectives_: function(directives) {
-      if (this.iterator_)
-        this.iterator_.closeDeps();
-
-      if (!directives.if && !directives.bind && !directives.repeat) {
-        if (this.iterator_) {
-          this.iterator_.close();
-          this.iterator_ = undefined;
-        }
-
-        return;
-      }
-
-      if (!this.iterator_) {
-        this.iterator_ = new TemplateIterator(this);
-      }
-
-      this.iterator_.updateDependencies(directives, this.model_);
-
-      if (templateObserver) {
-        templateObserver.observe(this, { attributes: true,
-                                         attributeFilter: ['ref'] });
-      }
-
-      return this.iterator_;
-    },
-
-    createInstance: function(model, bindingDelegate, delegate_) {
-      if (bindingDelegate)
-        delegate_ = this.newDelegate_(bindingDelegate);
-
-      if (!this.refContent_)
-        this.refContent_ = this.ref_.content;
-      var content = this.refContent_;
-      if (content.firstChild === null)
-        return emptyInstance;
-
-      var map = this.bindingMap_;
-      if (!map || map.content !== content) {
-        // TODO(rafaelw): Setup a MutationObserver on content to detect
-        // when the instanceMap is invalid.
-        map = createInstanceBindingMap(content,
-            delegate_ && delegate_.prepareBinding) || [];
-        map.content = content;
-        this.bindingMap_ = map;
-      }
-
-      var stagingDocument = getTemplateStagingDocument(this);
-      var instance = stagingDocument.createDocumentFragment();
-      instance.templateCreator_ = this;
-      instance.protoContent_ = content;
-      instance.bindings_ = [];
-      instance.terminator_ = null;
-      var instanceRecord = instance.templateInstance_ = {
-        firstNode: null,
-        lastNode: null,
-        model: model
-      };
-
-      var i = 0;
-      var collectTerminator = false;
-      for (var child = content.firstChild; child; child = child.nextSibling) {
-        // The terminator of the instance is the clone of the last child of the
-        // content. If the last child is an active template, it may produce
-        // instances as a result of production, so simply collecting the last
-        // child of the instance after it has finished producing may be wrong.
-        if (child.nextSibling === null)
-          collectTerminator = true;
-
-        var clone = cloneAndBindInstance(child, instance, stagingDocument,
-                                         map.children[i++],
-                                         model,
-                                         delegate_,
-                                         instance.bindings_);
-        clone.templateInstance_ = instanceRecord;
-        if (collectTerminator)
-          instance.terminator_ = clone;
-      }
-
-      instanceRecord.firstNode = instance.firstChild;
-      instanceRecord.lastNode = instance.lastChild;
-      instance.templateCreator_ = undefined;
-      instance.protoContent_ = undefined;
-      return instance;
-    },
-
-    get model() {
-      return this.model_;
-    },
-
-    set model(model) {
-      this.model_ = model;
-      ensureSetModelScheduled(this);
-    },
-
-    get bindingDelegate() {
-      return this.delegate_ && this.delegate_.raw;
-    },
-
-    refChanged_: function() {
-      if (!this.iterator_ || this.refContent_ === this.ref_.content)
-        return;
-
-      this.refContent_ = undefined;
-      this.iterator_.valueChanged();
-      this.iterator_.updateIteratedValue();
-    },
-
-    clear: function() {
-      this.model_ = undefined;
-      this.delegate_ = undefined;
-      if (this.bindings_ && this.bindings_.ref)
-        this.bindings_.ref.close()
-      this.refContent_ = undefined;
-      if (!this.iterator_)
-        return;
-      this.iterator_.valueChanged();
-      this.iterator_.close()
-      this.iterator_ = undefined;
-    },
-
-    setDelegate_: function(delegate) {
-      this.delegate_ = delegate;
-      this.bindingMap_ = undefined;
-      if (this.iterator_) {
-        this.iterator_.instancePositionChangedFn_ = undefined;
-        this.iterator_.instanceModelFn_ = undefined;
-      }
-    },
-
-    newDelegate_: function(bindingDelegate) {
-      if (!bindingDelegate)
-        return {};
-
-      function delegateFn(name) {
-        var fn = bindingDelegate && bindingDelegate[name];
-        if (typeof fn != 'function')
-          return;
-
-        return function() {
-          return fn.apply(bindingDelegate, arguments);
-        };
-      }
-
-      return {
-        raw: bindingDelegate,
-        prepareBinding: delegateFn('prepareBinding'),
-        prepareInstanceModel: delegateFn('prepareInstanceModel'),
-        prepareInstancePositionChanged:
-            delegateFn('prepareInstancePositionChanged')
-      };
-    },
-
-    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may
-    // make sense to issue a warning or even throw if the template is already
-    // "activated", since this would be a strange thing to do.
-    set bindingDelegate(bindingDelegate) {
-      if (this.delegate_) {
-        throw Error('Template must be cleared before a new bindingDelegate ' +
-                    'can be assigned');
-      }
-
-      this.setDelegate_(this.newDelegate_(bindingDelegate));
-    },
-
-    get ref_() {
-      var ref = searchRefId(this, this.getAttribute('ref'));
-      if (!ref)
-        ref = this.instanceRef_;
-
-      if (!ref)
-        return this;
-
-      var nextRef = ref.ref_;
-      return nextRef ? nextRef : ref;
-    }
-  });
-
-  // Returns
-  //   a) undefined if there are no mustaches.
-  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.
-  function parseMustaches(s, name, node, prepareBindingFn) {
-    if (!s || !s.length)
-      return;
-
-    var tokens;
-    var length = s.length;
-    var startIndex = 0, lastIndex = 0, endIndex = 0;
-    var onlyOneTime = true;
-    while (lastIndex < length) {
-      var startIndex = s.indexOf('{{', lastIndex);
-      var oneTimeStart = s.indexOf('[[', lastIndex);
-      var oneTime = false;
-      var terminator = '}}';
-
-      if (oneTimeStart >= 0 &&
-          (startIndex < 0 || oneTimeStart < startIndex)) {
-        startIndex = oneTimeStart;
-        oneTime = true;
-        terminator = ']]';
-      }
-
-      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);
-
-      if (endIndex < 0) {
-        if (!tokens)
-          return;
-
-        tokens.push(s.slice(lastIndex)); // TEXT
-        break;
-      }
-
-      tokens = tokens || [];
-      tokens.push(s.slice(lastIndex, startIndex)); // TEXT
-      var pathString = s.slice(startIndex + 2, endIndex).trim();
-      tokens.push(oneTime); // ONE_TIME?
-      onlyOneTime = onlyOneTime && oneTime;
-      var delegateFn = prepareBindingFn &&
-                       prepareBindingFn(pathString, name, node);
-      // Don't try to parse the expression if there's a prepareBinding function
-      if (delegateFn == null) {
-        tokens.push(Path.get(pathString)); // PATH
-      } else {
-        tokens.push(null);
-      }
-      tokens.push(delegateFn); // DELEGATE_FN
-      lastIndex = endIndex + 2;
-    }
-
-    if (lastIndex === length)
-      tokens.push(''); // TEXT
-
-    tokens.hasOnePath = tokens.length === 5;
-    tokens.isSimplePath = tokens.hasOnePath &&
-                          tokens[0] == '' &&
-                          tokens[4] == '';
-    tokens.onlyOneTime = onlyOneTime;
-
-    tokens.combinator = function(values) {
-      var newValue = tokens[0];
-
-      for (var i = 1; i < tokens.length; i += 4) {
-        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];
-        if (value !== undefined)
-          newValue += value;
-        newValue += tokens[i + 3];
-      }
-
-      return newValue;
-    }
-
-    return tokens;
-  };
-
-  function processOneTimeBinding(name, tokens, node, model) {
-    if (tokens.hasOnePath) {
-      var delegateFn = tokens[3];
-      var value = delegateFn ? delegateFn(model, node, true) :
-                               tokens[2].getValueFrom(model);
-      return tokens.isSimplePath ? value : tokens.combinator(value);
-    }
-
-    var values = [];
-    for (var i = 1; i < tokens.length; i += 4) {
-      var delegateFn = tokens[i + 2];
-      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :
-          tokens[i + 1].getValueFrom(model);
-    }
-
-    return tokens.combinator(values);
-  }
-
-  function processSinglePathBinding(name, tokens, node, model) {
-    var delegateFn = tokens[3];
-    var observer = delegateFn ? delegateFn(model, node, false) :
-        new PathObserver(model, tokens[2]);
-
-    return tokens.isSimplePath ? observer :
-        new ObserverTransform(observer, tokens.combinator);
-  }
-
-  function processBinding(name, tokens, node, model) {
-    if (tokens.onlyOneTime)
-      return processOneTimeBinding(name, tokens, node, model);
-
-    if (tokens.hasOnePath)
-      return processSinglePathBinding(name, tokens, node, model);
-
-    var observer = new CompoundObserver();
-
-    for (var i = 1; i < tokens.length; i += 4) {
-      var oneTime = tokens[i];
-      var delegateFn = tokens[i + 2];
-
-      if (delegateFn) {
-        var value = delegateFn(model, node, oneTime);
-        if (oneTime)
-          observer.addPath(value)
-        else
-          observer.addObserver(value);
-        continue;
-      }
-
-      var path = tokens[i + 1];
-      if (oneTime)
-        observer.addPath(path.getValueFrom(model))
-      else
-        observer.addPath(model, path);
-    }
-
-    return new ObserverTransform(observer, tokens.combinator);
-  }
-
-  function processBindings(node, bindings, model, instanceBindings) {
-    for (var i = 0; i < bindings.length; i += 2) {
-      var name = bindings[i]
-      var tokens = bindings[i + 1];
-      var value = processBinding(name, tokens, node, model);
-      var binding = node.bind(name, value, tokens.onlyOneTime);
-      if (binding && instanceBindings)
-        instanceBindings.push(binding);
-    }
-
-    if (!bindings.isTemplate)
-      return;
-
-    node.model_ = model;
-    var iter = node.processBindingDirectives_(bindings);
-    if (instanceBindings && iter)
-      instanceBindings.push(iter);
-  }
-
-  function parseWithDefault(el, name, prepareBindingFn) {
-    var v = el.getAttribute(name);
-    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);
-  }
-
-  function parseAttributeBindings(element, prepareBindingFn) {
-    assert(element);
-
-    var bindings = [];
-    var ifFound = false;
-    var bindFound = false;
-
-    for (var i = 0; i < element.attributes.length; i++) {
-      var attr = element.attributes[i];
-      var name = attr.name;
-      var value = attr.value;
-
-      // Allow bindings expressed in attributes to be prefixed with underbars.
-      // We do this to allow correct semantics for browsers that don't implement
-      // <template> where certain attributes might trigger side-effects -- and
-      // for IE which sanitizes certain attributes, disallowing mustache
-      // replacements in their text.
-      while (name[0] === '_') {
-        name = name.substring(1);
-      }
-
-      if (isTemplate(element) &&
-          (name === IF || name === BIND || name === REPEAT)) {
-        continue;
-      }
-
-      var tokens = parseMustaches(value, name, element,
-                                  prepareBindingFn);
-      if (!tokens)
-        continue;
-
-      bindings.push(name, tokens);
-    }
-
-    if (isTemplate(element)) {
-      bindings.isTemplate = true;
-      bindings.if = parseWithDefault(element, IF, prepareBindingFn);
-      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);
-      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);
-
-      if (bindings.if && !bindings.bind && !bindings.repeat)
-        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);
-    }
-
-    return bindings;
-  }
-
-  function getBindings(node, prepareBindingFn) {
-    if (node.nodeType === Node.ELEMENT_NODE)
-      return parseAttributeBindings(node, prepareBindingFn);
-
-    if (node.nodeType === Node.TEXT_NODE) {
-      var tokens = parseMustaches(node.data, 'textContent', node,
-                                  prepareBindingFn);
-      if (tokens)
-        return ['textContent', tokens];
-    }
-
-    return [];
-  }
-
-  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,
-                                delegate,
-                                instanceBindings,
-                                instanceRecord) {
-    var clone = parent.appendChild(stagingDocument.importNode(node, false));
-
-    var i = 0;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      cloneAndBindInstance(child, clone, stagingDocument,
-                            bindings.children[i++],
-                            model,
-                            delegate,
-                            instanceBindings);
-    }
-
-    if (bindings.isTemplate) {
-      HTMLTemplateElement.decorate(clone, node);
-      if (delegate)
-        clone.setDelegate_(delegate);
-    }
-
-    processBindings(clone, bindings, model, instanceBindings);
-    return clone;
-  }
-
-  function createInstanceBindingMap(node, prepareBindingFn) {
-    var map = getBindings(node, prepareBindingFn);
-    map.children = {};
-    var index = 0;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);
-    }
-
-    return map;
-  }
-
-  Object.defineProperty(Node.prototype, 'templateInstance', {
-    get: function() {
-      var instance = this.templateInstance_;
-      return instance ? instance :
-          (this.parentNode ? this.parentNode.templateInstance : undefined);
-    }
-  });
-
-  var emptyInstance = document.createDocumentFragment();
-  emptyInstance.bindings_ = [];
-  emptyInstance.terminator_ = null;
-
-  function TemplateIterator(templateElement) {
-    this.closed = false;
-    this.templateElement_ = templateElement;
-    this.instances = [];
-    this.deps = undefined;
-    this.iteratedValue = [];
-    this.presentValue = undefined;
-    this.arrayObserver = undefined;
-  }
-
-  TemplateIterator.prototype = {
-    closeDeps: function() {
-      var deps = this.deps;
-      if (deps) {
-        if (deps.ifOneTime === false)
-          deps.ifValue.close();
-        if (deps.oneTime === false)
-          deps.value.close();
-      }
-    },
-
-    updateDependencies: function(directives, model) {
-      this.closeDeps();
-
-      var deps = this.deps = {};
-      var template = this.templateElement_;
-
-      if (directives.if) {
-        deps.hasIf = true;
-        deps.ifOneTime = directives.if.onlyOneTime;
-        deps.ifValue = processBinding(IF, directives.if, template, model);
-
-        // oneTime if & predicate is false. nothing else to do.
-        if (deps.ifOneTime && !deps.ifValue) {
-          this.updateIteratedValue();
-          return;
-        }
-
-        if (!deps.ifOneTime)
-          deps.ifValue.open(this.updateIteratedValue, this);
-      }
-
-      if (directives.repeat) {
-        deps.repeat = true;
-        deps.oneTime = directives.repeat.onlyOneTime;
-        deps.value = processBinding(REPEAT, directives.repeat, template, model);
-      } else {
-        deps.repeat = false;
-        deps.oneTime = directives.bind.onlyOneTime;
-        deps.value = processBinding(BIND, directives.bind, template, model);
-      }
-
-      if (!deps.oneTime)
-        deps.value.open(this.updateIteratedValue, this);
-
-      this.updateIteratedValue();
-    },
-
-    updateIteratedValue: function() {
-      if (this.deps.hasIf) {
-        var ifValue = this.deps.ifValue;
-        if (!this.deps.ifOneTime)
-          ifValue = ifValue.discardChanges();
-        if (!ifValue) {
-          this.valueChanged();
-          return;
-        }
-      }
-
-      var value = this.deps.value;
-      if (!this.deps.oneTime)
-        value = value.discardChanges();
-      if (!this.deps.repeat)
-        value = [value];
-      var observe = this.deps.repeat &&
-                    !this.deps.oneTime &&
-                    Array.isArray(value);
-      this.valueChanged(value, observe);
-    },
-
-    valueChanged: function(value, observeValue) {
-      if (!Array.isArray(value))
-        value = [];
-
-      if (value === this.iteratedValue)
-        return;
-
-      this.unobserve();
-      this.presentValue = value;
-      if (observeValue) {
-        this.arrayObserver = new ArrayObserver(this.presentValue);
-        this.arrayObserver.open(this.handleSplices, this);
-      }
-
-      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,
-                                                        this.iteratedValue));
-    },
-
-    getLastInstanceNode: function(index) {
-      if (index == -1)
-        return this.templateElement_;
-      var instance = this.instances[index];
-      var terminator = instance.terminator_;
-      if (!terminator)
-        return this.getLastInstanceNode(index - 1);
-
-      if (terminator.nodeType !== Node.ELEMENT_NODE ||
-          this.templateElement_ === terminator) {
-        return terminator;
-      }
-
-      var subtemplateIterator = terminator.iterator_;
-      if (!subtemplateIterator)
-        return terminator;
-
-      return subtemplateIterator.getLastTemplateNode();
-    },
-
-    getLastTemplateNode: function() {
-      return this.getLastInstanceNode(this.instances.length - 1);
-    },
-
-    insertInstanceAt: function(index, fragment) {
-      var previousInstanceLast = this.getLastInstanceNode(index - 1);
-      var parent = this.templateElement_.parentNode;
-      this.instances.splice(index, 0, fragment);
-
-      parent.insertBefore(fragment, previousInstanceLast.nextSibling);
-    },
-
-    extractInstanceAt: function(index) {
-      var previousInstanceLast = this.getLastInstanceNode(index - 1);
-      var lastNode = this.getLastInstanceNode(index);
-      var parent = this.templateElement_.parentNode;
-      var instance = this.instances.splice(index, 1)[0];
-
-      while (lastNode !== previousInstanceLast) {
-        var node = previousInstanceLast.nextSibling;
-        if (node == lastNode)
-          lastNode = previousInstanceLast;
-
-        instance.appendChild(parent.removeChild(node));
-      }
-
-      return instance;
-    },
-
-    getDelegateFn: function(fn) {
-      fn = fn && fn(this.templateElement_);
-      return typeof fn === 'function' ? fn : null;
-    },
-
-    handleSplices: function(splices) {
-      if (this.closed || !splices.length)
-        return;
-
-      var template = this.templateElement_;
-
-      if (!template.parentNode) {
-        this.close();
-        return;
-      }
-
-      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,
-                                 splices);
-
-      var delegate = template.delegate_;
-      if (this.instanceModelFn_ === undefined) {
-        this.instanceModelFn_ =
-            this.getDelegateFn(delegate && delegate.prepareInstanceModel);
-      }
-
-      if (this.instancePositionChangedFn_ === undefined) {
-        this.instancePositionChangedFn_ =
-            this.getDelegateFn(delegate &&
-                               delegate.prepareInstancePositionChanged);
-      }
-
-      // Instance Removals
-      var instanceCache = new Map;
-      var removeDelta = 0;
-      for (var i = 0; i < splices.length; i++) {
-        var splice = splices[i];
-        var removed = splice.removed;
-        for (var j = 0; j < removed.length; j++) {
-          var model = removed[j];
-          var instance = this.extractInstanceAt(splice.index + removeDelta);
-          if (instance !== emptyInstance) {
-            instanceCache.set(model, instance);
-          }
-        }
-
-        removeDelta -= splice.addedCount;
-      }
-
-      // Instance Insertions
-      for (var i = 0; i < splices.length; i++) {
-        var splice = splices[i];
-        var addIndex = splice.index;
-        for (; addIndex < splice.index + splice.addedCount; addIndex++) {
-          var model = this.iteratedValue[addIndex];
-          var instance = instanceCache.get(model);
-          if (instance) {
-            instanceCache.delete(model);
-          } else {
-            if (this.instanceModelFn_) {
-              model = this.instanceModelFn_(model);
-            }
-
-            if (model === undefined) {
-              instance = emptyInstance;
-            } else {
-              instance = template.createInstance(model, undefined, delegate);
-            }
-          }
-
-          this.insertInstanceAt(addIndex, instance);
-        }
-      }
-
-      instanceCache.forEach(function(instance) {
-        this.closeInstanceBindings(instance);
-      }, this);
-
-      if (this.instancePositionChangedFn_)
-        this.reportInstancesMoved(splices);
-    },
-
-    reportInstanceMoved: function(index) {
-      var instance = this.instances[index];
-      if (instance === emptyInstance)
-        return;
-
-      this.instancePositionChangedFn_(instance.templateInstance_, index);
-    },
-
-    reportInstancesMoved: function(splices) {
-      var index = 0;
-      var offset = 0;
-      for (var i = 0; i < splices.length; i++) {
-        var splice = splices[i];
-        if (offset != 0) {
-          while (index < splice.index) {
-            this.reportInstanceMoved(index);
-            index++;
-          }
-        } else {
-          index = splice.index;
-        }
-
-        while (index < splice.index + splice.addedCount) {
-          this.reportInstanceMoved(index);
-          index++;
-        }
-
-        offset += splice.addedCount - splice.removed.length;
-      }
-
-      if (offset == 0)
-        return;
-
-      var length = this.instances.length;
-      while (index < length) {
-        this.reportInstanceMoved(index);
-        index++;
-      }
-    },
-
-    closeInstanceBindings: function(instance) {
-      var bindings = instance.bindings_;
-      for (var i = 0; i < bindings.length; i++) {
-        bindings[i].close();
-      }
-    },
-
-    unobserve: function() {
-      if (!this.arrayObserver)
-        return;
-
-      this.arrayObserver.close();
-      this.arrayObserver = undefined;
-    },
-
-    close: function() {
-      if (this.closed)
-        return;
-      this.unobserve();
-      for (var i = 0; i < this.instances.length; i++) {
-        this.closeInstanceBindings(this.instances[i]);
-      }
-
-      this.instances.length = 0;
-      this.closeDeps();
-      this.templateElement_.iterator_ = undefined;
-      this.closed = true;
-    }
-  };
-
-  // Polyfill-specific API.
-  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;
-})(this);
-
-/*
-  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>
-  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>
-  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
-  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>
-  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
-  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>
-  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>
-  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>
-  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-(function (global) {
-    'use strict';
-
-    var Token,
-        TokenName,
-        Syntax,
-        Messages,
-        source,
-        index,
-        length,
-        delegate,
-        lookahead,
-        state;
-
-    Token = {
-        BooleanLiteral: 1,
-        EOF: 2,
-        Identifier: 3,
-        Keyword: 4,
-        NullLiteral: 5,
-        NumericLiteral: 6,
-        Punctuator: 7,
-        StringLiteral: 8
-    };
-
-    TokenName = {};
-    TokenName[Token.BooleanLiteral] = 'Boolean';
-    TokenName[Token.EOF] = '<end>';
-    TokenName[Token.Identifier] = 'Identifier';
-    TokenName[Token.Keyword] = 'Keyword';
-    TokenName[Token.NullLiteral] = 'Null';
-    TokenName[Token.NumericLiteral] = 'Numeric';
-    TokenName[Token.Punctuator] = 'Punctuator';
-    TokenName[Token.StringLiteral] = 'String';
-
-    Syntax = {
-        ArrayExpression: 'ArrayExpression',
-        BinaryExpression: 'BinaryExpression',
-        CallExpression: 'CallExpression',
-        ConditionalExpression: 'ConditionalExpression',
-        EmptyStatement: 'EmptyStatement',
-        ExpressionStatement: 'ExpressionStatement',
-        Identifier: 'Identifier',
-        Literal: 'Literal',
-        LabeledStatement: 'LabeledStatement',
-        LogicalExpression: 'LogicalExpression',
-        MemberExpression: 'MemberExpression',
-        ObjectExpression: 'ObjectExpression',
-        Program: 'Program',
-        Property: 'Property',
-        ThisExpression: 'ThisExpression',
-        UnaryExpression: 'UnaryExpression'
-    };
-
-    // Error messages should be identical to V8.
-    Messages = {
-        UnexpectedToken:  'Unexpected token %0',
-        UnknownLabel: 'Undefined label \'%0\'',
-        Redeclaration: '%0 \'%1\' has already been declared'
-    };
-
-    // Ensure the condition is true, otherwise throw an error.
-    // This is only to have a better contract semantic, i.e. another safety net
-    // to catch a logic error. The condition shall be fulfilled in normal case.
-    // Do NOT use this to enforce a certain condition on any user input.
-
-    function assert(condition, message) {
-        if (!condition) {
-            throw new Error('ASSERT: ' + message);
-        }
-    }
-
-    function isDecimalDigit(ch) {
-        return (ch >= 48 && ch <= 57);   // 0..9
-    }
-
-
-    // 7.2 White Space
-
-    function isWhiteSpace(ch) {
-        return (ch === 32) ||  // space
-            (ch === 9) ||      // tab
-            (ch === 0xB) ||
-            (ch === 0xC) ||
-            (ch === 0xA0) ||
-            (ch >= 0x1680 && '\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);
-    }
-
-    // 7.3 Line Terminators
-
-    function isLineTerminator(ch) {
-        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);
-    }
-
-    // 7.6 Identifier Names and Identifiers
-
-    function isIdentifierStart(ch) {
-        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)
-            (ch >= 65 && ch <= 90) ||         // A..Z
-            (ch >= 97 && ch <= 122);          // a..z
-    }
-
-    function isIdentifierPart(ch) {
-        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)
-            (ch >= 65 && ch <= 90) ||         // A..Z
-            (ch >= 97 && ch <= 122) ||        // a..z
-            (ch >= 48 && ch <= 57);           // 0..9
-    }
-
-    // 7.6.1.1 Keywords
-
-    function isKeyword(id) {
-        return (id === 'this')
-    }
-
-    // 7.4 Comments
-
-    function skipWhitespace() {
-        while (index < length && isWhiteSpace(source.charCodeAt(index))) {
-           ++index;
-        }
-    }
-
-    function getIdentifier() {
-        var start, ch;
-
-        start = index++;
-        while (index < length) {
-            ch = source.charCodeAt(index);
-            if (isIdentifierPart(ch)) {
-                ++index;
-            } else {
-                break;
-            }
-        }
-
-        return source.slice(start, index);
-    }
-
-    function scanIdentifier() {
-        var start, id, type;
-
-        start = index;
-
-        id = getIdentifier();
-
-        // There is no keyword or literal with only one character.
-        // Thus, it must be an identifier.
-        if (id.length === 1) {
-            type = Token.Identifier;
-        } else if (isKeyword(id)) {
-            type = Token.Keyword;
-        } else if (id === 'null') {
-            type = Token.NullLiteral;
-        } else if (id === 'true' || id === 'false') {
-            type = Token.BooleanLiteral;
-        } else {
-            type = Token.Identifier;
-        }
-
-        return {
-            type: type,
-            value: id,
-            range: [start, index]
-        };
-    }
-
-
-    // 7.7 Punctuators
-
-    function scanPunctuator() {
-        var start = index,
-            code = source.charCodeAt(index),
-            code2,
-            ch1 = source[index],
-            ch2;
-
-        switch (code) {
-
-        // Check for most common single-character punctuators.
-        case 46:   // . dot
-        case 40:   // ( open bracket
-        case 41:   // ) close bracket
-        case 59:   // ; semicolon
-        case 44:   // , comma
-        case 123:  // { open curly brace
-        case 125:  // } close curly brace
-        case 91:   // [
-        case 93:   // ]
-        case 58:   // :
-        case 63:   // ?
-            ++index;
-            return {
-                type: Token.Punctuator,
-                value: String.fromCharCode(code),
-                range: [start, index]
-            };
-
-        default:
-            code2 = source.charCodeAt(index + 1);
-
-            // '=' (char #61) marks an assignment or comparison operator.
-            if (code2 === 61) {
-                switch (code) {
-                case 37:  // %
-                case 38:  // &
-                case 42:  // *:
-                case 43:  // +
-                case 45:  // -
-                case 47:  // /
-                case 60:  // <
-                case 62:  // >
-                case 124: // |
-                    index += 2;
-                    return {
-                        type: Token.Punctuator,
-                        value: String.fromCharCode(code) + String.fromCharCode(code2),
-                        range: [start, index]
-                    };
-
-                case 33: // !
-                case 61: // =
-                    index += 2;
-
-                    // !== and ===
-                    if (source.charCodeAt(index) === 61) {
-                        ++index;
-                    }
-                    return {
-                        type: Token.Punctuator,
-                        value: source.slice(start, index),
-                        range: [start, index]
-                    };
-                default:
-                    break;
-                }
-            }
-            break;
-        }
-
-        // Peek more characters.
-
-        ch2 = source[index + 1];
-
-        // Other 2-character punctuators: && ||
-
-        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {
-            index += 2;
-            return {
-                type: Token.Punctuator,
-                value: ch1 + ch2,
-                range: [start, index]
-            };
-        }
-
-        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {
-            ++index;
-            return {
-                type: Token.Punctuator,
-                value: ch1,
-                range: [start, index]
-            };
-        }
-
-        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-    }
-
-    // 7.8.3 Numeric Literals
-    function scanNumericLiteral() {
-        var number, start, ch;
-
-        ch = source[index];
-        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),
-            'Numeric literal must start with a decimal digit or a decimal point');
-
-        start = index;
-        number = '';
-        if (ch !== '.') {
-            number = source[index++];
-            ch = source[index];
-
-            // Hex number starts with '0x'.
-            // Octal number starts with '0'.
-            if (number === '0') {
-                // decimal number starts with '0' such as '09' is illegal.
-                if (ch && isDecimalDigit(ch.charCodeAt(0))) {
-                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-                }
-            }
-
-            while (isDecimalDigit(source.charCodeAt(index))) {
-                number += source[index++];
-            }
-            ch = source[index];
-        }
-
-        if (ch === '.') {
-            number += source[index++];
-            while (isDecimalDigit(source.charCodeAt(index))) {
-                number += source[index++];
-            }
-            ch = source[index];
-        }
-
-        if (ch === 'e' || ch === 'E') {
-            number += source[index++];
-
-            ch = source[index];
-            if (ch === '+' || ch === '-') {
-                number += source[index++];
-            }
-            if (isDecimalDigit(source.charCodeAt(index))) {
-                while (isDecimalDigit(source.charCodeAt(index))) {
-                    number += source[index++];
-                }
-            } else {
-                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-            }
-        }
-
-        if (isIdentifierStart(source.charCodeAt(index))) {
-            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-        }
-
-        return {
-            type: Token.NumericLiteral,
-            value: parseFloat(number),
-            range: [start, index]
-        };
-    }
-
-    // 7.8.4 String Literals
-
-    function scanStringLiteral() {
-        var str = '', quote, start, ch, octal = false;
-
-        quote = source[index];
-        assert((quote === '\'' || quote === '"'),
-            'String literal must starts with a quote');
-
-        start = index;
-        ++index;
-
-        while (index < length) {
-            ch = source[index++];
-
-            if (ch === quote) {
-                quote = '';
-                break;
-            } else if (ch === '\\') {
-                ch = source[index++];
-                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {
-                    switch (ch) {
-                    case 'n':
-                        str += '\n';
-                        break;
-                    case 'r':
-                        str += '\r';
-                        break;
-                    case 't':
-                        str += '\t';
-                        break;
-                    case 'b':
-                        str += '\b';
-                        break;
-                    case 'f':
-                        str += '\f';
-                        break;
-                    case 'v':
-                        str += '\x0B';
-                        break;
-
-                    default:
-                        str += ch;
-                        break;
-                    }
-                } else {
-                    if (ch ===  '\r' && source[index] === '\n') {
-                        ++index;
-                    }
-                }
-            } else if (isLineTerminator(ch.charCodeAt(0))) {
-                break;
-            } else {
-                str += ch;
-            }
-        }
-
-        if (quote !== '') {
-            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-        }
-
-        return {
-            type: Token.StringLiteral,
-            value: str,
-            octal: octal,
-            range: [start, index]
-        };
-    }
-
-    function isIdentifierName(token) {
-        return token.type === Token.Identifier ||
-            token.type === Token.Keyword ||
-            token.type === Token.BooleanLiteral ||
-            token.type === Token.NullLiteral;
-    }
-
-    function advance() {
-        var ch;
-
-        skipWhitespace();
-
-        if (index >= length) {
-            return {
-                type: Token.EOF,
-                range: [index, index]
-            };
-        }
-
-        ch = source.charCodeAt(index);
-
-        // Very common: ( and ) and ;
-        if (ch === 40 || ch === 41 || ch === 58) {
-            return scanPunctuator();
-        }
-
-        // String literal starts with single quote (#39) or double quote (#34).
-        if (ch === 39 || ch === 34) {
-            return scanStringLiteral();
-        }
-
-        if (isIdentifierStart(ch)) {
-            return scanIdentifier();
-        }
-
-        // Dot (.) char #46 can also start a floating-point number, hence the need
-        // to check the next character.
-        if (ch === 46) {
-            if (isDecimalDigit(source.charCodeAt(index + 1))) {
-                return scanNumericLiteral();
-            }
-            return scanPunctuator();
-        }
-
-        if (isDecimalDigit(ch)) {
-            return scanNumericLiteral();
-        }
-
-        return scanPunctuator();
-    }
-
-    function lex() {
-        var token;
-
-        token = lookahead;
-        index = token.range[1];
-
-        lookahead = advance();
-
-        index = token.range[1];
-
-        return token;
-    }
-
-    function peek() {
-        var pos;
-
-        pos = index;
-        lookahead = advance();
-        index = pos;
-    }
-
-    // Throw an exception
-
-    function throwError(token, messageFormat) {
-        var error,
-            args = Array.prototype.slice.call(arguments, 2),
-            msg = messageFormat.replace(
-                /%(\d)/g,
-                function (whole, index) {
-                    assert(index < args.length, 'Message reference must be in range');
-                    return args[index];
-                }
-            );
-
-        error = new Error(msg);
-        error.index = index;
-        error.description = msg;
-        throw error;
-    }
-
-    // Throw an exception because of the token.
-
-    function throwUnexpected(token) {
-        throwError(token, Messages.UnexpectedToken, token.value);
-    }
-
-    // Expect the next token to match the specified punctuator.
-    // If not, an exception will be thrown.
-
-    function expect(value) {
-        var token = lex();
-        if (token.type !== Token.Punctuator || token.value !== value) {
-            throwUnexpected(token);
-        }
-    }
-
-    // Return true if the next token matches the specified punctuator.
-
-    function match(value) {
-        return lookahead.type === Token.Punctuator && lookahead.value === value;
-    }
-
-    // Return true if the next token matches the specified keyword
-
-    function matchKeyword(keyword) {
-        return lookahead.type === Token.Keyword && lookahead.value === keyword;
-    }
-
-    function consumeSemicolon() {
-        // Catch the very common case first: immediately a semicolon (char #59).
-        if (source.charCodeAt(index) === 59) {
-            lex();
-            return;
-        }
-
-        skipWhitespace();
-
-        if (match(';')) {
-            lex();
-            return;
-        }
-
-        if (lookahead.type !== Token.EOF && !match('}')) {
-            throwUnexpected(lookahead);
-        }
-    }
-
-    // 11.1.4 Array Initialiser
-
-    function parseArrayInitialiser() {
-        var elements = [];
-
-        expect('[');
-
-        while (!match(']')) {
-            if (match(',')) {
-                lex();
-                elements.push(null);
-            } else {
-                elements.push(parseExpression());
-
-                if (!match(']')) {
-                    expect(',');
-                }
-            }
-        }
-
-        expect(']');
-
-        return delegate.createArrayExpression(elements);
-    }
-
-    // 11.1.5 Object Initialiser
-
-    function parseObjectPropertyKey() {
-        var token;
-
-        skipWhitespace();
-        token = lex();
-
-        // Note: This function is called only from parseObjectProperty(), where
-        // EOF and Punctuator tokens are already filtered out.
-        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {
-            return delegate.createLiteral(token);
-        }
-
-        return delegate.createIdentifier(token.value);
-    }
-
-    function parseObjectProperty() {
-        var token, key;
-
-        token = lookahead;
-        skipWhitespace();
-
-        if (token.type === Token.EOF || token.type === Token.Punctuator) {
-            throwUnexpected(token);
-        }
-
-        key = parseObjectPropertyKey();
-        expect(':');
-        return delegate.createProperty('init', key, parseExpression());
-    }
-
-    function parseObjectInitialiser() {
-        var properties = [];
-
-        expect('{');
-
-        while (!match('}')) {
-            properties.push(parseObjectProperty());
-
-            if (!match('}')) {
-                expect(',');
-            }
-        }
-
-        expect('}');
-
-        return delegate.createObjectExpression(properties);
-    }
-
-    // 11.1.6 The Grouping Operator
-
-    function parseGroupExpression() {
-        var expr;
-
-        expect('(');
-
-        expr = parseExpression();
-
-        expect(')');
-
-        return expr;
-    }
-
-
-    // 11.1 Primary Expressions
-
-    function parsePrimaryExpression() {
-        var type, token, expr;
-
-        if (match('(')) {
-            return parseGroupExpression();
-        }
-
-        type = lookahead.type;
-
-        if (type === Token.Identifier) {
-            expr = delegate.createIdentifier(lex().value);
-        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {
-            expr = delegate.createLiteral(lex());
-        } else if (type === Token.Keyword) {
-            if (matchKeyword('this')) {
-                lex();
-                expr = delegate.createThisExpression();
-            }
-        } else if (type === Token.BooleanLiteral) {
-            token = lex();
-            token.value = (token.value === 'true');
-            expr = delegate.createLiteral(token);
-        } else if (type === Token.NullLiteral) {
-            token = lex();
-            token.value = null;
-            expr = delegate.createLiteral(token);
-        } else if (match('[')) {
-            expr = parseArrayInitialiser();
-        } else if (match('{')) {
-            expr = parseObjectInitialiser();
-        }
-
-        if (expr) {
-            return expr;
-        }
-
-        throwUnexpected(lex());
-    }
-
-    // 11.2 Left-Hand-Side Expressions
-
-    function parseArguments() {
-        var args = [];
-
-        expect('(');
-
-        if (!match(')')) {
-            while (index < length) {
-                args.push(parseExpression());
-                if (match(')')) {
-                    break;
-                }
-                expect(',');
-            }
-        }
-
-        expect(')');
-
-        return args;
-    }
-
-    function parseNonComputedProperty() {
-        var token;
-
-        token = lex();
-
-        if (!isIdentifierName(token)) {
-            throwUnexpected(token);
-        }
-
-        return delegate.createIdentifier(token.value);
-    }
-
-    function parseNonComputedMember() {
-        expect('.');
-
-        return parseNonComputedProperty();
-    }
-
-    function parseComputedMember() {
-        var expr;
-
-        expect('[');
-
-        expr = parseExpression();
-
-        expect(']');
-
-        return expr;
-    }
-
-    function parseLeftHandSideExpression() {
-        var expr, property;
-
-        expr = parsePrimaryExpression();
-
-        while (match('.') || match('[')) {
-            if (match('[')) {
-                property = parseComputedMember();
-                expr = delegate.createMemberExpression('[', expr, property);
-            } else {
-                property = parseNonComputedMember();
-                expr = delegate.createMemberExpression('.', expr, property);
-            }
-        }
-
-        return expr;
-    }
-
-    // 11.3 Postfix Expressions
-
-    var parsePostfixExpression = parseLeftHandSideExpression;
-
-    // 11.4 Unary Operators
-
-    function parseUnaryExpression() {
-        var token, expr;
-
-        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {
-            expr = parsePostfixExpression();
-        } else if (match('+') || match('-') || match('!')) {
-            token = lex();
-            expr = parseUnaryExpression();
-            expr = delegate.createUnaryExpression(token.value, expr);
-        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {
-            throwError({}, Messages.UnexpectedToken);
-        } else {
-            expr = parsePostfixExpression();
-        }
-
-        return expr;
-    }
-
-    function binaryPrecedence(token) {
-        var prec = 0;
-
-        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {
-            return 0;
-        }
-
-        switch (token.value) {
-        case '||':
-            prec = 1;
-            break;
-
-        case '&&':
-            prec = 2;
-            break;
-
-        case '==':
-        case '!=':
-        case '===':
-        case '!==':
-            prec = 6;
-            break;
-
-        case '<':
-        case '>':
-        case '<=':
-        case '>=':
-        case 'instanceof':
-            prec = 7;
-            break;
-
-        case 'in':
-            prec = 7;
-            break;
-
-        case '+':
-        case '-':
-            prec = 9;
-            break;
-
-        case '*':
-        case '/':
-        case '%':
-            prec = 11;
-            break;
-
-        default:
-            break;
-        }
-
-        return prec;
-    }
-
-    // 11.5 Multiplicative Operators
-    // 11.6 Additive Operators
-    // 11.7 Bitwise Shift Operators
-    // 11.8 Relational Operators
-    // 11.9 Equality Operators
-    // 11.10 Binary Bitwise Operators
-    // 11.11 Binary Logical Operators
-
-    function parseBinaryExpression() {
-        var expr, token, prec, stack, right, operator, left, i;
-
-        left = parseUnaryExpression();
-
-        token = lookahead;
-        prec = binaryPrecedence(token);
-        if (prec === 0) {
-            return left;
-        }
-        token.prec = prec;
-        lex();
-
-        right = parseUnaryExpression();
-
-        stack = [left, token, right];
-
-        while ((prec = binaryPrecedence(lookahead)) > 0) {
-
-            // Reduce: make a binary expression from the three topmost entries.
-            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {
-                right = stack.pop();
-                operator = stack.pop().value;
-                left = stack.pop();
-                expr = delegate.createBinaryExpression(operator, left, right);
-                stack.push(expr);
-            }
-
-            // Shift.
-            token = lex();
-            token.prec = prec;
-            stack.push(token);
-            expr = parseUnaryExpression();
-            stack.push(expr);
-        }
-
-        // Final reduce to clean-up the stack.
-        i = stack.length - 1;
-        expr = stack[i];
-        while (i > 1) {
-            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);
-            i -= 2;
-        }
-
-        return expr;
-    }
-
-
-    // 11.12 Conditional Operator
-
-    function parseConditionalExpression() {
-        var expr, consequent, alternate;
-
-        expr = parseBinaryExpression();
-
-        if (match('?')) {
-            lex();
-            consequent = parseConditionalExpression();
-            expect(':');
-            alternate = parseConditionalExpression();
-
-            expr = delegate.createConditionalExpression(expr, consequent, alternate);
-        }
-
-        return expr;
-    }
-
-    // Simplification since we do not support AssignmentExpression.
-    var parseExpression = parseConditionalExpression;
-
-    // Polymer Syntax extensions
-
-    // Filter ::
-    //   Identifier
-    //   Identifier "(" ")"
-    //   Identifier "(" FilterArguments ")"
-
-    function parseFilter() {
-        var identifier, args;
-
-        identifier = lex();
-
-        if (identifier.type !== Token.Identifier) {
-            throwUnexpected(identifier);
-        }
-
-        args = match('(') ? parseArguments() : [];
-
-        return delegate.createFilter(identifier.value, args);
-    }
-
-    // Filters ::
-    //   "|" Filter
-    //   Filters "|" Filter
-
-    function parseFilters() {
-        while (match('|')) {
-            lex();
-            parseFilter();
-        }
-    }
-
-    // TopLevel ::
-    //   LabelledExpressions
-    //   AsExpression
-    //   InExpression
-    //   FilterExpression
-
-    // AsExpression ::
-    //   FilterExpression as Identifier
-
-    // InExpression ::
-    //   Identifier, Identifier in FilterExpression
-    //   Identifier in FilterExpression
-
-    // FilterExpression ::
-    //   Expression
-    //   Expression Filters
-
-    function parseTopLevel() {
-        skipWhitespace();
-        peek();
-
-        var expr = parseExpression();
-        if (expr) {
-            if (lookahead.value === ',' || lookahead.value == 'in' &&
-                       expr.type === Syntax.Identifier) {
-                parseInExpression(expr);
-            } else {
-                parseFilters();
-                if (lookahead.value === 'as') {
-                    parseAsExpression(expr);
-                } else {
-                    delegate.createTopLevel(expr);
-                }
-            }
-        }
-
-        if (lookahead.type !== Token.EOF) {
-            throwUnexpected(lookahead);
-        }
-    }
-
-    function parseAsExpression(expr) {
-        lex();  // as
-        var identifier = lex().value;
-        delegate.createAsExpression(expr, identifier);
-    }
-
-    function parseInExpression(identifier) {
-        var indexName;
-        if (lookahead.value === ',') {
-            lex();
-            if (lookahead.type !== Token.Identifier)
-                throwUnexpected(lookahead);
-            indexName = lex().value;
-        }
-
-        lex();  // in
-        var expr = parseExpression();
-        parseFilters();
-        delegate.createInExpression(identifier.name, indexName, expr);
-    }
-
-    function parse(code, inDelegate) {
-        delegate = inDelegate;
-        source = code;
-        index = 0;
-        length = source.length;
-        lookahead = null;
-        state = {
-            labelSet: {}
-        };
-
-        return parseTopLevel();
-    }
-
-    global.esprima = {
-        parse: parse
-    };
-})(this);
-
-// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-// Code distributed by Google as part of the polymer project is also
-// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-
-(function (global) {
-  'use strict';
-
-  // JScript does not have __proto__. We wrap all object literals with
-  // createObject which uses Object.create, Object.defineProperty and
-  // Object.getOwnPropertyDescriptor to create a new object that does the exact
-  // same thing. The main downside to this solution is that we have to extract
-  // all those property descriptors for IE.
-  var createObject = ('__proto__' in {}) ?
-      function(obj) { return obj; } :
-      function(obj) {
-        var proto = obj.__proto__;
-        if (!proto)
-          return obj;
-        var newObject = Object.create(proto);
-        Object.getOwnPropertyNames(obj).forEach(function(name) {
-          Object.defineProperty(newObject, name,
-                               Object.getOwnPropertyDescriptor(obj, name));
-        });
-        return newObject;
-      };
-
-  function prepareBinding(expressionText, name, node, filterRegistry) {
-    var expression;
-    try {
-      expression = getExpression(expressionText);
-      if (expression.scopeIdent &&
-          (node.nodeType !== Node.ELEMENT_NODE ||
-           node.tagName !== 'TEMPLATE' ||
-           (name !== 'bind' && name !== 'repeat'))) {
-        throw Error('as and in can only be used within <template bind/repeat>');
-      }
-    } catch (ex) {
-      console.error('Invalid expression syntax: ' + expressionText, ex);
-      return;
-    }
-
-    return function(model, node, oneTime) {
-      var binding = expression.getBinding(model, filterRegistry, oneTime);
-      if (expression.scopeIdent && binding) {
-        node.polymerExpressionScopeIdent_ = expression.scopeIdent;
-        if (expression.indexIdent)
-          node.polymerExpressionIndexIdent_ = expression.indexIdent;
-      }
-
-      return binding;
-    }
-  }
-
-  // TODO(rafaelw): Implement simple LRU.
-  var expressionParseCache = Object.create(null);
-
-  function getExpression(expressionText) {
-    var expression = expressionParseCache[expressionText];
-    if (!expression) {
-      var delegate = new ASTDelegate();
-      esprima.parse(expressionText, delegate);
-      expression = new Expression(delegate);
-      expressionParseCache[expressionText] = expression;
-    }
-    return expression;
-  }
-
-  function Literal(value) {
-    this.value = value;
-    this.valueFn_ = undefined;
-  }
-
-  Literal.prototype = {
-    valueFn: function() {
-      if (!this.valueFn_) {
-        var value = this.value;
-        this.valueFn_ = function() {
-          return value;
-        }
-      }
-
-      return this.valueFn_;
-    }
-  }
-
-  function IdentPath(name) {
-    this.name = name;
-    this.path = Path.get(name);
-  }
-
-  IdentPath.prototype = {
-    valueFn: function() {
-      if (!this.valueFn_) {
-        var name = this.name;
-        var path = this.path;
-        this.valueFn_ = function(model, observer) {
-          if (observer)
-            observer.addPath(model, path);
-
-          return path.getValueFrom(model);
-        }
-      }
-
-      return this.valueFn_;
-    },
-
-    setValue: function(model, newValue) {
-      if (this.path.length == 1);
-        model = findScope(model, this.path[0]);
-
-      return this.path.setValueFrom(model, newValue);
-    }
-  };
-
-  function MemberExpression(object, property, accessor) {
-    // convert literal computed property access where literal value is a value
-    // path to ident dot-access.
-    if (accessor == '[' &&
-        property instanceof Literal &&
-        Path.get(property.value).valid) {
-      accessor = '.';
-      property = new IdentPath(property.value);
-    }
-
-    this.dynamicDeps = typeof object == 'function' || object.dynamic;
-
-    this.dynamic = typeof property == 'function' ||
-                   property.dynamic ||
-                   accessor == '[';
-
-    this.simplePath =
-        !this.dynamic &&
-        !this.dynamicDeps &&
-        property instanceof IdentPath &&
-        (object instanceof MemberExpression || object instanceof IdentPath);
-
-    this.object = this.simplePath ? object : getFn(object);
-    this.property = accessor == '.' ? property : getFn(property);
-  }
-
-  MemberExpression.prototype = {
-    get fullPath() {
-      if (!this.fullPath_) {
-        var last = this.object instanceof IdentPath ?
-            this.object.name : this.object.fullPath;
-        this.fullPath_ = Path.get(last + '.' + this.property.name);
-      }
-
-      return this.fullPath_;
-    },
-
-    valueFn: function() {
-      if (!this.valueFn_) {
-        var object = this.object;
-
-        if (this.simplePath) {
-          var path = this.fullPath;
-
-          this.valueFn_ = function(model, observer) {
-            if (observer)
-              observer.addPath(model, path);
-
-            return path.getValueFrom(model);
-          };
-        } else if (this.property instanceof IdentPath) {
-          var path = Path.get(this.property.name);
-
-          this.valueFn_ = function(model, observer) {
-            var context = object(model, observer);
-
-            if (observer)
-              observer.addPath(context, path);
-
-            return path.getValueFrom(context);
-          }
-        } else {
-          // Computed property.
-          var property = this.property;
-
-          this.valueFn_ = function(model, observer) {
-            var context = object(model, observer);
-            var propName = property(model, observer);
-            if (observer)
-              observer.addPath(context, propName);
-
-            return context ? context[propName] : undefined;
-          };
-        }
-      }
-      return this.valueFn_;
-    },
-
-    setValue: function(model, newValue) {
-      if (this.simplePath) {
-        this.fullPath.setValueFrom(model, newValue);
-        return newValue;
-      }
-
-      var object = this.object(model);
-      var propName = this.property instanceof IdentPath ? this.property.name :
-          this.property(model);
-      return object[propName] = newValue;
-    }
-  };
-
-  function Filter(name, args) {
-    this.name = name;
-    this.args = [];
-    for (var i = 0; i < args.length; i++) {
-      this.args[i] = getFn(args[i]);
-    }
-  }
-
-  Filter.prototype = {
-    transform: function(value, toModelDirection, filterRegistry, model,
-                        observer) {
-      var fn = filterRegistry[this.name];
-      var context = model;
-      if (fn) {
-        context = undefined;
-      } else {
-        fn = context[this.name];
-        if (!fn) {
-          console.error('Cannot find filter: ' + this.name);
-          return;
-        }
-      }
-
-      // If toModelDirection is falsey, then the "normal" (dom-bound) direction
-      // is used. Otherwise, it looks for a 'toModel' property function on the
-      // object.
-      if (toModelDirection) {
-        fn = fn.toModel;
-      } else if (typeof fn.toDOM == 'function') {
-        fn = fn.toDOM;
-      }
-
-      if (typeof fn != 'function') {
-        console.error('No ' + (toModelDirection ? 'toModel' : 'toDOM') +
-                      ' found on' + this.name);
-        return;
-      }
-
-      var args = [value];
-      for (var i = 0; i < this.args.length; i++) {
-        args[i + 1] = getFn(this.args[i])(model, observer);
-      }
-
-      return fn.apply(context, args);
-    }
-  };
-
-  function notImplemented() { throw Error('Not Implemented'); }
-
-  var unaryOperators = {
-    '+': function(v) { return +v; },
-    '-': function(v) { return -v; },
-    '!': function(v) { return !v; }
-  };
-
-  var binaryOperators = {
-    '+': function(l, r) { return l+r; },
-    '-': function(l, r) { return l-r; },
-    '*': function(l, r) { return l*r; },
-    '/': function(l, r) { return l/r; },
-    '%': function(l, r) { return l%r; },
-    '<': function(l, r) { return l<r; },
-    '>': function(l, r) { return l>r; },
-    '<=': function(l, r) { return l<=r; },
-    '>=': function(l, r) { return l>=r; },
-    '==': function(l, r) { return l==r; },
-    '!=': function(l, r) { return l!=r; },
-    '===': function(l, r) { return l===r; },
-    '!==': function(l, r) { return l!==r; },
-    '&&': function(l, r) { return l&&r; },
-    '||': function(l, r) { return l||r; },
-  };
-
-  function getFn(arg) {
-    return typeof arg == 'function' ? arg : arg.valueFn();
-  }
-
-  function ASTDelegate() {
-    this.expression = null;
-    this.filters = [];
-    this.deps = {};
-    this.currentPath = undefined;
-    this.scopeIdent = undefined;
-    this.indexIdent = undefined;
-    this.dynamicDeps = false;
-  }
-
-  ASTDelegate.prototype = {
-    createUnaryExpression: function(op, argument) {
-      if (!unaryOperators[op])
-        throw Error('Disallowed operator: ' + op);
-
-      argument = getFn(argument);
-
-      return function(model, observer) {
-        return unaryOperators[op](argument(model, observer));
-      };
-    },
-
-    createBinaryExpression: function(op, left, right) {
-      if (!binaryOperators[op])
-        throw Error('Disallowed operator: ' + op);
-
-      left = getFn(left);
-      right = getFn(right);
-
-      return function(model, observer) {
-        return binaryOperators[op](left(model, observer),
-                                   right(model, observer));
-      };
-    },
-
-    createConditionalExpression: function(test, consequent, alternate) {
-      test = getFn(test);
-      consequent = getFn(consequent);
-      alternate = getFn(alternate);
-
-      return function(model, observer) {
-        return test(model, observer) ?
-            consequent(model, observer) : alternate(model, observer);
-      }
-    },
-
-    createIdentifier: function(name) {
-      var ident = new IdentPath(name);
-      ident.type = 'Identifier';
-      return ident;
-    },
-
-    createMemberExpression: function(accessor, object, property) {
-      var ex = new MemberExpression(object, property, accessor);
-      if (ex.dynamicDeps)
-        this.dynamicDeps = true;
-      return ex;
-    },
-
-    createLiteral: function(token) {
-      return new Literal(token.value);
-    },
-
-    createArrayExpression: function(elements) {
-      for (var i = 0; i < elements.length; i++)
-        elements[i] = getFn(elements[i]);
-
-      return function(model, observer) {
-        var arr = []
-        for (var i = 0; i < elements.length; i++)
-          arr.push(elements[i](model, observer));
-        return arr;
-      }
-    },
-
-    createProperty: function(kind, key, value) {
-      return {
-        key: key instanceof IdentPath ? key.name : key.value,
-        value: value
-      };
-    },
-
-    createObjectExpression: function(properties) {
-      for (var i = 0; i < properties.length; i++)
-        properties[i].value = getFn(properties[i].value);
-
-      return function(model, observer) {
-        var obj = {};
-        for (var i = 0; i < properties.length; i++)
-          obj[properties[i].key] = properties[i].value(model, observer);
-        return obj;
-      }
-    },
-
-    createFilter: function(name, args) {
-      this.filters.push(new Filter(name, args));
-    },
-
-    createAsExpression: function(expression, scopeIdent) {
-      this.expression = expression;
-      this.scopeIdent = scopeIdent;
-    },
-
-    createInExpression: function(scopeIdent, indexIdent, expression) {
-      this.expression = expression;
-      this.scopeIdent = scopeIdent;
-      this.indexIdent = indexIdent;
-    },
-
-    createTopLevel: function(expression) {
-      this.expression = expression;
-    },
-
-    createThisExpression: notImplemented
-  }
-
-  function ConstantObservable(value) {
-    this.value_ = value;
-  }
-
-  ConstantObservable.prototype = {
-    open: function() { return this.value_; },
-    discardChanges: function() { return this.value_; },
-    deliver: function() {},
-    close: function() {},
-  }
-
-  function Expression(delegate) {
-    this.scopeIdent = delegate.scopeIdent;
-    this.indexIdent = delegate.indexIdent;
-
-    if (!delegate.expression)
-      throw Error('No expression found.');
-
-    this.expression = delegate.expression;
-    getFn(this.expression); // forces enumeration of path dependencies
-
-    this.filters = delegate.filters;
-    this.dynamicDeps = delegate.dynamicDeps;
-  }
-
-  Expression.prototype = {
-    getBinding: function(model, filterRegistry, oneTime) {
-      if (oneTime)
-        return this.getValue(model, undefined, filterRegistry);
-
-      var observer = new CompoundObserver();
-      // captures deps.
-      var firstValue = this.getValue(model, observer, filterRegistry);
-      var firstTime = true;
-      var self = this;
-
-      function valueFn() {
-        // deps cannot have changed on first value retrieval.
-        if (firstTime) {
-          firstTime = false;
-          return firstValue;
-        }
-
-        if (self.dynamicDeps)
-          observer.startReset();
-
-        var value = self.getValue(model,
-                                  self.dynamicDeps ? observer : undefined,
-                                  filterRegistry);
-        if (self.dynamicDeps)
-          observer.finishReset();
-
-        return value;
-      }
-
-      function setValueFn(newValue) {
-        self.setValue(model, newValue, filterRegistry);
-        return newValue;
-      }
-
-      return new ObserverTransform(observer, valueFn, setValueFn, true);
-    },
-
-    getValue: function(model, observer, filterRegistry) {
-      var value = getFn(this.expression)(model, observer);
-      for (var i = 0; i < this.filters.length; i++) {
-        value = this.filters[i].transform(value, false, filterRegistry, model,
-                                          observer);
-      }
-
-      return value;
-    },
-
-    setValue: function(model, newValue, filterRegistry) {
-      var count = this.filters ? this.filters.length : 0;
-      while (count-- > 0) {
-        newValue = this.filters[count].transform(newValue, true, filterRegistry,
-                                                 model);
-      }
-
-      if (this.expression.setValue)
-        return this.expression.setValue(model, newValue);
-    }
-  }
-
-  /**
-   * Converts a style property name to a css property name. For example:
-   * "WebkitUserSelect" to "-webkit-user-select"
-   */
-  function convertStylePropertyName(name) {
-    return String(name).replace(/[A-Z]/g, function(c) {
-      return '-' + c.toLowerCase();
-    });
-  }
-
-  function isEventHandler(name) {
-    return name[0] === 'o' &&
-           name[1] === 'n' &&
-           name[2] === '-';
-  }
-
-  var mixedCaseEventTypes = {};
-  [
-    'webkitAnimationStart',
-    'webkitAnimationEnd',
-    'webkitTransitionEnd',
-    'DOMFocusOut',
-    'DOMFocusIn',
-    'DOMMouseScroll'
-  ].forEach(function(e) {
-    mixedCaseEventTypes[e.toLowerCase()] = e;
-  });
-
-  var parentScopeName = '@' + Math.random().toString(36).slice(2);
-
-  // Single ident paths must bind directly to the appropriate scope object.
-  // I.e. Pushed values in two-bindings need to be assigned to the actual model
-  // object.
-  function findScope(model, prop) {
-    while (model[parentScopeName] &&
-           !Object.prototype.hasOwnProperty.call(model, prop)) {
-      model = model[parentScopeName];
-    }
-
-    return model;
-  }
-
-  function resolveEventReceiver(model, path, node) {
-    if (path.length == 0)
-      return undefined;
-
-    if (path.length == 1)
-      return findScope(model, path[0]);
-
-    for (var i = 0; model != null && i < path.length - 1; i++) {
-      model = model[path[i]];
-    }
-
-    return model;
-  }
-
-  function prepareEventBinding(path, name, polymerExpressions) {
-    var eventType = name.substring(3);
-    eventType = mixedCaseEventTypes[eventType] || eventType;
-
-    return function(model, node, oneTime) {
-      var fn, receiver, handler;
-      if (typeof polymerExpressions.resolveEventHandler == 'function') {
-        handler = function(e) {
-          fn = fn || polymerExpressions.resolveEventHandler(model, path, node);
-          fn(e, e.detail, e.currentTarget);
-
-          if (Platform && typeof Platform.flush == 'function')
-            Platform.flush();
-        };
-      } else {
-        handler = function(e) {
-          fn = fn || path.getValueFrom(model);
-          receiver = receiver || resolveEventReceiver(model, path, node);
-
-          fn.apply(receiver, [e, e.detail, e.currentTarget]);
-
-          if (Platform && typeof Platform.flush == 'function')
-            Platform.flush();
-        };
-      }
-
-      node.addEventListener(eventType, handler);
-
-      if (oneTime)
-        return;
-
-      function bindingValue() {
-        return '{{ ' + path + ' }}';
-      }
-
-      return {
-        open: bindingValue,
-        discardChanges: bindingValue,
-        close: function() {
-          node.removeEventListener(eventType, handler);
-        }
-      };
-    }
-  }
-
-  function isLiteralExpression(pathString) {
-    switch (pathString) {
-      case '':
-        return false;
-
-      case 'false':
-      case 'null':
-      case 'true':
-        return true;
-    }
-
-    if (!isNaN(Number(pathString)))
-      return true;
-
-    return false;
-  };
-
-  function PolymerExpressions() {}
-
-  PolymerExpressions.prototype = {
-    // "built-in" filters
-    styleObject: function(value) {
-      var parts = [];
-      for (var key in value) {
-        parts.push(convertStylePropertyName(key) + ': ' + value[key]);
-      }
-      return parts.join('; ');
-    },
-
-    tokenList: function(value) {
-      var tokens = [];
-      for (var key in value) {
-        if (value[key])
-          tokens.push(key);
-      }
-      return tokens.join(' ');
-    },
-
-    // binding delegate API
-    prepareInstancePositionChanged: function(template) {
-      var indexIdent = template.polymerExpressionIndexIdent_;
-      if (!indexIdent)
-        return;
-
-      return function(templateInstance, index) {
-        templateInstance.model[indexIdent] = index;
-      };
-    },
-
-    prepareBinding: function(pathString, name, node) {
-      var path = Path.get(pathString);
-      if (isEventHandler(name)) {
-        if (!path.valid) {
-          console.error('on-* bindings must be simple path expressions');
-          return;
-        }
-
-        return prepareEventBinding(path, name, this);
-      }
-
-      if (!isLiteralExpression(pathString) && path.valid) {
-        if (path.length == 1) {
-          return function(model, node, oneTime) {
-            if (oneTime)
-              return path.getValueFrom(model);
-
-            var scope = findScope(model, path[0]);
-            return new PathObserver(scope, path);
-          };
-        }
-        return; // bail out early if pathString is simple path.
-      }
-
-      return prepareBinding(pathString, name, node, this);
-    },
-
-    prepareInstanceModel: function(template) {
-      var scopeName = template.polymerExpressionScopeIdent_;
-      if (!scopeName)
-        return;
-
-      var parentScope = template.templateInstance ?
-          template.templateInstance.model :
-          template.model;
-
-      var indexName = template.polymerExpressionIndexIdent_;
-
-      return function(model) {
-        var scope = Object.create(parentScope);
-        scope[scopeName] = model;
-        scope[indexName] = undefined;
-        scope[parentScopeName] = parentScope;
-        return scope;
-      };
-    }
-  };
-
-  global.PolymerExpressions = PolymerExpressions;
-  if (global.exposeGetExpression)
-    global.getExpression_ = getExpression;
-
-  global.PolymerExpressions.prepareEventBinding = prepareEventBinding;
-})(this);
-
-/*
- * 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.
- */
-(function(scope) {
-
-// inject style sheet
-var style = document.createElement('style');
-style.textContent = 'template {display: none !important;} /* injected by platform.js */';
-var head = document.querySelector('head');
-head.insertBefore(style, head.firstChild);
-
-// flush (with logging)
-var flushing;
-function flush() {
-  if (!flushing) {
-    flushing = true;
-    scope.endOfMicrotask(function() {
-      flushing = false;
-      logFlags.data && console.group('Platform.flush()');
-      scope.performMicrotaskCheckpoint();
-      logFlags.data && console.groupEnd();
-    });
-  }
-};
-
-// polling dirty checker
-// flush periodically if platform does not have object observe.
-if (!Observer.hasObjectObserve) {
-  var FLUSH_POLL_INTERVAL = 125;
-  window.addEventListener('WebComponentsReady', function() {
-    flush();
-    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);
-  });
-} else {
-  // make flush a no-op when we have Object.observe
-  flush = function() {};
-}
-
-if (window.CustomElements && !CustomElements.useNative) {
-  var originalImportNode = Document.prototype.importNode;
-  Document.prototype.importNode = function(node, deep) {
-    var imported = originalImportNode.call(this, node, deep);
-    CustomElements.upgradeAll(imported);
-    return imported;
-  }
-}
-
-// exports
-scope.flush = flush;
-
-})(window.Platform);
-
-
-//# sourceMappingURL=platform.concat.js.map
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/app.dart b/runtime/bin/vmservice/client/lib/app.dart
index e1b13b6..d5c788b 100644
--- a/runtime/bin/vmservice/client/lib/app.dart
+++ b/runtime/bin/vmservice/client/lib/app.dart
@@ -11,6 +11,7 @@
 
 import 'package:logging/logging.dart';
 import 'package:observatory/service_html.dart';
+import 'package:observatory/elements.dart';
 import 'package:polymer/polymer.dart';
 
 part 'src/app/application.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.dart b/runtime/bin/vmservice/client/lib/elements.dart
index 146b624..47d1dc3 100644
--- a/runtime/bin/vmservice/client/lib/elements.dart
+++ b/runtime/bin/vmservice/client/lib/elements.dart
@@ -4,10 +4,10 @@
 export 'package:observatory/src/elements/action_link.dart';
 export 'package:observatory/src/elements/breakpoint_list.dart';
 export 'package:observatory/src/elements/class_ref.dart';
+export 'package:observatory/src/elements/class_tree.dart';
 export 'package:observatory/src/elements/class_view.dart';
 export 'package:observatory/src/elements/code_ref.dart';
 export 'package:observatory/src/elements/code_view.dart';
-export 'package:observatory/src/elements/collapsible_content.dart';
 export 'package:observatory/src/elements/curly_block.dart';
 export 'package:observatory/src/elements/error_view.dart';
 export 'package:observatory/src/elements/eval_box.dart';
@@ -31,7 +31,7 @@
 export 'package:observatory/src/elements/library_view.dart';
 export 'package:observatory/src/elements/nav_bar.dart';
 export 'package:observatory/src/elements/observatory_application.dart';
-export 'package:observatory/src/elements/response_viewer.dart';
+export 'package:observatory/src/elements/observatory_element.dart';
 export 'package:observatory/src/elements/script_inset.dart';
 export 'package:observatory/src/elements/script_ref.dart';
 export 'package:observatory/src/elements/script_view.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.html b/runtime/bin/vmservice/client/lib/elements.html
index c104893..b3cb8a7 100644
--- a/runtime/bin/vmservice/client/lib/elements.html
+++ b/runtime/bin/vmservice/client/lib/elements.html
@@ -4,11 +4,11 @@
   <link rel="import" href="src/elements/action_link.html">
   <link rel="import" href="src/elements/breakpoint_list.html">
   <link rel="import" href="src/elements/class_ref.html">
+  <link rel="import" href="src/elements/class_tree.html">
   <link rel="import" href="src/elements/class_view.html">
   <link rel="import" href="src/elements/code_ref.html">
   <link rel="import" href="src/elements/code_view.html">
   <link rel="import" href="src/elements/curly_block.html">
-  <link rel="import" href="src/elements/collapsible_content.html">
   <link rel="import" href="src/elements/error_view.html">
   <link rel="import" href="src/elements/eval_box.html">
   <link rel="import" href="src/elements/eval_link.html">
@@ -30,7 +30,6 @@
   <link rel="import" href="src/elements/nav_bar.html">
   <link rel="import" href="src/elements/observatory_application.html">
   <link rel="import" href="src/elements/observatory_element.html">
-  <link rel="import" href="src/elements/response_viewer.html">
   <link rel="import" href="src/elements/script_inset.html">
   <link rel="import" href="src/elements/script_ref.html">
   <link rel="import" href="src/elements/script_view.html">
diff --git a/runtime/bin/vmservice/client/lib/service_html.dart b/runtime/bin/vmservice/client/lib/service_html.dart
index 1a892aa..d611bfe 100644
--- a/runtime/bin/vmservice/client/lib/service_html.dart
+++ b/runtime/bin/vmservice/client/lib/service_html.dart
@@ -32,19 +32,28 @@
   }
 
   Future<String> getString(String id) {
+    // Ensure we don't request host//id.
+    if (host.endsWith('/') && id.startsWith('/')) {
+      id = id.substring(1);
+    }
     Logger.root.info('Fetching $id from $host');
-    return HttpRequest.getString(host + id).catchError((error) {
+    return HttpRequest.request(host + id,
+                               requestHeaders: {
+                                  'Observatory-Version': '1.0'
+                               }).then((HttpRequest request) {
+        return request.responseText;
+      }).catchError((error) {
       // If we get an error here, the network request has failed.
-      Logger.root.severe('HttpRequest.getString failed.');
+      Logger.root.severe('HttpRequest.request failed.');
       var request = error.target;
       return JSON.encode({
           'type': 'ServiceException',
           'id': '',
-          'response': error.target.responseText,
+          'response': request.responseText,
           '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'
+          'message': 'Could not connect to service (${request.statusText}). '
+                     'Check that you started the VM with the following flags: '
+                     '--observe'
         });
     });
   }
@@ -153,7 +162,7 @@
     Map message = {};
     message['id'] = idString;
     message['method'] = 'observatoryQuery';
-    message['query'] = '/$path';
+    message['query'] = '$path';
     _requestSerial++;
     var completer = new Completer();
     _pendingRequests[idString] = completer;
diff --git a/runtime/bin/vmservice/client/lib/src/app/application.dart b/runtime/bin/vmservice/client/lib/src/app/application.dart
index e10fa76..183d6b1 100644
--- a/runtime/bin/vmservice/client/lib/src/app/application.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/application.dart
@@ -4,53 +4,204 @@
 
 part of app;
 
-/// A request response interceptor is called for each response.
-typedef void RequestResponseInterceptor();
+/// A [Pane] controls the user interface of Observatory. At any given time
+/// one pane will be the current pane. Panes are registered at startup.
+/// When the user navigates within the application, each pane is asked if it
+/// can handle the current location, the first pane to say yes, wins.
+abstract class Pane extends Observable {
+  final ObservatoryApplication app;
+
+  @observable ObservatoryElement element;
+
+  Pane(this.app);
+
+  /// Called when the pane is installed, this callback must initialize
+  /// [element].
+  void onInstall();
+
+  /// Called when the pane is uninstalled, this callback must clear
+  /// [element].
+  void onUninstall() {
+    element = null;
+  }
+
+  /// Called when the pane should update its state based on [url].
+  /// NOTE: Only called when the pane is installed.
+  void visit(String url);
+
+  /// Called to test whether this pane can visit [url].
+  bool canVisit(String url);
+}
+
+/// A general service object viewer.
+class ServiceObjectPane extends Pane {
+  ServiceObjectPane(app) : super(app);
+
+  void onInstall() {
+    if (element == null) {
+      /// Lazily create pane.
+      element = new Element.tag('service-view');
+    }
+  }
+
+  void visit(String url) {
+    assert(element != null);
+    assert(canVisit(url));
+    if (url == '') {
+      // Nothing requested.
+      return;
+    }
+    /// Request url from VM and display it.
+    app.vm.get(url).then((obj) {
+      ServiceObjectViewElement pane = element;
+      pane.object = obj;
+    });
+  }
+
+  /// Catch all.
+  bool canVisit(String url) => true;
+}
+
+/// Class tree pane.
+class ClassTreePane extends Pane {
+  static const _urlPrefix = 'class-tree/';
+
+  ClassTreePane(app) : super(app);
+
+  void onInstall() {
+    if (element == null) {
+      element = new Element.tag('class-tree');
+    }
+  }
+
+  void visit(String url) {
+    assert(element != null);
+    assert(canVisit(url));
+    // ClassTree urls are 'class-tree/isolate-id', chop off prefix, leaving
+    // isolate url.
+    url = url.substring(_urlPrefix.length);
+    /// Request the isolate url.
+    app.vm.get(url).then((i) {
+      if (element != null) {
+        /// Update the pane.
+        ClassTreeElement pane = element;
+        pane.isolate = i;
+      }
+    });
+  }
+
+  /// Catch all.
+  bool canVisit(String url) => url.startsWith(_urlPrefix);
+}
+
+class ErrorViewPane extends Pane {
+  ErrorViewPane(app) : super(app);
+
+  void onInstall() {
+    if (element == null) {
+      /// Lazily create pane.
+      element = new Element.tag('service-view');
+    }
+  }
+
+  void visit(String url) {
+    assert(element != null);
+    assert(canVisit(url));
+    (element as ServiceObjectViewElement).object = app.lastErrorOrException;
+  }
+
+  bool canVisit(String url) => url.startsWith('error/');
+}
 
 /// The observatory application. Instances of this are created and owned
 /// by the observatory_application custom element.
 class ObservatoryApplication extends Observable {
+  final _paneRegistry = new List<Pane>();
+  ServiceObjectPane _serviceObjectPane;
+  Pane _currentPane;
   @observable final LocationManager locationManager;
   @observable final VM vm;
   @observable Isolate isolate;
+  @reflectable final ObservatoryApplicationElement rootElement;
 
-  /// The current [ServiceObject] being viewed by the application.
-  @observable ServiceObject response;
-
-  /// Any client-level arguments for viewing the current response.
-  @observable String args;
-  // TODO(turnidge): Make args a Map.
+  @reflectable ServiceObject lastErrorOrException;
 
   void _initOnce() {
-    // Only called once.
-    assert(locationManager._app == null);
-    locationManager._app = this;
-    locationManager.init();
+    _registerPanes();
     vm.errors.stream.listen(_onError);
     vm.exceptions.stream.listen(_onException);
+    location = locationManager;
+    locationManager._init(this);
+  }
+
+  void _registerPanes() {
+    if (_serviceObjectPane != null) {
+      // Already done.
+      return;
+    }
+    // Register ClassTreePane.
+    _paneRegistry.add(new ClassTreePane(this));
+    _paneRegistry.add(new ErrorViewPane(this));
+    // Note that ServiceObjectPane must be the last entry in the list as it is
+    // the catch all.
+    _serviceObjectPane = new ServiceObjectPane(this);
+    _paneRegistry.add(_serviceObjectPane);
   }
 
   void _onError(ServiceError error) {
-    response = error;
-    // No id, clear the hash.
-    locationManager.clearCurrentHash();
+    lastErrorOrException = error;
+    _visit('error/', null);
   }
 
   void _onException(ServiceException exception) {
-    response = exception;
-    // No id, clear the hash.
-    locationManager.clearCurrentHash();
+    lastErrorOrException = exception;
+    _visit('error/', null);
   }
 
-  ObservatoryApplication.devtools() :
-      locationManager = new LocationManager(),
+  void _visit(String url, String args) {
+    // TODO(johnmccutchan): Pass [args] to pane.
+    for (var i = 0; i < _paneRegistry.length; i++) {
+      var pane = _paneRegistry[i];
+      if (pane.canVisit(url)) {
+        _installPane(pane);
+        pane.visit(url);
+        return;
+      }
+    }
+    throw new FallThroughError();
+  }
+
+  /// Set the Observatory application pane.
+  void _installPane(Pane pane) {
+    assert(pane != null);
+    print('Installing $pane');
+    if (_currentPane == pane) {
+      // Already isntalled.
+      return;
+    }
+    if (_currentPane != null) {
+      _currentPane.onUninstall();
+    }
+    pane.onInstall();
+    // Clear children.
+    rootElement.children.clear();
+    // Add new pane.
+    rootElement.children.add(pane.element);
+    // Remember pane.
+    _currentPane = pane;
+  }
+
+  ObservatoryApplication.devtools(this.rootElement) :
+      locationManager = new HashLocationManager(),
       vm = new DartiumVM() {
     _initOnce();
   }
 
-  ObservatoryApplication() :
-      locationManager = new LocationManager(),
-          vm = new WebSocketVM() {
+  ObservatoryApplication(this.rootElement) :
+      locationManager = new HashLocationManager(),
+      vm = new HttpVM() {
     _initOnce();
   }
 }
+
+LocationManager location;
diff --git a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
index b541bf3..7cadb37 100644
--- a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
@@ -4,50 +4,123 @@
 
 part of app;
 
-/// The LocationManager class observes and parses the hash ('#') portion of the
-/// URL in window.location. The text after the '#' is used as the request
-/// string for the VM service.
-class LocationManager extends Observable {
-  static const String defaultHash = '#/vm';
-
+abstract class LocationManager extends Observable {
+  final _initialPath = '/vm';
   ObservatoryApplication _app;
-  @observable String currentHash = '';
 
-  void init() {
-    window.onHashChange.listen((event) {
-      // Request the current anchor.
-      requestCurrentHash();
-    });
+  String _lastUrl;
 
-    if (window.location.hash == '') {
-      // Fresh start, load the vm page.
-      window.location.hash = defaultHash;
-    } else {
-      // The page is being reloaded.
-      requestCurrentHash();
+  void _init(ObservatoryApplication app) {
+    // Called once.
+    assert(_app == null);
+    _app = app;
+    // Register for history events.
+    window.onPopState.listen(_onLocationChange);
+    _onStartup();
+  }
+
+  void _onStartup();
+  void _onLocationChange(PopStateEvent event);
+
+  /// Go to a specific url.
+  void go(String url) {
+    if (_lastUrl != url) {
+      Logger.root.info('Navigated to ${url}');
+      window.history.pushState(url, document.title, url);
+      _lastUrl = url;
     }
+    _go(url);
   }
 
-  /// Clear the current hash.
-  void clearCurrentHash() {
-    window.location.hash = '';
+  void _go(String url) {
+    // Chop off leading '#'.
+    if (url.startsWith('#')) {
+      url = url.substring(1);
+    }
+    // Fall through handles '#/'
+    // Chop off leading '/'.
+    if (url.startsWith('/')) {
+      url = url.substring(1);
+    }
+    var args;
+    // Parse out arguments.
+    if (url.contains('#')) {
+      var chunks = url.split('#');
+      url = chunks[0];
+      if ((chunks.length > 1) && (chunks[1] != '')) {
+        args = chunks[1];
+      }
+    }
+    _app._visit(url, args);
   }
 
-  /// Refresh the service object reference in the location entry.
-  void requestCurrentHash() {
-    currentHash = window.location.hash;
-    if (!currentHash.startsWith('#/')) {
+  /// Go back.
+  void back() {
+    window.history.go(-1);
+  }
+
+  /// Go forward.
+  void forward() {
+    window.history.go(1);
+  }
+
+  /// Handle clicking on an application url link.
+  void onGoto(MouseEvent event, var detail, Element target) {
+    var href = target.attributes['href'];
+    if (event.button > 1 || event.metaKey || event.ctrlKey ||
+        event.shiftKey || event.altKey) {
+      // Not a left-click or a left-click with a modifier key:
+      // Let browser handle.
       return;
     }
-    var parts = currentHash.substring(2).split('#');
-    var location = parts[0];
-    var args = (parts.length > 1 ? parts[1] : '');
-    if (parts.length > 2) {
-      Logger.root.warning('Found more than 2 #-characters in $currentHash');
-    }
-    _app.vm.get(currentHash.substring(2)).then((obj) {
-        _app.response = obj;
-        _app.args = args;
-      });
+    location.go(href);
+    event.preventDefault();
   }
+
+  /// Given an application url, generate a link.
+  String makeLink(String url);
+}
+
+/// Uses location.hash to encode application urls.
+class HashLocationManager extends LocationManager {
+  void _onStartup() {
+    String initialPath = '${window.location.hash}';
+    if ((window.location.hash == '') || (window.location.hash == '#')) {
+      initialPath = '#${_initialPath}';
+    }
+    window.history.pushState(initialPath, document.title, initialPath);
+    _go(window.location.hash);
+  }
+
+  void _onLocationChange(PopStateEvent _) {
+    _go(window.location.hash);
+  }
+
+  /// Given an application url, generate a link for an anchor tag.
+  String makeLink(String url) {
+    return '#$url';
+  }
+}
+
+/// Uses location.pathname to encode application urls. Requires server side
+/// rewriting to support copy and paste linking. pub serve makes this hard.
+/// STATUS: Work in progress.
+class LinkLocationManager extends LocationManager {
+  void _onStartup() {
+    Logger.root.warning('Using untested LinkLocationManager');
+    String initialPath = window.location.pathname;
+    if ((window.location.pathname == '/index.html') ||
+        (window.location.pathname == '/')) {
+      initialPath = '/vm';
+    }
+    window.history.replaceState(initialPath, document.title, initialPath);
+    _go(window.location.pathname);
+  }
+
+  void _onLocationChange(PopStateEvent _) {
+    _go(window.location.pathname);
+  }
+
+  /// Given an application url, generate a link for an anchor tag.
+  String makeLink(String url) => url;
 }
diff --git a/runtime/bin/vmservice/client/lib/src/app/utils.dart b/runtime/bin/vmservice/client/lib/src/app/utils.dart
index 95dc6b5..5b6839b 100644
--- a/runtime/bin/vmservice/client/lib/src/app/utils.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/utils.dart
@@ -73,22 +73,23 @@
   }
 
   static String formatSize(int bytes) {
+    const int digits = 1;
     const int bytesPerKB = 1024;
-      const int bytesPerMB = 1024 * bytesPerKB;
-      const int bytesPerGB = 1024 * bytesPerMB;
-      const int bytesPerTB = 1024 * bytesPerGB;
+    const int bytesPerMB = 1024 * bytesPerKB;
+    const int bytesPerGB = 1024 * bytesPerMB;
+    const int bytesPerTB = 1024 * bytesPerGB;
 
-      if (bytes < bytesPerKB) {
-        return "${bytes}B";
-      } else if (bytes < bytesPerMB) {
-        return "${(bytes / bytesPerKB).round()}KB";
-      } else if (bytes < bytesPerGB) {
-        return "${(bytes / bytesPerMB).round()}MB";
-      } else if (bytes < bytesPerTB) {
-        return "${(bytes / bytesPerGB).round()}GB";
-      } else {
-        return "${(bytes / bytesPerTB).round()}TB";
-      }
+    if (bytes < bytesPerKB) {
+      return "${bytes}B";
+    } else if (bytes < bytesPerMB) {
+      return "${(bytes / bytesPerKB).toStringAsFixed(digits)}KB";
+    } else if (bytes < bytesPerGB) {
+      return "${(bytes / bytesPerMB).toStringAsFixed(digits)}MB";
+    } else if (bytes < bytesPerTB) {
+      return "${(bytes / bytesPerGB).toStringAsFixed(digits)}GB";
+    } else {
+      return "${(bytes / bytesPerTB).toStringAsFixed(digits)}TB";
+    }
   }
 
   static String formatTime(double time) {
diff --git a/runtime/bin/vmservice/client/lib/src/app/view_model.dart b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
index 0b90a99..fcdb425 100644
--- a/runtime/bin/vmservice/client/lib/src/app/view_model.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
@@ -131,7 +131,7 @@
 class SortedTable extends Observable {
   final List<SortedTableColumn> columns;
   final List<SortedTableRow> rows = new List<SortedTableRow>();
-  final List<int> _sortedRows = [];
+  final List<int> sortedRows = [];
 
   SortedTable(this.columns);
 
@@ -144,42 +144,57 @@
   }
   int get sortColumnIndex => _sortColumnIndex;
   bool _sortDescending = true;
-
-  void sort() {
-    assert(_sortColumnIndex >= 0);
-    assert(_sortColumnIndex < columns.length);
-    _sortedRows.sort((i, j) {
-      var a = rows[i].values[_sortColumnIndex];
-      var b = rows[j].values[_sortColumnIndex];
-      if (_sortDescending) {
-        return b.compareTo(a);
-      } else {
-        return a.compareTo(b);
-      }
-    });
-    notifyPropertyChange(#sortedRows, 0, 1);
+  bool get sortDescending => _sortDescending;
+  set sortDescending(var descending) {
+    _sortDescending = descending;
+    notifyPropertyChange(#getColumnLabel, 0, 1);
   }
 
-  @observable List<int> get sortedRows => _sortedRows;
+
+  dynamic getSortKeyFor(int row, int col) {
+    return rows[row].values[col];
+  }
+
+  int _sortFuncDescending(int i, int j) {
+    var a = getSortKeyFor(i, _sortColumnIndex);
+    var b = getSortKeyFor(j, _sortColumnIndex);
+    return b.compareTo(a);
+  }
+
+  int _sortFuncAscending(int i, int j) {
+    var a = getSortKeyFor(i, _sortColumnIndex);
+    var b = getSortKeyFor(j, _sortColumnIndex);
+    return a.compareTo(b);
+  }
+
+  void sort() {
+    Stopwatch sw = new Stopwatch()..start();
+    assert(_sortColumnIndex >= 0);
+    assert(_sortColumnIndex < columns.length);
+    if (_sortDescending) {
+      sortedRows.sort(_sortFuncDescending);
+    } else {
+      sortedRows.sort(_sortFuncAscending);
+    }
+  }
 
   void clearRows() {
     rows.clear();
-    _sortedRows.clear();
+    sortedRows.clear();
   }
 
   void addRow(SortedTableRow row) {
-    _sortedRows.add(rows.length);
+    sortedRows.add(rows.length);
     rows.add(row);
-    notifyPropertyChange(#sortedRows, 0, 1);
   }
 
-  @reflectable String getFormattedValue(int row, int column) {
+  String getFormattedValue(int row, int column) {
     var value = getValue(row, column);
     var formatter = columns[column].formatter;
     return formatter(value);
   }
 
-  @reflectable String getColumnLabel(int column) {
+  @observable String getColumnLabel(int column) {
     assert(column >= 0);
     assert(column < columns.length);
     // TODO(johnmccutchan): Move expander display decisions into html once
@@ -192,7 +207,7 @@
     return columns[column].label + (_sortDescending ? arrowUp : arrowDown);
   }
 
-  @reflectable dynamic getValue(int row, int column) {
+  dynamic getValue(int row, int column) {
     return rows[row].values[column];
   }
 }
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 7c1974f..ba58478 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/action_link.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/action_link.html
@@ -1,6 +1,6 @@
-<head>
-  <link rel="import" href="instance_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="instance_ref.html">
+
 <polymer-element name="action-link">
   <template>
     <style>
@@ -20,7 +20,7 @@
     <template if="{{ !busy }}">
       <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
     </template>
-
   </template>
-  <script type="application/dart" src="action_link.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="action_link.dart"></script>
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 564dad4..ec2cd7d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
@@ -1,15 +1,16 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ msg.isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ gotoLink(msg.isolate.relativeLink('debug/breakpoints')) }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
     <template if="{{ msg['breakpoints'].isEmpty }}">
       <div>
@@ -26,5 +27,6 @@
       </ul>
     </template>
   </template>
-  <script type="application/dart" src="breakpoint_list.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="breakpoint_list.dart"></script>
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 0b595f6..8d39d2e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
@@ -1,9 +1,8 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="service_ref.html">
-</head>
-<polymer-element name="class-ref" extends="service-ref">
 
-<template><link rel="stylesheet" href="css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+<polymer-element name="class-ref" extends="service-ref">
+  <template><link rel="stylesheet" href="css/shared.css"><a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+</polymer-element>
 
 <script type="application/dart" src="class_ref.dart"></script>
-</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_tree.dart b/runtime/bin/vmservice/client/lib/src/elements/class_tree.dart
index aeb29fa..c4d1613 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_tree.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_tree.dart
@@ -50,7 +50,9 @@
 
   ClassTreeElement.created() : super.created();
 
-  void enteredView() {
+  @override
+  void attached() {
+    super.attached();
     tree = new TableTree();
     if (isolate != null) {
       _update(isolate.objectClass);
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_tree.html b/runtime/bin/vmservice/client/lib/src/elements/class_tree.html
index 8ede1e6..96270d2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_tree.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_tree.html
@@ -1,3 +1,4 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="nav_bar.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="class_ref.html">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
index b55f8ae..4fac9d6 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
@@ -11,20 +11,33 @@
 
 @CustomTag('class-view')
 class ClassViewElement extends ObservatoryElement {
-  @published ServiceMap cls;
+  @published Class cls;
+  @observable ServiceMap instances;
+  @observable int retainedBytes;
   ClassViewElement.created() : super.created();
 
   Future<ServiceObject> eval(String text) {
-    return cls.isolate.get(
-        cls.id + "/eval?expr=${Uri.encodeComponent(text)}");
+    return cls.get("eval?expr=${Uri.encodeComponent(text)}");
+  }
+
+  Future<ServiceObject> reachable(var limit) {
+    return cls.get("instances?limit=$limit")
+        .then((ServiceMap obj) {
+          instances = obj;
+        });
   }
   
   // TODO(koda): Add no-arg "calculate-link" instead of reusing "eval-link".
-  Future<ServiceObject> retainedSize(String dummy) {
-    return cls.isolate.get(cls.id + "/retained");
+  Future<ServiceObject> retainedSize(var dummy) {
+    return cls.get("retained")
+        .then((ServiceMap obj) {
+          retainedBytes = int.parse(obj['valueAsString']);
+        });
   }
 
   void refresh(var done) {
+    instances = null;
+    retainedBytes = null;
     cls.reload().whenComplete(done);
   }
 }
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 7548085..28c5e00 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -1,32 +1,33 @@
-<head>
-  <link rel="import" href="curly_block.html">
-  <link rel="import" href="eval_box.html">
-  <link rel="import" href="eval_link.html">
-  <link rel="import" href="field_ref.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="instance_ref.html">
-  <link rel="import" href="library_ref.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="eval_box.html">
+<link rel="import" href="eval_link.html">
+<link rel="import" href="field_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_ref.html">
+
 <polymer-element name="class-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
-      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
+      <library-nav-menu library="{{ cls.library }}"></library-nav-menu>
       <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
       <h1>
-        <template if="{{ cls['abstract'] }}">
+        <template if="{{ cls.isAbstract }}">
           abstract
         </template>
-        <template if="{{ cls['patch'] }}">
+        <template if="{{ cls.isPatch }}">
           patch
         </template>
         class {{ cls.name }}
@@ -35,32 +36,32 @@
         <div class="memberItem">
           <div class="memberName">library</div>
           <div class="memberValue">
-            <library-ref ref="{{ cls['library'] }}"></library-ref>
+            <library-ref ref="{{ cls.library }}"></library-ref>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberName">script</div>
           <div class="memberValue">
-            <script-ref ref="{{ cls['script'] }}" pos="{{ cls['tokenPos'] }}">
+            <script-ref ref="{{ cls.script }}" pos="{{ cls.tokenPos }}">
             </script-ref>
           </div>
         </div>
 
         <div class="memberItem">&nbsp;</div>
 
-        <template if="{{ cls['super'] != null }}">
+        <template if="{{ cls.superClass != null }}">
           <div class="memberItem">
             <div class="memberName">extends</div>
             <div class="memberValue">
-              <class-ref ref="{{ cls['super'] }}"></class-ref>
+              <class-ref ref="{{ cls.superClass }}"></class-ref>
             </div>
           </div>
         </template>
-        <template if="{{ cls['subclasses'].length > 0 }}">
+        <template if="{{ cls.subClasses.length > 0 }}">
           <div class="memberItem">
             <div class="memberName">extended by</div>
             <div class="memberValue">
-              <template repeat="{{ subclass in cls['subclasses'] }}">
+              <template repeat="{{ subclass in cls.subClasses }}">
                 <class-ref ref="{{ subclass }}"></class-ref>
               </template>
             </div>
@@ -69,11 +70,11 @@
 
         <div class="memberItem">&nbsp;</div>
 
-        <template if="{{ cls['interfaces'].length > 0 }}">
+        <template if="{{ cls.interfaces.length > 0 }}">
           <div class="memberItem">
             <div class="memberName">implements</div>
             <div class="memberValue">
-              <template repeat="{{ interface in cls['interfaces'] }}">
+              <template repeat="{{ interface in cls.interfaces }}">
                 <class-ref ref="{{ interface }}"></class-ref>
               </template>
             </div>
@@ -85,28 +86,22 @@
             <div class="memberValue">{{ cls.vmName }}</div>
           </div>
         </template>
-        <div class="memberItem">
-          <div class="memberName">retained size<br>(all instances)</div>
-          <div class="memberValue">
-            <eval-link callback="{{ retainedSize }}"></eval-link>
-          </div>
-        </div>
       </div>
     </div>
 
-    <template if="{{ cls['error'] != null }}">
+    <template if="{{ cls.error != null }}">
       <!-- TODO(turnidge): Don't use instance-ref for error display here -->
-      <instance-ref ref="{{ cls['error'] }}"></instance-ref>
+      <instance-ref ref="{{ cls.error }}"></instance-ref>
     </template>
 
     <hr>
 
     <div class="content">
-      <template if="{{ cls['fields'].isNotEmpty }}">
+      <template if="{{ cls.fields.isNotEmpty }}">
         fields ({{ cls['fields'].length }})
-        <curly-block expand="{{ cls['fields'].length <= 8 }}">
+        <curly-block expand="{{ cls.fields.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ field in cls['fields'] }}">
+            <template repeat="{{ field in cls.fields }}">
               <div class="memberItem">
                 <div class="memberName">
                   <field-ref ref="{{ field }}"></field-ref>
@@ -122,11 +117,11 @@
         </curly-block><br><br>
       </template>
 
-      <template if="{{ cls['functions'].isNotEmpty }}">
-        functions ({{ cls['functions'].length }})
-        <curly-block expand="{{ cls['functions'].length <= 8 }}">
+      <template if="{{ cls.functions.isNotEmpty }}">
+        functions ({{ cls.functions.length }})
+        <curly-block expand="{{ cls.functions.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ function in cls['functions'] }}">
+            <template repeat="{{ function in cls.functions }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <function-ref ref="{{ function }}" qualified="{{ false }}">
@@ -137,6 +132,52 @@
           </div>
         </curly-block><br><br>
       </template>
+      
+      <template if="{{ !cls.hasNoAllocations }}">
+        instances
+          <div class="memberItem">
+            <div class="memberName">currently allocated</div>
+            <div class="memberValue">
+              count {{ cls.newSpace.current.instances + cls.oldSpace.current.instances }}
+              (shallow size {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }})
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">strongly reachable</div>
+            <div class="memberValue">
+              <template if="{{ instances == null }}">
+                <eval-link callback="{{ reachable }}"
+                           label="[find]"
+                           expr="100">
+                </eval-link>
+              </template>
+              <template if="{{ instances != null }}">
+                sample
+                <instance-ref ref="{{ instances['sample'] }}"></instance-ref>
+                <template if="{{ instances['totalCount'] > instances['sampleCount'] }}">
+                  <eval-link callback="{{ reachable }}"
+                           label="[more]"
+                           expr="{{ instances['sampleCount'] * 2 }}">
+                  </eval-link>
+                </template>
+                of total {{ instances['totalCount'] }}
+              </template>
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">retained size</div>
+            <div class="memberValue">
+              <template if="{{ retainedBytes == null }}">
+                <eval-link callback="{{ retainedSize }}"
+                           label="[calculate]">
+                </eval-link>
+              </template>
+              <template if="{{ retainedBytes != null }}">
+                {{ retainedBytes | formatSize }}
+              </template>
+            </div>
+          </div>
+        </template>
     </div>
 
     <hr>
@@ -147,5 +188,6 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart" src="class_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="class_view.dart"></script>
\ No newline at end of file
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 e14384c..717ace2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
@@ -1,20 +1,21 @@
-<head>
-  <link rel="import" href="service_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="service_ref.html">
+
 <polymer-element name="code-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
-          <a href="{{ url }}">*{{ name }}</a>
+          <a on-click="{{ goto }}" href="{{ url }}">*{{ name }}</a>
         </template>
         <template if="{{ !code.isOptimized }}">
-          <a href="{{ url }}">{{ name }}</a>
+          <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
         </template>
     </template>
     <template if="{{ !code.isDartCode }}">
       <span>{{ name }}</span>
     </template>
   </template>
-<script type="application/dart" src="code_ref.dart"></script>
-</polymer-element>
\ No newline at end of file
+</polymer-element>
+
+<script type="application/dart" src="code_ref.dart"></script>
\ 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 dd5c969..f44af1f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
@@ -14,8 +14,9 @@
   @published Code code;
   CodeViewElement.created() : super.created();
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     if (code == null) {
       return;
     }
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 f04fd06..07df134 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -1,8 +1,10 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="function_ref.html">
 <link rel="import" href="instance_ref.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="nav_bar.html">
 <link rel="import" href="script_ref.html">
+
 <polymer-element name="code-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -57,6 +59,7 @@
       <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
     <div class="content">
       <template if="{{ code.isDartCode && code.isOptimized }}">
@@ -162,5 +165,6 @@
       </template>
     </div>
   </template>
-  <script type="application/dart" src="code_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="code_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.dart b/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.dart
deleted file mode 100644
index babd901..0000000
--- a/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.dart
+++ /dev/null
@@ -1,50 +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 collapsible_content_element;
-
-import 'dart:html';
-import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
-
-/// An element which conditionally displays its children elements.
-@CustomTag('collapsible-content')
-class CollapsibleContentElement extends ObservatoryElement {
-  static const String _openIconClass = 'glyphicon glyphicon-chevron-down';
-  static const String _closeIconClass = 'glyphicon glyphicon-chevron-up';
-
-  @observable String iconClass = _openIconClass;
-  @observable String displayValue = 'none';
-
-  bool _collapsed = true;
-  bool get collapsed => _collapsed;
-  set collapsed(bool r) {
-    _collapsed = r;
-    _refresh();
-  }
-
-  CollapsibleContentElement.created() : super.created();
-
-  void enteredView() {
-    super.enteredView();
-    _refresh();
-  }
-
-  void toggleDisplay(Event e, var detail, Node target) {
-    collapsed = !collapsed;
-    _refresh();
-  }
-
-
-
-  void _refresh() {
-    if (_collapsed) {
-      iconClass = _openIconClass;
-      displayValue = 'none';
-    } else {
-      iconClass = _closeIconClass;
-      displayValue = 'block';
-    }
-  }
-}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html b/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html
deleted file mode 100644
index 035e312..0000000
--- a/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
-<polymer-element name="collapsible-content" extends="observatory-element">
-  <template>
-    <div class="well row">
-      <a on-click="toggleDisplay"
-         class="btn muted unselectable">
-           Raw message... <i class="{{ iconClass }}"></i>
-      </a>
-      <div style="display: {{ displayValue }}" class="well">
-        <content></content>
-      </div>
-    </div>
-  </template>
-  <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 2806d6d..5618685 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
+++ b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
@@ -19,6 +19,12 @@
   font: 400 14px 'Montserrat', sans-serif;
 }
 
+.content-centered-big {
+  padding-left: 5%;
+  padding-right: 5%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
 h1 {
   font: 400 18px 'Montserrat', sans-serif;
 }
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 d105267..1576020 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/curly_block.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/curly_block.html
@@ -1,3 +1,5 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+
 <polymer-element name="curly-block">
   <template>
     <style>
@@ -36,5 +38,6 @@
       </template>
     </template>
   </template>
-  <script type="application/dart" src="curly_block.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="curly_block.dart"></script>
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 ba54e66..1c4ea8d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
@@ -1,12 +1,13 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="error-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-control></nav-control>
     </nav-bar>
     <div class="content-centered">
       <h1>{{ error.kind }}</h1>
@@ -14,5 +15,6 @@
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
-  <script type="application/dart" src="error_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="error_view.dart"></script>
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 7d4d50b..167a0cc 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
@@ -1,7 +1,7 @@
-<head>
-  <link rel="import" href="instance_ref.html">
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="eval-box" extends="observatory-element">
   <template>
     <style>
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 729698e..21b1177 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
@@ -1,6 +1,6 @@
-<head>
-  <link rel="import" href="instance_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="instance_ref.html">
+
 <polymer-element name="eval-link">
   <template>
     <style>
@@ -23,7 +23,7 @@
     <template if="{{ result != null }}">
       = <instance-ref ref="{{ result }}"></instance-ref>
     </template>
-
   </template>
-  <script type="application/dart" src="eval_link.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="eval_link.dart"></script>
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 6de1a19..a02762e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
@@ -1,8 +1,8 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="instance_ref.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="service_ref.html">
-</head>
+
 <polymer-element name="field-ref" extends="service-ref">
   <template>
   <link rel="stylesheet" href="css/shared.css">
@@ -17,8 +17,9 @@
       <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
         <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
       </template>
-      <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+      <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
     </div>
   </template>
-  <script type="application/dart" src="field_ref.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="field_ref.dart"></script>
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 5673bbf..307cb77 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
@@ -1,11 +1,11 @@
-<head>
-  <link rel="import" href="class_ref.html">
-  <link rel="import" href="instance_ref.html">
-  <link rel="import" href="library_ref.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="script_ref.html">
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="script_ref.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="field-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -19,8 +19,9 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.link }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -90,5 +91,6 @@
       </div>
     </div>
   </template>
-  <script type="application/dart" src="field_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="field_view.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/flag_list.html b/runtime/bin/vmservice/client/lib/src/elements/flag_list.html
index cabdd91..e7be436 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/flag_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/flag_list.html
@@ -1,16 +1,16 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="stack_frame.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="stack_frame.html">
 
 <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-menu link="{{ flagList.vm.relativeLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content-centered">
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 70e5e96..16a281f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
@@ -1,7 +1,7 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="class_ref.html">
 <link rel="import" href="service_ref.html">
-</head>
+
 <polymer-element name="function-ref" extends="service-ref">
   <template><link rel="stylesheet" href="css/shared.css" /><!-- These comments are here to allow newlines.
      --><template if="{{ isDart }}"><!--
@@ -10,7 +10,8 @@
      --><template if="{{ qualified && hasParent }}"><!--
        --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
           </function-ref>.<!--
-     --></template><a href="{{ url }}">{{ name }}</a><!--
+     --></template><a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a><!--
   --></template><template if="{{ !isDart }}"><span> {{ name }}</span></template></template>
-<script type="application/dart" src="function_ref.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="function_ref.dart"></script>
\ No newline at end of file
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 eb5bf6b..50ec959 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
@@ -1,13 +1,13 @@
-<head>
-  <link rel="import" href="class_ref.html">
-  <link rel="import" href="code_ref.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="library_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="script_inset.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="code_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="script_inset.html">
+<link rel="import" href="script_ref.html">
+
 <polymer-element name="function-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -21,8 +21,9 @@
       <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ function.link }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -115,5 +116,6 @@
 
     <br>
   </template>
-  <script type="application/dart" src="function_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="function_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
index 6688e5a..3674762 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
@@ -61,6 +61,9 @@
   static final _freeColor = [255, 255, 255, 255];
   static final _pageSeparationColor = [0, 0, 0, 255];
   static const _PAGE_SEPARATION_HEIGHT = 4;
+  // Many browsers will not display a very tall canvas.
+  // TODO(koda): Improve interface for huge heaps.
+  static const _MAX_CANVAS_HEIGHT = 6000;
 
   @observable String status;
   @published ServiceMap fragmentation;
@@ -68,8 +71,9 @@
   HeapMapElement.created() : super.created() {
   }
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     _fragmentationCanvas = shadowRoot.querySelector("#fragmentation");
     _fragmentationCanvas.onMouseMove.listen(_handleMouseMove);
     _fragmentationCanvas.onMouseDown.listen(_handleClick);
@@ -92,13 +96,13 @@
 
   void _updateClassList(classList, int freeClassId) {
     for (var member in classList['members']) {
-      if (member['type'] != '@Class') {
+      if (member is! Class) {
         Logger.root.info('$member');
         continue;
       }
-      var classId = int.parse(member['id'].split('/').last);
+      var classId = int.parse(member.id.split('/').last);
       var color = _classIdToRGBA(classId);
-      _addClass(classId, member['name'], color);
+      _addClass(classId, member.name, color);
     }
     _addClass(freeClassId, 'Free', _freeColor);
     _addClass(0, '', _pageSeparationColor);
@@ -148,7 +152,7 @@
     var className = _classNameAt(event.offset);
     status = (className == '') ? '-' : '$className $addressString';
   }
-  
+
   void _handleClick(MouseEvent event) {
     var address = _objectAt(event.offset).address.toRadixString(16);
     window.location.hash = "/${fragmentation.isolate.link}/address/$address";
@@ -165,7 +169,7 @@
     _pageHeight = _PAGE_SEPARATION_HEIGHT +
         fragmentation['page_size_bytes'] ~/
         fragmentation['unit_size_bytes'] ~/ width;
-    var height = _pageHeight * pages.length;
+    var height = min(_pageHeight * pages.length, _MAX_CANVAS_HEIGHT);
     _fragmentationData =
         _fragmentationCanvas.context2D.createImageData(width, height);
     _fragmentationCanvas.width = _fragmentationData.width;
@@ -178,10 +182,11 @@
   void _renderPages(int startPage) {
     var pages = fragmentation['pages'];
     status = 'Loaded $startPage of ${pages.length} pages';
-    if (startPage >= pages.length) {
+    var startY = startPage * _pageHeight;
+    var endY = startY + _pageHeight;
+    if (startPage >= pages.length || endY > _fragmentationData.height) {
       return;
     }
-    var startY = startPage * _pageHeight;
     var pixel = new PixelReference(_fragmentationData, new Point(0, startY));
     var objects = pages[startPage]['objects'];
     for (var i = 0; i < objects.length; i += 2) {
@@ -193,7 +198,6 @@
         pixel = pixel.next();
       }
     }
-    var endY = startY + _pageHeight;
     while (pixel.point.y < endY) {
       pixel.color = _pageSeparationColor;
       pixel = pixel.next();
@@ -219,7 +223,7 @@
   }
 
   void fragmentationChanged(oldValue) {
-    // Async, in case enteredView has not yet run (observed in JS version).
+    // Async, in case attached has not yet run (observed in JS version).
     new Future(() {
       _updateFragmentationData();
     });
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 9f5b556..a4296ab 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
@@ -1,8 +1,8 @@
-<head>
-  <link rel="import" href="class_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="nav_bar.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="nav_bar.html">
+
 <polymer-element name="heap-map" extends="observatory-element">
 <template>
   <link rel="stylesheet" href="css/shared.css">
@@ -22,8 +22,9 @@
   <nav-bar pad="{{ false }}">
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ fragmentation.isolate.relativeHashLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ fragmentation.isolate.relativeLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    <nav-control></nav-control>
   </nav-bar>
   <div class="hover">
     <p style="text-align:center">{{ status }}</p>
@@ -35,5 +36,6 @@
     <canvas id="fragmentation" width="1px" height="1px"></canvas>
   </div>
 </template>
-<script type="application/dart" src="heap_map.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="heap_map.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
index 9626735..132e43b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
@@ -8,21 +8,28 @@
 import 'observatory_element.dart';
 import 'package:observatory/app.dart';
 import 'package:observatory/service.dart';
-import 'package:logging/logging.dart';
+import 'package:observatory/elements.dart';
 import 'package:polymer/polymer.dart';
 
+class ClassSortedTable extends SortedTable {
+
+  ClassSortedTable(columns) : super(columns);
+
+  @override
+  dynamic getSortKeyFor(int row, int col) {
+    if (col == 0) {
+      // Use class name as sort key.
+      return rows[row].values[col].name;
+    }
+    return super.getSortKeyFor(row, col);
+  }
+}
+
 /// Displays an Error response.
 @CustomTag('heap-profile')
 class HeapProfileElement extends ObservatoryElement {
-  // Indexes into VM provided map.
-  static const ALLOCATED_BEFORE_GC = 0;
-  static const ALLOCATED_BEFORE_GC_SIZE = 1;
-  static const LIVE_AFTER_GC = 2;
-  static const LIVE_AFTER_GC_SIZE = 3;
-  static const ALLOCATED_SINCE_GC = 4;
-  static const ALLOCATED_SINCE_GC_SIZE = 5;
-  static const ACCUMULATED = 6;
-  static const ACCUMULATED_SIZE = 7;
+  @observable String lastServiceGC = '---';
+  @observable String lastAccumulatorReset = '---';
 
   // Pie chart of new space usage.
   var _newPieDataTable;
@@ -32,92 +39,193 @@
   var _oldPieDataTable;
   var _oldPieChart;
 
-  @observable SortedTable classTable;
+  @observable ClassSortedTable classTable;
+  var _classTableBody;
 
   @published ServiceMap profile;
 
+  @observable Isolate isolate;
+
   HeapProfileElement.created() : super.created() {
+    // Create pie chart models.
     _newPieDataTable = new DataTable();
     _newPieDataTable.addColumn('string', 'Type');
     _newPieDataTable.addColumn('number', 'Size');
     _oldPieDataTable = new DataTable();
     _oldPieDataTable.addColumn('string', 'Type');
     _oldPieDataTable.addColumn('number', 'Size');
+
+    // Create class table model.
     var columns = [
       new SortedTableColumn('Class'),
-      new SortedTableColumn.withFormatter('Accumulator Size (New)',
+      new SortedTableColumn(''),  // Spacer column.
+      new SortedTableColumn.withFormatter('Accumulated Size (New)',
                                           Utils.formatSize),
-      new SortedTableColumn.withFormatter('Accumulator (New)',
+      new SortedTableColumn.withFormatter('Accumulated Instances',
                                           Utils.formatCommaSeparated),
-      new SortedTableColumn.withFormatter('Current Size (New)',
+      new SortedTableColumn.withFormatter('Current Size',
                                           Utils.formatSize),
-      new SortedTableColumn.withFormatter('Current (New)',
+      new SortedTableColumn.withFormatter('Current Instances',
                                           Utils.formatCommaSeparated),
+      new SortedTableColumn(''),  // Spacer column.
       new SortedTableColumn.withFormatter('Accumulator Size (Old)',
                                           Utils.formatSize),
-      new SortedTableColumn.withFormatter('Accumulator (Old)',
+      new SortedTableColumn.withFormatter('Accumulator Instances',
                                           Utils.formatCommaSeparated),
-      new SortedTableColumn.withFormatter('Current Size (Old)',
+      new SortedTableColumn.withFormatter('Current Size',
                                           Utils.formatSize),
-      new SortedTableColumn.withFormatter('Current (Old)',
+      new SortedTableColumn.withFormatter('Current Instances',
                                           Utils.formatCommaSeparated)
     ];
-    classTable = new SortedTable(columns);
-    classTable.sortColumnIndex = 1;
+    classTable = new ClassSortedTable(columns);
+    // By default, start with accumulated new space bytes.
+    classTable.sortColumnIndex = 2;
   }
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
+    // Grab the pie chart divs.
     _newPieChart = new Chart('PieChart',
         shadowRoot.querySelector('#newPieChart'));
-    _newPieChart.options['title'] = 'New Space';
     _oldPieChart = new Chart('PieChart',
         shadowRoot.querySelector('#oldPieChart'));
-    _oldPieChart.options['title'] = 'Old Space';
-    _draw();
+    _classTableBody = shadowRoot.querySelector('#classTableBody');
   }
 
-  void _updateChartData() {
-    if ((profile == null) || (profile['members'] is! List) ||
-        (profile['members'].length == 0)) {
-      return;
+  void _updatePieCharts() {
+    assert(profile != null);
+    _newPieDataTable.clearRows();
+    var isolate = profile.isolate;
+    _newPieDataTable.addRow(['Used', isolate.newSpace.used]);
+    _newPieDataTable.addRow(['Free',
+        isolate.newSpace.capacity - isolate.newSpace.used]);
+    _newPieDataTable.addRow(['External', isolate.newSpace.external]);
+    _oldPieDataTable.clearRows();
+    _oldPieDataTable.addRow(['Used', isolate.oldSpace.used]);
+    _oldPieDataTable.addRow(['Free',
+        isolate.oldSpace.capacity - isolate.oldSpace.used]);
+    _oldPieDataTable.addRow(['External', isolate.oldSpace.external]);
+  }
+
+  void _updateClasses() {
+    for (ServiceMap clsAllocations in profile['members']) {
+      Class cls = clsAllocations['class'];
+      if (cls == null) {
+        continue;
+      }
+      cls.newSpace.update(clsAllocations['new']);
+      cls.oldSpace.update(clsAllocations['old']);
     }
-    assert(classTable != null);
+  }
+
+  void _updateClassTable() {
     classTable.clearRows();
-    for (ServiceMap cls in profile['members']) {
-      if (_classHasNoAllocations(cls)) {
+    for (ServiceMap clsAllocations in profile['members']) {
+      Class cls = clsAllocations['class'];
+      if (cls == null) {
+        continue;
+      }
+      if (cls.hasNoAllocations) {
         // If a class has no allocations, don't display it.
         continue;
       }
-      var row = [cls['class'],
-                 _combinedTableColumnValue(cls, 1),
-                 _combinedTableColumnValue(cls, 2),
-                 _combinedTableColumnValue(cls, 3),
-                 _combinedTableColumnValue(cls, 4),
-                 _combinedTableColumnValue(cls, 5),
-                 _combinedTableColumnValue(cls, 6),
-                 _combinedTableColumnValue(cls, 7),
-                 _combinedTableColumnValue(cls, 8)];
+      var row = [cls,
+                 '',  // Spacer column.
+                 cls.newSpace.accumulated.bytes,
+                 cls.newSpace.accumulated.instances,
+                 cls.newSpace.current.bytes,
+                 cls.newSpace.current.instances,
+                 '', // Spacer column.
+                 cls.oldSpace.accumulated.bytes,
+                 cls.oldSpace.accumulated.instances,
+                 cls.oldSpace.current.bytes,
+                 cls.oldSpace.current.instances];
       classTable.addRow(new SortedTableRow(row));
     }
     classTable.sort();
-    _newPieDataTable.clearRows();
-    var heap = profile['heaps']['new'];
-    _newPieDataTable.addRow(['Used', heap['used']]);
-    _newPieDataTable.addRow(['Free', heap['capacity'] - heap['used']]);
-    _newPieDataTable.addRow(['External', heap['external']]);
-    _oldPieDataTable.clearRows();
-    heap = profile['heaps']['old'];
-    _oldPieDataTable.addRow(['Used', heap['used']]);
-    _oldPieDataTable.addRow(['Free', heap['capacity'] - heap['used']]);
-    _oldPieDataTable.addRow(['External', heap['external']]);
-    _draw();
   }
 
-  void _draw() {
-    if (_newPieChart == null) {
-      return;
+  void _addClassTableDomRow() {
+    assert(_classTableBody != null);
+    var tr = new TableRowElement();
+
+    // Add class ref.
+    var cell = tr.insertCell(-1);
+    ClassRefElement classRef = new Element.tag('class-ref');
+    cell.children.add(classRef);
+
+    // Add spacer.
+    cell = tr.insertCell(-1);
+    cell.classes.add('left-border-spacer');
+
+    // Add new space.
+    cell = tr.insertCell(-1);
+    cell = tr.insertCell(-1);
+    cell = tr.insertCell(-1);
+    cell = tr.insertCell(-1);
+
+    // Add spacer.
+    cell = tr.insertCell(-1);
+    cell.classes.add('left-border-spacer');
+
+    // Add old space.
+    cell = tr.insertCell(-1);
+    cell = tr.insertCell(-1);
+    cell = tr.insertCell(-1);
+    cell = tr.insertCell(-1);
+
+    // Add row to table.
+    _classTableBody.children.add(tr);
+  }
+
+  void _fillClassTableDomRow(TableRowElement tr, int rowIndex) {
+    const SPACER_COLUMNS = const [1, 6];
+
+    var row = classTable.rows[rowIndex];
+    // Add class ref.
+    ClassRefElement classRef = tr.children[0].children[0];
+    classRef.ref = row.values[0];
+
+    for (var i = 1; i < row.values.length; i++) {
+      if (SPACER_COLUMNS.contains(i)) {
+        // Skip spacer columns.
+        continue;
+      }
+      var cell = tr.children[i];
+      cell.title = row.values[i].toString();
+      cell.text = classTable.getFormattedValue(rowIndex, i);
     }
+  }
+
+  void _updateClassTableInDom() {
+    assert(_classTableBody != null);
+    // Resize DOM table.
+    if (_classTableBody.children.length > classTable.sortedRows.length) {
+      // Shrink the table.
+      var deadRows =
+          _classTableBody.children.length - classTable.sortedRows.length;
+      for (var i = 0; i < deadRows; i++) {
+        _classTableBody.children.removeLast();
+      }
+    } else if (_classTableBody.children.length < classTable.sortedRows.length) {
+      // Grow table.
+      var newRows =
+          classTable.sortedRows.length - _classTableBody.children.length;
+      for (var i = 0; i < newRows; i++) {
+        _addClassTableDomRow();
+      }
+    }
+    assert(_classTableBody.children.length == classTable.sortedRows.length);
+    // Fill table.
+    for (var i = 0; i < classTable.sortedRows.length; i++) {
+      var rowIndex = classTable.sortedRows[i];
+      var tr = _classTableBody.children[i];
+      _fillClassTableDomRow(tr, rowIndex);
+    }
+  }
+
+  void _drawCharts() {
     _newPieChart.draw(_newPieDataTable);
     _oldPieChart.draw(_oldPieDataTable);
   }
@@ -126,133 +234,92 @@
     if (target is TableCellElement) {
       if (classTable.sortColumnIndex != target.cellIndex) {
         classTable.sortColumnIndex = target.cellIndex;
-        classTable.sort();
+        classTable.sortDescending = true;
+      } else {
+        classTable.sortDescending = !classTable.sortDescending;
       }
+      classTable.sort();
+      _updateClassTableInDom();
     }
   }
 
-  bool _classHasNoAllocations(Map v) {
-    var newSpace = v['new'];
-    var oldSpace = v['old'];
-    for (var allocation in newSpace) {
-      if (allocation != 0) {
-        return false;
-      }
-    }
-    for (var allocation in oldSpace) {
-      if (allocation != 0) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  dynamic _combinedTableColumnValue(Map v, int index) {
-    assert(index >= 0);
-    assert(index < 9);
-    switch (index) {
-      case 0:
-        return v['class']['user_name'];
-      case 1:
-        return v['new'][ACCUMULATED_SIZE];
-      case 2:
-        return v['new'][ACCUMULATED];
-      case 3:
-        return v['new'][LIVE_AFTER_GC_SIZE] +
-               v['new'][ALLOCATED_SINCE_GC_SIZE];
-      case 4:
-        return v['new'][LIVE_AFTER_GC] +
-               v['new'][ALLOCATED_SINCE_GC];
-      case 5:
-        return v['old'][ACCUMULATED_SIZE];
-      case 6:
-        return v['old'][ACCUMULATED];
-      case 7:
-        return v['old'][LIVE_AFTER_GC_SIZE] +
-               v['old'][ALLOCATED_SINCE_GC_SIZE];
-      case 8:
-        return  v['old'][LIVE_AFTER_GC] +
-               v['old'][ALLOCATED_SINCE_GC];
-    }
-    throw new FallThroughError();
-  }
-
   void refresh(var done) {
     if (profile == null) {
       return;
     }
     var isolate = profile.isolate;
-    isolate.get('/allocationprofile').then((ServiceMap response) {
-      assert(response['type'] == 'AllocationProfile');
-      profile = response;
-    }).catchError((e, st) {
-      Logger.root.info('$e $st');
-    }).whenComplete(done);
+    isolate.get('/allocationprofile').then(_update).whenComplete(done);
   }
 
   void refreshGC(var done) {
-      if (profile == null) {
-        return;
-      }
-      var isolate = profile.isolate;
-      isolate.get('/allocationprofile?gc=full').then((ServiceMap response) {
-        assert(response['type'] == 'AllocationProfile');
-        profile = response;
-      }).catchError((e, st) {
-        Logger.root.info('$e $st');
-      }).whenComplete(done);
+    if (profile == null) {
+      return;
     }
+    var isolate = profile.isolate;
+    isolate.get('/allocationprofile?gc=full').then(_update).whenComplete(done);
+  }
 
   void resetAccumulator(var done) {
     if (profile == null) {
       return;
     }
     var isolate = profile.isolate;
-    isolate.get('/allocationprofile?reset=true').then((ServiceMap response) {
-      assert(response['type'] == 'AllocationProfile');
-      profile = response;
-    }).catchError((e, st) {
-      Logger.root.info('$e $st');
-    }).whenComplete(done);
+    isolate.get('/allocationprofile?reset=true').then(_update).
+                                                 whenComplete(done);
+  }
+
+  void _update(ServiceMap newProfile) {
+    profile = newProfile;
   }
 
   void profileChanged(oldValue) {
-    try {
-      _updateChartData();
-    } catch (e, st) {
-      Logger.root.info('$e $st');
+    if (profile == null) {
+      return;
     }
-    notifyPropertyChange(#formattedAverage, [], formattedAverage);
-    notifyPropertyChange(#formattedTotalCollectionTime, [],
-                         formattedTotalCollectionTime);
-    notifyPropertyChange(#formattedCollections, [], formattedCollections);
+    isolate = profile.isolate;
+    isolate.updateHeapsFromMap(profile['heaps']);
+    var millis = int.parse(profile['dateLastAccumulatorReset']);
+    if (millis != 0) {
+      lastAccumulatorReset =
+              new DateTime.fromMillisecondsSinceEpoch(millis).toString();
+    }
+    millis = int.parse(profile['dateLastServiceGC']);
+    if (millis != 0) {
+      lastServiceGC =
+              new DateTime.fromMillisecondsSinceEpoch(millis).toString();
+    }
+    _updatePieCharts();
+    _updateClasses();
+    _updateClassTable();
+    _updateClassTableInDom();
+    _drawCharts();
+    notifyPropertyChange(#formattedAverage, 0, 1);
+    notifyPropertyChange(#formattedTotalCollectionTime, 0, 1);
+    notifyPropertyChange(#formattedCollections, 0, 1);
   }
 
   @observable String formattedAverage(bool newSpace) {
     if (profile == null) {
       return '';
     }
-    String space = newSpace ? 'new' : 'old';
-    Map heap = profile['heaps'][space];
-    var r = ((heap['time'] * 1000.0) / heap['collections']).toStringAsFixed(2);
-    return '$r ms';
+    var heap = newSpace ? profile.isolate.newSpace : profile.isolate.oldSpace;
+    var avg = ((heap.totalCollectionTimeInSeconds * 1000.0) / heap.collections);
+    return '${avg.toStringAsFixed(2)} ms';
   }
 
   @observable String formattedCollections(bool newSpace) {
     if (profile == null) {
       return '';
     }
-    String space = newSpace ? 'new' : 'old';
-    Map heap = profile['heaps'][space];
-    return '${heap['collections']}';
+    var heap = newSpace ? profile.isolate.newSpace : profile.isolate.oldSpace;
+    return heap.collections.toString();
   }
 
   @observable String formattedTotalCollectionTime(bool newSpace) {
     if (profile == null) {
       return '';
     }
-    String space = newSpace ? 'new' : 'old';
-    Map heap = profile['heaps'][space];
-    return '${Utils.formatSeconds(heap['time'])} secs';
+    var heap = newSpace ? profile.isolate.newSpace : profile.isolate.oldSpace;
+    return '${Utils.formatSeconds(heap.totalCollectionTimeInSeconds)} secs';
   }
 }
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 aea9cd7..c4d7304 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
@@ -1,15 +1,14 @@
-<head>
-  <link rel="import" href="class_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="nav_bar.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="nav_bar.html">
+
 <polymer-element name="heap-profile" extends="observatory-element">
 <template>
   <link rel="stylesheet" href="css/shared.css">
   <style>
     .table {
       border-collapse: collapse!important;
-      width: 100%;
       margin-bottom: 20px
       table-layout: fixed;
     }
@@ -25,6 +24,13 @@
       text-align: left;
       border-bottom:2px solid #ddd;
     }
+    .spacer {
+      width: 16px;
+    }
+    .left-border-spacer {
+      width: 16px;
+      border-left: 1px solid;
+    }
     .clickable {
       color: #0489c3;
       text-decoration: none;
@@ -41,17 +47,47 @@
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ profile.isolate.relativeLink('allocationprofile') }}" anchor="allocation profile" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
     <nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    <nav-control></nav-control>
   </nav-bar>
-
-  <div class="flex-row">
-    <div id="newPieChart" class="flex-item-fixed-4-12" style="height: 400px">
+  <div class="content">
+    <h1>Allocation Profile</h1>
+    <br>
+    <div class="memberList">
+      <div class="memberItem">
+        <div class="memberName">last forced GC at</div>
+        <div class="memberValue">{{ lastServiceGC }}</div>
+      </div>
+      <div class="memberItem">
+        <div class="memberName">last accumulator reset at</div>
+        <div class="memberValue">{{ lastAccumulatorReset }}</div>
+      </div>
     </div>
-    <div id="newStatus" class="flex-item-fixed-2-12">
-      <div class="memberList">
+  </div>
+  <hr>
+  <div class="content-centered-big">
+    <div class="flex-row">
+      <div id="newSpace" class="flex-item-50-percent">
+        <h2>New Generation</h2>
+        <br>
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">used</div>
+            <div class="memberValue">
+              {{ isolate.newSpace.used | formatSize }}
+              of
+              {{ isolate.newSpace.capacity | formatSize }}
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">external</div>
+            <div class="memberValue">
+              {{ isolate.newSpace.external | formatSize }}
+            </div>
+          </div>
           <div class="memberItem">
             <div class="memberName">Collections</div>
             <div class="memberValue">{{ formattedCollections(true) }}</div>
@@ -64,12 +100,27 @@
             <div class="memberName">Cumulative Collection Time</div>
             <div class="memberValue">{{ formattedTotalCollectionTime(true) }}</div>
           </div>
+        </div>
+        <div id="newPieChart" style="height: 300px"></div>
       </div>
-    </div>
-    <div id="oldPieChart" class="flex-item-fixed-4-12" style="height: 400px">
-    </div>
-    <div id="oldStatus" class="flex-item-fixed-2-12">
-      <div class="memberList">
+      <div id="oldSpace" class="flex-item-50-percent">
+        <h2>Old Generation</h2>
+        <br>
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">used</div>
+            <div class="memberValue">
+              {{ isolate.oldSpace.used | formatSize }}
+              of
+              {{ isolate.oldSpace.capacity | formatSize }}
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">external</div>
+            <div class="memberValue">
+              {{ isolate.oldSpace.external | formatSize }}
+            </div>
+          </div>
           <div class="memberItem">
             <div class="memberName">Collections</div>
             <div class="memberValue">{{ formattedCollections(false) }}</div>
@@ -82,39 +133,37 @@
             <div class="memberName">Cumulative Collection Time</div>
             <div class="memberValue">{{ formattedTotalCollectionTime(false) }}</div>
           </div>
+        </div>
+        <div id="oldPieChart" style="height: 300px"></div>
       </div>
     </div>
   </div>
-  <div class="flex-row">
-    <table id="classtable" class="flex-item-fixed-12-12 table">
-      <thead>
+  <br>
+  <hr>
+  <div class="content-centered-big">
+    <table id="classtable" class="flex-item-100-percent table">
+      <thead id="classTableHead">
         <tr>
           <th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
+          <th class="spacer"></th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(2) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(3) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(4) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(5) }}</th>
+          <th class="spacer"></th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(7) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(8) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(9) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(10) }}</th>
         </tr>
       </thead>
-      <tbody>
-        <tr template repeat="{{row in classTable.sortedRows }}">
-          <td><class-ref ref="{{ classTable.getValue(row, 0) }}"></class-ref></td>
-          <td title="{{ classTable.getValue(row, 1) }}">{{ classTable.getFormattedValue(row, 1) }}</td>
-          <td title="{{ classTable.getValue(row, 2) }}">{{ classTable.getFormattedValue(row, 2) }}</td>
-          <td title="{{ classTable.getValue(row, 3) }}">{{ classTable.getFormattedValue(row, 3) }}</td>
-          <td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
-          <td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
-          <td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
-          <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
-          <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
-        </tr>
+      <tbody id="classTableBody">
       </tbody>
     </table>
+    <br><br><br>
+    <br><br><br>
   </div>
 </template>
-<script type="application/dart" src="heap_profile.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="heap_profile.dart"></script>
\ No newline at end of file
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 943ccda..d6487755 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -1,8 +1,8 @@
-<head>
-  <link rel="import" href="curly_block.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="service_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="service_ref.html">
+
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -34,16 +34,16 @@
                         isBool(ref.serviceType) ||
                         isInt(ref.serviceType)) ||
                         isDouble(ref.serviceType)) }}">
-        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
+        <a on-click="{{ goto }}" href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
       <template if="{{ (isType(ref.serviceType)) }}">
-        <a href="{{ url }}">{{ ref['user_name'] }}</a>
+        <a on-click="{{ goto }}" href="{{ url }}">{{ ref['user_name'] }}</a>
       </template>
 
       <template if="{{ isInstance(ref.serviceType) &&
                        ref['closureFunc'] != null}}">
-        <a href="{{ url }}">
+        <a on-click="{{ goto }}" href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
@@ -51,7 +51,7 @@
 
       <template if="{{ isInstance(ref.serviceType) &&
                        ref['closureFunc'] == null}}">
-        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
+        <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
             <template repeat="{{ field in ref['fields'] }}">
@@ -69,7 +69,7 @@
       </template>
 
       <template if="{{ isList(ref.serviceType) }}">
-        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
+        <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
             <template repeat="{{ element in ref['elements'] }}">
@@ -85,5 +85,6 @@
       </template>
     </span>
   </template>
-  <script type="application/dart" src="instance_ref.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="instance_ref.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
index ac67b18..ac9caef 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
@@ -13,6 +13,7 @@
 class InstanceViewElement extends ObservatoryElement {
   @published ServiceMap instance;
   @published ServiceMap path;
+  @observable int retainedBytes = null;
 
   InstanceViewElement.created() : super.created();
 
@@ -23,7 +24,10 @@
 
   // TODO(koda): Add no-arg "calculate-link" instead of reusing "eval-link".
   Future<ServiceObject> retainedSize(var dummy) {
-    return instance.isolate.get(instance.id + "/retained");
+    return instance.isolate.get(instance.id + "/retained")
+        .then((ServiceMap obj) {
+          retainedBytes = int.parse(obj['valueAsString']);
+        });
   }
 
   Future<ServiceObject> retainingPath(var arg) {
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 215d670..d54eaae 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -1,14 +1,14 @@
-<head>
-  <link rel="import" href="class_ref.html">
-  <link rel="import" href="error_view.html">
-  <link rel="import" href="eval_box.html">
-  <link rel="import" href="eval_link.html">
-  <link rel="import" href="field_ref.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="instance_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="nav_bar.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="error_view.html">
+<link rel="import" href="eval_box.html">
+<link rel="import" href="eval_link.html">
+<link rel="import" href="field_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="nav_bar.html">
+
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -19,6 +19,7 @@
       <class-nav-menu cls="{{ instance['class'] }}"></class-nav-menu>
       <nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <template if="{{ instance['error'] != null }}">
@@ -55,9 +56,14 @@
           <div class="memberItem">
             <div class="memberName">retained size</div>
             <div class="memberValue">
-              <eval-link callback="{{ retainedSize }}"
-                         label="[calculate]">
-              </eval-link>
+              <template if="{{ retainedBytes == null }}">
+                <eval-link callback="{{ retainedSize }}"
+                           label="[calculate]">
+                </eval-link>
+              </template>
+              <template if="{{ retainedBytes != null }}">
+                {{ retainedBytes | formatSize }}
+              </template>
             </div>
           </div>
           <div class="memberItem">
@@ -182,5 +188,6 @@
 
     </template>
   </template>
-  <script type="application/dart" src="instance_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="instance_view.dart"></script>
\ No newline at end of file
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 9e93387..bd44740 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/io_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/io_view.dart
@@ -62,14 +62,16 @@
     });
   }
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     // Start a timer to update the isolate summary once a second.
     _updateTimer = new Timer(new Duration(seconds: 1), _updateHttpServer);
   }
 
-  void leftView() {
-    super.leftView();
+  @override
+  void detached() {
+    super.detached();
     if (_updateTimer != null) {
       _updateTimer.cancel();
       _updateTimer = null;
@@ -77,6 +79,47 @@
   }
 }
 
+@CustomTag('io-http-server-connection-view')
+class IOHttpServerConnectionViewElement extends ObservatoryElement {
+  @published ServiceMap connection;
+  Timer _updateTimer;
+
+  IOHttpServerConnectionViewElement.created() : super.created();
+
+  void refresh(var done) {
+    connection.reload().whenComplete(done);
+  }
+
+  void _updateHttpServer() {
+    refresh(() {
+      if (_updateTimer != null) {
+        _updateTimer = new Timer(new Duration(seconds: 1), _updateHttpServer);
+      }
+    });
+  }
+
+  @override
+  void attached() {
+    super.attached();
+    // Start a timer to update the isolate summary once a second.
+    _updateTimer = new Timer(new Duration(seconds: 1), _updateHttpServer);
+  }
+
+  @override
+  void detached() {
+    super.detached();
+    if (_updateTimer != null) {
+      _updateTimer.cancel();
+      _updateTimer = null;
+    }
+  }
+}
+
+@CustomTag('io-http-server-connection-ref')
+class IOHttpServerConnectionRefElement extends ServiceRefElement {
+  IOHttpServerConnectionRefElement.created() : super.created();
+}
+
 @CustomTag('io-socket-ref')
 class IOSocketRefElement extends ServiceRefElement {
   IOSocketRefElement.created() : super.created();
@@ -167,14 +210,16 @@
     });
   }
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     // Start a timer to update the isolate summary once a second.
     _updateTimer = new Timer(new Duration(seconds: 1), _updateFile);
   }
 
-  void leftView() {
-    super.leftView();
+  @override
+  void detached() {
+    super.detached();
     if (_updateTimer != null) {
       _updateTimer.cancel();
       _updateTimer = null;
@@ -220,14 +265,16 @@
     });
   }
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     // Start a timer to update the isolate summary once a second.
     _updateTimer = new Timer(new Duration(seconds: 1), _updateFile);
   }
 
-  void leftView() {
-    super.leftView();
+  @override
+  void detached() {
+    super.detached();
     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 4343aec..6617315 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/io_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/io_view.html
@@ -1,8 +1,8 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="service_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="service_ref.html">
+
 <polymer-element name="io-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -10,6 +10,7 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -19,7 +20,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
+          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/http/servers'))}}">HTTP Servers</a>
         </li>
       </ul>
 
@@ -27,7 +28,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a href="{{io.isolate.relativeHashLink('io/sockets')}}">Sockets</a>
+          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/sockets'))}}">Sockets</a>
         </li>
       </ul>
 
@@ -35,7 +36,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a href="{{io.isolate.relativeHashLink('io/websockets')}}">WebSockets</a>
+          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/websockets'))}}">WebSockets</a>
         </li>
       </ul>
 
@@ -43,7 +44,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a href="{{io.isolate.relativeHashLink('io/file/randomaccessfiles')}}">Random Access Files</a>
+          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/file/randomaccessfiles'))}}">Random Access Files</a>
         </li>
       </ul>
 
@@ -51,7 +52,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a href="{{io.isolate.relativeHashLink('io/processes')}}">Processess</a>
+          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/processes'))}}">Processess</a>
         </li>
       </ul>
 
@@ -67,6 +68,9 @@
     <template if="{{ ref.serviceType == 'Socket' }}">
       <io-socket-ref ref="{{ ref }}"></io-socket-ref>
     </template>
+    <template if="{{ ref.serviceType == 'HttpServerConnection' }}">
+      <io-http-server-connection-ref ref="{{ ref }}"></io-http-server-connection-ref>
+    </template>
     <template if="{{ ref.serviceType == 'HttpServer' }}">
       <io-http-server-ref ref="{{ ref }}"></io-http-server-ref>
     </template>
@@ -109,7 +113,7 @@
 <polymer-element name="io-http-server-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a href="{{ url }}">{{ name }}</a>
+    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -142,11 +146,64 @@
         </div>
         <div class="memberItem">
           <div class="memberName">Active connections</div>
-          <div class="memberValue">{{ httpServer['active'] }}</div>
+          <ul class="list-group">
+            <template repeat="{{ connection in httpServer['active'] }}">
+              <li class="list-group-item">
+                <io-http-server-connection-ref ref="{{ connection }}"></io-http-server-connection-ref>
+              </li>
+            </template>
+          </ul>
         </div>
         <div class="memberItem">
           <div class="memberName">Idle connections</div>
-          <div class="memberValue">{{ httpServer['idle'] }}</div>
+          <ul class="list-group">
+            <template repeat="{{ connection in httpServer['idle'] }}">
+              <li class="list-group-item">
+                <io-http-server-connection-ref ref="{{ connection }}"></io-http-server-connection-ref>
+              </li>
+            </template>
+          </ul>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-connection-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-connection-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>HttpConnection</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Socket</div>
+          <div class="memberValue"><io-socket-ref ref="{{ connection['socket'] }}"></io-socket-ref></div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">State</div>
+          <div class="memberValue">{{ connection['state'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Server</div>
+          <div class="memberValue"><io-http-server-ref ref="{{ connection['server'] }}"></io-http-server-ref></div>
         </div>
       </div>
     </div>
@@ -158,7 +215,7 @@
 <polymer-element name="io-socket-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a href="{{ url }}">{{ name }}</a>
+    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -288,7 +345,7 @@
 <polymer-element name="io-web-socket-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a href="{{ url }}">{{ name }}</a>
+    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -348,7 +405,7 @@
 <polymer-element name="io-random-access-file-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a href="{{ url }}">{{ name }}</a>
+    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -444,10 +501,10 @@
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <template if="{{ small }}">
-      <a href="{{ url }}">{{ name }}</a>
+      <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
     </template>
     <template if="{{ !small }}">
-      <a href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
+      <a on-click="{{ goto }}" href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
     </template>
   </template>
 </polymer-element>
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 ea60919..d8d5bd6 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
@@ -127,7 +127,9 @@
   }
 
 
-  void enteredView() {
+  @override
+  void attached() {
+    super.attached();
     tree = new TableTree();
     _update();
   }
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 b15b9fc..f7fb0b1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -1,18 +1,19 @@
-<head>
-  <link rel="import" href="code_ref.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="sliding_checkbox.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="code_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="sliding_checkbox.html">
+
 <polymer-element name="isolate-profile" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ profile.isolate.relativeLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
     <style>
       .table {
@@ -186,5 +187,6 @@
       </table>
     </div>
   </template>
-  <script type="application/dart" src="isolate_profile.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="isolate_profile.dart"></script>
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 84e4e66..5ab877e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
@@ -1,9 +1,9 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="service_ref.html">
-</head>
 <polymer-element name="isolate-ref" extends="service-ref">
 <template><link rel="stylesheet" href="css/shared.css">
-  <a href="{{ url }}">{{ ref.name }}</a>
+  <a on-click="{{ goto }}" href="{{ url }}">{{ ref.name }}</a>
 </template>
-<script type="application/dart" src="isolate_ref.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="isolate_ref.dart"></script>
\ No newline at end of file
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 9ed1e77..06738ea 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -1,11 +1,10 @@
-<head>
-  <link rel="import" href="action_link.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="isolate_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_inset.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="action_link.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="isolate_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_inset.html">
+<link rel="import" href="script_ref.html">
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -128,48 +127,55 @@
           <div class="memberItem">
             <div class="memberName">new heap</div>
             <div class="memberValue">
-              {{ isolate.newHeapUsed | formatSize }}
+              {{ isolate.newSpace.used | formatSize }}
               of
-              {{ isolate.newHeapCapacity | formatSize }}
+              {{ isolate.newSpace.capacity | formatSize }}
             </div>
           </div>
           <div class="memberItem">
             <div class="memberName">old heap</div>
             <div class="memberValue">
-              {{ isolate.oldHeapUsed | formatSize }}
+              {{ isolate.oldSpace.used | formatSize }}
               of
-              {{ isolate.oldHeapCapacity | formatSize }}
+              {{ isolate.oldSpace.capacity | formatSize }}
             </div>
           </div>
         </div>
         <br>
         <div class="memberItem">
           <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+            See <a on-click="{{ goto }}" href="{{ gotoLink('/class-tree' + isolate.link) }}">class hierarchy</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('stacktrace')) }}">stack trace</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('profile')) }}">cpu profile</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('allocationprofile')) }}">allocation profile</a>
           </div>
         </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('heapmap')) }}">heap map</a>
+          </div>
+        </div>
+        <!-- Temporarily disabled until UI for dart:io is acceptable.
         <template if="{{ isolate.ioEnabled }}">
           <div class="memberItem">
             <div class="memberValue">
-              See <a href="{{ isolate.relativeHashLink('io') }}">dart:io</a>
+              See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('io')) }}">dart:io</a>
             </div>
           </div>
         </template>
+        -->
       </div>
       <div class="flex-item-10-percent">
       </div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
index 582c9ee..5199f83 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
@@ -92,21 +92,26 @@
     isolate.updateTagProfile().then((tagProfile) {
       tagProfileChart.update(tagProfile);
       _drawTagProfileChart();
-      // Start the timer again.
-      _updateTimer = new Timer(new Duration(seconds: 1), _updateTagProfile);
+      if (_updateTimer != null) {
+        // Start the timer again.
+        _updateTimer = new Timer(new Duration(seconds: 1), _updateTagProfile);
+      }
     });
   }
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     // Start a timer to update the isolate summary once a second.
     _updateTimer = new Timer(new Duration(seconds: 1), _updateTagProfile);
   }
 
-  void leftView() {
-    super.leftView();
+  @override
+  void detached() {
+    super.detached();
     if (_updateTimer != null) {
       _updateTimer.cancel();
+      _updateTimer = null;
     }
   }
 
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 794b50a..9a780cd 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -1,15 +1,15 @@
-<head>
-  <link rel="import" href="action_link.html">
-  <link rel="import" href="curly_block.html">
-  <link rel="import" href="eval_box.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="isolate_summary.html">
-  <link rel="import" href="library_ref.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_inset.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="action_link.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="eval_box.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="isolate_summary.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_inset.html">
+<link rel="import" href="script_ref.html">
+
 <polymer-element name="isolate-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -28,6 +28,7 @@
       <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}">
       </isolate-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -99,7 +100,7 @@
         <div class="flex-item-50-percent">
           <div class="memberItem">
             <div class="memberValue">
-              See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+              See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('debug/breakpoints')) }}">breakpoints</a>
             </div>
           </div>
         </div>
@@ -137,5 +138,6 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart" src="isolate_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="isolate_view.dart"></script>
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 f7e42ff..4ef479b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/json_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/json_view.html
@@ -1,3 +1,4 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="nav_bar.html">
 <link rel="import" href="observatory_element.html">
 <polymer-element name="json-view" extends="observatory-element">
@@ -7,5 +8,6 @@
     </nav-bar>
       <pre>{{ mapAsString }}</pre>
   </template>
-  <script type="application/dart" src="json_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="json_view.dart"></script>
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 5dbfc55..2b8c831 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
@@ -1,14 +1,15 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="service_ref.html">
-</head>
+
 <polymer-element name="library-ref" extends="service-ref">
-<template><link rel="stylesheet" href="css/shared.css">
-  <template if="{{ nameIsEmpty }}">
-    <a href="{{ url }}">unnamed</a>
+  <template><link rel="stylesheet" href="css/shared.css">
+    <template if="{{ nameIsEmpty }}">
+      <a on-click="{{ goto }}" href="{{ url }}">unnamed</a>
+    </template>
+    <template if="{{ !nameIsEmpty }}">
+      <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    </template>
   </template>
-  <template if="{{ !nameIsEmpty }}">
-    <a href="{{ url }}">{{ name }}</a>
-  </template>
-</template>
-<script type="application/dart" src="library_ref.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="library_ref.dart"></script>
\ No newline at end of file
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 9b4e339..0d12935 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -1,15 +1,15 @@
-<head>
-  <link rel="import" href="class_ref.html">
-  <link rel="import" href="curly_block.html">
-  <link rel="import" href="eval_box.html">
-  <link rel="import" href="field_ref.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="instance_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="library_ref.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="eval_box.html">
+<link rel="import" href="field_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="script_ref.html">
+
 <polymer-element name="library-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -19,6 +19,7 @@
       <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
       <library-nav-menu library="{{ library }}" last="{{ true }}"></library-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -137,5 +138,6 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart" src="library_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="library_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
index c82b427..fb241d4 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
@@ -6,6 +6,7 @@
 
 import 'dart:html';
 import 'observatory_element.dart';
+import 'package:observatory/app.dart';
 import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
@@ -57,6 +58,19 @@
   }
 }
 
+@CustomTag('nav-control')
+class NavControlElement extends ObservatoryElement {
+  NavControlElement.created() : super.created();
+
+  void forward(Event e, var detail, Element target) {
+    location.forward();
+  }
+
+  void back(Event e, var detail, Element target) {
+    location.back();
+  }
+}
+
 @CustomTag('top-nav-menu')
 class TopNavMenuElement extends ObservatoryElement {
   @published bool last = false;
@@ -77,7 +91,7 @@
   @reflectable
   String get hashLinkWorkaround {
     if (isolate != null) {
-      return isolate.hashLink;
+      return isolate.link;
     } else {
       return '';
     }
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 fd4f762..213f323 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -1,6 +1,5 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="observatory_element.html">
 
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
@@ -81,7 +80,7 @@
     </style>
 
     <li class="menu">
-      <a href="{{ link }}">{{ anchor }}</a>
+      <a on-click="{{ goto }}" href="{{ gotoLink(link) }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
     <template if="{{ !last }}">
@@ -129,7 +128,7 @@
         text-decoration: none;
       }
     </style>
-    <li><a href="{{ link }}">{{ anchor }}</a>
+    <li><a on-click="{{ goto }}" href="{{ gotoLink(link) }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
   </template>
@@ -165,9 +164,33 @@
   </template>
 </polymer-element>
 
+<polymer-element name="nav-control" extends="observatory-element">
+  <template>
+    <style>
+      .black {
+        color: #000;
+      }
+      li {
+        float: right;
+        margin: 0;
+      }
+      button {
+        margin: 3px;
+        padding: 8px;
+      }
+    </style>
+    <!-- Disable until issues with history in Dartium are fixed
+    <li>
+      <button class="black" on-click="{{ back }}">&#9664;</button>
+      <button class="black" on-click="{{ forward }}">&#9654;</button>
+    </li>
+    -->
+  </template>
+</polymer-element>
+
 <polymer-element name="top-nav-menu">
   <template>
-    <nav-menu link="#/vm" anchor="Observatory" last="{{ last }}">
+    <nav-menu link="/vm" anchor="Observatory" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
@@ -176,15 +199,15 @@
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
     <nav-menu link="{{ hashLinkWorkaround }}" anchor="{{ isolate.name }}" last="{{ last }}">
-      <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}"
+      <nav-menu-item link="{{ isolate.relativeLink('stacktrace') }}"
                      anchor="stack trace"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}"
+      <nav-menu-item link="{{ isolate.relativeLink('profile') }}"
                      anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}"
+      <nav-menu-item link="{{ isolate.relativeLink('allocationprofile') }}"
                      anchor="allocation profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}"
+      <nav-menu-item link="{{ isolate.relativeLink('heapmap') }}"
                      anchor="heap map"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}"
+      <nav-menu-item link="{{ isolate.relativeLink('debug/breakpoints') }}"
                      anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
@@ -193,7 +216,7 @@
 
 <polymer-element name="library-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ library.hashLink }}"
+    <nav-menu link="{{ library.link }}"
               anchor="{{ library.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
@@ -202,7 +225,7 @@
 
 <polymer-element name="class-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ cls.hashLink }}"
+    <nav-menu link="{{ cls.link }}"
               anchor="{{ cls.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart
index d1a4f8d..a11385f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart
@@ -14,16 +14,17 @@
 @CustomTag('observatory-application')
 class ObservatoryApplicationElement extends ObservatoryElement {
   @published bool devtools = false;
-  @published ObservatoryApplication app;
+  @reflectable ObservatoryApplication app;
 
   ObservatoryApplicationElement.created() : super.created();
 
-  enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     if (devtools) {
-      app = new ObservatoryApplication.devtools();
+      app = new ObservatoryApplication.devtools(this);
     } else {
-      app = new ObservatoryApplication();
+      app = new ObservatoryApplication(this);
     }
   }
 }
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 0d34af3..73a2615 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
@@ -1,10 +1,8 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="response_viewer.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="service_view.html">
 <polymer-element name="observatory-application" extends="observatory-element">
-  <template>
-    <response-viewer app="{{ this.app }}"></response-viewer>
-  </template>
-  <script type="application/dart" src="observatory_application.dart"></script>
+  <!-- This element explicitly manages its child elements -->
 </polymer-element>
+
+<script type="application/dart" src="observatory_application.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
index b889559..5cc8d91 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
@@ -4,6 +4,7 @@
 
 library observatory_element;
 
+import 'dart:html';
 import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 
@@ -12,22 +13,35 @@
 class ObservatoryElement extends PolymerElement {
   ObservatoryElement.created() : super.created();
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
   }
 
-  void leftView() {
-    super.leftView();
+  @override
+  void attributeChanged(String name, var oldValue, var newValue) {
+    super.attributeChanged(name, oldValue, newValue);
+  }
+
+  @override
+  void detached() {
+    super.detached();
   }
 
   void ready() {
     super.ready();
   }
 
-  void attributeChanged(String name, var oldValue, var newValue) {
-    super.attributeChanged(name, oldValue, newValue);
+  void goto(MouseEvent event, var detail, Element target) {
+    location.onGoto(event, detail, target);
   }
 
+  String gotoLink(String url) {
+    return location.makeLink(url);
+  }
+
+
+
   String formatTimePrecise(double time) => Utils.formatTimePrecise(time);
 
   String formatTime(double time) => Utils.formatTime(time);
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 8a24a8c..dce89dc 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,6 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+
 <polymer-element name="observatory-element">
-  <script type="application/dart" src="observatory_element.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="observatory_element.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart b/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
index da79352..cffe42e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
@@ -14,66 +14,69 @@
   @published Script script;
   @published int pos;
   @published int endPos;
-  @published bool coverage = false;
+  final List<int> lineNumbers = new ObservableList<int>();
+  @observable int startLine;
+  @observable int endLine;
 
   @observable List<ScriptLine> lines = toObservable([]);
 
+  void attached() {
+    super.attached();
+  }
+
   void scriptChanged(oldValue) {
-    _updateProperties();
-    notifyPropertyChange(#hitStyle, 0, 1);
+    _updateLines();
   }
 
   void posChanged(oldValue) {
-    _updateProperties();
+    _updateLines();
   }
 
-  coverageChanged(oldValue) {
-    notifyPropertyChange(#lines, 0, 1);
-    notifyPropertyChange(#hitStyle, 0, 1);
+  void endPosChanged(oldValue) {
+    _updateLines();
   }
 
   static const hitStyleNone = 'min-width:32px;';
-  static const hitStyleExecuted = 'min-width:32px;background-color:green';
-  static const hitStyleNotExecuted = 'min-width:32px;background-color:red';
+  static const hitStyleExecuted = 'min-width:32px; background-color:green';
+  static const hitStyleNotExecuted = 'min-width:32px; background-color:red';
 
-  @observable String hitStyle(ScriptLine line) {
-    if ((script == null) || !coverage) {
+  /// [hits] can be null which indicates that the line is not executable.
+  /// When [hits] is 0, the line is executable but hasn't been executed and
+  /// when [hits] is positive, the line is executable and has been executed.
+  String styleForHits(int hits) {
+    if (hits == null) {
       return hitStyleNone;
-    }
-    var hit = script.hits[line.line];
-    if (hit == null) {
-      return hitStyleNone;
-    }
-    if (hit == 0) {
+    } else if (hits == 0) {
       return hitStyleNotExecuted;
     }
-    assert(hit > 0);
+    assert(hits > 0);
     return hitStyleExecuted;
   }
 
+  var _updateFuture;
 
-  void _updateProperties() {
-    if (!script.loaded) {
-      script.load().then((_) {
-          if (script.loaded) {
-            _updateProperties();
-          }
-        });
+  void _updateLines() {
+    if (_updateFuture != null) {
+      // Already scheduled.
       return;
     }
-    notifyPropertyChange(#lines, 0, 1);
-    lines.clear();
-    var startLineNumber = script.tokenToLine(pos);
-    if (startLineNumber != null) {
-      if (endPos == null) {  
-        lines.add(script.lines[startLineNumber - 1]);
-      } else {
-        var endLineNumber = script.tokenToLine(endPos);
-        assert(endLineNumber != null);
-        for (var i = startLineNumber; i <= endLineNumber; i++) {
-          lines.add(script.lines[i - 1]);
+    if (!script.loaded) {
+      _updateFuture = script.load().then((_) {
+        if (script.loaded) {
+          _updateFuture = null;
+          _updateLines();
         }
-      }
+      });
+      return;
+    }
+    startLine =
+        (pos != null) ? script.tokenToLine(pos) - 1 : 0;
+    endLine =
+        (endPos != null) ? script.tokenToLine(endPos) : script.lines.length;
+    // Add line numbers.
+    lineNumbers.clear();
+    for (var i = startLine; i < endLine; i++) {
+      lineNumbers.add(i);
     }
   }
 
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 e4023b4..cefb95c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
@@ -1,6 +1,6 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="script-inset" extends="observatory-element">
   <template>
     <style>
@@ -18,31 +18,19 @@
     <div class="sourceInset">
       <content></content>
       <div class="grayBox">
-        <template if="{{ coverage == true }}">
-          <table>
-            <tbody>
-              <tr template repeat="{{ line in lines }}">
-                <td style="{{ hitStyle(line) }}"><span>  </span></td>
-                <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
-                <td>&nbsp;</td>
-                <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
-              </tr>
-            </tbody>
-          </table>
-        </template>
-        <template if="{{ coverage == false }}">
-          <table>
-            <tbody>
-              <tr template repeat="{{ line in lines }}">
-                <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
-                <td>&nbsp;</td>
-                <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
-              </tr>
-            </tbody>
-          </table>
-        </template>
+        <table>
+          <tbody>
+            <tr template repeat="{{ lineNumber in lineNumbers }}">
+              <td style="{{ styleForHits(script.lines[lineNumber].hits) }}"><span>  </span></td>
+              <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{script.lines[lineNumber].line}}</td>
+              <td>&nbsp;</td>
+              <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{script.lines[lineNumber].text}}</td>
+            </tr>
+          </tbody>
+        </table>
       </div>
     </div>
   </template>
-  <script type="application/dart" src="script_inset.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="script_inset.dart"></script>
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 07f27f2..14b4b6d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
@@ -1,11 +1,12 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="service_ref.html">
-</head>
+
 <polymer-element name="script-ref" extends="service-ref">
 <template>
   <link rel="stylesheet" href="css/shared.css">
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+  <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
-<script type="application/dart" src="script_ref.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="script_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.dart b/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
index 5971488..64f8231 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
@@ -13,28 +13,23 @@
 @CustomTag('script-view')
 class ScriptViewElement extends ObservatoryElement {
   @published Script script;
-  @published bool showCoverage = false;
 
   ScriptViewElement.created() : super.created();
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     if (script == null) {
       return;
     }
     script.load();
   }
 
-  showCoverageChanged(oldValue) {
-    ScriptInsetElement sie = shadowRoot.querySelector('#scriptInset');
-    sie.coverage = showCoverage;
-  }
-
   void refresh(var done) {
     script.reload().whenComplete(done);
   }
 
   void refreshCoverage(var done) {
-    script.isolate.refreshCoverage().whenComplete(done);
+    script.isolate.refreshCoverage()..whenComplete(done);
   }
 }
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 accb51f..a99bb89 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
@@ -1,8 +1,8 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_inset.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_inset.html">
+
 <polymer-element name="script-view" extends="observatory-element">
 <template>
   <link rel="stylesheet" href="css/shared.css">
@@ -10,20 +10,16 @@
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
-    <nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
-      <li>
-        <input type="checkbox" checked="{{ showCoverage }}">
-        <label>Show Coverage Data</label>
-      </li>
-    </nav-menu>
+    <nav-menu link="{{ script.link }}" anchor="{{ script.name }}" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
-    <nav-refresh callback="{{ refresh }}">
-    </nav-refresh>
+    <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    <nav-control></nav-control>
   </nav-bar>
 
   <script-inset id="scriptInset" script="{{ script }}" pos="{{ script.firstTokenPos }}" endPos="{{ script.lastTokenPos }}">
   <h1>script {{ script.name }}</h1>
   </script-inset>
 </template>
-<script type="application/dart" src="script_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="script_view.dart"></script>
\ No newline at end of file
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 95e7972..b074d5a 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
@@ -1,12 +1,13 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="service-error-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-control></nav-control>
     </nav-bar>
     <div class="content-centered">
       <h1>{{ error.kind }}</h1>
@@ -14,5 +15,6 @@
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
-  <script type="application/dart" src="service_error_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="service_error_view.dart"></script>
\ No newline at end of file
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 855417e..d758e13 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
@@ -1,12 +1,13 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="service-exception-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-control></nav-control>
     </nav-bar>
     <div class="content-centered">
       <h1>{{ exception.kind }}</h1>
@@ -17,5 +18,6 @@
       </template>
     </div>
   </template>
-  <script type="application/dart" src="service_exception_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="service_exception_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
index 2286b1a..5b6b1a1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
@@ -25,7 +25,7 @@
     if (ref == null) {
       return 'NULL REF';
     }
-    return ref.hashLink;
+    return gotoLink(ref.link);
   }
 
   String get serviceId {
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 1818675..d8e04c9 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
@@ -1,6 +1,7 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="service-ref" extends="observatory-element">
-  <script type="application/dart" src="service_ref.dart"></script>
-</polymer-element>
\ No newline at end of file
+</polymer-element>
+
+<script type="application/dart" src="service_ref.dart"></script>
\ 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 6ee3100..da395c7 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
@@ -105,6 +105,11 @@
             new Element.tag('io-http-server-view');
         element.httpServer = object;
         return element;
+      case 'HttpServerConnection':
+        IOHttpServerConnectionViewElement element =
+            new Element.tag('io-http-server-connection-view');
+        element.connection = object;
+        return element;
       case 'SocketList':
         IOSocketListViewElement element =
             new Element.tag('io-socket-list-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 22b3b98..b91da34 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
@@ -1,22 +1,22 @@
-<head>
-  <link rel="import" href="breakpoint_list.html">
-  <link rel="import" href="class_view.html">
-  <link rel="import" href="code_view.html">
-  <link rel="import" href="error_view.html">
-  <link rel="import" href="field_view.html">
-  <link rel="import" href="function_view.html">
-  <link rel="import" href="heap_map.html">
-  <link rel="import" href="heap_profile.html">
-  <link rel="import" href="instance_view.html">
-  <link rel="import" href="isolate_profile.html">
-  <link rel="import" href="library_view.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_view.html">
-  <link rel="import" href="stack_trace.html">
-  <link rel="import" href="vm_view.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="breakpoint_list.html">
+<link rel="import" href="class_view.html">
+<link rel="import" href="code_view.html">
+<link rel="import" href="error_view.html">
+<link rel="import" href="field_view.html">
+<link rel="import" href="function_view.html">
+<link rel="import" href="heap_map.html">
+<link rel="import" href="heap_profile.html">
+<link rel="import" href="instance_view.html">
+<link rel="import" href="isolate_profile.html">
+<link rel="import" href="library_view.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_view.html">
+<link rel="import" href="stack_trace.html">
+<link rel="import" href="vm_view.html">
 <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" src="service_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="service_view.dart"></script>
\ No newline at end of file
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 80f39aa..cdb4f78 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
@@ -1,3 +1,5 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+
 <polymer-element name="sliding-checkbox">
   <template>
     <style>
@@ -83,5 +85,6 @@
       </label>
     </div>
   </template>
-  <script type="application/dart" src="sliding_checkbox.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="sliding_checkbox.dart"></script>
\ No newline at end of file
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 c03e148..8cb6e9a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
@@ -1,10 +1,10 @@
-<head>
-  <link rel="import" href="curly_block.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="instance_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_ref.html">
+
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -37,5 +37,6 @@
       </div>
     </div>
   </template>
-  <script type="application/dart" src="stack_frame.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="stack_frame.dart"></script>
\ No newline at end of file
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 bd3e569..f08b032 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
@@ -1,16 +1,17 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="stack_frame.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="stack_frame.html">
+
 <polymer-element name="stack-trace" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ trace.isolate.relativeHashLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ trace.isolate.relativeLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
     <template if="{{ trace['members'].isEmpty }}">
       <div class="content">
@@ -27,5 +28,6 @@
       </ul>
     </template>
   </template>
-  <script type="application/dart" src="stack_trace.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="stack_trace.dart"></script>
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 07155df..2ab2f70 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
@@ -1,9 +1,10 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="service_ref.html">
-</head>
+
 <polymer-element name="vm-ref" extends="service-ref">
-<template><link rel="stylesheet" href="css/shared.css">
-  <a href="{{ url }}">{{ ref.name }}</a>
-</template>
-<script type="application/dart" src="vm_ref.dart"></script>
+  <template><link rel="stylesheet" href="css/shared.css">
+    <a on-click="{{ goto }}" href="{{ url }}">{{ ref.name }}</a>
+  </template>
 </polymer-element>
+
+<script type="application/dart" src="vm_ref.dart"></script>
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 226d085..d45c24f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
@@ -1,13 +1,13 @@
-<head>
-  <link rel="import" href="curly_block.html">
-  <link rel="import" href="eval_box.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="isolate_summary.html">
-  <link rel="import" href="library_ref.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="eval_box.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="isolate_summary.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_ref.html">
+
 <polymer-element name="vm-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -15,6 +15,7 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -36,10 +37,18 @@
           <div class="memberName">asserts enabled</div>
           <div class="memberValue">{{ vm.assertsEnabled }}</div>
         </div>
+        <div class="memberItem">
+          <div class="memberName">pid</div>
+          <div class="memberValue">{{ vm.pid }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">refreshed at</div>
+          <div class="memberValue">{{ vm.lastUpdate }}</div>
+        </div>
         <br>
         <div class="memberItem">
           <div class="memberValue">
-            See <a href="#/flags">flags</a>
+            See <a on-click="{{ goto }}" href="{{ gotoLink('/flags') }}">flags</a>
           </div>
         </div>
       </div>
@@ -57,5 +66,6 @@
       </template>
     </ul>
   </template>
-  <script type="application/dart" src="vm_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="vm_view.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index 7df9eb6..d63afa3 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -29,11 +29,6 @@
   /// The complete service url of this object.
   @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.
-  @reflectable String get hashLink => '#/${link}';
-  @reflectable set hashLink(var o) { /* silence polymer */ }
-
   /// Has this object been fully loaded?
   bool get loaded => _loaded;
   bool _loaded = false;
@@ -67,6 +62,9 @@
     var obj = null;
     assert(type != 'VM');
     switch (type) {
+      case 'Class':
+        obj = new Class._empty(owner);
+        break;
       case 'Code':
         obj = new Code._empty(owner);
         break;
@@ -192,6 +190,8 @@
   @observable double uptime = 0.0;
   @observable bool assertsEnabled = false;
   @observable bool typeChecksEnabled = false;
+  @observable String pid = '';
+  @observable DateTime lastUpdate;
 
   VM() : super._empty(null) {
     name = 'vm';
@@ -252,45 +252,39 @@
   }
 
   Future<ServiceObject> get(String id) {
-    var parts = id.split('#');
-    assert(parts.length >= 1);
-    // We should never see more than two hashes.
-    assert(parts.length <= 2);
-    // The ID does not include anything after the # (or the # itself).
-    id = parts[0];
-    // I'm serious.
-    assert(!id.contains('#'));
+    assert(id.startsWith('/') == false);
     // Isolates are handled specially, since they can cache sub-objects.
     if (id.startsWith(_isolatesPrefix)) {
       String isolateId = _parseIsolateId(id);
       String objectId = _parseObjectId(id);
       return _getIsolate(isolateId).then((isolate) {
-          if (isolate == null) {
-            // The isolate does not exist.  Return the VM object instead.
-            //
-            // TODO(turnidge): Generate a service error?
-            return this;
-          }
-          if (objectId == null) {
-            return isolate.reload();
-          } else {
-            return isolate.get(objectId);
-          }
-        });
+        if (isolate == null) {
+          // The isolate does not exist.  Return the VM object instead.
+          //
+          // TODO(turnidge): Generate a service error?
+          return this;
+        }
+        if (objectId == null) {
+          return isolate.reload();
+        } else {
+          return isolate.get(objectId);
+        }
+      });
     }
 
     var obj = _cache[id];
     if (obj != null) {
       return obj.reload();
     }
+
     // Cache miss.  Get the object from the vm directly.
     return getAsMap(id).then((ObservableMap map) {
-        var obj = new ServiceObject._fromMap(this, map);
-        if (obj.canCache) {
-          _cache.putIfAbsent(id, () => obj);
-        }
-        return obj;
-      });
+      var obj = new ServiceObject._fromMap(this, map);
+      if (obj.canCache) {
+        _cache.putIfAbsent(id, () => obj);
+      }
+      return obj;
+    });
   }
 
   dynamic _reviver(dynamic key, dynamic value) {
@@ -381,7 +375,10 @@
     version = map['version'];
     architecture = map['architecture'];
     uptime = map['uptime'];
+    var dateInMillis = int.parse(map['date']);
+    lastUpdate = new DateTime.fromMillisecondsSinceEpoch(dateInMillis);
     assertsEnabled = map['assertsEnabled'];
+    pid = map['pid'];
     typeChecksEnabled = map['typeChecksEnabled'];
     _updateIsolates(map['isolates']);
   }
@@ -492,14 +489,29 @@
   }
 }
 
+class HeapSpace extends Observable {
+  @observable int used = 0;
+  @observable int capacity = 0;
+  @observable int external = 0;
+  @observable int collections = 0;
+  @observable double totalCollectionTimeInSeconds = 0.0;
+
+  void update(Map heapMap) {
+    used = heapMap['used'];
+    capacity = heapMap['capacity'];
+    external = heapMap['external'];
+    collections = heapMap['collections'];
+    totalCollectionTimeInSeconds = heapMap['time'];
+  }
+}
+
 /// State for a running isolate.
 class Isolate extends ServiceObjectOwner {
   @reflectable VM get vm => owner;
   @reflectable Isolate get isolate => this;
   @observable ObservableMap counters = new ObservableMap();
 
-  String get link => _id;
-  String get hashLink => '#/$_id';
+  String get link => '/${_id}';
 
   @observable ServiceMap pauseEvent = null;
   bool get _isPaused => pauseEvent != null;
@@ -517,9 +529,7 @@
   }
 
   /// Creates a link to [id] relative to [this].
-  @reflectable String relativeLink(String id) => '${this.id}/$id';
-  /// Creates a relative link to [id] with a '#/' prefix.
-  @reflectable String relativeHashLink(String id) => '#/${relativeLink(id)}';
+  @reflectable String relativeLink(String id) => '/${this.id}/$id';
 
   static const TAG_ROOT_ID = 'code/tag-0';
 
@@ -585,6 +595,41 @@
     script._processHits(scriptCoverage['hits']);
   }
 
+  /// Fetches and builds the class hierarchy for this isolate. Returns the
+  /// Object class object.
+  Future<Class> getClassHierarchy() {
+    return get('classes').then(_loadClasses).then(_buildClassHierarchy);
+  }
+
+  /// Given the class list, loads each class.
+  Future<List<Class>> _loadClasses(ServiceMap classList) {
+    assert(classList.serviceType == 'ClassList');
+    var futureClasses = [];
+    for (var cls in classList['members']) {
+      // Skip over non-class classes.
+      if (cls is Class) {
+        futureClasses.add(cls.load());
+      }
+    }
+    return Future.wait(futureClasses);
+  }
+
+  /// Builds the class hierarchy and returns the Object class.
+  Future<Class> _buildClassHierarchy(List<Class> classes) {
+    rootClasses.clear();
+    objectClass = null;
+    for (var cls in classes) {
+      if (cls.superClass == null) {
+        rootClasses.add(cls);
+      }
+      if ((cls.vmName == 'Object') && (cls.isPatch == false)) {
+        objectClass = cls;
+      }
+    }
+    assert(objectClass != null);
+    return new Future.value(objectClass);
+  }
+
   ServiceObject getFromMap(ObservableMap map) {
     if (map == null) {
       return null;
@@ -619,6 +664,9 @@
       });
   }
 
+  @observable Class objectClass;
+  @observable final rootClasses = new ObservableList<Class>();
+
   @observable Library rootLib;
   @observable ObservableList<Library> libraries =
       new ObservableList<Library>();
@@ -632,15 +680,18 @@
   @observable final Map<String, double> timers =
       toObservable(new Map<String, double>());
 
-  @observable int newHeapUsed = 0;
-  @observable int oldHeapUsed = 0;
-  @observable int newHeapCapacity = 0;
-  @observable int oldHeapCapacity = 0;
+  final HeapSpace newSpace = new HeapSpace();
+  final HeapSpace oldSpace = new HeapSpace();
 
   @observable String fileAndLine;
 
   @observable DartError error;
 
+  void updateHeapsFromMap(ObservableMap map) {
+    newSpace.update(map['new']);
+    oldSpace.update(map['old']);
+  }
+
   void _update(ObservableMap map, bool mapIsRef) {
     mainPort = map['mainPort'];
     name = map['name'];
@@ -653,7 +704,7 @@
     _upgradeCollection(map, isolate);
     if (map['rootLib'] == null ||
         map['timers'] == null ||
-        map['heap'] == null) {
+        map['heaps'] == null) {
       Logger.root.severe("Malformed 'Isolate' response: $map");
       return;
     }
@@ -702,10 +753,7 @@
                       timerMap['time_bootstrap']);
     timers['dart'] = timerMap['time_dart_execution'];
 
-    newHeapUsed = map['heap']['usedNew'];
-    oldHeapUsed = map['heap']['usedOld'];
-    newHeapCapacity = map['heap']['capacityNew'];
-    oldHeapCapacity = map['heap']['capacityOld'];
+    updateHeapsFromMap(map['heaps']);
 
     List features = map['features'];
     if (features != null) {
@@ -906,7 +954,7 @@
   @observable String url;
   @reflectable final imports = new ObservableList<Library>();
   @reflectable final scripts = new ObservableList<Script>();
-  @reflectable final classes = new ObservableList<ServiceMap>();
+  @reflectable final classes = new ObservableList<Class>();
   @reflectable final variables = new ObservableList<ServiceMap>();
   @reflectable final functions = new ObservableList<ServiceMap>();
 
@@ -945,15 +993,152 @@
   }
 }
 
-class ScriptLine {
-  @reflectable final int line;
-  @reflectable final String text;
+class AllocationCount extends Observable {
+  @observable int instances = 0;
+  @observable int bytes = 0;
+
+  void reset() {
+    instances = 0;
+    bytes = 0;
+  }
+
+  bool get empty => (instances == 0) && (bytes == 0);
+}
+
+class Allocations {
+  // Indexes into VM provided array. (see vm/class_table.h).
+  static const ALLOCATED_BEFORE_GC = 0;
+  static const ALLOCATED_BEFORE_GC_SIZE = 1;
+  static const LIVE_AFTER_GC = 2;
+  static const LIVE_AFTER_GC_SIZE = 3;
+  static const ALLOCATED_SINCE_GC = 4;
+  static const ALLOCATED_SINCE_GC_SIZE = 5;
+  static const ACCUMULATED = 6;
+  static const ACCUMULATED_SIZE = 7;
+
+  final AllocationCount accumulated = new AllocationCount();
+  final AllocationCount current = new AllocationCount();
+
+  void update(List stats) {
+    accumulated.instances = stats[ACCUMULATED];
+    accumulated.bytes = stats[ACCUMULATED_SIZE];
+    current.instances = stats[LIVE_AFTER_GC] + stats[ALLOCATED_SINCE_GC];
+    current.bytes = stats[LIVE_AFTER_GC_SIZE] + stats[ALLOCATED_SINCE_GC_SIZE];
+  }
+
+  bool get empty => accumulated.empty && current.empty;
+}
+
+class Class extends ServiceObject {
+  @observable Library library;
+  @observable Script script;
+  @observable Class superClass;
+
+  @observable bool isAbstract;
+  @observable bool isConst;
+  @observable bool isFinalized;
+  @observable bool isPatch;
+  @observable bool isImplemented;
+
+  @observable int tokenPos;
+
+  @observable ServiceMap error;
+
+  final Allocations newSpace = new Allocations();
+  final Allocations oldSpace = new Allocations();
+
+  bool get hasNoAllocations => newSpace.empty && oldSpace.empty;
+
+  @reflectable final children = new ObservableList<Class>();
+  @reflectable final subClasses = new ObservableList<Class>();
+  @reflectable final fields = new ObservableList<ServiceMap>();
+  @reflectable final functions = new ObservableList<ServiceMap>();
+  @reflectable final interfaces = new ObservableList<Class>();
+
+  bool get canCache => true;
+  bool get immutable => false;
+
+  Class._empty(ServiceObjectOwner owner) : super._empty(owner);
+
+  String toString() {
+    return 'Service Class: $vmName';
+  }
+
+  void _update(ObservableMap map, bool mapIsRef) {
+    name = map['user_name'];
+    vmName = map['name'];
+
+    if (mapIsRef) {
+      return;
+    }
+
+    // We are fully loaded.
+    _loaded = true;
+
+    // Extract full properties.
+    _upgradeCollection(map, isolate);
+
+    // Some builtin classes aren't associated with a library.
+    if (map['library'] is Library) {
+      library = map['library'];
+    } else {
+      library = null;
+    }
+
+    script = map['script'];
+
+    isAbstract = map['abstract'];
+    isConst = map['const'];
+    isFinalized = map['finalized'];
+    isPatch = map['patch'];
+    isImplemented = map['implemented'];
+
+    tokenPos = map['tokenPos'];
+
+    subClasses.clear();
+    subClasses.addAll(map['subclasses']);
+
+    fields.clear();
+    fields.addAll(map['fields']);
+
+    functions.clear();
+    functions.addAll(map['functions']);
+
+    superClass = map['super'];
+    if (superClass != null) {
+      superClass._addToChildren(this);
+    }
+    error = map['error'];
+
+    var allocationStats = map['allocationStats'];
+    if (allocationStats != null) {
+      newSpace.update(allocationStats['new']);
+      oldSpace.update(allocationStats['old']);
+    }
+  }
+
+  void _addToChildren(Class cls) {
+    if (children.contains(cls)) {
+      return;
+    }
+    children.add(cls);
+  }
+
+  Future<ServiceObject> get(String command) {
+    return isolate.get(id + "/$command");
+  }
+}
+
+class ScriptLine extends Observable {
+  final int line;
+  final String text;
+  @observable int hits;
   ScriptLine(this.line, this.text);
 }
 
 class Script extends ServiceObject {
-  @reflectable final lines = new ObservableList<ScriptLine>();
-  @reflectable final hits = new ObservableMap<int, int>();
+  final lines = new ObservableList<ScriptLine>();
+  final _hits = new Map<int, int>();
   @observable String kind;
   @observable int firstTokenPos;
   @observable int lastTokenPos;
@@ -1026,8 +1211,13 @@
       var line = scriptHits[i];
       var hit = scriptHits[i + 1]; // hit status.
       assert(line >= 1); // Lines start at 1.
-      hits[line] = hit;
+      var oldHits = _hits[line];
+      if (oldHits != null) {
+        hit += oldHits;
+      }
+      _hits[line] = hit;
     }
+    _applyHitsToLines();
   }
 
   void _processSource(String source) {
@@ -1047,6 +1237,17 @@
     for (var i = 0; i < sourceLines.length; i++) {
       lines.add(new ScriptLine(i + 1, sourceLines[i]));
     }
+    _applyHitsToLines();
+  }
+
+  void _applyHitsToLines() {
+    if (lines.length == 0) {
+      return;
+    }
+    for (var line in lines) {
+      var hits = _hits[line.line];
+      line.hits = hits;
+    }
   }
 }
 
diff --git a/runtime/bin/vmservice/client/pubspec.yaml b/runtime/bin/vmservice/client/pubspec.yaml
index e54d95c..752a205 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
+version: 1.6.0-dev.1
 dependencies:
-  polymer: '>= 0.10.0-pre.13'
+  polymer: '>= 0.11.0-dev.6'
 transformers:
 - polymer:
     entry_points: 
diff --git a/runtime/bin/vmservice/client/web/index.html b/runtime/bin/vmservice/client/web/index.html
index de3474a..1d77822 100644
--- a/runtime/bin/vmservice/client/web/index.html
+++ b/runtime/bin/vmservice/client/web/index.html
@@ -2,9 +2,10 @@
 <head>
   <meta charset="utf-8">
   <title>Dart VM Observatory</title>
+  <script src="packages/web_components/platform.js"></script>
   <link rel="import" href="packages/polymer/polymer.html">
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <link rel="import" href="packages/observatory/elements.html">
   <script type="application/dart" src="main.dart"></script>
   <script src="packages/browser/dart.js"></script>
diff --git a/runtime/bin/vmservice/client/web/index_devtools.html b/runtime/bin/vmservice/client/web/index_devtools.html
index b8b66c7..28a9cd1 100644
--- a/runtime/bin/vmservice/client/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/web/index_devtools.html
@@ -2,8 +2,9 @@
 <head>
   <title>Dart VM Observatory</title>
   <meta charset="utf-8">
-  <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+  <script src="packages/web_components/platform.js"></script>
   <link rel="import" href="packages/polymer/polymer.html">
+  <script type="text/javascript" src="https://www.google.com/jsapi"></script>
   <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <link rel="import" href="packages/observatory/elements.html">
   <script type="application/dart" src="main.dart"></script>
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index da4cb4d..d50727f 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -80,23 +80,62 @@
 
 class Server {
   static const WEBSOCKET_PATH = '/ws';
-  String defaultPath = '/index.html';
-  final String ip;
-  int port;
+  static const ROOT_REDIRECT_PATH = '/index.html';
 
-  final VMService service;
+  final VMService _service;
+  final String _ip;
+  final int _port;
+
   HttpServer _server;
+  bool get running => _server != null;
+  bool _displayMessages = false;
 
-  Server(this.service, this.ip, this.port);
+  Server(this._service, this._ip, this._port) {
+    _displayMessages = (_ip != '127.0.0.1' || _port != 8181);
+  }
+
+  bool _shouldServeObservatory(HttpRequest request) {
+    if (request.headers['Observatory-Version'] != null) {
+      // Request is already coming from Observatory.
+      return false;
+    }
+    // TODO(johnmccutchan): Test with obscure browsers.
+    if (request.headers.value(HttpHeaders.USER_AGENT).contains('Mozilla')) {
+      // Request is coming from a browser but not Observatory application.
+      // Serve Observatory and let the Observatory make the real request.
+      return true;
+    }
+    // All other user agents are assumed to be textual.
+    return false;
+  }
 
   void _requestHandler(HttpRequest request) {
-    // Allow cross origin requests.
+    // Allow cross origin requests with 'observatory' header.
     request.response.headers.add('Access-Control-Allow-Origin', '*');
+    request.response.headers.add('Access-Control-Allow-Headers',
+                                 'Observatory-Version');
+
+    if (request.method != 'GET') {
+      // Not a GET request. Do nothing.
+      request.response.close();
+      return;
+    }
 
     final String path =
-          request.uri.path == '/' ? defaultPath : request.uri.path;
+          request.uri.path == '/' ? ROOT_REDIRECT_PATH : request.uri.path;
+
+    if (path == WEBSOCKET_PATH) {
+      WebSocketTransformer.upgrade(request).then((WebSocket webSocket) {
+        new WebSocketClient(webSocket, _service);
+      });
+      return;
+    }
 
     var resource = Resource.resources[path];
+    if (resource == null && _shouldServeObservatory(request)) {
+      resource = Resource.resources[ROOT_REDIRECT_PATH];
+      assert(resource != null);
+    }
     if (resource != null) {
       // Serving up a static resource (e.g. .css, .html, .png).
       request.response.headers.contentType =
@@ -105,31 +144,57 @@
       request.response.close();
       return;
     }
-
-    if (path == WEBSOCKET_PATH) {
-      WebSocketTransformer.upgrade(request).then((WebSocket webSocket) {
-        new WebSocketClient(webSocket, service);
-      });
-      return;
-    }
-
     var message = new Message.fromUri(request.uri);
-    var client = new HttpRequestClient(request, service);
+    var client = new HttpRequestClient(request, _service);
     client.onMessage(null, message);
   }
 
-  Future startServer() {
-    return HttpServer.bind(ip, port).then((s) {
-      // Only display message when port is automatically selected.
-      var display_message = (ip != '127.0.0.1' || port != 8181);
-      // Retrieve port.
-      port = s.port;
+  Future startup() {
+    if (_server != null) {
+      // Already running.
+      return new Future.value(this);
+    }
+
+    // Startup HTTP server.
+    return HttpServer.bind(_ip, _port).then((s) {
       _server = s;
       _server.listen(_requestHandler);
-      if (display_message) {
+      if (_displayMessages) {
+        var ip = _server.address.address.toString();
+        var port = _server.port.toString();
         print('Observatory listening on http://$ip:$port');
       }
-      return s;
+      // Server is up and running.
+      return this;
+    }).catchError((e, st) {
+      print('Could not start Observatory HTTP server:\n$e\n$st\n');
+      return this;
     });
   }
+
+  Future shutdown(bool forced) {
+    if (_server == null) {
+      // Not started.
+      return new Future.value(this);
+    }
+
+    // Force displaying of status messages if we are forcibly shutdown.
+    _displayMessages = _displayMessages || forced;
+
+    // Shutdown HTTP server and subscription.
+    var ip = _server.address.address.toString();
+    var port = _server.port.toString();
+    return _server.close(force: forced).then((_) {
+      if (_displayMessages) {
+        print('Observatory no longer listening on http://$ip:$port');
+      }
+      _server = null;
+      return this;
+    }).catchError((e, st) {
+      _server = null;
+      print('Could not shutdown Observatory HTTP server:\n$e\n$st\n');
+      return this;
+    });
+  }
+
 }
diff --git a/runtime/bin/vmservice/vmservice_io.dart b/runtime/bin/vmservice/vmservice_io.dart
index d0bccea..399b941 100644
--- a/runtime/bin/vmservice/vmservice_io.dart
+++ b/runtime/bin/vmservice/vmservice_io.dart
@@ -8,6 +8,7 @@
 import 'dart:convert';
 import 'dart:io';
 import 'dart:isolate';
+import 'dart:mirrors';
 import 'dart:vmservice';
 
 part 'resources.dart';
@@ -16,14 +17,62 @@
 // The TCP ip/port that the HTTP server listens on.
 int _port;
 String _ip;
+// Should the HTTP server auto start?
+bool _autoStart;
+
+bool _isWindows = false;
+
+// HTTP servr.
+Server server;
+Future<Server> serverFuture;
 
 // The VM service instance.
 VMService service;
 
+void _onSignal(ProcessSignal signal) {
+  if (serverFuture != null) {
+    // Still waiting.
+    return;
+  }
+  // Toggle HTTP server.
+  if (server.running) {
+    serverFuture = server.shutdown(true).then((_) {
+      serverFuture = null;
+    });
+  } else {
+    serverFuture = server.startup().then((_) {
+      serverFuture = null;
+    });
+  }
+}
+
+void registerSignalHandler() {
+  if (_isWindows) {
+    // Cannot register for signals on Windows.
+    return;
+  }
+  bool useSIGQUIT = true;
+  // Listen for SIGQUIT.
+  if (useSIGQUIT) {
+    var io = currentMirrorSystem().findLibrary(const Symbol('dart.io'));
+    var c = MirrorSystem.getSymbol('_ProcessUtils', io);
+    var m = MirrorSystem.getSymbol('_watchSignalInternal', io);
+    var processUtils = io.declarations[c];
+    processUtils.invoke(m, [ProcessSignal.SIGQUIT]).reflectee.listen(_onSignal);
+  } else {
+    ProcessSignal.SIGUSR1.watch().listen(_onSignal);
+  }
+}
+
+
 main() {
   // Get VMService.
   service = new VMService();
   // Start HTTP server.
-  var server = new Server(service, _ip, _port);
-  server.startServer();
+  server = new Server(service, _ip, _port);
+  if (_autoStart) {
+    server.startup();
+  }
+
+  registerSignalHandler();
 }
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index 5268a89..32edb0c 100644
--- a/runtime/bin/vmservice_impl.cc
+++ b/runtime/bin/vmservice_impl.cc
@@ -130,7 +130,29 @@
   library = Dart_RootLibrary();
   // Set requested TCP port.
   DartUtils::SetStringField(library, "_ip", server_ip);
+  // If we have a port specified, start the server immediately.
+  bool auto_start = server_port >= 0;
+  if (server_port < 0) {
+    // Adjust server_port to port 0 which will result in the first available
+    // port when the HTTP server is started.
+    server_port = 0;
+  }
+  // Set initial state.
   DartUtils::SetIntegerField(library, "_port", server_port);
+  Dart_SetField(library,
+                DartUtils::NewString("_autoStart"),
+                Dart_NewBoolean(auto_start));
+  // We cannot register for signals on windows.
+#if defined(TARGET_OS_WINDOWS)
+  const bool is_windows = true;
+#else
+  const bool is_windows = false;
+#endif
+  Dart_SetField(library,
+                DartUtils::NewString("_isWindows"),
+                Dart_NewBoolean(is_windows));
+
+  // Invoke main.
   result = Dart_Invoke(library, DartUtils::NewString("main"), 0, NULL);
   SHUTDOWN_ON_ERROR(result);
   // Load resources.
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index c7fd018..3ad647a 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -2006,6 +2006,22 @@
 DART_EXPORT Dart_Handle Dart_Allocate(Dart_Handle type);
 
 /**
+ * Allocate a new object without invoking a constructor, and sets specified
+ *  native fields.
+ *
+ * \param type The type of an object to be allocated.
+ * \param num_native_fields The number of native fields to set.
+ * \param native_fields An array containing the value of native fields.
+ *
+ * \return The new object. If an error occurs during execution, then an
+ *   error handle is returned.
+ */
+DART_EXPORT Dart_Handle Dart_AllocateWithNativeFields(
+    Dart_Handle type,
+    intptr_t num_native_fields,
+    const intptr_t* native_fields);
+
+/**
  * Invokes a method or function.
  *
  * The 'target' parameter may be an object, type, or library.  If
@@ -2049,7 +2065,7 @@
 
 /**
  * Invokes a Generative Constructor on an object that was previously
- * allocated using Dart_Allocate.
+ * allocated using Dart_Allocate/Dart_AllocateWithNativeFields.
  *
  * The 'target' parameter must be an object.
  *
@@ -2645,6 +2661,18 @@
                                               Dart_Handle patch_source);
 
 
+/**
+ * Indicates that all outstanding load requests have been satisfied,
+ * finalizing classes and completing deferred library futures.
+ *
+ * Requires there to be a current isolate.
+ *
+ * \return Success if all deferred library futures are completed.
+ *   Otherwise, returns an error.
+ */
+DART_EXPORT Dart_Handle Dart_FinalizeLoading();
+
+
 /*
  * =====
  * Peers
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index dd3e03f..60c2b6a 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -5,7 +5,6 @@
 
 // TODO(srdjan): Use shared array implementation.
 class _List<E> implements List<E> {
-  static final int _classId = (new _List(0))._cid;
 
   factory _List(length) native "List_allocate";
 
@@ -68,7 +67,7 @@
     int length = end - start;
     if (length == 0) return;
 
-    if (iterable is _List) {
+    if (ClassID.getID(iterable) == ClassID.cidOneByteString) {
       _copyFromObjectArray(iterable, skipCount, start, length);
     } else {
       if (iterable is List) {
@@ -271,7 +270,6 @@
 // implementation (checks when modifying). We should keep watching
 // the inline cache misses.
 class _ImmutableList<E> implements List<E> {
-  static final int _classId = (const [])._cid;
 
   factory _ImmutableList._uninstantiable() {
     throw new UnsupportedError(
diff --git a/runtime/lib/class_id.cc b/runtime/lib/class_id.cc
new file mode 100644
index 0000000..2f99138
--- /dev/null
+++ b/runtime/lib/class_id.cc
@@ -0,0 +1,16 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "platform/assert.h"
+#include "vm/bootstrap_natives.h"
+
+namespace dart {
+
+DEFINE_NATIVE_ENTRY(ClassID_getID, 1) {
+  const Instance& instance =
+      Instance::CheckedHandle(isolate, arguments->NativeArgAt(0));
+  return Smi::New(instance.GetClassId());
+}
+
+}  // namespace dart
diff --git a/runtime/lib/class_id.dart b/runtime/lib/class_id.dart
new file mode 100644
index 0000000..7ae813d
--- /dev/null
+++ b/runtime/lib/class_id.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class ClassID {
+  static int getID(Object value) native "ClassID_getID";
+}
\ No newline at end of file
diff --git a/runtime/lib/collection_patch.dart b/runtime/lib/collection_patch.dart
index e0fd182..e0bde4a 100644
--- a/runtime/lib/collection_patch.dart
+++ b/runtime/lib/collection_patch.dart
@@ -776,8 +776,8 @@
   final _HashSet _set;
   final int _modificationCount;
   int _index = 0;
-  _HashSetEntry _next = null;
-  E _current = null;
+  _HashSetEntry _next;
+  E _current;
 
   _HashSetIterator(_HashSet hashSet)
       : _set = hashSet, _modificationCount = hashSet._modificationCount;
@@ -851,7 +851,6 @@
   int _modificationCount;
   _LinkedHashMapIterator(LinkedHashMap map)
       : _map = map,
-        _current = null,
         _next = map._nextEntry,
         _modificationCount = map._modificationCount;
 
diff --git a/runtime/lib/double_patch.dart b/runtime/lib/double_patch.dart
index 9e2abeb..d036725 100644
--- a/runtime/lib/double_patch.dart
+++ b/runtime/lib/double_patch.dart
@@ -14,11 +14,12 @@
 
     if (str.length == 0) return null;
 
-    final ccid = str._cid;
+    final ccid = ClassID.getID(str);
     _OneByteString oneByteString;
-    // TODO(floitsch): Allow _ExternalOneByteStrings. As of May 2013 they don't
-    // have any _classId.
-    if (ccid != _OneByteString._classId) {
+    // TODO(Srdjan): Allow _ExternalOneByteStrings.
+    if (ccid == ClassID.cidOneByteString) {
+      oneByteString = str;
+    } else {
       int length = str.length;
       var s = _OneByteString._allocate(length);
       for (int i = 0; i < length; i++) {
@@ -31,8 +32,6 @@
         }
       }
       oneByteString = s;
-    } else {
-      oneByteString = str;
     }
 
     return _native_parse(oneByteString);
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index 520c9a9..3dc0e54 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:mirrors' show MirrorSystem;
+
 patch class Error {
   /* patch */ static String _objectToString(Object object) {
     return Object._toString(object);
@@ -216,7 +218,7 @@
     var args_message = args_mismatch ? " with matching arguments" : "";
     var msg;
     var memberName =
-        (_memberName == null) ? "" : internal.Symbol.getName(_memberName);
+        (_memberName == null) ? "" : MirrorSystem.getName(_memberName);
 
     if (type == _InvocationMirror._LOCAL_VAR) {
       return "cannot assign to final variable '$memberName'.\n\n";
@@ -280,7 +282,7 @@
         if (i > 0) {
           actual_buf.write(", ");
         }
-        actual_buf.write(internal.Symbol.getName(key));
+        actual_buf.write(MirrorSystem.getName(key));
         actual_buf.write(": ");
         actual_buf.write(Error.safeToString(value));
         i++;
@@ -297,7 +299,7 @@
       receiver_str = Error.safeToString(_receiver);
     }
     var memberName =
-        (_memberName == null) ? "" : internal.Symbol.getName(_memberName);
+        (_memberName == null) ? "" : MirrorSystem.getName(_memberName);
     var type = _invocation_type & _InvocationMirror._TYPE_MASK;
     if (type == _InvocationMirror._LOCAL_VAR) {
       msg_buf.write(
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index 86791ef..aae3197 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -3,10 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class _GrowableList<T> implements List<T> {
-  static final int _classId = (new _GrowableList(0))._cid;
 
   void insert(int index, T element) {
-    if (index < 0 || index > length) {
+    if ((index < 0) || (index > length)) {
       throw new RangeError.range(index, 0, length);
     }
     if (index == this.length) {
@@ -110,8 +109,10 @@
     return list;
   }
 
+  static const int _kDefaultCapacity = 2;
+
   factory _GrowableList(int length) {
-    var data = new _List((length == 0) ? 4 : length);
+    var data = new _List((length == 0) ? _kDefaultCapacity : length);
     var result = new _GrowableList<T>.withData(data);
     if (length > 0) {
       result._setLength(length);
@@ -120,7 +121,7 @@
   }
 
   factory _GrowableList.withCapacity(int capacity) {
-    var data = new _List((capacity == 0)? 4 : capacity);
+    var data = new _List((capacity == 0)? _kDefaultCapacity : capacity);
     return new _GrowableList<T>.withData(data);
   }
 
diff --git a/runtime/lib/identical.cc b/runtime/lib/identical.cc
index dac63b5..6440726 100644
--- a/runtime/lib/identical.cc
+++ b/runtime/lib/identical.cc
@@ -5,13 +5,50 @@
 #include "vm/bootstrap_natives.h"
 
 #include "vm/object.h"
+#include "vm/report.h"
 
 namespace dart {
 
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
+
 DEFINE_NATIVE_ENTRY(Identical_comparison, 2) {
   GET_NATIVE_ARGUMENT(Instance, a, arguments->NativeArgAt(0));
   GET_NATIVE_ARGUMENT(Instance, b, arguments->NativeArgAt(1));
-  return Bool::Get(a.IsIdenticalTo(b)).raw();
+  const bool is_identical = a.IsIdenticalTo(b);
+  if (FLAG_warn_on_javascript_compatibility) {
+    if (!is_identical) {
+      if (a.IsString()) {
+        if (String::Cast(a).Equals(b)) {
+          Report::JSWarningFromNative(
+              true,  // Identical_comparison is static.
+              "strings that are equal are also identical");
+        }
+      } else if (a.IsInteger()) {
+        if (b.IsDouble()) {
+          const int64_t a_value = Integer::Cast(a).AsInt64Value();
+          const double b_value = Double::Cast(b).value();
+          if (a_value == floor(b_value)) {
+            Report::JSWarningFromNative(
+                true,  // Identical_comparison is static.
+                "integer value and integral double value that are equal "
+                "are also identical");
+          }
+        }
+      } else if (a.IsDouble()) {
+        if (b.IsInteger()) {
+          const double a_value = Double::Cast(a).value();
+          const int64_t b_value = Integer::Cast(b).AsInt64Value();
+          if (floor(a_value) == b_value) {
+            Report::JSWarningFromNative(
+                true,  // Identical_comparison is static.
+                "integral double value and integer value that are equal "
+                "are also identical");
+          }
+        }
+      }
+    }
+  }
+  return Bool::Get(is_identical).raw();
 }
 
 }  // namespace dart
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index a0397d5..c1893d2 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -32,7 +32,7 @@
   }
   if (i.IsMint()) {
     const Mint& mint = Mint::Cast(i);
-    return !Smi::IsValid64(mint.value());
+    return !Smi::IsValid(mint.value());
   }
   return true;
 }
@@ -322,7 +322,7 @@
     // Shift count is too large..
     const Instance& exception =
         Instance::Handle(isolate->object_store()->out_of_memory());
-    Exceptions::Throw(exception);
+    Exceptions::Throw(isolate, exception);
   }
   const Smi& smi_shift_count = Smi::Cast(shift_count);
   const Integer& shift_result = Integer::Handle(
@@ -414,7 +414,7 @@
   // into dart code or allocating any code.
   const Instance& exception =
       Instance::Handle(isolate->object_store()->out_of_memory());
-  Exceptions::Throw(exception);
+  Exceptions::Throw(isolate, exception);
   UNREACHABLE();
   return 0;
 }
@@ -442,7 +442,7 @@
   // into dart code or allocating any code.
   const Instance& exception =
       Instance::Handle(isolate->object_store()->out_of_memory());
-  Exceptions::Throw(exception);
+  Exceptions::Throw(isolate, exception);
   UNREACHABLE();
   return 0;
 }
diff --git a/runtime/lib/internal_sources.gypi b/runtime/lib/internal_sources.gypi
index 66fdf9d..08d9bb7 100644
--- a/runtime/lib/internal_sources.gypi
+++ b/runtime/lib/internal_sources.gypi
@@ -8,6 +8,8 @@
   'sources': [
     'internal_patch.dart',
     # The above file needs to be first as it imports required libraries.
+    'class_id.dart',
+    'class_id.cc',
     'print_patch.dart',
     'symbol_patch.dart',
   ],
diff --git a/runtime/lib/lib_prefix.dart b/runtime/lib/lib_prefix.dart
index b1cac38..536cc5c 100644
--- a/runtime/lib/lib_prefix.dart
+++ b/runtime/lib/lib_prefix.dart
@@ -6,19 +6,47 @@
 import "dart:isolate";
 
 // This type corresponds to the VM-internal class LibraryPrefix.
-
 class _LibraryPrefix {
-  _load() native "LibraryPrefix_load";
+
+  bool _load() native "LibraryPrefix_load";
+
+  bool _invalidateDependentCode()
+      native "LibraryPrefix_invalidateDependentCode";
 
   loadLibrary() {
-    var completer = new Completer<bool>();
-    var port = new RawReceivePort();
-    port.handler = (_) {
-      this._load();
-      completer.complete(true);
-      port.close();
-    };
-    port.sendPort.send(1);
+    var completer = _outstandingLoadRequests[this];
+    if (completer != null) {
+      return completer.future;
+    }
+    completer = new Completer<bool>();
+    _outstandingLoadRequests[this] = completer;
+    Timer.run(() {
+      var hasCompleted = this._load();
+      // Loading can complete immediately, for example when the same
+      // library has been loaded eagerly or through another deferred
+      // prefix. If that is the case, we must invalidate the dependent
+      // code and complete the future now since there will be no callback
+      // from the VM.
+      if (hasCompleted) {
+        _invalidateDependentCode();
+        completer.complete(true);
+        _outstandingLoadRequests.remove(this);
+      }
+    });
     return completer.future;
   }
 }
+
+var _outstandingLoadRequests = new Map<_LibraryPrefix, Completer>();
+
+
+// Called from the VM when all outstanding load requests have
+// finished.
+_completeDeferredLoads() {
+  var lenghth = _outstandingLoadRequests;
+  _outstandingLoadRequests.forEach((prefix, completer) {
+    prefix._invalidateDependentCode();
+    completer.complete(true);
+  });
+  _outstandingLoadRequests.clear();
+}
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 1e66b82..f39effa 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -65,6 +65,7 @@
 static void ThrowNoSuchMethod(const Instance& receiver,
                               const String& function_name,
                               const Function& function,
+                              const Array& arguments,
                               const InvocationMirror::Call call,
                               const InvocationMirror::Type type) {
   const Smi& invocation_type = Smi::Handle(Smi::New(
@@ -74,10 +75,8 @@
   args.SetAt(0, receiver);
   args.SetAt(1, function_name);
   args.SetAt(2, invocation_type);
-  // Parameter 3 (actual arguments): We omit this parameter to get the same
-  // error message as one would get by invoking the function non-reflectively.
-  // Parameter 4 (named arguments): We omit this parameters since we cannot
-  // invoke functions with named parameters reflectively (using mirrors).
+  args.SetAt(3, arguments);
+  // TODO(rmacnak): Argument 4 (attempted argument names).
   if (!function.IsNull()) {
     const intptr_t total_num_parameters = function.NumParameters();
     const Array& array = Array::Handle(Array::New(total_num_parameters));
@@ -385,7 +384,7 @@
   str = lib.name();
   args.SetAt(1, str);
   str = lib.url();
-  if (str.Equals("dart:builtin") || str.Equals("dart:_blink")) {
+  if (str.Equals("dart:_builtin") || str.Equals("dart:_blink")) {
     // Censored library (grumble).
     return Instance::null();
   }
@@ -677,6 +676,7 @@
     ThrowNoSuchMethod(Instance::null_instance(),
                       getter_name,
                       getter,
+                      Object::null_array(),
                       InvocationMirror::kTopLevel,
                       InvocationMirror::kGetter);
     UNREACHABLE();
@@ -714,6 +714,7 @@
         ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
                           getter_name,
                           getter,
+                          Object::null_array(),
                           InvocationMirror::kStatic,
                           InvocationMirror::kGetter);
         UNREACHABLE();
@@ -1443,6 +1444,7 @@
     ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
                       function_name,
                       function,
+                      Object::null_array(),
                       InvocationMirror::kStatic,
                       InvocationMirror::kMethod);
     UNREACHABLE();
@@ -1481,26 +1483,27 @@
   // Check for real fields and user-defined setters.
   const Field& field = Field::Handle(klass.LookupStaticField(setter_name));
   Function& setter = Function::Handle();
-  if (field.IsNull()) {
-    const String& internal_setter_name = String::Handle(
+  const String& internal_setter_name = String::Handle(
       Field::SetterName(setter_name));
 
+  if (field.IsNull()) {
     setter = klass.LookupStaticFunction(internal_setter_name);
 
+    const int kNumArgs = 1;
+    const Array& args = Array::Handle(Array::New(kNumArgs));
+    args.SetAt(0, value);
+
     if (setter.IsNull() || !setter.is_visible()) {
       ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
-                        setter_name,
+                        internal_setter_name,
                         setter,
+                        args,
                         InvocationMirror::kStatic,
                         InvocationMirror::kSetter);
       UNREACHABLE();
     }
 
     // Invoke the setter and return the result.
-    const int kNumArgs = 1;
-    const Array& args = Array::Handle(Array::New(kNumArgs));
-    args.SetAt(0, value);
-
     Object& result = Object::Handle(
         DartEntry::InvokeFunction(setter, args));
     if (result.IsError()) {
@@ -1512,8 +1515,9 @@
 
   if (field.is_final()) {
     ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
-                      setter_name,
+                      internal_setter_name,
                       setter,
+                      Object::null_array(),
                       InvocationMirror::kStatic,
                       InvocationMirror::kSetter);
     UNREACHABLE();
@@ -1557,6 +1561,7 @@
     ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
                       internal_constructor_name,
                       lookup_constructor,
+                      Object::null_array(),
                       InvocationMirror::kConstructor,
                       InvocationMirror::kMethod);
     UNREACHABLE();
@@ -1634,6 +1639,7 @@
     ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
                       internal_constructor_name,
                       redirected_constructor,
+                      Object::null_array(),
                       InvocationMirror::kConstructor,
                       InvocationMirror::kMethod);
     UNREACHABLE();
@@ -1696,26 +1702,28 @@
   if (function.IsNull()) {
     // Didn't find a method: try to find a getter and invoke call on its result.
     const Instance& getter_result =
-        Instance::Handle(InvokeLibraryGetter(library, function_name, true));
-    // Make room for the closure (receiver) in arguments.
-    intptr_t numArgs = args.Length();
-    const Array& call_args = Array::Handle(Array::New(numArgs + 1));
-    Object& temp = Object::Handle();
-    for (int i = 0; i < numArgs; i++) {
-      temp = args.At(i);
-      call_args.SetAt(i + 1, temp);
+        Instance::Handle(InvokeLibraryGetter(library, function_name, false));
+    if (getter_result.raw() != Object::sentinel().raw()) {
+      // Make room for the closure (receiver) in arguments.
+      intptr_t numArgs = args.Length();
+      const Array& call_args = Array::Handle(Array::New(numArgs + 1));
+      Object& temp = Object::Handle();
+      for (int i = 0; i < numArgs; i++) {
+        temp = args.At(i);
+        call_args.SetAt(i + 1, temp);
+      }
+      call_args.SetAt(0, getter_result);
+      const Array& call_args_descriptor_array = Array::Handle(
+          ArgumentsDescriptor::New(call_args.Length(), arg_names));
+      // Call closure.
+      const Object& call_result = Object::Handle(
+          DartEntry::InvokeClosure(call_args, call_args_descriptor_array));
+      if (call_result.IsError()) {
+        ThrowInvokeError(Error::Cast(call_result));
+        UNREACHABLE();
+      }
+      return call_result.raw();
     }
-    call_args.SetAt(0, getter_result);
-    const Array& call_args_descriptor_array =
-      Array::Handle(ArgumentsDescriptor::New(call_args.Length(), arg_names));
-    // Call closure.
-    const Object& call_result = Object::Handle(
-        DartEntry::InvokeClosure(call_args, call_args_descriptor_array));
-    if (call_result.IsError()) {
-      ThrowInvokeError(Error::Cast(call_result));
-      UNREACHABLE();
-    }
-    return call_result.raw();
   }
 
   const Array& args_descriptor_array =
@@ -1728,6 +1736,7 @@
     ThrowNoSuchMethod(Instance::null_instance(),
                       function_name,
                       function,
+                      Object::null_array(),
                       InvocationMirror::kTopLevel,
                       InvocationMirror::kMethod);
     UNREACHABLE();
@@ -1769,25 +1778,27 @@
   const Field& field = Field::Handle(
       library.LookupLocalField(setter_name));
   Function& setter = Function::Handle();
+  const String& internal_setter_name =
+      String::Handle(Field::SetterName(setter_name));
 
   if (field.IsNull()) {
-    const String& internal_setter_name =
-        String::Handle(Field::SetterName(setter_name));
-
     setter = library.LookupLocalFunction(internal_setter_name);
+
+    const int kNumArgs = 1;
+    const Array& args = Array::Handle(Array::New(kNumArgs));
+    args.SetAt(0, value);
+
     if (setter.IsNull() || !setter.is_visible()) {
       ThrowNoSuchMethod(Instance::null_instance(),
-                        setter_name,
+                        internal_setter_name,
                         setter,
+                        args,
                         InvocationMirror::kTopLevel,
                         InvocationMirror::kSetter);
       UNREACHABLE();
     }
 
     // Invoke the setter and return the result.
-    const int kNumArgs = 1;
-    const Array& args = Array::Handle(Array::New(kNumArgs));
-    args.SetAt(0, value);
     const Object& result = Object::Handle(
         DartEntry::InvokeFunction(setter, args));
     if (result.IsError()) {
@@ -1799,8 +1810,9 @@
 
   if (field.is_final()) {
     ThrowNoSuchMethod(Instance::null_instance(),
-                      setter_name,
+                      internal_setter_name,
                       setter,
+                      Object::null_array(),
                       InvocationMirror::kTopLevel,
                       InvocationMirror::kSetter);
     UNREACHABLE();
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index b1206cd..13bb7a9 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -4,7 +4,8 @@
 
 // VM-specific implementation of the dart:mirrors library.
 
-import "dart:collection";
+import "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
+import "dart:_internal" show LRUMap;
 
 final emptyList = new UnmodifiableListView([]);
 final emptyMap = new UnmodifiableMapView({});
@@ -298,21 +299,15 @@
     return identityHashCode(_reflectee) ^ 0x36363636;
   }
 
-  // TODO(18445): Use an LRU cache.
-  static var _getFieldClosures = new HashMap();
-  static var _setFieldClosures = new HashMap();
-  static var _getFieldCallCounts = new HashMap();
-  static var _setFieldCallCounts = new HashMap();
+  static var _getFieldClosures = new LRUMap.withShift(7);
+  static var _setFieldClosures = new LRUMap.withShift(7);
+  static var _getFieldCallCounts = new LRUMap.withShift(8);
+  static var _setFieldCallCounts = new LRUMap.withShift(8);
   static const _closureThreshold = 20;
-  static const _cacheSizeLimit = 255;
 
   _getFieldSlow(unwrapped) {
     // Slow path factored out to give the fast path a better chance at being
     // inlined.
-    if (_getFieldCallCounts.length == 2 * _cacheSizeLimit) {
-      // Prevent unbounded cache growth.
-      _getFieldCallCounts = new HashMap();
-    }
     var callCount = _getFieldCallCounts[unwrapped];
     if (callCount == null) {
       callCount = 0;
@@ -331,12 +326,7 @@
         var privateKey = unwrapped.substring(atPosition);
         f = _eval('(x) => x.$withoutKey', privateKey);
       }
-      if (_getFieldClosures.length == _cacheSizeLimit) {
-        // Prevent unbounded cache growth.
-        _getFieldClosures = new HashMap();
-      }
       _getFieldClosures[unwrapped] = f;
-      _getFieldCallCounts.remove(unwrapped);  // We won't look for this again.
       return reflect(f(_reflectee));
     }
     var result = reflect(_invokeGetter(_reflectee, unwrapped));
@@ -355,9 +345,6 @@
   _setFieldSlow(unwrapped, arg) {
     // Slow path factored out to give the fast path a better chance at being
     // inlined.
-    if (_setFieldCallCounts.length == 2 * _cacheSizeLimit) {
-      _setFieldCallCounts = new HashMap();
-    }
     var callCount = _setFieldCallCounts[unwrapped];
     if (callCount == null) {
       callCount = 0;
@@ -376,12 +363,7 @@
         var privateKey = unwrapped.substring(atPosition);
         f = _eval('(x, v) => x.$withoutKey = v', privateKey);
       }
-      if (_setFieldClosures.length == _cacheSizeLimit) {
-        // Prevent unbounded cache growth.
-        _setFieldClosures = new HashMap();
-      }
       _setFieldClosures[unwrapped] = f;
-      _setFieldCallCounts.remove(unwrapped);
       return reflect(f(_reflectee, arg));
     }
     _invokeSetter(_reflectee, unwrapped, arg);
diff --git a/runtime/lib/mirrors_patch.dart b/runtime/lib/mirrors_patch.dart
index 1534e79..b3eaf9a 100644
--- a/runtime/lib/mirrors_patch.dart
+++ b/runtime/lib/mirrors_patch.dart
@@ -67,7 +67,7 @@
       // Drop 'get:' or 'set:' prefix.
       pos = 4;
       if (string[0] == 's') {
-        add_setter_suffix;
+        add_setter_suffix = true;
       }
     }
     // Skip everything between AT and PERIOD, SPACE, COMMA or END
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index c84c972..c58c394 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -10,6 +10,7 @@
 #include "vm/heap.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
+#include "vm/report.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
 
@@ -27,12 +28,6 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(Object_cid, 1) {
-  const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0));
-  return Smi::New(instance.GetClassId());
-}
-
-
 DEFINE_NATIVE_ENTRY(Object_getHash, 1) {
   const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0));
   Heap* heap = isolate->heap();
@@ -111,26 +106,6 @@
 }
 
 
-static void JSWarning(const char* msg) {
-  DartFrameIterator iterator;
-  iterator.NextFrame();  // Skip native call.
-  StackFrame* caller_frame = iterator.NextFrame();
-  ASSERT(caller_frame != NULL);
-  const Code& caller_code = Code::Handle(caller_frame->LookupDartCode());
-  ASSERT(!caller_code.IsNull());
-  const uword caller_pc = caller_frame->pc();
-  // Assume an instance call.
-  ICData& ic_data = ICData::Handle();
-  CodePatcher::GetInstanceCallAt(caller_pc, caller_code, &ic_data);
-  ASSERT(!ic_data.IsNull());
-  // Report warning only if not already reported at this location.
-  if (!ic_data.IssuedJSWarning()) {
-    ic_data.SetIssuedJSWarning();
-    Exceptions::JSWarning(caller_frame, "%s", msg);
-  }
-}
-
-
 static void WarnOnJSIntegralNumTypeTest(
     const Instance& instance,
     const TypeArguments& instantiator_type_arguments,
@@ -148,14 +123,18 @@
     if (instantiated_type.IsIntType()) {
       const double value = Double::Cast(instance).value();
       if (floor(value) == value) {
-        JSWarning("integral value of type 'double' is also considered to be "
-                  "of type 'int'");
+        Report::JSWarningFromNative(
+            false,  // Object_instanceOf and Object_as are not static calls.
+            "integral value of type 'double' is also considered to be "
+            "of type 'int'");
       }
     }
   } else {
     ASSERT(instance_is_int);
     if (instantiated_type.IsDoubleType()) {
-      JSWarning("integer value is also considered to be of type 'double'");
+      Report::JSWarningFromNative(
+          false,  // Object_instanceOf and Object_as are not static calls.
+          "integer value is also considered to be of type 'double'");
     }
   }
 }
@@ -296,11 +275,19 @@
 }
 
 
+DEFINE_NATIVE_ENTRY(LibraryPrefix_invalidateDependentCode, 1) {
+  const LibraryPrefix& prefix =
+      LibraryPrefix::CheckedHandle(arguments->NativeArgAt(0));
+  prefix.InvalidateDependentCode();
+  return Bool::Get(true).raw();
+}
+
+
 DEFINE_NATIVE_ENTRY(LibraryPrefix_load, 1) {
   const LibraryPrefix& prefix =
       LibraryPrefix::CheckedHandle(arguments->NativeArgAt(0));
-  prefix.LoadLibrary();
-  return Bool::Get(true).raw();
+  bool hasCompleted = prefix.LoadLibrary();
+  return Bool::Get(hasCompleted).raw();
 }
 
 }  // namespace dart
diff --git a/runtime/lib/object_patch.dart b/runtime/lib/object_patch.dart
index fa8e10e..52d7546 100644
--- a/runtime/lib/object_patch.dart
+++ b/runtime/lib/object_patch.dart
@@ -71,8 +71,6 @@
     return result;
   }
 
-  int get _cid native "Object_cid";
-
   _leftShiftWithMask32(count, mask)  {
     return (this << count) & mask;
   }
diff --git a/runtime/lib/stopwatch_patch.dart b/runtime/lib/stopwatch_patch.dart
index 2bdc2c5..e16005c 100644
--- a/runtime/lib/stopwatch_patch.dart
+++ b/runtime/lib/stopwatch_patch.dart
@@ -5,9 +5,15 @@
 // A VM patch of the stopwatch part of dart:core.
 
 patch class Stopwatch {
+  /* patch */ static void _initTicker() {
+    if (_frequency == null) {
+      _frequency = _computeFrequency();
+    }
+  }
+
   // Returns the current clock tick.
   /* patch */ static int _now() native "Stopwatch_now";
 
   // Returns the frequency of clock ticks in Hz.
-  /* patch */ static int _frequency() native "Stopwatch_frequency";
+  static int _computeFrequency() native "Stopwatch_frequency";
 }
diff --git a/runtime/lib/string_buffer_patch.dart b/runtime/lib/string_buffer_patch.dart
index 5d8b9b4..a952f8a 100644
--- a/runtime/lib/string_buffer_patch.dart
+++ b/runtime/lib/string_buffer_patch.dart
@@ -11,7 +11,7 @@
    * When strings are written to the string buffer, we add them to a
    * list of string parts.
    */
-  List<String> _parts = null;
+  List<String> _parts;
 
   /**
     * Total number of code units in the string parts. Does not include
@@ -34,7 +34,7 @@
    * used when writing short strings or individual char codes to the
    * buffer. The buffer is allocated on demand.
    */
-  Uint16List _buffer = null;
+  Uint16List _buffer;
   int _bufferPosition = 0;
 
   /**
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index a81767d..bc9b4d8 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -54,11 +54,11 @@
   static String createFromCharCodes(Iterable<int> charCodes) {
     if (charCodes != null) {
       // TODO(srdjan): Also skip copying of wide typed arrays.
-      final ccid = charCodes._cid;
+      final ccid = ClassID.getID(charCodes);
       bool isOneByteString = false;
-      if ((ccid != _List._classId) &&
-          (ccid != _GrowableList._classId) &&
-          (ccid != _ImmutableList._classId)) {
+      if ((ccid != ClassID.cidArray) &&
+          (ccid != ClassID.cidGrowableObjectArray) &&
+          (ccid != ClassID.cidImmutableArray)) {
         if ((charCodes is Uint8List) || (charCodes is Int8List)) {
           isOneByteString = true;
         } else {
@@ -510,7 +510,7 @@
     int totalLength = 0;
     for (int i = 0; i < numValues; i++) {
       var s = values[i].toString();
-      if (isOneByteString && (s._cid == _OneByteString._classId)) {
+      if (isOneByteString && (ClassID.getID(s) == ClassID.cidOneByteString)) {
         totalLength += s.length;
       } else {
         isOneByteString = false;
@@ -625,7 +625,6 @@
 
 
 class _OneByteString extends _StringBase implements String {
-  static final int _classId = "A"._cid;
 
   factory _OneByteString._uninstantiable() {
     throw new UnsupportedError(
@@ -649,7 +648,8 @@
       native "OneByteString_splitWithCharCode";
 
   List<String> split(Pattern pattern) {
-    if ((pattern._cid == _OneByteString._classId) && (pattern.length == 1)) {
+    if ((ClassID.getID(pattern) == ClassID.cidOneByteString) &&
+        (pattern.length == 1)) {
       return _splitWithCharCode(pattern.codeUnitAt(0));
     }
     return super.split(pattern);
@@ -677,10 +677,10 @@
 
   int indexOf(Pattern pattern, [int start = 0]) {
     // Specialize for single character pattern.
-    final pCid = pattern._cid;
-    if ((pCid == _OneByteString._classId) ||
-        (pCid == _TwoByteString._classId) ||
-        (pCid == _ExternalOneByteString._classId)) {
+    final pCid = ClassID.getID(pattern);
+    if ((pCid == ClassID.cidOneByteString) ||
+        (pCid == ClassID.cidTwoByteString) ||
+        (pCid == ClassID.cidExternalOneByteString)) {
       final len = this.length;
       if ((pattern.length == 1) && (start >= 0) && (start < len)) {
         final patternCu0 = pattern.codeUnitAt(0);
@@ -699,10 +699,10 @@
   }
 
   bool contains(Pattern pattern, [int start = 0]) {
-    final pCid = pattern._cid;
-    if ((pCid == _OneByteString._classId) ||
-        (pCid == _TwoByteString._classId) ||
-        (pCid == _ExternalOneByteString._classId)) {
+    final pCid = ClassID.getID(pattern);
+    if ((pCid == ClassID.cidOneByteString) ||
+        (pCid == ClassID.cidTwoByteString) ||
+        (pCid == ClassID.cidExternalOneByteString)) {
       final len = this.length;
       if ((pattern.length == 1) && (start >= 0) && (start < len)) {
         final patternCu0 = pattern.codeUnitAt(0);
@@ -736,9 +736,9 @@
   }
 
   String padLeft(int width, [String padding = ' ']) {
-    int padCid = padding._cid;
-    if (padCid != _OneByteString._classId &&
-        padCid != _ExternalOneByteString._classId) {
+    int padCid = ClassID.getID(padding);
+    if ((padCid != ClassID.cidOneByteString) &&
+        (padCid != ClassID.cidExternalOneByteString)) {
       return super.padLeft(width, padding);
     }
     int length = this.length;
@@ -767,9 +767,9 @@
   }
 
   String padRight(int width, [String padding = ' ']) {
-    int padCid = padding._cid;
-    if (padCid != _OneByteString._classId &&
-        padCid != _ExternalOneByteString._classId) {
+    int padCid = ClassID.getID(padding);
+    if ((padCid != ClassID.cidOneByteString) &&
+        (padCid != ClassID.cidExternalOneByteString)) {
       return super.padRight(width, padding);
     }
     int length = this.length;
@@ -906,8 +906,6 @@
 
 
 class _TwoByteString extends _StringBase implements String {
-  static final int _classId = "\u{FFFF}"._cid;
-
   factory _TwoByteString._uninstantiable() {
     throw new UnsupportedError(
         "_TwoByteString can only be allocated by the VM");
@@ -924,8 +922,6 @@
 
 
 class _ExternalOneByteString extends _StringBase implements String {
-  static final int _classId = _getCid();
-
   factory _ExternalOneByteString._uninstantiable() {
     throw new UnsupportedError(
         "_ExternalOneByteString can only be allocated by the VM");
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index b184573..1920a76 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -299,7 +299,7 @@
 patch class ByteData {
   /* patch */ factory ByteData(int length) {
     var list = new _Uint8Array(length);
-    return new _ByteDataView(list.buffer, 0, length);
+    return new _ByteDataView(list, 0, length);
   }
 
   /* patch */ factory ByteData.view(ByteBuffer buffer,
@@ -307,7 +307,12 @@
     if (length == null) {
       length = buffer.lengthInBytes - offsetInBytes;
     }
-    return new _ByteDataView(buffer, offsetInBytes, length);
+    return new _ByteDataView(buffer._data, offsetInBytes, length);
+  }
+
+  // Called directly from C code.
+  factory ByteData._view(TypedData typedData, int offsetInBytes, int length) {
+    return new _ByteDataView(typedData, offsetInBytes, length);
   }
 }
 
@@ -551,12 +556,12 @@
         if ((count < 10) && (from.buffer != this.buffer)) {
           Lists.copy(from, skipCount, this, start, count);
           return;
-        } else if (this.buffer._setRange(
+        } else if (this.buffer._data._setRange(
               start * elementSizeInBytes + this.offsetInBytes,
               count * elementSizeInBytes,
-              from.buffer,
+              from.buffer._data,
               skipCount * elementSizeInBytes + from.offsetInBytes,
-              this._cid, from._cid)) {
+              ClassID.getID(this), ClassID.getID(from))) {
           return;
         }
       } else if (from.buffer == this.buffer) {
@@ -603,12 +608,23 @@
                  _TypedListBase from, int startFromInBytes,
                  int toCid, int fromCid)
       native "TypedData_setRange";
-
-  int get _cid native "Object_cid";
 }
 
 
-abstract class _TypedList extends _TypedListBase implements ByteBuffer {
+class _ByteBuffer implements ByteBuffer {
+  final _TypedList _data;
+
+  _ByteBuffer(this._data);
+
+  // Forward calls to _data.
+  int get lengthInBytes => _data.lengthInBytes;
+  int get hashCode => _data.hashCode;
+  bool operator==(Object other) =>
+      (other is _ByteBuffer) && identical(_data, other._data);
+}
+
+
+abstract class _TypedList extends _TypedListBase {
   // Default method implementing parts of the TypedData interface.
   int get offsetInBytes {
     return 0;
@@ -618,9 +634,7 @@
     return length * elementSizeInBytes;
   }
 
-  ByteBuffer get buffer {
-    return this;
-  }
+  ByteBuffer get buffer => new _ByteBuffer(this);
 
   // Methods implementing the collection interface.
 
@@ -2514,8 +2528,8 @@
 
 
 class _TypedListView extends _TypedListBase implements TypedData {
-  _TypedListView(ByteBuffer _buffer, int _offset, int _length)
-    : _typedData = _buffer,  // This assignment is type safe.
+  _TypedListView(_ByteBuffer _buffer, int _offset, int _length)
+    : _typedData = _buffer._data,
       offsetInBytes = _offset,
       length = _length {
   }
@@ -3263,11 +3277,11 @@
 
 
 class _ByteDataView implements ByteData {
-  _ByteDataView(ByteBuffer _buffer, int _offsetInBytes, int _lengthInBytes)
-    : _typedData = _buffer,  // _buffer is guaranteed to be a TypedData here.
+  _ByteDataView(TypedData typedData, int _offsetInBytes, int _lengthInBytes)
+    : _typedData = typedData,
       _offset = _offsetInBytes,
       length = _lengthInBytes {
-    _rangeCheck(_buffer.lengthInBytes, _offset, length);
+    _rangeCheck(_typedData.lengthInBytes, _offset, length);
   }
 
 
diff --git a/runtime/platform/assert.cc b/runtime/platform/assert.cc
index cb7d21a..5410046 100644
--- a/runtime/platform/assert.cc
+++ b/runtime/platform/assert.cc
@@ -30,6 +30,7 @@
   // Get the message from the string stream and dump it on stderr.
   std::string message = stream.str();
   fprintf(stderr, "%s", message.c_str());
+  fflush(stderr);
 
   // In case of failed assertions, abort right away. Otherwise, wait
   // until the program is exiting before producing a non-zero exit
diff --git a/runtime/platform/utils.h b/runtime/platform/utils.h
index f202562..52e30aa 100644
--- a/runtime/platform/utils.h
+++ b/runtime/platform/utils.h
@@ -171,6 +171,17 @@
            count <= (length - offset);
   }
 
+  static inline bool WillAddOverflow(int64_t a, int64_t b) {
+    return ((b > 0) && (a > (kMaxInt64 - b))) ||
+           ((b < 0) && (a < (kMinInt64 - b)));
+  }
+
+  static inline bool WillSubOverflow(int64_t a, int64_t b) {
+    return ((b > 0) && (a < (kMinInt64 + b))) ||
+           ((b < 0) && (a > (kMaxInt64 + b)));
+  }
+
+
   // Utility functions for converting values from host endianess to
   // big or little endian values.
   static uint16_t HostToBigEndian16(uint16_t host_value);
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index b88bad2..451e4c0 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -19,6 +19,10 @@
 [ $arch == x64 ]
 cc/IsolateInterrupt: Skip
 
+[ $mode == debug ]
+# This is a benchmark that is not informative in debug mode.
+cc/CorelibIsolateStartup: Skip
+
 # The following section refers to the dart vm tests which live under
 # runtime/tests/vm/dart.
 [ $system == windows ]
@@ -45,8 +49,9 @@
 cc/ThreadInterrupterLow: Skip
 cc/Service_Profile: Skip
 
-[ $arch == simmips && $arch == mips ]
-cc/Service_Coverage: Skip # Dart bug 16250
+[ $arch == simmips || $arch == mips ]
+cc/Coverage_MainWithClass: Skip # Dart bug 16250
+cc/Service_ClassesCoverage: Skip # Dart bug 16250
 
 [ $compiler == dart2js ]
 dart/mirrored_compilation_error_test: Skip # VM-specific flag
@@ -73,6 +78,7 @@
 cc/StaticNonNullSumCallCodegen: Crash, Pass # dartbug.com/17440
 
 [ $arch == mips && $mode == debug ]
+cc/JSON_JSONStream_Options: Crash # Issue 19328
 cc/FindCodeObject: Skip # Takes more than 8 minutes. dartbug.com/17440.
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
diff --git a/runtime/vm/allocation.cc b/runtime/vm/allocation.cc
index 624ad43..bbff55e 100644
--- a/runtime/vm/allocation.cc
+++ b/runtime/vm/allocation.cc
@@ -10,11 +10,6 @@
 
 namespace dart {
 
-ZoneAllocated::~ZoneAllocated() {
-  UNREACHABLE();
-}
-
-
 static void* Allocate(uword size, BaseIsolate* isolate) {
   ASSERT(isolate != NULL);
   ASSERT(isolate->current_zone() != NULL);
diff --git a/runtime/vm/allocation.h b/runtime/vm/allocation.h
index d7b26d63..d26ac2b 100644
--- a/runtime/vm/allocation.h
+++ b/runtime/vm/allocation.h
@@ -89,9 +89,6 @@
 class ZoneAllocated {
  public:
   ZoneAllocated() { }
-  // It would be ideal if the destructor method could be made private,
-  // but the g++ compiler complains when this is subclassed.
-  virtual ~ZoneAllocated();
 
   // Implicitly allocate the object in the current zone.
   void* operator new(uword size);
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index d0338a4..c94b9f5 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -1621,6 +1621,21 @@
 }
 
 
+void Assembler::StoreIntoObjectOffset(Register object,
+                                      int32_t offset,
+                                      Register value,
+                                      bool can_value_be_smi) {
+  int32_t ignored = 0;
+  if (Address::CanHoldStoreOffset(kWord, offset - kHeapObjectTag, &ignored)) {
+    StoreIntoObject(
+        object, FieldAddress(object, offset), value, can_value_be_smi);
+  } else {
+    AddImmediate(IP, object, offset - kHeapObjectTag);
+    StoreIntoObject(object, Address(IP), value, can_value_be_smi);
+  }
+}
+
+
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          Register value) {
@@ -1635,6 +1650,19 @@
 }
 
 
+void Assembler::StoreIntoObjectNoBarrierOffset(Register object,
+                                               int32_t offset,
+                                               Register value) {
+  int32_t ignored = 0;
+  if (Address::CanHoldStoreOffset(kWord, offset - kHeapObjectTag, &ignored)) {
+    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value);
+  } else {
+    AddImmediate(IP, object, offset - kHeapObjectTag);
+    StoreIntoObjectNoBarrier(object, Address(IP), value);
+  }
+}
+
+
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          const Object& value) {
@@ -1646,12 +1674,25 @@
 }
 
 
-void Assembler::LoadClassId(Register result, Register object) {
+void Assembler::StoreIntoObjectNoBarrierOffset(Register object,
+                                               int32_t offset,
+                                               const Object& value) {
+  int32_t ignored = 0;
+  if (Address::CanHoldStoreOffset(kWord, offset - kHeapObjectTag, &ignored)) {
+    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value);
+  } else {
+    AddImmediate(IP, object, offset - kHeapObjectTag);
+    StoreIntoObjectNoBarrier(object, Address(IP), value);
+  }
+}
+
+
+void Assembler::LoadClassId(Register result, Register object, Condition cond) {
   ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
   const intptr_t class_id_offset = Object::tags_offset() +
       RawObject::kClassIdTagPos / kBitsPerByte;
-  ldrh(result, FieldAddress(object, class_id_offset));
+  ldrh(result, FieldAddress(object, class_id_offset), cond);
 }
 
 
@@ -1685,6 +1726,14 @@
 }
 
 
+void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
+  tst(object, Operand(kSmiTagMask));
+  LoadImmediate(result, Smi::RawValue(kSmiCid), EQ);
+  LoadClassId(result, object, NE);
+  SmiTag(result, NE);
+}
+
+
 static bool CanEncodeBranchOffset(int32_t offset) {
   ASSERT(Utils::IsAligned(offset, 4));
   return Utils::IsInt(Utils::CountOneBits(kBranchOffsetMask), offset);
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 127b1f8..5af7c66 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -628,18 +628,29 @@
                        const Address& dest,  // Where we are storing into.
                        Register value,  // Value we are storing.
                        bool can_value_be_smi = true);
+  void StoreIntoObjectOffset(Register object,
+                             int32_t offset,
+                             Register value,
+                             bool can_value_be_smi = true);
 
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 Register value);
+  void StoreIntoObjectNoBarrierOffset(Register object,
+                                      int32_t offset,
+                                      Register value);
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 const Object& value);
+  void StoreIntoObjectNoBarrierOffset(Register object,
+                                      int32_t offset,
+                                      const Object& value);
 
-  void LoadClassId(Register result, Register object);
+  void LoadClassId(Register result, Register object, Condition cond = AL);
   void LoadClassById(Register result, Register class_id);
   void LoadClass(Register result, Register object, Register scratch);
   void CompareClassId(Register object, intptr_t class_id, Register scratch);
+  void LoadTaggedClassIdMayBeSmi(Register result, Register object);
 
   void LoadWordFromPoolOffset(Register rd, int32_t offset, Condition cond = AL);
   void LoadFromOffset(OperandSize type,
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index 0b3ddf1..c6d4457 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -1073,6 +1073,19 @@
 }
 
 
+void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
+  Label load, done;
+  tsti(object, kSmiTagMask);
+  b(&load, NE);
+  LoadImmediate(result, Smi::RawValue(kSmiCid), PP);
+  b(&done);
+  Bind(&load);
+  LoadClassId(result, object, PP);
+  SmiTag(result);
+  Bind(&done);
+}
+
+
 // Frame entry and exit.
 void Assembler::ReserveAlignedFrameSpace(intptr_t frame_space) {
   // Reserve space for arguments and align frame before entering
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index f6f01d0..9ef8746 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -22,8 +22,6 @@
 // Forward declarations.
 class RuntimeEntry;
 
-// TODO(zra): Label, Address, and FieldAddress are copied from ARM,
-// they must be adapted to ARM64.
 class Label : public ValueObject {
  public:
   Label() : position_(0) { }
@@ -245,8 +243,8 @@
 
 class FieldAddress : public Address {
  public:
-  FieldAddress(Register base, int32_t disp)
-      : Address(base, disp - kHeapObjectTag) { }
+  FieldAddress(Register base, int32_t disp, OperandSize sz = kDoubleWord)
+      : Address(base, disp - kHeapObjectTag, Offset, sz) { }
 
   FieldAddress(const FieldAddress& other) : Address(other) { }
 
@@ -684,6 +682,9 @@
   void hlt(uint16_t imm) {
     EmitExceptionGenOp(HLT, imm);
   }
+  void brk(uint16_t imm) {
+    EmitExceptionGenOp(BRK, imm);
+  }
 
   // Double floating point.
   bool fmovdi(VRegister vd, double immd) {
@@ -1068,9 +1069,9 @@
 
   void LoadFromOffset(Register dest, Register base, int32_t offset,
                       Register pp, OperandSize sz = kDoubleWord);
-  void LoadFieldFromOffset(
-      Register dest, Register base, int32_t offset, Register pp) {
-    LoadFromOffset(dest, base, offset - kHeapObjectTag, pp);
+  void LoadFieldFromOffset(Register dest, Register base, int32_t offset,
+                           Register pp, OperandSize sz = kDoubleWord) {
+    LoadFromOffset(dest, base, offset - kHeapObjectTag, pp, sz);
   }
   void LoadDFromOffset(
       VRegister dest, Register base, int32_t offset, Register pp);
@@ -1087,9 +1088,9 @@
 
   void StoreToOffset(Register src, Register base, int32_t offset,
                      Register pp, OperandSize sz = kDoubleWord);
-  void StoreFieldToOffset(
-      Register src, Register base, int32_t offset, Register pp) {
-    StoreToOffset(src, base, offset - kHeapObjectTag, pp);
+  void StoreFieldToOffset(Register src, Register base, int32_t offset,
+                          Register pp, OperandSize sz = kDoubleWord) {
+    StoreToOffset(src, base, offset - kHeapObjectTag, pp, sz);
   }
   void StoreDToOffset(
       VRegister src, Register base, int32_t offset, Register pp);
@@ -1170,6 +1171,7 @@
   void LoadClassById(Register result, Register class_id, Register pp);
   void LoadClass(Register result, Register object, Register pp);
   void CompareClassId(Register object, intptr_t class_id, Register pp);
+  void LoadTaggedClassIdMayBeSmi(Register result, Register object);
 
   void EnterFrame(intptr_t frame_size);
   void LeaveFrame();
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index f219e8e..6c36ecf 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -2656,6 +2656,19 @@
 }
 
 
+void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
+  testl(object, Immediate(kSmiTagMask));
+  Label not_smi, done;
+  j(NOT_ZERO, &not_smi, Assembler::kNearJump);
+  movl(result, Immediate(Smi::RawValue(kSmiCid)));
+  jmp(&done, Assembler::kNearJump);
+  Bind(&not_smi);
+  LoadClassId(result, object);
+  SmiTag(result);
+  Bind(&done);
+}
+
+
 static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"
 };
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index f502bd5..6688eca 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -686,6 +686,8 @@
 
   void CompareClassId(Register object, intptr_t class_id, Register scratch);
 
+  void LoadTaggedClassIdMayBeSmi(Register result, Register object);
+
   /*
    * Misc. functionality
    */
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index f4a4f6e..d3f92fb 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -588,6 +588,20 @@
 }
 
 
+void Assembler::StoreIntoObjectOffset(Register object,
+                                      int32_t offset,
+                                      Register value,
+                                      bool can_value_be_smi) {
+  if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
+    StoreIntoObject(
+        object, FieldAddress(object, offset), value, can_value_be_smi);
+  } else {
+    AddImmediate(TMP, object, offset - kHeapObjectTag);
+    StoreIntoObject(object, Address(TMP), value, can_value_be_smi);
+  }
+}
+
+
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          Register value) {
@@ -603,6 +617,18 @@
 }
 
 
+void Assembler::StoreIntoObjectNoBarrierOffset(Register object,
+                                               int32_t offset,
+                                               Register value) {
+  if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
+    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value);
+  } else {
+    AddImmediate(TMP, object, offset - kHeapObjectTag);
+    StoreIntoObjectNoBarrier(object, Address(TMP), value);
+  }
+}
+
+
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          const Object& value) {
@@ -615,6 +641,18 @@
 }
 
 
+void Assembler::StoreIntoObjectNoBarrierOffset(Register object,
+                                               int32_t offset,
+                                               const Object& value) {
+  if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
+    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value);
+  } else {
+    AddImmediate(TMP, object, offset - kHeapObjectTag);
+    StoreIntoObjectNoBarrier(object, Address(TMP), value);
+  }
+}
+
+
 void Assembler::LoadClassId(Register result, Register object) {
   ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
@@ -652,6 +690,19 @@
 }
 
 
+void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
+  Label load, done;
+  andi(CMPRES1, object, Immediate(kSmiTagMask));
+  bne(CMPRES1, ZR, &load);
+  LoadImmediate(result, Smi::RawValue(kSmiCid));
+  b(&done);
+  Bind(&load);
+  LoadClassId(result, object);
+  SmiTag(result);
+  Bind(&done);
+}
+
+
 void Assembler::EnterFrame() {
   ASSERT(!in_delay_slot_);
   addiu(SP, SP, Immediate(-2 * kWordSize));
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index efbb467..1439455 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -1183,18 +1183,29 @@
   void LoadClassId(Register result, Register object);
   void LoadClassById(Register result, Register class_id);
   void LoadClass(Register result, Register object);
+  void LoadTaggedClassIdMayBeSmi(Register result, Register object);
 
   void StoreIntoObject(Register object,  // Object we are storing into.
                        const Address& dest,  // Where we are storing into.
                        Register value,  // Value we are storing.
                        bool can_value_be_smi = true);
+  void StoreIntoObjectOffset(Register object,
+                             int32_t offset,
+                             Register value,
+                             bool can_value_be_smi = true);
 
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 Register value);
+  void StoreIntoObjectNoBarrierOffset(Register object,
+                                      int32_t offset,
+                                      Register value);
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 const Object& value);
+  void StoreIntoObjectNoBarrierOffset(Register object,
+                                      int32_t offset,
+                                      const Object& value);
 
   void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
 
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index c04809e..f15fab1 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -8,6 +8,7 @@
 #include "vm/assembler.h"
 #include "vm/cpu.h"
 #include "vm/heap.h"
+#include "vm/locations.h"
 #include "vm/memory_region.h"
 #include "vm/runtime_entry.h"
 #include "vm/stack_frame.h"
@@ -239,6 +240,12 @@
 }
 
 
+void Assembler::movl(const Address& dst, const Immediate& imm) {
+  movl(TMP, imm);
+  movl(dst, TMP);
+}
+
+
 void Assembler::movzxb(Register dst, Register src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   Operand operand(src);
@@ -2816,37 +2823,69 @@
 }
 
 
-// TODO(srdjan): Add XMM registers once they are used by the compiler.
-// Based on http://x86-64.org/documentation/abi.pdf Fig. 3.4
-static const intptr_t kNumberOfVolatileCpuRegisters = 9;
-static const Register volatile_cpu_registers[kNumberOfVolatileCpuRegisters] = {
-    RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11
-};
+void Assembler::PushRegisters(intptr_t cpu_register_set,
+                              intptr_t xmm_register_set) {
+  const intptr_t xmm_regs_count = RegisterSet::RegisterCount(xmm_register_set);
+  if (xmm_regs_count > 0) {
+    AddImmediate(RSP, Immediate(-xmm_regs_count * kFpuRegisterSize), PP);
+    // Store XMM registers with the lowest register number at the lowest
+    // address.
+    intptr_t offset = 0;
+    for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
+      XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
+      if (RegisterSet::Contains(xmm_register_set, xmm_reg)) {
+        movups(Address(RSP, offset), xmm_reg);
+        offset += kFpuRegisterSize;
+      }
+    }
+    ASSERT(offset == (xmm_regs_count * kFpuRegisterSize));
+  }
 
-// XMM0 is used only as a scratch register in the optimized code. No need to
-// save it.
-static const intptr_t kNumberOfVolatileXmmRegisters =
-    kNumberOfXmmRegisters - 1;
+  // Store general purpose registers with the highest register number at the
+  // lowest address.
+  for (intptr_t reg_idx = 0; reg_idx < kNumberOfCpuRegisters; ++reg_idx) {
+    Register reg = static_cast<Register>(reg_idx);
+    if (RegisterSet::Contains(cpu_register_set, reg)) {
+      pushq(reg);
+    }
+  }
+}
+
+
+void Assembler::PopRegisters(intptr_t cpu_register_set,
+                             intptr_t xmm_register_set) {
+  // General purpose registers have the highest register number at the
+  // lowest address.
+  for (intptr_t reg_idx = kNumberOfCpuRegisters - 1; reg_idx >= 0; --reg_idx) {
+    Register reg = static_cast<Register>(reg_idx);
+    if (RegisterSet::Contains(cpu_register_set, reg)) {
+      popq(reg);
+    }
+  }
+
+  const intptr_t xmm_regs_count = RegisterSet::RegisterCount(xmm_register_set);
+  if (xmm_regs_count > 0) {
+    // XMM registers have the lowest register number at the lowest address.
+    intptr_t offset = 0;
+    for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
+      XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
+      if (RegisterSet::Contains(xmm_register_set, xmm_reg)) {
+        movups(xmm_reg, Address(RSP, offset));
+        offset += kFpuRegisterSize;
+      }
+    }
+    ASSERT(offset == (xmm_regs_count * kFpuRegisterSize));
+    AddImmediate(RSP, Immediate(offset), PP);
+  }
+}
 
 
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) {
   EnterFrame(0);
 
-  // Preserve volatile CPU registers.
-  for (intptr_t i = 0; i < kNumberOfVolatileCpuRegisters; i++) {
-    pushq(volatile_cpu_registers[i]);
-  }
-
-  // Preserve all XMM registers except XMM0
-  subq(RSP, Immediate((kNumberOfXmmRegisters - 1) * kFpuRegisterSize));
-  // Store XMM registers with the lowest register number at the lowest
-  // address.
-  intptr_t offset = 0;
-  for (intptr_t reg_idx = 1; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
-    XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
-    movups(Address(RSP, offset), xmm_reg);
-    offset += kFpuRegisterSize;
-  }
+  // TODO(vegorov): avoid saving FpuTMP, it is used only as scratch.
+  PushRegisters(CallingConventions::kVolatileCpuRegisters,
+                CallingConventions::kVolatileXmmRegisters);
 
   ReserveAlignedFrameSpace(frame_space);
 }
@@ -2856,30 +2895,41 @@
   // RSP might have been modified to reserve space for arguments
   // and ensure proper alignment of the stack frame.
   // We need to restore it before restoring registers.
+  const intptr_t kPushedCpuRegistersCount =
+      RegisterSet::RegisterCount(CallingConventions::kVolatileCpuRegisters);
+  const intptr_t kPushedXmmRegistersCount =
+      RegisterSet::RegisterCount(CallingConventions::kVolatileXmmRegisters);
   const intptr_t kPushedRegistersSize =
-      kNumberOfVolatileCpuRegisters * kWordSize +
-      kNumberOfVolatileXmmRegisters * kFpuRegisterSize;
+      kPushedCpuRegistersCount * kWordSize +
+      kPushedXmmRegistersCount * kFpuRegisterSize;
   leaq(RSP, Address(RBP, -kPushedRegistersSize));
 
-  // Restore all XMM registers except XMM0
-  // XMM registers have the lowest register number at the lowest address.
-  intptr_t offset = 0;
-  for (intptr_t reg_idx = 1; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
-    XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
-    movups(xmm_reg, Address(RSP, offset));
-    offset += kFpuRegisterSize;
-  }
-  addq(RSP, Immediate(offset));
-
-  // Restore volatile CPU registers.
-  for (intptr_t i = kNumberOfVolatileCpuRegisters - 1; i >= 0; i--) {
-    popq(volatile_cpu_registers[i]);
-  }
+  // TODO(vegorov): avoid saving FpuTMP, it is used only as scratch.
+  PopRegisters(CallingConventions::kVolatileCpuRegisters,
+               CallingConventions::kVolatileXmmRegisters);
 
   leave();
 }
 
 
+void Assembler::CallCFunction(const ExternalLabel* label) {
+  // Reserve shadow space for outgoing arguments.
+  if (CallingConventions::kShadowSpaceBytes != 0) {
+    subq(RSP, Immediate(CallingConventions::kShadowSpaceBytes));
+  }
+  call(label);
+}
+
+
+void Assembler::CallCFunction(Register reg) {
+  // Reserve shadow space for outgoing arguments.
+  if (CallingConventions::kShadowSpaceBytes != 0) {
+    subq(RSP, Immediate(CallingConventions::kShadowSpaceBytes));
+  }
+  call(reg);
+}
+
+
 void Assembler::CallRuntime(const RuntimeEntry& entry,
                             intptr_t argument_count) {
   entry.Call(this, argument_count);
@@ -3278,6 +3328,19 @@
 }
 
 
+void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
+  Label load, done;
+  testq(object, Immediate(kSmiTagMask));
+  j(NOT_ZERO, &load, Assembler::kNearJump);
+  LoadImmediate(result, Immediate(Smi::RawValue(kSmiCid)), PP);
+  jmp(&done);
+  Bind(&load);
+  LoadClassId(result, object);
+  SmiTag(result);
+  Bind(&done);
+}
+
+
 static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index 70f345e..2fdc883 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -350,6 +350,7 @@
   void movl(Register dst, const Immediate& imm);
   void movl(Register dst, const Address& src);
   void movl(const Address& dst, Register src);
+  void movl(const Address& dst, const Immediate& imm);
 
   void movzxb(Register dst, Register src);
   void movzxb(Register dst, const Address& src);
@@ -714,6 +715,9 @@
     cmpxchgl(address, reg);
   }
 
+  void PushRegisters(intptr_t cpu_register_set, intptr_t xmm_register_set);
+  void PopRegisters(intptr_t cpu_register_set, intptr_t xmm_register_set);
+
   void EnterFrame(intptr_t frame_space);
   void LeaveFrame();
   void ReserveAlignedFrameSpace(intptr_t frame_space);
@@ -726,6 +730,11 @@
 
   void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
 
+  // Call runtime function. Reserves shadow space on the stack before calling
+  // if platform ABI requires that. Does not restore RSP after the call itself.
+  void CallCFunction(const ExternalLabel* label);
+  void CallCFunction(Register reg);
+
   /*
    * Loading and comparing classes of objects.
    */
@@ -737,6 +746,8 @@
 
   void CompareClassId(Register object, intptr_t class_id);
 
+  void LoadTaggedClassIdMayBeSmi(Register result, Register object);
+
   /*
    * Misc. functionality.
    */
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index de4275f..341196a 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -16,7 +16,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(ReadArgument, assembler) {
-  __ pushq(RDI);  // First argument is passed in register rdi.
+  __ pushq(CallingConventions::kArg1Reg);
   __ movq(RAX, Address(RSP, 0));
   __ popq(RDX);
   __ ret();
@@ -1296,7 +1296,7 @@
   __ addq(RSP, Immediate(space));
   space = ComputeStackSpaceReservation(0, 8);
   __ subq(RSP, Immediate(space));
-  __ movl(RDI, RAX);
+  __ movl(CallingConventions::kArg1Reg, RAX);
   __ call(&call2);
   __ addq(RSP, Immediate(space));
   __ ret();
@@ -2724,10 +2724,11 @@
   __ pushq(PP);  // Save caller's pool pointer and load a new one here.
   __ LoadPoolPointer(PP);
   __ pushq(CTX);
-  __ movq(CTX, RDI);
-  __ StoreIntoObject(RDX,
-                     FieldAddress(RDX, GrowableObjectArray::data_offset()),
-                     RSI);
+  __ movq(CTX, CallingConventions::kArg1Reg);
+  __ StoreIntoObject(CallingConventions::kArg3Reg,
+                     FieldAddress(CallingConventions::kArg3Reg,
+                                  GrowableObjectArray::data_offset()),
+                     CallingConventions::kArg2Reg);
   __ popq(CTX);
   __ popq(PP);  // Restore caller's pool pointer.
   __ ret();
@@ -2808,7 +2809,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion2, assembler) {
-  __ pushq(RDI);
+  __ pushq(CallingConventions::kArg1Reg);
   __ fildl(Address(RSP, 0));
   __ fstpl(Address(RSP, 0));
   __ movsd(XMM0, Address(RSP, 0));
@@ -2896,10 +2897,11 @@
 
 
 ASSEMBLER_TEST_GENERATE(TestRepMovsBytes, assembler) {
-  // Save incoming arguments.
-  __ pushq(RDI);  // Arg0, from.
-  __ pushq(RSI);  // Arg1, to.
-  __ pushq(RDX);  // Arg2, count.
+  __ pushq(RSI);
+  __ pushq(RDI);
+  __ pushq(CallingConventions::kArg1Reg);  // from.
+  __ pushq(CallingConventions::kArg2Reg);  // to.
+  __ pushq(CallingConventions::kArg3Reg);  // count.
   __ movq(RSI, Address(RSP, 2 * kWordSize));  // from.
   __ movq(RDI, Address(RSP, 1 * kWordSize));  // to.
   __ movq(RCX, Address(RSP, 0 * kWordSize));  // count.
@@ -2908,6 +2910,8 @@
   __ popq(RAX);
   __ popq(RAX);
   __ popq(RAX);
+  __ popq(RDI);
+  __ popq(RSI);
   __ ret();
 }
 
@@ -2926,11 +2930,9 @@
 
 
 ASSEMBLER_TEST_GENERATE(ConditionalMovesCompare, assembler) {
-  // RDI: Arg0.
-  // RSI: Arg1.
+  __ cmpq(CallingConventions::kArg1Reg, CallingConventions::kArg2Reg);
   __ movq(RDX, Immediate(1));  // Greater equal.
   __ movq(RCX, Immediate(-1));  // Less
-  __ cmpq(RDI, RSI);
   __ cmovlessq(RAX, RCX);
   __ cmovgeq(RAX, RDX);
   __ ret();
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index bf9490b..aceb0b0 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -98,6 +98,7 @@
       : token_pos_(token_pos) {
     ASSERT(token_pos_ >= 0);
   }
+  virtual ~AstNode() { }
 
   intptr_t token_pos() const { return token_pos_; }
 
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index cd2bd36..cd8dc78 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -57,33 +57,17 @@
 // Measure creation of core isolate from a snapshot.
 //
 BENCHMARK(CorelibIsolateStartup) {
-  const int kNumIterations = 100;
-  char* err = NULL;
-  Dart_Isolate base_isolate = Dart_CurrentIsolate();
-  Dart_Isolate test_isolate = Dart_CreateIsolate(NULL, NULL,
-                                                 bin::snapshot_buffer,
-                                                 NULL, &err);
-  EXPECT(test_isolate != NULL);
-  Dart_EnterScope();
-  uint8_t* buffer = NULL;
-  intptr_t size = 0;
-  Dart_Handle result = Dart_CreateSnapshot(&buffer, &size);
-  EXPECT_VALID(result);
-  Timer timer(true, "Core Isolate startup benchmark");
-  timer.Start();
+  const int kNumIterations = 1000;
+  Timer timer(true, "CorelibIsolateStartup");
+  Isolate* isolate = Isolate::Current();
   for (int i = 0; i < kNumIterations; i++) {
-    Dart_Isolate new_isolate =
-        Dart_CreateIsolate(NULL, NULL, buffer, NULL, &err);
-    EXPECT(new_isolate != NULL);
+    timer.Start();
+    TestCase::CreateTestIsolate();
+    timer.Stop();
     Dart_ShutdownIsolate();
   }
-  timer.Stop();
-  int64_t elapsed_time = timer.TotalElapsedTime();
-  benchmark->set_score(elapsed_time / kNumIterations);
-  Dart_EnterIsolate(test_isolate);
-  Dart_ExitScope();
-  Dart_ShutdownIsolate();
-  Dart_EnterIsolate(base_isolate);
+  benchmark->set_score(timer.TotalElapsedTime() / kNumIterations);
+  Isolate::SetCurrent(isolate);
 }
 
 
@@ -410,7 +394,7 @@
 }
 
 
-BENCHMARK(CoreSnapshotSize) {
+BENCHMARK_SIZE(CoreSnapshotSize) {
   const char* kScriptChars =
       "import 'dart:async';\n"
       "import 'dart:core';\n"
@@ -438,7 +422,7 @@
 }
 
 
-BENCHMARK(StandaloneSnapshotSize) {
+BENCHMARK_SIZE(StandaloneSnapshotSize) {
   const char* kScriptChars =
       "import 'dart:async';\n"
       "import 'dart:core';\n"
@@ -449,7 +433,7 @@
       "import 'dart:isolate';\n"
       "import 'dart:mirrors';\n"
       "import 'dart:typed_data';\n"
-      "import 'dart:builtin';\n"
+      "import 'dart:_builtin';\n"
       "import 'dart:io';\n"
       "\n";
 
diff --git a/runtime/vm/benchmark_test.h b/runtime/vm/benchmark_test.h
index 0ff69ce..2537151 100644
--- a/runtime/vm/benchmark_test.h
+++ b/runtime/vm/benchmark_test.h
@@ -25,11 +25,11 @@
 extern const uint8_t* snapshot_buffer;
 }
 
-// The BENCHMARK macro is used for benchmarking a specific functionality
-// of the VM
-#define BENCHMARK(name)                                                        \
+// The BENCHMARK macros are used for benchmarking a specific functionality
+// of the VM.
+#define BENCHMARK_HELPER(name, kind)                                           \
   void Dart_Benchmark##name(Benchmark* benchmark);                             \
-  static Benchmark kRegister##name(Dart_Benchmark##name, #name);               \
+  static Benchmark kRegister##name(Dart_Benchmark##name, #name, kind);         \
   static void Dart_BenchmarkHelper##name(Benchmark* benchmark);                \
   void Dart_Benchmark##name(Benchmark* benchmark) {                            \
     FLAG_heap_growth_space_ratio = 100;                                        \
@@ -40,6 +40,9 @@
   }                                                                            \
   static void Dart_BenchmarkHelper##name(Benchmark* benchmark)
 
+#define BENCHMARK(name) BENCHMARK_HELPER(name, "RunTime")
+#define BENCHMARK_SIZE(name) BENCHMARK_HELPER(name, "CodeSize")
+
 
 inline Dart_Handle NewString(const char* str) {
   return Dart_NewStringFromCString(str);
@@ -50,9 +53,10 @@
  public:
   typedef void (RunEntry)(Benchmark* benchmark);
 
-  Benchmark(RunEntry* run, const char* name) :
+  Benchmark(RunEntry* run, const char* name, const char* score_kind) :
       run_(run),
       name_(name),
+      score_kind_(score_kind),
       score_(0),
       isolate_(NULL),
       next_(NULL) {
@@ -66,6 +70,7 @@
 
   // Accessors.
   const char* name() const { return name_; }
+  const char* score_kind() const { return score_kind_; }
   void set_score(intptr_t value) { score_ = value; }
   intptr_t score() const { return score_; }
   Isolate* isolate() const { return reinterpret_cast<Isolate*>(isolate_); }
@@ -92,6 +97,7 @@
 
   RunEntry* const run_;
   const char* name_;
+  const char* score_kind_;
   intptr_t score_;
   Dart_Isolate isolate_;
   Benchmark* next_;
diff --git a/runtime/vm/bigint_operations.cc b/runtime/vm/bigint_operations.cc
index 9d8a2a4..e8cafdc 100644
--- a/runtime/vm/bigint_operations.cc
+++ b/runtime/vm/bigint_operations.cc
@@ -358,7 +358,7 @@
     // into dart code or allocating any code.
     const Instance& exception =
         Instance::Handle(isolate->object_store()->out_of_memory());
-    Exceptions::Throw(exception);
+    Exceptions::Throw(isolate, exception);
     UNREACHABLE();
   }
 
@@ -487,13 +487,57 @@
 }
 
 
+static double Uint64ToDouble(uint64_t x) {
+#if _WIN64
+  // For static_cast<double>(x) MSVC x64 generates
+  //
+  //    cvtsi2sd xmm0, rax
+  //    test  rax, rax
+  //    jns done
+  //    addsd xmm0, static_cast<double>(2^64)
+  //  done:
+  //
+  // while GCC -m64 generates
+  //
+  //    test rax, rax
+  //    js negative
+  //    cvtsi2sd xmm0, rax
+  //    jmp done
+  //  negative:
+  //    mov rdx, rax
+  //    shr rdx, 1
+  //    and eax, 0x1
+  //    or rdx, rax
+  //    cvtsi2sd xmm0, rdx
+  //    addsd xmm0, xmm0
+  //  done:
+  //
+  // which results in a different rounding.
+  //
+  // For consistency between platforms fallback to GCC style converstion
+  // on Win64.
+  //
+  const int64_t y = static_cast<int64_t>(x);
+  if (y > 0) {
+    return static_cast<double>(y);
+  } else {
+    const double half = static_cast<double>(
+        static_cast<int64_t>(x >> 1) | (y & 1));
+    return half + half;
+  }
+#else
+  return static_cast<double>(x);
+#endif
+}
+
+
 RawDouble* BigintOperations::ToDouble(const Bigint& bigint) {
   ASSERT(IsClamped(bigint));
   if (bigint.IsZero()) {
     return Double::New(0.0);
   }
   if (AbsFitsIntoUint64(bigint)) {
-    double absolute_value = static_cast<double>(AbsToUint64(bigint));
+    double absolute_value = Uint64ToDouble(AbsToUint64(bigint));
     double result = bigint.IsNegative() ? -absolute_value : absolute_value;
     return Double::New(result);
   }
diff --git a/runtime/vm/block_scheduler.cc b/runtime/vm/block_scheduler.cc
index 02287f3..2533757 100644
--- a/runtime/vm/block_scheduler.cc
+++ b/runtime/vm/block_scheduler.cc
@@ -37,7 +37,13 @@
                           intptr_t entry_count) {
   TargetEntryInstr* target = successor->AsTargetEntry();
   if (target != NULL) {
-    intptr_t count = ComputeEdgeCount(unoptimized_code, target->deopt_id());
+    // If this block ends in a goto, the edge count of this edge is the same
+    // as the count on the single outgoing edge. This is true as long as the
+    // block does not throw an exception.
+    GotoInstr* jump = target->last_instruction()->AsGoto();
+    const intptr_t deopt_id =
+        (jump != NULL)  ? jump->deopt_id() : target->deopt_id();
+    intptr_t count = ComputeEdgeCount(unoptimized_code, deopt_id);
     if ((count >= 0) && (entry_count != 0)) {
       double weight =
           static_cast<double>(count) / static_cast<double>(entry_count);
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index d12752f..937286e 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -193,7 +193,7 @@
     return Api::NewError("uri is not a string");
   }
   if (tag == Dart_kCanonicalizeUrl) {
-    // In the boot strap loader we do not try and do any canonicalization.
+    // In the bootstrap loader we do not try and do any canonicalization.
     return uri;
   }
   const String& uri_str = Api::UnwrapStringHandle(isolate, uri);
@@ -271,6 +271,7 @@
     lib = Library::LookupLibrary(uri);
     if (lib.IsNull()) {
       lib = Library::NewLibraryHelper(uri, false);
+      lib.SetLoadRequested();
       lib.Register();
     }
     isolate->object_store()->set_bootstrap_library(
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 811e24e..cd7a9b5 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -21,7 +21,6 @@
   V(Object_runtimeType, 1)                                                     \
   V(Object_instanceOf, 5)                                                      \
   V(Object_as, 4)                                                              \
-  V(Object_cid, 1)                                                             \
   V(Function_apply, 2)                                                         \
   V(FunctionImpl_equals, 2)                                                    \
   V(FunctionImpl_hashCode, 1)                                                  \
@@ -352,11 +351,13 @@
   V(WeakProperty_setValue, 2)                                                  \
   V(Uri_isWindowsPlatform, 0)                                                  \
   V(LibraryPrefix_load, 1)                                                     \
+  V(LibraryPrefix_invalidateDependentCode, 1)                                  \
   V(UserTag_new, 2)                                                            \
   V(UserTag_label, 1)                                                          \
   V(UserTag_defaultTag, 0)                                                     \
   V(UserTag_makeCurrent, 1)                                                    \
   V(Profiler_getCurrentTag, 0)                                                 \
+  V(ClassID_getID, 1)                                                          \
 
 
 class BootstrapNatives : public AllStatic {
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 5b28264..d70e8c1 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -10,6 +10,7 @@
 #include "vm/isolate.h"
 #include "vm/longjump.h"
 #include "vm/object_store.h"
+#include "vm/report.h"
 #include "vm/symbols.h"
 
 namespace dart {
@@ -278,9 +279,7 @@
   for (intptr_t i = 0; i < visited_factories.Length(); i++) {
     if (visited_factories.At(i) == factory.raw()) {
       // A redirection cycle is reported as a compile-time error.
-      const Script& script = Script::Handle(cls.script());
-      ReportError(Error::Handle(),  // No previous error.
-                  script, factory.token_pos(),
+      ReportError(cls, factory.token_pos(),
                   "factory '%s' illegally redirects to itself",
                   String::Handle(factory.name()).ToCString());
     }
@@ -372,11 +371,9 @@
 
   // Verify that the target is const if the redirecting factory is const.
   if (factory.is_const() && !target.is_const()) {
-    const Script& script = Script::Handle(target_class.script());
-    ReportError(Error::Handle(),  // No previous error.
-                script, target.token_pos(),
-                "constructor '%s' must be const as required by redirecting "
-                "const factory '%s'",
+    ReportError(target_class, target.token_pos(),
+                "constructor '%s' must be const as required by "
+                "redirecting const factory '%s'",
                 String::Handle(target.name()).ToCString(),
                 String::Handle(factory.name()).ToCString());
   }
@@ -571,12 +568,9 @@
           !pending_arguments.IsSubvectorInstantiated(first_type_param,
                                                      num_type_params)) {
         // Reject the non-contractive recursive type.
-        const Script& script = Script::Handle(isolate, cls.script());
         const String& type_name = String::Handle(isolate, type.Name());
-        ReportError(Error::Handle(isolate),  // No previous error.
-                    script, type.token_pos(),
-                    "illegal recursive type '%s'",
-                    type_name.ToCString());
+        ReportError(cls, type.token_pos(),
+                    "illegal recursive type '%s'", type_name.ToCString());
       }
     }
   }
@@ -968,11 +962,9 @@
   if (!arguments.IsNull() && (arguments.Length() != num_type_parameters)) {
     // Wrong number of type arguments. The type is mapped to the raw type.
     if (FLAG_error_on_bad_type) {
-      const Script& script = Script::Handle(isolate, cls.script());
       const String& type_class_name =
           String::Handle(isolate, type_class.Name());
-      ReportError(Error::Handle(isolate),  // No previous error.
-                  script, parameterized_type.token_pos(),
+      ReportError(cls, parameterized_type.token_pos(),
                   "wrong number of type arguments for class '%s'",
                   type_class_name.ToCString());
     }
@@ -1276,9 +1268,7 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(cls.Name());
         const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, field.token_pos(),
+        ReportError(cls, field.token_pos(),
                     "static field '%s' of class '%s' conflicts with "
                     "instance member '%s' of super class '%s'",
                     name.ToCString(),
@@ -1294,9 +1284,7 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(cls.Name());
         const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, field.token_pos(),
+        ReportError(cls, field.token_pos(),
                     "static field '%s' of class '%s' conflicts with "
                     "instance setter '%s=' of super class '%s'",
                     name.ToCString(),
@@ -1312,9 +1300,7 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(cls.Name());
         const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, field.token_pos(),
+        ReportError(cls, field.token_pos(),
                     "field '%s' of class '%s' conflicts with method '%s' "
                     "of super class '%s'",
                     name.ToCString(),
@@ -1346,14 +1332,13 @@
           const String& const_value_type_name = String::Handle(
               const_value_type.UserVisibleName());
           const String& type_name = String::Handle(type.UserVisibleName());
-          const Script& script = Script::Handle(cls.script());
-          ReportError(error, script, field.token_pos(),
-                      "error initializing static %s field '%s': "
-                      "type '%s' is not a subtype of type '%s'",
-                      field.is_const() ? "const" : "final",
-                      name.ToCString(),
-                      const_value_type_name.ToCString(),
-                      type_name.ToCString());
+          ReportErrors(error, cls, field.token_pos(),
+                       "error initializing static %s field '%s': "
+                       "type '%s' is not a subtype of type '%s'",
+                       field.is_const() ? "const" : "final",
+                       name.ToCString(),
+                       const_value_type_name.ToCString(),
+                       type_name.ToCString());
         } else {
           // Do not report an error yet, even in checked mode, since the field
           // may not actually be used.
@@ -1423,13 +1408,12 @@
                                                   &error)) {
           const String& class_name = String::Handle(cls.Name());
           const String& super_class_name = String::Handle(super_class.Name());
-          const Script& script = Script::Handle(cls.script());
-          ReportError(error, script, function.token_pos(),
-                      "class '%s' overrides method '%s' of super class '%s' "
-                      "with incompatible parameters",
-                      class_name.ToCString(),
-                      name.ToCString(),
-                      super_class_name.ToCString());
+          ReportErrors(error, cls, function.token_pos(),
+                       "class '%s' overrides method '%s' of super "
+                       "class '%s' with incompatible parameters",
+                       class_name.ToCString(),
+                       name.ToCString(),
+                       super_class_name.ToCString());
         }
       }
     }
@@ -1439,9 +1423,7 @@
         if (!super_class.IsNull()) {
           const String& class_name = String::Handle(cls.Name());
           const String& super_class_name = String::Handle(super_class.Name());
-          const Script& script = Script::Handle(cls.script());
-          ReportError(Error::Handle(),  // No previous error.
-                      script, function.token_pos(),
+          ReportError(cls, function.token_pos(),
                       "static setter '%s=' of class '%s' conflicts with "
                       "instance setter '%s=' of super class '%s'",
                       name.ToCString(),
@@ -1463,9 +1445,7 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(cls.Name());
         const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, function.token_pos(),
+        ReportError(cls, function.token_pos(),
                     "static %s '%s' of class '%s' conflicts with "
                     "instance member '%s' of super class '%s'",
                     (function.IsGetterFunction() ||
@@ -1483,9 +1463,7 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(cls.Name());
         const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, function.token_pos(),
+        ReportError(cls, function.token_pos(),
                     "getter '%s' of class '%s' conflicts with "
                     "method '%s' of super class '%s'",
                     name.ToCString(),
@@ -1501,9 +1479,7 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(cls.Name());
         const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, function.token_pos(),
+        ReportError(cls, function.token_pos(),
                     "method '%s' of class '%s' conflicts with "
                     "getter '%s' of super class '%s'",
                     name.ToCString(),
@@ -1967,10 +1943,8 @@
   // that the super class of the mixin class is class Object.
   GrowableArray<intptr_t> visited_mixins;
   if (!IsMixinCycleFree(mixin_class, &visited_mixins)) {
-    const Script& script = Script::Handle(mixin_class.script());
     const String& class_name = String::Handle(mixin_class.Name());
-    ReportError(Error::Handle(),  // No previous error.
-                script, mixin_class.token_pos(),
+    ReportError(mixin_class, mixin_class.token_pos(),
                 "mixin class '%s' illegally refers to itself",
                 class_name.ToCString());
   }
@@ -1986,10 +1960,8 @@
     mixin_super_class = mixin_super_class.SuperClass();
   }
   if (mixin_super_class.IsNull() || !mixin_super_class.IsObjectClass()) {
-    const Script& script = Script::Handle(mixin_app_class.script());
     const String& class_name = String::Handle(mixin_class.Name());
-    ReportError(Error::Handle(),  // No previous error.
-                script, mixin_app_class.token_pos(),
+    ReportError(mixin_app_class, mixin_app_class.token_pos(),
                 "mixin class '%s' must extend class 'Object'",
                 class_name.ToCString());
   }
@@ -2127,9 +2099,7 @@
     if (func.IsConstructor()) {
       // A mixin class must not have explicit constructors.
       if (!func.IsImplicitConstructor()) {
-        const Script& script = Script::Handle(isolate, cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, cls.token_pos(),
+        ReportError(cls, cls.token_pos(),
                     "mixin class '%s' must not have constructors\n",
                     String::Handle(isolate, mixin_cls.Name()).ToCString());
       }
@@ -2178,9 +2148,7 @@
   }
   if (!IsSuperCycleFree(cls)) {
     const String& name = String::Handle(cls.Name());
-    const Script& script = Script::Handle(cls.script());
-    ReportError(Error::Handle(),  // No previous error.
-                script, cls.token_pos(),
+    ReportError(cls, cls.token_pos(),
                 "class '%s' has a cycle in its superclass relationship",
                 name.ToCString());
   }
@@ -2212,9 +2180,7 @@
     GrowableArray<intptr_t> visited_aliases;
     if (!IsAliasCycleFree(cls, &visited_aliases)) {
       const String& name = String::Handle(cls.Name());
-      const Script& script = Script::Handle(cls.script());
-      ReportError(Error::Handle(),  // No previous error.
-                  script, cls.token_pos(),
+      ReportError(cls, cls.token_pos(),
                   "typedef '%s' illegally refers to itself",
                   name.ToCString());
     }
@@ -2248,9 +2214,7 @@
     ASSERT(interface_type.IsFinalized());
     ASSERT(super_type.IsNull() || super_type.IsFinalized());
     if (!super_type.IsNull() && interface_type.Equals(super_type)) {
-      const Script& script = Script::Handle(cls.script());
-      ReportError(Error::Handle(),  // No previous error.
-                  script, cls.token_pos(),
+      ReportError(cls, cls.token_pos(),
                   "super type '%s' may not be listed in "
                   "implements clause of class '%s'",
                   String::Handle(super_type.Name()).ToCString(),
@@ -2259,9 +2223,7 @@
     for (intptr_t j = 0; j < i; j++) {
       seen_interf ^= interface_types.At(j);
       if (interface_type.Equals(seen_interf)) {
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, cls.token_pos(),
+        ReportError(cls, cls.token_pos(),
                     "interface '%s' appears twice in "
                     "implements clause of class '%s'",
                     String::Handle(interface_type.Name()).ToCString(),
@@ -2500,10 +2462,8 @@
       return;
     }
     if (FLAG_error_on_bad_type) {
-      const Script& script = Script::Handle(cls.script());
       const String& type_class_name = String::Handle(type_class.Name());
-      ReportError(Error::Handle(),  // No previous error.
-                  script, type.token_pos(),
+      ReportError(cls, type.token_pos(),
                   "wrong number of type arguments for class '%s'",
                   type_class_name.ToCString());
     }
@@ -2672,9 +2632,7 @@
     if ((*visited)[i] == cls_index) {
       // We have already visited class 'cls'. We found a cycle.
       const String& class_name = String::Handle(isolate, cls.Name());
-      const Script& script = Script::Handle(isolate, cls.script());
-      ReportError(Error::Handle(isolate),  // No previous error.
-                  script, cls.token_pos(),
+      ReportError(cls, cls.token_pos(),
                   "cyclic reference found for class '%s'",
                   class_name.ToCString());
     }
@@ -2715,21 +2673,17 @@
     ReportError(Error::Handle(isolate, super_type.error()));
   }
   if (super_type.IsDynamicType()) {
-    const Script& script = Script::Handle(isolate, cls.script());
-    ReportError(Error::Handle(isolate),  // No previous error.
-                script, cls.token_pos(),
+    ReportError(cls, cls.token_pos(),
                 "class '%s' may not extend 'dynamic'",
                 String::Handle(isolate, cls.Name()).ToCString());
   }
   interface_class = super_type.type_class();
   if (interface_class.IsSignatureClass()) {
-    const Script& script = Script::Handle(isolate, cls.script());
-    ReportError(Error::Handle(isolate),  // No previous error.
-                script, cls.token_pos(),
+    ReportError(cls, cls.token_pos(),
                 "class '%s' may not extend function type alias '%s'",
                 String::Handle(isolate, cls.Name()).ToCString(),
                 String::Handle(isolate,
-                               super_type.UserVisibleName()).ToCString());
+                                  super_type.UserVisibleName()).ToCString());
   }
 
   // If cls belongs to core lib or to core lib's implementation, restrictions
@@ -2774,12 +2728,12 @@
       }
     }
     if (is_error) {
-      const Script& script = Script::Handle(isolate, cls.script());
-      ReportError(Error::Handle(isolate),  // No previous error.
-                  script, cls.token_pos(),
+      const String& interface_name = String::Handle(isolate,
+                                                    interface_class.Name());
+      ReportError(cls, cls.token_pos(),
                   "'%s' is not allowed to extend '%s'",
                   String::Handle(isolate, cls.Name()).ToCString(),
-                  String::Handle(isolate, interface_class.Name()).ToCString());
+                  interface_name.ToCString());
     }
   }
   // Now resolve the super interfaces of the super type.
@@ -2795,18 +2749,16 @@
       ReportError(Error::Handle(isolate, interface.error()));
     }
     if (interface.IsDynamicType()) {
-      const Script& script = Script::Handle(isolate, cls.script());
-      ReportError(Error::Handle(isolate),  // No previous error.
-                  script, cls.token_pos(),
+      ReportError(cls, cls.token_pos(),
                   "'dynamic' may not be used as interface");
     }
     interface_class = interface.type_class();
     if (interface_class.IsSignatureClass()) {
-      const Script& script = Script::Handle(isolate, cls.script());
-      ReportError(Error::Handle(isolate),  // No previous error.
-                  script, cls.token_pos(),
+      const String& interface_name = String::Handle(isolate,
+                                                    interface_class.Name());
+      ReportError(cls, cls.token_pos(),
                   "function type alias '%s' may not be used as interface",
-                  String::Handle(isolate, interface_class.Name()).ToCString());
+                  interface_name.ToCString());
     }
     // Verify that unless cls belongs to core lib, it cannot extend, implement,
     // or mixin any of Null, bool, num, int, double, String, dynamic.
@@ -2818,17 +2770,14 @@
           interface.IsDoubleType() ||
           interface.IsStringType() ||
           interface.IsDynamicType()) {
-        const Script& script = Script::Handle(isolate, cls.script());
         const String& interface_name = String::Handle(isolate,
                                                       interface_class.Name());
         if (cls.IsMixinApplication()) {
-          ReportError(Error::Handle(isolate),  // No previous error.
-                      script, cls.token_pos(),
+          ReportError(cls, cls.token_pos(),
                       "illegal mixin of '%s'",
                       interface_name.ToCString());
         } else {
-          ReportError(Error::Handle(isolate),  // No previous error.
-                      script, cls.token_pos(),
+          ReportError(cls, cls.token_pos(),
                       "'%s' is not allowed to extend or implement '%s'",
                       String::Handle(isolate, cls.Name()).ToCString(),
                       interface_name.ToCString());
@@ -2857,9 +2806,7 @@
     if (!field.is_static() && !field.is_final()) {
       const String& class_name = String::Handle(cls.Name());
       const String& field_name = String::Handle(field.name());
-      const Script& script = Script::Handle(cls.script());
-      ReportError(Error::Handle(),  // No previous error.
-                  script, field.token_pos(),
+      ReportError(cls, field.token_pos(),
                   "const class '%s' has non-final field '%s'",
                   class_name.ToCString(), field_name.ToCString());
     }
@@ -2914,15 +2861,15 @@
 }
 
 // Either report an error or mark the type as malformed.
-void ClassFinalizer::ReportMalformedType(const Error& prev_error,
-                                         const Script& script,
-                                         const Type& type,
-                                         const char* format,
-                                         va_list args) {
+void ClassFinalizer::MarkTypeMalformed(const Error& prev_error,
+                                       const Script& script,
+                                       const Type& type,
+                                       const char* format,
+                                       va_list args) {
   LanguageError& error = LanguageError::Handle(
       LanguageError::NewFormattedV(
           prev_error, script, type.token_pos(),
-          LanguageError::kMalformedType, Heap::kOld,
+          Report::kMalformedType, Heap::kOld,
           format, args));
   if (FLAG_error_on_bad_type) {
     ReportError(error);
@@ -2955,7 +2902,7 @@
                            type_pos));
   const Type& type = Type::Handle(
       Type::New(unresolved_class, TypeArguments::Handle(), type_pos));
-  ReportMalformedType(prev_error, script, type, format, args);
+  MarkTypeMalformed(prev_error, script, type, format, args);
   va_end(args);
   ASSERT(type.IsMalformed());
   ASSERT(type.IsFinalized());
@@ -2969,7 +2916,7 @@
                                            const char* format, ...) {
   va_list args;
   va_start(args, format);
-  ReportMalformedType(prev_error, script, type, format, args);
+  MarkTypeMalformed(prev_error, script, type, format, args);
   va_end(args);
 }
 
@@ -2983,7 +2930,7 @@
   LanguageError& error = LanguageError::Handle(
       LanguageError::NewFormattedV(
           prev_error, script, type.token_pos(),
-          LanguageError::kMalboundedType, Heap::kOld,
+          Report::kMalboundedType, Heap::kOld,
           format, args));
   va_end(args);
   if (FLAG_error_on_bad_type) {
@@ -2998,24 +2945,33 @@
 
 
 void ClassFinalizer::ReportError(const Error& error) {
-  Isolate::Current()->long_jump_base()->Jump(1, error);
+  Report::LongJump(error);
   UNREACHABLE();
 }
 
 
-void ClassFinalizer::ReportError(const Error& prev_error,
-                                 const Script& script,
+void ClassFinalizer::ReportErrors(const Error& prev_error,
+                                  const Class& cls,
+                                  intptr_t token_pos,
+                                  const char* format, ...) {
+  va_list args;
+  va_start(args, format);
+  const Script& script = Script::Handle(cls.script());
+  Report::LongJumpV(prev_error, script, token_pos, format, args);
+  va_end(args);
+  UNREACHABLE();
+}
+
+
+void ClassFinalizer::ReportError(const Class& cls,
                                  intptr_t token_pos,
                                  const char* format, ...) {
   va_list args;
   va_start(args, format);
-  Error& error = Error::Handle(
-      LanguageError::NewFormattedV(
-          prev_error, script, token_pos,
-          LanguageError::kError, Heap::kNew,
-          format, args));
+  const Script& script = Script::Handle(cls.script());
+  Report::MessageV(Report::kError, script, token_pos, format, args);
   va_end(args);
-  ReportError(error);
+  UNREACHABLE();
 }
 
 
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index 92740ca..5987a48 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -162,16 +162,19 @@
   static void PrintClassInformation(const Class& cls);
   static void CollectInterfaces(const Class& cls,
                                 const GrowableObjectArray& interfaces);
-  static void ReportMalformedType(const Error& prev_error,
-                                  const Script& script,
-                                  const Type& type,
-                                  const char* format,
-                                  va_list args);
+  static void MarkTypeMalformed(const Error& prev_error,
+                                const Script& script,
+                                const Type& type,
+                                const char* format,
+                                va_list args);
   static void ReportError(const Error& error);
-  static void ReportError(const Error& prev_error,
-                          const Script& script,
-                          intptr_t token_index,
-                          const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
+  static void ReportError(const Class& cls,
+                          intptr_t token_pos,
+                          const char* format, ...) PRINTF_ATTRIBUTE(3, 4);
+  static void ReportErrors(const Error& prev_error,
+                           const Class& cls,
+                           intptr_t token_pos,
+                           const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
 
   // Verify implicit offsets recorded in the VM for direct access to fields of
   // Dart instances (e.g: _TypedListView, _ByteDataView).
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index e5e3a0b..7c307b7 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -358,6 +358,7 @@
       "dateLastServiceGC",
       "%" Pd64 "",
       isolate->last_allocationprofile_gc_timestamp());
+
   {
     JSONObject heaps(&obj, "heaps");
     {
@@ -373,7 +374,7 @@
     for (intptr_t i = 1; i < top_; i++) {
       const ClassHeapStats* stats = StatsWithUpdatedSize(i);
       if (stats != NULL) {
-       JSONObject obj(&arr);
+        JSONObject obj(&arr);
         cls = At(i);
         stats->PrintToJSONObject(cls, &obj);
       }
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 417a905..6ee1098 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -19,6 +19,7 @@
 #include "vm/message.h"
 #include "vm/message_handler.h"
 #include "vm/parser.h"
+#include "vm/report.h"
 #include "vm/resolver.h"
 #include "vm/runtime_entry.h"
 #include "vm/stack_frame.h"
@@ -32,10 +33,10 @@
     " native entries.");
 DEFINE_FLAG(int, max_subtype_cache_entries, 100,
     "Maximum number of subtype cache entries (number of checks cached).");
-DEFINE_FLAG(int, optimization_counter_threshold, 15000,
+DEFINE_FLAG(int, optimization_counter_threshold, 30000,
     "Function's usage-counter value before it is optimized, -1 means never");
 DEFINE_FLAG(charp, optimization_filter, NULL, "Optimize only named function");
-DEFINE_FLAG(int, reoptimization_counter_threshold, 2000,
+DEFINE_FLAG(int, reoptimization_counter_threshold, 4000,
     "Counter threshold before a function gets reoptimized.");
 DEFINE_FLAG(bool, stop_on_excessive_deoptimization, false,
     "Debugging: stops program if deoptimizing same function too often");
@@ -574,10 +575,10 @@
   String& dst_type_name = String::Handle();
   LanguageError& error = LanguageError::Handle(dst_type.error());
   ASSERT(!error.IsNull());
-  if (error.kind() == LanguageError::kMalformedType) {
+  if (error.kind() == Report::kMalformedType) {
     dst_type_name = Symbols::Malformed().raw();
   } else {
-    ASSERT(error.kind() == LanguageError::kMalboundedType);
+    ASSERT(error.kind() == Report::kMalboundedType);
     dst_type_name = Symbols::Malbounded().raw();
   }
   const String& error_message = String::ZoneHandle(
@@ -589,15 +590,18 @@
 
 
 DEFINE_RUNTIME_ENTRY(Throw, 1) {
-  const Instance& exception = Instance::CheckedHandle(arguments.ArgAt(0));
-  Exceptions::Throw(exception);
+  const Instance& exception =
+      Instance::CheckedHandle(isolate, arguments.ArgAt(0));
+  Exceptions::Throw(isolate, exception);
 }
 
 
 DEFINE_RUNTIME_ENTRY(ReThrow, 2) {
-  const Instance& exception = Instance::CheckedHandle(arguments.ArgAt(0));
-  const Instance& stacktrace = Instance::CheckedHandle(arguments.ArgAt(1));
-  Exceptions::ReThrow(exception, stacktrace);
+  const Instance& exception =
+      Instance::CheckedHandle(isolate, arguments.ArgAt(0));
+  const Instance& stacktrace =
+      Instance::CheckedHandle(isolate, arguments.ArgAt(1));
+  Exceptions::ReThrow(isolate, exception, stacktrace);
 }
 
 
@@ -803,18 +807,6 @@
 }
 
 
-static void JSWarning(const ICData& ic_data, const char* msg) {
-  DartFrameIterator iterator;
-  StackFrame* caller_frame = iterator.NextFrame();
-  ASSERT(caller_frame != NULL);
-  // Report warning only if not already reported at this location.
-  if (!ic_data.IssuedJSWarning()) {
-    ic_data.SetIssuedJSWarning();
-    Exceptions::JSWarning(caller_frame, "%s", msg);
-  }
-}
-
-
 // Handles inline cache misses by updating the IC data array of the call site.
 //   Arg0: Receiver object.
 //   Arg1: IC data object.
@@ -830,9 +822,10 @@
         String::Handle(ic_data.target_name()).Equals(Symbols::toString())) {
       const double value = Double::Cast(receiver).value();
       if (floor(value) == value) {
-        JSWarning(ic_data,
-                  "string representation of an integral value of type "
-                  "'double' has no decimal mark and no fractional part");
+        Report::JSWarningFromIC(ic_data,
+                                "string representation of an integral value "
+                                "of type 'double' has no decimal mark and "
+                                "no fractional part");
       }
     }
   }
@@ -1064,7 +1057,7 @@
     // into dart code.
     const Instance& exception =
         Instance::Handle(isolate->object_store()->stack_overflow());
-    Exceptions::Throw(exception);
+    Exceptions::Throw(isolate, exception);
     UNREACHABLE();
   }
 
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index b8805f8..9c2822a 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -60,8 +60,6 @@
 
 DECLARE_FLAG(bool, trace_failed_optimization_attempts);
 DECLARE_FLAG(bool, trace_patching);
-DECLARE_FLAG(bool, warn_on_javascript_compatibility);
-DECLARE_FLAG(bool, warning_as_error);
 
 // Compile a function. Should call only if the function has not been compiled.
 //   Arg0: function object.
@@ -241,6 +239,7 @@
 }
 
 
+
 // Return false if bailed out.
 static bool CompileParsedFunctionHelper(ParsedFunction* parsed_function,
                                         bool optimized,
@@ -276,21 +275,20 @@
         TimerScope timer(FLAG_compiler_stats,
                          &CompilerStats::graphbuilder_timer,
                          isolate);
-        Array& ic_data_array = Array::Handle();
+        ZoneGrowableArray<const ICData*>* ic_data_array =
+            new(isolate) ZoneGrowableArray<const ICData*>();
         if (optimized) {
           ASSERT(function.HasCode());
           // Extract type feedback before the graph is built, as the graph
           // builder uses it to attach it to nodes.
           ASSERT(function.deoptimization_counter() <
                  FLAG_deoptimization_counter_threshold);
-          const Code& unoptimized_code =
-              Code::Handle(function.unoptimized_code());
-          ic_data_array = unoptimized_code.ExtractTypeFeedbackArray();
+          function.RestoreICDataMap(ic_data_array);
         }
 
         // Build the flow graph.
         FlowGraphBuilder builder(parsed_function,
-                                 ic_data_array,
+                                 *ic_data_array,
                                  NULL,  // NULL = not inlining.
                                  osr_id,
                                  optimized);
@@ -453,7 +451,7 @@
           // We have to perform range analysis after LICM because it
           // optimistically moves CheckSmi through phis into loop preheaders
           // making some phis smi.
-          optimizer.InferSmiRanges();
+          optimizer.InferIntRanges();
           DEBUG_ASSERT(flow_graph->VerifyUseLists());
         }
 
@@ -479,6 +477,7 @@
         optimizer.EliminateEnvironments();
 
         DeadCodeElimination::EliminateDeadPhis(flow_graph);
+        DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
         // Attempt to sink allocations of temporary non-escaping objects to
         // the deoptimization path.
@@ -489,6 +488,7 @@
           sinking = new AllocationSinking(flow_graph);
           sinking->Optimize();
         }
+        DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
         // Ensure that all phis inserted by optimization passes have consistent
         // representations.
@@ -574,7 +574,10 @@
             const Field* field = (*flow_graph->guarded_fields())[i];
             field->RegisterDependentCode(code);
           }
-        } else {
+        } else {  // not optimized.
+          if (function.ic_data_array() == Array::null()) {
+            function.SaveICDataMap(graph_compiler.deopt_id_to_ic_data());
+          }
           function.set_unoptimized_code(code);
           function.AttachCode(code);
           ASSERT(CodePatcher::CodeIsPatchable(code));
@@ -608,14 +611,12 @@
           OS::Print("%s\n", error.ToErrorCString());
         }
         done = true;
-        ASSERT(optimized ||
-               (FLAG_warn_on_javascript_compatibility &&
-                FLAG_warning_as_error));
+        ASSERT(optimized);
       }
 
       // Clear the error if it was not a real error, but just a bailout.
       if (error.IsLanguageError() &&
-          (LanguageError::Cast(error).kind() == LanguageError::kBailout)) {
+          (LanguageError::Cast(error).kind() == Report::kBailout)) {
         isolate->object_store()->clear_sticky_error();
       }
       is_compiled = false;
@@ -765,7 +766,7 @@
     TIMERSCOPE(isolate, time_compilation);
     Timer per_compile_timer(FLAG_trace_compiler, "Compilation time");
     per_compile_timer.Start();
-    ParsedFunction* parsed_function = new ParsedFunction(
+    ParsedFunction* parsed_function = new(isolate) ParsedFunction(
         isolate, Function::ZoneHandle(isolate, function.raw()));
     if (FLAG_trace_compiler) {
       OS::Print("Compiling %s%sfunction: '%s' @ token %" Pd ", size %" Pd "\n",
@@ -796,14 +797,7 @@
         function.SetIsOptimizable(false);
         return Error::null();
       }
-      // So far, the only possible real error is a JS warning reported as error.
-      ASSERT(FLAG_warn_on_javascript_compatibility && FLAG_warning_as_error);
-      Error& error = Error::Handle();
-      // We got an error during compilation.
-      error = isolate->object_store()->sticky_error();
-      ASSERT(!error.IsNull());
-      isolate->object_store()->clear_sticky_error();
-      return error.raw();
+      UNREACHABLE();
     }
 
     per_compile_timer.Stop();
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index f5e76ef..7874083 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -138,6 +138,62 @@
   NOT_CARRY     = ABOVE_EQUAL
 };
 
+#define R(reg) (1 << (reg))
+
+#if defined(_WIN64)
+class CallingConventions {
+ public:
+  static const Register kArg1Reg = RCX;
+  static const Register kArg2Reg = RDX;
+  static const Register kArg3Reg = R8;
+  static const Register kArg4Reg = R9;
+  static const intptr_t kShadowSpaceBytes = 4 * kWordSize;
+
+  static const intptr_t kVolatileCpuRegisters =
+      R(RAX) | R(RCX) | R(RDX) | R(R8) | R(R9) | R(R10) | R(R11);
+
+  static const intptr_t kVolatileXmmRegisters =
+      R(XMM0) | R(XMM1) | R(XMM2) | R(XMM3) | R(XMM4) | R(XMM5);
+
+  static const intptr_t kCalleeSaveCpuRegisters =
+      R(RBX) | R(RSI) | R(RDI) | R(R12) | R(R13) | R(R14) | R(R15);
+
+  static const intptr_t kCalleeSaveXmmRegisters =
+      R(XMM6) | R(XMM7) | R(XMM8) | R(XMM9) | R(XMM10) | R(XMM11) | R(XMM12) |
+      R(XMM13) | R(XMM14) | R(XMM15);
+
+  // Windows x64 ABI specifies that small objects are passed in registers.
+  // Otherwise they are passed by reference.
+  static const size_t kRegisterTransferLimit = 16;
+};
+#else
+class CallingConventions {
+ public:
+  static const Register kArg1Reg = RDI;
+  static const Register kArg2Reg = RSI;
+  static const Register kArg3Reg = RDX;
+  static const Register kArg4Reg = RCX;
+  static const Register kArg5Reg = R8;
+  static const Register kArg6Reg = R9;
+  static const intptr_t kShadowSpaceBytes = 0;
+
+  static const intptr_t kVolatileCpuRegisters =
+      R(RAX) | R(RCX) | R(RDX) | R(RSI) | R(RDI) |
+      R(R8) | R(R9) | R(R10) | R(R11);
+
+  static const intptr_t kVolatileXmmRegisters =
+      R(XMM0) | R(XMM1) | R(XMM2) | R(XMM3) | R(XMM4) |
+      R(XMM5) | R(XMM6) | R(XMM7) | R(XMM8) | R(XMM9) |
+      R(XMM10) | R(XMM11) | R(XMM12) | R(XMM13) | R(XMM14) | R(XMM15);
+
+  static const intptr_t kCalleeSaveCpuRegisters =
+      R(RBX) | R(R12) | R(R13) | R(R14) | R(R15);
+
+  static const intptr_t kCalleeSaveXmmRegisters = 0;
+};
+#endif
+
+#undef R
 
 class Instr {
  public:
diff --git a/runtime/vm/counters.cc b/runtime/vm/counters.cc
new file mode 100644
index 0000000..7e43d9a
--- /dev/null
+++ b/runtime/vm/counters.cc
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/counters.h"
+
+#include <string.h>
+#include <map>  // TODO(koda): Remove STL dependencies.
+
+#include "platform/globals.h"
+#include "vm/os.h"
+
+namespace dart {
+
+struct CStrLess {
+  bool operator()(const char* a, const char* b) const {
+    return strcmp(a, b) < 0;
+  }
+};
+
+
+Counters::~Counters() {
+  if (collision_) {
+    OS::PrintErr("Counters table collision; increase Counters::kSize.");
+    return;
+  }
+  typedef std::map<const char*, int64_t, CStrLess> TotalsMap;
+  TotalsMap totals;
+  for (int i = 0; i < kSize; ++i) {
+    const Counter& counter = counters_[i];
+    if (counter.name != NULL) {
+      totals[counter.name] += counter.value;
+    }
+  }
+  for (TotalsMap::iterator it = totals.begin(); it != totals.end(); ++it) {
+    OS::PrintErr("%s: %" Pd64 "\n", it->first, it->second);
+  }
+}
+
+}  // namespace dart
diff --git a/runtime/vm/counters.h b/runtime/vm/counters.h
new file mode 100644
index 0000000..ee79b69
--- /dev/null
+++ b/runtime/vm/counters.h
@@ -0,0 +1,51 @@
+// 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.
+
+#ifndef VM_COUNTERS_H_
+#define VM_COUNTERS_H_
+
+#include "platform/assert.h"
+
+namespace dart {
+
+struct Counter {
+  Counter() : name(NULL), value(0) {}
+  const char* name;
+  int64_t value;
+};
+
+
+// Light-weight stats counters for temporary experiments/debugging.
+// A single statement is enough to add a counter:
+//   ...
+//   Isolate::Current()->counters()->Increment("allocated", size_in_bytes);
+//   ...
+class Counters {
+ public:
+  Counters() : collision_(false) {}
+
+  // Adds 'delta' to the named counter. 'name' must be a literal string.
+  void Increment(const char* name, int64_t delta) {
+    Counter& counter =
+      counters_[reinterpret_cast<uword>(name) & (kSize - 1)];
+    if (counter.name != name && counter.name != NULL) {
+      collision_ = true;
+    }
+    counter.name = name;
+    counter.value += delta;
+  }
+
+  // Prints all counters to stderr.
+  ~Counters();
+
+ private:
+  enum { kSize = 1024 };
+  COMPILE_ASSERT((0 == (kSize & (kSize - 1))));  // kSize is a power of 2.
+  Counter counters_[kSize];
+  bool collision_;
+};
+
+}  // namespace dart
+
+#endif  // VM_COUNTERS_H_
diff --git a/runtime/vm/coverage.cc b/runtime/vm/coverage.cc
index 0ea8bda..3d546a5 100644
--- a/runtime/vm/coverage.cc
+++ b/runtime/vm/coverage.cc
@@ -18,8 +18,38 @@
             "Enable writing coverage data into specified directory.");
 
 
+// map[token_pos] -> line-number.
+static void ComputeTokenPosToLineNumberMap(const Script& script,
+                                           GrowableArray<intptr_t>* map) {
+  const TokenStream& tkns = TokenStream::Handle(script.tokens());
+  const intptr_t len = ExternalTypedData::Handle(tkns.GetStream()).Length();
+  map->SetLength(len);
+#if defined(DEBUG)
+  for (intptr_t i = 0; i < len; i++) {
+    (*map)[i] = -1;
+  }
+#endif
+  TokenStream::Iterator tkit(tkns, 0, TokenStream::Iterator::kAllTokens);
+  intptr_t cur_line = script.line_offset() + 1;
+  while (tkit.CurrentTokenKind() != Token::kEOS) {
+    (*map)[tkit.CurrentPosition()] = cur_line;
+    if (tkit.CurrentTokenKind() == Token::kNEWLINE) {
+      cur_line++;
+    }
+    tkit.Advance();
+  }
+}
+
+
+static inline void PrintJSONPreamble(JSONObject* jsobj) {
+  jsobj->AddProperty("type", "CodeCoverage");
+  jsobj->AddProperty("id", "coverage");
+}
+
+
 void CodeCoverage::CompileAndAdd(const Function& function,
-                                 const JSONArray& hits_arr) {
+                                 const JSONArray& hits_arr,
+                                 const GrowableArray<intptr_t>& pos_to_line) {
   Isolate* isolate = Isolate::Current();
   if (!function.HasCode()) {
     // If the function should not be compiled or if the compilation failed,
@@ -33,26 +63,28 @@
       // TODO(iposva): This can arise if we attempt to compile an inner function
       // before we have compiled its enclosing function or if the enclosing
       // function failed to compile.
-      OS::Print("### Coverage skipped compiling: %s\n", function.ToCString());
       return;
     }
     const Error& err = Error::Handle(
         isolate, Compiler::CompileFunction(isolate, function));
     if (!err.IsNull()) {
-      OS::Print("### Coverage failed compiling:\n%s\n", err.ToErrorCString());
       return;
     }
   }
   ASSERT(function.HasCode());
 
   // Print the hit counts for all IC datas.
-  const Script& script = Script::Handle(function.script());
+  ZoneGrowableArray<const ICData*>* ic_data_array =
+      new(isolate) ZoneGrowableArray<const ICData*>();
+  function.RestoreICDataMap(ic_data_array);
   const Code& code = Code::Handle(function.unoptimized_code());
-  const Array& ic_array = Array::Handle(code.ExtractTypeFeedbackArray());
   const PcDescriptors& descriptors = PcDescriptors::Handle(
       code.pc_descriptors());
-  ICData& ic_data = ICData::Handle();
 
+  const intptr_t begin_pos = function.token_pos();
+  const intptr_t end_pos = function.end_token_pos();
+  intptr_t last_line = -1;
+  intptr_t last_count = 0;
   for (int j = 0; j < descriptors.Length(); j++) {
     HANDLESCOPE(isolate);
     PcDescriptors::Kind kind = descriptors.DescriptorKind(j);
@@ -60,35 +92,71 @@
     if ((kind == PcDescriptors::kIcCall) ||
         (kind == PcDescriptors::kUnoptStaticCall)) {
       intptr_t deopt_id = descriptors.DeoptId(j);
-      ic_data ^= ic_array.At(deopt_id);
-      if (!ic_data.IsNull()) {
+      const ICData* ic_data= (*ic_data_array)[deopt_id];
+      if (!ic_data->IsNull()) {
         intptr_t token_pos = descriptors.TokenPos(j);
-        intptr_t line = -1;
-        script.GetTokenLocation(token_pos, &line, NULL);
-        hits_arr.AddValue(line);
-        hits_arr.AddValue(ic_data.AggregateCount());
+        // Filter out descriptors that do not map to tokens in the source code.
+        if (token_pos < begin_pos ||
+            token_pos > end_pos) {
+          continue;
+        }
+        intptr_t line = pos_to_line[token_pos];
+#if defined(DEBUG)
+        const Script& script = Script::Handle(function.script());
+        intptr_t test_line = -1;
+        script.GetTokenLocation(token_pos, &test_line, NULL);
+        ASSERT(test_line == line);
+#endif
+        // Merge hit data where possible.
+        if (last_line == line) {
+          last_count += ic_data->AggregateCount();
+        } else {
+          if (last_line != -1) {
+            hits_arr.AddValue(last_line);
+            hits_arr.AddValue(last_count);
+          }
+          last_count = ic_data->AggregateCount();
+          last_line = line;
+        }
       }
     }
   }
+  // Write last hit value if needed.
+  if (last_line != -1) {
+    hits_arr.AddValue(last_line);
+    hits_arr.AddValue(last_count);
+  }
 }
 
 
-void CodeCoverage::PrintClass(const Class& cls, const JSONArray& jsarr) {
+void CodeCoverage::PrintClass(const Class& cls,
+                              const JSONArray& jsarr,
+                              const Script& script_filter) {
   Isolate* isolate = Isolate::Current();
+  if (cls.EnsureIsFinalized(isolate) != Error::null()) {
+    // Only classes that have been finalized do have a meaningful list of
+    // functions.
+    return;
+  }
   Array& functions = Array::Handle(cls.functions());
   ASSERT(!functions.IsNull());
   Function& function = Function::Handle();
   Script& script = Script::Handle();
   String& saved_url = String::Handle();
   String& url = String::Handle();
-
+  GrowableArray<intptr_t> pos_to_line;
   int i = 0;
   while (i < functions.Length()) {
     HANDLESCOPE(isolate);
     function ^= functions.At(i);
-    JSONObject jsobj(&jsarr);
     script = function.script();
+    if (!script_filter.IsNull() && script_filter.raw() != script.raw()) {
+      i++;
+      continue;
+    }
     saved_url = script.url();
+    ComputeTokenPosToLineNumberMap(script, &pos_to_line);
+    JSONObject jsobj(&jsarr);
     jsobj.AddProperty("source", saved_url.ToCString());
     jsobj.AddProperty("script", script);
     JSONArray hits_arr(&jsobj, "hits");
@@ -100,12 +168,13 @@
       script = function.script();
       url = script.url();
       if (!url.Equals(saved_url)) {
+        pos_to_line.Clear();
         break;
       }
-      CompileAndAdd(function, hits_arr);
+      CompileAndAdd(function, hits_arr, pos_to_line);
       if (function.HasImplicitClosureFunction()) {
         function = function.ImplicitClosureFunction();
-        CompileAndAdd(function, hits_arr);
+        CompileAndAdd(function, hits_arr, pos_to_line);
       }
       i++;
     }
@@ -115,14 +184,20 @@
       GrowableObjectArray::Handle(cls.closures());
   if (!closures.IsNull()) {
     i = 0;
+    pos_to_line.Clear();
     // We need to keep rechecking the length of the closures array, as handling
     // a closure potentially adds new entries to the end.
     while (i < closures.Length()) {
       HANDLESCOPE(isolate);
       function ^= closures.At(i);
-      JSONObject jsobj(&jsarr);
       script = function.script();
+      if (!script_filter.IsNull() && script_filter.raw() != script.raw()) {
+        i++;
+        continue;
+      }
       saved_url = script.url();
+      ComputeTokenPosToLineNumberMap(script, &pos_to_line);
+      JSONObject jsobj(&jsarr);
       jsobj.AddProperty("source", saved_url.ToCString());
       jsobj.AddProperty("script", script);
       JSONArray hits_arr(&jsobj, "hits");
@@ -134,9 +209,10 @@
         script = function.script();
         url = script.url();
         if (!url.Equals(saved_url)) {
+          pos_to_line.Clear();
           break;
         }
-        CompileAndAdd(function, hits_arr);
+        CompileAndAdd(function, hits_arr, pos_to_line);
         i++;
       }
     }
@@ -144,6 +220,44 @@
 }
 
 
+void CodeCoverage::PrintJSONForClass(const Class& cls,
+                                     JSONStream* stream) {
+  JSONObject coverage(stream);
+  PrintJSONPreamble(&coverage);
+  {
+    JSONArray jsarr(&coverage, "coverage");
+    PrintClass(cls, jsarr, Script::Handle());
+  }
+}
+
+
+void CodeCoverage::PrintJSONForLibrary(const Library& lib,
+                                       const Script& script_filter,
+                                       JSONStream* stream) {
+  Class& cls = Class::Handle();
+  JSONObject coverage(stream);
+  PrintJSONPreamble(&coverage);
+  {
+    JSONArray jsarr(&coverage, "coverage");
+    ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
+    while (it.HasNext()) {
+      cls = it.GetNextClass();
+      ASSERT(!cls.IsNull());
+      PrintClass(cls, jsarr, script_filter);
+    }
+  }
+}
+
+
+void CodeCoverage::PrintJSONForScript(const Script& script,
+                                      JSONStream* stream) {
+  Library& lib = Library::Handle();
+  lib = script.FindLibrary();
+  ASSERT(!lib.IsNull());
+  PrintJSONForLibrary(lib, script, stream);
+}
+
+
 void CodeCoverage::Write(Isolate* isolate) {
   if (FLAG_coverage_dir == NULL) {
     return;
@@ -191,11 +305,8 @@
       ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
       while (it.HasNext()) {
         cls = it.GetNextClass();
-        if (cls.EnsureIsFinalized(isolate) == Error::null()) {
-          // Only classes that have been finalized do have a meaningful list of
-          // functions.
-          PrintClass(cls, jsarr);
-        }
+        ASSERT(!cls.IsNull());
+        PrintClass(cls, jsarr, Script::Handle());
       }
     }
   }
diff --git a/runtime/vm/coverage.h b/runtime/vm/coverage.h
index 4e03c35..72c639a 100644
--- a/runtime/vm/coverage.h
+++ b/runtime/vm/coverage.h
@@ -15,19 +15,31 @@
 // Forward declarations.
 class Class;
 class Function;
+template <typename T> class GrowableArray;
 class Isolate;
 class JSONArray;
 class JSONStream;
+class Library;
+class Script;
+class String;
 
 class CodeCoverage : public AllStatic {
  public:
   static void Write(Isolate* isolate);
   static void PrintJSON(Isolate* isolate, JSONStream* stream);
 
+  static void PrintJSONForScript(const Script& script, JSONStream* stream);
+  static void PrintJSONForLibrary(
+      const Library& lib, const Script& script_filter, JSONStream* stream);
+  static void PrintJSONForClass(const Class& lib, JSONStream* stream);
+
  private:
-  static void PrintClass(const Class& cls, const JSONArray& arr);
+  static void PrintClass(const Class& cls,
+                         const JSONArray& arr,
+                         const Script& script_filter);
   static void CompileAndAdd(const Function& function,
-                            const JSONArray& hits_arr);
+                            const JSONArray& hits_arr,
+                            const GrowableArray<intptr_t>& pos_to_line);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/coverage_test.cc b/runtime/vm/coverage_test.cc
new file mode 100644
index 0000000..7d8e447
--- /dev/null
+++ b/runtime/vm/coverage_test.cc
@@ -0,0 +1,80 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/coverage.h"
+#include "vm/dart_api_impl.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+static void ExecuteScript(const char* script) {
+  Dart_Handle h_lib = TestCase::LoadTestScript(script, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+}
+
+
+TEST_CASE(Coverage_Empty) {
+  const char* kScript =
+      "main() {\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  ExecuteScript(kScript);
+
+  JSONStream js;
+  CodeCoverage::PrintJSON(isolate, &js);
+
+  EXPECT_SUBSTRING(
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[]}", js.ToCString());
+}
+
+
+TEST_CASE(Coverage_MainWithClass) {
+  const char* kScript =
+      "class Foo {\n"
+      "  var x;\n"
+      "  Foo(this.x);\n"
+      "  bar() {\n"
+      "    x = x * x;\n"
+      "    x = x / 13;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  var foo = new Foo(7);\n"
+      "  foo.bar();\n"
+      "}\n";
+
+  Isolate* isolate = Isolate::Current();
+  ExecuteScript(kScript);
+
+  JSONStream js;
+  CodeCoverage::PrintJSON(isolate, &js);
+
+  // Coverage data is printed per class, i.e., there should be two sections
+  // for test-lib in the JSON data.
+
+  // Data for the actual class Foo.
+  EXPECT_SUBSTRING(
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[3,1,5,4,6,3]}", js.ToCString());
+
+  // Data for the fake class containing main().
+  EXPECT_SUBSTRING(
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[10,1,11,1]}", js.ToCString());
+}
+
+}  // namespace dart
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 66e9601..89bbd07 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -30,11 +30,11 @@
 
 namespace dart {
 
-DEFINE_FLAG(int, new_gen_heap_size, 32, "new gen heap size in MB,"
-            "e.g: --new_gen_heap_size=64 allocates a 64MB new gen heap");
+DEFINE_FLAG(int, new_gen_semi_max_size, (kWordSize <= 4) ? 16 : 32,
+            "Max size of new gen semi space in MB");
 DEFINE_FLAG(int, old_gen_heap_size, Heap::kHeapSizeInMB,
-            "old gen heap size in MB,"
-            "e.g: --old_gen_heap_size=1024 allocates a 1024MB old gen heap");
+            "Max size of old gen heap size in MB,"
+            "e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap");
 
 DECLARE_FLAG(bool, print_class_table);
 DECLARE_FLAG(bool, trace_isolates);
@@ -107,6 +107,7 @@
   CodeObservers::InitOnce();
   ThreadInterrupter::InitOnce();
   Profiler::InitOnce();
+  SemiSpace::InitOnce();
 
 #if defined(USING_SIMULATOR)
   Simulator::InitOnce();
@@ -212,7 +213,7 @@
   StackZone zone(isolate);
   HandleScope handle_scope(isolate);
   Heap::Init(isolate,
-             FLAG_new_gen_heap_size * MBInWords,
+             FLAG_new_gen_semi_max_size * MBInWords,
              FLAG_old_gen_heap_size * MBInWords);
   ObjectIdRing::Init(isolate);
   ObjectStore::Init(isolate);
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index e849594..c9895b6 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -508,7 +508,7 @@
       if (native_fields == TypedData::null()) {
         *value = 0;
       } else {
-        *value = *bit_cast<intptr_t*, uint8_t*>(native_fields->ptr()->data_);
+        *value = *bit_cast<intptr_t*, uint8_t*>(native_fields->ptr()->data());
       }
       return true;
     }
@@ -593,7 +593,7 @@
         memset(field_values, 0, (num_fields * sizeof(field_values[0])));
       } else if (num_fields == Smi::Value(native_fields->ptr()->length_)) {
         intptr_t* native_values =
-            bit_cast<intptr_t*, uint8_t*>(native_fields->ptr()->data_);
+            bit_cast<intptr_t*, uint8_t*>(native_fields->ptr()->data());
         memmove(field_values,
                 native_values,
                 (num_fields * sizeof(field_values[0])));
@@ -947,20 +947,16 @@
     void* peer,
     intptr_t external_allocation_size,
     Dart_WeakPersistentHandleFinalizer callback) {
-  ApiState* state = isolate->api_state();
-  ASSERT(state != NULL);
   REUSABLE_OBJECT_HANDLESCOPE(isolate);
   Object& ref = isolate->ObjectHandle();
   ref = Api::UnwrapHandle(object);
-  FinalizablePersistentHandle* finalizable_ref = is_prologue ?
-      state->prologue_weak_persistent_handles().AllocateHandle() :
-      state->weak_persistent_handles().AllocateHandle();
-
-  finalizable_ref->set_raw(ref);
-  finalizable_ref->set_peer(peer);
-  finalizable_ref->set_callback(callback);
-  finalizable_ref->SetExternalSize(external_allocation_size, isolate);
-  finalizable_ref->SetPrologueWeakPersistent(is_prologue);
+  FinalizablePersistentHandle* finalizable_ref =
+      FinalizablePersistentHandle::New(isolate,
+                                       is_prologue,
+                                       ref,
+                                       peer,
+                                       callback,
+                                       external_allocation_size);
   return finalizable_ref->apiHandle();
 }
 
@@ -1978,7 +1974,7 @@
   // Fast path for Smis.
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
-  if (Smi::IsValid64(value)) {
+  if (Smi::IsValid(value)) {
     NOHANDLESCOPE(isolate);
     return Api::NewHandle(isolate, Smi::New(static_cast<intptr_t>(value)));
   }
@@ -2702,7 +2698,7 @@
     state->UnwindScopes(isolate->top_exit_frame_info());
     saved_exception = &Instance::Handle(raw_exception);
   }
-  Exceptions::Throw(*saved_exception);
+  Exceptions::Throw(isolate, *saved_exception);
   const String& message = String::Handle(
           String::New("Exception was not thrown, internal error"));
   return ApiError::New(message);
@@ -3179,7 +3175,7 @@
     return ext_data;
   }
   Object& result = Object::Handle(isolate);
-  result = GetByteDataConstructor(isolate, Symbols::ByteDataDotview(), 3);
+  result = GetByteDataConstructor(isolate, Symbols::ByteDataDot_view(), 3);
   ASSERT(!result.IsNull());
   ASSERT(result.IsFunction());
   const Function& factory = Function::Cast(result);
@@ -3600,23 +3596,7 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_Allocate(Dart_Handle type) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  CHECK_CALLBACK_STATE(isolate);
-
-  const Type& type_obj = Api::UnwrapTypeHandle(isolate, type);
-  // Get the class to instantiate.
-  if (type_obj.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, type, Type);
-  }
-  const Class& cls = Class::Handle(isolate, type_obj.type_class());
-  const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
-  if (!error.IsNull()) {
-    // An error occurred, return error object.
-    return Api::NewHandle(isolate, error.raw());
-  }
-
+static RawInstance* AllocateObject(Isolate* isolate, const Class& cls) {
   if (!cls.is_fields_marked_nullable()) {
     // Mark all fields as nullable.
     Class& iterate_cls = Class::Handle(isolate, cls.raw());
@@ -3638,7 +3618,61 @@
   }
 
   // Allocate an object for the given class.
-  return Api::NewHandle(isolate, Instance::New(cls));
+  return Instance::New(cls);
+}
+
+
+DART_EXPORT Dart_Handle Dart_Allocate(Dart_Handle type) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  CHECK_CALLBACK_STATE(isolate);
+
+  const Type& type_obj = Api::UnwrapTypeHandle(isolate, type);
+  // Get the class to instantiate.
+  if (type_obj.IsNull()) {
+    RETURN_TYPE_ERROR(isolate, type, Type);
+  }
+  const Class& cls = Class::Handle(isolate, type_obj.type_class());
+  const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
+  if (!error.IsNull()) {
+    // An error occurred, return error object.
+    return Api::NewHandle(isolate, error.raw());
+  }
+  return Api::NewHandle(isolate, AllocateObject(isolate, cls));
+}
+
+
+DART_EXPORT Dart_Handle Dart_AllocateWithNativeFields(
+    Dart_Handle type,
+    intptr_t num_native_fields,
+    const intptr_t* native_fields) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  CHECK_CALLBACK_STATE(isolate);
+
+  const Type& type_obj = Api::UnwrapTypeHandle(isolate, type);
+  // Get the class to instantiate.
+  if (type_obj.IsNull()) {
+    RETURN_TYPE_ERROR(isolate, type, Type);
+  }
+  if (native_fields == NULL) {
+    RETURN_NULL_ERROR(native_fields);
+  }
+  const Class& cls = Class::Handle(isolate, type_obj.type_class());
+  const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
+  if (!error.IsNull()) {
+    // An error occurred, return error object.
+    return Api::NewHandle(isolate, error.raw());
+  }
+  if (num_native_fields != cls.num_native_fields()) {
+    return Api::NewError(
+        "%s: invalid number of native fields %" Pd " passed in, expected %d",
+        CURRENT_FUNC, num_native_fields, cls.num_native_fields());
+  }
+  const Instance& instance = Instance::Handle(isolate,
+                                              AllocateObject(isolate, cls));
+  instance.SetNativeFields(num_native_fields, native_fields);
+  return Api::NewHandle(isolate, instance.raw());
 }
 
 
@@ -4216,7 +4250,7 @@
     state->UnwindScopes(isolate->top_exit_frame_info());
     saved_exception = &Instance::Handle(raw_exception);
   }
-  Exceptions::Throw(*saved_exception);
+  Exceptions::Throw(isolate, *saved_exception);
   return Api::NewError("Exception was not thrown, internal error");
 }
 
@@ -4258,7 +4292,7 @@
     saved_exception = &Instance::Handle(raw_exception);
     saved_stacktrace = &Instance::Handle(raw_stacktrace);
   }
-  Exceptions::ReThrow(*saved_exception, *saved_stacktrace);
+  Exceptions::ReThrow(isolate, *saved_exception, *saved_stacktrace);
   return Api::NewError("Exception was not re thrown, internal error");
 }
 
@@ -4665,7 +4699,7 @@
                                             int64_t retval) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   ASSERT(arguments->isolate() == Isolate::Current());
-  if (Smi::IsValid64(retval)) {
+  if (Smi::IsValid(retval)) {
     Api::SetSmiReturnValue(arguments, retval);
   } else {
     // Slow path for Mints and Bigints.
@@ -4977,7 +5011,9 @@
   if (library.IsNull()) {
     library = Library::New(url_str);
     library.Register();
-  } else if (!library.LoadNotStarted()) {
+  } else if (library.LoadInProgress() ||
+      library.Loaded() ||
+      library.LoadError()) {
     // The source for this library has either been loaded or is in the
     // process of loading.  Return an error.
     return Api::NewError("%s: library '%s' has already been loaded.",
@@ -4992,8 +5028,8 @@
     return result;
   }
 
-  // If this is the dart:builtin library, register it with the VM.
-  if (url_str.Equals("dart:builtin")) {
+  // If this is the dart:_builtin library, register it with the VM.
+  if (url_str.Equals("dart:_builtin")) {
     isolate->object_store()->set_builtin_library(library);
     Dart_Handle state = Api::CheckIsolateState(isolate);
     if (::Dart_IsError(state)) {
@@ -5039,7 +5075,8 @@
     if (!library_prefix.IsNull()) {
       library_prefix.AddImport(import_ns);
     } else {
-      library_prefix = LibraryPrefix::New(prefix_symbol, import_ns, false);
+      library_prefix =
+          LibraryPrefix::New(prefix_symbol, import_ns, false, library_vm);
       library_vm.AddObject(library_prefix, prefix_symbol);
     }
   }
@@ -5107,6 +5144,37 @@
 }
 
 
+// Finalizes classes and invokes Dart core library function that completes
+// futures of loadLibrary calls (deferred library loading).
+DART_EXPORT Dart_Handle Dart_FinalizeLoading() {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  CHECK_CALLBACK_STATE(isolate);
+
+  // Finalize all classes if needed.
+  Dart_Handle state = Api::CheckIsolateState(isolate);
+  if (::Dart_IsError(state)) {
+    return state;
+  }
+
+  const Library& corelib = Library::Handle(isolate, Library::CoreLibrary());
+  const String& function_name =
+      String::Handle(isolate, String::New("_completeDeferredLoads"));
+  const Function& function =
+      Function::Handle(isolate,
+                       corelib.LookupFunctionAllowPrivate(function_name));
+  ASSERT(!function.IsNull());
+  const Array& args = Array::empty_array();
+
+  const Object& res =
+      Object::Handle(isolate, DartEntry::InvokeFunction(function, args));
+  if (res.IsError() || res.IsUnhandledException()) {
+    return Api::NewHandle(isolate, res.raw());
+  }
+  return Api::Success();
+}
+
+
 DART_EXPORT Dart_Handle Dart_SetNativeResolver(
     Dart_Handle library,
     Dart_NativeEntryResolver resolver,
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 40fdf74..648b642 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -534,7 +534,7 @@
   Dart_Handle mint_again = Dart_NewInteger(0xFFFFFFFF);
   Dart_Handle abc = NewString("abc");
   Dart_Handle abc_again = NewString("abc");
-  Dart_Handle xyz = NewString("abc");
+  Dart_Handle xyz = NewString("xyz");
   Dart_Handle dart_core = NewString("dart:core");
   Dart_Handle dart_mirrors = NewString("dart:mirrors");
 
@@ -585,7 +585,7 @@
   Dart_Handle mint_again = Dart_NewInteger(0xFFFFFFFF);
   Dart_Handle abc = NewString("abc");
   // Dart_Handle abc_again = NewString("abc");
-  Dart_Handle xyz = NewString("abc");
+  Dart_Handle xyz = NewString("xyz");
   Dart_Handle dart_core = NewString("dart:core");
   Dart_Handle dart_mirrors = NewString("dart:mirrors");
 
@@ -5316,12 +5316,17 @@
   EXPECT_VALID(type);
 
   // Allocate without a constructor.
-  Dart_Handle obj = Dart_Allocate(type);
+  const int num_native_fields = 2;
+  const intptr_t native_fields[] = {
+    kNativeArgumentNativeField1Value,
+    kNativeArgumentNativeField2Value
+  };
+  // Allocate and Setup native fields.
+  Dart_Handle obj = Dart_AllocateWithNativeFields(type,
+                                                  num_native_fields,
+                                                  native_fields);
   EXPECT_VALID(obj);
 
-  // Setup native fields.
-  Dart_SetNativeInstanceField(obj, 0, kNativeArgumentNativeField1Value);
-  Dart_SetNativeInstanceField(obj, 1, kNativeArgumentNativeField2Value);
   kNativeArgumentNativeField1Value *= 2;
   kNativeArgumentNativeField2Value *= 2;
   Dart_SetReturnValue(args, obj);
@@ -8236,7 +8241,7 @@
   EXPECT_EQ(40, peer8);
   EXPECT_EQ(41, peer16);
   EXPECT_EQ(42, canonical_str_peer);
-  Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
+  Isolate::Current()->heap()->CollectAllGarbage();
   EXPECT_EQ(80, peer8);
   EXPECT_EQ(82, peer16);
   EXPECT_EQ(42, canonical_str_peer);  // "*" Symbol is not removed on GC.
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 1c5f869..1760ae7 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -258,7 +258,7 @@
 Dart_CObject* ApiMessageReader::ReadInlinedObject(intptr_t object_id) {
   // Read the class header information and lookup the class.
   intptr_t class_header = ReadIntptrValue();
-  intptr_t tags = ReadIntptrValue();
+  intptr_t tags = ReadTags();
   USE(tags);
   intptr_t class_id;
 
@@ -372,7 +372,7 @@
   intptr_t len = Smi::Value(str->ptr()->length_);
   object = AllocateDartCObjectString(len);
   char* p = object->value.as_string;
-  memmove(p, str->ptr()->data_, len);
+  memmove(p, str->ptr()->data(), len);
   p[len] = '\0';
   ASSERT(vm_symbol_references_[symbol_id] == NULL);
   vm_symbol_references_[symbol_id] = object;
@@ -426,7 +426,7 @@
     return value;
   }
 
-  intptr_t tags = ReadIntptrValue();
+  intptr_t tags = ReadTags();
   USE(tags);
 
   return ReadInternalVMObject(class_id, object_id);
@@ -782,7 +782,7 @@
 
   // Write out the class and tags information.
   WriteIndexedObject(kArrayCid);
-  WriteIntptrValue(0);
+  WriteTags(0);
 
   // Write out the length field.
   Write<RawObject*>(Smi::New(field_count));
@@ -862,7 +862,7 @@
 
 
 void ApiMessageWriter::WriteSmi(int64_t value) {
-  ASSERT(Smi::IsValid64(value));
+  ASSERT(Smi::IsValid(value));
   Write<RawObject*>(Smi::New(static_cast<intptr_t>(value)));
 }
 
@@ -873,12 +873,12 @@
 
 
 void ApiMessageWriter::WriteMint(Dart_CObject* object, int64_t value) {
-  ASSERT(!Smi::IsValid64(value));
+  ASSERT(!Smi::IsValid(value));
   // Write out the serialization header value for mint object.
   WriteInlinedHeader(object);
   // Write out the class and tags information.
   WriteIndexedObject(kMintCid);
-  WriteIntptrValue(0);
+  WriteTags(0);
   // Write the 64-bit value.
   Write<int64_t>(value);
 }
@@ -886,7 +886,7 @@
 
 void ApiMessageWriter::WriteInt32(Dart_CObject* object) {
   int64_t value = object->value.as_int32;
-  if (Smi::IsValid64(value)) {
+  if (Smi::IsValid(value)) {
     WriteSmi(value);
   } else {
     WriteMint(object, value);
@@ -896,7 +896,7 @@
 
 void ApiMessageWriter::WriteInt64(Dart_CObject* object) {
   int64_t value = object->value.as_int64;
-  if (Smi::IsValid64(value)) {
+  if (Smi::IsValid(value)) {
     WriteSmi(value);
   } else {
     WriteMint(object, value);
@@ -933,7 +933,7 @@
     WriteInlinedHeader(object);
     // Write out the class and tags information.
     WriteIndexedObject(kArrayCid);
-    WriteIntptrValue(0);
+    WriteTags(0);
     // Write out the length information.
     WriteSmi(array_length);
     // Write out the type arguments.
@@ -993,7 +993,7 @@
   WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id);
   // Write out the class and tags information.
   WriteIndexedObject(kArrayCid);
-  WriteIntptrValue(0);
+  WriteTags(0);
   // Write out the length information.
   WriteSmi(array_length);
   // Write out the type arguments.
@@ -1038,7 +1038,7 @@
       WriteInlinedHeader(object);
       // Write out the class and tags information.
       WriteIndexedObject(kBigintCid);
-      WriteIntptrValue(0);
+      WriteTags(0);
       // Write hex string length and content
       intptr_t len = strlen(hex_string);
       WriteIntptrValue(len);
@@ -1071,7 +1071,7 @@
       // Write out the class and tags information.
       WriteIndexedObject(type == Utf8::kLatin1 ? kOneByteStringCid
                                                : kTwoByteStringCid);
-      WriteIntptrValue(0);
+      WriteTags(0);
       // Write string length, hash and content
       WriteSmi(len);
       WriteSmi(0);  // TODO(sgjesse): Hash - not written.
@@ -1123,7 +1123,7 @@
       }
 
       WriteIndexedObject(class_id);
-      WriteIntptrValue(RawObject::ClassIdTag::update(class_id, 0));
+      WriteTags(RawObject::ClassIdTag::update(class_id, 0));
       WriteSmi(len);
       uint8_t* bytes = object->value.as_typed_data.values;
       for (intptr_t i = 0; i < len; i++) {
@@ -1141,7 +1141,7 @@
       WriteInlinedHeader(object);
       // Write out the class and tag information.
       WriteIndexedObject(kExternalTypedDataUint8ArrayCid);
-      WriteIntptrValue(RawObject::ClassIdTag::update(
+      WriteTags(RawObject::ClassIdTag::update(
           kExternalTypedDataUint8ArrayCid, 0));
       intptr_t length = object->value.as_external_typed_data.length;
       if (length < 0 ||
@@ -1154,9 +1154,9 @@
       Dart_WeakPersistentHandleFinalizer callback =
           object->value.as_external_typed_data.callback;
       WriteSmi(length);
-      WriteIntptrValue(reinterpret_cast<intptr_t>(data));
-      WriteIntptrValue(reinterpret_cast<intptr_t>(peer));
-      WriteIntptrValue(reinterpret_cast<intptr_t>(callback));
+      WriteRawPointerValue(reinterpret_cast<intptr_t>(data));
+      WriteRawPointerValue(reinterpret_cast<intptr_t>(peer));
+      WriteRawPointerValue(reinterpret_cast<intptr_t>(callback));
       break;
     }
     default:
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
index ba1b46b..28eefb9 100644
--- a/runtime/vm/dart_api_state.h
+++ b/runtime/vm/dart_api_state.h
@@ -190,21 +190,22 @@
 // dart API.
 class FinalizablePersistentHandle {
  public:
+  static FinalizablePersistentHandle* New(
+      Isolate* isolate,
+      bool is_prologue,
+      const Object& object,
+      void* peer,
+      Dart_WeakPersistentHandleFinalizer callback,
+      intptr_t external_size);
+
   // Accessors.
   RawObject* raw() const { return raw_; }
-  void set_raw(RawObject* raw) { raw_ = raw; }
-  void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); }
-  void set_raw(const Object& object) { raw_ = object.raw(); }
   RawObject** raw_addr() { return &raw_; }
   static intptr_t raw_offset() {
     return OFFSET_OF(FinalizablePersistentHandle, raw_);
   }
   void* peer() const { return peer_; }
-  void set_peer(void* peer) { peer_ = peer; }
   Dart_WeakPersistentHandleFinalizer callback() const { return callback_; }
-  void set_callback(Dart_WeakPersistentHandleFinalizer callback) {
-    callback_ = callback;
-  }
   Dart_WeakPersistentHandle apiHandle() {
     return reinterpret_cast<Dart_WeakPersistentHandle>(this);
   }
@@ -300,6 +301,16 @@
     callback_ = NULL;
   }
 
+  void set_raw(RawObject* raw) { raw_ = raw; }
+  void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); }
+  void set_raw(const Object& object) { raw_ = object.raw(); }
+
+  void set_peer(void* peer) { peer_ = peer; }
+
+  void set_callback(Dart_WeakPersistentHandleFinalizer callback) {
+    callback_ = callback;
+  }
+
   intptr_t external_size() const {
     return ExternalSizeBits::decode(external_data_);
   }
@@ -942,6 +953,27 @@
 };
 
 
+inline FinalizablePersistentHandle* FinalizablePersistentHandle::New(
+    Isolate* isolate,
+    bool is_prologue,
+    const Object& object,
+    void* peer,
+    Dart_WeakPersistentHandleFinalizer callback,
+    intptr_t external_size) {
+  ApiState* state = isolate->api_state();
+  ASSERT(state != NULL);
+  FinalizablePersistentHandle* ref = is_prologue ?
+      state->prologue_weak_persistent_handles().AllocateHandle() :
+      state->weak_persistent_handles().AllocateHandle();
+  ref->SetPrologueWeakPersistent(is_prologue);
+  ref->set_raw(object);
+  ref->set_peer(peer);
+  ref->set_callback(callback);
+  // This may trigger GC, so it must be called last.
+  ref->SetExternalSize(external_size, isolate);
+  return ref;
+}
+
 }  // namespace dart
 
 #endif  // VM_DART_API_STATE_H_
diff --git a/runtime/vm/datastream.h b/runtime/vm/datastream.h
index 43e7977..8531ff10 100644
--- a/runtime/vm/datastream.h
+++ b/runtime/vm/datastream.h
@@ -17,7 +17,7 @@
 static const int8_t kByteMask = (1 << kDataBitsPerByte) - 1;
 static const int8_t kMaxUnsignedDataPerByte = kByteMask;
 static const int8_t kMinDataPerByte = -(1 << (kDataBitsPerByte - 1));
-static const int8_t kMaxDataPerByte = (~kMinDataPerByte & kByteMask);
+static const int8_t kMaxDataPerByte = (~kMinDataPerByte & kByteMask);  // NOLINT
 static const uint8_t kEndByteMarker = (255 - kMaxDataPerByte);
 static const uint8_t kEndUnsignedByteMarker = (255 - kMaxUnsignedDataPerByte);
 
@@ -51,7 +51,7 @@
   class Raw<2, T> {
    public:
     static T Read(ReadStream* st) {
-      return bit_cast<T>(st->Read<int16_t>());
+      return bit_cast<T>(st->Read16());
     }
   };
 
@@ -59,7 +59,7 @@
   class Raw<4, T> {
    public:
     static T Read(ReadStream* st) {
-      return bit_cast<T>(st->Read<int32_t>());
+      return bit_cast<T>(st->Read32());
     }
   };
 
@@ -67,7 +67,7 @@
   class Raw<8, T> {
    public:
     static T Read(ReadStream* st) {
-      return bit_cast<T>(st->Read<int64_t>());
+      return bit_cast<T>(st->Read64());
     }
   };
 
@@ -104,10 +104,25 @@
     return Read<T>(kEndByteMarker);
   }
 
+  int16_t Read16() {
+    return Read16(kEndByteMarker);
+  }
+
+  int32_t Read32() {
+    return Read32(kEndByteMarker);
+  }
+
+  int64_t Read64() {
+    return Read64(kEndByteMarker);
+  }
+
   template<typename T>
   T Read(uint8_t end_byte_marker) {
-    uint8_t b = ReadByte();
+    const uint8_t* c = current_;
+    ASSERT(c < end_);
+    uint8_t b = *c++;
     if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
       return static_cast<T>(b) - end_byte_marker;
     }
     T r = 0;
@@ -115,11 +130,162 @@
     do {
       r |= static_cast<T>(b) << s;
       s += kDataBitsPerByte;
-      b = ReadByte();
+      ASSERT(c < end_);
+      b = *c++;
     } while (b <= kMaxUnsignedDataPerByte);
+    current_ = c;
     return r | ((static_cast<T>(b) - end_byte_marker) << s);
   }
 
+  int16_t Read16(uint8_t end_byte_marker) {
+    const uint8_t* c = current_;
+    ASSERT(c < end_);
+    uint8_t b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return static_cast<int16_t>(b) - end_byte_marker;
+    }
+    int16_t r = 0;
+    r |= static_cast<int16_t>(b);
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int16_t>(b) - end_byte_marker) << 7);
+    }
+
+    r |= static_cast<int16_t>(b) << 7;
+    ASSERT(c < end_);
+    b = *c++;
+    ASSERT(b > kMaxUnsignedDataPerByte);
+    current_ = c;
+    return r | ((static_cast<int16_t>(b) - end_byte_marker) << 14);
+  }
+
+  int32_t Read32(uint8_t end_byte_marker) {
+    const uint8_t* c = current_;
+    ASSERT(c < end_);
+    uint8_t b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return static_cast<int32_t>(b) - end_byte_marker;
+    }
+
+    int32_t r = 0;
+    r |= static_cast<int32_t>(b);
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int32_t>(b) - end_byte_marker) << 7);
+    }
+
+    r |= static_cast<int32_t>(b) << 7;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int32_t>(b) - end_byte_marker) << 14);
+    }
+
+    r |= static_cast<int32_t>(b) << 14;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int32_t>(b) - end_byte_marker) << 21);
+    }
+
+    r |= static_cast<int32_t>(b) << 21;
+    ASSERT(c < end_);
+    b = *c++;
+    ASSERT(b > kMaxUnsignedDataPerByte);
+    current_ = c;
+    return r | ((static_cast<int32_t>(b) - end_byte_marker) << 28);
+  }
+
+  int64_t Read64(uint8_t end_byte_marker) {
+    const uint8_t* c = current_;
+    ASSERT(c < end_);
+    uint8_t b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return static_cast<int64_t>(b) - end_byte_marker;
+    }
+    int64_t r = 0;
+
+    r |= static_cast<int64_t>(b);
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 7);
+    }
+
+    r |= static_cast<int64_t>(b) << 7;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 14);
+    }
+
+    r |= static_cast<int64_t>(b) << 14;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 21);
+    }
+
+    r |= static_cast<int64_t>(b) << 21;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 28);
+    }
+
+    r |= static_cast<int64_t>(b) << 28;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 35);
+    }
+
+    r |= static_cast<int64_t>(b) << 35;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 42);
+    }
+
+    r |= static_cast<int64_t>(b) << 42;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 49);
+    }
+
+    r |= static_cast<int64_t>(b) << 49;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 56);
+    }
+
+    r |= static_cast<int64_t>(b) << 56;
+    ASSERT(c < end_);
+    b = *c++;
+    ASSERT(b > kMaxUnsignedDataPerByte);
+    current_ = c;
+    return r | ((static_cast<int64_t>(b) - end_byte_marker) << 63);
+  }
+
   uint8_t ReadByte() {
     ASSERT(current_ < end_);
     return *current_++;
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 5802280..41b1f17 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -914,7 +914,6 @@
           (kind == PcDescriptors::kOptStaticCall) ||
           (kind == PcDescriptors::kUnoptStaticCall) ||
           (kind == PcDescriptors::kClosureCall) ||
-          (kind == PcDescriptors::kReturn) ||
           (kind == PcDescriptors::kRuntimeCall));
 }
 
diff --git a/runtime/vm/debugger_arm.cc b/runtime/vm/debugger_arm.cc
index cdb13e7..a345836 100644
--- a/runtime/vm/debugger_arm.cc
+++ b/runtime/vm/debugger_arm.cc
@@ -48,8 +48,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(pc_, code,
                                        StubCode::BreakpointRuntimeEntryPoint());
@@ -73,8 +72,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kRuntimeCall: {
         CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
         break;
       }
diff --git a/runtime/vm/debugger_arm64.cc b/runtime/vm/debugger_arm64.cc
index 94b75e1..1288643 100644
--- a/runtime/vm/debugger_arm64.cc
+++ b/runtime/vm/debugger_arm64.cc
@@ -55,8 +55,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kClosureCall: {
         int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
         ASSERT((offset > 0) && ((offset & 0x7) == 0));
         saved_value_ = static_cast<uword>(offset);
@@ -84,8 +83,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kRuntimeCall: {
         CodePatcher::SetPoolOffsetAt(pc_, static_cast<int32_t>(saved_value_));
         break;
       }
diff --git a/runtime/vm/debugger_ia32.cc b/runtime/vm/debugger_ia32.cc
index 372a8c1..594113e 100644
--- a/runtime/vm/debugger_ia32.cc
+++ b/runtime/vm/debugger_ia32.cc
@@ -52,8 +52,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(pc_, code,
                                        StubCode::BreakpointRuntimeEntryPoint());
@@ -77,8 +76,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kRuntimeCall: {
         CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
         break;
       }
diff --git a/runtime/vm/debugger_mips.cc b/runtime/vm/debugger_mips.cc
index 54fd4cd..570d4d0 100644
--- a/runtime/vm/debugger_mips.cc
+++ b/runtime/vm/debugger_mips.cc
@@ -48,8 +48,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(pc_, code,
                                        StubCode::BreakpointRuntimeEntryPoint());
@@ -73,8 +72,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kRuntimeCall: {
         CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
         break;
       }
diff --git a/runtime/vm/debugger_x64.cc b/runtime/vm/debugger_x64.cc
index 33fb63a..171a0b3 100644
--- a/runtime/vm/debugger_x64.cc
+++ b/runtime/vm/debugger_x64.cc
@@ -57,8 +57,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kClosureCall: {
         int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
         ASSERT((offset > 0) && ((offset % 8) == 7));
         saved_value_ = static_cast<uword>(offset);
@@ -86,8 +85,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kRuntimeCall: {
         CodePatcher::SetPoolOffsetAt(pc_, static_cast<int32_t>(saved_value_));
         break;
       }
diff --git a/runtime/vm/deferred_objects.cc b/runtime/vm/deferred_objects.cc
index 104e7df..d0efc36 100644
--- a/runtime/vm/deferred_objects.cc
+++ b/runtime/vm/deferred_objects.cc
@@ -26,7 +26,7 @@
 
 void DeferredMint::Materialize(DeoptContext* deopt_context) {
   RawMint** mint_slot = reinterpret_cast<RawMint**>(slot());
-  ASSERT(!Smi::IsValid64(value()));
+  ASSERT(!Smi::IsValid(value()));
   Mint& mint = Mint::Handle();
   mint ^= Integer::New(value());
   *mint_slot = mint.raw();
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index f153fb5..2f365fb 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -706,7 +706,7 @@
     int32_t hi_value = deopt_context->RegisterValue(hi_reg_);
     int64_t value = Utils::LowHighTo64Bits(lo_value, hi_value);
     *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    if (Smi::IsValid64(value)) {
+    if (Smi::IsValid(value)) {
       *dest_addr = reinterpret_cast<intptr_t>(
           Smi::New(static_cast<intptr_t>(value)));
     } else {
@@ -768,7 +768,7 @@
         deopt_context->GetSourceFrameAddressAt(hi_source_index));
     int64_t value = Utils::LowHighTo64Bits(*lo_source_addr, *hi_source_addr);
     *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    if (Smi::IsValid64(value)) {
+    if (Smi::IsValid(value)) {
       *dest_addr = reinterpret_cast<intptr_t>(
           Smi::New(static_cast<intptr_t>(value)));
     } else {
@@ -847,7 +847,7 @@
       value = Utils::LowHighTo64Bits(slot_value, reg_value);
     }
     *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    if (Smi::IsValid64(value)) {
+    if (Smi::IsValid(value)) {
       *dest_addr = reinterpret_cast<intptr_t>(
           Smi::New(static_cast<intptr_t>(value)));
     } else {
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 7546f4ef..f927af1 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -34,11 +34,6 @@
             "Prints a stack trace everytime a throw occurs.");
 DEFINE_FLAG(bool, verbose_stacktrace, false,
     "Stack traces will include methods marked invisible.");
-DEFINE_FLAG(int, stacktrace_depth_on_warning, 5,
-            "Maximal number of stack frames to print after a runtime warning.");
-DECLARE_FLAG(bool, silent_warnings);
-DECLARE_FLAG(bool, warning_as_error);
-DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 
 const char* Exceptions::kCastErrorDstName = "type cast";
@@ -163,7 +158,7 @@
 }
 
 
-static void BuildStackTrace(StacktraceBuilder* builder) {
+static void BuildStackTrace(Isolate* isolate, StacktraceBuilder* builder) {
   StackFrameIterator frames(StackFrameIterator::kDontValidateFrames);
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
@@ -181,7 +176,8 @@
         bool is_catch_all = false;
         uword handler_pc = kUwordMax;
         if (!handler_pc_set &&
-            frame->FindExceptionHandler(&handler_pc,
+            frame->FindExceptionHandler(isolate,
+                                        &handler_pc,
                                         &needs_stacktrace,
                                         &is_catch_all)) {
           handler_pc_set = true;
@@ -210,7 +206,8 @@
 // exception handler. Once found, set the pc, sp and fp so that execution
 // can continue in that frame. Sets 'needs_stacktrace' if there is no
 // cath-all handler or if a stack-trace is specified in the catch.
-static bool FindExceptionHandler(uword* handler_pc,
+static bool FindExceptionHandler(Isolate* isolate,
+                                 uword* handler_pc,
                                  uword* handler_sp,
                                  uword* handler_fp,
                                  bool* needs_stacktrace) {
@@ -223,7 +220,8 @@
   uword temp_handler_pc = kUwordMax;
   while (!frame->IsEntryFrame()) {
     if (frame->IsDartFrame()) {
-      if (frame->FindExceptionHandler(&temp_handler_pc,
+      if (frame->FindExceptionHandler(isolate,
+                                      &temp_handler_pc,
                                       needs_stacktrace,
                                       &is_catch_all)) {
         if (!handler_pc_set) {
@@ -270,7 +268,8 @@
 }
 
 
-static void JumpToExceptionHandler(uword program_counter,
+static void JumpToExceptionHandler(Isolate* isolate,
+                                   uword program_counter,
                                    uword stack_pointer,
                                    uword frame_pointer,
                                    const Object& exception_object,
@@ -280,7 +279,6 @@
   NoGCScope no_gc;
   RawObject* raw_exception = exception_object.raw();
   RawObject* raw_stacktrace = stacktrace_object.raw();
-  Isolate* isolate = Isolate::Current();
 
 #if defined(USING_SIMULATOR)
   // Unwinding of the C++ frames and destroying of their stack resources is done
@@ -356,7 +354,7 @@
 RawStacktrace* Exceptions::CurrentStacktrace() {
   Isolate* isolate = Isolate::Current();
   RegularStacktraceBuilder frame_builder(true);
-  BuildStackTrace(&frame_builder);
+  BuildStackTrace(isolate, &frame_builder);
 
   // Create arrays for code and pc_offset tuples of each frame.
   const Array& full_code_array = Array::Handle(isolate,
@@ -375,10 +373,11 @@
 }
 
 
-static void ThrowExceptionHelper(const Instance& incoming_exception,
-                                 const Instance& existing_stacktrace) {
+static void ThrowExceptionHelper(Isolate* isolate,
+                                 const Instance& incoming_exception,
+                                 const Instance& existing_stacktrace,
+                                 const bool is_rethrow) {
   bool use_preallocated_stacktrace = false;
-  Isolate* isolate = Isolate::Current();
   Instance& exception = Instance::Handle(isolate, incoming_exception.raw());
   if (exception.IsNull()) {
     exception ^= Exceptions::Create(Exceptions::kNullThrown,
@@ -396,56 +395,64 @@
   if (use_preallocated_stacktrace) {
     stacktrace ^= isolate->object_store()->preallocated_stack_trace();
     PreallocatedStacktraceBuilder frame_builder(stacktrace);
-    handler_exists = FindExceptionHandler(&handler_pc,
+    handler_exists = FindExceptionHandler(isolate,
+                                          &handler_pc,
                                           &handler_sp,
                                           &handler_fp,
                                           &handler_needs_stacktrace);
     if (handler_needs_stacktrace) {
-      BuildStackTrace(&frame_builder);
+      BuildStackTrace(isolate, &frame_builder);
     }
   } else {
     // Get stacktrace field of class Error.
     const Field& stacktrace_field =
         Field::Handle(isolate, LookupStacktraceField(exception));
-    handler_exists = FindExceptionHandler(&handler_pc,
+    handler_exists = FindExceptionHandler(isolate,
+                                          &handler_pc,
                                           &handler_sp,
                                           &handler_fp,
                                           &handler_needs_stacktrace);
-    Array& code_array = Array::Handle(isolate, Object::empty_array().raw());
-    Array& pc_offset_array =
-        Array::Handle(isolate, Object::empty_array().raw());
-    // If we have an error with a stacktrace field then collect the full stack
-    // trace and store it into the field.
-    if (!stacktrace_field.IsNull()) {
-      if (exception.GetField(stacktrace_field) == Object::null()) {
-        // This is an error object and we need to capture the full stack trace
-        // here implicitly, so we set up the stack trace. The stack trace field
-        // is set only once, it is not overriden.
-        const Stacktrace& full_stacktrace =
-            Stacktrace::Handle(isolate, Exceptions::CurrentStacktrace());
-        exception.SetField(stacktrace_field, full_stacktrace);
+    if (!stacktrace_field.IsNull() || handler_needs_stacktrace) {
+      Array& code_array = Array::Handle(isolate, Object::empty_array().raw());
+      Array& pc_offset_array =
+          Array::Handle(isolate, Object::empty_array().raw());
+      // If we have an error with a stacktrace field then collect the full stack
+      // trace and store it into the field.
+      if (!stacktrace_field.IsNull()) {
+        if (exception.GetField(stacktrace_field) == Object::null()) {
+          // This is an error object and we need to capture the full stack trace
+          // here implicitly, so we set up the stack trace. The stack trace
+          // field is set only once, it is not overriden.
+          const Stacktrace& full_stacktrace =
+              Stacktrace::Handle(isolate, Exceptions::CurrentStacktrace());
+          exception.SetField(stacktrace_field, full_stacktrace);
+        }
       }
-    }
-    if (handler_needs_stacktrace) {
-      RegularStacktraceBuilder frame_builder(false);
-      BuildStackTrace(&frame_builder);
+      if (handler_needs_stacktrace) {
+        RegularStacktraceBuilder frame_builder(false);
+        BuildStackTrace(isolate, &frame_builder);
 
-      // Create arrays for code and pc_offset tuples of each frame.
-      code_array = Array::MakeArray(frame_builder.code_list());
-      pc_offset_array = Array::MakeArray(frame_builder.pc_offset_list());
-    }
-    if (existing_stacktrace.IsNull()) {
-      stacktrace = Stacktrace::New(code_array, pc_offset_array);
-    } else {
-      stacktrace ^= existing_stacktrace.raw();
-      if (pc_offset_array.Length() != 0) {
-        stacktrace.Append(code_array, pc_offset_array);
+        // Create arrays for code and pc_offset tuples of each frame.
+        code_array = Array::MakeArray(frame_builder.code_list());
+        pc_offset_array = Array::MakeArray(frame_builder.pc_offset_list());
       }
-      // Since we are re throwing and appending to the existing stack trace
-      // we clear out the catch trace collected in the existing stack trace
-      // as that trace will not be valid anymore.
-      stacktrace.SetCatchStacktrace(Object::empty_array(),
-                                    Object::empty_array());
+      if (existing_stacktrace.IsNull()) {
+        stacktrace = Stacktrace::New(code_array, pc_offset_array);
+      } else {
+        ASSERT(is_rethrow);
+        stacktrace ^= existing_stacktrace.raw();
+        if (pc_offset_array.Length() != 0) {
+          // Skip the first frame during a rethrow. This is the catch clause
+          // with the rethrow statement, which is not part of the original
+          // trace a rethrow is supposed to preserve.
+          stacktrace.Append(code_array, pc_offset_array, 1);
+        }
+        // Since we are re throwing and appending to the existing stack trace
+        // we clear out the catch trace collected in the existing stack trace
+        // as that trace will not be valid anymore.
+        stacktrace.SetCatchStacktrace(Object::empty_array(),
+                                      Object::empty_array());
+      }
     }
   }
   // We expect to find a handler_pc, if the exception is unhandled
@@ -460,7 +467,8 @@
   }
   if (handler_exists) {
     // Found a dart handler for the exception, jump to it.
-    JumpToExceptionHandler(handler_pc,
+    JumpToExceptionHandler(isolate,
+                           handler_pc,
                            handler_sp,
                            handler_fp,
                            exception,
@@ -474,9 +482,10 @@
     // dart invocation sequence above it, print diagnostics and terminate
     // the isolate etc.).
     const UnhandledException& unhandled_exception = UnhandledException::Handle(
-        UnhandledException::New(exception, stacktrace));
+        isolate, UnhandledException::New(exception, stacktrace));
     stacktrace = Stacktrace::null();
-    JumpToExceptionHandler(handler_pc,
+    JumpToExceptionHandler(isolate,
+                           handler_pc,
                            handler_sp,
                            handler_fp,
                            unhandled_exception,
@@ -569,30 +578,31 @@
 }
 
 
-void Exceptions::Throw(const Instance& exception) {
-  Isolate* isolate = Isolate::Current();
+void Exceptions::Throw(Isolate* isolate, const Instance& exception) {
   isolate->debugger()->SignalExceptionThrown(exception);
   // Null object is a valid exception object.
-  ThrowExceptionHelper(exception, Instance::Handle(isolate));
+  ThrowExceptionHelper(isolate, exception, Instance::Handle(isolate), false);
 }
 
 
-void Exceptions::ReThrow(const Instance& exception,
+void Exceptions::ReThrow(Isolate* isolate,
+                         const Instance& exception,
                          const Instance& stacktrace) {
   // Null object is a valid exception object.
-  ThrowExceptionHelper(exception, stacktrace);
+  ThrowExceptionHelper(isolate, exception, stacktrace, true);
 }
 
 
 void Exceptions::PropagateError(const Error& error) {
-  ASSERT(Isolate::Current()->top_exit_frame_info() != 0);
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate->top_exit_frame_info() != 0);
   if (error.IsUnhandledException()) {
     // If the error object represents an unhandled exception, then
     // rethrow the exception in the normal fashion.
     const UnhandledException& uhe = UnhandledException::Cast(error);
-    const Instance& exc = Instance::Handle(uhe.exception());
-    const Instance& stk = Instance::Handle(uhe.stacktrace());
-    Exceptions::ReThrow(exc, stk);
+    const Instance& exc = Instance::Handle(isolate, uhe.exception());
+    const Instance& stk = Instance::Handle(isolate, uhe.stacktrace());
+    Exceptions::ReThrow(isolate, exc, stk);
   } else {
     // Return to the invocation stub and return this error object.  The
     // C++ code which invoked this dart sequence can check and do the
@@ -601,22 +611,23 @@
     uword handler_sp = 0;
     uword handler_fp = 0;
     FindErrorHandler(&handler_pc, &handler_sp, &handler_fp);
-    JumpToExceptionHandler(handler_pc, handler_sp, handler_fp, error,
-                           Stacktrace::Handle());  // Null stacktrace.
+    JumpToExceptionHandler(isolate, handler_pc, handler_sp, handler_fp, error,
+                           Stacktrace::Handle(isolate));  // Null stacktrace.
   }
   UNREACHABLE();
 }
 
 
 void Exceptions::ThrowByType(ExceptionType type, const Array& arguments) {
-  const Object& result = Object::Handle(Create(type, arguments));
+  Isolate* isolate = Isolate::Current();
+  const Object& result = Object::Handle(isolate, Create(type, arguments));
   if (result.IsError()) {
     // We got an error while constructing the exception object.
     // Propagate the error instead of throwing the exception.
     PropagateError(Error::Cast(result));
   } else {
     ASSERT(result.IsInstance());
-    Throw(Instance::Cast(result));
+    Throw(isolate, Instance::Cast(result));
   }
 }
 
@@ -625,7 +636,7 @@
   Isolate* isolate = Isolate::Current();
   const Instance& oom = Instance::Handle(
       isolate, isolate->object_store()->out_of_memory());
-  Throw(oom);
+  Throw(isolate, oom);
 }
 
 
@@ -633,7 +644,7 @@
   Isolate* isolate = Isolate::Current();
   const Instance& stack_overflow = Instance::Handle(
       isolate, isolate->object_store()->stack_overflow());
-  Throw(stack_overflow);
+  Throw(isolate, stack_overflow);
 }
 
 
@@ -738,42 +749,11 @@
 
 
 // Throw JavascriptCompatibilityError exception.
-static void ThrowJavascriptCompatibilityError(const char* msg) {
+void Exceptions::ThrowJavascriptCompatibilityError(const char* msg) {
   const Array& exc_args = Array::Handle(Array::New(1));
   const String& msg_str = String::Handle(String::New(msg));
   exc_args.SetAt(0, msg_str);
   Exceptions::ThrowByType(Exceptions::kJavascriptCompatibilityError, exc_args);
 }
 
-
-void Exceptions::JSWarning(StackFrame* caller_frame, const char* format, ...) {
-  ASSERT(caller_frame != NULL);
-  ASSERT(FLAG_warn_on_javascript_compatibility);
-  if (FLAG_silent_warnings) return;
-  const Code& caller_code = Code::Handle(caller_frame->LookupDartCode());
-  ASSERT(!caller_code.IsNull());
-  const uword caller_pc = caller_frame->pc();
-  const intptr_t token_pos = caller_code.GetTokenIndexOfPC(caller_pc);
-  const Function& caller = Function::Handle(caller_code.function());
-  const Script& script = Script::Handle(caller.script());
-  va_list args;
-  va_start(args, format);
-  const Error& error = Error::Handle(
-      LanguageError::NewFormattedV(Error::Handle(),  // No previous error.
-                                   script, token_pos, LanguageError::kWarning,
-                                   Heap::kNew, format, args));
-  va_end(args);
-  if (FLAG_warning_as_error) {
-    ThrowJavascriptCompatibilityError(error.ToErrorCString());
-  } else {
-    OS::Print("javascript compatibility warning: %s", error.ToErrorCString());
-  }
-  const Stacktrace& stacktrace =
-     Stacktrace::Handle(Exceptions::CurrentStacktrace());
-  intptr_t idx = 0;
-  OS::Print("%s",
-            stacktrace.ToCStringInternal(&idx,
-                                         FLAG_stacktrace_depth_on_warning));
-}
-
 }  // namespace dart
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index 9549b55..4b3330c 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -6,20 +6,21 @@
 #define VM_EXCEPTIONS_H_
 
 #include "vm/allocation.h"
-#include "vm/growable_array.h"
 
 namespace dart {
 
 // Forward declarations.
+class Array;
 class Class;
 class DartFrameIterator;
 class Error;
 class Instance;
 class Object;
 class RawInstance;
+class RawObject;
 class RawScript;
 class RawStacktrace;
-class RawObject;
+class RawString;
 class Script;
 class StackFrame;
 class String;
@@ -28,19 +29,14 @@
  public:
   static const char* kCastErrorDstName;
 
-  static void Throw(const Instance& exception);
-  static void ReThrow(const Instance& exception, const Instance& stacktrace);
+  static void Throw(Isolate* isolate, const Instance& exception);
+  static void ReThrow(Isolate* isolate,
+                      const Instance& exception,
+                      const Instance& stacktrace);
   static void PropagateError(const Error& error);
 
-  // Report a Javascript compatibility warning at the call site given by
-  // caller_frame. Note that a JavascriptCompatibilityError is thrown
-  // if --warning_as_error is specified.
-  static void JSWarning(StackFrame* caller_frame, const char* format, ...)
-      PRINTF_ATTRIBUTE(2, 3);
-
-  static RawStacktrace* CurrentStacktrace();
-
   // Helpers to create and throw errors.
+  static RawStacktrace* CurrentStacktrace();
   static RawScript* GetCallerScript(DartFrameIterator* iterator);
   static RawInstance* NewInstance(const char* class_name);
   static void CreateAndThrowTypeError(intptr_t location,
@@ -76,6 +72,7 @@
   static void ThrowOOM();
   static void ThrowStackOverflow();
   static void ThrowArgumentError(const Instance& arg);
+  static void ThrowJavascriptCompatibilityError(const char* msg);
 
   // Returns a RawInstance if the exception is successfully created,
   // otherwise returns a RawError.
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index c0c74a6..346b219 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -7,15 +7,14 @@
 #include "vm/bit_vector.h"
 #include "vm/flow_graph_builder.h"
 #include "vm/intermediate_language.h"
-#include "vm/longjump.h"
 #include "vm/growable_array.h"
+#include "vm/report.h"
 
 namespace dart {
 
 DECLARE_FLAG(bool, reorder_basic_blocks);
 DECLARE_FLAG(bool, trace_optimization);
 DECLARE_FLAG(bool, verify_compiler);
-DEFINE_FLAG(bool, optimize_try_catch, true, "Optimization of try-catch");
 
 
 FlowGraph::FlowGraph(const FlowGraphBuilder& builder,
@@ -181,9 +180,7 @@
 }
 
 
-#ifdef DEBUG
 // Debugging code to verify the construction of use lists.
-
 static intptr_t MembershipCount(Value* use, Value* list) {
   intptr_t count = 0;
   while (list != NULL) {
@@ -281,7 +278,6 @@
   }
   return true;  // Return true so we can ASSERT validation.
 }
-#endif  // DEBUG
 
 
 LivenessAnalysis::LivenessAnalysis(
@@ -718,9 +714,6 @@
                        VariableLivenessAnalysis* variable_liveness,
                        ZoneGrowableArray<Definition*>* inlining_parameters) {
   GraphEntryInstr* entry = graph_entry();
-  if (!FLAG_optimize_try_catch && (entry->SuccessorCount() > 1)) {
-    Bailout("Catch-entry support in SSA.");
-  }
 
   // Initial renaming environment.
   GrowableArray<Definition*> env(variable_count());
@@ -1000,6 +993,35 @@
 
 
 void FlowGraph::RemoveDeadPhis(GrowableArray<PhiInstr*>* live_phis) {
+  // Augment live_phis with those that have implicit real used at
+  // potentially throwing instructions if there is a try-catch in this graph.
+  if (graph_entry()->SuccessorCount() > 1) {
+    for (BlockIterator it(postorder_iterator()); !it.Done(); it.Advance()) {
+      JoinEntryInstr* join = it.Current()->AsJoinEntry();
+      if (join == NULL) continue;
+      for (PhiIterator phi_it(join); !phi_it.Done(); phi_it.Advance()) {
+        PhiInstr* phi = phi_it.Current();
+        if (phi == NULL ||
+            phi->is_alive() ||
+            (phi->input_use_list() != NULL) ||
+            (phi->env_use_list() == NULL)) {
+          continue;
+        }
+        for (Value::Iterator it(phi->env_use_list());
+             !it.Done();
+             it.Advance()) {
+          Value* use = it.Current();
+          if (use->instruction()->MayThrow() &&
+              use->instruction()->GetBlock()->InsideTryBlock()) {
+            live_phis->Add(phi);
+            phi->mark_alive();
+            break;
+          }
+        }
+      }
+    }
+  }
+
   while (!live_phis->is_empty()) {
     PhiInstr* phi = live_phis->RemoveLast();
     for (intptr_t i = 0; i < phi->InputCount(); i++) {
@@ -1014,7 +1036,7 @@
 
   for (BlockIterator it(postorder_iterator()); !it.Done(); it.Advance()) {
     JoinEntryInstr* join = it.Current()->AsJoinEntry();
-    if (join != NULL) join->RemoveDeadPhis(constant_null());
+    if (join != NULL) join->RemoveDeadPhis(constant_dead());
   }
 }
 
@@ -1116,21 +1138,6 @@
 }
 
 
-void FlowGraph::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::kError,
-                                  Heap::kNew,
-                                  "FlowGraph Bailout: %s %s",
-                                  String::Handle(function.name()).ToCString(),
-                                  reason));
-  Isolate::Current()->long_jump_base()->Jump(1, error);
-}
-
-
 intptr_t FlowGraph::InstructionCount() const {
   intptr_t size = 0;
   // Iterate each block, skipping the graph entry.
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index 1868d0a..9ec6871 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -154,13 +154,8 @@
   void ComputeSSA(intptr_t next_virtual_register_number,
                   ZoneGrowableArray<Definition*>* inlining_parameters);
 
-  // TODO(zerny): Once the SSA is feature complete this should be removed.
-  void Bailout(const char* reason) const;
-
-#ifdef DEBUG
   // Verification methods for debugging.
   bool VerifyUseLists();
-#endif  // DEBUG
 
   void DiscoverBlocks();
 
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 374ccb4..1c190fa 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -16,11 +16,11 @@
 #include "vm/il_printer.h"
 #include "vm/intermediate_language.h"
 #include "vm/isolate.h"
-#include "vm/longjump.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
 #include "vm/os.h"
 #include "vm/parser.h"
+#include "vm/report.h"
 #include "vm/resolver.h"
 #include "vm/scopes.h"
 #include "vm/stack_frame.h"
@@ -37,14 +37,11 @@
 DEFINE_FLAG(bool, print_scopes, false, "Print scopes of local variables.");
 DEFINE_FLAG(bool, trace_type_check_elimination, false,
             "Trace type check elimination at compile time.");
-DEFINE_FLAG(bool, warn_on_javascript_compatibility, false,
-            "Warn on incompatibilities between vm and dart2js.");
 
 DECLARE_FLAG(bool, enable_debugger);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(int, optimization_counter_threshold);
-DECLARE_FLAG(bool, silent_warnings);
-DECLARE_FLAG(bool, warning_as_error);
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 // Quick access to the locally defined isolate() method.
 #define I (isolate())
@@ -236,31 +233,32 @@
 }
 
 
-FlowGraphBuilder::FlowGraphBuilder(ParsedFunction* parsed_function,
-                                   const Array& ic_data_array,
-                                   InlineExitCollector* exit_collector,
-                                   intptr_t osr_id,
-                                   bool is_optimizing)
-  : parsed_function_(parsed_function),
-    ic_data_array_(ic_data_array),
-    num_copied_params_(parsed_function->num_copied_params()),
-    // All parameters are copied if any parameter is.
-    num_non_copied_params_((num_copied_params_ == 0)
-        ? parsed_function->function().num_fixed_parameters()
-        : 0),
-    num_stack_locals_(parsed_function->num_stack_locals()),
-    exit_collector_(exit_collector),
-    guarded_fields_(new ZoneGrowableArray<const Field*>()),
-    last_used_block_id_(0),  // 0 is used for the graph entry.
-    try_index_(CatchClauseNode::kInvalidTryIndex),
-    catch_try_index_(CatchClauseNode::kInvalidTryIndex),
-    loop_depth_(0),
-    graph_entry_(NULL),
-    temp_count_(0),
-    args_pushed_(0),
-    nesting_stack_(NULL),
-    osr_id_(osr_id),
-    is_optimizing_(is_optimizing) { }
+FlowGraphBuilder::FlowGraphBuilder(
+    ParsedFunction* parsed_function,
+    const ZoneGrowableArray<const ICData*>& ic_data_array,
+    InlineExitCollector* exit_collector,
+    intptr_t osr_id,
+    bool is_optimizing) :
+        parsed_function_(parsed_function),
+        ic_data_array_(ic_data_array),
+        num_copied_params_(parsed_function->num_copied_params()),
+        // All parameters are copied if any parameter is.
+        num_non_copied_params_((num_copied_params_ == 0)
+            ? parsed_function->function().num_fixed_parameters()
+            : 0),
+        num_stack_locals_(parsed_function->num_stack_locals()),
+        exit_collector_(exit_collector),
+        guarded_fields_(new ZoneGrowableArray<const Field*>()),
+        last_used_block_id_(0),  // 0 is used for the graph entry.
+        try_index_(CatchClauseNode::kInvalidTryIndex),
+        catch_try_index_(CatchClauseNode::kInvalidTryIndex),
+        loop_depth_(0),
+        graph_entry_(NULL),
+        temp_count_(0),
+        args_pushed_(0),
+        nesting_stack_(NULL),
+        osr_id_(osr_id),
+        is_optimizing_(is_optimizing) { }
 
 
 void FlowGraphBuilder::AddCatchEntry(CatchBlockEntryInstr* entry) {
@@ -1012,7 +1010,7 @@
   if ((node->token_pos() != Scanner::kNoSourcePos) &&
       !function.is_native() && FLAG_enable_debugger) {
     AddInstruction(new DebugStepCheckInstr(node->token_pos(),
-                                           PcDescriptors::kReturn));
+                                           PcDescriptors::kRuntimeCall));
   }
 
   if (FLAG_enable_type_checks) {
@@ -1416,16 +1414,10 @@
 }
 
 
-void FlowGraphBuilder::WarnOnJSIntegralNumTypeTest(
+bool FlowGraphBuilder::WarnOnJSIntegralNumTypeTest(
     AstNode* node, const AbstractType& type) const {
-  if (is_optimizing()) {
-    // Warnings for constants are issued when the graph is built for the first
-    // time only, i.e. just before generating unoptimized code.
-    // They should not be repeated when generating optimized code.
-    return;
-  }
   if (!(node->IsLiteralNode() && (type.IsIntType() || type.IsDoubleType()))) {
-    return;
+    return false;
   }
   const Instance& instance = node->AsLiteralNode()->literal();
   if (type.IsIntType()) {
@@ -1433,19 +1425,16 @@
       const Double& double_instance = Double::Cast(instance);
       double value = double_instance.value();
       if (floor(value) == value) {
-        Warning(node->token_pos(),
-                "javascript compatibility warning: integral value of type "
-                "'double' is also considered to be of type 'int'");
+        return true;
       }
     }
   } else {
     ASSERT(type.IsDoubleType());
     if (instance.IsInteger()) {
-      Warning(node->token_pos(),
-              "javascript compatibility warning: integer value is also "
-              "considered to be of type 'double'");
+      return true;
     }
   }
+  return false;
 }
 
 
@@ -1464,12 +1453,6 @@
     ReturnDefinition(new ConstantInstr(Bool::Get(!negate_result)));
     return;
   }
-
-  // Check for javascript compatibility.
-  if (FLAG_warn_on_javascript_compatibility) {
-    owner()->WarnOnJSIntegralNumTypeTest(node->left(), type);
-  }
-
   ValueGraphVisitor for_left_value(owner());
   node->left()->Visit(&for_left_value);
   Append(for_left_value);
@@ -1514,12 +1497,6 @@
   ASSERT(!node->right()->AsTypeNode()->type().IsNull());
   const AbstractType& type = node->right()->AsTypeNode()->type();
   ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
-
-  // Check for javascript compatibility.
-  if (FLAG_warn_on_javascript_compatibility) {
-    owner()->WarnOnJSIntegralNumTypeTest(node->left(), type);
-  }
-
   ValueGraphVisitor for_value(owner());
   node->left()->Visit(&for_value);
   Append(for_value);
@@ -1529,8 +1506,13 @@
                        for_value.value(),
                        type,
                        dst_name)) {
-    ReturnValue(for_value.value());
-    return;
+    // Check for javascript compatibility.
+    // Do not skip type check if javascript compatibility warning is required.
+    if (!FLAG_warn_on_javascript_compatibility ||
+        !owner()->WarnOnJSIntegralNumTypeTest(node->left(), type)) {
+      ReturnValue(for_value.value());
+      return;
+    }
   }
   PushArgumentInstr* push_left = PushArgument(for_value.value());
   PushArgumentInstr* push_instantiator = NULL;
@@ -3065,10 +3047,11 @@
         load->set_recognized_kind(kind);
         return ReturnDefinition(load);
       }
-      case MethodRecognizer::kObjectCid:
-      case MethodRecognizer::kTypedListBaseCid: {
-        Value* receiver = Bind(BuildLoadThisVar(node->scope()));
-        LoadClassIdInstr* load = new LoadClassIdInstr(receiver);
+      case MethodRecognizer::kClassIDgetID: {
+        LocalVariable* value_var =
+            node->scope()->LookupVariable(Symbols::Value(), true);
+        Value* value = Bind(new LoadLocalInstr(*value_var));
+        LoadClassIdInstr* load = new LoadClassIdInstr(value);
         return ReturnDefinition(load);
       }
       case MethodRecognizer::kGrowableArrayCapacity: {
@@ -3941,12 +3924,9 @@
   ASSERT(!for_effect.is_open());
 
   // When compiling for OSR, use a depth first search to prune instructions
-  // unreachable from the OSR entry.  Catch entries are not (yet) properly
-  // recognized as reachable.
+  // unreachable from the OSR entry. Catch entries are always considered
+  // reachable, even if they become unreachable after OSR.
   if (osr_id_ != Isolate::kNoDeoptId) {
-    if (graph_entry_->SuccessorCount() > 1) {
-      Bailout("try/catch when compiling for OSR");
-    }
     PruneUnreachable();
   }
 
@@ -3964,43 +3944,14 @@
 }
 
 
-void FlowGraphBuilder::Warning(intptr_t token_pos,
-                               const char* format, ...) const {
-  if (FLAG_silent_warnings) return;
-  const Function& function = parsed_function_->function();
-  va_list args;
-  va_start(args, format);
-  const Error& error = Error::Handle(
-      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) {
-    I->long_jump_base()->Jump(1, error);
-    UNREACHABLE();
-  } else {
-    OS::Print("%s", error.ToErrorCString());
-  }
-}
-
-
 void FlowGraphBuilder::Bailout(const char* reason) const {
   const Function& function = parsed_function_->function();
-  const Error& error = Error::Handle(
-      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);
+  Report::MessageF(Report::kBailout,
+                   Script::Handle(function.script()),
+                   function.token_pos(),
+                   "FlowGraphBuilder Bailout: %s %s",
+                   String::Handle(function.name()).ToCString(),
+                   reason);
   UNREACHABLE();
 }
 
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 8467cb5..bbd3c94 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -32,21 +32,21 @@
 // (factory-name-symbol, result-cid, fingerprint).
 // TODO(srdjan): Store the values in the snapshot instead.
 #define RECOGNIZED_LIST_FACTORY_LIST(V)                                        \
-  V(_ListFactory, kArrayCid, 176587978)                                        \
-  V(_GrowableListWithData, kGrowableObjectArrayCid, 264792196)                 \
-  V(_GrowableListFactory, kGrowableObjectArrayCid, 1720763678)                 \
-  V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 545976988)                      \
-  V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 981297074)                    \
-  V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 1617830104)     \
-  V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 300928419)                    \
-  V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 480982704)                  \
-  V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 1876611964)                   \
-  V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 1811693442)                 \
-  V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 958749261)                    \
-  V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 767338823)                  \
-  V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 1599078532)               \
-  V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 1721244151)               \
-  V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 879975401)            \
+  V(_ListFactory, kArrayCid, 1595327584)                                       \
+  V(_GrowableListWithData, kGrowableObjectArrayCid, 732923072)                 \
+  V(_GrowableListFactory, kGrowableObjectArrayCid, 1956565810)                 \
+  V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 1499010120)                     \
+  V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 354210806)                    \
+  V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 231626935)      \
+  V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 1044203454)                   \
+  V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 616427808)                  \
+  V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 26656923)                     \
+  V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 297463966)                  \
+  V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 105050331)                    \
+  V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 1469861670)                 \
+  V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 342242776)                \
+  V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 105860920)                \
+  V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 1217848993)           \
 
 
 // Class that recognizes factories and returns corresponding result cid.
@@ -143,7 +143,7 @@
   // The inlining context is NULL if not inlining.  The osr_id is the deopt
   // id of the OSR entry or Isolate::kNoDeoptId if not compiling for OSR.
   FlowGraphBuilder(ParsedFunction* parsed_function,
-                   const Array& ic_data_array,
+                   const ZoneGrowableArray<const ICData*>& ic_data_array,
                    InlineExitCollector* exit_collector,
                    intptr_t osr_id,
                    bool is_optimizing);
@@ -151,14 +151,15 @@
   FlowGraph* BuildGraph();
 
   ParsedFunction* parsed_function() const { return parsed_function_; }
-  const Array& ic_data_array() const { return ic_data_array_; }
+  const ZoneGrowableArray<const ICData*>& ic_data_array() const {
+    return ic_data_array_;
+  }
 
-  void WarnOnJSIntegralNumTypeTest(AstNode* node,
+  // Return true if a Javascript compatibility warning should be emitted at
+  // runtime for this type test.
+  bool WarnOnJSIntegralNumTypeTest(AstNode* node,
                                    const AbstractType& type) const;
 
-  void Warning(intptr_t token_pos, const char* format, ...) const
-      PRINTF_ATTRIBUTE(3, 4);
-
   void Bailout(const char* reason) const;
 
   intptr_t AllocateBlockId() { return ++last_used_block_id_; }
@@ -235,7 +236,7 @@
   }
 
   ParsedFunction* parsed_function_;
-  const Array& ic_data_array_;
+  const ZoneGrowableArray<const ICData*>& ic_data_array_;
 
   const intptr_t num_copied_params_;
   const intptr_t num_non_copied_params_;
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 45b54ef..66d3c95 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -27,6 +27,7 @@
 DECLARE_FLAG(bool, code_comments);
 DECLARE_FLAG(bool, disassemble);
 DECLARE_FLAG(bool, disassemble_optimized);
+DECLARE_FLAG(bool, emit_edge_counters);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, intrinsify);
 DECLARE_FLAG(bool, propagate_ic_data);
@@ -107,6 +108,23 @@
       entry_patch_pc_offset_(Code::kInvalidPc),
       patch_code_pc_offset_(Code::kInvalidPc),
       lazy_deopt_pc_offset_(Code::kInvalidPc) {
+  if (!is_optimizing) {
+    const intptr_t len = isolate()->deopt_id();
+    deopt_id_to_ic_data_ = new(isolate()) ZoneGrowableArray<const ICData*>(len);
+    deopt_id_to_ic_data_->SetLength(len);
+    for (intptr_t i = 0; i < len; i++) {
+      (*deopt_id_to_ic_data_)[i] = NULL;
+    }
+    const Array& old_saved_icdata = Array::Handle(isolate(),
+        flow_graph->parsed_function().function().ic_data_array());
+    const intptr_t saved_len =
+        old_saved_icdata.IsNull() ? 0 : old_saved_icdata.Length();
+    for (intptr_t i = 0; i < saved_len; i++) {
+      ICData& icd = ICData::ZoneHandle(isolate());
+      icd ^= old_saved_icdata.At(i);
+      (*deopt_id_to_ic_data_)[icd.deopt_id()] = &icd;
+    }
+  }
   ASSERT(assembler != NULL);
   ASSERT(!list_class_.IsNull());
 }
@@ -336,16 +354,12 @@
 
 void FlowGraphCompiler::Bailout(const char* reason) {
   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,
-                                  "FlowGraphCompiler Bailout: %s %s",
-                                  String::Handle(function.name()).ToCString(),
-                                  reason));
-  isolate()->long_jump_base()->Jump(1, error);
+  Report::MessageF(Report::kBailout,
+                   Script::Handle(function.script()),
+                   function.token_pos(),
+                   "FlowGraphCompiler Bailout: %s %s",
+                   String::Handle(function.name()).ToCString(),
+                   reason);
   UNREACHABLE();
 }
 
@@ -888,16 +902,31 @@
                                            const Function& function,
                                            intptr_t argument_count,
                                            const Array& argument_names,
-                                           LocationSummary* locs) {
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
-                                                 argument_names));
-  if (is_optimizing()) {
-    EmitOptimizedStaticCall(function, arguments_descriptor, argument_count,
-                            deopt_id, token_pos, locs);
+                                           LocationSummary* locs,
+                                           const ICData& ic_data) {
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      ic_data.IsNull() ? ArgumentsDescriptor::New(argument_count,
+                                                  argument_names)
+                       : ic_data.arguments_descriptor());
+  // Proper reporting of Javascript incompatibilities requires icdata and
+  // may therefore prevent the optimization of some static calls.
+  if (is_optimizing() &&
+      !(FLAG_warn_on_javascript_compatibility &&
+        (MethodRecognizer::RecognizeKind(function) ==
+         MethodRecognizer::kObjectIdentical))) {
+    EmitOptimizedStaticCall(function, arguments_descriptor,
+                            argument_count, deopt_id, token_pos, locs);
   } else {
-    EmitUnoptimizedStaticCall(function, arguments_descriptor, argument_count,
-                              deopt_id, token_pos, locs);
+    ICData& call_ic_data = ICData::ZoneHandle(ic_data.raw());
+    if (call_ic_data.IsNull()) {
+      const intptr_t kNumArgsChecked = 0;
+      call_ic_data = GetOrAddStaticCallICData(deopt_id,
+                                              function,
+                                              arguments_descriptor,
+                                              kNumArgsChecked)->raw();
+    }
+    EmitUnoptimizedStaticCall(argument_count, deopt_id, token_pos, locs,
+                              call_ic_data);
   }
 }
 
@@ -956,6 +985,15 @@
 }
 
 
+bool FlowGraphCompiler::NeedsEdgeCounter(TargetEntryInstr* block) {
+  // Only emit an edge counter if there is not goto at the end of the block,
+  // except for the entry block.
+  return (FLAG_emit_edge_counters
+      && (!block->last_instruction()->IsGoto()
+          || (block == flow_graph().graph_entry()->normal_entry())));
+}
+
+
 // Allocate a register that is not explicitly blocked.
 static Register AllocateFreeRegister(bool* blocked_registers) {
   for (intptr_t regno = 0; regno < kNumberOfCpuRegisters; regno++) {
@@ -1211,12 +1249,14 @@
 }
 
 
-intptr_t ParallelMoveResolver::AllocateScratchRegister(Location::Kind kind,
-                                                       intptr_t blocked,
-                                                       intptr_t register_count,
-                                                       bool* spilled) {
+intptr_t ParallelMoveResolver::AllocateScratchRegister(
+    Location::Kind kind,
+    intptr_t blocked,
+    intptr_t first_free_register,
+    intptr_t last_free_register,
+    bool* spilled) {
   intptr_t scratch = -1;
-  for (intptr_t reg = 0; reg < register_count; reg++) {
+  for (intptr_t reg = first_free_register; reg <= last_free_register; reg++) {
     if ((blocked != reg) &&
         IsScratchLocation(Location::MachineRegisterLocation(kind, reg))) {
       scratch = reg;
@@ -1226,9 +1266,10 @@
 
   if (scratch == -1) {
     *spilled = true;
-    for (intptr_t reg = 0; reg < register_count; reg++) {
+    for (intptr_t reg = first_free_register; reg <= last_free_register; reg++) {
       if (blocked != reg) {
         scratch = reg;
+        break;
       }
     }
   } else {
@@ -1247,7 +1288,8 @@
   reg_ = static_cast<FpuRegister>(
       resolver_->AllocateScratchRegister(Location::kFpuRegister,
                                          blocked,
-                                         kNumberOfFpuRegisters,
+                                         0,
+                                         kNumberOfFpuRegisters - 1,
                                          &spilled_));
 
   if (spilled_) {
@@ -1271,7 +1313,8 @@
   reg_ = static_cast<Register>(
       resolver_->AllocateScratchRegister(Location::kRegister,
                                          blocked,
-                                         kNumberOfCpuRegisters,
+                                         kFirstFreeCpuRegister,
+                                         kLastFreeCpuRegister,
                                          &spilled_));
 
   if (spilled_) {
@@ -1309,4 +1352,47 @@
   sorted->Sort(HighestCountFirst);
 }
 
+
+const ICData* FlowGraphCompiler::GetOrAddInstanceCallICData(
+    intptr_t deopt_id,
+    const String& target_name,
+    const Array& arguments_descriptor,
+    intptr_t num_args_tested) {
+  if ((deopt_id_to_ic_data_ != NULL) &&
+      ((*deopt_id_to_ic_data_)[deopt_id] != NULL)) {
+    const ICData* res = (*deopt_id_to_ic_data_)[deopt_id];
+    ASSERT(res->deopt_id() == deopt_id);
+    ASSERT(res->target_name() == target_name.raw());
+    ASSERT(res->NumArgsTested() == num_args_tested);
+    return res;
+  }
+  const ICData& ic_data = ICData::ZoneHandle(isolate(), ICData::New(
+      parsed_function().function(), target_name,
+      arguments_descriptor, deopt_id, num_args_tested));
+  (*deopt_id_to_ic_data_)[deopt_id] = &ic_data;
+  return &ic_data;
+}
+
+
+const ICData* FlowGraphCompiler::GetOrAddStaticCallICData(
+    intptr_t deopt_id,
+    const Function& target,
+    const Array& arguments_descriptor,
+    intptr_t num_args_tested) {
+  if ((deopt_id_to_ic_data_ != NULL) &&
+      ((*deopt_id_to_ic_data_)[deopt_id] != NULL)) {
+    const ICData* res = (*deopt_id_to_ic_data_)[deopt_id];
+    ASSERT(res->deopt_id() == deopt_id);
+    ASSERT(res->target_name() == target.name());
+    ASSERT(res->NumArgsTested() == num_args_tested);
+    return res;
+  }
+  const ICData& ic_data = ICData::ZoneHandle(isolate(), ICData::New(
+      parsed_function().function(), String::Handle(isolate(), target.name()),
+      arguments_descriptor, deopt_id, num_args_tested));
+  ic_data.AddTarget(target);
+  (*deopt_id_to_ic_data_)[deopt_id] = &ic_data;
+  return &ic_data;
+}
+
 }  // namespace dart
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 6546ff8..a5f2e4f 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -62,7 +62,8 @@
   bool IsScratchLocation(Location loc);
   intptr_t AllocateScratchRegister(Location::Kind kind,
                                    intptr_t blocked,
-                                   intptr_t register_count,
+                                   intptr_t first_free_register,
+                                   intptr_t last_free_register,
                                    bool* spilled);
 
   void SpillScratch(Register reg);
@@ -118,6 +119,7 @@
         deopt_env_(deopt_env) {
     ASSERT(deopt_env != NULL);
   }
+  virtual ~CompilerDeoptInfo() { }
 
   RawDeoptInfo* CreateDeoptInfo(FlowGraphCompiler* compiler,
                                 DeoptInfoBuilder* builder,
@@ -173,6 +175,7 @@
 class SlowPathCode : public ZoneAllocated {
  public:
   SlowPathCode() : entry_label_(), exit_label_() { }
+  virtual ~SlowPathCode() { }
 
   Label* entry_label() { return &entry_label_; }
   Label* exit_label() { return &exit_label_; }
@@ -331,7 +334,8 @@
                           const Function& function,
                           intptr_t argument_count,
                           const Array& argument_names,
-                          LocationSummary* locs);
+                          LocationSummary* locs,
+                          const ICData& ic_data);
 
   void GenerateNumberTypeCheck(Register kClassIdReg,
                                const AbstractType& type,
@@ -345,6 +349,8 @@
 
   void EmitComment(Instruction* instr);
 
+  bool NeedsEdgeCounter(TargetEntryInstr* block);
+
   void EmitEdgeCounter();
 
   void EmitOptimizedInstanceCall(ExternalLabel* target_label,
@@ -451,6 +457,21 @@
   static void SortICDataByCount(const ICData& ic_data,
                                 GrowableArray<CidTarget>* sorted);
 
+  // Use in unoptimized compilation to preserve/reuse ICData.
+  const ICData* GetOrAddInstanceCallICData(intptr_t deopt_id,
+                                           const String& target_name,
+                                           const Array& arguments_descriptor,
+                                           intptr_t num_args_tested);
+
+  const ICData* GetOrAddStaticCallICData(intptr_t deopt_id,
+                                         const Function& target,
+                                         const Array& arguments_descriptor,
+                                         intptr_t num_args_tested);
+
+  const ZoneGrowableArray<const ICData*>& deopt_id_to_ic_data() const {
+    return *deopt_id_to_ic_data_;
+  }
+
  private:
   friend class CheckStackOverflowSlowPath;  // For pending_deoptimization_env_.
 
@@ -475,12 +496,11 @@
                                intptr_t token_pos,
                                LocationSummary* locs);
 
-  void EmitUnoptimizedStaticCall(const Function& function,
-                                 const Array& arguments_descriptor,
-                                 intptr_t argument_count,
+  void EmitUnoptimizedStaticCall(intptr_t argument_count,
                                  intptr_t deopt_id,
                                  intptr_t token_pos,
-                                 LocationSummary* locs);
+                                 LocationSummary* locs,
+                                 const ICData& ic_data);
 
   // Type checking helper methods.
   void CheckClassIds(Register class_id_reg,
@@ -598,6 +618,8 @@
   intptr_t patch_code_pc_offset_;
   intptr_t lazy_deopt_pc_offset_;
 
+  ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data_;
+
   DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler);
 };
 
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index e5108c8..7a4b4d9 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -949,7 +949,7 @@
   __ Comment("Inlined Setter");
   __ ldr(R0, Address(SP, 1 * kWordSize));  // Receiver.
   __ ldr(R1, Address(SP, 0 * kWordSize));  // Value.
-  __ StoreIntoObject(R0, FieldAddress(R0, offset), R1);
+  __ StoreIntoObjectOffset(R0, offset, R1);
   __ LoadImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
   __ Ret();
 }
@@ -1236,19 +1236,10 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
-  Label not_smi, load_cache;
   __ LoadFromOffset(kWord, R0, SP, (argument_count - 1) * kWordSize);
-  __ tst(R0, Operand(kSmiTagMask));
-  __ b(&not_smi, NE);
-  __ mov(R0, Operand(Smi::RawValue(kSmiCid)));
-  __ b(&load_cache);
-
-  __ Bind(&not_smi);
-  __ LoadClassId(R0, R0);
-  __ SmiTag(R0);
+  __ LoadTaggedClassIdMayBeSmi(R0, R0);
 
   // R0: class ID of the receiver (smi).
-  __ Bind(&load_cache);
   __ LoadObject(R1, cache);
   __ ldr(R2, FieldAddress(R1, MegamorphicCache::buckets_offset()));
   __ ldr(R1, FieldAddress(R1, MegamorphicCache::mask_offset()));
@@ -1294,27 +1285,11 @@
 
 
 void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    const Function& target_function,
-    const Array& arguments_descriptor,
     intptr_t argument_count,
     intptr_t deopt_id,
     intptr_t token_pos,
-    LocationSummary* locs) {
-  // TODO(srdjan): Improve performance of function recognition.
-  MethodRecognizer::Kind recognized_kind =
-      MethodRecognizer::RecognizeKind(target_function);
-  int num_args_checked = 0;
-  if ((recognized_kind == MethodRecognizer::kMathMin) ||
-      (recognized_kind == MethodRecognizer::kMathMax)) {
-    num_args_checked = 2;
-  }
-  const ICData& ic_data = ICData::ZoneHandle(
-      ICData::New(parsed_function().function(),  // Caller function.
-                  String::Handle(target_function.name()),
-                  arguments_descriptor,
-                  deopt_id,
-                  num_args_checked));  // No arguments checked.
-  ic_data.AddTarget(target_function);
+    LocationSummary* locs,
+    const ICData& ic_data) {
   uword label_address = 0;
   if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 9303e38..4b81587 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -158,7 +158,7 @@
   __ Comment("Deopt stub for id %" Pd "", deopt_id());
   __ Bind(entry_label());
   if (FLAG_trap_on_deoptimization) {
-    __ hlt(0);
+    __ brk(0);
   }
 
   ASSERT(deopt_env() != NULL);
@@ -664,7 +664,7 @@
                         3,
                         locs);
     // We should never return here.
-    __ hlt(0);
+    __ brk(0);
 
     __ Bind(&is_assignable);  // For a null object.
     // Restore instantiator (R2) and its type arguments (R1).
@@ -901,7 +901,7 @@
     __ LeaveDartFrame();  // The arguments are still on the stack.
     __ BranchPatchable(&StubCode::CallNoSuchMethodFunctionLabel());
     // The noSuchMethod call may return to the caller, but not here.
-    __ hlt(0);
+    __ brk(0);
   } else if (check_correct_named_args) {
     __ Stop("Wrong arguments");
   }
@@ -974,7 +974,7 @@
 
     intptr_t threshold = FLAG_optimization_counter_threshold;
     __ LoadFieldFromOffset(
-        R7, function_reg, Function::usage_counter_offset(), new_pp);
+        R7, function_reg, Function::usage_counter_offset(), new_pp, kWord);
     if (is_optimizing()) {
       // Reoptimization of an optimized function is triggered by counting in
       // IC stubs, but not at the entry of the function.
@@ -982,7 +982,7 @@
     } else {
       __ add(R7, R7, Operand(1));
       __ StoreFieldToOffset(
-          R7, function_reg, Function::usage_counter_offset(), new_pp);
+          R7, function_reg, Function::usage_counter_offset(), new_pp, kWord);
     }
     __ CompareImmediate(R7, threshold, new_pp);
     ASSERT(function_reg == R6);
@@ -1073,7 +1073,7 @@
         __ LeaveDartFrame();  // The arguments are still on the stack.
         __ BranchPatchable(&StubCode::CallNoSuchMethodFunctionLabel());
         // The noSuchMethod call may return to the caller, but not here.
-        __ hlt(0);
+        __ brk(0);
       } else {
         __ Stop("Wrong number of arguments");
       }
@@ -1097,7 +1097,7 @@
 
   VisitBlocks();
 
-  __ hlt(0);
+  __ brk(0);
   GenerateDeferredCode();
 
   // Emit function patching code. This will be swapped with the first 3
@@ -1242,19 +1242,10 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
-  Label not_smi, load_cache;
   __ LoadFromOffset(R0, SP, (argument_count - 1) * kWordSize, PP);
-  __ tsti(R0, kSmiTagMask);
-  __ b(&not_smi, NE);
-  __ LoadImmediate(R0, Smi::RawValue(kSmiCid), PP);
-  __ b(&load_cache);
-
-  __ Bind(&not_smi);
-  __ LoadClassId(R0, R0, PP);
-  __ SmiTag(R0);
+  __ LoadTaggedClassIdMayBeSmi(R0, R0);
 
   // R0: class ID of the receiver (smi).
-  __ Bind(&load_cache);
   __ LoadObject(R1, cache, PP);
   __ LoadFieldFromOffset(R2, R1, MegamorphicCache::buckets_offset(), PP);
   __ LoadFieldFromOffset(R1, R1, MegamorphicCache::mask_offset(), PP);
@@ -1300,27 +1291,11 @@
 
 
 void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    const Function& target_function,
-    const Array& arguments_descriptor,
     intptr_t argument_count,
     intptr_t deopt_id,
     intptr_t token_pos,
-    LocationSummary* locs) {
-  // TODO(srdjan): Improve performance of function recognition.
-  MethodRecognizer::Kind recognized_kind =
-      MethodRecognizer::RecognizeKind(target_function);
-  int num_args_checked = 0;
-  if ((recognized_kind == MethodRecognizer::kMathMin) ||
-      (recognized_kind == MethodRecognizer::kMathMax)) {
-    num_args_checked = 2;
-  }
-  const ICData& ic_data = ICData::ZoneHandle(
-      ICData::New(parsed_function().function(),  // Caller function.
-                  String::Handle(target_function.name()),
-                  arguments_descriptor,
-                  deopt_id,
-                  num_args_checked));  // No arguments checked.
-  ic_data.AddTarget(target_function);
+    LocationSummary* locs,
+    const ICData& ic_data) {
   uword label_address = 0;
   if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 4a287b4..25d3fd9 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, throw_on_javascript_int_overflow);
 DECLARE_FLAG(bool, enable_simd_inline);
 
 
@@ -1169,27 +1168,11 @@
 
 
 void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    const Function& target_function,
-    const Array& arguments_descriptor,
     intptr_t argument_count,
     intptr_t deopt_id,
     intptr_t token_pos,
-    LocationSummary* locs) {
-  // TODO(srdjan): Improve performance of function recognition.
-  MethodRecognizer::Kind recognized_kind =
-      MethodRecognizer::RecognizeKind(target_function);
-  int num_args_checked = 0;
-  if ((recognized_kind == MethodRecognizer::kMathMin) ||
-      (recognized_kind == MethodRecognizer::kMathMax)) {
-    num_args_checked = 2;
-  }
-  const ICData& ic_data = ICData::ZoneHandle(
-      ICData::New(parsed_function().function(),  // Caller function.
-                  String::Handle(target_function.name()),
-                  arguments_descriptor,
-                  deopt_id,
-                  num_args_checked));  // No arguments checked.
-  ic_data.AddTarget(target_function);
+    LocationSummary* locs,
+    const ICData& ic_data) {
   uword label_address = 0;
   if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
@@ -1287,16 +1270,9 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
-  Label not_smi, load_cache;
+  Label load_cache;
   __ movl(EAX, Address(ESP, (argument_count - 1) * kWordSize));
-  __ testl(EAX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
-  __ movl(EAX, Immediate(Smi::RawValue(kSmiCid)));
-  __ jmp(&load_cache);
-
-  __ Bind(&not_smi);
-  __ LoadClassId(EAX, EAX);
-  __ SmiTag(EAX);
+  __ LoadTaggedClassIdMayBeSmi(EAX, EAX);
 
   // EAX: class ID of the receiver (smi).
   __ Bind(&load_cache);
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index c4e47f5..d86d744 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -972,7 +972,7 @@
   __ Comment("Inlined Setter");
   __ lw(T0, Address(SP, 1 * kWordSize));  // Receiver.
   __ lw(T1, Address(SP, 0 * kWordSize));  // Value.
-  __ StoreIntoObject(T0, FieldAddress(T0, offset), T1);
+  __ StoreIntoObjectOffset(T0, offset, T1);
   __ LoadImmediate(V0, reinterpret_cast<int32_t>(Object::null()));
   __ Ret();
 }
@@ -1276,20 +1276,11 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
-  Label not_smi, load_cache;
   __ TraceSimMsg("MegamorphicInstanceCall");
   __ lw(T0, Address(SP, (argument_count - 1) * kWordSize));
-  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &not_smi);
-  __ LoadImmediate(T0, Smi::RawValue(kSmiCid));
-  __ b(&load_cache);
-
-  __ Bind(&not_smi);
-  __ LoadClassId(T0, T0);
-  __ SmiTag(T0);
+  __ LoadTaggedClassIdMayBeSmi(T0, T0);
 
   // T0: class ID of the receiver (smi).
-  __ Bind(&load_cache);
   __ LoadObject(T1, cache);
   __ lw(T2, FieldAddress(T1, MegamorphicCache::buckets_offset()));
   __ lw(T1, FieldAddress(T1, MegamorphicCache::mask_offset()));
@@ -1336,27 +1327,11 @@
 
 
 void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    const Function& target_function,
-    const Array& arguments_descriptor,
     intptr_t argument_count,
     intptr_t deopt_id,
     intptr_t token_pos,
-    LocationSummary* locs) {
-  // TODO(srdjan): Improve performance of function recognition.
-  MethodRecognizer::Kind recognized_kind =
-      MethodRecognizer::RecognizeKind(target_function);
-  int num_args_checked = 0;
-  if ((recognized_kind == MethodRecognizer::kMathMin) ||
-      (recognized_kind == MethodRecognizer::kMathMax)) {
-    num_args_checked = 2;
-  }
-  const ICData& ic_data = ICData::ZoneHandle(
-      ICData::New(parsed_function().function(),  // Caller function.
-                  String::Handle(target_function.name()),
-                  arguments_descriptor,
-                  deopt_id,
-                  num_args_checked));  // No arguments checked.
-  ic_data.AddTarget(target_function);
+    LocationSummary* locs,
+    const ICData& ic_data) {
   uword label_address = 0;
   if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 67f1d12..f183de6 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -1005,16 +1005,14 @@
     if (is_optimizing()) {
       // Reoptimization of an optimized function is triggered by counting in
       // IC stubs, but not at the entry of the function.
-      __ CompareImmediate(
+      __ cmpl(
           FieldAddress(function_reg, Function::usage_counter_offset()),
-          Immediate(FLAG_reoptimization_counter_threshold),
-          new_pp);
+          Immediate(FLAG_reoptimization_counter_threshold));
     } else {
-      __ incq(FieldAddress(function_reg, Function::usage_counter_offset()));
-      __ CompareImmediate(
+      __ incl(FieldAddress(function_reg, Function::usage_counter_offset()));
+      __ cmpl(
           FieldAddress(function_reg, Function::usage_counter_offset()),
-          Immediate(FLAG_optimization_counter_threshold),
-          new_pp);
+          Immediate(FLAG_optimization_counter_threshold));
     }
     ASSERT(function_reg == RDI);
     __ J(GREATER_EQUAL, &StubCode::OptimizeFunctionLabel(), R13);
@@ -1207,27 +1205,11 @@
 
 
 void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    const Function& target_function,
-    const Array& arguments_descriptor,
     intptr_t argument_count,
     intptr_t deopt_id,
     intptr_t token_pos,
-    LocationSummary* locs) {
-  // TODO(srdjan): Improve performance of function recognition.
-  MethodRecognizer::Kind recognized_kind =
-      MethodRecognizer::RecognizeKind(target_function);
-  int num_args_checked = 0;
-  if ((recognized_kind == MethodRecognizer::kMathMin) ||
-      (recognized_kind == MethodRecognizer::kMathMax)) {
-    num_args_checked = 2;
-  }
-  const ICData& ic_data = ICData::ZoneHandle(
-      ICData::New(parsed_function().function(),  // Caller function.
-                  String::Handle(target_function.name()),
-                  arguments_descriptor,
-                  deopt_id,
-                  num_args_checked));  // No arguments checked.
-  ic_data.AddTarget(target_function);
+    LocationSummary* locs,
+    const ICData& ic_data) {
   uword label_address = 0;
   if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
@@ -1325,19 +1307,10 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
-  Label not_smi, load_cache;
   __ movq(RAX, Address(RSP, (argument_count - 1) * kWordSize));
-  __ testq(RAX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
-  __ LoadImmediate(RAX, Immediate(Smi::RawValue(kSmiCid)), PP);
-  __ jmp(&load_cache);
-
-  __ Bind(&not_smi);
-  __ LoadClassId(RAX, RAX);
-  __ SmiTag(RAX);
+  __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
 
   // RAX: class ID of the receiver (smi).
-  __ Bind(&load_cache);
   __ LoadObject(RBX, cache, PP);
   __ movq(RDI, FieldAddress(RBX, MegamorphicCache::buckets_offset()));
   __ movq(RBX, FieldAddress(RBX, MegamorphicCache::mask_offset()));
@@ -1474,58 +1447,15 @@
 // This function must be in sync with FlowGraphCompiler::RecordSafepoint and
 // FlowGraphCompiler::SlowPathEnvironmentFor.
 void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) {
-  // TODO(vegorov): consider saving only caller save (volatile) registers.
-  const intptr_t xmm_regs_count = locs->live_registers()->FpuRegisterCount();
-  if (xmm_regs_count > 0) {
-    __ AddImmediate(RSP, Immediate(-xmm_regs_count * kFpuRegisterSize), PP);
-    // Store XMM registers with the lowest register number at the lowest
-    // address.
-    intptr_t offset = 0;
-    for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
-      XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
-      if (locs->live_registers()->ContainsFpuRegister(xmm_reg)) {
-        __ movups(Address(RSP, offset), xmm_reg);
-        offset += kFpuRegisterSize;
-      }
-    }
-    ASSERT(offset == (xmm_regs_count * kFpuRegisterSize));
-  }
-
-  // Store general purpose registers with the highest register number at the
-  // lowest address.
-  for (intptr_t reg_idx = 0; reg_idx < kNumberOfCpuRegisters; ++reg_idx) {
-    Register reg = static_cast<Register>(reg_idx);
-    if (locs->live_registers()->ContainsRegister(reg)) {
-      __ pushq(reg);
-    }
-  }
+  // TODO(vegorov): avoid saving non-volatile registers.
+  __ PushRegisters(locs->live_registers()->cpu_registers(),
+                   locs->live_registers()->fpu_registers());
 }
 
 
 void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) {
-  // General purpose registers have the highest register number at the
-  // lowest address.
-  for (intptr_t reg_idx = kNumberOfCpuRegisters - 1; reg_idx >= 0; --reg_idx) {
-    Register reg = static_cast<Register>(reg_idx);
-    if (locs->live_registers()->ContainsRegister(reg)) {
-      __ popq(reg);
-    }
-  }
-
-  const intptr_t xmm_regs_count = locs->live_registers()->FpuRegisterCount();
-  if (xmm_regs_count > 0) {
-    // XMM registers have the lowest register number at the lowest address.
-    intptr_t offset = 0;
-    for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
-      XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
-      if (locs->live_registers()->ContainsFpuRegister(xmm_reg)) {
-        __ movups(xmm_reg, Address(RSP, offset));
-        offset += kFpuRegisterSize;
-      }
-    }
-    ASSERT(offset == (xmm_regs_count * kFpuRegisterSize));
-    __ AddImmediate(RSP, Immediate(offset), PP);
-  }
+  __ PopRegisters(locs->live_registers()->cpu_registers(),
+                  locs->live_registers()->fpu_registers());
 }
 
 
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 11fedc1..e037d49 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -639,18 +639,15 @@
       }
 
       // Load IC data for the callee.
-      Array& ic_data_array = Array::Handle();
-
-      // IsInlineable above checked HasCode. Creating a Handle for the code
-      // should have kept GC from detaching, but let's assert just to make sure.
-      ASSERT(function.HasCode());
-      ic_data_array = unoptimized_code.ExtractTypeFeedbackArray();
+      ZoneGrowableArray<const ICData*>* ic_data_array =
+            new(isolate()) ZoneGrowableArray<const ICData*>();
+      function.RestoreICDataMap(ic_data_array);
 
       // Build the callee graph.
       InlineExitCollector* exit_collector =
           new(isolate()) InlineExitCollector(caller_graph_, call);
       FlowGraphBuilder builder(parsed_function,
-                               ic_data_array,
+                               *ic_data_array,
                                exit_collector,
                                Isolate::kNoDeoptId,
                                true);
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 1dc4c07..1160b9f 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -49,6 +49,8 @@
 DECLARE_FLAG(bool, trace_type_check_elimination);
 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
+// Quick access to the locally defined isolate() method.
+#define I (isolate())
 
 static bool ShouldInlineSimd() {
   return FlowGraphCompiler::SupportsUnboxedSimd128();
@@ -157,12 +159,12 @@
     }
   }
 
-  const Array& args_desc_array = Array::Handle(isolate(),
+  const Array& args_desc_array = Array::Handle(I,
       ArgumentsDescriptor::New(call->ArgumentCount(), call->argument_names()));
   ArgumentsDescriptor args_desc(args_desc_array);
-  const Class& receiver_class = Class::Handle(isolate(),
+  const Class& receiver_class = Class::Handle(I,
       isolate()->class_table()->At(class_ids[0]));
-  const Function& function = Function::Handle(isolate(),
+  const Function& function = Function::Handle(I,
       Resolver::ResolveDynamicForReceiverClass(
           receiver_class,
           call->function_name(),
@@ -174,7 +176,7 @@
   // since it is attached to the assembly instruction itself.
   // TODO(srdjan): Prevent modification of ICData object that is
   // referenced in assembly code.
-  ICData& ic_data = ICData::ZoneHandle(isolate(), ICData::New(
+  ICData& ic_data = ICData::ZoneHandle(I, ICData::New(
       flow_graph_->parsed_function().function(),
       call->function_name(),
       args_desc_array,
@@ -201,13 +203,13 @@
   }
 
   const Function& function =
-      Function::Handle(isolate(), ic_data.GetTargetForReceiverClassId(cid));
+      Function::Handle(I, ic_data.GetTargetForReceiverClassId(cid));
   // TODO(fschneider): Try looking up the function on the class if it is
   // not found in the ICData.
   if (!function.IsNull()) {
-    const ICData& new_ic_data = ICData::ZoneHandle(isolate(), ICData::New(
-        Function::Handle(isolate(), ic_data.owner()),
-        String::Handle(isolate(), ic_data.target_name()),
+    const ICData& new_ic_data = ICData::ZoneHandle(I, ICData::New(
+        Function::Handle(I, ic_data.owner()),
+        String::Handle(I, ic_data.target_name()),
         Object::empty_array(),  // Dummy argument descriptor.
         ic_data.deopt_id(),
         ic_data.NumArgsTested()));
@@ -240,9 +242,9 @@
 
   const bool with_checks = false;
   PolymorphicInstanceCallInstr* specialized =
-      new(isolate()) PolymorphicInstanceCallInstr(call->instance_call(),
-                                                  ic_data,
-                                                  with_checks);
+      new(I) PolymorphicInstanceCallInstr(call->instance_call(),
+                                          ic_data,
+                                          with_checks);
   call->ReplaceWith(specialized, current_iterator());
 }
 
@@ -293,10 +295,10 @@
   ASSERT(bit_and_instr->IsBinarySmiOp() || bit_and_instr->IsBinaryMintOp());
   if (bit_and_instr->IsBinaryMintOp()) {
     // Replace Mint op with Smi op.
-    BinarySmiOpInstr* smi_op = new(isolate()) BinarySmiOpInstr(
+    BinarySmiOpInstr* smi_op = new(I) BinarySmiOpInstr(
         Token::kBIT_AND,
-        new(isolate()) Value(left_instr),
-        new(isolate()) Value(right_instr),
+        new(I) Value(left_instr),
+        new(I) Value(right_instr),
         Isolate::kNoDeoptId,  // BIT_AND cannot deoptimize.
         Scanner::kNoSourcePos);
     bit_and_instr->ReplaceWith(smi_op, current_iterator());
@@ -313,10 +315,10 @@
                                                     intptr_t cid) {
   const intptr_t index_scale = Instance::ElementSizeFor(cid);
   ConstantInstr* index_instr =
-      flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(ix)));
+      flow_graph()->GetConstant(Smi::Handle(I, Smi::New(ix)));
   LoadIndexedInstr* load =
-      new(isolate()) LoadIndexedInstr(new(isolate()) Value(instr),
-                                      new(isolate()) Value(index_instr),
+      new(I) LoadIndexedInstr(new(I) Value(instr),
+                                      new(I) Value(index_instr),
                                       index_scale,
                                       cid,
                                       Isolate::kNoDeoptId,
@@ -331,10 +333,7 @@
                                                          Representation rep,
                                                          intptr_t cid) {
   ExtractNthOutputInstr* extract =
-      new(isolate()) ExtractNthOutputInstr(new(isolate()) Value(instr),
-                                           index,
-                                           rep,
-                                           cid);
+      new(I) ExtractNthOutputInstr(new(I) Value(instr), index, rep, cid);
   instr->ReplaceUsesWith(extract);
   flow_graph()->InsertAfter(instr, extract, NULL, FlowGraph::kValue);
 }
@@ -395,13 +394,12 @@
             MergedMathInstr::OutputIndexOf(other_binop->op_kind()),
             kTagged, kSmiCid);
 
-        ZoneGrowableArray<Value*>* args =
-            new(isolate()) ZoneGrowableArray<Value*>(2);
-        args->Add(new(isolate()) Value(curr_instr->left()->definition()));
-        args->Add(new(isolate()) Value(curr_instr->right()->definition()));
+        ZoneGrowableArray<Value*>* args = new(I) ZoneGrowableArray<Value*>(2);
+        args->Add(new(I) Value(curr_instr->left()->definition()));
+        args->Add(new(I) Value(curr_instr->right()->definition()));
 
         // Replace with TruncDivMod.
-        MergedMathInstr* div_mod = new(isolate()) MergedMathInstr(
+        MergedMathInstr* div_mod = new(I) MergedMathInstr(
             args,
             curr_instr->deopt_id(),
             MergedMathInstr::kTruncDivMod);
@@ -456,14 +454,13 @@
             other_op,
             MergedMathInstr::OutputIndexOf(other_kind),
             kUnboxedDouble, kDoubleCid);
-        ZoneGrowableArray<Value*>* args =
-            new(isolate()) ZoneGrowableArray<Value*>(1);
-        args->Add(new(isolate()) Value(curr_instr->value()->definition()));
+        ZoneGrowableArray<Value*>* args = new(I) ZoneGrowableArray<Value*>(1);
+        args->Add(new(I) Value(curr_instr->value()->definition()));
         // Replace with SinCos.
         MergedMathInstr* sin_cos =
-            new(isolate()) MergedMathInstr(args,
-                                           curr_instr->DeoptimizationTarget(),
-                                           MergedMathInstr::kSinCos);
+            new(I) MergedMathInstr(args,
+                                   curr_instr->DeoptimizationTarget(),
+                                   MergedMathInstr::kSinCos);
         curr_instr->ReplaceWith(sin_cos, current_iterator());
         other_op->ReplaceUsesWith(sin_cos);
         other_op->RemoveFromGraph();
@@ -610,28 +607,27 @@
            (use->Type()->ToCid() == kUnboxedMint));
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(isolate()) UnboxIntegerInstr(use->CopyWithType(), deopt_id);
+    converted = new(I) UnboxIntegerInstr(use->CopyWithType(), deopt_id);
 
   } else if ((from == kUnboxedMint) && (to == kTagged)) {
-    converted = new(isolate()) BoxIntegerInstr(use->CopyWithType());
+    converted = new(I) BoxIntegerInstr(use->CopyWithType());
 
   } else if (from == kUnboxedMint && to == kUnboxedDouble) {
     ASSERT(CanUnboxDouble());
     // Convert by boxing/unboxing.
     // TODO(fschneider): Implement direct unboxed mint-to-double conversion.
     BoxIntegerInstr* boxed =
-        new(isolate()) BoxIntegerInstr(use->CopyWithType());
+        new(I) BoxIntegerInstr(use->CopyWithType());
     use->BindTo(boxed);
     InsertBefore(insert_before, boxed, NULL, FlowGraph::kValue);
 
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(isolate()) UnboxDoubleInstr(
-        new(isolate()) Value(boxed), deopt_id);
+    converted = new(I) UnboxDoubleInstr(new(I) Value(boxed), deopt_id);
 
   } else if ((from == kUnboxedDouble) && (to == kTagged)) {
     ASSERT(CanUnboxDouble());
-    converted = new(isolate()) BoxDoubleInstr(use->CopyWithType());
+    converted = new(I) BoxDoubleInstr(use->CopyWithType());
 
   } else if ((from == kTagged) && (to == kUnboxedDouble)) {
     ASSERT(CanUnboxDouble());
@@ -643,38 +639,35 @@
     if ((constant != NULL) && constant->value().IsSmi()) {
       const double dbl_val = Smi::Cast(constant->value()).AsDoubleValue();
       const Double& dbl_obj =
-          Double::ZoneHandle(isolate(), Double::New(dbl_val, Heap::kOld));
+          Double::ZoneHandle(I, Double::NewCanonical(dbl_val));
       ConstantInstr* double_const = flow_graph()->GetConstant(dbl_obj);
-      converted = new(isolate()) UnboxDoubleInstr(
-          new(isolate()) Value(double_const), deopt_id);
+      converted = new(I) UnboxDoubleInstr(new(I) Value(double_const), deopt_id);
     } else {
-      converted = new(isolate()) UnboxDoubleInstr(
-          use->CopyWithType(), deopt_id);
+      converted = new(I) UnboxDoubleInstr(use->CopyWithType(), deopt_id);
     }
   } else if ((from == kTagged) && (to == kUnboxedFloat32x4)) {
     ASSERT((deopt_target != NULL) ||
            (use->Type()->ToCid() == kFloat32x4Cid));
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(isolate()) UnboxFloat32x4Instr(
+    converted = new(I) UnboxFloat32x4Instr(
         use->CopyWithType(), deopt_id);
   } else if ((from == kUnboxedFloat32x4) && (to == kTagged)) {
-    converted = new(isolate()) BoxFloat32x4Instr(use->CopyWithType());
+    converted = new(I) BoxFloat32x4Instr(use->CopyWithType());
   } else if ((from == kTagged) && (to == kUnboxedInt32x4)) {
     ASSERT((deopt_target != NULL) || (use->Type()->ToCid() == kInt32x4Cid));
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(isolate()) UnboxInt32x4Instr(use->CopyWithType(), deopt_id);
+    converted = new(I) UnboxInt32x4Instr(use->CopyWithType(), deopt_id);
   } else if ((from == kUnboxedInt32x4) && (to == kTagged)) {
-    converted = new(isolate()) BoxInt32x4Instr(use->CopyWithType());
+    converted = new(I) BoxInt32x4Instr(use->CopyWithType());
   } else if ((from == kTagged) && (to == kUnboxedFloat64x2)) {
     ASSERT((deopt_target != NULL) || (use->Type()->ToCid() == kFloat64x2Cid));
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(isolate()) UnboxFloat64x2Instr(
-        use->CopyWithType(), deopt_id);
+    converted = new(I) UnboxFloat64x2Instr(use->CopyWithType(), deopt_id);
   } else if ((from == kUnboxedFloat64x2) && (to == kTagged)) {
-    converted = new(isolate()) BoxFloat64x2Instr(use->CopyWithType());
+    converted = new(I) BoxFloat64x2Instr(use->CopyWithType());
   } else {
     // We have failed to find a suitable conversion instruction.
     // Insert two "dummy" conversion instructions with the correct
@@ -686,31 +679,31 @@
     ASSERT(to != kTagged);
     Definition* boxed = NULL;
     if (from == kUnboxedDouble) {
-      boxed = new(isolate()) BoxDoubleInstr(use->CopyWithType());
+      boxed = new(I) BoxDoubleInstr(use->CopyWithType());
     } else if (from == kUnboxedInt32x4) {
-      boxed = new(isolate()) BoxInt32x4Instr(use->CopyWithType());
+      boxed = new(I) BoxInt32x4Instr(use->CopyWithType());
     } else if (from == kUnboxedFloat32x4) {
-      boxed = new(isolate()) BoxFloat32x4Instr(use->CopyWithType());
+      boxed = new(I) BoxFloat32x4Instr(use->CopyWithType());
     } else if (from == kUnboxedMint) {
-      boxed = new(isolate()) BoxIntegerInstr(use->CopyWithType());
+      boxed = new(I) BoxIntegerInstr(use->CopyWithType());
     } else if (from == kUnboxedFloat64x2) {
-      boxed = new(isolate()) BoxFloat64x2Instr(use->CopyWithType());
+      boxed = new(I) BoxFloat64x2Instr(use->CopyWithType());
     } else {
       UNIMPLEMENTED();
     }
     use->BindTo(boxed);
     InsertBefore(insert_before, boxed, NULL, FlowGraph::kValue);
-    Value* to_value = new(isolate()) Value(boxed);
+    Value* to_value = new(I) Value(boxed);
     if (to == kUnboxedDouble) {
-      converted = new(isolate()) UnboxDoubleInstr(to_value, deopt_id);
+      converted = new(I) UnboxDoubleInstr(to_value, deopt_id);
     } else if (to == kUnboxedInt32x4) {
-      converted = new(isolate()) UnboxInt32x4Instr(to_value, deopt_id);
+      converted = new(I) UnboxInt32x4Instr(to_value, deopt_id);
     } else if (to == kUnboxedFloat32x4) {
-      converted = new(isolate()) UnboxFloat32x4Instr(to_value, deopt_id);
+      converted = new(I) UnboxFloat32x4Instr(to_value, deopt_id);
     } else if (to == kUnboxedMint) {
-      converted = new(isolate()) UnboxIntegerInstr(to_value, deopt_id);
+      converted = new(I) UnboxIntegerInstr(to_value, deopt_id);
     } else if (to == kUnboxedFloat64x2) {
-      converted = new(isolate()) UnboxFloat64x2Instr(to_value, deopt_id);
+      converted = new(I) UnboxFloat64x2Instr(to_value, deopt_id);
     } else {
       UNIMPLEMENTED();
     }
@@ -991,9 +984,9 @@
                                      Instruction* insert_before) {
   if (to_check->Type()->ToCid() != kSmiCid) {
     InsertBefore(insert_before,
-                 new(isolate()) CheckSmiInstr(new(isolate()) Value(to_check),
-                                              deopt_id,
-                                              insert_before->token_pos()),
+                 new(I) CheckSmiInstr(new(I) Value(to_check),
+                                      deopt_id,
+                                      insert_before->token_pos()),
                  deopt_environment,
                  FlowGraph::kEffect);
   }
@@ -1006,12 +999,12 @@
                                                intptr_t token_pos) {
   if ((unary_checks.NumberOfChecks() == 1) &&
       (unary_checks.GetReceiverClassIdAt(0) == kSmiCid)) {
-    return new(isolate()) CheckSmiInstr(new(isolate()) Value(to_check),
-                                        deopt_id,
-                                        token_pos);
+    return new(I) CheckSmiInstr(new(I) Value(to_check),
+                                deopt_id,
+                                token_pos);
   }
-  return new(isolate()) CheckClassInstr(
-      new(isolate()) Value(to_check), deopt_id, unary_checks, token_pos);
+  return new(I) CheckClassInstr(
+      new(I) Value(to_check), deopt_id, unary_checks, token_pos);
 }
 
 
@@ -1029,8 +1022,7 @@
 
 void FlowGraphOptimizer::AddReceiverCheck(InstanceCallInstr* call) {
   AddCheckClass(call->ArgumentAt(0),
-                ICData::ZoneHandle(isolate(),
-                                   call->ic_data()->AsUnaryClassChecks()),
+                ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecks()),
                 call->deopt_id(),
                 call->env(),
                 call);
@@ -1136,12 +1128,12 @@
 bool FlowGraphOptimizer::TryReplaceWithStoreIndexed(InstanceCallInstr* call) {
   // Check for monomorphic IC data.
   if (!call->HasICData()) return false;
-  const ICData& ic_data = ICData::Handle(isolate(),
-                                         call->ic_data()->AsUnaryClassChecks());
+  const ICData& ic_data =
+      ICData::Handle(I, call->ic_data()->AsUnaryClassChecks());
   if (ic_data.NumberOfChecks() != 1) return false;
   ASSERT(ic_data.HasOneTarget());
 
-  const Function& target = Function::Handle(isolate(), ic_data.GetTargetAt(0));
+  const Function& target = Function::Handle(I, ic_data.GetTargetAt(0));
   TargetEntryInstr* entry;
   Definition* last;
   if (!TryInlineRecognizedMethod(ic_data.GetReceiverClassIdAt(0),
@@ -1194,31 +1186,29 @@
   Definition* index = call->ArgumentAt(1);
   Definition* stored_value = call->ArgumentAt(2);
 
-  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(isolate(), call);
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
   Instruction* cursor = *entry;
   if (FLAG_enable_type_checks) {
     // Only type check for the value. A type check for the index is not
     // needed here because we insert a deoptimizing smi-check for the case
     // the index is not a smi.
     const AbstractType& value_type =
-        AbstractType::ZoneHandle(isolate(), target.ParameterTypeAt(2));
+        AbstractType::ZoneHandle(I, target.ParameterTypeAt(2));
     Definition* instantiator = NULL;
     Definition* type_args = NULL;
     switch (array_cid) {
       case kArrayCid:
       case kGrowableObjectArrayCid: {
-        const Class& instantiator_class =
-            Class::Handle(isolate(), target.Owner());
+        const Class& instantiator_class =  Class::Handle(I, target.Owner());
         intptr_t type_arguments_field_offset =
             instantiator_class.type_arguments_field_offset();
         LoadFieldInstr* load_type_args =
-            new(isolate()) LoadFieldInstr(
-                new(isolate()) Value(array),
-                type_arguments_field_offset,
-                Type::ZoneHandle(isolate(), Type::null()),  // No type.
-                call->token_pos());
+            new(I) LoadFieldInstr(new(I) Value(array),
+                                  type_arguments_field_offset,
+                                  Type::ZoneHandle(I),  // No type.
+                                  call->token_pos());
         cursor = flow_graph()->AppendTo(cursor,
                                         load_type_args,
                                         NULL,
@@ -1267,12 +1257,12 @@
         UNREACHABLE();
     }
     AssertAssignableInstr* assert_value =
-        new(isolate()) AssertAssignableInstr(token_pos,
-                                             new(isolate()) Value(stored_value),
-                                             new(isolate()) Value(instantiator),
-                                             new(isolate()) Value(type_args),
-                                             value_type,
-                                             Symbols::Value());
+        new(I) AssertAssignableInstr(token_pos,
+                                     new(I) Value(stored_value),
+                                     new(I) Value(instantiator),
+                                     new(I) Value(type_args),
+                                     value_type,
+                                     Symbols::Value());
     // Newly inserted instructions that can deoptimize or throw an exception
     // must have a deoptimization id that is valid for lookup in the unoptimized
     // code.
@@ -1309,8 +1299,8 @@
 
   if (array_cid == kTypedDataFloat32ArrayCid) {
     stored_value =
-        new(isolate()) DoubleToFloatInstr(
-            new(isolate()) Value(stored_value), call->deopt_id());
+        new(I) DoubleToFloatInstr(
+            new(I) Value(stored_value), call->deopt_id());
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     NULL,
@@ -1318,14 +1308,14 @@
   }
 
   const intptr_t index_scale = Instance::ElementSizeFor(array_cid);
-  *last = new(isolate()) StoreIndexedInstr(new(isolate()) Value(array),
-                                           new(isolate()) Value(index),
-                                           new(isolate()) Value(stored_value),
-                                           needs_store_barrier,
-                                           index_scale,
-                                           array_cid,
-                                           call->deopt_id(),
-                                           call->token_pos());
+  *last = new(I) StoreIndexedInstr(new(I) Value(array),
+                                   new(I) Value(index),
+                                   new(I) Value(stored_value),
+                                   needs_store_barrier,
+                                   index_scale,
+                                   array_cid,
+                                   call->deopt_id(),
+                                   call->token_pos());
   flow_graph()->AppendTo(cursor,
                          *last,
                          call->env(),
@@ -1342,7 +1332,7 @@
                                                    const ICData& ic_data,
                                                    TargetEntryInstr** entry,
                                                    Definition** last) {
-  ICData& value_check = ICData::ZoneHandle(isolate(), ICData::null());
+  ICData& value_check = ICData::ZoneHandle(I);
   MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(target);
   switch (kind) {
     // Recognized [] operators.
@@ -1580,18 +1570,18 @@
   // Insert index smi check.
   *cursor = flow_graph()->AppendTo(
       *cursor,
-      new(isolate()) CheckSmiInstr(new(isolate()) Value(index),
-                                   call->deopt_id(),
-                                   call->token_pos()),
+      new(I) CheckSmiInstr(new(I) Value(index),
+                           call->deopt_id(),
+                           call->token_pos()),
       call->env(),
       FlowGraph::kEffect);
 
   // Insert array length load and bounds check.
   LoadFieldInstr* length =
-      new(isolate()) LoadFieldInstr(
-          new(isolate()) Value(*array),
+      new(I) LoadFieldInstr(
+          new(I) Value(*array),
           CheckArrayBoundInstr::LengthOffsetFor(array_cid),
-          Type::ZoneHandle(isolate(), Type::SmiType()),
+          Type::ZoneHandle(I, Type::SmiType()),
           call->token_pos());
   length->set_is_immutable(
       CheckArrayBoundInstr::IsFixedLengthArrayType(array_cid));
@@ -1604,9 +1594,9 @@
                                    FlowGraph::kValue);
 
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new(isolate()) CheckArrayBoundInstr(
-                                       new(isolate()) Value(length),
-                                       new(isolate()) Value(index),
+                                   new(I) CheckArrayBoundInstr(
+                                       new(I) Value(length),
+                                       new(I) Value(index),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
@@ -1614,10 +1604,10 @@
   if (array_cid == kGrowableObjectArrayCid) {
     // Insert data elements load.
     LoadFieldInstr* elements =
-        new(isolate()) LoadFieldInstr(
-            new(isolate()) Value(*array),
+        new(I) LoadFieldInstr(
+            new(I) Value(*array),
             GrowableObjectArray::data_offset(),
-            Type::ZoneHandle(isolate(), Type::DynamicType()),
+            Type::ZoneHandle(I, Type::DynamicType()),
             call->token_pos());
     elements->set_result_cid(kArrayCid);
     *cursor = flow_graph()->AppendTo(*cursor,
@@ -1629,8 +1619,8 @@
     array_cid = kArrayCid;
   } else if (RawObject::IsExternalTypedDataClassId(array_cid)) {
     LoadUntaggedInstr* elements =
-        new(isolate()) LoadUntaggedInstr(new(isolate()) Value(*array),
-                                         ExternalTypedData::data_offset());
+        new(I) LoadUntaggedInstr(new(I) Value(*array),
+                                 ExternalTypedData::data_offset());
     *cursor = flow_graph()->AppendTo(*cursor,
                                      elements,
                                      NULL,
@@ -1651,9 +1641,9 @@
 
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(isolate(), call);
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
   Instruction* cursor = *entry;
 
   array_cid = PrepareInlineIndexedOp(call,
@@ -1673,12 +1663,12 @@
 
   // Array load and return.
   intptr_t index_scale = Instance::ElementSizeFor(array_cid);
-  *last = new(isolate()) LoadIndexedInstr(new(isolate()) Value(array),
-                                          new(isolate()) Value(index),
-                                          index_scale,
-                                          array_cid,
-                                          deopt_id,
-                                          call->token_pos());
+  *last = new(I) LoadIndexedInstr(new(I) Value(array),
+                                  new(I) Value(index),
+                                  index_scale,
+                                  array_cid,
+                                  deopt_id,
+                                  call->token_pos());
   cursor = flow_graph()->AppendTo(
       cursor,
       *last,
@@ -1686,8 +1676,7 @@
       FlowGraph::kValue);
 
   if (array_cid == kTypedDataFloat32ArrayCid) {
-    *last = new(isolate()) FloatToDoubleInstr(
-        new(isolate()) Value(*last), deopt_id);
+    *last = new(I) FloatToDoubleInstr(new(I) Value(*last), deopt_id);
     flow_graph()->AppendTo(cursor,
                            *last,
                            deopt_id != Isolate::kNoDeoptId ? call->env() : NULL,
@@ -1701,11 +1690,11 @@
   // Check for monomorphic IC data.
   if (!call->HasICData()) return false;
   const ICData& ic_data =
-      ICData::Handle(isolate(), call->ic_data()->AsUnaryClassChecks());
+      ICData::Handle(I, call->ic_data()->AsUnaryClassChecks());
   if (ic_data.NumberOfChecks() != 1) return false;
   ASSERT(ic_data.HasOneTarget());
 
-  const Function& target = Function::Handle(isolate(), ic_data.GetTargetAt(0));
+  const Function& target = Function::Handle(I, ic_data.GetTargetAt(0));
   TargetEntryInstr* entry;
   Definition* last;
   if (!TryInlineRecognizedMethod(ic_data.GetReceiverClassIdAt(0),
@@ -1785,12 +1774,12 @@
       const String& str = String::Cast(left_const->value());
       ASSERT(str.Length() == 1);
       ConstantInstr* char_code_left = flow_graph()->GetConstant(
-          Smi::ZoneHandle(isolate(), Smi::New(str.CharAt(0))));
-      left_val = new(isolate()) Value(char_code_left);
+          Smi::ZoneHandle(I, Smi::New(str.CharAt(0))));
+      left_val = new(I) Value(char_code_left);
     } else if (left->IsStringFromCharCode()) {
       // Use input of string-from-charcode as left value.
       StringFromCharCodeInstr* instr = left->AsStringFromCharCode();
-      left_val = new(isolate()) Value(instr->char_code()->definition());
+      left_val = new(I) Value(instr->char_code()->definition());
       to_remove_left = instr;
     } else {
       // IsLengthOneString(left) should have been false.
@@ -1802,12 +1791,11 @@
     if (right->IsStringFromCharCode()) {
       // Skip string-from-char-code, and use its input as right value.
       StringFromCharCodeInstr* right_instr = right->AsStringFromCharCode();
-      right_val = new(isolate()) Value(right_instr->char_code()->definition());
+      right_val = new(I) Value(right_instr->char_code()->definition());
       to_remove_right = right_instr;
     } else {
       const ICData& unary_checks_1 =
-          ICData::ZoneHandle(isolate(),
-                             call->ic_data()->AsUnaryClassChecksForArgNr(1));
+          ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecksForArgNr(1));
       AddCheckClass(right,
                     unary_checks_1,
                     call->deopt_id(),
@@ -1816,20 +1804,19 @@
       // String-to-char-code instructions returns -1 (illegal charcode) if
       // string is not of length one.
       StringToCharCodeInstr* char_code_right =
-          new(isolate()) StringToCharCodeInstr(
-              new(isolate()) Value(right), kOneByteStringCid);
+          new(I) StringToCharCodeInstr(new(I) Value(right), kOneByteStringCid);
       InsertBefore(call, char_code_right, call->env(), FlowGraph::kValue);
-      right_val = new(isolate()) Value(char_code_right);
+      right_val = new(I) Value(char_code_right);
     }
 
     // Comparing char-codes instead of strings.
     EqualityCompareInstr* comp =
-        new(isolate()) EqualityCompareInstr(call->token_pos(),
-                                            op_kind,
-                                            left_val,
-                                            right_val,
-                                            kSmiCid,
-                                            call->deopt_id());
+        new(I) EqualityCompareInstr(call->token_pos(),
+                                    op_kind,
+                                    left_val,
+                                    right_val,
+                                    kSmiCid,
+                                    call->deopt_id());
     ReplaceCall(call, comp);
 
     // Remove dead instructions.
@@ -1869,15 +1856,15 @@
     }
   } else if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new(isolate()) CheckSmiInstr(new(isolate()) Value(left),
-                                              call->deopt_id(),
-                                              call->token_pos()),
+                 new(I) CheckSmiInstr(new(I) Value(left),
+                                      call->deopt_id(),
+                                      call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     InsertBefore(call,
-                 new(isolate()) CheckSmiInstr(new(isolate()) Value(right),
-                                              call->deopt_id(),
-                                              call->token_pos()),
+                 new(I) CheckSmiInstr(new(I) Value(right),
+                                      call->deopt_id(),
+                                      call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     cid = kSmiCid;
@@ -1895,9 +1882,9 @@
         return false;
       } else {
         InsertBefore(call,
-                     new(isolate()) CheckEitherNonSmiInstr(
-                         new(isolate()) Value(left),
-                         new(isolate()) Value(right),
+                     new(I) CheckEitherNonSmiInstr(
+                         new(I) Value(left),
+                         new(I) Value(right),
                          call->deopt_id()),
                      call->env(),
                      FlowGraph::kEffect);
@@ -1915,8 +1902,7 @@
                                               smi_or_null,
                                               smi_or_null)) {
       const ICData& unary_checks_0 =
-          ICData::ZoneHandle(isolate(),
-                             call->ic_data()->AsUnaryClassChecks());
+          ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecks());
       AddCheckClass(left,
                     unary_checks_0,
                     call->deopt_id(),
@@ -1924,8 +1910,7 @@
                     call);
 
       const ICData& unary_checks_1 =
-          ICData::ZoneHandle(isolate(),
-                             call->ic_data()->AsUnaryClassChecksForArgNr(1));
+          ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecksForArgNr(1));
       AddCheckClass(right,
                     unary_checks_1,
                     call->deopt_id(),
@@ -1939,11 +1924,11 @@
       if ((right_const != NULL && right_const->value().IsNull()) ||
           (left_const != NULL && left_const->value().IsNull())) {
         StrictCompareInstr* comp =
-            new(isolate()) StrictCompareInstr(call->token_pos(),
-                                              Token::kEQ_STRICT,
-                                              new(isolate()) Value(left),
-                                              new(isolate()) Value(right),
-                                              false);  // No number check.
+            new(I) StrictCompareInstr(call->token_pos(),
+                                      Token::kEQ_STRICT,
+                                      new(I) Value(left),
+                                      new(I) Value(right),
+                                      false);  // No number check.
         ReplaceCall(call, comp);
         return true;
       }
@@ -1951,13 +1936,12 @@
     }
   }
   ASSERT(cid != kIllegalCid);
-  EqualityCompareInstr* comp = new(isolate()) EqualityCompareInstr(
-      call->token_pos(),
-      op_kind,
-      new(isolate()) Value(left),
-      new(isolate()) Value(right),
-      cid,
-      call->deopt_id());
+  EqualityCompareInstr* comp = new(I) EqualityCompareInstr(call->token_pos(),
+                                                           op_kind,
+                                                           new(I) Value(left),
+                                                           new(I) Value(right),
+                                                           cid,
+                                                           call->deopt_id());
   ReplaceCall(call, comp);
   return true;
 }
@@ -1975,15 +1959,15 @@
   intptr_t cid = kIllegalCid;
   if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new(isolate()) CheckSmiInstr(new(isolate()) Value(left),
-                                              call->deopt_id(),
-                                              call->token_pos()),
+                 new(I) CheckSmiInstr(new(I) Value(left),
+                                      call->deopt_id(),
+                                      call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     InsertBefore(call,
-                 new(isolate()) CheckSmiInstr(new(isolate()) Value(right),
-                                              call->deopt_id(),
-                                              call->token_pos()),
+                 new(I) CheckSmiInstr(new(I) Value(right),
+                                      call->deopt_id(),
+                                      call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     cid = kSmiCid;
@@ -2001,9 +1985,9 @@
         return false;
       } else {
         InsertBefore(call,
-                     new(isolate()) CheckEitherNonSmiInstr(
-                         new(isolate()) Value(left),
-                         new(isolate()) Value(right),
+                     new(I) CheckEitherNonSmiInstr(
+                         new(I) Value(left),
+                         new(I) Value(right),
                          call->deopt_id()),
                      call->env(),
                      FlowGraph::kEffect);
@@ -2014,13 +1998,12 @@
     return false;
   }
   ASSERT(cid != kIllegalCid);
-  RelationalOpInstr* comp = new(isolate()) RelationalOpInstr(
-      call->token_pos(),
-      op_kind,
-      new(isolate()) Value(left),
-      new(isolate()) Value(right),
-      cid,
-      call->deopt_id());
+  RelationalOpInstr* comp = new(I) RelationalOpInstr(call->token_pos(),
+                                                     op_kind,
+                                                     new(I) Value(left),
+                                                     new(I) Value(right),
+                                                     cid,
+                                                     call->deopt_id());
   ReplaceCall(call, comp);
   return true;
 }
@@ -2113,7 +2096,7 @@
             ? kMintCid
             : kSmiCid;
       } else if (HasTwoMintOrSmi(ic_data) &&
-                 HasOnlyOneSmi(ICData::Handle(isolate(),
+                 HasOnlyOneSmi(ICData::Handle(I,
                      ic_data.AsUnaryClassChecksForArgNr(1)))) {
         // Don't generate mint code if the IC data is marked because of an
         // overflow.
@@ -2153,32 +2136,32 @@
     // returns a double for two smis.
     if (op_kind != Token::kDIV) {
       InsertBefore(call,
-                   new(isolate()) CheckEitherNonSmiInstr(
-                       new(isolate()) Value(left),
-                       new(isolate()) Value(right),
+                   new(I) CheckEitherNonSmiInstr(
+                       new(I) Value(left),
+                       new(I) Value(right),
                        call->deopt_id()),
                    call->env(),
                    FlowGraph::kEffect);
     }
 
     BinaryDoubleOpInstr* double_bin_op =
-        new(isolate()) BinaryDoubleOpInstr(op_kind,
-                                           new(isolate()) Value(left),
-                                           new(isolate()) Value(right),
-                                           call->deopt_id(), call->token_pos());
+        new(I) BinaryDoubleOpInstr(op_kind,
+                                   new(I) Value(left),
+                                   new(I) Value(right),
+                                   call->deopt_id(), call->token_pos());
     ReplaceCall(call, double_bin_op);
   } else if (operands_type == kMintCid) {
     if (!FlowGraphCompiler::SupportsUnboxedMints()) return false;
     if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
       ShiftMintOpInstr* shift_op =
-          new(isolate()) ShiftMintOpInstr(
-              op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+          new(I) ShiftMintOpInstr(
+              op_kind, new(I) Value(left), new(I) Value(right),
               call->deopt_id());
       ReplaceCall(call, shift_op);
     } else {
       BinaryMintOpInstr* bin_op =
-          new(isolate()) BinaryMintOpInstr(
-              op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+          new(I) BinaryMintOpInstr(
+              op_kind, new(I) Value(left), new(I) Value(right),
               call->deopt_id());
       ReplaceCall(call, bin_op);
     }
@@ -2196,20 +2179,20 @@
         // Insert smi check and attach a copy of the original environment
         // because the smi operation can still deoptimize.
         InsertBefore(call,
-                     new(isolate()) CheckSmiInstr(new(isolate()) Value(left),
-                                                  call->deopt_id(),
-                                                  call->token_pos()),
+                     new(I) CheckSmiInstr(new(I) Value(left),
+                                          call->deopt_id(),
+                                          call->token_pos()),
                      call->env(),
                      FlowGraph::kEffect);
         ConstantInstr* constant =
-            flow_graph()->GetConstant(Smi::Handle(isolate(),
+            flow_graph()->GetConstant(Smi::Handle(I,
                 Smi::New(Smi::Cast(obj).Value() - 1)));
         BinarySmiOpInstr* bin_op =
-            new(isolate()) BinarySmiOpInstr(Token::kBIT_AND,
-                                 new(isolate()) Value(left),
-                                 new(isolate()) Value(constant),
-                                 call->deopt_id(),
-                                 call->token_pos());
+            new(I) BinarySmiOpInstr(Token::kBIT_AND,
+                                    new(I) Value(left),
+                                    new(I) Value(constant),
+                                    call->deopt_id(),
+                                    call->token_pos());
         ReplaceCall(call, bin_op);
         return true;
       }
@@ -2219,9 +2202,9 @@
     AddCheckSmi(left, call->deopt_id(), call->env(), call);
     AddCheckSmi(right, call->deopt_id(), call->env(), call);
     BinarySmiOpInstr* bin_op =
-        new(isolate()) BinarySmiOpInstr(op_kind,
-                                        new(isolate()) Value(left),
-                                        new(isolate()) Value(right),
+        new(I) BinarySmiOpInstr(op_kind,
+                                        new(I) Value(left),
+                                        new(I) Value(right),
                                         call->deopt_id(), call->token_pos());
     ReplaceCall(call, bin_op);
   } else {
@@ -2238,8 +2221,8 @@
       right = temp;
     }
     BinarySmiOpInstr* bin_op =
-        new(isolate()) BinarySmiOpInstr(
-            op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+        new(I) BinarySmiOpInstr(
+            op_kind, new(I) Value(left), new(I) Value(right),
             call->deopt_id(), call->token_pos());
     ReplaceCall(call, bin_op);
   }
@@ -2254,24 +2237,24 @@
   Definition* unary_op = NULL;
   if (HasOnlyOneSmi(*call->ic_data())) {
     InsertBefore(call,
-                 new(isolate()) CheckSmiInstr(new(isolate()) Value(input),
-                                              call->deopt_id(),
-                                              call->token_pos()),
+                 new(I) CheckSmiInstr(new(I) Value(input),
+                                      call->deopt_id(),
+                                      call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
-    unary_op = new(isolate()) UnarySmiOpInstr(
-        op_kind, new(isolate()) Value(input), call->deopt_id());
+    unary_op = new(I) UnarySmiOpInstr(
+        op_kind, new(I) Value(input), call->deopt_id());
   } else if ((op_kind == Token::kBIT_NOT) &&
              HasOnlySmiOrMint(*call->ic_data()) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
-    unary_op = new(isolate()) UnaryMintOpInstr(
-        op_kind, new(isolate()) Value(input), call->deopt_id());
+    unary_op = new(I) UnaryMintOpInstr(
+        op_kind, new(I) Value(input), call->deopt_id());
   } else if (HasOnlyOneDouble(*call->ic_data()) &&
              (op_kind == Token::kNEGATE) &&
              CanUnboxDouble()) {
     AddReceiverCheck(call);
-    unary_op = new(isolate()) UnaryDoubleOpInstr(
-        Token::kNEGATE, new(isolate()) Value(input), call->deopt_id());
+    unary_op = new(I) UnaryDoubleOpInstr(
+        Token::kNEGATE, new(I) Value(input), call->deopt_id());
   } else {
     return false;
   }
@@ -2283,8 +2266,9 @@
 
 // Using field class
 static RawField* GetField(intptr_t class_id, const String& field_name) {
-  Class& cls = Class::Handle(Isolate::Current()->class_table()->At(class_id));
-  Field& field = Field::Handle();
+  Isolate* isolate = Isolate::Current();
+  Class& cls = Class::Handle(isolate, isolate->class_table()->At(class_id));
+  Field& field = Field::Handle(isolate);
   while (!cls.IsNull()) {
     field = cls.LookupInstanceField(field_name);
     if (!field.IsNull()) {
@@ -2308,7 +2292,7 @@
   if (function.IsDynamicFunction() &&
       callee_receiver->IsParameter() &&
       (callee_receiver->AsParameter()->index() == 0)) {
-    return CHA::HasOverride(Class::Handle(isolate(), function.Owner()),
+    return CHA::HasOverride(Class::Handle(I, function.Owner()),
                             call->function_name());
   }
   return true;
@@ -2325,9 +2309,8 @@
       callee_receiver->IsParameter() &&
       (callee_receiver->AsParameter()->index() == 0)) {
     const String& field_name =
-      String::Handle(isolate(), Field::NameFromGetter(call->function_name()));
-    return CHA::HasOverride(Class::Handle(isolate(), function.Owner()),
-                            field_name);
+      String::Handle(I, Field::NameFromGetter(call->function_name()));
+    return CHA::HasOverride(Class::Handle(I, function.Owner()), field_name);
   }
   return true;
 }
@@ -2337,24 +2320,24 @@
   ASSERT(call->HasICData());
   const ICData& ic_data = *call->ic_data();
   ASSERT(ic_data.HasOneTarget());
-  Function& target = Function::Handle(isolate(), Function::null());
+  Function& target = Function::Handle(I);
   GrowableArray<intptr_t> class_ids;
   ic_data.GetCheckAt(0, &class_ids, &target);
   ASSERT(class_ids.length() == 1);
   // Inline implicit instance getter.
   const String& field_name =
-      String::Handle(isolate(), Field::NameFromGetter(call->function_name()));
+      String::Handle(I, Field::NameFromGetter(call->function_name()));
   const Field& field =
-      Field::ZoneHandle(isolate(), GetField(class_ids[0], field_name));
+      Field::ZoneHandle(I, GetField(class_ids[0], field_name));
   ASSERT(!field.IsNull());
 
   if (InstanceCallNeedsClassCheck(call)) {
     AddReceiverCheck(call);
   }
-  LoadFieldInstr* load = new(isolate()) LoadFieldInstr(
-      new(isolate()) Value(call->ArgumentAt(0)),
+  LoadFieldInstr* load = new(I) LoadFieldInstr(
+      new(I) Value(call->ArgumentAt(0)),
       &field,
-      AbstractType::ZoneHandle(isolate(), field.type()),
+      AbstractType::ZoneHandle(I, field.type()),
       call->token_pos());
   load->set_is_immutable(field.is_final());
   if (field.guarded_cid() != kIllegalCid) {
@@ -2384,10 +2367,10 @@
   // Treat length loads as mutable (i.e. affected by side effects) to avoid
   // hoisting them since we can't hoist the preceding class-check. This
   // is because of externalization of strings that affects their class-id.
-  LoadFieldInstr* load = new(isolate()) LoadFieldInstr(
-      new(isolate()) Value(str),
+  LoadFieldInstr* load = new(I) LoadFieldInstr(
+      new(I) Value(str),
       String::length_offset(),
-      Type::ZoneHandle(isolate(), Type::SmiType()),
+      Type::ZoneHandle(I, Type::SmiType()),
       str->token_pos());
   load->set_result_cid(kSmiCid);
   load->set_recognized_kind(MethodRecognizer::kStringBaseLength);
@@ -2402,7 +2385,7 @@
   }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
-                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
@@ -2436,17 +2419,17 @@
     }
   }
   if (getter == MethodRecognizer::kFloat32x4GetSignMask) {
-    Simd32x4GetSignMaskInstr* instr = new(isolate()) Simd32x4GetSignMaskInstr(
+    Simd32x4GetSignMaskInstr* instr = new(I) Simd32x4GetSignMaskInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(0)),
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else if (getter == MethodRecognizer::kFloat32x4ShuffleMix) {
-    Simd32x4ShuffleMixInstr* instr = new(isolate()) Simd32x4ShuffleMixInstr(
+    Simd32x4ShuffleMixInstr* instr = new(I) Simd32x4ShuffleMixInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
-        new(isolate()) Value(call->ArgumentAt(1)),
+        new(I) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(1)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
@@ -2457,9 +2440,9 @@
            (getter == MethodRecognizer::kFloat32x4ShuffleY) ||
            (getter == MethodRecognizer::kFloat32x4ShuffleZ) ||
            (getter == MethodRecognizer::kFloat32x4ShuffleW));
-    Simd32x4ShuffleInstr* instr = new(isolate()) Simd32x4ShuffleInstr(
+    Simd32x4ShuffleInstr* instr = new(I) Simd32x4ShuffleInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(0)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
@@ -2477,15 +2460,15 @@
   }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
-                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
   if ((getter == MethodRecognizer::kFloat64x2GetX) ||
       (getter == MethodRecognizer::kFloat64x2GetY)) {
-    Simd64x2ShuffleInstr* instr = new(isolate()) Simd64x2ShuffleInstr(
+    Simd64x2ShuffleInstr* instr = new(I) Simd64x2ShuffleInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(0)),
         0,
         call->deopt_id());
     ReplaceCall(call, instr);
@@ -2503,7 +2486,7 @@
   }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
-                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
@@ -2537,33 +2520,33 @@
     }
   }
   if (getter == MethodRecognizer::kInt32x4GetSignMask) {
-    Simd32x4GetSignMaskInstr* instr = new(isolate()) Simd32x4GetSignMaskInstr(
+    Simd32x4GetSignMaskInstr* instr = new(I) Simd32x4GetSignMaskInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(0)),
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else if (getter == MethodRecognizer::kInt32x4ShuffleMix) {
-    Simd32x4ShuffleMixInstr* instr = new(isolate()) Simd32x4ShuffleMixInstr(
+    Simd32x4ShuffleMixInstr* instr = new(I) Simd32x4ShuffleMixInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
-        new(isolate()) Value(call->ArgumentAt(1)),
+        new(I) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(1)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else if (getter == MethodRecognizer::kInt32x4Shuffle) {
-    Simd32x4ShuffleInstr* instr = new(isolate()) Simd32x4ShuffleInstr(
+    Simd32x4ShuffleInstr* instr = new(I) Simd32x4ShuffleInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(0)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else {
-    Int32x4GetFlagInstr* instr = new(isolate()) Int32x4GetFlagInstr(
+    Int32x4GetFlagInstr* instr = new(I) Int32x4GetFlagInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(0)),
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
@@ -2582,21 +2565,21 @@
   // Type check left.
   AddCheckClass(left,
                 ICData::ZoneHandle(
-                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Type check right.
   AddCheckClass(right,
                 ICData::ZoneHandle(
-                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(1)),
+                    I, call->ic_data()->AsUnaryClassChecksForArgNr(1)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Replace call.
   BinaryFloat32x4OpInstr* float32x4_bin_op =
-      new(isolate()) BinaryFloat32x4OpInstr(
-          op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+      new(I) BinaryFloat32x4OpInstr(
+          op_kind, new(I) Value(left), new(I) Value(right),
           call->deopt_id());
   ReplaceCall(call, float32x4_bin_op);
 
@@ -2615,21 +2598,21 @@
   // Type check left.
   AddCheckClass(left,
                 ICData::ZoneHandle(
-                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Type check right.
   AddCheckClass(right,
-                ICData::ZoneHandle(isolate(),
+                ICData::ZoneHandle(I,
                     call->ic_data()->AsUnaryClassChecksForArgNr(1)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Replace call.
   BinaryInt32x4OpInstr* int32x4_bin_op =
-      new(isolate()) BinaryInt32x4OpInstr(
-          op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+      new(I) BinaryInt32x4OpInstr(
+          op_kind, new(I) Value(left), new(I) Value(right),
           call->deopt_id());
   ReplaceCall(call, int32x4_bin_op);
   return true;
@@ -2660,8 +2643,8 @@
                 call);
   // Replace call.
   BinaryFloat64x2OpInstr* float64x2_bin_op =
-      new(isolate()) BinaryFloat64x2OpInstr(
-          op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+      new(I) BinaryFloat64x2OpInstr(
+          op_kind, new(I) Value(left), new(I) Value(right),
           call->deopt_id());
   ReplaceCall(call, float64x2_bin_op);
   return true;
@@ -2683,7 +2666,7 @@
     return false;
   }
 
-  const Function& target = Function::Handle(isolate(), ic_data.GetTargetAt(0));
+  const Function& target = Function::Handle(I, ic_data.GetTargetAt(0));
   if (target.kind() != RawFunction::kImplicitGetter) {
     // Non-implicit getters are inlined like normal methods by conventional
     // inlining in FlowGraphInliner.
@@ -2697,7 +2680,7 @@
 bool FlowGraphOptimizer::TryReplaceInstanceCallWithInline(
     InstanceCallInstr* call) {
   ASSERT(call->HasICData());
-  Function& target = Function::Handle(isolate(), Function::null());
+  Function& target = Function::Handle(I);
   GrowableArray<intptr_t> class_ids;
   call->ic_data()->GetCheckAt(0, &class_ids, &target);
   const intptr_t receiver_cid = class_ids[0];
@@ -2747,8 +2730,8 @@
     Instruction* cursor) {
 
   cursor = flow_graph()->AppendTo(cursor,
-                                  new(isolate()) CheckSmiInstr(
-                                      new(isolate()) Value(index),
+                                  new(I) CheckSmiInstr(
+                                      new(I) Value(index),
                                       call->deopt_id(),
                                       call->token_pos()),
                                   call->env(),
@@ -2759,16 +2742,16 @@
   cursor = flow_graph()->AppendTo(cursor, length, NULL, FlowGraph::kValue);
   // Bounds check.
   cursor = flow_graph()->AppendTo(cursor,
-                                   new(isolate()) CheckArrayBoundInstr(
-                                       new(isolate()) Value(length),
-                                       new(isolate()) Value(index),
+                                   new(I) CheckArrayBoundInstr(
+                                       new(I) Value(length),
+                                       new(I) Value(index),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
 
-  LoadIndexedInstr* load_indexed = new(isolate()) LoadIndexedInstr(
-      new(isolate()) Value(str),
-      new(isolate()) Value(index),
+  LoadIndexedInstr* load_indexed = new(I) LoadIndexedInstr(
+      new(I) Value(str),
+      new(I) Value(index),
       Instance::ElementSizeFor(cid),
       cid,
       Isolate::kNoDeoptId,
@@ -2796,9 +2779,9 @@
   Definition* str = call->ArgumentAt(0);
   Definition* index = call->ArgumentAt(1);
 
-  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(isolate(), call);
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
 
   *last = PrepareInlineStringIndexOp(call, cid, str, index, *entry);
 
@@ -2818,14 +2801,14 @@
   Definition* str = call->ArgumentAt(0);
   Definition* index = call->ArgumentAt(1);
 
-  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(isolate(), call);
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
 
   *last = PrepareInlineStringIndexOp(call, cid, str, index, *entry);
 
-  StringFromCharCodeInstr* char_at = new(isolate()) StringFromCharCodeInstr(
-      new(isolate()) Value(*last), cid);
+  StringFromCharCodeInstr* char_at = new(I) StringFromCharCodeInstr(
+      new(I) Value(*last), cid);
 
   flow_graph()->AppendTo(*last, char_at, NULL, FlowGraph::kValue);
   *last = char_at;
@@ -2839,15 +2822,15 @@
     MethodRecognizer::Kind recognized_kind) {
   AddReceiverCheck(call);
   ZoneGrowableArray<Value*>* args =
-      new(isolate()) ZoneGrowableArray<Value*>(call->ArgumentCount());
+      new(I) ZoneGrowableArray<Value*>(call->ArgumentCount());
   for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-    args->Add(new(isolate()) Value(call->ArgumentAt(i)));
+    args->Add(new(I) Value(call->ArgumentAt(i)));
   }
   InvokeMathCFunctionInstr* invoke =
-      new(isolate()) InvokeMathCFunctionInstr(args,
-                                              call->deopt_id(),
-                                              recognized_kind,
-                                              call->token_pos());
+      new(I) InvokeMathCFunctionInstr(args,
+                                      call->deopt_id(),
+                                      recognized_kind,
+                                      call->token_pos());
   ReplaceCall(call, invoke);
 }
 
@@ -2883,7 +2866,7 @@
     return false;
   }
 
-  Function& target = Function::Handle(isolate(), Function::null());
+  Function& target = Function::Handle(I);
   GrowableArray<intptr_t> class_ids;
   ic_data.GetCheckAt(0, &class_ids, &target);
   MethodRecognizer::Kind recognized_kind =
@@ -2895,10 +2878,10 @@
     // This is an internal method, no need to check argument types.
     Definition* array = call->ArgumentAt(0);
     Definition* value = call->ArgumentAt(1);
-    StoreInstanceFieldInstr* store = new(isolate()) StoreInstanceFieldInstr(
+    StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
         GrowableObjectArray::data_offset(),
-        new(isolate()) Value(array),
-        new(isolate()) Value(value),
+        new(I) Value(array),
+        new(I) Value(value),
         kEmitStoreBarrier,
         call->token_pos());
     ReplaceCall(call, store);
@@ -2912,10 +2895,10 @@
     // range.
     Definition* array = call->ArgumentAt(0);
     Definition* value = call->ArgumentAt(1);
-    StoreInstanceFieldInstr* store = new(isolate()) StoreInstanceFieldInstr(
+    StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
         GrowableObjectArray::length_offset(),
-        new(isolate()) Value(array),
-        new(isolate()) Value(value),
+        new(I) Value(array),
+        new(I) Value(value),
         kEmitStoreBarrier,
         call->token_pos());
     ReplaceCall(call, store);
@@ -2937,10 +2920,10 @@
       Definition* str = call->ArgumentAt(0);
       Definition* index = call->ArgumentAt(1);
       Definition* value = call->ArgumentAt(2);
-      StoreIndexedInstr* store_op = new(isolate()) StoreIndexedInstr(
-          new(isolate()) Value(str),
-          new(isolate()) Value(index),
-          new(isolate()) Value(value),
+      StoreIndexedInstr* store_op = new(I) StoreIndexedInstr(
+          new(I) Value(str),
+          new(I) Value(index),
+          new(I) Value(value),
           kNoStoreBarrier,
           1,  // Index scale
           kOneByteStringCid,
@@ -2958,8 +2941,8 @@
       (class_ids[0] == kSmiCid)) {
     AddReceiverCheck(call);
     ReplaceCall(call,
-                new(isolate()) SmiToDoubleInstr(
-                    new(isolate()) Value(call->ArgumentAt(0)),
+                new(I) SmiToDoubleInstr(
+                    new(I) Value(call->ArgumentAt(0)),
                     call->token_pos()));
     return true;
   }
@@ -2977,12 +2960,12 @@
         Definition* d2i_instr = NULL;
         if (ic_data.HasDeoptReason(ICData::kDeoptDoubleToSmi)) {
           // Do not repeatedly deoptimize because result didn't fit into Smi.
-          d2i_instr =  new(isolate()) DoubleToIntegerInstr(
-              new(isolate()) Value(input), call);
+          d2i_instr =  new(I) DoubleToIntegerInstr(
+              new(I) Value(input), call);
         } else {
           // Optimistically assume result fits into Smi.
-          d2i_instr = new(isolate()) DoubleToSmiInstr(
-              new(isolate()) Value(input), call->deopt_id());
+          d2i_instr = new(I) DoubleToSmiInstr(
+              new(I) Value(input), call->deopt_id());
         }
         ReplaceCall(call, d2i_instr);
         return true;
@@ -2999,9 +2982,8 @@
         } else {
           AddReceiverCheck(call);
           DoubleToDoubleInstr* d2d_instr =
-              new(isolate()) DoubleToDoubleInstr(
-                  new(isolate()) Value(call->ArgumentAt(0)),
-                  recognized_kind, call->deopt_id());
+              new(I) DoubleToDoubleInstr(new(I) Value(call->ArgumentAt(0)),
+                                         recognized_kind, call->deopt_id());
           ReplaceCall(call, d2d_instr);
         }
         return true;
@@ -3118,10 +3100,10 @@
         return false;
       }
       BinarySmiOpInstr* left_shift =
-          new(isolate()) BinarySmiOpInstr(Token::kSHL,
-                                          new(isolate()) Value(value),
-                                          new(isolate()) Value(count),
-                                          call->deopt_id(), call->token_pos());
+          new(I) BinarySmiOpInstr(Token::kSHL,
+                                  new(I) Value(value),
+                                  new(I) Value(count),
+                                  call->deopt_id(), call->token_pos());
       left_shift->set_is_truncating(true);
       if ((kBitsPerWord == 32) && (mask_value == 0xffffffffLL)) {
         // No BIT_AND operation needed.
@@ -3129,34 +3111,34 @@
       } else {
         InsertBefore(call, left_shift, call->env(), FlowGraph::kValue);
         BinarySmiOpInstr* bit_and =
-            new(isolate()) BinarySmiOpInstr(Token::kBIT_AND,
-                                            new(isolate()) Value(left_shift),
-                                            new(isolate()) Value(int32_mask),
-                                            call->deopt_id(),
-                                            call->token_pos());
+            new(I) BinarySmiOpInstr(Token::kBIT_AND,
+                                    new(I) Value(left_shift),
+                                    new(I) Value(int32_mask),
+                                    call->deopt_id(),
+                                    call->token_pos());
         ReplaceCall(call, bit_and);
       }
       return true;
     }
 
     if (HasTwoMintOrSmi(ic_data) &&
-        HasOnlyOneSmi(ICData::Handle(isolate(),
+        HasOnlyOneSmi(ICData::Handle(I,
                                      ic_data.AsUnaryClassChecksForArgNr(1)))) {
       if (!FlowGraphCompiler::SupportsUnboxedMints() ||
           ic_data.HasDeoptReason(ICData::kDeoptShiftMintOp)) {
         return false;
       }
       ShiftMintOpInstr* left_shift =
-          new(isolate()) ShiftMintOpInstr(Token::kSHL,
-                                          new(isolate()) Value(value),
-                                          new(isolate()) Value(count),
-                                          call->deopt_id());
+          new(I) ShiftMintOpInstr(Token::kSHL,
+                                  new(I) Value(value),
+                                  new(I) Value(count),
+                                  call->deopt_id());
       InsertBefore(call, left_shift, call->env(), FlowGraph::kValue);
       BinaryMintOpInstr* bit_and =
-          new(isolate()) BinaryMintOpInstr(Token::kBIT_AND,
-                                           new(isolate()) Value(left_shift),
-                                           new(isolate()) Value(int32_mask),
-                                           call->deopt_id());
+          new(I) BinaryMintOpInstr(Token::kBIT_AND,
+                                   new(I) Value(left_shift),
+                                   new(I) Value(int32_mask),
+                                   call->deopt_id());
       ReplaceCall(call, bit_and);
       return true;
     }
@@ -3173,35 +3155,35 @@
   }
   if (recognized_kind == MethodRecognizer::kFloat32x4Zero) {
     Float32x4ZeroInstr* zero =
-        new(isolate()) Float32x4ZeroInstr(call->deopt_id());
+        new(I) Float32x4ZeroInstr(call->deopt_id());
     ReplaceCall(call, zero);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4Splat) {
     Float32x4SplatInstr* splat =
-        new(isolate()) Float32x4SplatInstr(
-            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(I) Float32x4SplatInstr(
+            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, splat);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4Constructor) {
     Float32x4ConstructorInstr* con =
-        new(isolate()) Float32x4ConstructorInstr(
-            new(isolate()) Value(call->ArgumentAt(1)),
-            new(isolate()) Value(call->ArgumentAt(2)),
-            new(isolate()) Value(call->ArgumentAt(3)),
-            new(isolate()) Value(call->ArgumentAt(4)),
+        new(I) Float32x4ConstructorInstr(
+            new(I) Value(call->ArgumentAt(1)),
+            new(I) Value(call->ArgumentAt(2)),
+            new(I) Value(call->ArgumentAt(3)),
+            new(I) Value(call->ArgumentAt(4)),
             call->deopt_id());
     ReplaceCall(call, con);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4FromInt32x4Bits) {
     Int32x4ToFloat32x4Instr* cast =
-        new(isolate()) Int32x4ToFloat32x4Instr(
-            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(I) Int32x4ToFloat32x4Instr(
+            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4FromFloat64x2) {
     Float64x2ToFloat32x4Instr* cast =
-        new(isolate()) Float64x2ToFloat32x4Instr(
-            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(I) Float64x2ToFloat32x4Instr(
+            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   }
@@ -3217,27 +3199,27 @@
   }
   if (recognized_kind == MethodRecognizer::kFloat64x2Zero) {
     Float64x2ZeroInstr* zero =
-        new(isolate()) Float64x2ZeroInstr(call->deopt_id());
+        new(I) Float64x2ZeroInstr(call->deopt_id());
     ReplaceCall(call, zero);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2Splat) {
     Float64x2SplatInstr* splat =
-        new(isolate()) Float64x2SplatInstr(
-            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(I) Float64x2SplatInstr(
+            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, splat);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2Constructor) {
     Float64x2ConstructorInstr* con =
-        new(isolate()) Float64x2ConstructorInstr(
-            new(isolate()) Value(call->ArgumentAt(1)),
-            new(isolate()) Value(call->ArgumentAt(2)),
+        new(I) Float64x2ConstructorInstr(
+            new(I) Value(call->ArgumentAt(1)),
+            new(I) Value(call->ArgumentAt(2)),
             call->deopt_id());
     ReplaceCall(call, con);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2FromFloat32x4) {
     Float32x4ToFloat64x2Instr* cast =
-        new(isolate()) Float32x4ToFloat64x2Instr(
-            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(I) Float32x4ToFloat64x2Instr(
+            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   }
@@ -3253,18 +3235,18 @@
   }
   if (recognized_kind == MethodRecognizer::kInt32x4BoolConstructor) {
     Int32x4BoolConstructorInstr* con =
-        new(isolate()) Int32x4BoolConstructorInstr(
-            new(isolate()) Value(call->ArgumentAt(1)),
-            new(isolate()) Value(call->ArgumentAt(2)),
-            new(isolate()) Value(call->ArgumentAt(3)),
-            new(isolate()) Value(call->ArgumentAt(4)),
+        new(I) Int32x4BoolConstructorInstr(
+            new(I) Value(call->ArgumentAt(1)),
+            new(I) Value(call->ArgumentAt(2)),
+            new(I) Value(call->ArgumentAt(3)),
+            new(I) Value(call->ArgumentAt(4)),
             call->deopt_id());
     ReplaceCall(call, con);
     return true;
   } else if (recognized_kind == MethodRecognizer::kInt32x4FromFloat32x4Bits) {
     Float32x4ToInt32x4Instr* cast =
-        new(isolate()) Float32x4ToInt32x4Instr(
-            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(I) Float32x4ToInt32x4Instr(
+            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   }
@@ -3300,18 +3282,16 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       // Replace call.
       Float32x4ComparisonInstr* cmp =
-          new(isolate()) Float32x4ComparisonInstr(
-              recognized_kind,
-              new(isolate()) Value(left),
-              new(isolate()) Value(right),
-              call->deopt_id());
+          new(I) Float32x4ComparisonInstr(recognized_kind,
+                                          new(I) Value(left),
+                                          new(I) Value(right),
+                                          call->deopt_id());
       ReplaceCall(call, cmp);
       return true;
     }
@@ -3322,16 +3302,15 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float32x4MinMaxInstr* minmax =
-          new(isolate()) Float32x4MinMaxInstr(
+          new(I) Float32x4MinMaxInstr(
               recognized_kind,
-              new(isolate()) Value(left),
-              new(isolate()) Value(right),
+              new(I) Value(left),
+              new(I) Value(right),
               call->deopt_id());
       ReplaceCall(call, minmax);
       return true;
@@ -3342,8 +3321,7 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
@@ -3351,11 +3329,10 @@
       // this is done so that the double value is loaded into the output
       // register and can be destroyed.
       Float32x4ScaleInstr* scale =
-          new(isolate()) Float32x4ScaleInstr(
-              recognized_kind,
-              new(isolate()) Value(right),
-              new(isolate()) Value(left),
-              call->deopt_id());
+          new(I) Float32x4ScaleInstr(recognized_kind,
+                                     new(I) Value(right),
+                                     new(I) Value(left),
+                                     call->deopt_id());
       ReplaceCall(call, scale);
       return true;
     }
@@ -3365,16 +3342,14 @@
       Definition* left = call->ArgumentAt(0);
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float32x4SqrtInstr* sqrt =
-          new(isolate()) Float32x4SqrtInstr(
-              recognized_kind,
-              new(isolate()) Value(left),
-              call->deopt_id());
+          new(I) Float32x4SqrtInstr(recognized_kind,
+                                    new(I) Value(left),
+                                    call->deopt_id());
       ReplaceCall(call, sqrt);
       return true;
     }
@@ -3387,16 +3362,14 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Float32x4WithInstr* with = new(isolate()) Float32x4WithInstr(
-          recognized_kind,
-          new(isolate()) Value(left),
-          new(isolate()) Value(right),
-          call->deopt_id());
+      Float32x4WithInstr* with = new(I) Float32x4WithInstr(recognized_kind,
+                                                           new(I) Value(left),
+                                                           new(I) Value(right),
+                                                           call->deopt_id());
       ReplaceCall(call, with);
       return true;
     }
@@ -3406,14 +3379,13 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float32x4ZeroArgInstr* zeroArg =
-          new(isolate()) Float32x4ZeroArgInstr(
-              recognized_kind, new(isolate()) Value(left), call->deopt_id());
+          new(I) Float32x4ZeroArgInstr(
+              recognized_kind, new(I) Value(left), call->deopt_id());
       ReplaceCall(call, zeroArg);
       return true;
     }
@@ -3424,15 +3396,14 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Float32x4ClampInstr* clamp = new(isolate()) Float32x4ClampInstr(
-          new(isolate()) Value(left),
-          new(isolate()) Value(lower),
-          new(isolate()) Value(upper),
+      Float32x4ClampInstr* clamp = new(I) Float32x4ClampInstr(
+          new(I) Value(left),
+          new(I) Value(lower),
+          new(I) Value(upper),
           call->deopt_id());
       ReplaceCall(call, clamp);
       return true;
@@ -3468,14 +3439,13 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float64x2ZeroArgInstr* zeroArg =
-          new(isolate()) Float64x2ZeroArgInstr(
-              recognized_kind, new(isolate()) Value(left), call->deopt_id());
+          new(I) Float64x2ZeroArgInstr(
+              recognized_kind, new(I) Value(left), call->deopt_id());
       ReplaceCall(call, zeroArg);
       return true;
     }
@@ -3489,17 +3459,15 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float64x2OneArgInstr* zeroArg =
-          new(isolate()) Float64x2OneArgInstr(
-              recognized_kind,
-              new(isolate()) Value(left),
-              new(isolate()) Value(right),
-              call->deopt_id());
+          new(I) Float64x2OneArgInstr(recognized_kind,
+                                      new(I) Value(left),
+                                      new(I) Value(right),
+                                      call->deopt_id());
       ReplaceCall(call, zeroArg);
       return true;
     }
@@ -3535,15 +3503,14 @@
       // Type check left.
       AddCheckClass(mask,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Int32x4SelectInstr* select = new(isolate()) Int32x4SelectInstr(
-          new(isolate()) Value(mask),
-          new(isolate()) Value(trueValue),
-          new(isolate()) Value(falseValue),
+      Int32x4SelectInstr* select = new(I) Int32x4SelectInstr(
+          new(I) Value(mask),
+          new(I) Value(trueValue),
+          new(I) Value(falseValue),
           call->deopt_id());
       ReplaceCall(call, select);
       return true;
@@ -3557,15 +3524,14 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Int32x4SetFlagInstr* setFlag = new(isolate()) Int32x4SetFlagInstr(
+      Int32x4SetFlagInstr* setFlag = new(I) Int32x4SetFlagInstr(
           recognized_kind,
-          new(isolate()) Value(left),
-          new(isolate()) Value(flag),
+          new(I) Value(left),
+          new(I) Value(flag),
           call->deopt_id());
       ReplaceCall(call, setFlag);
       return true;
@@ -3586,9 +3552,9 @@
   ASSERT(array_cid != kIllegalCid);
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(isolate(), call);
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
   Instruction* cursor = *entry;
 
   array_cid = PrepareInlineByteArrayViewOp(call,
@@ -3607,12 +3573,12 @@
         Isolate::kNoDeoptId : call->deopt_id();
   }
 
-  *last = new(isolate()) LoadIndexedInstr(new(isolate()) Value(array),
-                                          new(isolate()) Value(index),
-                                          1,
-                                          view_cid,
-                                          deopt_id,
-                                          call->token_pos());
+  *last = new(I) LoadIndexedInstr(new(I) Value(array),
+                                  new(I) Value(index),
+                                  1,
+                                  view_cid,
+                                  deopt_id,
+                                  call->token_pos());
   cursor = flow_graph()->AppendTo(
       cursor,
       *last,
@@ -3620,8 +3586,7 @@
       FlowGraph::kValue);
 
   if (view_cid == kTypedDataFloat32ArrayCid) {
-    *last = new(isolate()) FloatToDoubleInstr(
-        new(isolate()) Value(*last), deopt_id);
+    *last = new(I) FloatToDoubleInstr(new(I) Value(*last), deopt_id);
     flow_graph()->AppendTo(cursor,
                            *last,
                            deopt_id != Isolate::kNoDeoptId ? call->env() : NULL,
@@ -3642,9 +3607,9 @@
   ASSERT(array_cid != kIllegalCid);
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(isolate(), call);
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
   Instruction* cursor = *entry;
 
   array_cid = PrepareInlineByteArrayViewOp(call,
@@ -3664,7 +3629,7 @@
     i_call = call->AsInstanceCall();
   }
   ASSERT(i_call != NULL);
-  ICData& value_check = ICData::ZoneHandle(isolate(), ICData::null());
+  ICData& value_check = ICData::ZoneHandle(I);
   switch (view_cid) {
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
@@ -3739,8 +3704,8 @@
   }
 
   if (view_cid == kTypedDataFloat32ArrayCid) {
-    stored_value = new(isolate()) DoubleToFloatInstr(
-        new(isolate()) Value(stored_value), call->deopt_id());
+    stored_value = new(I) DoubleToFloatInstr(
+        new(I) Value(stored_value), call->deopt_id());
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     NULL,
@@ -3748,14 +3713,14 @@
   }
 
   StoreBarrierType needs_store_barrier = kNoStoreBarrier;
-  *last = new(isolate()) StoreIndexedInstr(new(isolate()) Value(array),
-                                           new(isolate()) Value(index),
-                                           new(isolate()) Value(stored_value),
-                                           needs_store_barrier,
-                                           1,  // Index scale
-                                           view_cid,
-                                           call->deopt_id(),
-                                           call->token_pos());
+  *last = new(I) StoreIndexedInstr(new(I) Value(array),
+                                   new(I) Value(index),
+                                   new(I) Value(stored_value),
+                                   needs_store_barrier,
+                                   1,  // Index scale
+                                   view_cid,
+                                   call->deopt_id(),
+                                   call->token_pos());
 
   flow_graph()->AppendTo(cursor,
                          *last,
@@ -3776,18 +3741,18 @@
     Instruction** cursor) {
   // Insert byte_index smi check.
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new(isolate()) CheckSmiInstr(
-                                       new(isolate()) Value(byte_index),
+                                   new(I) CheckSmiInstr(
+                                       new(I) Value(byte_index),
                                        call->deopt_id(),
                                        call->token_pos()),
                                    call->env(),
                                    FlowGraph::kEffect);
 
   LoadFieldInstr* length =
-      new(isolate()) LoadFieldInstr(
-          new(isolate()) Value(*array),
+      new(I) LoadFieldInstr(
+          new(I) Value(*array),
           CheckArrayBoundInstr::LengthOffsetFor(array_cid),
-          Type::ZoneHandle(isolate(), Type::SmiType()),
+          Type::ZoneHandle(I, Type::SmiType()),
           call->token_pos());
   length->set_is_immutable(true);
   length->set_result_cid(kSmiCid);
@@ -3800,50 +3765,50 @@
 
   intptr_t element_size = Instance::ElementSizeFor(array_cid);
   ConstantInstr* bytes_per_element =
-      flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(element_size)));
+      flow_graph()->GetConstant(Smi::Handle(I, Smi::New(element_size)));
   BinarySmiOpInstr* len_in_bytes =
-      new(isolate()) BinarySmiOpInstr(Token::kMUL,
-                                      new(isolate()) Value(length),
-                                      new(isolate()) Value(bytes_per_element),
-                                      call->deopt_id(), call->token_pos());
+      new(I) BinarySmiOpInstr(Token::kMUL,
+                              new(I) Value(length),
+                              new(I) Value(bytes_per_element),
+                              call->deopt_id(), call->token_pos());
   *cursor = flow_graph()->AppendTo(*cursor, len_in_bytes, call->env(),
                                    FlowGraph::kValue);
 
   ConstantInstr* length_adjustment =
-      flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(
+      flow_graph()->GetConstant(Smi::Handle(I, Smi::New(
           Instance::ElementSizeFor(view_cid) - 1)));
   // adjusted_length = len_in_bytes - (element_size - 1).
   BinarySmiOpInstr* adjusted_length =
-      new(isolate()) BinarySmiOpInstr(Token::kSUB,
-                                      new(isolate()) Value(len_in_bytes),
-                                      new(isolate()) Value(length_adjustment),
-                                      call->deopt_id(), call->token_pos());
+      new(I) BinarySmiOpInstr(Token::kSUB,
+                              new(I) Value(len_in_bytes),
+                              new(I) Value(length_adjustment),
+                              call->deopt_id(), call->token_pos());
   *cursor = flow_graph()->AppendTo(*cursor, adjusted_length, call->env(),
                                    FlowGraph::kValue);
 
   // Check adjusted_length > 0.
   ConstantInstr* zero =
-      flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(0)));
+      flow_graph()->GetConstant(Smi::Handle(I, Smi::New(0)));
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new(isolate()) CheckArrayBoundInstr(
-                                       new(isolate()) Value(adjusted_length),
-                                       new(isolate()) Value(zero),
+                                   new(I) CheckArrayBoundInstr(
+                                       new(I) Value(adjusted_length),
+                                       new(I) Value(zero),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
   // Check 0 <= byte_index < adjusted_length.
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new(isolate()) CheckArrayBoundInstr(
-                                       new(isolate()) Value(adjusted_length),
-                                       new(isolate()) Value(byte_index),
+                                   new(I) CheckArrayBoundInstr(
+                                       new(I) Value(adjusted_length),
+                                       new(I) Value(byte_index),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
 
   if (RawObject::IsExternalTypedDataClassId(array_cid)) {
     LoadUntaggedInstr* elements =
-        new(isolate()) LoadUntaggedInstr(new(isolate()) Value(*array),
-                                         ExternalTypedData::data_offset());
+        new(I) LoadUntaggedInstr(new(I) Value(*array),
+                                 ExternalTypedData::data_offset());
     *cursor = flow_graph()->AppendTo(*cursor,
                                      elements,
                                      NULL,
@@ -3901,7 +3866,7 @@
   if (!type.IsInstantiated() || type.IsMalformedOrMalbounded()) {
     return Bool::null();
   }
-  const Class& type_class = Class::Handle(isolate(), type.type_class());
+  const Class& type_class = Class::Handle(I, type.type_class());
   const intptr_t num_type_args = type_class.NumTypeArguments();
   if (num_type_args > 0) {
     // Only raw types can be directly compared, thus disregarding type
@@ -3909,7 +3874,7 @@
     const intptr_t num_type_params = type_class.NumTypeParameters();
     const intptr_t from_index = num_type_args - num_type_params;
     const TypeArguments& type_arguments =
-        TypeArguments::Handle(isolate(), type.arguments());
+        TypeArguments::Handle(I, type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
         type_arguments.IsRaw(from_index, num_type_params);
     if (!is_raw_type) {
@@ -3919,8 +3884,8 @@
   }
 
   const ClassTable& class_table = *isolate()->class_table();
-  Bool& prev = Bool::Handle(isolate(), Bool::null());
-  Class& cls = Class::Handle(isolate(), Class::null());
+  Bool& prev = Bool::Handle(I);
+  Class& cls = Class::Handle(I);
 
   bool results_differ = false;
   for (int i = 0; i < ic_data.NumberOfChecks(); i++) {
@@ -3929,9 +3894,9 @@
       return Bool::null();
     }
     const bool is_subtype = cls.IsSubtypeOf(
-        TypeArguments::Handle(isolate(), TypeArguments::null()),
+        TypeArguments::Handle(I),
         type_class,
-        TypeArguments::Handle(isolate(), TypeArguments::null()),
+        TypeArguments::Handle(I),
         NULL);
     results->Add(cls.id());
     results->Add(is_subtype);
@@ -4043,7 +4008,7 @@
   const bool negate = Bool::Cast(
       call->ArgumentAt(4)->OriginalDefinition()->AsConstant()->value()).value();
   const ICData& unary_checks =
-      ICData::ZoneHandle(isolate(), call->ic_data()->AsUnaryClassChecks());
+      ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecks());
   if (FLAG_warn_on_javascript_compatibility &&
       !unary_checks.IssuedJSWarning() &&
       (type.IsIntType() || type.IsDoubleType() || !type.IsInstantiated())) {
@@ -4055,18 +4020,16 @@
   }
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
     ZoneGrowableArray<intptr_t>* results =
-        new(isolate()) ZoneGrowableArray<intptr_t>(
-            unary_checks.NumberOfChecks() * 2);
+        new(I) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
     Bool& as_bool =
-        Bool::ZoneHandle(isolate(),
-                         InstanceOfAsBool(unary_checks, type, results));
+        Bool::ZoneHandle(I, InstanceOfAsBool(unary_checks, type, results));
     if (as_bool.IsNull()) {
       if (results->length() == unary_checks.NumberOfChecks() * 2) {
         const bool can_deopt = TryExpandTestCidsResult(results, type);
-        TestCidsInstr* test_cids = new(isolate()) TestCidsInstr(
+        TestCidsInstr* test_cids = new(I) TestCidsInstr(
             call->token_pos(),
             negate ? Token::kISNOT : Token::kIS,
-            new(isolate()) Value(left),
+            new(I) Value(left),
             *results,
             can_deopt ? call->deopt_id() : Isolate::kNoDeoptId);
         // Remove type.
@@ -4094,35 +4057,34 @@
   }
 
   if (TypeCheckAsClassEquality(type)) {
-    LoadClassIdInstr* left_cid =
-        new(isolate()) LoadClassIdInstr(new(isolate()) Value(left));
+    LoadClassIdInstr* left_cid = new(I) LoadClassIdInstr(new(I) Value(left));
     InsertBefore(call,
                  left_cid,
                  NULL,
                  FlowGraph::kValue);
-    const intptr_t type_cid = Class::Handle(isolate(), type.type_class()).id();
+    const intptr_t type_cid = Class::Handle(I, type.type_class()).id();
     ConstantInstr* cid =
-        flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(type_cid)));
+        flow_graph()->GetConstant(Smi::Handle(I, Smi::New(type_cid)));
 
     StrictCompareInstr* check_cid =
-        new(isolate()) StrictCompareInstr(
+        new(I) StrictCompareInstr(
             call->token_pos(),
             negate ? Token::kNE_STRICT : Token::kEQ_STRICT,
-            new(isolate()) Value(left_cid),
-            new(isolate()) Value(cid),
+            new(I) Value(left_cid),
+            new(I) Value(cid),
             false);  // No number check.
     ReplaceCall(call, check_cid);
     return;
   }
 
   InstanceOfInstr* instance_of =
-      new(isolate()) InstanceOfInstr(call->token_pos(),
-                                     new(isolate()) Value(left),
-                                     new(isolate()) Value(instantiator),
-                                     new(isolate()) Value(type_args),
-                                     type,
-                                     negate,
-                                     call->deopt_id());
+      new(I) InstanceOfInstr(call->token_pos(),
+                             new(I) Value(left),
+                             new(I) Value(instantiator),
+                             new(I) Value(type_args),
+                             type,
+                             negate,
+                             call->deopt_id());
   ReplaceCall(call, instance_of);
 }
 
@@ -4137,7 +4099,7 @@
       AbstractType::Cast(call->ArgumentAt(3)->AsConstant()->value());
   ASSERT(!type.IsMalformedOrMalbounded());
   const ICData& unary_checks =
-      ICData::ZoneHandle(isolate(), call->ic_data()->AsUnaryClassChecks());
+      ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecks());
   if (FLAG_warn_on_javascript_compatibility &&
       !unary_checks.IssuedJSWarning() &&
       (type.IsIntType() || type.IsDoubleType() || !type.IsInstantiated())) {
@@ -4149,9 +4111,8 @@
   }
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
     ZoneGrowableArray<intptr_t>* results =
-        new(isolate()) ZoneGrowableArray<intptr_t>(
-            unary_checks.NumberOfChecks() * 2);
-    const Bool& as_bool = Bool::ZoneHandle(isolate(),
+        new(I) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
+    const Bool& as_bool = Bool::ZoneHandle(I,
         InstanceOfAsBool(unary_checks, type, results));
     if (as_bool.raw() == Bool::True().raw()) {
       AddReceiverCheck(call);
@@ -4168,15 +4129,15 @@
       return;
     }
   }
-  const String& dst_name = String::ZoneHandle(isolate(),
+  const String& dst_name = String::ZoneHandle(I,
       Symbols::New(Exceptions::kCastErrorDstName));
   AssertAssignableInstr* assert_as =
-      new(isolate()) AssertAssignableInstr(call->token_pos(),
-                                           new(isolate()) Value(left),
-                                           new(isolate()) Value(instantiator),
-                                           new(isolate()) Value(type_args),
-                                           type,
-                                           dst_name);
+      new(I) AssertAssignableInstr(call->token_pos(),
+                                   new(I) Value(left),
+                                   new(I) Value(instantiator),
+                                   new(I) Value(type_args),
+                                   type,
+                                   dst_name);
   // Newly inserted instructions that can deoptimize or throw an exception
   // must have a deoptimization id that is valid for lookup in the unoptimized
   // code.
@@ -4205,7 +4166,7 @@
   }
 
   const ICData& unary_checks =
-      ICData::ZoneHandle(isolate(), instr->ic_data()->AsUnaryClassChecks());
+      ICData::ZoneHandle(I, instr->ic_data()->AsUnaryClassChecks());
 
   intptr_t max_checks = (op_kind == Token::kEQ)
       ? FLAG_max_equality_polymorphic_checks
@@ -4258,22 +4219,21 @@
     // Check if the single target is a polymorphic target, if it is,
     // we don't have one target.
     const Function& target =
-        Function::Handle(isolate(), unary_checks.GetTargetAt(0));
+        Function::Handle(I, unary_checks.GetTargetAt(0));
     const bool polymorphic_target = MethodRecognizer::PolymorphicTarget(target);
     has_one_target = !polymorphic_target;
   }
 
   if (has_one_target) {
     const bool is_method_extraction =
-        Function::Handle(isolate(),
-                         unary_checks.GetTargetAt(0)).IsMethodExtractor();
+        Function::Handle(I, unary_checks.GetTargetAt(0)).IsMethodExtractor();
 
     if ((is_method_extraction && !MethodExtractorNeedsClassCheck(instr)) ||
         (!is_method_extraction && !InstanceCallNeedsClassCheck(instr))) {
       const bool call_with_checks = false;
       PolymorphicInstanceCallInstr* call =
-          new(isolate()) PolymorphicInstanceCallInstr(instr, unary_checks,
-                                                      call_with_checks);
+          new(I) PolymorphicInstanceCallInstr(instr, unary_checks,
+                                              call_with_checks);
       instr->ReplaceWith(call, current_iterator());
       return;
     }
@@ -4290,8 +4250,8 @@
       call_with_checks = true;
     }
     PolymorphicInstanceCallInstr* call =
-        new(isolate()) PolymorphicInstanceCallInstr(instr, unary_checks,
-                                                    call_with_checks);
+        new(I) PolymorphicInstanceCallInstr(instr, unary_checks,
+                                            call_with_checks);
     instr->ReplaceWith(call, current_iterator());
   }
 }
@@ -4320,9 +4280,9 @@
   }
   if (unary_kind != MathUnaryInstr::kIllegal) {
     MathUnaryInstr* math_unary =
-        new(isolate()) MathUnaryInstr(unary_kind,
-                                      new(isolate()) Value(call->ArgumentAt(0)),
-                                      call->deopt_id());
+        new(I) MathUnaryInstr(unary_kind,
+                              new(I) Value(call->ArgumentAt(0)),
+                              call->deopt_id());
     ReplaceCall(call, math_unary);
   } else if ((recognized_kind == MethodRecognizer::kFloat32x4Zero) ||
              (recognized_kind == MethodRecognizer::kFloat32x4Splat) ||
@@ -4361,14 +4321,14 @@
         result_cid = kSmiCid;
       }
       if (result_cid != kIllegalCid) {
-        MathMinMaxInstr* min_max = new(isolate()) MathMinMaxInstr(
+        MathMinMaxInstr* min_max = new(I) MathMinMaxInstr(
             recognized_kind,
-            new(isolate()) Value(call->ArgumentAt(0)),
-            new(isolate()) Value(call->ArgumentAt(1)),
+            new(I) Value(call->ArgumentAt(0)),
+            new(I) Value(call->ArgumentAt(1)),
             call->deopt_id(),
             result_cid);
         const ICData& unary_checks =
-            ICData::ZoneHandle(isolate(), ic_data.AsUnaryClassChecks());
+            ICData::ZoneHandle(I, ic_data.AsUnaryClassChecks());
         AddCheckClass(min_max->left()->definition(),
                       unary_checks,
                       call->deopt_id(),
@@ -4387,50 +4347,38 @@
     // InvokeMathCFunctionInstr requires unboxed doubles. UnboxDouble
     // instructions contain type checks and conversions to double.
     ZoneGrowableArray<Value*>* args =
-        new(isolate()) ZoneGrowableArray<Value*>(call->ArgumentCount());
+        new(I) ZoneGrowableArray<Value*>(call->ArgumentCount());
     for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-      args->Add(new(isolate()) Value(call->ArgumentAt(i)));
+      args->Add(new(I) Value(call->ArgumentAt(i)));
     }
     InvokeMathCFunctionInstr* invoke =
-        new(isolate()) InvokeMathCFunctionInstr(args,
-                                                call->deopt_id(),
-                                                recognized_kind,
-                                                call->token_pos());
+        new(I) InvokeMathCFunctionInstr(args,
+                                        call->deopt_id(),
+                                        recognized_kind,
+                                        call->token_pos());
     ReplaceCall(call, invoke);
   } else if (recognized_kind == MethodRecognizer::kObjectArrayConstructor) {
-    Value* type = new(isolate()) Value(call->ArgumentAt(0));
-    Value* num_elements = new(isolate()) Value(call->ArgumentAt(1));
+    Value* type = new(I) Value(call->ArgumentAt(0));
+    Value* num_elements = new(I) Value(call->ArgumentAt(1));
     CreateArrayInstr* create_array =
-        new(isolate()) CreateArrayInstr(call->token_pos(), type, num_elements);
+        new(I) CreateArrayInstr(call->token_pos(), type, num_elements);
     ReplaceCall(call, create_array);
-  } else if (Library::PrivateCoreLibName(Symbols::ClassId()).Equals(
-      String::Handle(isolate(), call->function().name()))) {
-    // Check for core library get:_classId.
-    intptr_t cid = Class::Handle(isolate(), call->function().Owner()).id();
-    // Currently only implemented for a subset of classes.
-    ASSERT((cid == kOneByteStringCid) || (cid == kTwoByteStringCid) ||
-           (cid == kExternalOneByteStringCid) ||
-           (cid == kGrowableObjectArrayCid) ||
-           (cid == kImmutableArrayCid) || (cid == kArrayCid));
-    ConstantInstr* cid_instr =
-        new(isolate()) ConstantInstr(Smi::Handle(isolate(), Smi::New(cid)));
-    ReplaceCall(call, cid_instr);
   } else if (call->function().IsFactory()) {
     const Class& function_class =
-        Class::Handle(isolate(), call->function().Owner());
+        Class::Handle(I, call->function().Owner());
     if ((function_class.library() == Library::CoreLibrary()) ||
         (function_class.library() == Library::TypedDataLibrary())) {
       intptr_t cid = FactoryRecognizer::ResultCid(call->function());
       switch (cid) {
         case kArrayCid: {
-          Value* type = new(isolate()) Value(call->ArgumentAt(0));
-          Value* num_elements = new(isolate()) Value(call->ArgumentAt(1));
+          Value* type = new(I) Value(call->ArgumentAt(0));
+          Value* num_elements = new(I) Value(call->ArgumentAt(1));
           if (num_elements->BindsToConstant() &&
               num_elements->BoundConstant().IsSmi()) {
             intptr_t length = Smi::Cast(num_elements->BoundConstant()).Value();
             if (length >= 0 && length <= Array::kMaxElements) {
               CreateArrayInstr* create_array =
-                  new(isolate()) CreateArrayInstr(
+                  new(I) CreateArrayInstr(
                       call->token_pos(), type, num_elements);
               ReplaceCall(call, create_array);
             }
@@ -4453,13 +4401,13 @@
     // usage count of at least 1/kGetterSetterRatio of the getter usage count.
     // This is to avoid unboxing fields where the setter is never or rarely
     // executed.
-    const Field& field = Field::ZoneHandle(isolate(), instr->field().raw());
-    const String& field_name = String::Handle(isolate(), field.name());
-    class Class& owner = Class::Handle(isolate(), field.owner());
+    const Field& field = Field::ZoneHandle(I, instr->field().raw());
+    const String& field_name = String::Handle(I, field.name());
+    class Class& owner = Class::Handle(I, field.owner());
     const Function& getter =
-        Function::Handle(isolate(), owner.LookupGetterFunction(field_name));
+        Function::Handle(I, owner.LookupGetterFunction(field_name));
     const Function& setter =
-        Function::Handle(isolate(), owner.LookupSetterFunction(field_name));
+        Function::Handle(I, owner.LookupSetterFunction(field_name));
     bool result = !getter.IsNull()
                && !setter.IsNull()
                && (setter.usage_counter() > 0)
@@ -4498,7 +4446,7 @@
     // inlining.
     return false;
   }
-  Function& target = Function::Handle(isolate(), Function::null());
+  Function& target = Function::Handle(I);
   intptr_t class_id;
   unary_ic_data.GetOneClassCheckAt(0, &class_id, &target);
   if (target.kind() != RawFunction::kImplicitSetter) {
@@ -4507,9 +4455,9 @@
   }
   // Inline implicit instance setter.
   const String& field_name =
-      String::Handle(isolate(), Field::NameFromSetter(instr->function_name()));
+      String::Handle(I, Field::NameFromSetter(instr->function_name()));
   const Field& field =
-      Field::ZoneHandle(isolate(), GetField(class_id, field_name));
+      Field::ZoneHandle(I, GetField(class_id, field_name));
   ASSERT(!field.IsNull());
 
   if (InstanceCallNeedsClassCheck(instr)) {
@@ -4518,8 +4466,8 @@
   StoreBarrierType needs_store_barrier = kEmitStoreBarrier;
   if (ArgIsAlways(kSmiCid, *instr->ic_data(), 1)) {
     InsertBefore(instr,
-                 new(isolate()) CheckSmiInstr(
-                     new(isolate()) Value(instr->ArgumentAt(1)),
+                 new(I) CheckSmiInstr(
+                     new(I) Value(instr->ArgumentAt(1)),
                      instr->deopt_id(),
                      instr->token_pos()),
                  instr->env(),
@@ -4529,8 +4477,8 @@
 
   if (field.guarded_cid() != kDynamicCid) {
     InsertBefore(instr,
-                 new(isolate()) GuardFieldClassInstr(
-                     new(isolate()) Value(instr->ArgumentAt(1)),
+                 new(I) GuardFieldClassInstr(
+                     new(I) Value(instr->ArgumentAt(1)),
                       field,
                       instr->deopt_id()),
                  instr->env(),
@@ -4539,8 +4487,8 @@
 
   if (field.needs_length_check()) {
     InsertBefore(instr,
-                 new(isolate()) GuardFieldLengthInstr(
-                     new(isolate()) Value(instr->ArgumentAt(1)),
+                 new(I) GuardFieldLengthInstr(
+                     new(I) Value(instr->ArgumentAt(1)),
                       field,
                       instr->deopt_id()),
                  instr->env(),
@@ -4548,10 +4496,10 @@
   }
 
   // Field guard was detached.
-  StoreInstanceFieldInstr* store = new(isolate()) StoreInstanceFieldInstr(
+  StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
       field,
-      new(isolate()) Value(instr->ArgumentAt(0)),
-      new(isolate()) Value(instr->ArgumentAt(1)),
+      new(I) Value(instr->ArgumentAt(0)),
+      new(I) Value(instr->ArgumentAt(1)),
       needs_store_barrier,
       instr->token_pos());
 
@@ -4581,7 +4529,7 @@
  private:
   // Collect all values that were proven to be smi in smi_values_ array and all
   // CheckSmi instructions in smi_check_ array.
-  void CollectSmiValues();
+  void CollectValues();
 
   // Iterate over smi values and constrain them at branch successors.
   // Additionally constraint values after CheckSmi instructions.
@@ -4652,15 +4600,17 @@
 
   FlowGraph* flow_graph_;
 
-  GrowableArray<Definition*> smi_values_;  // Value that are known to be smi.
-  GrowableArray<CheckSmiInstr*> smi_checks_;  // All CheckSmi instructions.
+  // Value that are known to be smi or mint.
+  GrowableArray<Definition*> values_;
+  // All CheckSmi instructions.
+  GrowableArray<CheckSmiInstr*> smi_checks_;
 
   // All Constraints inserted during InsertConstraints phase. They are treated
   // as smi values.
   GrowableArray<ConstraintInstr*> constraints_;
 
-  // Bitvector for a quick filtering of known smi values.
-  BitVector* smi_definitions_;
+  // Bitvector for a quick filtering of known smi or mint values.
+  BitVector* definitions_;
 
   // Worklist for induction variables analysis.
   GrowableArray<Definition*> worklist_;
@@ -4671,20 +4621,22 @@
 
 
 void RangeAnalysis::Analyze() {
-  CollectSmiValues();
+  CollectValues();
   InsertConstraints();
   InferRanges();
   RemoveConstraints();
 }
 
 
-void RangeAnalysis::CollectSmiValues() {
+void RangeAnalysis::CollectValues() {
   const GrowableArray<Definition*>& initial =
       *flow_graph_->graph_entry()->initial_definitions();
   for (intptr_t i = 0; i < initial.length(); ++i) {
     Definition* current = initial[i];
     if (current->Type()->ToCid() == kSmiCid) {
-      smi_values_.Add(current);
+      values_.Add(current);
+    } else if (current->IsMintDefinition()) {
+      values_.Add(current);
     }
   }
 
@@ -4701,7 +4653,9 @@
       for (intptr_t i = 0; i < initial.length(); ++i) {
         Definition* current = initial[i];
         if (current->Type()->ToCid() == kSmiCid) {
-          smi_values_.Add(current);
+          values_.Add(current);
+        } else if (current->IsMintDefinition()) {
+          values_.Add(current);
         }
       }
     }
@@ -4711,7 +4665,7 @@
       for (PhiIterator phi_it(join); !phi_it.Done(); phi_it.Advance()) {
         PhiInstr* current = phi_it.Current();
         if (current->Type()->ToCid() == kSmiCid) {
-          smi_values_.Add(current);
+          values_.Add(current);
         }
       }
     }
@@ -4724,7 +4678,10 @@
       if (defn != NULL) {
         if ((defn->Type()->ToCid() == kSmiCid) &&
             (defn->ssa_temp_index() != -1)) {
-          smi_values_.Add(defn);
+          values_.Add(defn);
+        } else if ((defn->IsMintDefinition()) &&
+                   (defn->ssa_temp_index() != -1)) {
+          values_.Add(defn);
         }
       } else if (current->IsCheckSmi()) {
         smi_checks_.Add(current->AsCheckSmi());
@@ -4805,22 +4762,22 @@
 Range* RangeAnalysis::ConstraintRange(Token::Kind op, Definition* boundary) {
   switch (op) {
     case Token::kEQ:
-      return new(isolate()) Range(RangeBoundary::FromDefinition(boundary),
-                                  RangeBoundary::FromDefinition(boundary));
+      return new(I) Range(RangeBoundary::FromDefinition(boundary),
+                          RangeBoundary::FromDefinition(boundary));
     case Token::kNE:
       return Range::Unknown();
     case Token::kLT:
-      return new(isolate()) Range(RangeBoundary::MinSmi(),
-                                  RangeBoundary::FromDefinition(boundary, -1));
+      return new(I) Range(RangeBoundary::MinSmi(),
+                          RangeBoundary::FromDefinition(boundary, -1));
     case Token::kGT:
-      return new(isolate()) Range(RangeBoundary::FromDefinition(boundary, 1),
-                                  RangeBoundary::MaxSmi());
+      return new(I) Range(RangeBoundary::FromDefinition(boundary, 1),
+                          RangeBoundary::MaxSmi());
     case Token::kLTE:
-      return new(isolate()) Range(RangeBoundary::MinSmi(),
-                                  RangeBoundary::FromDefinition(boundary));
+      return new(I) Range(RangeBoundary::MinSmi(),
+                          RangeBoundary::FromDefinition(boundary));
     case Token::kGTE:
-      return new(isolate()) Range(RangeBoundary::FromDefinition(boundary),
-                                  RangeBoundary::MaxSmi());
+      return new(I) Range(RangeBoundary::FromDefinition(boundary),
+                          RangeBoundary::MaxSmi());
     default:
       UNREACHABLE();
       return Range::Unknown();
@@ -4834,8 +4791,8 @@
   // No need to constrain constants.
   if (defn->IsConstant()) return NULL;
 
-  ConstraintInstr* constraint = new(isolate()) ConstraintInstr(
-      new(isolate()) Value(defn), constraint_range);
+  ConstraintInstr* constraint = new(I) ConstraintInstr(
+      new(I) Value(defn), constraint_range);
   flow_graph_->InsertAfter(after, constraint, NULL, FlowGraph::kValue);
   RenameDominatedUses(defn, constraint, constraint);
   constraints_.Add(constraint);
@@ -4889,6 +4846,7 @@
   }
 }
 
+
 void RangeAnalysis::InsertConstraintsFor(Definition* defn) {
   for (Value* use = defn->input_use_list();
        use != NULL;
@@ -4910,13 +4868,13 @@
   Range* constraint_range = NULL;
   if (use_index == CheckArrayBoundInstr::kIndexPos) {
     Definition* length = check->length()->definition();
-    constraint_range = new(isolate()) Range(
+    constraint_range = new(I) Range(
         RangeBoundary::FromConstant(0),
         RangeBoundary::FromDefinition(length, -1));
   } else {
     ASSERT(use_index == CheckArrayBoundInstr::kLengthPos);
     Definition* index = check->index()->definition();
-    constraint_range = new(isolate()) Range(
+    constraint_range = new(I) Range(
         RangeBoundary::FromDefinition(index, 1),
         RangeBoundary::MaxSmi());
   }
@@ -4927,11 +4885,22 @@
 void RangeAnalysis::InsertConstraints() {
   for (intptr_t i = 0; i < smi_checks_.length(); i++) {
     CheckSmiInstr* check = smi_checks_[i];
-    InsertConstraintFor(check->value()->definition(), Range::Unknown(), check);
+    ConstraintInstr* constraint =
+        InsertConstraintFor(check->value()->definition(),
+                            Range::UnknownSmi(),
+                            check);
+    if (constraint == NULL) {
+      // No constraint was needed.
+      continue;
+    }
+    // Mark the constraint's value's reaching type as smi.
+    CompileType* smi_compile_type =
+        ZoneCompileType::Wrap(CompileType::FromCid(kSmiCid));
+    constraint->value()->SetReachingType(smi_compile_type);
   }
 
-  for (intptr_t i = 0; i < smi_values_.length(); i++) {
-    InsertConstraintsFor(smi_values_[i]);
+  for (intptr_t i = 0; i < values_.length(); i++) {
+    InsertConstraintsFor(values_[i]);
   }
 
   for (intptr_t i = 0; i < constraints_.length(); i++) {
@@ -4942,8 +4911,7 @@
 
 void RangeAnalysis::ResetWorklist() {
   if (marked_defns_ == NULL) {
-    marked_defns_ = new(isolate()) BitVector(
-        flow_graph_->current_ssa_temp_index());
+    marked_defns_ = new(I) BitVector(flow_graph_->current_ssa_temp_index());
   } else {
     marked_defns_->Clear();
   }
@@ -4970,9 +4938,9 @@
                                                           : kNegative;
   } else if (val->definition()->range() != NULL) {
     Range* range = val->definition()->range();
-    if (Range::ConstantMin(range).value() >= 0) {
+    if (Range::ConstantMin(range).ConstantValue() >= 0) {
       return kPositive;
-    } else if (Range::ConstantMax(range).value() <= 0) {
+    } else if (Range::ConstantMax(range).ConstantValue() <= 0) {
       return kNegative;
     }
   }
@@ -5061,16 +5029,16 @@
   // Compute the range based on initial value and the direction of the growth.
   switch (direction) {
     case kPositive:
-      return new(isolate()) Range(RangeBoundary::FromDefinition(initial_value),
-                                  RangeBoundary::MaxSmi());
+      return new(I) Range(RangeBoundary::FromDefinition(initial_value),
+                          RangeBoundary::MaxSmi());
 
     case kNegative:
-      return new(isolate()) Range(RangeBoundary::MinSmi(),
-                                  RangeBoundary::FromDefinition(initial_value));
+      return new(I) Range(RangeBoundary::MinSmi(),
+                          RangeBoundary::FromDefinition(initial_value));
 
     case kUnknown:
     case kBoth:
-      return Range::Unknown();
+      return Range::UnknownSmi();
   }
 
   UNREACHABLE();
@@ -5084,7 +5052,7 @@
     const bool is_loop_header = (join->loop_info() != NULL);
     for (PhiIterator it(join); !it.Done(); it.Advance()) {
       PhiInstr* phi = it.Current();
-      if (smi_definitions_->Contains(phi->ssa_temp_index())) {
+      if (definitions_->Contains(phi->ssa_temp_index())) {
         if (is_loop_header) {
           // Try recognizing simple induction variables.
           Range* range = InferInductionVariableRange(join, phi);
@@ -5105,7 +5073,7 @@
     Definition* defn = current->AsDefinition();
     if ((defn != NULL) &&
         (defn->ssa_temp_index() != -1) &&
-        smi_definitions_->Contains(defn->ssa_temp_index())) {
+        definitions_->Contains(defn->ssa_temp_index())) {
       defn->InferRange();
     } else if (FLAG_array_bounds_check_elimination &&
                current->IsCheckArrayBound()) {
@@ -5125,14 +5093,19 @@
 
 
 void RangeAnalysis::InferRanges() {
-  // Initialize bitvector for quick filtering of smi values.
-  smi_definitions_ =
-      new(isolate()) BitVector(flow_graph_->current_ssa_temp_index());
-  for (intptr_t i = 0; i < smi_values_.length(); i++) {
-    smi_definitions_->Add(smi_values_[i]->ssa_temp_index());
+  if (FLAG_trace_range_analysis) {
+    OS::Print("---- before range analysis -------\n");
+    FlowGraphPrinter printer(*flow_graph_);
+    printer.PrintBlocks();
+  }
+  // Initialize bitvector for quick filtering of int values.
+  definitions_ =
+      new(I) BitVector(flow_graph_->current_ssa_temp_index());
+  for (intptr_t i = 0; i < values_.length(); i++) {
+    definitions_->Add(values_[i]->ssa_temp_index());
   }
   for (intptr_t i = 0; i < constraints_.length(); i++) {
-    smi_definitions_->Add(constraints_[i]->ssa_temp_index());
+    definitions_->Add(constraints_[i]->ssa_temp_index());
   }
 
   // Infer initial values of ranges.
@@ -5140,7 +5113,7 @@
       *flow_graph_->graph_entry()->initial_definitions();
   for (intptr_t i = 0; i < initial.length(); ++i) {
     Definition* definition = initial[i];
-    if (smi_definitions_->Contains(definition->ssa_temp_index())) {
+    if (definitions_->Contains(definition->ssa_temp_index())) {
       definition->InferRange();
     }
   }
@@ -5168,7 +5141,7 @@
 }
 
 
-void FlowGraphOptimizer::InferSmiRanges() {
+void FlowGraphOptimizer::InferIntRanges() {
   RangeAnalysis range_analysis(flow_graph_);
   range_analysis.Analyze();
 }
@@ -6498,9 +6471,9 @@
     const intptr_t num_blocks = graph_->preorder().length();
     for (intptr_t i = 0; i < num_blocks; i++) {
       out_.Add(NULL);
-      gen_.Add(new(isolate()) BitVector(aliased_set_->max_place_id()));
-      kill_.Add(new(isolate()) BitVector(aliased_set_->max_place_id()));
-      in_.Add(new(isolate()) BitVector(aliased_set_->max_place_id()));
+      gen_.Add(new(I) BitVector(aliased_set_->max_place_id()));
+      kill_.Add(new(I) BitVector(aliased_set_->max_place_id()));
+      in_.Add(new(I) BitVector(aliased_set_->max_place_id()));
 
       exposed_values_.Add(NULL);
       out_values_.Add(NULL);
@@ -6699,7 +6672,7 @@
           // the block entry.
           if (exposed_values == NULL) {
             static const intptr_t kMaxExposedValuesInitialSize = 5;
-            exposed_values = new(isolate()) ZoneGrowableArray<Definition*>(
+            exposed_values = new(I) ZoneGrowableArray<Definition*>(
                 Utils::Minimum(kMaxExposedValuesInitialSize,
                                aliased_set_->max_place_id()));
           }
@@ -6747,11 +6720,9 @@
   // Compute OUT sets by propagating them iteratively until fix point
   // is reached.
   void ComputeOutSets() {
-    BitVector* temp = new(isolate()) BitVector(aliased_set_->max_place_id());
-    BitVector* forwarded_loads =
-        new(isolate()) BitVector(aliased_set_->max_place_id());
-    BitVector* temp_out =
-        new(isolate()) BitVector(aliased_set_->max_place_id());
+    BitVector* temp = new(I) BitVector(aliased_set_->max_place_id());
+    BitVector* forwarded_loads = new(I) BitVector(aliased_set_->max_place_id());
+    BitVector* temp_out = new(I) BitVector(aliased_set_->max_place_id());
 
     bool changed = true;
     while (changed) {
@@ -6803,7 +6774,7 @@
           if ((block_out == NULL) || !block_out->Equals(*temp)) {
             if (block_out == NULL) {
               block_out = out_[preorder_number] =
-                  new(isolate()) BitVector(aliased_set_->max_place_id());
+                  new(I) BitVector(aliased_set_->max_place_id());
             }
             block_out->CopyFrom(temp);
             changed = true;
@@ -6856,8 +6827,8 @@
               MergeIncomingValues(block, place_id) : NULL;
           if ((in_value == NULL) &&
               (in_[preorder_number]->Contains(place_id))) {
-            PhiInstr* phi = new(isolate()) PhiInstr(block->AsJoinEntry(),
-                                                    block->PredecessorCount());
+            PhiInstr* phi = new(I) PhiInstr(block->AsJoinEntry(),
+                                            block->PredecessorCount());
             phi->set_place_id(place_id);
             pending_phis.Add(phi);
             in_value = phi;
@@ -6930,7 +6901,7 @@
         graph_->loop_headers();
 
     ZoneGrowableArray<BitVector*>* invariant_loads =
-        new(isolate()) ZoneGrowableArray<BitVector*>(loop_headers.length());
+        new(I) ZoneGrowableArray<BitVector*>(loop_headers.length());
 
     for (intptr_t i = 0; i < loop_headers.length(); i++) {
       BlockEntryInstr* header = loop_headers[i];
@@ -6940,8 +6911,7 @@
         continue;
       }
 
-      BitVector* loop_gen =
-          new(isolate()) BitVector(aliased_set_->max_place_id());
+      BitVector* loop_gen = new(I) BitVector(aliased_set_->max_place_id());
       for (BitVector::Iterator loop_it(header->loop_info());
            !loop_it.Done();
            loop_it.Advance()) {
@@ -6997,7 +6967,7 @@
     }
 
     // Incoming values are different. Phi is required to merge.
-    PhiInstr* phi = new(isolate()) PhiInstr(
+    PhiInstr* phi = new(I) PhiInstr(
         block->AsJoinEntry(), block->PredecessorCount());
     phi->set_place_id(place_id);
     FillPhiInputs(phi);
@@ -7020,7 +6990,7 @@
       // To prevent using them we additionally mark definitions themselves
       // as replaced and store a pointer to the replacement.
       Definition* replacement = (*pred_out_values)[place_id]->Replacement();
-      Value* input = new(isolate()) Value(replacement);
+      Value* input = new(I) Value(replacement);
       phi->SetInputAt(i, input);
       replacement->AddInputUse(input);
     }
@@ -7093,7 +7063,7 @@
 
     worklist_.Clear();
     if (in_worklist_ == NULL) {
-      in_worklist_ = new(isolate()) BitVector(graph_->current_ssa_temp_index());
+      in_worklist_ = new(I) BitVector(graph_->current_ssa_temp_index());
     } else {
       in_worklist_->Clear();
     }
@@ -7166,7 +7136,7 @@
 
     worklist_.Clear();
     if (in_worklist_ == NULL) {
-      in_worklist_ = new(isolate()) BitVector(graph_->current_ssa_temp_index());
+      in_worklist_ = new(I) BitVector(graph_->current_ssa_temp_index());
     } else {
       in_worklist_->Clear();
     }
@@ -7205,9 +7175,9 @@
       if (a->is_alive()) {
         a->mark_dead();
         a->block()->RemovePhi(a);
+        a->UnuseAllInputs();
       }
     }
-
     return true;
   }
 
@@ -7234,9 +7204,7 @@
     for (intptr_t i = 0; i < phis_.length(); i++) {
       PhiInstr* phi = phis_[i];
       if (!phi->HasUses() || EliminateRedundantPhi(phi)) {
-        for (intptr_t j = phi->InputCount() - 1; j >= 0; --j) {
-          phi->InputAt(j)->RemoveFromUseList();
-        }
+        phi->UnuseAllInputs();
         phis_[i] = NULL;
       }
     }
@@ -7246,17 +7214,14 @@
     for (intptr_t i = 0; i < phis_.length(); i++) {
       PhiInstr* phi = phis_[i];
       if ((phi != NULL) && (!phi->HasUses() || !EmitPhi(phi))) {
-        for (intptr_t j = phi->InputCount() - 1; j >= 0; --j) {
-          phi->InputAt(j)->RemoveFromUseList();
-        }
+        phi->UnuseAllInputs();
       }
     }
   }
 
   ZoneGrowableArray<Definition*>* CreateBlockOutValues() {
     ZoneGrowableArray<Definition*>* out =
-        new(isolate()) ZoneGrowableArray<Definition*>(
-            aliased_set_->max_place_id());
+        new(I) ZoneGrowableArray<Definition*>(aliased_set_->max_place_id());
     for (intptr_t i = 0; i < aliased_set_->max_place_id(); i++) {
       out->Add(NULL);
     }
@@ -7913,7 +7878,7 @@
 void ConstantPropagator::VisitPhi(PhiInstr* instr) {
   // Compute the join over all the reachable predecessor values.
   JoinEntryInstr* block = instr->block();
-  Object& value = Object::ZoneHandle(isolate(), Unknown());
+  Object& value = Object::ZoneHandle(I, Unknown());
   for (intptr_t pred_idx = 0; pred_idx < instr->InputCount(); ++pred_idx) {
     if (reachable_->Contains(
             block->PredecessorAt(pred_idx)->preorder_number())) {
@@ -8030,7 +7995,7 @@
     ASSERT(value.IsBool());
     bool result = Bool::Cast(value).value();
     SetValue(instr,
-             Smi::Handle(isolate(), Smi::New(
+             Smi::Handle(I, Smi::New(
                  result ? instr->if_true() : instr->if_false())));
   }
 }
@@ -8106,10 +8071,9 @@
     if (left.IsInteger() && right.IsInteger()) {
       const bool result = CompareIntegers(
           instr->kind(),
-          Integer::Handle(isolate(),
-                          Integer::Cast(left).BitOp(Token::kBIT_AND,
-                                                    Integer::Cast(right))),
-          Smi::Handle(isolate(), Smi::New(0)));
+          Integer::Handle(I, Integer::Cast(left).BitOp(Token::kBIT_AND,
+                                                       Integer::Cast(right))),
+          Smi::Handle(I, Smi::New(0)));
       SetValue(instr, result ? Bool::True() : Bool::False());
     } else {
       SetValue(instr, non_constant_);
@@ -8193,7 +8157,7 @@
     ASSERT(ch_code >= 0);
     if (ch_code < Symbols::kMaxOneCharCodeSymbol) {
       RawString** table = Symbols::PredefinedAddress();
-      SetValue(instr, String::ZoneHandle(isolate(), table[ch_code]));
+      SetValue(instr, String::ZoneHandle(I, table[ch_code]));
     } else {
       SetValue(instr, non_constant_);
     }
@@ -8208,7 +8172,7 @@
   } else if (IsConstant(o)) {
     const String& str = String::Cast(o);
     const intptr_t result = (str.Length() == 1) ? str.CharAt(0) : -1;
-    SetValue(instr, Smi::ZoneHandle(isolate(), Smi::New(result)));
+    SetValue(instr, Smi::ZoneHandle(I, Smi::New(result)));
   }
 }
 
@@ -8238,13 +8202,13 @@
       if (array_obj.IsString()) {
         const String& str = String::Cast(array_obj);
         if (str.Length() > index) {
-          SetValue(instr, Smi::Handle(isolate(), Smi::New(str.CharAt(index))));
+          SetValue(instr, Smi::Handle(I, Smi::New(str.CharAt(index))));
           return;
         }
       } else if (array_obj.IsArray()) {
         const Array& a = Array::Cast(array_obj);
         if ((a.Length() > index) && a.IsImmutable()) {
-          Instance& result = Instance::Handle(isolate(), Instance::null());
+          Instance& result = Instance::Handle(I);
           result ^= a.At(index);
           SetValue(instr, result);
           return;
@@ -8271,7 +8235,7 @@
   const Field& field = instr->StaticField();
   ASSERT(field.is_static());
   if (field.is_final()) {
-    Instance& obj = Instance::Handle(isolate(), field.value());
+    Instance& obj = Instance::Handle(I, field.value());
     ASSERT(obj.raw() != Object::sentinel().raw());
     ASSERT(obj.raw() != Object::transition_sentinel().raw());
     if (obj.IsSmi() || obj.IsOld()) {
@@ -8346,12 +8310,12 @@
 void ConstantPropagator::VisitLoadClassId(LoadClassIdInstr* instr) {
   intptr_t cid = instr->object()->Type()->ToCid();
   if (cid != kDynamicCid) {
-    SetValue(instr, Smi::ZoneHandle(isolate(), Smi::New(cid)));
+    SetValue(instr, Smi::ZoneHandle(I, Smi::New(cid)));
     return;
   }
   const Object& object = instr->object()->definition()->constant_value();
   if (IsConstant(object)) {
-    SetValue(instr, Smi::ZoneHandle(isolate(), Smi::New(object.GetClassId())));
+    SetValue(instr, Smi::ZoneHandle(I, Smi::New(object.GetClassId())));
     return;
   }
   SetValue(instr, non_constant_);
@@ -8366,7 +8330,7 @@
     if (num_elements->BindsToConstant() &&
         num_elements->BoundConstant().IsSmi()) {
       intptr_t length = Smi::Cast(num_elements->BoundConstant()).Value();
-      const Object& result = Smi::ZoneHandle(isolate(), Smi::New(length));
+      const Object& result = Smi::ZoneHandle(I, Smi::New(length));
       SetValue(instr, result);
       return;
     }
@@ -8376,12 +8340,12 @@
     ConstantInstr* constant = instr->instance()->definition()->AsConstant();
     if (constant != NULL) {
       if (constant->value().IsString()) {
-        SetValue(instr, Smi::ZoneHandle(isolate(),
+        SetValue(instr, Smi::ZoneHandle(I,
             Smi::New(String::Cast(constant->value()).Length())));
         return;
       }
       if (constant->value().IsArray()) {
-        SetValue(instr, Smi::ZoneHandle(isolate(),
+        SetValue(instr, Smi::ZoneHandle(I,
             Smi::New(Array::Cast(constant->value()).Length())));
         return;
       }
@@ -8401,7 +8365,7 @@
   if (IsConstant(object)) {
     if (instr->type().IsTypeParameter()) {
       if (object.IsNull()) {
-        SetValue(instr, Type::ZoneHandle(isolate(), Type::DynamicType()));
+        SetValue(instr, Type::ZoneHandle(I, Type::DynamicType()));
         return;
       }
       // We could try to instantiate the type parameter and return it if no
@@ -8473,7 +8437,7 @@
         case Token::kADD:
         case Token::kSUB:
         case Token::kMUL: {
-          Instance& result = Integer::ZoneHandle(isolate(),
+          Instance& result = Integer::ZoneHandle(I,
               left_int.ArithmeticOp(op_kind, right_int));
           result = result.CheckAndCanonicalize(NULL);
           ASSERT(!result.IsNull());
@@ -8483,7 +8447,7 @@
         case Token::kSHL:
         case Token::kSHR:
           if (left.IsSmi() && right.IsSmi()) {
-            Instance& result = Integer::ZoneHandle(isolate(),
+            Instance& result = Integer::ZoneHandle(I,
                 Smi::Cast(left_int).ShiftOp(op_kind, Smi::Cast(right_int)));
             result = result.CheckAndCanonicalize(NULL);
             ASSERT(!result.IsNull());
@@ -8495,7 +8459,7 @@
         case Token::kBIT_AND:
         case Token::kBIT_OR:
         case Token::kBIT_XOR: {
-          Instance& result = Integer::ZoneHandle(isolate(),
+          Instance& result = Integer::ZoneHandle(I,
               left_int.BitOp(op_kind, right_int));
           result = result.CheckAndCanonicalize(NULL);
           ASSERT(!result.IsNull());
@@ -8574,7 +8538,7 @@
 void ConstantPropagator::VisitSmiToDouble(SmiToDoubleInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
   if (IsConstant(value) && value.IsInteger()) {
-    SetValue(instr, Double::Handle(isolate(),
+    SetValue(instr, Double::Handle(I,
         Double::New(Integer::Cast(value).AsDoubleValue(), Heap::kOld)));
   } else if (IsNonConstant(value)) {
     SetValue(instr, non_constant_);
@@ -9037,8 +9001,7 @@
   // Canonicalize branches that have no side-effects and where true- and
   // false-targets are the same.
   bool changed = false;
-  BitVector* empty_blocks =
-      new(graph_->isolate()) BitVector(graph_->preorder().length());
+  BitVector* empty_blocks = new(I) BitVector(graph_->preorder().length());
   for (BlockIterator b = graph_->postorder_iterator();
        !b.Done();
        b.Advance()) {
@@ -9056,9 +9019,8 @@
         // Drop the comparison, which does not have side effects
         JoinEntryInstr* join = if_true->AsJoinEntry();
         if (join->phis() == NULL) {
-          GotoInstr* jump =
-              new(graph_->isolate()) GotoInstr(if_true->AsJoinEntry());
-          jump->InheritDeoptTarget(isolate(), branch);
+          GotoInstr* jump = new(I) GotoInstr(if_true->AsJoinEntry());
+          jump->InheritDeoptTarget(I, branch);
 
           Instruction* previous = branch->previous();
           branch->set_previous(NULL);
@@ -9203,17 +9165,17 @@
         ASSERT(reachable_->Contains(if_false->preorder_number()));
         ASSERT(if_false->parallel_move() == NULL);
         ASSERT(if_false->loop_info() == NULL);
-        join = new(isolate()) JoinEntryInstr(if_false->block_id(),
-                                             if_false->try_index());
-        join->InheritDeoptTarget(isolate(), if_false);
+        join = new(I) JoinEntryInstr(if_false->block_id(),
+                                     if_false->try_index());
+        join->InheritDeoptTarget(I, if_false);
         if_false->UnuseAllInputs();
         next = if_false->next();
       } else if (!reachable_->Contains(if_false->preorder_number())) {
         ASSERT(if_true->parallel_move() == NULL);
         ASSERT(if_true->loop_info() == NULL);
-        join = new(isolate()) JoinEntryInstr(if_true->block_id(),
-                                             if_true->try_index());
-        join->InheritDeoptTarget(isolate(), if_true);
+        join = new(I) JoinEntryInstr(if_true->block_id(),
+                                     if_true->try_index());
+        join->InheritDeoptTarget(I, if_true);
         if_true->UnuseAllInputs();
         next = if_true->next();
       }
@@ -9223,8 +9185,8 @@
         // Drop the comparison, which does not have side effects as long
         // as it is a strict compare (the only one we can determine is
         // constant with the current analysis).
-        GotoInstr* jump = new(isolate()) GotoInstr(join);
-        jump->InheritDeoptTarget(isolate(), branch);
+        GotoInstr* jump = new(I) GotoInstr(join);
+        jump->InheritDeoptTarget(I, branch);
 
         Instruction* previous = branch->previous();
         branch->set_previous(NULL);
@@ -9781,28 +9743,28 @@
     const Class& cls,
     const ZoneGrowableArray<const Object*>& slots) {
   ZoneGrowableArray<Value*>* values =
-      new(isolate()) ZoneGrowableArray<Value*>(slots.length());
+      new(I) ZoneGrowableArray<Value*>(slots.length());
 
   // Insert load instruction for every field.
   for (intptr_t i = 0; i < slots.length(); i++) {
     LoadFieldInstr* load = slots[i]->IsField()
-        ? new(isolate()) LoadFieldInstr(
-            new(isolate()) Value(alloc),
+        ? new(I) LoadFieldInstr(
+            new(I) Value(alloc),
             &Field::Cast(*slots[i]),
-            AbstractType::ZoneHandle(isolate(), AbstractType::null()),
+            AbstractType::ZoneHandle(I),
             alloc->token_pos())
-        : new(isolate()) LoadFieldInstr(
-            new(isolate()) Value(alloc),
+        : new(I) LoadFieldInstr(
+            new(I) Value(alloc),
             Smi::Cast(*slots[i]).Value(),
-            AbstractType::ZoneHandle(isolate(), AbstractType::null()),
+            AbstractType::ZoneHandle(I),
             alloc->token_pos());
     flow_graph_->InsertBefore(
         exit, load, NULL, FlowGraph::kValue);
-    values->Add(new(isolate()) Value(load));
+    values->Add(new(I) Value(load));
   }
 
   MaterializeObjectInstr* mat =
-      new(isolate()) MaterializeObjectInstr(cls, slots, values);
+      new(I) MaterializeObjectInstr(cls, slots, values);
   flow_graph_->InsertBefore(exit, mat, NULL, FlowGraph::kValue);
 
   // Replace all mentions of this allocation with a newly inserted
@@ -9828,7 +9790,7 @@
 void AllocationSinking::InsertMaterializations(AllocateObjectInstr* alloc) {
   // Collect all fields that are written for this instance.
   ZoneGrowableArray<const Object*>* slots =
-      new(isolate()) ZoneGrowableArray<const Object*>(5);
+      new(I) ZoneGrowableArray<const Object*>(5);
 
   for (Value* use = alloc->input_use_list();
        use != NULL;
@@ -9837,15 +9799,14 @@
     if (!store->field().IsNull()) {
       AddSlot(slots, store->field());
     } else {
-      AddSlot(slots, Smi::ZoneHandle(isolate(),
-                                     Smi::New(store->offset_in_bytes())));
+      AddSlot(slots, Smi::ZoneHandle(I, Smi::New(store->offset_in_bytes())));
     }
   }
 
   if (alloc->ArgumentCount() > 0) {
     ASSERT(alloc->ArgumentCount() == 1);
     intptr_t type_args_offset = alloc->cls().type_arguments_field_offset();
-    AddSlot(slots, Smi::ZoneHandle(isolate(), Smi::New(type_args_offset)));
+    AddSlot(slots, Smi::ZoneHandle(I, Smi::New(type_args_offset)));
   }
 
   // Collect all instructions that mention this object in the environment.
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index b1fd7d8..5b05ea7 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -41,7 +41,7 @@
 
   void SelectRepresentations();
 
-  void InferSmiRanges();
+  void InferIntRanges();
 
   void AnalyzeTryCatch();
 
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 179cdee..9a68f26 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -1043,10 +1043,18 @@
 
 
 CompileType BoxIntegerInstr::ComputeType() const {
+  if (is_smi()) {
+    return CompileType::FromCid(kSmiCid);
+  }
   return CompileType::Int();
 }
 
 
+bool BoxIntegerInstr::RecomputeType() {
+  return UpdateType(ComputeType());
+}
+
+
 CompileType UnboxIntegerInstr::ComputeType() const {
   return CompileType::Int();
 }
diff --git a/runtime/vm/gc_sweeper.cc b/runtime/vm/gc_sweeper.cc
index 043e01d..d5486f9 100644
--- a/runtime/vm/gc_sweeper.cc
+++ b/runtime/vm/gc_sweeper.cc
@@ -57,14 +57,24 @@
 
 
 bool GCSweeper::SweepLargePage(HeapPage* page) {
+  bool in_use = false;
   RawObject* raw_obj = RawObject::FromAddr(page->object_start());
-  if (!raw_obj->IsMarked()) {
-    // The large object was not marked. Used size is zero, which also tells the
-    // calling code that the large object page can be recycled.
-    return false;
+  if (raw_obj->IsMarked()) {
+    raw_obj->ClearMarkBit();
+    in_use = true;
   }
-  raw_obj->ClearMarkBit();
-  return true;
+#ifdef DEBUG
+  // String::MakeExternal and Array::MakeArray create trailing filler objects,
+  // but they are always unreachable. Verify that they are not marked.
+  uword current = RawObject::ToAddr(raw_obj) + raw_obj->Size();
+  uword end = page->object_end();
+  while (current < end) {
+    RawObject* cur_obj = RawObject::FromAddr(current);
+    ASSERT(!cur_obj->IsMarked());
+    current += cur_obj->Size();
+  }
+#endif  // DEBUG
+  return in_use;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/growable_array.h b/runtime/vm/growable_array.h
index a94158e..6f26c74 100644
--- a/runtime/vm/growable_array.h
+++ b/runtime/vm/growable_array.h
@@ -83,6 +83,9 @@
     data_[idx] = value;
   }
 
+  // The content is uninitialized after calling it.
+  void SetLength(intptr_t new_length);
+
   // Sort the array in place.
   inline void Sort(int compare(const T*, const T*));
 
@@ -92,6 +95,7 @@
   T* data_;
   Zone* zone_;  // Zone in which we are allocating the array.
 
+  // Used for growing the array.
   void Resize(intptr_t new_length);
 
   DISALLOW_COPY_AND_ASSIGN(BaseGrowableArray);
@@ -119,6 +123,18 @@
 }
 
 
+template<typename T, typename B>
+void BaseGrowableArray<T, B>::SetLength(intptr_t new_length) {
+  if (new_length > capacity_) {
+    T* new_data = zone_->Alloc<T>(new_length);
+    ASSERT(new_data != NULL);
+    data_ = new_data;
+    capacity_ = new_length;
+  }
+  length_ = new_length;
+}
+
+
 template<typename T>
 class GrowableArray : public BaseGrowableArray<T, ValueObject> {
  public:
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index acdca49..0a2c4d1 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -33,7 +33,7 @@
             "maximum total external size (MB) in new gen before triggering GC");
 
 Heap::Heap(Isolate* isolate,
-           intptr_t max_new_gen_words,
+           intptr_t max_new_gen_semi_words,
            intptr_t max_old_gen_words)
     : isolate_(isolate), read_only_(false), gc_in_progress_(false) {
   for (int sel = 0;
@@ -43,7 +43,7 @@
     old_weak_tables_[sel] = new WeakTable();
   }
   new_space_ = new Scavenger(this,
-                             max_new_gen_words,
+                             max_new_gen_semi_words,
                              kNewObjectAlignmentOffset);
   old_space_ = new PageSpace(this, max_old_gen_words);
   stats_.num_ = 0;
@@ -92,6 +92,7 @@
 }
 
 void Heap::AllocateExternal(intptr_t size, Space space) {
+  ASSERT(isolate()->no_gc_scope_depth() == 0);
   if (space == kNew) {
     new_space_->AllocateExternal(size);
     if (new_space_->ExternalInWords() > (FLAG_new_gen_ext_limit * MBInWords)) {
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 57ded04..71354e3 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -263,12 +263,12 @@
     Heap::GCReason reason_;
 
     class Data : public ValueObject {
-    public:
+     public:
       Data() {}
       int64_t micros_;
       SpaceUsage new_;
       SpaceUsage old_;
-    private:
+     private:
       DISALLOW_COPY_AND_ASSIGN(Data);
     };
 
@@ -288,7 +288,7 @@
   static const intptr_t kNewAllocatableSize = 256 * KB;
 
   Heap(Isolate* isolate,
-       intptr_t max_new_gen_words,
+       intptr_t max_new_gen_semi_words,  // Max capacity of new semi-space.
        intptr_t max_old_gen_words);
 
   uword AllocateNew(intptr_t size);
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 1ea3469..181b017 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -283,7 +283,7 @@
 }
 
 
-const char* Range::ToCString(Range* range) {
+const char* Range::ToCString(const Range* range) {
   if (range == NULL) return "[_|_, _|_]";
 
   char buffer[256];
@@ -296,18 +296,18 @@
 void RangeBoundary::PrintTo(BufferFormatter* f) const {
   switch (kind_) {
     case kSymbol:
-      f->Print("v%" Pd,
+      f->Print("v%" Pd "",
                reinterpret_cast<Definition*>(value_)->ssa_temp_index());
-      if (offset_ != 0) f->Print("%+" Pd, offset_);
+      if (offset_ != 0) f->Print("%+" Pd64 "", offset_);
+      break;
+    case kNegativeInfinity:
+      f->Print("-inf");
+      break;
+    case kPositiveInfinity:
+      f->Print("+inf");
       break;
     case kConstant:
-      if (value_ == kMinusInfinity) {
-        f->Print("-inf");
-      } else if (value_ == kPlusInfinity) {
-        f->Print("+inf");
-      } else {
-        f->Print("%" Pd, value_);
-      }
+      f->Print("%" Pd64 "", value_);
       break;
     case kUnknown:
       f->Print("_|_");
@@ -592,7 +592,7 @@
 void BinarySmiOpInstr::PrintTo(BufferFormatter* f) const {
   Definition::PrintTo(f);
   f->Print(" %co", overflow_ ? '+' : '-');
-  f->Print(" %ct", is_truncating() ? '+' : '-');
+  f->Print(" %ct", IsTruncating() ? '+' : '-');
 }
 
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 67f8142..1891ef2 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -34,7 +34,6 @@
 DECLARE_FLAG(bool, trace_optimization);
 DECLARE_FLAG(bool, trace_constant_propagation);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
-DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 Definition::Definition()
     : range_(NULL),
@@ -60,14 +59,14 @@
 }
 
 
-ICData* Instruction::GetICData(const Array& ic_data_array) const {
-  ICData& ic_data = ICData::ZoneHandle();
+const ICData* Instruction::GetICData(
+    const ZoneGrowableArray<const ICData*>& ic_data_array) const {
   // The deopt_id can be outside the range of the IC data array for
   // computations added in the optimizing compiler.
-  if (!ic_data_array.IsNull() && (deopt_id_ < ic_data_array.Length())) {
-    ic_data ^= ic_data_array.At(deopt_id_);
+  if (deopt_id_ < ic_data_array.length()) {
+    return ic_data_array[deopt_id_];
   }
-  return &ic_data;
+  return NULL;
 }
 
 
@@ -319,7 +318,7 @@
          !BigintOperations::FitsIntoSmi(Bigint::Cast(value)));
   ASSERT(!value.IsBigint() ||
          !BigintOperations::FitsIntoInt64(Bigint::Cast(value)));
-  ASSERT(!value.IsMint() || !Smi::IsValid64(Mint::Cast(value).AsInt64Value()));
+  ASSERT(!value.IsMint() || !Smi::IsValid(Mint::Cast(value).AsInt64Value()));
 }
 
 
@@ -551,7 +550,11 @@
 
 #define SET_IS_RECOGNIZED(class_name, function_name, dest, fp)                 \
   func = Library::GetFunction(libs, #class_name, #function_name);              \
-  ASSERT(!func.IsNull());                                                      \
+  if (func.IsNull()) {                                                         \
+    OS::PrintErr("Missing %s::%s\n", #class_name, #function_name);             \
+    UNREACHABLE();                                                             \
+  }                                                                            \
+  ASSERT(func.CheckSourceFingerprint(fp));                                     \
   func.set_is_recognized(true);                                                \
 
   RECOGNIZED_LIST(SET_IS_RECOGNIZED);
@@ -1234,14 +1237,13 @@
     case Token::kSHR: {
       // Can't deopt if shift-count is known positive.
       Range* right_range = this->right()->definition()->range();
-      return (right_range == NULL)
-          || !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+      return (right_range == NULL) || !right_range->IsPositive();
     }
     case Token::kSHL: {
       Range* right_range = this->right()->definition()->range();
-      if ((right_range != NULL) && is_truncating()) {
+      if ((right_range != NULL) && IsTruncating()) {
         // Can deoptimize if right can be negative.
-        return !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+        return !right_range->IsPositive();
       }
       return true;
     }
@@ -2256,16 +2258,16 @@
 
 
 void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ICData& call_ic_data = ICData::ZoneHandle(ic_data()->raw());
+  const ICData* call_ic_data = NULL;
   if (!FLAG_propagate_ic_data || !compiler->is_optimizing()) {
     const Array& arguments_descriptor =
         Array::Handle(ArgumentsDescriptor::New(ArgumentCount(),
                                                argument_names()));
-    call_ic_data = ICData::New(compiler->parsed_function().function(),
-                               function_name(),
-                               arguments_descriptor,
-                               deopt_id(),
-                               checked_argument_count());
+    call_ic_data = compiler->GetOrAddInstanceCallICData(
+        deopt_id(), function_name(), arguments_descriptor,
+        checked_argument_count());
+  } else {
+    call_ic_data = &ICData::ZoneHandle(ic_data()->raw());
   }
   if (compiler->is_optimizing()) {
     ASSERT(HasICData());
@@ -2285,7 +2287,7 @@
                                      ArgumentCount(),
                                      argument_names(),
                                      locs(),
-                                     call_ic_data);
+                                     *call_ic_data);
     }
   } else {
     // Unoptimized code.
@@ -2298,7 +2300,7 @@
                                    ArgumentCount(),
                                    argument_names(),
                                    locs(),
-                                   call_ic_data);
+                                   *call_ic_data);
   }
 }
 
@@ -2330,6 +2332,26 @@
 
 
 void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const ICData* call_ic_data = NULL;
+  if (!FLAG_propagate_ic_data || !compiler->is_optimizing()) {
+    const Array& arguments_descriptor =
+        Array::Handle(ArgumentsDescriptor::New(ArgumentCount(),
+                                               argument_names()));
+    // TODO(srdjan): Improve performance of function recognition.
+    MethodRecognizer::Kind recognized_kind =
+        MethodRecognizer::RecognizeKind(function());
+    int num_args_checked = 0;
+    if ((recognized_kind == MethodRecognizer::kMathMin) ||
+        (recognized_kind == MethodRecognizer::kMathMax)) {
+      num_args_checked = 2;
+    }
+    call_ic_data = compiler->GetOrAddStaticCallICData(deopt_id(),
+                                                      function(),
+                                                      arguments_descriptor,
+                                                      num_args_checked);
+  } else {
+    call_ic_data = &ICData::ZoneHandle(ic_data()->raw());
+  }
   if (!compiler->is_optimizing()) {
     // Some static calls can be optimized by the optimizing compiler (e.g. sqrt)
     // and therefore need a deoptimization descriptor.
@@ -2342,7 +2364,8 @@
                                function(),
                                ArgumentCount(),
                                argument_names(),
-                               locs());
+                               locs(),
+                               *call_ic_data);
 }
 
 
@@ -2429,7 +2452,7 @@
 }
 
 
-RangeBoundary RangeBoundary::FromDefinition(Definition* defn, intptr_t offs) {
+RangeBoundary RangeBoundary::FromDefinition(Definition* defn, int64_t offs) {
   if (defn->IsConstant() && defn->AsConstant()->value().IsSmi()) {
     return FromConstant(Smi::Cast(defn->AsConstant()->value()).Value() + offs);
   }
@@ -2438,18 +2461,90 @@
 
 
 RangeBoundary RangeBoundary::LowerBound() const {
+  if (IsInfinity()) {
+    return NegativeInfinity();
+  }
   if (IsConstant()) return *this;
   return Add(Range::ConstantMin(symbol()->range()),
              RangeBoundary::FromConstant(offset_),
-             OverflowedMinSmi());
+             NegativeInfinity());
 }
 
 
 RangeBoundary RangeBoundary::UpperBound() const {
+  if (IsInfinity()) {
+    return PositiveInfinity();
+  }
   if (IsConstant()) return *this;
   return Add(Range::ConstantMax(symbol()->range()),
              RangeBoundary::FromConstant(offset_),
-             OverflowedMaxSmi());
+             PositiveInfinity());
+}
+
+
+RangeBoundary RangeBoundary::Add(const RangeBoundary& a,
+                                 const RangeBoundary& b,
+                                 const RangeBoundary& overflow) {
+  ASSERT(a.IsConstant() && b.IsConstant());
+
+  if (Utils::WillAddOverflow(a.ConstantValue(), b.ConstantValue())) {
+    return overflow;
+  }
+
+  int64_t result = a.ConstantValue() + b.ConstantValue();
+
+  return RangeBoundary::FromConstant(result);
+}
+
+
+RangeBoundary RangeBoundary::Sub(const RangeBoundary& a,
+                                 const RangeBoundary& b,
+                                 const RangeBoundary& overflow) {
+  ASSERT(a.IsConstant() && b.IsConstant());
+
+  if (Utils::WillSubOverflow(a.ConstantValue(), b.ConstantValue())) {
+    return overflow;
+  }
+
+  int64_t result = a.ConstantValue() - b.ConstantValue();
+
+  return RangeBoundary::FromConstant(result);
+}
+
+
+bool RangeBoundary::SymbolicAdd(const RangeBoundary& a,
+                                const RangeBoundary& b,
+                                RangeBoundary* result) {
+  if (a.IsSymbol() && b.IsConstant()) {
+    if (Utils::WillAddOverflow(a.offset(), b.ConstantValue())) {
+      return false;
+    }
+
+    const int64_t offset = a.offset() + b.ConstantValue();
+
+    *result = RangeBoundary::FromDefinition(a.symbol(), offset);
+    return true;
+  } else if (b.IsSymbol() && a.IsConstant()) {
+    return SymbolicAdd(b, a, result);
+  }
+  return false;
+}
+
+
+bool RangeBoundary::SymbolicSub(const RangeBoundary& a,
+                                const RangeBoundary& b,
+                                RangeBoundary* result) {
+  if (a.IsSymbol() && b.IsConstant()) {
+    if (Utils::WillSubOverflow(a.offset(), b.ConstantValue())) {
+      return false;
+    }
+
+    const int64_t offset = a.offset() - b.ConstantValue();
+
+    *result = RangeBoundary::FromDefinition(a.symbol(), offset);
+    return true;
+  }
+  return false;
 }
 
 
@@ -2480,39 +2575,47 @@
 }
 
 
-// Returns true if range has a least specific minimum value.
-static bool IsMinSmi(Range* range) {
-  return (range == NULL) ||
-      (range->min().IsConstant() &&
-       (range->min().value() <= Smi::kMinValue));
-}
-
-
-// Returns true if range has a least specific maximium value.
-static bool IsMaxSmi(Range* range) {
-  return (range == NULL) ||
-      (range->max().IsConstant() &&
-       (range->max().value() >= Smi::kMaxValue));
-}
-
-
-// Returns true if two range boundaries can be proven to be equal.
-static bool IsEqual(const RangeBoundary& a, const RangeBoundary& b) {
-  if (a.IsConstant() && b.IsConstant()) {
-    return a.value() == b.value();
-  } else if (a.IsSymbol() && b.IsSymbol()) {
-    return (a.offset() == b.offset()) && DependOnSameSymbol(a, b);
-  } else {
-    return false;
+bool RangeBoundary::Equals(const RangeBoundary& other) const {
+  if (IsConstant() && other.IsConstant()) {
+    return ConstantValue() == other.ConstantValue();
+  } else if (IsInfinity() && other.IsInfinity()) {
+    return kind() == other.kind();
+  } else if (IsSymbol() && other.IsSymbol()) {
+    return (offset() == other.offset()) && DependOnSameSymbol(*this, other);
+  } else if (IsUnknown() && other.IsUnknown()) {
+    return true;
   }
+  return false;
+}
+
+
+RangeBoundary RangeBoundary::Shl(const RangeBoundary& value_boundary,
+                                 int64_t shift_count,
+                                 const RangeBoundary& overflow) {
+  ASSERT(value_boundary.IsConstant());
+  ASSERT(shift_count >= 0);
+  int64_t limit = 64 - shift_count;
+  int64_t value = static_cast<int64_t>(value_boundary.ConstantValue());
+
+  if ((value == 0) ||
+      (shift_count == 0) ||
+      ((limit > 0) && (Utils::IsInt(limit, value)))) {
+    // Result stays in 64 bit range.
+    int64_t result = value << shift_count;
+    return Smi::IsValid(result) ? RangeBoundary(result) : overflow;
+  }
+
+  return overflow;
 }
 
 
 static RangeBoundary CanonicalizeBoundary(const RangeBoundary& a,
                                           const RangeBoundary& overflow) {
-  if (a.IsConstant()) return a;
+  if (a.IsConstant() || a.IsInfinity()) {
+    return a;
+  }
 
-  intptr_t offset = a.offset();
+  int64_t offset = a.offset();
   Definition* symbol = a.symbol();
 
   bool changed;
@@ -2528,11 +2631,19 @@
       switch (op->op_kind()) {
         case Token::kADD:
           if (right->IsConstant()) {
-            offset += Smi::Cast(right->AsConstant()->value()).Value();
+            int64_t rhs = Smi::Cast(right->AsConstant()->value()).Value();
+            if (Utils::WillAddOverflow(offset, rhs)) {
+              return overflow;
+            }
+            offset += rhs;
             symbol = left;
             changed = true;
           } else if (left->IsConstant()) {
-            offset += Smi::Cast(left->AsConstant()->value()).Value();
+            int64_t rhs = Smi::Cast(left->AsConstant()->value()).Value();
+            if (Utils::WillAddOverflow(offset, rhs)) {
+              return overflow;
+            }
+            offset += rhs;
             symbol = right;
             changed = true;
           }
@@ -2540,7 +2651,11 @@
 
         case Token::kSUB:
           if (right->IsConstant()) {
-            offset -= Smi::Cast(right->AsConstant()->value()).Value();
+            int64_t rhs = Smi::Cast(right->AsConstant()->value()).Value();
+            if (Utils::WillSubOverflow(offset, rhs)) {
+              return overflow;
+            }
+            offset -= rhs;
             symbol = left;
             changed = true;
           }
@@ -2550,8 +2665,6 @@
           break;
       }
     }
-
-    if (!Smi::IsValid(offset)) return overflow;
   } while (changed);
 
   return RangeBoundary::FromDefinition(symbol, offset);
@@ -2564,16 +2677,18 @@
   Range* range = a->symbol()->range();
   if ((range == NULL) || !range->max().IsSymbol()) return false;
 
-  const intptr_t offset = range->max().offset() + a->offset();
 
-  if (!Smi::IsValid(offset)) {
-    *a = RangeBoundary::OverflowedMaxSmi();
+  if (Utils::WillAddOverflow(range->max().offset(), a->offset())) {
+    *a = RangeBoundary::PositiveInfinity();
     return true;
   }
 
+  const int64_t offset = range->max().offset() + a->offset();
+
+
   *a = CanonicalizeBoundary(
       RangeBoundary::FromDefinition(range->max().symbol(), offset),
-      RangeBoundary::OverflowedMaxSmi());
+      RangeBoundary::PositiveInfinity());
 
   return true;
 }
@@ -2585,58 +2700,187 @@
   Range* range = a->symbol()->range();
   if ((range == NULL) || !range->min().IsSymbol()) return false;
 
-  const intptr_t offset = range->min().offset() + a->offset();
-  if (!Smi::IsValid(offset)) {
-    *a = RangeBoundary::OverflowedMinSmi();
+  if (Utils::WillAddOverflow(range->min().offset(), a->offset())) {
+    *a = RangeBoundary::NegativeInfinity();
     return true;
   }
 
+  const int64_t offset = range->min().offset() + a->offset();
+
   *a = CanonicalizeBoundary(
       RangeBoundary::FromDefinition(range->min().symbol(), offset),
-      RangeBoundary::OverflowedMinSmi());
+      RangeBoundary::NegativeInfinity());
 
   return true;
 }
 
 
-RangeBoundary RangeBoundary::Min(RangeBoundary a, RangeBoundary b) {
+RangeBoundary RangeBoundary::Min(RangeBoundary a, RangeBoundary b,
+                                 RangeSize size) {
+  ASSERT(!(a.IsNegativeInfinity() || b.IsNegativeInfinity()));
+  ASSERT(!a.IsUnknown() || !b.IsUnknown());
+  if (a.IsUnknown() && !b.IsUnknown()) {
+    return b;
+  }
+  if (!a.IsUnknown() && b.IsUnknown()) {
+    return a;
+  }
+  if (size == kRangeBoundarySmi) {
+    if (a.IsSmiMaximumOrAbove() && !b.IsSmiMaximumOrAbove()) {
+      return b;
+    }
+    if (!a.IsSmiMaximumOrAbove() && b.IsSmiMaximumOrAbove()) {
+      return a;
+    }
+  } else {
+    ASSERT(size == kRangeBoundaryInt64);
+    if (a.IsMaximumOrAbove() && !b.IsMaximumOrAbove()) {
+      return b;
+    }
+    if (!a.IsMaximumOrAbove() && b.IsMaximumOrAbove()) {
+      return a;
+    }
+  }
+
+  if (a.Equals(b)) {
+    return b;
+  }
+
+  {
+    RangeBoundary canonical_a =
+        CanonicalizeBoundary(a, RangeBoundary::PositiveInfinity());
+    RangeBoundary canonical_b =
+        CanonicalizeBoundary(b, RangeBoundary::PositiveInfinity());
+    do {
+      if (DependOnSameSymbol(canonical_a, canonical_b)) {
+        a = canonical_a;
+        b = canonical_b;
+        break;
+      }
+    } while (CanonicalizeMaxBoundary(&canonical_a) ||
+             CanonicalizeMaxBoundary(&canonical_b));
+  }
+
   if (DependOnSameSymbol(a, b)) {
     return (a.offset() <= b.offset()) ? a : b;
   }
 
-  const intptr_t min_a = a.LowerBound().Clamp().value();
-  const intptr_t min_b = b.LowerBound().Clamp().value();
+  const int64_t min_a = a.UpperBound().Clamp(size).ConstantValue();
+  const int64_t min_b = b.UpperBound().Clamp(size).ConstantValue();
 
   return RangeBoundary::FromConstant(Utils::Minimum(min_a, min_b));
 }
 
 
-RangeBoundary RangeBoundary::Max(RangeBoundary a, RangeBoundary b) {
-  if (DependOnSameSymbol(a, b)) {
-    return (a.offset() >= b.offset()) ? a : b;
+RangeBoundary RangeBoundary::Max(RangeBoundary a, RangeBoundary b,
+                                 RangeSize size) {
+  ASSERT(!(a.IsPositiveInfinity() || b.IsPositiveInfinity()));
+  ASSERT(!a.IsUnknown() || !b.IsUnknown());
+  if (a.IsUnknown() && !b.IsUnknown()) {
+    return b;
+  }
+  if (!a.IsUnknown() && b.IsUnknown()) {
+    return a;
+  }
+  if (size == kRangeBoundarySmi) {
+    if (a.IsSmiMinimumOrBelow() && !b.IsSmiMinimumOrBelow()) {
+      return b;
+    }
+    if (!a.IsSmiMinimumOrBelow() && b.IsSmiMinimumOrBelow()) {
+      return a;
+    }
+  } else {
+     ASSERT(size == kRangeBoundaryInt64);
+    if (a.IsMinimumOrBelow() && !b.IsMinimumOrBelow()) {
+      return b;
+    }
+    if (!a.IsMinimumOrBelow() && b.IsMinimumOrBelow()) {
+      return a;
+    }
+  }
+  if (a.Equals(b)) {
+    return b;
   }
 
-  const intptr_t max_a = a.UpperBound().Clamp().value();
-  const intptr_t max_b = b.UpperBound().Clamp().value();
+  {
+    RangeBoundary canonical_a =
+        CanonicalizeBoundary(a, RangeBoundary::NegativeInfinity());
+    RangeBoundary canonical_b =
+        CanonicalizeBoundary(b, RangeBoundary::NegativeInfinity());
+
+    do {
+      if (DependOnSameSymbol(canonical_a, canonical_b)) {
+        a = canonical_a;
+        b = canonical_b;
+        break;
+      }
+    } while (CanonicalizeMinBoundary(&canonical_a) ||
+             CanonicalizeMinBoundary(&canonical_b));
+  }
+
+  if (DependOnSameSymbol(a, b)) {
+    return (a.offset() <= b.offset()) ? b : a;
+  }
+
+  const int64_t max_a = a.LowerBound().Clamp(size).ConstantValue();
+  const int64_t max_b = b.LowerBound().Clamp(size).ConstantValue();
 
   return RangeBoundary::FromConstant(Utils::Maximum(max_a, max_b));
 }
 
 
+int64_t RangeBoundary::ConstantValue() const {
+  ASSERT(IsConstant());
+  return value_;
+}
+
+
 void Definition::InferRange() {
-  ASSERT(Type()->ToCid() == kSmiCid);  // Has meaning only for smis.
-  if (range_ == NULL) {
-    range_ = Range::Unknown();
+  if (Type()->ToCid() == kSmiCid) {
+    if (range_ == NULL) {
+      range_ = Range::UnknownSmi();
+    }
+  } else if (IsMintDefinition()) {
+    if (range_ == NULL) {
+      range_ = Range::Unknown();
+    }
+  } else {
+    // Only Smi and Mint supported.
+    UNREACHABLE();
   }
 }
 
 
 void ConstantInstr::InferRange() {
-  ASSERT(value_.IsSmi());
+  if (value_.IsSmi()) {
+    if (range_ == NULL) {
+      int64_t value = Smi::Cast(value_).Value();
+      range_ = new Range(RangeBoundary::FromConstant(value),
+                         RangeBoundary::FromConstant(value));
+    }
+  } else if (value_.IsMint()) {
+    if (range_ == NULL) {
+      int64_t value = Mint::Cast(value_).value();
+      range_ = new Range(RangeBoundary::FromConstant(value),
+                         RangeBoundary::FromConstant(value));
+    }
+  } else {
+    // Only Smi and Mint supported.
+    UNREACHABLE();
+  }
+}
+
+
+void UnboxIntegerInstr::InferRange() {
   if (range_ == NULL) {
-    intptr_t value = Smi::Cast(value_).Value();
-    range_ = new Range(RangeBoundary::FromConstant(value),
-                       RangeBoundary::FromConstant(value));
+    Definition* unboxed = value()->definition();
+    ASSERT(unboxed != NULL);
+    Range* range = unboxed->range();
+    if (range == NULL) {
+      range_ = Range::Unknown();
+      return;
+    }
+    range_ = new Range(range->min(), range->max());
   }
 }
 
@@ -2644,72 +2888,32 @@
 void ConstraintInstr::InferRange() {
   Range* value_range = value()->definition()->range();
 
+  // Only constraining smi values.
+  ASSERT(value()->IsSmiValue());
+
   RangeBoundary min;
   RangeBoundary max;
 
-  if (IsMinSmi(value_range) && !IsMinSmi(constraint())) {
-    min = constraint()->min();
-  } else if (IsMinSmi(constraint()) && !IsMinSmi(value_range)) {
-    min = value_range->min();
-  } else if ((value_range != NULL) &&
-             IsEqual(constraint()->min(), value_range->min())) {
-    min = constraint()->min();
-  } else {
-    if (value_range != NULL) {
-      RangeBoundary canonical_a =
-          CanonicalizeBoundary(constraint()->min(),
-                               RangeBoundary::OverflowedMinSmi());
-      RangeBoundary canonical_b =
-          CanonicalizeBoundary(value_range->min(),
-                               RangeBoundary::OverflowedMinSmi());
-
-      do {
-        if (DependOnSameSymbol(canonical_a, canonical_b)) {
-          min = (canonical_a.offset() <= canonical_b.offset()) ? canonical_b
-                                                               : canonical_a;
-        }
-      } while (CanonicalizeMinBoundary(&canonical_a) ||
-               CanonicalizeMinBoundary(&canonical_b));
-    }
-
-    if (min.IsUnknown()) {
-      min = RangeBoundary::Max(Range::ConstantMin(value_range),
-                               Range::ConstantMin(constraint()));
-    }
+  {
+    RangeBoundary value_min = (value_range == NULL) ?
+        RangeBoundary() : value_range->min();
+    RangeBoundary constraint_min = constraint()->min();
+    min = RangeBoundary::Max(value_min, constraint_min,
+                             RangeBoundary::kRangeBoundarySmi);
   }
 
-  if (IsMaxSmi(value_range) && !IsMaxSmi(constraint())) {
-    max = constraint()->max();
-  } else if (IsMaxSmi(constraint()) && !IsMaxSmi(value_range)) {
-    max = value_range->max();
-  } else if ((value_range != NULL) &&
-             IsEqual(constraint()->max(), value_range->max())) {
-    max = constraint()->max();
-  } else {
-    if (value_range != NULL) {
-      RangeBoundary canonical_b =
-          CanonicalizeBoundary(value_range->max(),
-                               RangeBoundary::OverflowedMaxSmi());
-      RangeBoundary canonical_a =
-          CanonicalizeBoundary(constraint()->max(),
-                               RangeBoundary::OverflowedMaxSmi());
+  ASSERT(!min.IsUnknown());
 
-      do {
-        if (DependOnSameSymbol(canonical_a, canonical_b)) {
-          max = (canonical_a.offset() <= canonical_b.offset()) ? canonical_a
-                                                               : canonical_b;
-          break;
-        }
-      } while (CanonicalizeMaxBoundary(&canonical_a) ||
-               CanonicalizeMaxBoundary(&canonical_b));
-    }
-
-    if (max.IsUnknown()) {
-      max = RangeBoundary::Min(Range::ConstantMax(value_range),
-                               Range::ConstantMax(constraint()));
-    }
+  {
+    RangeBoundary value_max = (value_range == NULL) ?
+        RangeBoundary() : value_range->max();
+    RangeBoundary constraint_max = constraint()->max();
+    max = RangeBoundary::Min(value_max, constraint_max,
+                             RangeBoundary::kRangeBoundarySmi);
   }
 
+  ASSERT(!max.IsUnknown());
+
   range_ = new Range(min, max);
 
   // Mark branches that generate unsatisfiable constraints as constant.
@@ -2781,6 +2985,22 @@
       range_ = new Range(RangeBoundary::FromConstant(0),
                          RangeBoundary::FromConstant(65535));
       break;
+    case kTypedDataInt32ArrayCid:
+      if (CanDeoptimize()) {
+        range_ = Range::UnknownSmi();
+      } else {
+        range_ = new Range(RangeBoundary::FromConstant(kMinInt32),
+                           RangeBoundary::FromConstant(kMaxInt32));
+      }
+      break;
+    case kTypedDataUint32ArrayCid:
+      if (CanDeoptimize()) {
+        range_ = Range::UnknownSmi();
+      } else {
+        range_ = new Range(RangeBoundary::FromConstant(0),
+                           RangeBoundary::FromConstant(kMaxUint32));
+      }
+      break;
     case kOneByteStringCid:
       range_ = new Range(RangeBoundary::FromConstant(0),
                          RangeBoundary::FromConstant(0xFF));
@@ -2899,29 +3119,35 @@
   RangeBoundary new_min;
   RangeBoundary new_max;
 
+  ASSERT(Type()->ToCid() == kSmiCid);
+
   for (intptr_t i = 0; i < InputCount(); i++) {
     Range* input_range = InputAt(i)->definition()->range();
     if (input_range == NULL) {
-      range_ = Range::Unknown();
+      range_ = Range::UnknownSmi();
       return;
     }
 
     if (new_min.IsUnknown()) {
       new_min = Range::ConstantMin(input_range);
     } else {
-      new_min = RangeBoundary::Min(new_min, Range::ConstantMin(input_range));
+      new_min = RangeBoundary::Min(new_min,
+                                   Range::ConstantMinSmi(input_range),
+                                   RangeBoundary::kRangeBoundarySmi);
     }
 
     if (new_max.IsUnknown()) {
       new_max = Range::ConstantMax(input_range);
     } else {
-      new_max = RangeBoundary::Max(new_max, Range::ConstantMax(input_range));
+      new_max = RangeBoundary::Max(new_max,
+                                   Range::ConstantMaxSmi(input_range),
+                                   RangeBoundary::kRangeBoundarySmi);
     }
   }
 
   ASSERT(new_min.IsUnknown() == new_max.IsUnknown());
   if (new_min.IsUnknown()) {
-    range_ = Range::Unknown();
+    range_ = Range::UnknownSmi();
     return;
   }
 
@@ -2940,70 +3166,15 @@
 }
 
 
-static bool SymbolicSub(const RangeBoundary& a,
-                        const RangeBoundary& b,
-                        RangeBoundary* result) {
-  if (a.IsSymbol() && b.IsConstant() && !b.Overflowed()) {
-    const intptr_t offset = a.offset() - b.value();
-    if (!Smi::IsValid(offset)) return false;
-
-    *result = RangeBoundary::FromDefinition(a.symbol(), offset);
-    return true;
-  }
-  return false;
-}
-
-
-static bool SymbolicAdd(const RangeBoundary& a,
-                        const RangeBoundary& b,
-                        RangeBoundary* result) {
-  if (a.IsSymbol() && b.IsConstant() && !b.Overflowed()) {
-    const intptr_t offset = a.offset() + b.value();
-    if (!Smi::IsValid(offset)) return false;
-
-    *result = RangeBoundary::FromDefinition(a.symbol(), offset);
-    return true;
-  } else if (b.IsSymbol() && a.IsConstant() && !a.Overflowed()) {
-    const intptr_t offset = b.offset() + a.value();
-    if (!Smi::IsValid(offset)) return false;
-
-    *result = RangeBoundary::FromDefinition(b.symbol(), offset);
-    return true;
-  }
-  return false;
-}
-
-
 static bool IsArrayLength(Definition* defn) {
+  if (defn == NULL) {
+    return false;
+  }
   LoadFieldInstr* load = defn->AsLoadField();
   return (load != NULL) && load->IsImmutableLengthLoad();
 }
 
 
-static int64_t ConstantAbsMax(const Range* range) {
-  if (range == NULL) return Smi::kMaxValue;
-  const int64_t abs_min = Utils::Abs(Range::ConstantMin(range).value());
-  const int64_t abs_max = Utils::Abs(Range::ConstantMax(range).value());
-  return abs_min > abs_max ? abs_min : abs_max;
-}
-
-
-static bool OnlyPositiveOrZero(const Range* a, const Range* b) {
-  if ((a == NULL) || (b == NULL)) return false;
-  if (Range::ConstantMin(a).value() < 0) return false;
-  if (Range::ConstantMin(b).value() < 0) return false;
-  return true;
-}
-
-
-static bool OnlyNegativeOrZero(const Range* a, const Range* b) {
-  if ((a == NULL) || (b == NULL)) return false;
-  if (Range::ConstantMax(a).value() > 0) return false;
-  if (Range::ConstantMax(b).value() > 0) return false;
-  return true;
-}
-
-
 void BinarySmiOpInstr::InferRange() {
   // TODO(vegorov): canonicalize BinarySmiOp to always have constant on the
   // right and a non-constant on the left.
@@ -3013,10 +3184,306 @@
   Range* right_range = right()->definition()->range();
 
   if ((left_range == NULL) || (right_range == NULL)) {
-    range_ = new Range(RangeBoundary::MinSmi(), RangeBoundary::MaxSmi());
+    range_ = Range::UnknownSmi();
     return;
   }
 
+  Range* possible_range = Range::BinaryOp(op_kind(),
+                                          left_range,
+                                          right_range,
+                                          left_defn);
+
+  if ((range_ == NULL) && (possible_range == NULL)) {
+    // Initialize.
+    range_ = Range::UnknownSmi();
+    return;
+  }
+
+  if (possible_range == NULL) {
+    // Nothing new.
+    return;
+  }
+
+  range_ = possible_range;
+
+  ASSERT(!range_->min().IsUnknown() && !range_->max().IsUnknown());
+  // Calculate overflowed status before clamping.
+  const bool overflowed = range_->min().LowerBound().OverflowedSmi() ||
+                          range_->max().UpperBound().OverflowedSmi();
+  // Clamp value to be within smi range.
+  range_->Clamp(RangeBoundary::kRangeBoundarySmi);
+
+  set_overflow(overflowed);
+}
+
+
+void BinaryMintOpInstr::InferRange() {
+  // TODO(vegorov): canonicalize BinaryMintOpInstr to always have constant on
+  // the right and a non-constant on the left.
+  Definition* left_defn = left()->definition();
+
+  Range* left_range = left_defn->range();
+  Range* right_range = right()->definition()->range();
+
+  if ((left_range == NULL) || (right_range == NULL)) {
+    range_ = Range::Unknown();
+    return;
+  }
+
+  Range* possible_range = Range::BinaryOp(op_kind(),
+                                          left_range,
+                                          right_range,
+                                          left_defn);
+
+  if ((range_ == NULL) && (possible_range == NULL)) {
+    // Initialize.
+    range_ = Range::Unknown();
+    return;
+  }
+
+  if (possible_range == NULL) {
+    // Nothing new.
+    return;
+  }
+
+  range_ = possible_range;
+
+  ASSERT(!range_->min().IsUnknown() && !range_->max().IsUnknown());
+
+  // Clamp value to be within mint range.
+  range_->Clamp(RangeBoundary::kRangeBoundaryInt64);
+}
+
+
+void ShiftMintOpInstr::InferRange() {
+  Definition* left_defn = left()->definition();
+
+  Range* left_range = left_defn->range();
+  Range* right_range = right()->definition()->range();
+
+  if ((left_range == NULL) || (right_range == NULL)) {
+    range_ = Range::Unknown();
+    return;
+  }
+
+  Range* possible_range = Range::BinaryOp(op_kind(),
+                                          left_range,
+                                          right_range,
+                                          left_defn);
+
+  if ((range_ == NULL) && (possible_range == NULL)) {
+    // Initialize.
+    range_ = Range::Unknown();
+    return;
+  }
+
+  if (possible_range == NULL) {
+    // Nothing new.
+    return;
+  }
+
+  range_ = possible_range;
+
+  ASSERT(!range_->min().IsUnknown() && !range_->max().IsUnknown());
+
+  // Clamp value to be within mint range.
+  range_->Clamp(RangeBoundary::kRangeBoundaryInt64);
+}
+
+
+void BoxIntegerInstr::InferRange() {
+  Range* input_range = value()->definition()->range();
+  if (input_range != NULL) {
+    bool is_smi = !input_range->min().LowerBound().OverflowedSmi() &&
+                  !input_range->max().UpperBound().OverflowedSmi();
+    set_is_smi(is_smi);
+    // The output range is the same as the input range.
+    range_ = input_range;
+  }
+}
+
+
+bool Range::IsPositive() const {
+  if (min().IsNegativeInfinity()) {
+    return false;
+  }
+  if (min().LowerBound().ConstantValue() < 0) {
+    return false;
+  }
+  if (max().IsPositiveInfinity()) {
+    return true;
+  }
+  return max().UpperBound().ConstantValue() >= 0;
+}
+
+
+bool Range::OnlyLessThanOrEqualTo(int64_t val) const {
+  if (max().IsPositiveInfinity()) {
+    // Cannot be true.
+    return false;
+  }
+  if (max().UpperBound().ConstantValue() > val) {
+    // Not true.
+    return false;
+  }
+  return true;
+}
+
+
+bool Range::OnlyGreaterThanOrEqualTo(int64_t val) const {
+  if (min().IsNegativeInfinity()) {
+    return false;
+  }
+  if (min().LowerBound().ConstantValue() < val) {
+    return false;
+  }
+  return true;
+}
+
+
+// Inclusive.
+bool Range::IsWithin(int64_t min_int, int64_t max_int) const {
+  RangeBoundary lower_min = min().LowerBound();
+  if (lower_min.IsNegativeInfinity() || (lower_min.ConstantValue() < min_int)) {
+    return false;
+  }
+  RangeBoundary upper_max = max().UpperBound();
+  if (upper_max.IsPositiveInfinity() || (upper_max.ConstantValue() > max_int)) {
+    return false;
+  }
+  return true;
+}
+
+
+bool Range::Overlaps(int64_t min_int, int64_t max_int) const {
+  RangeBoundary lower = min().LowerBound();
+  RangeBoundary upper = max().UpperBound();
+  const int64_t this_min = lower.IsNegativeInfinity() ?
+      RangeBoundary::kMin : lower.ConstantValue();
+  const int64_t this_max = upper.IsPositiveInfinity() ?
+      RangeBoundary::kMax : upper.ConstantValue();
+  if ((this_min <= min_int) && (min_int <= this_max)) return true;
+  if ((this_min <= max_int) && (max_int <= this_max)) return true;
+  if ((min_int < this_min) && (max_int > this_max)) return true;
+  return false;
+}
+
+
+bool Range::IsUnsatisfiable() const {
+  // Infinity case: [+inf, ...] || [..., -inf]
+  if (min().IsPositiveInfinity() || max().IsNegativeInfinity()) {
+    return true;
+  }
+  // Constant case: For example [0, -1].
+  if (Range::ConstantMin(this).ConstantValue() >
+      Range::ConstantMax(this).ConstantValue()) {
+    return true;
+  }
+  // Symbol case: For example [v+1, v].
+  if (DependOnSameSymbol(min(), max()) && min().offset() > max().offset()) {
+    return true;
+  }
+  return false;
+}
+
+
+void Range::Clamp(RangeBoundary::RangeSize size) {
+  min_ = min_.Clamp(size);
+  max_ = max_.Clamp(size);
+}
+
+
+void Range::Shl(const Range* left,
+                const Range* right,
+                RangeBoundary* result_min,
+                RangeBoundary* result_max) {
+  ASSERT(left != NULL);
+  ASSERT(right != NULL);
+  ASSERT(result_min != NULL);
+  ASSERT(result_max != NULL);
+  RangeBoundary left_max = Range::ConstantMax(left);
+  RangeBoundary left_min = Range::ConstantMin(left);
+  // A negative shift count always deoptimizes (and throws), so the minimum
+  // shift count is zero.
+  int64_t right_max = Utils::Maximum(Range::ConstantMax(right).ConstantValue(),
+                                     static_cast<int64_t>(0));
+  int64_t right_min = Utils::Maximum(Range::ConstantMin(right).ConstantValue(),
+                                     static_cast<int64_t>(0));
+
+  *result_min = RangeBoundary::Shl(
+      left_min,
+      left_min.ConstantValue() > 0 ? right_min : right_max,
+      left_min.ConstantValue() > 0
+          ? RangeBoundary::PositiveInfinity()
+          : RangeBoundary::NegativeInfinity());
+
+  *result_max = RangeBoundary::Shl(
+      left_max,
+      left_max.ConstantValue() > 0 ? right_max : right_min,
+      left_max.ConstantValue() > 0
+          ? RangeBoundary::PositiveInfinity()
+          : RangeBoundary::NegativeInfinity());
+}
+
+
+void Range::Shr(const Range* left,
+                const Range* right,
+                RangeBoundary* result_min,
+                RangeBoundary* result_max) {
+  RangeBoundary left_max = Range::ConstantMax(left);
+  RangeBoundary left_min = Range::ConstantMin(left);
+  // A negative shift count always deoptimizes (and throws), so the minimum
+  // shift count is zero.
+  int64_t right_max = Utils::Maximum(Range::ConstantMax(right).ConstantValue(),
+                                     static_cast<int64_t>(0));
+  int64_t right_min = Utils::Maximum(Range::ConstantMin(right).ConstantValue(),
+                                     static_cast<int64_t>(0));
+
+  *result_min = RangeBoundary::Shr(
+      left_min,
+      left_min.ConstantValue() > 0 ? right_max : right_min);
+
+  *result_max = RangeBoundary::Shr(
+      left_max,
+      left_max.ConstantValue() > 0 ? right_min : right_max);
+}
+
+
+bool Range::And(const Range* left_range,
+                const Range* right_range,
+                RangeBoundary* result_min,
+                RangeBoundary* result_max) {
+  ASSERT(left_range != NULL);
+  ASSERT(right_range != NULL);
+  ASSERT(result_min != NULL);
+  ASSERT(result_max != NULL);
+
+  if (Range::ConstantMin(right_range).ConstantValue() >= 0) {
+    *result_min = RangeBoundary::FromConstant(0);
+    *result_max = Range::ConstantMax(right_range);
+    return true;
+  }
+
+  if (Range::ConstantMin(left_range).ConstantValue() >= 0) {
+    *result_min = RangeBoundary::FromConstant(0);
+    *result_max = Range::ConstantMax(left_range);
+    return true;
+  }
+
+  return false;
+}
+
+
+void Range::Add(const Range* left_range,
+                const Range* right_range,
+                RangeBoundary* result_min,
+                RangeBoundary* result_max,
+                Definition* left_defn) {
+  ASSERT(left_range != NULL);
+  ASSERT(right_range != NULL);
+  ASSERT(result_min != NULL);
+  ASSERT(result_max != NULL);
+
   RangeBoundary left_min =
     IsArrayLength(left_defn) ?
         RangeBoundary::FromDefinition(left_defn) : left_range->min();
@@ -3025,124 +3492,151 @@
     IsArrayLength(left_defn) ?
         RangeBoundary::FromDefinition(left_defn) : left_range->max();
 
+  if (!RangeBoundary::SymbolicAdd(left_min, right_range->min(), result_min)) {
+    *result_min = RangeBoundary::Add(left_range->min().LowerBound(),
+                                     right_range->min().LowerBound(),
+                                     RangeBoundary::NegativeInfinity());
+  }
+  if (!RangeBoundary::SymbolicAdd(left_max, right_range->max(), result_max)) {
+    *result_max = RangeBoundary::Add(right_range->max().UpperBound(),
+                                     left_range->max().UpperBound(),
+                                     RangeBoundary::PositiveInfinity());
+  }
+}
+
+
+void Range::Sub(const Range* left_range,
+                const Range* right_range,
+                RangeBoundary* result_min,
+                RangeBoundary* result_max,
+                Definition* left_defn) {
+  ASSERT(left_range != NULL);
+  ASSERT(right_range != NULL);
+  ASSERT(result_min != NULL);
+  ASSERT(result_max != NULL);
+
+  RangeBoundary left_min =
+    IsArrayLength(left_defn) ?
+        RangeBoundary::FromDefinition(left_defn) : left_range->min();
+
+  RangeBoundary left_max =
+    IsArrayLength(left_defn) ?
+        RangeBoundary::FromDefinition(left_defn) : left_range->max();
+
+  if (!RangeBoundary::SymbolicSub(left_min, right_range->max(), result_min)) {
+    *result_min = RangeBoundary::Sub(left_range->min().LowerBound(),
+                              right_range->max().UpperBound(),
+                              RangeBoundary::NegativeInfinity());
+  }
+  if (!RangeBoundary::SymbolicSub(left_max, right_range->min(), result_max)) {
+    *result_max = RangeBoundary::Sub(left_range->max().UpperBound(),
+                                     right_range->min().LowerBound(),
+                                     RangeBoundary::PositiveInfinity());
+  }
+}
+
+
+bool Range::Mul(const Range* left_range,
+                const Range* right_range,
+                RangeBoundary* result_min,
+                RangeBoundary* result_max) {
+  ASSERT(left_range != NULL);
+  ASSERT(right_range != NULL);
+  ASSERT(result_min != NULL);
+  ASSERT(result_max != NULL);
+
+  const int64_t left_max = ConstantAbsMax(left_range);
+  const int64_t right_max = ConstantAbsMax(right_range);
+  if ((left_max <= -kSmiMin) && (right_max <= -kSmiMin) &&
+      ((left_max == 0) || (right_max <= kMaxInt64 / left_max))) {
+    // Product of left and right max values stays in 64 bit range.
+    const int64_t mul_max = left_max * right_max;
+    if (Smi::IsValid(mul_max) && Smi::IsValid(-mul_max)) {
+      const intptr_t r_min =
+          OnlyPositiveOrZero(*left_range, *right_range) ? 0 : -mul_max;
+      *result_min = RangeBoundary::FromConstant(r_min);
+      const intptr_t r_max =
+          OnlyNegativeOrZero(*left_range, *right_range) ? 0 : mul_max;
+      *result_max = RangeBoundary::FromConstant(r_max);
+      return true;
+    }
+  }
+  return false;
+}
+
+
+// Both the a and b ranges are >= 0.
+bool Range::OnlyPositiveOrZero(const Range& a, const Range& b) {
+  return a.OnlyGreaterThanOrEqualTo(0) && b.OnlyGreaterThanOrEqualTo(0);
+}
+
+
+// Both the a and b ranges are <= 0.
+bool Range::OnlyNegativeOrZero(const Range& a, const Range& b) {
+  return a.OnlyLessThanOrEqualTo(0) && b.OnlyLessThanOrEqualTo(0);
+}
+
+
+// Return the maximum absolute value included in range.
+int64_t Range::ConstantAbsMax(const Range* range) {
+  if (range == NULL) {
+    return RangeBoundary::kMax;
+  }
+  const int64_t abs_min = Utils::Abs(Range::ConstantMin(range).ConstantValue());
+  const int64_t abs_max = Utils::Abs(Range::ConstantMax(range).ConstantValue());
+  return Utils::Maximum(abs_min, abs_max);
+}
+
+
+Range* Range::BinaryOp(const Token::Kind op,
+                       const Range* left_range,
+                       const Range* right_range,
+                       Definition* left_defn) {
+  ASSERT(left_range != NULL);
+  ASSERT(right_range != NULL);
+
+  // Both left and right ranges are finite.
+  ASSERT(left_range->IsFinite());
+  ASSERT(right_range->IsFinite());
+
   RangeBoundary min;
   RangeBoundary max;
-  switch (op_kind()) {
+  ASSERT(min.IsUnknown() && max.IsUnknown());
+
+  switch (op) {
     case Token::kADD:
-      if (!SymbolicAdd(left_min, right_range->min(), &min)) {
-        min =
-          RangeBoundary::Add(Range::ConstantMin(left_range),
-                             Range::ConstantMin(right_range),
-                             RangeBoundary::OverflowedMinSmi());
-      }
-
-      if (!SymbolicAdd(left_max, right_range->max(), &max)) {
-        max =
-          RangeBoundary::Add(Range::ConstantMax(right_range),
-                             Range::ConstantMax(left_range),
-                             RangeBoundary::OverflowedMaxSmi());
-      }
+      Range::Add(left_range, right_range, &min, &max, left_defn);
       break;
-
     case Token::kSUB:
-      if (!SymbolicSub(left_min, right_range->max(), &min)) {
-        min =
-          RangeBoundary::Sub(Range::ConstantMin(left_range),
-                             Range::ConstantMax(right_range),
-                             RangeBoundary::OverflowedMinSmi());
-      }
-
-      if (!SymbolicSub(left_max, right_range->min(), &max)) {
-        max =
-          RangeBoundary::Sub(Range::ConstantMax(left_range),
-                             Range::ConstantMin(right_range),
-                             RangeBoundary::OverflowedMaxSmi());
+      Range::Sub(left_range, right_range, &min, &max, left_defn);
+      break;
+    case Token::kMUL: {
+      if (!Range::Mul(left_range, right_range, &min, &max)) {
+        return NULL;
       }
       break;
-
-    case Token::kMUL: {
-      const int64_t left_max = ConstantAbsMax(left_range);
-      const int64_t right_max = ConstantAbsMax(right_range);
-      if ((left_max < 0x7FFFFFFF) && (right_max < 0x7FFFFFFF)) {
-        // Product of left and right max values stays in 64 bit range.
-        const int64_t result_max = left_max * right_max;
-        if (Smi::IsValid64(result_max) && Smi::IsValid64(-result_max)) {
-          const intptr_t r_min =
-              OnlyPositiveOrZero(left_range, right_range) ? 0 : -result_max;
-          min = RangeBoundary::FromConstant(r_min);
-          const intptr_t r_max =
-              OnlyNegativeOrZero(left_range, right_range) ? 0 : result_max;
-          max = RangeBoundary::FromConstant(r_max);
-          break;
-        }
-      }
-      if (range_ == NULL) {
-        range_ = Range::Unknown();
-      }
-      return;
+    }
+    case Token::kSHL: {
+      Range::Shl(left_range, right_range, &min, &max);
+      break;
+    }
+    case Token::kSHR: {
+      Range::Shr(left_range, right_range, &min, &max);
+      break;
     }
     case Token::kBIT_AND:
-      if (Range::ConstantMin(right_range).value() >= 0) {
-        min = RangeBoundary::FromConstant(0);
-        max = Range::ConstantMax(right_range);
-        break;
+      if (!Range::And(left_range, right_range, &min, &max)) {
+        return NULL;
       }
-      if (Range::ConstantMin(left_range).value() >= 0) {
-        min = RangeBoundary::FromConstant(0);
-        max = Range::ConstantMax(left_range);
-        break;
-      }
-
-      if (range_ == NULL) {
-        range_ = Range::Unknown();
-      }
-      return;
-
+      break;
     default:
-      if (range_ == NULL) {
-        range_ = Range::Unknown();
-      }
-      return;
+      return NULL;
+      break;
   }
 
   ASSERT(!min.IsUnknown() && !max.IsUnknown());
-  set_overflow(min.LowerBound().Overflowed() || max.UpperBound().Overflowed());
 
-  if (min.IsConstant()) min.Clamp();
-  if (max.IsConstant()) max.Clamp();
-
-  range_ = new Range(min, max);
-}
-
-
-// Inclusive.
-bool Range::IsWithin(intptr_t min_int, intptr_t max_int) const {
-  if (min().LowerBound().value() < min_int) return false;
-  if (max().UpperBound().value() > max_int) return false;
-  return true;
-}
-
-
-bool Range::Overlaps(intptr_t min_int, intptr_t max_int) const {
-  const intptr_t this_min = min().LowerBound().value();
-  const intptr_t this_max = max().UpperBound().value();
-  if ((this_min <= min_int) && (min_int <= this_max)) return true;
-  if ((this_min <= max_int) && (max_int <= this_max)) return true;
-  if ((min_int < this_min) && (max_int > this_max)) return true;
-  return false;
-}
-
-
-bool Range::IsUnsatisfiable() const {
-  // Constant case: For example [0, -1].
-  if (Range::ConstantMin(this).value() > Range::ConstantMax(this).value()) {
-    return true;
-  }
-  // Symbol case: For example [v+1, v].
-  if (DependOnSameSymbol(min(), max()) && min().offset() > max().offset()) {
-    return true;
-  }
-  return false;
+  return new Range(min, max);
 }
 
 
@@ -3160,24 +3654,32 @@
   }
 
   // Range of the index is not positive. Check can't be redundant.
-  if (Range::ConstantMin(index_range).value() < 0) {
+  if (Range::ConstantMinSmi(index_range).ConstantValue() < 0) {
     return false;
   }
 
   RangeBoundary max = CanonicalizeBoundary(index_range->max(),
-                                           RangeBoundary::OverflowedMaxSmi());
+                                           RangeBoundary::PositiveInfinity());
 
-  if (max.Overflowed()) {
+  if (max.OverflowedSmi()) {
+    return false;
+  }
+
+
+  RangeBoundary max_upper = max.UpperBound();
+  RangeBoundary length_lower = length.LowerBound();
+
+  if (max_upper.OverflowedSmi() || length_lower.OverflowedSmi()) {
     return false;
   }
 
   // Try to compare constant boundaries.
-  if (max.UpperBound().value() < length.LowerBound().value()) {
+  if (max_upper.ConstantValue() < length_lower.ConstantValue()) {
     return true;
   }
 
-  length = CanonicalizeBoundary(length, RangeBoundary::OverflowedMaxSmi());
-  if (length.Overflowed()) {
+  length = CanonicalizeBoundary(length, RangeBoundary::PositiveInfinity());
+  if (length.OverflowedSmi()) {
     return false;
   }
 
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index d813c15..f6b18f5 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -39,233 +39,233 @@
 // See intrinsifier for fingerprint computation.
 #define RECOGNIZED_LIST(V)                                                     \
   V(::, identical, ObjectIdentical, 496869842)                                 \
+  V(ClassID, getID, ClassIDgetID, 1322490980)                                  \
   V(Object, ==, ObjectEquals, 1068471689)                                      \
-  V(Object, Object., ObjectConstructor, 1058615085)                            \
-  V(Object, get:_cid, ObjectCid, 1498751301)                                   \
-  V(_TypedListBase, get:_cid, TypedListBaseCid, 1938244762)                    \
-  V(_List, get:length, ObjectArrayLength, 215183186)                           \
-  V(_List, _List., ObjectArrayConstructor, 176587978)                          \
-  V(_ImmutableList, get:length, ImmutableArrayLength, 578762861)               \
-  V(_TypedList, get:length, TypedDataLength, 26646119)                         \
-  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 272598802)                     \
-  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 831354841)                   \
-  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 1832126257)                  \
-  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1762714698)                \
-  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 48785449)                    \
-  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 1392579206)                \
-  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 185163470)               \
-  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1356392173)              \
-  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1239681356)          \
-  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 163795162)               \
-  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 1793798234)                    \
-  V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 67253374)                    \
-  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 10467750)                    \
-  V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 1596986894)                \
-  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 868037529)                   \
-  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1776345006)                \
-  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1807927533)              \
-  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 399659907)               \
-  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 1612092224)          \
-  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 74799321)                \
-  V(_GrowableList, get:length, GrowableArrayLength, 1654255033)                \
-  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 817119794)            \
-  V(_GrowableList, _setData, GrowableArraySetData, 970836644)                  \
-  V(_GrowableList, _setLength, GrowableArraySetLength, 823005129)              \
-  V(_StringBase, get:length, StringBaseLength, 1483549854)                     \
-  V(_StringBase, get:isEmpty, StringBaseIsEmpty, 1599468763)                   \
-  V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 1958436584)                 \
-  V(_StringBase, [], StringBaseCharAt, 585372763)                              \
-  V(_StringBase, _interpolate, StringBaseInterpolate, 2013078843)              \
-  V(_OneByteString, _setAt, OneByteStringSetAt, 658941003)                     \
-  V(_IntegerImplementation, toDouble, IntegerToDouble, 1947355341)             \
+  V(Object, Object., ObjectConstructor, 1066669787)                            \
+  V(_List, get:length, ObjectArrayLength, 1181352729)                          \
+  V(_List, _List., ObjectArrayConstructor, 1595327584)                         \
+  V(_ImmutableList, get:length, ImmutableArrayLength, 274917727)               \
+  V(_TypedList, get:length, TypedDataLength, 522565357)                        \
+  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 1541411498)                    \
+  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 1032404349)                  \
+  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 381073990)                   \
+  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1142676276)                \
+  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 330269934)                   \
+  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 59490554)                  \
+  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 393003933)               \
+  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1792407200)              \
+  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1338379857)          \
+  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 1469917805)              \
+  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 433348464)                     \
+  V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 149406583)                   \
+  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 805477162)                   \
+  V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 888580944)                 \
+  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 1708248181)                  \
+  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1863152792)                \
+  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1148703855)              \
+  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 972883980)               \
+  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 950522310)           \
+  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1301138078)              \
+  V(_GrowableList, get:length, GrowableArrayLength, 778505107)                 \
+  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 555140075)            \
+  V(_GrowableList, _setData, GrowableArraySetData, 2126927509)                 \
+  V(_GrowableList, _setLength, GrowableArraySetLength, 89389299)               \
+  V(_StringBase, get:length, StringBaseLength, 784399628)                      \
+  V(_StringBase, get:isEmpty, StringBaseIsEmpty, 49873871)                     \
+  V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 397735324)                  \
+  V(_StringBase, [], StringBaseCharAt, 1512210677)                             \
+  V(_StringBase, _interpolate, StringBaseInterpolate, 1758627989)              \
+  V(_OneByteString, _setAt, OneByteStringSetAt, 468605749)                     \
+  V(_IntegerImplementation, toDouble, IntegerToDouble, 1084977108)             \
   V(_IntegerImplementation, _leftShiftWithMask32, IntegerLeftShiftWithMask32,  \
-      2095943661)                                                              \
-  V(_Double, toInt, DoubleToInteger, 1328149975)                               \
-  V(_Double, truncateToDouble, DoubleTruncate, 615732263)                      \
-  V(_Double, roundToDouble, DoubleRound, 622146406)                            \
-  V(_Double, floorToDouble, DoubleFloor, 1614014643)                           \
-  V(_Double, ceilToDouble, DoubleCeil, 277859570)                              \
-  V(_Double, _modulo, DoubleMod, 1443289156)                                   \
-  V(::, sqrt, MathSqrt, 465520247)                                             \
-  V(::, sin, MathSin, 730107143)                                               \
-  V(::, cos, MathCos, 1282146521)                                              \
+      597111055)                                                               \
+  V(_Double, toInt, DoubleToInteger, 1547535151)                               \
+  V(_Double, truncateToDouble, DoubleTruncate, 2117801967)                     \
+  V(_Double, roundToDouble, DoubleRound, 2124216110)                           \
+  V(_Double, floorToDouble, DoubleFloor, 968600699)                            \
+  V(_Double, ceilToDouble, DoubleCeil, 1779929274)                             \
+  V(_Double, _modulo, DoubleMod, 1473971007)                                   \
+  V(::, sqrt, MathSqrt, 101545548)                                             \
+  V(::, sin, MathSin, 1741396147)                                              \
+  V(::, cos, MathCos, 1951197905)                                              \
   V(::, min, MathMin, 1022567780)                                              \
   V(::, max, MathMax, 612058870)                                               \
-  V(::, _doublePow, MathDoublePow, 342259456)                                  \
-  V(Float32x4, Float32x4., Float32x4Constructor, 1314950569)                   \
-  V(Float32x4, Float32x4.zero, Float32x4Zero, 1432281809)                      \
-  V(Float32x4, Float32x4.splat, Float32x4Splat, 1148280442)                    \
+  V(::, _doublePow, MathDoublePow, 823139975)                                  \
+  V(Float32x4, Float32x4., Float32x4Constructor, 1755873079)                   \
+  V(Float32x4, Float32x4.zero, Float32x4Zero, 1494069379)                      \
+  V(Float32x4, Float32x4.splat, Float32x4Splat, 916211464)                     \
   V(Float32x4, Float32x4.fromInt32x4Bits, Float32x4FromInt32x4Bits,            \
-      872145194)                                                               \
-  V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, 1511660322)    \
-  V(_Float32x4, shuffle, Float32x4Shuffle, 1178727105)                         \
-  V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 927956119)                    \
-  V(_Float32x4, get:x, Float32x4ShuffleX, 1351747629)                          \
-  V(_Float32x4, get:y, Float32x4ShuffleY, 217416201)                           \
-  V(_Float32x4, get:z, Float32x4ShuffleZ, 2144953512)                          \
-  V(_Float32x4, get:w, Float32x4ShuffleW, 1447728910)                          \
-  V(_Float32x4, get:signMask, Float32x4GetSignMask, 1198879138)                \
-  V(_Float32x4, _cmpequal, Float32x4Equal, 1944929844)                         \
-  V(_Float32x4, _cmpgt, Float32x4GreaterThan, 499965951)                       \
-  V(_Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, 1003006845)              \
-  V(_Float32x4, _cmplt, Float32x4LessThan, 747070271)                          \
-  V(_Float32x4, _cmplte, Float32x4LessThanOrEqual, 2008368570)                 \
-  V(_Float32x4, _cmpnequal, Float32x4NotEqual, 1038562565)                     \
-  V(_Float32x4, _min, Float32x4Min, 1166664658)                                \
-  V(_Float32x4, _max, Float32x4Max, 343968921)                                 \
-  V(_Float32x4, _scale, Float32x4Scale, 803505531)                             \
-  V(_Float32x4, _sqrt, Float32x4Sqrt, 2092250151)                              \
-  V(_Float32x4, _reciprocalSqrt, Float32x4ReciprocalSqrt, 965252704)           \
-  V(_Float32x4, _reciprocal, Float32x4Reciprocal, 1262202915)                  \
-  V(_Float32x4, _negate, Float32x4Negate, 1203192635)                          \
-  V(_Float32x4, _abs, Float32x4Absolute, 386324188)                            \
-  V(_Float32x4, _clamp, Float32x4Clamp, 1454612345)                            \
-  V(_Float32x4, withX, Float32x4WithX, 795284225)                              \
-  V(_Float32x4, withY, Float32x4WithY, 1806065938)                             \
-  V(_Float32x4, withZ, Float32x4WithZ, 320659034)                              \
-  V(_Float32x4, withW, Float32x4WithW, 1108437255)                             \
-  V(Float64x2, Float64x2., Float64x2Constructor, 1283521526)                   \
-  V(Float64x2, Float64x2.zero, Float64x2Zero, 1971574037)                      \
-  V(Float64x2, Float64x2.splat, Float64x2Splat, 823230813)                     \
-  V(Float64x2, Float64x2.fromFloat32x4, Float64x2FromFloat32x4, 1383666060)    \
-  V(_Float64x2, get:x, Float64x2GetX, 176817227)                               \
-  V(_Float64x2, get:y, Float64x2GetY, 1858031019)                              \
-  V(_Float64x2, _negate, Float64x2Negate, 1345265430)                          \
-  V(_Float64x2, abs, Float64x2Abs, 778551930)                                  \
-  V(_Float64x2, sqrt, Float64x2Sqrt, 591345168)                                \
-  V(_Float64x2, get:signMask, Float64x2GetSignMask, 601579087)                 \
-  V(_Float64x2, scale, Float64x2Scale, 1781090062)                             \
-  V(_Float64x2, withX, Float64x2WithX, 1624377250)                             \
-  V(_Float64x2, withY, Float64x2WithY, 2078610265)                             \
-  V(_Float64x2, min, Float64x2Min, 876488999)                                  \
-  V(_Float64x2, max, Float64x2Max, 389912972)                                  \
-  V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 295910141)                  \
+      640076216)                                                               \
+  V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, 1279591344)    \
+  V(_Float32x4, shuffle, Float32x4Shuffle, 1636488139)                         \
+  V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 597555927)                    \
+  V(_Float32x4, get:x, Float32x4ShuffleX, 384850558)                           \
+  V(_Float32x4, get:y, Float32x4ShuffleY, 1398002778)                          \
+  V(_Float32x4, get:z, Float32x4ShuffleZ, 1178056441)                          \
+  V(_Float32x4, get:w, Float32x4ShuffleW, 480831839)                           \
+  V(_Float32x4, get:signMask, Float32x4GetSignMask, 630761511)                 \
+  V(_Float32x4, _cmpequal, Float32x4Equal, 571062952)                          \
+  V(_Float32x4, _cmpgt, Float32x4GreaterThan, 1613543295)                      \
+  V(_Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, 589402909)               \
+  V(_Float32x4, _cmplt, Float32x4LessThan, 1502332656)                         \
+  V(_Float32x4, _cmplte, Float32x4LessThanOrEqual, 1069848031)                 \
+  V(_Float32x4, _cmpnequal, Float32x4NotEqual, 1334574472)                     \
+  V(_Float32x4, _min, Float32x4Min, 2036349551)                                \
+  V(_Float32x4, _max, Float32x4Max, 571688115)                                 \
+  V(_Float32x4, _scale, Float32x4Scale, 1311297761)                            \
+  V(_Float32x4, _sqrt, Float32x4Sqrt, 1709659395)                              \
+  V(_Float32x4, _reciprocalSqrt, Float32x4ReciprocalSqrt, 2043980962)          \
+  V(_Float32x4, _reciprocal, Float32x4Reciprocal, 739405237)                   \
+  V(_Float32x4, _negate, Float32x4Negate, 445839777)                           \
+  V(_Float32x4, _abs, Float32x4Absolute, 1152777608)                           \
+  V(_Float32x4, _clamp, Float32x4Clamp, 353415442)                             \
+  V(_Float32x4, withX, Float32x4WithX, 1446546696)                             \
+  V(_Float32x4, withY, Float32x4WithY, 309844761)                              \
+  V(_Float32x4, withZ, Float32x4WithZ, 971921505)                              \
+  V(_Float32x4, withW, Float32x4WithW, 1759699726)                             \
+  V(Float64x2, Float64x2., Float64x2Constructor, 1399581872)                   \
+  V(Float64x2, Float64x2.zero, Float64x2Zero, 1836770587)                      \
+  V(Float64x2, Float64x2.splat, Float64x2Splat, 939291159)                     \
+  V(Float64x2, Float64x2.fromFloat32x4, Float64x2FromFloat32x4, 1499726406)    \
+  V(_Float64x2, get:x, Float64x2GetX, 261044094)                               \
+  V(_Float64x2, get:y, Float64x2GetY, 1942257886)                              \
+  V(_Float64x2, _negate, Float64x2Negate, 2133212774)                          \
+  V(_Float64x2, abs, Float64x2Abs, 1224776282)                                 \
+  V(_Float64x2, sqrt, Float64x2Sqrt, 1037569520)                               \
+  V(_Float64x2, get:signMask, Float64x2GetSignMask, 252936800)                 \
+  V(_Float64x2, scale, Float64x2Scale, 1199438744)                             \
+  V(_Float64x2, withX, Float64x2WithX, 1042725932)                             \
+  V(_Float64x2, withY, Float64x2WithY, 1496958947)                             \
+  V(_Float64x2, min, Float64x2Min, 485240583)                                  \
+  V(_Float64x2, max, Float64x2Max, 2146148204)                                 \
+  V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 87082660)                   \
   V(Int32x4, Int32x4.fromFloat32x4Bits, Int32x4FromFloat32x4Bits,              \
-      893850947)                                                               \
-  V(_Int32x4, get:flagX, Int32x4GetFlagX, 729265594)                           \
-  V(_Int32x4, get:flagY, Int32x4GetFlagY, 430870640)                           \
-  V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 1981106287)                          \
-  V(_Int32x4, get:flagW, Int32x4GetFlagW, 629385890)                           \
-  V(_Int32x4, get:signMask, Int32x4GetSignMask, 1598817537)                    \
-  V(_Int32x4, shuffle, Int32x4Shuffle, 599391160)                              \
-  V(_Int32x4, shuffleMix, Int32x4ShuffleMix, 1491641197)                       \
-  V(_Int32x4, select, Int32x4Select, 194269493)                                \
-  V(_Int32x4, withFlagX, Int32x4WithFlagX, 63248661)                           \
-  V(_Int32x4, withFlagY, Int32x4WithFlagY, 1498755850)                         \
-  V(_Int32x4, withFlagZ, Int32x4WithFlagZ, 457856832)                          \
-  V(_Int32x4, withFlagW, Int32x4WithFlagW, 690638779)                          \
-  V(_List, [], ObjectArrayGetIndexed, 675155875)                               \
-  V(_List, []=, ObjectArraySetIndexed, 1228569706)                             \
-  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1768793932)                  \
-  V(_GrowableList, [], GrowableArrayGetIndexed, 1282104248)                    \
-  V(_GrowableList, []=, GrowableArraySetIndexed, 807019110)                    \
-  V(_Float32Array, [], Float32ArrayGetIndexed, 1461569776)                     \
-  V(_Float32Array, []=, Float32ArraySetIndexed, 1318757370)                    \
-  V(_Float64Array, [], Float64ArrayGetIndexed, 1107401598)                     \
-  V(_Float64Array, []=, Float64ArraySetIndexed, 377873481)                     \
-  V(_Int8Array, [], Int8ArrayGetIndexed, 436208801)                            \
-  V(_Int8Array, []=, Int8ArraySetIndexed, 1257450859)                          \
-  V(_Uint8Array, [], Uint8ArrayGetIndexed, 738731818)                          \
-  V(_Uint8Array, []=, Uint8ArraySetIndexed, 1414236073)                        \
-  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 1529176866)           \
-  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 1902969517)          \
-  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 2067666479)         \
-  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 745187964)         \
+      372517418)                                                               \
+  V(_Int32x4, get:flagX, Int32x4GetFlagX, 1077555238)                          \
+  V(_Int32x4, get:flagY, Int32x4GetFlagY, 779160284)                           \
+  V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 181912283)                           \
+  V(_Int32x4, get:flagW, Int32x4GetFlagW, 977675534)                           \
+  V(_Int32x4, get:signMask, Int32x4GetSignMask, 1929271914)                    \
+  V(_Int32x4, shuffle, Int32x4Shuffle, 1870018702)                             \
+  V(_Int32x4, shuffleMix, Int32x4ShuffleMix, 967644870)                        \
+  V(_Int32x4, select, Int32x4Select, 1696037681)                               \
+  V(_Int32x4, withFlagX, Int32x4WithFlagX, 467852789)                          \
+  V(_Int32x4, withFlagY, Int32x4WithFlagY, 1903359978)                         \
+  V(_Int32x4, withFlagZ, Int32x4WithFlagZ, 862460960)                          \
+  V(_Int32x4, withFlagW, Int32x4WithFlagW, 1095242907)                         \
+  V(_List, [], ObjectArrayGetIndexed, 795612476)                               \
+  V(_List, []=, ObjectArraySetIndexed, 1288827575)                             \
+  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1990177341)                  \
+  V(_GrowableList, [], GrowableArrayGetIndexed, 919108233)                     \
+  V(_GrowableList, []=, GrowableArraySetIndexed, 1218649853)                   \
+  V(_Float32Array, [], Float32ArrayGetIndexed, 856653338)                      \
+  V(_Float32Array, []=, Float32ArraySetIndexed, 2086166464)                    \
+  V(_Float64Array, [], Float64ArrayGetIndexed, 1779054297)                     \
+  V(_Float64Array, []=, Float64ArraySetIndexed, 243929230)                     \
+  V(_Int8Array, [], Int8ArrayGetIndexed, 321230586)                            \
+  V(_Int8Array, []=, Int8ArraySetIndexed, 2050598685)                          \
+  V(_Uint8Array, [], Uint8ArrayGetIndexed, 16125140)                           \
+  V(_Uint8Array, []=, Uint8ArraySetIndexed, 2018064553)                        \
+  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 430672063)            \
+  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 821294340)           \
+  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 1678777951)         \
+  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 918478513)         \
   V(_ExternalUint8ClampedArray, [], ExternalUint8ClampedArrayGetIndexed,       \
-    2068189358)                                                                \
+    1346536303)                                                                \
   V(_ExternalUint8ClampedArray, []=, ExternalUint8ClampedArraySetIndexed,      \
-    1251233632)                                                                \
-  V(_Int16Array, [], Int16ArrayGetIndexed, 1428082706)                         \
-  V(_Int16Array, []=, Int16ArraySetIndexed, 266849900)                         \
-  V(_Uint16Array, [], Uint16ArrayGetIndexed, 1050460407)                       \
-  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1895506641)                      \
-  V(_Int32Array, [], Int32ArrayGetIndexed, 1023604903)                         \
-  V(_Int32Array, []=, Int32ArraySetIndexed, 599753059)                         \
-  V(_Uint32Array, [], Uint32ArrayGetIndexed, 1658205989)                       \
-  V(_Uint32Array, []=, Uint32ArraySetIndexed, 1065461643)                      \
-  V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 2137410088)                 \
-  V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 1583018506)                \
-  V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 1911863146)                     \
-  V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 973572811)                     \
-  V(_Float64x2Array, [], Float64x2ArrayGetIndexed, 325873961)                  \
-  V(_Float64x2Array, []=, Float64x2ArraySetIndexed, 2105580462)                \
+    1794849214)                                                                \
+  V(_Int16Array, [], Int16ArrayGetIndexed, 74127855)                           \
+  V(_Int16Array, []=, Int16ArraySetIndexed, 1610252345)                        \
+  V(_Uint16Array, [], Uint16ArrayGetIndexed, 470411953)                        \
+  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1648929040)                      \
+  V(_Int32Array, [], Int32ArrayGetIndexed, 203101370)                          \
+  V(_Int32Array, []=, Int32ArraySetIndexed, 338968571)                         \
+  V(_Uint32Array, [], Uint32ArrayGetIndexed, 1640672852)                       \
+  V(_Uint32Array, []=, Uint32ArraySetIndexed, 1472976717)                      \
+  V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 1466627059)                 \
+  V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 2141660076)                \
+  V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 818792056)                      \
+  V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 1021474038)                    \
+  V(_Float64x2Array, [], Float64x2ArrayGetIndexed, 288114492)                  \
+  V(_Float64x2Array, []=, Float64x2ArraySetIndexed, 941746736)                 \
 
 
 // A list of core function that should always be inlined.
 #define INLINE_WHITE_LIST(V)                                                   \
-  V(_List, get:length, ObjectArrayLength, 215183186)                           \
-  V(_ImmutableList, get:length, ImmutableArrayLength, 578762861)               \
-  V(_TypedList, get:length, TypedDataLength, 26646119)                         \
-  V(_GrowableList, get:length, GrowableArrayLength, 1654255033)                \
-  V(_StringBase, get:length, StringBaseLength, 1483549854)                     \
-  V(ListIterator, moveNext, ListIteratorMoveNext, 2062984847)                  \
-  V(_GrowableList, get:iterator, GrowableArrayIterator, 1155241039)            \
-  V(_GrowableList, forEach, GrowableArrayForEach, 195359970)                   \
-  V(_List, [], ObjectArrayGetIndexed, 675155875)                               \
-  V(_List, []=, ObjectArraySetIndexed, 1228569706)                             \
-  V(_List, get:isEmpty, ObjectArrayIsEmpty, 1082804442)                        \
-  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1768793932)                  \
-  V(_GrowableList, [], GrowableArrayGetIndexed, 1282104248)                    \
-  V(_GrowableList, []=, GrowableArraySetIndexed, 807019110)                    \
-  V(_Float32Array, [], Float32ArrayGetIndexed, 1461569776)                     \
-  V(_Float32Array, []=, Float32ArraySetIndexed, 1318757370)                    \
-  V(_Float64Array, [], Float64ArrayGetIndexed, 1107401598)                     \
-  V(_Float64Array, []=, Float64ArraySetIndexed, 377873481)                     \
-  V(_Int8Array, [], Int8ArrayGetIndexed, 436208801)                            \
-  V(_Int8Array, []=, Int8ArraySetIndexed, 1257450859)                          \
-  V(_Uint8Array, [], Uint8ArrayGetIndexed, 738731818)                          \
-  V(_Uint8Array, []=, Uint8ArraySetIndexed, 1414236073)                        \
-  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 1529176866)           \
-  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 1902969517)          \
-  V(_Uint16Array, [], Uint16ArrayGetIndexed, 1050460407)                       \
-  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1895506641)                      \
-  V(_Int16Array, [], Int16ArrayGetIndexed, 1428082706)                         \
-  V(_Int16Array, []=, Int16ArraySetIndexed, 266849900)                         \
-  V(_Int32Array, [], Int32ArrayGetIndexed, 1023604903)                         \
-  V(_Int32Array, []=, Int32ArraySetIndexed, 599753059)                         \
-  V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 250795553)                  \
-  V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 533993880)                 \
-  V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 530738523)                    \
-  V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 1513635170)                  \
-  V(::, asin, MathASin, 1528431637)                                            \
-  V(::, acos, MathACos, 1558635398)                                            \
-  V(::, atan, MathATan, 209476605)                                             \
-  V(::, atan2, MathATan2, 2059468649)                                          \
-  V(::, cos, MathCos, 1282146521)                                              \
-  V(::, exp, MathExp, 1951779581)                                              \
-  V(::, log, MathLog, 255699484)                                               \
+  V(Object, ==, ObjectEquals, 1068471689)                                      \
+  V(_List, get:length, ObjectArrayLength, 1181352729)                          \
+  V(_ImmutableList, get:length, ImmutableArrayLength, 274917727)               \
+  V(_TypedList, get:length, TypedDataLength, 522565357)                        \
+  V(_GrowableList, get:length, GrowableArrayLength, 778505107)                 \
+  V(_StringBase, get:length, StringBaseLength, 784399628)                      \
+  V(ListIterator, moveNext, ListIteratorMoveNext, 210829138)                   \
+  V(_GrowableList, get:iterator, GrowableArrayIterator, 1812933946)            \
+  V(_GrowableList, forEach, GrowableArrayForEach, 2085943947)                  \
+  V(_List, [], ObjectArrayGetIndexed, 795612476)                               \
+  V(_List, []=, ObjectArraySetIndexed, 1288827575)                             \
+  V(_List, get:isEmpty, ObjectArrayIsEmpty, 2130247737)                        \
+  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1990177341)                  \
+  V(_GrowableList, [], GrowableArrayGetIndexed, 919108233)                     \
+  V(_GrowableList, []=, GrowableArraySetIndexed, 1218649853)                   \
+  V(_Float32Array, [], Float32ArrayGetIndexed, 856653338)                      \
+  V(_Float32Array, []=, Float32ArraySetIndexed, 2086166464)                    \
+  V(_Float64Array, [], Float64ArrayGetIndexed, 1779054297)                     \
+  V(_Float64Array, []=, Float64ArraySetIndexed, 243929230)                     \
+  V(_Int8Array, [], Int8ArrayGetIndexed, 321230586)                            \
+  V(_Int8Array, []=, Int8ArraySetIndexed, 2050598685)                          \
+  V(_Uint8Array, [], Uint8ArrayGetIndexed, 16125140)                           \
+  V(_Uint8Array, []=, Uint8ArraySetIndexed, 2018064553)                        \
+  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 430672063)            \
+  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 821294340)           \
+  V(_Uint16Array, [], Uint16ArrayGetIndexed, 470411953)                        \
+  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1648929040)                      \
+  V(_Int16Array, [], Int16ArrayGetIndexed, 74127855)                           \
+  V(_Int16Array, []=, Int16ArraySetIndexed, 1610252345)                        \
+  V(_Int32Array, [], Int32ArrayGetIndexed, 203101370)                          \
+  V(_Int32Array, []=, Int32ArraySetIndexed, 338968571)                         \
+  V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 1543480955)                 \
+  V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 936729641)                 \
+  V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 1898018934)                   \
+  V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 111684506)                   \
+  V(::, asin, MathASin, 1651042633)                                            \
+  V(::, acos, MathACos, 1139647090)                                            \
+  V(::, atan, MathATan, 1668754384)                                            \
+  V(::, atan2, MathATan2, 1845649456)                                          \
+  V(::, cos, MathCos, 1951197905)                                              \
+  V(::, exp, MathExp, 1809210829)                                              \
+  V(::, log, MathLog, 1620336448)                                              \
   V(::, max, MathMax, 612058870)                                               \
   V(::, min, MathMin, 1022567780)                                              \
-  V(::, pow, MathPow, 1880071137)                                              \
-  V(::, sin, MathSin, 730107143)                                               \
-  V(::, sqrt, MathSqrt, 465520247)                                             \
-  V(::, tan, MathTan, 2077846426)                                              \
+  V(::, pow, MathPow, 930962530)                                               \
+  V(::, sin, MathSin, 1741396147)                                              \
+  V(::, sqrt, MathSqrt, 101545548)                                             \
+  V(::, tan, MathTan, 982072809)                                               \
 
 
 // A list of core functions that internally dispatch based on received id.
 #define POLYMORPHIC_TARGET_LIST(V)                                             \
-  V(_StringBase, [], StringBaseCharAt, 585372763)                              \
-  V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 1958436584)                 \
-  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 272598802)                     \
-  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 831354841)                   \
-  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 1832126257)                  \
-  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1762714698)                \
-  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 48785449)                    \
-  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 1392579206)                \
-  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 185163470)               \
-  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1356392173)              \
-  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1239681356)          \
-  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 163795162)               \
-  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 1793798234)                    \
-  V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 67253374)                     \
-  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 10467750)                    \
-  V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 1596986894)                 \
-  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 868037529)                   \
-  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1776345006)                \
-  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1807927533)              \
-  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 399659907)               \
-  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 1612092224)          \
-  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 74799321)                \
+  V(_StringBase, [], StringBaseCharAt, 1512210677)                             \
+  V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 397735324)                  \
+  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 1541411498)                    \
+  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 1032404349)                  \
+  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 381073990)                   \
+  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1142676276)                \
+  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 330269934)                   \
+  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 59490554)                  \
+  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 393003933)               \
+  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1792407200)              \
+  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1338379857)          \
+  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 1469917805)              \
+  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 433348464)                     \
+  V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 149406583)                    \
+  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 805477162)                   \
+  V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 888580944)                  \
+  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 1708248181)                  \
+  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1863152792)                \
+  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1148703855)              \
+  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 972883980)               \
+  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 950522310)           \
+  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1301138078)              \
 
 // Class that recognizes the name and owner of a function and returns the
 // corresponding enum. See RECOGNIZED_LIST above for list of recognizable
@@ -444,6 +444,8 @@
 // another compile type.
 class ConstrainedCompileType : public ZoneCompileType {
  public:
+  virtual ~ConstrainedCompileType() { }
+
   // Recompute compile type.
   virtual void Update() = 0;
 
@@ -821,6 +823,8 @@
         locs_(NULL),
         place_id_(kNoPlaceId) { }
 
+  virtual ~Instruction() { }
+
   virtual Tag tag() const = 0;
 
   intptr_t deopt_id() const {
@@ -828,7 +832,8 @@
     return deopt_id_;
   }
 
-  ICData* GetICData(const Array& ic_data_array) const;
+  const ICData* GetICData(
+      const ZoneGrowableArray<const ICData*>& ic_data_array) const;
 
   bool IsBlockEntry() { return (AsBlockEntry() != NULL); }
   virtual BlockEntryInstr* AsBlockEntry() { return NULL; }
@@ -1800,6 +1805,16 @@
     return ZoneCompileType::Wrap(ComputeType());
   }
 
+  // Does this define a mint?
+  bool IsMintDefinition() {
+    return (Type()->ToCid() == kMintCid) ||
+            IsBinaryMintOp() ||
+            IsUnaryMintOp() ||
+            IsShiftMintOp() ||
+            IsBoxInteger() ||
+            IsUnboxInteger();
+  }
+
   // Compute compile type for this definition. It is safe to use this
   // approximation even before type propagator was run (e.g. during graph
   // building).
@@ -1833,6 +1848,15 @@
 
   Value* input_use_list() const { return input_use_list_; }
   void set_input_use_list(Value* head) { input_use_list_ = head; }
+  intptr_t InputUseListLength() const {
+    intptr_t length = 0;
+    Value* use = input_use_list_;
+    while (use != NULL) {
+      length++;
+      use = use->next_use();
+    }
+    return length;
+  }
 
   Value* env_use_list() const { return env_use_list_; }
   void set_env_use_list(Value* head) { env_use_list_ = head; }
@@ -2484,7 +2508,18 @@
 
 class RangeBoundary : public ValueObject {
  public:
-  enum Kind { kUnknown, kSymbol, kConstant };
+  enum Kind {
+    kUnknown,
+    kNegativeInfinity,
+    kPositiveInfinity,
+    kSymbol,
+    kConstant,
+  };
+
+  enum RangeSize {
+    kRangeBoundarySmi,
+    kRangeBoundaryInt64,
+  };
 
   RangeBoundary() : kind_(kUnknown), value_(0), offset_(0) { }
 
@@ -2494,6 +2529,9 @@
         value_(other.value_),
         offset_(other.offset_) { }
 
+  explicit RangeBoundary(int64_t val)
+      : kind_(kConstant), value_(val), offset_(0) { }
+
   RangeBoundary& operator=(const RangeBoundary& other) {
     kind_ = other.kind_;
     value_ = other.value_;
@@ -2501,70 +2539,142 @@
     return *this;
   }
 
-  static RangeBoundary FromConstant(intptr_t val) {
-    return RangeBoundary(kConstant, val, 0);
+  static const int64_t kMin = kMinInt64;
+  static const int64_t kMax = kMaxInt64;
+
+  // Construct a RangeBoundary for a constant value.
+  static RangeBoundary FromConstant(int64_t val) {
+    return RangeBoundary(val);
   }
 
-  static RangeBoundary FromDefinition(Definition* defn, intptr_t offs = 0);
+  // Construct a RangeBoundary for -inf.
+  static RangeBoundary NegativeInfinity() {
+    return RangeBoundary(kNegativeInfinity, 0, 0);
+  }
 
+  // Construct a RangeBoundary for +inf.
+  static RangeBoundary PositiveInfinity() {
+    return RangeBoundary(kPositiveInfinity, 0, 0);
+  }
+
+  // Construct a RangeBoundary from a definition and offset.
+  static RangeBoundary FromDefinition(Definition* defn, int64_t offs = 0);
+
+  // Construct a RangeBoundary for the constant MinSmi value.
   static RangeBoundary MinSmi() {
     return FromConstant(Smi::kMinValue);
   }
 
+  // Construct a RangeBoundary for the constant MaxSmi value.
   static RangeBoundary MaxSmi() {
     return FromConstant(Smi::kMaxValue);
   }
 
-  static const intptr_t kMinusInfinity = Smi::kMinValue - 1;
-  static const intptr_t kPlusInfinity = Smi::kMaxValue + 1;
-
-  static RangeBoundary OverflowedMinSmi() {
-    return FromConstant(Smi::kMinValue - 1);
+    // Construct a RangeBoundary for the constant kMin value.
+  static RangeBoundary MinConstant() {
+    return FromConstant(kMin);
   }
 
-  static RangeBoundary OverflowedMaxSmi() {
-    return FromConstant(Smi::kMaxValue + 1);
+  // Construct a RangeBoundary for the constant kMax value.
+  static RangeBoundary MaxConstant() {
+    return FromConstant(kMax);
   }
 
-  static RangeBoundary Min(RangeBoundary a, RangeBoundary b);
+  // Calculate the minimum of a and b within the given range.
+  static RangeBoundary Min(RangeBoundary a, RangeBoundary b, RangeSize size);
+  static RangeBoundary Max(RangeBoundary a, RangeBoundary b, RangeSize size);
 
-  static RangeBoundary Max(RangeBoundary a, RangeBoundary b);
-
-  bool Overflowed() const {
-    return IsConstant() && !Smi::IsValid(value());
+  // Returns true when this is a constant that is outside of Smi range.
+  bool OverflowedSmi() const {
+    return (IsConstant() && !Smi::IsValid(ConstantValue())) || IsInfinity();
   }
 
-  RangeBoundary Clamp() const {
-    if (IsConstant()) {
-      if (value() < Smi::kMinValue) return MinSmi();
-      if (value() > Smi::kMaxValue) return MaxSmi();
+  // Returns true if this outside mint range.
+  bool OverflowedMint() const {
+    return IsInfinity();
+  }
+
+  // -/+ infinity are clamped to MinConstant/MaxConstant of the given type.
+  RangeBoundary Clamp(RangeSize size) const {
+    if (IsNegativeInfinity()) {
+      return (size == kRangeBoundaryInt64) ? MinConstant() : MinSmi();
     }
+    if (IsPositiveInfinity()) {
+      return (size == kRangeBoundaryInt64) ? MaxConstant() : MaxSmi();
+    }
+    if ((size == kRangeBoundarySmi) && IsConstant()) {
+      if (ConstantValue() <= Smi::kMinValue) {
+        return MinSmi();
+      }
+      if (ConstantValue() >= Smi::kMaxValue) {
+        return MaxSmi();
+      }
+    }
+    // If this range is a symbolic range, we do not clamp it.
+    // This could lead to some imprecision later on.
     return *this;
   }
 
-  bool Equals(const RangeBoundary& other) const {
-    return (kind_ == other.kind_) && (value_ == other.value_);
+
+  bool IsSmiMinimumOrBelow() const {
+    return IsNegativeInfinity() ||
+           (IsConstant() && (ConstantValue() <= Smi::kMinValue));
   }
 
+  bool IsSmiMaximumOrAbove() const {
+    return IsPositiveInfinity() ||
+           (IsConstant() && (ConstantValue() >= Smi::kMaxValue));
+  }
+
+  bool IsMinimumOrBelow() const {
+    return IsNegativeInfinity() || (IsConstant() && (ConstantValue() == kMin));
+  }
+
+  bool IsMaximumOrAbove() const {
+    return IsPositiveInfinity() || (IsConstant() && (ConstantValue() == kMax));
+  }
+
+  intptr_t kind() const {
+    return kind_;
+  }
+
+  // Kind tests.
   bool IsUnknown() const { return kind_ == kUnknown; }
   bool IsConstant() const { return kind_ == kConstant; }
   bool IsSymbol() const { return kind_ == kSymbol; }
-
-  intptr_t value() const {
-    ASSERT(IsConstant());
-    return value_;
+  bool IsNegativeInfinity() const { return kind_ == kNegativeInfinity; }
+  bool IsPositiveInfinity() const { return kind_ == kPositiveInfinity; }
+  bool IsInfinity() const {
+    return IsNegativeInfinity() || IsPositiveInfinity();
+  }
+  bool IsConstantOrInfinity() const {
+    return IsConstant() || IsInfinity();
   }
 
+  // Returns the value of a kConstant RangeBoundary.
+  int64_t ConstantValue() const;
+
+  // Returns the Definition associated with a kSymbol RangeBoundary.
   Definition* symbol() const {
     ASSERT(IsSymbol());
     return reinterpret_cast<Definition*>(value_);
   }
 
-  intptr_t offset() const {
+  // Offset from symbol.
+  int64_t offset() const {
     return offset_;
   }
 
+  // Computes the LowerBound of this. Three cases:
+  // IsInfinity() -> NegativeInfinity().
+  // IsConstant() -> value().
+  // IsSymbol() -> lower bound computed from definition + offset.
   RangeBoundary LowerBound() const;
+
+  // Computes the UpperBound of this. Three cases:
+  // IsInfinity() -> PositiveInfinity().
+  // IsConstant() -> value().
+  // IsSymbol() -> upper bound computed from definition + offset.
   RangeBoundary UpperBound() const;
 
   void PrintTo(BufferFormatter* f) const;
@@ -2572,35 +2682,49 @@
 
   static RangeBoundary Add(const RangeBoundary& a,
                            const RangeBoundary& b,
-                           const RangeBoundary& overflow) {
-    ASSERT(a.IsConstant() && b.IsConstant());
-
-    intptr_t result = a.value() + b.value();
-    if (!Smi::IsValid(result)) {
-      return overflow;
-    }
-    return RangeBoundary::FromConstant(result);
-  }
+                           const RangeBoundary& overflow);
 
   static RangeBoundary Sub(const RangeBoundary& a,
                            const RangeBoundary& b,
-                           const RangeBoundary& overflow) {
-    ASSERT(a.IsConstant() && b.IsConstant());
+                           const RangeBoundary& overflow);
 
-    intptr_t result = a.value() - b.value();
-    if (!Smi::IsValid(result)) {
-      return overflow;
-    }
-    return RangeBoundary::FromConstant(result);
+  static RangeBoundary Shl(const RangeBoundary& value_boundary,
+                           int64_t shift_count,
+                           const RangeBoundary& overflow);
+
+  static RangeBoundary Shr(const RangeBoundary& value_boundary,
+                           intptr_t shift_count) {
+    ASSERT(value_boundary.IsConstant());
+    ASSERT(shift_count >= 0);
+    int64_t value = static_cast<int64_t>(value_boundary.ConstantValue());
+    int64_t result = value >> shift_count;
+    return RangeBoundary(result);
   }
 
+  // Attempts to calculate a + b when:
+  // a is a symbol and b is a constant OR
+  // a is a constant and b is a symbol
+  // returns true if it succeeds, output is in result.
+  static bool SymbolicAdd(const RangeBoundary& a,
+                          const RangeBoundary& b,
+                          RangeBoundary* result);
+
+  // Attempts to calculate a - b when:
+  // a is a symbol and b is a constant
+  // returns true if it succeeds, output is in result.
+  static bool SymbolicSub(const RangeBoundary& a,
+                          const RangeBoundary& b,
+                          RangeBoundary* result);
+
+  bool Equals(const RangeBoundary& other) const;
+
  private:
-  RangeBoundary(Kind kind, intptr_t value, intptr_t offset)
+  RangeBoundary(Kind kind, int64_t value, int64_t offset)
       : kind_(kind), value_(value), offset_(offset) { }
 
   Kind kind_;
-  intptr_t value_;
-  intptr_t offset_;
+  int64_t value_;
+  int64_t offset_;
 };
 
 
@@ -2609,37 +2733,119 @@
   Range(RangeBoundary min, RangeBoundary max) : min_(min), max_(max) { }
 
   static Range* Unknown() {
-    return new Range(RangeBoundary::MinSmi(), RangeBoundary::MaxSmi());
+    return new Range(RangeBoundary::MinConstant(),
+                     RangeBoundary::MaxConstant());
+  }
+
+  static Range* UnknownSmi() {
+    return new Range(RangeBoundary::MinSmi(),
+                     RangeBoundary::MaxSmi());
   }
 
   void PrintTo(BufferFormatter* f) const;
-  static const char* ToCString(Range* range);
+  static const char* ToCString(const Range* range);
 
   const RangeBoundary& min() const { return min_; }
   const RangeBoundary& max() const { return max_; }
 
-  bool Equals(Range* other) {
-    return min_.Equals(other->min_) && max_.Equals(other->max_);
+  static RangeBoundary ConstantMinSmi(const Range* range) {
+    if (range == NULL) {
+      return RangeBoundary::MinSmi();
+    }
+    return range->min().LowerBound().Clamp(RangeBoundary::kRangeBoundarySmi);
+  }
+
+  static RangeBoundary ConstantMaxSmi(const Range* range) {
+    if (range == NULL) {
+      return RangeBoundary::MaxSmi();
+    }
+    return range->max().UpperBound().Clamp(RangeBoundary::kRangeBoundarySmi);
   }
 
   static RangeBoundary ConstantMin(const Range* range) {
-    if (range == NULL) return RangeBoundary::MinSmi();
-    return range->min().LowerBound().Clamp();
+    if (range == NULL) {
+      return RangeBoundary::MinConstant();
+    }
+    return range->min().LowerBound().Clamp(RangeBoundary::kRangeBoundaryInt64);
   }
 
   static RangeBoundary ConstantMax(const Range* range) {
-    if (range == NULL) return RangeBoundary::MaxSmi();
-    return range->max().UpperBound().Clamp();
+    if (range == NULL) {
+      return RangeBoundary::MaxConstant();
+    }
+    return range->max().UpperBound().Clamp(RangeBoundary::kRangeBoundaryInt64);
   }
 
-  // Inclusive.
-  bool IsWithin(intptr_t min_int, intptr_t max_int) const;
+  // [0, +inf]
+  bool IsPositive() const;
+
+  // [-inf, val].
+  bool OnlyLessThanOrEqualTo(int64_t val) const;
+
+  // [val, +inf].
+  bool OnlyGreaterThanOrEqualTo(int64_t val) const;
 
   // Inclusive.
-  bool Overlaps(intptr_t min_int, intptr_t max_int) const;
+  bool IsWithin(int64_t min_int, int64_t max_int) const;
+
+  // Inclusive.
+  bool Overlaps(int64_t min_int, int64_t max_int) const;
 
   bool IsUnsatisfiable() const;
 
+  bool IsFinite() const {
+    return !min_.IsInfinity() && !max_.IsInfinity();
+  }
+
+  // Clamp this to be within size.
+  void Clamp(RangeBoundary::RangeSize size);
+
+  static void Add(const Range* left_range,
+                  const Range* right_range,
+                  RangeBoundary* min,
+                  RangeBoundary* max,
+                  Definition* left_defn);
+
+  static void Sub(const Range* left_range,
+                  const Range* right_range,
+                  RangeBoundary* min,
+                  RangeBoundary* max,
+                  Definition* left_defn);
+
+  static bool Mul(const Range* left_range,
+                  const Range* right_range,
+                  RangeBoundary* min,
+                  RangeBoundary* max);
+  static void Shr(const Range* left_range,
+                  const Range* right_range,
+                  RangeBoundary* min,
+                  RangeBoundary* max);
+
+  static void Shl(const Range* left_range,
+                  const Range* right_range,
+                  RangeBoundary* min,
+                  RangeBoundary* max);
+
+  static bool And(const Range* left_range,
+                  const Range* right_range,
+                  RangeBoundary* min,
+                  RangeBoundary* max);
+
+
+  // Both the a and b ranges are >= 0.
+  static bool OnlyPositiveOrZero(const Range& a, const Range& b);
+
+  // Both the a and b ranges are <= 0.
+  static bool OnlyNegativeOrZero(const Range& a, const Range& b);
+
+  // Return the maximum absolute value included in range.
+  static int64_t ConstantAbsMax(const Range* range);
+
+  static Range* BinaryOp(const Token::Kind op,
+                         const Range* left_range,
+                         const Range* right_range,
+                         Definition* left_defn);
+
  private:
   RangeBoundary min_;
   RangeBoundary max_;
@@ -2919,7 +3125,7 @@
                     ZoneGrowableArray<PushArgumentInstr*>* arguments,
                     const Array& argument_names,
                     intptr_t checked_argument_count,
-                    const Array& ic_data_array)
+                    const ZoneGrowableArray<const ICData*>& ic_data_array)
       : ic_data_(GetICData(ic_data_array)),
         token_pos_(token_pos),
         function_name_(function_name),
@@ -3399,7 +3605,7 @@
                   const Function& function,
                   const Array& argument_names,
                   ZoneGrowableArray<PushArgumentInstr*>* arguments,
-                  const Array& ic_data_array)
+                  const ZoneGrowableArray<const ICData*>& ic_data_array)
       : ic_data_(GetICData(ic_data_array)),
         token_pos_(token_pos),
         function_(function),
@@ -4891,12 +5097,15 @@
 
 class BoxIntegerInstr : public TemplateDefinition<1> {
  public:
-  explicit BoxIntegerInstr(Value* value) {
+  explicit BoxIntegerInstr(Value* value) : is_smi_(false) {
     SetInputAt(0, value);
   }
 
   Value* value() const { return inputs_[0]; }
 
+  bool is_smi() const { return is_smi_; }
+  void set_is_smi(bool is_smi) { is_smi_ = is_smi; }
+
   virtual bool CanDeoptimize() const { return false; }
 
   virtual intptr_t DeoptimizationTarget() const {
@@ -4910,6 +5119,9 @@
 
   DECLARE_INSTRUCTION(BoxInteger)
   virtual CompileType ComputeType() const;
+  virtual bool RecomputeType();
+
+  virtual void InferRange();
 
   virtual bool AllowsCSE() const { return true; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
@@ -4919,6 +5131,8 @@
   virtual bool MayThrow() const { return false; }
 
  private:
+  bool is_smi_;
+
   DISALLOW_COPY_AND_ASSIGN(BoxIntegerInstr);
 };
 
@@ -5079,6 +5293,8 @@
   }
 
 
+  virtual void InferRange();
+
   DECLARE_INSTRUCTION(UnboxInteger)
   virtual CompileType ComputeType() const;
 
@@ -6868,6 +7084,8 @@
     return deopt_id_;
   }
 
+  virtual void InferRange();
+
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
   DECLARE_INSTRUCTION(BinaryMintOp)
@@ -6930,6 +7148,8 @@
     return deopt_id_;
   }
 
+  virtual void InferRange();
+
   DECLARE_INSTRUCTION(ShiftMintOp)
 
   virtual bool AllowsCSE() const { return true; }
@@ -7028,7 +7248,7 @@
   void set_overflow(bool overflow) { overflow_ = overflow; }
 
   void set_is_truncating(bool value) { is_truncating_ = value; }
-  bool is_truncating() const { return is_truncating_; }
+  bool IsTruncating() const { return is_truncating_ || !overflow_; }
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 5bdae56..40b6aa2 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -9,6 +9,7 @@
 
 #include "vm/cpu.h"
 #include "vm/dart_entry.h"
+#include "vm/flow_graph.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -437,18 +438,16 @@
                          Register value_cid_reg,
                          Register value_reg,
                          Label* value_is_smi = NULL) {
-  Label done;
   if (value_is_smi == NULL) {
     __ mov(value_cid_reg, Operand(kSmiCid));
   }
   __ tst(value_reg, Operand(kSmiTagMask));
   if (value_is_smi == NULL) {
-    __ b(&done, EQ);
+    __ LoadClassId(value_cid_reg, value_reg, NE);
   } else {
     __ b(value_is_smi, EQ);
+    __ LoadClassId(value_cid_reg, value_reg);
   }
-  __ LoadClassId(value_cid_reg, value_reg);
-  __ Bind(&done);
 }
 
 
@@ -926,8 +925,11 @@
   // this is a redirection address that forces the simulator to call
   // into the runtime system.
   uword entry = reinterpret_cast<uword>(native_c_function());
+  const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
+  const bool is_leaf_call =
+    (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
   const ExternalLabel* stub_entry;
-  if (is_bootstrap_native()) {
+  if (is_bootstrap_native() || is_leaf_call) {
     stub_entry = &StubCode::CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
     entry = Simulator::RedirectExternalReference(
@@ -946,7 +948,7 @@
 #endif
   }
   __ LoadImmediate(R5, entry);
-  __ LoadImmediate(R1, NativeArguments::ComputeArgcTag(function()));
+  __ LoadImmediate(R1, argc_tag);
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -1020,7 +1022,8 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   ASSERT(locs()->out(0).reg() == R0);
 }
 
@@ -1055,15 +1058,7 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register object = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  Label load, done;
-  __ tst(object, Operand(kSmiTagMask));
-  __ b(&load, NE);
-  __ LoadImmediate(result, Smi::RawValue(kSmiCid));
-  __ b(&done);
-  __ Bind(&load);
-  __ LoadClassId(result, object);
-  __ SmiTag(result);
-  __ Bind(&done);
+  __ LoadTaggedClassIdMayBeSmi(result, object);
 }
 
 
@@ -1897,8 +1892,8 @@
           ((IsPotentialUnboxedStore()) ? 3 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          !field().IsNull() &&
-          ((field().guarded_cid() == kIllegalCid) || is_initialization_)
+          ((IsUnboxedStore() && opt && is_initialization_) ||
+           IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
 
@@ -1961,9 +1956,7 @@
                      temp2);
       __ Bind(slow_path->exit_label());
       __ MoveRegister(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
     } else {
       __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes_));
     }
@@ -2048,9 +2041,7 @@
                      temp2);
       __ Bind(slow_path->exit_label());
       __ MoveRegister(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
       __ Bind(&copy_double);
       __ CopyDoubleField(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
@@ -2074,9 +2065,7 @@
                      temp2);
       __ Bind(slow_path->exit_label());
       __ MoveRegister(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
       __ Bind(&copy_float32x4);
       __ CopyFloat32x4Field(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
@@ -2100,9 +2089,7 @@
                      temp2);
       __ Bind(slow_path->exit_label());
       __ MoveRegister(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
       __ Bind(&copy_float64x2);
       __ CopyFloat64x2Field(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
@@ -2113,20 +2100,21 @@
 
   if (ShouldEmitStoreBarrier()) {
     const Register value_reg = locs()->in(1).reg();
-    __ StoreIntoObject(instance_reg,
-                       FieldAddress(instance_reg, offset_in_bytes_),
-                       value_reg,
-                       CanValueBeSmi());
+    __ StoreIntoObjectOffset(instance_reg,
+                             offset_in_bytes_,
+                             value_reg,
+                             CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectNoBarrier(
+      __ StoreIntoObjectNoBarrierOffset(
           instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_),
+          offset_in_bytes_,
           locs()->in(1).constant());
     } else {
       const Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectNoBarrier(instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_), value_reg);
+      __ StoreIntoObjectNoBarrierOffset(instance_reg,
+                                        offset_in_bytes_,
+                                        value_reg);
     }
   }
   __ Bind(&skip_store);
@@ -2869,7 +2857,7 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->is_truncating();
+  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
@@ -2940,8 +2928,7 @@
   if (is_truncating) {
     if (right_needs_check) {
       const bool right_may_be_negative =
-          (right_range == NULL) ||
-          !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+          (right_range == NULL) || !right_range->IsPositive();
       if (right_may_be_negative) {
         ASSERT(shift_left->CanDeoptimize());
         __ cmp(right, Operand(0));
@@ -2989,7 +2976,7 @@
     }
   } else if (op_kind() == Token::kMOD) {
     num_temps = 2;
-  } else if (((op_kind() == Token::kSHL) && !is_truncating()) ||
+  } else if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
              (op_kind() == Token::kSHR)) {
     num_temps = 1;
   } else if ((op_kind() == Token::kMUL) &&
@@ -3022,7 +3009,7 @@
   }
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
-  if (((op_kind() == Token::kSHL) && !is_truncating()) ||
+  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
   }
@@ -3044,7 +3031,6 @@
     return;
   }
 
-  ASSERT(!is_truncating());
   const Register left = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   Label* deopt = NULL;
@@ -3328,7 +3314,7 @@
       // sarl operation masks the count to 5 bits.
       const intptr_t kCountLimit = 0x1F;
       if ((right_range == NULL) ||
-          !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
+          !right_range->OnlyLessThanOrEqualTo(kCountLimit)) {
         __ CompareImmediate(IP, kCountLimit);
         __ LoadImmediate(IP, kCountLimit, GT);
       }
@@ -5119,7 +5105,7 @@
   ASSERT(result != value_obj);
   __ LoadDFromOffset(DTMP, value_obj, Double::value_offset() - kHeapObjectTag);
 
-  Label do_call, done;
+  Label done, do_call;
   // First check for NaN. Checking for minint after the conversion doesn't work
   // on ARM because vcvtid gives 0 for NaN.
   __ vcmpd(DTMP, DTMP);
@@ -5132,9 +5118,9 @@
 
   // Check for overflow and that it fits into Smi.
   __ CompareImmediate(result, 0xC0000000);
-  __ b(&do_call, MI);
-  __ SmiTag(result);
-  __ b(&done);
+  __ SmiTag(result, PL);
+  __ b(&done, PL);
+
   __ Bind(&do_call);
   __ Push(value_obj);
   ASSERT(instance_call()->HasICData());
@@ -5148,7 +5134,8 @@
                                target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   __ Bind(&done);
 }
 
@@ -5580,7 +5567,8 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs());
+                                 locs(),
+                                 ICData::Handle());
     return;
   }
 
@@ -5839,14 +5827,18 @@
 LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
+  const intptr_t kNumTemps = is_smi() ? 0 : 1;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs,
                           kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+                          is_smi()
+                              ? LocationSummary::kNoCall
+                              : LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
-  summary->set_temp(0, Location::RequiresRegister());
+  if (!is_smi()) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
@@ -5886,6 +5878,15 @@
 
 
 void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (is_smi()) {
+    PairLocation* value_pair = locs()->in(0).AsPairLocation();
+    Register value_lo = value_pair->At(0).reg();
+    Register out_reg = locs()->out(0).reg();
+    __ mov(out_reg, Operand(value_lo));
+    __ SmiTag(out_reg);
+    return;
+  }
+
   BoxIntegerSlowPath* slow_path = new BoxIntegerSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
   PairLocation* value_pair = locs()->in(0).AsPairLocation();
@@ -6189,7 +6190,7 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (compiler->NeedsEdgeCounter(this)) {
       compiler->EmitEdgeCounter();
     }
     // Add an edge counter.
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index b83da77..c5fb4be 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -8,6 +8,7 @@
 #include "vm/intermediate_language.h"
 
 #include "vm/dart_entry.h"
+#include "vm/flow_graph.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -92,7 +93,7 @@
   __ sub(R2, SP, Operand(FP));
   __ CompareImmediate(R2, fp_sp_dist, PP);
   __ b(&stack_ok, EQ);
-  __ hlt(0);
+  __ brk(0);
   __ Bind(&stack_ok);
 #endif
   __ LeaveDartFrame();
@@ -348,7 +349,7 @@
                                 1,
                                 locs);
   // We should never return here.
-  __ hlt(0);
+  __ brk(0);
   __ Bind(&done);
 }
 
@@ -769,8 +770,11 @@
   // this is a redirection address that forces the simulator to call
   // into the runtime system.
   uword entry = reinterpret_cast<uword>(native_c_function());
+  const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
+  const bool is_leaf_call =
+    (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
   const ExternalLabel* stub_entry;
-  if (is_bootstrap_native()) {
+  if (is_bootstrap_native() || is_leaf_call) {
     stub_entry = &StubCode::CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
     entry = Simulator::RedirectExternalReference(
@@ -789,7 +793,7 @@
 #endif
   }
   __ LoadImmediate(R5, entry, PP);
-  __ LoadImmediate(R1, NativeArguments::ComputeArgcTag(function()), PP);
+  __ LoadImmediate(R1, argc_tag, PP);
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -866,7 +870,8 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   ASSERT(locs()->out(0).reg() == R0);
 }
 
@@ -901,15 +906,7 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register object = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  Label load, done;
-  __ tsti(object, kSmiTagMask);
-  __ b(&load, NE);
-  __ LoadImmediate(result, Smi::RawValue(kSmiCid), PP);
-  __ b(&done);
-  __ Bind(&load);
-  __ LoadClassId(result, object, PP);
-  __ SmiTag(result);
-  __ Bind(&done);
+  __ LoadTaggedClassIdMayBeSmi(result, object);
 }
 
 
@@ -1419,24 +1416,25 @@
   if (emit_full_guard) {
     __ LoadObject(field_reg, Field::ZoneHandle(field().raw()), PP);
 
-    FieldAddress field_cid_operand(field_reg, Field::guarded_cid_offset());
+    FieldAddress field_cid_operand(
+        field_reg, Field::guarded_cid_offset(), kWord);
     FieldAddress field_nullability_operand(
-        field_reg, Field::is_nullable_offset());
+        field_reg, Field::is_nullable_offset(), kWord);
 
     if (value_cid == kDynamicCid) {
       LoadValueCid(compiler, value_cid_reg, value_reg);
       Label skip_length_check;
-      __ ldr(TMP, field_cid_operand);
+      __ ldr(TMP, field_cid_operand, kWord);
       __ CompareRegisters(value_cid_reg, TMP);
       __ b(&ok, EQ);
-      __ ldr(TMP, field_nullability_operand);
+      __ ldr(TMP, field_nullability_operand, kWord);
       __ CompareRegisters(value_cid_reg, TMP);
     } else if (value_cid == kNullCid) {
-      __ ldr(value_cid_reg, field_nullability_operand);
+      __ ldr(value_cid_reg, field_nullability_operand, kWord);
       __ CompareImmediate(value_cid_reg, value_cid, PP);
     } else {
       Label skip_length_check;
-      __ ldr(value_cid_reg, field_cid_operand);
+      __ ldr(value_cid_reg, field_cid_operand, kWord);
       __ CompareImmediate(value_cid_reg, value_cid, PP);
     }
     __ b(&ok, EQ);
@@ -1450,17 +1448,17 @@
     if (!field().needs_length_check()) {
       // Uninitialized field can be handled inline. Check if the
       // field is still unitialized.
-      __ ldr(TMP, field_cid_operand);
+      __ ldr(TMP, field_cid_operand, kWord);
       __ CompareImmediate(TMP, kIllegalCid, PP);
       __ b(fail, NE);
 
       if (value_cid == kDynamicCid) {
-        __ str(value_cid_reg, field_cid_operand);
-        __ str(value_cid_reg, field_nullability_operand);
+        __ str(value_cid_reg, field_cid_operand, kWord);
+        __ str(value_cid_reg, field_nullability_operand, kWord);
       } else {
         __ LoadImmediate(TMP, value_cid, PP);
-        __ str(TMP, field_cid_operand);
-        __ str(TMP, field_nullability_operand);
+        __ str(TMP, field_cid_operand, kWord);
+        __ str(TMP, field_nullability_operand, kWord);
       }
 
       if (deopt == NULL) {
@@ -1473,7 +1471,8 @@
       ASSERT(!compiler->is_optimizing());
       __ Bind(fail);
 
-      __ LoadFieldFromOffset(TMP, field_reg, Field::guarded_cid_offset(), PP);
+      __ LoadFieldFromOffset(
+          TMP, field_reg, Field::guarded_cid_offset(), PP, kWord);
       __ CompareImmediate(TMP, kDynamicCid, PP);
       __ b(&ok, EQ);
 
@@ -1642,10 +1641,10 @@
           ((IsPotentialUnboxedStore()) ? 2 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-      !field().IsNull() &&
-          ((field().guarded_cid() == kIllegalCid) || is_initialization_)
-              ? LocationSummary::kCallOnSlowPath
-              : LocationSummary::kNoCall);
+          ((IsUnboxedStore() && opt && is_initialization_) ||
+           IsPotentialUnboxedStore())
+          ? LocationSummary::kCallOnSlowPath
+          : LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   if (IsUnboxedStore() && opt) {
@@ -1740,7 +1739,7 @@
 
     __ LoadObject(temp, Field::ZoneHandle(field().raw()), PP);
 
-    __ LoadFieldFromOffset(temp2, temp, Field::is_nullable_offset(), PP);
+    __ LoadFieldFromOffset(temp2, temp, Field::is_nullable_offset(), PP, kWord);
     __ CompareImmediate(temp2, kNullCid, PP);
     __ b(&store_pointer, EQ);
 
@@ -1750,15 +1749,15 @@
     __ tsti(temp2, 1 << Field::kUnboxingCandidateBit);
     __ b(&store_pointer, EQ);
 
-    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP);
+    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP, kWord);
     __ CompareImmediate(temp2, kDoubleCid, PP);
     __ b(&store_double, EQ);
 
-    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP);
+    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP, kWord);
     __ CompareImmediate(temp2, kFloat32x4Cid, PP);
     __ b(&store_float32x4, EQ);
 
-    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP);
+    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP, kWord);
     __ CompareImmediate(temp2, kFloat64x2Cid, PP);
     __ b(&store_float64x2, EQ);
 
@@ -2127,23 +2126,24 @@
 
     __ LoadObject(result_reg, Field::ZoneHandle(field()->raw()), PP);
 
-    FieldAddress field_cid_operand(result_reg, Field::guarded_cid_offset());
-    FieldAddress field_nullability_operand(result_reg,
-                                           Field::is_nullable_offset());
+    FieldAddress field_cid_operand(
+        result_reg, Field::guarded_cid_offset(), kWord);
+    FieldAddress field_nullability_operand(
+        result_reg, Field::is_nullable_offset(), kWord);
 
-    __ ldr(temp, field_nullability_operand);
+    __ ldr(temp, field_nullability_operand, kWord);
     __ CompareImmediate(temp, kNullCid, PP);
     __ b(&load_pointer, EQ);
 
-    __ ldr(temp, field_cid_operand);
+    __ ldr(temp, field_cid_operand, kWord);
     __ CompareImmediate(temp, kDoubleCid, PP);
     __ b(&load_double, EQ);
 
-    __ ldr(temp, field_cid_operand);
+    __ ldr(temp, field_cid_operand, kWord);
     __ CompareImmediate(temp, kFloat32x4Cid, PP);
     __ b(&load_float32x4, EQ);
 
-    __ ldr(temp, field_cid_operand);
+    __ ldr(temp, field_cid_operand, kWord);
     __ CompareImmediate(temp, kFloat64x2Cid, PP);
     __ b(&load_float64x2, EQ);
 
@@ -2478,7 +2478,8 @@
     __ LoadObject(temp, compiler->parsed_function().function(), PP);
     intptr_t threshold =
         FLAG_optimization_counter_threshold * (loop_depth() + 1);
-    __ LoadFieldFromOffset(temp, temp, Function::usage_counter_offset(), PP);
+    __ LoadFieldFromOffset(
+        temp, temp, Function::usage_counter_offset(), PP, kWord);
     __ CompareImmediate(temp, threshold, PP);
     __ b(slow_path->osr_entry_label(), GE);
   }
@@ -2505,7 +2506,7 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->is_truncating();
+  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
@@ -2583,8 +2584,7 @@
   if (is_truncating) {
     if (right_needs_check) {
       const bool right_may_be_negative =
-          (right_range == NULL) ||
-          !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+          (right_range == NULL) || !right_range->IsPositive();
       if (right_may_be_negative) {
         ASSERT(shift_left->CanDeoptimize());
         __ CompareRegisters(right, ZR);
@@ -2630,7 +2630,7 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
-      (((op_kind() == Token::kSHL) && !is_truncating()) ||
+      (((op_kind() == Token::kSHL) && !IsTruncating()) ||
        (op_kind() == Token::kSHR)) ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
@@ -2653,7 +2653,7 @@
   }
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
-  if (((op_kind() == Token::kSHL) && !is_truncating()) ||
+  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
   }
@@ -2670,7 +2670,6 @@
     return;
   }
 
-  ASSERT(!is_truncating());
   const Register left = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   Label* deopt = NULL;
@@ -2917,7 +2916,7 @@
       // sarl operation masks the count to 6 bits.
       const intptr_t kCountLimit = 0x3F;
       if ((right_range == NULL) ||
-          !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
+          !right_range->OnlyLessThanOrEqualTo(kCountLimit)) {
         __ LoadImmediate(TMP2, kCountLimit, PP);
         __ CompareRegisters(TMP, TMP2);
         __ csel(TMP, TMP2, TMP, GT);
@@ -4505,7 +4504,8 @@
                                target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   __ Bind(&done);
 }
 
@@ -4887,7 +4887,8 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs());
+                                 locs(),
+                                 ICData::Handle());
     return;
   }
 
@@ -5123,7 +5124,7 @@
                                 kThrowRuntimeEntry,
                                 1,
                                 locs());
-  __ hlt(0);
+  __ brk(0);
 }
 
 
@@ -5140,7 +5141,7 @@
                                 kReThrowRuntimeEntry,
                                 2,
                                 locs());
-  __ hlt(0);
+  __ brk(0);
 }
 
 
@@ -5154,7 +5155,7 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (compiler->NeedsEdgeCounter(this)) {
       compiler->EmitEdgeCounter();
     }
     // Add an edge counter.
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 50807147..4afb6ce 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -8,6 +8,7 @@
 #include "vm/intermediate_language.h"
 
 #include "vm/dart_entry.h"
+#include "vm/flow_graph.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -796,6 +797,9 @@
   ASSERT(locs()->temp(1).reg() == ECX);
   ASSERT(locs()->temp(2).reg() == EDX);
   Register result = locs()->out(0).reg();
+  const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
+  const bool is_leaf_call =
+      (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
 
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::ZoneHandle());
@@ -807,10 +811,10 @@
     __ leal(EAX, Address(EBP, kFirstLocalSlotFromFp * kWordSize));
   }
   __ movl(ECX, Immediate(reinterpret_cast<uword>(native_c_function())));
-  __ movl(EDX, Immediate(NativeArguments::ComputeArgcTag(function())));
-  const ExternalLabel* stub_entry =
-      (is_bootstrap_native()) ? &StubCode::CallBootstrapCFunctionLabel() :
-                                &StubCode::CallNativeCFunctionLabel();
+  __ movl(EDX, Immediate(argc_tag));
+  const ExternalLabel* stub_entry = (is_bootstrap_native() || is_leaf_call) ?
+      &StubCode::CallBootstrapCFunctionLabel() :
+      &StubCode::CallNativeCFunctionLabel();
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -904,7 +908,8 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   ASSERT(locs()->out(0).reg() == EAX);
 }
 
@@ -939,15 +944,7 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register object = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  Label load, done;
-  __ testl(object, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &load, Assembler::kNearJump);
-  __ movl(result, Immediate(Smi::RawValue(kSmiCid)));
-  __ jmp(&done);
-  __ Bind(&load);
-  __ LoadClassId(result, object);
-  __ SmiTag(result);
-  __ Bind(&done);
+  __ LoadTaggedClassIdMayBeSmi(result, object);
 }
 
 
@@ -1742,8 +1739,8 @@
           ((IsPotentialUnboxedStore()) ? 3 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          !field().IsNull() &&
-          ((field().guarded_cid() == kIllegalCid) || is_initialization_)
+          ((IsUnboxedStore() && opt && is_initialization_) ||
+           IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
 
@@ -1833,6 +1830,7 @@
   }
 
   if (IsPotentialUnboxedStore()) {
+    __ Comment("PotentialUnboxedStore");
     Register value_reg = locs()->in(1).reg();
     Register temp = locs()->temp(0).reg();
     Register temp2 = locs()->temp(1).reg();
@@ -2830,7 +2828,7 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->is_truncating();
+  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
@@ -2849,7 +2847,7 @@
     } else if ((value < 0) || (value >= kCountLimit)) {
       // This condition may not be known earlier in some cases because
       // of constant propagation, inlining, etc.
-      if ((value >=kCountLimit) && is_truncating) {
+      if ((value >= kCountLimit) && is_truncating) {
         __ xorl(result, result);
       } else {
         // Result is Mint or exception.
@@ -2906,8 +2904,7 @@
   if (is_truncating) {
     if (right_needs_check) {
       const bool right_may_be_negative =
-          (right_range == NULL) ||
-          !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+          (right_range == NULL) || !right_range->IsPositive();
       if (right_may_be_negative) {
         ASSERT(shift_left->CanDeoptimize());
         __ cmpl(right, Immediate(0));
@@ -2993,12 +2990,12 @@
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
-    const intptr_t kNumTemps = !is_truncating() ? 1 : 0;
+    const intptr_t kNumTemps = !IsTruncating() ? 1 : 0;
     LocationSummary* summary = new(isolate) LocationSummary(
         isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
-    if (!is_truncating()) {
+    if (!IsTruncating()) {
       summary->set_temp(0, Location::RequiresRegister());
     }
     summary->set_out(0, Location::SameAsFirstInput());
@@ -3026,7 +3023,6 @@
     return;
   }
 
-  ASSERT(!is_truncating());
   Register left = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(left == result);
@@ -3273,7 +3269,7 @@
         __ jmp(&done, Assembler::kNearJump);
         __ Bind(&subtract);
         __ subl(result, right);
-      } else if (right_range->IsWithin(0, RangeBoundary::kPlusInfinity)) {
+      } else if (right_range->IsPositive()) {
         // Right is positive.
         __ addl(result, right);
       } else {
@@ -3293,7 +3289,7 @@
       // sarl operation masks the count to 5 bits.
       const intptr_t kCountLimit = 0x1F;
       if ((right_range == NULL) ||
-          !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
+          !right_range->OnlyLessThanOrEqualTo(kCountLimit)) {
         __ cmpl(right, Immediate(kCountLimit));
         Label count_ok;
         __ j(LESS, &count_ok, Assembler::kNearJump);
@@ -3333,7 +3329,7 @@
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
   const bool need_temp = (left()->definition() != right()->definition())
-                      &&(left_cid != kSmiCid)
+                      && (left_cid != kSmiCid)
                       && (right_cid != kSmiCid);
   const intptr_t kNumTemps = need_temp ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
@@ -4950,8 +4946,9 @@
                                instance_call()->token_pos(),
                                target,
                                kNumberOfArguments,
-                               Object::null_array(),  // No argument names.,
-                               locs());
+                               Object::null_array(),  // No argument names.
+                               locs(),
+                               ICData::Handle());
   __ Bind(&done);
 }
 
@@ -5365,7 +5362,7 @@
       __ jmp(&done, Assembler::kNearJump);
       __ Bind(&subtract);
       __ subl(EDX, right);
-    } else if (right_range->IsWithin(0, RangeBoundary::kPlusInfinity)) {
+    } else if (right_range->IsPositive()) {
       // Right is positive.
       __ addl(EDX, right);
     } else {
@@ -5427,7 +5424,8 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs());
+                                 locs(),
+                                 ICData::Handle());
     return;
   }
 
@@ -5665,14 +5663,18 @@
 LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
+  const intptr_t kNumTemps = is_smi() ? 0 : 1;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs,
                           kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+                          is_smi()
+                              ? LocationSummary::kNoCall
+                              : LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
-  summary->set_temp(0, Location::RequiresRegister());
+  if (!is_smi()) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
@@ -5712,6 +5714,15 @@
 
 
 void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (is_smi()) {
+    PairLocation* value_pair = locs()->in(0).AsPairLocation();
+    Register value_lo = value_pair->At(0).reg();
+    Register out_reg = locs()->out(0).reg();
+    __ movl(out_reg, value_lo);
+    __ SmiTag(out_reg);
+    return;
+  }
+
   BoxIntegerSlowPath* slow_path = new BoxIntegerSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
   PairLocation* value_pair = locs()->in(0).AsPairLocation();
@@ -6003,7 +6014,7 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (compiler->NeedsEdgeCounter(this)) {
       compiler->EmitEdgeCounter();
     }
     // The deoptimization descriptor points after the edge counter code for
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 9f99907..9570e61 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -8,6 +8,7 @@
 #include "vm/intermediate_language.h"
 
 #include "vm/dart_entry.h"
+#include "vm/flow_graph.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -879,8 +880,11 @@
   // this is a redirection address that forces the simulator to call
   // into the runtime system.
   uword entry = reinterpret_cast<uword>(native_c_function());
+  const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
+  const bool is_leaf_call =
+    (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
   const ExternalLabel* stub_entry;
-  if (is_bootstrap_native()) {
+  if (is_bootstrap_native() || is_leaf_call) {
     stub_entry = &StubCode::CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
     entry = Simulator::RedirectExternalReference(
@@ -899,7 +903,7 @@
 #endif
   }
   __ LoadImmediate(T5, entry);
-  __ LoadImmediate(A1, NativeArguments::ComputeArgcTag(function()));
+  __ LoadImmediate(A1, argc_tag);
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -984,7 +988,8 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   ASSERT(locs()->out(0).reg() == V0);
 }
 
@@ -1019,15 +1024,7 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register object = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  Label load, done;
-  __ andi(CMPRES1, object, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &load);
-  __ LoadImmediate(result, Smi::RawValue(kSmiCid));
-  __ b(&done);
-  __ Bind(&load);
-  __ LoadClassId(result, object);
-  __ SmiTag(result);
-  __ Bind(&done);
+  __ LoadTaggedClassIdMayBeSmi(result, object);
 }
 
 
@@ -1759,8 +1756,8 @@
           ((IsPotentialUnboxedStore()) ? 3 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          !field().IsNull() &&
-          ((field().guarded_cid() == kIllegalCid) || is_initialization_)
+          ((IsUnboxedStore() && opt && is_initialization_) ||
+           IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
 
@@ -1817,9 +1814,7 @@
                      temp2);
       __ Bind(slow_path->exit_label());
       __ mov(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
     } else {
       __ lw(temp, FieldAddress(instance_reg, offset_in_bytes_));
     }
@@ -1880,9 +1875,7 @@
                      temp2);
       __ Bind(slow_path->exit_label());
       __ mov(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
 
       __ Bind(&copy_double);
       __ LoadDFromOffset(fpu_temp,
@@ -1898,20 +1891,21 @@
 
   if (ShouldEmitStoreBarrier()) {
     Register value_reg = locs()->in(1).reg();
-    __ StoreIntoObject(instance_reg,
-                       FieldAddress(instance_reg, offset_in_bytes_),
-                       value_reg,
-                       CanValueBeSmi());
+    __ StoreIntoObjectOffset(instance_reg,
+                             offset_in_bytes_,
+                             value_reg,
+                             CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectNoBarrier(
+      __ StoreIntoObjectNoBarrierOffset(
           instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_),
+          offset_in_bytes_,
           locs()->in(1).constant());
     } else {
       Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectNoBarrier(instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_), value_reg);
+      __ StoreIntoObjectNoBarrierOffset(instance_reg,
+                                        offset_in_bytes_,
+                                        value_reg);
     }
   }
   __ Bind(&skip_store);
@@ -2252,7 +2246,8 @@
 
     __ Bind(&load_pointer);
   }
-  __ lw(result_reg, Address(instance_reg, offset_in_bytes() - kHeapObjectTag));
+  __ LoadFromOffset(
+      result_reg, instance_reg, offset_in_bytes() - kHeapObjectTag);
   __ Bind(&done);
 }
 
@@ -2566,7 +2561,7 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->is_truncating();
+  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
@@ -2641,8 +2636,7 @@
   if (is_truncating) {
     if (right_needs_check) {
       const bool right_may_be_negative =
-          (right_range == NULL) ||
-          !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+          (right_range == NULL) || !right_range->IsPositive();
       if (right_may_be_negative) {
         ASSERT(shift_left->CanDeoptimize());
         __ bltz(right, deopt);
@@ -2687,7 +2681,7 @@
       ((op_kind() == Token::kADD) ||
        (op_kind() == Token::kMOD) ||
        (op_kind() == Token::kTRUNCDIV) ||
-       (((op_kind() == Token::kSHL) && !is_truncating()) ||
+       (((op_kind() == Token::kSHL) && !IsTruncating()) ||
          (op_kind() == Token::kSHR))) ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
@@ -2712,7 +2706,7 @@
   }
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
-  if (((op_kind() == Token::kSHL) && !is_truncating()) ||
+  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
   } else if (op_kind() == Token::kADD) {
@@ -2733,7 +2727,6 @@
     return;
   }
 
-  ASSERT(!is_truncating());
   Register left = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   Label* deopt = NULL;
@@ -2982,7 +2975,7 @@
         __ b(&done);
         __ Bind(&subtract);
         __ subu(result, result, TMP);
-      } else if (right_range->IsWithin(0, RangeBoundary::kPlusInfinity)) {
+      } else if (right_range->IsPositive()) {
         // Right is positive.
         __ addu(result, result, TMP);
       } else {
@@ -3002,7 +2995,7 @@
       // sra operation masks the count to 5 bits.
       const intptr_t kCountLimit = 0x1F;
       if ((right_range == NULL) ||
-          !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
+          !right_range->OnlyLessThanOrEqualTo(kCountLimit)) {
         Label ok;
         __ BranchSignedLessEqual(temp, kCountLimit, &ok);
         __ LoadImmediate(temp, kCountLimit);
@@ -3865,7 +3858,8 @@
                                target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   __ Bind(&done);
 }
 
@@ -4201,7 +4195,7 @@
       __ b(&done);
       __ Bind(&subtract);
       __ subu(result_mod, result_mod, TMP);
-    } else if (right_range->IsWithin(0, RangeBoundary::kPlusInfinity)) {
+    } else if (right_range->IsPositive()) {
       // Right is positive.
       __ addu(result_mod, result_mod, TMP);
     } else {
@@ -4241,7 +4235,8 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs());
+                                 locs(),
+                                 ICData::Handle());
     return;
   }
 
@@ -4503,7 +4498,7 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (compiler->NeedsEdgeCounter(this)) {
       compiler->EmitEdgeCounter();
     }
     // On MIPS the deoptimization descriptor points after the edge counter
diff --git a/runtime/vm/intermediate_language_test.cc b/runtime/vm/intermediate_language_test.cc
index ac57c55..918849b 100644
--- a/runtime/vm/intermediate_language_test.cc
+++ b/runtime/vm/intermediate_language_test.cc
@@ -53,10 +53,609 @@
   Range* range_x = new Range(
       RangeBoundary::FromConstant(-15),
       RangeBoundary::FromConstant(100));
+  EXPECT(positive->IsPositive());
   EXPECT(zero->Overlaps(0, 0));
   EXPECT(positive->Overlaps(0, 0));
   EXPECT(!negative->Overlaps(0, 0));
   EXPECT(range_x->Overlaps(0, 0));
+  EXPECT(range_x->IsWithin(-15, 100));
+  EXPECT(!range_x->IsWithin(-15, 99));
+  EXPECT(!range_x->IsWithin(-14, 100));
+
+#define TEST_RANGE_OP(Op, l_min, l_max, r_min, r_max, result_min, result_max)  \
+  {                                                                            \
+    RangeBoundary min, max;                                                    \
+    Range* left_range = new Range(                                             \
+      RangeBoundary::FromConstant(l_min),                                      \
+      RangeBoundary::FromConstant(l_max));                                     \
+    Range* shift_range = new Range(                                            \
+      RangeBoundary::FromConstant(r_min),                                      \
+      RangeBoundary::FromConstant(r_max));                                     \
+    Op(left_range, shift_range, &min, &max);                                   \
+    EXPECT(min.Equals(result_min));                                            \
+    if (!min.Equals(result_min)) OS::Print("%s\n", min.ToCString());           \
+    EXPECT(max.Equals(result_max));                                            \
+    if (!max.Equals(result_max)) OS::Print("%s\n", max.ToCString());           \
+  }
+
+  TEST_RANGE_OP(Range::Shl, -15, 100, 0, 2,
+                RangeBoundary(-60), RangeBoundary(400));
+  TEST_RANGE_OP(Range::Shl, -15, 100, -2, 2,
+                RangeBoundary(-60), RangeBoundary(400));
+  TEST_RANGE_OP(Range::Shl, -15, -10, 1, 2,
+                RangeBoundary(-60), RangeBoundary(-20));
+  TEST_RANGE_OP(Range::Shl, 5, 10, -2, 2,
+                RangeBoundary(5), RangeBoundary(40));
+  TEST_RANGE_OP(Range::Shl, -15, 100, 0, 64,
+                RangeBoundary::NegativeInfinity(),
+                RangeBoundary::PositiveInfinity());
+  TEST_RANGE_OP(Range::Shl, -1, 1, 63, 63,
+                RangeBoundary::NegativeInfinity(),
+                RangeBoundary::PositiveInfinity());
+  if (kBitsPerWord == 64) {
+    TEST_RANGE_OP(Range::Shl, -1, 1, 62, 62,
+                  RangeBoundary(kSmiMin),
+                  RangeBoundary::PositiveInfinity());
+    TEST_RANGE_OP(Range::Shl, -1, 1, 30, 30,
+                  RangeBoundary(-1 << 30),
+                  RangeBoundary(1 << 30));
+  } else {
+    TEST_RANGE_OP(Range::Shl, -1, 1, 30, 30,
+                  RangeBoundary(kSmiMin),
+                  RangeBoundary::PositiveInfinity());
+    TEST_RANGE_OP(Range::Shl, -1, 1, 62, 62,
+                  RangeBoundary::NegativeInfinity(),
+                  RangeBoundary::PositiveInfinity());
+  }
+  TEST_RANGE_OP(Range::Shl, 0, 100, 0, 64,
+                RangeBoundary(0), RangeBoundary::PositiveInfinity());
+  TEST_RANGE_OP(Range::Shl, -100, 0, 0, 64,
+                RangeBoundary::NegativeInfinity(), RangeBoundary(0));
+
+  TEST_RANGE_OP(Range::Shr, -8, 8, 1, 2, RangeBoundary(-4), RangeBoundary(4));
+  TEST_RANGE_OP(Range::Shr, 1, 8, 1, 2, RangeBoundary(0), RangeBoundary(4));
+  TEST_RANGE_OP(Range::Shr, -16, -8, 1, 2,
+                RangeBoundary(-8), RangeBoundary(-2));
+  TEST_RANGE_OP(Range::Shr, 2, 4, -1, 1, RangeBoundary(1), RangeBoundary(4));
+  TEST_RANGE_OP(Range::Shr, kMaxInt64, kMaxInt64, 0, 1,
+                RangeBoundary(kMaxInt64 >> 1), RangeBoundary(kMaxInt64));
+  TEST_RANGE_OP(Range::Shr, kMinInt64, kMinInt64, 0, 1,
+                RangeBoundary(kMinInt64), RangeBoundary(kMinInt64 >> 1));
+#undef TEST_RANGE_OP
+}
+
+
+TEST_CASE(RangeTestsInfinity) {
+  // +/- inf overflowed.
+  EXPECT(RangeBoundary::NegativeInfinity().OverflowedSmi());
+  EXPECT(RangeBoundary::PositiveInfinity().OverflowedSmi());
+
+  EXPECT(RangeBoundary::NegativeInfinity().OverflowedMint());
+  EXPECT(RangeBoundary::PositiveInfinity().OverflowedMint());
+
+  Range* all = new Range(RangeBoundary::NegativeInfinity(),
+                         RangeBoundary::PositiveInfinity());
+  EXPECT(all->Overlaps(0, 0));
+  EXPECT(all->Overlaps(-1, 1));
+  EXPECT(!all->IsWithin(0, 100));
+  Range* positive = new Range(RangeBoundary::FromConstant(0),
+                              RangeBoundary::PositiveInfinity());
+  EXPECT(positive->IsPositive());
+  EXPECT(positive->Overlaps(0, 1));
+  EXPECT(positive->Overlaps(1, 100));
+  EXPECT(positive->Overlaps(-1, 0));
+  EXPECT(!positive->Overlaps(-2, -1));
+  Range* negative = new Range(RangeBoundary::NegativeInfinity(),
+                              RangeBoundary::FromConstant(-1));
+  EXPECT(!negative->IsPositive());
+  EXPECT(!negative->Overlaps(0, 1));
+  EXPECT(!negative->Overlaps(1, 100));
+  EXPECT(negative->Overlaps(-1, 0));
+  EXPECT(negative->Overlaps(-2, -1));
+  Range* negpos = new Range(RangeBoundary::NegativeInfinity(),
+                            RangeBoundary::FromConstant(0));
+  EXPECT(!negpos->IsPositive());
+
+  Range* a = new Range(RangeBoundary::NegativeInfinity(),
+                       RangeBoundary::FromConstant(1));
+
+  Range* b = new Range(RangeBoundary::NegativeInfinity(),
+                       RangeBoundary::FromConstant(31));
+
+  Range* c = new Range(RangeBoundary::NegativeInfinity(),
+                       RangeBoundary::FromConstant(32));
+
+  EXPECT(a->OnlyLessThanOrEqualTo(31));
+  EXPECT(b->OnlyLessThanOrEqualTo(31));
+  EXPECT(!c->OnlyLessThanOrEqualTo(31));
+
+  Range* unsatisfiable = new Range(RangeBoundary::PositiveInfinity(),
+                                   RangeBoundary::NegativeInfinity());
+  EXPECT(unsatisfiable->IsUnsatisfiable());
+
+  Range* unsatisfiable_right = new Range(RangeBoundary::PositiveInfinity(),
+                                         RangeBoundary::FromConstant(0));
+  EXPECT(unsatisfiable_right->IsUnsatisfiable());
+
+  Range* unsatisfiable_left = new Range(RangeBoundary::FromConstant(0),
+                                        RangeBoundary::NegativeInfinity());
+  EXPECT(unsatisfiable_left->IsUnsatisfiable());
+}
+
+
+TEST_CASE(RangeUtils) {
+  // [-inf, +inf].
+  const Range& range_0 = *(new Range(RangeBoundary::NegativeInfinity(),
+                                     RangeBoundary::PositiveInfinity()));
+  // [-inf, -1].
+  const Range& range_a = *(new Range(RangeBoundary::NegativeInfinity(),
+                                     RangeBoundary::FromConstant(-1)));
+  // [-inf, 0].
+  const Range& range_b = *(new Range(RangeBoundary::NegativeInfinity(),
+                                     RangeBoundary::FromConstant(0)));
+  // [-inf, 1].
+  const Range& range_c = *(new Range(RangeBoundary::NegativeInfinity(),
+                                     RangeBoundary::FromConstant(1)));
+  // [-1, +inf]
+  const Range& range_d = *(new Range(RangeBoundary::FromConstant(-1),
+                                     RangeBoundary::PositiveInfinity()));
+  // [0, +inf]
+  const Range& range_e = *(new Range(RangeBoundary::FromConstant(0),
+                                     RangeBoundary::PositiveInfinity()));
+  // [1, +inf].
+  const Range& range_f = *(new Range(RangeBoundary::FromConstant(1),
+                                     RangeBoundary::PositiveInfinity()));
+  // [1, 2].
+  const Range& range_g = *(new Range(RangeBoundary::FromConstant(1),
+                                     RangeBoundary::FromConstant(2)));
+  // [-1, -2].
+  const Range& range_h = *(new Range(RangeBoundary::FromConstant(-1),
+                                     RangeBoundary::FromConstant(-2)));
+  // [-1, 1].
+  const Range& range_i = *(new Range(RangeBoundary::FromConstant(-1),
+                                     RangeBoundary::FromConstant(1)));
+
+  // OnlyPositiveOrZero.
+  EXPECT(!Range::OnlyPositiveOrZero(range_a, range_b));
+  EXPECT(!Range::OnlyPositiveOrZero(range_b, range_c));
+  EXPECT(!Range::OnlyPositiveOrZero(range_c, range_d));
+  EXPECT(!Range::OnlyPositiveOrZero(range_d, range_e));
+  EXPECT(Range::OnlyPositiveOrZero(range_e, range_f));
+  EXPECT(!Range::OnlyPositiveOrZero(range_d, range_d));
+  EXPECT(Range::OnlyPositiveOrZero(range_e, range_e));
+  EXPECT(Range::OnlyPositiveOrZero(range_f, range_g));
+  EXPECT(!Range::OnlyPositiveOrZero(range_g, range_h));
+  EXPECT(!Range::OnlyPositiveOrZero(range_i, range_i));
+
+  // OnlyNegativeOrZero.
+  EXPECT(Range::OnlyNegativeOrZero(range_a, range_b));
+  EXPECT(!Range::OnlyNegativeOrZero(range_b, range_c));
+  EXPECT(Range::OnlyNegativeOrZero(range_b, range_b));
+  EXPECT(!Range::OnlyNegativeOrZero(range_c, range_c));
+  EXPECT(!Range::OnlyNegativeOrZero(range_c, range_d));
+  EXPECT(!Range::OnlyNegativeOrZero(range_d, range_e));
+  EXPECT(!Range::OnlyNegativeOrZero(range_e, range_f));
+  EXPECT(!Range::OnlyNegativeOrZero(range_f, range_g));
+  EXPECT(!Range::OnlyNegativeOrZero(range_g, range_h));
+  EXPECT(Range::OnlyNegativeOrZero(range_h, range_h));
+  EXPECT(!Range::OnlyNegativeOrZero(range_i, range_i));
+
+  // [-inf, +inf].
+  EXPECT(!Range::OnlyNegativeOrZero(range_0, range_0));
+  EXPECT(!Range::OnlyPositiveOrZero(range_0, range_0));
+
+  EXPECT(Range::ConstantAbsMax(&range_0) == RangeBoundary::kMax);
+  EXPECT(Range::ConstantAbsMax(&range_h) == 2);
+  EXPECT(Range::ConstantAbsMax(&range_i) == 1);
+
+  // RangeBOundary.Equals.
+  EXPECT(RangeBoundary::FromConstant(1).Equals(
+      RangeBoundary::FromConstant(1)));
+  EXPECT(!RangeBoundary::FromConstant(2).Equals(
+      RangeBoundary::FromConstant(1)));
+  EXPECT(RangeBoundary::PositiveInfinity().Equals(
+      RangeBoundary::PositiveInfinity()));
+  EXPECT(!RangeBoundary::PositiveInfinity().Equals(
+      RangeBoundary::NegativeInfinity()));
+  EXPECT(RangeBoundary::NegativeInfinity().Equals(
+      RangeBoundary::NegativeInfinity()));
+  EXPECT(!RangeBoundary::NegativeInfinity().Equals(
+      RangeBoundary::PositiveInfinity()));
+  EXPECT(!RangeBoundary::FromConstant(1).Equals(
+      RangeBoundary::NegativeInfinity()));
+  EXPECT(!RangeBoundary::FromConstant(1).Equals(
+      RangeBoundary::NegativeInfinity()));
+  EXPECT(!RangeBoundary::FromConstant(2).Equals(
+      RangeBoundary::PositiveInfinity()));
+}
+
+
+TEST_CASE(RangeBinaryOp) {
+  Range* range_a = new Range(RangeBoundary::FromConstant(-1),
+                             RangeBoundary::PositiveInfinity());
+  range_a->Clamp(RangeBoundary::kRangeBoundaryInt64);
+  EXPECT(range_a->min().ConstantValue() == -1);
+  EXPECT(range_a->max().ConstantValue() == RangeBoundary::kMax);
+  Range* range_b = new Range(RangeBoundary::NegativeInfinity(),
+                             RangeBoundary::FromConstant(1));
+  range_b->Clamp(RangeBoundary::kRangeBoundaryInt64);
+  EXPECT(range_b->min().ConstantValue() == RangeBoundary::kMin);
+  EXPECT(range_b->max().ConstantValue() == 1);
+  Range* result = Range::BinaryOp(Token::kADD,
+                                  range_a,
+                                  range_b,
+                                  NULL);
+  ASSERT(result != NULL);
+  EXPECT(result->min().IsNegativeInfinity());
+  EXPECT(result->max().IsPositiveInfinity());
+
+  // Test that [5, 10] + [0, 5] = [5, 15].
+  Range* range_c = new Range(RangeBoundary::FromConstant(5),
+                             RangeBoundary::FromConstant(10));
+  Range* range_d = new Range(RangeBoundary::FromConstant(0),
+                             RangeBoundary::FromConstant(5));
+  result = Range::BinaryOp(Token::kADD,
+                           range_c,
+                           range_d,
+                           NULL);
+  ASSERT(result != NULL);
+  EXPECT(result->min().ConstantValue() == 5);
+  EXPECT(result->max().ConstantValue() == 15);
+
+
+  // Test that [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf].
+  Range* range_e = new Range(RangeBoundary::FromConstant(0xff),
+                             RangeBoundary::FromConstant(0xfff));
+  Range* range_f = new Range(RangeBoundary::FromConstant(0xf),
+                             RangeBoundary::FromConstant(0xf));
+  result = Range::BinaryOp(Token::kBIT_AND,
+                           range_e,
+                           range_f,
+                           NULL);
+  ASSERT(result != NULL);
+  EXPECT(result->min().ConstantValue() == 0x0);
+  EXPECT(result->max().ConstantValue() == 0xf);
+}
+
+
+TEST_CASE(RangeAdd) {
+#define TEST_RANGE_ADD(l_min, l_max, r_min, r_max, result_min, result_max)     \
+  {                                                                            \
+    RangeBoundary min, max;                                                    \
+    Range* left_range = new Range(                                             \
+      RangeBoundary::FromConstant(l_min),                                      \
+      RangeBoundary::FromConstant(l_max));                                     \
+    Range* right_range = new Range(                                            \
+      RangeBoundary::FromConstant(r_min),                                      \
+      RangeBoundary::FromConstant(r_max));                                     \
+    EXPECT(left_range->min().ConstantValue() == l_min);                        \
+    EXPECT(left_range->max().ConstantValue() == l_max);                        \
+    EXPECT(right_range->min().ConstantValue() == r_min);                       \
+    EXPECT(right_range->max().ConstantValue() == r_max);                       \
+    Range::Add(left_range, right_range, &min, &max, NULL);                     \
+    EXPECT(min.Equals(result_min));                                            \
+    if (!min.Equals(result_min)) {                                             \
+      OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString());        \
+    }                                                                          \
+    EXPECT(max.Equals(result_max));                                            \
+    if (!max.Equals(result_max)) {                                             \
+      OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString());        \
+    }                                                                          \
+  }
+
+  // [kMaxInt32, kMaxInt32 + 15] + [10, 20] = [kMaxInt32 + 10, kMaxInt32 + 35].
+  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32),
+                 static_cast<int64_t>(kMaxInt32) + 15,
+                 static_cast<int64_t>(10),
+                 static_cast<int64_t>(20),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 10),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 35));
+
+  // [kMaxInt32 - 15, kMaxInt32 + 15] + [15, -15] = [kMaxInt32, kMaxInt32].
+  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32) - 15,
+                 static_cast<int64_t>(kMaxInt32) + 15,
+                 static_cast<int64_t>(15),
+                 static_cast<int64_t>(-15),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32)),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32)));
+
+  // [kMaxInt32, kMaxInt32 + 15] + [10, kMaxInt64] = [kMaxInt32 + 10, +inf].
+  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32),
+                 static_cast<int64_t>(kMaxInt32) + 15,
+                 static_cast<int64_t>(10),
+                 static_cast<int64_t>(kMaxInt64),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 10),
+                 RangeBoundary::PositiveInfinity());
+
+  // [kMinInt64, kMaxInt32 + 15] + [10, 20] = [kMinInt64 + 10, kMaxInt32 + 35].
+  TEST_RANGE_ADD(static_cast<int64_t>(kMinInt64),
+                 static_cast<int64_t>(kMaxInt32) + 15,
+                 static_cast<int64_t>(10),
+                 static_cast<int64_t>(20),
+                 RangeBoundary(static_cast<int64_t>(kMinInt64) + 10),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 35));
+
+  // [0, 0] + [kMinInt64, kMaxInt64] = [kMinInt64, kMaxInt64].
+  TEST_RANGE_ADD(static_cast<int64_t>(0),
+                 static_cast<int64_t>(0),
+                 static_cast<int64_t>(kMinInt64),
+                 static_cast<int64_t>(kMaxInt64),
+                 RangeBoundary(kMinInt64),
+                 RangeBoundary(kMaxInt64));
+
+  // Overflows.
+
+  // [-1, 1] + [kMinInt64, kMaxInt64] = [-inf, +inf].
+  TEST_RANGE_ADD(static_cast<int64_t>(-1),
+                 static_cast<int64_t>(1),
+                 static_cast<int64_t>(kMinInt64),
+                 static_cast<int64_t>(kMaxInt64),
+                 RangeBoundary::NegativeInfinity(),
+                 RangeBoundary::PositiveInfinity());
+
+  // [kMaxInt64, kMaxInt64] + [kMaxInt64, kMaxInt64] = [-inf, +inf].
+  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt64),
+                 static_cast<int64_t>(kMaxInt64),
+                 static_cast<int64_t>(kMaxInt64),
+                 static_cast<int64_t>(kMaxInt64),
+                 RangeBoundary::NegativeInfinity(),
+                 RangeBoundary::PositiveInfinity());
+
+  // [kMaxInt64, kMaxInt64] + [1, 1] = [-inf, +inf].
+  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt64),
+                 static_cast<int64_t>(kMaxInt64),
+                 static_cast<int64_t>(1),
+                 static_cast<int64_t>(1),
+                 RangeBoundary::NegativeInfinity(),
+                 RangeBoundary::PositiveInfinity());
+
+#undef TEST_RANGE_ADD
+}
+
+
+TEST_CASE(RangeSub) {
+#define TEST_RANGE_SUB(l_min, l_max, r_min, r_max, result_min, result_max)     \
+  {                                                                            \
+    RangeBoundary min, max;                                                    \
+    Range* left_range = new Range(                                             \
+      RangeBoundary::FromConstant(l_min),                                      \
+      RangeBoundary::FromConstant(l_max));                                     \
+    Range* right_range = new Range(                                            \
+      RangeBoundary::FromConstant(r_min),                                      \
+      RangeBoundary::FromConstant(r_max));                                     \
+    EXPECT(left_range->min().ConstantValue() == l_min);                        \
+    EXPECT(left_range->max().ConstantValue() == l_max);                        \
+    EXPECT(right_range->min().ConstantValue() == r_min);                       \
+    EXPECT(right_range->max().ConstantValue() == r_max);                       \
+    Range::Sub(left_range, right_range, &min, &max, NULL);                     \
+    EXPECT(min.Equals(result_min));                                            \
+    if (!min.Equals(result_min)) {                                             \
+      OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString());        \
+    }                                                                          \
+    EXPECT(max.Equals(result_max));                                            \
+    if (!max.Equals(result_max)) {                                             \
+      OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString());        \
+    }                                                                          \
+  }
+
+  // [kMaxInt32, kMaxInt32 + 15] - [10, 20] = [kMaxInt32 - 20, kMaxInt32 + 5].
+  TEST_RANGE_SUB(static_cast<int64_t>(kMaxInt32),
+                 static_cast<int64_t>(kMaxInt32) + 15,
+                 static_cast<int64_t>(10),
+                 static_cast<int64_t>(20),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) - 20),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 5));
+
+  // [kMintInt64, kMintInt64] - [1, 1] = [-inf, +inf].
+  TEST_RANGE_SUB(static_cast<int64_t>(kMinInt64),
+                 static_cast<int64_t>(kMinInt64),
+                 static_cast<int64_t>(1),
+                 static_cast<int64_t>(1),
+                 RangeBoundary::NegativeInfinity(),
+                 RangeBoundary::PositiveInfinity());
+
+  // [1, 1] - [kMintInt64, kMintInt64] = [-inf, +inf].
+  TEST_RANGE_SUB(static_cast<int64_t>(1),
+                 static_cast<int64_t>(1),
+                 static_cast<int64_t>(kMinInt64),
+                 static_cast<int64_t>(kMinInt64),
+                 RangeBoundary::NegativeInfinity(),
+                 RangeBoundary::PositiveInfinity());
+
+  // [kMaxInt32 + 10, kMaxInt32 + 20] - [-20, -20] =
+  //     [kMaxInt32 + 30, kMaxInt32 + 40].
+  TEST_RANGE_SUB(static_cast<int64_t>(kMaxInt32) + 10,
+                 static_cast<int64_t>(kMaxInt32) + 20,
+                 static_cast<int64_t>(-20),
+                 static_cast<int64_t>(-20),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 30),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 40));
+
+
+#undef TEST_RANGE_SUB
+}
+
+
+TEST_CASE(RangeAnd) {
+#define TEST_RANGE_AND(l_min, l_max, r_min, r_max, result_min, result_max)     \
+  {                                                                            \
+    RangeBoundary min, max;                                                    \
+    Range* left_range = new Range(                                             \
+      RangeBoundary::FromConstant(l_min),                                      \
+      RangeBoundary::FromConstant(l_max));                                     \
+    Range* right_range = new Range(                                            \
+      RangeBoundary::FromConstant(r_min),                                      \
+      RangeBoundary::FromConstant(r_max));                                     \
+    EXPECT(left_range->min().ConstantValue() == l_min);                        \
+    EXPECT(left_range->max().ConstantValue() == l_max);                        \
+    EXPECT(right_range->min().ConstantValue() == r_min);                       \
+    EXPECT(right_range->max().ConstantValue() == r_max);                       \
+    Range::And(left_range, right_range, &min, &max);                           \
+    EXPECT(min.Equals(result_min));                                            \
+    if (!min.Equals(result_min)) {                                             \
+      OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString());        \
+    }                                                                          \
+    EXPECT(max.Equals(result_max));                                            \
+    if (!max.Equals(result_max)) {                                             \
+      OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString());        \
+    }                                                                          \
+  }
+
+  // [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf].
+  TEST_RANGE_AND(static_cast<int64_t>(0xff),
+                 static_cast<int64_t>(0xfff),
+                 static_cast<int64_t>(0xf),
+                 static_cast<int64_t>(0xf),
+                 RangeBoundary(0),
+                 RangeBoundary(0xf));
+
+  // [0xffffffff, 0xffffffff] & [0xfffffffff, 0xfffffffff] = [0x0, 0xfffffffff].
+  TEST_RANGE_AND(static_cast<int64_t>(0xffffffff),
+                 static_cast<int64_t>(0xffffffff),
+                 static_cast<int64_t>(0xfffffffff),
+                 static_cast<int64_t>(0xfffffffff),
+                 RangeBoundary(0),
+                 RangeBoundary(static_cast<int64_t>(0xfffffffff)));
+
+  // [0xffffffff, 0xffffffff] & [-20, 20] = [0x0, 0xffffffff].
+  TEST_RANGE_AND(static_cast<int64_t>(0xffffffff),
+                 static_cast<int64_t>(0xffffffff),
+                 static_cast<int64_t>(-20),
+                 static_cast<int64_t>(20),
+                 RangeBoundary(0),
+                 RangeBoundary(static_cast<int64_t>(0xffffffff)));
+
+  // [-20, 20] & [0xffffffff, 0xffffffff] = [0x0, 0xffffffff].
+  TEST_RANGE_AND(static_cast<int64_t>(-20),
+                 static_cast<int64_t>(20),
+                 static_cast<int64_t>(0xffffffff),
+                 static_cast<int64_t>(0xffffffff),
+                 RangeBoundary(0),
+                 RangeBoundary(static_cast<int64_t>(0xffffffff)));
+
+  // Test that [-20, 20] & [-20, 20] = [Unknown, Unknown].
+  TEST_RANGE_AND(static_cast<int64_t>(-20),
+                 static_cast<int64_t>(20),
+                 static_cast<int64_t>(-20),
+                 static_cast<int64_t>(20),
+                 RangeBoundary(),
+                 RangeBoundary());
+
+#undef TEST_RANGE_AND
+}
+
+
+TEST_CASE(RangeMinMax) {
+  // Constants.
+  // MIN(0, 1) == 0
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0);
+  // MIN(0, -1) == -1
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+
+  // MIN(1, 0) == 0
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0);
+  // MIN(-1, 0) == -1
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+
+  // MAX(0, 1) == 1
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+
+  // MAX(0, -1) == 0
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0);
+
+  // MAX(1, 0) == 1
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+  // MAX(-1, 0) == 0
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0);
+
+  RangeBoundary n_infinity = RangeBoundary::NegativeInfinity();
+  RangeBoundary p_infinity = RangeBoundary::PositiveInfinity();
+
+  // Constants vs. infinity.
+  EXPECT(RangeBoundary::Max(
+      n_infinity,
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary::FromConstant(-1),
+      n_infinity,
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary::FromConstant(1),
+      n_infinity,
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+
+  EXPECT(RangeBoundary::Max(
+      n_infinity,
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+
+  EXPECT(RangeBoundary::Min(
+      p_infinity,
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary::FromConstant(-1),
+      p_infinity,
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary::FromConstant(1),
+      p_infinity,
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+
+  EXPECT(RangeBoundary::Min(
+      p_infinity,
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+
+  // 64-bit values.
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary(static_cast<int64_t>(kMinInt64)),
+      RangeBoundary(static_cast<int64_t>(kMinInt32)),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMinInt64);
+
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary(static_cast<int64_t>(kMinInt64)),
+      RangeBoundary(static_cast<int64_t>(kMinInt32)),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMinInt32);
+
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary(static_cast<int64_t>(kMaxInt64)),
+      RangeBoundary(static_cast<int64_t>(kMaxInt32)),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMaxInt32);
+
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary(static_cast<int64_t>(kMaxInt64)),
+      RangeBoundary(static_cast<int64_t>(kMaxInt32)),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMaxInt64);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 9093f7a..563a552 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -8,6 +8,7 @@
 #include "vm/intermediate_language.h"
 
 #include "vm/dart_entry.h"
+#include "vm/flow_graph.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -723,6 +724,9 @@
   ASSERT(locs()->temp(1).reg() == RBX);
   ASSERT(locs()->temp(2).reg() == R10);
   Register result = locs()->out(0).reg();
+  const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
+  const bool is_leaf_call =
+    (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
 
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::ZoneHandle(), PP);
@@ -737,10 +741,10 @@
   __ LoadImmediate(
       RBX, Immediate(reinterpret_cast<uword>(native_c_function())), PP);
   __ LoadImmediate(
-      R10, Immediate(NativeArguments::ComputeArgcTag(function())), PP);
-  const ExternalLabel* stub_entry =
-      (is_bootstrap_native()) ? &StubCode::CallBootstrapCFunctionLabel() :
-                                &StubCode::CallNativeCFunctionLabel();
+      R10, Immediate(argc_tag), PP);
+  const ExternalLabel* stub_entry = (is_bootstrap_native() || is_leaf_call) ?
+      &StubCode::CallBootstrapCFunctionLabel() :
+      &StubCode::CallNativeCFunctionLabel();
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -833,7 +837,8 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   ASSERT(locs()->out(0).reg() == RAX);
 }
 
@@ -868,15 +873,7 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register object = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  Label load, done;
-  __ testq(object, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &load, Assembler::kNearJump);
-  __ LoadImmediate(result, Immediate(Smi::RawValue(kSmiCid)), PP);
-  __ jmp(&done);
-  __ Bind(&load);
-  __ LoadClassId(result, object);
-  __ SmiTag(result);
-  __ Bind(&done);
+  __ LoadTaggedClassIdMayBeSmi(result, object);
 }
 
 
@@ -1379,13 +1376,13 @@
     if (value_cid == kDynamicCid) {
       LoadValueCid(compiler, value_cid_reg, value_reg);
 
-      __ cmpq(value_cid_reg, field_cid_operand);
+      __ cmpl(value_cid_reg, field_cid_operand);
       __ j(EQUAL, &ok);
-      __ cmpq(value_cid_reg, field_nullability_operand);
+      __ cmpl(value_cid_reg, field_nullability_operand);
     } else if (value_cid == kNullCid) {
-      __ CompareImmediate(field_nullability_operand, Immediate(value_cid), PP);
+      __ cmpl(field_nullability_operand, Immediate(value_cid));
     } else {
-      __ CompareImmediate(field_cid_operand, Immediate(value_cid), PP);
+      __ cmpl(field_cid_operand, Immediate(value_cid));
     }
     __ j(EQUAL, &ok);
 
@@ -1396,16 +1393,16 @@
     if (!field().needs_length_check()) {
       // Uninitialized field can be handled inline. Check if the
       // field is still unitialized.
-      __ CompareImmediate(field_cid_operand, Immediate(kIllegalCid), PP);
+      __ cmpl(field_cid_operand, Immediate(kIllegalCid));
       __ j(NOT_EQUAL, fail);
 
       if (value_cid == kDynamicCid) {
-        __ movq(field_cid_operand, value_cid_reg);
-        __ movq(field_nullability_operand, value_cid_reg);
+        __ movl(field_cid_operand, value_cid_reg);
+        __ movl(field_nullability_operand, value_cid_reg);
       } else {
         ASSERT(field_reg != kNoRegister);
-        __ LoadImmediate(field_cid_operand, Immediate(value_cid), PP);
-        __ LoadImmediate(field_nullability_operand, Immediate(value_cid), PP);
+        __ movl(field_cid_operand, Immediate(value_cid));
+        __ movl(field_nullability_operand, Immediate(value_cid));
       }
 
       if (deopt == NULL) {
@@ -1418,8 +1415,8 @@
       ASSERT(!compiler->is_optimizing());
       __ Bind(fail);
 
-      __ CompareImmediate(FieldAddress(field_reg, Field::guarded_cid_offset()),
-                          Immediate(kDynamicCid), PP);
+      __ cmpl(FieldAddress(field_reg, Field::guarded_cid_offset()),
+              Immediate(kDynamicCid));
       __ j(EQUAL, &ok);
 
       __ pushq(field_reg);
@@ -1585,8 +1582,8 @@
           ((IsPotentialUnboxedStore()) ? 3 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          !field().IsNull() &&
-          ((field().guarded_cid() == kIllegalCid) || is_initialization_)
+          ((IsUnboxedStore() && opt && is_initialization_) ||
+           IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
 
@@ -1688,7 +1685,7 @@
 
     __ LoadObject(temp, Field::ZoneHandle(field().raw()), PP);
 
-    __ cmpq(FieldAddress(temp, Field::is_nullable_offset()),
+    __ cmpl(FieldAddress(temp, Field::is_nullable_offset()),
             Immediate(kNullCid));
     __ j(EQUAL, &store_pointer);
 
@@ -1696,11 +1693,11 @@
     __ testq(temp2, Immediate(1 << Field::kUnboxingCandidateBit));
     __ j(ZERO, &store_pointer);
 
-    __ cmpq(FieldAddress(temp, Field::guarded_cid_offset()),
+    __ cmpl(FieldAddress(temp, Field::guarded_cid_offset()),
             Immediate(kDoubleCid));
     __ j(EQUAL, &store_double);
 
-    __ cmpq(FieldAddress(temp, Field::guarded_cid_offset()),
+    __ cmpl(FieldAddress(temp, Field::guarded_cid_offset()),
             Immediate(kFloat32x4Cid));
     __ j(EQUAL, &store_float32x4);
 
@@ -2190,19 +2187,19 @@
 
     __ LoadObject(result, Field::ZoneHandle(field()->raw()), PP);
 
-    __ cmpq(FieldAddress(result, Field::is_nullable_offset()),
+    __ cmpl(FieldAddress(result, Field::is_nullable_offset()),
             Immediate(kNullCid));
     __ j(EQUAL, &load_pointer);
 
-    __ cmpq(FieldAddress(result, Field::guarded_cid_offset()),
+    __ cmpl(FieldAddress(result, Field::guarded_cid_offset()),
             Immediate(kDoubleCid));
     __ j(EQUAL, &load_double);
 
-    __ cmpq(FieldAddress(result, Field::guarded_cid_offset()),
+    __ cmpl(FieldAddress(result, Field::guarded_cid_offset()),
             Immediate(kFloat32x4Cid));
     __ j(EQUAL, &load_float32x4);
 
-    __ cmpq(FieldAddress(result, Field::guarded_cid_offset()),
+    __ cmpl(FieldAddress(result, Field::guarded_cid_offset()),
             Immediate(kFloat64x2Cid));
     __ j(EQUAL, &load_float64x2);
 
@@ -2545,10 +2542,10 @@
     // stack checks.  Use progressively higher thresholds for more deeply
     // nested loops to attempt to hit outer loops with OSR when possible.
     __ LoadObject(temp, compiler->parsed_function().function(), PP);
-    intptr_t threshold =
+    int32_t threshold =
         FLAG_optimization_counter_threshold * (loop_depth() + 1);
-    __ CompareImmediate(FieldAddress(temp, Function::usage_counter_offset()),
-                        Immediate(threshold), PP);
+    __ cmpl(FieldAddress(temp, Function::usage_counter_offset()),
+            Immediate(threshold));
     __ j(GREATER_EQUAL, slow_path->osr_entry_label());
   }
   if (compiler->ForceSlowPathForStackOverflow()) {
@@ -2576,7 +2573,7 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->is_truncating();
+  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
@@ -2595,7 +2592,7 @@
     } else if ((value < 0) || (value >= kCountLimit)) {
       // This condition may not be known earlier in some cases because
       // of constant propagation, inlining, etc.
-      if ((value >=kCountLimit) && is_truncating) {
+      if ((value >= kCountLimit) && is_truncating) {
         __ xorq(result, result);
       } else {
         // Result is Mint or exception.
@@ -2658,8 +2655,7 @@
   if (is_truncating) {
     if (right_needs_check) {
       const bool right_may_be_negative =
-          (right_range == NULL) ||
-          !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+          (right_range == NULL) || !right_range->IsPositive();
       if (right_may_be_negative) {
         ASSERT(shift_left->CanDeoptimize());
         __ CompareImmediate(right, Immediate(0), PP);
@@ -2770,12 +2766,12 @@
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
-    const intptr_t kNumTemps = !is_truncating() ? 1 : 0;
+    const intptr_t kNumTemps = !IsTruncating() ? 1 : 0;
     LocationSummary* summary = new(isolate) LocationSummary(
         isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
-    if (!is_truncating()) {
+    if (!IsTruncating()) {
       summary->set_temp(0, Location::RequiresRegister());
     }
     summary->set_out(0, Location::SameAsFirstInput());
@@ -2802,7 +2798,6 @@
     return;
   }
 
-  ASSERT(!is_truncating());
   Register left = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(left == result);
@@ -3111,7 +3106,7 @@
         __ jmp(&all_done, Assembler::kNearJump);
         __ Bind(&subtract);
         __ subq(result, right);
-      } else if (right_range->IsWithin(0, RangeBoundary::kPlusInfinity)) {
+      } else if (right_range->IsPositive()) {
         // Right is positive.
         __ addq(result, right);
       } else {
@@ -3131,7 +3126,7 @@
       // sarq operation masks the count to 6 bits.
       const intptr_t kCountLimit = 0x3F;
       if ((right_range == NULL) ||
-          !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
+          !right_range->OnlyLessThanOrEqualTo(kCountLimit)) {
         __ CompareImmediate(right, Immediate(kCountLimit), PP);
         Label count_ok;
         __ j(LESS, &count_ok, Assembler::kNearJump);
@@ -4796,7 +4791,8 @@
                                target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.
-                               locs());
+                               locs(),
+                               ICData::Handle());
   __ Bind(&done);
 }
 
@@ -4808,7 +4804,7 @@
   LocationSummary* result = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
-  result->set_out(0, Location:: Location::RequiresRegister());
+  result->set_out(0, Location::RequiresRegister());
   result->set_temp(0, Location::RequiresRegister());
   return result;
 }
@@ -5252,7 +5248,7 @@
       __ jmp(&all_done, Assembler::kNearJump);
       __ Bind(&subtract);
       __ subq(RDX, right);
-    } else if (right_range->IsWithin(0, RangeBoundary::kPlusInfinity)) {
+    } else if (right_range->IsPositive()) {
       // Right is positive.
       __ addq(RDX, right);
     } else {
@@ -5329,7 +5325,8 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs());
+                                 locs(),
+                                 ICData::Handle());
     return;
   }
 
@@ -5595,7 +5592,7 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (compiler->NeedsEdgeCounter(this)) {
       compiler->EmitEdgeCounter();
     }
     // The deoptimization descriptor points after the edge counter code for
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index d619f5b..183540b 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -16,129 +16,129 @@
 // When adding a new function for intrinsification add a 0 as fingerprint,
 // build and run to get the correct fingerprint from the mismatch error.
 #define CORE_LIB_INTRINSIC_LIST(V)                                             \
-  V(_Smi, ~, Smi_bitNegate, 721565906)                                         \
-  V(_Smi, get:bitLength, Smi_bitLength, 383447247)                             \
-  V(_Double, >, Double_greaterThan, 196653614)                                 \
-  V(_Double, >=, Double_greaterEqualThan, 1420124977)                          \
-  V(_Double, <, Double_lessThan, 1368169970)                                   \
-  V(_Double, <=, Double_lessEqualThan, 117083409)                              \
-  V(_Double, ==, Double_equal, 617620743)                                      \
-  V(_Double, +, Double_add, 1618778505)                                        \
-  V(_Double, -, Double_sub, 355538766)                                         \
-  V(_Double, *, Double_mul, 1175404333)                                        \
-  V(_Double, /, Double_div, 1079430731)                                        \
-  V(_Double, get:isNaN, Double_getIsNaN, 916596113)                            \
-  V(_Double, get:isNegative, Double_getIsNegative, 1711421660)                 \
-  V(_Double, _mulFromInteger, Double_mulFromInteger, 1392340623)               \
-  V(_Double, .fromInteger, Double_fromInteger, 2033384877)                     \
-  V(_List, get:length, Array_getLength, 215183186)                             \
-  V(_List, [], Array_getIndexed, 675155875)                                    \
-  V(_List, []=, Array_setIndexed, 1228569706)                                  \
-  V(_GrowableList, .withData, GrowableList_Allocate, 264792196)                \
-  V(_GrowableList, get:length, GrowableList_getLength, 1654255033)             \
-  V(_GrowableList, get:_capacity, GrowableList_getCapacity, 817119794)         \
-  V(_GrowableList, [], GrowableList_getIndexed, 1282104248)                    \
-  V(_GrowableList, []=, GrowableList_setIndexed, 807019110)                    \
-  V(_GrowableList, _setLength, GrowableList_setLength, 823005129)              \
-  V(_GrowableList, _setData, GrowableList_setData, 970836644)                  \
-  V(_GrowableList, add, GrowableList_add, 1667349856)                          \
-  V(_ImmutableList, [], ImmutableList_getIndexed, 1768793932)                  \
-  V(_ImmutableList, get:length, ImmutableList_getLength, 578762861)            \
+  V(_Smi, ~, Smi_bitNegate, 105519892)                                         \
+  V(_Smi, get:bitLength, Smi_bitLength, 869956497)                             \
+  V(_Double, >, Double_greaterThan, 381325711)                                 \
+  V(_Double, >=, Double_greaterEqualThan, 1409267140)                          \
+  V(_Double, <, Double_lessThan, 2080387973)                                   \
+  V(_Double, <=, Double_lessEqualThan, 106225572)                              \
+  V(_Double, ==, Double_equal, 2093918133)                                     \
+  V(_Double, +, Double_add, 1646350451)                                        \
+  V(_Double, -, Double_sub, 1477459276)                                        \
+  V(_Double, *, Double_mul, 1334580777)                                        \
+  V(_Double, /, Double_div, 1938037155)                                        \
+  V(_Double, get:isNaN, Double_getIsNaN, 843050033)                            \
+  V(_Double, get:isNegative, Double_getIsNegative, 1637875580)                 \
+  V(_Double, _mulFromInteger, Double_mulFromInteger, 1594796483)               \
+  V(_Double, .fromInteger, Double_fromInteger, 999771940)                      \
+  V(_List, get:length, Array_getLength, 1181352729)                            \
+  V(_List, [], Array_getIndexed, 795612476)                                    \
+  V(_List, []=, Array_setIndexed, 1288827575)                                  \
+  V(_GrowableList, .withData, GrowableList_Allocate, 732923072)                \
+  V(_GrowableList, get:length, GrowableList_getLength, 778505107)              \
+  V(_GrowableList, get:_capacity, GrowableList_getCapacity, 555140075)         \
+  V(_GrowableList, [], GrowableList_getIndexed, 919108233)                     \
+  V(_GrowableList, []=, GrowableList_setIndexed, 1218649853)                   \
+  V(_GrowableList, _setLength, GrowableList_setLength, 89389299)               \
+  V(_GrowableList, _setData, GrowableList_setData, 2126927509)                 \
+  V(_GrowableList, add, GrowableList_add, 1899133961)                          \
+  V(_ImmutableList, [], ImmutableList_getIndexed, 1990177341)                  \
+  V(_ImmutableList, get:length, ImmutableList_getLength, 274917727)            \
   V(Object, ==, Object_equal, 1068471689)                                      \
-  V(_StringBase, get:hashCode, String_getHashCode, 654572819)                  \
-  V(_StringBase, get:isEmpty, String_getIsEmpty, 1599468763)                   \
-  V(_StringBase, get:length, String_getLength, 1483549854)                     \
-  V(_StringBase, codeUnitAt, String_codeUnitAt, 1958436584)                    \
-  V(_OneByteString, get:hashCode, OneByteString_getHashCode, 1236493807)       \
+  V(_StringBase, get:hashCode, String_getHashCode, 2102906241)                 \
+  V(_StringBase, get:isEmpty, String_getIsEmpty, 49873871)                     \
+  V(_StringBase, get:length, String_getLength, 784399628)                      \
+  V(_StringBase, codeUnitAt, String_codeUnitAt, 397735324)                     \
+  V(_OneByteString, get:hashCode, OneByteString_getHashCode, 1111837929)       \
   V(_OneByteString, _substringUncheckedNative,                                 \
-      OneByteString_substringUnchecked, 25652388)                              \
-  V(_OneByteString, _setAt, OneByteString_setAt, 658941003)                    \
-  V(_OneByteString, _allocate, OneByteString_allocate, 2084097266)             \
-  V(_OneByteString, ==, OneByteString_equality, 1194175975)                    \
-  V(_TwoByteString, ==, TwoByteString_equality, 1746891238)                    \
+      OneByteString_substringUnchecked, 1527498975)                            \
+  V(_OneByteString, _setAt, OneByteString_setAt, 468605749)                    \
+  V(_OneByteString, _allocate, OneByteString_allocate, 2035417022)             \
+  V(_OneByteString, ==, OneByteString_equality, 1727047023)                    \
+  V(_TwoByteString, ==, TwoByteString_equality, 951149689)                     \
 
 
 #define CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                     \
   V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger,           \
-    740884607)                                                                 \
-  V(_IntegerImplementation, +, Integer_add, 1875695122)                        \
+    438687793)                                                                 \
+  V(_IntegerImplementation, +, Integer_add, 837070328)                         \
   V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger,           \
-    584777821)                                                                 \
-  V(_IntegerImplementation, -, Integer_sub, 893955487)                         \
+    562800077)                                                                 \
+  V(_IntegerImplementation, -, Integer_sub, 1904782019)                        \
   V(_IntegerImplementation, _mulFromInteger, Integer_mulFromInteger,           \
-    1757603756)                                                                \
-  V(_IntegerImplementation, *, Integer_mul, 949111327)                         \
+    67891834)                                                                  \
+  V(_IntegerImplementation, *, Integer_mul, 1012952097)                        \
   V(_IntegerImplementation, _moduloFromInteger, Integer_moduloFromInteger,     \
-    1398988805)                                                                \
-  V(_IntegerImplementation, ~/, Integer_truncDivide, 1011141318)               \
-  V(_IntegerImplementation, unary-, Integer_negate, 145678255)                 \
+    93478264)                                                                  \
+  V(_IntegerImplementation, ~/, Integer_truncDivide, 724644222)                \
+  V(_IntegerImplementation, unary-, Integer_negate, 2095203689)                \
   V(_IntegerImplementation, _bitAndFromInteger,                                \
-    Integer_bitAndFromInteger, 512285096)                                      \
-  V(_IntegerImplementation, &, Integer_bitAnd, 691305985)                      \
+    Integer_bitAndFromInteger, 504496713)                                      \
+  V(_IntegerImplementation, &, Integer_bitAnd, 347192674)                      \
   V(_IntegerImplementation, _bitOrFromInteger,                                 \
-    Integer_bitOrFromInteger, 333543947)                                       \
-  V(_IntegerImplementation, |, Integer_bitOr, 76287380)                        \
+    Integer_bitOrFromInteger, 1763728073)                                      \
+  V(_IntegerImplementation, |, Integer_bitOr, 1293445202)                      \
   V(_IntegerImplementation, _bitXorFromInteger,                                \
-    Integer_bitXorFromInteger, 1746295953)                                     \
-  V(_IntegerImplementation, ^, Integer_bitXor, 1124672916)                     \
+    Integer_bitXorFromInteger, 281425907)                                      \
+  V(_IntegerImplementation, ^, Integer_bitXor, 2139935734)                     \
   V(_IntegerImplementation,                                                    \
     _greaterThanFromInteger,                                                   \
-    Integer_greaterThanFromInt, 1883218996)                                    \
-  V(_IntegerImplementation, >, Integer_greaterThan, 1356697302)                \
-  V(_IntegerImplementation, ==, Integer_equal, 1631095021)                     \
+    Integer_greaterThanFromInt, 787426822)                                     \
+  V(_IntegerImplementation, >, Integer_greaterThan, 123961041)                 \
+  V(_IntegerImplementation, ==, Integer_equal, 1423724294)                     \
   V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger,           \
-    111745915)                                                                 \
-  V(_IntegerImplementation, <, Integer_lessThan, 1523713072)                   \
-  V(_IntegerImplementation, <=, Integer_lessEqualThan, 671929679)              \
-  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 1974971247)          \
-  V(_IntegerImplementation, <<, Integer_shl, 521759411)                        \
-  V(_IntegerImplementation, >>, Integer_sar, 800510700)                        \
-  V(_Double, toInt, Double_toInt, 1328149975)
+    1790821042)                                                                \
+  V(_IntegerImplementation, <, Integer_lessThan, 425560117)                    \
+  V(_IntegerImplementation, <=, Integer_lessEqualThan, 1512735828)             \
+  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 668293748)           \
+  V(_IntegerImplementation, <<, Integer_shl, 34265041)                         \
+  V(_IntegerImplementation, >>, Integer_sar, 1797129864)                       \
+  V(_Double, toInt, Double_toInt, 1547535151)
 
 
 #define MATH_LIB_INTRINSIC_LIST(V)                                             \
-  V(::, sqrt, Math_sqrt, 465520247)                                            \
-  V(_Random, _nextState, Random_nextState, 1174301422)                         \
+  V(::, sqrt, Math_sqrt, 101545548)                                            \
+  V(_Random, _nextState, Random_nextState, 55890711)                           \
 
 
 #define TYPED_DATA_LIB_INTRINSIC_LIST(V)                                       \
-  V(_TypedList, get:length, TypedData_getLength, 26646119)                     \
-  V(_Int8Array, _new, TypedData_Int8Array_new, 18350202)                       \
-  V(_Uint8Array, _new, TypedData_Uint8Array_new, 2118071523)                   \
-  V(_Uint8ClampedArray, _new, TypedData_Uint8ClampedArray_new, 908783182)      \
-  V(_Int16Array, _new, TypedData_Int16Array_new, 422885769)                    \
-  V(_Uint16Array, _new, TypedData_Uint16Array_new, 1401544578)                 \
-  V(_Int32Array, _new, TypedData_Int32Array_new, 204107275)                    \
-  V(_Uint32Array, _new, TypedData_Uint32Array_new, 941458944)                  \
-  V(_Int64Array, _new, TypedData_Int64Array_new, 1022695954)                   \
-  V(_Uint64Array, _new, TypedData_Uint64Array_new, 728124050)                  \
-  V(_Float32Array, _new, TypedData_Float32Array_new, 123728871)                \
-  V(_Float64Array, _new, TypedData_Float64Array_new, 311965335)                \
-  V(_Float32x4Array, _new, TypedData_Float32x4Array_new, 775330800)            \
-  V(_Int32x4Array, _new, TypedData_Int32x4Array_new, 2074077580)               \
-  V(_Float64x2Array, _new, TypedData_Float64x2Array_new, 1540328543)           \
-  V(_Int8Array, ., TypedData_Int8Array_factory, 545976988)                     \
-  V(_Uint8Array, ., TypedData_Uint8Array_factory, 981297074)                   \
-  V(_Uint8ClampedArray, ., TypedData_Uint8ClampedArray_factory, 1617830104)    \
-  V(_Int16Array, ., TypedData_Int16Array_factory, 300928419)                   \
-  V(_Uint16Array, ., TypedData_Uint16Array_factory, 480982704)                 \
-  V(_Int32Array, ., TypedData_Int32Array_factory, 1876611964)                  \
-  V(_Uint32Array, ., TypedData_Uint32Array_factory, 1811693442)                \
-  V(_Int64Array, ., TypedData_Int64Array_factory, 958749261)                   \
-  V(_Uint64Array, ., TypedData_Uint64Array_factory, 767338823)                 \
-  V(_Float32Array, ., TypedData_Float32Array_factory, 1721244151)              \
-  V(_Float64Array, ., TypedData_Float64Array_factory, 1599078532)              \
-  V(_Float32x4Array, ., TypedData_Float32x4Array_factory, 879975401)           \
-  V(_Int32x4Array, ., TypedData_Int32x4Array_factory, 924582681)               \
-  V(_Float64x2Array, ., TypedData_Float64x2Array_factory, 1654170890)          \
-  V(_Uint8Array, [], Uint8Array_getIndexed, 738731818)                         \
-  V(_ExternalUint8Array, [], ExternalUint8Array_getIndexed, 2067666479)        \
+  V(_TypedList, get:length, TypedData_getLength, 522565357)                    \
+  V(_Int8Array, _new, TypedData_Int8Array_new, 1150131819)                     \
+  V(_Uint8Array, _new, TypedData_Uint8Array_new, 2019665760)                   \
+  V(_Uint8ClampedArray, _new, TypedData_Uint8ClampedArray_new, 726412668)      \
+  V(_Int16Array, _new, TypedData_Int16Array_new, 1879541015)                   \
+  V(_Uint16Array, _new, TypedData_Uint16Array_new, 189496401)                  \
+  V(_Int32Array, _new, TypedData_Int32Array_new, 1725327048)                   \
+  V(_Uint32Array, _new, TypedData_Uint32Array_new, 10306485)                   \
+  V(_Int64Array, _new, TypedData_Int64Array_new, 1299501918)                   \
+  V(_Uint64Array, _new, TypedData_Uint64Array_new, 1635318703)                 \
+  V(_Float32Array, _new, TypedData_Float32Array_new, 577737480)                \
+  V(_Float64Array, _new, TypedData_Float64Array_new, 645355686)                \
+  V(_Float32x4Array, _new, TypedData_Float32x4Array_new, 596639418)            \
+  V(_Int32x4Array, _new, TypedData_Int32x4Array_new, 496358233)                \
+  V(_Float64x2Array, _new, TypedData_Float64x2Array_new, 1506975080)           \
+  V(_Int8Array, ., TypedData_Int8Array_factory, 1499010120)                    \
+  V(_Uint8Array, ., TypedData_Uint8Array_factory, 354210806)                   \
+  V(_Uint8ClampedArray, ., TypedData_Uint8ClampedArray_factory, 231626935)     \
+  V(_Int16Array, ., TypedData_Int16Array_factory, 1044203454)                  \
+  V(_Uint16Array, ., TypedData_Uint16Array_factory, 616427808)                 \
+  V(_Int32Array, ., TypedData_Int32Array_factory, 26656923)                    \
+  V(_Uint32Array, ., TypedData_Uint32Array_factory, 297463966)                 \
+  V(_Int64Array, ., TypedData_Int64Array_factory, 105050331)                   \
+  V(_Uint64Array, ., TypedData_Uint64Array_factory, 1469861670)                \
+  V(_Float32Array, ., TypedData_Float32Array_factory, 105860920)               \
+  V(_Float64Array, ., TypedData_Float64Array_factory, 342242776)               \
+  V(_Float32x4Array, ., TypedData_Float32x4Array_factory, 1217848993)          \
+  V(_Int32x4Array, ., TypedData_Int32x4Array_factory, 100825417)               \
+  V(_Float64x2Array, ., TypedData_Float64x2Array_factory, 611308575)           \
+  V(_Uint8Array, [], Uint8Array_getIndexed, 16125140)                          \
+  V(_ExternalUint8Array, [], ExternalUint8Array_getIndexed, 1678777951)        \
 
 
 #define PROFILER_LIB_INTRINSIC_LIST(V)                                         \
-  V(_UserTag, makeCurrent, UserTag_makeCurrent, 2084603703)                    \
-  V(::, _getDefaultTag, UserTag_defaultTag, 624228668)                         \
-  V(::, _getCurrentTag, Profiler_getCurrentTag, 1559793589)                    \
+  V(_UserTag, makeCurrent, UserTag_makeCurrent, 370414636)                     \
+  V(::, _getDefaultTag, UserTag_defaultTag, 1159885970)                        \
+  V(::, _getCurrentTag, Profiler_getCurrentTag, 1182126114)                    \
 
 // TODO(srdjan): Implement _FixedSizeArrayIterator, get:current and
 //   _FixedSizeArrayIterator, moveNext.
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index b0dd01c..11ac497 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -949,9 +949,8 @@
   __ b(&fall_through, NE);
   // Receiver is Mint, return false if right is Smi.
   __ tst(R0, Operand(kSmiTagMask));
-  __ b(&fall_through, NE);
-  __ LoadObject(R0, Bool::False());
-  __ Ret();
+  __ LoadObject(R0, Bool::False(), EQ);
+  __ bx(LR, EQ);
   // TODO(srdjan): Implement Mint == Mint comparison.
 
   __ Bind(&fall_through);
@@ -1228,9 +1227,8 @@
     // Overflow is signaled with minint.
     // Check for overflow and that it fits into Smi.
     __ CompareImmediate(R0, 0xC0000000);
-    __ b(&fall_through, MI);
-    __ SmiTag(R0);
-    __ Ret();
+    __ SmiTag(R0, PL);
+    __ bx(LR, PL);
     __ Bind(&fall_through);
   }
 }
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index fd7ca91..e0d6df2 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -355,6 +355,7 @@
       last_allocationprofile_gc_timestamp_(0),
       cha_used_(false),
       object_id_ring_(NULL),
+      trace_buffer_(NULL),
       profiler_data_(NULL),
       thread_state_(NULL),
       tag_table_(GrowableObjectArray::null()),
@@ -768,6 +769,10 @@
   ASSERT(top_resource() == NULL);
   ASSERT((heap_ == NULL) || heap_->Verify());
 
+  // Remove this isolate from the list *before* we start tearing it down, to
+  // avoid exposing it in a state of decay.
+  RemoveIsolateFromList(this);
+
   // Create an area where we do have a zone and a handle scope so that we can
   // call VM functions while tearing this isolate down.
   {
@@ -811,7 +816,6 @@
   // TODO(5411455): For now just make sure there are no current isolates
   // as we are shutting down the isolate.
   SetCurrent(NULL);
-  RemoveIsolateFromList(this);
   Profiler::ShutdownProfilingForIsolate(this);
 }
 
@@ -1018,21 +1022,26 @@
 
 
 intptr_t Isolate::ProfileInterrupt() {
-  if (profiler_data() == NULL) {
+  // Other threads might be modifying these fields. Save them in locals so that
+  // we can at least trust the NULL check.
+  IsolateProfilerData* prof_data = profiler_data();
+  if (prof_data == NULL) {
     // Profiler not setup for isolate.
     return 0;
   }
-  if (profiler_data()->blocked()) {
+  if (prof_data->blocked()) {
     // Profiler blocked for this isolate.
     return 0;
   }
-  if ((debugger() != NULL) && debugger()->IsPaused()) {
+  Debugger* debug = debugger();
+  if ((debug != NULL) && debug->IsPaused()) {
     // Paused at breakpoint. Don't tick.
     return 0;
   }
-  if ((message_handler() != NULL) &&
-      (message_handler()->paused_on_start() ||
-       message_handler()->paused_on_exit())) {
+  MessageHandler* msg_handler = message_handler();
+  if ((msg_handler != NULL) &&
+      (msg_handler->paused_on_start() ||
+       msg_handler->paused_on_exit())) {
     // Paused at start / exit . Don't tick.
     return 0;
   }
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 7dfa9bb..7770f11 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -10,11 +10,13 @@
 #include "platform/thread.h"
 #include "vm/base_isolate.h"
 #include "vm/class_table.h"
+#include "vm/counters.h"
 #include "vm/handles.h"
 #include "vm/megamorphic_cache_table.h"
 #include "vm/random.h"
 #include "vm/store_buffer.h"
 #include "vm/tags.h"
+#include "vm/trace_buffer.h"
 #include "vm/timer.h"
 
 namespace dart {
@@ -29,6 +31,7 @@
 class Debugger;
 class DeoptContext;
 class Error;
+class ExceptionHandlers;
 class Field;
 class Function;
 class GrowableObjectArray;
@@ -48,6 +51,7 @@
 class ObjectIdRing;
 class ObjectPointerVisitor;
 class ObjectStore;
+class PcDescriptors;
 class RawInstance;
 class RawArray;
 class RawContext;
@@ -87,12 +91,14 @@
   V(Class)                                                                     \
   V(Code)                                                                      \
   V(Error)                                                                     \
+  V(ExceptionHandlers)                                                         \
   V(Field)                                                                     \
   V(Function)                                                                  \
   V(GrowableObjectArray)                                                       \
   V(Instance)                                                                  \
   V(Library)                                                                   \
   V(Object)                                                                    \
+  V(PcDescriptors)                                                             \
   V(String)                                                                    \
   V(TypeArguments)                                                             \
   V(TypeParameter)                                                             \
@@ -446,6 +452,13 @@
     return object_id_ring_;
   }
 
+  void set_trace_buffer(TraceBuffer* buffer) {
+    trace_buffer_ = buffer;
+  }
+  TraceBuffer* trace_buffer() {
+    return trace_buffer_;
+  }
+
   DeoptContext* deopt_context() const { return deopt_context_; }
   void set_deopt_context(DeoptContext* value) {
     ASSERT(value == NULL || deopt_context_ == NULL);
@@ -454,7 +467,7 @@
 
   void UpdateLastAllocationProfileAccumulatorResetTimestamp() {
     last_allocationprofile_accumulator_reset_timestamp_ =
-      OS::GetCurrentTimeMillis();
+        OS::GetCurrentTimeMillis();
   }
 
   int64_t last_allocationprofile_accumulator_reset_timestamp() const {
@@ -551,6 +564,8 @@
 
   static void VisitIsolates(IsolateVisitor* visitor);
 
+  Counters* counters() { return &counters_; }
+
  private:
   Isolate();
 
@@ -618,6 +633,9 @@
   // Ring buffer of objects assigned an id.
   ObjectIdRing* object_id_ring_;
 
+  // Trace buffer support.
+  TraceBuffer* trace_buffer_;
+
   IsolateProfilerData* profiler_data_;
   Mutex profiler_data_mutex_;
   InterruptableThreadState* thread_state_;
@@ -627,6 +645,8 @@
   RawGrowableObjectArray* tag_table_;
   RawUserTag* current_tag_;
 
+  Counters counters_;
+
   // Isolate list next pointer.
   Isolate* next_;
 
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index be4abf7..2726c8a 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -216,6 +216,12 @@
 }
 
 
+void JSONStream::PrintValueNoEscape(const char* s) {
+  PrintCommaIfNeeded();
+  buffer_.Printf("%s", s);
+}
+
+
 void JSONStream::PrintfValue(const char* format, ...) {
   PrintCommaIfNeeded();
 
@@ -289,6 +295,12 @@
 }
 
 
+void JSONStream::PrintPropertyNoEscape(const char* name, const char* s) {
+  PrintPropertyName(name);
+  PrintValueNoEscape(s);
+}
+
+
 void JSONStream::PrintProperty(const char* name, const DebuggerEvent* event) {
   PrintPropertyName(name);
   PrintValue(event);
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index ddebaa7..08371e1 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -83,6 +83,7 @@
   void PrintValue64(int64_t i);
   void PrintValue(double d);
   void PrintValue(const char* s);
+  void PrintValueNoEscape(const char* s);
   void PrintfValue(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
   void PrintValue(const Object& o, bool ref = true);
   void PrintValue(SourceBreakpoint* bpt);
@@ -94,6 +95,7 @@
   void PrintProperty64(const char* name, int64_t i);
   void PrintProperty(const char* name, double d);
   void PrintProperty(const char* name, const char* s);
+  void PrintPropertyNoEscape(const char* name, const char* s);
   void PrintfProperty(const char* name, const char* format, ...)
   PRINTF_ATTRIBUTE(3, 4);
   void PrintProperty(const char* name, const Object& o, bool ref = true);
@@ -153,6 +155,9 @@
   void AddProperty(const char* name, const char* s) const {
     stream_->PrintProperty(name, s);
   }
+  void AddPropertyNoEscape(const char* name, const char* s) const {
+    stream_->PrintPropertyNoEscape(name, s);
+  }
   void AddProperty(const char* name, const Object& obj, bool ref = true) const {
     stream_->PrintProperty(name, obj, ref);
   }
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 7a617a3..91ed897 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -472,17 +472,20 @@
   }
 
   bool ContainsRegister(Register reg) const {
-    return (cpu_registers_ & (1 << reg)) != 0;
+    return Contains(cpu_registers_, reg);
   }
 
   bool ContainsFpuRegister(FpuRegister fpu_reg) const {
-    return (fpu_registers_ & (1 << fpu_reg)) != 0;
+    return Contains(fpu_registers_, fpu_reg);
   }
 
   intptr_t CpuRegisterCount() const { return RegisterCount(cpu_registers_); }
   intptr_t FpuRegisterCount() const { return RegisterCount(fpu_registers_); }
 
   static intptr_t RegisterCount(intptr_t registers);
+  static bool Contains(intptr_t register_set, intptr_t reg) {
+    return (register_set & (1 << reg)) != 0;
+  }
 
   intptr_t cpu_registers() const { return cpu_registers_; }
   intptr_t fpu_registers() const { return fpu_registers_; }
diff --git a/runtime/vm/memory_region.h b/runtime/vm/memory_region.h
index 25ef768..eaa5221 100644
--- a/runtime/vm/memory_region.h
+++ b/runtime/vm/memory_region.h
@@ -6,6 +6,7 @@
 #define VM_MEMORY_REGION_H_
 
 #include "platform/assert.h"
+#include "vm/allocation.h"
 #include "vm/globals.h"
 
 namespace dart {
@@ -13,10 +14,16 @@
 // Memory regions are useful for accessing memory with bounds check in
 // debug mode. They can be safely passed by value and do not assume ownership
 // of the region.
-class MemoryRegion {
+class MemoryRegion : public ValueObject {
  public:
   MemoryRegion() : pointer_(NULL), size_(0) { }
   MemoryRegion(void* pointer, uword size) : pointer_(pointer), size_(size) { }
+  MemoryRegion(const MemoryRegion& other) : ValueObject() { *this = other; }
+  MemoryRegion& operator=(const MemoryRegion& other) {
+    pointer_ = other.pointer_;
+    size_ = other.size_;
+    return *this;
+  }
 
   void* pointer() const { return pointer_; }
   uword size() const { return size_; }
@@ -68,8 +75,6 @@
 
   void* pointer_;
   uword size_;
-
-  DISALLOW_COPY_AND_ASSIGN(MemoryRegion);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index d42e4b2..4e085ac 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -32,10 +32,10 @@
 #include "vm/heap.h"
 #include "vm/intermediate_language.h"
 #include "vm/intrinsifier.h"
-#include "vm/longjump.h"
 #include "vm/object_id_ring.h"
 #include "vm/object_store.h"
 #include "vm/parser.h"
+#include "vm/report.h"
 #include "vm/reusable_handles.h"
 #include "vm/runtime_entry.h"
 #include "vm/scopes.h"
@@ -225,16 +225,20 @@
   String& segment = String::Handle();
   intptr_t start_pos = 0;
   for (intptr_t i = 0; i < name.Length(); i++) {
-    if (name.CharAt(i) == '@') {
+    if (name.CharAt(i) == '@' &&
+        (i+1) < name.Length() &&
+        (name.CharAt(i+1) >= '0') &&
+        (name.CharAt(i+1) <= '9')) {
       // Append the current segment to the unmangled name.
       segment = String::SubString(name, start_pos, (i - start_pos));
       unmangled_name = String::Concat(unmangled_name, segment);
 
-      // Advance until past the name mangling.
+      // Advance until past the name mangling. The private keys are only
+      // numbers so we skip until the first non-number.
       i++;  // Skip the '@'.
       while ((i < name.Length()) &&
-             (name.CharAt(i) != '&') &&
-             (name.CharAt(i) != '.')) {
+             (name.CharAt(i) >= '0') &&
+             (name.CharAt(i) <= '9')) {
         i++;
       }
       start_pos = i;
@@ -702,11 +706,11 @@
   String& error_str = String::Handle();
   error_str = String::New("SnapshotWriter Error", Heap::kOld);
   *snapshot_writer_error_ = LanguageError::New(error_str,
-                                               LanguageError::kError,
+                                               Report::kError,
                                                Heap::kOld);
   error_str = String::New("Branch offset overflow", Heap::kOld);
   *branch_offset_error_ = LanguageError::New(error_str,
-                                             LanguageError::kBailout,
+                                             Report::kBailout,
                                              Heap::kOld);
 
   ASSERT(!null_object_->IsSmi());
@@ -1025,6 +1029,7 @@
       Library::Handle(isolate, Library::LookupLibrary(Symbols::DartIsolate()));
   if (isolate_lib.IsNull()) {
     isolate_lib = Library::NewLibraryHelper(Symbols::DartIsolate(), true);
+    isolate_lib.SetLoadRequested();
     isolate_lib.Register();
     isolate->object_store()->set_bootstrap_library(ObjectStore::kIsolate,
                                                    isolate_lib);
@@ -1153,6 +1158,7 @@
   lib = Library::LookupLibrary(Symbols::DartMirrors());
   if (lib.IsNull()) {
     lib = Library::NewLibraryHelper(Symbols::DartMirrors(), true);
+    lib.SetLoadRequested();
     lib.Register();
     isolate->object_store()->set_bootstrap_library(ObjectStore::kMirrors,
                                                    lib);
@@ -1168,6 +1174,7 @@
   lib = Library::LookupLibrary(Symbols::DartProfiler());
   if (lib.IsNull()) {
     lib = Library::NewLibraryHelper(Symbols::DartProfiler(), true);
+    lib.SetLoadRequested();
     lib.Register();
     isolate->object_store()->set_bootstrap_library(ObjectStore::kProfiler,
                                                    lib);
@@ -1191,6 +1198,7 @@
   lib = Library::LookupLibrary(Symbols::DartTypedData());
   if (lib.IsNull()) {
     lib = Library::NewLibraryHelper(Symbols::DartTypedData(), true);
+    lib.SetLoadRequested();
     lib.Register();
     isolate->object_store()->set_bootstrap_library(ObjectStore::kTypedData,
                                                    lib);
@@ -1364,6 +1372,30 @@
   // Set up recognized state of all functions (core, math and typed data).
   MethodRecognizer::InitializeState();
 
+  // Adds static const fields (class ids) to the class 'ClassID');
+  lib = Library::LookupLibrary(Symbols::DartInternal());
+  ASSERT(!lib.IsNull());
+  cls = lib.LookupClassAllowPrivate(Symbols::ClassID());
+  ASSERT(!cls.IsNull());
+  Field& field = Field::Handle(isolate);
+  Smi& value = Smi::Handle(isolate);
+  String& field_name = String::Handle(isolate);
+
+#define CLASS_LIST_WITH_NULL(V)                                                \
+  V(Null)                                                                      \
+  CLASS_LIST_NO_OBJECT(V)
+
+#define ADD_SET_FIELD(clazz)                                                   \
+  field_name = Symbols::New("cid"#clazz);                                      \
+  field = Field::New(field_name, true, false, true, cls, 0);                   \
+  value = Smi::New(k##clazz##Cid);                                             \
+  field.set_value(value);                                                      \
+  field.set_type(Type::Handle(Type::IntType()));                               \
+  cls.AddField(field);                                                         \
+
+  CLASS_LIST_WITH_NULL(ADD_SET_FIELD)
+#undef ADD_SET_FIELD
+
   return Error::null();
 }
 
@@ -1564,7 +1596,7 @@
     // into dart code or allocating any code.
     const Instance& exception =
         Instance::Handle(isolate->object_store()->out_of_memory());
-    Exceptions::Throw(exception);
+    Exceptions::Throw(isolate, exception);
     UNREACHABLE();
   }
   if (space == Heap::kNew) {
@@ -1759,17 +1791,12 @@
 
 
 static void ReportTooManyTypeArguments(const Class& cls) {
-  const Error& error = Error::Handle(
-      LanguageError::NewFormatted(
-          Error::Handle(),  // No previous error.
-          Script::Handle(cls.script()),
-          cls.token_pos(),
-          LanguageError::kError,
-          Heap::kNew,
-          "too many type parameters declared in class '%s' or in its "
-          "super classes",
-          String::Handle(cls.Name()).ToCString()));
-  Isolate::Current()->long_jump_base()->Jump(1, error);
+  Report::MessageF(Report::kError,
+                   Script::Handle(cls.script()),
+                   cls.token_pos(),
+                   "too many type parameters declared in class '%s' or in its "
+                   "super classes",
+                   String::Handle(cls.Name()).ToCString());
   UNREACHABLE();
 }
 
@@ -2515,6 +2542,7 @@
         function.SwitchToUnoptimizedCode();
       } else if (function.unoptimized_code() == code.raw()) {
         ReportSwitchingCode(code);
+        function.ClearICData();
         // Remove the code object from the function. The next time the
         // function is invoked, it will be compiled again.
         function.ClearCode();
@@ -2523,12 +2551,13 @@
         if (!CodePatcher::IsEntryPatched(code)) {
           CodePatcher::PatchEntry(code);
         }
-      } else if (!function.HasCode() && (code.GetEntryPatchPc() != 0)) {
-        // The code has already been disconnected, make it invalid. Do not
-        // bother with OSR compiled code that has no valid entry-patch.
-        ReportSwitchingCode(code);
-        if (!CodePatcher::IsEntryPatched(code)) {
-          CodePatcher::PatchEntry(code);
+      } else {
+        // Make non-OSR code non-entrant.
+        if (code.GetEntryPatchPc() != 0) {
+          if (!CodePatcher::IsEntryPatched(code)) {
+            ReportSwitchingCode(code);
+            CodePatcher::PatchEntry(code);
+          }
         }
       }
     }
@@ -2643,7 +2672,7 @@
           *error,  // No previous error.
           Script::Handle(patch.script()),
           func.token_pos(),
-          LanguageError::kError,
+          Report::kError,
           Heap::kNew,
           "signature mismatch: '%s'", member_name.ToCString());
       return false;
@@ -2688,7 +2717,7 @@
           *error,  // No previous error.
           Script::Handle(patch.script()),
           field.token_pos(),
-          LanguageError::kError,
+          Report::kError,
           Heap::kNew,
           "duplicate field: %s", member_name.ToCString());
       return false;
@@ -2790,7 +2819,7 @@
   ASSERT(isolate != NULL);
   const Error& error = Error::Handle(isolate, Compiler::CompileClass(*this));
   if (!error.IsNull() && (isolate->long_jump_base() != NULL)) {
-    isolate->long_jump_base()->Jump(1, error);
+    Report::LongJump(error);
     UNREACHABLE();
   }
   return error.raw();
@@ -4062,7 +4091,7 @@
     ClassTable* class_table = Isolate::Current()->class_table();
     const ClassHeapStats* stats = class_table->StatsWithUpdatedSize(id());
     if (stats != NULL) {
-     JSONObject allocation_stats(&jsobj, "allocationStats");
+      JSONObject allocation_stats(&jsobj, "allocationStats");
       stats->PrintToJSONObject(*this, &allocation_stats);
     }
   }
@@ -4684,7 +4713,7 @@
 RawAbstractType** TypeArguments::TypeAddr(intptr_t index) const {
   // TODO(iposva): Determine if we should throw an exception here.
   ASSERT((index >= 0) && (index < Length()));
-  return &raw_ptr()->types_[index];
+  return &raw_ptr()->types()[index];
 }
 
 
@@ -5754,7 +5783,7 @@
         *bound_error,  // A bound error if non null.
         Script::Handle(other.script()),
         other.token_pos(),
-        LanguageError::kError,
+        Report::kError,
         Heap::kNew,
         "signature type '%s' of function '%s' is not a subtype of signature "
         "type '%s' of function '%s'",
@@ -6016,6 +6045,7 @@
   clone.set_deoptimization_counter(0);
   clone.set_optimized_instruction_count(0);
   clone.set_optimized_call_site_count(0);
+  clone.set_ic_data_array(Array::Handle());
   return clone.raw();
 }
 
@@ -6415,6 +6445,64 @@
 }
 
 
+void Function::SaveICDataMap(
+    const ZoneGrowableArray<const ICData*>& deopt_id_to_ic_data) const {
+  // Compute number of ICData objectsto save.
+  intptr_t count = 0;
+  for (intptr_t i = 0; i < deopt_id_to_ic_data.length(); i++) {
+    if (deopt_id_to_ic_data[i] != NULL) {
+      count++;
+    }
+  }
+
+  const Array& a = Array::Handle(Array::New(count, Heap::kOld));
+  count = 0;
+  for (intptr_t i = 0; i < deopt_id_to_ic_data.length(); i++) {
+    if (deopt_id_to_ic_data[i] != NULL) {
+      a.SetAt(count++, *deopt_id_to_ic_data[i]);
+    }
+  }
+  set_ic_data_array(a);
+}
+
+
+void Function::RestoreICDataMap(
+    ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data) const {
+  Isolate* isolate = Isolate::Current();
+  const Array& saved_icd = Array::Handle(isolate, ic_data_array());
+  if (saved_icd.Length() == 0) {
+    deopt_id_to_ic_data->Clear();
+    return;;
+  }
+  ICData& icd = ICData::Handle();
+  icd ^= saved_icd.At(saved_icd.Length() - 1);
+  const intptr_t len = icd.deopt_id() + 1;
+  deopt_id_to_ic_data->SetLength(len);
+  for (intptr_t i = 0; i < len; i++) {
+    (*deopt_id_to_ic_data)[i] = NULL;
+  }
+  for (intptr_t i = 0; i < saved_icd.Length(); i++) {
+    ICData& icd = ICData::ZoneHandle(isolate);
+    icd ^= saved_icd.At(i);
+    (*deopt_id_to_ic_data)[icd.deopt_id()] = &icd;
+  }
+}
+
+
+void Function::set_ic_data_array(const Array& value) const {
+  StorePointer(&raw_ptr()->ic_data_array_, value.raw());
+}
+
+
+RawArray* Function::ic_data_array() const {
+  return raw_ptr()->ic_data_array_;
+}
+
+void Function::ClearICData() const {
+  set_ic_data_array(Array::Handle());
+}
+
+
 bool Function::CheckSourceFingerprint(int32_t fp) const {
   if (SourceFingerprint() != fp) {
     const bool recalculatingFingerprints = false;
@@ -7822,12 +7910,15 @@
 
 
 RawGrowableObjectArray* Script::GenerateLineNumberArray() const {
+  Isolate* isolate = Isolate::Current();
   const GrowableObjectArray& info =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
-  const String& source = String::Handle(Source());
+      GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
+  const String& source = String::Handle(isolate, Source());
   const String& key = Symbols::Empty();
-  const Object& line_separator = Object::Handle();
-  const TokenStream& tkns = TokenStream::Handle(tokens());
+  const Object& line_separator = Object::Handle(isolate);
+  const TokenStream& tkns = TokenStream::Handle(isolate, tokens());
+  Smi& value = Smi::Handle(isolate);
+  String& tokenValue = String::Handle(isolate);
   ASSERT(!tkns.IsNull());
   TokenStream::Iterator tkit(tkns, 0, TokenStream::Iterator::kAllTokens);
   int current_line = -1;
@@ -7865,7 +7956,7 @@
           (s.current_token().kind == Token::kINTERPOL_VAR ||
            s.current_token().kind == Token::kINTERPOL_START) &&
           tkit.CurrentTokenKind() == Token::kSTRING) {
-        const String& tokenValue = String::Handle(tkit.CurrentLiteral());
+        tokenValue = tkit.CurrentLiteral();
         if (tokenValue.Length() == 0) {
           tkit.Advance();
         }
@@ -7877,19 +7968,22 @@
     if (token_line != current_line) {
       // emit line
       info.Add(line_separator);
-      info.Add(Smi::Handle(Smi::New(token_line + line_offset())));
+      value = Smi::New(token_line + line_offset());
+      info.Add(value);
       current_line = token_line;
     }
     // TODO(hausner): Could optimize here by not reporting tokens
     // that will never be a location used by the debugger, e.g.
     // braces, semicolons, most keywords etc.
-    info.Add(Smi::Handle(Smi::New(tkit.CurrentPosition())));
+    value = Smi::New(tkit.CurrentPosition());
+    info.Add(value);
     int column = s.current_token().position.column;
     // On the first line of the script we must add the column offset.
     if (token_line == 1) {
       column += col_offset();
     }
-    info.Add(Smi::Handle(Smi::New(column)));
+    value = Smi::New(column);
+    info.Add(value);
     tkit.Advance();
     s.Scan();
   }
@@ -8213,6 +8307,54 @@
 }
 
 
+RawLibrary* Script::FindLibrary() const {
+  Isolate* isolate = Isolate::Current();
+  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
+      isolate, isolate->object_store()->libraries());
+  Library& lib = Library::Handle();
+  Script& script = Script::Handle();
+  for (intptr_t i = 0; i < libs.Length(); i++) {
+    lib ^= libs.At(i);
+    ASSERT(!lib.IsNull());
+    const Array& loaded_scripts = Array::Handle(lib.LoadedScripts());
+    ASSERT(!loaded_scripts.IsNull());
+    for (intptr_t j = 0; j < loaded_scripts.Length(); j++) {
+      script ^= loaded_scripts.At(j);
+      ASSERT(!script.IsNull());
+      if (script.raw() == raw()) {
+        return lib.raw();
+      }
+    }
+  }
+  return Library::null();
+}
+
+
+RawScript* Script::FindByUrl(const String& url) {
+  Isolate* isolate = Isolate::Current();
+  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
+      isolate, isolate->object_store()->libraries());
+  Library& lib = Library::Handle();
+  Script& script = Script::Handle();
+  String& script_url = String::Handle();
+  for (intptr_t i = 0; i < libs.Length(); i++) {
+    lib ^= libs.At(i);
+    ASSERT(!lib.IsNull());
+    const Array& loaded_scripts = Array::Handle(lib.LoadedScripts());
+    ASSERT(!loaded_scripts.IsNull());
+    for (intptr_t j = 0; j < loaded_scripts.Length(); j++) {
+      script ^= loaded_scripts.At(j);
+      ASSERT(!script.IsNull());
+      script_url ^= script.url();
+      if (script_url.Equals(url)) {
+        return script.raw();
+      }
+    }
+  }
+  return Script::null();
+}
+
+
 DictionaryIterator::DictionaryIterator(const Library& library)
     : array_(Array::Handle(library.dictionary())),
       // Last element in array is a Smi indicating the number of entries used.
@@ -8312,22 +8454,29 @@
 
 
 void Library::SetLoadInProgress() const {
-  // Should not be already loaded.
-  ASSERT(raw_ptr()->load_state_ == RawLibrary::kAllocated);
+  // Must not already be in the process of being loaded.
+  ASSERT(raw_ptr()->load_state_ <= RawLibrary::kLoadRequested);
   raw_ptr()->load_state_ = RawLibrary::kLoadInProgress;
 }
 
 
+void Library::SetLoadRequested() const {
+  // Must not be already loaded.
+  ASSERT(raw_ptr()->load_state_ == RawLibrary::kAllocated);
+  raw_ptr()->load_state_ = RawLibrary::kLoadRequested;
+}
+
+
 void Library::SetLoaded() const {
   // Should not be already loaded or just allocated.
-  ASSERT(LoadInProgress());
+  ASSERT(LoadInProgress() || LoadRequested());
   raw_ptr()->load_state_ = RawLibrary::kLoaded;
 }
 
 
 void Library::SetLoadError() const {
   // Should not be already loaded or just allocated.
-  ASSERT(LoadInProgress());
+  ASSERT(LoadInProgress() || LoadRequested());
   raw_ptr()->load_state_ = RawLibrary::kLoadError;
 }
 
@@ -9194,6 +9343,7 @@
   const String& core_lib_url = Symbols::DartCore();
   const Library& core_lib =
       Library::Handle(Library::NewLibraryHelper(core_lib_url, false));
+  core_lib.SetLoadRequested();
   core_lib.Register();
   isolate->object_store()->set_bootstrap_library(ObjectStore::kCore, core_lib);
   isolate->object_store()->set_root_library(Library::Handle());
@@ -9231,7 +9381,9 @@
       Library::NewLibraryHelper(native_flds_lib_url, false));
   const String& native_flds_lib_name = Symbols::DartNativeWrappersLibName();
   native_flds_lib.SetName(native_flds_lib_name);
+  native_flds_lib.SetLoadRequested();
   native_flds_lib.Register();
+  native_flds_lib.SetLoadInProgress();
   isolate->object_store()->set_native_wrappers_library(native_flds_lib);
   static const char* const kNativeWrappersClass = "NativeFieldWrapperClass";
   static const int kNameLength = 25;
@@ -9247,6 +9399,7 @@
     cls_name = Symbols::New(name_buffer);
     Class::NewNativeWrapper(native_flds_lib, cls_name, fld_cnt);
   }
+  native_flds_lib.SetLoaded();
 }
 
 
@@ -9308,13 +9461,14 @@
 
 void Library::AllocatePrivateKey() const {
   const String& url = String::Handle(this->url());
-  intptr_t key_value = url.Hash();
-  while (Library::IsKeyUsed(key_value)) {
-    key_value++;
+  intptr_t key_value = url.Hash() & kIntptrMax;
+  while ((key_value == 0) || Library::IsKeyUsed(key_value)) {
+    key_value = (key_value + 1) & kIntptrMax;
   }
+  ASSERT(key_value > 0);
   char private_key[32];
   OS::SNPrint(private_key, sizeof(private_key),
-              "%c%#" Px "", kPrivateKeySeparator, key_value);
+              "%c%" Pd "", kPrivateKeySeparator, key_value);
   StorePointer(&raw_ptr()->private_key_, String::New(private_key, Heap::kOld));
 }
 
@@ -9614,14 +9768,38 @@
 }
 
 
-void LibraryPrefix::LoadLibrary() const {
+bool LibraryPrefix::LoadLibrary() const {
   // Non-deferred prefixes are loaded.
   ASSERT(is_deferred_load() || is_loaded());
   if (is_loaded()) {
-    return;
+    return true;  // Load request has already completed.
   }
-  InvalidateDependentCode();
-  set_is_loaded();
+  ASSERT(is_deferred_load());
+  ASSERT(num_imports() == 1);
+  // This is a prefix for a deferred library. If the library is not loaded
+  // yet and isn't being loaded, call the library tag handler to schedule
+  // loading. Once all outstanding load requests have completed, the embedder
+  // will call the core library to:
+  // - invalidate dependent code of this prefix;
+  // - mark this prefixes as loaded;
+  // - complete the future associated with this prefix.
+  const Library& deferred_lib = Library::Handle(GetLibrary(0));
+  if (deferred_lib.Loaded()) {
+    this->set_is_loaded();
+    return true;
+  } else if (deferred_lib.LoadNotStarted()) {
+    deferred_lib.SetLoadRequested();
+    Isolate* isolate = Isolate::Current();
+    const String& lib_url = String::Handle(isolate, deferred_lib.url());
+    Dart_LibraryTagHandler handler = isolate->library_tag_handler();
+    handler(Dart_kImportTag,
+            Api::NewHandle(isolate, importer()),
+            Api::NewHandle(isolate, lib_url.raw()));
+  } else {
+    // Another load request is in flight.
+    ASSERT(deferred_lib.LoadRequested());
+  }
+  return false;  // Load request not yet completed.
 }
 
 
@@ -9655,7 +9833,7 @@
 
   virtual void ReportSwitchingCode(const Code& code) {
     if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) {
-      OS::PrintErr("Prefix '%s': deleting %s code for %s function '%s'\n",
+      OS::PrintErr("Prefix '%s': disabling %s code for %s function '%s'\n",
         String::Handle(prefix_.name()).ToCString(),
         code.is_optimized() ? "optimized" : "unoptimized",
         CodePatcher::IsEntryPatched(code) ? "patched" : "unpatched",
@@ -9680,6 +9858,7 @@
 void LibraryPrefix::InvalidateDependentCode() const {
   PrefixDependentArray a(*this);
   a.DisableCode();
+  set_is_loaded();
 }
 
 
@@ -9695,10 +9874,12 @@
 
 RawLibraryPrefix* LibraryPrefix::New(const String& name,
                                      const Namespace& import,
-                                     bool deferred_load) {
+                                     bool deferred_load,
+                                     const Library& importer) {
   const LibraryPrefix& result = LibraryPrefix::Handle(LibraryPrefix::New());
   result.set_name(name);
   result.set_num_imports(0);
+  result.set_importer(importer);
   result.raw_ptr()->is_deferred_load_ = deferred_load;
   result.raw_ptr()->is_loaded_ = !deferred_load;
   result.set_imports(Array::Handle(Array::New(kInitialSize)));
@@ -9724,6 +9905,11 @@
 }
 
 
+void LibraryPrefix::set_importer(const Library& value) const {
+  StorePointer(&raw_ptr()->importer_, value.raw());
+}
+
+
 const char* LibraryPrefix::ToCString() const {
   const char* kFormat = "LibraryPrefix:'%s'";
   const String& prefix = String::Handle(name());
@@ -10070,56 +10256,6 @@
 }
 
 
-uword PcDescriptors::PC(intptr_t index) const {
-  return static_cast<uword>(*(EntryAddr(index, kPcEntry)));
-}
-
-
-void PcDescriptors::SetPC(intptr_t index, uword value) const {
-  *(EntryAddr(index, kPcEntry)) = static_cast<intptr_t>(value);
-}
-
-
-PcDescriptors::Kind PcDescriptors::DescriptorKind(intptr_t index) const {
-  return static_cast<PcDescriptors::Kind>(*(EntryAddr(index, kKindEntry)));
-}
-
-
-void PcDescriptors::SetKind(intptr_t index, PcDescriptors::Kind value) const {
-  *(EntryAddr(index, kKindEntry)) = value;
-}
-
-
-intptr_t PcDescriptors::DeoptId(intptr_t index) const {
-  return *(EntryAddr(index, kDeoptIdEntry));
-}
-
-
-void PcDescriptors::SetDeoptId(intptr_t index, intptr_t value) const {
-  *(EntryAddr(index, kDeoptIdEntry)) = value;
-}
-
-
-intptr_t PcDescriptors::TokenPos(intptr_t index) const {
-  return *(EntryAddr(index, kTokenPosEntry));
-}
-
-
-void PcDescriptors::SetTokenPos(intptr_t index, intptr_t value) const {
-  *(EntryAddr(index, kTokenPosEntry)) = value;
-}
-
-
-intptr_t PcDescriptors::TryIndex(intptr_t index) const {
-  return *(EntryAddr(index, kTryIndexEntry));
-}
-
-
-void PcDescriptors::SetTryIndex(intptr_t index, intptr_t value) const {
-  *(EntryAddr(index, kTryIndexEntry)) = value;
-}
-
-
 RawPcDescriptors* PcDescriptors::New(intptr_t num_descriptors) {
   ASSERT(Object::pc_descriptors_class() != Class::null());
   if (num_descriptors < 0 || num_descriptors > kMaxElements) {
@@ -10148,7 +10284,6 @@
     case PcDescriptors::kOptStaticCall:   return "opt-call     ";
     case PcDescriptors::kUnoptStaticCall: return "unopt-call   ";
     case PcDescriptors::kClosureCall:     return "closure-call ";
-    case PcDescriptors::kReturn:          return "return       ";
     case PcDescriptors::kRuntimeCall:     return "runtime-call ";
     case PcDescriptors::kOsrEntry:        return "osr-entry    ";
     case PcDescriptors::kOther:           return "other        ";
@@ -10289,7 +10424,7 @@
   int byte_index = bit_index >> kBitsPerByteLog2;
   int bit_remainder = bit_index & (kBitsPerByte - 1);
   uint8_t byte_mask = 1U << bit_remainder;
-  uint8_t byte = raw_ptr()->data_[byte_index];
+  uint8_t byte = raw_ptr()->data()[byte_index];
   return (byte & byte_mask);
 }
 
@@ -10299,7 +10434,7 @@
   int byte_index = bit_index >> kBitsPerByteLog2;
   int bit_remainder = bit_index & (kBitsPerByte - 1);
   uint8_t byte_mask = 1U << bit_remainder;
-  uint8_t* byte_addr = &(raw_ptr()->data_[byte_index]);
+  uint8_t* byte_addr = &(raw_ptr()->data()[byte_index]);
   if (value) {
     *byte_addr |= byte_mask;
   } else {
@@ -10395,14 +10530,14 @@
   const Array& names = Array::Handle(raw_ptr()->names_);
   ASSERT(Length() == names.Length());
   names.SetAt(var_index, name);
-  raw_ptr()->data_[var_index] = *info;
+  raw_ptr()->data()[var_index] = *info;
 }
 
 
 void LocalVarDescriptors::GetInfo(intptr_t var_index,
                                   RawLocalVarDescriptors::VarInfo* info) const {
   ASSERT(var_index < Length());
-  *info = raw_ptr()->data_[var_index];
+  *info = raw_ptr()->data()[var_index];
 }
 
 
@@ -10548,7 +10683,7 @@
                                        bool needs_stacktrace,
                                        bool has_catch_all) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
-  RawExceptionHandlers::HandlerInfo* info = &raw_ptr()->data_[try_index];
+  RawExceptionHandlers::HandlerInfo* info = &raw_ptr()->data()[try_index];
   info->outer_try_index = outer_try_index;
   info->handler_pc = handler_pc;
   info->needs_stacktrace = needs_stacktrace;
@@ -10560,31 +10695,31 @@
     RawExceptionHandlers::HandlerInfo* info) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
   ASSERT(info != NULL);
-  *info = raw_ptr()->data_[try_index];
+  *info = raw_ptr()->data()[try_index];
 }
 
 
 intptr_t ExceptionHandlers::HandlerPC(intptr_t try_index) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
-  return raw_ptr()->data_[try_index].handler_pc;
+  return raw_ptr()->data()[try_index].handler_pc;
 }
 
 
 intptr_t ExceptionHandlers::OuterTryIndex(intptr_t try_index) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
-  return raw_ptr()->data_[try_index].outer_try_index;
+  return raw_ptr()->data()[try_index].outer_try_index;
 }
 
 
 bool ExceptionHandlers::NeedsStacktrace(intptr_t try_index) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
-  return raw_ptr()->data_[try_index].needs_stacktrace;
+  return raw_ptr()->data()[try_index].needs_stacktrace;
 }
 
 
 bool ExceptionHandlers::HasCatchAll(intptr_t try_index) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
-  return raw_ptr()->data_[try_index].has_catch_all;
+  return raw_ptr()->data()[try_index].has_catch_all;
 }
 
 
@@ -11942,54 +12077,6 @@
 }
 
 
-intptr_t Code::ExtractIcDataArraysAtCalls(
-    GrowableArray<intptr_t>* node_ids,
-    const GrowableObjectArray& ic_data_objs) const {
-  ASSERT(node_ids != NULL);
-  ASSERT(!ic_data_objs.IsNull());
-  const PcDescriptors& descriptors =
-      PcDescriptors::Handle(this->pc_descriptors());
-  ICData& ic_data_obj = ICData::Handle();
-  intptr_t max_id = -1;
-  for (intptr_t i = 0; i < descriptors.Length(); i++) {
-    PcDescriptors::Kind kind = descriptors.DescriptorKind(i);
-    if ((kind == PcDescriptors::kIcCall) ||
-        (kind == PcDescriptors::kUnoptStaticCall)) {
-      intptr_t deopt_id = descriptors.DeoptId(i);
-      if (deopt_id > max_id) {
-        max_id = deopt_id;
-      }
-      node_ids->Add(deopt_id);
-      uword ret_addr = descriptors.PC(i);
-      if (kind == PcDescriptors::kIcCall) {
-        CodePatcher::GetInstanceCallAt(ret_addr, *this, &ic_data_obj);
-      } else {
-        CodePatcher::GetUnoptimizedStaticCallAt(ret_addr, *this, &ic_data_obj);
-      }
-      ic_data_objs.Add(ic_data_obj);
-    }
-  }
-  return max_id;
-}
-
-
-RawArray* Code::ExtractTypeFeedbackArray() const {
-  ASSERT(!IsNull() && !is_optimized());
-  GrowableArray<intptr_t> deopt_ids;
-  const GrowableObjectArray& ic_data_objs =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
-  const intptr_t max_id =
-      ExtractIcDataArraysAtCalls(&deopt_ids, ic_data_objs);
-  const Array& result = Array::Handle(Array::New(max_id + 1));
-  for (intptr_t i = 0; i < deopt_ids.length(); i++) {
-    intptr_t result_index = deopt_ids[i];
-    ASSERT(result.At(result_index) == Object::null());
-    result.SetAt(result_index, Object::Handle(ic_data_objs.At(i)));
-  }
-  return result.raw();
-}
-
-
 RawStackmap* Code::GetStackmap(uword pc, Array* maps, Stackmap* map) const {
   // This code is used during iterating frames during a GC and hence it
   // should not in turn start a GC.
@@ -12484,7 +12571,7 @@
 RawLanguageError* LanguageError::NewFormattedV(const Error& prev_error,
                                                const Script& script,
                                                intptr_t token_pos,
-                                               Kind kind,
+                                               Report::Kind kind,
                                                Heap::Space space,
                                                const char* format,
                                                va_list args) {
@@ -12509,7 +12596,7 @@
 RawLanguageError* LanguageError::NewFormatted(const Error& prev_error,
                                               const Script& script,
                                               intptr_t token_pos,
-                                              Kind kind,
+                                              Report::Kind kind,
                                               Heap::Space space,
                                               const char* format, ...) {
   va_list args;
@@ -12523,7 +12610,7 @@
 
 
 RawLanguageError* LanguageError::New(const String& formatted_message,
-                                     Kind kind,
+                                     Report::Kind kind,
                                      Heap::Space space) {
   ASSERT(Object::language_error_class() != Class::null());
   LanguageError& result = LanguageError::Handle();
@@ -12575,68 +12662,16 @@
   if (formatted_message() != String::null()) {
     return formatted_message();
   }
-  const char* message_header;
-  switch (kind()) {
-    case kWarning: message_header = "warning"; break;
-    case kError: message_header = "error"; break;
-    case kMalformedType: message_header = "malformed type"; break;
-    case kMalboundedType: message_header = "malbounded type"; break;
-    case kBailout: message_header = "bailout"; break;
-    default: message_header = ""; UNREACHABLE();
-  }
-  String& result = String::Handle();
-  String& msg = String::Handle(message());
-  const Script& scr = Script::Handle(script());
-  if (!scr.IsNull()) {
-    const String& script_url = String::Handle(scr.url());
-    if (token_pos() >= 0) {
-      intptr_t line, column;
-      scr.GetTokenLocation(token_pos(), &line, &column);
-      // Only report the line position if we have the original source. We still
-      // need to get a valid column so that we can report the ^ mark below the
-      // snippet.
-      if (scr.HasSource()) {
-        result = String::NewFormatted("'%s': %s: line %" Pd " pos %" Pd ": ",
-                                      script_url.ToCString(),
-                                      message_header,
-                                      line,
-                                      column);
-      } else {
-        result = String::NewFormatted("'%s': %s: line %" Pd ": ",
-                                      script_url.ToCString(),
-                                      message_header,
-                                      line);
-      }
-      // Append the formatted error or warning message.
-      result = String::Concat(result, msg);
-      // Append the source line.
-      const String& script_line = String::Handle(scr.GetLine(line));
-      ASSERT(!script_line.IsNull());
-      result = String::Concat(result, Symbols::NewLine());
-      result = String::Concat(result, script_line);
-      result = String::Concat(result, Symbols::NewLine());
-      // Append the column marker.
-      const String& column_line = String::Handle(
-          String::NewFormatted("%*s\n", static_cast<int>(column), "^"));
-      result = String::Concat(result, column_line);
-    } else {
-      // Token position is unknown.
-      result = String::NewFormatted("'%s': %s: ",
-                                    script_url.ToCString(),
-                                    message_header);
-      result = String::Concat(result, msg);
-    }
-  } else {
-    // Script is unknown.
-    // Append the formatted error or warning message.
-    result = String::NewFormatted("%s: ", message_header);
-    result = String::Concat(result, msg);
-  }
+  String& result = String::Handle(
+      Report::PrependSnippet(kind(),
+                             Script::Handle(script()),
+                             token_pos(),
+                             String::Handle(message())));
   // Prepend previous error message.
   const Error& prev_error = Error::Handle(previous_error());
   if (!prev_error.IsNull()) {
-    msg = String::New(prev_error.ToErrorCString());
-    result = String::Concat(msg, result);
+    result = String::Concat(
+        String::Handle(String::New(prev_error.ToErrorCString())), result);
   }
   set_formatted_message(result);
   return result.raw();
@@ -13056,13 +13091,7 @@
     return Integer::Cast(*this).Equals(other);
   }
   if (IsDouble() && other.IsDouble()) {
-    if (Double::Cast(*this).CanonicalizeEquals(other)) return true;
-    // Check for NaN.
-    const Double& a_double = Double::Cast(*this);
-    const Double& b_double = Double::Cast(other);
-    if (isnan(a_double.value()) && isnan(b_double.value())) {
-      return true;
-    }
+    return Double::Cast(*this).CanonicalizeEquals(other);
   }
   return false;
 }
@@ -13075,7 +13104,7 @@
   if (native_fields == TypedData::null()) {
     return NULL;
   }
-  return reinterpret_cast<intptr_t*>(native_fields->ptr()->data_);
+  return reinterpret_cast<intptr_t*>(native_fields->ptr()->data());
 }
 
 
@@ -13092,6 +13121,23 @@
 }
 
 
+void Instance::SetNativeFields(uint16_t num_native_fields,
+                               const intptr_t* field_values) const {
+  ASSERT(num_native_fields == NumNativeFields());
+  ASSERT(field_values != NULL);
+  Object& native_fields = Object::Handle(*NativeFieldsAddr());
+  if (native_fields.IsNull()) {
+    // Allocate backing storage for the native fields.
+    native_fields = TypedData::New(kIntPtrCid, NumNativeFields());
+    StorePointer(NativeFieldsAddr(), native_fields.raw());
+  }
+  for (uint16_t i = 0; i < num_native_fields; i++) {
+    intptr_t byte_offset = i * sizeof(intptr_t);
+    TypedData::Cast(native_fields).SetIntPtr(byte_offset, field_values[i]);
+  }
+}
+
+
 bool Instance::IsClosure() const {
   const Class& cls = Class::Handle(clazz());
   return cls.IsSignatureClass();
@@ -13897,7 +13943,7 @@
     return false;
   }
   const LanguageError& type_error = LanguageError::Handle(error());
-  return type_error.kind() == LanguageError::kMalformedType;
+  return type_error.kind() == Report::kMalformedType;
 }
 
 
@@ -13909,7 +13955,7 @@
     return false;
   }
   const LanguageError& type_error = LanguageError::Handle(error());
-  return type_error.kind() == LanguageError::kMalboundedType;
+  return type_error.kind() == Report::kMalboundedType;
 }
 
 
@@ -13918,10 +13964,10 @@
     return false;
   }
   const LanguageError& type_error = LanguageError::Handle(error());
-  if (type_error.kind() == LanguageError::kMalformedType) {
+  if (type_error.kind() == Report::kMalformedType) {
     return true;
   }
-  ASSERT(type_error.kind() == LanguageError::kMalboundedType);
+  ASSERT(type_error.kind() == Report::kMalboundedType);
   return FLAG_enable_type_checks;
 }
 
@@ -14660,7 +14706,7 @@
           *bound_error,
           script,
           token_pos(),
-          LanguageError::kMalboundedType,
+          Report::kMalboundedType,
           Heap::kNew,
           "type parameter '%s' of class '%s' must extend bound '%s', "
           "but type argument '%s' is not a subtype of '%s'\n",
@@ -15132,15 +15178,17 @@
 
 
 RawInteger* Integer::New(int64_t value, Heap::Space space, const bool silent) {
-  if ((value <= Smi::kMaxValue) && (value >= Smi::kMinValue)) {
-    return Smi::New(value);
-  }
+  const bool is_smi = (value <= Smi::kMaxValue) && (value >= Smi::kMinValue);
   if (!silent &&
       FLAG_throw_on_javascript_int_overflow &&
       !IsJavascriptInt(value)) {
-    const Integer& i = Integer::Handle(Mint::New(value));
+    const Integer& i = is_smi ? Integer::Handle(Smi::New(value))
+                              : Integer::Handle(Mint::New(value));
     ThrowJavascriptIntegerOverflow(i);
   }
+  if (is_smi) {
+    return Smi::New(value);
+  }
   return Mint::New(value, space);
 }
 
@@ -15215,7 +15263,7 @@
   if (IsMint()) {
     Mint& mint = Mint::Handle();
     mint ^= raw();
-    if (Smi::IsValid64(mint.value())) {
+    if (Smi::IsValid(mint.value())) {
       return Smi::New(mint.value());
     } else {
       return raw();
@@ -15457,7 +15505,7 @@
   }
   if (integer.IsMint()) {
     int64_t mint_value = integer.AsInt64Value();
-    return Smi::IsValid64(mint_value);
+    return Smi::IsValid(mint_value);
   }
   if (integer.IsBigint()) {
     return BigintOperations::FitsIntoSmi(Bigint::Cast(integer));
@@ -15520,7 +15568,7 @@
 
 RawMint* Mint::New(int64_t val, Heap::Space space) {
   // Do not allocate a Mint if Smi would do.
-  ASSERT(!Smi::IsValid64(val));
+  ASSERT(!Smi::IsValid(val));
   ASSERT(Isolate::Current()->object_store()->mint_class() != Class::null());
   Mint& result = Mint::Handle();
   {
@@ -15537,7 +15585,7 @@
 
 RawMint* Mint::NewCanonical(int64_t value) {
   // Do not allocate a Mint if Smi would do.
-  ASSERT(!Smi::IsValid64(value));
+  ASSERT(!Smi::IsValid(value));
   const Class& cls =
       Class::Handle(Isolate::Current()->object_store()->mint_class());
   const Array& constants = Array::Handle(cls.constants());
@@ -16013,6 +16061,23 @@
 }
 
 
+Scanner::CharAtFunc String::CharAtFunc() const {
+  intptr_t class_id = raw()->GetClassId();
+  ASSERT(RawObject::IsStringClassId(class_id));
+  if (class_id == kOneByteStringCid) {
+    return &OneByteString::CharAt;
+  }
+  if (class_id == kTwoByteStringCid) {
+    return &TwoByteString::CharAt;
+  }
+  if (class_id == kExternalOneByteStringCid) {
+    return &ExternalOneByteString::CharAt;
+  }
+  ASSERT(class_id == kExternalTwoByteStringCid);
+  return &ExternalTwoByteString::CharAt;
+}
+
+
 intptr_t String::CharSize() const {
   intptr_t class_id = raw()->GetClassId();
   if (class_id == kOneByteStringCid || class_id == kExternalOneByteStringCid) {
@@ -16595,7 +16660,7 @@
       Isolate* isolate = Isolate::Current();
       const Instance& exception =
           Instance::Handle(isolate->object_store()->out_of_memory());
-      Exceptions::Throw(exception);
+      Exceptions::Throw(isolate, exception);
       UNREACHABLE();
     }
     result_len += str_len;
@@ -16806,14 +16871,15 @@
     Dart_WeakPersistentHandleFinalizer callback) {
   ASSERT((callback != NULL && peer != NULL) ||
          (callback == NULL && peer == NULL));
-  ApiState* state = Isolate::Current()->api_state();
-  ASSERT(state != NULL);
-  FinalizablePersistentHandle* weak_ref =
-      state->weak_persistent_handles().AllocateHandle();
-  weak_ref->set_raw(referent);
-  weak_ref->set_peer(peer);
-  weak_ref->set_callback(callback);
-  return weak_ref;
+  const bool is_prologue = false;
+  // TODO(19482): Make API consistent for external size of strings/typed data.
+  const intptr_t external_size = 0;
+  return FinalizablePersistentHandle::New(Isolate::Current(),
+                                          is_prologue,
+                                          referent,
+                                          peer,
+                                          callback,
+                                          external_size);
 }
 
 
@@ -16821,70 +16887,77 @@
                                 intptr_t length,
                                 void* peer,
                                 Dart_PeerFinalizer cback) const {
-  NoGCScope no_gc;
-  ASSERT(array != NULL);
-  intptr_t str_length = this->Length();
-  ASSERT(length >= (str_length * this->CharSize()));
-  intptr_t class_id = raw()->GetClassId();
-  intptr_t used_size = 0;
-  intptr_t original_size = 0;
-  uword tags = raw_ptr()->tags_;
+  String& result = String::Handle();
+  void* external_data;
+  Dart_WeakPersistentHandleFinalizer finalizer;
+  {
+    NoGCScope no_gc;
+    ASSERT(array != NULL);
+    intptr_t str_length = this->Length();
+    ASSERT(length >= (str_length * this->CharSize()));
+    intptr_t class_id = raw()->GetClassId();
+    intptr_t used_size = 0;
+    intptr_t original_size = 0;
+    uword tags = raw_ptr()->tags_;
 
-  ASSERT(!InVMHeap());
-  if (class_id == kOneByteStringCid) {
-    used_size = ExternalOneByteString::InstanceSize();
-    original_size = OneByteString::InstanceSize(str_length);
-    ASSERT(original_size >= used_size);
+    ASSERT(!InVMHeap());
+    if (class_id == kOneByteStringCid) {
+      used_size = ExternalOneByteString::InstanceSize();
+      original_size = OneByteString::InstanceSize(str_length);
+      ASSERT(original_size >= used_size);
 
-    // Copy the data into the external array.
-    if (str_length > 0) {
-      memmove(array, OneByteString::CharAddr(*this, 0), str_length);
+      // Copy the data into the external array.
+      if (str_length > 0) {
+        memmove(array, OneByteString::CharAddr(*this, 0), str_length);
+      }
+
+      // Update the class information of the object.
+      const intptr_t class_id = kExternalOneByteStringCid;
+      tags = RawObject::SizeTag::update(used_size, tags);
+      tags = RawObject::ClassIdTag::update(class_id, tags);
+      raw_ptr()->tags_ = tags;
+      result = this->raw();
+      ExternalStringData<uint8_t>* ext_data = new ExternalStringData<uint8_t>(
+          reinterpret_cast<const uint8_t*>(array), peer, cback);
+      result.SetLength(str_length);
+      result.SetHash(0);
+      ExternalOneByteString::SetExternalData(result, ext_data);
+      external_data = ext_data;
+      finalizer = ExternalOneByteString::Finalize;
+    } else {
+      ASSERT(class_id == kTwoByteStringCid);
+      used_size = ExternalTwoByteString::InstanceSize();
+      original_size = TwoByteString::InstanceSize(str_length);
+      ASSERT(original_size >= used_size);
+
+      // Copy the data into the external array.
+      if (str_length > 0) {
+        memmove(array,
+                TwoByteString::CharAddr(*this, 0),
+                (str_length * kTwoByteChar));
+      }
+
+      // Update the class information of the object.
+      const intptr_t class_id = kExternalTwoByteStringCid;
+      tags = RawObject::SizeTag::update(used_size, tags);
+      tags = RawObject::ClassIdTag::update(class_id, tags);
+      raw_ptr()->tags_ = tags;
+      const String& result = String::Handle(this->raw());
+      ExternalStringData<uint16_t>* ext_data = new ExternalStringData<uint16_t>(
+          reinterpret_cast<const uint16_t*>(array), peer, cback);
+      result.SetLength(str_length);
+      result.SetHash(0);
+      ExternalTwoByteString::SetExternalData(result, ext_data);
+      external_data = ext_data;
+      finalizer = ExternalTwoByteString::Finalize;
     }
 
-    // Update the class information of the object.
-    const intptr_t class_id = kExternalOneByteStringCid;
-    tags = RawObject::SizeTag::update(used_size, tags);
-    tags = RawObject::ClassIdTag::update(class_id, tags);
-    raw_ptr()->tags_ = tags;
-    const String& result = String::Handle(this->raw());
-    ExternalStringData<uint8_t>* ext_data = new ExternalStringData<uint8_t>(
-        reinterpret_cast<const uint8_t*>(array), peer, cback);
-    result.SetLength(str_length);
-    result.SetHash(0);
-    ExternalOneByteString::SetExternalData(result, ext_data);
-    AddFinalizer(result, ext_data, ExternalOneByteString::Finalize);
-  } else {
-    ASSERT(class_id == kTwoByteStringCid);
-    used_size = ExternalTwoByteString::InstanceSize();
-    original_size = TwoByteString::InstanceSize(str_length);
-    ASSERT(original_size >= used_size);
-
-    // Copy the data into the external array.
-    if (str_length > 0) {
-      memmove(array,
-              TwoByteString::CharAddr(*this, 0),
-              (str_length * kTwoByteChar));
-    }
-
-    // Update the class information of the object.
-    const intptr_t class_id = kExternalTwoByteStringCid;
-    tags = RawObject::SizeTag::update(used_size, tags);
-    tags = RawObject::ClassIdTag::update(class_id, tags);
-    raw_ptr()->tags_ = tags;
-    const String& result = String::Handle(this->raw());
-    ExternalStringData<uint16_t>* ext_data = new ExternalStringData<uint16_t>(
-        reinterpret_cast<const uint16_t*>(array), peer, cback);
-    result.SetLength(str_length);
-    result.SetHash(0);
-    ExternalTwoByteString::SetExternalData(result, ext_data);
-    AddFinalizer(result, ext_data, ExternalTwoByteString::Finalize);
-  }
-
-  // If there is any left over space fill it with either an Array object or
-  // just a plain object (depending on the amount of left over space) so
-  // that it can be traversed over successfully during garbage collection.
-  Object::MakeUnusedSpaceTraversable(*this, original_size, used_size);
-
+    // If there is any left over space fill it with either an Array object or
+    // just a plain object (depending on the amount of left over space) so
+    // that it can be traversed over successfully during garbage collection.
+    Object::MakeUnusedSpaceTraversable(*this, original_size, used_size);
+  }  // NoGCScope
+  AddFinalizer(result, external_data, finalizer);
   return this->raw();
 }
 
@@ -17290,8 +17363,8 @@
   RawOneByteString* result = OneByteString::New(length, space);
   NoGCScope no_gc;
   if (length > 0) {
-    uint8_t* dest = &result->ptr()->data_[0];
-    uint8_t* src =  &raw_ptr(str)->data_[begin_index];
+    uint8_t* dest = &result->ptr()->data()[0];
+    uint8_t* src =  &raw_ptr(str)->data()[begin_index];
     memmove(dest, src, length);
   }
   return result;
@@ -17814,7 +17887,7 @@
       Isolate* isolate = Isolate::Current();
       const Instance& exception =
           Instance::Handle(isolate->object_store()->out_of_memory());
-      Exceptions::Throw(exception);
+      Exceptions::Throw(isolate, exception);
       UNREACHABLE();
     }
     Grow(new_capacity, space);
@@ -18523,13 +18596,20 @@
 
 
 void Stacktrace::Append(const Array& code_list,
-                        const Array& pc_offset_list) const {
-  intptr_t old_length = Length();
-  intptr_t new_length = old_length + pc_offset_list.Length();
+                        const Array& pc_offset_list,
+                        const intptr_t start_index) const {
+  ASSERT(start_index <= code_list.Length());
   ASSERT(pc_offset_list.Length() == code_list.Length());
+  intptr_t old_length = Length();
+  intptr_t new_length = old_length + pc_offset_list.Length() - start_index;
+  if (new_length == old_length) {
+    // Nothing to append. Avoid work and an assert that growing arrays always
+    // increases their size.
+    return;
+  }
 
-  // Grow the arrays for function, code and pc_offset triplet to accommodate
-  // the new stack frames.
+  // Grow the arrays for code, pc_offset pairs to accommodate the new stack
+  // frames.
   Array& code_array = Array::Handle(raw_ptr()->code_array_);
   Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_);
   code_array = Array::Grow(code_array, new_length);
@@ -18537,7 +18617,7 @@
   set_code_array(code_array);
   set_pc_offset_array(pc_offset_array);
   // Now append the new function and code list to the existing arrays.
-  intptr_t j = 0;
+  intptr_t j = start_index;
   Object& obj = Object::Handle();
   for (intptr_t i = old_length; i < new_length; i++, j++) {
     obj = code_list.At(j);
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index de55423..4d938ce 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -5,6 +5,7 @@
 #ifndef VM_OBJECT_H_
 #define VM_OBJECT_H_
 
+#include <limits>
 #include "include/dart_api.h"
 #include "platform/assert.h"
 #include "platform/utils.h"
@@ -17,6 +18,7 @@
 #include "vm/isolate.h"
 #include "vm/os.h"
 #include "vm/raw_object.h"
+#include "vm/report.h"
 #include "vm/scanner.h"
 #include "vm/tags.h"
 
@@ -1299,7 +1301,8 @@
   intptr_t Length() const;
   RawAbstractType* TypeAt(intptr_t index) const;
   static intptr_t type_at_offset(intptr_t index) {
-    return OFFSET_OF(RawTypeArguments, types_) + index * kWordSize;
+    return OFFSET_OF_RETURNED_VALUE(
+        RawTypeArguments, types) + index * kWordSize;
   }
   void SetTypeAt(intptr_t index, const AbstractType& value) const;
 
@@ -1426,12 +1429,13 @@
   }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawTypeArguments) == OFFSET_OF(RawTypeArguments, types_));
+    ASSERT(sizeof(RawTypeArguments) ==
+           OFFSET_OF_RETURNED_VALUE(RawTypeArguments, types));
     return 0;
   }
 
   static intptr_t InstanceSize(intptr_t len) {
-    // Ensure that the types_ is not adding to the object size, which includes
+    // Ensure that the types() is not adding to the object size, which includes
     // 2 fields: instantiations_ and length_.
     ASSERT(sizeof(RawTypeArguments) == (sizeof(RawObject) + (2 * kWordSize)));
     ASSERT(0 <= len && len <= kMaxElements);
@@ -1994,11 +1998,22 @@
   // Return false and report an error if the fingerprint does not match.
   bool CheckSourceFingerprint(int32_t fp) const;
 
+  // Works with map [deopt-id] -> ICData.
+  void SaveICDataMap(
+      const ZoneGrowableArray<const ICData*>& deopt_id_to_ic_data) const;
+  void RestoreICDataMap(
+      ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data) const;
+
+  RawArray* ic_data_array() const;
+  void ClearICData() const;
+
   static const int kCtorPhaseInit = 1 << 0;
   static const int kCtorPhaseBody = 1 << 1;
   static const int kCtorPhaseAll = (kCtorPhaseInit | kCtorPhaseBody);
 
  private:
+  void set_ic_data_array(const Array& value) const;
+
   enum KindTagBits {
     kKindTagPos = 0,
     kKindTagSize = 4,
@@ -2504,6 +2519,8 @@
                         intptr_t* first_token_index,
                         intptr_t* last_token_index) const;
 
+  RawLibrary* FindLibrary() const;
+
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawScript));
   }
@@ -2512,6 +2529,8 @@
                         const String& source,
                         RawScript::Kind kind);
 
+  static RawScript* FindByUrl(const String& url);
+
  private:
   void set_url(const String& value) const;
   void set_source(const String& value) const;
@@ -2593,9 +2612,13 @@
   bool LoadNotStarted() const {
     return raw_ptr()->load_state_ == RawLibrary::kAllocated;
   }
+  bool LoadRequested() const {
+    return raw_ptr()->load_state_ == RawLibrary::kLoadRequested;
+  }
   bool LoadInProgress() const {
     return raw_ptr()->load_state_ == RawLibrary::kLoadInProgress;
   }
+  void SetLoadRequested() const;
   void SetLoadInProgress() const;
   bool Loaded() const { return raw_ptr()->load_state_ == RawLibrary::kLoaded; }
   void SetLoaded() const;
@@ -2873,7 +2896,8 @@
                                          (2 * OS::kMaxPreferredCodeAlignment)));
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawInstructions) == OFFSET_OF(RawInstructions, data_));
+    ASSERT(sizeof(RawInstructions) ==
+           OFFSET_OF_RETURNED_VALUE(RawInstructions, data));
     return 0;
   }
 
@@ -2936,7 +2960,7 @@
 
   static intptr_t InstanceSize() {
     ASSERT(sizeof(RawLocalVarDescriptors) ==
-        OFFSET_OF(RawLocalVarDescriptors, data_));
+        OFFSET_OF_RETURNED_VALUE(RawLocalVarDescriptors, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
@@ -2954,19 +2978,6 @@
 
 
 class PcDescriptors : public Object {
- private:
-  // Describes the layout of PC descriptor data.
-  enum {
-    kPcEntry = 0,      // PC value of the descriptor, unique.
-    kKindEntry = 1,
-    kDeoptIdEntry = 2,      // Deopt id.
-    kTokenPosEntry = 3,     // Token position in source.
-    kTryIndexEntry = 4,     // Try block index.
-    // We would potentially be adding other objects here like
-    // pointer maps for optimized functions, local variables information  etc.
-    kNumberOfEntries = 5,
-  };
-
  public:
   enum Kind {
     kDeopt,            // Deoptimization continuation point.
@@ -2975,38 +2986,58 @@
     kUnoptStaticCall,  // Call to a known target via a stub.
     kClosureCall,      // Closure call.
     kRuntimeCall,      // Runtime call.
-    kReturn,           // Return from function.
     kOsrEntry,         // OSR entry point in unoptimized code.
     kOther
   };
 
   intptr_t Length() const;
 
-  uword PC(intptr_t index) const;
-  PcDescriptors::Kind DescriptorKind(intptr_t index) const;
+  uword PC(intptr_t index) const {
+    ASSERT(index < Length());
+    return raw_ptr()->data()[index].pc;
+  }
+  PcDescriptors::Kind DescriptorKind(intptr_t index) const {
+    ASSERT(index < Length());
+    return static_cast<PcDescriptors::Kind>(raw_ptr()->data()[index].kind);
+  }
+  intptr_t DeoptId(intptr_t index) const {
+    ASSERT(index < Length());
+    return raw_ptr()->data()[index].deopt_id;
+  }
+  intptr_t TokenPos(intptr_t index) const {
+    ASSERT(index < Length());
+    return raw_ptr()->data()[index].token_pos;
+  }
+  intptr_t TryIndex(intptr_t index) const {
+    ASSERT(index < Length());
+    return raw_ptr()->data()[index].try_index;
+  }
   const char* KindAsStr(intptr_t index) const;
-  intptr_t DeoptId(intptr_t index) const;
-  intptr_t TokenPos(intptr_t index) const;
-  intptr_t TryIndex(intptr_t index) const;
 
   void AddDescriptor(intptr_t index,
                      uword pc,
                      PcDescriptors::Kind kind,
-                     intptr_t deopt_id,
-                     intptr_t token_pos,  // Or deopt reason.
+                     int64_t deopt_id,
+                     int64_t token_pos,  // Or deopt reason.
                      intptr_t try_index) const {  // Or deopt index.
-    SetPC(index, pc);
-    SetKind(index, kind);
-    SetDeoptId(index, deopt_id);
-    SetTokenPos(index, token_pos);
-    SetTryIndex(index, try_index);
+    RawPcDescriptors::PcDescriptorRec* rec = &raw_ptr()->data()[index];
+    rec->pc = pc;
+    rec->kind = kind;
+    ASSERT(Utils::IsInt(32, deopt_id));
+    rec->deopt_id = deopt_id;
+    ASSERT(Utils::IsInt(32, token_pos));
+    rec->token_pos = token_pos;
+    ASSERT(Utils::IsInt(16, try_index));
+    rec->try_index = try_index;
   }
 
-  static const intptr_t kBytesPerElement = (kNumberOfEntries * kWordSize);
+  static const intptr_t kBytesPerElement =
+      sizeof(RawPcDescriptors::PcDescriptorRec);
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawPcDescriptors) == OFFSET_OF(RawPcDescriptors, data_));
+    ASSERT(sizeof(RawPcDescriptors) ==
+           OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
@@ -3031,23 +3062,8 @@
   // pc descriptors table to visit objects if any in the table.
 
  private:
-  void SetPC(intptr_t index, uword value) const;
-  void SetKind(intptr_t index, PcDescriptors::Kind kind) const;
-  void SetDeoptId(intptr_t index, intptr_t value) const;
-  void SetTokenPos(intptr_t index, intptr_t value) const;
-  void SetTryIndex(intptr_t index, intptr_t value) const;
-
   void SetLength(intptr_t value) const;
 
-  intptr_t* EntryAddr(intptr_t index, intptr_t entry_offset) const {
-    ASSERT((index >=0) && (index < Length()));
-    intptr_t data_index = (index * kNumberOfEntries) + entry_offset;
-    return &raw_ptr()->data_[data_index];
-  }
-  RawSmi** SmiAddr(intptr_t index, intptr_t entry_offset) const {
-    return reinterpret_cast<RawSmi**>(EntryAddr(index, entry_offset));
-  }
-
   FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object);
   friend class Class;
   friend class Object;
@@ -3077,7 +3093,7 @@
   static const intptr_t kMaxLengthInBytes = kSmiMax;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawStackmap) == OFFSET_OF(RawStackmap, data_));
+    ASSERT(sizeof(RawStackmap) == OFFSET_OF_RETURNED_VALUE(RawStackmap, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t length) {
@@ -3127,8 +3143,8 @@
   bool HasCatchAll(intptr_t try_index) const;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawExceptionHandlers) == OFFSET_OF(RawExceptionHandlers,
-                                                     data_));
+    ASSERT(sizeof(RawExceptionHandlers) ==
+           OFFSET_OF_RETURNED_VALUE(RawExceptionHandlers, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
@@ -3197,7 +3213,8 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawDeoptInfo) == OFFSET_OF(RawDeoptInfo, data_));
+    ASSERT(sizeof(RawDeoptInfo) ==
+           OFFSET_OF_RETURNED_VALUE(RawDeoptInfo, data));
     return 0;
   }
 
@@ -3233,7 +3250,7 @@
   intptr_t* EntryAddr(intptr_t index, intptr_t entry_offset) const {
     ASSERT((index >=0) && (index < Length()));
     intptr_t data_index = (index * kNumberOfEntries) + entry_offset;
-    return &raw_ptr()->data_[data_index];
+    return &raw_ptr()->data()[data_index];
   }
 
   void SetLength(intptr_t value) const;
@@ -3624,10 +3641,11 @@
   // embedded objects in the instructions using pointer_offsets.
 
   static const intptr_t kBytesPerElement =
-      sizeof(reinterpret_cast<RawCode*>(0)->data_[0]);
+      sizeof(reinterpret_cast<RawCode*>(0)->data()[0]);
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
+    ASSERT(sizeof(RawCode) == OFFSET_OF_RETURNED_VALUE(RawCode, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
@@ -3667,15 +3685,6 @@
   // (inclusive) and 'end_offset' (exclusive).
   bool ObjectExistsInArea(intptr_t start_offest, intptr_t end_offset) const;
 
-  // Each (*node_ids)[n] has a an extracted ic data array (*arrays)[n].
-  // Returns the maximum id found.
-  intptr_t ExtractIcDataArraysAtCalls(
-      GrowableArray<intptr_t>* node_ids,
-      const GrowableObjectArray& ic_data_objs) const;
-
-  // Returns an array indexed by deopt id, containing the extracted ICData.
-  RawArray* ExtractTypeFeedbackArray() const;
-
   RawString* Name() const;
   RawString* PrettyName() const;
 
@@ -3755,7 +3764,7 @@
     ASSERT(index >= 0);
     ASSERT(index < pointer_offsets_length());
     // TODO(iposva): Unit test is missing for this functionality.
-    return &raw_ptr()->data_[index];
+    return &raw_ptr()->data()[index];
   }
   void SetPointerOffsetAt(int index, int32_t offset_in_instructions) {
     *PointerOffsetAddrAt(index) = offset_in_instructions;
@@ -3807,11 +3816,12 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t variable_offset(intptr_t context_index) {
-    return OFFSET_OF(RawContext, data_[context_index]);
+    return OFFSET_OF_RETURNED_VALUE(RawContext, data) +
+           (kWordSize * context_index);
   }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawContext) == OFFSET_OF(RawContext, data_));
+    ASSERT(sizeof(RawContext) == OFFSET_OF_RETURNED_VALUE(RawContext, data));
     return 0;
   }
 
@@ -3826,7 +3836,7 @@
  private:
   RawInstance** InstanceAddr(intptr_t context_index) const {
     ASSERT((context_index >= 0) && (context_index < num_variables()));
-    return &raw_ptr()->data_[context_index];
+    return &raw_ptr()->data()[context_index];
   }
 
   void set_isolate(Isolate* isolate) const {
@@ -3884,7 +3894,8 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawContextScope) == OFFSET_OF(RawContextScope, data_));
+    ASSERT(sizeof(RawContextScope) ==
+           OFFSET_OF_RETURNED_VALUE(RawContextScope, data));
     return 0;
   }
 
@@ -4046,15 +4057,9 @@
 
 class LanguageError : public Error {
  public:
-  enum Kind {
-    kWarning,
-    kError,
-    kMalformedType,
-    kMalboundedType,
-    kBailout,
-  };
-
-  Kind kind() const { return static_cast<Kind>(raw_ptr()->kind_); }
+  Report::Kind kind() const {
+    return static_cast<Report::Kind>(raw_ptr()->kind_);
+  }
 
   // Build, cache, and return formatted message.
   RawString* FormatMessage() const;
@@ -4067,7 +4072,7 @@
   static RawLanguageError* NewFormatted(const Error& prev_error,
                                         const Script& script,
                                         intptr_t token_pos,
-                                        Kind kind,
+                                        Report::Kind kind,
                                         Heap::Space space,
                                         const char* format, ...)
     PRINTF_ATTRIBUTE(6, 7);
@@ -4075,12 +4080,12 @@
   static RawLanguageError* NewFormattedV(const Error& prev_error,
                                          const Script& script,
                                          intptr_t token_pos,
-                                         Kind kind,
+                                         Report::Kind kind,
                                          Heap::Space space,
                                          const char* format, va_list args);
 
   static RawLanguageError* New(const String& formatted_message,
-                               Kind kind = kError,
+                               Report::Kind kind = Report::kError,
                                Heap::Space space = Heap::kNew);
 
   virtual const char* ToErrorCString() const;
@@ -4216,6 +4221,8 @@
   inline intptr_t GetNativeField(int index) const;
   inline void GetNativeFields(uint16_t num_fields,
                               intptr_t* field_values) const;
+  void SetNativeFields(uint16_t num_fields,
+                       const intptr_t* field_values) const;
 
   uint16_t NumNativeFields() const {
     return clazz()->ptr()->num_native_fields_;
@@ -4293,6 +4300,7 @@
 
   RawArray* imports() const { return raw_ptr()->imports_; }
   intptr_t num_imports() const { return raw_ptr()->num_imports_; }
+  RawLibrary* importer() const { return raw_ptr()->importer_; }
 
   bool ContainsLibrary(const Library& library) const;
   RawLibrary* GetLibrary(int index) const;
@@ -4302,7 +4310,7 @@
 
   bool is_deferred_load() const { return raw_ptr()->is_deferred_load_; }
   bool is_loaded() const { return raw_ptr()->is_loaded_; }
-  void LoadLibrary() const;
+  bool LoadLibrary() const;
 
   // Return the list of code objects that were compiled when this
   // prefix was not yet loaded. These code objects will be invalidated
@@ -4320,7 +4328,8 @@
 
   static RawLibraryPrefix* New(const String& name,
                                const Namespace& import,
-                               bool deferred_load);
+                               bool deferred_load,
+                               const Library& importer);
 
  private:
   static const int kInitialSize = 2;
@@ -4329,6 +4338,7 @@
   void set_name(const String& value) const;
   void set_imports(const Array& value) const;
   void set_num_imports(intptr_t value) const;
+  void set_importer(const Library& value) const;
   void set_is_loaded() const;
 
   static RawLibraryPrefix* New();
@@ -5013,12 +5023,18 @@
     return reinterpret_cast<intptr_t>(New(value));
   }
 
-  static bool IsValid(intptr_t value) {
-    return (value >= kMinValue) && (value <= kMaxValue);
-  }
+  template <typename T>
+  static bool IsValid(T value) {
+    COMPILE_ASSERT(sizeof(kMinValue) == sizeof(kMaxValue));
+    COMPILE_ASSERT(std::numeric_limits<T>::is_integer);
+    if (sizeof(value) < sizeof(kMinValue)) {
+      return true;
+    }
 
-  static bool IsValid64(int64_t value) {
-    return (value >= kMinValue) && (value <= kMaxValue);
+    T min_value = std::numeric_limits<T>::is_signed
+        ? static_cast<T>(kMinValue) : 0;
+    return (value >= min_value)
+        && (value <= static_cast<T>(kMaxValue));
   }
 
   RawInteger* ShiftOp(Token::Kind kind,
@@ -5303,6 +5319,8 @@
 
   int32_t CharAt(intptr_t index) const;
 
+  Scanner::CharAtFunc CharAtFunc() const;
+
   intptr_t CharSize() const;
 
   inline bool Equals(const String& str) const;
@@ -5530,10 +5548,13 @@
   static const intptr_t kBytesPerElement = 1;
   static const intptr_t kMaxElements = String::kMaxElements;
 
-  static intptr_t data_offset() { return OFFSET_OF(RawOneByteString, data_); }
+  static intptr_t data_offset() {
+    return OFFSET_OF_RETURNED_VALUE(RawOneByteString, data);
+  }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawOneByteString) == OFFSET_OF(RawOneByteString, data_));
+    ASSERT(sizeof(RawOneByteString) ==
+           OFFSET_OF_RETURNED_VALUE(RawOneByteString, data));
     return 0;
   }
 
@@ -5626,7 +5647,7 @@
     ASSERT((index >= 0) && (index < str.Length()));
     ASSERT(str.IsOneByteString());
     NoGCScope no_gc;
-    return &raw_ptr(str)->data_[index];
+    return &raw_ptr(str)->data()[index];
   }
 
   static RawOneByteString* ReadFrom(SnapshotReader* reader,
@@ -5657,10 +5678,13 @@
   static const intptr_t kBytesPerElement = 2;
   static const intptr_t kMaxElements = String::kMaxElements;
 
-  static intptr_t data_offset() { return OFFSET_OF(RawTwoByteString, data_); }
+  static intptr_t data_offset() {
+    return OFFSET_OF_RETURNED_VALUE(RawTwoByteString, data);
+  }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawTwoByteString) == OFFSET_OF(RawTwoByteString, data_));
+    ASSERT(sizeof(RawTwoByteString) ==
+           OFFSET_OF_RETURNED_VALUE(RawTwoByteString, data));
     return 0;
   }
 
@@ -5724,7 +5748,7 @@
     ASSERT((index >= 0) && (index < str.Length()));
     ASSERT(str.IsTwoByteString());
     NoGCScope no_gc;
-    return &raw_ptr(str)->data_[index];
+    return &raw_ptr(str)->data()[index];
   }
 
   static RawTwoByteString* ReadFrom(SnapshotReader* reader,
@@ -5930,9 +5954,11 @@
     return Smi::Value(raw_ptr()->length_);
   }
   static intptr_t length_offset() { return OFFSET_OF(RawArray, length_); }
-  static intptr_t data_offset() { return length_offset() + kWordSize; }
+  static intptr_t data_offset() {
+    return OFFSET_OF_RETURNED_VALUE(RawArray, data);
+  }
   static intptr_t element_offset(intptr_t index) {
-    return data_offset() + kWordSize * index;
+    return OFFSET_OF_RETURNED_VALUE(RawArray, data) + kWordSize * index;
   }
 
   RawObject* At(intptr_t index) const {
@@ -6304,7 +6330,7 @@
   void* DataAddr(intptr_t byte_offset) const {
     ASSERT((byte_offset == 0) ||
            ((byte_offset > 0) && (byte_offset < LengthInBytes())));
-    return reinterpret_cast<void*>(raw_ptr()->data_ + byte_offset);
+    return reinterpret_cast<void*>(raw_ptr()->data() + byte_offset);
   }
 
 #define TYPED_GETTER_SETTER(name, type)                                        \
@@ -6335,11 +6361,12 @@
   }
 
   static intptr_t data_offset() {
-    return OFFSET_OF(RawTypedData, data_);
+    return OFFSET_OF_RETURNED_VALUE(RawTypedData, data);
   }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawTypedData) == OFFSET_OF(RawTypedData, data_));
+    ASSERT(sizeof(RawTypedData) ==
+           OFFSET_OF_RETURNED_VALUE(RawTypedData, data));
     return 0;
   }
 
@@ -6754,7 +6781,9 @@
                           const Array& pc_offset_array) const;
   void set_expand_inlined(bool value) const;
 
-  void Append(const Array& code_list, const Array& pc_offset_list) const;
+  void Append(const Array& code_list,
+              const Array& pc_offset_list,
+              const intptr_t start_index) const;
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawStacktrace));
@@ -6835,7 +6864,7 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawJSRegExp) == OFFSET_OF(RawJSRegExp, data_));
+    ASSERT(sizeof(RawJSRegExp) == OFFSET_OF_RETURNED_VALUE(RawJSRegExp, data));
     return 0;
   }
 
@@ -7037,7 +7066,7 @@
   if (native_fields == TypedData::null()) {
     return 0;
   }
-  return reinterpret_cast<intptr_t*>(native_fields->ptr()->data_)[index];
+  return reinterpret_cast<intptr_t*>(native_fields->ptr()->data())[index];
 }
 
 
@@ -7053,7 +7082,7 @@
       field_values[i] = 0;
     }
   }
-  intptr_t* fields = reinterpret_cast<intptr_t*>(native_fields->ptr()->data_);
+  intptr_t* fields = reinterpret_cast<intptr_t*>(native_fields->ptr()->data());
   for (intptr_t i = 0; i < num_fields; i++) {
     field_values[i] = fields[i];
   }
diff --git a/runtime/vm/object_graph_test.cc b/runtime/vm/object_graph_test.cc
index 91d0765..72ab50f 100644
--- a/runtime/vm/object_graph_test.cc
+++ b/runtime/vm/object_graph_test.cc
@@ -8,11 +8,11 @@
 
 namespace dart {
 
-class Counter : public ObjectGraph::Visitor {
+class CounterVisitor : public ObjectGraph::Visitor {
  public:
   // Records the number of objects and total size visited, excluding 'skip'
   // and any objects only reachable through 'skip'.
-  Counter(RawObject* skip, RawObject* expected_parent)
+  CounterVisitor(RawObject* skip, RawObject* expected_parent)
       : count_(0), size_(0), skip_(skip), expected_parent_(expected_parent) { }
 
   virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
@@ -68,9 +68,9 @@
     ObjectGraph graph(isolate);
     {
       // Compare count and size when 'b' is/isn't skipped.
-      Counter with(Object::null(), Object::null());
+      CounterVisitor with(Object::null(), Object::null());
       graph.IterateObjectsFrom(a, &with);
-      Counter without(b_raw, a.raw());
+      CounterVisitor without(b_raw, a.raw());
       graph.IterateObjectsFrom(a, &without);
       // Only 'b' and 'c' were cut off.
       EXPECT_EQ(2, with.count() - without.count());
@@ -80,9 +80,9 @@
     {
       // Like above, but iterate over the entire isolate. The counts and sizes
       // are thus larger, but the difference should still be just 'b' and 'c'.
-      Counter with(Object::null(), Object::null());
+      CounterVisitor with(Object::null(), Object::null());
       graph.IterateObjects(&with);
-      Counter without(b_raw, a.raw());
+      CounterVisitor without(b_raw, a.raw());
       graph.IterateObjects(&without);
       EXPECT_EQ(2, with.count() - without.count());
       EXPECT_EQ(b_size + c_size,
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 6058481..e7b69f6 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -285,15 +285,18 @@
 
   EXPECT(Smi::IsValid(0));
   EXPECT(Smi::IsValid(-15));
+  EXPECT(Smi::IsValid(0xFFu));
   // Upper two bits must be either 00 or 11.
 #if defined(ARCH_IS_64_BIT)
   EXPECT(!Smi::IsValid(kMaxInt64));
   EXPECT(Smi::IsValid(0x3FFFFFFFFFFFFFFF));
-  EXPECT(Smi::IsValid(0xFFFFFFFFFFFFFFFF));
+  EXPECT(Smi::IsValid(-1));
+  EXPECT(!Smi::IsValid(0xFFFFFFFFFFFFFFFFu));
 #else
   EXPECT(!Smi::IsValid(kMaxInt32));
   EXPECT(Smi::IsValid(0x3FFFFFFF));
-  EXPECT(Smi::IsValid(0xFFFFFFFF));
+  EXPECT(Smi::IsValid(-1));
+  EXPECT(!Smi::IsValid(0xFFFFFFFFu));
 #endif
 
   EXPECT_EQ(5, smi.AsInt64Value());
@@ -524,10 +527,19 @@
     EXPECT(!dbl1.OperatorEquals(Smi::Handle(Smi::New(3))));
     EXPECT(!dbl1.OperatorEquals(Double::Handle()));
     const Double& nan0 = Double::Handle(Double::New(NAN));
+    EXPECT(isnan(nan0.value()));
     EXPECT(nan0.IsIdenticalTo(nan0));
     EXPECT(nan0.CanonicalizeEquals(nan0));
     EXPECT(!nan0.OperatorEquals(nan0));
-    // TODO(18738): Test bitwise different NaNs after agreement on spec.
+    const Double& nan1 = Double::Handle(
+        Double::New(bit_cast<double>(kMaxUint64 - 0)));
+    const Double& nan2 = Double::Handle(
+        Double::New(bit_cast<double>(kMaxUint64 - 1)));
+    EXPECT(isnan(nan1.value()));
+    EXPECT(isnan(nan2.value()));
+    EXPECT(!nan1.IsIdenticalTo(nan2));
+    EXPECT(!nan1.CanonicalizeEquals(nan2));
+    EXPECT(!nan1.OperatorEquals(nan2));
   }
   {
     const String& dbl_str0 = String::Handle(String::New("bla"));
@@ -2041,6 +2053,18 @@
   EXPECT(obj.IsTypedData());
   left_over_array ^= obj.raw();
   EXPECT_EQ((6 * kWordSize), left_over_array.Length());
+
+  // 4. Verify that GC can handle the filler object for a large array.
+  array = GrowableObjectArray::New((1 * MB) >> kWordSizeLog2);
+  EXPECT_EQ(0, array.Length());
+  for (intptr_t i = 0; i < 1; i++) {
+    value = Smi::New(i);
+    array.Add(value);
+  }
+  new_array = Array::MakeArray(array);
+  EXPECT_EQ(1, new_array.Length());
+  Isolate::Current()->heap()->CollectAllGarbage();
+  EXPECT_EQ(1, new_array.Length());
 }
 
 
@@ -2189,6 +2213,22 @@
   EXPECT_EQ('T', str.CharAt(0));
   EXPECT_EQ('n', str.CharAt(10));
   EXPECT_EQ('.', str.CharAt(21));
+
+  const char* kScript = "main() {}";
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+  Script& script2 = Script::Handle(
+      Script::FindByUrl(String::Handle(String::New("test-lib"))));
+  EXPECT(!script2.IsNull());
+  const Library& lib2 = Library::Handle(script2.FindLibrary());
+  EXPECT_EQ(lib2.raw(), lib.raw());
+  script2 = Script::FindByUrl(String::Handle(String::New("non-there.dart")));
+  EXPECT(script2.IsNull());
 }
 
 
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 564589e..e623cd7 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -175,7 +175,8 @@
   page->set_next(large_pages_);
   large_pages_ = page;
   usage_.capacity_in_words += page_size_in_words;
-  // Only one object in this page.
+  // Only one object in this page (at least until String::MakeExternal or
+  // Array::MakeArray is called).
   page->set_object_end(page->object_start() + size);
   return page;
 }
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index c41e5c1..03b863b 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -23,6 +23,7 @@
 #include "vm/object.h"
 #include "vm/object_store.h"
 #include "vm/os.h"
+#include "vm/report.h"
 #include "vm/resolver.h"
 #include "vm/scanner.h"
 #include "vm/scopes.h"
@@ -37,11 +38,10 @@
 DEFINE_FLAG(bool, enable_asserts, false, "Enable assert statements.");
 DEFINE_FLAG(bool, enable_type_checks, false, "Enable type checks.");
 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations.");
-DEFINE_FLAG(bool, warning_as_error, false, "Treat warnings as errors.");
-DEFINE_FLAG(bool, silent_warnings, false, "Silence warnings.");
 DEFINE_FLAG(bool, warn_mixin_typedef, true, "Warning on legacy mixin typedef.");
 DECLARE_FLAG(bool, error_on_bad_type);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 static void CheckedModeHandler(bool value) {
   FLAG_enable_asserts = value;
@@ -321,8 +321,7 @@
 Parser::~Parser() {
   if (unregister_pending_function_) {
     const GrowableObjectArray& pending_functions =
-        GrowableObjectArray::Handle(
-            isolate()->object_store()->pending_functions());
+        GrowableObjectArray::Handle(I->object_store()->pending_functions());
     ASSERT(pending_functions.Length() > 0);
     ASSERT(pending_functions.At(pending_functions.Length()-1) ==
         current_function().raw());
@@ -334,7 +333,7 @@
 void Parser::SetScript(const Script& script, intptr_t token_pos) {
   script_ = script.raw();
   tokens_iterator_.SetStream(
-      TokenStream::Handle(isolate(), script.tokens()), token_pos);
+      TokenStream::Handle(I, script.tokens()), token_pos);
   token_kind_ = Token::kILLEGAL;
 }
 
@@ -391,7 +390,7 @@
   ASSERT(token_kind_ == Token::kILLEGAL);
   token_kind_ = tokens_iterator_.CurrentTokenKind();
   if (token_kind_ == Token::kERROR) {
-    ErrorMsg(TokenPos(), "%s", CurrentLiteral()->ToCString());
+    ReportError(TokenPos(), "%s", CurrentLiteral()->ToCString());
   }
 }
 
@@ -422,33 +421,17 @@
   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(isolate(), ri);
+    const Integer& i = Integer::Handle(I, ri);
     if (i.CheckJavascriptIntegerOverflow()) {
-      ErrorMsg(TokenPos(),
-          "Integer literal does not fit in a Javascript integer: %s.",
-          i.ToCString());
+      ReportError(TokenPos(),
+                  "Integer literal does not fit in a Javascript integer: %s.",
+                  i.ToCString());
     }
   }
   return ri;
 }
 
 
-// A QualIdent is an optionally qualified identifier.
-struct QualIdent {
-  QualIdent() {
-    Clear();
-  }
-  void Clear() {
-    lib_prefix = NULL;
-    ident_pos = 0;
-    ident = NULL;
-  }
-  LibraryPrefix* lib_prefix;
-  intptr_t ident_pos;
-  String* ident;
-};
-
-
 struct ParamDesc {
   ParamDesc()
       : type(NULL),
@@ -915,7 +898,7 @@
 RawArray* Parser::EvaluateMetadata() {
   CheckToken(Token::kAT, "Metadata character '@' expected");
   GrowableObjectArray& meta_values =
-      GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
   while (CurrentToken() == Token::kAT) {
     ConsumeToken();
     intptr_t expr_pos = TokenPos();
@@ -923,11 +906,11 @@
       ExpectIdentifier("identifier expected");
     }
     // Reject expressions with deferred library prefix eagerly.
-    Object& obj = Object::Handle(isolate(),
+    Object& obj = Object::Handle(I,
                                  library_.LookupLocalObject(*CurrentLiteral()));
     if (!obj.IsNull() && obj.IsLibraryPrefix()) {
       if (LibraryPrefix::Cast(obj).is_deferred_load()) {
-        ErrorMsg("Metadata must be compile-time constant");
+        ReportError("Metadata must be compile-time constant");
       }
     }
     AstNode* expr = NULL;
@@ -941,7 +924,7 @@
     } else {
       // Can be x, C.x, or L.C.x.
       expr = ParsePrimary();  // Consumes x, C or L.C.
-      Class& cls = Class::Handle(isolate());
+      Class& cls = Class::Handle(I);
       if (expr->IsPrimaryNode()) {
         PrimaryNode* primary_node = expr->AsPrimaryNode();
         if (primary_node->primary().IsClass()) {
@@ -949,38 +932,39 @@
           // qualified static field.
           cls ^= primary_node->primary().raw();
         } else {
-          ErrorMsg(expr_pos, "Metadata expressions must refer to a const field "
-                             "or constructor");
+          ReportError(expr_pos,
+                      "Metadata expressions must refer to a const field "
+                      "or constructor");
         }
       }
       if (CurrentToken() == Token::kPERIOD) {
         // C.x or L.C.X.
         if (cls.IsNull()) {
-          ErrorMsg(expr_pos, "Metadata expressions must refer to a const field "
-                             "or constructor");
+          ReportError(expr_pos,
+                      "Metadata expressions must refer to a const field "
+                      "or constructor");
         }
         ConsumeToken();
         const intptr_t ident_pos = TokenPos();
         String* ident = ExpectIdentifier("identifier expected");
-        const Field& field = Field::Handle(isolate(),
-                                           cls.LookupStaticField(*ident));
+        const Field& field = Field::Handle(I, cls.LookupStaticField(*ident));
         if (field.IsNull()) {
-          ErrorMsg(ident_pos,
-                   "Class '%s' has no field '%s'",
-                   cls.ToCString(),
-                   ident->ToCString());
+          ReportError(ident_pos,
+                      "Class '%s' has no field '%s'",
+                      cls.ToCString(),
+                      ident->ToCString());
         }
         if (!field.is_const()) {
-          ErrorMsg(ident_pos,
-                   "Field '%s' of class '%s' is not const",
-                   ident->ToCString(),
-                   cls.ToCString());
+          ReportError(ident_pos,
+                      "Field '%s' of class '%s' is not const",
+                      ident->ToCString(),
+                      cls.ToCString());
         }
         expr = GenerateStaticFieldLookup(field, ident_pos);
       }
     }
     if (expr->EvalConstExpr() == NULL) {
-      ErrorMsg(expr_pos, "expression must be a compile-time constant");
+      ReportError(expr_pos, "expression must be a compile-time constant");
     }
     const Instance& val = EvaluateConstExpr(expr_pos, expr);
     meta_values.Add(val);
@@ -994,7 +978,7 @@
   ParamList params;
   ASSERT(func.num_fixed_parameters() == 0);  // static.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1002,7 +986,7 @@
 
   intptr_t ident_pos = TokenPos();
   const String& field_name = *ExpectIdentifier("field name expected");
-  const Class& field_class = Class::Handle(isolate(), func.Owner());
+  const Class& field_class = Class::Handle(I, func.Owner());
   const Field& field =
       Field::ZoneHandle(I, field_class.LookupStaticField(field_name));
 
@@ -1019,7 +1003,7 @@
     AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
     // This getter will only be called once at compile time.
     if (expr->EvalConstExpr() == NULL) {
-      ErrorMsg(expr_pos, "initializer is not a valid compile-time constant");
+      ReportError(expr_pos, "initializer is not a valid compile-time constant");
     }
     ReturnNode* return_node = new ReturnNode(ident_pos, expr);
     current_block_->statements->Add(return_node);
@@ -1074,9 +1058,9 @@
             ident_pos,
             field,
             new LiteralNode(ident_pos, Object::transition_sentinel())));
-    const String& init_name = String::Handle(isolate(), Symbols::New(
-        String::Handle(isolate(), String::Concat(
-            Symbols::InitPrefix(), String::Handle(isolate(), field.name())))));
+    const String& init_name = String::Handle(I, Symbols::New(
+        String::Handle(I, String::Concat(
+            Symbols::InitPrefix(), String::Handle(I, field.name())))));
     const Function& init_function = Function::ZoneHandle(I,
         field_class.LookupStaticFunction(init_name));
     ASSERT(!init_function.IsNull());
@@ -1104,7 +1088,7 @@
   ParamList params;
   ASSERT(func.num_fixed_parameters() == 0);  // static.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1152,8 +1136,8 @@
     expr = new AssignableNode(
         field.token_pos(),
         expr,
-        AbstractType::ZoneHandle(isolate(), field.type()),
-        String::ZoneHandle(isolate(), field.name()));
+        AbstractType::ZoneHandle(I, field.type()),
+        String::ZoneHandle(I, field.name()));
   }
   StoreStaticFieldNode* store = new StoreStaticFieldNode(field.token_pos(),
                                                          field,
@@ -1220,7 +1204,7 @@
   params.AddReceiver(ReceiverType(current_class()), ident_pos);
   ASSERT(func.num_fixed_parameters() == 1);  // receiver.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1231,7 +1215,7 @@
   LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver);
   ASSERT(IsIdentifier());
   const String& field_name = *CurrentLiteral();
-  const Class& field_class = Class::Handle(isolate(), func.Owner());
+  const Class& field_class = Class::Handle(I, func.Owner());
   const Field& field =
       Field::ZoneHandle(I, field_class.LookupInstanceField(field_name));
 
@@ -1268,7 +1252,7 @@
                            &field_type);
   ASSERT(func.num_fixed_parameters() == 2);  // receiver, value.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsVoidType());
+  ASSERT(AbstractType::Handle(I, func.result_type()).IsVoidType());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1368,7 +1352,7 @@
   ASSERT(func.token_pos() == 0);
   ASSERT(current_class().raw() == func.Owner());
 
-  ArgumentsDescriptor desc(Array::Handle(isolate(), func.saved_args_desc()));
+  ArgumentsDescriptor desc(Array::Handle(I, func.saved_args_desc()));
   ASSERT(desc.Count() > 0);
 
   // Set up scope for this function.
@@ -1385,7 +1369,7 @@
     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(isolate(), desc.NameAt(i)));
+      arg_names.SetAt(i, String::Handle(I, desc.NameAt(i)));
     }
     func_args->set_names(arg_names);
   }
@@ -1395,7 +1379,7 @@
       token_pos, func_name, *func_args, NULL, false);
   const Function& no_such_method = Function::ZoneHandle(I,
       Resolver::ResolveDynamicAnyArgs(Class::Handle(
-          isolate(), func.Owner()), Symbols::NoSuchMethod()));
+          I, func.Owner()), Symbols::NoSuchMethod()));
   StaticCallNode* call =
       new StaticCallNode(token_pos, no_such_method, arguments);
 
@@ -1414,7 +1398,7 @@
   ASSERT(func.token_pos() == 0);
   ASSERT(current_class().raw() == func.Owner());
 
-  const Array& args_desc = Array::Handle(isolate(), func.saved_args_desc());
+  const Array& args_desc = Array::Handle(I, func.saved_args_desc());
   ArgumentsDescriptor desc(args_desc);
   ASSERT(desc.Count() > 0);
 
@@ -1426,16 +1410,16 @@
   ArgumentListNode* no_args = new ArgumentListNode(token_pos);
   LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0));
 
-  const String& name = String::Handle(isolate(), func.name());
+  const String& name = String::Handle(I, func.name());
   const String& getter_name = String::ZoneHandle(I,
-      Symbols::New(String::Handle(isolate(), Field::GetterName(name))));
-  InstanceCallNode* getter_call = new(isolate()) InstanceCallNode(
+      Symbols::New(String::Handle(I, Field::GetterName(name))));
+  InstanceCallNode* getter_call = new(I) InstanceCallNode(
       token_pos, receiver, getter_name, no_args);
 
   // Pass arguments 1..n to the closure call.
-  ArgumentListNode* args = new ArgumentListNode(token_pos);
+  ArgumentListNode* args = new(I) ArgumentListNode(token_pos);
   const Array& names = Array::Handle(
-      isolate(), Array::New(desc.NamedCount(), Heap::kOld));
+      I, Array::New(desc.NamedCount(), Heap::kOld));
   // Positional parameters.
   intptr_t i = 1;
   for (; i < desc.PositionalCount(); ++i) {
@@ -1443,13 +1427,13 @@
   }
   // Named parameters.
   for (; i < desc.Count(); i++) {
-    args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
+    args->Add(new(I) LoadLocalNode(token_pos, scope->VariableAt(i)));
     intptr_t index = i - desc.PositionalCount();
-    names.SetAt(index, String::Handle(isolate(), desc.NameAt(index)));
+    names.SetAt(index, String::Handle(I, desc.NameAt(index)));
   }
   args->set_names(names);
 
-  const Class& owner = Class::Handle(isolate(), func.Owner());
+  const Class& owner = Class::Handle(I, func.Owner());
   ASSERT(!owner.IsNull());
   AstNode* result = NULL;
   if (owner.IsSignatureClass() && name.Equals(Symbols::Call())) {
@@ -1514,9 +1498,9 @@
     }
   } while (!token_stack.is_empty() && is_match && !unexpected_token_found);
   if (!is_match) {
-    ErrorMsg(token_pos, "unbalanced '%s'", Token::Str(token));
+    ReportError(token_pos, "unbalanced '%s'", Token::Str(token));
   } else if (unexpected_token_found) {
-    ErrorMsg(block_start_pos, "unterminated block");
+    ReportError(block_start_pos, "unterminated block");
   }
 }
 
@@ -1563,7 +1547,7 @@
     // At this point, we must see an identifier for the type or the
     // function parameter.
     if (!IsIdentifier()) {
-      ErrorMsg("parameter name or type expected");
+      ReportError("parameter name or type expected");
     }
     // We have not seen a parameter type yet, so we check if the next
     // identifier could represent a type before parsing it.
@@ -1603,7 +1587,7 @@
 
   if (params->has_optional_named_parameters &&
       (parameter.name->CharAt(0) == '_')) {
-    ErrorMsg(parameter.name_pos, "named parameter must not be private");
+    ReportError(parameter.name_pos, "named parameter must not be private");
   }
 
   // Check for duplicate formal parameters.
@@ -1612,8 +1596,8 @@
   for (intptr_t i = 0; i < num_existing_parameters; i++) {
     ParamDesc& existing_parameter = (*params->parameters)[i];
     if (existing_parameter.name->Equals(*parameter.name)) {
-      ErrorMsg(parameter.name_pos, "duplicate formal parameter '%s'",
-               parameter.name->ToCString());
+      ReportError(parameter.name_pos, "duplicate formal parameter '%s'",
+                  parameter.name->ToCString());
     }
   }
 
@@ -1624,7 +1608,7 @@
     if (!var_seen && !parameter.is_final) {
       // The parsed parameter type is actually the function result type.
       const AbstractType& result_type =
-          AbstractType::Handle(isolate(), parameter.type->raw());
+          AbstractType::Handle(I, parameter.type->raw());
 
       // Finish parsing the function type parameter.
       ParamList func_params;
@@ -1639,7 +1623,7 @@
       ParseFormalParameterList(no_explicit_default_values, false, &func_params);
 
       // The field 'is_static' has no meaning for signature functions.
-      const Function& signature_function = Function::Handle(isolate(),
+      const Function& signature_function = Function::Handle(I,
           Function::New(*parameter.name,
                         RawFunction::kSignatureFunction,
                         /* is_static = */ false,
@@ -1651,7 +1635,7 @@
                         parameter.name_pos));
       signature_function.set_result_type(result_type);
       AddFormalParamsToFunction(&func_params, signature_function);
-      const String& signature = String::Handle(isolate(),
+      const String& signature = String::Handle(I,
                                                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
@@ -1692,7 +1676,7 @@
     if ((!params->has_optional_positional_parameters &&
          !params->has_optional_named_parameters) ||
         !allow_explicit_default_value) {
-      ErrorMsg("parameter must not specify a default value");
+      ReportError("parameter must not specify a default value");
     }
     if (params->has_optional_positional_parameters) {
       ExpectToken(Token::kASSIGN);
@@ -1720,7 +1704,8 @@
     }
   }
   if (parameter.type->IsVoidType()) {
-    ErrorMsg("parameter '%s' may not be 'void'", parameter.name->ToCString());
+    ReportError("parameter '%s' may not be 'void'",
+                parameter.name->ToCString());
   }
   if (params->implicitly_final) {
     parameter.is_final = true;
@@ -1784,7 +1769,7 @@
     if ((CurrentToken() != Token::kRPAREN) &&
         !params->has_optional_positional_parameters &&
         !params->has_optional_named_parameters) {
-      ErrorMsg("',' or ')' expected");
+      ReportError("',' or ')' expected");
     }
   } else {
     ConsumeToken();
@@ -1813,13 +1798,12 @@
                                       ArgumentListNode* arguments,
                                       bool resolve_getter,
                                       bool* is_no_such_method) {
-  const Class& super_class = Class::Handle(
-      isolate(), current_class().SuperClass());
+  const Class& super_class = Class::Handle(I, current_class().SuperClass());
   if (super_class.IsNull()) {
-    ErrorMsg(token_pos, "class '%s' does not have a superclass",
-             String::Handle(isolate(), current_class().Name()).ToCString());
+    ReportError(token_pos, "class '%s' does not have a superclass",
+                String::Handle(I, current_class().Name()).ToCString());
   }
-  Function& super_func = Function::Handle(isolate(),
+  Function& super_func = Function::Handle(I,
       Resolver::ResolveDynamicAnyArgs(super_class, name));
   if (!super_func.IsNull() &&
       !super_func.AreValidArguments(arguments->length(),
@@ -1988,7 +1972,7 @@
     }
     super_op = new StaticCallNode(super_pos, super_operator, op_arguments);
   } else {
-    ErrorMsg(super_pos, "illegal super operator call");
+    ReportError(super_pos, "illegal super operator call");
   }
   return super_op;
 }
@@ -2063,7 +2047,7 @@
     // parameterized class, make sure that the receiver is captured as
     // instantiator.
     if (current_block_->scope->function_level() > 0) {
-      const Class& signature_class = Class::Handle(isolate(),
+      const Class& signature_class = Class::Handle(I,
           implicit_closure_function.signature_class());
       if (signature_class.NumTypeParameters() > 0) {
         CaptureInstantiator();
@@ -2079,8 +2063,8 @@
   TRACE_PARSER("ParseSuperFieldAccess");
   const Class& super_class = Class::ZoneHandle(I, current_class().SuperClass());
   if (super_class.IsNull()) {
-    ErrorMsg("class '%s' does not have a superclass",
-             String::Handle(isolate(), current_class().Name()).ToCString());
+    ReportError("class '%s' does not have a superclass",
+                String::Handle(I, current_class().Name()).ToCString());
   }
   AstNode* implicit_argument = LoadReceiver(field_pos);
 
@@ -2120,16 +2104,16 @@
                                           intptr_t supercall_pos,
                                           LocalVariable* receiver,
                                           ArgumentListNode* forwarding_args) {
-  const Class& super_class = Class::Handle(isolate(), cls.SuperClass());
+  const Class& super_class = Class::Handle(I, 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(isolate(), super_class.SuperClass()).IsObjectClass())) {
+       Class::Handle(I, super_class.SuperClass()).IsObjectClass())) {
     return;
   }
-  String& super_ctor_name = String::Handle(isolate(), super_class.Name());
+  String& super_ctor_name = String::Handle(I, super_class.Name());
   super_ctor_name = String::Concat(super_ctor_name, Symbols::Dot());
 
   ArgumentListNode* arguments = new ArgumentListNode(supercall_pos);
@@ -2149,8 +2133,8 @@
     for (int i = 0; i < forwarding_args->length(); i++) {
       arguments->Add(forwarding_args->NodeAt(i));
     }
-    String& ctor_name = String::Handle(isolate(), current_function().name());
-    String& class_name = String::Handle(isolate(), cls.Name());
+    String& ctor_name = String::Handle(I, current_function().name());
+    String& class_name = String::Handle(I, 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.
@@ -2163,22 +2147,22 @@
   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(isolate(), super_class.Name()).ToCString());
+      ReportError(supercall_pos,
+                  "unresolved implicit call to super constructor '%s()'",
+                  String::Handle(I, super_class.Name()).ToCString());
   }
   if (current_function().is_const() && !super_ctor.is_const()) {
-    ErrorMsg(supercall_pos, "implicit call to non-const super constructor");
+    ReportError(supercall_pos, "implicit call to non-const super constructor");
   }
 
-  String& error_message = String::Handle(isolate());
+  String& error_message = String::Handle(I);
   if (!super_ctor.AreValidArguments(arguments->length(),
                                     arguments->names(),
                                     &error_message)) {
-    ErrorMsg(supercall_pos,
-             "invalid arguments passed to super constructor '%s()': %s",
-             String::Handle(isolate(), super_class.Name()).ToCString(),
-             error_message.ToCString());
+    ReportError(supercall_pos,
+                "invalid arguments passed to super constructor '%s()': %s",
+                String::Handle(I, super_class.Name()).ToCString(),
+                error_message.ToCString());
   }
   current_block_->statements->Add(
       new StaticCallNode(supercall_pos, super_ctor, arguments));
@@ -2191,9 +2175,9 @@
   ASSERT(CurrentToken() == Token::kSUPER);
   const intptr_t supercall_pos = TokenPos();
   ConsumeToken();
-  const Class& super_class = Class::Handle(isolate(), cls.SuperClass());
+  const Class& super_class = Class::Handle(I, cls.SuperClass());
   ASSERT(!super_class.IsNull());
-  String& ctor_name = String::Handle(isolate(), super_class.Name());
+  String& ctor_name = String::Handle(I, super_class.Name());
   ctor_name = String::Concat(ctor_name, Symbols::Dot());
   if (CurrentToken() == Token::kPERIOD) {
     ConsumeToken();
@@ -2223,21 +2207,21 @@
   const Function& super_ctor = Function::ZoneHandle(I,
       super_class.LookupConstructor(ctor_name));
   if (super_ctor.IsNull()) {
-    ErrorMsg(supercall_pos,
-             "super class constructor '%s' not found",
-             ctor_name.ToCString());
+    ReportError(supercall_pos,
+                "super class constructor '%s' not found",
+                ctor_name.ToCString());
   }
   if (current_function().is_const() && !super_ctor.is_const()) {
-    ErrorMsg(supercall_pos, "super constructor must be const");
+    ReportError(supercall_pos, "super constructor must be const");
   }
-  String& error_message = String::Handle(isolate());
+  String& error_message = String::Handle(I);
   if (!super_ctor.AreValidArguments(arguments->length(),
                                     arguments->names(),
                                     &error_message)) {
-    ErrorMsg(supercall_pos,
-             "invalid arguments passed to super class constructor '%s': %s",
-             ctor_name.ToCString(),
-             error_message.ToCString());
+    ReportError(supercall_pos,
+                "invalid arguments passed to super class constructor '%s': %s",
+                ctor_name.ToCString(),
+                error_message.ToCString());
   }
   return new StaticCallNode(supercall_pos, super_ctor, arguments);
 }
@@ -2265,13 +2249,13 @@
   receiver->set_invisible(false);
   SetAllowFunctionLiterals(saved_mode);
   if (current_function().is_const() && !init_expr->IsPotentiallyConst()) {
-    ErrorMsg(field_pos,
-             "initializer expression must be compile time constant.");
+    ReportError(field_pos,
+                "initializer expression must be compile time constant.");
   }
   Field& field = Field::ZoneHandle(I, cls.LookupInstanceField(field_name));
   if (field.IsNull()) {
-    ErrorMsg(field_pos, "unresolved reference to instance field '%s'",
-             field_name.ToCString());
+    ReportError(field_pos, "unresolved reference to instance field '%s'",
+                field_name.ToCString());
   }
   CheckDuplicateFieldInit(field_pos, initialized_fields, &field);
   AstNode* instance = new LoadLocalNode(field_pos, receiver);
@@ -2281,8 +2265,8 @@
 
 
 void Parser::CheckFieldsInitialized(const Class& cls) {
-  const Array& fields = Array::Handle(isolate(), cls.fields());
-  Field& field = Field::Handle(isolate());
+  const Array& fields = Array::Handle(I, cls.fields());
+  Field& field = Field::Handle(I);
   SequenceNode* initializers = current_block_->statements;
   for (int field_num = 0; field_num < fields.Length(); field_num++) {
     field ^= fields.At(field_num);
@@ -2305,7 +2289,7 @@
 
     if (found) continue;
 
-    field.RecordStore(Object::Handle(isolate()));
+    field.RecordStore(Object::Handle(I));
   }
 }
 
@@ -2315,14 +2299,14 @@
   // 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(isolate(), current_class().raw());
-  const Library& saved_library = Library::Handle(isolate(), library().raw());
-  const Script& saved_script = Script::Handle(isolate(), script().raw());
+  const Class& saved_class = Class::Handle(I, current_class().raw());
+  const Library& saved_library = Library::Handle(I, library().raw());
+  const Script& saved_script = Script::Handle(I, script().raw());
   const intptr_t saved_token_pos = TokenPos();
 
-  set_current_class(Class::Handle(isolate(), field.origin()));
-  set_library(Library::Handle(isolate(), current_class().library()));
-  SetScript(Script::Handle(isolate(), current_class().script()),
+  set_current_class(Class::Handle(I, field.origin()));
+  set_library(Library::Handle(I, current_class().library()));
+  SetScript(Script::Handle(I, current_class().script()),
             field.token_pos());
 
   ASSERT(IsIdentifier());
@@ -2351,8 +2335,8 @@
                  LocalVariable* receiver,
                  GrowableArray<Field*>* initialized_fields) {
   TRACE_PARSER("ParseInitializedInstanceFields");
-  const Array& fields = Array::Handle(isolate(), cls.fields());
-  Field& f = Field::Handle(isolate());
+  const Array& fields = Array::Handle(I, cls.fields());
+  Field& f = Field::Handle(I);
   const intptr_t saved_pos = TokenPos();
   for (int i = 0; i < fields.Length(); i++) {
     f ^= fields.At(i);
@@ -2406,9 +2390,9 @@
   for (int i = 0; i < initialized_fields->length(); i++) {
     Field* initialized_field = (*initialized_fields)[i];
     if (initialized_field->raw() == field->raw()) {
-      ErrorMsg(init_pos,
-               "duplicate initialization for field %s",
-               String::Handle(isolate(), field->name()).ToCString());
+      ReportError(init_pos,
+                  "duplicate initialization for field %s",
+                  String::Handle(I, field->name()).ToCString());
     }
   }
   initialized_fields->Add(field);
@@ -2426,7 +2410,7 @@
       AstNode* init_statement;
       if (CurrentToken() == Token::kSUPER) {
         if (super_init_seen) {
-          ErrorMsg("duplicate call to super constructor");
+          ReportError("duplicate call to super constructor");
         }
         init_statement = ParseSuperInitializer(cls, receiver);
         super_init_seen = true;
@@ -2452,7 +2436,7 @@
   ASSERT(CurrentToken() == Token::kTHIS);
   const intptr_t call_pos = TokenPos();
   ConsumeToken();
-  String& ctor_name = String::Handle(isolate(), cls.Name());
+  String& ctor_name = String::Handle(I, cls.Name());
 
   ctor_name = String::Concat(ctor_name, Symbols::Dot());
   if (CurrentToken() == Token::kPERIOD) {
@@ -2478,16 +2462,16 @@
   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());
+    ReportError(call_pos, "constructor '%s' not found", ctor_name.ToCString());
   }
-  String& error_message = String::Handle(isolate());
+  String& error_message = String::Handle(I);
   if (!redirect_ctor.AreValidArguments(arguments->length(),
                                        arguments->names(),
                                        &error_message)) {
-    ErrorMsg(call_pos,
-             "invalid arguments passed to constructor '%s': %s",
-             ctor_name.ToCString(),
-             error_message.ToCString());
+    ReportError(call_pos,
+                "invalid arguments passed to constructor '%s': %s",
+                ctor_name.ToCString(),
+                error_message.ToCString());
   }
   current_block_->statements->Add(
       new StaticCallNode(call_pos, redirect_ctor, arguments));
@@ -2537,8 +2521,15 @@
     // TODO(hausner): Remove this limitation if the language spec indeed
     // allows optional parameters.
     if (func.HasOptionalParameters()) {
-      ErrorMsg(ctor_pos,
-               "forwarding constructors must not have optional parameters");
+      const Class& super_class = Class::Handle(I, current_class().SuperClass());
+      ReportError(ctor_pos,
+                  "cannot generate an implicit mixin application constructor "
+                  "forwarding to a super class constructor with optional "
+                  "parameters; add a constructor without optional parameters "
+                  "to class '%s' that redirects to the constructor with "
+                  "optional parameters and invoke it via super from a "
+                  "constructor of the class extending the mixin application",
+                  String::Handle(I, super_class.Name()).ToCString());
     }
 
     // Prepare user-defined arguments to be forwarded to super call.
@@ -2569,13 +2560,13 @@
 
 void Parser::CheckRecursiveInvocation() {
   const GrowableObjectArray& pending_functions =
-      GrowableObjectArray::Handle(isolate(),
-          isolate()->object_store()->pending_functions());
+      GrowableObjectArray::Handle(I,
+          I->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(isolate(), current_function().UserVisibleName());
-      ErrorMsg("circular dependency for function %s", fname.ToCString());
+          String::Handle(I, current_function().UserVisibleName());
+      ReportError("circular dependency for function %s", fname.ToCString());
     }
   }
   ASSERT(!unregister_pending_function_);
@@ -2593,7 +2584,7 @@
   ASSERT(!func.IsFactory());
   ASSERT(!func.is_static());
   ASSERT(!func.IsLocalFunction());
-  const Class& cls = Class::Handle(isolate(), func.Owner());
+  const Class& cls = Class::Handle(I, func.Owner());
   ASSERT(!cls.IsNull());
 
   CheckRecursiveInvocation();
@@ -2630,7 +2621,7 @@
   ParseFormalParameterList(allow_explicit_default_values, false, &params);
 
   SetupDefaultsForOptionalParams(&params, default_parameter_values);
-  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
   ASSERT(func.NumParameters() == params.parameters->length());
 
   // Now populate function scope with the formal parameters.
@@ -2672,14 +2663,14 @@
         Field& field =
             Field::ZoneHandle(I, cls.LookupInstanceField(field_name));
         if (field.IsNull()) {
-          ErrorMsg(param.name_pos,
-                   "unresolved reference to instance field '%s'",
-                   field_name.ToCString());
+          ReportError(param.name_pos,
+                      "unresolved reference to instance field '%s'",
+                      field_name.ToCString());
         }
         if (is_redirecting_constructor) {
-          ErrorMsg(param.name_pos,
-                   "redirecting constructors may not have "
-                   "initializing formal parameters");
+          ReportError(param.name_pos,
+                      "redirecting constructors may not have "
+                      "initializing formal parameters");
         }
         CheckDuplicateFieldInit(param.name_pos, &initialized_fields, &field);
 
@@ -2837,12 +2828,24 @@
     ParseStatementSequence();
     ExpectToken(Token::kRBRACE);
   } else if (CurrentToken() == Token::kARROW) {
-    ErrorMsg("constructors may not return a value");
+    ReportError("constructors may not return a value");
   } else if (IsLiteral("native")) {
-    ErrorMsg("native constructors not supported");
+    ReportError("native constructors not supported");
   } else if (CurrentToken() == Token::kSEMICOLON) {
     // Some constructors have no function body.
     ConsumeToken();
+    if (func.is_external()) {
+      // Body of an external method contains a single throw.
+      const String& function_name = String::ZoneHandle(func.name());
+      current_block_->statements->Add(
+          ThrowNoSuchMethodError(TokenPos(),
+                                 cls,
+                                 function_name,
+                                 NULL,   // No arguments.
+                                 InvocationMirror::kStatic,
+                                 InvocationMirror::kMethod,
+                                 NULL));  // No existing function.
+    }
   } else {
     UnexpectedToken();
   }
@@ -2881,7 +2884,7 @@
                                 Array* default_parameter_values) {
   TRACE_PARSER("ParseFunc");
   Function& saved_innermost_function =
-      Function::Handle(isolate(), innermost_function().raw());
+      Function::Handle(I, innermost_function().raw());
   innermost_function_ = func.raw();
 
   // Save current try index. Try index starts at zero for each function.
@@ -2937,7 +2940,7 @@
       AddFormalParamsToFunction(&params, func);
     }
     SetupDefaultsForOptionalParams(&params, default_parameter_values);
-    ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
+    ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
     ASSERT(func.NumParameters() == params.parameters->length());
 
     // Check whether the function has any field initializer formal parameters,
@@ -2946,8 +2949,8 @@
       for (int i = 0; i < params.parameters->length(); i++) {
         ParamDesc& param = (*params.parameters)[i];
         if (param.is_field_initializer) {
-          ErrorMsg(param.name_pos,
-                   "field initializer only allowed in constructors");
+          ReportError(param.name_pos,
+                      "field initializer only allowed in constructors");
         }
       }
     }
@@ -2972,9 +2975,9 @@
   intptr_t end_token_pos = 0;
   if (CurrentToken() == Token::kLBRACE) {
     ConsumeToken();
-    if (String::Handle(isolate(), func.name()).Equals(
+    if (String::Handle(I, func.name()).Equals(
         Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(isolate(), func.Owner());
+      const Class& owner = Class::Handle(I, func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
       }
@@ -2984,9 +2987,9 @@
     ExpectToken(Token::kRBRACE);
   } else if (CurrentToken() == Token::kARROW) {
     ConsumeToken();
-    if (String::Handle(isolate(), func.name()).Equals(
+    if (String::Handle(I, func.name()).Equals(
         Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(isolate(), func.Owner());
+      const Class& owner = Class::Handle(I, func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
       }
@@ -2997,9 +3000,9 @@
     current_block_->statements->Add(new ReturnNode(expr_pos, expr));
     end_token_pos = TokenPos();
   } else if (IsLiteral("native")) {
-    if (String::Handle(isolate(), func.name()).Equals(
+    if (String::Handle(I, func.name()).Equals(
         Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(isolate(), func.Owner());
+      const Class& owner = Class::Handle(I, func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
       }
@@ -3012,7 +3015,7 @@
     const String& function_name = String::ZoneHandle(I, func.name());
     current_block_->statements->Add(
         ThrowNoSuchMethodError(TokenPos(),
-                               current_class(),
+                               Class::Handle(func.Owner()),
                                function_name,
                                NULL,  // Ignore arguments.
                                func.is_static() ?
@@ -3111,45 +3114,46 @@
 }
 
 
-void Parser::ParseQualIdent(QualIdent* qual_ident) {
-  TRACE_PARSER("ParseQualIdent");
+// If the current identifier is a library prefix followed by a period,
+// consume the identifier and period, and return the resolved library
+// prefix.
+RawLibraryPrefix* Parser::ParsePrefix() {
   ASSERT(IsIdentifier());
-  ASSERT(!current_class().IsNull());
-  qual_ident->ident_pos = TokenPos();
-  qual_ident->ident = CurrentLiteral();
-  qual_ident->lib_prefix = NULL;
-  ConsumeToken();
-  if (CurrentToken() == Token::kPERIOD) {
-    // An identifier cannot be resolved in a local scope when top level parsing.
-    if (is_top_level_ ||
-        !ResolveIdentInLocalScope(qual_ident->ident_pos,
-                                  *(qual_ident->ident),
-                                  NULL)) {
-      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(isolate(),
-                                   parsed_function()->function().origin());
-        lib_prefix = cls.LookupLibraryPrefix(*(qual_ident->ident));
-      }
-      if (!lib_prefix.IsNull()) {
-        // We have a library prefix qualified identifier, unless the prefix is
-        // shadowed by a type parameter in scope.
-        if (current_class().IsNull() ||
-            (current_class().LookupTypeParameter(*(qual_ident->ident)) ==
-             TypeParameter::null())) {
-          ConsumeToken();  // Consume the kPERIOD token.
-          qual_ident->lib_prefix = &lib_prefix;
-          qual_ident->ident_pos = TokenPos();
-          qual_ident->ident =
-              ExpectIdentifier("identifier expected after '.'");
-        }
-      }
-    }
+  // A library prefix can never stand by itself. It must be followed by
+  // a period.
+  if (LookaheadToken(1) != Token::kPERIOD) {
+    return LibraryPrefix::null();
   }
+  const String& ident = *CurrentLiteral();
+
+  // It is relatively fast to look up a name in the library dictionary,
+  // compared to searching the nested local scopes. Look up the name
+  // in the library scope and return in the common case where ident is
+  // not a library prefix.
+  LibraryPrefix& prefix =
+      LibraryPrefix::Handle(I, library_.LookupLocalLibraryPrefix(ident));
+  if (prefix.IsNull()) {
+    return LibraryPrefix::null();
+  }
+
+  // A library prefix with the name exists. Now check whether it is
+  // shadowed by a local definition.
+  if (!is_top_level_ &&
+      ResolveIdentInLocalScope(TokenPos(), ident, NULL)) {
+    return LibraryPrefix::null();
+  }
+  // Check whether the identifier is shadowed by a type parameter.
+  ASSERT(!current_class().IsNull());
+  if (current_class().LookupTypeParameter(ident) != TypeParameter::null()) {
+    return LibraryPrefix::null();
+  }
+
+  // We have a name that is not shadowed, followed by a period.
+  // Consume the identifier and the period.
+  ConsumeToken();
+  ASSERT(CurrentToken() == Token::kPERIOD);  // We checked above.
+  ConsumeToken();
+  return prefix.raw();
 }
 
 
@@ -3161,21 +3165,21 @@
   ASSERT(current_member_ == method);
 
   if (method->has_var) {
-    ErrorMsg(method->name_pos, "keyword var not allowed for methods");
+    ReportError(method->name_pos, "keyword var not allowed for methods");
   }
   if (method->has_final) {
-    ErrorMsg(method->name_pos, "'final' not allowed for methods");
+    ReportError(method->name_pos, "'final' not allowed for methods");
   }
   if (method->has_abstract && method->has_static) {
-    ErrorMsg(method->name_pos,
-             "static method '%s' cannot be abstract",
-             method->name->ToCString());
-  }
+    ReportError(method->name_pos,
+                "static method '%s' cannot be abstract",
+                method->name->ToCString());
+     }
   if (method->has_const && !method->IsFactoryOrConstructor()) {
-    ErrorMsg(method->name_pos, "'const' not allowed for methods");
+    ReportError(method->name_pos, "'const' not allowed for methods");
   }
   if (method->has_abstract && method->IsFactoryOrConstructor()) {
-    ErrorMsg(method->name_pos, "constructor cannot be abstract");
+    ReportError(method->name_pos, "constructor cannot be abstract");
   }
   if (method->has_const && method->IsConstructor()) {
     current_class().set_is_const();
@@ -3243,36 +3247,46 @@
     }
     if ((method->params.num_fixed_parameters != expected_num_parameters) ||
         (method->params.num_optional_parameters != 0)) {
-      ErrorMsg(method->name_pos, "illegal %s parameters",
-               method->IsGetter() ? "getter" : "setter");
+      ReportError(method->name_pos, "illegal %s parameters",
+                  method->IsGetter() ? "getter" : "setter");
     }
   }
 
   // Parse redirecting factory constructor.
-  Type& redirection_type = Type::Handle(isolate());
-  String& redirection_identifier = String::Handle(isolate());
+  Type& redirection_type = Type::Handle(I);
+  String& redirection_identifier = String::Handle(I);
   bool is_redirecting = false;
   if (method->IsFactory() && (CurrentToken() == Token::kASSIGN)) {
     // Default parameter values are disallowed in redirecting factories.
     if (method->params.has_explicit_default_values) {
-      ErrorMsg("redirecting factory '%s' may not specify default values "
-               "for optional parameters",
-               method->name->ToCString());
+      ReportError("redirecting factory '%s' may not specify default values "
+                  "for optional parameters",
+                  method->name->ToCString());
+    }
+    if (method->has_external) {
+      ReportError(TokenPos(),
+                  "external factory constructor '%s' may not have redirection",
+                  method->name->ToCString());
     }
     ConsumeToken();
     const intptr_t type_pos = TokenPos();
     is_redirecting = true;
-    const AbstractType& type = AbstractType::Handle(isolate(),
-        ParseType(ClassFinalizer::kResolveTypeParameters));
+    const bool consume_unresolved_prefix =
+        (LookaheadToken(3) == Token::kLT) ||
+        (LookaheadToken(3) == Token::kPERIOD);
+    const AbstractType& type = AbstractType::Handle(I,
+        ParseType(ClassFinalizer::kResolveTypeParameters,
+                  false,  // Deferred types not allowed.
+                  consume_unresolved_prefix));
     if (!type.IsMalformed() && type.IsTypeParameter()) {
       // Replace the type with a malformed type and compile a throw when called.
       redirection_type = ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(isolate()),  // No previous error.
+          Error::Handle(I),  // No previous error.
           script_,
           type_pos,
           "factory '%s' may not redirect to type parameter '%s'",
           method->name->ToCString(),
-          String::Handle(isolate(), type.UserVisibleName()).ToCString());
+          String::Handle(I, type.UserVisibleName()).ToCString());
     } else {
       // We handle malformed and malbounded redirection type at run time.
       redirection_type ^= type.raw();
@@ -3285,7 +3299,12 @@
   } else if (CurrentToken() == Token::kCOLON) {
     // Parse initializers.
     if (!method->IsConstructor()) {
-      ErrorMsg("initializers only allowed on constructors");
+      ReportError("initializers only allowed on constructors");
+    }
+    if (method->has_external) {
+      ReportError(TokenPos(),
+                  "external constructor '%s' may not have initializers",
+                  method->name->ToCString());
     }
     if ((LookaheadToken(1) == Token::kTHIS) &&
         ((LookaheadToken(2) == Token::kLPAREN) ||
@@ -3295,8 +3314,8 @@
       if (method->params.has_field_initializer) {
         // Constructors that redirect to another constructor must not
         // initialize any fields using field initializer parameters.
-        ErrorMsg(formal_param_pos, "Redirecting constructor "
-                 "may not use field initializer parameters");
+        ReportError(formal_param_pos, "Redirecting constructor "
+                    "may not use field initializer parameters");
       }
       ConsumeToken();  // Colon.
       ExpectToken(Token::kTHIS);
@@ -3318,29 +3337,38 @@
   // Only constructors can redirect to another method.
   ASSERT((method->redirect_name == NULL) || method->IsConstructor());
 
+  if (method->IsConstructor() &&
+      method->has_external &&
+      method->params.has_field_initializer) {
+    ReportError(method->name_pos,
+                "external constructor '%s' may not have field initializers",
+                method->name->ToCString());
+  }
+
   intptr_t method_end_pos = TokenPos();
   if ((CurrentToken() == Token::kLBRACE) ||
       (CurrentToken() == Token::kARROW)) {
     if (method->has_abstract) {
-      ErrorMsg(method->name_pos,
-               "abstract method '%s' may not have a function body",
-               method->name->ToCString());
+      ReportError(TokenPos(),
+                  "abstract method '%s' may not have a function body",
+                  method->name->ToCString());
     } else if (method->has_external) {
-      ErrorMsg(method->name_pos,
-               "external method '%s' may not have a function body",
-               method->name->ToCString());
+      ReportError(TokenPos(),
+                  "external %s '%s' may not have a function body",
+                  method->IsFactoryOrConstructor() ? "constructor" : "method",
+                  method->name->ToCString());
     } else if (method->IsConstructor() && method->has_const) {
-      ErrorMsg(method->name_pos,
-               "const constructor '%s' may not have a function body",
-               method->name->ToCString());
+      ReportError(TokenPos(),
+                  "const constructor '%s' may not have a function body",
+                  method->name->ToCString());
     } else if (method->IsFactory() && method->has_const) {
-      ErrorMsg(method->name_pos,
-               "const factory '%s' may not have a function body",
-               method->name->ToCString());
+      ReportError(TokenPos(),
+                  "const factory '%s' may not have a function body",
+                  method->name->ToCString());
     }
     if (method->redirect_name != NULL) {
-      ErrorMsg(method->name_pos,
-               "Constructor with redirection may not have a function body");
+      ReportError(method->name_pos,
+                  "Constructor with redirection may not have a function body");
     }
     if (CurrentToken() == Token::kLBRACE) {
       SkipBlock();
@@ -3354,17 +3382,17 @@
     }
   } else if (IsLiteral("native")) {
     if (method->has_abstract) {
-      ErrorMsg(method->name_pos,
-               "abstract method '%s' may not have a function body",
-               method->name->ToCString());
+      ReportError(method->name_pos,
+                  "abstract method '%s' may not have a function body",
+                  method->name->ToCString());
     } else if (method->IsConstructor() && method->has_const) {
-      ErrorMsg(method->name_pos,
-               "const constructor '%s' may not be native",
-               method->name->ToCString());
+      ReportError(method->name_pos,
+                  "const constructor '%s' may not be native",
+                  method->name->ToCString());
     }
     if (method->redirect_name != NULL) {
-      ErrorMsg(method->name_pos,
-               "Constructor with redirection may not have a function body");
+      ReportError(method->name_pos,
+                  "Constructor with redirection may not have a function body");
     }
     ParseNativeDeclaration();
     method_end_pos = TokenPos();
@@ -3377,9 +3405,9 @@
         !method->has_external &&
         redirection_type.IsNull();
     if (must_have_body) {
-      ErrorMsg(method->name_pos,
-               "function body expected for method '%s'",
-               method->name->ToCString());
+      ReportError(method->name_pos,
+                  "function body expected for method '%s'",
+                  method->name->ToCString());
     }
 
     if (CurrentToken() == Token::kSEMICOLON) {
@@ -3401,9 +3429,9 @@
       if (must_have_semicolon) {
         ExpectSemicolon();
       } else {
-        ErrorMsg(method->name_pos,
-                 "function body or semicolon expected for method '%s'",
-                 method->name->ToCString());
+        ReportError(method->name_pos,
+                    "function body or semicolon expected for method '%s'",
+                    method->name->ToCString());
       }
     }
   }
@@ -3418,7 +3446,7 @@
   } else {
     function_kind = RawFunction::kRegularFunction;
   }
-  Function& func = Function::Handle(isolate(),
+  Function& func = Function::Handle(I,
       Function::New(*method->name,
                     function_kind,
                     method->has_static,
@@ -3473,21 +3501,21 @@
   ASSERT(!field->has_const || field->has_final);
 
   if (field->has_abstract) {
-    ErrorMsg("keyword 'abstract' not allowed in field declaration");
+    ReportError("keyword 'abstract' not allowed in field declaration");
   }
   if (field->has_external) {
-    ErrorMsg("keyword 'external' not allowed in field declaration");
+    ReportError("keyword 'external' not allowed in field declaration");
   }
   if (field->has_factory) {
-    ErrorMsg("keyword 'factory' not allowed in field declaration");
+    ReportError("keyword 'factory' not allowed in field declaration");
   }
   if (!field->has_static && field->has_const) {
-    ErrorMsg(field->name_pos, "instance field may not be 'const'");
+    ReportError(field->name_pos, "instance field may not be 'const'");
   }
-  Function& getter = Function::Handle(isolate());
-  Function& setter = Function::Handle(isolate());
+  Function& getter = Function::Handle(I);
+  Function& setter = Function::Handle(I);
   Field& class_field = Field::ZoneHandle(I);
-  Instance& init_value = Instance::Handle(isolate());
+  Instance& init_value = Instance::Handle(I);
   while (true) {
     bool has_initializer = CurrentToken() == Token::kASSIGN;
     bool has_simple_literal = false;
@@ -3506,7 +3534,7 @@
       // value is not assignable (assuming checked mode and disregarding actual
       // mode), the field value is reset and a kImplicitStaticFinalGetter is
       // created at finalization time.
-      if (field->has_static && (LookaheadToken(1) == Token::kSEMICOLON)) {
+      if (LookaheadToken(1) == Token::kSEMICOLON) {
         has_simple_literal = IsSimpleLiteral(*field->type, &init_value);
       }
       SkipExpr();
@@ -3514,10 +3542,10 @@
       // Static const and static final fields must have an initializer.
       // Static const fields are implicitly final.
       if (field->has_static && field->has_final) {
-        ErrorMsg(field->name_pos,
-                 "static %s field '%s' must have an initializer expression",
-                 field->has_const ? "const" : "final",
-                 field->name->ToCString());
+        ReportError(field->name_pos,
+                    "static %s field '%s' must have an initializer expression",
+                    field->has_const ? "const" : "final",
+                    field->name->ToCString());
       }
     }
 
@@ -3536,12 +3564,19 @@
       library_.AddFieldMetadata(class_field, field->metadata_pos);
     }
 
+    // Start tracking types for fields with simple initializers in their
+    // definition. This avoids some of the overhead to track this at runtime
+    // and rules out many fields from being unnecessary unboxing candidates.
+    if (!field->has_static && has_initializer && has_simple_literal) {
+      class_field.RecordStore(init_value);
+    }
+
     // For static final fields (this includes static const fields), set value to
     // "uninitialized" and create a kImplicitStaticFinalGetter getter method.
     if (field->has_static && has_initializer) {
       class_field.set_value(init_value);
       if (!has_simple_literal) {
-        String& getter_name = String::Handle(isolate(),
+        String& getter_name = String::Handle(I,
                                              Field::GetterSymbol(*field->name));
         getter = Function::New(getter_name,
                                RawFunction::kImplicitStaticFinalGetter,
@@ -3566,7 +3601,7 @@
 
     // For instance fields, we create implicit getter and setter methods.
     if (!field->has_static) {
-      String& getter_name = String::Handle(isolate(),
+      String& getter_name = String::Handle(I,
                                            Field::GetterSymbol(*field->name));
       getter = Function::New(getter_name, RawFunction::kImplicitGetter,
                              field->has_static,
@@ -3584,7 +3619,7 @@
       members->AddFunction(getter);
       if (!field->has_final) {
         // Build a setter accessor for non-const fields.
-        String& setter_name = String::Handle(isolate(),
+        String& setter_name = String::Handle(I,
                                              Field::SetterSymbol(*field->name));
         setter = Function::New(setter_name, RawFunction::kImplicitSetter,
                                field->has_static,
@@ -3600,7 +3635,7 @@
         params.AddFinalParameter(TokenPos(),
                                  &Symbols::Value(),
                                  field->type);
-        setter.set_result_type(Type::Handle(isolate(), Type::VoidType()));
+        setter.set_result_type(Type::Handle(I, Type::VoidType()));
         AddFormalParamsToFunction(&params, setter);
         members->AddFunction(setter);
       }
@@ -3632,8 +3667,8 @@
       member.params.has_optional_named_parameters ||
       (member.params.num_fixed_parameters != expected_num_parameters)) {
     // Subtract receiver when reporting number of expected arguments.
-    ErrorMsg(member.name_pos, "operator %s expects %" Pd " argument(s)",
-        member.name->ToCString(), (expected_num_parameters - 1));
+    ReportError(member.name_pos, "operator %s expects %" Pd " argument(s)",
+                member.name->ToCString(), (expected_num_parameters - 1));
   }
 }
 
@@ -3642,25 +3677,25 @@
                                      MemberDesc* member) {
   const String& name = *member->DictName();
   if (name.Equals(members->class_name())) {
-    ErrorMsg(member->name_pos,
-             "%s '%s' conflicts with class name",
-             member->ToCString(),
-             name.ToCString());
+    ReportError(member->name_pos,
+                "%s '%s' conflicts with class name",
+                member->ToCString(),
+                name.ToCString());
   }
   if (members->clazz().LookupTypeParameter(name) != TypeParameter::null()) {
-    ErrorMsg(member->name_pos,
-             "%s '%s' conflicts with type parameter",
-             member->ToCString(),
-             name.ToCString());
+    ReportError(member->name_pos,
+                "%s '%s' conflicts with type parameter",
+                member->ToCString(),
+                name.ToCString());
   }
   for (int i = 0; i < members->members().length(); i++) {
     MemberDesc* existing_member = &members->members()[i];
     if (name.Equals(*existing_member->DictName())) {
-      ErrorMsg(member->name_pos,
-               "%s '%s' conflicts with previously declared %s",
-               member->ToCString(),
-               name.ToCString(),
-               existing_member->ToCString());
+      ReportError(member->name_pos,
+                  "%s '%s' conflicts with previously declared %s",
+                  member->ToCString(),
+                  name.ToCString(),
+                  existing_member->ToCString());
     }
   }
 }
@@ -3692,10 +3727,10 @@
   }
   if (CurrentToken() == Token::kVAR) {
     if (member.has_const) {
-      ErrorMsg("identifier expected after 'const'");
+      ReportError("identifier expected after 'const'");
     }
     if (member.has_final) {
-      ErrorMsg("identifier expected after 'final'");
+      ReportError("identifier expected after 'final'");
     }
     ConsumeToken();
     member.has_var = true;
@@ -3704,7 +3739,7 @@
   } else if (CurrentToken() == Token::kFACTORY) {
     ConsumeToken();
     if (member.has_static) {
-      ErrorMsg("factory method cannot be explicitly marked static");
+      ReportError("factory method cannot be explicitly marked static");
     }
     member.has_factory = true;
     member.has_static = true;
@@ -3713,7 +3748,7 @@
   // Optionally parse a type.
   if (CurrentToken() == Token::kVOID) {
     if (member.has_var || member.has_factory) {
-      ErrorMsg("void not expected");
+      ReportError("void not expected");
     }
     ConsumeToken();
     ASSERT(member.type == NULL);
@@ -3753,19 +3788,19 @@
       // The factory name may be qualified, but the first identifier must match
       // the name of the immediately enclosing class.
       if (!member.name->Equals(members->class_name())) {
-        ErrorMsg(member.name_pos, "factory name must be '%s'",
-                 members->class_name().ToCString());
+        ReportError(member.name_pos, "factory name must be '%s'",
+                    members->class_name().ToCString());
       }
     } else if (member.has_static) {
-      ErrorMsg(member.name_pos, "constructor cannot be static");
+      ReportError(member.name_pos, "constructor cannot be static");
     }
     if (member.type != NULL) {
-      ErrorMsg(member.name_pos, "constructor must not specify return type");
+      ReportError(member.name_pos, "constructor must not specify return type");
     }
     // Do not bypass class resolution by using current_class() directly, since
     // it may be a patch class.
-    const Object& result_type_class = Object::Handle(isolate(),
-        UnresolvedClass::New(LibraryPrefix::Handle(isolate()),
+    const Object& result_type_class = Object::Handle(I,
+        UnresolvedClass::New(LibraryPrefix::Handle(I),
                              *member.name,
                              member.name_pos));
     // The type arguments of the result type are the type parameters of the
@@ -3773,7 +3808,7 @@
     // from the class being patched.
     member.type = &Type::ZoneHandle(I, Type::New(
         result_type_class,
-        TypeArguments::Handle(isolate(), current_class().type_parameters()),
+        TypeArguments::Handle(I, current_class().type_parameters()),
         member.name_pos));
 
     // We must be dealing with a constructor or named constructor.
@@ -3821,10 +3856,10 @@
              (LookaheadToken(1) != Token::kSEMICOLON)) {
     ConsumeToken();
     if (!Token::CanBeOverloaded(CurrentToken())) {
-      ErrorMsg("invalid operator overloading");
+      ReportError("invalid operator overloading");
     }
     if (member.has_static) {
-      ErrorMsg("operator overloading functions cannot be static");
+      ReportError("operator overloading functions cannot be static");
     }
     member.operator_token = CurrentToken();
     member.has_operator = true;
@@ -3838,7 +3873,7 @@
     member.name_pos = TokenPos();
     ConsumeToken();
   } else {
-    ErrorMsg("identifier expected");
+    ReportError("identifier expected");
   }
 
   ASSERT(member.name != NULL);
@@ -3861,8 +3896,8 @@
       if (member.has_final) {
         member.type = &Type::ZoneHandle(I, Type::DynamicType());
       } else {
-        ErrorMsg("missing 'var', 'final', 'const' or type"
-                 " in field declaration");
+        ReportError("missing 'var', 'final', 'const' or type"
+                    " in field declaration");
       }
     }
     ParseFieldDefinition(members, &member);
@@ -3896,21 +3931,21 @@
   if (FLAG_trace_parser) {
     OS::Print("TopLevel parsing class '%s'\n", class_name.ToCString());
   }
-  Class& cls = Class::Handle(isolate());
-  TypeArguments& orig_type_parameters = TypeArguments::Handle(isolate());
-  Object& obj = Object::Handle(isolate(),
+  Class& cls = Class::Handle(I);
+  TypeArguments& orig_type_parameters = TypeArguments::Handle(I);
+  Object& obj = Object::Handle(I,
                                library_.LookupLocalObject(class_name));
   if (obj.IsNull()) {
     if (is_patch) {
-      ErrorMsg(classname_pos, "missing class '%s' cannot be patched",
-               class_name.ToCString());
+      ReportError(classname_pos, "missing class '%s' cannot be patched",
+                  class_name.ToCString());
     }
     cls = Class::New(class_name, script_, classname_pos);
     library_.AddClass(cls);
   } else {
     if (!obj.IsClass()) {
-      ErrorMsg(classname_pos, "'%s' is already defined",
-               class_name.ToCString());
+      ReportError(classname_pos, "'%s' is already defined",
+                  class_name.ToCString());
     }
     cls ^= obj.raw();
     if (is_patch) {
@@ -3928,8 +3963,8 @@
       // pre-registered classes from object.cc or a duplicate definition.
       if (!(cls.is_prefinalized() ||
             RawObject::IsTypedDataViewClassId(cls.id()))) {
-        ErrorMsg(classname_pos, "class '%s' is already defined",
-                 class_name.ToCString());
+        ReportError(classname_pos, "class '%s' is already defined",
+                    class_name.ToCString());
       }
       // Pre-registered classes need their scripts connected at this time.
       cls.set_script(script_);
@@ -3943,45 +3978,45 @@
   if (is_patch) {
     // Check that the new type parameters are identical to the original ones.
     const TypeArguments& new_type_parameters =
-        TypeArguments::Handle(isolate(), cls.type_parameters());
+        TypeArguments::Handle(I, cls.type_parameters());
     const int new_type_params_count =
         new_type_parameters.IsNull() ? 0 : new_type_parameters.Length();
     const int orig_type_params_count =
         orig_type_parameters.IsNull() ? 0 : orig_type_parameters.Length();
     if (new_type_params_count != orig_type_params_count) {
-      ErrorMsg(classname_pos,
-               "class '%s' must be patched with identical type parameters",
-               class_name.ToCString());
+      ReportError(classname_pos,
+                  "class '%s' must be patched with identical type parameters",
+                  class_name.ToCString());
     }
-    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());
+    TypeParameter& new_type_param = TypeParameter::Handle(I);
+    TypeParameter& orig_type_param = TypeParameter::Handle(I);
+    String& new_name = String::Handle(I);
+    String& orig_name = String::Handle(I);
+    AbstractType& new_bound = AbstractType::Handle(I);
+    AbstractType& orig_bound = AbstractType::Handle(I);
     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);
       new_name = new_type_param.name();
       orig_name = orig_type_param.name();
       if (!new_name.Equals(orig_name)) {
-        ErrorMsg(new_type_param.token_pos(),
-                 "type parameter '%s' of patch class '%s' does not match "
-                 "original type parameter '%s'",
-                 new_name.ToCString(),
-                 class_name.ToCString(),
-                 orig_name.ToCString());
+        ReportError(new_type_param.token_pos(),
+                    "type parameter '%s' of patch class '%s' does not match "
+                    "original type parameter '%s'",
+                    new_name.ToCString(),
+                    class_name.ToCString(),
+                    orig_name.ToCString());
       }
       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());
+        ReportError(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);
@@ -3996,36 +4031,36 @@
 
   const bool is_mixin_declaration = (CurrentToken() == Token::kASSIGN);
   if (is_mixin_declaration && is_patch) {
-    ErrorMsg(classname_pos,
-             "mixin application '%s' may not be a patch class",
-             class_name.ToCString());
+    ReportError(classname_pos,
+                "mixin application '%s' may not be a patch class",
+                class_name.ToCString());
   }
 
-  AbstractType& super_type = Type::Handle(isolate());
+  AbstractType& super_type = Type::Handle(I);
   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(isolate(), super_type.error()));
+      ReportError(Error::Handle(I, super_type.error()));
     }
     if (super_type.IsDynamicType()) {
       // Unlikely here, since super type is not resolved yet.
-      ErrorMsg(type_pos,
-               "class '%s' may not extend 'dynamic'",
-               class_name.ToCString());
+      ReportError(type_pos,
+                  "class '%s' may not extend 'dynamic'",
+                  class_name.ToCString());
     }
     if (super_type.IsTypeParameter()) {
-      ErrorMsg(type_pos,
-               "class '%s' may not extend type parameter '%s'",
-               class_name.ToCString(),
-               String::Handle(isolate(),
-                              super_type.UserVisibleName()).ToCString());
+      ReportError(type_pos,
+                  "class '%s' may not extend type parameter '%s'",
+                  class_name.ToCString(),
+                  String::Handle(I,
+                                 super_type.UserVisibleName()).ToCString());
     }
     // The class finalizer will check whether the super type is malbounded.
     if (is_mixin_declaration) {
       if (CurrentToken() != Token::kWITH) {
-        ErrorMsg("mixin application clause 'with type' expected");
+        ReportError("mixin application clause 'with type' expected");
       }
       cls.set_is_mixin_app_alias();
       cls.set_is_synthesized_class();
@@ -4072,7 +4107,7 @@
   CompilerStats::num_classes_compiled++;
   set_current_class(cls);
   is_top_level_ = true;
-  String& class_name = String::Handle(isolate(), cls.Name());
+  String& class_name = String::Handle(I, cls.Name());
   const intptr_t class_pos = TokenPos();
   ClassDesc members(cls, class_name, false, class_pos);
   while (CurrentToken() != Token::kLBRACE) {
@@ -4095,7 +4130,7 @@
   cls.AddFields(members.fields());
 
   // Creating a new array for functions marks the class as parsed.
-  const Array& array = Array::Handle(isolate(),
+  const Array& array = Array::Handle(I,
                                      Array::MakeArray(members.functions()));
   cls.SetFunctions(array);
 
@@ -4107,14 +4142,14 @@
 
   if (cls.is_patch()) {
     // Apply the changes to the patched class looked up above.
-    Object& obj = Object::Handle(isolate(),
+    Object& obj = Object::Handle(I,
                                  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(isolate());
+    Error& error = Error::Handle(I);
     if (!orig_class.ApplyPatch(cls, &error)) {
-      AppendErrorMsg(error, class_pos, "applying patch failed");
+      Report::LongJumpF(error, script_, class_pos, "applying patch failed");
     }
   }
 }
@@ -4129,7 +4164,7 @@
   // 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(isolate(),
+  Function& ctor = Function::Handle(I,
       Function::New(ctor_name,
                     RawFunction::kConstructor,
                     /* is_static = */ false,
@@ -4176,8 +4211,8 @@
       // Check whether we have already seen this member.
       for (int i = 0; i < ctors.length(); i++) {
         if (ctors[i] == member) {
-          ErrorMsg(member->name_pos,
-                   "cyclic reference in constructor redirection");
+          ReportError(member->name_pos,
+                      "cyclic reference in constructor redirection");
         }
       }
       // We haven't seen this member. Add it to the list and follow
@@ -4203,14 +4238,14 @@
     OS::Print("toplevel parsing mixin application alias class '%s'\n",
               class_name.ToCString());
   }
-  const Object& obj = Object::Handle(isolate(),
+  const Object& obj = Object::Handle(I,
                                      library_.LookupLocalObject(class_name));
   if (!obj.IsNull()) {
-    ErrorMsg(classname_pos, "'%s' is already defined",
-             class_name.ToCString());
+    ReportError(classname_pos, "'%s' is already defined",
+                class_name.ToCString());
   }
   const Class& mixin_application =
-      Class::Handle(isolate(), Class::New(class_name, script_, classname_pos));
+      Class::Handle(I, Class::New(class_name, script_, classname_pos));
   mixin_application.set_is_mixin_app_alias();
   library_.AddClass(mixin_application);
   set_current_class(mixin_application);
@@ -4225,13 +4260,13 @@
 
   const intptr_t type_pos = TokenPos();
   AbstractType& type =
-      AbstractType::Handle(isolate(),
+      AbstractType::Handle(I,
                            ParseType(ClassFinalizer::kResolveTypeParameters));
   if (type.IsTypeParameter()) {
-    ErrorMsg(type_pos,
-             "class '%s' may not extend type parameter '%s'",
-             class_name.ToCString(),
-             String::Handle(isolate(), type.UserVisibleName()).ToCString());
+    ReportError(type_pos,
+                "class '%s' may not extend type parameter '%s'",
+                class_name.ToCString(),
+                String::Handle(I, type.UserVisibleName()).ToCString());
   }
 
   CheckToken(Token::kWITH, "mixin application 'with Type' expected");
@@ -4302,14 +4337,14 @@
 
   if (IsMixinAppAlias()) {
     if (FLAG_warn_mixin_typedef) {
-      Warning("deprecated mixin application typedef");
+      ReportWarning(TokenPos(), "deprecated mixin application typedef");
     }
     ParseMixinAppAlias(pending_classes, toplevel_class, metadata_pos);
     return;
   }
 
   // Parse the result type of the function type.
-  AbstractType& result_type = Type::Handle(isolate(), Type::DynamicType());
+  AbstractType& result_type = Type::Handle(I, Type::DynamicType());
   if (CurrentToken() == Token::kVOID) {
     ConsumeToken();
     result_type = Type::VoidType();
@@ -4325,20 +4360,20 @@
 
   // Lookup alias name and report an error if it is already defined in
   // the library scope.
-  const Object& obj = Object::Handle(isolate(),
+  const Object& obj = Object::Handle(I,
                                      library_.LookupLocalObject(*alias_name));
   if (!obj.IsNull()) {
-    ErrorMsg(alias_name_pos,
-             "'%s' is already defined", alias_name->ToCString());
+    ReportError(alias_name_pos,
+                "'%s' is already defined", alias_name->ToCString());
   }
 
   // Create the function type alias signature class. It will be linked to its
   // 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(isolate(),
+  const Class& function_type_alias = Class::Handle(I,
       Class::NewSignatureClass(*alias_name,
-                               Function::Handle(isolate()),
+                               Function::Handle(I),
                                script_,
                                alias_name_pos));
   library_.AddClass(function_type_alias);
@@ -4366,7 +4401,7 @@
   ParseFormalParameterList(no_explicit_default_values, false, &func_params);
   ExpectSemicolon();
   // The field 'is_static' has no meaning for signature functions.
-  Function& signature_function = Function::Handle(isolate(),
+  Function& signature_function = Function::Handle(I,
       Function::New(*alias_name,
                     RawFunction::kSignatureFunction,
                     /* is_static = */ false,
@@ -4382,7 +4417,7 @@
   // Patch the signature function in the signature class.
   function_type_alias.PatchSignatureFunction(signature_function);
 
-  const String& signature = String::Handle(isolate(),
+  const String& signature = String::Handle(I,
                                            signature_function.Signature());
   if (FLAG_trace_parser) {
     OS::Print("TopLevel parsing function type alias '%s'\n",
@@ -4469,7 +4504,7 @@
     if ((token == Token::kGT) || (token == Token::kSHR)) {
       ConsumeRightAngleBracket();
     } else {
-      ErrorMsg("right angle bracket expected");
+      ReportError("right angle bracket expected");
     }
   }
 }
@@ -4478,7 +4513,7 @@
 void Parser::SkipType(bool allow_void) {
   if (CurrentToken() == Token::kVOID) {
     if (!allow_void) {
-      ErrorMsg("'void' not allowed here");
+      ReportError("'void' not allowed here");
     }
     ConsumeToken();
   } else {
@@ -4496,12 +4531,12 @@
   TRACE_PARSER("ParseTypeParameters");
   if (CurrentToken() == Token::kLT) {
     const GrowableObjectArray& type_parameters_array =
-        GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+        GrowableObjectArray::Handle(I, GrowableObjectArray::New());
     intptr_t index = 0;
-    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());
+    TypeParameter& type_parameter = TypeParameter::Handle(I);
+    TypeParameter& existing_type_parameter = TypeParameter::Handle(I);
+    String& existing_type_parameter_name = String::Handle(I);
+    AbstractType& type_parameter_bound = Type::Handle(I);
     do {
       ConsumeToken();
       const intptr_t metadata_pos = SkipMetadata();
@@ -4513,8 +4548,8 @@
         existing_type_parameter ^= type_parameters_array.At(i);
         existing_type_parameter_name = existing_type_parameter.name();
         if (existing_type_parameter_name.Equals(type_parameter_name)) {
-          ErrorMsg(type_parameter_pos, "duplicate type parameter '%s'",
-                   type_parameter_name.ToCString());
+          ReportError(type_parameter_pos, "duplicate type parameter '%s'",
+                      type_parameter_name.ToCString());
         }
       }
       if (CurrentToken() == Token::kEXTENDS) {
@@ -4525,7 +4560,7 @@
         // type parameters, as they are not fully parsed yet.
         type_parameter_bound = ParseType(ClassFinalizer::kDoNotResolve);
       } else {
-        type_parameter_bound = isolate()->object_store()->object_type();
+        type_parameter_bound = I->object_store()->object_type();
       }
       type_parameter = TypeParameter::New(cls,
                                           index,
@@ -4542,10 +4577,10 @@
     if ((token == Token::kGT) || (token == Token::kSHR)) {
       ConsumeRightAngleBracket();
     } else {
-      ErrorMsg("right angle bracket expected");
+      ReportError("right angle bracket expected");
     }
     const TypeArguments& type_parameters =
-        TypeArguments::Handle(isolate(),
+        TypeArguments::Handle(I,
                               NewTypeArguments(type_parameters_array));
     cls.set_type_parameters(type_parameters);
     // Try to resolve the upper bounds, which will at least resolve the
@@ -4568,8 +4603,8 @@
   TRACE_PARSER("ParseTypeArguments");
   if (CurrentToken() == Token::kLT) {
     const GrowableObjectArray& types =
-        GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
-    AbstractType& type = AbstractType::Handle(isolate());
+        GrowableObjectArray::Handle(I, GrowableObjectArray::New());
+    AbstractType& type = AbstractType::Handle(I);
     do {
       ConsumeToken();
       type = ParseType(finalization);
@@ -4583,7 +4618,7 @@
     if ((token == Token::kGT) || (token == Token::kSHR)) {
       ConsumeRightAngleBracket();
     } else {
-      ErrorMsg("right angle bracket expected");
+      ReportError("right angle bracket expected");
     }
     if (finalization != ClassFinalizer::kIgnore) {
       return NewTypeArguments(types);
@@ -4598,10 +4633,10 @@
   TRACE_PARSER("ParseInterfaceList");
   ASSERT(CurrentToken() == Token::kIMPLEMENTS);
   const GrowableObjectArray& all_interfaces =
-      GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
-  AbstractType& interface = AbstractType::Handle(isolate());
+      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
+  AbstractType& interface = AbstractType::Handle(I);
   // First get all the interfaces already implemented by class.
-  Array& cls_interfaces = Array::Handle(isolate(), cls.interfaces());
+  Array& cls_interfaces = Array::Handle(I, cls.interfaces());
   for (intptr_t i = 0; i < cls_interfaces.Length(); i++) {
     interface ^= cls_interfaces.At(i);
     all_interfaces.Add(interface);
@@ -4612,10 +4647,9 @@
     intptr_t interface_pos = TokenPos();
     interface = ParseType(ClassFinalizer::kResolveTypeParameters);
     if (interface.IsTypeParameter()) {
-      ErrorMsg(interface_pos,
-               "type parameter '%s' may not be used in interface list",
-               String::Handle(isolate(),
-                              interface.UserVisibleName()).ToCString());
+      ReportError(interface_pos,
+                  "type parameter '%s' may not be used in interface list",
+                  String::Handle(I, interface.UserVisibleName()).ToCString());
     }
     all_interfaces.Add(interface);
   } while (CurrentToken() == Token::kCOMMA);
@@ -4628,26 +4662,25 @@
   TRACE_PARSER("ParseMixins");
   ASSERT(CurrentToken() == Token::kWITH);
   const GrowableObjectArray& mixin_types =
-      GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
-  AbstractType& mixin_type = AbstractType::Handle(isolate());
+      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
+  AbstractType& mixin_type = AbstractType::Handle(I);
   do {
     ConsumeToken();
     mixin_type = ParseType(ClassFinalizer::kResolveTypeParameters);
     if (mixin_type.IsDynamicType()) {
       // The string 'dynamic' is not resolved yet at this point, but a malformed
       // type mapped to dynamic can be encountered here.
-      ErrorMsg(mixin_type.token_pos(), "illegal mixin of a malformed type");
+      ReportError(mixin_type.token_pos(), "illegal mixin of a malformed type");
     }
     if (mixin_type.IsTypeParameter()) {
-      ErrorMsg(mixin_type.token_pos(),
-               "mixin type '%s' may not be a type parameter",
-               String::Handle(isolate(),
-                              mixin_type.UserVisibleName()).ToCString());
+      ReportError(mixin_type.token_pos(),
+                  "mixin type '%s' may not be a type parameter",
+                  String::Handle(I, mixin_type.UserVisibleName()).ToCString());
     }
     mixin_types.Add(mixin_type);
   } while (CurrentToken() == Token::kCOMMA);
   return MixinAppType::New(super_type,
-      Array::Handle(isolate(), Array::MakeArray(mixin_types)));
+      Array::Handle(I, Array::MakeArray(mixin_types)));
 }
 
 
@@ -4660,36 +4693,36 @@
   const bool is_static = true;
   const AbstractType& type = AbstractType::ZoneHandle(I,
       ParseConstFinalVarOrType(ClassFinalizer::kResolveTypeParameters));
-  Field& field = Field::Handle(isolate());
-  Function& getter = Function::Handle(isolate());
+  Field& field = Field::Handle(I);
+  Function& getter = Function::Handle(I);
   while (true) {
     const intptr_t name_pos = TokenPos();
     String& var_name = *ExpectIdentifier("variable name expected");
 
     if (library_.LookupLocalObject(var_name) != Object::null()) {
-      ErrorMsg(name_pos, "'%s' is already defined", var_name.ToCString());
+      ReportError(name_pos, "'%s' is already defined", var_name.ToCString());
     }
 
     // Check whether a getter or setter for this name exists. A const
     // 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(isolate(),
+    String& accessor_name = String::Handle(I,
                                            Field::GetterName(var_name));
     if (library_.LookupLocalObject(accessor_name) != Object::null()) {
-      ErrorMsg(name_pos, "getter for '%s' is already defined",
-               var_name.ToCString());
+      ReportError(name_pos, "getter for '%s' is already defined",
+                  var_name.ToCString());
     }
     accessor_name = Field::SetterName(var_name);
     if (library_.LookupLocalObject(accessor_name) != Object::null()) {
-      ErrorMsg(name_pos, "setter for '%s' is already defined",
-               var_name.ToCString());
+      ReportError(name_pos, "setter for '%s' is already defined",
+                  var_name.ToCString());
     }
 
     field = Field::New(var_name, is_static, is_final, is_const,
                        current_class(), name_pos);
     field.set_type(type);
-    field.set_value(Instance::Handle(isolate(), Instance::null()));
+    field.set_value(Instance::Handle(I, Instance::null()));
     top_level->fields.Add(field);
     library_.AddObject(field, var_name);
     if (metadata_pos >= 0) {
@@ -4697,7 +4730,7 @@
     }
     if (CurrentToken() == Token::kASSIGN) {
       ConsumeToken();
-      Instance& field_value = Instance::Handle(isolate(),
+      Instance& field_value = Instance::Handle(I,
                                                Object::sentinel().raw());
       bool has_simple_literal = false;
       if (LookaheadToken(1) == Token::kSEMICOLON) {
@@ -4707,7 +4740,7 @@
       field.set_value(field_value);
       if (!has_simple_literal) {
         // Create a static final getter.
-        String& getter_name = String::Handle(isolate(),
+        String& getter_name = String::Handle(I,
                                              Field::GetterSymbol(var_name));
         getter = Function::New(getter_name,
                                RawFunction::kImplicitStaticFinalGetter,
@@ -4729,7 +4762,7 @@
         }
       }
     } else if (is_final) {
-      ErrorMsg(name_pos, "missing initializer for final or const variable");
+      ReportError(name_pos, "missing initializer for final or const variable");
     }
 
     if (CurrentToken() == Token::kCOMMA) {
@@ -4748,7 +4781,7 @@
                                    intptr_t metadata_pos) {
   TRACE_PARSER("ParseTopLevelFunction");
   const intptr_t decl_begin_pos = TokenPos();
-  AbstractType& result_type = Type::Handle(isolate(), Type::DynamicType());
+  AbstractType& result_type = Type::Handle(I, Type::DynamicType());
   const bool is_static = true;
   bool is_external = false;
   bool is_patch = false;
@@ -4777,15 +4810,16 @@
 
   bool found = library_.LookupLocalObject(func_name) != Object::null();
   if (found && !is_patch) {
-    ErrorMsg(name_pos, "'%s' is already defined", func_name.ToCString());
+    ReportError(name_pos, "'%s' is already defined", func_name.ToCString());
   } else if (!found && is_patch) {
-    ErrorMsg(name_pos, "missing '%s' cannot be patched", func_name.ToCString());
+    ReportError(name_pos, "missing '%s' cannot be patched",
+                func_name.ToCString());
   }
-  String& accessor_name = String::Handle(isolate(),
+  String& accessor_name = String::Handle(I,
                                          Field::GetterName(func_name));
   if (library_.LookupLocalObject(accessor_name) != Object::null()) {
-    ErrorMsg(name_pos, "'%s' is already defined as getter",
-             func_name.ToCString());
+    ReportError(name_pos, "'%s' is already defined as getter",
+                func_name.ToCString());
   }
   // A setter named x= may co-exist with a function named x, thus we do
   // not need to check setters.
@@ -4816,9 +4850,9 @@
     ExpectSemicolon();
     is_native = true;
   } else {
-    ErrorMsg("function block expected");
+    ReportError("function block expected");
   }
-  Function& func = Function::Handle(isolate(),
+  Function& func = Function::Handle(I,
       Function::New(func_name,
                     RawFunction::kRegularFunction,
                     is_static,
@@ -4853,7 +4887,7 @@
   const bool is_static = true;
   bool is_external = false;
   bool is_patch = false;
-  AbstractType& result_type = AbstractType::Handle(isolate());
+  AbstractType& result_type = AbstractType::Handle(I);
   if (is_patch_source() &&
       (CurrentToken() == Token::kIDENT) &&
       CurrentLiteral()->Equals("patch")) {
@@ -4903,33 +4937,33 @@
   }
   if ((params.num_fixed_parameters != expected_num_parameters) ||
       (params.num_optional_parameters != 0)) {
-    ErrorMsg(name_pos, "illegal %s parameters",
-             is_getter ? "getter" : "setter");
+    ReportError(name_pos, "illegal %s parameters",
+                is_getter ? "getter" : "setter");
   }
 
   // Check whether this getter conflicts with a function or top-level variable
   // with the same name.
   if (is_getter &&
       (library_.LookupLocalObject(*field_name) != Object::null())) {
-    ErrorMsg(name_pos, "'%s' is already defined in this library",
-             field_name->ToCString());
+    ReportError(name_pos, "'%s' is already defined in this library",
+                field_name->ToCString());
   }
   // Check whether this setter conflicts with the implicit setter
   // of a top-level variable with the same name.
   if (!is_getter &&
       (library_.LookupLocalField(*field_name) != Object::null())) {
-    ErrorMsg(name_pos, "Variable '%s' is already defined in this library",
-             field_name->ToCString());
+    ReportError(name_pos, "Variable '%s' is already defined in this library",
+                field_name->ToCString());
   }
   bool found = library_.LookupLocalObject(accessor_name) != Object::null();
   if (found && !is_patch) {
-    ErrorMsg(name_pos, "%s for '%s' is already defined",
-             is_getter ? "getter" : "setter",
-             field_name->ToCString());
+    ReportError(name_pos, "%s for '%s' is already defined",
+                is_getter ? "getter" : "setter",
+                field_name->ToCString());
   } else if (!found && is_patch) {
-    ErrorMsg(name_pos, "missing %s for '%s' cannot be patched",
-             is_getter ? "getter" : "setter",
-             field_name->ToCString());
+    ReportError(name_pos, "missing %s for '%s' cannot be patched",
+                is_getter ? "getter" : "setter",
+                field_name->ToCString());
   }
 
   intptr_t accessor_end_pos = accessor_pos;
@@ -4952,9 +4986,9 @@
     ExpectSemicolon();
     is_native = true;
   } else {
-    ErrorMsg("function block expected");
+    ReportError("function block expected");
   }
-  Function& func = Function::Handle(isolate(),
+  Function& func = Function::Handle(I,
       Function::New(accessor_name,
                     is_getter ? RawFunction::kGetterFunction :
                                 RawFunction::kSetterFunction,
@@ -4987,7 +5021,7 @@
 RawObject* Parser::CallLibraryTagHandler(Dart_LibraryTag tag,
                                          intptr_t token_pos,
                                          const String& url) {
-  Dart_LibraryTagHandler handler = isolate()->library_tag_handler();
+  Dart_LibraryTagHandler handler = I->library_tag_handler();
   if (handler == NULL) {
     if (url.StartsWith(Symbols::DartScheme())) {
       if (tag == Dart_kCanonicalizeUrl) {
@@ -4995,26 +5029,26 @@
       }
       return Object::null();
     }
-    ErrorMsg(token_pos, "no library handler registered");
+    ReportError(token_pos, "no library handler registered");
   }
   // Block class finalization attempts when calling into the library
   // tag handler.
-  isolate()->BlockClassFinalization();
-  Api::Scope api_scope(isolate());
+  I->BlockClassFinalization();
+  Api::Scope api_scope(I);
   Dart_Handle result = handler(tag,
-                               Api::NewHandle(isolate(), library_.raw()),
-                               Api::NewHandle(isolate(), url.raw()));
-  isolate()->UnblockClassFinalization();
+                               Api::NewHandle(I, library_.raw()),
+                               Api::NewHandle(I, url.raw()));
+  I->UnblockClassFinalization();
   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(isolate());
+    Error& prev_error = Error::Handle(I);
     prev_error ^= Api::UnwrapHandle(result);
-    AppendErrorMsg(prev_error, token_pos, "library handler failed");
+    Report::LongJumpF(prev_error, script_, token_pos, "library handler failed");
   }
   if (tag == Dart_kCanonicalizeUrl) {
     if (!Dart_IsString(result)) {
-      ErrorMsg(token_pos, "library handler failed URI canonicalization");
+      ReportError(token_pos, "library handler failed URI canonicalization");
     }
   }
   return Api::UnwrapHandle(result);
@@ -5041,7 +5075,7 @@
 
 void Parser::ParseIdentList(GrowableObjectArray* names) {
   if (!IsIdentifier()) {
-    ErrorMsg("identifier expected");
+    ReportError("identifier expected");
   }
   while (IsIdentifier()) {
     names->Add(*CurrentLiteral());
@@ -5066,7 +5100,7 @@
   ASSERT(url_literal->AsLiteralNode()->literal().IsString());
   const String& url = String::Cast(url_literal->AsLiteralNode()->literal());
   if (url.Length() == 0) {
-    ErrorMsg("library url expected");
+    ReportError("library url expected");
   }
   bool is_deferred_import = false;
   if (is_import && (IsLiteral("deferred"))) {
@@ -5074,7 +5108,7 @@
     ConsumeToken();
     CheckToken(Token::kAS, "'as' expected");
   }
-  String& prefix = String::Handle(isolate());
+  String& prefix = String::Handle(I);
   intptr_t prefix_pos = 0;
   if (is_import && (CurrentToken() == Token::kAS)) {
     ConsumeToken();
@@ -5082,13 +5116,13 @@
     prefix = ExpectIdentifier("prefix identifier expected")->raw();
   }
 
-  Array& show_names = Array::Handle(isolate());
-  Array& hide_names = Array::Handle(isolate());
+  Array& show_names = Array::Handle(I);
+  Array& hide_names = Array::Handle(I);
   if (is_deferred_import || IsLiteral("show") || IsLiteral("hide")) {
     GrowableObjectArray& show_list =
-        GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+        GrowableObjectArray::Handle(I, GrowableObjectArray::New());
     GrowableObjectArray& hide_list =
-        GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+        GrowableObjectArray::Handle(I, GrowableObjectArray::New());
     // Libraries imported through deferred import automatically hide
     // the name 'loadLibrary'.
     if (is_deferred_import) {
@@ -5117,20 +5151,23 @@
   // Canonicalize library URL.
   const String& canon_url = String::CheckedHandle(
       CallLibraryTagHandler(Dart_kCanonicalizeUrl, import_pos, url));
-  // Lookup the library URL.
-  Library& library = Library::Handle(isolate(),
-                                     Library::LookupLibrary(canon_url));
+
+  // Create a new library if it does not exist yet.
+  Library& library = Library::Handle(I, Library::LookupLibrary(canon_url));
   if (library.IsNull()) {
-    // Create an empty library to mark that we have initiated loading of this
-    // library.
     library = Library::New(canon_url);
     library.Register();
-    // Call the library tag handler to load the library.
-    // TODO(hausner): do not load eagerly if import is deferred.
+  }
+
+  // If loading hasn't been requested yet, and if this is not a deferred
+  // library import, call the library tag handler to request loading
+  // the library.
+  if (library.LoadNotStarted() && !is_deferred_import) {
+    library.SetLoadRequested();
     CallLibraryTagHandler(Dart_kImportTag, import_pos, canon_url);
   }
 
-  Namespace& ns = Namespace::Handle(isolate(),
+  Namespace& ns = Namespace::Handle(I,
       Namespace::New(library, show_names, hide_names));
   if (metadata_pos >= 0) {
     ns.AddMetadata(metadata_pos, current_class());
@@ -5139,31 +5176,32 @@
   if (is_import) {
     // Ensure that private dart:_ libraries are only imported into dart:
     // libraries.
-    const String& lib_url = String::Handle(isolate(), library_.url());
+    const String& lib_url = String::Handle(I, library_.url());
     if (canon_url.StartsWith(Symbols::DartSchemePrivate()) &&
         !lib_url.StartsWith(Symbols::DartScheme())) {
-      ErrorMsg(import_pos, "private library is not accessible");
+      ReportError(import_pos, "private library is not accessible");
     }
     if (prefix.IsNull() || (prefix.Length() == 0)) {
       ASSERT(!is_deferred_import);
       library_.AddImport(ns);
     } else {
-      LibraryPrefix& library_prefix = LibraryPrefix::Handle(isolate());
+      LibraryPrefix& library_prefix = LibraryPrefix::Handle(I);
       library_prefix = library_.LookupLocalLibraryPrefix(prefix);
       if (!library_prefix.IsNull()) {
         // Check that prefix names of deferred import clauses are
         // unique.
         if (!is_deferred_import && library_prefix.is_deferred_load()) {
-          ErrorMsg(prefix_pos,
-                   "prefix '%s' already used in a deferred import clause",
-                   prefix.ToCString());
+          ReportError(prefix_pos,
+                      "prefix '%s' already used in a deferred import clause",
+                      prefix.ToCString());
         }
         if (is_deferred_import) {
-          ErrorMsg(prefix_pos, "prefix of deferred import must be uniqe");
+          ReportError(prefix_pos, "prefix of deferred import must be uniqe");
         }
         library_prefix.AddImport(ns);
       } else {
-        library_prefix = LibraryPrefix::New(prefix, ns, is_deferred_import);
+        library_prefix =
+            LibraryPrefix::New(prefix, ns, is_deferred_import, library_);
         library_.AddObject(library_prefix, prefix);
       }
     }
@@ -5208,7 +5246,7 @@
   intptr_t metadata_pos = SkipMetadata();
   if (CurrentToken() == Token::kLIBRARY) {
     if (is_patch_source()) {
-      ErrorMsg("patch cannot override library name");
+      ReportError("patch cannot override library name");
     }
     ParseLibraryName();
     if (metadata_pos >= 0) {
@@ -5226,9 +5264,9 @@
   // Core lib has not been explicitly imported, so we implicitly
   // import it here.
   if (!library_.ImportsCorelib()) {
-    Library& core_lib = Library::Handle(isolate(), Library::CoreLibrary());
+    Library& core_lib = Library::Handle(I, Library::CoreLibrary());
     ASSERT(!core_lib.IsNull());
-    const Namespace& core_ns = Namespace::Handle(isolate(),
+    const Namespace& core_ns = Namespace::Handle(I,
         Namespace::New(core_lib, Object::null_array(), Object::null_array()));
     library_.AddImport(core_ns);
   }
@@ -5246,7 +5284,7 @@
   CheckToken(Token::kPART, "'part of' expected");
   ConsumeToken();
   if (!IsLiteral("of")) {
-    ErrorMsg("'part of' expected");
+    ReportError("'part of' expected");
   }
   ConsumeToken();
   // The VM is not required to check that the library name matches the
@@ -5265,13 +5303,13 @@
   // Collect the classes found at the top level in this growable array.
   // They need to be registered with class finalization after parsing
   // has been completed.
-  ObjectStore* object_store = isolate()->object_store();
+  ObjectStore* object_store = I->object_store();
   const GrowableObjectArray& pending_classes =
-      GrowableObjectArray::Handle(isolate(), object_store->pending_classes());
+      GrowableObjectArray::Handle(I, object_store->pending_classes());
   SetPosition(0);
   is_top_level_ = true;
   TopLevel top_level;
-  Class& toplevel_class = Class::Handle(isolate(),
+  Class& toplevel_class = Class::Handle(I,
       Class::New(Symbols::TopLevel(), script_, TokenPos()));
   toplevel_class.set_library(library_);
 
@@ -5282,7 +5320,7 @@
     ParsePartHeader();
   }
 
-  const Class& cls = Class::Handle(isolate());
+  const Class& cls = Class::Handle(I);
   while (true) {
     set_current_class(cls);  // No current class.
     intptr_t metadata_pos = SkipMetadata();
@@ -5316,7 +5354,7 @@
   if ((top_level.fields.Length() > 0) || (top_level.functions.Length() > 0)) {
     toplevel_class.AddFields(top_level.fields);
 
-    const Array& array = Array::Handle(isolate(),
+    const Array& array = Array::Handle(I,
                                        Array::MakeArray(top_level.functions));
     toplevel_class.SetFunctions(array);
 
@@ -5327,10 +5365,10 @@
 
 
 void Parser::ChainNewBlock(LocalScope* outer_scope) {
-  Block* block = new(isolate()) Block(
+  Block* block = new(I) Block(
       current_block_,
       outer_scope,
-      new(isolate()) SequenceNode(TokenPos(), outer_scope));
+      new(I) SequenceNode(TokenPos(), outer_scope));
   current_block_ = block;
 }
 
@@ -5338,7 +5376,7 @@
 void Parser::OpenBlock() {
   ASSERT(current_block_ != NULL);
   LocalScope* outer_scope = current_block_->scope;
-  ChainNewBlock(new(isolate()) LocalScope(
+  ChainNewBlock(new(I) LocalScope(
       outer_scope, outer_scope->function_level(), outer_scope->loop_level()));
 }
 
@@ -5346,7 +5384,7 @@
 void Parser::OpenLoopBlock() {
   ASSERT(current_block_ != NULL);
   LocalScope* outer_scope = current_block_->scope;
-  ChainNewBlock(new(isolate()) LocalScope(
+  ChainNewBlock(new(I) LocalScope(
       outer_scope,
       outer_scope->function_level(),
       outer_scope->loop_level() + 1));
@@ -5358,20 +5396,20 @@
   if (current_block_ == NULL) {
     if (!func.IsLocalFunction()) {
       // We are compiling a non-nested function.
-      outer_scope = new(isolate()) LocalScope(NULL, 0, 0);
+      outer_scope = new(I) LocalScope(NULL, 0, 0);
     } else {
       // We are compiling the function of an invoked closure.
       // Restore the outer scope containing all captured variables.
       const ContextScope& context_scope =
-          ContextScope::Handle(isolate(), func.context_scope());
+          ContextScope::Handle(I, func.context_scope());
       ASSERT(!context_scope.IsNull());
-      outer_scope = new(isolate()) LocalScope(
+      outer_scope = new(I) LocalScope(
           LocalScope::RestoreOuterScope(context_scope), 0, 0);
     }
   } else {
     // We are parsing a nested function while compiling the enclosing function.
     outer_scope =
-        new(isolate()) LocalScope(current_block_->scope,
+        new(I) LocalScope(current_block_->scope,
                                   current_block_->scope->function_level() + 1,
                                   0);
   }
@@ -5420,11 +5458,8 @@
   if (!Utils::IsInt(16, params->num_fixed_parameters) ||
       !Utils::IsInt(16, params->num_optional_parameters)) {
     const Script& script = Script::Handle(Class::Handle(func.Owner()).script());
-    const Error& error = Error::Handle(LanguageError::NewFormatted(
-        Error::Handle(), script, func.token_pos(),
-        LanguageError::kError, Heap::kNew,
-        "too many formal parameters"));
-    ErrorMsg(error);
+    Report::MessageF(Report::kError, script, func.token_pos(),
+                     "too many formal parameters");
   }
   func.set_num_fixed_parameters(params->num_fixed_parameters);
   func.SetNumOptionalParameters(params->num_optional_parameters,
@@ -5453,12 +5488,12 @@
     ParamDesc& param_desc = (*params->parameters)[i];
     ASSERT(!is_top_level_ || param_desc.type->IsResolved());
     const String* name = param_desc.name;
-    LocalVariable* parameter = new(isolate()) LocalVariable(
+    LocalVariable* parameter = new(I) LocalVariable(
         param_desc.name_pos, *name, *param_desc.type);
     if (!scope->InsertParameterAt(i, parameter)) {
-      ErrorMsg(param_desc.name_pos,
-               "name '%s' already exists in scope",
-               param_desc.name->ToCString());
+      ReportError(param_desc.name_pos,
+                  "name '%s' already exists in scope",
+                  param_desc.name->ToCString());
     }
     param_desc.var = parameter;
     if (param_desc.is_final) {
@@ -5476,8 +5511,8 @@
                                       const Function& func) {
   ASSERT(func.is_native());
   TRACE_PARSER("ParseNativeFunctionBlock");
-  const Class& cls = Class::Handle(isolate(), func.Owner());
-  const Library& library = Library::Handle(isolate(), cls.library());
+  const Class& cls = Class::Handle(I, func.Owner());
+  const Library& library = Library::Handle(I, cls.library());
   ASSERT(func.NumParameters() == params->parameters->length());
 
   // Parse the function name out.
@@ -5490,17 +5525,17 @@
   NativeFunction native_function = NativeEntry::ResolveNative(
       library, native_name, num_params, &auto_setup_scope);
   if (native_function == NULL) {
-    ErrorMsg(native_pos,
-             "native function '%s' (%" Pd " arguments) cannot be found",
-             native_name.ToCString(), func.NumParameters());
+    ReportError(native_pos,
+                "native function '%s' (%" Pd " arguments) cannot be found",
+                native_name.ToCString(), func.NumParameters());
   }
   func.SetIsNativeAutoSetupScope(auto_setup_scope);
 
   // 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(isolate()) ReturnNode(
-      TokenPos(), new(isolate()) NativeBodyNode(
+  current_block_->statements->Add(new(I) ReturnNode(
+      TokenPos(), new(I) NativeBodyNode(
           TokenPos(),
           Function::ZoneHandle(I, func.raw()),
           native_name,
@@ -5550,9 +5585,9 @@
   const bool kTestOnly = false;
   LocalVariable* receiver = LookupReceiver(current_block_->scope, kTestOnly);
   if (receiver == NULL) {
-    ErrorMsg(token_pos, "illegal implicit access to receiver 'this'");
+    ReportError(token_pos, "illegal implicit access to receiver 'this'");
   }
-  return new(isolate()) LoadLocalNode(TokenPos(), receiver);
+  return new(I) LoadLocalNode(TokenPos(), receiver);
 }
 
 
@@ -5564,14 +5599,14 @@
   LocalVariable* param = LookupTypeArgumentsParameter(current_block_->scope,
                                                       kTestOnly);
   ASSERT(param != NULL);
-  return new(isolate()) LoadLocalNode(TokenPos(), param);
+  return new(I) LoadLocalNode(TokenPos(), param);
 }
 
 
 AstNode* Parser::CallGetter(intptr_t token_pos,
                             AstNode* object,
                             const String& name) {
-  return new(isolate()) InstanceGetterNode(token_pos, object, name);
+  return new(I) InstanceGetterNode(token_pos, object, name);
 }
 
 
@@ -5583,7 +5618,7 @@
   ASSERT(IsIdentifier());
   const intptr_t ident_pos = TokenPos();
   const String& ident = *CurrentLiteral();
-  LocalVariable* variable = new(isolate()) LocalVariable(
+  LocalVariable* variable = new(I) LocalVariable(
       ident_pos, ident, type);
   ConsumeToken();  // Variable identifier.
   AstNode* initialization = NULL;
@@ -5592,20 +5627,20 @@
     const intptr_t assign_pos = TokenPos();
     ConsumeToken();
     AstNode* expr = ParseExpr(is_const, kConsumeCascades);
-    initialization = new(isolate()) StoreLocalNode(
+    initialization = new(I) StoreLocalNode(
         assign_pos, variable, expr);
     if (is_const) {
       ASSERT(expr->IsLiteralNode());
       variable->SetConstValue(expr->AsLiteralNode()->literal());
     }
   } else if (is_final || is_const) {
-    ErrorMsg(ident_pos,
-    "missing initialization of 'final' or 'const' variable");
+    ReportError(ident_pos,
+                "missing initialization of 'final' or 'const' variable");
   } else {
     // Initialize variable with null.
-    AstNode* null_expr = new(isolate()) LiteralNode(
+    AstNode* null_expr = new(I) LiteralNode(
         ident_pos, Instance::ZoneHandle(I));
-    initialization = new(isolate()) StoreLocalNode(
+    initialization = new(I) StoreLocalNode(
         ident_pos, variable, null_expr);
   }
 
@@ -5615,17 +5650,17 @@
   if (previous_pos >= 0) {
     ASSERT(!script_.IsNull());
     if (previous_pos > ident_pos) {
-      ErrorMsg(ident_pos,
-               "initializer of '%s' may not refer to itself",
-               ident.ToCString());
+      ReportError(ident_pos,
+                  "initializer of '%s' may not refer to itself",
+                  ident.ToCString());
 
     } else {
       intptr_t line_number;
       script_.GetTokenLocation(previous_pos, &line_number, NULL);
-      ErrorMsg(ident_pos,
-               "identifier '%s' previously used in line %" Pd "",
-               ident.ToCString(),
-               line_number);
+      ReportError(ident_pos,
+                  "identifier '%s' previously used in line %" Pd "",
+                  ident.ToCString(),
+                  line_number);
     }
   }
 
@@ -5636,12 +5671,12 @@
         current_block_->scope->LookupVariable(variable->name(), true);
     ASSERT(existing_var != NULL);
     if (existing_var->owner() == current_block_->scope) {
-      ErrorMsg(ident_pos, "identifier '%s' already defined",
-               variable->name().ToCString());
+      ReportError(ident_pos, "identifier '%s' already defined",
+                  variable->name().ToCString());
     } else {
-      ErrorMsg(ident_pos,
-               "'%s' from outer scope has already been used, cannot redefine",
-               variable->name().ToCString());
+      ReportError(ident_pos, "'%s' from outer scope has already been used, "
+                  "cannot redefine",
+                  variable->name().ToCString());
     }
   }
   if (is_final || is_const) {
@@ -5671,7 +5706,7 @@
     if (type_is_optional) {
       return Type::DynamicType();
     } else {
-      ErrorMsg("type name expected");
+      ReportError("type name expected");
     }
   }
   if (type_is_optional) {
@@ -5701,7 +5736,7 @@
       ParseConstFinalVarOrType(FLAG_enable_type_checks ?
           ClassFinalizer::kCanonicalize : ClassFinalizer::kIgnore));
   if (!IsIdentifier()) {
-    ErrorMsg("identifier expected");
+    ReportError("identifier expected");
   }
 
   AstNode* initializers = ParseVariableDeclaration(type, is_final, is_const);
@@ -5709,7 +5744,7 @@
   while (CurrentToken() == Token::kCOMMA) {
     ConsumeToken();
     if (!IsIdentifier()) {
-      ErrorMsg("identifier expected after comma");
+      ReportError("identifier expected after comma");
     }
     // We have a second initializer. Allocate a sequence node now.
     // The sequence does not own the current scope. Set its own scope to NULL.
@@ -5725,7 +5760,7 @@
 
 AstNode* Parser::ParseFunctionStatement(bool is_literal) {
   TRACE_PARSER("ParseFunctionStatement");
-  AbstractType& result_type = AbstractType::Handle(isolate());
+  AbstractType& result_type = AbstractType::Handle(I);
   const String* variable_name = NULL;
   const String* function_name = NULL;
 
@@ -5756,10 +5791,10 @@
       ASSERT(!script_.IsNull());
       intptr_t line_number;
       script_.GetTokenLocation(previous_pos, &line_number, NULL);
-      ErrorMsg(name_pos,
-               "identifier '%s' previously used in line %" Pd "",
-               function_name->ToCString(),
-               line_number);
+      ReportError(name_pos,
+                  "identifier '%s' previously used in line %" Pd "",
+                  function_name->ToCString(),
+                  line_number);
     }
   }
   CheckToken(Token::kLPAREN);
@@ -5799,15 +5834,15 @@
     // 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(isolate(),
-        Type::Handle(isolate(), Type::Function()).type_class());
+    const Class& unknown_signature_class = Class::Handle(I,
+        Type::Handle(I, Type::Function()).type_class());
     function_type = Type::New(unknown_signature_class,
-                              TypeArguments::Handle(isolate()), function_pos);
+                              TypeArguments::Handle(I), 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(isolate()) LocalVariable(function_pos,
+    function_variable = new(I) LocalVariable(function_pos,
                                           *variable_name,
                                           function_type);
     function_variable->set_is_final();
@@ -5819,25 +5854,26 @@
                                                 true);
       ASSERT(existing_var != NULL);
       if (existing_var->owner() == current_block_->scope) {
-        ErrorMsg(function_pos, "identifier '%s' already defined",
-                 function_variable->name().ToCString());
+        ReportError(function_pos, "identifier '%s' already defined",
+                    function_variable->name().ToCString());
       } else {
-        ErrorMsg(function_pos,
-                 "'%s' from outer scope has already been used, cannot redefine",
-                 function_variable->name().ToCString());
+        ReportError(function_pos,
+                    "'%s' from outer scope has already been used, "
+                    "cannot redefine",
+                    function_variable->name().ToCString());
       }
     }
   }
 
   // Parse the local function.
-  Array& default_parameter_values = Array::Handle(isolate());
+  Array& default_parameter_values = Array::Handle(I);
   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(isolate(), function.Signature());
+  const String& signature = String::Handle(I, function.Signature());
   Class& signature_class = Class::ZoneHandle(I);
   if (!is_new_closure) {
     signature_class = function.signature_class();
@@ -5873,9 +5909,9 @@
 
   // Since the signature type is cached by the signature class, it may have
   // been finalized already.
-  Type& signature_type = Type::Handle(isolate(),
+  Type& signature_type = Type::Handle(I,
                                       signature_class.SignatureType());
-  TypeArguments& signature_type_arguments = TypeArguments::Handle(isolate(),
+  TypeArguments& signature_type_arguments = TypeArguments::Handle(I,
       signature_type.arguments());
 
   if (!signature_type.IsFinalized()) {
@@ -5931,14 +5967,14 @@
   // 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(isolate()) ClosureNode(
+  AstNode* closure = new(I) ClosureNode(
       function_pos, function, NULL, statements->scope());
 
   if (function_variable == NULL) {
     ASSERT(is_literal);
     return closure;
   } else {
-    AstNode* initialization = new(isolate()) StoreLocalNode(
+    AstNode* initialization = new(I) StoreLocalNode(
         function_pos, function_variable, closure);
     return initialization;
   }
@@ -6025,12 +6061,32 @@
 }
 
 
+// Returns true if the next tokens can be parsed as a an optionally
+// qualified identifier: [ident '.'] ident.
+// Current token position is not restored.
+bool Parser::TryParseQualIdent() {
+  if (CurrentToken() != Token::kIDENT) {
+    return false;
+  }
+  ConsumeToken();
+  if (CurrentToken() == Token::kPERIOD) {
+    ConsumeToken();
+    if (CurrentToken() != Token::kIDENT) {
+      return false;
+    }
+    ConsumeToken();
+  }
+  return true;
+}
+
+
 // Returns true if the next tokens can be parsed as a type with optional
 // type parameters. Current token position is not restored.
 bool Parser::TryParseOptionalType() {
   if (CurrentToken() == Token::kIDENT) {
-    QualIdent type_name;
-    ParseQualIdent(&type_name);
+    if (!TryParseQualIdent()) {
+      return false;
+    }
     if ((CurrentToken() == Token::kLT) && !TryParseTypeParameters()) {
       return false;
     }
@@ -6265,7 +6321,8 @@
     }
     if (statement != NULL) {
       if (!dead_code_allowed && abrupt_completing_seen) {
-        ErrorMsg(statement_pos, "dead code after abrupt completing statement");
+        ReportError(statement_pos,
+                    "dead code after abrupt completing statement");
       }
       current_block_->statements->Add(statement);
       abrupt_completing_seen |= IsAbruptCompleting(statement);
@@ -6324,7 +6381,7 @@
     ConsumeToken();
     false_branch = ParseNestedStatement(parsing_loop_body, NULL);
   }
-  AstNode* if_node = new(isolate()) IfNode(
+  AstNode* if_node = new(I) IfNode(
       if_pos, cond_expr, true_branch, false_branch);
   if (label != NULL) {
     current_block_->statements->Add(if_node);
@@ -6364,21 +6421,21 @@
     const intptr_t val_pos = values[i]->token_pos();
     if (first_value.IsInteger()) {
       if (!val.IsInteger()) {
-        ErrorMsg(val_pos, "expected case expression of type int");
+        ReportError(val_pos, "expected case expression of type int");
       }
       continue;
     }
     if (first_value.IsString()) {
       if (!val.IsString()) {
-        ErrorMsg(val_pos, "expected case expression of type String");
+        ReportError(val_pos, "expected case expression of type String");
       }
       continue;
     }
     if (val.IsDouble()) {
-      ErrorMsg(val_pos, "case expression may not be of type double");
+      ReportError(val_pos, "case expression may not be of type double");
     }
     if (val.clazz() != first_value.clazz()) {
-      ErrorMsg(val_pos, "all case expressions must be of same type");
+      ReportError(val_pos, "all case expressions must be of same type");
     }
     if (i == 0) {
       // The value is of some type other than int, String or double.
@@ -6386,15 +6443,16 @@
       // Check this only in the first loop iteration since all values
       // are of the same type, which we check above.
       if (ImplementsEqualOperator(val)) {
-        ErrorMsg(val_pos,
-            "type class of case expression must not implement operator ==");
+        ReportError(val_pos,
+                    "type class of case expression must not "
+                    "implement operator ==");
       }
     }
   }
   if (first_value.IsInteger()) {
-    return Type::Handle(isolate(), Type::IntType()).type_class();
+    return Type::Handle(I, Type::IntType()).type_class();
   } else if (first_value.IsString()) {
-    return Type::Handle(isolate(), Type::StringType()).type_class();
+    return Type::Handle(I, Type::StringType()).type_class();
   }
   return first_value.clazz();
 }
@@ -6407,11 +6465,11 @@
   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(isolate()) SequenceNode(case_pos, NULL);
+  SequenceNode* case_expressions = new(I) SequenceNode(case_pos, NULL);
   while (CurrentToken() == Token::kCASE || CurrentToken() == Token::kDEFAULT) {
     if (CurrentToken() == Token::kCASE) {
       if (default_seen) {
-        ErrorMsg("default clause must be last case");
+        ReportError("default clause must be last case");
       }
       ConsumeToken();  // Keyword case.
       const intptr_t expr_pos = TokenPos();
@@ -6419,14 +6477,14 @@
       ASSERT(expr->IsLiteralNode());
       case_expr_values->Add(expr->AsLiteralNode());
 
-      AstNode* switch_expr_load = new(isolate()) LoadLocalNode(
+      AstNode* switch_expr_load = new(I) LoadLocalNode(
           case_pos, switch_expr_value);
-      AstNode* case_comparison = new(isolate()) ComparisonNode(
+      AstNode* case_comparison = new(I) ComparisonNode(
           expr_pos, Token::kEQ, expr, switch_expr_load);
       case_expressions->Add(case_comparison);
     } else {
       if (default_seen) {
-        ErrorMsg("only one default clause is allowed");
+        ReportError("only one default clause is allowed");
       }
       ConsumeToken();  // Keyword default.
       default_seen = true;
@@ -6455,9 +6513,8 @@
       // 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(isolate()) ArgumentListNode(
-            TokenPos());
-        arguments->Add(new(isolate()) LiteralNode(
+        ArgumentListNode* arguments = new(I) ArgumentListNode(TokenPos());
+        arguments->Add(new(I) LiteralNode(
             TokenPos(), Integer::ZoneHandle(I, Integer::New(TokenPos()))));
         current_block_->statements->Add(
             MakeStaticCall(Symbols::FallThroughError(),
@@ -6474,7 +6531,7 @@
     }
   }
   SequenceNode* statements = CloseBlock();
-  return new(isolate()) CaseNode(case_pos, case_label,
+  return new(I) CaseNode(case_pos, case_label,
       case_expressions, default_seen, switch_expr_value, statements);
 }
 
@@ -6500,14 +6557,14 @@
   // a new type representing dynamic and can't reuse the canonical
   // type object for dynamic.
   const Type& temp_var_type = Type::ZoneHandle(I,
-       Type::New(Class::Handle(isolate(), Object::dynamic_class()),
-                 TypeArguments::Handle(isolate()),
+       Type::New(Class::Handle(I, Object::dynamic_class()),
+                 TypeArguments::Handle(I),
                  expr_pos));
   temp_var_type.SetIsFinalized();
-  LocalVariable* temp_variable = new(isolate()) LocalVariable(
+  LocalVariable* temp_variable = new(I) LocalVariable(
       expr_pos,  Symbols::SwitchExpr(), temp_var_type);
   current_block_->scope->AddVariable(temp_variable);
-  AstNode* save_switch_expr = new(isolate()) StoreLocalNode(
+  AstNode* save_switch_expr = new(I) StoreLocalNode(
       expr_pos, temp_variable, switch_expr);
   current_block_->statements->Add(save_switch_expr);
 
@@ -6526,7 +6583,7 @@
       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(isolate()) SourceLabel(
+        case_label = new(I) SourceLabel(
             label_pos, *label_name, SourceLabel::kCase);
         current_block_->scope->AddLabel(case_label);
       } else if (case_label->kind() == SourceLabel::kForward) {
@@ -6534,24 +6591,24 @@
         // the forward reference.
         case_label->ResolveForwardReference();
       } else {
-        ErrorMsg(label_pos, "label '%s' already exists in scope",
-                 label_name->ToCString());
+        ReportError(label_pos, "label '%s' already exists in scope",
+                    label_name->ToCString());
       }
       ASSERT(case_label->kind() == SourceLabel::kCase);
     }
     if (CurrentToken() == Token::kCASE ||
         CurrentToken() == Token::kDEFAULT) {
       if (default_seen) {
-        ErrorMsg("no case clauses allowed after default clause");
+        ReportError("no case clauses allowed after default clause");
       }
       CaseNode* case_clause =
           ParseCaseClause(temp_variable, &case_expr_values, case_label);
       default_seen = case_clause->contains_default();
       current_block_->statements->Add(case_clause);
     } else if (CurrentToken() != Token::kRBRACE) {
-      ErrorMsg("'case' or '}' expected");
+      ReportError("'case' or '}' expected");
     } else if (case_label != NULL) {
-      ErrorMsg("expecting at least one case clause after label");
+      ReportError("expecting at least one case clause after label");
     } else {
       break;
     }
@@ -6562,19 +6619,19 @@
   // variable holding the switch expression to match the type of the
   // case clause constants.
   temp_var_type.set_type_class(
-      Class::Handle(isolate(), CheckCaseExpressions(case_expr_values)));
+      Class::Handle(I, CheckCaseExpressions(case_expr_values)));
 
   // Check for unresolved label references.
   SourceLabel* unresolved_label =
       current_block_->scope->CheckUnresolvedLabels();
   if (unresolved_label != NULL) {
-    ErrorMsg("unresolved reference to label '%s'",
-             unresolved_label->name().ToCString());
+    ReportError("unresolved reference to label '%s'",
+                unresolved_label->name().ToCString());
   }
 
   SequenceNode* switch_body = CloseBlock();
   ExpectToken(Token::kRBRACE);
-  return new(isolate()) SwitchNode(switch_pos, label, switch_body);
+  return new(I) SwitchNode(switch_pos, label, switch_body);
 }
 
 
@@ -6589,7 +6646,7 @@
   ExpectToken(Token::kRPAREN);
   const bool parsing_loop_body =  true;
   SequenceNode* while_body = ParseNestedStatement(parsing_loop_body, label);
-  return new(isolate()) WhileNode(while_pos, label, cond_expr, while_body);
+  return new(I) WhileNode(while_pos, label, cond_expr, while_body);
 }
 
 
@@ -6606,7 +6663,7 @@
   AstNode* cond_expr = ParseExpr(kAllowConst, kConsumeCascades);
   ExpectToken(Token::kRPAREN);
   ExpectSemicolon();
-  return new(isolate()) DoWhileNode(do_pos, label, cond_expr, dowhile_body);
+  return new(I) DoWhileNode(do_pos, label, cond_expr, dowhile_body);
 }
 
 
@@ -6615,7 +6672,7 @@
   TRACE_PARSER("ParseForInStatement");
   bool is_final = (CurrentToken() == Token::kFINAL);
   if (CurrentToken() == Token::kCONST) {
-    ErrorMsg("Loop variable cannot be 'const'");
+    ReportError("Loop variable cannot be 'const'");
   }
   const String* loop_var_name = NULL;
   LocalVariable* loop_var = NULL;
@@ -6631,7 +6688,7 @@
                                       ClassFinalizer::kIgnore));
     loop_var_pos = TokenPos();
     loop_var_name = ExpectIdentifier("variable name expected");
-    loop_var = new(isolate()) LocalVariable(loop_var_pos, *loop_var_name, type);
+    loop_var = new(I) LocalVariable(loop_var_pos, *loop_var_name, type);
     if (is_final) {
       loop_var->set_is_final();
     }
@@ -6650,22 +6707,22 @@
   // 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(I, Type::DynamicType());
-  LocalVariable* iterator_var = new(isolate()) LocalVariable(
+  LocalVariable* iterator_var = new(I) LocalVariable(
       collection_pos, Symbols::ForInIter(), iterator_type);
   current_block_->scope->AddVariable(iterator_var);
 
   // Generate initialization of iterator variable.
-  ArgumentListNode* no_args = new(isolate()) ArgumentListNode(collection_pos);
-  AstNode* get_iterator = new(isolate()) InstanceGetterNode(
+  ArgumentListNode* no_args = new(I) ArgumentListNode(collection_pos);
+  AstNode* get_iterator = new(I) InstanceGetterNode(
       collection_pos, collection_expr, Symbols::GetIterator());
   AstNode* iterator_init =
-      new(isolate()) StoreLocalNode(collection_pos, iterator_var, get_iterator);
+      new(I) StoreLocalNode(collection_pos, iterator_var, get_iterator);
   current_block_->statements->Add(iterator_init);
 
   // Generate while loop condition.
-  AstNode* iterator_moveNext = new(isolate()) InstanceCallNode(
+  AstNode* iterator_moveNext = new(I) InstanceCallNode(
       collection_pos,
-      new(isolate()) LoadLocalNode(collection_pos, iterator_var),
+      new(I) LoadLocalNode(collection_pos, iterator_var),
       Symbols::MoveNext(),
       no_args);
 
@@ -6676,9 +6733,9 @@
   OpenLoopBlock();
   current_block_->scope->AddLabel(label);
 
-  AstNode* iterator_current = new(isolate()) InstanceGetterNode(
+  AstNode* iterator_current = new(I) InstanceGetterNode(
       collection_pos,
-      new(isolate()) LoadLocalNode(collection_pos, iterator_var),
+      new(I) LoadLocalNode(collection_pos, iterator_var),
       Symbols::Current());
 
   // Generate assignment of next iterator value to loop variable.
@@ -6687,7 +6744,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(isolate()) StoreLocalNode(loop_var_pos, loop_var, iterator_current);
+        new(I) StoreLocalNode(loop_var_pos, loop_var, iterator_current);
   } else {
     AstNode* loop_var_primary =
         ResolveIdent(loop_var_pos, *loop_var_name, false);
@@ -6712,7 +6769,7 @@
 
   SequenceNode* for_loop_statement = CloseBlock();
 
-  AstNode* while_statement = new(isolate()) WhileNode(
+  AstNode* while_statement = new(I) WhileNode(
       forin_pos, label, iterator_moveNext, for_loop_statement);
   current_block_->statements->Add(while_statement);
 
@@ -6764,8 +6821,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(isolate()) SequenceNode(incr_pos, NULL);
-      incr_sequence->Add(new(isolate()) CloneContextNode(for_pos));
+      SequenceNode* incr_sequence = new(I) SequenceNode(incr_pos, NULL);
+      incr_sequence->Add(new(I) CloneContextNode(for_pos));
       if (increment != NULL) {
         incr_sequence->Add(increment);
       }
@@ -6773,13 +6830,13 @@
       break;
     }
   }
-  AstNode* for_node =
-      new(isolate()) ForNode(for_pos,
-                  label,
-                  NodeAsSequenceNode(init_pos, initializer, NULL),
-                  condition,
-                  NodeAsSequenceNode(incr_pos, increment, NULL),
-                  body);
+  AstNode* for_node = new(I) ForNode(
+      for_pos,
+      label,
+      NodeAsSequenceNode(init_pos, initializer, NULL),
+      condition,
+      NodeAsSequenceNode(incr_pos, increment, NULL),
+      body);
   current_block_->statements->Add(for_node);
   return CloseBlock();
 }
@@ -6789,8 +6846,7 @@
 AstNode* Parser::MakeStaticCall(const String& cls_name,
                                 const String& func_name,
                                 ArgumentListNode* arguments) {
-  const Class& cls = Class::Handle(isolate(),
-                                   Library::LookupCoreClass(cls_name));
+  const Class& cls = Class::Handle(I, Library::LookupCoreClass(cls_name));
   ASSERT(!cls.IsNull());
   const Function& func = Function::ZoneHandle(I,
       Resolver::ResolveStatic(cls,
@@ -6798,15 +6854,15 @@
                               arguments->length(),
                               arguments->names()));
   ASSERT(!func.IsNull());
-  return new(isolate()) StaticCallNode(arguments->token_pos(), func, arguments);
+  return new(I) StaticCallNode(arguments->token_pos(), func, arguments);
 }
 
 
 AstNode* Parser::MakeAssertCall(intptr_t begin, intptr_t end) {
-  ArgumentListNode* arguments = new(isolate()) ArgumentListNode(begin);
-  arguments->Add(new(isolate()) LiteralNode(begin,
+  ArgumentListNode* arguments = new(I) ArgumentListNode(begin);
+  arguments->Add(new(I) LiteralNode(begin,
       Integer::ZoneHandle(I, Integer::New(begin))));
-  arguments->Add(new(isolate()) LiteralNode(end,
+  arguments->Add(new(I) LiteralNode(end,
       Integer::ZoneHandle(I, Integer::New(end))));
   return MakeStaticCall(Symbols::AssertionError(),
                         Library::PrivateCoreLibName(Symbols::ThrowNew()),
@@ -6822,7 +6878,7 @@
     const intptr_t pos = condition->token_pos();
     condition = BuildClosureCall(pos,
                                  condition,
-                                 new(isolate()) ArgumentListNode(pos));
+                                 new(I) ArgumentListNode(pos));
   } else if (condition->IsConditionalExprNode()) {
     ConditionalExprNode* cond_expr = condition->AsConditionalExprNode();
     cond_expr->set_true_expr(InsertClosureCallNodes(cond_expr->true_expr()));
@@ -6846,9 +6902,9 @@
   const intptr_t condition_end = TokenPos();
   ExpectToken(Token::kRPAREN);
   condition = InsertClosureCallNodes(condition);
-  condition = new(isolate()) UnaryOpNode(condition_pos, Token::kNOT, condition);
+  condition = new(I) UnaryOpNode(condition_pos, Token::kNOT, condition);
   AstNode* assert_throw = MakeAssertCall(condition_pos, condition_end);
-  return new(isolate()) IfNode(
+  return new(I) IfNode(
       condition_pos,
       condition,
       NodeAsSequenceNode(condition_pos, assert_throw, NULL),
@@ -6871,7 +6927,7 @@
                                    CatchParamDesc* stack_trace_param,
                                    LocalScope* scope) {
   if (exception_param->name != NULL) {
-    LocalVariable* var = new(isolate()) LocalVariable(
+    LocalVariable* var = new(I) LocalVariable(
         exception_param->token_pos,
         *exception_param->name,
         *exception_param->type);
@@ -6881,17 +6937,17 @@
     exception_param->var = var;
   }
   if (stack_trace_param->name != NULL) {
-    LocalVariable* var = new(isolate()) LocalVariable(
+    LocalVariable* var = new(I) 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) {
-      ErrorMsg(stack_trace_param->token_pos,
-               "name '%s' already exists in scope",
-               stack_trace_param->name->ToCString());
-    }
+      ReportError(stack_trace_param->token_pos,
+                  "name '%s' already exists in scope",
+                  stack_trace_param->name->ToCString());
+       }
     stack_trace_param->var = var;
   }
 }
@@ -6910,7 +6966,7 @@
 
 void Parser::PushTryBlock(Block* try_block) {
   intptr_t try_index = AllocateTryIndex();
-  TryBlocks* block = new(isolate()) TryBlocks(
+  TryBlocks* block = new(I) TryBlocks(
       try_block, try_blocks_list_, try_index);
   try_blocks_list_ = block;
 }
@@ -7026,8 +7082,8 @@
       // 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(isolate()) StoreLocalNode(
-          catch_pos, exception_param.var, new(isolate()) LoadLocalNode(
+      current_block_->statements->Add(new(I) StoreLocalNode(
+          catch_pos, exception_param.var, new(I) LoadLocalNode(
               catch_pos, exception_var)));
     }
     if (stack_trace_param.var != NULL) {
@@ -7035,14 +7091,14 @@
       // 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(isolate()) ArgumentListNode(catch_pos);
+      ArgumentListNode* no_args = new(I) ArgumentListNode(catch_pos);
       ASSERT(stack_trace_var != NULL);
-      current_block_->statements->Add(new(isolate()) StoreLocalNode(
-          catch_pos, stack_trace_param.var, new(isolate()) LoadLocalNode(
+      current_block_->statements->Add(new(I) StoreLocalNode(
+          catch_pos, stack_trace_param.var, new(I) LoadLocalNode(
               catch_pos, stack_trace_var)));
-      current_block_->statements->Add(new(isolate()) InstanceCallNode(
+      current_block_->statements->Add(new(I) InstanceCallNode(
           catch_pos,
-          new(isolate()) LoadLocalNode(catch_pos, stack_trace_param.var),
+          new(I) LoadLocalNode(catch_pos, stack_trace_param.var),
           Library::PrivateCoreLibName(Symbols::_setupFullStackTrace()),
           no_args));
     }
@@ -7061,10 +7117,10 @@
       // In the first case, unconditionally execute the catch body.  In the
       // second case, unconditionally throw.
       generic_catch_seen = true;
-      type_tests.Add(new(isolate()) LiteralNode(catch_pos, Bool::True()));
+      type_tests.Add(new(I) LiteralNode(catch_pos, Bool::True()));
       if (is_bad_type) {
         // Replace the body with one that throws.
-        SequenceNode* block = new(isolate()) SequenceNode(catch_pos, NULL);
+        SequenceNode* block = new(I) SequenceNode(catch_pos, NULL);
         block->Add(ThrowTypeError(catch_pos, *exception_param.type));
         catch_blocks.Last() = block;
       }
@@ -7080,14 +7136,14 @@
         // Make sure that the instantiator is captured.
         CaptureInstantiator();
       }
-      TypeNode* exception_type = new(isolate()) TypeNode(
+      TypeNode* exception_type = new(I) TypeNode(
           catch_pos, *exception_param.type);
-      AstNode* exception_value = new(isolate()) LoadLocalNode(
+      AstNode* exception_value = new(I) LoadLocalNode(
           catch_pos, exception_var);
       if (!exception_type->type().IsInstantiated()) {
         EnsureExpressionTemp();
       }
-      type_tests.Add(new(isolate()) ComparisonNode(
+      type_tests.Add(new(I) ComparisonNode(
           catch_pos, Token::kIS, exception_value, exception_type));
 
       // Do not add uninstantiated types (e.g. type parameter T or generic
@@ -7115,11 +7171,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(isolate()) SequenceNode(handler_pos, NULL);
-    current->Add(new(isolate()) ThrowNode(
+    current = new(I) SequenceNode(handler_pos, NULL);
+    current->Add(new(I) ThrowNode(
         handler_pos,
-        new(isolate()) LoadLocalNode(handler_pos, exception_var),
-        new(isolate()) LoadLocalNode(handler_pos, stack_trace_var)));
+        new(I) LoadLocalNode(handler_pos, exception_var),
+        new(I) LoadLocalNode(handler_pos, stack_trace_var)));
   } else if (type_tests.Last()->IsLiteralNode()) {
     ASSERT(type_tests.Last()->AsLiteralNode()->literal().raw() ==
            Bool::True().raw());
@@ -7137,7 +7193,7 @@
   while (!type_tests.is_empty()) {
     AstNode* type_test = type_tests.RemoveLast();
     SequenceNode* catch_block = catch_blocks.RemoveLast();
-    current_block_->statements->Add(new(isolate()) IfNode(
+    current_block_->statements->Add(new(I) IfNode(
         type_test->token_pos(), type_test, catch_block, current));
     current = CloseBlock();
   }
@@ -7164,7 +7220,7 @@
   LocalVariable* context_var =
       current_block_->scope->LocalLookupVariable(Symbols::SavedTryContextVar());
   if (context_var == NULL) {
-    context_var = new(isolate()) LocalVariable(
+    context_var = new(I) LocalVariable(
         TokenPos(),
         Symbols::SavedTryContextVar(),
         Type::ZoneHandle(I, Type::DynamicType()));
@@ -7173,7 +7229,7 @@
   LocalVariable* exception_var =
       current_block_->scope->LocalLookupVariable(Symbols::ExceptionVar());
   if (exception_var == NULL) {
-    exception_var = new(isolate()) LocalVariable(
+    exception_var = new(I) LocalVariable(
         TokenPos(),
         Symbols::ExceptionVar(),
         Type::ZoneHandle(I, Type::DynamicType()));
@@ -7182,7 +7238,7 @@
   LocalVariable* stack_trace_var =
       current_block_->scope->LocalLookupVariable(Symbols::StackTraceVar());
   if (stack_trace_var == NULL) {
-    stack_trace_var = new(isolate()) LocalVariable(
+    stack_trace_var = new(I) LocalVariable(
         TokenPos(),
         Symbols::StackTraceVar(),
         Type::ZoneHandle(I, Type::DynamicType()));
@@ -7209,14 +7265,14 @@
 
   if ((CurrentToken() != Token::kCATCH) && !IsLiteral("on") &&
       (CurrentToken() != Token::kFINALLY)) {
-    ErrorMsg("catch or finally clause expected");
+    ReportError("catch or finally clause expected");
   }
 
   // Now parse the 'catch' blocks if any.
   try_blocks_list_->enter_catch();
   const intptr_t handler_pos = TokenPos();
   const GrowableObjectArray& handler_types =
-      GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
   bool needs_stack_trace = false;
   SequenceNode* catch_handler_list =
       ParseCatchClauses(handler_pos, exception_var, stack_trace_var,
@@ -7240,7 +7296,7 @@
         inner_try_block->GetNodeToInlineFinally(node_index);
     while (node_to_inline != NULL) {
       finally_block = ParseFinallyBlock();
-      InlinedFinallyNode* node = new(isolate()) InlinedFinallyNode(finally_pos,
+      InlinedFinallyNode* node = new(I) InlinedFinallyNode(finally_pos,
                                                         finally_block,
                                                         context_var,
                                                         outer_try_index);
@@ -7252,7 +7308,7 @@
     finally_block = ParseFinallyBlock();
   }
 
-  CatchClauseNode* catch_clause = new(isolate()) CatchClauseNode(
+  CatchClauseNode* catch_clause = new(I) CatchClauseNode(
       handler_pos,
       catch_handler_list,
       Array::ZoneHandle(I, Array::MakeArray(handler_types)),
@@ -7266,7 +7322,7 @@
   // 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(isolate()) TryCatchNode(
+  AstNode* try_catch_node = new(I) TryCatchNode(
       try_pos, try_block, context_var, catch_clause, finally_block, try_index);
 
   if (try_label != NULL) {
@@ -7293,8 +7349,8 @@
     // Handle pathological cases first.
     if (label_name != NULL && target_name.Equals(*label_name)) {
       if (jump_kind == Token::kCONTINUE) {
-        ErrorMsg(jump_pos, "'continue' jump to label '%s' is illegal",
-                 target_name.ToCString());
+        ReportError(jump_pos, "'continue' jump to label '%s' is illegal",
+                    target_name.ToCString());
       }
       // L: break L; is a no-op.
       return NULL;
@@ -7308,37 +7364,37 @@
       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(isolate()) SourceLabel(
+        target = new(I) SourceLabel(
             TokenPos(), target_name, SourceLabel::kForward);
         switch_scope->AddLabel(target);
       }
     }
     if (target == NULL) {
-      ErrorMsg(jump_pos, "label '%s' not found", target_name.ToCString());
+      ReportError(jump_pos, "label '%s' not found", target_name.ToCString());
     }
   } else {
     target = current_block_->scope->LookupInnermostLabel(jump_kind);
     if (target == NULL) {
-      ErrorMsg(jump_pos, "'%s' is illegal here", Token::Str(jump_kind));
+      ReportError(jump_pos, "'%s' is illegal here", Token::Str(jump_kind));
     }
   }
   ASSERT(target != NULL);
   if (jump_kind == Token::kCONTINUE) {
     if (target->kind() == SourceLabel::kSwitch) {
-      ErrorMsg(jump_pos, "'continue' jump to switch statement is illegal");
+      ReportError(jump_pos, "'continue' jump to switch statement is illegal");
     } else if (target->kind() == SourceLabel::kStatement) {
-      ErrorMsg(jump_pos, "'continue' jump to label '%s' is illegal",
-               target->name().ToCString());
+      ReportError(jump_pos, "'continue' jump to label '%s' is illegal",
+                  target->name().ToCString());
     }
   }
   if (jump_kind == Token::kBREAK && target->kind() == SourceLabel::kCase) {
-    ErrorMsg(jump_pos, "'break' to case clause label is illegal");
+    ReportError(jump_pos, "'break' to case clause label is illegal");
   }
   if (target->FunctionLevel() != current_block_->scope->function_level()) {
-    ErrorMsg(jump_pos, "'%s' target must be in same function context",
-             Token::Str(jump_kind));
+    ReportError(jump_pos, "'%s' target must be in same function context",
+                Token::Str(jump_kind));
   }
-  return new(isolate()) JumpNode(jump_pos, jump_kind, target);
+  return new(I) JumpNode(jump_pos, jump_kind, target);
 }
 
 
@@ -7376,12 +7432,13 @@
     if (CurrentToken() != Token::kSEMICOLON) {
       if (current_function().IsConstructor() &&
           (current_block_->scope->function_level() == 0)) {
-        ErrorMsg(return_pos, "return of a value not allowed in constructors");
+        ReportError(return_pos,
+                    "return of a value not allowed in constructors");
       }
       AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
-      statement = new(isolate()) ReturnNode(statement_pos, expr);
+      statement = new(I) ReturnNode(statement_pos, expr);
     } else {
-      statement = new(isolate()) ReturnNode(statement_pos);
+      statement = new(I) ReturnNode(statement_pos);
     }
     AddNodeForFinallyInlining(statement);
     ExpectSemicolon();
@@ -7426,7 +7483,7 @@
     ExpectSemicolon();
     // Check if it is ok to do a rethrow.
     if ((try_blocks_list_ == NULL) || !try_blocks_list_->inside_catch()) {
-      ErrorMsg(statement_pos, "rethrow of an exception is not valid here");
+      ReportError(statement_pos, "rethrow of an exception is not valid here");
     }
     // The exception and stack trace variables are bound in the block
     // containing the try.
@@ -7438,10 +7495,10 @@
     LocalVariable* trace_var =
         scope->LocalLookupVariable(Symbols::StackTraceVar());
     ASSERT(trace_var != NULL);
-    statement = new(isolate()) ThrowNode(
+    statement = new(I) ThrowNode(
         statement_pos,
-        new(isolate()) LoadLocalNode(statement_pos, excp_var),
-        new(isolate()) LoadLocalNode(statement_pos, trace_var));
+        new(I) LoadLocalNode(statement_pos, excp_var),
+        new(I) LoadLocalNode(statement_pos, trace_var));
   } else {
     statement = ParseExpr(kAllowConst, kConsumeCascades);
     ExpectSemicolon();
@@ -7450,97 +7507,63 @@
 }
 
 
-void Parser::ErrorMsg(intptr_t token_pos, const char* format, ...) const {
-  va_list args;
-  va_start(args, format);
-  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);
+void Parser::ReportError(const Error& error) {
+  Report::LongJump(error);
   UNREACHABLE();
 }
 
 
-void Parser::ErrorMsg(const char* format, ...) {
+void Parser::ReportErrors(const Error& prev_error,
+                          const Script& script, intptr_t token_pos,
+                          const char* format, ...) {
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
-      Error::Handle(isolate()), script_, TokenPos(),
-      LanguageError::kError, Heap::kNew, format, args));
+  Report::LongJumpV(prev_error, script, token_pos, format, args);
   va_end(args);
-  isolate()->long_jump_base()->Jump(1, error);
   UNREACHABLE();
 }
 
 
-void Parser::ErrorMsg(const Error& error) {
-  Isolate::Current()->long_jump_base()->Jump(1, error);
+void Parser::ReportError(intptr_t token_pos, const char* format, ...) const {
+  va_list args;
+  va_start(args, format);
+  Report::MessageV(Report::kError, script_, token_pos, format, args);
+  va_end(args);
   UNREACHABLE();
 }
 
 
-void Parser::AppendErrorMsg(
-      const Error& prev_error, intptr_t token_pos, const char* format, ...) {
+void Parser::ReportError(const char* format, ...) const {
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
-      prev_error, script_, token_pos,
-      LanguageError::kError, Heap::kNew,
-      format, args));
+  Report::MessageV(Report::kError, script_, TokenPos(), format, args);
   va_end(args);
-  isolate()->long_jump_base()->Jump(1, error);
   UNREACHABLE();
 }
 
 
-void Parser::Warning(intptr_t token_pos, const char* format, ...) {
-  if (FLAG_silent_warnings) return;
+void Parser::ReportWarning(intptr_t token_pos, const char* format, ...) const {
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
-      Error::Handle(isolate()), script_, token_pos,
-      LanguageError::kWarning, Heap::kNew,
-      format, args));
+  Report::MessageV(Report::kWarning, script_, token_pos, format, args);
   va_end(args);
-  if (FLAG_warning_as_error) {
-    isolate()->long_jump_base()->Jump(1, error);
-    UNREACHABLE();
-  } else {
-    OS::Print("%s", error.ToErrorCString());
-  }
 }
 
 
-void Parser::Warning(const char* format, ...) {
-  if (FLAG_silent_warnings) return;
+void Parser::ReportWarning(const char* format, ...) const {
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
-      Error::Handle(isolate()), script_, TokenPos(),
-      LanguageError::kWarning, Heap::kNew,
-      format, args));
+  Report::MessageV(Report::kWarning, script_, TokenPos(), format, args);
   va_end(args);
-  if (FLAG_warning_as_error) {
-    isolate()->long_jump_base()->Jump(1, error);
-    UNREACHABLE();
-  } else {
-    OS::Print("%s", error.ToErrorCString());
-  }
-}
-
-
-void Parser::Unimplemented(const char* msg) {
-  ErrorMsg(TokenPos(), "%s", msg);
 }
 
 
 void Parser::CheckToken(Token::Kind token_expected, const char* msg) {
   if (CurrentToken() != token_expected) {
     if (msg != NULL) {
-      ErrorMsg("%s", msg);
+      ReportError("%s", msg);
     } else {
-      ErrorMsg("'%s' expected", Token::Str(token_expected));
+      ReportError("'%s' expected", Token::Str(token_expected));
     }
   }
 }
@@ -7548,7 +7571,7 @@
 
 void Parser::ExpectToken(Token::Kind token_expected) {
   if (CurrentToken() != token_expected) {
-    ErrorMsg("'%s' expected", Token::Str(token_expected));
+    ReportError("'%s' expected", Token::Str(token_expected));
   }
   ConsumeToken();
 }
@@ -7556,26 +7579,26 @@
 
 void Parser::ExpectSemicolon() {
   if (CurrentToken() != Token::kSEMICOLON) {
-    ErrorMsg("semicolon expected");
+    ReportError("semicolon expected");
   }
   ConsumeToken();
 }
 
 
 void Parser::UnexpectedToken() {
-  ErrorMsg("unexpected token '%s'",
-           CurrentToken() == Token::kIDENT ?
-               CurrentLiteral()->ToCString() : Token::Str(CurrentToken()));
+  ReportError("unexpected token '%s'",
+              CurrentToken() == Token::kIDENT ?
+                  CurrentLiteral()->ToCString() : Token::Str(CurrentToken()));
 }
 
 
 String* Parser::ExpectUserDefinedTypeIdentifier(const char* msg) {
   if (CurrentToken() != Token::kIDENT) {
-    ErrorMsg("%s", msg);
+    ReportError("%s", msg);
   }
   String* ident = CurrentLiteral();
   if (ident->Equals("dynamic")) {
-    ErrorMsg("%s", msg);
+    ReportError("%s", msg);
   }
   ConsumeToken();
   return ident;
@@ -7585,7 +7608,7 @@
 // Check whether current token is an identifier or a built-in identifier.
 String* Parser::ExpectIdentifier(const char* msg) {
   if (!IsIdentifier()) {
-    ErrorMsg("%s", msg);
+    ReportError("%s", msg);
   }
   String* ident = CurrentLiteral();
   ConsumeToken();
@@ -7625,20 +7648,20 @@
 
 
 AstNode* Parser::ThrowTypeError(intptr_t type_pos, const AbstractType& type) {
-  ArgumentListNode* arguments = new(isolate()) ArgumentListNode(type_pos);
+  ArgumentListNode* arguments = new(I) ArgumentListNode(type_pos);
   // Location argument.
-  arguments->Add(new(isolate()) LiteralNode(
+  arguments->Add(new(I) LiteralNode(
       type_pos, Integer::ZoneHandle(I, Integer::New(type_pos))));
   // Src value argument.
-  arguments->Add(new(isolate()) LiteralNode(type_pos, Instance::ZoneHandle(I)));
+  arguments->Add(new(I) LiteralNode(type_pos, Instance::ZoneHandle(I)));
   // Dst type name argument.
-  arguments->Add(new(isolate()) LiteralNode(type_pos, Symbols::Malformed()));
+  arguments->Add(new(I) LiteralNode(type_pos, Symbols::Malformed()));
   // Dst name argument.
-  arguments->Add(new(isolate()) LiteralNode(type_pos, Symbols::Empty()));
+  arguments->Add(new(I) LiteralNode(type_pos, Symbols::Empty()));
   // Malformed type error or malbounded type error.
-  const Error& error = Error::Handle(isolate(), type.error());
+  const Error& error = Error::Handle(I, type.error());
   ASSERT(!error.IsNull());
-  arguments->Add(new(isolate()) LiteralNode(type_pos, String::ZoneHandle(I,
+  arguments->Add(new(I) LiteralNode(type_pos, String::ZoneHandle(I,
       Symbols::New(error.ToErrorCString()))));
   return MakeStaticCall(Symbols::TypeError(),
                         Library::PrivateCoreLibName(Symbols::ThrowNew()),
@@ -7653,7 +7676,7 @@
                                         InvocationMirror::Call im_call,
                                         InvocationMirror::Type im_type,
                                         const Function* func) {
-  ArgumentListNode* arguments = new(isolate()) ArgumentListNode(call_pos);
+  ArgumentListNode* arguments = new(I) ArgumentListNode(call_pos);
   // Object receiver.
   // If the function is external and dynamic, pass the actual receiver,
   // otherwise, pass a class literal of the unresolved method's owner.
@@ -7662,13 +7685,13 @@
     arguments->Add(LoadReceiver(func->token_pos()));
   } else {
     Type& type = Type::ZoneHandle(I,
-        Type::New(cls, TypeArguments::Handle(isolate()), call_pos, Heap::kOld));
+        Type::New(cls, TypeArguments::Handle(I), call_pos, Heap::kOld));
     type ^= ClassFinalizer::FinalizeType(
         current_class(), type, ClassFinalizer::kCanonicalize);
-    arguments->Add(new(isolate()) LiteralNode(call_pos, type));
+    arguments->Add(new(I) LiteralNode(call_pos, type));
   }
   // String memberName.
-  arguments->Add(new(isolate()) LiteralNode(
+  arguments->Add(new(I) LiteralNode(
       call_pos, String::ZoneHandle(I, Symbols::New(function_name))));
   // Smi invocation_type.
   if (cls.IsTopLevel()) {
@@ -7676,13 +7699,13 @@
            im_call == InvocationMirror::kTopLevel);
     im_call = InvocationMirror::kTopLevel;
   }
-  arguments->Add(new(isolate()) LiteralNode(call_pos, Smi::ZoneHandle(I,
+  arguments->Add(new(I) LiteralNode(call_pos, Smi::ZoneHandle(I,
       Smi::New(InvocationMirror::EncodeType(im_call, im_type)))));
   // List arguments.
   if (function_arguments == NULL) {
-    arguments->Add(new(isolate()) LiteralNode(call_pos, Array::ZoneHandle(I)));
+    arguments->Add(new(I) LiteralNode(call_pos, Array::ZoneHandle(I)));
   } else {
-    ArrayNode* array = new(isolate()) ArrayNode(
+    ArrayNode* array = new(I) ArrayNode(
         call_pos,
         Type::ZoneHandle(I, Type::ArrayType()),
         function_arguments->nodes());
@@ -7690,10 +7713,9 @@
   }
   // List argumentNames.
   if (function_arguments == NULL) {
-    arguments->Add(new(isolate()) LiteralNode(call_pos, Array::ZoneHandle(I)));
+    arguments->Add(new(I) LiteralNode(call_pos, Array::ZoneHandle(I)));
   } else {
-    arguments->Add(new(isolate()) LiteralNode(
-        call_pos, function_arguments->names()));
+    arguments->Add(new(I) LiteralNode(call_pos, function_arguments->names()));
   }
 
   // List existingArgumentNames.
@@ -7701,7 +7723,7 @@
   // 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(isolate());
+  Function& function = Function::Handle(I);
   if (func != NULL) {
     function = func->raw();
   } else {
@@ -7723,10 +7745,9 @@
     // 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(isolate(),
-        function.UserVisibleFormalParameters()));
+    array.SetAt(0, String::Handle(I, function.UserVisibleFormalParameters()));
   }
-  arguments->Add(new(isolate()) LiteralNode(call_pos, array));
+  arguments->Add(new(I) LiteralNode(call_pos, array));
 
   return MakeStaticCall(Symbols::NoSuchMethodError(),
                         Library::PrivateCoreLibName(Symbols::ThrowNew()),
@@ -7740,7 +7761,7 @@
   AstNode* left_operand = ParseUnaryExpr();
   if (left_operand->IsPrimaryNode() &&
       (left_operand->AsPrimaryNode()->IsSuper())) {
-    ErrorMsg(left_operand->token_pos(), "illegal use of 'super'");
+    ReportError(left_operand->token_pos(), "illegal use of 'super'");
   }
   int current_preced = Token::Precedence(CurrentToken());
   while (current_preced >= min_preced) {
@@ -7765,7 +7786,7 @@
           // Make sure that the instantiator is captured.
           CaptureInstantiator();
         }
-        right_operand = new(isolate()) TypeNode(type_pos, type);
+        right_operand = new(I) 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) ||
@@ -7775,7 +7796,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(isolate()) LetNode(left_operand->token_pos());
+          LetNode* let = new(I) LetNode(left_operand->token_pos());
           let->AddNode(left_operand);
           let->AddNode(ThrowTypeError(type_pos, type));
           left_operand = let;
@@ -7792,7 +7813,7 @@
             EnsureExpressionTemp();
           }
         }
-        left_operand = new(isolate()) ComparisonNode(
+        left_operand = new(I) ComparisonNode(
             op_pos, op_kind, left_operand, right_operand);
         break;  // Equality and relational operators cannot be chained.
       } else {
@@ -7811,7 +7832,7 @@
   AstNode* expressions = ParseExpr(kAllowConst, kConsumeCascades);
   if (CurrentToken() == Token::kCOMMA) {
     // Collect comma-separated expressions in a non scope owning sequence node.
-    SequenceNode* list = new(isolate()) SequenceNode(TokenPos(), NULL);
+    SequenceNode* list = new(I) SequenceNode(TokenPos(), NULL);
     list->Add(expressions);
     while (CurrentToken() == Token::kCOMMA) {
       ConsumeToken();
@@ -7833,7 +7854,7 @@
 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(isolate()) LocalVariable(
+    LocalVariable* temp = new(I) LocalVariable(
         current_function().token_pos(),
         Symbols::SavedCurrentContextVar(),
         Type::ZoneHandle(I, Type::DynamicType()));
@@ -7847,7 +7868,7 @@
                                                const char* s) {
   char name[64];
   OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos);
-  LocalVariable* temp = new(isolate()) LocalVariable(
+  LocalVariable* temp = new(I) LocalVariable(
       token_pos,
       String::ZoneHandle(I, Symbols::New(name)),
       Type::ZoneHandle(I, Type::DynamicType()));
@@ -7872,7 +7893,7 @@
       if (binary_op == Token::kDIV) {
         const Double& dbl_obj = Double::ZoneHandle(I,
             Double::NewCanonical((left_double / right_double)));
-        return new(isolate()) LiteralNode(op_pos, dbl_obj);
+        return new(I) LiteralNode(op_pos, dbl_obj);
       }
     }
   }
@@ -7895,14 +7916,14 @@
             (lhs->AsBinaryOpNode()->kind() == Token::kSHL)) {
           // Merge SHL and BIT_AND into one "SHL with mask" node.
           BinaryOpNode* old = lhs->AsBinaryOpNode();
-          BinaryOpWithMask32Node* binop = new(isolate()) BinaryOpWithMask32Node(
+          BinaryOpWithMask32Node* binop = new(I) BinaryOpWithMask32Node(
               old->token_pos(), old->kind(), old->left(), old->right(), val);
           return binop;
         }
       }
     }
   }
-  return new(isolate()) BinaryOpNode(op_pos, binary_op, lhs, rhs);
+  return new(I) BinaryOpNode(op_pos, binary_op, lhs, rhs);
 }
 
 
@@ -7915,30 +7936,31 @@
     case Token::kASSIGN:
       return rhs;
     case Token::kASSIGN_ADD:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kADD, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kADD, lhs, rhs);
     case Token::kASSIGN_SUB:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kSUB, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kSUB, lhs, rhs);
     case Token::kASSIGN_MUL:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kMUL, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kMUL, lhs, rhs);
     case Token::kASSIGN_TRUNCDIV:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs);
     case Token::kASSIGN_DIV:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kDIV, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kDIV, lhs, rhs);
     case Token::kASSIGN_MOD:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kMOD, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kMOD, lhs, rhs);
     case Token::kASSIGN_SHR:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kSHR, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kSHR, lhs, rhs);
     case Token::kASSIGN_SHL:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kSHL, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kSHL, lhs, rhs);
     case Token::kASSIGN_OR:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs);
     case Token::kASSIGN_AND:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs);
     case Token::kASSIGN_XOR:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs);
     default:
-      ErrorMsg(op_pos, "internal error: ExpandAssignableOp '%s' unimplemented",
-          Token::Name(assignment_op));
+      ReportError(op_pos,
+                  "internal error: ExpandAssignableOp '%s' unimplemented",
+                  Token::Name(assignment_op));
       UNIMPLEMENTED();
       return NULL;
   }
@@ -7952,9 +7974,9 @@
     return expr;
   }
   if (expr->EvalConstExpr() == NULL) {
-    ErrorMsg(expr_pos, "expression is not a valid compile-time constant");
+    ReportError(expr_pos, "expression is not a valid compile-time constant");
   }
-  return new(isolate()) LiteralNode(
+  return new(I) LiteralNode(
       expr_pos, EvaluateConstExpr(expr_pos, expr));
 }
 
@@ -7962,24 +7984,24 @@
 LetNode* Parser::PrepareCompoundAssignmentNodes(AstNode** expr) {
   AstNode* node = *expr;
   intptr_t token_pos = node->token_pos();
-  LetNode* result = new(isolate()) LetNode(token_pos);
+  LetNode* result = new(I) 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(isolate()) LoadLocalNode(token_pos, t0);
+      array = new(I) LoadLocalNode(token_pos, t0);
     }
     if (!IsSimpleLocalOrLiteralNode(load_indexed->index_expr())) {
       LocalVariable* t1 = result->AddInitializer(
           load_indexed->index_expr());
-      index = new(isolate()) LoadLocalNode(token_pos, t1);
+      index = new(I) LoadLocalNode(token_pos, t1);
     }
-    *expr = new(isolate()) LoadIndexedNode(token_pos,
-                                array,
-                                index,
-                                load_indexed->super_class());
+    *expr = new(I) LoadIndexedNode(token_pos,
+                                   array,
+                                   index,
+                                   load_indexed->super_class());
     return result;
   }
   if (node->IsInstanceGetterNode()) {
@@ -7987,11 +8009,10 @@
     AstNode* receiver = getter->receiver();
     if (!IsSimpleLocalOrLiteralNode(getter->receiver())) {
       LocalVariable* t0 = result->AddInitializer(getter->receiver());
-      receiver = new(isolate()) LoadLocalNode(token_pos, t0);
+      receiver = new(I) LoadLocalNode(token_pos, t0);
     }
-    *expr = new(isolate()) InstanceGetterNode(token_pos,
-                                              receiver,
-                                              getter->field_name());
+    *expr = new(I) InstanceGetterNode(
+        token_pos, receiver, getter->field_name());
     return result;
   }
   return result;
@@ -8032,7 +8053,7 @@
       name = Symbols::New(original->AsTypeNode()->TypeName());
     } else if (original->IsLoadStaticFieldNode()) {
       name = original->AsLoadStaticFieldNode()->field().name();
-      target_cls = &Class::Handle(isolate(),
+      target_cls = &Class::Handle(I,
           original->AsLoadStaticFieldNode()->field().owner());
     } else if ((left_ident != NULL) &&
                (original->IsLiteralNode() ||
@@ -8040,12 +8061,12 @@
       name = left_ident->raw();
     }
     if (name.IsNull()) {
-      ErrorMsg(left_pos, "expression is not assignable");
+      ReportError(left_pos, "expression is not assignable");
     }
     result = ThrowNoSuchMethodError(
         original->token_pos(),
         *target_cls,
-        name,
+        String::Handle(I, Field::SetterName(name)),
         NULL,  // No arguments.
         InvocationMirror::kStatic,
         original->IsLoadLocalNode() ?
@@ -8065,19 +8086,19 @@
 
 AstNode* Parser::ParseCascades(AstNode* expr) {
   intptr_t cascade_pos = TokenPos();
-  LetNode* cascade = new(isolate()) LetNode(cascade_pos);
+  LetNode* cascade = new(I) LetNode(cascade_pos);
   LocalVariable* cascade_receiver_var = cascade->AddInitializer(expr);
   while (CurrentToken() == Token::kCASCADE) {
     cascade_pos = TokenPos();
     LoadLocalNode* load_cascade_receiver =
-        new(isolate()) LoadLocalNode(cascade_pos, cascade_receiver_var);
+        new(I) LoadLocalNode(cascade_pos, cascade_receiver_var);
     if (Token::IsIdentifier(LookaheadToken(1))) {
       // Replace .. with . for ParseSelectors().
       token_kind_ = Token::kPERIOD;
     } else if (LookaheadToken(1) == Token::kLBRACK) {
       ConsumeToken();
     } else {
-      ErrorMsg("identifier or [ expected after ..");
+      ReportError("identifier or [ expected after ..");
     }
     String* expr_ident =
         Token::IsIdentifier(CurrentToken()) ? CurrentLiteral() : NULL;
@@ -8115,8 +8136,7 @@
   }
   // 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(isolate()) LoadLocalNode(
-      cascade_pos, cascade_receiver_var));
+  cascade->AddNode(new(I) LoadLocalNode(cascade_pos, cascade_receiver_var));
   return cascade;
 }
 
@@ -8146,10 +8166,10 @@
   if (CurrentToken() == Token::kTHROW) {
     ConsumeToken();
     if (CurrentToken() == Token::kSEMICOLON) {
-      ErrorMsg("expression expected after throw");
+      ReportError("expression expected after throw");
     }
     AstNode* expr = ParseExpr(require_compiletime_const, consume_cascades);
-    return new(isolate()) ThrowNode(expr_pos, expr, NULL);
+    return new(I) ThrowNode(expr_pos, expr, NULL);
   }
   AstNode* expr = ParseConditionalExpr();
   if (!Token::IsAssignmentOperator(CurrentToken())) {
@@ -8165,14 +8185,15 @@
   }
   // Assignment expressions.
   if (!IsLegalAssignableSyntax(expr, TokenPos())) {
-    ErrorMsg(expr_pos, "expression is not assignable");
+    ReportError(expr_pos, "expression is not assignable");
   }
   const Token::Kind assignment_op = CurrentToken();
   const intptr_t assignment_pos = TokenPos();
   ConsumeToken();
   const intptr_t right_expr_pos = TokenPos();
   if (require_compiletime_const && (assignment_op != Token::kASSIGN)) {
-    ErrorMsg(right_expr_pos, "expression is not a valid compile-time constant");
+    ReportError(right_expr_pos,
+                "expression is not a valid compile-time constant");
   }
   AstNode* right_expr = ParseExpr(require_compiletime_const, consume_cascades);
   if (assignment_op != Token::kASSIGN) {
@@ -8200,7 +8221,7 @@
   intptr_t expr_pos = TokenPos();
   AstNode* expr = ParseExpr(kRequireConst, kNoCascades);
   if (!expr->IsLiteralNode()) {
-    ErrorMsg(expr_pos, "expression must be a compile-time constant");
+    ReportError(expr_pos, "expression must be a compile-time constant");
   }
   return expr->AsLiteralNode();
 }
@@ -8216,7 +8237,7 @@
     AstNode* expr1 = ParseExpr(kAllowConst, kNoCascades);
     ExpectToken(Token::kCOLON);
     AstNode* expr2 = ParseExpr(kAllowConst, kNoCascades);
-    expr = new(isolate()) ConditionalExprNode(expr_pos, expr, expr1, expr2);
+    expr = new(I) ConditionalExprNode(expr_pos, expr, expr1, expr2);
   }
   return expr;
 }
@@ -8246,17 +8267,17 @@
     const intptr_t expr_pos = TokenPos();
     expr = ParseUnaryExpr();
     if (!IsLegalAssignableSyntax(expr, TokenPos())) {
-      ErrorMsg(expr_pos, "expression is not assignable");
+      ReportError(expr_pos, "expression is not assignable");
     }
     // Is prefix.
     LetNode* let_expr = PrepareCompoundAssignmentNodes(&expr);
     Token::Kind binary_op =
         (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
-    BinaryOpNode* add = new(isolate()) BinaryOpNode(
+    BinaryOpNode* add = new(I) BinaryOpNode(
         op_pos,
         binary_op,
         expr,
-        new(isolate()) LiteralNode(op_pos, Smi::ZoneHandle(I, Smi::New(1))));
+        new(I) 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);
@@ -8276,15 +8297,15 @@
   const bool saved_mode = SetAllowFunctionLiterals(true);
   ArgumentListNode* arguments;
   if (implicit_arguments == NULL) {
-    arguments = new(isolate()) ArgumentListNode(TokenPos());
+    arguments = new(I) ArgumentListNode(TokenPos());
   } else {
     arguments = implicit_arguments;
   }
-  const GrowableObjectArray& names = GrowableObjectArray::Handle(isolate(),
+  const GrowableObjectArray& names = GrowableObjectArray::Handle(I,
       GrowableObjectArray::New(Heap::kOld));
   bool named_argument_seen = false;
   if (LookaheadToken(1) != Token::kRPAREN) {
-    String& arg_name = String::Handle(isolate());
+    String& arg_name = String::Handle(I);
     do {
       ASSERT((CurrentToken() == Token::kLPAREN) ||
              (CurrentToken() == Token::kCOMMA));
@@ -8298,14 +8319,14 @@
         for (int i = 0; i < names.Length(); i++) {
           arg_name ^= names.At(i);
           if (CurrentLiteral()->Equals(arg_name)) {
-            ErrorMsg("duplicate named argument");
+            ReportError("duplicate named argument");
           }
         }
         names.Add(*CurrentLiteral());
         ConsumeToken();  // ident.
         ConsumeToken();  // colon.
       } else if (named_argument_seen) {
-        ErrorMsg("named argument expected");
+        ReportError("named argument expected");
       }
       arguments->Add(ParseExpr(require_const, kConsumeCascades));
     } while (CurrentToken() == Token::kCOMMA);
@@ -8315,7 +8336,7 @@
   ExpectToken(Token::kRPAREN);
   SetAllowFunctionLiterals(saved_mode);
   if (named_argument_seen) {
-    arguments->set_names(Array::Handle(isolate(), Array::MakeArray(names)));
+    arguments->set_names(Array::Handle(I, Array::MakeArray(names)));
   }
   return arguments;
 }
@@ -8351,7 +8372,7 @@
                                      Object::empty_array());
       if (!func.IsNull()) {
         ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-        closure = new(isolate()) StaticGetterNode(
+        closure = new(I) StaticGetterNode(
             call_pos,
             NULL,
             false,
@@ -8374,15 +8395,19 @@
   } else if (cls.IsTopLevel() &&
       (cls.library() == Library::CoreLibrary()) &&
       (func.name() == Symbols::Identical().raw())) {
-    // This is the predefined toplevel function identical(a,b). Create
-    // a comparison node instead.
-    ASSERT(num_arguments == 2);
-    return new(isolate()) ComparisonNode(ident_pos,
-                                         Token::kEQ_STRICT,
-                                         arguments->NodeAt(0),
-                                         arguments->NodeAt(1));
+    // This is the predefined toplevel function identical(a,b).
+    // Create a comparison node instead of a static call to the function, unless
+    // javascript warnings are desired and identical is not invoked from a patch
+    // source.
+    if (!FLAG_warn_on_javascript_compatibility || is_patch_source()) {
+      ASSERT(num_arguments == 2);
+      return new(I) ComparisonNode(ident_pos,
+                                   Token::kEQ_STRICT,
+                                   arguments->NodeAt(0),
+                                   arguments->NodeAt(1));
+    }
   }
-  return new(isolate()) StaticCallNode(call_pos, func, arguments);
+  return new(I) StaticCallNode(call_pos, func, arguments);
 }
 
 
@@ -8391,8 +8416,7 @@
   const intptr_t call_pos = TokenPos();
   CheckToken(Token::kLPAREN);
   ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst);
-  return new(isolate()) InstanceCallNode(
-      call_pos, receiver, func_name, arguments);
+  return new(I) InstanceCallNode(call_pos, receiver, func_name, arguments);
 }
 
 
@@ -8419,21 +8443,20 @@
   ASSERT(field.is_static());
   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(),
+  const String& getter_name = String::Handle(I, Field::GetterName(field_name));
+  const Function& getter = Function::Handle(I,
       field_owner.LookupStaticFunction(getter_name));
   // Never load field directly if there is a getter (deterministic AST).
   if (getter.IsNull() || field.is_const()) {
-    return new(isolate()) LoadStaticFieldNode(
+    return new(I) LoadStaticFieldNode(
         ident_pos, Field::ZoneHandle(I, field.raw()));
   } else {
     ASSERT(getter.kind() == RawFunction::kImplicitStaticFinalGetter);
-    return new(isolate()) StaticGetterNode(ident_pos,
-                                           NULL,  // Receiver.
-                                           false,  // is_super_getter.
-                                           field_owner,
-                                           field_name);
+    return new(I) StaticGetterNode(ident_pos,
+                                   NULL,  // Receiver.
+                                   false,  // is_super_getter.
+                                   field_owner,
+                                   field_name);
   }
 }
 
@@ -8475,7 +8498,7 @@
       }
     } else {
       ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-      access = new(isolate()) StaticGetterNode(
+      access = new(I) StaticGetterNode(
           ident_pos, NULL, false, Class::ZoneHandle(I, cls.raw()), field_name);
     }
   } else {
@@ -8501,13 +8524,12 @@
     String& name = String::CheckedZoneHandle(primary->primary().raw());
     if (current_function().is_static() ||
         current_function().IsInFactoryScope()) {
-      StaticGetterNode* getter =
-          new(isolate()) StaticGetterNode(
-              primary->token_pos(),
-              NULL,  // No receiver.
-              false,  // Not a super getter.
-              Class::ZoneHandle(I, current_class().raw()),
-              name);
+      StaticGetterNode* getter = new(I) 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 {
@@ -8534,9 +8556,9 @@
     // Instance function access.
     if (current_function().is_static() ||
         current_function().IsInFactoryScope()) {
-      ErrorMsg(primary->token_pos(),
-               "cannot access instance method '%s' from static method",
-               funcname.ToCString());
+      ReportError(primary->token_pos(),
+                  "cannot access instance method '%s' from static method",
+                  funcname.ToCString());
     }
     AstNode* receiver = LoadReceiver(primary->token_pos());
     return CallGetter(primary->token_pos(), receiver, funcname);
@@ -8561,9 +8583,10 @@
           if (current_function().is_static()) {
             const String& name = String::ZoneHandle(I,
                 TypeParameter::Cast(primary_node->primary()).name());
-            ErrorMsg(primary_pos,
-                     "cannot access type parameter '%s' from static function",
-                     name.ToCString());
+            ReportError(primary_pos,
+                        "cannot access type parameter '%s' "
+                        "from static function",
+                        name.ToCString());
           }
           if (current_block_->scope->function_level() > 0) {
             // Make sure that the instantiator is captured.
@@ -8575,7 +8598,7 @@
               TypeParameter::Cast(primary_node->primary()),
               ClassFinalizer::kCanonicalize);
           ASSERT(!type_parameter.IsMalformed());
-          left = new(isolate()) TypeNode(primary->token_pos(), type_parameter);
+          left = new(I) TypeNode(primary->token_pos(), type_parameter);
         } else {
           // Super field access handled in ParseSuperFieldAccess(),
           // super calls handled in ParseSuperCall().
@@ -8597,7 +8620,7 @@
         }
       } else {
         // Field access.
-        Class& cls = Class::Handle(isolate());
+        Class& cls = Class::Handle(I);
         if (left->IsPrimaryNode()) {
           PrimaryNode* primary_node = left->AsPrimaryNode();
           if (primary_node->primary().IsClass()) {
@@ -8635,20 +8658,21 @@
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
           AbstractType& type = Type::ZoneHandle(I,
-              Type::New(type_class, TypeArguments::Handle(isolate()),
+              Type::New(type_class, TypeArguments::Handle(I),
                         primary_pos, Heap::kOld));
           type ^= ClassFinalizer::FinalizeType(
               current_class(), type, ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          array = new(isolate()) TypeNode(primary_pos, type);
+          array = new(I) TypeNode(primary_pos, type);
         } else if (primary_node->primary().IsTypeParameter()) {
           if (current_function().is_static()) {
             const String& name = String::ZoneHandle(I,
                 TypeParameter::Cast(primary_node->primary()).name());
-            ErrorMsg(primary_pos,
-                     "cannot access type parameter '%s' from static function",
-                     name.ToCString());
+            ReportError(primary_pos,
+                        "cannot access type parameter '%s' "
+                        "from static function",
+                        name.ToCString());
           }
           if (current_block_->scope->function_level() > 0) {
             // Make sure that the instantiator is captured.
@@ -8660,12 +8684,12 @@
               TypeParameter::Cast(primary_node->primary()),
               ClassFinalizer::kCanonicalize);
           ASSERT(!type_parameter.IsMalformed());
-          array = new(isolate()) TypeNode(primary_pos, type_parameter);
+          array = new(I) TypeNode(primary_pos, type_parameter);
         } else {
           UNREACHABLE();  // Internal parser error.
         }
       }
-      selector =  new(isolate()) LoadIndexedNode(
+      selector =  new(I) LoadIndexedNode(
           bracket_pos, array, index, Class::ZoneHandle(I));
     } else if (CurrentToken() == Token::kLPAREN) {
       if (left->IsPrimaryNode()) {
@@ -8676,22 +8700,22 @@
           const String& func_name = String::ZoneHandle(I, func.name());
           if (func.is_static()) {
             // Parse static function call.
-            Class& cls = Class::Handle(isolate(), func.Owner());
+            Class& cls = Class::Handle(I, func.Owner());
             selector = ParseStaticCall(cls, func_name, primary_pos);
           } else {
             // Dynamic function call on implicit "this" parameter.
             if (current_function().is_static()) {
-              ErrorMsg(primary_pos,
-                       "cannot access instance method '%s' "
-                       "from static function",
-                       func_name.ToCString());
+              ReportError(primary_pos,
+                          "cannot access instance method '%s' "
+                          "from static function",
+                          func_name.ToCString());
             }
             selector = ParseInstanceCall(LoadReceiver(primary_pos), func_name);
           }
         } else if (primary_node->primary().IsString()) {
           // Primary is an unresolved name.
           if (primary_node->IsSuper()) {
-            ErrorMsg(primary_pos, "illegal use of super");
+            ReportError(primary_pos, "illegal use of super");
           }
           String& name = String::CheckedZoneHandle(
               primary_node->primary().raw());
@@ -8712,9 +8736,10 @@
               TypeParameter::Cast(primary_node->primary()).name());
           if (current_function().is_static()) {
             // Treat as this.T(), because T is in scope.
-            ErrorMsg(primary_pos,
-                     "cannot access type parameter '%s' from static function",
-                     name.ToCString());
+            ReportError(primary_pos,
+                        "cannot access type parameter '%s' "
+                        "from static function",
+                        name.ToCString());
           } else {
             // Treat as call to unresolved (instance) method.
             selector = ParseInstanceCall(LoadReceiver(primary_pos), name);
@@ -8722,12 +8747,12 @@
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
           AbstractType& type = Type::ZoneHandle(I, Type::New(
-              type_class, TypeArguments::Handle(isolate()), primary_pos));
+              type_class, TypeArguments::Handle(I), primary_pos));
           type ^= ClassFinalizer::FinalizeType(
               current_class(), type, ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          selector = new(isolate()) TypeNode(primary_pos, type);
+          selector = new(I) TypeNode(primary_pos, type);
         } else {
           UNREACHABLE();  // Internal parser error.
         }
@@ -8748,19 +8773,20 @@
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
           AbstractType& type = Type::ZoneHandle(I, Type::New(
-              type_class, TypeArguments::Handle(isolate()), primary_pos));
+              type_class, TypeArguments::Handle(I), primary_pos));
           type = ClassFinalizer::FinalizeType(
               current_class(), type, ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          left = new(isolate()) TypeNode(primary_pos, type);
+          left = new(I) TypeNode(primary_pos, type);
         } else if (primary_node->primary().IsTypeParameter()) {
           if (current_function().is_static()) {
             const String& name = String::ZoneHandle(I,
                 TypeParameter::Cast(primary_node->primary()).name());
-            ErrorMsg(primary_pos,
-                     "cannot access type parameter '%s' from static function",
-                     name.ToCString());
+            ReportError(primary_pos,
+                        "cannot access type parameter '%s' "
+                        "from static function",
+                        name.ToCString());
           }
           if (current_block_->scope->function_level() > 0) {
             // Make sure that the instantiator is captured.
@@ -8772,7 +8798,7 @@
               TypeParameter::Cast(primary_node->primary()),
               ClassFinalizer::kCanonicalize);
           ASSERT(!type_parameter.IsMalformed());
-          left = new(isolate()) TypeNode(primary_pos, type_parameter);
+          left = new(I) 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.
@@ -8800,7 +8826,7 @@
   if (IsIncrementOperator(CurrentToken())) {
     TRACE_PARSER("IncrementOperator");
     if (!IsLegalAssignableSyntax(expr, TokenPos())) {
-      ErrorMsg(expr_pos, "expression is not assignable");
+      ReportError(expr_pos, "expression is not assignable");
     }
     Token::Kind incr_op = CurrentToken();
     ConsumeToken();
@@ -8809,17 +8835,17 @@
     LocalVariable* temp = let_expr->AddInitializer(expr);
     Token::Kind binary_op =
         (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
-    BinaryOpNode* add = new(isolate()) BinaryOpNode(
+    BinaryOpNode* add = new(I) BinaryOpNode(
         expr_pos,
         binary_op,
-        new(isolate()) LoadLocalNode(expr_pos, temp),
-        new(isolate()) LiteralNode(expr_pos, Smi::ZoneHandle(I, Smi::New(1))));
+        new(I) LoadLocalNode(expr_pos, temp),
+        new(I) 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(isolate()) LoadLocalNode(expr_pos, temp));
+    let_expr->AddNode(new(I) LoadLocalNode(expr_pos, temp));
     return let_expr;
   }
   return expr;
@@ -8844,15 +8870,14 @@
   // Resolve class.
   if (!type->HasResolvedTypeClass()) {
     const UnresolvedClass& unresolved_class =
-        UnresolvedClass::Handle(isolate(), type->unresolved_class());
+        UnresolvedClass::Handle(I, type->unresolved_class());
     const String& unresolved_class_name =
-        String::Handle(isolate(), unresolved_class.ident());
-    Class& resolved_type_class = Class::Handle(isolate());
+        String::Handle(I, unresolved_class.ident());
+    Class& resolved_type_class = Class::Handle(I);
     if (unresolved_class.library_prefix() == LibraryPrefix::null()) {
       if (!scope_class.IsNull()) {
         // First check if the type is a type parameter of the given scope class.
-        const TypeParameter& type_parameter = TypeParameter::Handle(
-            isolate(),
+        const TypeParameter& type_parameter = TypeParameter::Handle(I,
             scope_class.LookupTypeParameter(unresolved_class_name));
         if (!type_parameter.IsNull()) {
           // A type parameter is considered to be a malformed type when
@@ -8860,23 +8885,23 @@
           if (ParsingStaticMember()) {
             ASSERT(scope_class.raw() == current_class().raw());
             *type = ClassFinalizer::NewFinalizedMalformedType(
-                Error::Handle(isolate()),  // No previous error.
+                Error::Handle(I),  // No previous error.
                 script_,
                 type->token_pos(),
                 "type parameter '%s' cannot be referenced "
                 "from static member",
-                String::Handle(isolate(), type_parameter.name()).ToCString());
+                String::Handle(I, type_parameter.name()).ToCString());
             return;
           }
           // A type parameter cannot be parameterized, so make the type
           // malformed if type arguments have previously been parsed.
-          if (!TypeArguments::Handle(isolate(), type->arguments()).IsNull()) {
+          if (!TypeArguments::Handle(I, type->arguments()).IsNull()) {
             *type = ClassFinalizer::NewFinalizedMalformedType(
-                Error::Handle(isolate()),  // No previous error.
+                Error::Handle(I),  // No previous error.
                 script_,
                 type_parameter.token_pos(),
                 "type parameter '%s' cannot be parameterized",
-                String::Handle(isolate(), type_parameter.name()).ToCString());
+                String::Handle(I, type_parameter.name()).ToCString());
             return;
           }
           *type = type_parameter.raw();
@@ -8892,7 +8917,7 @@
       }
     } else {
       LibraryPrefix& lib_prefix =
-          LibraryPrefix::Handle(isolate(), unresolved_class.library_prefix());
+          LibraryPrefix::Handle(I, unresolved_class.library_prefix());
       // Resolve class name in the scope of the library prefix.
       resolved_type_class =
           ResolveClassInPrefixScope(lib_prefix, unresolved_class_name);
@@ -8904,23 +8929,21 @@
       parameterized_type.set_type_class(resolved_type_class);
     } else if (finalization >= ClassFinalizer::kCanonicalize) {
       ClassFinalizer::FinalizeMalformedType(
-          Error::Handle(isolate()),  // No previous error.
+          Error::Handle(I),  // No previous error.
           script_,
           parameterized_type,
           "type '%s' is not loaded",
-          String::Handle(isolate(),
-                         parameterized_type.UserVisibleName()).ToCString());
+          String::Handle(I, parameterized_type.UserVisibleName()).ToCString());
       return;
     }
   }
   // Resolve type arguments, if any.
-  const TypeArguments& arguments = TypeArguments::Handle(isolate(),
-                                                         type->arguments());
-      TypeArguments::Handle(isolate(), type->arguments());
+  const TypeArguments& arguments = TypeArguments::Handle(I, type->arguments());
+      TypeArguments::Handle(I, type->arguments());
   if (!arguments.IsNull()) {
     const intptr_t num_arguments = arguments.Length();
     for (intptr_t i = 0; i < num_arguments; i++) {
-      AbstractType& type_argument = AbstractType::Handle(isolate(),
+      AbstractType& type_argument = AbstractType::Handle(I,
                                                          arguments.TypeAt(i));
       ResolveTypeFromClass(scope_class, finalization, &type_argument);
       arguments.SetTypeAt(i, type_argument);
@@ -8944,9 +8967,9 @@
   // Fields are not accessible from a static function, except from a
   // constructor, which is considered as non-static by the compiler.
   if (current_function().is_static()) {
-    ErrorMsg(field_pos,
-             "cannot access instance field '%s' from a static function",
-             field_name.ToCString());
+    ReportError(field_pos,
+                "cannot access instance field '%s' from a static function",
+                field_name.ToCString());
   }
 }
 
@@ -8996,9 +9019,9 @@
   }
   const char* error_str = NULL;
   Instance& result =
-      Instance::Handle(isolate(), instance.CheckAndCanonicalize(&error_str));
+      Instance::Handle(I, instance.CheckAndCanonicalize(&error_str));
   if (result.IsNull()) {
-    ErrorMsg(token_pos, "Invalid const object %s", error_str);
+    ReportError(token_pos, "Invalid const object %s", error_str);
   }
   return result.raw();
 }
@@ -9012,18 +9035,17 @@
   ASSERT(field.is_static());
   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));
-  const Instance& value = Instance::Handle(isolate(), field.value());
+  const String& getter_name = String::Handle(I, Field::GetterName(field_name));
+  const Function& getter = Function::Handle(I,
+      field_owner.LookupStaticFunction(getter_name));
+  const Instance& value = Instance::Handle(I, field.value());
   if (value.raw() == Object::transition_sentinel().raw()) {
     if (field.is_const()) {
-      ErrorMsg("circular dependency while initializing static field '%s'",
-               field_name.ToCString());
+      ReportError("circular dependency while initializing static field '%s'",
+                  field_name.ToCString());
     } else {
       // The implicit static getter will throw the exception if necessary.
-      return new(isolate()) StaticGetterNode(
+      return new(I) StaticGetterNode(
           field_ref_pos, NULL, false, field_owner, field_name);
     }
   } else if (value.raw() == Object::sentinel().raw()) {
@@ -9033,16 +9055,16 @@
     if (field.is_const()) {
       field.set_value(Object::transition_sentinel());
       const int kNumArguments = 0;  // no arguments.
-      const Function& func = Function::Handle(isolate(),
+      const Function& func = Function::Handle(I,
           Resolver::ResolveStatic(field_owner,
                                   getter_name,
                                   kNumArguments,
                                   Object::empty_array()));
       ASSERT(!func.IsNull());
       ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter);
-      Object& const_value = Object::Handle(isolate());
+      Object& const_value = Object::Handle(I);
       {
-        PAUSETIMERSCOPE(isolate(), time_compilation);
+        PAUSETIMERSCOPE(I, time_compilation);
         const_value = DartEntry::InvokeFunction(func, Object::empty_array());
       }
       if (const_value.IsError()) {
@@ -9055,22 +9077,24 @@
           field.set_value(Object::null_instance());
           // It is a compile-time error if evaluation of a compile-time constant
           // would raise an exception.
-          AppendErrorMsg(error, field_ref_pos,
-                         "error initializing const field '%s'",
-                         String::Handle(isolate(), field.name()).ToCString());
+          const String& field_name = String::Handle(I, field.name());
+          ReportErrors(error,
+                       script_, field_ref_pos,
+                       "error initializing const field '%s'",
+                       field_name.ToCString());
         } else {
-          isolate()->long_jump_base()->Jump(1, error);
-          UNREACHABLE();
+          ReportError(error);
         }
+        UNREACHABLE();
       }
       ASSERT(const_value.IsNull() || const_value.IsInstance());
-      Instance& instance = Instance::Handle(isolate());
+      Instance& instance = Instance::Handle(I);
       instance ^= const_value.raw();
       instance = TryCanonicalize(instance, field_ref_pos);
       field.set_value(instance);
       return NULL;   // Constant
     } else {
-      return new(isolate()) StaticGetterNode(
+      return new(I) StaticGetterNode(
           field_ref_pos, NULL, false, field_owner, field_name);
     }
   }
@@ -9079,7 +9103,7 @@
     return NULL;
   }
   ASSERT(getter.kind() == RawFunction::kImplicitGetter);
-  return new(isolate()) StaticGetterNode(
+  return new(I) StaticGetterNode(
       field_ref_pos, NULL, false, field_owner, field_name);
 }
 
@@ -9093,21 +9117,19 @@
   // Constructors have 2 extra arguments: rcvr and construction phase.
   const int kNumExtraArgs = constructor.IsFactory() ? 1 : 2;
   const int num_arguments = arguments->length() + kNumExtraArgs;
-  const Array& arg_values = Array::Handle(isolate(),
-                                          Array::New(num_arguments));
-  Instance& instance = Instance::Handle(isolate());
+  const Array& arg_values = Array::Handle(I, Array::New(num_arguments));
+  Instance& instance = Instance::Handle(I);
   if (!constructor.IsFactory()) {
     instance = Instance::New(type_class, Heap::kOld);
     if (!type_arguments.IsNull()) {
       if (!type_arguments.IsInstantiated()) {
-        ErrorMsg("type must be constant in const constructor");
+        ReportError("type must be constant in const constructor");
       }
       instance.SetTypeArguments(
-          TypeArguments::Handle(isolate(), type_arguments.Canonicalize()));
+          TypeArguments::Handle(I, type_arguments.Canonicalize()));
     }
     arg_values.SetAt(0, instance);
-    arg_values.SetAt(1, Smi::Handle(isolate(),
-                                    Smi::New(Function::kCtorPhaseAll)));
+    arg_values.SetAt(1, Smi::Handle(I, Smi::New(Function::kCtorPhaseAll)));
   } else {
     // Prepend type_arguments to list of arguments to factory.
     ASSERT(type_arguments.IsZoneHandle());
@@ -9119,11 +9141,11 @@
     ASSERT(arg->IsLiteralNode());
     arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal());
   }
-  const Array& args_descriptor = Array::Handle(
-      isolate(), ArgumentsDescriptor::New(num_arguments, arguments->names()));
-  Object& result = Object::Handle(isolate());
+  const Array& args_descriptor = Array::Handle(I,
+      ArgumentsDescriptor::New(num_arguments, arguments->names()));
+  Object& result = Object::Handle(I);
   {
-    PAUSETIMERSCOPE(isolate(), time_compilation);
+    PAUSETIMERSCOPE(I, time_compilation);
     result = DartEntry::InvokeFunction(
         constructor, arg_values, args_descriptor);
   }
@@ -9135,7 +9157,7 @@
       if (result.IsUnhandledException()) {
         return result.raw();
       } else {
-        isolate()->long_jump_base()->Jump(1, Error::Cast(result));
+        I->long_jump_base()->Jump(1, Error::Cast(result));
         UNREACHABLE();
         return Object::null();
       }
@@ -9163,7 +9185,7 @@
   }
   if (local != NULL) {
     if (node != NULL) {
-      *node = new(isolate()) LoadLocalNode(ident_pos, local);
+      *node = new(I) LoadLocalNode(ident_pos, local);
     }
     return true;
   }
@@ -9171,14 +9193,14 @@
   // Try to find the identifier in the class scope of the current class.
   // If the current class is the result of a mixin application, we must
   // use the class scope of the class from which the function originates.
-  Class& cls = Class::Handle(isolate());
+  Class& cls = Class::Handle(I);
   if (!current_class().IsMixinApplication()) {
     cls = current_class().raw();
   } else {
     cls = parsed_function()->function().origin();
   }
-  Function& func = Function::Handle(isolate(), Function::null());
-  Field& field = Field::Handle(isolate(), Field::null());
+  Function& func = Function::Handle(I, Function::null());
+  Field& field = Field::Handle(I, Field::null());
 
   // First check if a field exists.
   field = cls.LookupField(ident);
@@ -9201,7 +9223,7 @@
       func.IsStaticFunction() ||
       func.is_abstract())) {
     if (node != NULL) {
-      *node = new(isolate()) PrimaryNode(
+      *node = new(I) PrimaryNode(
           ident_pos, Function::ZoneHandle(I, func.raw()));
     }
     return true;
@@ -9214,15 +9236,13 @@
     if (func.IsDynamicFunction() || func.is_abstract()) {
       if (node != NULL) {
         CheckInstanceFieldAccess(ident_pos, ident);
-        ASSERT(AbstractType::Handle(isolate(),
-                                    func.result_type()).IsResolved());
+        ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
         *node = CallGetter(ident_pos, LoadReceiver(ident_pos), ident);
       }
       return true;
     } else if (func.IsStaticFunction()) {
       if (node != NULL) {
-        ASSERT(AbstractType::Handle(isolate(),
-                                    func.result_type()).IsResolved());
+        ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
         // The static getter may later be changed into a dynamically
         // resolved instance setter if no static setter can
         // be found.
@@ -9232,11 +9252,11 @@
             (LookupReceiver(current_block_->scope, kTestOnly) != NULL)) {
           receiver = LoadReceiver(ident_pos);
         }
-        *node = new(isolate()) StaticGetterNode(ident_pos,
-                                     receiver,
-                                     false,
-                                     Class::ZoneHandle(I, cls.raw()),
-                                     ident);
+        *node = new(I) StaticGetterNode(ident_pos,
+                                        receiver,
+                                        false,
+                                        Class::ZoneHandle(I, cls.raw()),
+                                        ident);
       }
       return true;
     }
@@ -9250,8 +9270,7 @@
         // 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(isolate(),
-                                    func.result_type()).IsResolved());
+        ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
         *node = CallGetter(ident_pos, LoadReceiver(ident_pos), ident);
       }
       return true;
@@ -9261,7 +9280,7 @@
         // 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(isolate()) StaticGetterNode(
+        *node = new(I) StaticGetterNode(
             ident_pos,
             NULL,
             false,
@@ -9281,8 +9300,8 @@
 
 
 RawClass* Parser::ResolveClassInCurrentLibraryScope(const String& name) {
-  HANDLESCOPE(isolate());
-  const Object& obj = Object::Handle(isolate(), library_.ResolveName(name));
+  HANDLESCOPE(I);
+  const Object& obj = Object::Handle(I, library_.ResolveName(name));
   if (obj.IsClass()) {
     return Class::Cast(obj).raw();
   }
@@ -9296,12 +9315,11 @@
 AstNode* Parser::ResolveIdentInCurrentLibraryScope(intptr_t ident_pos,
                                                    const String& ident) {
   TRACE_PARSER("ResolveIdentInCurrentLibraryScope");
-  HANDLESCOPE(isolate());
-  const Object& obj = Object::Handle(isolate(), library_.ResolveName(ident));
+  HANDLESCOPE(I);
+  const Object& obj = Object::Handle(I, library_.ResolveName(ident));
   if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
-    return new(isolate()) PrimaryNode(
-        ident_pos, Class::ZoneHandle(I, cls.raw()));
+    return new(I) PrimaryNode(ident_pos, Class::ZoneHandle(I, cls.raw()));
   } else if (obj.IsField()) {
     const Field& field = Field::Cast(obj);
     ASSERT(field.is_static());
@@ -9310,28 +9328,27 @@
     const Function& func = Function::Cast(obj);
     ASSERT(func.is_static());
     if (func.IsGetterFunction() || func.IsSetterFunction()) {
-      return new(isolate()) StaticGetterNode(ident_pos,
-                                             /* receiver */ NULL,
-                                             /* is_super_getter */ false,
-                                             Class::ZoneHandle(I, func.Owner()),
-                                             ident);
+      return new(I) StaticGetterNode(ident_pos,
+                                     /* receiver */ NULL,
+                                     /* is_super_getter */ false,
+                                     Class::ZoneHandle(I, func.Owner()),
+                                     ident);
 
     } else {
-      return new(isolate()) PrimaryNode(ident_pos,
-                                        Function::ZoneHandle(I, func.raw()));
+      return new(I) 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(isolate()) PrimaryNode(ident_pos, ident);
+  return new(I) PrimaryNode(ident_pos, ident);
 }
 
 
 RawClass* Parser::ResolveClassInPrefixScope(const LibraryPrefix& prefix,
                                             const String& name) {
-  HANDLESCOPE(isolate());
-  const Object& obj = Object::Handle(isolate(), prefix.LookupObject(name));
+  HANDLESCOPE(I);
+  const Object& obj = Object::Handle(I, prefix.LookupObject(name));
   if (obj.IsClass()) {
     return Class::Cast(obj).raw();
   }
@@ -9346,8 +9363,8 @@
                                            const LibraryPrefix& prefix,
                                            const String& ident) {
   TRACE_PARSER("ResolveIdentInPrefixScope");
-  HANDLESCOPE(isolate());
-  Object& obj = Object::Handle(isolate());
+  HANDLESCOPE(I);
+  Object& obj = Object::Handle(I);
   if (prefix.is_loaded()) {
     obj = prefix.LookupObject(ident);
   } else {
@@ -9365,7 +9382,7 @@
   } else if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
     PrimaryNode* primary =
-        new(isolate()) PrimaryNode(ident_pos, Class::ZoneHandle(I, cls.raw()));
+        new(I) PrimaryNode(ident_pos, Class::ZoneHandle(I, cls.raw()));
     primary->set_is_deferred(is_deferred);
     return primary;
   } else if (obj.IsField()) {
@@ -9385,16 +9402,16 @@
     const Function& func = Function::Cast(obj);
     ASSERT(func.is_static());
     if (func.IsGetterFunction() || func.IsSetterFunction()) {
-      StaticGetterNode* getter =
-          new(isolate()) StaticGetterNode(ident_pos,
-                               /* receiver */ NULL,
-                               /* is_super_getter */ false,
-                               Class::ZoneHandle(I, func.Owner()),
-                               ident);
+      StaticGetterNode* getter = new(I) StaticGetterNode(
+          ident_pos,
+          /* receiver */ NULL,
+          /* is_super_getter */ false,
+          Class::ZoneHandle(I, func.Owner()),
+          ident);
       getter->set_is_deferred(is_deferred);
       return getter;
     } else {
-      PrimaryNode* primary = new(isolate()) PrimaryNode(
+      PrimaryNode* primary = new(I) PrimaryNode(
            ident_pos, Function::ZoneHandle(I, func.raw()));
       primary->set_is_deferred(is_deferred);
       return primary;
@@ -9432,7 +9449,7 @@
         type_parameter ^= ClassFinalizer::FinalizeType(
             current_class(), type_parameter, ClassFinalizer::kCanonicalize);
         ASSERT(!type_parameter.IsMalformed());
-        return new(isolate()) TypeNode(ident_pos, type_parameter);
+        return new(I) TypeNode(ident_pos, type_parameter);
       }
     }
     // Not found in the local scope, and the name is not a type parameter.
@@ -9465,18 +9482,18 @@
       if (allow_closure_names) {
         resolved = LoadClosure(primary);
       } else {
-        ErrorMsg(ident_pos, "illegal reference to method '%s'",
-                 ident.ToCString());
+        ReportError(ident_pos, "illegal reference to method '%s'",
+                    ident.ToCString());
       }
     } else if (primary->primary().IsClass()) {
       const Class& type_class = Class::Cast(primary->primary());
       AbstractType& type = Type::ZoneHandle(I,
-          Type::New(type_class, TypeArguments::Handle(isolate()), primary_pos));
+          Type::New(type_class, TypeArguments::Handle(I), primary_pos));
       type ^= ClassFinalizer::FinalizeType(
           current_class(), type, ClassFinalizer::kCanonicalize);
       // Type may be malbounded, but not malformed.
       ASSERT(!type.IsMalformed());
-      resolved = new(isolate()) TypeNode(primary_pos, type);
+      resolved = new(I) TypeNode(primary_pos, type);
     }
   }
   return resolved;
@@ -9487,10 +9504,14 @@
 // finalize it according to the given type finalization mode.
 RawAbstractType* Parser::ParseType(
     ClassFinalizer::FinalizationKind finalization,
-    bool allow_deferred_type) {
+    bool allow_deferred_type,
+    bool consume_unresolved_prefix) {
   TRACE_PARSER("ParseType");
   CheckToken(Token::kIDENT, "type name expected");
-  QualIdent type_name;
+  intptr_t ident_pos = TokenPos();
+  LibraryPrefix& prefix = LibraryPrefix::Handle(I);
+  String& type_name = String::Handle(I);;
+
   if (finalization == ClassFinalizer::kIgnore) {
     if (!is_top_level_ && (current_block_ != NULL)) {
       // Add the library prefix or type class name to the list of referenced
@@ -9499,51 +9520,77 @@
     }
     SkipQualIdent();
   } else {
-    ParseQualIdent(&type_name);
-    // An identifier cannot be resolved in a local scope when top level parsing.
-    if (!is_top_level_ &&
-        (type_name.lib_prefix == NULL) &&
-        ResolveIdentInLocalScope(type_name.ident_pos, *type_name.ident, NULL)) {
+    prefix = ParsePrefix();
+    type_name = CurrentLiteral()->raw();
+    ConsumeToken();
+
+    // Check whether we have a malformed qualified type name if the caller
+    // requests to consume unresolved prefix names:
+    // If we didn't see a valid prefix but the identifier is followed by
+    // a period and another identifier, consume the qualified identifier
+    // and create a malformed type.
+    if (consume_unresolved_prefix &&
+        prefix.IsNull() &&
+        (CurrentToken() == Token::kPERIOD) &&
+        (Token::IsIdentifier(LookaheadToken(1)))) {
+      if (!is_top_level_ && (current_block_ != NULL)) {
+        // Add the unresolved prefix name to the list of referenced
+        // names of this scope.
+        current_block_->scope->AddReferencedName(TokenPos(), type_name);
+      }
+      ConsumeToken();  // Period token.
+      ASSERT(IsIdentifier());
+      String& qualified_name = String::Handle(I, type_name.raw());
+      qualified_name = String::Concat(qualified_name, Symbols::Dot());
+      qualified_name = String::Concat(qualified_name, *CurrentLiteral());
+      ConsumeToken();
       // The type is malformed. Skip over its type arguments.
       ParseTypeArguments(ClassFinalizer::kIgnore);
       return ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(isolate()),  // No previous error.
+          Error::Handle(I),  // No previous error.
           script_,
-          type_name.ident_pos,
-          "using '%s' in this context is invalid",
-          type_name.ident->ToCString());
+          ident_pos,
+          "qualified name '%s' does not refer to a type",
+          qualified_name.ToCString());
     }
-    if ((type_name.lib_prefix != NULL) &&
-        type_name.lib_prefix->is_deferred_load() &&
-        !allow_deferred_type) {
+
+    // If parsing inside a local scope, check whether the type name
+    // is shadowed by a local declaration.
+    if (!is_top_level_ &&
+        (prefix.IsNull()) &&
+        ResolveIdentInLocalScope(ident_pos, type_name, NULL)) {
+      // The type is malformed. Skip over its type arguments.
       ParseTypeArguments(ClassFinalizer::kIgnore);
       return ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(isolate()),  // No previous error.
+          Error::Handle(I),  // No previous error.
           script_,
-          type_name.ident_pos,
+          ident_pos,
+          "using '%s' in this context is invalid",
+          type_name.ToCString());
+    }
+    if (!prefix.IsNull() && prefix.is_deferred_load() && !allow_deferred_type) {
+      ParseTypeArguments(ClassFinalizer::kIgnore);
+      return ClassFinalizer::NewFinalizedMalformedType(
+          Error::Handle(I),  // No previous error.
+          script_,
+          ident_pos,
           "using deferred type '%s.%s' is invalid",
-          String::Handle(isolate(), type_name.lib_prefix->name()).ToCString(),
-          type_name.ident->ToCString());
+          String::Handle(I, prefix.name()).ToCString(),
+          type_name.ToCString());
     }
   }
-  Object& type_class = Object::Handle(isolate());
+  Object& type_class = Object::Handle(I);
   // Leave type_class as null if type finalization mode is kIgnore.
   if (finalization != ClassFinalizer::kIgnore) {
-    LibraryPrefix& lib_prefix = LibraryPrefix::Handle(isolate());
-    if (type_name.lib_prefix != NULL) {
-      lib_prefix = type_name.lib_prefix->raw();
-    }
-    type_class = UnresolvedClass::New(lib_prefix,
-                                      *type_name.ident,
-                                      type_name.ident_pos);
+    type_class = UnresolvedClass::New(prefix, type_name, ident_pos);
   }
   TypeArguments& type_arguments = TypeArguments::Handle(
-      isolate(), ParseTypeArguments(finalization));
+      I, ParseTypeArguments(finalization));
   if (finalization == ClassFinalizer::kIgnore) {
     return Type::DynamicType();
   }
   AbstractType& type = AbstractType::Handle(
-      isolate(), Type::New(type_class, type_arguments, type_name.ident_pos));
+      I, Type::New(type_class, type_arguments, ident_pos));
   if (finalization >= ClassFinalizer::kResolveTypeParameters) {
     ResolveTypeFromClass(current_class(), finalization, &type);
     if (finalization >= ClassFinalizer::kCanonicalize) {
@@ -9558,15 +9605,14 @@
     intptr_t pos, const Function& constructor,
     const TypeArguments& type_arguments) {
   if (!type_arguments.IsNull()) {
-    const Class& constructor_class = Class::Handle(isolate(),
-                                                   constructor.Owner());
+    const Class& constructor_class = Class::Handle(I, constructor.Owner());
     ASSERT(!constructor_class.IsNull());
     ASSERT(constructor_class.is_finalized());
     ASSERT(type_arguments.IsCanonical());
     // Do not report the expected vs. actual number of type arguments, because
     // the type argument vector is flattened and raw types are allowed.
     if (type_arguments.Length() != constructor_class.NumTypeArguments()) {
-      ErrorMsg(pos, "wrong number of type arguments passed to constructor");
+      ReportError(pos, "wrong number of type arguments passed to constructor");
     }
   }
 }
@@ -9601,23 +9647,22 @@
       if (element_type.IsDynamicType()) {
         list_type_arguments = TypeArguments::null();
       } else if (is_const && !element_type.IsInstantiated()) {
-        ErrorMsg(type_pos,
-                 "the type argument of a constant list literal cannot include "
-                 "a type variable");
+        ReportError(type_pos,
+                    "the type argument of a constant list literal cannot "
+                    "include a type variable");
       }
     } else {
       if (FLAG_error_on_bad_type) {
-        ErrorMsg(type_pos,
-                 "a list literal takes one type argument specifying "
-                 "the element type");
+        ReportError(type_pos,
+                    "a list literal takes one type argument specifying "
+                    "the element type");
       }
       // Ignore type arguments.
       list_type_arguments = TypeArguments::null();
     }
   }
   ASSERT(list_type_arguments.IsNull() || (list_type_arguments.Length() == 1));
-  const Class& array_class = Class::Handle(isolate(),
-      isolate()->object_store()->array_class());
+  const Class& array_class = Class::Handle(I, I->object_store()->array_class());
   Type& type = Type::ZoneHandle(I,
       Type::New(array_class, list_type_arguments, type_pos));
   type ^= ClassFinalizer::FinalizeType(
@@ -9633,16 +9678,16 @@
       if (FLAG_enable_type_checks &&
           !is_const &&
           !element_type.IsDynamicType()) {
-        element = new(isolate()) AssignableNode(element_pos,
-                                                element,
-                                                element_type,
-                                                Symbols::ListLiteralElement());
+        element = new(I) AssignableNode(element_pos,
+                                        element,
+                                        element_type,
+                                        Symbols::ListLiteralElement());
       }
       element_list.Add(element);
       if (CurrentToken() == Token::kCOMMA) {
         ConsumeToken();
       } else if (CurrentToken() != Token::kRBRACK) {
-        ErrorMsg("comma or ']' expected");
+        ReportError("comma or ']' expected");
       }
     }
     ExpectToken(Token::kRBRACK);
@@ -9654,8 +9699,8 @@
     Array& const_list =
         Array::ZoneHandle(I, Array::New(element_list.length(), Heap::kOld));
     const_list.SetTypeArguments(
-        TypeArguments::Handle(isolate(), list_type_arguments.Canonicalize()));
-    Error& malformed_error = Error::Handle(isolate());
+        TypeArguments::Handle(I, list_type_arguments.Canonicalize()));
+    Error& malformed_error = Error::Handle(I);
     for (int i = 0; i < element_list.length(); i++) {
       AstNode* elem = element_list[i];
       // Arguments have been evaluated to a literal value already.
@@ -9666,29 +9711,29 @@
           (!elem->AsLiteralNode()->literal().IsNull() &&
            !elem->AsLiteralNode()->literal().IsInstanceOf(
                element_type,
-               TypeArguments::Handle(isolate()),
+               TypeArguments::Handle(I),
                &malformed_error))) {
         // If the failure is due to a malformed type error, display it instead.
         if (!malformed_error.IsNull()) {
-          ErrorMsg(malformed_error);
+          ReportError(malformed_error);
         } else {
-          ErrorMsg(elem->AsLiteralNode()->token_pos(),
-                   "list literal element at index %d must be "
-                   "a constant of type '%s'",
-                   i,
-                   String::Handle(isolate(),
-                       element_type.UserVisibleName()).ToCString());
+          ReportError(elem->AsLiteralNode()->token_pos(),
+                      "list literal element at index %d must be "
+                      "a constant of type '%s'",
+                      i,
+                      String::Handle(I,
+                          element_type.UserVisibleName()).ToCString());
         }
       }
       const_list.SetAt(i, elem->AsLiteralNode()->literal());
     }
     const_list ^= TryCanonicalize(const_list, literal_pos);
     const_list.MakeImmutable();
-    return new(isolate()) LiteralNode(literal_pos, const_list);
+    return new(I) LiteralNode(literal_pos, const_list);
   } else {
     // Factory call at runtime.
     const Class& factory_class =
-        Class::Handle(isolate(), Library::LookupCoreClass(Symbols::List()));
+        Class::Handle(I, Library::LookupCoreClass(Symbols::List()));
     ASSERT(!factory_class.IsNull());
     const Function& factory_method = Function::ZoneHandle(I,
         factory_class.LookupFactory(
@@ -9706,7 +9751,7 @@
     // type argument vector.
     if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 1)) {
       ASSERT(factory_type_args.Length() == 1);
-      Type& factory_type = Type::Handle(isolate(), Type::New(
+      Type& factory_type = Type::Handle(I, Type::New(
           factory_class, factory_type_args, type_pos, Heap::kNew));
       factory_type ^= ClassFinalizer::FinalizeType(
           current_class(), factory_type, ClassFinalizer::kFinalize);
@@ -9714,17 +9759,16 @@
       ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments());
     }
     factory_type_args = factory_type_args.Canonicalize();
-    ArgumentListNode* factory_param = new(isolate()) ArgumentListNode(
+    ArgumentListNode* factory_param = new(I) 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(I, Object::empty_array().raw());
       LiteralNode* empty_array_literal =
-          new(isolate()) LiteralNode(TokenPos(), empty_array);
+          new(I) LiteralNode(TokenPos(), empty_array);
       factory_param->Add(empty_array_literal);
     } else {
-      ArrayNode* list = new(isolate()) ArrayNode(
-          TokenPos(), type, element_list);
+      ArrayNode* list = new(I) ArrayNode(TokenPos(), type, element_list);
       factory_param->Add(list);
     }
     return CreateConstructorCallNode(literal_pos,
@@ -9743,7 +9787,7 @@
   if (!type_arguments.IsNull() && !type_arguments.IsInstantiated()) {
     EnsureExpressionTemp();
   }
-  return new(isolate()) ConstructorCallNode(
+  return new(I) ConstructorCallNode(
       token_pos, type_arguments, constructor, arguments);
 }
 
@@ -9802,15 +9846,15 @@
       if (key_type.IsDynamicType() && value_type.IsDynamicType()) {
         map_type_arguments = TypeArguments::null();
       } else if (is_const && !type_arguments.IsInstantiated()) {
-        ErrorMsg(type_pos,
-                 "the type arguments of a constant map literal cannot include "
-                 "a type variable");
+        ReportError(type_pos,
+                    "the type arguments of a constant map literal cannot "
+                    "include a type variable");
       }
     } else {
       if (FLAG_error_on_bad_type) {
-        ErrorMsg(type_pos,
-                 "a map literal takes two type arguments specifying "
-                 "the key type and the value type");
+        ReportError(type_pos,
+                    "a map literal takes two type arguments specifying "
+                    "the key type and the value type");
       }
       // Ignore type arguments.
       map_type_arguments = TypeArguments::null();
@@ -9829,19 +9873,19 @@
     if (FLAG_enable_type_checks &&
         !is_const &&
         !key_type.IsDynamicType()) {
-      key = new(isolate()) AssignableNode(
+      key = new(I) AssignableNode(
           key_pos, key, key_type, Symbols::ListLiteralElement());
     }
     if (is_const) {
       ASSERT(key->IsLiteralNode());
       const Instance& key_value = key->AsLiteralNode()->literal();
       if (key_value.IsDouble()) {
-        ErrorMsg(key_pos, "key value must not be of type double");
+        ReportError(key_pos, "key value must not be of type double");
       }
       if (!key_value.IsInteger() &&
           !key_value.IsString() &&
           ImplementsEqualOperator(key_value)) {
-        ErrorMsg(key_pos, "key value must not implement operator ==");
+        ReportError(key_pos, "key value must not implement operator ==");
       }
     }
     ExpectToken(Token::kCOLON);
@@ -9851,7 +9895,7 @@
     if (FLAG_enable_type_checks &&
         !is_const &&
         !value_type.IsDynamicType()) {
-      value = new(isolate()) AssignableNode(
+      value = new(I) AssignableNode(
           value_pos, value, value_type, Symbols::ListLiteralElement());
     }
     AddKeyValuePair(&kv_pairs_list, is_const, key, value);
@@ -9859,7 +9903,7 @@
     if (CurrentToken() == Token::kCOMMA) {
       ConsumeToken();
     } else if (CurrentToken() != Token::kRBRACE) {
-      ErrorMsg("comma or '}' expected");
+      ReportError("comma or '}' expected");
     }
   }
   ASSERT(kv_pairs_list.length() % 2 == 0);
@@ -9873,8 +9917,8 @@
     // First, create the canonicalized key-value pair array.
     Array& key_value_array =
         Array::ZoneHandle(I, Array::New(kv_pairs_list.length(), Heap::kOld));
-    AbstractType& arg_type = Type::Handle(isolate());
-    Error& malformed_error = Error::Handle(isolate());
+    AbstractType& arg_type = Type::Handle(I);
+    Error& malformed_error = Error::Handle(I);
     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.
@@ -9896,15 +9940,15 @@
                  &malformed_error))) {
           // If the failure is due to a malformed type error, display it.
           if (!malformed_error.IsNull()) {
-            ErrorMsg(malformed_error);
+            ReportError(malformed_error);
           } else {
-            ErrorMsg(arg->AsLiteralNode()->token_pos(),
-                     "map literal %s at index %d must be "
-                     "a constant of type '%s'",
-                     ((i % 2) == 0) ? "key" : "value",
-                     i >> 1,
-                     String::Handle(isolate(),
-                                    arg_type.UserVisibleName()).ToCString());
+            ReportError(arg->AsLiteralNode()->token_pos(),
+                        "map literal %s at index %d must be "
+                        "a constant of type '%s'",
+                        ((i % 2) == 0) ? "key" : "value",
+                        i >> 1,
+                        String::Handle(I,
+                                       arg_type.UserVisibleName()).ToCString());
           }
         }
       }
@@ -9914,36 +9958,36 @@
     key_value_array.MakeImmutable();
 
     // Construct the map object.
-    const Class& immutable_map_class = Class::Handle(isolate(),
+    const Class& immutable_map_class = Class::Handle(I,
         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(isolate()) ArgumentListNode(TokenPos());
-    constr_args->Add(new(isolate()) LiteralNode(literal_pos, key_value_array));
+    ArgumentListNode* constr_args = new(I) ArgumentListNode(TokenPos());
+    constr_args->Add(new(I) LiteralNode(literal_pos, key_value_array));
     const Function& map_constr =
         Function::ZoneHandle(I, immutable_map_class.LookupConstructor(
             Library::PrivateCoreLibName(Symbols::ImmutableMapConstructor())));
     ASSERT(!map_constr.IsNull());
-    const Object& constructor_result = Object::Handle(isolate(),
+    const Object& constructor_result = Object::Handle(I,
         EvaluateConstConstructorCall(immutable_map_class,
                                      map_type_arguments,
                                      map_constr,
                                      constr_args));
     if (constructor_result.IsUnhandledException()) {
-      AppendErrorMsg(Error::Cast(constructor_result),
-                     literal_pos,
-                     "error executing const Map constructor");
+      ReportErrors(Error::Cast(constructor_result),
+                   script_, literal_pos,
+                   "error executing const Map constructor");
     } else {
       const Instance& const_instance = Instance::Cast(constructor_result);
-      return new(isolate()) LiteralNode(
+      return new(I) LiteralNode(
           literal_pos, Instance::ZoneHandle(I, const_instance.raw()));
     }
   } else {
     // Factory call at runtime.
     const Class& factory_class =
-        Class::Handle(isolate(), Library::LookupCoreClass(Symbols::Map()));
+        Class::Handle(I, Library::LookupCoreClass(Symbols::Map()));
     ASSERT(!factory_class.IsNull());
     const Function& factory_method = Function::ZoneHandle(I,
         factory_class.LookupFactory(
@@ -9961,7 +10005,7 @@
     // type argument vector.
     if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 2)) {
       ASSERT(factory_type_args.Length() == 2);
-      Type& factory_type = Type::Handle(isolate(), Type::New(
+      Type& factory_type = Type::Handle(I, Type::New(
           factory_class, factory_type_args, type_pos, Heap::kNew));
       factory_type ^= ClassFinalizer::FinalizeType(
           current_class(), factory_type, ClassFinalizer::kFinalize);
@@ -9969,11 +10013,10 @@
       ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments());
     }
     factory_type_args = factory_type_args.Canonicalize();
-    ArgumentListNode* factory_param =
-        new(isolate()) ArgumentListNode(literal_pos);
+    ArgumentListNode* factory_param = new(I) 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(isolate()) ArrayNode(
+    ArrayNode* kv_pairs = new(I) ArrayNode(
         TokenPos(),
         Type::ZoneHandle(I, Type::ArrayType()),
         kv_pairs_list);
@@ -9996,7 +10039,7 @@
     ConsumeToken();
   }
   const intptr_t type_pos = TokenPos();
-  TypeArguments& type_arguments = TypeArguments::Handle(isolate(),
+  TypeArguments& type_arguments = TypeArguments::Handle(I,
       ParseTypeArguments(ClassFinalizer::kCanonicalize));
   // Malformed type arguments are mapped to dynamic, so we will not encounter
   // them here.
@@ -10009,7 +10052,7 @@
   } else if (CurrentToken() == Token::kLBRACE) {
     primary = ParseMapLiteral(type_pos, is_const, type_arguments);
   } else {
-    ErrorMsg("unexpected token %s", Token::Str(CurrentToken()));
+    ReportError("unexpected token %s", Token::Str(CurrentToken()));
   }
   return primary;
 }
@@ -10019,7 +10062,7 @@
   ASSERT(CurrentToken() == Token::kHASH);
   ConsumeToken();
   intptr_t symbol_pos = TokenPos();
-  String& symbol = String::Handle(isolate());
+  String& symbol = String::Handle(I);
   if (IsIdentifier()) {
     symbol = CurrentLiteral()->raw();
     ConsumeToken();
@@ -10033,33 +10076,33 @@
     symbol = String::New(Token::Str(CurrentToken()));
     ConsumeToken();
   } else {
-    ErrorMsg("illegal symbol literal");
+    ReportError("illegal symbol literal");
   }
   // Lookup class Symbol from internal library and call the
   // constructor to create a symbol instance.
-  const Library& lib = Library::Handle(isolate(), Library::InternalLibrary());
-  const Class& symbol_class = Class::Handle(isolate(),
+  const Library& lib = Library::Handle(I, Library::InternalLibrary());
+  const Class& symbol_class = Class::Handle(I,
                                             lib.LookupClass(Symbols::Symbol()));
   ASSERT(!symbol_class.IsNull());
-  ArgumentListNode* constr_args = new(isolate()) ArgumentListNode(symbol_pos);
-  constr_args->Add(new(isolate()) LiteralNode(
+  ArgumentListNode* constr_args = new(I) ArgumentListNode(symbol_pos);
+  constr_args->Add(new(I) 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(isolate(),
+  const Object& result = Object::Handle(I,
       EvaluateConstConstructorCall(symbol_class,
-                                   TypeArguments::Handle(isolate()),
+                                   TypeArguments::Handle(I),
                                    constr,
                                    constr_args));
   if (result.IsUnhandledException()) {
-    AppendErrorMsg(Error::Cast(result),
-                   symbol_pos,
-                   "error executing const Symbol constructor");
+    ReportErrors(Error::Cast(result),
+                 script_, symbol_pos,
+                 "error executing const Symbol constructor");
   }
   const Instance& instance = Instance::Cast(result);
-  return new(isolate()) LiteralNode(symbol_pos,
-                                    Instance::ZoneHandle(I, instance.raw()));
+  return new(I) LiteralNode(symbol_pos,
+                            Instance::ZoneHandle(I, instance.raw()));
 }
 
 
@@ -10084,32 +10127,36 @@
   ASSERT((op_kind == Token::kNEW) || (op_kind == Token::kCONST));
   bool is_const = (op_kind == Token::kCONST);
   if (!IsIdentifier()) {
-    ErrorMsg("type name expected");
+    ReportError("type name expected");
   }
   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(isolate(),
-      ParseType(ClassFinalizer::kCanonicalizeWellFormed, allow_deferred_type));
+  const bool consume_unresolved_prefix = (LookaheadToken(3) == Token::kLT) ||
+                                         (LookaheadToken(3) == Token::kPERIOD);
+  AbstractType& type = AbstractType::Handle(I,
+      ParseType(ClassFinalizer::kCanonicalizeWellFormed,
+                allow_deferred_type,
+                consume_unresolved_prefix));
   // 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(isolate()),  // No previous error.
+        Error::Handle(I),  // No previous error.
         script_,
         type_pos,
         "%s'%s' cannot be instantiated",
         type.IsTypeParameter() ? "type parameter " : "",
         type.IsTypeParameter() ?
-            String::Handle(isolate(), type.UserVisibleName()).ToCString() :
+            String::Handle(I, type.UserVisibleName()).ToCString() :
             "dynamic");
   }
 
   // The grammar allows for an optional ('.' identifier)? after the type, which
-  // is a named constructor. Note that ParseType() above will not consume it as
-  // part of a misinterpreted qualified identifier, because only a valid library
-  // prefix is accepted as qualifier.
+  // is a named constructor. Note that we tell ParseType() above not to
+  // consume it as part of a misinterpreted qualified identifier. Only a
+  // valid library prefix is accepted as qualifier.
   String* named_constructor = NULL;
   if (CurrentToken() == Token::kPERIOD) {
     ConsumeToken();
@@ -10125,15 +10172,15 @@
   // malbounded type or report a compile-time error if the constructor is const.
   if (type.IsMalformedOrMalbounded()) {
     if (is_const) {
-      const Error& error = Error::Handle(isolate(), type.error());
-      ErrorMsg(error);
+      const Error& error = Error::Handle(I, type.error());
+      ReportError(error);
     }
     return ThrowTypeError(type_pos, type);
   }
 
   // Resolve the type and optional identifier to a constructor or factory.
-  Class& type_class = Class::Handle(isolate(), type.type_class());
-  String& type_class_name = String::Handle(isolate(), type_class.Name());
+  Class& type_class = Class::Handle(I, type.type_class());
+  String& type_class_name = String::Handle(I, type_class.Name());
   TypeArguments& type_arguments =
       TypeArguments::ZoneHandle(I, type.arguments());
 
@@ -10160,13 +10207,13 @@
       // compile-time error if the constructor is const.
       if (is_const) {
         type = ClassFinalizer::NewFinalizedMalformedType(
-            Error::Handle(isolate()),  // No previous error.
+            Error::Handle(I),  // No previous error.
             script_,
             call_pos,
             "class '%s' has no constructor or factory named '%s'",
-            String::Handle(isolate(), type_class.Name()).ToCString(),
+            String::Handle(I, type_class.Name()).ToCString(),
             external_constructor_name.ToCString());
-        ErrorMsg(Error::Handle(isolate(), type.error()));
+        ReportError(Error::Handle(I, type.error()));
       }
       return ThrowNoSuchMethodError(call_pos,
                                     type_class,
@@ -10177,13 +10224,12 @@
                                     NULL);  // No existing function.
     } else if (constructor.IsRedirectingFactory()) {
       ClassFinalizer::ResolveRedirectingFactory(type_class, constructor);
-      Type& redirect_type = Type::Handle(isolate(),
-                                         constructor.RedirectionType());
+      Type& redirect_type = Type::Handle(I, 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(isolate());
+        Error& error = Error::Handle(I);
         redirect_type ^= redirect_type.InstantiateFrom(type_arguments, &error);
         if (!error.IsNull()) {
           redirect_type = ClassFinalizer::NewFinalizedMalformedType(
@@ -10191,13 +10237,12 @@
               script_,
               call_pos,
               "redirecting factory type '%s' cannot be instantiated",
-              String::Handle(isolate(),
-                             redirect_type.UserVisibleName()).ToCString());
+              String::Handle(I, redirect_type.UserVisibleName()).ToCString());
         }
       }
       if (redirect_type.IsMalformedOrMalbounded()) {
         if (is_const) {
-          ErrorMsg(Error::Handle(isolate(), redirect_type.error()));
+          ReportError(Error::Handle(I, redirect_type.error()));
         }
         return ThrowTypeError(redirect_type.token_pos(), redirect_type);
       }
@@ -10224,15 +10269,14 @@
   ASSERT(!constructor.IsNull());
   if (type_class.is_abstract() && !constructor.IsFactory()) {
     // Evaluate arguments before throwing.
-    LetNode* result = new(isolate()) LetNode(call_pos);
+    LetNode* result = new(I) LetNode(call_pos);
     for (intptr_t i = 0; i < arguments->length(); ++i) {
       result->AddNode(arguments->NodeAt(i));
     }
-    ArgumentListNode* error_arguments =
-        new(isolate()) ArgumentListNode(type_pos);
-    error_arguments->Add(new(isolate()) LiteralNode(
+    ArgumentListNode* error_arguments = new(I) ArgumentListNode(type_pos);
+    error_arguments->Add(new(I) LiteralNode(
         TokenPos(), Integer::ZoneHandle(I, Integer::New(type_pos))));
-    error_arguments->Add(new(isolate()) LiteralNode(
+    error_arguments->Add(new(I) LiteralNode(
         TokenPos(), String::ZoneHandle(I, type_class_name.raw())));
     result->AddNode(
         MakeStaticCall(Symbols::AbstractClassInstantiationError(),
@@ -10240,19 +10284,19 @@
                        error_arguments));
     return result;
   }
-  String& error_message = String::Handle(isolate());
+  String& error_message = String::Handle(I);
   if (!constructor.AreValidArguments(arguments_length,
                                      arguments->names(),
                                      &error_message)) {
     const String& external_constructor_name =
         (named_constructor ? constructor_name : type_class_name);
     if (is_const) {
-      ErrorMsg(call_pos,
-               "invalid arguments passed to constructor '%s' "
-               "for class '%s': %s",
-               external_constructor_name.ToCString(),
-               String::Handle(isolate(), type_class.Name()).ToCString(),
-               error_message.ToCString());
+      ReportError(call_pos,
+                  "invalid arguments passed to constructor '%s' "
+                  "for class '%s': %s",
+                  external_constructor_name.ToCString(),
+                  String::Handle(I, type_class.Name()).ToCString(),
+                  error_message.ToCString());
     }
     return ThrowNoSuchMethodError(call_pos,
                                   type_class,
@@ -10267,7 +10311,7 @@
   // compile-time error if the constructor is const.
   if (type.IsMalformedOrMalbounded()) {
     if (is_const) {
-      ErrorMsg(Error::Handle(isolate(), type.error()));
+      ReportError(Error::Handle(I, type.error()));
     }
     return ThrowTypeError(type_pos, type);
   }
@@ -10278,11 +10322,11 @@
     if (!constructor.is_const()) {
       const String& external_constructor_name =
           (named_constructor ? constructor_name : type_class_name);
-      ErrorMsg("non-const constructor '%s' cannot be used in "
-               "const object creation",
-               external_constructor_name.ToCString());
+      ReportError("non-const constructor '%s' cannot be used in "
+                  "const object creation",
+                  external_constructor_name.ToCString());
     }
-    const Object& constructor_result = Object::Handle(isolate(),
+    const Object& constructor_result = Object::Handle(I,
         EvaluateConstConstructorCall(type_class,
                                      type_arguments,
                                      constructor,
@@ -10290,30 +10334,29 @@
     if (constructor_result.IsUnhandledException()) {
       // It's a compile-time error if invocation of a const constructor
       // call fails.
-      AppendErrorMsg(Error::Cast(constructor_result),
-                     new_pos,
-                     "error while evaluating const constructor");
+      ReportErrors(Error::Cast(constructor_result),
+                   script_, new_pos,
+                   "error while evaluating const constructor");
     } 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(isolate());
+      Instance& const_instance = Instance::Handle(I);
       const_instance ^= constructor_result.raw();
-      new_object = new(isolate()) LiteralNode(
+      new_object = new(I) LiteralNode(
           new_pos, Instance::ZoneHandle(I, const_instance.raw()));
       if (!type_bound.IsNull()) {
         ASSERT(!type_bound.IsMalformed());
-        Error& malformed_error = Error::Handle(isolate());
+        Error& malformed_error = Error::Handle(I);
         ASSERT(!is_top_level_);  // We cannot check unresolved types.
         if (!const_instance.IsInstanceOf(type_bound,
-                                         TypeArguments::Handle(isolate()),
+                                         TypeArguments::Handle(I),
                                          &malformed_error)) {
           type_bound = ClassFinalizer::NewFinalizedMalformedType(
               malformed_error,
               script_,
               new_pos,
               "const factory result is not an instance of '%s'",
-              String::Handle(isolate(),
-                             type_bound.UserVisibleName()).ToCString());
+              String::Handle(I, type_bound.UserVisibleName()).ToCString());
           new_object = ThrowTypeError(new_pos, type_bound);
         }
         type_bound = AbstractType::null();
@@ -10333,7 +10376,7 @@
         new_pos, type_arguments, constructor, arguments);
   }
   if (!type_bound.IsNull()) {
-    new_object = new(isolate()) AssignableNode(
+    new_object = new(I) AssignableNode(
          new_pos, new_object, type_bound, Symbols::FactoryResult());
   }
   return new_object;
@@ -10342,32 +10385,31 @@
 
 String& Parser::Interpolate(const GrowableArray<AstNode*>& values) {
   const Class& cls = Class::Handle(
-      isolate(), Library::LookupCoreClass(Symbols::StringBase()));
+      I, Library::LookupCoreClass(Symbols::StringBase()));
   ASSERT(!cls.IsNull());
-  const Function& func = Function::Handle(isolate(), cls.LookupStaticFunction(
+  const Function& func = Function::Handle(I, cls.LookupStaticFunction(
       Library::PrivateCoreLibName(Symbols::Interpolate())));
   ASSERT(!func.IsNull());
 
   // Build the array of literal values to interpolate.
-  const Array& value_arr = Array::Handle(isolate(),
-                                         Array::New(values.length()));
+  const Array& value_arr = Array::Handle(I, Array::New(values.length()));
   for (int i = 0; i < values.length(); i++) {
     ASSERT(values[i]->IsLiteralNode());
     value_arr.SetAt(i, values[i]->AsLiteralNode()->literal());
   }
 
   // Build argument array to pass to the interpolation function.
-  const Array& interpolate_arg = Array::Handle(isolate(), Array::New(1));
+  const Array& interpolate_arg = Array::Handle(I, Array::New(1));
   interpolate_arg.SetAt(0, value_arr);
 
   // Call interpolation function.
-  Object& result = Object::Handle(isolate());
+  Object& result = Object::Handle(I);
   {
-    PAUSETIMERSCOPE(isolate(), time_compilation);
+    PAUSETIMERSCOPE(I, time_compilation);
     result = DartEntry::InvokeFunction(func, interpolate_arg);
   }
   if (result.IsUnhandledException()) {
-    ErrorMsg("%s", Error::Cast(result).ToErrorCString());
+    ReportError("%s", Error::Cast(result).ToErrorCString());
   }
   String& concatenated = String::ZoneHandle(I);
   concatenated ^= result.raw();
@@ -10392,7 +10434,7 @@
       (l1_token != Token::kINTERPOL_VAR) &&
       (l1_token != Token::kINTERPOL_START)) {
     // Common case: no interpolation.
-    primary = new(isolate()) LiteralNode(literal_start, *CurrentLiteral());
+    primary = new(I) LiteralNode(literal_start, *CurrentLiteral());
     ConsumeToken();
     return primary;
   }
@@ -10404,14 +10446,13 @@
     if (CurrentLiteral()->Length() > 0) {
       // Only add non-empty string sections to the values list
       // that will be concatenated.
-      values_list.Add(new(isolate()) LiteralNode(TokenPos(),
-                                                 *CurrentLiteral()));
+      values_list.Add(new(I) LiteralNode(TokenPos(), *CurrentLiteral()));
     }
     ConsumeToken();
     while ((CurrentToken() == Token::kINTERPOL_VAR) ||
         (CurrentToken() == Token::kINTERPOL_START)) {
       if (!allow_interpolation) {
-        ErrorMsg("string interpolation not allowed in this context");
+        ReportError("string interpolation not allowed in this context");
       }
       has_interpolation = true;
       AstNode* expr = NULL;
@@ -10439,8 +10480,8 @@
             const_expr->IsBool() ||
             const_expr->IsNull())) {
           // Change expr into a literal.
-          expr = new(isolate()) LiteralNode(expr_pos,
-                                            EvaluateConstExpr(expr_pos, expr));
+          expr = new(I) LiteralNode(expr_pos,
+                                    EvaluateConstExpr(expr_pos, expr));
         } else {
           is_compiletime_const = false;
         }
@@ -10450,11 +10491,9 @@
   }
   if (is_compiletime_const) {
     if (has_interpolation) {
-      primary = new(isolate()) LiteralNode(
-          literal_start, Interpolate(values_list));
+      primary = new(I) LiteralNode(literal_start, Interpolate(values_list));
     } else {
-      const Array& strings = Array::Handle(isolate(),
-                                           Array::New(values_list.length()));
+      const Array& strings = Array::Handle(I, 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());
@@ -10463,14 +10502,14 @@
       String& lit = String::ZoneHandle(I,
                                        String::ConcatAll(strings, Heap::kOld));
       lit = Symbols::New(lit);
-      primary = new(isolate()) LiteralNode(literal_start, lit);
+      primary = new(I) LiteralNode(literal_start, lit);
     }
   } else {
-    ArrayNode* values = new(isolate()) ArrayNode(
+    ArrayNode* values = new(I) ArrayNode(
         TokenPos(),
         Type::ZoneHandle(I, Type::ArrayType()),
         values_list);
-    primary = new(isolate()) StringInterpolateNode(TokenPos(), values);
+    primary = new(I) StringInterpolateNode(TokenPos(), values);
   }
   return primary;
 }
@@ -10488,48 +10527,44 @@
     primary = ParseFunctionStatement(true);
     CloseBlock();
   } else if (IsIdentifier()) {
-    QualIdent qual_ident;
     intptr_t qual_ident_pos = TokenPos();
-    ParseQualIdent(&qual_ident);
-    if (qual_ident.lib_prefix == NULL) {
-      if (!ResolveIdentInLocalScope(qual_ident.ident_pos,
-                                    *qual_ident.ident,
-                                    &primary)) {
+    const LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(I, ParsePrefix());
+    String& ident = *CurrentLiteral();
+    ConsumeToken();
+    if (prefix.IsNull()) {
+      if (!ResolveIdentInLocalScope(qual_ident_pos, ident, &primary)) {
         // Check whether the identifier is a type parameter.
         if (!current_class().IsNull()) {
           TypeParameter& type_param = TypeParameter::ZoneHandle(I,
-              current_class().LookupTypeParameter(*(qual_ident.ident)));
+              current_class().LookupTypeParameter(ident));
           if (!type_param.IsNull()) {
-            return new(isolate()) PrimaryNode(qual_ident.ident_pos, type_param);
+            return new(I) PrimaryNode(qual_ident_pos, type_param);
           }
         }
         // This is a non-local unqualified identifier so resolve the
         // identifier locally in the main app library and all libraries
         // imported by it.
-        primary = ResolveIdentInCurrentLibraryScope(qual_ident.ident_pos,
-                                                    *qual_ident.ident);
+        primary = ResolveIdentInCurrentLibraryScope(qual_ident_pos, ident);
       }
     } else {
       // This is a qualified identifier with a library prefix so resolve
       // the identifier locally in that library (we do not include the
       // libraries imported by that library).
-      primary = ResolveIdentInPrefixScope(qual_ident.ident_pos,
-                                          *qual_ident.lib_prefix,
-                                          *qual_ident.ident);
+      primary = ResolveIdentInPrefixScope(qual_ident_pos, prefix, ident);
+
       // If the identifier could not be resolved, throw a NoSuchMethodError.
       // Note: unlike in the case of an unqualified identifier, do not
       // interpret the unresolved identifier as an instance method or
       // instance getter call when compiling an instance method.
       if (primary == NULL) {
-        if (qual_ident.lib_prefix->is_deferred_load() &&
-            qual_ident.ident->Equals(Symbols::LoadLibrary())) {
+        if (prefix.is_deferred_load() &&
+            ident.Equals(Symbols::LoadLibrary())) {
           // Hack Alert: recognize special 'loadLibrary' call on the
           // prefix object. The prefix is the primary. Rewind parser and
           // let ParseSelectors() handle the loadLibrary call.
           SetPosition(qual_ident_pos);
           ConsumeToken();  // Prefix name.
-          primary = new(isolate()) LiteralNode(
-              qual_ident_pos, *qual_ident.lib_prefix);
+          primary = new(I) LiteralNode(qual_ident_pos, prefix);
         } else {
           // TODO(hausner): Ideally we should generate the NoSuchMethodError
           // later, when we know more about how the unresolved name is used.
@@ -10541,10 +10576,9 @@
           // is used. We cheat a little here by looking at the next token
           // to determine whether we have an unresolved method call or
           // field access.
-          String& qualified_name =
-              String::ZoneHandle(I, qual_ident.lib_prefix->name());
+          String& qualified_name = String::ZoneHandle(I, prefix.name());
           qualified_name = String::Concat(qualified_name, Symbols::Dot());
-          qualified_name = String::Concat(qualified_name, *qual_ident.ident);
+          qualified_name = String::Concat(qualified_name, ident);
           qualified_name = Symbols::New(qualified_name);
           InvocationMirror::Type call_type =
               CurrentToken() == Token::kLPAREN ?
@@ -10563,22 +10597,22 @@
   } else if (token == Token::kTHIS) {
     LocalVariable* local = LookupLocalScope(Symbols::This());
     if (local == NULL) {
-      ErrorMsg("receiver 'this' is not in scope");
+      ReportError("receiver 'this' is not in scope");
     }
-    primary = new(isolate()) LoadLocalNode(TokenPos(), local);
+    primary = new(I) LoadLocalNode(TokenPos(), local);
     ConsumeToken();
   } else if (token == Token::kINTEGER) {
     const Integer& literal = Integer::ZoneHandle(I, CurrentIntegerLiteral());
-    primary = new(isolate()) LiteralNode(TokenPos(), literal);
+    primary = new(I) LiteralNode(TokenPos(), literal);
     ConsumeToken();
   } else if (token == Token::kTRUE) {
-    primary = new(isolate()) LiteralNode(TokenPos(), Bool::True());
+    primary = new(I) LiteralNode(TokenPos(), Bool::True());
     ConsumeToken();
   } else if (token == Token::kFALSE) {
-    primary = new(isolate()) LiteralNode(TokenPos(), Bool::False());
+    primary = new(I) LiteralNode(TokenPos(), Bool::False());
     ConsumeToken();
   } else if (token == Token::kNULL) {
-    primary = new(isolate()) LiteralNode(TokenPos(), Instance::ZoneHandle(I));
+    primary = new(I) LiteralNode(TokenPos(), Instance::ZoneHandle(I));
     ConsumeToken();
   } else if (token == Token::kLPAREN) {
     ConsumeToken();
@@ -10589,9 +10623,9 @@
   } else if (token == Token::kDOUBLE) {
     Double& double_value = Double::ZoneHandle(I, CurrentDoubleLiteral());
     if (double_value.IsNull()) {
-      ErrorMsg("invalid double literal");
+      ReportError("invalid double literal");
     }
-    primary = new(isolate()) LiteralNode(TokenPos(), double_value);
+    primary = new(I) LiteralNode(TokenPos(), double_value);
     ConsumeToken();
   } else if (token == Token::kSTRING) {
     primary = ParseStringLiteral(true);
@@ -10617,18 +10651,18 @@
     primary = ParseSymbolLiteral();
   } else if (token == Token::kSUPER) {
     if (current_function().is_static()) {
-      ErrorMsg("cannot access superclass from static method");
+      ReportError("cannot access superclass from static method");
     }
     if (current_class().SuperClass() == Class::null()) {
-      ErrorMsg("class '%s' does not have a superclass",
-               String::Handle(isolate(), current_class().Name()).ToCString());
+      ReportError("class '%s' does not have a superclass",
+                  String::Handle(I, current_class().Name()).ToCString());
     }
     if (current_class().IsMixinApplication()) {
-      const Type& mixin_type = Type::Handle(isolate(), current_class().mixin());
+      const Type& mixin_type = Type::Handle(I, current_class().mixin());
       if (mixin_type.type_class() == current_function().origin()) {
-        ErrorMsg("method of mixin class '%s' may not refer to 'super'",
-                 String::Handle(isolate(), Class::Handle(isolate(),
-                     current_function().origin()).Name()).ToCString());
+        ReportError("method of mixin class '%s' may not refer to 'super'",
+                    String::Handle(I, Class::Handle(I,
+                        current_function().origin()).Name()).ToCString());
       }
     }
     const intptr_t super_pos = TokenPos();
@@ -10647,7 +10681,7 @@
         (CurrentToken() == Token::kNE)) {
       primary = ParseSuperOperator();
     } else {
-      primary = new(isolate()) PrimaryNode(super_pos, Symbols::Super());
+      primary = new(I) PrimaryNode(super_pos, Symbols::Super());
     }
   } else {
     UnexpectedToken();
@@ -10674,19 +10708,19 @@
     return Instance::ZoneHandle(I, field.value());
   } else {
     ASSERT(expr->EvalConstExpr() != NULL);
-    ReturnNode* ret = new(isolate()) ReturnNode(expr->token_pos(), expr);
+    ReturnNode* ret = new(I) ReturnNode(expr->token_pos(), expr);
     // Compile time constant expressions cannot reference anything from a
     // local scope.
-    LocalScope* empty_scope = new(isolate()) LocalScope(NULL, 0, 0);
-    SequenceNode* seq = new(isolate()) SequenceNode(expr->token_pos(),
+    LocalScope* empty_scope = new(I) LocalScope(NULL, 0, 0);
+    SequenceNode* seq = new(I) SequenceNode(expr->token_pos(),
                                                     empty_scope);
     seq->Add(ret);
 
-    Object& result = Object::Handle(isolate(), Compiler::ExecuteOnce(seq));
+    Object& result = Object::Handle(I, Compiler::ExecuteOnce(seq));
     if (result.IsError()) {
-      AppendErrorMsg(Error::Cast(result),
-                     expr_pos,
-                     "error evaluating constant expression");
+      ReportErrors(Error::Cast(result),
+                   script_, expr_pos,
+                   "error evaluating constant expression");
     }
     ASSERT(result.IsInstance());
     Instance& value = Instance::ZoneHandle(I);
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 15de41f..fc68254 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -258,6 +258,8 @@
 
   void ComputeCurrentToken();
 
+  RawLibraryPrefix* ParsePrefix();
+
   Token::Kind LookaheadToken(int num_tokens);
   String* CurrentLiteral() const;
   RawDouble* CurrentDoubleLiteral() const;
@@ -311,31 +313,27 @@
                                          const Function& constructor,
                                          const TypeArguments& type_arguments);
 
-  // A null script means no source and a negative token_pos means no position.
-  static RawString* FormatMessage(const Script& script,
-                                  intptr_t token_pos,
-                                  LanguageError::Kind kind,
-                                  const char* format,
-                                  va_list args);
+  // Report already formatted error.
+  static void ReportError(const Error& error);
 
-  // Reports error/warning msg at location of current token in current script.
-  void ErrorMsg(const char* msg, ...) PRINTF_ATTRIBUTE(2, 3);
-  void Warning(const char* msg, ...)  PRINTF_ATTRIBUTE(2, 3);
-  void Unimplemented(const char* msg);
+  // Concatenate and report an already formatted error and a new error message.
+  static void ReportErrors(const Error& prev_error,
+                           const Script& script, intptr_t token_pos,
+                           const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
 
-  // Reports error message at given location in current script.
-  void ErrorMsg(intptr_t token_pos, const char* msg, ...) const
-      PRINTF_ATTRIBUTE(3, 4);
-  void Warning(intptr_t token_pos, const char* msg, ...)
-      PRINTF_ATTRIBUTE(3, 4);
+  // Report error message at location of current token in current script.
+  void ReportError(const char* msg, ...) const PRINTF_ATTRIBUTE(2, 3);
 
-  // Reports an already formatted error message.
-  static void ErrorMsg(const Error& error);
+  // Report error message at given location in current script.
+  void ReportError(intptr_t token_pos,
+                   const char* msg, ...) const PRINTF_ATTRIBUTE(3, 4);
 
-  // Concatenates two error messages, the previous and the current one.
-  void AppendErrorMsg(
-      const Error& prev_error, intptr_t token_pos, const char* format, ...)
-      PRINTF_ATTRIBUTE(4, 5);
+  // Report warning message at location of current token in current script.
+  void ReportWarning(const char* msg, ...) const PRINTF_ATTRIBUTE(2, 3);
+
+  // Report warning message at given location in current script.
+  void ReportWarning(intptr_t token_pos,
+                     const char* msg, ...) const PRINTF_ATTRIBUTE(3, 4);
 
   void CheckRecursiveInvocation();
 
@@ -383,11 +381,11 @@
                             ClassFinalizer::FinalizationKind finalization,
                             AbstractType* type);
   RawAbstractType* ParseType(ClassFinalizer::FinalizationKind finalization,
-                             bool allow_deferred_type = false);
+                             bool allow_deferred_type = false,
+                             bool consume_unresolved_prefix = true);
   void ParseTypeParameters(const Class& cls);
   RawTypeArguments* ParseTypeArguments(
       ClassFinalizer::FinalizationKind finalization);
-  void ParseQualIdent(QualIdent* qual_ident);
   void ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method);
   void ParseFieldDefinition(ClassDesc* members, MemberDesc* field);
   void CheckMemberNameConflict(ClassDesc* members, MemberDesc* member);
@@ -548,6 +546,7 @@
   bool IsSimpleLiteral(const AbstractType& type, Instance* value);
   bool IsFunctionTypeAliasName();
   bool IsMixinAppAlias();
+  bool TryParseQualIdent();
   bool TryParseTypeParameters();
   bool TryParseOptionalType();
   bool TryParseReturnType();
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 4cb4e10..016332e 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -21,7 +21,8 @@
 namespace dart {
 
 
-#if defined(USING_SIMULATOR) || defined(TARGET_OS_ANDROID)
+#if defined(USING_SIMULATOR) || defined(TARGET_OS_ANDROID) || \
+    defined(HOST_ARCH_ARM64)
   DEFINE_FLAG(bool, profile, false, "Enable Sampling Profiler");
 #else
   DEFINE_FLAG(bool, profile, true, "Enable Sampling Profiler");
@@ -45,6 +46,7 @@
   // Place some sane restrictions on user controlled flags.
   SetSamplePeriod(FLAG_profile_period);
   SetSampleDepth(FLAG_profile_depth);
+  Sample::InitOnce();
   if (!FLAG_profile) {
     return;
   }
@@ -69,7 +71,7 @@
 
 void Profiler::SetSampleDepth(intptr_t depth) {
   const int kMinimumDepth = 1;
-  const int kMaximumDepth = kSampleFramesSize - 1;
+  const int kMaximumDepth = 255;
   if (depth < kMinimumDepth) {
     FLAG_profile_depth = kMinimumDepth;
   } else if (depth > kMaximumDepth) {
@@ -1616,6 +1618,42 @@
 }
 
 
+intptr_t Sample::pcs_length_ = 0;
+intptr_t Sample::instance_size_ = 0;
+
+
+void Sample::InitOnce() {
+  ASSERT(FLAG_profile_depth >= 1);
+  pcs_length_ = FLAG_profile_depth;
+  instance_size_ =
+      sizeof(Sample) + (sizeof(uword) * pcs_length_);  // NOLINT.
+}
+
+
+uword* Sample::GetPCArray() const {
+  return reinterpret_cast<uword*>(
+        reinterpret_cast<uintptr_t>(this) + sizeof(*this));
+}
+
+
+SampleBuffer::SampleBuffer(intptr_t capacity) {
+  ASSERT(Sample::instance_size() > 0);
+  samples_ = reinterpret_cast<Sample*>(
+      calloc(capacity, Sample::instance_size()));
+  capacity_ = capacity;
+  cursor_ = 0;
+}
+
+
+Sample* SampleBuffer::At(intptr_t idx) const {
+  ASSERT(idx >= 0);
+  ASSERT(idx < capacity_);
+  intptr_t offset = idx * Sample::instance_size();
+  uint8_t* samples = reinterpret_cast<uint8_t*>(samples_);
+  return reinterpret_cast<Sample*>(samples + offset);
+}
+
+
 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 f9742b3..871d9ec 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -118,9 +118,6 @@
   DISALLOW_IMPLICIT_CONSTRUCTORS(SampleVisitor);
 };
 
-// The maximum number of stack frames a sample can hold.
-#define kSampleFramesSize 256
-
 // Each Sample holds a stack trace from an isolate.
 class Sample {
  public:
@@ -134,8 +131,9 @@
     sp_ = 0;
     fp_ = 0;
     state_ = 0;
-    for (intptr_t i = 0; i < kSampleFramesSize; i++) {
-      pcs_[i] = 0;
+    uword* pcs = GetPCArray();
+    for (intptr_t i = 0; i < pcs_length_; i++) {
+      pcs[i] = 0;
     }
   }
 
@@ -152,15 +150,17 @@
   // Get stack trace entry.
   uword At(intptr_t i) const {
     ASSERT(i >= 0);
-    ASSERT(i < kSampleFramesSize);
-    return pcs_[i];
+    ASSERT(i < pcs_length_);
+    uword* pcs = GetPCArray();
+    return pcs[i];
   }
 
   // Set stack trace entry.
   void SetAt(intptr_t i, uword pc) {
     ASSERT(i >= 0);
-    ASSERT(i < kSampleFramesSize);
-    pcs_[i] = pc;
+    ASSERT(i < pcs_length_);
+    uword* pcs = GetPCArray();
+    pcs[i] = pc;
   }
 
   uword vm_tag() const {
@@ -203,13 +203,18 @@
   }
 
   void InsertCallerForTopFrame(uword pc) {
+    if (pcs_length_ == 1) {
+      // Only sampling top frame.
+      return;
+    }
+    uword* pcs = GetPCArray();
     // The caller for the top frame is store at index 1.
     // Shift all entries down by one.
-    for (intptr_t i = kSampleFramesSize - 1; i >= 2; i--) {
-      pcs_[i] = pcs_[i - 1];
+    for (intptr_t i = pcs_length_ - 1; i >= 2; i--) {
+      pcs[i] = pcs[i - 1];
     }
     // Insert caller for top frame.
-    pcs_[1] = pc;
+    pcs[1] = pc;
   }
 
   bool processed() const {
@@ -228,7 +233,17 @@
     state_ = LeafFrameIsDart::update(leaf_frame_is_dart, state_);
   }
 
+  static void InitOnce();
+
+  static intptr_t instance_size() {
+    return instance_size_;
+  }
+
+  uword* GetPCArray() const;
+
  private:
+  static intptr_t instance_size_;
+  static intptr_t pcs_length_;
   enum StateBits {
     kProcessedBit = 0,
     kLeafFrameIsDartBit = 1,
@@ -245,7 +260,11 @@
   uword sp_;
   uword fp_;
   uword state_;
-  uword pcs_[kSampleFramesSize];
+
+  /* There are a variable number of words that follow, the words hold the
+   * sampled pc values. Access via GetPCArray() */
+
+  DISALLOW_COPY_AND_ASSIGN(Sample);
 };
 
 
@@ -254,11 +273,7 @@
  public:
   static const intptr_t kDefaultBufferCapacity = 120000;  // 2 minutes @ 1000hz.
 
-  explicit SampleBuffer(intptr_t capacity = kDefaultBufferCapacity) {
-    samples_ = reinterpret_cast<Sample*>(calloc(capacity, sizeof(*samples_)));
-    capacity_ = capacity;
-    cursor_ = 0;
-  }
+  explicit SampleBuffer(intptr_t capacity = kDefaultBufferCapacity);
 
   ~SampleBuffer() {
     if (samples_ != NULL) {
@@ -271,14 +286,9 @@
 
   intptr_t capacity() const { return capacity_; }
 
+  Sample* At(intptr_t idx) const;
   Sample* ReserveSample();
 
-  Sample* At(intptr_t idx) const {
-    ASSERT(idx >= 0);
-    ASSERT(idx < capacity_);
-    return &samples_[idx];
-  }
-
   void VisitSamples(SampleVisitor* visitor) {
     ASSERT(visitor != NULL);
     const intptr_t length = capacity();
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 675b725..4c06517 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -461,7 +461,7 @@
     uword entry_point = reinterpret_cast<uword>(obj->instructions_->ptr()) +
         Instructions::HeaderSize();
     for (intptr_t i = 0; i < length; i++) {
-      int32_t offset = obj->data_[i];
+      int32_t offset = obj->data()[i];
       visitor->VisitPointer(
           reinterpret_cast<RawObject**>(entry_point + offset));
     }
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 8d2ca96..6dc181c 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -223,6 +223,12 @@
     SNAPSHOT_WRITER_SUPPORT()                                                  \
     HEAP_PROFILER_SUPPORT()                                                    \
 
+#define OPEN_ARRAY_START(type, align)                                          \
+  do {                                                                         \
+    const uword result = reinterpret_cast<uword>(this) + sizeof(*this);        \
+    ASSERT(Utils::IsAligned(result, sizeof(align)));                           \
+    return reinterpret_cast<type*>(result);                                    \
+  } while (0)
 
 // RawObject is the base class of all raw objects, even though it carries the
 // class_ field not all raw objects are allocated in the heap and thus cannot
@@ -510,11 +516,11 @@
   }
 
   cpp_vtable handle_vtable_;
-  intptr_t id_;  // Class Id, also index in the class table.
-  intptr_t token_pos_;
-  intptr_t instance_size_in_words_;  // Size if fixed len or 0 if variable len.
-  intptr_t type_arguments_field_offset_in_words_;  // Offset of type args fld.
-  intptr_t next_field_offset_in_words_;  // Offset of the next instance field.
+  int32_t id_;  // Class Id, also index in the class table.
+  int32_t token_pos_;
+  int32_t instance_size_in_words_;  // Size if fixed len or 0 if variable len.
+  int32_t type_arguments_field_offset_in_words_;  // Offset of type args fld.
+  int32_t next_field_offset_in_words_;  // Offset of the next instance field.
   int16_t num_type_arguments_;  // Number of type arguments in flatten vector.
   int16_t num_own_type_arguments_;  // Number of non-overlapping type arguments.
   uint16_t num_native_fields_;  // Number of native fields in class.
@@ -539,7 +545,7 @@
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->ident_);
   }
-  intptr_t token_pos_;
+  int32_t token_pos_;
 };
 
 
@@ -558,9 +564,11 @@
   RawSmi* length_;
 
   // Variable length data follows here.
-  RawAbstractType* types_[0];
+  RawAbstractType** types() {
+    OPEN_ARRAY_START(RawAbstractType*, RawAbstractType*);
+  }
   RawObject** to(intptr_t length) {
-    return reinterpret_cast<RawObject**>(&ptr()->types_[length - 1]);
+    return reinterpret_cast<RawObject**>(&ptr()->types()[length - 1]);
   }
 
   friend class SnapshotReader;
@@ -616,18 +624,23 @@
   RawArray* parameter_types_;
   RawArray* parameter_names_;
   RawObject* data_;  // Additional data specific to the function kind.
+  RawObject** to_snapshot() {
+    return reinterpret_cast<RawObject**>(&ptr()->data_);
+  }
+  // Fields below are not part of the snapshot.
+  RawArray* ic_data_array_;  // ICData of unoptimized code.
+  RawObject** to_no_code() {
+    return reinterpret_cast<RawObject**>(&ptr()->ic_data_array_);
+  }
   RawInstructions* instructions_;  // Instructions of currently active code.
   RawCode* unoptimized_code_;  // Unoptimized code, keep it after optimization.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->unoptimized_code_);
   }
-  RawObject** to_no_code() {
-    return reinterpret_cast<RawObject**>(&ptr()->data_);
-  }
 
-  intptr_t token_pos_;
-  intptr_t end_token_pos_;
-  intptr_t usage_counter_;  // Incremented while function is running.
+  int32_t token_pos_;
+  int32_t end_token_pos_;
+  int32_t usage_counter_;  // Incremented while function is running.
   int16_t num_fixed_parameters_;
   int16_t num_optional_parameters_;  // > 0: positional; < 0: named.
   int16_t deoptimization_counter_;
@@ -685,10 +698,10 @@
     return reinterpret_cast<RawObject**>(&ptr()->guarded_list_length_);
   }
 
-  intptr_t token_pos_;
-  intptr_t guarded_cid_;
-  intptr_t is_nullable_;  // kNullCid if field can contain null value and
-                          // any other value otherwise.
+  int32_t token_pos_;
+  int32_t guarded_cid_;
+  int32_t is_nullable_;  // kNullCid if field can contain null value and
+                         // any other value otherwise.
   // Offset to the guarded length field inside an instance of class matching
   // guarded_cid_. Stored corrected by -kHeapObjectTag to simplify code
   // generated on platforms with weak addressing modes (ARM, MIPS).
@@ -750,8 +763,8 @@
   RawTokenStream* tokens_;
   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->tokens_); }
 
-  intptr_t line_offset_;
-  intptr_t col_offset_;
+  int32_t line_offset_;
+  int32_t col_offset_;
   int8_t kind_;  // Of type Kind.
 };
 
@@ -759,6 +772,7 @@
 class RawLibrary : public RawObject {
   enum LibraryState {
     kAllocated,       // Initial state.
+    kLoadRequested,   // Compiler or script requested load of library.
     kLoadInProgress,  // Library is in the process of being loaded.
     kLoaded,          // Library is loaded.
     kLoadError,       // Error occurred during load of the Library.
@@ -782,9 +796,9 @@
     return reinterpret_cast<RawObject**>(&ptr()->loaded_scripts_);
   }
 
-  intptr_t index_;               // Library id number.
-  intptr_t num_imports_;         // Number of entries in imports_.
-  intptr_t num_anonymous_;       // Number of entries in anonymous_classes_.
+  int32_t index_;               // Library id number.
+  int32_t num_imports_;         // Number of entries in imports_.
+  int32_t num_anonymous_;       // Number of entries in anonymous_classes_.
   Dart_NativeEntryResolver native_entry_resolver_;  // Resolves natives.
   Dart_NativeEntrySymbol native_entry_symbol_resolver_;
   bool corelib_imported_;
@@ -850,7 +864,7 @@
   intptr_t lazy_deopt_pc_offset_;
 
   // Variable length data follows here.
-  int32_t data_[0];
+  int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); }
 
   friend class StackFrame;
   friend class MarkingVisitor;
@@ -872,7 +886,7 @@
   intptr_t size_;
 
   // Variable length data follows here.
-  uint8_t data_[0];
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 
   // Private helper function used while visiting stack frames. The
   // code which iterates over dart frames is also called during GC and
@@ -892,8 +906,16 @@
 
   intptr_t length_;  // Number of descriptors.
 
+  struct PcDescriptorRec {
+    uword pc;
+    int32_t deopt_id;
+    int32_t token_pos;  // Or deopt reason.
+    int16_t try_index;  // Or deopt index.
+    int8_t kind;
+  };
+
   // Variable length data follows here.
-  intptr_t data_[0];
+  PcDescriptorRec* data() { OPEN_ARRAY_START(PcDescriptorRec, intptr_t); }
 
   friend class Object;
 };
@@ -917,7 +939,7 @@
   uword pc_;  // PC corresponding to this stack map representation.
 
   // Variable length data follows here (bitmap of the stack layout).
-  uint8_t data_[0];
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 };
 
 
@@ -933,10 +955,10 @@
 
   struct VarInfo {
     intptr_t index;      // Slot index on stack or in context.
-    int8_t   kind;       // Entry kind of type VarInfoKind.
-    int16_t  scope_id;   // Scope to which the variable belongs.
     intptr_t begin_pos;  // Token position of scope start.
     intptr_t end_pos;    // Token position of scope end.
+    int16_t  scope_id;   // Scope to which the variable belongs.
+    int8_t   kind;       // Entry kind of type VarInfoKind.
   };
 
  private:
@@ -944,7 +966,8 @@
   intptr_t length_;  // Number of descriptors.
   RawArray* names_;  // Array of [length_] variable names.
 
-  VarInfo data_[0];   // Variable info with [length_] entries.
+  // Variable info with [length_] entries.
+  VarInfo* data() { OPEN_ARRAY_START(VarInfo, intptr_t); }
 };
 
 
@@ -958,6 +981,7 @@
     int8_t needs_stacktrace;   // True if a stacktrace is needed.
     int8_t has_catch_all;      // Catches all exceptions.
   };
+
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers);
 
@@ -969,7 +993,7 @@
   RawArray* handled_types_data_;
 
   // Exception handler info of length [length_].
-  HandlerInfo data_[0];
+  HandlerInfo* data() { OPEN_ARRAY_START(HandlerInfo, intptr_t); }
 };
 
 
@@ -981,7 +1005,7 @@
   RawSmi* length_;  // Number of deoptimization commands
 
   // Variable length data follows here.
-  intptr_t data_[0];
+  intptr_t* data() { OPEN_ARRAY_START(intptr_t, intptr_t); }
 };
 
 
@@ -995,9 +1019,9 @@
   RawContext* parent_;
 
   // Variable length data follows here.
-  RawInstance* data_[0];
+  RawInstance** data() { OPEN_ARRAY_START(RawInstance*, RawInstance*); }
   RawObject** to(intptr_t num_vars) {
-    return reinterpret_cast<RawObject**>(&ptr()->data_[num_vars - 1]);
+    return reinterpret_cast<RawObject**>(&ptr()->data()[num_vars - 1]);
   }
 
   friend class SnapshotReader;
@@ -1024,12 +1048,14 @@
 
   intptr_t num_variables_;
 
+  RawObject** from() {
+    return reinterpret_cast<RawObject**>(&ptr()->data()[0]);
+  }
   // Variable length data follows here.
-  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->data_[0]); }
-  RawObject* data_[0];
+  RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); }
   RawObject** to(intptr_t num_vars) {
-    intptr_t data_length = num_vars * (sizeof(VariableDesc)/kWordSize);
-    return reinterpret_cast<RawObject**>(&ptr()->data_[data_length - 1]);
+    const intptr_t data_length = num_vars * (sizeof(VariableDesc)/kWordSize);
+    return reinterpret_cast<RawObject**>(&ptr()->data()[data_length - 1]);
   }
 };
 
@@ -1065,7 +1091,7 @@
     return reinterpret_cast<RawObject**>(&ptr()->mask_);
   }
 
-  intptr_t filled_entry_count_;
+  int32_t filled_entry_count_;
 };
 
 
@@ -1106,7 +1132,7 @@
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->formatted_message_);
   }
-  intptr_t token_pos_;  // Source position in script_.
+  int32_t token_pos_;  // Source position in script_.
   int8_t kind_;  // Of type LanguageError::Kind.
 };
 
@@ -1149,12 +1175,13 @@
   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); }
   RawString* name_;               // Library prefix name.
   RawArray* imports_;             // Libraries imported with this prefix.
+  RawLibrary* importer_;          // Library which declares this prefix.
   RawArray* dependent_code_;      // Code that refers to deferred, unloaded
                                   // library prefix.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->dependent_code_);
   }
-  intptr_t num_imports_;          // Number of library entries in libraries_.
+  int32_t num_imports_;          // Number of library entries in libraries_.
   bool is_deferred_load_;
   bool is_loaded_;
 };
@@ -1190,7 +1217,7 @@
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->error_);
   }
-  intptr_t token_pos_;
+  int32_t token_pos_;
   int8_t type_state_;
 };
 
@@ -1220,8 +1247,8 @@
   RawString* name_;
   RawAbstractType* bound_;  // ObjectType if no explicit bound specified.
   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->bound_); }
-  intptr_t index_;
-  intptr_t token_pos_;
+  int32_t index_;
+  int32_t token_pos_;
   int8_t type_state_;
 };
 
@@ -1297,7 +1324,7 @@
 
   // A sequence of Chunks (typedef in Bignum) representing bignum digits.
   // Bignum::Chunk chunks_[Utils::Abs(signed_length_)];
-  uint8_t data_[0];
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 
   friend class SnapshotReader;
 };
@@ -1328,7 +1355,7 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(OneByteString);
 
   // Variable length data follows here.
-  uint8_t data_[0];
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 
   friend class ApiMessageReader;
   friend class SnapshotReader;
@@ -1339,7 +1366,7 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(TwoByteString);
 
   // Variable length data follows here.
-  uint16_t data_[0];
+  uint16_t* data() { OPEN_ARRAY_START(uint16_t, uint16_t); }
 
   friend class SnapshotReader;
 };
@@ -1401,10 +1428,7 @@
   RawTypeArguments* type_arguments_;
   RawSmi* length_;
   // Variable length data follows here.
-  RawObject** data() {
-    uword address_of_length = reinterpret_cast<uword>(&length_);
-    return reinterpret_cast<RawObject**>(address_of_length + kWordSize);
-  }
+  RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); }
   RawObject** to(intptr_t length) {
     return reinterpret_cast<RawObject**>(&ptr()->data()[length - 1]);
   }
@@ -1501,10 +1525,9 @@
  protected:
   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->length_); }
   RawSmi* length_;
-  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->length_); }
-
   // Variable length data follows here.
-  uint8_t data_[0];
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->length_); }
 
   friend class Api;
   friend class Object;
@@ -1595,7 +1618,7 @@
   intptr_t flags_;  // Represents global/local, case insensitive, multiline.
 
   // Variable length data follows here.
-  uint8_t data_[0];
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 };
 
 
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index e3c8a93..d5811c0 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -39,7 +39,7 @@
   if ((kind == Snapshot::kFull) ||
       (kind == Snapshot::kScript && !RawObject::IsCreatedFromSnapshot(tags))) {
     // Read in the base information.
-    intptr_t class_id = reader->ReadIntptrValue();
+    int32_t class_id = reader->Read<int32_t>();
 
     // Allocate class object of specified kind.
     if (kind == Snapshot::kFull) {
@@ -60,14 +60,14 @@
     // Set all non object fields.
     if (!RawObject::IsInternalVMdefinedClassId(class_id)) {
       // Instance size of a VM defined class is already set up.
-      cls.set_instance_size_in_words(reader->ReadIntptrValue());
-      cls.set_next_field_offset_in_words(reader->ReadIntptrValue());
+      cls.set_instance_size_in_words(reader->Read<int32_t>());
+      cls.set_next_field_offset_in_words(reader->Read<int32_t>());
     }
-    cls.set_type_arguments_field_offset_in_words(reader->ReadIntptrValue());
+    cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>());
     cls.set_num_type_arguments(reader->Read<int16_t>());
     cls.set_num_own_type_arguments(reader->Read<int16_t>());
     cls.set_num_native_fields(reader->Read<uint16_t>());
-    cls.set_token_pos(reader->ReadIntptrValue());
+    cls.set_token_pos(reader->Read<int32_t>());
     cls.set_state_bits(reader->Read<uint16_t>());
 
     // Set all the object fields.
@@ -97,24 +97,24 @@
        !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)))) {
     // Write out the class and tags information.
     writer->WriteVMIsolateObject(kClassCid);
-    writer->WriteIntptrValue(writer->GetObjectTags(this));
+    writer->WriteTags(writer->GetObjectTags(this));
 
     // Write out all the non object pointer fields.
     // NOTE: cpp_vtable_ is not written.
-    intptr_t class_id = ptr()->id_;
-    writer->WriteIntptrValue(class_id);
+    int32_t class_id = ptr()->id_;
+    writer->Write<int32_t>(class_id);
     if (!RawObject::IsInternalVMdefinedClassId(class_id)) {
       // We don't write the instance size of VM defined classes as they
       // are already setup during initialization as part of pre populating
       // the class table.
-      writer->WriteIntptrValue(ptr()->instance_size_in_words_);
-      writer->WriteIntptrValue(ptr()->next_field_offset_in_words_);
+      writer->Write<int32_t>(ptr()->instance_size_in_words_);
+      writer->Write<int32_t>(ptr()->next_field_offset_in_words_);
     }
-    writer->WriteIntptrValue(ptr()->type_arguments_field_offset_in_words_);
+    writer->Write<int32_t>(ptr()->type_arguments_field_offset_in_words_);
     writer->Write<int16_t>(ptr()->num_type_arguments_);
     writer->Write<int16_t>(ptr()->num_own_type_arguments_);
     writer->Write<uint16_t>(ptr()->num_native_fields_);
-    writer->WriteIntptrValue(ptr()->token_pos_);
+    writer->Write<int32_t>(ptr()->token_pos_);
     writer->Write<uint16_t>(ptr()->state_bits_);
 
     // Write out all the object pointer fields.
@@ -141,7 +141,7 @@
   unresolved_class.set_tags(tags);
 
   // Set all non object fields.
-  unresolved_class.set_token_pos(reader->ReadIntptrValue());
+  unresolved_class.set_token_pos(reader->Read<int32_t>());
 
   // Set all the object fields.
   // TODO(5411462): Need to assert No GC can happen here, even though
@@ -167,10 +167,10 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kUnresolvedClassCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the non object pointer fields.
-  writer->WriteIntptrValue(ptr()->token_pos_);
+  writer->Write<int32_t>(ptr()->token_pos_);
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
@@ -205,7 +205,7 @@
   reader->AddBackRef(object_id, &type, kIsDeserialized);
 
   // Set all non object fields.
-  type.set_token_pos(reader->ReadIntptrValue());
+  type.set_token_pos(reader->Read<int32_t>());
   type.set_type_state(reader->Read<int8_t>());
 
   // Set all the object fields.
@@ -253,10 +253,10 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kTypeCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the non object pointer fields.
-  writer->WriteIntptrValue(ptr()->token_pos_);
+  writer->Write<int32_t>(ptr()->token_pos_);
   writer->Write<int8_t>(ptr()->type_state_);
 
   // Write out all the object pointer fields. Since we will be canonicalizing
@@ -305,7 +305,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kTypeRefCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
@@ -328,8 +328,8 @@
   type_parameter.set_tags(tags);
 
   // Set all non object fields.
-  type_parameter.set_index(reader->ReadIntptrValue());
-  type_parameter.set_token_pos(reader->ReadIntptrValue());
+  type_parameter.set_index(reader->Read<int32_t>());
+  type_parameter.set_token_pos(reader->Read<int32_t>());
   type_parameter.set_type_state(reader->Read<int8_t>());
 
   // Set all the object fields.
@@ -360,11 +360,11 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kTypeParameterCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the non object pointer fields.
-  writer->WriteIntptrValue(ptr()->index_);
-  writer->WriteIntptrValue(ptr()->token_pos_);
+  writer->Write<int32_t>(ptr()->index_);
+  writer->Write<int32_t>(ptr()->token_pos_);
   writer->Write<int8_t>(ptr()->type_state_);
 
   // Write out all the object pointer fields.
@@ -412,7 +412,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kBoundedTypeCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
@@ -497,7 +497,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kTypeArgumentsCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the length field.
   writer->Write<RawObject*>(ptr()->length_);
@@ -510,7 +510,7 @@
   // Write out the individual types.
   intptr_t len = Smi::Value(ptr()->length_);
   for (intptr_t i = 0; i < len; i++) {
-    writer->WriteObjectImpl(ptr()->types_[i]);
+    writer->WriteObjectImpl(ptr()->types()[i]);
   }
 }
 
@@ -557,7 +557,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kPatchClassCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
   visitor.VisitPointers(from(), to());
@@ -606,7 +606,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kClosureDataCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Context scope.
   // We don't write the context scope in the snapshot.
@@ -666,7 +666,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kRedirectionDataCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
@@ -692,12 +692,12 @@
   func.set_tags(tags);
 
   // Set all the non object fields.
-  func.set_token_pos(reader->ReadIntptrValue());
-  func.set_end_token_pos(reader->ReadIntptrValue());
-  func.set_usage_counter(reader->ReadIntptrValue());
-  func.set_num_fixed_parameters(reader->ReadIntptrValue());
-  func.set_num_optional_parameters(reader->ReadIntptrValue());
-  func.set_deoptimization_counter(reader->ReadIntptrValue());
+  func.set_token_pos(reader->Read<int32_t>());
+  func.set_end_token_pos(reader->Read<int32_t>());
+  func.set_usage_counter(reader->Read<int32_t>());
+  func.set_num_fixed_parameters(reader->Read<int16_t>());
+  func.set_num_optional_parameters(reader->Read<int16_t>());
+  func.set_deoptimization_counter(reader->Read<int16_t>());
   func.set_kind_tag(reader->Read<uint16_t>());
   func.set_optimized_instruction_count(reader->Read<uint16_t>());
   func.set_optimized_call_site_count(reader->Read<uint16_t>());
@@ -705,14 +705,14 @@
   // Set all the object fields.
   // TODO(5411462): Need to assert No GC can happen here, even though
   // allocations may happen.
-  intptr_t num_flds = (func.raw()->to() - func.raw()->from());
+  intptr_t num_flds = (func.raw()->to_snapshot() - func.raw()->from());
   for (intptr_t i = 0; i <= num_flds; i++) {
     *(func.raw()->from() + i) = reader->ReadObjectRef();
   }
 
-  // Set up code pointer with the lazy-compile-stub.
-  func.SetInstructions(Code::Handle(StubCode::LazyCompile_entry()->code()));
-
+  // Initialize all fields that are not part of the snapshot.
+  func.ClearCode();
+  func.set_ic_data_array(Array::Handle());
   return func.raw();
 }
 
@@ -730,26 +730,22 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kFunctionCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the non object fields.
-  writer->WriteIntptrValue(ptr()->token_pos_);
-  writer->WriteIntptrValue(ptr()->end_token_pos_);
-  writer->WriteIntptrValue(ptr()->usage_counter_);
-  writer->WriteIntptrValue(ptr()->num_fixed_parameters_);
-  writer->WriteIntptrValue(ptr()->num_optional_parameters_);
-  writer->WriteIntptrValue(ptr()->deoptimization_counter_);
+  writer->Write<int32_t>(ptr()->token_pos_);
+  writer->Write<int32_t>(ptr()->end_token_pos_);
+  writer->Write<int32_t>(ptr()->usage_counter_);
+  writer->Write<int16_t>(ptr()->num_fixed_parameters_);
+  writer->Write<int16_t>(ptr()->num_optional_parameters_);
+  writer->Write<int16_t>(ptr()->deoptimization_counter_);
   writer->Write<uint16_t>(ptr()->kind_tag_);
   writer->Write<uint16_t>(ptr()->optimized_instruction_count_);
   writer->Write<uint16_t>(ptr()->optimized_call_site_count_);
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
-  visitor.VisitPointers(from(), to_no_code());
-
-  // Write null for the instructions and unoptimized code.
-  writer->WriteVMIsolateObject(kNullObject);
-  writer->WriteVMIsolateObject(kNullObject);
+  visitor.VisitPointers(from(), to_snapshot());
 }
 
 
@@ -770,9 +766,9 @@
   field.set_tags(tags);
 
   // Set all non object fields.
-  field.set_token_pos(reader->ReadIntptrValue());
-  field.set_guarded_cid(reader->ReadIntptrValue());
-  field.set_is_nullable(reader->ReadIntptrValue());
+  field.set_token_pos(reader->Read<int32_t>());
+  field.set_guarded_cid(reader->Read<int32_t>());
+  field.set_is_nullable(reader->Read<int32_t>());
   field.set_kind_bits(reader->Read<uint8_t>());
 
   // Set all the object fields.
@@ -802,12 +798,12 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kFieldCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the non object fields.
-  writer->WriteIntptrValue(ptr()->token_pos_);
-  writer->WriteIntptrValue(ptr()->guarded_cid_);
-  writer->WriteIntptrValue(ptr()->is_nullable_);
+  writer->Write<int32_t>(ptr()->token_pos_);
+  writer->Write<int32_t>(ptr()->guarded_cid_);
+  writer->Write<int32_t>(ptr()->is_nullable_);
   writer->Write<uint8_t>(ptr()->kind_bits_);
 
   // Write out all the object pointer fields.
@@ -854,7 +850,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kLiteralTokenCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the kind field.
   writer->Write<intptr_t>(ptr()->kind_);
@@ -917,7 +913,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kTokenStreamCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the length field and the token stream.
   RawExternalTypedData* stream = ptr()->stream_;
@@ -981,7 +977,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kScriptCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the object pointer fields.
   writer->WriteObjectImpl(ptr()->url_);
@@ -1016,9 +1012,9 @@
     library.set_tags(tags);
 
     // Set all non object fields.
-    library.raw_ptr()->index_ = reader->ReadIntptrValue();
-    library.raw_ptr()->num_imports_ = reader->ReadIntptrValue();
-    library.raw_ptr()->num_anonymous_ = reader->ReadIntptrValue();
+    library.raw_ptr()->index_ = reader->Read<int32_t>();
+    library.raw_ptr()->num_imports_ = reader->Read<int32_t>();
+    library.raw_ptr()->num_anonymous_ = reader->Read<int32_t>();
     library.raw_ptr()->corelib_imported_ = reader->Read<bool>();
     library.raw_ptr()->is_dart_scheme_ = reader->Read<bool>();
     library.raw_ptr()->debuggable_ = reader->Read<bool>();
@@ -1062,7 +1058,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kLibraryCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   if ((kind == Snapshot::kScript) &&
       RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) {
@@ -1071,9 +1067,9 @@
     writer->WriteObjectImpl(ptr()->url_);
   } else {
     // Write out all non object fields.
-    writer->WriteIntptrValue(ptr()->index_);
-    writer->WriteIntptrValue(ptr()->num_imports_);
-    writer->WriteIntptrValue(ptr()->num_anonymous_);
+    writer->Write<int32_t>(ptr()->index_);
+    writer->Write<int32_t>(ptr()->num_imports_);
+    writer->Write<int32_t>(ptr()->num_anonymous_);
     writer->Write<bool>(ptr()->corelib_imported_);
     writer->Write<bool>(ptr()->is_dart_scheme_);
     writer->Write<bool>(ptr()->debuggable_);
@@ -1113,7 +1109,7 @@
   prefix.set_tags(tags);
 
   // Set all non object fields.
-  prefix.raw_ptr()->num_imports_ = reader->ReadIntptrValue();
+  prefix.raw_ptr()->num_imports_ = reader->Read<int32_t>();
   prefix.raw_ptr()->is_deferred_load_ = reader->Read<bool>();
   prefix.raw_ptr()->is_loaded_ = reader->Read<bool>();
 
@@ -1142,10 +1138,10 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kLibraryPrefixCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all non object fields.
-  writer->WriteIntptrValue(ptr()->num_imports_);
+  writer->Write<int32_t>(ptr()->num_imports_);
   writer->Write<bool>(ptr()->is_deferred_load_);
   writer->Write<bool>(ptr()->is_loaded_);
 
@@ -1197,7 +1193,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kNamespaceCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
@@ -1365,7 +1361,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kContextCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out num of variables in the context.
   writer->WriteIntptrValue(ptr()->num_variables_);
@@ -1496,7 +1492,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kApiErrorCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
@@ -1519,7 +1515,7 @@
   language_error.set_tags(tags);
 
   // Set all non object fields.
-  language_error.set_token_pos(reader->ReadIntptrValue());
+  language_error.set_token_pos(reader->Read<int32_t>());
   language_error.set_kind(reader->Read<uint8_t>());
 
   // Set all the object fields.
@@ -1547,10 +1543,10 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kLanguageErrorCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the non object fields.
-  writer->WriteIntptrValue(ptr()->token_pos_);
+  writer->Write<int32_t>(ptr()->token_pos_);
   writer->Write<uint8_t>(ptr()->kind_);
 
   // Write out all the object pointer fields.
@@ -1636,7 +1632,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kInstanceCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 }
 
 
@@ -1686,7 +1682,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kMintCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the 64 bit value.
   writer->Write<int64_t>(ptr()->value_);
@@ -1744,7 +1740,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kBigintCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the bigint value as a HEXCstring.
   intptr_t length = ptr()->signed_length_;
@@ -1820,7 +1816,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kDoubleCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the double value.
   writer->WriteDouble(ptr()->value_);
@@ -1950,7 +1946,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(class_id);
-  writer->WriteIntptrValue(tags);
+  writer->WriteTags(tags);
 
   // Write out the length field.
   writer->Write<RawObject*>(length);
@@ -1981,7 +1977,7 @@
                 writer->GetObjectTags(this),
                 ptr()->length_,
                 ptr()->hash_,
-                ptr()->data_);
+                ptr()->data());
 }
 
 
@@ -1995,7 +1991,7 @@
                 writer->GetObjectTags(this),
                 ptr()->length_,
                 ptr()->hash_,
-                ptr()->data_);
+                ptr()->data());
 }
 
 
@@ -2166,7 +2162,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kGrowableObjectArrayCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the used length field.
   writer->Write<RawObject*>(ptr()->length_);
@@ -2212,7 +2208,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kFloat32x4Cid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the float values.
   writer->Write<float>(ptr()->value_[0]);
@@ -2258,7 +2254,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kInt32x4Cid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the mask values.
   writer->Write<uint32_t>(ptr()->value_[0]);
@@ -2302,7 +2298,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kFloat64x2Cid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the float values.
   writer->Write<double>(ptr()->value_[0]);
@@ -2381,13 +2377,13 @@
   ASSERT(kind != Snapshot::kFull);
   intptr_t cid = RawObject::ClassIdTag::decode(tags);
   intptr_t length = reader->ReadSmiValue();
-  uint8_t* data = reinterpret_cast<uint8_t*>(reader->ReadIntptrValue());
+  uint8_t* data = reinterpret_cast<uint8_t*>(reader->ReadRawPointerValue());
   const ExternalTypedData& obj = ExternalTypedData::Handle(
       ExternalTypedData::New(cid, data, length));
-  void* peer = reinterpret_cast<void*>(reader->ReadIntptrValue());
+  void* peer = reinterpret_cast<void*>(reader->ReadRawPointerValue());
   Dart_WeakPersistentHandleFinalizer callback =
       reinterpret_cast<Dart_WeakPersistentHandleFinalizer>(
-          reader->ReadIntptrValue());
+          reader->ReadRawPointerValue());
   obj.AddFinalizer(peer, callback);
   return obj.raw();
 }
@@ -2395,7 +2391,7 @@
 
 #define TYPED_DATA_WRITE(type)                                                 \
   {                                                                            \
-    type* data = reinterpret_cast<type*>(ptr()->data_);                        \
+    type* data = reinterpret_cast<type*>(ptr()->data());                       \
     for (intptr_t i = 0; i < len; i++) {                                       \
       writer->Write(data[i]);                                                  \
     }                                                                          \
@@ -2415,7 +2411,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(cid);
-  writer->WriteIntptrValue(tags);
+  writer->WriteTags(tags);
 
   // Write out the length field.
   writer->Write<RawObject*>(ptr()->length_);
@@ -2425,7 +2421,7 @@
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
     case kTypedDataUint8ClampedArrayCid: {
-      uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data_);
+      uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
       writer->WriteBytes(data, len);
       break;
     }
@@ -2459,11 +2455,20 @@
 }
 
 
+#define TYPED_EXT_DATA_WRITE(type)                                             \
+  {                                                                            \
+    type* data = reinterpret_cast<type*>(ptr()->data_);                        \
+    for (intptr_t i = 0; i < len; i++) {                                       \
+      writer->Write(data[i]);                                                  \
+    }                                                                          \
+  }                                                                            \
+
+
 #define EXT_TYPED_DATA_WRITE(cid, type)                                        \
   writer->WriteIndexedObject(cid);                                             \
-  writer->WriteIntptrValue(RawObject::ClassIdTag::update(cid, tags));          \
+  writer->WriteTags(RawObject::ClassIdTag::update(cid, tags));                 \
   writer->Write<RawObject*>(ptr()->length_);                                   \
-  TYPED_DATA_WRITE(type)                                                       \
+  TYPED_EXT_DATA_WRITE(type)                                                   \
 
 
 void RawExternalTypedData::WriteTo(SnapshotWriter* writer,
@@ -2579,7 +2584,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kSendPortCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   writer->Write(ptr()->id_);
 }
@@ -2631,7 +2636,7 @@
 
     // Write out the class and tags information.
     writer->WriteIndexedObject(kStacktraceCid);
-    writer->WriteIntptrValue(writer->GetObjectTags(this));
+    writer->WriteTags(writer->GetObjectTags(this));
 
     // Write out all the object pointer fields.
     SnapshotWriterVisitor visitor(writer);
@@ -2689,7 +2694,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kJSRegExpCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the data length field.
   writer->Write<RawObject*>(ptr()->data_length_);
@@ -2736,7 +2741,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kWeakPropertyCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the other fields.
   writer->Write<RawObject*>(ptr()->key_);
diff --git a/runtime/vm/report.cc b/runtime/vm/report.cc
new file mode 100644
index 0000000..9c1b811
--- /dev/null
+++ b/runtime/vm/report.cc
@@ -0,0 +1,243 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/report.h"
+
+#include "vm/code_patcher.h"
+#include "vm/exceptions.h"
+#include "vm/flags.h"
+#include "vm/longjump.h"
+#include "vm/object.h"
+#include "vm/stack_frame.h"
+#include "vm/symbols.h"
+
+namespace dart {
+
+DEFINE_FLAG(int, stacktrace_depth_on_warning, 5,
+            "Maximal number of stack frames to print after a runtime warning.");
+DEFINE_FLAG(bool, silent_warnings, false, "Silence warnings.");
+DEFINE_FLAG(bool, warn_on_javascript_compatibility, false,
+            "Warn on incompatibilities between vm and dart2js.");
+DEFINE_FLAG(bool, warning_as_error, false, "Treat warnings as errors.");
+
+
+RawString* Report::PrependSnippet(Kind kind,
+                                  const Script& script,
+                                  intptr_t token_pos,
+                                  const String& message) {
+  const char* message_header;
+  switch (kind) {
+    case kWarning: message_header = "warning"; break;
+    case kJSWarning: message_header = "javascript compatibility warning"; break;
+    case kError: message_header = "error"; break;
+    case kMalformedType: message_header = "malformed type"; break;
+    case kMalboundedType: message_header = "malbounded type"; break;
+    case kBailout: message_header = "bailout"; break;
+    default: message_header = ""; UNREACHABLE();
+  }
+  String& result = String::Handle();
+  if (!script.IsNull()) {
+    const String& script_url = String::Handle(script.url());
+    if (token_pos >= 0) {
+      intptr_t line, column;
+      script.GetTokenLocation(token_pos, &line, &column);
+      // Only report the line position if we have the original source. We still
+      // need to get a valid column so that we can report the ^ mark below the
+      // snippet.
+      if (script.HasSource()) {
+        result = String::NewFormatted("'%s': %s: line %" Pd " pos %" Pd ": ",
+                                      script_url.ToCString(),
+                                      message_header,
+                                      line,
+                                      column);
+      } else {
+        result = String::NewFormatted("'%s': %s: line %" Pd ": ",
+                                      script_url.ToCString(),
+                                      message_header,
+                                      line);
+      }
+      // Append the formatted error or warning message.
+      result = String::Concat(result, message);
+      // Append the source line.
+      const String& script_line = String::Handle(script.GetLine(line));
+      ASSERT(!script_line.IsNull());
+      result = String::Concat(result, Symbols::NewLine());
+      result = String::Concat(result, script_line);
+      result = String::Concat(result, Symbols::NewLine());
+      // Append the column marker.
+      const String& column_line = String::Handle(
+          String::NewFormatted("%*s\n", static_cast<int>(column), "^"));
+      result = String::Concat(result, column_line);
+    } else {
+      // Token position is unknown.
+      result = String::NewFormatted("'%s': %s: ",
+                                    script_url.ToCString(),
+                                    message_header);
+      result = String::Concat(result, message);
+    }
+  } else {
+    // Script is unknown.
+    // Append the formatted error or warning message.
+    result = String::NewFormatted("%s: ", message_header);
+    result = String::Concat(result, message);
+  }
+  return result.raw();
+}
+
+
+void Report::LongJump(const Error& error) {
+  Isolate::Current()->long_jump_base()->Jump(1, error);
+  UNREACHABLE();
+}
+
+
+void Report::LongJumpF(const Error& prev_error,
+                       const Script& script, intptr_t token_pos,
+                       const char* format, ...) {
+  va_list args;
+  va_start(args, format);
+  LongJumpV(prev_error, script, token_pos, format, args);
+  va_end(args);
+  UNREACHABLE();
+}
+
+
+void Report::LongJumpV(const Error& prev_error,
+                       const Script& script, intptr_t token_pos,
+                       const char* format, va_list args) {
+  const Error& error = Error::Handle(LanguageError::NewFormattedV(
+      prev_error, script, token_pos,
+      kError, Heap::kNew,
+      format, args));
+  LongJump(error);
+  UNREACHABLE();
+}
+
+
+void Report::MessageF(Kind kind, const Script& script, intptr_t token_pos,
+                      const char* format, ...) {
+  va_list args;
+  va_start(args, format);
+  MessageV(kind, script, token_pos, format, args);
+  va_end(args);
+}
+
+
+void Report::MessageV(Kind kind, const Script& script, intptr_t token_pos,
+                      const char* format, va_list args) {
+  if (kind < kError) {
+    // Reporting a warning.
+    if (FLAG_silent_warnings) {
+      return;
+    }
+    if (!FLAG_warning_as_error) {
+      const String& msg = String::Handle(String::NewFormattedV(format, args));
+      const String& snippet_msg = String::Handle(
+          PrependSnippet(kind, script, token_pos, msg));
+      OS::Print("%s", snippet_msg.ToCString());
+      if (kind == kJSWarning) {
+        TraceJSWarning(script, token_pos, msg);
+        // Do not print stacktrace if we have not executed Dart code yet.
+        if (Isolate::Current()->top_exit_frame_info() != 0) {
+          const Stacktrace& stacktrace =
+              Stacktrace::Handle(Exceptions::CurrentStacktrace());
+          intptr_t idx = 0;
+          OS::Print("%s", stacktrace.ToCStringInternal(
+              &idx, FLAG_stacktrace_depth_on_warning));
+        }
+      }
+      return;
+    }
+  }
+  // Reporting an error (or a warning as error).
+  const Error& error = Error::Handle(
+      LanguageError::NewFormattedV(Error::Handle(),  // No previous error.
+                                   script, token_pos,
+                                   kind, Heap::kNew,
+                                   format, args));
+  if (kind == kJSWarning) {
+    Exceptions::ThrowJavascriptCompatibilityError(error.ToErrorCString());
+    UNREACHABLE();
+  }
+  LongJump(error);
+  UNREACHABLE();
+}
+
+
+void Report::JSWarningFromNative(bool is_static_native, const char* msg) {
+  DartFrameIterator iterator;
+  iterator.NextFrame();  // Skip native call.
+  StackFrame* caller_frame = iterator.NextFrame();
+  ASSERT(caller_frame != NULL);
+  const Code& caller_code = Code::Handle(caller_frame->LookupDartCode());
+  ASSERT(!caller_code.IsNull());
+  const uword caller_pc = caller_frame->pc();
+  ICData& ic_data = ICData::Handle();
+  if (is_static_native) {
+    // Assume an unoptimized static call. Optimization was prevented.
+    CodePatcher::GetUnoptimizedStaticCallAt(caller_pc, caller_code, &ic_data);
+  } else {
+    // Assume an instance call.
+    CodePatcher::GetInstanceCallAt(caller_pc, caller_code, &ic_data);
+  }
+  ASSERT(!ic_data.IsNull());
+  // Report warning only if not already reported at this location.
+  if (!ic_data.IssuedJSWarning()) {
+    ic_data.SetIssuedJSWarning();
+    Report::JSWarningFromFrame(caller_frame, msg);
+  }
+}
+
+
+void Report::JSWarningFromIC(const ICData& ic_data, const char* msg) {
+  DartFrameIterator iterator;
+  StackFrame* caller_frame = iterator.NextFrame();
+  ASSERT(caller_frame != NULL);
+  // Report warning only if not already reported at this location.
+  if (!ic_data.IssuedJSWarning()) {
+    ic_data.SetIssuedJSWarning();
+    JSWarningFromFrame(caller_frame, msg);
+  }
+}
+
+
+void Report::JSWarningFromFrame(StackFrame* caller_frame, const char* msg) {
+  ASSERT(caller_frame != NULL);
+  ASSERT(FLAG_warn_on_javascript_compatibility);
+  if (FLAG_silent_warnings) return;
+  Isolate* isolate = Isolate::Current();
+  const Code& caller_code = Code::Handle(isolate,
+                                         caller_frame->LookupDartCode());
+  ASSERT(!caller_code.IsNull());
+  const uword caller_pc = caller_frame->pc();
+  const intptr_t token_pos = caller_code.GetTokenIndexOfPC(caller_pc);
+  const Function& caller = Function::Handle(isolate, caller_code.function());
+  const Script& script = Script::Handle(isolate, caller.script());
+  MessageF(kJSWarning, script, token_pos, "%s", msg);
+}
+
+
+void Report::TraceJSWarning(const Script& script,
+                            intptr_t token_pos,
+                            const String& message) {
+  const int64_t micros = OS::GetCurrentTimeMicros();
+  Isolate* isolate = Isolate::Current();
+  TraceBuffer* trace_buffer = isolate->trace_buffer();
+  if (trace_buffer == NULL) {
+    TraceBuffer::Init(isolate);
+    trace_buffer = isolate->trace_buffer();
+  }
+  JSONStream js;
+  {
+    JSONObject trace_warning(&js);
+    trace_warning.AddProperty("type", "JSCompatibilityWarning");
+    trace_warning.AddProperty("script", script);
+    trace_warning.AddProperty("tokenPos", token_pos);
+    trace_warning.AddProperty("message", message);
+  }
+  trace_buffer->Trace(micros, js.ToCString(), true);  // Already escaped.
+}
+
+}  // namespace dart
+
diff --git a/runtime/vm/report.h b/runtime/vm/report.h
new file mode 100644
index 0000000..8cc50a1
--- /dev/null
+++ b/runtime/vm/report.h
@@ -0,0 +1,84 @@
+// 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.
+
+#ifndef VM_REPORT_H_
+#define VM_REPORT_H_
+
+#include "vm/allocation.h"
+
+namespace dart {
+
+// Forward declarations.
+class Error;
+class ICData;
+class RawString;
+class Script;
+class StackFrame;
+class String;
+
+class Report : AllStatic {
+ public:
+  enum Kind {
+    kWarning,
+    kJSWarning,
+    kError,
+    kMalformedType,
+    kMalboundedType,
+    kBailout,
+  };
+
+  // Report an already formatted error via a long jump.
+  static void LongJump(const Error& error);
+
+  // Concatenate and report an already formatted error and a new error message.
+  static void LongJumpF(const Error& prev_error,
+                        const Script& script, intptr_t token_pos,
+                        const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
+  static void LongJumpV(const Error& prev_error,
+                        const Script& script, intptr_t token_pos,
+                        const char* format, va_list args);
+
+  // Report a warning/jswarning/error/bailout message.
+  static void MessageF(Kind kind, const Script& script, intptr_t token_pos,
+                       const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
+  static void MessageV(Kind kind, const Script& script, intptr_t token_pos,
+                       const char* format, va_list args);
+
+  // Support to report Javascript compatibility warnings. Note that a
+  // JavascriptCompatibilityError is thrown if --warning_as_error is specified.
+  // If a warning is issued by the various JSWarning calls, the warning is also
+  // emitted in the trace buffer of the current isolate.
+
+  // Report a Javascript compatibility warning at the call site given by
+  // ic_data, unless one has already been emitted at that location.
+  static void JSWarningFromIC(const ICData& ic_data, const char* msg);
+
+  // Report a Javascript compatibility warning at the current native call,
+  // unless one has already been emitted at that location.
+  static void JSWarningFromNative(bool is_static_native, const char* msg);
+
+  // Report a Javascript compatibility warning at the call site given by
+  // caller_frame.
+  static void JSWarningFromFrame(StackFrame* caller_frame, const char* msg);
+
+  // Prepend a source snippet to the message.
+  // A null script means no source and a negative token_pos means no position.
+  static RawString* PrependSnippet(Kind kind,
+                                   const Script& script,
+                                   intptr_t token_pos,
+                                   const String& message);
+
+ private:
+  // Emit a Javascript compatibility warning to the current trace buffer.
+  static void TraceJSWarning(const Script& script,
+                             intptr_t token_pos,
+                             const String& message);
+
+  DISALLOW_COPY_AND_ASSIGN(Report);
+};
+
+}  // namespace dart
+
+#endif  // VM_REPORT_H_
+
diff --git a/runtime/vm/report_test.cc b/runtime/vm/report_test.cc
new file mode 100644
index 0000000..ba66a9a
--- /dev/null
+++ b/runtime/vm/report_test.cc
@@ -0,0 +1,70 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "platform/assert.h"
+#include "vm/report.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+TEST_CASE(TraceJSWarning) {
+  Isolate* isolate = Isolate::Current();
+  TraceBuffer::Init(isolate, 3);
+  TraceBuffer* trace_buffer = isolate->trace_buffer();
+  const String& url = String::Handle(isolate, String::New("Plug"));
+  const String& source = String::Handle(isolate, String::New("240 100"));
+  const Script& script = Script::Handle(isolate,
+      Script::New(url, source, RawScript::kScriptTag));
+  script.Tokenize(String::Handle(String::New("")));
+  {
+    const intptr_t token_pos = 0;
+    const char* message = "High Voltage";
+    Report::MessageF(Report::kJSWarning, script, token_pos, "%s", message);
+    {
+      JSONStream js;
+      trace_buffer->PrintToJSONStream(&js);
+      EXPECT_SUBSTRING("{\"type\":\"TraceBuffer\",\"members\":["
+                       "{\"type\":\"TraceBufferEntry\",\"time\":",
+                       js.ToCString());
+      // Skip time.
+      EXPECT_SUBSTRING("\"message\":{\"type\":\"JSCompatibilityWarning\","
+                       "\"script\":{\"type\":\"@Script\",\"id\":"
+                       "\"scripts\\/Plug\",\"name\":\"Plug\",\"user_name\":"
+                       "\"Plug\",\"kind\":\"script\"},\"tokenPos\":0,"
+                       "\"message\":{\"type\":\"@String\"",
+                       js.ToCString());
+      // Skip private _OneByteString.
+      EXPECT_SUBSTRING("\"valueAsString\":\"\\\"High Voltage\\\"\"}}",
+                       js.ToCString());
+    }
+  }
+  {
+    const intptr_t token_pos = 1;
+    const char* message = "Low Voltage";
+    Report::MessageF(Report::kJSWarning, script, token_pos, "%s", message);
+  }
+  EXPECT_EQ(2, trace_buffer->Length());
+  EXPECT_SUBSTRING("{\"type\":\"JSCompatibilityWarning\",\"script\":{\"type\":"
+                   "\"@Script\",\"id\":\"scripts\\/Plug\",\"name\":\"Plug\","
+                   "\"user_name\":\"Plug\",\"kind\":\"script\"},\"tokenPos\":0,"
+                   "\"message\":{\"type\":\"@String\"",
+                   trace_buffer->At(0)->message);
+  // Skip private _OneByteString.
+  EXPECT_SUBSTRING("\"valueAsString\":\"\\\"High Voltage\\\"\"}}",
+                   trace_buffer->At(0)->message);
+
+  EXPECT_SUBSTRING("{\"type\":\"JSCompatibilityWarning\",\"script\":{\"type\":"
+                   "\"@Script\",\"id\":\"scripts\\/Plug\",\"name\":\"Plug\","
+                   "\"user_name\":\"Plug\",\"kind\":\"script\"},\"tokenPos\":1,"
+                   "\"message\":{\"type\":\"@String\"",
+                   trace_buffer->At(1)->message);
+  // Skip private _OneByteString.
+  EXPECT_SUBSTRING("\"valueAsString\":\"\\\"Low Voltage\\\"\"}}",
+                   trace_buffer->At(1)->message);
+
+  delete trace_buffer;
+}
+
+}  // namespace dart
+
diff --git a/runtime/vm/reusable_handles.h b/runtime/vm/reusable_handles.h
index 2f82687..c1b5301 100644
--- a/runtime/vm/reusable_handles.h
+++ b/runtime/vm/reusable_handles.h
@@ -91,6 +91,9 @@
   ReusableCodeHandleScope reused_code_handle(isolate);
 #define REUSABLE_ERROR_HANDLESCOPE(isolate)                                    \
   ReusableErrorHandleScope reused_error_handle(isolate);
+#define REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(isolate)                       \
+  ReusableExceptionHandlersHandleScope                                         \
+      reused_exception_handlers_handle(isolate);
 #define REUSABLE_FIELD_HANDLESCOPE(isolate)                                    \
   ReusableFieldHandleScope reused_field_handle(isolate);
 #define REUSABLE_FUNCTION_HANDLESCOPE(isolate)                                 \
@@ -104,6 +107,8 @@
   ReusableLibraryHandleScope reused_library_handle(isolate);
 #define REUSABLE_OBJECT_HANDLESCOPE(isolate)                                   \
   ReusableObjectHandleScope reused_object_handle(isolate);
+#define REUSABLE_PC_DESCRIPTORS_HANDLESCOPE(isolate)                           \
+  ReusablePcDescriptorsHandleScope reused_pc_descriptors_handle(isolate);
 #define REUSABLE_STRING_HANDLESCOPE(isolate)                                   \
   ReusableStringHandleScope reused_string_handle(isolate);
 #define REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(isolate)                           \
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index 0112cc3..23e00c6 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -40,10 +40,18 @@
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
     ExternalLabel label(entry);
-    // Cache the stack pointer in a callee-saved register.
+    // Since we are entering C++ code, we must restore the C stack pointer from
+    // the stack limit to an aligned value nearer to the top of the stack.
+    // We cache the Dart stack pointer and the stack limit in callee-saved
+    // registers, then align and call, restoring CSP and SP on return from the
+    // call.
+    __ mov(R25, CSP);
     __ mov(R26, SP);
+    __ ReserveAlignedFrameSpace(0);
+    __ mov(CSP, SP);
     __ BranchLink(&label, kNoPP);
     __ mov(SP, R26);
+    __ mov(CSP, R25);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
diff --git a/runtime/vm/runtime_entry_x64.cc b/runtime/vm/runtime_entry_x64.cc
index aa703b06..ccd0d6f 100644
--- a/runtime/vm/runtime_entry_x64.cc
+++ b/runtime/vm/runtime_entry_x64.cc
@@ -24,7 +24,7 @@
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
     ExternalLabel label(GetEntryPoint());
-    __ call(&label);
+    __ CallCFunction(&label);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
index c207415..b6ccaee 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -19,6 +19,34 @@
 DEFINE_FLAG(bool, print_tokens, false, "Print scanned tokens.");
 
 
+// Quick access to the locally defined isolate() method.
+#define I (isolate())
+
+
+class ScanContext : public ZoneAllocated {
+ public:
+  explicit ScanContext(Scanner* scanner)
+      :  next_(scanner->saved_context_),
+         string_delimiter_(scanner->string_delimiter_),
+         string_is_multiline_(scanner->string_is_multiline_),
+         brace_level_(scanner->brace_level_) {}
+
+  void CopyTo(Scanner* scanner) {
+    scanner->string_delimiter_ = string_delimiter_;
+    scanner->string_is_multiline_ = string_is_multiline_;
+    scanner->brace_level_ = brace_level_;
+  }
+
+  ScanContext* next() const { return next_; }
+
+ private:
+  ScanContext* next_;
+  const char string_delimiter_;
+  const bool string_is_multiline_;
+  const int brace_level_;
+};
+
+
 Scanner::KeywordTable Scanner::keywords_[Token::kNumKeywords];
 int Scanner::keywords_char_offset_[Scanner::kNumLowercaseChars];
 
@@ -40,11 +68,7 @@
   c0_ = '\0';
   newline_seen_ = false;
   prev_token_line_ = 1;
-  while (saved_context_ != NULL) {
-    ScanContext* ctx = saved_context_;
-    saved_context_ = ctx->next;
-    delete ctx;
-  }
+  saved_context_ = NULL;
   string_delimiter_ = '\0';
   string_is_multiline_ = false;
   brace_level_ = 0;
@@ -58,22 +82,19 @@
     : source_(src),
       source_length_(src.Length()),
       saved_context_(NULL),
-      private_key_(String::ZoneHandle(private_key.raw())) {
+      private_key_(String::ZoneHandle(private_key.raw())),
+      char_at_func_(src.CharAtFunc()),
+      isolate_(Isolate::Current()) {
   Reset();
 }
 
-Scanner::~Scanner() {
-  while (saved_context_ != NULL) {
-    ScanContext* ctx = saved_context_;
-    saved_context_ = ctx->next;
-    delete ctx;
-  }
-}
+
+Scanner::~Scanner() {}
 
 
 void Scanner::ErrorMsg(const char* msg) {
   current_token_.kind = Token::kERROR;
-  current_token_.literal = &String::ZoneHandle(Symbols::New(msg));
+  current_token_.literal = &String::ZoneHandle(I, Symbols::New(msg));
   current_token_.position = c0_pos_;
   token_start_ = lookahead_pos_;
   current_token_.offset = lookahead_pos_;
@@ -81,12 +102,8 @@
 
 
 void Scanner::PushContext() {
-  ScanContext* ctx = new ScanContext;
-  ctx->next = saved_context_;
+  ScanContext* ctx = new(I) ScanContext(this);
   saved_context_ = ctx;
-  ctx->string_delimiter = string_delimiter_;
-  ctx->string_is_multiline = string_is_multiline_;
-  ctx->brace_level = brace_level_;
   string_delimiter_ = '\0';
   string_is_multiline_ = false;
   brace_level_ = 1;  // Account for the opening ${ token.
@@ -98,12 +115,9 @@
   ASSERT(brace_level_ == 0);
   ASSERT(string_delimiter_ == '\0');
   ScanContext* ctx = saved_context_;
-  saved_context_ = ctx->next;
-  string_delimiter_ = ctx->string_delimiter;
+  ctx->CopyTo(this);
+  saved_context_ = ctx->next();
   ASSERT(string_delimiter_ != '\0');
-  string_is_multiline_ = ctx->string_is_multiline;
-  brace_level_ = ctx->brace_level;
-  delete ctx;
 }
 
 
@@ -154,11 +168,11 @@
   if (!str.IsOneByteString()) {
     return false;
   }
-  if (str.Length() == 0 || !IsIdentStartChar(str.CharAt(0))) {
+  if (str.Length() == 0 || !IsIdentStartChar(CallCharAt()(str, 0))) {
     return false;
   }
   for (int i =  1; i < str.Length(); i++) {
-    if (!IsIdentChar(str.CharAt(i))) {
+    if (!IsIdentChar(CallCharAt()(str, i))) {
       return false;
     }
   }
@@ -202,7 +216,7 @@
       newline_seen_ = true;
       c0_pos_.line++;
       c0_pos_.column = 0;
-      if (source_.CharAt(lookahead_pos_) == '\r') {
+      if (CallCharAt()(source_, lookahead_pos_) == '\r') {
         // Replace a sequence of '\r' '\n' with a single '\n'.
         if (LookaheadChar(1) == '\n') {
           lookahead_pos_++;
@@ -227,7 +241,7 @@
   ASSERT(how_many >= 0);
   int32_t lookahead_char = '\0';
   if (lookahead_pos_ + how_many < source_length_) {
-    lookahead_char = source_.CharAt(lookahead_pos_ + how_many);
+    lookahead_char = CallCharAt()(source_, lookahead_pos_ + how_many);
   }
   return lookahead_char;
 }
@@ -282,7 +296,7 @@
   ASSERT(allow_dollar || (c0_ != '$'));
   int ident_length = 0;
   int ident_pos = lookahead_pos_;
-  int32_t ident_char0 = source_.CharAt(ident_pos);
+  int32_t ident_char0 = CallCharAt()(source_, ident_pos);
   while (IsIdentChar(c0_) && (allow_dollar || (c0_ != '$'))) {
     ReadChar();
     ident_length++;
@@ -292,13 +306,14 @@
   // Note, can't use strcmp since token_chars is not null-terminated.
   if (('a' <= ident_char0) && (ident_char0 <= 'z')) {
     int i = keywords_char_offset_[ident_char0 - 'a'];
-    while (i < Token::kNumKeywords &&
-           keywords_[i].keyword_chars[0] <= ident_char0) {
+    while ((i < Token::kNumKeywords) &&
+           (keywords_[i].keyword_chars[0] <= ident_char0)) {
       if (keywords_[i].keyword_len == ident_length) {
         const char* keyword = keywords_[i].keyword_chars;
         int char_pos = 1;
         while ((char_pos < ident_length) &&
-               (keyword[char_pos] == source_.CharAt(ident_pos + char_pos))) {
+               (keyword[char_pos] ==
+                   CallCharAt()(source_, ident_pos + char_pos))) {
           char_pos++;
         }
         if (char_pos == ident_length) {
@@ -314,7 +329,7 @@
   // We did not read a keyword.
   current_token_.kind = Token::kIDENT;
   String& literal =
-      String::ZoneHandle(Symbols::New(source_, ident_pos, ident_length));
+      String::ZoneHandle(I, Symbols::New(source_, ident_pos, ident_length));
   if (ident_char0 == Library::kPrivateIdentifierStart) {
     // Private identifiers are mangled on a per library basis.
     literal = String::Concat(literal, private_key_);
@@ -372,7 +387,7 @@
   }
   if (current_token_.kind != Token::kILLEGAL) {
     intptr_t len = lookahead_pos_ - token_start_;
-    String& str = String::ZoneHandle(
+    String& str = String::ZoneHandle(I,
         String::SubString(source_, token_start_, len, Heap::kOld));
     str = Symbols::New(str);
     current_token_.literal = &str;
@@ -527,7 +542,7 @@
       // Scanned a string piece.
       ASSERT(string_chars.data() != NULL);
       // Strings are canonicalized: Allocate a symbol.
-      current_token_.literal = &String::ZoneHandle(
+      current_token_.literal = &String::ZoneHandle(I,
           Symbols::FromUTF32(string_chars.data(), string_chars.length()));
       // Preserve error tokens.
       if (current_token_.kind != Token::kERROR) {
@@ -550,7 +565,7 @@
           Recognize(Token::kSTRING);
           ASSERT(string_chars.data() != NULL);
           // Strings are canonicalized: Allocate a symbol.
-          current_token_.literal = &String::ZoneHandle(
+          current_token_.literal = &String::ZoneHandle(I,
               Symbols::FromUTF32(string_chars.data(), string_chars.length()));
         }
         EndStringLiteral();
@@ -915,7 +930,7 @@
 
 
 const Scanner::GrowableTokenStream& Scanner::GetStream() {
-  GrowableTokenStream* ts = new GrowableTokenStream(128);
+  GrowableTokenStream* ts = new(I) GrowableTokenStream(128);
   ScanAll(ts);
   if (FLAG_print_tokens) {
     Scanner::PrintTokens(*ts);
diff --git a/runtime/vm/scanner.h b/runtime/vm/scanner.h
index 92c2919..5dde147 100644
--- a/runtime/vm/scanner.h
+++ b/runtime/vm/scanner.h
@@ -18,6 +18,7 @@
 class Array;
 class Library;
 class RawString;
+class ScanContext;
 class String;
 
 // A call to Scan() scans the source one token at at time.
@@ -25,6 +26,8 @@
 // GetStream() scans the entire source text and returns a stream of tokens.
 class Scanner : ValueObject {
  public:
+  typedef int32_t (*CharAtFunc)(const String& str, intptr_t index);
+
   // SourcePosition describes a text location in user friendly
   // terms of line number and column.
   struct SourcePosition {
@@ -75,7 +78,7 @@
   static void InitOnce();
 
   // Return true if str is an identifier.
-  static bool IsIdent(const String& str);
+  bool IsIdent(const String& str);
 
   // Does the token stream contain a valid literal. This is used to implement
   // the Dart methods int.parse and double.parse.
@@ -85,14 +88,9 @@
                              const String** value);
 
  private:
-  static const int kNumLowercaseChars = 26;
+  friend class ScanContext;
 
-  struct ScanContext {
-    ScanContext* next;
-    char string_delimiter;
-    bool string_is_multiline;
-    int  brace_level;
-  };
+  static const int kNumLowercaseChars = 26;
 
   struct KeywordTable {
     Token::Kind kind;
@@ -182,6 +180,10 @@
 
   void ScanScriptTag();
 
+  CharAtFunc CallCharAt() const { return char_at_func_; }
+
+  Isolate* isolate() const { return isolate_; }
+
   static void PrintTokens(const GrowableTokenStream& ts);
 
   TokenDescriptor current_token_;  // Current token.
@@ -207,6 +209,10 @@
 
   SourcePosition c0_pos_;      // Source position of lookahead character c0_.
 
+  const CharAtFunc char_at_func_;
+
+  Isolate* isolate_;
+
   static KeywordTable keywords_[Token::kNumKeywords];
   static int keywords_char_offset_[kNumLowercaseChars];
 };
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index 37f5cbe..e113cd9 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -14,6 +14,7 @@
 #include "vm/object.h"
 #include "vm/stack_frame.h"
 #include "vm/store_buffer.h"
+#include "vm/thread.h"
 #include "vm/verifier.h"
 #include "vm/visitor.h"
 #include "vm/weak_table.h"
@@ -21,8 +22,12 @@
 
 namespace dart {
 
-  DEFINE_FLAG(int, early_tenuring_threshold, 66, "Skip TO space when promoting"
-                                                 " above this percentage.");
+DEFINE_FLAG(int, early_tenuring_threshold, 66,
+            "When more than this percentage of promotion candidates survive, "
+            "promote all survivors of next scavenge.");
+DEFINE_FLAG(int, new_gen_garbage_threshold, 90,
+            "Grow new gen when less than this percentage is garbage.");
+DEFINE_FLAG(int, new_gen_growth_factor, 4, "Grow new gen by this factor.");
 
 // Scavenger uses RawObject::kMarkBit to distinguish forwaded and non-forwarded
 // objects. The kMarkBit does not intersect with the target address because of
@@ -285,7 +290,8 @@
 // StoreBuffers.
 class VerifyStoreBufferPointerVisitor : public ObjectPointerVisitor {
  public:
-  VerifyStoreBufferPointerVisitor(Isolate* isolate, MemoryRegion* to)
+  VerifyStoreBufferPointerVisitor(Isolate* isolate,
+                                  const SemiSpace* to)
       : ObjectPointerVisitor(isolate), to_(to) {}
 
   void VisitPointers(RawObject** first, RawObject** last) {
@@ -298,16 +304,94 @@
   }
 
  private:
-  MemoryRegion* to_;
+  const SemiSpace* to_;
 
   DISALLOW_COPY_AND_ASSIGN(VerifyStoreBufferPointerVisitor);
 };
 
 
+SemiSpace::SemiSpace(VirtualMemory* reserved)
+    : reserved_(reserved), region_(NULL, 0) {
+  if (reserved != NULL) {
+    region_ = MemoryRegion(reserved_->address(), reserved_->size());
+  }
+}
+
+
+SemiSpace::~SemiSpace() {
+  if (reserved_ != NULL) {
+#if defined(DEBUG)
+    memset(reserved_->address(), 0xf3, size_in_words() << kWordSizeLog2);
+#endif  // defined(DEBUG)
+    delete reserved_;
+  }
+}
+
+
+Mutex* SemiSpace::mutex_ = NULL;
+SemiSpace* SemiSpace::cache_ = NULL;
+
+
+void SemiSpace::InitOnce() {
+  ASSERT(mutex_ == NULL);
+  mutex_ = new Mutex();
+  ASSERT(mutex_ != NULL);
+}
+
+
+SemiSpace* SemiSpace::New(intptr_t size_in_words) {
+  {
+    MutexLocker locker(mutex_);
+    // TODO(koda): Cache one entry per size.
+    if (cache_ != NULL && cache_->size_in_words() == size_in_words) {
+      SemiSpace* result = cache_;
+      cache_ = NULL;
+      return result;
+    }
+  }
+  if (size_in_words == 0) {
+    return new SemiSpace(NULL);
+  } else {
+    intptr_t size_in_bytes = size_in_words << kWordSizeLog2;
+    VirtualMemory* reserved = VirtualMemory::Reserve(size_in_bytes);
+    if ((reserved == NULL) || !reserved->Commit(VirtualMemory::kReadWrite)) {
+      // TODO(koda): If cache_ is not empty, we could try to delete it.
+      delete reserved;
+      return NULL;
+    }
+#if defined(DEBUG)
+    memset(reserved->address(), 0xf3, size_in_bytes);
+#endif  // defined(DEBUG)
+    return new SemiSpace(reserved);
+  }
+}
+
+
+void SemiSpace::Delete() {
+  SemiSpace* old_cache = NULL;
+  {
+    MutexLocker locker(mutex_);
+    old_cache = cache_;
+    cache_ = this;
+  }
+  delete old_cache;
+}
+
+
+void SemiSpace::WriteProtect(bool read_only) {
+  if (reserved_ != NULL) {
+    bool success = reserved_->Protect(
+        read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite);
+    ASSERT(success);
+  }
+}
+
+
 Scavenger::Scavenger(Heap* heap,
-                     intptr_t max_capacity_in_words,
+                     intptr_t max_semi_capacity_in_words,
                      uword object_alignment)
     : heap_(heap),
+      max_semi_capacity_in_words_(max_semi_capacity_in_words),
       object_alignment_(object_alignment),
       scavenging_(false),
       gc_time_micros_(0),
@@ -317,31 +401,14 @@
   // going to use for forwarding pointers.
   ASSERT(Object::tags_offset() == 0);
 
-  if (max_capacity_in_words == 0) {
-    space_ = NULL;
-    to_ = new MemoryRegion(NULL, 0);
-    from_ = new MemoryRegion(NULL, 0);
-  } else {
-    // Allocate the virtual memory for this scavenge heap.
-    space_ = VirtualMemory::Reserve(max_capacity_in_words << kWordSizeLog2);
-    if (space_ == NULL) {
-      FATAL("Out of memory.\n");
-    }
-
-    // Allocate the entire space at the beginning.
-    space_->Commit(false);
-
-    // Setup the semi spaces.
-    uword semi_space_size = space_->size() / 2;
-    ASSERT((semi_space_size & (VirtualMemory::PageSize() - 1)) == 0);
-    to_ = new MemoryRegion(space_->address(), semi_space_size);
-    uword middle = space_->start() + semi_space_size;
-    from_ = new MemoryRegion(reinterpret_cast<void*>(middle), semi_space_size);
+  // Set initial size resulting in a total of three different levels.
+  const intptr_t initial_semi_capacity_in_words = max_semi_capacity_in_words /
+      (FLAG_new_gen_growth_factor * FLAG_new_gen_growth_factor);
+  to_ = SemiSpace::New(initial_semi_capacity_in_words);
+  if (to_ == NULL) {
+    FATAL("Out of memory.\n");
   }
-
-  // Make sure that the two semi-spaces are aligned properly.
-  ASSERT(Utils::IsAligned(to_->start(), kObjectAlignment));
-  ASSERT(Utils::IsAligned(from_->start(), kObjectAlignment));
+  from_ = NULL;
 
   // Setup local fields.
   top_ = FirstObjectStart();
@@ -349,18 +416,27 @@
   end_ = to_->end();
 
   survivor_end_ = FirstObjectStart();
-
-#if defined(DEBUG)
-  memset(to_->pointer(), 0xf3, to_->size());
-  memset(from_->pointer(), 0xf3, from_->size());
-#endif  // defined(DEBUG)
 }
 
 
 Scavenger::~Scavenger() {
-  delete to_;
-  delete from_;
-  delete space_;
+  ASSERT(!scavenging_);
+  ASSERT(from_ == NULL);
+  to_->Delete();
+}
+
+
+intptr_t Scavenger::NewSizeInWords(intptr_t old_size_in_words) const {
+  if (stats_history_.Size() == 0) {
+    return old_size_in_words;
+  }
+  double garbage = stats_history_.Get(0).GarbageFraction();
+  if (garbage < (FLAG_new_gen_garbage_threshold / 100.0)) {
+    return Utils::Minimum(max_semi_capacity_in_words_,
+                          old_size_in_words * FLAG_new_gen_growth_factor);
+  } else {
+    return old_size_in_words;
+  }
 }
 
 
@@ -370,9 +446,13 @@
   }
   // Flip the two semi-spaces so that to_ is always the space for allocating
   // objects.
-  MemoryRegion* temp = from_;
   from_ = to_;
-  to_ = temp;
+  to_ = SemiSpace::New(NewSizeInWords(from_->size_in_words()));
+  if (to_ == NULL) {
+    // TODO(koda): We could try to recover (collect old space, wait for another
+    // isolate to finish scavenge, etc.).
+    FATAL("Out of memory.\n");
+  }
   top_ = FirstObjectStart();
   resolved_top_ = top_;
   end_ = to_->end();
@@ -384,24 +464,27 @@
                          bool invoke_api_callbacks) {
   // All objects in the to space have been copied from the from space at this
   // moment.
-  int promotion_ratio = static_cast<int>(
-      (static_cast<double>(visitor->bytes_promoted()) /
-       static_cast<double>(to_->size())) * 100.0);
-  if (promotion_ratio < FLAG_early_tenuring_threshold) {
+  double avg_frac = stats_history_.Get(0).PromoCandidatesSuccessFraction();
+  if (stats_history_.Size() >= 2) {
+    // Previous scavenge is only given half as much weight.
+    avg_frac += 0.5 * stats_history_.Get(1).PromoCandidatesSuccessFraction();
+    avg_frac /= 1.0 + 0.5;  // Normalize.
+  }
+  if (avg_frac < (FLAG_early_tenuring_threshold / 100.0)) {
     // Remember the limit to which objects have been copied.
     survivor_end_ = top_;
   } else {
     // Move survivor end to the end of the to_ space, making all surviving
-    // objects candidates for promotion.
+    // objects candidates for promotion next time.
     survivor_end_ = end_;
   }
 
 #if defined(DEBUG)
   VerifyStoreBufferPointerVisitor verify_store_buffer_visitor(isolate, to_);
   heap_->IterateOldPointers(&verify_store_buffer_visitor);
-
-  memset(from_->pointer(), 0xf3, from_->size());
 #endif  // defined(DEBUG)
+  from_->Delete();
+  from_ = NULL;
   if (invoke_api_callbacks && (isolate->gc_epilogue_callback() != NULL)) {
     (isolate->gc_epilogue_callback())();
   }
@@ -708,6 +791,9 @@
 
   // Setup the visitor and run a scavenge.
   ScavengerVisitor visitor(isolate, this);
+  SpaceUsage usage_before = GetCurrentUsage();
+  intptr_t promo_candidate_words =
+      (survivor_end_ - FirstObjectStart()) / kWordSize;
   Prologue(isolate, invoke_api_callbacks);
   const bool prologue_weak_are_strong = !invoke_api_callbacks;
   IterateRoots(isolate, &visitor, prologue_weak_are_strong);
@@ -724,6 +810,10 @@
   int64_t end = OS::GetCurrentTimeMicros();
   heap_->RecordTime(kProcessToSpace, middle - start);
   heap_->RecordTime(kIterateWeaks, end - middle);
+  stats_history_.Add(ScavengeStats(start, end,
+                                   usage_before, GetCurrentUsage(),
+                                   promo_candidate_words,
+                                   visitor.bytes_promoted() >> kWordSizeLog2));
   Epilogue(isolate, &visitor, invoke_api_callbacks);
 
   if (FLAG_verify_after_gc) {
@@ -739,10 +829,9 @@
 
 
 void Scavenger::WriteProtect(bool read_only) {
-  if (space_ != NULL) {
-    space_->Protect(
-        read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite);
-  }
+  ASSERT(!scavenging_);
+  ASSERT(from_ == NULL);
+  to_->WriteProtect(read_only);
 }
 
 
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h
index 4c9fecc..1b74aa7 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/scavenger.h
@@ -11,6 +11,7 @@
 #include "vm/flags.h"
 #include "vm/globals.h"
 #include "vm/raw_object.h"
+#include "vm/ring_buffer.h"
 #include "vm/spaces.h"
 #include "vm/virtual_memory.h"
 #include "vm/visitor.h"
@@ -25,9 +26,94 @@
 
 DECLARE_FLAG(bool, gc_at_alloc);
 
+
+// Wrapper around VirtualMemory that adds caching and handles the empty case.
+class SemiSpace {
+ public:
+  static void InitOnce();
+
+  // Get a space of the given size. Returns NULL on out of memory. If size is 0,
+  // returns an empty space: pointer(), start() and end() all return NULL.
+  static SemiSpace* New(intptr_t size_in_words);
+
+  // Hand back an unused space.
+  void Delete();
+
+  void* pointer() const { return region_.pointer(); }
+  uword start() const { return region_.start(); }
+  uword end() const { return region_.end(); }
+  intptr_t size_in_words() const {
+    return static_cast<intptr_t>(region_.size()) >> kWordSizeLog2;
+  }
+  bool Contains(uword address) const { return region_.Contains(address); }
+
+  // Set write protection mode for this space. The space must not be protected
+  // when Delete is called.
+  // TODO(koda): Remember protection mode in VirtualMemory and assert this.
+  void WriteProtect(bool read_only);
+
+ private:
+  explicit SemiSpace(VirtualMemory* reserved);
+  ~SemiSpace();
+
+  VirtualMemory* reserved_;  // NULL for an emtpy space.
+  MemoryRegion region_;
+
+  static SemiSpace* cache_;
+  static Mutex* mutex_;
+};
+
+
+// Statistics for a particular scavenge.
+class ScavengeStats {
+ public:
+  ScavengeStats() {}
+  ScavengeStats(int64_t start_micros,
+                int64_t end_micros,
+                SpaceUsage before,
+                SpaceUsage after,
+                intptr_t promo_candidates_in_words,
+                intptr_t promoted_in_words) :
+      start_micros_(start_micros),
+      end_micros_(end_micros),
+      before_(before),
+      after_(after),
+      promo_candidates_in_words_(promo_candidates_in_words),
+      promoted_in_words_(promoted_in_words) {}
+
+  // Of all data before scavenge, what fraction was found to be garbage?
+  double GarbageFraction() const {
+    intptr_t survived = after_.used_in_words + promoted_in_words_;
+    return 1.0 - (survived / static_cast<double>(before_.used_in_words));
+  }
+
+  // Fraction of promotion candidates that survived and was thereby promoted.
+  // Returns zero if there were no promotion candidates.
+  double PromoCandidatesSuccessFraction() const {
+    return promo_candidates_in_words_ > 0 ?
+        promoted_in_words_ / static_cast<double>(promo_candidates_in_words_) :
+        0.0;
+  }
+
+  int64_t DurationMicros() const {
+    return end_micros_ - start_micros_;
+  }
+
+ private:
+  int64_t start_micros_;
+  int64_t end_micros_;
+  SpaceUsage before_;
+  SpaceUsage after_;
+  intptr_t promo_candidates_in_words_;
+  intptr_t promoted_in_words_;
+};
+
+
 class Scavenger {
  public:
-  Scavenger(Heap* heap, intptr_t max_capacity_in_words, uword object_alignment);
+  Scavenger(Heap* heap,
+            intptr_t max_semi_capacity_in_words,
+            uword object_alignment);
   ~Scavenger();
 
   // Check whether this Scavenger contains this address.
@@ -38,7 +124,7 @@
     // No reasonable algorithm should be checking for objects in from space. At
     // least unless it is debugging code. This might need to be relaxed later,
     // but currently it helps prevent dumb bugs.
-    ASSERT(!from_->Contains(addr));
+    ASSERT(from_ == NULL || !from_->Contains(addr));
     return to_->Contains(addr);
   }
 
@@ -79,7 +165,7 @@
     return (top_ - FirstObjectStart()) >> kWordSizeLog2;
   }
   intptr_t CapacityInWords() const {
-    return to_->size() >> kWordSizeLog2;
+    return to_->size_in_words();
   }
   intptr_t ExternalInWords() const {
     return external_size_ >> kWordSizeLog2;
@@ -183,9 +269,10 @@
 
   void ProcessWeakTables();
 
-  VirtualMemory* space_;
-  MemoryRegion* to_;
-  MemoryRegion* from_;
+  intptr_t NewSizeInWords(intptr_t old_size_in_words) const;
+
+  SemiSpace* from_;
+  SemiSpace* to_;
 
   Heap* heap_;
 
@@ -201,6 +288,8 @@
   // Objects below this address have survived a scavenge.
   uword survivor_end_;
 
+  intptr_t max_semi_capacity_in_words_;
+
   // All object are aligned to this value.
   uword object_alignment_;
 
@@ -209,6 +298,8 @@
 
   int64_t gc_time_micros_;
   intptr_t collections_;
+  static const int kStatsHistoryCapacity = 2;
+  RingBuffer<ScavengeStats, kStatsHistoryCapacity> stats_history_;
 
   // The total size of external data associated with objects in this scavenger.
   intptr_t external_size_;
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index cd88fc2..9a26f02 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -24,6 +24,7 @@
 #include "vm/object_store.h"
 #include "vm/port.h"
 #include "vm/profiler.h"
+#include "vm/reusable_handles.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
 #include "vm/version.h"
@@ -1137,6 +1138,80 @@
 }
 
 
+class GetInstancesVisitor : public ObjectGraph::Visitor {
+ public:
+  GetInstancesVisitor(const Class& cls, const Array& storage)
+      : cls_(cls), storage_(storage), count_(0) {}
+
+  virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
+    RawObject* raw_obj = it->Get();
+    if (raw_obj->IsFreeListElement()) {
+      return kProceed;
+    }
+    Isolate* isolate = Isolate::Current();
+    REUSABLE_OBJECT_HANDLESCOPE(isolate);
+    Object& obj = isolate->ObjectHandle();
+    obj = raw_obj;
+    if (obj.GetClassId() == cls_.id()) {
+      if (!storage_.IsNull() && count_ < storage_.Length()) {
+        storage_.SetAt(count_, obj);
+      }
+      ++count_;
+    }
+    return kProceed;
+  }
+
+  intptr_t count() const { return count_; }
+
+ private:
+  const Class& cls_;
+  const Array& storage_;
+  intptr_t count_;
+};
+
+
+static bool HandleClassesInstances(Isolate* isolate, const Class& cls,
+                                   JSONStream* js) {
+  if (js->num_arguments() != 3) {
+    PrintError(js, "Command too long");
+    return true;
+  }
+  intptr_t limit;
+  if (!GetIntegerId(js->LookupOption("limit"), &limit)) {
+    PrintError(js, "instances expects a 'limit' option\n",
+               js->num_arguments());
+    return true;
+  }
+  Array& storage = Array::Handle(Array::New(limit));
+  GetInstancesVisitor visitor(cls, storage);
+  ObjectGraph graph(isolate);
+  graph.IterateObjects(&visitor);
+  intptr_t count = visitor.count();
+  if (count < limit) {
+    // Truncate the list using utility method for GrowableObjectArray.
+    GrowableObjectArray& wrapper = GrowableObjectArray::Handle(
+        GrowableObjectArray::New(storage));
+    wrapper.SetLength(count);
+    storage = Array::MakeArray(wrapper);
+  }
+  JSONObject jsobj(js);
+  jsobj.AddProperty("type", "InstanceSet");
+  jsobj.AddProperty("id", "instance_set");
+  jsobj.AddProperty("totalCount", count);
+  jsobj.AddProperty("sampleCount", storage.Length());
+  jsobj.AddProperty("sample", storage);
+  return true;
+}
+
+
+static bool HandleClassesCoverage(Isolate* isolate,
+                                  const Class& cls,
+                                  JSONStream* stream) {
+  CodeCoverage::PrintJSONForClass(cls, stream);
+  return true;
+}
+
+
 static bool HandleClasses(Isolate* isolate, JSONStream* js) {
   if (js->num_arguments() == 1) {
     ClassTable* table = isolate->class_table();
@@ -1173,10 +1248,14 @@
       return HandleClassesImplicitClosures(isolate, cls, js);
     } else if (strcmp(second, "dispatchers") == 0) {
       return HandleClassesDispatchers(isolate, cls, js);
-    } else if (!strcmp(second, "types")) {
+    } else if (strcmp(second, "types") == 0) {
       return HandleClassesTypes(isolate, cls, js);
-    } else if (!strcmp(second, "retained")) {
+    } else if (strcmp(second, "retained") == 0) {
       return HandleClassesRetained(isolate, cls, js);
+    } else if (strcmp(second, "instances") == 0) {
+      return HandleClassesInstances(isolate, cls, js);
+    } else if (strcmp(second, "coverage") == 0) {
+      return HandleClassesCoverage(isolate, cls, js);
     } else {
       PrintError(js, "Invalid sub collection %s", second);
       return true;
@@ -1208,6 +1287,14 @@
 }
 
 
+static bool HandleLibrariesCoverage(Isolate* isolate,
+                                    const Library& lib,
+                                    JSONStream* js) {
+  CodeCoverage::PrintJSONForLibrary(lib, Script::Handle(), js);
+  return true;
+}
+
+
 static bool HandleLibraries(Isolate* isolate, JSONStream* js) {
   // TODO(johnmccutchan): Support fields and functions on libraries.
   REQUIRE_COLLECTION_ID("libraries");
@@ -1227,6 +1314,8 @@
     const char* second = js->GetArgument(2);
     if (strcmp(second, "eval") == 0) {
       return HandleLibrariesEval(isolate, lib, js);
+    } else if (strcmp(second, "coverage") == 0) {
+      return HandleLibrariesCoverage(isolate, lib, js);
     } else {
       PrintError(js, "Invalid sub collection %s", second);
       return true;
@@ -1255,7 +1344,7 @@
     arg += 4;
     int64_t value = 0;
     if (!OS::StringToInt64(arg, &value) ||
-        !Smi::IsValid64(value)) {
+        !Smi::IsValid(value)) {
       *error = true;
       return Object::null();
     }
@@ -1398,36 +1487,16 @@
 }
 
 
-static bool HandleScriptsFetch(Isolate* isolate, JSONStream* js) {
-  const GrowableObjectArray& libs =
-    GrowableObjectArray::Handle(isolate->object_store()->libraries());
-  int num_libs = libs.Length();
-  Library &lib = Library::Handle();
-  Script& script = Script::Handle();
-  String& url = String::Handle();
-  const String& id = String::Handle(String::New(js->GetArgument(1)));
-  ASSERT(!id.IsNull());
-  // The id is the url of the script % encoded, decode it.
-  String& requested_url = String::Handle(String::DecodeURI(id));
-  for (intptr_t i = 0; i < num_libs; i++) {
-    lib ^= libs.At(i);
-    ASSERT(!lib.IsNull());
-    ASSERT(Smi::IsValid(lib.index()));
-    const Array& loaded_scripts = Array::Handle(lib.LoadedScripts());
-    ASSERT(!loaded_scripts.IsNull());
-    intptr_t num_scripts = loaded_scripts.Length();
-    for (intptr_t i = 0; i < num_scripts; i++) {
-      script ^= loaded_scripts.At(i);
-      ASSERT(!script.IsNull());
-      url ^= script.url();
-      if (url.Equals(requested_url)) {
-        script.PrintJSON(js, false);
-        return true;
-      }
-    }
-  }
-  PrintErrorWithKind(js, "NotFoundError", "Cannot find script %s",
-                     requested_url.ToCString());
+static bool HandleScriptsFetch(
+    Isolate* isolate, const Script& script, JSONStream* js) {
+  script.PrintJSON(js, false);
+  return true;
+}
+
+
+static bool HandleScriptsCoverage(
+    Isolate* isolate, const Script& script, JSONStream* js) {
+  CodeCoverage::PrintJSONForScript(script, js);
   return true;
 }
 
@@ -1436,9 +1505,29 @@
   if (js->num_arguments() == 1) {
     // Enumerate all scripts.
     return HandleScriptsEnumerate(isolate, js);
-  } else if (js->num_arguments() == 2) {
-    // Fetch specific script.
-    return HandleScriptsFetch(isolate, js);
+  }
+  // Subcommands of scripts require a valid script id.
+  const String& id = String::Handle(String::New(js->GetArgument(1)));
+  ASSERT(!id.IsNull());
+  // The id is the url of the script % encoded, decode it.
+  String& requested_url = String::Handle(String::DecodeURI(id));
+  Script& script = Script::Handle();
+  script = Script::FindByUrl(requested_url);
+  if (script.IsNull()) {
+    PrintErrorWithKind(js, "NotFoundError", "Cannot find script %s",
+                       requested_url.ToCString());
+    return true;
+  }
+  if (js->num_arguments() == 2) {
+    // If no subcommand is given, just fetch the script.
+    return HandleScriptsFetch(isolate, script, js);
+  } else if (js->num_arguments() == 3) {
+    const char* arg = js->GetArgument(2);
+    if (strcmp(arg, "coverage") == 0) {
+      return HandleScriptsCoverage(isolate, script, js);
+    }
+    PrintError(js, "Unrecognized subcommand '%s'", arg);
+    return true;
   } else {
     PrintError(js, "Command too long");
     return true;
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 030d2e1..51a19aa 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -833,6 +833,31 @@
   ExpectSubstringF(handler.msg(),
                    "\"id\":\"objects\\/int-%" Pd "\"",
                    b0.raw()->Size() + b1.raw()->Size());
+  // ... and list the instances of class B.
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'instances'],"
+                      "['limit'], ['3']]", class_b.id());
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(handler.msg(), "\"type\":\"InstanceSet\"");
+  ExpectSubstringF(handler.msg(), "\"totalCount\":2");
+  ExpectSubstringF(handler.msg(), "\"sampleCount\":2");
+  // TODO(koda): Actually parse the response.
+  static const intptr_t kInstanceListId = 0;
+  ExpectSubstringF(handler.msg(), "\"id\":\"objects\\/%" Pd "\",\"length\":2",
+                   kInstanceListId);
+  Array& list = Array::Handle();
+  list ^= isolate->object_id_ring()->GetObjectForId(kInstanceListId);
+  EXPECT_EQ(2, list.Length());
+  // The list should contain {b0, b1}.
+  EXPECT((list.At(0) == b0.raw() && list.At(1) == b1.raw()) ||
+         (list.At(0) == b1.raw() && list.At(1) == b0.raw()));
+  // ... and if limit is 1, we one get one of them.
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'instances'],"
+                      "['limit'], ['1']]", class_b.id());
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(handler.msg(), "\"totalCount\":2");
+  ExpectSubstringF(handler.msg(), "\"sampleCount\":1");
 }
 
 
@@ -1211,6 +1236,161 @@
       "[5,1,6,1]}", handler.msg());
 }
 
+
+TEST_CASE(Service_ScriptsCoverage) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "var x = 7;\n"
+      "main() {\n"
+      "  x = x * x;\n"
+      "  x = x / 13;\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+
+  Instance& service_msg = Instance::Handle();
+  service_msg = Eval(
+      h_lib, "[0, port, ['scripts', 'test-lib', 'coverage'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_STREQ(
+      "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", handler.msg());
+}
+
+
+TEST_CASE(Service_LibrariesCoverage) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "var x = 7;\n"
+      "main() {\n"
+      "  x = x * x;\n"
+      "  x = x / 13;\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+
+  // Look up the service id for the library containg the test-lib script.
+  const GrowableObjectArray& libs =
+      GrowableObjectArray::Handle(isolate->object_store()->libraries());
+  intptr_t i;
+  for (i = 0; i < libs.Length(); i++) {
+    if (libs.At(i) == lib.raw()) {
+      break;
+    }
+  }
+  ASSERT(i != libs.Length());
+  char buf[1024];
+  OS::SNPrint(buf, sizeof(buf),
+              "[0, port, ['libraries', '%" Pd "', 'coverage'], [], []]", i);
+
+  Instance& service_msg = Instance::Handle();
+  service_msg = Eval(h_lib, buf);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_STREQ(
+      "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", handler.msg());
+}
+
+
+TEST_CASE(Service_ClassesCoverage) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "class Foo {\n"
+      "  var x;\n"
+      "  Foo(this.x);\n"
+      "  bar() {\n"
+      "    x = x * x;\n"
+      "    x = x / 13;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  var foo = new Foo(7);\n"
+      "  foo.bar();\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+
+  // Look up the service id of Foo.
+  const Class& cls = Class::Handle(
+      lib.LookupClass(String::Handle(String::New("Foo"))));
+  ASSERT(!cls.IsNull());
+  ClassTable* table = isolate->class_table();
+  intptr_t i;
+  for (i = 1; i < table->NumCids(); i++) {
+    if (table->HasValidClassAt(i) && table->At(i) == cls.raw()) {
+      break;
+    }
+  }
+  ASSERT(i != table->NumCids());
+  char buf[1024];
+  OS::SNPrint(buf, sizeof(buf),
+              "[0, port, ['classes', '%" Pd "', 'coverage'], [], []]", i);
+
+  Instance& service_msg = Instance::Handle();
+  service_msg = Eval(h_lib, buf);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_STREQ(
+      "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[5,1,7,4,8,3]}]}", handler.msg());
+}
+
 #endif
 
 
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index c8deea9..044b47e 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -174,9 +174,9 @@
   if (setjmp(*jump.Set()) == 0) {
     Object& obj = Object::Handle(ReadObjectImpl());
     for (intptr_t i = 0; i < backward_references_.length(); i++) {
-      if (!backward_references_[i]->is_deserialized()) {
+      if (!backward_references_[i].is_deserialized()) {
         ReadObjectImpl();
-        backward_references_[i]->set_state(kIsDeserialized);
+        backward_references_[i].set_state(kIsDeserialized);
       }
     }
     return obj.raw();
@@ -302,7 +302,7 @@
   }
 
   // For all other internal VM classes we read the object inline.
-  intptr_t tags = ReadIntptrValue();
+  intptr_t tags = ReadTags();
   switch (class_id) {
 #define SNAPSHOT_READ(clazz)                                                   \
     case clazz::kClassId: {                                                    \
@@ -315,6 +315,7 @@
     case kTypedData##clazz##Cid:                                               \
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
+      tags = RawObject::ClassIdTag::update(class_id, tags);
       obj_ = TypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
@@ -323,6 +324,7 @@
     case kExternalTypedData##clazz##Cid:                                       \
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
+      tags = RawObject::ClassIdTag::update(class_id, tags);
       obj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
@@ -341,8 +343,7 @@
                                 DeserializeState state) {
   intptr_t index = (id - kMaxPredefinedObjectIds);
   ASSERT(index == backward_references_.length());
-  BackRefNode* node = new BackRefNode(obj, state);
-  ASSERT(node != NULL);
+  BackRefNode node(obj, state);
   backward_references_.Add(node);
 }
 
@@ -351,7 +352,7 @@
   ASSERT(id >= kMaxPredefinedObjectIds);
   intptr_t index = (id - kMaxPredefinedObjectIds);
   if (index < backward_references_.length()) {
-    return backward_references_[index]->reference();
+    return backward_references_[index].reference();
   }
   return NULL;
 }
@@ -374,9 +375,9 @@
     *(object_store->from() + i) = ReadObjectImpl();
   }
   for (intptr_t i = 0; i < backward_references_.length(); i++) {
-    if (!backward_references_[i]->is_deserialized()) {
+    if (!backward_references_[i].is_deserialized()) {
       ReadObjectImpl();
-      backward_references_[i]->set_state(kIsDeserialized);
+      backward_references_[i].set_state(kIsDeserialized);
     }
   }
 
@@ -813,7 +814,7 @@
 RawObject* SnapshotReader::ReadInlinedObject(intptr_t object_id) {
   // Read the class header information and lookup the class.
   intptr_t class_header = ReadIntptrValue();
-  intptr_t tags = ReadIntptrValue();
+  intptr_t tags = ReadTags();
   if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) {
     // Object is regular dart instance.
     Instance* result = reinterpret_cast<Instance*>(GetBackRef(object_id));
@@ -893,6 +894,7 @@
     case kTypedData##clazz##Cid:                                               \
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
+      tags = RawObject::ClassIdTag::update(cls_.id(), tags);
       obj_ = TypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
@@ -901,6 +903,7 @@
     case kExternalTypedData##clazz##Cid:                                       \
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
+      tags = RawObject::ClassIdTag::update(cls_.id(), tags);
       obj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
@@ -1389,7 +1392,7 @@
   // case.
   // Write out the class and tags information.
   WriteVMIsolateObject(kClassCid);
-  WriteIntptrValue(GetObjectTags(cls));
+  WriteTags(GetObjectTags(cls));
 
   // Write out the library url and class name.
   RawLibrary* library = cls->ptr()->library_;
@@ -1412,7 +1415,7 @@
 
   // Write out the class and tags information.
   WriteIndexedObject(array_kind);
-  WriteIntptrValue(tags);
+  WriteTags(tags);
 
   // Write out the length field.
   Write<RawObject*>(length);
@@ -1472,7 +1475,7 @@
   WriteIntptrValue(SerializedHeaderData::encode(kInstanceObjectId));
 
   // Write out the tags.
-  WriteIntptrValue(tags);
+  WriteTags(tags);
 
   // Write out the class information for this object.
   WriteObjectImpl(cls);
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 0038bce..d6c00a7 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -181,6 +181,11 @@
     return static_cast<intptr_t>(value);
   }
 
+  intptr_t ReadRawPointerValue() {
+    int64_t value = Read<int64_t>();
+    return static_cast<intptr_t>(value);
+  }
+
   void ReadBytes(uint8_t* addr, intptr_t len) {
     stream_.ReadBytes(addr, len);
   }
@@ -191,6 +196,11 @@
     return result;
   }
 
+  intptr_t ReadTags() {
+    const intptr_t tags = static_cast<intptr_t>(Read<int8_t>()) & 0xff;
+    ASSERT(SerializedHeaderTag::decode(tags) != kObjectId);
+    return tags;
+  }
 
   const uint8_t* CurrentBufferAddress() const {
     return stream_.AddressOfCurrentPosition();
@@ -293,7 +303,7 @@
   RawStacktrace* NewStacktrace();
 
  private:
-  class BackRefNode : public ZoneAllocated {
+  class BackRefNode : public ValueObject {
    public:
     BackRefNode(Object* reference, DeserializeState state)
         : reference_(reference), state_(state) {}
@@ -301,11 +311,15 @@
     bool is_deserialized() const { return state_ == kIsDeserialized; }
     void set_state(DeserializeState state) { state_ = state; }
 
+    BackRefNode& operator=(const BackRefNode& other) {
+      reference_ = other.reference_;
+      state_ = other.state_;
+      return *this;
+    }
+
    private:
     Object* reference_;
     DeserializeState state_;
-
-    DISALLOW_COPY_AND_ASSIGN(BackRefNode);
   };
 
   // Allocate uninitialized objects, this is used when reading a full snapshot.
@@ -345,7 +359,7 @@
   TokenStream& stream_;  // Temporary token stream handle.
   ExternalTypedData& data_;  // Temporary stream data handle.
   UnhandledException& error_;  // Error handle.
-  GrowableArray<BackRefNode*> backward_references_;
+  GrowableArray<BackRefNode> backward_references_;
 
   friend class ApiError;
   friend class Array;
@@ -395,6 +409,11 @@
 
   // Writes an intptr_t type value out.
   void WriteIntptrValue(intptr_t value) {
+    ASSERT((value >= kMinInt32) && (value <= kMaxInt32));
+    Write<int64_t>(value);
+  }
+
+  void WriteRawPointerValue(intptr_t value) {
     Write<int64_t>(value);
   }
 
@@ -426,6 +445,12 @@
     WriteIntptrValue(value);
   }
 
+  void WriteTags(intptr_t tags) {
+    ASSERT(SerializedHeaderTag::decode(tags) != kObjectId);
+    const intptr_t flags = tags & 0xff;
+    Write<int8_t>(static_cast<int8_t>(flags));
+  }
+
   // Write out a buffer of bytes.
   void WriteBytes(const uint8_t* addr, intptr_t len) {
     stream_.WriteBytes(addr, len);
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 7761863d..05b4df2 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -2429,44 +2429,44 @@
       "getTypedDataViewList() {\n"
       "  var list = new List(30);\n"
       "  var index = 0;\n"
-      "  list[index++] = new Int8List.view(new Int8List(256));\n"
-      "  list[index++] = new Uint8List.view(new Uint8List(256));\n"
-      "  list[index++] = new Int16List.view(new Int16List(256));\n"
-      "  list[index++] = new Uint16List.view(new Uint16List(256));\n"
-      "  list[index++] = new Int32List.view(new Int32List(256));\n"
-      "  list[index++] = new Uint32List.view(new Uint32List(256));\n"
-      "  list[index++] = new Int64List.view(new Int64List(256));\n"
-      "  list[index++] = new Uint64List.view(new Uint64List(256));\n"
-      "  list[index++] = new Float32List.view(new Float32List(256));\n"
-      "  list[index++] = new Float64List.view(new Float64List(256));\n"
+      "  list[index++] = new Int8List.view(new Int8List(256).buffer);\n"
+      "  list[index++] = new Uint8List.view(new Uint8List(256).buffer);\n"
+      "  list[index++] = new Int16List.view(new Int16List(256).buffer);\n"
+      "  list[index++] = new Uint16List.view(new Uint16List(256).buffer);\n"
+      "  list[index++] = new Int32List.view(new Int32List(256).buffer);\n"
+      "  list[index++] = new Uint32List.view(new Uint32List(256).buffer);\n"
+      "  list[index++] = new Int64List.view(new Int64List(256).buffer);\n"
+      "  list[index++] = new Uint64List.view(new Uint64List(256).buffer);\n"
+      "  list[index++] = new Float32List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = new Float64List.view(new Float64List(256).buffer);\n"
 
-      "  list[index++] = new Int8List.view(new Int16List(256));\n"
-      "  list[index++] = new Uint8List.view(new Uint16List(256));\n"
-      "  list[index++] = new Int8List.view(new Int32List(256));\n"
-      "  list[index++] = new Uint8List.view(new Uint32List(256));\n"
-      "  list[index++] = new Int8List.view(new Int64List(256));\n"
-      "  list[index++] = new Uint8List.view(new Uint64List(256));\n"
-      "  list[index++] = new Int8List.view(new Float32List(256));\n"
-      "  list[index++] = new Uint8List.view(new Float32List(256));\n"
-      "  list[index++] = new Int8List.view(new Float64List(256));\n"
-      "  list[index++] = new Uint8List.view(new Float64List(256));\n"
+      "  list[index++] = new Int8List.view(new Int16List(256).buffer);\n"
+      "  list[index++] = new Uint8List.view(new Uint16List(256).buffer);\n"
+      "  list[index++] = new Int8List.view(new Int32List(256).buffer);\n"
+      "  list[index++] = new Uint8List.view(new Uint32List(256).buffer);\n"
+      "  list[index++] = new Int8List.view(new Int64List(256).buffer);\n"
+      "  list[index++] = new Uint8List.view(new Uint64List(256).buffer);\n"
+      "  list[index++] = new Int8List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = new Uint8List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = new Int8List.view(new Float64List(256).buffer);\n"
+      "  list[index++] = new Uint8List.view(new Float64List(256).buffer);\n"
 
-      "  list[index++] = new Int16List.view(new Int8List(256));\n"
-      "  list[index++] = new Uint16List.view(new Uint8List(256));\n"
-      "  list[index++] = new Int16List.view(new Int32List(256));\n"
-      "  list[index++] = new Uint16List.view(new Uint32List(256));\n"
-      "  list[index++] = new Int16List.view(new Int64List(256));\n"
-      "  list[index++] = new Uint16List.view(new Uint64List(256));\n"
-      "  list[index++] = new Int16List.view(new Float32List(256));\n"
-      "  list[index++] = new Uint16List.view(new Float32List(256));\n"
-      "  list[index++] = new Int16List.view(new Float64List(256));\n"
-      "  list[index++] = new Uint16List.view(new Float64List(256));\n"
+      "  list[index++] = new Int16List.view(new Int8List(256).buffer);\n"
+      "  list[index++] = new Uint16List.view(new Uint8List(256).buffer);\n"
+      "  list[index++] = new Int16List.view(new Int32List(256).buffer);\n"
+      "  list[index++] = new Uint16List.view(new Uint32List(256).buffer);\n"
+      "  list[index++] = new Int16List.view(new Int64List(256).buffer);\n"
+      "  list[index++] = new Uint16List.view(new Uint64List(256).buffer);\n"
+      "  list[index++] = new Int16List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = new Uint16List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = new Int16List.view(new Float64List(256).buffer);\n"
+      "  list[index++] = new Uint16List.view(new Float64List(256).buffer);\n"
       "  return list;\n"
       "}\n"
       "getMultipleTypedDataViewList() {\n"
       "  var list = new List(10);\n"
       "  var index = 0;\n"
-      "  var data = new Uint8List(256);\n"
+      "  var data = new Uint8List(256).buffer;\n"
       "  list[index++] = new Int8List.view(data);\n"
       "  list[index++] = new Uint8List.view(data);\n"
       "  list[index++] = new Int16List.view(data);\n"
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index af807f1..4563724 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -12,6 +12,7 @@
 #include "vm/os.h"
 #include "vm/parser.h"
 #include "vm/raw_object.h"
+#include "vm/reusable_handles.h"
 #include "vm/stub_code.h"
 #include "vm/visitor.h"
 
@@ -196,23 +197,28 @@
 }
 
 
-bool StackFrame::FindExceptionHandler(uword* handler_pc,
+bool StackFrame::FindExceptionHandler(Isolate* isolate,
+                                      uword* handler_pc,
                                       bool* needs_stacktrace,
                                       bool* has_catch_all) const {
-  Isolate* isolate = Isolate::Current();
-  Code& code = Code::Handle(isolate, LookupDartCode());
+  REUSABLE_CODE_HANDLESCOPE(isolate);
+  Code& code = reused_code_handle.Handle();
+  code = LookupDartCode();
   if (code.IsNull()) {
     return false;  // Stub frames do not have exception handlers.
   }
 
-  ExceptionHandlers& handlers =
-      ExceptionHandlers::Handle(isolate, code.exception_handlers());
+  REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(isolate);
+  ExceptionHandlers& handlers = reused_exception_handlers_handle.Handle();
+  handlers = code.exception_handlers();
   if (handlers.Length() == 0) {
     return false;
   }
+
   // Find pc descriptor for the current pc.
-  const PcDescriptors& descriptors =
-      PcDescriptors::Handle(isolate, code.pc_descriptors());
+  REUSABLE_PC_DESCRIPTORS_HANDLESCOPE(isolate);
+  PcDescriptors& descriptors = reused_pc_descriptors_handle.Handle();
+  descriptors = code.pc_descriptors();
   const intptr_t len = descriptors.Length();
   for (intptr_t i = 0; i < len; i++) {
     if ((static_cast<uword>(descriptors.PC(i)) == pc()) &&
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 5b4d6b4..53982639 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -72,7 +72,8 @@
 
   RawFunction* LookupDartFunction() const;
   RawCode* LookupDartCode() const;
-  bool FindExceptionHandler(uword* handler_pc,
+  bool FindExceptionHandler(Isolate* isolate,
+                            uword* handler_pc,
                             bool* needs_stacktrace,
                             bool* is_catch_all) const;
   // Returns token_pos of the pc(), or -1 if none exists.
diff --git a/runtime/vm/stack_frame_x64.h b/runtime/vm/stack_frame_x64.h
index d85e8ec..125735d 100644
--- a/runtime/vm/stack_frame_x64.h
+++ b/runtime/vm/stack_frame_x64.h
@@ -45,9 +45,15 @@
 static const int kSavedAboveReturnAddress = 3;  // Saved above return address.
 
 // Entry and exit frame layout.
+#if defined(_WIN64)
+static const int kSavedContextSlotFromEntryFp = -32;
+static const int kExitLinkSlotFromEntryFp = -31;
+static const int kSavedVMTagSlotFromEntryFp = -30;
+#else
 static const int kSavedContextSlotFromEntryFp = -10;
 static const int kExitLinkSlotFromEntryFp = -9;
 static const int kSavedVMTagSlotFromEntryFp = -8;
+#endif  // defined(_WIN64)
 
 }  // namespace dart
 
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 61eb06c..91b2a3b 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -217,12 +217,6 @@
   __ stm(IA, SP,  (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3));
   __ mov(R0, Operand(SP));  // Pass the pointer to the NativeArguments.
 
-  // Call native function (setsup scope if not leaf function).
-  Label leaf_call;
-  Label done;
-  __ TestImmediate(R1, NativeArguments::AutoSetupScopeMask());
-  __ b(&leaf_call, EQ);
-
   __ mov(R1, Operand(R5));  // Pass the function entrypoint to call.
   // Call native function invocation wrapper or redirection via simulator.
 #if defined(USING_SIMULATOR)
@@ -234,13 +228,6 @@
 #else
   __ BranchLink(&NativeEntry::NativeCallWrapperLabel());
 #endif
-  __ b(&done);
-
-  __ Bind(&leaf_call);
-  // Call native function or redirection via simulator.
-  __ blx(R5);
-
-  __ Bind(&done);
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kScriptTagId);
@@ -1284,7 +1271,7 @@
   // Preserve return address, since LR is needed for subroutine call.
   __ mov(R8, Operand(LR));
   // Loop that checks if there is an IC data match.
-  Label loop, update, test, found, get_class_id_as_smi;
+  Label loop, update, test, found;
   // R5: IC data object (preserved).
   __ ldr(R6, FieldAddress(R5, ICData::ic_data_offset()));
   // R6: ic_data_array with check entries: classes and target functions.
@@ -1296,7 +1283,7 @@
   __ ldr(R7, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
   __ 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);
+  __ LoadTaggedClassIdMayBeSmi(R0, R0);
   // R7: argument_count - 1 (smi).
   // R0: receiver's class ID (smi).
   __ ldr(R1, Address(R6, 0));  // First class id (smi) to check.
@@ -1308,7 +1295,7 @@
       // If not the first, load the next argument's class ID.
       __ AddImmediate(R0, R7, Smi::RawValue(-i));
       __ ldr(R0, Address(SP, R0, LSL, 1));
-      __ bl(&get_class_id_as_smi);
+      __ LoadTaggedClassIdMayBeSmi(R0, R0);
       // R0: next argument class ID (smi).
       __ LoadFromOffset(kWord, R1, R6, i * kWordSize);
       // R1: next class ID to check (smi).
@@ -1326,7 +1313,7 @@
   // Reload receiver class ID.  It has not been destroyed when num_args == 1.
   if (num_args > 1) {
     __ ldr(R0, Address(SP, R7, LSL, 1));
-    __ bl(&get_class_id_as_smi);
+    __ LoadTaggedClassIdMayBeSmi(R0, R0);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1386,17 +1373,6 @@
   __ ldr(R2, FieldAddress(R0, Function::instructions_offset()));
   __ AddImmediate(R2, Instructions::HeaderSize() - kHeapObjectTag);
   __ bx(R2);
-
-  // Instance in R0, return its class-id in R0 as Smi.
-  __ Bind(&get_class_id_as_smi);
-
-  // Test if Smi -> load Smi class for comparison.
-  __ tst(R0, Operand(kSmiTagMask));
-  __ mov(R0, Operand(Smi::RawValue(kSmiCid)), EQ);
-  __ bx(LR, EQ);
-  __ LoadClassId(R0, R0);
-  __ SmiTag(R0);
-  __ bx(LR);
 }
 
 
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 13f5a14..8f7b793 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -230,12 +230,6 @@
   __ mov(R26, CSP);
   __ mov(CSP, SP);
 
-  // Call native function (setsup scope if not leaf function).
-  Label leaf_call;
-  Label done;
-  __ TestImmediate(R1, NativeArguments::AutoSetupScopeMask(), kNoPP);
-  __ b(&leaf_call, EQ);
-
   __ mov(R1, R5);  // Pass the function entrypoint to call.
   // Call native function invocation wrapper or redirection via simulator.
 #if defined(USING_SIMULATOR)
@@ -247,13 +241,7 @@
 #else
   __ BranchLink(&NativeEntry::NativeCallWrapperLabel(), kNoPP);
 #endif
-  __ b(&done);
 
-  __ Bind(&leaf_call);
-  // Call native function or redirection via simulator.
-  __ blr(R5);
-
-  __ Bind(&done);
   // Restore SP and CSP.
   __ mov(SP, CSP);
   __ mov(CSP, R26);
@@ -1305,9 +1293,11 @@
     __ Pop(R6);  // Restore.
     __ LeaveStubFrame();
   }
-  __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset(), kNoPP);
+  __ LoadFieldFromOffset(
+      R7, func_reg, Function::usage_counter_offset(), kNoPP, kWord);
   __ add(R7, R7, Operand(1));
-  __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset(), kNoPP);
+  __ StoreFieldToOffset(
+      R7, func_reg, Function::usage_counter_offset(), kNoPP, kWord);
 }
 
 
@@ -1318,9 +1308,11 @@
   Register func_reg = temp_reg;
   ASSERT(temp_reg == R6);
   __ LoadFieldFromOffset(func_reg, ic_reg, ICData::owner_offset(), kNoPP);
-  __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset(), kNoPP);
+  __ LoadFieldFromOffset(
+      R7, func_reg, Function::usage_counter_offset(), kNoPP, kWord);
   __ AddImmediate(R7, R7, 1, kNoPP);
-  __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset(), kNoPP);
+  __ StoreFieldToOffset(
+      R7, func_reg, Function::usage_counter_offset(), kNoPP, kWord);
 }
 
 
@@ -1373,7 +1365,7 @@
   // Load arguments descriptor into R4.
   __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset(), kNoPP);
   // Loop that checks if there is an IC data match.
-  Label loop, update, test, found, get_class_id_as_smi;
+  Label loop, update, test, found;
   // R5: IC data object (preserved).
   __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset(), kNoPP);
   // R6: ic_data_array with check entries: classes and target functions.
@@ -1388,23 +1380,7 @@
 
   // R0 <- [SP + (R7 << 3)]
   __ ldr(R0, Address(SP, R7, UXTX, Address::Scaled));
-
-  {
-    // TODO(zra): Put this code in a subroutine call as with other architectures
-    // when we have a bl(Label& l) instruction.
-    // Instance in R0, return its class-id in R0 as Smi.
-    // Test if Smi -> load Smi class for comparison.
-    Label not_smi, done;
-    __ tsti(R0, kSmiTagMask);
-    __ b(&not_smi, NE);
-    __ LoadImmediate(R0, Smi::RawValue(kSmiCid), kNoPP);
-    __ b(&done);
-
-    __ Bind(&not_smi);
-    __ LoadClassId(R0, R0, kNoPP);
-    __ SmiTag(R0);
-    __ Bind(&done);
-  }
+  __ LoadTaggedClassIdMayBeSmi(R0, R0);
 
   // R7: argument_count - 1 (untagged).
   // R0: receiver's class ID (smi).
@@ -1418,20 +1394,7 @@
       __ AddImmediate(R0, R7, -i, kNoPP);
       // R0 <- [SP + (R0 << 3)]
       __ ldr(R0, Address(SP, R0, UXTX, Address::Scaled));
-      {
-        // Instance in R0, return its class-id in R0 as Smi.
-        // Test if Smi -> load Smi class for comparison.
-        Label not_smi, done;
-        __ tsti(R0, kSmiTagMask);
-        __ b(&not_smi, NE);
-        __ LoadImmediate(R0, Smi::RawValue(kSmiCid), kNoPP);
-        __ b(&done);
-
-        __ Bind(&not_smi);
-        __ LoadClassId(R0, R0, kNoPP);
-        __ SmiTag(R0);
-        __ Bind(&done);
-      }
+      __ LoadTaggedClassIdMayBeSmi(R0, R0);
       // R0: next argument class ID (smi).
       __ LoadFromOffset(R1, R6, i * kWordSize, kNoPP);
       // R1: next class ID to check (smi).
@@ -1448,20 +1411,7 @@
   // Reload receiver class ID.  It has not been destroyed when num_args == 1.
   if (num_args > 1) {
     __ ldr(R0, Address(SP, R7, UXTX, Address::Scaled));
-    {
-      // Instance in R0, return its class-id in R0 as Smi.
-      // Test if Smi -> load Smi class for comparison.
-      Label not_smi, done;
-      __ tsti(R0, kSmiTagMask);
-      __ b(&not_smi, NE);
-      __ LoadImmediate(R0, Smi::RawValue(kSmiCid), kNoPP);
-      __ b(&done);
-
-      __ Bind(&not_smi);
-      __ LoadClassId(R0, R0, kNoPP);
-      __ SmiTag(R0);
-      __ Bind(&done);
-    }
+    __ LoadTaggedClassIdMayBeSmi(R0, R0);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1583,7 +1533,8 @@
 
 
 void StubCode::GenerateClosureCallInlineCacheStub(Assembler* assembler) {
-  __ Stop("GenerateClosureCallInlineCacheStub");
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
 }
 
 
@@ -1731,8 +1682,8 @@
     // Compute instance type arguments into R4.
     Label has_no_type_arguments;
     __ LoadObject(R4, Object::null_object(), PP);
-    __ LoadFieldFromOffset(
-        R5, R3, Class::type_arguments_field_offset_in_words_offset(), kNoPP);
+    __ LoadFieldFromOffset(R5, R3,
+        Class::type_arguments_field_offset_in_words_offset(), kNoPP, kWord);
     __ CompareImmediate(R5, Class::kNoTypeArguments, kNoPP);
     __ b(&has_no_type_arguments, EQ);
     __ add(R5, R0, Operand(R5, LSL, 3));
@@ -1830,8 +1781,23 @@
 }
 
 
+// Jump to the exception or error handler.
+// LR: return address.
+// R0: program_counter.
+// R1: stack_pointer.
+// R2: frame_pointer.
+// R3: error object.
+// R4: address of stacktrace object.
+// Does not return.
 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
-  __ Stop("GenerateJumpToExceptionHandlerStub");
+  ASSERT(kExceptionObjectReg == R0);
+  ASSERT(kStackTraceObjectReg == R1);
+  __ mov(LR, R0);  // Program counter.
+  __ mov(SP, R1);  // Stack pointer.
+  __ mov(FP, R2);  // Frame_pointer.
+  __ mov(R0, R3);  // Exception object.
+  __ mov(R1, R4);  // StackTrace object.
+  __ ret();  // Jump to the exception handler code.
 }
 
 
@@ -1852,7 +1818,7 @@
   __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, PP);
   __ LeaveStubFrame();
   __ br(R0);
-  __ hlt(0);
+  __ brk(0);
 }
 
 
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index cd64f41..e5b1bb9 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -227,17 +227,8 @@
   __ leal(EAX, Address(ESP, 2 * kWordSize));  // Pointer to the NativeArguments.
   __ movl(Address(ESP, 0), EAX);  // Pass the pointer to the NativeArguments.
 
-  // Call native function (setsup scope if not leaf function).
-  Label leaf_call;
-  Label done;
-  __ testl(EDX, Immediate(NativeArguments::AutoSetupScopeMask()));
-  __ j(ZERO, &leaf_call, Assembler::kNearJump);
   __ movl(Address(ESP, kWordSize), ECX);  // Function to call.
   __ call(&NativeEntry::NativeCallWrapperLabel());
-  __ jmp(&done);
-  __ Bind(&leaf_call);
-  __ call(ECX);
-  __ Bind(&done);
 
   // Mark that the isolate is executing Dart code.
   __ movl(Address(CTX, Isolate::vm_tag_offset()),
@@ -1322,7 +1313,7 @@
   // Load arguments descriptor into EDX.
   __ movl(EDX, FieldAddress(ECX, ICData::arguments_descriptor_offset()));
   // Loop that checks if there is an IC data match.
-  Label loop, update, test, found, get_class_id_as_smi;
+  Label loop, update, test, found;
   // ECX: IC data object (preserved).
   __ movl(EBX, FieldAddress(ECX, ICData::ic_data_offset()));
   // EBX: ic_data_array with check entries: classes and target functions.
@@ -1333,7 +1324,8 @@
   // arguments descriptor array and then access the receiver from the stack).
   __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
   __ movl(EAX, Address(ESP, EAX, TIMES_2, 0));  // EAX (argument_count) is smi.
-  __ call(&get_class_id_as_smi);
+  __ LoadTaggedClassIdMayBeSmi(EAX, EAX);
+
   // EAX: receiver's class ID (smi).
   __ movl(EDI, Address(EBX, 0));  // First class id (smi) to check.
   __ jmp(&test);
@@ -1344,7 +1336,8 @@
       // If not the first, load the next argument's class ID.
       __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
       __ movl(EAX, Address(ESP, EAX, TIMES_2, - i * kWordSize));
-      __ call(&get_class_id_as_smi);
+      __ LoadTaggedClassIdMayBeSmi(EAX, EAX);
+
       // EAX: next argument class ID (smi).
       __ movl(EDI, Address(EBX, i * kWordSize));
       // EDI: next class ID to check (smi).
@@ -1362,7 +1355,7 @@
   if (num_args > 1) {
     __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
     __ movl(EAX, Address(ESP, EAX, TIMES_2, 0));
-    __ call(&get_class_id_as_smi);
+    __ LoadTaggedClassIdMayBeSmi(EAX, EAX);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1419,20 +1412,7 @@
   __ movl(EBX, FieldAddress(EAX, Function::instructions_offset()));
   __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(EBX);
-
-  // Instance in EAX, return its class-id in EAX as Smi.
-  __ Bind(&get_class_id_as_smi);
-  Label not_smi;
-  // Test if Smi -> load Smi class for comparison.
-  __ testl(EAX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
-  __ movl(EAX, Immediate(Smi::RawValue(kSmiCid)));
-  __ ret();
-
-  __ Bind(&not_smi);
-  __ LoadClassId(EAX, EAX);
-  __ SmiTag(EAX);
-  __ ret();
+  __ int3();
 }
 
 
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 6718260..5c9a554a 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -230,11 +230,6 @@
   __ sw(A0, Address(SP, 0 * kWordSize));
   __ mov(A0, SP);  // Pass the pointer to the NativeArguments.
 
-  // Call native function (setup scope if not leaf function).
-  Label leaf_call;
-  Label done;
-  __ AndImmediate(CMPRES1, A1, NativeArguments::AutoSetupScopeMask());
-  __ beq(CMPRES1, ZR, &leaf_call);
 
   __ mov(A1, T5);  // Pass the function entrypoint.
   __ ReserveAlignedFrameSpace(2 * kWordSize);  // Just passing A0, A1.
@@ -249,19 +244,6 @@
   __ BranchLink(&NativeEntry::NativeCallWrapperLabel());
 #endif
   __ TraceSimMsg("CallNativeCFunctionStub return");
-  __ b(&done);
-
-  __ Bind(&leaf_call);
-  // Call native function or redirection via simulator.
-  __ ReserveAlignedFrameSpace(kWordSize);  // Just passing A0.
-
-
-  // We defensively always jalr through T9 because it is sometimes required by
-  // the MIPS ABI.
-  __ mov(T9, T5);
-  __ jalr(T9);
-
-  __ Bind(&done);
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(A2, VMTag::kScriptTagId);
@@ -1446,7 +1428,7 @@
   // Preserve return address, since RA is needed for subroutine call.
   __ mov(T2, RA);
   // Loop that checks if there is an IC data match.
-  Label loop, update, test, found, get_class_id_as_smi;
+  Label loop, update, test, found;
   // S5: IC data object (preserved).
   __ lw(T0, FieldAddress(S5, ICData::ic_data_offset()));
   // T0: ic_data_array with check entries: classes and target functions.
@@ -1460,8 +1442,9 @@
   __ subu(T1, T1, TMP);
   __ sll(T3, T1, 1);  // T1 (argument_count - 1) is smi.
   __ addu(T3, T3, SP);
-  __ bal(&get_class_id_as_smi);
-  __ delay_slot()->lw(T3, Address(T3));
+  __ lw(T3, Address(T3));
+  __ LoadTaggedClassIdMayBeSmi(T3, T3);
+
   // T1: argument_count - 1 (smi).
   // T3: receiver's class ID (smi).
   __ b(&test);
@@ -1475,8 +1458,8 @@
       __ addu(T3, T1, T3);
       __ sll(T3, T3, 1);
       __ addu(T3, SP, T3);
-      __ bal(&get_class_id_as_smi);
-      __ delay_slot()->lw(T3, Address(T3));
+      __ lw(T3, Address(T3));
+      __ LoadTaggedClassIdMayBeSmi(T3, T3);
       // T3: next argument class ID (smi).
       __ lw(T4, Address(T0, i * kWordSize));
       // T4: next class ID to check (smi).
@@ -1497,8 +1480,8 @@
   if (num_args > 1) {
     __ sll(T3, T1, 1);
     __ addu(T3, T3, SP);
-    __ bal(&get_class_id_as_smi);
-    __ delay_slot()->lw(T3, Address(T3));
+    __ lw(T3, Address(T3));
+    __ LoadTaggedClassIdMayBeSmi(T3, T3);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1573,20 +1556,6 @@
   __ lw(T4, FieldAddress(T0, Function::instructions_offset()));
   __ AddImmediate(T4, Instructions::HeaderSize() - kHeapObjectTag);
   __ jr(T4);
-
-  // Instance in T3, return its class-id in T3 as Smi.
-  __ Bind(&get_class_id_as_smi);
-  Label not_smi;
-  // Test if Smi -> load Smi class for comparison.
-  __ andi(CMPRES1, T3, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &not_smi);
-  __ jr(RA);
-  __ delay_slot()->addiu(T3, ZR, Immediate(Smi::RawValue(kSmiCid)));
-
-  __ Bind(&not_smi);
-  __ LoadClassId(T3, T3);
-  __ jr(RA);
-  __ delay_slot()->SmiTag(T3);
 }
 
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 5fd0af6..e13b54f 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -89,7 +89,11 @@
   __ movq(Address(RSP, argv_offset), RAX);  // Set argv in NativeArguments.
   __ addq(RAX, Immediate(1 * kWordSize));  // Retval is next to 1st argument.
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
-  __ call(RBX);
+#if defined(_WIN64)
+  ASSERT(sizeof(NativeArguments) > CallingConventions::kRegisterTransferLimit);
+  __ movq(CallingConventions::kArg1Reg, RSP);
+#endif
+  __ CallCFunction(RBX);
 
   // Mark that the isolate is executing Dart code.
   __ movq(Address(CTX, Isolate::vm_tag_offset()),
@@ -127,6 +131,9 @@
 void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
   __ EnterCallRuntimeFrame(0);
   // Call the runtime leaf function. RDI already contains the parameter.
+#if defined(_WIN64)
+  __ movq(CallingConventions::kArg1Reg, RDI);
+#endif
   __ CallRuntime(kPrintStopMessageRuntimeEntry, 1);
   __ LeaveCallRuntimeFrame();
   __ ret();
@@ -193,19 +200,12 @@
   __ movq(Address(RSP, argv_offset), RAX);  // Set argv in NativeArguments.
   __ leaq(RAX, Address(RBP, 2 * kWordSize));  // Compute return value addr.
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
-  __ movq(RDI, RSP);  // Pass the pointer to the NativeArguments.
 
-  // Call native function (setsup scope if not leaf function).
-  Label leaf_call;
-  Label done;
-  __ testq(R10, Immediate(NativeArguments::AutoSetupScopeMask()));
-  __ j(ZERO, &leaf_call);
-  __ movq(RSI, RBX);  // Pass pointer to function entrypoint.
-  __ call(&NativeEntry::NativeCallWrapperLabel());
-  __ jmp(&done);
-  __ Bind(&leaf_call);
-  __ call(RBX);
-  __ Bind(&done);
+  // Pass the pointer to the NativeArguments.
+  __ movq(CallingConventions::kArg1Reg, RSP);
+  // Pass pointer to function entrypoint.
+  __ movq(CallingConventions::kArg2Reg, RBX);
+  __ CallCFunction(&NativeEntry::NativeCallWrapperLabel());
 
   // Mark that the isolate is executing Dart code.
   __ movq(Address(CTX, Isolate::vm_tag_offset()),
@@ -289,8 +289,10 @@
   __ movq(Address(RSP, argv_offset), RAX);  // Set argv in NativeArguments.
   __ leaq(RAX, Address(RBP, 2 * kWordSize));  // Compute return value addr.
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
-  __ movq(RDI, RSP);  // Pass the pointer to the NativeArguments.
-  __ call(RBX);
+
+  // Pass the pointer to the NativeArguments.
+  __ movq(CallingConventions::kArg1Reg, RSP);
+  __ CallCFunction(RBX);
 
   // Mark that the isolate is executing Dart code.
   __ movq(Address(CTX, Isolate::vm_tag_offset()),
@@ -439,8 +441,9 @@
     offset += kFpuRegisterSize;
   }
 
-  __ movq(RDI, RSP);  // Pass address of saved registers block.
-  __ ReserveAlignedFrameSpace(0);
+  // Pass address of saved registers block.
+  __ movq(CallingConventions::kArg1Reg, RSP);
+  __ ReserveAlignedFrameSpace(0);  // Ensure stack is aligned before the call.
   __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
   // Result (RAX) is stack-size (FP - SP) in bytes.
 
@@ -467,7 +470,8 @@
     __ pushq(RBX);  // Preserve result as first local.
   }
   __ ReserveAlignedFrameSpace(0);
-  __ movq(RDI, RBP);  // Pass last FP as parameter in RDI.
+  // Pass last FP as a parameter.
+  __ movq(CallingConventions::kArg1Reg, RBP);
   __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
   if (preserve_result) {
     // Restore result into RBX.
@@ -686,6 +690,11 @@
   // Save frame pointer coming in.
   __ EnterFrame(0);
 
+  const Register kEntryPointReg = CallingConventions::kArg1Reg;
+  const Register kArgDescReg    = CallingConventions::kArg2Reg;
+  const Register kArgsReg       = CallingConventions::kArg3Reg;
+  const Register kNewContextReg = CallingConventions::kArg4Reg;
+
   // At this point, the stack looks like:
   // | saved RBP                                      | <-- RBP
   // | saved PC (return to DartEntry::InvokeFunction) |
@@ -693,16 +702,13 @@
   const intptr_t kInitialOffset = 1;
   // Save arguments descriptor array and new context.
   const intptr_t kArgumentsDescOffset = -(kInitialOffset) * kWordSize;
-  __ pushq(RSI);
+  __ pushq(kArgDescReg);
   const intptr_t kNewContextOffset = -(kInitialOffset + 1) * kWordSize;
-  __ pushq(RCX);
+  __ pushq(kNewContextReg);
 
   // Save C++ ABI callee-saved registers.
-  __ pushq(RBX);
-  __ pushq(R12);
-  __ pushq(R13);
-  __ pushq(R14);
-  __ pushq(R15);
+  __ PushRegisters(CallingConventions::kCalleeSaveCpuRegisters,
+                   CallingConventions::kCalleeSaveXmmRegisters);
 
   // We now load the pool pointer(PP) as we are about to invoke dart code and we
   // could potentially invoke some intrinsic functions which need the PP to be
@@ -720,28 +726,50 @@
   // compiled or runtime stub code.
 
   // Cache the new Context pointer into CTX while executing Dart code.
-  __ movq(CTX, Address(RCX, VMHandles::kOffsetOfRawPtrInHandle));
+  __ movq(CTX, Address(kNewContextReg, VMHandles::kOffsetOfRawPtrInHandle));
+
+  const Register kIsolateReg = RBX;
 
   // Load Isolate pointer from Context structure into R8.
-  __ movq(R8, FieldAddress(CTX, Context::isolate_offset()));
+  __ movq(kIsolateReg, FieldAddress(CTX, Context::isolate_offset()));
 
   // Save the current VMTag on the stack.
-  ASSERT(kSavedVMTagSlotFromEntryFp == -8);
-  __ movq(RAX, Address(R8, Isolate::vm_tag_offset()));
+  __ movq(RAX, Address(kIsolateReg, Isolate::vm_tag_offset()));
   __ pushq(RAX);
+#if defined(DEBUG)
+  {
+    Label ok;
+    __ leaq(RAX, Address(RBP, kSavedVMTagSlotFromEntryFp * kWordSize));
+    __ cmpq(RAX, RSP);
+    __ j(EQUAL, &ok);
+    __ Stop("kSavedVMTagSlotFromEntryFp mismatch");
+    __ Bind(&ok);
+  }
+#endif
 
   // Mark that the isolate is executing Dart code.
-  __ movq(Address(R8, Isolate::vm_tag_offset()),
+  __ movq(Address(kIsolateReg, Isolate::vm_tag_offset()),
           Immediate(VMTag::kScriptTagId));
 
   // Save the top exit frame info. Use RAX as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
   // code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -9);
-  __ movq(RAX, Address(R8, Isolate::top_exit_frame_info_offset()));
+  __ movq(RAX, Address(kIsolateReg, Isolate::top_exit_frame_info_offset()));
   __ pushq(RAX);
-  __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), Immediate(0));
+#if defined(DEBUG)
+  {
+    Label ok;
+    __ leaq(RAX, Address(RBP, kExitLinkSlotFromEntryFp * kWordSize));
+    __ cmpq(RAX, RSP);
+    __ j(EQUAL, &ok);
+    __ Stop("kExitLinkSlotFromEntryFp mismatch");
+    __ Bind(&ok);
+  }
+#endif
+
+  __ movq(Address(kIsolateReg, Isolate::top_exit_frame_info_offset()),
+          Immediate(0));
 
   // Save the old Context pointer. Use RAX as a temporary register.
   // Note that VisitObjectPointers will find this saved Context pointer during
@@ -750,19 +778,31 @@
   // EntryFrame::SavedContext reads the context saved in this frame.
   // The constant kSavedContextSlotFromEntryFp must be kept in sync with
   // the code below.
-  ASSERT(kSavedContextSlotFromEntryFp == -10);
-  __ movq(RAX, Address(R8, Isolate::top_context_offset()));
+  __ movq(RAX, Address(kIsolateReg, Isolate::top_context_offset()));
   __ pushq(RAX);
+#if defined(DEBUG)
+  {
+    Label ok;
+    __ leaq(RAX, Address(RBP, kSavedContextSlotFromEntryFp * kWordSize));
+    __ cmpq(RAX, RSP);
+    __ j(EQUAL, &ok);
+    __ Stop("kSavedContextSlotFromEntryFp mismatch");
+    __ Bind(&ok);
+  }
+#endif
 
   // Load arguments descriptor array into R10, which is passed to Dart code.
-  __ movq(R10, Address(RSI, VMHandles::kOffsetOfRawPtrInHandle));
+  __ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
+
+  // Push arguments. At this point we only need to preserve kEntryPointReg.
+  ASSERT(kEntryPointReg != RDX);
 
   // Load number of arguments into RBX.
   __ movq(RBX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
   __ SmiUntag(RBX);
 
   // Compute address of 'arguments array' data area into RDX.
-  __ movq(RDX, Address(RDX, VMHandles::kOffsetOfRawPtrInHandle));
+  __ movq(RDX, Address(kArgsReg, VMHandles::kOffsetOfRawPtrInHandle));
   __ leaq(RDX, FieldAddress(RDX, Array::data_offset()));
 
   // Set up arguments for the Dart call.
@@ -772,51 +812,45 @@
   __ j(ZERO, &done_push_arguments, Assembler::kNearJump);
   __ movq(RAX, Immediate(0));
   __ Bind(&push_arguments);
-  __ movq(RCX, Address(RDX, RAX, TIMES_8, 0));  // RDX is start of arguments.
-  __ pushq(RCX);
+  __ pushq(Address(RDX, RAX, TIMES_8, 0));
   __ incq(RAX);
   __ cmpq(RAX, RBX);
   __ j(LESS, &push_arguments, Assembler::kNearJump);
   __ Bind(&done_push_arguments);
 
   // Call the Dart code entrypoint.
-  __ call(RDI);  // R10 is the arguments descriptor array.
+  __ call(kEntryPointReg);  // R10 is the arguments descriptor array.
 
-  // Read the saved new Context pointer.
+  // Restore CTX from the saved context handle.
   __ movq(CTX, Address(RBP, kNewContextOffset));
   __ movq(CTX, Address(CTX, VMHandles::kOffsetOfRawPtrInHandle));
 
   // Read the saved arguments descriptor array to obtain the number of passed
   // arguments.
-  __ movq(RSI, Address(RBP, kArgumentsDescOffset));
-  __ movq(R10, Address(RSI, VMHandles::kOffsetOfRawPtrInHandle));
+  __ movq(kArgDescReg, Address(RBP, kArgumentsDescOffset));
+  __ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
   __ movq(RDX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
   // Get rid of arguments pushed on the stack.
   __ leaq(RSP, Address(RSP, RDX, TIMES_4, 0));  // RDX is a Smi.
 
   // Load Isolate pointer from Context structure into CTX. Drop Context.
-  __ movq(CTX, FieldAddress(CTX, Context::isolate_offset()));
+  __ movq(kIsolateReg, FieldAddress(CTX, Context::isolate_offset()));
 
   // Restore the saved Context pointer into the Isolate structure.
-  // Uses RCX as a temporary register for this.
-  __ popq(RCX);
-  __ movq(Address(CTX, Isolate::top_context_offset()), RCX);
+  __ popq(RDX);
+  __ movq(Address(kIsolateReg, Isolate::top_context_offset()), RDX);
 
   // Restore the saved top exit frame info back into the Isolate structure.
-  // Uses RDX as a temporary register for this.
   __ popq(RDX);
-  __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), RDX);
+  __ movq(Address(kIsolateReg, Isolate::top_exit_frame_info_offset()), RDX);
 
   // Restore the current VMTag from the stack.
   __ popq(RDX);
-  __ movq(Address(CTX, Isolate::vm_tag_offset()), RDX);
+  __ movq(Address(kIsolateReg, Isolate::vm_tag_offset()), RDX);
 
   // Restore C++ ABI callee-saved registers.
-  __ popq(R15);
-  __ popq(R14);
-  __ popq(R13);
-  __ popq(R12);
-  __ popq(RBX);
+  __ PopRegisters(CallingConventions::kCalleeSaveCpuRegisters,
+                  CallingConventions::kCalleeSaveXmmRegisters);
 
   // Restore the frame pointer.
   __ LeaveFrame();
@@ -1006,7 +1040,8 @@
   __ Bind(&L);
   // Setup frame, push callee-saved registers.
   __ EnterCallRuntimeFrame(0);
-  __ movq(RDI, FieldAddress(CTX, Context::isolate_offset()));
+  __ movq(CallingConventions::kArg1Reg,
+          FieldAddress(CTX, Context::isolate_offset()));
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   __ LeaveCallRuntimeFrame();
   __ ret();
@@ -1187,7 +1222,7 @@
     __ popq(func_reg);     // Restore.
     __ LeaveStubFrame();
   }
-  __ incq(FieldAddress(func_reg, Function::usage_counter_offset()));
+  __ incl(FieldAddress(func_reg, Function::usage_counter_offset()));
 }
 
 
@@ -1198,7 +1233,7 @@
   Register func_reg = temp_reg;
   ASSERT(ic_reg != func_reg);
   __ movq(func_reg, FieldAddress(ic_reg, ICData::owner_offset()));
-  __ incq(FieldAddress(func_reg, Function::usage_counter_offset()));
+  __ incl(FieldAddress(func_reg, Function::usage_counter_offset()));
 }
 
 
@@ -1249,7 +1284,7 @@
   // Load arguments descriptor into R10.
   __ movq(R10, FieldAddress(RBX, ICData::arguments_descriptor_offset()));
   // Loop that checks if there is an IC data match.
-  Label loop, update, test, found, get_class_id_as_smi;
+  Label loop, update, test, found;
   // RBX: IC data object (preserved).
   __ movq(R12, FieldAddress(RBX, ICData::ic_data_offset()));
   // R12: ic_data_array with check entries: classes and target functions.
@@ -1260,7 +1295,7 @@
   // arguments descriptor array and then access the receiver from the stack).
   __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
   __ movq(RAX, Address(RSP, RAX, TIMES_4, 0));  // RAX (argument count) is Smi.
-  __ call(&get_class_id_as_smi);
+  __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
   // RAX: receiver's class ID as smi.
   __ movq(R13, Address(R12, 0));  // First class ID (Smi) to check.
   __ jmp(&test);
@@ -1271,7 +1306,7 @@
       // If not the first, load the next argument's class ID.
       __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
       __ movq(RAX, Address(RSP, RAX, TIMES_4, - i * kWordSize));
-      __ call(&get_class_id_as_smi);
+      __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
       // RAX: next argument class ID (smi).
       __ movq(R13, Address(R12, i * kWordSize));
       // R13: next class ID to check (smi).
@@ -1289,7 +1324,7 @@
   if (num_args > 1) {
     __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
     __ movq(RAX, Address(RSP, RAX, TIMES_4, 0));
-    __ call(&get_class_id_as_smi);
+    __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1344,19 +1379,6 @@
   __ movq(RCX, FieldAddress(RAX, Function::instructions_offset()));
   __ addq(RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(RCX);
-
-  __ Bind(&get_class_id_as_smi);
-  Label not_smi;
-  // Test if Smi -> load Smi class for comparison.
-  __ testq(RAX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
-  __ movq(RAX, Immediate(Smi::RawValue(kSmiCid)));
-  __ ret();
-
-  __ Bind(&not_smi);
-  __ LoadClassId(RAX, RAX);
-  __ SmiTag(RAX);
-  __ ret();
 }
 
 
@@ -1579,9 +1601,9 @@
     // Compute instance type arguments into R13.
     Label has_no_type_arguments;
     __ movq(R13, R12);
-    __ movq(RDI, FieldAddress(R10,
+    __ movl(RDI, FieldAddress(R10,
         Class::type_arguments_field_offset_in_words_offset()));
-    __ cmpq(RDI, Immediate(Class::kNoTypeArguments));
+    __ cmpl(RDI, Immediate(Class::kNoTypeArguments));
     __ j(EQUAL, &has_no_type_arguments, Assembler::kNearJump);
     __ movq(R13, FieldAddress(RAX, RDI, TIMES_8, 0));
     __ Bind(&has_no_type_arguments);
@@ -1681,20 +1703,30 @@
 
 // Jump to the exception or error handler.
 // TOS + 0: return address
-// RDI: program counter
-// RSI: stack pointer
-// RDX: frame_pointer
-// RCX: exception object
-// R8: stacktrace object
+// Arg1: program counter
+// Arg2: stack pointer
+// Arg3: frame_pointer
+// Arg4: exception object
+// Arg5: stacktrace object
 // No Result.
 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
   ASSERT(kExceptionObjectReg == RAX);
   ASSERT(kStackTraceObjectReg == RDX);
-  __ movq(RBP, RDX);  // target frame pointer.
-  __ movq(kStackTraceObjectReg, R8);  // stacktrace object.
-  __ movq(kExceptionObjectReg, RCX);  // exception object.
-  __ movq(RSP, RSI);   // target stack_pointer.
-  __ jmp(RDI);  // Jump to the exception handler code.
+  ASSERT(CallingConventions::kArg4Reg != kStackTraceObjectReg);
+  ASSERT(CallingConventions::kArg1Reg != kStackTraceObjectReg);
+
+#if defined(_WIN64)
+  Register stacktrace_reg = RBX;
+  __ movq(stacktrace_reg, Address(RSP, 5 * kWordSize));
+#else
+  Register stacktrace_reg = CallingConventions::kArg5Reg;
+#endif
+
+  __ movq(RBP, CallingConventions::kArg3Reg);
+  __ movq(RSP, CallingConventions::kArg2Reg);
+  __ movq(kStackTraceObjectReg, stacktrace_reg);
+  __ movq(kExceptionObjectReg, CallingConventions::kArg4Reg);
+  __ jmp(CallingConventions::kArg1Reg);  // Jump to the exception handler code.
 }
 
 
@@ -1770,8 +1802,8 @@
   __ j(NOT_EQUAL, &done, Assembler::kNearJump);
   __ EnterFrame(0);
   __ ReserveAlignedFrameSpace(0);
-  __ movq(RDI, left);
-  __ movq(RSI, right);
+  __ movq(CallingConventions::kArg1Reg, left);
+  __ movq(CallingConventions::kArg2Reg, right);
   __ CallRuntime(kBigintCompareRuntimeEntry, 2);
   // Result in RAX, 0 means equal.
   __ LeaveFrame();
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index f1c43b1..56b56fc 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -86,8 +86,8 @@
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
   __ enter(Immediate(0));
   __ ReserveAlignedFrameSpace(0);
-  __ LoadObject(RDI, smi1, PP);  // Set up argument 1 smi1.
-  __ LoadObject(RSI, smi2, PP);  // Set up argument 2 smi2.
+  __ LoadObject(CallingConventions::kArg1Reg, smi1, PP);
+  __ LoadObject(CallingConventions::kArg2Reg, smi2, PP);
   __ CallRuntime(kTestLeafSmiAddRuntimeEntry, 2);  // Call SmiAdd runtime func.
   __ leave();
   __ ret();  // Return value is in RAX.
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index ddfc19c..ed1cdd6 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -231,6 +231,7 @@
   V(_ExternalFloat64x2Array, "_ExternalFloat64x2Array")                        \
   V(ByteData, "ByteData")                                                      \
   V(ByteDataDot, "ByteData.")                                                  \
+  V(ByteDataDot_view, "ByteData._view")                                        \
   V(ByteDataDotview, "ByteData.view")                                          \
   V(_ByteDataView, "_ByteDataView")                                            \
   V(_WeakProperty, "_WeakProperty")                                            \
@@ -315,13 +316,13 @@
   V(_leftShiftWithMask32, "_leftShiftWithMask32")                              \
   V(OptimizedOut, "<optimized out>")                                           \
   V(NotInitialized, "<not initialized>")                                       \
-  V(ClassId, "get:_classId")                                                   \
   V(AllocationStubFor, "Allocation stub for ")                                 \
   V(TempParam, ":temp_param")                                                  \
   V(UserTag, "UserTag")                                                        \
   V(_UserTag, "_UserTag")                                                      \
   V(Default, "Default")                                                        \
   V(StubPrefix, "[Stub] ")                                                     \
+  V(ClassID, "ClassID")                                                        \
 
 
 // Contains a list of frequently used strings in a canonicalized form. This
diff --git a/runtime/vm/thread_interrupter_win.cc b/runtime/vm/thread_interrupter_win.cc
index b39c188..ef9223f 100644
--- a/runtime/vm/thread_interrupter_win.cc
+++ b/runtime/vm/thread_interrupter_win.cc
@@ -26,9 +26,9 @@
       state->fp = static_cast<uintptr_t>(context.Ebp);
       state->sp = static_cast<uintptr_t>(context.Esp);
 #elif defined(TARGET_ARCH_X64)
-      state->pc = reinterpret_cast<uintptr_t>(context.Rip);
-      state->fp = reinterpret_cast<uintptr_t>(context.Rbp);
-      state->sp = reinterpret_cast<uintptr_t>(context.Rsp);
+      state->pc = static_cast<uintptr_t>(context.Rip);
+      state->fp = static_cast<uintptr_t>(context.Rbp);
+      state->sp = static_cast<uintptr_t>(context.Rsp);
 #else
       UNIMPLEMENTED();
 #endif
diff --git a/runtime/vm/trace_buffer.cc b/runtime/vm/trace_buffer.cc
index 831e95d..2022e49 100644
--- a/runtime/vm/trace_buffer.cc
+++ b/runtime/vm/trace_buffer.cc
@@ -2,15 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include "vm/isolate.h"
 #include "vm/json_stream.h"
+#include "vm/object.h"
 #include "vm/os.h"
 #include "vm/trace_buffer.h"
 
 namespace dart {
 
-TraceBuffer::TraceBuffer(intptr_t capacity) : ring_capacity_(capacity) {
+TraceBuffer::TraceBuffer(Isolate* isolate, intptr_t capacity)
+    : isolate_(isolate), ring_capacity_(capacity) {
   ring_cursor_ = 0;
-  Init();
+  ring_ = reinterpret_cast<TraceBufferEntry*>(
+      calloc(ring_capacity_, sizeof(TraceBufferEntry)));  // NOLINT
 }
 
 
@@ -18,12 +22,16 @@
   ASSERT(ring_ != NULL);
   Clear();
   free(ring_);
+  if (isolate_ != NULL) {
+    isolate_->set_trace_buffer(NULL);
+    isolate_ = NULL;
+  }
 }
 
 
-void TraceBuffer::Init() {
-  ring_ = reinterpret_cast<TraceBufferEntry*>(
-      calloc(ring_capacity_, sizeof(TraceBufferEntry)));  // NOLINT
+void TraceBuffer::Init(Isolate* isolate, intptr_t capacity) {
+  TraceBuffer* trace_buffer = new TraceBuffer(isolate, capacity);
+  isolate->set_trace_buffer(trace_buffer);
 }
 
 
@@ -33,50 +41,53 @@
     entry.micros = 0;
     free(entry.message);
     entry.message = NULL;
+    entry.message_is_escaped = false;
   }
   ring_cursor_ = 0;
 }
 
 
-void TraceBuffer::Fill(TraceBufferEntry* entry, int64_t micros, char* msg) {
+void TraceBuffer::Fill(TraceBufferEntry* entry, int64_t micros,
+                       char* msg, bool msg_is_escaped) {
   if (entry->message != NULL) {
     // Recycle TraceBufferEntry.
     free(entry->message);
   }
   entry->message = msg;
+  entry->message_is_escaped = msg_is_escaped;
   entry->micros = micros;
 }
 
 
-void TraceBuffer::AppendTrace(int64_t micros, char* message) {
+void TraceBuffer::AppendTrace(int64_t micros, char* msg, bool msg_is_escaped) {
   const intptr_t index = ring_cursor_;
   TraceBufferEntry* trace_entry = &ring_[index];
-  Fill(trace_entry, micros, message);
+  Fill(trace_entry, micros, msg, msg_is_escaped);
   ring_cursor_ = RingIndex(ring_cursor_ + 1);
 }
 
 
-void TraceBuffer::Trace(int64_t micros, const char* message) {
-  ASSERT(message != NULL);
-  char* message_copy = strdup(message);
-  AppendTrace(micros, message_copy);
+void TraceBuffer::Trace(int64_t micros, const char* msg, bool msg_is_escaped) {
+  ASSERT(msg != NULL);
+  char* message_copy = strdup(msg);
+  AppendTrace(micros, message_copy, msg_is_escaped);
 }
 
 
-void TraceBuffer::Trace(const char* message) {
-  Trace(OS::GetCurrentTimeMicros(), message);
+void TraceBuffer::Trace(const char* msg, bool msg_is_escaped) {
+  Trace(OS::GetCurrentTimeMicros(), msg, msg_is_escaped);
 }
 
 
 void TraceBuffer::TraceF(const char* format, ...) {
-  int64_t micros = OS::GetCurrentTimeMicros();
+  const int64_t micros = OS::GetCurrentTimeMicros();
   va_list args;
   va_start(args, format);
-  intptr_t len = OS::VSNPrint(NULL, 0, format, args);
+  const intptr_t len = OS::VSNPrint(NULL, 0, format, args);
   va_end(args);
   char* p = reinterpret_cast<char*>(malloc(len+1));
   va_start(args, format);
-  intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
+  const intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
   va_end(args);
   ASSERT(len == len2);
   AppendTrace(micros, p);
@@ -114,7 +125,11 @@
     double seconds = static_cast<double>(entry.micros) /
                      static_cast<double>(kMicrosecondsPerSecond);
     trace_entry.AddProperty("time", seconds);
-    trace_entry.AddProperty("message", entry.message);
+    if (entry.message_is_escaped) {
+      trace_entry.AddPropertyNoEscape("message", entry.message);
+    } else {
+      trace_entry.AddProperty("message", entry.message);
+    }
   }
 }
 
diff --git a/runtime/vm/trace_buffer.h b/runtime/vm/trace_buffer.h
index f8b1c78..4c3c74c 100644
--- a/runtime/vm/trace_buffer.h
+++ b/runtime/vm/trace_buffer.h
@@ -12,10 +12,12 @@
 namespace dart {
 
 class JSONStream;
+class Script;
 
 struct TraceBufferEntry {
   int64_t micros;
   char* message;
+  bool message_is_escaped;
   bool empty() const {
     return message == NULL;
   }
@@ -25,25 +27,32 @@
  public:
   static const intptr_t kDefaultCapacity = 1024;
 
-  explicit TraceBuffer(intptr_t capacity = kDefaultCapacity);
+  static void Init(Isolate* isolate, intptr_t capacity = kDefaultCapacity);
+
   ~TraceBuffer();
 
   void Clear();
 
   // Internally message is copied.
-  void Trace(int64_t micros, const char* message);
+  void Trace(int64_t micros, const char* msg, bool msg_is_escaped = false);
   // Internally message is copied.
-  void Trace(const char* message);
+  void Trace(const char* msg, bool msg_is_escaped = false);
   void TraceF(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
 
   void PrintToJSONStream(JSONStream* stream) const;
 
- private:
-  void Init();
-  void Cleanup();
-  void Fill(TraceBufferEntry* entry, int64_t micros, char* msg);
-  void AppendTrace(int64_t micros, char* message);
+  // Accessors for testing.
+  TraceBufferEntry* At(intptr_t i) const { return &ring_[RingIndex(i)]; }
+  intptr_t Length() const { return ring_cursor_; }
 
+ private:
+  TraceBuffer(Isolate* isolate, intptr_t capacity);
+  void Cleanup();
+  void Fill(TraceBufferEntry* entry, int64_t micros,
+            char* msg, bool msg_is_escaped = false);
+  void AppendTrace(int64_t micros, char* msg, bool msg_is_escaped = false);
+
+  Isolate* isolate_;
   TraceBufferEntry* ring_;
   const intptr_t ring_capacity_;
   intptr_t ring_cursor_;
diff --git a/runtime/vm/trace_buffer_test.cc b/runtime/vm/trace_buffer_test.cc
index 1284876..f85941f 100644
--- a/runtime/vm/trace_buffer_test.cc
+++ b/runtime/vm/trace_buffer_test.cc
@@ -10,9 +10,10 @@
 
 namespace dart {
 
-
-UNIT_TEST_CASE(TraceBufferEmpty) {
-  TraceBuffer* trace_buffer = new TraceBuffer(3);
+TEST_CASE(TraceBufferEmpty) {
+  Isolate* isolate = Isolate::Current();
+  TraceBuffer::Init(isolate, 3);
+  TraceBuffer* trace_buffer = isolate->trace_buffer();
   {
     JSONStream js;
     trace_buffer->PrintToJSONStream(&js);
@@ -22,8 +23,10 @@
 }
 
 
-UNIT_TEST_CASE(TraceBufferClear) {
-  TraceBuffer* trace_buffer = new TraceBuffer(3);
+TEST_CASE(TraceBufferClear) {
+  Isolate* isolate = Isolate::Current();
+  TraceBuffer::Init(isolate, 3);
+  TraceBuffer* trace_buffer = isolate->trace_buffer();
   trace_buffer->Trace(kMicrosecondsPerSecond * 1, "abc");
   trace_buffer->Clear();
   {
@@ -35,8 +38,10 @@
 }
 
 
-UNIT_TEST_CASE(TraceBufferTrace) {
-  TraceBuffer* trace_buffer = new TraceBuffer(3);
+TEST_CASE(TraceBufferTrace) {
+  Isolate* isolate = Isolate::Current();
+  TraceBuffer::Init(isolate, 3);
+  TraceBuffer* trace_buffer = isolate->trace_buffer();
 
   trace_buffer->Trace(kMicrosecondsPerSecond * 1, "abc");
   {
@@ -85,8 +90,10 @@
 }
 
 
-UNIT_TEST_CASE(TraceBufferTraceF) {
-  TraceBuffer* trace_buffer = new TraceBuffer(3);
+TEST_CASE(TraceBufferTraceF) {
+  Isolate* isolate = Isolate::Current();
+  TraceBuffer::Init(isolate, 3);
+  TraceBuffer* trace_buffer = isolate->trace_buffer();
   trace_buffer->TraceF("foo %d %s", 99, "bar");
   {
     JSONStream js;
@@ -96,5 +103,4 @@
   delete trace_buffer;
 }
 
-
 }  // namespace dart
diff --git a/runtime/vm/vm.gypi b/runtime/vm/vm.gypi
index 3bc5407..fc981ef 100644
--- a/runtime/vm/vm.gypi
+++ b/runtime/vm/vm.gypi
@@ -125,6 +125,7 @@
         '../lib/mirrors_sources.gypi',
         '../lib/typed_data_sources.gypi',
         '../lib/profiler_sources.gypi',
+        '../lib/internal_sources.gypi',
       ],
       'sources': [
         'bootstrap.cc',
@@ -167,6 +168,7 @@
         '../lib/mirrors_sources.gypi',
         '../lib/typed_data_sources.gypi',
         '../lib/profiler_sources.gypi',
+        '../lib/internal_sources.gypi',
       ],
       'sources': [
         'bootstrap_nocorelib.cc',
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 18a871b..de8a4ae 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -98,8 +98,11 @@
     'constants_ia32.h',
     'constants_mips.h',
     'constants_x64.h',
+    'counters.cc',
+    'counters.h',
     'coverage.cc',
     'coverage.h',
+    'coverage_test.cc',
     'cpu.h',
     'cpu_arm.cc',
     'cpu_arm64.cc',
@@ -314,6 +317,9 @@
     'raw_object.cc',
     'raw_object.h',
     'raw_object_snapshot.cc',
+    'report.cc',
+    'report.h',
+    'report_test.cc',
     'resolver.cc',
     'resolver.h',
     'resolver_test.cc',
diff --git a/runtime/vm/zone_test.cc b/runtime/vm/zone_test.cc
index cf42722..31ec786 100644
--- a/runtime/vm/zone_test.cc
+++ b/runtime/vm/zone_test.cc
@@ -129,6 +129,7 @@
   class SimpleZoneObject : public ZoneAllocated {
    public:
     SimpleZoneObject() : slot(marker++) { }
+    virtual ~SimpleZoneObject() { }
     virtual int GetSlot() { return slot; }
     int slot;
   };
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index f32673f..e1255d4 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -40,8224 +40,9473 @@
 
 
 
-Native_ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback(mthis, mode, first, count, primcount) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback_RESOLVER_STRING_4_unsigned long_long_long_long";
+class BlinkANGLEInstancedArrays {
+  static $drawArraysInstancedANGLE_Callback(mthis, mode, first, count, primcount) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback_RESOLVER_STRING_4_unsigned long_long_long_long";
 
-Native_ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback(mthis, mode, count, type, offset, primcount) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback_RESOLVER_STRING_5_unsigned long_long_unsigned long_long long_long";
+  static $drawElementsInstancedANGLE_Callback(mthis, mode, count, type, offset, primcount) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback_RESOLVER_STRING_5_unsigned long_long_unsigned long_long long_long";
 
-Native_ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback(mthis, index, divisor) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback_RESOLVER_STRING_2_unsigned long_long";
+  static $vertexAttribDivisorANGLE_Callback(mthis, index, divisor) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback_RESOLVER_STRING_2_unsigned long_long";
+}
 
-Native_Algorithm_name_Getter(mthis) native "KeyAlgorithm_name_Getter";
+class BlinkAbstractWorker {}
 
-Native_EventTarget_addEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_addEventListener_Callback_RESOLVER_STRING_3_DOMString_EventListener_boolean";
+class BlinkAlgorithm {
+  static $name_Getter(mthis) native "KeyAlgorithm_name_Getter";
+}
 
-Native_EventTarget_dispatchEvent_Callback(mthis, event) native "EventTarget_dispatchEvent_Callback_RESOLVER_STRING_1_Event";
+class BlinkEventTarget {
+  static $addEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_addEventListener_Callback_RESOLVER_STRING_3_DOMString_EventListener_boolean";
 
-Native_EventTarget_removeEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_removeEventListener_Callback_RESOLVER_STRING_3_DOMString_EventListener_boolean";
+  static $dispatchEvent_Callback(mthis, event) native "EventTarget_dispatchEvent_Callback_RESOLVER_STRING_1_Event";
 
-Native_AudioNode_channelCount_Getter(mthis) native "AudioNode_channelCount_Getter";
+  static $removeEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_removeEventListener_Callback_RESOLVER_STRING_3_DOMString_EventListener_boolean";
+}
 
-Native_AudioNode_channelCount_Setter(mthis, value) native "AudioNode_channelCount_Setter";
+class BlinkAudioNode {
+  static $channelCount_Getter(mthis) native "AudioNode_channelCount_Getter";
 
-Native_AudioNode_channelCountMode_Getter(mthis) native "AudioNode_channelCountMode_Getter";
+  static $channelCount_Setter(mthis, value) native "AudioNode_channelCount_Setter";
 
-Native_AudioNode_channelCountMode_Setter(mthis, value) native "AudioNode_channelCountMode_Setter";
+  static $channelCountMode_Getter(mthis) native "AudioNode_channelCountMode_Getter";
 
-Native_AudioNode_channelInterpretation_Getter(mthis) native "AudioNode_channelInterpretation_Getter";
+  static $channelCountMode_Setter(mthis, value) native "AudioNode_channelCountMode_Setter";
 
-Native_AudioNode_channelInterpretation_Setter(mthis, value) native "AudioNode_channelInterpretation_Setter";
+  static $channelInterpretation_Getter(mthis) native "AudioNode_channelInterpretation_Getter";
 
-Native_AudioNode_context_Getter(mthis) native "AudioNode_context_Getter";
+  static $channelInterpretation_Setter(mthis, value) native "AudioNode_channelInterpretation_Setter";
 
-Native_AudioNode_numberOfInputs_Getter(mthis) native "AudioNode_numberOfInputs_Getter";
+  static $context_Getter(mthis) native "AudioNode_context_Getter";
 
-Native_AudioNode_numberOfOutputs_Getter(mthis) native "AudioNode_numberOfOutputs_Getter";
+  static $numberOfInputs_Getter(mthis) native "AudioNode_numberOfInputs_Getter";
+
+  static $numberOfOutputs_Getter(mthis) native "AudioNode_numberOfOutputs_Getter";
 
   // Generated overload resolver
-Native_AudioNode__connect(mthis, destination, output, input) {
+  static $_connect(mthis, destination, output, input) {
     if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode || destination == null)) {
-      Native_AudioNode__connect_1_Callback(mthis, destination, output, input);
+      $_connect_1_Callback(mthis, destination, output, input);
       return;
     }
     if ((output is int || output == null) && (destination is AudioParam || destination == null) && input == null) {
-      Native_AudioNode__connect_2_Callback(mthis, destination, output);
+      $_connect_2_Callback(mthis, destination, output);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_AudioNode__connect_1_Callback(mthis, destination, output, input) native "AudioNode_connect_Callback_RESOLVER_STRING_3_AudioNode_unsigned long_unsigned long";
+  static $_connect_1_Callback(mthis, destination, output, input) native "AudioNode_connect_Callback_RESOLVER_STRING_3_AudioNode_unsigned long_unsigned long";
 
-Native_AudioNode__connect_2_Callback(mthis, destination, output) native "AudioNode_connect_Callback_RESOLVER_STRING_2_AudioParam_unsigned long";
+  static $_connect_2_Callback(mthis, destination, output) native "AudioNode_connect_Callback_RESOLVER_STRING_2_AudioParam_unsigned long";
 
-Native_AudioNode_disconnect_Callback(mthis, output) native "AudioNode_disconnect_Callback_RESOLVER_STRING_1_unsigned long";
+  static $disconnect_Callback(mthis, output) native "AudioNode_disconnect_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_AnalyserNode_fftSize_Getter(mthis) native "AnalyserNode_fftSize_Getter";
+class BlinkAnalyserNode {
+  static $fftSize_Getter(mthis) native "AnalyserNode_fftSize_Getter";
 
-Native_AnalyserNode_fftSize_Setter(mthis, value) native "AnalyserNode_fftSize_Setter";
+  static $fftSize_Setter(mthis, value) native "AnalyserNode_fftSize_Setter";
 
-Native_AnalyserNode_frequencyBinCount_Getter(mthis) native "AnalyserNode_frequencyBinCount_Getter";
+  static $frequencyBinCount_Getter(mthis) native "AnalyserNode_frequencyBinCount_Getter";
 
-Native_AnalyserNode_maxDecibels_Getter(mthis) native "AnalyserNode_maxDecibels_Getter";
+  static $maxDecibels_Getter(mthis) native "AnalyserNode_maxDecibels_Getter";
 
-Native_AnalyserNode_maxDecibels_Setter(mthis, value) native "AnalyserNode_maxDecibels_Setter";
+  static $maxDecibels_Setter(mthis, value) native "AnalyserNode_maxDecibels_Setter";
 
-Native_AnalyserNode_minDecibels_Getter(mthis) native "AnalyserNode_minDecibels_Getter";
+  static $minDecibels_Getter(mthis) native "AnalyserNode_minDecibels_Getter";
 
-Native_AnalyserNode_minDecibels_Setter(mthis, value) native "AnalyserNode_minDecibels_Setter";
+  static $minDecibels_Setter(mthis, value) native "AnalyserNode_minDecibels_Setter";
 
-Native_AnalyserNode_smoothingTimeConstant_Getter(mthis) native "AnalyserNode_smoothingTimeConstant_Getter";
+  static $smoothingTimeConstant_Getter(mthis) native "AnalyserNode_smoothingTimeConstant_Getter";
 
-Native_AnalyserNode_smoothingTimeConstant_Setter(mthis, value) native "AnalyserNode_smoothingTimeConstant_Setter";
+  static $smoothingTimeConstant_Setter(mthis, value) native "AnalyserNode_smoothingTimeConstant_Setter";
 
-Native_AnalyserNode_getByteFrequencyData_Callback(mthis, array) native "AnalyserNode_getByteFrequencyData_Callback_RESOLVER_STRING_1_Uint8Array";
+  static $getByteFrequencyData_Callback(mthis, array) native "AnalyserNode_getByteFrequencyData_Callback_RESOLVER_STRING_1_Uint8Array";
 
-Native_AnalyserNode_getByteTimeDomainData_Callback(mthis, array) native "AnalyserNode_getByteTimeDomainData_Callback_RESOLVER_STRING_1_Uint8Array";
+  static $getByteTimeDomainData_Callback(mthis, array) native "AnalyserNode_getByteTimeDomainData_Callback_RESOLVER_STRING_1_Uint8Array";
 
-Native_AnalyserNode_getFloatFrequencyData_Callback(mthis, array) native "AnalyserNode_getFloatFrequencyData_Callback_RESOLVER_STRING_1_Float32Array";
+  static $getFloatFrequencyData_Callback(mthis, array) native "AnalyserNode_getFloatFrequencyData_Callback_RESOLVER_STRING_1_Float32Array";
+}
 
-Native_TimedItem_activeDuration_Getter(mthis) native "TimedItem_activeDuration_Getter";
+class BlinkTimedItem {
+  static $activeDuration_Getter(mthis) native "TimedItem_activeDuration_Getter";
 
-Native_TimedItem_currentIteration_Getter(mthis) native "TimedItem_currentIteration_Getter";
+  static $currentIteration_Getter(mthis) native "TimedItem_currentIteration_Getter";
 
-Native_TimedItem_duration_Getter(mthis) native "TimedItem_duration_Getter";
+  static $duration_Getter(mthis) native "TimedItem_duration_Getter";
 
-Native_TimedItem_endTime_Getter(mthis) native "TimedItem_endTime_Getter";
+  static $endTime_Getter(mthis) native "TimedItem_endTime_Getter";
 
-Native_TimedItem_localTime_Getter(mthis) native "TimedItem_localTime_Getter";
+  static $localTime_Getter(mthis) native "TimedItem_localTime_Getter";
 
-Native_TimedItem_player_Getter(mthis) native "TimedItem_player_Getter";
+  static $player_Getter(mthis) native "TimedItem_player_Getter";
 
-Native_TimedItem_startTime_Getter(mthis) native "TimedItem_startTime_Getter";
+  static $startTime_Getter(mthis) native "TimedItem_startTime_Getter";
+}
 
+class BlinkAnimation {
   // Generated overload resolver
-Native_Animation_Animation(target, keyframes, timingInput) {
+  static $mkAnimation(target, keyframes, timingInput) {
     if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      return Native_Animation__create_1constructorCallback(target, keyframes, timingInput);
+      return $_create_1constructorCallback(target, keyframes, timingInput);
     }
     if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      return Native_Animation__create_2constructorCallback(target, keyframes, timingInput);
+      return $_create_2constructorCallback(target, keyframes, timingInput);
     }
     if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
-      return Native_Animation__create_3constructorCallback(target, keyframes);
+      return $_create_3constructorCallback(target, keyframes);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Animation__create_1constructorCallback(target, keyframes, timingInput) native "Animation_constructorCallback_RESOLVER_STRING_3_Element_sequence<Dictionary>_Dictionary";
+  static $_create_1constructorCallback(target, keyframes, timingInput) native "Animation_constructorCallback_RESOLVER_STRING_3_Element_sequence<Dictionary>_Dictionary";
 
-Native_Animation__create_2constructorCallback(target, keyframes, timingInput) native "Animation_constructorCallback_RESOLVER_STRING_3_Element_sequence<Dictionary>_double";
+  static $_create_2constructorCallback(target, keyframes, timingInput) native "Animation_constructorCallback_RESOLVER_STRING_3_Element_sequence<Dictionary>_double";
 
-Native_Animation__create_3constructorCallback(target, keyframes) native "Animation_constructorCallback_RESOLVER_STRING_2_Element_sequence<Dictionary>";
+  static $_create_3constructorCallback(target, keyframes) native "Animation_constructorCallback_RESOLVER_STRING_2_Element_sequence<Dictionary>";
+}
 
-Native_ApplicationCache_status_Getter(mthis) native "ApplicationCache_status_Getter";
+class BlinkApplicationCache {
+  static $status_Getter(mthis) native "ApplicationCache_status_Getter";
 
-Native_ApplicationCache_abort_Callback(mthis) native "ApplicationCache_abort_Callback_RESOLVER_STRING_0_";
+  static $abort_Callback(mthis) native "ApplicationCache_abort_Callback_RESOLVER_STRING_0_";
 
-Native_ApplicationCache_swapCache_Callback(mthis) native "ApplicationCache_swapCache_Callback_RESOLVER_STRING_0_";
+  static $swapCache_Callback(mthis) native "ApplicationCache_swapCache_Callback_RESOLVER_STRING_0_";
 
-Native_ApplicationCache_update_Callback(mthis) native "ApplicationCache_update_Callback_RESOLVER_STRING_0_";
+  static $update_Callback(mthis) native "ApplicationCache_update_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Node_baseURI_Getter(mthis) native "Node_baseURI_Getter";
+class BlinkNode {
+  static $baseURI_Getter(mthis) native "Node_baseURI_Getter";
 
-Native_Node_childNodes_Getter(mthis) native "Node_childNodes_Getter";
+  static $childNodes_Getter(mthis) native "Node_childNodes_Getter";
 
-Native_Node_firstChild_Getter(mthis) native "Node_firstChild_Getter";
+  static $firstChild_Getter(mthis) native "Node_firstChild_Getter";
 
-Native_Node_lastChild_Getter(mthis) native "Node_lastChild_Getter";
+  static $lastChild_Getter(mthis) native "Node_lastChild_Getter";
 
-Native_Node_localName_Getter(mthis) native "Node_localName_Getter";
+  static $localName_Getter(mthis) native "Node_localName_Getter";
 
-Native_Node_namespaceURI_Getter(mthis) native "Node_namespaceURI_Getter";
+  static $namespaceURI_Getter(mthis) native "Node_namespaceURI_Getter";
 
-Native_Node_nextSibling_Getter(mthis) native "Node_nextSibling_Getter";
+  static $nextSibling_Getter(mthis) native "Node_nextSibling_Getter";
 
-Native_Node_nodeName_Getter(mthis) native "Node_nodeName_Getter";
+  static $nodeName_Getter(mthis) native "Node_nodeName_Getter";
 
-Native_Node_nodeType_Getter(mthis) native "Node_nodeType_Getter";
+  static $nodeType_Getter(mthis) native "Node_nodeType_Getter";
 
-Native_Node_nodeValue_Getter(mthis) native "Node_nodeValue_Getter";
+  static $nodeValue_Getter(mthis) native "Node_nodeValue_Getter";
 
-Native_Node_ownerDocument_Getter(mthis) native "Node_ownerDocument_Getter";
+  static $ownerDocument_Getter(mthis) native "Node_ownerDocument_Getter";
 
-Native_Node_parentElement_Getter(mthis) native "Node_parentElement_Getter";
+  static $parentElement_Getter(mthis) native "Node_parentElement_Getter";
 
-Native_Node_parentNode_Getter(mthis) native "Node_parentNode_Getter";
+  static $parentNode_Getter(mthis) native "Node_parentNode_Getter";
 
-Native_Node_previousSibling_Getter(mthis) native "Node_previousSibling_Getter";
+  static $previousSibling_Getter(mthis) native "Node_previousSibling_Getter";
 
-Native_Node_textContent_Getter(mthis) native "Node_textContent_Getter";
+  static $textContent_Getter(mthis) native "Node_textContent_Getter";
 
-Native_Node_textContent_Setter(mthis, value) native "Node_textContent_Setter";
+  static $textContent_Setter(mthis, value) native "Node_textContent_Setter";
 
-Native_Node_appendChild_Callback(mthis, newChild) native "Node_appendChild_Callback";
+  static $appendChild_Callback(mthis, newChild) native "Node_appendChild_Callback";
 
-Native_Node_cloneNode_Callback(mthis, deep) native "Node_cloneNode_Callback";
+  static $cloneNode_Callback(mthis, deep) native "Node_cloneNode_Callback";
 
-Native_Node_contains_Callback(mthis, other) native "Node_contains_Callback_RESOLVER_STRING_1_Node";
+  static $contains_Callback(mthis, other) native "Node_contains_Callback_RESOLVER_STRING_1_Node";
 
-Native_Node_hasChildNodes_Callback(mthis) native "Node_hasChildNodes_Callback_RESOLVER_STRING_0_";
+  static $hasChildNodes_Callback(mthis) native "Node_hasChildNodes_Callback_RESOLVER_STRING_0_";
 
-Native_Node_insertBefore_Callback(mthis, newChild, refChild) native "Node_insertBefore_Callback";
+  static $insertBefore_Callback(mthis, newChild, refChild) native "Node_insertBefore_Callback";
 
-Native_Node_removeChild_Callback(mthis, oldChild) native "Node_removeChild_Callback";
+  static $removeChild_Callback(mthis, oldChild) native "Node_removeChild_Callback";
 
-Native_Node_replaceChild_Callback(mthis, newChild, oldChild) native "Node_replaceChild_Callback";
+  static $replaceChild_Callback(mthis, newChild, oldChild) native "Node_replaceChild_Callback";
+}
 
-Native_Attr_localName_Getter(mthis) native "Attr_localName_Getter";
+class BlinkAttr {
+  static $localName_Getter(mthis) native "Attr_localName_Getter";
 
-Native_Attr_name_Getter(mthis) native "Attr_name_Getter";
+  static $name_Getter(mthis) native "Attr_name_Getter";
 
-Native_Attr_namespaceURI_Getter(mthis) native "Attr_namespaceURI_Getter";
+  static $namespaceURI_Getter(mthis) native "Attr_namespaceURI_Getter";
 
-Native_Attr_value_Getter(mthis) native "Attr_value_Getter";
+  static $value_Getter(mthis) native "Attr_value_Getter";
 
-Native_Attr_value_Setter(mthis, value) native "Attr_value_Setter";
+  static $value_Setter(mthis, value) native "Attr_value_Setter";
+}
 
-Native_AudioBuffer_duration_Getter(mthis) native "AudioBuffer_duration_Getter";
+class BlinkAudioBuffer {
+  static $duration_Getter(mthis) native "AudioBuffer_duration_Getter";
 
-Native_AudioBuffer_length_Getter(mthis) native "AudioBuffer_length_Getter";
+  static $length_Getter(mthis) native "AudioBuffer_length_Getter";
 
-Native_AudioBuffer_numberOfChannels_Getter(mthis) native "AudioBuffer_numberOfChannels_Getter";
+  static $numberOfChannels_Getter(mthis) native "AudioBuffer_numberOfChannels_Getter";
 
-Native_AudioBuffer_sampleRate_Getter(mthis) native "AudioBuffer_sampleRate_Getter";
+  static $sampleRate_Getter(mthis) native "AudioBuffer_sampleRate_Getter";
 
-Native_AudioBuffer_getChannelData_Callback(mthis, channelIndex) native "AudioBuffer_getChannelData_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getChannelData_Callback(mthis, channelIndex) native "AudioBuffer_getChannelData_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_AudioBufferSourceNode_buffer_Getter(mthis) native "AudioBufferSourceNode_buffer_Getter";
+class BlinkAudioSourceNode {}
 
-Native_AudioBufferSourceNode_buffer_Setter(mthis, value) native "AudioBufferSourceNode_buffer_Setter";
+class BlinkAudioBufferSourceNode {
+  static $buffer_Getter(mthis) native "AudioBufferSourceNode_buffer_Getter";
 
-Native_AudioBufferSourceNode_loop_Getter(mthis) native "AudioBufferSourceNode_loop_Getter";
+  static $buffer_Setter(mthis, value) native "AudioBufferSourceNode_buffer_Setter";
 
-Native_AudioBufferSourceNode_loop_Setter(mthis, value) native "AudioBufferSourceNode_loop_Setter";
+  static $loop_Getter(mthis) native "AudioBufferSourceNode_loop_Getter";
 
-Native_AudioBufferSourceNode_loopEnd_Getter(mthis) native "AudioBufferSourceNode_loopEnd_Getter";
+  static $loop_Setter(mthis, value) native "AudioBufferSourceNode_loop_Setter";
 
-Native_AudioBufferSourceNode_loopEnd_Setter(mthis, value) native "AudioBufferSourceNode_loopEnd_Setter";
+  static $loopEnd_Getter(mthis) native "AudioBufferSourceNode_loopEnd_Getter";
 
-Native_AudioBufferSourceNode_loopStart_Getter(mthis) native "AudioBufferSourceNode_loopStart_Getter";
+  static $loopEnd_Setter(mthis, value) native "AudioBufferSourceNode_loopEnd_Setter";
 
-Native_AudioBufferSourceNode_loopStart_Setter(mthis, value) native "AudioBufferSourceNode_loopStart_Setter";
+  static $loopStart_Getter(mthis) native "AudioBufferSourceNode_loopStart_Getter";
 
-Native_AudioBufferSourceNode_playbackRate_Getter(mthis) native "AudioBufferSourceNode_playbackRate_Getter";
+  static $loopStart_Setter(mthis, value) native "AudioBufferSourceNode_loopStart_Setter";
 
-Native_AudioBufferSourceNode_noteGrainOn_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_noteGrainOn_Callback_RESOLVER_STRING_3_double_double_double";
+  static $playbackRate_Getter(mthis) native "AudioBufferSourceNode_playbackRate_Getter";
 
-Native_AudioBufferSourceNode_noteOff_Callback(mthis, when) native "AudioBufferSourceNode_noteOff_Callback_RESOLVER_STRING_1_double";
+  static $noteGrainOn_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_noteGrainOn_Callback_RESOLVER_STRING_3_double_double_double";
 
-Native_AudioBufferSourceNode_noteOn_Callback(mthis, when) native "AudioBufferSourceNode_noteOn_Callback_RESOLVER_STRING_1_double";
+  static $noteOff_Callback(mthis, when) native "AudioBufferSourceNode_noteOff_Callback_RESOLVER_STRING_1_double";
+
+  static $noteOn_Callback(mthis, when) native "AudioBufferSourceNode_noteOn_Callback_RESOLVER_STRING_1_double";
 
   // Generated overload resolver
-Native_AudioBufferSourceNode_start(mthis, when, grainOffset, grainDuration) {
+  static $start(mthis, when, grainOffset, grainDuration) {
     if (grainDuration != null) {
-      Native_AudioBufferSourceNode__start_1_Callback(mthis, when, grainOffset, grainDuration);
+      $_start_1_Callback(mthis, when, grainOffset, grainDuration);
       return;
     }
     if (grainOffset != null) {
-      Native_AudioBufferSourceNode__start_2_Callback(mthis, when, grainOffset);
+      $_start_2_Callback(mthis, when, grainOffset);
       return;
     }
     if (when != null) {
-      Native_AudioBufferSourceNode__start_3_Callback(mthis, when);
+      $_start_3_Callback(mthis, when);
       return;
     }
-    Native_AudioBufferSourceNode__start_4_Callback(mthis);
+    $_start_4_Callback(mthis);
     return;
   }
 
-Native_AudioBufferSourceNode__start_1_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_3_double_double_double";
+  static $_start_1_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_3_double_double_double";
 
-Native_AudioBufferSourceNode__start_2_Callback(mthis, when, grainOffset) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_2_double_double";
+  static $_start_2_Callback(mthis, when, grainOffset) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_2_double_double";
 
-Native_AudioBufferSourceNode__start_3_Callback(mthis, when) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_1_double";
+  static $_start_3_Callback(mthis, when) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioBufferSourceNode__start_4_Callback(mthis) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_0_";
+  static $_start_4_Callback(mthis) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_AudioBufferSourceNode_stop(mthis, when) {
+  static $stop(mthis, when) {
     if (when != null) {
-      Native_AudioBufferSourceNode__stop_1_Callback(mthis, when);
+      $_stop_1_Callback(mthis, when);
       return;
     }
-    Native_AudioBufferSourceNode__stop_2_Callback(mthis);
+    $_stop_2_Callback(mthis);
     return;
   }
 
-Native_AudioBufferSourceNode__stop_1_Callback(mthis, when) native "AudioBufferSourceNode_stop_Callback_RESOLVER_STRING_1_double";
+  static $_stop_1_Callback(mthis, when) native "AudioBufferSourceNode_stop_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioBufferSourceNode__stop_2_Callback(mthis) native "AudioBufferSourceNode_stop_Callback_RESOLVER_STRING_0_";
+  static $_stop_2_Callback(mthis) native "AudioBufferSourceNode_stop_Callback_RESOLVER_STRING_0_";
+}
 
+class BlinkAudioContext {
   // Generated overload resolver
-Native_AudioContext_AudioContext() {
-    return Native_AudioContext__create_1constructorCallback();
+  static $mkAudioContext() {
+    return $_create_1constructorCallback();
   }
 
-Native_AudioContext__create_1constructorCallback() native "AudioContext_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "AudioContext_constructorCallback_RESOLVER_STRING_0_";
 
-Native_AudioContext_currentTime_Getter(mthis) native "AudioContext_currentTime_Getter";
+  static $currentTime_Getter(mthis) native "AudioContext_currentTime_Getter";
 
-Native_AudioContext_destination_Getter(mthis) native "AudioContext_destination_Getter";
+  static $destination_Getter(mthis) native "AudioContext_destination_Getter";
 
-Native_AudioContext_listener_Getter(mthis) native "AudioContext_listener_Getter";
+  static $listener_Getter(mthis) native "AudioContext_listener_Getter";
 
-Native_AudioContext_sampleRate_Getter(mthis) native "AudioContext_sampleRate_Getter";
+  static $sampleRate_Getter(mthis) native "AudioContext_sampleRate_Getter";
 
-Native_AudioContext_createAnalyser_Callback(mthis) native "AudioContext_createAnalyser_Callback_RESOLVER_STRING_0_";
+  static $createAnalyser_Callback(mthis) native "AudioContext_createAnalyser_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createBiquadFilter_Callback(mthis) native "AudioContext_createBiquadFilter_Callback_RESOLVER_STRING_0_";
+  static $createBiquadFilter_Callback(mthis) native "AudioContext_createBiquadFilter_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createBuffer_Callback(mthis, numberOfChannels, numberOfFrames, sampleRate) native "AudioContext_createBuffer_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
+  static $createBuffer_Callback(mthis, numberOfChannels, numberOfFrames, sampleRate) native "AudioContext_createBuffer_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
 
-Native_AudioContext_createBufferSource_Callback(mthis) native "AudioContext_createBufferSource_Callback_RESOLVER_STRING_0_";
+  static $createBufferSource_Callback(mthis) native "AudioContext_createBufferSource_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_AudioContext_createChannelMerger(mthis, numberOfInputs) {
+  static $createChannelMerger(mthis, numberOfInputs) {
     if (numberOfInputs != null) {
-      return Native_AudioContext__createChannelMerger_1_Callback(mthis, numberOfInputs);
+      return $_createChannelMerger_1_Callback(mthis, numberOfInputs);
     }
-    return Native_AudioContext__createChannelMerger_2_Callback(mthis);
+    return $_createChannelMerger_2_Callback(mthis);
   }
 
-Native_AudioContext__createChannelMerger_1_Callback(mthis, numberOfInputs) native "AudioContext_createChannelMerger_Callback_RESOLVER_STRING_1_unsigned long";
+  static $_createChannelMerger_1_Callback(mthis, numberOfInputs) native "AudioContext_createChannelMerger_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_AudioContext__createChannelMerger_2_Callback(mthis) native "AudioContext_createChannelMerger_Callback_RESOLVER_STRING_0_";
+  static $_createChannelMerger_2_Callback(mthis) native "AudioContext_createChannelMerger_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_AudioContext_createChannelSplitter(mthis, numberOfOutputs) {
+  static $createChannelSplitter(mthis, numberOfOutputs) {
     if (numberOfOutputs != null) {
-      return Native_AudioContext__createChannelSplitter_1_Callback(mthis, numberOfOutputs);
+      return $_createChannelSplitter_1_Callback(mthis, numberOfOutputs);
     }
-    return Native_AudioContext__createChannelSplitter_2_Callback(mthis);
+    return $_createChannelSplitter_2_Callback(mthis);
   }
 
-Native_AudioContext__createChannelSplitter_1_Callback(mthis, numberOfOutputs) native "AudioContext_createChannelSplitter_Callback_RESOLVER_STRING_1_unsigned long";
+  static $_createChannelSplitter_1_Callback(mthis, numberOfOutputs) native "AudioContext_createChannelSplitter_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_AudioContext__createChannelSplitter_2_Callback(mthis) native "AudioContext_createChannelSplitter_Callback_RESOLVER_STRING_0_";
+  static $_createChannelSplitter_2_Callback(mthis) native "AudioContext_createChannelSplitter_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createConvolver_Callback(mthis) native "AudioContext_createConvolver_Callback_RESOLVER_STRING_0_";
+  static $createConvolver_Callback(mthis) native "AudioContext_createConvolver_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_AudioContext_createDelay(mthis, maxDelayTime) {
+  static $createDelay(mthis, maxDelayTime) {
     if (maxDelayTime != null) {
-      return Native_AudioContext__createDelay_1_Callback(mthis, maxDelayTime);
+      return $_createDelay_1_Callback(mthis, maxDelayTime);
     }
-    return Native_AudioContext__createDelay_2_Callback(mthis);
+    return $_createDelay_2_Callback(mthis);
   }
 
-Native_AudioContext__createDelay_1_Callback(mthis, maxDelayTime) native "AudioContext_createDelay_Callback_RESOLVER_STRING_1_double";
+  static $_createDelay_1_Callback(mthis, maxDelayTime) native "AudioContext_createDelay_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioContext__createDelay_2_Callback(mthis) native "AudioContext_createDelay_Callback_RESOLVER_STRING_0_";
+  static $_createDelay_2_Callback(mthis) native "AudioContext_createDelay_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createDynamicsCompressor_Callback(mthis) native "AudioContext_createDynamicsCompressor_Callback_RESOLVER_STRING_0_";
+  static $createDynamicsCompressor_Callback(mthis) native "AudioContext_createDynamicsCompressor_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createGain_Callback(mthis) native "AudioContext_createGain_Callback_RESOLVER_STRING_0_";
+  static $createGain_Callback(mthis) native "AudioContext_createGain_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createMediaElementSource_Callback(mthis, mediaElement) native "AudioContext_createMediaElementSource_Callback_RESOLVER_STRING_1_HTMLMediaElement";
+  static $createMediaElementSource_Callback(mthis, mediaElement) native "AudioContext_createMediaElementSource_Callback_RESOLVER_STRING_1_HTMLMediaElement";
 
-Native_AudioContext_createMediaStreamDestination_Callback(mthis) native "AudioContext_createMediaStreamDestination_Callback_RESOLVER_STRING_0_";
+  static $createMediaStreamDestination_Callback(mthis) native "AudioContext_createMediaStreamDestination_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createMediaStreamSource_Callback(mthis, mediaStream) native "AudioContext_createMediaStreamSource_Callback_RESOLVER_STRING_1_MediaStream";
+  static $createMediaStreamSource_Callback(mthis, mediaStream) native "AudioContext_createMediaStreamSource_Callback_RESOLVER_STRING_1_MediaStream";
 
-Native_AudioContext_createOscillator_Callback(mthis) native "AudioContext_createOscillator_Callback_RESOLVER_STRING_0_";
+  static $createOscillator_Callback(mthis) native "AudioContext_createOscillator_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createPanner_Callback(mthis) native "AudioContext_createPanner_Callback_RESOLVER_STRING_0_";
+  static $createPanner_Callback(mthis) native "AudioContext_createPanner_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createPeriodicWave_Callback(mthis, real, imag) native "AudioContext_createPeriodicWave_Callback_RESOLVER_STRING_2_Float32Array_Float32Array";
+  static $createPeriodicWave_Callback(mthis, real, imag) native "AudioContext_createPeriodicWave_Callback_RESOLVER_STRING_2_Float32Array_Float32Array";
 
   // Generated overload resolver
-Native_AudioContext_createScriptProcessor(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) {
+  static $createScriptProcessor(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) {
     if (numberOfOutputChannels != null) {
-      return Native_AudioContext__createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels);
+      return $_createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels);
     }
     if (numberOfInputChannels != null) {
-      return Native_AudioContext__createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels);
+      return $_createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels);
     }
     if (bufferSize != null) {
-      return Native_AudioContext__createScriptProcessor_3_Callback(mthis, bufferSize);
+      return $_createScriptProcessor_3_Callback(mthis, bufferSize);
     }
-    return Native_AudioContext__createScriptProcessor_4_Callback(mthis);
+    return $_createScriptProcessor_4_Callback(mthis);
   }
 
-Native_AudioContext__createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_unsigned long";
+  static $_createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_unsigned long";
 
-Native_AudioContext__createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $_createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_AudioContext__createScriptProcessor_3_Callback(mthis, bufferSize) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_1_unsigned long";
+  static $_createScriptProcessor_3_Callback(mthis, bufferSize) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_AudioContext__createScriptProcessor_4_Callback(mthis) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_0_";
+  static $_createScriptProcessor_4_Callback(mthis) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createWaveShaper_Callback(mthis) native "AudioContext_createWaveShaper_Callback_RESOLVER_STRING_0_";
+  static $createWaveShaper_Callback(mthis) native "AudioContext_createWaveShaper_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_decodeAudioData_Callback(mthis, audioData, successCallback, errorCallback) native "AudioContext_decodeAudioData_Callback";
+  static $decodeAudioData_Callback(mthis, audioData, successCallback, errorCallback) native "AudioContext_decodeAudioData_Callback";
 
-Native_AudioContext_startRendering_Callback(mthis) native "AudioContext_startRendering_Callback_RESOLVER_STRING_0_";
+  static $startRendering_Callback(mthis) native "AudioContext_startRendering_Callback_RESOLVER_STRING_0_";
+}
 
-Native_AudioDestinationNode_maxChannelCount_Getter(mthis) native "AudioDestinationNode_maxChannelCount_Getter";
+class BlinkAudioDestinationNode {
+  static $maxChannelCount_Getter(mthis) native "AudioDestinationNode_maxChannelCount_Getter";
+}
 
-Native_AudioListener_dopplerFactor_Getter(mthis) native "AudioListener_dopplerFactor_Getter";
+class BlinkAudioListener {
+  static $dopplerFactor_Getter(mthis) native "AudioListener_dopplerFactor_Getter";
 
-Native_AudioListener_dopplerFactor_Setter(mthis, value) native "AudioListener_dopplerFactor_Setter";
+  static $dopplerFactor_Setter(mthis, value) native "AudioListener_dopplerFactor_Setter";
 
-Native_AudioListener_speedOfSound_Getter(mthis) native "AudioListener_speedOfSound_Getter";
+  static $speedOfSound_Getter(mthis) native "AudioListener_speedOfSound_Getter";
 
-Native_AudioListener_speedOfSound_Setter(mthis, value) native "AudioListener_speedOfSound_Setter";
+  static $speedOfSound_Setter(mthis, value) native "AudioListener_speedOfSound_Setter";
 
-Native_AudioListener_setOrientation_Callback(mthis, x, y, z, xUp, yUp, zUp) native "AudioListener_setOrientation_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $setOrientation_Callback(mthis, x, y, z, xUp, yUp, zUp) native "AudioListener_setOrientation_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_AudioListener_setPosition_Callback(mthis, x, y, z) native "AudioListener_setPosition_Callback_RESOLVER_STRING_3_float_float_float";
+  static $setPosition_Callback(mthis, x, y, z) native "AudioListener_setPosition_Callback_RESOLVER_STRING_3_float_float_float";
 
-Native_AudioListener_setVelocity_Callback(mthis, x, y, z) native "AudioListener_setVelocity_Callback_RESOLVER_STRING_3_float_float_float";
+  static $setVelocity_Callback(mthis, x, y, z) native "AudioListener_setVelocity_Callback_RESOLVER_STRING_3_float_float_float";
+}
 
-Native_AudioParam_defaultValue_Getter(mthis) native "AudioParam_defaultValue_Getter";
+class BlinkAudioParam {
+  static $defaultValue_Getter(mthis) native "AudioParam_defaultValue_Getter";
 
-Native_AudioParam_maxValue_Getter(mthis) native "AudioParam_maxValue_Getter";
+  static $maxValue_Getter(mthis) native "AudioParam_maxValue_Getter";
 
-Native_AudioParam_minValue_Getter(mthis) native "AudioParam_minValue_Getter";
+  static $minValue_Getter(mthis) native "AudioParam_minValue_Getter";
 
-Native_AudioParam_name_Getter(mthis) native "AudioParam_name_Getter";
+  static $name_Getter(mthis) native "AudioParam_name_Getter";
 
-Native_AudioParam_units_Getter(mthis) native "AudioParam_units_Getter";
+  static $units_Getter(mthis) native "AudioParam_units_Getter";
 
-Native_AudioParam_value_Getter(mthis) native "AudioParam_value_Getter";
+  static $value_Getter(mthis) native "AudioParam_value_Getter";
 
-Native_AudioParam_value_Setter(mthis, value) native "AudioParam_value_Setter";
+  static $value_Setter(mthis, value) native "AudioParam_value_Setter";
 
-Native_AudioParam_cancelScheduledValues_Callback(mthis, startTime) native "AudioParam_cancelScheduledValues_Callback_RESOLVER_STRING_1_double";
+  static $cancelScheduledValues_Callback(mthis, startTime) native "AudioParam_cancelScheduledValues_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioParam_exponentialRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_exponentialRampToValueAtTime_Callback_RESOLVER_STRING_2_float_double";
+  static $exponentialRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_exponentialRampToValueAtTime_Callback_RESOLVER_STRING_2_float_double";
 
-Native_AudioParam_linearRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_linearRampToValueAtTime_Callback_RESOLVER_STRING_2_float_double";
+  static $linearRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_linearRampToValueAtTime_Callback_RESOLVER_STRING_2_float_double";
 
-Native_AudioParam_setTargetAtTime_Callback(mthis, target, time, timeConstant) native "AudioParam_setTargetAtTime_Callback_RESOLVER_STRING_3_float_double_double";
+  static $setTargetAtTime_Callback(mthis, target, time, timeConstant) native "AudioParam_setTargetAtTime_Callback_RESOLVER_STRING_3_float_double_double";
 
-Native_AudioParam_setValueAtTime_Callback(mthis, value, time) native "AudioParam_setValueAtTime_Callback_RESOLVER_STRING_2_float_double";
+  static $setValueAtTime_Callback(mthis, value, time) native "AudioParam_setValueAtTime_Callback_RESOLVER_STRING_2_float_double";
 
-Native_AudioParam_setValueCurveAtTime_Callback(mthis, values, time, duration) native "AudioParam_setValueCurveAtTime_Callback";
+  static $setValueCurveAtTime_Callback(mthis, values, time, duration) native "AudioParam_setValueCurveAtTime_Callback";
+}
 
-Native_Event_bubbles_Getter(mthis) native "Event_bubbles_Getter";
+class BlinkEvent {
+  static $bubbles_Getter(mthis) native "Event_bubbles_Getter";
 
-Native_Event_cancelable_Getter(mthis) native "Event_cancelable_Getter";
+  static $cancelable_Getter(mthis) native "Event_cancelable_Getter";
 
-Native_Event_clipboardData_Getter(mthis) native "Event_clipboardData_Getter";
+  static $clipboardData_Getter(mthis) native "Event_clipboardData_Getter";
 
-Native_Event_currentTarget_Getter(mthis) native "Event_currentTarget_Getter";
+  static $currentTarget_Getter(mthis) native "Event_currentTarget_Getter";
 
-Native_Event_defaultPrevented_Getter(mthis) native "Event_defaultPrevented_Getter";
+  static $defaultPrevented_Getter(mthis) native "Event_defaultPrevented_Getter";
 
-Native_Event_eventPhase_Getter(mthis) native "Event_eventPhase_Getter";
+  static $eventPhase_Getter(mthis) native "Event_eventPhase_Getter";
 
-Native_Event_path_Getter(mthis) native "Event_path_Getter";
+  static $path_Getter(mthis) native "Event_path_Getter";
 
-Native_Event_target_Getter(mthis) native "Event_target_Getter";
+  static $target_Getter(mthis) native "Event_target_Getter";
 
-Native_Event_timeStamp_Getter(mthis) native "Event_timeStamp_Getter";
+  static $timeStamp_Getter(mthis) native "Event_timeStamp_Getter";
 
-Native_Event_type_Getter(mthis) native "Event_type_Getter";
+  static $type_Getter(mthis) native "Event_type_Getter";
 
-Native_Event_initEvent_Callback(mthis, eventTypeArg, canBubbleArg, cancelableArg) native "Event_initEvent_Callback_RESOLVER_STRING_3_DOMString_boolean_boolean";
+  static $initEvent_Callback(mthis, eventTypeArg, canBubbleArg, cancelableArg) native "Event_initEvent_Callback_RESOLVER_STRING_3_DOMString_boolean_boolean";
 
-Native_Event_preventDefault_Callback(mthis) native "Event_preventDefault_Callback_RESOLVER_STRING_0_";
+  static $preventDefault_Callback(mthis) native "Event_preventDefault_Callback_RESOLVER_STRING_0_";
 
-Native_Event_stopImmediatePropagation_Callback(mthis) native "Event_stopImmediatePropagation_Callback_RESOLVER_STRING_0_";
+  static $stopImmediatePropagation_Callback(mthis) native "Event_stopImmediatePropagation_Callback_RESOLVER_STRING_0_";
 
-Native_Event_stopPropagation_Callback(mthis) native "Event_stopPropagation_Callback_RESOLVER_STRING_0_";
+  static $stopPropagation_Callback(mthis) native "Event_stopPropagation_Callback_RESOLVER_STRING_0_";
+}
 
-Native_AudioProcessingEvent_inputBuffer_Getter(mthis) native "AudioProcessingEvent_inputBuffer_Getter";
+class BlinkAudioProcessingEvent {
+  static $inputBuffer_Getter(mthis) native "AudioProcessingEvent_inputBuffer_Getter";
 
-Native_AudioProcessingEvent_outputBuffer_Getter(mthis) native "AudioProcessingEvent_outputBuffer_Getter";
+  static $outputBuffer_Getter(mthis) native "AudioProcessingEvent_outputBuffer_Getter";
+}
 
-Native_AutocompleteErrorEvent_reason_Getter(mthis) native "AutocompleteErrorEvent_reason_Getter";
+class BlinkAutocompleteErrorEvent {
+  static $reason_Getter(mthis) native "AutocompleteErrorEvent_reason_Getter";
+}
 
-Native_BarProp_visible_Getter(mthis) native "BarProp_visible_Getter";
+class BlinkBarProp {
+  static $visible_Getter(mthis) native "BarProp_visible_Getter";
+}
 
-Native_BeforeUnloadEvent_returnValue_Getter(mthis) native "BeforeUnloadEvent_returnValue_Getter";
+class BlinkBeforeLoadEvent {}
 
-Native_BeforeUnloadEvent_returnValue_Setter(mthis, value) native "BeforeUnloadEvent_returnValue_Setter";
+class BlinkBeforeUnloadEvent {
+  static $returnValue_Getter(mthis) native "BeforeUnloadEvent_returnValue_Getter";
 
-Native_BiquadFilterNode_Q_Getter(mthis) native "BiquadFilterNode_Q_Getter";
+  static $returnValue_Setter(mthis, value) native "BeforeUnloadEvent_returnValue_Setter";
+}
 
-Native_BiquadFilterNode_detune_Getter(mthis) native "BiquadFilterNode_detune_Getter";
+class BlinkBiquadFilterNode {
+  static $Q_Getter(mthis) native "BiquadFilterNode_Q_Getter";
 
-Native_BiquadFilterNode_frequency_Getter(mthis) native "BiquadFilterNode_frequency_Getter";
+  static $detune_Getter(mthis) native "BiquadFilterNode_detune_Getter";
 
-Native_BiquadFilterNode_gain_Getter(mthis) native "BiquadFilterNode_gain_Getter";
+  static $frequency_Getter(mthis) native "BiquadFilterNode_frequency_Getter";
 
-Native_BiquadFilterNode_type_Getter(mthis) native "BiquadFilterNode_type_Getter";
+  static $gain_Getter(mthis) native "BiquadFilterNode_gain_Getter";
 
-Native_BiquadFilterNode_type_Setter(mthis, value) native "BiquadFilterNode_type_Setter";
+  static $type_Getter(mthis) native "BiquadFilterNode_type_Getter";
 
-Native_BiquadFilterNode_getFrequencyResponse_Callback(mthis, frequencyHz, magResponse, phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback_RESOLVER_STRING_3_Float32Array_Float32Array_Float32Array";
+  static $type_Setter(mthis, value) native "BiquadFilterNode_type_Setter";
 
-Native_Blob_constructorCallback(blobParts, type, endings) native "Blob_constructorCallback";
+  static $getFrequencyResponse_Callback(mthis, frequencyHz, magResponse, phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback_RESOLVER_STRING_3_Float32Array_Float32Array_Float32Array";
+}
 
-Native_Blob_size_Getter(mthis) native "Blob_size_Getter";
+class BlinkBlob {
+  static $constructorCallback(blobParts, type, endings) native "Blob_constructorCallback";
 
-Native_Blob_type_Getter(mthis) native "Blob_type_Getter";
+  static $size_Getter(mthis) native "Blob_size_Getter";
+
+  static $type_Getter(mthis) native "Blob_type_Getter";
 
   // Generated overload resolver
-Native_Blob_slice(mthis, start, end, contentType) {
+  static $slice(mthis, start, end, contentType) {
     if (contentType != null) {
-      return Native_Blob__slice_1_Callback(mthis, start, end, contentType);
+      return $_slice_1_Callback(mthis, start, end, contentType);
     }
     if (end != null) {
-      return Native_Blob__slice_2_Callback(mthis, start, end);
+      return $_slice_2_Callback(mthis, start, end);
     }
     if (start != null) {
-      return Native_Blob__slice_3_Callback(mthis, start);
+      return $_slice_3_Callback(mthis, start);
     }
-    return Native_Blob__slice_4_Callback(mthis);
+    return $_slice_4_Callback(mthis);
   }
 
-Native_Blob__slice_1_Callback(mthis, start, end, contentType) native "Blob_slice_Callback_RESOLVER_STRING_3_long long_long long_DOMString";
+  static $_slice_1_Callback(mthis, start, end, contentType) native "Blob_slice_Callback_RESOLVER_STRING_3_long long_long long_DOMString";
 
-Native_Blob__slice_2_Callback(mthis, start, end) native "Blob_slice_Callback_RESOLVER_STRING_2_long long_long long";
+  static $_slice_2_Callback(mthis, start, end) native "Blob_slice_Callback_RESOLVER_STRING_2_long long_long long";
 
-Native_Blob__slice_3_Callback(mthis, start) native "Blob_slice_Callback_RESOLVER_STRING_1_long long";
+  static $_slice_3_Callback(mthis, start) native "Blob_slice_Callback_RESOLVER_STRING_1_long long";
 
-Native_Blob__slice_4_Callback(mthis) native "Blob_slice_Callback_RESOLVER_STRING_0_";
+  static $_slice_4_Callback(mthis) native "Blob_slice_Callback_RESOLVER_STRING_0_";
+}
 
-Native_ChildNode_nextElementSibling_Getter(mthis) native "ChildNode_nextElementSibling_Getter";
+class BlinkChildNode {
+  static $nextElementSibling_Getter(mthis) native "ChildNode_nextElementSibling_Getter";
 
-Native_ChildNode_previousElementSibling_Getter(mthis) native "ChildNode_previousElementSibling_Getter";
+  static $previousElementSibling_Getter(mthis) native "ChildNode_previousElementSibling_Getter";
 
-Native_ChildNode_remove_Callback(mthis) native "ChildNode_remove_Callback_RESOLVER_STRING_0_";
+  static $remove_Callback(mthis) native "ChildNode_remove_Callback_RESOLVER_STRING_0_";
+}
 
-Native_CharacterData_data_Getter(mthis) native "CharacterData_data_Getter";
+class BlinkCharacterData {
+  static $data_Getter(mthis) native "CharacterData_data_Getter";
 
-Native_CharacterData_data_Setter(mthis, value) native "CharacterData_data_Setter";
+  static $data_Setter(mthis, value) native "CharacterData_data_Setter";
 
-Native_CharacterData_length_Getter(mthis) native "CharacterData_length_Getter";
+  static $length_Getter(mthis) native "CharacterData_length_Getter";
 
-Native_CharacterData_appendData_Callback(mthis, data) native "CharacterData_appendData_Callback_RESOLVER_STRING_1_DOMString";
+  static $appendData_Callback(mthis, data) native "CharacterData_appendData_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CharacterData_deleteData_Callback(mthis, offset, length) native "CharacterData_deleteData_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $deleteData_Callback(mthis, offset, length) native "CharacterData_deleteData_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_CharacterData_insertData_Callback(mthis, offset, data) native "CharacterData_insertData_Callback_RESOLVER_STRING_2_unsigned long_DOMString";
+  static $insertData_Callback(mthis, offset, data) native "CharacterData_insertData_Callback_RESOLVER_STRING_2_unsigned long_DOMString";
 
-Native_CharacterData_replaceData_Callback(mthis, offset, length, data) native "CharacterData_replaceData_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_DOMString";
+  static $replaceData_Callback(mthis, offset, length, data) native "CharacterData_replaceData_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_DOMString";
 
-Native_CharacterData_substringData_Callback(mthis, offset, length) native "CharacterData_substringData_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $substringData_Callback(mthis, offset, length) native "CharacterData_substringData_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_CharacterData_nextElementSibling_Getter(mthis) native "CharacterData_nextElementSibling_Getter";
+  static $nextElementSibling_Getter(mthis) native "CharacterData_nextElementSibling_Getter";
 
-Native_CharacterData_previousElementSibling_Getter(mthis) native "CharacterData_previousElementSibling_Getter";
+  static $previousElementSibling_Getter(mthis) native "CharacterData_previousElementSibling_Getter";
+}
 
-Native_Text_wholeText_Getter(mthis) native "Text_wholeText_Getter";
+class BlinkText {
+  static $wholeText_Getter(mthis) native "Text_wholeText_Getter";
 
-Native_Text_getDestinationInsertionPoints_Callback(mthis) native "Text_getDestinationInsertionPoints_Callback_RESOLVER_STRING_0_";
+  static $getDestinationInsertionPoints_Callback(mthis) native "Text_getDestinationInsertionPoints_Callback_RESOLVER_STRING_0_";
 
-Native_Text_splitText_Callback(mthis, offset) native "Text_splitText_Callback_RESOLVER_STRING_1_unsigned long";
+  static $splitText_Callback(mthis, offset) native "Text_splitText_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_CSS_supports_Callback(mthis, property, value) native "CSS_supports_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+class BlinkCDATASection {}
 
-Native_CSS_supportsCondition_Callback(mthis, conditionText) native "CSS_supports_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkCSS {
+  static $supports_Callback(mthis, property, value) native "CSS_supports_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_CSSRule_cssText_Getter(mthis) native "CSSRule_cssText_Getter";
+  static $supportsCondition_Callback(mthis, conditionText) native "CSS_supports_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_CSSRule_cssText_Setter(mthis, value) native "CSSRule_cssText_Setter";
+class BlinkCSSRule {
+  static $cssText_Getter(mthis) native "CSSRule_cssText_Getter";
 
-Native_CSSRule_parentRule_Getter(mthis) native "CSSRule_parentRule_Getter";
+  static $cssText_Setter(mthis, value) native "CSSRule_cssText_Setter";
 
-Native_CSSRule_parentStyleSheet_Getter(mthis) native "CSSRule_parentStyleSheet_Getter";
+  static $parentRule_Getter(mthis) native "CSSRule_parentRule_Getter";
 
-Native_CSSRule_type_Getter(mthis) native "CSSRule_type_Getter";
+  static $parentStyleSheet_Getter(mthis) native "CSSRule_parentStyleSheet_Getter";
 
-Native_CSSCharsetRule_encoding_Getter(mthis) native "CSSCharsetRule_encoding_Getter";
+  static $type_Getter(mthis) native "CSSRule_type_Getter";
+}
 
-Native_CSSCharsetRule_encoding_Setter(mthis, value) native "CSSCharsetRule_encoding_Setter";
+class BlinkCSSCharsetRule {
+  static $encoding_Getter(mthis) native "CSSCharsetRule_encoding_Getter";
 
-Native_CSSFontFaceLoadEvent_fontfaces_Getter(mthis) native "CSSFontFaceLoadEvent_fontfaces_Getter";
+  static $encoding_Setter(mthis, value) native "CSSCharsetRule_encoding_Setter";
+}
 
-Native_CSSFontFaceRule_style_Getter(mthis) native "CSSFontFaceRule_style_Getter";
+class BlinkCSSFontFaceLoadEvent {
+  static $fontfaces_Getter(mthis) native "CSSFontFaceLoadEvent_fontfaces_Getter";
+}
 
-Native_CSSImportRule_href_Getter(mthis) native "CSSImportRule_href_Getter";
+class BlinkCSSFontFaceRule {
+  static $style_Getter(mthis) native "CSSFontFaceRule_style_Getter";
+}
 
-Native_CSSImportRule_media_Getter(mthis) native "CSSImportRule_media_Getter";
+class BlinkCSSImportRule {
+  static $href_Getter(mthis) native "CSSImportRule_href_Getter";
 
-Native_CSSImportRule_styleSheet_Getter(mthis) native "CSSImportRule_styleSheet_Getter";
+  static $media_Getter(mthis) native "CSSImportRule_media_Getter";
 
-Native_CSSKeyframeRule_keyText_Getter(mthis) native "CSSKeyframeRule_keyText_Getter";
+  static $styleSheet_Getter(mthis) native "CSSImportRule_styleSheet_Getter";
+}
 
-Native_CSSKeyframeRule_keyText_Setter(mthis, value) native "CSSKeyframeRule_keyText_Setter";
+class BlinkCSSKeyframeRule {
+  static $keyText_Getter(mthis) native "CSSKeyframeRule_keyText_Getter";
+
+  static $keyText_Setter(mthis, value) native "CSSKeyframeRule_keyText_Setter";
+
+  static $style_Getter(mthis) native "CSSKeyframeRule_style_Getter";
+}
+
+class BlinkCSSKeyframesRule {
+  static $cssRules_Getter(mthis) native "CSSKeyframesRule_cssRules_Getter";
 
-Native_CSSKeyframeRule_style_Getter(mthis) native "CSSKeyframeRule_style_Getter";
+  static $name_Getter(mthis) native "CSSKeyframesRule_name_Getter";
 
-Native_CSSKeyframesRule_cssRules_Getter(mthis) native "CSSKeyframesRule_cssRules_Getter";
+  static $name_Setter(mthis, value) native "CSSKeyframesRule_name_Setter";
 
-Native_CSSKeyframesRule_name_Getter(mthis) native "CSSKeyframesRule_name_Getter";
+  static $__getter___Callback(mthis, index) native "CSSKeyframesRule___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSKeyframesRule_name_Setter(mthis, value) native "CSSKeyframesRule_name_Setter";
+  static $deleteRule_Callback(mthis, key) native "CSSKeyframesRule_deleteRule_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSKeyframesRule___getter___Callback(mthis, index) native "CSSKeyframesRule___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $findRule_Callback(mthis, key) native "CSSKeyframesRule_findRule_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSKeyframesRule_deleteRule_Callback(mthis, key) native "CSSKeyframesRule_deleteRule_Callback_RESOLVER_STRING_1_DOMString";
+  static $insertRule_Callback(mthis, rule) native "CSSKeyframesRule_insertRule_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_CSSKeyframesRule_findRule_Callback(mthis, key) native "CSSKeyframesRule_findRule_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkCSSMediaRule {
+  static $cssRules_Getter(mthis) native "CSSMediaRule_cssRules_Getter";
 
-Native_CSSKeyframesRule_insertRule_Callback(mthis, rule) native "CSSKeyframesRule_insertRule_Callback_RESOLVER_STRING_1_DOMString";
+  static $media_Getter(mthis) native "CSSMediaRule_media_Getter";
 
-Native_CSSMediaRule_cssRules_Getter(mthis) native "CSSMediaRule_cssRules_Getter";
+  static $deleteRule_Callback(mthis, index) native "CSSMediaRule_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSMediaRule_media_Getter(mthis) native "CSSMediaRule_media_Getter";
+  static $insertRule_Callback(mthis, rule, index) native "CSSMediaRule_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+}
 
-Native_CSSMediaRule_deleteRule_Callback(mthis, index) native "CSSMediaRule_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkCSSPageRule {
+  static $selectorText_Getter(mthis) native "CSSPageRule_selectorText_Getter";
 
-Native_CSSMediaRule_insertRule_Callback(mthis, rule, index) native "CSSMediaRule_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+  static $selectorText_Setter(mthis, value) native "CSSPageRule_selectorText_Setter";
 
-Native_CSSPageRule_selectorText_Getter(mthis) native "CSSPageRule_selectorText_Getter";
+  static $style_Getter(mthis) native "CSSPageRule_style_Getter";
+}
 
-Native_CSSPageRule_selectorText_Setter(mthis, value) native "CSSPageRule_selectorText_Setter";
+class BlinkCSSValue {}
 
-Native_CSSPageRule_style_Getter(mthis) native "CSSPageRule_style_Getter";
+class BlinkCSSPrimitiveValue {}
 
-Native_CSSRuleList_length_Getter(mthis) native "CSSRuleList_length_Getter";
+class BlinkCSSRuleList {
+  static $length_Getter(mthis) native "CSSRuleList_length_Getter";
 
-Native_CSSRuleList_NativeIndexed_Getter(mthis, index) native "CSSRuleList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "CSSRuleList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSRuleList_item_Callback(mthis, index) native "CSSRuleList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "CSSRuleList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_CSSStyleDeclaration_cssText_Getter(mthis) native "CSSStyleDeclaration_cssText_Getter";
+class BlinkCSSStyleDeclaration {
+  static $cssText_Getter(mthis) native "CSSStyleDeclaration_cssText_Getter";
 
-Native_CSSStyleDeclaration_cssText_Setter(mthis, value) native "CSSStyleDeclaration_cssText_Setter";
+  static $cssText_Setter(mthis, value) native "CSSStyleDeclaration_cssText_Setter";
 
-Native_CSSStyleDeclaration_length_Getter(mthis) native "CSSStyleDeclaration_length_Getter";
+  static $length_Getter(mthis) native "CSSStyleDeclaration_length_Getter";
 
-Native_CSSStyleDeclaration_parentRule_Getter(mthis) native "CSSStyleDeclaration_parentRule_Getter";
+  static $parentRule_Getter(mthis) native "CSSStyleDeclaration_parentRule_Getter";
 
-Native_CSSStyleDeclaration___setter___Callback(mthis, propertyName, propertyValue) native "CSSStyleDeclaration___setter___Callback";
+  static $__setter___Callback(mthis, propertyName, propertyValue) native "CSSStyleDeclaration___setter___Callback";
 
-Native_CSSStyleDeclaration_getPropertyPriority_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback_RESOLVER_STRING_1_DOMString";
+  static $getPropertyPriority_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSStyleDeclaration_getPropertyValue_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyValue_Callback_RESOLVER_STRING_1_DOMString";
+  static $getPropertyValue_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyValue_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSStyleDeclaration_item_Callback(mthis, index) native "CSSStyleDeclaration_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "CSSStyleDeclaration_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSStyleDeclaration_removeProperty_Callback(mthis, propertyName) native "CSSStyleDeclaration_removeProperty_Callback_RESOLVER_STRING_1_DOMString";
+  static $removeProperty_Callback(mthis, propertyName) native "CSSStyleDeclaration_removeProperty_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSStyleDeclaration_setProperty_Callback(mthis, propertyName, value, priority) native "CSSStyleDeclaration_setProperty_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $setProperty_Callback(mthis, propertyName, value, priority) native "CSSStyleDeclaration_setProperty_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+}
 
-Native_CSSStyleRule_selectorText_Getter(mthis) native "CSSStyleRule_selectorText_Getter";
+class BlinkCSSStyleRule {
+  static $selectorText_Getter(mthis) native "CSSStyleRule_selectorText_Getter";
 
-Native_CSSStyleRule_selectorText_Setter(mthis, value) native "CSSStyleRule_selectorText_Setter";
+  static $selectorText_Setter(mthis, value) native "CSSStyleRule_selectorText_Setter";
 
-Native_CSSStyleRule_style_Getter(mthis) native "CSSStyleRule_style_Getter";
+  static $style_Getter(mthis) native "CSSStyleRule_style_Getter";
+}
 
-Native_StyleSheet_disabled_Getter(mthis) native "StyleSheet_disabled_Getter";
+class BlinkStyleSheet {
+  static $disabled_Getter(mthis) native "StyleSheet_disabled_Getter";
 
-Native_StyleSheet_disabled_Setter(mthis, value) native "StyleSheet_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "StyleSheet_disabled_Setter";
 
-Native_StyleSheet_href_Getter(mthis) native "StyleSheet_href_Getter";
+  static $href_Getter(mthis) native "StyleSheet_href_Getter";
 
-Native_StyleSheet_media_Getter(mthis) native "StyleSheet_media_Getter";
+  static $media_Getter(mthis) native "StyleSheet_media_Getter";
 
-Native_StyleSheet_ownerNode_Getter(mthis) native "StyleSheet_ownerNode_Getter";
+  static $ownerNode_Getter(mthis) native "StyleSheet_ownerNode_Getter";
 
-Native_StyleSheet_parentStyleSheet_Getter(mthis) native "StyleSheet_parentStyleSheet_Getter";
+  static $parentStyleSheet_Getter(mthis) native "StyleSheet_parentStyleSheet_Getter";
 
-Native_StyleSheet_title_Getter(mthis) native "StyleSheet_title_Getter";
+  static $title_Getter(mthis) native "StyleSheet_title_Getter";
 
-Native_StyleSheet_type_Getter(mthis) native "StyleSheet_type_Getter";
+  static $type_Getter(mthis) native "StyleSheet_type_Getter";
+}
 
-Native_CSSStyleSheet_cssRules_Getter(mthis) native "CSSStyleSheet_cssRules_Getter";
+class BlinkCSSStyleSheet {
+  static $cssRules_Getter(mthis) native "CSSStyleSheet_cssRules_Getter";
 
-Native_CSSStyleSheet_ownerRule_Getter(mthis) native "CSSStyleSheet_ownerRule_Getter";
+  static $ownerRule_Getter(mthis) native "CSSStyleSheet_ownerRule_Getter";
 
-Native_CSSStyleSheet_rules_Getter(mthis) native "CSSStyleSheet_rules_Getter";
+  static $rules_Getter(mthis) native "CSSStyleSheet_rules_Getter";
 
   // Generated overload resolver
-Native_CSSStyleSheet_addRule(mthis, selector, style, index) {
+  static $addRule(mthis, selector, style, index) {
     if (index != null) {
-      return Native_CSSStyleSheet__addRule_1_Callback(mthis, selector, style, index);
+      return $_addRule_1_Callback(mthis, selector, style, index);
     }
-    return Native_CSSStyleSheet__addRule_2_Callback(mthis, selector, style);
+    return $_addRule_2_Callback(mthis, selector, style);
   }
 
-Native_CSSStyleSheet__addRule_1_Callback(mthis, selector, style, index) native "CSSStyleSheet_addRule_Callback_RESOLVER_STRING_3_DOMString_DOMString_unsigned long";
+  static $_addRule_1_Callback(mthis, selector, style, index) native "CSSStyleSheet_addRule_Callback_RESOLVER_STRING_3_DOMString_DOMString_unsigned long";
 
-Native_CSSStyleSheet__addRule_2_Callback(mthis, selector, style) native "CSSStyleSheet_addRule_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $_addRule_2_Callback(mthis, selector, style) native "CSSStyleSheet_addRule_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_CSSStyleSheet_deleteRule_Callback(mthis, index) native "CSSStyleSheet_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
+  static $deleteRule_Callback(mthis, index) native "CSSStyleSheet_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
-Native_CSSStyleSheet_insertRule(mthis, rule, index) {
+  static $insertRule(mthis, rule, index) {
     if (index != null) {
-      return Native_CSSStyleSheet__insertRule_1_Callback(mthis, rule, index);
+      return $_insertRule_1_Callback(mthis, rule, index);
     }
-    return Native_CSSStyleSheet__insertRule_2_Callback(mthis, rule);
+    return $_insertRule_2_Callback(mthis, rule);
   }
 
-Native_CSSStyleSheet__insertRule_1_Callback(mthis, rule, index) native "CSSStyleSheet_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+  static $_insertRule_1_Callback(mthis, rule, index) native "CSSStyleSheet_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
 
-Native_CSSStyleSheet__insertRule_2_Callback(mthis, rule) native "CSSStyleSheet_insertRule_Callback_RESOLVER_STRING_1_DOMString";
+  static $_insertRule_2_Callback(mthis, rule) native "CSSStyleSheet_insertRule_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSStyleSheet_removeRule_Callback(mthis, index) native "CSSStyleSheet_removeRule_Callback_RESOLVER_STRING_1_unsigned long";
+  static $removeRule_Callback(mthis, index) native "CSSStyleSheet_removeRule_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_CSSSupportsRule_conditionText_Getter(mthis) native "CSSSupportsRule_conditionText_Getter";
+class BlinkCSSSupportsRule {
+  static $conditionText_Getter(mthis) native "CSSSupportsRule_conditionText_Getter";
 
-Native_CSSSupportsRule_cssRules_Getter(mthis) native "CSSSupportsRule_cssRules_Getter";
+  static $cssRules_Getter(mthis) native "CSSSupportsRule_cssRules_Getter";
 
-Native_CSSSupportsRule_deleteRule_Callback(mthis, index) native "CSSSupportsRule_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
+  static $deleteRule_Callback(mthis, index) native "CSSSupportsRule_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSSupportsRule_insertRule_Callback(mthis, rule, index) native "CSSSupportsRule_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+  static $insertRule_Callback(mthis, rule, index) native "CSSSupportsRule_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+}
 
-Native_CSSValueList_length_Getter(mthis) native "CSSValueList_length_Getter";
+class BlinkCSSUnknownRule {}
 
-Native_CSSValueList_NativeIndexed_Getter(mthis, index) native "CSSValueList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkCSSValueList {
+  static $length_Getter(mthis) native "CSSValueList_length_Getter";
 
-Native_CSSValueList_item_Callback(mthis, index) native "CSSValueList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "CSSValueList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSViewportRule_style_Getter(mthis) native "CSSViewportRule_style_Getter";
+  static $item_Callback(mthis, index) native "CSSValueList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_Canvas2DContextAttributes_alpha_Getter(mthis) native "Canvas2DContextAttributes_alpha_Getter";
+class BlinkCSSViewportRule {
+  static $style_Getter(mthis) native "CSSViewportRule_style_Getter";
+}
 
-Native_Canvas2DContextAttributes_alpha_Setter(mthis, value) native "Canvas2DContextAttributes_alpha_Setter";
+class BlinkCanvas2DContextAttributes {
+  static $alpha_Getter(mthis) native "Canvas2DContextAttributes_alpha_Getter";
 
-Native_CanvasGradient_addColorStop_Callback(mthis, offset, color) native "CanvasGradient_addColorStop_Callback_RESOLVER_STRING_2_float_DOMString";
+  static $alpha_Setter(mthis, value) native "Canvas2DContextAttributes_alpha_Setter";
+}
 
-Native_CanvasRenderingContext_canvas_Getter(mthis) native "CanvasRenderingContext2D_canvas_Getter";
+class BlinkCanvasGradient {
+  static $addColorStop_Callback(mthis, offset, color) native "CanvasGradient_addColorStop_Callback_RESOLVER_STRING_2_float_DOMString";
+}
 
-Native_CanvasRenderingContext2D_currentTransform_Getter(mthis) native "CanvasRenderingContext2D_currentTransform_Getter";
+class BlinkCanvasPattern {}
 
-Native_CanvasRenderingContext2D_currentTransform_Setter(mthis, value) native "CanvasRenderingContext2D_currentTransform_Setter";
+class BlinkCanvasRenderingContext {
+  static $canvas_Getter(mthis) native "CanvasRenderingContext2D_canvas_Getter";
+}
 
-Native_CanvasRenderingContext2D_fillStyle_Getter(mthis) native "CanvasRenderingContext2D_fillStyle_Getter";
+class BlinkCanvasRenderingContext2D {
+  static $currentTransform_Getter(mthis) native "CanvasRenderingContext2D_currentTransform_Getter";
 
-Native_CanvasRenderingContext2D_fillStyle_Setter(mthis, value) native "CanvasRenderingContext2D_fillStyle_Setter";
+  static $currentTransform_Setter(mthis, value) native "CanvasRenderingContext2D_currentTransform_Setter";
 
-Native_CanvasRenderingContext2D_font_Getter(mthis) native "CanvasRenderingContext2D_font_Getter";
+  static $fillStyle_Getter(mthis) native "CanvasRenderingContext2D_fillStyle_Getter";
 
-Native_CanvasRenderingContext2D_font_Setter(mthis, value) native "CanvasRenderingContext2D_font_Setter";
+  static $fillStyle_Setter(mthis, value) native "CanvasRenderingContext2D_fillStyle_Setter";
 
-Native_CanvasRenderingContext2D_globalAlpha_Getter(mthis) native "CanvasRenderingContext2D_globalAlpha_Getter";
+  static $font_Getter(mthis) native "CanvasRenderingContext2D_font_Getter";
 
-Native_CanvasRenderingContext2D_globalAlpha_Setter(mthis, value) native "CanvasRenderingContext2D_globalAlpha_Setter";
+  static $font_Setter(mthis, value) native "CanvasRenderingContext2D_font_Setter";
 
-Native_CanvasRenderingContext2D_globalCompositeOperation_Getter(mthis) native "CanvasRenderingContext2D_globalCompositeOperation_Getter";
+  static $globalAlpha_Getter(mthis) native "CanvasRenderingContext2D_globalAlpha_Getter";
 
-Native_CanvasRenderingContext2D_globalCompositeOperation_Setter(mthis, value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";
+  static $globalAlpha_Setter(mthis, value) native "CanvasRenderingContext2D_globalAlpha_Setter";
 
-Native_CanvasRenderingContext2D_imageSmoothingEnabled_Getter(mthis) native "CanvasRenderingContext2D_imageSmoothingEnabled_Getter";
+  static $globalCompositeOperation_Getter(mthis) native "CanvasRenderingContext2D_globalCompositeOperation_Getter";
 
-Native_CanvasRenderingContext2D_imageSmoothingEnabled_Setter(mthis, value) native "CanvasRenderingContext2D_imageSmoothingEnabled_Setter";
+  static $globalCompositeOperation_Setter(mthis, value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";
 
-Native_CanvasRenderingContext2D_lineCap_Getter(mthis) native "CanvasRenderingContext2D_lineCap_Getter";
+  static $imageSmoothingEnabled_Getter(mthis) native "CanvasRenderingContext2D_imageSmoothingEnabled_Getter";
 
-Native_CanvasRenderingContext2D_lineCap_Setter(mthis, value) native "CanvasRenderingContext2D_lineCap_Setter";
+  static $imageSmoothingEnabled_Setter(mthis, value) native "CanvasRenderingContext2D_imageSmoothingEnabled_Setter";
 
-Native_CanvasRenderingContext2D_lineDashOffset_Getter(mthis) native "CanvasRenderingContext2D_lineDashOffset_Getter";
+  static $lineCap_Getter(mthis) native "CanvasRenderingContext2D_lineCap_Getter";
 
-Native_CanvasRenderingContext2D_lineDashOffset_Setter(mthis, value) native "CanvasRenderingContext2D_lineDashOffset_Setter";
+  static $lineCap_Setter(mthis, value) native "CanvasRenderingContext2D_lineCap_Setter";
 
-Native_CanvasRenderingContext2D_lineJoin_Getter(mthis) native "CanvasRenderingContext2D_lineJoin_Getter";
+  static $lineDashOffset_Getter(mthis) native "CanvasRenderingContext2D_lineDashOffset_Getter";
 
-Native_CanvasRenderingContext2D_lineJoin_Setter(mthis, value) native "CanvasRenderingContext2D_lineJoin_Setter";
+  static $lineDashOffset_Setter(mthis, value) native "CanvasRenderingContext2D_lineDashOffset_Setter";
 
-Native_CanvasRenderingContext2D_lineWidth_Getter(mthis) native "CanvasRenderingContext2D_lineWidth_Getter";
+  static $lineJoin_Getter(mthis) native "CanvasRenderingContext2D_lineJoin_Getter";
 
-Native_CanvasRenderingContext2D_lineWidth_Setter(mthis, value) native "CanvasRenderingContext2D_lineWidth_Setter";
+  static $lineJoin_Setter(mthis, value) native "CanvasRenderingContext2D_lineJoin_Setter";
 
-Native_CanvasRenderingContext2D_miterLimit_Getter(mthis) native "CanvasRenderingContext2D_miterLimit_Getter";
+  static $lineWidth_Getter(mthis) native "CanvasRenderingContext2D_lineWidth_Getter";
 
-Native_CanvasRenderingContext2D_miterLimit_Setter(mthis, value) native "CanvasRenderingContext2D_miterLimit_Setter";
+  static $lineWidth_Setter(mthis, value) native "CanvasRenderingContext2D_lineWidth_Setter";
 
-Native_CanvasRenderingContext2D_shadowBlur_Getter(mthis) native "CanvasRenderingContext2D_shadowBlur_Getter";
+  static $miterLimit_Getter(mthis) native "CanvasRenderingContext2D_miterLimit_Getter";
 
-Native_CanvasRenderingContext2D_shadowBlur_Setter(mthis, value) native "CanvasRenderingContext2D_shadowBlur_Setter";
+  static $miterLimit_Setter(mthis, value) native "CanvasRenderingContext2D_miterLimit_Setter";
 
-Native_CanvasRenderingContext2D_shadowColor_Getter(mthis) native "CanvasRenderingContext2D_shadowColor_Getter";
+  static $shadowBlur_Getter(mthis) native "CanvasRenderingContext2D_shadowBlur_Getter";
 
-Native_CanvasRenderingContext2D_shadowColor_Setter(mthis, value) native "CanvasRenderingContext2D_shadowColor_Setter";
+  static $shadowBlur_Setter(mthis, value) native "CanvasRenderingContext2D_shadowBlur_Setter";
 
-Native_CanvasRenderingContext2D_shadowOffsetX_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetX_Getter";
+  static $shadowColor_Getter(mthis) native "CanvasRenderingContext2D_shadowColor_Getter";
 
-Native_CanvasRenderingContext2D_shadowOffsetX_Setter(mthis, value) native "CanvasRenderingContext2D_shadowOffsetX_Setter";
+  static $shadowColor_Setter(mthis, value) native "CanvasRenderingContext2D_shadowColor_Setter";
 
-Native_CanvasRenderingContext2D_shadowOffsetY_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetY_Getter";
+  static $shadowOffsetX_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetX_Getter";
 
-Native_CanvasRenderingContext2D_shadowOffsetY_Setter(mthis, value) native "CanvasRenderingContext2D_shadowOffsetY_Setter";
+  static $shadowOffsetX_Setter(mthis, value) native "CanvasRenderingContext2D_shadowOffsetX_Setter";
 
-Native_CanvasRenderingContext2D_strokeStyle_Getter(mthis) native "CanvasRenderingContext2D_strokeStyle_Getter";
+  static $shadowOffsetY_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetY_Getter";
 
-Native_CanvasRenderingContext2D_strokeStyle_Setter(mthis, value) native "CanvasRenderingContext2D_strokeStyle_Setter";
+  static $shadowOffsetY_Setter(mthis, value) native "CanvasRenderingContext2D_shadowOffsetY_Setter";
 
-Native_CanvasRenderingContext2D_textAlign_Getter(mthis) native "CanvasRenderingContext2D_textAlign_Getter";
+  static $strokeStyle_Getter(mthis) native "CanvasRenderingContext2D_strokeStyle_Getter";
 
-Native_CanvasRenderingContext2D_textAlign_Setter(mthis, value) native "CanvasRenderingContext2D_textAlign_Setter";
+  static $strokeStyle_Setter(mthis, value) native "CanvasRenderingContext2D_strokeStyle_Setter";
 
-Native_CanvasRenderingContext2D_textBaseline_Getter(mthis) native "CanvasRenderingContext2D_textBaseline_Getter";
+  static $textAlign_Getter(mthis) native "CanvasRenderingContext2D_textAlign_Getter";
 
-Native_CanvasRenderingContext2D_textBaseline_Setter(mthis, value) native "CanvasRenderingContext2D_textBaseline_Setter";
+  static $textAlign_Setter(mthis, value) native "CanvasRenderingContext2D_textAlign_Setter";
 
-Native_CanvasRenderingContext2D_arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_arc_Callback_RESOLVER_STRING_6_float_float_float_float_float_boolean";
+  static $textBaseline_Getter(mthis) native "CanvasRenderingContext2D_textBaseline_Getter";
 
-Native_CanvasRenderingContext2D_arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "CanvasRenderingContext2D_arcTo_Callback_RESOLVER_STRING_5_float_float_float_float_float";
+  static $textBaseline_Setter(mthis, value) native "CanvasRenderingContext2D_textBaseline_Setter";
 
-Native_CanvasRenderingContext2D_beginPath_Callback(mthis) native "CanvasRenderingContext2D_beginPath_Callback_RESOLVER_STRING_0_";
+  static $arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_arc_Callback_RESOLVER_STRING_6_float_float_float_float_float_boolean";
 
-Native_CanvasRenderingContext2D_bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "CanvasRenderingContext2D_bezierCurveTo_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "CanvasRenderingContext2D_arcTo_Callback_RESOLVER_STRING_5_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_clearRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_clearRect_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $beginPath_Callback(mthis) native "CanvasRenderingContext2D_beginPath_Callback_RESOLVER_STRING_0_";
+
+  static $bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "CanvasRenderingContext2D_bezierCurveTo_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+
+  static $clearRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_clearRect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D_clip(mthis, winding) {
+  static $clip(mthis, winding) {
     if (winding != null) {
-      Native_CanvasRenderingContext2D__clip_1_Callback(mthis, winding);
+      $_clip_1_Callback(mthis, winding);
       return;
     }
-    Native_CanvasRenderingContext2D__clip_2_Callback(mthis);
+    $_clip_2_Callback(mthis);
     return;
   }
 
-Native_CanvasRenderingContext2D__clip_1_Callback(mthis, winding) native "CanvasRenderingContext2D_clip_Callback_RESOLVER_STRING_1_DOMString";
+  static $_clip_1_Callback(mthis, winding) native "CanvasRenderingContext2D_clip_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CanvasRenderingContext2D__clip_2_Callback(mthis) native "CanvasRenderingContext2D_clip_Callback_RESOLVER_STRING_0_";
+  static $_clip_2_Callback(mthis) native "CanvasRenderingContext2D_clip_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_closePath_Callback(mthis) native "CanvasRenderingContext2D_closePath_Callback_RESOLVER_STRING_0_";
+  static $closePath_Callback(mthis) native "CanvasRenderingContext2D_closePath_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_createImageData_Callback(mthis, sw, sh) native "CanvasRenderingContext2D_createImageData_Callback_RESOLVER_STRING_2_float_float";
+  static $createImageData_Callback(mthis, sw, sh) native "CanvasRenderingContext2D_createImageData_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_createImageDataFromImageData_Callback(mthis, imagedata) native "CanvasRenderingContext2D_createImageData_Callback_RESOLVER_STRING_1_ImageData";
+  static $createImageDataFromImageData_Callback(mthis, imagedata) native "CanvasRenderingContext2D_createImageData_Callback_RESOLVER_STRING_1_ImageData";
 
-Native_CanvasRenderingContext2D_createLinearGradient_Callback(mthis, x0, y0, x1, y1) native "CanvasRenderingContext2D_createLinearGradient_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $createLinearGradient_Callback(mthis, x0, y0, x1, y1) native "CanvasRenderingContext2D_createLinearGradient_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_CanvasRenderingContext2D_createPattern_Callback(mthis, canvas, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_RESOLVER_STRING_2_HTMLCanvasElement_DOMString";
+  static $createPattern_Callback(mthis, canvas, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_RESOLVER_STRING_2_HTMLCanvasElement_DOMString";
 
-Native_CanvasRenderingContext2D_createPatternFromImage_Callback(mthis, image, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_RESOLVER_STRING_2_HTMLImageElement_DOMString";
+  static $createPatternFromImage_Callback(mthis, image, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_RESOLVER_STRING_2_HTMLImageElement_DOMString";
 
-Native_CanvasRenderingContext2D_createRadialGradient_Callback(mthis, x0, y0, r0, x1, y1, r1) native "CanvasRenderingContext2D_createRadialGradient_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $createRadialGradient_Callback(mthis, x0, y0, r0, x1, y1, r1) native "CanvasRenderingContext2D_createRadialGradient_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_drawCustomFocusRing_Callback(mthis, element) native "CanvasRenderingContext2D_drawCustomFocusRing_Callback_RESOLVER_STRING_1_Element";
+  static $drawCustomFocusRing_Callback(mthis, element) native "CanvasRenderingContext2D_drawCustomFocusRing_Callback_RESOLVER_STRING_1_Element";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D__drawImage(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) {
+  static $_drawImage(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) {
     if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      $_drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      $_drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
-      Native_CanvasRenderingContext2D__drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      $_drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      $_drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      $_drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
-      Native_CanvasRenderingContext2D__drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      $_drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      $_drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      $_drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
-      Native_CanvasRenderingContext2D__drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      $_drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      $_drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      $_drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
-      Native_CanvasRenderingContext2D__drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      $_drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_CanvasRenderingContext2D__drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLImageElement_float_float";
+  static $_drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLImageElement_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLImageElement_float_float_float_float";
+  static $_drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLImageElement_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLImageElement_float_float_float_float_float_float_float_float";
+  static $_drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLImageElement_float_float_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLCanvasElement_float_float";
+  static $_drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLCanvasElement_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLCanvasElement_float_float_float_float";
+  static $_drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLCanvasElement_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLCanvasElement_float_float_float_float_float_float_float_float";
+  static $_drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLCanvasElement_float_float_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLVideoElement_float_float";
+  static $_drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLVideoElement_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLVideoElement_float_float_float_float";
+  static $_drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLVideoElement_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLVideoElement_float_float_float_float_float_float_float_float";
+  static $_drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLVideoElement_float_float_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_ImageBitmap_float_float";
+  static $_drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_ImageBitmap_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_ImageBitmap_float_float_float_float";
+  static $_drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_ImageBitmap_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_ImageBitmap_float_float_float_float_float_float_float_float";
+  static $_drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_ImageBitmap_float_float_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_ellipse_Callback(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback_RESOLVER_STRING_8_float_float_float_float_float_float_float_boolean";
+  static $ellipse_Callback(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback_RESOLVER_STRING_8_float_float_float_float_float_float_float_boolean";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D_fill(mthis, winding) {
+  static $fill(mthis, winding) {
     if (winding != null) {
-      Native_CanvasRenderingContext2D__fill_1_Callback(mthis, winding);
+      $_fill_1_Callback(mthis, winding);
       return;
     }
-    Native_CanvasRenderingContext2D__fill_2_Callback(mthis);
+    $_fill_2_Callback(mthis);
     return;
   }
 
-Native_CanvasRenderingContext2D__fill_1_Callback(mthis, winding) native "CanvasRenderingContext2D_fill_Callback_RESOLVER_STRING_1_DOMString";
+  static $_fill_1_Callback(mthis, winding) native "CanvasRenderingContext2D_fill_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CanvasRenderingContext2D__fill_2_Callback(mthis) native "CanvasRenderingContext2D_fill_Callback_RESOLVER_STRING_0_";
+  static $_fill_2_Callback(mthis) native "CanvasRenderingContext2D_fill_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_fillRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_fillRect_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $fillRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_fillRect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D_fillText(mthis, text, x, y, maxWidth) {
+  static $fillText(mthis, text, x, y, maxWidth) {
     if (maxWidth != null) {
-      Native_CanvasRenderingContext2D__fillText_1_Callback(mthis, text, x, y, maxWidth);
+      $_fillText_1_Callback(mthis, text, x, y, maxWidth);
       return;
     }
-    Native_CanvasRenderingContext2D__fillText_2_Callback(mthis, text, x, y);
+    $_fillText_2_Callback(mthis, text, x, y);
     return;
   }
 
-Native_CanvasRenderingContext2D__fillText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_fillText_Callback_RESOLVER_STRING_4_DOMString_float_float_float";
+  static $_fillText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_fillText_Callback_RESOLVER_STRING_4_DOMString_float_float_float";
 
-Native_CanvasRenderingContext2D__fillText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D_fillText_Callback_RESOLVER_STRING_3_DOMString_float_float";
+  static $_fillText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D_fillText_Callback_RESOLVER_STRING_3_DOMString_float_float";
 
-Native_CanvasRenderingContext2D_getContextAttributes_Callback(mthis) native "CanvasRenderingContext2D_getContextAttributes_Callback_RESOLVER_STRING_0_";
+  static $getContextAttributes_Callback(mthis) native "CanvasRenderingContext2D_getContextAttributes_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_getImageData_Callback(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_getImageData_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $getImageData_Callback(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_getImageData_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_CanvasRenderingContext2D_getLineDash_Callback(mthis) native "CanvasRenderingContext2D_getLineDash_Callback_RESOLVER_STRING_0_";
+  static $getLineDash_Callback(mthis) native "CanvasRenderingContext2D_getLineDash_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D_isPointInPath(mthis, x, y, winding) {
+  static $isPointInPath(mthis, x, y, winding) {
     if (winding != null) {
-      return Native_CanvasRenderingContext2D__isPointInPath_1_Callback(mthis, x, y, winding);
+      return $_isPointInPath_1_Callback(mthis, x, y, winding);
     }
-    return Native_CanvasRenderingContext2D__isPointInPath_2_Callback(mthis, x, y);
+    return $_isPointInPath_2_Callback(mthis, x, y);
   }
 
-Native_CanvasRenderingContext2D__isPointInPath_1_Callback(mthis, x, y, winding) native "CanvasRenderingContext2D_isPointInPath_Callback_RESOLVER_STRING_3_float_float_DOMString";
+  static $_isPointInPath_1_Callback(mthis, x, y, winding) native "CanvasRenderingContext2D_isPointInPath_Callback_RESOLVER_STRING_3_float_float_DOMString";
 
-Native_CanvasRenderingContext2D__isPointInPath_2_Callback(mthis, x, y) native "CanvasRenderingContext2D_isPointInPath_Callback_RESOLVER_STRING_2_float_float";
+  static $_isPointInPath_2_Callback(mthis, x, y) native "CanvasRenderingContext2D_isPointInPath_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_isPointInStroke_Callback(mthis, x, y) native "CanvasRenderingContext2D_isPointInStroke_Callback_RESOLVER_STRING_2_float_float";
+  static $isPointInStroke_Callback(mthis, x, y) native "CanvasRenderingContext2D_isPointInStroke_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_lineTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_lineTo_Callback_RESOLVER_STRING_2_float_float";
+  static $lineTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_lineTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_measureText_Callback(mthis, text) native "CanvasRenderingContext2D_measureText_Callback_RESOLVER_STRING_1_DOMString";
+  static $measureText_Callback(mthis, text) native "CanvasRenderingContext2D_measureText_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CanvasRenderingContext2D_moveTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_moveTo_Callback_RESOLVER_STRING_2_float_float";
+  static $moveTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_moveTo_Callback_RESOLVER_STRING_2_float_float";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D_putImageData(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
+  static $putImageData(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
     if ((dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
-      Native_CanvasRenderingContext2D__putImageData_1_Callback(mthis, imagedata, dx, dy);
+      $_putImageData_1_Callback(mthis, imagedata, dx, dy);
       return;
     }
     if ((dirtyHeight is num || dirtyHeight == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyY is num || dirtyY == null) && (dirtyX is num || dirtyX == null) && (dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null)) {
-      Native_CanvasRenderingContext2D__putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      $_putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_CanvasRenderingContext2D__putImageData_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D_putImageData_Callback_RESOLVER_STRING_3_ImageData_float_float";
+  static $_putImageData_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D_putImageData_Callback_RESOLVER_STRING_3_ImageData_float_float";
 
-Native_CanvasRenderingContext2D__putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_putImageData_Callback_RESOLVER_STRING_7_ImageData_float_float_float_float_float_float";
+  static $_putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_putImageData_Callback_RESOLVER_STRING_7_ImageData_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_CanvasRenderingContext2D_rect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_rect_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $rect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_rect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_CanvasRenderingContext2D_resetTransform_Callback(mthis) native "CanvasRenderingContext2D_resetTransform_Callback_RESOLVER_STRING_0_";
+  static $resetTransform_Callback(mthis) native "CanvasRenderingContext2D_resetTransform_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_restore_Callback(mthis) native "CanvasRenderingContext2D_restore_Callback_RESOLVER_STRING_0_";
+  static $restore_Callback(mthis) native "CanvasRenderingContext2D_restore_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_rotate_Callback(mthis, angle) native "CanvasRenderingContext2D_rotate_Callback_RESOLVER_STRING_1_float";
+  static $rotate_Callback(mthis, angle) native "CanvasRenderingContext2D_rotate_Callback_RESOLVER_STRING_1_float";
 
-Native_CanvasRenderingContext2D_save_Callback(mthis) native "CanvasRenderingContext2D_save_Callback_RESOLVER_STRING_0_";
+  static $save_Callback(mthis) native "CanvasRenderingContext2D_save_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_scale_Callback(mthis, sx, sy) native "CanvasRenderingContext2D_scale_Callback_RESOLVER_STRING_2_float_float";
+  static $scale_Callback(mthis, sx, sy) native "CanvasRenderingContext2D_scale_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_setLineDash_Callback(mthis, dash) native "CanvasRenderingContext2D_setLineDash_Callback_RESOLVER_STRING_1_sequence<unrestricted float>";
+  static $setLineDash_Callback(mthis, dash) native "CanvasRenderingContext2D_setLineDash_Callback_RESOLVER_STRING_1_sequence<unrestricted float>";
 
-Native_CanvasRenderingContext2D_setTransform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_setTransform_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $setTransform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_setTransform_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_stroke_Callback(mthis) native "CanvasRenderingContext2D_stroke_Callback_RESOLVER_STRING_0_";
+  static $stroke_Callback(mthis) native "CanvasRenderingContext2D_stroke_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_strokeRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_strokeRect_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $strokeRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_strokeRect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D_strokeText(mthis, text, x, y, maxWidth) {
+  static $strokeText(mthis, text, x, y, maxWidth) {
     if (maxWidth != null) {
-      Native_CanvasRenderingContext2D__strokeText_1_Callback(mthis, text, x, y, maxWidth);
+      $_strokeText_1_Callback(mthis, text, x, y, maxWidth);
       return;
     }
-    Native_CanvasRenderingContext2D__strokeText_2_Callback(mthis, text, x, y);
+    $_strokeText_2_Callback(mthis, text, x, y);
     return;
   }
 
-Native_CanvasRenderingContext2D__strokeText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_strokeText_Callback_RESOLVER_STRING_4_DOMString_float_float_float";
+  static $_strokeText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_strokeText_Callback_RESOLVER_STRING_4_DOMString_float_float_float";
 
-Native_CanvasRenderingContext2D__strokeText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D_strokeText_Callback_RESOLVER_STRING_3_DOMString_float_float";
+  static $_strokeText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D_strokeText_Callback_RESOLVER_STRING_3_DOMString_float_float";
 
-Native_CanvasRenderingContext2D_transform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_transform_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $transform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_transform_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_translate_Callback(mthis, tx, ty) native "CanvasRenderingContext2D_translate_Callback_RESOLVER_STRING_2_float_float";
+  static $translate_Callback(mthis, tx, ty) native "CanvasRenderingContext2D_translate_Callback_RESOLVER_STRING_2_float_float";
+}
 
-Native_ClientRect_bottom_Getter(mthis) native "ClientRect_bottom_Getter";
+class BlinkChannelMergerNode {}
 
-Native_ClientRect_height_Getter(mthis) native "ClientRect_height_Getter";
+class BlinkChannelSplitterNode {}
 
-Native_ClientRect_left_Getter(mthis) native "ClientRect_left_Getter";
+class BlinkClientRect {
+  static $bottom_Getter(mthis) native "ClientRect_bottom_Getter";
 
-Native_ClientRect_right_Getter(mthis) native "ClientRect_right_Getter";
+  static $height_Getter(mthis) native "ClientRect_height_Getter";
 
-Native_ClientRect_top_Getter(mthis) native "ClientRect_top_Getter";
+  static $left_Getter(mthis) native "ClientRect_left_Getter";
 
-Native_ClientRect_width_Getter(mthis) native "ClientRect_width_Getter";
+  static $right_Getter(mthis) native "ClientRect_right_Getter";
 
-Native_ClientRectList_length_Getter(mthis) native "ClientRectList_length_Getter";
+  static $top_Getter(mthis) native "ClientRect_top_Getter";
 
-Native_ClientRectList_NativeIndexed_Getter(mthis, index) native "ClientRectList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $width_Getter(mthis) native "ClientRect_width_Getter";
+}
 
-Native_ClientRectList_item_Callback(mthis, index) native "ClientRectList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkClientRectList {
+  static $length_Getter(mthis) native "ClientRectList_length_Getter";
 
-Native_Clipboard_dropEffect_Getter(mthis) native "DataTransfer_dropEffect_Getter";
+  static $NativeIndexed_Getter(mthis, index) native "ClientRectList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Clipboard_dropEffect_Setter(mthis, value) native "DataTransfer_dropEffect_Setter";
+  static $item_Callback(mthis, index) native "ClientRectList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_Clipboard_effectAllowed_Getter(mthis) native "DataTransfer_effectAllowed_Getter";
+class BlinkClipboard {
+  static $dropEffect_Getter(mthis) native "DataTransfer_dropEffect_Getter";
 
-Native_Clipboard_effectAllowed_Setter(mthis, value) native "DataTransfer_effectAllowed_Setter";
+  static $dropEffect_Setter(mthis, value) native "DataTransfer_dropEffect_Setter";
 
-Native_Clipboard_files_Getter(mthis) native "DataTransfer_files_Getter";
+  static $effectAllowed_Getter(mthis) native "DataTransfer_effectAllowed_Getter";
 
-Native_Clipboard_items_Getter(mthis) native "DataTransfer_items_Getter";
+  static $effectAllowed_Setter(mthis, value) native "DataTransfer_effectAllowed_Setter";
 
-Native_Clipboard_types_Getter(mthis) native "DataTransfer_types_Getter";
+  static $files_Getter(mthis) native "DataTransfer_files_Getter";
+
+  static $items_Getter(mthis) native "DataTransfer_items_Getter";
+
+  static $types_Getter(mthis) native "DataTransfer_types_Getter";
 
   // Generated overload resolver
-Native_Clipboard_clearData(mthis, type) {
+  static $clearData(mthis, type) {
     if (type != null) {
-      Native_Clipboard__clearData_1_Callback(mthis, type);
+      $_clearData_1_Callback(mthis, type);
       return;
     }
-    Native_Clipboard__clearData_2_Callback(mthis);
+    $_clearData_2_Callback(mthis);
     return;
   }
 
-Native_Clipboard__clearData_1_Callback(mthis, type) native "DataTransfer_clearData_Callback_RESOLVER_STRING_1_DOMString";
+  static $_clearData_1_Callback(mthis, type) native "DataTransfer_clearData_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Clipboard__clearData_2_Callback(mthis) native "DataTransfer_clearData_Callback_RESOLVER_STRING_0_";
+  static $_clearData_2_Callback(mthis) native "DataTransfer_clearData_Callback_RESOLVER_STRING_0_";
 
-Native_Clipboard_getData_Callback(mthis, type) native "DataTransfer_getData_Callback_RESOLVER_STRING_1_DOMString";
+  static $getData_Callback(mthis, type) native "DataTransfer_getData_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Clipboard_setData_Callback(mthis, type, data) native "DataTransfer_setData_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $setData_Callback(mthis, type, data) native "DataTransfer_setData_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Clipboard_setDragImage_Callback(mthis, image, x, y) native "DataTransfer_setDragImage_Callback_RESOLVER_STRING_3_Element_long_long";
+  static $setDragImage_Callback(mthis, image, x, y) native "DataTransfer_setDragImage_Callback_RESOLVER_STRING_3_Element_long_long";
+}
 
-Native_CloseEvent_code_Getter(mthis) native "CloseEvent_code_Getter";
+class BlinkCloseEvent {
+  static $code_Getter(mthis) native "CloseEvent_code_Getter";
 
-Native_CloseEvent_reason_Getter(mthis) native "CloseEvent_reason_Getter";
+  static $reason_Getter(mthis) native "CloseEvent_reason_Getter";
 
-Native_CloseEvent_wasClean_Getter(mthis) native "CloseEvent_wasClean_Getter";
+  static $wasClean_Getter(mthis) native "CloseEvent_wasClean_Getter";
+}
 
+class BlinkComment {
   // Generated overload resolver
-Native_Comment_Comment(data) {
-    return Native_Comment__create_1constructorCallback(data);
+  static $mkComment(data) {
+    return $_create_1constructorCallback(data);
   }
 
-Native_Comment__create_1constructorCallback(data) native "Comment_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(data) native "Comment_constructorCallback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_UIEvent_charCode_Getter(mthis) native "UIEvent_charCode_Getter";
+class BlinkUIEvent {
+  static $charCode_Getter(mthis) native "UIEvent_charCode_Getter";
 
-Native_UIEvent_detail_Getter(mthis) native "UIEvent_detail_Getter";
+  static $detail_Getter(mthis) native "UIEvent_detail_Getter";
 
-Native_UIEvent_keyCode_Getter(mthis) native "UIEvent_keyCode_Getter";
+  static $keyCode_Getter(mthis) native "UIEvent_keyCode_Getter";
 
-Native_UIEvent_layerX_Getter(mthis) native "UIEvent_layerX_Getter";
+  static $layerX_Getter(mthis) native "UIEvent_layerX_Getter";
 
-Native_UIEvent_layerY_Getter(mthis) native "UIEvent_layerY_Getter";
+  static $layerY_Getter(mthis) native "UIEvent_layerY_Getter";
 
-Native_UIEvent_pageX_Getter(mthis) native "UIEvent_pageX_Getter";
+  static $pageX_Getter(mthis) native "UIEvent_pageX_Getter";
 
-Native_UIEvent_pageY_Getter(mthis) native "UIEvent_pageY_Getter";
+  static $pageY_Getter(mthis) native "UIEvent_pageY_Getter";
 
-Native_UIEvent_view_Getter(mthis) native "UIEvent_view_Getter";
+  static $view_Getter(mthis) native "UIEvent_view_Getter";
 
-Native_UIEvent_which_Getter(mthis) native "UIEvent_which_Getter";
+  static $which_Getter(mthis) native "UIEvent_which_Getter";
 
-Native_UIEvent_initUIEvent_Callback(mthis, type, canBubble, cancelable, view, detail) native "UIEvent_initUIEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_long";
+  static $initUIEvent_Callback(mthis, type, canBubble, cancelable, view, detail) native "UIEvent_initUIEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_long";
+}
 
-Native_CompositionEvent_activeSegmentEnd_Getter(mthis) native "CompositionEvent_activeSegmentEnd_Getter";
+class BlinkCompositionEvent {
+  static $activeSegmentEnd_Getter(mthis) native "CompositionEvent_activeSegmentEnd_Getter";
 
-Native_CompositionEvent_activeSegmentStart_Getter(mthis) native "CompositionEvent_activeSegmentStart_Getter";
+  static $activeSegmentStart_Getter(mthis) native "CompositionEvent_activeSegmentStart_Getter";
 
-Native_CompositionEvent_data_Getter(mthis) native "CompositionEvent_data_Getter";
+  static $data_Getter(mthis) native "CompositionEvent_data_Getter";
 
-Native_CompositionEvent_initCompositionEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "CompositionEvent_initCompositionEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_DOMString";
+  static $initCompositionEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "CompositionEvent_initCompositionEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_DOMString";
+}
 
-Native_ConsoleBase_assertCondition_Callback(mthis, condition, arg) native "ConsoleBase_assert_Callback_RESOLVER_STRING_2_boolean_object";
+class BlinkConsoleBase {
+  static $assertCondition_Callback(mthis, condition, arg) native "ConsoleBase_assert_Callback_RESOLVER_STRING_2_boolean_object";
 
-Native_ConsoleBase_clear_Callback(mthis, arg) native "ConsoleBase_clear_Callback_RESOLVER_STRING_1_object";
+  static $clear_Callback(mthis, arg) native "ConsoleBase_clear_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_count_Callback(mthis, arg) native "ConsoleBase_count_Callback_RESOLVER_STRING_1_object";
+  static $count_Callback(mthis, arg) native "ConsoleBase_count_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_debug_Callback(mthis, arg) native "ConsoleBase_debug_Callback_RESOLVER_STRING_1_object";
+  static $debug_Callback(mthis, arg) native "ConsoleBase_debug_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_dir_Callback(mthis, arg) native "ConsoleBase_dir_Callback_RESOLVER_STRING_1_object";
+  static $dir_Callback(mthis, arg) native "ConsoleBase_dir_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_dirxml_Callback(mthis, arg) native "ConsoleBase_dirxml_Callback_RESOLVER_STRING_1_object";
+  static $dirxml_Callback(mthis, arg) native "ConsoleBase_dirxml_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_error_Callback(mthis, arg) native "ConsoleBase_error_Callback_RESOLVER_STRING_1_object";
+  static $error_Callback(mthis, arg) native "ConsoleBase_error_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_group_Callback(mthis, arg) native "ConsoleBase_group_Callback_RESOLVER_STRING_1_object";
+  static $group_Callback(mthis, arg) native "ConsoleBase_group_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_groupCollapsed_Callback(mthis, arg) native "ConsoleBase_groupCollapsed_Callback_RESOLVER_STRING_1_object";
+  static $groupCollapsed_Callback(mthis, arg) native "ConsoleBase_groupCollapsed_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_groupEnd_Callback(mthis) native "ConsoleBase_groupEnd_Callback_RESOLVER_STRING_0_";
+  static $groupEnd_Callback(mthis) native "ConsoleBase_groupEnd_Callback_RESOLVER_STRING_0_";
 
-Native_ConsoleBase_info_Callback(mthis, arg) native "ConsoleBase_info_Callback_RESOLVER_STRING_1_object";
+  static $info_Callback(mthis, arg) native "ConsoleBase_info_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_log_Callback(mthis, arg) native "ConsoleBase_log_Callback_RESOLVER_STRING_1_object";
+  static $log_Callback(mthis, arg) native "ConsoleBase_log_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_markTimeline_Callback(mthis, title) native "ConsoleBase_markTimeline_Callback_RESOLVER_STRING_1_DOMString";
+  static $markTimeline_Callback(mthis, title) native "ConsoleBase_markTimeline_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_profile_Callback(mthis, title) native "ConsoleBase_profile_Callback_RESOLVER_STRING_1_DOMString";
+  static $profile_Callback(mthis, title) native "ConsoleBase_profile_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_profileEnd_Callback(mthis, title) native "ConsoleBase_profileEnd_Callback_RESOLVER_STRING_1_DOMString";
+  static $profileEnd_Callback(mthis, title) native "ConsoleBase_profileEnd_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_table_Callback(mthis, arg) native "ConsoleBase_table_Callback_RESOLVER_STRING_1_object";
+  static $table_Callback(mthis, arg) native "ConsoleBase_table_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_time_Callback(mthis, title) native "ConsoleBase_time_Callback_RESOLVER_STRING_1_DOMString";
+  static $time_Callback(mthis, title) native "ConsoleBase_time_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_timeEnd_Callback(mthis, title) native "ConsoleBase_timeEnd_Callback_RESOLVER_STRING_1_DOMString";
+  static $timeEnd_Callback(mthis, title) native "ConsoleBase_timeEnd_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_timeStamp_Callback(mthis, title) native "ConsoleBase_timeStamp_Callback_RESOLVER_STRING_1_DOMString";
+  static $timeStamp_Callback(mthis, title) native "ConsoleBase_timeStamp_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_timeline_Callback(mthis, title) native "ConsoleBase_timeline_Callback_RESOLVER_STRING_1_DOMString";
+  static $timeline_Callback(mthis, title) native "ConsoleBase_timeline_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_timelineEnd_Callback(mthis, title) native "ConsoleBase_timelineEnd_Callback_RESOLVER_STRING_1_DOMString";
+  static $timelineEnd_Callback(mthis, title) native "ConsoleBase_timelineEnd_Callback_RESOLVER_STRING_1_DOMString";
+
+  static $trace_Callback(mthis, arg) native "ConsoleBase_trace_Callback_RESOLVER_STRING_1_object";
+
+  static $warn_Callback(mthis, arg) native "ConsoleBase_warn_Callback_RESOLVER_STRING_1_object";
+}
 
-Native_ConsoleBase_trace_Callback(mthis, arg) native "ConsoleBase_trace_Callback_RESOLVER_STRING_1_object";
+class BlinkConsole {
+  static $memory_Getter(mthis) native "Console_memory_Getter";
+}
 
-Native_ConsoleBase_warn_Callback(mthis, arg) native "ConsoleBase_warn_Callback_RESOLVER_STRING_1_object";
+class BlinkConvolverNode {
+  static $buffer_Getter(mthis) native "ConvolverNode_buffer_Getter";
 
-Native_Console_memory_Getter(mthis) native "Console_memory_Getter";
+  static $buffer_Setter(mthis, value) native "ConvolverNode_buffer_Setter";
 
-Native_ConvolverNode_buffer_Getter(mthis) native "ConvolverNode_buffer_Getter";
+  static $normalize_Getter(mthis) native "ConvolverNode_normalize_Getter";
 
-Native_ConvolverNode_buffer_Setter(mthis, value) native "ConvolverNode_buffer_Setter";
+  static $normalize_Setter(mthis, value) native "ConvolverNode_normalize_Setter";
+}
 
-Native_ConvolverNode_normalize_Getter(mthis) native "ConvolverNode_normalize_Getter";
+class BlinkCoordinates {
+  static $accuracy_Getter(mthis) native "Coordinates_accuracy_Getter";
 
-Native_ConvolverNode_normalize_Setter(mthis, value) native "ConvolverNode_normalize_Setter";
+  static $altitude_Getter(mthis) native "Coordinates_altitude_Getter";
 
-Native_Coordinates_accuracy_Getter(mthis) native "Coordinates_accuracy_Getter";
+  static $altitudeAccuracy_Getter(mthis) native "Coordinates_altitudeAccuracy_Getter";
 
-Native_Coordinates_altitude_Getter(mthis) native "Coordinates_altitude_Getter";
+  static $heading_Getter(mthis) native "Coordinates_heading_Getter";
 
-Native_Coordinates_altitudeAccuracy_Getter(mthis) native "Coordinates_altitudeAccuracy_Getter";
+  static $latitude_Getter(mthis) native "Coordinates_latitude_Getter";
 
-Native_Coordinates_heading_Getter(mthis) native "Coordinates_heading_Getter";
+  static $longitude_Getter(mthis) native "Coordinates_longitude_Getter";
 
-Native_Coordinates_latitude_Getter(mthis) native "Coordinates_latitude_Getter";
+  static $speed_Getter(mthis) native "Coordinates_speed_Getter";
+}
 
-Native_Coordinates_longitude_Getter(mthis) native "Coordinates_longitude_Getter";
+class BlinkCounter {}
 
-Native_Coordinates_speed_Getter(mthis) native "Coordinates_speed_Getter";
+class BlinkCrypto {
+  static $subtle_Getter(mthis) native "Crypto_subtle_Getter";
 
-Native_Crypto_subtle_Getter(mthis) native "Crypto_subtle_Getter";
+  static $getRandomValues_Callback(mthis, array) native "Crypto_getRandomValues_Callback";
+}
 
-Native_Crypto_getRandomValues_Callback(mthis, array) native "Crypto_getRandomValues_Callback";
+class BlinkCustomEvent {
+  static $detail_Getter(mthis) native "CustomEvent_detail_Getter";
 
-Native_CustomEvent_detail_Getter(mthis) native "CustomEvent_detail_Getter";
+  static $initCustomEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, detailArg) native "CustomEvent_initCustomEvent_Callback";
+}
 
-Native_CustomEvent_initCustomEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, detailArg) native "CustomEvent_initCustomEvent_Callback";
+class BlinkDOMError {
+  static $message_Getter(mthis) native "DOMError_message_Getter";
 
-Native_DOMError_message_Getter(mthis) native "DOMError_message_Getter";
+  static $name_Getter(mthis) native "DOMError_name_Getter";
+}
 
-Native_DOMError_name_Getter(mthis) native "DOMError_name_Getter";
+class BlinkDOMException {
+  static $message_Getter(mthis) native "DOMException_message_Getter";
 
-Native_DOMException_message_Getter(mthis) native "DOMException_message_Getter";
+  static $name_Getter(mthis) native "DOMException_name_Getter";
 
-Native_DOMException_name_Getter(mthis) native "DOMException_name_Getter";
+  static $toString_Callback(mthis) native "DOMException_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_DOMException_toString_Callback(mthis) native "DOMException_toString_Callback_RESOLVER_STRING_0_";
+class BlinkDOMFileSystem {
+  static $name_Getter(mthis) native "DOMFileSystem_name_Getter";
 
-Native_DOMFileSystem_name_Getter(mthis) native "DOMFileSystem_name_Getter";
+  static $root_Getter(mthis) native "DOMFileSystem_root_Getter";
+}
 
-Native_DOMFileSystem_root_Getter(mthis) native "DOMFileSystem_root_Getter";
+class BlinkDOMFileSystemSync {}
 
-Native_DOMImplementation_createDocument_Callback(mthis, namespaceURI, qualifiedName, doctype) native "DOMImplementation_createDocument_Callback_RESOLVER_STRING_3_DOMString_DOMString_DocumentType";
+class BlinkDOMImplementation {
+  static $createDocument_Callback(mthis, namespaceURI, qualifiedName, doctype) native "DOMImplementation_createDocument_Callback_RESOLVER_STRING_3_DOMString_DOMString_DocumentType";
 
-Native_DOMImplementation_createDocumentType_Callback(mthis, qualifiedName, publicId, systemId) native "DOMImplementation_createDocumentType_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $createDocumentType_Callback(mthis, qualifiedName, publicId, systemId) native "DOMImplementation_createDocumentType_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_DOMImplementation_createHTMLDocument_Callback(mthis, title) native "DOMImplementation_createHTMLDocument_Callback_RESOLVER_STRING_1_DOMString";
+  static $createHTMLDocument_Callback(mthis, title) native "DOMImplementation_createHTMLDocument_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DOMImplementation_hasFeature_Callback(mthis, feature, version) native "DOMImplementation_hasFeature_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $hasFeature_Callback(mthis, feature, version) native "DOMImplementation_hasFeature_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+}
 
+class BlinkDOMParser {
   // Generated overload resolver
-Native_DOMParser_DomParser() {
-    return Native_DOMParser__create_1constructorCallback();
+  static $mkDomParser() {
+    return $_create_1constructorCallback();
   }
 
-Native_DOMParser__create_1constructorCallback() native "DOMParser_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "DOMParser_constructorCallback_RESOLVER_STRING_0_";
 
-Native_DOMParser_parseFromString_Callback(mthis, str, contentType) native "DOMParser_parseFromString_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $parseFromString_Callback(mthis, str, contentType) native "DOMParser_parseFromString_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+}
 
-Native_DOMTokenList_length_Getter(mthis) native "DOMTokenList_length_Getter";
+class BlinkDOMTokenList {
+  static $length_Getter(mthis) native "DOMTokenList_length_Getter";
 
-Native_DOMTokenList_contains_Callback(mthis, token) native "DOMTokenList_contains_Callback_RESOLVER_STRING_1_DOMString";
+  static $contains_Callback(mthis, token) native "DOMTokenList_contains_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DOMTokenList_item_Callback(mthis, index) native "DOMTokenList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "DOMTokenList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_DOMTokenList_toString_Callback(mthis) native "DOMTokenList_toString_Callback_RESOLVER_STRING_0_";
+  static $toString_Callback(mthis) native "DOMTokenList_toString_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_DOMTokenList_toggle(mthis, token, force) {
+  static $toggle(mthis, token, force) {
     if (force != null) {
-      return Native_DOMTokenList__toggle_1_Callback(mthis, token, force);
+      return $_toggle_1_Callback(mthis, token, force);
     }
-    return Native_DOMTokenList__toggle_2_Callback(mthis, token);
+    return $_toggle_2_Callback(mthis, token);
   }
 
-Native_DOMTokenList__toggle_1_Callback(mthis, token, force) native "DOMTokenList_toggle_Callback_RESOLVER_STRING_2_DOMString_boolean";
+  static $_toggle_1_Callback(mthis, token, force) native "DOMTokenList_toggle_Callback_RESOLVER_STRING_2_DOMString_boolean";
 
-Native_DOMTokenList__toggle_2_Callback(mthis, token) native "DOMTokenList_toggle_Callback_RESOLVER_STRING_1_DOMString";
+  static $_toggle_2_Callback(mthis, token) native "DOMTokenList_toggle_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_DOMSettableTokenList_value_Getter(mthis) native "DOMSettableTokenList_value_Getter";
+class BlinkDOMSettableTokenList {
+  static $value_Getter(mthis) native "DOMSettableTokenList_value_Getter";
 
-Native_DOMSettableTokenList_value_Setter(mthis, value) native "DOMSettableTokenList_value_Setter";
+  static $value_Setter(mthis, value) native "DOMSettableTokenList_value_Setter";
 
-Native_DOMSettableTokenList___getter___Callback(mthis, index) native "DOMSettableTokenList___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $__getter___Callback(mthis, index) native "DOMSettableTokenList___getter___Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_DOMStringList_length_Getter(mthis) native "DOMStringList_length_Getter";
+class BlinkDOMStringList {
+  static $length_Getter(mthis) native "DOMStringList_length_Getter";
 
-Native_DOMStringList_NativeIndexed_Getter(mthis, index) native "DOMStringList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "DOMStringList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_DOMStringList_contains_Callback(mthis, string) native "DOMStringList_contains_Callback_RESOLVER_STRING_1_DOMString";
+  static $contains_Callback(mthis, string) native "DOMStringList_contains_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DOMStringList_item_Callback(mthis, index) native "DOMStringList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "DOMStringList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
+class BlinkDOMStringMap {
   // Generated overload resolver
-Native_DOMStringMap___delete__(mthis, index_OR_name) {
+  static $__delete__(mthis, index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return Native_DOMStringMap____delete___1_Callback(mthis, index_OR_name);
+      return $___delete___1_Callback(mthis, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return Native_DOMStringMap____delete___2_Callback(mthis, index_OR_name);
+      return $___delete___2_Callback(mthis, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_DOMStringMap____delete___1_Callback(mthis, index_OR_name) native "DOMStringMap___delete___Callback_RESOLVER_STRING_1_unsigned long";
+  static $___delete___1_Callback(mthis, index_OR_name) native "DOMStringMap___delete___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_DOMStringMap____delete___2_Callback(mthis, index_OR_name) native "DOMStringMap___delete___Callback_RESOLVER_STRING_1_DOMString";
+  static $___delete___2_Callback(mthis, index_OR_name) native "DOMStringMap___delete___Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_DOMStringMap___getter__(mthis, index_OR_name) {
+  static $__getter__(mthis, index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return Native_DOMStringMap____getter___1_Callback(mthis, index_OR_name);
+      return $___getter___1_Callback(mthis, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return Native_DOMStringMap____getter___2_Callback(mthis, index_OR_name);
+      return $___getter___2_Callback(mthis, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_DOMStringMap____getter___1_Callback(mthis, index_OR_name) native "DOMStringMap___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $___getter___1_Callback(mthis, index_OR_name) native "DOMStringMap___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_DOMStringMap____getter___2_Callback(mthis, index_OR_name) native "DOMStringMap___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $___getter___2_Callback(mthis, index_OR_name) native "DOMStringMap___getter___Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_DOMStringMap___setter__(mthis, index_OR_name, value) {
+  static $__setter__(mthis, index_OR_name, value) {
     if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
-      Native_DOMStringMap____setter___1_Callback(mthis, index_OR_name, value);
+      $___setter___1_Callback(mthis, index_OR_name, value);
       return;
     }
     if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
-      Native_DOMStringMap____setter___2_Callback(mthis, index_OR_name, value);
+      $___setter___2_Callback(mthis, index_OR_name, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_DOMStringMap____setter___1_Callback(mthis, index_OR_name, value) native "DOMStringMap___setter___Callback_RESOLVER_STRING_2_unsigned long_DOMString";
+  static $___setter___1_Callback(mthis, index_OR_name, value) native "DOMStringMap___setter___Callback_RESOLVER_STRING_2_unsigned long_DOMString";
 
-Native_DOMStringMap____setter___2_Callback(mthis, index_OR_name, value) native "DOMStringMap___setter___Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $___setter___2_Callback(mthis, index_OR_name, value) native "DOMStringMap___setter___Callback_RESOLVER_STRING_2_DOMString_DOMString";
+}
 
-Native_DataTransferItem_kind_Getter(mthis) native "DataTransferItem_kind_Getter";
+class BlinkDataTransferItem {
+  static $kind_Getter(mthis) native "DataTransferItem_kind_Getter";
 
-Native_DataTransferItem_type_Getter(mthis) native "DataTransferItem_type_Getter";
+  static $type_Getter(mthis) native "DataTransferItem_type_Getter";
 
-Native_DataTransferItem_getAsFile_Callback(mthis) native "DataTransferItem_getAsFile_Callback_RESOLVER_STRING_0_";
+  static $getAsFile_Callback(mthis) native "DataTransferItem_getAsFile_Callback_RESOLVER_STRING_0_";
 
-Native_DataTransferItem_getAsString_Callback(mthis, callback) native "DataTransferItem_getAsString_Callback_RESOLVER_STRING_1_StringCallback";
+  static $getAsString_Callback(mthis, callback) native "DataTransferItem_getAsString_Callback_RESOLVER_STRING_1_StringCallback";
 
-Native_DataTransferItem_webkitGetAsEntry_Callback(mthis) native "DataTransferItem_webkitGetAsEntry_Callback_RESOLVER_STRING_0_";
+  static $webkitGetAsEntry_Callback(mthis) native "DataTransferItem_webkitGetAsEntry_Callback_RESOLVER_STRING_0_";
+}
 
-Native_DataTransferItemList_length_Getter(mthis) native "DataTransferItemList_length_Getter";
+class BlinkDataTransferItemList {
+  static $length_Getter(mthis) native "DataTransferItemList_length_Getter";
 
-Native_DataTransferItemList___getter___Callback(mthis, index) native "DataTransferItemList___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $__getter___Callback(mthis, index) native "DataTransferItemList___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
-Native_DataTransferItemList_add(mthis, data_OR_file, type) {
+  static $add(mthis, data_OR_file, type) {
     if ((data_OR_file is File || data_OR_file == null) && type == null) {
-      return Native_DataTransferItemList__add_1_Callback(mthis, data_OR_file);
+      return $_add_1_Callback(mthis, data_OR_file);
     }
     if ((type is String || type == null) && (data_OR_file is String || data_OR_file == null)) {
-      return Native_DataTransferItemList__add_2_Callback(mthis, data_OR_file, type);
+      return $_add_2_Callback(mthis, data_OR_file, type);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_DataTransferItemList__add_1_Callback(mthis, data_OR_file) native "DataTransferItemList_add_Callback_RESOLVER_STRING_1_File";
+  static $_add_1_Callback(mthis, data_OR_file) native "DataTransferItemList_add_Callback_RESOLVER_STRING_1_File";
 
-Native_DataTransferItemList__add_2_Callback(mthis, data_OR_file, type) native "DataTransferItemList_add_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $_add_2_Callback(mthis, data_OR_file, type) native "DataTransferItemList_add_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_DataTransferItemList_addData_Callback(mthis, data, type) native "DataTransferItemList_add_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $addData_Callback(mthis, data, type) native "DataTransferItemList_add_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_DataTransferItemList_addFile_Callback(mthis, file) native "DataTransferItemList_add_Callback_RESOLVER_STRING_1_File";
+  static $addFile_Callback(mthis, file) native "DataTransferItemList_add_Callback_RESOLVER_STRING_1_File";
 
-Native_DataTransferItemList_clear_Callback(mthis) native "DataTransferItemList_clear_Callback_RESOLVER_STRING_0_";
+  static $clear_Callback(mthis) native "DataTransferItemList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_DataTransferItemList_remove_Callback(mthis, index) native "DataTransferItemList_remove_Callback_RESOLVER_STRING_1_unsigned long";
+  static $remove_Callback(mthis, index) native "DataTransferItemList_remove_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_Database_version_Getter(mthis) native "Database_version_Getter";
+class BlinkDatabase {
+  static $version_Getter(mthis) native "Database_version_Getter";
 
-Native_Database_changeVersion_Callback(mthis, oldVersion, newVersion, callback, errorCallback, successCallback) native "Database_changeVersion_Callback_RESOLVER_STRING_5_DOMString_DOMString_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
+  static $changeVersion_Callback(mthis, oldVersion, newVersion, callback, errorCallback, successCallback) native "Database_changeVersion_Callback_RESOLVER_STRING_5_DOMString_DOMString_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
 
-Native_Database_readTransaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_readTransaction_Callback_RESOLVER_STRING_3_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
+  static $readTransaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_readTransaction_Callback_RESOLVER_STRING_3_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
 
-Native_Database_transaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_transaction_Callback_RESOLVER_STRING_3_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
+  static $transaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_transaction_Callback_RESOLVER_STRING_3_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
+}
 
-Native_WindowBase64_atob_Callback(mthis, string) native "WindowBase64_atob_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkDatabaseSync {}
 
-Native_WindowBase64_btoa_Callback(mthis, string) native "WindowBase64_btoa_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkWindowBase64 {
+  static $atob_Callback(mthis, string) native "WindowBase64_atob_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WindowTimers_clearInterval_Callback(mthis, handle) native "WindowTimers_clearInterval_Callback_RESOLVER_STRING_1_long";
+  static $btoa_Callback(mthis, string) native "WindowBase64_btoa_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_WindowTimers_clearTimeout_Callback(mthis, handle) native "WindowTimers_clearTimeout_Callback_RESOLVER_STRING_1_long";
+class BlinkWindowTimers {
+  static $clearInterval_Callback(mthis, handle) native "WindowTimers_clearInterval_Callback_RESOLVER_STRING_1_long";
 
-Native_WindowTimers_setInterval_Callback(mthis, handler, timeout) native "WindowTimers_setInterval_Callback";
+  static $clearTimeout_Callback(mthis, handle) native "WindowTimers_clearTimeout_Callback_RESOLVER_STRING_1_long";
 
-Native_WindowTimers_setTimeout_Callback(mthis, handler, timeout) native "WindowTimers_setTimeout_Callback";
+  static $setInterval_Callback(mthis, handler, timeout) native "WindowTimers_setInterval_Callback";
 
-Native_WorkerGlobalScope_console_Getter(mthis) native "WorkerGlobalScope_console_Getter";
+  static $setTimeout_Callback(mthis, handler, timeout) native "WindowTimers_setTimeout_Callback";
+}
 
-Native_WorkerGlobalScope_crypto_Getter(mthis) native "WorkerGlobalScope_crypto_Getter";
+class BlinkWorkerGlobalScope {
+  static $console_Getter(mthis) native "WorkerGlobalScope_console_Getter";
 
-Native_WorkerGlobalScope_indexedDB_Getter(mthis) native "WorkerGlobalScope_indexedDB_Getter";
+  static $crypto_Getter(mthis) native "WorkerGlobalScope_crypto_Getter";
 
-Native_WorkerGlobalScope_location_Getter(mthis) native "WorkerGlobalScope_location_Getter";
+  static $indexedDB_Getter(mthis) native "WorkerGlobalScope_indexedDB_Getter";
 
-Native_WorkerGlobalScope_navigator_Getter(mthis) native "WorkerGlobalScope_navigator_Getter";
+  static $location_Getter(mthis) native "WorkerGlobalScope_location_Getter";
 
-Native_WorkerGlobalScope_performance_Getter(mthis) native "WorkerGlobalScope_performance_Getter";
+  static $navigator_Getter(mthis) native "WorkerGlobalScope_navigator_Getter";
 
-Native_WorkerGlobalScope_self_Getter(mthis) native "WorkerGlobalScope_self_Getter";
+  static $performance_Getter(mthis) native "WorkerGlobalScope_performance_Getter";
 
-Native_WorkerGlobalScope_close_Callback(mthis) native "WorkerGlobalScope_close_Callback_RESOLVER_STRING_0_";
+  static $self_Getter(mthis) native "WorkerGlobalScope_self_Getter";
 
-Native_WorkerGlobalScope_openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabase_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
+  static $close_Callback(mthis) native "WorkerGlobalScope_close_Callback_RESOLVER_STRING_0_";
 
-Native_WorkerGlobalScope_openDatabaseSync_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabaseSync_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
+  static $openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabase_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
 
-Native_WorkerGlobalScope_webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "WorkerGlobalScope_webkitRequestFileSystem_Callback_RESOLVER_STRING_4_unsigned short_long long_FileSystemCallback_ErrorCallback";
+  static $openDatabaseSync_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabaseSync_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
 
-Native_WorkerGlobalScope_webkitRequestFileSystemSync_Callback(mthis, type, size) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback_RESOLVER_STRING_2_unsigned short_long long";
+  static $webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "WorkerGlobalScope_webkitRequestFileSystem_Callback_RESOLVER_STRING_4_unsigned short_long long_FileSystemCallback_ErrorCallback";
 
-Native_WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback(mthis, url) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback_RESOLVER_STRING_1_DOMString";
+  static $webkitRequestFileSystemSync_Callback(mthis, type, size) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback_RESOLVER_STRING_2_unsigned short_long long";
 
-Native_WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback_RESOLVER_STRING_3_DOMString_EntryCallback_ErrorCallback";
+  static $webkitResolveLocalFileSystemSyncURL_Callback(mthis, url) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WorkerGlobalScope_atob_Callback(mthis, string) native "WorkerGlobalScope_atob_Callback_RESOLVER_STRING_1_DOMString";
+  static $webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback_RESOLVER_STRING_3_DOMString_EntryCallback_ErrorCallback";
 
-Native_WorkerGlobalScope_btoa_Callback(mthis, string) native "WorkerGlobalScope_btoa_Callback_RESOLVER_STRING_1_DOMString";
+  static $atob_Callback(mthis, string) native "WorkerGlobalScope_atob_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WorkerGlobalScope_clearInterval_Callback(mthis, handle) native "WorkerGlobalScope_clearInterval_Callback_RESOLVER_STRING_1_long";
+  static $btoa_Callback(mthis, string) native "WorkerGlobalScope_btoa_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WorkerGlobalScope_clearTimeout_Callback(mthis, handle) native "WorkerGlobalScope_clearTimeout_Callback_RESOLVER_STRING_1_long";
+  static $clearInterval_Callback(mthis, handle) native "WorkerGlobalScope_clearInterval_Callback_RESOLVER_STRING_1_long";
 
-Native_WorkerGlobalScope_setInterval_Callback(mthis, handler, timeout) native "WorkerGlobalScope_setInterval_Callback";
+  static $clearTimeout_Callback(mthis, handle) native "WorkerGlobalScope_clearTimeout_Callback_RESOLVER_STRING_1_long";
 
-Native_WorkerGlobalScope_setTimeout_Callback(mthis, handler, timeout) native "WorkerGlobalScope_setTimeout_Callback";
+  static $setInterval_Callback(mthis, handler, timeout) native "WorkerGlobalScope_setInterval_Callback";
 
-Native_DedicatedWorkerGlobalScope_postMessage_Callback(mthis, message, messagePorts) native "DedicatedWorkerGlobalScope_postMessage_Callback";
+  static $setTimeout_Callback(mthis, handler, timeout) native "WorkerGlobalScope_setTimeout_Callback";
+}
 
-Native_DelayNode_delayTime_Getter(mthis) native "DelayNode_delayTime_Getter";
+class BlinkDedicatedWorkerGlobalScope {
+  static $postMessage_Callback(mthis, message, messagePorts) native "DedicatedWorkerGlobalScope_postMessage_Callback";
+}
 
-Native_DeprecatedStorageInfo_queryUsageAndQuota_Callback(mthis, storageType, usageCallback, errorCallback) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback_RESOLVER_STRING_3_unsigned short_StorageUsageCallback_StorageErrorCallback";
+class BlinkDelayNode {
+  static $delayTime_Getter(mthis) native "DelayNode_delayTime_Getter";
+}
 
-Native_DeprecatedStorageInfo_requestQuota_Callback(mthis, storageType, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageInfo_requestQuota_Callback_RESOLVER_STRING_4_unsigned short_unsigned long long_StorageQuotaCallback_StorageErrorCallback";
+class BlinkDeprecatedStorageInfo {
+  static $queryUsageAndQuota_Callback(mthis, storageType, usageCallback, errorCallback) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback_RESOLVER_STRING_3_unsigned short_StorageUsageCallback_StorageErrorCallback";
 
-Native_DeprecatedStorageQuota_queryUsageAndQuota_Callback(mthis, usageCallback, errorCallback) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback_RESOLVER_STRING_2_StorageUsageCallback_StorageErrorCallback";
+  static $requestQuota_Callback(mthis, storageType, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageInfo_requestQuota_Callback_RESOLVER_STRING_4_unsigned short_unsigned long long_StorageQuotaCallback_StorageErrorCallback";
+}
 
-Native_DeprecatedStorageQuota_requestQuota_Callback(mthis, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageQuota_requestQuota_Callback_RESOLVER_STRING_3_unsigned long long_StorageQuotaCallback_StorageErrorCallback";
+class BlinkDeprecatedStorageQuota {
+  static $queryUsageAndQuota_Callback(mthis, usageCallback, errorCallback) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback_RESOLVER_STRING_2_StorageUsageCallback_StorageErrorCallback";
 
-Native_DeviceAcceleration_x_Getter(mthis) native "DeviceAcceleration_x_Getter";
+  static $requestQuota_Callback(mthis, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageQuota_requestQuota_Callback_RESOLVER_STRING_3_unsigned long long_StorageQuotaCallback_StorageErrorCallback";
+}
 
-Native_DeviceAcceleration_y_Getter(mthis) native "DeviceAcceleration_y_Getter";
+class BlinkDeviceAcceleration {
+  static $x_Getter(mthis) native "DeviceAcceleration_x_Getter";
 
-Native_DeviceAcceleration_z_Getter(mthis) native "DeviceAcceleration_z_Getter";
+  static $y_Getter(mthis) native "DeviceAcceleration_y_Getter";
 
-Native_DeviceMotionEvent_acceleration_Getter(mthis) native "DeviceMotionEvent_acceleration_Getter";
+  static $z_Getter(mthis) native "DeviceAcceleration_z_Getter";
+}
 
-Native_DeviceMotionEvent_accelerationIncludingGravity_Getter(mthis) native "DeviceMotionEvent_accelerationIncludingGravity_Getter";
+class BlinkDeviceMotionEvent {
+  static $acceleration_Getter(mthis) native "DeviceMotionEvent_acceleration_Getter";
 
-Native_DeviceMotionEvent_interval_Getter(mthis) native "DeviceMotionEvent_interval_Getter";
+  static $accelerationIncludingGravity_Getter(mthis) native "DeviceMotionEvent_accelerationIncludingGravity_Getter";
 
-Native_DeviceMotionEvent_rotationRate_Getter(mthis) native "DeviceMotionEvent_rotationRate_Getter";
+  static $interval_Getter(mthis) native "DeviceMotionEvent_interval_Getter";
 
-Native_DeviceMotionEvent_initDeviceMotionEvent_Callback(mthis, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  static $rotationRate_Getter(mthis) native "DeviceMotionEvent_rotationRate_Getter";
 
-Native_DeviceOrientationEvent_absolute_Getter(mthis) native "DeviceOrientationEvent_absolute_Getter";
+  static $initDeviceMotionEvent_Callback(mthis, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+}
 
-Native_DeviceOrientationEvent_alpha_Getter(mthis) native "DeviceOrientationEvent_alpha_Getter";
+class BlinkDeviceOrientationEvent {
+  static $absolute_Getter(mthis) native "DeviceOrientationEvent_absolute_Getter";
 
-Native_DeviceOrientationEvent_beta_Getter(mthis) native "DeviceOrientationEvent_beta_Getter";
+  static $alpha_Getter(mthis) native "DeviceOrientationEvent_alpha_Getter";
 
-Native_DeviceOrientationEvent_gamma_Getter(mthis) native "DeviceOrientationEvent_gamma_Getter";
+  static $beta_Getter(mthis) native "DeviceOrientationEvent_beta_Getter";
 
-Native_DeviceOrientationEvent_initDeviceOrientationEvent_Callback(mthis, type, bubbles, cancelable, alpha, beta, gamma, absolute) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  static $gamma_Getter(mthis) native "DeviceOrientationEvent_gamma_Getter";
 
-Native_DeviceRotationRate_alpha_Getter(mthis) native "DeviceRotationRate_alpha_Getter";
+  static $initDeviceOrientationEvent_Callback(mthis, type, bubbles, cancelable, alpha, beta, gamma, absolute) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+}
 
-Native_DeviceRotationRate_beta_Getter(mthis) native "DeviceRotationRate_beta_Getter";
+class BlinkDeviceRotationRate {
+  static $alpha_Getter(mthis) native "DeviceRotationRate_alpha_Getter";
 
-Native_DeviceRotationRate_gamma_Getter(mthis) native "DeviceRotationRate_gamma_Getter";
+  static $beta_Getter(mthis) native "DeviceRotationRate_beta_Getter";
 
-Native_Entry_filesystem_Getter(mthis) native "Entry_filesystem_Getter";
+  static $gamma_Getter(mthis) native "DeviceRotationRate_gamma_Getter";
+}
 
-Native_Entry_fullPath_Getter(mthis) native "Entry_fullPath_Getter";
+class BlinkEntry {
+  static $filesystem_Getter(mthis) native "Entry_filesystem_Getter";
 
-Native_Entry_isDirectory_Getter(mthis) native "Entry_isDirectory_Getter";
+  static $fullPath_Getter(mthis) native "Entry_fullPath_Getter";
 
-Native_Entry_isFile_Getter(mthis) native "Entry_isFile_Getter";
+  static $isDirectory_Getter(mthis) native "Entry_isDirectory_Getter";
 
-Native_Entry_name_Getter(mthis) native "Entry_name_Getter";
+  static $isFile_Getter(mthis) native "Entry_isFile_Getter";
+
+  static $name_Getter(mthis) native "Entry_name_Getter";
 
   // Generated overload resolver
-Native_Entry__copyTo(mthis, parent, name, successCallback, errorCallback) {
+  static $_copyTo(mthis, parent, name, successCallback, errorCallback) {
     if (name != null) {
-      Native_Entry__copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback);
+      $_copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback);
       return;
     }
-    Native_Entry__copyTo_2_Callback(mthis, parent);
+    $_copyTo_2_Callback(mthis, parent);
     return;
   }
 
-Native_Entry__copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry_copyTo_Callback_RESOLVER_STRING_4_DirectoryEntry_DOMString_EntryCallback_ErrorCallback";
+  static $_copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry_copyTo_Callback_RESOLVER_STRING_4_DirectoryEntry_DOMString_EntryCallback_ErrorCallback";
 
-Native_Entry__copyTo_2_Callback(mthis, parent) native "Entry_copyTo_Callback_RESOLVER_STRING_1_DirectoryEntry";
+  static $_copyTo_2_Callback(mthis, parent) native "Entry_copyTo_Callback_RESOLVER_STRING_1_DirectoryEntry";
 
-Native_Entry_getMetadata_Callback(mthis, successCallback, errorCallback) native "Entry_getMetadata_Callback_RESOLVER_STRING_2_MetadataCallback_ErrorCallback";
+  static $getMetadata_Callback(mthis, successCallback, errorCallback) native "Entry_getMetadata_Callback_RESOLVER_STRING_2_MetadataCallback_ErrorCallback";
 
-Native_Entry_getParent_Callback(mthis, successCallback, errorCallback) native "Entry_getParent_Callback_RESOLVER_STRING_2_EntryCallback_ErrorCallback";
+  static $getParent_Callback(mthis, successCallback, errorCallback) native "Entry_getParent_Callback_RESOLVER_STRING_2_EntryCallback_ErrorCallback";
 
   // Generated overload resolver
-Native_Entry__moveTo(mthis, parent, name, successCallback, errorCallback) {
+  static $_moveTo(mthis, parent, name, successCallback, errorCallback) {
     if (name != null) {
-      Native_Entry__moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback);
+      $_moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback);
       return;
     }
-    Native_Entry__moveTo_2_Callback(mthis, parent);
+    $_moveTo_2_Callback(mthis, parent);
     return;
   }
 
-Native_Entry__moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry_moveTo_Callback_RESOLVER_STRING_4_DirectoryEntry_DOMString_EntryCallback_ErrorCallback";
+  static $_moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry_moveTo_Callback_RESOLVER_STRING_4_DirectoryEntry_DOMString_EntryCallback_ErrorCallback";
 
-Native_Entry__moveTo_2_Callback(mthis, parent) native "Entry_moveTo_Callback_RESOLVER_STRING_1_DirectoryEntry";
+  static $_moveTo_2_Callback(mthis, parent) native "Entry_moveTo_Callback_RESOLVER_STRING_1_DirectoryEntry";
 
-Native_Entry_remove_Callback(mthis, successCallback, errorCallback) native "Entry_remove_Callback_RESOLVER_STRING_2_VoidCallback_ErrorCallback";
+  static $remove_Callback(mthis, successCallback, errorCallback) native "Entry_remove_Callback_RESOLVER_STRING_2_VoidCallback_ErrorCallback";
 
-Native_Entry_toURL_Callback(mthis) native "Entry_toURL_Callback_RESOLVER_STRING_0_";
+  static $toURL_Callback(mthis) native "Entry_toURL_Callback_RESOLVER_STRING_0_";
+}
 
-Native_DirectoryEntry_createReader_Callback(mthis) native "DirectoryEntry_createReader_Callback_RESOLVER_STRING_0_";
+class BlinkDirectoryEntry {
+  static $createReader_Callback(mthis) native "DirectoryEntry_createReader_Callback_RESOLVER_STRING_0_";
 
-Native_DirectoryEntry_getDirectory_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getDirectory_Callback_RESOLVER_STRING_4_DOMString_Dictionary_EntryCallback_ErrorCallback";
+  static $getDirectory_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getDirectory_Callback_RESOLVER_STRING_4_DOMString_Dictionary_EntryCallback_ErrorCallback";
 
-Native_DirectoryEntry_getFile_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getFile_Callback_RESOLVER_STRING_4_DOMString_Dictionary_EntryCallback_ErrorCallback";
+  static $getFile_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getFile_Callback_RESOLVER_STRING_4_DOMString_Dictionary_EntryCallback_ErrorCallback";
 
-Native_DirectoryEntry_removeRecursively_Callback(mthis, successCallback, errorCallback) native "DirectoryEntry_removeRecursively_Callback_RESOLVER_STRING_2_VoidCallback_ErrorCallback";
+  static $removeRecursively_Callback(mthis, successCallback, errorCallback) native "DirectoryEntry_removeRecursively_Callback_RESOLVER_STRING_2_VoidCallback_ErrorCallback";
+}
 
-Native_DirectoryReader_readEntries_Callback(mthis, successCallback, errorCallback) native "DirectoryReader_readEntries_Callback_RESOLVER_STRING_2_EntriesCallback_ErrorCallback";
+class BlinkEntrySync {}
 
-Native_ParentNode_childElementCount_Getter(mthis) native "ParentNode_childElementCount_Getter";
+class BlinkDirectoryEntrySync {}
 
-Native_ParentNode_children_Getter(mthis) native "ParentNode_children_Getter";
+class BlinkDirectoryReader {
+  static $readEntries_Callback(mthis, successCallback, errorCallback) native "DirectoryReader_readEntries_Callback_RESOLVER_STRING_2_EntriesCallback_ErrorCallback";
+}
 
-Native_ParentNode_firstElementChild_Getter(mthis) native "ParentNode_firstElementChild_Getter";
+class BlinkDirectoryReaderSync {}
 
-Native_ParentNode_lastElementChild_Getter(mthis) native "ParentNode_lastElementChild_Getter";
+class BlinkGlobalEventHandlers {}
 
-Native_Document_activeElement_Getter(mthis) native "Document_activeElement_Getter";
+class BlinkParentNode {
+  static $childElementCount_Getter(mthis) native "ParentNode_childElementCount_Getter";
 
-Native_Document_body_Getter(mthis) native "Document_body_Getter";
+  static $children_Getter(mthis) native "ParentNode_children_Getter";
 
-Native_Document_body_Setter(mthis, value) native "Document_body_Setter";
+  static $firstElementChild_Getter(mthis) native "ParentNode_firstElementChild_Getter";
 
-Native_Document_cookie_Getter(mthis) native "Document_cookie_Getter";
+  static $lastElementChild_Getter(mthis) native "ParentNode_lastElementChild_Getter";
+}
 
-Native_Document_cookie_Setter(mthis, value) native "Document_cookie_Setter";
+class BlinkDocument {
+  static $activeElement_Getter(mthis) native "Document_activeElement_Getter";
 
-Native_Document_currentScript_Getter(mthis) native "Document_currentScript_Getter";
+  static $body_Getter(mthis) native "Document_body_Getter";
 
-Native_Document_defaultView_Getter(mthis) native "Document_defaultView_Getter";
+  static $body_Setter(mthis, value) native "Document_body_Setter";
 
-Native_Document_documentElement_Getter(mthis) native "Document_documentElement_Getter";
+  static $cookie_Getter(mthis) native "Document_cookie_Getter";
 
-Native_Document_domain_Getter(mthis) native "Document_domain_Getter";
+  static $cookie_Setter(mthis, value) native "Document_cookie_Setter";
 
-Native_Document_fonts_Getter(mthis) native "Document_fonts_Getter";
+  static $currentScript_Getter(mthis) native "Document_currentScript_Getter";
 
-Native_Document_head_Getter(mthis) native "Document_head_Getter";
+  static $defaultView_Getter(mthis) native "Document_defaultView_Getter";
 
-Native_Document_hidden_Getter(mthis) native "Document_hidden_Getter";
+  static $documentElement_Getter(mthis) native "Document_documentElement_Getter";
 
-Native_Document_implementation_Getter(mthis) native "Document_implementation_Getter";
+  static $domain_Getter(mthis) native "Document_domain_Getter";
 
-Native_Document_lastModified_Getter(mthis) native "Document_lastModified_Getter";
+  static $fonts_Getter(mthis) native "Document_fonts_Getter";
 
-Native_Document_preferredStylesheetSet_Getter(mthis) native "Document_preferredStylesheetSet_Getter";
+  static $head_Getter(mthis) native "Document_head_Getter";
 
-Native_Document_readyState_Getter(mthis) native "Document_readyState_Getter";
+  static $hidden_Getter(mthis) native "Document_hidden_Getter";
 
-Native_Document_referrer_Getter(mthis) native "Document_referrer_Getter";
+  static $implementation_Getter(mthis) native "Document_implementation_Getter";
 
-Native_Document_rootElement_Getter(mthis) native "Document_rootElement_Getter";
+  static $lastModified_Getter(mthis) native "Document_lastModified_Getter";
 
-Native_Document_selectedStylesheetSet_Getter(mthis) native "Document_selectedStylesheetSet_Getter";
+  static $preferredStylesheetSet_Getter(mthis) native "Document_preferredStylesheetSet_Getter";
 
-Native_Document_selectedStylesheetSet_Setter(mthis, value) native "Document_selectedStylesheetSet_Setter";
+  static $readyState_Getter(mthis) native "Document_readyState_Getter";
 
-Native_Document_styleSheets_Getter(mthis) native "Document_styleSheets_Getter";
+  static $referrer_Getter(mthis) native "Document_referrer_Getter";
 
-Native_Document_timeline_Getter(mthis) native "Document_timeline_Getter";
+  static $rootElement_Getter(mthis) native "Document_rootElement_Getter";
 
-Native_Document_title_Getter(mthis) native "Document_title_Getter";
+  static $selectedStylesheetSet_Getter(mthis) native "Document_selectedStylesheetSet_Getter";
 
-Native_Document_title_Setter(mthis, value) native "Document_title_Setter";
+  static $selectedStylesheetSet_Setter(mthis, value) native "Document_selectedStylesheetSet_Setter";
 
-Native_Document_visibilityState_Getter(mthis) native "Document_visibilityState_Getter";
+  static $styleSheets_Getter(mthis) native "Document_styleSheets_Getter";
 
-Native_Document_webkitFullscreenElement_Getter(mthis) native "Document_webkitFullscreenElement_Getter";
+  static $timeline_Getter(mthis) native "Document_timeline_Getter";
 
-Native_Document_webkitFullscreenEnabled_Getter(mthis) native "Document_webkitFullscreenEnabled_Getter";
+  static $title_Getter(mthis) native "Document_title_Getter";
 
-Native_Document_webkitHidden_Getter(mthis) native "Document_webkitHidden_Getter";
+  static $title_Setter(mthis, value) native "Document_title_Setter";
 
-Native_Document_webkitPointerLockElement_Getter(mthis) native "Document_webkitPointerLockElement_Getter";
+  static $visibilityState_Getter(mthis) native "Document_visibilityState_Getter";
 
-Native_Document_webkitVisibilityState_Getter(mthis) native "Document_webkitVisibilityState_Getter";
+  static $webkitFullscreenElement_Getter(mthis) native "Document_webkitFullscreenElement_Getter";
 
-Native_Document_adoptNode_Callback(mthis, node) native "Document_adoptNode_Callback_RESOLVER_STRING_1_Node";
+  static $webkitFullscreenEnabled_Getter(mthis) native "Document_webkitFullscreenEnabled_Getter";
 
-Native_Document_caretRangeFromPoint_Callback(mthis, x, y) native "Document_caretRangeFromPoint_Callback_RESOLVER_STRING_2_long_long";
+  static $webkitHidden_Getter(mthis) native "Document_webkitHidden_Getter";
 
-Native_Document_createDocumentFragment_Callback(mthis) native "Document_createDocumentFragment_Callback_RESOLVER_STRING_0_";
+  static $webkitPointerLockElement_Getter(mthis) native "Document_webkitPointerLockElement_Getter";
 
-Native_Document_createElement_Callback(mthis, localName_OR_tagName, typeExtension) native "Document_createElement_Callback";
+  static $webkitVisibilityState_Getter(mthis) native "Document_webkitVisibilityState_Getter";
 
-Native_Document_createElementNS_Callback(mthis, namespaceURI, qualifiedName, typeExtension) native "Document_createElementNS_Callback";
+  static $adoptNode_Callback(mthis, node) native "Document_adoptNode_Callback_RESOLVER_STRING_1_Node";
+
+  static $caretRangeFromPoint_Callback(mthis, x, y) native "Document_caretRangeFromPoint_Callback_RESOLVER_STRING_2_long_long";
+
+  static $createDocumentFragment_Callback(mthis) native "Document_createDocumentFragment_Callback_RESOLVER_STRING_0_";
+
+  static $createElement_Callback(mthis, localName_OR_tagName, typeExtension) native "Document_createElement_Callback";
+
+  static $createElementNS_Callback(mthis, namespaceURI, qualifiedName, typeExtension) native "Document_createElementNS_Callback";
 
   // Generated overload resolver
-Native_Document__createEvent(mthis, eventType) {
+  static $_createEvent(mthis, eventType) {
     if (eventType != null) {
-      return Native_Document__createEvent_1_Callback(mthis, eventType);
+      return $_createEvent_1_Callback(mthis, eventType);
     }
-    return Native_Document__createEvent_2_Callback(mthis);
+    return $_createEvent_2_Callback(mthis);
   }
 
-Native_Document__createEvent_1_Callback(mthis, eventType) native "Document_createEvent_Callback_RESOLVER_STRING_1_DOMString";
+  static $_createEvent_1_Callback(mthis, eventType) native "Document_createEvent_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document__createEvent_2_Callback(mthis) native "Document_createEvent_Callback_RESOLVER_STRING_0_";
+  static $_createEvent_2_Callback(mthis) native "Document_createEvent_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_Document__createNodeIterator(mthis, root, whatToShow, filter) {
+  static $_createNodeIterator(mthis, root, whatToShow, filter) {
     if (filter != null) {
-      return Native_Document__createNodeIterator_1_Callback(mthis, root, whatToShow, filter);
+      return $_createNodeIterator_1_Callback(mthis, root, whatToShow, filter);
     }
     if (whatToShow != null) {
-      return Native_Document__createNodeIterator_2_Callback(mthis, root, whatToShow);
+      return $_createNodeIterator_2_Callback(mthis, root, whatToShow);
     }
-    return Native_Document__createNodeIterator_3_Callback(mthis, root);
+    return $_createNodeIterator_3_Callback(mthis, root);
   }
 
-Native_Document__createNodeIterator_1_Callback(mthis, root, whatToShow, filter) native "Document_createNodeIterator_Callback_RESOLVER_STRING_3_Node_unsigned long_NodeFilter";
+  static $_createNodeIterator_1_Callback(mthis, root, whatToShow, filter) native "Document_createNodeIterator_Callback_RESOLVER_STRING_3_Node_unsigned long_NodeFilter";
 
-Native_Document__createNodeIterator_2_Callback(mthis, root, whatToShow) native "Document_createNodeIterator_Callback_RESOLVER_STRING_2_Node_unsigned long";
+  static $_createNodeIterator_2_Callback(mthis, root, whatToShow) native "Document_createNodeIterator_Callback_RESOLVER_STRING_2_Node_unsigned long";
 
-Native_Document__createNodeIterator_3_Callback(mthis, root) native "Document_createNodeIterator_Callback_RESOLVER_STRING_1_Node";
+  static $_createNodeIterator_3_Callback(mthis, root) native "Document_createNodeIterator_Callback_RESOLVER_STRING_1_Node";
 
-Native_Document_createRange_Callback(mthis) native "Document_createRange_Callback_RESOLVER_STRING_0_";
+  static $createRange_Callback(mthis) native "Document_createRange_Callback_RESOLVER_STRING_0_";
 
-Native_Document_createTextNode_Callback(mthis, data) native "Document_createTextNode_Callback_RESOLVER_STRING_1_DOMString";
+  static $createTextNode_Callback(mthis, data) native "Document_createTextNode_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_createTouch_Callback(mthis, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "Document_createTouch_Callback_RESOLVER_STRING_11_Window_EventTarget_long_long_long_long_long_long_long_float_float";
+  static $createTouch_Callback(mthis, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "Document_createTouch_Callback_RESOLVER_STRING_11_Window_EventTarget_long_long_long_long_long_long_long_float_float";
 
   // Generated overload resolver
-Native_Document__createTreeWalker(mthis, root, whatToShow, filter) {
+  static $_createTreeWalker(mthis, root, whatToShow, filter) {
     if (filter != null) {
-      return Native_Document__createTreeWalker_1_Callback(mthis, root, whatToShow, filter);
+      return $_createTreeWalker_1_Callback(mthis, root, whatToShow, filter);
     }
     if (whatToShow != null) {
-      return Native_Document__createTreeWalker_2_Callback(mthis, root, whatToShow);
+      return $_createTreeWalker_2_Callback(mthis, root, whatToShow);
     }
-    return Native_Document__createTreeWalker_3_Callback(mthis, root);
+    return $_createTreeWalker_3_Callback(mthis, root);
   }
 
-Native_Document__createTreeWalker_1_Callback(mthis, root, whatToShow, filter) native "Document_createTreeWalker_Callback_RESOLVER_STRING_3_Node_unsigned long_NodeFilter";
+  static $_createTreeWalker_1_Callback(mthis, root, whatToShow, filter) native "Document_createTreeWalker_Callback_RESOLVER_STRING_3_Node_unsigned long_NodeFilter";
 
-Native_Document__createTreeWalker_2_Callback(mthis, root, whatToShow) native "Document_createTreeWalker_Callback_RESOLVER_STRING_2_Node_unsigned long";
+  static $_createTreeWalker_2_Callback(mthis, root, whatToShow) native "Document_createTreeWalker_Callback_RESOLVER_STRING_2_Node_unsigned long";
 
-Native_Document__createTreeWalker_3_Callback(mthis, root) native "Document_createTreeWalker_Callback_RESOLVER_STRING_1_Node";
+  static $_createTreeWalker_3_Callback(mthis, root) native "Document_createTreeWalker_Callback_RESOLVER_STRING_1_Node";
 
-Native_Document_elementFromPoint_Callback(mthis, x, y) native "Document_elementFromPoint_Callback_RESOLVER_STRING_2_long_long";
+  static $elementFromPoint_Callback(mthis, x, y) native "Document_elementFromPoint_Callback_RESOLVER_STRING_2_long_long";
 
-Native_Document_execCommand_Callback(mthis, command, userInterface, value) native "Document_execCommand_Callback_RESOLVER_STRING_3_DOMString_boolean_DOMString";
+  static $execCommand_Callback(mthis, command, userInterface, value) native "Document_execCommand_Callback_RESOLVER_STRING_3_DOMString_boolean_DOMString";
 
-Native_Document_getCSSCanvasContext_Callback(mthis, contextId, name, width, height) native "Document_getCSSCanvasContext_Callback_RESOLVER_STRING_4_DOMString_DOMString_long_long";
+  static $getCSSCanvasContext_Callback(mthis, contextId, name, width, height) native "Document_getCSSCanvasContext_Callback_RESOLVER_STRING_4_DOMString_DOMString_long_long";
 
-Native_Document_getElementById_Callback(mthis, elementId) native "Document_getElementById_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementById_Callback(mthis, elementId) native "Document_getElementById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_getElementsByClassName_Callback(mthis, classNames) native "Document_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByClassName_Callback(mthis, classNames) native "Document_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_getElementsByName_Callback(mthis, elementName) native "Document_getElementsByName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByName_Callback(mthis, elementName) native "Document_getElementsByName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_getElementsByTagName_Callback(mthis, localName) native "Document_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByTagName_Callback(mthis, localName) native "Document_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_Document_importNode(mthis, node, deep) {
+  static $importNode(mthis, node, deep) {
     if (deep != null) {
-      return Native_Document__importNode_1_Callback(mthis, node, deep);
+      return $_importNode_1_Callback(mthis, node, deep);
     }
-    return Native_Document__importNode_2_Callback(mthis, node);
+    return $_importNode_2_Callback(mthis, node);
   }
 
-Native_Document__importNode_1_Callback(mthis, node, deep) native "Document_importNode_Callback_RESOLVER_STRING_2_Node_boolean";
+  static $_importNode_1_Callback(mthis, node, deep) native "Document_importNode_Callback_RESOLVER_STRING_2_Node_boolean";
 
-Native_Document__importNode_2_Callback(mthis, node) native "Document_importNode_Callback_RESOLVER_STRING_1_Node";
+  static $_importNode_2_Callback(mthis, node) native "Document_importNode_Callback_RESOLVER_STRING_1_Node";
 
-Native_Document_queryCommandEnabled_Callback(mthis, command) native "Document_queryCommandEnabled_Callback_RESOLVER_STRING_1_DOMString";
+  static $queryCommandEnabled_Callback(mthis, command) native "Document_queryCommandEnabled_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_queryCommandIndeterm_Callback(mthis, command) native "Document_queryCommandIndeterm_Callback_RESOLVER_STRING_1_DOMString";
+  static $queryCommandIndeterm_Callback(mthis, command) native "Document_queryCommandIndeterm_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_queryCommandState_Callback(mthis, command) native "Document_queryCommandState_Callback_RESOLVER_STRING_1_DOMString";
+  static $queryCommandState_Callback(mthis, command) native "Document_queryCommandState_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_queryCommandSupported_Callback(mthis, command) native "Document_queryCommandSupported_Callback_RESOLVER_STRING_1_DOMString";
+  static $queryCommandSupported_Callback(mthis, command) native "Document_queryCommandSupported_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_queryCommandValue_Callback(mthis, command) native "Document_queryCommandValue_Callback_RESOLVER_STRING_1_DOMString";
+  static $queryCommandValue_Callback(mthis, command) native "Document_queryCommandValue_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_querySelector_Callback(mthis, selectors) native "Document_querySelector_Callback_RESOLVER_STRING_1_DOMString";
+  static $querySelector_Callback(mthis, selectors) native "Document_querySelector_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_querySelectorAll_Callback(mthis, selectors) native "Document_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
+  static $querySelectorAll_Callback(mthis, selectors) native "Document_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_webkitExitFullscreen_Callback(mthis) native "Document_webkitExitFullscreen_Callback_RESOLVER_STRING_0_";
+  static $webkitExitFullscreen_Callback(mthis) native "Document_webkitExitFullscreen_Callback_RESOLVER_STRING_0_";
 
-Native_Document_webkitExitPointerLock_Callback(mthis) native "Document_webkitExitPointerLock_Callback_RESOLVER_STRING_0_";
+  static $webkitExitPointerLock_Callback(mthis) native "Document_webkitExitPointerLock_Callback_RESOLVER_STRING_0_";
 
-Native_Document_childElementCount_Getter(mthis) native "Document_childElementCount_Getter";
+  static $childElementCount_Getter(mthis) native "Document_childElementCount_Getter";
 
-Native_Document_children_Getter(mthis) native "Document_children_Getter";
+  static $children_Getter(mthis) native "Document_children_Getter";
 
-Native_Document_firstElementChild_Getter(mthis) native "Document_firstElementChild_Getter";
+  static $firstElementChild_Getter(mthis) native "Document_firstElementChild_Getter";
 
-Native_Document_lastElementChild_Getter(mthis) native "Document_lastElementChild_Getter";
+  static $lastElementChild_Getter(mthis) native "Document_lastElementChild_Getter";
+}
 
-Native_DocumentFragment_querySelector_Callback(mthis, selectors) native "DocumentFragment_querySelector_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkDocumentFragment {
+  static $querySelector_Callback(mthis, selectors) native "DocumentFragment_querySelector_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DocumentFragment_querySelectorAll_Callback(mthis, selectors) native "DocumentFragment_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
+  static $querySelectorAll_Callback(mthis, selectors) native "DocumentFragment_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DocumentFragment_childElementCount_Getter(mthis) native "DocumentFragment_childElementCount_Getter";
+  static $childElementCount_Getter(mthis) native "DocumentFragment_childElementCount_Getter";
 
-Native_DocumentFragment_firstElementChild_Getter(mthis) native "DocumentFragment_firstElementChild_Getter";
+  static $firstElementChild_Getter(mthis) native "DocumentFragment_firstElementChild_Getter";
 
-Native_DocumentFragment_lastElementChild_Getter(mthis) native "DocumentFragment_lastElementChild_Getter";
+  static $lastElementChild_Getter(mthis) native "DocumentFragment_lastElementChild_Getter";
+}
 
-Native_DynamicsCompressorNode_attack_Getter(mthis) native "DynamicsCompressorNode_attack_Getter";
+class BlinkDocumentType {}
 
-Native_DynamicsCompressorNode_knee_Getter(mthis) native "DynamicsCompressorNode_knee_Getter";
+class BlinkDynamicsCompressorNode {
+  static $attack_Getter(mthis) native "DynamicsCompressorNode_attack_Getter";
 
-Native_DynamicsCompressorNode_ratio_Getter(mthis) native "DynamicsCompressorNode_ratio_Getter";
+  static $knee_Getter(mthis) native "DynamicsCompressorNode_knee_Getter";
 
-Native_DynamicsCompressorNode_reduction_Getter(mthis) native "DynamicsCompressorNode_reduction_Getter";
+  static $ratio_Getter(mthis) native "DynamicsCompressorNode_ratio_Getter";
 
-Native_DynamicsCompressorNode_release_Getter(mthis) native "DynamicsCompressorNode_release_Getter";
+  static $reduction_Getter(mthis) native "DynamicsCompressorNode_reduction_Getter";
 
-Native_DynamicsCompressorNode_threshold_Getter(mthis) native "DynamicsCompressorNode_threshold_Getter";
+  static $release_Getter(mthis) native "DynamicsCompressorNode_release_Getter";
 
-Native_Element_attributes_Getter(mthis) native "Element_attributes_Getter";
+  static $threshold_Getter(mthis) native "DynamicsCompressorNode_threshold_Getter";
+}
 
-Native_Element_className_Getter(mthis) native "Element_className_Getter";
+class BlinkEXTFragDepth {}
 
-Native_Element_className_Setter(mthis, value) native "Element_className_Setter";
+class BlinkEXTTextureFilterAnisotropic {}
 
-Native_Element_clientHeight_Getter(mthis) native "Element_clientHeight_Getter";
+class BlinkElement {
+  static $attributes_Getter(mthis) native "Element_attributes_Getter";
 
-Native_Element_clientLeft_Getter(mthis) native "Element_clientLeft_Getter";
+  static $className_Getter(mthis) native "Element_className_Getter";
 
-Native_Element_clientTop_Getter(mthis) native "Element_clientTop_Getter";
+  static $className_Setter(mthis, value) native "Element_className_Setter";
 
-Native_Element_clientWidth_Getter(mthis) native "Element_clientWidth_Getter";
+  static $clientHeight_Getter(mthis) native "Element_clientHeight_Getter";
 
-Native_Element_id_Getter(mthis) native "Element_id_Getter";
+  static $clientLeft_Getter(mthis) native "Element_clientLeft_Getter";
 
-Native_Element_id_Setter(mthis, value) native "Element_id_Setter";
+  static $clientTop_Getter(mthis) native "Element_clientTop_Getter";
 
-Native_Element_innerHTML_Getter(mthis) native "Element_innerHTML_Getter";
+  static $clientWidth_Getter(mthis) native "Element_clientWidth_Getter";
 
-Native_Element_innerHTML_Setter(mthis, value) native "Element_innerHTML_Setter";
+  static $id_Getter(mthis) native "Element_id_Getter";
 
-Native_Element_localName_Getter(mthis) native "Element_localName_Getter";
+  static $id_Setter(mthis, value) native "Element_id_Setter";
 
-Native_Element_namespaceURI_Getter(mthis) native "Element_namespaceURI_Getter";
+  static $innerHTML_Getter(mthis) native "Element_innerHTML_Getter";
 
-Native_Element_offsetHeight_Getter(mthis) native "Element_offsetHeight_Getter";
+  static $innerHTML_Setter(mthis, value) native "Element_innerHTML_Setter";
 
-Native_Element_offsetLeft_Getter(mthis) native "Element_offsetLeft_Getter";
+  static $localName_Getter(mthis) native "Element_localName_Getter";
 
-Native_Element_offsetParent_Getter(mthis) native "Element_offsetParent_Getter";
+  static $namespaceURI_Getter(mthis) native "Element_namespaceURI_Getter";
 
-Native_Element_offsetTop_Getter(mthis) native "Element_offsetTop_Getter";
+  static $offsetHeight_Getter(mthis) native "Element_offsetHeight_Getter";
 
-Native_Element_offsetWidth_Getter(mthis) native "Element_offsetWidth_Getter";
+  static $offsetLeft_Getter(mthis) native "Element_offsetLeft_Getter";
 
-Native_Element_outerHTML_Getter(mthis) native "Element_outerHTML_Getter";
+  static $offsetParent_Getter(mthis) native "Element_offsetParent_Getter";
 
-Native_Element_scrollHeight_Getter(mthis) native "Element_scrollHeight_Getter";
+  static $offsetTop_Getter(mthis) native "Element_offsetTop_Getter";
 
-Native_Element_scrollLeft_Getter(mthis) native "Element_scrollLeft_Getter";
+  static $offsetWidth_Getter(mthis) native "Element_offsetWidth_Getter";
 
-Native_Element_scrollLeft_Setter(mthis, value) native "Element_scrollLeft_Setter";
+  static $outerHTML_Getter(mthis) native "Element_outerHTML_Getter";
 
-Native_Element_scrollTop_Getter(mthis) native "Element_scrollTop_Getter";
+  static $scrollHeight_Getter(mthis) native "Element_scrollHeight_Getter";
 
-Native_Element_scrollTop_Setter(mthis, value) native "Element_scrollTop_Setter";
+  static $scrollLeft_Getter(mthis) native "Element_scrollLeft_Getter";
 
-Native_Element_scrollWidth_Getter(mthis) native "Element_scrollWidth_Getter";
+  static $scrollLeft_Setter(mthis, value) native "Element_scrollLeft_Setter";
 
-Native_Element_shadowRoot_Getter(mthis) native "Element_shadowRoot_Getter";
+  static $scrollTop_Getter(mthis) native "Element_scrollTop_Getter";
 
-Native_Element_style_Getter(mthis) native "Element_style_Getter";
+  static $scrollTop_Setter(mthis, value) native "Element_scrollTop_Setter";
 
-Native_Element_tagName_Getter(mthis) native "Element_tagName_Getter";
+  static $scrollWidth_Getter(mthis) native "Element_scrollWidth_Getter";
+
+  static $shadowRoot_Getter(mthis) native "Element_shadowRoot_Getter";
+
+  static $style_Getter(mthis) native "Element_style_Getter";
+
+  static $tagName_Getter(mthis) native "Element_tagName_Getter";
 
   // Generated overload resolver
-Native_Element_animate(mthis, keyframes, timingInput) {
+  static $animate(mthis, keyframes, timingInput) {
     if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
-      return Native_Element__animate_1_Callback(mthis, keyframes, timingInput);
+      return $_animate_1_Callback(mthis, keyframes, timingInput);
     }
     if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
-      return Native_Element__animate_2_Callback(mthis, keyframes, timingInput);
+      return $_animate_2_Callback(mthis, keyframes, timingInput);
     }
     if ((keyframes is List<Map> || keyframes == null) && timingInput == null) {
-      return Native_Element__animate_3_Callback(mthis, keyframes);
+      return $_animate_3_Callback(mthis, keyframes);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Element__animate_1_Callback(mthis, keyframes, timingInput) native "Element_animate_Callback_RESOLVER_STRING_2_sequence<Dictionary>_Dictionary";
+  static $_animate_1_Callback(mthis, keyframes, timingInput) native "Element_animate_Callback_RESOLVER_STRING_2_sequence<Dictionary>_Dictionary";
 
-Native_Element__animate_2_Callback(mthis, keyframes, timingInput) native "Element_animate_Callback_RESOLVER_STRING_2_sequence<Dictionary>_double";
+  static $_animate_2_Callback(mthis, keyframes, timingInput) native "Element_animate_Callback_RESOLVER_STRING_2_sequence<Dictionary>_double";
 
-Native_Element__animate_3_Callback(mthis, keyframes) native "Element_animate_Callback_RESOLVER_STRING_1_sequence<Dictionary>";
+  static $_animate_3_Callback(mthis, keyframes) native "Element_animate_Callback_RESOLVER_STRING_1_sequence<Dictionary>";
 
-Native_Element_blur_Callback(mthis) native "Element_blur_Callback_RESOLVER_STRING_0_";
+  static $blur_Callback(mthis) native "Element_blur_Callback_RESOLVER_STRING_0_";
 
-Native_Element_createShadowRoot_Callback(mthis) native "Element_createShadowRoot_Callback_RESOLVER_STRING_0_";
+  static $createShadowRoot_Callback(mthis) native "Element_createShadowRoot_Callback_RESOLVER_STRING_0_";
 
-Native_Element_focus_Callback(mthis) native "Element_focus_Callback_RESOLVER_STRING_0_";
+  static $focus_Callback(mthis) native "Element_focus_Callback_RESOLVER_STRING_0_";
 
-Native_Element_getAttribute_Callback(mthis, name) native "Element_getAttribute_Callback_RESOLVER_STRING_1_DOMString";
+  static $getAttribute_Callback(mthis, name) native "Element_getAttribute_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_getAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_getAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $getAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_getAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_getBoundingClientRect_Callback(mthis) native "Element_getBoundingClientRect_Callback_RESOLVER_STRING_0_";
+  static $getBoundingClientRect_Callback(mthis) native "Element_getBoundingClientRect_Callback_RESOLVER_STRING_0_";
 
-Native_Element_getClientRects_Callback(mthis) native "Element_getClientRects_Callback_RESOLVER_STRING_0_";
+  static $getClientRects_Callback(mthis) native "Element_getClientRects_Callback_RESOLVER_STRING_0_";
 
-Native_Element_getDestinationInsertionPoints_Callback(mthis) native "Element_getDestinationInsertionPoints_Callback_RESOLVER_STRING_0_";
+  static $getDestinationInsertionPoints_Callback(mthis) native "Element_getDestinationInsertionPoints_Callback_RESOLVER_STRING_0_";
 
-Native_Element_getElementsByClassName_Callback(mthis, classNames) native "Element_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByClassName_Callback(mthis, classNames) native "Element_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_getElementsByTagName_Callback(mthis, name) native "Element_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByTagName_Callback(mthis, name) native "Element_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_hasAttribute_Callback(mthis, name) native "Element_hasAttribute_Callback_RESOLVER_STRING_1_DOMString";
+  static $hasAttribute_Callback(mthis, name) native "Element_hasAttribute_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_hasAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_hasAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $hasAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_hasAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_insertAdjacentElement_Callback(mthis, where, element) native "Element_insertAdjacentElement_Callback_RESOLVER_STRING_2_DOMString_Element";
+  static $insertAdjacentElement_Callback(mthis, where, element) native "Element_insertAdjacentElement_Callback_RESOLVER_STRING_2_DOMString_Element";
 
-Native_Element_insertAdjacentHTML_Callback(mthis, where, html) native "Element_insertAdjacentHTML_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $insertAdjacentHTML_Callback(mthis, where, html) native "Element_insertAdjacentHTML_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_insertAdjacentText_Callback(mthis, where, text) native "Element_insertAdjacentText_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $insertAdjacentText_Callback(mthis, where, text) native "Element_insertAdjacentText_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_matches_Callback(mthis, selectors) native "Element_matches_Callback_RESOLVER_STRING_1_DOMString";
+  static $matches_Callback(mthis, selectors) native "Element_matches_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_querySelector_Callback(mthis, selectors) native "Element_querySelector_Callback_RESOLVER_STRING_1_DOMString";
+  static $querySelector_Callback(mthis, selectors) native "Element_querySelector_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_querySelectorAll_Callback(mthis, selectors) native "Element_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
+  static $querySelectorAll_Callback(mthis, selectors) native "Element_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_removeAttribute_Callback(mthis, name) native "Element_removeAttribute_Callback_RESOLVER_STRING_1_DOMString";
+  static $removeAttribute_Callback(mthis, name) native "Element_removeAttribute_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_removeAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_removeAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $removeAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_removeAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_scrollByLines_Callback(mthis, lines) native "Element_scrollByLines_Callback_RESOLVER_STRING_1_long";
+  static $scrollByLines_Callback(mthis, lines) native "Element_scrollByLines_Callback_RESOLVER_STRING_1_long";
 
-Native_Element_scrollByPages_Callback(mthis, pages) native "Element_scrollByPages_Callback_RESOLVER_STRING_1_long";
+  static $scrollByPages_Callback(mthis, pages) native "Element_scrollByPages_Callback_RESOLVER_STRING_1_long";
 
   // Generated overload resolver
-Native_Element__scrollIntoView(mthis, alignWithTop) {
+  static $_scrollIntoView(mthis, alignWithTop) {
     if (alignWithTop != null) {
-      Native_Element__scrollIntoView_1_Callback(mthis, alignWithTop);
+      $_scrollIntoView_1_Callback(mthis, alignWithTop);
       return;
     }
-    Native_Element__scrollIntoView_2_Callback(mthis);
+    $_scrollIntoView_2_Callback(mthis);
     return;
   }
 
-Native_Element__scrollIntoView_1_Callback(mthis, alignWithTop) native "Element_scrollIntoView_Callback_RESOLVER_STRING_1_boolean";
+  static $_scrollIntoView_1_Callback(mthis, alignWithTop) native "Element_scrollIntoView_Callback_RESOLVER_STRING_1_boolean";
 
-Native_Element__scrollIntoView_2_Callback(mthis) native "Element_scrollIntoView_Callback_RESOLVER_STRING_0_";
+  static $_scrollIntoView_2_Callback(mthis) native "Element_scrollIntoView_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_Element__scrollIntoViewIfNeeded(mthis, centerIfNeeded) {
+  static $_scrollIntoViewIfNeeded(mthis, centerIfNeeded) {
     if (centerIfNeeded != null) {
-      Native_Element__scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded);
+      $_scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded);
       return;
     }
-    Native_Element__scrollIntoViewIfNeeded_2_Callback(mthis);
+    $_scrollIntoViewIfNeeded_2_Callback(mthis);
     return;
   }
 
-Native_Element__scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded) native "Element_scrollIntoViewIfNeeded_Callback_RESOLVER_STRING_1_boolean";
+  static $_scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded) native "Element_scrollIntoViewIfNeeded_Callback_RESOLVER_STRING_1_boolean";
 
-Native_Element__scrollIntoViewIfNeeded_2_Callback(mthis) native "Element_scrollIntoViewIfNeeded_Callback_RESOLVER_STRING_0_";
+  static $_scrollIntoViewIfNeeded_2_Callback(mthis) native "Element_scrollIntoViewIfNeeded_Callback_RESOLVER_STRING_0_";
 
-Native_Element_setAttribute_Callback(mthis, name, value) native "Element_setAttribute_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $setAttribute_Callback(mthis, name, value) native "Element_setAttribute_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_setAttributeNS_Callback(mthis, namespaceURI, qualifiedName, value) native "Element_setAttributeNS_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $setAttributeNS_Callback(mthis, namespaceURI, qualifiedName, value) native "Element_setAttributeNS_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_Element_webkitRequestFullscreen_Callback(mthis) native "Element_webkitRequestFullscreen_Callback_RESOLVER_STRING_0_";
+  static $webkitRequestFullscreen_Callback(mthis) native "Element_webkitRequestFullscreen_Callback_RESOLVER_STRING_0_";
 
-Native_Element_webkitRequestPointerLock_Callback(mthis) native "Element_webkitRequestPointerLock_Callback_RESOLVER_STRING_0_";
+  static $webkitRequestPointerLock_Callback(mthis) native "Element_webkitRequestPointerLock_Callback_RESOLVER_STRING_0_";
 
-Native_Element_nextElementSibling_Getter(mthis) native "Element_nextElementSibling_Getter";
+  static $nextElementSibling_Getter(mthis) native "Element_nextElementSibling_Getter";
 
-Native_Element_previousElementSibling_Getter(mthis) native "Element_previousElementSibling_Getter";
+  static $previousElementSibling_Getter(mthis) native "Element_previousElementSibling_Getter";
 
-Native_Element_remove_Callback(mthis) native "Element_remove_Callback_RESOLVER_STRING_0_";
+  static $remove_Callback(mthis) native "Element_remove_Callback_RESOLVER_STRING_0_";
 
-Native_Element_childElementCount_Getter(mthis) native "Element_childElementCount_Getter";
+  static $childElementCount_Getter(mthis) native "Element_childElementCount_Getter";
 
-Native_Element_children_Getter(mthis) native "Element_children_Getter";
+  static $children_Getter(mthis) native "Element_children_Getter";
 
-Native_Element_firstElementChild_Getter(mthis) native "Element_firstElementChild_Getter";
+  static $firstElementChild_Getter(mthis) native "Element_firstElementChild_Getter";
 
-Native_Element_lastElementChild_Getter(mthis) native "Element_lastElementChild_Getter";
+  static $lastElementChild_Getter(mthis) native "Element_lastElementChild_Getter";
+}
 
-Native_ErrorEvent_colno_Getter(mthis) native "ErrorEvent_colno_Getter";
+class BlinkErrorEvent {
+  static $colno_Getter(mthis) native "ErrorEvent_colno_Getter";
 
-Native_ErrorEvent_error_Getter(mthis) native "ErrorEvent_error_Getter";
+  static $error_Getter(mthis) native "ErrorEvent_error_Getter";
 
-Native_ErrorEvent_filename_Getter(mthis) native "ErrorEvent_filename_Getter";
+  static $filename_Getter(mthis) native "ErrorEvent_filename_Getter";
 
-Native_ErrorEvent_lineno_Getter(mthis) native "ErrorEvent_lineno_Getter";
+  static $lineno_Getter(mthis) native "ErrorEvent_lineno_Getter";
 
-Native_ErrorEvent_message_Getter(mthis) native "ErrorEvent_message_Getter";
+  static $message_Getter(mthis) native "ErrorEvent_message_Getter";
+}
 
+class BlinkEventSource {
   // Generated overload resolver
-Native_EventSource_EventSource(url, eventSourceInit) {
-    return Native_EventSource__create_1constructorCallback(url, eventSourceInit);
+  static $mkEventSource(url, eventSourceInit) {
+    return $_create_1constructorCallback(url, eventSourceInit);
   }
 
-Native_EventSource__create_1constructorCallback(url, eventSourceInit) native "EventSource_constructorCallback_RESOLVER_STRING_2_DOMString_Dictionary";
+  static $_create_1constructorCallback(url, eventSourceInit) native "EventSource_constructorCallback_RESOLVER_STRING_2_DOMString_Dictionary";
 
-Native_EventSource_readyState_Getter(mthis) native "EventSource_readyState_Getter";
+  static $readyState_Getter(mthis) native "EventSource_readyState_Getter";
 
-Native_EventSource_url_Getter(mthis) native "EventSource_url_Getter";
+  static $url_Getter(mthis) native "EventSource_url_Getter";
 
-Native_EventSource_withCredentials_Getter(mthis) native "EventSource_withCredentials_Getter";
+  static $withCredentials_Getter(mthis) native "EventSource_withCredentials_Getter";
 
-Native_EventSource_close_Callback(mthis) native "EventSource_close_Callback_RESOLVER_STRING_0_";
+  static $close_Callback(mthis) native "EventSource_close_Callback_RESOLVER_STRING_0_";
+}
 
-Native_File_lastModified_Getter(mthis) native "File_lastModified_Getter";
+class BlinkFile {
+  static $lastModified_Getter(mthis) native "File_lastModified_Getter";
 
-Native_File_lastModifiedDate_Getter(mthis) native "File_lastModifiedDate_Getter";
+  static $lastModifiedDate_Getter(mthis) native "File_lastModifiedDate_Getter";
 
-Native_File_name_Getter(mthis) native "File_name_Getter";
+  static $name_Getter(mthis) native "File_name_Getter";
 
-Native_File_webkitRelativePath_Getter(mthis) native "File_webkitRelativePath_Getter";
+  static $webkitRelativePath_Getter(mthis) native "File_webkitRelativePath_Getter";
+}
 
-Native_FileEntry_createWriter_Callback(mthis, successCallback, errorCallback) native "FileEntry_createWriter_Callback_RESOLVER_STRING_2_FileWriterCallback_ErrorCallback";
+class BlinkFileEntry {
+  static $createWriter_Callback(mthis, successCallback, errorCallback) native "FileEntry_createWriter_Callback_RESOLVER_STRING_2_FileWriterCallback_ErrorCallback";
 
-Native_FileEntry_file_Callback(mthis, successCallback, errorCallback) native "FileEntry_file_Callback_RESOLVER_STRING_2_FileCallback_ErrorCallback";
+  static $file_Callback(mthis, successCallback, errorCallback) native "FileEntry_file_Callback_RESOLVER_STRING_2_FileCallback_ErrorCallback";
+}
 
-Native_FileError_code_Getter(mthis) native "FileError_code_Getter";
+class BlinkFileEntrySync {}
 
-Native_FileList_length_Getter(mthis) native "FileList_length_Getter";
+class BlinkFileError {
+  static $code_Getter(mthis) native "FileError_code_Getter";
+}
 
-Native_FileList_NativeIndexed_Getter(mthis, index) native "FileList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkFileList {
+  static $length_Getter(mthis) native "FileList_length_Getter";
 
-Native_FileList_item_Callback(mthis, index) native "FileList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "FileList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
+  static $item_Callback(mthis, index) native "FileList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
+
+class BlinkFileReader {
   // Generated overload resolver
-Native_FileReader_FileReader() {
-    return Native_FileReader__create_1constructorCallback();
+  static $mkFileReader() {
+    return $_create_1constructorCallback();
   }
 
-Native_FileReader__create_1constructorCallback() native "FileReader_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "FileReader_constructorCallback_RESOLVER_STRING_0_";
 
-Native_FileReader_error_Getter(mthis) native "FileReader_error_Getter";
+  static $error_Getter(mthis) native "FileReader_error_Getter";
 
-Native_FileReader_readyState_Getter(mthis) native "FileReader_readyState_Getter";
+  static $readyState_Getter(mthis) native "FileReader_readyState_Getter";
 
-Native_FileReader_result_Getter(mthis) native "FileReader_result_Getter";
+  static $result_Getter(mthis) native "FileReader_result_Getter";
 
-Native_FileReader_abort_Callback(mthis) native "FileReader_abort_Callback_RESOLVER_STRING_0_";
+  static $abort_Callback(mthis) native "FileReader_abort_Callback_RESOLVER_STRING_0_";
 
-Native_FileReader_readAsArrayBuffer_Callback(mthis, blob) native "FileReader_readAsArrayBuffer_Callback_RESOLVER_STRING_1_Blob";
+  static $readAsArrayBuffer_Callback(mthis, blob) native "FileReader_readAsArrayBuffer_Callback_RESOLVER_STRING_1_Blob";
 
-Native_FileReader_readAsDataURL_Callback(mthis, blob) native "FileReader_readAsDataURL_Callback_RESOLVER_STRING_1_Blob";
+  static $readAsDataURL_Callback(mthis, blob) native "FileReader_readAsDataURL_Callback_RESOLVER_STRING_1_Blob";
 
   // Generated overload resolver
-Native_FileReader_readAsText(mthis, blob, encoding) {
+  static $readAsText(mthis, blob, encoding) {
     if (encoding != null) {
-      Native_FileReader__readAsText_1_Callback(mthis, blob, encoding);
+      $_readAsText_1_Callback(mthis, blob, encoding);
       return;
     }
-    Native_FileReader__readAsText_2_Callback(mthis, blob);
+    $_readAsText_2_Callback(mthis, blob);
     return;
   }
 
-Native_FileReader__readAsText_1_Callback(mthis, blob, encoding) native "FileReader_readAsText_Callback_RESOLVER_STRING_2_Blob_DOMString";
+  static $_readAsText_1_Callback(mthis, blob, encoding) native "FileReader_readAsText_Callback_RESOLVER_STRING_2_Blob_DOMString";
 
-Native_FileReader__readAsText_2_Callback(mthis, blob) native "FileReader_readAsText_Callback_RESOLVER_STRING_1_Blob";
+  static $_readAsText_2_Callback(mthis, blob) native "FileReader_readAsText_Callback_RESOLVER_STRING_1_Blob";
+}
 
+class BlinkFileReaderSync {
   // Generated overload resolver
-Native_FileReaderSync__FileReaderSync() {
-    return Native_FileReaderSync__create_1constructorCallback();
+  static $mk_FileReaderSync() {
+    return $_create_1constructorCallback();
   }
 
-Native_FileReaderSync__create_1constructorCallback() native "FileReaderSync_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "FileReaderSync_constructorCallback_RESOLVER_STRING_0_";
+}
 
-Native_FileWriter_error_Getter(mthis) native "FileWriter_error_Getter";
+class BlinkFileWriter {
+  static $error_Getter(mthis) native "FileWriter_error_Getter";
 
-Native_FileWriter_length_Getter(mthis) native "FileWriter_length_Getter";
+  static $length_Getter(mthis) native "FileWriter_length_Getter";
 
-Native_FileWriter_position_Getter(mthis) native "FileWriter_position_Getter";
+  static $position_Getter(mthis) native "FileWriter_position_Getter";
 
-Native_FileWriter_readyState_Getter(mthis) native "FileWriter_readyState_Getter";
+  static $readyState_Getter(mthis) native "FileWriter_readyState_Getter";
 
-Native_FileWriter_abort_Callback(mthis) native "FileWriter_abort_Callback_RESOLVER_STRING_0_";
+  static $abort_Callback(mthis) native "FileWriter_abort_Callback_RESOLVER_STRING_0_";
 
-Native_FileWriter_seek_Callback(mthis, position) native "FileWriter_seek_Callback_RESOLVER_STRING_1_long long";
+  static $seek_Callback(mthis, position) native "FileWriter_seek_Callback_RESOLVER_STRING_1_long long";
 
-Native_FileWriter_truncate_Callback(mthis, size) native "FileWriter_truncate_Callback_RESOLVER_STRING_1_long long";
+  static $truncate_Callback(mthis, size) native "FileWriter_truncate_Callback_RESOLVER_STRING_1_long long";
 
-Native_FileWriter_write_Callback(mthis, data) native "FileWriter_write_Callback_RESOLVER_STRING_1_Blob";
+  static $write_Callback(mthis, data) native "FileWriter_write_Callback_RESOLVER_STRING_1_Blob";
+}
 
-Native_FocusEvent_relatedTarget_Getter(mthis) native "FocusEvent_relatedTarget_Getter";
+class BlinkFileWriterSync {}
 
+class BlinkFocusEvent {
+  static $relatedTarget_Getter(mthis) native "FocusEvent_relatedTarget_Getter";
+}
+
+class BlinkFontFace {
   // Generated overload resolver
-Native_FontFace_FontFace(family, source, descriptors) {
-    return Native_FontFace__create_1constructorCallback(family, source, descriptors);
+  static $mkFontFace(family, source, descriptors) {
+    return $_create_1constructorCallback(family, source, descriptors);
   }
 
-Native_FontFace__create_1constructorCallback(family, source, descriptors) native "FontFace_constructorCallback_RESOLVER_STRING_3_DOMString_DOMString_Dictionary";
+  static $_create_1constructorCallback(family, source, descriptors) native "FontFace_constructorCallback_RESOLVER_STRING_3_DOMString_DOMString_Dictionary";
 
-Native_FontFace_family_Getter(mthis) native "FontFace_family_Getter";
+  static $family_Getter(mthis) native "FontFace_family_Getter";
 
-Native_FontFace_family_Setter(mthis, value) native "FontFace_family_Setter";
+  static $family_Setter(mthis, value) native "FontFace_family_Setter";
 
-Native_FontFace_featureSettings_Getter(mthis) native "FontFace_featureSettings_Getter";
+  static $featureSettings_Getter(mthis) native "FontFace_featureSettings_Getter";
 
-Native_FontFace_featureSettings_Setter(mthis, value) native "FontFace_featureSettings_Setter";
+  static $featureSettings_Setter(mthis, value) native "FontFace_featureSettings_Setter";
 
-Native_FontFace_status_Getter(mthis) native "FontFace_status_Getter";
+  static $status_Getter(mthis) native "FontFace_status_Getter";
 
-Native_FontFace_stretch_Getter(mthis) native "FontFace_stretch_Getter";
+  static $stretch_Getter(mthis) native "FontFace_stretch_Getter";
 
-Native_FontFace_stretch_Setter(mthis, value) native "FontFace_stretch_Setter";
+  static $stretch_Setter(mthis, value) native "FontFace_stretch_Setter";
 
-Native_FontFace_style_Getter(mthis) native "FontFace_style_Getter";
+  static $style_Getter(mthis) native "FontFace_style_Getter";
 
-Native_FontFace_style_Setter(mthis, value) native "FontFace_style_Setter";
+  static $style_Setter(mthis, value) native "FontFace_style_Setter";
 
-Native_FontFace_unicodeRange_Getter(mthis) native "FontFace_unicodeRange_Getter";
+  static $unicodeRange_Getter(mthis) native "FontFace_unicodeRange_Getter";
 
-Native_FontFace_unicodeRange_Setter(mthis, value) native "FontFace_unicodeRange_Setter";
+  static $unicodeRange_Setter(mthis, value) native "FontFace_unicodeRange_Setter";
 
-Native_FontFace_variant_Getter(mthis) native "FontFace_variant_Getter";
+  static $variant_Getter(mthis) native "FontFace_variant_Getter";
 
-Native_FontFace_variant_Setter(mthis, value) native "FontFace_variant_Setter";
+  static $variant_Setter(mthis, value) native "FontFace_variant_Setter";
 
-Native_FontFace_weight_Getter(mthis) native "FontFace_weight_Getter";
+  static $weight_Getter(mthis) native "FontFace_weight_Getter";
 
-Native_FontFace_weight_Setter(mthis, value) native "FontFace_weight_Setter";
+  static $weight_Setter(mthis, value) native "FontFace_weight_Setter";
 
-Native_FontFace_load_Callback(mthis) native "FontFace_load_Callback_RESOLVER_STRING_0_";
+  static $load_Callback(mthis) native "FontFace_load_Callback_RESOLVER_STRING_0_";
+}
 
-Native_FontFaceSet_size_Getter(mthis) native "FontFaceSet_size_Getter";
+class BlinkFontFaceSet {
+  static $size_Getter(mthis) native "FontFaceSet_size_Getter";
 
-Native_FontFaceSet_status_Getter(mthis) native "FontFaceSet_status_Getter";
+  static $status_Getter(mthis) native "FontFaceSet_status_Getter";
 
-Native_FontFaceSet_add_Callback(mthis, fontFace) native "FontFaceSet_add_Callback_RESOLVER_STRING_1_FontFace";
+  static $add_Callback(mthis, fontFace) native "FontFaceSet_add_Callback_RESOLVER_STRING_1_FontFace";
 
-Native_FontFaceSet_check_Callback(mthis, font, text) native "FontFaceSet_check_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $check_Callback(mthis, font, text) native "FontFaceSet_check_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_FontFaceSet_clear_Callback(mthis) native "FontFaceSet_clear_Callback_RESOLVER_STRING_0_";
+  static $clear_Callback(mthis) native "FontFaceSet_clear_Callback_RESOLVER_STRING_0_";
 
-Native_FontFaceSet_delete_Callback(mthis, fontFace) native "FontFaceSet_delete_Callback_RESOLVER_STRING_1_FontFace";
+  static $delete_Callback(mthis, fontFace) native "FontFaceSet_delete_Callback_RESOLVER_STRING_1_FontFace";
 
   // Generated overload resolver
-Native_FontFaceSet_forEach(mthis, callback, thisArg) {
+  static $forEach(mthis, callback, thisArg) {
     if (thisArg != null) {
-      Native_FontFaceSet__forEach_1_Callback(mthis, callback, thisArg);
+      $_forEach_1_Callback(mthis, callback, thisArg);
       return;
     }
-    Native_FontFaceSet__forEach_2_Callback(mthis, callback);
+    $_forEach_2_Callback(mthis, callback);
     return;
   }
 
-Native_FontFaceSet__forEach_1_Callback(mthis, callback, thisArg) native "FontFaceSet_forEach_Callback_RESOLVER_STRING_2_FontFaceSetForEachCallback_ScriptValue";
+  static $_forEach_1_Callback(mthis, callback, thisArg) native "FontFaceSet_forEach_Callback_RESOLVER_STRING_2_FontFaceSetForEachCallback_ScriptValue";
 
-Native_FontFaceSet__forEach_2_Callback(mthis, callback) native "FontFaceSet_forEach_Callback_RESOLVER_STRING_1_FontFaceSetForEachCallback";
+  static $_forEach_2_Callback(mthis, callback) native "FontFaceSet_forEach_Callback_RESOLVER_STRING_1_FontFaceSetForEachCallback";
 
-Native_FontFaceSet_has_Callback(mthis, fontFace) native "FontFaceSet_has_Callback_RESOLVER_STRING_1_FontFace";
+  static $has_Callback(mthis, fontFace) native "FontFaceSet_has_Callback_RESOLVER_STRING_1_FontFace";
+}
 
-Native_FormData_constructorCallback(form) native "FormData_constructorCallback_RESOLVER_STRING_1_HTMLFormElement";
+class BlinkFormData {
+  static $constructorCallback(form) native "FormData_constructorCallback_RESOLVER_STRING_1_HTMLFormElement";
 
-Native_FormData_append_Callback(mthis, name, value) native "FormData_append_Callback";
+  static $append_Callback(mthis, name, value) native "FormData_append_Callback";
 
-Native_FormData_appendBlob_Callback(mthis, name, value, filename) native "FormData_append_Callback";
+  static $appendBlob_Callback(mthis, name, value, filename) native "FormData_append_Callback";
+}
 
-Native_GainNode_gain_Getter(mthis) native "GainNode_gain_Getter";
+class BlinkGainNode {
+  static $gain_Getter(mthis) native "GainNode_gain_Getter";
+}
 
-Native_Gamepad_axes_Getter(mthis) native "Gamepad_axes_Getter";
+class BlinkGamepad {
+  static $axes_Getter(mthis) native "Gamepad_axes_Getter";
 
-Native_Gamepad_buttons_Getter(mthis) native "WebKitGamepad_buttons_Getter";
+  static $buttons_Getter(mthis) native "WebKitGamepad_buttons_Getter";
 
-Native_Gamepad_id_Getter(mthis) native "Gamepad_id_Getter";
+  static $id_Getter(mthis) native "Gamepad_id_Getter";
 
-Native_Gamepad_index_Getter(mthis) native "Gamepad_index_Getter";
+  static $index_Getter(mthis) native "Gamepad_index_Getter";
 
-Native_Gamepad_timestamp_Getter(mthis) native "Gamepad_timestamp_Getter";
+  static $timestamp_Getter(mthis) native "Gamepad_timestamp_Getter";
+}
 
-Native_GamepadList_length_Getter(mthis) native "GamepadList_length_Getter";
+class BlinkGamepadList {
+  static $length_Getter(mthis) native "GamepadList_length_Getter";
 
-Native_GamepadList_NativeIndexed_Getter(mthis, index) native "GamepadList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "GamepadList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_GamepadList_item_Callback(mthis, index) native "GamepadList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "GamepadList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_Geolocation_clearWatch_Callback(mthis, watchID) native "Geolocation_clearWatch_Callback_RESOLVER_STRING_1_long";
+class BlinkGeolocation {
+  static $clearWatch_Callback(mthis, watchID) native "Geolocation_clearWatch_Callback_RESOLVER_STRING_1_long";
 
-Native_Geolocation_getCurrentPosition_Callback(mthis, successCallback, errorCallback, options) native "Geolocation_getCurrentPosition_Callback";
+  static $getCurrentPosition_Callback(mthis, successCallback, errorCallback, options) native "Geolocation_getCurrentPosition_Callback";
 
-Native_Geolocation_watchPosition_Callback(mthis, successCallback, errorCallback, options) native "Geolocation_watchPosition_Callback";
+  static $watchPosition_Callback(mthis, successCallback, errorCallback, options) native "Geolocation_watchPosition_Callback";
+}
 
-Native_Geoposition_coords_Getter(mthis) native "Geoposition_coords_Getter";
+class BlinkGeoposition {
+  static $coords_Getter(mthis) native "Geoposition_coords_Getter";
 
-Native_Geoposition_timestamp_Getter(mthis) native "Geoposition_timestamp_Getter";
+  static $timestamp_Getter(mthis) native "Geoposition_timestamp_Getter";
+}
 
-Native_HTMLAllCollection_item_Callback(mthis, index) native "HTMLAllCollection_item_Callback";
+class BlinkHTMLAllCollection {
+  static $item_Callback(mthis, index) native "HTMLAllCollection_item_Callback";
+}
 
-Native_HTMLElement_contentEditable_Getter(mthis) native "HTMLElement_contentEditable_Getter";
+class BlinkHTMLElement {
+  static $contentEditable_Getter(mthis) native "HTMLElement_contentEditable_Getter";
 
-Native_HTMLElement_contentEditable_Setter(mthis, value) native "HTMLElement_contentEditable_Setter";
+  static $contentEditable_Setter(mthis, value) native "HTMLElement_contentEditable_Setter";
 
-Native_HTMLElement_dir_Getter(mthis) native "HTMLElement_dir_Getter";
+  static $dir_Getter(mthis) native "HTMLElement_dir_Getter";
 
-Native_HTMLElement_dir_Setter(mthis, value) native "HTMLElement_dir_Setter";
+  static $dir_Setter(mthis, value) native "HTMLElement_dir_Setter";
 
-Native_HTMLElement_draggable_Getter(mthis) native "HTMLElement_draggable_Getter";
+  static $draggable_Getter(mthis) native "HTMLElement_draggable_Getter";
 
-Native_HTMLElement_draggable_Setter(mthis, value) native "HTMLElement_draggable_Setter";
+  static $draggable_Setter(mthis, value) native "HTMLElement_draggable_Setter";
 
-Native_HTMLElement_hidden_Getter(mthis) native "HTMLElement_hidden_Getter";
+  static $hidden_Getter(mthis) native "HTMLElement_hidden_Getter";
 
-Native_HTMLElement_hidden_Setter(mthis, value) native "HTMLElement_hidden_Setter";
+  static $hidden_Setter(mthis, value) native "HTMLElement_hidden_Setter";
 
-Native_HTMLElement_inputMethodContext_Getter(mthis) native "HTMLElement_inputMethodContext_Getter";
+  static $inputMethodContext_Getter(mthis) native "HTMLElement_inputMethodContext_Getter";
 
-Native_HTMLElement_isContentEditable_Getter(mthis) native "HTMLElement_isContentEditable_Getter";
+  static $isContentEditable_Getter(mthis) native "HTMLElement_isContentEditable_Getter";
 
-Native_HTMLElement_lang_Getter(mthis) native "HTMLElement_lang_Getter";
+  static $lang_Getter(mthis) native "HTMLElement_lang_Getter";
 
-Native_HTMLElement_lang_Setter(mthis, value) native "HTMLElement_lang_Setter";
+  static $lang_Setter(mthis, value) native "HTMLElement_lang_Setter";
 
-Native_HTMLElement_spellcheck_Getter(mthis) native "HTMLElement_spellcheck_Getter";
+  static $spellcheck_Getter(mthis) native "HTMLElement_spellcheck_Getter";
 
-Native_HTMLElement_spellcheck_Setter(mthis, value) native "HTMLElement_spellcheck_Setter";
+  static $spellcheck_Setter(mthis, value) native "HTMLElement_spellcheck_Setter";
 
-Native_HTMLElement_tabIndex_Getter(mthis) native "HTMLElement_tabIndex_Getter";
+  static $tabIndex_Getter(mthis) native "HTMLElement_tabIndex_Getter";
 
-Native_HTMLElement_tabIndex_Setter(mthis, value) native "HTMLElement_tabIndex_Setter";
+  static $tabIndex_Setter(mthis, value) native "HTMLElement_tabIndex_Setter";
 
-Native_HTMLElement_title_Getter(mthis) native "HTMLElement_title_Getter";
+  static $title_Getter(mthis) native "HTMLElement_title_Getter";
 
-Native_HTMLElement_title_Setter(mthis, value) native "HTMLElement_title_Setter";
+  static $title_Setter(mthis, value) native "HTMLElement_title_Setter";
 
-Native_HTMLElement_translate_Getter(mthis) native "HTMLElement_translate_Getter";
+  static $translate_Getter(mthis) native "HTMLElement_translate_Getter";
 
-Native_HTMLElement_translate_Setter(mthis, value) native "HTMLElement_translate_Setter";
+  static $translate_Setter(mthis, value) native "HTMLElement_translate_Setter";
 
-Native_HTMLElement_webkitdropzone_Getter(mthis) native "HTMLElement_webkitdropzone_Getter";
+  static $webkitdropzone_Getter(mthis) native "HTMLElement_webkitdropzone_Getter";
 
-Native_HTMLElement_webkitdropzone_Setter(mthis, value) native "HTMLElement_webkitdropzone_Setter";
+  static $webkitdropzone_Setter(mthis, value) native "HTMLElement_webkitdropzone_Setter";
 
-Native_HTMLElement_click_Callback(mthis) native "HTMLElement_click_Callback_RESOLVER_STRING_0_";
+  static $click_Callback(mthis) native "HTMLElement_click_Callback_RESOLVER_STRING_0_";
+}
 
-Native_URLUtils_hash_Getter(mthis) native "URL_hash_Getter";
+class BlinkURLUtils {
+  static $hash_Getter(mthis) native "URL_hash_Getter";
 
-Native_URLUtils_hash_Setter(mthis, value) native "URL_hash_Setter";
+  static $hash_Setter(mthis, value) native "URL_hash_Setter";
 
-Native_URLUtils_host_Getter(mthis) native "URL_host_Getter";
+  static $host_Getter(mthis) native "URL_host_Getter";
 
-Native_URLUtils_host_Setter(mthis, value) native "URL_host_Setter";
+  static $host_Setter(mthis, value) native "URL_host_Setter";
 
-Native_URLUtils_hostname_Getter(mthis) native "URL_hostname_Getter";
+  static $hostname_Getter(mthis) native "URL_hostname_Getter";
 
-Native_URLUtils_hostname_Setter(mthis, value) native "URL_hostname_Setter";
+  static $hostname_Setter(mthis, value) native "URL_hostname_Setter";
 
-Native_URLUtils_href_Getter(mthis) native "URL_href_Getter";
+  static $href_Getter(mthis) native "URL_href_Getter";
 
-Native_URLUtils_href_Setter(mthis, value) native "URL_href_Setter";
+  static $href_Setter(mthis, value) native "URL_href_Setter";
 
-Native_URLUtils_origin_Getter(mthis) native "URL_origin_Getter";
+  static $origin_Getter(mthis) native "URL_origin_Getter";
 
-Native_URLUtils_password_Getter(mthis) native "URL_password_Getter";
+  static $password_Getter(mthis) native "URL_password_Getter";
 
-Native_URLUtils_password_Setter(mthis, value) native "URL_password_Setter";
+  static $password_Setter(mthis, value) native "URL_password_Setter";
 
-Native_URLUtils_pathname_Getter(mthis) native "URL_pathname_Getter";
+  static $pathname_Getter(mthis) native "URL_pathname_Getter";
 
-Native_URLUtils_pathname_Setter(mthis, value) native "URL_pathname_Setter";
+  static $pathname_Setter(mthis, value) native "URL_pathname_Setter";
 
-Native_URLUtils_port_Getter(mthis) native "URL_port_Getter";
+  static $port_Getter(mthis) native "URL_port_Getter";
 
-Native_URLUtils_port_Setter(mthis, value) native "URL_port_Setter";
+  static $port_Setter(mthis, value) native "URL_port_Setter";
 
-Native_URLUtils_protocol_Getter(mthis) native "URL_protocol_Getter";
+  static $protocol_Getter(mthis) native "URL_protocol_Getter";
 
-Native_URLUtils_protocol_Setter(mthis, value) native "URL_protocol_Setter";
+  static $protocol_Setter(mthis, value) native "URL_protocol_Setter";
 
-Native_URLUtils_search_Getter(mthis) native "URL_search_Getter";
+  static $search_Getter(mthis) native "URL_search_Getter";
 
-Native_URLUtils_search_Setter(mthis, value) native "URL_search_Setter";
+  static $search_Setter(mthis, value) native "URL_search_Setter";
 
-Native_URLUtils_username_Getter(mthis) native "URL_username_Getter";
+  static $username_Getter(mthis) native "URL_username_Getter";
 
-Native_URLUtils_username_Setter(mthis, value) native "URL_username_Setter";
+  static $username_Setter(mthis, value) native "URL_username_Setter";
 
-Native_URLUtils_toString_Callback(mthis) native "URL_toString_Callback_RESOLVER_STRING_0_";
+  static $toString_Callback(mthis) native "URL_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_HTMLAnchorElement_download_Getter(mthis) native "HTMLAnchorElement_download_Getter";
+class BlinkHTMLAnchorElement {
+  static $download_Getter(mthis) native "HTMLAnchorElement_download_Getter";
 
-Native_HTMLAnchorElement_download_Setter(mthis, value) native "HTMLAnchorElement_download_Setter";
+  static $download_Setter(mthis, value) native "HTMLAnchorElement_download_Setter";
 
-Native_HTMLAnchorElement_hreflang_Getter(mthis) native "HTMLAnchorElement_hreflang_Getter";
+  static $hreflang_Getter(mthis) native "HTMLAnchorElement_hreflang_Getter";
 
-Native_HTMLAnchorElement_hreflang_Setter(mthis, value) native "HTMLAnchorElement_hreflang_Setter";
+  static $hreflang_Setter(mthis, value) native "HTMLAnchorElement_hreflang_Setter";
 
-Native_HTMLAnchorElement_rel_Getter(mthis) native "HTMLAnchorElement_rel_Getter";
+  static $rel_Getter(mthis) native "HTMLAnchorElement_rel_Getter";
 
-Native_HTMLAnchorElement_rel_Setter(mthis, value) native "HTMLAnchorElement_rel_Setter";
+  static $rel_Setter(mthis, value) native "HTMLAnchorElement_rel_Setter";
 
-Native_HTMLAnchorElement_target_Getter(mthis) native "HTMLAnchorElement_target_Getter";
+  static $target_Getter(mthis) native "HTMLAnchorElement_target_Getter";
 
-Native_HTMLAnchorElement_target_Setter(mthis, value) native "HTMLAnchorElement_target_Setter";
+  static $target_Setter(mthis, value) native "HTMLAnchorElement_target_Setter";
 
-Native_HTMLAnchorElement_type_Getter(mthis) native "HTMLAnchorElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLAnchorElement_type_Getter";
 
-Native_HTMLAnchorElement_type_Setter(mthis, value) native "HTMLAnchorElement_type_Setter";
+  static $type_Setter(mthis, value) native "HTMLAnchorElement_type_Setter";
 
-Native_HTMLAnchorElement_hash_Getter(mthis) native "HTMLAnchorElement_hash_Getter";
+  static $hash_Getter(mthis) native "HTMLAnchorElement_hash_Getter";
 
-Native_HTMLAnchorElement_hash_Setter(mthis, value) native "HTMLAnchorElement_hash_Setter";
+  static $hash_Setter(mthis, value) native "HTMLAnchorElement_hash_Setter";
 
-Native_HTMLAnchorElement_host_Getter(mthis) native "HTMLAnchorElement_host_Getter";
+  static $host_Getter(mthis) native "HTMLAnchorElement_host_Getter";
 
-Native_HTMLAnchorElement_host_Setter(mthis, value) native "HTMLAnchorElement_host_Setter";
+  static $host_Setter(mthis, value) native "HTMLAnchorElement_host_Setter";
 
-Native_HTMLAnchorElement_hostname_Getter(mthis) native "HTMLAnchorElement_hostname_Getter";
+  static $hostname_Getter(mthis) native "HTMLAnchorElement_hostname_Getter";
 
-Native_HTMLAnchorElement_hostname_Setter(mthis, value) native "HTMLAnchorElement_hostname_Setter";
+  static $hostname_Setter(mthis, value) native "HTMLAnchorElement_hostname_Setter";
+
+  static $href_Getter(mthis) native "HTMLAnchorElement_href_Getter";
 
-Native_HTMLAnchorElement_href_Getter(mthis) native "HTMLAnchorElement_href_Getter";
+  static $href_Setter(mthis, value) native "HTMLAnchorElement_href_Setter";
 
-Native_HTMLAnchorElement_href_Setter(mthis, value) native "HTMLAnchorElement_href_Setter";
+  static $origin_Getter(mthis) native "HTMLAnchorElement_origin_Getter";
 
-Native_HTMLAnchorElement_origin_Getter(mthis) native "HTMLAnchorElement_origin_Getter";
+  static $password_Getter(mthis) native "HTMLAnchorElement_password_Getter";
 
-Native_HTMLAnchorElement_password_Getter(mthis) native "HTMLAnchorElement_password_Getter";
+  static $password_Setter(mthis, value) native "HTMLAnchorElement_password_Setter";
 
-Native_HTMLAnchorElement_password_Setter(mthis, value) native "HTMLAnchorElement_password_Setter";
+  static $pathname_Getter(mthis) native "HTMLAnchorElement_pathname_Getter";
 
-Native_HTMLAnchorElement_pathname_Getter(mthis) native "HTMLAnchorElement_pathname_Getter";
+  static $pathname_Setter(mthis, value) native "HTMLAnchorElement_pathname_Setter";
 
-Native_HTMLAnchorElement_pathname_Setter(mthis, value) native "HTMLAnchorElement_pathname_Setter";
+  static $port_Getter(mthis) native "HTMLAnchorElement_port_Getter";
 
-Native_HTMLAnchorElement_port_Getter(mthis) native "HTMLAnchorElement_port_Getter";
+  static $port_Setter(mthis, value) native "HTMLAnchorElement_port_Setter";
 
-Native_HTMLAnchorElement_port_Setter(mthis, value) native "HTMLAnchorElement_port_Setter";
+  static $protocol_Getter(mthis) native "HTMLAnchorElement_protocol_Getter";
 
-Native_HTMLAnchorElement_protocol_Getter(mthis) native "HTMLAnchorElement_protocol_Getter";
+  static $protocol_Setter(mthis, value) native "HTMLAnchorElement_protocol_Setter";
 
-Native_HTMLAnchorElement_protocol_Setter(mthis, value) native "HTMLAnchorElement_protocol_Setter";
+  static $search_Getter(mthis) native "HTMLAnchorElement_search_Getter";
 
-Native_HTMLAnchorElement_search_Getter(mthis) native "HTMLAnchorElement_search_Getter";
+  static $search_Setter(mthis, value) native "HTMLAnchorElement_search_Setter";
 
-Native_HTMLAnchorElement_search_Setter(mthis, value) native "HTMLAnchorElement_search_Setter";
+  static $username_Getter(mthis) native "HTMLAnchorElement_username_Getter";
 
-Native_HTMLAnchorElement_username_Getter(mthis) native "HTMLAnchorElement_username_Getter";
+  static $username_Setter(mthis, value) native "HTMLAnchorElement_username_Setter";
 
-Native_HTMLAnchorElement_username_Setter(mthis, value) native "HTMLAnchorElement_username_Setter";
+  static $toString_Callback(mthis) native "HTMLAnchorElement_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_HTMLAnchorElement_toString_Callback(mthis) native "HTMLAnchorElement_toString_Callback_RESOLVER_STRING_0_";
+class BlinkHTMLAppletElement {}
 
-Native_HTMLAreaElement_alt_Getter(mthis) native "HTMLAreaElement_alt_Getter";
+class BlinkHTMLAreaElement {
+  static $alt_Getter(mthis) native "HTMLAreaElement_alt_Getter";
 
-Native_HTMLAreaElement_alt_Setter(mthis, value) native "HTMLAreaElement_alt_Setter";
+  static $alt_Setter(mthis, value) native "HTMLAreaElement_alt_Setter";
 
-Native_HTMLAreaElement_coords_Getter(mthis) native "HTMLAreaElement_coords_Getter";
+  static $coords_Getter(mthis) native "HTMLAreaElement_coords_Getter";
 
-Native_HTMLAreaElement_coords_Setter(mthis, value) native "HTMLAreaElement_coords_Setter";
+  static $coords_Setter(mthis, value) native "HTMLAreaElement_coords_Setter";
 
-Native_HTMLAreaElement_shape_Getter(mthis) native "HTMLAreaElement_shape_Getter";
+  static $shape_Getter(mthis) native "HTMLAreaElement_shape_Getter";
 
-Native_HTMLAreaElement_shape_Setter(mthis, value) native "HTMLAreaElement_shape_Setter";
+  static $shape_Setter(mthis, value) native "HTMLAreaElement_shape_Setter";
 
-Native_HTMLAreaElement_target_Getter(mthis) native "HTMLAreaElement_target_Getter";
+  static $target_Getter(mthis) native "HTMLAreaElement_target_Getter";
 
-Native_HTMLAreaElement_target_Setter(mthis, value) native "HTMLAreaElement_target_Setter";
+  static $target_Setter(mthis, value) native "HTMLAreaElement_target_Setter";
 
-Native_HTMLAreaElement_hash_Getter(mthis) native "HTMLAreaElement_hash_Getter";
+  static $hash_Getter(mthis) native "HTMLAreaElement_hash_Getter";
 
-Native_HTMLAreaElement_hash_Setter(mthis, value) native "HTMLAreaElement_hash_Setter";
+  static $hash_Setter(mthis, value) native "HTMLAreaElement_hash_Setter";
 
-Native_HTMLAreaElement_host_Getter(mthis) native "HTMLAreaElement_host_Getter";
+  static $host_Getter(mthis) native "HTMLAreaElement_host_Getter";
 
-Native_HTMLAreaElement_host_Setter(mthis, value) native "HTMLAreaElement_host_Setter";
+  static $host_Setter(mthis, value) native "HTMLAreaElement_host_Setter";
 
-Native_HTMLAreaElement_hostname_Getter(mthis) native "HTMLAreaElement_hostname_Getter";
+  static $hostname_Getter(mthis) native "HTMLAreaElement_hostname_Getter";
 
-Native_HTMLAreaElement_hostname_Setter(mthis, value) native "HTMLAreaElement_hostname_Setter";
+  static $hostname_Setter(mthis, value) native "HTMLAreaElement_hostname_Setter";
 
-Native_HTMLAreaElement_href_Getter(mthis) native "HTMLAreaElement_href_Getter";
+  static $href_Getter(mthis) native "HTMLAreaElement_href_Getter";
 
-Native_HTMLAreaElement_href_Setter(mthis, value) native "HTMLAreaElement_href_Setter";
+  static $href_Setter(mthis, value) native "HTMLAreaElement_href_Setter";
 
-Native_HTMLAreaElement_origin_Getter(mthis) native "HTMLAreaElement_origin_Getter";
+  static $origin_Getter(mthis) native "HTMLAreaElement_origin_Getter";
 
-Native_HTMLAreaElement_password_Getter(mthis) native "HTMLAreaElement_password_Getter";
+  static $password_Getter(mthis) native "HTMLAreaElement_password_Getter";
 
-Native_HTMLAreaElement_password_Setter(mthis, value) native "HTMLAreaElement_password_Setter";
+  static $password_Setter(mthis, value) native "HTMLAreaElement_password_Setter";
 
-Native_HTMLAreaElement_pathname_Getter(mthis) native "HTMLAreaElement_pathname_Getter";
+  static $pathname_Getter(mthis) native "HTMLAreaElement_pathname_Getter";
 
-Native_HTMLAreaElement_pathname_Setter(mthis, value) native "HTMLAreaElement_pathname_Setter";
+  static $pathname_Setter(mthis, value) native "HTMLAreaElement_pathname_Setter";
 
-Native_HTMLAreaElement_port_Getter(mthis) native "HTMLAreaElement_port_Getter";
+  static $port_Getter(mthis) native "HTMLAreaElement_port_Getter";
 
-Native_HTMLAreaElement_port_Setter(mthis, value) native "HTMLAreaElement_port_Setter";
+  static $port_Setter(mthis, value) native "HTMLAreaElement_port_Setter";
 
-Native_HTMLAreaElement_protocol_Getter(mthis) native "HTMLAreaElement_protocol_Getter";
+  static $protocol_Getter(mthis) native "HTMLAreaElement_protocol_Getter";
 
-Native_HTMLAreaElement_protocol_Setter(mthis, value) native "HTMLAreaElement_protocol_Setter";
+  static $protocol_Setter(mthis, value) native "HTMLAreaElement_protocol_Setter";
 
-Native_HTMLAreaElement_search_Getter(mthis) native "HTMLAreaElement_search_Getter";
+  static $search_Getter(mthis) native "HTMLAreaElement_search_Getter";
 
-Native_HTMLAreaElement_search_Setter(mthis, value) native "HTMLAreaElement_search_Setter";
+  static $search_Setter(mthis, value) native "HTMLAreaElement_search_Setter";
 
-Native_HTMLAreaElement_username_Getter(mthis) native "HTMLAreaElement_username_Getter";
+  static $username_Getter(mthis) native "HTMLAreaElement_username_Getter";
 
-Native_HTMLAreaElement_username_Setter(mthis, value) native "HTMLAreaElement_username_Setter";
+  static $username_Setter(mthis, value) native "HTMLAreaElement_username_Setter";
 
-Native_HTMLAreaElement_toString_Callback(mthis) native "HTMLAreaElement_toString_Callback_RESOLVER_STRING_0_";
+  static $toString_Callback(mthis) native "HTMLAreaElement_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_HTMLMediaElement_autoplay_Getter(mthis) native "HTMLMediaElement_autoplay_Getter";
+class BlinkHTMLMediaElement {
+  static $autoplay_Getter(mthis) native "HTMLMediaElement_autoplay_Getter";
 
-Native_HTMLMediaElement_autoplay_Setter(mthis, value) native "HTMLMediaElement_autoplay_Setter";
+  static $autoplay_Setter(mthis, value) native "HTMLMediaElement_autoplay_Setter";
 
-Native_HTMLMediaElement_buffered_Getter(mthis) native "HTMLMediaElement_buffered_Getter";
+  static $buffered_Getter(mthis) native "HTMLMediaElement_buffered_Getter";
 
-Native_HTMLMediaElement_controller_Getter(mthis) native "HTMLMediaElement_controller_Getter";
+  static $controller_Getter(mthis) native "HTMLMediaElement_controller_Getter";
 
-Native_HTMLMediaElement_controller_Setter(mthis, value) native "HTMLMediaElement_controller_Setter";
+  static $controller_Setter(mthis, value) native "HTMLMediaElement_controller_Setter";
 
-Native_HTMLMediaElement_controls_Getter(mthis) native "HTMLMediaElement_controls_Getter";
+  static $controls_Getter(mthis) native "HTMLMediaElement_controls_Getter";
 
-Native_HTMLMediaElement_controls_Setter(mthis, value) native "HTMLMediaElement_controls_Setter";
+  static $controls_Setter(mthis, value) native "HTMLMediaElement_controls_Setter";
 
-Native_HTMLMediaElement_crossOrigin_Getter(mthis) native "HTMLMediaElement_crossOrigin_Getter";
+  static $crossOrigin_Getter(mthis) native "HTMLMediaElement_crossOrigin_Getter";
 
-Native_HTMLMediaElement_crossOrigin_Setter(mthis, value) native "HTMLMediaElement_crossOrigin_Setter";
+  static $crossOrigin_Setter(mthis, value) native "HTMLMediaElement_crossOrigin_Setter";
 
-Native_HTMLMediaElement_currentSrc_Getter(mthis) native "HTMLMediaElement_currentSrc_Getter";
+  static $currentSrc_Getter(mthis) native "HTMLMediaElement_currentSrc_Getter";
 
-Native_HTMLMediaElement_currentTime_Getter(mthis) native "HTMLMediaElement_currentTime_Getter";
+  static $currentTime_Getter(mthis) native "HTMLMediaElement_currentTime_Getter";
 
-Native_HTMLMediaElement_currentTime_Setter(mthis, value) native "HTMLMediaElement_currentTime_Setter";
+  static $currentTime_Setter(mthis, value) native "HTMLMediaElement_currentTime_Setter";
 
-Native_HTMLMediaElement_defaultMuted_Getter(mthis) native "HTMLMediaElement_defaultMuted_Getter";
+  static $defaultMuted_Getter(mthis) native "HTMLMediaElement_defaultMuted_Getter";
 
-Native_HTMLMediaElement_defaultMuted_Setter(mthis, value) native "HTMLMediaElement_defaultMuted_Setter";
+  static $defaultMuted_Setter(mthis, value) native "HTMLMediaElement_defaultMuted_Setter";
 
-Native_HTMLMediaElement_defaultPlaybackRate_Getter(mthis) native "HTMLMediaElement_defaultPlaybackRate_Getter";
+  static $defaultPlaybackRate_Getter(mthis) native "HTMLMediaElement_defaultPlaybackRate_Getter";
 
-Native_HTMLMediaElement_defaultPlaybackRate_Setter(mthis, value) native "HTMLMediaElement_defaultPlaybackRate_Setter";
+  static $defaultPlaybackRate_Setter(mthis, value) native "HTMLMediaElement_defaultPlaybackRate_Setter";
 
-Native_HTMLMediaElement_duration_Getter(mthis) native "HTMLMediaElement_duration_Getter";
+  static $duration_Getter(mthis) native "HTMLMediaElement_duration_Getter";
 
-Native_HTMLMediaElement_ended_Getter(mthis) native "HTMLMediaElement_ended_Getter";
+  static $ended_Getter(mthis) native "HTMLMediaElement_ended_Getter";
 
-Native_HTMLMediaElement_error_Getter(mthis) native "HTMLMediaElement_error_Getter";
+  static $error_Getter(mthis) native "HTMLMediaElement_error_Getter";
 
-Native_HTMLMediaElement_loop_Getter(mthis) native "HTMLMediaElement_loop_Getter";
+  static $loop_Getter(mthis) native "HTMLMediaElement_loop_Getter";
 
-Native_HTMLMediaElement_loop_Setter(mthis, value) native "HTMLMediaElement_loop_Setter";
+  static $loop_Setter(mthis, value) native "HTMLMediaElement_loop_Setter";
 
-Native_HTMLMediaElement_mediaGroup_Getter(mthis) native "HTMLMediaElement_mediaGroup_Getter";
+  static $mediaGroup_Getter(mthis) native "HTMLMediaElement_mediaGroup_Getter";
 
-Native_HTMLMediaElement_mediaGroup_Setter(mthis, value) native "HTMLMediaElement_mediaGroup_Setter";
+  static $mediaGroup_Setter(mthis, value) native "HTMLMediaElement_mediaGroup_Setter";
 
-Native_HTMLMediaElement_mediaKeys_Getter(mthis) native "HTMLMediaElement_mediaKeys_Getter";
+  static $mediaKeys_Getter(mthis) native "HTMLMediaElement_mediaKeys_Getter";
 
-Native_HTMLMediaElement_muted_Getter(mthis) native "HTMLMediaElement_muted_Getter";
+  static $muted_Getter(mthis) native "HTMLMediaElement_muted_Getter";
 
-Native_HTMLMediaElement_muted_Setter(mthis, value) native "HTMLMediaElement_muted_Setter";
+  static $muted_Setter(mthis, value) native "HTMLMediaElement_muted_Setter";
 
-Native_HTMLMediaElement_networkState_Getter(mthis) native "HTMLMediaElement_networkState_Getter";
+  static $networkState_Getter(mthis) native "HTMLMediaElement_networkState_Getter";
 
-Native_HTMLMediaElement_paused_Getter(mthis) native "HTMLMediaElement_paused_Getter";
+  static $paused_Getter(mthis) native "HTMLMediaElement_paused_Getter";
 
-Native_HTMLMediaElement_playbackRate_Getter(mthis) native "HTMLMediaElement_playbackRate_Getter";
+  static $playbackRate_Getter(mthis) native "HTMLMediaElement_playbackRate_Getter";
 
-Native_HTMLMediaElement_playbackRate_Setter(mthis, value) native "HTMLMediaElement_playbackRate_Setter";
+  static $playbackRate_Setter(mthis, value) native "HTMLMediaElement_playbackRate_Setter";
 
-Native_HTMLMediaElement_played_Getter(mthis) native "HTMLMediaElement_played_Getter";
+  static $played_Getter(mthis) native "HTMLMediaElement_played_Getter";
 
-Native_HTMLMediaElement_preload_Getter(mthis) native "HTMLMediaElement_preload_Getter";
+  static $preload_Getter(mthis) native "HTMLMediaElement_preload_Getter";
 
-Native_HTMLMediaElement_preload_Setter(mthis, value) native "HTMLMediaElement_preload_Setter";
+  static $preload_Setter(mthis, value) native "HTMLMediaElement_preload_Setter";
 
-Native_HTMLMediaElement_readyState_Getter(mthis) native "HTMLMediaElement_readyState_Getter";
+  static $readyState_Getter(mthis) native "HTMLMediaElement_readyState_Getter";
 
-Native_HTMLMediaElement_seekable_Getter(mthis) native "HTMLMediaElement_seekable_Getter";
+  static $seekable_Getter(mthis) native "HTMLMediaElement_seekable_Getter";
 
-Native_HTMLMediaElement_seeking_Getter(mthis) native "HTMLMediaElement_seeking_Getter";
+  static $seeking_Getter(mthis) native "HTMLMediaElement_seeking_Getter";
 
-Native_HTMLMediaElement_src_Getter(mthis) native "HTMLMediaElement_src_Getter";
+  static $src_Getter(mthis) native "HTMLMediaElement_src_Getter";
 
-Native_HTMLMediaElement_src_Setter(mthis, value) native "HTMLMediaElement_src_Setter";
+  static $src_Setter(mthis, value) native "HTMLMediaElement_src_Setter";
 
-Native_HTMLMediaElement_textTracks_Getter(mthis) native "HTMLMediaElement_textTracks_Getter";
+  static $textTracks_Getter(mthis) native "HTMLMediaElement_textTracks_Getter";
 
-Native_HTMLMediaElement_volume_Getter(mthis) native "HTMLMediaElement_volume_Getter";
+  static $volume_Getter(mthis) native "HTMLMediaElement_volume_Getter";
 
-Native_HTMLMediaElement_volume_Setter(mthis, value) native "HTMLMediaElement_volume_Setter";
+  static $volume_Setter(mthis, value) native "HTMLMediaElement_volume_Setter";
 
-Native_HTMLMediaElement_webkitAudioDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";
+  static $webkitAudioDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";
 
-Native_HTMLMediaElement_webkitVideoDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
+  static $webkitVideoDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
 
   // Generated overload resolver
-Native_HTMLMediaElement_addTextTrack(mthis, kind, label, language) {
+  static $addTextTrack(mthis, kind, label, language) {
     if (language != null) {
-      return Native_HTMLMediaElement__addTextTrack_1_Callback(mthis, kind, label, language);
+      return $_addTextTrack_1_Callback(mthis, kind, label, language);
     }
     if (label != null) {
-      return Native_HTMLMediaElement__addTextTrack_2_Callback(mthis, kind, label);
+      return $_addTextTrack_2_Callback(mthis, kind, label);
     }
-    return Native_HTMLMediaElement__addTextTrack_3_Callback(mthis, kind);
+    return $_addTextTrack_3_Callback(mthis, kind);
   }
 
-Native_HTMLMediaElement__addTextTrack_1_Callback(mthis, kind, label, language) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $_addTextTrack_1_Callback(mthis, kind, label, language) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_HTMLMediaElement__addTextTrack_2_Callback(mthis, kind, label) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $_addTextTrack_2_Callback(mthis, kind, label) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_HTMLMediaElement__addTextTrack_3_Callback(mthis, kind) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_1_DOMString";
+  static $_addTextTrack_3_Callback(mthis, kind) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLMediaElement_canPlayType_Callback(mthis, type, keySystem) native "HTMLMediaElement_canPlayType_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $canPlayType_Callback(mthis, type, keySystem) native "HTMLMediaElement_canPlayType_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_HTMLMediaElement_load_Callback(mthis) native "HTMLMediaElement_load_Callback_RESOLVER_STRING_0_";
+  static $load_Callback(mthis) native "HTMLMediaElement_load_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLMediaElement_pause_Callback(mthis) native "HTMLMediaElement_pause_Callback_RESOLVER_STRING_0_";
+  static $pause_Callback(mthis) native "HTMLMediaElement_pause_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLMediaElement_play_Callback(mthis) native "HTMLMediaElement_play_Callback_RESOLVER_STRING_0_";
+  static $play_Callback(mthis) native "HTMLMediaElement_play_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLMediaElement_setMediaKeys_Callback(mthis, mediaKeys) native "HTMLMediaElement_setMediaKeys_Callback_RESOLVER_STRING_1_MediaKeys";
+  static $setMediaKeys_Callback(mthis, mediaKeys) native "HTMLMediaElement_setMediaKeys_Callback_RESOLVER_STRING_1_MediaKeys";
 
   // Generated overload resolver
-Native_HTMLMediaElement_addKey(mthis, keySystem, key, initData, sessionId) {
+  static $addKey(mthis, keySystem, key, initData, sessionId) {
     if (initData != null) {
-      Native_HTMLMediaElement__webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId);
+      $_webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId);
       return;
     }
-    Native_HTMLMediaElement__webkitAddKey_2_Callback(mthis, keySystem, key);
+    $_webkitAddKey_2_Callback(mthis, keySystem, key);
     return;
   }
 
-Native_HTMLMediaElement__webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId) native "HTMLMediaElement_webkitAddKey_Callback_RESOLVER_STRING_4_DOMString_Uint8Array_Uint8Array_DOMString";
+  static $_webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId) native "HTMLMediaElement_webkitAddKey_Callback_RESOLVER_STRING_4_DOMString_Uint8Array_Uint8Array_DOMString";
 
-Native_HTMLMediaElement__webkitAddKey_2_Callback(mthis, keySystem, key) native "HTMLMediaElement_webkitAddKey_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
+  static $_webkitAddKey_2_Callback(mthis, keySystem, key) native "HTMLMediaElement_webkitAddKey_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
 
-Native_HTMLMediaElement_webkitCancelKeyRequest_Callback(mthis, keySystem, sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $webkitCancelKeyRequest_Callback(mthis, keySystem, sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
   // Generated overload resolver
-Native_HTMLMediaElement_generateKeyRequest(mthis, keySystem, initData) {
+  static $generateKeyRequest(mthis, keySystem, initData) {
     if (initData != null) {
-      Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData);
+      $_webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData);
       return;
     }
-    Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(mthis, keySystem);
+    $_webkitGenerateKeyRequest_2_Callback(mthis, keySystem);
     return;
   }
 
-Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
+  static $_webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
 
-Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(mthis, keySystem) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback_RESOLVER_STRING_1_DOMString";
+  static $_webkitGenerateKeyRequest_2_Callback(mthis, keySystem) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback_RESOLVER_STRING_1_DOMString";
+}
 
+class BlinkHTMLAudioElement {
   // Generated overload resolver
-Native_HTMLAudioElement_AudioElement(src) {
-    return Native_HTMLAudioElement__create_1constructorCallback(src);
+  static $mkAudioElement(src) {
+    return $_create_1constructorCallback(src);
   }
 
-Native_HTMLAudioElement__create_1constructorCallback(src) native "HTMLAudioElement_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(src) native "HTMLAudioElement_constructorCallback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLBaseElement_href_Getter(mthis) native "HTMLBaseElement_href_Getter";
+class BlinkHTMLBRElement {}
 
-Native_HTMLBaseElement_href_Setter(mthis, value) native "HTMLBaseElement_href_Setter";
+class BlinkHTMLBaseElement {
+  static $href_Getter(mthis) native "HTMLBaseElement_href_Getter";
 
-Native_HTMLBaseElement_target_Getter(mthis) native "HTMLBaseElement_target_Getter";
+  static $href_Setter(mthis, value) native "HTMLBaseElement_href_Setter";
 
-Native_HTMLBaseElement_target_Setter(mthis, value) native "HTMLBaseElement_target_Setter";
+  static $target_Getter(mthis) native "HTMLBaseElement_target_Getter";
 
-Native_HTMLButtonElement_autofocus_Getter(mthis) native "HTMLButtonElement_autofocus_Getter";
+  static $target_Setter(mthis, value) native "HTMLBaseElement_target_Setter";
+}
 
-Native_HTMLButtonElement_autofocus_Setter(mthis, value) native "HTMLButtonElement_autofocus_Setter";
+class BlinkWindowEventHandlers {}
 
-Native_HTMLButtonElement_disabled_Getter(mthis) native "HTMLButtonElement_disabled_Getter";
+class BlinkHTMLBodyElement {}
 
-Native_HTMLButtonElement_disabled_Setter(mthis, value) native "HTMLButtonElement_disabled_Setter";
+class BlinkHTMLButtonElement {
+  static $autofocus_Getter(mthis) native "HTMLButtonElement_autofocus_Getter";
 
-Native_HTMLButtonElement_form_Getter(mthis) native "HTMLButtonElement_form_Getter";
+  static $autofocus_Setter(mthis, value) native "HTMLButtonElement_autofocus_Setter";
 
-Native_HTMLButtonElement_formAction_Getter(mthis) native "HTMLButtonElement_formAction_Getter";
+  static $disabled_Getter(mthis) native "HTMLButtonElement_disabled_Getter";
 
-Native_HTMLButtonElement_formAction_Setter(mthis, value) native "HTMLButtonElement_formAction_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLButtonElement_disabled_Setter";
 
-Native_HTMLButtonElement_formEnctype_Getter(mthis) native "HTMLButtonElement_formEnctype_Getter";
+  static $form_Getter(mthis) native "HTMLButtonElement_form_Getter";
 
-Native_HTMLButtonElement_formEnctype_Setter(mthis, value) native "HTMLButtonElement_formEnctype_Setter";
+  static $formAction_Getter(mthis) native "HTMLButtonElement_formAction_Getter";
 
-Native_HTMLButtonElement_formMethod_Getter(mthis) native "HTMLButtonElement_formMethod_Getter";
+  static $formAction_Setter(mthis, value) native "HTMLButtonElement_formAction_Setter";
 
-Native_HTMLButtonElement_formMethod_Setter(mthis, value) native "HTMLButtonElement_formMethod_Setter";
+  static $formEnctype_Getter(mthis) native "HTMLButtonElement_formEnctype_Getter";
 
-Native_HTMLButtonElement_formNoValidate_Getter(mthis) native "HTMLButtonElement_formNoValidate_Getter";
+  static $formEnctype_Setter(mthis, value) native "HTMLButtonElement_formEnctype_Setter";
 
-Native_HTMLButtonElement_formNoValidate_Setter(mthis, value) native "HTMLButtonElement_formNoValidate_Setter";
+  static $formMethod_Getter(mthis) native "HTMLButtonElement_formMethod_Getter";
 
-Native_HTMLButtonElement_formTarget_Getter(mthis) native "HTMLButtonElement_formTarget_Getter";
+  static $formMethod_Setter(mthis, value) native "HTMLButtonElement_formMethod_Setter";
 
-Native_HTMLButtonElement_formTarget_Setter(mthis, value) native "HTMLButtonElement_formTarget_Setter";
+  static $formNoValidate_Getter(mthis) native "HTMLButtonElement_formNoValidate_Getter";
 
-Native_HTMLButtonElement_labels_Getter(mthis) native "HTMLButtonElement_labels_Getter";
+  static $formNoValidate_Setter(mthis, value) native "HTMLButtonElement_formNoValidate_Setter";
 
-Native_HTMLButtonElement_name_Getter(mthis) native "HTMLButtonElement_name_Getter";
+  static $formTarget_Getter(mthis) native "HTMLButtonElement_formTarget_Getter";
 
-Native_HTMLButtonElement_name_Setter(mthis, value) native "HTMLButtonElement_name_Setter";
+  static $formTarget_Setter(mthis, value) native "HTMLButtonElement_formTarget_Setter";
 
-Native_HTMLButtonElement_type_Getter(mthis) native "HTMLButtonElement_type_Getter";
+  static $labels_Getter(mthis) native "HTMLButtonElement_labels_Getter";
 
-Native_HTMLButtonElement_type_Setter(mthis, value) native "HTMLButtonElement_type_Setter";
+  static $name_Getter(mthis) native "HTMLButtonElement_name_Getter";
 
-Native_HTMLButtonElement_validationMessage_Getter(mthis) native "HTMLButtonElement_validationMessage_Getter";
+  static $name_Setter(mthis, value) native "HTMLButtonElement_name_Setter";
 
-Native_HTMLButtonElement_validity_Getter(mthis) native "HTMLButtonElement_validity_Getter";
+  static $type_Getter(mthis) native "HTMLButtonElement_type_Getter";
 
-Native_HTMLButtonElement_value_Getter(mthis) native "HTMLButtonElement_value_Getter";
+  static $type_Setter(mthis, value) native "HTMLButtonElement_type_Setter";
 
-Native_HTMLButtonElement_value_Setter(mthis, value) native "HTMLButtonElement_value_Setter";
+  static $validationMessage_Getter(mthis) native "HTMLButtonElement_validationMessage_Getter";
 
-Native_HTMLButtonElement_willValidate_Getter(mthis) native "HTMLButtonElement_willValidate_Getter";
+  static $validity_Getter(mthis) native "HTMLButtonElement_validity_Getter";
 
-Native_HTMLButtonElement_checkValidity_Callback(mthis) native "HTMLButtonElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $value_Getter(mthis) native "HTMLButtonElement_value_Getter";
 
-Native_HTMLButtonElement_setCustomValidity_Callback(mthis, error) native "HTMLButtonElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $value_Setter(mthis, value) native "HTMLButtonElement_value_Setter";
 
-Native_HTMLCanvasElement_height_Getter(mthis) native "HTMLCanvasElement_height_Getter";
+  static $willValidate_Getter(mthis) native "HTMLButtonElement_willValidate_Getter";
 
-Native_HTMLCanvasElement_height_Setter(mthis, value) native "HTMLCanvasElement_height_Setter";
+  static $checkValidity_Callback(mthis) native "HTMLButtonElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLCanvasElement_width_Getter(mthis) native "HTMLCanvasElement_width_Getter";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLButtonElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLCanvasElement_width_Setter(mthis, value) native "HTMLCanvasElement_width_Setter";
+class BlinkHTMLCanvasElement {
+  static $height_Getter(mthis) native "HTMLCanvasElement_height_Getter";
 
-Native_HTMLCanvasElement_getContext_Callback(mthis, contextId, attrs) native "HTMLCanvasElement_getContext_Callback";
+  static $height_Setter(mthis, value) native "HTMLCanvasElement_height_Setter";
 
-Native_HTMLCanvasElement_toDataURL_Callback(mthis, type, quality) native "HTMLCanvasElement_toDataURL_Callback";
+  static $width_Getter(mthis) native "HTMLCanvasElement_width_Getter";
 
-Native_HTMLCollection_length_Getter(mthis) native "HTMLCollection_length_Getter";
+  static $width_Setter(mthis, value) native "HTMLCanvasElement_width_Setter";
 
-Native_HTMLCollection_NativeIndexed_Getter(mthis, index) native "HTMLCollection_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getContext_Callback(mthis, contextId, attrs) native "HTMLCanvasElement_getContext_Callback";
 
-Native_HTMLCollection_item_Callback(mthis, index) native "HTMLCollection_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $toDataURL_Callback(mthis, type, quality) native "HTMLCanvasElement_toDataURL_Callback";
+}
 
-Native_HTMLCollection_namedItem_Callback(mthis, name) native "HTMLCollection_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkHTMLCollection {
+  static $length_Getter(mthis) native "HTMLCollection_length_Getter";
 
-Native_HTMLContentElement_resetStyleInheritance_Getter(mthis) native "HTMLContentElement_resetStyleInheritance_Getter";
+  static $NativeIndexed_Getter(mthis, index) native "HTMLCollection_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_HTMLContentElement_resetStyleInheritance_Setter(mthis, value) native "HTMLContentElement_resetStyleInheritance_Setter";
+  static $item_Callback(mthis, index) native "HTMLCollection_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_HTMLContentElement_select_Getter(mthis) native "HTMLContentElement_select_Getter";
+  static $namedItem_Callback(mthis, name) native "HTMLCollection_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLContentElement_select_Setter(mthis, value) native "HTMLContentElement_select_Setter";
+class BlinkHTMLContentElement {
+  static $resetStyleInheritance_Getter(mthis) native "HTMLContentElement_resetStyleInheritance_Getter";
 
-Native_HTMLContentElement_getDistributedNodes_Callback(mthis) native "HTMLContentElement_getDistributedNodes_Callback_RESOLVER_STRING_0_";
+  static $resetStyleInheritance_Setter(mthis, value) native "HTMLContentElement_resetStyleInheritance_Setter";
 
-Native_HTMLDataListElement_options_Getter(mthis) native "HTMLDataListElement_options_Getter";
+  static $select_Getter(mthis) native "HTMLContentElement_select_Getter";
 
-Native_HTMLDetailsElement_open_Getter(mthis) native "HTMLDetailsElement_open_Getter";
+  static $select_Setter(mthis, value) native "HTMLContentElement_select_Setter";
 
-Native_HTMLDetailsElement_open_Setter(mthis, value) native "HTMLDetailsElement_open_Setter";
+  static $getDistributedNodes_Callback(mthis) native "HTMLContentElement_getDistributedNodes_Callback_RESOLVER_STRING_0_";
+}
 
-Native_HTMLDialogElement_open_Getter(mthis) native "HTMLDialogElement_open_Getter";
+class BlinkHTMLDListElement {}
 
-Native_HTMLDialogElement_open_Setter(mthis, value) native "HTMLDialogElement_open_Setter";
+class BlinkHTMLDataListElement {
+  static $options_Getter(mthis) native "HTMLDataListElement_options_Getter";
+}
 
-Native_HTMLDialogElement_returnValue_Getter(mthis) native "HTMLDialogElement_returnValue_Getter";
+class BlinkHTMLDetailsElement {
+  static $open_Getter(mthis) native "HTMLDetailsElement_open_Getter";
 
-Native_HTMLDialogElement_returnValue_Setter(mthis, value) native "HTMLDialogElement_returnValue_Setter";
+  static $open_Setter(mthis, value) native "HTMLDetailsElement_open_Setter";
+}
 
-Native_HTMLDialogElement_close_Callback(mthis, returnValue) native "HTMLDialogElement_close_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkHTMLDialogElement {
+  static $open_Getter(mthis) native "HTMLDialogElement_open_Getter";
 
-Native_HTMLDialogElement_show_Callback(mthis) native "HTMLDialogElement_show_Callback_RESOLVER_STRING_0_";
+  static $open_Setter(mthis, value) native "HTMLDialogElement_open_Setter";
 
-Native_HTMLDialogElement_showModal_Callback(mthis) native "HTMLDialogElement_showModal_Callback_RESOLVER_STRING_0_";
+  static $returnValue_Getter(mthis) native "HTMLDialogElement_returnValue_Getter";
 
-Native_HTMLEmbedElement_height_Getter(mthis) native "HTMLEmbedElement_height_Getter";
+  static $returnValue_Setter(mthis, value) native "HTMLDialogElement_returnValue_Setter";
 
-Native_HTMLEmbedElement_height_Setter(mthis, value) native "HTMLEmbedElement_height_Setter";
+  static $close_Callback(mthis, returnValue) native "HTMLDialogElement_close_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLEmbedElement_name_Getter(mthis) native "HTMLEmbedElement_name_Getter";
+  static $show_Callback(mthis) native "HTMLDialogElement_show_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLEmbedElement_name_Setter(mthis, value) native "HTMLEmbedElement_name_Setter";
+  static $showModal_Callback(mthis) native "HTMLDialogElement_showModal_Callback_RESOLVER_STRING_0_";
+}
 
-Native_HTMLEmbedElement_src_Getter(mthis) native "HTMLEmbedElement_src_Getter";
+class BlinkHTMLDirectoryElement {}
 
-Native_HTMLEmbedElement_src_Setter(mthis, value) native "HTMLEmbedElement_src_Setter";
+class BlinkHTMLDivElement {}
 
-Native_HTMLEmbedElement_type_Getter(mthis) native "HTMLEmbedElement_type_Getter";
+class BlinkHTMLDocument {}
 
-Native_HTMLEmbedElement_type_Setter(mthis, value) native "HTMLEmbedElement_type_Setter";
+class BlinkHTMLEmbedElement {
+  static $height_Getter(mthis) native "HTMLEmbedElement_height_Getter";
 
-Native_HTMLEmbedElement_width_Getter(mthis) native "HTMLEmbedElement_width_Getter";
+  static $height_Setter(mthis, value) native "HTMLEmbedElement_height_Setter";
 
-Native_HTMLEmbedElement_width_Setter(mthis, value) native "HTMLEmbedElement_width_Setter";
+  static $name_Getter(mthis) native "HTMLEmbedElement_name_Getter";
 
-Native_HTMLEmbedElement___getter___Callback(mthis, index_OR_name) native "HTMLEmbedElement___getter___Callback";
+  static $name_Setter(mthis, value) native "HTMLEmbedElement_name_Setter";
 
-Native_HTMLEmbedElement___setter___Callback(mthis, index_OR_name, value) native "HTMLEmbedElement___setter___Callback";
+  static $src_Getter(mthis) native "HTMLEmbedElement_src_Getter";
 
-Native_HTMLFieldSetElement_disabled_Getter(mthis) native "HTMLFieldSetElement_disabled_Getter";
+  static $src_Setter(mthis, value) native "HTMLEmbedElement_src_Setter";
 
-Native_HTMLFieldSetElement_disabled_Setter(mthis, value) native "HTMLFieldSetElement_disabled_Setter";
+  static $type_Getter(mthis) native "HTMLEmbedElement_type_Getter";
 
-Native_HTMLFieldSetElement_elements_Getter(mthis) native "HTMLFieldSetElement_elements_Getter";
+  static $type_Setter(mthis, value) native "HTMLEmbedElement_type_Setter";
 
-Native_HTMLFieldSetElement_form_Getter(mthis) native "HTMLFieldSetElement_form_Getter";
+  static $width_Getter(mthis) native "HTMLEmbedElement_width_Getter";
 
-Native_HTMLFieldSetElement_name_Getter(mthis) native "HTMLFieldSetElement_name_Getter";
+  static $width_Setter(mthis, value) native "HTMLEmbedElement_width_Setter";
 
-Native_HTMLFieldSetElement_name_Setter(mthis, value) native "HTMLFieldSetElement_name_Setter";
+  static $__getter___Callback(mthis, index_OR_name) native "HTMLEmbedElement___getter___Callback";
 
-Native_HTMLFieldSetElement_type_Getter(mthis) native "HTMLFieldSetElement_type_Getter";
+  static $__setter___Callback(mthis, index_OR_name, value) native "HTMLEmbedElement___setter___Callback";
+}
 
-Native_HTMLFieldSetElement_validationMessage_Getter(mthis) native "HTMLFieldSetElement_validationMessage_Getter";
+class BlinkHTMLFieldSetElement {
+  static $disabled_Getter(mthis) native "HTMLFieldSetElement_disabled_Getter";
 
-Native_HTMLFieldSetElement_validity_Getter(mthis) native "HTMLFieldSetElement_validity_Getter";
+  static $disabled_Setter(mthis, value) native "HTMLFieldSetElement_disabled_Setter";
 
-Native_HTMLFieldSetElement_willValidate_Getter(mthis) native "HTMLFieldSetElement_willValidate_Getter";
+  static $elements_Getter(mthis) native "HTMLFieldSetElement_elements_Getter";
 
-Native_HTMLFieldSetElement_checkValidity_Callback(mthis) native "HTMLFieldSetElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $form_Getter(mthis) native "HTMLFieldSetElement_form_Getter";
 
-Native_HTMLFieldSetElement_setCustomValidity_Callback(mthis, error) native "HTMLFieldSetElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $name_Getter(mthis) native "HTMLFieldSetElement_name_Getter";
 
-Native_HTMLFormElement_acceptCharset_Getter(mthis) native "HTMLFormElement_acceptCharset_Getter";
+  static $name_Setter(mthis, value) native "HTMLFieldSetElement_name_Setter";
 
-Native_HTMLFormElement_acceptCharset_Setter(mthis, value) native "HTMLFormElement_acceptCharset_Setter";
+  static $type_Getter(mthis) native "HTMLFieldSetElement_type_Getter";
 
-Native_HTMLFormElement_action_Getter(mthis) native "HTMLFormElement_action_Getter";
+  static $validationMessage_Getter(mthis) native "HTMLFieldSetElement_validationMessage_Getter";
 
-Native_HTMLFormElement_action_Setter(mthis, value) native "HTMLFormElement_action_Setter";
+  static $validity_Getter(mthis) native "HTMLFieldSetElement_validity_Getter";
 
-Native_HTMLFormElement_autocomplete_Getter(mthis) native "HTMLFormElement_autocomplete_Getter";
+  static $willValidate_Getter(mthis) native "HTMLFieldSetElement_willValidate_Getter";
 
-Native_HTMLFormElement_autocomplete_Setter(mthis, value) native "HTMLFormElement_autocomplete_Setter";
+  static $checkValidity_Callback(mthis) native "HTMLFieldSetElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLFormElement_encoding_Getter(mthis) native "HTMLFormElement_encoding_Getter";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLFieldSetElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLFormElement_encoding_Setter(mthis, value) native "HTMLFormElement_encoding_Setter";
+class BlinkHTMLFontElement {}
 
-Native_HTMLFormElement_enctype_Getter(mthis) native "HTMLFormElement_enctype_Getter";
+class BlinkHTMLFormControlsCollection {}
 
-Native_HTMLFormElement_enctype_Setter(mthis, value) native "HTMLFormElement_enctype_Setter";
+class BlinkHTMLFormElement {
+  static $acceptCharset_Getter(mthis) native "HTMLFormElement_acceptCharset_Getter";
 
-Native_HTMLFormElement_length_Getter(mthis) native "HTMLFormElement_length_Getter";
+  static $acceptCharset_Setter(mthis, value) native "HTMLFormElement_acceptCharset_Setter";
 
-Native_HTMLFormElement_method_Getter(mthis) native "HTMLFormElement_method_Getter";
+  static $action_Getter(mthis) native "HTMLFormElement_action_Getter";
 
-Native_HTMLFormElement_method_Setter(mthis, value) native "HTMLFormElement_method_Setter";
+  static $action_Setter(mthis, value) native "HTMLFormElement_action_Setter";
 
-Native_HTMLFormElement_name_Getter(mthis) native "HTMLFormElement_name_Getter";
+  static $autocomplete_Getter(mthis) native "HTMLFormElement_autocomplete_Getter";
 
-Native_HTMLFormElement_name_Setter(mthis, value) native "HTMLFormElement_name_Setter";
+  static $autocomplete_Setter(mthis, value) native "HTMLFormElement_autocomplete_Setter";
 
-Native_HTMLFormElement_noValidate_Getter(mthis) native "HTMLFormElement_noValidate_Getter";
+  static $encoding_Getter(mthis) native "HTMLFormElement_encoding_Getter";
 
-Native_HTMLFormElement_noValidate_Setter(mthis, value) native "HTMLFormElement_noValidate_Setter";
+  static $encoding_Setter(mthis, value) native "HTMLFormElement_encoding_Setter";
 
-Native_HTMLFormElement_target_Getter(mthis) native "HTMLFormElement_target_Getter";
+  static $enctype_Getter(mthis) native "HTMLFormElement_enctype_Getter";
 
-Native_HTMLFormElement_target_Setter(mthis, value) native "HTMLFormElement_target_Setter";
+  static $enctype_Setter(mthis, value) native "HTMLFormElement_enctype_Setter";
 
-Native_HTMLFormElement___getter___Callback(mthis, index) native "HTMLFormElement___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $length_Getter(mthis) native "HTMLFormElement_length_Getter";
 
-Native_HTMLFormElement_checkValidity_Callback(mthis) native "HTMLFormElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $method_Getter(mthis) native "HTMLFormElement_method_Getter";
 
-Native_HTMLFormElement_requestAutocomplete_Callback(mthis, details) native "HTMLFormElement_requestAutocomplete_Callback_RESOLVER_STRING_1_Dictionary";
+  static $method_Setter(mthis, value) native "HTMLFormElement_method_Setter";
 
-Native_HTMLFormElement_reset_Callback(mthis) native "HTMLFormElement_reset_Callback_RESOLVER_STRING_0_";
+  static $name_Getter(mthis) native "HTMLFormElement_name_Getter";
+
+  static $name_Setter(mthis, value) native "HTMLFormElement_name_Setter";
+
+  static $noValidate_Getter(mthis) native "HTMLFormElement_noValidate_Getter";
+
+  static $noValidate_Setter(mthis, value) native "HTMLFormElement_noValidate_Setter";
+
+  static $target_Getter(mthis) native "HTMLFormElement_target_Getter";
+
+  static $target_Setter(mthis, value) native "HTMLFormElement_target_Setter";
+
+  static $__getter___Callback(mthis, index) native "HTMLFormElement___getter___Callback_RESOLVER_STRING_1_unsigned long";
+
+  static $checkValidity_Callback(mthis) native "HTMLFormElement_checkValidity_Callback_RESOLVER_STRING_0_";
+
+  static $requestAutocomplete_Callback(mthis, details) native "HTMLFormElement_requestAutocomplete_Callback_RESOLVER_STRING_1_Dictionary";
+
+  static $reset_Callback(mthis) native "HTMLFormElement_reset_Callback_RESOLVER_STRING_0_";
+
+  static $submit_Callback(mthis) native "HTMLFormElement_submit_Callback_RESOLVER_STRING_0_";
+}
+
+class BlinkHTMLFrameElement {}
+
+class BlinkHTMLFrameSetElement {}
+
+class BlinkHTMLHRElement {
+  static $color_Getter(mthis) native "HTMLHRElement_color_Getter";
+
+  static $color_Setter(mthis, value) native "HTMLHRElement_color_Setter";
+}
 
-Native_HTMLFormElement_submit_Callback(mthis) native "HTMLFormElement_submit_Callback_RESOLVER_STRING_0_";
+class BlinkHTMLHeadElement {}
 
-Native_HTMLHRElement_color_Getter(mthis) native "HTMLHRElement_color_Getter";
+class BlinkHTMLHeadingElement {}
 
-Native_HTMLHRElement_color_Setter(mthis, value) native "HTMLHRElement_color_Setter";
+class BlinkHTMLHtmlElement {}
 
-Native_HTMLIFrameElement_contentWindow_Getter(mthis) native "HTMLIFrameElement_contentWindow_Getter";
+class BlinkHTMLIFrameElement {
+  static $contentWindow_Getter(mthis) native "HTMLIFrameElement_contentWindow_Getter";
 
-Native_HTMLIFrameElement_height_Getter(mthis) native "HTMLIFrameElement_height_Getter";
+  static $height_Getter(mthis) native "HTMLIFrameElement_height_Getter";
 
-Native_HTMLIFrameElement_height_Setter(mthis, value) native "HTMLIFrameElement_height_Setter";
+  static $height_Setter(mthis, value) native "HTMLIFrameElement_height_Setter";
 
-Native_HTMLIFrameElement_name_Getter(mthis) native "HTMLIFrameElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLIFrameElement_name_Getter";
 
-Native_HTMLIFrameElement_name_Setter(mthis, value) native "HTMLIFrameElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLIFrameElement_name_Setter";
 
-Native_HTMLIFrameElement_sandbox_Getter(mthis) native "HTMLIFrameElement_sandbox_Getter";
+  static $sandbox_Getter(mthis) native "HTMLIFrameElement_sandbox_Getter";
 
-Native_HTMLIFrameElement_sandbox_Setter(mthis, value) native "HTMLIFrameElement_sandbox_Setter";
+  static $sandbox_Setter(mthis, value) native "HTMLIFrameElement_sandbox_Setter";
 
-Native_HTMLIFrameElement_src_Getter(mthis) native "HTMLIFrameElement_src_Getter";
+  static $src_Getter(mthis) native "HTMLIFrameElement_src_Getter";
 
-Native_HTMLIFrameElement_src_Setter(mthis, value) native "HTMLIFrameElement_src_Setter";
+  static $src_Setter(mthis, value) native "HTMLIFrameElement_src_Setter";
 
-Native_HTMLIFrameElement_srcdoc_Getter(mthis) native "HTMLIFrameElement_srcdoc_Getter";
+  static $srcdoc_Getter(mthis) native "HTMLIFrameElement_srcdoc_Getter";
 
-Native_HTMLIFrameElement_srcdoc_Setter(mthis, value) native "HTMLIFrameElement_srcdoc_Setter";
+  static $srcdoc_Setter(mthis, value) native "HTMLIFrameElement_srcdoc_Setter";
 
-Native_HTMLIFrameElement_width_Getter(mthis) native "HTMLIFrameElement_width_Getter";
+  static $width_Getter(mthis) native "HTMLIFrameElement_width_Getter";
 
-Native_HTMLIFrameElement_width_Setter(mthis, value) native "HTMLIFrameElement_width_Setter";
+  static $width_Setter(mthis, value) native "HTMLIFrameElement_width_Setter";
+}
 
-Native_HTMLImageElement_alt_Getter(mthis) native "HTMLImageElement_alt_Getter";
+class BlinkHTMLImageElement {
+  static $alt_Getter(mthis) native "HTMLImageElement_alt_Getter";
 
-Native_HTMLImageElement_alt_Setter(mthis, value) native "HTMLImageElement_alt_Setter";
+  static $alt_Setter(mthis, value) native "HTMLImageElement_alt_Setter";
 
-Native_HTMLImageElement_complete_Getter(mthis) native "HTMLImageElement_complete_Getter";
+  static $complete_Getter(mthis) native "HTMLImageElement_complete_Getter";
 
-Native_HTMLImageElement_crossOrigin_Getter(mthis) native "HTMLImageElement_crossOrigin_Getter";
+  static $crossOrigin_Getter(mthis) native "HTMLImageElement_crossOrigin_Getter";
 
-Native_HTMLImageElement_crossOrigin_Setter(mthis, value) native "HTMLImageElement_crossOrigin_Setter";
+  static $crossOrigin_Setter(mthis, value) native "HTMLImageElement_crossOrigin_Setter";
 
-Native_HTMLImageElement_height_Getter(mthis) native "HTMLImageElement_height_Getter";
+  static $height_Getter(mthis) native "HTMLImageElement_height_Getter";
 
-Native_HTMLImageElement_height_Setter(mthis, value) native "HTMLImageElement_height_Setter";
+  static $height_Setter(mthis, value) native "HTMLImageElement_height_Setter";
 
-Native_HTMLImageElement_isMap_Getter(mthis) native "HTMLImageElement_isMap_Getter";
+  static $isMap_Getter(mthis) native "HTMLImageElement_isMap_Getter";
 
-Native_HTMLImageElement_isMap_Setter(mthis, value) native "HTMLImageElement_isMap_Setter";
+  static $isMap_Setter(mthis, value) native "HTMLImageElement_isMap_Setter";
 
-Native_HTMLImageElement_naturalHeight_Getter(mthis) native "HTMLImageElement_naturalHeight_Getter";
+  static $naturalHeight_Getter(mthis) native "HTMLImageElement_naturalHeight_Getter";
 
-Native_HTMLImageElement_naturalWidth_Getter(mthis) native "HTMLImageElement_naturalWidth_Getter";
+  static $naturalWidth_Getter(mthis) native "HTMLImageElement_naturalWidth_Getter";
 
-Native_HTMLImageElement_src_Getter(mthis) native "HTMLImageElement_src_Getter";
+  static $src_Getter(mthis) native "HTMLImageElement_src_Getter";
 
-Native_HTMLImageElement_src_Setter(mthis, value) native "HTMLImageElement_src_Setter";
+  static $src_Setter(mthis, value) native "HTMLImageElement_src_Setter";
 
-Native_HTMLImageElement_srcset_Getter(mthis) native "HTMLImageElement_srcset_Getter";
+  static $srcset_Getter(mthis) native "HTMLImageElement_srcset_Getter";
 
-Native_HTMLImageElement_srcset_Setter(mthis, value) native "HTMLImageElement_srcset_Setter";
+  static $srcset_Setter(mthis, value) native "HTMLImageElement_srcset_Setter";
 
-Native_HTMLImageElement_useMap_Getter(mthis) native "HTMLImageElement_useMap_Getter";
+  static $useMap_Getter(mthis) native "HTMLImageElement_useMap_Getter";
 
-Native_HTMLImageElement_useMap_Setter(mthis, value) native "HTMLImageElement_useMap_Setter";
+  static $useMap_Setter(mthis, value) native "HTMLImageElement_useMap_Setter";
 
-Native_HTMLImageElement_width_Getter(mthis) native "HTMLImageElement_width_Getter";
+  static $width_Getter(mthis) native "HTMLImageElement_width_Getter";
 
-Native_HTMLImageElement_width_Setter(mthis, value) native "HTMLImageElement_width_Setter";
+  static $width_Setter(mthis, value) native "HTMLImageElement_width_Setter";
+}
 
-Native_HTMLInputElement_accept_Getter(mthis) native "HTMLInputElement_accept_Getter";
+class BlinkHTMLInputElement {
+  static $accept_Getter(mthis) native "HTMLInputElement_accept_Getter";
 
-Native_HTMLInputElement_accept_Setter(mthis, value) native "HTMLInputElement_accept_Setter";
+  static $accept_Setter(mthis, value) native "HTMLInputElement_accept_Setter";
 
-Native_HTMLInputElement_alt_Getter(mthis) native "HTMLInputElement_alt_Getter";
+  static $alt_Getter(mthis) native "HTMLInputElement_alt_Getter";
 
-Native_HTMLInputElement_alt_Setter(mthis, value) native "HTMLInputElement_alt_Setter";
+  static $alt_Setter(mthis, value) native "HTMLInputElement_alt_Setter";
 
-Native_HTMLInputElement_autocomplete_Getter(mthis) native "HTMLInputElement_autocomplete_Getter";
+  static $autocomplete_Getter(mthis) native "HTMLInputElement_autocomplete_Getter";
 
-Native_HTMLInputElement_autocomplete_Setter(mthis, value) native "HTMLInputElement_autocomplete_Setter";
+  static $autocomplete_Setter(mthis, value) native "HTMLInputElement_autocomplete_Setter";
 
-Native_HTMLInputElement_autofocus_Getter(mthis) native "HTMLInputElement_autofocus_Getter";
+  static $autofocus_Getter(mthis) native "HTMLInputElement_autofocus_Getter";
 
-Native_HTMLInputElement_autofocus_Setter(mthis, value) native "HTMLInputElement_autofocus_Setter";
+  static $autofocus_Setter(mthis, value) native "HTMLInputElement_autofocus_Setter";
 
-Native_HTMLInputElement_checked_Getter(mthis) native "HTMLInputElement_checked_Getter";
+  static $checked_Getter(mthis) native "HTMLInputElement_checked_Getter";
 
-Native_HTMLInputElement_checked_Setter(mthis, value) native "HTMLInputElement_checked_Setter";
+  static $checked_Setter(mthis, value) native "HTMLInputElement_checked_Setter";
 
-Native_HTMLInputElement_defaultChecked_Getter(mthis) native "HTMLInputElement_defaultChecked_Getter";
+  static $defaultChecked_Getter(mthis) native "HTMLInputElement_defaultChecked_Getter";
 
-Native_HTMLInputElement_defaultChecked_Setter(mthis, value) native "HTMLInputElement_defaultChecked_Setter";
+  static $defaultChecked_Setter(mthis, value) native "HTMLInputElement_defaultChecked_Setter";
 
-Native_HTMLInputElement_defaultValue_Getter(mthis) native "HTMLInputElement_defaultValue_Getter";
+  static $defaultValue_Getter(mthis) native "HTMLInputElement_defaultValue_Getter";
 
-Native_HTMLInputElement_defaultValue_Setter(mthis, value) native "HTMLInputElement_defaultValue_Setter";
+  static $defaultValue_Setter(mthis, value) native "HTMLInputElement_defaultValue_Setter";
 
-Native_HTMLInputElement_dirName_Getter(mthis) native "HTMLInputElement_dirName_Getter";
+  static $dirName_Getter(mthis) native "HTMLInputElement_dirName_Getter";
 
-Native_HTMLInputElement_dirName_Setter(mthis, value) native "HTMLInputElement_dirName_Setter";
+  static $dirName_Setter(mthis, value) native "HTMLInputElement_dirName_Setter";
 
-Native_HTMLInputElement_disabled_Getter(mthis) native "HTMLInputElement_disabled_Getter";
+  static $disabled_Getter(mthis) native "HTMLInputElement_disabled_Getter";
 
-Native_HTMLInputElement_disabled_Setter(mthis, value) native "HTMLInputElement_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLInputElement_disabled_Setter";
 
-Native_HTMLInputElement_files_Getter(mthis) native "HTMLInputElement_files_Getter";
+  static $files_Getter(mthis) native "HTMLInputElement_files_Getter";
 
-Native_HTMLInputElement_files_Setter(mthis, value) native "HTMLInputElement_files_Setter";
+  static $files_Setter(mthis, value) native "HTMLInputElement_files_Setter";
 
-Native_HTMLInputElement_form_Getter(mthis) native "HTMLInputElement_form_Getter";
+  static $form_Getter(mthis) native "HTMLInputElement_form_Getter";
 
-Native_HTMLInputElement_formAction_Getter(mthis) native "HTMLInputElement_formAction_Getter";
+  static $formAction_Getter(mthis) native "HTMLInputElement_formAction_Getter";
 
-Native_HTMLInputElement_formAction_Setter(mthis, value) native "HTMLInputElement_formAction_Setter";
+  static $formAction_Setter(mthis, value) native "HTMLInputElement_formAction_Setter";
 
-Native_HTMLInputElement_formEnctype_Getter(mthis) native "HTMLInputElement_formEnctype_Getter";
+  static $formEnctype_Getter(mthis) native "HTMLInputElement_formEnctype_Getter";
 
-Native_HTMLInputElement_formEnctype_Setter(mthis, value) native "HTMLInputElement_formEnctype_Setter";
+  static $formEnctype_Setter(mthis, value) native "HTMLInputElement_formEnctype_Setter";
 
-Native_HTMLInputElement_formMethod_Getter(mthis) native "HTMLInputElement_formMethod_Getter";
+  static $formMethod_Getter(mthis) native "HTMLInputElement_formMethod_Getter";
 
-Native_HTMLInputElement_formMethod_Setter(mthis, value) native "HTMLInputElement_formMethod_Setter";
+  static $formMethod_Setter(mthis, value) native "HTMLInputElement_formMethod_Setter";
 
-Native_HTMLInputElement_formNoValidate_Getter(mthis) native "HTMLInputElement_formNoValidate_Getter";
+  static $formNoValidate_Getter(mthis) native "HTMLInputElement_formNoValidate_Getter";
 
-Native_HTMLInputElement_formNoValidate_Setter(mthis, value) native "HTMLInputElement_formNoValidate_Setter";
+  static $formNoValidate_Setter(mthis, value) native "HTMLInputElement_formNoValidate_Setter";
 
-Native_HTMLInputElement_formTarget_Getter(mthis) native "HTMLInputElement_formTarget_Getter";
+  static $formTarget_Getter(mthis) native "HTMLInputElement_formTarget_Getter";
 
-Native_HTMLInputElement_formTarget_Setter(mthis, value) native "HTMLInputElement_formTarget_Setter";
+  static $formTarget_Setter(mthis, value) native "HTMLInputElement_formTarget_Setter";
 
-Native_HTMLInputElement_height_Getter(mthis) native "HTMLInputElement_height_Getter";
+  static $height_Getter(mthis) native "HTMLInputElement_height_Getter";
 
-Native_HTMLInputElement_height_Setter(mthis, value) native "HTMLInputElement_height_Setter";
+  static $height_Setter(mthis, value) native "HTMLInputElement_height_Setter";
 
-Native_HTMLInputElement_incremental_Getter(mthis) native "HTMLInputElement_incremental_Getter";
+  static $incremental_Getter(mthis) native "HTMLInputElement_incremental_Getter";
 
-Native_HTMLInputElement_incremental_Setter(mthis, value) native "HTMLInputElement_incremental_Setter";
+  static $incremental_Setter(mthis, value) native "HTMLInputElement_incremental_Setter";
 
-Native_HTMLInputElement_indeterminate_Getter(mthis) native "HTMLInputElement_indeterminate_Getter";
+  static $indeterminate_Getter(mthis) native "HTMLInputElement_indeterminate_Getter";
 
-Native_HTMLInputElement_indeterminate_Setter(mthis, value) native "HTMLInputElement_indeterminate_Setter";
+  static $indeterminate_Setter(mthis, value) native "HTMLInputElement_indeterminate_Setter";
 
-Native_HTMLInputElement_inputMode_Getter(mthis) native "HTMLInputElement_inputMode_Getter";
+  static $inputMode_Getter(mthis) native "HTMLInputElement_inputMode_Getter";
 
-Native_HTMLInputElement_inputMode_Setter(mthis, value) native "HTMLInputElement_inputMode_Setter";
+  static $inputMode_Setter(mthis, value) native "HTMLInputElement_inputMode_Setter";
 
-Native_HTMLInputElement_labels_Getter(mthis) native "HTMLInputElement_labels_Getter";
+  static $labels_Getter(mthis) native "HTMLInputElement_labels_Getter";
 
-Native_HTMLInputElement_list_Getter(mthis) native "HTMLInputElement_list_Getter";
+  static $list_Getter(mthis) native "HTMLInputElement_list_Getter";
 
-Native_HTMLInputElement_max_Getter(mthis) native "HTMLInputElement_max_Getter";
+  static $max_Getter(mthis) native "HTMLInputElement_max_Getter";
 
-Native_HTMLInputElement_max_Setter(mthis, value) native "HTMLInputElement_max_Setter";
+  static $max_Setter(mthis, value) native "HTMLInputElement_max_Setter";
 
-Native_HTMLInputElement_maxLength_Getter(mthis) native "HTMLInputElement_maxLength_Getter";
+  static $maxLength_Getter(mthis) native "HTMLInputElement_maxLength_Getter";
 
-Native_HTMLInputElement_maxLength_Setter(mthis, value) native "HTMLInputElement_maxLength_Setter";
+  static $maxLength_Setter(mthis, value) native "HTMLInputElement_maxLength_Setter";
 
-Native_HTMLInputElement_min_Getter(mthis) native "HTMLInputElement_min_Getter";
+  static $min_Getter(mthis) native "HTMLInputElement_min_Getter";
 
-Native_HTMLInputElement_min_Setter(mthis, value) native "HTMLInputElement_min_Setter";
+  static $min_Setter(mthis, value) native "HTMLInputElement_min_Setter";
 
-Native_HTMLInputElement_multiple_Getter(mthis) native "HTMLInputElement_multiple_Getter";
+  static $multiple_Getter(mthis) native "HTMLInputElement_multiple_Getter";
 
-Native_HTMLInputElement_multiple_Setter(mthis, value) native "HTMLInputElement_multiple_Setter";
+  static $multiple_Setter(mthis, value) native "HTMLInputElement_multiple_Setter";
 
-Native_HTMLInputElement_name_Getter(mthis) native "HTMLInputElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLInputElement_name_Getter";
 
-Native_HTMLInputElement_name_Setter(mthis, value) native "HTMLInputElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLInputElement_name_Setter";
 
-Native_HTMLInputElement_pattern_Getter(mthis) native "HTMLInputElement_pattern_Getter";
+  static $pattern_Getter(mthis) native "HTMLInputElement_pattern_Getter";
 
-Native_HTMLInputElement_pattern_Setter(mthis, value) native "HTMLInputElement_pattern_Setter";
+  static $pattern_Setter(mthis, value) native "HTMLInputElement_pattern_Setter";
 
-Native_HTMLInputElement_placeholder_Getter(mthis) native "HTMLInputElement_placeholder_Getter";
+  static $placeholder_Getter(mthis) native "HTMLInputElement_placeholder_Getter";
 
-Native_HTMLInputElement_placeholder_Setter(mthis, value) native "HTMLInputElement_placeholder_Setter";
+  static $placeholder_Setter(mthis, value) native "HTMLInputElement_placeholder_Setter";
 
-Native_HTMLInputElement_readOnly_Getter(mthis) native "HTMLInputElement_readOnly_Getter";
+  static $readOnly_Getter(mthis) native "HTMLInputElement_readOnly_Getter";
 
-Native_HTMLInputElement_readOnly_Setter(mthis, value) native "HTMLInputElement_readOnly_Setter";
+  static $readOnly_Setter(mthis, value) native "HTMLInputElement_readOnly_Setter";
 
-Native_HTMLInputElement_required_Getter(mthis) native "HTMLInputElement_required_Getter";
+  static $required_Getter(mthis) native "HTMLInputElement_required_Getter";
 
-Native_HTMLInputElement_required_Setter(mthis, value) native "HTMLInputElement_required_Setter";
+  static $required_Setter(mthis, value) native "HTMLInputElement_required_Setter";
 
-Native_HTMLInputElement_selectionDirection_Getter(mthis) native "HTMLInputElement_selectionDirection_Getter";
+  static $selectionDirection_Getter(mthis) native "HTMLInputElement_selectionDirection_Getter";
 
-Native_HTMLInputElement_selectionDirection_Setter(mthis, value) native "HTMLInputElement_selectionDirection_Setter";
+  static $selectionDirection_Setter(mthis, value) native "HTMLInputElement_selectionDirection_Setter";
 
-Native_HTMLInputElement_selectionEnd_Getter(mthis) native "HTMLInputElement_selectionEnd_Getter";
+  static $selectionEnd_Getter(mthis) native "HTMLInputElement_selectionEnd_Getter";
 
-Native_HTMLInputElement_selectionEnd_Setter(mthis, value) native "HTMLInputElement_selectionEnd_Setter";
+  static $selectionEnd_Setter(mthis, value) native "HTMLInputElement_selectionEnd_Setter";
 
-Native_HTMLInputElement_selectionStart_Getter(mthis) native "HTMLInputElement_selectionStart_Getter";
+  static $selectionStart_Getter(mthis) native "HTMLInputElement_selectionStart_Getter";
 
-Native_HTMLInputElement_selectionStart_Setter(mthis, value) native "HTMLInputElement_selectionStart_Setter";
+  static $selectionStart_Setter(mthis, value) native "HTMLInputElement_selectionStart_Setter";
 
-Native_HTMLInputElement_size_Getter(mthis) native "HTMLInputElement_size_Getter";
+  static $size_Getter(mthis) native "HTMLInputElement_size_Getter";
 
-Native_HTMLInputElement_size_Setter(mthis, value) native "HTMLInputElement_size_Setter";
+  static $size_Setter(mthis, value) native "HTMLInputElement_size_Setter";
 
-Native_HTMLInputElement_src_Getter(mthis) native "HTMLInputElement_src_Getter";
+  static $src_Getter(mthis) native "HTMLInputElement_src_Getter";
 
-Native_HTMLInputElement_src_Setter(mthis, value) native "HTMLInputElement_src_Setter";
+  static $src_Setter(mthis, value) native "HTMLInputElement_src_Setter";
 
-Native_HTMLInputElement_step_Getter(mthis) native "HTMLInputElement_step_Getter";
+  static $step_Getter(mthis) native "HTMLInputElement_step_Getter";
 
-Native_HTMLInputElement_step_Setter(mthis, value) native "HTMLInputElement_step_Setter";
+  static $step_Setter(mthis, value) native "HTMLInputElement_step_Setter";
 
-Native_HTMLInputElement_type_Getter(mthis) native "HTMLInputElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLInputElement_type_Getter";
 
-Native_HTMLInputElement_type_Setter(mthis, value) native "HTMLInputElement_type_Setter";
+  static $type_Setter(mthis, value) native "HTMLInputElement_type_Setter";
 
-Native_HTMLInputElement_validationMessage_Getter(mthis) native "HTMLInputElement_validationMessage_Getter";
+  static $validationMessage_Getter(mthis) native "HTMLInputElement_validationMessage_Getter";
 
-Native_HTMLInputElement_validity_Getter(mthis) native "HTMLInputElement_validity_Getter";
+  static $validity_Getter(mthis) native "HTMLInputElement_validity_Getter";
 
-Native_HTMLInputElement_value_Getter(mthis) native "HTMLInputElement_value_Getter";
+  static $value_Getter(mthis) native "HTMLInputElement_value_Getter";
 
-Native_HTMLInputElement_value_Setter(mthis, value) native "HTMLInputElement_value_Setter";
+  static $value_Setter(mthis, value) native "HTMLInputElement_value_Setter";
 
-Native_HTMLInputElement_valueAsDate_Getter(mthis) native "HTMLInputElement_valueAsDate_Getter";
+  static $valueAsDate_Getter(mthis) native "HTMLInputElement_valueAsDate_Getter";
 
-Native_HTMLInputElement_valueAsDate_Setter(mthis, value) native "HTMLInputElement_valueAsDate_Setter";
+  static $valueAsDate_Setter(mthis, value) native "HTMLInputElement_valueAsDate_Setter";
 
-Native_HTMLInputElement_valueAsNumber_Getter(mthis) native "HTMLInputElement_valueAsNumber_Getter";
+  static $valueAsNumber_Getter(mthis) native "HTMLInputElement_valueAsNumber_Getter";
 
-Native_HTMLInputElement_valueAsNumber_Setter(mthis, value) native "HTMLInputElement_valueAsNumber_Setter";
+  static $valueAsNumber_Setter(mthis, value) native "HTMLInputElement_valueAsNumber_Setter";
 
-Native_HTMLInputElement_webkitEntries_Getter(mthis) native "HTMLInputElement_webkitEntries_Getter";
+  static $webkitEntries_Getter(mthis) native "HTMLInputElement_webkitEntries_Getter";
 
-Native_HTMLInputElement_webkitdirectory_Getter(mthis) native "HTMLInputElement_webkitdirectory_Getter";
+  static $webkitdirectory_Getter(mthis) native "HTMLInputElement_webkitdirectory_Getter";
 
-Native_HTMLInputElement_webkitdirectory_Setter(mthis, value) native "HTMLInputElement_webkitdirectory_Setter";
+  static $webkitdirectory_Setter(mthis, value) native "HTMLInputElement_webkitdirectory_Setter";
 
-Native_HTMLInputElement_width_Getter(mthis) native "HTMLInputElement_width_Getter";
+  static $width_Getter(mthis) native "HTMLInputElement_width_Getter";
 
-Native_HTMLInputElement_width_Setter(mthis, value) native "HTMLInputElement_width_Setter";
+  static $width_Setter(mthis, value) native "HTMLInputElement_width_Setter";
 
-Native_HTMLInputElement_willValidate_Getter(mthis) native "HTMLInputElement_willValidate_Getter";
+  static $willValidate_Getter(mthis) native "HTMLInputElement_willValidate_Getter";
 
-Native_HTMLInputElement_checkValidity_Callback(mthis) native "HTMLInputElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $checkValidity_Callback(mthis) native "HTMLInputElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLInputElement_select_Callback(mthis) native "HTMLInputElement_select_Callback_RESOLVER_STRING_0_";
+  static $select_Callback(mthis) native "HTMLInputElement_select_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLInputElement_setCustomValidity_Callback(mthis, error) native "HTMLInputElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLInputElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_HTMLInputElement_setRangeText(mthis, replacement, start, end, selectionMode) {
+  static $setRangeText(mthis, replacement, start, end, selectionMode) {
     if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
-      Native_HTMLInputElement__setRangeText_1_Callback(mthis, replacement);
+      $_setRangeText_1_Callback(mthis, replacement);
       return;
     }
     if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
-      Native_HTMLInputElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode);
+      $_setRangeText_2_Callback(mthis, replacement, start, end, selectionMode);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_HTMLInputElement__setRangeText_1_Callback(mthis, replacement) native "HTMLInputElement_setRangeText_Callback_RESOLVER_STRING_1_DOMString";
+  static $_setRangeText_1_Callback(mthis, replacement) native "HTMLInputElement_setRangeText_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLInputElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLInputElement_setRangeText_Callback_RESOLVER_STRING_4_DOMString_unsigned long_unsigned long_DOMString";
+  static $_setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLInputElement_setRangeText_Callback_RESOLVER_STRING_4_DOMString_unsigned long_unsigned long_DOMString";
 
   // Generated overload resolver
-Native_HTMLInputElement_setSelectionRange(mthis, start, end, direction) {
+  static $setSelectionRange(mthis, start, end, direction) {
     if (direction != null) {
-      Native_HTMLInputElement__setSelectionRange_1_Callback(mthis, start, end, direction);
+      $_setSelectionRange_1_Callback(mthis, start, end, direction);
       return;
     }
-    Native_HTMLInputElement__setSelectionRange_2_Callback(mthis, start, end);
+    $_setSelectionRange_2_Callback(mthis, start, end);
     return;
   }
 
-Native_HTMLInputElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLInputElement_setSelectionRange_Callback_RESOLVER_STRING_3_long_long_DOMString";
+  static $_setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLInputElement_setSelectionRange_Callback_RESOLVER_STRING_3_long_long_DOMString";
 
-Native_HTMLInputElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLInputElement_setSelectionRange_Callback_RESOLVER_STRING_2_long_long";
+  static $_setSelectionRange_2_Callback(mthis, start, end) native "HTMLInputElement_setSelectionRange_Callback_RESOLVER_STRING_2_long_long";
 
   // Generated overload resolver
-Native_HTMLInputElement_stepDown(mthis, n) {
+  static $stepDown(mthis, n) {
     if (n != null) {
-      Native_HTMLInputElement__stepDown_1_Callback(mthis, n);
+      $_stepDown_1_Callback(mthis, n);
       return;
     }
-    Native_HTMLInputElement__stepDown_2_Callback(mthis);
+    $_stepDown_2_Callback(mthis);
     return;
   }
 
-Native_HTMLInputElement__stepDown_1_Callback(mthis, n) native "HTMLInputElement_stepDown_Callback_RESOLVER_STRING_1_long";
+  static $_stepDown_1_Callback(mthis, n) native "HTMLInputElement_stepDown_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLInputElement__stepDown_2_Callback(mthis) native "HTMLInputElement_stepDown_Callback_RESOLVER_STRING_0_";
+  static $_stepDown_2_Callback(mthis) native "HTMLInputElement_stepDown_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_HTMLInputElement_stepUp(mthis, n) {
+  static $stepUp(mthis, n) {
     if (n != null) {
-      Native_HTMLInputElement__stepUp_1_Callback(mthis, n);
+      $_stepUp_1_Callback(mthis, n);
       return;
     }
-    Native_HTMLInputElement__stepUp_2_Callback(mthis);
+    $_stepUp_2_Callback(mthis);
     return;
   }
 
-Native_HTMLInputElement__stepUp_1_Callback(mthis, n) native "HTMLInputElement_stepUp_Callback_RESOLVER_STRING_1_long";
+  static $_stepUp_1_Callback(mthis, n) native "HTMLInputElement_stepUp_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLInputElement__stepUp_2_Callback(mthis) native "HTMLInputElement_stepUp_Callback_RESOLVER_STRING_0_";
+  static $_stepUp_2_Callback(mthis) native "HTMLInputElement_stepUp_Callback_RESOLVER_STRING_0_";
+}
 
-Native_HTMLKeygenElement_autofocus_Getter(mthis) native "HTMLKeygenElement_autofocus_Getter";
+class BlinkHTMLKeygenElement {
+  static $autofocus_Getter(mthis) native "HTMLKeygenElement_autofocus_Getter";
 
-Native_HTMLKeygenElement_autofocus_Setter(mthis, value) native "HTMLKeygenElement_autofocus_Setter";
+  static $autofocus_Setter(mthis, value) native "HTMLKeygenElement_autofocus_Setter";
 
-Native_HTMLKeygenElement_challenge_Getter(mthis) native "HTMLKeygenElement_challenge_Getter";
+  static $challenge_Getter(mthis) native "HTMLKeygenElement_challenge_Getter";
 
-Native_HTMLKeygenElement_challenge_Setter(mthis, value) native "HTMLKeygenElement_challenge_Setter";
+  static $challenge_Setter(mthis, value) native "HTMLKeygenElement_challenge_Setter";
 
-Native_HTMLKeygenElement_disabled_Getter(mthis) native "HTMLKeygenElement_disabled_Getter";
+  static $disabled_Getter(mthis) native "HTMLKeygenElement_disabled_Getter";
 
-Native_HTMLKeygenElement_disabled_Setter(mthis, value) native "HTMLKeygenElement_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLKeygenElement_disabled_Setter";
 
-Native_HTMLKeygenElement_form_Getter(mthis) native "HTMLKeygenElement_form_Getter";
+  static $form_Getter(mthis) native "HTMLKeygenElement_form_Getter";
 
-Native_HTMLKeygenElement_keytype_Getter(mthis) native "HTMLKeygenElement_keytype_Getter";
+  static $keytype_Getter(mthis) native "HTMLKeygenElement_keytype_Getter";
 
-Native_HTMLKeygenElement_keytype_Setter(mthis, value) native "HTMLKeygenElement_keytype_Setter";
+  static $keytype_Setter(mthis, value) native "HTMLKeygenElement_keytype_Setter";
 
-Native_HTMLKeygenElement_labels_Getter(mthis) native "HTMLKeygenElement_labels_Getter";
+  static $labels_Getter(mthis) native "HTMLKeygenElement_labels_Getter";
 
-Native_HTMLKeygenElement_name_Getter(mthis) native "HTMLKeygenElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLKeygenElement_name_Getter";
 
-Native_HTMLKeygenElement_name_Setter(mthis, value) native "HTMLKeygenElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLKeygenElement_name_Setter";
 
-Native_HTMLKeygenElement_type_Getter(mthis) native "HTMLKeygenElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLKeygenElement_type_Getter";
 
-Native_HTMLKeygenElement_validationMessage_Getter(mthis) native "HTMLKeygenElement_validationMessage_Getter";
+  static $validationMessage_Getter(mthis) native "HTMLKeygenElement_validationMessage_Getter";
 
-Native_HTMLKeygenElement_validity_Getter(mthis) native "HTMLKeygenElement_validity_Getter";
+  static $validity_Getter(mthis) native "HTMLKeygenElement_validity_Getter";
 
-Native_HTMLKeygenElement_willValidate_Getter(mthis) native "HTMLKeygenElement_willValidate_Getter";
+  static $willValidate_Getter(mthis) native "HTMLKeygenElement_willValidate_Getter";
 
-Native_HTMLKeygenElement_checkValidity_Callback(mthis) native "HTMLKeygenElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $checkValidity_Callback(mthis) native "HTMLKeygenElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLKeygenElement_setCustomValidity_Callback(mthis, error) native "HTMLKeygenElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLKeygenElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLLIElement_value_Getter(mthis) native "HTMLLIElement_value_Getter";
+class BlinkHTMLLIElement {
+  static $value_Getter(mthis) native "HTMLLIElement_value_Getter";
 
-Native_HTMLLIElement_value_Setter(mthis, value) native "HTMLLIElement_value_Setter";
+  static $value_Setter(mthis, value) native "HTMLLIElement_value_Setter";
+}
 
-Native_HTMLLabelElement_control_Getter(mthis) native "HTMLLabelElement_control_Getter";
+class BlinkHTMLLabelElement {
+  static $control_Getter(mthis) native "HTMLLabelElement_control_Getter";
 
-Native_HTMLLabelElement_form_Getter(mthis) native "HTMLLabelElement_form_Getter";
+  static $form_Getter(mthis) native "HTMLLabelElement_form_Getter";
 
-Native_HTMLLabelElement_htmlFor_Getter(mthis) native "HTMLLabelElement_htmlFor_Getter";
+  static $htmlFor_Getter(mthis) native "HTMLLabelElement_htmlFor_Getter";
 
-Native_HTMLLabelElement_htmlFor_Setter(mthis, value) native "HTMLLabelElement_htmlFor_Setter";
+  static $htmlFor_Setter(mthis, value) native "HTMLLabelElement_htmlFor_Setter";
+}
 
-Native_HTMLLegendElement_form_Getter(mthis) native "HTMLLegendElement_form_Getter";
+class BlinkHTMLLegendElement {
+  static $form_Getter(mthis) native "HTMLLegendElement_form_Getter";
+}
 
-Native_HTMLLinkElement_crossOrigin_Getter(mthis) native "HTMLLinkElement_crossOrigin_Getter";
+class BlinkHTMLLinkElement {
+  static $crossOrigin_Getter(mthis) native "HTMLLinkElement_crossOrigin_Getter";
 
-Native_HTMLLinkElement_crossOrigin_Setter(mthis, value) native "HTMLLinkElement_crossOrigin_Setter";
+  static $crossOrigin_Setter(mthis, value) native "HTMLLinkElement_crossOrigin_Setter";
 
-Native_HTMLLinkElement_disabled_Getter(mthis) native "HTMLLinkElement_disabled_Getter";
+  static $disabled_Getter(mthis) native "HTMLLinkElement_disabled_Getter";
 
-Native_HTMLLinkElement_disabled_Setter(mthis, value) native "HTMLLinkElement_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLLinkElement_disabled_Setter";
 
-Native_HTMLLinkElement_href_Getter(mthis) native "HTMLLinkElement_href_Getter";
+  static $href_Getter(mthis) native "HTMLLinkElement_href_Getter";
 
-Native_HTMLLinkElement_href_Setter(mthis, value) native "HTMLLinkElement_href_Setter";
+  static $href_Setter(mthis, value) native "HTMLLinkElement_href_Setter";
 
-Native_HTMLLinkElement_hreflang_Getter(mthis) native "HTMLLinkElement_hreflang_Getter";
+  static $hreflang_Getter(mthis) native "HTMLLinkElement_hreflang_Getter";
 
-Native_HTMLLinkElement_hreflang_Setter(mthis, value) native "HTMLLinkElement_hreflang_Setter";
+  static $hreflang_Setter(mthis, value) native "HTMLLinkElement_hreflang_Setter";
 
-Native_HTMLLinkElement_import_Getter(mthis) native "HTMLLinkElement_import_Getter";
+  static $import_Getter(mthis) native "HTMLLinkElement_import_Getter";
 
-Native_HTMLLinkElement_media_Getter(mthis) native "HTMLLinkElement_media_Getter";
+  static $media_Getter(mthis) native "HTMLLinkElement_media_Getter";
 
-Native_HTMLLinkElement_media_Setter(mthis, value) native "HTMLLinkElement_media_Setter";
+  static $media_Setter(mthis, value) native "HTMLLinkElement_media_Setter";
 
-Native_HTMLLinkElement_rel_Getter(mthis) native "HTMLLinkElement_rel_Getter";
+  static $rel_Getter(mthis) native "HTMLLinkElement_rel_Getter";
 
-Native_HTMLLinkElement_rel_Setter(mthis, value) native "HTMLLinkElement_rel_Setter";
+  static $rel_Setter(mthis, value) native "HTMLLinkElement_rel_Setter";
 
-Native_HTMLLinkElement_sheet_Getter(mthis) native "HTMLLinkElement_sheet_Getter";
+  static $sheet_Getter(mthis) native "HTMLLinkElement_sheet_Getter";
 
-Native_HTMLLinkElement_sizes_Getter(mthis) native "HTMLLinkElement_sizes_Getter";
+  static $sizes_Getter(mthis) native "HTMLLinkElement_sizes_Getter";
 
-Native_HTMLLinkElement_type_Getter(mthis) native "HTMLLinkElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLLinkElement_type_Getter";
 
-Native_HTMLLinkElement_type_Setter(mthis, value) native "HTMLLinkElement_type_Setter";
+  static $type_Setter(mthis, value) native "HTMLLinkElement_type_Setter";
+}
 
-Native_HTMLMapElement_areas_Getter(mthis) native "HTMLMapElement_areas_Getter";
+class BlinkHTMLMapElement {
+  static $areas_Getter(mthis) native "HTMLMapElement_areas_Getter";
 
-Native_HTMLMapElement_name_Getter(mthis) native "HTMLMapElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLMapElement_name_Getter";
 
-Native_HTMLMapElement_name_Setter(mthis, value) native "HTMLMapElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLMapElement_name_Setter";
+}
 
-Native_HTMLMetaElement_content_Getter(mthis) native "HTMLMetaElement_content_Getter";
+class BlinkHTMLMarqueeElement {}
 
-Native_HTMLMetaElement_content_Setter(mthis, value) native "HTMLMetaElement_content_Setter";
+class BlinkHTMLMenuElement {}
+
+class BlinkHTMLMetaElement {
+  static $content_Getter(mthis) native "HTMLMetaElement_content_Getter";
+
+  static $content_Setter(mthis, value) native "HTMLMetaElement_content_Setter";
 
-Native_HTMLMetaElement_httpEquiv_Getter(mthis) native "HTMLMetaElement_httpEquiv_Getter";
+  static $httpEquiv_Getter(mthis) native "HTMLMetaElement_httpEquiv_Getter";
 
-Native_HTMLMetaElement_httpEquiv_Setter(mthis, value) native "HTMLMetaElement_httpEquiv_Setter";
+  static $httpEquiv_Setter(mthis, value) native "HTMLMetaElement_httpEquiv_Setter";
 
-Native_HTMLMetaElement_name_Getter(mthis) native "HTMLMetaElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLMetaElement_name_Getter";
 
-Native_HTMLMetaElement_name_Setter(mthis, value) native "HTMLMetaElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLMetaElement_name_Setter";
+}
 
-Native_HTMLMeterElement_high_Getter(mthis) native "HTMLMeterElement_high_Getter";
+class BlinkHTMLMeterElement {
+  static $high_Getter(mthis) native "HTMLMeterElement_high_Getter";
 
-Native_HTMLMeterElement_high_Setter(mthis, value) native "HTMLMeterElement_high_Setter";
+  static $high_Setter(mthis, value) native "HTMLMeterElement_high_Setter";
 
-Native_HTMLMeterElement_labels_Getter(mthis) native "HTMLMeterElement_labels_Getter";
+  static $labels_Getter(mthis) native "HTMLMeterElement_labels_Getter";
 
-Native_HTMLMeterElement_low_Getter(mthis) native "HTMLMeterElement_low_Getter";
+  static $low_Getter(mthis) native "HTMLMeterElement_low_Getter";
 
-Native_HTMLMeterElement_low_Setter(mthis, value) native "HTMLMeterElement_low_Setter";
+  static $low_Setter(mthis, value) native "HTMLMeterElement_low_Setter";
 
-Native_HTMLMeterElement_max_Getter(mthis) native "HTMLMeterElement_max_Getter";
+  static $max_Getter(mthis) native "HTMLMeterElement_max_Getter";
 
-Native_HTMLMeterElement_max_Setter(mthis, value) native "HTMLMeterElement_max_Setter";
+  static $max_Setter(mthis, value) native "HTMLMeterElement_max_Setter";
 
-Native_HTMLMeterElement_min_Getter(mthis) native "HTMLMeterElement_min_Getter";
+  static $min_Getter(mthis) native "HTMLMeterElement_min_Getter";
 
-Native_HTMLMeterElement_min_Setter(mthis, value) native "HTMLMeterElement_min_Setter";
+  static $min_Setter(mthis, value) native "HTMLMeterElement_min_Setter";
 
-Native_HTMLMeterElement_optimum_Getter(mthis) native "HTMLMeterElement_optimum_Getter";
+  static $optimum_Getter(mthis) native "HTMLMeterElement_optimum_Getter";
 
-Native_HTMLMeterElement_optimum_Setter(mthis, value) native "HTMLMeterElement_optimum_Setter";
+  static $optimum_Setter(mthis, value) native "HTMLMeterElement_optimum_Setter";
 
-Native_HTMLMeterElement_value_Getter(mthis) native "HTMLMeterElement_value_Getter";
+  static $value_Getter(mthis) native "HTMLMeterElement_value_Getter";
 
-Native_HTMLMeterElement_value_Setter(mthis, value) native "HTMLMeterElement_value_Setter";
+  static $value_Setter(mthis, value) native "HTMLMeterElement_value_Setter";
+}
 
-Native_HTMLModElement_cite_Getter(mthis) native "HTMLModElement_cite_Getter";
+class BlinkHTMLModElement {
+  static $cite_Getter(mthis) native "HTMLModElement_cite_Getter";
 
-Native_HTMLModElement_cite_Setter(mthis, value) native "HTMLModElement_cite_Setter";
+  static $cite_Setter(mthis, value) native "HTMLModElement_cite_Setter";
 
-Native_HTMLModElement_dateTime_Getter(mthis) native "HTMLModElement_dateTime_Getter";
+  static $dateTime_Getter(mthis) native "HTMLModElement_dateTime_Getter";
 
-Native_HTMLModElement_dateTime_Setter(mthis, value) native "HTMLModElement_dateTime_Setter";
+  static $dateTime_Setter(mthis, value) native "HTMLModElement_dateTime_Setter";
+}
 
-Native_HTMLOListElement_reversed_Getter(mthis) native "HTMLOListElement_reversed_Getter";
+class BlinkHTMLOListElement {
+  static $reversed_Getter(mthis) native "HTMLOListElement_reversed_Getter";
 
-Native_HTMLOListElement_reversed_Setter(mthis, value) native "HTMLOListElement_reversed_Setter";
+  static $reversed_Setter(mthis, value) native "HTMLOListElement_reversed_Setter";
 
-Native_HTMLOListElement_start_Getter(mthis) native "HTMLOListElement_start_Getter";
+  static $start_Getter(mthis) native "HTMLOListElement_start_Getter";
 
-Native_HTMLOListElement_start_Setter(mthis, value) native "HTMLOListElement_start_Setter";
+  static $start_Setter(mthis, value) native "HTMLOListElement_start_Setter";
 
-Native_HTMLOListElement_type_Getter(mthis) native "HTMLOListElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLOListElement_type_Getter";
 
-Native_HTMLOListElement_type_Setter(mthis, value) native "HTMLOListElement_type_Setter";
+  static $type_Setter(mthis, value) native "HTMLOListElement_type_Setter";
+}
 
-Native_HTMLObjectElement_data_Getter(mthis) native "HTMLObjectElement_data_Getter";
+class BlinkHTMLObjectElement {
+  static $data_Getter(mthis) native "HTMLObjectElement_data_Getter";
 
-Native_HTMLObjectElement_data_Setter(mthis, value) native "HTMLObjectElement_data_Setter";
+  static $data_Setter(mthis, value) native "HTMLObjectElement_data_Setter";
 
-Native_HTMLObjectElement_form_Getter(mthis) native "HTMLObjectElement_form_Getter";
+  static $form_Getter(mthis) native "HTMLObjectElement_form_Getter";
 
-Native_HTMLObjectElement_height_Getter(mthis) native "HTMLObjectElement_height_Getter";
+  static $height_Getter(mthis) native "HTMLObjectElement_height_Getter";
 
-Native_HTMLObjectElement_height_Setter(mthis, value) native "HTMLObjectElement_height_Setter";
+  static $height_Setter(mthis, value) native "HTMLObjectElement_height_Setter";
 
-Native_HTMLObjectElement_name_Getter(mthis) native "HTMLObjectElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLObjectElement_name_Getter";
 
-Native_HTMLObjectElement_name_Setter(mthis, value) native "HTMLObjectElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLObjectElement_name_Setter";
 
-Native_HTMLObjectElement_type_Getter(mthis) native "HTMLObjectElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLObjectElement_type_Getter";
 
-Native_HTMLObjectElement_type_Setter(mthis, value) native "HTMLObjectElement_type_Setter";
+  static $type_Setter(mthis, value) native "HTMLObjectElement_type_Setter";
 
-Native_HTMLObjectElement_useMap_Getter(mthis) native "HTMLObjectElement_useMap_Getter";
+  static $useMap_Getter(mthis) native "HTMLObjectElement_useMap_Getter";
 
-Native_HTMLObjectElement_useMap_Setter(mthis, value) native "HTMLObjectElement_useMap_Setter";
+  static $useMap_Setter(mthis, value) native "HTMLObjectElement_useMap_Setter";
 
-Native_HTMLObjectElement_validationMessage_Getter(mthis) native "HTMLObjectElement_validationMessage_Getter";
+  static $validationMessage_Getter(mthis) native "HTMLObjectElement_validationMessage_Getter";
 
-Native_HTMLObjectElement_validity_Getter(mthis) native "HTMLObjectElement_validity_Getter";
+  static $validity_Getter(mthis) native "HTMLObjectElement_validity_Getter";
 
-Native_HTMLObjectElement_width_Getter(mthis) native "HTMLObjectElement_width_Getter";
+  static $width_Getter(mthis) native "HTMLObjectElement_width_Getter";
 
-Native_HTMLObjectElement_width_Setter(mthis, value) native "HTMLObjectElement_width_Setter";
+  static $width_Setter(mthis, value) native "HTMLObjectElement_width_Setter";
 
-Native_HTMLObjectElement_willValidate_Getter(mthis) native "HTMLObjectElement_willValidate_Getter";
+  static $willValidate_Getter(mthis) native "HTMLObjectElement_willValidate_Getter";
 
-Native_HTMLObjectElement___getter___Callback(mthis, index_OR_name) native "HTMLObjectElement___getter___Callback";
+  static $__getter___Callback(mthis, index_OR_name) native "HTMLObjectElement___getter___Callback";
 
-Native_HTMLObjectElement___setter___Callback(mthis, index_OR_name, value) native "HTMLObjectElement___setter___Callback";
+  static $__setter___Callback(mthis, index_OR_name, value) native "HTMLObjectElement___setter___Callback";
 
-Native_HTMLObjectElement_checkValidity_Callback(mthis) native "HTMLObjectElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $checkValidity_Callback(mthis) native "HTMLObjectElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLObjectElement_setCustomValidity_Callback(mthis, error) native "HTMLObjectElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLObjectElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLOptGroupElement_disabled_Getter(mthis) native "HTMLOptGroupElement_disabled_Getter";
+class BlinkHTMLOptGroupElement {
+  static $disabled_Getter(mthis) native "HTMLOptGroupElement_disabled_Getter";
 
-Native_HTMLOptGroupElement_disabled_Setter(mthis, value) native "HTMLOptGroupElement_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLOptGroupElement_disabled_Setter";
 
-Native_HTMLOptGroupElement_label_Getter(mthis) native "HTMLOptGroupElement_label_Getter";
+  static $label_Getter(mthis) native "HTMLOptGroupElement_label_Getter";
 
-Native_HTMLOptGroupElement_label_Setter(mthis, value) native "HTMLOptGroupElement_label_Setter";
+  static $label_Setter(mthis, value) native "HTMLOptGroupElement_label_Setter";
+}
 
+class BlinkHTMLOptionElement {
   // Generated overload resolver
-Native_HTMLOptionElement_OptionElement__(data, value, defaultSelected, selected) {
-    return Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected);
+  static $mkOptionElement__(data, value, defaultSelected, selected) {
+    return $_create_1constructorCallback(data, value, defaultSelected, selected);
   }
 
-Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected) native "HTMLOptionElement_constructorCallback_RESOLVER_STRING_4_DOMString_DOMString_boolean_boolean";
+  static $_create_1constructorCallback(data, value, defaultSelected, selected) native "HTMLOptionElement_constructorCallback_RESOLVER_STRING_4_DOMString_DOMString_boolean_boolean";
 
-Native_HTMLOptionElement_defaultSelected_Getter(mthis) native "HTMLOptionElement_defaultSelected_Getter";
+  static $defaultSelected_Getter(mthis) native "HTMLOptionElement_defaultSelected_Getter";
 
-Native_HTMLOptionElement_defaultSelected_Setter(mthis, value) native "HTMLOptionElement_defaultSelected_Setter";
+  static $defaultSelected_Setter(mthis, value) native "HTMLOptionElement_defaultSelected_Setter";
 
-Native_HTMLOptionElement_disabled_Getter(mthis) native "HTMLOptionElement_disabled_Getter";
+  static $disabled_Getter(mthis) native "HTMLOptionElement_disabled_Getter";
 
-Native_HTMLOptionElement_disabled_Setter(mthis, value) native "HTMLOptionElement_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLOptionElement_disabled_Setter";
 
-Native_HTMLOptionElement_form_Getter(mthis) native "HTMLOptionElement_form_Getter";
+  static $form_Getter(mthis) native "HTMLOptionElement_form_Getter";
 
-Native_HTMLOptionElement_index_Getter(mthis) native "HTMLOptionElement_index_Getter";
+  static $index_Getter(mthis) native "HTMLOptionElement_index_Getter";
 
-Native_HTMLOptionElement_label_Getter(mthis) native "HTMLOptionElement_label_Getter";
+  static $label_Getter(mthis) native "HTMLOptionElement_label_Getter";
 
-Native_HTMLOptionElement_label_Setter(mthis, value) native "HTMLOptionElement_label_Setter";
+  static $label_Setter(mthis, value) native "HTMLOptionElement_label_Setter";
 
-Native_HTMLOptionElement_selected_Getter(mthis) native "HTMLOptionElement_selected_Getter";
+  static $selected_Getter(mthis) native "HTMLOptionElement_selected_Getter";
 
-Native_HTMLOptionElement_selected_Setter(mthis, value) native "HTMLOptionElement_selected_Setter";
+  static $selected_Setter(mthis, value) native "HTMLOptionElement_selected_Setter";
 
-Native_HTMLOptionElement_value_Getter(mthis) native "HTMLOptionElement_value_Getter";
+  static $value_Getter(mthis) native "HTMLOptionElement_value_Getter";
 
-Native_HTMLOptionElement_value_Setter(mthis, value) native "HTMLOptionElement_value_Setter";
+  static $value_Setter(mthis, value) native "HTMLOptionElement_value_Setter";
+}
 
-Native_HTMLOutputElement_defaultValue_Getter(mthis) native "HTMLOutputElement_defaultValue_Getter";
+class BlinkHTMLOptionsCollection {}
 
-Native_HTMLOutputElement_defaultValue_Setter(mthis, value) native "HTMLOutputElement_defaultValue_Setter";
+class BlinkHTMLOutputElement {
+  static $defaultValue_Getter(mthis) native "HTMLOutputElement_defaultValue_Getter";
 
-Native_HTMLOutputElement_form_Getter(mthis) native "HTMLOutputElement_form_Getter";
+  static $defaultValue_Setter(mthis, value) native "HTMLOutputElement_defaultValue_Setter";
 
-Native_HTMLOutputElement_htmlFor_Getter(mthis) native "HTMLOutputElement_htmlFor_Getter";
+  static $form_Getter(mthis) native "HTMLOutputElement_form_Getter";
 
-Native_HTMLOutputElement_labels_Getter(mthis) native "HTMLOutputElement_labels_Getter";
+  static $htmlFor_Getter(mthis) native "HTMLOutputElement_htmlFor_Getter";
 
-Native_HTMLOutputElement_name_Getter(mthis) native "HTMLOutputElement_name_Getter";
+  static $labels_Getter(mthis) native "HTMLOutputElement_labels_Getter";
 
-Native_HTMLOutputElement_name_Setter(mthis, value) native "HTMLOutputElement_name_Setter";
+  static $name_Getter(mthis) native "HTMLOutputElement_name_Getter";
 
-Native_HTMLOutputElement_type_Getter(mthis) native "HTMLOutputElement_type_Getter";
+  static $name_Setter(mthis, value) native "HTMLOutputElement_name_Setter";
 
-Native_HTMLOutputElement_validationMessage_Getter(mthis) native "HTMLOutputElement_validationMessage_Getter";
+  static $type_Getter(mthis) native "HTMLOutputElement_type_Getter";
 
-Native_HTMLOutputElement_validity_Getter(mthis) native "HTMLOutputElement_validity_Getter";
+  static $validationMessage_Getter(mthis) native "HTMLOutputElement_validationMessage_Getter";
 
-Native_HTMLOutputElement_value_Getter(mthis) native "HTMLOutputElement_value_Getter";
+  static $validity_Getter(mthis) native "HTMLOutputElement_validity_Getter";
 
-Native_HTMLOutputElement_value_Setter(mthis, value) native "HTMLOutputElement_value_Setter";
+  static $value_Getter(mthis) native "HTMLOutputElement_value_Getter";
 
-Native_HTMLOutputElement_willValidate_Getter(mthis) native "HTMLOutputElement_willValidate_Getter";
+  static $value_Setter(mthis, value) native "HTMLOutputElement_value_Setter";
 
-Native_HTMLOutputElement_checkValidity_Callback(mthis) native "HTMLOutputElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $willValidate_Getter(mthis) native "HTMLOutputElement_willValidate_Getter";
 
-Native_HTMLOutputElement_setCustomValidity_Callback(mthis, error) native "HTMLOutputElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $checkValidity_Callback(mthis) native "HTMLOutputElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLParamElement_name_Getter(mthis) native "HTMLParamElement_name_Getter";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLOutputElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLParamElement_name_Setter(mthis, value) native "HTMLParamElement_name_Setter";
+class BlinkHTMLParagraphElement {}
 
-Native_HTMLParamElement_value_Getter(mthis) native "HTMLParamElement_value_Getter";
+class BlinkHTMLParamElement {
+  static $name_Getter(mthis) native "HTMLParamElement_name_Getter";
 
-Native_HTMLParamElement_value_Setter(mthis, value) native "HTMLParamElement_value_Setter";
+  static $name_Setter(mthis, value) native "HTMLParamElement_name_Setter";
 
-Native_HTMLProgressElement_labels_Getter(mthis) native "HTMLProgressElement_labels_Getter";
+  static $value_Getter(mthis) native "HTMLParamElement_value_Getter";
 
-Native_HTMLProgressElement_max_Getter(mthis) native "HTMLProgressElement_max_Getter";
+  static $value_Setter(mthis, value) native "HTMLParamElement_value_Setter";
+}
 
-Native_HTMLProgressElement_max_Setter(mthis, value) native "HTMLProgressElement_max_Setter";
+class BlinkHTMLPreElement {}
 
-Native_HTMLProgressElement_position_Getter(mthis) native "HTMLProgressElement_position_Getter";
+class BlinkHTMLProgressElement {
+  static $labels_Getter(mthis) native "HTMLProgressElement_labels_Getter";
 
-Native_HTMLProgressElement_value_Getter(mthis) native "HTMLProgressElement_value_Getter";
+  static $max_Getter(mthis) native "HTMLProgressElement_max_Getter";
 
-Native_HTMLProgressElement_value_Setter(mthis, value) native "HTMLProgressElement_value_Setter";
+  static $max_Setter(mthis, value) native "HTMLProgressElement_max_Setter";
 
-Native_HTMLQuoteElement_cite_Getter(mthis) native "HTMLQuoteElement_cite_Getter";
+  static $position_Getter(mthis) native "HTMLProgressElement_position_Getter";
 
-Native_HTMLQuoteElement_cite_Setter(mthis, value) native "HTMLQuoteElement_cite_Setter";
+  static $value_Getter(mthis) native "HTMLProgressElement_value_Getter";
 
-Native_HTMLScriptElement_async_Getter(mthis) native "HTMLScriptElement_async_Getter";
+  static $value_Setter(mthis, value) native "HTMLProgressElement_value_Setter";
+}
 
-Native_HTMLScriptElement_async_Setter(mthis, value) native "HTMLScriptElement_async_Setter";
+class BlinkHTMLQuoteElement {
+  static $cite_Getter(mthis) native "HTMLQuoteElement_cite_Getter";
 
-Native_HTMLScriptElement_charset_Getter(mthis) native "HTMLScriptElement_charset_Getter";
+  static $cite_Setter(mthis, value) native "HTMLQuoteElement_cite_Setter";
+}
 
-Native_HTMLScriptElement_charset_Setter(mthis, value) native "HTMLScriptElement_charset_Setter";
+class BlinkHTMLScriptElement {
+  static $async_Getter(mthis) native "HTMLScriptElement_async_Getter";
 
-Native_HTMLScriptElement_crossOrigin_Getter(mthis) native "HTMLScriptElement_crossOrigin_Getter";
+  static $async_Setter(mthis, value) native "HTMLScriptElement_async_Setter";
 
-Native_HTMLScriptElement_crossOrigin_Setter(mthis, value) native "HTMLScriptElement_crossOrigin_Setter";
+  static $charset_Getter(mthis) native "HTMLScriptElement_charset_Getter";
 
-Native_HTMLScriptElement_defer_Getter(mthis) native "HTMLScriptElement_defer_Getter";
+  static $charset_Setter(mthis, value) native "HTMLScriptElement_charset_Setter";
 
-Native_HTMLScriptElement_defer_Setter(mthis, value) native "HTMLScriptElement_defer_Setter";
+  static $crossOrigin_Getter(mthis) native "HTMLScriptElement_crossOrigin_Getter";
 
-Native_HTMLScriptElement_nonce_Getter(mthis) native "HTMLScriptElement_nonce_Getter";
+  static $crossOrigin_Setter(mthis, value) native "HTMLScriptElement_crossOrigin_Setter";
 
-Native_HTMLScriptElement_nonce_Setter(mthis, value) native "HTMLScriptElement_nonce_Setter";
+  static $defer_Getter(mthis) native "HTMLScriptElement_defer_Getter";
 
-Native_HTMLScriptElement_src_Getter(mthis) native "HTMLScriptElement_src_Getter";
+  static $defer_Setter(mthis, value) native "HTMLScriptElement_defer_Setter";
 
-Native_HTMLScriptElement_src_Setter(mthis, value) native "HTMLScriptElement_src_Setter";
+  static $nonce_Getter(mthis) native "HTMLScriptElement_nonce_Getter";
 
-Native_HTMLScriptElement_type_Getter(mthis) native "HTMLScriptElement_type_Getter";
+  static $nonce_Setter(mthis, value) native "HTMLScriptElement_nonce_Setter";
 
-Native_HTMLScriptElement_type_Setter(mthis, value) native "HTMLScriptElement_type_Setter";
+  static $src_Getter(mthis) native "HTMLScriptElement_src_Getter";
 
-Native_HTMLSelectElement_autofocus_Getter(mthis) native "HTMLSelectElement_autofocus_Getter";
+  static $src_Setter(mthis, value) native "HTMLScriptElement_src_Setter";
 
-Native_HTMLSelectElement_autofocus_Setter(mthis, value) native "HTMLSelectElement_autofocus_Setter";
+  static $type_Getter(mthis) native "HTMLScriptElement_type_Getter";
 
-Native_HTMLSelectElement_disabled_Getter(mthis) native "HTMLSelectElement_disabled_Getter";
+  static $type_Setter(mthis, value) native "HTMLScriptElement_type_Setter";
+}
 
-Native_HTMLSelectElement_disabled_Setter(mthis, value) native "HTMLSelectElement_disabled_Setter";
+class BlinkHTMLSelectElement {
+  static $autofocus_Getter(mthis) native "HTMLSelectElement_autofocus_Getter";
 
-Native_HTMLSelectElement_form_Getter(mthis) native "HTMLSelectElement_form_Getter";
+  static $autofocus_Setter(mthis, value) native "HTMLSelectElement_autofocus_Setter";
 
-Native_HTMLSelectElement_labels_Getter(mthis) native "HTMLSelectElement_labels_Getter";
+  static $disabled_Getter(mthis) native "HTMLSelectElement_disabled_Getter";
 
-Native_HTMLSelectElement_length_Getter(mthis) native "HTMLSelectElement_length_Getter";
+  static $disabled_Setter(mthis, value) native "HTMLSelectElement_disabled_Setter";
 
-Native_HTMLSelectElement_length_Setter(mthis, value) native "HTMLSelectElement_length_Setter";
+  static $form_Getter(mthis) native "HTMLSelectElement_form_Getter";
 
-Native_HTMLSelectElement_multiple_Getter(mthis) native "HTMLSelectElement_multiple_Getter";
+  static $labels_Getter(mthis) native "HTMLSelectElement_labels_Getter";
 
-Native_HTMLSelectElement_multiple_Setter(mthis, value) native "HTMLSelectElement_multiple_Setter";
+  static $length_Getter(mthis) native "HTMLSelectElement_length_Getter";
 
-Native_HTMLSelectElement_name_Getter(mthis) native "HTMLSelectElement_name_Getter";
+  static $length_Setter(mthis, value) native "HTMLSelectElement_length_Setter";
 
-Native_HTMLSelectElement_name_Setter(mthis, value) native "HTMLSelectElement_name_Setter";
+  static $multiple_Getter(mthis) native "HTMLSelectElement_multiple_Getter";
 
-Native_HTMLSelectElement_required_Getter(mthis) native "HTMLSelectElement_required_Getter";
+  static $multiple_Setter(mthis, value) native "HTMLSelectElement_multiple_Setter";
 
-Native_HTMLSelectElement_required_Setter(mthis, value) native "HTMLSelectElement_required_Setter";
+  static $name_Getter(mthis) native "HTMLSelectElement_name_Getter";
 
-Native_HTMLSelectElement_selectedIndex_Getter(mthis) native "HTMLSelectElement_selectedIndex_Getter";
+  static $name_Setter(mthis, value) native "HTMLSelectElement_name_Setter";
 
-Native_HTMLSelectElement_selectedIndex_Setter(mthis, value) native "HTMLSelectElement_selectedIndex_Setter";
+  static $required_Getter(mthis) native "HTMLSelectElement_required_Getter";
 
-Native_HTMLSelectElement_size_Getter(mthis) native "HTMLSelectElement_size_Getter";
+  static $required_Setter(mthis, value) native "HTMLSelectElement_required_Setter";
 
-Native_HTMLSelectElement_size_Setter(mthis, value) native "HTMLSelectElement_size_Setter";
+  static $selectedIndex_Getter(mthis) native "HTMLSelectElement_selectedIndex_Getter";
 
-Native_HTMLSelectElement_type_Getter(mthis) native "HTMLSelectElement_type_Getter";
+  static $selectedIndex_Setter(mthis, value) native "HTMLSelectElement_selectedIndex_Setter";
 
-Native_HTMLSelectElement_validationMessage_Getter(mthis) native "HTMLSelectElement_validationMessage_Getter";
+  static $size_Getter(mthis) native "HTMLSelectElement_size_Getter";
 
-Native_HTMLSelectElement_validity_Getter(mthis) native "HTMLSelectElement_validity_Getter";
+  static $size_Setter(mthis, value) native "HTMLSelectElement_size_Setter";
 
-Native_HTMLSelectElement_value_Getter(mthis) native "HTMLSelectElement_value_Getter";
+  static $type_Getter(mthis) native "HTMLSelectElement_type_Getter";
 
-Native_HTMLSelectElement_value_Setter(mthis, value) native "HTMLSelectElement_value_Setter";
+  static $validationMessage_Getter(mthis) native "HTMLSelectElement_validationMessage_Getter";
 
-Native_HTMLSelectElement_willValidate_Getter(mthis) native "HTMLSelectElement_willValidate_Getter";
+  static $validity_Getter(mthis) native "HTMLSelectElement_validity_Getter";
 
-Native_HTMLSelectElement___setter___Callback(mthis, index, value) native "HTMLSelectElement___setter___Callback_RESOLVER_STRING_2_unsigned long_HTMLOptionElement";
+  static $value_Getter(mthis) native "HTMLSelectElement_value_Getter";
 
-Native_HTMLSelectElement_checkValidity_Callback(mthis) native "HTMLSelectElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $value_Setter(mthis, value) native "HTMLSelectElement_value_Setter";
 
-Native_HTMLSelectElement_item_Callback(mthis, index) native "HTMLSelectElement_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $willValidate_Getter(mthis) native "HTMLSelectElement_willValidate_Getter";
 
-Native_HTMLSelectElement_namedItem_Callback(mthis, name) native "HTMLSelectElement_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $__setter___Callback(mthis, index, value) native "HTMLSelectElement___setter___Callback_RESOLVER_STRING_2_unsigned long_HTMLOptionElement";
 
-Native_HTMLSelectElement_setCustomValidity_Callback(mthis, error) native "HTMLSelectElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $checkValidity_Callback(mthis) native "HTMLSelectElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLShadowElement_resetStyleInheritance_Getter(mthis) native "HTMLShadowElement_resetStyleInheritance_Getter";
+  static $item_Callback(mthis, index) native "HTMLSelectElement_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_HTMLShadowElement_resetStyleInheritance_Setter(mthis, value) native "HTMLShadowElement_resetStyleInheritance_Setter";
+  static $namedItem_Callback(mthis, name) native "HTMLSelectElement_namedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLShadowElement_getDistributedNodes_Callback(mthis) native "HTMLShadowElement_getDistributedNodes_Callback_RESOLVER_STRING_0_";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLSelectElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLSourceElement_media_Getter(mthis) native "HTMLSourceElement_media_Getter";
+class BlinkHTMLShadowElement {
+  static $resetStyleInheritance_Getter(mthis) native "HTMLShadowElement_resetStyleInheritance_Getter";
 
-Native_HTMLSourceElement_media_Setter(mthis, value) native "HTMLSourceElement_media_Setter";
+  static $resetStyleInheritance_Setter(mthis, value) native "HTMLShadowElement_resetStyleInheritance_Setter";
+
+  static $getDistributedNodes_Callback(mthis) native "HTMLShadowElement_getDistributedNodes_Callback_RESOLVER_STRING_0_";
+}
+
+class BlinkHTMLSourceElement {
+  static $media_Getter(mthis) native "HTMLSourceElement_media_Getter";
+
+  static $media_Setter(mthis, value) native "HTMLSourceElement_media_Setter";
+
+  static $src_Getter(mthis) native "HTMLSourceElement_src_Getter";
+
+  static $src_Setter(mthis, value) native "HTMLSourceElement_src_Setter";
 
-Native_HTMLSourceElement_src_Getter(mthis) native "HTMLSourceElement_src_Getter";
+  static $type_Getter(mthis) native "HTMLSourceElement_type_Getter";
 
-Native_HTMLSourceElement_src_Setter(mthis, value) native "HTMLSourceElement_src_Setter";
+  static $type_Setter(mthis, value) native "HTMLSourceElement_type_Setter";
+}
 
-Native_HTMLSourceElement_type_Getter(mthis) native "HTMLSourceElement_type_Getter";
+class BlinkHTMLSpanElement {}
 
-Native_HTMLSourceElement_type_Setter(mthis, value) native "HTMLSourceElement_type_Setter";
+class BlinkHTMLStyleElement {
+  static $disabled_Getter(mthis) native "HTMLStyleElement_disabled_Getter";
 
-Native_HTMLStyleElement_disabled_Getter(mthis) native "HTMLStyleElement_disabled_Getter";
+  static $disabled_Setter(mthis, value) native "HTMLStyleElement_disabled_Setter";
 
-Native_HTMLStyleElement_disabled_Setter(mthis, value) native "HTMLStyleElement_disabled_Setter";
+  static $media_Getter(mthis) native "HTMLStyleElement_media_Getter";
 
-Native_HTMLStyleElement_media_Getter(mthis) native "HTMLStyleElement_media_Getter";
+  static $media_Setter(mthis, value) native "HTMLStyleElement_media_Setter";
 
-Native_HTMLStyleElement_media_Setter(mthis, value) native "HTMLStyleElement_media_Setter";
+  static $scoped_Getter(mthis) native "HTMLStyleElement_scoped_Getter";
 
-Native_HTMLStyleElement_scoped_Getter(mthis) native "HTMLStyleElement_scoped_Getter";
+  static $scoped_Setter(mthis, value) native "HTMLStyleElement_scoped_Setter";
 
-Native_HTMLStyleElement_scoped_Setter(mthis, value) native "HTMLStyleElement_scoped_Setter";
+  static $sheet_Getter(mthis) native "HTMLStyleElement_sheet_Getter";
 
-Native_HTMLStyleElement_sheet_Getter(mthis) native "HTMLStyleElement_sheet_Getter";
+  static $type_Getter(mthis) native "HTMLStyleElement_type_Getter";
 
-Native_HTMLStyleElement_type_Getter(mthis) native "HTMLStyleElement_type_Getter";
+  static $type_Setter(mthis, value) native "HTMLStyleElement_type_Setter";
+}
 
-Native_HTMLStyleElement_type_Setter(mthis, value) native "HTMLStyleElement_type_Setter";
+class BlinkHTMLTableCaptionElement {}
 
-Native_HTMLTableCellElement_cellIndex_Getter(mthis) native "HTMLTableCellElement_cellIndex_Getter";
+class BlinkHTMLTableCellElement {
+  static $cellIndex_Getter(mthis) native "HTMLTableCellElement_cellIndex_Getter";
 
-Native_HTMLTableCellElement_colSpan_Getter(mthis) native "HTMLTableCellElement_colSpan_Getter";
+  static $colSpan_Getter(mthis) native "HTMLTableCellElement_colSpan_Getter";
 
-Native_HTMLTableCellElement_colSpan_Setter(mthis, value) native "HTMLTableCellElement_colSpan_Setter";
+  static $colSpan_Setter(mthis, value) native "HTMLTableCellElement_colSpan_Setter";
 
-Native_HTMLTableCellElement_headers_Getter(mthis) native "HTMLTableCellElement_headers_Getter";
+  static $headers_Getter(mthis) native "HTMLTableCellElement_headers_Getter";
 
-Native_HTMLTableCellElement_headers_Setter(mthis, value) native "HTMLTableCellElement_headers_Setter";
+  static $headers_Setter(mthis, value) native "HTMLTableCellElement_headers_Setter";
 
-Native_HTMLTableCellElement_rowSpan_Getter(mthis) native "HTMLTableCellElement_rowSpan_Getter";
+  static $rowSpan_Getter(mthis) native "HTMLTableCellElement_rowSpan_Getter";
 
-Native_HTMLTableCellElement_rowSpan_Setter(mthis, value) native "HTMLTableCellElement_rowSpan_Setter";
+  static $rowSpan_Setter(mthis, value) native "HTMLTableCellElement_rowSpan_Setter";
+}
 
-Native_HTMLTableColElement_span_Getter(mthis) native "HTMLTableColElement_span_Getter";
+class BlinkHTMLTableColElement {
+  static $span_Getter(mthis) native "HTMLTableColElement_span_Getter";
 
-Native_HTMLTableColElement_span_Setter(mthis, value) native "HTMLTableColElement_span_Setter";
+  static $span_Setter(mthis, value) native "HTMLTableColElement_span_Setter";
+}
 
-Native_HTMLTableElement_caption_Getter(mthis) native "HTMLTableElement_caption_Getter";
+class BlinkHTMLTableElement {
+  static $caption_Getter(mthis) native "HTMLTableElement_caption_Getter";
 
-Native_HTMLTableElement_caption_Setter(mthis, value) native "HTMLTableElement_caption_Setter";
+  static $caption_Setter(mthis, value) native "HTMLTableElement_caption_Setter";
 
-Native_HTMLTableElement_rows_Getter(mthis) native "HTMLTableElement_rows_Getter";
+  static $rows_Getter(mthis) native "HTMLTableElement_rows_Getter";
 
-Native_HTMLTableElement_tBodies_Getter(mthis) native "HTMLTableElement_tBodies_Getter";
+  static $tBodies_Getter(mthis) native "HTMLTableElement_tBodies_Getter";
 
-Native_HTMLTableElement_tFoot_Getter(mthis) native "HTMLTableElement_tFoot_Getter";
+  static $tFoot_Getter(mthis) native "HTMLTableElement_tFoot_Getter";
 
-Native_HTMLTableElement_tFoot_Setter(mthis, value) native "HTMLTableElement_tFoot_Setter";
+  static $tFoot_Setter(mthis, value) native "HTMLTableElement_tFoot_Setter";
 
-Native_HTMLTableElement_tHead_Getter(mthis) native "HTMLTableElement_tHead_Getter";
+  static $tHead_Getter(mthis) native "HTMLTableElement_tHead_Getter";
 
-Native_HTMLTableElement_tHead_Setter(mthis, value) native "HTMLTableElement_tHead_Setter";
+  static $tHead_Setter(mthis, value) native "HTMLTableElement_tHead_Setter";
 
-Native_HTMLTableElement_createCaption_Callback(mthis) native "HTMLTableElement_createCaption_Callback_RESOLVER_STRING_0_";
+  static $createCaption_Callback(mthis) native "HTMLTableElement_createCaption_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_createTBody_Callback(mthis) native "HTMLTableElement_createTBody_Callback_RESOLVER_STRING_0_";
+  static $createTBody_Callback(mthis) native "HTMLTableElement_createTBody_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_createTFoot_Callback(mthis) native "HTMLTableElement_createTFoot_Callback_RESOLVER_STRING_0_";
+  static $createTFoot_Callback(mthis) native "HTMLTableElement_createTFoot_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_createTHead_Callback(mthis) native "HTMLTableElement_createTHead_Callback_RESOLVER_STRING_0_";
+  static $createTHead_Callback(mthis) native "HTMLTableElement_createTHead_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_deleteCaption_Callback(mthis) native "HTMLTableElement_deleteCaption_Callback_RESOLVER_STRING_0_";
+  static $deleteCaption_Callback(mthis) native "HTMLTableElement_deleteCaption_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_deleteRow_Callback(mthis, index) native "HTMLTableElement_deleteRow_Callback_RESOLVER_STRING_1_long";
+  static $deleteRow_Callback(mthis, index) native "HTMLTableElement_deleteRow_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLTableElement_deleteTFoot_Callback(mthis) native "HTMLTableElement_deleteTFoot_Callback_RESOLVER_STRING_0_";
+  static $deleteTFoot_Callback(mthis) native "HTMLTableElement_deleteTFoot_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_deleteTHead_Callback(mthis) native "HTMLTableElement_deleteTHead_Callback_RESOLVER_STRING_0_";
+  static $deleteTHead_Callback(mthis) native "HTMLTableElement_deleteTHead_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_insertRow_Callback(mthis, index) native "HTMLTableElement_insertRow_Callback_RESOLVER_STRING_1_long";
+  static $insertRow_Callback(mthis, index) native "HTMLTableElement_insertRow_Callback_RESOLVER_STRING_1_long";
+}
 
-Native_HTMLTableRowElement_cells_Getter(mthis) native "HTMLTableRowElement_cells_Getter";
+class BlinkHTMLTableRowElement {
+  static $cells_Getter(mthis) native "HTMLTableRowElement_cells_Getter";
 
-Native_HTMLTableRowElement_rowIndex_Getter(mthis) native "HTMLTableRowElement_rowIndex_Getter";
+  static $rowIndex_Getter(mthis) native "HTMLTableRowElement_rowIndex_Getter";
 
-Native_HTMLTableRowElement_sectionRowIndex_Getter(mthis) native "HTMLTableRowElement_sectionRowIndex_Getter";
+  static $sectionRowIndex_Getter(mthis) native "HTMLTableRowElement_sectionRowIndex_Getter";
 
-Native_HTMLTableRowElement_deleteCell_Callback(mthis, index) native "HTMLTableRowElement_deleteCell_Callback_RESOLVER_STRING_1_long";
+  static $deleteCell_Callback(mthis, index) native "HTMLTableRowElement_deleteCell_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLTableRowElement_insertCell_Callback(mthis, index) native "HTMLTableRowElement_insertCell_Callback_RESOLVER_STRING_1_long";
+  static $insertCell_Callback(mthis, index) native "HTMLTableRowElement_insertCell_Callback_RESOLVER_STRING_1_long";
+}
 
-Native_HTMLTableSectionElement_rows_Getter(mthis) native "HTMLTableSectionElement_rows_Getter";
+class BlinkHTMLTableSectionElement {
+  static $rows_Getter(mthis) native "HTMLTableSectionElement_rows_Getter";
 
-Native_HTMLTableSectionElement_deleteRow_Callback(mthis, index) native "HTMLTableSectionElement_deleteRow_Callback_RESOLVER_STRING_1_long";
+  static $deleteRow_Callback(mthis, index) native "HTMLTableSectionElement_deleteRow_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLTableSectionElement_insertRow_Callback(mthis, index) native "HTMLTableSectionElement_insertRow_Callback_RESOLVER_STRING_1_long";
+  static $insertRow_Callback(mthis, index) native "HTMLTableSectionElement_insertRow_Callback_RESOLVER_STRING_1_long";
+}
 
-Native_HTMLTemplateElement_content_Getter(mthis) native "HTMLTemplateElement_content_Getter";
+class BlinkHTMLTemplateElement {
+  static $content_Getter(mthis) native "HTMLTemplateElement_content_Getter";
+}
 
-Native_HTMLTextAreaElement_autofocus_Getter(mthis) native "HTMLTextAreaElement_autofocus_Getter";
+class BlinkHTMLTextAreaElement {
+  static $autofocus_Getter(mthis) native "HTMLTextAreaElement_autofocus_Getter";
 
-Native_HTMLTextAreaElement_autofocus_Setter(mthis, value) native "HTMLTextAreaElement_autofocus_Setter";
+  static $autofocus_Setter(mthis, value) native "HTMLTextAreaElement_autofocus_Setter";
 
-Native_HTMLTextAreaElement_cols_Getter(mthis) native "HTMLTextAreaElement_cols_Getter";
+  static $cols_Getter(mthis) native "HTMLTextAreaElement_cols_Getter";
 
-Native_HTMLTextAreaElement_cols_Setter(mthis, value) native "HTMLTextAreaElement_cols_Setter";
+  static $cols_Setter(mthis, value) native "HTMLTextAreaElement_cols_Setter";
 
-Native_HTMLTextAreaElement_defaultValue_Getter(mthis) native "HTMLTextAreaElement_defaultValue_Getter";
+  static $defaultValue_Getter(mthis) native "HTMLTextAreaElement_defaultValue_Getter";
 
-Native_HTMLTextAreaElement_defaultValue_Setter(mthis, value) native "HTMLTextAreaElement_defaultValue_Setter";
+  static $defaultValue_Setter(mthis, value) native "HTMLTextAreaElement_defaultValue_Setter";
 
-Native_HTMLTextAreaElement_dirName_Getter(mthis) native "HTMLTextAreaElement_dirName_Getter";
+  static $dirName_Getter(mthis) native "HTMLTextAreaElement_dirName_Getter";
 
-Native_HTMLTextAreaElement_dirName_Setter(mthis, value) native "HTMLTextAreaElement_dirName_Setter";
+  static $dirName_Setter(mthis, value) native "HTMLTextAreaElement_dirName_Setter";
 
-Native_HTMLTextAreaElement_disabled_Getter(mthis) native "HTMLTextAreaElement_disabled_Getter";
+  static $disabled_Getter(mthis) native "HTMLTextAreaElement_disabled_Getter";
 
-Native_HTMLTextAreaElement_disabled_Setter(mthis, value) native "HTMLTextAreaElement_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLTextAreaElement_disabled_Setter";
 
-Native_HTMLTextAreaElement_form_Getter(mthis) native "HTMLTextAreaElement_form_Getter";
+  static $form_Getter(mthis) native "HTMLTextAreaElement_form_Getter";
 
-Native_HTMLTextAreaElement_inputMode_Getter(mthis) native "HTMLTextAreaElement_inputMode_Getter";
+  static $inputMode_Getter(mthis) native "HTMLTextAreaElement_inputMode_Getter";
 
-Native_HTMLTextAreaElement_inputMode_Setter(mthis, value) native "HTMLTextAreaElement_inputMode_Setter";
+  static $inputMode_Setter(mthis, value) native "HTMLTextAreaElement_inputMode_Setter";
 
-Native_HTMLTextAreaElement_labels_Getter(mthis) native "HTMLTextAreaElement_labels_Getter";
+  static $labels_Getter(mthis) native "HTMLTextAreaElement_labels_Getter";
 
-Native_HTMLTextAreaElement_maxLength_Getter(mthis) native "HTMLTextAreaElement_maxLength_Getter";
+  static $maxLength_Getter(mthis) native "HTMLTextAreaElement_maxLength_Getter";
 
-Native_HTMLTextAreaElement_maxLength_Setter(mthis, value) native "HTMLTextAreaElement_maxLength_Setter";
+  static $maxLength_Setter(mthis, value) native "HTMLTextAreaElement_maxLength_Setter";
 
-Native_HTMLTextAreaElement_name_Getter(mthis) native "HTMLTextAreaElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLTextAreaElement_name_Getter";
 
-Native_HTMLTextAreaElement_name_Setter(mthis, value) native "HTMLTextAreaElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLTextAreaElement_name_Setter";
 
-Native_HTMLTextAreaElement_placeholder_Getter(mthis) native "HTMLTextAreaElement_placeholder_Getter";
+  static $placeholder_Getter(mthis) native "HTMLTextAreaElement_placeholder_Getter";
 
-Native_HTMLTextAreaElement_placeholder_Setter(mthis, value) native "HTMLTextAreaElement_placeholder_Setter";
+  static $placeholder_Setter(mthis, value) native "HTMLTextAreaElement_placeholder_Setter";
 
-Native_HTMLTextAreaElement_readOnly_Getter(mthis) native "HTMLTextAreaElement_readOnly_Getter";
+  static $readOnly_Getter(mthis) native "HTMLTextAreaElement_readOnly_Getter";
 
-Native_HTMLTextAreaElement_readOnly_Setter(mthis, value) native "HTMLTextAreaElement_readOnly_Setter";
+  static $readOnly_Setter(mthis, value) native "HTMLTextAreaElement_readOnly_Setter";
 
-Native_HTMLTextAreaElement_required_Getter(mthis) native "HTMLTextAreaElement_required_Getter";
+  static $required_Getter(mthis) native "HTMLTextAreaElement_required_Getter";
 
-Native_HTMLTextAreaElement_required_Setter(mthis, value) native "HTMLTextAreaElement_required_Setter";
+  static $required_Setter(mthis, value) native "HTMLTextAreaElement_required_Setter";
 
-Native_HTMLTextAreaElement_rows_Getter(mthis) native "HTMLTextAreaElement_rows_Getter";
+  static $rows_Getter(mthis) native "HTMLTextAreaElement_rows_Getter";
 
-Native_HTMLTextAreaElement_rows_Setter(mthis, value) native "HTMLTextAreaElement_rows_Setter";
+  static $rows_Setter(mthis, value) native "HTMLTextAreaElement_rows_Setter";
 
-Native_HTMLTextAreaElement_selectionDirection_Getter(mthis) native "HTMLTextAreaElement_selectionDirection_Getter";
+  static $selectionDirection_Getter(mthis) native "HTMLTextAreaElement_selectionDirection_Getter";
 
-Native_HTMLTextAreaElement_selectionDirection_Setter(mthis, value) native "HTMLTextAreaElement_selectionDirection_Setter";
+  static $selectionDirection_Setter(mthis, value) native "HTMLTextAreaElement_selectionDirection_Setter";
 
-Native_HTMLTextAreaElement_selectionEnd_Getter(mthis) native "HTMLTextAreaElement_selectionEnd_Getter";
+  static $selectionEnd_Getter(mthis) native "HTMLTextAreaElement_selectionEnd_Getter";
 
-Native_HTMLTextAreaElement_selectionEnd_Setter(mthis, value) native "HTMLTextAreaElement_selectionEnd_Setter";
+  static $selectionEnd_Setter(mthis, value) native "HTMLTextAreaElement_selectionEnd_Setter";
 
-Native_HTMLTextAreaElement_selectionStart_Getter(mthis) native "HTMLTextAreaElement_selectionStart_Getter";
+  static $selectionStart_Getter(mthis) native "HTMLTextAreaElement_selectionStart_Getter";
 
-Native_HTMLTextAreaElement_selectionStart_Setter(mthis, value) native "HTMLTextAreaElement_selectionStart_Setter";
+  static $selectionStart_Setter(mthis, value) native "HTMLTextAreaElement_selectionStart_Setter";
 
-Native_HTMLTextAreaElement_textLength_Getter(mthis) native "HTMLTextAreaElement_textLength_Getter";
+  static $textLength_Getter(mthis) native "HTMLTextAreaElement_textLength_Getter";
 
-Native_HTMLTextAreaElement_type_Getter(mthis) native "HTMLTextAreaElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLTextAreaElement_type_Getter";
 
-Native_HTMLTextAreaElement_validationMessage_Getter(mthis) native "HTMLTextAreaElement_validationMessage_Getter";
+  static $validationMessage_Getter(mthis) native "HTMLTextAreaElement_validationMessage_Getter";
 
-Native_HTMLTextAreaElement_validity_Getter(mthis) native "HTMLTextAreaElement_validity_Getter";
+  static $validity_Getter(mthis) native "HTMLTextAreaElement_validity_Getter";
 
-Native_HTMLTextAreaElement_value_Getter(mthis) native "HTMLTextAreaElement_value_Getter";
+  static $value_Getter(mthis) native "HTMLTextAreaElement_value_Getter";
 
-Native_HTMLTextAreaElement_value_Setter(mthis, value) native "HTMLTextAreaElement_value_Setter";
+  static $value_Setter(mthis, value) native "HTMLTextAreaElement_value_Setter";
 
-Native_HTMLTextAreaElement_willValidate_Getter(mthis) native "HTMLTextAreaElement_willValidate_Getter";
+  static $willValidate_Getter(mthis) native "HTMLTextAreaElement_willValidate_Getter";
 
-Native_HTMLTextAreaElement_wrap_Getter(mthis) native "HTMLTextAreaElement_wrap_Getter";
+  static $wrap_Getter(mthis) native "HTMLTextAreaElement_wrap_Getter";
 
-Native_HTMLTextAreaElement_wrap_Setter(mthis, value) native "HTMLTextAreaElement_wrap_Setter";
+  static $wrap_Setter(mthis, value) native "HTMLTextAreaElement_wrap_Setter";
 
-Native_HTMLTextAreaElement_checkValidity_Callback(mthis) native "HTMLTextAreaElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $checkValidity_Callback(mthis) native "HTMLTextAreaElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTextAreaElement_select_Callback(mthis) native "HTMLTextAreaElement_select_Callback_RESOLVER_STRING_0_";
+  static $select_Callback(mthis) native "HTMLTextAreaElement_select_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTextAreaElement_setCustomValidity_Callback(mthis, error) native "HTMLTextAreaElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLTextAreaElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_HTMLTextAreaElement_setRangeText(mthis, replacement, start, end, selectionMode) {
+  static $setRangeText(mthis, replacement, start, end, selectionMode) {
     if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
-      Native_HTMLTextAreaElement__setRangeText_1_Callback(mthis, replacement);
+      $_setRangeText_1_Callback(mthis, replacement);
       return;
     }
     if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
-      Native_HTMLTextAreaElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode);
+      $_setRangeText_2_Callback(mthis, replacement, start, end, selectionMode);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_HTMLTextAreaElement__setRangeText_1_Callback(mthis, replacement) native "HTMLTextAreaElement_setRangeText_Callback_RESOLVER_STRING_1_DOMString";
+  static $_setRangeText_1_Callback(mthis, replacement) native "HTMLTextAreaElement_setRangeText_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLTextAreaElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLTextAreaElement_setRangeText_Callback_RESOLVER_STRING_4_DOMString_unsigned long_unsigned long_DOMString";
+  static $_setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLTextAreaElement_setRangeText_Callback_RESOLVER_STRING_4_DOMString_unsigned long_unsigned long_DOMString";
 
   // Generated overload resolver
-Native_HTMLTextAreaElement_setSelectionRange(mthis, start, end, direction) {
+  static $setSelectionRange(mthis, start, end, direction) {
     if (direction != null) {
-      Native_HTMLTextAreaElement__setSelectionRange_1_Callback(mthis, start, end, direction);
+      $_setSelectionRange_1_Callback(mthis, start, end, direction);
       return;
     }
-    Native_HTMLTextAreaElement__setSelectionRange_2_Callback(mthis, start, end);
+    $_setSelectionRange_2_Callback(mthis, start, end);
     return;
   }
 
-Native_HTMLTextAreaElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLTextAreaElement_setSelectionRange_Callback_RESOLVER_STRING_3_long_long_DOMString";
+  static $_setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLTextAreaElement_setSelectionRange_Callback_RESOLVER_STRING_3_long_long_DOMString";
 
-Native_HTMLTextAreaElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLTextAreaElement_setSelectionRange_Callback_RESOLVER_STRING_2_long_long";
+  static $_setSelectionRange_2_Callback(mthis, start, end) native "HTMLTextAreaElement_setSelectionRange_Callback_RESOLVER_STRING_2_long_long";
+}
 
-Native_HTMLTrackElement_default_Getter(mthis) native "HTMLTrackElement_default_Getter";
+class BlinkHTMLTitleElement {}
 
-Native_HTMLTrackElement_default_Setter(mthis, value) native "HTMLTrackElement_default_Setter";
+class BlinkHTMLTrackElement {
+  static $default_Getter(mthis) native "HTMLTrackElement_default_Getter";
 
-Native_HTMLTrackElement_kind_Getter(mthis) native "HTMLTrackElement_kind_Getter";
+  static $default_Setter(mthis, value) native "HTMLTrackElement_default_Setter";
 
-Native_HTMLTrackElement_kind_Setter(mthis, value) native "HTMLTrackElement_kind_Setter";
+  static $kind_Getter(mthis) native "HTMLTrackElement_kind_Getter";
 
-Native_HTMLTrackElement_label_Getter(mthis) native "HTMLTrackElement_label_Getter";
+  static $kind_Setter(mthis, value) native "HTMLTrackElement_kind_Setter";
 
-Native_HTMLTrackElement_label_Setter(mthis, value) native "HTMLTrackElement_label_Setter";
+  static $label_Getter(mthis) native "HTMLTrackElement_label_Getter";
 
-Native_HTMLTrackElement_readyState_Getter(mthis) native "HTMLTrackElement_readyState_Getter";
+  static $label_Setter(mthis, value) native "HTMLTrackElement_label_Setter";
 
-Native_HTMLTrackElement_src_Getter(mthis) native "HTMLTrackElement_src_Getter";
+  static $readyState_Getter(mthis) native "HTMLTrackElement_readyState_Getter";
 
-Native_HTMLTrackElement_src_Setter(mthis, value) native "HTMLTrackElement_src_Setter";
+  static $src_Getter(mthis) native "HTMLTrackElement_src_Getter";
 
-Native_HTMLTrackElement_srclang_Getter(mthis) native "HTMLTrackElement_srclang_Getter";
+  static $src_Setter(mthis, value) native "HTMLTrackElement_src_Setter";
 
-Native_HTMLTrackElement_srclang_Setter(mthis, value) native "HTMLTrackElement_srclang_Setter";
+  static $srclang_Getter(mthis) native "HTMLTrackElement_srclang_Getter";
 
-Native_HTMLTrackElement_track_Getter(mthis) native "HTMLTrackElement_track_Getter";
+  static $srclang_Setter(mthis, value) native "HTMLTrackElement_srclang_Setter";
 
-Native_HTMLVideoElement_height_Getter(mthis) native "HTMLVideoElement_height_Getter";
+  static $track_Getter(mthis) native "HTMLTrackElement_track_Getter";
+}
 
-Native_HTMLVideoElement_height_Setter(mthis, value) native "HTMLVideoElement_height_Setter";
+class BlinkHTMLUListElement {}
 
-Native_HTMLVideoElement_poster_Getter(mthis) native "HTMLVideoElement_poster_Getter";
+class BlinkHTMLUnknownElement {}
 
-Native_HTMLVideoElement_poster_Setter(mthis, value) native "HTMLVideoElement_poster_Setter";
+class BlinkHTMLVideoElement {
+  static $height_Getter(mthis) native "HTMLVideoElement_height_Getter";
 
-Native_HTMLVideoElement_videoHeight_Getter(mthis) native "HTMLVideoElement_videoHeight_Getter";
+  static $height_Setter(mthis, value) native "HTMLVideoElement_height_Setter";
 
-Native_HTMLVideoElement_videoWidth_Getter(mthis) native "HTMLVideoElement_videoWidth_Getter";
+  static $poster_Getter(mthis) native "HTMLVideoElement_poster_Getter";
 
-Native_HTMLVideoElement_webkitDecodedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDecodedFrameCount_Getter";
+  static $poster_Setter(mthis, value) native "HTMLVideoElement_poster_Setter";
 
-Native_HTMLVideoElement_webkitDroppedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDroppedFrameCount_Getter";
+  static $videoHeight_Getter(mthis) native "HTMLVideoElement_videoHeight_Getter";
 
-Native_HTMLVideoElement_width_Getter(mthis) native "HTMLVideoElement_width_Getter";
+  static $videoWidth_Getter(mthis) native "HTMLVideoElement_videoWidth_Getter";
 
-Native_HTMLVideoElement_width_Setter(mthis, value) native "HTMLVideoElement_width_Setter";
+  static $webkitDecodedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDecodedFrameCount_Getter";
 
-Native_HTMLVideoElement_getVideoPlaybackQuality_Callback(mthis) native "HTMLVideoElement_getVideoPlaybackQuality_Callback_RESOLVER_STRING_0_";
+  static $webkitDroppedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDroppedFrameCount_Getter";
 
-Native_HTMLVideoElement_webkitEnterFullscreen_Callback(mthis) native "HTMLVideoElement_webkitEnterFullscreen_Callback_RESOLVER_STRING_0_";
+  static $width_Getter(mthis) native "HTMLVideoElement_width_Getter";
 
-Native_HTMLVideoElement_webkitExitFullscreen_Callback(mthis) native "HTMLVideoElement_webkitExitFullscreen_Callback_RESOLVER_STRING_0_";
+  static $width_Setter(mthis, value) native "HTMLVideoElement_width_Setter";
 
-Native_HashChangeEvent_newURL_Getter(mthis) native "HashChangeEvent_newURL_Getter";
+  static $getVideoPlaybackQuality_Callback(mthis) native "HTMLVideoElement_getVideoPlaybackQuality_Callback_RESOLVER_STRING_0_";
 
-Native_HashChangeEvent_oldURL_Getter(mthis) native "HashChangeEvent_oldURL_Getter";
+  static $webkitEnterFullscreen_Callback(mthis) native "HTMLVideoElement_webkitEnterFullscreen_Callback_RESOLVER_STRING_0_";
 
-Native_HashChangeEvent_initHashChangeEvent_Callback(mthis, type, canBubble, cancelable, oldURL, newURL) native "HashChangeEvent_initHashChangeEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_DOMString_DOMString";
+  static $webkitExitFullscreen_Callback(mthis) native "HTMLVideoElement_webkitExitFullscreen_Callback_RESOLVER_STRING_0_";
+}
 
-Native_History_length_Getter(mthis) native "History_length_Getter";
+class BlinkHashChangeEvent {
+  static $newURL_Getter(mthis) native "HashChangeEvent_newURL_Getter";
 
-Native_History_state_Getter(mthis) native "History_state_Getter";
+  static $oldURL_Getter(mthis) native "HashChangeEvent_oldURL_Getter";
 
-Native_History_back_Callback(mthis) native "History_back_Callback_RESOLVER_STRING_0_";
+  static $initHashChangeEvent_Callback(mthis, type, canBubble, cancelable, oldURL, newURL) native "HashChangeEvent_initHashChangeEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_DOMString_DOMString";
+}
 
-Native_History_forward_Callback(mthis) native "History_forward_Callback_RESOLVER_STRING_0_";
+class BlinkHistory {
+  static $length_Getter(mthis) native "History_length_Getter";
 
-Native_History_go_Callback(mthis, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
+  static $state_Getter(mthis) native "History_state_Getter";
 
-Native_History_pushState_Callback(mthis, data, title, url) native "History_pushState_Callback";
+  static $back_Callback(mthis) native "History_back_Callback_RESOLVER_STRING_0_";
 
-Native_History_replaceState_Callback(mthis, data, title, url) native "History_replaceState_Callback";
+  static $forward_Callback(mthis) native "History_forward_Callback_RESOLVER_STRING_0_";
 
-Native_IDBCursor_direction_Getter(mthis) native "IDBCursor_direction_Getter";
+  static $go_Callback(mthis, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
 
-Native_IDBCursor_key_Getter(mthis) native "IDBCursor_key_Getter";
+  static $pushState_Callback(mthis, data, title, url) native "History_pushState_Callback";
 
-Native_IDBCursor_primaryKey_Getter(mthis) native "IDBCursor_primaryKey_Getter";
+  static $replaceState_Callback(mthis, data, title, url) native "History_replaceState_Callback";
+}
 
-Native_IDBCursor_source_Getter(mthis) native "IDBCursor_source_Getter";
+class BlinkIDBCursor {
+  static $direction_Getter(mthis) native "IDBCursor_direction_Getter";
 
-Native_IDBCursor_advance_Callback(mthis, count) native "IDBCursor_advance_Callback_RESOLVER_STRING_1_unsigned long";
+  static $key_Getter(mthis) native "IDBCursor_key_Getter";
 
-Native_IDBCursor_continuePrimaryKey_Callback(mthis, key, primaryKey) native "IDBCursor_continuePrimaryKey_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
+  static $primaryKey_Getter(mthis) native "IDBCursor_primaryKey_Getter";
 
-Native_IDBCursor_delete_Callback(mthis) native "IDBCursor_delete_Callback_RESOLVER_STRING_0_";
+  static $source_Getter(mthis) native "IDBCursor_source_Getter";
 
-Native_IDBCursor_next_Callback(mthis, key) native "IDBCursor_continue_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $advance_Callback(mthis, count) native "IDBCursor_advance_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_IDBCursor_update_Callback(mthis, value) native "IDBCursor_update_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $continuePrimaryKey_Callback(mthis, key, primaryKey) native "IDBCursor_continuePrimaryKey_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
 
-Native_IDBCursorWithValue_value_Getter(mthis) native "IDBCursorWithValue_value_Getter";
+  static $delete_Callback(mthis) native "IDBCursor_delete_Callback_RESOLVER_STRING_0_";
 
-Native_IDBDatabase_name_Getter(mthis) native "IDBDatabase_name_Getter";
+  static $next_Callback(mthis, key) native "IDBCursor_continue_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBDatabase_objectStoreNames_Getter(mthis) native "IDBDatabase_objectStoreNames_Getter";
+  static $update_Callback(mthis, value) native "IDBCursor_update_Callback_RESOLVER_STRING_1_ScriptValue";
+}
 
-Native_IDBDatabase_version_Getter(mthis) native "IDBDatabase_version_Getter";
+class BlinkIDBCursorWithValue {
+  static $value_Getter(mthis) native "IDBCursorWithValue_value_Getter";
+}
 
-Native_IDBDatabase_close_Callback(mthis) native "IDBDatabase_close_Callback_RESOLVER_STRING_0_";
+class BlinkIDBDatabase {
+  static $name_Getter(mthis) native "IDBDatabase_name_Getter";
 
-Native_IDBDatabase_createObjectStore_Callback(mthis, name, options) native "IDBDatabase_createObjectStore_Callback_RESOLVER_STRING_2_DOMString_Dictionary";
+  static $objectStoreNames_Getter(mthis) native "IDBDatabase_objectStoreNames_Getter";
 
-Native_IDBDatabase_deleteObjectStore_Callback(mthis, name) native "IDBDatabase_deleteObjectStore_Callback_RESOLVER_STRING_1_DOMString";
+  static $version_Getter(mthis) native "IDBDatabase_version_Getter";
+
+  static $close_Callback(mthis) native "IDBDatabase_close_Callback_RESOLVER_STRING_0_";
+
+  static $createObjectStore_Callback(mthis, name, options) native "IDBDatabase_createObjectStore_Callback_RESOLVER_STRING_2_DOMString_Dictionary";
+
+  static $deleteObjectStore_Callback(mthis, name) native "IDBDatabase_deleteObjectStore_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_IDBDatabase_transaction(mthis, storeName_OR_storeNames, mode) {
+  static $transaction(mthis, storeName_OR_storeNames, mode) {
     if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
-      return Native_IDBDatabase__transaction_1_Callback(mthis, storeName_OR_storeNames, mode);
+      return $_transaction_1_Callback(mthis, storeName_OR_storeNames, mode);
     }
     if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
-      return Native_IDBDatabase__transaction_2_Callback(mthis, storeName_OR_storeNames, mode);
+      return $_transaction_2_Callback(mthis, storeName_OR_storeNames, mode);
     }
     if ((mode is String || mode == null) && (storeName_OR_storeNames is String || storeName_OR_storeNames == null)) {
-      return Native_IDBDatabase__transaction_3_Callback(mthis, storeName_OR_storeNames, mode);
+      return $_transaction_3_Callback(mthis, storeName_OR_storeNames, mode);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_IDBDatabase__transaction_1_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMStringList_DOMString";
+  static $_transaction_1_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMStringList_DOMString";
 
-Native_IDBDatabase__transaction_2_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_sequence<DOMString>_DOMString";
+  static $_transaction_2_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_sequence<DOMString>_DOMString";
 
-Native_IDBDatabase__transaction_3_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $_transaction_3_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_IDBDatabase_transactionList_Callback(mthis, storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_sequence<DOMString>_DOMString";
+  static $transactionList_Callback(mthis, storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_sequence<DOMString>_DOMString";
 
-Native_IDBDatabase_transactionStore_Callback(mthis, storeName, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $transactionStore_Callback(mthis, storeName, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_IDBDatabase_transactionStores_Callback(mthis, storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMStringList_DOMString";
+  static $transactionStores_Callback(mthis, storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMStringList_DOMString";
+}
 
-Native_IDBFactory_cmp_Callback(mthis, first, second) native "IDBFactory_cmp_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
+class BlinkIDBFactory {
+  static $cmp_Callback(mthis, first, second) native "IDBFactory_cmp_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
 
-Native_IDBFactory_deleteDatabase_Callback(mthis, name) native "IDBFactory_deleteDatabase_Callback_RESOLVER_STRING_1_DOMString";
+  static $deleteDatabase_Callback(mthis, name) native "IDBFactory_deleteDatabase_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_IDBFactory__open(mthis, name, version) {
+  static $_open(mthis, name, version) {
     if (version != null) {
-      return Native_IDBFactory__open_1_Callback(mthis, name, version);
+      return $_open_1_Callback(mthis, name, version);
     }
-    return Native_IDBFactory__open_2_Callback(mthis, name);
+    return $_open_2_Callback(mthis, name);
   }
 
-Native_IDBFactory__open_1_Callback(mthis, name, version) native "IDBFactory_open_Callback_RESOLVER_STRING_2_DOMString_unsigned long long";
+  static $_open_1_Callback(mthis, name, version) native "IDBFactory_open_Callback_RESOLVER_STRING_2_DOMString_unsigned long long";
 
-Native_IDBFactory__open_2_Callback(mthis, name) native "IDBFactory_open_Callback_RESOLVER_STRING_1_DOMString";
+  static $_open_2_Callback(mthis, name) native "IDBFactory_open_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_IDBFactory_webkitGetDatabaseNames_Callback(mthis) native "IDBFactory_webkitGetDatabaseNames_Callback_RESOLVER_STRING_0_";
+  static $webkitGetDatabaseNames_Callback(mthis) native "IDBFactory_webkitGetDatabaseNames_Callback_RESOLVER_STRING_0_";
+}
 
-Native_IDBIndex_keyPath_Getter(mthis) native "IDBIndex_keyPath_Getter";
+class BlinkIDBIndex {
+  static $keyPath_Getter(mthis) native "IDBIndex_keyPath_Getter";
 
-Native_IDBIndex_multiEntry_Getter(mthis) native "IDBIndex_multiEntry_Getter";
+  static $multiEntry_Getter(mthis) native "IDBIndex_multiEntry_Getter";
 
-Native_IDBIndex_name_Getter(mthis) native "IDBIndex_name_Getter";
+  static $name_Getter(mthis) native "IDBIndex_name_Getter";
 
-Native_IDBIndex_objectStore_Getter(mthis) native "IDBIndex_objectStore_Getter";
+  static $objectStore_Getter(mthis) native "IDBIndex_objectStore_Getter";
 
-Native_IDBIndex_unique_Getter(mthis) native "IDBIndex_unique_Getter";
+  static $unique_Getter(mthis) native "IDBIndex_unique_Getter";
 
-Native_IDBIndex_count_Callback(mthis, key) native "IDBIndex_count_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $count_Callback(mthis, key) native "IDBIndex_count_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBIndex_get_Callback(mthis, key) native "IDBIndex_get_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $get_Callback(mthis, key) native "IDBIndex_get_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBIndex_getKey_Callback(mthis, key) native "IDBIndex_getKey_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $getKey_Callback(mthis, key) native "IDBIndex_getKey_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBIndex_openCursor_Callback(mthis, key, direction) native "IDBIndex_openCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
+  static $openCursor_Callback(mthis, key, direction) native "IDBIndex_openCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
 
-Native_IDBIndex_openKeyCursor_Callback(mthis, key, direction) native "IDBIndex_openKeyCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
+  static $openKeyCursor_Callback(mthis, key, direction) native "IDBIndex_openKeyCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
+}
 
-Native_IDBKeyRange_lower_Getter(mthis) native "IDBKeyRange_lower_Getter";
+class BlinkIDBKeyRange {
+  static $lower_Getter(mthis) native "IDBKeyRange_lower_Getter";
 
-Native_IDBKeyRange_lowerOpen_Getter(mthis) native "IDBKeyRange_lowerOpen_Getter";
+  static $lowerOpen_Getter(mthis) native "IDBKeyRange_lowerOpen_Getter";
 
-Native_IDBKeyRange_upper_Getter(mthis) native "IDBKeyRange_upper_Getter";
+  static $upper_Getter(mthis) native "IDBKeyRange_upper_Getter";
 
-Native_IDBKeyRange_upperOpen_Getter(mthis) native "IDBKeyRange_upperOpen_Getter";
+  static $upperOpen_Getter(mthis) native "IDBKeyRange_upperOpen_Getter";
 
-Native_IDBKeyRange_bound__Callback(lower, upper, lowerOpen, upperOpen) native "IDBKeyRange_bound_Callback_RESOLVER_STRING_4_ScriptValue_ScriptValue_boolean_boolean";
+  static $bound__Callback(lower, upper, lowerOpen, upperOpen) native "IDBKeyRange_bound_Callback_RESOLVER_STRING_4_ScriptValue_ScriptValue_boolean_boolean";
 
-Native_IDBKeyRange_lowerBound__Callback(bound, open) native "IDBKeyRange_lowerBound_Callback_RESOLVER_STRING_2_ScriptValue_boolean";
+  static $lowerBound__Callback(bound, open) native "IDBKeyRange_lowerBound_Callback_RESOLVER_STRING_2_ScriptValue_boolean";
 
-Native_IDBKeyRange_only__Callback(value) native "IDBKeyRange_only_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $only__Callback(value) native "IDBKeyRange_only_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBKeyRange_upperBound__Callback(bound, open) native "IDBKeyRange_upperBound_Callback_RESOLVER_STRING_2_ScriptValue_boolean";
+  static $upperBound__Callback(bound, open) native "IDBKeyRange_upperBound_Callback_RESOLVER_STRING_2_ScriptValue_boolean";
+}
 
-Native_IDBObjectStore_autoIncrement_Getter(mthis) native "IDBObjectStore_autoIncrement_Getter";
+class BlinkIDBObjectStore {
+  static $autoIncrement_Getter(mthis) native "IDBObjectStore_autoIncrement_Getter";
 
-Native_IDBObjectStore_indexNames_Getter(mthis) native "IDBObjectStore_indexNames_Getter";
+  static $indexNames_Getter(mthis) native "IDBObjectStore_indexNames_Getter";
 
-Native_IDBObjectStore_keyPath_Getter(mthis) native "IDBObjectStore_keyPath_Getter";
+  static $keyPath_Getter(mthis) native "IDBObjectStore_keyPath_Getter";
 
-Native_IDBObjectStore_name_Getter(mthis) native "IDBObjectStore_name_Getter";
+  static $name_Getter(mthis) native "IDBObjectStore_name_Getter";
 
-Native_IDBObjectStore_transaction_Getter(mthis) native "IDBObjectStore_transaction_Getter";
+  static $transaction_Getter(mthis) native "IDBObjectStore_transaction_Getter";
 
-Native_IDBObjectStore_add_Callback(mthis, value, key) native "IDBObjectStore_add_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
+  static $add_Callback(mthis, value, key) native "IDBObjectStore_add_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
 
-Native_IDBObjectStore_clear_Callback(mthis) native "IDBObjectStore_clear_Callback_RESOLVER_STRING_0_";
+  static $clear_Callback(mthis) native "IDBObjectStore_clear_Callback_RESOLVER_STRING_0_";
 
-Native_IDBObjectStore_count_Callback(mthis, key) native "IDBObjectStore_count_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $count_Callback(mthis, key) native "IDBObjectStore_count_Callback_RESOLVER_STRING_1_ScriptValue";
 
   // Generated overload resolver
-Native_IDBObjectStore__createIndex(mthis, name, keyPath, options) {
+  static $_createIndex(mthis, name, keyPath, options) {
     if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
-      return Native_IDBObjectStore__createIndex_1_Callback(mthis, name, keyPath, options);
+      return $_createIndex_1_Callback(mthis, name, keyPath, options);
     }
     if ((options is Map || options == null) && (keyPath is String || keyPath == null) && (name is String || name == null)) {
-      return Native_IDBObjectStore__createIndex_2_Callback(mthis, name, keyPath, options);
+      return $_createIndex_2_Callback(mthis, name, keyPath, options);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_IDBObjectStore__createIndex_1_Callback(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_RESOLVER_STRING_3_DOMString_sequence<DOMString>_Dictionary";
+  static $_createIndex_1_Callback(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_RESOLVER_STRING_3_DOMString_sequence<DOMString>_Dictionary";
 
-Native_IDBObjectStore__createIndex_2_Callback(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_RESOLVER_STRING_3_DOMString_DOMString_Dictionary";
+  static $_createIndex_2_Callback(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_RESOLVER_STRING_3_DOMString_DOMString_Dictionary";
 
-Native_IDBObjectStore_delete_Callback(mthis, key) native "IDBObjectStore_delete_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $delete_Callback(mthis, key) native "IDBObjectStore_delete_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBObjectStore_deleteIndex_Callback(mthis, name) native "IDBObjectStore_deleteIndex_Callback_RESOLVER_STRING_1_DOMString";
+  static $deleteIndex_Callback(mthis, name) native "IDBObjectStore_deleteIndex_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_IDBObjectStore_get_Callback(mthis, key) native "IDBObjectStore_get_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $get_Callback(mthis, key) native "IDBObjectStore_get_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBObjectStore_index_Callback(mthis, name) native "IDBObjectStore_index_Callback_RESOLVER_STRING_1_DOMString";
+  static $index_Callback(mthis, name) native "IDBObjectStore_index_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_IDBObjectStore_openCursor_Callback(mthis, key, direction) native "IDBObjectStore_openCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
+  static $openCursor_Callback(mthis, key, direction) native "IDBObjectStore_openCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
 
-Native_IDBObjectStore_openKeyCursor_Callback(mthis, range, direction) native "IDBObjectStore_openKeyCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
+  static $openKeyCursor_Callback(mthis, range, direction) native "IDBObjectStore_openKeyCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
 
-Native_IDBObjectStore_put_Callback(mthis, value, key) native "IDBObjectStore_put_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
+  static $put_Callback(mthis, value, key) native "IDBObjectStore_put_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
+}
 
-Native_IDBRequest_error_Getter(mthis) native "IDBRequest_error_Getter";
+class BlinkIDBRequest {
+  static $error_Getter(mthis) native "IDBRequest_error_Getter";
 
-Native_IDBRequest_readyState_Getter(mthis) native "IDBRequest_readyState_Getter";
+  static $readyState_Getter(mthis) native "IDBRequest_readyState_Getter";
 
-Native_IDBRequest_result_Getter(mthis) native "IDBRequest_result_Getter";
+  static $result_Getter(mthis) native "IDBRequest_result_Getter";
 
-Native_IDBRequest_source_Getter(mthis) native "IDBRequest_source_Getter";
+  static $source_Getter(mthis) native "IDBRequest_source_Getter";
 
-Native_IDBRequest_transaction_Getter(mthis) native "IDBRequest_transaction_Getter";
+  static $transaction_Getter(mthis) native "IDBRequest_transaction_Getter";
+}
 
-Native_IDBTransaction_db_Getter(mthis) native "IDBTransaction_db_Getter";
+class BlinkIDBOpenDBRequest {}
 
-Native_IDBTransaction_error_Getter(mthis) native "IDBTransaction_error_Getter";
+class BlinkIDBTransaction {
+  static $db_Getter(mthis) native "IDBTransaction_db_Getter";
 
-Native_IDBTransaction_mode_Getter(mthis) native "IDBTransaction_mode_Getter";
+  static $error_Getter(mthis) native "IDBTransaction_error_Getter";
 
-Native_IDBTransaction_abort_Callback(mthis) native "IDBTransaction_abort_Callback_RESOLVER_STRING_0_";
+  static $mode_Getter(mthis) native "IDBTransaction_mode_Getter";
 
-Native_IDBTransaction_objectStore_Callback(mthis, name) native "IDBTransaction_objectStore_Callback_RESOLVER_STRING_1_DOMString";
+  static $abort_Callback(mthis) native "IDBTransaction_abort_Callback_RESOLVER_STRING_0_";
 
-Native_IDBVersionChangeEvent_dataLoss_Getter(mthis) native "IDBVersionChangeEvent_dataLoss_Getter";
+  static $objectStore_Callback(mthis, name) native "IDBTransaction_objectStore_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_IDBVersionChangeEvent_dataLossMessage_Getter(mthis) native "IDBVersionChangeEvent_dataLossMessage_Getter";
+class BlinkIDBVersionChangeEvent {
+  static $dataLoss_Getter(mthis) native "IDBVersionChangeEvent_dataLoss_Getter";
 
-Native_IDBVersionChangeEvent_newVersion_Getter(mthis) native "IDBVersionChangeEvent_newVersion_Getter";
+  static $dataLossMessage_Getter(mthis) native "IDBVersionChangeEvent_dataLossMessage_Getter";
 
-Native_IDBVersionChangeEvent_oldVersion_Getter(mthis) native "IDBVersionChangeEvent_oldVersion_Getter";
+  static $newVersion_Getter(mthis) native "IDBVersionChangeEvent_newVersion_Getter";
 
-Native_ImageBitmap_height_Getter(mthis) native "ImageBitmap_height_Getter";
+  static $oldVersion_Getter(mthis) native "IDBVersionChangeEvent_oldVersion_Getter";
+}
 
-Native_ImageBitmap_width_Getter(mthis) native "ImageBitmap_width_Getter";
+class BlinkImageBitmap {
+  static $height_Getter(mthis) native "ImageBitmap_height_Getter";
 
-Native_ImageData_data_Getter(mthis) native "ImageData_data_Getter";
+  static $width_Getter(mthis) native "ImageBitmap_width_Getter";
+}
 
-Native_ImageData_height_Getter(mthis) native "ImageData_height_Getter";
+class BlinkImageData {
+  static $data_Getter(mthis) native "ImageData_data_Getter";
 
-Native_ImageData_width_Getter(mthis) native "ImageData_width_Getter";
+  static $height_Getter(mthis) native "ImageData_height_Getter";
 
-Native_InjectedScriptHost_inspect_Callback(mthis, objectId, hints) native "InjectedScriptHost_inspect_Callback";
+  static $width_Getter(mthis) native "ImageData_width_Getter";
+}
 
-Native_InputMethodContext_compositionEndOffset_Getter(mthis) native "InputMethodContext_compositionEndOffset_Getter";
+class BlinkInjectedScriptHost {
+  static $inspect_Callback(mthis, objectId, hints) native "InjectedScriptHost_inspect_Callback";
+}
 
-Native_InputMethodContext_compositionStartOffset_Getter(mthis) native "InputMethodContext_compositionStartOffset_Getter";
+class BlinkInputMethodContext {
+  static $compositionEndOffset_Getter(mthis) native "InputMethodContext_compositionEndOffset_Getter";
 
-Native_InputMethodContext_locale_Getter(mthis) native "InputMethodContext_locale_Getter";
+  static $compositionStartOffset_Getter(mthis) native "InputMethodContext_compositionStartOffset_Getter";
 
-Native_InputMethodContext_target_Getter(mthis) native "InputMethodContext_target_Getter";
+  static $locale_Getter(mthis) native "InputMethodContext_locale_Getter";
 
-Native_InputMethodContext_confirmComposition_Callback(mthis) native "InputMethodContext_confirmComposition_Callback_RESOLVER_STRING_0_";
+  static $target_Getter(mthis) native "InputMethodContext_target_Getter";
 
-Native_InstallPhaseEvent_waitUntil_Callback(mthis, value) native "InstallPhaseEvent_waitUntil_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $confirmComposition_Callback(mthis) native "InputMethodContext_confirmComposition_Callback_RESOLVER_STRING_0_";
+}
 
-Native_InstallEvent_replace_Callback(mthis) native "InstallEvent_replace_Callback_RESOLVER_STRING_0_";
+class BlinkInstallPhaseEvent {
+  static $waitUntil_Callback(mthis, value) native "InstallPhaseEvent_waitUntil_Callback_RESOLVER_STRING_1_ScriptValue";
+}
 
-Native_Key_algorithm_Getter(mthis) native "Key_algorithm_Getter";
+class BlinkInstallEvent {
+  static $replace_Callback(mthis) native "InstallEvent_replace_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Key_extractable_Getter(mthis) native "Key_extractable_Getter";
+class BlinkKey {
+  static $algorithm_Getter(mthis) native "Key_algorithm_Getter";
 
-Native_Key_type_Getter(mthis) native "Key_type_Getter";
+  static $extractable_Getter(mthis) native "Key_extractable_Getter";
 
-Native_Key_usages_Getter(mthis) native "Key_usages_Getter";
+  static $type_Getter(mthis) native "Key_type_Getter";
 
-Native_KeyPair_privateKey_Getter(mthis) native "KeyPair_privateKey_Getter";
+  static $usages_Getter(mthis) native "Key_usages_Getter";
+}
+
+class BlinkKeyPair {
+  static $privateKey_Getter(mthis) native "KeyPair_privateKey_Getter";
+
+  static $publicKey_Getter(mthis) native "KeyPair_publicKey_Getter";
+}
 
-Native_KeyPair_publicKey_Getter(mthis) native "KeyPair_publicKey_Getter";
+class BlinkKeyboardEvent {
+  static $altGraphKey_Getter(mthis) native "KeyboardEvent_altGraphKey_Getter";
 
-Native_KeyboardEvent_altGraphKey_Getter(mthis) native "KeyboardEvent_altGraphKey_Getter";
+  static $altKey_Getter(mthis) native "KeyboardEvent_altKey_Getter";
 
-Native_KeyboardEvent_altKey_Getter(mthis) native "KeyboardEvent_altKey_Getter";
+  static $ctrlKey_Getter(mthis) native "KeyboardEvent_ctrlKey_Getter";
 
-Native_KeyboardEvent_ctrlKey_Getter(mthis) native "KeyboardEvent_ctrlKey_Getter";
+  static $keyIdentifier_Getter(mthis) native "KeyboardEvent_keyIdentifier_Getter";
 
-Native_KeyboardEvent_keyIdentifier_Getter(mthis) native "KeyboardEvent_keyIdentifier_Getter";
+  static $keyLocation_Getter(mthis) native "KeyboardEvent_keyLocation_Getter";
 
-Native_KeyboardEvent_keyLocation_Getter(mthis) native "KeyboardEvent_keyLocation_Getter";
+  static $location_Getter(mthis) native "KeyboardEvent_location_Getter";
 
-Native_KeyboardEvent_location_Getter(mthis) native "KeyboardEvent_location_Getter";
+  static $metaKey_Getter(mthis) native "KeyboardEvent_metaKey_Getter";
 
-Native_KeyboardEvent_metaKey_Getter(mthis) native "KeyboardEvent_metaKey_Getter";
+  static $repeat_Getter(mthis) native "KeyboardEvent_repeat_Getter";
 
-Native_KeyboardEvent_repeat_Getter(mthis) native "KeyboardEvent_repeat_Getter";
+  static $shiftKey_Getter(mthis) native "KeyboardEvent_shiftKey_Getter";
 
-Native_KeyboardEvent_shiftKey_Getter(mthis) native "KeyboardEvent_shiftKey_Getter";
+  static $getModifierState_Callback(mthis, keyArgument) native "KeyboardEvent_getModifierState_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_KeyboardEvent_getModifierState_Callback(mthis, keyArgument) native "KeyboardEvent_getModifierState_Callback_RESOLVER_STRING_1_DOMString";
+  static $initKeyboardEvent_Callback(mthis, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey, altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback_RESOLVER_STRING_11_DOMString_boolean_boolean_Window_DOMString_unsigned long_boolean_boolean_boolean_boolean_boolean";
+}
 
-Native_KeyboardEvent_initKeyboardEvent_Callback(mthis, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey, altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback_RESOLVER_STRING_11_DOMString_boolean_boolean_Window_DOMString_unsigned long_boolean_boolean_boolean_boolean_boolean";
+class BlinkLocation {
+  static $ancestorOrigins_Getter(mthis) native "Location_ancestorOrigins_Getter";
 
-Native_Location_ancestorOrigins_Getter(mthis) native "Location_ancestorOrigins_Getter";
+  static $hash_Getter(mthis) native "Location_hash_Getter";
 
-Native_Location_hash_Getter(mthis) native "Location_hash_Getter";
+  static $hash_Setter(mthis, value) native "Location_hash_Setter";
 
-Native_Location_hash_Setter(mthis, value) native "Location_hash_Setter";
+  static $host_Getter(mthis) native "Location_host_Getter";
 
-Native_Location_host_Getter(mthis) native "Location_host_Getter";
+  static $host_Setter(mthis, value) native "Location_host_Setter";
 
-Native_Location_host_Setter(mthis, value) native "Location_host_Setter";
+  static $hostname_Getter(mthis) native "Location_hostname_Getter";
 
-Native_Location_hostname_Getter(mthis) native "Location_hostname_Getter";
+  static $hostname_Setter(mthis, value) native "Location_hostname_Setter";
 
-Native_Location_hostname_Setter(mthis, value) native "Location_hostname_Setter";
+  static $href_Getter(mthis) native "Location_href_Getter";
 
-Native_Location_href_Getter(mthis) native "Location_href_Getter";
+  static $href_Setter(mthis, value) native "Location_href_Setter";
 
-Native_Location_href_Setter(mthis, value) native "Location_href_Setter";
+  static $origin_Getter(mthis) native "Location_origin_Getter";
 
-Native_Location_origin_Getter(mthis) native "Location_origin_Getter";
+  static $pathname_Getter(mthis) native "Location_pathname_Getter";
 
-Native_Location_pathname_Getter(mthis) native "Location_pathname_Getter";
+  static $pathname_Setter(mthis, value) native "Location_pathname_Setter";
 
-Native_Location_pathname_Setter(mthis, value) native "Location_pathname_Setter";
+  static $port_Getter(mthis) native "Location_port_Getter";
 
-Native_Location_port_Getter(mthis) native "Location_port_Getter";
+  static $port_Setter(mthis, value) native "Location_port_Setter";
 
-Native_Location_port_Setter(mthis, value) native "Location_port_Setter";
+  static $protocol_Getter(mthis) native "Location_protocol_Getter";
 
-Native_Location_protocol_Getter(mthis) native "Location_protocol_Getter";
+  static $protocol_Setter(mthis, value) native "Location_protocol_Setter";
 
-Native_Location_protocol_Setter(mthis, value) native "Location_protocol_Setter";
+  static $search_Getter(mthis) native "Location_search_Getter";
 
-Native_Location_search_Getter(mthis) native "Location_search_Getter";
+  static $search_Setter(mthis, value) native "Location_search_Setter";
 
-Native_Location_search_Setter(mthis, value) native "Location_search_Setter";
+  static $assign_Callback(mthis, url) native "Location_assign_Callback";
 
-Native_Location_assign_Callback(mthis, url) native "Location_assign_Callback";
+  static $reload_Callback(mthis) native "Location_reload_Callback";
 
-Native_Location_reload_Callback(mthis) native "Location_reload_Callback";
+  static $replace_Callback(mthis, url) native "Location_replace_Callback";
 
-Native_Location_replace_Callback(mthis, url) native "Location_replace_Callback";
+  static $toString_Callback(mthis) native "Location_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Location_toString_Callback(mthis) native "Location_toString_Callback_RESOLVER_STRING_0_";
+class BlinkMIDIAccess {
+  static $inputs_Callback(mthis) native "MIDIAccess_inputs_Callback_RESOLVER_STRING_0_";
 
-Native_MIDIAccess_inputs_Callback(mthis) native "MIDIAccess_inputs_Callback_RESOLVER_STRING_0_";
+  static $outputs_Callback(mthis) native "MIDIAccess_outputs_Callback_RESOLVER_STRING_0_";
+}
 
-Native_MIDIAccess_outputs_Callback(mthis) native "MIDIAccess_outputs_Callback_RESOLVER_STRING_0_";
+class BlinkMIDIAccessPromise {
+  static $then_Callback(mthis, successCallback, errorCallback) native "MIDIAccessPromise_then_Callback_RESOLVER_STRING_2_MIDISuccessCallback_MIDIErrorCallback";
+}
 
-Native_MIDIAccessPromise_then_Callback(mthis, successCallback, errorCallback) native "MIDIAccessPromise_then_Callback_RESOLVER_STRING_2_MIDISuccessCallback_MIDIErrorCallback";
+class BlinkMIDIConnectionEvent {
+  static $port_Getter(mthis) native "MIDIConnectionEvent_port_Getter";
+}
 
-Native_MIDIConnectionEvent_port_Getter(mthis) native "MIDIConnectionEvent_port_Getter";
+class BlinkMIDIPort {
+  static $id_Getter(mthis) native "MIDIPort_id_Getter";
 
-Native_MIDIPort_id_Getter(mthis) native "MIDIPort_id_Getter";
+  static $manufacturer_Getter(mthis) native "MIDIPort_manufacturer_Getter";
 
-Native_MIDIPort_manufacturer_Getter(mthis) native "MIDIPort_manufacturer_Getter";
+  static $name_Getter(mthis) native "MIDIPort_name_Getter";
 
-Native_MIDIPort_name_Getter(mthis) native "MIDIPort_name_Getter";
+  static $type_Getter(mthis) native "MIDIPort_type_Getter";
 
-Native_MIDIPort_type_Getter(mthis) native "MIDIPort_type_Getter";
+  static $version_Getter(mthis) native "MIDIPort_version_Getter";
+}
 
-Native_MIDIPort_version_Getter(mthis) native "MIDIPort_version_Getter";
+class BlinkMIDIInput {}
 
-Native_MIDIMessageEvent_data_Getter(mthis) native "MIDIMessageEvent_data_Getter";
+class BlinkMIDIMessageEvent {
+  static $data_Getter(mthis) native "MIDIMessageEvent_data_Getter";
 
-Native_MIDIMessageEvent_receivedTime_Getter(mthis) native "MIDIMessageEvent_receivedTime_Getter";
+  static $receivedTime_Getter(mthis) native "MIDIMessageEvent_receivedTime_Getter";
+}
 
+class BlinkMIDIOutput {
   // Generated overload resolver
-Native_MIDIOutput_send(mthis, data, timestamp) {
+  static $send(mthis, data, timestamp) {
     if (timestamp != null) {
-      Native_MIDIOutput__send_1_Callback(mthis, data, timestamp);
+      $_send_1_Callback(mthis, data, timestamp);
       return;
     }
-    Native_MIDIOutput__send_2_Callback(mthis, data);
+    $_send_2_Callback(mthis, data);
     return;
   }
 
-Native_MIDIOutput__send_1_Callback(mthis, data, timestamp) native "MIDIOutput_send_Callback_RESOLVER_STRING_2_Uint8Array_double";
+  static $_send_1_Callback(mthis, data, timestamp) native "MIDIOutput_send_Callback_RESOLVER_STRING_2_Uint8Array_double";
 
-Native_MIDIOutput__send_2_Callback(mthis, data) native "MIDIOutput_send_Callback_RESOLVER_STRING_1_Uint8Array";
+  static $_send_2_Callback(mthis, data) native "MIDIOutput_send_Callback_RESOLVER_STRING_1_Uint8Array";
+}
 
+class BlinkMediaController {
   // Generated overload resolver
-Native_MediaController_MediaController() {
-    return Native_MediaController__create_1constructorCallback();
+  static $mkMediaController() {
+    return $_create_1constructorCallback();
   }
 
-Native_MediaController__create_1constructorCallback() native "MediaController_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "MediaController_constructorCallback_RESOLVER_STRING_0_";
 
-Native_MediaController_buffered_Getter(mthis) native "MediaController_buffered_Getter";
+  static $buffered_Getter(mthis) native "MediaController_buffered_Getter";
 
-Native_MediaController_currentTime_Getter(mthis) native "MediaController_currentTime_Getter";
+  static $currentTime_Getter(mthis) native "MediaController_currentTime_Getter";
 
-Native_MediaController_currentTime_Setter(mthis, value) native "MediaController_currentTime_Setter";
+  static $currentTime_Setter(mthis, value) native "MediaController_currentTime_Setter";
 
-Native_MediaController_defaultPlaybackRate_Getter(mthis) native "MediaController_defaultPlaybackRate_Getter";
+  static $defaultPlaybackRate_Getter(mthis) native "MediaController_defaultPlaybackRate_Getter";
 
-Native_MediaController_defaultPlaybackRate_Setter(mthis, value) native "MediaController_defaultPlaybackRate_Setter";
+  static $defaultPlaybackRate_Setter(mthis, value) native "MediaController_defaultPlaybackRate_Setter";
 
-Native_MediaController_duration_Getter(mthis) native "MediaController_duration_Getter";
+  static $duration_Getter(mthis) native "MediaController_duration_Getter";
 
-Native_MediaController_muted_Getter(mthis) native "MediaController_muted_Getter";
+  static $muted_Getter(mthis) native "MediaController_muted_Getter";
 
-Native_MediaController_muted_Setter(mthis, value) native "MediaController_muted_Setter";
+  static $muted_Setter(mthis, value) native "MediaController_muted_Setter";
 
-Native_MediaController_paused_Getter(mthis) native "MediaController_paused_Getter";
+  static $paused_Getter(mthis) native "MediaController_paused_Getter";
 
-Native_MediaController_playbackRate_Getter(mthis) native "MediaController_playbackRate_Getter";
+  static $playbackRate_Getter(mthis) native "MediaController_playbackRate_Getter";
 
-Native_MediaController_playbackRate_Setter(mthis, value) native "MediaController_playbackRate_Setter";
+  static $playbackRate_Setter(mthis, value) native "MediaController_playbackRate_Setter";
 
-Native_MediaController_playbackState_Getter(mthis) native "MediaController_playbackState_Getter";
+  static $playbackState_Getter(mthis) native "MediaController_playbackState_Getter";
 
-Native_MediaController_played_Getter(mthis) native "MediaController_played_Getter";
+  static $played_Getter(mthis) native "MediaController_played_Getter";
 
-Native_MediaController_seekable_Getter(mthis) native "MediaController_seekable_Getter";
+  static $seekable_Getter(mthis) native "MediaController_seekable_Getter";
 
-Native_MediaController_volume_Getter(mthis) native "MediaController_volume_Getter";
+  static $volume_Getter(mthis) native "MediaController_volume_Getter";
 
-Native_MediaController_volume_Setter(mthis, value) native "MediaController_volume_Setter";
+  static $volume_Setter(mthis, value) native "MediaController_volume_Setter";
 
-Native_MediaController_pause_Callback(mthis) native "MediaController_pause_Callback_RESOLVER_STRING_0_";
+  static $pause_Callback(mthis) native "MediaController_pause_Callback_RESOLVER_STRING_0_";
 
-Native_MediaController_play_Callback(mthis) native "MediaController_play_Callback_RESOLVER_STRING_0_";
+  static $play_Callback(mthis) native "MediaController_play_Callback_RESOLVER_STRING_0_";
 
-Native_MediaController_unpause_Callback(mthis) native "MediaController_unpause_Callback_RESOLVER_STRING_0_";
+  static $unpause_Callback(mthis) native "MediaController_unpause_Callback_RESOLVER_STRING_0_";
+}
 
-Native_MediaElementAudioSourceNode_mediaElement_Getter(mthis) native "MediaElementAudioSourceNode_mediaElement_Getter";
+class BlinkMediaElementAudioSourceNode {
+  static $mediaElement_Getter(mthis) native "MediaElementAudioSourceNode_mediaElement_Getter";
+}
 
-Native_MediaError_code_Getter(mthis) native "MediaError_code_Getter";
+class BlinkMediaError {
+  static $code_Getter(mthis) native "MediaError_code_Getter";
+}
 
-Native_MediaKeyError_code_Getter(mthis) native "MediaKeyError_code_Getter";
+class BlinkMediaKeyError {
+  static $code_Getter(mthis) native "MediaKeyError_code_Getter";
 
-Native_MediaKeyError_systemCode_Getter(mthis) native "MediaKeyError_systemCode_Getter";
+  static $systemCode_Getter(mthis) native "MediaKeyError_systemCode_Getter";
+}
 
-Native_MediaKeyEvent_defaultURL_Getter(mthis) native "MediaKeyEvent_defaultURL_Getter";
+class BlinkMediaKeyEvent {
+  static $defaultURL_Getter(mthis) native "MediaKeyEvent_defaultURL_Getter";
 
-Native_MediaKeyEvent_errorCode_Getter(mthis) native "MediaKeyEvent_errorCode_Getter";
+  static $errorCode_Getter(mthis) native "MediaKeyEvent_errorCode_Getter";
 
-Native_MediaKeyEvent_initData_Getter(mthis) native "MediaKeyEvent_initData_Getter";
+  static $initData_Getter(mthis) native "MediaKeyEvent_initData_Getter";
 
-Native_MediaKeyEvent_keySystem_Getter(mthis) native "MediaKeyEvent_keySystem_Getter";
+  static $keySystem_Getter(mthis) native "MediaKeyEvent_keySystem_Getter";
 
-Native_MediaKeyEvent_message_Getter(mthis) native "MediaKeyEvent_message_Getter";
+  static $message_Getter(mthis) native "MediaKeyEvent_message_Getter";
 
-Native_MediaKeyEvent_sessionId_Getter(mthis) native "MediaKeyEvent_sessionId_Getter";
+  static $sessionId_Getter(mthis) native "MediaKeyEvent_sessionId_Getter";
 
-Native_MediaKeyEvent_systemCode_Getter(mthis) native "MediaKeyEvent_systemCode_Getter";
+  static $systemCode_Getter(mthis) native "MediaKeyEvent_systemCode_Getter";
+}
 
-Native_MediaKeyMessageEvent_destinationURL_Getter(mthis) native "MediaKeyMessageEvent_destinationURL_Getter";
+class BlinkMediaKeyMessageEvent {
+  static $destinationURL_Getter(mthis) native "MediaKeyMessageEvent_destinationURL_Getter";
 
-Native_MediaKeyMessageEvent_message_Getter(mthis) native "MediaKeyMessageEvent_message_Getter";
+  static $message_Getter(mthis) native "MediaKeyMessageEvent_message_Getter";
+}
 
-Native_MediaKeyNeededEvent_contentType_Getter(mthis) native "MediaKeyNeededEvent_contentType_Getter";
+class BlinkMediaKeyNeededEvent {
+  static $contentType_Getter(mthis) native "MediaKeyNeededEvent_contentType_Getter";
 
-Native_MediaKeyNeededEvent_initData_Getter(mthis) native "MediaKeyNeededEvent_initData_Getter";
+  static $initData_Getter(mthis) native "MediaKeyNeededEvent_initData_Getter";
+}
 
-Native_MediaKeySession_error_Getter(mthis) native "MediaKeySession_error_Getter";
+class BlinkMediaKeySession {
+  static $error_Getter(mthis) native "MediaKeySession_error_Getter";
 
-Native_MediaKeySession_keySystem_Getter(mthis) native "MediaKeySession_keySystem_Getter";
+  static $keySystem_Getter(mthis) native "MediaKeySession_keySystem_Getter";
 
-Native_MediaKeySession_sessionId_Getter(mthis) native "MediaKeySession_sessionId_Getter";
+  static $sessionId_Getter(mthis) native "MediaKeySession_sessionId_Getter";
 
-Native_MediaKeySession_release_Callback(mthis) native "MediaKeySession_release_Callback_RESOLVER_STRING_0_";
+  static $release_Callback(mthis) native "MediaKeySession_release_Callback_RESOLVER_STRING_0_";
 
-Native_MediaKeySession_update_Callback(mthis, response) native "MediaKeySession_update_Callback_RESOLVER_STRING_1_Uint8Array";
+  static $update_Callback(mthis, response) native "MediaKeySession_update_Callback_RESOLVER_STRING_1_Uint8Array";
+}
 
+class BlinkMediaKeys {
   // Generated overload resolver
-Native_MediaKeys_MediaKeys(keySystem) {
-    return Native_MediaKeys__create_1constructorCallback(keySystem);
+  static $mkMediaKeys(keySystem) {
+    return $_create_1constructorCallback(keySystem);
   }
 
-Native_MediaKeys__create_1constructorCallback(keySystem) native "MediaKeys_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(keySystem) native "MediaKeys_constructorCallback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaKeys_keySystem_Getter(mthis) native "MediaKeys_keySystem_Getter";
+  static $keySystem_Getter(mthis) native "MediaKeys_keySystem_Getter";
 
-Native_MediaKeys_createSession_Callback(mthis, type, initData) native "MediaKeys_createSession_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
+  static $createSession_Callback(mthis, type, initData) native "MediaKeys_createSession_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
+}
 
-Native_MediaList_length_Getter(mthis) native "MediaList_length_Getter";
+class BlinkMediaList {
+  static $length_Getter(mthis) native "MediaList_length_Getter";
 
-Native_MediaList_mediaText_Getter(mthis) native "MediaList_mediaText_Getter";
+  static $mediaText_Getter(mthis) native "MediaList_mediaText_Getter";
 
-Native_MediaList_mediaText_Setter(mthis, value) native "MediaList_mediaText_Setter";
+  static $mediaText_Setter(mthis, value) native "MediaList_mediaText_Setter";
 
-Native_MediaList_appendMedium_Callback(mthis, newMedium) native "MediaList_appendMedium_Callback_RESOLVER_STRING_1_DOMString";
+  static $appendMedium_Callback(mthis, newMedium) native "MediaList_appendMedium_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaList_deleteMedium_Callback(mthis, oldMedium) native "MediaList_deleteMedium_Callback_RESOLVER_STRING_1_DOMString";
+  static $deleteMedium_Callback(mthis, oldMedium) native "MediaList_deleteMedium_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaList_item_Callback(mthis, index) native "MediaList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "MediaList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_MediaQueryList_matches_Getter(mthis) native "MediaQueryList_matches_Getter";
+class BlinkMediaQueryList {
+  static $matches_Getter(mthis) native "MediaQueryList_matches_Getter";
 
-Native_MediaQueryList_media_Getter(mthis) native "MediaQueryList_media_Getter";
+  static $media_Getter(mthis) native "MediaQueryList_media_Getter";
+}
 
+class BlinkMediaSource {
   // Generated overload resolver
-Native_MediaSource_MediaSource() {
-    return Native_MediaSource__create_1constructorCallback();
+  static $mkMediaSource() {
+    return $_create_1constructorCallback();
   }
 
-Native_MediaSource__create_1constructorCallback() native "MediaSource_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "MediaSource_constructorCallback_RESOLVER_STRING_0_";
 
-Native_MediaSource_activeSourceBuffers_Getter(mthis) native "MediaSource_activeSourceBuffers_Getter";
+  static $activeSourceBuffers_Getter(mthis) native "MediaSource_activeSourceBuffers_Getter";
 
-Native_MediaSource_duration_Getter(mthis) native "MediaSource_duration_Getter";
+  static $duration_Getter(mthis) native "MediaSource_duration_Getter";
 
-Native_MediaSource_duration_Setter(mthis, value) native "MediaSource_duration_Setter";
+  static $duration_Setter(mthis, value) native "MediaSource_duration_Setter";
 
-Native_MediaSource_readyState_Getter(mthis) native "MediaSource_readyState_Getter";
+  static $readyState_Getter(mthis) native "MediaSource_readyState_Getter";
 
-Native_MediaSource_sourceBuffers_Getter(mthis) native "MediaSource_sourceBuffers_Getter";
+  static $sourceBuffers_Getter(mthis) native "MediaSource_sourceBuffers_Getter";
 
-Native_MediaSource_addSourceBuffer_Callback(mthis, type) native "MediaSource_addSourceBuffer_Callback_RESOLVER_STRING_1_DOMString";
+  static $addSourceBuffer_Callback(mthis, type) native "MediaSource_addSourceBuffer_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_MediaSource_endOfStream(mthis, error) {
+  static $endOfStream(mthis, error) {
     if (error != null) {
-      Native_MediaSource__endOfStream_1_Callback(mthis, error);
+      $_endOfStream_1_Callback(mthis, error);
       return;
     }
-    Native_MediaSource__endOfStream_2_Callback(mthis);
+    $_endOfStream_2_Callback(mthis);
     return;
   }
 
-Native_MediaSource__endOfStream_1_Callback(mthis, error) native "MediaSource_endOfStream_Callback_RESOLVER_STRING_1_DOMString";
+  static $_endOfStream_1_Callback(mthis, error) native "MediaSource_endOfStream_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaSource__endOfStream_2_Callback(mthis) native "MediaSource_endOfStream_Callback_RESOLVER_STRING_0_";
+  static $_endOfStream_2_Callback(mthis) native "MediaSource_endOfStream_Callback_RESOLVER_STRING_0_";
 
-Native_MediaSource_isTypeSupported_Callback(type) native "MediaSource_isTypeSupported_Callback_RESOLVER_STRING_1_DOMString";
+  static $isTypeSupported_Callback(type) native "MediaSource_isTypeSupported_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaSource_removeSourceBuffer_Callback(mthis, buffer) native "MediaSource_removeSourceBuffer_Callback_RESOLVER_STRING_1_SourceBuffer";
+  static $removeSourceBuffer_Callback(mthis, buffer) native "MediaSource_removeSourceBuffer_Callback_RESOLVER_STRING_1_SourceBuffer";
+}
 
+class BlinkMediaStream {
   // Generated overload resolver
-Native_MediaStream_MediaStream(stream_OR_tracks) {
+  static $mkMediaStream(stream_OR_tracks) {
     if (stream_OR_tracks == null) {
-      return Native_MediaStream__create_1constructorCallback();
+      return $_create_1constructorCallback();
     }
     if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
-      return Native_MediaStream__create_2constructorCallback(stream_OR_tracks);
+      return $_create_2constructorCallback(stream_OR_tracks);
     }
     if ((stream_OR_tracks is List<MediaStreamTrack> || stream_OR_tracks == null)) {
-      return Native_MediaStream__create_3constructorCallback(stream_OR_tracks);
+      return $_create_3constructorCallback(stream_OR_tracks);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_MediaStream__create_1constructorCallback() native "MediaStream_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "MediaStream_constructorCallback_RESOLVER_STRING_0_";
 
-Native_MediaStream__create_2constructorCallback(stream_OR_tracks) native "MediaStream_constructorCallback_RESOLVER_STRING_1_MediaStream";
+  static $_create_2constructorCallback(stream_OR_tracks) native "MediaStream_constructorCallback_RESOLVER_STRING_1_MediaStream";
 
-Native_MediaStream__create_3constructorCallback(stream_OR_tracks) native "MediaStream_constructorCallback_RESOLVER_STRING_1_MediaStreamTrack[]";
+  static $_create_3constructorCallback(stream_OR_tracks) native "MediaStream_constructorCallback_RESOLVER_STRING_1_MediaStreamTrack[]";
 
-Native_MediaStream_ended_Getter(mthis) native "MediaStream_ended_Getter";
+  static $ended_Getter(mthis) native "MediaStream_ended_Getter";
 
-Native_MediaStream_id_Getter(mthis) native "MediaStream_id_Getter";
+  static $id_Getter(mthis) native "MediaStream_id_Getter";
 
-Native_MediaStream_label_Getter(mthis) native "MediaStream_label_Getter";
+  static $label_Getter(mthis) native "MediaStream_label_Getter";
 
-Native_MediaStream_addTrack_Callback(mthis, track) native "MediaStream_addTrack_Callback_RESOLVER_STRING_1_MediaStreamTrack";
+  static $addTrack_Callback(mthis, track) native "MediaStream_addTrack_Callback_RESOLVER_STRING_1_MediaStreamTrack";
 
-Native_MediaStream_getAudioTracks_Callback(mthis) native "MediaStream_getAudioTracks_Callback_RESOLVER_STRING_0_";
+  static $getAudioTracks_Callback(mthis) native "MediaStream_getAudioTracks_Callback_RESOLVER_STRING_0_";
 
-Native_MediaStream_getTrackById_Callback(mthis, trackId) native "MediaStream_getTrackById_Callback_RESOLVER_STRING_1_DOMString";
+  static $getTrackById_Callback(mthis, trackId) native "MediaStream_getTrackById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaStream_getVideoTracks_Callback(mthis) native "MediaStream_getVideoTracks_Callback_RESOLVER_STRING_0_";
+  static $getVideoTracks_Callback(mthis) native "MediaStream_getVideoTracks_Callback_RESOLVER_STRING_0_";
 
-Native_MediaStream_removeTrack_Callback(mthis, track) native "MediaStream_removeTrack_Callback_RESOLVER_STRING_1_MediaStreamTrack";
+  static $removeTrack_Callback(mthis, track) native "MediaStream_removeTrack_Callback_RESOLVER_STRING_1_MediaStreamTrack";
 
-Native_MediaStream_stop_Callback(mthis) native "MediaStream_stop_Callback_RESOLVER_STRING_0_";
+  static $stop_Callback(mthis) native "MediaStream_stop_Callback_RESOLVER_STRING_0_";
+}
 
-Native_MediaStreamAudioDestinationNode_stream_Getter(mthis) native "MediaStreamAudioDestinationNode_stream_Getter";
+class BlinkMediaStreamAudioDestinationNode {
+  static $stream_Getter(mthis) native "MediaStreamAudioDestinationNode_stream_Getter";
+}
 
-Native_MediaStreamAudioSourceNode_mediaStream_Getter(mthis) native "MediaStreamAudioSourceNode_mediaStream_Getter";
+class BlinkMediaStreamAudioSourceNode {
+  static $mediaStream_Getter(mthis) native "MediaStreamAudioSourceNode_mediaStream_Getter";
+}
 
-Native_MediaStreamEvent_stream_Getter(mthis) native "MediaStreamEvent_stream_Getter";
+class BlinkMediaStreamEvent {
+  static $stream_Getter(mthis) native "MediaStreamEvent_stream_Getter";
+}
 
-Native_MediaStreamTrack_enabled_Getter(mthis) native "MediaStreamTrack_enabled_Getter";
+class BlinkMediaStreamTrack {
+  static $enabled_Getter(mthis) native "MediaStreamTrack_enabled_Getter";
 
-Native_MediaStreamTrack_enabled_Setter(mthis, value) native "MediaStreamTrack_enabled_Setter";
+  static $enabled_Setter(mthis, value) native "MediaStreamTrack_enabled_Setter";
 
-Native_MediaStreamTrack_id_Getter(mthis) native "MediaStreamTrack_id_Getter";
+  static $id_Getter(mthis) native "MediaStreamTrack_id_Getter";
 
-Native_MediaStreamTrack_kind_Getter(mthis) native "MediaStreamTrack_kind_Getter";
+  static $kind_Getter(mthis) native "MediaStreamTrack_kind_Getter";
 
-Native_MediaStreamTrack_label_Getter(mthis) native "MediaStreamTrack_label_Getter";
+  static $label_Getter(mthis) native "MediaStreamTrack_label_Getter";
 
-Native_MediaStreamTrack_readyState_Getter(mthis) native "MediaStreamTrack_readyState_Getter";
+  static $readyState_Getter(mthis) native "MediaStreamTrack_readyState_Getter";
 
-Native_MediaStreamTrack_getSources_Callback(callback) native "MediaStreamTrack_getSources_Callback_RESOLVER_STRING_1_MediaStreamTrackSourcesCallback";
+  static $getSources_Callback(callback) native "MediaStreamTrack_getSources_Callback_RESOLVER_STRING_1_MediaStreamTrackSourcesCallback";
 
-Native_MediaStreamTrack_stop_Callback(mthis) native "MediaStreamTrack_stop_Callback_RESOLVER_STRING_0_";
+  static $stop_Callback(mthis) native "MediaStreamTrack_stop_Callback_RESOLVER_STRING_0_";
+}
 
-Native_MediaStreamTrackEvent_track_Getter(mthis) native "MediaStreamTrackEvent_track_Getter";
+class BlinkMediaStreamTrackEvent {
+  static $track_Getter(mthis) native "MediaStreamTrackEvent_track_Getter";
+}
 
-Native_MemoryInfo_jsHeapSizeLimit_Getter(mthis) native "MemoryInfo_jsHeapSizeLimit_Getter";
+class BlinkMemoryInfo {
+  static $jsHeapSizeLimit_Getter(mthis) native "MemoryInfo_jsHeapSizeLimit_Getter";
 
-Native_MemoryInfo_totalJSHeapSize_Getter(mthis) native "MemoryInfo_totalJSHeapSize_Getter";
+  static $totalJSHeapSize_Getter(mthis) native "MemoryInfo_totalJSHeapSize_Getter";
 
-Native_MemoryInfo_usedJSHeapSize_Getter(mthis) native "MemoryInfo_usedJSHeapSize_Getter";
+  static $usedJSHeapSize_Getter(mthis) native "MemoryInfo_usedJSHeapSize_Getter";
+}
 
-Native_MessageChannel_port1_Getter(mthis) native "MessageChannel_port1_Getter";
+class BlinkMessageChannel {
+  static $port1_Getter(mthis) native "MessageChannel_port1_Getter";
 
-Native_MessageChannel_port2_Getter(mthis) native "MessageChannel_port2_Getter";
+  static $port2_Getter(mthis) native "MessageChannel_port2_Getter";
+}
 
-Native_MessageEvent_data_Getter(mthis) native "MessageEvent_data_Getter";
+class BlinkMessageEvent {
+  static $data_Getter(mthis) native "MessageEvent_data_Getter";
 
-Native_MessageEvent_lastEventId_Getter(mthis) native "MessageEvent_lastEventId_Getter";
+  static $lastEventId_Getter(mthis) native "MessageEvent_lastEventId_Getter";
 
-Native_MessageEvent_origin_Getter(mthis) native "MessageEvent_origin_Getter";
+  static $origin_Getter(mthis) native "MessageEvent_origin_Getter";
 
-Native_MessageEvent_source_Getter(mthis) native "MessageEvent_source_Getter";
+  static $source_Getter(mthis) native "MessageEvent_source_Getter";
 
-Native_MessageEvent_initMessageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts) native "MessageEvent_initMessageEvent_Callback";
+  static $initMessageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts) native "MessageEvent_initMessageEvent_Callback";
+}
 
-Native_MessagePort_close_Callback(mthis) native "MessagePort_close_Callback_RESOLVER_STRING_0_";
+class BlinkMessagePort {
+  static $close_Callback(mthis) native "MessagePort_close_Callback_RESOLVER_STRING_0_";
 
-Native_MessagePort_postMessage_Callback(mthis, message, messagePorts) native "MessagePort_postMessage_Callback";
+  static $postMessage_Callback(mthis, message, messagePorts) native "MessagePort_postMessage_Callback";
 
-Native_MessagePort_start_Callback(mthis) native "MessagePort_start_Callback_RESOLVER_STRING_0_";
+  static $start_Callback(mthis) native "MessagePort_start_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Metadata_modificationTime_Getter(mthis) native "Metadata_modificationTime_Getter";
+class BlinkMetadata {
+  static $modificationTime_Getter(mthis) native "Metadata_modificationTime_Getter";
 
-Native_Metadata_size_Getter(mthis) native "Metadata_size_Getter";
+  static $size_Getter(mthis) native "Metadata_size_Getter";
+}
 
-Native_MimeType_description_Getter(mthis) native "MimeType_description_Getter";
+class BlinkMimeType {
+  static $description_Getter(mthis) native "MimeType_description_Getter";
 
-Native_MimeType_enabledPlugin_Getter(mthis) native "MimeType_enabledPlugin_Getter";
+  static $enabledPlugin_Getter(mthis) native "MimeType_enabledPlugin_Getter";
 
-Native_MimeType_suffixes_Getter(mthis) native "MimeType_suffixes_Getter";
+  static $suffixes_Getter(mthis) native "MimeType_suffixes_Getter";
 
-Native_MimeType_type_Getter(mthis) native "MimeType_type_Getter";
+  static $type_Getter(mthis) native "MimeType_type_Getter";
+}
 
-Native_MimeTypeArray_length_Getter(mthis) native "MimeTypeArray_length_Getter";
+class BlinkMimeTypeArray {
+  static $length_Getter(mthis) native "MimeTypeArray_length_Getter";
 
-Native_MimeTypeArray_NativeIndexed_Getter(mthis, index) native "MimeTypeArray_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "MimeTypeArray_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_MimeTypeArray___getter___Callback(mthis, name) native "MimeTypeArray___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $__getter___Callback(mthis, name) native "MimeTypeArray___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MimeTypeArray_item_Callback(mthis, index) native "MimeTypeArray_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "MimeTypeArray_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_MimeTypeArray_namedItem_Callback(mthis, name) native "MimeTypeArray_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $namedItem_Callback(mthis, name) native "MimeTypeArray_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_MouseEvent_altKey_Getter(mthis) native "MouseEvent_altKey_Getter";
+class BlinkMouseEvent {
+  static $altKey_Getter(mthis) native "MouseEvent_altKey_Getter";
 
-Native_MouseEvent_button_Getter(mthis) native "MouseEvent_button_Getter";
+  static $button_Getter(mthis) native "MouseEvent_button_Getter";
 
-Native_MouseEvent_clientX_Getter(mthis) native "MouseEvent_clientX_Getter";
+  static $clientX_Getter(mthis) native "MouseEvent_clientX_Getter";
 
-Native_MouseEvent_clientY_Getter(mthis) native "MouseEvent_clientY_Getter";
+  static $clientY_Getter(mthis) native "MouseEvent_clientY_Getter";
 
-Native_MouseEvent_ctrlKey_Getter(mthis) native "MouseEvent_ctrlKey_Getter";
+  static $ctrlKey_Getter(mthis) native "MouseEvent_ctrlKey_Getter";
 
-Native_MouseEvent_dataTransfer_Getter(mthis) native "MouseEvent_dataTransfer_Getter";
+  static $dataTransfer_Getter(mthis) native "MouseEvent_dataTransfer_Getter";
 
-Native_MouseEvent_fromElement_Getter(mthis) native "MouseEvent_fromElement_Getter";
+  static $fromElement_Getter(mthis) native "MouseEvent_fromElement_Getter";
 
-Native_MouseEvent_metaKey_Getter(mthis) native "MouseEvent_metaKey_Getter";
+  static $metaKey_Getter(mthis) native "MouseEvent_metaKey_Getter";
 
-Native_MouseEvent_offsetX_Getter(mthis) native "MouseEvent_offsetX_Getter";
+  static $offsetX_Getter(mthis) native "MouseEvent_offsetX_Getter";
 
-Native_MouseEvent_offsetY_Getter(mthis) native "MouseEvent_offsetY_Getter";
+  static $offsetY_Getter(mthis) native "MouseEvent_offsetY_Getter";
 
-Native_MouseEvent_relatedTarget_Getter(mthis) native "MouseEvent_relatedTarget_Getter";
+  static $relatedTarget_Getter(mthis) native "MouseEvent_relatedTarget_Getter";
 
-Native_MouseEvent_screenX_Getter(mthis) native "MouseEvent_screenX_Getter";
+  static $screenX_Getter(mthis) native "MouseEvent_screenX_Getter";
 
-Native_MouseEvent_screenY_Getter(mthis) native "MouseEvent_screenY_Getter";
+  static $screenY_Getter(mthis) native "MouseEvent_screenY_Getter";
 
-Native_MouseEvent_shiftKey_Getter(mthis) native "MouseEvent_shiftKey_Getter";
+  static $shiftKey_Getter(mthis) native "MouseEvent_shiftKey_Getter";
 
-Native_MouseEvent_toElement_Getter(mthis) native "MouseEvent_toElement_Getter";
+  static $toElement_Getter(mthis) native "MouseEvent_toElement_Getter";
 
-Native_MouseEvent_webkitMovementX_Getter(mthis) native "MouseEvent_webkitMovementX_Getter";
+  static $webkitMovementX_Getter(mthis) native "MouseEvent_webkitMovementX_Getter";
 
-Native_MouseEvent_webkitMovementY_Getter(mthis) native "MouseEvent_webkitMovementY_Getter";
+  static $webkitMovementY_Getter(mthis) native "MouseEvent_webkitMovementY_Getter";
+
+  static $initMouseEvent_Callback(mthis, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native "MouseEvent_initMouseEvent_Callback_RESOLVER_STRING_15_DOMString_boolean_boolean_Window_long_long_long_long_long_boolean_boolean_boolean_boolean_unsigned short_EventTarget";
+}
+
+class BlinkMutationEvent {}
+
+class BlinkMutationObserver {
+  static $constructorCallback(callback) native "MutationObserver_constructorCallback";
 
-Native_MouseEvent_initMouseEvent_Callback(mthis, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native "MouseEvent_initMouseEvent_Callback_RESOLVER_STRING_15_DOMString_boolean_boolean_Window_long_long_long_long_long_boolean_boolean_boolean_boolean_unsigned short_EventTarget";
+  static $disconnect_Callback(mthis) native "MutationObserver_disconnect_Callback_RESOLVER_STRING_0_";
 
-Native_MutationObserver_constructorCallback(callback) native "MutationObserver_constructorCallback";
+  static $observe_Callback(mthis, target, options) native "MutationObserver_observe_Callback_RESOLVER_STRING_2_Node_Dictionary";
 
-Native_MutationObserver_disconnect_Callback(mthis) native "MutationObserver_disconnect_Callback_RESOLVER_STRING_0_";
+  static $takeRecords_Callback(mthis) native "MutationObserver_takeRecords_Callback_RESOLVER_STRING_0_";
+}
 
-Native_MutationObserver_observe_Callback(mthis, target, options) native "MutationObserver_observe_Callback_RESOLVER_STRING_2_Node_Dictionary";
+class BlinkMutationRecord {
+  static $addedNodes_Getter(mthis) native "MutationRecord_addedNodes_Getter";
 
-Native_MutationObserver_takeRecords_Callback(mthis) native "MutationObserver_takeRecords_Callback_RESOLVER_STRING_0_";
+  static $attributeName_Getter(mthis) native "MutationRecord_attributeName_Getter";
 
-Native_MutationRecord_addedNodes_Getter(mthis) native "MutationRecord_addedNodes_Getter";
+  static $attributeNamespace_Getter(mthis) native "MutationRecord_attributeNamespace_Getter";
 
-Native_MutationRecord_attributeName_Getter(mthis) native "MutationRecord_attributeName_Getter";
+  static $nextSibling_Getter(mthis) native "MutationRecord_nextSibling_Getter";
 
-Native_MutationRecord_attributeNamespace_Getter(mthis) native "MutationRecord_attributeNamespace_Getter";
+  static $oldValue_Getter(mthis) native "MutationRecord_oldValue_Getter";
 
-Native_MutationRecord_nextSibling_Getter(mthis) native "MutationRecord_nextSibling_Getter";
+  static $previousSibling_Getter(mthis) native "MutationRecord_previousSibling_Getter";
 
-Native_MutationRecord_oldValue_Getter(mthis) native "MutationRecord_oldValue_Getter";
+  static $removedNodes_Getter(mthis) native "MutationRecord_removedNodes_Getter";
 
-Native_MutationRecord_previousSibling_Getter(mthis) native "MutationRecord_previousSibling_Getter";
+  static $target_Getter(mthis) native "MutationRecord_target_Getter";
 
-Native_MutationRecord_removedNodes_Getter(mthis) native "MutationRecord_removedNodes_Getter";
+  static $type_Getter(mthis) native "MutationRecord_type_Getter";
+}
 
-Native_MutationRecord_target_Getter(mthis) native "MutationRecord_target_Getter";
+class BlinkNamedNodeMap {
+  static $length_Getter(mthis) native "NamedNodeMap_length_Getter";
 
-Native_MutationRecord_type_Getter(mthis) native "MutationRecord_type_Getter";
+  static $NativeIndexed_Getter(mthis, index) native "NamedNodeMap_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_NamedNodeMap_length_Getter(mthis) native "NamedNodeMap_length_Getter";
+  static $__getter___Callback(mthis, name) native "NamedNodeMap___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_NamedNodeMap_NativeIndexed_Getter(mthis, index) native "NamedNodeMap_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getNamedItem_Callback(mthis, name) native "NamedNodeMap_getNamedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_NamedNodeMap___getter___Callback(mthis, name) native "NamedNodeMap___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $getNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_getNamedItemNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_NamedNodeMap_getNamedItem_Callback(mthis, name) native "NamedNodeMap_getNamedItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $item_Callback(mthis, index) native "NamedNodeMap_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_NamedNodeMap_getNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_getNamedItemNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $removeNamedItem_Callback(mthis, name) native "NamedNodeMap_removeNamedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_NamedNodeMap_item_Callback(mthis, index) native "NamedNodeMap_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $removeNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_removeNamedItemNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_NamedNodeMap_removeNamedItem_Callback(mthis, name) native "NamedNodeMap_removeNamedItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $setNamedItem_Callback(mthis, node) native "NamedNodeMap_setNamedItem_Callback_RESOLVER_STRING_1_Node";
 
-Native_NamedNodeMap_removeNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_removeNamedItemNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $setNamedItemNS_Callback(mthis, node) native "NamedNodeMap_setNamedItemNS_Callback_RESOLVER_STRING_1_Node";
+}
 
-Native_NamedNodeMap_setNamedItem_Callback(mthis, node) native "NamedNodeMap_setNamedItem_Callback_RESOLVER_STRING_1_Node";
+class BlinkNavigatorID {
+  static $appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
 
-Native_NamedNodeMap_setNamedItemNS_Callback(mthis, node) native "NamedNodeMap_setNamedItemNS_Callback_RESOLVER_STRING_1_Node";
+  static $appName_Getter(mthis) native "Navigator_appName_Getter";
 
-Native_NavigatorID_appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
+  static $appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
 
-Native_NavigatorID_appName_Getter(mthis) native "Navigator_appName_Getter";
+  static $platform_Getter(mthis) native "Navigator_platform_Getter";
 
-Native_NavigatorID_appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
+  static $product_Getter(mthis) native "Navigator_product_Getter";
 
-Native_NavigatorID_platform_Getter(mthis) native "Navigator_platform_Getter";
+  static $userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
+}
 
-Native_NavigatorID_product_Getter(mthis) native "Navigator_product_Getter";
+class BlinkNavigatorOnLine {
+  static $onLine_Getter(mthis) native "NavigatorOnLine_onLine_Getter";
+}
 
-Native_NavigatorID_userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
+class BlinkNavigator {
+  static $cookieEnabled_Getter(mthis) native "Navigator_cookieEnabled_Getter";
 
-Native_NavigatorOnLine_onLine_Getter(mthis) native "NavigatorOnLine_onLine_Getter";
+  static $doNotTrack_Getter(mthis) native "Navigator_doNotTrack_Getter";
 
-Native_Navigator_cookieEnabled_Getter(mthis) native "Navigator_cookieEnabled_Getter";
+  static $geolocation_Getter(mthis) native "Navigator_geolocation_Getter";
 
-Native_Navigator_doNotTrack_Getter(mthis) native "Navigator_doNotTrack_Getter";
+  static $language_Getter(mthis) native "Navigator_language_Getter";
 
-Native_Navigator_geolocation_Getter(mthis) native "Navigator_geolocation_Getter";
+  static $maxTouchPoints_Getter(mthis) native "Navigator_maxTouchPoints_Getter";
 
-Native_Navigator_language_Getter(mthis) native "Navigator_language_Getter";
+  static $mimeTypes_Getter(mthis) native "Navigator_mimeTypes_Getter";
 
-Native_Navigator_maxTouchPoints_Getter(mthis) native "Navigator_maxTouchPoints_Getter";
+  static $productSub_Getter(mthis) native "Navigator_productSub_Getter";
 
-Native_Navigator_mimeTypes_Getter(mthis) native "Navigator_mimeTypes_Getter";
+  static $serviceWorker_Getter(mthis) native "Navigator_serviceWorker_Getter";
 
-Native_Navigator_productSub_Getter(mthis) native "Navigator_productSub_Getter";
+  static $storageQuota_Getter(mthis) native "Navigator_storageQuota_Getter";
 
-Native_Navigator_serviceWorker_Getter(mthis) native "Navigator_serviceWorker_Getter";
+  static $vendor_Getter(mthis) native "Navigator_vendor_Getter";
 
-Native_Navigator_storageQuota_Getter(mthis) native "Navigator_storageQuota_Getter";
+  static $vendorSub_Getter(mthis) native "Navigator_vendorSub_Getter";
 
-Native_Navigator_vendor_Getter(mthis) native "Navigator_vendor_Getter";
+  static $webkitPersistentStorage_Getter(mthis) native "Navigator_webkitPersistentStorage_Getter";
 
-Native_Navigator_vendorSub_Getter(mthis) native "Navigator_vendorSub_Getter";
+  static $webkitTemporaryStorage_Getter(mthis) native "Navigator_webkitTemporaryStorage_Getter";
 
-Native_Navigator_webkitPersistentStorage_Getter(mthis) native "Navigator_webkitPersistentStorage_Getter";
+  static $getStorageUpdates_Callback(mthis) native "Navigator_getStorageUpdates_Callback_RESOLVER_STRING_0_";
 
-Native_Navigator_webkitTemporaryStorage_Getter(mthis) native "Navigator_webkitTemporaryStorage_Getter";
+  static $isProtocolHandlerRegistered_Callback(mthis, scheme, url) native "Navigator_isProtocolHandlerRegistered_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Navigator_getStorageUpdates_Callback(mthis) native "Navigator_getStorageUpdates_Callback_RESOLVER_STRING_0_";
+  static $registerProtocolHandler_Callback(mthis, scheme, url, title) native "Navigator_registerProtocolHandler_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_Navigator_isProtocolHandlerRegistered_Callback(mthis, scheme, url) native "Navigator_isProtocolHandlerRegistered_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $requestMIDIAccess_Callback(mthis, options) native "Navigator_requestMIDIAccess_Callback_RESOLVER_STRING_1_Dictionary";
 
-Native_Navigator_registerProtocolHandler_Callback(mthis, scheme, url, title) native "Navigator_registerProtocolHandler_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $unregisterProtocolHandler_Callback(mthis, scheme, url) native "Navigator_unregisterProtocolHandler_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Navigator_requestMIDIAccess_Callback(mthis, options) native "Navigator_requestMIDIAccess_Callback_RESOLVER_STRING_1_Dictionary";
+  static $webkitGetGamepads_Callback(mthis) native "Navigator_webkitGetGamepads_Callback_RESOLVER_STRING_0_";
 
-Native_Navigator_unregisterProtocolHandler_Callback(mthis, scheme, url) native "Navigator_unregisterProtocolHandler_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $webkitGetUserMedia_Callback(mthis, options, successCallback, errorCallback) native "Navigator_webkitGetUserMedia_Callback_RESOLVER_STRING_3_Dictionary_NavigatorUserMediaSuccessCallback_NavigatorUserMediaErrorCallback";
 
-Native_Navigator_webkitGetGamepads_Callback(mthis) native "Navigator_webkitGetGamepads_Callback_RESOLVER_STRING_0_";
+  static $appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
 
-Native_Navigator_webkitGetUserMedia_Callback(mthis, options, successCallback, errorCallback) native "Navigator_webkitGetUserMedia_Callback_RESOLVER_STRING_3_Dictionary_NavigatorUserMediaSuccessCallback_NavigatorUserMediaErrorCallback";
+  static $appName_Getter(mthis) native "Navigator_appName_Getter";
 
-Native_Navigator_appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
+  static $appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
 
-Native_Navigator_appName_Getter(mthis) native "Navigator_appName_Getter";
+  static $platform_Getter(mthis) native "Navigator_platform_Getter";
 
-Native_Navigator_appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
+  static $product_Getter(mthis) native "Navigator_product_Getter";
 
-Native_Navigator_platform_Getter(mthis) native "Navigator_platform_Getter";
+  static $userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
 
-Native_Navigator_product_Getter(mthis) native "Navigator_product_Getter";
+  static $onLine_Getter(mthis) native "Navigator_onLine_Getter";
+}
 
-Native_Navigator_userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
+class BlinkNavigatorUserMediaError {
+  static $constraintName_Getter(mthis) native "NavigatorUserMediaError_constraintName_Getter";
 
-Native_Navigator_onLine_Getter(mthis) native "Navigator_onLine_Getter";
+  static $message_Getter(mthis) native "NavigatorUserMediaError_message_Getter";
 
-Native_NavigatorUserMediaError_constraintName_Getter(mthis) native "NavigatorUserMediaError_constraintName_Getter";
+  static $name_Getter(mthis) native "NavigatorUserMediaError_name_Getter";
+}
 
-Native_NavigatorUserMediaError_message_Getter(mthis) native "NavigatorUserMediaError_message_Getter";
+class BlinkNodeFilter {}
 
-Native_NavigatorUserMediaError_name_Getter(mthis) native "NavigatorUserMediaError_name_Getter";
+class BlinkNodeIterator {
+  static $pointerBeforeReferenceNode_Getter(mthis) native "NodeIterator_pointerBeforeReferenceNode_Getter";
 
-Native_NodeIterator_pointerBeforeReferenceNode_Getter(mthis) native "NodeIterator_pointerBeforeReferenceNode_Getter";
+  static $referenceNode_Getter(mthis) native "NodeIterator_referenceNode_Getter";
 
-Native_NodeIterator_referenceNode_Getter(mthis) native "NodeIterator_referenceNode_Getter";
+  static $root_Getter(mthis) native "NodeIterator_root_Getter";
 
-Native_NodeIterator_root_Getter(mthis) native "NodeIterator_root_Getter";
+  static $whatToShow_Getter(mthis) native "NodeIterator_whatToShow_Getter";
 
-Native_NodeIterator_whatToShow_Getter(mthis) native "NodeIterator_whatToShow_Getter";
+  static $detach_Callback(mthis) native "NodeIterator_detach_Callback_RESOLVER_STRING_0_";
 
-Native_NodeIterator_detach_Callback(mthis) native "NodeIterator_detach_Callback_RESOLVER_STRING_0_";
+  static $nextNode_Callback(mthis) native "NodeIterator_nextNode_Callback_RESOLVER_STRING_0_";
 
-Native_NodeIterator_nextNode_Callback(mthis) native "NodeIterator_nextNode_Callback_RESOLVER_STRING_0_";
+  static $previousNode_Callback(mthis) native "NodeIterator_previousNode_Callback_RESOLVER_STRING_0_";
+}
 
-Native_NodeIterator_previousNode_Callback(mthis) native "NodeIterator_previousNode_Callback_RESOLVER_STRING_0_";
+class BlinkNodeList {
+  static $length_Getter(mthis) native "NodeList_length_Getter";
 
-Native_NodeList_length_Getter(mthis) native "NodeList_length_Getter";
+  static $NativeIndexed_Getter(mthis, index) native "NodeList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_NodeList_NativeIndexed_Getter(mthis, index) native "NodeList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "NodeList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_NodeList_item_Callback(mthis, index) native "NodeList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkNotation {}
 
+class BlinkNotification {
   // Generated overload resolver
-Native_Notification_Notification(title, options) {
-    return Native_Notification__create_1constructorCallback(title, options);
+  static $mkNotification(title, options) {
+    return $_create_1constructorCallback(title, options);
   }
 
-Native_Notification__create_1constructorCallback(title, options) native "Notification_constructorCallback_RESOLVER_STRING_2_DOMString_Dictionary";
+  static $_create_1constructorCallback(title, options) native "Notification_constructorCallback_RESOLVER_STRING_2_DOMString_Dictionary";
 
-Native_Notification_body_Getter(mthis) native "Notification_body_Getter";
+  static $body_Getter(mthis) native "Notification_body_Getter";
 
-Native_Notification_dir_Getter(mthis) native "Notification_dir_Getter";
+  static $dir_Getter(mthis) native "Notification_dir_Getter";
 
-Native_Notification_icon_Getter(mthis) native "Notification_icon_Getter";
+  static $icon_Getter(mthis) native "Notification_icon_Getter";
 
-Native_Notification_lang_Getter(mthis) native "Notification_lang_Getter";
+  static $lang_Getter(mthis) native "Notification_lang_Getter";
 
-Native_Notification_permission_Getter(mthis) native "Notification_permission_Getter";
+  static $permission_Getter(mthis) native "Notification_permission_Getter";
 
-Native_Notification_tag_Getter(mthis) native "Notification_tag_Getter";
+  static $tag_Getter(mthis) native "Notification_tag_Getter";
 
-Native_Notification_title_Getter(mthis) native "Notification_title_Getter";
+  static $title_Getter(mthis) native "Notification_title_Getter";
 
-Native_Notification_close_Callback(mthis) native "Notification_close_Callback_RESOLVER_STRING_0_";
+  static $close_Callback(mthis) native "Notification_close_Callback_RESOLVER_STRING_0_";
 
-Native_Notification_requestPermission_Callback(callback) native "Notification_requestPermission_Callback_RESOLVER_STRING_1_NotificationPermissionCallback";
+  static $requestPermission_Callback(callback) native "Notification_requestPermission_Callback_RESOLVER_STRING_1_NotificationPermissionCallback";
+}
 
-Native_OESVertexArrayObject_bindVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
+class BlinkNotificationCenter {}
 
-Native_OESVertexArrayObject_createVertexArrayOES_Callback(mthis) native "OESVertexArrayObject_createVertexArrayOES_Callback_RESOLVER_STRING_0_";
+class BlinkOESElementIndexUint {}
 
-Native_OESVertexArrayObject_deleteVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
+class BlinkOESStandardDerivatives {}
 
-Native_OESVertexArrayObject_isVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
+class BlinkOESTextureFloat {}
 
-Native_OfflineAudioCompletionEvent_renderedBuffer_Getter(mthis) native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
+class BlinkOESTextureFloatLinear {}
 
+class BlinkOESTextureHalfFloat {}
+
+class BlinkOESTextureHalfFloatLinear {}
+
+class BlinkOESVertexArrayObject {
+  static $bindVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
+
+  static $createVertexArrayOES_Callback(mthis) native "OESVertexArrayObject_createVertexArrayOES_Callback_RESOLVER_STRING_0_";
+
+  static $deleteVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
+
+  static $isVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
+}
+
+class BlinkOfflineAudioCompletionEvent {
+  static $renderedBuffer_Getter(mthis) native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
+}
+
+class BlinkOfflineAudioContext {
   // Generated overload resolver
-Native_OfflineAudioContext_OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate) {
-    return Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate);
+  static $mkOfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate) {
+    return $_create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate);
   }
 
-Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate) native "OfflineAudioContext_constructorCallback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
+  static $_create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate) native "OfflineAudioContext_constructorCallback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
+}
 
-Native_OscillatorNode_detune_Getter(mthis) native "OscillatorNode_detune_Getter";
+class BlinkOscillatorNode {
+  static $detune_Getter(mthis) native "OscillatorNode_detune_Getter";
 
-Native_OscillatorNode_frequency_Getter(mthis) native "OscillatorNode_frequency_Getter";
+  static $frequency_Getter(mthis) native "OscillatorNode_frequency_Getter";
 
-Native_OscillatorNode_type_Getter(mthis) native "OscillatorNode_type_Getter";
+  static $type_Getter(mthis) native "OscillatorNode_type_Getter";
 
-Native_OscillatorNode_type_Setter(mthis, value) native "OscillatorNode_type_Setter";
+  static $type_Setter(mthis, value) native "OscillatorNode_type_Setter";
 
-Native_OscillatorNode_noteOff_Callback(mthis, when) native "OscillatorNode_noteOff_Callback_RESOLVER_STRING_1_double";
+  static $noteOff_Callback(mthis, when) native "OscillatorNode_noteOff_Callback_RESOLVER_STRING_1_double";
 
-Native_OscillatorNode_noteOn_Callback(mthis, when) native "OscillatorNode_noteOn_Callback_RESOLVER_STRING_1_double";
+  static $noteOn_Callback(mthis, when) native "OscillatorNode_noteOn_Callback_RESOLVER_STRING_1_double";
 
-Native_OscillatorNode_setPeriodicWave_Callback(mthis, periodicWave) native "OscillatorNode_setPeriodicWave_Callback_RESOLVER_STRING_1_PeriodicWave";
+  static $setPeriodicWave_Callback(mthis, periodicWave) native "OscillatorNode_setPeriodicWave_Callback_RESOLVER_STRING_1_PeriodicWave";
 
   // Generated overload resolver
-Native_OscillatorNode_start(mthis, when) {
+  static $start(mthis, when) {
     if (when != null) {
-      Native_OscillatorNode__start_1_Callback(mthis, when);
+      $_start_1_Callback(mthis, when);
       return;
     }
-    Native_OscillatorNode__start_2_Callback(mthis);
+    $_start_2_Callback(mthis);
     return;
   }
 
-Native_OscillatorNode__start_1_Callback(mthis, when) native "OscillatorNode_start_Callback_RESOLVER_STRING_1_double";
+  static $_start_1_Callback(mthis, when) native "OscillatorNode_start_Callback_RESOLVER_STRING_1_double";
 
-Native_OscillatorNode__start_2_Callback(mthis) native "OscillatorNode_start_Callback_RESOLVER_STRING_0_";
+  static $_start_2_Callback(mthis) native "OscillatorNode_start_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_OscillatorNode_stop(mthis, when) {
+  static $stop(mthis, when) {
     if (when != null) {
-      Native_OscillatorNode__stop_1_Callback(mthis, when);
+      $_stop_1_Callback(mthis, when);
       return;
     }
-    Native_OscillatorNode__stop_2_Callback(mthis);
+    $_stop_2_Callback(mthis);
     return;
   }
 
-Native_OscillatorNode__stop_1_Callback(mthis, when) native "OscillatorNode_stop_Callback_RESOLVER_STRING_1_double";
+  static $_stop_1_Callback(mthis, when) native "OscillatorNode_stop_Callback_RESOLVER_STRING_1_double";
 
-Native_OscillatorNode__stop_2_Callback(mthis) native "OscillatorNode_stop_Callback_RESOLVER_STRING_0_";
+  static $_stop_2_Callback(mthis) native "OscillatorNode_stop_Callback_RESOLVER_STRING_0_";
+}
 
-Native_OverflowEvent_horizontalOverflow_Getter(mthis) native "OverflowEvent_horizontalOverflow_Getter";
+class BlinkOverflowEvent {
+  static $horizontalOverflow_Getter(mthis) native "OverflowEvent_horizontalOverflow_Getter";
 
-Native_OverflowEvent_orient_Getter(mthis) native "OverflowEvent_orient_Getter";
+  static $orient_Getter(mthis) native "OverflowEvent_orient_Getter";
 
-Native_OverflowEvent_verticalOverflow_Getter(mthis) native "OverflowEvent_verticalOverflow_Getter";
+  static $verticalOverflow_Getter(mthis) native "OverflowEvent_verticalOverflow_Getter";
+}
 
-Native_PageTransitionEvent_persisted_Getter(mthis) native "PageTransitionEvent_persisted_Getter";
+class BlinkPagePopupController {}
 
-Native_PannerNode_coneInnerAngle_Getter(mthis) native "PannerNode_coneInnerAngle_Getter";
+class BlinkPageTransitionEvent {
+  static $persisted_Getter(mthis) native "PageTransitionEvent_persisted_Getter";
+}
 
-Native_PannerNode_coneInnerAngle_Setter(mthis, value) native "PannerNode_coneInnerAngle_Setter";
+class BlinkPannerNode {
+  static $coneInnerAngle_Getter(mthis) native "PannerNode_coneInnerAngle_Getter";
 
-Native_PannerNode_coneOuterAngle_Getter(mthis) native "PannerNode_coneOuterAngle_Getter";
+  static $coneInnerAngle_Setter(mthis, value) native "PannerNode_coneInnerAngle_Setter";
 
-Native_PannerNode_coneOuterAngle_Setter(mthis, value) native "PannerNode_coneOuterAngle_Setter";
+  static $coneOuterAngle_Getter(mthis) native "PannerNode_coneOuterAngle_Getter";
 
-Native_PannerNode_coneOuterGain_Getter(mthis) native "PannerNode_coneOuterGain_Getter";
+  static $coneOuterAngle_Setter(mthis, value) native "PannerNode_coneOuterAngle_Setter";
 
-Native_PannerNode_coneOuterGain_Setter(mthis, value) native "PannerNode_coneOuterGain_Setter";
+  static $coneOuterGain_Getter(mthis) native "PannerNode_coneOuterGain_Getter";
 
-Native_PannerNode_distanceModel_Getter(mthis) native "PannerNode_distanceModel_Getter";
+  static $coneOuterGain_Setter(mthis, value) native "PannerNode_coneOuterGain_Setter";
 
-Native_PannerNode_distanceModel_Setter(mthis, value) native "PannerNode_distanceModel_Setter";
+  static $distanceModel_Getter(mthis) native "PannerNode_distanceModel_Getter";
 
-Native_PannerNode_maxDistance_Getter(mthis) native "PannerNode_maxDistance_Getter";
+  static $distanceModel_Setter(mthis, value) native "PannerNode_distanceModel_Setter";
 
-Native_PannerNode_maxDistance_Setter(mthis, value) native "PannerNode_maxDistance_Setter";
+  static $maxDistance_Getter(mthis) native "PannerNode_maxDistance_Getter";
 
-Native_PannerNode_panningModel_Getter(mthis) native "PannerNode_panningModel_Getter";
+  static $maxDistance_Setter(mthis, value) native "PannerNode_maxDistance_Setter";
 
-Native_PannerNode_panningModel_Setter(mthis, value) native "PannerNode_panningModel_Setter";
+  static $panningModel_Getter(mthis) native "PannerNode_panningModel_Getter";
 
-Native_PannerNode_refDistance_Getter(mthis) native "PannerNode_refDistance_Getter";
+  static $panningModel_Setter(mthis, value) native "PannerNode_panningModel_Setter";
 
-Native_PannerNode_refDistance_Setter(mthis, value) native "PannerNode_refDistance_Setter";
+  static $refDistance_Getter(mthis) native "PannerNode_refDistance_Getter";
 
-Native_PannerNode_rolloffFactor_Getter(mthis) native "PannerNode_rolloffFactor_Getter";
+  static $refDistance_Setter(mthis, value) native "PannerNode_refDistance_Setter";
 
-Native_PannerNode_rolloffFactor_Setter(mthis, value) native "PannerNode_rolloffFactor_Setter";
+  static $rolloffFactor_Getter(mthis) native "PannerNode_rolloffFactor_Getter";
 
-Native_PannerNode_setOrientation_Callback(mthis, x, y, z) native "PannerNode_setOrientation_Callback_RESOLVER_STRING_3_float_float_float";
+  static $rolloffFactor_Setter(mthis, value) native "PannerNode_rolloffFactor_Setter";
 
-Native_PannerNode_setPosition_Callback(mthis, x, y, z) native "PannerNode_setPosition_Callback_RESOLVER_STRING_3_float_float_float";
+  static $setOrientation_Callback(mthis, x, y, z) native "PannerNode_setOrientation_Callback_RESOLVER_STRING_3_float_float_float";
 
-Native_PannerNode_setVelocity_Callback(mthis, x, y, z) native "PannerNode_setVelocity_Callback_RESOLVER_STRING_3_float_float_float";
+  static $setPosition_Callback(mthis, x, y, z) native "PannerNode_setPosition_Callback_RESOLVER_STRING_3_float_float_float";
 
+  static $setVelocity_Callback(mthis, x, y, z) native "PannerNode_setVelocity_Callback_RESOLVER_STRING_3_float_float_float";
+}
+
+class BlinkPath {
   // Generated overload resolver
-Native_Path_Path(path_OR_text) {
+  static $mkPath(path_OR_text) {
     if (path_OR_text == null) {
-      return Native_Path__create_1constructorCallback();
+      return $_create_1constructorCallback();
     }
     if ((path_OR_text is Path || path_OR_text == null)) {
-      return Native_Path__create_2constructorCallback(path_OR_text);
+      return $_create_2constructorCallback(path_OR_text);
     }
     if ((path_OR_text is String || path_OR_text == null)) {
-      return Native_Path__create_3constructorCallback(path_OR_text);
+      return $_create_3constructorCallback(path_OR_text);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Path__create_1constructorCallback() native "Path2D_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "Path2D_constructorCallback_RESOLVER_STRING_0_";
 
-Native_Path__create_2constructorCallback(path_OR_text) native "Path2D_constructorCallback_RESOLVER_STRING_1_Path2D";
+  static $_create_2constructorCallback(path_OR_text) native "Path2D_constructorCallback_RESOLVER_STRING_1_Path2D";
 
-Native_Path__create_3constructorCallback(path_OR_text) native "Path2D_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_3constructorCallback(path_OR_text) native "Path2D_constructorCallback_RESOLVER_STRING_1_DOMString";
 
-Native_Path_arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "Path2D_arc_Callback_RESOLVER_STRING_6_float_float_float_float_float_boolean";
+  static $arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "Path2D_arc_Callback_RESOLVER_STRING_6_float_float_float_float_float_boolean";
 
-Native_Path_arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "Path2D_arcTo_Callback_RESOLVER_STRING_5_float_float_float_float_float";
+  static $arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "Path2D_arcTo_Callback_RESOLVER_STRING_5_float_float_float_float_float";
 
-Native_Path_bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "Path2D_bezierCurveTo_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "Path2D_bezierCurveTo_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_Path_closePath_Callback(mthis) native "Path2D_closePath_Callback_RESOLVER_STRING_0_";
+  static $closePath_Callback(mthis) native "Path2D_closePath_Callback_RESOLVER_STRING_0_";
 
-Native_Path_lineTo_Callback(mthis, x, y) native "Path2D_lineTo_Callback_RESOLVER_STRING_2_float_float";
+  static $lineTo_Callback(mthis, x, y) native "Path2D_lineTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Path_moveTo_Callback(mthis, x, y) native "Path2D_moveTo_Callback_RESOLVER_STRING_2_float_float";
+  static $moveTo_Callback(mthis, x, y) native "Path2D_moveTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Path_quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "Path2D_quadraticCurveTo_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "Path2D_quadraticCurveTo_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_Path_rect_Callback(mthis, x, y, width, height) native "Path2D_rect_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $rect_Callback(mthis, x, y, width, height) native "Path2D_rect_Callback_RESOLVER_STRING_4_float_float_float_float";
+}
 
-Native_Performance_memory_Getter(mthis) native "Performance_memory_Getter";
+class BlinkPerformance {
+  static $memory_Getter(mthis) native "Performance_memory_Getter";
 
-Native_Performance_navigation_Getter(mthis) native "Performance_navigation_Getter";
+  static $navigation_Getter(mthis) native "Performance_navigation_Getter";
 
-Native_Performance_timing_Getter(mthis) native "Performance_timing_Getter";
+  static $timing_Getter(mthis) native "Performance_timing_Getter";
 
-Native_Performance_clearMarks_Callback(mthis, markName) native "Performance_clearMarks_Callback_RESOLVER_STRING_1_DOMString";
+  static $clearMarks_Callback(mthis, markName) native "Performance_clearMarks_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Performance_clearMeasures_Callback(mthis, measureName) native "Performance_clearMeasures_Callback_RESOLVER_STRING_1_DOMString";
+  static $clearMeasures_Callback(mthis, measureName) native "Performance_clearMeasures_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Performance_getEntries_Callback(mthis) native "Performance_getEntries_Callback_RESOLVER_STRING_0_";
+  static $getEntries_Callback(mthis) native "Performance_getEntries_Callback_RESOLVER_STRING_0_";
 
-Native_Performance_getEntriesByName_Callback(mthis, name, entryType) native "Performance_getEntriesByName_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $getEntriesByName_Callback(mthis, name, entryType) native "Performance_getEntriesByName_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Performance_getEntriesByType_Callback(mthis, entryType) native "Performance_getEntriesByType_Callback_RESOLVER_STRING_1_DOMString";
+  static $getEntriesByType_Callback(mthis, entryType) native "Performance_getEntriesByType_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Performance_mark_Callback(mthis, markName) native "Performance_mark_Callback_RESOLVER_STRING_1_DOMString";
+  static $mark_Callback(mthis, markName) native "Performance_mark_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Performance_measure_Callback(mthis, measureName, startMark, endMark) native "Performance_measure_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $measure_Callback(mthis, measureName, startMark, endMark) native "Performance_measure_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_Performance_now_Callback(mthis) native "Performance_now_Callback_RESOLVER_STRING_0_";
+  static $now_Callback(mthis) native "Performance_now_Callback_RESOLVER_STRING_0_";
 
-Native_Performance_webkitClearResourceTimings_Callback(mthis) native "Performance_webkitClearResourceTimings_Callback_RESOLVER_STRING_0_";
+  static $webkitClearResourceTimings_Callback(mthis) native "Performance_webkitClearResourceTimings_Callback_RESOLVER_STRING_0_";
 
-Native_Performance_webkitSetResourceTimingBufferSize_Callback(mthis, maxSize) native "Performance_webkitSetResourceTimingBufferSize_Callback_RESOLVER_STRING_1_unsigned long";
+  static $webkitSetResourceTimingBufferSize_Callback(mthis, maxSize) native "Performance_webkitSetResourceTimingBufferSize_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_PerformanceEntry_duration_Getter(mthis) native "PerformanceEntry_duration_Getter";
+class BlinkPerformanceEntry {
+  static $duration_Getter(mthis) native "PerformanceEntry_duration_Getter";
 
-Native_PerformanceEntry_entryType_Getter(mthis) native "PerformanceEntry_entryType_Getter";
+  static $entryType_Getter(mthis) native "PerformanceEntry_entryType_Getter";
 
-Native_PerformanceEntry_name_Getter(mthis) native "PerformanceEntry_name_Getter";
+  static $name_Getter(mthis) native "PerformanceEntry_name_Getter";
 
-Native_PerformanceEntry_startTime_Getter(mthis) native "PerformanceEntry_startTime_Getter";
+  static $startTime_Getter(mthis) native "PerformanceEntry_startTime_Getter";
+}
 
-Native_PerformanceNavigation_redirectCount_Getter(mthis) native "PerformanceNavigation_redirectCount_Getter";
+class BlinkPerformanceMark {}
 
-Native_PerformanceNavigation_type_Getter(mthis) native "PerformanceNavigation_type_Getter";
+class BlinkPerformanceMeasure {}
 
-Native_PerformanceResourceTiming_connectEnd_Getter(mthis) native "PerformanceResourceTiming_connectEnd_Getter";
+class BlinkPerformanceNavigation {
+  static $redirectCount_Getter(mthis) native "PerformanceNavigation_redirectCount_Getter";
 
-Native_PerformanceResourceTiming_connectStart_Getter(mthis) native "PerformanceResourceTiming_connectStart_Getter";
+  static $type_Getter(mthis) native "PerformanceNavigation_type_Getter";
+}
 
-Native_PerformanceResourceTiming_domainLookupEnd_Getter(mthis) native "PerformanceResourceTiming_domainLookupEnd_Getter";
+class BlinkPerformanceResourceTiming {
+  static $connectEnd_Getter(mthis) native "PerformanceResourceTiming_connectEnd_Getter";
 
-Native_PerformanceResourceTiming_domainLookupStart_Getter(mthis) native "PerformanceResourceTiming_domainLookupStart_Getter";
+  static $connectStart_Getter(mthis) native "PerformanceResourceTiming_connectStart_Getter";
 
-Native_PerformanceResourceTiming_fetchStart_Getter(mthis) native "PerformanceResourceTiming_fetchStart_Getter";
+  static $domainLookupEnd_Getter(mthis) native "PerformanceResourceTiming_domainLookupEnd_Getter";
 
-Native_PerformanceResourceTiming_initiatorType_Getter(mthis) native "PerformanceResourceTiming_initiatorType_Getter";
+  static $domainLookupStart_Getter(mthis) native "PerformanceResourceTiming_domainLookupStart_Getter";
 
-Native_PerformanceResourceTiming_redirectEnd_Getter(mthis) native "PerformanceResourceTiming_redirectEnd_Getter";
+  static $fetchStart_Getter(mthis) native "PerformanceResourceTiming_fetchStart_Getter";
 
-Native_PerformanceResourceTiming_redirectStart_Getter(mthis) native "PerformanceResourceTiming_redirectStart_Getter";
+  static $initiatorType_Getter(mthis) native "PerformanceResourceTiming_initiatorType_Getter";
 
-Native_PerformanceResourceTiming_requestStart_Getter(mthis) native "PerformanceResourceTiming_requestStart_Getter";
+  static $redirectEnd_Getter(mthis) native "PerformanceResourceTiming_redirectEnd_Getter";
 
-Native_PerformanceResourceTiming_responseEnd_Getter(mthis) native "PerformanceResourceTiming_responseEnd_Getter";
+  static $redirectStart_Getter(mthis) native "PerformanceResourceTiming_redirectStart_Getter";
 
-Native_PerformanceResourceTiming_responseStart_Getter(mthis) native "PerformanceResourceTiming_responseStart_Getter";
+  static $requestStart_Getter(mthis) native "PerformanceResourceTiming_requestStart_Getter";
 
-Native_PerformanceResourceTiming_secureConnectionStart_Getter(mthis) native "PerformanceResourceTiming_secureConnectionStart_Getter";
+  static $responseEnd_Getter(mthis) native "PerformanceResourceTiming_responseEnd_Getter";
 
-Native_PerformanceTiming_connectEnd_Getter(mthis) native "PerformanceTiming_connectEnd_Getter";
+  static $responseStart_Getter(mthis) native "PerformanceResourceTiming_responseStart_Getter";
 
-Native_PerformanceTiming_connectStart_Getter(mthis) native "PerformanceTiming_connectStart_Getter";
+  static $secureConnectionStart_Getter(mthis) native "PerformanceResourceTiming_secureConnectionStart_Getter";
+}
 
-Native_PerformanceTiming_domComplete_Getter(mthis) native "PerformanceTiming_domComplete_Getter";
+class BlinkPerformanceTiming {
+  static $connectEnd_Getter(mthis) native "PerformanceTiming_connectEnd_Getter";
 
-Native_PerformanceTiming_domContentLoadedEventEnd_Getter(mthis) native "PerformanceTiming_domContentLoadedEventEnd_Getter";
+  static $connectStart_Getter(mthis) native "PerformanceTiming_connectStart_Getter";
 
-Native_PerformanceTiming_domContentLoadedEventStart_Getter(mthis) native "PerformanceTiming_domContentLoadedEventStart_Getter";
+  static $domComplete_Getter(mthis) native "PerformanceTiming_domComplete_Getter";
 
-Native_PerformanceTiming_domInteractive_Getter(mthis) native "PerformanceTiming_domInteractive_Getter";
+  static $domContentLoadedEventEnd_Getter(mthis) native "PerformanceTiming_domContentLoadedEventEnd_Getter";
 
-Native_PerformanceTiming_domLoading_Getter(mthis) native "PerformanceTiming_domLoading_Getter";
+  static $domContentLoadedEventStart_Getter(mthis) native "PerformanceTiming_domContentLoadedEventStart_Getter";
 
-Native_PerformanceTiming_domainLookupEnd_Getter(mthis) native "PerformanceTiming_domainLookupEnd_Getter";
+  static $domInteractive_Getter(mthis) native "PerformanceTiming_domInteractive_Getter";
 
-Native_PerformanceTiming_domainLookupStart_Getter(mthis) native "PerformanceTiming_domainLookupStart_Getter";
+  static $domLoading_Getter(mthis) native "PerformanceTiming_domLoading_Getter";
 
-Native_PerformanceTiming_fetchStart_Getter(mthis) native "PerformanceTiming_fetchStart_Getter";
+  static $domainLookupEnd_Getter(mthis) native "PerformanceTiming_domainLookupEnd_Getter";
 
-Native_PerformanceTiming_loadEventEnd_Getter(mthis) native "PerformanceTiming_loadEventEnd_Getter";
+  static $domainLookupStart_Getter(mthis) native "PerformanceTiming_domainLookupStart_Getter";
+
+  static $fetchStart_Getter(mthis) native "PerformanceTiming_fetchStart_Getter";
+
+  static $loadEventEnd_Getter(mthis) native "PerformanceTiming_loadEventEnd_Getter";
+
+  static $loadEventStart_Getter(mthis) native "PerformanceTiming_loadEventStart_Getter";
+
+  static $navigationStart_Getter(mthis) native "PerformanceTiming_navigationStart_Getter";
 
-Native_PerformanceTiming_loadEventStart_Getter(mthis) native "PerformanceTiming_loadEventStart_Getter";
+  static $redirectEnd_Getter(mthis) native "PerformanceTiming_redirectEnd_Getter";
 
-Native_PerformanceTiming_navigationStart_Getter(mthis) native "PerformanceTiming_navigationStart_Getter";
+  static $redirectStart_Getter(mthis) native "PerformanceTiming_redirectStart_Getter";
 
-Native_PerformanceTiming_redirectEnd_Getter(mthis) native "PerformanceTiming_redirectEnd_Getter";
+  static $requestStart_Getter(mthis) native "PerformanceTiming_requestStart_Getter";
 
-Native_PerformanceTiming_redirectStart_Getter(mthis) native "PerformanceTiming_redirectStart_Getter";
+  static $responseEnd_Getter(mthis) native "PerformanceTiming_responseEnd_Getter";
 
-Native_PerformanceTiming_requestStart_Getter(mthis) native "PerformanceTiming_requestStart_Getter";
+  static $responseStart_Getter(mthis) native "PerformanceTiming_responseStart_Getter";
 
-Native_PerformanceTiming_responseEnd_Getter(mthis) native "PerformanceTiming_responseEnd_Getter";
+  static $secureConnectionStart_Getter(mthis) native "PerformanceTiming_secureConnectionStart_Getter";
 
-Native_PerformanceTiming_responseStart_Getter(mthis) native "PerformanceTiming_responseStart_Getter";
+  static $unloadEventEnd_Getter(mthis) native "PerformanceTiming_unloadEventEnd_Getter";
 
-Native_PerformanceTiming_secureConnectionStart_Getter(mthis) native "PerformanceTiming_secureConnectionStart_Getter";
+  static $unloadEventStart_Getter(mthis) native "PerformanceTiming_unloadEventStart_Getter";
+}
 
-Native_PerformanceTiming_unloadEventEnd_Getter(mthis) native "PerformanceTiming_unloadEventEnd_Getter";
+class BlinkPeriodicWave {}
 
-Native_PerformanceTiming_unloadEventStart_Getter(mthis) native "PerformanceTiming_unloadEventStart_Getter";
+class BlinkPlayer {
+  static $currentTime_Getter(mthis) native "AnimationPlayer_currentTime_Getter";
 
-Native_Player_currentTime_Getter(mthis) native "AnimationPlayer_currentTime_Getter";
+  static $currentTime_Setter(mthis, value) native "AnimationPlayer_currentTime_Setter";
 
-Native_Player_currentTime_Setter(mthis, value) native "AnimationPlayer_currentTime_Setter";
+  static $finished_Getter(mthis) native "AnimationPlayer_finished_Getter";
 
-Native_Player_finished_Getter(mthis) native "AnimationPlayer_finished_Getter";
+  static $paused_Getter(mthis) native "AnimationPlayer_paused_Getter";
 
-Native_Player_paused_Getter(mthis) native "AnimationPlayer_paused_Getter";
+  static $playbackRate_Getter(mthis) native "AnimationPlayer_playbackRate_Getter";
 
-Native_Player_playbackRate_Getter(mthis) native "AnimationPlayer_playbackRate_Getter";
+  static $playbackRate_Setter(mthis, value) native "AnimationPlayer_playbackRate_Setter";
 
-Native_Player_playbackRate_Setter(mthis, value) native "AnimationPlayer_playbackRate_Setter";
+  static $source_Getter(mthis) native "AnimationPlayer_source_Getter";
 
-Native_Player_source_Getter(mthis) native "AnimationPlayer_source_Getter";
+  static $source_Setter(mthis, value) native "AnimationPlayer_source_Setter";
 
-Native_Player_source_Setter(mthis, value) native "AnimationPlayer_source_Setter";
+  static $startTime_Getter(mthis) native "AnimationPlayer_startTime_Getter";
 
-Native_Player_startTime_Getter(mthis) native "AnimationPlayer_startTime_Getter";
+  static $startTime_Setter(mthis, value) native "AnimationPlayer_startTime_Setter";
 
-Native_Player_startTime_Setter(mthis, value) native "AnimationPlayer_startTime_Setter";
+  static $timeLag_Getter(mthis) native "AnimationPlayer_timeLag_Getter";
 
-Native_Player_timeLag_Getter(mthis) native "AnimationPlayer_timeLag_Getter";
+  static $cancel_Callback(mthis) native "AnimationPlayer_cancel_Callback_RESOLVER_STRING_0_";
 
-Native_Player_cancel_Callback(mthis) native "AnimationPlayer_cancel_Callback_RESOLVER_STRING_0_";
+  static $finish_Callback(mthis) native "AnimationPlayer_finish_Callback_RESOLVER_STRING_0_";
 
-Native_Player_finish_Callback(mthis) native "AnimationPlayer_finish_Callback_RESOLVER_STRING_0_";
+  static $pause_Callback(mthis) native "AnimationPlayer_pause_Callback_RESOLVER_STRING_0_";
 
-Native_Player_pause_Callback(mthis) native "AnimationPlayer_pause_Callback_RESOLVER_STRING_0_";
+  static $play_Callback(mthis) native "AnimationPlayer_play_Callback_RESOLVER_STRING_0_";
 
-Native_Player_play_Callback(mthis) native "AnimationPlayer_play_Callback_RESOLVER_STRING_0_";
+  static $reverse_Callback(mthis) native "AnimationPlayer_reverse_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Player_reverse_Callback(mthis) native "AnimationPlayer_reverse_Callback_RESOLVER_STRING_0_";
+class BlinkPlugin {
+  static $description_Getter(mthis) native "Plugin_description_Getter";
 
-Native_Plugin_description_Getter(mthis) native "Plugin_description_Getter";
+  static $filename_Getter(mthis) native "Plugin_filename_Getter";
 
-Native_Plugin_filename_Getter(mthis) native "Plugin_filename_Getter";
+  static $length_Getter(mthis) native "Plugin_length_Getter";
 
-Native_Plugin_length_Getter(mthis) native "Plugin_length_Getter";
+  static $name_Getter(mthis) native "Plugin_name_Getter";
 
-Native_Plugin_name_Getter(mthis) native "Plugin_name_Getter";
+  static $__getter___Callback(mthis, name) native "Plugin___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Plugin___getter___Callback(mthis, name) native "Plugin___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $item_Callback(mthis, index) native "Plugin_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Plugin_item_Callback(mthis, index) native "Plugin_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $namedItem_Callback(mthis, name) native "Plugin_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_Plugin_namedItem_Callback(mthis, name) native "Plugin_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkPluginArray {
+  static $length_Getter(mthis) native "PluginArray_length_Getter";
 
-Native_PluginArray_length_Getter(mthis) native "PluginArray_length_Getter";
+  static $NativeIndexed_Getter(mthis, index) native "PluginArray_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_PluginArray_NativeIndexed_Getter(mthis, index) native "PluginArray_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $__getter___Callback(mthis, name) native "PluginArray___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_PluginArray___getter___Callback(mthis, name) native "PluginArray___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $item_Callback(mthis, index) native "PluginArray_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_PluginArray_item_Callback(mthis, index) native "PluginArray_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $namedItem_Callback(mthis, name) native "PluginArray_namedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_PluginArray_namedItem_Callback(mthis, name) native "PluginArray_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $refresh_Callback(mthis, reload) native "PluginArray_refresh_Callback_RESOLVER_STRING_1_boolean";
+}
 
-Native_PluginArray_refresh_Callback(mthis, reload) native "PluginArray_refresh_Callback_RESOLVER_STRING_1_boolean";
+class BlinkPopStateEvent {
+  static $state_Getter(mthis) native "PopStateEvent_state_Getter";
+}
 
-Native_PopStateEvent_state_Getter(mthis) native "PopStateEvent_state_Getter";
+class BlinkPositionError {
+  static $code_Getter(mthis) native "PositionError_code_Getter";
 
-Native_PositionError_code_Getter(mthis) native "PositionError_code_Getter";
+  static $message_Getter(mthis) native "PositionError_message_Getter";
+}
 
-Native_PositionError_message_Getter(mthis) native "PositionError_message_Getter";
+class BlinkProcessingInstruction {
+  static $sheet_Getter(mthis) native "ProcessingInstruction_sheet_Getter";
 
-Native_ProcessingInstruction_sheet_Getter(mthis) native "ProcessingInstruction_sheet_Getter";
+  static $target_Getter(mthis) native "ProcessingInstruction_target_Getter";
+}
 
-Native_ProcessingInstruction_target_Getter(mthis) native "ProcessingInstruction_target_Getter";
+class BlinkProgressEvent {
+  static $lengthComputable_Getter(mthis) native "ProgressEvent_lengthComputable_Getter";
 
-Native_ProgressEvent_lengthComputable_Getter(mthis) native "ProgressEvent_lengthComputable_Getter";
+  static $loaded_Getter(mthis) native "ProgressEvent_loaded_Getter";
 
-Native_ProgressEvent_loaded_Getter(mthis) native "ProgressEvent_loaded_Getter";
+  static $total_Getter(mthis) native "ProgressEvent_total_Getter";
+}
 
-Native_ProgressEvent_total_Getter(mthis) native "ProgressEvent_total_Getter";
+class BlinkRGBColor {}
 
-Native_RTCDTMFSender_canInsertDTMF_Getter(mthis) native "RTCDTMFSender_canInsertDTMF_Getter";
+class BlinkRTCDTMFSender {
+  static $canInsertDTMF_Getter(mthis) native "RTCDTMFSender_canInsertDTMF_Getter";
 
-Native_RTCDTMFSender_duration_Getter(mthis) native "RTCDTMFSender_duration_Getter";
+  static $duration_Getter(mthis) native "RTCDTMFSender_duration_Getter";
 
-Native_RTCDTMFSender_interToneGap_Getter(mthis) native "RTCDTMFSender_interToneGap_Getter";
+  static $interToneGap_Getter(mthis) native "RTCDTMFSender_interToneGap_Getter";
 
-Native_RTCDTMFSender_toneBuffer_Getter(mthis) native "RTCDTMFSender_toneBuffer_Getter";
+  static $toneBuffer_Getter(mthis) native "RTCDTMFSender_toneBuffer_Getter";
 
-Native_RTCDTMFSender_track_Getter(mthis) native "RTCDTMFSender_track_Getter";
+  static $track_Getter(mthis) native "RTCDTMFSender_track_Getter";
 
   // Generated overload resolver
-Native_RTCDTMFSender_insertDtmf(mthis, tones, duration, interToneGap) {
+  static $insertDtmf(mthis, tones, duration, interToneGap) {
     if (interToneGap != null) {
-      Native_RTCDTMFSender__insertDTMF_1_Callback(mthis, tones, duration, interToneGap);
+      $_insertDTMF_1_Callback(mthis, tones, duration, interToneGap);
       return;
     }
     if (duration != null) {
-      Native_RTCDTMFSender__insertDTMF_2_Callback(mthis, tones, duration);
+      $_insertDTMF_2_Callback(mthis, tones, duration);
       return;
     }
-    Native_RTCDTMFSender__insertDTMF_3_Callback(mthis, tones);
+    $_insertDTMF_3_Callback(mthis, tones);
     return;
   }
 
-Native_RTCDTMFSender__insertDTMF_1_Callback(mthis, tones, duration, interToneGap) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_3_DOMString_long_long";
+  static $_insertDTMF_1_Callback(mthis, tones, duration, interToneGap) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_3_DOMString_long_long";
 
-Native_RTCDTMFSender__insertDTMF_2_Callback(mthis, tones, duration) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_2_DOMString_long";
+  static $_insertDTMF_2_Callback(mthis, tones, duration) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_2_DOMString_long";
 
-Native_RTCDTMFSender__insertDTMF_3_Callback(mthis, tones) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_1_DOMString";
+  static $_insertDTMF_3_Callback(mthis, tones) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_RTCDTMFToneChangeEvent_tone_Getter(mthis) native "RTCDTMFToneChangeEvent_tone_Getter";
+class BlinkRTCDTMFToneChangeEvent {
+  static $tone_Getter(mthis) native "RTCDTMFToneChangeEvent_tone_Getter";
+}
 
-Native_RTCDataChannel_binaryType_Getter(mthis) native "RTCDataChannel_binaryType_Getter";
+class BlinkRTCDataChannel {
+  static $binaryType_Getter(mthis) native "RTCDataChannel_binaryType_Getter";
 
-Native_RTCDataChannel_binaryType_Setter(mthis, value) native "RTCDataChannel_binaryType_Setter";
+  static $binaryType_Setter(mthis, value) native "RTCDataChannel_binaryType_Setter";
 
-Native_RTCDataChannel_bufferedAmount_Getter(mthis) native "RTCDataChannel_bufferedAmount_Getter";
+  static $bufferedAmount_Getter(mthis) native "RTCDataChannel_bufferedAmount_Getter";
 
-Native_RTCDataChannel_id_Getter(mthis) native "RTCDataChannel_id_Getter";
+  static $id_Getter(mthis) native "RTCDataChannel_id_Getter";
 
-Native_RTCDataChannel_label_Getter(mthis) native "RTCDataChannel_label_Getter";
+  static $label_Getter(mthis) native "RTCDataChannel_label_Getter";
 
-Native_RTCDataChannel_maxRetransmitTime_Getter(mthis) native "RTCDataChannel_maxRetransmitTime_Getter";
+  static $maxRetransmitTime_Getter(mthis) native "RTCDataChannel_maxRetransmitTime_Getter";
 
-Native_RTCDataChannel_maxRetransmits_Getter(mthis) native "RTCDataChannel_maxRetransmits_Getter";
+  static $maxRetransmits_Getter(mthis) native "RTCDataChannel_maxRetransmits_Getter";
 
-Native_RTCDataChannel_negotiated_Getter(mthis) native "RTCDataChannel_negotiated_Getter";
+  static $negotiated_Getter(mthis) native "RTCDataChannel_negotiated_Getter";
 
-Native_RTCDataChannel_ordered_Getter(mthis) native "RTCDataChannel_ordered_Getter";
+  static $ordered_Getter(mthis) native "RTCDataChannel_ordered_Getter";
 
-Native_RTCDataChannel_protocol_Getter(mthis) native "RTCDataChannel_protocol_Getter";
+  static $protocol_Getter(mthis) native "RTCDataChannel_protocol_Getter";
 
-Native_RTCDataChannel_readyState_Getter(mthis) native "RTCDataChannel_readyState_Getter";
+  static $readyState_Getter(mthis) native "RTCDataChannel_readyState_Getter";
 
-Native_RTCDataChannel_reliable_Getter(mthis) native "RTCDataChannel_reliable_Getter";
+  static $reliable_Getter(mthis) native "RTCDataChannel_reliable_Getter";
 
-Native_RTCDataChannel_close_Callback(mthis) native "RTCDataChannel_close_Callback_RESOLVER_STRING_0_";
+  static $close_Callback(mthis) native "RTCDataChannel_close_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_RTCDataChannel_send(mthis, data) {
+  static $send(mthis, data) {
     if ((data is TypedData || data == null)) {
-      Native_RTCDataChannel__send_1_Callback(mthis, data);
+      $_send_1_Callback(mthis, data);
       return;
     }
     if ((data is ByteBuffer || data == null)) {
-      Native_RTCDataChannel__send_2_Callback(mthis, data);
+      $_send_2_Callback(mthis, data);
       return;
     }
     if ((data is Blob || data == null)) {
-      Native_RTCDataChannel__send_3_Callback(mthis, data);
+      $_send_3_Callback(mthis, data);
       return;
     }
     if ((data is String || data == null)) {
-      Native_RTCDataChannel__send_4_Callback(mthis, data);
+      $_send_4_Callback(mthis, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_RTCDataChannel__send_1_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
+  static $_send_1_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
 
-Native_RTCDataChannel__send_2_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
+  static $_send_2_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
-Native_RTCDataChannel__send_3_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_Blob";
+  static $_send_3_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_Blob";
 
-Native_RTCDataChannel__send_4_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_DOMString";
+  static $_send_4_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCDataChannel_sendBlob_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_Blob";
+  static $sendBlob_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_Blob";
 
-Native_RTCDataChannel_sendByteBuffer_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
+  static $sendByteBuffer_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
-Native_RTCDataChannel_sendString_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_DOMString";
+  static $sendString_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCDataChannel_sendTypedData_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
+  static $sendTypedData_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
+}
 
-Native_RTCDataChannelEvent_channel_Getter(mthis) native "RTCDataChannelEvent_channel_Getter";
+class BlinkRTCDataChannelEvent {
+  static $channel_Getter(mthis) native "RTCDataChannelEvent_channel_Getter";
+}
 
+class BlinkRTCIceCandidate {
   // Generated overload resolver
-Native_RTCIceCandidate_RtcIceCandidate(dictionary) {
-    return Native_RTCIceCandidate__create_1constructorCallback(dictionary);
+  static $mkRtcIceCandidate(dictionary) {
+    return $_create_1constructorCallback(dictionary);
   }
 
-Native_RTCIceCandidate__create_1constructorCallback(dictionary) native "RTCIceCandidate_constructorCallback_RESOLVER_STRING_1_Dictionary";
+  static $_create_1constructorCallback(dictionary) native "RTCIceCandidate_constructorCallback_RESOLVER_STRING_1_Dictionary";
 
-Native_RTCIceCandidate_candidate_Getter(mthis) native "RTCIceCandidate_candidate_Getter";
+  static $candidate_Getter(mthis) native "RTCIceCandidate_candidate_Getter";
 
-Native_RTCIceCandidate_sdpMLineIndex_Getter(mthis) native "RTCIceCandidate_sdpMLineIndex_Getter";
+  static $sdpMLineIndex_Getter(mthis) native "RTCIceCandidate_sdpMLineIndex_Getter";
 
-Native_RTCIceCandidate_sdpMid_Getter(mthis) native "RTCIceCandidate_sdpMid_Getter";
+  static $sdpMid_Getter(mthis) native "RTCIceCandidate_sdpMid_Getter";
+}
 
-Native_RTCIceCandidateEvent_candidate_Getter(mthis) native "RTCIceCandidateEvent_candidate_Getter";
+class BlinkRTCIceCandidateEvent {
+  static $candidate_Getter(mthis) native "RTCIceCandidateEvent_candidate_Getter";
+}
 
+class BlinkRTCPeerConnection {
   // Generated overload resolver
-Native_RTCPeerConnection_RtcPeerConnection(rtcIceServers, mediaConstraints) {
-    return Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints);
+  static $mkRtcPeerConnection(rtcIceServers, mediaConstraints) {
+    return $_create_1constructorCallback(rtcIceServers, mediaConstraints);
   }
 
-Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints) native "RTCPeerConnection_constructorCallback_RESOLVER_STRING_2_Dictionary_Dictionary";
+  static $_create_1constructorCallback(rtcIceServers, mediaConstraints) native "RTCPeerConnection_constructorCallback_RESOLVER_STRING_2_Dictionary_Dictionary";
 
-Native_RTCPeerConnection_iceConnectionState_Getter(mthis) native "RTCPeerConnection_iceConnectionState_Getter";
+  static $iceConnectionState_Getter(mthis) native "RTCPeerConnection_iceConnectionState_Getter";
 
-Native_RTCPeerConnection_iceGatheringState_Getter(mthis) native "RTCPeerConnection_iceGatheringState_Getter";
+  static $iceGatheringState_Getter(mthis) native "RTCPeerConnection_iceGatheringState_Getter";
 
-Native_RTCPeerConnection_localDescription_Getter(mthis) native "RTCPeerConnection_localDescription_Getter";
+  static $localDescription_Getter(mthis) native "RTCPeerConnection_localDescription_Getter";
 
-Native_RTCPeerConnection_remoteDescription_Getter(mthis) native "RTCPeerConnection_remoteDescription_Getter";
+  static $remoteDescription_Getter(mthis) native "RTCPeerConnection_remoteDescription_Getter";
 
-Native_RTCPeerConnection_signalingState_Getter(mthis) native "RTCPeerConnection_signalingState_Getter";
+  static $signalingState_Getter(mthis) native "RTCPeerConnection_signalingState_Getter";
 
-Native_RTCPeerConnection_addIceCandidate_Callback(mthis, candidate, successCallback, failureCallback) native "RTCPeerConnection_addIceCandidate_Callback_RESOLVER_STRING_3_RTCIceCandidate_VoidCallback_RTCErrorCallback";
+  static $addIceCandidate_Callback(mthis, candidate, successCallback, failureCallback) native "RTCPeerConnection_addIceCandidate_Callback_RESOLVER_STRING_3_RTCIceCandidate_VoidCallback_RTCErrorCallback";
 
-Native_RTCPeerConnection_addStream_Callback(mthis, stream, mediaConstraints) native "RTCPeerConnection_addStream_Callback_RESOLVER_STRING_2_MediaStream_Dictionary";
+  static $addStream_Callback(mthis, stream, mediaConstraints) native "RTCPeerConnection_addStream_Callback_RESOLVER_STRING_2_MediaStream_Dictionary";
 
-Native_RTCPeerConnection_close_Callback(mthis) native "RTCPeerConnection_close_Callback_RESOLVER_STRING_0_";
+  static $close_Callback(mthis) native "RTCPeerConnection_close_Callback_RESOLVER_STRING_0_";
 
-Native_RTCPeerConnection_createAnswer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createAnswer_Callback_RESOLVER_STRING_3_RTCSessionDescriptionCallback_RTCErrorCallback_Dictionary";
+  static $createAnswer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createAnswer_Callback_RESOLVER_STRING_3_RTCSessionDescriptionCallback_RTCErrorCallback_Dictionary";
 
-Native_RTCPeerConnection_createDTMFSender_Callback(mthis, track) native "RTCPeerConnection_createDTMFSender_Callback_RESOLVER_STRING_1_MediaStreamTrack";
+  static $createDTMFSender_Callback(mthis, track) native "RTCPeerConnection_createDTMFSender_Callback_RESOLVER_STRING_1_MediaStreamTrack";
 
-Native_RTCPeerConnection_createDataChannel_Callback(mthis, label, options) native "RTCPeerConnection_createDataChannel_Callback_RESOLVER_STRING_2_DOMString_Dictionary";
+  static $createDataChannel_Callback(mthis, label, options) native "RTCPeerConnection_createDataChannel_Callback_RESOLVER_STRING_2_DOMString_Dictionary";
 
-Native_RTCPeerConnection_createOffer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createOffer_Callback_RESOLVER_STRING_3_RTCSessionDescriptionCallback_RTCErrorCallback_Dictionary";
+  static $createOffer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createOffer_Callback_RESOLVER_STRING_3_RTCSessionDescriptionCallback_RTCErrorCallback_Dictionary";
 
-Native_RTCPeerConnection_getLocalStreams_Callback(mthis) native "RTCPeerConnection_getLocalStreams_Callback_RESOLVER_STRING_0_";
+  static $getLocalStreams_Callback(mthis) native "RTCPeerConnection_getLocalStreams_Callback_RESOLVER_STRING_0_";
 
-Native_RTCPeerConnection_getRemoteStreams_Callback(mthis) native "RTCPeerConnection_getRemoteStreams_Callback_RESOLVER_STRING_0_";
+  static $getRemoteStreams_Callback(mthis) native "RTCPeerConnection_getRemoteStreams_Callback_RESOLVER_STRING_0_";
 
-Native_RTCPeerConnection_getStats_Callback(mthis, successCallback, selector) native "RTCPeerConnection_getStats_Callback_RESOLVER_STRING_2_RTCStatsCallback_MediaStreamTrack";
+  static $getStats_Callback(mthis, successCallback, selector) native "RTCPeerConnection_getStats_Callback_RESOLVER_STRING_2_RTCStatsCallback_MediaStreamTrack";
 
-Native_RTCPeerConnection_getStreamById_Callback(mthis, streamId) native "RTCPeerConnection_getStreamById_Callback_RESOLVER_STRING_1_DOMString";
+  static $getStreamById_Callback(mthis, streamId) native "RTCPeerConnection_getStreamById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCPeerConnection_removeStream_Callback(mthis, stream) native "RTCPeerConnection_removeStream_Callback_RESOLVER_STRING_1_MediaStream";
+  static $removeStream_Callback(mthis, stream) native "RTCPeerConnection_removeStream_Callback_RESOLVER_STRING_1_MediaStream";
 
-Native_RTCPeerConnection_setLocalDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setLocalDescription_Callback_RESOLVER_STRING_3_RTCSessionDescription_VoidCallback_RTCErrorCallback";
+  static $setLocalDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setLocalDescription_Callback_RESOLVER_STRING_3_RTCSessionDescription_VoidCallback_RTCErrorCallback";
 
-Native_RTCPeerConnection_setRemoteDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setRemoteDescription_Callback_RESOLVER_STRING_3_RTCSessionDescription_VoidCallback_RTCErrorCallback";
+  static $setRemoteDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setRemoteDescription_Callback_RESOLVER_STRING_3_RTCSessionDescription_VoidCallback_RTCErrorCallback";
 
-Native_RTCPeerConnection_updateIce_Callback(mthis, configuration, mediaConstraints) native "RTCPeerConnection_updateIce_Callback_RESOLVER_STRING_2_Dictionary_Dictionary";
+  static $updateIce_Callback(mthis, configuration, mediaConstraints) native "RTCPeerConnection_updateIce_Callback_RESOLVER_STRING_2_Dictionary_Dictionary";
+}
 
+class BlinkRTCSessionDescription {
   // Generated overload resolver
-Native_RTCSessionDescription_RtcSessionDescription(descriptionInitDict) {
-    return Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict);
+  static $mkRtcSessionDescription(descriptionInitDict) {
+    return $_create_1constructorCallback(descriptionInitDict);
   }
 
-Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict) native "RTCSessionDescription_constructorCallback_RESOLVER_STRING_1_Dictionary";
+  static $_create_1constructorCallback(descriptionInitDict) native "RTCSessionDescription_constructorCallback_RESOLVER_STRING_1_Dictionary";
 
-Native_RTCSessionDescription_sdp_Getter(mthis) native "RTCSessionDescription_sdp_Getter";
+  static $sdp_Getter(mthis) native "RTCSessionDescription_sdp_Getter";
 
-Native_RTCSessionDescription_sdp_Setter(mthis, value) native "RTCSessionDescription_sdp_Setter";
+  static $sdp_Setter(mthis, value) native "RTCSessionDescription_sdp_Setter";
 
-Native_RTCSessionDescription_type_Getter(mthis) native "RTCSessionDescription_type_Getter";
+  static $type_Getter(mthis) native "RTCSessionDescription_type_Getter";
 
-Native_RTCSessionDescription_type_Setter(mthis, value) native "RTCSessionDescription_type_Setter";
+  static $type_Setter(mthis, value) native "RTCSessionDescription_type_Setter";
+}
 
-Native_RTCStatsReport_id_Getter(mthis) native "RTCStatsReport_id_Getter";
+class BlinkRTCStatsReport {
+  static $id_Getter(mthis) native "RTCStatsReport_id_Getter";
 
-Native_RTCStatsReport_local_Getter(mthis) native "RTCStatsReport_local_Getter";
+  static $local_Getter(mthis) native "RTCStatsReport_local_Getter";
 
-Native_RTCStatsReport_remote_Getter(mthis) native "RTCStatsReport_remote_Getter";
+  static $remote_Getter(mthis) native "RTCStatsReport_remote_Getter";
 
-Native_RTCStatsReport_timestamp_Getter(mthis) native "RTCStatsReport_timestamp_Getter";
+  static $timestamp_Getter(mthis) native "RTCStatsReport_timestamp_Getter";
 
-Native_RTCStatsReport_type_Getter(mthis) native "RTCStatsReport_type_Getter";
+  static $type_Getter(mthis) native "RTCStatsReport_type_Getter";
 
-Native_RTCStatsReport_names_Callback(mthis) native "RTCStatsReport_names_Callback_RESOLVER_STRING_0_";
+  static $names_Callback(mthis) native "RTCStatsReport_names_Callback_RESOLVER_STRING_0_";
 
-Native_RTCStatsReport_stat_Callback(mthis, name) native "RTCStatsReport_stat_Callback_RESOLVER_STRING_1_DOMString";
+  static $stat_Callback(mthis, name) native "RTCStatsReport_stat_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_RTCStatsResponse___getter___Callback(mthis, name) native "RTCStatsResponse___getter___Callback_RESOLVER_STRING_1_DOMString";
+class BlinkRTCStatsResponse {
+  static $__getter___Callback(mthis, name) native "RTCStatsResponse___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCStatsResponse_namedItem_Callback(mthis, name) native "RTCStatsResponse_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $namedItem_Callback(mthis, name) native "RTCStatsResponse_namedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCStatsResponse_result_Callback(mthis) native "RTCStatsResponse_result_Callback_RESOLVER_STRING_0_";
+  static $result_Callback(mthis) native "RTCStatsResponse_result_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Range_collapsed_Getter(mthis) native "Range_collapsed_Getter";
+class BlinkRadioNodeList {}
 
-Native_Range_commonAncestorContainer_Getter(mthis) native "Range_commonAncestorContainer_Getter";
+class BlinkRange {
+  static $collapsed_Getter(mthis) native "Range_collapsed_Getter";
 
-Native_Range_endContainer_Getter(mthis) native "Range_endContainer_Getter";
+  static $commonAncestorContainer_Getter(mthis) native "Range_commonAncestorContainer_Getter";
 
-Native_Range_endOffset_Getter(mthis) native "Range_endOffset_Getter";
+  static $endContainer_Getter(mthis) native "Range_endContainer_Getter";
 
-Native_Range_startContainer_Getter(mthis) native "Range_startContainer_Getter";
+  static $endOffset_Getter(mthis) native "Range_endOffset_Getter";
 
-Native_Range_startOffset_Getter(mthis) native "Range_startOffset_Getter";
+  static $startContainer_Getter(mthis) native "Range_startContainer_Getter";
 
-Native_Range_cloneContents_Callback(mthis) native "Range_cloneContents_Callback_RESOLVER_STRING_0_";
+  static $startOffset_Getter(mthis) native "Range_startOffset_Getter";
 
-Native_Range_cloneRange_Callback(mthis) native "Range_cloneRange_Callback_RESOLVER_STRING_0_";
+  static $cloneContents_Callback(mthis) native "Range_cloneContents_Callback_RESOLVER_STRING_0_";
 
-Native_Range_collapse_Callback(mthis, toStart) native "Range_collapse_Callback_RESOLVER_STRING_1_boolean";
+  static $cloneRange_Callback(mthis) native "Range_cloneRange_Callback_RESOLVER_STRING_0_";
 
-Native_Range_comparePoint_Callback(mthis, refNode, offset) native "Range_comparePoint_Callback_RESOLVER_STRING_2_Node_long";
+  static $collapse_Callback(mthis, toStart) native "Range_collapse_Callback_RESOLVER_STRING_1_boolean";
 
-Native_Range_createContextualFragment_Callback(mthis, html) native "Range_createContextualFragment_Callback_RESOLVER_STRING_1_DOMString";
+  static $comparePoint_Callback(mthis, refNode, offset) native "Range_comparePoint_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Range_deleteContents_Callback(mthis) native "Range_deleteContents_Callback_RESOLVER_STRING_0_";
+  static $createContextualFragment_Callback(mthis, html) native "Range_createContextualFragment_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Range_detach_Callback(mthis) native "Range_detach_Callback_RESOLVER_STRING_0_";
+  static $deleteContents_Callback(mthis) native "Range_deleteContents_Callback_RESOLVER_STRING_0_";
 
-Native_Range_expand_Callback(mthis, unit) native "Range_expand_Callback_RESOLVER_STRING_1_DOMString";
+  static $detach_Callback(mthis) native "Range_detach_Callback_RESOLVER_STRING_0_";
 
-Native_Range_extractContents_Callback(mthis) native "Range_extractContents_Callback_RESOLVER_STRING_0_";
+  static $expand_Callback(mthis, unit) native "Range_expand_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Range_getBoundingClientRect_Callback(mthis) native "Range_getBoundingClientRect_Callback_RESOLVER_STRING_0_";
+  static $extractContents_Callback(mthis) native "Range_extractContents_Callback_RESOLVER_STRING_0_";
 
-Native_Range_getClientRects_Callback(mthis) native "Range_getClientRects_Callback_RESOLVER_STRING_0_";
+  static $getBoundingClientRect_Callback(mthis) native "Range_getBoundingClientRect_Callback_RESOLVER_STRING_0_";
 
-Native_Range_insertNode_Callback(mthis, newNode) native "Range_insertNode_Callback_RESOLVER_STRING_1_Node";
+  static $getClientRects_Callback(mthis) native "Range_getClientRects_Callback_RESOLVER_STRING_0_";
 
-Native_Range_isPointInRange_Callback(mthis, refNode, offset) native "Range_isPointInRange_Callback_RESOLVER_STRING_2_Node_long";
+  static $insertNode_Callback(mthis, newNode) native "Range_insertNode_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_selectNode_Callback(mthis, refNode) native "Range_selectNode_Callback_RESOLVER_STRING_1_Node";
+  static $isPointInRange_Callback(mthis, refNode, offset) native "Range_isPointInRange_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Range_selectNodeContents_Callback(mthis, refNode) native "Range_selectNodeContents_Callback_RESOLVER_STRING_1_Node";
+  static $selectNode_Callback(mthis, refNode) native "Range_selectNode_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_setEnd_Callback(mthis, refNode, offset) native "Range_setEnd_Callback_RESOLVER_STRING_2_Node_long";
+  static $selectNodeContents_Callback(mthis, refNode) native "Range_selectNodeContents_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_setEndAfter_Callback(mthis, refNode) native "Range_setEndAfter_Callback_RESOLVER_STRING_1_Node";
+  static $setEnd_Callback(mthis, refNode, offset) native "Range_setEnd_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Range_setEndBefore_Callback(mthis, refNode) native "Range_setEndBefore_Callback_RESOLVER_STRING_1_Node";
+  static $setEndAfter_Callback(mthis, refNode) native "Range_setEndAfter_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_setStart_Callback(mthis, refNode, offset) native "Range_setStart_Callback_RESOLVER_STRING_2_Node_long";
+  static $setEndBefore_Callback(mthis, refNode) native "Range_setEndBefore_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_setStartAfter_Callback(mthis, refNode) native "Range_setStartAfter_Callback_RESOLVER_STRING_1_Node";
+  static $setStart_Callback(mthis, refNode, offset) native "Range_setStart_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Range_setStartBefore_Callback(mthis, refNode) native "Range_setStartBefore_Callback_RESOLVER_STRING_1_Node";
+  static $setStartAfter_Callback(mthis, refNode) native "Range_setStartAfter_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_surroundContents_Callback(mthis, newParent) native "Range_surroundContents_Callback_RESOLVER_STRING_1_Node";
+  static $setStartBefore_Callback(mthis, refNode) native "Range_setStartBefore_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_toString_Callback(mthis) native "Range_toString_Callback_RESOLVER_STRING_0_";
+  static $surroundContents_Callback(mthis, newParent) native "Range_surroundContents_Callback_RESOLVER_STRING_1_Node";
 
-Native_ResourceProgressEvent_url_Getter(mthis) native "ResourceProgressEvent_url_Getter";
+  static $toString_Callback(mthis) native "Range_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_SQLError_code_Getter(mthis) native "SQLError_code_Getter";
+class BlinkRect {}
 
-Native_SQLError_message_Getter(mthis) native "SQLError_message_Getter";
+class BlinkResourceProgressEvent {
+  static $url_Getter(mthis) native "ResourceProgressEvent_url_Getter";
+}
 
-Native_SQLResultSet_insertId_Getter(mthis) native "SQLResultSet_insertId_Getter";
+class BlinkSQLError {
+  static $code_Getter(mthis) native "SQLError_code_Getter";
 
-Native_SQLResultSet_rows_Getter(mthis) native "SQLResultSet_rows_Getter";
+  static $message_Getter(mthis) native "SQLError_message_Getter";
+}
 
-Native_SQLResultSet_rowsAffected_Getter(mthis) native "SQLResultSet_rowsAffected_Getter";
+class BlinkSQLResultSet {
+  static $insertId_Getter(mthis) native "SQLResultSet_insertId_Getter";
 
-Native_SQLResultSetRowList_length_Getter(mthis) native "SQLResultSetRowList_length_Getter";
+  static $rows_Getter(mthis) native "SQLResultSet_rows_Getter";
 
-Native_SQLResultSetRowList_NativeIndexed_Getter(mthis, index) native "SQLResultSetRowList_item_Callback";
+  static $rowsAffected_Getter(mthis) native "SQLResultSet_rowsAffected_Getter";
+}
 
-Native_SQLResultSetRowList_item_Callback(mthis, index) native "SQLResultSetRowList_item_Callback";
+class BlinkSQLResultSetRowList {
+  static $length_Getter(mthis) native "SQLResultSetRowList_length_Getter";
 
-Native_SQLTransaction_executeSql_Callback(mthis, sqlStatement, arguments, callback, errorCallback) native "SQLTransaction_executeSql_Callback";
+  static $NativeIndexed_Getter(mthis, index) native "SQLResultSetRowList_item_Callback";
 
-Native_SVGElement_className_Getter(mthis) native "SVGElement_className_Getter";
+  static $item_Callback(mthis, index) native "SQLResultSetRowList_item_Callback";
+}
 
-Native_SVGElement_ownerSVGElement_Getter(mthis) native "SVGElement_ownerSVGElement_Getter";
+class BlinkSQLTransaction {
+  static $executeSql_Callback(mthis, sqlStatement, arguments, callback, errorCallback) native "SQLTransaction_executeSql_Callback";
+}
 
-Native_SVGElement_style_Getter(mthis) native "SVGElement_style_Getter";
+class BlinkSQLTransactionSync {}
 
-Native_SVGElement_viewportElement_Getter(mthis) native "SVGElement_viewportElement_Getter";
+class BlinkSVGElement {
+  static $className_Getter(mthis) native "SVGElement_className_Getter";
 
-Native_SVGElement_xmlbase_Getter(mthis) native "SVGElement_xmlbase_Getter";
+  static $ownerSVGElement_Getter(mthis) native "SVGElement_ownerSVGElement_Getter";
 
-Native_SVGElement_xmlbase_Setter(mthis, value) native "SVGElement_xmlbase_Setter";
+  static $style_Getter(mthis) native "SVGElement_style_Getter";
 
-Native_SVGElement_xmllang_Getter(mthis) native "SVGElement_xmllang_Getter";
+  static $viewportElement_Getter(mthis) native "SVGElement_viewportElement_Getter";
 
-Native_SVGElement_xmllang_Setter(mthis, value) native "SVGElement_xmllang_Setter";
+  static $xmlbase_Getter(mthis) native "SVGElement_xmlbase_Getter";
 
-Native_SVGElement_xmlspace_Getter(mthis) native "SVGElement_xmlspace_Getter";
+  static $xmlbase_Setter(mthis, value) native "SVGElement_xmlbase_Setter";
 
-Native_SVGElement_xmlspace_Setter(mthis, value) native "SVGElement_xmlspace_Setter";
+  static $xmllang_Getter(mthis) native "SVGElement_xmllang_Getter";
 
-Native_SVGTests_requiredExtensions_Getter(mthis) native "SVGTests_requiredExtensions_Getter";
+  static $xmllang_Setter(mthis, value) native "SVGElement_xmllang_Setter";
 
-Native_SVGTests_requiredFeatures_Getter(mthis) native "SVGTests_requiredFeatures_Getter";
+  static $xmlspace_Getter(mthis) native "SVGElement_xmlspace_Getter";
 
-Native_SVGTests_systemLanguage_Getter(mthis) native "SVGTests_systemLanguage_Getter";
+  static $xmlspace_Setter(mthis, value) native "SVGElement_xmlspace_Setter";
+}
 
-Native_SVGTests_hasExtension_Callback(mthis, extension) native "SVGTests_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkSVGTests {
+  static $requiredExtensions_Getter(mthis) native "SVGTests_requiredExtensions_Getter";
 
-Native_SVGGraphicsElement_farthestViewportElement_Getter(mthis) native "SVGGraphicsElement_farthestViewportElement_Getter";
+  static $requiredFeatures_Getter(mthis) native "SVGTests_requiredFeatures_Getter";
 
-Native_SVGGraphicsElement_nearestViewportElement_Getter(mthis) native "SVGGraphicsElement_nearestViewportElement_Getter";
+  static $systemLanguage_Getter(mthis) native "SVGTests_systemLanguage_Getter";
 
-Native_SVGGraphicsElement_transform_Getter(mthis) native "SVGGraphicsElement_transform_Getter";
+  static $hasExtension_Callback(mthis, extension) native "SVGTests_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_SVGGraphicsElement_getBBox_Callback(mthis) native "SVGGraphicsElement_getBBox_Callback_RESOLVER_STRING_0_";
+class BlinkSVGGraphicsElement {
+  static $farthestViewportElement_Getter(mthis) native "SVGGraphicsElement_farthestViewportElement_Getter";
 
-Native_SVGGraphicsElement_getCTM_Callback(mthis) native "SVGGraphicsElement_getCTM_Callback_RESOLVER_STRING_0_";
+  static $nearestViewportElement_Getter(mthis) native "SVGGraphicsElement_nearestViewportElement_Getter";
 
-Native_SVGGraphicsElement_getScreenCTM_Callback(mthis) native "SVGGraphicsElement_getScreenCTM_Callback_RESOLVER_STRING_0_";
+  static $transform_Getter(mthis) native "SVGGraphicsElement_transform_Getter";
 
-Native_SVGGraphicsElement_getTransformToElement_Callback(mthis, element) native "SVGGraphicsElement_getTransformToElement_Callback_RESOLVER_STRING_1_SVGElement";
+  static $getBBox_Callback(mthis) native "SVGGraphicsElement_getBBox_Callback_RESOLVER_STRING_0_";
 
-Native_SVGGraphicsElement_requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
+  static $getCTM_Callback(mthis) native "SVGGraphicsElement_getCTM_Callback_RESOLVER_STRING_0_";
 
-Native_SVGGraphicsElement_requiredFeatures_Getter(mthis) native "SVGGraphicsElement_requiredFeatures_Getter";
+  static $getScreenCTM_Callback(mthis) native "SVGGraphicsElement_getScreenCTM_Callback_RESOLVER_STRING_0_";
 
-Native_SVGGraphicsElement_systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
+  static $getTransformToElement_Callback(mthis, element) native "SVGGraphicsElement_getTransformToElement_Callback_RESOLVER_STRING_1_SVGElement";
 
-Native_SVGGraphicsElement_hasExtension_Callback(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+  static $requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
 
-Native_SVGURIReference_href_Getter(mthis) native "SVGURIReference_href_Getter";
+  static $requiredFeatures_Getter(mthis) native "SVGGraphicsElement_requiredFeatures_Getter";
 
-Native_SVGAElement_target_Getter(mthis) native "SVGAElement_target_Getter";
+  static $systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
 
-Native_SVGAElement_href_Getter(mthis) native "SVGAElement_href_Getter";
+  static $hasExtension_Callback(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_SVGTextContentElement_lengthAdjust_Getter(mthis) native "SVGTextContentElement_lengthAdjust_Getter";
+class BlinkSVGURIReference {
+  static $href_Getter(mthis) native "SVGURIReference_href_Getter";
+}
 
-Native_SVGTextContentElement_textLength_Getter(mthis) native "SVGTextContentElement_textLength_Getter";
+class BlinkSVGAElement {
+  static $target_Getter(mthis) native "SVGAElement_target_Getter";
 
-Native_SVGTextContentElement_getCharNumAtPosition_Callback(mthis, point) native "SVGTextContentElement_getCharNumAtPosition_Callback_RESOLVER_STRING_1_SVGPoint";
+  static $href_Getter(mthis) native "SVGAElement_href_Getter";
+}
 
-Native_SVGTextContentElement_getComputedTextLength_Callback(mthis) native "SVGTextContentElement_getComputedTextLength_Callback_RESOLVER_STRING_0_";
+class BlinkSVGAltGlyphDefElement {}
 
-Native_SVGTextContentElement_getEndPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getEndPositionOfChar_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSVGTextContentElement {
+  static $lengthAdjust_Getter(mthis) native "SVGTextContentElement_lengthAdjust_Getter";
 
-Native_SVGTextContentElement_getExtentOfChar_Callback(mthis, offset) native "SVGTextContentElement_getExtentOfChar_Callback_RESOLVER_STRING_1_unsigned long";
+  static $textLength_Getter(mthis) native "SVGTextContentElement_textLength_Getter";
 
-Native_SVGTextContentElement_getNumberOfChars_Callback(mthis) native "SVGTextContentElement_getNumberOfChars_Callback_RESOLVER_STRING_0_";
+  static $getCharNumAtPosition_Callback(mthis, point) native "SVGTextContentElement_getCharNumAtPosition_Callback_RESOLVER_STRING_1_SVGPoint";
 
-Native_SVGTextContentElement_getRotationOfChar_Callback(mthis, offset) native "SVGTextContentElement_getRotationOfChar_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getComputedTextLength_Callback(mthis) native "SVGTextContentElement_getComputedTextLength_Callback_RESOLVER_STRING_0_";
 
-Native_SVGTextContentElement_getStartPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getStartPositionOfChar_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getEndPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getEndPositionOfChar_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTextContentElement_getSubStringLength_Callback(mthis, offset, length) native "SVGTextContentElement_getSubStringLength_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $getExtentOfChar_Callback(mthis, offset) native "SVGTextContentElement_getExtentOfChar_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTextContentElement_selectSubString_Callback(mthis, offset, length) native "SVGTextContentElement_selectSubString_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $getNumberOfChars_Callback(mthis) native "SVGTextContentElement_getNumberOfChars_Callback_RESOLVER_STRING_0_";
 
-Native_SVGTextPositioningElement_dx_Getter(mthis) native "SVGTextPositioningElement_dx_Getter";
+  static $getRotationOfChar_Callback(mthis, offset) native "SVGTextContentElement_getRotationOfChar_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTextPositioningElement_dy_Getter(mthis) native "SVGTextPositioningElement_dy_Getter";
+  static $getStartPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getStartPositionOfChar_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTextPositioningElement_rotate_Getter(mthis) native "SVGTextPositioningElement_rotate_Getter";
+  static $getSubStringLength_Callback(mthis, offset, length) native "SVGTextContentElement_getSubStringLength_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_SVGTextPositioningElement_x_Getter(mthis) native "SVGTextPositioningElement_x_Getter";
+  static $selectSubString_Callback(mthis, offset, length) native "SVGTextContentElement_selectSubString_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+}
 
-Native_SVGTextPositioningElement_y_Getter(mthis) native "SVGTextPositioningElement_y_Getter";
+class BlinkSVGTextPositioningElement {
+  static $dx_Getter(mthis) native "SVGTextPositioningElement_dx_Getter";
 
-Native_SVGAltGlyphElement_format_Getter(mthis) native "SVGAltGlyphElement_format_Getter";
+  static $dy_Getter(mthis) native "SVGTextPositioningElement_dy_Getter";
 
-Native_SVGAltGlyphElement_format_Setter(mthis, value) native "SVGAltGlyphElement_format_Setter";
+  static $rotate_Getter(mthis) native "SVGTextPositioningElement_rotate_Getter";
 
-Native_SVGAltGlyphElement_glyphRef_Getter(mthis) native "SVGAltGlyphElement_glyphRef_Getter";
+  static $x_Getter(mthis) native "SVGTextPositioningElement_x_Getter";
 
-Native_SVGAltGlyphElement_glyphRef_Setter(mthis, value) native "SVGAltGlyphElement_glyphRef_Setter";
+  static $y_Getter(mthis) native "SVGTextPositioningElement_y_Getter";
+}
 
-Native_SVGAltGlyphElement_href_Getter(mthis) native "SVGAltGlyphElement_href_Getter";
+class BlinkSVGAltGlyphElement {
+  static $format_Getter(mthis) native "SVGAltGlyphElement_format_Getter";
 
-Native_SVGAngle_unitType_Getter(mthis) native "SVGAngle_unitType_Getter";
+  static $format_Setter(mthis, value) native "SVGAltGlyphElement_format_Setter";
 
-Native_SVGAngle_value_Getter(mthis) native "SVGAngle_value_Getter";
+  static $glyphRef_Getter(mthis) native "SVGAltGlyphElement_glyphRef_Getter";
 
-Native_SVGAngle_value_Setter(mthis, value) native "SVGAngle_value_Setter";
+  static $glyphRef_Setter(mthis, value) native "SVGAltGlyphElement_glyphRef_Setter";
 
-Native_SVGAngle_valueAsString_Getter(mthis) native "SVGAngle_valueAsString_Getter";
+  static $href_Getter(mthis) native "SVGAltGlyphElement_href_Getter";
+}
 
-Native_SVGAngle_valueAsString_Setter(mthis, value) native "SVGAngle_valueAsString_Setter";
+class BlinkSVGAltGlyphItemElement {}
 
-Native_SVGAngle_valueInSpecifiedUnits_Getter(mthis) native "SVGAngle_valueInSpecifiedUnits_Getter";
+class BlinkSVGAngle {
+  static $unitType_Getter(mthis) native "SVGAngle_unitType_Getter";
 
-Native_SVGAngle_valueInSpecifiedUnits_Setter(mthis, value) native "SVGAngle_valueInSpecifiedUnits_Setter";
+  static $value_Getter(mthis) native "SVGAngle_value_Getter";
 
-Native_SVGAngle_convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGAngle_convertToSpecifiedUnits_Callback_RESOLVER_STRING_1_unsigned short";
+  static $value_Setter(mthis, value) native "SVGAngle_value_Setter";
 
-Native_SVGAngle_newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGAngle_newValueSpecifiedUnits_Callback_RESOLVER_STRING_2_unsigned short_float";
+  static $valueAsString_Getter(mthis) native "SVGAngle_valueAsString_Getter";
 
-Native_SVGAnimationElement_targetElement_Getter(mthis) native "SVGAnimationElement_targetElement_Getter";
+  static $valueAsString_Setter(mthis, value) native "SVGAngle_valueAsString_Setter";
 
-Native_SVGAnimationElement_beginElement_Callback(mthis) native "SVGAnimationElement_beginElement_Callback_RESOLVER_STRING_0_";
+  static $valueInSpecifiedUnits_Getter(mthis) native "SVGAngle_valueInSpecifiedUnits_Getter";
 
-Native_SVGAnimationElement_beginElementAt_Callback(mthis, offset) native "SVGAnimationElement_beginElementAt_Callback_RESOLVER_STRING_1_float";
+  static $valueInSpecifiedUnits_Setter(mthis, value) native "SVGAngle_valueInSpecifiedUnits_Setter";
 
-Native_SVGAnimationElement_endElement_Callback(mthis) native "SVGAnimationElement_endElement_Callback_RESOLVER_STRING_0_";
+  static $convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGAngle_convertToSpecifiedUnits_Callback_RESOLVER_STRING_1_unsigned short";
 
-Native_SVGAnimationElement_endElementAt_Callback(mthis, offset) native "SVGAnimationElement_endElementAt_Callback_RESOLVER_STRING_1_float";
+  static $newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGAngle_newValueSpecifiedUnits_Callback_RESOLVER_STRING_2_unsigned short_float";
+}
 
-Native_SVGAnimationElement_getCurrentTime_Callback(mthis) native "SVGAnimationElement_getCurrentTime_Callback_RESOLVER_STRING_0_";
+class BlinkSVGAnimationElement {
+  static $targetElement_Getter(mthis) native "SVGAnimationElement_targetElement_Getter";
 
-Native_SVGAnimationElement_getSimpleDuration_Callback(mthis) native "SVGAnimationElement_getSimpleDuration_Callback_RESOLVER_STRING_0_";
+  static $beginElement_Callback(mthis) native "SVGAnimationElement_beginElement_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimationElement_getStartTime_Callback(mthis) native "SVGAnimationElement_getStartTime_Callback_RESOLVER_STRING_0_";
+  static $beginElementAt_Callback(mthis, offset) native "SVGAnimationElement_beginElementAt_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGAnimationElement_requiredExtensions_Getter(mthis) native "SVGAnimationElement_requiredExtensions_Getter";
+  static $endElement_Callback(mthis) native "SVGAnimationElement_endElement_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimationElement_requiredFeatures_Getter(mthis) native "SVGAnimationElement_requiredFeatures_Getter";
+  static $endElementAt_Callback(mthis, offset) native "SVGAnimationElement_endElementAt_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGAnimationElement_systemLanguage_Getter(mthis) native "SVGAnimationElement_systemLanguage_Getter";
+  static $getCurrentTime_Callback(mthis) native "SVGAnimationElement_getCurrentTime_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimationElement_hasExtension_Callback(mthis, extension) native "SVGAnimationElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+  static $getSimpleDuration_Callback(mthis) native "SVGAnimationElement_getSimpleDuration_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimatedAngle_animVal_Getter(mthis) native "SVGAnimatedAngle_animVal_Getter";
+  static $getStartTime_Callback(mthis) native "SVGAnimationElement_getStartTime_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimatedAngle_baseVal_Getter(mthis) native "SVGAnimatedAngle_baseVal_Getter";
+  static $requiredExtensions_Getter(mthis) native "SVGAnimationElement_requiredExtensions_Getter";
 
-Native_SVGAnimatedBoolean_animVal_Getter(mthis) native "SVGAnimatedBoolean_animVal_Getter";
+  static $requiredFeatures_Getter(mthis) native "SVGAnimationElement_requiredFeatures_Getter";
 
-Native_SVGAnimatedBoolean_baseVal_Getter(mthis) native "SVGAnimatedBoolean_baseVal_Getter";
+  static $systemLanguage_Getter(mthis) native "SVGAnimationElement_systemLanguage_Getter";
 
-Native_SVGAnimatedBoolean_baseVal_Setter(mthis, value) native "SVGAnimatedBoolean_baseVal_Setter";
+  static $hasExtension_Callback(mthis, extension) native "SVGAnimationElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_SVGAnimatedEnumeration_animVal_Getter(mthis) native "SVGAnimatedEnumeration_animVal_Getter";
+class BlinkSVGAnimateElement {}
 
-Native_SVGAnimatedEnumeration_baseVal_Getter(mthis) native "SVGAnimatedEnumeration_baseVal_Getter";
+class BlinkSVGAnimateMotionElement {}
 
-Native_SVGAnimatedEnumeration_baseVal_Setter(mthis, value) native "SVGAnimatedEnumeration_baseVal_Setter";
+class BlinkSVGAnimateTransformElement {}
 
-Native_SVGAnimatedInteger_animVal_Getter(mthis) native "SVGAnimatedInteger_animVal_Getter";
+class BlinkSVGAnimatedAngle {
+  static $animVal_Getter(mthis) native "SVGAnimatedAngle_animVal_Getter";
 
-Native_SVGAnimatedInteger_baseVal_Getter(mthis) native "SVGAnimatedInteger_baseVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedAngle_baseVal_Getter";
+}
 
-Native_SVGAnimatedInteger_baseVal_Setter(mthis, value) native "SVGAnimatedInteger_baseVal_Setter";
+class BlinkSVGAnimatedBoolean {
+  static $animVal_Getter(mthis) native "SVGAnimatedBoolean_animVal_Getter";
 
-Native_SVGAnimatedLength_animVal_Getter(mthis) native "SVGAnimatedLength_animVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedBoolean_baseVal_Getter";
 
-Native_SVGAnimatedLength_baseVal_Getter(mthis) native "SVGAnimatedLength_baseVal_Getter";
+  static $baseVal_Setter(mthis, value) native "SVGAnimatedBoolean_baseVal_Setter";
+}
 
-Native_SVGAnimatedLengthList_animVal_Getter(mthis) native "SVGAnimatedLengthList_animVal_Getter";
+class BlinkSVGAnimatedEnumeration {
+  static $animVal_Getter(mthis) native "SVGAnimatedEnumeration_animVal_Getter";
 
-Native_SVGAnimatedLengthList_baseVal_Getter(mthis) native "SVGAnimatedLengthList_baseVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedEnumeration_baseVal_Getter";
 
-Native_SVGAnimatedNumber_animVal_Getter(mthis) native "SVGAnimatedNumber_animVal_Getter";
+  static $baseVal_Setter(mthis, value) native "SVGAnimatedEnumeration_baseVal_Setter";
+}
 
-Native_SVGAnimatedNumber_baseVal_Getter(mthis) native "SVGAnimatedNumber_baseVal_Getter";
+class BlinkSVGAnimatedInteger {
+  static $animVal_Getter(mthis) native "SVGAnimatedInteger_animVal_Getter";
 
-Native_SVGAnimatedNumber_baseVal_Setter(mthis, value) native "SVGAnimatedNumber_baseVal_Setter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedInteger_baseVal_Getter";
 
-Native_SVGAnimatedNumberList_animVal_Getter(mthis) native "SVGAnimatedNumberList_animVal_Getter";
+  static $baseVal_Setter(mthis, value) native "SVGAnimatedInteger_baseVal_Setter";
+}
 
-Native_SVGAnimatedNumberList_baseVal_Getter(mthis) native "SVGAnimatedNumberList_baseVal_Getter";
+class BlinkSVGAnimatedLength {
+  static $animVal_Getter(mthis) native "SVGAnimatedLength_animVal_Getter";
 
-Native_SVGAnimatedPreserveAspectRatio_animVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_animVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedLength_baseVal_Getter";
+}
 
-Native_SVGAnimatedPreserveAspectRatio_baseVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";
+class BlinkSVGAnimatedLengthList {
+  static $animVal_Getter(mthis) native "SVGAnimatedLengthList_animVal_Getter";
 
-Native_SVGAnimatedRect_animVal_Getter(mthis) native "SVGAnimatedRect_animVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedLengthList_baseVal_Getter";
+}
 
-Native_SVGAnimatedRect_baseVal_Getter(mthis) native "SVGAnimatedRect_baseVal_Getter";
+class BlinkSVGAnimatedNumber {
+  static $animVal_Getter(mthis) native "SVGAnimatedNumber_animVal_Getter";
 
-Native_SVGAnimatedString_animVal_Getter(mthis) native "SVGAnimatedString_animVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedNumber_baseVal_Getter";
 
-Native_SVGAnimatedString_baseVal_Getter(mthis) native "SVGAnimatedString_baseVal_Getter";
+  static $baseVal_Setter(mthis, value) native "SVGAnimatedNumber_baseVal_Setter";
+}
 
-Native_SVGAnimatedString_baseVal_Setter(mthis, value) native "SVGAnimatedString_baseVal_Setter";
+class BlinkSVGAnimatedNumberList {
+  static $animVal_Getter(mthis) native "SVGAnimatedNumberList_animVal_Getter";
 
-Native_SVGAnimatedTransformList_animVal_Getter(mthis) native "SVGAnimatedTransformList_animVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedNumberList_baseVal_Getter";
+}
 
-Native_SVGAnimatedTransformList_baseVal_Getter(mthis) native "SVGAnimatedTransformList_baseVal_Getter";
+class BlinkSVGAnimatedPreserveAspectRatio {
+  static $animVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_animVal_Getter";
 
-Native_SVGGeometryElement_isPointInFill_Callback(mthis, point) native "SVGGeometryElement_isPointInFill_Callback_RESOLVER_STRING_1_SVGPoint";
+  static $baseVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";
+}
 
-Native_SVGGeometryElement_isPointInStroke_Callback(mthis, point) native "SVGGeometryElement_isPointInStroke_Callback_RESOLVER_STRING_1_SVGPoint";
+class BlinkSVGAnimatedRect {
+  static $animVal_Getter(mthis) native "SVGAnimatedRect_animVal_Getter";
 
-Native_SVGCircleElement_cx_Getter(mthis) native "SVGCircleElement_cx_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedRect_baseVal_Getter";
+}
 
-Native_SVGCircleElement_cy_Getter(mthis) native "SVGCircleElement_cy_Getter";
+class BlinkSVGAnimatedString {
+  static $animVal_Getter(mthis) native "SVGAnimatedString_animVal_Getter";
 
-Native_SVGCircleElement_r_Getter(mthis) native "SVGCircleElement_r_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedString_baseVal_Getter";
 
-Native_SVGClipPathElement_clipPathUnits_Getter(mthis) native "SVGClipPathElement_clipPathUnits_Getter";
+  static $baseVal_Setter(mthis, value) native "SVGAnimatedString_baseVal_Setter";
+}
 
-Native_SVGElementInstance_correspondingElement_Getter(mthis) native "SVGElementInstance_correspondingElement_Getter";
+class BlinkSVGAnimatedTransformList {
+  static $animVal_Getter(mthis) native "SVGAnimatedTransformList_animVal_Getter";
 
-Native_SVGElementInstance_correspondingUseElement_Getter(mthis) native "SVGElementInstance_correspondingUseElement_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedTransformList_baseVal_Getter";
+}
 
-Native_SVGElementInstance_firstChild_Getter(mthis) native "SVGElementInstance_firstChild_Getter";
+class BlinkSVGGeometryElement {
+  static $isPointInFill_Callback(mthis, point) native "SVGGeometryElement_isPointInFill_Callback_RESOLVER_STRING_1_SVGPoint";
 
-Native_SVGElementInstance_lastChild_Getter(mthis) native "SVGElementInstance_lastChild_Getter";
+  static $isPointInStroke_Callback(mthis, point) native "SVGGeometryElement_isPointInStroke_Callback_RESOLVER_STRING_1_SVGPoint";
+}
 
-Native_SVGElementInstance_nextSibling_Getter(mthis) native "SVGElementInstance_nextSibling_Getter";
+class BlinkSVGCircleElement {
+  static $cx_Getter(mthis) native "SVGCircleElement_cx_Getter";
 
-Native_SVGElementInstance_parentNode_Getter(mthis) native "SVGElementInstance_parentNode_Getter";
+  static $cy_Getter(mthis) native "SVGCircleElement_cy_Getter";
 
-Native_SVGElementInstance_previousSibling_Getter(mthis) native "SVGElementInstance_previousSibling_Getter";
+  static $r_Getter(mthis) native "SVGCircleElement_r_Getter";
+}
 
-Native_SVGElementInstanceList_length_Getter(mthis) native "SVGElementInstanceList_length_Getter";
+class BlinkSVGClipPathElement {
+  static $clipPathUnits_Getter(mthis) native "SVGClipPathElement_clipPathUnits_Getter";
+}
 
-Native_SVGElementInstanceList_NativeIndexed_Getter(mthis, index) native "SVGElementInstanceList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSVGComponentTransferFunctionElement {}
 
-Native_SVGElementInstanceList_item_Callback(mthis, index) native "SVGElementInstanceList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSVGCursorElement {}
 
-Native_SVGEllipseElement_cx_Getter(mthis) native "SVGEllipseElement_cx_Getter";
+class BlinkSVGDefsElement {}
 
-Native_SVGEllipseElement_cy_Getter(mthis) native "SVGEllipseElement_cy_Getter";
+class BlinkSVGDescElement {}
 
-Native_SVGEllipseElement_rx_Getter(mthis) native "SVGEllipseElement_rx_Getter";
+class BlinkSVGDiscardElement {}
 
-Native_SVGEllipseElement_ry_Getter(mthis) native "SVGEllipseElement_ry_Getter";
+class BlinkSVGElementInstance {
+  static $correspondingElement_Getter(mthis) native "SVGElementInstance_correspondingElement_Getter";
 
-Native_SVGFilterPrimitiveStandardAttributes_height_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_height_Getter";
+  static $correspondingUseElement_Getter(mthis) native "SVGElementInstance_correspondingUseElement_Getter";
 
-Native_SVGFilterPrimitiveStandardAttributes_result_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_result_Getter";
+  static $firstChild_Getter(mthis) native "SVGElementInstance_firstChild_Getter";
 
-Native_SVGFilterPrimitiveStandardAttributes_width_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_width_Getter";
+  static $lastChild_Getter(mthis) native "SVGElementInstance_lastChild_Getter";
 
-Native_SVGFilterPrimitiveStandardAttributes_x_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_x_Getter";
+  static $nextSibling_Getter(mthis) native "SVGElementInstance_nextSibling_Getter";
 
-Native_SVGFilterPrimitiveStandardAttributes_y_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_y_Getter";
+  static $parentNode_Getter(mthis) native "SVGElementInstance_parentNode_Getter";
 
-Native_SVGFEBlendElement_in1_Getter(mthis) native "SVGFEBlendElement_in1_Getter";
+  static $previousSibling_Getter(mthis) native "SVGElementInstance_previousSibling_Getter";
+}
 
-Native_SVGFEBlendElement_in2_Getter(mthis) native "SVGFEBlendElement_in2_Getter";
+class BlinkSVGElementInstanceList {
+  static $length_Getter(mthis) native "SVGElementInstanceList_length_Getter";
 
-Native_SVGFEBlendElement_mode_Getter(mthis) native "SVGFEBlendElement_mode_Getter";
+  static $NativeIndexed_Getter(mthis, index) native "SVGElementInstanceList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGFEBlendElement_height_Getter(mthis) native "SVGFEBlendElement_height_Getter";
+  static $item_Callback(mthis, index) native "SVGElementInstanceList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_SVGFEBlendElement_result_Getter(mthis) native "SVGFEBlendElement_result_Getter";
+class BlinkSVGEllipseElement {
+  static $cx_Getter(mthis) native "SVGEllipseElement_cx_Getter";
 
-Native_SVGFEBlendElement_width_Getter(mthis) native "SVGFEBlendElement_width_Getter";
+  static $cy_Getter(mthis) native "SVGEllipseElement_cy_Getter";
 
-Native_SVGFEBlendElement_x_Getter(mthis) native "SVGFEBlendElement_x_Getter";
+  static $rx_Getter(mthis) native "SVGEllipseElement_rx_Getter";
 
-Native_SVGFEBlendElement_y_Getter(mthis) native "SVGFEBlendElement_y_Getter";
+  static $ry_Getter(mthis) native "SVGEllipseElement_ry_Getter";
+}
 
-Native_SVGFEColorMatrixElement_in1_Getter(mthis) native "SVGFEColorMatrixElement_in1_Getter";
+class BlinkSVGFilterPrimitiveStandardAttributes {
+  static $height_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_height_Getter";
 
-Native_SVGFEColorMatrixElement_type_Getter(mthis) native "SVGFEColorMatrixElement_type_Getter";
+  static $result_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_result_Getter";
 
-Native_SVGFEColorMatrixElement_values_Getter(mthis) native "SVGFEColorMatrixElement_values_Getter";
+  static $width_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_width_Getter";
 
-Native_SVGFEColorMatrixElement_height_Getter(mthis) native "SVGFEColorMatrixElement_height_Getter";
+  static $x_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_x_Getter";
 
-Native_SVGFEColorMatrixElement_result_Getter(mthis) native "SVGFEColorMatrixElement_result_Getter";
+  static $y_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_y_Getter";
+}
 
-Native_SVGFEColorMatrixElement_width_Getter(mthis) native "SVGFEColorMatrixElement_width_Getter";
+class BlinkSVGFEBlendElement {
+  static $in1_Getter(mthis) native "SVGFEBlendElement_in1_Getter";
 
-Native_SVGFEColorMatrixElement_x_Getter(mthis) native "SVGFEColorMatrixElement_x_Getter";
+  static $in2_Getter(mthis) native "SVGFEBlendElement_in2_Getter";
 
-Native_SVGFEColorMatrixElement_y_Getter(mthis) native "SVGFEColorMatrixElement_y_Getter";
+  static $mode_Getter(mthis) native "SVGFEBlendElement_mode_Getter";
 
-Native_SVGFEComponentTransferElement_in1_Getter(mthis) native "SVGFEComponentTransferElement_in1_Getter";
+  static $height_Getter(mthis) native "SVGFEBlendElement_height_Getter";
 
-Native_SVGFEComponentTransferElement_height_Getter(mthis) native "SVGFEComponentTransferElement_height_Getter";
+  static $result_Getter(mthis) native "SVGFEBlendElement_result_Getter";
 
-Native_SVGFEComponentTransferElement_result_Getter(mthis) native "SVGFEComponentTransferElement_result_Getter";
+  static $width_Getter(mthis) native "SVGFEBlendElement_width_Getter";
 
-Native_SVGFEComponentTransferElement_width_Getter(mthis) native "SVGFEComponentTransferElement_width_Getter";
+  static $x_Getter(mthis) native "SVGFEBlendElement_x_Getter";
 
-Native_SVGFEComponentTransferElement_x_Getter(mthis) native "SVGFEComponentTransferElement_x_Getter";
+  static $y_Getter(mthis) native "SVGFEBlendElement_y_Getter";
+}
 
-Native_SVGFEComponentTransferElement_y_Getter(mthis) native "SVGFEComponentTransferElement_y_Getter";
+class BlinkSVGFEColorMatrixElement {
+  static $in1_Getter(mthis) native "SVGFEColorMatrixElement_in1_Getter";
 
-Native_SVGFECompositeElement_in1_Getter(mthis) native "SVGFECompositeElement_in1_Getter";
+  static $type_Getter(mthis) native "SVGFEColorMatrixElement_type_Getter";
 
-Native_SVGFECompositeElement_in2_Getter(mthis) native "SVGFECompositeElement_in2_Getter";
+  static $values_Getter(mthis) native "SVGFEColorMatrixElement_values_Getter";
 
-Native_SVGFECompositeElement_k1_Getter(mthis) native "SVGFECompositeElement_k1_Getter";
+  static $height_Getter(mthis) native "SVGFEColorMatrixElement_height_Getter";
 
-Native_SVGFECompositeElement_k2_Getter(mthis) native "SVGFECompositeElement_k2_Getter";
+  static $result_Getter(mthis) native "SVGFEColorMatrixElement_result_Getter";
 
-Native_SVGFECompositeElement_k3_Getter(mthis) native "SVGFECompositeElement_k3_Getter";
+  static $width_Getter(mthis) native "SVGFEColorMatrixElement_width_Getter";
 
-Native_SVGFECompositeElement_k4_Getter(mthis) native "SVGFECompositeElement_k4_Getter";
+  static $x_Getter(mthis) native "SVGFEColorMatrixElement_x_Getter";
 
-Native_SVGFECompositeElement_operator_Getter(mthis) native "SVGFECompositeElement_operator_Getter";
+  static $y_Getter(mthis) native "SVGFEColorMatrixElement_y_Getter";
+}
 
-Native_SVGFECompositeElement_height_Getter(mthis) native "SVGFECompositeElement_height_Getter";
+class BlinkSVGFEComponentTransferElement {
+  static $in1_Getter(mthis) native "SVGFEComponentTransferElement_in1_Getter";
 
-Native_SVGFECompositeElement_result_Getter(mthis) native "SVGFECompositeElement_result_Getter";
+  static $height_Getter(mthis) native "SVGFEComponentTransferElement_height_Getter";
 
-Native_SVGFECompositeElement_width_Getter(mthis) native "SVGFECompositeElement_width_Getter";
+  static $result_Getter(mthis) native "SVGFEComponentTransferElement_result_Getter";
 
-Native_SVGFECompositeElement_x_Getter(mthis) native "SVGFECompositeElement_x_Getter";
+  static $width_Getter(mthis) native "SVGFEComponentTransferElement_width_Getter";
 
-Native_SVGFECompositeElement_y_Getter(mthis) native "SVGFECompositeElement_y_Getter";
+  static $x_Getter(mthis) native "SVGFEComponentTransferElement_x_Getter";
 
-Native_SVGFEConvolveMatrixElement_bias_Getter(mthis) native "SVGFEConvolveMatrixElement_bias_Getter";
+  static $y_Getter(mthis) native "SVGFEComponentTransferElement_y_Getter";
+}
 
-Native_SVGFEConvolveMatrixElement_divisor_Getter(mthis) native "SVGFEConvolveMatrixElement_divisor_Getter";
+class BlinkSVGFECompositeElement {
+  static $in1_Getter(mthis) native "SVGFECompositeElement_in1_Getter";
 
-Native_SVGFEConvolveMatrixElement_edgeMode_Getter(mthis) native "SVGFEConvolveMatrixElement_edgeMode_Getter";
+  static $in2_Getter(mthis) native "SVGFECompositeElement_in2_Getter";
 
-Native_SVGFEConvolveMatrixElement_in1_Getter(mthis) native "SVGFEConvolveMatrixElement_in1_Getter";
+  static $k1_Getter(mthis) native "SVGFECompositeElement_k1_Getter";
 
-Native_SVGFEConvolveMatrixElement_kernelMatrix_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
+  static $k2_Getter(mthis) native "SVGFECompositeElement_k2_Getter";
 
-Native_SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
+  static $k3_Getter(mthis) native "SVGFECompositeElement_k3_Getter";
 
-Native_SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
+  static $k4_Getter(mthis) native "SVGFECompositeElement_k4_Getter";
 
-Native_SVGFEConvolveMatrixElement_orderX_Getter(mthis) native "SVGFEConvolveMatrixElement_orderX_Getter";
+  static $operator_Getter(mthis) native "SVGFECompositeElement_operator_Getter";
 
-Native_SVGFEConvolveMatrixElement_orderY_Getter(mthis) native "SVGFEConvolveMatrixElement_orderY_Getter";
+  static $height_Getter(mthis) native "SVGFECompositeElement_height_Getter";
 
-Native_SVGFEConvolveMatrixElement_preserveAlpha_Getter(mthis) native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
+  static $result_Getter(mthis) native "SVGFECompositeElement_result_Getter";
 
-Native_SVGFEConvolveMatrixElement_targetX_Getter(mthis) native "SVGFEConvolveMatrixElement_targetX_Getter";
+  static $width_Getter(mthis) native "SVGFECompositeElement_width_Getter";
 
-Native_SVGFEConvolveMatrixElement_targetY_Getter(mthis) native "SVGFEConvolveMatrixElement_targetY_Getter";
+  static $x_Getter(mthis) native "SVGFECompositeElement_x_Getter";
 
-Native_SVGFEConvolveMatrixElement_height_Getter(mthis) native "SVGFEConvolveMatrixElement_height_Getter";
+  static $y_Getter(mthis) native "SVGFECompositeElement_y_Getter";
+}
 
-Native_SVGFEConvolveMatrixElement_result_Getter(mthis) native "SVGFEConvolveMatrixElement_result_Getter";
+class BlinkSVGFEConvolveMatrixElement {
+  static $bias_Getter(mthis) native "SVGFEConvolveMatrixElement_bias_Getter";
 
-Native_SVGFEConvolveMatrixElement_width_Getter(mthis) native "SVGFEConvolveMatrixElement_width_Getter";
+  static $divisor_Getter(mthis) native "SVGFEConvolveMatrixElement_divisor_Getter";
 
-Native_SVGFEConvolveMatrixElement_x_Getter(mthis) native "SVGFEConvolveMatrixElement_x_Getter";
+  static $edgeMode_Getter(mthis) native "SVGFEConvolveMatrixElement_edgeMode_Getter";
 
-Native_SVGFEConvolveMatrixElement_y_Getter(mthis) native "SVGFEConvolveMatrixElement_y_Getter";
+  static $in1_Getter(mthis) native "SVGFEConvolveMatrixElement_in1_Getter";
 
-Native_SVGFEDiffuseLightingElement_diffuseConstant_Getter(mthis) native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";
+  static $kernelMatrix_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
 
-Native_SVGFEDiffuseLightingElement_in1_Getter(mthis) native "SVGFEDiffuseLightingElement_in1_Getter";
+  static $kernelUnitLengthX_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
 
-Native_SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
+  static $kernelUnitLengthY_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
 
-Native_SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
+  static $orderX_Getter(mthis) native "SVGFEConvolveMatrixElement_orderX_Getter";
 
-Native_SVGFEDiffuseLightingElement_surfaceScale_Getter(mthis) native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
+  static $orderY_Getter(mthis) native "SVGFEConvolveMatrixElement_orderY_Getter";
 
-Native_SVGFEDiffuseLightingElement_height_Getter(mthis) native "SVGFEDiffuseLightingElement_height_Getter";
+  static $preserveAlpha_Getter(mthis) native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
 
-Native_SVGFEDiffuseLightingElement_result_Getter(mthis) native "SVGFEDiffuseLightingElement_result_Getter";
+  static $targetX_Getter(mthis) native "SVGFEConvolveMatrixElement_targetX_Getter";
 
-Native_SVGFEDiffuseLightingElement_width_Getter(mthis) native "SVGFEDiffuseLightingElement_width_Getter";
+  static $targetY_Getter(mthis) native "SVGFEConvolveMatrixElement_targetY_Getter";
 
-Native_SVGFEDiffuseLightingElement_x_Getter(mthis) native "SVGFEDiffuseLightingElement_x_Getter";
+  static $height_Getter(mthis) native "SVGFEConvolveMatrixElement_height_Getter";
 
-Native_SVGFEDiffuseLightingElement_y_Getter(mthis) native "SVGFEDiffuseLightingElement_y_Getter";
+  static $result_Getter(mthis) native "SVGFEConvolveMatrixElement_result_Getter";
 
-Native_SVGFEDisplacementMapElement_in1_Getter(mthis) native "SVGFEDisplacementMapElement_in1_Getter";
+  static $width_Getter(mthis) native "SVGFEConvolveMatrixElement_width_Getter";
 
-Native_SVGFEDisplacementMapElement_in2_Getter(mthis) native "SVGFEDisplacementMapElement_in2_Getter";
+  static $x_Getter(mthis) native "SVGFEConvolveMatrixElement_x_Getter";
 
-Native_SVGFEDisplacementMapElement_scale_Getter(mthis) native "SVGFEDisplacementMapElement_scale_Getter";
+  static $y_Getter(mthis) native "SVGFEConvolveMatrixElement_y_Getter";
+}
 
-Native_SVGFEDisplacementMapElement_xChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
+class BlinkSVGFEDiffuseLightingElement {
+  static $diffuseConstant_Getter(mthis) native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";
 
-Native_SVGFEDisplacementMapElement_yChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
+  static $in1_Getter(mthis) native "SVGFEDiffuseLightingElement_in1_Getter";
 
-Native_SVGFEDisplacementMapElement_height_Getter(mthis) native "SVGFEDisplacementMapElement_height_Getter";
+  static $kernelUnitLengthX_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
 
-Native_SVGFEDisplacementMapElement_result_Getter(mthis) native "SVGFEDisplacementMapElement_result_Getter";
+  static $kernelUnitLengthY_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
 
-Native_SVGFEDisplacementMapElement_width_Getter(mthis) native "SVGFEDisplacementMapElement_width_Getter";
+  static $surfaceScale_Getter(mthis) native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
 
-Native_SVGFEDisplacementMapElement_x_Getter(mthis) native "SVGFEDisplacementMapElement_x_Getter";
+  static $height_Getter(mthis) native "SVGFEDiffuseLightingElement_height_Getter";
 
-Native_SVGFEDisplacementMapElement_y_Getter(mthis) native "SVGFEDisplacementMapElement_y_Getter";
+  static $result_Getter(mthis) native "SVGFEDiffuseLightingElement_result_Getter";
 
-Native_SVGFEDistantLightElement_azimuth_Getter(mthis) native "SVGFEDistantLightElement_azimuth_Getter";
+  static $width_Getter(mthis) native "SVGFEDiffuseLightingElement_width_Getter";
 
-Native_SVGFEDistantLightElement_elevation_Getter(mthis) native "SVGFEDistantLightElement_elevation_Getter";
+  static $x_Getter(mthis) native "SVGFEDiffuseLightingElement_x_Getter";
 
-Native_SVGFEFloodElement_height_Getter(mthis) native "SVGFEFloodElement_height_Getter";
+  static $y_Getter(mthis) native "SVGFEDiffuseLightingElement_y_Getter";
+}
 
-Native_SVGFEFloodElement_result_Getter(mthis) native "SVGFEFloodElement_result_Getter";
+class BlinkSVGFEDisplacementMapElement {
+  static $in1_Getter(mthis) native "SVGFEDisplacementMapElement_in1_Getter";
 
-Native_SVGFEFloodElement_width_Getter(mthis) native "SVGFEFloodElement_width_Getter";
+  static $in2_Getter(mthis) native "SVGFEDisplacementMapElement_in2_Getter";
 
-Native_SVGFEFloodElement_x_Getter(mthis) native "SVGFEFloodElement_x_Getter";
+  static $scale_Getter(mthis) native "SVGFEDisplacementMapElement_scale_Getter";
 
-Native_SVGFEFloodElement_y_Getter(mthis) native "SVGFEFloodElement_y_Getter";
+  static $xChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
 
-Native_SVGFEGaussianBlurElement_in1_Getter(mthis) native "SVGFEGaussianBlurElement_in1_Getter";
+  static $yChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
 
-Native_SVGFEGaussianBlurElement_stdDeviationX_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
+  static $height_Getter(mthis) native "SVGFEDisplacementMapElement_height_Getter";
 
-Native_SVGFEGaussianBlurElement_stdDeviationY_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
+  static $result_Getter(mthis) native "SVGFEDisplacementMapElement_result_Getter";
 
-Native_SVGFEGaussianBlurElement_setStdDeviation_Callback(mthis, stdDeviationX, stdDeviationY) native "SVGFEGaussianBlurElement_setStdDeviation_Callback_RESOLVER_STRING_2_float_float";
+  static $width_Getter(mthis) native "SVGFEDisplacementMapElement_width_Getter";
 
-Native_SVGFEGaussianBlurElement_height_Getter(mthis) native "SVGFEGaussianBlurElement_height_Getter";
+  static $x_Getter(mthis) native "SVGFEDisplacementMapElement_x_Getter";
 
-Native_SVGFEGaussianBlurElement_result_Getter(mthis) native "SVGFEGaussianBlurElement_result_Getter";
+  static $y_Getter(mthis) native "SVGFEDisplacementMapElement_y_Getter";
+}
 
-Native_SVGFEGaussianBlurElement_width_Getter(mthis) native "SVGFEGaussianBlurElement_width_Getter";
+class BlinkSVGFEDistantLightElement {
+  static $azimuth_Getter(mthis) native "SVGFEDistantLightElement_azimuth_Getter";
 
-Native_SVGFEGaussianBlurElement_x_Getter(mthis) native "SVGFEGaussianBlurElement_x_Getter";
+  static $elevation_Getter(mthis) native "SVGFEDistantLightElement_elevation_Getter";
+}
 
-Native_SVGFEGaussianBlurElement_y_Getter(mthis) native "SVGFEGaussianBlurElement_y_Getter";
+class BlinkSVGFEDropShadowElement {}
 
-Native_SVGFEImageElement_preserveAspectRatio_Getter(mthis) native "SVGFEImageElement_preserveAspectRatio_Getter";
+class BlinkSVGFEFloodElement {
+  static $height_Getter(mthis) native "SVGFEFloodElement_height_Getter";
 
-Native_SVGFEImageElement_height_Getter(mthis) native "SVGFEImageElement_height_Getter";
+  static $result_Getter(mthis) native "SVGFEFloodElement_result_Getter";
 
-Native_SVGFEImageElement_result_Getter(mthis) native "SVGFEImageElement_result_Getter";
+  static $width_Getter(mthis) native "SVGFEFloodElement_width_Getter";
 
-Native_SVGFEImageElement_width_Getter(mthis) native "SVGFEImageElement_width_Getter";
+  static $x_Getter(mthis) native "SVGFEFloodElement_x_Getter";
 
-Native_SVGFEImageElement_x_Getter(mthis) native "SVGFEImageElement_x_Getter";
+  static $y_Getter(mthis) native "SVGFEFloodElement_y_Getter";
+}
 
-Native_SVGFEImageElement_y_Getter(mthis) native "SVGFEImageElement_y_Getter";
+class BlinkSVGFEFuncAElement {}
 
-Native_SVGFEImageElement_href_Getter(mthis) native "SVGFEImageElement_href_Getter";
+class BlinkSVGFEFuncBElement {}
 
-Native_SVGFEMergeElement_height_Getter(mthis) native "SVGFEMergeElement_height_Getter";
+class BlinkSVGFEFuncGElement {}
 
-Native_SVGFEMergeElement_result_Getter(mthis) native "SVGFEMergeElement_result_Getter";
+class BlinkSVGFEFuncRElement {}
 
-Native_SVGFEMergeElement_width_Getter(mthis) native "SVGFEMergeElement_width_Getter";
+class BlinkSVGFEGaussianBlurElement {
+  static $in1_Getter(mthis) native "SVGFEGaussianBlurElement_in1_Getter";
 
-Native_SVGFEMergeElement_x_Getter(mthis) native "SVGFEMergeElement_x_Getter";
+  static $stdDeviationX_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
 
-Native_SVGFEMergeElement_y_Getter(mthis) native "SVGFEMergeElement_y_Getter";
+  static $stdDeviationY_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
 
-Native_SVGFEMergeNodeElement_in1_Getter(mthis) native "SVGFEMergeNodeElement_in1_Getter";
+  static $setStdDeviation_Callback(mthis, stdDeviationX, stdDeviationY) native "SVGFEGaussianBlurElement_setStdDeviation_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGFEMorphologyElement_in1_Getter(mthis) native "SVGFEMorphologyElement_in1_Getter";
+  static $height_Getter(mthis) native "SVGFEGaussianBlurElement_height_Getter";
 
-Native_SVGFEMorphologyElement_operator_Getter(mthis) native "SVGFEMorphologyElement_operator_Getter";
+  static $result_Getter(mthis) native "SVGFEGaussianBlurElement_result_Getter";
 
-Native_SVGFEMorphologyElement_radiusX_Getter(mthis) native "SVGFEMorphologyElement_radiusX_Getter";
+  static $width_Getter(mthis) native "SVGFEGaussianBlurElement_width_Getter";
 
-Native_SVGFEMorphologyElement_radiusY_Getter(mthis) native "SVGFEMorphologyElement_radiusY_Getter";
+  static $x_Getter(mthis) native "SVGFEGaussianBlurElement_x_Getter";
 
-Native_SVGFEMorphologyElement_setRadius_Callback(mthis, radiusX, radiusY) native "SVGFEMorphologyElement_setRadius_Callback_RESOLVER_STRING_2_float_float";
+  static $y_Getter(mthis) native "SVGFEGaussianBlurElement_y_Getter";
+}
 
-Native_SVGFEMorphologyElement_height_Getter(mthis) native "SVGFEMorphologyElement_height_Getter";
+class BlinkSVGFEImageElement {
+  static $preserveAspectRatio_Getter(mthis) native "SVGFEImageElement_preserveAspectRatio_Getter";
 
-Native_SVGFEMorphologyElement_result_Getter(mthis) native "SVGFEMorphologyElement_result_Getter";
+  static $height_Getter(mthis) native "SVGFEImageElement_height_Getter";
 
-Native_SVGFEMorphologyElement_width_Getter(mthis) native "SVGFEMorphologyElement_width_Getter";
+  static $result_Getter(mthis) native "SVGFEImageElement_result_Getter";
 
-Native_SVGFEMorphologyElement_x_Getter(mthis) native "SVGFEMorphologyElement_x_Getter";
+  static $width_Getter(mthis) native "SVGFEImageElement_width_Getter";
 
-Native_SVGFEMorphologyElement_y_Getter(mthis) native "SVGFEMorphologyElement_y_Getter";
+  static $x_Getter(mthis) native "SVGFEImageElement_x_Getter";
 
-Native_SVGFEOffsetElement_dx_Getter(mthis) native "SVGFEOffsetElement_dx_Getter";
+  static $y_Getter(mthis) native "SVGFEImageElement_y_Getter";
 
-Native_SVGFEOffsetElement_dy_Getter(mthis) native "SVGFEOffsetElement_dy_Getter";
+  static $href_Getter(mthis) native "SVGFEImageElement_href_Getter";
+}
 
-Native_SVGFEOffsetElement_in1_Getter(mthis) native "SVGFEOffsetElement_in1_Getter";
+class BlinkSVGFEMergeElement {
+  static $height_Getter(mthis) native "SVGFEMergeElement_height_Getter";
 
-Native_SVGFEOffsetElement_height_Getter(mthis) native "SVGFEOffsetElement_height_Getter";
+  static $result_Getter(mthis) native "SVGFEMergeElement_result_Getter";
 
-Native_SVGFEOffsetElement_result_Getter(mthis) native "SVGFEOffsetElement_result_Getter";
+  static $width_Getter(mthis) native "SVGFEMergeElement_width_Getter";
 
-Native_SVGFEOffsetElement_width_Getter(mthis) native "SVGFEOffsetElement_width_Getter";
+  static $x_Getter(mthis) native "SVGFEMergeElement_x_Getter";
 
-Native_SVGFEOffsetElement_x_Getter(mthis) native "SVGFEOffsetElement_x_Getter";
+  static $y_Getter(mthis) native "SVGFEMergeElement_y_Getter";
+}
 
-Native_SVGFEOffsetElement_y_Getter(mthis) native "SVGFEOffsetElement_y_Getter";
+class BlinkSVGFEMergeNodeElement {
+  static $in1_Getter(mthis) native "SVGFEMergeNodeElement_in1_Getter";
+}
 
-Native_SVGFEPointLightElement_x_Getter(mthis) native "SVGFEPointLightElement_x_Getter";
+class BlinkSVGFEMorphologyElement {
+  static $in1_Getter(mthis) native "SVGFEMorphologyElement_in1_Getter";
 
-Native_SVGFEPointLightElement_y_Getter(mthis) native "SVGFEPointLightElement_y_Getter";
+  static $operator_Getter(mthis) native "SVGFEMorphologyElement_operator_Getter";
 
-Native_SVGFEPointLightElement_z_Getter(mthis) native "SVGFEPointLightElement_z_Getter";
+  static $radiusX_Getter(mthis) native "SVGFEMorphologyElement_radiusX_Getter";
 
-Native_SVGFESpecularLightingElement_in1_Getter(mthis) native "SVGFESpecularLightingElement_in1_Getter";
+  static $radiusY_Getter(mthis) native "SVGFEMorphologyElement_radiusY_Getter";
 
-Native_SVGFESpecularLightingElement_specularConstant_Getter(mthis) native "SVGFESpecularLightingElement_specularConstant_Getter";
+  static $setRadius_Callback(mthis, radiusX, radiusY) native "SVGFEMorphologyElement_setRadius_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGFESpecularLightingElement_specularExponent_Getter(mthis) native "SVGFESpecularLightingElement_specularExponent_Getter";
+  static $height_Getter(mthis) native "SVGFEMorphologyElement_height_Getter";
 
-Native_SVGFESpecularLightingElement_surfaceScale_Getter(mthis) native "SVGFESpecularLightingElement_surfaceScale_Getter";
+  static $result_Getter(mthis) native "SVGFEMorphologyElement_result_Getter";
 
-Native_SVGFESpecularLightingElement_height_Getter(mthis) native "SVGFESpecularLightingElement_height_Getter";
+  static $width_Getter(mthis) native "SVGFEMorphologyElement_width_Getter";
 
-Native_SVGFESpecularLightingElement_result_Getter(mthis) native "SVGFESpecularLightingElement_result_Getter";
+  static $x_Getter(mthis) native "SVGFEMorphologyElement_x_Getter";
 
-Native_SVGFESpecularLightingElement_width_Getter(mthis) native "SVGFESpecularLightingElement_width_Getter";
+  static $y_Getter(mthis) native "SVGFEMorphologyElement_y_Getter";
+}
 
-Native_SVGFESpecularLightingElement_x_Getter(mthis) native "SVGFESpecularLightingElement_x_Getter";
+class BlinkSVGFEOffsetElement {
+  static $dx_Getter(mthis) native "SVGFEOffsetElement_dx_Getter";
 
-Native_SVGFESpecularLightingElement_y_Getter(mthis) native "SVGFESpecularLightingElement_y_Getter";
+  static $dy_Getter(mthis) native "SVGFEOffsetElement_dy_Getter";
 
-Native_SVGFESpotLightElement_limitingConeAngle_Getter(mthis) native "SVGFESpotLightElement_limitingConeAngle_Getter";
+  static $in1_Getter(mthis) native "SVGFEOffsetElement_in1_Getter";
 
-Native_SVGFESpotLightElement_pointsAtX_Getter(mthis) native "SVGFESpotLightElement_pointsAtX_Getter";
+  static $height_Getter(mthis) native "SVGFEOffsetElement_height_Getter";
 
-Native_SVGFESpotLightElement_pointsAtY_Getter(mthis) native "SVGFESpotLightElement_pointsAtY_Getter";
+  static $result_Getter(mthis) native "SVGFEOffsetElement_result_Getter";
 
-Native_SVGFESpotLightElement_pointsAtZ_Getter(mthis) native "SVGFESpotLightElement_pointsAtZ_Getter";
+  static $width_Getter(mthis) native "SVGFEOffsetElement_width_Getter";
 
-Native_SVGFESpotLightElement_specularExponent_Getter(mthis) native "SVGFESpotLightElement_specularExponent_Getter";
+  static $x_Getter(mthis) native "SVGFEOffsetElement_x_Getter";
 
-Native_SVGFESpotLightElement_x_Getter(mthis) native "SVGFESpotLightElement_x_Getter";
+  static $y_Getter(mthis) native "SVGFEOffsetElement_y_Getter";
+}
 
-Native_SVGFESpotLightElement_y_Getter(mthis) native "SVGFESpotLightElement_y_Getter";
+class BlinkSVGFEPointLightElement {
+  static $x_Getter(mthis) native "SVGFEPointLightElement_x_Getter";
 
-Native_SVGFESpotLightElement_z_Getter(mthis) native "SVGFESpotLightElement_z_Getter";
+  static $y_Getter(mthis) native "SVGFEPointLightElement_y_Getter";
 
-Native_SVGFETileElement_in1_Getter(mthis) native "SVGFETileElement_in1_Getter";
+  static $z_Getter(mthis) native "SVGFEPointLightElement_z_Getter";
+}
 
-Native_SVGFETileElement_height_Getter(mthis) native "SVGFETileElement_height_Getter";
+class BlinkSVGFESpecularLightingElement {
+  static $in1_Getter(mthis) native "SVGFESpecularLightingElement_in1_Getter";
 
-Native_SVGFETileElement_result_Getter(mthis) native "SVGFETileElement_result_Getter";
+  static $specularConstant_Getter(mthis) native "SVGFESpecularLightingElement_specularConstant_Getter";
 
-Native_SVGFETileElement_width_Getter(mthis) native "SVGFETileElement_width_Getter";
+  static $specularExponent_Getter(mthis) native "SVGFESpecularLightingElement_specularExponent_Getter";
 
-Native_SVGFETileElement_x_Getter(mthis) native "SVGFETileElement_x_Getter";
+  static $surfaceScale_Getter(mthis) native "SVGFESpecularLightingElement_surfaceScale_Getter";
 
-Native_SVGFETileElement_y_Getter(mthis) native "SVGFETileElement_y_Getter";
+  static $height_Getter(mthis) native "SVGFESpecularLightingElement_height_Getter";
 
-Native_SVGFETurbulenceElement_baseFrequencyX_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyX_Getter";
+  static $result_Getter(mthis) native "SVGFESpecularLightingElement_result_Getter";
 
-Native_SVGFETurbulenceElement_baseFrequencyY_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyY_Getter";
+  static $width_Getter(mthis) native "SVGFESpecularLightingElement_width_Getter";
 
-Native_SVGFETurbulenceElement_numOctaves_Getter(mthis) native "SVGFETurbulenceElement_numOctaves_Getter";
+  static $x_Getter(mthis) native "SVGFESpecularLightingElement_x_Getter";
 
-Native_SVGFETurbulenceElement_seed_Getter(mthis) native "SVGFETurbulenceElement_seed_Getter";
+  static $y_Getter(mthis) native "SVGFESpecularLightingElement_y_Getter";
+}
 
-Native_SVGFETurbulenceElement_stitchTiles_Getter(mthis) native "SVGFETurbulenceElement_stitchTiles_Getter";
+class BlinkSVGFESpotLightElement {
+  static $limitingConeAngle_Getter(mthis) native "SVGFESpotLightElement_limitingConeAngle_Getter";
 
-Native_SVGFETurbulenceElement_type_Getter(mthis) native "SVGFETurbulenceElement_type_Getter";
+  static $pointsAtX_Getter(mthis) native "SVGFESpotLightElement_pointsAtX_Getter";
 
-Native_SVGFETurbulenceElement_height_Getter(mthis) native "SVGFETurbulenceElement_height_Getter";
+  static $pointsAtY_Getter(mthis) native "SVGFESpotLightElement_pointsAtY_Getter";
 
-Native_SVGFETurbulenceElement_result_Getter(mthis) native "SVGFETurbulenceElement_result_Getter";
+  static $pointsAtZ_Getter(mthis) native "SVGFESpotLightElement_pointsAtZ_Getter";
 
-Native_SVGFETurbulenceElement_width_Getter(mthis) native "SVGFETurbulenceElement_width_Getter";
+  static $specularExponent_Getter(mthis) native "SVGFESpotLightElement_specularExponent_Getter";
 
-Native_SVGFETurbulenceElement_x_Getter(mthis) native "SVGFETurbulenceElement_x_Getter";
+  static $x_Getter(mthis) native "SVGFESpotLightElement_x_Getter";
 
-Native_SVGFETurbulenceElement_y_Getter(mthis) native "SVGFETurbulenceElement_y_Getter";
+  static $y_Getter(mthis) native "SVGFESpotLightElement_y_Getter";
 
-Native_SVGFilterElement_filterResX_Getter(mthis) native "SVGFilterElement_filterResX_Getter";
+  static $z_Getter(mthis) native "SVGFESpotLightElement_z_Getter";
+}
 
-Native_SVGFilterElement_filterResY_Getter(mthis) native "SVGFilterElement_filterResY_Getter";
+class BlinkSVGFETileElement {
+  static $in1_Getter(mthis) native "SVGFETileElement_in1_Getter";
 
-Native_SVGFilterElement_filterUnits_Getter(mthis) native "SVGFilterElement_filterUnits_Getter";
+  static $height_Getter(mthis) native "SVGFETileElement_height_Getter";
 
-Native_SVGFilterElement_height_Getter(mthis) native "SVGFilterElement_height_Getter";
+  static $result_Getter(mthis) native "SVGFETileElement_result_Getter";
 
-Native_SVGFilterElement_primitiveUnits_Getter(mthis) native "SVGFilterElement_primitiveUnits_Getter";
+  static $width_Getter(mthis) native "SVGFETileElement_width_Getter";
 
-Native_SVGFilterElement_width_Getter(mthis) native "SVGFilterElement_width_Getter";
+  static $x_Getter(mthis) native "SVGFETileElement_x_Getter";
 
-Native_SVGFilterElement_x_Getter(mthis) native "SVGFilterElement_x_Getter";
+  static $y_Getter(mthis) native "SVGFETileElement_y_Getter";
+}
 
-Native_SVGFilterElement_y_Getter(mthis) native "SVGFilterElement_y_Getter";
+class BlinkSVGFETurbulenceElement {
+  static $baseFrequencyX_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyX_Getter";
 
-Native_SVGFilterElement_setFilterRes_Callback(mthis, filterResX, filterResY) native "SVGFilterElement_setFilterRes_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $baseFrequencyY_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyY_Getter";
 
-Native_SVGFilterElement_href_Getter(mthis) native "SVGFilterElement_href_Getter";
+  static $numOctaves_Getter(mthis) native "SVGFETurbulenceElement_numOctaves_Getter";
 
-Native_SVGFitToViewBox_preserveAspectRatio_Getter(mthis) native "SVGFitToViewBox_preserveAspectRatio_Getter";
+  static $seed_Getter(mthis) native "SVGFETurbulenceElement_seed_Getter";
 
-Native_SVGFitToViewBox_viewBox_Getter(mthis) native "SVGFitToViewBox_viewBox_Getter";
+  static $stitchTiles_Getter(mthis) native "SVGFETurbulenceElement_stitchTiles_Getter";
 
-Native_SVGForeignObjectElement_height_Getter(mthis) native "SVGForeignObjectElement_height_Getter";
+  static $type_Getter(mthis) native "SVGFETurbulenceElement_type_Getter";
 
-Native_SVGForeignObjectElement_width_Getter(mthis) native "SVGForeignObjectElement_width_Getter";
+  static $height_Getter(mthis) native "SVGFETurbulenceElement_height_Getter";
 
-Native_SVGForeignObjectElement_x_Getter(mthis) native "SVGForeignObjectElement_x_Getter";
+  static $result_Getter(mthis) native "SVGFETurbulenceElement_result_Getter";
 
-Native_SVGForeignObjectElement_y_Getter(mthis) native "SVGForeignObjectElement_y_Getter";
+  static $width_Getter(mthis) native "SVGFETurbulenceElement_width_Getter";
 
-Native_SVGGradientElement_gradientTransform_Getter(mthis) native "SVGGradientElement_gradientTransform_Getter";
+  static $x_Getter(mthis) native "SVGFETurbulenceElement_x_Getter";
 
-Native_SVGGradientElement_gradientUnits_Getter(mthis) native "SVGGradientElement_gradientUnits_Getter";
+  static $y_Getter(mthis) native "SVGFETurbulenceElement_y_Getter";
+}
 
-Native_SVGGradientElement_spreadMethod_Getter(mthis) native "SVGGradientElement_spreadMethod_Getter";
+class BlinkSVGFilterElement {
+  static $filterResX_Getter(mthis) native "SVGFilterElement_filterResX_Getter";
 
-Native_SVGGradientElement_href_Getter(mthis) native "SVGGradientElement_href_Getter";
+  static $filterResY_Getter(mthis) native "SVGFilterElement_filterResY_Getter";
 
-Native_SVGImageElement_height_Getter(mthis) native "SVGImageElement_height_Getter";
+  static $filterUnits_Getter(mthis) native "SVGFilterElement_filterUnits_Getter";
 
-Native_SVGImageElement_preserveAspectRatio_Getter(mthis) native "SVGImageElement_preserveAspectRatio_Getter";
+  static $height_Getter(mthis) native "SVGFilterElement_height_Getter";
 
-Native_SVGImageElement_width_Getter(mthis) native "SVGImageElement_width_Getter";
+  static $primitiveUnits_Getter(mthis) native "SVGFilterElement_primitiveUnits_Getter";
 
-Native_SVGImageElement_x_Getter(mthis) native "SVGImageElement_x_Getter";
+  static $width_Getter(mthis) native "SVGFilterElement_width_Getter";
 
-Native_SVGImageElement_y_Getter(mthis) native "SVGImageElement_y_Getter";
+  static $x_Getter(mthis) native "SVGFilterElement_x_Getter";
 
-Native_SVGImageElement_href_Getter(mthis) native "SVGImageElement_href_Getter";
+  static $y_Getter(mthis) native "SVGFilterElement_y_Getter";
 
-Native_SVGLength_unitType_Getter(mthis) native "SVGLength_unitType_Getter";
+  static $setFilterRes_Callback(mthis, filterResX, filterResY) native "SVGFilterElement_setFilterRes_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_SVGLength_value_Getter(mthis) native "SVGLength_value_Getter";
+  static $href_Getter(mthis) native "SVGFilterElement_href_Getter";
+}
 
-Native_SVGLength_value_Setter(mthis, value) native "SVGLength_value_Setter";
+class BlinkSVGFitToViewBox {
+  static $preserveAspectRatio_Getter(mthis) native "SVGFitToViewBox_preserveAspectRatio_Getter";
 
-Native_SVGLength_valueAsString_Getter(mthis) native "SVGLength_valueAsString_Getter";
+  static $viewBox_Getter(mthis) native "SVGFitToViewBox_viewBox_Getter";
+}
 
-Native_SVGLength_valueAsString_Setter(mthis, value) native "SVGLength_valueAsString_Setter";
+class BlinkSVGFontElement {}
 
-Native_SVGLength_valueInSpecifiedUnits_Getter(mthis) native "SVGLength_valueInSpecifiedUnits_Getter";
+class BlinkSVGFontFaceElement {}
 
-Native_SVGLength_valueInSpecifiedUnits_Setter(mthis, value) native "SVGLength_valueInSpecifiedUnits_Setter";
+class BlinkSVGFontFaceFormatElement {}
 
-Native_SVGLength_convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGLength_convertToSpecifiedUnits_Callback_RESOLVER_STRING_1_unsigned short";
+class BlinkSVGFontFaceNameElement {}
 
-Native_SVGLength_newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGLength_newValueSpecifiedUnits_Callback_RESOLVER_STRING_2_unsigned short_float";
+class BlinkSVGFontFaceSrcElement {}
 
-Native_SVGLengthList_numberOfItems_Getter(mthis) native "SVGLengthList_numberOfItems_Getter";
+class BlinkSVGFontFaceUriElement {}
 
-Native_SVGLengthList_appendItem_Callback(mthis, item) native "SVGLengthList_appendItem_Callback_RESOLVER_STRING_1_SVGLength";
+class BlinkSVGForeignObjectElement {
+  static $height_Getter(mthis) native "SVGForeignObjectElement_height_Getter";
 
-Native_SVGLengthList_clear_Callback(mthis) native "SVGLengthList_clear_Callback_RESOLVER_STRING_0_";
+  static $width_Getter(mthis) native "SVGForeignObjectElement_width_Getter";
 
-Native_SVGLengthList_getItem_Callback(mthis, index) native "SVGLengthList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $x_Getter(mthis) native "SVGForeignObjectElement_x_Getter";
 
-Native_SVGLengthList_initialize_Callback(mthis, item) native "SVGLengthList_initialize_Callback_RESOLVER_STRING_1_SVGLength";
+  static $y_Getter(mthis) native "SVGForeignObjectElement_y_Getter";
+}
 
-Native_SVGLengthList_insertItemBefore_Callback(mthis, item, index) native "SVGLengthList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGLength_unsigned long";
+class BlinkSVGGElement {}
 
-Native_SVGLengthList_removeItem_Callback(mthis, index) native "SVGLengthList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSVGGlyphElement {}
 
-Native_SVGLengthList_replaceItem_Callback(mthis, item, index) native "SVGLengthList_replaceItem_Callback_RESOLVER_STRING_2_SVGLength_unsigned long";
+class BlinkSVGGlyphRefElement {}
 
-Native_SVGLineElement_x1_Getter(mthis) native "SVGLineElement_x1_Getter";
+class BlinkSVGGradientElement {
+  static $gradientTransform_Getter(mthis) native "SVGGradientElement_gradientTransform_Getter";
 
-Native_SVGLineElement_x2_Getter(mthis) native "SVGLineElement_x2_Getter";
+  static $gradientUnits_Getter(mthis) native "SVGGradientElement_gradientUnits_Getter";
 
-Native_SVGLineElement_y1_Getter(mthis) native "SVGLineElement_y1_Getter";
+  static $spreadMethod_Getter(mthis) native "SVGGradientElement_spreadMethod_Getter";
 
-Native_SVGLineElement_y2_Getter(mthis) native "SVGLineElement_y2_Getter";
+  static $href_Getter(mthis) native "SVGGradientElement_href_Getter";
+}
 
-Native_SVGLinearGradientElement_x1_Getter(mthis) native "SVGLinearGradientElement_x1_Getter";
+class BlinkSVGHKernElement {}
 
-Native_SVGLinearGradientElement_x2_Getter(mthis) native "SVGLinearGradientElement_x2_Getter";
+class BlinkSVGImageElement {
+  static $height_Getter(mthis) native "SVGImageElement_height_Getter";
 
-Native_SVGLinearGradientElement_y1_Getter(mthis) native "SVGLinearGradientElement_y1_Getter";
+  static $preserveAspectRatio_Getter(mthis) native "SVGImageElement_preserveAspectRatio_Getter";
 
-Native_SVGLinearGradientElement_y2_Getter(mthis) native "SVGLinearGradientElement_y2_Getter";
+  static $width_Getter(mthis) native "SVGImageElement_width_Getter";
 
-Native_SVGMarkerElement_markerHeight_Getter(mthis) native "SVGMarkerElement_markerHeight_Getter";
+  static $x_Getter(mthis) native "SVGImageElement_x_Getter";
 
-Native_SVGMarkerElement_markerUnits_Getter(mthis) native "SVGMarkerElement_markerUnits_Getter";
+  static $y_Getter(mthis) native "SVGImageElement_y_Getter";
+
+  static $href_Getter(mthis) native "SVGImageElement_href_Getter";
+}
+
+class BlinkSVGLength {
+  static $unitType_Getter(mthis) native "SVGLength_unitType_Getter";
+
+  static $value_Getter(mthis) native "SVGLength_value_Getter";
+
+  static $value_Setter(mthis, value) native "SVGLength_value_Setter";
+
+  static $valueAsString_Getter(mthis) native "SVGLength_valueAsString_Getter";
+
+  static $valueAsString_Setter(mthis, value) native "SVGLength_valueAsString_Setter";
+
+  static $valueInSpecifiedUnits_Getter(mthis) native "SVGLength_valueInSpecifiedUnits_Getter";
+
+  static $valueInSpecifiedUnits_Setter(mthis, value) native "SVGLength_valueInSpecifiedUnits_Setter";
+
+  static $convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGLength_convertToSpecifiedUnits_Callback_RESOLVER_STRING_1_unsigned short";
+
+  static $newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGLength_newValueSpecifiedUnits_Callback_RESOLVER_STRING_2_unsigned short_float";
+}
+
+class BlinkSVGLengthList {
+  static $numberOfItems_Getter(mthis) native "SVGLengthList_numberOfItems_Getter";
+
+  static $appendItem_Callback(mthis, item) native "SVGLengthList_appendItem_Callback_RESOLVER_STRING_1_SVGLength";
+
+  static $clear_Callback(mthis) native "SVGLengthList_clear_Callback_RESOLVER_STRING_0_";
+
+  static $getItem_Callback(mthis, index) native "SVGLengthList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+
+  static $initialize_Callback(mthis, item) native "SVGLengthList_initialize_Callback_RESOLVER_STRING_1_SVGLength";
+
+  static $insertItemBefore_Callback(mthis, item, index) native "SVGLengthList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGLength_unsigned long";
+
+  static $removeItem_Callback(mthis, index) native "SVGLengthList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+
+  static $replaceItem_Callback(mthis, item, index) native "SVGLengthList_replaceItem_Callback_RESOLVER_STRING_2_SVGLength_unsigned long";
+}
+
+class BlinkSVGLineElement {
+  static $x1_Getter(mthis) native "SVGLineElement_x1_Getter";
+
+  static $x2_Getter(mthis) native "SVGLineElement_x2_Getter";
+
+  static $y1_Getter(mthis) native "SVGLineElement_y1_Getter";
+
+  static $y2_Getter(mthis) native "SVGLineElement_y2_Getter";
+}
+
+class BlinkSVGLinearGradientElement {
+  static $x1_Getter(mthis) native "SVGLinearGradientElement_x1_Getter";
+
+  static $x2_Getter(mthis) native "SVGLinearGradientElement_x2_Getter";
+
+  static $y1_Getter(mthis) native "SVGLinearGradientElement_y1_Getter";
+
+  static $y2_Getter(mthis) native "SVGLinearGradientElement_y2_Getter";
+}
+
+class BlinkSVGMPathElement {}
+
+class BlinkSVGMarkerElement {
+  static $markerHeight_Getter(mthis) native "SVGMarkerElement_markerHeight_Getter";
+
+  static $markerUnits_Getter(mthis) native "SVGMarkerElement_markerUnits_Getter";
+
+  static $markerWidth_Getter(mthis) native "SVGMarkerElement_markerWidth_Getter";
+
+  static $orientAngle_Getter(mthis) native "SVGMarkerElement_orientAngle_Getter";
+
+  static $orientType_Getter(mthis) native "SVGMarkerElement_orientType_Getter";
+
+  static $refX_Getter(mthis) native "SVGMarkerElement_refX_Getter";
+
+  static $refY_Getter(mthis) native "SVGMarkerElement_refY_Getter";
+
+  static $setOrientToAngle_Callback(mthis, angle) native "SVGMarkerElement_setOrientToAngle_Callback_RESOLVER_STRING_1_SVGAngle";
+
+  static $setOrientToAuto_Callback(mthis) native "SVGMarkerElement_setOrientToAuto_Callback_RESOLVER_STRING_0_";
+
+  static $preserveAspectRatio_Getter(mthis) native "SVGMarkerElement_preserveAspectRatio_Getter";
+
+  static $viewBox_Getter(mthis) native "SVGMarkerElement_viewBox_Getter";
+}
+
+class BlinkSVGMaskElement {
+  static $height_Getter(mthis) native "SVGMaskElement_height_Getter";
+
+  static $maskContentUnits_Getter(mthis) native "SVGMaskElement_maskContentUnits_Getter";
+
+  static $maskUnits_Getter(mthis) native "SVGMaskElement_maskUnits_Getter";
+
+  static $width_Getter(mthis) native "SVGMaskElement_width_Getter";
+
+  static $x_Getter(mthis) native "SVGMaskElement_x_Getter";
 
-Native_SVGMarkerElement_markerWidth_Getter(mthis) native "SVGMarkerElement_markerWidth_Getter";
+  static $y_Getter(mthis) native "SVGMaskElement_y_Getter";
 
-Native_SVGMarkerElement_orientAngle_Getter(mthis) native "SVGMarkerElement_orientAngle_Getter";
+  static $requiredExtensions_Getter(mthis) native "SVGMaskElement_requiredExtensions_Getter";
 
-Native_SVGMarkerElement_orientType_Getter(mthis) native "SVGMarkerElement_orientType_Getter";
+  static $requiredFeatures_Getter(mthis) native "SVGMaskElement_requiredFeatures_Getter";
 
-Native_SVGMarkerElement_refX_Getter(mthis) native "SVGMarkerElement_refX_Getter";
+  static $systemLanguage_Getter(mthis) native "SVGMaskElement_systemLanguage_Getter";
 
-Native_SVGMarkerElement_refY_Getter(mthis) native "SVGMarkerElement_refY_Getter";
+  static $hasExtension_Callback(mthis, extension) native "SVGMaskElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_SVGMarkerElement_setOrientToAngle_Callback(mthis, angle) native "SVGMarkerElement_setOrientToAngle_Callback_RESOLVER_STRING_1_SVGAngle";
+class BlinkSVGMatrix {
+  static $a_Getter(mthis) native "SVGMatrix_a_Getter";
 
-Native_SVGMarkerElement_setOrientToAuto_Callback(mthis) native "SVGMarkerElement_setOrientToAuto_Callback_RESOLVER_STRING_0_";
+  static $a_Setter(mthis, value) native "SVGMatrix_a_Setter";
 
-Native_SVGMarkerElement_preserveAspectRatio_Getter(mthis) native "SVGMarkerElement_preserveAspectRatio_Getter";
+  static $b_Getter(mthis) native "SVGMatrix_b_Getter";
 
-Native_SVGMarkerElement_viewBox_Getter(mthis) native "SVGMarkerElement_viewBox_Getter";
+  static $b_Setter(mthis, value) native "SVGMatrix_b_Setter";
 
-Native_SVGMaskElement_height_Getter(mthis) native "SVGMaskElement_height_Getter";
+  static $c_Getter(mthis) native "SVGMatrix_c_Getter";
 
-Native_SVGMaskElement_maskContentUnits_Getter(mthis) native "SVGMaskElement_maskContentUnits_Getter";
+  static $c_Setter(mthis, value) native "SVGMatrix_c_Setter";
 
-Native_SVGMaskElement_maskUnits_Getter(mthis) native "SVGMaskElement_maskUnits_Getter";
+  static $d_Getter(mthis) native "SVGMatrix_d_Getter";
 
-Native_SVGMaskElement_width_Getter(mthis) native "SVGMaskElement_width_Getter";
+  static $d_Setter(mthis, value) native "SVGMatrix_d_Setter";
 
-Native_SVGMaskElement_x_Getter(mthis) native "SVGMaskElement_x_Getter";
+  static $e_Getter(mthis) native "SVGMatrix_e_Getter";
 
-Native_SVGMaskElement_y_Getter(mthis) native "SVGMaskElement_y_Getter";
+  static $e_Setter(mthis, value) native "SVGMatrix_e_Setter";
 
-Native_SVGMaskElement_requiredExtensions_Getter(mthis) native "SVGMaskElement_requiredExtensions_Getter";
+  static $f_Getter(mthis) native "SVGMatrix_f_Getter";
 
-Native_SVGMaskElement_requiredFeatures_Getter(mthis) native "SVGMaskElement_requiredFeatures_Getter";
+  static $f_Setter(mthis, value) native "SVGMatrix_f_Setter";
 
-Native_SVGMaskElement_systemLanguage_Getter(mthis) native "SVGMaskElement_systemLanguage_Getter";
+  static $flipX_Callback(mthis) native "SVGMatrix_flipX_Callback_RESOLVER_STRING_0_";
 
-Native_SVGMaskElement_hasExtension_Callback(mthis, extension) native "SVGMaskElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+  static $flipY_Callback(mthis) native "SVGMatrix_flipY_Callback_RESOLVER_STRING_0_";
 
-Native_SVGMatrix_a_Getter(mthis) native "SVGMatrix_a_Getter";
+  static $inverse_Callback(mthis) native "SVGMatrix_inverse_Callback_RESOLVER_STRING_0_";
 
-Native_SVGMatrix_a_Setter(mthis, value) native "SVGMatrix_a_Setter";
+  static $multiply_Callback(mthis, secondMatrix) native "SVGMatrix_multiply_Callback_RESOLVER_STRING_1_SVGMatrix";
 
-Native_SVGMatrix_b_Getter(mthis) native "SVGMatrix_b_Getter";
+  static $rotate_Callback(mthis, angle) native "SVGMatrix_rotate_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGMatrix_b_Setter(mthis, value) native "SVGMatrix_b_Setter";
+  static $rotateFromVector_Callback(mthis, x, y) native "SVGMatrix_rotateFromVector_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGMatrix_c_Getter(mthis) native "SVGMatrix_c_Getter";
+  static $scale_Callback(mthis, scaleFactor) native "SVGMatrix_scale_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGMatrix_c_Setter(mthis, value) native "SVGMatrix_c_Setter";
+  static $scaleNonUniform_Callback(mthis, scaleFactorX, scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGMatrix_d_Getter(mthis) native "SVGMatrix_d_Getter";
+  static $skewX_Callback(mthis, angle) native "SVGMatrix_skewX_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGMatrix_d_Setter(mthis, value) native "SVGMatrix_d_Setter";
+  static $skewY_Callback(mthis, angle) native "SVGMatrix_skewY_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGMatrix_e_Getter(mthis) native "SVGMatrix_e_Getter";
+  static $translate_Callback(mthis, x, y) native "SVGMatrix_translate_Callback_RESOLVER_STRING_2_float_float";
+}
 
-Native_SVGMatrix_e_Setter(mthis, value) native "SVGMatrix_e_Setter";
+class BlinkSVGMetadataElement {}
 
-Native_SVGMatrix_f_Getter(mthis) native "SVGMatrix_f_Getter";
+class BlinkSVGMissingGlyphElement {}
 
-Native_SVGMatrix_f_Setter(mthis, value) native "SVGMatrix_f_Setter";
+class BlinkSVGNumber {
+  static $value_Getter(mthis) native "SVGNumber_value_Getter";
 
-Native_SVGMatrix_flipX_Callback(mthis) native "SVGMatrix_flipX_Callback_RESOLVER_STRING_0_";
+  static $value_Setter(mthis, value) native "SVGNumber_value_Setter";
+}
 
-Native_SVGMatrix_flipY_Callback(mthis) native "SVGMatrix_flipY_Callback_RESOLVER_STRING_0_";
+class BlinkSVGNumberList {
+  static $numberOfItems_Getter(mthis) native "SVGNumberList_numberOfItems_Getter";
 
-Native_SVGMatrix_inverse_Callback(mthis) native "SVGMatrix_inverse_Callback_RESOLVER_STRING_0_";
+  static $appendItem_Callback(mthis, item) native "SVGNumberList_appendItem_Callback_RESOLVER_STRING_1_SVGNumber";
 
-Native_SVGMatrix_multiply_Callback(mthis, secondMatrix) native "SVGMatrix_multiply_Callback_RESOLVER_STRING_1_SVGMatrix";
+  static $clear_Callback(mthis) native "SVGNumberList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGMatrix_rotate_Callback(mthis, angle) native "SVGMatrix_rotate_Callback_RESOLVER_STRING_1_float";
+  static $getItem_Callback(mthis, index) native "SVGNumberList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGMatrix_rotateFromVector_Callback(mthis, x, y) native "SVGMatrix_rotateFromVector_Callback_RESOLVER_STRING_2_float_float";
+  static $initialize_Callback(mthis, item) native "SVGNumberList_initialize_Callback_RESOLVER_STRING_1_SVGNumber";
 
-Native_SVGMatrix_scale_Callback(mthis, scaleFactor) native "SVGMatrix_scale_Callback_RESOLVER_STRING_1_float";
+  static $insertItemBefore_Callback(mthis, item, index) native "SVGNumberList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGNumber_unsigned long";
 
-Native_SVGMatrix_scaleNonUniform_Callback(mthis, scaleFactorX, scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback_RESOLVER_STRING_2_float_float";
+  static $removeItem_Callback(mthis, index) native "SVGNumberList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGMatrix_skewX_Callback(mthis, angle) native "SVGMatrix_skewX_Callback_RESOLVER_STRING_1_float";
+  static $replaceItem_Callback(mthis, item, index) native "SVGNumberList_replaceItem_Callback_RESOLVER_STRING_2_SVGNumber_unsigned long";
+}
 
-Native_SVGMatrix_skewY_Callback(mthis, angle) native "SVGMatrix_skewY_Callback_RESOLVER_STRING_1_float";
+class BlinkSVGPathElement {
+  static $animatedNormalizedPathSegList_Getter(mthis) native "SVGPathElement_animatedNormalizedPathSegList_Getter";
 
-Native_SVGMatrix_translate_Callback(mthis, x, y) native "SVGMatrix_translate_Callback_RESOLVER_STRING_2_float_float";
+  static $animatedPathSegList_Getter(mthis) native "SVGPathElement_animatedPathSegList_Getter";
 
-Native_SVGNumber_value_Getter(mthis) native "SVGNumber_value_Getter";
+  static $normalizedPathSegList_Getter(mthis) native "SVGPathElement_normalizedPathSegList_Getter";
 
-Native_SVGNumber_value_Setter(mthis, value) native "SVGNumber_value_Setter";
+  static $pathLength_Getter(mthis) native "SVGPathElement_pathLength_Getter";
 
-Native_SVGNumberList_numberOfItems_Getter(mthis) native "SVGNumberList_numberOfItems_Getter";
+  static $pathSegList_Getter(mthis) native "SVGPathElement_pathSegList_Getter";
 
-Native_SVGNumberList_appendItem_Callback(mthis, item) native "SVGNumberList_appendItem_Callback_RESOLVER_STRING_1_SVGNumber";
+  static $createSVGPathSegArcAbs_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback_RESOLVER_STRING_7_float_float_float_float_float_boolean_boolean";
 
-Native_SVGNumberList_clear_Callback(mthis) native "SVGNumberList_clear_Callback_RESOLVER_STRING_0_";
+  static $createSVGPathSegArcRel_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback_RESOLVER_STRING_7_float_float_float_float_float_boolean_boolean";
 
-Native_SVGNumberList_getItem_Callback(mthis, index) native "SVGNumberList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $createSVGPathSegClosePath_Callback(mthis) native "SVGPathElement_createSVGPathSegClosePath_Callback_RESOLVER_STRING_0_";
 
-Native_SVGNumberList_initialize_Callback(mthis, item) native "SVGNumberList_initialize_Callback_RESOLVER_STRING_1_SVGNumber";
+  static $createSVGPathSegCurvetoCubicAbs_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_SVGNumberList_insertItemBefore_Callback(mthis, item, index) native "SVGNumberList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGNumber_unsigned long";
+  static $createSVGPathSegCurvetoCubicRel_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_SVGNumberList_removeItem_Callback(mthis, index) native "SVGNumberList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $createSVGPathSegCurvetoCubicSmoothAbs_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_SVGNumberList_replaceItem_Callback(mthis, item, index) native "SVGNumberList_replaceItem_Callback_RESOLVER_STRING_2_SVGNumber_unsigned long";
+  static $createSVGPathSegCurvetoCubicSmoothRel_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_SVGPathElement_animatedNormalizedPathSegList_Getter(mthis) native "SVGPathElement_animatedNormalizedPathSegList_Getter";
+  static $createSVGPathSegCurvetoQuadraticAbs_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_SVGPathElement_animatedPathSegList_Getter(mthis) native "SVGPathElement_animatedPathSegList_Getter";
+  static $createSVGPathSegCurvetoQuadraticRel_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_SVGPathElement_normalizedPathSegList_Getter(mthis) native "SVGPathElement_normalizedPathSegList_Getter";
+  static $createSVGPathSegCurvetoQuadraticSmoothAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_pathLength_Getter(mthis) native "SVGPathElement_pathLength_Getter";
+  static $createSVGPathSegCurvetoQuadraticSmoothRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_pathSegList_Getter(mthis) native "SVGPathElement_pathSegList_Getter";
+  static $createSVGPathSegLinetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegArcAbs_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback_RESOLVER_STRING_7_float_float_float_float_float_boolean_boolean";
+  static $createSVGPathSegLinetoHorizontalAbs_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegArcRel_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback_RESOLVER_STRING_7_float_float_float_float_float_boolean_boolean";
+  static $createSVGPathSegLinetoHorizontalRel_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegClosePath_Callback(mthis) native "SVGPathElement_createSVGPathSegClosePath_Callback_RESOLVER_STRING_0_";
+  static $createSVGPathSegLinetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $createSVGPathSegLinetoVerticalAbs_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $createSVGPathSegLinetoVerticalRel_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $createSVGPathSegMovetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $createSVGPathSegMovetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $getPathSegAtLength_Callback(mthis, distance) native "SVGPathElement_getPathSegAtLength_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $getPointAtLength_Callback(mthis, distance) native "SVGPathElement_getPointAtLength_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_RESOLVER_STRING_2_float_float";
+  static $getTotalLength_Callback(mthis) native "SVGPathElement_getTotalLength_Callback_RESOLVER_STRING_0_";
+}
 
-Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback_RESOLVER_STRING_2_float_float";
+class BlinkSVGPathSeg {
+  static $pathSegType_Getter(mthis) native "SVGPathSeg_pathSegType_Getter";
 
-Native_SVGPathElement_createSVGPathSegLinetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback_RESOLVER_STRING_2_float_float";
+  static $pathSegTypeAsLetter_Getter(mthis) native "SVGPathSeg_pathSegTypeAsLetter_Getter";
+}
 
-Native_SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback_RESOLVER_STRING_1_float";
+class BlinkSVGPathSegArcAbs {
+  static $angle_Getter(mthis) native "SVGPathSegArcAbs_angle_Getter";
 
-Native_SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback_RESOLVER_STRING_1_float";
+  static $angle_Setter(mthis, value) native "SVGPathSegArcAbs_angle_Setter";
 
-Native_SVGPathElement_createSVGPathSegLinetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback_RESOLVER_STRING_2_float_float";
+  static $largeArcFlag_Getter(mthis) native "SVGPathSegArcAbs_largeArcFlag_Getter";
 
-Native_SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback_RESOLVER_STRING_1_float";
+  static $largeArcFlag_Setter(mthis, value) native "SVGPathSegArcAbs_largeArcFlag_Setter";
 
-Native_SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback_RESOLVER_STRING_1_float";
+  static $r1_Getter(mthis) native "SVGPathSegArcAbs_r1_Getter";
 
-Native_SVGPathElement_createSVGPathSegMovetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback_RESOLVER_STRING_2_float_float";
+  static $r1_Setter(mthis, value) native "SVGPathSegArcAbs_r1_Setter";
 
-Native_SVGPathElement_createSVGPathSegMovetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback_RESOLVER_STRING_2_float_float";
+  static $r2_Getter(mthis) native "SVGPathSegArcAbs_r2_Getter";
 
-Native_SVGPathElement_getPathSegAtLength_Callback(mthis, distance) native "SVGPathElement_getPathSegAtLength_Callback_RESOLVER_STRING_1_float";
+  static $r2_Setter(mthis, value) native "SVGPathSegArcAbs_r2_Setter";
 
-Native_SVGPathElement_getPointAtLength_Callback(mthis, distance) native "SVGPathElement_getPointAtLength_Callback_RESOLVER_STRING_1_float";
+  static $sweepFlag_Getter(mthis) native "SVGPathSegArcAbs_sweepFlag_Getter";
 
-Native_SVGPathElement_getTotalLength_Callback(mthis) native "SVGPathElement_getTotalLength_Callback_RESOLVER_STRING_0_";
+  static $sweepFlag_Setter(mthis, value) native "SVGPathSegArcAbs_sweepFlag_Setter";
 
-Native_SVGPathSeg_pathSegType_Getter(mthis) native "SVGPathSeg_pathSegType_Getter";
+  static $x_Getter(mthis) native "SVGPathSegArcAbs_x_Getter";
 
-Native_SVGPathSeg_pathSegTypeAsLetter_Getter(mthis) native "SVGPathSeg_pathSegTypeAsLetter_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegArcAbs_x_Setter";
 
-Native_SVGPathSegArcAbs_angle_Getter(mthis) native "SVGPathSegArcAbs_angle_Getter";
+  static $y_Getter(mthis) native "SVGPathSegArcAbs_y_Getter";
 
-Native_SVGPathSegArcAbs_angle_Setter(mthis, value) native "SVGPathSegArcAbs_angle_Setter";
+  static $y_Setter(mthis, value) native "SVGPathSegArcAbs_y_Setter";
+}
 
-Native_SVGPathSegArcAbs_largeArcFlag_Getter(mthis) native "SVGPathSegArcAbs_largeArcFlag_Getter";
+class BlinkSVGPathSegArcRel {
+  static $angle_Getter(mthis) native "SVGPathSegArcRel_angle_Getter";
 
-Native_SVGPathSegArcAbs_largeArcFlag_Setter(mthis, value) native "SVGPathSegArcAbs_largeArcFlag_Setter";
+  static $angle_Setter(mthis, value) native "SVGPathSegArcRel_angle_Setter";
 
-Native_SVGPathSegArcAbs_r1_Getter(mthis) native "SVGPathSegArcAbs_r1_Getter";
+  static $largeArcFlag_Getter(mthis) native "SVGPathSegArcRel_largeArcFlag_Getter";
 
-Native_SVGPathSegArcAbs_r1_Setter(mthis, value) native "SVGPathSegArcAbs_r1_Setter";
+  static $largeArcFlag_Setter(mthis, value) native "SVGPathSegArcRel_largeArcFlag_Setter";
 
-Native_SVGPathSegArcAbs_r2_Getter(mthis) native "SVGPathSegArcAbs_r2_Getter";
+  static $r1_Getter(mthis) native "SVGPathSegArcRel_r1_Getter";
 
-Native_SVGPathSegArcAbs_r2_Setter(mthis, value) native "SVGPathSegArcAbs_r2_Setter";
+  static $r1_Setter(mthis, value) native "SVGPathSegArcRel_r1_Setter";
 
-Native_SVGPathSegArcAbs_sweepFlag_Getter(mthis) native "SVGPathSegArcAbs_sweepFlag_Getter";
+  static $r2_Getter(mthis) native "SVGPathSegArcRel_r2_Getter";
 
-Native_SVGPathSegArcAbs_sweepFlag_Setter(mthis, value) native "SVGPathSegArcAbs_sweepFlag_Setter";
+  static $r2_Setter(mthis, value) native "SVGPathSegArcRel_r2_Setter";
 
-Native_SVGPathSegArcAbs_x_Getter(mthis) native "SVGPathSegArcAbs_x_Getter";
+  static $sweepFlag_Getter(mthis) native "SVGPathSegArcRel_sweepFlag_Getter";
 
-Native_SVGPathSegArcAbs_x_Setter(mthis, value) native "SVGPathSegArcAbs_x_Setter";
+  static $sweepFlag_Setter(mthis, value) native "SVGPathSegArcRel_sweepFlag_Setter";
 
-Native_SVGPathSegArcAbs_y_Getter(mthis) native "SVGPathSegArcAbs_y_Getter";
+  static $x_Getter(mthis) native "SVGPathSegArcRel_x_Getter";
 
-Native_SVGPathSegArcAbs_y_Setter(mthis, value) native "SVGPathSegArcAbs_y_Setter";
+  static $x_Setter(mthis, value) native "SVGPathSegArcRel_x_Setter";
 
-Native_SVGPathSegArcRel_angle_Getter(mthis) native "SVGPathSegArcRel_angle_Getter";
+  static $y_Getter(mthis) native "SVGPathSegArcRel_y_Getter";
 
-Native_SVGPathSegArcRel_angle_Setter(mthis, value) native "SVGPathSegArcRel_angle_Setter";
+  static $y_Setter(mthis, value) native "SVGPathSegArcRel_y_Setter";
+}
 
-Native_SVGPathSegArcRel_largeArcFlag_Getter(mthis) native "SVGPathSegArcRel_largeArcFlag_Getter";
+class BlinkSVGPathSegClosePath {}
 
-Native_SVGPathSegArcRel_largeArcFlag_Setter(mthis, value) native "SVGPathSegArcRel_largeArcFlag_Setter";
+class BlinkSVGPathSegCurvetoCubicAbs {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x_Getter";
 
-Native_SVGPathSegArcRel_r1_Getter(mthis) native "SVGPathSegArcRel_r1_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x_Setter";
 
-Native_SVGPathSegArcRel_r1_Setter(mthis, value) native "SVGPathSegArcRel_r1_Setter";
+  static $x1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x1_Getter";
 
-Native_SVGPathSegArcRel_r2_Getter(mthis) native "SVGPathSegArcRel_r2_Getter";
+  static $x1_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x1_Setter";
 
-Native_SVGPathSegArcRel_r2_Setter(mthis, value) native "SVGPathSegArcRel_r2_Setter";
+  static $x2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x2_Getter";
 
-Native_SVGPathSegArcRel_sweepFlag_Getter(mthis) native "SVGPathSegArcRel_sweepFlag_Getter";
+  static $x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x2_Setter";
 
-Native_SVGPathSegArcRel_sweepFlag_Setter(mthis, value) native "SVGPathSegArcRel_sweepFlag_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y_Getter";
 
-Native_SVGPathSegArcRel_x_Getter(mthis) native "SVGPathSegArcRel_x_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y_Setter";
 
-Native_SVGPathSegArcRel_x_Setter(mthis, value) native "SVGPathSegArcRel_x_Setter";
+  static $y1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y1_Getter";
 
-Native_SVGPathSegArcRel_y_Getter(mthis) native "SVGPathSegArcRel_y_Getter";
+  static $y1_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y1_Setter";
 
-Native_SVGPathSegArcRel_y_Setter(mthis, value) native "SVGPathSegArcRel_y_Setter";
+  static $y2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y2_Getter";
 
-Native_SVGPathSegCurvetoCubicAbs_x_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x_Getter";
+  static $y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y2_Setter";
+}
 
-Native_SVGPathSegCurvetoCubicAbs_x_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x_Setter";
+class BlinkSVGPathSegCurvetoCubicRel {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x_Getter";
 
-Native_SVGPathSegCurvetoCubicAbs_x1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x1_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x_Setter";
 
-Native_SVGPathSegCurvetoCubicAbs_x1_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x1_Setter";
+  static $x1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x1_Getter";
 
-Native_SVGPathSegCurvetoCubicAbs_x2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x2_Getter";
+  static $x1_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x1_Setter";
 
-Native_SVGPathSegCurvetoCubicAbs_x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x2_Setter";
+  static $x2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x2_Getter";
 
-Native_SVGPathSegCurvetoCubicAbs_y_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y_Getter";
+  static $x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x2_Setter";
 
-Native_SVGPathSegCurvetoCubicAbs_y_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y_Getter";
 
-Native_SVGPathSegCurvetoCubicAbs_y1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y1_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y_Setter";
 
-Native_SVGPathSegCurvetoCubicAbs_y1_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y1_Setter";
+  static $y1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y1_Getter";
 
-Native_SVGPathSegCurvetoCubicAbs_y2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y2_Getter";
+  static $y1_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y1_Setter";
 
-Native_SVGPathSegCurvetoCubicAbs_y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y2_Setter";
+  static $y2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y2_Getter";
 
-Native_SVGPathSegCurvetoCubicRel_x_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x_Getter";
+  static $y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y2_Setter";
+}
 
-Native_SVGPathSegCurvetoCubicRel_x_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x_Setter";
+class BlinkSVGPathSegCurvetoCubicSmoothAbs {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x_Getter";
 
-Native_SVGPathSegCurvetoCubicRel_x1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x1_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_x_Setter";
 
-Native_SVGPathSegCurvetoCubicRel_x1_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x1_Setter";
+  static $x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Getter";
 
-Native_SVGPathSegCurvetoCubicRel_x2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x2_Getter";
+  static $x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Setter";
 
-Native_SVGPathSegCurvetoCubicRel_x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x2_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y_Getter";
 
-Native_SVGPathSegCurvetoCubicRel_y_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_y_Setter";
 
-Native_SVGPathSegCurvetoCubicRel_y_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y_Setter";
+  static $y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Getter";
 
-Native_SVGPathSegCurvetoCubicRel_y1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y1_Getter";
+  static $y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Setter";
+}
 
-Native_SVGPathSegCurvetoCubicRel_y1_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y1_Setter";
+class BlinkSVGPathSegCurvetoCubicSmoothRel {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x_Getter";
 
-Native_SVGPathSegCurvetoCubicRel_y2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y2_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_x_Setter";
 
-Native_SVGPathSegCurvetoCubicRel_y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y2_Setter";
+  static $x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x2_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x_Getter";
+  static $x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_x2_Setter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_x_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_x_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_y_Setter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Setter";
+  static $y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y2_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y_Getter";
+  static $y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_y2_Setter";
+}
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_y_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_y_Setter";
+class BlinkSVGPathSegCurvetoQuadraticAbs {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_x_Setter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Setter";
+  static $x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x1_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x_Getter";
+  static $x1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_x1_Setter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_x_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_x_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x2_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_y_Setter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_x2_Setter";
+  static $y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y1_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y_Getter";
+  static $y1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_y1_Setter";
+}
 
-Native_SVGPathSegCurvetoCubicSmoothRel_y_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_y_Setter";
+class BlinkSVGPathSegCurvetoQuadraticRel {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y2_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_x_Setter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_y2_Setter";
+  static $x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x1_Getter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_x_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x_Getter";
+  static $x1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_x1_Setter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_x_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y_Getter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x1_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_y_Setter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_x1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_x1_Setter";
+  static $y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y1_Getter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_y_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y_Getter";
+  static $y1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_y1_Setter";
+}
 
-Native_SVGPathSegCurvetoQuadraticAbs_y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_y_Setter";
+class BlinkSVGPathSegCurvetoQuadraticSmoothAbs {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y1_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_y1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_y1_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter";
 
-Native_SVGPathSegCurvetoQuadraticRel_x_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter";
+}
 
-Native_SVGPathSegCurvetoQuadraticRel_x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_x_Setter";
+class BlinkSVGPathSegCurvetoQuadraticSmoothRel {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Getter";
 
-Native_SVGPathSegCurvetoQuadraticRel_x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x1_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Setter";
 
-Native_SVGPathSegCurvetoQuadraticRel_x1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_x1_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Getter";
 
-Native_SVGPathSegCurvetoQuadraticRel_y_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Setter";
+}
 
-Native_SVGPathSegCurvetoQuadraticRel_y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_y_Setter";
+class BlinkSVGPathSegLinetoAbs {
+  static $x_Getter(mthis) native "SVGPathSegLinetoAbs_x_Getter";
 
-Native_SVGPathSegCurvetoQuadraticRel_y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y1_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegLinetoAbs_x_Setter";
 
-Native_SVGPathSegCurvetoQuadraticRel_y1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_y1_Setter";
+  static $y_Getter(mthis) native "SVGPathSegLinetoAbs_y_Getter";
 
-Native_SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegLinetoAbs_y_Setter";
+}
 
-Native_SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter";
+class BlinkSVGPathSegLinetoHorizontalAbs {
+  static $x_Getter(mthis) native "SVGPathSegLinetoHorizontalAbs_x_Getter";
 
-Native_SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegLinetoHorizontalAbs_x_Setter";
+}
 
-Native_SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter";
+class BlinkSVGPathSegLinetoHorizontalRel {
+  static $x_Getter(mthis) native "SVGPathSegLinetoHorizontalRel_x_Getter";
 
-Native_SVGPathSegCurvetoQuadraticSmoothRel_x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegLinetoHorizontalRel_x_Setter";
+}
 
-Native_SVGPathSegCurvetoQuadraticSmoothRel_x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Setter";
+class BlinkSVGPathSegLinetoRel {
+  static $x_Getter(mthis) native "SVGPathSegLinetoRel_x_Getter";
 
-Native_SVGPathSegCurvetoQuadraticSmoothRel_y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegLinetoRel_x_Setter";
 
-Native_SVGPathSegCurvetoQuadraticSmoothRel_y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Setter";
+  static $y_Getter(mthis) native "SVGPathSegLinetoRel_y_Getter";
 
-Native_SVGPathSegLinetoAbs_x_Getter(mthis) native "SVGPathSegLinetoAbs_x_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegLinetoRel_y_Setter";
+}
 
-Native_SVGPathSegLinetoAbs_x_Setter(mthis, value) native "SVGPathSegLinetoAbs_x_Setter";
+class BlinkSVGPathSegLinetoVerticalAbs {
+  static $y_Getter(mthis) native "SVGPathSegLinetoVerticalAbs_y_Getter";
 
-Native_SVGPathSegLinetoAbs_y_Getter(mthis) native "SVGPathSegLinetoAbs_y_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegLinetoVerticalAbs_y_Setter";
+}
 
-Native_SVGPathSegLinetoAbs_y_Setter(mthis, value) native "SVGPathSegLinetoAbs_y_Setter";
+class BlinkSVGPathSegLinetoVerticalRel {
+  static $y_Getter(mthis) native "SVGPathSegLinetoVerticalRel_y_Getter";
 
-Native_SVGPathSegLinetoHorizontalAbs_x_Getter(mthis) native "SVGPathSegLinetoHorizontalAbs_x_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegLinetoVerticalRel_y_Setter";
+}
 
-Native_SVGPathSegLinetoHorizontalAbs_x_Setter(mthis, value) native "SVGPathSegLinetoHorizontalAbs_x_Setter";
+class BlinkSVGPathSegList {
+  static $numberOfItems_Getter(mthis) native "SVGPathSegList_numberOfItems_Getter";
 
-Native_SVGPathSegLinetoHorizontalRel_x_Getter(mthis) native "SVGPathSegLinetoHorizontalRel_x_Getter";
+  static $appendItem_Callback(mthis, newItem) native "SVGPathSegList_appendItem_Callback_RESOLVER_STRING_1_SVGPathSeg";
 
-Native_SVGPathSegLinetoHorizontalRel_x_Setter(mthis, value) native "SVGPathSegLinetoHorizontalRel_x_Setter";
+  static $clear_Callback(mthis) native "SVGPathSegList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGPathSegLinetoRel_x_Getter(mthis) native "SVGPathSegLinetoRel_x_Getter";
+  static $getItem_Callback(mthis, index) native "SVGPathSegList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGPathSegLinetoRel_x_Setter(mthis, value) native "SVGPathSegLinetoRel_x_Setter";
+  static $initialize_Callback(mthis, newItem) native "SVGPathSegList_initialize_Callback_RESOLVER_STRING_1_SVGPathSeg";
 
-Native_SVGPathSegLinetoRel_y_Getter(mthis) native "SVGPathSegLinetoRel_y_Getter";
+  static $insertItemBefore_Callback(mthis, newItem, index) native "SVGPathSegList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGPathSeg_unsigned long";
 
-Native_SVGPathSegLinetoRel_y_Setter(mthis, value) native "SVGPathSegLinetoRel_y_Setter";
+  static $removeItem_Callback(mthis, index) native "SVGPathSegList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGPathSegLinetoVerticalAbs_y_Getter(mthis) native "SVGPathSegLinetoVerticalAbs_y_Getter";
+  static $replaceItem_Callback(mthis, newItem, index) native "SVGPathSegList_replaceItem_Callback_RESOLVER_STRING_2_SVGPathSeg_unsigned long";
+}
 
-Native_SVGPathSegLinetoVerticalAbs_y_Setter(mthis, value) native "SVGPathSegLinetoVerticalAbs_y_Setter";
+class BlinkSVGPathSegMovetoAbs {
+  static $x_Getter(mthis) native "SVGPathSegMovetoAbs_x_Getter";
 
-Native_SVGPathSegLinetoVerticalRel_y_Getter(mthis) native "SVGPathSegLinetoVerticalRel_y_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegMovetoAbs_x_Setter";
 
-Native_SVGPathSegLinetoVerticalRel_y_Setter(mthis, value) native "SVGPathSegLinetoVerticalRel_y_Setter";
+  static $y_Getter(mthis) native "SVGPathSegMovetoAbs_y_Getter";
 
-Native_SVGPathSegList_numberOfItems_Getter(mthis) native "SVGPathSegList_numberOfItems_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegMovetoAbs_y_Setter";
+}
 
-Native_SVGPathSegList_appendItem_Callback(mthis, newItem) native "SVGPathSegList_appendItem_Callback_RESOLVER_STRING_1_SVGPathSeg";
+class BlinkSVGPathSegMovetoRel {
+  static $x_Getter(mthis) native "SVGPathSegMovetoRel_x_Getter";
 
-Native_SVGPathSegList_clear_Callback(mthis) native "SVGPathSegList_clear_Callback_RESOLVER_STRING_0_";
+  static $x_Setter(mthis, value) native "SVGPathSegMovetoRel_x_Setter";
 
-Native_SVGPathSegList_getItem_Callback(mthis, index) native "SVGPathSegList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $y_Getter(mthis) native "SVGPathSegMovetoRel_y_Getter";
 
-Native_SVGPathSegList_initialize_Callback(mthis, newItem) native "SVGPathSegList_initialize_Callback_RESOLVER_STRING_1_SVGPathSeg";
+  static $y_Setter(mthis, value) native "SVGPathSegMovetoRel_y_Setter";
+}
 
-Native_SVGPathSegList_insertItemBefore_Callback(mthis, newItem, index) native "SVGPathSegList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGPathSeg_unsigned long";
+class BlinkSVGPatternElement {
+  static $height_Getter(mthis) native "SVGPatternElement_height_Getter";
 
-Native_SVGPathSegList_removeItem_Callback(mthis, index) native "SVGPathSegList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $patternContentUnits_Getter(mthis) native "SVGPatternElement_patternContentUnits_Getter";
 
-Native_SVGPathSegList_replaceItem_Callback(mthis, newItem, index) native "SVGPathSegList_replaceItem_Callback_RESOLVER_STRING_2_SVGPathSeg_unsigned long";
+  static $patternTransform_Getter(mthis) native "SVGPatternElement_patternTransform_Getter";
 
-Native_SVGPathSegMovetoAbs_x_Getter(mthis) native "SVGPathSegMovetoAbs_x_Getter";
+  static $patternUnits_Getter(mthis) native "SVGPatternElement_patternUnits_Getter";
 
-Native_SVGPathSegMovetoAbs_x_Setter(mthis, value) native "SVGPathSegMovetoAbs_x_Setter";
+  static $width_Getter(mthis) native "SVGPatternElement_width_Getter";
 
-Native_SVGPathSegMovetoAbs_y_Getter(mthis) native "SVGPathSegMovetoAbs_y_Getter";
+  static $x_Getter(mthis) native "SVGPatternElement_x_Getter";
 
-Native_SVGPathSegMovetoAbs_y_Setter(mthis, value) native "SVGPathSegMovetoAbs_y_Setter";
+  static $y_Getter(mthis) native "SVGPatternElement_y_Getter";
 
-Native_SVGPathSegMovetoRel_x_Getter(mthis) native "SVGPathSegMovetoRel_x_Getter";
+  static $preserveAspectRatio_Getter(mthis) native "SVGPatternElement_preserveAspectRatio_Getter";
 
-Native_SVGPathSegMovetoRel_x_Setter(mthis, value) native "SVGPathSegMovetoRel_x_Setter";
+  static $viewBox_Getter(mthis) native "SVGPatternElement_viewBox_Getter";
 
-Native_SVGPathSegMovetoRel_y_Getter(mthis) native "SVGPathSegMovetoRel_y_Getter";
+  static $requiredExtensions_Getter(mthis) native "SVGPatternElement_requiredExtensions_Getter";
 
-Native_SVGPathSegMovetoRel_y_Setter(mthis, value) native "SVGPathSegMovetoRel_y_Setter";
+  static $requiredFeatures_Getter(mthis) native "SVGPatternElement_requiredFeatures_Getter";
 
-Native_SVGPatternElement_height_Getter(mthis) native "SVGPatternElement_height_Getter";
+  static $systemLanguage_Getter(mthis) native "SVGPatternElement_systemLanguage_Getter";
 
-Native_SVGPatternElement_patternContentUnits_Getter(mthis) native "SVGPatternElement_patternContentUnits_Getter";
+  static $hasExtension_Callback(mthis, extension) native "SVGPatternElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGPatternElement_patternTransform_Getter(mthis) native "SVGPatternElement_patternTransform_Getter";
+  static $href_Getter(mthis) native "SVGPatternElement_href_Getter";
+}
 
-Native_SVGPatternElement_patternUnits_Getter(mthis) native "SVGPatternElement_patternUnits_Getter";
+class BlinkSVGPoint {
+  static $x_Getter(mthis) native "SVGPoint_x_Getter";
 
-Native_SVGPatternElement_width_Getter(mthis) native "SVGPatternElement_width_Getter";
+  static $x_Setter(mthis, value) native "SVGPoint_x_Setter";
 
-Native_SVGPatternElement_x_Getter(mthis) native "SVGPatternElement_x_Getter";
+  static $y_Getter(mthis) native "SVGPoint_y_Getter";
 
-Native_SVGPatternElement_y_Getter(mthis) native "SVGPatternElement_y_Getter";
+  static $y_Setter(mthis, value) native "SVGPoint_y_Setter";
 
-Native_SVGPatternElement_preserveAspectRatio_Getter(mthis) native "SVGPatternElement_preserveAspectRatio_Getter";
+  static $matrixTransform_Callback(mthis, matrix) native "SVGPoint_matrixTransform_Callback_RESOLVER_STRING_1_SVGMatrix";
+}
 
-Native_SVGPatternElement_viewBox_Getter(mthis) native "SVGPatternElement_viewBox_Getter";
+class BlinkSVGPointList {
+  static $numberOfItems_Getter(mthis) native "SVGPointList_numberOfItems_Getter";
 
-Native_SVGPatternElement_requiredExtensions_Getter(mthis) native "SVGPatternElement_requiredExtensions_Getter";
+  static $appendItem_Callback(mthis, item) native "SVGPointList_appendItem_Callback_RESOLVER_STRING_1_SVGPoint";
 
-Native_SVGPatternElement_requiredFeatures_Getter(mthis) native "SVGPatternElement_requiredFeatures_Getter";
+  static $clear_Callback(mthis) native "SVGPointList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGPatternElement_systemLanguage_Getter(mthis) native "SVGPatternElement_systemLanguage_Getter";
+  static $getItem_Callback(mthis, index) native "SVGPointList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGPatternElement_hasExtension_Callback(mthis, extension) native "SVGPatternElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+  static $initialize_Callback(mthis, item) native "SVGPointList_initialize_Callback_RESOLVER_STRING_1_SVGPoint";
 
-Native_SVGPatternElement_href_Getter(mthis) native "SVGPatternElement_href_Getter";
+  static $insertItemBefore_Callback(mthis, item, index) native "SVGPointList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGPoint_unsigned long";
 
-Native_SVGPoint_x_Getter(mthis) native "SVGPoint_x_Getter";
+  static $removeItem_Callback(mthis, index) native "SVGPointList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGPoint_x_Setter(mthis, value) native "SVGPoint_x_Setter";
+  static $replaceItem_Callback(mthis, item, index) native "SVGPointList_replaceItem_Callback_RESOLVER_STRING_2_SVGPoint_unsigned long";
+}
 
-Native_SVGPoint_y_Getter(mthis) native "SVGPoint_y_Getter";
+class BlinkSVGPolygonElement {
+  static $animatedPoints_Getter(mthis) native "SVGPolygonElement_animatedPoints_Getter";
 
-Native_SVGPoint_y_Setter(mthis, value) native "SVGPoint_y_Setter";
+  static $points_Getter(mthis) native "SVGPolygonElement_points_Getter";
+}
 
-Native_SVGPoint_matrixTransform_Callback(mthis, matrix) native "SVGPoint_matrixTransform_Callback_RESOLVER_STRING_1_SVGMatrix";
+class BlinkSVGPolylineElement {
+  static $animatedPoints_Getter(mthis) native "SVGPolylineElement_animatedPoints_Getter";
 
-Native_SVGPointList_numberOfItems_Getter(mthis) native "SVGPointList_numberOfItems_Getter";
+  static $points_Getter(mthis) native "SVGPolylineElement_points_Getter";
+}
 
-Native_SVGPointList_appendItem_Callback(mthis, item) native "SVGPointList_appendItem_Callback_RESOLVER_STRING_1_SVGPoint";
+class BlinkSVGPreserveAspectRatio {
+  static $align_Getter(mthis) native "SVGPreserveAspectRatio_align_Getter";
 
-Native_SVGPointList_clear_Callback(mthis) native "SVGPointList_clear_Callback_RESOLVER_STRING_0_";
+  static $align_Setter(mthis, value) native "SVGPreserveAspectRatio_align_Setter";
 
-Native_SVGPointList_getItem_Callback(mthis, index) native "SVGPointList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $meetOrSlice_Getter(mthis) native "SVGPreserveAspectRatio_meetOrSlice_Getter";
 
-Native_SVGPointList_initialize_Callback(mthis, item) native "SVGPointList_initialize_Callback_RESOLVER_STRING_1_SVGPoint";
+  static $meetOrSlice_Setter(mthis, value) native "SVGPreserveAspectRatio_meetOrSlice_Setter";
+}
 
-Native_SVGPointList_insertItemBefore_Callback(mthis, item, index) native "SVGPointList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGPoint_unsigned long";
+class BlinkSVGRadialGradientElement {
+  static $cx_Getter(mthis) native "SVGRadialGradientElement_cx_Getter";
 
-Native_SVGPointList_removeItem_Callback(mthis, index) native "SVGPointList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $cy_Getter(mthis) native "SVGRadialGradientElement_cy_Getter";
 
-Native_SVGPointList_replaceItem_Callback(mthis, item, index) native "SVGPointList_replaceItem_Callback_RESOLVER_STRING_2_SVGPoint_unsigned long";
+  static $fr_Getter(mthis) native "SVGRadialGradientElement_fr_Getter";
 
-Native_SVGPolygonElement_animatedPoints_Getter(mthis) native "SVGPolygonElement_animatedPoints_Getter";
+  static $fx_Getter(mthis) native "SVGRadialGradientElement_fx_Getter";
 
-Native_SVGPolygonElement_points_Getter(mthis) native "SVGPolygonElement_points_Getter";
+  static $fy_Getter(mthis) native "SVGRadialGradientElement_fy_Getter";
 
-Native_SVGPolylineElement_animatedPoints_Getter(mthis) native "SVGPolylineElement_animatedPoints_Getter";
+  static $r_Getter(mthis) native "SVGRadialGradientElement_r_Getter";
+}
 
-Native_SVGPolylineElement_points_Getter(mthis) native "SVGPolylineElement_points_Getter";
+class BlinkSVGRect {
+  static $height_Getter(mthis) native "SVGRect_height_Getter";
 
-Native_SVGPreserveAspectRatio_align_Getter(mthis) native "SVGPreserveAspectRatio_align_Getter";
+  static $height_Setter(mthis, value) native "SVGRect_height_Setter";
 
-Native_SVGPreserveAspectRatio_align_Setter(mthis, value) native "SVGPreserveAspectRatio_align_Setter";
+  static $width_Getter(mthis) native "SVGRect_width_Getter";
 
-Native_SVGPreserveAspectRatio_meetOrSlice_Getter(mthis) native "SVGPreserveAspectRatio_meetOrSlice_Getter";
+  static $width_Setter(mthis, value) native "SVGRect_width_Setter";
 
-Native_SVGPreserveAspectRatio_meetOrSlice_Setter(mthis, value) native "SVGPreserveAspectRatio_meetOrSlice_Setter";
+  static $x_Getter(mthis) native "SVGRect_x_Getter";
 
-Native_SVGRadialGradientElement_cx_Getter(mthis) native "SVGRadialGradientElement_cx_Getter";
+  static $x_Setter(mthis, value) native "SVGRect_x_Setter";
 
-Native_SVGRadialGradientElement_cy_Getter(mthis) native "SVGRadialGradientElement_cy_Getter";
+  static $y_Getter(mthis) native "SVGRect_y_Getter";
 
-Native_SVGRadialGradientElement_fr_Getter(mthis) native "SVGRadialGradientElement_fr_Getter";
+  static $y_Setter(mthis, value) native "SVGRect_y_Setter";
+}
 
-Native_SVGRadialGradientElement_fx_Getter(mthis) native "SVGRadialGradientElement_fx_Getter";
+class BlinkSVGRectElement {
+  static $height_Getter(mthis) native "SVGRectElement_height_Getter";
 
-Native_SVGRadialGradientElement_fy_Getter(mthis) native "SVGRadialGradientElement_fy_Getter";
+  static $rx_Getter(mthis) native "SVGRectElement_rx_Getter";
 
-Native_SVGRadialGradientElement_r_Getter(mthis) native "SVGRadialGradientElement_r_Getter";
+  static $ry_Getter(mthis) native "SVGRectElement_ry_Getter";
 
-Native_SVGRect_height_Getter(mthis) native "SVGRect_height_Getter";
+  static $width_Getter(mthis) native "SVGRectElement_width_Getter";
 
-Native_SVGRect_height_Setter(mthis, value) native "SVGRect_height_Setter";
+  static $x_Getter(mthis) native "SVGRectElement_x_Getter";
 
-Native_SVGRect_width_Getter(mthis) native "SVGRect_width_Getter";
+  static $y_Getter(mthis) native "SVGRectElement_y_Getter";
+}
 
-Native_SVGRect_width_Setter(mthis, value) native "SVGRect_width_Setter";
+class BlinkSVGRenderingIntent {}
 
-Native_SVGRect_x_Getter(mthis) native "SVGRect_x_Getter";
+class BlinkSVGZoomAndPan {
+  static $zoomAndPan_Getter(mthis) native "SVGZoomAndPan_zoomAndPan_Getter";
 
-Native_SVGRect_x_Setter(mthis, value) native "SVGRect_x_Setter";
+  static $zoomAndPan_Setter(mthis, value) native "SVGZoomAndPan_zoomAndPan_Setter";
+}
 
-Native_SVGRect_y_Getter(mthis) native "SVGRect_y_Getter";
+class BlinkSVGSVGElement {
+  static $currentScale_Getter(mthis) native "SVGSVGElement_currentScale_Getter";
 
-Native_SVGRect_y_Setter(mthis, value) native "SVGRect_y_Setter";
+  static $currentScale_Setter(mthis, value) native "SVGSVGElement_currentScale_Setter";
 
-Native_SVGRectElement_height_Getter(mthis) native "SVGRectElement_height_Getter";
+  static $currentTranslate_Getter(mthis) native "SVGSVGElement_currentTranslate_Getter";
 
-Native_SVGRectElement_rx_Getter(mthis) native "SVGRectElement_rx_Getter";
+  static $currentView_Getter(mthis) native "SVGSVGElement_currentView_Getter";
 
-Native_SVGRectElement_ry_Getter(mthis) native "SVGRectElement_ry_Getter";
+  static $height_Getter(mthis) native "SVGSVGElement_height_Getter";
 
-Native_SVGRectElement_width_Getter(mthis) native "SVGRectElement_width_Getter";
+  static $pixelUnitToMillimeterX_Getter(mthis) native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
 
-Native_SVGRectElement_x_Getter(mthis) native "SVGRectElement_x_Getter";
+  static $pixelUnitToMillimeterY_Getter(mthis) native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
 
-Native_SVGRectElement_y_Getter(mthis) native "SVGRectElement_y_Getter";
+  static $screenPixelToMillimeterX_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterX_Getter";
 
-Native_SVGZoomAndPan_zoomAndPan_Getter(mthis) native "SVGZoomAndPan_zoomAndPan_Getter";
+  static $screenPixelToMillimeterY_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterY_Getter";
 
-Native_SVGZoomAndPan_zoomAndPan_Setter(mthis, value) native "SVGZoomAndPan_zoomAndPan_Setter";
+  static $useCurrentView_Getter(mthis) native "SVGSVGElement_useCurrentView_Getter";
 
-Native_SVGSVGElement_currentScale_Getter(mthis) native "SVGSVGElement_currentScale_Getter";
+  static $viewport_Getter(mthis) native "SVGSVGElement_viewport_Getter";
 
-Native_SVGSVGElement_currentScale_Setter(mthis, value) native "SVGSVGElement_currentScale_Setter";
+  static $width_Getter(mthis) native "SVGSVGElement_width_Getter";
 
-Native_SVGSVGElement_currentTranslate_Getter(mthis) native "SVGSVGElement_currentTranslate_Getter";
+  static $x_Getter(mthis) native "SVGSVGElement_x_Getter";
 
-Native_SVGSVGElement_currentView_Getter(mthis) native "SVGSVGElement_currentView_Getter";
+  static $y_Getter(mthis) native "SVGSVGElement_y_Getter";
 
-Native_SVGSVGElement_height_Getter(mthis) native "SVGSVGElement_height_Getter";
+  static $animationsPaused_Callback(mthis) native "SVGSVGElement_animationsPaused_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_pixelUnitToMillimeterX_Getter(mthis) native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
+  static $checkEnclosure_Callback(mthis, element, rect) native "SVGSVGElement_checkEnclosure_Callback_RESOLVER_STRING_2_SVGElement_SVGRect";
 
-Native_SVGSVGElement_pixelUnitToMillimeterY_Getter(mthis) native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
+  static $checkIntersection_Callback(mthis, element, rect) native "SVGSVGElement_checkIntersection_Callback_RESOLVER_STRING_2_SVGElement_SVGRect";
 
-Native_SVGSVGElement_screenPixelToMillimeterX_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterX_Getter";
+  static $createSVGAngle_Callback(mthis) native "SVGSVGElement_createSVGAngle_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_screenPixelToMillimeterY_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterY_Getter";
+  static $createSVGLength_Callback(mthis) native "SVGSVGElement_createSVGLength_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_useCurrentView_Getter(mthis) native "SVGSVGElement_useCurrentView_Getter";
+  static $createSVGMatrix_Callback(mthis) native "SVGSVGElement_createSVGMatrix_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_viewport_Getter(mthis) native "SVGSVGElement_viewport_Getter";
+  static $createSVGNumber_Callback(mthis) native "SVGSVGElement_createSVGNumber_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_width_Getter(mthis) native "SVGSVGElement_width_Getter";
+  static $createSVGPoint_Callback(mthis) native "SVGSVGElement_createSVGPoint_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_x_Getter(mthis) native "SVGSVGElement_x_Getter";
+  static $createSVGRect_Callback(mthis) native "SVGSVGElement_createSVGRect_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_y_Getter(mthis) native "SVGSVGElement_y_Getter";
+  static $createSVGTransform_Callback(mthis) native "SVGSVGElement_createSVGTransform_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_animationsPaused_Callback(mthis) native "SVGSVGElement_animationsPaused_Callback_RESOLVER_STRING_0_";
+  static $createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
 
-Native_SVGSVGElement_checkEnclosure_Callback(mthis, element, rect) native "SVGSVGElement_checkEnclosure_Callback_RESOLVER_STRING_2_SVGElement_SVGRect";
+  static $deselectAll_Callback(mthis) native "SVGSVGElement_deselectAll_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_checkIntersection_Callback(mthis, element, rect) native "SVGSVGElement_checkIntersection_Callback_RESOLVER_STRING_2_SVGElement_SVGRect";
+  static $forceRedraw_Callback(mthis) native "SVGSVGElement_forceRedraw_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGAngle_Callback(mthis) native "SVGSVGElement_createSVGAngle_Callback_RESOLVER_STRING_0_";
+  static $getCurrentTime_Callback(mthis) native "SVGSVGElement_getCurrentTime_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGLength_Callback(mthis) native "SVGSVGElement_createSVGLength_Callback_RESOLVER_STRING_0_";
+  static $getElementById_Callback(mthis, elementId) native "SVGSVGElement_getElementById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGSVGElement_createSVGMatrix_Callback(mthis) native "SVGSVGElement_createSVGMatrix_Callback_RESOLVER_STRING_0_";
+  static $getEnclosureList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getEnclosureList_Callback_RESOLVER_STRING_2_SVGRect_SVGElement";
 
-Native_SVGSVGElement_createSVGNumber_Callback(mthis) native "SVGSVGElement_createSVGNumber_Callback_RESOLVER_STRING_0_";
+  static $getIntersectionList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getIntersectionList_Callback_RESOLVER_STRING_2_SVGRect_SVGElement";
 
-Native_SVGSVGElement_createSVGPoint_Callback(mthis) native "SVGSVGElement_createSVGPoint_Callback_RESOLVER_STRING_0_";
+  static $pauseAnimations_Callback(mthis) native "SVGSVGElement_pauseAnimations_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGRect_Callback(mthis) native "SVGSVGElement_createSVGRect_Callback_RESOLVER_STRING_0_";
+  static $setCurrentTime_Callback(mthis, seconds) native "SVGSVGElement_setCurrentTime_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGSVGElement_createSVGTransform_Callback(mthis) native "SVGSVGElement_createSVGTransform_Callback_RESOLVER_STRING_0_";
+  static $suspendRedraw_Callback(mthis, maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGSVGElement_createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
+  static $unpauseAnimations_Callback(mthis) native "SVGSVGElement_unpauseAnimations_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_deselectAll_Callback(mthis) native "SVGSVGElement_deselectAll_Callback_RESOLVER_STRING_0_";
+  static $unsuspendRedraw_Callback(mthis, suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGSVGElement_forceRedraw_Callback(mthis) native "SVGSVGElement_forceRedraw_Callback_RESOLVER_STRING_0_";
+  static $unsuspendRedrawAll_Callback(mthis) native "SVGSVGElement_unsuspendRedrawAll_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_getCurrentTime_Callback(mthis) native "SVGSVGElement_getCurrentTime_Callback_RESOLVER_STRING_0_";
+  static $preserveAspectRatio_Getter(mthis) native "SVGSVGElement_preserveAspectRatio_Getter";
 
-Native_SVGSVGElement_getElementById_Callback(mthis, elementId) native "SVGSVGElement_getElementById_Callback_RESOLVER_STRING_1_DOMString";
+  static $viewBox_Getter(mthis) native "SVGSVGElement_viewBox_Getter";
 
-Native_SVGSVGElement_getEnclosureList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getEnclosureList_Callback_RESOLVER_STRING_2_SVGRect_SVGElement";
+  static $zoomAndPan_Getter(mthis) native "SVGSVGElement_zoomAndPan_Getter";
 
-Native_SVGSVGElement_getIntersectionList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getIntersectionList_Callback_RESOLVER_STRING_2_SVGRect_SVGElement";
+  static $zoomAndPan_Setter(mthis, value) native "SVGSVGElement_zoomAndPan_Setter";
+}
 
-Native_SVGSVGElement_pauseAnimations_Callback(mthis) native "SVGSVGElement_pauseAnimations_Callback_RESOLVER_STRING_0_";
+class BlinkSVGScriptElement {
+  static $type_Getter(mthis) native "SVGScriptElement_type_Getter";
 
-Native_SVGSVGElement_setCurrentTime_Callback(mthis, seconds) native "SVGSVGElement_setCurrentTime_Callback_RESOLVER_STRING_1_float";
+  static $type_Setter(mthis, value) native "SVGScriptElement_type_Setter";
 
-Native_SVGSVGElement_suspendRedraw_Callback(mthis, maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback_RESOLVER_STRING_1_unsigned long";
+  static $href_Getter(mthis) native "SVGScriptElement_href_Getter";
+}
 
-Native_SVGSVGElement_unpauseAnimations_Callback(mthis) native "SVGSVGElement_unpauseAnimations_Callback_RESOLVER_STRING_0_";
+class BlinkSVGSetElement {}
 
-Native_SVGSVGElement_unsuspendRedraw_Callback(mthis, suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSVGStopElement {
+  static $offset_Getter(mthis) native "SVGStopElement_offset_Getter";
+}
 
-Native_SVGSVGElement_unsuspendRedrawAll_Callback(mthis) native "SVGSVGElement_unsuspendRedrawAll_Callback_RESOLVER_STRING_0_";
+class BlinkSVGStringList {
+  static $numberOfItems_Getter(mthis) native "SVGStringList_numberOfItems_Getter";
 
-Native_SVGSVGElement_preserveAspectRatio_Getter(mthis) native "SVGSVGElement_preserveAspectRatio_Getter";
+  static $appendItem_Callback(mthis, item) native "SVGStringList_appendItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGSVGElement_viewBox_Getter(mthis) native "SVGSVGElement_viewBox_Getter";
+  static $clear_Callback(mthis) native "SVGStringList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_zoomAndPan_Getter(mthis) native "SVGSVGElement_zoomAndPan_Getter";
+  static $getItem_Callback(mthis, index) native "SVGStringList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGSVGElement_zoomAndPan_Setter(mthis, value) native "SVGSVGElement_zoomAndPan_Setter";
+  static $initialize_Callback(mthis, item) native "SVGStringList_initialize_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGScriptElement_type_Getter(mthis) native "SVGScriptElement_type_Getter";
+  static $insertItemBefore_Callback(mthis, item, index) native "SVGStringList_insertItemBefore_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
 
-Native_SVGScriptElement_type_Setter(mthis, value) native "SVGScriptElement_type_Setter";
+  static $removeItem_Callback(mthis, index) native "SVGStringList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGScriptElement_href_Getter(mthis) native "SVGScriptElement_href_Getter";
+  static $replaceItem_Callback(mthis, item, index) native "SVGStringList_replaceItem_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+}
 
-Native_SVGStopElement_offset_Getter(mthis) native "SVGStopElement_offset_Getter";
+class BlinkSVGStyleElement {
+  static $disabled_Getter(mthis) native "SVGStyleElement_disabled_Getter";
 
-Native_SVGStringList_numberOfItems_Getter(mthis) native "SVGStringList_numberOfItems_Getter";
+  static $disabled_Setter(mthis, value) native "SVGStyleElement_disabled_Setter";
 
-Native_SVGStringList_appendItem_Callback(mthis, item) native "SVGStringList_appendItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $media_Getter(mthis) native "SVGStyleElement_media_Getter";
 
-Native_SVGStringList_clear_Callback(mthis) native "SVGStringList_clear_Callback_RESOLVER_STRING_0_";
+  static $media_Setter(mthis, value) native "SVGStyleElement_media_Setter";
 
-Native_SVGStringList_getItem_Callback(mthis, index) native "SVGStringList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $title_Getter(mthis) native "SVGStyleElement_title_Getter";
 
-Native_SVGStringList_initialize_Callback(mthis, item) native "SVGStringList_initialize_Callback_RESOLVER_STRING_1_DOMString";
+  static $title_Setter(mthis, value) native "SVGStyleElement_title_Setter";
 
-Native_SVGStringList_insertItemBefore_Callback(mthis, item, index) native "SVGStringList_insertItemBefore_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+  static $type_Getter(mthis) native "SVGStyleElement_type_Getter";
 
-Native_SVGStringList_removeItem_Callback(mthis, index) native "SVGStringList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $type_Setter(mthis, value) native "SVGStyleElement_type_Setter";
+}
 
-Native_SVGStringList_replaceItem_Callback(mthis, item, index) native "SVGStringList_replaceItem_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+class BlinkSVGSwitchElement {}
 
-Native_SVGStyleElement_disabled_Getter(mthis) native "SVGStyleElement_disabled_Getter";
+class BlinkSVGSymbolElement {
+  static $preserveAspectRatio_Getter(mthis) native "SVGSymbolElement_preserveAspectRatio_Getter";
 
-Native_SVGStyleElement_disabled_Setter(mthis, value) native "SVGStyleElement_disabled_Setter";
+  static $viewBox_Getter(mthis) native "SVGSymbolElement_viewBox_Getter";
+}
 
-Native_SVGStyleElement_media_Getter(mthis) native "SVGStyleElement_media_Getter";
+class BlinkSVGTSpanElement {}
 
-Native_SVGStyleElement_media_Setter(mthis, value) native "SVGStyleElement_media_Setter";
+class BlinkSVGTextElement {}
 
-Native_SVGStyleElement_title_Getter(mthis) native "SVGStyleElement_title_Getter";
+class BlinkSVGTextPathElement {
+  static $method_Getter(mthis) native "SVGTextPathElement_method_Getter";
 
-Native_SVGStyleElement_title_Setter(mthis, value) native "SVGStyleElement_title_Setter";
+  static $spacing_Getter(mthis) native "SVGTextPathElement_spacing_Getter";
 
-Native_SVGStyleElement_type_Getter(mthis) native "SVGStyleElement_type_Getter";
+  static $startOffset_Getter(mthis) native "SVGTextPathElement_startOffset_Getter";
 
-Native_SVGStyleElement_type_Setter(mthis, value) native "SVGStyleElement_type_Setter";
+  static $href_Getter(mthis) native "SVGTextPathElement_href_Getter";
+}
 
-Native_SVGSymbolElement_preserveAspectRatio_Getter(mthis) native "SVGSymbolElement_preserveAspectRatio_Getter";
+class BlinkSVGTitleElement {}
 
-Native_SVGSymbolElement_viewBox_Getter(mthis) native "SVGSymbolElement_viewBox_Getter";
+class BlinkSVGTransform {
+  static $angle_Getter(mthis) native "SVGTransform_angle_Getter";
 
-Native_SVGTextPathElement_method_Getter(mthis) native "SVGTextPathElement_method_Getter";
+  static $matrix_Getter(mthis) native "SVGTransform_matrix_Getter";
 
-Native_SVGTextPathElement_spacing_Getter(mthis) native "SVGTextPathElement_spacing_Getter";
+  static $type_Getter(mthis) native "SVGTransform_type_Getter";
 
-Native_SVGTextPathElement_startOffset_Getter(mthis) native "SVGTextPathElement_startOffset_Getter";
+  static $setMatrix_Callback(mthis, matrix) native "SVGTransform_setMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
 
-Native_SVGTextPathElement_href_Getter(mthis) native "SVGTextPathElement_href_Getter";
+  static $setRotate_Callback(mthis, angle, cx, cy) native "SVGTransform_setRotate_Callback_RESOLVER_STRING_3_float_float_float";
 
-Native_SVGTransform_angle_Getter(mthis) native "SVGTransform_angle_Getter";
+  static $setScale_Callback(mthis, sx, sy) native "SVGTransform_setScale_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGTransform_matrix_Getter(mthis) native "SVGTransform_matrix_Getter";
+  static $setSkewX_Callback(mthis, angle) native "SVGTransform_setSkewX_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGTransform_type_Getter(mthis) native "SVGTransform_type_Getter";
+  static $setSkewY_Callback(mthis, angle) native "SVGTransform_setSkewY_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGTransform_setMatrix_Callback(mthis, matrix) native "SVGTransform_setMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
+  static $setTranslate_Callback(mthis, tx, ty) native "SVGTransform_setTranslate_Callback_RESOLVER_STRING_2_float_float";
+}
 
-Native_SVGTransform_setRotate_Callback(mthis, angle, cx, cy) native "SVGTransform_setRotate_Callback_RESOLVER_STRING_3_float_float_float";
+class BlinkSVGTransformList {
+  static $numberOfItems_Getter(mthis) native "SVGTransformList_numberOfItems_Getter";
 
-Native_SVGTransform_setScale_Callback(mthis, sx, sy) native "SVGTransform_setScale_Callback_RESOLVER_STRING_2_float_float";
+  static $appendItem_Callback(mthis, item) native "SVGTransformList_appendItem_Callback_RESOLVER_STRING_1_SVGTransform";
 
-Native_SVGTransform_setSkewX_Callback(mthis, angle) native "SVGTransform_setSkewX_Callback_RESOLVER_STRING_1_float";
+  static $clear_Callback(mthis) native "SVGTransformList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGTransform_setSkewY_Callback(mthis, angle) native "SVGTransform_setSkewY_Callback_RESOLVER_STRING_1_float";
+  static $consolidate_Callback(mthis) native "SVGTransformList_consolidate_Callback_RESOLVER_STRING_0_";
 
-Native_SVGTransform_setTranslate_Callback(mthis, tx, ty) native "SVGTransform_setTranslate_Callback_RESOLVER_STRING_2_float_float";
+  static $createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
 
-Native_SVGTransformList_numberOfItems_Getter(mthis) native "SVGTransformList_numberOfItems_Getter";
+  static $getItem_Callback(mthis, index) native "SVGTransformList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTransformList_appendItem_Callback(mthis, item) native "SVGTransformList_appendItem_Callback_RESOLVER_STRING_1_SVGTransform";
+  static $initialize_Callback(mthis, item) native "SVGTransformList_initialize_Callback_RESOLVER_STRING_1_SVGTransform";
 
-Native_SVGTransformList_clear_Callback(mthis) native "SVGTransformList_clear_Callback_RESOLVER_STRING_0_";
+  static $insertItemBefore_Callback(mthis, item, index) native "SVGTransformList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGTransform_unsigned long";
 
-Native_SVGTransformList_consolidate_Callback(mthis) native "SVGTransformList_consolidate_Callback_RESOLVER_STRING_0_";
+  static $removeItem_Callback(mthis, index) native "SVGTransformList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTransformList_createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
+  static $replaceItem_Callback(mthis, item, index) native "SVGTransformList_replaceItem_Callback_RESOLVER_STRING_2_SVGTransform_unsigned long";
+}
 
-Native_SVGTransformList_getItem_Callback(mthis, index) native "SVGTransformList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSVGUnitTypes {}
 
-Native_SVGTransformList_initialize_Callback(mthis, item) native "SVGTransformList_initialize_Callback_RESOLVER_STRING_1_SVGTransform";
+class BlinkSVGUseElement {
+  static $animatedInstanceRoot_Getter(mthis) native "SVGUseElement_animatedInstanceRoot_Getter";
 
-Native_SVGTransformList_insertItemBefore_Callback(mthis, item, index) native "SVGTransformList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGTransform_unsigned long";
+  static $height_Getter(mthis) native "SVGUseElement_height_Getter";
 
-Native_SVGTransformList_removeItem_Callback(mthis, index) native "SVGTransformList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $instanceRoot_Getter(mthis) native "SVGUseElement_instanceRoot_Getter";
 
-Native_SVGTransformList_replaceItem_Callback(mthis, item, index) native "SVGTransformList_replaceItem_Callback_RESOLVER_STRING_2_SVGTransform_unsigned long";
+  static $width_Getter(mthis) native "SVGUseElement_width_Getter";
 
-Native_SVGUseElement_animatedInstanceRoot_Getter(mthis) native "SVGUseElement_animatedInstanceRoot_Getter";
+  static $x_Getter(mthis) native "SVGUseElement_x_Getter";
 
-Native_SVGUseElement_height_Getter(mthis) native "SVGUseElement_height_Getter";
+  static $y_Getter(mthis) native "SVGUseElement_y_Getter";
 
-Native_SVGUseElement_instanceRoot_Getter(mthis) native "SVGUseElement_instanceRoot_Getter";
+  static $requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
 
-Native_SVGUseElement_width_Getter(mthis) native "SVGUseElement_width_Getter";
+  static $requiredFeatures_Getter(mthis) native "SVGGraphicsElement_requiredFeatures_Getter";
 
-Native_SVGUseElement_x_Getter(mthis) native "SVGUseElement_x_Getter";
+  static $systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
 
-Native_SVGUseElement_y_Getter(mthis) native "SVGUseElement_y_Getter";
+  static $hasExtension_Callback(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGUseElement_requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
+  static $href_Getter(mthis) native "SVGUseElement_href_Getter";
+}
 
-Native_SVGUseElement_requiredFeatures_Getter(mthis) native "SVGGraphicsElement_requiredFeatures_Getter";
+class BlinkSVGVKernElement {}
 
-Native_SVGUseElement_systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
+class BlinkSVGViewElement {
+  static $viewTarget_Getter(mthis) native "SVGViewElement_viewTarget_Getter";
 
-Native_SVGUseElement_hasExtension_Callback(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+  static $preserveAspectRatio_Getter(mthis) native "SVGViewElement_preserveAspectRatio_Getter";
 
-Native_SVGUseElement_href_Getter(mthis) native "SVGUseElement_href_Getter";
+  static $viewBox_Getter(mthis) native "SVGViewElement_viewBox_Getter";
 
-Native_SVGViewElement_viewTarget_Getter(mthis) native "SVGViewElement_viewTarget_Getter";
+  static $zoomAndPan_Getter(mthis) native "SVGViewElement_zoomAndPan_Getter";
 
-Native_SVGViewElement_preserveAspectRatio_Getter(mthis) native "SVGViewElement_preserveAspectRatio_Getter";
+  static $zoomAndPan_Setter(mthis, value) native "SVGViewElement_zoomAndPan_Setter";
+}
 
-Native_SVGViewElement_viewBox_Getter(mthis) native "SVGViewElement_viewBox_Getter";
+class BlinkSVGViewSpec {
+  static $preserveAspectRatioString_Getter(mthis) native "SVGViewSpec_preserveAspectRatioString_Getter";
 
-Native_SVGViewElement_zoomAndPan_Getter(mthis) native "SVGViewElement_zoomAndPan_Getter";
+  static $transform_Getter(mthis) native "SVGViewSpec_transform_Getter";
 
-Native_SVGViewElement_zoomAndPan_Setter(mthis, value) native "SVGViewElement_zoomAndPan_Setter";
+  static $transformString_Getter(mthis) native "SVGViewSpec_transformString_Getter";
 
-Native_SVGViewSpec_preserveAspectRatioString_Getter(mthis) native "SVGViewSpec_preserveAspectRatioString_Getter";
+  static $viewBoxString_Getter(mthis) native "SVGViewSpec_viewBoxString_Getter";
 
-Native_SVGViewSpec_transform_Getter(mthis) native "SVGViewSpec_transform_Getter";
+  static $viewTarget_Getter(mthis) native "SVGViewSpec_viewTarget_Getter";
 
-Native_SVGViewSpec_transformString_Getter(mthis) native "SVGViewSpec_transformString_Getter";
+  static $viewTargetString_Getter(mthis) native "SVGViewSpec_viewTargetString_Getter";
 
-Native_SVGViewSpec_viewBoxString_Getter(mthis) native "SVGViewSpec_viewBoxString_Getter";
+  static $preserveAspectRatio_Getter(mthis) native "SVGViewSpec_preserveAspectRatio_Getter";
 
-Native_SVGViewSpec_viewTarget_Getter(mthis) native "SVGViewSpec_viewTarget_Getter";
+  static $viewBox_Getter(mthis) native "SVGViewSpec_viewBox_Getter";
 
-Native_SVGViewSpec_viewTargetString_Getter(mthis) native "SVGViewSpec_viewTargetString_Getter";
+  static $zoomAndPan_Getter(mthis) native "SVGViewSpec_zoomAndPan_Getter";
 
-Native_SVGViewSpec_preserveAspectRatio_Getter(mthis) native "SVGViewSpec_preserveAspectRatio_Getter";
+  static $zoomAndPan_Setter(mthis, value) native "SVGViewSpec_zoomAndPan_Setter";
+}
 
-Native_SVGViewSpec_viewBox_Getter(mthis) native "SVGViewSpec_viewBox_Getter";
+class BlinkSVGZoomEvent {
+  static $newScale_Getter(mthis) native "SVGZoomEvent_newScale_Getter";
 
-Native_SVGViewSpec_zoomAndPan_Getter(mthis) native "SVGViewSpec_zoomAndPan_Getter";
+  static $newTranslate_Getter(mthis) native "SVGZoomEvent_newTranslate_Getter";
 
-Native_SVGViewSpec_zoomAndPan_Setter(mthis, value) native "SVGViewSpec_zoomAndPan_Setter";
+  static $previousScale_Getter(mthis) native "SVGZoomEvent_previousScale_Getter";
 
-Native_SVGZoomEvent_newScale_Getter(mthis) native "SVGZoomEvent_newScale_Getter";
+  static $previousTranslate_Getter(mthis) native "SVGZoomEvent_previousTranslate_Getter";
 
-Native_SVGZoomEvent_newTranslate_Getter(mthis) native "SVGZoomEvent_newTranslate_Getter";
+  static $zoomRectScreen_Getter(mthis) native "SVGZoomEvent_zoomRectScreen_Getter";
+}
 
-Native_SVGZoomEvent_previousScale_Getter(mthis) native "SVGZoomEvent_previousScale_Getter";
+class BlinkScreen {
+  static $availHeight_Getter(mthis) native "Screen_availHeight_Getter";
 
-Native_SVGZoomEvent_previousTranslate_Getter(mthis) native "SVGZoomEvent_previousTranslate_Getter";
+  static $availLeft_Getter(mthis) native "Screen_availLeft_Getter";
 
-Native_SVGZoomEvent_zoomRectScreen_Getter(mthis) native "SVGZoomEvent_zoomRectScreen_Getter";
+  static $availTop_Getter(mthis) native "Screen_availTop_Getter";
 
-Native_Screen_availHeight_Getter(mthis) native "Screen_availHeight_Getter";
+  static $availWidth_Getter(mthis) native "Screen_availWidth_Getter";
 
-Native_Screen_availLeft_Getter(mthis) native "Screen_availLeft_Getter";
+  static $colorDepth_Getter(mthis) native "Screen_colorDepth_Getter";
 
-Native_Screen_availTop_Getter(mthis) native "Screen_availTop_Getter";
+  static $height_Getter(mthis) native "Screen_height_Getter";
 
-Native_Screen_availWidth_Getter(mthis) native "Screen_availWidth_Getter";
+  static $orientation_Getter(mthis) native "Screen_orientation_Getter";
 
-Native_Screen_colorDepth_Getter(mthis) native "Screen_colorDepth_Getter";
+  static $pixelDepth_Getter(mthis) native "Screen_pixelDepth_Getter";
 
-Native_Screen_height_Getter(mthis) native "Screen_height_Getter";
+  static $width_Getter(mthis) native "Screen_width_Getter";
 
-Native_Screen_orientation_Getter(mthis) native "Screen_orientation_Getter";
+  static $lockOrientation_Callback(mthis, orientation) native "Screen_lockOrientation_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Screen_pixelDepth_Getter(mthis) native "Screen_pixelDepth_Getter";
+  static $unlockOrientation_Callback(mthis) native "Screen_unlockOrientation_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Screen_width_Getter(mthis) native "Screen_width_Getter";
+class BlinkScriptProcessorNode {
+  static $bufferSize_Getter(mthis) native "ScriptProcessorNode_bufferSize_Getter";
 
-Native_Screen_lockOrientation_Callback(mthis, orientation) native "Screen_lockOrientation_Callback_RESOLVER_STRING_1_DOMString";
+  static $_setEventListener_Callback(mthis, eventListener) native "ScriptProcessorNode_setEventListener_Callback";
+}
 
-Native_Screen_unlockOrientation_Callback(mthis) native "Screen_unlockOrientation_Callback_RESOLVER_STRING_0_";
+class BlinkSecurityPolicyViolationEvent {
+  static $blockedURI_Getter(mthis) native "SecurityPolicyViolationEvent_blockedURI_Getter";
 
-Native_ScriptProcessorNode_bufferSize_Getter(mthis) native "ScriptProcessorNode_bufferSize_Getter";
+  static $columnNumber_Getter(mthis) native "SecurityPolicyViolationEvent_columnNumber_Getter";
 
-Native_ScriptProcessorNode__setEventListener_Callback(mthis, eventListener) native "ScriptProcessorNode_setEventListener_Callback";
+  static $documentURI_Getter(mthis) native "SecurityPolicyViolationEvent_documentURI_Getter";
 
-Native_SecurityPolicyViolationEvent_blockedURI_Getter(mthis) native "SecurityPolicyViolationEvent_blockedURI_Getter";
+  static $effectiveDirective_Getter(mthis) native "SecurityPolicyViolationEvent_effectiveDirective_Getter";
 
-Native_SecurityPolicyViolationEvent_columnNumber_Getter(mthis) native "SecurityPolicyViolationEvent_columnNumber_Getter";
+  static $lineNumber_Getter(mthis) native "SecurityPolicyViolationEvent_lineNumber_Getter";
 
-Native_SecurityPolicyViolationEvent_documentURI_Getter(mthis) native "SecurityPolicyViolationEvent_documentURI_Getter";
+  static $originalPolicy_Getter(mthis) native "SecurityPolicyViolationEvent_originalPolicy_Getter";
 
-Native_SecurityPolicyViolationEvent_effectiveDirective_Getter(mthis) native "SecurityPolicyViolationEvent_effectiveDirective_Getter";
+  static $referrer_Getter(mthis) native "SecurityPolicyViolationEvent_referrer_Getter";
 
-Native_SecurityPolicyViolationEvent_lineNumber_Getter(mthis) native "SecurityPolicyViolationEvent_lineNumber_Getter";
+  static $sourceFile_Getter(mthis) native "SecurityPolicyViolationEvent_sourceFile_Getter";
 
-Native_SecurityPolicyViolationEvent_originalPolicy_Getter(mthis) native "SecurityPolicyViolationEvent_originalPolicy_Getter";
+  static $statusCode_Getter(mthis) native "SecurityPolicyViolationEvent_statusCode_Getter";
 
-Native_SecurityPolicyViolationEvent_referrer_Getter(mthis) native "SecurityPolicyViolationEvent_referrer_Getter";
+  static $violatedDirective_Getter(mthis) native "SecurityPolicyViolationEvent_violatedDirective_Getter";
+}
 
-Native_SecurityPolicyViolationEvent_sourceFile_Getter(mthis) native "SecurityPolicyViolationEvent_sourceFile_Getter";
+class BlinkSelection {
+  static $anchorNode_Getter(mthis) native "Selection_anchorNode_Getter";
 
-Native_SecurityPolicyViolationEvent_statusCode_Getter(mthis) native "SecurityPolicyViolationEvent_statusCode_Getter";
+  static $anchorOffset_Getter(mthis) native "Selection_anchorOffset_Getter";
 
-Native_SecurityPolicyViolationEvent_violatedDirective_Getter(mthis) native "SecurityPolicyViolationEvent_violatedDirective_Getter";
+  static $baseNode_Getter(mthis) native "Selection_baseNode_Getter";
 
-Native_Selection_anchorNode_Getter(mthis) native "Selection_anchorNode_Getter";
+  static $baseOffset_Getter(mthis) native "Selection_baseOffset_Getter";
 
-Native_Selection_anchorOffset_Getter(mthis) native "Selection_anchorOffset_Getter";
+  static $extentNode_Getter(mthis) native "Selection_extentNode_Getter";
 
-Native_Selection_baseNode_Getter(mthis) native "Selection_baseNode_Getter";
+  static $extentOffset_Getter(mthis) native "Selection_extentOffset_Getter";
 
-Native_Selection_baseOffset_Getter(mthis) native "Selection_baseOffset_Getter";
+  static $focusNode_Getter(mthis) native "Selection_focusNode_Getter";
 
-Native_Selection_extentNode_Getter(mthis) native "Selection_extentNode_Getter";
+  static $focusOffset_Getter(mthis) native "Selection_focusOffset_Getter";
 
-Native_Selection_extentOffset_Getter(mthis) native "Selection_extentOffset_Getter";
+  static $isCollapsed_Getter(mthis) native "Selection_isCollapsed_Getter";
 
-Native_Selection_focusNode_Getter(mthis) native "Selection_focusNode_Getter";
+  static $rangeCount_Getter(mthis) native "Selection_rangeCount_Getter";
 
-Native_Selection_focusOffset_Getter(mthis) native "Selection_focusOffset_Getter";
+  static $type_Getter(mthis) native "Selection_type_Getter";
 
-Native_Selection_isCollapsed_Getter(mthis) native "Selection_isCollapsed_Getter";
+  static $addRange_Callback(mthis, range) native "Selection_addRange_Callback_RESOLVER_STRING_1_Range";
 
-Native_Selection_rangeCount_Getter(mthis) native "Selection_rangeCount_Getter";
+  static $collapse_Callback(mthis, node, index) native "Selection_collapse_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Selection_type_Getter(mthis) native "Selection_type_Getter";
+  static $collapseToEnd_Callback(mthis) native "Selection_collapseToEnd_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_addRange_Callback(mthis, range) native "Selection_addRange_Callback_RESOLVER_STRING_1_Range";
+  static $collapseToStart_Callback(mthis) native "Selection_collapseToStart_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_collapse_Callback(mthis, node, index) native "Selection_collapse_Callback_RESOLVER_STRING_2_Node_long";
+  static $containsNode_Callback(mthis, node, allowPartial) native "Selection_containsNode_Callback_RESOLVER_STRING_2_Node_boolean";
 
-Native_Selection_collapseToEnd_Callback(mthis) native "Selection_collapseToEnd_Callback_RESOLVER_STRING_0_";
+  static $deleteFromDocument_Callback(mthis) native "Selection_deleteFromDocument_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_collapseToStart_Callback(mthis) native "Selection_collapseToStart_Callback_RESOLVER_STRING_0_";
+  static $empty_Callback(mthis) native "Selection_empty_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_containsNode_Callback(mthis, node, allowPartial) native "Selection_containsNode_Callback_RESOLVER_STRING_2_Node_boolean";
+  static $extend_Callback(mthis, node, offset) native "Selection_extend_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Selection_deleteFromDocument_Callback(mthis) native "Selection_deleteFromDocument_Callback_RESOLVER_STRING_0_";
+  static $getRangeAt_Callback(mthis, index) native "Selection_getRangeAt_Callback_RESOLVER_STRING_1_long";
 
-Native_Selection_empty_Callback(mthis) native "Selection_empty_Callback_RESOLVER_STRING_0_";
+  static $modify_Callback(mthis, alter, direction, granularity) native "Selection_modify_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_Selection_extend_Callback(mthis, node, offset) native "Selection_extend_Callback_RESOLVER_STRING_2_Node_long";
+  static $removeAllRanges_Callback(mthis) native "Selection_removeAllRanges_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_getRangeAt_Callback(mthis, index) native "Selection_getRangeAt_Callback_RESOLVER_STRING_1_long";
+  static $selectAllChildren_Callback(mthis, node) native "Selection_selectAllChildren_Callback_RESOLVER_STRING_1_Node";
 
-Native_Selection_modify_Callback(mthis, alter, direction, granularity) native "Selection_modify_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $setBaseAndExtent_Callback(mthis, baseNode, baseOffset, extentNode, extentOffset) native "Selection_setBaseAndExtent_Callback_RESOLVER_STRING_4_Node_long_Node_long";
 
-Native_Selection_removeAllRanges_Callback(mthis) native "Selection_removeAllRanges_Callback_RESOLVER_STRING_0_";
+  static $setPosition_Callback(mthis, node, offset) native "Selection_setPosition_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Selection_selectAllChildren_Callback(mthis, node) native "Selection_selectAllChildren_Callback_RESOLVER_STRING_1_Node";
+  static $toString_Callback(mthis) native "Selection_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Selection_setBaseAndExtent_Callback(mthis, baseNode, baseOffset, extentNode, extentOffset) native "Selection_setBaseAndExtent_Callback_RESOLVER_STRING_4_Node_long_Node_long";
+class BlinkServiceWorker {}
 
-Native_Selection_setPosition_Callback(mthis, node, offset) native "Selection_setPosition_Callback_RESOLVER_STRING_2_Node_long";
+class BlinkServiceWorkerContainer {}
 
-Native_Selection_toString_Callback(mthis) native "Selection_toString_Callback_RESOLVER_STRING_0_";
+class BlinkServiceWorkerGlobalScope {}
 
-Native_ShadowRoot_activeElement_Getter(mthis) native "ShadowRoot_activeElement_Getter";
+class BlinkShadowRoot {
+  static $activeElement_Getter(mthis) native "ShadowRoot_activeElement_Getter";
 
-Native_ShadowRoot_host_Getter(mthis) native "ShadowRoot_host_Getter";
+  static $host_Getter(mthis) native "ShadowRoot_host_Getter";
 
-Native_ShadowRoot_innerHTML_Getter(mthis) native "ShadowRoot_innerHTML_Getter";
+  static $innerHTML_Getter(mthis) native "ShadowRoot_innerHTML_Getter";
 
-Native_ShadowRoot_innerHTML_Setter(mthis, value) native "ShadowRoot_innerHTML_Setter";
+  static $innerHTML_Setter(mthis, value) native "ShadowRoot_innerHTML_Setter";
 
-Native_ShadowRoot_olderShadowRoot_Getter(mthis) native "ShadowRoot_olderShadowRoot_Getter";
+  static $olderShadowRoot_Getter(mthis) native "ShadowRoot_olderShadowRoot_Getter";
 
-Native_ShadowRoot_resetStyleInheritance_Getter(mthis) native "ShadowRoot_resetStyleInheritance_Getter";
+  static $resetStyleInheritance_Getter(mthis) native "ShadowRoot_resetStyleInheritance_Getter";
 
-Native_ShadowRoot_resetStyleInheritance_Setter(mthis, value) native "ShadowRoot_resetStyleInheritance_Setter";
+  static $resetStyleInheritance_Setter(mthis, value) native "ShadowRoot_resetStyleInheritance_Setter";
 
-Native_ShadowRoot_styleSheets_Getter(mthis) native "ShadowRoot_styleSheets_Getter";
+  static $styleSheets_Getter(mthis) native "ShadowRoot_styleSheets_Getter";
 
-Native_ShadowRoot_cloneNode_Callback(mthis, deep) native "ShadowRoot_cloneNode_Callback_RESOLVER_STRING_1_boolean";
+  static $cloneNode_Callback(mthis, deep) native "ShadowRoot_cloneNode_Callback_RESOLVER_STRING_1_boolean";
 
-Native_ShadowRoot_elementFromPoint_Callback(mthis, x, y) native "ShadowRoot_elementFromPoint_Callback_RESOLVER_STRING_2_long_long";
+  static $elementFromPoint_Callback(mthis, x, y) native "ShadowRoot_elementFromPoint_Callback_RESOLVER_STRING_2_long_long";
 
-Native_ShadowRoot_getElementById_Callback(mthis, elementId) native "ShadowRoot_getElementById_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementById_Callback(mthis, elementId) native "ShadowRoot_getElementById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ShadowRoot_getElementsByClassName_Callback(mthis, className) native "ShadowRoot_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByClassName_Callback(mthis, className) native "ShadowRoot_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ShadowRoot_getElementsByTagName_Callback(mthis, tagName) native "ShadowRoot_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByTagName_Callback(mthis, tagName) native "ShadowRoot_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ShadowRoot_getSelection_Callback(mthis) native "ShadowRoot_getSelection_Callback_RESOLVER_STRING_0_";
+  static $getSelection_Callback(mthis) native "ShadowRoot_getSelection_Callback_RESOLVER_STRING_0_";
+}
 
+class BlinkSharedWorker {
   // Generated overload resolver
-Native_SharedWorker_SharedWorker(scriptURL, name) {
-    return Native_SharedWorker__create_1constructorCallback(scriptURL, name);
+  static $mkSharedWorker(scriptURL, name) {
+    return $_create_1constructorCallback(scriptURL, name);
   }
 
-Native_SharedWorker__create_1constructorCallback(scriptURL, name) native "SharedWorker_constructorCallback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $_create_1constructorCallback(scriptURL, name) native "SharedWorker_constructorCallback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_SharedWorker_port_Getter(mthis) native "SharedWorker_port_Getter";
+  static $port_Getter(mthis) native "SharedWorker_port_Getter";
 
-Native_SharedWorker_workerStart_Getter(mthis) native "SharedWorker_workerStart_Getter";
+  static $workerStart_Getter(mthis) native "SharedWorker_workerStart_Getter";
+}
 
-Native_SharedWorkerGlobalScope_name_Getter(mthis) native "SharedWorkerGlobalScope_name_Getter";
+class BlinkSharedWorkerGlobalScope {
+  static $name_Getter(mthis) native "SharedWorkerGlobalScope_name_Getter";
+}
 
-Native_SourceBuffer_appendWindowEnd_Getter(mthis) native "SourceBuffer_appendWindowEnd_Getter";
+class BlinkSourceBuffer {
+  static $appendWindowEnd_Getter(mthis) native "SourceBuffer_appendWindowEnd_Getter";
 
-Native_SourceBuffer_appendWindowEnd_Setter(mthis, value) native "SourceBuffer_appendWindowEnd_Setter";
+  static $appendWindowEnd_Setter(mthis, value) native "SourceBuffer_appendWindowEnd_Setter";
 
-Native_SourceBuffer_appendWindowStart_Getter(mthis) native "SourceBuffer_appendWindowStart_Getter";
+  static $appendWindowStart_Getter(mthis) native "SourceBuffer_appendWindowStart_Getter";
 
-Native_SourceBuffer_appendWindowStart_Setter(mthis, value) native "SourceBuffer_appendWindowStart_Setter";
+  static $appendWindowStart_Setter(mthis, value) native "SourceBuffer_appendWindowStart_Setter";
 
-Native_SourceBuffer_buffered_Getter(mthis) native "SourceBuffer_buffered_Getter";
+  static $buffered_Getter(mthis) native "SourceBuffer_buffered_Getter";
 
-Native_SourceBuffer_mode_Getter(mthis) native "SourceBuffer_mode_Getter";
+  static $mode_Getter(mthis) native "SourceBuffer_mode_Getter";
 
-Native_SourceBuffer_mode_Setter(mthis, value) native "SourceBuffer_mode_Setter";
+  static $mode_Setter(mthis, value) native "SourceBuffer_mode_Setter";
 
-Native_SourceBuffer_timestampOffset_Getter(mthis) native "SourceBuffer_timestampOffset_Getter";
+  static $timestampOffset_Getter(mthis) native "SourceBuffer_timestampOffset_Getter";
 
-Native_SourceBuffer_timestampOffset_Setter(mthis, value) native "SourceBuffer_timestampOffset_Setter";
+  static $timestampOffset_Setter(mthis, value) native "SourceBuffer_timestampOffset_Setter";
 
-Native_SourceBuffer_updating_Getter(mthis) native "SourceBuffer_updating_Getter";
+  static $updating_Getter(mthis) native "SourceBuffer_updating_Getter";
 
-Native_SourceBuffer_abort_Callback(mthis) native "SourceBuffer_abort_Callback_RESOLVER_STRING_0_";
+  static $abort_Callback(mthis) native "SourceBuffer_abort_Callback_RESOLVER_STRING_0_";
 
-Native_SourceBuffer_appendBuffer_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback_RESOLVER_STRING_1_ArrayBuffer";
+  static $appendBuffer_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
   // Generated overload resolver
-Native_SourceBuffer_appendStream(mthis, stream, maxSize) {
+  static $appendStream(mthis, stream, maxSize) {
     if (maxSize != null) {
-      Native_SourceBuffer__appendStream_1_Callback(mthis, stream, maxSize);
+      $_appendStream_1_Callback(mthis, stream, maxSize);
       return;
     }
-    Native_SourceBuffer__appendStream_2_Callback(mthis, stream);
+    $_appendStream_2_Callback(mthis, stream);
     return;
   }
 
-Native_SourceBuffer__appendStream_1_Callback(mthis, stream, maxSize) native "SourceBuffer_appendStream_Callback_RESOLVER_STRING_2_Stream_unsigned long long";
+  static $_appendStream_1_Callback(mthis, stream, maxSize) native "SourceBuffer_appendStream_Callback_RESOLVER_STRING_2_Stream_unsigned long long";
 
-Native_SourceBuffer__appendStream_2_Callback(mthis, stream) native "SourceBuffer_appendStream_Callback_RESOLVER_STRING_1_Stream";
+  static $_appendStream_2_Callback(mthis, stream) native "SourceBuffer_appendStream_Callback_RESOLVER_STRING_1_Stream";
 
-Native_SourceBuffer_appendTypedData_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback_RESOLVER_STRING_1_ArrayBufferView";
+  static $appendTypedData_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback_RESOLVER_STRING_1_ArrayBufferView";
 
-Native_SourceBuffer_remove_Callback(mthis, start, end) native "SourceBuffer_remove_Callback_RESOLVER_STRING_2_double_double";
+  static $remove_Callback(mthis, start, end) native "SourceBuffer_remove_Callback_RESOLVER_STRING_2_double_double";
+}
 
-Native_SourceBufferList_length_Getter(mthis) native "SourceBufferList_length_Getter";
+class BlinkSourceBufferList {
+  static $length_Getter(mthis) native "SourceBufferList_length_Getter";
 
-Native_SourceBufferList_NativeIndexed_Getter(mthis, index) native "SourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "SourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SourceBufferList_item_Callback(mthis, index) native "SourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "SourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_SourceInfo_facing_Getter(mthis) native "SourceInfo_facing_Getter";
+class BlinkSourceInfo {
+  static $facing_Getter(mthis) native "SourceInfo_facing_Getter";
 
-Native_SourceInfo_id_Getter(mthis) native "SourceInfo_id_Getter";
+  static $id_Getter(mthis) native "SourceInfo_id_Getter";
 
-Native_SourceInfo_kind_Getter(mthis) native "SourceInfo_kind_Getter";
+  static $kind_Getter(mthis) native "SourceInfo_kind_Getter";
 
-Native_SourceInfo_label_Getter(mthis) native "SourceInfo_label_Getter";
+  static $label_Getter(mthis) native "SourceInfo_label_Getter";
+}
 
+class BlinkSpeechGrammar {
   // Generated overload resolver
-Native_SpeechGrammar_SpeechGrammar() {
-    return Native_SpeechGrammar__create_1constructorCallback();
+  static $mkSpeechGrammar() {
+    return $_create_1constructorCallback();
   }
 
-Native_SpeechGrammar__create_1constructorCallback() native "SpeechGrammar_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "SpeechGrammar_constructorCallback_RESOLVER_STRING_0_";
 
-Native_SpeechGrammar_src_Getter(mthis) native "SpeechGrammar_src_Getter";
+  static $src_Getter(mthis) native "SpeechGrammar_src_Getter";
 
-Native_SpeechGrammar_src_Setter(mthis, value) native "SpeechGrammar_src_Setter";
+  static $src_Setter(mthis, value) native "SpeechGrammar_src_Setter";
 
-Native_SpeechGrammar_weight_Getter(mthis) native "SpeechGrammar_weight_Getter";
+  static $weight_Getter(mthis) native "SpeechGrammar_weight_Getter";
 
-Native_SpeechGrammar_weight_Setter(mthis, value) native "SpeechGrammar_weight_Setter";
+  static $weight_Setter(mthis, value) native "SpeechGrammar_weight_Setter";
+}
 
+class BlinkSpeechGrammarList {
   // Generated overload resolver
-Native_SpeechGrammarList_SpeechGrammarList() {
-    return Native_SpeechGrammarList__create_1constructorCallback();
+  static $mkSpeechGrammarList() {
+    return $_create_1constructorCallback();
   }
 
-Native_SpeechGrammarList__create_1constructorCallback() native "SpeechGrammarList_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "SpeechGrammarList_constructorCallback_RESOLVER_STRING_0_";
 
-Native_SpeechGrammarList_length_Getter(mthis) native "SpeechGrammarList_length_Getter";
+  static $length_Getter(mthis) native "SpeechGrammarList_length_Getter";
 
-Native_SpeechGrammarList_NativeIndexed_Getter(mthis, index) native "SpeechGrammarList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "SpeechGrammarList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
-Native_SpeechGrammarList_addFromString(mthis, string, weight) {
+  static $addFromString(mthis, string, weight) {
     if (weight != null) {
-      Native_SpeechGrammarList__addFromString_1_Callback(mthis, string, weight);
+      $_addFromString_1_Callback(mthis, string, weight);
       return;
     }
-    Native_SpeechGrammarList__addFromString_2_Callback(mthis, string);
+    $_addFromString_2_Callback(mthis, string);
     return;
   }
 
-Native_SpeechGrammarList__addFromString_1_Callback(mthis, string, weight) native "SpeechGrammarList_addFromString_Callback_RESOLVER_STRING_2_DOMString_float";
+  static $_addFromString_1_Callback(mthis, string, weight) native "SpeechGrammarList_addFromString_Callback_RESOLVER_STRING_2_DOMString_float";
 
-Native_SpeechGrammarList__addFromString_2_Callback(mthis, string) native "SpeechGrammarList_addFromString_Callback_RESOLVER_STRING_1_DOMString";
+  static $_addFromString_2_Callback(mthis, string) native "SpeechGrammarList_addFromString_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_SpeechGrammarList_addFromUri(mthis, src, weight) {
+  static $addFromUri(mthis, src, weight) {
     if (weight != null) {
-      Native_SpeechGrammarList__addFromUri_1_Callback(mthis, src, weight);
+      $_addFromUri_1_Callback(mthis, src, weight);
       return;
     }
-    Native_SpeechGrammarList__addFromUri_2_Callback(mthis, src);
+    $_addFromUri_2_Callback(mthis, src);
     return;
   }
 
-Native_SpeechGrammarList__addFromUri_1_Callback(mthis, src, weight) native "SpeechGrammarList_addFromUri_Callback_RESOLVER_STRING_2_DOMString_float";
+  static $_addFromUri_1_Callback(mthis, src, weight) native "SpeechGrammarList_addFromUri_Callback_RESOLVER_STRING_2_DOMString_float";
 
-Native_SpeechGrammarList__addFromUri_2_Callback(mthis, src) native "SpeechGrammarList_addFromUri_Callback_RESOLVER_STRING_1_DOMString";
+  static $_addFromUri_2_Callback(mthis, src) native "SpeechGrammarList_addFromUri_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SpeechGrammarList_item_Callback(mthis, index) native "SpeechGrammarList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "SpeechGrammarList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_SpeechInputResultList_length_Getter(mthis) native "SpeechInputResultList_length_Getter";
+class BlinkSpeechInputEvent {}
 
-Native_SpeechInputResultList_NativeIndexed_Getter(mthis, index) native "SpeechInputResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSpeechInputResult {}
 
-Native_SpeechInputResultList_item_Callback(mthis, index) native "SpeechInputResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSpeechInputResultList {
+  static $length_Getter(mthis) native "SpeechInputResultList_length_Getter";
 
+  static $NativeIndexed_Getter(mthis, index) native "SpeechInputResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+
+  static $item_Callback(mthis, index) native "SpeechInputResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
+
+class BlinkSpeechRecognition {
   // Generated overload resolver
-Native_SpeechRecognition_SpeechRecognition() {
-    return Native_SpeechRecognition__create_1constructorCallback();
+  static $mkSpeechRecognition() {
+    return $_create_1constructorCallback();
   }
 
-Native_SpeechRecognition__create_1constructorCallback() native "SpeechRecognition_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "SpeechRecognition_constructorCallback_RESOLVER_STRING_0_";
 
-Native_SpeechRecognition_continuous_Getter(mthis) native "SpeechRecognition_continuous_Getter";
+  static $continuous_Getter(mthis) native "SpeechRecognition_continuous_Getter";
 
-Native_SpeechRecognition_continuous_Setter(mthis, value) native "SpeechRecognition_continuous_Setter";
+  static $continuous_Setter(mthis, value) native "SpeechRecognition_continuous_Setter";
 
-Native_SpeechRecognition_grammars_Getter(mthis) native "SpeechRecognition_grammars_Getter";
+  static $grammars_Getter(mthis) native "SpeechRecognition_grammars_Getter";
 
-Native_SpeechRecognition_grammars_Setter(mthis, value) native "SpeechRecognition_grammars_Setter";
+  static $grammars_Setter(mthis, value) native "SpeechRecognition_grammars_Setter";
 
-Native_SpeechRecognition_interimResults_Getter(mthis) native "SpeechRecognition_interimResults_Getter";
+  static $interimResults_Getter(mthis) native "SpeechRecognition_interimResults_Getter";
 
-Native_SpeechRecognition_interimResults_Setter(mthis, value) native "SpeechRecognition_interimResults_Setter";
+  static $interimResults_Setter(mthis, value) native "SpeechRecognition_interimResults_Setter";
 
-Native_SpeechRecognition_lang_Getter(mthis) native "SpeechRecognition_lang_Getter";
+  static $lang_Getter(mthis) native "SpeechRecognition_lang_Getter";
 
-Native_SpeechRecognition_lang_Setter(mthis, value) native "SpeechRecognition_lang_Setter";
+  static $lang_Setter(mthis, value) native "SpeechRecognition_lang_Setter";
 
-Native_SpeechRecognition_maxAlternatives_Getter(mthis) native "SpeechRecognition_maxAlternatives_Getter";
+  static $maxAlternatives_Getter(mthis) native "SpeechRecognition_maxAlternatives_Getter";
 
-Native_SpeechRecognition_maxAlternatives_Setter(mthis, value) native "SpeechRecognition_maxAlternatives_Setter";
+  static $maxAlternatives_Setter(mthis, value) native "SpeechRecognition_maxAlternatives_Setter";
 
-Native_SpeechRecognition_abort_Callback(mthis) native "SpeechRecognition_abort_Callback_RESOLVER_STRING_0_";
+  static $abort_Callback(mthis) native "SpeechRecognition_abort_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechRecognition_start_Callback(mthis) native "SpeechRecognition_start_Callback_RESOLVER_STRING_0_";
+  static $start_Callback(mthis) native "SpeechRecognition_start_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechRecognition_stop_Callback(mthis) native "SpeechRecognition_stop_Callback_RESOLVER_STRING_0_";
+  static $stop_Callback(mthis) native "SpeechRecognition_stop_Callback_RESOLVER_STRING_0_";
+}
 
-Native_SpeechRecognitionAlternative_confidence_Getter(mthis) native "SpeechRecognitionAlternative_confidence_Getter";
+class BlinkSpeechRecognitionAlternative {
+  static $confidence_Getter(mthis) native "SpeechRecognitionAlternative_confidence_Getter";
 
-Native_SpeechRecognitionAlternative_transcript_Getter(mthis) native "SpeechRecognitionAlternative_transcript_Getter";
+  static $transcript_Getter(mthis) native "SpeechRecognitionAlternative_transcript_Getter";
+}
 
-Native_SpeechRecognitionError_error_Getter(mthis) native "SpeechRecognitionError_error_Getter";
+class BlinkSpeechRecognitionError {
+  static $error_Getter(mthis) native "SpeechRecognitionError_error_Getter";
 
-Native_SpeechRecognitionError_message_Getter(mthis) native "SpeechRecognitionError_message_Getter";
+  static $message_Getter(mthis) native "SpeechRecognitionError_message_Getter";
+}
 
-Native_SpeechRecognitionEvent_emma_Getter(mthis) native "SpeechRecognitionEvent_emma_Getter";
+class BlinkSpeechRecognitionEvent {
+  static $emma_Getter(mthis) native "SpeechRecognitionEvent_emma_Getter";
 
-Native_SpeechRecognitionEvent_interpretation_Getter(mthis) native "SpeechRecognitionEvent_interpretation_Getter";
+  static $interpretation_Getter(mthis) native "SpeechRecognitionEvent_interpretation_Getter";
 
-Native_SpeechRecognitionEvent_resultIndex_Getter(mthis) native "SpeechRecognitionEvent_resultIndex_Getter";
+  static $resultIndex_Getter(mthis) native "SpeechRecognitionEvent_resultIndex_Getter";
 
-Native_SpeechRecognitionEvent_results_Getter(mthis) native "SpeechRecognitionEvent_results_Getter";
+  static $results_Getter(mthis) native "SpeechRecognitionEvent_results_Getter";
+}
 
-Native_SpeechRecognitionResult_isFinal_Getter(mthis) native "SpeechRecognitionResult_isFinal_Getter";
+class BlinkSpeechRecognitionResult {
+  static $isFinal_Getter(mthis) native "SpeechRecognitionResult_isFinal_Getter";
 
-Native_SpeechRecognitionResult_length_Getter(mthis) native "SpeechRecognitionResult_length_Getter";
+  static $length_Getter(mthis) native "SpeechRecognitionResult_length_Getter";
 
-Native_SpeechRecognitionResult_item_Callback(mthis, index) native "SpeechRecognitionResult_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "SpeechRecognitionResult_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_SpeechRecognitionResultList_length_Getter(mthis) native "SpeechRecognitionResultList_length_Getter";
+class BlinkSpeechRecognitionResultList {
+  static $length_Getter(mthis) native "SpeechRecognitionResultList_length_Getter";
 
-Native_SpeechRecognitionResultList_NativeIndexed_Getter(mthis, index) native "SpeechRecognitionResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "SpeechRecognitionResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SpeechRecognitionResultList_item_Callback(mthis, index) native "SpeechRecognitionResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "SpeechRecognitionResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_SpeechSynthesis_paused_Getter(mthis) native "SpeechSynthesis_paused_Getter";
+class BlinkSpeechSynthesis {
+  static $paused_Getter(mthis) native "SpeechSynthesis_paused_Getter";
 
-Native_SpeechSynthesis_pending_Getter(mthis) native "SpeechSynthesis_pending_Getter";
+  static $pending_Getter(mthis) native "SpeechSynthesis_pending_Getter";
 
-Native_SpeechSynthesis_speaking_Getter(mthis) native "SpeechSynthesis_speaking_Getter";
+  static $speaking_Getter(mthis) native "SpeechSynthesis_speaking_Getter";
 
-Native_SpeechSynthesis_cancel_Callback(mthis) native "SpeechSynthesis_cancel_Callback_RESOLVER_STRING_0_";
+  static $cancel_Callback(mthis) native "SpeechSynthesis_cancel_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechSynthesis_getVoices_Callback(mthis) native "SpeechSynthesis_getVoices_Callback_RESOLVER_STRING_0_";
+  static $getVoices_Callback(mthis) native "SpeechSynthesis_getVoices_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechSynthesis_pause_Callback(mthis) native "SpeechSynthesis_pause_Callback_RESOLVER_STRING_0_";
+  static $pause_Callback(mthis) native "SpeechSynthesis_pause_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechSynthesis_resume_Callback(mthis) native "SpeechSynthesis_resume_Callback_RESOLVER_STRING_0_";
+  static $resume_Callback(mthis) native "SpeechSynthesis_resume_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechSynthesis_speak_Callback(mthis, utterance) native "SpeechSynthesis_speak_Callback_RESOLVER_STRING_1_SpeechSynthesisUtterance";
+  static $speak_Callback(mthis, utterance) native "SpeechSynthesis_speak_Callback_RESOLVER_STRING_1_SpeechSynthesisUtterance";
+}
 
-Native_SpeechSynthesisEvent_charIndex_Getter(mthis) native "SpeechSynthesisEvent_charIndex_Getter";
+class BlinkSpeechSynthesisEvent {
+  static $charIndex_Getter(mthis) native "SpeechSynthesisEvent_charIndex_Getter";
 
-Native_SpeechSynthesisEvent_elapsedTime_Getter(mthis) native "SpeechSynthesisEvent_elapsedTime_Getter";
+  static $elapsedTime_Getter(mthis) native "SpeechSynthesisEvent_elapsedTime_Getter";
 
-Native_SpeechSynthesisEvent_name_Getter(mthis) native "SpeechSynthesisEvent_name_Getter";
+  static $name_Getter(mthis) native "SpeechSynthesisEvent_name_Getter";
+}
 
+class BlinkSpeechSynthesisUtterance {
   // Generated overload resolver
-Native_SpeechSynthesisUtterance_SpeechSynthesisUtterance(text) {
-    return Native_SpeechSynthesisUtterance__create_1constructorCallback(text);
+  static $mkSpeechSynthesisUtterance(text) {
+    return $_create_1constructorCallback(text);
   }
 
-Native_SpeechSynthesisUtterance__create_1constructorCallback(text) native "SpeechSynthesisUtterance_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(text) native "SpeechSynthesisUtterance_constructorCallback_RESOLVER_STRING_1_DOMString";
 
-Native_SpeechSynthesisUtterance_lang_Getter(mthis) native "SpeechSynthesisUtterance_lang_Getter";
+  static $lang_Getter(mthis) native "SpeechSynthesisUtterance_lang_Getter";
 
-Native_SpeechSynthesisUtterance_lang_Setter(mthis, value) native "SpeechSynthesisUtterance_lang_Setter";
+  static $lang_Setter(mthis, value) native "SpeechSynthesisUtterance_lang_Setter";
 
-Native_SpeechSynthesisUtterance_pitch_Getter(mthis) native "SpeechSynthesisUtterance_pitch_Getter";
+  static $pitch_Getter(mthis) native "SpeechSynthesisUtterance_pitch_Getter";
 
-Native_SpeechSynthesisUtterance_pitch_Setter(mthis, value) native "SpeechSynthesisUtterance_pitch_Setter";
+  static $pitch_Setter(mthis, value) native "SpeechSynthesisUtterance_pitch_Setter";
 
-Native_SpeechSynthesisUtterance_rate_Getter(mthis) native "SpeechSynthesisUtterance_rate_Getter";
+  static $rate_Getter(mthis) native "SpeechSynthesisUtterance_rate_Getter";
 
-Native_SpeechSynthesisUtterance_rate_Setter(mthis, value) native "SpeechSynthesisUtterance_rate_Setter";
+  static $rate_Setter(mthis, value) native "SpeechSynthesisUtterance_rate_Setter";
 
-Native_SpeechSynthesisUtterance_text_Getter(mthis) native "SpeechSynthesisUtterance_text_Getter";
+  static $text_Getter(mthis) native "SpeechSynthesisUtterance_text_Getter";
 
-Native_SpeechSynthesisUtterance_text_Setter(mthis, value) native "SpeechSynthesisUtterance_text_Setter";
+  static $text_Setter(mthis, value) native "SpeechSynthesisUtterance_text_Setter";
 
-Native_SpeechSynthesisUtterance_voice_Getter(mthis) native "SpeechSynthesisUtterance_voice_Getter";
+  static $voice_Getter(mthis) native "SpeechSynthesisUtterance_voice_Getter";
 
-Native_SpeechSynthesisUtterance_voice_Setter(mthis, value) native "SpeechSynthesisUtterance_voice_Setter";
+  static $voice_Setter(mthis, value) native "SpeechSynthesisUtterance_voice_Setter";
 
-Native_SpeechSynthesisUtterance_volume_Getter(mthis) native "SpeechSynthesisUtterance_volume_Getter";
+  static $volume_Getter(mthis) native "SpeechSynthesisUtterance_volume_Getter";
 
-Native_SpeechSynthesisUtterance_volume_Setter(mthis, value) native "SpeechSynthesisUtterance_volume_Setter";
+  static $volume_Setter(mthis, value) native "SpeechSynthesisUtterance_volume_Setter";
+}
 
-Native_SpeechSynthesisVoice_default_Getter(mthis) native "SpeechSynthesisVoice_default_Getter";
+class BlinkSpeechSynthesisVoice {
+  static $default_Getter(mthis) native "SpeechSynthesisVoice_default_Getter";
 
-Native_SpeechSynthesisVoice_lang_Getter(mthis) native "SpeechSynthesisVoice_lang_Getter";
+  static $lang_Getter(mthis) native "SpeechSynthesisVoice_lang_Getter";
 
-Native_SpeechSynthesisVoice_localService_Getter(mthis) native "SpeechSynthesisVoice_localService_Getter";
+  static $localService_Getter(mthis) native "SpeechSynthesisVoice_localService_Getter";
 
-Native_SpeechSynthesisVoice_name_Getter(mthis) native "SpeechSynthesisVoice_name_Getter";
+  static $name_Getter(mthis) native "SpeechSynthesisVoice_name_Getter";
 
-Native_SpeechSynthesisVoice_voiceURI_Getter(mthis) native "SpeechSynthesisVoice_voiceURI_Getter";
+  static $voiceURI_Getter(mthis) native "SpeechSynthesisVoice_voiceURI_Getter";
+}
 
-Native_Storage_length_Getter(mthis) native "Storage_length_Getter";
+class BlinkStorage {
+  static $length_Getter(mthis) native "Storage_length_Getter";
 
   // Generated overload resolver
-Native_Storage___delete__(mthis, index_OR_name) {
+  static $__delete__(mthis, index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return Native_Storage____delete___1_Callback(mthis, index_OR_name);
+      return $___delete___1_Callback(mthis, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return Native_Storage____delete___2_Callback(mthis, index_OR_name);
+      return $___delete___2_Callback(mthis, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Storage____delete___1_Callback(mthis, index_OR_name) native "Storage___delete___Callback_RESOLVER_STRING_1_unsigned long";
+  static $___delete___1_Callback(mthis, index_OR_name) native "Storage___delete___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Storage____delete___2_Callback(mthis, index_OR_name) native "Storage___delete___Callback_RESOLVER_STRING_1_DOMString";
+  static $___delete___2_Callback(mthis, index_OR_name) native "Storage___delete___Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_Storage___getter__(mthis, index_OR_name) {
+  static $__getter__(mthis, index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return Native_Storage____getter___1_Callback(mthis, index_OR_name);
+      return $___getter___1_Callback(mthis, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return Native_Storage____getter___2_Callback(mthis, index_OR_name);
+      return $___getter___2_Callback(mthis, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Storage____getter___1_Callback(mthis, index_OR_name) native "Storage___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $___getter___1_Callback(mthis, index_OR_name) native "Storage___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Storage____getter___2_Callback(mthis, index_OR_name) native "Storage___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $___getter___2_Callback(mthis, index_OR_name) native "Storage___getter___Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_Storage___setter__(mthis, index_OR_name, value) {
+  static $__setter__(mthis, index_OR_name, value) {
     if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
-      Native_Storage____setter___1_Callback(mthis, index_OR_name, value);
+      $___setter___1_Callback(mthis, index_OR_name, value);
       return;
     }
     if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
-      Native_Storage____setter___2_Callback(mthis, index_OR_name, value);
+      $___setter___2_Callback(mthis, index_OR_name, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Storage____setter___1_Callback(mthis, index_OR_name, value) native "Storage___setter___Callback_RESOLVER_STRING_2_unsigned long_DOMString";
+  static $___setter___1_Callback(mthis, index_OR_name, value) native "Storage___setter___Callback_RESOLVER_STRING_2_unsigned long_DOMString";
 
-Native_Storage____setter___2_Callback(mthis, index_OR_name, value) native "Storage___setter___Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $___setter___2_Callback(mthis, index_OR_name, value) native "Storage___setter___Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Storage_clear_Callback(mthis) native "Storage_clear_Callback_RESOLVER_STRING_0_";
+  static $clear_Callback(mthis) native "Storage_clear_Callback_RESOLVER_STRING_0_";
 
-Native_Storage_getItem_Callback(mthis, key) native "Storage_getItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $getItem_Callback(mthis, key) native "Storage_getItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Storage_key_Callback(mthis, index) native "Storage_key_Callback_RESOLVER_STRING_1_unsigned long";
+  static $key_Callback(mthis, index) native "Storage_key_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Storage_removeItem_Callback(mthis, key) native "Storage_removeItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $removeItem_Callback(mthis, key) native "Storage_removeItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Storage_setItem_Callback(mthis, key, data) native "Storage_setItem_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $setItem_Callback(mthis, key, data) native "Storage_setItem_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+}
 
-Native_StorageEvent_key_Getter(mthis) native "StorageEvent_key_Getter";
+class BlinkStorageEvent {
+  static $key_Getter(mthis) native "StorageEvent_key_Getter";
 
-Native_StorageEvent_newValue_Getter(mthis) native "StorageEvent_newValue_Getter";
+  static $newValue_Getter(mthis) native "StorageEvent_newValue_Getter";
 
-Native_StorageEvent_oldValue_Getter(mthis) native "StorageEvent_oldValue_Getter";
+  static $oldValue_Getter(mthis) native "StorageEvent_oldValue_Getter";
 
-Native_StorageEvent_storageArea_Getter(mthis) native "StorageEvent_storageArea_Getter";
+  static $storageArea_Getter(mthis) native "StorageEvent_storageArea_Getter";
 
-Native_StorageEvent_url_Getter(mthis) native "StorageEvent_url_Getter";
+  static $url_Getter(mthis) native "StorageEvent_url_Getter";
 
-Native_StorageEvent_initStorageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg) native "StorageEvent_initStorageEvent_Callback_RESOLVER_STRING_8_DOMString_boolean_boolean_DOMString_DOMString_DOMString_DOMString_Storage";
+  static $initStorageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg) native "StorageEvent_initStorageEvent_Callback_RESOLVER_STRING_8_DOMString_boolean_boolean_DOMString_DOMString_DOMString_DOMString_Storage";
+}
 
-Native_StorageInfo_quota_Getter(mthis) native "StorageInfo_quota_Getter";
+class BlinkStorageInfo {
+  static $quota_Getter(mthis) native "StorageInfo_quota_Getter";
 
-Native_StorageInfo_usage_Getter(mthis) native "StorageInfo_usage_Getter";
+  static $usage_Getter(mthis) native "StorageInfo_usage_Getter";
+}
 
-Native_StorageQuota_supportedTypes_Getter(mthis) native "StorageQuota_supportedTypes_Getter";
+class BlinkStorageQuota {
+  static $supportedTypes_Getter(mthis) native "StorageQuota_supportedTypes_Getter";
+}
 
-Native_Stream_type_Getter(mthis) native "Stream_type_Getter";
+class BlinkStream {
+  static $type_Getter(mthis) native "Stream_type_Getter";
+}
 
-Native_StyleMedia_type_Getter(mthis) native "StyleMedia_type_Getter";
+class BlinkStyleMedia {
+  static $type_Getter(mthis) native "StyleMedia_type_Getter";
 
-Native_StyleMedia_matchMedium_Callback(mthis, mediaquery) native "StyleMedia_matchMedium_Callback_RESOLVER_STRING_1_DOMString";
+  static $matchMedium_Callback(mthis, mediaquery) native "StyleMedia_matchMedium_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_StyleSheetList_length_Getter(mthis) native "StyleSheetList_length_Getter";
+class BlinkStyleSheetList {
+  static $length_Getter(mthis) native "StyleSheetList_length_Getter";
 
-Native_StyleSheetList_NativeIndexed_Getter(mthis, index) native "StyleSheetList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "StyleSheetList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_StyleSheetList___getter___Callback(mthis, name) native "StyleSheetList___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $__getter___Callback(mthis, name) native "StyleSheetList___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_StyleSheetList_item_Callback(mthis, index) native "StyleSheetList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "StyleSheetList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_TextEvent_data_Getter(mthis) native "TextEvent_data_Getter";
+class BlinkSubtleCrypto {}
 
-Native_TextEvent_initTextEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "TextEvent_initTextEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_DOMString";
+class BlinkTextEvent {
+  static $data_Getter(mthis) native "TextEvent_data_Getter";
 
-Native_TextMetrics_width_Getter(mthis) native "TextMetrics_width_Getter";
+  static $initTextEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "TextEvent_initTextEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_DOMString";
+}
 
-Native_TextTrack_activeCues_Getter(mthis) native "TextTrack_activeCues_Getter";
+class BlinkTextMetrics {
+  static $width_Getter(mthis) native "TextMetrics_width_Getter";
+}
 
-Native_TextTrack_cues_Getter(mthis) native "TextTrack_cues_Getter";
+class BlinkTextTrack {
+  static $activeCues_Getter(mthis) native "TextTrack_activeCues_Getter";
 
-Native_TextTrack_id_Getter(mthis) native "TextTrack_id_Getter";
+  static $cues_Getter(mthis) native "TextTrack_cues_Getter";
 
-Native_TextTrack_kind_Getter(mthis) native "TextTrack_kind_Getter";
+  static $id_Getter(mthis) native "TextTrack_id_Getter";
 
-Native_TextTrack_label_Getter(mthis) native "TextTrack_label_Getter";
+  static $kind_Getter(mthis) native "TextTrack_kind_Getter";
 
-Native_TextTrack_language_Getter(mthis) native "TextTrack_language_Getter";
+  static $label_Getter(mthis) native "TextTrack_label_Getter";
 
-Native_TextTrack_mode_Getter(mthis) native "TextTrack_mode_Getter";
+  static $language_Getter(mthis) native "TextTrack_language_Getter";
 
-Native_TextTrack_mode_Setter(mthis, value) native "TextTrack_mode_Setter";
+  static $mode_Getter(mthis) native "TextTrack_mode_Getter";
 
-Native_TextTrack_regions_Getter(mthis) native "TextTrack_regions_Getter";
+  static $mode_Setter(mthis, value) native "TextTrack_mode_Setter";
 
-Native_TextTrack_addCue_Callback(mthis, cue) native "TextTrack_addCue_Callback_RESOLVER_STRING_1_TextTrackCue";
+  static $regions_Getter(mthis) native "TextTrack_regions_Getter";
 
-Native_TextTrack_addRegion_Callback(mthis, region) native "TextTrack_addRegion_Callback_RESOLVER_STRING_1_VTTRegion";
+  static $addCue_Callback(mthis, cue) native "TextTrack_addCue_Callback_RESOLVER_STRING_1_TextTrackCue";
 
-Native_TextTrack_removeCue_Callback(mthis, cue) native "TextTrack_removeCue_Callback_RESOLVER_STRING_1_TextTrackCue";
+  static $addRegion_Callback(mthis, region) native "TextTrack_addRegion_Callback_RESOLVER_STRING_1_VTTRegion";
 
-Native_TextTrack_removeRegion_Callback(mthis, region) native "TextTrack_removeRegion_Callback_RESOLVER_STRING_1_VTTRegion";
+  static $removeCue_Callback(mthis, cue) native "TextTrack_removeCue_Callback_RESOLVER_STRING_1_TextTrackCue";
 
-Native_TextTrackCue_endTime_Getter(mthis) native "TextTrackCue_endTime_Getter";
+  static $removeRegion_Callback(mthis, region) native "TextTrack_removeRegion_Callback_RESOLVER_STRING_1_VTTRegion";
+}
 
-Native_TextTrackCue_endTime_Setter(mthis, value) native "TextTrackCue_endTime_Setter";
+class BlinkTextTrackCue {
+  static $endTime_Getter(mthis) native "TextTrackCue_endTime_Getter";
 
-Native_TextTrackCue_id_Getter(mthis) native "TextTrackCue_id_Getter";
+  static $endTime_Setter(mthis, value) native "TextTrackCue_endTime_Setter";
 
-Native_TextTrackCue_id_Setter(mthis, value) native "TextTrackCue_id_Setter";
+  static $id_Getter(mthis) native "TextTrackCue_id_Getter";
 
-Native_TextTrackCue_pauseOnExit_Getter(mthis) native "TextTrackCue_pauseOnExit_Getter";
+  static $id_Setter(mthis, value) native "TextTrackCue_id_Setter";
 
-Native_TextTrackCue_pauseOnExit_Setter(mthis, value) native "TextTrackCue_pauseOnExit_Setter";
+  static $pauseOnExit_Getter(mthis) native "TextTrackCue_pauseOnExit_Getter";
 
-Native_TextTrackCue_startTime_Getter(mthis) native "TextTrackCue_startTime_Getter";
+  static $pauseOnExit_Setter(mthis, value) native "TextTrackCue_pauseOnExit_Setter";
 
-Native_TextTrackCue_startTime_Setter(mthis, value) native "TextTrackCue_startTime_Setter";
+  static $startTime_Getter(mthis) native "TextTrackCue_startTime_Getter";
 
-Native_TextTrackCue_track_Getter(mthis) native "TextTrackCue_track_Getter";
+  static $startTime_Setter(mthis, value) native "TextTrackCue_startTime_Setter";
 
-Native_TextTrackCueList_length_Getter(mthis) native "TextTrackCueList_length_Getter";
+  static $track_Getter(mthis) native "TextTrackCue_track_Getter";
+}
 
-Native_TextTrackCueList_NativeIndexed_Getter(mthis, index) native "TextTrackCueList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkTextTrackCueList {
+  static $length_Getter(mthis) native "TextTrackCueList_length_Getter";
 
-Native_TextTrackCueList_getCueById_Callback(mthis, id) native "TextTrackCueList_getCueById_Callback_RESOLVER_STRING_1_DOMString";
+  static $NativeIndexed_Getter(mthis, index) native "TextTrackCueList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_TextTrackCueList_item_Callback(mthis, index) native "TextTrackCueList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getCueById_Callback(mthis, id) native "TextTrackCueList_getCueById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_TextTrackList_length_Getter(mthis) native "TextTrackList_length_Getter";
+  static $item_Callback(mthis, index) native "TextTrackCueList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_TextTrackList_NativeIndexed_Getter(mthis, index) native "TextTrackList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkTextTrackList {
+  static $length_Getter(mthis) native "TextTrackList_length_Getter";
 
-Native_TextTrackList_getTrackById_Callback(mthis, id) native "TextTrackList_getTrackById_Callback_RESOLVER_STRING_1_DOMString";
+  static $NativeIndexed_Getter(mthis, index) native "TextTrackList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_TextTrackList_item_Callback(mthis, index) native "TextTrackList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getTrackById_Callback(mthis, id) native "TextTrackList_getTrackById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_TimeRanges_length_Getter(mthis) native "TimeRanges_length_Getter";
+  static $item_Callback(mthis, index) native "TextTrackList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
+
+class BlinkTimeRanges {
+  static $length_Getter(mthis) native "TimeRanges_length_Getter";
 
-Native_TimeRanges_end_Callback(mthis, index) native "TimeRanges_end_Callback_RESOLVER_STRING_1_unsigned long";
+  static $end_Callback(mthis, index) native "TimeRanges_end_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_TimeRanges_start_Callback(mthis, index) native "TimeRanges_start_Callback_RESOLVER_STRING_1_unsigned long";
+  static $start_Callback(mthis, index) native "TimeRanges_start_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_Timeline_play_Callback(mthis, source) native "Timeline_play_Callback_RESOLVER_STRING_1_TimedItem";
+class BlinkTimeline {
+  static $play_Callback(mthis, source) native "Timeline_play_Callback_RESOLVER_STRING_1_TimedItem";
+}
 
-Native_Timing_delay_Getter(mthis) native "Timing_delay_Getter";
+class BlinkTiming {
+  static $delay_Getter(mthis) native "Timing_delay_Getter";
 
-Native_Timing_delay_Setter(mthis, value) native "Timing_delay_Setter";
+  static $delay_Setter(mthis, value) native "Timing_delay_Setter";
 
-Native_Timing_direction_Getter(mthis) native "Timing_direction_Getter";
+  static $direction_Getter(mthis) native "Timing_direction_Getter";
 
-Native_Timing_direction_Setter(mthis, value) native "Timing_direction_Setter";
+  static $direction_Setter(mthis, value) native "Timing_direction_Setter";
 
-Native_Timing_easing_Getter(mthis) native "Timing_easing_Getter";
+  static $easing_Getter(mthis) native "Timing_easing_Getter";
 
-Native_Timing_easing_Setter(mthis, value) native "Timing_easing_Setter";
+  static $easing_Setter(mthis, value) native "Timing_easing_Setter";
 
-Native_Timing_endDelay_Getter(mthis) native "Timing_endDelay_Getter";
+  static $endDelay_Getter(mthis) native "Timing_endDelay_Getter";
 
-Native_Timing_endDelay_Setter(mthis, value) native "Timing_endDelay_Setter";
+  static $endDelay_Setter(mthis, value) native "Timing_endDelay_Setter";
 
-Native_Timing_fill_Getter(mthis) native "Timing_fill_Getter";
+  static $fill_Getter(mthis) native "Timing_fill_Getter";
 
-Native_Timing_fill_Setter(mthis, value) native "Timing_fill_Setter";
+  static $fill_Setter(mthis, value) native "Timing_fill_Setter";
 
-Native_Timing_iterationStart_Getter(mthis) native "Timing_iterationStart_Getter";
+  static $iterationStart_Getter(mthis) native "Timing_iterationStart_Getter";
 
-Native_Timing_iterationStart_Setter(mthis, value) native "Timing_iterationStart_Setter";
+  static $iterationStart_Setter(mthis, value) native "Timing_iterationStart_Setter";
 
-Native_Timing_iterations_Getter(mthis) native "Timing_iterations_Getter";
+  static $iterations_Getter(mthis) native "Timing_iterations_Getter";
 
-Native_Timing_iterations_Setter(mthis, value) native "Timing_iterations_Setter";
+  static $iterations_Setter(mthis, value) native "Timing_iterations_Setter";
 
-Native_Timing_playbackRate_Getter(mthis) native "Timing_playbackRate_Getter";
+  static $playbackRate_Getter(mthis) native "Timing_playbackRate_Getter";
 
-Native_Timing_playbackRate_Setter(mthis, value) native "Timing_playbackRate_Setter";
+  static $playbackRate_Setter(mthis, value) native "Timing_playbackRate_Setter";
 
-Native_Timing___setter___Callback(mthis, name, duration) native "Timing___setter___Callback_RESOLVER_STRING_2_DOMString_double";
+  static $__setter___Callback(mthis, name, duration) native "Timing___setter___Callback_RESOLVER_STRING_2_DOMString_double";
+}
 
-Native_Touch_clientX_Getter(mthis) native "Touch_clientX_Getter";
+class BlinkTouch {
+  static $clientX_Getter(mthis) native "Touch_clientX_Getter";
 
-Native_Touch_clientY_Getter(mthis) native "Touch_clientY_Getter";
+  static $clientY_Getter(mthis) native "Touch_clientY_Getter";
 
-Native_Touch_identifier_Getter(mthis) native "Touch_identifier_Getter";
+  static $identifier_Getter(mthis) native "Touch_identifier_Getter";
 
-Native_Touch_pageX_Getter(mthis) native "Touch_pageX_Getter";
+  static $pageX_Getter(mthis) native "Touch_pageX_Getter";
 
-Native_Touch_pageY_Getter(mthis) native "Touch_pageY_Getter";
+  static $pageY_Getter(mthis) native "Touch_pageY_Getter";
 
-Native_Touch_screenX_Getter(mthis) native "Touch_screenX_Getter";
+  static $screenX_Getter(mthis) native "Touch_screenX_Getter";
 
-Native_Touch_screenY_Getter(mthis) native "Touch_screenY_Getter";
+  static $screenY_Getter(mthis) native "Touch_screenY_Getter";
 
-Native_Touch_target_Getter(mthis) native "Touch_target_Getter";
+  static $target_Getter(mthis) native "Touch_target_Getter";
 
-Native_Touch_webkitForce_Getter(mthis) native "Touch_webkitForce_Getter";
+  static $webkitForce_Getter(mthis) native "Touch_webkitForce_Getter";
 
-Native_Touch_webkitRadiusX_Getter(mthis) native "Touch_webkitRadiusX_Getter";
+  static $webkitRadiusX_Getter(mthis) native "Touch_webkitRadiusX_Getter";
 
-Native_Touch_webkitRadiusY_Getter(mthis) native "Touch_webkitRadiusY_Getter";
+  static $webkitRadiusY_Getter(mthis) native "Touch_webkitRadiusY_Getter";
 
-Native_Touch_webkitRotationAngle_Getter(mthis) native "Touch_webkitRotationAngle_Getter";
+  static $webkitRotationAngle_Getter(mthis) native "Touch_webkitRotationAngle_Getter";
+}
 
-Native_TouchEvent_altKey_Getter(mthis) native "TouchEvent_altKey_Getter";
+class BlinkTouchEvent {
+  static $altKey_Getter(mthis) native "TouchEvent_altKey_Getter";
 
-Native_TouchEvent_changedTouches_Getter(mthis) native "TouchEvent_changedTouches_Getter";
+  static $changedTouches_Getter(mthis) native "TouchEvent_changedTouches_Getter";
 
-Native_TouchEvent_ctrlKey_Getter(mthis) native "TouchEvent_ctrlKey_Getter";
+  static $ctrlKey_Getter(mthis) native "TouchEvent_ctrlKey_Getter";
 
-Native_TouchEvent_metaKey_Getter(mthis) native "TouchEvent_metaKey_Getter";
+  static $metaKey_Getter(mthis) native "TouchEvent_metaKey_Getter";
 
-Native_TouchEvent_shiftKey_Getter(mthis) native "TouchEvent_shiftKey_Getter";
+  static $shiftKey_Getter(mthis) native "TouchEvent_shiftKey_Getter";
 
-Native_TouchEvent_targetTouches_Getter(mthis) native "TouchEvent_targetTouches_Getter";
+  static $targetTouches_Getter(mthis) native "TouchEvent_targetTouches_Getter";
 
-Native_TouchEvent_touches_Getter(mthis) native "TouchEvent_touches_Getter";
+  static $touches_Getter(mthis) native "TouchEvent_touches_Getter";
 
-Native_TouchEvent_initTouchEvent_Callback(mthis, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "TouchEvent_initTouchEvent_Callback_RESOLVER_STRING_13_TouchList_TouchList_TouchList_DOMString_Window_long_long_long_long_boolean_boolean_boolean_boolean";
+  static $initTouchEvent_Callback(mthis, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "TouchEvent_initTouchEvent_Callback_RESOLVER_STRING_13_TouchList_TouchList_TouchList_DOMString_Window_long_long_long_long_boolean_boolean_boolean_boolean";
+}
 
-Native_TouchList_length_Getter(mthis) native "TouchList_length_Getter";
+class BlinkTouchList {
+  static $length_Getter(mthis) native "TouchList_length_Getter";
 
-Native_TouchList_NativeIndexed_Getter(mthis, index) native "TouchList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "TouchList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_TouchList_item_Callback(mthis, index) native "TouchList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "TouchList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_TrackEvent_track_Getter(mthis) native "TrackEvent_track_Getter";
+class BlinkTrackEvent {
+  static $track_Getter(mthis) native "TrackEvent_track_Getter";
+}
 
-Native_TransitionEvent_elapsedTime_Getter(mthis) native "TransitionEvent_elapsedTime_Getter";
+class BlinkTransitionEvent {
+  static $elapsedTime_Getter(mthis) native "TransitionEvent_elapsedTime_Getter";
 
-Native_TransitionEvent_propertyName_Getter(mthis) native "TransitionEvent_propertyName_Getter";
+  static $propertyName_Getter(mthis) native "TransitionEvent_propertyName_Getter";
 
-Native_TransitionEvent_pseudoElement_Getter(mthis) native "TransitionEvent_pseudoElement_Getter";
+  static $pseudoElement_Getter(mthis) native "TransitionEvent_pseudoElement_Getter";
+}
 
-Native_TreeWalker_currentNode_Getter(mthis) native "TreeWalker_currentNode_Getter";
+class BlinkTreeWalker {
+  static $currentNode_Getter(mthis) native "TreeWalker_currentNode_Getter";
 
-Native_TreeWalker_currentNode_Setter(mthis, value) native "TreeWalker_currentNode_Setter";
+  static $currentNode_Setter(mthis, value) native "TreeWalker_currentNode_Setter";
 
-Native_TreeWalker_filter_Getter(mthis) native "TreeWalker_filter_Getter";
+  static $filter_Getter(mthis) native "TreeWalker_filter_Getter";
 
-Native_TreeWalker_root_Getter(mthis) native "TreeWalker_root_Getter";
+  static $root_Getter(mthis) native "TreeWalker_root_Getter";
 
-Native_TreeWalker_whatToShow_Getter(mthis) native "TreeWalker_whatToShow_Getter";
+  static $whatToShow_Getter(mthis) native "TreeWalker_whatToShow_Getter";
 
-Native_TreeWalker_firstChild_Callback(mthis) native "TreeWalker_firstChild_Callback_RESOLVER_STRING_0_";
+  static $firstChild_Callback(mthis) native "TreeWalker_firstChild_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_lastChild_Callback(mthis) native "TreeWalker_lastChild_Callback_RESOLVER_STRING_0_";
+  static $lastChild_Callback(mthis) native "TreeWalker_lastChild_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_nextNode_Callback(mthis) native "TreeWalker_nextNode_Callback_RESOLVER_STRING_0_";
+  static $nextNode_Callback(mthis) native "TreeWalker_nextNode_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_nextSibling_Callback(mthis) native "TreeWalker_nextSibling_Callback_RESOLVER_STRING_0_";
+  static $nextSibling_Callback(mthis) native "TreeWalker_nextSibling_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_parentNode_Callback(mthis) native "TreeWalker_parentNode_Callback_RESOLVER_STRING_0_";
+  static $parentNode_Callback(mthis) native "TreeWalker_parentNode_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_previousNode_Callback(mthis) native "TreeWalker_previousNode_Callback_RESOLVER_STRING_0_";
+  static $previousNode_Callback(mthis) native "TreeWalker_previousNode_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_previousSibling_Callback(mthis) native "TreeWalker_previousSibling_Callback_RESOLVER_STRING_0_";
+  static $previousSibling_Callback(mthis) native "TreeWalker_previousSibling_Callback_RESOLVER_STRING_0_";
+}
 
+class BlinkURL {
   // Generated overload resolver
-Native_URL_createObjectUrl(blob_OR_source_OR_stream) {
+  static $createObjectUrl(blob_OR_source_OR_stream) {
     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);
+      return $_createObjectURL_1_Callback(blob_OR_source_OR_stream);
     }
     if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
-      return Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream);
+      return $_createObjectURL_2_Callback(blob_OR_source_OR_stream);
     }
     if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
-      return Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream);
+      return $_createObjectURL_3_Callback(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
+  static $_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";
+  static $_createObjectURL_2_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
 
-Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
+  static $_createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
 
-Native_URL_createObjectUrlFromBlob_Callback(blob) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
+  static $createObjectUrlFromBlob_Callback(blob) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
 
-Native_URL_createObjectUrlFromSource_Callback(source) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
+  static $createObjectUrlFromSource_Callback(source) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
 
-Native_URL_createObjectUrlFromStream_Callback(stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
+  static $createObjectUrlFromStream_Callback(stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
 
-Native_URL_revokeObjectURL_Callback(url) native "URL_revokeObjectURL_Callback_RESOLVER_STRING_1_DOMString";
+  static $revokeObjectURL_Callback(url) native "URL_revokeObjectURL_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_URL_hash_Getter(mthis) native "URL_hash_Getter";
+  static $hash_Getter(mthis) native "URL_hash_Getter";
 
-Native_URL_hash_Setter(mthis, value) native "URL_hash_Setter";
+  static $hash_Setter(mthis, value) native "URL_hash_Setter";
 
-Native_URL_host_Getter(mthis) native "URL_host_Getter";
+  static $host_Getter(mthis) native "URL_host_Getter";
 
-Native_URL_host_Setter(mthis, value) native "URL_host_Setter";
+  static $host_Setter(mthis, value) native "URL_host_Setter";
 
-Native_URL_hostname_Getter(mthis) native "URL_hostname_Getter";
+  static $hostname_Getter(mthis) native "URL_hostname_Getter";
 
-Native_URL_hostname_Setter(mthis, value) native "URL_hostname_Setter";
+  static $hostname_Setter(mthis, value) native "URL_hostname_Setter";
 
-Native_URL_href_Getter(mthis) native "URL_href_Getter";
+  static $href_Getter(mthis) native "URL_href_Getter";
 
-Native_URL_href_Setter(mthis, value) native "URL_href_Setter";
+  static $href_Setter(mthis, value) native "URL_href_Setter";
 
-Native_URL_origin_Getter(mthis) native "URL_origin_Getter";
+  static $origin_Getter(mthis) native "URL_origin_Getter";
 
-Native_URL_password_Getter(mthis) native "URL_password_Getter";
+  static $password_Getter(mthis) native "URL_password_Getter";
 
-Native_URL_password_Setter(mthis, value) native "URL_password_Setter";
+  static $password_Setter(mthis, value) native "URL_password_Setter";
 
-Native_URL_pathname_Getter(mthis) native "URL_pathname_Getter";
+  static $pathname_Getter(mthis) native "URL_pathname_Getter";
 
-Native_URL_pathname_Setter(mthis, value) native "URL_pathname_Setter";
+  static $pathname_Setter(mthis, value) native "URL_pathname_Setter";
 
-Native_URL_port_Getter(mthis) native "URL_port_Getter";
+  static $port_Getter(mthis) native "URL_port_Getter";
 
-Native_URL_port_Setter(mthis, value) native "URL_port_Setter";
+  static $port_Setter(mthis, value) native "URL_port_Setter";
 
-Native_URL_protocol_Getter(mthis) native "URL_protocol_Getter";
+  static $protocol_Getter(mthis) native "URL_protocol_Getter";
 
-Native_URL_protocol_Setter(mthis, value) native "URL_protocol_Setter";
+  static $protocol_Setter(mthis, value) native "URL_protocol_Setter";
 
-Native_URL_search_Getter(mthis) native "URL_search_Getter";
+  static $search_Getter(mthis) native "URL_search_Getter";
 
-Native_URL_search_Setter(mthis, value) native "URL_search_Setter";
+  static $search_Setter(mthis, value) native "URL_search_Setter";
 
-Native_URL_username_Getter(mthis) native "URL_username_Getter";
+  static $username_Getter(mthis) native "URL_username_Getter";
 
-Native_URL_username_Setter(mthis, value) native "URL_username_Setter";
+  static $username_Setter(mthis, value) native "URL_username_Setter";
 
-Native_URL_toString_Callback(mthis) native "URL_toString_Callback_RESOLVER_STRING_0_";
+  static $toString_Callback(mthis) native "URL_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_URLUtilsReadOnly_hash_Getter(mthis) native "WorkerLocation_hash_Getter";
+class BlinkURLUtilsReadOnly {
+  static $hash_Getter(mthis) native "WorkerLocation_hash_Getter";
 
-Native_URLUtilsReadOnly_host_Getter(mthis) native "WorkerLocation_host_Getter";
+  static $host_Getter(mthis) native "WorkerLocation_host_Getter";
 
-Native_URLUtilsReadOnly_hostname_Getter(mthis) native "WorkerLocation_hostname_Getter";
+  static $hostname_Getter(mthis) native "WorkerLocation_hostname_Getter";
 
-Native_URLUtilsReadOnly_href_Getter(mthis) native "WorkerLocation_href_Getter";
+  static $href_Getter(mthis) native "WorkerLocation_href_Getter";
 
-Native_URLUtilsReadOnly_pathname_Getter(mthis) native "WorkerLocation_pathname_Getter";
+  static $pathname_Getter(mthis) native "WorkerLocation_pathname_Getter";
 
-Native_URLUtilsReadOnly_port_Getter(mthis) native "WorkerLocation_port_Getter";
+  static $port_Getter(mthis) native "WorkerLocation_port_Getter";
 
-Native_URLUtilsReadOnly_protocol_Getter(mthis) native "WorkerLocation_protocol_Getter";
+  static $protocol_Getter(mthis) native "WorkerLocation_protocol_Getter";
 
-Native_URLUtilsReadOnly_search_Getter(mthis) native "WorkerLocation_search_Getter";
+  static $search_Getter(mthis) native "WorkerLocation_search_Getter";
 
-Native_URLUtilsReadOnly_toString_Callback(mthis) native "WorkerLocation_toString_Callback_RESOLVER_STRING_0_";
+  static $toString_Callback(mthis) native "WorkerLocation_toString_Callback_RESOLVER_STRING_0_";
+}
 
+class BlinkVTTCue {
   // Generated overload resolver
-Native_VTTCue_VttCue(startTime, endTime, text) {
-    return Native_VTTCue__create_1constructorCallback(startTime, endTime, text);
+  static $mkVttCue(startTime, endTime, text) {
+    return $_create_1constructorCallback(startTime, endTime, text);
   }
 
-Native_VTTCue__create_1constructorCallback(startTime, endTime, text) native "VTTCue_constructorCallback_RESOLVER_STRING_3_double_double_DOMString";
+  static $_create_1constructorCallback(startTime, endTime, text) native "VTTCue_constructorCallback_RESOLVER_STRING_3_double_double_DOMString";
 
-Native_VTTCue_align_Getter(mthis) native "VTTCue_align_Getter";
+  static $align_Getter(mthis) native "VTTCue_align_Getter";
 
-Native_VTTCue_align_Setter(mthis, value) native "VTTCue_align_Setter";
+  static $align_Setter(mthis, value) native "VTTCue_align_Setter";
 
-Native_VTTCue_line_Getter(mthis) native "VTTCue_line_Getter";
+  static $line_Getter(mthis) native "VTTCue_line_Getter";
 
-Native_VTTCue_line_Setter(mthis, value) native "VTTCue_line_Setter";
+  static $line_Setter(mthis, value) native "VTTCue_line_Setter";
 
-Native_VTTCue_position_Getter(mthis) native "VTTCue_position_Getter";
+  static $position_Getter(mthis) native "VTTCue_position_Getter";
 
-Native_VTTCue_position_Setter(mthis, value) native "VTTCue_position_Setter";
+  static $position_Setter(mthis, value) native "VTTCue_position_Setter";
 
-Native_VTTCue_regionId_Getter(mthis) native "VTTCue_regionId_Getter";
+  static $regionId_Getter(mthis) native "VTTCue_regionId_Getter";
 
-Native_VTTCue_regionId_Setter(mthis, value) native "VTTCue_regionId_Setter";
+  static $regionId_Setter(mthis, value) native "VTTCue_regionId_Setter";
 
-Native_VTTCue_size_Getter(mthis) native "VTTCue_size_Getter";
+  static $size_Getter(mthis) native "VTTCue_size_Getter";
 
-Native_VTTCue_size_Setter(mthis, value) native "VTTCue_size_Setter";
+  static $size_Setter(mthis, value) native "VTTCue_size_Setter";
 
-Native_VTTCue_snapToLines_Getter(mthis) native "VTTCue_snapToLines_Getter";
+  static $snapToLines_Getter(mthis) native "VTTCue_snapToLines_Getter";
 
-Native_VTTCue_snapToLines_Setter(mthis, value) native "VTTCue_snapToLines_Setter";
+  static $snapToLines_Setter(mthis, value) native "VTTCue_snapToLines_Setter";
 
-Native_VTTCue_text_Getter(mthis) native "VTTCue_text_Getter";
+  static $text_Getter(mthis) native "VTTCue_text_Getter";
 
-Native_VTTCue_text_Setter(mthis, value) native "VTTCue_text_Setter";
+  static $text_Setter(mthis, value) native "VTTCue_text_Setter";
 
-Native_VTTCue_vertical_Getter(mthis) native "VTTCue_vertical_Getter";
+  static $vertical_Getter(mthis) native "VTTCue_vertical_Getter";
 
-Native_VTTCue_vertical_Setter(mthis, value) native "VTTCue_vertical_Setter";
+  static $vertical_Setter(mthis, value) native "VTTCue_vertical_Setter";
 
-Native_VTTCue_getCueAsHTML_Callback(mthis) native "VTTCue_getCueAsHTML_Callback_RESOLVER_STRING_0_";
+  static $getCueAsHTML_Callback(mthis) native "VTTCue_getCueAsHTML_Callback_RESOLVER_STRING_0_";
+}
 
+class BlinkVTTRegion {
   // Generated overload resolver
-Native_VTTRegion_VttRegion() {
-    return Native_VTTRegion__create_1constructorCallback();
+  static $mkVttRegion() {
+    return $_create_1constructorCallback();
   }
 
-Native_VTTRegion__create_1constructorCallback() native "VTTRegion_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "VTTRegion_constructorCallback_RESOLVER_STRING_0_";
 
-Native_VTTRegion_height_Getter(mthis) native "VTTRegion_height_Getter";
+  static $height_Getter(mthis) native "VTTRegion_height_Getter";
 
-Native_VTTRegion_height_Setter(mthis, value) native "VTTRegion_height_Setter";
+  static $height_Setter(mthis, value) native "VTTRegion_height_Setter";
 
-Native_VTTRegion_id_Getter(mthis) native "VTTRegion_id_Getter";
+  static $id_Getter(mthis) native "VTTRegion_id_Getter";
 
-Native_VTTRegion_id_Setter(mthis, value) native "VTTRegion_id_Setter";
+  static $id_Setter(mthis, value) native "VTTRegion_id_Setter";
 
-Native_VTTRegion_regionAnchorX_Getter(mthis) native "VTTRegion_regionAnchorX_Getter";
+  static $regionAnchorX_Getter(mthis) native "VTTRegion_regionAnchorX_Getter";
 
-Native_VTTRegion_regionAnchorX_Setter(mthis, value) native "VTTRegion_regionAnchorX_Setter";
+  static $regionAnchorX_Setter(mthis, value) native "VTTRegion_regionAnchorX_Setter";
 
-Native_VTTRegion_regionAnchorY_Getter(mthis) native "VTTRegion_regionAnchorY_Getter";
+  static $regionAnchorY_Getter(mthis) native "VTTRegion_regionAnchorY_Getter";
 
-Native_VTTRegion_regionAnchorY_Setter(mthis, value) native "VTTRegion_regionAnchorY_Setter";
+  static $regionAnchorY_Setter(mthis, value) native "VTTRegion_regionAnchorY_Setter";
 
-Native_VTTRegion_scroll_Getter(mthis) native "VTTRegion_scroll_Getter";
+  static $scroll_Getter(mthis) native "VTTRegion_scroll_Getter";
 
-Native_VTTRegion_scroll_Setter(mthis, value) native "VTTRegion_scroll_Setter";
+  static $scroll_Setter(mthis, value) native "VTTRegion_scroll_Setter";
 
-Native_VTTRegion_track_Getter(mthis) native "VTTRegion_track_Getter";
+  static $track_Getter(mthis) native "VTTRegion_track_Getter";
 
-Native_VTTRegion_viewportAnchorX_Getter(mthis) native "VTTRegion_viewportAnchorX_Getter";
+  static $viewportAnchorX_Getter(mthis) native "VTTRegion_viewportAnchorX_Getter";
 
-Native_VTTRegion_viewportAnchorX_Setter(mthis, value) native "VTTRegion_viewportAnchorX_Setter";
+  static $viewportAnchorX_Setter(mthis, value) native "VTTRegion_viewportAnchorX_Setter";
 
-Native_VTTRegion_viewportAnchorY_Getter(mthis) native "VTTRegion_viewportAnchorY_Getter";
+  static $viewportAnchorY_Getter(mthis) native "VTTRegion_viewportAnchorY_Getter";
 
-Native_VTTRegion_viewportAnchorY_Setter(mthis, value) native "VTTRegion_viewportAnchorY_Setter";
+  static $viewportAnchorY_Setter(mthis, value) native "VTTRegion_viewportAnchorY_Setter";
 
-Native_VTTRegion_width_Getter(mthis) native "VTTRegion_width_Getter";
+  static $width_Getter(mthis) native "VTTRegion_width_Getter";
 
-Native_VTTRegion_width_Setter(mthis, value) native "VTTRegion_width_Setter";
+  static $width_Setter(mthis, value) native "VTTRegion_width_Setter";
+}
 
-Native_VTTRegionList_length_Getter(mthis) native "VTTRegionList_length_Getter";
+class BlinkVTTRegionList {
+  static $length_Getter(mthis) native "VTTRegionList_length_Getter";
 
-Native_VTTRegionList_getRegionById_Callback(mthis, id) native "VTTRegionList_getRegionById_Callback_RESOLVER_STRING_1_DOMString";
+  static $getRegionById_Callback(mthis, id) native "VTTRegionList_getRegionById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_VTTRegionList_item_Callback(mthis, index) native "VTTRegionList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "VTTRegionList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_ValidityState_badInput_Getter(mthis) native "ValidityState_badInput_Getter";
+class BlinkValidityState {
+  static $badInput_Getter(mthis) native "ValidityState_badInput_Getter";
 
-Native_ValidityState_customError_Getter(mthis) native "ValidityState_customError_Getter";
+  static $customError_Getter(mthis) native "ValidityState_customError_Getter";
 
-Native_ValidityState_patternMismatch_Getter(mthis) native "ValidityState_patternMismatch_Getter";
+  static $patternMismatch_Getter(mthis) native "ValidityState_patternMismatch_Getter";
 
-Native_ValidityState_rangeOverflow_Getter(mthis) native "ValidityState_rangeOverflow_Getter";
+  static $rangeOverflow_Getter(mthis) native "ValidityState_rangeOverflow_Getter";
 
-Native_ValidityState_rangeUnderflow_Getter(mthis) native "ValidityState_rangeUnderflow_Getter";
+  static $rangeUnderflow_Getter(mthis) native "ValidityState_rangeUnderflow_Getter";
 
-Native_ValidityState_stepMismatch_Getter(mthis) native "ValidityState_stepMismatch_Getter";
+  static $stepMismatch_Getter(mthis) native "ValidityState_stepMismatch_Getter";
 
-Native_ValidityState_tooLong_Getter(mthis) native "ValidityState_tooLong_Getter";
+  static $tooLong_Getter(mthis) native "ValidityState_tooLong_Getter";
 
-Native_ValidityState_typeMismatch_Getter(mthis) native "ValidityState_typeMismatch_Getter";
+  static $typeMismatch_Getter(mthis) native "ValidityState_typeMismatch_Getter";
 
-Native_ValidityState_valid_Getter(mthis) native "ValidityState_valid_Getter";
+  static $valid_Getter(mthis) native "ValidityState_valid_Getter";
 
-Native_ValidityState_valueMissing_Getter(mthis) native "ValidityState_valueMissing_Getter";
+  static $valueMissing_Getter(mthis) native "ValidityState_valueMissing_Getter";
+}
 
-Native_VideoPlaybackQuality_corruptedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_corruptedVideoFrames_Getter";
+class BlinkVideoPlaybackQuality {
+  static $corruptedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_corruptedVideoFrames_Getter";
 
-Native_VideoPlaybackQuality_creationTime_Getter(mthis) native "VideoPlaybackQuality_creationTime_Getter";
+  static $creationTime_Getter(mthis) native "VideoPlaybackQuality_creationTime_Getter";
 
-Native_VideoPlaybackQuality_droppedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_droppedVideoFrames_Getter";
+  static $droppedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_droppedVideoFrames_Getter";
+
+  static $totalVideoFrames_Getter(mthis) native "VideoPlaybackQuality_totalVideoFrames_Getter";
+}
+
+class BlinkWaveShaperNode {
+  static $curve_Getter(mthis) native "WaveShaperNode_curve_Getter";
+
+  static $curve_Setter(mthis, value) native "WaveShaperNode_curve_Setter";
+
+  static $oversample_Getter(mthis) native "WaveShaperNode_oversample_Getter";
+
+  static $oversample_Setter(mthis, value) native "WaveShaperNode_oversample_Setter";
+}
+
+class BlinkWebGLActiveInfo {
+  static $name_Getter(mthis) native "WebGLActiveInfo_name_Getter";
+
+  static $size_Getter(mthis) native "WebGLActiveInfo_size_Getter";
+
+  static $type_Getter(mthis) native "WebGLActiveInfo_type_Getter";
+}
+
+class BlinkWebGLBuffer {}
 
-Native_VideoPlaybackQuality_totalVideoFrames_Getter(mthis) native "VideoPlaybackQuality_totalVideoFrames_Getter";
+class BlinkWebGLCompressedTextureATC {}
 
-Native_WaveShaperNode_curve_Getter(mthis) native "WaveShaperNode_curve_Getter";
+class BlinkWebGLCompressedTexturePVRTC {}
 
-Native_WaveShaperNode_curve_Setter(mthis, value) native "WaveShaperNode_curve_Setter";
+class BlinkWebGLCompressedTextureS3TC {}
 
-Native_WaveShaperNode_oversample_Getter(mthis) native "WaveShaperNode_oversample_Getter";
+class BlinkWebGLContextAttributes {
+  static $alpha_Getter(mthis) native "WebGLContextAttributes_alpha_Getter";
 
-Native_WaveShaperNode_oversample_Setter(mthis, value) native "WaveShaperNode_oversample_Setter";
+  static $alpha_Setter(mthis, value) native "WebGLContextAttributes_alpha_Setter";
 
-Native_WebGLActiveInfo_name_Getter(mthis) native "WebGLActiveInfo_name_Getter";
+  static $antialias_Getter(mthis) native "WebGLContextAttributes_antialias_Getter";
 
-Native_WebGLActiveInfo_size_Getter(mthis) native "WebGLActiveInfo_size_Getter";
+  static $antialias_Setter(mthis, value) native "WebGLContextAttributes_antialias_Setter";
 
-Native_WebGLActiveInfo_type_Getter(mthis) native "WebGLActiveInfo_type_Getter";
+  static $depth_Getter(mthis) native "WebGLContextAttributes_depth_Getter";
 
-Native_WebGLContextAttributes_alpha_Getter(mthis) native "WebGLContextAttributes_alpha_Getter";
+  static $depth_Setter(mthis, value) native "WebGLContextAttributes_depth_Setter";
 
-Native_WebGLContextAttributes_alpha_Setter(mthis, value) native "WebGLContextAttributes_alpha_Setter";
+  static $failIfMajorPerformanceCaveat_Getter(mthis) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter";
 
-Native_WebGLContextAttributes_antialias_Getter(mthis) native "WebGLContextAttributes_antialias_Getter";
+  static $failIfMajorPerformanceCaveat_Setter(mthis, value) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter";
 
-Native_WebGLContextAttributes_antialias_Setter(mthis, value) native "WebGLContextAttributes_antialias_Setter";
+  static $premultipliedAlpha_Getter(mthis) native "WebGLContextAttributes_premultipliedAlpha_Getter";
 
-Native_WebGLContextAttributes_depth_Getter(mthis) native "WebGLContextAttributes_depth_Getter";
+  static $premultipliedAlpha_Setter(mthis, value) native "WebGLContextAttributes_premultipliedAlpha_Setter";
 
-Native_WebGLContextAttributes_depth_Setter(mthis, value) native "WebGLContextAttributes_depth_Setter";
+  static $preserveDrawingBuffer_Getter(mthis) native "WebGLContextAttributes_preserveDrawingBuffer_Getter";
 
-Native_WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter(mthis) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter";
+  static $preserveDrawingBuffer_Setter(mthis, value) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";
 
-Native_WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter(mthis, value) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter";
+  static $stencil_Getter(mthis) native "WebGLContextAttributes_stencil_Getter";
 
-Native_WebGLContextAttributes_premultipliedAlpha_Getter(mthis) native "WebGLContextAttributes_premultipliedAlpha_Getter";
+  static $stencil_Setter(mthis, value) native "WebGLContextAttributes_stencil_Setter";
+}
 
-Native_WebGLContextAttributes_premultipliedAlpha_Setter(mthis, value) native "WebGLContextAttributes_premultipliedAlpha_Setter";
+class BlinkWebGLContextEvent {
+  static $statusMessage_Getter(mthis) native "WebGLContextEvent_statusMessage_Getter";
+}
 
-Native_WebGLContextAttributes_preserveDrawingBuffer_Getter(mthis) native "WebGLContextAttributes_preserveDrawingBuffer_Getter";
+class BlinkWebGLDebugRendererInfo {}
 
-Native_WebGLContextAttributes_preserveDrawingBuffer_Setter(mthis, value) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";
+class BlinkWebGLDebugShaders {
+  static $getTranslatedShaderSource_Callback(mthis, shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback_RESOLVER_STRING_1_WebGLShader";
+}
 
-Native_WebGLContextAttributes_stencil_Getter(mthis) native "WebGLContextAttributes_stencil_Getter";
+class BlinkWebGLDepthTexture {}
 
-Native_WebGLContextAttributes_stencil_Setter(mthis, value) native "WebGLContextAttributes_stencil_Setter";
+class BlinkWebGLDrawBuffers {
+  static $drawBuffersWEBGL_Callback(mthis, buffers) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback_RESOLVER_STRING_1_sequence<unsigned long>";
+}
 
-Native_WebGLContextEvent_statusMessage_Getter(mthis) native "WebGLContextEvent_statusMessage_Getter";
+class BlinkWebGLFramebuffer {}
 
-Native_WebGLDebugShaders_getTranslatedShaderSource_Callback(mthis, shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback_RESOLVER_STRING_1_WebGLShader";
+class BlinkWebGLLoseContext {
+  static $loseContext_Callback(mthis) native "WebGLLoseContext_loseContext_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLDrawBuffers_drawBuffersWEBGL_Callback(mthis, buffers) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback_RESOLVER_STRING_1_sequence<unsigned long>";
+  static $restoreContext_Callback(mthis) native "WebGLLoseContext_restoreContext_Callback_RESOLVER_STRING_0_";
+}
 
-Native_WebGLLoseContext_loseContext_Callback(mthis) native "WebGLLoseContext_loseContext_Callback_RESOLVER_STRING_0_";
+class BlinkWebGLProgram {}
 
-Native_WebGLLoseContext_restoreContext_Callback(mthis) native "WebGLLoseContext_restoreContext_Callback_RESOLVER_STRING_0_";
+class BlinkWebGLRenderbuffer {}
 
-Native_WebGLRenderingContext_drawingBufferHeight_Getter(mthis) native "WebGLRenderingContext_drawingBufferHeight_Getter";
+class BlinkWebGLRenderingContext {
+  static $drawingBufferHeight_Getter(mthis) native "WebGLRenderingContext_drawingBufferHeight_Getter";
 
-Native_WebGLRenderingContext_drawingBufferWidth_Getter(mthis) native "WebGLRenderingContext_drawingBufferWidth_Getter";
+  static $drawingBufferWidth_Getter(mthis) native "WebGLRenderingContext_drawingBufferWidth_Getter";
 
-Native_WebGLRenderingContext_activeTexture_Callback(mthis, texture) native "WebGLRenderingContext_activeTexture_Callback_RESOLVER_STRING_1_unsigned long";
+  static $activeTexture_Callback(mthis, texture) native "WebGLRenderingContext_activeTexture_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_attachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_attachShader_Callback_RESOLVER_STRING_2_WebGLProgram_WebGLShader";
+  static $attachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_attachShader_Callback_RESOLVER_STRING_2_WebGLProgram_WebGLShader";
 
-Native_WebGLRenderingContext_bindAttribLocation_Callback(mthis, program, index, name) native "WebGLRenderingContext_bindAttribLocation_Callback_RESOLVER_STRING_3_WebGLProgram_unsigned long_DOMString";
+  static $bindAttribLocation_Callback(mthis, program, index, name) native "WebGLRenderingContext_bindAttribLocation_Callback_RESOLVER_STRING_3_WebGLProgram_unsigned long_DOMString";
 
-Native_WebGLRenderingContext_bindBuffer_Callback(mthis, target, buffer) native "WebGLRenderingContext_bindBuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLBuffer";
+  static $bindBuffer_Callback(mthis, target, buffer) native "WebGLRenderingContext_bindBuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLBuffer";
 
-Native_WebGLRenderingContext_bindFramebuffer_Callback(mthis, target, framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLFramebuffer";
+  static $bindFramebuffer_Callback(mthis, target, framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLFramebuffer";
 
-Native_WebGLRenderingContext_bindRenderbuffer_Callback(mthis, target, renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLRenderbuffer";
+  static $bindRenderbuffer_Callback(mthis, target, renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLRenderbuffer";
 
-Native_WebGLRenderingContext_bindTexture_Callback(mthis, target, texture) native "WebGLRenderingContext_bindTexture_Callback_RESOLVER_STRING_2_unsigned long_WebGLTexture";
+  static $bindTexture_Callback(mthis, target, texture) native "WebGLRenderingContext_bindTexture_Callback_RESOLVER_STRING_2_unsigned long_WebGLTexture";
 
-Native_WebGLRenderingContext_blendColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_blendColor_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $blendColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_blendColor_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_WebGLRenderingContext_blendEquation_Callback(mthis, mode) native "WebGLRenderingContext_blendEquation_Callback_RESOLVER_STRING_1_unsigned long";
+  static $blendEquation_Callback(mthis, mode) native "WebGLRenderingContext_blendEquation_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_blendEquationSeparate_Callback(mthis, modeRGB, modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $blendEquationSeparate_Callback(mthis, modeRGB, modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_blendFunc_Callback(mthis, sfactor, dfactor) native "WebGLRenderingContext_blendFunc_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $blendFunc_Callback(mthis, sfactor, dfactor) native "WebGLRenderingContext_blendFunc_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_blendFuncSeparate_Callback(mthis, srcRGB, dstRGB, srcAlpha, dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_unsigned long";
+  static $blendFuncSeparate_Callback(mthis, srcRGB, dstRGB, srcAlpha, dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_bufferByteData_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBuffer_unsigned long";
+  static $bufferByteData_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBuffer_unsigned long";
 
   // Generated overload resolver
-Native_WebGLRenderingContext_bufferData(mthis, target, data_OR_size, usage) {
+  static $bufferData(mthis, target, data_OR_size, usage) {
     if ((usage is int || usage == null) && (data_OR_size is TypedData || data_OR_size == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__bufferData_1_Callback(mthis, target, data_OR_size, usage);
+      $_bufferData_1_Callback(mthis, target, data_OR_size, usage);
       return;
     }
     if ((usage is int || usage == null) && (data_OR_size is ByteBuffer || data_OR_size == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__bufferData_2_Callback(mthis, target, data_OR_size, usage);
+      $_bufferData_2_Callback(mthis, target, data_OR_size, usage);
       return;
     }
     if ((usage is int || usage == null) && (data_OR_size is int || data_OR_size == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__bufferData_3_Callback(mthis, target, data_OR_size, usage);
+      $_bufferData_3_Callback(mthis, target, data_OR_size, usage);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebGLRenderingContext__bufferData_1_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBufferView_unsigned long";
+  static $_bufferData_1_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBufferView_unsigned long";
 
-Native_WebGLRenderingContext__bufferData_2_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBuffer_unsigned long";
+  static $_bufferData_2_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBuffer_unsigned long";
 
-Native_WebGLRenderingContext__bufferData_3_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_long long_unsigned long";
+  static $_bufferData_3_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_long long_unsigned long";
 
-Native_WebGLRenderingContext_bufferDataTyped_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBufferView_unsigned long";
+  static $bufferDataTyped_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBufferView_unsigned long";
 
-Native_WebGLRenderingContext_bufferSubByteData_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBuffer";
+  static $bufferSubByteData_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBuffer";
 
   // Generated overload resolver
-Native_WebGLRenderingContext_bufferSubData(mthis, target, offset, data) {
+  static $bufferSubData(mthis, target, offset, data) {
     if ((data is TypedData || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__bufferSubData_1_Callback(mthis, target, offset, data);
+      $_bufferSubData_1_Callback(mthis, target, offset, data);
       return;
     }
     if ((data is ByteBuffer || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__bufferSubData_2_Callback(mthis, target, offset, data);
+      $_bufferSubData_2_Callback(mthis, target, offset, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebGLRenderingContext__bufferSubData_1_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBufferView";
+  static $_bufferSubData_1_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBufferView";
 
-Native_WebGLRenderingContext__bufferSubData_2_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBuffer";
+  static $_bufferSubData_2_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBuffer";
 
-Native_WebGLRenderingContext_bufferSubDataTyped_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBufferView";
+  static $bufferSubDataTyped_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBufferView";
 
-Native_WebGLRenderingContext_checkFramebufferStatus_Callback(mthis, target) native "WebGLRenderingContext_checkFramebufferStatus_Callback_RESOLVER_STRING_1_unsigned long";
+  static $checkFramebufferStatus_Callback(mthis, target) native "WebGLRenderingContext_checkFramebufferStatus_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_clear_Callback(mthis, mask) native "WebGLRenderingContext_clear_Callback_RESOLVER_STRING_1_unsigned long";
+  static $clear_Callback(mthis, mask) native "WebGLRenderingContext_clear_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_clearColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_clearColor_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $clearColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_clearColor_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_WebGLRenderingContext_clearDepth_Callback(mthis, depth) native "WebGLRenderingContext_clearDepth_Callback_RESOLVER_STRING_1_float";
+  static $clearDepth_Callback(mthis, depth) native "WebGLRenderingContext_clearDepth_Callback_RESOLVER_STRING_1_float";
 
-Native_WebGLRenderingContext_clearStencil_Callback(mthis, s) native "WebGLRenderingContext_clearStencil_Callback_RESOLVER_STRING_1_long";
+  static $clearStencil_Callback(mthis, s) native "WebGLRenderingContext_clearStencil_Callback_RESOLVER_STRING_1_long";
 
-Native_WebGLRenderingContext_colorMask_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_colorMask_Callback_RESOLVER_STRING_4_boolean_boolean_boolean_boolean";
+  static $colorMask_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_colorMask_Callback_RESOLVER_STRING_4_boolean_boolean_boolean_boolean";
 
-Native_WebGLRenderingContext_compileShader_Callback(mthis, shader) native "WebGLRenderingContext_compileShader_Callback_RESOLVER_STRING_1_WebGLShader";
+  static $compileShader_Callback(mthis, shader) native "WebGLRenderingContext_compileShader_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_compressedTexImage2D_Callback(mthis, target, level, internalformat, width, height, border, data) native "WebGLRenderingContext_compressedTexImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_unsigned long_long_long_long_ArrayBufferView";
+  static $compressedTexImage2D_Callback(mthis, target, level, internalformat, width, height, border, data) native "WebGLRenderingContext_compressedTexImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_unsigned long_long_long_long_ArrayBufferView";
 
-Native_WebGLRenderingContext_compressedTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, width, height, format, data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_long_long_long_long_unsigned long_ArrayBufferView";
+  static $compressedTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, width, height, format, data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_long_long_long_long_unsigned long_ArrayBufferView";
 
-Native_WebGLRenderingContext_copyTexImage2D_Callback(mthis, target, level, internalformat, x, y, width, height, border) native "WebGLRenderingContext_copyTexImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_unsigned long_long_long_long_long_long";
+  static $copyTexImage2D_Callback(mthis, target, level, internalformat, x, y, width, height, border) native "WebGLRenderingContext_copyTexImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_unsigned long_long_long_long_long_long";
 
-Native_WebGLRenderingContext_copyTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, x, y, width, height) native "WebGLRenderingContext_copyTexSubImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_long_long_long_long_long_long";
+  static $copyTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, x, y, width, height) native "WebGLRenderingContext_copyTexSubImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_long_long_long_long_long_long";
 
-Native_WebGLRenderingContext_createBuffer_Callback(mthis) native "WebGLRenderingContext_createBuffer_Callback_RESOLVER_STRING_0_";
+  static $createBuffer_Callback(mthis) native "WebGLRenderingContext_createBuffer_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_createFramebuffer_Callback(mthis) native "WebGLRenderingContext_createFramebuffer_Callback_RESOLVER_STRING_0_";
+  static $createFramebuffer_Callback(mthis) native "WebGLRenderingContext_createFramebuffer_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_createProgram_Callback(mthis) native "WebGLRenderingContext_createProgram_Callback_RESOLVER_STRING_0_";
+  static $createProgram_Callback(mthis) native "WebGLRenderingContext_createProgram_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_createRenderbuffer_Callback(mthis) native "WebGLRenderingContext_createRenderbuffer_Callback_RESOLVER_STRING_0_";
+  static $createRenderbuffer_Callback(mthis) native "WebGLRenderingContext_createRenderbuffer_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_createShader_Callback(mthis, type) native "WebGLRenderingContext_createShader_Callback_RESOLVER_STRING_1_unsigned long";
+  static $createShader_Callback(mthis, type) native "WebGLRenderingContext_createShader_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_createTexture_Callback(mthis) native "WebGLRenderingContext_createTexture_Callback_RESOLVER_STRING_0_";
+  static $createTexture_Callback(mthis) native "WebGLRenderingContext_createTexture_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_cullFace_Callback(mthis, mode) native "WebGLRenderingContext_cullFace_Callback_RESOLVER_STRING_1_unsigned long";
+  static $cullFace_Callback(mthis, mode) native "WebGLRenderingContext_cullFace_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_deleteBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_deleteBuffer_Callback_RESOLVER_STRING_1_WebGLBuffer";
+  static $deleteBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_deleteBuffer_Callback_RESOLVER_STRING_1_WebGLBuffer";
 
-Native_WebGLRenderingContext_deleteFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback_RESOLVER_STRING_1_WebGLFramebuffer";
+  static $deleteFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback_RESOLVER_STRING_1_WebGLFramebuffer";
 
-Native_WebGLRenderingContext_deleteProgram_Callback(mthis, program) native "WebGLRenderingContext_deleteProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
+  static $deleteProgram_Callback(mthis, program) native "WebGLRenderingContext_deleteProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_deleteRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback_RESOLVER_STRING_1_WebGLRenderbuffer";
+  static $deleteRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback_RESOLVER_STRING_1_WebGLRenderbuffer";
 
-Native_WebGLRenderingContext_deleteShader_Callback(mthis, shader) native "WebGLRenderingContext_deleteShader_Callback_RESOLVER_STRING_1_WebGLShader";
+  static $deleteShader_Callback(mthis, shader) native "WebGLRenderingContext_deleteShader_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_deleteTexture_Callback(mthis, texture) native "WebGLRenderingContext_deleteTexture_Callback_RESOLVER_STRING_1_WebGLTexture";
+  static $deleteTexture_Callback(mthis, texture) native "WebGLRenderingContext_deleteTexture_Callback_RESOLVER_STRING_1_WebGLTexture";
 
-Native_WebGLRenderingContext_depthFunc_Callback(mthis, func) native "WebGLRenderingContext_depthFunc_Callback_RESOLVER_STRING_1_unsigned long";
+  static $depthFunc_Callback(mthis, func) native "WebGLRenderingContext_depthFunc_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_depthMask_Callback(mthis, flag) native "WebGLRenderingContext_depthMask_Callback_RESOLVER_STRING_1_boolean";
+  static $depthMask_Callback(mthis, flag) native "WebGLRenderingContext_depthMask_Callback_RESOLVER_STRING_1_boolean";
 
-Native_WebGLRenderingContext_depthRange_Callback(mthis, zNear, zFar) native "WebGLRenderingContext_depthRange_Callback_RESOLVER_STRING_2_float_float";
+  static $depthRange_Callback(mthis, zNear, zFar) native "WebGLRenderingContext_depthRange_Callback_RESOLVER_STRING_2_float_float";
 
-Native_WebGLRenderingContext_detachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_detachShader_Callback_RESOLVER_STRING_2_WebGLProgram_WebGLShader";
+  static $detachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_detachShader_Callback_RESOLVER_STRING_2_WebGLProgram_WebGLShader";
 
-Native_WebGLRenderingContext_disable_Callback(mthis, cap) native "WebGLRenderingContext_disable_Callback_RESOLVER_STRING_1_unsigned long";
+  static $disable_Callback(mthis, cap) native "WebGLRenderingContext_disable_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_disableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_disableVertexAttribArray_Callback_RESOLVER_STRING_1_unsigned long";
+  static $disableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_disableVertexAttribArray_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_drawArrays_Callback(mthis, mode, first, count) native "WebGLRenderingContext_drawArrays_Callback_RESOLVER_STRING_3_unsigned long_long_long";
+  static $drawArrays_Callback(mthis, mode, first, count) native "WebGLRenderingContext_drawArrays_Callback_RESOLVER_STRING_3_unsigned long_long_long";
 
-Native_WebGLRenderingContext_drawElements_Callback(mthis, mode, count, type, offset) native "WebGLRenderingContext_drawElements_Callback_RESOLVER_STRING_4_unsigned long_long_unsigned long_long long";
+  static $drawElements_Callback(mthis, mode, count, type, offset) native "WebGLRenderingContext_drawElements_Callback_RESOLVER_STRING_4_unsigned long_long_unsigned long_long long";
 
-Native_WebGLRenderingContext_enable_Callback(mthis, cap) native "WebGLRenderingContext_enable_Callback_RESOLVER_STRING_1_unsigned long";
+  static $enable_Callback(mthis, cap) native "WebGLRenderingContext_enable_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_enableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_enableVertexAttribArray_Callback_RESOLVER_STRING_1_unsigned long";
+  static $enableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_enableVertexAttribArray_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_finish_Callback(mthis) native "WebGLRenderingContext_finish_Callback_RESOLVER_STRING_0_";
+  static $finish_Callback(mthis) native "WebGLRenderingContext_finish_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_flush_Callback(mthis) native "WebGLRenderingContext_flush_Callback_RESOLVER_STRING_0_";
+  static $flush_Callback(mthis) native "WebGLRenderingContext_flush_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_framebufferRenderbuffer_Callback(mthis, target, attachment, renderbuffertarget, renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_WebGLRenderbuffer";
+  static $framebufferRenderbuffer_Callback(mthis, target, attachment, renderbuffertarget, renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_WebGLRenderbuffer";
 
-Native_WebGLRenderingContext_framebufferTexture2D_Callback(mthis, target, attachment, textarget, texture, level) native "WebGLRenderingContext_framebufferTexture2D_Callback_RESOLVER_STRING_5_unsigned long_unsigned long_unsigned long_WebGLTexture_long";
+  static $framebufferTexture2D_Callback(mthis, target, attachment, textarget, texture, level) native "WebGLRenderingContext_framebufferTexture2D_Callback_RESOLVER_STRING_5_unsigned long_unsigned long_unsigned long_WebGLTexture_long";
 
-Native_WebGLRenderingContext_frontFace_Callback(mthis, mode) native "WebGLRenderingContext_frontFace_Callback_RESOLVER_STRING_1_unsigned long";
+  static $frontFace_Callback(mthis, mode) native "WebGLRenderingContext_frontFace_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_generateMipmap_Callback(mthis, target) native "WebGLRenderingContext_generateMipmap_Callback_RESOLVER_STRING_1_unsigned long";
+  static $generateMipmap_Callback(mthis, target) native "WebGLRenderingContext_generateMipmap_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_getActiveAttrib_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveAttrib_Callback_RESOLVER_STRING_2_WebGLProgram_unsigned long";
+  static $getActiveAttrib_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveAttrib_Callback_RESOLVER_STRING_2_WebGLProgram_unsigned long";
 
-Native_WebGLRenderingContext_getActiveUniform_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveUniform_Callback_RESOLVER_STRING_2_WebGLProgram_unsigned long";
+  static $getActiveUniform_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveUniform_Callback_RESOLVER_STRING_2_WebGLProgram_unsigned long";
 
-Native_WebGLRenderingContext_getAttachedShaders_Callback(mthis, program) native "WebGLRenderingContext_getAttachedShaders_Callback";
+  static $getAttachedShaders_Callback(mthis, program) native "WebGLRenderingContext_getAttachedShaders_Callback";
 
-Native_WebGLRenderingContext_getAttribLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getAttribLocation_Callback_RESOLVER_STRING_2_WebGLProgram_DOMString";
+  static $getAttribLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getAttribLocation_Callback_RESOLVER_STRING_2_WebGLProgram_DOMString";
 
-Native_WebGLRenderingContext_getBufferParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getBufferParameter_Callback";
+  static $getBufferParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getBufferParameter_Callback";
 
-Native_WebGLRenderingContext_getContextAttributes_Callback(mthis) native "WebGLRenderingContext_getContextAttributes_Callback_RESOLVER_STRING_0_";
+  static $getContextAttributes_Callback(mthis) native "WebGLRenderingContext_getContextAttributes_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_getError_Callback(mthis) native "WebGLRenderingContext_getError_Callback_RESOLVER_STRING_0_";
+  static $getError_Callback(mthis) native "WebGLRenderingContext_getError_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_getExtension_Callback(mthis, name) native "WebGLRenderingContext_getExtension_Callback";
+  static $getExtension_Callback(mthis, name) native "WebGLRenderingContext_getExtension_Callback";
 
-Native_WebGLRenderingContext_getFramebufferAttachmentParameter_Callback(mthis, target, attachment, pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
+  static $getFramebufferAttachmentParameter_Callback(mthis, target, attachment, pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
 
-Native_WebGLRenderingContext_getParameter_Callback(mthis, pname) native "WebGLRenderingContext_getParameter_Callback";
+  static $getParameter_Callback(mthis, pname) native "WebGLRenderingContext_getParameter_Callback";
 
-Native_WebGLRenderingContext_getProgramInfoLog_Callback(mthis, program) native "WebGLRenderingContext_getProgramInfoLog_Callback_RESOLVER_STRING_1_WebGLProgram";
+  static $getProgramInfoLog_Callback(mthis, program) native "WebGLRenderingContext_getProgramInfoLog_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_getProgramParameter_Callback(mthis, program, pname) native "WebGLRenderingContext_getProgramParameter_Callback";
+  static $getProgramParameter_Callback(mthis, program, pname) native "WebGLRenderingContext_getProgramParameter_Callback";
 
-Native_WebGLRenderingContext_getRenderbufferParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
+  static $getRenderbufferParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
 
-Native_WebGLRenderingContext_getShaderInfoLog_Callback(mthis, shader) native "WebGLRenderingContext_getShaderInfoLog_Callback_RESOLVER_STRING_1_WebGLShader";
+  static $getShaderInfoLog_Callback(mthis, shader) native "WebGLRenderingContext_getShaderInfoLog_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_getShaderParameter_Callback(mthis, shader, pname) native "WebGLRenderingContext_getShaderParameter_Callback";
+  static $getShaderParameter_Callback(mthis, shader, pname) native "WebGLRenderingContext_getShaderParameter_Callback";
 
-Native_WebGLRenderingContext_getShaderPrecisionFormat_Callback(mthis, shadertype, precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $getShaderPrecisionFormat_Callback(mthis, shadertype, precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_getShaderSource_Callback(mthis, shader) native "WebGLRenderingContext_getShaderSource_Callback_RESOLVER_STRING_1_WebGLShader";
+  static $getShaderSource_Callback(mthis, shader) native "WebGLRenderingContext_getShaderSource_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_getSupportedExtensions_Callback(mthis) native "WebGLRenderingContext_getSupportedExtensions_Callback";
+  static $getSupportedExtensions_Callback(mthis) native "WebGLRenderingContext_getSupportedExtensions_Callback";
 
-Native_WebGLRenderingContext_getTexParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getTexParameter_Callback";
+  static $getTexParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getTexParameter_Callback";
 
-Native_WebGLRenderingContext_getUniform_Callback(mthis, program, location) native "WebGLRenderingContext_getUniform_Callback";
+  static $getUniform_Callback(mthis, program, location) native "WebGLRenderingContext_getUniform_Callback";
 
-Native_WebGLRenderingContext_getUniformLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getUniformLocation_Callback_RESOLVER_STRING_2_WebGLProgram_DOMString";
+  static $getUniformLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getUniformLocation_Callback_RESOLVER_STRING_2_WebGLProgram_DOMString";
 
-Native_WebGLRenderingContext_getVertexAttrib_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttrib_Callback";
+  static $getVertexAttrib_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttrib_Callback";
 
-Native_WebGLRenderingContext_getVertexAttribOffset_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $getVertexAttribOffset_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_hint_Callback(mthis, target, mode) native "WebGLRenderingContext_hint_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $hint_Callback(mthis, target, mode) native "WebGLRenderingContext_hint_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_isBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_isBuffer_Callback_RESOLVER_STRING_1_WebGLBuffer";
+  static $isBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_isBuffer_Callback_RESOLVER_STRING_1_WebGLBuffer";
 
-Native_WebGLRenderingContext_isContextLost_Callback(mthis) native "WebGLRenderingContext_isContextLost_Callback_RESOLVER_STRING_0_";
+  static $isContextLost_Callback(mthis) native "WebGLRenderingContext_isContextLost_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_isEnabled_Callback(mthis, cap) native "WebGLRenderingContext_isEnabled_Callback_RESOLVER_STRING_1_unsigned long";
+  static $isEnabled_Callback(mthis, cap) native "WebGLRenderingContext_isEnabled_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_isFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback_RESOLVER_STRING_1_WebGLFramebuffer";
+  static $isFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback_RESOLVER_STRING_1_WebGLFramebuffer";
 
-Native_WebGLRenderingContext_isProgram_Callback(mthis, program) native "WebGLRenderingContext_isProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
+  static $isProgram_Callback(mthis, program) native "WebGLRenderingContext_isProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_isRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback_RESOLVER_STRING_1_WebGLRenderbuffer";
+  static $isRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback_RESOLVER_STRING_1_WebGLRenderbuffer";
 
-Native_WebGLRenderingContext_isShader_Callback(mthis, shader) native "WebGLRenderingContext_isShader_Callback_RESOLVER_STRING_1_WebGLShader";
+  static $isShader_Callback(mthis, shader) native "WebGLRenderingContext_isShader_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_isTexture_Callback(mthis, texture) native "WebGLRenderingContext_isTexture_Callback_RESOLVER_STRING_1_WebGLTexture";
+  static $isTexture_Callback(mthis, texture) native "WebGLRenderingContext_isTexture_Callback_RESOLVER_STRING_1_WebGLTexture";
 
-Native_WebGLRenderingContext_lineWidth_Callback(mthis, width) native "WebGLRenderingContext_lineWidth_Callback_RESOLVER_STRING_1_float";
+  static $lineWidth_Callback(mthis, width) native "WebGLRenderingContext_lineWidth_Callback_RESOLVER_STRING_1_float";
 
-Native_WebGLRenderingContext_linkProgram_Callback(mthis, program) native "WebGLRenderingContext_linkProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
+  static $linkProgram_Callback(mthis, program) native "WebGLRenderingContext_linkProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_pixelStorei_Callback(mthis, pname, param) native "WebGLRenderingContext_pixelStorei_Callback_RESOLVER_STRING_2_unsigned long_long";
+  static $pixelStorei_Callback(mthis, pname, param) native "WebGLRenderingContext_pixelStorei_Callback_RESOLVER_STRING_2_unsigned long_long";
 
-Native_WebGLRenderingContext_polygonOffset_Callback(mthis, factor, units) native "WebGLRenderingContext_polygonOffset_Callback_RESOLVER_STRING_2_float_float";
+  static $polygonOffset_Callback(mthis, factor, units) native "WebGLRenderingContext_polygonOffset_Callback_RESOLVER_STRING_2_float_float";
 
-Native_WebGLRenderingContext_readPixels_Callback(mthis, x, y, width, height, format, type, pixels) native "WebGLRenderingContext_readPixels_Callback_RESOLVER_STRING_7_long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
+  static $readPixels_Callback(mthis, x, y, width, height, format, type, pixels) native "WebGLRenderingContext_readPixels_Callback_RESOLVER_STRING_7_long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
 
-Native_WebGLRenderingContext_renderbufferStorage_Callback(mthis, target, internalformat, width, height) native "WebGLRenderingContext_renderbufferStorage_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_long_long";
+  static $renderbufferStorage_Callback(mthis, target, internalformat, width, height) native "WebGLRenderingContext_renderbufferStorage_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_long_long";
 
-Native_WebGLRenderingContext_sampleCoverage_Callback(mthis, value, invert) native "WebGLRenderingContext_sampleCoverage_Callback_RESOLVER_STRING_2_float_boolean";
+  static $sampleCoverage_Callback(mthis, value, invert) native "WebGLRenderingContext_sampleCoverage_Callback_RESOLVER_STRING_2_float_boolean";
 
-Native_WebGLRenderingContext_scissor_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_scissor_Callback_RESOLVER_STRING_4_long_long_long_long";
+  static $scissor_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_scissor_Callback_RESOLVER_STRING_4_long_long_long_long";
 
-Native_WebGLRenderingContext_shaderSource_Callback(mthis, shader, string) native "WebGLRenderingContext_shaderSource_Callback_RESOLVER_STRING_2_WebGLShader_DOMString";
+  static $shaderSource_Callback(mthis, shader, string) native "WebGLRenderingContext_shaderSource_Callback_RESOLVER_STRING_2_WebGLShader_DOMString";
 
-Native_WebGLRenderingContext_stencilFunc_Callback(mthis, func, ref, mask) native "WebGLRenderingContext_stencilFunc_Callback_RESOLVER_STRING_3_unsigned long_long_unsigned long";
+  static $stencilFunc_Callback(mthis, func, ref, mask) native "WebGLRenderingContext_stencilFunc_Callback_RESOLVER_STRING_3_unsigned long_long_unsigned long";
 
-Native_WebGLRenderingContext_stencilFuncSeparate_Callback(mthis, face, func, ref, mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_long_unsigned long";
+  static $stencilFuncSeparate_Callback(mthis, face, func, ref, mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_long_unsigned long";
 
-Native_WebGLRenderingContext_stencilMask_Callback(mthis, mask) native "WebGLRenderingContext_stencilMask_Callback_RESOLVER_STRING_1_unsigned long";
+  static $stencilMask_Callback(mthis, mask) native "WebGLRenderingContext_stencilMask_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_stencilMaskSeparate_Callback(mthis, face, mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $stencilMaskSeparate_Callback(mthis, face, mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_stencilOp_Callback(mthis, fail, zfail, zpass) native "WebGLRenderingContext_stencilOp_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_unsigned long";
+  static $stencilOp_Callback(mthis, fail, zfail, zpass) native "WebGLRenderingContext_stencilOp_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_stencilOpSeparate_Callback(mthis, face, fail, zfail, zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_unsigned long";
+  static $stencilOpSeparate_Callback(mthis, face, fail, zfail, zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_unsigned long";
 
   // Generated overload resolver
-Native_WebGLRenderingContext_texImage2D(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
+  static $texImage2D(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
     if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (format is int || format == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
+      $_texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      $_texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      $_texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      $_texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      $_texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebGLRenderingContext__texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_9_unsigned long_long_unsigned long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
+  static $_texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_9_unsigned long_long_unsigned long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
 
-Native_WebGLRenderingContext__texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_ImageData";
+  static $_texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_ImageData";
 
-Native_WebGLRenderingContext__texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLImageElement";
+  static $_texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLImageElement";
 
-Native_WebGLRenderingContext__texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLCanvasElement";
+  static $_texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLCanvasElement";
 
-Native_WebGLRenderingContext__texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLVideoElement";
+  static $_texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLVideoElement";
 
-Native_WebGLRenderingContext_texImage2DCanvas_Callback(mthis, target, level, internalformat, format, type, canvas) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLCanvasElement";
+  static $texImage2DCanvas_Callback(mthis, target, level, internalformat, format, type, canvas) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLCanvasElement";
 
-Native_WebGLRenderingContext_texImage2DImage_Callback(mthis, target, level, internalformat, format, type, image) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLImageElement";
+  static $texImage2DImage_Callback(mthis, target, level, internalformat, format, type, image) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLImageElement";
 
-Native_WebGLRenderingContext_texImage2DImageData_Callback(mthis, target, level, internalformat, format, type, pixels) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_ImageData";
+  static $texImage2DImageData_Callback(mthis, target, level, internalformat, format, type, pixels) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_ImageData";
 
-Native_WebGLRenderingContext_texImage2DVideo_Callback(mthis, target, level, internalformat, format, type, video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLVideoElement";
+  static $texImage2DVideo_Callback(mthis, target, level, internalformat, format, type, video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLVideoElement";
 
-Native_WebGLRenderingContext_texParameterf_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameterf_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
+  static $texParameterf_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameterf_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
 
-Native_WebGLRenderingContext_texParameteri_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameteri_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_long";
+  static $texParameteri_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameteri_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_long";
 
   // Generated overload resolver
-Native_WebGLRenderingContext_texSubImage2D(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
+  static $texSubImage2D(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
     if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
+      $_texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      $_texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      $_texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      $_texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      $_texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebGLRenderingContext__texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_9_unsigned long_long_long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
+  static $_texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_9_unsigned long_long_long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
 
-Native_WebGLRenderingContext__texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_ImageData";
+  static $_texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_ImageData";
 
-Native_WebGLRenderingContext__texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLImageElement";
+  static $_texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLImageElement";
 
-Native_WebGLRenderingContext__texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLCanvasElement";
+  static $_texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLCanvasElement";
 
-Native_WebGLRenderingContext__texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLVideoElement";
+  static $_texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLVideoElement";
 
-Native_WebGLRenderingContext_texSubImage2DCanvas_Callback(mthis, target, level, xoffset, yoffset, format, type, canvas) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLCanvasElement";
+  static $texSubImage2DCanvas_Callback(mthis, target, level, xoffset, yoffset, format, type, canvas) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLCanvasElement";
 
-Native_WebGLRenderingContext_texSubImage2DImage_Callback(mthis, target, level, xoffset, yoffset, format, type, image) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLImageElement";
+  static $texSubImage2DImage_Callback(mthis, target, level, xoffset, yoffset, format, type, image) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLImageElement";
 
-Native_WebGLRenderingContext_texSubImage2DImageData_Callback(mthis, target, level, xoffset, yoffset, format, type, pixels) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_ImageData";
+  static $texSubImage2DImageData_Callback(mthis, target, level, xoffset, yoffset, format, type, pixels) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_ImageData";
 
-Native_WebGLRenderingContext_texSubImage2DVideo_Callback(mthis, target, level, xoffset, yoffset, format, type, video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLVideoElement";
+  static $texSubImage2DVideo_Callback(mthis, target, level, xoffset, yoffset, format, type, video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLVideoElement";
 
-Native_WebGLRenderingContext_uniform1f_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1f_Callback_RESOLVER_STRING_2_WebGLUniformLocation_float";
+  static $uniform1f_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1f_Callback_RESOLVER_STRING_2_WebGLUniformLocation_float";
 
-Native_WebGLRenderingContext_uniform1fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform1fv_Callback";
+  static $uniform1fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform1fv_Callback";
 
-Native_WebGLRenderingContext_uniform1i_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1i_Callback_RESOLVER_STRING_2_WebGLUniformLocation_long";
+  static $uniform1i_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1i_Callback_RESOLVER_STRING_2_WebGLUniformLocation_long";
 
-Native_WebGLRenderingContext_uniform1iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform1iv_Callback";
+  static $uniform1iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform1iv_Callback";
 
-Native_WebGLRenderingContext_uniform2f_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2f_Callback_RESOLVER_STRING_3_WebGLUniformLocation_float_float";
+  static $uniform2f_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2f_Callback_RESOLVER_STRING_3_WebGLUniformLocation_float_float";
 
-Native_WebGLRenderingContext_uniform2fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform2fv_Callback";
+  static $uniform2fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform2fv_Callback";
 
-Native_WebGLRenderingContext_uniform2i_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2i_Callback_RESOLVER_STRING_3_WebGLUniformLocation_long_long";
+  static $uniform2i_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2i_Callback_RESOLVER_STRING_3_WebGLUniformLocation_long_long";
 
-Native_WebGLRenderingContext_uniform2iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform2iv_Callback";
+  static $uniform2iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform2iv_Callback";
 
-Native_WebGLRenderingContext_uniform3f_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3f_Callback_RESOLVER_STRING_4_WebGLUniformLocation_float_float_float";
+  static $uniform3f_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3f_Callback_RESOLVER_STRING_4_WebGLUniformLocation_float_float_float";
 
-Native_WebGLRenderingContext_uniform3fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform3fv_Callback";
+  static $uniform3fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform3fv_Callback";
 
-Native_WebGLRenderingContext_uniform3i_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3i_Callback_RESOLVER_STRING_4_WebGLUniformLocation_long_long_long";
+  static $uniform3i_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3i_Callback_RESOLVER_STRING_4_WebGLUniformLocation_long_long_long";
 
-Native_WebGLRenderingContext_uniform3iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform3iv_Callback";
+  static $uniform3iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform3iv_Callback";
 
-Native_WebGLRenderingContext_uniform4f_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4f_Callback_RESOLVER_STRING_5_WebGLUniformLocation_float_float_float_float";
+  static $uniform4f_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4f_Callback_RESOLVER_STRING_5_WebGLUniformLocation_float_float_float_float";
 
-Native_WebGLRenderingContext_uniform4fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform4fv_Callback";
+  static $uniform4fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform4fv_Callback";
 
-Native_WebGLRenderingContext_uniform4i_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4i_Callback_RESOLVER_STRING_5_WebGLUniformLocation_long_long_long_long";
+  static $uniform4i_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4i_Callback_RESOLVER_STRING_5_WebGLUniformLocation_long_long_long_long";
 
-Native_WebGLRenderingContext_uniform4iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform4iv_Callback";
+  static $uniform4iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform4iv_Callback";
 
-Native_WebGLRenderingContext_uniformMatrix2fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
+  static $uniformMatrix2fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
 
-Native_WebGLRenderingContext_uniformMatrix3fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
+  static $uniformMatrix3fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
 
-Native_WebGLRenderingContext_uniformMatrix4fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
+  static $uniformMatrix4fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
 
-Native_WebGLRenderingContext_useProgram_Callback(mthis, program) native "WebGLRenderingContext_useProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
+  static $useProgram_Callback(mthis, program) native "WebGLRenderingContext_useProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_validateProgram_Callback(mthis, program) native "WebGLRenderingContext_validateProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
+  static $validateProgram_Callback(mthis, program) native "WebGLRenderingContext_validateProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_vertexAttrib1f_Callback(mthis, indx, x) native "WebGLRenderingContext_vertexAttrib1f_Callback_RESOLVER_STRING_2_unsigned long_float";
+  static $vertexAttrib1f_Callback(mthis, indx, x) native "WebGLRenderingContext_vertexAttrib1f_Callback_RESOLVER_STRING_2_unsigned long_float";
 
-Native_WebGLRenderingContext_vertexAttrib1fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
+  static $vertexAttrib1fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
 
-Native_WebGLRenderingContext_vertexAttrib2f_Callback(mthis, indx, x, y) native "WebGLRenderingContext_vertexAttrib2f_Callback_RESOLVER_STRING_3_unsigned long_float_float";
+  static $vertexAttrib2f_Callback(mthis, indx, x, y) native "WebGLRenderingContext_vertexAttrib2f_Callback_RESOLVER_STRING_3_unsigned long_float_float";
 
-Native_WebGLRenderingContext_vertexAttrib2fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
+  static $vertexAttrib2fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
 
-Native_WebGLRenderingContext_vertexAttrib3f_Callback(mthis, indx, x, y, z) native "WebGLRenderingContext_vertexAttrib3f_Callback_RESOLVER_STRING_4_unsigned long_float_float_float";
+  static $vertexAttrib3f_Callback(mthis, indx, x, y, z) native "WebGLRenderingContext_vertexAttrib3f_Callback_RESOLVER_STRING_4_unsigned long_float_float_float";
 
-Native_WebGLRenderingContext_vertexAttrib3fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
+  static $vertexAttrib3fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
 
-Native_WebGLRenderingContext_vertexAttrib4f_Callback(mthis, indx, x, y, z, w) native "WebGLRenderingContext_vertexAttrib4f_Callback_RESOLVER_STRING_5_unsigned long_float_float_float_float";
+  static $vertexAttrib4f_Callback(mthis, indx, x, y, z, w) native "WebGLRenderingContext_vertexAttrib4f_Callback_RESOLVER_STRING_5_unsigned long_float_float_float_float";
 
-Native_WebGLRenderingContext_vertexAttrib4fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
+  static $vertexAttrib4fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
 
-Native_WebGLRenderingContext_vertexAttribPointer_Callback(mthis, indx, size, type, normalized, stride, offset) native "WebGLRenderingContext_vertexAttribPointer_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_boolean_long_long long";
+  static $vertexAttribPointer_Callback(mthis, indx, size, type, normalized, stride, offset) native "WebGLRenderingContext_vertexAttribPointer_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_boolean_long_long long";
 
-Native_WebGLRenderingContext_viewport_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_viewport_Callback_RESOLVER_STRING_4_long_long_long_long";
+  static $viewport_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_viewport_Callback_RESOLVER_STRING_4_long_long_long_long";
+}
 
-Native_WebGLShaderPrecisionFormat_precision_Getter(mthis) native "WebGLShaderPrecisionFormat_precision_Getter";
+class BlinkWebGLShader {}
 
-Native_WebGLShaderPrecisionFormat_rangeMax_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMax_Getter";
+class BlinkWebGLShaderPrecisionFormat {
+  static $precision_Getter(mthis) native "WebGLShaderPrecisionFormat_precision_Getter";
 
-Native_WebGLShaderPrecisionFormat_rangeMin_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMin_Getter";
+  static $rangeMax_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMax_Getter";
 
-Native_WebKitAnimationEvent_animationName_Getter(mthis) native "WebKitAnimationEvent_animationName_Getter";
+  static $rangeMin_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMin_Getter";
+}
 
-Native_WebKitAnimationEvent_elapsedTime_Getter(mthis) native "WebKitAnimationEvent_elapsedTime_Getter";
+class BlinkWebGLTexture {}
 
-Native_WebKitCSSFilterRule_style_Getter(mthis) native "WebKitCSSFilterRule_style_Getter";
+class BlinkWebGLUniformLocation {}
 
+class BlinkWebGLVertexArrayObjectOES {}
+
+class BlinkWebKitAnimationEvent {
+  static $animationName_Getter(mthis) native "WebKitAnimationEvent_animationName_Getter";
+
+  static $elapsedTime_Getter(mthis) native "WebKitAnimationEvent_elapsedTime_Getter";
+}
+
+class BlinkWebKitCSSFilterRule {
+  static $style_Getter(mthis) native "WebKitCSSFilterRule_style_Getter";
+}
+
+class BlinkWebKitCSSFilterValue {}
+
+class BlinkWebKitCSSMatrix {
   // Generated overload resolver
-Native_WebKitCSSMatrix__WebKitCSSMatrix(cssValue) {
-    return Native_WebKitCSSMatrix__create_1constructorCallback(cssValue);
+  static $mk_WebKitCSSMatrix(cssValue) {
+    return $_create_1constructorCallback(cssValue);
   }
 
-Native_WebKitCSSMatrix__create_1constructorCallback(cssValue) native "WebKitCSSMatrix_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(cssValue) native "WebKitCSSMatrix_constructorCallback_RESOLVER_STRING_1_DOMString";
+}
 
+class BlinkWebKitCSSTransformValue {}
+
+class BlinkWebKitMediaSource {
   // Generated overload resolver
-Native_WebKitMediaSource__WebKitMediaSource() {
-    return Native_WebKitMediaSource__create_1constructorCallback();
+  static $mk_WebKitMediaSource() {
+    return $_create_1constructorCallback();
   }
 
-Native_WebKitMediaSource__create_1constructorCallback() native "WebKitMediaSource_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "WebKitMediaSource_constructorCallback_RESOLVER_STRING_0_";
+}
 
-Native_WebKitPoint_constructorCallback(x, y) native "WebKitPoint_constructorCallback";
+class BlinkWebKitNotification {}
 
-Native_WebKitPoint_x_Getter(mthis) native "WebKitPoint_x_Getter";
+class BlinkWebKitPoint {
+  static $constructorCallback(x, y) native "WebKitPoint_constructorCallback";
 
-Native_WebKitPoint_x_Setter(mthis, value) native "WebKitPoint_x_Setter";
+  static $x_Getter(mthis) native "WebKitPoint_x_Getter";
 
-Native_WebKitPoint_y_Getter(mthis) native "WebKitPoint_y_Getter";
+  static $x_Setter(mthis, value) native "WebKitPoint_x_Setter";
 
-Native_WebKitPoint_y_Setter(mthis, value) native "WebKitPoint_y_Setter";
+  static $y_Getter(mthis) native "WebKitPoint_y_Getter";
 
-Native_WebKitSourceBufferList_item_Callback(mthis, index) native "WebKitSourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $y_Setter(mthis, value) native "WebKitPoint_y_Setter";
+}
 
+class BlinkWebKitSourceBuffer {}
+
+class BlinkWebKitSourceBufferList {
+  static $item_Callback(mthis, index) native "WebKitSourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
+
+class BlinkWebSocket {
   // Generated overload resolver
-Native_WebSocket_WebSocket(url, protocol_OR_protocols) {
+  static $mkWebSocket(url, protocol_OR_protocols) {
     if ((url is String || url == null) && protocol_OR_protocols == null) {
-      return Native_WebSocket__create_1constructorCallback(url);
+      return $_create_1constructorCallback(url);
     }
     if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
-      return Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols);
+      return $_create_2constructorCallback(url, protocol_OR_protocols);
     }
     if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
-      return Native_WebSocket__create_3constructorCallback(url, protocol_OR_protocols);
+      return $_create_3constructorCallback(url, protocol_OR_protocols);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebSocket__create_1constructorCallback(url) native "WebSocket_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(url) native "WebSocket_constructorCallback_RESOLVER_STRING_1_DOMString";
 
-Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols) native "WebSocket_constructorCallback_RESOLVER_STRING_2_DOMString_sequence<DOMString>";
+  static $_create_2constructorCallback(url, protocol_OR_protocols) native "WebSocket_constructorCallback_RESOLVER_STRING_2_DOMString_sequence<DOMString>";
 
-Native_WebSocket__create_3constructorCallback(url, protocol_OR_protocols) native "WebSocket_constructorCallback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $_create_3constructorCallback(url, protocol_OR_protocols) native "WebSocket_constructorCallback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_WebSocket_binaryType_Getter(mthis) native "WebSocket_binaryType_Getter";
+  static $binaryType_Getter(mthis) native "WebSocket_binaryType_Getter";
 
-Native_WebSocket_binaryType_Setter(mthis, value) native "WebSocket_binaryType_Setter";
+  static $binaryType_Setter(mthis, value) native "WebSocket_binaryType_Setter";
 
-Native_WebSocket_bufferedAmount_Getter(mthis) native "WebSocket_bufferedAmount_Getter";
+  static $bufferedAmount_Getter(mthis) native "WebSocket_bufferedAmount_Getter";
 
-Native_WebSocket_extensions_Getter(mthis) native "WebSocket_extensions_Getter";
+  static $extensions_Getter(mthis) native "WebSocket_extensions_Getter";
 
-Native_WebSocket_protocol_Getter(mthis) native "WebSocket_protocol_Getter";
+  static $protocol_Getter(mthis) native "WebSocket_protocol_Getter";
 
-Native_WebSocket_readyState_Getter(mthis) native "WebSocket_readyState_Getter";
+  static $readyState_Getter(mthis) native "WebSocket_readyState_Getter";
 
-Native_WebSocket_url_Getter(mthis) native "WebSocket_url_Getter";
+  static $url_Getter(mthis) native "WebSocket_url_Getter";
 
   // Generated overload resolver
-Native_WebSocket_close(mthis, code, reason) {
+  static $close(mthis, code, reason) {
     if (reason != null) {
-      Native_WebSocket__close_1_Callback(mthis, code, reason);
+      $_close_1_Callback(mthis, code, reason);
       return;
     }
     if (code != null) {
-      Native_WebSocket__close_2_Callback(mthis, code);
+      $_close_2_Callback(mthis, code);
       return;
     }
-    Native_WebSocket__close_3_Callback(mthis);
+    $_close_3_Callback(mthis);
     return;
   }
 
-Native_WebSocket__close_1_Callback(mthis, code, reason) native "WebSocket_close_Callback_RESOLVER_STRING_2_unsigned short_DOMString";
+  static $_close_1_Callback(mthis, code, reason) native "WebSocket_close_Callback_RESOLVER_STRING_2_unsigned short_DOMString";
 
-Native_WebSocket__close_2_Callback(mthis, code) native "WebSocket_close_Callback_RESOLVER_STRING_1_unsigned short";
+  static $_close_2_Callback(mthis, code) native "WebSocket_close_Callback_RESOLVER_STRING_1_unsigned short";
 
-Native_WebSocket__close_3_Callback(mthis) native "WebSocket_close_Callback_RESOLVER_STRING_0_";
+  static $_close_3_Callback(mthis) native "WebSocket_close_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_WebSocket_send(mthis, data) {
+  static $send(mthis, data) {
     if ((data is TypedData || data == null)) {
-      Native_WebSocket__send_1_Callback(mthis, data);
+      $_send_1_Callback(mthis, data);
       return;
     }
     if ((data is ByteBuffer || data == null)) {
-      Native_WebSocket__send_2_Callback(mthis, data);
+      $_send_2_Callback(mthis, data);
       return;
     }
     if ((data is Blob || data == null)) {
-      Native_WebSocket__send_3_Callback(mthis, data);
+      $_send_3_Callback(mthis, data);
       return;
     }
     if ((data is String || data == null)) {
-      Native_WebSocket__send_4_Callback(mthis, data);
+      $_send_4_Callback(mthis, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebSocket__send_1_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
+  static $_send_1_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
 
-Native_WebSocket__send_2_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
+  static $_send_2_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
-Native_WebSocket__send_3_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_Blob";
+  static $_send_3_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_Blob";
 
-Native_WebSocket__send_4_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_DOMString";
+  static $_send_4_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WebSocket_sendBlob_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_Blob";
+  static $sendBlob_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_Blob";
 
-Native_WebSocket_sendByteBuffer_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
+  static $sendByteBuffer_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
-Native_WebSocket_sendString_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_DOMString";
+  static $sendString_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WebSocket_sendTypedData_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
+  static $sendTypedData_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
+}
 
-Native_WheelEvent_deltaMode_Getter(mthis) native "WheelEvent_deltaMode_Getter";
+class BlinkWheelEvent {
+  static $deltaMode_Getter(mthis) native "WheelEvent_deltaMode_Getter";
 
-Native_WheelEvent_deltaX_Getter(mthis) native "WheelEvent_deltaX_Getter";
+  static $deltaX_Getter(mthis) native "WheelEvent_deltaX_Getter";
 
-Native_WheelEvent_deltaY_Getter(mthis) native "WheelEvent_deltaY_Getter";
+  static $deltaY_Getter(mthis) native "WheelEvent_deltaY_Getter";
 
-Native_WheelEvent_deltaZ_Getter(mthis) native "WheelEvent_deltaZ_Getter";
+  static $deltaZ_Getter(mthis) native "WheelEvent_deltaZ_Getter";
 
-Native_WheelEvent_webkitDirectionInvertedFromDevice_Getter(mthis) native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";
+  static $webkitDirectionInvertedFromDevice_Getter(mthis) native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";
 
-Native_WheelEvent_wheelDeltaX_Getter(mthis) native "WheelEvent_wheelDeltaX_Getter";
+  static $wheelDeltaX_Getter(mthis) native "WheelEvent_wheelDeltaX_Getter";
 
-Native_WheelEvent_wheelDeltaY_Getter(mthis) native "WheelEvent_wheelDeltaY_Getter";
+  static $wheelDeltaY_Getter(mthis) native "WheelEvent_wheelDeltaY_Getter";
 
-Native_WheelEvent_initWebKitWheelEvent_Callback(mthis, wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "WheelEvent_initWebKitWheelEvent_Callback_RESOLVER_STRING_11_long_long_Window_long_long_long_long_boolean_boolean_boolean_boolean";
+  static $initWebKitWheelEvent_Callback(mthis, wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "WheelEvent_initWebKitWheelEvent_Callback_RESOLVER_STRING_11_long_long_Window_long_long_long_long_boolean_boolean_boolean_boolean";
+}
 
-Native_Window_CSS_Getter(mthis) native "Window_CSS_Getter";
+class BlinkWindow {
+  static $CSS_Getter(mthis) native "Window_CSS_Getter";
 
-Native_Window_applicationCache_Getter(mthis) native "Window_applicationCache_Getter";
+  static $applicationCache_Getter(mthis) native "Window_applicationCache_Getter";
 
-Native_Window_closed_Getter(mthis) native "Window_closed_Getter";
+  static $closed_Getter(mthis) native "Window_closed_Getter";
 
-Native_Window_console_Getter(mthis) native "Window_console_Getter";
+  static $console_Getter(mthis) native "Window_console_Getter";
 
-Native_Window_crypto_Getter(mthis) native "Window_crypto_Getter";
+  static $crypto_Getter(mthis) native "Window_crypto_Getter";
 
-Native_Window_defaultStatus_Getter(mthis) native "Window_defaultStatus_Getter";
+  static $defaultStatus_Getter(mthis) native "Window_defaultStatus_Getter";
 
-Native_Window_defaultStatus_Setter(mthis, value) native "Window_defaultStatus_Setter";
+  static $defaultStatus_Setter(mthis, value) native "Window_defaultStatus_Setter";
 
-Native_Window_defaultstatus_Getter(mthis) native "Window_defaultstatus_Getter";
+  static $defaultstatus_Getter(mthis) native "Window_defaultstatus_Getter";
 
-Native_Window_defaultstatus_Setter(mthis, value) native "Window_defaultstatus_Setter";
+  static $defaultstatus_Setter(mthis, value) native "Window_defaultstatus_Setter";
 
-Native_Window_devicePixelRatio_Getter(mthis) native "Window_devicePixelRatio_Getter";
+  static $devicePixelRatio_Getter(mthis) native "Window_devicePixelRatio_Getter";
 
-Native_Window_document_Getter(mthis) native "Window_document_Getter";
+  static $document_Getter(mthis) native "Window_document_Getter";
 
-Native_Window_history_Getter(mthis) native "Window_history_Getter";
+  static $history_Getter(mthis) native "Window_history_Getter";
 
-Native_Window_indexedDB_Getter(mthis) native "Window_indexedDB_Getter";
+  static $indexedDB_Getter(mthis) native "Window_indexedDB_Getter";
 
-Native_Window_innerHeight_Getter(mthis) native "Window_innerHeight_Getter";
+  static $innerHeight_Getter(mthis) native "Window_innerHeight_Getter";
 
-Native_Window_innerWidth_Getter(mthis) native "Window_innerWidth_Getter";
+  static $innerWidth_Getter(mthis) native "Window_innerWidth_Getter";
 
-Native_Window_localStorage_Getter(mthis) native "Window_localStorage_Getter";
+  static $localStorage_Getter(mthis) native "Window_localStorage_Getter";
 
-Native_Window_location_Getter(mthis) native "Window_location_Getter";
+  static $location_Getter(mthis) native "Window_location_Getter";
 
-Native_Window_locationbar_Getter(mthis) native "Window_locationbar_Getter";
+  static $locationbar_Getter(mthis) native "Window_locationbar_Getter";
 
-Native_Window_menubar_Getter(mthis) native "Window_menubar_Getter";
+  static $menubar_Getter(mthis) native "Window_menubar_Getter";
 
-Native_Window_name_Getter(mthis) native "Window_name_Getter";
+  static $name_Getter(mthis) native "Window_name_Getter";
 
-Native_Window_name_Setter(mthis, value) native "Window_name_Setter";
+  static $name_Setter(mthis, value) native "Window_name_Setter";
 
-Native_Window_navigator_Getter(mthis) native "Window_navigator_Getter";
+  static $navigator_Getter(mthis) native "Window_navigator_Getter";
 
-Native_Window_offscreenBuffering_Getter(mthis) native "Window_offscreenBuffering_Getter";
+  static $offscreenBuffering_Getter(mthis) native "Window_offscreenBuffering_Getter";
 
-Native_Window_opener_Getter(mthis) native "Window_opener_Getter";
+  static $opener_Getter(mthis) native "Window_opener_Getter";
 
-Native_Window_opener_Setter(mthis, value) native "Window_opener_Setter";
+  static $opener_Setter(mthis, value) native "Window_opener_Setter";
 
-Native_Window_orientation_Getter(mthis) native "Window_orientation_Getter";
+  static $orientation_Getter(mthis) native "Window_orientation_Getter";
 
-Native_Window_outerHeight_Getter(mthis) native "Window_outerHeight_Getter";
+  static $outerHeight_Getter(mthis) native "Window_outerHeight_Getter";
 
-Native_Window_outerWidth_Getter(mthis) native "Window_outerWidth_Getter";
+  static $outerWidth_Getter(mthis) native "Window_outerWidth_Getter";
 
-Native_Window_pageXOffset_Getter(mthis) native "Window_pageXOffset_Getter";
+  static $pageXOffset_Getter(mthis) native "Window_pageXOffset_Getter";
 
-Native_Window_pageYOffset_Getter(mthis) native "Window_pageYOffset_Getter";
+  static $pageYOffset_Getter(mthis) native "Window_pageYOffset_Getter";
 
-Native_Window_parent_Getter(mthis) native "Window_parent_Getter";
+  static $parent_Getter(mthis) native "Window_parent_Getter";
 
-Native_Window_performance_Getter(mthis) native "Window_performance_Getter";
+  static $performance_Getter(mthis) native "Window_performance_Getter";
 
-Native_Window_screen_Getter(mthis) native "Window_screen_Getter";
+  static $screen_Getter(mthis) native "Window_screen_Getter";
 
-Native_Window_screenLeft_Getter(mthis) native "Window_screenLeft_Getter";
+  static $screenLeft_Getter(mthis) native "Window_screenLeft_Getter";
 
-Native_Window_screenTop_Getter(mthis) native "Window_screenTop_Getter";
+  static $screenTop_Getter(mthis) native "Window_screenTop_Getter";
 
-Native_Window_screenX_Getter(mthis) native "Window_screenX_Getter";
+  static $screenX_Getter(mthis) native "Window_screenX_Getter";
 
-Native_Window_screenY_Getter(mthis) native "Window_screenY_Getter";
+  static $screenY_Getter(mthis) native "Window_screenY_Getter";
 
-Native_Window_scrollX_Getter(mthis) native "Window_scrollX_Getter";
+  static $scrollX_Getter(mthis) native "Window_scrollX_Getter";
 
-Native_Window_scrollY_Getter(mthis) native "Window_scrollY_Getter";
+  static $scrollY_Getter(mthis) native "Window_scrollY_Getter";
 
-Native_Window_scrollbars_Getter(mthis) native "Window_scrollbars_Getter";
+  static $scrollbars_Getter(mthis) native "Window_scrollbars_Getter";
 
-Native_Window_self_Getter(mthis) native "Window_self_Getter";
+  static $self_Getter(mthis) native "Window_self_Getter";
 
-Native_Window_sessionStorage_Getter(mthis) native "Window_sessionStorage_Getter";
+  static $sessionStorage_Getter(mthis) native "Window_sessionStorage_Getter";
 
-Native_Window_speechSynthesis_Getter(mthis) native "Window_speechSynthesis_Getter";
+  static $speechSynthesis_Getter(mthis) native "Window_speechSynthesis_Getter";
 
-Native_Window_status_Getter(mthis) native "Window_status_Getter";
+  static $status_Getter(mthis) native "Window_status_Getter";
 
-Native_Window_status_Setter(mthis, value) native "Window_status_Setter";
+  static $status_Setter(mthis, value) native "Window_status_Setter";
 
-Native_Window_statusbar_Getter(mthis) native "Window_statusbar_Getter";
+  static $statusbar_Getter(mthis) native "Window_statusbar_Getter";
 
-Native_Window_styleMedia_Getter(mthis) native "Window_styleMedia_Getter";
+  static $styleMedia_Getter(mthis) native "Window_styleMedia_Getter";
 
-Native_Window_toolbar_Getter(mthis) native "Window_toolbar_Getter";
+  static $toolbar_Getter(mthis) native "Window_toolbar_Getter";
 
-Native_Window_top_Getter(mthis) native "Window_top_Getter";
+  static $top_Getter(mthis) native "Window_top_Getter";
 
-Native_Window_window_Getter(mthis) native "Window_window_Getter";
+  static $window_Getter(mthis) native "Window_window_Getter";
 
   // Generated overload resolver
-Native_Window___getter__(mthis, index_OR_name) {
+  static $__getter__(mthis, index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return Native_Window____getter___1_Callback(mthis, index_OR_name);
+      return $___getter___1_Callback(mthis, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return Native_Window____getter___2_Callback(mthis, index_OR_name);
+      return $___getter___2_Callback(mthis, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Window____getter___1_Callback(mthis, index_OR_name) native "Window___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $___getter___1_Callback(mthis, index_OR_name) native "Window___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Window____getter___2_Callback(mthis, index_OR_name) native "Window___getter___Callback";
+  static $___getter___2_Callback(mthis, index_OR_name) native "Window___getter___Callback";
 
-Native_Window_alert_Callback(mthis, message) native "Window_alert_Callback_RESOLVER_STRING_1_DOMString";
+  static $alert_Callback(mthis, message) native "Window_alert_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_cancelAnimationFrame_Callback(mthis, id) native "Window_cancelAnimationFrame_Callback_RESOLVER_STRING_1_long";
+  static $cancelAnimationFrame_Callback(mthis, id) native "Window_cancelAnimationFrame_Callback_RESOLVER_STRING_1_long";
 
-Native_Window_close_Callback(mthis) native "Window_close_Callback_RESOLVER_STRING_0_";
+  static $close_Callback(mthis) native "Window_close_Callback_RESOLVER_STRING_0_";
 
-Native_Window_confirm_Callback(mthis, message) native "Window_confirm_Callback_RESOLVER_STRING_1_DOMString";
+  static $confirm_Callback(mthis, message) native "Window_confirm_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_find_Callback(mthis, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog) native "Window_find_Callback_RESOLVER_STRING_7_DOMString_boolean_boolean_boolean_boolean_boolean_boolean";
+  static $find_Callback(mthis, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog) native "Window_find_Callback_RESOLVER_STRING_7_DOMString_boolean_boolean_boolean_boolean_boolean_boolean";
 
-Native_Window_getComputedStyle_Callback(mthis, element, pseudoElement) native "Window_getComputedStyle_Callback_RESOLVER_STRING_2_Element_DOMString";
+  static $getComputedStyle_Callback(mthis, element, pseudoElement) native "Window_getComputedStyle_Callback_RESOLVER_STRING_2_Element_DOMString";
 
-Native_Window_getMatchedCSSRules_Callback(mthis, element, pseudoElement) native "Window_getMatchedCSSRules_Callback_RESOLVER_STRING_2_Element_DOMString";
+  static $getMatchedCSSRules_Callback(mthis, element, pseudoElement) native "Window_getMatchedCSSRules_Callback_RESOLVER_STRING_2_Element_DOMString";
 
-Native_Window_getSelection_Callback(mthis) native "Window_getSelection_Callback_RESOLVER_STRING_0_";
+  static $getSelection_Callback(mthis) native "Window_getSelection_Callback_RESOLVER_STRING_0_";
 
-Native_Window_matchMedia_Callback(mthis, query) native "Window_matchMedia_Callback_RESOLVER_STRING_1_DOMString";
+  static $matchMedia_Callback(mthis, query) native "Window_matchMedia_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_moveBy_Callback(mthis, x, y) native "Window_moveBy_Callback_RESOLVER_STRING_2_float_float";
+  static $moveBy_Callback(mthis, x, y) native "Window_moveBy_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Window_moveTo_Callback(mthis, x, y) native "Window_moveTo_Callback_RESOLVER_STRING_2_float_float";
+  static $moveTo_Callback(mthis, x, y) native "Window_moveTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Window_open_Callback(mthis, url, name, options) native "Window_open_Callback";
+  static $open_Callback(mthis, url, name, options) native "Window_open_Callback";
 
-Native_Window_openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "Window_openDatabase_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
+  static $openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "Window_openDatabase_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
 
-Native_Window_postMessage_Callback(mthis, message, targetOrigin, messagePorts) native "Window_postMessage_Callback";
+  static $postMessage_Callback(mthis, message, targetOrigin, messagePorts) native "Window_postMessage_Callback";
 
-Native_Window_print_Callback(mthis) native "Window_print_Callback_RESOLVER_STRING_0_";
+  static $print_Callback(mthis) native "Window_print_Callback_RESOLVER_STRING_0_";
 
-Native_Window_requestAnimationFrame_Callback(mthis, callback) native "Window_requestAnimationFrame_Callback_RESOLVER_STRING_1_RequestAnimationFrameCallback";
+  static $requestAnimationFrame_Callback(mthis, callback) native "Window_requestAnimationFrame_Callback_RESOLVER_STRING_1_RequestAnimationFrameCallback";
 
-Native_Window_resizeBy_Callback(mthis, x, y) native "Window_resizeBy_Callback_RESOLVER_STRING_2_float_float";
+  static $resizeBy_Callback(mthis, x, y) native "Window_resizeBy_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Window_resizeTo_Callback(mthis, width, height) native "Window_resizeTo_Callback_RESOLVER_STRING_2_float_float";
+  static $resizeTo_Callback(mthis, width, height) native "Window_resizeTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Window_scroll_Callback(mthis, x, y, scrollOptions) native "Window_scroll_Callback_RESOLVER_STRING_3_long_long_Dictionary";
+  static $scroll_Callback(mthis, x, y, scrollOptions) native "Window_scroll_Callback_RESOLVER_STRING_3_long_long_Dictionary";
 
-Native_Window_scrollBy_Callback(mthis, x, y, scrollOptions) native "Window_scrollBy_Callback_RESOLVER_STRING_3_long_long_Dictionary";
+  static $scrollBy_Callback(mthis, x, y, scrollOptions) native "Window_scrollBy_Callback_RESOLVER_STRING_3_long_long_Dictionary";
 
-Native_Window_scrollTo_Callback(mthis, x, y, scrollOptions) native "Window_scrollTo_Callback_RESOLVER_STRING_3_long_long_Dictionary";
+  static $scrollTo_Callback(mthis, x, y, scrollOptions) native "Window_scrollTo_Callback_RESOLVER_STRING_3_long_long_Dictionary";
 
-Native_Window_showModalDialog_Callback(mthis, url, dialogArgs, featureArgs) native "Window_showModalDialog_Callback";
+  static $showModalDialog_Callback(mthis, url, dialogArgs, featureArgs) native "Window_showModalDialog_Callback";
 
-Native_Window_stop_Callback(mthis) native "Window_stop_Callback_RESOLVER_STRING_0_";
+  static $stop_Callback(mthis) native "Window_stop_Callback_RESOLVER_STRING_0_";
 
-Native_Window_toString_Callback(mthis) native "Window_toString_Callback";
+  static $toString_Callback(mthis) native "Window_toString_Callback";
 
-Native_Window_webkitConvertPointFromNodeToPage_Callback(mthis, node, p) native "Window_webkitConvertPointFromNodeToPage_Callback_RESOLVER_STRING_2_Node_WebKitPoint";
+  static $webkitConvertPointFromNodeToPage_Callback(mthis, node, p) native "Window_webkitConvertPointFromNodeToPage_Callback_RESOLVER_STRING_2_Node_WebKitPoint";
 
-Native_Window_webkitConvertPointFromPageToNode_Callback(mthis, node, p) native "Window_webkitConvertPointFromPageToNode_Callback_RESOLVER_STRING_2_Node_WebKitPoint";
+  static $webkitConvertPointFromPageToNode_Callback(mthis, node, p) native "Window_webkitConvertPointFromPageToNode_Callback_RESOLVER_STRING_2_Node_WebKitPoint";
 
-Native_Window_webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "Window_webkitRequestFileSystem_Callback_RESOLVER_STRING_4_unsigned short_long long_FileSystemCallback_ErrorCallback";
+  static $webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "Window_webkitRequestFileSystem_Callback_RESOLVER_STRING_4_unsigned short_long long_FileSystemCallback_ErrorCallback";
 
-Native_Window_webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "Window_webkitResolveLocalFileSystemURL_Callback_RESOLVER_STRING_3_DOMString_EntryCallback_ErrorCallback";
+  static $webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "Window_webkitResolveLocalFileSystemURL_Callback_RESOLVER_STRING_3_DOMString_EntryCallback_ErrorCallback";
 
-Native_Window_atob_Callback(mthis, string) native "Window_atob_Callback_RESOLVER_STRING_1_DOMString";
+  static $atob_Callback(mthis, string) native "Window_atob_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_btoa_Callback(mthis, string) native "Window_btoa_Callback_RESOLVER_STRING_1_DOMString";
+  static $btoa_Callback(mthis, string) native "Window_btoa_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_clearInterval_Callback(mthis, handle) native "Window_clearInterval_Callback_RESOLVER_STRING_1_long";
+  static $clearInterval_Callback(mthis, handle) native "Window_clearInterval_Callback_RESOLVER_STRING_1_long";
 
-Native_Window_clearTimeout_Callback(mthis, handle) native "Window_clearTimeout_Callback_RESOLVER_STRING_1_long";
+  static $clearTimeout_Callback(mthis, handle) native "Window_clearTimeout_Callback_RESOLVER_STRING_1_long";
 
-Native_Window_setInterval_Callback(mthis, handler, timeout) native "Window_setInterval_Callback";
+  static $setInterval_Callback(mthis, handler, timeout) native "Window_setInterval_Callback";
 
-Native_Window_setTimeout_Callback(mthis, handler, timeout) native "Window_setTimeout_Callback";
+  static $setTimeout_Callback(mthis, handler, timeout) native "Window_setTimeout_Callback";
+}
 
+class BlinkWorker {
   // Generated overload resolver
-Native_Worker_Worker(scriptUrl) {
-    return Native_Worker__create_1constructorCallback(scriptUrl);
+  static $mkWorker(scriptUrl) {
+    return $_create_1constructorCallback(scriptUrl);
   }
 
-Native_Worker__create_1constructorCallback(scriptUrl) native "Worker_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(scriptUrl) native "Worker_constructorCallback_RESOLVER_STRING_1_DOMString";
 
-Native_Worker_postMessage_Callback(mthis, message, messagePorts) native "Worker_postMessage_Callback";
+  static $postMessage_Callback(mthis, message, messagePorts) native "Worker_postMessage_Callback";
 
-Native_Worker_terminate_Callback(mthis) native "Worker_terminate_Callback_RESOLVER_STRING_0_";
+  static $terminate_Callback(mthis) native "Worker_terminate_Callback_RESOLVER_STRING_0_";
+}
 
-Native_WorkerPerformance_now_Callback(mthis) native "WorkerPerformance_now_Callback_RESOLVER_STRING_0_";
+class BlinkWorkerConsole {}
 
-Native_XMLHttpRequest_constructorCallback() native "XMLHttpRequest_constructorCallback";
+class BlinkWorkerCrypto {}
 
-Native_XMLHttpRequest_readyState_Getter(mthis) native "XMLHttpRequest_readyState_Getter";
+class BlinkWorkerLocation {}
 
-Native_XMLHttpRequest_response_Getter(mthis) native "XMLHttpRequest_response_Getter";
+class BlinkWorkerNavigator {}
 
-Native_XMLHttpRequest_responseText_Getter(mthis) native "XMLHttpRequest_responseText_Getter";
+class BlinkWorkerPerformance {
+  static $now_Callback(mthis) native "WorkerPerformance_now_Callback_RESOLVER_STRING_0_";
+}
 
-Native_XMLHttpRequest_responseType_Getter(mthis) native "XMLHttpRequest_responseType_Getter";
+class BlinkXMLDocument {}
 
-Native_XMLHttpRequest_responseType_Setter(mthis, value) native "XMLHttpRequest_responseType_Setter";
+class BlinkXMLHttpRequestEventTarget {}
 
-Native_XMLHttpRequest_responseXML_Getter(mthis) native "XMLHttpRequest_responseXML_Getter";
+class BlinkXMLHttpRequest {
+  static $constructorCallback() native "XMLHttpRequest_constructorCallback";
 
-Native_XMLHttpRequest_status_Getter(mthis) native "XMLHttpRequest_status_Getter";
+  static $readyState_Getter(mthis) native "XMLHttpRequest_readyState_Getter";
 
-Native_XMLHttpRequest_statusText_Getter(mthis) native "XMLHttpRequest_statusText_Getter";
+  static $response_Getter(mthis) native "XMLHttpRequest_response_Getter";
 
-Native_XMLHttpRequest_timeout_Getter(mthis) native "XMLHttpRequest_timeout_Getter";
+  static $responseText_Getter(mthis) native "XMLHttpRequest_responseText_Getter";
 
-Native_XMLHttpRequest_timeout_Setter(mthis, value) native "XMLHttpRequest_timeout_Setter";
+  static $responseType_Getter(mthis) native "XMLHttpRequest_responseType_Getter";
 
-Native_XMLHttpRequest_upload_Getter(mthis) native "XMLHttpRequest_upload_Getter";
+  static $responseType_Setter(mthis, value) native "XMLHttpRequest_responseType_Setter";
 
-Native_XMLHttpRequest_withCredentials_Getter(mthis) native "XMLHttpRequest_withCredentials_Getter";
+  static $responseXML_Getter(mthis) native "XMLHttpRequest_responseXML_Getter";
 
-Native_XMLHttpRequest_withCredentials_Setter(mthis, value) native "XMLHttpRequest_withCredentials_Setter";
+  static $status_Getter(mthis) native "XMLHttpRequest_status_Getter";
 
-Native_XMLHttpRequest_abort_Callback(mthis) native "XMLHttpRequest_abort_Callback_RESOLVER_STRING_0_";
+  static $statusText_Getter(mthis) native "XMLHttpRequest_statusText_Getter";
 
-Native_XMLHttpRequest_getAllResponseHeaders_Callback(mthis) native "XMLHttpRequest_getAllResponseHeaders_Callback_RESOLVER_STRING_0_";
+  static $timeout_Getter(mthis) native "XMLHttpRequest_timeout_Getter";
 
-Native_XMLHttpRequest_getResponseHeader_Callback(mthis, header) native "XMLHttpRequest_getResponseHeader_Callback_RESOLVER_STRING_1_DOMString";
+  static $timeout_Setter(mthis, value) native "XMLHttpRequest_timeout_Setter";
 
-Native_XMLHttpRequest_open_Callback(mthis, method, url, async, user, password) native "XMLHttpRequest_open_Callback";
+  static $upload_Getter(mthis) native "XMLHttpRequest_upload_Getter";
 
-Native_XMLHttpRequest_overrideMimeType_Callback(mthis, override) native "XMLHttpRequest_overrideMimeType_Callback_RESOLVER_STRING_1_DOMString";
+  static $withCredentials_Getter(mthis) native "XMLHttpRequest_withCredentials_Getter";
 
-Native_XMLHttpRequest_send_Callback(mthis, data) native "XMLHttpRequest_send_Callback";
+  static $withCredentials_Setter(mthis, value) native "XMLHttpRequest_withCredentials_Setter";
 
-Native_XMLHttpRequest_setRequestHeader_Callback(mthis, header, value) native "XMLHttpRequest_setRequestHeader_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $abort_Callback(mthis) native "XMLHttpRequest_abort_Callback_RESOLVER_STRING_0_";
 
+  static $getAllResponseHeaders_Callback(mthis) native "XMLHttpRequest_getAllResponseHeaders_Callback_RESOLVER_STRING_0_";
+
+  static $getResponseHeader_Callback(mthis, header) native "XMLHttpRequest_getResponseHeader_Callback_RESOLVER_STRING_1_DOMString";
+
+  static $open_Callback(mthis, method, url, async, user, password) native "XMLHttpRequest_open_Callback";
+
+  static $overrideMimeType_Callback(mthis, override) native "XMLHttpRequest_overrideMimeType_Callback_RESOLVER_STRING_1_DOMString";
+
+  static $send_Callback(mthis, data) native "XMLHttpRequest_send_Callback";
+
+  static $setRequestHeader_Callback(mthis, header, value) native "XMLHttpRequest_setRequestHeader_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+}
+
+class BlinkXMLHttpRequestProgressEvent {}
+
+class BlinkXMLHttpRequestUpload {}
+
+class BlinkXMLSerializer {
   // Generated overload resolver
-Native_XMLSerializer_XmlSerializer() {
-    return Native_XMLSerializer__create_1constructorCallback();
+  static $mkXmlSerializer() {
+    return $_create_1constructorCallback();
   }
 
-Native_XMLSerializer__create_1constructorCallback() native "XMLSerializer_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "XMLSerializer_constructorCallback_RESOLVER_STRING_0_";
 
-Native_XMLSerializer_serializeToString_Callback(mthis, node) native "XMLSerializer_serializeToString_Callback_RESOLVER_STRING_1_Node";
+  static $serializeToString_Callback(mthis, node) native "XMLSerializer_serializeToString_Callback_RESOLVER_STRING_1_Node";
+}
 
+class BlinkXPathEvaluator {
   // Generated overload resolver
-Native_XPathEvaluator_XPathEvaluator() {
-    return Native_XPathEvaluator__create_1constructorCallback();
+  static $mkXPathEvaluator() {
+    return $_create_1constructorCallback();
   }
 
-Native_XPathEvaluator__create_1constructorCallback() native "XPathEvaluator_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "XPathEvaluator_constructorCallback_RESOLVER_STRING_0_";
 
-Native_XPathEvaluator_createExpression_Callback(mthis, expression, resolver) native "XPathEvaluator_createExpression_Callback_RESOLVER_STRING_2_DOMString_XPathNSResolver";
+  static $createExpression_Callback(mthis, expression, resolver) native "XPathEvaluator_createExpression_Callback_RESOLVER_STRING_2_DOMString_XPathNSResolver";
 
-Native_XPathEvaluator_createNSResolver_Callback(mthis, nodeResolver) native "XPathEvaluator_createNSResolver_Callback_RESOLVER_STRING_1_Node";
+  static $createNSResolver_Callback(mthis, nodeResolver) native "XPathEvaluator_createNSResolver_Callback_RESOLVER_STRING_1_Node";
 
-Native_XPathEvaluator_evaluate_Callback(mthis, expression, contextNode, resolver, type, inResult) native "XPathEvaluator_evaluate_Callback_RESOLVER_STRING_5_DOMString_Node_XPathNSResolver_unsigned short_XPathResult";
+  static $evaluate_Callback(mthis, expression, contextNode, resolver, type, inResult) native "XPathEvaluator_evaluate_Callback_RESOLVER_STRING_5_DOMString_Node_XPathNSResolver_unsigned short_XPathResult";
+}
 
-Native_XPathExpression_evaluate_Callback(mthis, contextNode, type, inResult) native "XPathExpression_evaluate_Callback_RESOLVER_STRING_3_Node_unsigned short_XPathResult";
+class BlinkXPathExpression {
+  static $evaluate_Callback(mthis, contextNode, type, inResult) native "XPathExpression_evaluate_Callback_RESOLVER_STRING_3_Node_unsigned short_XPathResult";
+}
 
-Native_XPathNSResolver_lookupNamespaceURI_Callback(mthis, prefix) native "XPathNSResolver_lookupNamespaceURI_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkXPathNSResolver {
+  static $lookupNamespaceURI_Callback(mthis, prefix) native "XPathNSResolver_lookupNamespaceURI_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_XPathResult_booleanValue_Getter(mthis) native "XPathResult_booleanValue_Getter";
+class BlinkXPathResult {
+  static $booleanValue_Getter(mthis) native "XPathResult_booleanValue_Getter";
 
-Native_XPathResult_invalidIteratorState_Getter(mthis) native "XPathResult_invalidIteratorState_Getter";
+  static $invalidIteratorState_Getter(mthis) native "XPathResult_invalidIteratorState_Getter";
 
-Native_XPathResult_numberValue_Getter(mthis) native "XPathResult_numberValue_Getter";
+  static $numberValue_Getter(mthis) native "XPathResult_numberValue_Getter";
 
-Native_XPathResult_resultType_Getter(mthis) native "XPathResult_resultType_Getter";
+  static $resultType_Getter(mthis) native "XPathResult_resultType_Getter";
 
-Native_XPathResult_singleNodeValue_Getter(mthis) native "XPathResult_singleNodeValue_Getter";
+  static $singleNodeValue_Getter(mthis) native "XPathResult_singleNodeValue_Getter";
 
-Native_XPathResult_snapshotLength_Getter(mthis) native "XPathResult_snapshotLength_Getter";
+  static $snapshotLength_Getter(mthis) native "XPathResult_snapshotLength_Getter";
 
-Native_XPathResult_stringValue_Getter(mthis) native "XPathResult_stringValue_Getter";
+  static $stringValue_Getter(mthis) native "XPathResult_stringValue_Getter";
 
-Native_XPathResult_iterateNext_Callback(mthis) native "XPathResult_iterateNext_Callback_RESOLVER_STRING_0_";
+  static $iterateNext_Callback(mthis) native "XPathResult_iterateNext_Callback_RESOLVER_STRING_0_";
 
-Native_XPathResult_snapshotItem_Callback(mthis, index) native "XPathResult_snapshotItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $snapshotItem_Callback(mthis, index) native "XPathResult_snapshotItem_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
+class BlinkXSLTProcessor {
   // Generated overload resolver
-Native_XSLTProcessor_XsltProcessor() {
-    return Native_XSLTProcessor__create_1constructorCallback();
+  static $mkXsltProcessor() {
+    return $_create_1constructorCallback();
   }
 
-Native_XSLTProcessor__create_1constructorCallback() native "XSLTProcessor_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "XSLTProcessor_constructorCallback_RESOLVER_STRING_0_";
 
-Native_XSLTProcessor_clearParameters_Callback(mthis) native "XSLTProcessor_clearParameters_Callback_RESOLVER_STRING_0_";
+  static $clearParameters_Callback(mthis) native "XSLTProcessor_clearParameters_Callback_RESOLVER_STRING_0_";
 
-Native_XSLTProcessor_getParameter_Callback(mthis, namespaceURI, localName) native "XSLTProcessor_getParameter_Callback";
+  static $getParameter_Callback(mthis, namespaceURI, localName) native "XSLTProcessor_getParameter_Callback";
 
-Native_XSLTProcessor_importStylesheet_Callback(mthis, stylesheet) native "XSLTProcessor_importStylesheet_Callback_RESOLVER_STRING_1_Node";
+  static $importStylesheet_Callback(mthis, stylesheet) native "XSLTProcessor_importStylesheet_Callback_RESOLVER_STRING_1_Node";
 
-Native_XSLTProcessor_removeParameter_Callback(mthis, namespaceURI, localName) native "XSLTProcessor_removeParameter_Callback";
+  static $removeParameter_Callback(mthis, namespaceURI, localName) native "XSLTProcessor_removeParameter_Callback";
 
-Native_XSLTProcessor_reset_Callback(mthis) native "XSLTProcessor_reset_Callback_RESOLVER_STRING_0_";
+  static $reset_Callback(mthis) native "XSLTProcessor_reset_Callback_RESOLVER_STRING_0_";
 
-Native_XSLTProcessor_setParameter_Callback(mthis, namespaceURI, localName, value) native "XSLTProcessor_setParameter_Callback";
+  static $setParameter_Callback(mthis, namespaceURI, localName, value) native "XSLTProcessor_setParameter_Callback";
 
-Native_XSLTProcessor_transformToDocument_Callback(mthis, source) native "XSLTProcessor_transformToDocument_Callback_RESOLVER_STRING_1_Node";
+  static $transformToDocument_Callback(mthis, source) native "XSLTProcessor_transformToDocument_Callback_RESOLVER_STRING_1_Node";
 
-Native_XSLTProcessor_transformToFragment_Callback(mthis, source, docVal) native "XSLTProcessor_transformToFragment_Callback_RESOLVER_STRING_2_Node_Document";
+  static $transformToFragment_Callback(mthis, source, docVal) native "XSLTProcessor_transformToFragment_Callback_RESOLVER_STRING_2_Node_Document";
+}
 
 
 // TODO(vsm): This should be moved out of this library.  Into dart:html?
 Type _getType(String key) {
+  var result;
+
   // TODO(vsm): Add Cross Frame and JS types here as well.
-  if (htmlBlinkMap.containsKey(key))
-    return htmlBlinkMap[key];
-  if (indexed_dbBlinkMap.containsKey(key))
-    return indexed_dbBlinkMap[key];
-  if (web_audioBlinkMap.containsKey(key))
-    return web_audioBlinkMap[key];
-  if (web_glBlinkMap.containsKey(key))
-    return web_glBlinkMap[key];
-  if (web_sqlBlinkMap.containsKey(key))
-    return web_sqlBlinkMap[key];
-  if (svgBlinkMap.containsKey(key))
-    return svgBlinkMap[key];
+
+  // Check the html library.
+  result = _getHtmlType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web gl library.
+  result = _getWebGlType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the indexed db library.
+  result = _getIndexDbType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web audio library.
+  result = _getWebAudioType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web sql library.
+  result = _getWebSqlType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the svg library.
+  result = _getSvgType(key);
+  if (result != null) {
+    return result;
+  }
+
   return null;
-}// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+}
+
+Type _getHtmlType(String key) {
+  if (htmlBlinkMap.containsKey(key)) {
+    return htmlBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getWebGlType(String key) {
+  if (web_glBlinkMap.containsKey(key)) {
+    return web_glBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getIndexDbType(String key) {
+  if (indexed_dbBlinkMap.containsKey(key)) {
+    return indexed_dbBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getWebAudioType(String key) {
+  if (web_audioBlinkMap.containsKey(key)) {
+    return web_audioBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getWebSqlType(String key) {
+  if (web_sqlBlinkMap.containsKey(key)) {
+    return web_sqlBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getSvgType(String key) {
+  if (svgBlinkMap.containsKey(key)) {
+    return svgBlinkMap[key]();
+  }
+  return null;
+}
+
+// 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.
 
 
 // _Utils native entry points
-Native_Utils_window() native "Utils_window";
+class Blink_Utils {
+  static window() native "Utils_window";
 
-Native_Utils_forwardingPrint(message) native "Utils_forwardingPrint";
+  static forwardingPrint(message) native "Utils_forwardingPrint";
 
-Native_Utils_spawnDomUri(uri) native "Utils_spawnDomUri";
+  static spawnDomUri(uri) native "Utils_spawnDomUri";
 
-Native_Utils_register(document, tag, customType, extendsTagName) native "Utils_register";
+  static register(document, tag, customType, extendsTagName) native "Utils_register";
 
-Native_Utils_createElement(document, tagName) native "Utils_createElement";
+  static createElement(document, tagName) native "Utils_createElement";
 
-Native_Utils_initializeCustomElement(element) native "Utils_initializeCustomElement";
+  static initializeCustomElement(element) native "Utils_initializeCustomElement";
 
-Native_Utils_changeElementWrapper(element, type) native "Utils_changeElementWrapper";
+  static changeElementWrapper(element, type) native "Utils_changeElementWrapper";
+}
 
-// FIXME: Return to using explicit cross frame entry points after roll to M35
-Native_DOMWindowCrossFrame_get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
+class Blink_DOMWindowCrossFrame {
+  // FIXME: Return to using explicit cross frame entry points after roll to M35
+  static get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
 
-Native_DOMWindowCrossFrame_get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
+  static get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
 
-Native_DOMWindowCrossFrame_get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
+  static get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
 
-Native_DOMWindowCrossFrame_get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
+  static get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
 
-Native_DOMWindowCrossFrame_get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
+  static get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
 
-Native_DOMWindowCrossFrame_get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
+  static get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
 
-Native_DOMWindowCrossFrame_close(_DOMWindowCrossFrame) native "Window_close_Callback_RESOLVER_STRING_0_";
+  static close(_DOMWindowCrossFrame) native "Window_close_Callback_RESOLVER_STRING_0_";
 
-Native_DOMWindowCrossFrame_postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
+  static postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
+}
 
-// _HistoryCrossFrame native entry points
-Native_HistoryCrossFrame_back(_HistoryCrossFrame) native "History_back_Callback_RESOLVER_STRING_0_";
+class Blink_HistoryCrossFrame {
+  // _HistoryCrossFrame native entry points
+  static back(_HistoryCrossFrame) native "History_back_Callback_RESOLVER_STRING_0_";
 
-Native_HistoryCrossFrame_forward(_HistoryCrossFrame) native "History_forward_Callback_RESOLVER_STRING_0_";
+  static forward(_HistoryCrossFrame) native "History_forward_Callback_RESOLVER_STRING_0_";
 
-Native_HistoryCrossFrame_go(_HistoryCrossFrame, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
+  static go(_HistoryCrossFrame, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
+}
 
-// _LocationCrossFrame native entry points
-Native_LocationCrossFrame_set_href(_LocationCrossFrame, h) native "Location_href_Setter";
+class Blink_LocationCrossFrame {
+  // _LocationCrossFrame native entry points
+  static set_href(_LocationCrossFrame, h) native "Location_href_Setter";
+}
 
-// _DOMStringMap native entry  points
-Native_DOMStringMap_containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
+class Blink_DOMStringMap {
+  // _DOMStringMap native entry  points
+  static containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
 
-Native_DOMStringMap_item(_DOMStringMap, key) native "DOMStringMap_item_Callback";
+  static item(_DOMStringMap, key) native "DOMStringMap_item_Callback";
 
-Native_DOMStringMap_setItem(_DOMStringMap, key, value) native "DOMStringMap_setItem_Callback";
+  static setItem(_DOMStringMap, key, value) native "DOMStringMap_setItem_Callback";
 
-Native_DOMStringMap_remove(_DOMStringMap, key) native "DOMStringMap_remove_Callback";
+  static remove(_DOMStringMap, key) native "DOMStringMap_remove_Callback";
 
-Native_DOMStringMap_get_keys(_DOMStringMap) native "DOMStringMap_getKeys_Callback";
+  static get_keys(_DOMStringMap) native "DOMStringMap_getKeys_Callback";
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
index 9c6ba20..a9786cb 100644
--- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -43,8 +43,10 @@
             enableNativeLiveTypeAnalysis:
                 !hasOption(options, '--disable-native-live-type-analysis'),
             emitJavaScript: !hasOption(options, '--output-type=dart'),
+            generateSourceMap: !hasOption(options, '--no-source-maps'),
             analyzeAllFlag: hasOption(options, '--analyze-all'),
             analyzeOnly: hasOption(options, '--analyze-only'),
+            analyzeMain: hasOption(options, '--analyze-main'),
             analyzeSignaturesOnly:
                 hasOption(options, '--analyze-signatures-only'),
             strips: extractCsvOption(options, '--force-strip='),
@@ -64,6 +66,7 @@
             showPackageWarnings:
                 hasOption(options, '--show-package-warnings'),
             useContentSecurityPolicy: hasOption(options, '--csp'),
+            hasIncrementalSupport: hasOption(options, '--incremental-support'),
             suppressWarnings: hasOption(options, '--suppress-warnings')) {
     if (!libraryRoot.path.endsWith("/")) {
       throw new ArgumentError("libraryRoot must end with a /");
@@ -136,12 +139,6 @@
     return "lib/$path";
   }
 
-  Future<elements.LibraryElement> scanBuiltinLibrary(String path) {
-    Uri uri = libraryRoot.resolve(lookupLibraryPath(path));
-    Uri canonicalUri = new Uri(scheme: "dart", path: path);
-    return libraryLoader.loadLibrary(uri, null, canonicalUri);
-  }
-
   void log(message) {
     handler(null, null, null, message, api.Diagnostic.VERBOSE_INFO);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/cache_strategy.dart b/sdk/lib/_internal/compiler/implementation/cache_strategy.dart
new file mode 100644
index 0000000..2a0a8f0
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/cache_strategy.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection' show
+    HashMap,
+    HashSet;
+
+/**
+ * Helper class for allocating sets and maps appropriate for caching objects
+ * that can be assumed to be canonicalized.
+ *
+ * When compiling dart2js to JavaScript, profiling reveals that identity maps
+ * and sets have superior performance.  However, we know that [Object.hashCode]
+ * is slow on the Dart VM.  This class is meant to encapsulate the decision
+ * about which data structure is best, and we anticipate specific subclasses
+ * for JavaScript and Dart VM in the future.
+ */
+class CacheStrategy {
+  final bool hasIncrementalSupport;
+
+  CacheStrategy(this.hasIncrementalSupport);
+
+  Map newMap() => hasIncrementalSupport ? new HashMap.identity() : null;
+
+  Set newSet() => hasIncrementalSupport ? new HashSet.identity() : null;
+}
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index b85551b..cace5f8 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -10,7 +10,10 @@
 import "scanner/scannerlib.dart" show Token;
 import "tree/tree.dart";
 import "util/util.dart";
-import "elements/modelx.dart" show ElementX, FunctionElementX, ClassElementX;
+import "elements/modelx.dart"
+    show ElementX,
+         BaseFunctionElementX,
+         ClassElementX;
 import "elements/visitor.dart" show ElementVisitor;
 
 class ClosureNamer {
@@ -80,16 +83,24 @@
   final TypedElement variableElement;
 
   ClosureFieldElement(String name,
-                      this.variableElement,
-                      ClassElement enclosing)
+                     this.variableElement,
+                     ClosureClassElement enclosing)
       : super(name, ElementKind.FIELD, enclosing);
 
+  ClosureClassElement get closureClass => enclosingElement;
+
   Node get node {
     throw new SpannableAssertionFailure(
         variableElement,
         'Should not access node of ClosureFieldElement.');
   }
 
+  bool get hasResolvedAst => hasTreeElements;
+
+  ResolvedAst get resolvedAst {
+    return new ResolvedAst(this, null, treeElements);
+  }
+
   Expression get initializer {
     throw new SpannableAssertionFailure(
         variableElement,
@@ -108,6 +119,8 @@
   String toString() => "ClosureFieldElement($name)";
 
   accept(ElementVisitor visitor) => visitor.visitClosureFieldElement(this);
+
+  Element get analyzableElement => closureClass.methodElement.analyzableElement;
 }
 
 // TODO(ahe): These classes continuously cause problems.  We need to
@@ -218,20 +231,28 @@
 }
 
 /// Call method of a closure class.
-class SynthesizedCallMethodElementX extends FunctionElementX {
+class SynthesizedCallMethodElementX extends BaseFunctionElementX {
   final FunctionElement expression;
 
   SynthesizedCallMethodElementX(String name,
-                                FunctionElementX other,
-                                Element enclosing)
+                                BaseFunctionElementX other,
+                                ClosureClassElement enclosing)
       : expression = other,
         super(name, other.kind, other.modifiers, enclosing, false) {
     functionSignatureCache = other.functionSignature;
   }
 
+  ClosureClassElement get closureClass => enclosingElement;
+
   FunctionExpression get node => expression.node;
 
   FunctionExpression parseNode(DiagnosticListener listener) => node;
+
+  ResolvedAst get resolvedAst {
+    return new ResolvedAst(this, node, treeElements);
+  }
+
+  Element get analyzableElement => closureClass.methodElement.analyzableElement;
 }
 
 // The box-element for a scope, and the captured variables that need to be
@@ -255,7 +276,7 @@
   final Element closureElement;
   // The closureClassElement will be null for methods that are not local
   // closures.
-  final ClassElement closureClassElement;
+  final ClosureClassElement closureClassElement;
   // The callElement will be null for methods that are not local closures.
   final FunctionElement callElement;
   // The [thisElement] makes handling 'this' easier by treating it like any
@@ -452,9 +473,11 @@
              closureData.freeVariableMapping[element] == element);
       closureData.freeVariableMapping[element] = element;
     } else if (inTryStatement) {
-      // Don't mark the this-element. This would complicate things in the
-      // builder.
-      if (element != closureData.thisElement) {
+      // Don't mark the this-element or a self-reference. This would complicate
+      // things in the builder.
+      // Note that nested (named) functions are immutable.
+      if (element != closureData.thisElement &&
+          element != closureData.closureElement) {
         // TODO(ngeoffray): only do this if the variable is mutated.
         closureData.usedVariablesInTry.add(element);
       }
@@ -734,7 +757,7 @@
   ClosureClassMap globalizeClosure(FunctionExpression node,
                                    TypedElement element) {
     String closureName = computeClosureName(element);
-    ClassElement globalizedElement = new ClosureClassElement(
+    ClosureClassElement globalizedElement = new ClosureClassElement(
         node, closureName, compiler, element, element.compilationUnit);
     FunctionElement callElement =
         new SynthesizedCallMethodElementX(Compiler.CALL_OPERATOR_NAME,
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index b1939b7..8a21068 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -105,17 +105,11 @@
       Constant result = initialVariableValues[element.declaration];
       return result;
     }
-    Element currentElement = element;
-    if (element.isParameter ||
-        element.isFieldParameter ||
-        element.isVariable) {
-      currentElement = element.enclosingElement;
-    }
+    AstElement currentElement = element.analyzableElement;
     return compiler.withCurrentElement(currentElement, () {
-      TreeElements definitions =
-          compiler.analyzeElement(currentElement.declaration);
+      compiler.analyzeElement(currentElement.declaration);
       Constant constant = compileVariableWithDefinitions(
-          element, definitions, isConst: isConst);
+          element, currentElement.resolvedAst.elements, isConst: isConst);
       return constant;
     });
   }
@@ -311,48 +305,9 @@
       }
       map[key] = evaluateConstant(entry.value);
     }
-
-    bool onlyStringKeys = true;
-    Constant protoValue = null;
-    for (var key in keys) {
-      if (key.isString) {
-        if (key.value == MapConstant.PROTO_PROPERTY) {
-          protoValue = map[key];
-        }
-      } else {
-        onlyStringKeys = false;
-        // Don't handle __proto__ values specially in the general map case.
-        protoValue = null;
-        break;
-      }
-    }
-
-    bool hasProtoKey = (protoValue != null);
     List<Constant> values = map.values.toList();
     InterfaceType sourceType = elements.getType(node);
-    DartType keysType;
-    if (sourceType.treatAsRaw) {
-      keysType = compiler.listClass.rawType;
-    } else {
-      Link<DartType> arguments =
-          new Link<DartType>.fromList([sourceType.typeArguments.head]);
-      keysType = new InterfaceType(compiler.listClass, arguments);
-    }
-    ListConstant keysList = new ListConstant(keysType, keys);
-    String className = onlyStringKeys
-        ? (hasProtoKey ? MapConstant.DART_PROTO_CLASS
-                       : MapConstant.DART_STRING_CLASS)
-        : MapConstant.DART_GENERAL_CLASS;
-    ClassElement classElement = compiler.jsHelperLibrary.find(className);
-    classElement.ensureResolved(compiler);
-    Link<DartType> typeArgument = sourceType.typeArguments;
-    InterfaceType type;
-    if (sourceType.treatAsRaw) {
-      type = classElement.rawType;
-    } else {
-      type = new InterfaceType(classElement, typeArgument);
-    }
-    return new MapConstant(type, keysList, values, protoValue, onlyStringKeys);
+    return constantSystem.createMap(compiler, sourceType, keys, values);
   }
 
   Constant visitLiteralNull(LiteralNull node) {
@@ -404,7 +359,8 @@
         new DartString.literal(node.slowNameString))];
     }
     return makeConstructedConstant(
-        node, type, compiler.symbolConstructor, createArguments);
+        node, type, compiler.symbolConstructor, createArguments,
+        isLiteralSymbol: true);
   }
 
   Constant makeTypeConstant(DartType elementType) {
@@ -628,9 +584,12 @@
                                                  compileConstant,
                                                  compiler);
     if (!succeeded) {
+      String name = Elements.constructorNameForDiagnostics(
+          target.enclosingClass.name, target.name);
       compiler.reportFatalError(
           node,
-          MessageKind.INVALID_ARGUMENTS, {'methodName': target.name});
+          MessageKind.INVALID_CONSTRUCTOR_ARGUMENTS,
+          {'constructorName': name});
     }
     return compiledArguments;
   }
@@ -739,7 +698,8 @@
 
   Constant makeConstructedConstant(
       Spannable node, InterfaceType type, ConstructorElement constructor,
-      List<Constant> getArguments(ConstructorElement constructor)) {
+      List<Constant> getArguments(ConstructorElement constructor),
+      {bool isLiteralSymbol: false}) {
     // The redirection chain of this element may not have been resolved through
     // a post-process action, so we have to make sure it is done here.
     compiler.resolver.resolveRedirectionChain(constructor, node);
@@ -758,7 +718,8 @@
     evaluator.evaluateConstructorFieldValues(arguments);
     List<Constant> jsNewArguments = evaluator.buildJsNewArguments(classElement);
 
-    return new ConstructedConstant(constructedType, jsNewArguments);
+    return new ConstructedConstant(constructedType, jsNewArguments,
+        isLiteralSymbol: isLiteralSymbol);
   }
 
   Constant visitParenthesizedExpression(ParenthesizedExpression node) {
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 1fbc00d..d221a0b 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -24,7 +24,7 @@
    *
    * Invariant: [element] must be a declaration element.
    */
-  final Element element;
+  final AstElement element;
   TreeElements resolutionTree;
 
   WorkItem(this.element, this.compilationContext) {
@@ -36,12 +36,13 @@
 
 /// [WorkItem] used exclusively by the [ResolutionEnqueuer].
 class ResolutionWorkItem extends WorkItem {
-  ResolutionWorkItem(Element element,
+  ResolutionWorkItem(AstElement element,
                      ItemCompilationContext compilationContext)
       : super(element, compilationContext);
 
   void run(Compiler compiler, ResolutionEnqueuer world) {
-    resolutionTree = compiler.analyze(this, world);
+    compiler.analyze(this, world);
+    resolutionTree = element.resolvedAst.elements;
   }
 
   bool isAnalyzed() => resolutionTree != null;
@@ -55,6 +56,8 @@
 
   CodegenRegistry(this.compiler, this.treeElements);
 
+  bool get isForResolution => false;
+
   // TODO(johnniwinther): Remove this getter when [Registry] creates a
   // dependency node.
   Setlet<Element> get otherDependencies => treeElements.otherDependencies;
@@ -104,6 +107,7 @@
 
   void registerIsCheck(DartType type) {
     world.registerIsCheck(type, this);
+    backend.registerIsCheckForCodegen(type, world, this);
   }
 
   void registerCompileTimeConstant(Constant constant) {
@@ -133,7 +137,7 @@
   }
 
   void registerConstSymbol(String name) {
-    world.registerConstSymbol(name, this);
+    backend.registerConstSymbol(name, this);
   }
 
   void registerSpecializedGetInterceptor(Set<ClassElement> classes) {
@@ -147,20 +151,25 @@
   void registerTypeConstant(ClassElement element) {
     backend.customElementsAnalysis.registerTypeConstant(element, world);
   }
+
+  void registerStaticInvocation(Element element) =>
+      throw new UnsupportedError('registerStaticInvocation not supported');
+
+  void registerInstantiation(ClassElement element) =>
+      throw new UnsupportedError('registerStaticInvocation not supported');
 }
 
 /// [WorkItem] used exclusively by the [CodegenEnqueuer].
 class CodegenWorkItem extends WorkItem {
   Registry registry;
 
-  CodegenWorkItem(Element element,
+  CodegenWorkItem(AstElement element,
                   ItemCompilationContext compilationContext)
       : super(element, compilationContext);
 
   void run(Compiler compiler, CodegenEnqueuer world) {
     if (world.isProcessed(element)) return;
-    resolutionTree =
-        compiler.enqueuer.resolution.getCachedElements(element);
+    resolutionTree = element.resolvedAst.elements;
     assert(invariant(element, resolutionTree != null,
         message: 'Resolution tree is null for $element in codegen work item'));
     registry = new CodegenRegistry(compiler, resolutionTree);
@@ -184,6 +193,12 @@
   Iterable<Element> get otherDependencies;
 
   void registerDependency(Element element);
+
+  bool get isForResolution;
+
+  void registerStaticInvocation(Element element);
+
+  void registerInstantiation(ClassElement element);
 }
 
 abstract class Backend {
@@ -248,44 +263,42 @@
 
   /// Called during resolution to notify to the backend that the
   /// program uses string interpolation.
-  void registerStringInterpolation(Registry registry) {}
+  void onStringInterpolation(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program has a catch statement.
-  void registerCatchStatement(Enqueuer enqueuer,
-                              Registry registry) {}
+  void onCatchStatement(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program explicitly throws an exception.
-  void registerThrowExpression(Registry registry) {}
+  void onThrowExpression(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program has a global variable with a lazy initializer.
-  void registerLazyField(Registry registry) {}
+  void onLazyField(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program uses a type variable as an expression.
-  void registerTypeVariableExpression(Registry registry) {}
+  void onTypeVariableExpression(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program uses a type literal.
-  void registerTypeLiteral(DartType type,
-                           Enqueuer enqueuer,
-                           Registry registry) {}
+  void onTypeLiteral(DartType type, Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program has a catch statement with a stack trace.
-  void registerStackTraceInCatch(Registry registry) {}
+  void onStackTraceInCatch(Registry registry) {}
 
   /// Register an is check to the backend.
-  void registerIsCheck(DartType type,
-                       Enqueuer enqueuer,
-                       Registry registry) {}
+  void registerIsCheckForCodegen(DartType type,
+                                 Enqueuer enqueuer,
+                                 Registry registry) {}
+
+  /// Register an is check to the backend.
+  void onIsCheck(DartType type, Registry registry) {}
 
   /// Register an as check to the backend.
-  void registerAsCheck(DartType type,
-                       Enqueuer enqueuer,
-                       Registry registry) {}
+  void onAsCheck(DartType type, Registry registry) {}
 
   /// Register a runtime type variable bound tests between [typeArgument] and
   /// [bound].
@@ -293,27 +306,27 @@
                                               DartType bound) {}
 
   /// Registers that a type variable bounds check might occur at runtime.
-  void registerTypeVariableBoundCheck(Registry registry) {}
+  void onTypeVariableBoundCheck(Registry registry) {}
 
   /// Register that the application may throw a [NoSuchMethodError].
-  void registerThrowNoSuchMethod(Registry registry) {}
+  void onThrowNoSuchMethod(Registry registry) {}
 
   /// Register that the application may throw a [RuntimeError].
-  void registerThrowRuntimeError(Registry registry) {}
+  void onThrowRuntimeError(Registry registry) {}
 
   /// Register that the application may throw an
   /// [AbstractClassInstantiationError].
-  void registerAbstractClassInstantiation(Registry registry) {}
+  void onAbstractClassInstantiation(Registry registry) {}
 
   /// Register that the application may throw a [FallThroughError].
-  void registerFallThroughError(Registry registry) {}
+  void onFallThroughError(Registry registry) {}
 
   /// Register that a super call will end up calling
   /// [: super.noSuchMethod :].
-  void registerSuperNoSuchMethod(Registry registry) {}
+  void onSuperNoSuchMethod(Registry registry) {}
 
   /// Register that the application creates a constant map.
-  void registerConstantMap(Registry registry) {}
+  void onConstantMap(Registry registry) {}
 
   /**
    * Call this to register that an instantiated generic class has a call
@@ -347,8 +360,9 @@
 
   void registerConstSymbol(String name, Registry registry) {}
   void registerNewSymbol(Registry registry) {}
+
   /// Called when resolving the `Symbol` constructor.
-  void registerSymbolConstructor(Registry registry) {}
+  void onSymbolConstructor(Registry registry) {}
 
   bool isNullImplementation(ClassElement cls) {
     return cls == compiler.nullClass;
@@ -383,7 +397,29 @@
 
   void registerStaticUse(Element element, Enqueuer enqueuer) {}
 
-  Future onLibraryLoaded(LibraryElement library, Uri uri) {
+  /// This method is called immediately after the [LibraryElement] [library] has
+  /// been created.
+  void onLibraryCreated(LibraryElement library) {}
+
+  /// This method is called immediately after the [library] and its parts have
+  /// been scanned.
+  Future onLibraryScanned(LibraryElement library,
+                          LibraryLoader loader) {
+    // TODO(johnniwinther): Move this to the JavaScript backend.
+    if (library.isPlatformLibrary && !library.isPatched) {
+      // Apply patch, if any.
+      Uri patchUri = compiler.resolvePatchUri(library.canonicalUri.path);
+      if (patchUri != null) {
+        return compiler.patchParser.patchLibrary(loader, patchUri, library);
+      }
+    }
+    return new Future.value();
+  }
+
+  /// This method is called when all new libraries loaded through
+  /// [LibraryLoader.loadLibrary] has been loaded and their imports/exports
+  /// have been computed.
+  Future onLibrariesLoaded(Map<Uri, LibraryElement> loadedLibraries) {
     return new Future.value();
   }
 
@@ -413,6 +449,9 @@
   // TODO(johnniwinther): Change [TreeElements] to [Registry] or a dependency
   // node. [elements] is currently unused by the implementation.
   void onElementResolved(Element element, TreeElements elements) {}
+
+  // Does this element belong in the output
+  bool shouldOutput(Element element) => true;
 }
 
 /**
@@ -455,6 +494,22 @@
 }
 
 abstract class Compiler implements DiagnosticListener {
+  static final Uri DART_CORE = new Uri(scheme: 'dart', path: 'core');
+  static final Uri DART_JS_HELPER = new Uri(scheme: 'dart', path: '_js_helper');
+  static final Uri DART_INTERCEPTORS =
+      new Uri(scheme: 'dart', path: '_interceptors');
+  static final Uri DART_FOREIGN_HELPER =
+      new Uri(scheme: 'dart', path: '_foreign_helper');
+  static final Uri DART_ISOLATE_HELPER =
+      new Uri(scheme: 'dart', path: '_isolate_helper');
+  static final Uri DART_MIRRORS = new Uri(scheme: 'dart', path: 'mirrors');
+  static final Uri DART_NATIVE_TYPED_DATA =
+      new Uri(scheme: 'dart', path: '_native_typed_data');
+  static final Uri DART_INTERNAL = new Uri(scheme: 'dart', path: '_internal');
+  static final Uri DART_ASYNC = new Uri(scheme: 'dart', path: 'async');
+
+  // TODO(johnniwinther): Move this to [LibraryLoaderTask] and hange to map from
+  // [Uri] to [LibraryElement].
   final Map<String, LibraryElement> libraries =
     new Map<String, LibraryElement>();
   final Stopwatch totalCompileTime = new Stopwatch();
@@ -463,6 +518,8 @@
   String assembledCode;
   Types types;
 
+  final CacheStrategy cacheStrategy;
+
   /**
    * Map from token to the first preceeding comment token.
    */
@@ -505,6 +562,10 @@
   final int maxConcreteTypeSize;
   final bool analyzeAllFlag;
   final bool analyzeOnly;
+
+  /// If true, disable tree-shaking for the main script.
+  final bool analyzeMain;
+
   /**
    * If true, skip analysis of method bodies and field initializers. Implies
    * [analyzeOnly].
@@ -553,6 +614,10 @@
 
   final bool suppressWarnings;
 
+  /// If `true`, some values are cached for reuse in incremental compilation.
+  /// Incremental compilation is basically calling [run] more than once.
+  final bool hasIncrementalSupport;
+
   api.CompilerOutputProvider outputProvider;
 
   bool disableInlining = false;
@@ -570,6 +635,8 @@
   LibraryElement coreLibrary;
   LibraryElement isolateLibrary;
   LibraryElement isolateHelperLibrary;
+  // TODO(johnniwinther): Move JavaScript specific libraries to the JavaScript
+  // backend.
   LibraryElement jsHelperLibrary;
   LibraryElement interceptorsLibrary;
   LibraryElement foreignLibrary;
@@ -603,6 +670,9 @@
   /// The constant for the [proxy] variable defined in dart:core.
   Constant proxyConstant;
 
+  /// The constant for the [patch] variable defined in dart:_js_helper.
+  Constant patchConstant;
+
   // Initialized after symbolClass has been resolved.
   FunctionElement symbolConstructor;
 
@@ -692,7 +762,7 @@
   DietParserTask dietParser;
   ParserTask parser;
   PatchParserTask patchParser;
-  LibraryLoader libraryLoader;
+  LibraryLoaderTask libraryLoader;
   TreeValidatorTask validator;
   ResolverTask resolver;
   closureMapping.ClosureTask closureToClassMapper;
@@ -767,7 +837,7 @@
             this.enableUserAssertions: false,
             this.trustTypeAnnotations: false,
             this.enableConcreteTypeInference: false,
-            this.disableTypeInferenceFlag: false,
+            bool disableTypeInferenceFlag: false,
             this.maxConcreteTypeSize: 5,
             this.enableMinification: false,
             this.enableNativeLiveTypeAnalysis: false,
@@ -775,6 +845,7 @@
             bool generateSourceMap: true,
             bool analyzeAllFlag: false,
             bool analyzeOnly: false,
+            this.analyzeMain: false,
             bool analyzeSignaturesOnly: false,
             this.preserveComments: false,
             this.verbose: false,
@@ -786,16 +857,22 @@
             this.showPackageWarnings: false,
             this.useContentSecurityPolicy: false,
             this.suppressWarnings: false,
+            bool hasIncrementalSupport: false,
             outputProvider,
             List<String> strips: const []})
-      : this.analyzeOnly =
+      : this.disableTypeInferenceFlag =
+          disableTypeInferenceFlag || !emitJavaScript,
+        this.analyzeOnly =
             analyzeOnly || analyzeSignaturesOnly || analyzeAllFlag,
         this.analyzeSignaturesOnly = analyzeSignaturesOnly,
         this.analyzeAllFlag = analyzeAllFlag,
+        this.hasIncrementalSupport = hasIncrementalSupport,
+        cacheStrategy = new CacheStrategy(hasIncrementalSupport),
         this.outputProvider = (outputProvider == null)
             ? NullSink.outputProvider
             : outputProvider {
     world = new World(this);
+    types = new Types(this);
     tracer = new Tracer(this.outputProvider);
 
     closureMapping.ClosureNamer closureNamer;
@@ -954,35 +1031,95 @@
 
   bool hasIsolateSupport() => isolateLibrary != null;
 
-  /**
-   * This method is called before [library] import and export scopes have been
-   * set up.
-   */
-  Future onLibraryLoaded(LibraryElement library, Uri uri) {
-    if (uri == new Uri(scheme: 'dart', path: 'mirrors')) {
-      mirrorsLibrary = library;
-      mirrorSystemClass =
-          findRequiredElement(library, 'MirrorSystem');
-      mirrorsUsedClass =
-          findRequiredElement(library, 'MirrorsUsed');
-    } else if (uri == new Uri(scheme: 'dart', path: '_native_typed_data')) {
-      typedDataLibrary = library;
-      typedDataClass =
-          findRequiredElement(library, 'NativeTypedData');
-    } else if (uri == new Uri(scheme: 'dart', path: '_internal')) {
-      symbolImplementationClass =
-          findRequiredElement(library, 'Symbol');
-    } else if (uri == new Uri(scheme: 'dart', path: 'async')) {
-      deferredLibraryClass =
-          findRequiredElement(library, 'DeferredLibrary');
-    } else if (isolateHelperLibrary == null
-	       && (uri == new Uri(scheme: 'dart', path: '_isolate_helper'))) {
-      isolateHelperLibrary = library;
-    } else if (foreignLibrary == null
-	       && (uri == new Uri(scheme: 'dart', path: '_foreign_helper'))) {
+  /// This method is called immediately after the [LibraryElement] [library] has
+  /// been created.
+  ///
+  /// Use this callback method to store references to specific libraries.
+  /// Note that [library] has not been scanned yet, nor has its imports/exports
+  /// been resolved.
+  void onLibraryCreated(LibraryElement library) {
+    Uri uri = library.canonicalUri;
+    if (uri == DART_CORE) {
+      coreLibrary = library;
+    } else if (uri == DART_JS_HELPER) {
+      jsHelperLibrary = library;
+    } else if (uri == DART_INTERCEPTORS) {
+      interceptorsLibrary = library;
+    } else if (uri == DART_FOREIGN_HELPER) {
       foreignLibrary = library;
+    } else if (uri == DART_ISOLATE_HELPER) {
+      isolateHelperLibrary = library;
+    } else if (uri == DART_NATIVE_TYPED_DATA) {
+      typedDataLibrary = library;
+    } else if (uri == DART_MIRRORS) {
+      mirrorsLibrary = library;
     }
-    return backend.onLibraryLoaded(library, uri);
+    backend.onLibraryCreated(library);
+  }
+
+  /// This method is called immediately after the [library] and its parts have
+  /// been scanned.
+  ///
+  /// Use this callback method to store references to specific member declared
+  /// in certain libraries. Note that [library] has not been patched yet, nor
+  /// has its imports/exports been resolved.
+  ///
+  /// Use [loader] to register the creation and scanning of a patch library
+  /// for [library].
+  Future onLibraryScanned(LibraryElement library, LibraryLoader loader) {
+    Uri uri = library.canonicalUri;
+    if (uri == DART_CORE) {
+      initializeCoreClasses();
+      identicalFunction = coreLibrary.find('identical');
+    } else if (uri == DART_JS_HELPER) {
+      initializeHelperClasses();
+      assertMethod = jsHelperLibrary.find('assertHelper');
+    } else if (uri == DART_INTERNAL) {
+      symbolImplementationClass = findRequiredElement(library, 'Symbol');
+    } else if (uri == DART_MIRRORS) {
+      mirrorSystemClass = findRequiredElement(library, 'MirrorSystem');
+      mirrorsUsedClass = findRequiredElement(library, 'MirrorsUsed');
+    } else if (uri == DART_ASYNC) {
+      deferredLibraryClass = findRequiredElement(library, 'DeferredLibrary');
+    } else if (uri == DART_NATIVE_TYPED_DATA) {
+      typedDataClass = findRequiredElement(library, 'NativeTypedData');
+    }
+    return backend.onLibraryScanned(library, loader);
+  }
+
+  /// This method is called when all new libraries loaded through
+  /// [LibraryLoader.loadLibrary] has been loaded and their imports/exports
+  /// have been computed.
+  ///
+  /// [loadedLibraries] contains the newly loaded libraries.
+  ///
+  /// The method returns a [Future] allowing for the loading of additional
+  /// libraries.
+  Future onLibrariesLoaded(Map<Uri, LibraryElement> loadedLibraries) {
+    return new Future.sync(() {
+      if (!loadedLibraries.containsKey(DART_CORE)) return new Future.value();
+
+      functionClass.ensureResolved(this);
+      functionApplyMethod = functionClass.lookupLocalMember('apply');
+
+      proxyConstant =
+          resolver.constantCompiler.compileConstant(coreLibrary.find('proxy'));
+
+      patchConstant = resolver.constantCompiler.compileConstant(
+          jsHelperLibrary.find('patch'));
+
+      if (jsInvocationMirrorClass != null) {
+        jsInvocationMirrorClass.ensureResolved(this);
+        invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember(INVOKE_ON);
+      }
+
+      if (preserveComments) {
+        return libraryLoader.loadLibrary(DART_MIRRORS)
+            .then((LibraryElement libraryElement) {
+          documentClass = libraryElement.find('Comment');
+        });
+      }
+    }).then((_) => backend.onLibrariesLoaded(loadedLibraries));
   }
 
   Element findRequiredElement(LibraryElement library, String name) {
@@ -1016,9 +1153,7 @@
     }
   }
 
-  Future<LibraryElement> scanBuiltinLibrary(String filename);
-
-  void initializeSpecialClasses() {
+  void initializeCoreClasses() {
     final List missingCoreClasses = [];
     ClassElement lookupCoreClass(String name) {
       ClassElement result = coreLibrary.find(name);
@@ -1049,7 +1184,9 @@
     // TODO(ahe): It is possible that we have to require the presence
     // of Symbol as we change how we implement noSuchMethod.
     symbolClass = lookupCoreClass('Symbol');
+  }
 
+  void initializeHelperClasses() {
     final List missingHelperClasses = [];
     ClassElement lookupHelperClass(String name) {
       ClassElement result = jsHelperLibrary.find(name);
@@ -1066,14 +1203,6 @@
           'dart:_js_helper library does not contain required classes: '
           '$missingHelperClasses');
     }
-
-    if (types == null) {
-      types = new Types(this);
-    }
-    backend.initializeHelperClasses();
-
-    proxyConstant =
-        resolver.constantCompiler.compileConstant(coreLibrary.find('proxy'));
   }
 
   Element _unnamedListConstructor;
@@ -1094,40 +1223,6 @@
         listClass.lookupConstructor(callConstructor);
   }
 
-  Future scanBuiltinLibraries() {
-    return scanBuiltinLibrary('_js_helper').then((LibraryElement library) {
-      jsHelperLibrary = library;
-      return scanBuiltinLibrary('_interceptors');
-    }).then((LibraryElement library) {
-      interceptorsLibrary = library;
-
-      assertMethod = jsHelperLibrary.find('assertHelper');
-      identicalFunction = coreLibrary.find('identical');
-
-      initializeSpecialClasses();
-
-      functionClass.ensureResolved(this);
-      functionApplyMethod =
-          functionClass.lookupLocalMember('apply');
-      jsInvocationMirrorClass.ensureResolved(this);
-      invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember(INVOKE_ON);
-
-      if (preserveComments) {
-        var uri = new Uri(scheme: 'dart', path: 'mirrors');
-        return libraryLoader.loadLibrary(uri, null, uri).then(
-            (LibraryElement libraryElement) {
-          documentClass = libraryElement.find('Comment');
-        });
-      }
-    });
-  }
-
-  void importHelperLibrary(LibraryElement library) {
-    if (jsHelperLibrary != null) {
-      libraryLoader.importLibrary(library, jsHelperLibrary, null);
-    }
-  }
-
   /**
    * Get an [Uri] pointing to a patch for the dart: library with
    * the given path. Returns null if there is no patch.
@@ -1144,11 +1239,11 @@
     TypedSelector.canonicalizedValues.clear();
 
     assert(uri != null || analyzeOnly);
-    return scanBuiltinLibraries().then((_) {
+    return new Future.sync(() {
       if (librariesToAnalyzeWhenRun != null) {
         return Future.forEach(librariesToAnalyzeWhenRun, (libraryUri) {
           log('Analyzing $libraryUri ($buildId)');
-          return libraryLoader.loadLibrary(libraryUri, null, libraryUri);
+          return libraryLoader.loadLibrary(libraryUri);
         });
       }
     }).then((_) {
@@ -1158,13 +1253,16 @@
         } else {
           log('Compiling $uri ($buildId)');
         }
-        return libraryLoader.loadLibrary(uri, null, uri)
-            .then((LibraryElement library) {
+        return libraryLoader.loadLibrary(uri).then((LibraryElement library) {
           mainApp = library;
         });
       }
     }).then((_) {
-      compileLoadedLibraries();
+      if (!compilationFailed) {
+        // TODO(johnniwinther): Reenable analysis of programs with load failures
+        // when these are handled as erroneous libraries/compilation units.
+        compileLoadedLibraries();
+      }
     });
   }
 
@@ -1188,7 +1286,7 @@
                        "library."});
         }
       } else {
-        if (main.isErroneous) {
+        if (main.isErroneous && main.isSynthesized) {
           reportFatalError(main, MessageKind.GENERIC,
               {'text': "Cannot determine which '$MAIN' to use."});
         } else if (!main.isFunction) {
@@ -1222,6 +1320,8 @@
         log('Enqueuing $uri');
         fullyEnqueueLibrary(lib, enqueuer.resolution);
       });
+    } else if (analyzeMain && mainApp != null) {
+      fullyEnqueueLibrary(mainApp, enqueuer.resolution);
     }
     // Elements required by enqueueHelpers are global dependencies
     // that are not pulled in by a particular element.
@@ -1376,7 +1476,7 @@
       });
     }
     if (!REPORT_EXCESS_RESOLUTION) return;
-    var resolved = new Set.from(enqueuer.resolution.resolvedElements.keys);
+    var resolved = new Set.from(enqueuer.resolution.resolvedElements);
     for (Element e in enqueuer.codegen.generatedCode.keys) {
       resolved.remove(e);
     }
@@ -1408,7 +1508,7 @@
     }
   }
 
-  TreeElements analyzeElement(Element element) {
+  void analyzeElement(Element element) {
     assert(invariant(element,
            element.impliesType ||
            element.isField ||
@@ -1421,23 +1521,23 @@
         message: 'Element $element is not analyzable.'));
     assert(invariant(element, element.isDeclaration));
     ResolutionEnqueuer world = enqueuer.resolution;
-    TreeElements elements = world.getCachedElements(element);
-    if (elements != null) return elements;
+    if (world.hasBeenResolved(element)) return;
     assert(parser != null);
     Node tree = parser.parse(element);
     assert(invariant(element, !element.isSynthesized || tree == null));
     if (tree != null) validator.validate(tree);
-    elements = resolver.resolve(element);
-    if (tree != null && elements != null && !analyzeSignaturesOnly &&
-        !suppressWarnings) {
-      // Only analyze nodes with a corresponding [TreeElements].
-      checker.check(elements);
+    TreeElements elements = resolver.resolve(element);
+    if (elements != null) {
+      if (tree != null && !analyzeSignaturesOnly &&
+          !suppressWarnings) {
+        // Only analyze nodes with a corresponding [TreeElements].
+        checker.check(elements);
+      }
+      world.registerResolvedElement(element);
     }
-    world.resolvedElements[element] = elements;
-    return elements;
   }
 
-  TreeElements analyze(ResolutionWorkItem work, ResolutionEnqueuer world) {
+  void analyze(ResolutionWorkItem work, ResolutionEnqueuer world) {
     assert(invariant(work.element, identical(world, enqueuer.resolution)));
     assert(invariant(work.element, !work.isAnalyzed(),
         message: 'Element ${work.element} has already been analyzed'));
@@ -1450,12 +1550,10 @@
         progress.reset();
       }
     }
-    Element element = work.element;
-    TreeElements result = world.getCachedElements(element);
-    if (result != null) return result;
-    result = analyzeElement(element);
-    backend.onElementResolved(element, result);
-    return result;
+    AstElement element = work.element;
+    if (world.hasBeenResolved(element)) return;
+    analyzeElement(element);
+    backend.onElementResolved(element, element.resolvedAst.elements);
   }
 
   void codegen(CodegenWorkItem work, CodegenEnqueuer world) {
@@ -1574,10 +1672,11 @@
   }
 
   SourceSpan spanFromElement(Element element) {
-    if (Elements.isErroneousElement(element)) {
+    while (element != null && element.isSynthesized) {
       element = element.enclosingElement;
     }
-    if (element.position == null &&
+    if (element != null &&
+        element.position == null &&
         !element.isLibrary &&
         !element.isCompilationUnit) {
       // Sometimes, the backend fakes up elements that have no
@@ -1794,6 +1893,7 @@
 class CompilerTask {
   final Compiler compiler;
   final Stopwatch watch;
+  UserTag profilerTag;
 
   CompilerTask(Compiler compiler)
       : this.compiler = compiler,
@@ -1802,17 +1902,25 @@
   String get name => 'Unknown task';
   int get timing => (watch != null) ? watch.elapsedMilliseconds : 0;
 
+  UserTag getProfilerTag() {
+    if (profilerTag == null) profilerTag = new UserTag(name);
+    return profilerTag;
+  }
+
   measure(action()) {
+    // In verbose mode when watch != null.
     if (watch == null) return action();
     CompilerTask previous = compiler.measuredTask;
     if (identical(this, previous)) return action();
     compiler.measuredTask = this;
     if (previous != null) previous.watch.stop();
     watch.start();
+    UserTag oldTag = getProfilerTag().makeCurrent();
     try {
       return action();
     } finally {
       watch.stop();
+      oldTag.makeCurrent();
       if (previous != null) previous.watch.start();
       compiler.measuredTask = previous;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/constant_system.dart b/sdk/lib/_internal/compiler/implementation/constant_system.dart
index 4a10d40..dd92ffe 100644
--- a/sdk/lib/_internal/compiler/implementation/constant_system.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system.dart
@@ -53,6 +53,8 @@
   Constant createString(DartString string);
   Constant createBool(bool value);
   Constant createNull();
+  Constant createMap(Compiler compiler, InterfaceType type,
+                     List<Constant> keys, List<Constant> values);
 
   // We need to special case the subtype check for JavaScript constant
   // system because an int is a double at runtime.
diff --git a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
index df33125..19e084e 100644
--- a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
@@ -352,6 +352,10 @@
   StringConstant createString(DartString string) => new StringConstant(string);
   BoolConstant createBool(bool value) => new BoolConstant(value);
   NullConstant createNull() => new NullConstant();
+  MapConstant createMap(Compiler compiler, InterfaceType type,
+                        List<Constant> keys, List<Constant> values) {
+    return new MapConstant(type, keys, values);
+  }
 
   bool isInt(Constant constant) => constant.isInt;
   bool isDouble(Constant constant) => constant.isDouble;
diff --git a/sdk/lib/_internal/compiler/implementation/constants.dart b/sdk/lib/_internal/compiler/implementation/constants.dart
index d0b9d14..37da003 100644
--- a/sdk/lib/_internal/compiler/implementation/constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/constants.dart
@@ -342,7 +342,7 @@
   accept(ConstantVisitor visitor) => visitor.visitString(this);
 
   String toString() {
-    return 'StringConstant(${Error.safeToString(value.slowToString())})';
+    return 'StringConstant("${value.slowToString()}")';
   }
 }
 
@@ -378,7 +378,7 @@
 
   accept(ConstantVisitor visitor) => visitor.visitType(this);
 
-  String toString() => 'TypeConstant(${Error.safeToString(representedType)})';
+  String toString() => 'TypeConstant(${representedType})';
 }
 
 class ListConstant extends ObjectConstant {
@@ -428,7 +428,7 @@
     sb.write('ListConstant([');
     for (int i = 0 ; i < entries.length ; i++) {
       if (i > 0) sb.write(',');
-      sb.write(Error.safeToString(entries[i]));
+      sb.write(entries[i]);
     }
     sb.write('])');
     return sb.toString();
@@ -436,40 +436,28 @@
 }
 
 class MapConstant extends ObjectConstant {
-  /**
-   * The [PROTO_PROPERTY] must not be used as normal property in any JavaScript
-   * object. It would change the prototype chain.
-   */
-  static const LiteralDartString PROTO_PROPERTY =
-      const LiteralDartString("__proto__");
-
-  /** The dart class implementing constant map literals. */
-  static const String DART_CLASS = "ConstantMap";
-  static const String DART_STRING_CLASS = "ConstantStringMap";
-  static const String DART_PROTO_CLASS = "ConstantProtoMap";
-  static const String DART_GENERAL_CLASS = "GeneralConstantMap";
-  static const String LENGTH_NAME = "length";
-  static const String JS_OBJECT_NAME = "_jsObject";
-  static const String KEYS_NAME = "_keys";
-  static const String PROTO_VALUE = "_protoValue";
-  static const String JS_DATA_NAME = "_jsData";
-
-  final ListConstant keys;
+  final List<Constant> keys;
   final List<Constant> values;
-  final Constant protoValue;
   final int hashCode;
-  final bool onlyStringKeys;
 
-  MapConstant(DartType type, this.keys, List<Constant> values, this.protoValue,
-              this.onlyStringKeys)
-      : this.values = values,
-        this.hashCode = computeHash(type, values),
-        super(type);
+  MapConstant(DartType type, List<Constant> keys, List<Constant> values)
+      : this.keys = keys,
+        this.values = values,
+        this.hashCode = computeHash(type, keys, values),
+        super(type) {
+    assert(keys.length == values.length);
+  }
+
   bool get isMap => true;
 
-  static int computeHash(DartType type, List<Constant> values) {
+  static int computeHash(DartType type,
+                         List<Constant> keys,
+                         List<Constant> values) {
     // TODO(floitsch): create a better hash.
     int hash = 0;
+    for (Constant key in keys) {
+      hash ^= key.hashCode;
+    }
     for (Constant value in values) {
       hash ^= value.hashCode;
     }
@@ -486,8 +474,9 @@
     MapConstant otherMap = other;
     if (hashCode != otherMap.hashCode) return false;
     if (type != other.type) return false;
-    if (keys != otherMap.keys) return false;
-    for (int i = 0; i < values.length; i++) {
+    if (length != other.length) return false;
+    for (int i = 0; i < length; i++) {
+      if (keys[i] != otherMap.keys[i]) return false;
       if (values[i] != otherMap.values[i]) return false;
     }
     return true;
@@ -495,13 +484,7 @@
 
   List<Constant> getDependencies() {
     List<Constant> result = <Constant>[];
-    if (onlyStringKeys) {
-      result.add(keys);
-    } else {
-      // Add the keys individually to avoid generating a unused list constant
-      // for the keys.
-      result.addAll(keys.entries);
-    }
+    result.addAll(keys);
     result.addAll(values);
     return result;
   }
@@ -513,11 +496,11 @@
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write('MapConstant({');
-    for (int i = 0 ; i < keys.entries.length ; i++) {
+    for (int i = 0; i < length; i++) {
       if (i > 0) sb.write(',');
-      sb.write(Error.safeToString(keys.entries[i]));
+      sb.write(keys[i]);
       sb.write(':');
-      sb.write(Error.safeToString(values[i]));
+      sb.write(values[i]);
     }
     sb.write('})');
     return sb.toString();
@@ -586,7 +569,8 @@
   final List<Constant> fields;
   final int hashCode;
 
-  ConstructedConstant(DartType type, List<Constant> fields)
+  ConstructedConstant(DartType type, List<Constant> fields,
+      {this.isLiteralSymbol: false})
     : this.fields = fields,
       hashCode = computeHash(type, fields),
       super(type) {
@@ -594,6 +578,9 @@
   }
   bool get isConstructedObject => true;
 
+  /// True if this constant is constructed as a literal symbol.
+  final bool isLiteralSymbol;
+
   static int computeHash(DartType type, List<Constant> fields) {
     // TODO(floitsch): create a better hash.
     int hash = 0;
@@ -646,9 +633,9 @@
     int i = 0;
     fieldElements.forEach((Element field, Constant value) {
       if (i > 0) sb.write(',');
-      sb.write(Error.safeToString(field.name));
+      sb.write(field.name);
       sb.write('=');
-      sb.write(Error.safeToString(value));
+      sb.write(value);
       i++;
     });
     sb.write('))');
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index 1632c48..7fe9a7a 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -54,11 +54,14 @@
  * For example, in ['--out=fisk.js'] and ['-ohest.js'], the parameters
  * are ['fisk.js'] and ['hest.js'], respectively.
  */
-String extractParameter(String argument) {
+String extractParameter(String argument, {bool isOptionalArgument: false}) {
   // m[0] is the entire match (which will be equal to argument). m[1]
   // is something like "-o" or "--out=", and m[2] is the parameter.
   Match m = new RegExp('^(-[a-z]|--.+=)(.*)').firstMatch(argument);
-  if (m == null) helpAndFail('Unknown option "$argument".');
+  if (m == null) {
+    if (isOptionalArgument) return null;
+    helpAndFail('Unknown option "$argument".');
+  }
   return m[2];
 }
 
@@ -73,7 +76,7 @@
   for (OptionHandler handler in handlers) {
     patterns.add(handler.pattern);
   }
-  var pattern = new RegExp('^(${patterns.join(")\$|(")})\$');
+  var pattern = new RegExp('^(${patterns.join(")\$|^(")})\$');
 
   Iterator<String> arguments = argv.iterator;
   OUTER: while (arguments.moveNext()) {
@@ -224,6 +227,14 @@
     passThrough('--categories=${categories.join(",")}');
   }
 
+  void handleThrowOnError(String argument) {
+    diagnosticHandler.throwOnError = true;
+    String parameter = extractParameter(argument, isOptionalArgument: true);
+    if (parameter != null) {
+      diagnosticHandler.throwOnErrorCount = int.parse(parameter);
+    }
+  }
+
   handleShortOptions(String argument) {
     var shortOptions = argument.substring(1).split("");
     for (var shortOption in shortOptions) {
@@ -261,8 +272,7 @@
   List<String> arguments = <String>[];
   List<OptionHandler> handlers = <OptionHandler>[
     new OptionHandler('-[chvm?]+', handleShortOptions),
-    new OptionHandler('--throw-on-error',
-                      (_) => diagnosticHandler.throwOnError = true),
+    new OptionHandler('--throw-on-error(?:=[0-9]+)?', handleThrowOnError),
     new OptionHandler('--suppress-warnings', (_) {
       diagnosticHandler.showWarnings = false;
       passThrough('--suppress-warnings');
@@ -407,9 +417,9 @@
             " \"Content-Security-Policy: script-src 'self'\"");
       } else if (extension == 'js.map' || extension == 'dart.map') {
         uri = sourceMapOut;
-      } else if (extension == 'info.html') {
+      } else if (extension == 'info.html' || extension == "info.json") {
         String outName = out.path.substring(out.path.lastIndexOf('/') + 1);
-        uri = out.resolve('${outName}.$extension');
+        uri = out.resolve('$outName.$extension');
       } else {
         fail('Unknown extension: $extension');
       }
diff --git a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
index 1a6f5f4..4191cd7 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
@@ -7,6 +7,9 @@
 import 'dart:async';
 import 'dart:collection' show Queue;
 
+import 'dart:profiler' show
+    UserTag;
+
 import 'closure.dart' as closureMapping;
 import 'dart_backend/dart_backend.dart' as dart_backend;
 import 'dart_types.dart';
@@ -22,6 +25,9 @@
          DeferredLoaderGetterElementX;
 import 'helpers/helpers.dart';
 import 'js_backend/js_backend.dart' as js_backend;
+import 'library_loader.dart'
+    show LibraryLoader,
+         LibraryLoaderTask;
 import 'native_handler.dart' as native;
 import 'scanner/scannerlib.dart';
 import 'ssa/ssa.dart';
@@ -41,6 +47,7 @@
 import 'mirrors_used.dart' show MirrorUsageAnalyzerTask;
 import 'dump_info.dart';
 import 'tracer.dart' show Tracer;
+import 'cache_strategy.dart';
 
 export 'resolution/resolution.dart' show TreeElements, TreeElementMapping;
 export 'scanner/scannerlib.dart' show isUserDefinableOperator,
@@ -63,7 +70,6 @@
 part 'constant_system_dart.dart';
 part 'diagnostic_listener.dart';
 part 'enqueue.dart';
-part 'library_loader.dart';
 part 'resolved_visitor.dart';
 part 'script.dart';
 part 'tree_validator.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index cd15e94..ae356cb 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -11,7 +11,10 @@
   final Node ast;
   final TreeElements treeElements;
 
-  ElementAst(this.ast, this.treeElements);
+  ElementAst(AstElement element)
+      : this.internal(element.resolvedAst.node, element.resolvedAst.elements);
+
+  ElementAst.internal(this.ast, this.treeElements);
 }
 
 class DartBackend extends Backend {
@@ -42,7 +45,7 @@
   /// field is set.
   Element mirrorHelperSymbolsMap;
 
-  Map<Element, TreeElements> get resolvedElements =>
+  Iterable<Element> get resolvedElements =>
       compiler.enqueuer.resolution.resolvedElements;
 
   ConstantSystem get constantSystem {
@@ -87,11 +90,11 @@
       if (type is InterfaceType) {
         InterfaceType interfaceType = type;
         // Check all type arguments.
-        workQueue.addAll(interfaceType.typeArguments.toList());
+        interfaceType.typeArguments.forEach(workQueue.add);
         ClassElement element = type.element;
         // Check all supertypes.
         if (element.allSupertypes != null) {
-          workQueue.addAll(element.allSupertypes.toList());
+          element.allSupertypes.forEach(workQueue.add);
         }
       }
     }
@@ -137,12 +140,17 @@
 
   void codegen(CodegenWorkItem work) { }
 
-  bool isUserLibrary(LibraryElement lib) {
-    final INTERNAL_HELPERS = [
-      compiler.jsHelperLibrary,
-      compiler.interceptorsLibrary,
-    ];
-    return INTERNAL_HELPERS.indexOf(lib) == -1 && !lib.isPlatformLibrary;
+  bool isUserLibrary(LibraryElement lib) => !lib.isPlatformLibrary;
+
+  /**
+   * Tells whether we should output given element. Corelib classes like
+   * Object should not be in the resulting code.
+   */
+  bool shouldOutput(Element element) {
+    return (isUserLibrary(element.library) &&
+            !element.isSynthesized &&
+            element is !AbstractFieldElement)
+        || element.library == mirrorHelperLibrary;
   }
 
   void assembleProgram() {
@@ -186,10 +194,10 @@
     }
     // As of now names of named optionals are not renamed. Therefore add all
     // field names used as named optionals into [fixedMemberNames].
-    for (final element in resolvedElements.keys) {
+    for (final element in resolvedElements) {
       if (!element.isConstructor) continue;
       Link<Element> optionalParameters =
-          element.computeSignature(compiler).optionalParameters;
+          element.functionSignature.optionalParameters;
       for (final optional in optionalParameters) {
         if (optional.kind != ElementKind.FIELD_PARAMETER) continue;
         fixedMemberNames.add(optional.name);
@@ -210,20 +218,9 @@
       useMirrorHelperLibrary = false;
     }
 
-    /**
-     * Tells whether we should output given element. Corelib classes like
-     * Object should not be in the resulting code.
-     */
-    bool shouldOutput(Element element) {
-      return (isUserLibrary(element.library)
-          && !element.isSynthesized
-          && element is !AbstractFieldElement)
-          || element.library == mirrorHelperLibrary;
-    }
-
     final elementAsts = new Map<Element, ElementAst>();
 
-    ElementAst parse(AstElement element, TreeElements treeElements) {
+    ElementAst parse(AstElement element) {
       Node node;
       if (!compiler.irBuilder.hasIr(element)) {
         node = element.node;
@@ -234,14 +231,16 @@
         assert(definition != null);
         compiler.tracer.traceCompilation(element.name, null, compiler);
         compiler.tracer.traceGraph('Tree builder', definition);
-        treeElements = new TreeElementMapping(element);
+        TreeElementMapping treeElements = new TreeElementMapping(element);
         new tree.StatementRewriter().rewrite(definition);
         compiler.tracer.traceGraph('Statement rewriter', definition);
+        new tree.LoopRewriter().rewrite(definition);
+        compiler.tracer.traceGraph('Loop rewriter', definition);
         new tree.LogicalRewriter().rewrite(definition);
         compiler.tracer.traceGraph('Logical rewriter', definition);
         node = dart_codegen.emit(element, treeElements, definition);
       }
-      return new ElementAst(node, treeElements);
+      return new ElementAst(element);
     }
 
     Set<Element> topLevelElements = new Set<Element>();
@@ -269,16 +268,13 @@
     }
 
     addClass(ClassElement classElement) {
-      addTopLevel(classElement,
-                  new ElementAst(classElement.node,
-                                 classElement.treeElements));
+      addTopLevel(classElement, new ElementAst(classElement));
       classMembers.putIfAbsent(classElement, () => new Set());
     }
 
     newTypedefElementCallback = (TypedefElement element) {
       if (!shouldOutput(element)) return;
-      addTopLevel(element, new ElementAst(element.node,
-                                          element.treeElements));
+      addTopLevel(element, new ElementAst(element));
     };
     newClassElementCallback = (ClassElement classElement) {
       if (!shouldOutput(classElement)) return;
@@ -289,9 +285,12 @@
         (ClassElement classElement) {
       if (shouldOutput(classElement)) addClass(classElement);
     });
-    resolvedElements.forEach((element, treeElements) {
-      if (!shouldOutput(element) || treeElements == null) return;
-      ElementAst elementAst = parse(element, treeElements);
+    resolvedElements.forEach((element) {
+      if (!shouldOutput(element) ||
+          !compiler.enqueuer.resolution.hasBeenResolved(element)) {
+        return;
+      }
+      ElementAst elementAst = parse(element);
 
       if (element.isMember) {
         ClassElement enclosingClass = element.enclosingClass;
@@ -354,7 +353,7 @@
           null, Modifiers.EMPTY, null, null);
 
       elementAsts[constructor] =
-          new ElementAst(node, new TreeElementMapping(null));
+          new ElementAst.internal(node, new TreeElementMapping(null));
     }
 
     // Create all necessary placeholders.
@@ -459,10 +458,13 @@
 
   log(String message) => compiler.log('[DartBackend] $message');
 
-  Future onLibraryLoaded(LibraryElement library, Uri uri) {
-    if (useMirrorHelperLibrary && library == compiler.mirrorsLibrary) {
-      return compiler.scanBuiltinLibrary(
-          MirrorRenamer.MIRROR_HELPER_LIBRARY_NAME).
+  Future onLibrariesLoaded(Map<Uri, LibraryElement> loadedLibraries) {
+    if (useMirrorHelperLibrary &&
+        loadedLibraries.containsKey(Compiler.DART_MIRRORS)) {
+      return compiler.libraryLoader.loadLibrary(
+          compiler.translateResolvedUri(
+              loadedLibraries[Compiler.DART_MIRRORS],
+              MirrorRenamer.DART_MIRROR_HELPER, null)).
           then((LibraryElement element) {
         mirrorHelperLibrary = element;
         mirrorHelperGetNameFunction = mirrorHelperLibrary.find(
@@ -474,9 +476,7 @@
     return new Future.value();
   }
 
-  void registerTypeLiteral(DartType type,
-                           Enqueuer enqueuer,
-                           Registry registry) {
+  void onTypeLiteral(DartType type, Registry registry) {
     if (type.isInterfaceType) {
       usedTypeLiterals.add(type.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 8738ec6..45c11e1 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
@@ -28,8 +28,12 @@
   /// Variables to be hoisted at the top of the current function.
   List<VariableDeclaration> variables;
 
-  /// Set of variables that have had their declaration inserted in [variables].
-  Set<tree.Variable> seenVariables;
+  /// Maps variables to their name.
+  /// These variables have had their declaration inserted in [variables].
+  Map<tree.Variable, String> variableNames;
+
+  /// Variable names that have already been used. Used to avoid name clashes.
+  Set<String> usedVariableNames;
 
   /// Statements emitted by the most recent call to [visitStatement].
   List<Statement> statementBuffer;
@@ -53,8 +57,8 @@
     functionElement = element;
     variables = <VariableDeclaration>[];
     statementBuffer = <Statement>[];
-    seenVariables = new Set<tree.Variable>();
-    tree.Variable.counter = 0;
+    variableNames = <tree.Variable, String>{};
+    usedVariableNames = new Set<String>();
     variableList = new modelx.VariableList(tree.Modifiers.EMPTY);
     fallthrough = null;
     usedLabels = new Set<tree.Label>();
@@ -74,7 +78,8 @@
     statementBuffer = null;
     functionElement = null;
     variableList = null;
-    seenVariables = null;
+    variableNames = null;
+    usedVariableNames = null;
     usedLabels = null;
 
     return new FunctionExpression(
@@ -96,12 +101,28 @@
     }
   }
 
+  Parameter emitParameterFromElement(ParameterElement element, [String name]) {
+    if (name == null) {
+      name = element.name;
+    }
+    if (element.functionSignature != null) {
+      FunctionSignature signature = element.functionSignature;
+      TypeAnnotation returnType = emitOptionalType(signature.type.returnType);
+      Parameters innerParameters = new Parameters(
+          signature.requiredParameters.mapToList(emitParameterFromElement),
+          signature.optionalParameters.mapToList(emitParameterFromElement),
+          signature.optionalParametersAreNamed);
+      return new Parameter.function(name, returnType, innerParameters)
+                 ..element = element;
+    } else {
+      TypeAnnotation type = emitOptionalType(element.type);
+      return new Parameter(name, type:type)
+                 ..element = element;
+    }
+  }
+
   Parameter emitParameter(tree.Variable param) {
-    seenVariables.add(param);
-    ParameterElement element = param.element;
-    TypeAnnotation type = emitOptionalType(element.type);
-    return new Parameter(element.name, type:type)
-               ..element = element;
+    return emitParameterFromElement(param.element, getVariableName(param));
   }
 
   Parameters emitParameters(List<tree.Variable> params) {
@@ -174,20 +195,40 @@
     visitStatement(stmt.next);
   }
 
-  void visitAssign(tree.Assign stmt) {
-    // Synthesize an element for the variable, if necessary.
-    if (stmt.variable.element == null) {
-      stmt.variable.element = new modelx.VariableElementX(
-          stmt.variable.name,
+  /// Generates a name for the given variable and synthesizes an element for it,
+  /// if necessary.
+  String getVariableName(tree.Variable variable) {
+    String name = variableNames[variable];
+    if (name != null) {
+      return name;
+    }
+    String prefix = variable.element == null ? 'v' : variable.element.name;
+    int counter = 0;
+    name = variable.element == null ? '$prefix$counter' : variable.element.name;
+    while (!usedVariableNames.add(name)) {
+      ++counter;
+      name = '$prefix$counter';
+    }
+    variableNames[variable] = name;
+
+    // Synthesize an element for the variable
+    if (variable.element == null || name != variable.element.name) {
+      variable.element = new modelx.VariableElementX(
+          name,
           ElementKind.VARIABLE,
           functionElement,
           variableList,
           null);
     }
-    if (seenVariables.add(stmt.variable)) {
-      variables.add(new VariableDeclaration(stmt.variable.name)
-                            ..element = stmt.variable.element);
+    if (variable.element is! ParameterElement) {
+      variables.add(new VariableDeclaration(name)
+                        ..element = variable.element);
     }
+    return name;
+  }
+
+  void visitAssign(tree.Assign stmt) {
+    String name = getVariableName(stmt.variable);
     statementBuffer.add(new ExpressionStatement(makeAssignment(
         visitVariable(stmt.variable),
         visitExpression(stmt.definition))));
@@ -212,7 +253,15 @@
   }
 
   void visitContinue(tree.Continue stmt) {
-    statementBuffer.add(new Continue(stmt.target.name));
+    tree.Statement fall = fallthrough;
+    if (stmt.target.binding == fall) {
+      // Fall through to continue target
+    } else if (fall is tree.Continue && fall.target == stmt.target) {
+      // Fall through to equivalent continue
+    } else {
+      usedLabels.add(stmt.target);
+      statementBuffer.add(new Continue(stmt.target.name));
+    }
   }
 
   void visitIf(tree.If stmt) {
@@ -227,28 +276,72 @@
     statementBuffer = savedBuffer;
   }
 
-  void visitWhile(tree.While stmt) {
-    Expression condition = new Literal(new dart2js.BoolConstant(true));
+  void visitWhileTrue(tree.WhileTrue stmt) {
+    List<Expression> updates = stmt.updates.reversed
+                                           .map(visitExpression)
+                                           .toList(growable:false);
+
     List<Statement> savedBuffer = statementBuffer;
-    statementBuffer = <Statement>[];
     tree.Statement savedFallthrough = fallthrough;
-    fallthrough = stmt.body;
+    statementBuffer = <Statement>[];
+    fallthrough = stmt;
+
     visitStatement(stmt.body);
-    savedBuffer.add(
-        new LabeledStatement(
-            stmt.label.name,
-            new While(condition, new Block(statementBuffer))));
+    Statement body = new Block(statementBuffer);
+    Statement statement = new For(null, null, updates, body);
+    if (usedLabels.remove(stmt.label.name)) {
+      statement = new LabeledStatement(stmt.label.name, statement);
+    }
+    savedBuffer.add(statement);
+
     statementBuffer = savedBuffer;
     fallthrough = savedFallthrough;
   }
 
+  void visitWhileCondition(tree.WhileCondition stmt) {
+    Expression condition = visitExpression(stmt.condition);
+    List<Expression> updates = stmt.updates.reversed
+                                           .map(visitExpression)
+                                           .toList(growable:false);
+
+    List<Statement> savedBuffer = statementBuffer;
+    tree.Statement savedFallthrough = fallthrough;
+    statementBuffer = <Statement>[];
+    fallthrough = stmt;
+
+    visitStatement(stmt.body);
+    Statement body = new Block(statementBuffer);
+    Statement statement;
+    if (updates.isEmpty) {
+      // while(E) is the same as for(;E;), but the former is nicer
+      statement = new While(condition, body);
+    } else {
+      statement = new For(null, condition, updates, body);
+    }
+    if (usedLabels.remove(stmt.label.name)) {
+      statement = new LabeledStatement(stmt.label.name, statement);
+    }
+    savedBuffer.add(statement);
+
+    statementBuffer = savedBuffer;
+    fallthrough = savedFallthrough;
+
+    visitStatement(stmt.next);
+  }
+
   Expression visitConstant(tree.Constant exp) {
     return emitConstant(exp.value);
   }
 
+  Expression visitThis(tree.This exp) {
+    return new This();
+  }
+
   Expression visitLiteralList(tree.LiteralList exp) {
     return new LiteralList(
-        exp.values.map(visitExpression).toList(growable: false));
+        exp.values.map(visitExpression).toList(growable: false),
+        isConst: exp.constant != null,
+        typeArgument: emitOptionalType(exp.type.typeArguments.single));
   }
 
   Expression visitLiteralMap(tree.LiteralMap exp) {
@@ -256,7 +349,18 @@
         exp.values.length,
         (i) => new LiteralMapEntry(visitExpression(exp.keys[i]),
                                    visitExpression(exp.values[i])));
-    return new LiteralMap(entries);
+    List<TypeAnnotation> typeArguments = exp.type.treatAsRaw
+        ? null
+        : exp.type.typeArguments.mapToList(emitType);
+    return new LiteralMap(entries,
+                          isConst: exp.constant != null,
+                          typeArguments: typeArguments);
+  }
+
+  Expression visitTypeOperator(tree.TypeOperator exp) {
+    return new TypeOperator(visitExpression(exp.receiver),
+                            exp.operator,
+                            emitType(exp.type));
   }
 
   List<Argument> emitArguments(tree.Invoke exp) {
@@ -272,9 +376,23 @@
   }
 
   Expression visitInvokeStatic(tree.InvokeStatic exp) {
-    List<Argument> args = emitArguments(exp);
-    return new CallStatic(null, exp.target.name, args)
-               ..element = exp.target;
+    switch (exp.selector.kind) {
+      case SelectorKind.GETTER:
+        return new Identifier(exp.target.name)..element = exp.target;
+
+      case SelectorKind.SETTER:
+        return new Assignment(
+            new Identifier(exp.target.name)..element = exp.target,
+            '=',
+            visitExpression(exp.arguments[0]));
+
+      case SelectorKind.CALL:
+        return new CallStatic(null, exp.target.name, emitArguments(exp))
+                   ..element = exp.target;
+
+      default:
+        throw "Unexpected selector kind: ${exp.selector.kind}";
+    }
   }
 
   Expression visitInvokeMethod(tree.InvokeMethod exp) {
@@ -321,7 +439,10 @@
     List args = emitArguments(exp);
     FunctionElement constructor = exp.target;
     String name = constructor.name.isEmpty ? null : constructor.name;
-    return new CallNew(emitType(exp.type), args, constructorName: name)
+    return new CallNew(emitType(exp.type),
+                       args,
+                       constructorName: name,
+                       isConst: exp.constant != null)
                ..constructor = constructor
                ..dartType = exp.type;
   }
@@ -349,7 +470,7 @@
   }
 
   Expression visitVariable(tree.Variable exp) {
-    return new Identifier(exp.name)
+    return new Identifier(getVariableName(exp))
                ..element = exp.element;
   }
 
@@ -357,8 +478,7 @@
     if (type is GenericType) { // TODO(asgerf): faster Link.map
       return new TypeAnnotation(
           type.element.name,
-          type.typeArguments.toList(growable:false)
-              .map(emitType).toList(growable:false))
+          type.typeArguments.mapToList(emitType, growable:false))
           ..dartType = type;
     } else if (type is VoidType) {
       return new TypeAnnotation('void')
@@ -366,6 +486,13 @@
     } else if (type is TypeVariableType) {
       return new TypeAnnotation(type.name)
           ..dartType = type;
+    } else if (type is DynamicType) {
+      return new TypeAnnotation("dynamic")
+          ..dartType = type;
+    } else if (type is MalformedType) {
+      // treat malformed types as dynamic
+      return new TypeAnnotation("dynamic")
+          ..dartType = const DynamicType();
     } else {
       throw "Unsupported type annotation: $type";
     }
@@ -373,7 +500,7 @@
 
   /// Like [emitType] except the dynamic type is converted to null.
   TypeAnnotation emitOptionalType(DartType type) {
-    if (type.isDynamic) {
+    if (type.treatAsDynamic) {
       return null;
     } else {
       return emitType(type);
@@ -383,18 +510,18 @@
   Expression emitConstant(dart2js.Constant constant) {
     if (constant is dart2js.PrimitiveConstant) {
       return new Literal(constant);
-    } else if (constant is dart2js.ListConstant) {
-      return new LiteralList(
-          constant.entries.map(emitConstant).toList(growable: false),
-          isConst: true);
-    } else if (constant is dart2js.MapConstant) {
-      List<LiteralMapEntry> entries = <LiteralMapEntry>[];
-      for (var i = 0; i < constant.keys.length; i++) {
-        entries.add(new LiteralMapEntry(
-            emitConstant(constant.keys.entries[i]),
-            emitConstant(constant.values[i])));
-      }
-      return new LiteralMap(entries, isConst: true);
+    } else if (constant is dart2js.ConstructedConstant &&
+               constant.isLiteralSymbol) {
+      dart2js.StringConstant nameConstant = constant.fields[0];
+      String nameString = nameConstant.value.slowToString();
+      return new LiteralSymbol(nameString);
+    } else if (constant is dart2js.FunctionConstant) {
+      return new Identifier(constant.element.name)
+                 ..element = constant.element;
+    } else if (constant is dart2js.TypeConstant) {
+      GenericType type = constant.representedType;
+      return new LiteralType(type.name)
+                 ..element = type.element;
     } else {
       throw "Unsupported constant: $constant";
     }
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 c69bbd4d..57f6096 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
@@ -330,6 +330,10 @@
 /// The unparser does not concern itself with scoping rules, and it is the
 /// responsibility of the AST creator to ensure that the identifier resolves
 /// to the proper definition.
+/// For the time being, this class is also used to reference static fields and
+/// top-level variables that are qualified with a class and/or library name,
+/// assuming the [element] is set. This is likely to change when the old backend
+/// is replaced.
 class Identifier extends Expression {
   final String name;
 
@@ -380,6 +384,17 @@
   LiteralSymbol(this.id);
 }
 
+/// A type literal. This is distinct from [Identifier] since the unparser
+/// needs to this distinguish a static invocation from a method invocation
+/// on a type literal.
+class LiteralType extends Expression {
+  final String name;
+
+  elements.TypeDeclarationElement element;
+
+  LiteralType(this.name);
+}
+
 /// StringConcat is used in place of string interpolation and juxtaposition.
 /// Semantically, each subexpression is evaluated and converted to a string
 /// by `toString()`. These string are then concatenated and returned.
@@ -455,7 +470,7 @@
   final String methodName;
   final List<Argument> arguments;
 
-  elements.FunctionElement element;
+  elements.Element element;
 
   CallStatic(this.className, this.methodName, this.arguments);
 }
@@ -579,6 +594,7 @@
 const int MULTIPLICATIVE = 13;
 const int UNARY = 14;
 const int POSTFIX_INCREMENT = 15;
+const int TYPE_LITERAL = 19;
 const int PRIMARY = 20;
 
 /// Precedence level required for the callee in a [FunctionCall].
@@ -846,6 +862,10 @@
     } else if (e is LiteralSymbol) {
       write('#');
       write(e.id); // TODO(asgerf): Do we need to escape something here?
+    } else if (e is LiteralType) {
+      withPrecedence(TYPE_LITERAL, () {
+        write(e.name);
+      });
     } else if (e is StringConcat) {
       writeStringLiteral(e);
     } else if (e is UnaryOperator) {
@@ -1235,6 +1255,17 @@
     }
   }
 
+  /// A list of string quotings that the printer may use to quote strings.
+  // Ignore multiline quotings for now. Would need to make sure that no
+  // newline (potentially prefixed by whitespace) follows the quoting.
+  // TODO(asgerf): Include multiline quotation schemes.
+  static const _QUOTINGS = const <tree.StringQuoting>[
+      const tree.StringQuoting(characters.$DQ, raw: false, leftQuoteLength: 1),
+      const tree.StringQuoting(characters.$DQ, raw: true, leftQuoteLength: 1),
+      const tree.StringQuoting(characters.$SQ, raw: false, leftQuoteLength: 1),
+      const tree.StringQuoting(characters.$SQ, raw: true, leftQuoteLength: 1),
+  ];
+
   static StringLiteralOutput analyzeStringLiteral(Expression node) {
     // TODO(asgerf): This might be a bit too expensive. Benchmark.
     // Flatten the StringConcat tree.
@@ -1277,11 +1308,7 @@
     List<int> nonRaws = <int>[];
     List<int> sqs = <int>[];
     List<int> dqs = <int>[];
-    for (tree.StringQuoting q in tree.StringQuoting.mapping) {
-      // Ignore multiline quotings for now. Encoding of line breaks is unclear.
-      // TODO(asgerf): Include multiline quotation schemes.
-      if (q.leftQuoteCharCount >= 3)
-        continue;
+    for (tree.StringQuoting q in _QUOTINGS) {
       OpenStringChunk chunk = new OpenStringChunk(null, q, getQuoteCost(q));
       int index = best.length;
       best.add(chunk);
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 6f71f08..6896135 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
@@ -38,7 +38,7 @@
  * The base class of [Expression]s.
  */
 abstract class Expression extends Node {
-  accept(Visitor v);
+  accept(ExpressionVisitor v);
 
   /// Temporary variable used by [StatementRewriter].
   /// If set to true, this expression has already had enclosing assignments
@@ -51,7 +51,7 @@
 abstract class Statement extends Node {
   Statement get next;
   void set next(Statement s);
-  accept(Visitor v);
+  accept(StatementVisitor v);
 }
 
 /**
@@ -70,35 +70,28 @@
     return cachedName;
   }
 
-  /// Number of [Break] statements that target this label.
+  /// Number of [Break] or [Continue] statements that target this label.
   /// The [Break] constructor will increment this automatically, but the
   /// counter must be decremented by hand when a [Break] becomes orphaned.
-  int breakCount = 0;
+  int useCount = 0;
 
-  /// The [LabeledStatement] binding this label.
-  LabeledStatement binding;
+  /// The [LabeledStatement] or [WhileTrue] binding this label.
+  JumpTarget binding;
 }
 
 /**
  * Variables are [Expression]s.
  */
 class Variable extends Expression {
-  // A counter used to generate names.  The counter is reset to 0 for each
-  // function emitted.
-  static int counter = 0;
-  static String _newName() => 'v${counter++}';
-
+  /// Element used for synthesizing a name for the variable.
+  /// Different variables may have the same element. May be null.
   Element element;
-  String cachedName;
 
-  String get name {
-    if (cachedName != null) return cachedName;
-    return cachedName = ((element == null) ? _newName() : element.name);
-  }
+  int readCount = 0;
 
   Variable(this.element);
 
-  accept(Visitor visitor) => visitor.visitVariable(this);
+  accept(ExpressionVisitor visitor) => visitor.visitVariable(this);
 }
 
 /**
@@ -110,18 +103,18 @@
 }
 
 /**
- * A call to a static target.
+ * A call to a static function or getter/setter to a static field.
  *
  * In contrast to the CPS-based IR, the arguments can be arbitrary expressions.
  */
 class InvokeStatic extends Expression implements Invoke {
-  final FunctionElement target;
+  final Element target;
   final List<Expression> arguments;
   final Selector selector;
 
   InvokeStatic(this.target, this.selector, this.arguments);
 
-  accept(Visitor visitor) => visitor.visitInvokeStatic(this);
+  accept(ExpressionVisitor visitor) => visitor.visitInvokeStatic(this);
 }
 
 /**
@@ -139,32 +132,35 @@
     assert(receiver != null);
   }
 
-  accept(Visitor visitor) => visitor.visitInvokeMethod(this);
+  accept(ExpressionVisitor visitor) => visitor.visitInvokeMethod(this);
 }
 
 /**
- * Non-const call to a factory or generative constructor.
+ * Call to a factory or generative constructor.
  */
 class InvokeConstructor extends Expression implements Invoke {
   final GenericType type;
   final FunctionElement target;
   final List<Expression> arguments;
   final Selector selector;
+  final dart2js.Constant constant;
 
-  InvokeConstructor(this.type, this.target, this.selector, this.arguments);
+  InvokeConstructor(this.type, this.target, this.selector, this.arguments,
+      [this.constant]);
 
   ClassElement get targetClass => target.enclosingElement;
 
-  accept(Visitor visitor) => visitor.visitInvokeConstructor(this);
+  accept(ExpressionVisitor visitor) => visitor.visitInvokeConstructor(this);
 }
 
 /// Calls [toString] on each argument and concatenates the results.
 class ConcatenateStrings extends Expression {
   final List<Expression> arguments;
+  final dart2js.Constant constant;
 
-  ConcatenateStrings(this.arguments);
+  ConcatenateStrings(this.arguments, [this.constant]);
 
-  accept(Visitor visitor) => visitor.visitConcatenateStrings(this);
+  accept(ExpressionVisitor visitor) => visitor.visitConcatenateStrings(this);
 }
 
 /**
@@ -175,24 +171,42 @@
 
   Constant(this.value);
 
-  accept(Visitor visitor) => visitor.visitConstant(this);
+  accept(ExpressionVisitor visitor) => visitor.visitConstant(this);
+}
+
+class This extends Expression {
+  accept(Visitor visitor) => visitor.visitThis(this);
 }
 
 class LiteralList extends Expression {
+  final GenericType type;
   final List<Expression> values;
+  final dart2js.Constant constant;
 
-  LiteralList(this.values) ;
+  LiteralList(this.type, this.values, [this.constant]);
 
-  accept(Visitor visitor) => visitor.visitLiteralList(this);
+  accept(ExpressionVisitor visitor) => visitor.visitLiteralList(this);
 }
 
 class LiteralMap extends Expression {
+  final GenericType type;
   final List<Expression> keys;
   final List<Expression> values;
+  final dart2js.Constant constant;
 
-  LiteralMap(this.keys, this.values) ;
+  LiteralMap(this.type, this.keys, this.values, [this.constant]);
 
-  accept(Visitor visitor) => visitor.visitLiteralMap(this);
+  accept(ExpressionVisitor visitor) => visitor.visitLiteralMap(this);
+}
+
+class TypeOperator extends Expression {
+  Expression receiver;
+  final DartType type;
+  final String operator;
+
+  TypeOperator(this.receiver, this.type, this.operator) ;
+
+  accept(ExpressionVisitor visitor) => visitor.visitTypeOperator(this);
 }
 
 /// A conditional expression.
@@ -203,7 +217,7 @@
 
   Conditional(this.condition, this.thenExpression, this.elseExpression);
 
-  accept(Visitor visitor) => visitor.visitConditional(this);
+  accept(ExpressionVisitor visitor) => visitor.visitConditional(this);
 }
 
 /// An && or || expression. The operator is internally represented as a boolean
@@ -219,7 +233,7 @@
 
   String get operator => isAnd ? '&&' : '||';
 
-  accept(Visitor visitor) => visitor.visitLogicalOperator(this);
+  accept(ExpressionVisitor visitor) => visitor.visitLogicalOperator(this);
 }
 
 /// Logical negation.
@@ -228,14 +242,20 @@
 
   Not(this.operand);
 
-  accept(Visitor visitor) => visitor.visitNot(this);
+  accept(ExpressionVisitor visitor) => visitor.visitNot(this);
+}
+
+/// A [LabeledStatement] or [WhileTrue] or [WhileCondition].
+abstract class JumpTarget extends Statement {
+  Label get label;
+  Statement get body;
 }
 
 /**
  * A labeled statement.  Breaks to the label within the labeled statement
  * target the successor statement.
  */
-class LabeledStatement extends Statement {
+class LabeledStatement extends JumpTarget {
   Statement next;
   final Label label;
   Statement body;
@@ -245,7 +265,98 @@
     label.binding = this;
   }
 
-  accept(Visitor visitor) => visitor.visitLabeledStatement(this);
+  accept(StatementVisitor visitor) => visitor.visitLabeledStatement(this);
+}
+
+/// A [WhileTrue] or [WhileCondition] loop.
+abstract class Loop extends JumpTarget {
+  /// When a [Continue] to a loop is executed, all update expressions are
+  /// evaluated right-to-left before control resumes at the head of the loop.
+  List<Expression> get updates;
+}
+
+/**
+ * A labeled while(true) loop.
+ */
+class WhileTrue extends Loop {
+  final Label label;
+  Statement body;
+  final List<Expression> updates = <Expression>[];
+
+  WhileTrue(this.label, this.body) {
+    assert(label.binding == null);
+    label.binding = this;
+  }
+
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  accept(StatementVisitor visitor) => visitor.visitWhileTrue(this);
+}
+
+/**
+ * A while loop with a condition. If the condition is false, control resumes
+ * at the [next] statement.
+ *
+ * It is NOT valid to target this statement with a [Break].
+ * The only way to reach [next] is for the condition to evaluate to false.
+ *
+ * [WhileCondition] statements are introduced in the [LoopRewriter] and is
+ * assumed not to occur before then.
+ */
+class WhileCondition extends Loop {
+  final Label label;
+  Expression condition;
+  Statement body;
+  Statement next;
+  final List<Expression> updates;
+
+  WhileCondition(this.label, this.condition, this.body,
+                 this.next, this.updates) {
+    assert(label.binding == null);
+    label.binding = this;
+  }
+
+  accept(StatementVisitor visitor) => visitor.visitWhileCondition(this);
+}
+
+/// A [Break] or [Continue] statement.
+abstract class Jump extends Statement {
+  Label get target;
+}
+
+/**
+ * A break from an enclosing [LabeledStatement].  The break targets the
+ * labeled statement's successor statement.
+ */
+class Break extends Jump {
+  final Label target;
+
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  Break(this.target) {
+    ++target.useCount;
+  }
+
+  accept(StatementVisitor visitor) => visitor.visitBreak(this);
+}
+
+/**
+ * A continue to an enclosing [WhileTrue] or [WhileCondition] loop.
+ * The continue targets the loop's body.
+ */
+class Continue extends Jump {
+  final Label target;
+
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  Continue(this.target) {
+    ++target.useCount;
+  }
+
+  accept(StatementVisitor visitor) => visitor.visitContinue(this);
 }
 
 /**
@@ -258,11 +369,12 @@
   Statement next;
   final Variable variable;
   Expression definition;
-  final bool hasExactlyOneUse;
 
-  Assign(this.variable, this.definition, this.next, this.hasExactlyOneUse);
+  Assign(this.variable, this.definition, this.next);
 
-  accept(Visitor visitor) => visitor.visitAssign(this);
+  bool get hasExactlyOneUse => variable.readCount == 1;
+
+  accept(StatementVisitor visitor) => visitor.visitAssign(this);
 }
 
 /**
@@ -280,46 +392,7 @@
 
   Return(this.value);
 
-  accept(Visitor visitor) => visitor.visitReturn(this);
-}
-
-/**
- * A break from an enclosing [LabeledStatement].  The break targets the
- * labeled statement's successor statement.
- */
-class Break extends Statement {
-  Label _target;
-
-  Label get target => _target;
-  void set target(Label newTarget) {
-    ++newTarget.breakCount;
-    --_target.breakCount;
-    _target = newTarget;
-  }
-
-  Statement get next => null;
-  void set next(Statement s) => throw 'UNREACHABLE';
-
-  Break(this._target) {
-    ++target.breakCount;
-  }
-
-  accept(Visitor visitor) => visitor.visitBreak(this);
-}
-
-/**
- * A continue to an enclosing [While] loop.  The continue targets the
- * loop's body.
- */
-class Continue extends Statement {
-  Label target;
-
-  Statement get next => null;
-  void set next(Statement s) => throw 'UNREACHABLE';
-
-  Continue(this.target);
-
-  accept(Visitor visitor) => visitor.visitContinue(this);
+  accept(StatementVisitor visitor) => visitor.visitReturn(this);
 }
 
 /**
@@ -335,32 +408,16 @@
 
   If(this.condition, this.thenStatement, this.elseStatement);
 
-  accept(Visitor visitor) => visitor.visitIf(this);
+  accept(StatementVisitor visitor) => visitor.visitIf(this);
 }
 
-/**
- * A labeled while(true) loop.
- */
-class While extends Statement {
-  final Label label;
-  Statement body;
-
-  While(this.label, this.body);
-
-  Statement get next => null;
-  void set next(Statement s) => throw 'UNREACHABLE';
-
-  accept(Visitor visitor) => visitor.visitWhile(this);
-}
-
-
 class ExpressionStatement extends Statement {
   Statement next;
   Expression expression;
 
   ExpressionStatement(this.expression, this.next);
 
-  accept(Visitor visitor) => visitor.visitExpressionStatement(this);
+  accept(StatementVisitor visitor) => visitor.visitExpressionStatement(this);
 }
 
 class FunctionDefinition extends Node {
@@ -370,7 +427,7 @@
   FunctionDefinition(this.parameters, this.body);
 }
 
-abstract class Visitor<S, E> {
+abstract class ExpressionVisitor<E> {
   E visitExpression(Expression e) => e.accept(this);
   E visitVariable(Variable node);
   E visitInvokeStatic(InvokeStatic node);
@@ -378,12 +435,16 @@
   E visitInvokeConstructor(InvokeConstructor node);
   E visitConcatenateStrings(ConcatenateStrings node);
   E visitConstant(Constant node);
+  E visitThis(This node);
   E visitConditional(Conditional node);
   E visitLogicalOperator(LogicalOperator node);
   E visitNot(Not node);
   E visitLiteralList(LiteralList node);
   E visitLiteralMap(LiteralMap node);
+  E visitTypeOperator(TypeOperator node);
+}
 
+abstract class StatementVisitor<S> {
   S visitStatement(Statement s) => s.accept(this);
   S visitLabeledStatement(LabeledStatement node);
   S visitAssign(Assign node);
@@ -391,10 +452,17 @@
   S visitBreak(Break node);
   S visitContinue(Continue node);
   S visitIf(If node);
-  S visitWhile(While node);
+  S visitWhileTrue(WhileTrue node);
+  S visitWhileCondition(WhileCondition node);
   S visitExpressionStatement(ExpressionStatement node);
 }
 
+abstract class Visitor<S,E> implements ExpressionVisitor<E>,
+                                       StatementVisitor<S> {
+   E visitExpression(Expression e) => e.accept(this);
+   S visitStatement(Statement s) => s.accept(this);
+}
+
 /**
  * Builder translates from CPS-based IR to direct-style Tree.
  *
@@ -430,9 +498,9 @@
 class Builder extends ir.Visitor<Node> {
   final dart2js.Compiler compiler;
 
-  // Uses of IR primitives are replaced with Tree variables.  This is the
-  // mapping from primitives to variables.
-  final Map<ir.Primitive, Variable> variables = <ir.Primitive, Variable>{};
+  /// Maps variable/parameter elements to the Tree variables that represent it.
+  final Map<Element, List<Variable>> element2variables =
+      <Element,List<Variable>>{};
 
   // Continuations with more than one use are replaced with Tree labels.  This
   // is the mapping from continuations to labels.
@@ -441,38 +509,148 @@
   FunctionDefinition function;
   ir.Continuation returnContinuation;
 
+  /// Variable used in [buildPhiAssignments] as a temporary when swapping
+  /// variables.
+  final Variable tempVar = new Variable(null);
+
   Builder(this.compiler);
 
+  /// Obtains the variable representing the given primitive. Returns null for
+  /// primitives that have no reference and do not need a variable.
+  Variable getVariable(ir.Primitive primitive) {
+    if (primitive.registerIndex == null) {
+      return null; // variable is unused
+    }
+    List<Variable> variables = element2variables[primitive.element];
+    if (variables == null) {
+      variables = <Variable>[];
+      element2variables[primitive.element] = variables;
+    }
+    while (variables.length <= primitive.registerIndex) {
+      variables.add(new Variable(primitive.element));
+    }
+    return variables[primitive.registerIndex];
+  }
+
+  /// Obtains a reference to the tree Variable corresponding to the IR primitive
+  /// referred to by [reference].
+  /// This increments the reference count for the given variable, so the
+  /// returned expression must be used in the tree.
+  Expression getVariableReference(ir.Reference reference) {
+    Variable variable = getVariable(reference.definition);
+    if (variable == null) {
+      compiler.internalError(
+          compiler.currentElement,
+          "Reference to ${reference.definition} has no register");
+    }
+    ++variable.readCount;
+    return variable;
+  }
+
   FunctionDefinition build(ir.FunctionDefinition node) {
+    new ir.RegisterAllocator().visit(node);
     visit(node);
     return function;
   }
 
   List<Expression> translateArguments(List<ir.Reference> args) {
     return new List<Expression>.generate(args.length,
-         (int index) => variables[args[index].definition]);
+         (int index) => getVariableReference(args[index]));
   }
 
-  Statement buildParameterAssignments(
+  List<Variable> translatePhiArguments(List<ir.Reference> args) {
+    return new List<Variable>.generate(args.length,
+         (int index) => getVariableReference(args[index]));
+  }
+
+  Statement buildContinuationAssignment(
+      ir.Parameter parameter,
+      Expression argument,
+      Statement buildRest()) {
+    Variable variable = getVariable(parameter);
+    Statement assignment;
+    if (variable == null) {
+      assignment = new ExpressionStatement(argument, null);
+    } else {
+      assignment = new Assign(variable, argument, null);
+    }
+    assignment.next = buildRest();
+    return assignment;
+  }
+
+  /// Simultaneously assigns each argument to the corresponding parameter,
+  /// then continues at the statement created by [buildRest].
+  Statement buildPhiAssignments(
       List<ir.Parameter> parameters,
-      List<Expression> arguments,
+      List<Variable> arguments,
       Statement buildRest()) {
     assert(parameters.length == arguments.length);
-    Statement first, current;
-    for (int i = 0; i < parameters.length; ++i) {
-      ir.Parameter parameter = parameters[i];
-      Statement assignment;
-      if (parameter.hasAtLeastOneUse) {
-        assignment = new Assign(variables[parameter], arguments[i], null,
-            parameter.hasExactlyOneUse);
-      } else {
-        assignment = new ExpressionStatement(arguments[i], null);
-      }
+    // We want a parallel assignment to all parameters simultaneously.
+    // Since we do not have parallel assignments in dart_tree, we must linearize
+    // the assignments without attempting to read a previously-overwritten
+    // value. For example {x,y = y,x} cannot be linearized to {x = y; y = x},
+    // for this we must introduce a temporary variable: {t = x; x = y; y = t}.
 
+    // [rightHand] is the inverse of [arguments], that is, it maps variables
+    // to the assignments on which is occurs as the right-hand side.
+    Map<Variable, List<int>> rightHand = <Variable, List<int>>{};
+    for (int i = 0; i < parameters.length; i++) {
+      Variable param = getVariable(parameters[i]);
+      Variable arg = arguments[i];
+      if (param == null || param == arg) {
+        continue; // No assignment necessary.
+      }
+      List<int> list = rightHand[arg];
+      if (list == null) {
+        rightHand[arg] = list = <int>[];
+      }
+      list.add(i);
+    }
+
+    Statement first, current;
+    void addAssignment(Variable dst, Variable src) {
       if (first == null) {
-        current = first = assignment;
+        first = current = new Assign(dst, src, null);
       } else {
-        current = current.next = assignment;
+        current = current.next = new Assign(dst, src, null);
+      }
+    }
+
+    List<Variable> assignmentSrc = new List<Variable>(parameters.length);
+    List<bool> done = new List<bool>(parameters.length);
+    void visitAssignment(int i) {
+      if (done[i] == true) {
+        return;
+      }
+      Variable param = getVariable(parameters[i]);
+      Variable arg = arguments[i];
+      if (param == null || param == arg) {
+        return; // No assignment necessary.
+      }
+      if (assignmentSrc[i] != null) {
+        // Cycle found; store argument in a temporary variable.
+        // The temporary will then be used as right-hand side when the
+        // assignment gets added.
+        if (assignmentSrc[i] != tempVar) { // Only move to temporary once.
+          assignmentSrc[i] = tempVar;
+          addAssignment(tempVar, arg);
+        }
+        return;
+      }
+      assignmentSrc[i] = arg;
+      List<int> paramUses = rightHand[param];
+      if (paramUses != null) {
+        for (int useIndex in paramUses) {
+          visitAssignment(useIndex);
+        }
+      }
+      addAssignment(param, assignmentSrc[i]);
+      done[i] = true;
+    }
+
+    for (int i = 0; i < parameters.length; i++) {
+      if (done[i] == null) {
+        visitAssignment(i);
       }
     }
 
@@ -488,29 +666,19 @@
     returnContinuation = node.returnContinuation;
     List<Variable> parameters = <Variable>[];
     for (ir.Parameter p in node.parameters) {
-      Variable parameter = new Variable(p.element);
+      Variable parameter = getVariable(p);
+      assert(parameter != null);
       parameters.add(parameter);
-      variables[p] = parameter;
     }
     function = new FunctionDefinition(parameters, visit(node.body));
     return null;
   }
 
   Statement visitLetPrim(ir.LetPrim node) {
-    // LetPrim is translated to LetVal.
-    Expression definition = visit(node.primitive);
-    if (node.primitive.hasAtLeastOneUse) {
-      Variable variable = new Variable(null);
-      variables[node.primitive] = variable;
-      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
-      // values (e.g., as part of a shrinking reductions pass).
-      return visit(node.body);
-    } else {
-      return new ExpressionStatement(definition, visit(node.body));
-    }
+    Variable variable = getVariable(node.primitive);
+    return variable == null
+        ? visit(node.body)
+        : new Assign(variable, visit(node.primitive), visit(node.body));
   }
 
   Statement visitLetCont(ir.LetCont node) {
@@ -519,9 +687,6 @@
       label = new Label();
       labels[node.continuation] = label;
     }
-    node.continuation.parameters.forEach((p) {
-        if (p.hasAtLeastOneUse) variables[p] = new Variable(null);
-    });
     Statement body = visit(node.body);
     // The continuation's body is not always translated directly here because
     // it may have been already translated:
@@ -545,13 +710,13 @@
     } else {
       assert(cont.hasExactlyOneUse);
       assert(cont.parameters.length == 1);
-      return buildParameterAssignments(cont.parameters, [invoke],
+      return buildContinuationAssignment(cont.parameters.single, invoke,
           () => visit(cont.body));
     }
   }
 
   Statement visitInvokeMethod(ir.InvokeMethod node) {
-    Variable receiver = variables[node.receiver.definition];
+    Expression receiver = getVariableReference(node.receiver);
     List<Expression> arguments = translateArguments(node.arguments);
     Expression invoke = new InvokeMethod(receiver, node.selector, arguments);
     ir.Continuation cont = node.continuation.definition;
@@ -560,7 +725,7 @@
     } else {
       assert(cont.hasExactlyOneUse);
       assert(cont.parameters.length == 1);
-      return buildParameterAssignments(cont.parameters, [invoke],
+      return buildContinuationAssignment(cont.parameters.single, invoke,
           () => visit(cont.body));
     }
   }
@@ -574,7 +739,21 @@
     } else {
       assert(cont.hasExactlyOneUse);
       assert(cont.parameters.length == 1);
-      return buildParameterAssignments(cont.parameters, [concat],
+      return buildContinuationAssignment(cont.parameters.single, concat,
+          () => visit(cont.body));
+    }
+  }
+
+  Statement visitAsCast(ir.AsCast node) {
+    Expression receiver = getVariableReference(node.receiver);
+    Expression concat = new TypeOperator(receiver, node.type, "as");
+    ir.Continuation cont = node.continuation.definition;
+    if (cont == returnContinuation) {
+      return new Return(concat);
+    } else {
+      assert(cont.hasExactlyOneUse);
+      assert(cont.parameters.length == 1);
+      return buildContinuationAssignment(cont.parameters.single, concat,
           () => visit(cont.body));
     }
   }
@@ -589,7 +768,7 @@
     } else {
       assert(cont.hasExactlyOneUse);
       assert(cont.parameters.length == 1);
-      return buildParameterAssignments(cont.parameters, [invoke],
+      return buildContinuationAssignment(cont.parameters.single, invoke,
           () => visit(cont.body));
     }
   }
@@ -603,10 +782,10 @@
     ir.Continuation cont = node.continuation.definition;
     if (cont == returnContinuation) {
       assert(node.arguments.length == 1);
-      return new Return(variables[node.arguments[0].definition]);
+      return new Return(getVariableReference(node.arguments.single));
     } else {
-      List<Expression> arguments = translateArguments(node.arguments);
-      return buildParameterAssignments(cont.parameters, arguments,
+      List<Expression> arguments = translatePhiArguments(node.arguments);
+      return buildPhiAssignments(cont.parameters, arguments,
           () {
             // Translate invocations of recursive and non-recursive
             // continuations differently.
@@ -622,7 +801,7 @@
             if (cont.isRecursive) {
               return node.isRecursive
                   ? new Continue(labels[cont])
-                  : new While(labels[cont], visit(cont.body));
+                  : new WhileTrue(labels[cont], visit(cont.body));
             } else {
               return cont.hasExactlyOneUse
                   ? visit(cont.body)
@@ -646,18 +825,42 @@
     return new If(condition, thenStatement, elseStatement);
   }
 
+  Expression visitInvokeConstConstructor(ir.InvokeConstConstructor node) {
+    return new InvokeConstructor(
+        node.type,
+        node.constructor,
+        node.selector,
+        translateArguments(node.arguments),
+        node.constant);
+  }
+
   Expression visitConstant(ir.Constant node) {
     return new Constant(node.value);
   }
 
+  Expression visitThis(ir.This node) {
+    return new This();
+  }
+
   Expression visitLiteralList(ir.LiteralList node) {
-    return new LiteralList(translateArguments(node.values));
+    return new LiteralList(
+            node.type,
+            translateArguments(node.values),
+            node.constant);
   }
 
   Expression visitLiteralMap(ir.LiteralMap node) {
     return new LiteralMap(
+        node.type,
         translateArguments(node.keys),
-        translateArguments(node.values));
+        translateArguments(node.values),
+        node.constant);
+  }
+
+  Expression visitIsCheck(ir.IsCheck node) {
+    return new TypeOperator(getVariableReference(node.receiver),
+                            node.type,
+                            "is");
   }
 
   Expression visitParameter(ir.Parameter node) {
@@ -675,7 +878,7 @@
   }
 
   Expression visitIsTrue(ir.IsTrue node) {
-    return variables[node.value.definition];
+    return getVariableReference(node.value);
   }
 }
 
@@ -757,11 +960,11 @@
  * REDIRECT BREAKS:
  * Labeled statements whose next is a break become flattened and all breaks
  * to their label are redirected.
- * For example:
+ * For example, where 'jump' is either break or continue:
  *
- *   L0: {... break L0 ...}; break L1
+ *   L0: {... break L0 ...}; jump L1
  *     ==>
- *   {... break L1 ...}
+ *   {... jump L1 ...}
  *
  * This may trigger a flattening of nested ifs in case the eliminated label
  * separated two ifs.
@@ -773,13 +976,13 @@
 
   /// Substitution map for labels. Any break to a label L should be substituted
   /// for a break to L' if L maps to L'.
-  Map<Label, Label> labelRedirects = <Label, Label>{};
+  Map<Label, Jump> labelRedirects = <Label, Jump>{};
 
   /// Returns the redirect target of [label] or [label] itself if it should not
   /// be redirected.
-  Label redirect(Label label) {
-    Label newTarget = labelRedirects[label];
-    return newTarget != null ? newTarget : label;
+  Jump redirect(Break jump) {
+    Jump newJump = labelRedirects[jump.target];
+    return newJump != null ? newJump : jump;
   }
 
   void rewrite(FunctionDefinition definition) {
@@ -892,10 +1095,11 @@
 
   Statement visitBreak(Break node) {
     // Redirect through chain of breaks.
-    // Note that breakCount was accounted for at visitLabeledStatement.
-    node.target = redirect(node.target);
-    if (node.target.breakCount == 1) {
-      --node.target.breakCount;
+    // Note that useCount was accounted for at visitLabeledStatement.
+    // Note redirect may return either a Break or Continue statement.
+    node = redirect(node);
+    if (node is Break && node.target.useCount == 1) {
+      --node.target.useCount;
       return visitStatement(node.target.binding.next);
     }
     return node;
@@ -906,16 +1110,16 @@
   }
 
   Statement visitLabeledStatement(LabeledStatement node) {
-    if (node.next is Break) {
-      // Eliminate label if next is just a break statement
+    if (node.next is Jump) {
+      // Eliminate label if next is a break or continue statement
       // Breaks to this label are redirected to the outer label.
       // Note that breakCount for the two labels is updated proactively here
       // so breaks can reliably tell if they should inline their target.
-      Break next = node.next;
-      Label newTarget = redirect(next.target);
-      labelRedirects[node.label] = newTarget;
-      newTarget.breakCount += node.label.breakCount;
-      node.label.breakCount = 0;
+      Jump next = node.next;
+      Jump newJump = redirect(next);
+      labelRedirects[node.label] = newJump;
+      newJump.target.useCount += node.label.useCount - 1;
+      node.label.useCount = 0;
       Statement result = visitStatement(node.body);
       labelRedirects.remove(node.label); // Save some space.
       return result;
@@ -923,12 +1127,18 @@
 
     node.body = visitStatement(node.body);
 
-    if (node.label.breakCount == 0) {
+    if (node.label.useCount == 0) {
       // Eliminate the label if next was inlined at a break
       return node.body;
     }
 
+    // Do not propagate assignments into the successor statements, since they
+    // may be overwritten by assignments in the body.
+    List<Assign> savedEnvironment = environment;
+    environment = <Assign>[];
     node.next = visitStatement(node.next);
+    environment = savedEnvironment;
+
     return node;
   }
 
@@ -965,7 +1175,7 @@
     return node;
   }
 
-  Statement visitWhile(While node) {
+  Statement visitWhileTrue(WhileTrue node) {
     // Do not propagate assignments into loops.  Doing so is not safe for
     // variables modified in the loop (the initial value will be propagated).
     List<Assign> savedEnvironment = environment;
@@ -976,10 +1186,19 @@
     return node;
   }
 
+  Statement visitWhileCondition(WhileCondition node) {
+    // Not introduced yet
+    throw "Unexpected WhileCondition in StatementRewriter";
+  }
+
   Expression visitConstant(Constant node) {
     return node;
   }
 
+  Expression visitThis(This node) {
+    return node;
+  }
+
   Expression visitLiteralList(LiteralList node) {
     // Process values right-to-left, the opposite of evaluation order.
     for (int i = node.values.length - 1; i >= 0; --i) {
@@ -997,6 +1216,11 @@
     return node;
   }
 
+  Expression visitTypeOperator(TypeOperator node) {
+    node.receiver = visitExpression(node.receiver);
+    return node;
+  }
+
   Statement visitExpressionStatement(ExpressionStatement node) {
     node.expression = visitExpression(node.expression);
     // Do not allow propagation of assignments past an expression evaluated
@@ -1041,8 +1265,7 @@
       if (next != null) {
         return new Assign(s.variable,
                           combine(s.definition, t.definition),
-                          next,
-                          s.hasExactlyOneUse);
+                          next);
       }
     }
     if (s is ExpressionStatement && t is ExpressionStatement) {
@@ -1062,27 +1285,34 @@
   /// If two breaks are combined, the label's break counter will be decremented.
   static Statement combineStatements(Statement s, Statement t) {
     if (s is Break && t is Break && s.target == t.target) {
-      --t.target.breakCount; // Two breaks become one.
+      --t.target.useCount; // Two breaks become one.
       return s;
     }
-    if (s is Return && t is Return && equivalentExpressions(s.value, t.value)) {
+    if (s is Continue && t is Continue && s.target == t.target) {
+      --t.target.useCount; // Two continues become one.
       return s;
     }
+    if (s is Return && t is Return) {
+      Expression e = combineExpressions(s.value, t.value);
+      if (e != null) {
+        return new Return(e);
+      }
+    }
     return null;
   }
 
-  /// True if the two expressions both syntactically and semantically
-  /// equivalent.
-  static bool equivalentExpressions(Expression e1, Expression e2) {
-    if (e1 == e2) { // Detect same variable reference
-      // TODO(asgerf): This might turn the variable into a single-use,
-      // but we currently don't discover this.
-      return true;
+  /// Returns an expression equivalent to both [e1] and [e2].
+  /// If non-null is returned, the caller must discard [e1] and [e2] and use
+  /// the resulting expression in the tree.
+  static Expression combineExpressions(Expression e1, Expression e2) {
+    if (e1 is Variable && e1 == e2) {
+      --e1.readCount; // Two references become one.
+      return e1;
     }
-    if (e1 is Constant && e2 is Constant) {
-      return e1.value == e2.value;
+    if (e1 is Constant && e2 is Constant && e1.value == e2.value) {
+      return e1;
     }
-    return false;
+    return null;
   }
 
   /// Try to collapse nested ifs using && and || expressions.
@@ -1149,7 +1379,7 @@
             makeCondition(outerIf.condition, branch1),
             makeCondition(innerIf.condition, branch2));
         outerIf.thenStatement = innerThen;
-        --innerElse.target.breakCount;
+        --innerElse.target.useCount;
 
         // Try to inline the remaining break.  Do not propagate assignments.
         List<Assign> savedEnvironment = environment;
@@ -1173,6 +1403,124 @@
   }
 }
 
+/// Rewrites [WhileTrue] statements with an [If] body into a [WhileCondition],
+/// in situations where only one of the branches contains a [Continue] to the
+/// loop. Schematically:
+///
+///   L:
+///   while (true) {
+///     if (E) {
+///       S1  (has references to L)
+///     } else {
+///       S2  (has no references to L)
+///     }
+///   }
+///     ==>
+///   L:
+///   while (E) {
+///     S1
+///   };
+///   S2
+///
+/// A similar transformation is used when S2 occurs in the 'then' position.
+///
+/// Note that the above pattern needs no iteration since nested ifs
+/// have been collapsed previously in the [StatementRewriter] phase.
+class LoopRewriter extends StatementVisitor<Statement> {
+
+  Set<Label> usedContinueLabels = new Set<Label>();
+
+  void rewrite(FunctionDefinition function) {
+    function.body = visitStatement(function.body);
+  }
+
+  Statement visitLabeledStatement(LabeledStatement node) {
+    node.body = visitStatement(node.body);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitAssign(Assign node) {
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitReturn(Return node) {
+    return node;
+  }
+
+  Statement visitBreak(Break node) {
+    return node;
+  }
+
+  Statement visitContinue(Continue node) {
+    usedContinueLabels.add(node.target);
+    return node;
+  }
+
+  Statement visitIf(If node) {
+    node.thenStatement = visitStatement(node.thenStatement);
+    node.elseStatement = visitStatement(node.elseStatement);
+    return node;
+  }
+
+  Statement visitWhileTrue(WhileTrue node) {
+    assert(!usedContinueLabels.contains(node.label));
+    if (node.body is If) {
+      If body = node.body;
+      body.thenStatement = visitStatement(body.thenStatement);
+      bool thenHasContinue = usedContinueLabels.remove(node.label);
+      body.elseStatement = visitStatement(body.elseStatement);
+      bool elseHasContinue = usedContinueLabels.remove(node.label);
+      if (thenHasContinue && !elseHasContinue) {
+        node.label.binding = null; // Prepare to rebind the label.
+        return new WhileCondition(
+            node.label,
+            body.condition,
+            body.thenStatement,
+            body.elseStatement,
+            node.updates);
+      } else if (!thenHasContinue && elseHasContinue) {
+        node.label.binding = null;
+        return new WhileCondition(
+            node.label,
+            new Not(body.condition),
+            body.elseStatement,
+            body.thenStatement,
+            node.updates);
+      }
+    } else {
+      node.body = visitStatement(node.body);
+      usedContinueLabels.remove(node.label);
+    }
+    return node;
+  }
+
+  Statement visitWhileCondition(WhileCondition node) {
+    // Note: not reachable but the implementation is trivial
+    node.body = visitStatement(node.body);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitExpressionStatement(ExpressionStatement node) {
+    node.next = visitStatement(node.next);
+    // for (;;) { ... E; continue* L ... }
+    //   ==>
+    // for(;;E) { ... continue* L ... }
+    if (node.next is Continue) {
+      Continue jump = node.next;
+      if (jump.target.useCount == 1) {
+        Loop target = jump.target.binding;
+        target.updates.add(node.expression);
+        return jump; // Return the continue statement.
+        // NOTE: The pattern may reclick in an enclosing expression statement.
+      }
+    }
+    return node;
+  }
+
+}
 
 
 /// Rewrites logical expressions to be more compact.
@@ -1308,11 +1656,18 @@
     return node;
   }
 
-  Statement visitWhile(While node) {
+  Statement visitWhileTrue(WhileTrue node) {
     node.body = visitStatement(node.body);
     return node;
   }
 
+  Statement visitWhileCondition(WhileCondition node) {
+    node.condition = makeCondition(node.condition, true, liftNots: false);
+    node.body = visitStatement(node.body);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
   Statement visitExpressionStatement(ExpressionStatement node) {
     // TODO(asgerf): in non-checked mode we can remove Not from the expression.
     node.expression = visitExpression(node.expression);
@@ -1357,10 +1712,19 @@
     return node;
   }
 
+  Expression visitTypeOperator(TypeOperator node) {
+    node.receiver = visitExpression(node.receiver);
+    return node;
+  }
+
   Expression visitConstant(Constant node) {
     return node;
   }
 
+  Expression visitThis(This node) {
+    return node;
+  }
+
   Expression visitNot(Not node) {
     return toBoolean(makeCondition(node.operand, false, liftNots: false));
   }
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 1ae6777..660ff6c 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
@@ -12,6 +12,11 @@
 import '../elements/elements.dart' as elements;
 import '../dart_types.dart' as types;
 
+/// If true, the unparser will insert a coment in front of every function
+/// it emits. This helps indicate which functions were translated by the new
+/// backend.
+const bool INSERT_NEW_BACKEND_COMMENT = true;
+
 /// Converts backend ASTs to frontend ASTs.
 class TreePrinter {
   dart2js.TreeElementMapping treeElements;
@@ -95,6 +100,11 @@
         new StringToken.fromString(IDENTIFIER_INFO, name, -1));
   }
 
+  static tree.Operator makeOperator(String name) {
+    return new tree.Operator(
+        new StringToken.fromString(IDENTIFIER_INFO, name, -1));
+  }
+
   // Utilities for creating NodeLists
   Link<tree.Node> makeLink(Iterable<tree.Node> nodes) {
     LinkBuilder builder = new LinkBuilder();
@@ -218,6 +228,19 @@
     }
   }
 
+  tree.Node makeStaticReceiver(elements.Element element) {
+    if (treeElements == null) return null;
+    if (element.enclosingElement is elements.ClassElement) {
+      tree.Send send = new tree.Send(
+          null,
+          makeIdentifier(element.enclosingElement.name));
+      treeElements[send] = element.enclosingElement;
+      return send;
+    } else {
+      return null;
+    }
+  }
+
   tree.Node makeArgument(Argument arg) {
     if (arg is Expression) {
       return makeExpression(arg);
@@ -252,7 +275,7 @@
       tree.NodeList arguments;
       elements.Element element;
       if (left is Identifier) {
-        receiver = null;
+        receiver = makeStaticReceiver(left.element);
         selector = makeIdentifier(left.name);
         arguments = singleton(makeExpression(exp.right));
         element = left.element;
@@ -286,14 +309,16 @@
       tree.Node selector;
       Expression callee = exp.callee;
       elements.Element element;
+      tree.Node receiver;
       if (callee is Identifier) {
+        receiver = makeStaticReceiver(callee.element);
         selector = makeIdentifier(callee.name);
         element = callee.element;
       } else {
         selector = makeExp(callee, CALLEE, beginStmt: beginStmt);
       }
       result = new tree.Send(
-          null,
+          receiver,
           selector,
           argList(exp.arguments.map(makeArgument)));
       if (callee is Identifier) {
@@ -331,7 +356,7 @@
     } else if (exp is CallStatic) {
       precedence = CALLEE;
       result = new tree.Send(
-          makeName(exp.className),
+          makeStaticReceiver(exp.element),
           makeIdentifier(exp.methodName),
           argList(exp.arguments.map(makeArgument)));
       setElement(result, exp.element, exp);
@@ -353,18 +378,27 @@
       if (beginStmt && exp.name != null) {
         needParen = true; // Do not mistake for function declaration.
       }
+      // exp.element can only be null in tests.
+      tree.Node body = exp.element != null &&
+          exp.element.node.body is tree.EmptyStatement
+        ? exp.element.node.body
+        : makeFunctionBody(exp.body);
       result = new tree.FunctionExpression(
-          exp.name != null ? makeIdentifier(exp.name) : null,
+          functionName(exp),
           makeParameters(exp.parameters),
-          makeBlock(exp.body),
-          exp.returnType != null ? makeType(exp.returnType) : null,
-          makeEmptyModifiers(), // TODO(asgerf): Function modifiers?
+          body,
+          exp.returnType == null || exp.element.isConstructor
+            ? null
+            : makeType(exp.returnType),
+          makeFunctionModifiers(exp),
           null,  // initializers
           null); // get/set
       setElement(result, exp.element, exp);
     } else if (exp is Identifier) {
       precedence = CALLEE;
-      result = new tree.Send(null, makeIdentifier(exp.name));
+      result = new tree.Send(
+          makeStaticReceiver(exp.element),
+          makeIdentifier(exp.name));
       setElement(result, exp.element, exp);
     } else if (exp is Increment) {
       Expression lvalue = exp.expression;
@@ -373,6 +407,7 @@
       tree.Node argument;
       bool innerBeginStmt = beginStmt && !exp.isPrefix;
       if (lvalue is Identifier) {
+        receiver = makeStaticReceiver(lvalue.element);
         selector = makeIdentifier(lvalue.name);
       } else if (lvalue is FieldExpression) {
         receiver = makeExp(lvalue.object, PRIMARY, beginStmt: innerBeginStmt);
@@ -457,6 +492,12 @@
       result = new tree.LiteralSymbol(
           hash,
           makeList('.', exp.id.split('.').map(makeIdentifier)));
+    } else if (exp is LiteralType) {
+      precedence = TYPE_LITERAL;
+      result = new tree.Send(
+          makeStaticReceiver(exp.element),
+          makeIdentifier(exp.name));
+      setElement(result, exp.element, exp);
     } else if (exp is StringConcat) {
       precedence = PRIMARY;
       result = unparseStringLiteral(exp);
@@ -518,6 +559,20 @@
         makeExpression(en.value));
   }
 
+  /// A comment token to be inserted when [INSERT_NEW_BACKEND_COMMENT] is true.
+  final SymbolToken newBackendComment = new SymbolToken(
+      const PrecedenceInfo('/* new backend */ ', 0, OPEN_CURLY_BRACKET_TOKEN),
+      -1);
+
+  tree.Node makeFunctionBody(Statement stmt) {
+    if (INSERT_NEW_BACKEND_COMMENT) {
+      return new tree.Block(makeList('', [makeBlock(stmt)],
+                                     open: newBackendComment));
+    } else {
+      return makeBlock(stmt);
+    }
+  }
+
   /// Produces a statement in a context where only blocks are allowed.
   tree.Node makeBlock(Statement stmt) {
     if (stmt is Block)
@@ -617,7 +672,7 @@
       return new tree.FunctionDeclaration(new tree.FunctionExpression(
           stmt.name != null ? makeIdentifier(stmt.name) : null,
           makeParameters(stmt.parameters),
-          makeBlock(stmt.body),
+          makeFunctionBody(stmt.body),
           stmt.returnType != null ? makeType(stmt.returnType) : null,
           makeEmptyModifiers(), // TODO(asgerf): Function modifiers?
           null,  // initializers
@@ -777,7 +832,8 @@
       Token assign = params.hasNamedParameters ? colon : eq;
       Token open = params.hasNamedParameters ? openBrace : openBracket;
       Token close = params.hasNamedParameters ? closeBrace : closeBracket;
-      List opt = params.optionalParameters.map((p) => makeParameter(p,assign));
+      Iterable<tree.Node> opt =
+          params.optionalParameters.map((p) => makeParameter(p,assign));
       nodes.add(new tree.NodeList(open, makeLink(opt), close, ','));
     }
     return argList(nodes);
@@ -794,6 +850,7 @@
           makeEmptyModifiers(), // TODO: Function parameter modifiers?
           null, // initializers
           null); // get/set
+      setElement(definition, param.element, param);
       if (param.defaultValue != null) {
         return new tree.SendSet(
             null,
@@ -801,7 +858,10 @@
             new tree.Operator(assignOperator),
             singleton(makeExpression(param.defaultValue)));
       } else {
-        return definition;
+        return new tree.VariableDefinitions(
+            null,
+            makeEmptyModifiers(),
+            singleton(definition));
       }
     } else {
       tree.Node definition;
@@ -842,6 +902,30 @@
     return new tree.Modifiers(makeList('', nodes));
   }
 
+  tree.Modifiers makeFunctionModifiers(FunctionExpression exp) {
+    if (exp.element == null) return makeEmptyModifiers();
+    List<tree.Node> modifiers = new List<tree.Node>();
+    if (exp.element is elements.ConstructorElement &&
+        exp.element.isFactoryConstructor) {
+      modifiers.add(makeIdentifier("factory"));
+    }
+    if (exp.element.isStatic) {
+      modifiers.add(makeIdentifier("static"));
+    }
+    return new tree.Modifiers(makeList('', modifiers));
+  }
+
+  tree.Node functionName(FunctionExpression exp) {
+    String name = exp.name;
+    if (name == null) return null;
+    if (isUserDefinableOperator(name)) {
+      return makeOperator("operator$name");
+    } else if (name == "unary-") {
+      return makeOperator("operator-");
+    }
+    return makeIdentifier(name);
+  }
+
   tree.Node parenthesize(tree.Node node) {
     return new tree.ParenthesizedExpression(node, openParen);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
index 45c7f3d..6d7d01b 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -255,7 +255,7 @@
 
   void tryMakeLocalPlaceholder(Element element, Identifier node) {
     bool isNamedOptionalParameter() {
-      FunctionElement function = element.enclosingElement;
+      FunctionTypedElement function = element.enclosingElement;
       FunctionSignature signature = function.functionSignature;
       if (!signature.optionalParametersAreNamed) return false;
       for (Element parameter in signature.optionalParameters) {
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
index 79b3a84..b3160f1 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
@@ -9,13 +9,18 @@
 import 'dart_tree.dart';
 
 class Block {
+  Label label;
   int index;
-  final List<Statement> statements = <Statement>[];
+  /// Mixed list of [Statement] and [Block].
+  /// A [Block] represents a synthetic goto statement.
+  final List statements = [];
   final List<Block> predecessors = <Block>[];
   final List<Block> successors = <Block>[];
 
   String get name => 'B$index';
 
+  Block([this.label]);
+
   void addEdgeTo(Block successor) {
     successors.add(successor);
     successor.predecessors.add(this);
@@ -36,6 +41,9 @@
   void _addStatement(Statement statement) {
     blocks.last.statements.add(statement);
   }
+  void _addGotoStatement(Block target) {
+    blocks.last.statements.add(target);
+  }
 
   void _addBlock(Block block) {
     block.index = blocks.length;
@@ -54,12 +62,14 @@
   visitLiteralList(LiteralList node) {}
   visitLiteralMap(LiteralMap node) {}
   visitConstant(Constant node) {}
+  visitThis(This node) {}
   visitConditional(Conditional node) {}
   visitLogicalOperator(LogicalOperator node) {}
   visitNot(Not node) {}
+  visitTypeOperator(TypeOperator node) {}
 
   visitLabeledStatement(LabeledStatement node) {
-    Block target = new Block();
+    Block target = new Block(node.label);
     breakTargets[node.label] = target;
     visitStatement(node.body);
     _addBlock(target);
@@ -99,8 +109,10 @@
     visitStatement(node.elseStatement);
   }
 
-  visitWhile(While node) {
+  visitWhileTrue(WhileTrue node) {
     Block continueTarget = new Block();
+    _addGotoStatement(continueTarget);
+
     continueTargets[node.label] = continueTarget;
     blocks.last.addEdgeTo(continueTarget);
     _addBlock(continueTarget);
@@ -108,13 +120,38 @@
     visitStatement(node.body);
   }
 
+  visitWhileCondition(WhileCondition node) {
+    Block whileBlock = new Block();
+    _addGotoStatement(whileBlock);
+
+    _addBlock(whileBlock);
+    _addStatement(node);
+    whileBlock.statements.add(node);
+    blocks.last.addEdgeTo(whileBlock);
+
+    Block bodyBlock = new Block();
+    Block nextBlock = new Block();
+    whileBlock.addEdgeTo(bodyBlock);
+    whileBlock.addEdgeTo(nextBlock);
+
+    continueTargets[node.label] = bodyBlock;
+    _addBlock(bodyBlock);
+    visitStatement(node.body);
+
+    _addBlock(nextBlock);
+    visitStatement(node.next);
+
+    ifTargets[node.body] = bodyBlock;
+    ifTargets[node.next] = nextBlock;
+  }
+
   visitExpressionStatement(ExpressionStatement node) {
     _addStatement(node);
     visitStatement(node.next);
   }
 }
 
-class TreeTracer extends TracerUtil with Visitor {
+class TreeTracer extends TracerUtil with StatementVisitor {
   final EventSink<String> output;
 
   TreeTracer(this.output);
@@ -152,11 +189,24 @@
         });
       });
       tag("HIR", () {
-        block.statements.forEach(visitStatement);
+        if (block.label != null) {
+          printStatement(null,
+              "Label ${block.name}, useCount=${block.label.useCount}");
+        }
+        block.statements.forEach(visitBlockMember);
       });
     });
   }
 
+  void visitBlockMember(member) {
+    if (member is Block) {
+      printStatement(null, "goto block B${member.name}");
+    } else {
+      assert(member is Statement);
+      visitStatement(member);
+    }
+  }
+
   void printStatement(String name, String contents) {
     int bci = 0;
     int uses = 0;
@@ -167,18 +217,6 @@
     add("$bci $uses $name $contents <|@\n");
   }
 
-  visitVariable(Variable node) {
-    printStatement(null, "dead-use ${names.varName(node)}");
-  }
-
-  visitInvokeStatic(InvokeStatic node) {
-    printStatement(null, expr(node));
-  }
-
-  visitConstant(Constant node) {
-    printStatement(null, "dead-use ${node.value}");
-  }
-
   visitLabeledStatement(LabeledStatement node) {
     // These do not get added to a block's list of statements.
   }
@@ -186,39 +224,8 @@
   visitAssign(Assign node) {
     String name = names.varName(node.variable);
     String rhs = expr(node.definition);
-    printStatement(name, "let $name = $rhs");
-  }
-
-  visitInvokeMethod(InvokeMethod node) {
-    printStatement(null, expr(node));
-  }
-
-  visitInvokeConstructor(InvokeConstructor node) {
-    printStatement(null, expr(node));
-  }
-
-  visitConcatenateStrings(ConcatenateStrings node) {
-    printStatement(null, expr(node));
-  }
-
-  visitLiteralList(LiteralList node) {
-    printStatement(null, expr(node));
-  }
-
-  visitLiteralMap(LiteralMap node) {
-    printStatement(null, expr(node));
-  }
-
-  visitConditional(Conditional node) {
-    printStatement(null, expr(node));
-  }
-
-  visitLogicalOperator(LogicalOperator node) {
-    printStatement(null, expr(node));
-  }
-
-  visitNot(Not node) {
-    printStatement(null, expr(node));
+    String extra = node.hasExactlyOneUse ? "[single-use]" : "";
+    printStatement(null, "assign $name = $rhs $extra");
   }
 
   visitReturn(Return node) {
@@ -231,7 +238,7 @@
 
   visitContinue(Continue node) {
     printStatement(null,
-        "continue ${collector.breakTargets[node.target].name}");
+        "continue ${collector.continueTargets[node.target].name}");
   }
 
   visitIf(If node) {
@@ -241,12 +248,20 @@
     printStatement(null, "if $condition then $thenTarget else $elseTarget");
   }
 
-  visitWhile(While node) {
+  visitWhileTrue(WhileTrue node) {
     printStatement(null, "while true do");
   }
 
+  visitWhileCondition(WhileCondition node) {
+    String bodyTarget = collector.ifTargets[node.body].name;
+    String nextTarget = collector.ifTargets[node.next].name;
+    printStatement(null, "while ${expr(node.condition)}");
+    printStatement(null, "do $bodyTarget");
+    printStatement(null, "then $nextTarget" );
+  }
+
   visitExpressionStatement(ExpressionStatement node) {
-    visitExpression(node.expression);
+    printStatement(null, expr(node.expression));
   }
 
   String expr(Expression e) {
@@ -254,7 +269,7 @@
   }
 }
 
-class SubexpressionVisitor extends Visitor<String, String> {
+class SubexpressionVisitor extends ExpressionVisitor<String> {
   Names names;
 
   SubexpressionVisitor(this.names);
@@ -298,7 +313,8 @@
       callName = '${node.type}.${node.target.name}';
     }
     String args = formatArguments(node);
-    return "new $callName($args)";
+    String keyword = node.constant != null ? 'const' : 'new';
+    return "$keyword $callName($args)";
   }
 
   String visitConcatenateStrings(ConcatenateStrings node) {
@@ -325,6 +341,10 @@
     return "${node.value}";
   }
 
+  String visitThis(This node) {
+    return "this";
+  }
+
   bool usesInfixNotation(Expression node) {
     return node is Conditional || node is LogicalOperator;
   }
@@ -348,6 +368,12 @@
     return "$left ${node.operator} $right";
   }
 
+  String visitTypeOperator(TypeOperator node) {
+    String receiver = visitExpression(node.receiver);
+    String type = "${node.type}";
+    return "TypeOperator $receiver ${node.operator} $type";
+  }
+
   String visitNot(Not node) {
     String operand = visitExpression(node.operand);
     if (usesInfixNotation(node.operand)) {
@@ -356,21 +382,6 @@
     return '!$operand';
   }
 
-  // Note: There should not be statements in the context of expressions.
-  String visitStatement(Statement node) {
-    return "$node statement in expression context";
-  }
-
-  String visitLabeledStatement(LabeledStatement node) => visitStatement(node);
-  String visitAssign(Assign node) => visitStatement(node);
-  String visitReturn(Return node) => visitStatement(node);
-  String visitBreak(Break node) => visitStatement(node);
-  String visitContinue(Continue node) => visitStatement(node);
-  String visitIf(If node) => visitStatement(node);
-  String visitWhile(While node) => visitStatement(node);
-  String visitExpressionStatement(ExpressionStatement node) {
-    return visitStatement(node);
-  }
 }
 
 /**
@@ -388,12 +399,9 @@
   String varName(Variable v) {
     String name = _names[v];
     if (name == null) {
-      name = v.name;
-      if (v.cachedName != null) {
-        name = v.cachedName;
-      }
+      String prefix = v.element == null ? 'v' : '${v.element.name}_';
       while (name == null || _usedNames.contains(name)) {
-        name = "v${_counter++}";
+        name = "$prefix${_counter++}";
       }
       _names[v] = name;
       _usedNames.add(name);
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 84b61f4..5a0335d 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -33,7 +33,8 @@
     PrefixElement,
     ClosureContainer,
     VoidElement,
-    TypedefElement;
+    TypedefElement,
+    AstElement;
 
 import 'util/util.dart' show
     Link;
@@ -294,7 +295,8 @@
   void _collectAllElementsAndConstantsResolvedFrom(
       Element element,
       Set<Element> elements,
-      Set<Constant> constants) {
+      Set<Constant> constants,
+      isMirrorUsage) {
 
     /// Recursively add the constant and its dependencies to [constants].
     void addConstants(Constant constant) {
@@ -311,13 +313,21 @@
     /// The collected dependent elements and constants are are added to
     /// [elements] and [constants] respectively.
     void collectDependencies(Element element) {
-      TreeElements treeElements = element is TypedefElement
-          ? element.treeElements
-          : compiler.enqueuer.resolution.getCachedElements(element);
+      // TODO(johnniwinther): Remove this when [AbstractFieldElement] has been
+      // removed.
+      if (element is! AstElement) return;
+      AstElement astElement = element;
 
       // TODO(sigurdm): We want to be more specific about this - need a better
       // way to query "liveness".
-      if (treeElements == null) return;
+      if (astElement is! TypedefElement &&
+          !compiler.enqueuer.resolution.hasBeenResolved(astElement)) {
+        return;
+      }
+
+      TreeElements treeElements = astElement.resolvedAst.elements;
+
+      assert(treeElements != null);
 
       for (Element dependency in treeElements.allElements) {
         if (Elements.isLocal(dependency) && !dependency.isFunction) continue;
@@ -344,10 +354,11 @@
     }
     if (element.isClass) {
       // If we see a class, add everything its live instance members refer
-      // to.  Static members are not relevant.
+      // to.  Static members are not relevant, unless we are processing
+      // extra dependencies due to mirrors.
       void addLiveInstanceMember(Element element) {
         if (!compiler.enqueuer.resolution.isLive(element)) return;
-        if (!element.isInstanceMember) return;
+        if (!isMirrorUsage && !element.isInstanceMember) return;
         collectDependencies(element.implementation);
       }
       ClassElement cls = element.declaration;
@@ -371,7 +382,7 @@
       ClassElement implementation =
           element.enclosingClass.implementation;
       _collectAllElementsAndConstantsResolvedFrom(
-          implementation, elements, constants);
+          implementation, elements, constants, isMirrorUsage);
     }
 
     // Other elements, in particular instance members, are ignored as
@@ -414,13 +425,16 @@
   /// Recursively traverses the graph of dependencies from [element], mapping
   /// deferred imports to each dependency it needs in the sets
   /// [_importedDeferredBy] and [_constantsDeferredBy].
-  void _mapDependencies(Element element, Import import) {
+  void _mapDependencies(Element element, Import import,
+                        {isMirrorUsage: false}) {
     Set<Element> elements = _importedDeferredBy.putIfAbsent(import,
         () => new Set<Element>());
     Set<Constant> constants = _constantsDeferredBy.putIfAbsent(import,
         () => new Set<Constant>());
 
-    if (elements.contains(element)) return;
+    // Only process elements once, unless we are doing dependencies due to
+    // mirrors, which are added in additional traversals.
+    if (!isMirrorUsage && elements.contains(element)) return;
     // Anything used directly by main will be loaded from the start
     // We do not need to traverse it again.
     if (import != _fakeMainImport && _mainElements.contains(element)) return;
@@ -432,7 +446,7 @@
 
     // This call can modify [_importedDeferredBy] and [_constantsDeferredBy].
     _collectAllElementsAndConstantsResolvedFrom(
-        element, dependentElements, constants);
+        element, dependentElements, constants, isMirrorUsage);
 
     LibraryElement library = element.library;
     for (Element dependency in dependentElements) {
@@ -458,7 +472,7 @@
       // So we have to filter them out here.
       if (element is AnalyzableElementX && !element.hasTreeElements) return;
       if (compiler.backend.isNeededForReflection(element)) {
-        _mapDependencies(element, deferredImport);
+        _mapDependencies(element, deferredImport, isMirrorUsage: true);
       }
     }
 
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index f5c8f26..2d05e8f 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -4,7 +4,11 @@
 
 library dump_info;
 
-import 'dart:convert' show HtmlEscape;
+import 'dart:convert' show
+    HtmlEscape,
+    JsonEncoder,
+    StringConversionSink,
+    ChunkedConversionSink;
 
 import 'elements/elements.dart';
 import 'elements/visitor.dart';
@@ -79,6 +83,14 @@
       ' bytes (${size * 100 ~/ programInfo.size}%)', cls: 'size');
 }
 
+String sizePercent(int size, ProgramInfo programInfo) {
+  if (size == null) {
+    return "0.000%";
+  } else {
+    return (100 * size / programInfo.size).toStringAsFixed(3) + "%";
+  }
+}
+
 /// An [InfoNode] holds information about a part the program.
 abstract class InfoNode {
   String get name;
@@ -87,6 +99,8 @@
 
   void emitHtml(ProgramInfo programInfo, StringSink buffer,
       [String indentation = '']);
+
+  Map<String, dynamic> toJson(ProgramInfo programInfo);
 }
 
 /// An [ElementNode] holds information about an [Element]
@@ -130,6 +144,25 @@
       this.extra: "",
       this.outputUnitId});
 
+  Map<String, dynamic> toJson(ProgramInfo programInfo) {
+    Map<String, dynamic> json = <String, dynamic>{
+      'kind': this.kind,
+      'modifiers': this.modifiers,
+      'name': this.name,
+      'type': this.type,
+      'size': this.size,
+      'sizePercent': sizePercent(this.size, programInfo),
+      'extra': this.extra
+    };
+
+    if (this.contents != null) {
+      json['children'] =
+        this.contents.map((c) => c.toJson(programInfo)).toList();
+    }
+
+    return json;
+  }
+
   void emitHtml(ProgramInfo programInfo, StringSink buffer,
       [String indentation = '']) {
     String kindString = span(esc(kind), cls: 'kind');
@@ -197,6 +230,16 @@
         code(esc(generatedCode)));
     buffer.write('\n');
   }
+
+  Map<String, dynamic> toJson(ProgramInfo programInfo) {
+    return <String, dynamic>{
+      'kind': 'code',
+      'description': description,
+      'code': generatedCode,
+      'size': generatedCode.length,
+      'sizePercent': sizePercent(generatedCode.length, programInfo)
+    };
+  }
 }
 
 /// Instances represent information inferred about the program such as
@@ -216,6 +259,15 @@
 
   InferredInfoNode({this.name: "", this.description, this.type});
 
+  Map<String, dynamic> toJson(ProgramInfo programInfo) {
+    return <String, dynamic>{
+      'kind': 'inferred',
+      'name': name,
+      'type': type,
+      'desc': description
+    };
+  }
+
   void emitHtml(ProgramInfo programInfo, StringBuffer buffer,
       [String indentation = '']) {
     buffer.write(indentation);
@@ -253,6 +305,15 @@
                this.compilationDuration,
                this.dart2jsVersion,
                this.outputUnitNumbering: null});
+
+  Map<String, dynamic> toJson() {
+    return <String, dynamic>{
+      'program_size': size,
+      'compile_time': compilationMoment.toString(),
+      'compile_duration': compilationDuration.toString(),
+      'dart2js_version': dart2jsVersion
+    };
+  }
 }
 
 class InfoDumpVisitor extends ElementVisitor<InfoNode> {
@@ -532,14 +593,34 @@
   void dumpInfo() {
     measure(() {
       ProgramInfo info = infoDumpVisitor.collectDumpInfo();
-      StringBuffer buffer = new StringBuffer();
-      dumpInfoHtml(info, buffer);
+
+      StringBuffer htmlBuffer = new StringBuffer();
+      dumpInfoHtml(info, htmlBuffer);
       compiler.outputProvider('', 'info.html')
-        ..add(buffer.toString())
+        ..add(htmlBuffer.toString())
+        ..close();
+
+      StringBuffer jsonBuffer = new StringBuffer();
+      dumpInfoJson(info, jsonBuffer);
+      compiler.outputProvider('', 'info.json')
+        ..add(jsonBuffer.toString())
         ..close();
     });
   }
 
+  void dumpInfoJson(ProgramInfo info, StringSink buffer) {
+    Map<String, dynamic> entire = <String, dynamic>{
+      'program': info.toJson(),
+      'libs': info.libraries.map((lib) => lib.toJson(info)).toList()
+    };
+
+    JsonEncoder encoder = const JsonEncoder();
+    ChunkedConversionSink<Object> sink =
+      encoder.startChunkedConversion(
+          new StringConversionSink.fromStringSink(buffer));
+    sink.add(entire);
+  }
+
   void dumpInfoHtml(ProgramInfo info, StringSink buffer) {
     int totalSize = info.size;
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index e5bf871..91e5476 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -293,6 +293,10 @@
   bool get isNative;
   bool get isDeferredLoaderGetter;
 
+  /// True if the element is declared in a patch library but has no
+  /// corresponding declaration in the origin library.
+  bool get isInjected;
+
   /// `true` if this element is a constructor, top level or local variable,
   /// or static field that is declared `const`.
   bool get isConst;
@@ -527,6 +531,15 @@
     }
   }
 
+  static String constructorNameForDiagnostics(String className,
+                                              String constructorName) {
+    String classNameString = className;
+    String constructorNameString = constructorName;
+    return (constructorName == '')
+        ? classNameString
+        : "$classNameString.$constructorNameString";
+  }
+
   /// Returns `true` if [name] is the name of an operator method.
   static bool isOperatorName(String name) {
     return name == 'unary-' || isUserDefinableOperator(name);
@@ -1240,6 +1253,10 @@
 
 /// An [Element] that holds a [TreeElements] mapping.
 abstract class AnalyzableElement extends Element {
+  /// Return `true` if [treeElements] have been (partially) computed for this
+  /// element.
+  bool get hasTreeElements;
+
   /// Returns the [TreeElements] that hold the resolution information for the
   /// AST nodes of this element.
   TreeElements get treeElements;
@@ -1249,7 +1266,22 @@
 ///
 /// Synthesized elements may return `null` from [node].
 abstract class AstElement extends AnalyzableElement {
+  /// The AST node of this element.
   Node get node;
+
+  bool get hasResolvedAst;
+
+  /// The defining AST node of this element with is corresponding
+  /// [TreeElements]. This is not available if [hasResolvedAst] is `false`.
+  ResolvedAst get resolvedAst;
+}
+
+class ResolvedAst {
+  final Element element;
+  final Node node;
+  final TreeElements elements;
+
+  ResolvedAst(this.element, this.node, this.elements);
 }
 
 /// A [MemberSignature] is a member of an interface.
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 880746a..7d6149a 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -28,7 +28,10 @@
 
 import '../dart_types.dart';
 
-import '../scanner/scannerlib.dart' show Token, EOF_TOKEN;
+import '../scanner/scannerlib.dart' show
+    EOF_TOKEN,
+    ErrorToken,
+    Token;
 
 import '../ordered_typeset.dart' show OrderedTypeSet;
 
@@ -104,6 +107,8 @@
 
   bool get isDeclaration => true;
 
+  bool get isInjected => !isPatch && implementationLibrary.isPatch;
+
   Element get implementation => this;
 
   Element get declaration => this;
@@ -152,7 +157,7 @@
     // The unary '-' operator has a special element name (specified).
     if (needle == 'unary-') needle = '-';
     for (Token t = token; EOF_TOKEN != t.kind; t = t.next) {
-      if (needle == t.value) return t;
+      if (t is !ErrorToken && needle == t.value) return t;
     }
     return token;
   }
@@ -265,9 +270,15 @@
 
   void diagnose(Element context, DiagnosticListener listener) {}
 
+  bool get hasTreeElements => analyzableElement.hasTreeElements;
+
   TreeElements get treeElements => analyzableElement.treeElements;
 
-  AnalyzableElement get analyzableElement => outermostEnclosingMemberOrTopLevel;
+  AnalyzableElement get analyzableElement {
+    Element element = outermostEnclosingMemberOrTopLevel;
+    if (element.isAbstractField || element.isPrefix) return element.library;
+    return element;
+  }
 }
 
 /**
@@ -297,6 +308,8 @@
 
   bool get isErroneous => true;
 
+  bool get isSynthesized => true;
+
   AbstractFieldElement abstractField;
 
   unsupported() {
@@ -305,6 +318,8 @@
 
   Link<MetadataAnnotation> get metadata => unsupported();
   get node => unsupported();
+  get hasResolvedAst => false;
+  get resolvedAst => unsupported();
   get type => unsupported();
   get cachedNode => unsupported();
   get functionSignature => unsupported();
@@ -965,11 +980,11 @@
 
   String toString() {
     if (origin != null) {
-      return 'patch library(${getLibraryOrScriptName()})';
+      return 'patch library(${canonicalUri})';
     } else if (patch != null) {
-      return 'origin library(${getLibraryOrScriptName()})';
+      return 'origin library(${canonicalUri})';
     } else {
-      return 'library(${getLibraryOrScriptName()})';
+      return 'library(${canonicalUri})';
     }
   }
 
@@ -1017,7 +1032,9 @@
 }
 
 class TypedefElementX extends ElementX
-    with AnalyzableElementX, TypeDeclarationElementX<TypedefType>
+    with AstElementMixin,
+         AnalyzableElementX,
+         TypeDeclarationElementX<TypedefType>
     implements TypedefElement {
   Typedef cachedNode;
 
@@ -1080,6 +1097,9 @@
   }
 
   accept(ElementVisitor visitor) => visitor.visitTypedefElement(this);
+
+  // A typedef cannot be patched therefore defines itself.
+  AstElement get definingElement => this;
 }
 
 // This class holds common information for a list of variable or field
@@ -1106,7 +1126,7 @@
   DartType computeType(Element element, Compiler compiler) => type;
 }
 
-class VariableElementX extends ElementX with AnalyzableElementX
+class VariableElementX extends ElementX with AstElementMixin
     implements VariableElement {
   final Token token;
   final VariableList variables;
@@ -1138,6 +1158,9 @@
     variables.metadata = variables.metadata.prepend(annotation);
   }
 
+  // A variable cannot be patched therefore defines itself.
+  AstElement get definingElement => this;
+
   VariableDefinitions get node {
     assert(invariant(this, definitionsCache != null,
         message: "Node has not been computed for $this."));
@@ -1194,12 +1217,13 @@
   }
 
   DartType computeType(Compiler compiler) {
+    if (variables.type != null) return variables.type;
     // Call [parseNode] to ensure that [definitionsCache] and [initializerCache]
     // are set as a consequence of calling [computeType].
-    compiler.withCurrentElement(this, () {
+    return compiler.withCurrentElement(this, () {
       parseNode(compiler);
+      return variables.computeType(this, compiler);
     });
-    return variables.computeType(this, compiler);
   }
 
   DartType get type {
@@ -1227,7 +1251,8 @@
   }
 }
 
-class FieldElementX extends VariableElementX implements FieldElement {
+class FieldElementX extends VariableElementX
+    with AnalyzableElementX implements FieldElement {
   List<FunctionElement> nestedClosures = new List<FunctionElement>();
 
   FieldElementX(Identifier name,
@@ -1264,7 +1289,8 @@
 /// patched with the corresponding parameter of the patch method. This is done
 /// to ensure that default values on parameters are computed once (on the
 /// origin parameter) but can be found through both the origin and the patch.
-class ParameterElementX extends ElementX with PatchMixin<ParameterElement>
+class ParameterElementX extends ElementX
+    with PatchMixin<ParameterElement>, AstElementMixin
     implements ParameterElement {
   final VariableDefinitions definitions;
   final Identifier identifier;
@@ -1315,6 +1341,9 @@
   FunctionType get functionType => type;
 
   accept(ElementVisitor visitor) => visitor.visitVariableElement(this);
+
+  // A parameter is defined by the declaration element.
+  AstElement get definingElement => declaration;
 }
 
 class AbstractFieldElementX extends ElementX implements AbstractFieldElement {
@@ -1440,8 +1469,8 @@
       if (requiredParameterCount != signature.requiredParameterCount) {
         return false;
       }
-      Set<String> names = optionalParameters.toList().map(
-          (Element element) => element.name).toSet();
+      Set<String> names = optionalParameters.mapToSet(
+          (Element element) => element.name);
       for (Element namedParameter in signature.optionalParameters) {
         if (!names.contains(namedParameter.name)) {
           return false;
@@ -1461,8 +1490,8 @@
   }
 }
 
-abstract class FunctionElementX
-    extends ElementX with AnalyzableElementX, PatchMixin<FunctionElement>
+abstract class BaseFunctionElementX
+    extends ElementX with PatchMixin<FunctionElement>, AstElementMixin
     implements FunctionElement {
   DartType typeCache;
   final Modifiers modifiers;
@@ -1475,20 +1504,11 @@
 
   AbstractFieldElement abstractField;
 
-  FunctionElementX(String name,
-                   ElementKind kind,
-                   Modifiers modifiers,
-                   Element enclosing,
-                   bool hasNoBody)
-      : this.tooMuchOverloading(name, kind, modifiers, enclosing, null,
-                                hasNoBody);
-
-  FunctionElementX.tooMuchOverloading(String name,
-                                      ElementKind kind,
-                                      this.modifiers,
-                                      Element enclosing,
-                                      this.functionSignatureCache,
-                                      bool hasNoBody)
+  BaseFunctionElementX(String name,
+                       ElementKind kind,
+                       Modifiers this.modifiers,
+                       Element enclosing,
+                       bool hasNoBody)
       : super(name, kind, enclosing),
         _hasNoBody = hasNoBody {
     assert(modifiers != null);
@@ -1545,9 +1565,22 @@
   }
 
   accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
+
+  // A function is defined by the implementation element.
+  AstElement get definingElement => implementation;
 }
 
-class LocalFunctionElementX extends FunctionElementX {
+abstract class FunctionElementX extends BaseFunctionElementX
+    with AnalyzableElementX {
+  FunctionElementX(String name,
+                   ElementKind kind,
+                   Modifiers modifiers,
+                   Element enclosing,
+                   bool hasNoBody)
+      : super(name, kind, modifiers, enclosing, hasNoBody);
+}
+
+class LocalFunctionElementX extends BaseFunctionElementX {
   final FunctionExpression node;
 
   LocalFunctionElementX(String name,
@@ -1651,7 +1684,7 @@
   FunctionExpression get node => null;
 }
 
-class ConstructorBodyElementX extends FunctionElementX
+class ConstructorBodyElementX extends BaseFunctionElementX
     implements ConstructorBodyElement {
   FunctionElement constructor;
 
@@ -1677,6 +1710,8 @@
 
   Element get outermostEnclosingMemberOrTopLevel => constructor;
 
+  Element get analyzableElement => constructor.analyzableElement;
+
   accept(ElementVisitor visitor) => visitor.visitConstructorBodyElement(this);
 }
 
@@ -1829,7 +1864,8 @@
 }
 
 abstract class BaseClassElementX extends ElementX
-    with AnalyzableElementX,
+    with AstElementMixin,
+         AnalyzableElementX,
          TypeDeclarationElementX<InterfaceType>,
          PatchMixin<ClassElement>,
          ClassMemberMixin
@@ -2222,12 +2258,24 @@
   // TODO(johnniwinther): Remove these when issue 18630 is fixed.
   ClassElement get patch => super.patch;
   ClassElement get origin => super.origin;
+
+  // A class declaration is defined by the declaration element.
+  AstElement get definingElement => declaration;
 }
 
 abstract class ClassElementX extends BaseClassElementX {
-  Link<Element> localMembers = const Link<Element>();
+  Link<Element> localMembersReversed = const Link<Element>();
   final ScopeX localScope = new ScopeX();
 
+  Link<Element> localMembersCache;
+
+  Link<Element> get localMembers {
+    if (localMembersCache == null) {
+      localMembersCache = localMembersReversed.reverse();
+    }
+    return localMembersCache;
+  }
+
   ClassElementX(String name, Element enclosing, int id, int initialState)
       : super(name, enclosing, id, initialState);
 
@@ -2237,7 +2285,8 @@
   bool get hasLocalScopeMembers => !localScope.isEmpty;
 
   void addMember(Element element, DiagnosticListener listener) {
-    localMembers = localMembers.prepend(element);
+    localMembersCache = null;
+    localMembersReversed = localMembersReversed.prepend(element);
     addToScope(element, listener);
   }
 
@@ -2257,7 +2306,7 @@
   }
 
   void forEachLocalMember(void f(Element member)) {
-    localMembers.reverse().forEach(f);
+    localMembers.forEach(f);
   }
 
   bool get hasConstructor {
@@ -2269,9 +2318,8 @@
   }
 
   void setDefaultConstructor(FunctionElement constructor, Compiler compiler) {
-    addToScope(constructor, compiler);
     // The default constructor, although synthetic, is part of a class' API.
-    localMembers = localMembers.prepend(constructor);
+    addMember(constructor, compiler);
   }
 
   Link<DartType> computeTypeParameters(Compiler compiler) {
@@ -2442,7 +2490,8 @@
   accept(ElementVisitor visitor) => visitor.visitTargetElement(this);
 }
 
-class TypeVariableElementX extends ElementX implements TypeVariableElement {
+class TypeVariableElementX extends ElementX with AstElementMixin
+    implements TypeVariableElement {
   final Node node;
   TypeVariableType typeCache;
   DartType boundCache;
@@ -2471,6 +2520,9 @@
   Token get position => node.getBeginToken();
 
   accept(ElementVisitor visitor) => visitor.visitTypeVariableElement(this);
+
+  // A type variable cannot be patched therefore defines itself.
+  AstElement get definingElement => this;
 }
 
 /**
@@ -2569,3 +2621,24 @@
     patch.origin = this;
   }
 }
+
+/// Abstract implementation of the [AstElement] interface.
+abstract class AstElementMixin implements AstElement {
+  /// The element whose node defines this element.
+  ///
+  /// For patched functions the defining element is the patch element found
+  /// through [implementation] since its node define the implementation of the
+  /// function. For patched classes the defining element is the origin element
+  /// found through [declaration] since its node define the inheritance relation
+  /// for the class. For unpatched elements the defining element is the element
+  /// itself.
+  AstElement get definingElement;
+
+  bool get hasResolvedAst => definingElement.hasTreeElements;
+
+  ResolvedAst get resolvedAst {
+    return new ResolvedAst(declaration,
+        definingElement.node, definingElement.treeElements);
+  }
+
+}
diff --git a/sdk/lib/_internal/compiler/implementation/elements/names.dart b/sdk/lib/_internal/compiler/implementation/elements/names.dart
index 7dfdf3a..56f3bf1 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/names.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/names.dart
@@ -45,6 +45,7 @@
   /// Returns `true` if this name is the same as [other] not taking the library
   /// privacy into account.
   bool isSimilarTo(Name other);
+  int get similarHashCode;
 }
 
 class PublicName implements Name {
@@ -61,7 +62,7 @@
 
   bool get isPrivate => false;
 
-  int get hashCode => text.hashCode + 11 * isSetter.hashCode;
+  int get hashCode => similarHashCode;
 
   bool operator ==(other) {
     if (other is! PublicName) return false;
@@ -70,6 +71,7 @@
 
   bool isSimilarTo(Name other) =>
       text == other.text && isSetter == other.isSetter;
+  int get similarHashCode => text.hashCode + 11 * isSetter.hashCode;
 
   String toString() => isSetter ? '$text=' : text;
 }
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index a33db7f..4ce3d5c 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -85,6 +85,7 @@
   Enqueuer(this.name, this.compiler, this.itemCompilationContextCreator);
 
   Queue<WorkItem> get queue;
+  bool get queueIsEmpty => queue.isEmpty;
 
   /// Returns [:true:] if this enqueuer is the resolution enqueuer.
   bool get isResolutionQueue => false;
@@ -130,11 +131,6 @@
     registerInstantiatedType(cls.rawType, registry);
   }
 
-  void registerTypeLiteral(DartType type, Registry registry) {
-    registerInstantiatedClass(compiler.typeClass, registry);
-    compiler.backend.registerTypeLiteral(type, this, registry);
-  }
-
   bool checkNoEnqueuedInvokedInstanceMethods() {
     task.measure(() {
       // Run through the classes and see if we need to compile methods.
@@ -312,11 +308,6 @@
     });
   }
 
-  /// Called when [:const Symbol(name):] is seen.
-  void registerConstSymbol(String name, Registry registry) {
-    compiler.backend.registerConstSymbol(name, registry);
-  }
-
   void pretendElementWasUsed(Element element, Registry registry) {
     if (!compiler.backend.isNeededForReflection(element)) return;
     if (Elements.isUnresolved(element)) {
@@ -348,11 +339,6 @@
     }
   }
 
-  /// Called when [:new Symbol(...):] is seen.
-  void registerNewSymbol(Registry registry) {
-    compiler.backend.registerNewSymbol(registry);
-  }
-
   void enqueueEverything() {
     if (hasEnqueuedEverything) return;
     compiler.log('Enqueuing everything');
@@ -455,8 +441,11 @@
 
   void registerGetOfStaticFunction(FunctionElement element) {
     registerStaticUse(element);
-    registerInstantiatedClass(compiler.closureClass,
-                              compiler.globalDependencies);
+    if (compiler.closureClass != null) {
+      // TODO(johnniwinther): Move this to the JavaScript backend.
+      registerInstantiatedClass(compiler.closureClass,
+                                compiler.globalDependencies);
+    }
     universe.staticFunctionsNeedingGetter.add(element);
   }
 
@@ -502,7 +491,6 @@
     // against the type variable of a typedef.
     assert(type.kind != TypeKind.TYPE_VARIABLE ||
            !type.element.enclosingElement.isTypedef);
-    compiler.backend.registerIsCheck(type, this, registry);
   }
 
   /**
@@ -514,11 +502,6 @@
     universe.usingFactoryWithTypeArguments = true;
   }
 
-  void registerAsCheck(DartType type, Registry registry) {
-    registerIsCheck(type, registry);
-    compiler.backend.registerAsCheck(type, this, registry);
-  }
-
   void registerGenericCallMethod(Element element, Registry registry) {
     compiler.backend.registerGenericCallMethod(element, this, registry);
     universe.genericCallMethods.add(element);
@@ -582,7 +565,7 @@
    *
    * Invariant: Key elements are declaration elements.
    */
-  final Map<Element, TreeElements> resolvedElements;
+  final Set<AstElement> resolvedElements;
 
   final Queue<ResolutionWorkItem> queue;
 
@@ -595,41 +578,35 @@
   ResolutionEnqueuer(Compiler compiler,
                      ItemCompilationContext itemCompilationContextCreator())
       : super('resolution enqueuer', compiler, itemCompilationContextCreator),
-        resolvedElements = new Map<Element, TreeElements>(),
+        resolvedElements = new Set<AstElement>(),
         queue = new Queue<ResolutionWorkItem>(),
         deferredTaskQueue = new Queue<DeferredTask>();
 
   bool get isResolutionQueue => true;
 
-  bool isProcessed(Element member) => resolvedElements.containsKey(member);
+  bool isProcessed(Element member) => resolvedElements.contains(member);
+
+  /// Returns `true` if [element] has been processed by the resolution enqueuer.
+  bool hasBeenResolved(Element element) {
+    return resolvedElements.contains(element.analyzableElement.declaration);
+  }
+
+  /// Registers [element] as resolved for the resolution enqueuer.
+  void registerResolvedElement(AstElement element) {
+    resolvedElements.add(element);
+  }
 
   /// Returns [:true:] if [element] has actually been used.
   bool isLive(Element element) {
     if (seenClasses.contains(element)) return true;
-    if (getCachedElements(element) != null) return true;
+    if (hasBeenResolved(element)) return true;
     return false;
   }
 
-  TreeElements getCachedElements(Element element) {
-    // TODO(ngeoffray): Get rid of this check.
-    if (element.enclosingElement.isClosure) {
-      closureMapping.ClosureClassElement cls = element.enclosingElement;
-      element = cls.methodElement;
-    } else if (element.isGenerativeConstructorBody) {
-      ConstructorBodyElement body = element;
-      element = body.constructor;
-    }
-    Element owner = element.outermostEnclosingMemberOrTopLevel;
-    if (owner == null) {
-      owner = element;
-    }
-    return resolvedElements[owner.declaration];
-  }
-
   void internalAddToWorkList(Element element) {
     assert(invariant(element, element is AnalyzableElement,
         message: 'Element $element is not analyzable.'));
-    if (getCachedElements(element) != null) return;
+    if (hasBeenResolved(element)) return;
     if (queueIsClosed) {
       throw new SpannableAssertionFailure(element,
           "Resolution work list is closed. Trying to add $element.");
@@ -739,15 +716,21 @@
   final Map<Element, js.Expression> generatedCode =
       new Map<Element, js.Expression>();
 
+  final Set<Element> newlyEnqueuedElements;
+
   CodegenEnqueuer(Compiler compiler,
                   ItemCompilationContext itemCompilationContextCreator())
-      : super('codegen enqueuer', compiler, itemCompilationContextCreator),
-        queue = new Queue<CodegenWorkItem>();
+      : queue = new Queue<CodegenWorkItem>(),
+        newlyEnqueuedElements = compiler.cacheStrategy.newSet(),
+        super('codegen enqueuer', compiler, itemCompilationContextCreator);
 
   bool isProcessed(Element member) =>
       member.isAbstract || generatedCode.containsKey(member);
 
   void internalAddToWorkList(Element element) {
+    if (compiler.hasIncrementalSupport) {
+      newlyEnqueuedElements.add(element);
+    }
     // Don't generate code for foreign elements.
     if (element.isForeign(compiler)) return;
 
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
index 361d2f2..ab4bb45 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
@@ -509,7 +509,8 @@
 
   @override
   Selector newTypedSelector(ConcreteType receiver, Selector selector) {
-    return new TypedSelector(concreteTypeToTypeMask(receiver), selector);
+    return new TypedSelector(concreteTypeToTypeMask(receiver), selector,
+        compiler);
   }
 
   @override
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
index 4b3d0b5..90e1379 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
@@ -630,7 +630,7 @@
                   [LocalsHandler<T> handler])
     : this.analyzedElement = analyzedElement,
       this.locals = handler,
-      super(compiler.enqueuer.resolution.getCachedElements(analyzedElement),
+      super(analyzedElement.resolvedAst.elements,
             compiler) {
     if (handler != null) return;
     Node node = analyzedElement.node;
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
index e74d9ab..1e9b36c 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -118,7 +118,7 @@
   }
 
   Selector newTypedSelector(TypeMask receiver, Selector selector) {
-    return new TypedSelector(receiver, selector);
+    return new TypedSelector(receiver, selector, compiler);
   }
 
   TypeMask addPhiInput(Element element, TypeMask phiType, TypeMask newType) {
@@ -352,13 +352,13 @@
   }
 
   void updateSelectorInTree(
-      Element owner, Spannable node, Selector selector) {
+      AstElement owner, Spannable node, Selector selector) {
     if (node is ir.Node) {
       // TODO(lry): update selector for IrInvokeDynamic.
       throw "updateSelector for IR node $node";
     }
     ast.Node astNode = node;
-    var elements = compiler.enqueuer.resolution.getCachedElements(owner);
+    TreeElements elements = owner.resolvedAst.elements;
     if (astNode.asSendSet() != null) {
       if (selector.isSetter || selector.isIndexSet) {
         elements.setSelector(node, selector);
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
index f8d4594..2b92fb5 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -364,7 +364,7 @@
     // kinds of [TypeInformation] have the empty type at this point of
     // analysis.
     return info.isConcrete
-        ? new TypedSelector(info.type, selector)
+        ? new TypedSelector(info.type, selector, compiler)
         : selector;
   }
 
@@ -1014,8 +1014,11 @@
   Iterable<Element> sortResolvedElements() {
     int max = 0;
     Map<int, Setlet<Element>> methodSizes = new Map<int, Setlet<Element>>();
-    compiler.enqueuer.resolution.resolvedElements.forEach(
-      (Element element, TreeElementMapping mapping) {
+    compiler.enqueuer.resolution.resolvedElements.forEach((AstElement element) {
+        // TODO(ngeoffray): Not sure why the resolver would put a null
+        // mapping.
+        if (!compiler.enqueuer.resolution.hasBeenResolved(element)) return;
+        TreeElementMapping mapping = element.resolvedAst.elements;
         element = element.implementation;
         if (element.impliesType) return;
         assert(invariant(element,
@@ -1025,9 +1028,6 @@
             element.isGetter ||
             element.isSetter,
             message: 'Unexpected element kind: ${element.kind}'));
-        // TODO(ngeoffray): Not sure why the resolver would put a null
-        // mapping.
-        if (mapping == null) return;
         if (element.isAbstract) return;
         // Put the other operators in buckets by length, later to be added in
         // length order.
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
index 20c4dc3..e6727ae 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
@@ -556,7 +556,7 @@
     if (selector.mask != receiverType) {
       return receiverType == inferrer.compiler.typesTask.dynamicType
           ? selector.asUntyped
-          : new TypedSelector(receiverType, selector);
+          : new TypedSelector(receiverType, selector, inferrer.compiler);
     } else {
       return selector;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index 984df98..209bd20 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -14,6 +14,7 @@
 import '../dart_backend/dart_backend.dart' show DartBackend;
 import '../universe/universe.dart' show SelectorKind;
 import '../util/util.dart' show Link;
+import '../helpers/helpers.dart';
 
 /**
  * This task iterates through all resolved elements and builds [ir.Node]s. The
@@ -47,10 +48,10 @@
   void buildNodes() {
     if (!irEnabled()) return;
     measure(() {
-      Map<Element, TreeElements> resolved =
-          compiler.enqueuer.resolution.resolvedElements;
-      resolved.forEach((Element element, TreeElements elementsMapping) {
+      Set<Element> resolved = compiler.enqueuer.resolution.resolvedElements;
+      resolved.forEach((AstElement element) {
         if (canBuild(element)) {
+          TreeElements elementsMapping = element.resolvedAst.elements;
           element = element.implementation;
 
           SourceFile sourceFile = elementSourceFile(element);
@@ -96,28 +97,25 @@
     FunctionElement function = element.asFunctionElement();
     if (function == null) return false;
 
+    if (!compiler.backend.shouldOutput(function)) return false;
+
     // TODO(kmillikin): support functions with optional parameters.
     FunctionSignature signature = function.functionSignature;
     if (signature.optionalParameterCount > 0) return false;
 
-    SupportedTypeVerifier typeVerifier = new SupportedTypeVerifier();
-    if (!typeVerifier.visit(signature.type.returnType, null)) return false;
-    bool parameters_ok = true;
-    signature.forEachParameter((parameter) {
-      parameters_ok =
-          parameters_ok && typeVerifier.visit(parameter.type, null);
-    });
-    if (!parameters_ok) return false;
-
     // TODO(kmillikin): support getters and setters and static class members.
     // With the current Dart Tree emitter they just require recognizing them
     // and generating the correct syntax.
     if (element.isGetter || element.isSetter) return false;
-    if (element.enclosingElement.isClass) return false;
 
     // TODO(lry): support native functions (also in [visitReturn]).
     if (function.isNative) return false;
 
+    // TODO(asgerf): support syntax for redirecting factory constructors
+    if (function is ConstructorElement && function.isRedirectingFactory) {
+      return false;
+    }
+
     return true;
   }
 
@@ -191,6 +189,7 @@
   // used to determine if a join-point continuation needs to be passed
   // arguments, and what the arguments are.
   final Map<Element, int> variableIndex;
+  final List<Element> index2variable;
   final List<ir.Parameter> freeVars;
   final List<ir.Primitive> assignedVars;
 
@@ -201,6 +200,7 @@
         variableIndex = <Element, int>{},
         freeVars = null,
         assignedVars = <ir.Primitive>[],
+        index2variable = <Element>[],
         super(elements, compiler);
 
   /// Construct a delimited visitor.
@@ -214,6 +214,7 @@
             growable: false),
         assignedVars = new List<ir.Primitive>.generate(
             parent.assignedVars.length, (_) => null),
+        index2variable = new List<Element>.from(parent.index2variable),
         super(parent.elements, parent.compiler);
 
   /**
@@ -240,6 +241,7 @@
       parameters.add(parameter);
       variableIndex[parameterElement] = assignedVars.length;
       assignedVars.add(parameter);
+      index2variable.add(parameterElement);
     });
 
     visit(function.body);
@@ -345,7 +347,7 @@
         // left and right subterms we will still have a join continuation with
         // possibly arguments passed to it.  Such singly-used continuations
         // are eliminated by the shrinking conversions.
-        parameters.add(new ir.Parameter(null));
+        parameters.add(new ir.Parameter(index2variable[i]));
         ir.Primitive reachingDefinition =
             assignedVars[i] == null ? freeVars[i] : assignedVars[i];
         leftArguments.add(
@@ -395,7 +397,7 @@
       // If not, no value needs to be passed to the join point.
       if (reachingAssignment == null) continue;
 
-      parameters.add(new ir.Parameter(null));
+      parameters.add(new ir.Parameter(index2variable[i]));
       ir.Definition entryAssignment = assignedVars[i];
       entryArguments.add(
           entryAssignment == null ? freeVars[i] : entryAssignment);
@@ -620,6 +622,9 @@
 
   ir.Primitive visitVariableDefinitions(ast.VariableDefinitions node) {
     assert(isOpen);
+    if (node.modifiers.isConst) {
+      return giveup(node, 'Local const'); // TODO(asgerf): const vars
+    }
     for (ast.Node definition in node.definitions.nodes) {
       Element element = elements[definition];
       // Definitions are either SendSets if there is an initializer, or
@@ -628,16 +633,22 @@
         assert(!definition.arguments.isEmpty);
         assert(definition.arguments.tail.isEmpty);
         ir.Primitive initialValue = visit(definition.arguments.head);
+        // In case a primitive was introduced for the initializer expression,
+        // use this variable element to help derive a good name for it.
+        initialValue.useElementAsHint(element);
         variableIndex[element] = assignedVars.length;
         assignedVars.add(initialValue);
+        index2variable.add(element);
       } else {
         assert(definition is ast.Identifier);
         // The initial value is null.
         // TODO(kmillikin): Consider pooling constants.
         ir.Constant constant = new ir.Constant(constantSystem.createNull());
+        constant.useElementAsHint(element);
         add(new ir.LetPrim(constant));
         variableIndex[element] = assignedVars.length;
         assignedVars.add(constant);
+        index2variable.add(element);
       }
     }
     return null;
@@ -650,7 +661,7 @@
   ir.Primitive visitReturn(ast.Return node) {
     assert(isOpen);
     // TODO(lry): support native returns.
-    if (node.beginToken.value == 'native') return giveup();
+    if (node.beginToken.value == 'native') return giveup(node, 'Native return');
     ir.Primitive value;
     if (node.expression == null) {
       value = new ir.Constant(constantSystem.createNull());
@@ -767,52 +778,43 @@
     return constant;
   }
 
-  bool isSupportedConst(Constant constant) {
-    return const SupportedConstantVisitor().visit(constant);
-  }
-
   ir.Primitive visitLiteralList(ast.LiteralList node) {
     assert(isOpen);
-    ir.Primitive result;
-    if (node.isConst) {
-      // TODO(sigurdm): Remove when all constants are supported.
-      Constant constant = getConstantForNode(node);
-      if (!isSupportedConst(constant)) return giveup();
-      result = new ir.Constant(constant);
-    } else {
-      List<ir.Primitive> values = new List<ir.Primitive>();
-      node.elements.nodes.forEach((ast.Node node) {
-        values.add(visit(node));
-      });
-      result = new ir.LiteralList(values);
-    }
+    List<ir.Primitive> values = node.elements.nodes.mapToList(visit);
+    Constant constant = node.isConst ? getConstantForNode(node) : null;
+    GenericType type = elements.getType(node);
+    ir.Primitive result = new ir.LiteralList(type, values, constant);
     add(new ir.LetPrim(result));
     return result;
   }
 
   ir.Primitive visitLiteralMap(ast.LiteralMap node) {
     assert(isOpen);
-    ir.Primitive result;
-    if (node.isConst) {
-      // TODO(sigurdm): Remove when all constants are supported.
-      Constant constant = getConstantForNode(node);
-      if (!isSupportedConst(constant)) return giveup();
-      result = new ir.Constant(constant);
-    } else {
-      List<ir.Primitive> keys = new List<ir.Primitive>();
-      List<ir.Primitive> values = new List<ir.Primitive>();
-      node.entries.nodes.forEach((ast.LiteralMapEntry node) {
-        keys.add(visit(node.key));
-        values.add(visit(node.value));
-      });
-      result = new ir.LiteralMap(keys, values);
-    }
+    List<ir.Primitive> keys = new List<ir.Primitive>();
+    List<ir.Primitive> values = new List<ir.Primitive>();
+    node.entries.nodes.forEach((ast.LiteralMapEntry node) {
+      keys.add(visit(node.key));
+      values.add(visit(node.value));
+    });
+    GenericType type = elements.getType(node);
+    Constant constant = node.isConst ? getConstantForNode(node) : null;
+    ir.Primitive result = new ir.LiteralMap(type, keys, values, constant);
     add(new ir.LetPrim(result));
     return result;
   }
 
-  // TODO(kmillikin): other literals.
-  //   LiteralSymbol
+  ir.Primitive visitLiteralSymbol(ast.LiteralSymbol node) {
+    assert(isOpen);
+    ir.Constant constant = new ir.Constant(getConstantForNode(node));
+    add(new ir.LetPrim(constant));
+    return constant;
+  }
+
+  ir.Primitive visitIdentifier(ast.Identifier node) {
+    assert(isOpen);
+    assert(node.isThis());
+    return lookupThis();
+  }
 
   ir.Primitive visitParenthesizedExpression(
       ast.ParenthesizedExpression node) {
@@ -840,6 +842,12 @@
     return receiver;
   }
 
+  ir.Primitive lookupThis() {
+    ir.Primitive result = new ir.This();
+    add(new ir.LetPrim(result));
+    return result;
+  }
+
   ir.Primitive lookupLocal(Element element) {
     int index = variableIndex[element];
     ir.Primitive value = assignedVars[index];
@@ -849,7 +857,7 @@
   // ==== Sends ====
   ir.Primitive visitAssert(ast.Send node) {
     assert(isOpen);
-    return giveup();
+    return giveup(node, 'Assert');
   }
 
   ir.Primitive visitNamedArgument(ast.NamedArgument node) {
@@ -889,7 +897,7 @@
   ir.Primitive visitDynamicSend(ast.Send node) {
     assert(isOpen);
     if (node.receiver == null || node.receiver.isSuper()) {
-      return giveup();
+      return giveup(node, 'DynamicSend without receiver, or super receiver');
     }
     Selector selector = elements.getSelector(node);
     ir.Primitive receiver = visit(node.receiver);
@@ -911,7 +919,9 @@
     if (Elements.isLocal(element)) {
       return lookupLocal(element);
     } else if (element == null || Elements.isInstanceField(element)) {
-      ir.Primitive receiver = visit(node.receiver);
+      ir.Primitive receiver = node.receiver == null
+          ? lookupThis()
+          : visit(node.receiver);
       ir.Parameter v = new ir.Parameter(null);
       ir.Continuation k = new ir.Continuation([v]);
       Selector selector = elements.getSelector(node);
@@ -919,13 +929,52 @@
       ir.InvokeMethod invoke = new ir.InvokeMethod(receiver, selector, k, []);
       add(new ir.LetCont(k, invoke));
       return v;
+    } else if (element.isField) {
+      ir.Parameter v = new ir.Parameter(null);
+      ir.Continuation k = new ir.Continuation([v]);
+      Selector selector = elements.getSelector(node);
+      assert(selector.kind == SelectorKind.GETTER);
+      ir.InvokeStatic invoke = new ir.InvokeStatic(element, selector, k, []);
+      add(new ir.LetCont(k, invoke));
+      return v;
+    } else if (Elements.isStaticOrTopLevelFunction(element)) {
+      ir.Primitive prim = new ir.Constant(new FunctionConstant(element));
+      add(new ir.LetPrim(prim));
+      return prim;
     } else {
-      // TODO(asgerf): static and top-level
-      // NOTE: Index-getters are OperatorSends, not GetterSends
-      return giveup();
+      return giveup(node); // TODO(asgerf): figure out what's missing here
     }
   }
 
+  ir.Primitive buildNegation(ir.Primitive condition) {
+    // ! e is translated as e ? false : true
+
+    // Add a continuation parameter for the result of the expression.
+    ir.Parameter resultParameter = new ir.Parameter(null);
+
+    ir.Continuation joinContinuation = new ir.Continuation([resultParameter]);
+    ir.Continuation thenContinuation = new ir.Continuation([]);
+    ir.Continuation elseContinuation = new ir.Continuation([]);
+
+    ir.Constant trueConstant =
+        new ir.Constant(constantSystem.createBool(true));
+    ir.Constant falseConstant =
+        new ir.Constant(constantSystem.createBool(false));
+
+    thenContinuation.body = new ir.LetPrim(falseConstant)
+        ..plug(new ir.InvokeContinuation(joinContinuation, [falseConstant]));
+    elseContinuation.body = new ir.LetPrim(trueConstant)
+        ..plug(new ir.InvokeContinuation(joinContinuation, [trueConstant]));
+
+    add(new ir.LetCont(joinContinuation,
+          new ir.LetCont(thenContinuation,
+            new ir.LetCont(elseContinuation,
+              new ir.Branch(new ir.IsTrue(condition),
+                            thenContinuation,
+                            elseContinuation)))));
+    return resultParameter;
+  }
+
   ir.Primitive translateLogicalOperator(ast.Operator op,
                                         ast.Expression left,
                                         ast.Expression right) {
@@ -1027,7 +1076,36 @@
       assert(node.arguments.tail.isEmpty);
       return translateLogicalOperator(op, node.receiver, node.arguments.head);
     }
-    return giveup();
+    if (op.source == "!") {
+      assert(node.receiver != null);
+      assert(node.arguments.isEmpty);
+      return buildNegation(visit(node.receiver));
+    }
+    if (op.source == "!=") {
+      assert(node.receiver != null);
+      assert(!node.arguments.isEmpty);
+      assert(node.arguments.tail.isEmpty);
+      return buildNegation(visitDynamicSend(node));
+    }
+    if (op.source == "is") {
+      DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast);
+      if (type.isMalformed) return giveup(node, "Malformed type for is");
+      ir.Primitive receiver = visit(node.receiver);
+      ir.IsCheck isCheck = new ir.IsCheck(receiver, type);
+      add(new ir.LetPrim(isCheck));
+      return node.isIsNotCheck ? buildNegation(isCheck) : isCheck;
+    }
+    if (op.source == "as") {
+      DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast);
+      if (type.isMalformed) return giveup(node, "Malformed type for as");
+      ir.Primitive receiver = visit(node.receiver);
+      ir.Parameter v = new ir.Parameter(null);
+      ir.Continuation k = new ir.Continuation([v]);
+      ir.AsCast asCast = new ir.AsCast(receiver, type, k);
+      add(new ir.LetCont(k, asCast));
+      return v;
+    }
+    return giveup(node);
   }
 
   // Build(StaticSend(f, arguments), C) = C[C'[InvokeStatic(f, xs)]]
@@ -1035,28 +1113,23 @@
   ir.Primitive visitStaticSend(ast.Send node) {
     assert(isOpen);
     Element element = elements[node];
-    // TODO(lry): support static fields. (separate IR instruction?)
-    if (element.isField || element.isGetter) return giveup();
-    // TODO(kmillikin): support static setters.
-    if (element.isSetter) return giveup();
     // TODO(lry): support constructors / factory calls.
-    if (element.isConstructor) return giveup();
+    if (element.isConstructor) return giveup(node, 'StaticSend: constructor');
     // TODO(lry): support foreign functions.
-    if (element.isForeign(compiler)) return giveup();
+    if (element.isForeign(compiler)) return giveup(node, 'StaticSend: foreign');
     // TODO(lry): for elements that could not be resolved emit code to throw a
     // [NoSuchMethodError].
-    if (element.isErroneous) return giveup();
+    if (element.isErroneous) return giveup(node, 'StaticSend: erroneous');
     // TODO(lry): generate IR for object identicality.
-    if (element == compiler.identicalFunction) giveup();
+    if (element == compiler.identicalFunction) {
+      return giveup(node, 'StaticSend: identical');
+    }
 
     Selector selector = elements.getSelector(node);
 
-    // TODO(kmillikin): support a receiver: A.m().
-    if (node.receiver != null) return giveup();
-
     // TODO(lry): support default arguments, need support for locals.
-    List<ir.Definition> arguments = node.arguments.toList(growable:false)
-                                       .map(visit).toList(growable:false);
+    List<ir.Definition> arguments = node.arguments.mapToList(visit,
+                                                             growable:false);
     ir.Parameter v = new ir.Parameter(null);
     ir.Continuation k = new ir.Continuation([v]);
     ir.Expression invoke =
@@ -1067,72 +1140,152 @@
 
   ir.Primitive visitSuperSend(ast.Send node) {
     assert(isOpen);
-    return giveup();
+    return giveup(node, 'SuperSend');
   }
 
   ir.Primitive visitTypeReferenceSend(ast.Send node) {
     assert(isOpen);
-    return giveup();
+    if (node.argumentsNode != null) {
+      // May happen in strange, invalid code.
+      // TODO(asgerf): Generate code that throws a runtime error.
+      return giveup(node, 'TypeReferenceSend: has argument');
+    }
+    Element element = elements[node];
+    if (element is TypeDeclarationElement) {
+      DartType typeType = compiler.backend.typeImplementation.rawType;
+      ir.Primitive prim =
+          new ir.Constant(new TypeConstant(element.rawType, typeType));
+      add(new ir.LetPrim(prim));
+      return prim;
+    } else if (element.isTypeVariable) {
+      // TODO(asgerf): Introduce IR to reify type variables
+      return giveup(node, 'TypeReferenceSend: type variable');
+    } else {
+      // TODO(asgerf): Any other cases?
+      return giveup(node);
+    }
   }
 
   ir.Primitive visitSendSet(ast.SendSet node) {
     assert(isOpen);
     Element element = elements[node];
-    if (node.assignmentOperator.source != '=') return giveup();
-    if (Elements.isLocal(element)) {
-      // Exactly one argument expected for a simple assignment.
-      assert(!node.arguments.isEmpty);
-      assert(node.arguments.tail.isEmpty);
-      ir.Primitive result = visit(node.arguments.head);
-      assignedVars[variableIndex[element]] = result;
-      return result;
-    } else if (Elements.isStaticOrTopLevel(element)) {
-      // TODO(asgerf): static and top-level
-      return giveup();
-    } else if (node.receiver == null) {
-      // Nodes that fall in this case:
-      // - Unresolved top-level
-      // - Assignment to final variable (will not be resolved)
-      return giveup();
-    } else {
-      // Setter or index-setter invocation
-      assert(node.receiver != null);
-      if (node.receiver.isSuper()) return giveup();
+    ast.Operator op = node.assignmentOperator;
+    ir.Primitive result;
+    ir.Primitive getter;
+    if (op.source == '=') {
+      if (Elements.isLocal(element)) {
+        // Exactly one argument expected for a simple assignment.
+        assert(!node.arguments.isEmpty);
+        assert(node.arguments.tail.isEmpty);
+        result = visit(node.arguments.head);
+        result.useElementAsHint(element);
+        assignedVars[variableIndex[element]] = result;
+        return result;
+      } else if (Elements.isStaticOrTopLevel(element)) {
+        assert(element.isField || element.isSetter);
+        assert(!node.arguments.isEmpty && node.arguments.tail.isEmpty);
+        ir.Parameter v = new ir.Parameter(null);
+        ir.Continuation k = new ir.Continuation([v]);
+        Selector selector = elements.getSelector(node);
+        ir.Definition arg = visit(node.arguments.head);
+        ir.InvokeStatic invoke =
+            new ir.InvokeStatic(element, selector, k, [arg]);
+        add(new ir.LetCont(k, invoke));
+        return arg;
+      } else if (node.receiver == null) {
+        // Nodes that fall in this case:
+        // - Unresolved top-level
+        // - Assignment to final variable (will not be resolved)
+        return giveup(node, 'SendSet: non-local, non-static, but no receiver');
+      } else {
+        if (element != null && Elements.isUnresolved(element)) {
+          return giveup(node);
+        }
 
-      ir.Primitive receiver = visit(node.receiver);
-      ir.Parameter v = new ir.Parameter(null);
-      ir.Continuation k = new ir.Continuation([v]);
-      Selector selector = elements.getSelector(node);
-      assert(selector.kind == SelectorKind.SETTER ||
-             selector.kind == SelectorKind.INDEX);
-      List<ir.Definition> args = node.arguments.toList(growable:false)
-                                     .map(visit).toList(growable:false);
-      ir.InvokeMethod invoke = new ir.InvokeMethod(receiver, selector, k, args);
+        // Setter or index-setter invocation
+        assert(node.receiver != null);
+
+        if (node.receiver.isSuper()) return giveup(node, 'Super SendSet');
+
+        ir.Primitive receiver = node.receiver == null
+            ? lookupThis()
+            : visit(node.receiver);
+        ir.Parameter v = new ir.Parameter(null);
+        ir.Continuation k = new ir.Continuation([v]);
+        Selector selector = elements.getSelector(node);
+        assert(selector.kind == SelectorKind.SETTER ||
+            selector.kind == SelectorKind.INDEX);
+        List<ir.Definition> args = node.arguments.mapToList(visit,
+                                                            growable:false);
+        ir.InvokeMethod invoke =
+            new ir.InvokeMethod(receiver, selector, k, args);
+        add(new ir.LetCont(k, invoke));
+        return args.last;
+      }
+    } else if (ast.Operator.COMPLEX_OPERATORS.contains(op.source)) {
+      Element selectorElement = elements[node.selector];
+      if (selectorElement != null && !selectorElement.isAssignable) {
+        return giveup(node, 'Unresolved or non-assignable compound assignment');
+      }
+      if (!Elements.isLocal(selectorElement)) {
+        return giveup(node, 'Non-local compound assignment');
+      }
+
+      Selector selector = elements.getOperatorSelectorInComplexSendSet(node);
+      getter = lookupLocal(selectorElement);
+
+      ir.Primitive arg;
+      if (ast.Operator.INCREMENT_OPERATORS.contains(op.source)) {
+        assert(node.arguments.isEmpty);
+        arg = new ir.Constant(constantSystem.createInt(1));
+        add(new ir.LetPrim(arg));
+      } else {
+        assert(!node.arguments.isEmpty);
+        assert(node.arguments.tail.isEmpty);
+        arg = visit(node.arguments.head);
+      }
+      arg.useElementAsHint(element);
+      result = new ir.Parameter(null);
+      ir.Continuation k = new ir.Continuation([result]);
+      ir.Expression invoke = new ir.InvokeMethod(getter, selector, k, [arg]);
       add(new ir.LetCont(k, invoke));
-      return args.last;
+
+      assignedVars[variableIndex[element]] = result;
+
+      if (ast.Operator.INCREMENT_OPERATORS.contains(op.source) &&
+          !node.isPrefix) {
+        assert(getter != null);
+        return getter;
+      } else {
+        return result;
+      }
+    } else {
+      compiler.internalError(node, "Unknown assignment operator ${op.source}");
+      return null;
     }
   }
 
   ir.Primitive visitNewExpression(ast.NewExpression node) {
-    if (node.isConst) {
-      return giveup(); // TODO(asgerf): Const constructor call.
-    }
+    assert(isOpen);
     FunctionElement element = elements[node.send];
     if (Elements.isUnresolved(element)) {
-      return giveup();
+      return giveup(node, 'NewExpression: unresolved constructor');
     }
-    ast.Node selector = node.send.selector;
+    Selector selector = elements.getSelector(node.send);
+    ast.Node selectorNode = node.send.selector;
     GenericType type = elements.getType(node);
+    List<ir.Primitive> args =
+        node.send.arguments.mapToList(visit, growable:false);
+    if (node.isConst) {
+      ir.Primitive result = new ir.InvokeConstConstructor(type, element,
+          selector, args, getConstantForNode(node));
+      add(new ir.LetPrim(result));
+      return result;
+    }
     ir.Parameter v = new ir.Parameter(null);
     ir.Continuation k = new ir.Continuation([v]);
-    List<ir.Definition> args = node.send.arguments.toList(growable:false)
-                                        .map(visit).toList(growable:false);
-    ir.InvokeConstructor invoke = new ir.InvokeConstructor(
-        type,
-        element,
-        elements.getSelector(node.send),
-        k,
-        args);
+    ir.InvokeConstructor invoke =
+        new ir.InvokeConstructor(type, element,selector, k, args);
     add(new ir.LetCont(k, invoke));
     return v;
   }
@@ -1166,7 +1319,9 @@
 
   static final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
 
-  ir.Primitive giveup() => throw ABORT_IRNODE_BUILDER;
+  ir.Primitive giveup(ast.Node node, [String reason]) {
+    throw ABORT_IRNODE_BUILDER;
+  }
 
   ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) {
     try {
@@ -1178,45 +1333,7 @@
   }
 
   void internalError(String reason, {ast.Node node}) {
-    giveup();
+    giveup(node);
   }
 }
 
-// While we don't support all constants we need to filter out the unsupported
-// ones:
-class SupportedConstantVisitor extends ConstantVisitor<bool> {
-  const SupportedConstantVisitor();
-
-  bool visit(Constant constant) => constant.accept(this);
-  bool visitFunction(FunctionConstant constant) => false;
-  bool visitNull(NullConstant constant) => true;
-  bool visitInt(IntConstant constant) => true;
-  bool visitDouble(DoubleConstant constant) => true;
-  bool visitTrue(TrueConstant constant) => true;
-  bool visitFalse(FalseConstant constant) => true;
-  bool visitString(StringConstant constant) => true;
-  bool visitList(ListConstant constant) {
-    return constant.entries.every(visit);
-  }
-  bool visitMap(MapConstant constant) {
-    return visit(constant.keys) && constant.values.every(visit);
-  }
-  bool visitConstructed(ConstructedConstant constant) => false;
-  bool visitType(TypeConstant constant) => false;
-  bool visitInterceptor(InterceptorConstant constant) => false;
-  bool visitDummy(DummyConstant constant) => false;
-  bool visitDeferred(DeferredConstant constant) => false;
-}
-
-// Verify that types are ones that can be reconstructed by the type emitter.
-class SupportedTypeVerifier extends DartTypeVisitor<bool, Null> {
-  bool visit(DartType type, Null _) => type.accept(this, null);
-
-  bool visitType(DartType type, Null _) => false;
-
-  bool visitVoidType(VoidType type, Null _) => true;
-
-  // Currently, InterfaceType and TypedefType are supported so long as they
-  // do not have type parameters.  They are subclasses of GenericType.
-  bool visitGenericType(GenericType type, Null _) => !type.isGeneric;
-}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index 6db0e8f..3ab898c 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -6,11 +6,13 @@
 // dependencies on other parts of the system.
 library dart2js.ir_nodes;
 
-import '../dart2jslib.dart' as dart2js show Constant;
+import '../dart2jslib.dart' as dart2js show Constant, ConstructedConstant;
 import '../elements/elements.dart'
-    show FunctionElement, LibraryElement, ParameterElement, ClassElement;
+    show FunctionElement, LibraryElement, ParameterElement, ClassElement,
+    Element, VariableElement;
 import '../universe/universe.dart' show Selector, SelectorKind;
 import '../dart_types.dart' show DartType, GenericType;
+import '../helpers/helpers.dart';
 
 abstract class Node {
   static int hashCount = 0;
@@ -47,7 +49,29 @@
   }
 }
 
+/// A pure expression that cannot throw or diverge.
+/// All primitives are named using the identity of the [Primitive] object.
 abstract class Primitive extends Definition {
+  /// The [VariableElement] or [ParameterElement] from which the primitive
+  /// binding originated.
+  Element element;
+
+  /// Register in which the variable binding this primitive can be allocated.
+  /// Separate register spaces are used for primitives with different [element].
+  /// Assigned by [RegisterAllocator], is null before that phase.
+  int registerIndex;
+
+  /// If non-null, this primitive is a reference to the given constant.
+  dart2js.Constant get constant;
+
+  /// Use the given element as a hint for naming this primitive.
+  ///
+  /// Has no effect if this primitive already has a non-null [element].
+  void useElementAsHint(Element hint) {
+    if (element == null) {
+      element = hint;
+    }
+  }
 }
 
 /// Operands to invocations and primitives are always variables.  They point to
@@ -105,9 +129,10 @@
   List<Reference> get arguments;
 }
 
-/// Invoke a static function in tail position.
+/// Invoke a static function or static field getter/setter.
 class InvokeStatic extends Expression implements Invoke {
-  final FunctionElement target;
+  /// [FunctionElement] or [FieldElement].
+  final Element target;
 
   /**
    * The selector encodes how the function is invoked: number of positional
@@ -123,7 +148,6 @@
                List<Definition> args)
       : continuation = new Reference(cont),
         arguments = _referenceList(args) {
-    assert(selector.kind == SelectorKind.CALL);
     assert(selector.name == target.name);
   }
 
@@ -187,6 +211,47 @@
   accept(Visitor visitor) => visitor.visitInvokeConstructor(this);
 }
 
+class AsCast extends Expression {
+  final Reference receiver;
+  final DartType type;
+  final Reference continuation;
+
+  AsCast(Primitive receiver, this.type, Continuation cont)
+      : this.receiver = new Reference(receiver),
+        this.continuation = new Reference(cont);
+
+  accept(Visitor visitor) => visitor.visitAsCast(this);
+}
+
+class InvokeConstConstructor extends Primitive {
+  final GenericType type;
+  final FunctionElement constructor;
+  final List<Reference> arguments;
+  final Selector selector;
+
+  final dart2js.ConstructedConstant constant;
+
+  /// The class being instantiated. This is the same as `target.enclosingClass`
+  /// and `type.element`.
+  ClassElement get targetClass => constructor.enclosingElement;
+
+  /// True if this is an invocation of a factory constructor.
+  bool get isFactory => constructor.isFactoryConstructor;
+
+  InvokeConstConstructor(this.type,
+                    this.constructor,
+                    this.selector,
+                    List<Definition> args,
+                    this.constant)
+      : arguments = _referenceList(args) {
+    assert(constructor.isConstructor);
+    assert(type.element == constructor.enclosingElement);
+    assert(constant.type == type);
+  }
+
+  accept(Visitor visitor) => visitor.visitInvokeConstConstructor(this);
+}
+
 /// Invoke [toString] on each argument and concatenate the results.
 class ConcatenateStrings extends Expression {
   final Reference continuation;
@@ -249,33 +314,67 @@
 
   Constant(this.value);
 
+  dart2js.Constant get constant => value;
+
   accept(Visitor visitor) => visitor.visitConstant(this);
 }
 
-class LiteralList extends Primitive {
-  List<Reference> values;
+class This extends Primitive {
+  This();
 
-  LiteralList(List<Primitive> values)
+  dart2js.Constant get constant => null;
+
+  accept(Visitor visitor) => visitor.visitThis(this);
+}
+
+class LiteralList extends Primitive {
+  /// The List type being created; this is not the type argument.
+  final GenericType type;
+  final List<Reference> values;
+
+  /// Set to null if this is not a const literal list.
+  final dart2js.Constant constant;
+
+  LiteralList(this.type, List<Primitive> values, [this.constant])
       : this.values = _referenceList(values);
 
   accept(Visitor visitor) => visitor.visitLiteralList(this);
 }
 
 class LiteralMap extends Primitive {
-  List<Reference> keys;
-  List<Reference> values;
+  final GenericType type;
+  final List<Reference> keys;
+  final List<Reference> values;
 
-  LiteralMap(List<Primitive> keys, List<Primitive> values)
+  /// Set to null if this is not a const literal map.
+  final dart2js.Constant constant;
+
+  LiteralMap(this.type, List<Primitive> keys, List<Primitive> values,
+             [this.constant])
       : this.keys = _referenceList(keys),
         this.values = _referenceList(values);
 
   accept(Visitor visitor) => visitor.visitLiteralMap(this);
 }
 
-class Parameter extends Primitive {
-  final ParameterElement element;
+class IsCheck extends Primitive {
+  final Reference receiver;
+  final DartType type;
 
-  Parameter(this.element);
+  dart2js.Constant get constant => null;
+
+  IsCheck(Primitive receiver, this.type)
+      : this.receiver = new Reference(receiver);
+
+  accept(Visitor visitor) => visitor.visitIsCheck(this);
+}
+
+class Parameter extends Primitive {
+  Parameter(Element element) {
+    super.element = element;
+  }
+
+  dart2js.Constant get constant => null;
 
   accept(Visitor visitor) => visitor.visitParameter(this);
 }
@@ -334,11 +433,15 @@
   T visitInvokeConstructor(InvokeConstructor node) => visitExpression(node);
   T visitConcatenateStrings(ConcatenateStrings node) => visitExpression(node);
   T visitBranch(Branch node) => visitExpression(node);
+  T visitAsCast(AsCast node) => visitExpression(node);
 
   // Definitions.
   T visitLiteralList(LiteralList node) => visitPrimitive(node);
   T visitLiteralMap(LiteralMap node) => visitPrimitive(node);
+  T visitIsCheck(IsCheck node) => visitPrimitive(node);
   T visitConstant(Constant node) => visitPrimitive(node);
+  T visitThis(This node) => visitPrimitive(node);
+  T visitInvokeConstConstructor(InvokeConstConstructor node) => visitPrimitive(node);
   T visitParameter(Parameter node) => visitPrimitive(node);
   T visitContinuation(Continuation node) => visitDefinition(node);
 
@@ -475,3 +578,149 @@
     return '(IsTrue $value)';
   }
 }
+
+/// Keeps track of currently unused register indices.
+class RegisterArray {
+  int nextIndex = 0;
+  final List<int> freeStack = <int>[];
+
+  int makeIndex() {
+    if (freeStack.isEmpty) {
+      return nextIndex++;
+    } else {
+      return freeStack.removeLast();
+    }
+  }
+
+  void releaseIndex(int index) {
+    freeStack.add(index);
+  }
+}
+
+/// Assigns indices to each primitive in the IR such that primitives that are
+/// live simultaneously never get assigned the same index.
+/// This information is used by the dart tree builder to generate fewer
+/// redundant variables.
+/// Currently, the liveness analysis is very simple and is often inadequate
+/// for removing all of the redundant variables.
+class RegisterAllocator extends Visitor {
+  /// Separate register spaces for each source-level variable/parameter.
+  /// Note that null is used as key for primitives without elements.
+  final Map<Element, RegisterArray> elementRegisters =
+      <Element, RegisterArray>{};
+
+  RegisterArray getRegisterArray(Element element) {
+    RegisterArray registers = elementRegisters[element];
+    if (registers == null) {
+      registers = new RegisterArray();
+      elementRegisters[element] = registers;
+    }
+    return registers;
+  }
+
+  void allocate(Primitive primitive) {
+    if (primitive.registerIndex == null) {
+      primitive.registerIndex = getRegisterArray(primitive.element).makeIndex();
+    }
+  }
+
+  void release(Primitive primitive) {
+    // Do not share indices for temporaries as this may obstruct inlining.
+    if (primitive.element == null) return;
+    if (primitive.registerIndex != null) {
+      getRegisterArray(primitive.element).releaseIndex(primitive.registerIndex);
+    }
+  }
+
+  void visitReference(Reference reference) {
+    allocate(reference.definition);
+  }
+
+  void visitFunctionDefinition(FunctionDefinition node) {
+    visit(node.body);
+    node.parameters.forEach(allocate); // Assign indices to unused parameters.
+    elementRegisters.clear();
+  }
+
+  void visitLetPrim(LetPrim node) {
+    visit(node.body);
+    release(node.primitive);
+    visit(node.primitive);
+  }
+
+  void visitLetCont(LetCont node) {
+    visit(node.continuation);
+    visit(node.body);
+  }
+
+  void visitInvokeStatic(InvokeStatic node) {
+    node.arguments.forEach(visitReference);
+  }
+
+  void visitAsCast(AsCast node) {
+    visitReference(node.receiver);
+  }
+
+  void visitInvokeContinuation(InvokeContinuation node) {
+    node.arguments.forEach(visitReference);
+  }
+
+  void visitInvokeMethod(InvokeMethod node) {
+    visitReference(node.receiver);
+    node.arguments.forEach(visitReference);
+  }
+
+  void visitInvokeConstructor(InvokeConstructor node) {
+    node.arguments.forEach(visitReference);
+  }
+
+  void visitConcatenateStrings(ConcatenateStrings node) {
+    node.arguments.forEach(visitReference);
+  }
+
+  void visitBranch(Branch node) {
+    visit(node.condition);
+  }
+
+  void visitInvokeConstConstructor(InvokeConstConstructor node) {
+    node.arguments.forEach(visitReference);
+  }
+
+  void visitLiteralList(LiteralList node) {
+    node.values.forEach(visitReference);
+  }
+
+  void visitLiteralMap(LiteralMap node) {
+    for (int i = 0; i < node.keys.length; ++i) {
+      visitReference(node.keys[i]);
+      visitReference(node.values[i]);
+    }
+  }
+
+  void visitIsCheck(IsCheck node) {
+    visitReference(node.receiver);
+  }
+
+  void visitConstant(Constant node) {
+  }
+
+  void visitParameter(Parameter node) {
+    throw "Parameters should not be visited by RegisterAllocator";
+  }
+
+  void visitContinuation(Continuation node) {
+    visit(node.body);
+
+    // Arguments get allocated left-to-right, so we release parameters
+    // right-to-left. This increases the likelihood that arguments can be
+    // transferred without intermediate assignments.
+    for (int i = node.parameters.length - 1; i >= 0; --i) {
+      release(node.parameters[i]);
+    }
+  }
+
+  void visitIsTrue(IsTrue node) {
+    visitReference(node.value);
+  }
+
+}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
index 38a4ae9..875b2b0 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
@@ -44,6 +44,16 @@
     names = null;
   }
 
+  int countUses(ir.Definition definition) {
+    int count = 0;
+    ir.Reference ref = definition.firstRef;
+    while (ref != null) {
+      ++count;
+      ref = ref.nextRef;
+    }
+    return count;
+  }
+
   printNode(Block block) {
     tag("block", () {
       printProperty("name", block.name);
@@ -57,11 +67,13 @@
         tag("locals", () {
           printProperty("size", 0);
           printProperty("method", "None");
-          // We could print parameters here,
-          // but does the hydra tool actually use this info??
         });
       });
       tag("HIR", () {
+        for (ir.Parameter param in block.parameters) {
+          String name = names.name(param);
+          printStmt(name, "Parameter $name [useCount=${countUses(param)}]");
+        }
         visit(block.body);
       });
     });
@@ -144,6 +156,31 @@
     printStmt(dummy, "LiteralMap (${entries.join(', ')})");
   }
 
+  visitIsCheck(ir.IsCheck node) {
+    String dummy = names.name(node);
+    List<String> entries = new List<String>();
+    String receiver = formatReference(node.receiver);
+    printStmt(dummy, "IsCheck ($receiver ${node.type})");
+  }
+
+  visitAsCast(ir.AsCast node) {
+    String dummy = names.name(node);
+    List<String> entries = new List<String>();
+    String receiver = formatReference(node.receiver);
+    printStmt(dummy, "AsCast ($receiver ${node.type})");
+  }
+
+  visitInvokeConstConstructor(ir.InvokeConstConstructor node) {
+    String dummy = names.name(node);
+    String values = node.arguments.map(formatReference).join(', ');
+    printStmt(dummy, "ConstConstruction ($values)");
+  }
+
+  visitThis(ir.This node) {
+    String dummy = names.name(node);
+    printStmt(dummy, "This");
+  }
+
   visitInvokeContinuation(ir.InvokeContinuation node) {
     String dummy = names.name(node);
     String kont = formatReference(node.continuation);
@@ -183,7 +220,7 @@
   }
 
   visitIsTrue(ir.IsTrue node) {
-    return "IsTrue(${names.name(node)})";
+    return "IsTrue(${names.name(node.value.definition)})";
   }
 
   visitCondition(ir.Condition c) {}
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index db13631..6722f46 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -53,6 +53,11 @@
 }
 
 class JavaScriptBackend extends Backend {
+  static final Uri DART_JS_MIRRORS =
+      new Uri(scheme: 'dart', path: '_js_mirrors');
+  static final Uri DART_JS_NAMES =
+      new Uri(scheme: 'dart', path: '_js_names');
+
   SsaBuilderTask builder;
   SsaOptimizerTask optimizer;
   SsaCodeGeneratorTask generator;
@@ -112,6 +117,12 @@
   Element getInterceptorMethod;
   Element interceptedNames;
 
+  /// If [true], the compiler will emit code that writes the name of the current
+  /// method together with its class and library to the console the first time
+  /// the method is called.
+  static const bool TRACE_CALLS = false;
+  Element traceHelper;
+
   /**
    * This element is a top-level variable (in generated output) that the
    * compiler initializes to a datastructure used to map from a Type to the
@@ -469,113 +480,6 @@
         operatorEqfunction.enclosingClass);
   }
 
-  void initializeHelperClasses() {
-    getInterceptorMethod = compiler.findInterceptor('getInterceptor');
-    interceptedNames = compiler.findInterceptor('interceptedNames');
-    mapTypeToInterceptor = compiler.findInterceptor('mapTypeToInterceptor');
-    getNativeInterceptorMethod =
-        compiler.findInterceptor('getNativeInterceptor');
-
-    // These methods are overwritten with generated versions.
-    inlineCache.markAsNonInlinable(getInterceptorMethod, insideLoop: true);
-
-    List<ClassElement> classes = [
-      jsInterceptorClass =
-          compiler.findInterceptor('Interceptor'),
-      jsStringClass = compiler.findInterceptor('JSString'),
-      jsArrayClass = compiler.findInterceptor('JSArray'),
-      // The int class must be before the double class, because the
-      // emitter relies on this list for the order of type checks.
-      jsIntClass = compiler.findInterceptor('JSInt'),
-      jsPositiveIntClass = compiler.findInterceptor('JSPositiveInt'),
-      jsUInt32Class = compiler.findInterceptor('JSUInt32'),
-      jsUInt31Class = compiler.findInterceptor('JSUInt31'),
-      jsDoubleClass = compiler.findInterceptor('JSDouble'),
-      jsNumberClass = compiler.findInterceptor('JSNumber'),
-      jsNullClass = compiler.findInterceptor('JSNull'),
-      jsBoolClass = compiler.findInterceptor('JSBool'),
-      jsMutableArrayClass = compiler.findInterceptor('JSMutableArray'),
-      jsFixedArrayClass = compiler.findInterceptor('JSFixedArray'),
-      jsExtendableArrayClass = compiler.findInterceptor('JSExtendableArray'),
-      jsPlainJavaScriptObjectClass =
-          compiler.findInterceptor('PlainJavaScriptObject'),
-      jsUnknownJavaScriptObjectClass =
-          compiler.findInterceptor('UnknownJavaScriptObject'),
-    ];
-
-    implementationClasses = <ClassElement, ClassElement>{};
-    implementationClasses[compiler.intClass] = jsIntClass;
-    implementationClasses[compiler.boolClass] = jsBoolClass;
-    implementationClasses[compiler.numClass] = jsNumberClass;
-    implementationClasses[compiler.doubleClass] = jsDoubleClass;
-    implementationClasses[compiler.stringClass] = jsStringClass;
-    implementationClasses[compiler.listClass] = jsArrayClass;
-    implementationClasses[compiler.nullClass] = jsNullClass;
-
-    jsIndexableClass = compiler.findInterceptor('JSIndexable');
-    jsMutableIndexableClass = compiler.findInterceptor('JSMutableIndexable');
-
-    // TODO(kasperl): Some tests do not define the special JSArray
-    // subclasses, so we check to see if they are defined before
-    // trying to resolve them.
-    if (jsFixedArrayClass != null) {
-      jsFixedArrayClass.ensureResolved(compiler);
-    }
-    if (jsExtendableArrayClass != null) {
-      jsExtendableArrayClass.ensureResolved(compiler);
-    }
-
-    jsIndexableClass.ensureResolved(compiler);
-    jsIndexableLength = compiler.lookupElementIn(
-        jsIndexableClass, 'length');
-    if (jsIndexableLength != null && jsIndexableLength.isAbstractField) {
-      AbstractFieldElement element = jsIndexableLength;
-      jsIndexableLength = element.getter;
-    }
-
-    jsArrayClass.ensureResolved(compiler);
-    jsArrayTypedConstructor = compiler.lookupElementIn(jsArrayClass, 'typed');
-    jsArrayRemoveLast = compiler.lookupElementIn(jsArrayClass, 'removeLast');
-    jsArrayAdd = compiler.lookupElementIn(jsArrayClass, 'add');
-
-    jsStringClass.ensureResolved(compiler);
-    jsStringSplit = compiler.lookupElementIn(jsStringClass, 'split');
-    jsStringOperatorAdd = compiler.lookupElementIn(jsStringClass, '+');
-    jsStringToString = compiler.lookupElementIn(jsStringClass, 'toString');
-
-    typeLiteralClass = compiler.findHelper('TypeImpl');
-    mapLiteralClass = compiler.coreLibrary.find('LinkedHashMap');
-    constMapLiteralClass = compiler.findHelper('ConstantMap');
-
-    objectEquals = compiler.lookupElementIn(compiler.objectClass, '==');
-
-    jsIndexingBehaviorInterface =
-        compiler.findHelper('JavaScriptIndexingBehavior');
-
-    specialOperatorEqClasses
-        ..add(compiler.objectClass)
-        ..add(jsInterceptorClass)
-        ..add(jsNullClass);
-
-    validateInterceptorImplementsAllObjectMethods(jsInterceptorClass);
-    // The null-interceptor must also implement *all* methods.
-    validateInterceptorImplementsAllObjectMethods(jsNullClass);
-
-    typeVariableClass = compiler.findHelper('TypeVariable');
-
-    indexablePrimitiveType = new TypeMask.nonNullSubtype(jsIndexableClass);
-    readableArrayType = new TypeMask.nonNullSubclass(jsArrayClass);
-    mutableArrayType = new TypeMask.nonNullSubclass(jsMutableArrayClass);
-    fixedArrayType = new TypeMask.nonNullExact(jsFixedArrayClass);
-    extendableArrayType = new TypeMask.nonNullExact(jsExtendableArrayClass);
-    nonNullType = compiler.typesTask.dynamicType.nonNullable();
-
-    noSideEffectsClass = compiler.findHelper('NoSideEffects');
-    noThrowsClass = compiler.findHelper('NoThrows');
-    noInlineClass = compiler.findHelper('NoInline');
-    irRepresentationClass = compiler.findHelper('IrRepresentation');
-  }
-
   void validateInterceptorImplementsAllObjectMethods(
       ClassElement interceptorClass) {
     if (interceptorClass == null) return;
@@ -674,9 +578,9 @@
       InterceptorConstant interceptor = constant;
       registerInstantiatedConstantType(interceptor.dispatchedType, registry);
     } else if (constant.isType) {
-      TypeConstant typeConstant = constant;
-      registerTypeLiteral(typeConstant.representedType,
-          compiler.enqueuer.codegen, registry);
+      enqueueInResolution(getCreateRuntimeType(), registry);
+      compiler.enqueuer.codegen.registerInstantiatedClass(
+          typeImplementation, registry);
     }
   }
 
@@ -848,6 +752,7 @@
   }
 
   void enqueueHelpers(ResolutionEnqueuer world, Registry registry) {
+    assert(compiler.interceptorsLibrary != null);
     // TODO(ngeoffray): Not enqueuing those two classes currently make
     // the compiler potentially crash. However, any reasonable program
     // will instantiate those two classes.
@@ -861,54 +766,58 @@
           compiler.findHelper('boolConversionCheck');
       if (e != null) enqueue(world, e, registry);
     }
+    if (TRACE_CALLS) {
+      traceHelper = compiler.findHelper('traceHelper');
+      assert(traceHelper != null);
+      enqueueInResolution(traceHelper, registry);
+    }
     registerCheckedModeHelpers(registry);
   }
 
   onResolutionComplete() => rti.computeClassesNeedingRti();
 
-  void registerStringInterpolation(Registry registry) {
-    enqueueInResolution(getStringInterpolationHelper(), registry);
+  void onStringInterpolation(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getStringInterpolationHelper(), registry);
   }
 
-  void registerCatchStatement(Enqueuer enqueuer, Registry registry) {
-    void ensure(ClassElement classElement) {
-      if (classElement != null) {
-        enqueueClass(enqueuer, classElement, registry);
-      }
-    }
-    enqueueInResolution(getExceptionUnwrapper(), registry);
-    ensure(jsPlainJavaScriptObjectClass);
-    ensure(jsUnknownJavaScriptObjectClass);
+  void onCatchStatement(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getExceptionUnwrapper(), registry);
+    registerBackendInstantiation(jsPlainJavaScriptObjectClass, registry);
+    registerBackendInstantiation(jsUnknownJavaScriptObjectClass, registry);
   }
 
-  void registerThrowExpression(Registry registry) {
+  void onThrowExpression(Registry registry) {
+    assert(registry.isForResolution);
     // 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(), registry);
-    enqueueInResolution(getThrowExpressionHelper(), registry);
+    registerBackendStaticInvocation(getWrapExceptionHelper(), registry);
+    registerBackendStaticInvocation(getThrowExpressionHelper(), registry);
   }
 
-  void registerLazyField(Registry registry) {
-    enqueueInResolution(getCyclicThrowHelper(), registry);
+  void onLazyField(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getCyclicThrowHelper(), registry);
   }
 
-  void registerTypeLiteral(DartType type,
-                           Enqueuer enqueuer,
-                           Registry registry) {
-    enqueuer.registerInstantiatedClass(typeImplementation, registry);
-    enqueueInResolution(getCreateRuntimeType(), registry);
+  void onTypeLiteral(DartType type, Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendInstantiation(typeImplementation, registry);
+    registerBackendStaticInvocation(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.
     if (type.isTypedef) {
       typedefTypeLiterals.add(type.element);
     }
-    customElementsAnalysis.registerTypeLiteral(type, enqueuer);
+    customElementsAnalysis.registerTypeLiteral(type, registry);
   }
 
-  void registerStackTraceInCatch(Registry registry) {
-    enqueueInResolution(getTraceFromException(), registry);
+  void onStackTraceInCatch(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getTraceFromException(), registry);
   }
 
   void registerGetRuntimeTypeArgument(Registry registry) {
@@ -950,63 +859,88 @@
     enqueueClass(enqueuer, compiler.listClass, registry);
   }
 
-  void registerTypeVariableExpression(Registry registry) {
-    enqueueInResolution(getSetRuntimeTypeInfo(), registry);
-    enqueueInResolution(getGetRuntimeTypeInfo(), registry);
+  void onTypeVariableExpression(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getSetRuntimeTypeInfo(), registry);
+    registerBackendStaticInvocation(getGetRuntimeTypeInfo(), registry);
     registerGetRuntimeTypeArgument(registry);
-    enqueueClass(compiler.enqueuer.resolution, compiler.listClass, registry);
-    enqueueInResolution(getRuntimeTypeToString(), registry);
-    enqueueInResolution(getCreateRuntimeType(), registry);
+    registerBackendInstantiation(compiler.listClass, registry);
+    registerBackendStaticInvocation(getRuntimeTypeToString(), registry);
+    registerBackendStaticInvocation(getCreateRuntimeType(), registry);
   }
 
-  void registerIsCheck(DartType type, Enqueuer world, Registry registry) {
-    enqueueInResolution(getThrowRuntimeError(), registry);
+  // TODO(johnniwinther): Maybe split this into [onAssertType] and [onTestType].
+  void onIsCheck(DartType type, Registry registry) {
+    assert(registry.isForResolution);
+    type = type.unalias(compiler);
+    registerBackendInstantiation(compiler.boolClass, registry);
+    bool inCheckedMode = compiler.enableTypeAssertions;
+    if (inCheckedMode) {
+      registerBackendStaticInvocation(getThrowRuntimeError(), registry);
+    }
+    if (type.isMalformed) {
+      registerBackendStaticInvocation(getThrowTypeError(), registry);
+    }
+    if (!type.treatAsRaw || type.containsTypeVariables) {
+      // TODO(johnniwinther): Investigate why this is needed.
+      registerBackendStaticInvocation(getSetRuntimeTypeInfo(), registry);
+      registerBackendStaticInvocation(getGetRuntimeTypeInfo(), registry);
+      registerGetRuntimeTypeArgument(registry);
+      if (inCheckedMode) {
+        registerBackendStaticInvocation(getAssertSubtype(), registry);
+      }
+      registerBackendStaticInvocation(getCheckSubtype(), registry);
+      if (type.isTypeVariable) {
+        registerBackendStaticInvocation(
+            getCheckSubtypeOfRuntimeType(), registry);
+        if (inCheckedMode) {
+          registerBackendStaticInvocation(
+              getAssertSubtypeOfRuntimeType(), registry);
+        }
+      }
+      registerBackendInstantiation(compiler.listClass, registry);
+    }
+    if (type is FunctionType) {
+      registerBackendStaticInvocation(
+          compiler.findHelper('functionTypeTestMetaHelper'), registry);
+    }
+    if (type.element != null && type.element.isNative) {
+      // We will neeed to add the "$is" and "$as" properties on the
+      // JavaScript object prototype, so we make sure
+      // [:defineProperty:] is compiled.
+      registerBackendStaticInvocation(
+              compiler.findHelper('defineProperty'),
+              registry);
+    }
+  }
+
+  void registerIsCheckForCodegen(DartType type,
+                                 Enqueuer world,
+                                 Registry registry) {
+    assert(!registry.isForResolution);
     type = type.unalias(compiler);
     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.
     if (inCheckedMode) {
-      if (!world.isResolutionQueue) {
-        // All helpers are added to resolution queue in enqueueHelpers. These
-        // calls to enqueueInResolution serve as assertions that the helper was
-        // in fact added.
-        // TODO(13155): Find a way to enqueue helpers lazily.
-        CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: false);
-        if (helper != null) {
-          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), registry);
-        }
+      // All helpers are added to resolution queue in enqueueHelpers. These
+      // calls to enqueueInResolution serve as assertions that the helper was
+      // in fact added.
+      // TODO(13155): Find a way to enqueue helpers lazily.
+      CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: false);
+      if (helper != null) {
+        enqueue(world, helper.getElement(compiler), registry);
       }
-    }
-    bool isTypeVariable = type.isTypeVariable;
-    if (type.isMalformed) {
-      enqueueInResolution(getThrowTypeError(), 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), registry);
+      }
     }
     if (!type.treatAsRaw || type.containsTypeVariables) {
-      enqueueInResolution(getSetRuntimeTypeInfo(), registry);
-      enqueueInResolution(getGetRuntimeTypeInfo(), registry);
-      registerGetRuntimeTypeArgument(registry);
-      if (inCheckedMode) {
-        enqueueInResolution(getAssertSubtype(), registry);
-      }
-      enqueueInResolution(getCheckSubtype(), registry);
-      if (isTypeVariable) {
-        enqueueInResolution(getCheckSubtypeOfRuntimeType(), registry);
-        if (inCheckedMode) {
-          enqueueInResolution(getAssertSubtypeOfRuntimeType(), registry);
-        }
-      }
       enqueueClass(world, compiler.listClass, registry);
     }
-    if (type is FunctionType) {
-      enqueueInResolution(
-          compiler.findHelper('functionTypeTestMetaHelper'), registry);
-    }
     if (type.element != null && type.element.isNative) {
       // We will neeed to add the "$is" and "$as" properties on the
       // JavaScript object prototype, so we make sure
@@ -1017,35 +951,24 @@
     }
   }
 
-  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
-      // calls to enqueueInResolution serve as assertions that the helper was in
-      // fact added.
-      // TODO(13155): Find a way to enqueue helpers lazily.
-      CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: true);
-      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), registry);
-      }
-    }
+  void onAsCheck(DartType type, Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getThrowRuntimeError(), registry);
   }
 
-  void registerThrowNoSuchMethod(Registry registry) {
-    enqueueInResolution(getThrowNoSuchMethod(), registry);
+  void onThrowNoSuchMethod(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getThrowNoSuchMethod(), registry);
     // Also register the types of the arguments passed to this method.
-    enqueueClass(compiler.enqueuer.resolution, compiler.listClass, registry);
-    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, registry);
+    registerBackendInstantiation(compiler.listClass, registry);
+    registerBackendInstantiation(compiler.stringClass, registry);
   }
 
-  void registerThrowRuntimeError(Registry registry) {
-    enqueueInResolution(getThrowRuntimeError(), registry);
+  void onThrowRuntimeError(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getThrowRuntimeError(), registry);
     // Also register the types of the arguments passed to this method.
-    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, registry);
+    registerBackendInstantiation(compiler.stringClass, registry);
   }
 
   void registerTypeVariableBoundsSubtypeCheck(DartType typeArgument,
@@ -1053,19 +976,23 @@
     rti.registerTypeVariableBoundsSubtypeCheck(typeArgument, bound);
   }
 
-  void registerTypeVariableBoundCheck(Registry registry) {
-    enqueueInResolution(getThrowTypeError(), registry);
-    enqueueInResolution(getAssertIsSubtype(), registry);
+  void onTypeVariableBoundCheck(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getThrowTypeError(), registry);
+    registerBackendStaticInvocation(getAssertIsSubtype(), registry);
   }
 
-  void registerAbstractClassInstantiation(Registry registry) {
-    enqueueInResolution(getThrowAbstractClassInstantiationError(), registry);
+  void onAbstractClassInstantiation(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getThrowAbstractClassInstantiationError(),
+                                    registry);
     // Also register the types of the arguments passed to this method.
-    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, registry);
+    registerBackendInstantiation(compiler.stringClass, registry);
   }
 
-  void registerFallThroughError(Registry registry) {
-    enqueueInResolution(getFallThroughError(), registry);
+  void onFallThroughError(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getFallThroughError(), registry);
   }
 
   void registerCheckDeferredIsLoaded(Registry registry) {
@@ -1079,12 +1006,13 @@
     world.registerInvocation(compiler.noSuchMethodSelector);
   }
 
-  void registerSuperNoSuchMethod(Registry registry) {
-    enqueueInResolution(getCreateInvocationMirror(), registry);
-    enqueueInResolution(
+  void onSuperNoSuchMethod(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getCreateInvocationMirror(), registry);
+    registerBackendStaticInvocation(
         compiler.objectClass.lookupLocalMember(Compiler.NO_SUCH_METHOD),
         registry);
-    enqueueClass(compiler.enqueuer.resolution, compiler.listClass, registry);
+    registerBackendInstantiation(compiler.listClass, registry);
   }
 
   void registerRequiredType(DartType type, Element enclosingElement) {
@@ -1130,49 +1058,74 @@
            compiler.enabledRuntimeType;
   }
 
-  // Enqueue [e] in [enqueuer].
-  //
-  // The backend must *always* call this method when enqueuing an
-  // element. Calls done by the backend are not seen by global
-  // optimizations, so they would make these optimizations unsound.
-  // Therefore we need to collect the list of helpers the backend may
-  // use.
+  /// The backend must *always* call this method when enqueuing an
+  /// element. Calls done by the backend are not seen by global
+  /// optimizations, so they would make these optimizations unsound.
+  /// Therefore we need to collect the list of helpers the backend may
+  /// use.
+  Element registerBackendUse(Element element) {
+    if (element != null) {
+      helpersUsed.add(element.declaration);
+      if (element.isClass && element.isPatched) {
+        // Both declaration and implementation may declare fields, so we
+        // add both to the list of helpers.
+        helpersUsed.add(element.implementation);
+      }
+    }
+    return element;
+  }
+
+  void registerBackendStaticInvocation(Element element, Registry registry) {
+    registry.registerStaticInvocation(registerBackendUse(element));
+  }
+
+  void registerBackendInstantiation(ClassElement element, Registry registry) {
+    registry.registerInstantiation(registerBackendUse(element));
+  }
+
+  /// Enqueue [e] in [enqueuer].
+  ///
+  /// This method calls [registerBackendUse].
   void enqueue(Enqueuer enqueuer, Element e, Registry registry) {
     if (e == null) return;
-    helpersUsed.add(e.declaration);
+    registerBackendUse(e);
     enqueuer.addToWorkList(e);
     registry.registerDependency(e);
   }
 
+  /// Enqueue [e] in the resolution enqueuer.
+  ///
+  /// This method calls [registerBackendUse].
   void enqueueInResolution(Element e, Registry registry) {
     if (e == null) return;
     ResolutionEnqueuer enqueuer = compiler.enqueuer.resolution;
     enqueue(enqueuer, e, registry);
   }
 
+  /// Register instantiation of [cls] in [enqueuer].
+  ///
+  /// This method calls [registerBackendUse].
   void enqueueClass(Enqueuer enqueuer, Element cls, Registry registry) {
     if (cls == null) return;
+    registerBackendUse(cls);
     helpersUsed.add(cls.declaration);
-    // Both declaration and implementation may declare fields, so we
-    // add both to the list of helpers.
     if (cls.declaration != cls.implementation) {
       helpersUsed.add(cls.implementation);
     }
     enqueuer.registerInstantiatedClass(cls, registry);
   }
 
-  void registerConstantMap(Registry registry) {
+  void onConstantMap(Registry registry) {
+    assert(registry.isForResolution);
     void enqueue(String name) {
       Element e = compiler.findHelper(name);
-      if (e != null) {
-        enqueueClass(compiler.enqueuer.resolution, e, registry);
-      }
+      registerBackendInstantiation(e, registry);
     }
 
-    enqueue(MapConstant.DART_CLASS);
-    enqueue(MapConstant.DART_PROTO_CLASS);
-    enqueue(MapConstant.DART_STRING_CLASS);
-    enqueue(MapConstant.DART_GENERAL_CLASS);
+    enqueue(JavaScriptMapConstant.DART_CLASS);
+    enqueue(JavaScriptMapConstant.DART_PROTO_CLASS);
+    enqueue(JavaScriptMapConstant.DART_STRING_CLASS);
+    enqueue(JavaScriptMapConstant.DART_GENERAL_CLASS);
   }
 
   void codegen(CodegenWorkItem work) {
@@ -1612,10 +1565,12 @@
   }
 
   /// Called when resolving the `Symbol` constructor.
-  void registerSymbolConstructor(Registry registry) {
+  void onSymbolConstructor(Registry registry) {
+    assert(registry.isForResolution);
     // Make sure that _internals.Symbol.validated is registered.
     assert(compiler.symbolValidatedConstructor != null);
-    enqueueInResolution(compiler.symbolValidatedConstructor, registry);
+    registerBackendStaticInvocation(compiler.symbolValidatedConstructor,
+                                    registry);
   }
 
   /// Should [element] (a getter) be retained for reflection?
@@ -1646,19 +1601,143 @@
     return false;
   }
 
-  Future onLibraryLoaded(LibraryElement library, Uri uri) {
-    if (uri == Uri.parse('dart:_js_mirrors')) {
-      disableTreeShakingMarker =
-          library.find('disableTreeShaking');
-      preserveMetadataMarker =
-          library.find('preserveMetadata');
-    } else if (uri == Uri.parse('dart:_js_names')) {
-      preserveNamesMarker =
-          library.find('preserveNames');
-    } else if (uri == Uri.parse('dart:_js_helper')) {
-      getIsolateAffinityTagMarker =
-          library.find('getIsolateAffinityTag');
+  Future onLibraryScanned(LibraryElement library, LibraryLoader loader) {
+    return super.onLibraryScanned(library, loader).then((_) {
+      Uri uri = library.canonicalUri;
+
+      // TODO(johnniwinther): Assert that the elements are found.
+      VariableElement findVariable(String name) {
+        return library.find(name);
+      }
+
+      FunctionElement findMethod(String name) {
+        return library.find(name);
+      }
+
+      ClassElement findClass(String name) {
+        return library.find(name);
+      }
+
+      if (uri == Compiler.DART_INTERCEPTORS) {
+        getInterceptorMethod = findMethod('getInterceptor');
+        interceptedNames = findVariable('interceptedNames');
+        mapTypeToInterceptor = findVariable('mapTypeToInterceptor');
+        getNativeInterceptorMethod = findMethod('getNativeInterceptor');
+
+        List<ClassElement> classes = [
+          jsInterceptorClass = findClass('Interceptor'),
+          jsStringClass = findClass('JSString'),
+          jsArrayClass = findClass('JSArray'),
+          // The int class must be before the double class, because the
+          // emitter relies on this list for the order of type checks.
+          jsIntClass = findClass('JSInt'),
+          jsPositiveIntClass = findClass('JSPositiveInt'),
+          jsUInt32Class = findClass('JSUInt32'),
+          jsUInt31Class = findClass('JSUInt31'),
+          jsDoubleClass = findClass('JSDouble'),
+          jsNumberClass = findClass('JSNumber'),
+          jsNullClass = findClass('JSNull'),
+          jsBoolClass = findClass('JSBool'),
+          jsMutableArrayClass = findClass('JSMutableArray'),
+          jsFixedArrayClass = findClass('JSFixedArray'),
+          jsExtendableArrayClass = findClass('JSExtendableArray'),
+          jsPlainJavaScriptObjectClass = findClass('PlainJavaScriptObject'),
+          jsUnknownJavaScriptObjectClass = findClass('UnknownJavaScriptObject'),
+        ];
+
+        jsIndexableClass = findClass('JSIndexable');
+        jsMutableIndexableClass = findClass('JSMutableIndexable');
+      } else if (uri == Compiler.DART_JS_HELPER) {
+        typeLiteralClass = findClass('TypeImpl');
+        constMapLiteralClass = findClass('ConstantMap');
+        typeVariableClass = findClass('TypeVariable');
+
+        jsIndexingBehaviorInterface = findClass('JavaScriptIndexingBehavior');
+
+        noSideEffectsClass = findClass('NoSideEffects');
+        noThrowsClass = findClass('NoThrows');
+        noInlineClass = findClass('NoInline');
+        irRepresentationClass = findClass('IrRepresentation');
+      } else if (uri == DART_JS_MIRRORS) {
+        disableTreeShakingMarker = library.find('disableTreeShaking');
+        preserveMetadataMarker = library.find('preserveMetadata');
+      } else if (uri == DART_JS_NAMES) {
+        preserveNamesMarker = library.find('preserveNames');
+      } else if (uri == Compiler.DART_JS_HELPER) {
+        getIsolateAffinityTagMarker = library.find('getIsolateAffinityTag');
+      }
+    });
+  }
+
+  Future onLibrariesLoaded(Map<Uri, LibraryElement> loadedLibraries) {
+    if (!loadedLibraries.containsKey(Compiler.DART_CORE)) {
+      return new Future.value();
     }
+    assert(loadedLibraries.containsKey(Compiler.DART_CORE));
+    assert(loadedLibraries.containsKey(Compiler.DART_INTERCEPTORS));
+    assert(loadedLibraries.containsKey(Compiler.DART_JS_HELPER));
+
+    // [LinkedHashMap] is reexported from dart:collection and can therefore not
+    // be loaded from dart:core in [onLibraryScanned].
+    mapLiteralClass = compiler.coreLibrary.find('LinkedHashMap');
+
+    implementationClasses = <ClassElement, ClassElement>{};
+    implementationClasses[compiler.intClass] = jsIntClass;
+    implementationClasses[compiler.boolClass] = jsBoolClass;
+    implementationClasses[compiler.numClass] = jsNumberClass;
+    implementationClasses[compiler.doubleClass] = jsDoubleClass;
+    implementationClasses[compiler.stringClass] = jsStringClass;
+    implementationClasses[compiler.listClass] = jsArrayClass;
+    implementationClasses[compiler.nullClass] = jsNullClass;
+
+    // These methods are overwritten with generated versions.
+    inlineCache.markAsNonInlinable(getInterceptorMethod, insideLoop: true);
+
+    // TODO(kasperl): Some tests do not define the special JSArray
+    // subclasses, so we check to see if they are defined before
+    // trying to resolve them.
+    if (jsFixedArrayClass != null) {
+      jsFixedArrayClass.ensureResolved(compiler);
+    }
+    if (jsExtendableArrayClass != null) {
+      jsExtendableArrayClass.ensureResolved(compiler);
+    }
+
+    jsIndexableClass.ensureResolved(compiler);
+    jsIndexableLength = compiler.lookupElementIn(
+        jsIndexableClass, 'length');
+    if (jsIndexableLength != null && jsIndexableLength.isAbstractField) {
+      AbstractFieldElement element = jsIndexableLength;
+      jsIndexableLength = element.getter;
+    }
+
+    jsArrayClass.ensureResolved(compiler);
+    jsArrayTypedConstructor = compiler.lookupElementIn(jsArrayClass, 'typed');
+    jsArrayRemoveLast = compiler.lookupElementIn(jsArrayClass, 'removeLast');
+    jsArrayAdd = compiler.lookupElementIn(jsArrayClass, 'add');
+
+    jsStringClass.ensureResolved(compiler);
+    jsStringSplit = compiler.lookupElementIn(jsStringClass, 'split');
+    jsStringOperatorAdd = compiler.lookupElementIn(jsStringClass, '+');
+    jsStringToString = compiler.lookupElementIn(jsStringClass, 'toString');
+
+    objectEquals = compiler.lookupElementIn(compiler.objectClass, '==');
+
+    specialOperatorEqClasses
+        ..add(compiler.objectClass)
+        ..add(jsInterceptorClass)
+        ..add(jsNullClass);
+
+    indexablePrimitiveType = new TypeMask.nonNullSubtype(jsIndexableClass);
+    readableArrayType = new TypeMask.nonNullSubclass(jsArrayClass);
+    mutableArrayType = new TypeMask.nonNullSubclass(jsMutableArrayClass);
+    fixedArrayType = new TypeMask.nonNullExact(jsFixedArrayClass);
+    extendableArrayType = new TypeMask.nonNullExact(jsExtendableArrayClass);
+    nonNullType = compiler.typesTask.dynamicType.nonNullable();
+
+    validateInterceptorImplementsAllObjectMethods(jsInterceptorClass);
+    // The null-interceptor must also implement *all* methods.
+    validateInterceptorImplementsAllObjectMethods(jsNullClass);
     return new Future.value();
   }
 
@@ -1708,6 +1787,7 @@
    * need to access it.
    */
   bool isNeededForReflection(Element element) {
+    if (!isTreeShakingDisabled) return false;
     element = getDartClass(element);
     if (hasInsufficientMirrorsUsed) return isTreeShakingDisabled;
     /// Record the name of [element] in [symbolsUsed]. Return true for
@@ -1821,6 +1901,11 @@
 
   /// Called when [enqueuer] is empty, but before it is closed.
   void onQueueEmpty(Enqueuer enqueuer) {
+    // Add elements referenced only via custom elements.  Return early if any
+    // elements are added to avoid counting the elements as due to mirrors.
+    customElementsAnalysis.onQueueEmpty(enqueuer);
+    if (!enqueuer.queueIsEmpty) return;
+
     if (!enqueuer.isResolutionQueue && preMirrorsMethodCount == 0) {
       preMirrorsMethodCount = generatedCode.length;
     }
@@ -1846,8 +1931,6 @@
       }
       metadataConstants.clear();
     }
-
-    customElementsAnalysis.onQueueEmpty(enqueuer);
   }
 
   void onElementResolved(Element element, TreeElements elements) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
index aef2abb..d19369a 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
@@ -237,12 +237,12 @@
     return namer.elementAccess(element);
   }
 
-  jsAst.Expression visitMap(MapConstant constant) {
+  jsAst.Expression visitMap(JavaScriptMapConstant constant) {
     jsAst.Expression jsMap() {
       List<jsAst.Property> properties = <jsAst.Property>[];
-      for (int i = 0; i < constant.keys.entries.length; i++) {
-        StringConstant key = constant.keys.entries[i];
-        if (key.value == MapConstant.PROTO_PROPERTY) continue;
+      for (int i = 0; i < constant.length; i++) {
+        StringConstant key = constant.keys[i];
+        if (key.value == JavaScriptMapConstant.PROTO_PROPERTY) continue;
 
         // Keys in literal maps must be emitted in place.
         jsAst.Literal keyExpression = _visit(key);
@@ -255,9 +255,9 @@
 
     jsAst.Expression jsGeneralMap() {
       List<jsAst.Expression> data = <jsAst.Expression>[];
-      for (int i = 0; i < constant.keys.entries.length; i++) {
+      for (int i = 0; i < constant.keys.length; i++) {
         jsAst.Expression keyExpression =
-            constantEmitter.reference(constant.keys.entries[i]);
+            constantEmitter.reference(constant.keys[i]);
         jsAst.Expression valueExpression =
             constantEmitter.reference(constant.values[i]);
         data.add(keyExpression);
@@ -276,17 +276,17 @@
     int emittedArgumentCount = 0;
     classElement.implementation.forEachInstanceField(
         (ClassElement enclosing, Element field) {
-          if (field.name == MapConstant.LENGTH_NAME) {
+          if (field.name == JavaScriptMapConstant.LENGTH_NAME) {
             arguments.add(
-                new jsAst.LiteralNumber('${constant.keys.entries.length}'));
-          } else if (field.name == MapConstant.JS_OBJECT_NAME) {
+                new jsAst.LiteralNumber('${constant.keyList.entries.length}'));
+          } else if (field.name == JavaScriptMapConstant.JS_OBJECT_NAME) {
             arguments.add(jsMap());
-          } else if (field.name == MapConstant.KEYS_NAME) {
-            arguments.add(constantEmitter.reference(constant.keys));
-          } else if (field.name == MapConstant.PROTO_VALUE) {
+          } else if (field.name == JavaScriptMapConstant.KEYS_NAME) {
+            arguments.add(constantEmitter.reference(constant.keyList));
+          } else if (field.name == JavaScriptMapConstant.PROTO_VALUE) {
             assert(constant.protoValue != null);
             arguments.add(constantEmitter.reference(constant.protoValue));
-          } else if (field.name == MapConstant.JS_DATA_NAME) {
+          } else if (field.name == JavaScriptMapConstant.JS_DATA_NAME) {
             arguments.add(jsGeneralMap());
           } else {
             compiler.internalError(field,
@@ -296,11 +296,11 @@
           emittedArgumentCount++;
         },
         includeSuperAndInjectedMembers: true);
-    if ((className == MapConstant.DART_STRING_CLASS &&
+    if ((className == JavaScriptMapConstant.DART_STRING_CLASS &&
          emittedArgumentCount != 3) ||
-        (className == MapConstant.DART_PROTO_CLASS &&
+        (className == JavaScriptMapConstant.DART_PROTO_CLASS &&
          emittedArgumentCount != 4) ||
-        (className == MapConstant.DART_GENERAL_CLASS &&
+        (className == JavaScriptMapConstant.DART_GENERAL_CLASS &&
          emittedArgumentCount != 1)) {
       compiler.internalError(classElement,
           "Compiler and ${className} disagree on number of fields.");
@@ -369,7 +369,6 @@
       InterfaceType interface = type;
       RuntimeTypes rti = backend.rti;
       Iterable<String> arguments = interface.typeArguments
-          .toList(growable: false)
           .map((DartType type) =>
               rti.getTypeRepresentationWithHashes(type, (_){}));
       jsAst.Expression argumentList =
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
index 382a000..3274359 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
@@ -239,4 +239,102 @@
     }
     return compiler.types.isSubtype(s, t);
   }
+
+  MapConstant createMap(Compiler compiler,
+                        InterfaceType sourceType,
+                        List<Constant> keys,
+                        List<Constant> values) {
+    bool onlyStringKeys = true;
+    Constant protoValue = null;
+    for (int i = 0; i < keys.length ; i++) {
+      var key = keys[i];
+      if (key.isString) {
+        if (key.value == JavaScriptMapConstant.PROTO_PROPERTY) {
+          protoValue = values[i];
+        }
+      } else {
+        onlyStringKeys = false;
+        // Don't handle __proto__ values specially in the general map case.
+        protoValue = null;
+        break;
+      }
+    }
+
+    bool hasProtoKey = (protoValue != null);
+    DartType keysType;
+    if (sourceType.treatAsRaw) {
+      keysType = compiler.listClass.rawType;
+    } else {
+      Link<DartType> arguments =
+          new Link<DartType>.fromList([sourceType.typeArguments.head]);
+      keysType = new InterfaceType(compiler.listClass, arguments);
+    }
+    ListConstant keysList = new ListConstant(keysType, keys);
+    String className = onlyStringKeys
+        ? (hasProtoKey ? JavaScriptMapConstant.DART_PROTO_CLASS
+                       : JavaScriptMapConstant.DART_STRING_CLASS)
+        : JavaScriptMapConstant.DART_GENERAL_CLASS;
+    ClassElement classElement = compiler.jsHelperLibrary.find(className);
+    classElement.ensureResolved(compiler);
+    Link<DartType> typeArgument = sourceType.typeArguments;
+    InterfaceType type;
+    if (sourceType.treatAsRaw) {
+      type = classElement.rawType;
+    } else {
+      type = new InterfaceType(classElement, typeArgument);
+    }
+    return new JavaScriptMapConstant(
+        type, keysList, values, protoValue, onlyStringKeys);
+
+  }
 }
+
+class JavaScriptMapConstant extends MapConstant {
+  /**
+   * The [PROTO_PROPERTY] must not be used as normal property in any JavaScript
+   * object. It would change the prototype chain.
+   */
+  static const LiteralDartString PROTO_PROPERTY =
+      const LiteralDartString("__proto__");
+
+  /** The dart class implementing constant map literals. */
+  static const String DART_CLASS = "ConstantMap";
+  static const String DART_STRING_CLASS = "ConstantStringMap";
+  static const String DART_PROTO_CLASS = "ConstantProtoMap";
+  static const String DART_GENERAL_CLASS = "GeneralConstantMap";
+  static const String LENGTH_NAME = "length";
+  static const String JS_OBJECT_NAME = "_jsObject";
+  static const String KEYS_NAME = "_keys";
+  static const String PROTO_VALUE = "_protoValue";
+  static const String JS_DATA_NAME = "_jsData";
+
+  final ListConstant keyList;
+  final Constant protoValue;
+  final bool onlyStringKeys;
+
+  JavaScriptMapConstant(DartType type,
+                        ListConstant keyList,
+                        List<Constant> values,
+                        this.protoValue,
+                        this.onlyStringKeys)
+      : this.keyList = keyList,
+        super(type, keyList.entries, values);
+  bool get isMap => true;
+
+  TypeMask computeMask(Compiler compiler) {
+    return compiler.typesTask.constMapType;
+  }
+
+  List<Constant> getDependencies() {
+    List<Constant> result = <Constant>[];
+    if (onlyStringKeys) {
+      result.add(keyList);
+    } else {
+      // Add the keys individually to avoid generating an unused list constant
+      // for the keys.
+      result.addAll(keys);
+    }
+    result.addAll(values);
+    return result;
+  }
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
index 60f1608..79b581fe 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
@@ -73,9 +73,10 @@
     joinFor(enqueuer).instantiatedClasses.add(classElement);
   }
 
-  void registerTypeLiteral(DartType type, Enqueuer enqueuer) {
+  void registerTypeLiteral(DartType type, Registry registry) {
+    assert(registry.isForResolution);
     // In codegen we see the TypeConstants instead.
-    if (!enqueuer.isResolutionQueue) return;
+    if (!registry.isForResolution) return;
 
     if (type.isInterfaceType) {
       // TODO(sra): If we had a flow query from the type literal expression to
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
index 255f388..9bd4a5d 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
@@ -16,6 +16,7 @@
 import '../dart_types.dart';
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show js;
+import '../library_loader.dart' show LibraryLoader;
 import '../native_handler.dart' as native;
 import '../ssa/ssa.dart';
 import '../tree/tree.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index 6c1efd0..f63d7f3 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -1127,7 +1127,7 @@
     }
   }
 
-  visitMap(MapConstant constant) {
+  visitMap(JavaScriptMapConstant constant) {
     // TODO(9476): Incorporate type parameters into name.
     addRoot('Map');
     if (constant.length == 0) {
@@ -1135,7 +1135,7 @@
     } else {
       // Using some bits from the keys hash tag groups the names Maps with the
       // same structure.
-      add(getHashTag(constant.keys, 2) + getHashTag(constant, 3));
+      add(getHashTag(constant.keyList, 2) + getHashTag(constant, 3));
     }
   }
 
@@ -1220,7 +1220,7 @@
   }
 
   int visitMap(MapConstant constant) {
-    int hash = _visit(constant.keys);
+    int hash = _hashList(constant.length, constant.keys);
     return _hashList(hash, constant.values);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index 900823d..1e77f3f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -6,7 +6,9 @@
 
 class NativeEmitter {
 
-  CodeEmitterTask emitter;
+  final Map<Element, ClassBuilder> cachedBuilders;
+
+  final CodeEmitterTask emitter;
   CodeBuffer nativeBuffer;
 
   // Native classes found in the application.
@@ -26,11 +28,13 @@
   // it finds any native class that needs noSuchMethod handling.
   bool handleNoSuchMethod = false;
 
-  NativeEmitter(this.emitter)
-      : subtypes = new Map<ClassElement, List<ClassElement>>(),
+  NativeEmitter(CodeEmitterTask emitter)
+      : this.emitter = emitter,
+        subtypes = new Map<ClassElement, List<ClassElement>>(),
         directSubtypes = new Map<ClassElement, List<ClassElement>>(),
         nativeMethods = new Set<FunctionElement>(),
-        nativeBuffer = new CodeBuffer();
+        nativeBuffer = new CodeBuffer(),
+        cachedBuilders = emitter.compiler.cacheStrategy.newMap();
 
   Compiler get compiler => emitter.compiler;
   JavaScriptBackend get backend => compiler.backend;
@@ -279,6 +283,16 @@
   }
 
   ClassBuilder generateNativeClass(ClassElement classElement) {
+    ClassBuilder builder;
+    if (compiler.hasIncrementalSupport) {
+      builder = cachedBuilders[classElement];
+      if (builder != null) return builder;
+      builder = new ClassBuilder(backend.namer);
+      cachedBuilders[classElement] = builder;
+    } else {
+      builder = new ClassBuilder(backend.namer);
+    }
+
     // TODO(sra): Issue #13731- this is commented out as part of custom element
     // constructor work.
     //assert(!classElement.hasBackendMembers);
@@ -294,7 +308,6 @@
 
     String superName = backend.namer.getNameOfClass(superclass);
 
-    ClassBuilder builder = new ClassBuilder(backend.namer);
     emitter.classEmitter.emitClassConstructor(classElement, builder);
     bool hasFields = emitter.classEmitter.emitFields(
         classElement, builder, superName, classIsNative: true);
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
index 135e489..ae5aae6 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -524,9 +524,9 @@
     } else {
       List<String> parameters = const <String>[];
       if (contextClass != null) {
-        parameters = contextClass.typeVariables.toList().map((type) {
+        parameters = contextClass.typeVariables.mapToList((type) {
             return type.toString();
-        }).toList();
+        });
       }
       return js('function(#) { return # }', [parameters, encoding]);
     }
@@ -859,7 +859,7 @@
     jsAst.Expression value =
         rti.getSubstitutionRepresentation(arguments, use);
     if (isFunction) {
-      Iterable<jsAst.Expression> formals = parameters.toList().map(declaration);
+      Iterable<jsAst.Expression> formals = parameters.map(declaration);
       return js('function(#) { return # }', [formals, value]);
     } else if (ensureIsFunction) {
       return js('function() { return # }', value);
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 a6386a3..3e269a2 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
@@ -18,6 +18,11 @@
   final InterceptorEmitter interceptorEmitter = new InterceptorEmitter();
   final MetadataEmitter metadataEmitter = new MetadataEmitter();
 
+  final Set<Constant> cachedEmittedConstants;
+  final CodeBuffer cachedEmittedConstantsBuffer = new CodeBuffer();
+  final Map<Element, ClassBuilder> cachedClassBuilders;
+  final Set<Element> cachedElements;
+
   bool needsDefineClass = false;
   bool needsMixinSupport = false;
   bool needsLazyInitializer = false;
@@ -98,6 +103,9 @@
   CodeEmitterTask(Compiler compiler, Namer namer, this.generateSourceMap)
       : this.namer = namer,
         constantEmitter = new ConstantEmitter(compiler, namer),
+        cachedEmittedConstants = compiler.cacheStrategy.newSet(),
+        cachedClassBuilders = compiler.cacheStrategy.newMap(),
+        cachedElements = compiler.cacheStrategy.newSet(),
         super(compiler) {
     nativeEmitter = new NativeEmitter(this);
     containerBuilder.task = this;
@@ -766,8 +774,23 @@
 
   void generateClass(ClassElement classElement, ClassBuilder properties) {
     compiler.withCurrentElement(classElement, () {
-      classEmitter.generateClass(
-          classElement, properties, additionalProperties[classElement]);
+      if (compiler.hasIncrementalSupport) {
+        ClassBuilder builder =
+            cachedClassBuilders.putIfAbsent(classElement, () {
+              ClassBuilder builder = new ClassBuilder(namer);
+              classEmitter.generateClass(
+                  classElement, builder, additionalProperties[classElement]);
+              return builder;
+            });
+        invariant(classElement, builder.fields.isEmpty);
+        invariant(classElement, builder.superName == null);
+        invariant(classElement, builder.functionType == null);
+        invariant(classElement, builder.fieldMetadata == null);
+        properties.properties.addAll(builder.properties);
+      } else {
+        classEmitter.generateClass(
+            classElement, properties, additionalProperties[classElement]);
+      }
     });
   }
 
@@ -901,7 +924,15 @@
   void emitCompileTimeConstants(CodeBuffer buffer, OutputUnit outputUnit) {
     List<Constant> constants = outputConstantLists[outputUnit];
     if (constants == null) return;
+    bool isMainBuffer = buffer == mainBuffer;
+    if (compiler.hasIncrementalSupport && isMainBuffer) {
+      buffer = cachedEmittedConstantsBuffer;
+    }
     for (Constant constant in constants) {
+      if (compiler.hasIncrementalSupport && isMainBuffer) {
+        if (cachedEmittedConstants.contains(constant)) continue;
+        cachedEmittedConstants.add(constant);
+      }
       String name = namer.constantName(constant);
       if (constant.isList) emitMakeConstantListIfNotEmitted(buffer);
       jsAst.Expression init = js('#.# = #',
@@ -910,6 +941,9 @@
       buffer.write(jsAst.prettyPrint(init, compiler));
       buffer.write('$N');
     }
+    if (compiler.hasIncrementalSupport && isMainBuffer) {
+      mainBuffer.add(cachedEmittedConstantsBuffer);
+    }
   }
 
   bool isConstantInlinedOrAlreadyEmitted(Constant constant) {
@@ -1094,7 +1128,7 @@
   void computeNeededConstants() {
     JavaScriptConstantCompiler handler = backend.constants;
     List<Constant> constants = handler.getConstantsForEmission(
-        compareConstants);
+        compiler.hasIncrementalSupport ? null : compareConstants);
     for (Constant constant in constants) {
       if (isConstantInlinedOrAlreadyEmitted(constant)) continue;
       OutputUnit constantUnit =
@@ -1302,6 +1336,8 @@
 
   String assembleProgram() {
     measure(() {
+      invalidateCaches();
+
       // Compute the required type checks to know which classes need a
       // 'is$' method.
       typeTestEmitter.computeRequiredTypeChecks();
@@ -1445,22 +1481,24 @@
         List<Element> sortedElements =
             Elements.sortedByPosition(elementDescriptors.keys);
 
-        Iterable<Element> pendingStatics = sortedElements.where((element) {
-            return !element.isLibrary &&
-                elementDescriptors[element].values.any((descriptor) =>
-                    descriptor != null);
-        });
+        Iterable<Element> pendingStatics;
+        if (!compiler.hasIncrementalSupport) {
+          pendingStatics = sortedElements.where((element) {
+              return !element.isLibrary &&
+                  elementDescriptors[element].values.any((descriptor) =>
+                      descriptor != null);
+          });
 
-        pendingStatics.forEach((element) =>
-            compiler.reportInfo(
-                element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
-
+          pendingStatics.forEach((element) =>
+              compiler.reportInfo(
+                  element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
+        }
         for (LibraryElement library in sortedElements.where((element) =>
             element.isLibrary)) {
           writeLibraryDescriptors(library);
           elementDescriptors[library] = const {};
         }
-        if (!pendingStatics.isEmpty) {
+        if (pendingStatics != null && !pendingStatics.isEmpty) {
           compiler.internalError(pendingStatics.first,
               'Pending statics (see above).');
         }
@@ -1755,4 +1793,17 @@
   void registerReadTypeVariable(TypeVariableElement element) {
     readTypeVariables.add(element);
   }
+
+  void invalidateCaches() {
+    if (!compiler.hasIncrementalSupport) return;
+    if (cachedElements.isEmpty) return;
+    for (Element element in compiler.enqueuer.codegen.newlyEnqueuedElements) {
+      if (element.isInstanceMember) {
+        cachedClassBuilders.remove(element.enclosingClass);
+
+        nativeEmitter.cachedBuilders.remove(element.enclosingClass);
+
+      }
+    }
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index 6b5b48f..abfe508 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -79,9 +79,6 @@
     // Includes extra receiver argument when using interceptor convention
     int indexOfLastOptionalArgumentInParameters = optionalParameterStart - 1;
 
-    TreeElements elements =
-        compiler.enqueuer.resolution.getCachedElements(member);
-
     int parameterIndex = 0;
     parameters.orderedForEachParameter((Element element) {
       String jsName = backend.namer.safeName(element.name);
@@ -514,9 +511,8 @@
         expressions.add(
             js.number(task.metadataEmitter.reifyName(parameter.name)));
         if (backend.mustRetainMetadata) {
-          List<MetadataAnnotation> annotations = parameter.metadata.toList();
           Iterable<int> metadataIndices =
-              annotations.map((MetadataAnnotation annotation) {
+              parameter.metadata.map((MetadataAnnotation annotation) {
             Constant constant =
                 backend.constants.getConstantForMetadata(annotation);
             backend.constants.addCompileTimeConstantForEmission(constant);
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
index 63215e1..c270d90 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
@@ -281,6 +281,7 @@
     // TODO(sigurdm): We should avoid running through this list for each
     // output unit.
 
+    jsAst.Statement variables = js.statement('var TRUE = !0, _;');
     List<jsAst.Statement> statements = <jsAst.Statement>[];
 
     for (ClassElement cls in typeChecks) {
@@ -289,26 +290,40 @@
       if (destination != outputUnit) continue;
       // TODO(9556).  The properties added to 'holder' should be generated
       // directly as properties of the class object, not added later.
-      jsAst.Expression holder = namer.elementAccess(cls);
+
+      // Each element is a pair: [propertyName, valueExpression]
+      List<List> properties = <List>[];
 
       for (TypeCheck check in typeChecks[cls]) {
-        ClassElement cls = check.cls;
-        buffer.write(
-            jsAst.prettyPrint(
-                js('#.# = true', [holder, namer.operatorIs(cls)]),
-                compiler));
-        buffer.write('$N');
+        ClassElement checkedClass = check.cls;
+        properties.add([namer.operatorIs(checkedClass), js('TRUE')]);
         Substitution substitution = check.substitution;
         if (substitution != null) {
           jsAst.Expression body = substitution.getCode(rti, false);
-          buffer.write(
-              jsAst.prettyPrint(
-                  js('#.# = #',
-                      [holder, namer.substitutionName(cls), body]),
-                  compiler));
-          buffer.write('$N');
+          properties.add([namer.substitutionName(checkedClass), body]);
         }
       }
+
+      jsAst.Expression holder = namer.elementAccess(cls);
+      if (properties.length > 1) {
+        // Use temporary shortened reference.
+        statements.add(js.statement('_ = #;', holder));
+        holder = js('#', '_');
+      }
+      for (List nameAndValue in properties) {
+        statements.add(
+            js.statement('#.# = #',
+                [holder, nameAndValue[0], nameAndValue[1]]));
+      }
+    }
+
+    if (statements.isNotEmpty) {
+      buffer.write(';');
+      buffer.write(
+          jsAst.prettyPrint(
+              js.statement('(function() { #; #; })()', [variables, statements]),
+              compiler));
+      buffer.write('$N');
     }
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
index 7ebe1f31..dfb3258e 100644
--- a/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -2,7 +2,30 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of dart2js;
+library dart2js.library_loader;
+
+import 'dart:async';
+import 'dart2jslib.dart'
+    show Compiler,
+         CompilerTask,
+         MessageKind,
+         Script,
+         invariant;
+import 'elements/elements.dart'
+    show CompilationUnitElement,
+         Element,
+         LibraryElement,
+         PrefixElement;
+import 'elements/modelx.dart'
+    show CompilationUnitElementX,
+         DeferredLoaderGetterElementX,
+         ErroneousElementX,
+         LibraryElementX,
+         PrefixElementX;
+import 'helpers/helpers.dart';
+import 'native_handler.dart' as native;
+import 'tree/tree.dart';
+import 'util/util.dart' show Link, LinkBuilder;
 
 /**
  * [CompilerTask] for loading libraries and setting up the import/export scopes.
@@ -97,8 +120,8 @@
  * point to the 'packages' folder.
  *
  */
-abstract class LibraryLoader extends CompilerTask {
-  LibraryLoader(Compiler compiler) : super(compiler);
+abstract class LibraryLoaderTask implements CompilerTask {
+  factory LibraryLoaderTask(Compiler compiler) = _LibraryLoaderTask;
 
   /**
    * Loads the library specified by the [resolvedUri] and returns its
@@ -108,28 +131,29 @@
    * [LibraryElement] for the library and computes the import/export scope,
    * loading and computing the import/export scopes of all required libraries in
    * the process. The method handles cyclic dependency between libraries.
-   *
-   * This is the main entry point for [LibraryLoader].
    */
-  // TODO(johnniwinther): Remove [canonicalUri] together with
-  // [Compiler.scanBuiltinLibrary].
-  Future<LibraryElement> loadLibrary(Uri resolvedUri, Node node,
-                                     Uri canonicalUri);
+  Future<LibraryElement> loadLibrary(Uri resolvedUri);
 
-  // TODO(johnniwinther): Remove this when patches don't need special parsing.
-  Future registerLibraryFromTag(LibraryDependencyHandler handler,
-                                LibraryElement library,
-                                LibraryDependency tag);
+  /// Reset the library loader task to prepare for compilation. This is used
+  /// for incremental compilation.
+  void reset();
 
-  /**
-   * Adds the elements in the export scope of [importedLibrary] to the import
-   * scope of [importingLibrary].
-   */
-  // TODO(johnniwinther): Move handling of 'js_helper' to the library loader
-  // to remove this method from the [LibraryLoader] interface.
-  void importLibrary(LibraryElement importingLibrary,
-                     LibraryElement importedLibrary,
-                     Import tag);
+  /// Reuse [library] from a previous compilation. This is used for incremental
+  /// compilation.
+  void reuseLibrary(LibraryElement library);
+}
+
+/// Handle for creating synthesized/patch libraries during library loading.
+abstract class LibraryLoader {
+  /// This method must be called when a new synthesized/patch library has been
+  /// created to ensure that [library] will part of library dependency graph
+  /// used for computing import/export scopes.
+  void registerNewLibrary(LibraryElement library);
+
+  /// This method must be called when a new synthesized/patch library has been
+  /// scanned in order to process the library tags in [library] and thus handle
+  /// imports/exports/parts in the synthesized/patch library.
+  Future processLibraryTags(LibraryElement library);
 }
 
 /**
@@ -218,10 +242,9 @@
  * [LibraryLoader] and [LibraryLoaderTask] is made to hide internal members from
  * the [LibraryLoader] interface.
  */
-class LibraryLoaderTask extends LibraryLoader {
-  LibraryLoaderTask(Compiler compiler) : super(compiler);
+class _LibraryLoaderTask extends CompilerTask implements LibraryLoaderTask {
+  _LibraryLoaderTask(Compiler compiler) : super(compiler);
   String get name => 'LibraryLoader';
-  List onLibraryLoadedCallbacks = [];
 
   final Map<Uri, LibraryElement> libraryResourceUriMap =
       new Map<Uri, LibraryElement>();
@@ -230,22 +253,38 @@
 
   LibraryDependencyHandler currentHandler;
 
-  Future<LibraryElement> loadLibrary(Uri resolvedUri, Node node,
-      Uri canonicalUri) {
+  void reset() {
+    assert(currentHandler == null);
+    libraryResourceUriMap.clear();
+    libraryNames.clear();
+  }
+
+  void reuseLibrary(LibraryElement library) {
+    String name = library.getLibraryOrScriptName();
+    Uri resourceUri = library.entryCompilationUnit.script.resourceUri;
+    libraryResourceUriMap[resourceUri] = library;
+    libraryNames[name] = library;
+  }
+
+  Future<LibraryElement> loadLibrary(Uri resolvedUri) {
     return measure(() {
       assert(currentHandler == null);
       // TODO(johnniwinther): Ensure that currentHandler correctly encloses the
       // loading of a library cluster.
-      currentHandler = new LibraryDependencyHandler(compiler);
-      return createLibrary(currentHandler, null, resolvedUri, node,
-          canonicalUri).then((LibraryElement library) {
+      currentHandler = new LibraryDependencyHandler(this);
+      return createLibrary(currentHandler, null, resolvedUri)
+          .then((LibraryElement library) {
         return compiler.withCurrentElement(library, () {
           return measure(() {
             currentHandler.computeExports();
+            Map<Uri, LibraryElement> loadedLibraries = <Uri, LibraryElement>{};
+            currentHandler.loadedLibraries.forEach(
+                (LibraryElement loadedLibrary) {
+              loadedLibraries[loadedLibrary.canonicalUri] = loadedLibrary;
+            });
             currentHandler = null;
-            var workList = onLibraryLoadedCallbacks;
-            onLibraryLoadedCallbacks = [];
-            return Future.forEach(workList, (f) => f()).then((_) => library);
+            return compiler.onLibrariesLoaded(loadedLibraries)
+                .then((_) => library);
           });
         });
       });
@@ -281,7 +320,7 @@
     var libraryDependencies = new LinkBuilder<LibraryDependency>();
     Uri base = library.entryCompilationUnit.script.readableUri;
 
-    // TODO(rnystrom): Remove .toList() here if #11523 is fixed.
+    // TODO(johnniwinther): Reverse the tag list on access and cache the result.
     return Future.forEach(library.tags.reverse().toList(), (LibraryTag tag) {
       return compiler.withCurrentElement(library, () {
         if (tag.isImport) {
@@ -312,15 +351,11 @@
         }
       });
     }).then((_) {
-      return compiler.withCurrentElement(library, () {
-        checkDuplicatedLibraryName(library);
-        // Apply patch, if any.
-        if (library.isPlatformLibrary) {
-          return patchDartLibrary(handler, library, library.canonicalUri.path);
-        }
-      });
+      return compiler.onLibraryScanned(library, handler);
     }).then((_) {
       return compiler.withCurrentElement(library, () {
+        checkDuplicatedLibraryName(library);
+
         // Import dart:core if not already imported.
         if (!importsDartCore && !isDartCore(library.canonicalUri)) {
           return loadCoreLibrary(handler).then((LibraryElement coreLibrary) {
@@ -329,7 +364,6 @@
         }
       });
     }).then((_) {
-      // TODO(rnystrom): Remove .toList() here if #11523 is fixed.
       return Future.forEach(libraryDependencies.toLink().toList(), (tag) {
         return compiler.withCurrentElement(library, () {
           return registerLibraryFromTag(handler, library, tag);
@@ -389,22 +423,12 @@
     }
 
     Uri coreUri = new Uri(scheme: 'dart', path: 'core');
-    return createLibrary(handler, null, coreUri, null, coreUri)
-        .then((LibraryElement library) {
+    return createLibrary(handler, null, coreUri).then((LibraryElement library) {
       compiler.coreLibrary = library;
       return library;
     });
   }
 
-  Future patchDartLibrary(LibraryDependencyHandler handler,
-                        LibraryElement library, String dartLibraryPath) {
-    if (library.isPatched) return new Future.value();
-    Uri patchUri = compiler.resolvePatchUri(dartLibraryPath);
-    if (patchUri == null) return new Future.value();
-
-    return compiler.patchParser.patchLibrary(handler, patchUri, library);
-  }
-
   /**
    * Handle a part tag in the scope of [library]. The [resolvedUri] given is
    * used as is, any URI resolution should be done beforehand.
@@ -440,7 +464,7 @@
                                 LibraryDependency tag) {
     Uri base = library.entryCompilationUnit.script.readableUri;
     Uri resolvedUri = base.resolve(tag.uri.dartString.slowToString());
-    return createLibrary(handler, library, resolvedUri, tag.uri, resolvedUri)
+    return createLibrary(handler, library, resolvedUri, tag.uri)
         .then((LibraryElement loadedLibrary) {
           if (loadedLibrary == null) return;
           compiler.withCurrentElement(library, () {
@@ -455,22 +479,16 @@
    *
    * If a new library is created, the [handler] is notified.
    */
-  // TODO(johnniwinther): Remove [canonicalUri] and make [resolvedUri] the
-  // canonical uri when [Compiler.scanBuiltinLibrary] is removed.
   Future<LibraryElement> createLibrary(LibraryDependencyHandler handler,
                                        LibraryElement importingLibrary,
                                        Uri resolvedUri,
-                                       Node node,
-                                       Uri canonicalUri) {
+                                       [Node node]) {
     // TODO(johnniwinther): Create erroneous library elements for missing
     // libraries.
     Uri readableUri =
         compiler.translateResolvedUri(importingLibrary, resolvedUri, node);
     if (readableUri == null) return new Future.value();
-    LibraryElement library;
-    if (canonicalUri != null) {
-      library = compiler.libraries[canonicalUri.toString()];
-    }
+    LibraryElement library = compiler.libraries[resolvedUri.toString()];
     if (library != null) {
       return new Future.value(library);
     }
@@ -478,35 +496,22 @@
       return compiler.readScript(node, readableUri)
           .then((Script script) {
             if (script == null) return null;
-            LibraryElement element = new LibraryElementX(script, canonicalUri);
+            LibraryElement element = new LibraryElementX(script, resolvedUri);
             compiler.withCurrentElement(element, () {
               handler.registerNewLibrary(element);
               native.maybeEnableNative(compiler, element);
-              if (canonicalUri != null) {
-                compiler.libraries[canonicalUri.toString()] = element;
-              }
+              compiler.libraries[resolvedUri.toString()] = element;
               compiler.scanner.scanLibrary(element);
             });
             return processLibraryTags(handler, element).then((_) {
               compiler.withCurrentElement(element, () {
                 handler.registerLibraryExports(element);
-                onLibraryLoadedCallbacks.add(
-                    () => compiler.onLibraryLoaded(element, resolvedUri));
               });
               return element;
             });
           });
     });
   }
-
-  // TODO(johnniwinther): Remove this method when 'js_helper' is handled by
-  // [LibraryLoaderTask].
-  void importLibrary(LibraryElement importingLibrary,
-                     LibraryElement importedLibrary,
-                     Import tag) {
-    new ImportLink(tag, importedLibrary).importLibrary(compiler,
-                                                       importingLibrary);
-  }
 }
 
 
@@ -834,8 +839,8 @@
  * libraries and to compute their import/export scopes through a fixed-point
  * algorithm.
  */
-class LibraryDependencyHandler {
-  final Compiler compiler;
+class LibraryDependencyHandler implements LibraryLoader {
+  final _LibraryLoaderTask task;
 
   /**
    * Newly loaded libraries and their corresponding node in the library
@@ -843,10 +848,15 @@
    * part of the dependency graph of this handler since their export scopes have
    * already been computed.
    */
-  Map<LibraryElement,LibraryDependencyNode> nodeMap =
-      new Map<LibraryElement,LibraryDependencyNode>();
+  Map<LibraryElement, LibraryDependencyNode> nodeMap =
+      new Map<LibraryElement, LibraryDependencyNode>();
 
-  LibraryDependencyHandler(Compiler this.compiler);
+  LibraryDependencyHandler(this.task);
+
+  Compiler get compiler => task.compiler;
+
+  /// The libraries loaded with this handler.
+  Iterable<LibraryElement> get loadedLibraries => nodeMap.keys;
 
   /**
    * Performs a fixed-point computation on the export scopes of all registered
@@ -932,6 +942,7 @@
    */
   void registerNewLibrary(LibraryElement library) {
     nodeMap[library] = new LibraryDependencyNode(library);
+    compiler.onLibraryCreated(library);
   }
 
   /**
@@ -941,4 +952,8 @@
   void registerLibraryExports(LibraryElement library) {
     nodeMap[library].registerInitialExports();
   }
+
+  Future processLibraryTags(LibraryElement library) {
+    return task.processLibraryTags(this, library);
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/mirror_renamer/renamer.dart b/sdk/lib/_internal/compiler/implementation/mirror_renamer/renamer.dart
index 156a970..3b32fec 100644
--- a/sdk/lib/_internal/compiler/implementation/mirror_renamer/renamer.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirror_renamer/renamer.dart
@@ -6,7 +6,8 @@
 
 class MirrorRenamer {
   static const String MIRROR_HELPER_GET_NAME_FUNCTION = 'helperGetName';
-  static const String MIRROR_HELPER_LIBRARY_NAME = '_mirror_helper';
+  static final Uri DART_MIRROR_HELPER =
+      new Uri(scheme: 'dart', path: '_mirror_helper');
   static const String MIRROR_HELPER_SYMBOLS_MAP_NAME = '_SYMBOLS';
 
   /// Maps mangled name to original name.
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
index 982aa11c..6210bae 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
@@ -172,9 +172,9 @@
 
   List<String> get _list {
     if (_listCache == null) {
-      _listCache = new List<String>(_constant.keys.entries.length);
+      _listCache = new List<String>(_constant.length);
       int index = 0;
-      for (StringConstant keyConstant in _constant.keys.entries) {
+      for (StringConstant keyConstant in _constant.keys) {
         _listCache[index] = keyConstant.value.slowToString();
         index++;
       }
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
index a81c258..51cf6b3 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
@@ -468,13 +468,13 @@
 class BackDoor {
   /// Return the compilation units comprising [library].
   static List<Mirror> compilationUnitsOf(Dart2JsLibraryMirror library) {
-    return library._element.compilationUnits.toList().map(
-        (cu) => new Dart2JsCompilationUnitMirror(cu, library)).toList();
+    return library._element.compilationUnits.mapToList(
+        (cu) => new Dart2JsCompilationUnitMirror(cu, library));
   }
 
   static Iterable metadataSyntaxOf(Dart2JsElementMirror declaration) {
     Compiler compiler = declaration.mirrorSystem.compiler;
-    return declaration._element.metadata.toList().map((metadata) {
+    return declaration._element.metadata.map((metadata) {
       var node = metadata.parseNode(compiler);
       var treeElements = metadata.annotatedElement.treeElements;
       return new ResolvedNode(
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index f53d348..ae67556 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -90,6 +90,8 @@
   final Set<ClassElement> pendingClasses = new Set<ClassElement>();
   final Set<ClassElement> unusedClasses = new Set<ClassElement>();
 
+  final Set<LibraryElement> processedLibraries;
+
   bool hasInstantiatedNativeClasses() => !registeredClasses.isEmpty;
 
   final Set<ClassElement> nativeClassesAndSubclasses = new Set<ClassElement>();
@@ -121,9 +123,17 @@
   ClassElement _annotationJsNameClass;
 
   /// Subclasses of [NativeEnqueuerBase] are constructed by the backend.
-  NativeEnqueuerBase(this.world, this.compiler, this.enableLiveTypeAnalysis);
+  NativeEnqueuerBase(this.world, Compiler compiler, this.enableLiveTypeAnalysis)
+      : this.compiler = compiler,
+        processedLibraries = compiler.cacheStrategy.newSet();
 
   void processNativeClasses(Iterable<LibraryElement> libraries) {
+    if (compiler.hasIncrementalSupport) {
+      // Since [Set.add] returns bool if an element was added, this restricts
+      // [libraries] to ones that haven't already been processed. This saves
+      // time during incremental compiles.
+      libraries = libraries.where(processedLibraries.add);
+    }
     libraries.forEach(processNativeClassesInLibrary);
     if (compiler.isolateHelperLibrary != null) {
       processNativeClassesInLibrary(compiler.isolateHelperLibrary);
diff --git a/sdk/lib/_internal/compiler/implementation/patch_parser.dart b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
index acd97c4..1bc0888 100644
--- a/sdk/lib/_internal/compiler/implementation/patch_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
@@ -61,9 +61,9 @@
  *     class _InjectedClass { // An injected class.
  *       void _injectedMethod() {} // An injected method.
  *     }
- *     patch class PatchedClass { // A patch class.
+ *     @patch class PatchedClass { // A patch class.
  *       int _injectedField; { // An injected field.
- *       patch void patchedMethod() {} // A patch method.
+ *       @patch void patchedMethod() {} // A patch method.
  *     }
  *
  *
@@ -118,6 +118,7 @@
 
 import "tree/tree.dart" as tree;
 import "dart2jslib.dart" as leg;  // CompilerTask, Compiler.
+import "helpers/helpers.dart";
 import "scanner/scannerlib.dart";  // Scanner, Parsers, Listeners
 import "elements/elements.dart";
 import "elements/modelx.dart"
@@ -125,6 +126,7 @@
          MetadataAnnotationX,
          ClassElementX,
          FunctionElementX;
+import "library_loader.dart" show LibraryLoader;
 import 'util/util.dart';
 
 class PatchParserTask extends leg.CompilerTask {
@@ -136,45 +138,34 @@
    * injections to the library, and returns a list of class
    * patches.
    */
-  Future patchLibrary(leg.LibraryDependencyHandler handler,
+  Future patchLibrary(LibraryLoader loader,
                       Uri patchUri, LibraryElement originLibrary) {
     return compiler.readScript(originLibrary, patchUri)
         .then((leg.Script script) {
       var patchLibrary = new LibraryElementX(script, null, originLibrary);
       return compiler.withCurrentElement(patchLibrary, () {
-        handler.registerNewLibrary(patchLibrary);
-        var imports = new LinkBuilder<tree.LibraryTag>();
+        loader.registerNewLibrary(patchLibrary);
         compiler.withCurrentElement(patchLibrary.entryCompilationUnit, () {
           // This patches the elements of the patch library into [library].
           // Injected elements are added directly under the compilation unit.
           // Patch elements are stored on the patched functions or classes.
-          scanLibraryElements(patchLibrary.entryCompilationUnit, imports);
+          scanLibraryElements(patchLibrary.entryCompilationUnit);
         });
-        // TODO(rnystrom): Remove .toList() here if #11523 is fixed.
-        return Future.forEach(imports.toLink().toList(), (tag) {
-          return compiler.withCurrentElement(patchLibrary, () {
-            return compiler.libraryLoader.registerLibraryFromTag(
-                handler, patchLibrary, tag);
-          });
-        });
+        return loader.processLibraryTags(patchLibrary);
       });
     });
   }
 
-  void scanLibraryElements(
-        CompilationUnitElement compilationUnit,
-        LinkBuilder<tree.LibraryTag> imports) {
+  void scanLibraryElements(CompilationUnitElement compilationUnit) {
     measure(() {
-      // TODO(lrn): Possibly recursively handle 'part' directives in patch.
+      // TODO(johnniwinther): Test that parts and exports are handled correctly.
       leg.Script script = compilationUnit.script;
       Token tokens = new Scanner(script.file).tokenize();
       Function idGenerator = compiler.getNextFreeClassId;
-      PatchListener patchListener =
-          new PatchElementListener(compiler,
-                                   compilationUnit,
-                                   idGenerator,
-                                   imports);
-      new PatchParser(patchListener).parseUnit(tokens);
+      Listener patchListener = new PatchElementListener(compiler,
+                                                        compilationUnit,
+                                                        idGenerator);
+      new PartialParser(patchListener).parseUnit(tokens);
     });
   }
 
@@ -184,7 +175,7 @@
     if (element.cachedNode != null) return;
 
     measure(() => compiler.withCurrentElement(element, () {
-      PatchMemberListener listener = new PatchMemberListener(compiler, element);
+      MemberListener listener = new MemberListener(compiler, element);
       Parser parser = new PatchClassElementParser(listener);
       Token token = parser.parseTopLevelDeclaration(element.beginToken);
       assert(identical(token, element.endToken.next));
@@ -199,7 +190,7 @@
   void applyContainerPatch(ClassElement originClass,
                            Link<Element> patches) {
     for (Element patch in patches) {
-      if (!isPatchElement(patch)) continue;
+      if (!isPatchElement(compiler, patch)) continue;
 
       Element origin = originClass.localLookup(patch.name);
       patchElement(compiler, origin, patch);
@@ -208,76 +199,11 @@
 }
 
 /**
- * Extension of the [Listener] interface to handle the extra "patch" pseudo-
- * keyword in patch files.
- * Patch files shouldn't have a type named "patch".
- */
-abstract class PatchListener extends Listener {
-  void beginPatch(Token patch);
-  void endPatch(Token patch);
-}
-
-/**
- * Partial parser that extends the top-level and class grammars to allow the
- * word "patch" in front of some declarations.
- */
-class PatchParser extends PartialParser {
-  PatchParser(PatchListener listener) : super(listener);
-
-  PatchListener get patchListener => listener;
-
-  bool isPatch(Token token) => token.value == 'patch';
-
-  /**
-   * Parse top-level declarations, and allow "patch" in front of functions
-   * and classes.
-   */
-  Token parseTopLevelDeclaration(Token token) {
-    if (!isPatch(token)) {
-      return super.parseTopLevelDeclaration(token);
-    }
-    Token patch = token;
-    token = token.next;
-    String value = token.stringValue;
-    if (identical(value, 'interface')
-        || identical(value, 'typedef')
-        || identical(value, '#')
-        || identical(value, 'abstract')) {
-      // At the top level, you can only patch functions and classes.
-      // Patch classes and functions can't be marked abstract.
-      return listener.unexpected(patch);
-    }
-    patchListener.beginPatch(patch);
-    token = super.parseTopLevelDeclaration(token);
-    patchListener.endPatch(patch);
-    return token;
-  }
-
-  /**
-   * Parse a class member.
-   * If the member starts with "patch", it's a member override.
-   * Only methods can be overridden, including constructors, getters and
-   * setters, but not fields. If "patch" occurs in front of a field, the error
-   * is caught elsewhere.
-   */
-  Token parseMember(Token token) {
-    if (!isPatch(token)) {
-      return super.parseMember(token);
-    }
-    Token patch = token;
-    patchListener.beginPatch(patch);
-    token = super.parseMember(token.next);
-    patchListener.endPatch(patch);
-    return token;
-  }
-}
-
-/**
  * Partial parser for patch files that also handles the members of class
  * declarations.
  */
-class PatchClassElementParser extends PatchParser {
-  PatchClassElementParser(PatchListener listener) : super(listener);
+class PatchClassElementParser extends PartialParser {
+  PatchClassElementParser(Listener listener) : super(listener);
 
   Token parseClassBody(Token token) => fullParseClassBody(token);
 }
@@ -285,120 +211,29 @@
 /**
  * Extension of [ElementListener] for parsing patch files.
  */
-class PatchElementListener extends ElementListener implements PatchListener {
-  final LinkBuilder<tree.LibraryTag> imports;
-  bool isMemberPatch = false;
-  bool isClassPatch = false;
+class PatchElementListener extends ElementListener implements Listener {
+  final leg.Compiler compiler;
 
-  PatchElementListener(leg.DiagnosticListener listener,
+  PatchElementListener(leg.Compiler compiler,
                        CompilationUnitElement patchElement,
-                       int idGenerator(),
-                       this.imports)
-    : super(listener, patchElement, idGenerator);
-
-  MetadataAnnotation popMetadataHack() {
-    // TODO(ahe): Remove this method.
-    popNode(); // Discard null.
-    return new PatchMetadataAnnotation();
-  }
-
-  void beginPatch(Token token) {
-    if (identical(token.next.stringValue, "class")) {
-      isClassPatch = true;
-    } else {
-      isMemberPatch = true;
-    }
-    handleIdentifier(token);
-  }
-
-  void endPatch(Token token) {
-    if (identical(token.next.stringValue, "class")) {
-      isClassPatch = false;
-    } else {
-      isMemberPatch = false;
-    }
-  }
-
-  /**
-    * Allow script tags (import only, the parser rejects the rest for now) in
-    * patch files. The import tags will be added to the library.
-    */
-  bool allowLibraryTags() => true;
-
-  void addLibraryTag(tree.LibraryTag tag) {
-    super.addLibraryTag(tag);
-    imports.addLast(tag);
-  }
+                       int idGenerator())
+    : this.compiler = compiler,
+      super(compiler, patchElement, idGenerator);
 
   void pushElement(Element patch) {
-    if (isMemberPatch || (isClassPatch && patch is ClassElement)) {
-      // Apply patch.
-      patch.addMetadata(popMetadataHack());
+    super.pushElement(patch);
+    if (isPatchElement(compiler, patch)) {
       LibraryElement originLibrary = compilationUnitElement.library;
       assert(originLibrary.isPatched);
       Element origin = originLibrary.localLookup(patch.name);
       patchElement(listener, origin, patch);
     }
-    super.pushElement(patch);
   }
 }
 
-/**
- * Extension of [MemberListener] for parsing patch class bodies.
- */
-class PatchMemberListener extends MemberListener implements PatchListener {
-  bool isMemberPatch = false;
-  bool isClassPatch = false;
-  PatchMemberListener(leg.DiagnosticListener listener,
-                      Element enclosingElement)
-    : super(listener, enclosingElement);
-
-  MetadataAnnotation popMetadataHack() {
-    // TODO(ahe): Remove this method.
-    popNode(); // Discard null.
-    return new PatchMetadataAnnotation();
-  }
-
-  void beginPatch(Token token) {
-    if (identical(token.next.stringValue, "class")) {
-      isClassPatch = true;
-    } else {
-      isMemberPatch = true;
-    }
-    handleIdentifier(token);
-  }
-
-  void endPatch(Token token) {
-    if (identical(token.next.stringValue, "class")) {
-      isClassPatch = false;
-    } else {
-      isMemberPatch = false;
-    }
-  }
-
-  void addMember(Element element) {
-    if (isMemberPatch || (isClassPatch && element is ClassElement)) {
-      element.addMetadata(popMetadataHack());
-    }
-    super.addMember(element);
-  }
-}
-
-// TODO(ahe): Get rid of this class.
-class PatchMetadataAnnotation extends MetadataAnnotationX {
-  final leg.Constant value = null;
-
-  PatchMetadataAnnotation() : super(STATE_DONE);
-
-  tree.Node parseNode(leg.DiagnosticListener listener) => null;
-
-  Token get beginToken => null;
-  Token get endToken => null;
-}
-
 void patchElement(leg.DiagnosticListener listener,
-                   Element origin,
-                   Element patch) {
+                  Element origin,
+                  Element patch) {
   if (origin == null) {
     listener.reportError(
         patch, leg.MessageKind.PATCH_NON_EXISTING, {'name': patch.name});
@@ -546,11 +381,25 @@
 }
 
 // TODO(johnniwinther): Add unittest when patch is (real) metadata.
-bool isPatchElement(Element element) {
+bool isPatchElement(leg.Compiler compiler, Element element) {
   // TODO(lrn): More checks needed if we introduce metadata for real.
   // In that case, it must have the identifier "native" as metadata.
-  for (Link link = element.metadata; !link.isEmpty; link = link.tail) {
-    if (link.head is PatchMetadataAnnotation) return true;
+  for (Link<MetadataAnnotation> link = element.metadata;
+       !link.isEmpty;
+       link = link.tail) {
+    MetadataAnnotation annotation = link.head;
+    if (annotation.beginToken != null &&
+        annotation.beginToken.next.value == 'patch') {
+      // TODO(johnniwinther): Perform this check in
+      // [Compiler.onLibrariesLoaded].
+      compiler.enqueuer.resolution.addDeferredAction(element, () {
+        annotation.ensureResolved(compiler);
+        if (annotation.value != compiler.patchConstant) {
+          compiler.internalError(annotation, 'Invalid patch annotation.');
+        }
+      });
+      return true;
+    }
   }
   return false;
 }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart b/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
index bb6efd9..b11aaee 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
@@ -785,7 +785,8 @@
       if (interfaceMembersAreClassMembers) {
         ClassMemberMixin superclass = this.superclass;
         if ((superclass != null &&
-             !superclass.interfaceMembersAreClassMembers) ||
+             (!superclass.interfaceMembersAreClassMembers ||
+              superclass.isMixinApplication)) ||
              !interfaces.isEmpty) {
           interfaceMembersAreClassMembers = false;
         }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index b03c3ac..c19d89c 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -298,15 +298,6 @@
     });
   }
 
-  String constructorNameForDiagnostics(String className,
-                                       String constructorName) {
-    String classNameString = className;
-    String constructorNameString = constructorName;
-    return (constructorName == '')
-        ? classNameString
-        : "$classNameString.$constructorNameString";
-   }
-
   void resolveRedirectingConstructor(InitializerResolver resolver,
                                      Node node,
                                      FunctionElement constructor,
@@ -451,15 +442,13 @@
     return compiler.withCurrentElement(element, () {
       bool isConstructor =
           identical(element.kind, ElementKind.GENERATIVE_CONSTRUCTOR);
-      TreeElements elements =
-          compiler.enqueuer.resolution.getCachedElements(element);
-      if (elements != null) {
+      if (compiler.enqueuer.resolution.hasBeenResolved(element)) {
         // TODO(karlklose): Remove the check for [isConstructor]. [elememts]
         // should never be non-null, not even for constructors.
         assert(invariant(element, element.isConstructor,
             message: 'Non-constructor element $element '
                      'has already been analyzed.'));
-        return elements;
+        return element.resolvedAst.elements;
       }
       if (element.isSynthesized) {
         if (isConstructor) {
@@ -917,7 +906,7 @@
 
     // Check that the mixed in class doesn't have any constructors and
     // make sure we aren't mixing in methods that use 'super'.
-    mixin.forEachLocalMember((Element member) {
+    mixin.forEachLocalMember((AstElement member) {
       if (member.isGenerativeConstructor && !member.isSynthesized) {
         compiler.reportError(member, MessageKind.ILLEGAL_MIXIN_CONSTRUCTOR);
       } else {
@@ -927,10 +916,12 @@
         // mixin application has been performed.
         // TODO(johnniwinther): Obtain the [TreeElements] for [member]
         // differently.
-        checkMixinSuperUses(
-            compiler.enqueuer.resolution.resolvedElements[member],
-            mixinApplication,
-            mixin);
+        if (compiler.enqueuer.resolution.hasBeenResolved(member)) {
+          checkMixinSuperUses(
+              member.resolvedAst.elements,
+              mixinApplication,
+              mixin);
+        }
       }
     });
   }
@@ -1425,8 +1416,7 @@
       Selector constructorSelector) {
     if (lookedupConstructor == null
         || !lookedupConstructor.isGenerativeConstructor) {
-      var fullConstructorName =
-          visitor.compiler.resolver.constructorNameForDiagnostics(
+      String fullConstructorName = Elements.constructorNameForDiagnostics(
               className,
               constructorSelector.name);
       MessageKind kind = isImplicitSuperCall
@@ -2318,7 +2308,7 @@
     } else {
       name = node.name.asIdentifier().source;
     }
-    FunctionElementX function = new LocalFunctionElementX(
+    LocalFunctionElementX function = new LocalFunctionElementX(
         name, node, ElementKind.FUNCTION, Modifiers.EMPTY,
         enclosingElement);
     function.functionSignatureCache =
@@ -2695,7 +2685,7 @@
         // class or typedef literal. We do not need to register this call as a
         // dynamic invocation, because we statically know what the target is.
       } else if (!selector.applies(target, compiler)) {
-        warnArgumentMismatch(node, target);
+        registry.registerThrowNoSuchMethod();
         if (node.isSuperCall) {
           // Similar to what we do when we can't find super via selector
           // in [resolveSend] above, we still need to register the invocation,
@@ -2729,14 +2719,6 @@
     return node.isPropertyAccess ? target : null;
   }
 
-  void warnArgumentMismatch(Send node, Element target) {
-    registry.registerThrowNoSuchMethod();
-    // TODO(karlklose): we can be more precise about the reason of the
-    // mismatch.
-    warning(node.argumentsNode, MessageKind.INVALID_ARGUMENTS,
-            {'methodName': target.name});
-  }
-
   /// Callback for native enqueuer to parse a type.  Returns [:null:] on error.
   DartType resolveTypeFromString(Node node, String typeName) {
     Element element = lookupInScope(compiler, node,
@@ -3077,7 +3059,6 @@
     registry.useElement(node.send, constructor);
     if (Elements.isUnresolved(constructor)) return constructor;
     if (!callSelector.applies(constructor, compiler)) {
-      warnArgumentMismatch(node.send, constructor);
       registry.registerThrowNoSuchMethod();
     }
 
@@ -3136,7 +3117,7 @@
 
   void checkConstMapKeysDontOverrideEquals(Spannable spannable,
                                            MapConstant map) {
-    for (Constant key in map.keys.entries) {
+    for (Constant key in map.keys) {
       if (!key.isObject) continue;
       ObjectConstant objectConstant = key;
       DartType keyType = objectConstant.type;
@@ -4064,7 +4045,8 @@
     } else if (mixinType.isTypeVariable) {
       compiler.reportError(mixinNode, MessageKind.CLASS_NAME_EXPECTED);
     } else if (mixinType.isMalformed) {
-      compiler.reportError(mixinNode, MessageKind.CANNOT_MIXIN_MALFORMED);
+      compiler.reportError(mixinNode, MessageKind.CANNOT_MIXIN_MALFORMED,
+          {'className': element.name, 'malformedType': mixinType});
     }
     return mixinType;
   }
@@ -4243,7 +4225,8 @@
     DartType supertype = resolveType(superclass);
     if (supertype != null) {
       if (identical(supertype.kind, TypeKind.MALFORMED_TYPE)) {
-        compiler.reportError(superclass, MessageKind.CANNOT_EXTEND_MALFORMED);
+        compiler.reportError(superclass, MessageKind.CANNOT_EXTEND_MALFORMED,
+            {'className': element.name, 'malformedType': supertype});
         return objectType;
       } else if (!identical(supertype.kind, TypeKind.INTERFACE)) {
         compiler.reportError(superclass.typeName,
@@ -4266,7 +4249,8 @@
       if (interfaceType != null) {
         if (identical(interfaceType.kind, TypeKind.MALFORMED_TYPE)) {
           compiler.reportError(superclass,
-              MessageKind.CANNOT_IMPLEMENT_MALFORMED);
+              MessageKind.CANNOT_IMPLEMENT_MALFORMED,
+              {'className': element.name, 'malformedType': interfaceType});
         } else if (!identical(interfaceType.kind, TypeKind.INTERFACE)) {
           // TODO(johnniwinther): Handle dynamic.
           TypeAnnotation typeAnnotation = link.head;
@@ -4561,8 +4545,7 @@
     Selector selector = createConstructorSelector(constructorName);
     Element result = cls.lookupConstructor(selector);
     if (result == null) {
-      String fullConstructorName =
-          resolver.compiler.resolver.constructorNameForDiagnostics(
+      String fullConstructorName = Elements.constructorNameForDiagnostics(
               cls.name,
               constructorName);
       return failOrReturnErroneousElement(
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/registry.dart b/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
index 6c47af4..5d0afd3 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
@@ -17,6 +17,8 @@
 
   ResolutionRegistry.internal(this.compiler, this.mapping);
 
+  bool get isForResolution => true;
+
   Element get currentElement => mapping.currentElement;
 
   ResolutionEnqueuer get world => compiler.enqueuer.resolution;
@@ -196,7 +198,7 @@
   }
 
   void registerLazyField() {
-    backend.registerLazyField(this);
+    backend.onLazyField(this);
   }
 
   void registerMetadataConstant(Constant constant) {
@@ -204,23 +206,25 @@
   }
 
   void registerThrowRuntimeError() {
-    backend.registerThrowRuntimeError(this);
+    backend.onThrowRuntimeError(this);
   }
 
   void registerTypeVariableBoundCheck() {
-    backend.registerTypeVariableBoundCheck(this);
+    backend.onTypeVariableBoundCheck(this);
   }
 
   void registerThrowNoSuchMethod() {
-    backend.registerThrowNoSuchMethod(this);
+    backend.onThrowNoSuchMethod(this);
   }
 
   void registerIsCheck(DartType type) {
     world.registerIsCheck(type, this);
+    backend.onIsCheck(type, this);
   }
 
   void registerAsCheck(DartType type) {
-    world.registerAsCheck(type, this);
+    registerIsCheck(type);
+    backend.onAsCheck(type, this);
   }
 
   void registerClosure(Element element) {
@@ -236,7 +240,7 @@
   }
 
   void registerSuperNoSuchMethod() {
-    backend.registerSuperNoSuchMethod(this);
+    backend.onSuperNoSuchMethod(this);
   }
 
   void registerClassUsingVariableExpression(ClassElement element) {
@@ -244,12 +248,13 @@
   }
 
   void registerTypeVariableExpression() {
-    backend.registerTypeVariableExpression(this);
+    backend.onTypeVariableExpression(this);
   }
 
   void registerTypeLiteral(Send node, DartType type) {
     mapping.setType(node, type);
-    world.registerTypeLiteral(type, this);
+    backend.onTypeLiteral(type, this);
+    world.registerInstantiatedClass(compiler.typeClass, this);
   }
 
   // TODO(johnniwinther): Remove the [ResolverVisitor] dependency. Its only
@@ -271,11 +276,11 @@
   }
 
   void registerConstSymbol(String name) {
-    world.registerConstSymbol(name, this);
+    backend.registerConstSymbol(name, this);
   }
 
   void registerSymbolConstructor() {
-    backend.registerSymbolConstructor(this);
+    backend.onSymbolConstructor(this);
   }
 
   void registerInstantiatedType(InterfaceType type) {
@@ -287,11 +292,11 @@
   }
 
   void registerAbstractClassInstantiation() {
-    backend.registerAbstractClassInstantiation(this);
+    backend.onAbstractClassInstantiation(this);
   }
 
   void registerNewSymbol() {
-    world.registerNewSymbol(this);
+    backend.registerNewSymbol(this);
   }
 
   void registerRequiredType(DartType type, Element enclosingElement) {
@@ -299,23 +304,23 @@
   }
 
   void registerStringInterpolation() {
-    backend.registerStringInterpolation(this);
+    backend.onStringInterpolation(this);
   }
 
   void registerConstantMap() {
-    backend.registerConstantMap(this);
+    backend.onConstantMap(this);
   }
 
   void registerFallThroughError() {
-    backend.registerFallThroughError(this);
+    backend.onFallThroughError(this);
   }
 
   void registerCatchStatement() {
-    backend.registerCatchStatement(world, this);
+    backend.onCatchStatement(this);
   }
 
   void registerStackTraceInCatch() {
-    backend.registerStackTraceInCatch(this);
+    backend.onStackTraceInCatch(this);
   }
 
   ClassElement defaultSuperclass(ClassElement element) {
@@ -328,7 +333,7 @@
   }
 
   void registerThrowExpression() {
-    backend.registerThrowExpression(this);
+    backend.onThrowExpression(this);
   }
 
   void registerDependency(Element element) {
@@ -336,4 +341,15 @@
   }
 
   Setlet<Element> get otherDependencies => mapping.otherDependencies;
+
+  void registerStaticInvocation(Element element) {
+    if (element == null) return;
+    world.addToWorkList(element);
+    registerDependency(element);
+  }
+
+  void registerInstantiation(ClassElement element) {
+    if (element == null) return;
+    world.registerInstantiatedClass(element, this);
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
index 97326a3..2dd44a9 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
@@ -252,7 +252,15 @@
     int requiredParameterCount = 0;
     if (formalParameters == null) {
       if (!element.isGetter) {
-        compiler.reportError(element, MessageKind.MISSING_FORMALS);
+        if (element.isErroneous) {
+          // If the element is erroneous, an error should already have been
+          // reported. In the case of parse errors, it is possible that there
+          // are formal parameters, but something else in the method failed to
+          // parse. So we suppress the message about missing formals.
+          assert(invariant(element, compiler.compilationFailed));
+        } else {
+          compiler.reportError(element, MessageKind.MISSING_FORMALS);
+        }
       }
     } else {
       if (element.isGetter) {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
index 4eeed62..3d35ffe 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
@@ -174,6 +174,7 @@
   }
 
   void endFields(int count, Token beginToken, Token endToken) {
+    bool hasParseError = memberErrors.head;
     super.endFields(count, beginToken, endToken);
     VariableDefinitions variableDefinitions = popNode();
     Modifiers modifiers = variableDefinitions.modifiers;
@@ -185,7 +186,8 @@
     }
     buildFieldElements(modifiers, variableDefinitions.definitions,
                        enclosingElement,
-                       buildFieldElement, beginToken, endToken);
+                       buildFieldElement, beginToken, endToken,
+                       hasParseError);
   }
 
   void endInitializer(Token assignmentOperator) {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 5ee68c2..7a19ce7 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -11,6 +11,9 @@
  * on parser errors.
  */
 class Listener {
+  set suppressParseErrors(bool value) {
+  }
+
   void beginArguments(Token token) {
   }
 
@@ -768,6 +771,17 @@
 
   Link<MetadataAnnotation> metadata = const Link<MetadataAnnotation>();
 
+  /// Records a stack of booleans for each member parsed (a stack is used to
+  /// support nested members which isn't currently possible, but it also serves
+  /// as a simple way to tell we're currently parsing a member). In this case,
+  /// member refers to members of a library or a class (but currently, classes
+  /// themselves are not considered members).  If the top of the stack
+  /// (memberErrors.head) is true, the current member has already reported at
+  /// least one parse error.
+  Link<bool> memberErrors = const Link<bool>();
+
+  bool suppressParseErrors = false;
+
   ElementListener(DiagnosticListener listener,
                   this.compilationUnitElement,
                   this.idGenerator)
@@ -775,6 +789,10 @@
         stringValidator = new StringValidator(listener),
         interpolationScope = const Link<StringQuoting>();
 
+  bool get currentMemberHasParseError {
+    return !memberErrors.isEmpty && memberErrors.head;
+  }
+
   void pushQuoting(StringQuoting quoting) {
     interpolationScope = interpolationScope.prepend(quoting);
   }
@@ -799,9 +817,9 @@
   bool allowLibraryTags() {
     // Library tags are only allowed in the library file itself, not
     // in sourced files.
-    LibraryElement library = compilationUnitElement.library;
-    return !compilationUnitElement.hasMembers
-      && library.entryCompilationUnit == compilationUnitElement;
+    LibraryElement library = compilationUnitElement.implementationLibrary;
+    return !compilationUnitElement.hasMembers &&
+           library.entryCompilationUnit == compilationUnitElement;
   }
 
   void endLibraryName(Token libraryKeyword, Token semicolon) {
@@ -954,6 +972,8 @@
   }
 
   void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
+    bool hasParseError = currentMemberHasParseError;
+    memberErrors = memberErrors.tail;
     Identifier name = popNode();
     TypeAnnotation type = popNode();
     Modifiers modifiers = popNode();
@@ -965,12 +985,16 @@
     } else if (identical(getOrSet.stringValue, 'set')) {
       kind = ElementKind.SETTER;
     }
-    pushElement(new PartialFunctionElement(name.source, beginToken, getOrSet,
-                                           endToken, kind, modifiers,
-                                           compilationUnitElement, false));
+    PartialFunctionElement element = new PartialFunctionElement(
+        name.source, beginToken, getOrSet, endToken, kind, modifiers,
+        compilationUnitElement, false);
+    element.hasParseError = hasParseError;
+    pushElement(element);
   }
 
   void endTopLevelFields(int count, Token beginToken, Token endToken) {
+    bool hasParseError = currentMemberHasParseError;
+    memberErrors = memberErrors.tail;
     void buildFieldElement(Identifier name, VariableList fields) {
       pushElement(
           new FieldElementX(name, compilationUnitElement, fields));
@@ -980,7 +1004,7 @@
     Modifiers modifiers = popNode();
     buildFieldElements(modifiers, variables, compilationUnitElement,
                        buildFieldElement,
-                       beginToken, endToken);
+                       beginToken, endToken, hasParseError);
   }
 
   void buildFieldElements(Modifiers modifiers,
@@ -988,9 +1012,10 @@
                           Element enclosingElement,
                           void buildFieldElement(Identifier name,
                                                  VariableList fields),
-                          Token beginToken, Token endToken) {
+                          Token beginToken, Token endToken,
+                          bool hasParseError) {
     VariableList fields =
-        new PartialFieldList(beginToken, endToken, modifiers);
+        new PartialFieldList(beginToken, endToken, modifiers, hasParseError);
     for (Link<Node> variableNodes = variables.nodes;
          !variableNodes.isEmpty;
          variableNodes = variableNodes.tail) {
@@ -1067,13 +1092,43 @@
   Token expected(String string, Token token) {
     if (token is ErrorToken) {
       reportErrorToken(token);
+    } else if (identical(';', string)) {
+      // When a semicolon is missing, it often leads to an error on the
+      // following line. So we try to find the token preceding the semicolon
+      // and report that something is missing *after* it.
+      Token preceding = findPrecedingToken(token);
+      if (preceding == token) {
+        reportError(
+            token, MessageKind.MISSING_TOKEN_BEFORE_THIS, {'token': string});
+      } else {
+        reportError(
+            preceding, MessageKind.MISSING_TOKEN_AFTER_THIS, {'token': string});
+      }
+      return token;
     } else {
       reportFatalError(
-          token, "Expected '$string', but got '${token.value}'.");
+          token,
+          MessageKind.MISSING_TOKEN_BEFORE_THIS.message(
+              {'token': string}, true).toString());
     }
     return skipToEof(token);
   }
 
+  /// Finds the preceding token via the begin token of the last AST node pushed
+  /// on the [nodes] stack.
+  Token findPrecedingToken(Token token) {
+    if (!nodes.isEmpty && nodes.head != null) {
+      Token current = nodes.head.getBeginToken();
+      while (current.kind != EOF_TOKEN && current.next != token) {
+        current = current.next;
+      }
+      if (current.kind != EOF_TOKEN) {
+        return current;
+      }
+    }
+    return token;
+  }
+
   Token expectedIdentifier(Token token) {
     if (token is KeywordToken) {
       reportError(
@@ -1313,6 +1368,30 @@
     pushNode(accumulator);
   }
 
+  void beginMember(Token token) {
+    memberErrors = memberErrors.prepend(false);
+  }
+
+  void beginTopLevelMember(Token token) {
+    beginMember(token);
+  }
+
+  void endFields(fieldCount, start, token) {
+    memberErrors = memberErrors.tail;
+  }
+
+  void endMethod(getOrSet, start, token) {
+    memberErrors = memberErrors.tail;
+  }
+
+  void beginFactoryMethod(Token token) {
+    memberErrors = memberErrors.prepend(false);
+  }
+
+  void endFactoryMethod(Token beginToken, Token endToken) {
+    memberErrors = memberErrors.tail;
+  }
+
   void reportFatalError(Spannable spannable,
                         String message) {
     listener.reportFatalError(
@@ -1322,14 +1401,36 @@
   void reportError(Spannable spannable,
                    MessageKind errorCode,
                    [Map arguments = const {}]) {
+    if (currentMemberHasParseError) return; // Error already reported.
+    if (suppressParseErrors) return;
+    if (!memberErrors.isEmpty) {
+      memberErrors = memberErrors.tail.prepend(true);
+    }
     listener.reportError(spannable, errorCode, arguments);
   }
 }
 
 class NodeListener extends ElementListener {
-  NodeListener(DiagnosticListener listener, CompilationUnitElement element)
+  final bool throwOnFatalError;
+
+  NodeListener(
+      DiagnosticListener listener,
+      CompilationUnitElement element,
+      {bool this.throwOnFatalError: false})
     : super(listener, element, null);
 
+  void reportFatalError(Spannable spannable,
+                        String message) {
+    if (throwOnFatalError) {
+      if (!currentMemberHasParseError && !suppressParseErrors) {
+        reportError(spannable, MessageKind.GENERIC, {'text': message});
+      }
+      throw new ParserError(message);
+    } else {
+      super.reportFatalError(spannable, message);
+    }
+  }
+
   void addLibraryTag(LibraryTag tag) {
     pushNode(tag);
   }
@@ -1497,12 +1598,13 @@
     if (identical(token.stringValue, 'native')) {
       return native.handleNativeFunctionBody(this, token);
     } else if (token is ErrorToken) {
+      pushNode(null);
       reportErrorToken(token);
     } else {
       reportFatalError(token,
                        "Expected a function body, but got '${token.value}'.");
-      return skipToEof(token);
     }
+    return skipToEof(token);
   }
 
   Token expectedClassBody(Token token) {
@@ -1667,7 +1769,8 @@
 
   void endInitializer(Token assignmentOperator) {
     Expression initializer = popNode();
-    NodeList arguments = new NodeList.singleton(initializer);
+    NodeList arguments =
+        initializer == null ? null : new NodeList.singleton(initializer);
     Expression name = popNode();
     Operator op = new Operator(assignmentOperator);
     pushNode(new SendSet(null, name, op, arguments));
@@ -1938,6 +2041,7 @@
   }
 
   void endFactoryMethod(Token beginToken, Token endToken) {
+    super.endFactoryMethod(beginToken, endToken);
     Statement body = popNode();
     NodeList formals = popNode();
     Node name = popNode();
@@ -2072,6 +2176,12 @@
   }
 }
 
+abstract class PartialElement implements Element {
+  bool hasParseError = false;
+
+  bool get isErroneous => hasParseError;
+}
+
 abstract class PartialFunctionMixin implements FunctionElement {
   FunctionExpression cachedNode;
   Modifiers get modifiers;
@@ -2111,7 +2221,7 @@
         p.parseFunction(beginToken, getOrSet);
       }
     }
-    cachedNode = parse(listener, compilationUnit, parseFunction);
+    cachedNode = parse(listener, this, parseFunction);
     return cachedNode;
   }
 
@@ -2119,7 +2229,7 @@
 }
 
 class PartialFunctionElement extends FunctionElementX
-    with PartialFunctionMixin {
+    with PartialElement, PartialFunctionMixin {
   PartialFunctionElement(String name,
                          Token beginToken,
                          Token getOrSet,
@@ -2134,7 +2244,7 @@
 }
 
 class PartialConstructorElement extends ConstructorElementX
-    with PartialFunctionMixin {
+    with PartialElement, PartialFunctionMixin {
   PartialConstructorElement(String name,
                             Token beginToken,
                             Token endToken,
@@ -2149,23 +2259,32 @@
 class PartialFieldList extends VariableList {
   final Token beginToken;
   final Token endToken;
+  final bool hasParseError;
 
-  PartialFieldList(Token this.beginToken,
-                   Token this.endToken,
-                   Modifiers modifiers)
+  PartialFieldList(this.beginToken,
+                   this.endToken,
+                   Modifiers modifiers,
+                   this.hasParseError)
       : super(modifiers);
 
   VariableDefinitions parseNode(Element element, DiagnosticListener listener) {
     if (definitions != null) return definitions;
     listener.withCurrentElement(element, () {
-      definitions = parse(listener,
-                          element.compilationUnit,
-                          (p) => p.parseVariablesDeclaration(beginToken));
+      definitions = parse(
+          listener, element,
+          (Parser parser) {
+            if (hasParseError) {
+              parser.listener.suppressParseErrors = true;
+            }
+            return parser.parseMember(beginToken);
+          });
 
-      if (!definitions.modifiers.isVar &&
+      if (!hasParseError &&
+          !definitions.modifiers.isVar &&
           !definitions.modifiers.isFinal &&
           !definitions.modifiers.isConst &&
-          definitions.type == null) {
+          definitions.type == null &&
+          !definitions.isErroneous) {
         listener.reportError(
             definitions,
             MessageKind.GENERIC,
@@ -2201,7 +2320,7 @@
   Node parseNode(DiagnosticListener listener) {
     if (cachedNode != null) return cachedNode;
     cachedNode = parse(listener,
-                       compilationUnit,
+                       this,
                        (p) => p.parseTopLevelDeclaration(token));
     return cachedNode;
   }
@@ -2230,7 +2349,7 @@
   Node parseNode(DiagnosticListener listener) {
     if (cachedNode != null) return cachedNode;
     Metadata metadata = parse(listener,
-                              annotatedElement.compilationUnit,
+                              annotatedElement,
                               (p) => p.parseMetadata(beginToken));
     cachedNode = metadata.expression;
     return cachedNode;
@@ -2238,10 +2357,20 @@
 }
 
 Node parse(DiagnosticListener diagnosticListener,
-           CompilationUnitElement element,
+           Element element,
            doParse(Parser parser)) {
-  NodeListener listener = new NodeListener(diagnosticListener, element);
-  doParse(new Parser(listener));
+  CompilationUnitElement unit = element.compilationUnit;
+  NodeListener listener =
+      new NodeListener(diagnosticListener, unit, throwOnFatalError: true);
+  listener.memberErrors = listener.memberErrors.prepend(false);
+  try {
+    doParse(new Parser(listener));
+  } on ParserError catch (e) {
+    if (element is PartialElement) {
+      element.hasParseError = true;
+    }
+    return new ErrorNode(element.position, e.reason);
+  }
   Node node = listener.popNode();
   assert(listener.nodes.isEmpty);
   return node;
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
index 34d0d65..e6163a9 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
@@ -825,13 +825,14 @@
       token = parseVariableInitializerOpt(token);
       ++fieldCount;
     }
-    expectSemicolon(token);
+    Token semicolon = token;
+    token = expectSemicolon(token);
     if (isTopLevel) {
-      listener.endTopLevelFields(fieldCount, start, token);
+      listener.endTopLevelFields(fieldCount, start, semicolon);
     } else {
-      listener.endFields(fieldCount, start, token);
+      listener.endFields(fieldCount, start, semicolon);
     }
-    return token.next;
+    return token;
   }
 
   Token parseTopLevelMethod(Token start,
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
index 845fc79..98fc1ab 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
@@ -32,6 +32,8 @@
       if ((identical(kind, EOF_TOKEN)) ||
           (identical(value, ';')) ||
           (identical(value, ',')) ||
+          (identical(value, '}')) ||
+          (identical(value, ')')) ||
           (identical(value, ']'))) {
         break;
       }
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
index f74e339..34cac3a 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
@@ -436,8 +436,8 @@
     next = advance();
     if (identical(next, $CLOSE_SQUARE_BRACKET)) {
       Token token = previousToken();
-      if (token is KeywordToken &&
-          identical(token.keyword.syntax, 'operator')) {
+      if (token is KeywordToken && token.keyword.syntax == 'operator' ||
+          token is SymbolToken && token.info == HASH_INFO) {
         return select($EQ, INDEX_EQ_INFO, INDEX_INFO);
       }
     }
diff --git a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
index 76e7ad3..6441ed0 100644
--- a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
+++ b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
@@ -69,7 +69,9 @@
   bool isAborting = false;
   bool enableColors = false;
   bool throwOnError = false;
+  int throwOnErrorCount = 0;
   api.Diagnostic lastKind = null;
+  int fatalCount = 0;
 
   final int FATAL = api.Diagnostic.CRASH.ordinal | api.Diagnostic.ERROR.ordinal;
   final int INFO =
@@ -161,7 +163,7 @@
         throw '$uri: file is null';
       }
     }
-    if (fatal && throwOnError) {
+    if (fatal && ++fatalCount >= throwOnErrorCount && throwOnError) {
       isAborting = true;
       throw new AbortLeg(message);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 6f004fe..08bd51a 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -68,7 +68,7 @@
             registry.registerCompileTimeConstant(constant);
           });
         }
-        if (compiler.tracer.enabled) {
+        if (compiler.tracer.isEnabled) {
           String name;
           if (element.isMember) {
             String className = element.enclosingClass.name;
@@ -1576,10 +1576,12 @@
     }
     assert(argumentIndex == compiledArguments.length);
 
-    elements = compiler.enqueuer.resolution.getCachedElements(function);
+    elements = function.resolvedAst.elements;
     assert(elements != null);
     returnType = signature.type.returnType;
     stack = <HInstruction>[];
+
+    insertTraceCall(function);
   }
 
   void restoreState(AstInliningState state) {
@@ -1712,9 +1714,10 @@
 
       // Build the initializers in the context of the new constructor.
       TreeElements oldElements = elements;
-      elements = compiler.enqueuer.resolution.getCachedElements(callee);
+      ResolvedAst resolvedAst = callee.resolvedAst;
+      elements = resolvedAst.elements;
       ClosureClassMap oldClosureData = localsHandler.closureData;
-      ast.Node node = callee.node;
+      ast.Node node = resolvedAst.node;
       ClosureClassMap newClosureData =
           compiler.closureToClassMapper.computeClosureToClassMapping(
               callee, node, elements);
@@ -2055,9 +2058,9 @@
         bodyCallInputs.add(interceptor);
       }
       bodyCallInputs.add(newObject);
-      TreeElements elements =
-          compiler.enqueuer.resolution.getCachedElements(constructor);
-      ast.Node node = constructor.node;
+      ResolvedAst resolvedAst = constructor.resolvedAst;
+      TreeElements elements = resolvedAst.elements;
+      ast.Node node = resolvedAst.node;
       ClosureClassMap parameterClosureData =
           compiler.closureToClassMapper.getMappingForNestedFunction(node);
 
@@ -2168,6 +2171,21 @@
       // Otherwise it is a lazy initializer which does not have parameters.
       assert(element is VariableElement);
     }
+
+    insertTraceCall(element);
+  }
+
+  insertTraceCall(Element element) {
+    if (JavaScriptBackend.TRACE_CALLS) {
+      if (element == backend.traceHelper) return;
+      n(e) => e == null ? '' : e.name;
+      String name = "${n(element.library)}:${n(element.enclosingClass)}."
+        "${n(element)}";
+      HConstant nameConstant = addConstantString(name);
+      add(new HInvokeStatic(backend.traceHelper,
+                            <HInstruction>[nameConstant],
+                            backend.dynamicType));
+    }
   }
 
   /// Check that [type] is valid in the context of `localsHandler.contextClass`.
@@ -2380,34 +2398,36 @@
 
   /**
    * Ends the loop:
-   * - creates a new block and adds it as successor to the [branchBlock] and
+   * - creates a new block and adds it as successor to the [branchExitBlock] and
    *   any blocks that end in break.
    * - opens the new block (setting as [current]).
    * - notifies the locals handler that we're exiting a loop.
    * [savedLocals] are the locals from the end of the loop condition.
-   * [branchBlock] is the exit (branching) block of the condition.  For the
-   * while and for loops this is at the top of the loop.  For do-while it is
-   * the end of the body.  It is null for degenerate do-while loops that have
+   * [branchExitBlock] is the exit (branching) block of the condition. Generally
+   * this is not the top of the loop, since this would lead to critical edges.
+   * It is null for degenerate do-while loops that have
    * no back edge because they abort (throw/return/break in the body and have
    * no continues).
    */
   void endLoop(HBasicBlock loopEntry,
-               HBasicBlock branchBlock,
+               HBasicBlock branchExitBlock,
                JumpHandler jumpHandler,
                LocalsHandler savedLocals) {
     HBasicBlock loopExitBlock = addNewBlock();
+
     List<LocalsHandler> breakHandlers = <LocalsHandler>[];
     // Collect data for the successors and the phis at each break.
     jumpHandler.forEachBreak((HBreak breakInstruction, LocalsHandler locals) {
       breakInstruction.block.addSuccessor(loopExitBlock);
       breakHandlers.add(locals);
     });
+
     // The exit block is a successor of the loop condition if it is reached.
     // We don't add the successor in the case of a while/for loop that aborts
     // because the caller of endLoop will be wiring up a special empty else
     // block instead.
-    if (branchBlock != null) {
-      branchBlock.addSuccessor(loopExitBlock);
+    if (branchExitBlock != null) {
+      branchExitBlock.addSuccessor(loopExitBlock);
     }
     // Update the phis at the loop entry with the current values of locals.
     localsHandler.endLoop(loopEntry);
@@ -2417,7 +2437,7 @@
 
     // Create a new localsHandler for the loopExitBlock with the correct phis.
     if (!breakHandlers.isEmpty) {
-      if (branchBlock != null) {
+      if (branchExitBlock != null) {
         // Add the values of the locals at the end of the condition block to
         // the phis.  These are the values that flow to the exit if the
         // condition fails.
@@ -2477,10 +2497,10 @@
     if (startBlock == null) startBlock = conditionBlock;
 
     HInstruction conditionInstruction = condition();
-    HBasicBlock conditionExitBlock =
+    HBasicBlock conditionEndBlock =
         close(new HLoopBranch(conditionInstruction));
     SubExpression conditionExpression =
-        new SubExpression(conditionBlock, conditionExitBlock);
+        new SubExpression(conditionBlock, conditionEndBlock);
 
     // Save the values of the local variables at the end of the condition
     // block.  These are the values that will flow to the loop exit if the
@@ -2489,7 +2509,7 @@
 
     // The body.
     HBasicBlock beginBodyBlock = addNewBlock();
-    conditionExitBlock.addSuccessor(beginBodyBlock);
+    conditionEndBlock.addSuccessor(beginBodyBlock);
     open(beginBodyBlock);
 
     localsHandler.enterLoopBody(loop);
@@ -2554,6 +2574,12 @@
       updateEndBlock.addSuccessor(conditionBlock);
       updateGraph = new SubExpression(updateBlock, updateEndBlock);
 
+      // Avoid a critical edge from the condition to the loop-exit body.
+      HBasicBlock conditionExitBlock = addNewBlock();
+      open(conditionExitBlock);
+      close(new HGoto());
+      conditionEndBlock.addSuccessor(conditionExitBlock);
+
       endLoop(conditionBlock, conditionExitBlock, jumpHandler, savedLocals);
 
       conditionBlock.postProcessLoopHeader();
@@ -2595,19 +2621,19 @@
 
       // Remove the [HLoopBranch] instruction and replace it with
       // [HIf].
-      HInstruction condition = conditionExitBlock.last.inputs[0];
-      conditionExitBlock.addAtExit(new HIf(condition));
-      conditionExitBlock.addSuccessor(elseBlock);
-      conditionExitBlock.remove(conditionExitBlock.last);
+      HInstruction condition = conditionEndBlock.last.inputs[0];
+      conditionEndBlock.addAtExit(new HIf(condition));
+      conditionEndBlock.addSuccessor(elseBlock);
+      conditionEndBlock.remove(conditionEndBlock.last);
       HIfBlockInformation info =
           new HIfBlockInformation(
               wrapExpressionGraph(conditionExpression),
               wrapStatementGraph(bodyGraph),
               wrapStatementGraph(elseGraph));
 
-      conditionExitBlock.setBlockFlow(info, current);
-      HIf ifBlock = conditionExitBlock.last;
-      ifBlock.blockInformation = conditionExitBlock.blockFlow;
+      conditionEndBlock.setBlockFlow(info, current);
+      HIf ifBlock = conditionEndBlock.last;
+      ifBlock.blockInformation = conditionEndBlock.blockFlow;
 
       // If the body has any break, attach a synthesized label to the
       // if block.
@@ -2767,7 +2793,13 @@
       conditionExpression =
           new SubExpression(conditionBlock, conditionEndBlock);
 
-      endLoop(loopEntryBlock, conditionEndBlock, jumpHandler, localsHandler);
+      // Avoid a critical edge from the condition to the loop-exit body.
+      HBasicBlock conditionExitBlock = addNewBlock();
+      open(conditionExitBlock);
+      close(new HGoto());
+      conditionEndBlock.addSuccessor(conditionExitBlock);
+
+      endLoop(loopEntryBlock, conditionExitBlock, jumpHandler, localsHandler);
 
       loopEntryBlock.postProcessLoopHeader();
       SubGraph bodyGraph = new SubGraph(loopEntryBlock, bodyExitBlock);
@@ -5845,7 +5877,7 @@
     // directly.
     Selector selector =
         new TypedSelector(expression.instructionType,
-            new Selector.call('toString', null, 0));
+            new Selector.call('toString', null, 0), compiler);
     TypeMask type = TypeMaskFactory.inferredTypeForSelector(selector, compiler);
     if (type.containsOnlyString(compiler)) {
       builder.pushInvokeDynamic(node, selector, <HInstruction>[expression]);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 30a0d9a9..e4848fa 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -772,7 +772,18 @@
             initialization = null;
           }
         }
+
+        // We inserted a basic block to avoid critical edges. This block is
+        // part of the LoopBlockInformation and must therefore be handled here.
+        js.Block oldContainer = currentContainer;
+        js.Block avoidContainer = new js.Block.empty();
+        currentContainer = avoidContainer;
+        assignPhisOfSuccessors(condition.end.successors.last);
+        bool hasPhiUpdates = !avoidContainer.statements.isEmpty;
+        currentContainer = oldContainer;
+
         if (isConditionExpression &&
+            !hasPhiUpdates &&
             info.updates != null && isJSExpression(info.updates)) {
           // If we have an updates graph, and it's expressible as an
           // expression, generate a for-loop.
@@ -828,7 +839,7 @@
           // subgraph.
           // TODO(lrn): Remove this extra labeling when handling all loops
           // using subgraphs.
-          js.Block oldContainer = currentContainer;
+          oldContainer = currentContainer;
           js.Statement body = new js.Block.empty();
           currentContainer = body;
           visitBodyIgnoreLabels(info);
@@ -844,7 +855,7 @@
           js.Expression jsCondition;
           js.Block oldContainer = currentContainer;
           js.Statement body = new js.Block.empty();
-          if (isConditionExpression) {
+          if (isConditionExpression && !hasPhiUpdates) {
             jsCondition = generateExpression(condition);
             currentContainer = body;
           } else {
@@ -853,8 +864,15 @@
             generateStatements(condition);
             use(condition.conditionExpression);
             js.Expression ifTest = new js.Prefix("!", pop());
-            js.Break jsBreak = new js.Break(null);
-            pushStatement(new js.If.noElse(ifTest, jsBreak));
+            js.Statement jsBreak = new js.Break(null);
+            js.Statement exitLoop;
+            if (avoidContainer.statements.isEmpty) {
+              exitLoop = jsBreak;
+            } else {
+              avoidContainer.statements.add(jsBreak);
+              exitLoop = avoidContainer;
+            }
+            pushStatement(new js.If.noElse(ifTest, exitLoop));
           }
           if (info.updates != null) {
             wrapLoopBodyForContinue(info);
@@ -871,7 +889,17 @@
         if (info.initializer != null) {
           generateStatements(info.initializer);
         }
+        // We inserted a basic block to avoid critical edges. This block is
+        // part of the LoopBlockInformation and must therefore be handled here.
         js.Block oldContainer = currentContainer;
+        js.Block exitAvoidContainer = new js.Block.empty();
+        currentContainer = exitAvoidContainer;
+        assignPhisOfSuccessors(condition.end.successors.last);
+        bool hasExitPhiUpdates = !exitAvoidContainer.statements.isEmpty;
+        currentContainer = oldContainer;
+
+
+        oldContainer = currentContainer;
         js.Block body = new js.Block.empty();
         // If there are phi copies in the block that jumps to the
         // loop entry, we must emit the condition like this:
@@ -907,10 +935,18 @@
           // at the end of the loop anyway.
           loop = new js.While(newLiteralBool(true), unwrapStatement(body));
         } else {
-          if (hasPhiUpdates) {
+          if (hasPhiUpdates || hasExitPhiUpdates) {
             updateBody.statements.add(new js.Continue(null));
+            js.Statement jsBreak = new js.Break(null);
+            js.Statement exitLoop;
+            if (exitAvoidContainer.statements.isEmpty) {
+              exitLoop = jsBreak;
+            } else {
+              exitAvoidContainer.statements.add(jsBreak);
+              exitLoop = exitAvoidContainer;
+            }
             body.statements.add(
-                new js.If(jsCondition, updateBody, new js.Break(null)));
+                new js.If(jsCondition, updateBody, exitLoop));
             jsCondition = newLiteralBool(true);
           }
           loop = new js.Do(unwrapStatement(body), jsCondition);
@@ -1542,7 +1578,7 @@
       // invoke dynamic knows more than the receiver.
       ClassElement enclosing = node.element.enclosingClass;
       TypeMask receiverType = new TypeMask.nonNullExact(enclosing.declaration);
-      return new TypedSelector(receiverType, selector);
+      return new TypedSelector(receiverType, selector, compiler);
     }
     // If [JSInvocationMirror._invokeOn] is enabled, and this call
     // might hit a `noSuchMethod`, we register an untyped selector.
@@ -1640,7 +1676,7 @@
         // [world]. The emitter needs to know if it needs to emit a
         // bound closure for a method.
         TypeMask receiverType = new TypeMask.nonNullExact(superClass);
-        selector = new TypedSelector(receiverType, selector);
+        selector = new TypedSelector(receiverType, selector, compiler);
         // TODO(floitsch): we know the target. We shouldn't register a
         // dynamic getter.
         registry.registerDynamicGetter(selector);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
index 9fb3e19..45e542f 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
@@ -107,7 +107,8 @@
     }
     TypeMask receiverType =
         instruction.getDartReceiver(compiler).instructionType;
-    Selector refined = new TypedSelector(receiverType, instruction.selector);
+    Selector refined = new TypedSelector(receiverType, instruction.selector,
+        compiler);
     TypeMask type = TypeMaskFactory.inferredTypeForSelector(refined, compiler);
     return new HIndex(
         instruction.inputs[1], instruction.inputs[2],
@@ -227,12 +228,12 @@
                                      Selector selector,
                                      Compiler compiler) {
     if (selector.name == name) return selector;
-    return new TypedSelector(
-        selector.mask,
-        new Selector(SelectorKind.CALL,
-                     name,
-                     compiler.interceptorsLibrary,
-                     selector.argumentCount));
+    Selector newSelector = new Selector(
+        SelectorKind.CALL, name, compiler.interceptorsLibrary,
+        selector.argumentCount);
+    return selector.mask == null
+        ? newSelector
+        : new TypedSelector(selector.mask, newSelector, compiler);
   }
 }
 
@@ -635,7 +636,7 @@
       return newBuiltinVariant(instruction, compiler);
     }
     Selector selector =
-        new TypedSelector(instructionType, instruction.selector);
+        new TypedSelector(instructionType, instruction.selector, compiler);
     World world = compiler.world;
     JavaScriptBackend backend = compiler.backend;
     Iterable<Element> matches = world.allFunctions.filter(selector);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index e92034c..2201a4a 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -329,7 +329,8 @@
     }
 
     TypeMask receiverType = node.getDartReceiver(compiler).instructionType;
-    Selector selector = new TypedSelector(receiverType, node.selector);
+    Selector selector = new TypedSelector(receiverType, node.selector,
+        compiler);
     Element element = compiler.world.locateSingleElement(selector);
     // TODO(ngeoffray): Also fold if it's a getter or variable.
     if (element != null
@@ -677,7 +678,7 @@
                                                     Selector selector) {
     TypeMask receiverType = receiver.instructionType;
     return compiler.world.locateSingleField(
-        new TypedSelector(receiverType, selector));
+        new TypedSelector(receiverType, selector, compiler));
   }
 
   HInstruction visitFieldGet(HFieldGet node) {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
index 01a82b7..618f223 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
@@ -321,7 +321,8 @@
 
     HInstruction receiver = instruction.getDartReceiver(compiler);
     TypeMask receiverType = receiver.instructionType;
-    Selector selector = new TypedSelector(receiverType, instruction.selector);
+    Selector selector = new TypedSelector(receiverType, instruction.selector,
+        compiler);
     instruction.selector = selector;
 
     // Try to specialize the receiver after this call.
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/validate.dart b/sdk/lib/_internal/compiler/implementation/ssa/validate.dart
index e751b4d..2858204 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/validate.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/validate.dart
@@ -36,7 +36,16 @@
       markInvalid("If node without two successors");
     }
     if (block.last is HConditionalBranch && block.successors.length != 2) {
-      markInvalid("Conditional node without two successors");
+        markInvalid("Conditional node without two successors");
+      }
+    if (block.last is HLoopBranch) {
+      // Assert that the block we inserted to avoid critical edges satisfies
+      // our assumptions. That is, it must not contain any instructions
+      // (although it may contain phi-updates).
+      HBasicBlock avoidCriticalEdgeBlock = block.successors.last;
+      if (avoidCriticalEdgeBlock.first is! HGoto) {
+        markInvalid("Critical edge block contains instructions");
+      }
     }
     if (block.last is HGoto && block.successors.length != 1) {
       markInvalid("Goto node with not exactly one successor");
@@ -67,6 +76,17 @@
         markInvalid("successor with lower id, but not a loop-header");
       }
     }
+    // Make sure we don't have a critical edge.
+    if (isValid && block.successors.length > 1 &&
+        block.last is! HTry && block.last is! HExitTry &&
+        block.last is! HSwitch) {
+      for (HBasicBlock successor in block.successors) {
+        if (!isValid) break;
+        if (successor.predecessors.length >= 2) {
+          markInvalid("SSA graph contains critical edge.");
+        }
+      }
+    }
 
     // Check that the entries in the dominated-list are sorted.
     int lastId = 0;
diff --git a/sdk/lib/_internal/compiler/implementation/string_validator.dart b/sdk/lib/_internal/compiler/implementation/string_validator.dart
index 140134b..d967e44 100644
--- a/sdk/lib/_internal/compiler/implementation/string_validator.dart
+++ b/sdk/lib/_internal/compiler/implementation/string_validator.dart
@@ -36,7 +36,7 @@
   static StringQuoting quotingFromString(String sourceString) {
     Iterator<int> source = sourceString.codeUnits.iterator;
     bool raw = false;
-    int quoteLength = 1;
+    int leftQuoteLength = 1;
     source.moveNext();
     int quoteChar = source.current;
     if (quoteChar == $r) {
@@ -46,27 +46,47 @@
     }
     assert(quoteChar == $SQ || quoteChar == $DQ);
     // String has at least one quote. Check it if has three.
-    // If it only have two, the string must be an empty string literal,
+    // If it only has two, the string must be an empty string literal,
     // and end after the second quote.
     bool multiline = false;
     if (source.moveNext() && source.current == quoteChar && source.moveNext()) {
       int code = source.current;
       assert(code == quoteChar);  // If not, there is a bug in the parser.
-      quoteLength = 3;
-      // Check if a multiline string starts with a newline (CR, LF or CR+LF).
-      if (source.moveNext()) {
+      leftQuoteLength = 3;
+
+      // Check if a multiline string starts with optional whitespace followed by
+      // a newline (CR, LF or CR+LF).
+      // We also accept if the these characters are escaped by a backslash.
+      int newLineLength = 1;
+      while (true) {
+        // Due to string-interpolations we are not guaranteed to see the
+        // trailing quoting characters. The invocations to `moveNext()` may
+        // therefore return false and the `current`-getter return `null`. The
+        // code does not need to handle this specially (as it will not find the
+        // newline characters).
+        source.moveNext();
         code = source.current;
-        if (code == $CR) {
-          quoteLength += 1;
-          if (source.moveNext() && source.current == $LF) {
-            quoteLength += 1;
-          }
-        } else if (code == $LF) {
-          quoteLength += 1;
+        if (code == $BACKSLASH) {
+          newLineLength++;
+          source.moveNext();
+          code = source.current;
         }
+        if (code == $TAB || code == $SPACE) {
+          newLineLength++;
+          continue;
+        }
+        if (code == $CR) {
+          if (source.moveNext() && source.current == $LF) {
+            newLineLength++;
+          }
+          leftQuoteLength += newLineLength;
+        } else if (code == $LF) {
+          leftQuoteLength += newLineLength;
+        }
+        break;
       }
     }
-    return StringQuoting.getQuoting(quoteChar, raw, quoteLength);
+    return StringQuoting.getQuoting(quoteChar, raw, leftQuoteLength);
   }
 
   /**
diff --git a/sdk/lib/_internal/compiler/implementation/tracer.dart b/sdk/lib/_internal/compiler/implementation/tracer.dart
index eef98f1..46efc0f 100644
--- a/sdk/lib/_internal/compiler/implementation/tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/tracer.dart
@@ -15,14 +15,13 @@
 import 'dart2jslib.dart';
 
 /**
- * Set to true to enable tracing.
+ * If non-null, we only trace methods whose name match the regexp defined by the
+ * given pattern.
  */
-const bool GENERATE_TRACE = false;
+const String TRACE_FILTER_PATTERN = const String.fromEnvironment("DUMP_IR");
 
-/**
- * If non-null, we only trace methods whose name contains the given substring.
- */
-const String TRACE_FILTER = null;
+final RegExp TRACE_FILTER =
+    TRACE_FILTER_PATTERN == null ? null : new RegExp(TRACE_FILTER_PATTERN);
 
 /**
  * Dumps the intermediate representation after each phase in a format
@@ -33,20 +32,19 @@
   ItemCompilationContext context;
   bool traceActive = false;
   final EventSink<String> output;
-  final bool enabled = GENERATE_TRACE;
+  final bool isEnabled = TRACE_FILTER != null;
 
   Tracer(api.CompilerOutputProvider outputProvider) :
-    output = GENERATE_TRACE ? outputProvider('dart', 'cfg') : null;
+    output = TRACE_FILTER != null ? outputProvider('dart', 'cfg') : null;
 
   void traceCompilation(String methodName,
                         ItemCompilationContext compilationContext,
                         Compiler compiler) {
-    if (!enabled) return;
+    if (!isEnabled) return;
+    traceActive = TRACE_FILTER.hasMatch(methodName);
+    if (!traceActive) return;
     this.context = compilationContext;
     this.compiler = compiler;
-    traceActive =
-        TRACE_FILTER == null || methodName.contains(TRACE_FILTER);
-    if (!traceActive) return;
     tag("compilation", () {
       printProperty("name", methodName);
       printProperty("method", methodName);
diff --git a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
index 845447f..94897b3 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
@@ -208,6 +208,8 @@
   bool isValidContinueTarget() => false;
   bool isThis() => false;
   bool isSuper() => false;
+
+  bool get isErroneous => false;
 }
 
 class ClassNode extends Node {
@@ -319,12 +321,14 @@
   bool isValidBreakTarget() => true;
 }
 
-/// Errorneous expression that behaves as a literal null.
+/// Erroneous expression that behaves as a literal null.
 class ErrorExpression extends LiteralNull {
   ErrorExpression(token)
       : super(token);
 
   ErrorExpression asErrorExpression() => this;
+
+  bool get isErroneous => true;
 }
 
 /**
@@ -415,10 +419,11 @@
       return null;
     }
     if (!isPostfix && argumentsNode != null) {
-      return argumentsNode.getEndToken();
+      Token token = argumentsNode.getEndToken();
+      if (token != null) return token;
     }
     if (selector != null) return selector.getEndToken();
-    return receiver.getBeginToken();
+    return getBeginToken();
   }
 
   Send copyWithReceiver(Node newReceiver) {
@@ -558,8 +563,11 @@
       Link<Node> link = nodes;
       if (link.isEmpty) return beginToken;
       while (!link.tail.isEmpty) link = link.tail;
-      if (link.head.getEndToken() != null) return link.head.getEndToken();
-      if (link.head.getBeginToken() != null) return link.head.getBeginToken();
+      Node lastNode = link.head;
+      if (lastNode != null) {
+        if (lastNode.getEndToken() != null) return lastNode.getEndToken();
+        if (lastNode.getBeginToken() != null) return lastNode.getBeginToken();
+      }
     }
     return beginToken;
   }
@@ -826,71 +834,54 @@
 
 
 class StringQuoting {
-  static const StringQuoting SINGLELINE_DQ =
-      const StringQuoting($DQ, raw: false, leftQuoteLength: 1);
-  static const StringQuoting RAW_SINGLELINE_DQ =
-      const StringQuoting($DQ, raw: true, leftQuoteLength: 1);
-  static const StringQuoting MULTILINE_DQ =
-      const StringQuoting($DQ, raw: false, leftQuoteLength: 3);
-  static const StringQuoting RAW_MULTILINE_DQ =
-      const StringQuoting($DQ, raw: true, leftQuoteLength: 3);
-  static const StringQuoting MULTILINE_NL_DQ =
-      const StringQuoting($DQ, raw: false, leftQuoteLength: 4);
-  static const StringQuoting RAW_MULTILINE_NL_DQ =
-      const StringQuoting($DQ, raw: true, leftQuoteLength: 4);
-  static const StringQuoting MULTILINE_NL2_DQ =
-      const StringQuoting($DQ, raw: false, leftQuoteLength: 5);
-  static const StringQuoting RAW_MULTILINE_NL2_DQ =
-      const StringQuoting($DQ, raw: true, leftQuoteLength: 5);
-  static const StringQuoting SINGLELINE_SQ =
-      const StringQuoting($SQ, raw: false, leftQuoteLength: 1);
-  static const StringQuoting RAW_SINGLELINE_SQ =
-      const StringQuoting($SQ, raw: true, leftQuoteLength: 1);
-  static const StringQuoting MULTILINE_SQ =
-      const StringQuoting($SQ, raw: false, leftQuoteLength: 3);
-  static const StringQuoting RAW_MULTILINE_SQ =
-      const StringQuoting($SQ, raw: true, leftQuoteLength: 3);
-  static const StringQuoting MULTILINE_NL_SQ =
-      const StringQuoting($SQ, raw: false, leftQuoteLength: 4);
-  static const StringQuoting RAW_MULTILINE_NL_SQ =
-      const StringQuoting($SQ, raw: true, leftQuoteLength: 4);
-  static const StringQuoting MULTILINE_NL2_SQ =
-      const StringQuoting($SQ, raw: false, leftQuoteLength: 5);
-  static const StringQuoting RAW_MULTILINE_NL2_SQ =
-      const StringQuoting($SQ, raw: true, leftQuoteLength: 5);
 
-
-  static const List<StringQuoting> mapping = const <StringQuoting>[
-    SINGLELINE_DQ,
-    RAW_SINGLELINE_DQ,
-    MULTILINE_DQ,
-    RAW_MULTILINE_DQ,
-    MULTILINE_NL_DQ,
-    RAW_MULTILINE_NL_DQ,
-    MULTILINE_NL2_DQ,
-    RAW_MULTILINE_NL2_DQ,
-    SINGLELINE_SQ,
-    RAW_SINGLELINE_SQ,
-    MULTILINE_SQ,
-    RAW_MULTILINE_SQ,
-    MULTILINE_NL_SQ,
-    RAW_MULTILINE_NL_SQ,
-    MULTILINE_NL2_SQ,
-    RAW_MULTILINE_NL2_SQ
+  /// Cache of common quotings.
+  static const List<StringQuoting> _mapping = const <StringQuoting>[
+    const StringQuoting($SQ, raw: false, leftQuoteLength: 1),
+    const StringQuoting($SQ, raw: true, leftQuoteLength: 1),
+    const StringQuoting($DQ, raw: false, leftQuoteLength: 1),
+    const StringQuoting($DQ, raw: true, leftQuoteLength: 1),
+    // No string quotes with 2 characters.
+    null,
+    null,
+    null,
+    null,
+    // Multiline quotings.
+    const StringQuoting($SQ, raw: false, leftQuoteLength: 3),
+    const StringQuoting($SQ, raw: true, leftQuoteLength: 3),
+    const StringQuoting($DQ, raw: false, leftQuoteLength: 3),
+    const StringQuoting($DQ, raw: true, leftQuoteLength: 3),
+    // Leading single whitespace or espaped newline.
+    const StringQuoting($SQ, raw: false, leftQuoteLength: 4),
+    const StringQuoting($SQ, raw: true, leftQuoteLength: 4),
+    const StringQuoting($DQ, raw: false, leftQuoteLength: 4),
+    const StringQuoting($DQ, raw: true, leftQuoteLength: 4),
+    // Other combinations of leading whitespace and/or escaped newline.
+    const StringQuoting($SQ, raw: false, leftQuoteLength: 5),
+    const StringQuoting($SQ, raw: true, leftQuoteLength: 5),
+    const StringQuoting($DQ, raw: false, leftQuoteLength: 5),
+    const StringQuoting($DQ, raw: true, leftQuoteLength: 5),
+    const StringQuoting($SQ, raw: false, leftQuoteLength: 6),
+    const StringQuoting($SQ, raw: true, leftQuoteLength: 6),
+    const StringQuoting($DQ, raw: false, leftQuoteLength: 6),
+    const StringQuoting($DQ, raw: true, leftQuoteLength: 6)
   ];
+
   final bool raw;
   final int leftQuoteCharCount;
   final int quote;
-  const StringQuoting(this.quote, {bool raw, int leftQuoteLength})
-      : this.raw = raw, this.leftQuoteCharCount = leftQuoteLength;
+  const StringQuoting(this.quote, { this.raw, int leftQuoteLength })
+      : this.leftQuoteCharCount = leftQuoteLength;
   String get quoteChar => identical(quote, $DQ) ? '"' : "'";
 
   int get leftQuoteLength => (raw ? 1 : 0) + leftQuoteCharCount;
   int get rightQuoteLength => (leftQuoteCharCount > 2) ? 3 : 1;
-  static StringQuoting getQuoting(int quote, bool raw, int quoteLength) {
-    int index = quoteLength - 1;
-    if (quoteLength > 2) index -= 1;
-    return mapping[(raw ? 1 : 0) + index * 2 + (identical(quote, $SQ) ? 8 : 0)];
+  static StringQuoting getQuoting(int quote, bool raw, int leftQuoteLength) {
+    int quoteKindOffset = (quote == $DQ) ? 2 : 0;
+    int rawOffset = raw ? 1 : 0;
+    int index = (leftQuoteLength - 1) * 4 + rawOffset + quoteKindOffset;
+    if (index < _mapping.length) return _mapping[index];
+    return new StringQuoting(quote, raw: raw, leftQuoteLength: leftQuoteLength);
   }
 }
 
@@ -1003,6 +994,12 @@
 }
 
 class Operator extends Identifier {
+  static const COMPLEX_OPERATORS =
+      const ["--", "++", '+=', "-=", "*=", "/=", "%=", "&=", "|=", "~/=", "^=",
+             ">>=", "<<="];
+
+  static const INCREMENT_OPERATORS = const <String>["++", "--"];
+
   Operator(Token token) : super(token);
 
   Operator asOperator() => this;
@@ -2108,3 +2105,56 @@
       => node.isInterpolation;
 }
 
+/// Erroneous node used to recover from parser errors.  Implements various
+/// interfaces and provides bare minimum of implementation to avoid unnecessary
+/// messages.
+class ErrorNode
+    extends Node
+    implements FunctionExpression, VariableDefinitions, Typedef {
+  final Token token;
+  final String reason;
+  final Identifier name;
+  final NodeList definitions;
+
+  ErrorNode.internal(this.token, this.reason, this.name, this.definitions);
+
+  factory ErrorNode(Token token, String reason) {
+    Identifier name = new Identifier(token);
+    NodeList definitions = new NodeList(
+        null, const Link<Node>().prepend(name), null, null);
+    return new ErrorNode.internal(token, reason, name, definitions);
+  }
+
+  Token get beginToken => token;
+  Token get endToken => token;
+
+  Token getBeginToken() => token;
+
+  Token getEndToken() => token;
+
+  accept(Visitor visitor) {}
+
+  visitChildren(Visitor visitor) {}
+
+  bool get isErroneous => true;
+
+  // FunctionExpression.
+  get parameters => null;
+  get body => null;
+  get returnType => null;
+  get modifiers => Modifiers.EMPTY;
+  get initializers => null;
+  get getOrSet => null;
+  get isRedirectingFactory => false;
+  bool hasBody() => false;
+  bool hasEmptyBody() => false;
+
+  // VariableDefinitions.
+  get metadata => null;
+  get type => null;
+
+  // Typedef.
+  get typeParameters => null;
+  get formals => null;
+  get typedefKeyword => null;
+}
diff --git a/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
index 1a8d651..bf6ac53 100644
--- a/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
@@ -451,11 +451,13 @@
     } else if (isExact) {
       return hasElementIn(self, selector, element, compiler);
     } else if (isSubclass) {
+      assert(compiler.phase > Compiler.PHASE_RESOLVING);
       return hasElementIn(self, selector, element, compiler)
           || other.isSubclassOf(self)
           || compiler.world.hasAnySubclassThatMixes(self, other);
     } else {
       assert(isSubtype);
+      assert(compiler.phase > Compiler.PHASE_RESOLVING);
       bool result = hasElementIn(self, selector, element, compiler)
           || other.implementsInterface(self)
           || compiler.world.hasAnySubclassThatImplements(other, base)
diff --git a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
index 2b0c89c..3b2659cd 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
@@ -68,7 +68,8 @@
     if (noSuchMethods == null) return const FunctionSetQuery(const <Element>[]);
     selector = (selector.mask == null)
         ? compiler.noSuchMethodSelector
-        : new TypedSelector(selector.mask, compiler.noSuchMethodSelector);
+        : new TypedSelector(selector.mask, compiler.noSuchMethodSelector,
+            compiler);
 
     return noSuchMethods.query(selector, compiler, null);
   }
@@ -175,7 +176,7 @@
     if (noSuchMethods != null
         && mask.needsNoSuchMethodHandling(selector, compiler)) {
       FunctionSetQuery noSuchMethodQuery = noSuchMethods.query(
-          new TypedSelector(mask, compiler.noSuchMethodSelector),
+          new TypedSelector(mask, compiler.noSuchMethodSelector, compiler),
           compiler,
           null);
       if (!noSuchMethodQuery.functions.isEmpty) {
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index 89e6d09..d31006f 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -503,7 +503,7 @@
     List<String> namedParameters;
     if (signature.optionalParametersAreNamed) {
       namedParameters =
-          signature.optionalParameters.toList().map((e) => e.name).toList();
+          signature.optionalParameters.mapToList((e) => e.name);
     }
     Selector selector = new Selector.call(callee.name,
                                           caller.library,
@@ -608,7 +608,7 @@
   }
 
   Selector extendIfReachesAll(Compiler compiler) {
-    return new TypedSelector(compiler.typesTask.dynamicType, this);
+    return new TypedSelector(compiler.typesTask.dynamicType, this, compiler);
   }
 
   Selector toCallSelector() => new Selector.callClosureFrom(this);
@@ -634,7 +634,9 @@
   static Map<Selector, Map<TypeMask, TypedSelector>> canonicalizedValues =
       new Map<Selector, Map<TypeMask, TypedSelector>>();
 
-  factory TypedSelector(TypeMask mask, Selector selector) {
+  factory TypedSelector(TypeMask mask, Selector selector, Compiler compiler) {
+    // TODO(johnniwinther): Allow more TypeSelector kinds during resoluton.
+    assert(compiler.phase > Compiler.PHASE_RESOLVING || mask.isExact);
     if (selector.mask == mask) return selector;
     Selector untyped = selector.asUntyped;
     Map<TypeMask, TypedSelector> map = canonicalizedValues.putIfAbsent(untyped,
@@ -647,19 +649,21 @@
     return result;
   }
 
-  factory TypedSelector.exact(ClassElement base, Selector selector)
-      => new TypedSelector(new TypeMask.exact(base), selector);
+  factory TypedSelector.exact(ClassElement base, Selector selector,
+      Compiler compiler)
+      => new TypedSelector(new TypeMask.exact(base), selector, compiler);
 
-  factory TypedSelector.subclass(ClassElement base, Selector selector)
-      => new TypedSelector(new TypeMask.subclass(base), selector);
+  factory TypedSelector.subclass(ClassElement base, Selector selector,
+      Compiler compiler)
+      => new TypedSelector(new TypeMask.subclass(base), selector, compiler);
 
-  factory TypedSelector.subtype(ClassElement base, Selector selector)
-      => new TypedSelector(new TypeMask.subtype(base), selector);
+  factory TypedSelector.subtype(ClassElement base, Selector selector,
+      Compiler compiler)
+      => new TypedSelector(new TypeMask.subtype(base), selector, compiler);
 
   bool appliesUnnamed(Element element, Compiler compiler) {
     assert(sameNameHack(element, compiler));
     // [TypedSelector] are only used after resolution.
-    assert(compiler.phase > Compiler.PHASE_RESOLVING);
     if (!element.isMember) return false;
 
     // A closure can be called through any typed selector:
@@ -679,7 +683,7 @@
     bool canReachAll = compiler.enabledInvokeOn
         && mask.needsNoSuchMethodHandling(this, compiler);
     return canReachAll
-        ? new TypedSelector(compiler.typesTask.dynamicType, this)
+        ? new TypedSelector(compiler.typesTask.dynamicType, this, compiler)
         : this;
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index 16faf1b..071126b 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -67,6 +67,7 @@
   usedByTests();
   useElements(null, null);
   useIr(null, null);
+  useCompiler(null);
 }
 
 useApi() {
@@ -197,13 +198,12 @@
   type_graph_inferrer.TypeGraphInferrer typeGraphInferrer = null;
   source_file_provider.SourceFileProvider sourceFileProvider = null;
   world.hasAnyUserDefinedGetter(null);
-  compiler.importHelperLibrary(null);
   typeGraphInferrer.getCallersOf(null);
   dart_types.Types.sorted(null);
   new dart_types.Types(compiler).copy(compiler);
-  new universe.TypedSelector.subclass(null, null);
-  new universe.TypedSelector.subtype(null, null);
-  new universe.TypedSelector.exact(null, null);
+  new universe.TypedSelector.subclass(null, null, compiler);
+  new universe.TypedSelector.subtype(null, null, compiler);
+  new universe.TypedSelector.exact(null, null, compiler);
   sourceFileProvider.readStringFromUri(null);
 }
 
@@ -232,3 +232,8 @@
     ..hasIr(null)
     ..getIr(null);
 }
+
+useCompiler(dart2jslib.Compiler compiler) {
+  compiler.libraryLoader.reset();
+  compiler.libraryLoader.reuseLibrary(null);
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/util/link.dart b/sdk/lib/_internal/compiler/implementation/util/link.dart
index 44b7f29..8cbd27d 100644
--- a/sdk/lib/_internal/compiler/implementation/util/link.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/link.dart
@@ -53,6 +53,38 @@
     return result;
   }
 
+  /// Lazily maps over this linked list, returning an [Iterable].
+  Iterable map(dynamic fn(T item)) {
+    return new MappedLinkIterable<T,dynamic>(this, fn);
+  }
+
+  /// Invokes `fn` for every item in the linked list and returns the results
+  /// in a [List].
+  List mapToList(dynamic fn(T item), { bool growable: true }) {
+    List result;
+    if (!growable) {
+      result = new List(slowLength());
+    } else {
+      result = new List();
+      result.length = slowLength();
+    }
+    int i = 0;
+    for (Link<T> link = this; !link.isEmpty; link = link.tail) {
+      result[i++] = fn(link.head);
+    }
+    return result;
+  }
+
+  /// Invokes `fn` for every item in the linked list and returns the results
+  /// in a [Set].
+  Set mapToSet(dynamic fn(T item)) {
+    Set result = new Set();
+    for (Link<T> link = this; !link.isEmpty; link = link.tail) {
+      result.add(fn(link.head));
+    }
+    return result;
+  }
+
   bool get isEmpty => true;
 
   Link<T> reverse() => this;
diff --git a/sdk/lib/_internal/compiler/implementation/util/link_implementation.dart b/sdk/lib/_internal/compiler/implementation/util/link_implementation.dart
index 1f85236..da676b8 100644
--- a/sdk/lib/_internal/compiler/implementation/util/link_implementation.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/link_implementation.dart
@@ -23,6 +23,39 @@
   }
 }
 
+typedef T Transformation<S, T>(S input);
+
+class MappedLinkIterator<S, T> extends Iterator<T> {
+  Transformation<S, T> _transformation;
+  Link<S> _link;
+  T _current;
+
+  MappedLinkIterator(this._link, this._transformation);
+
+  T get current => _current;
+
+  bool moveNext() {
+    if (_link.isEmpty) {
+      _current = null;
+      return false;
+    }
+    _current = _transformation(_link.head);
+    _link = _link.tail;
+    return true;
+  }
+}
+
+class MappedLinkIterable<S, T> extends IterableBase<T> {
+  Transformation<S, T> _transformation;
+  Link<S> _link;
+
+  MappedLinkIterable(this._link, this._transformation);
+
+  Iterator<T> get iterator {
+    return new MappedLinkIterator<S,T>(_link, _transformation);
+  }
+}
+
 class LinkEntry<T> extends Link<T> {
   final T head;
   Link<T> tail;
diff --git a/sdk/lib/_internal/compiler/implementation/util/util_implementation.dart b/sdk/lib/_internal/compiler/implementation/util/util_implementation.dart
index bbb852a..c28b63f 100644
--- a/sdk/lib/_internal/compiler/implementation/util/util_implementation.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/util_implementation.dart
@@ -5,5 +5,6 @@
 library util_implementation;
 
 import 'util.dart';
+import 'dart:collection';
 
 part 'link_implementation.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index e1ec24d..37c3e23 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -400,8 +400,9 @@
   static const MessageKind DUPLICATE_SUPER_INITIALIZER = const MessageKind(
       "Cannot have more than one super initializer.");
 
-  static const MessageKind INVALID_ARGUMENTS = const MessageKind(
-      "Arguments do not match the expected parameters of '#{methodName}'.");
+  static const MessageKind INVALID_CONSTRUCTOR_ARGUMENTS = const MessageKind(
+      "Arguments do not match the expected parameters of constructor "
+      "'#{constructorName}'.");
 
   static const MessageKind NO_MATCHING_CONSTRUCTOR = const MessageKind(
       "'super' call arguments and constructor parameters do not match.");
@@ -758,8 +759,10 @@
   static const MessageKind CANNOT_IMPLEMENT = const MessageKind(
       "'#{type}' cannot be implemented.");
 
+  // TODO(johnnwinther): Split messages into reasons for malformedness.
   static const MessageKind CANNOT_EXTEND_MALFORMED = const MessageKind(
-      "A class can't extend a malformed type.",
+      "Class '#{className}' can't extend the type '#{malformedType}' because "
+      "it is malformed.",
       howToFix: "Try correcting the malformed type annotation or removing the "
         "'extends' clause.",
       examples: const ["""
@@ -767,7 +770,8 @@
 main() => new A();"""]);
 
   static const MessageKind CANNOT_IMPLEMENT_MALFORMED = const MessageKind(
-      "A class can't implement a malformed type.",
+      "Class '#{className}' can't implement the type '#{malformedType}' "
+      "because it is malformed.",
       howToFix: "Try correcting the malformed type annotation or removing the "
         "type from the 'implements' clause.",
       examples: const ["""
@@ -775,7 +779,8 @@
 main() => new A();"""]);
 
   static const MessageKind CANNOT_MIXIN_MALFORMED = const MessageKind(
-      "A class can't mixin a malformed type.",
+      "Class '#{className}' can't mixin the type '#{malformedType}' because it "
+      "is malformed.",
       howToFix: "Try correcting the malformed type annotation or removing the "
         "type from the 'with' clause.",
       examples: const ["""
@@ -1832,6 +1837,24 @@
 }
 /*"""]);
 
+  static const MessageKind MISSING_TOKEN_BEFORE_THIS = const MessageKind(
+      "Expected '#{token}' before this.",
+      // Consider the second example below: the parser expects a ')' before
+      // 'y', but a ',' would also have worked. We don't have enough
+      // information to give a good suggestion.
+      howToFix: DONT_KNOW_HOW_TO_FIX,
+      examples: const [
+          "main() => true ? 1;",
+          "main() => foo(x: 1 y: 2);",
+        ]);
+
+  static const MessageKind MISSING_TOKEN_AFTER_THIS = const MessageKind(
+      "Expected '#{token}' after this.",
+      // See [MISSING_TOKEN_BEFORE_THIS], we don't have enough information to
+      // give a good suggestion.
+      howToFix: DONT_KNOW_HOW_TO_FIX,
+      examples: const ["main(x) {x}"]);
+
   static const MessageKind COMPILER_CRASHED = const MessageKind(
       "The compiler crashed when compiling this element.");
 
@@ -2026,7 +2049,7 @@
     if (message == null) {
       message = kind.template;
       arguments.forEach((key, value) {
-        message = message.replaceAll('#{${key}}', value.toString());
+        message = message.replaceAll('#{${key}}', convertToString(value));
       });
       assert(invariant(
           CURRENT_ELEMENT_SPANNABLE,
@@ -2036,7 +2059,7 @@
       if (!terse && kind.hasHowToFix) {
         String howToFix = kind.howToFix;
         arguments.forEach((key, value) {
-          howToFix = howToFix.replaceAll('#{${key}}', value.toString());
+          howToFix = howToFix.replaceAll('#{${key}}', convertToString(value));
         });
         message = '$message\n$howToFix';
       }
@@ -2054,4 +2077,14 @@
   }
 
   int get hashCode => throw new UnsupportedError('Message.hashCode');
+
+  static String convertToString(value) {
+    if (value is ErrorToken) {
+      // Shouldn't happen.
+      return value.assertionMessage;
+    } else if (value is Token) {
+      value = value.value;
+    }
+    return '$value';
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index ae56485..b2e9c9c 100644
--- a/sdk/lib/_internal/compiler/implementation/world.dart
+++ b/sdk/lib/_internal/compiler/implementation/world.dart
@@ -32,6 +32,8 @@
   final Set<Element> functionsThatMightBePassedToApply =
       new Set<FunctionElement>();
 
+  final Set<Element> alreadyPopulated;
+
   Set<ClassElement> subclassesOf(ClassElement cls) {
     return _subclasses[cls.declaration];
   }
@@ -55,10 +57,14 @@
 
   World(Compiler compiler)
       : allFunctions = new FunctionSet(compiler),
-        this.compiler = compiler;
+        this.compiler = compiler,
+        alreadyPopulated = compiler.cacheStrategy.newSet();
 
   void populate() {
     void addSubtypes(ClassElement cls) {
+      if (compiler.hasIncrementalSupport && !alreadyPopulated.add(cls)) {
+        return;
+      }
       assert(cls.isDeclaration);
       if (cls.resolutionState != STATE_DONE) {
         compiler.internalError(cls, 'Class "${cls.name}" is not resolved.');
diff --git a/sdk/lib/_internal/lib/async_patch.dart b/sdk/lib/_internal/lib/async_patch.dart
index c67b3ff..cd5890d 100644
--- a/sdk/lib/_internal/lib/async_patch.dart
+++ b/sdk/lib/_internal/lib/async_patch.dart
@@ -5,6 +5,7 @@
 // Patch file for the dart:async library.
 
 import 'dart:_js_helper' show
+    patch,
     Primitives,
     convertDartClosureToJS,
     loadDeferredLibrary;
@@ -13,26 +14,29 @@
     TimerImpl,
     leaveJsAsync,
     enterJsAsync,
-    isWorker,
-    globalThis;
+    isWorker;
 
 import 'dart:_foreign_helper' show JS;
 
-patch Timer _createTimer(Duration duration, void callback()) {
+@patch
+Timer _createTimer(Duration duration, void callback()) {
   int milliseconds = duration.inMilliseconds;
   if (milliseconds < 0) milliseconds = 0;
   return new TimerImpl(milliseconds, callback);
 }
 
-patch Timer _createPeriodicTimer(Duration duration,
-                                 void callback(Timer timer)) {
+@patch
+Timer _createPeriodicTimer(Duration duration,
+                           void callback(Timer timer)) {
   int milliseconds = duration.inMilliseconds;
   if (milliseconds < 0) milliseconds = 0;
   return new TimerImpl.periodic(milliseconds, callback);
 }
 
-patch class _AsyncRun {
-  patch static void _scheduleImmediate(void callback()) {
+@patch
+class _AsyncRun {
+  @patch
+  static void _scheduleImmediate(void callback()) {
     scheduleImmediateClosure(callback);
   }
 
@@ -41,7 +45,7 @@
       _initializeScheduleImmediate();
 
   static Function _initializeScheduleImmediate() {
-    if (JS('', '#.scheduleImmediate', globalThis) != null) {
+    if (JS('', 'self.scheduleImmediate') != null) {
       return _scheduleImmediateJsOverride;
     }
     // TODO(9002): don't use the Timer to enqueue the immediate callback.
@@ -55,8 +59,7 @@
       callback();
     };
     enterJsAsync();
-    JS('void', '#.scheduleImmediate(#)',
-       globalThis,
+    JS('void', 'self.scheduleImmediate(#)',
        convertDartClosureToJS(internalCallback, 0));
   }
 
@@ -65,8 +68,10 @@
   }
 }
 
-patch class DeferredLibrary {
-  patch Future<Null> load() {
+@patch
+class DeferredLibrary {
+  @patch
+  Future<Null> load() {
     return loadDeferredLibrary(libraryName, uri);
   }
 }
diff --git a/sdk/lib/_internal/lib/collection_patch.dart b/sdk/lib/_internal/lib/collection_patch.dart
index 0c19fdb..78147f8 100644
--- a/sdk/lib/_internal/lib/collection_patch.dart
+++ b/sdk/lib/_internal/lib/collection_patch.dart
@@ -4,12 +4,14 @@
 
 // Patch file for dart:collection classes.
 import 'dart:_foreign_helper' show JS;
-import 'dart:_js_helper' show fillLiteralMap, NoInline;
+import 'dart:_js_helper' show fillLiteralMap, NoInline, patch;
 
-patch class HashMap<K, V> {
-  patch factory HashMap({ bool equals(K key1, K key2),
-                          int hashCode(K key),
-                          bool isValidKey(potentialKey) }) {
+@patch
+class HashMap<K, V> {
+  @patch
+  factory HashMap({ bool equals(K key1, K key2),
+                    int hashCode(K key),
+                    bool isValidKey(potentialKey) }) {
     if (isValidKey == null) {
       if (hashCode == null) {
         if (equals == null) {
@@ -36,7 +38,8 @@
     return new _CustomHashMap<K, V>(equals, hashCode, isValidKey);
   }
 
-  patch factory HashMap.identity() = _IdentityHashMap<K, V>;
+  @patch
+  factory HashMap.identity() = _IdentityHashMap<K, V>;
 }
 
 class _HashMap<K, V> implements HashMap<K, V> {
@@ -478,10 +481,12 @@
   }
 }
 
-patch class LinkedHashMap<K, V> {
-  patch factory LinkedHashMap({ bool equals(K key1, K key2),
-                                int hashCode(K key),
-                                bool isValidKey(potentialKey) }) {
+@patch
+class LinkedHashMap<K, V> {
+  @patch
+  factory LinkedHashMap({ bool equals(K key1, K key2),
+                          int hashCode(K key),
+                          bool isValidKey(potentialKey) }) {
     if (isValidKey == null) {
       if (hashCode == null) {
         if (equals == null) {
@@ -508,7 +513,8 @@
     return new _LinkedCustomHashMap<K, V>(equals, hashCode, isValidKey);
   }
 
-  patch factory LinkedHashMap.identity() = _LinkedIdentityHashMap<K, V>;
+  @patch
+  factory LinkedHashMap.identity() = _LinkedIdentityHashMap<K, V>;
 
   // Private factory constructor called by generated code for map literals.
   @NoInline()
@@ -959,10 +965,12 @@
   }
 }
 
-patch class HashSet<E> {
-  patch factory HashSet({ bool equals(E e1, E e2),
-                          int hashCode(E e),
-                          bool isValidKey(potentialKey) }) {
+@patch
+class HashSet<E> {
+  @patch
+  factory HashSet({ bool equals(E e1, E e2),
+                    int hashCode(E e),
+                    bool isValidKey(potentialKey) }) {
     if (isValidKey == null) {
       if (hashCode == null) {
         if (equals == null) {
@@ -989,7 +997,8 @@
     return new _CustomHashSet<E>(equals, hashCode, isValidKey);
   }
 
-  patch factory HashSet.identity() = _IdentityHashSet<E>;
+  @patch
+  factory HashSet.identity() = _IdentityHashSet<E>;
 }
 
 class _HashSet<E> extends _HashSetBase<E> implements HashSet<E> {
@@ -1361,10 +1370,12 @@
   }
 }
 
-patch class LinkedHashSet<E> {
-  patch factory LinkedHashSet({ bool equals(E e1, E e2),
-                                int hashCode(E e),
-                                bool isValidKey(potentialKey) }) {
+@patch
+class LinkedHashSet<E> {
+  @patch
+  factory LinkedHashSet({ bool equals(E e1, E e2),
+                          int hashCode(E e),
+                          bool isValidKey(potentialKey) }) {
     if (isValidKey == null) {
       if (hashCode == null) {
         if (equals == null) {
@@ -1391,7 +1402,8 @@
     return new _LinkedCustomHashSet<E>(equals, hashCode, isValidKey);
   }
 
-  patch factory LinkedHashSet.identity() = _LinkedIdentityHashSet<E>;
+  @patch
+  factory LinkedHashSet.identity() = _LinkedIdentityHashSet<E>;
 }
 
 class _LinkedHashSet<E> extends _HashSetBase<E> implements LinkedHashSet<E> {
diff --git a/sdk/lib/_internal/lib/convert_patch.dart b/sdk/lib/_internal/lib/convert_patch.dart
index 997db63..3fe44df 100644
--- a/sdk/lib/_internal/lib/convert_patch.dart
+++ b/sdk/lib/_internal/lib/convert_patch.dart
@@ -4,6 +4,7 @@
 
 // Patch file for dart:convert library.
 
+import 'dart:_js_helper' show patch;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show JSExtendableArray;
 
@@ -23,7 +24,8 @@
  *
  * Throws [FormatException] if the input is not valid JSON text.
  */
-patch _parseJson(String source, reviver(key, value)) {
+@patch
+_parseJson(String source, reviver(key, value)) {
   if (source is! String) throw new ArgumentError(source);
 
   var parsed;
@@ -93,7 +95,9 @@
   return revive(null, walk(json));
 }
 
-patch class _Utf8Encoder {
+@patch
+class _Utf8Encoder {
   // Use Uint8List when supported on all platforms.
-  patch static List<int> _createBuffer(int size) => new List<int>(size);
+  @patch
+  static List<int> _createBuffer(int size) => new List<int>(size);
 }
diff --git a/sdk/lib/_internal/lib/core_patch.dart b/sdk/lib/_internal/lib/core_patch.dart
index 926b779..b6f538f 100644
--- a/sdk/lib/_internal/lib/core_patch.dart
+++ b/sdk/lib/_internal/lib/core_patch.dart
@@ -5,7 +5,8 @@
 // Patch file for dart:core classes.
 import "dart:_internal" as _symbol_dev;
 import 'dart:_interceptors';
-import 'dart:_js_helper' show checkNull,
+import 'dart:_js_helper' show patch,
+                              checkNull,
                               getRuntimeType,
                               JSSyntaxRegExp,
                               Primitives,
@@ -23,16 +24,21 @@
   return result;
 }
 
-patch int identityHashCode(Object object) => objectHashCode(object);
+@patch
+int identityHashCode(Object object) => objectHashCode(object);
 
 // Patch for Object implementation.
-patch class Object {
-  patch int get hashCode => Primitives.objectHashCode(this);
+@patch
+class Object {
+  @patch
+  int get hashCode => Primitives.objectHashCode(this);
 
 
-  patch String toString() => Primitives.objectToString(this);
+  @patch
+  String toString() => Primitives.objectToString(this);
 
-  patch dynamic noSuchMethod(Invocation invocation) {
+  @patch
+  dynamic noSuchMethod(Invocation invocation) {
     throw new NoSuchMethodError(
         this,
         invocation.memberName,
@@ -40,14 +46,17 @@
         invocation.namedArguments);
   }
 
-  patch Type get runtimeType => getRuntimeType(this);
+  @patch
+  Type get runtimeType => getRuntimeType(this);
 }
 
 // Patch for Function implementation.
-patch class Function {
-  patch static apply(Function function,
-                     List positionalArguments,
-                     [Map<Symbol, dynamic> namedArguments]) {
+@patch
+class Function {
+  @patch
+  static apply(Function function,
+               List positionalArguments,
+               [Map<Symbol, dynamic> namedArguments]) {
     return Primitives.applyFunction(
         function, positionalArguments, _toMangledNames(namedArguments));
   }
@@ -64,15 +73,19 @@
 }
 
 // Patch for Expando implementation.
-patch class Expando<T> {
-  patch Expando([String name]) : this.name = name;
+@patch
+class Expando<T> {
+  @patch
+  Expando([String name]) : this.name = name;
 
-  patch T operator[](Object object) {
+  @patch
+  T operator[](Object object) {
     var values = Primitives.getProperty(object, _EXPANDO_PROPERTY_NAME);
     return (values == null) ? null : Primitives.getProperty(values, _getKey());
   }
 
-  patch void operator[]=(Object object, T value) {
+  @patch
+  void operator[]=(Object object, T value) {
     var values = Primitives.getProperty(object, _EXPANDO_PROPERTY_NAME);
     if (values == null) {
       values = new Object();
@@ -95,95 +108,124 @@
   static int _keyCount = 0;
 }
 
-patch class int {
-  patch static int parse(String source,
+@patch
+class int {
+  @patch
+  static int parse(String source,
                          { int radix,
                            int onError(String source) }) {
     return Primitives.parseInt(source, radix, onError);
   }
 
-  patch factory int.fromEnvironment(String name, {int defaultValue}) {
+  @patch
+  factory int.fromEnvironment(String name, {int defaultValue}) {
     throw new UnsupportedError(
         'int.fromEnvironment can only be used as a const constructor');
   }
 }
 
-patch class double {
-  patch static double parse(String source,
+@patch
+class double {
+  @patch
+  static double parse(String source,
                             [double onError(String source)]) {
     return Primitives.parseDouble(source, onError);
   }
 }
 
-patch class Error {
-  patch static String _objectToString(Object object) {
+@patch
+class Error {
+  @patch
+  static String _objectToString(Object object) {
     return Primitives.objectToString(object);
   }
 
-  patch StackTrace get stackTrace => Primitives.extractStackTrace(this);
+  @patch
+  StackTrace get stackTrace => Primitives.extractStackTrace(this);
 }
 
 // Patch for DateTime implementation.
-patch class DateTime {
-  patch DateTime._internal(int year,
-                           int month,
-                           int day,
-                           int hour,
-                           int minute,
-                           int second,
-                           int millisecond,
-                           bool isUtc)
+@patch
+class DateTime {
+  @patch
+  DateTime._internal(int year,
+                     int month,
+                     int day,
+                     int hour,
+                     int minute,
+                     int second,
+                     int millisecond,
+                     bool isUtc)
       : this.isUtc = checkNull(isUtc),
         millisecondsSinceEpoch = Primitives.valueFromDecomposedDate(
             year, month, day, hour, minute, second, millisecond, isUtc) {
     Primitives.lazyAsJsDate(this);
   }
 
-  patch DateTime._now()
+  @patch
+  DateTime._now()
       : isUtc = false,
         millisecondsSinceEpoch = Primitives.dateNow() {
     Primitives.lazyAsJsDate(this);
   }
 
-  patch static int _brokenDownDateToMillisecondsSinceEpoch(
+  @patch
+  static int _brokenDownDateToMillisecondsSinceEpoch(
       int year, int month, int day, int hour, int minute, int second,
       int millisecond, bool isUtc) {
     return Primitives.valueFromDecomposedDate(
         year, month, day, hour, minute, second, millisecond, isUtc);
   }
 
-  patch String get timeZoneName {
+  @patch
+  String get timeZoneName {
     if (isUtc) return "UTC";
     return Primitives.getTimeZoneName(this);
   }
 
-  patch Duration get timeZoneOffset {
+  @patch
+  Duration get timeZoneOffset {
     if (isUtc) return new Duration();
     return new Duration(minutes: Primitives.getTimeZoneOffsetInMinutes(this));
   }
 
-  patch int get year => Primitives.getYear(this);
+  @patch
+  int get year => Primitives.getYear(this);
 
-  patch int get month => Primitives.getMonth(this);
+  @patch
+  int get month => Primitives.getMonth(this);
 
-  patch int get day => Primitives.getDay(this);
+  @patch
+  int get day => Primitives.getDay(this);
 
-  patch int get hour => Primitives.getHours(this);
+  @patch
+  int get hour => Primitives.getHours(this);
 
-  patch int get minute => Primitives.getMinutes(this);
+  @patch
+  int get minute => Primitives.getMinutes(this);
 
-  patch int get second => Primitives.getSeconds(this);
+  @patch
+  int get second => Primitives.getSeconds(this);
 
-  patch int get millisecond => Primitives.getMilliseconds(this);
+  @patch
+  int get millisecond => Primitives.getMilliseconds(this);
 
-  patch int get weekday => Primitives.getWeekday(this);
+  @patch
+  int get weekday => Primitives.getWeekday(this);
 }
 
 
 // Patch for Stopwatch implementation.
-patch class Stopwatch {
-  patch static int _frequency() => 1000000;
-  patch static int _now() => Primitives.numMicroseconds();
+@patch
+class Stopwatch {
+  @patch
+  static void _initTicker() {
+    Primitives.initTicker();
+    _frequency = Primitives.timerFrequency;
+  }
+
+  @patch
+  static int _now() => Primitives.timerTicks();
 }
 
 class _ListConstructorSentinel extends JSInt {
@@ -191,15 +233,18 @@
 }
 
 // Patch for List implementation.
-patch class List<E> {
-  patch factory List([int length = const _ListConstructorSentinel()]) {
+@patch
+class List<E> {
+  @patch
+  factory List([int length = const _ListConstructorSentinel()]) {
     if (length == const _ListConstructorSentinel()) {
       return new JSArray<E>.emptyGrowable();
     }
     return new JSArray<E>.fixed(length);
   }
 
-  patch factory List.filled(int length, E fill) {
+  @patch
+  factory List.filled(int length, E fill) {
     List result = new JSArray<E>.fixed(length);
     if (length != 0 && fill != null) {
       for (int i = 0; i < result.length; i++) {
@@ -211,33 +256,41 @@
 }
 
 
-patch class String {
-  patch factory String.fromCharCodes(Iterable<int> charCodes) {
+@patch
+class String {
+  @patch
+  factory String.fromCharCodes(Iterable<int> charCodes) {
     if (charCodes is! JSArray) {
       charCodes = new List.from(charCodes);
     }
     return Primitives.stringFromCharCodes(charCodes);
   }
 
-  patch factory String.fromCharCode(int charCode) {
+  @patch
+  factory String.fromCharCode(int charCode) {
     return Primitives.stringFromCharCode(charCode);
   }
 
-  patch factory String.fromEnvironment(String name, {String defaultValue}) {
+  @patch
+  factory String.fromEnvironment(String name, {String defaultValue}) {
     throw new UnsupportedError(
         'String.fromEnvironment can only be used as a const constructor');
   }
 }
 
-patch class bool {
-  patch factory bool.fromEnvironment(String name, {bool defaultValue: false}) {
+@patch
+class bool {
+  @patch
+  factory bool.fromEnvironment(String name, {bool defaultValue: false}) {
     throw new UnsupportedError(
         'bool.fromEnvironment can only be used as a const constructor');
   }
 }
 
-patch class RegExp {
-  patch factory RegExp(String source,
+@patch
+class RegExp {
+  @patch
+  factory RegExp(String source,
                        {bool multiLine: false,
                         bool caseSensitive: true})
     => new JSSyntaxRegExp(source,
@@ -246,14 +299,17 @@
 }
 
 // Patch for 'identical' function.
-patch bool identical(Object a, Object b) {
+@patch
+bool identical(Object a, Object b) {
   return Primitives.identicalImplementation(a, b);
 }
 
-patch class StringBuffer {
+@patch
+class StringBuffer {
   String _contents = "";
 
-  patch StringBuffer([Object content = ""]) {
+  @patch
+  StringBuffer([Object content = ""]) {
     if (content is String) {
       _contents = content;
     } else {
@@ -261,26 +317,33 @@
     }
   }
 
-  patch int get length => _contents.length;
+  @patch
+  int get length => _contents.length;
 
-  patch void write(Object obj) {
+  @patch
+  void write(Object obj) {
     String str = obj is String ? obj : "$obj";
     _contents = Primitives.stringConcatUnchecked(_contents, str);
   }
 
-  patch void writeCharCode(int charCode) {
+  @patch
+  void writeCharCode(int charCode) {
     write(new String.fromCharCode(charCode));
   }
 
-  patch void clear() {
+  @patch
+  void clear() {
     _contents = "";
   }
 
-  patch String toString() => _contents;
+  @patch
+  String toString() => _contents;
 }
 
-patch class NoSuchMethodError {
-  patch String toString() {
+@patch
+class NoSuchMethodError {
+  @patch
+  String toString() {
     StringBuffer sb = new StringBuffer();
     int i = 0;
     if (_arguments != null) {
@@ -325,10 +388,13 @@
   }
 }
 
-patch class Uri {
-  patch static bool get _isWindows => false;
+@patch
+class Uri {
+  @patch
+  static bool get _isWindows => false;
 
-  patch static Uri get base {
+  @patch
+  static Uri get base {
     String uri = Primitives.currentUri();
     if (uri != null) return Uri.parse(uri);
     throw new UnsupportedError("'Uri.base' is not supported");
diff --git a/sdk/lib/_internal/lib/internal_patch.dart b/sdk/lib/_internal/lib/internal_patch.dart
index 485c895..16afd5f 100644
--- a/sdk/lib/_internal/lib/internal_patch.dart
+++ b/sdk/lib/_internal/lib/internal_patch.dart
@@ -3,19 +3,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:_js_primitives' show printString;
-import 'dart:_js_helper' show JS;
+import 'dart:_js_helper' show JS, patch;
 import 'dart:_interceptors' show JSArray;
 
-patch class Symbol implements core.Symbol {
-  patch const Symbol(String name)
+@patch
+class Symbol implements core.Symbol {
+  @patch
+  const Symbol(String name)
       : this._name = name;
 }
 
-patch void printToConsole(String line) {
+@patch
+void printToConsole(String line) {
   printString('$line');
 }
 
-patch List makeListFixedLength(List growableList) {
+@patch
+List makeListFixedLength(List growableList) {
   JSArray.markFixedList(growableList);
   return growableList;
 }
diff --git a/sdk/lib/_internal/lib/io_patch.dart b/sdk/lib/_internal/lib/io_patch.dart
index 289fcc1..06d642f 100644
--- a/sdk/lib/_internal/lib/io_patch.dart
+++ b/sdk/lib/_internal/lib/io_patch.dart
@@ -2,202 +2,270 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-patch class _Directory {
-  patch static _current() {
+import 'dart:_js_helper' show patch;
+
+@patch
+class _Directory {
+  @patch
+  static _current() {
     throw new UnsupportedError("Directory._current");
   }
-  patch static _setCurrent(path) {
+  @patch
+  static _setCurrent(path) {
     throw new UnsupportedError("Directory_SetCurrent");
   }
-  patch static _createTemp(String path) {
+  @patch
+  static _createTemp(String path) {
     throw new UnsupportedError("Directory._createTemp");
   }
-  patch static String _systemTemp() {
+  @patch
+  static String _systemTemp() {
     throw new UnsupportedError("Directory._systemTemp");
   }
-  patch static _exists(String path) {
+  @patch
+  static _exists(String path) {
     throw new UnsupportedError("Directory._exists");
   }
-  patch static _create(String path) {
+  @patch
+  static _create(String path) {
     throw new UnsupportedError("Directory._create");
   }
-  patch static _deleteNative(String path, bool recursive) {
+  @patch
+  static _deleteNative(String path, bool recursive) {
     throw new UnsupportedError("Directory._deleteNative");
   }
-  patch static _rename(String path, String newPath) {
+  @patch
+  static _rename(String path, String newPath) {
     throw new UnsupportedError("Directory._rename");
   }
-  patch static List _list(String path, bool recursive, bool followLinks) {
+  @patch
+  static List _list(String path, bool recursive, bool followLinks) {
     throw new UnsupportedError("Directory._list");
   }
 }
 
-patch class _EventHandler {
-  patch static void _sendData(Object sender,
+@patch
+class _EventHandler {
+  @patch
+  static void _sendData(Object sender,
                               RawReceivePort receivePort,
                               int data) {
     throw new UnsupportedError("EventHandler._sendData");
   }
 }
 
-patch class FileStat {
-  patch static _statSync(String path) {
+@patch
+class FileStat {
+  @patch
+  static _statSync(String path) {
     throw new UnsupportedError("FileStat.stat");
   }
 }
 
-patch class FileSystemEntity {
-  patch static _getType(String path, bool followLinks) {
+@patch
+class FileSystemEntity {
+  @patch
+  static _getType(String path, bool followLinks) {
     throw new UnsupportedError("FileSystemEntity._getType");
   }
-  patch static _identical(String path1, String path2) {
+  @patch
+  static _identical(String path1, String path2) {
     throw new UnsupportedError("FileSystemEntity._identical");
   }
-  patch static _resolveSymbolicLinks(String path) {
+  @patch
+  static _resolveSymbolicLinks(String path) {
     throw new UnsupportedError("FileSystemEntity._resolveSymbolicLinks");
   }
 }
 
-patch class _File {
-  patch static _exists(String path) {
+@patch
+class _File {
+  @patch
+  static _exists(String path) {
     throw new UnsupportedError("File._exists");
   }
-  patch static _create(String path) {
+  @patch
+  static _create(String path) {
     throw new UnsupportedError("File._create");
   }
-  patch static _createLink(String path, String target) {
+  @patch
+  static _createLink(String path, String target) {
     throw new UnsupportedError("File._createLink");
   }
-  patch static _linkTarget(String path) {
+  @patch
+  static _linkTarget(String path) {
     throw new UnsupportedError("File._linkTarget");
   }
-  patch static _deleteNative(String path) {
+  @patch
+  static _deleteNative(String path) {
     throw new UnsupportedError("File._deleteNative");
   }
-  patch static _deleteLinkNative(String path) {
+  @patch
+  static _deleteLinkNative(String path) {
     throw new UnsupportedError("File._deleteLinkNative");
   }
-  patch static _rename(String oldPath, String newPath) {
+  @patch
+  static _rename(String oldPath, String newPath) {
     throw new UnsupportedError("File._rename");
   }
-  patch static _renameLink(String oldPath, String newPath) {
+  @patch
+  static _renameLink(String oldPath, String newPath) {
     throw new UnsupportedError("File._renameLink");
   }
-  patch static _copy(String oldPath, String newPath) {
+  @patch
+  static _copy(String oldPath, String newPath) {
     throw new UnsupportedError("File._copy");
   }
-  patch static _lengthFromPath(String path) {
+  @patch
+  static _lengthFromPath(String path) {
     throw new UnsupportedError("File._lengthFromPath");
   }
-  patch static _lastModified(String path) {
+  @patch
+  static _lastModified(String path) {
     throw new UnsupportedError("File._lastModified");
   }
-  patch static _open(String path, int mode) {
+  @patch
+  static _open(String path, int mode) {
     throw new UnsupportedError("File._open");
   }
-  patch static int _openStdio(int fd) {
+  @patch
+  static int _openStdio(int fd) {
     throw new UnsupportedError("File._openStdio");
   }
 }
 
-patch class _RandomAccessFile {
-  patch static int _close(int id) {
+@patch
+class _RandomAccessFile {
+  @patch
+  static int _close(int id) {
     throw new UnsupportedError("RandomAccessFile._close");
   }
-  patch static int _getFD(int id) {
+  @patch
+  static int _getFD(int id) {
     throw new UnsupportedError("RandomAccessFile._getFD");
   }
-  patch static _readByte(int id) {
+  @patch
+  static _readByte(int id) {
     throw new UnsupportedError("RandomAccessFile._readByte");
   }
-  patch static _read(int id, int bytes) {
+  @patch
+  static _read(int id, int bytes) {
     throw new UnsupportedError("RandomAccessFile._read");
   }
-  patch static _readInto(int id, List<int> buffer, int start, int end) {
+  @patch
+  static _readInto(int id, List<int> buffer, int start, int end) {
     throw new UnsupportedError("RandomAccessFile._readInto");
   }
-  patch static _writeByte(int id, int value) {
+  @patch
+  static _writeByte(int id, int value) {
     throw new UnsupportedError("RandomAccessFile._writeByte");
   }
-  patch static _writeFrom(int id, List<int> buffer, int start, int end) {
+  @patch
+  static _writeFrom(int id, List<int> buffer, int start, int end) {
     throw new UnsupportedError("RandomAccessFile._writeFrom");
   }
-  patch static _position(int id) {
+  @patch
+  static _position(int id) {
     throw new UnsupportedError("RandomAccessFile._position");
   }
-  patch static _setPosition(int id, int position) {
+  @patch
+  static _setPosition(int id, int position) {
     throw new UnsupportedError("RandomAccessFile._setPosition");
   }
-  patch static _truncate(int id, int length) {
+  @patch
+  static _truncate(int id, int length) {
     throw new UnsupportedError("RandomAccessFile._truncate");
   }
-  patch static _length(int id) {
+  @patch
+  static _length(int id) {
     throw new UnsupportedError("RandomAccessFile._length");
   }
-  patch static _flush(int id) {
+  @patch
+  static _flush(int id) {
     throw new UnsupportedError("RandomAccessFile._flush");
   }
 }
 
-patch class _IOCrypto {
-  patch static Uint8List getRandomBytes(int count) {
+@patch
+class _IOCrypto {
+  @patch
+  static Uint8List getRandomBytes(int count) {
     throw new UnsupportedError("_IOCrypto.getRandomBytes");
   }
 }
 
-patch class _Platform {
-  patch static int _numberOfProcessors() {
+@patch
+class _Platform {
+  @patch
+  static int _numberOfProcessors() {
     throw new UnsupportedError("Platform._numberOfProcessors");
   }
-  patch static String _pathSeparator() {
+  @patch
+  static String _pathSeparator() {
     throw new UnsupportedError("Platform._pathSeparator");
   }
-  patch static String _operatingSystem() {
+  @patch
+  static String _operatingSystem() {
     throw new UnsupportedError("Platform._operatingSystem");
   }
-  patch static _localHostname() {
+  @patch
+  static _localHostname() {
     throw new UnsupportedError("Platform._localHostname");
   }
-  patch static _executable() {
+  @patch
+  static _executable() {
     throw new UnsupportedError("Platform._executable");
   }
-  patch static List<String> _executableArguments() {
+  @patch
+  static List<String> _executableArguments() {
     throw new UnsupportedError("Platform._executableArguments");
   }
-  patch static String _packageRoot() {
+  @patch
+  static String _packageRoot() {
     throw new UnsupportedError("Platform._packageRoot");
   }
-  patch static _environment() {
+  @patch
+  static _environment() {
     throw new UnsupportedError("Platform._environment");
   }
-  patch static String _version() {
+  @patch
+  static String _version() {
     throw new UnsupportedError("Platform._version");
   }
 }
 
-patch class _ProcessUtils {
-  patch static void _exit(int status) {
+@patch
+class _ProcessUtils {
+  @patch
+  static void _exit(int status) {
     throw new UnsupportedError("ProcessUtils._exit");
   }
-  patch static void _setExitCode(int status) {
+  @patch
+  static void _setExitCode(int status) {
     throw new UnsupportedError("ProcessUtils._setExitCode");
   }
-  patch static int _getExitCode() {
+  @patch
+  static int _getExitCode() {
     throw new UnsupportedError("ProcessUtils._getExitCode");
   }
-  patch static void _sleep(int millis) {
+  @patch
+  static void _sleep(int millis) {
     throw new UnsupportedError("ProcessUtils._sleep");
   }
-  patch static int _pid(Process process) {
+  @patch
+  static int _pid(Process process) {
     throw new UnsupportedError("ProcessUtils._pid");
   }
-  patch static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) {
+  @patch
+  static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) {
     throw new UnsupportedError("ProcessUtils._watchSignal");
   }
 }
 
-patch class Process {
-  patch static Future<Process> start(
+@patch
+class Process {
+  @patch
+  static Future<Process> start(
       String executable,
       List<String> arguments,
       {String workingDirectory,
@@ -207,7 +275,8 @@
     throw new UnsupportedError("Process.start");
   }
 
-  patch static Future<ProcessResult> run(
+  @patch
+  static Future<ProcessResult> run(
       String executable,
       List<String> arguments,
       {String workingDirectory,
@@ -219,7 +288,8 @@
     throw new UnsupportedError("Process.run");
   }
 
-  patch static ProcessResult runSync(
+  @patch
+  static ProcessResult runSync(
       String executable,
       List<String> arguments,
       {String workingDirectory,
@@ -232,30 +302,39 @@
   }
 }
 
-patch class InternetAddress {
-  patch static InternetAddress get LOOPBACK_IP_V4 {
+@patch
+class InternetAddress {
+  @patch
+  static InternetAddress get LOOPBACK_IP_V4 {
     throw new UnsupportedError("InternetAddress.LOOPBACK_IP_V4");
   }
-  patch static InternetAddress get LOOPBACK_IP_V6 {
+  @patch
+  static InternetAddress get LOOPBACK_IP_V6 {
     throw new UnsupportedError("InternetAddress.LOOPBACK_IP_V6");
   }
-  patch static InternetAddress get ANY_IP_V4 {
+  @patch
+  static InternetAddress get ANY_IP_V4 {
     throw new UnsupportedError("InternetAddress.ANY_IP_V4");
   }
-  patch static InternetAddress get ANY_IP_V6 {
+  @patch
+  static InternetAddress get ANY_IP_V6 {
     throw new UnsupportedError("InternetAddress.ANY_IP_V6");
   }
-  patch factory InternetAddress(String address) {
+  @patch
+  factory InternetAddress(String address) {
     throw new UnsupportedError("InternetAddress");
   }
-  patch static Future<List<InternetAddress>> lookup(
+  @patch
+  static Future<List<InternetAddress>> lookup(
       String host, {InternetAddressType type: InternetAddressType.ANY}) {
     throw new UnsupportedError("InternetAddress.lookup");
   }
 }
 
-patch class NetworkInterface {
-  patch static Future<List<NetworkInterface>> list({
+@patch
+class NetworkInterface {
+  @patch
+  static Future<List<NetworkInterface>> list({
       bool includeLoopback: false,
       bool includeLinkLocal: false,
       InternetAddressType type: InternetAddressType.ANY}) {
@@ -263,143 +342,185 @@
   }
 }
 
-patch class RawServerSocket {
-  patch static Future<RawServerSocket> bind(address,
-                                            int port,
-                                            {int backlog: 0,
-                                             bool v6Only: false}) {
+@patch
+class RawServerSocket {
+  @patch
+  static Future<RawServerSocket> bind(address,
+                                      int port,
+                                      {int backlog: 0,
+                                       bool v6Only: false}) {
     throw new UnsupportedError("RawServerSocket.bind");
   }
 }
 
-patch class ServerSocket {
-  patch static Future<ServerSocket> bind(address,
-                                         int port,
-                                         {int backlog: 0,
-                                          bool v6Only: false}) {
+@patch
+class ServerSocket {
+  @patch
+  static Future<ServerSocket> bind(address,
+                                   int port,
+                                   {int backlog: 0,
+                                    bool v6Only: false}) {
     throw new UnsupportedError("ServerSocket.bind");
   }
 }
 
-patch class RawSocket {
-  patch static Future<RawSocket> connect(host, int port) {
+@patch
+class RawSocket {
+  @patch
+  static Future<RawSocket> connect(host, int port) {
     throw new UnsupportedError("RawSocket constructor");
   }
 }
 
-patch class Socket {
-  patch static Future<Socket> connect(host, int port) {
+@patch
+class Socket {
+  @patch
+  static Future<Socket> connect(host, int port) {
     throw new UnsupportedError("Socket constructor");
   }
 }
 
-patch class SecureSocket {
-  patch factory SecureSocket._(RawSecureSocket rawSocket) {
+@patch
+class SecureSocket {
+  @patch
+  factory SecureSocket._(RawSecureSocket rawSocket) {
     throw new UnsupportedError("SecureSocket constructor");
   }
 
-  patch static void initialize({String database,
-                                String password,
-                                bool useBuiltinRoots: true}) {
+  @patch
+  static void initialize({String database,
+                          String password,
+                          bool useBuiltinRoots: true}) {
     throw new UnsupportedError("SecureSocket.initialize");
   }
 }
 
-patch class RawDatagramSocket {
-  patch static Future<RawDatagramSocket> bind(
+@patch
+class RawDatagramSocket {
+  @patch
+  static Future<RawDatagramSocket> bind(
       host, int port, {bool reuseAddress: true}) {
     throw new UnsupportedError("RawDatagramSocket.bind");
   }
 }
 
-patch class _SecureFilter {
-  patch factory _SecureFilter() {
+@patch
+class _SecureFilter {
+  @patch
+  factory _SecureFilter() {
     throw new UnsupportedError("_SecureFilter._SecureFilter");
   }
 }
 
-patch class _StdIOUtils {
-  patch static Stdin _getStdioInputStream() {
+@patch
+class _StdIOUtils {
+  @patch
+  static Stdin _getStdioInputStream() {
     throw new UnsupportedError("StdIOUtils._getStdioInputStream");
   }
-  patch static _getStdioOutputStream(int fd) {
+  @patch
+  static _getStdioOutputStream(int fd) {
     throw new UnsupportedError("StdIOUtils._getStdioOutputStream");
   }
-  patch static int _socketType(nativeSocket) {
+  @patch
+  static int _socketType(nativeSocket) {
     throw new UnsupportedError("StdIOUtils._socketType");
   }
-  patch static _getStdioHandleType(int fd) {
+  @patch
+  static _getStdioHandleType(int fd) {
     throw new UnsupportedError("StdIOUtils._getStdioHandleType");
   }
 }
 
-patch class _WindowsCodePageDecoder {
-  patch static String _decodeBytes(List<int> bytes) {
+@patch
+class _WindowsCodePageDecoder {
+  @patch
+  static String _decodeBytes(List<int> bytes) {
     throw new UnsupportedError("_WindowsCodePageDecoder._decodeBytes");
   }
 }
 
-patch class _WindowsCodePageEncoder {
-  patch static List<int> _encodeString(String string) {
+@patch
+class _WindowsCodePageEncoder {
+  @patch
+  static List<int> _encodeString(String string) {
     throw new UnsupportedError("_WindowsCodePageEncoder._encodeString");
   }
 }
 
-patch class _Filter {
-  patch static _Filter newZLibDeflateFilter(bool gzip, int level,
-                                            int windowBits, int memLevel,
-                                            int strategy,
-                                            List<int> dictionary, bool raw) {
+@patch
+class _Filter {
+  @patch
+  static _Filter newZLibDeflateFilter(bool gzip, int level,
+                                      int windowBits, int memLevel,
+                                      int strategy,
+                                      List<int> dictionary, bool raw) {
     throw new UnsupportedError("newZLibDeflateFilter");
   }
-  patch static _Filter newZLibInflateFilter(int windowBits,
-                                            List<int> dictionary, bool raw) {
+  @patch
+  static _Filter newZLibInflateFilter(int windowBits,
+                                      List<int> dictionary, bool raw) {
     throw new UnsupportedError("newZLibInflateFilter");
   }
 }
 
-patch class Stdin {
-  patch int readByteSync() {
+@patch
+class Stdin {
+  @patch
+  int readByteSync() {
     throw new UnsupportedError("Stdin.readByteSync");
   }
-  patch bool get echoMode {
+  @patch
+  bool get echoMode {
     throw new UnsupportedError("Stdin.echoMode");
   }
-  patch void set echoMode(bool enabled) {
+  @patch
+  void set echoMode(bool enabled) {
     throw new UnsupportedError("Stdin.echoMode");
   }
-  patch bool get lineMode {
+  @patch
+  bool get lineMode {
     throw new UnsupportedError("Stdin.lineMode");
   }
-  patch void set lineMode(bool enabled) {
+  @patch
+  void set lineMode(bool enabled) {
     throw new UnsupportedError("Stdin.lineMode");
   }
 }
 
-patch class Stdout {
-  patch bool get hasTerminal {
+@patch
+class Stdout {
+  @patch
+  bool get hasTerminal {
     throw new UnsupportedError("Stdout.hasTerminal");
   }
-  patch int get terminalColumns {
+  @patch
+  int get terminalColumns {
     throw new UnsupportedError("Stdout.terminalColumns");
   }
-  patch int get terminalLines {
+  @patch
+  int get terminalLines {
     throw new UnsupportedError("Stdout.terminalLines");
   }
 }
 
-patch class _FileSystemWatcher {
-  patch static Stream<FileSystemEvent> watch(
+@patch
+class _FileSystemWatcher {
+  @patch
+  static Stream<FileSystemEvent> watch(
       String path, int events, bool recursive) {
     throw new UnsupportedError("_FileSystemWatcher.watch");
   }
-  patch static bool get isSupported {
+  @patch
+  static bool get isSupported {
     throw new UnsupportedError("_FileSystemWatcher.isSupported");
   }
 }
 
-patch class _IOService {
-  patch static Future dispatch(int request, List data) {
+@patch
+class _IOService {
+  @patch
+  static Future dispatch(int request, List data) {
     throw new UnsupportedError("_IOService.dispatch");
   }
 }
diff --git a/sdk/lib/_internal/lib/isolate_helper.dart b/sdk/lib/_internal/lib/isolate_helper.dart
index 06176b2..a81aadf 100644
--- a/sdk/lib/_internal/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/lib/isolate_helper.dart
@@ -228,14 +228,23 @@
         "(function (f, a) { return function (e) { f(a, e); }})(#, #)",
         DART_CLOSURE_TO_JS(IsolateNatives._processWorkerMessage),
         mainManager);
-    JS("void", r"#.onmessage = #", globalThis, function);
-    // We define dartPrint so that the implementation of the Dart
+    JS("void", r"self.onmessage = #", function);
+    // We ensure dartPrint is defined so that the implementation of the Dart
     // print method knows what to call.
-    // TODO(ngeoffray): Should we forward to the main isolate? What if
-    // it exited?
-    JS('void', r'#.dartPrint = function (object) {}', globalThis);
+    JS('', '''self.dartPrint = self.dartPrint || (function(serialize) {
+  return function (object) {
+    if (self.console && self.console.log) {
+      self.console.log(object)
+    } else {
+      self.postMessage(serialize(object));
+    }
+  }
+})(#)''', DART_CLOSURE_TO_JS(_serializePrintMessage));
   }
 
+  static _serializePrintMessage(object) {
+    return _serializeMessage({"command": "print", "msg": object});
+  }
 
   /**
    * Close the worker running this code if all isolates are done and
@@ -403,10 +412,8 @@
         // don't print it.
         return;
       }
-      if (JS('bool', '#.console != null && '
-                     'typeof #.console.error == "function"',
-                     globalThis, globalThis)) {
-        JS('void', '#.console.error(#, #)', globalThis, error, stackTrace);
+      if (JS('bool', 'self.console && self.console.error')) {
+        JS('void', 'self.console.error(#, #)', error, stackTrace);
       } else {
         print(error);
         if (stackTrace != null) print(stackTrace);
@@ -685,11 +692,9 @@
 const String _SPAWNED_SIGNAL = "spawned";
 const String _SPAWN_FAILED_SIGNAL = "spawn failed";
 
-var globalThis = Primitives.computeGlobalThis();
-var globalWindow = JS('', "#.window", globalThis);
-var globalWorker = JS('', "#.Worker", globalThis);
-bool globalPostMessageDefined =
-    JS('', "#.postMessage !== (void 0)", globalThis);
+get globalWindow => JS('', "self.window");
+get globalWorker => JS('', "self.Worker");
+bool get globalPostMessageDefined => JS('bool', "!!self.postMessage");
 
 typedef _MainFunction();
 typedef _MainFunctionArgs(args);
@@ -699,6 +704,15 @@
 /// when 'dart:isolate' has been imported.
 class IsolateNatives {
 
+  // We set [enableSpawnWorker] to true (not null) when calling isolate
+  // primitives that require support for spawning workers. The field starts out
+  // by being null, and dart2js' type inference will track if it can have a
+  // non-null value. So by testing if this value is not null, we generate code
+  // that dart2js knows is dead when worker support isn't needed.
+  // TODO(herhut): Initialize this to false when able to track compile-time
+  // constants.
+  static var enableSpawnWorker;
+
   static String thisScript = computeThisScript();
 
   /// Associates an ID with a native worker object.
@@ -803,14 +817,7 @@
         _globalState.topEventLoop.run();
         break;
       case 'spawn-worker':
-        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]);
-        });
+        if (enableSpawnWorker != null) handleSpawnWorkerRequest(msg);
         break;
       case 'message':
         SendPort port = msg['port'];
@@ -841,6 +848,17 @@
     }
   }
 
+  static handleSpawnWorkerRequest(msg) {
+    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]);
+    });
+  }
+
   /** Log a message, forwarding to the main [_Manager] if appropriate. */
   static _log(msg) {
     if (_globalState.isWorker) {
@@ -856,7 +874,7 @@
   }
 
   static void _consoleLog(msg) {
-    JS("void", r"#.console.log(#)", globalThis, msg);
+    JS("void", r"self.console.log(#)", msg);
   }
 
   static _getJSFunctionFromName(String functionName) {
@@ -880,6 +898,7 @@
   static Future<List> spawnFunction(void topLevelFunction(message),
                                     var message,
                                     bool startPaused) {
+    IsolateNatives.enableSpawnWorker = true;
     final name = _getJSFunctionName(topLevelFunction);
     if (name == null) {
       throw new UnsupportedError(
@@ -892,6 +911,7 @@
 
   static Future<List> spawnUri(Uri uri, List<String> args, var message,
                                bool startPaused) {
+    IsolateNatives.enableSpawnWorker = true;
     bool isLight = false;
     bool isSpawnUri = true;
     return spawn(null, uri.toString(), args, message,
@@ -1697,8 +1717,7 @@
 
       enterJsAsync();
 
-      _handle = JS('int', '#.setTimeout(#, #)',
-                   globalThis,
+      _handle = JS('int', 'self.setTimeout(#, #)',
                    convertDartClosureToJS(internalCallback, 0),
                    milliseconds);
     } else {
@@ -1711,8 +1730,7 @@
       : _once = false {
     if (hasTimer()) {
       enterJsAsync();
-      _handle = JS('int', '#.setInterval(#, #)',
-                   globalThis,
+      _handle = JS('int', 'self.setInterval(#, #)',
                    convertDartClosureToJS(() { callback(this); }, 0),
                    milliseconds);
     } else {
@@ -1728,9 +1746,9 @@
       if (_handle == null) return;
       leaveJsAsync();
       if (_once) {
-        JS('void', '#.clearTimeout(#)', globalThis, _handle);
+        JS('void', 'self.clearTimeout(#)', _handle);
       } else {
-        JS('void', '#.clearInterval(#)', globalThis, _handle);
+        JS('void', 'self.clearInterval(#)', _handle);
       }
       _handle = null;
     } else {
@@ -1741,7 +1759,7 @@
   bool get isActive => _handle != null;
 }
 
-bool hasTimer() => JS('', '#.setTimeout', globalThis) != null;
+bool hasTimer() => JS('', 'self.setTimeout') != null;
 
 
 /**
diff --git a/sdk/lib/_internal/lib/isolate_patch.dart b/sdk/lib/_internal/lib/isolate_patch.dart
index 78a8ca9..dc41e53 100644
--- a/sdk/lib/_internal/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/lib/isolate_patch.dart
@@ -4,6 +4,7 @@
 
 // Patch file for the dart:isolate library.
 
+import 'dart:_js_helper' show patch;
 import 'dart:_isolate_helper' show CapabilityImpl,
                                    CloseToken,
                                    IsolateNatives,
@@ -11,8 +12,10 @@
                                    ReceivePortImpl,
                                    RawReceivePortImpl;
 
-patch class Isolate {
-  patch static Future<Isolate> spawn(void entryPoint(message), var message,
+@patch
+class Isolate {
+  @patch
+  static Future<Isolate> spawn(void entryPoint(message), var message,
                                      { bool paused: false }) {
     try {
       return IsolateNatives.spawnFunction(entryPoint, message, paused)
@@ -24,7 +27,8 @@
     }
   }
 
-  patch static Future<Isolate> spawnUri(
+  @patch
+  static Future<Isolate> spawnUri(
       Uri uri, List<String> args, var message, { bool paused: false }) {
     try {
       if (args is List<String>) {
@@ -45,7 +49,8 @@
     }
   }
 
-  patch void _pause(Capability resumeCapability) {
+  @patch
+  void _pause(Capability resumeCapability) {
     var message = new List(3)
         ..[0] = "pause"
         ..[1] = pauseCapability
@@ -53,14 +58,16 @@
     controlPort.send(message);
   }
 
-  patch void resume(Capability resumeCapability) {
+  @patch
+  void resume(Capability resumeCapability) {
     var message = new List(2)
         ..[0] = "resume"
         ..[1] = resumeCapability;
     controlPort.send(message);
   }
 
-  patch void addOnExitListener(SendPort responsePort) {
+  @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)
@@ -69,14 +76,16 @@
     controlPort.send(message);
   }
 
-  patch void removeOnExitListener(SendPort responsePort) {
+  @patch
+  void removeOnExitListener(SendPort responsePort) {
     var message = new List(2)
         ..[0] = "remove-ondone"
         ..[1] = responsePort;
     controlPort.send(message);
   }
 
-  patch void setErrorsFatal(bool errorsAreFatal) {
+  @patch
+  void setErrorsFatal(bool errorsAreFatal) {
     var message = new List(3)
         ..[0] = "set-errors-fatal"
         ..[1] = terminateCapability
@@ -84,11 +93,13 @@
     controlPort.send(message);
   }
 
-  patch void kill([int priority = BEFORE_NEXT_EVENT]) {
+  @patch
+  void kill([int priority = BEFORE_NEXT_EVENT]) {
     controlPort.send(["kill", terminateCapability, priority]);
   }
 
-  patch void ping(SendPort responsePort, [int pingType = IMMEDIATE]) {
+  @patch
+  void ping(SendPort responsePort, [int pingType = IMMEDIATE]) {
     var message = new List(3)
         ..[0] = "ping"
         ..[1] = responsePort
@@ -96,14 +107,16 @@
     controlPort.send(message);
   }
 
-  patch void addErrorListener(SendPort port) {
+  @patch
+  void addErrorListener(SendPort port) {
     var message = new List(2)
         ..[0] = "getErrors"
         ..[1] = port;
     controlPort.send(message);
   }
 
-  patch void removeErrorListener(SendPort port) {
+  @patch
+  void removeErrorListener(SendPort port) {
     var message = new List(2)
         ..[0] = "stopErrors"
         ..[1] = port;
@@ -112,20 +125,27 @@
 }
 
 /** Default factory for receive ports. */
-patch class ReceivePort {
-  patch factory ReceivePort() = ReceivePortImpl;
+@patch
+class ReceivePort {
+  @patch
+  factory ReceivePort() = ReceivePortImpl;
 
-  patch factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) {
+  @patch
+  factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) {
     return new ReceivePortImpl.fromRawReceivePort(rawPort);
   }
 }
 
-patch class RawReceivePort {
-  patch factory RawReceivePort([void handler(event)]) {
+@patch
+class RawReceivePort {
+  @patch
+  factory RawReceivePort([void handler(event)]) {
     return new RawReceivePortImpl(handler);
   }
 }
 
-patch class Capability {
-  patch factory Capability() = CapabilityImpl;
+@patch
+class Capability {
+  @patch
+  factory Capability() = CapabilityImpl;
 }
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index d820c22..931f2d0 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -58,6 +58,12 @@
 part 'string_helper.dart';
 part 'js_rti.dart';
 
+class _Patch {
+  const _Patch();
+}
+
+const _Patch patch = const _Patch();
+
 bool isJsIndexable(var object, var record) {
   if (record != null) {
     var result = dispatchRecordIndexability(record);
@@ -108,6 +114,19 @@
       "because it is not included in a @MirrorsUsed annotation.");
 }
 
+/// Helper to print the given method information to the console the first
+/// time it is called with it.
+@NoInline()
+void traceHelper(String method) {
+  if (JS('bool', '!this.cache')) {
+    JS('', 'this.cache = Object.create(null)');
+  }
+  if (JS('bool', '!this.cache[#]', method)) {
+    JS('', 'console.log(#)', method);
+    JS('', 'this.cache[#] = true', method);
+  }
+}
+
 class JSInvocationMirror implements Invocation {
   static const METHOD = 0;
   static const GETTER = 1;
@@ -533,8 +552,6 @@
     return JS('int', '#', hash);
   }
 
-  static computeGlobalThis() => JS('', 'function() { return this; }()');
-
   static _throwFormatException(String string) {
     throw new FormatException(string);
   }
@@ -678,17 +695,24 @@
 
   static num dateNow() => JS('num', r'Date.now()');
 
-  static num numMicroseconds() {
-    if (JS('bool', 'typeof window != "undefined" && window !== null')) {
-      var performance = JS('var', 'window.performance');
-      if (performance != null &&
-          JS('bool', 'typeof #.webkitNow == "function"', performance)) {
-        return (1000 * JS('num', '#.webkitNow()', performance)).floor();
-      }
-    }
-    return 1000 * dateNow();
+  static void initTicker() {
+    if (timerFrequency != null) return;
+    // Start with low-resolution. We overwrite the fields if we find better.
+    timerFrequency = 1000;
+    timerTicks = dateNow;
+    if (JS('bool', 'typeof window == "undefined"')) return;
+    var window = JS('var', 'window');
+    if (window == null) return;
+    var performance = JS('var', '#.performance', window);
+    if (performance == null) return;
+    if (JS('bool', 'typeof #.now != "function"', performance)) return;
+    timerFrequency = 1000000;
+    timerTicks = () => (1000 * JS('num', '#.now()', performance)).floor();
   }
 
+  static int timerFrequency;
+  static Function timerTicks;
+
   static bool get isD8 {
     return JS('bool',
               'typeof version == "function"'
@@ -702,30 +726,11 @@
 
   static String currentUri() {
     // In a browser return self.location.href.
-    if (JS('bool', 'typeof self != "undefined"')) {
+    if (JS('bool', '!!self.location')) {
       return JS('String', 'self.location.href');
     }
 
-    // In JavaScript shells try to determine the current working
-    // directory.
-    var workingDirectory;
-    if (isD8) {
-      // TODO(sgjesse): This does not work on Windows.
-      workingDirectory = JS('String', 'os.system("pwd")');
-      var length = workingDirectory.length;
-      if (workingDirectory[length - 1] == '\n') {
-        workingDirectory = workingDirectory.substring(0, length - 1);
-      }
-    }
-
-    if (isJsshell) {
-      // TODO(sgjesse): This does not work on Windows.
-      workingDirectory = JS('String', 'environment["PWD"]');
-    }
-
-    return workingDirectory != null
-        ? "file://" + workingDirectory + "/"
-        : null;
+    return null;
   }
 
   // This is to avoid stack overflows due to very large argument arrays in
@@ -2789,7 +2794,7 @@
   String toString() => "RuntimeError: $message";
 }
 
-class DeferredNotLoadedError extends Error {
+class DeferredNotLoadedError extends Error implements NoSuchMethodError {
   String libraryName;
 
   DeferredNotLoadedError(this.libraryName);
diff --git a/sdk/lib/_internal/lib/math_patch.dart b/sdk/lib/_internal/lib/math_patch.dart
index 2ba47aa..0a43708 100644
--- a/sdk/lib/_internal/lib/math_patch.dart
+++ b/sdk/lib/_internal/lib/math_patch.dart
@@ -4,39 +4,50 @@
 
 // Patch file for dart:math library.
 import 'dart:_foreign_helper' show JS;
-import 'dart:_js_helper' show checkNum;
+import 'dart:_js_helper' show patch, checkNum;
 
-patch double sqrt(num x)
+@patch
+double sqrt(num x)
   => JS('double', r'Math.sqrt(#)', checkNum(x));
 
-patch double sin(num x)
+@patch
+double sin(num x)
   => JS('double', r'Math.sin(#)', checkNum(x));
 
-patch double cos(num x)
+@patch
+double cos(num x)
   => JS('double', r'Math.cos(#)', checkNum(x));
 
-patch double tan(num x)
+@patch
+double tan(num x)
   => JS('double', r'Math.tan(#)', checkNum(x));
 
-patch double acos(num x)
+@patch
+double acos(num x)
   => JS('double', r'Math.acos(#)', checkNum(x));
 
-patch double asin(num x)
+@patch
+double asin(num x)
   => JS('double', r'Math.asin(#)', checkNum(x));
 
-patch double atan(num x)
+@patch
+double atan(num x)
   => JS('double', r'Math.atan(#)', checkNum(x));
 
-patch double atan2(num a, num b)
+@patch
+double atan2(num a, num b)
   => JS('double', r'Math.atan2(#, #)', checkNum(a), checkNum(b));
 
-patch double exp(num x)
+@patch
+double exp(num x)
   => JS('double', r'Math.exp(#)', checkNum(x));
 
-patch double log(num x)
+@patch
+double log(num x)
   => JS('double', r'Math.log(#)', checkNum(x));
 
-patch num pow(num x, num exponent) {
+@patch
+num pow(num x, num exponent) {
   checkNum(x);
   checkNum(exponent);
   return JS('num', r'Math.pow(#, #)', x, exponent);
@@ -44,8 +55,10 @@
 
 const int _POW2_32 = 0x100000000;
 
-patch class Random {
-  patch factory Random([int seed]) =>
+@patch
+class Random {
+  @patch
+  factory Random([int seed]) =>
       (seed == null) ? const _JSRandom() : new _Random(seed);
 }
 
diff --git a/sdk/lib/_internal/lib/mirrors_patch.dart b/sdk/lib/_internal/lib/mirrors_patch.dart
index 5d4a5fa..758b164 100644
--- a/sdk/lib/_internal/lib/mirrors_patch.dart
+++ b/sdk/lib/_internal/lib/mirrors_patch.dart
@@ -4,21 +4,28 @@
 
 // Patch library for dart:mirrors.
 
+import 'dart:_js_helper' show patch;
 import 'dart:_js_mirrors' as js;
 
-patch class MirrorSystem {
-  patch static String getName(Symbol symbol) => js.getName(symbol);
+@patch
+class MirrorSystem {
+  @patch
+  static String getName(Symbol symbol) => js.getName(symbol);
 
-  patch static Symbol getSymbol(String name, [LibraryMirror library]) {
+  @patch
+  static Symbol getSymbol(String name, [LibraryMirror library]) {
     return js.getSymbol(name, library);
   }
 }
 
-patch MirrorSystem currentMirrorSystem() => js.currentJsMirrorSystem;
+@patch
+MirrorSystem currentMirrorSystem() => js.currentJsMirrorSystem;
 
-patch InstanceMirror reflect(Object reflectee) => js.reflect(reflectee);
+@patch
+InstanceMirror reflect(Object reflectee) => js.reflect(reflectee);
 
-patch ClassMirror reflectClass(Type key) {
+@patch
+ClassMirror reflectClass(Type key) {
   if (key is! Type || key == dynamic) {
     throw new ArgumentError('$key does not denote a class');
   }
@@ -29,7 +36,8 @@
   return (tm as ClassMirror).originalDeclaration;
 }
 
-patch TypeMirror reflectType(Type key) {
+@patch
+TypeMirror reflectType(Type key) {
   if (key == dynamic) {
     return currentMirrorSystem().dynamicType;
   }
diff --git a/sdk/lib/_internal/lib/native_helper.dart b/sdk/lib/_internal/lib/native_helper.dart
index 8f96d07..e865d99 100644
--- a/sdk/lib/_internal/lib/native_helper.dart
+++ b/sdk/lib/_internal/lib/native_helper.dart
@@ -463,7 +463,7 @@
     }
   }
   function getUnknownTagGenericBrowser(object, tag) {
-    if (object instanceof HTMLElement) return "HTMLElement";
+    if (self.HTMLElement && object instanceof HTMLElement) return "HTMLElement";
     return getUnknownTag(object, tag);
   }
   function prototypeForTag(tag) {
diff --git a/sdk/lib/_internal/lib/preambles/d8.js b/sdk/lib/_internal/lib/preambles/d8.js
index e965083..aed0161 100644
--- a/sdk/lib/_internal/lib/preambles/d8.js
+++ b/sdk/lib/_internal/lib/preambles/d8.js
@@ -4,14 +4,34 @@
 
 // Javascript preamble, that lets the output of dart2js run on V8's d8 shell.
 
-var setTimeout;
-var clearTimeout;
-var setInterval;
-var clearInterval;
-var dartMainRunner;
-var scheduleImmediate;
+// Node wraps files and provides them with a different `this`. The global
+// `this` can be accessed through `global`.
 
-(function() {
+var self = this;
+if (typeof global != "undefined") self = global;  // Node.js.
+
+(function(self) {
+  // Using strict mode to avoid accidentally defining global variables.
+  "use strict"; // Should be first statement of this function.
+
+  // Location (Uri.base)
+
+  var workingDirectory;
+  // TODO(sgjesse): This does not work on Windows.
+  if (typeof os == "object" && "system" in os) {
+    // V8.
+    workingDirectory = os.system("pwd");
+    var length = workingDirectory.length;
+    if (workingDirectory[length - 1] == '\n') {
+      workingDirectory = workingDirectory.substring(0, length - 1);
+    }
+  } else if (typeof process != "undefined" &&
+             typeof process.cwd == "function") {
+    // Node.js.
+    workingDirectory = process.cwd();
+  }
+  self.location = { href: "file://" + workingDirectory + "/" };
+
   // Event loop.
 
   // Task queue as cyclic list queue.
@@ -247,14 +267,17 @@
     }
   }
 
-  dartMainRunner = function(main, args) {
+  // Global properties. "self" refers to the global object, so adding a
+  // property to "self" defines a global variable.
+  self.dartMainRunner = function(main, args) {
     // Initialize.
     var action = function() { main(args); }
     eventLoop(action);
   };
-  setTimeout = addTimer;
-  clearTimeout = cancelTimer;
-  setInterval = addInterval;
-  clearInterval = cancelTimer;
-  scheduleImmediate = addTask;
-})();
+  self.setTimeout = addTimer;
+  self.clearTimeout = cancelTimer;
+  self.setInterval = addInterval;
+  self.clearInterval = cancelTimer;
+  self.scheduleImmediate = addTask;
+  self.self = self;
+})(self);
diff --git a/sdk/lib/_internal/lib/preambles/jsshell.js b/sdk/lib/_internal/lib/preambles/jsshell.js
index f24555f..8f13bcc 100644
--- a/sdk/lib/_internal/lib/preambles/jsshell.js
+++ b/sdk/lib/_internal/lib/preambles/jsshell.js
@@ -3,3 +3,17 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // Javascript preamble, that lets the output of dart2js run on JSShell.
+
+(function(self) {
+  // Using strict mode to avoid accidentally defining global variables.
+  "use strict"; // Should be first statement of this function.
+
+  // Location (Uri.base)
+
+  var workingDirectory = environment["PWD"];
+  self.location = { href: "file://" + workingDirectory + "/" };
+
+  // Global properties. "self" refers to the global object, so adding a
+  // property to "self" defines a global variable.
+  self.self = self;
+})(this)
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize.dart b/sdk/lib/_internal/pub/asset/dart/serialize.dart
index 43328e1..5e32378 100644
--- a/sdk/lib/_internal/pub/asset/dart/serialize.dart
+++ b/sdk/lib/_internal/pub/asset/dart/serialize.dart
@@ -11,7 +11,9 @@
 import 'package:source_maps/span.dart';
 
 import 'serialize/exception.dart';
+import 'utils.dart';
 
+export 'serialize/aggregate_transform.dart';
 export 'serialize/exception.dart';
 export 'serialize/transform.dart';
 export 'serialize/transformer.dart';
@@ -61,6 +63,60 @@
       location['line'], location['column']);
 }
 
+/// Converts [stream] into a serializable map.
+///
+/// [serializeEvent] is used to serialize each event from the stream.
+Map serializeStream(Stream stream, serializeEvent(event)) {
+  var receivePort = new ReceivePort();
+  var map = {'replyTo': receivePort.sendPort};
+
+  receivePort.first.then((message) {
+    var sendPort = message['replyTo'];
+    stream.listen((event) {
+      sendPort.send({
+        'type': 'event',
+        'value': serializeEvent(event)
+      });
+    }, onError: (error, stackTrace) {
+      sendPort.send({
+        'type': 'error',
+        'error': serializeException(error, stackTrace)
+      });
+    }, onDone: () => sendPort.send({'type': 'done'}));
+  });
+
+  return map;
+}
+
+/// Converts a serializable map into a [Stream].
+///
+/// [deserializeEvent] is used to deserialize each event from the stream.
+Stream deserializeStream(Map stream, deserializeEvent(event)) {
+  return callbackStream(() {
+    var receivePort = new ReceivePort();
+    stream['replyTo'].send({'replyTo': receivePort.sendPort});
+
+    var controller = new StreamController(sync: true);
+    receivePort.listen((event) {
+      switch (event['type']) {
+        case 'event':
+          controller.add(deserializeEvent(event['value']));
+          break;
+        case 'error':
+          var exception = deserializeException(event['error']);
+          controller.addError(exception, exception.stackTrace);
+          break;
+        case 'done':
+          controller.close();
+          receivePort.close();
+          break;
+      }
+    });
+
+    return controller.stream;
+  });
+}
+
 /// Wraps [message] and sends it across [port], then waits for a response which
 /// should be sent using [respond].
 ///
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/aggregate_transform.dart b/sdk/lib/_internal/pub/asset/dart/serialize/aggregate_transform.dart
new file mode 100644
index 0000000..5b7acc8
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/aggregate_transform.dart
@@ -0,0 +1,173 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.asset.serialize.aggregate_transform;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:barback/barback.dart';
+// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
+import 'package:barback/src/internal_asset.dart';
+
+import '../serialize.dart';
+import 'get_input_transform.dart';
+
+/// Serialize the methods shared between [AggregateTransform] and
+/// [DeclaringAggregateTransform].
+///
+/// [additionalFields] contains additional serialized fields to add to the
+/// serialized transform. [methodHandlers] is a set of additional methods. Each
+/// value should take a JSON message and return the response (which may be a
+/// Future).
+Map _serializeBaseAggregateTransform(transform, Map additionalFields,
+    Map<String, Function> methodHandlers) {
+  var receivePort = new ReceivePort();
+  receivePort.listen((wrappedMessage) {
+    respond(wrappedMessage, (message) {
+      var handler = methodHandlers[message['type']];
+      if (handler != null) return handler(message);
+
+      if (message['type'] == 'consumePrimary') {
+        transform.consumePrimary(deserializeId(message['assetId']));
+        return null;
+      }
+
+      assert(message['type'] == 'log');
+      var method = {
+        'Info': transform.logger.info,
+        'Fine': transform.logger.fine,
+        'Warning': transform.logger.warning,
+        'Error': transform.logger.error
+      }[message['level']];
+      assert(method != null);
+
+      var assetId = message['assetId'] == null ? null :
+        deserializeId(message['assetId']);
+      var span = message['span'] == null ? null :
+        deserializeSpan(message['span']);
+      method(message['message'], asset: assetId, span: span);
+    });
+  });
+
+  return {
+    'port': receivePort.sendPort,
+    'key': transform.key,
+    'package': transform.package
+  }..addAll(additionalFields);
+}
+
+/// Converts [transform] into a serializable map.
+Map serializeAggregateTransform(AggregateTransform transform) {
+  return _serializeBaseAggregateTransform(transform, {
+    'primaryInputs': serializeStream(transform.primaryInputs, serializeAsset)
+  }, {
+    'getInput': (message) => transform.getInput(deserializeId(message['id']))
+        .then((asset) => serializeAsset(asset)),
+    'addOutput': (message) =>
+        transform.addOutput(deserializeAsset(message['output']))
+  });
+}
+
+/// Converts [transform] into a serializable map.
+Map serializeDeclaringAggregateTransform(
+    DeclaringAggregateTransform transform) {
+  return _serializeBaseAggregateTransform(transform, {
+    'primaryIds': serializeStream(transform.primaryIds, serializeId)
+  }, {
+    'declareOutput': (message) =>
+        transform.declareOutput(deserializeId(message['output']))
+  });
+}
+
+/// The base class for wrappers for [AggregateTransform]s that are in the host
+/// isolate.
+class _ForeignBaseAggregateTransform {
+  /// The port with which we communicate with the host isolate.
+  ///
+  /// This port and all messages sent across it are specific to this transform.
+  final SendPort _port;
+
+  final String key;
+
+  final String package;
+
+  TransformLogger get logger => _logger;
+  TransformLogger _logger;
+
+  _ForeignBaseAggregateTransform(Map transform)
+      : _port = transform['port'],
+        key = transform['key'],
+        package = transform['package'] {
+    _logger = new TransformLogger((assetId, level, message, span) {
+      call(_port, {
+        'type': 'log',
+        'level': level.name,
+        'message': message,
+        'assetId': assetId == null ? null : serializeId(assetId),
+        'span': span == null ? null : serializeSpan(span)
+      });
+    });
+  }
+
+  void consumePrimary(AssetId id) {
+    call(_port, {'type': 'consumePrimary', 'assetId': serializeId(id)});
+  }
+}
+
+// We can get away with only removing the class declarations in incompatible
+// barback versions because merely referencing undefined types in type
+// annotations isn't a static error. Only implementing an undefined interface is
+// a static error.
+//# if barback >=0.14.1
+
+/// A wrapper for an [AggregateTransform] that's in the host isolate.
+///
+/// This retrieves inputs from and sends outputs and logs to the host isolate.
+class ForeignAggregateTransform extends _ForeignBaseAggregateTransform
+    with GetInputTransform implements AggregateTransform {
+  final Stream<Asset> primaryInputs;
+
+  /// Creates a transform from a serialized map sent from the host isolate.
+  ForeignAggregateTransform(Map transform)
+      : primaryInputs = deserializeStream(
+            transform['primaryInputs'], deserializeAsset),
+        super(transform);
+
+  Future<Asset> getInput(AssetId id) {
+    return call(_port, {
+      'type': 'getInput',
+      'id': serializeId(id)
+    }).then(deserializeAsset);
+  }
+
+  void addOutput(Asset output) {
+    call(_port, {
+      'type': 'addOutput',
+      'output': serializeAsset(output)
+    });
+  }
+}
+
+/// A wrapper for a [DeclaringAggregateTransform] that's in the host isolate.
+class ForeignDeclaringAggregateTransform
+    extends _ForeignBaseAggregateTransform
+    implements DeclaringAggregateTransform {
+  final Stream<AssetId> primaryIds;
+
+  /// Creates a transform from a serializable map sent from the host isolate.
+  ForeignDeclaringAggregateTransform(Map transform)
+      : primaryIds = deserializeStream(
+            transform['primaryIds'], deserializeId),
+        super(transform);
+
+  void declareOutput(AssetId id) {
+    call(_port, {
+      'type': 'declareOutput',
+      'output': serializeId(id)
+    });
+  }
+}
+
+//# end
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/get_input_transform.dart b/sdk/lib/_internal/pub/asset/dart/serialize/get_input_transform.dart
new file mode 100644
index 0000000..9ab6540
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/get_input_transform.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.asset.serialize.get_input_transform;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:barback/barback.dart';
+
+import '../utils.dart';
+
+/// A mixin for transforms that support [getInput] and the associated suite of
+/// methods.
+abstract class GetInputTransform {
+  Future<Asset> getInput(AssetId id);
+
+  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+    return getInput(id).then((input) =>
+        input.readAsString(encoding: encoding));
+  }
+
+  Stream<List<int>> readInput(AssetId id) =>
+      futureStream(getInput(id).then((input) => input.read()));
+
+  Future<bool> hasInput(AssetId id) {
+    return getInput(id).then((_) => true).catchError((error) {
+      if (error is AssetNotFoundException && error.id == id) return false;
+      throw error;
+    });
+  }
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart b/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart
index 38e2ff1..911f6f6 100644
--- a/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart
@@ -6,14 +6,13 @@
 
 import 'dart:async';
 import 'dart:isolate';
-import 'dart:convert';
 
 import 'package:barback/barback.dart';
 // TODO(nweiz): don't import from "src" once issue 14966 is fixed.
 import 'package:barback/src/internal_asset.dart';
 
 import '../serialize.dart';
-import '../utils.dart';
+import 'get_input_transform.dart';
 
 /// Serialize the methods shared between [Transform] and [DeclaringTransform].
 ///
@@ -107,7 +106,8 @@
 /// A wrapper for a [Transform] that's in the host isolate.
 ///
 /// This retrieves inputs from and sends outputs and logs to the host isolate.
-class ForeignTransform extends _ForeignBaseTransform implements Transform {
+class ForeignTransform extends _ForeignBaseTransform
+    with GetInputTransform implements Transform {
   final Asset primaryInput;
 
   /// Creates a transform from a serialized map sent from the host isolate.
@@ -122,21 +122,6 @@
     }).then(deserializeAsset);
   }
 
-  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
-    if (encoding == null) encoding = UTF8;
-    return getInput(id).then((input) => input.readAsString(encoding: encoding));
-  }
-
-  Stream<List<int>> readInput(AssetId id) =>
-      futureStream(getInput(id).then((input) => input.read()));
-
-  Future<bool> hasInput(AssetId id) {
-    return getInput(id).then((_) => true).catchError((error) {
-      if (error is AssetNotFoundException && error.id == id) return false;
-      throw error;
-    });
-  }
-
   void addOutput(Asset output) {
     call(_port, {
       'type': 'addOutput',
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
index 901a079..0e4d0c4 100644
--- a/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
@@ -52,23 +52,71 @@
   };
 }
 
+/// Converts [transformer] into a serializable map.
+Map _serializeAggregateTransformer(AggregateTransformer transformer) {
+  var port = new ReceivePort();
+  port.listen((wrappedMessage) {
+    respond(wrappedMessage, (message) {
+      if (message['type'] == 'classifyPrimary') {
+        return transformer.classifyPrimary(deserializeId(message['id']));
+      } else if (message['type'] == 'declareOutputs') {
+        return new Future.sync(() {
+          return (transformer as DeclaringAggregateTransformer).declareOutputs(
+              new ForeignDeclaringAggregateTransform(message['transform']));
+        }).then((_) => null);
+      } else {
+        assert(message['type'] == 'apply');
+
+        // Make sure we return null so that if the transformer's [apply] returns
+        // a non-serializable value it doesn't cause problems.
+        return new Future.sync(() {
+          return transformer.apply(
+              new ForeignAggregateTransform(message['transform']));
+        }).then((_) => null);
+      }
+    });
+  });
+
+  var type;
+  if (transformer is LazyAggregateTransformer) {
+    type = 'LazyAggregateTransformer';
+  } else if (transformer is DeclaringAggregateTransformer) {
+    type = 'DeclaringAggregateTransformer';
+  } else {
+    type = 'AggregateTransformer';
+  }
+
+  return {
+    'type': type,
+    'toString': transformer.toString(),
+    'port': port.sendPort
+  };
+}
+
 // Converts [group] into a serializable map.
 Map _serializeTransformerGroup(TransformerGroup group) {
   return {
     'type': 'TransformerGroup',
     'toString': group.toString(),
     'phases': group.phases.map((phase) {
-      return phase.map(serializeTransformerOrGroup).toList();
+      return phase.map(serializeTransformerLike).toList();
     }).toList()
   };
 }
 
-/// Converts [transformerOrGroup] into a serializable map.
-Map serializeTransformerOrGroup(transformerOrGroup) {
-  if (transformerOrGroup is Transformer) {
-    return _serializeTransformer(transformerOrGroup);
+/// Converts [transformerLike] into a serializable map.
+///
+/// [transformerLike] can be a [Transformer], an [AggregateTransformer], or a
+/// [TransformerGroup].
+Map serializeTransformerLike(transformerLike) {
+  if (transformerLike is Transformer) {
+    return _serializeTransformer(transformerLike);
+  } else if (transformerLike is TransformerGroup) {
+    return _serializeTransformerGroup(transformerLike);
   } else {
-    assert(transformerOrGroup is TransformerGroup);
-    return _serializeTransformerGroup(transformerOrGroup);
+    // This has to be last, since "transformerLike is AggregateTransformer" will
+    // throw on older versions of barback.
+    assert(transformerLike is AggregateTransformer);
+    return _serializeAggregateTransformer(transformerLike);
   }
 }
diff --git a/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
index 3b66841..a3d6a71 100644
--- a/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
+++ b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
@@ -16,13 +16,15 @@
 void loadTransformers(SendPort replyTo) {
   var port = new ReceivePort();
   replyTo.send(port.sendPort);
-  port.first.then((wrappedMessage) {
+  port.listen((wrappedMessage) {
+    // TODO(nweiz): When issue 19228 is fixed, spin up a separate isolate for
+    // libraries loaded beyond the first so they can run in parallel.
     respond(wrappedMessage, (message) {
       var library = Uri.parse(message['library']);
       var configuration = JSON.decode(message['configuration']);
       var mode = new BarbackMode(message['mode']);
       return _initialize(library, configuration, mode).
-          map(serializeTransformerOrGroup).toList();
+          map(serializeTransformerLike).toList();
     });
   });
 }
@@ -34,6 +36,7 @@
 List _initialize(Uri uri, Map configuration, BarbackMode mode) {
   var mirrors = currentMirrorSystem();
   var transformerClass = reflectClass(Transformer);
+  var aggregateClass = _aggregateTransformerClass;
   var groupClass = reflectClass(TransformerGroup);
 
   var seen = new Set();
@@ -57,7 +60,9 @@
       if (classMirror.isPrivate) return null;
       if (classMirror.isAbstract) return null;
       if (!classMirror.isSubtypeOf(transformerClass) &&
-          !classMirror.isSubtypeOf(groupClass)) {
+          !classMirror.isSubtypeOf(groupClass) &&
+          (aggregateClass == null ||
+              !classMirror.isSubtypeOf(aggregateClass))) {
         return null;
       }
 
@@ -86,3 +91,13 @@
   if (candidate is MethodMirror && candidate.isConstructor) return candidate;
   return null;
 }
+
+// Older barbacks don't support [AggregateTransformer], and calling
+// [reflectClass] on an undefined class will throw an error, so we just define a
+// null getter for them.
+//# if barback >=0.14.1
+ClassMirror get _aggregateTransformerClass =>
+    reflectClass(AggregateTransformer);
+//# else
+//>   ClassMirror get _aggregateTransformerClass => null;
+//# end
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index 496a35b..7c59427 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -8,9 +8,11 @@
 import 'package:args/args.dart';
 import 'package:http/http.dart' as http;
 import 'package:path/path.dart' as path;
+import 'package:source_maps/source_maps.dart';
 import 'package:stack_trace/stack_trace.dart';
 
 import '../lib/src/command.dart';
+import '../lib/src/exceptions.dart';
 import '../lib/src/exit_codes.dart' as exit_codes;
 import '../lib/src/http.dart';
 import '../lib/src/io.dart';
@@ -45,16 +47,14 @@
   }
 
   switch (options['verbosity']) {
-    case 'normal': log.showNormal(); break;
-    case 'io':     log.showIO(); break;
-    case 'solver': log.showSolver(); break;
-    case 'all':    log.showAll(); break;
+    case 'normal': log.verbosity = log.Verbosity.NORMAL; break;
+    case 'io':     log.verbosity = log.Verbosity.IO; break;
+    case 'solver': log.verbosity = log.Verbosity.SOLVER; break;
+    case 'all':    log.verbosity = log.Verbosity.ALL; break;
     default:
       // No specific verbosity given, so check for the shortcut.
       if (options['verbose']) {
-        log.showAll();
-      } else {
-        log.showNormal();
+        log.verbosity = log.Verbosity.ALL;
       }
       break;
   }
@@ -88,8 +88,11 @@
       captureStackChains: captureStackChains).catchError((error, Chain chain) {
     // This is basically the top-level exception handler so that we don't
     // spew a stack trace on our users.
-    var message = getErrorMessage(error);
-    log.error(message);
+    if (error is SpanException) {
+      log.error(error.toString(useColors: canUseSpecialChars));
+    } else {
+      log.error(getErrorMessage(error));
+    }
     log.fine("Exception type: ${error.runtimeType}");
 
     if (log.json.enabled) {
@@ -107,9 +110,9 @@
       log.fine(chain.terse);
     }
 
-    if (error is ApplicationException && error.innerError != null) {
+    if (error is WrappedException && error.innerError != null) {
       var message = "Wrapped exception: ${error.innerError}";
-      if (error.innerTrace != null) message = "$message\n${error.innerTrace}";
+      if (error.innerChain != null) message = "$message\n${error.innerChain}";
       log.fine(message);
     }
 
@@ -201,8 +204,10 @@
   });
 }
 
-/// Checks that pub is running on a supported platform. If it isn't, it prints
-/// an error message and exits. Completes when the validation is done.
+/// Checks that pub is running on a supported platform.
+///
+/// If it isn't, it prints an error message and exits. Completes when the
+/// validation is done.
 Future validatePlatform() {
   return syncFuture(() {
     if (Platform.operatingSystem != 'windows') return null;
diff --git a/sdk/lib/_internal/pub/lib/src/barback.dart b/sdk/lib/_internal/pub/lib/src/barback.dart
index d0f11f7..7ad499f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback.dart
@@ -4,12 +4,9 @@
 
 library pub.barback;
 
-import 'dart:async';
-
 import 'package:barback/barback.dart';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 
-import 'utils.dart';
 import 'version.dart';
 
 /// The currently supported versions of the Barback package that this version of
@@ -34,166 +31,7 @@
 /// constraint and barback's version.
 ///
 /// [compat]: https://gist.github.com/nex3/10942218
-final supportedVersions = new VersionConstraint.parse(">=0.13.0 <0.14.1");
-
-/// A list of the names of all built-in transformers that pub exposes.
-const _BUILT_IN_TRANSFORMERS = const ['\$dart2js'];
-
-/// An identifier for a transformer and the configuration that will be passed to
-/// it.
-///
-/// It's possible that the library identified by [this] defines multiple
-/// transformers. If so, [configuration] will be passed to all of them.
-class TransformerId {
-  /// The package containing the library where the transformer is defined.
-  final String package;
-
-  /// The `/`-separated path to the library that contains this transformer.
-  ///
-  /// This is relative to the `lib/` directory in [package], and doesn't end in
-  /// `.dart`.
-  ///
-  /// This can be null; if so, it indicates that the transformer(s) should be
-  /// loaded from `lib/transformer.dart` if that exists, and `lib/$package.dart`
-  /// otherwise.
-  final String path;
-
-  /// The configuration to pass to the transformer.
-  ///
-  /// Any pub-specific configuration (i.e. keys starting with "$") will have
-  /// been stripped out of this and handled separately. This will be an empty
-  /// map if no configuration was provided.
-  final Map configuration;
-
-  /// The primary input inclusions.
-  ///
-  /// Each inclusion is an asset path. If this set is non-empty, than *only*
-  /// matching assets are allowed as a primary input by this transformer. If
-  /// `null`, all assets are included.
-  ///
-  /// This is processed before [excludes]. If a transformer has both includes
-  /// and excludes, then the set of included assets is determined and assets
-  /// are excluded from that resulting set.
-  final Set<String> includes;
-
-  /// The primary input exclusions.
-  ///
-  /// Any asset whose pach is in this is not allowed as a primary input by
-  /// this transformer.
-  ///
-  /// This is processed after [includes]. If a transformer has both includes
-  /// and excludes, then the set of included assets is determined and assets
-  /// are excluded from that resulting set.
-  final Set<String> excludes;
-
-  /// Whether this ID points to a built-in transformer exposed by pub.
-  bool get isBuiltInTransformer => package.startsWith('\$');
-
-  /// Parses a transformer identifier.
-  ///
-  /// A transformer identifier is a string of the form "package_name" or
-  /// "package_name/path/to/library". It does not have a trailing extension. If
-  /// it just has a package name, it expands to lib/transformer.dart if that
-  /// exists, or lib/${package}.dart otherwise. Otherwise, it expands to
-  /// lib/${path}.dart. In either case it's located in the given package.
-  factory TransformerId.parse(String identifier, Map configuration) {
-    if (identifier.isEmpty) {
-      throw new FormatException('Invalid library identifier: "".');
-    }
-
-    var parts = split1(identifier, "/");
-    if (parts.length == 1) {
-      return new TransformerId(parts.single, null, configuration);
-    }
-
-    return new TransformerId(parts.first, parts.last, configuration);
-  }
-
-  factory TransformerId(String package, String path, Map configuration) {
-    parseField(key) {
-      if (!configuration.containsKey(key)) return null;
-      var field = configuration.remove(key);
-
-      if (field is String) return new Set<String>.from([field]);
-
-      if (field is List) {
-        var nonstrings = field
-            .where((element) => element is! String)
-            .map((element) => '"$element"');
-
-        if (nonstrings.isNotEmpty) {
-          throw new FormatException(
-              '"$key" list field may only contain strings, but contained '
-              '${toSentence(nonstrings)}.');
-        }
-
-        return new Set<String>.from(field);
-      } else {
-        throw new FormatException(
-            '"$key" field must be a string or list, but was "$field".');
-      }
-    }
-
-    var includes = null;
-    var excludes = null;
-
-    if (configuration == null) {
-      configuration = {};
-    } else {
-      // Don't write to the immutable YAML map.
-      configuration = new Map.from(configuration);
-
-      // Pull out the exclusions/inclusions.
-      includes = parseField("\$include");
-      excludes = parseField("\$exclude");
-
-      // All other keys starting with "$" are unexpected.
-      var reservedKeys = configuration.keys
-          .where((key) => key is String && key.startsWith(r'$'))
-          .map((key) => '"$key"');
-
-      if (reservedKeys.isNotEmpty) {
-        throw new FormatException(
-            'Unknown reserved ${pluralize('field', reservedKeys.length)} '
-            '${toSentence(reservedKeys)}.');
-      }
-    }
-
-    return new TransformerId._(package, path, configuration,
-        includes, excludes);
-  }
-
-  TransformerId._(this.package, this.path, this.configuration,
-      this.includes, this.excludes) {
-    if (!package.startsWith('\$')) return;
-    if (_BUILT_IN_TRANSFORMERS.contains(package)) return;
-    throw new FormatException('Unsupported built-in transformer $package.');
-  }
-
-  // TODO(nweiz): support deep equality on [configuration] as well.
-  bool operator==(other) => other is TransformerId &&
-      other.package == package &&
-      other.path == path &&
-      other.configuration == configuration;
-
-  int get hashCode => package.hashCode ^ path.hashCode ^ configuration.hashCode;
-
-  String toString() => path == null ? package : '$package/$path';
-
-  /// Returns the asset id for the library identified by this transformer id.
-  ///
-  /// If `path` is null, this will determine which library to load.
-  Future<AssetId> getAssetId(Barback barback) {
-    if (path != null) {
-      return new Future.value(new AssetId(package, 'lib/$path.dart'));
-    }
-
-    var transformerAsset = new AssetId(package, 'lib/transformer.dart');
-    return barback.getAssetById(transformerAsset).then((_) => transformerAsset)
-        .catchError((e) => new AssetId(package, 'lib/$package.dart'),
-            test: (e) => e is AssetNotFoundException);
-  }
-}
+final supportedVersions = new VersionConstraint.parse(">=0.13.0 <0.14.2");
 
 /// Converts [id] to a "package:" URI.
 ///
@@ -204,7 +42,8 @@
     throw new ArgumentError("Asset id $id doesn't identify a library.");
   }
 
-  return new Uri(scheme: 'package', path: id.path.replaceFirst('lib/', ''));
+  return new Uri(scheme: 'package',
+      path: p.url.join(id.package, id.path.replaceFirst('lib/', '')));
 }
 
 /// Converts [uri] into an [AssetId] if its path is within "packages".
@@ -214,7 +53,7 @@
 ///
 /// If the URI doesn't contain one of those special directories, returns null.
 AssetId packagesUrlToId(Uri url) {
-  var parts = path.url.split(url.path);
+  var parts = p.url.split(url.path);
 
   // Strip the leading "/" from the URL.
   if (parts.isNotEmpty && parts.first == "/") parts = parts.skip(1).toList();
@@ -236,6 +75,6 @@
   }
 
   var package = parts[index + 1];
-  var assetPath = path.url.join("lib", path.url.joinAll(parts.skip(index + 2)));
+  var assetPath = p.url.join("lib", p.url.joinAll(parts.skip(index + 2)));
   return new AssetId(package, assetPath);
 }
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 80603b1..c6fd86f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart
@@ -12,6 +12,7 @@
 import 'package:shelf_web_socket/shelf_web_socket.dart';
 import 'package:stack_trace/stack_trace.dart';
 
+import '../io.dart';
 import '../log.dart' as log;
 import 'asset_environment.dart';
 import 'base_server.dart';
@@ -29,7 +30,7 @@
   /// Creates a new server and binds it to [port] of [host].
   static Future<AdminServer> bind(AssetEnvironment environment,
       String host, int port) {
-    return Chain.track(HttpServer.bind(host, port)).then((server) {
+    return Chain.track(bindServer(host, port)).then((server) {
       log.fine('Bound admin server to $host:$port.');
       return new AdminServer._(environment, server);
     });
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 04acfa4..7bc57e6 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
@@ -9,7 +9,6 @@
 
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
-import 'package:stack_trace/stack_trace.dart';
 import 'package:watcher/watcher.dart';
 
 import '../entrypoint.dart';
@@ -39,17 +38,15 @@
   /// Creates a new build environment for working with the assets used by
   /// [entrypoint] and its dependencies.
   ///
-  /// Spawns an HTTP server for each directory in [rootDirectories]. These
-  /// servers will be on [hostname] and have ports based on [basePort].
-  /// [basePort] itself is reserved for "web/" and `basePort + 1` is reserved
-  /// for "test/"; further ports will be allocated for other root directories as
-  /// necessary. If [basePort] is zero, each server will have an ephemeral port.
+  /// HTTP servers that serve directories from this environment will be bound
+  /// to [hostname] and have ports based on [basePort]. If omitted, they
+  /// default to "localhost" and "0" (use ephemeral ports), respectively.
   ///
   /// Loads all used transformers using [mode] (including dart2js if
   /// [useDart2JS] is true).
   ///
-  /// Includes [rootDirectories] in the root package, as well as "lib" and
-  /// "asset".
+  /// This will only add the root package's "lib" directory to the environment.
+  /// Other directories can be added to the environment using [serveDirectory].
   ///
   /// If [watcherType] is not [WatcherType.NONE], watches source assets for
   /// modification.
@@ -57,8 +54,11 @@
   /// Returns a [Future] that completes to the environment once the inputs,
   /// transformers, and server are loaded and ready.
   static Future<AssetEnvironment> create(Entrypoint entrypoint,
-      String hostname, int basePort, BarbackMode mode, WatcherType watcherType,
-      {bool useDart2JS: true}) {
+      BarbackMode mode, WatcherType watcherType,
+      {String hostname, int basePort, bool useDart2JS: true}) {
+    if (hostname == null) hostname = "localhost";
+    if (basePort == null) basePort = 0;
+
     return entrypoint.loadPackageGraph().then((graph) {
       log.fine("Loaded package graph.");
       var barback = new Barback(new PubPackageProvider(graph));
@@ -204,6 +204,20 @@
     });
   }
 
+  /// Binds a new port to serve assets from within the "bin" directory of
+  /// [package].
+  ///
+  /// Adds the sources within that directory and then binds a server to it.
+  /// Unlike [serveDirectory], this works with packages that are not the
+  /// entrypoint.
+  ///
+  /// Returns a [Future] that completes to the bound server.
+  Future<BarbackServer> servePackageBinDirectory(String package) {
+    return _provideDirectorySources(graph.packages[package], "bin").then(
+        (_) => BarbackServer.bind(this, _hostname, 0, package: package,
+            rootDirectory: "bin"));
+  }
+
   /// Stops the server bound to [rootDirectory].
   ///
   /// Also removes any source files within that directory from barback. Returns
@@ -216,9 +230,10 @@
 
     return directory.server.then((server) {
       var url = server.url;
-      return directory.close()
-          .then((_) => _removeDirectorySources(rootDirectory))
-          .then((_) => url);
+      return directory.close().then((_) {
+        _removeDirectorySources(rootDirectory);
+        return url;
+      });
     });
   }
 
@@ -302,10 +317,11 @@
   Future<AssetId> getAssetIdForUrl(Uri url) {
     return Future.wait(_directories.values.map((dir) => dir.server))
         .then((servers) {
-      var server = servers.firstWhere(
-          (server) => server.address.host == url.host &&
-              server.port == url.port,
-          orElse: () => null);
+      var server = servers.firstWhere((server) {
+        if (server.port != url.port) return false;
+        return isLoopback(server.address.host) == isLoopback(url.host) ||
+            server.address.host == url.host;
+      }, orElse: () => null);
       if (server == null) return null;
       return server.urlToId(url);
     });
@@ -350,94 +366,96 @@
   /// Returns a [Future] that completes once all inputs and transformers are
   /// loaded.
   Future _load({bool useDart2JS}) {
-    // If the entrypoint package manually configures the dart2js
-    // transformer, don't include it in the built-in transformer list.
-    //
-    // TODO(nweiz): if/when we support more built-in transformers, make
-    // this more general.
-    var containsDart2JS = graph.entrypoint.root.pubspec.transformers
-        .any((transformers) => transformers
-        .any((id) => id.package == '\$dart2js'));
+    return log.progress("Initializing barback", () {
+      // If the entrypoint package manually configures the dart2js
+      // transformer, don't include it in the built-in transformer list.
+      //
+      // TODO(nweiz): if/when we support more built-in transformers, make
+      // this more general.
+      var containsDart2JS = graph.entrypoint.root.pubspec.transformers
+          .any((transformers) =>
+              transformers.any((config) => config.id.package == '\$dart2js'));
 
-    if (!containsDart2JS && useDart2JS) {
-      _builtInTransformers.addAll([
-        new Dart2JSTransformer(this, mode),
-        new DartForwardingTransformer(mode)
-      ]);
-    }
+      if (!containsDart2JS && useDart2JS) {
+        _builtInTransformers.addAll([
+          new Dart2JSTransformer(this, mode),
+          new DartForwardingTransformer(mode)
+        ]);
+      }
 
-    // "$pub" is a psuedo-package that allows pub's transformer-loading
-    // infrastructure to share code with pub proper. We provide it only during
-    // the initial transformer loading process.
-    var dartPath = assetPath('dart');
-    var pubSources = listDir(dartPath, recursive: true)
-        // Don't include directories.
-        .where((file) => path.extension(file) == ".dart")
-        .map((library) {
-      var idPath = path.join('lib', path.relative(library, from: dartPath));
-      return new AssetId('\$pub', path.toUri(idPath).toString());
-    });
-
-    // "$sdk" is a pseudo-package that allows the dart2js transformer to find
-    // the Dart core libraries without hitting the file system directly. This
-    // ensures they work with source maps.
-    var libPath = path.join(sdk.rootDirectory, "lib");
-    var sdkSources = listDir(libPath, recursive: true)
-        .where((file) => path.extension(file) == ".dart")
-        .map((file) {
-      var idPath = path.join("lib",
-          path.relative(file, from: sdk.rootDirectory));
-      return new AssetId('\$sdk', path.toUri(idPath).toString());
-    });
-
-    // Bind a server that we can use to load the transformers.
-    var transformerServer;
-    return BarbackServer.bind(this, _hostname, 0, null).then((server) {
-      transformerServer = server;
-
-      var errorStream = barback.errors.map((error) {
-        // Even most normally non-fatal barback errors should take down pub if
-        // they happen during the initial load process.
-        if (error is! AssetLoadException) throw error;
-
-        log.error(log.red(error.message));
-        log.fine(error.stackTrace.terse);
+      // "$pub" is a psuedo-package that allows pub's transformer-loading
+      // infrastructure to share code with pub proper. We provide it only during
+      // the initial transformer loading process.
+      var dartPath = assetPath('dart');
+      var pubSources = listDir(dartPath, recursive: true)
+          // Don't include directories.
+          .where((file) => path.extension(file) == ".dart")
+          .map((library) {
+        var idPath = path.join('lib', path.relative(library, from: dartPath));
+        return new AssetId('\$pub', path.toUri(idPath).toString());
       });
 
-      return _withStreamErrors(() {
-        return log.progress("Loading source assets", () {
-          barback.updateSources(pubSources);
-          barback.updateSources(sdkSources);
-          return _provideSources();
-        });
-      }, [errorStream, barback.results]);
-    }).then((_) {
-      log.fine("Provided sources.");
-      var completer = new Completer();
-
-      var errorStream = barback.errors.map((error) {
-        // Now that we're loading transformers, errors they log shouldn't be
-        // fatal, since we're starting to run them on real user assets which may
-        // have e.g. syntax errors. If an error would cause a transformer to
-        // fail to load, the load failure will cause us to exit.
-        if (error is! TransformerException) throw error;
-
-        var message = error.error.toString();
-        if (error.stackTrace != null) {
-          message += "\n" + error.stackTrace.terse.toString();
-        }
-
-        _log(new LogEntry(error.transform, error.transform.primaryId,
-                LogLevel.ERROR, message, null));
+      // "$sdk" is a pseudo-package that allows the dart2js transformer to find
+      // the Dart core libraries without hitting the file system directly. This
+      // ensures they work with source maps.
+      var libPath = path.join(sdk.rootDirectory, "lib");
+      var sdkSources = listDir(libPath, recursive: true)
+          .where((file) => path.extension(file) == ".dart")
+          .map((file) {
+        var idPath = path.join("lib",
+            path.relative(file, from: sdk.rootDirectory));
+        return new AssetId('\$sdk', path.toUri(idPath).toString());
       });
 
-      return _withStreamErrors(() {
-        return loadAllTransformers(this, transformerServer).then((_) {
-          log.fine("Loaded transformers.");
-          return transformerServer.close();
+      // Bind a server that we can use to load the transformers.
+      var transformerServer;
+      return BarbackServer.bind(this, _hostname, 0).then((server) {
+        transformerServer = server;
+
+        var errorStream = barback.errors.map((error) {
+          // Even most normally non-fatal barback errors should take down pub if
+          // they happen during the initial load process.
+          if (error is! AssetLoadException) throw error;
+
+          log.error(log.red(error.message));
+          log.fine(error.stackTrace.terse);
         });
-      }, [errorStream, barback.results, transformerServer.results]);
-    }).then((_) => barback.removeSources(pubSources));
+
+        return _withStreamErrors(() {
+          return log.progress("Loading source assets", () {
+            barback.updateSources(pubSources);
+            barback.updateSources(sdkSources);
+            return _provideSources();
+          });
+        }, [errorStream, barback.results]);
+      }).then((_) {
+        log.fine("Provided sources.");
+        var completer = new Completer();
+
+        var errorStream = barback.errors.map((error) {
+          // Now that we're loading transformers, errors they log shouldn't be
+          // fatal, since we're starting to run them on real user assets which
+          // may have e.g. syntax errors. If an error would cause a transformer
+          // to fail to load, the load failure will cause us to exit.
+          if (error is! TransformerException) throw error;
+
+          var message = error.error.toString();
+          if (error.stackTrace != null) {
+            message += "\n" + error.stackTrace.terse.toString();
+          }
+
+          _log(new LogEntry(error.transform, error.transform.primaryId,
+                  LogLevel.ERROR, message, null));
+        });
+
+        return _withStreamErrors(() {
+          return log.progress("Loading transformers", () {
+            return loadAllTransformers(this, transformerServer)
+                .then((_) => transformerServer.close());
+          }, fine: true);
+        }, [errorStream, barback.results, transformerServer.results]);
+      }).then((_) => barback.removeSources(pubSources));
+    }, fine: true);
   }
 
   /// Provides the public source assets in the environment to barback.
@@ -466,36 +484,35 @@
     // Then the sources of the subdirectory will be updated and watched twice.
     // See: #17454
     if (_watcherType == WatcherType.NONE) {
-      return _updateDirectorySources(package, dir);
+      _updateDirectorySources(package, dir);
+      return new Future.value();
     }
 
     // Watch the directory before listing is so we don't miss files that
     // are added between the initial list and registering the watcher.
     return _watchDirectorySources(package, dir).then((_) {
-      return _updateDirectorySources(package, dir);
+      _updateDirectorySources(package, dir);
     });
   }
 
   /// Updates barback with all of the files in [dir] inside [package].
-  Future _updateDirectorySources(Package package, String dir) {
-    return _listDirectorySources(package, dir).then((ids) {
-      if (_modifiedSources == null) {
-        barback.updateSources(ids);
-      } else {
-        _modifiedSources.addAll(ids);
-      }
-    });
+  void _updateDirectorySources(Package package, String dir) {
+    var ids = _listDirectorySources(package, dir);
+    if (_modifiedSources == null) {
+      barback.updateSources(ids);
+    } else {
+      _modifiedSources.addAll(ids);
+    }
   }
 
   /// Removes all of the files in [dir] in the root package from barback.
-  Future _removeDirectorySources(String dir) {
-    return _listDirectorySources(rootPackage, dir).then((ids) {
-      if (_modifiedSources == null) {
-        barback.removeSources(ids);
-      } else {
-        _modifiedSources.removeAll(ids);
-      }
-    });
+  void _removeDirectorySources(String dir) {
+    var ids = _listDirectorySources(rootPackage, dir);
+    if (_modifiedSources == null) {
+      barback.removeSources(ids);
+    } else {
+      _modifiedSources.removeAll(ids);
+    }
   }
 
   /// Lists all of the source assets in [dir] inside [package].
@@ -503,24 +520,17 @@
   /// For large packages, listing the contents is a performance bottleneck, so
   /// this is optimized for our needs in here instead of using the more general
   /// but slower [listDir].
-  Future<List<AssetId>> _listDirectorySources(Package package, String dir) {
+  List<AssetId> _listDirectorySources(Package package, String dir) {
     var subdirectory = path.join(package.dir, dir);
-    if (!dirExists(subdirectory)) return new Future.value([]);
+    if (!dirExists(subdirectory)) return [];
 
-    return new Directory(subdirectory).list(recursive: true, followLinks: true)
-        .expand((entry) {
-      // Skip directories and (broken) symlinks.
-      if (entry is Directory) return [];
-      if (entry is Link) return [];
-
-      var relative = path.normalize(
-          path.relative(entry.path, from: package.dir));
-
-      // Ignore hidden files or files in "packages" and hidden directories.
-      if (path.split(relative).any((part) =>
-          part.startsWith(".") || part == "packages")) {
-        return [];
-      }
+    // This is used in some performance-sensitive paths and can list many, many
+    // files. As such, it leans more havily towards optimization as opposed to
+    // readability than most code in pub. In particular, it avoids using the
+    // path package, since re-parsing a path is very expensive relative to
+    // string operations.
+    return package.listFiles(beneath: subdirectory).expand((file) {
+      var relative = file.substring(package.dir.length + 1);
 
       // Skip files that were (most likely) compiled from nearby ".dart"
       // files. These are created by the Editor's "Run as JavaScript"
@@ -535,7 +545,12 @@
       if (relative.endsWith(".dart.js.map")) return [];
       if (relative.endsWith(".dart.precompiled.js")) return [];
 
-      return [new AssetId(package.name, path.toUri(relative).toString())];
+      if (Platform.operatingSystem == 'windows') {
+        relative = relative.replaceAll("\\", "/");
+      }
+
+      var uri = new Uri(pathSegments: relative.split("/"));
+      return [new AssetId(package.name, uri.toString())];
     }).toList();
   }
 
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 d53d3ea..7d9125a 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
@@ -14,6 +14,7 @@
 import 'package:stack_trace/stack_trace.dart';
 
 import '../barback.dart';
+import '../io.dart';
 import '../log.dart' as log;
 import '../utils.dart';
 import 'base_server.dart';
@@ -24,6 +25,9 @@
 
 /// A server that serves assets transformed by barback.
 class BarbackServer extends BaseServer<BarbackServerResult> {
+  /// The package whose assets are being served.
+  final String package;
+
   /// The directory in the root which will serve as the root of this server as
   /// a native platform path.
   ///
@@ -42,18 +46,26 @@
 
   /// Creates a new server and binds it to [port] of [host].
   ///
-  /// This server will serve assets from [barback], and use [rootDirectory] as
-  /// the root directory.
+  /// This server serves assets from [barback], and uses [rootDirectory]
+  /// (which is relative to the root directory of [package]) as the root
+  /// directory. If [rootDirectory] is omitted, the bound server can only be
+  /// used to serve assets from packages' lib directories (i.e. "packages/..."
+  /// URLs). If [package] is omitted, it defaults to the entrypoint package.
   static Future<BarbackServer> bind(AssetEnvironment environment,
-      String host, int port, String rootDirectory) {
-    return Chain.track(HttpServer.bind(host, port)).then((server) {
-      log.fine('Bound "$rootDirectory" to $host:$port.');
-      return new BarbackServer._(environment, server, rootDirectory);
+      String host, int port, {String package, String rootDirectory}) {
+    if (package == null) package = environment.rootPackage.name;
+    return Chain.track(bindServer(host, port)).then((server) {
+      if (rootDirectory == null) {
+        log.fine('Serving packages on $host:$port.');
+      } else {
+        log.fine('Bound "$rootDirectory" to $host:$port.');
+      }
+      return new BarbackServer._(environment, server, package, rootDirectory);
     });
   }
 
   BarbackServer._(AssetEnvironment environment, HttpServer server,
-      this.rootDirectory)
+      this.package, this.rootDirectory)
       : super(environment, server);
 
   /// Converts a [url] served by this server into an [AssetId] that can be
@@ -75,7 +87,7 @@
     if (parts.isNotEmpty && parts.first == "/") parts = parts.skip(1);
 
     var relativePath = path.url.join(rootDirectory, path.url.joinAll(parts));
-    return new AssetId(environment.rootPackage.name, relativePath);
+    return new AssetId(package, relativePath);
   }
 
   /// Handles an HTTP request.
@@ -101,9 +113,7 @@
           asset: id);
     }
 
-    logRequest(request, "Loading $id");
     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;
diff --git a/sdk/lib/_internal/pub/lib/src/barback/cycle_exception.dart b/sdk/lib/_internal/pub/lib/src/barback/cycle_exception.dart
new file mode 100644
index 0000000..8fdd047
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/cycle_exception.dart
@@ -0,0 +1,60 @@
+// 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.barback.cycle_exception;
+
+import '../exceptions.dart';
+
+/// An exception thrown when a transformer dependency cycle is detected.
+///
+/// A cycle exception is usually produced within a deeply-nested series of
+/// calls. The API is designed to make it easy for each of these calls to add to
+/// the message so that the full reasoning for the cycle is made visible to the
+/// user.
+///
+/// Each call's individual message is called a "step". A [CycleException] is
+/// represented internally as a linked list of steps.
+class CycleException implements ApplicationException {
+  /// The step for this exception.
+  final String _step;
+
+  /// The next exception in the linked list.
+  ///
+  /// [_next]'s steps come after [_step].
+  final CycleException _next;
+
+  /// A list of all steps in the cycle.
+  List<String> get steps {
+    if (_step == null) return [];
+
+    var exception = this;
+    var steps = [];
+    while (exception != null) {
+      steps.add(exception._step);
+      exception = exception._next;
+    }
+    return steps;
+  }
+
+  String get message {
+    var steps = this.steps;
+    if (steps.isEmpty) return "Transformer cycle detected.";
+    return "Transformer cycle detected:\n" +
+        steps.map((step) => "  $step").join("\n");
+  }
+
+  /// Creates a new [CycleException] with zero or one steps.
+  CycleException([this._step])
+      : _next = null;
+
+  CycleException._(this._step, this._next);
+
+  /// Returns a copy of [this] with [step] added to the beginning of [steps].
+  CycleException prependStep(String step) {
+    if (_step == null) return new CycleException(step);
+    return new CycleException._(step, this);
+  }
+
+  String toString() => message;
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/excluding_aggregate_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/excluding_aggregate_transformer.dart
new file mode 100644
index 0000000..beed5ce
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/excluding_aggregate_transformer.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.excluding_aggregate_transformer;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'transformer_config.dart';
+
+/// Decorates an inner [AggregateTransformer] and handles including and
+/// excluding primary inputs.
+class ExcludingAggregateTransformer extends AggregateTransformer {
+  /// If [config] defines includes or excludes, wraps [inner] in an
+  /// [ExcludingAggregateTransformer] that handles those.
+  ///
+  /// Otherwise, just returns [inner] unmodified.
+  static AggregateTransformer wrap(AggregateTransformer inner,
+      TransformerConfig config) {
+    if (!config.hasExclusions) return inner;
+
+    if (inner is LazyAggregateTransformer) {
+      return new _LazyExcludingAggregateTransformer(
+          inner as LazyAggregateTransformer, config);
+    } else if (inner is DeclaringAggregateTransformer) {
+      return new _DeclaringExcludingAggregateTransformer(
+          inner as DeclaringAggregateTransformer, config);
+    } else {
+      return new ExcludingAggregateTransformer._(inner, config);
+    }
+  }
+
+  final AggregateTransformer _inner;
+
+  /// The config containing rules for which assets to include or exclude.
+  final TransformerConfig _config;
+
+  ExcludingAggregateTransformer._(this._inner, this._config);
+
+  classifyPrimary(AssetId id) {
+    if (!_config.canTransform(id.path)) return null;
+    return _inner.classifyPrimary(id);
+  }
+
+  Future apply(AggregateTransform transform) => _inner.apply(transform);
+
+  String toString() => _inner.toString();
+}
+
+class _DeclaringExcludingAggregateTransformer
+    extends ExcludingAggregateTransformer
+    implements DeclaringAggregateTransformer {
+  _DeclaringExcludingAggregateTransformer(DeclaringAggregateTransformer inner,
+        TransformerConfig config)
+      : super._(inner as AggregateTransformer, config);
+
+  Future declareOutputs(DeclaringAggregateTransform transform) =>
+      (_inner as DeclaringAggregateTransformer).declareOutputs(transform);
+}
+
+class _LazyExcludingAggregateTransformer
+    extends _DeclaringExcludingAggregateTransformer
+    implements LazyAggregateTransformer {
+  _LazyExcludingAggregateTransformer(DeclaringAggregateTransformer inner,
+        TransformerConfig config)
+      : super(inner, config);
+}
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 1892f97..90b4e51 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
@@ -8,56 +8,38 @@
 
 import 'package:barback/barback.dart';
 
+import 'transformer_config.dart';
+
 /// Decorates an inner [Transformer] and handles including and excluding
 /// primary inputs.
 class ExcludingTransformer extends Transformer {
-  /// If [includes] or [excludes] is non-null, wraps [inner] in an
+  /// If [config] defines includes or excludes, wraps [inner] in an
   /// [ExcludingTransformer] that handles those.
   ///
   /// Otherwise, just returns [inner] unmodified.
-  static Transformer wrap(Transformer inner, Set<String> includes,
-      Set<String> excludes) {
-    if (includes == null && excludes == null) return inner;
+  static Transformer wrap(Transformer inner, TransformerConfig config) {
+    if (!config.hasExclusions) 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);
+      return new _LazyExcludingTransformer(inner as LazyTransformer, config);
     } else if (inner is DeclaringTransformer) {
       return new _DeclaringExcludingTransformer(
-          inner as DeclaringTransformer, includes, excludes);
+          inner as DeclaringTransformer, config);
     } else {
-      return new ExcludingTransformer._(inner, includes, excludes);
+      return new ExcludingTransformer._(inner, config);
     }
   }
 
   final Transformer _inner;
 
-  /// The set of asset paths which should be included.
-  ///
-  /// If `null`, all non-excluded assets are allowed. Otherwise, only included
-  /// assets are allowed.
-  final Set<String> _includes;
+  /// The config containing rules for which assets to include or exclude.
+  final TransformerConfig _config;
 
-  /// The set of assets which should be excluded.
-  ///
-  /// Exclusions are applied after inclusions.
-  final Set<String> _excludes;
-
-  ExcludingTransformer._(this._inner, this._includes, this._excludes);
+  ExcludingTransformer._(this._inner, this._config);
 
   isPrimary(AssetId id) {
-    // TODO(rnystrom): Support globs in addition to paths. See #17093.
-    if (_includes != null) {
-      // If there are any includes, it must match one of them.
-      if (!_includes.contains(id.path)) return false;
-    }
-
-    // It must not be excluded.
-    if (_excludes != null && _excludes.contains(id.path)) {
-      return false;
-    }
-
+    if (!_config.canTransform(id.path)) return false;
     return _inner.isPrimary(id);
   }
 
@@ -69,8 +51,8 @@
 class _DeclaringExcludingTransformer extends ExcludingTransformer
     implements DeclaringTransformer {
   _DeclaringExcludingTransformer(DeclaringTransformer inner,
-        Set<String> includes, Set<String> excludes)
-      : super._(inner as Transformer, includes, excludes);
+          TransformerConfig config)
+      : super._(inner as Transformer, config);
 
   Future declareOutputs(DeclaringTransform transform) =>
       (_inner as DeclaringTransformer).declareOutputs(transform);
@@ -79,6 +61,6 @@
 class _LazyExcludingTransformer extends _DeclaringExcludingTransformer
     implements LazyTransformer {
   _LazyExcludingTransformer(DeclaringTransformer inner,
-        Set<String> includes, Set<String> excludes)
-      : super(inner, includes, excludes);
+          TransformerConfig config)
+      : super(inner, config);
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/foreign_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/foreign_transformer.dart
index 2fc1a0f..7816a98 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/foreign_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/foreign_transformer.dart
@@ -10,8 +10,9 @@
 import 'package:barback/barback.dart';
 
 import '../../../asset/dart/serialize.dart';
-import '../barback.dart';
 import 'excluding_transformer.dart';
+import 'excluding_aggregate_transformer.dart';
+import 'transformer_config.dart';
 
 /// A wrapper for a transformer that's in a different isolate.
 class _ForeignTransformer extends Transformer {
@@ -64,6 +65,58 @@
       : super(map);
 }
 
+/// A wrapper for an aggregate transformer that's in a different isolate.
+class _ForeignAggregateTransformer extends AggregateTransformer {
+  /// The port with which we communicate with the child isolate.
+  ///
+  /// This port and all messages sent across it are specific to this
+  /// transformer.
+  final SendPort _port;
+
+  /// The result of calling [toString] on the transformer in the isolate.
+  final String _toString;
+
+  _ForeignAggregateTransformer(Map map)
+      : _port = map['port'],
+        _toString = map['toString'];
+
+  Future<String> classifyPrimary(AssetId id) {
+    return call(_port, {
+      'type': 'classifyPrimary',
+      'id': serializeId(id)
+    });
+  }
+
+  Future apply(AggregateTransform transform) {
+    return call(_port, {
+      'type': 'apply',
+      'transform': serializeAggregateTransform(transform)
+    });
+  }
+
+  String toString() => _toString;
+}
+
+class _ForeignDeclaringAggregateTransformer extends _ForeignAggregateTransformer
+    implements DeclaringAggregateTransformer {
+  _ForeignDeclaringAggregateTransformer(Map map)
+      : super(map);
+
+  Future declareOutputs(DeclaringAggregateTransform transform) {
+    return call(_port, {
+      'type': 'declareOutputs',
+      'transform': serializeDeclaringAggregateTransform(transform)
+    });
+  }
+}
+
+class _ForeignLazyAggregateTransformer
+    extends _ForeignDeclaringAggregateTransformer
+    implements LazyAggregateTransformer {
+  _ForeignLazyAggregateTransformer(Map map)
+      : super(map);
+}
+
 /// A wrapper for a transformer group that's in a different isolate.
 class _ForeignGroup implements TransformerGroup {
   final Iterable<Iterable> phases;
@@ -71,21 +124,22 @@
   /// The result of calling [toString] on the transformer group in the isolate.
   final String _toString;
 
-  _ForeignGroup(TransformerId id, Map map)
+  _ForeignGroup(TransformerConfig config, Map map)
       : phases = map['phases'].map((phase) {
-          return phase.map((transformer) => deserializeTransformerOrGroup(
-              transformer, id)).toList();
+          return phase.map((transformer) => deserializeTransformerLike(
+              transformer, config)).toList();
         }).toList(),
         _toString = map['toString'];
 
   String toString() => _toString;
 }
 
-/// Converts a serializable map into a [Transformer] or a [TransformerGroup].
-deserializeTransformerOrGroup(Map map, TransformerId id) {
+/// Converts a serializable map into a [Transformer], an [AggregateTransformer],
+/// or a [TransformerGroup].
+deserializeTransformerLike(Map map, TransformerConfig config) {
   var transformer;
   switch(map['type']) {
-    case 'TransformerGroup': return new _ForeignGroup(id, map);
+    case 'TransformerGroup': return new _ForeignGroup(config, map);
     case 'Transformer':
       transformer = new _ForeignTransformer(map);
       break;
@@ -95,8 +149,22 @@
     case 'LazyTransformer':
       transformer = new _ForeignLazyTransformer(map);
       break;
+    case 'AggregateTransformer':
+      transformer = new _ForeignAggregateTransformer(map);
+      break;
+    case 'DeclaringAggregateTransformer':
+      transformer = new _ForeignDeclaringAggregateTransformer(map);
+      break;
+    case 'LazyAggregateTransformer':
+      transformer = new _ForeignLazyAggregateTransformer(map);
+      break;
     default: assert(false);
   }
 
-  return ExcludingTransformer.wrap(transformer, id.includes, id.excludes);
+  if (transformer is Transformer) {
+    return ExcludingTransformer.wrap(transformer, config);
+  } else {
+    assert(transformer is AggregateTransformer);
+    return ExcludingAggregateTransformer.wrap(transformer, config);
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
index 0f9016d..0c85fea 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
@@ -8,16 +8,18 @@
 
 import 'package:barback/barback.dart';
 
-import '../barback.dart';
 import '../log.dart' as log;
 import '../package_graph.dart';
 import '../utils.dart';
 import 'asset_environment.dart';
+import 'barback_server.dart';
 import 'dart2js_transformer.dart';
 import 'excluding_transformer.dart';
-import 'load_transformers.dart';
 import 'rewrite_import_transformer.dart';
-import 'barback_server.dart';
+import 'transformer_config.dart';
+import 'transformer_id.dart';
+import 'transformer_isolate.dart';
+import 'transformers_needed_by_transformers.dart';
 
 /// Loads all transformers depended on by packages in [environment].
 ///
@@ -29,33 +31,26 @@
 /// automatically be added to the end of the root package's cascade.
 Future loadAllTransformers(AssetEnvironment environment,
     BarbackServer transformerServer) {
-  // In order to determine in what order we should load transformers, we need to
-  // know which transformers depend on which others. This is different than
-  // normal package dependencies. Let's begin with some terminology:
-  //
-  // * If package A is transformed by package B, we say A has a "transformer
-  //   dependency" on B.
-  // * If A imports B we say A has a "package dependency" on B.
-  // * If A needs B's transformers to be loaded in order to load A's
-  //   transformers, we say A has an "ordering dependency" on B.
-  //
-  // In particular, an ordering dependency is defined as follows:
-  //
-  // * If A has a transformer dependency on B, A also has an ordering dependency
-  //   on B.
-  // * If A has a transitive package dependency on B and B has a transformer
-  //   dependency on C, A has an ordering dependency on C.
-  //
-  // The order that transformers are loaded is determined by each package's
-  // ordering dependencies. We treat the packages as a directed acyclic[1] graph
-  // where each package is a node and the ordering dependencies are the edges
-  // (that is, the packages form a partially ordered set). We then load[2]
-  // packages in a topological sort order of this graph.
-  //
-  // [1] TODO(nweiz): support cycles in some cases.
-  //
-  // [2] We use "loading a package" as a shorthand for loading that package's
-  //     transformers.
+  var transformersNeededByTransformers =
+      computeTransformersNeededByTransformers(environment.graph);
+
+  var buffer = new StringBuffer();
+  buffer.writeln("Transformer dependencies:");
+  transformersNeededByTransformers.forEach((id, dependencies) {
+    if (dependencies.isEmpty) {
+      buffer.writeln("$id: -");
+    } else {
+      buffer.writeln("$id: ${toSentence(dependencies)}");
+    }
+  });
+  log.fine(buffer);
+
+  var phasedTransformers = _phaseTransformers(transformersNeededByTransformers);
+
+  var packagesThatUseTransformers =
+      _packagesThatUseTransformers(environment.graph);
+
+  var loader = new _TransformerLoader(environment, transformerServer);
 
   // Add a rewrite transformer for each package, so that we can resolve
   // "package:" imports while loading transformers.
@@ -65,167 +60,91 @@
   }
   environment.barback.updateTransformers(r'$pub', [[rewrite]]);
 
-  var orderingDeps = _computeOrderingDeps(environment.graph);
-  var reverseOrderingDeps = reverseGraph(orderingDeps);
-  var packageTransformers = _computePackageTransformers(environment.graph);
+  return Future.forEach(phasedTransformers, (phase) {
+    /// Load all the transformers in [phase], then add them to the appropriate
+    /// locations in the transformer graphs of the packages that use them.
+    return loader.load(phase).then((_) {
+      // Only update packages that use transformers in [phase].
+      var packagesToUpdate = unionAll(phase.map((id) =>
+          packagesThatUseTransformers[id]));
+      return Future.wait(packagesToUpdate.map((packageName) {
+        var package = environment.graph.packages[packageName];
+        return loader.transformersForPhases(package.pubspec.transformers)
+            .then((phases) {
 
-  var loader = new _TransformerLoader(environment, transformerServer);
-
-  // The packages on which no packages have ordering dependencies -- that is,
-  // the packages that don't need to be loaded before any other packages. These
-  // packages will be loaded last, since all of their ordering dependencies need
-  // to be loaded before they're loaded. However, they'll be traversed by
-  // [loadPackage] first.
-  var rootPackages = environment.graph.packages.keys.toSet()
-      .difference(unionAll(orderingDeps.values));
-
-  // The Futures for packages that have been loaded or are being actively loaded
-  // by [loadPackage]. Once one of these Futures is complete, the transformers
-  // for that package will all be available from [loader].
-  var loadingPackages = new Map<String, Future>();
-
-  // A helper function that loads all the transformers that [package] uses, then
-  // all the transformers that [package] defines.
-  Future loadPackage(String package) {
-    if (loadingPackages.containsKey(package)) return loadingPackages[package];
-
-    // First, load each package upon which [package] has an ordering dependency.
-    var future = Future.wait(orderingDeps[package].map(loadPackage)).then((_) {
-      // Go through the transformers used by [package] phase-by-phase. If any
-      // phase uses a transformer defined in [package] itself, that transformer
-      // should be loaded after running all previous phases.
-      var transformers = [[rewrite]];
-
-      var phases = environment.graph.packages[package].pubspec.transformers;
-      return Future.forEach(phases, (phase) {
-        return Future.wait(phase.where((id) => id.package == package)
-            .map(loader.load)).then((_) {
-          // If we've already loaded all the transformers in this package and no
-          // other package imports it, there's no need to keep applying
-          // transformers, so we can short-circuit.
-          var loadedAllTransformers = packageTransformers[package]
-              .difference(loader.loadedTransformers).isEmpty;
-          if (loadedAllTransformers &&
-              !reverseOrderingDeps.containsKey(package)) {
-            return null;
-          }
-
-          transformers.add(unionAll(phase.map(
-              (id) => loader.transformersFor(id))));
-          environment.barback.updateTransformers(package, transformers);
+          // Make sure [rewrite] is still the first phase so that future
+          // transformers' "package:" imports will work.
+          phases.insert(0, new Set.from([rewrite]));
+          environment.barback.updateTransformers(packageName, phases);
         });
-      }).then((_) {
-        // Now that we've applied all the transformers used by [package] via
-        // [Barback.updateTransformers], we load any transformers defined in
-        // [package] but used elsewhere.
-        return Future.wait(packageTransformers[package].map(loader.load));
-      });
+      }));
     });
-    loadingPackages[package] = future;
-    return future;
-  }
-
-  return Future.wait(rootPackages.map(loadPackage)).then((_) {
+  }).then((_) {
     /// Reset the transformers for each package to get rid of [rewrite], which
     /// is no longer needed.
-    for (var package in environment.graph.packages.values) {
-      var phases = package.pubspec.transformers.map((phase) {
-        return unionAll(phase.map((id) => loader.transformersFor(id)));
-      }).toList();
+    return Future.wait(environment.graph.packages.values.map((package) {
+      return loader.transformersForPhases(package.pubspec.transformers)
+          .then((phases) {
+        var transformers = environment.getBuiltInTransformers(package);
+        if (transformers != null) phases.add(transformers);
 
-      var transformers = environment.getBuiltInTransformers(package);
-      if (transformers != null) phases.add(transformers);
-
-      // TODO(nweiz): remove the [newFuture] here when issue 17305 is fixed. If
-      // no transformer in [phases] applies to a source input,
-      // [updateTransformers] may cause a [BuildResult] to be scheduled for
-      // immediate emission. Issue 17305 means that the caller will be unable to
-      // receive this result unless we delay the update to after this function
-      // returns.
-      newFuture(() =>
-          environment.barback.updateTransformers(package.name, phases));
-    }
+        // TODO(nweiz): remove the [newFuture] here when issue 17305 is fixed.
+        // If no transformer in [phases] applies to a source input,
+        // [updateTransformers] may cause a [BuildResult] to be scheduled for
+        // immediate emission. Issue 17305 means that the caller will be unable
+        // to receive this result unless we delay the update to after this
+        // function returns.
+        newFuture(() =>
+            environment.barback.updateTransformers(package.name, phases));
+      });
+    }));
   });
 }
 
-/// Computes and returns the graph of ordering dependencies for [graph].
+/// Given [transformerDependencies], a directed acyclic graph, returns a list of
+/// "phases" (sets of transformers).
 ///
-/// This graph is in the form of a map whose keys are packages and whose values
-/// are those packages' ordering dependencies.
-Map<String, Set<String>> _computeOrderingDeps(PackageGraph graph) {
-  var orderingDeps = new Map<String, Set<String>>();
-  // Iterate through the packages in a deterministic order so that if there are
-  // multiple cycles we choose which to print consistently.
-  var packages = ordered(graph.packages.values.map((package) => package.name));
-  for (var package in packages) {
-    // This package's transformer dependencies are also ordering dependencies.
-    var deps = _transformerDeps(graph, package);
-    deps.remove(package);
-    // The transformer dependencies of this package's transitive package
-    // dependencies are also ordering dependencies for this package.
-    var transitivePackageDeps = graph.transitiveDependencies(package)
-        .map((package) => package.name);
-    for (var packageDep in ordered(transitivePackageDeps)) {
-      var transformerDeps = _transformerDeps(graph, packageDep);
-      if (transformerDeps.contains(package)) {
-        throw _cycleError(graph, package, packageDep);
-      }
-      deps.addAll(transformerDeps);
-    }
-    orderingDeps[package] = deps;
+/// Each phase must be fully loaded and passed to barback before the next phase
+/// can be safely loaded. However, transformers within a phase can be safely
+/// loaded in parallel.
+List<Set<TransformerId>> _phaseTransformers(
+    Map<TransformerId, Set<TransformerId>> transformerDependencies) {
+  // A map from transformer ids to the indices of the phases that those
+  // transformer ids should end up in. Populated by [phaseNumberFor].
+  var phaseNumbers = {};
+  var phases = [];
+
+  phaseNumberFor(id) {
+    if (phaseNumbers.containsKey(id)) return phaseNumbers[id];
+    var dependencies = transformerDependencies[id];
+    phaseNumbers[id] = dependencies.isEmpty ? 0 :
+        maxAll(dependencies.map(phaseNumberFor)) + 1;
+    return phaseNumbers[id];
   }
 
-  return orderingDeps;
+  for (var id in transformerDependencies.keys) {
+    var phaseNumber = phaseNumberFor(id);
+    if (phases.length <= phaseNumber) phases.length = phaseNumber + 1;
+    if (phases[phaseNumber] == null) phases[phaseNumber] = new Set();
+    phases[phaseNumber].add(id);
+  }
+
+  return phases;
 }
 
-/// Returns the set of transformer dependencies for [package].
-Set<String> _transformerDeps(PackageGraph graph, String package) =>
-  unionAll(graph.packages[package].pubspec.transformers)
-      .where((id) => !id.isBuiltInTransformer)
-      .map((id) => id.package).toSet();
-
-/// Returns an [ApplicationException] describing an ordering dependency cycle
-/// detected in [graph].
-///
-/// [dependee] and [depender] should be the names of two packages known to be in
-/// the cycle. In addition, [depender] should have a transformer dependency on
-/// [dependee].
-ApplicationException _cycleError(PackageGraph graph, String dependee,
-    String depender) {
-  assert(_transformerDeps(graph, depender).contains(dependee));
-
-  var simpleGraph = mapMapValues(graph.packages,
-      (_, package) => package.dependencies.map((dep) => dep.name).toList());
-  var path = shortestPath(simpleGraph, dependee, depender);
-  path.add(dependee);
-  return new ApplicationException("Transformer cycle detected:\n" +
-      pairs(path).map((pair) {
-    var transformers = unionAll(graph.packages[pair.first].pubspec.transformers)
-        .where((id) => id.package == pair.last)
-        .map((id) => id.toString()).toList();
-    if (transformers.isEmpty) {
-      return "  ${pair.first} depends on ${pair.last}";
-    } else {
-      return "  ${pair.first} is transformed by ${toSentence(transformers)}";
-    }
-  }).join("\n"));
-}
-
-/// Returns a map from each package name in [graph] to the transformer ids of
-/// all transformers exposed by that package and used by other packages.
-Map<String, Set<TransformerId>> _computePackageTransformers(
+/// Returns a map from transformer ids to all packages in [graph] that use each
+/// transformer.
+Map<TransformerId, Set<String>> _packagesThatUseTransformers(
     PackageGraph graph) {
-  var packageTransformers = listToMap(graph.packages.values,
-      (package) => package.name, (_) => new Set<TransformerId>());
+  var results = {};
   for (var package in graph.packages.values) {
     for (var phase in package.pubspec.transformers) {
-      for (var id in phase) {
-        if (id.isBuiltInTransformer) continue;
-        packageTransformers[id.package].add(id);
+      for (var config in phase) {
+        results.putIfAbsent(config.id, () => new Set()).add(package.name);
       }
     }
   }
-  return packageTransformers;
+  return results;
 }
 
 /// A class that loads transformers defined in specific files.
@@ -234,88 +153,102 @@
 
   final BarbackServer _transformerServer;
 
-  /// The loaded transformers defined in the library identified by each
-  /// transformer id.
-  final _transformers = new Map<TransformerId, Set<Transformer>>();
+  final _isolates = new Map<TransformerId, TransformerIsolate>();
 
-  /// The packages that use each transformer asset id.
+  final _transformers = new Map<TransformerConfig, Set<Transformer>>();
+
+  /// The packages that use each transformer id.
   ///
   /// Used for error reporting.
-  final _transformerUsers = new Map<Pair<String, String>, Set<String>>();
-
-  // TODO(nweiz): Make this a view when issue 17637 is fixed.
-  /// The set of all transformers that have been loaded so far.
-  Set<TransformerId> get loadedTransformers => _transformers.keys.toSet();
+  final _transformerUsers = new Map<TransformerId, Set<String>>();
 
   _TransformerLoader(this._environment, this._transformerServer) {
     for (var package in _environment.graph.packages.values) {
-      for (var id in unionAll(package.pubspec.transformers)) {
-        _transformerUsers.putIfAbsent(
-            new Pair(id.package, id.path), () => new Set<String>())
+      for (var config in unionAll(package.pubspec.transformers)) {
+        _transformerUsers.putIfAbsent(config.id, () => new Set<String>())
             .add(package.name);
       }
     }
   }
 
-  /// Loads the transformer(s) defined in [id].
+  /// Loads a transformer plugin isolate that imports the transformer libraries
+  /// indicated by [ids].
   ///
-  /// Once the returned future completes, these transformers can be retrieved
-  /// using [transformersFor]. If [id] doesn't define any transformers, this
-  /// will complete to an error.
-  Future load(TransformerId id) {
-    if (_transformers.containsKey(id)) return new Future.value();
+  /// Once the returned future completes, transformer instances from this
+  /// isolate can be created using [transformersFor] or [transformersForPhase].
+  ///
+  /// This will skip any ids that have already been loaded.
+  Future load(Iterable<TransformerId> ids) {
+    ids = ids.where((id) => !_isolates.containsKey(id)).toList();
+    if (ids.isEmpty) return new Future.value();
 
-    // TODO(nweiz): load multiple instances of the same transformer from the
-    // same isolate rather than spinning up a separate isolate for each one.
-    return log.progress("Loading $id transformers",
-        () => loadTransformers(_environment, _transformerServer, id))
-        .then((transformers) {
-      if (!transformers.isEmpty) {
-        _transformers[id] = transformers;
-        return;
+    return log.progress("Loading ${toSentence(ids)} transformers", () {
+      return TransformerIsolate.spawn(_environment, _transformerServer, ids);
+    }).then((isolate) {
+      for (var id in ids) {
+        _isolates[id] = isolate;
       }
-
-      var message = "No transformers";
-      if (id.configuration.isNotEmpty) {
-        message += " that accept configuration";
-      }
-
-      var location;
-      if (id.path == null) {
-        location = 'package:${id.package}/transformer.dart or '
-          'package:${id.package}/${id.package}.dart';
-      } else {
-        location = 'package:$id.dart';
-      }
-      var pair = new Pair(id.package, id.path);
-
-      throw new ApplicationException(
-          "$message were defined in $location,\n"
-          "required by ${ordered(_transformerUsers[pair]).join(', ')}.");
     });
   }
 
-  /// Returns the set of transformers for [id].
+  /// Instantiates and returns all transformers in the library indicated by
+  /// [config] with the given configuration.
   ///
-  /// It's an error to call this before [load] is called with [id] and the
-  /// future it returns has completed.
-  Set<Transformer> transformersFor(TransformerId id) {
-    if (_transformers.containsKey(id)) return _transformers[id];
+  /// If this is called before the library has been loaded into an isolate via
+  /// [load], it will return an empty set.
+  Future<Set<Transformer>> transformersFor(TransformerConfig config) {
+    if (_transformers.containsKey(config)) {
+      return new Future.value(_transformers[config]);
+    } else if (_isolates.containsKey(config.id)) {
+      return _isolates[config.id].create(config).then((transformers) {
+        if (transformers.isNotEmpty) {
+          _transformers[config] = transformers;
+          return transformers;
+        }
 
-    assert(id.package == '\$dart2js');
+        var message = "No transformers";
+        if (config.configuration.isNotEmpty) {
+          message += " that accept configuration";
+        }
+
+        var location;
+        if (config.id.path == null) {
+          location = 'package:${config.id.package}/transformer.dart or '
+            'package:${config.id.package}/${config.id.package}.dart';
+        } else {
+          location = 'package:$config.dart';
+        }
+
+        var users = toSentence(ordered(_transformerUsers[config.id]));
+        fail("$message were defined in $location,\n"
+            "required by $users.");
+      });
+    } else if (config.id.package != '\$dart2js') {
+      return new Future.value(new Set());
+    }
+
     var transformer;
     try {
       transformer = new Dart2JSTransformer.withSettings(_environment,
-          new BarbackSettings(id.configuration, _environment.mode));
-
-      // Handle any exclusions.
-      transformer = ExcludingTransformer.wrap(transformer,
-          id.includes, id.excludes);
+          new BarbackSettings(config.configuration, _environment.mode));
     } on FormatException catch (error, stackTrace) {
       fail(error.message, error, stackTrace);
     }
 
-    _transformers[id] = new Set.from([transformer]);
-    return _transformers[id];
+    // Handle any exclusions.
+    _transformers[config] = new Set.from(
+        [ExcludingTransformer.wrap(transformer, config)]);
+    return new Future.value(_transformers[config]);
   }
-}
\ No newline at end of file
+
+  /// Loads all transformers defined in each phase of [phases].
+  ///
+  /// If any library hasn't yet been loaded via [load], it will be ignored.
+  Future<List<Set<Transformer>>> transformersForPhases(
+      Iterable<Set<TransformerConfig>> phases) {
+    return Future.wait(phases.map((phase) =>
+            Future.wait(phase.map(transformersFor)).then(unionAll)))
+        // Return a growable list so that callers can add phases.
+        .then((phases) => phases.toList());
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
deleted file mode 100644
index 1a6c2cb..0000000
--- a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
+++ /dev/null
@@ -1,73 +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.load_transformers;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:isolate';
-
-import '../../../asset/dart/serialize.dart';
-import '../barback.dart';
-import '../dart.dart' as dart;
-import '../log.dart' as log;
-import '../utils.dart';
-import 'asset_environment.dart';
-import 'foreign_transformer.dart';
-import 'barback_server.dart';
-
-/// Load and return all transformers and groups from the library identified by
-/// [id].
-Future<Set> loadTransformers(AssetEnvironment environment,
-    BarbackServer transformerServer, TransformerId id) {
-  return id.getAssetId(environment.barback).then((assetId) {
-    var path = assetId.path.replaceFirst('lib/', '');
-    // TODO(nweiz): load from a "package:" URI when issue 12474 is fixed.
-
-    var baseUrl = transformerServer.url;
-    var uri = baseUrl.resolve('packages/${id.package}/$path');
-    var code = """
-        import 'dart:isolate';
-
-        import '$uri';
-
-        import r'$baseUrl/packages/\$pub/transformer_isolate.dart';
-
-        void main(_, SendPort replyTo) => loadTransformers(replyTo);
-        """;
-    log.fine("Loading transformers from $assetId");
-
-    var port = new ReceivePort();
-    return dart.runInIsolate(code, port.sendPort)
-        .then((_) => port.first)
-        .then((sendPort) {
-      return call(sendPort, {
-        'library': uri.toString(),
-        'mode': environment.mode.name,
-        // TODO(nweiz): support non-JSON-encodable configuration maps.
-        'configuration': JSON.encode(id.configuration)
-      }).then((transformers) {
-        transformers = transformers.map(
-            (transformer) => deserializeTransformerOrGroup(transformer, id))
-            .toSet();
-        log.fine("Transformers from $assetId: $transformers");
-        return transformers;
-      });
-    }).catchError((error, stackTrace) {
-      if (error is! CrossIsolateException) throw error;
-      if (error.type != 'IsolateSpawnException') throw error;
-      // TODO(nweiz): don't parse this as a string once issues 12617 and 12689
-      // are fixed.
-      if (!error.message.split('\n')[1].startsWith("Failure getting $uri:")) {
-        throw error;
-      }
-
-      // If there was an IsolateSpawnException and the import that actually
-      // failed was the one we were loading transformers from, throw an
-      // application exception with a more user-friendly message.
-      fail('Transformer library "package:${id.package}/$path" not found.',
-          error, stackTrace);
-    });
-  });
-}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/rewrite_import_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/rewrite_import_transformer.dart
index 8392289..7482d62 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/rewrite_import_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/rewrite_import_transformer.dart
@@ -7,7 +7,8 @@
 import 'dart:async';
 
 import 'package:barback/barback.dart';
-import 'package:analyzer/analyzer.dart';
+
+import '../dart.dart';
 
 /// A transformer used internally to rewrite "package:" imports so they point to
 /// the barback server rather than to pub's package root.
@@ -16,13 +17,12 @@
 
   Future apply(Transform transform) {
     return transform.primaryInput.readAsString().then((contents) {
-      var collector = new _DirectiveCollector();
-      parseDirectives(contents, name: transform.primaryInput.id.toString())
-          .accept(collector);
+      var directives = parseImportsAndExports(contents,
+          name: transform.primaryInput.id.toString());
 
       var buffer = new StringBuffer();
       var index = 0;
-      for (var directive in collector.directives) {
+      for (var directive in directives) {
         var uri = Uri.parse(directive.uri.stringValue);
         if (uri.scheme != 'package') continue;
 
@@ -38,10 +38,3 @@
     });
   }
 }
-
-/// A simple visitor that collects import and export nodes.
-class _DirectiveCollector extends GeneralizingAstVisitor {
-  final directives = <UriBasedDirective>[];
-
-  visitUriBasedDirective(UriBasedDirective node) => directives.add(node);
-}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/source_directory.dart b/sdk/lib/_internal/pub/lib/src/barback/source_directory.dart
index 725c4fc..fbb7468 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/source_directory.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/source_directory.dart
@@ -42,8 +42,8 @@
 
   /// Binds a server running on [hostname]:[port] to this directory.
   Future<BarbackServer> serve() {
-    return BarbackServer.bind(_environment, hostname, port, directory)
-        .then((server) {
+    return BarbackServer.bind(_environment, hostname, port,
+        rootDirectory: directory).then((server) {
       _serverCompleter.complete(server);
       return server;
     });
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart
new file mode 100644
index 0000000..676bd8c
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart
@@ -0,0 +1,136 @@
+// 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.barback.transformer_config;
+
+import 'package:source_maps/source_maps.dart';
+import 'package:yaml/yaml.dart';
+
+import 'transformer_id.dart';
+
+/// The configuration for a transformer.
+///
+/// This corresponds to the transformers listed in a pubspec, which have both an
+/// [id] indicating the location of the transformer and configuration specific
+/// to that use of the transformer.
+class TransformerConfig {
+  /// The [id] of the transformer [this] is configuring.
+  final TransformerId id;
+
+  /// The configuration to pass to the transformer.
+  ///
+  /// Any pub-specific configuration (i.e. keys starting with "$") will have
+  /// been stripped out of this and handled separately. This will be an empty
+  /// map if no configuration was provided.
+  final Map configuration;
+
+  /// The source span from which this configuration was parsed.
+  final Span span;
+
+  /// The primary input inclusions.
+  ///
+  /// Each inclusion is an asset path. If this set is non-empty, then *only*
+  /// matching assets are allowed as a primary input by this transformer. If
+  /// `null`, all assets are included.
+  ///
+  /// This is processed before [excludes]. If a transformer has both includes
+  /// and excludes, then the set of included assets is determined and assets
+  /// are excluded from that resulting set.
+  final Set<String> includes;
+
+  /// The primary input exclusions.
+  ///
+  /// Any asset whose pach is in this is not allowed as a primary input by
+  /// this transformer.
+  ///
+  /// This is processed after [includes]. If a transformer has both includes
+  /// and excludes, then the set of included assets is determined and assets
+  /// are excluded from that resulting set.
+  final Set<String> excludes;
+
+  /// Returns whether this config excludes certain asset ids from being
+  /// processed.
+  bool get hasExclusions => includes != null || excludes != null;
+
+  /// Parses [identifier] as a [TransformerId] with [configuration].
+  ///
+  /// [identifierSpan] is the source span for [identifier].
+  factory TransformerConfig.parse(String identifier, Span identifierSpan,
+        YamlMap configuration) =>
+      new TransformerConfig(new TransformerId.parse(identifier, identifierSpan),
+          configuration);
+
+  factory TransformerConfig(TransformerId id, YamlMap configurationNode) {
+    parseField(key) {
+      if (!configurationNode.containsKey(key)) return null;
+      var fieldNode = configurationNode.nodes[key];
+      var field = fieldNode.value;
+
+      if (field is String) return new Set.from([field]);
+
+      if (field is List) {
+        for (var node in field.nodes) {
+          if (node.value is String) continue;
+          throw new SpanFormatException(
+              '"$key" field may contain only strings.', node.span);
+        }
+
+        return new Set.from(field);
+      } else {
+        throw new SpanFormatException(
+            '"$key" field must be a string or list.', fieldNode.span);
+      }
+    }
+
+    var includes = null;
+    var excludes = null;
+
+    var configuration;
+    var span;
+    if (configurationNode == null) {
+      configuration = {};
+      span = id.span;
+    } else {
+      // Don't write to the immutable YAML map.
+      configuration = new Map.from(configurationNode);
+      span = configurationNode.span;
+
+      // Pull out the exclusions/inclusions.
+      includes = parseField("\$include");
+      configuration.remove("\$include");
+      excludes = parseField("\$exclude");
+      configuration.remove("\$exclude");
+
+      // All other keys starting with "$" are unexpected.
+      for (var key in configuration.keys) {
+        if (key is! String || !key.startsWith(r'$')) continue;
+        throw new SpanFormatException(
+            'Unknown reserved field.', configurationNode.nodes[key].span);
+      }
+    }
+
+    return new TransformerConfig._(id, configuration, span, includes, excludes);
+  }
+
+  TransformerConfig._(
+      this.id, this.configuration, this.span, this.includes, this.excludes);
+
+  String toString() => id.toString();
+
+  /// Returns whether the include/exclude rules allow the transformer to run on
+  /// [pathWithinPackage].
+  ///
+  /// [pathWithinPackage] must be a URL-style path relative to the containing
+  /// package's root directory.
+  bool canTransform(String pathWithinPackage) {
+    // TODO(rnystrom): Support globs in addition to paths. See #17093.
+    if (excludes != null) {
+      // If there are any excludes, it must not match any of them.
+      if (excludes.contains(pathWithinPackage)) return false;
+    }
+
+    // If there are any includes, it must match one of them.
+    return includes == null || includes.contains(pathWithinPackage);
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_id.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_id.dart
new file mode 100644
index 0000000..e793ef3
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_id.dart
@@ -0,0 +1,105 @@
+// 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.barback.transformer_id;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+import 'package:source_maps/source_maps.dart';
+
+import '../io.dart';
+import '../utils.dart';
+
+/// A list of the names of all built-in transformers that pub exposes.
+const _BUILT_IN_TRANSFORMERS = const ['\$dart2js'];
+
+/// An identifier that indicates the library that contains a transformer.
+///
+/// It's possible that the library identified by [this] defines multiple
+/// transformers. If so, they're all always loaded in the same phase.
+class TransformerId {
+  /// The package containing the library where the transformer is defined.
+  final String package;
+
+  /// The `/`-separated path to the library that contains this transformer.
+  ///
+  /// This is relative to the `lib/` directory in [package], and doesn't end in
+  /// `.dart`.
+  ///
+  /// This can be null; if so, it indicates that the transformer(s) should be
+  /// loaded from `lib/transformer.dart` if that exists, and `lib/$package.dart`
+  /// otherwise.
+  final String path;
+
+  /// The source span from which this id was parsed.
+  final Span span;
+
+  /// Whether this ID points to a built-in transformer exposed by pub.
+  bool get isBuiltInTransformer => package.startsWith('\$');
+
+  /// Parses a transformer identifier.
+  ///
+  /// A transformer identifier is a string of the form "package_name" or
+  /// "package_name/path/to/library". It does not have a trailing extension. If
+  /// it just has a package name, it expands to lib/transformer.dart if that
+  /// exists, or lib/${package}.dart otherwise. Otherwise, it expands to
+  /// lib/${path}.dart. In either case it's located in the given package.
+  factory TransformerId.parse(String identifier, Span span) {
+    if (identifier.isEmpty) {
+      throw new FormatException('Invalid library identifier: "".');
+    }
+
+    var parts = split1(identifier, "/");
+    if (parts.length == 1) {
+      return new TransformerId(parts.single, null, span);
+    }
+
+    return new TransformerId(parts.first, parts.last, span);
+  }
+
+  TransformerId(this.package, this.path, this.span) {
+    if (!package.startsWith('\$')) return;
+    if (_BUILT_IN_TRANSFORMERS.contains(package)) return;
+    throw new SpanFormatException('Unsupported built-in transformer $package.',
+        span);
+  }
+
+  bool operator==(other) =>
+      other is TransformerId && other.package == package && other.path == path;
+
+  int get hashCode => package.hashCode ^ path.hashCode;
+
+  String toString() => path == null ? package : '$package/$path';
+
+  /// Returns the asset id for the library identified by this transformer id.
+  ///
+  /// If `path` is null, this will determine which library to load. Unlike
+  /// [getAssetId], this doesn't take generated assets into account; it's used
+  /// to determine transformers' dependencies, which requires looking at files
+  /// on disk.
+  Future<AssetId> getAssetId(Barback barback) {
+    if (path != null) {
+      return new Future.value(new AssetId(package, 'lib/$path.dart'));
+    }
+
+    var transformerAsset = new AssetId(package, 'lib/transformer.dart');
+    return barback.getAssetById(transformerAsset).then((_) => transformerAsset)
+        .catchError((e) => new AssetId(package, 'lib/$package.dart'),
+            test: (e) => e is AssetNotFoundException);
+  }
+
+  /// Returns the path to the library identified by this transformer within
+  /// [packageDir], which should be the directory of [package].
+  ///
+  /// If `path` is null, this will determine which library to load.
+  String getFullPath(String packageDir) {
+    if (path != null) return p.join(packageDir, 'lib', p.fromUri('$path.dart'));
+
+    var transformerPath = p.join(packageDir, 'lib', 'transformer.dart');
+    if (fileExists(transformerPath)) return transformerPath;
+    return p.join(packageDir, 'lib', '$package.dart');
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_isolate.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_isolate.dart
new file mode 100644
index 0000000..2cb9e6d
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_isolate.dart
@@ -0,0 +1,117 @@
+// 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.transformer_isolate;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:isolate';
+
+import 'package:barback/barback.dart';
+
+import '../../../asset/dart/serialize.dart';
+import '../barback.dart';
+import '../dart.dart' as dart;
+import '../log.dart' as log;
+import '../utils.dart';
+import 'asset_environment.dart';
+import 'barback_server.dart';
+import 'foreign_transformer.dart';
+import 'transformer_config.dart';
+import 'transformer_id.dart';
+
+/// A wrapper for an isolate from which transformer plugins can be instantiated.
+class TransformerIsolate {
+  /// The port used to communicate with the wrapped isolate.
+  final SendPort _port;
+
+  /// A map indicating the barback server URLs for each [TransformerId] that's
+  /// loaded in the wrapped isolate.
+  ///
+  /// A barback server URL is the URL for the library that the given id
+  /// identifies. For example, the URL for "polymer/src/mirrors_remover" might
+  /// be "http://localhost:56234/packages/polymer/src/mirrors_remover.dart".
+  final Map<TransformerId, Uri> _idsToUrls;
+
+  /// The barback mode for this run of pub.
+  final BarbackMode _mode;
+
+  /// Spawns an isolate that loads all transformer libraries defined by [ids].
+  ///
+  /// This doesn't actually instantiate any transformers, since a
+  /// [TransformerId] doesn't define the transformers' configuration. The
+  /// transformers can be constructed using [create].
+  static Future<TransformerIsolate> spawn(AssetEnvironment environment,
+      BarbackServer transformerServer, List<TransformerId> ids) {
+    return mapFromIterableAsync(ids, value: (id) {
+      return id.getAssetId(environment.barback);
+    }).then((idsToAssetIds) {
+      var baseUrl = transformerServer.url;
+      var idsToUrls = mapMap(idsToAssetIds, value: (id, assetId) {
+        var path = assetId.path.replaceFirst('lib/', '');
+        // TODO(nweiz): load from a "package:" URI when issue 12474 is fixed.
+        return baseUrl.resolve('packages/${id.package}/$path');
+      });
+
+      var code = new StringBuffer();
+      code.writeln("import 'dart:isolate';");
+
+      for (var url in idsToUrls.values) {
+        code.writeln("import '$url';");
+      }
+
+      code.writeln("import "
+          "r'$baseUrl/packages/\$pub/transformer_isolate.dart';");
+      code.writeln(
+          "void main(_, SendPort replyTo) => loadTransformers(replyTo);");
+
+      log.fine("Loading transformers from $ids");
+
+      var port = new ReceivePort();
+      return dart.runInIsolate(code.toString(), port.sendPort)
+          .then((_) => port.first)
+          .then((sendPort) {
+        return new TransformerIsolate._(sendPort, environment.mode, idsToUrls);
+      }).catchError((error, stackTrace) {
+        if (error is! CrossIsolateException) throw error;
+        if (error.type != 'IsolateSpawnException') throw error;
+
+        // TODO(nweiz): don't parse this as a string once issues 12617 and 12689
+        // are fixed.
+        var firstErrorLine = error.message.split('\n')[1];
+        var missingTransformer = idsToUrls.keys.firstWhere((id) =>
+                firstErrorLine.startsWith("Failure getting ${idsToUrls[id]}:"),
+            orElse: () => throw error);
+        var packageUri = idToPackageUri(idsToAssetIds[missingTransformer]);
+
+        // If there was an IsolateSpawnException and the import that actually
+        // failed was the one we were loading transformers from, throw an
+        // application exception with a more user-friendly message.
+        fail('Transformer library "$packageUri" not found.',
+            error, stackTrace);
+      });
+    });
+  }
+
+  TransformerIsolate._(this._port, this._mode, this._idsToUrls);
+
+  /// Instantiate the transformers in the [config.id] with
+  /// [config.configuration].
+  ///
+  /// If there are no transformers defined in the given library, this will
+  /// return an empty set.
+  Future<Set<Transformer>> create(TransformerConfig config) {
+    return call(_port, {
+      'library': _idsToUrls[config.id].toString(),
+      'mode': _mode.name,
+      'configuration': JSON.encode(config.configuration)
+    }).then((transformers) {
+      transformers = transformers.map(
+          (transformer) => deserializeTransformerLike(transformer, config))
+          .toSet();
+      log.fine("Transformers from $config: $transformers");
+      return transformers;
+    });
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformers_needed_by_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/transformers_needed_by_transformers.dart
new file mode 100644
index 0000000..e61e1c4
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformers_needed_by_transformers.dart
@@ -0,0 +1,395 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.barback.transformers_needed_by_transformers;
+
+import 'package:path/path.dart' as p;
+
+import '../dart.dart';
+import '../io.dart';
+import '../package.dart';
+import '../package_graph.dart';
+import '../utils.dart';
+import 'cycle_exception.dart';
+import 'transformer_config.dart';
+import 'transformer_id.dart';
+
+/// Returns a dependency graph for transformers in [graph].
+///
+/// This graph is represented by a map whose keys are the vertices and whose
+/// values are sets representing edges from the given vertex. Each vertex is a
+/// [TransformerId]. If there's an edge from `T1` to `T2`, then `T2` must be
+/// loaded before `T1` can be loaded.
+///
+/// The returned graph is transitively closed. That is, if there's an edge from
+/// `T1` to `T2` and an edge from `T2` to `T3`, there's also an edge from `T1`
+/// to `T2`.
+Map<TransformerId, Set<TransformerId>> computeTransformersNeededByTransformers(
+    PackageGraph graph) {
+  var result = {};
+  var computer = new _DependencyComputer(graph);
+  for (var packageName in ordered(graph.packages.keys)) {
+    var package = graph.packages[packageName];
+    for (var phase in package.pubspec.transformers) {
+      for (var config in phase) {
+        var id = config.id;
+        if (id.isBuiltInTransformer) continue;
+        result[id] = computer.transformersNeededByTransformer(id);
+      }
+    }
+  }
+  return result;
+}
+
+/// A helper class for [computeTransformersNeededByTransformers] that keeps
+/// package-graph-wide state and caches over the course of the computation.
+class _DependencyComputer {
+  /// The package graph being analyzed.
+  final PackageGraph _graph;
+
+  /// The names of packages for which [_PackageDependencyComputer]s are
+  /// currently loading.
+  ///
+  /// This is used to detect transformer cycles. If a package's libraries or
+  /// transformers are referenced while the transformers that apply to it are
+  /// being processed, that indicates an unresolvable cycle.
+  final _loadingPackageComputers = new Set<String>();
+
+  /// [_PackageDependencyComputer]s that have been loaded.
+  final _packageComputers = new Map<String, _PackageDependencyComputer>();
+
+  /// A cache of the results of [transformersNeededByPackage].
+  final _transformersNeededByPackages = new Map<String, Set<TransformerId>>();
+
+  _DependencyComputer(this._graph) {
+    ordered(_graph.packages.keys).forEach(_loadPackageComputer);
+  }
+
+  /// Returns the set of all transformers that need to be loaded before [id] is
+  /// loaded.
+  Set<TransformerId> transformersNeededByTransformer(TransformerId id) {
+    if (id.isBuiltInTransformer) return new Set();
+    _loadPackageComputer(id.package);
+    return _packageComputers[id.package].transformersNeededByTransformer(id);
+  }
+
+  /// Returns the set of all transformers that need to be loaded before
+  /// [packageUri] (a "package:" URI) can be safely imported from an external
+  /// package.
+  Set<TransformerId> transformersNeededByPackageUri(Uri packageUri) {
+    // TODO(nweiz): We can do some pre-processing on the package graph (akin to
+    // the old ordering dependency computation) to figure out which packages are
+    // guaranteed not to require any transformers. That'll let us avoid extra
+    // work here and in [transformersNeededByPackage].
+
+    var components = p.split(p.fromUri(packageUri.path));
+    var packageName = components.first;
+    var package = _graph.packages[packageName];
+    if (package == null) {
+      // TODO(nweiz): include source range information here.
+      fail('A transformer imported unknown package "$packageName" (in '
+          '"$packageUri").');
+    }
+
+    var library = p.join(package.dir, 'lib', p.joinAll(components.skip(1)));
+
+    _loadPackageComputer(packageName);
+    return _packageComputers[packageName].transformersNeededByLibrary(library);
+  }
+
+  /// Returns the set of all transformers that need to be loaded before
+  /// everything in [rootPackage] can be used.
+  ///
+  /// This is conservative in that it returns all transformers that could
+  /// theoretically affect [rootPackage]. It only looks at which transformers
+  /// packages use and which packages they depend on; it ignores imports
+  /// entirely.
+  ///
+  /// We fall back on this conservative analysis when a transformer
+  /// (transitively) imports a transformed library. The result of the
+  /// transformation may import any dependency or hit any transformer, so we
+  /// have to assume that it will.
+  Set<TransformerId> transformersNeededByPackage(String rootPackage) {
+    if (_transformersNeededByPackages.containsKey(rootPackage)) {
+      return _transformersNeededByPackages[rootPackage];
+    }
+
+    var results = new Set();
+    var seen = new Set();
+
+    traversePackage(packageName) {
+      if (seen.contains(packageName)) return;
+      seen.add(packageName);
+
+      var package = _graph.packages[packageName];
+      for (var phase in package.pubspec.transformers) {
+        for (var config in phase) {
+          var id = config.id;
+          if (id.isBuiltInTransformer) continue;
+          if (_loadingPackageComputers.contains(id.package)) {
+            throw new CycleException("$packageName is transformed by $id");
+          }
+          results.add(id);
+        }
+      }
+
+      var dependencies = packageName == _graph.entrypoint.root.name ?
+          package.immediateDependencies : package.dependencies;
+      for (var dep in dependencies) {
+        try {
+          traversePackage(dep.name);
+        } on CycleException catch (error) {
+          throw error.prependStep("$packageName depends on ${dep.name}");
+        }
+      }
+    }
+
+    traversePackage(rootPackage);
+    _transformersNeededByPackages[rootPackage] = results;
+    return results;
+  }
+
+
+  /// Ensure that a [_PackageDependencyComputer] for [packageName] is loaded.
+  ///
+  /// If the computer has already been loaded, this does nothing. If the
+  /// computer is in the process of being loaded, this throws a
+  /// [CycleException].
+  void _loadPackageComputer(String packageName) {
+    if (_loadingPackageComputers.contains(packageName)) {
+      throw new CycleException();
+    }
+    if (_packageComputers.containsKey(packageName)) return;
+    _loadingPackageComputers.add(packageName);
+    _packageComputers[packageName] =
+        new _PackageDependencyComputer(this, packageName);
+    _loadingPackageComputers.remove(packageName);
+  }
+}
+
+/// A helper class for [computeTransformersNeededByTransformers] that keeps
+/// package-specific state and caches over the course of the computation.
+class _PackageDependencyComputer {
+  /// The parent [_DependencyComputer].
+  final _DependencyComputer _dependencyComputer;
+
+  /// The package whose dependencies [this] is computing.
+  final Package _package;
+
+  /// The set of transformers that currently apply to [this].
+  ///
+  /// This is added to phase-by-phase while [this] is being initialized. This is
+  /// necessary to model the dependencies of a transformer that's applied to its
+  /// own package.
+  final _applicableTransformers = new Set<TransformerConfig>();
+
+  /// A cache of imports and exports parsed from libraries in this package.
+  final _directives = new Map<Uri, Set<Uri>>();
+
+  /// The set of libraries for which there are currently active
+  /// [transformersNeededByLibrary] calls.
+  ///
+  /// This is used to guard against infinite loops caused by libraries in
+  /// different packages importing one another circularly.
+  /// [transformersNeededByLibrary] will return an empty set for any active
+  /// libraries.
+  final _activeLibraries = new Set<String>();
+
+  /// A cache of the results of [transformersNeededByTransformer].
+  final _transformersNeededByTransformers =
+      new Map<TransformerId, Set<TransformerId>>();
+
+  /// A cache of the results of [_getTransitiveExternalDirectives].
+  ///
+  /// This is invalidated whenever [_applicableTransformers] changes.
+  final _transitiveExternalDirectives = new Map<String, Set<Uri>>();
+
+  _PackageDependencyComputer(_DependencyComputer dependencyComputer,
+          String packageName)
+      : _dependencyComputer = dependencyComputer,
+        _package = dependencyComputer._graph.packages[packageName] {
+    // If [_package] uses its own transformers, there will be fewer transformers
+    // running on [_package] while its own transformers are loading than there
+    // will be once all its transformers are finished loading. To handle this,
+    // we run [transformersNeededByTransformer] to pre-populate
+    // [_transformersNeededByLibraries] while [_applicableTransformers] is
+    // smaller.
+    for (var phase in _package.pubspec.transformers) {
+      for (var config in phase) {
+        var id = config.id;
+        try {
+          if (id.package != _package.name) {
+            // Probe [id]'s transformer dependencies to ensure that it doesn't
+            // depend on this package. If it does, a CycleError will be thrown.
+            _dependencyComputer.transformersNeededByTransformer(id);
+          } else {
+            // Store the transformers needed specifically with the current set
+            // of [_applicableTransformers]. When reporting this transformer's
+            // dependencies, [computeTransformersNeededByTransformers] will use
+            // this stored set of dependencies rather than the potentially wider
+            // set that would be recomputed if [transformersNeededByLibrary]
+            // were called anew.
+            _transformersNeededByTransformers[id] =
+                transformersNeededByLibrary(id.getFullPath(_package.dir));
+          }
+        } on CycleException catch (error) {
+          throw error.prependStep("$packageName is transformed by $id");
+        }
+      }
+
+      // Clear the cached imports and exports because the new transformers may
+      // start transforming a library whose directives were previously
+      // statically analyzable.
+      _transitiveExternalDirectives.clear();
+      _applicableTransformers.addAll(phase);
+    }
+  }
+
+  /// Returns the set of all transformers that need to be loaded before [id] is
+  /// loaded.
+  ///
+  /// [id] must refer to a transformer in [_package].
+  Set<TransformerId> transformersNeededByTransformer(TransformerId id) {
+    assert(id.package == _package.name);
+    if (_transformersNeededByTransformers.containsKey(id)) {
+      return _transformersNeededByTransformers[id];
+    }
+
+    _transformersNeededByTransformers[id] =
+        transformersNeededByLibrary(id.getFullPath(_package.dir));
+    return _transformersNeededByTransformers[id];
+  }
+
+  /// Returns the set of all transformers that need to be loaded before
+  /// [library] is imported.
+  ///
+  /// If [library] or anything it imports/exports within this package is
+  /// transformed by [_applicableTransformers], this will return a conservative
+  /// set of transformers (see also
+  /// [_DependencyComputer.transformersNeededByPackage]).
+  Set<TransformerId> transformersNeededByLibrary(String library) {
+    library = p.normalize(library);
+    if (_activeLibraries.contains(library)) return new Set();
+    _activeLibraries.add(library);
+
+    try {
+      var externalDirectives = _getTransitiveExternalDirectives(library);
+      if (externalDirectives == null) {
+        var rootName = _dependencyComputer._graph.entrypoint.root.name;
+        var dependencies = _package.name == rootName ?
+            _package.immediateDependencies : _package.dependencies;
+
+        // If anything transitively imported/exported by [library] within this
+        // package is modified by a transformer, we don't know what it will
+        // load, so we take the conservative approach and say it depends on
+        // everything.
+        return _applicableTransformers.map((config) => config.id).toSet().union(
+            unionAll(dependencies.map((dep) {
+          try {
+            return _dependencyComputer.transformersNeededByPackage(dep.name);
+          } on CycleException catch (error) {
+            throw error.prependStep("${_package.name} depends on ${dep.name}");
+          }
+        })));
+      } else {
+        // If nothing's transformed, then we only depend on the transformers
+        // used by the external packages' libraries that we import or export.
+        return unionAll(externalDirectives.map((uri) {
+          try {
+            return _dependencyComputer.transformersNeededByPackageUri(uri);
+          } on CycleException catch (error) {
+            var packageName = p.url.split(uri.path).first;
+            throw error.prependStep("${_package.name} depends on $packageName");
+          }
+        }));
+      }
+    } finally {
+      _activeLibraries.remove(library);
+    }
+  }
+
+  /// Returns the set of all external package libraries transitively imported or
+  /// exported by [rootLibrary].
+  ///
+  /// All of the returned URIs will have the "package:" scheme. None of them
+  /// will be URIs for this package.
+  ///
+  /// If [rootLibrary] transitively imports or exports a library that's modified
+  /// by a transformer, this will return `null`.
+  Set<Uri> _getTransitiveExternalDirectives(String rootLibrary) {
+    rootLibrary = p.normalize(rootLibrary);
+    if (_transitiveExternalDirectives.containsKey(rootLibrary)) {
+      return _transitiveExternalDirectives[rootLibrary];
+    }
+
+    var results = new Set();
+    var seen = new Set();
+
+    traverseLibrary(library) {
+      library = p.normalize(library);
+      if (seen.contains(library)) return true;
+      seen.add(library);
+
+      var directives = _getDirectives(library);
+      if (directives == null) return false;
+
+      for (var uri in directives) {
+        var path;
+        if (uri.scheme == 'package') {
+          var components = p.split(p.fromUri(uri.path));
+          if (components.first != _package.name) {
+            results.add(uri);
+            continue;
+          }
+
+          path = p.join(_package.dir, 'lib', p.joinAll(components.skip(1)));
+        } else if (uri.scheme == '' || uri.scheme == 'file') {
+          path = p.join(p.dirname(library), p.fromUri(uri));
+        } else {
+          // Ignore "dart:" URIs and theoretically-possible "http:" URIs.
+          continue;
+        }
+
+        if (!traverseLibrary(path)) return false;
+      }
+
+      return true;
+    }
+
+    _transitiveExternalDirectives[rootLibrary] =
+        traverseLibrary(rootLibrary) ? results : null;
+    return _transitiveExternalDirectives[rootLibrary];
+  }
+
+  /// Returns the set of all imports or exports in [library].
+  ///
+  /// If [library] is modified by a transformer, this will return `null`.
+  Set<Uri> _getDirectives(String library) {
+    var libraryUri = p.toUri(p.normalize(library));
+    var relative = p.toUri(p.relative(library, from: _package.dir)).path;
+    if (_applicableTransformers.any((config) =>
+            config.canTransform(relative))) {
+      _directives[libraryUri] = null;
+      return null;
+    }
+
+    // Check the cache *after* checking [_applicableTransformers] because
+    // [_applicableTransformers] changes over time so the directives may be
+    // invalidated.
+    if (_directives.containsKey(libraryUri)) return _directives[libraryUri];
+
+    // If a nonexistent library is imported, it will probably be generated by a
+    // transformer.
+    if (!fileExists(library)) {
+      _directives[libraryUri] = null;
+      return null;
+    }
+
+    _directives[libraryUri] =
+        parseImportsAndExports(readTextFile(library), name: library)
+        .map((directive) => Uri.parse(directive.uri.stringValue))
+        .toSet();
+    return _directives[libraryUri];
+  }
+}
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 7722b94..a580a2c 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
@@ -23,14 +23,14 @@
 /// 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 CompatibleWebSocket _socket;
   final AssetEnvironment _environment;
-  final _server = new json_rpc.Server();
+  final json_rpc.Server _server;
 
   /// Whether the application should exit when this connection closes.
   bool _exitOnClose = false;
 
-  WebSocketApi(this._socket, this._environment) {
+  WebSocketApi(CompatibleWebSocket socket, this._environment)
+      : _server = new json_rpc.Server(socket) {
     _server.registerMethod("urlToAssetId", _urlToAssetId);
     _server.registerMethod("pathToUrls", _pathToUrls);
     _server.registerMethod("serveDirectory", _serveDirectory);
@@ -51,11 +51,7 @@
   /// complete with an error if the socket had an error, otherwise it will
   /// complete to `null`.
   Future listen() {
-    return _socket.listen((request) {
-      _server.parseRequest(request).then((response) {
-        if (response != null) _socket.add(response);
-      });
-    }, cancelOnError: true).asFuture().then((_) {
+    return _server.listen().then((_) {
       if (!_exitOnClose) return;
       log.message("WebSocket connection closed, terminating.");
       flushThenExit(exit_codes.SUCCESS);
@@ -303,7 +299,6 @@
   }
 }
 
-
 /// The pub-specific JSON RPC error codes.
 class _Error {
   /// The specified directory is not being served.
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 3cfb07a..1765c10 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -17,11 +17,13 @@
 import 'command/help.dart';
 import 'command/lish.dart';
 import 'command/list_package_dirs.dart';
+import 'command/run.dart';
 import 'command/serve.dart';
 import 'command/upgrade.dart';
 import 'command/uploader.dart';
 import 'command/version.dart';
 import 'entrypoint.dart';
+import 'exceptions.dart';
 import 'exit_codes.dart' as exit_codes;
 import 'log.dart' as log;
 import 'system_cache.dart';
@@ -133,8 +135,10 @@
   /// parsed after a non-option argument is parsed.
   bool get allowTrailingOptions => true;
 
-  /// Alternate names for this command. These names won't be used in the
-  /// documentation, but they will work when invoked on the command line.
+  /// Alternate names for this command.
+  ///
+  /// These names won't be used in the documentation, but they will work when
+  /// invoked on the command line.
   final aliases = const <String>[];
 
   /// The [ArgParser] for this command.
@@ -253,6 +257,7 @@
     'deps': new DepsCommand(),
     'list-package-dirs': new ListPackageDirsCommand(),
     'publish': new LishCommand(),
+    'run': new RunCommand(),
     'serve': new ServeCommand(),
     'upgrade': new UpgradeCommand(),
     'uploader': new UploaderCommand(),
diff --git a/sdk/lib/_internal/pub/lib/src/command/barback.dart b/sdk/lib/_internal/pub/lib/src/command/barback.dart
index b7df78b..bfae53b 100644
--- a/sdk/lib/_internal/pub/lib/src/command/barback.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/barback.dart
@@ -33,8 +33,8 @@
   /// build environment.
   final sourceDirectories = new Set<String>();
 
-  /// Override this to specify the default build mode.
-  BarbackMode get defaultMode;
+  /// The default build mode.
+  BarbackMode get defaultMode => BarbackMode.RELEASE;
 
   /// Override this to specify the default source directories if none are
   /// provided on the command line.
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index 353921d..b741f40 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -27,8 +27,6 @@
   /// The path to the application's build output directory.
   String get outputDirectory => commandOptions["output"];
 
-  BarbackMode get defaultMode => BarbackMode.RELEASE;
-
   List<String> get defaultSourceDirectories => ["web"];
 
   /// The number of files that have been built and written to disc so far.
@@ -53,9 +51,8 @@
     // Since this server will only be hit by the transformer loader and isn't
     // user-facing, just use an IPv4 address to avoid a weird bug on the
     // OS X buildbots.
-    return AssetEnvironment.create(entrypoint, "127.0.0.1", 0, mode,
-        WatcherType.NONE, useDart2JS: true)
-          .then((environment) {
+    return AssetEnvironment.create(entrypoint, mode, WatcherType.NONE,
+        useDart2JS: true).then((environment) {
       // Show in-progress errors, but not results. Those get handled
       // implicitly by getAllAssets().
       environment.barback.errors.listen((error) {
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache_add.dart b/sdk/lib/_internal/pub/lib/src/command/cache_add.dart
index d858a46..4a731a2 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache_add.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache_add.dart
@@ -63,8 +63,7 @@
 
       if (versions.isEmpty) {
         // TODO(rnystrom): Show most recent unmatching version?
-        throw new ApplicationException(
-            "Package $package has no versions that match $constraint.");
+        fail("Package $package has no versions that match $constraint.");
       }
 
       downloadVersion(Version version) {
diff --git a/sdk/lib/_internal/pub/lib/src/command/get.dart b/sdk/lib/_internal/pub/lib/src/command/get.dart
index fbe86ae..97dd50e 100644
--- a/sdk/lib/_internal/pub/lib/src/command/get.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/get.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 
 import '../command.dart';
-import '../log.dart' as log;
 
 /// Handles the `get` pub command.
 class GetCommand extends PubCommand {
@@ -19,10 +18,12 @@
   GetCommand() {
     commandParser.addFlag('offline',
         help: 'Use cached packages instead of accessing the network.');
+
+    commandParser.addFlag('dry-run', abbr: 'n', negatable: false,
+        help: "Report what dependencies would change but don't change any.");
   }
 
   Future onRun() {
-    return entrypoint.acquireDependencies()
-        .then((_) => log.message("Got dependencies!"));
+    return entrypoint.acquireDependencies(dryRun: commandOptions['dry-run']);
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/lish.dart b/sdk/lib/_internal/pub/lib/src/command/lish.dart
index 7706f40..8e0c5c2 100644
--- a/sdk/lib/_internal/pub/lib/src/command/lish.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/lish.dart
@@ -83,7 +83,7 @@
         // TODO(nweiz): the response may have XML-formatted information about
         // the error. Try to parse that out once we have an easily-accessible
         // XML parser.
-        throw new ApplicationException('Failed to upload the package.');
+        fail('Failed to upload the package.');
       } else if (urisEqual(Uri.parse(url.origin), Uri.parse(server.origin))) {
         handleJsonError(error.response);
       } else {
@@ -97,17 +97,17 @@
       usageError('Cannot use both --force and --dry-run.');
     }
 
-    var packageBytesFuture = entrypoint.packageFiles().then((files) {
-      log.fine('Archiving and publishing ${entrypoint.root}.');
+    var files = entrypoint.root.listFiles();
+    log.fine('Archiving and publishing ${entrypoint.root}.');
 
-      // Show the package contents so the user can verify they look OK.
-      var package = entrypoint.root;
-      log.message(
-          'Publishing ${package.name} ${package.version} to $server:\n'
-          '${tree.fromFiles(files, baseDir: entrypoint.root.dir)}');
+    // Show the package contents so the user can verify they look OK.
+    var package = entrypoint.root;
+    log.message(
+        'Publishing ${package.name} ${package.version} to $server:\n'
+        '${tree.fromFiles(files, baseDir: entrypoint.root.dir)}');
 
-      return createTarGz(files, baseDir: entrypoint.root.dir);
-    }).then((stream) => stream.toBytes());
+    var packageBytesFuture = createTarGz(files, baseDir: entrypoint.root.dir)
+        .toBytes();
 
     // Validate the package.
     return _validate(packageBytesFuture.then((bytes) => bytes.length))
diff --git a/sdk/lib/_internal/pub/lib/src/command/run.dart b/sdk/lib/_internal/pub/lib/src/command/run.dart
new file mode 100644
index 0000000..5973ca7
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/command/run.dart
@@ -0,0 +1,140 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.command.run;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+import 'package:stack_trace/stack_trace.dart';
+
+import '../barback/asset_environment.dart';
+import '../command.dart';
+import '../exit_codes.dart' as exit_codes;
+import '../io.dart';
+import '../log.dart' as log;
+import '../utils.dart';
+
+final _arrow = getSpecial('\u2192', '=>');
+
+/// Handles the `run` pub command.
+class RunCommand extends PubCommand {
+  bool get takesArguments => true;
+  bool get allowTrailingOptions => false;
+  String get description => "Run an executable from a package.";
+  String get usage => "pub run <executable> [args...]";
+
+  Future onRun() {
+    if (commandOptions.rest.isEmpty) {
+      usageError("Must specify an executable to run.");
+    }
+
+    // Unless the user overrides the verbosity, we want to filter out the
+    // normal pub output shown while loading the environment.
+    if (log.verbosity == log.Verbosity.NORMAL) {
+      log.verbosity = log.Verbosity.WARNING;
+    }
+
+    var environment;
+    var package = entrypoint.root.name;
+    var rootDir;
+    var scriptPath;
+    var args;
+    return AssetEnvironment.create(entrypoint, BarbackMode.RELEASE,
+        WatcherType.NONE, useDart2JS: false)
+          .then((_environment) {
+      environment = _environment;
+
+      // Show in-progress errors, but not results. Those get handled
+      // implicitly by getAllAssets().
+      environment.barback.errors.listen((error) {
+        log.error(log.red("Build error:\n$error"));
+      });
+
+      var script = commandOptions.rest[0];
+      args = commandOptions.rest.skip(1).toList();
+
+      // A command like "foo:bar" runs the "bar" script from the "foo" package.
+      // If there is no colon prefix, default to the root package.
+      if (script.contains(":")) {
+        var components = split1(script, ":");
+        package = components[0];
+        script = components[1];
+
+        var dep = entrypoint.root.immediateDependencies.firstWhere(
+            (dep) => dep.name == package, orElse: () => null);
+        if (dep == null) {
+          if (environment.graph.packages.containsKey(package)) {
+            dataError('Package "$package" is not an immediate dependency.\n'
+                'Cannot run executables in transitive dependencies.');
+          } else {
+            dataError('Could not find package "$package". Did you forget to '
+                'add a dependency?');
+          }
+        }
+      }
+
+      // If the command has a path separator, then it's a path relative to the
+      // root of the package. Otherwise, it's implicitly understood to be in
+      // "bin".
+      var parts = path.split(script);
+      if (parts.length > 1) {
+        if (package != entrypoint.root.name) {
+          usageError("Can not run an executable in a subdirectory of a "
+              "dependency.");
+        }
+
+        scriptPath = "${path.url.joinAll(parts.skip(1))}.dart";
+        rootDir = parts.first;
+      } else {
+        scriptPath = "$script.dart";
+        rootDir = "bin";
+      }
+
+      if (package == entrypoint.root.name) {
+        // Serve the entire root-most directory containing the entrypoint. That
+        // ensures that, for example, things like `import '../../utils.dart';`
+        // will work from within some deeply nested script.
+        return environment.serveDirectory(rootDir);
+      } else {
+        // For other packages, always use the "bin" directory.
+        return environment.servePackageBinDirectory(package);
+      }
+    }).then((server) {
+      // Try to make sure the entrypoint script exists (or is generated) before
+      // we spawn the process to run it.
+      return environment.barback.getAssetById(
+          new AssetId(package, path.url.join(rootDir, scriptPath))).then((_) {
+
+        // Run in checked mode.
+        // TODO(rnystrom): Make this configurable.
+        var mode = "--checked";
+        args = [mode, server.url.resolve(scriptPath).toString()]..addAll(args);
+
+        return Process.start(Platform.executable, args).then((process) {
+          // Note: we're not using process.std___.pipe(std___) here because
+          // that prevents pub from also writing to the output streams.
+          process.stderr.listen(stderr.add);
+          process.stdout.listen(stdout.add);
+          stdin.listen(process.stdin.add);
+
+          return process.exitCode;
+        }).then(flushThenExit);
+      }).catchError((error, stackTrace) {
+        if (error is! AssetNotFoundException) throw error;
+
+        var message = "Could not find ${path.join(rootDir, scriptPath)}";
+        if (package != entrypoint.root.name) {
+          message += " in package $package";
+        }
+
+        log.error("$message.");
+        log.fine(new Chain.forTrace(stackTrace));
+        return flushThenExit(exit_codes.NO_INPUT);
+      });
+    });
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart
index 55895d6..0c56f2a 100644
--- a/sdk/lib/_internal/pub/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart
@@ -86,8 +86,9 @@
     var watcherType = commandOptions['force-poll'] ?
         WatcherType.POLLING : WatcherType.AUTO;
 
-    return AssetEnvironment.create(entrypoint, hostname, port, mode,
-        watcherType, useDart2JS: useDart2JS).then((environment) {
+    return AssetEnvironment.create(entrypoint, mode, watcherType,
+        hostname: hostname, basePort: port, useDart2JS: useDart2JS)
+        .then((environment) {
 
       var directoryLength = sourceDirectories.map((dir) => dir.length)
           .reduce(math.max);
diff --git a/sdk/lib/_internal/pub/lib/src/command/upgrade.dart b/sdk/lib/_internal/pub/lib/src/command/upgrade.dart
index 64a5b15..a899d0a 100644
--- a/sdk/lib/_internal/pub/lib/src/command/upgrade.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/upgrade.dart
@@ -22,22 +22,15 @@
   UpgradeCommand() {
     commandParser.addFlag('offline',
         help: 'Use cached packages instead of accessing the network.');
+
+    commandParser.addFlag('dry-run', abbr: 'n', negatable: false,
+        help: "Report what dependencies would change but don't change any.");
   }
 
   Future onRun() {
-    var upgradeAll = commandOptions.rest.isEmpty;
+    var dryRun = commandOptions['dry-run'];
     return entrypoint.acquireDependencies(useLatest: commandOptions.rest,
-        upgradeAll: upgradeAll).then((numChanged) {
-      // TODO(rnystrom): Show a more detailed message about what was added,
-      // removed, modified, and/or upgraded?
-      if (numChanged == 0) {
-        log.message("No dependencies changed.");
-      } else if (numChanged == 1) {
-        log.message("Changed $numChanged dependency!");
-      } else {
-        log.message("Changed $numChanged dependencies!");
-      }
-
+        isUpgrade: true, dryRun: dryRun).then((_) {
       if (isOffline) {
         log.warning("Warning: Upgrading when offline may not update you to the "
                     "latest versions of your dependencies.");
diff --git a/sdk/lib/_internal/pub/lib/src/dart.dart b/sdk/lib/_internal/pub/lib/src/dart.dart
index 64374db..9a26e1c 100644
--- a/sdk/lib/_internal/pub/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub/lib/src/dart.dart
@@ -18,8 +18,8 @@
 
 import '../../asset/dart/serialize.dart';
 import 'io.dart';
-import 'utils.dart';
 
+import 'utils.dart';
 /// Interface to communicate with dart2js.
 ///
 /// This is basically an amalgamation of dart2js's
@@ -122,6 +122,22 @@
   });
 }
 
+/// Efficiently parses the import and export directives in [contents].
+///
+/// If [name] is passed, it's used as the filename for error reporting.
+List<UriBasedDirective> parseImportsAndExports(String contents, {String name}) {
+  var collector = new _DirectiveCollector();
+  parseDirectives(contents, name: name).accept(collector);
+  return collector.directives;
+}
+
+/// A simple visitor that collects import and export nodes.
+class _DirectiveCollector extends GeneralizingAstVisitor {
+  final directives = <UriBasedDirective>[];
+
+  visitUriBasedDirective(UriBasedDirective node) => directives.add(node);
+}
+
 /// Runs [code] in an isolate.
 ///
 /// [code] should be the contents of a Dart entrypoint. It may contain imports;
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index d5f3287..3eeeebd 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -8,7 +8,6 @@
 
 import 'package:path/path.dart' as path;
 
-import 'git.dart' as git;
 import 'io.dart';
 import 'lock_file.dart';
 import 'log.dart' as log;
@@ -19,6 +18,8 @@
 import 'system_cache.dart';
 import 'utils.dart';
 
+/// The context surrounding the root package pub is operating on.
+///
 /// Pub operates over a directed graph of dependencies that starts at a root
 /// "entrypoint" package. This is typically the package where the current
 /// working directory is located. An entrypoint knows the [root] package it is
@@ -64,31 +65,58 @@
   /// The path to the entrypoint package's lockfile.
   String get lockFilePath => path.join(root.dir, 'pubspec.lock');
 
-  /// Gets package [id] and makes it available for use by this entrypoint.
+  /// Gets all dependencies of the [root] package.
   ///
-  /// If this completes successfully, the package is guaranteed to be importable
-  /// using the `package:` scheme. Returns the resolved [PackageId].
+  /// [useLatest], if provided, defines a list of packages that will be
+  /// unlocked and forced to their latest versions. If [upgradeAll] is
+  /// true, the previous lockfile is ignored and all packages are re-resolved
+  /// from scratch. Otherwise, it will attempt to preserve the versions of all
+  /// previously locked packages.
+  ///
+  /// Shows a report of the changes made relative to the previous lockfile. If
+  /// [isUpgrade] is `true`, all transitive dependencies are shown in the
+  /// report. Otherwise, only dependencies that were changed are shown. If
+  /// [dryRun] is `true`, no physical changes are made.
+  Future acquireDependencies({List<String> useLatest, bool isUpgrade: false,
+      bool dryRun: false}) {
+    return syncFuture(() {
+      return resolveVersions(cache.sources, root, lockFile: loadLockFile(),
+          useLatest: useLatest, upgradeAll: isUpgrade && useLatest.isEmpty);
+    }).then((result) {
+      if (!result.succeeded) throw result.error;
+
+      result.showReport(isUpgrade: isUpgrade);
+
+      if (dryRun) {
+        result.summarizeChanges(isUpgrade: isUpgrade, dryRun: dryRun);
+        return null;
+      }
+
+      // Install the packages.
+      cleanDir(packagesDir);
+      return Future.wait(result.packages.map(_get).toList()).then((ids) {
+        _saveLockFile(ids);
+        _linkSelf();
+        _linkSecondaryPackageDirs();
+        result.summarizeChanges(isUpgrade: isUpgrade, dryRun: dryRun);
+      });
+    });
+  }
+
+  /// Makes sure the package at [id] is locally available.
   ///
   /// This automatically downloads the package to the system-wide cache as well
   /// if it requires network access to retrieve (specifically, if the package's
   /// source is a [CachedSource]).
-  ///
-  /// See also [getDependencies].
-  Future<PackageId> get(PackageId id) {
+  Future<PackageId> _get(PackageId id) {
+    if (id.isRoot) return new Future.value(id);
+
     var pending = _pendingGets[id];
     if (pending != null) return pending;
 
-    var packageDir = path.join(packagesDir, id.name);
-
     var future = syncFuture(() {
-      ensureDir(path.dirname(packageDir));
-
-      if (entryExists(packageDir)) {
-        // TODO(nweiz): figure out when to actually delete the directory, and
-        // when we can just re-use the existing symlink.
-        log.fine("Deleting package directory for ${id.name} before get.");
-        deleteEntry(packageDir);
-      }
+      var packageDir = path.join(packagesDir, id.name);
+      if (entryExists(packageDir)) deleteEntry(packageDir);
 
       var source = cache.sources[id.source];
       return source.get(id, packageDir).then((_) => source.resolveId(id));
@@ -99,52 +127,10 @@
     return future;
   }
 
-  /// Gets all dependencies of the [root] package.
-  ///
-  /// [useLatest], if provided, defines a list of packages that will be
-  /// unlocked and forced to their latest versions. If [upgradeAll] is
-  /// true, the previous lockfile is ignored and all packages are re-resolved
-  /// from scratch. Otherwise, it will attempt to preserve the versions of all
-  /// previously locked packages.
-  ///
-  /// If [useLatest] is non-empty or [upgradeAll] is true, displays a detailed
-  /// report of the changes made relative to the previous lockfile.
-  ///
-  /// Returns a [Future] that completes to the number of changed dependencies.
-  /// It completes when an up-to-date lockfile has been generated and all
-  /// dependencies are available.
-  Future<int> acquireDependencies({List<String> useLatest,
-      bool upgradeAll: false}) {
-    var numChanged = 0;
-
-    return syncFuture(() {
-      return resolveVersions(cache.sources, root, lockFile: loadLockFile(),
-          useLatest: useLatest, upgradeAll: upgradeAll);
-    }).then((result) {
-      if (!result.succeeded) throw result.error;
-
-      // TODO(rnystrom): Should also show the report if there were changes.
-      // That way pub get/build/serve will show the report when relevant.
-      // https://code.google.com/p/dart/issues/detail?id=15587
-      numChanged = result.showReport(showAll: useLatest != null || upgradeAll);
-
-      // Install the packages.
-      cleanDir(packagesDir);
-      return Future.wait(result.packages.map((id) {
-        if (id.isRoot) return new Future.value(id);
-        return get(id);
-      }).toList());
-    }).then((ids) {
-      _saveLockFile(ids);
-      _linkSelf();
-      _linkSecondaryPackageDirs();
-
-      return numChanged;
-    });
-  }
-
   /// Loads the list of concrete package versions from the `pubspec.lock`, if it
-  /// exists. If it doesn't, this completes to an empty [LockFile].
+  /// exists.
+  ///
+  /// If it doesn't, this completes to an empty [LockFile].
   LockFile loadLockFile() {
     if (!lockFileExists) return new LockFile.empty();
     return new LockFile.load(lockFilePath, cache.sources);
@@ -233,15 +219,15 @@
       });
     }).then((upToDate) {
       if (upToDate) return null;
-      return acquireDependencies().then((_) {
-        log.message("Got dependencies!");
-      });
+      return acquireDependencies();
     });
   }
 
   /// Loads the package graph for the application and all of its transitive
-  /// dependencies. Before loading makes sure the lockfile and dependencies are
-  /// installed and up to date.
+  /// dependencies.
+  ///
+  /// Before loading, makes sure the lockfile and dependencies are installed
+  /// and up to date.
   Future<PackageGraph> loadPackageGraph() {
     return _ensureLockFileIsUpToDate().then((_) {
       var lockFile = loadLockFile();
@@ -323,53 +309,4 @@
     if (entryExists(symlink)) deleteEntry(symlink);
     createSymlink(packagesDir, symlink, relative: true);
   }
-
-  /// The basenames of files that are automatically excluded from archives.
-  final _BLACKLISTED_FILES = const ['pubspec.lock'];
-
-  /// The basenames of directories that are automatically excluded from
-  /// archives.
-  final _BLACKLISTED_DIRS = const ['packages'];
-
-  // TODO(nweiz): unit test this function.
-  /// Returns a list of files that are considered to be part of this package.
-  ///
-  /// If this is a Git repository, this will respect .gitignore; otherwise, it
-  /// will return all non-hidden, non-blacklisted files.
-  ///
-  /// If [beneath] is passed, this will only return files beneath that path.
-  Future<List<String>> packageFiles({String beneath}) {
-    if (beneath == null) beneath = root.dir;
-
-    return git.isInstalled.then((gitInstalled) {
-      if (dirExists(path.join(root.dir, '.git')) && gitInstalled) {
-        // Later versions of git do not allow a path for ls-files that appears
-        // to be outside of the repo, so make sure we give it a relative path.
-        var relativeBeneath = path.relative(beneath, from: root.dir);
-
-        // List all files that aren't gitignored, including those not checked
-        // in to Git.
-        return git.run(
-            ["ls-files", "--cached", "--others", "--exclude-standard",
-             relativeBeneath],
-            workingDir: root.dir).then((files) {
-          // Git always prints files relative to the project root, but we want
-          // them relative to the working directory. It also prints forward
-          // slashes on Windows which we normalize away for easier testing.
-          return files.map((file) => path.normalize(path.join(root.dir, file)));
-        });
-      }
-
-      return listDir(beneath, recursive: true);
-    }).then((files) {
-      return files.where((file) {
-        // Skip directories and broken symlinks.
-        if (!fileExists(file)) return false;
-
-        var relative = path.relative(file, from: beneath);
-        if (_BLACKLISTED_FILES.contains(path.basename(relative))) return false;
-        return !path.split(relative).any(_BLACKLISTED_DIRS.contains);
-      }).toList();
-    });
-  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/error_group.dart b/sdk/lib/_internal/pub/lib/src/error_group.dart
index 52a284c..c479a24 100644
--- a/sdk/lib/_internal/pub/lib/src/error_group.dart
+++ b/sdk/lib/_internal/pub/lib/src/error_group.dart
@@ -7,9 +7,11 @@
 import 'dart:async';
 
 /// An [ErrorGroup] entangles the errors of multiple [Future]s and [Stream]s
-/// with one another. This allows APIs to expose multiple [Future]s and
-/// [Stream]s that have identical error conditions without forcing API consumers
-/// to attach error handling to objects they don't care about.
+/// with one another.
+///
+/// This allows APIs to expose multiple [Future]s and [Stream]s that have
+/// identical error conditions without forcing API consumers to attach error
+/// handling to objects they don't care about.
 ///
 /// To use an [ErrorGroup], register [Future]s and [Stream]s with it using
 /// [registerFuture] and [registerStream]. These methods return wrapped versions
@@ -40,9 +42,10 @@
   /// The [Completer] for [done].
   final _doneCompleter = new Completer();
 
-  /// The underlying [Future] for [done]. We need to be able to access it
-  /// internally as an [_ErrorGroupFuture] so we can check if it has listeners
-  /// and signal errors on it.
+  /// The underlying [Future] for [done].
+  ///
+  /// We need to be able to access it internally as an [_ErrorGroupFuture] so
+  /// we can check if it has listeners and signal errors on it.
   _ErrorGroupFuture _done;
 
   /// Returns a [Future] that completes successully when all members of [this]
@@ -58,8 +61,9 @@
     this._done = new _ErrorGroupFuture(this, _doneCompleter.future);
   }
 
-  /// Registers a [Future] as a member of [this]. Returns a wrapped version of
-  /// [future] that should be used in its place.
+  /// Registers a [Future] as a member of [this].
+  ///
+  /// Returns a wrapped version of [future] that should be used in its place.
   ///
   /// If all members of [this] have already completed successfully or with an
   /// error, it's a [StateError] to try to register a new [Future].
@@ -74,9 +78,11 @@
     return wrapped;
   }
 
-  /// Registers a [Stream] as a member of [this]. Returns a wrapped version of
-  /// [stream] that should be used in its place. The returned [Stream] will be
-  /// multi-subscription if and only if [stream] is.
+  /// Registers a [Stream] as a member of [this].
+  ///
+  /// Returns a wrapped version of [stream] that should be used in its place.
+  /// The returned [Stream] will be multi-subscription if and only if [stream]
+  /// is.
   ///
   /// Since all errors in a group are passed to all members, the returned
   /// [Stream] will automatically unsubscribe all its listeners when it
@@ -95,9 +101,10 @@
     return wrapped;
   }
 
-  /// Sends [error] to all members of [this]. Like errors that come from
-  /// members, this will only be passed to the top-level error handler if no
-  /// members have listeners.
+  /// Sends [error] to all members of [this].
+  ///
+  /// Like errors that come from members, this will only be passed to the
+  /// top-level error handler if no members have listeners.
   ///
   /// If all members of [this] have already completed successfully or with an
   /// error, it's a [StateError] to try to signal an error.
@@ -109,8 +116,10 @@
     _signalError(error, stackTrace);
   }
 
-  /// Signal an error internally. This is just like [signalError], but instead
-  /// of throwing an error if [this] is complete, it just does nothing.
+  /// Signal an error internally.
+  ///
+  /// This is just like [signalError], but instead of throwing an error if
+  /// [this] is complete, it just does nothing.
   void _signalError(var error, [StackTrace stackTrace]) {
     if (_isDone) return;
 
@@ -150,8 +159,10 @@
 }
 
 /// A [Future] wrapper that keeps track of whether it's been completed and
-/// whether it has any listeners. It also notifies its parent [ErrorGroup] when
-/// it completes successfully or receives an error.
+/// whether it has any listeners.
+///
+/// It also notifies its parent [ErrorGroup] when it completes successfully or
+/// receives an error.
 class _ErrorGroupFuture implements Future {
   /// The parent [ErrorGroup].
   final ErrorGroup _group;
@@ -216,8 +227,10 @@
 // When this is fixed, this class will need to prevent such errors from being
 // top-leveled.
 /// A [Stream] wrapper that keeps track of whether it's been completed and
-/// whether it has any listeners. It also notifies its parent [ErrorGroup] when
-/// it completes successfully or receives an error.
+/// whether it has any listeners.
+///
+/// It also notifies its parent [ErrorGroup] when it completes successfully or
+/// receives an error.
 class _ErrorGroupStream extends Stream {
   /// The parent [ErrorGroup].
   final ErrorGroup _group;
@@ -228,8 +241,10 @@
   /// The underlying [StreamController] for [this].
   final StreamController _controller;
 
-  /// The controller's [Stream]. May be different than `_controller.stream` if
-  /// the wrapped stream is a broadcasting stream.
+  /// The controller's [Stream].
+  ///
+  /// May be different than `_controller.stream` if the wrapped stream is a
+  /// broadcasting stream.
   Stream _stream;
 
   /// The [StreamSubscription] that connects the wrapped [Stream] to
diff --git a/sdk/lib/_internal/pub/lib/src/exceptions.dart b/sdk/lib/_internal/pub/lib/src/exceptions.dart
new file mode 100644
index 0000000..e67ef64d
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/exceptions.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 pub.exceptions;
+
+import 'dart:io';
+import 'dart:isolate';
+
+import "package:analyzer/analyzer.dart";
+import "package:http/http.dart" as http;
+import "package:stack_trace/stack_trace.dart";
+import "package:yaml/yaml.dart";
+
+import '../../asset/dart/serialize.dart';
+
+/// An exception class for exceptions that are intended to be seen by the user.
+///
+/// These exceptions won't have any debugging information printed when they're
+/// thrown.
+class ApplicationException implements Exception {
+  final String message;
+
+  ApplicationException(this.message);
+
+  String toString() => message;
+}
+
+/// A class for exceptions that wrap other exceptions.
+class WrappedException extends ApplicationException {
+  /// The underlying exception that [this] is wrapping, if any.
+  final innerError;
+
+  /// The stack chain for [innerError] if it exists.
+  final Chain innerChain;
+
+  WrappedException(String message, this.innerError, [StackTrace innerTrace])
+      : innerChain = innerTrace == null ? null : new Chain.forTrace(innerTrace),
+        super(message);
+}
+
+/// A class for command usage exceptions.
+class UsageException extends ApplicationException {
+  /// The command usage information.
+  final String usage;
+
+  UsageException(String message, this.usage)
+      : super(message);
+
+  String toString() => "$message\n\n$usage";
+}
+
+/// A class for errors in a command's input data.
+///
+/// This corresponds to the [exit_codes.DATA] exit code.
+class DataException extends ApplicationException {
+  DataException(String message)
+      : super(message);
+}
+
+/// An class for exceptions where a package could not be found in a [Source].
+///
+/// The source is responsible for wrapping its internal exceptions in this so
+/// that other code in pub can use this to show a more detailed explanation of
+/// why the package was being requested.
+class PackageNotFoundException extends WrappedException {
+  PackageNotFoundException(String message, [innerError, StackTrace innerTrace])
+      : super(message, innerError, innerTrace);
+}
+
+/// All the names of user-facing exceptions.
+final _userFacingExceptions = new Set<String>.from([
+  'ApplicationException',
+  // This refers to http.ClientException.
+  'ClientException',
+  // Errors coming from the Dart analyzer are probably caused by syntax errors
+  // in user code, so they're user-facing.
+  'AnalyzerError', 'AnalyzerErrorGroup',
+  // An error spawning an isolate probably indicates a transformer with an
+  // invalid import.
+  'IsolateSpawnException',
+  // IOException and subclasses.
+  'CertificateException', 'FileSystemException', 'HandshakeException',
+  'HttpException', 'IOException', 'ProcessException', 'RedirectException',
+  'SignalException', 'SocketException', 'StdoutException', 'TlsException',
+  'WebSocketException'
+]);
+
+/// Returns whether [error] is a user-facing error object.
+///
+/// This includes both [ApplicationException] and any dart:io errors.
+bool isUserFacingException(error) {
+  if (error is CrossIsolateException) {
+    return _userFacingExceptions.contains(error.type);
+  }
+
+  // TODO(nweiz): unify this list with _userFacingExceptions when issue 5897 is
+  // fixed.
+  return error is ApplicationException ||
+    error is AnalyzerError ||
+    error is AnalyzerErrorGroup ||
+    error is IsolateSpawnException ||
+    error is IOException ||
+    error is http.ClientException ||
+    error is YamlException;
+}
diff --git a/sdk/lib/_internal/pub/lib/src/exit_codes.dart b/sdk/lib/_internal/pub/lib/src/exit_codes.dart
index a1683cd..ebe8e8d 100644
--- a/sdk/lib/_internal/pub/lib/src/exit_codes.dart
+++ b/sdk/lib/_internal/pub/lib/src/exit_codes.dart
@@ -2,9 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// Exit code constants. From [the BSD sysexits manpage][manpage]. Not every
-/// constant here is used, even though some of the unused ones may be
-/// appropriate for errors encountered by pub.
+/// Exit code constants.
+///
+/// From [the BSD sysexits manpage][manpage]. Not every constant here is used,
+/// even though some of the unused ones may be appropriate for errors
+/// encountered by pub.
 ///
 /// [manpage]: http://www.freebsd.org/cgi/man.cgi?query=sysexits
 library pub.exit_codes;
diff --git a/sdk/lib/_internal/pub/lib/src/git.dart b/sdk/lib/_internal/pub/lib/src/git.dart
index d79a914..598627a 100644
--- a/sdk/lib/_internal/pub/lib/src/git.dart
+++ b/sdk/lib/_internal/pub/lib/src/git.dart
@@ -8,6 +8,8 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:stack_trace/stack_trace.dart';
+
 import 'io.dart';
 import 'log.dart' as log;
 import 'utils.dart';
@@ -29,73 +31,76 @@
 }
 
 /// Tests whether or not the git command-line app is available for use.
-Future<bool> get isInstalled {
-  if (_isGitInstalledCache != null) {
-    return new Future.value(_isGitInstalledCache);
-  }
-
-  return _gitCommand.then((git) => git != null);
+bool get isInstalled {
+  if (_isInstalledCache != null) return _isInstalledCache;
+  _isInstalledCache = _gitCommand != null;
+  return _isInstalledCache;
 }
+bool _isInstalledCache;
 
-/// Run a git process with [args] from [workingDir]. Returns the stdout as a
-/// list of strings if it succeeded. Completes to an exception if it failed.
+/// Run a git process with [args] from [workingDir].
+///
+/// Returns the stdout as a list of strings if it succeeded. Completes to an
+/// exception if it failed.
 Future<List<String>> run(List<String> args,
     {String workingDir, Map<String, String> environment}) {
-  return _gitCommand.then((git) {
-    if (git == null) {
-      throw new ApplicationException(
-          "Cannot find a Git executable.\n"
-          "Please ensure Git is correctly installed.");
-    }
+  if (!isInstalled) {
+    fail("Cannot find a Git executable.\n"
+        "Please ensure Git is correctly installed.");
+  }
 
-    return runProcess(git, args, workingDir: workingDir,
-        environment: environment);
-  }).then((result) {
+  return runProcess(_gitCommand, args, workingDir: workingDir,
+      environment: environment).then((result) {
     if (!result.success) throw new GitException(args, result.stderr.join("\n"));
     return result.stdout;
   });
 }
 
-bool _isGitInstalledCache;
+/// Like [run], but synchronous.
+List<String> runSync(List<String> args, {String workingDir,
+    Map<String, String> environment}) {
+  if (!isInstalled) {
+    fail("Cannot find a Git executable.\n"
+        "Please ensure Git is correctly installed.");
+  }
 
-/// The cached Git command.
-String _gitCommandCache;
+  var result = runProcessSync(_gitCommand, args,
+      workingDir: workingDir,
+      environment: environment);
+  if (!result.success) throw new GitException(args, result.stderr.join("\n"));
+  return result.stdout;
+}
 
 /// Returns the name of the git command-line app, or null if Git could not be
 /// found on the user's PATH.
-Future<String> get _gitCommand {
-  if (_gitCommandCache != null) {
-    return new Future.value(_gitCommandCache);
+String get _gitCommand {
+  if (_commandCache != null) return _commandCache;
+
+  var command;
+  if (_tryGitCommand("git")) {
+    _commandCache = "git";
+  } else if (_tryGitCommand("git.cmd")){
+    _commandCache = "git.cmd";
+  } else {
+    return null;
   }
 
-  return _tryGitCommand("git").then((success) {
-    if (success) return "git";
-
-    // Git is sometimes installed on Windows as `git.cmd`
-    return _tryGitCommand("git.cmd").then((success) {
-      if (success) return "git.cmd";
-      return null;
-    });
-  }).then((command) {
-    log.fine('Determined git command $command.');
-    _gitCommandCache = command;
-    return command;
-  });
+  log.fine('Determined git command $command.');
+  return _commandCache;
 }
+String _commandCache;
 
 /// Checks whether [command] is the Git command for this computer.
-Future<bool> _tryGitCommand(String command) {
+bool _tryGitCommand(String command) {
   // If "git --version" prints something familiar, git is working.
-  return runProcess(command, ["--version"]).then((results) {
+  try {
+    var result = runProcessSync(command, ["--version"]);
     var regexp = new RegExp("^git version");
-    return results.stdout.length == 1 && regexp.hasMatch(results.stdout[0]);
-  }).catchError((err, stackTrace) {
+    return result.stdout.length == 1 && regexp.hasMatch(result.stdout.single);
+  } on ProcessException catch (error, stackTrace) {
+    var chain = new Chain.forTrace(stackTrace);
     // If the process failed, they probably don't have it.
-    if (err is ProcessException) {
-      log.io('Git command is not "$command": $err\n$stackTrace');
-      return false;
-    }
-
-    throw err;
-  });
+    log.message('Git command is not "$command": $error\n$chain');
+    return false;
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/http.dart b/sdk/lib/_internal/pub/lib/src/http.dart
index 08c30fd..24dbacb 100644
--- a/sdk/lib/_internal/pub/lib/src/http.dart
+++ b/sdk/lib/_internal/pub/lib/src/http.dart
@@ -87,6 +87,21 @@
              "Upgrade pub to the latest version and try again.");
       }
 
+      if (status == 500 &&
+          (request.url.host == "pub.dartlang.org" ||
+          request.url.host == "storage.googleapis.com")) {
+        var message = "HTTP error 500: Internal Server Error at "
+            "${request.url}.";
+
+        if (request.url.host == "pub.dartlang.org" ||
+            request.url.host == "storage.googleapis.com") {
+          message += "\nThis is likely a transient error. Please try again "
+              "later.";
+        }
+
+        fail(message);
+      }
+
       return http.Response.fromStream(streamedResponse).then((response) {
         throw new PubHttpException(response);
       });
@@ -110,7 +125,8 @@
     });
 
     if (timeoutLength == null) return future;
-    return timeout(future, timeoutLength, 'fetching URL "${request.url}"');
+    return timeout(future, timeoutLength, request.url,
+        'fetching URL "${request.url}"');
   }
 
   /// Logs the fact that [request] was sent, and information about it.
@@ -208,8 +224,10 @@
   fail(errorMap['error']['message']);
 }
 
-/// Parses a response body, assuming it's JSON-formatted. Throws a user-friendly
-/// error if the response body is invalid JSON, or if it's not a map.
+/// Parses a response body, assuming it's JSON-formatted.
+///
+/// Throws a user-friendly error if the response body is invalid JSON, or if
+/// it's not a map.
 Map parseJsonResponse(http.Response response) {
   var value;
   try {
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index d023350..4d4ddd5 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -12,6 +12,7 @@
 
 import 'package:path/path.dart' as path;
 import 'package:http/http.dart' show ByteStream;
+import 'package:http_multi_server/http_multi_server.dart';
 import 'package:stack_trace/stack_trace.dart';
 
 import 'exit_codes.dart' as exit_codes;
@@ -35,17 +36,22 @@
 bool entryExists(String path) =>
   dirExists(path) || fileExists(path) || linkExists(path);
 
-/// Returns whether [link] exists on the file system. This will return `true`
-/// for any symlink, regardless of what it points at or whether it's broken.
+/// Returns whether [link] exists on the file system.
+///
+/// This returns `true` for any symlink, regardless of what it points at or
+/// whether it's broken.
 bool linkExists(String link) => new Link(link).existsSync();
 
-/// Returns whether [file] exists on the file system. This will return `true`
-/// for a symlink only if that symlink is unbroken and points to a file.
+/// Returns whether [file] exists on the file system.
+///
+/// This returns `true` for a symlink only if that symlink is unbroken and
+/// points to a file.
 bool fileExists(String file) => new File(file).existsSync();
 
-/// Returns the canonical path for [pathString]. This is the normalized,
-/// absolute path, with symlinks resolved. As in [transitiveTarget], broken or
-/// recursive symlinks will not be fully resolved.
+/// Returns the canonical path for [pathString].
+///
+/// This is the normalized, absolute path, with symlinks resolved. As in
+/// [transitiveTarget], broken or recursive symlinks will not be fully resolved.
 ///
 /// This doesn't require [pathString] to point to a path that exists on the
 /// filesystem; nonexistent or unreadable path entries are treated as normal
@@ -124,8 +130,10 @@
 }
 
 /// Returns the transitive target of [link] (if A links to B which links to C,
-/// this will return C). If [link] is part of a symlink loop (e.g. A links to B
-/// which links back to A), this returns the path to the first repeated link (so
+/// this will return C).
+///
+/// If [link] is part of a symlink loop (e.g. A links to B which links back to
+/// A), this returns the path to the first repeated link (so
 /// `transitiveTarget("A")` would return `"A"` and `transitiveTarget("A")` would
 /// return `"B"`).
 ///
@@ -177,8 +185,10 @@
   return file;
 }
 
-/// Writes [stream] to a new file at path [file]. Will replace any file already
-/// at that path. Completes when the file is done being written.
+/// Writes [stream] to a new file at path [file].
+///
+/// Replaces any file already at that path. Completes when the file is done
+/// being written.
 Future<String> createFileFromStream(Stream<List<int>> stream, String file) {
   // TODO(nweiz): remove extra logging when we figure out the windows bot issue.
   log.io("Creating $file from stream.");
@@ -191,9 +201,11 @@
   });
 }
 
-/// Copy all files in [files] to the directory [destination]. Their locations in
-/// [destination] will be determined by their relative location to [baseDir].
-/// Any existing files at those paths will be overwritten.
+/// Copies all files in [files] to the directory [destination].
+///
+/// Their locations in [destination] will be determined by their relative
+/// location to [baseDir]. Any existing files at those paths will be
+/// overwritten.
 void copyFiles(Iterable<String> files, String baseDir, String destination) {
   for (var file in files) {
     var newPath = path.join(destination, path.relative(file, from: baseDir));
@@ -202,7 +214,7 @@
   }
 }
 
-/// Copy a file from [source] to [destination].
+/// Copies a file from [source] to [destination].
 void copyFile(String source, String destination) {
   writeBinaryFile(destination, readBinaryFile(source));
 }
@@ -213,8 +225,9 @@
   return dir;
 }
 
-/// Ensures that [dir] and all its parent directories exist. If they don't
-/// exist, creates them.
+/// Ensures that [dir] and all its parent directories exist.
+///
+/// If they don't exist, creates them.
 String ensureDir(String dir) {
   new Directory(dir).createSync(recursive: true);
   return dir;
@@ -222,6 +235,7 @@
 
 /// Creates a temp directory in [dir], whose name will be [prefix] with
 /// characters appended to it to make a unique name.
+///
 /// Returns the path of the created directory.
 String createTempDir(String base, String prefix) {
   var tempDir = new Directory(base).createTempSync(prefix);
@@ -231,6 +245,7 @@
 
 /// Creates a temp directory in the system temp directory, whose name will be
 /// 'pub_' with characters appended to it to make a unique name.
+///
 /// Returns the path of the created directory.
 String createSystemTempDir() {
   var tempDir = Directory.systemTemp.createTempSync('pub_');
@@ -238,9 +253,15 @@
   return tempDir.path;
 }
 
-/// Lists the contents of [dir]. If [recursive] is `true`, lists subdirectory
-/// contents (defaults to `false`). If [includeHidden] is `true`, includes files
-/// and directories beginning with `.` (defaults to `false`).
+/// Lists the contents of [dir].
+///
+/// If [recursive] is `true`, lists subdirectory contents (defaults to `false`).
+/// If [includeHidden] is `true`, includes files and directories beginning with
+/// `.` (defaults to `false`). If [includeDirs] is `true`, includes directories
+/// as well as files (defaults to `true`).
+///
+/// [whiteList] is a list of hidden filenames to include even when
+/// [includeHidden] is `false`.
 ///
 /// Note that dart:io handles recursive symlinks in an unfortunate way. You
 /// end up with two copies of every entity that is within the recursive loop.
@@ -248,31 +269,105 @@
 /// had a noticeable performance impact. In the interest of speed, we'll just
 /// live with that annoying behavior.
 ///
-/// The returned paths are guaranteed to begin with [dir].
+/// The returned paths are guaranteed to begin with [dir]. Broken symlinks won't
+/// be returned.
 List<String> listDir(String dir, {bool recursive: false,
-    bool includeHidden: false}) {
-  var entities = new Directory(dir).listSync(recursive: recursive);
+    bool includeHidden: false, bool includeDirs: true,
+    Iterable<String> whitelist}) {
+  if (whitelist == null) whitelist = [];
+  var whitelistFilter = createFileFilter(whitelist);
 
-  isHidden(part) => part.startsWith(".") && part != "." && part != "..";
+  // This is used in some performance-sensitive paths and can list many, many
+  // files. As such, it leans more havily towards optimization as opposed to
+  // readability than most code in pub. In particular, it avoids using the path
+  // package, since re-parsing a path is very expensive relative to string
+  // operations.
+  return new Directory(dir).listSync(
+      recursive: recursive, followLinks: true).where((entity) {
+    if (!includeDirs && entity is Directory) return false;
+    if (entity is Link) return false;
+    if (includeHidden) return true;
 
-  if (!includeHidden) {
-    entities = entities.where((entity) {
-      assert(entity.path.startsWith(dir));
-      return !path.split(entity.path.substring(dir.length + 1)).any(isHidden);
-    });
-  }
+    assert(entity.path.startsWith(dir));
+    var pathInDir = entity.path.substring(dir.length);
 
-  return entities.map((entity) => entity.path).toList();
+    // If the basename is whitelisted, don't count its "/." as making the file
+    // hidden.
+    var whitelistedBasename = whitelistFilter.firstWhere(pathInDir.contains,
+        orElse: () => null);
+    if (whitelistedBasename != null) {
+      pathInDir = pathInDir.substring(
+          0, pathInDir.length - whitelistedBasename.length);
+    }
+
+    if (pathInDir.contains("/.")) return false;
+    if (Platform.operatingSystem != "windows") return true;
+    return !pathInDir.contains("\\.");
+  }).map((entity) => entity.path).toList();
 }
 
-/// Returns whether [dir] exists on the file system. This will return `true` for
-/// a symlink only if that symlink is unbroken and points to a directory.
+/// Returns whether [dir] exists on the file system.
+///
+/// This returns `true` for a symlink only if that symlink is unbroken and
+/// points to a directory.
 bool dirExists(String dir) => new Directory(dir).existsSync();
 
-/// Deletes whatever's at [path], whether it's a file, directory, or symlink. If
-/// it's a directory, it will be deleted recursively.
+/// Tries to resiliently perform [operation].
+///
+/// Some file system operations can intermittently fail on Windows because
+/// other processes are locking a file. We've seen this with virus scanners
+/// when we try to delete or move something while it's being scanned. To
+/// mitigate that, on Windows, this will retry the operation a few times if it
+/// fails.
+void _attempt(String description, void operation()) {
+  if (Platform.operatingSystem != 'windows') {
+    operation();
+    return;
+  }
+
+  getErrorReason(error) {
+    if (error.osError.errorCode == 5) {
+      return "access was denied";
+    }
+
+    if (error.osError.errorCode == 32) {
+      return "it was in use by another process";
+    }
+
+    return null;
+  }
+
+  for (var i = 0; i < 2; i++) {
+    try {
+      operation();
+      return;
+    } on FileSystemException catch (error) {
+      var reason = getErrorReason(error);
+      if (reason == null) rethrow;
+
+      log.io("Failed to $description because $reason. "
+          "Retrying in 50ms.");
+      sleep(new Duration(milliseconds: 50));
+    }
+  }
+
+  try {
+    operation();
+  } on FileSystemException catch (error) {
+    var reason = getErrorReason(error);
+    if (reason == null) rethrow;
+
+    fail("Failed to $description because $reason.\n"
+        "This may be caused by a virus scanner or having a file\n"
+        "in the directory open in another application.");
+  }
+}
+
+/// Deletes whatever's at [path], whether it's a file, directory, or symlink.
+///
+/// If it's a directory, it will be deleted recursively.
 void deleteEntry(String path) {
-  tryDeleteEntry() {
+  _attempt("delete entry", () {
     if (linkExists(path)) {
       log.io("Deleting link $path.");
       new Link(path).deleteSync();
@@ -283,39 +378,13 @@
       log.io("Deleting file $path.");
       new File(path).deleteSync();
     }
-  }
-
-  if (Platform.operatingSystem != 'windows') {
-    tryDeleteEntry();
-    return;
-  }
-
-  // On Windows, we can fail to delete an entry if it's in use by another
-  // process. The only case where we know this to cause a problem is when
-  // testing "pub serve", since it can poll a file at the same time we try to
-  // delete it in the test process (issue 16129).
-  //
-  // TODO(nweiz): Once issue 14428 is fixed for Windows, remove this special
-  // handling.
-  for (var i = 0; i < 2; i++) {
-    try {
-      tryDeleteEntry();
-    } on FileSystemException catch (error) {
-      // Errno 32 indicates that the deletion failed because the file was in
-      // use.
-      if (error.osError.errorCode != 32) rethrow;
-
-      log.io("Failed to delete entry because it was in use by another process. "
-          "Retrying in 50ms.");
-      sleep(new Duration(milliseconds: 50));
-    }
-  }
-
-  tryDeleteEntry();
+  });
 }
 
-/// "Cleans" [dir]. If that directory already exists, it will be deleted. Then a
-/// new empty directory will be created.
+/// "Cleans" [dir].
+///
+/// If that directory already exists, it is deleted. Then a new empty directory
+/// is created.
 void cleanDir(String dir) {
   if (entryExists(dir)) deleteEntry(dir);
   ensureDir(dir);
@@ -323,18 +392,21 @@
 
 /// Renames (i.e. moves) the directory [from] to [to].
 void renameDir(String from, String to) {
-  log.io("Renaming directory $from to $to.");
-  try {
-    new Directory(from).renameSync(to);
-  } on IOException catch (error) {
-    // Ensure that [to] isn't left in an inconsistent state. See issue 12436.
-    if (entryExists(to)) deleteEntry(to);
-    rethrow;
-  }
+  _attempt("rename directory", () {
+    log.io("Renaming directory $from to $to.");
+    try {
+      new Directory(from).renameSync(to);
+    } on IOException catch (error) {
+      // Ensure that [to] isn't left in an inconsistent state. See issue 12436.
+      if (entryExists(to)) deleteEntry(to);
+      rethrow;
+    }
+  });
 }
 
-/// Creates a new symlink at path [symlink] that points to [target]. Returns a
-/// [Future] which completes to the path to the symlink file.
+/// Creates a new symlink at path [symlink] that points to [target].
+///
+/// Returns a [Future] which completes to the path to the symlink file.
 ///
 /// If [relative] is true, creates a symlink with a relative path from the
 /// symlink to the target. Otherwise, uses the [target] path unmodified.
@@ -350,8 +422,11 @@
     if (Platform.operatingSystem == 'windows') {
       target = path.normalize(path.absolute(target));
     } else {
-      target = path.normalize(
-          path.relative(target, from: path.dirname(symlink)));
+      // If the directory where we're creating the symlink was itself reached
+      // by traversing a symlink, we want the relative path to be relative to
+      // it's actual location, not the one we went through to get to it.
+      var symlinkDir = canonicalize(path.dirname(symlink));
+      target = path.normalize(path.relative(target, from: symlinkDir));
     }
   }
 
@@ -360,8 +435,10 @@
 }
 
 /// Creates a new symlink that creates an alias at [symlink] that points to the
-/// `lib` directory of package [target]. If [target] does not have a `lib`
-/// directory, this shows a warning if appropriate and then does nothing.
+/// `lib` directory of package [target].
+///
+/// If [target] does not have a `lib` directory, this shows a warning if
+/// appropriate and then does nothing.
 ///
 /// If [relative] is true, creates a symlink with a relative path from the
 /// symlink to the target. Otherwise, uses the [target] path unmodified.
@@ -391,8 +468,9 @@
   }
 }
 
-/// Returns the path to the root of the Dart repository. This will throw a
-/// [StateError] if it's called when running pub from the SDK.
+/// Returns the path to the root of the Dart repository.
+///
+/// This throws a [StateError] if it's called when running pub from the SDK.
 String get repoRoot {
   if (runningFromSdk) {
     throw new StateError("Can't get the repo root from the SDK.");
@@ -405,9 +483,10 @@
 final Stream<String> stdinLines = streamToLines(
     new ByteStream(Chain.track(stdin)).toStringStream());
 
-/// Displays a message and reads a yes/no confirmation from the user. Returns
-/// a [Future] that completes to `true` if the user confirms or `false` if they
-/// do not.
+/// Displays a message and reads a yes/no confirmation from the user.
+///
+/// Returns a [Future] that completes to `true` if the user confirms or `false`
+/// if they do not.
 ///
 /// This will automatically append " (y/n)?" to the message, so [message]
 /// should just be a fragment like, "Are you sure you want to proceed".
@@ -422,8 +501,9 @@
       .then((line) => new RegExp(r"^[yY]").hasMatch(line));
 }
 
-/// Reads and discards all output from [stream]. Returns a [Future] that
-/// completes when the stream is closed.
+/// Reads and discards all output from [stream].
+///
+/// Returns a [Future] that completes when the stream is closed.
 Future drainStream(Stream stream) {
   return stream.fold(null, (x, y) {});
 }
@@ -451,9 +531,10 @@
 }
 
 // TODO(nweiz): remove this when issue 7786 is fixed.
-/// Pipes all data and errors from [stream] into [sink]. When [stream] is done,
-/// the returned [Future] is completed and [sink] is closed if [closeSink] is
-/// true.
+/// Pipes all data and errors from [stream] into [sink].
+///
+/// When [stream] is done, the returned [Future] is completed and [sink] is
+/// closed if [closeSink] is true.
 ///
 /// When an error occurs on [stream], that error is passed to [sink]. If
 /// [cancelOnError] is true, [Future] will be completed successfully and no
@@ -477,6 +558,7 @@
 }
 
 /// Spawns and runs the process located at [executable], passing in [args].
+///
 /// Returns a [Future] that will complete with the results of the process after
 /// it has ended.
 ///
@@ -488,25 +570,18 @@
   return _descriptorPool.withResource(() {
     return _doProcess(Process.run, executable, args, workingDir, environment)
         .then((result) {
-      // TODO(rnystrom): Remove this and change to returning one string.
-      List<String> toLines(String output) {
-        var lines = splitLines(output);
-        if (!lines.isEmpty && lines.last == "") lines.removeLast();
-        return lines;
-      }
-
-      var pubResult = new PubProcessResult(toLines(result.stdout),
-                                  toLines(result.stderr),
-                                  result.exitCode);
-
+      var pubResult = new PubProcessResult(
+          result.stdout, result.stderr, result.exitCode);
       log.processResult(executable, pubResult);
       return pubResult;
     });
   });
 }
 
-/// Spawns the process located at [executable], passing in [args]. Returns a
-/// [Future] that will complete with the [Process] once it's been started.
+/// Spawns the process located at [executable], passing in [args].
+///
+/// Returns a [Future] that will complete with the [Process] once it's been
+/// started.
 ///
 /// The spawned process will inherit its parent's environment variables. If
 /// [environment] is provided, that will be used to augment (not replace) the
@@ -523,6 +598,17 @@
   });
 }
 
+/// Like [runProcess], but synchronous.
+PubProcessResult runProcessSync(String executable, List<String> args,
+        {String workingDir, Map<String, String> environment}) {
+  var result = _doProcess(
+      Process.runSync, executable, args, workingDir, environment);
+  var pubResult = new PubProcessResult(
+      result.stdout, result.stderr, result.exitCode);
+  log.processResult(executable, pubResult);
+  return pubResult;
+}
+
 /// A wrapper around [Process] that exposes `dart:async`-style APIs.
 class PubProcess {
   /// The underlying `dart:io` [Process].
@@ -544,6 +630,7 @@
   Future<int> _exitCode;
 
   /// The sink used for passing data to the process's standard input stream.
+  ///
   /// Errors on this stream are surfaced through [stdinClosed], [stdout],
   /// [stderr], and [exitCode], which are all members of an [ErrorGroup].
   EventSink<List<int>> get stdin => _stdin;
@@ -607,10 +694,11 @@
     _process.kill(signal);
 }
 
-/// Calls [fn] with appropriately modified arguments. [fn] should have the same
-/// signature as [Process.start], except that the returned [Future] may have a
-/// type other than [Process].
-Future _doProcess(Function fn, String executable, List<String> args,
+/// Calls [fn] with appropriately modified arguments.
+///
+/// [fn] should have the same signature as [Process.start], except that the
+/// returned value may have any return type.
+_doProcess(Function fn, String executable, List<String> args,
     String workingDir, Map<String, String> environment) {
   // TODO(rnystrom): Should dart:io just handle this?
   // Spawning a process on Windows will not look for the executable in the
@@ -624,28 +712,39 @@
 
   log.process(executable, args, workingDir == null ? '.' : workingDir);
 
-  return Chain.track(fn(executable,
-      args,
+  return fn(executable, args,
       workingDirectory: workingDir,
-      environment: environment));
+      environment: environment);
 }
 
-/// Wraps [input] to provide a timeout. If [input] completes before
-/// [milliseconds] have passed, then the return value completes in the same way.
-/// However, if [milliseconds] pass before [input] has completed, it completes
-/// with a [TimeoutException] with [description] (which should be a fragment
-/// describing the action that timed out).
+/// Wraps [input], an asynchronous network operation to provide a timeout.
+///
+/// If [input] completes before [milliseconds] have passed, then the return
+/// value completes in the same way. However, if [milliseconds] pass before
+/// [input] has completed, it completes with a [TimeoutException] with
+/// [description] (which should be a fragment describing the action that timed
+/// out).
+///
+/// [url] is the URL being accessed asynchronously.
 ///
 /// Note that timing out will not cancel the asynchronous operation behind
 /// [input].
-Future timeout(Future input, int milliseconds, String description) {
+Future timeout(Future input, int milliseconds, Uri url, String description) {
   // TODO(nwiez): Replace this with [Future.timeout].
   var completer = new Completer();
   var duration = new Duration(milliseconds: milliseconds);
   var timer = new Timer(duration, () {
-    completer.completeError(new TimeoutException(
-        'Timed out while $description.', duration),
-        new Chain.current());
+    // Include the duration ourselves in the message instead of passing it to
+    // TimeoutException since we show nicer output.
+    var message = 'Timed out after ${niceDuration(duration)} while '
+                  '$description.';
+
+    if (url.host == "pub.dartlang.org" ||
+        url.host == "storage.googleapis.com") {
+      message += "\nThis is likely a transient error. Please try again later.";
+    }
+
+    completer.completeError(new TimeoutException(message), new Chain.current());
   });
   input.then((value) {
     if (completer.isCompleted) return;
@@ -659,10 +758,11 @@
   return completer.future;
 }
 
-/// Creates a temporary directory and passes its path to [fn]. Once the [Future]
-/// returned by [fn] completes, the temporary directory and all its contents
-/// will be deleted. [fn] can also return `null`, in which case the temporary
-/// directory is deleted immediately afterwards.
+/// Creates a temporary directory and passes its path to [fn].
+///
+/// Once the [Future] returned by [fn] completes, the temporary directory and
+/// all its contents are deleted. [fn] can also return `null`, in which case
+/// the temporary directory is deleted immediately afterwards.
 ///
 /// Returns a future that completes to the value that the future returned from
 /// [fn] completes to.
@@ -674,8 +774,18 @@
   });
 }
 
-/// Extracts a `.tar.gz` file from [stream] to [destination]. Returns whether
-/// or not the extraction was successful.
+/// Binds an [HttpServer] to [host] and [port].
+///
+/// If [host] is "localhost", this will automatically listen on both the IPv4
+/// and IPv6 loopback addresses.
+Future<HttpServer> bindServer(String host, int port) {
+  if (host == 'localhost') return HttpMultiServer.loopback(port);
+  return HttpServer.bind(host, port);
+}
+
+/// Extracts a `.tar.gz` file from [stream] to [destination].
+///
+/// Returns whether or not the extraction was successful.
 Future<bool> extractTarGz(Stream<List<int>> stream, String destination) {
   log.fine("Extracting .tar.gz stream to $destination.");
 
@@ -756,10 +866,13 @@
   });
 }
 
-/// Create a .tar.gz archive from a list of entries. Each entry can be a
-/// [String], [Directory], or [File] object. The root of the archive is
-/// considered to be [baseDir], which defaults to the current working directory.
-/// Returns a [ByteStream] that will emit the contents of the archive.
+/// Create a .tar.gz archive from a list of entries.
+///
+/// Each entry can be a [String], [Directory], or [File] object. The root of
+/// the archive is considered to be [baseDir], which defaults to the current
+/// working directory.
+///
+/// Returns a [ByteStream] that emits the contents of the archive.
 ByteStream createTarGz(List contents, {baseDir}) {
   return new ByteStream(futureStream(syncFuture(() {
     var buffer = new StringBuffer();
@@ -822,7 +935,16 @@
   final List<String> stderr;
   final int exitCode;
 
-  const PubProcessResult(this.stdout, this.stderr, this.exitCode);
+  PubProcessResult(String stdout, String stderr, this.exitCode)
+      : this.stdout = _toLines(stdout),
+        this.stderr = _toLines(stderr);
+
+  // TODO(rnystrom): Remove this and change to returning one string.
+  static List<String> _toLines(String output) {
+    var lines = splitLines(output);
+    if (!lines.isEmpty && lines.last == "") lines.removeLast();
+    return lines;
+  }
 
   bool get success => exitCode == exit_codes.SUCCESS;
 }
diff --git a/sdk/lib/_internal/pub/lib/src/log.dart b/sdk/lib/_internal/pub/lib/src/log.dart
index 0b93b3f..d364f8c 100644
--- a/sdk/lib/_internal/pub/lib/src/log.dart
+++ b/sdk/lib/_internal/pub/lib/src/log.dart
@@ -22,8 +22,8 @@
 ///     log.json.error(...);
 final json = new _JsonLogger();
 
-typedef LogFn(Entry entry);
-final Map<Level, LogFn> _loggers = new Map<Level, LogFn>();
+/// The current logging verbosity.
+Verbosity verbosity = Verbosity.NORMAL;
 
 /// In cases where there's a ton of log spew, make sure we don't eat infinite
 /// memory.
@@ -37,8 +37,13 @@
 /// [recordTranscript()] is called.
 Transcript<Entry> _transcript;
 
-/// The currently-running progress indicator or `null` if there is none.
-Progress _progress;
+/// All currently-running progress indicators.
+final _progresses = new Set<Progress>();
+
+/// The currently-animated progress indicator, if any.
+///
+/// This will also be in [_progresses].
+Progress _animatedProgress;
 
 final _cyan = getSpecial('\u001b[36m');
 final _green = getSpecial('\u001b[32m');
@@ -49,12 +54,15 @@
 final _none = getSpecial('\u001b[0m');
 final _bold = getSpecial('\u001b[1m');
 
-/// An enum type for defining the different logging levels. By default, [ERROR]
-/// and [WARNING] messages are printed to sterr. [MESSAGE] messages are printed
-/// to stdout, and others are ignored.
+/// An enum type for defining the different logging levels a given message can
+/// be associated with.
+///
+/// By default, [ERROR] and [WARNING] messages are printed to sterr. [MESSAGE]
+/// messages are printed to stdout, and others are ignored.
 class Level {
-  /// An error occurred and an operation could not be completed. Usually shown
-  /// to the user on stderr.
+  /// An error occurred and an operation could not be completed.
+  ///
+  /// Usually shown to the user on stderr.
   static const ERROR = const Level._("ERR ");
 
   /// Something unexpected happened, but the program was able to continue,
@@ -71,16 +79,92 @@
   /// Incremental output during pub's version constraint solver.
   static const SOLVER = const Level._("SLVR");
 
-  /// Fine-grained and verbose additional information. Can be used to provide
-  /// program state context for other logs (such as what pub was doing when an
-  /// IO operation occurred) or just more detail for an operation.
+  /// Fine-grained and verbose additional information.
+  ///
+  /// Used to provide program state context for other logs (such as what pub
+  /// was doing when an IO operation occurred) or just more detail for an
+  /// operation.
   static const FINE = const Level._("FINE");
 
   const Level._(this.name);
   final String name;
 
   String toString() => name;
-  int get hashCode => name.hashCode;
+}
+
+typedef _LogFn(Entry entry);
+
+/// An enum type to control which log levels are displayed and how they are
+/// displayed.
+class Verbosity {
+  /// Silence all logging.
+  static const NONE = const Verbosity._("none", const {
+    Level.ERROR:   null,
+    Level.WARNING: null,
+    Level.MESSAGE: null,
+    Level.IO:      null,
+    Level.SOLVER:  null,
+    Level.FINE:    null
+  });
+
+  /// Shows only errors and warnings.
+  static const WARNING = const Verbosity._("warning", const {
+    Level.ERROR:   _logToStderr,
+    Level.WARNING: _logToStderr,
+    Level.MESSAGE: null,
+    Level.IO:      null,
+    Level.SOLVER:  null,
+    Level.FINE:    null
+  });
+
+  /// The default verbosity which shows errors, warnings, and messages.
+  static const NORMAL = const Verbosity._("normal", const {
+    Level.ERROR:   _logToStderr,
+    Level.WARNING: _logToStderr,
+    Level.MESSAGE: _logToStdout,
+    Level.IO:      null,
+    Level.SOLVER:  null,
+    Level.FINE:    null
+  });
+
+  /// Shows errors, warnings, messages, and IO event logs.
+  static const IO = const Verbosity._("io", const {
+    Level.ERROR:   _logToStderrWithLabel,
+    Level.WARNING: _logToStderrWithLabel,
+    Level.MESSAGE: _logToStdoutWithLabel,
+    Level.IO:      _logToStderrWithLabel,
+    Level.SOLVER:  null,
+    Level.FINE:    null
+  });
+
+  /// Shows errors, warnings, messages, and version solver logs.
+  static const SOLVER = const Verbosity._("solver", const {
+    Level.ERROR:   _logToStderr,
+    Level.WARNING: _logToStderr,
+    Level.MESSAGE: _logToStdout,
+    Level.IO:      null,
+    Level.SOLVER:  _logToStdout,
+    Level.FINE:    null
+  });
+
+  /// Shows all logs.
+  static const ALL = const Verbosity._("all", const {
+    Level.ERROR:   _logToStderrWithLabel,
+    Level.WARNING: _logToStderrWithLabel,
+    Level.MESSAGE: _logToStdoutWithLabel,
+    Level.IO:      _logToStderrWithLabel,
+    Level.SOLVER:  _logToStderrWithLabel,
+    Level.FINE:    _logToStderrWithLabel
+  });
+
+  const Verbosity._(this.name, this._loggers);
+  final String name;
+  final Map<Level, _LogFn> _loggers;
+
+  /// Returns whether or not logs at [level] will be printed.
+  bool isLevelVisible(Level level) => _loggers[level] != null;
+
+  String toString() => name;
 }
 
 /// A single log entry.
@@ -121,8 +205,6 @@
 
 /// Logs [message] at [level].
 void write(Level level, message) {
-  if (_loggers.isEmpty) showNormal();
-
   var lines = splitLines(message.toString());
 
   // Discard a trailing newline. This is useful since StringBuffers often end
@@ -133,16 +215,17 @@
 
   var entry = new Entry(level, lines);
 
-  var logFn = _loggers[level];
+  var logFn = verbosity._loggers[level];
   if (logFn != null) logFn(entry);
 
   if (_transcript != null) _transcript.add(entry);
 }
 
-/// Logs an asynchronous IO operation. Logs [startMessage] before the operation
-/// starts, then when [operation] completes, invokes [endMessage] with the
-/// completion value and logs the result of that. Returns a future that
-/// completes after the logging is done.
+/// Logs an asynchronous IO operation.
+///
+/// Logs [startMessage] before the operation starts, then when [operation]
+/// completes, invokes [endMessage] with the completion value and logs the
+/// result of that. Returns a future that completes after the logging is done.
 ///
 /// If [endMessage] is omitted, then logs "Begin [startMessage]" before the
 /// operation and "End [startMessage]" after it.
@@ -222,29 +305,27 @@
 }
 
 /// Prints [message] then displays an updated elapsed time until the future
-/// returned by [callback] completes. If anything else is logged during this
-/// (include another call to [progress]) that cancels the progress.
-Future progress(String message, Future callback()) {
+/// returned by [callback] completes.
+///
+/// If anything else is logged during this (including another call to
+/// [progress]) that cancels the progress animation, although the total time
+/// will still be printed once it finishes. If [fine] is passed, the progress
+/// information will only be visible at [Level.FINE].
+Future progress(String message, Future callback(), {bool fine: false}) {
   _stopProgress();
-  _progress = new Progress(message);
+  var progress = new Progress(message, fine: fine);
+  _animatedProgress = progress;
+  _progresses.add(progress);
   return callback().whenComplete(() {
-    var message = _stopProgress();
-
-    // Add the progress message to the transcript.
-    if (_transcript != null && message != null) {
-      _transcript.add(new Entry(Level.MESSAGE, [message]));
-    }
+    progress.stop();
+    _progresses.remove(progress);
   });
 }
 
-/// Stops the running progress indicator, if currently running.
-///
-/// Returns the final progress message, if any, otherwise `null`.
-String _stopProgress() {
-  if (_progress == null) return null;
-  var message = _progress.stop();
-  _progress = null;
-  return message;
+/// Stops animating the running progress indicator, if currently running.
+void _stopProgress() {
+  if (_animatedProgress != null) _animatedProgress.stopAnimating();
+  _animatedProgress = null;
 }
 
 /// Wraps [text] in the ANSI escape codes to make it bold when on a platform
@@ -291,48 +372,6 @@
 /// do not prevent the user's goal from being reached.
 String yellow(text) => "$_yellow$text$_none";
 
-/// Sets the verbosity to "normal", which shows errors, warnings, and messages.
-void showNormal() {
-  _loggers[Level.ERROR]   = _logToStderr;
-  _loggers[Level.WARNING] = _logToStderr;
-  _loggers[Level.MESSAGE] = _logToStdout;
-  _loggers[Level.IO]      = null;
-  _loggers[Level.SOLVER]  = null;
-  _loggers[Level.FINE]    = null;
-}
-
-/// Sets the verbosity to "io", which shows errors, warnings, messages, and IO
-/// event logs.
-void showIO() {
-  _loggers[Level.ERROR]   = _logToStderrWithLabel;
-  _loggers[Level.WARNING] = _logToStderrWithLabel;
-  _loggers[Level.MESSAGE] = _logToStdoutWithLabel;
-  _loggers[Level.IO]      = _logToStderrWithLabel;
-  _loggers[Level.SOLVER]  = null;
-  _loggers[Level.FINE]    = null;
-}
-
-/// Sets the verbosity to "solver", which shows errors, warnings, messages, and
-/// solver logs.
-void showSolver() {
-  _loggers[Level.ERROR]   = _logToStderr;
-  _loggers[Level.WARNING] = _logToStderr;
-  _loggers[Level.MESSAGE] = _logToStdout;
-  _loggers[Level.IO]      = null;
-  _loggers[Level.SOLVER]  = _logToStdout;
-  _loggers[Level.FINE]    = null;
-}
-
-/// Sets the verbosity to "all", which logs ALL the things.
-void showAll() {
-  _loggers[Level.ERROR]   = _logToStderrWithLabel;
-  _loggers[Level.WARNING] = _logToStderrWithLabel;
-  _loggers[Level.MESSAGE] = _logToStdoutWithLabel;
-  _loggers[Level.IO]      = _logToStderrWithLabel;
-  _loggers[Level.SOLVER]  = _logToStderrWithLabel;
-  _loggers[Level.FINE]    = _logToStderrWithLabel;
-}
-
 /// Log function that prints the message to stdout.
 void _logToStdout(Entry entry) {
   _logToStream(stdout, entry, showLabel: false);
diff --git a/sdk/lib/_internal/pub/lib/src/oauth2.dart b/sdk/lib/_internal/pub/lib/src/oauth2.dart
index b1edba0..8de110c 100644
--- a/sdk/lib/_internal/pub/lib/src/oauth2.dart
+++ b/sdk/lib/_internal/pub/lib/src/oauth2.dart
@@ -24,8 +24,9 @@
 final _identifier = '818368855108-8grd2eg9tj9f38os6f1urbcvsq399u8n.apps.'
     'googleusercontent.com';
 
-/// The pub client's OAuth2 secret. This isn't actually meant to be kept a
-/// secret.
+/// The pub client's OAuth2 secret.
+///
+/// This isn't actually meant to be kept a secret.
 final _secret = 'SWeqj8seoJW0w7_CpEPFLX0K';
 
 /// The URL to which the user will be directed to authorize the pub client to
@@ -40,8 +41,10 @@
     '&approval_prompt=force');
 
 /// The URL from which the pub client will request an access token once it's
-/// been authorized by the user. This can be controlled externally by setting
-/// the _PUB_TEST_TOKEN_ENDPOINT environment variable.
+/// been authorized by the user.
+///
+/// This can be controlled externally by setting the `_PUB_TEST_TOKEN_ENDPOINT`
+/// environment variable.
 Uri get tokenEndpoint {
   var tokenEndpoint = Platform.environment['_PUB_TEST_TOKEN_ENDPOINT'];
   if (tokenEndpoint != null) {
@@ -53,12 +56,16 @@
 
 final _tokenEndpoint = Uri.parse('https://accounts.google.com/o/oauth2/token');
 
-/// The OAuth2 scopes that the pub client needs. Currently the client only needs
-/// the user's email so that the server can verify their identity.
+/// The OAuth2 scopes that the pub client needs.
+///
+/// Currently the client only needs the user's email so that the server can
+/// verify their identity.
 final _scopes = ['https://www.googleapis.com/auth/userinfo.email'];
 
-/// An in-memory cache of the user's OAuth2 credentials. This should always be
-/// the same as the credentials file stored in the system cache.
+/// An in-memory cache of the user's OAuth2 credentials.
+///
+/// This should always be the same as the credentials file stored in the system
+/// cache.
 Credentials _credentials;
 
 /// Delete the cached credentials, if they exist.
@@ -101,8 +108,10 @@
   });
 }
 
-/// Gets a new OAuth2 client. If saved credentials are available, those are
-/// used; otherwise, the user is prompted to authorize the pub client.
+/// Gets a new OAuth2 client.
+///
+/// If saved credentials are available, those are used; otherwise, the user is
+/// prompted to authorize the pub client.
 Future<Client> _getClient(SystemCache cache) {
   return new Future.sync(() {
     var credentials = _loadCredentials(cache);
@@ -116,8 +125,10 @@
 }
 
 /// Loads the user's OAuth2 credentials from the in-memory cache or the
-/// filesystem if possible. If the credentials can't be loaded for any reason,
-/// the returned [Future] will complete to null.
+/// filesystem if possible.
+///
+/// If the credentials can't be loaded for any reason, the returned [Future]
+/// completes to `null`.
 Credentials _loadCredentials(SystemCache cache) {
   log.fine('Loading OAuth2 credentials.');
 
@@ -157,7 +168,8 @@
     path.join(cache.rootDir, 'credentials.json');
 
 /// Gets the user to authorize pub as a client of pub.dartlang.org via oauth2.
-/// Returns a Future that will complete to a fully-authorized [Client].
+///
+/// Returns a Future that completes to a fully-authorized [Client].
 Future<Client> _authorize() {
   var grant = new AuthorizationCodeGrant(
       _identifier,
@@ -169,29 +181,28 @@
   // Spin up a one-shot HTTP server to receive the authorization code from the
   // Google OAuth2 server via redirect. This server will close itself as soon as
   // the code is received.
-  var server;
   var completer = new Completer();
-  shelf_io.serve((request) {
-    if (request.url.path != "/") {
-      return new shelf.Response.notFound('Invalid URI.');
-    }
+  bindServer('localhost', 0).then((server) {
+    shelf_io.serveRequests(server, (request) {
+      if (request.url.path != "/") {
+        return new shelf.Response.notFound('Invalid URI.');
+      }
 
-    log.message('Authorization received, processing...');
-    var queryString = request.url.query;
-    if (queryString == null) queryString = '';
+      log.message('Authorization received, processing...');
+      var queryString = request.url.query;
+      if (queryString == null) queryString = '';
 
-    // Closing the server here is safe, since it will wait until the response is
-    // sent to actually shut down.
-    server.close();
-    chainToCompleter(grant.handleAuthorizationResponse(queryToMap(queryString)),
-        completer);
+      // Closing the server here is safe, since it will wait until the response
+      // is sent to actually shut down.
+      server.close();
+      chainToCompleter(grant.handleAuthorizationResponse(queryToMap(queryString)),
+          completer);
 
-    return new shelf.Response.found('http://pub.dartlang.org/authorized');
-  }, '127.0.0.1', 0).then((server_) {
-    server = server_;
+      return new shelf.Response.found('http://pub.dartlang.org/authorized');
+    });
 
     var authUrl = grant.getAuthorizationUrl(
-        Uri.parse('http://127.0.0.1:${server.port}'), scopes: _scopes);
+        Uri.parse('http://localhost:${server.port}'), scopes: _scopes);
 
     log.message(
         'Pub needs your authorization to upload packages on your behalf.\n'
diff --git a/sdk/lib/_internal/pub/lib/src/package.dart b/sdk/lib/_internal/pub/lib/src/package.dart
index 8f6f617..4333648 100644
--- a/sdk/lib/_internal/pub/lib/src/package.dart
+++ b/sdk/lib/_internal/pub/lib/src/package.dart
@@ -4,11 +4,15 @@
 
 library pub.package;
 
+import 'dart:io';
+
 import 'package:path/path.dart' as path;
 
 import 'io.dart';
+import 'git.dart' as git;
 import 'pubspec.dart';
 import 'source_registry.dart';
+import 'utils.dart';
 import 'version.dart';
 
 final _README_REGEXP = new RegExp(r"^README($|\.)", caseSensitive: false);
@@ -72,10 +76,11 @@
   }
 
   /// Returns the path to the README file at the root of the entrypoint, or null
-  /// if no README file is found. If multiple READMEs are found, this uses the
-  /// same conventions as pub.dartlang.org for choosing the primary one: the
-  /// README with the fewest extensions that is lexically ordered first is
-  /// chosen.
+  /// if no README file is found.
+  ///
+  /// If multiple READMEs are found, this uses the same conventions as
+  /// pub.dartlang.org for choosing the primary one: the README with the fewest
+  /// extensions that is lexically ordered first is chosen.
   String get readmePath {
     var readmes = listDir(dir).map(path.basename).
         where((entry) => entry.contains(_README_REGEXP));
@@ -90,26 +95,88 @@
     }));
   }
 
-  /// Loads the package whose root directory is [packageDir]. [name] is the
-  /// expected name of that package (e.g. the name given in the dependency), or
-  /// `null` if the package being loaded is the entrypoint package.
+  /// Loads the package whose root directory is [packageDir].
+  ///
+  /// [name] is the expected name of that package (e.g. the name given in the
+  /// dependency), or `null` if the package being loaded is the entrypoint
+  /// package.
   Package.load(String name, String packageDir, SourceRegistry sources)
       : dir = packageDir,
         pubspec = new Pubspec.load(packageDir, sources, expectedName: name);
 
-  /// Constructs a package with the given pubspec. The package will have no
-  /// directory associated with it.
+  /// Constructs a package with the given pubspec.
+  ///
+  /// The package will have no directory associated with it.
   Package.inMemory(this.pubspec)
     : dir = null;
 
+  /// The basenames of files that are included in [list] despite being hidden.
+  static final _WHITELISTED_FILES = const ['.htaccess'];
+
+  /// A set of patterns that match paths to blacklisted files.
+  static final _blacklistedFiles = createFileFilter(['pubspec.lock']);
+
+  /// A set of patterns that match paths to blacklisted directories.
+  static final _blacklistedDirs = createDirectoryFilter(['packages']);
+
+  /// Returns a list of files that are considered to be part of this package.
+  ///
+  /// If this is a Git repository, this will respect .gitignore; otherwise, it
+  /// will return all non-hidden, non-blacklisted files.
+  ///
+  /// If [beneath] is passed, this will only return files beneath that path.
+  List<String> listFiles({String beneath}) {
+    if (beneath == null) beneath = dir;
+
+    // This is used in some performance-sensitive paths and can list many, many
+    // files. As such, it leans more havily towards optimization as opposed to
+    // readability than most code in pub. In particular, it avoids using the
+    // path package, since re-parsing a path is very expensive relative to
+    // string operations.
+    var files;
+    if (git.isInstalled && dirExists(path.join(dir, '.git'))) {
+      // Later versions of git do not allow a path for ls-files that appears to
+      // be outside of the repo, so make sure we give it a relative path.
+      var relativeBeneath = path.relative(beneath, from: dir);
+
+      // List all files that aren't gitignored, including those not checked in
+      // to Git.
+      files = git.runSync(
+          ["ls-files", "--cached", "--others", "--exclude-standard",
+           relativeBeneath],
+          workingDir: dir);
+      // Git always prints files relative to the repository root, but we want
+      // them relative to the working directory. It also prints forward slashes
+      // on Windows which we normalize away for easier testing.
+      files = files.map((file) {
+        if (Platform.operatingSystem != 'windows') return "$dir/$file";
+        return "$dir\\${file.replaceAll("/", "\\")}";
+      }).where((file) {
+        // Filter out broken symlinks, since git doesn't do so automatically.
+        return fileExists(file);
+      });
+    } else {
+      files = listDir(beneath, recursive: true, includeDirs: false,
+          whitelist: _WHITELISTED_FILES);
+    }
+
+    return files.where((file) {
+      file = file.substring(beneath.length);
+      return !_blacklistedFiles.any(file.endsWith) &&
+          !_blacklistedDirs.any(file.contains);
+    }).toList();
+  }
+
   /// Returns a debug string for the package.
   String toString() => '$name $version ($dir)';
 }
 
 /// This is the private base class of [PackageRef], [PackageID], and
-/// [PackageDep]. It contains functionality and state that those classes share
-/// but is private so that from outside of this library, there is no type
-/// relationship between those three types.
+/// [PackageDep].
+///
+/// It contains functionality and state that those classes share but is private
+/// so that from outside of this library, there is no type relationship between
+/// those three types.
 class _PackageName {
   _PackageName(this.name, this.source, this.description);
 
@@ -117,11 +184,14 @@
   final String name;
 
   /// The name of the [Source] used to look up this package given its
-  /// [description]. If this is a root package, this will be `null`.
+  /// [description].
+  ///
+  /// If this is a root package, this will be `null`.
   final String source;
 
-  /// The metadata used by the package's [source] to identify and locate it. It
-  /// contains whatever [Source]-specific data it needs to be able to get
+  /// The metadata used by the package's [source] to identify and locate it.
+  ///
+  /// It contains whatever [Source]-specific data it needs to be able to get
   /// the package. For example, the description of a git sourced package might
   /// by the URL "git://github.com/dart/uilib.git".
   final description;
@@ -163,8 +233,9 @@
   }
 }
 
-/// A reference to a specific version of a package. A package ID contains
-/// enough information to correctly get the package.
+/// A reference to a specific version of a package.
+///
+/// A package ID contains enough information to correctly get the package.
 ///
 /// Note that it's possible for multiple distinct package IDs to point to
 /// different packages that have identical contents. For example, the same
diff --git a/sdk/lib/_internal/pub/lib/src/package_graph.dart b/sdk/lib/_internal/pub/lib/src/package_graph.dart
index 47e1349..1491378 100644
--- a/sdk/lib/_internal/pub/lib/src/package_graph.dart
+++ b/sdk/lib/_internal/pub/lib/src/package_graph.dart
@@ -25,22 +25,4 @@
   final Map<String, Package> packages;
 
   PackageGraph(this.entrypoint, this.lockFile, this.packages);
-
-  /// Returns the set of transitive dependencies of the package named
-  /// [packageName].
-  Set<Package> transitiveDependencies(String packageName) {
-    var seen = new Set<Package>();
-    traverse(Package package) {
-      if (seen.contains(package)) return;
-      seen.add(package);
-      for (var dep in package.dependencies) {
-        traverse(packages[dep.name]);
-      }
-    }
-
-    var package = packages[packageName];
-    traverse(package);
-    seen.remove(package);
-    return seen;
-  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/progress.dart b/sdk/lib/_internal/pub/lib/src/progress.dart
index 059d480..ad1ceb2 100644
--- a/sdk/lib/_internal/pub/lib/src/progress.dart
+++ b/sdk/lib/_internal/pub/lib/src/progress.dart
@@ -8,6 +8,7 @@
 import 'dart:io';
 
 import 'log.dart' as log;
+import 'utils.dart';
 
 /// A live-updating progress indicator for long-running log entries.
 class Progress {
@@ -17,61 +18,72 @@
   /// The [Stopwatch] used to track how long a progress log has been running.
   final _stopwatch = new Stopwatch();
 
-  /// The progress message as it's being incrementally appended. When the
-  /// progress is done, a single entry will be added to the log for it.
+  /// The progress message as it's being incrementally appended.
+  ///
+  /// When the progress is done, a single entry will be added to the log for it.
   final String _message;
 
-  Progress(this._message) {
+  /// Gets the current progress time as a parenthesized, formatted string.
+  String get _time => "(${niceDuration(_stopwatch.elapsed)})";
+
+  /// Creates a new progress indicator.
+  ///
+  /// If [fine] is passed, this will log progress messages on [log.Level.FINE]
+  /// as opposed to [log.Level.MESSAGE].
+  Progress(this._message, {bool fine: false}) {
     _stopwatch.start();
 
-    if (log.json.enabled) return;
+    var level = fine ? log.Level.FINE : log.Level.MESSAGE;
 
-    // Only animate if we're writing to a TTY in human format.
-    if (stdioType(stdout) == StdioType.TERMINAL) {
-      _update();
-      _timer = new Timer.periodic(new Duration(milliseconds: 100), (_) {
-        _update();
-      });
-    } else {
-      stdout.write("$_message... ");
+    // The animation is only shown when it would be meaningful to a human.
+    // That means we're writing a visible message to a TTY at normal log levels
+    // with non-JSON output.
+    if (stdioType(stdout) != StdioType.TERMINAL ||
+        !log.verbosity.isLevelVisible(level) ||
+        log.json.enabled || fine ||
+        log.verbosity.isLevelVisible(log.Level.FINE)) {
+      // Not animating, so just log the start and wait until the task is
+      // completed.
+      log.write(level, "$_message...");
+      return;
     }
+
+    _update();
+    _timer = new Timer.periodic(new Duration(milliseconds: 100), (_) {
+      _update();
+    });
   }
 
   /// Stops the progress indicator.
-  ///
-  /// Returns the complete final progress message.
-  String stop() {
+  void stop() {
     _stopwatch.stop();
 
-    // If we aren't animating, just log the final time.
-    if (log.json.enabled) {
-      // Do nothing.
-    } else if (_timer == null) {
-      stdout.writeln(_time);
-    } else {
-      _timer.cancel();
+    // Always log the final time as [log.fine] because for the most part normal
+    // users don't care about the precise time information beyond what's shown
+    // in the animation.
+    log.fine("$_message finished $_time.");
 
-      // Show one final update.
-      _update();
-      stdout.writeln();
-    }
-
-    return "$_message... ${_time}";
+    // If we were animating, print one final update to show the user the final
+    // time.
+    if (_timer == null) return;
+    _timer.cancel();
+    _timer = null;
+    _update();
+    stdout.writeln();
   }
 
-  /// Gets the current progress time as a parenthesized, formatted string.
-  String get _time {
-    var elapsed = _stopwatch.elapsed;
-    var time = "(";
+  /// Stop animating the progress indicator.
+  ///
+  /// This will continue running the stopwatch so that the full time can be
+  /// logged in [stop].
+  void stopAnimating() {
+    if (_timer == null) return;
 
-    // TODO(rnystrom): Move this somewhere reusable.
-    if (elapsed.inMinutes > 0) {
-      time += "${elapsed.inMinutes}:";
-    }
-
-    var s = elapsed.inSeconds % 59;
-    var ms = (elapsed.inMilliseconds % 1000) ~/ 100;
-    return time + "$s.${ms}s)";
+    // Print a final message without a time indicator so that we don't leave a
+    // misleading half-complete time indicator on the console.
+    stdout.writeln("\r$_message...");
+    _timer.cancel();
+    _timer = null;
   }
 
   /// Refreshes the progress line.
diff --git a/sdk/lib/_internal/pub/lib/src/pubspec.dart b/sdk/lib/_internal/pub/lib/src/pubspec.dart
index 8c29253..3291b34 100644
--- a/sdk/lib/_internal/pub/lib/src/pubspec.dart
+++ b/sdk/lib/_internal/pub/lib/src/pubspec.dart
@@ -4,10 +4,12 @@
 
 library pub.pubspec;
 
-import 'package:yaml/yaml.dart';
 import 'package:path/path.dart' as path;
+import 'package:source_maps/source_maps.dart';
+import 'package:yaml/yaml.dart';
 
-import 'barback.dart';
+import 'barback/transformer_config.dart';
+import 'exceptions.dart';
 import 'io.dart';
 import 'package.dart';
 import 'source_registry.dart';
@@ -22,7 +24,7 @@
 /// [allErrors].
 class Pubspec {
   // If a new lazily-initialized field is added to this class and the
-  // initialization can throw a [PubspecError], that error should also be
+  // initialization can throw a [PubspecException], that error should also be
   // exposed through [allErrors].
 
   /// The registry of sources to use when parsing [dependencies] and
@@ -35,12 +37,14 @@
   /// The location from which the pubspec was loaded.
   ///
   /// This can be null if the pubspec was created in-memory or if its location
-  /// is unknown or can't be represented by a Uri.
-  final Uri _location;
+  /// is unknown.
+  Uri get _location => fields.span.sourceUrl == null ? null :
+      Uri.parse(fields.span.sourceUrl);
 
-  /// All pubspec fields. This includes the fields from which other properties
-  /// are derived.
-  final Map fields;
+  /// All pubspec fields.
+  ///
+  /// This includes the fields from which other properties are derived.
+  final YamlMap fields;
 
   /// The package's name.
   String get name {
@@ -48,11 +52,11 @@
 
     var name = fields['name'];
     if (name == null) {
-      throw new PubspecException(null, _location,
-          'Missing the required "name" field.');
+      throw new PubspecException(
+          'Missing the required "name" field.', fields.span);
     } else if (name is! String) {
-      throw new PubspecException(null, _location,
-          '"name" field must be a string, but was "$name".');
+      throw new PubspecException(
+          '"name" field must be a string.', fields.nodes['name'].span);
     }
 
     _name = name;
@@ -69,11 +73,13 @@
       _version = Version.none;
       return _version;
     }
+
+    var span = fields.nodes['version'].span;
     if (version is! String) {
-      _error('"version" field must be a string, but was "$version".');
+      _error('"version" field must be a string.', span);
     }
 
-    _version = _wrapFormatException('version number', 'version',
+    _version = _wrapFormatException('version number', span,
         () => new Version.parse(version));
     return _version;
   }
@@ -113,8 +119,8 @@
   }
   List<PackageDep> _dependencyOverrides;
 
-  /// The ids of the transformers to use for this package.
-  List<Set<TransformerId>> get transformers {
+  /// The configurations of the transformers to use for this package.
+  List<Set<TransformerConfig>> get transformers {
     if (_transformers != null) return _transformers;
 
     var transformers = fields['transformers'];
@@ -124,65 +130,64 @@
     }
 
     if (transformers is! List) {
-      _error('"transformers" field must be a list, but was "$transformers".');
+      _error('"transformers" field must be a list.',
+          fields.nodes['transformers'].span);
     }
 
     var i = 0;
-    _transformers = transformers.map((phase) {
-      var field = "transformers";
-      if (phase is! List) {
-        phase = [phase];
-      } else {
-        field = "$field[${i++}]";
-      }
-
-      return phase.map((transformer) {
+    _transformers = transformers.nodes.map((phase) {
+      var phaseNodes = phase is YamlList ? phase.nodes : [phase];
+      return phaseNodes.map((transformerNode) {
+        var transformer = transformerNode.value;
         if (transformer is! String && transformer is! Map) {
-          _error('"$field" field must be a string or map, but was '
-              '"$transformer".');
+          _error('A transformer must be a string or map.',
+                 transformerNode.span);
         }
 
-        var library;
-        var configuration;
+        var libraryNode;
+        var configurationNode;
         if (transformer is String) {
-          library = transformer;
+          libraryNode = transformerNode;
         } else {
           if (transformer.length != 1) {
-            _error('"$field" must have a single key: the transformer '
-                'identifier. Was "$transformer".');
+            _error('A transformer map must have a single key: the transformer '
+                'identifier.', transformerNode.span);
           } else if (transformer.keys.single is! String) {
-            _error('"$field" transformer identifier must be a string, but was '
-                '"$library".');
+            _error('A transformer identifier must be a string.',
+                transformer.nodes.keys.single.span);
           }
 
-          library = transformer.keys.single;
-          configuration = transformer.values.single;
-          if (configuration is! Map) {
-            _error('"$field.$library" field must be a map, but was '
-                '"$configuration".');
+          libraryNode = transformer.nodes.keys.single;
+          configurationNode = transformer.nodes.values.single;
+          if (configurationNode is! YamlMap) {
+            _error("A transformer's configuration must be a map.",
+                configurationNode.span);
           }
         }
 
-        var id = _wrapFormatException("transformer configuration",
-            "$field.$library",
-            () => new TransformerId.parse(library, configuration));
+        var config = _wrapSpanFormatException('transformer config', () {
+          return new TransformerConfig.parse(
+            libraryNode.value, libraryNode.span,
+            configurationNode);
+        });
 
-        if (id.package != name &&
-            !id.isBuiltInTransformer &&
-            !dependencies.any((ref) => ref.name == id.package) &&
-            !devDependencies.any((ref) => ref.name == id.package) &&
-            !dependencyOverrides.any((ref) => ref.name == id.package)) {
-          _error('"$field.$library" refers to a package that\'s not a '
-              'dependency.');
+        var package = config.id.package;
+        if (package != name &&
+            !config.id.isBuiltInTransformer &&
+            !dependencies.any((ref) => ref.name == package) &&
+            !devDependencies.any((ref) => ref.name == package) &&
+            !dependencyOverrides.any((ref) => ref.name == package)) {
+          _error('"$package" is not a dependency.',
+              libraryNode.span);
         }
 
-        return id;
+        return config;
       }).toSet();
     }).toList();
 
     return _transformers;
   }
-  List<Set<TransformerId>> _transformers;
+  List<Set<TransformerConfig>> _transformers;
 
   /// The environment-related metadata.
   PubspecEnvironment get environment {
@@ -195,11 +200,12 @@
     }
 
     if (yaml is! Map) {
-      _error('"environment" field must be a map, but was "$yaml".');
+      _error('"environment" field must be a map.',
+             fields.nodes['environment'].span);
     }
 
     _environment = new PubspecEnvironment(
-        _parseVersionConstraint(yaml['sdk'], 'environment.sdk'));
+        _parseVersionConstraint(yaml.nodes['sdk']));
     return _environment;
   }
   PubspecEnvironment _environment;
@@ -217,35 +223,28 @@
     var pubspecPath = path.join(packageDir, 'pubspec.yaml');
     var pubspecUri = path.toUri(pubspecPath);
     if (!fileExists(pubspecPath)) {
-      throw new PubspecException(expectedName, pubspecUri,
-          'Could not find a file named "pubspec.yaml" in "$packageDir".');
+      fail('Could not find a file named "pubspec.yaml" in "$packageDir".');
     }
 
-    try {
-      return new Pubspec.parse(readTextFile(pubspecPath), sources,
-          expectedName: expectedName, location: pubspecUri);
-    } on YamlException catch (error) {
-      throw new PubspecException(expectedName, pubspecUri, error.toString());
-    }
+    return new Pubspec.parse(readTextFile(pubspecPath), sources,
+        expectedName: expectedName, location: pubspecUri);
   }
 
   Pubspec(this._name, this._version, this._dependencies, this._devDependencies,
           this._dependencyOverrides, this._environment, this._transformers,
           [Map fields])
-    : this.fields = fields == null ? {} : fields,
-      _sources = null,
-      _location = null;
+    : this.fields = fields == null ? new YamlMap() : fields,
+      _sources = null;
 
   Pubspec.empty()
     : _sources = null,
-      _location = null,
       _name = null,
       _version = Version.none,
       _dependencies = <PackageDep>[],
       _devDependencies = <PackageDep>[],
       _environment = new PubspecEnvironment(),
-      _transformers = <Set<TransformerId>>[],
-      fields = {};
+      _transformers = <Set<TransformerConfig>>[],
+      fields = new YamlMap();
 
   /// Returns a Pubspec object for an already-parsed map representing its
   /// contents.
@@ -254,52 +253,36 @@
   /// field, this will throw a [PubspecError].
   ///
   /// [location] is the location from which this pubspec was loaded.
-  Pubspec.fromMap(this.fields, this._sources, {String expectedName,
+  Pubspec.fromMap(Map fields, this._sources, {String expectedName,
       Uri location})
-      : _location = location {
-    if (expectedName == null) return;
-
+      : fields = fields is YamlMap ? fields : new YamlMap.wrap(fields,
+          sourceName: location == null ? null : location.toString()) {
     // If [expectedName] is passed, ensure that the actual 'name' field exists
     // and matches the expectation.
+    if (expectedName == null) return;
+    if (name == expectedName) return;
 
-    // If the 'name' field doesn't exist, manually throw an exception rather
-    // than relying on the exception thrown by [name] so that we can provide a
-    // suggested fix.
-    if (fields['name'] == null) {
-      throw new PubspecException(expectedName, _location,
-          'Missing the required "name" field (e.g. "name: $expectedName").');
-    }
-
-    try {
-      if (name == expectedName) return;
-      throw new PubspecException(expectedName, _location,
-          '"name" field "$name" doesn\'t match expected name '
-          '"$expectedName".');
-    } on PubspecException catch (e) {
-      // Catch and re-throw any exceptions thrown by [name] so that they refer
-      // to [expectedName] for additional context.
-      throw new PubspecException(expectedName, e.location,
-          split1(e.message, '\n').last);
-    }
+    throw new PubspecException('"name" field doesn\'t match expected name '
+        '"$expectedName".', this.fields.nodes["name"].span);
   }
 
-  /// Parses the pubspec stored at [filePath] whose text is [contents]. If the
-  /// pubspec doesn't define version for itself, it defaults to [Version.none].
-  /// [filePath] may be `null` if the pubspec is not on the user's local
-  /// file system.
+  /// Parses the pubspec stored at [filePath] whose text is [contents].
+  ///
+  /// If the pubspec doesn't define a version for itself, it defaults to
+  /// [Version.none].
   factory Pubspec.parse(String contents, SourceRegistry sources,
       {String expectedName, Uri location}) {
     if (contents.trim() == '') return new Pubspec.empty();
 
-    var parsedPubspec = loadYaml(contents);
-    if (parsedPubspec == null) return new Pubspec.empty();
-
-    if (parsedPubspec is! Map) {
-      throw new PubspecException(expectedName, location,
-          'The pubspec must be a YAML mapping.');
+    var pubspecNode = loadYamlNode(contents, sourceName: location.toString());
+    if (pubspecNode is YamlScalar && pubspecNode.value == null) {
+      pubspecNode = new YamlMap();
+    } else if (pubspecNode is! YamlMap) {
+      throw new PubspecException(
+          'The pubspec must be a YAML mapping.', pubspecNode.span);
     }
 
-    return new Pubspec.fromMap(parsedPubspec, sources,
+    return new Pubspec.fromMap(pubspecNode, sources,
         expectedName: expectedName, location: location);
   }
 
@@ -334,65 +317,72 @@
     // Allow an empty dependencies key.
     if (yaml == null) return dependencies;
 
-    if (yaml is! Map || yaml.keys.any((e) => e is! String)) {
-      _error('"$field" field should be a map of package names, but was '
-          '"$yaml".');
+    if (yaml is! Map) {
+      _error('"$field" field must be a map.', fields.nodes[field].span);
     }
 
-    yaml.forEach((name, spec) {
+    var nonStringNode = yaml.nodes.keys.firstWhere((e) => e.value is! String,
+        orElse: () => null);
+    if (nonStringNode != null) {
+      _error('A dependency name must be a string.', nonStringNode.span);
+    }
+
+    yaml.nodes.forEach((nameNode, specNode) {
+      var name = nameNode.value;
+      var spec = specNode.value;
       if (fields['name'] != null && name == this.name) {
-        _error('"$field.$name": Package may not list itself as a '
-            'dependency.');
+        _error('A package may not list itself as a dependency.',
+            nameNode.span);
       }
 
-      var description;
+      var descriptionNode;
       var sourceName;
 
       var versionConstraint = new VersionRange();
       if (spec == null) {
-        description = name;
+        descriptionNode = nameNode;
         sourceName = _sources.defaultSource.name;
       } else if (spec is String) {
-        description = name;
+        descriptionNode = nameNode;
         sourceName = _sources.defaultSource.name;
-        versionConstraint = _parseVersionConstraint(spec, "$field.$name");
+        versionConstraint = _parseVersionConstraint(specNode);
       } else if (spec is Map) {
         // Don't write to the immutable YAML map.
         spec = new Map.from(spec);
 
         if (spec.containsKey('version')) {
-          versionConstraint = _parseVersionConstraint(spec.remove('version'),
-              "$field.$name.version");
+          spec.remove('version');
+          versionConstraint = _parseVersionConstraint(
+              specNode.nodes['version']);
         }
 
         var sourceNames = spec.keys.toList();
         if (sourceNames.length > 1) {
-          _error('"$field.$name" field may only have one source, but it had '
-              '${toSentence(sourceNames)}.');
+          _error('A dependency may only have one source.', specNode.span);
         }
 
         sourceName = sourceNames.single;
         if (sourceName is! String) {
-          _error('"$field.$name" source name must be a string, but was '
-              '"$sourceName".');
+          _error('A source name must be a string.',
+              specNode.nodes.keys.single.span);
         }
 
-        description = spec[sourceName];
+        descriptionNode = specNode.nodes[sourceName];
       } else {
-        _error('"$field.$name" field must be a string or a mapping.');
+        _error('A dependency specification must be a string or a mapping.',
+            specNode.span);
       }
 
       // Let the source validate the description.
-      var descriptionField = "$field.$name";
-      if (spec is Map) descriptionField = "$descriptionField.$sourceName";
-      _wrapFormatException('description', descriptionField, () {
+      var description = _wrapFormatException('description',
+          descriptionNode.span, () {
         var pubspecPath;
         if (_location != null && _isFileUri(_location)) {
           pubspecPath = path.fromUri(_location);
         }
 
-        description = _sources[sourceName].parseDescription(
-            pubspecPath, description, fromLockFile: false);
+        return _sources[sourceName].parseDescription(
+            pubspecPath, descriptionNode.value, fromLockFile: false);
       });
 
       dependencies.add(new PackageDep(
@@ -402,21 +392,19 @@
     return dependencies;
   }
 
-  /// Parses [yaml] to a [VersionConstraint].
-  ///
-  /// If [yaml] is `null`, returns [VersionConstraint.any].
-  VersionConstraint _parseVersionConstraint(yaml, String field) {
-    if (yaml == null) return VersionConstraint.any;
-    if (yaml is! String) {
-      _error('"$field" must be a string, but was "$yaml".');
+  /// Parses [node] to a [VersionConstraint].
+  VersionConstraint _parseVersionConstraint(YamlNode node) {
+    if (node.value == null) return VersionConstraint.any;
+    if (node.value is! String) {
+      _error('A version constraint must be a string.', node.span);
     }
 
-    return _wrapFormatException('version constraint', field,
-        () => new VersionConstraint.parse(yaml));
+    return _wrapFormatException('version constraint', node.span,
+        () => new VersionConstraint.parse(node.value));
   }
 
-  // Make sure the same package doesn't appear as both a regular and dev
-  // dependency.
+  /// Makes sure the same package doesn't appear as both a regular and dev
+  /// dependency.
   void _checkDependencyOverlap(List<PackageDep> dependencies,
       List<PackageDep> devDependencies) {
     var dependencyNames = dependencies.map((dep) => dep.name).toSet();
@@ -424,27 +412,41 @@
         devDependencies.map((dep) => dep.name).toSet());
     if (collisions.isEmpty) return;
 
+    var span = fields["dependencies"].nodes.keys
+        .firstWhere((key) => collisions.contains(key.value)).span;
+
+    // TODO(nweiz): associate source range info with PackageDeps and use it
+    // here.
     _error('${pluralize('Package', collisions.length)} '
         '${toSentence(collisions.map((package) => '"$package"'))} cannot '
-        'appear in both "dependencies" and "dev_dependencies".');
+        'appear in both "dependencies" and "dev_dependencies".',
+        span);
   }
 
   /// Runs [fn] and wraps any [FormatException] it throws in a
   /// [PubspecException].
   ///
   /// [description] should be a noun phrase that describes whatever's being
-  /// parsed or processed by [fn]. [field] should be the location of whatever's
+  /// parsed or processed by [fn]. [span] should be the location of whatever's
   /// being processed within the pubspec.
-  _wrapFormatException(String description, String field, fn()) {
+  _wrapFormatException(String description, Span span, fn()) {
     try {
       return fn();
     } on FormatException catch (e) {
-      _error('Invalid $description for "$field": ${e.message}');
+      _error('Invalid $description: ${e.message}', span);
+    }
+  }
+
+  _wrapSpanFormatException(String description, fn()) {
+    try {
+      return fn();
+    } on SpanFormatException catch (e) {
+      _error('Invalid $description: ${e.message}', e.span);
     }
   }
 
   /// Throws a [PubspecException] with the given message.
-  void _error(String message) {
+  void _error(String message, Span span) {
     var name;
     try {
       name = this.name;
@@ -452,12 +454,13 @@
       // [name] is null.
     }
 
-    throw new PubspecException(name, _location, message);
+    throw new PubspecException(message, span);
   }
 }
 
-/// The environment-related metadata in the pubspec. Corresponds to the data
-/// under the "environment:" key in the pubspec.
+/// The environment-related metadata in the pubspec.
+///
+/// Corresponds to the data under the "environment:" key in the pubspec.
 class PubspecEnvironment {
   /// The version constraint specifying which SDK versions this package works
   /// with.
@@ -470,46 +473,10 @@
 /// An exception thrown when parsing a pubspec.
 ///
 /// These exceptions are often thrown lazily while accessing pubspec properties.
-/// Their string representation contains additional contextual information about
-/// the pubspec for which parsing failed.
-class PubspecException extends ApplicationException {
-  /// The name of the package that the pubspec is for.
-  ///
-  /// This can be null if the pubspec didn't specify a name and no external name
-  /// was provided.
-  final String name;
-
-  /// The location of the pubspec.
-  ///
-  /// This can be null if the pubspec has no physical location, or if the
-  /// location is unknown.
-  final Uri location;
-
-  PubspecException(String name, Uri location, String subMessage)
-      : this.name = name,
-        this.location = location,
-        super(_computeMessage(name, location, subMessage));
-
-  static String _computeMessage(String name, Uri location, String subMessage) {
-    var str = 'Error in';
-
-    if (name != null) {
-      str += ' pubspec for package "$name"';
-      if (location != null) str += ' loaded from';
-    } else if (location == null) {
-      str += ' pubspec for an unknown package';
-    }
-
-    if (location != null) {
-      if (_isFileUri(location)) {
-        str += ' ${nicePath(path.fromUri(location))}';
-      } else {
-        str += ' $location';
-      }
-    }
-
-    return "$str:\n$subMessage";
-  }
+class PubspecException extends SpanFormatException
+    implements ApplicationException {
+  PubspecException(String message, Span span)
+      : super(message, span);
 }
 
 /// Returns whether [uri] is a file URI.
diff --git a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
index 552cc6d..44a9c7d 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
@@ -2,11 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// A back-tracking depth-first solver. Attempts to find the best solution for
-/// a root package's transitive dependency graph, where a "solution" is a set
-/// of concrete package versions. A valid solution will select concrete
-/// versions for every package reached from the root package's dependency graph,
-/// and each of those packages will fit the version constraints placed on it.
+/// A back-tracking depth-first solver.
+///
+/// Attempts to find the best solution for a root package's transitive
+/// dependency graph, where a "solution" is a set of concrete package versions.
+/// A valid solution will select concrete versions for every package reached
+/// from the root package's dependency graph, and each of those packages will
+/// fit the version constraints placed on it.
 ///
 /// The solver builds up a solution incrementally by traversing the dependency
 /// graph starting at the root package. When it reaches a new package, it gets
@@ -37,6 +39,7 @@
 import 'dart:collection' show Queue;
 
 import '../barback.dart' as barback;
+import '../exceptions.dart';
 import '../lock_file.dart';
 import '../log.dart' as log;
 import '../package.dart';
@@ -50,9 +53,11 @@
 import 'version_queue.dart';
 import 'version_solver.dart';
 
-/// The top-level solver. Keeps track of the current potential solution, and
-/// the other possible versions for speculative package selections. Backtracks
-/// and advances to the next potential solution in the case of a failure.
+/// The top-level solver.
+///
+/// Keeps track of the current potential solution, and the other possible
+/// versions for speculative package selections. Backtracks and advances to the
+/// next potential solution in the case of a failure.
 class BacktrackingSolver {
   final SourceRegistry sources;
   final Package root;
@@ -62,8 +67,10 @@
 
   final PubspecCache cache;
 
-  /// The set of packages that are being explicitly upgraded. The solver will
-  /// only allow the very latest version for each of these packages.
+  /// The set of packages that are being explicitly upgraded.
+  ///
+  /// The solver will only allow the very latest version for each of these
+  /// packages.
   final _forceLatest = new Set<String>();
 
   /// If this is set, the contents of [lockFile] are ignored while solving.
@@ -76,6 +83,9 @@
   /// to use the one here.
   final _overrides = new Map<String, PackageDep>();
 
+  /// The package versions currently selected by the solver, along with the
+  /// versions which are remaining to be tried.
+  ///
   /// Every time a package is encountered when traversing the dependency graph,
   /// the solver must select a version for it, sometimes when multiple versions
   /// are valid. This keeps track of which versions have been selected so far
@@ -113,8 +123,10 @@
     }
   }
 
-  /// Run the solver. Completes with a list of specific package versions if
-  /// successful or an error if it failed to find a solution.
+  /// Run the solver.
+  ///
+  /// Completes with a list of specific package versions if successful or an
+  /// error if it failed to find a solution.
   Future<SolveResult> solve() {
     var stopwatch = new Stopwatch();
 
@@ -177,10 +189,11 @@
   }
 
   /// Adds [versions], which is the list of all allowed versions of a given
-  /// package, to the set of versions to consider for solutions. The first item
-  /// in the list will be the currently selected version of that package.
-  /// Subsequent items will be tried if it the current selection fails. Returns
-  /// the first selected version.
+  /// package, to the set of versions to consider for solutions.
+  ///
+  /// The first item in the list will be the currently selected version of that
+  /// package. Subsequent items will be tried if it the current selection fails.
+  /// Returns the first selected version.
   PackageId select(VersionQueue versions) {
     _selected.add(versions);
     logSolve();
@@ -201,8 +214,9 @@
     return null;
   }
 
-  /// Gets the version of [package] currently locked in the lock file. Returns
-  /// `null` if it isn't in the lockfile (or has been unlocked).
+  /// Gets the version of [package] currently locked in the lock file.
+  ///
+  /// Returns `null` if it isn't in the lockfile (or has been unlocked).
   PackageId getLocked(String package) {
     if (_upgradeAll) return null;
     if (_forceLatest.contains(package)) return null;
@@ -211,10 +225,12 @@
   }
 
   /// Traverses the root package's dependency graph using the current potential
-  /// solution. If successful, completes to the solution. If not, backtracks
-  /// to the most recently selected version of a package and tries the next
-  /// version of it. If there are no more versions, continues to backtrack to
-  /// previous selections, and so on. If there is nothing left to backtrack to,
+  /// solution.
+  ///
+  /// If successful, completes to the solution. If not, backtracks to the most
+  /// recently selected version of a package and tries the next version of it.
+  /// If there are no more versions, continues to backtrack to previous
+  /// selections, and so on. If there is nothing left to backtrack to,
   /// completes to the last failure that occurred.
   Future<List<PackageId>> _traverseSolution() => resetStack(() {
     return new Traverser(this).traverse().catchError((error) {
@@ -233,9 +249,11 @@
   });
 
   /// Backtracks from the current failed solution and determines the next
-  /// solution to try. If possible, it will backjump based on the cause of the
-  /// [failure] to minize backtracking. Otherwise, it will simply backtrack to
-  /// the next possible solution.
+  /// solution to try.
+  ///
+  /// If possible, it will backjump based on the cause of the [failure] to
+  /// minize backtracking. Otherwise, it will simply backtrack to the next
+  /// possible solution.
   ///
   /// Returns `true` if there is a new solution to try.
   Future<bool> _backtrack(SolveFailure failure) {
@@ -278,9 +296,10 @@
   }
 
   /// Walks the selected packages from most to least recent to determine which
-  /// ones can be ignored and jumped over by the backtracker. The only packages
-  /// we need to backtrack to are ones that led (possibly indirectly) to the
-  /// failure. Everything else can be skipped.
+  /// ones can be ignored and jumped over by the backtracker.
+  ///
+  /// The only packages we need to backtrack to are ones that led (possibly
+  /// indirectly) to the failure. Everything else can be skipped.
   void _backjump(SolveFailure failure) {
     for (var i = _selected.length - 1; i >= 0; i--) {
       // Each queue will never be empty since it gets discarded by _backtrack()
@@ -382,8 +401,9 @@
     log.solver(buffer.toString().trim());
   }
 
-  /// Logs [message] in the context of the current selected packages. If
-  /// [message] is omitted, just logs a description of leaf-most selection.
+  /// Logs [message] in the context of the current selected packages.
+  ///
+  /// If [message] is omitted, just logs a description of leaf-most selection.
   void logSolve([String message]) {
     if (message == null) {
       if (_selected.isEmpty) {
@@ -404,26 +424,32 @@
 
 /// Given the solver's current set of selected package versions, this tries to
 /// traverse the dependency graph and see if a complete set of valid versions
-/// has been chosen. If it reaches a conflict, it will fail and stop
-/// traversing. If it reaches a package that isn't selected it will refine the
-/// solution by adding that package's set of allowed versions to the solver and
-/// then select the best one and continue.
+/// has been chosen.
+///
+/// If it reaches a conflict, it fails and stops traversing. If it reaches a
+/// package that isn't selected, it refines the solution by adding that
+/// package's set of allowed versions to the solver and then select the best
+/// one and continuing.
 class Traverser {
   final BacktrackingSolver _solver;
 
-  /// The queue of packages left to traverse. We do a breadth-first traversal
-  /// using an explicit queue just to avoid the code complexity of a recursive
-  /// asynchronous traversal.
+  /// The queue of packages left to traverse.
+  ///
+  /// We do a breadth-first traversal using an explicit queue just to avoid the
+  /// code complexity of a recursive asynchronous traversal.
   final _packages = new Queue<PackageId>();
 
-  /// The packages we have already traversed. Used to avoid traversing the same
-  /// package multiple times, and to build the complete solution results.
+  /// The packages we have already traversed.
+  ///
+  /// Used to avoid traversing the same package multiple times, and to build
+  /// the complete solution results.
   final _visited = new Set<PackageId>();
 
-  /// The dependencies visited so far in the traversal. For each package name
-  /// (the map key) we track the list of dependencies that other packages have
-  /// placed on it so that we can calculate the complete constraint for shared
-  /// dependencies.
+  /// The dependencies visited so far in the traversal.
+  ///
+  /// For each package name (the map key) we track the list of dependencies
+  /// that other packages have placed on it so that we can calculate the
+  /// complete constraint for shared dependencies.
   final _dependencies = <String, List<Dependency>>{};
 
   Traverser(this._solver);
@@ -436,10 +462,11 @@
     return _traversePackage();
   }
 
-  /// Traverses the next package in the queue. Completes to a list of package
-  /// IDs if the traversal completed successfully and found a solution.
-  /// Completes to an error if the traversal failed. Otherwise, recurses to the
-  /// next package in the queue, etc.
+  /// Traverses the next package in the queue.
+  ///
+  /// Completes to a list of package IDs if the traversal completed
+  /// successfully and found a solution. Completes to an error if the traversal
+  /// failed. Otherwise, recurses to the next package in the queue, etc.
   Future<List<PackageId>> _traversePackage() {
     if (_packages.isEmpty) {
       // We traversed the whole graph. If we got here, we successfully found
@@ -476,7 +503,7 @@
 
         // Not overridden.
         return dep;
-      });
+      }).toSet();
 
       // Make sure the package doesn't have any bad dependencies.
       for (var dep in deps) {
@@ -487,6 +514,12 @@
       }
 
       return _traverseDeps(id, new DependencyQueue(_solver, deps));
+    }).catchError((error) {
+      if (error is! PackageNotFoundException) throw error;
+
+      // We can only get here if the lockfile refers to a specific package
+      // version that doesn't exist (probably because it was yanked).
+      throw new NoVersionException(id.name, null, id.version, []);
     });
   }
 
@@ -597,9 +630,10 @@
   }
 
   /// Ensures that dependency [dep] from [depender] is consistent with the
-  /// other dependencies on the same package. Throws a [SolveFailure]
-  /// exception if not. Only validates sources and descriptions, not the
-  /// version.
+  /// other dependencies on the same package.
+  ///
+  /// Throws a [SolveFailure] exception if not. Only validates sources and
+  /// descriptions, not the version.
   void _validateDependency(PackageDep dep, PackageId depender) {
     // Make sure the dependencies agree on source and description.
     var required = _getRequired(dep.name);
@@ -624,10 +658,11 @@
   }
 
   /// Validates the currently selected package against the new dependency that
-  /// [dep] and [constraint] place on it. Returns `null` if there is no
-  /// currently selected package, throws a [SolveFailure] if the new reference
-  /// it not does not allow the previously selected version, or returns the
-  /// selected package if successful.
+  /// [dep] and [constraint] place on it.
+  ///
+  /// Returns `null` if there is no currently selected package, throws a
+  /// [SolveFailure] if the new reference it not does not allow the previously
+  /// selected version, or returns the selected package if successful.
   PackageId _validateSelected(PackageDep dep, VersionConstraint constraint) {
     var selected = _solver.getSelected(dep.name);
     if (selected == null) return null;
@@ -642,17 +677,19 @@
     return selected;
   }
 
-  /// Gets the list of dependencies for package [name]. Will create an empty
-  /// list if needed.
+  /// Gets the list of dependencies for package [name].
+  ///
+  /// Creates an empty list if needed.
   List<Dependency> _getDependencies(String name) {
     return _dependencies.putIfAbsent(name, () => <Dependency>[]);
   }
 
-  /// Gets a "required" reference to the package [name]. This is the first
-  /// non-root dependency on that package. All dependencies on a package must
-  /// agree on source and description, except for references to the root
-  /// package. This will return a reference to that "canonical" source and
-  /// description, or `null` if there is no required reference yet.
+  /// Gets a "required" reference to the package [name].
+  ///
+  /// This is the first non-root dependency on that package. All dependencies
+  /// on a package must agree on source and description, except for references
+  /// to the root package. This will return a reference to that "canonical"
+  /// source and description, or `null` if there is no required reference yet.
   ///
   /// This is required because you may have a circular dependency back onto the
   /// root package. That second dependency won't be a root dependency and it's
@@ -676,7 +713,9 @@
 
   /// Gets the package [name] that's currently contained in the lockfile if it
   /// meets [constraint] and has the same source and description as other
-  /// references to that package. Returns `null` otherwise.
+  /// references to that package.
+  ///
+  /// Returns `null` otherwise.
   PackageId _getValidLocked(String name) {
     var package = _solver.getLocked(name);
     if (package == null) return null;
@@ -703,7 +742,9 @@
 }
 
 /// Ensures that if [pubspec] has an SDK constraint, then it is compatible
-/// with the current SDK. Throws a [SolveFailure] if not.
+/// with the current SDK.
+///
+/// Throws a [SolveFailure] if not.
 void _validateSdkConstraint(Pubspec pubspec) {
   if (pubspec.environment.sdkVersion.allows(sdk.version)) return;
 
diff --git a/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart b/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart
index b3a147b..aafa5d0 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart
@@ -11,24 +11,15 @@
 import '../utils.dart';
 import 'version_solver.dart';
 
-/// Generates and displays nicely formatted reports for the results of running
-/// a version resolution.
-///
-/// If [showAll] is true, then all of the previous and current dependencies
-/// are shown and their changes relative to the previous lock file are
-/// highlighted. Otherwise, only overrides are shown.
-///
-/// Returns the number of changed dependencies.
-int show(SourceRegistry sources, Package root, LockFile previousLockFile,
-         SolveResult result, {bool showAll: false}) {
-  var report = new _SolveReport(sources, root, previousLockFile, result);
-  return report.show(showAll: showAll);
-}
-
 /// Unlike [SolveResult], which is the static data describing a resolution,
 /// this class contains the mutable state used while generating the report
-/// itself. It's a report builder.
-class _SolveReport {
+/// itself.
+///
+/// It's a report builder.
+class SolveReport {
+  /// Whether all dependencies should be reported, or just ones that changed.
+  final bool _showAll;
+
   final SourceRegistry _sources;
   final Package _root;
   final LockFile _previousLockFile;
@@ -39,8 +30,9 @@
 
   final _output = new StringBuffer();
 
-  _SolveReport(this._sources, this._root, this._previousLockFile,
-      this._result) {
+  SolveReport(this._sources, this._root, this._previousLockFile,
+      this._result, {bool showAll: false})
+      : _showAll = showAll {
     // Fill the map so we can use it later.
     for (var id in _result.packages) {
       _dependencies[id.name] = id;
@@ -49,22 +41,22 @@
 
   /// Displays a report of the results of the version resolution relative to
   /// the previous lock file.
-  ///
-  /// If [showAll] is true, then all of the previous and current dependencies
-  /// are shown and their changes relative to the previous lock file are
-  /// highlighted. Otherwise, only overrides are shown.
-  ///
-  /// Returns the number of changed dependencies.
-  int show({bool showAll: false}) {
-    if (showAll) _reportChanges();
+  void show() {
+    _reportChanges();
     _reportOverrides();
+  }
 
+  /// Displays a one-line message summarizing what changes were made (or would
+  /// be made) to the lockfile.
+  ///
+  /// If [dryRun] is true, describes it in terms of what would be done.
+  void summarize({bool dryRun: false}) {
     // Count how many dependencies actually changed.
     var dependencies = _dependencies.keys.toSet();
     dependencies.addAll(_previousLockFile.packages.keys);
     dependencies.remove(_root.name);
 
-    return dependencies.where((name) {
+    var numChanged = dependencies.where((name) {
       var oldId = _previousLockFile.packages[name];
       var newId = _dependencies[name];
 
@@ -76,6 +68,28 @@
       return !_descriptionsEqual(oldId, newId) ||
           oldId.version != newId.version;
     }).length;
+
+    if (dryRun) {
+      if (numChanged == 0) {
+        log.message("No dependencies would change.");
+      } else if (numChanged == 1) {
+        log.message("Would change $numChanged dependency.");
+      } else {
+        log.message("Would change $numChanged dependencies.");
+      }
+    } else {
+      if (numChanged == 0) {
+        if (_showAll) {
+          log.message("No dependencies changed.");
+        } else {
+          log.message("Got dependencies!");
+        }
+      } else if (numChanged == 1) {
+        log.message("Changed $numChanged dependency!");
+      } else {
+        log.message("Changed $numChanged dependencies!");
+      }
+    }
   }
 
   /// Displays a report of all of the previous and current dependencies and
@@ -96,7 +110,7 @@
       _output.writeln("These packages are no longer being depended on:");
       removed = removed.toList();
       removed.sort();
-      removed.forEach(_reportPackage);
+      removed.forEach((name) => _reportPackage(name, alwaysShow: true));
     }
 
     log.message(_output);
@@ -112,7 +126,8 @@
       overrides.sort((a, b) => a.compareTo(b));
 
       overrides.forEach(
-          (name) => _reportPackage(name, highlightOverride: false));
+          (name) => _reportPackage(name, alwaysShow: true,
+              highlightOverride: false));
 
       log.warning(_output);
     }
@@ -120,11 +135,11 @@
 
   /// Reports the results of the upgrade on the package named [name].
   ///
-  /// If [highlightOverride] is true (or absent), writes "(override)" next to
-  /// overridden packages.
-  void _reportPackage(String name, {bool highlightOverride}) {
-    if (highlightOverride == null) highlightOverride = true;
-
+  /// If [alwaysShow] is true, the package is reported even if it didn't change,
+  /// regardless of [_showAll]. If [highlightOverride] is true (or absent),
+  /// writes "(override)" next to overridden packages.
+  void _reportPackage(String name,
+      {bool alwaysShow: false, bool highlightOverride: true}) {
     var newId = _dependencies[name];
     var oldId = _previousLockFile.packages[name];
     var id = newId != null ? newId : oldId;
@@ -132,8 +147,13 @@
     var isOverridden = _result.overrides.map(
         (dep) => dep.name).contains(id.name);
 
+    // If the package was previously a dependency but the dependency has
+    // changed in some way.
     var changed = false;
 
+    // If the dependency was added or removed.
+    var addedOrRemoved = false;
+
     // Show a one-character "icon" describing the change. They are:
     //
     //     ! The package is being overridden.
@@ -142,26 +162,32 @@
     //     > The package was upgraded from a lower version.
     //     < The package was downgraded from a higher version.
     //     * Any other change between the old and new package.
+    var icon;
     if (isOverridden) {
-      _output.write(log.magenta("! "));
+      icon = log.magenta("! ");
     } else if (newId == null) {
-      _output.write(log.red("- "));
+      icon = log.red("- ");
+      addedOrRemoved = true;
     } else if (oldId == null) {
-      _output.write(log.green("+ "));
+      icon = log.green("+ ");
+      addedOrRemoved = true;
     } else if (!_descriptionsEqual(oldId, newId)) {
-      _output.write(log.cyan("* "));
+      icon = log.cyan("* ");
       changed = true;
     } else if (oldId.version < newId.version) {
-      _output.write(log.green("> "));
+      icon = log.green("> ");
       changed = true;
     } else if (oldId.version > newId.version) {
-      _output.write(log.cyan("< "));
+      icon = log.cyan("< ");
       changed = true;
     } else {
       // Unchanged.
-      _output.write("  ");
+      icon = "  ";
     }
 
+    if (!(alwaysShow || changed || addedOrRemoved || _showAll)) return;
+
+    _output.write(icon);
     _output.write(log.bold(id.name));
     _output.write(" ");
     _writeId(id);
diff --git a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
index 3fc55d0..9e0939c 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
@@ -7,6 +7,9 @@
 import 'dart:async';
 import "dart:convert";
 
+import 'package:stack_trace/stack_trace.dart';
+
+import '../exceptions.dart';
 import '../lock_file.dart';
 import '../log.dart' as log;
 import '../package.dart';
@@ -15,7 +18,7 @@
 import '../version.dart';
 import '../utils.dart';
 import 'backtracking_solver.dart';
-import 'solve_report.dart' as solve_report;
+import 'solve_report.dart';
 
 /// Attempts to select the best concrete versions for all of the transitive
 /// dependencies of [root] taking into account all of the [VersionConstraint]s
@@ -62,9 +65,10 @@
   final SolveFailure error;
 
   /// The number of solutions that were attempted before either finding a
-  /// successful solution or exhausting all options. In other words, one more
-  /// than the number of times it had to backtrack because it found an invalid
-  /// solution.
+  /// successful solution or exhausting all options.
+  ///
+  /// In other words, one more than the number of times it had to backtrack
+  /// because it found an invalid solution.
   final int attemptedSolutions;
 
   final SourceRegistry _sources;
@@ -83,13 +87,21 @@
 
   /// Displays a report of what changes were made to the lockfile.
   ///
-  /// If [showAll] is true, displays all new and previous dependencies.
-  /// Otherwise, just shows a warning for any overrides in effect.
+  /// If [isUpgrade] is true, a "pub upgrade" was run, otherwise it was another
+  /// command.
+  void showReport({bool isUpgrade: false}) {
+    new SolveReport(_sources, _root, _previousLockFile, this,
+        showAll: isUpgrade).show();
+  }
+
+  /// Displays a one-line message summarizing what changes were made (or would
+  /// be made) to the lockfile.
   ///
-  /// Returns the number of changed (added, removed, or modified) dependencies.
-  int showReport({bool showAll: false}) {
-    return solve_report.show(_sources, _root, _previousLockFile, this,
-        showAll: showAll);
+  /// If [isUpgrade] is true, a "pub upgrade" was run, otherwise it was another
+  /// command.
+  void summarizeChanges({bool isUpgrade: false, bool dryRun: false}) {
+    new SolveReport(_sources, _root, _previousLockFile, this,
+        showAll: isUpgrade).summarize(dryRun: dryRun);
   }
 
   String toString() {
@@ -104,6 +116,7 @@
 }
 
 /// Maintains a cache of previously-requested data: pubspecs and version lists.
+///
 /// Used to avoid requesting the same pubspec from the server repeatedly.
 class PubspecCache {
   final SourceRegistry _sources;
@@ -111,6 +124,9 @@
   /// The already-requested cached version lists.
   final _versions = new Map<PackageRef, List<PackageId>>();
 
+  /// The errors from failed version list requests.
+  final _versionErrors = new Map<PackageRef, Pair<Object, Chain>>();
+
   /// The already-requested cached pubspecs.
   final _pubspecs = new Map<PackageId, Pubspec>();
 
@@ -175,6 +191,14 @@
       _versionCacheHits++;
       return new Future.value(versions);
     }
+
+    // See if we cached a failure.
+    var error = _versionErrors[package];
+    if (error != null) {
+      _versionCacheHits++;
+      return new Future.error(error.first, error.last);
+    }
+
     _versionCacheMisses++;
 
     var source = _sources[package.source];
@@ -187,6 +211,12 @@
           (version) => package.atVersion(version)).toList();
       _versions[package] = ids;
       return ids;
+    }).catchError((error, trace) {
+      // If an error occurs, cache that too. We only want to do one request
+      // for any given package, successful or not.
+      log.solver("Could not get versions for $package:\n$error\n\n$trace");
+      _versionErrors[package] = new Pair(error, new Chain.forTrace(trace));
+      throw error;
     });
   }
 
@@ -258,17 +288,16 @@
 
 /// Base class for all failures that can occur while trying to resolve versions.
 abstract class SolveFailure implements ApplicationException {
-  /// The name of the package whose version could not be solved. Will be `null`
-  /// if the failure is not specific to one package.
+  /// The name of the package whose version could not be solved.
+  ///
+  /// Will be `null` if the failure is not specific to one package.
   final String package;
 
-  /// The known dependencies on [package] at the time of the failure. Will be
-  /// an empty collection if the failure is not specific to one package.
+  /// The known dependencies on [package] at the time of the failure.
+  ///
+  /// Will be an empty collection if the failure is not specific to one package.
   final Iterable<Dependency> dependencies;
 
-  final innerError = null;
-  final innerTrace = null;
-
   String get message => toString();
 
   /// A message describing the specific kind of solve failure.
@@ -300,8 +329,9 @@
     return buffer.toString();
   }
 
-  /// Describes a dependency's reference in the output message. Override this
-  /// to highlight which aspect of [dep] led to the failure.
+  /// Describes a dependency's reference in the output message.
+  ///
+  /// Override this to highlight which aspect of [dep] led to the failure.
   String _describeDependency(PackageDep dep) =>
       "depends on version ${dep.constraint}";
 }
diff --git a/sdk/lib/_internal/pub/lib/src/source.dart b/sdk/lib/_internal/pub/lib/src/source.dart
index 3f1d5db..823b860 100644
--- a/sdk/lib/_internal/pub/lib/src/source.dart
+++ b/sdk/lib/_internal/pub/lib/src/source.dart
@@ -21,8 +21,10 @@
 /// package needs a dependency from a cached source, it is first installed in
 /// the [SystemCache] and then acquired from there.
 abstract class Source {
-  /// The name of the source. Should be lower-case, suitable for use in a
-  /// filename, and unique accross all sources.
+  /// The name of the source.
+  ///
+  /// Should be lower-case, suitable for use in a filename, and unique accross
+  /// all sources.
   String get name;
 
   /// Whether or not this source is the default source.
@@ -49,7 +51,9 @@
   }
 
   /// Get the list of all versions that exist for the package described by
-  /// [description]. [name] is the expected name of the package.
+  /// [description].
+  ///
+  /// [name] is the expected name of the package.
   ///
   /// Note that this does *not* require the packages to be downloaded locally,
   /// which is the point. This is used during version resolution to determine
@@ -64,8 +68,10 @@
   }
 
   /// Loads the (possibly remote) pubspec for the package version identified by
-  /// [id]. This may be called for packages that have not yet been downloaded
-  /// during the version resolution process.
+  /// [id].
+  ///
+  /// This may be called for packages that have not yet been downloaded during
+  /// the version resolution process.
   ///
   /// Sources should not override this. Instead, they implement [doDescribe].
   Future<Pubspec> describe(PackageId id) {
@@ -79,18 +85,26 @@
   }
 
   /// Loads the (possibly remote) pubspec for the package version identified by
-  /// [id]. This may be called for packages that have not yet been downloaded
-  /// during the version resolution process.
+  /// [id].
+  ///
+  /// This may be called for packages that have not yet been downloaded during
+  /// the version resolution process.
   ///
   /// This method is effectively protected: subclasses must implement it, but
   /// external code should not call this. Instead, call [describe].
   Future<Pubspec> doDescribe(PackageId id);
 
-  /// Gets the package identified by [id] and places it at [path].
+  /// Ensures that the package identified by [id] is present on the local file
+  /// system.
   ///
-  /// Returns a [Future] that completes when the operation finishes. [path] is
-  /// guaranteed not to exist, and its parent directory is guaranteed to exist.
-  Future get(PackageId id, String path);
+  /// For cached sources, this ensures the package is in the system cache. (If
+  /// already cached, it does nothing.) For uncached sources, it does nothing
+  /// since the package is already local.
+  Future ensureLocal(PackageId id);
+
+  /// Ensures [id] is available locally and creates a symlink at [symlink]
+  /// pointing it.
+  Future get(PackageId id, String symlink);
 
   /// Returns the directory where this package can (or could) be found locally.
   ///
@@ -99,6 +113,9 @@
   /// installed into the cache yet.
   Future<String> getDirectory(PackageId id);
 
+  /// Gives the source a chance to interpret and validate the description for
+  /// a package coming from this source.
+  ///
   /// When a [Pubspec] or [LockFile] is parsed, it reads in the description for
   /// each dependency. It is up to the dependency's [Source] to determine how
   /// that should be interpreted. This will be called during parsing to validate
@@ -137,10 +154,15 @@
   }
 
   /// Returns whether or not [description1] describes the same package as
-  /// [description2] for this source. This method should be light-weight. It
-  /// doesn't need to validate that either package exists.
+  /// [description2] for this source.
+  ///
+  /// This method should be light-weight. It doesn't need to validate that
+  /// either package exists.
   bool descriptionsEqual(description1, description2);
 
+  /// Resolves [id] to a more possibly more precise that will uniquely identify
+  /// a package regardless of when the package is requested.
+  ///
   /// For some sources, [PackageId]s can point to different chunks of code at
   /// different times. This takes such an [id] and returns a future that
   /// completes to a [PackageId] that will uniquely specify a single chunk of
diff --git a/sdk/lib/_internal/pub/lib/src/source/cached.dart b/sdk/lib/_internal/pub/lib/src/source/cached.dart
index 4fada96..aaafd31 100644
--- a/sdk/lib/_internal/pub/lib/src/source/cached.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/cached.dart
@@ -47,9 +47,14 @@
   /// the system cache.
   Future<Pubspec> describeUncached(PackageId id);
 
-  Future get(PackageId id, String packageDir) {
-    return downloadToSystemCache(id).then(
-        (pkg) => createPackageSymlink(id.name, pkg.dir, packageDir));
+  Future ensureLocal(PackageId id) {
+    return downloadToSystemCache(id);
+  }
+
+  Future get(PackageId id, String symlink) {
+    return downloadToSystemCache(id).then((pkg) {
+      createPackageSymlink(id.name, pkg.dir, symlink);
+    });
   }
 
   /// Determines if the package with [id] is already downloaded to the system
diff --git a/sdk/lib/_internal/pub/lib/src/source/git.dart b/sdk/lib/_internal/pub/lib/src/source/git.dart
index b0488c4..9f4c38c 100644
--- a/sdk/lib/_internal/pub/lib/src/source/git.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/git.dart
@@ -24,8 +24,6 @@
   /// has already been run during this run of pub.
   final _updatedRepos = new Set<String>();
 
-  GitSource();
-
   /// Since we don't have an easy way to read from a remote Git repo, this
   /// just installs [id] into the system cache, then describes it from there.
   Future<Pubspec> describeUncached(PackageId id) {
@@ -44,23 +42,16 @@
   /// `<package name>-<url hash>`. These are used to check out the repository
   /// itself; each of the commit-specific directories are clones of a directory
   /// in `cache/`.
-  Future<Package> downloadToSystemCache(PackageId id, {bool force}) {
-    // Force is not supported because the cache repair command doesn't need it.
-    // Instead, it uses [resetCachedPackages].
-    assert(force != true);
-
+  Future<Package> downloadToSystemCache(PackageId id) {
     var revisionCachePath;
 
-    return git.isInstalled.then((installed) {
-      if (!installed) {
-        throw new ApplicationException(
-            "Cannot get ${id.name} from Git (${_getUrl(id)}).\n"
-            "Please ensure Git is correctly installed.");
-      }
+    if (!git.isInstalled) {
+      fail("Cannot get ${id.name} from Git (${_getUrl(id)}).\n"
+          "Please ensure Git is correctly installed.");
+    }
 
-      ensureDir(path.join(systemCacheRoot, 'cache'));
-      return _ensureRevision(id);
-    }).then((_) => getDirectory(id)).then((path) {
+    ensureDir(path.join(systemCacheRoot, 'cache'));
+    return _ensureRevision(id).then((_) => getDirectory(id)).then((path) {
       revisionCachePath = path;
       if (entryExists(revisionCachePath)) return null;
       return _clone(_repoCachePath(id), revisionCachePath, mirror: false);
diff --git a/sdk/lib/_internal/pub/lib/src/source/hosted.dart b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
index 56a76a9..ec21d20 100644
--- a/sdk/lib/_internal/pub/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
@@ -11,6 +11,7 @@
 import 'package:http/http.dart' as http;
 import 'package:path/path.dart' as path;
 
+import '../exceptions.dart';
 import '../http.dart';
 import '../io.dart';
 import '../log.dart' as log;
@@ -179,8 +180,8 @@
       return httpClient.send(new http.Request("GET", url))
           .then((response) => response.stream)
           .then((stream) {
-        return timeout(extractTarGz(stream, tempDir), HTTP_TIMEOUT,
-            'fetching URL "$url"');
+        return timeout(extractTarGz(stream, tempDir), HTTP_TIMEOUT, url,
+            'downloading $url');
       }).then((_) {
         // Remove the existing directory if it exists. This will happen if
         // we're forcing a download to repair the cache.
@@ -196,8 +197,9 @@
   }
 
   /// When an error occurs trying to read something about [package] from [url],
-  /// this tries to translate into a more user friendly error message. Always
-  /// throws an error, either the original one or a better one.
+  /// this tries to translate into a more user friendly error message.
+  ///
+  /// Always throws an error, either the original one or a better one.
   void _throwFriendlyError(error, StackTrace stackTrace, String package,
       String url) {
     if (error is PubHttpException &&
@@ -222,8 +224,10 @@
 }
 
 /// This is the modified hosted source used when pub get or upgrade are run
-/// with "--offline". This uses the system cache to get the list of available
-/// packages and does no network access.
+/// with "--offline".
+///
+/// This uses the system cache to get the list of available packages and does
+/// no network access.
 class OfflineHostedSource extends HostedSource {
   /// Gets the list of all versions of [name] that are in the system cache.
   Future<List<Version>> getVersions(String name, description) {
@@ -274,7 +278,9 @@
 ///
 /// This behavior is a bug, but is being preserved for compatibility.
 String _urlToDirectory(String url) {
-  url = url.replaceAll(new RegExp(r"^https?://"), "");
+  // Normalize all loopback URLs to "localhost".
+  url = url.replaceAllMapped(new RegExp(r"^https?://(127\.0\.0\.1|\[::1\])?"),
+      (match) => match[1] == null ? '' : 'localhost');
   return replace(url, new RegExp(r'[<>:"\\/|?*%]'),
       (match) => '%${match[0].codeUnitAt(0)}');
 }
@@ -298,23 +304,14 @@
   var scheme = "https";
 
   // See if it's a loopback IP address.
-  try {
-    var urlWithoutPort = url.replaceAll(new RegExp(":.*"), "");
-    var address = new io.InternetAddress(urlWithoutPort);
-    if (address.isLoopback) scheme = "http";
-  } on ArgumentError catch(error) {
-    // If we got here, it's not a raw IP address, so it's probably a regular
-    // URL.
-  }
-
-  if (url == "localhost") scheme = "http";
-
+  if (isLoopback(url.replaceAll(new RegExp(":.*"), ""))) scheme = "http";
   return "$scheme://$url";
 }
 
 /// Parses [description] into its server and package name components, then
-/// converts that to a Uri given [pattern]. Ensures the package name is
-/// properly URL encoded.
+/// converts that to a Uri given [pattern].
+///
+/// Ensures the package name is properly URL encoded.
 Uri _makeUrl(description, String pattern(String server, String package)) {
   var parsed = _parseDescription(description);
   var server = parsed.last;
@@ -323,8 +320,9 @@
 }
 
 /// Parses [id] into its server, package name, and version components, then
-/// converts that to a Uri given [pattern]. Ensures the package name is
-/// properly URL encoded.
+/// converts that to a Uri given [pattern].
+///
+/// Ensures the package name is properly URL encoded.
 Uri _makeVersionUrl(PackageId id,
     String pattern(String server, String package, String version)) {
   var parsed = _parseDescription(id.description);
diff --git a/sdk/lib/_internal/pub/lib/src/source/path.dart b/sdk/lib/_internal/pub/lib/src/source/path.dart
index c6d20cd..ec0f9a2 100644
--- a/sdk/lib/_internal/pub/lib/src/source/path.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/path.dart
@@ -8,6 +8,7 @@
 
 import 'package:path/path.dart' as path;
 
+import '../exceptions.dart';
 import '../io.dart';
 import '../package.dart';
 import '../pubspec.dart';
@@ -33,12 +34,13 @@
     return path1 == path2;
   }
 
-  /// Create a symlink from the source path directly to the destination
-  /// directory.
-  Future get(PackageId id, String destination) {
+  /// Path dependencies are already local.
+  Future ensureLocal(PackageId id) => new Future.value();
+
+  Future get(PackageId id, String symlink) {
     return syncFuture(() {
       var dir = _validatePath(id.name, id.description);
-      createPackageSymlink(id.name, dir, destination,
+      createPackageSymlink(id.name, dir, symlink,
           relative: id.description["relative"]);
     });
   }
@@ -46,10 +48,11 @@
   Future<String> getDirectory(PackageId id) =>
       newFuture(() => _validatePath(id.name, id.description));
 
-  /// Parses a path dependency. This takes in a path string and returns a map.
-  /// The "path" key will be the original path but resolved relative to the
-  /// containing path. The "relative" key will be `true` if the original path
-  /// was relative.
+  /// Parses a path dependency.
+  ///
+  /// This takes in a path string and returns a map. The "path" key will be the
+  /// original path but resolved relative to the containing path. The
+  /// "relative" key will be `true` if the original path was relative.
   ///
   /// A path coming from a pubspec is a simple string. From a lock file, it's
   /// an expanded {"path": ..., "relative": ...} map.
@@ -95,9 +98,10 @@
     };
   }
 
-  /// Serializes path dependency's [description]. For the descriptions where
-  /// `relative` attribute is `true`, tries to make `path` relative to the
-  /// specified [containingPath].
+  /// Serializes path dependency's [description].
+  ///
+  /// For the descriptions where `relative` attribute is `true`, tries to make
+  /// `path` relative to the specified [containingPath].
   dynamic serializeDescription(String containingPath, description) {
     if (description["relative"]) {
       return {
diff --git a/sdk/lib/_internal/pub/lib/src/source/unknown.dart b/sdk/lib/_internal/pub/lib/src/source/unknown.dart
index 5fcd273..da20dc2 100644
--- a/sdk/lib/_internal/pub/lib/src/source/unknown.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/unknown.dart
@@ -31,9 +31,12 @@
   Future<Pubspec> doDescribe(PackageId id) => throw new UnsupportedError(
       "Cannot describe a package from unknown source '$name'.");
 
-  Future<bool> get(PackageId id, String path) => throw new UnsupportedError(
+  Future ensureLocal(PackageId id) => throw new UnsupportedError(
       "Cannot get a package from an unknown source '$name'.");
 
+  Future get(PackageId id, String symlink) => throw new UnsupportedError(
+      "Cannot get an unknown source '$name'.");
+
   /// Returns the directory where this package can be found locally.
   Future<String> getDirectory(PackageId id) => throw new UnsupportedError(
       "Cannot find a package from an unknown source '$name'.");
diff --git a/sdk/lib/_internal/pub/lib/src/source_registry.dart b/sdk/lib/_internal/pub/lib/src/source_registry.dart
index 15c4bc1..ffac4f8 100644
--- a/sdk/lib/_internal/pub/lib/src/source_registry.dart
+++ b/sdk/lib/_internal/pub/lib/src/source_registry.dart
@@ -24,8 +24,9 @@
     return sources.iterator;
   }
 
-  /// Sets the default source. This takes a string, which must be the name of a
-  /// registered source.
+  /// Sets the default source.
+  ///
+  /// This takes a string, which must be the name of a registered source.
   void setDefault(String name) {
     if (!_sources.containsKey(name)) {
       throw new StateError('Default source $name is not in the registry');
@@ -34,8 +35,10 @@
     _default = _sources[name];
   }
 
-  /// Registers a new source. This source may not have the same name as a source
-  /// that's already been registered.
+  /// Registers a new source.
+  ///
+  /// This source may not have the same name as a source that's already been
+  /// registered.
   void register(Source source) {
     if (_sources.containsKey(source.name)) {
       throw new StateError('Source registry already has a source named '
diff --git a/sdk/lib/_internal/pub/lib/src/system_cache.dart b/sdk/lib/_internal/pub/lib/src/system_cache.dart
index 4c48fba..6508615 100644
--- a/sdk/lib/_internal/pub/lib/src/system_cache.dart
+++ b/sdk/lib/_internal/pub/lib/src/system_cache.dart
@@ -37,8 +37,9 @@
   /// user's file system.
   SystemCache(this.rootDir);
 
-  /// Creates a system cache and registers the standard set of sources. If
-  /// [isOffline] is `true`, then the offline hosted source will be used.
+  /// Creates a system cache and registers the standard set of sources.
+  ///
+  /// If [isOffline] is `true`, then the offline hosted source will be used.
   /// Defaults to `false`.
   factory SystemCache.withSources(String rootDir, {bool isOffline: false}) {
     var cache = new SystemCache(rootDir);
@@ -55,8 +56,10 @@
     return cache;
   }
 
-  /// Registers a new source. This source must not have the same name as a
-  /// source that's already been registered.
+  /// Registers a new source.
+  ///
+  /// This source must not have the same name as a source that's already been
+  /// registered.
   void register(Source source) {
     source.bind(this);
     sources.register(source);
@@ -73,11 +76,12 @@
     return source.isInSystemCache(id);
   }
 
-  /// Create a new temporary directory within the system cache. The system
-  /// cache maintains its own temporary directory that it uses to stage
-  /// packages into while downloading. It uses this instead of the OS's system
-  /// temp directory to ensure that it's on the same volume as the pub system
-  /// cache so that it can move the directory from it.
+  /// Create a new temporary directory within the system cache.
+  ///
+  /// The system cache maintains its own temporary directory that it uses to
+  /// stage packages into while downloading. It uses this instead of the OS's
+  /// system temp directory to ensure that it's on the same volume as the pub
+  /// system cache so that it can move the directory from it.
   String createTempDir() {
     var temp = ensureDir(tempDir);
     return io.createTempDir(temp, 'dir');
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index d9ab8a9..6f904c3 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -6,20 +6,16 @@
 library pub.utils;
 
 import 'dart:async';
-import "dart:collection";
 import "dart:convert";
 import 'dart:io';
-import 'dart:isolate';
 @MirrorsUsed(targets: 'pub.io')
 import 'dart:mirrors';
 
-import "package:analyzer/analyzer.dart";
 import "package:crypto/crypto.dart";
-import "package:http/http.dart" as http;
 import 'package:path/path.dart' as path;
 import "package:stack_trace/stack_trace.dart";
 
-import '../../asset/dart/serialize.dart';
+import 'exceptions.dart';
 
 export '../../asset/dart/utils.dart';
 
@@ -190,6 +186,10 @@
 ///
 /// Handles properly formatting IPv6 addresses.
 Uri baseUrlForAddress(InternetAddress address, int port) {
+  if (address.isLoopback) {
+    return new Uri(scheme: "http", host: "localhost", port: port);
+  }
+
   // IPv6 addresses in URLs need to be enclosed in square brackets to avoid
   // URL ambiguity with the ":" in the address.
   if (address.type == InternetAddressType.IP_V6) {
@@ -199,6 +199,27 @@
   return new Uri(scheme: "http", host: address.address, port: port);
 }
 
+/// Returns whether [host] is a host for a localhost or loopback URL.
+///
+/// Unlike [InternetAddress.isLoopback], this hostnames from URLs as well as
+/// from [InternetAddress]es, including "localhost".
+bool isLoopback(String host) {
+  if (host == 'localhost') return true;
+
+  // IPv6 hosts in URLs are surrounded by square brackets.
+  if (host.startsWith("[") && host.endsWith("]")) {
+    host = host.substring(1, host.length - 1);
+  }
+
+  try {
+    return new InternetAddress(host).isLoopback;
+  } on ArgumentError catch (_) {
+    // The host isn't an IP address and isn't "localhost', so it's almost
+    // certainly not a loopback host.
+    return false;
+  }
+}
+
 /// Flattens nested lists inside an iterable into a single list containing only
 /// non-list elements.
 List flatten(Iterable nested) {
@@ -259,94 +280,73 @@
   });
 }
 
-/// Creates a map from [iter], using the return values of [keyFn] as the keys
-/// and the return values of [valueFn] as the values.
-Map listToMap(Iterable iter, keyFn(element), valueFn(element)) {
-  var map = new Map();
-  for (var element in iter) {
-    map[keyFn(element)] = valueFn(element);
-  }
-  return map;
-}
-
 /// Creates a new map from [map] with new keys and values.
 ///
-/// The return values of [keyFn] are used as the keys and the return values of
-/// [valueFn] are used as the values for the new map.
-Map mapMap(Map map, keyFn(key, value), valueFn(key, value)) =>
-  listToMap(map.keys,
-      (key) => keyFn(key, map[key]),
-      (key) => valueFn(key, map[key]));
-
-/// Creates a new map from [map] with the same keys.
+/// The return values of [key] are used as the keys and the return values of
+/// [value] are used as the values for the new map.
 ///
-/// The return values of [valueFn] are used as the values for the new map.
-Map mapMapValues(Map map, fn(key, value)) => mapMap(map, (key, _) => key, fn);
+/// [key] defaults to returning the original key and [value] defaults to
+/// returning the original value.
+Map mapMap(Map map, {key(key, value), value(key, value)}) {
+  if (key == null) key = (key, _) => key;
+  if (value == null) value = (_, value) => value;
 
-/// Returns the shortest path from [start] to [end] in [graph].
-///
-/// The graph is represented by a map where each key is a vertex and the value
-/// is the set of other vertices directly reachable from the key. [start] and
-/// [end] must be vertices in this graph.
-List shortestPath(Map<dynamic, Iterable> graph, start, end) {
-  assert(graph.containsKey(start));
-  assert(graph.containsKey(end));
-
-  // Dijkstra's algorithm.
-  var infinity = graph.length;
-  var distance = mapMapValues(graph, (_1, _2) => infinity);
-
-  // A map from each node to the node that came before it on the shortest path
-  // from it back to [start].
-  var previous = {};
-
-  distance[start] = 0;
-  var remaining = graph.keys.toSet();
-  while (!remaining.isEmpty) {
-    var current = minBy(remaining, (node) => distance[node]);
-    remaining.remove(current);
-
-    // If there's no remaining node that's reachable from [start], then there's
-    // no path from [start] to [end].
-    if (distance[current] == infinity) return null;
-
-    // If we've reached [end], we've found the shortest path to it and we just
-    // need to reconstruct that path.
-    if (current == end) break;
-
-    for (var neighbor in graph[current]) {
-      if (!remaining.contains(neighbor)) continue;
-      var newDistance = distance[current] + 1;
-      if (newDistance >= distance[neighbor]) continue;
-      distance[neighbor] = newDistance;
-      previous[neighbor] = current;
-    }
-  }
-
-  var path = new Queue();
-  var current = end;
-  while (current != null) {
-    path.addFirst(current);
-    current = previous[current];
-  }
-
-  return path.toList();
-}
-
-/// Returns a copy of [graph] with all the edges reversed.
-///
-/// The graph is represented by a map where each key is a vertex and the value
-/// is the set of other vertices directly reachable from the key.
-Map<dynamic, Set> reverseGraph(Map<dynamic, Set> graph) {
-  var reversed = new Map.fromIterable(graph.keys, value: (_) => new Set());
-  graph.forEach((vertex, edges) {
-    for (var edge in edges) {
-      reversed[edge].add(vertex);
-    }
+  var result = {};
+  map.forEach((mapKey, mapValue) {
+    result[key(mapKey, mapValue)] = value(mapKey, mapValue);
   });
-  return reversed;
+  return result;
 }
 
+/// Like [Map.fromIterable], but [key] and [value] may return [Future]s.
+Future<Map> mapFromIterableAsync(Iterable iter, {key(element),
+    value(element)}) {
+  if (key == null) key = (element) => element;
+  if (value == null) value = (element) => element;
+
+  var map = new Map();
+  return Future.wait(iter.map((element) {
+    return Future.wait([
+      syncFuture(() => key(element)),
+      syncFuture(() => value(element))
+    ]).then((results) {
+      map[results[0]] = results[1];
+    });
+  })).then((_) => map);
+}
+
+/// Given a list of filenames, returns a set of patterns that can be used to
+/// filter for those filenames.
+///
+/// For a given path, that path ends with some string in the returned set if
+/// and only if that path's basename is in [files].
+Set<String> createFileFilter(Iterable<String> files) {
+  return files.expand((file) {
+    var result = ["/$file"];
+    if (Platform.operatingSystem == 'windows') result.add("\\$file");
+    return result;
+  }).toSet();
+}
+
+/// Given a blacklist of directory names, returns a set of patterns that can
+/// be used to filter for those directory names.
+///
+/// For a given path, that path contains some string in the returned set if
+/// and only if one of that path's components is in [dirs].
+Set<String> createDirectoryFilter(Iterable<String> dirs) {
+  return dirs.expand((dir) {
+    var result = ["/$dir/"];
+    if (Platform.operatingSystem == 'windows') {
+      result..add("/$dir\\")..add("\\$dir/")..add("\\$dir\\");
+    }
+    return result;
+  }).toSet();
+}
+
+/// Returns the maximum value in [iter].
+int maxAll(Iterable<int> iter) =>
+    iter.reduce((max, element) => element > max ? element : max);
+
 /// Replace each instance of [matcher] in [source] with the return value of
 /// [fn].
 String replace(String source, Pattern matcher, String fn(Match)) {
@@ -427,6 +427,7 @@
 
 // TODO(nweiz): remove this when issue 7964 is fixed.
 /// Returns a [Future] that will complete to the first element of [stream].
+///
 /// Unlike [Stream.first], this is safe to use with single-subscription streams.
 Future streamFirst(Stream stream) {
   var completer = new Completer();
@@ -456,8 +457,10 @@
 
 // TODO(nweiz): remove this when issue 7787 is fixed.
 /// Creates two single-subscription [Stream]s that each emit all values and
-/// errors from [stream]. This is useful if [stream] is single-subscription but
-/// multiple subscribers are necessary.
+/// errors from [stream].
+///
+/// This is useful if [stream] is single-subscription but multiple subscribers
+/// are necessary.
 Pair<Stream, Stream> tee(Stream stream) {
   var controller1 = new StreamController(sync: true);
   var controller2 = new StreamController(sync: true);
@@ -503,6 +506,7 @@
   text.split("\n").map((line) => line.replaceFirst(_trailingCR, "")).toList();
 
 /// Converts a stream of arbitrarily chunked strings into a line-by-line stream.
+///
 /// The lines don't include line termination characters. A single trailing
 /// newline is ignored.
 Stream<String> streamToLines(Stream<String> stream) {
@@ -544,7 +548,8 @@
 // pkg/http.
 
 /// Like [String.split], but only splits on the first occurrence of the pattern.
-/// This will always return an array of two elements or fewer.
+///
+/// This always returns an array of two elements or fewer.
 List<String> split1(String toSplit, String pattern) {
   if (toSplit.isEmpty) return <String>[];
 
@@ -596,8 +601,10 @@
   sets.fold(new Set(), (union, set) => union.union(set));
 
 // TODO(nweiz): remove this when issue 9068 has been fixed.
-/// Whether [uri1] and [uri2] are equal. This consider HTTP URIs to default to
-/// port 80, and HTTPs URIs to default to port 443.
+/// Whether [uri1] and [uri2] are equal.
+///
+/// This consider HTTP URIs to default to port 80, and HTTPs URIs to default to
+/// port 443.
 bool urisEqual(Uri uri1, Uri uri2) =>
   canonicalizeUri(uri1) == canonicalizeUri(uri2);
 
@@ -620,14 +627,26 @@
   return relative;
 }
 
-/// Decodes a URL-encoded string. Unlike [Uri.decodeComponent], this includes
-/// replacing `+` with ` `.
+/// Returns a human-friendly representation of [duration].
+String niceDuration(Duration duration) {
+  var result = duration.inMinutes > 0 ? "${duration.inMinutes}:" : "";
+
+  var s = duration.inSeconds % 59;
+  var ms = (duration.inMilliseconds % 1000) ~/ 100;
+  return result + "$s.${ms}s";
+}
+
+/// Decodes a URL-encoded string.
+///
+/// Unlike [Uri.decodeComponent], this includes replacing `+` with ` `.
 String urlDecode(String encoded) =>
   Uri.decodeComponent(encoded.replaceAll("+", " "));
 
 /// Takes a simple data structure (composed of [Map]s, [Iterable]s, scalar
 /// objects, and [Future]s) and recursively resolves all the [Future]s contained
-/// within. Completes with the fully resolved structure.
+/// within.
+///
+/// Completes with the fully resolved structure.
 Future awaitObject(object) {
   // Unroll nested futures.
   if (object is Future) return object.then(awaitObject);
@@ -660,22 +679,25 @@
   return path.fromUri(lib.uri);
 }
 
+/// Whether "special" strings such as Unicode characters or color escapes are
+/// safe to use.
+///
+/// On Windows or when not printing to a terminal, only printable ASCII
+/// characters should be used.
+bool get canUseSpecialChars => !runningAsTest &&
+    Platform.operatingSystem != 'windows' &&
+    stdioType(stdout) == StdioType.TERMINAL;
+
 /// Gets a "special" string (ANSI escape or Unicode).
 ///
 /// On Windows or when not printing to a terminal, returns something else since
 /// those aren't supported.
-String getSpecial(String color, [String onWindows = '']) {
-  // No ANSI escapes on windows or when running tests.
-  if (runningAsTest || Platform.operatingSystem == 'windows' ||
-      stdioType(stdout) != StdioType.TERMINAL) {
-    return onWindows;
-  } else {
-    return color;
-  }
-}
+String getSpecial(String special, [String onWindows = '']) =>
+    canUseSpecialChars ? special : onWindows;
 
-/// Prepends each line in [text] with [prefix]. If [firstPrefix] is passed, the
-/// first line is prefixed with that instead.
+/// Prepends each line in [text] with [prefix].
+///
+/// If [firstPrefix] is passed, the first line is prefixed with that instead.
 String prefixLines(String text, {String prefix: '| ', String firstPrefix}) {
   var lines = text.split('\n');
   if (firstPrefix == null) {
@@ -717,9 +739,10 @@
   return completer.future;
 }
 
-/// The subset of strings that don't need quoting in YAML. This pattern does
-/// not strictly follow the plain scalar grammar of YAML, which means some
-/// strings may be unnecessarily quoted, but it's much simpler.
+/// The subset of strings that don't need quoting in YAML.
+///
+/// This pattern does not strictly follow the plain scalar grammar of YAML,
+/// which means some strings may be unnecessarily quoted, but it's much simpler.
 final _unquotableYamlString = new RegExp(r"^[a-zA-Z_-][a-zA-Z_0-9-]*$");
 
 /// Converts [data], which is a parsed YAML object, to a pretty-printed string,
@@ -779,92 +802,11 @@
   return buffer.toString();
 }
 
-/// An exception class for exceptions that are intended to be seen by the user.
-/// These exceptions won't have any debugging information printed when they're
-/// thrown.
-class ApplicationException implements Exception {
-  final String message;
-
-  /// The underlying exception that [this] is wrapping, if any.
-  final innerError;
-
-  /// The stack trace for [innerError] if it exists.
-  final Trace innerTrace;
-
-  ApplicationException(this.message, [this.innerError, StackTrace innerTrace])
-      : innerTrace = innerTrace == null ? null : new Trace.from(innerTrace);
-
-  String toString() => message;
-}
-
-/// A class for command usage exceptions.
-class UsageException extends ApplicationException {
-  /// The command usage information.
-  final String usage;
-
-  UsageException(String message, this.usage)
-      : super(message);
-
-  String toString() => "$message\n\n$usage";
-}
-
-/// A class for errors in a command's input data.
-///
-/// This corresponds to the [exit_codes.DATA] exit code.
-class DataException extends ApplicationException {
-  DataException(String message)
-      : super(message);
-}
-
-/// An class for exceptions where a package could not be found in a [Source].
-///
-/// The source is responsible for wrapping its internal exceptions in this so
-/// that other code in pub can use this to show a more detailed explanation of
-/// why the package was being requested.
-class PackageNotFoundException extends ApplicationException {
-  PackageNotFoundException(String message, [innerError, StackTrace innerTrace])
-      : super(message, innerError, innerTrace);
-}
-
 /// Throw a [ApplicationException] with [message].
 void fail(String message, [innerError, StackTrace innerTrace]) {
-  throw new ApplicationException(message, innerError, innerTrace);
-}
-
-/// All the names of user-facing exceptions.
-final _userFacingExceptions = new Set<String>.from([
-  'ApplicationException',
-  // This refers to http.ClientException.
-  'ClientException',
-  // Errors coming from the Dart analyzer are probably caused by syntax errors
-  // in user code, so they're user-facing.
-  'AnalyzerError', 'AnalyzerErrorGroup',
-  // An error spawning an isolate probably indicates a transformer with an
-  // invalid import.
-  'IsolateSpawnException',
-  // TODO(nweiz): clean up the dart:io errors when issue 9955 is fixed.
-  'FileSystemException', 'HttpException', 'OSError',
-  'ProcessException', 'SocketException', 'WebSocketException'
-]);
-
-/// Returns whether [error] is a user-facing error object. This includes both
-/// [ApplicationException] and any dart:io errors.
-bool isUserFacingException(error) {
-  if (error is CrossIsolateException) {
-    return _userFacingExceptions.contains(error.type);
+  if (innerError != null) {
+    throw new WrappedException(message, innerError, innerTrace);
+  } else {
+    throw new ApplicationException(message);
   }
-
-  // TODO(nweiz): unify this list with _userFacingExceptions when issue 5897 is
-  // fixed.
-  return error is ApplicationException ||
-    error is AnalyzerError ||
-    error is AnalyzerErrorGroup ||
-    error is IsolateSpawnException ||
-    error is FileSystemException ||
-    error is HttpException ||
-    error is http.ClientException ||
-    error is OSError ||
-    error is ProcessException ||
-    error is SocketException ||
-    error is WebSocketException;
 }
diff --git a/sdk/lib/_internal/pub/lib/src/validator.dart b/sdk/lib/_internal/pub/lib/src/validator.dart
index e448058..32194fe 100644
--- a/sdk/lib/_internal/pub/lib/src/validator.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator.dart
@@ -20,18 +20,24 @@
 import 'validator/utf8_readme.dart';
 
 /// The base class for validators that check whether a package is fit for
-/// uploading. Each validator should override [errors], [warnings], or both to
-/// return lists of errors or warnings to display to the user. Errors will cause
-/// the package not to be uploaded; warnings will require the user to confirm
-/// the upload.
+/// uploading.
+///
+/// Each validator should override [errors], [warnings], or both to return
+/// lists of errors or warnings to display to the user. Errors will cause the
+/// package not to be uploaded; warnings will require the user to confirm the
+/// upload.
 abstract class Validator {
   /// The entrypoint that's being validated.
   final Entrypoint entrypoint;
 
-  /// The accumulated errors for this validator. Filled by calling [validate].
+  /// The accumulated errors for this validator.
+  ///
+  /// Filled by calling [validate].
   final errors = <String>[];
 
-  /// The accumulated warnings for this validator. Filled by calling [validate].
+  /// The accumulated warnings for this validator.
+  ///
+  /// Filled by calling [validate].
   final warnings = <String>[];
 
   Validator(this.entrypoint);
@@ -41,8 +47,8 @@
   Future validate();
 
   /// Run all validators on the [entrypoint] package and print their results.
-  /// The future will complete with the error and warning messages,
-  /// respectively.
+  ///
+  /// The future completes with the error and warning messages, respectively.
   ///
   /// [packageSize], if passed, should complete to the size of the tarred
   /// package, in bytes. This is used to validate that it's not too big to
diff --git a/sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart b/sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart
index 400e6b2..6ad79ce6 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart
@@ -21,7 +21,7 @@
 
   Future validate() {
     return syncFuture(() {
-      for (var entry in listDir(entrypoint.root.dir, recursive: true)) {
+      for (var entry in entrypoint.root.listFiles()) {
         if (path.basename(entry) != "nav.json") continue;
         var dir = path.dirname(entry);
 
diff --git a/sdk/lib/_internal/pub/lib/src/validator/dependency.dart b/sdk/lib/_internal/pub/lib/src/validator/dependency.dart
index 0f06d3f..c341e33 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/dependency.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/dependency.dart
@@ -90,7 +90,7 @@
             'future versions of "${dep.name}".');
   }
 
-  // Warn that dependencies should allow more than a single version.
+  /// Warn that dependencies should allow more than a single version.
   void _warnAboutSingleVersionConstraint(PackageDep dep) {
     warnings.add(
         'Your dependency on "${dep.name}" should allow more than one version. '
@@ -104,7 +104,7 @@
         'along with other packages that also depend on "${dep.name}".');
   }
 
-  // Warn that dependencies should have lower bounds on their constraints.
+  /// Warn that dependencies should have lower bounds on their constraints.
   void _warnAboutNoConstraintLowerBound(PackageDep dep) {
     var message = 'Your dependency on "${dep.name}" should have a lower bound.';
     var locked = entrypoint.loadLockFile().packages[dep.name];
@@ -126,7 +126,7 @@
             'previous versions of "${dep.name}".');
   }
 
-  // Warn that dependencies should have upper bounds on their constraints.
+  /// Warn that dependencies should have upper bounds on their constraints.
   void _warnAboutNoConstraintUpperBound(PackageDep dep) {
     warnings.add(
         'Your dependency on "${dep.name}" should have an upper bound. For '
diff --git a/sdk/lib/_internal/pub/lib/src/validator/name.dart b/sdk/lib/_internal/pub/lib/src/validator/name.dart
index 1b77ead..b939ac8 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/name.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/name.dart
@@ -53,7 +53,7 @@
   List<String> get _libraries {
     var libDir = path.join(entrypoint.root.dir, "lib");
     if (!dirExists(libDir)) return [];
-    return listDir(libDir, recursive: true)
+    return entrypoint.root.listFiles(beneath: libDir)
         .map((file) => path.relative(file, from: path.dirname(libDir)))
         .where((file) => !path.split(file).contains("src") &&
                          path.extension(file) == '.dart')
diff --git a/sdk/lib/_internal/pub/lib/src/version.dart b/sdk/lib/_internal/pub/lib/src/version.dart
index a726fd0..7e33fe2 100644
--- a/sdk/lib/_internal/pub/lib/src/version.dart
+++ b/sdk/lib/_internal/pub/lib/src/version.dart
@@ -125,9 +125,10 @@
     }
   }
 
-  /// Returns the primary version out of a list of candidates. This is the
-  /// highest-numbered stable (non-prerelease) version. If there are no stable
-  /// versions, it's just the highest-numbered version.
+  /// Returns the primary version out of a list of candidates.
+  ///
+  /// This is the highest-numbered stable (non-prerelease) version. If there
+  /// are no stable versions, it's just the highest-numbered version.
   static Version primary(List<Version> versions) {
     var primary;
     for (var version in versions) {
@@ -203,7 +204,7 @@
   }
 
   /// Gets the next patch version number that follows this one.
-  ///bed8b33fda6ec81c3ba52274d189bc0661ed12bf
+  ///
   /// If this version is a pre-release, then it just strips the pre-release
   /// suffix. Otherwise, it increments the patch version.
   Version get nextPatch {
@@ -292,9 +293,11 @@
 }
 
 /// A [VersionConstraint] is a predicate that can determine whether a given
-/// version is valid or not. For example, a ">= 2.0.0" constraint allows any
-/// version that is "2.0.0" or greater. Version objects themselves implement
-/// this to match a specific version.
+/// version is valid or not.
+///
+/// For example, a ">= 2.0.0" constraint allows any version that is "2.0.0" or
+/// greater. Version objects themselves implement this to match a specific
+/// version.
 abstract class VersionConstraint {
   /// A [VersionConstraint] that allows all versions.
   static VersionConstraint any = new VersionRange();
@@ -302,8 +305,10 @@
   /// A [VersionConstraint] that allows no versions: i.e. the empty set.
   static VersionConstraint empty = const _EmptyVersion();
 
-  /// Parses a version constraint. This string is either "any" or a series of
-  /// version parts. Each part can be one of:
+  /// Parses a version constraint.
+  ///
+  /// This string is either "any" or a series of version parts. Each part can
+  /// be one of:
   ///
   ///   * A version string like `1.2.3`. In other words, anything that can be
   ///     parsed by [Version.parse()].
@@ -395,9 +400,11 @@
   }
 
   /// Creates a new version constraint that is the intersection of
-  /// [constraints]. It will only allow versions that all of those constraints
-  /// allow. If constraints is empty, then it returns a VersionConstraint that
-  /// allows all versions.
+  /// [constraints].
+  ///
+  /// It only allows versions that all of those constraints allow. If
+  /// constraints is empty, then it returns a VersionConstraint that allows
+  /// all versions.
   factory VersionConstraint.intersection(
       Iterable<VersionConstraint> constraints) {
     var constraint = new VersionRange();
@@ -421,10 +428,11 @@
   VersionConstraint intersect(VersionConstraint other);
 }
 
-/// Constrains versions to a fall within a given range. If there is a minimum,
-/// then this only allows versions that are at that minimum or greater. If there
-/// is a maximum, then only versions less than that are allowed. In other words,
-/// this allows `>= min, < max`.
+/// Constrains versions to a fall within a given range.
+///
+/// If there is a minimum, then this only allows versions that are at that
+/// minimum or greater. If there is a maximum, then only versions less than
+/// that are allowed. In other words, this allows `>= min, < max`.
 class VersionRange implements VersionConstraint {
   final Version min;
   final Version max;
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index d4fa045..f9df64b 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -2,15 +2,8 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-test/hosted/version_negotiation_test: Pass, Timeout # Issue 14346
 test/serve/web_socket/url_to_asset_id_test: Pass, Slow
 
-[ $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
@@ -18,3 +11,6 @@
 # Pub only runs on the standalone VM, not the browser.
 [ $runtime == drt || $runtime == dartium || $runtime == opera ]
 *: Skip
+
+[ $runtime == vm && $system == windows ]
+test/run/app_can_read_from_stdin_test: Fail # Issue 19448
diff --git a/sdk/lib/_internal/pub/test/build/preserves_htaccess_test.dart b/sdk/lib/_internal/pub/test/build/preserves_htaccess_test.dart
new file mode 100644
index 0000000..e49fe21
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/build/preserves_htaccess_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  integration("preserves .htaccess as a special case", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('web', [
+        d.file('.htaccess', 'fblthp'),
+        d.file('.hidden', 'asdfgh')
+      ])
+    ]).create();
+
+    schedulePub(args: ["build"],
+        output: new RegExp(r'Built \d+ files? to "build".'));
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.dir('web', [
+          d.file('.htaccess', 'fblthp'),
+          d.nothing('.hidden')
+        ])
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart b/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart
index 8519a74..eb43c7e 100644
--- a/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart
@@ -23,7 +23,7 @@
     // Set up a cache with some packages.
     d.dir(cachePath, [
       d.dir('hosted', [
-        d.async(port.then((p) => d.dir('127.0.0.1%58$p', [
+        d.async(port.then((p) => d.dir('localhost%58$p', [
           d.dir("foo-1.2.3", [
             d.libPubspec("foo", "1.2.3"),
             d.file("broken.txt")
diff --git a/sdk/lib/_internal/pub/test/cache/repair/reinstalls_hosted_packages_test.dart b/sdk/lib/_internal/pub/test/cache/repair/reinstalls_hosted_packages_test.dart
index 5df38af..eee64d5 100644
--- a/sdk/lib/_internal/pub/test/cache/repair/reinstalls_hosted_packages_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/repair/reinstalls_hosted_packages_test.dart
@@ -21,7 +21,7 @@
     // Set up a cache with some broken packages.
     d.dir(cachePath, [
       d.dir('hosted', [
-        d.async(port.then((p) => d.dir('127.0.0.1%58$p', [
+        d.async(port.then((p) => d.dir('localhost%58$p', [
           d.dir("foo-1.2.3", [
             d.libPubspec("foo", "1.2.3"),
             d.file("broken.txt")
diff --git a/sdk/lib/_internal/pub/test/descriptor.dart b/sdk/lib/_internal/pub/test/descriptor.dart
index 25991ba..aec82a3 100644
--- a/sdk/lib/_internal/pub/test/descriptor.dart
+++ b/sdk/lib/_internal/pub/test/descriptor.dart
@@ -145,7 +145,7 @@
 Descriptor hostedCache(Iterable<Descriptor> contents) {
   return dir(cachePath, [
     dir('hosted', [
-      async(port.then((p) => dir('127.0.0.1%58$p', contents)))
+      async(port.then((p) => dir('localhost%58$p', contents)))
     ])
   ]);
 }
diff --git a/sdk/lib/_internal/pub/test/get/dry_run_does_not_apply_changes_test.dart b/sdk/lib/_internal/pub/test/get/dry_run_does_not_apply_changes_test.dart
new file mode 100644
index 0000000..add71d2
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/get/dry_run_does_not_apply_changes_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:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("--dry-run shows but does not apply changes", () {
+    servePackages([
+      packageMap("foo", "1.0.0")
+    ]);
+
+    d.appDir({
+      "foo": "1.0.0"
+    }).create();
+
+    pubGet(args: ["--dry-run"], output: allOf([
+      contains("+ foo 1.0.0"),
+      contains("Would change 1 dependency.")
+    ]));
+
+    d.dir(appPath, [
+      // The lockfile should not be created.
+      d.nothing("pubspec.lock"),
+      // The "packages" directory should not have been generated.
+      d.nothing("packages")
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/get/git/dependency_name_match_pubspec_test.dart b/sdk/lib/_internal/pub/test/get/git/dependency_name_match_pubspec_test.dart
index 0a1f645..880a251 100644
--- a/sdk/lib/_internal/pub/test/get/git/dependency_name_match_pubspec_test.dart
+++ b/sdk/lib/_internal/pub/test/get/git/dependency_name_match_pubspec_test.dart
@@ -4,6 +4,9 @@
 
 library pub_tests;
 
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -24,7 +27,7 @@
       })
     ]).create();
 
-    pubGet(error: new RegExp(r'"name" field "foo" doesn' "'" r't match '
-        r'expected name "weirdname"\.'));
+    pubGet(error: contains('"name" field doesn\'t match expected name '
+        '"weirdname".'), exitCode: exit_codes.DATA);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/get/git/require_pubspec_name_test.dart b/sdk/lib/_internal/pub/test/get/git/require_pubspec_name_test.dart
index 5195b55..530cc82 100644
--- a/sdk/lib/_internal/pub/test/get/git/require_pubspec_name_test.dart
+++ b/sdk/lib/_internal/pub/test/get/git/require_pubspec_name_test.dart
@@ -4,6 +4,9 @@
 
 library pub_tests;
 
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -20,7 +23,7 @@
 
     d.appDir({"foo": {"git": "../foo.git"}}).create();
 
-    pubGet(error: new RegExp(r'Missing the required "name" field \(e\.g\. '
-        r'"name: foo"\)\.'));
+    pubGet(error: contains('Missing the required "name" field.'),
+        exitCode: exit_codes.DATA);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/get/hosted/get_test.dart b/sdk/lib/_internal/pub/test/get/hosted/get_test.dart
index 8dd1d0e..2779da1 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/get_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/get_test.dart
@@ -26,6 +26,6 @@
     d.appDir({"bad name!": "1.2.3"}).create();
 
     pubGet(error: new RegExp(
-        r"Could not find package bad name! at http://127\.0\.0\.1:\d+\."));
+        r"Could not find package bad name! at http://localhost:\d+\."));
   });
 }
diff --git a/sdk/lib/_internal/pub/test/get/hosted/unlock_if_version_doesnt_exist_test.dart b/sdk/lib/_internal/pub/test/get/hosted/unlock_if_version_doesnt_exist_test.dart
new file mode 100644
index 0000000..2b662e6
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/get/hosted/unlock_if_version_doesnt_exist_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.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/io.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('upgrades a locked pub server package with a nonexistent version',
+      () {
+    servePackages([packageMap("foo", "1.0.0")]);
+
+    d.appDir({"foo": "any"}).create();
+    pubGet();
+    d.packagesDir({"foo": "1.0.0"}).validate();
+
+    schedule(() => deleteEntry(p.join(sandboxDir, cachePath)));
+
+    servePackages([packageMap("foo", "1.0.1")], replace: true);
+    pubGet();
+    d.packagesDir({"foo": "1.0.1"}).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart b/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart
index 944e6ed..527f597 100644
--- a/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart
+++ b/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart
@@ -17,7 +17,7 @@
       d.appDir({"foo": "1.2.3"}).create();
 
       pubCommand(command, error: new RegExp(r"""
-Could not find package foo at http://127\.0\.0\.1:\d+\.
+Could not find package foo at http://localhost:\d+\.
 Depended on by:
 - myapp""", multiLine: true));
     });
diff --git a/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart b/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart
index b9ca6bd..f602618 100644
--- a/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart
+++ b/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart
@@ -55,14 +55,10 @@
       server.handle('GET', '/api/packages/foo',
           (request) => new shelf.Response(406));
 
-      // TODO(nweiz): this shouldn't request the versions twice (issue 11077).
-      server.handle('GET', '/api/packages/foo',
-          (request) => new shelf.Response(406));
-
       pub.shouldExit(1);
 
       pub.stderr.expect(emitsLines(
-          "Pub 0.1.2+3 is incompatible with the current version of 127.0.0.1.\n"
+          "Pub 0.1.2+3 is incompatible with the current version of localhost.\n"
           "Upgrade pub to the latest version and try again."));
     });
   });
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
index b8bcffb..c920e19 100644
--- a/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
@@ -36,7 +36,7 @@
           "packages": {
             "foo": path.join(sandboxDir, "foo", "lib"),
             "bar": port.then((p) => path.join(sandboxDir, cachePath, "hosted",
-                "127.0.0.1%58$p", "bar-1.0.0", "lib")),
+                "localhost%58$p", "bar-1.0.0", "lib")),
             "myapp": canonicalize(path.join(sandboxDir, appPath, "lib"))
           },
           "input_files": [
diff --git a/sdk/lib/_internal/pub/test/lock_file_test.dart b/sdk/lib/_internal/pub/test/lock_file_test.dart
index 04430ab..85724e4 100644
--- a/sdk/lib/_internal/pub/test/lock_file_test.dart
+++ b/sdk/lib/_internal/pub/test/lock_file_test.dart
@@ -23,9 +23,12 @@
   Future<Pubspec> doDescribe(PackageId id) => throw new UnsupportedError(
       "Cannot describe mock packages.");
 
-  Future<bool> get(PackageId id, String path) => throw new UnsupportedError(
+  Future ensureLocal(PackageId id) => throw new UnsupportedError(
       "Cannot get a mock package.");
 
+  Future get(PackageId id, String symlink) => throw new UnsupportedError(
+      "Cannot get an mock.");
+
   Future<String> getDirectory(PackageId id) => throw new UnsupportedError(
       "Cannot get the directory for mock packages.");
 
diff --git a/sdk/lib/_internal/pub/test/package_files_test.dart b/sdk/lib/_internal/pub/test/package_list_files_test.dart
similarity index 85%
rename from sdk/lib/_internal/pub/test/package_files_test.dart
rename to sdk/lib/_internal/pub/test/package_list_files_test.dart
index 9598c76..9b5a06c 100644
--- a/sdk/lib/_internal/pub/test/package_files_test.dart
+++ b/sdk/lib/_internal/pub/test/package_list_files_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library packages_files_test;
+library packages_list_files_test;
 
 import 'package:path/path.dart' as path;
 import 'package:scheduled_test/scheduled_test.dart';
@@ -37,13 +37,13 @@
       ]).create();
 
       schedule(() {
-        expect(entrypoint.packageFiles(), completion(unorderedEquals([
+        expect(entrypoint.root.listFiles(), unorderedEquals([
           path.join(root, 'pubspec.yaml'),
           path.join(root, 'file1.txt'),
           path.join(root, 'file2.txt'),
           path.join(root, 'subdir', 'subfile1.txt'),
           path.join(root, 'subdir', 'subfile2.txt')
-        ])));
+        ]));
       });
     });
 
@@ -68,13 +68,13 @@
       ]).create();
 
       schedule(() {
-        expect(entrypoint.packageFiles(), completion(unorderedEquals([
+        expect(entrypoint.root.listFiles(), unorderedEquals([
           path.join(root, 'pubspec.yaml'),
           path.join(root, 'file1.txt'),
           path.join(root, 'file2.txt'),
           path.join(root, 'subdir', 'subfile1.txt'),
           path.join(root, 'subdir', 'subfile2.txt')
-        ])));
+        ]));
       });
     });
 
@@ -90,12 +90,12 @@
       ]).create();
 
       schedule(() {
-        expect(entrypoint.packageFiles(), completion(unorderedEquals([
+        expect(entrypoint.root.listFiles(), unorderedEquals([
           path.join(root, 'pubspec.yaml'),
           path.join(root, '.gitignore'),
           path.join(root, 'file2.text'),
           path.join(root, 'subdir', 'subfile2.text')
-        ])));
+        ]));
       });
     });
 
@@ -122,8 +122,8 @@
     schedule(() => deleteEntry(path.join(sandboxDir, appPath, 'target')));
 
     schedule(() {
-      expect(entrypoint.packageFiles(),
-          completion(equals([path.join(root, 'pubspec.yaml')])));
+      expect(entrypoint.root.listFiles(),
+          equals([path.join(root, 'pubspec.yaml')]));
     });
   });
 
@@ -134,8 +134,8 @@
     ]).create();
 
     schedule(() {
-      expect(entrypoint.packageFiles(),
-          completion(equals([path.join(root, 'pubspec.yaml')])));
+      expect(entrypoint.root.listFiles(),
+          equals([path.join(root, 'pubspec.yaml')]));
     });
   });
 
@@ -148,8 +148,8 @@
     ]).create();
 
     schedule(() {
-      expect(entrypoint.packageFiles(),
-          completion(equals([path.join(root, 'pubspec.yaml')])));
+      expect(entrypoint.root.listFiles(),
+          equals([path.join(root, 'pubspec.yaml')]));
     });
   });
 
@@ -161,10 +161,10 @@
     ]).create();
 
     schedule(() {
-      expect(entrypoint.packageFiles(), completion(unorderedEquals([
+      expect(entrypoint.root.listFiles(), unorderedEquals([
         path.join(root, 'pubspec.yaml'),
         path.join(root, 'pubspec.lock', 'file.txt')
-      ])));
+      ]));
     });
   });
 
@@ -184,13 +184,13 @@
       ]).create();
 
       schedule(() {
-        expect(entrypoint.packageFiles(beneath: path.join(root, 'subdir')),
-            completion(unorderedEquals([
+        expect(entrypoint.root.listFiles(beneath: path.join(root, 'subdir')),
+            unorderedEquals([
           path.join(root, 'subdir', 'subfile1.txt'),
           path.join(root, 'subdir', 'subfile2.txt'),
           path.join(root, 'subdir', 'subsubdir', 'subsubfile1.txt'),
           path.join(root, 'subdir', 'subsubdir', 'subsubfile2.txt')
-        ])));
+        ]));
       });
     });
 
@@ -209,13 +209,13 @@
       ]).create();
 
       schedule(() {
-        expect(entrypoint.packageFiles(beneath: path.join(root, 'packages')),
-            completion(unorderedEquals([
+        expect(entrypoint.root.listFiles(beneath: path.join(root, 'packages')),
+            unorderedEquals([
           path.join(root, 'packages', 'subfile1.txt'),
           path.join(root, 'packages', 'subfile2.txt'),
           path.join(root, 'packages', 'subsubdir', 'subsubfile1.txt'),
           path.join(root, 'packages', 'subsubdir', 'subsubfile2.txt')
-        ])));
+        ]));
       });
     });
   });
diff --git a/sdk/lib/_internal/pub/test/pub_get_and_upgrade_test.dart b/sdk/lib/_internal/pub/test/pub_get_and_upgrade_test.dart
index 337c957..c5d78a3 100644
--- a/sdk/lib/_internal/pub/test/pub_get_and_upgrade_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_get_and_upgrade_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
+import '../lib/src/exit_codes.dart' as exit_codes;
 import 'descriptor.dart' as d;
 import 'test_pub.dart';
 
@@ -27,8 +28,9 @@
           d.pubspec({"dependencies": {"foo": null}})
         ]).create();
 
-        pubCommand(command, error: new RegExp(r'Missing the required "name" '
-            r'field\.'));
+        pubCommand(command,
+            error: contains('Missing the required "name" field.'),
+            exitCode: exit_codes.DATA);
       });
     });
 
@@ -120,8 +122,9 @@
         })
       ]).create();
 
-      pubCommand(command, error: new RegExp(r'"dependencies.myapp": Package '
-          r'may not list itself as a dependency\.'));
+      pubCommand(command,
+          error: contains('A package may not list itself as a dependency.'),
+          exitCode: exit_codes.DATA);
     });
 
     integration('does not allow a dev dependency on itself', () {
@@ -134,8 +137,9 @@
         })
       ]).create();
 
-      pubCommand(command, error: new RegExp(r'"dev_dependencies.myapp": '
-          r'Package may not list itself as a dependency\.'));
+      pubCommand(command,
+          error: contains('A package may not list itself as a dependency.'),
+          exitCode: exit_codes.DATA);
     });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/pub_test.dart b/sdk/lib/_internal/pub/test/pub_test.dart
index 168008c..585b3f4 100644
--- a/sdk/lib/_internal/pub/test/pub_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_test.dart
@@ -34,6 +34,7 @@
       get        Get the current package's dependencies.
       help       Display help information for Pub.
       publish    Publish the current package to pub.dartlang.org.
+      run        Run an executable from a package.
       serve      Run a local web development server.
       upgrade    Upgrade the current package's dependencies to latest versions.
       uploader   Manage uploaders for a package on pub.dartlang.org.
@@ -69,6 +70,7 @@
           Usage: pub get
           -h, --help            Print usage information for this command.
               --[no-]offline    Use cached packages instead of accessing the network.
+          -n, --dry-run         Report what dependencies would change but don't change any.
     ''');
   });
 
@@ -80,6 +82,7 @@
           Usage: pub get
           -h, --help            Print usage information for this command.
               --[no-]offline    Use cached packages instead of accessing the network.
+          -n, --dry-run         Report what dependencies would change but don't change any.
     ''');
   });
 
@@ -115,6 +118,7 @@
           get        Get the current package's dependencies.
           help       Display help information for Pub.
           publish    Publish the current package to pub.dartlang.org.
+          run        Run an executable from a package.
           serve      Run a local web development server.
           upgrade    Upgrade the current package's dependencies to latest versions.
           uploader   Manage uploaders for a package on pub.dartlang.org.
@@ -197,6 +201,7 @@
             Usage: pub get
             -h, --help            Print usage information for this command.
                 --[no-]offline    Use cached packages instead of accessing the network.
+            -n, --dry-run         Report what dependencies would change but don't change any.
             ''');
     });
 
@@ -263,6 +268,7 @@
               get        Get the current package's dependencies.
               help       Display help information for Pub.
               publish    Publish the current package to pub.dartlang.org.
+              run        Run an executable from a package.
               serve      Run a local web development server.
               upgrade    Upgrade the current package's dependencies to latest versions.
               uploader   Manage uploaders for a package on pub.dartlang.org.
diff --git a/sdk/lib/_internal/pub/test/pubspec_test.dart b/sdk/lib/_internal/pub/test/pubspec_test.dart
index bbdca4f..bf65072 100644
--- a/sdk/lib/_internal/pub/test/pubspec_test.dart
+++ b/sdk/lib/_internal/pub/test/pubspec_test.dart
@@ -21,7 +21,10 @@
   Future<Pubspec> doDescribe(PackageId id) => throw new UnsupportedError(
       "Cannot describe mock packages.");
 
-  Future<bool> get(PackageId id, String path) => throw new UnsupportedError(
+  Future ensureLocal(PackageId id) => throw new UnsupportedError(
+      "Cannot get a mock package.");
+
+  Future get(PackageId id, String symlink) => throw new UnsupportedError(
       "Cannot get a mock package.");
 
   Future<String> getDirectory(PackageId id) => throw new UnsupportedError(
@@ -248,13 +251,13 @@
     test("throws if a transformer isn't a string or map", () {
       expectPubspecException('transformers: [12]',
           (pubspec) => pubspec.transformers,
-          '"transformers" field must be a string or map');
+          'A transformer must be a string or map.');
     });
 
     test("throws if a transformer's configuration isn't a map", () {
       expectPubspecException('transformers: [{pkg: 12}]',
           (pubspec) => pubspec.transformers,
-          '"transformers.pkg" field must be a map');
+          "A transformer's configuration must be a map.");
     });
 
     test("throws if a transformer's configuration contains an unknown "
@@ -263,8 +266,7 @@
 name: pkg
 transformers: [{pkg: {\$key: "value"}}]''',
           (pubspec) => pubspec.transformers,
-          'Invalid transformer configuration for "transformers.pkg": '
-          'Unknown reserved field "\$key"');
+          'Invalid transformer config: Unknown reserved field.');
     });
 
     test("doesn't throw if a transformer's configuration contains a "
@@ -285,8 +287,8 @@
 transformers:
 - pkg: {\$include: 123}''',
           (pubspec) => pubspec.transformers,
-          'Invalid transformer configuration for "transformers.pkg": '
-          '"\$include" field must be a string or list, but was "123"');
+          'Invalid transformer config: "\$include" field must be a string or '
+            'list.');
     });
 
     test("throws if the \$include list contains a non-string", () {
@@ -295,9 +297,8 @@
 transformers:
 - pkg: {\$include: ["ok", 123, "alright", null]}''',
         (pubspec) => pubspec.transformers,
-        'Invalid transformer configuration for "transformers.pkg": '
-        '"\$include" list field may only contain strings, but contained '
-        '"123" and "null"');
+        'Invalid transformer config: "\$include" field may contain only '
+          'strings.');
     });
 
     test("throws if the \$exclude value is not a string or list", () {
@@ -306,8 +307,8 @@
 transformers:
 - pkg: {\$exclude: 123}''',
         (pubspec) => pubspec.transformers,
-        'Invalid transformer configuration for "transformers.pkg": '
-        '"\$exclude" field must be a string or list, but was "123"');
+        'Invalid transformer config: "\$exclude" field must be a string or '
+          'list.');
     });
 
     test("throws if the \$exclude list contains a non-string", () {
@@ -316,9 +317,8 @@
 transformers:
 - pkg: {\$exclude: ["ok", 123, "alright", null]}''',
         (pubspec) => pubspec.transformers,
-        'Invalid transformer configuration for "transformers.pkg": '
-        '"\$exclude" list field may only contain strings, but contained '
-        '"123" and "null"');
+        'Invalid transformer config: "\$exclude" field may contain only '
+          'strings.');
     });
 
     test("throws if a transformer is not from a dependency", () {
@@ -327,7 +327,7 @@
 transformers: [foo]
 ''',
         (pubspec) => pubspec.transformers,
-        '"transformers.foo" refers to a package that\'s not a dependency.');
+        '"foo" is not a dependency.');
     });
 
     test("allows a transformer from a normal dependency", () {
@@ -339,7 +339,7 @@
 transformers:
 - foo''', sources);
 
-      expect(pubspec.transformers[0].single.package, equals("foo"));
+      expect(pubspec.transformers[0].single.id.package, equals("foo"));
     });
 
     test("allows a transformer from a dev dependency", () {
@@ -351,7 +351,7 @@
 transformers:
 - foo''', sources);
 
-      expect(pubspec.transformers[0].single.package, equals("foo"));
+      expect(pubspec.transformers[0].single.id.package, equals("foo"));
     });
 
     test("allows a transformer from a dependency override", () {
@@ -363,7 +363,7 @@
 transformers:
 - foo''', sources);
 
-      expect(pubspec.transformers[0].single.package, equals("foo"));
+      expect(pubspec.transformers[0].single.id.package, equals("foo"));
     });
 
     test("allows comment-only files", () {
diff --git a/sdk/lib/_internal/pub/test/run/app_can_read_from_stdin_test.dart b/sdk/lib/_internal/pub/test/run/app_can_read_from_stdin_test.dart
new file mode 100644
index 0000000..3dbb7031
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/app_can_read_from_stdin_test.dart
@@ -0,0 +1,40 @@
+// 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 '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const SCRIPT = """
+import 'dart:io';
+
+main() {
+  var line1 = stdin.readLineSync();
+  print("between");
+  var line2 = stdin.readLineSync();
+  print(line1);
+  print(line2);
+}
+""";
+
+main() {
+  initConfig();
+  integration('the spawned application can read from stdin', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("bin", [
+        d.file("script.dart", SCRIPT)
+      ])
+    ]).create();
+
+    var pub = pubRun(args: ["script"]);
+
+    pub.writeLine("first");
+    pub.stdout.expect("between");
+    pub.writeLine("second");
+    pub.stdout.expect("first");
+    pub.stdout.expect("second");
+    pub.shouldExit(0);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart b/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart
new file mode 100644
index 0000000..d47b950
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart
@@ -0,0 +1,94 @@
+// 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:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const SCRIPT = """
+import "package:myapp/lib.dart";
+main() {
+  callLib();
+}
+""";
+
+const LIB = """
+callLib() {
+  print("lib");
+}
+""";
+
+// Make it lazy so that "lib.dart" isn't transformed until after the process
+// is started. Otherwise, since this tranformer modifies .dart files, it will
+// be run while the transformers themselves are loading during pub run's
+// startup.
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class LoggingTransformer extends Transformer implements LazyTransformer {
+  LoggingTransformer.asPlugin();
+
+  String get allowedExtensions => '.dart';
+
+  void apply(Transform transform) {
+    transform.logger.info('\${transform.primaryInput.id}.');
+    transform.logger.warning('\${transform.primaryInput.id}.');
+  }
+
+  void declareOutputs(DeclaringTransform transform) {
+    // TODO(rnystrom): Remove this when #19408 is fixed.
+    transform.declareOutput(transform.primaryId);
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration('displays transformer log messages', () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [
+          d.file("lib.dart", LIB),
+          d.dir("src", [
+            d.file("transformer.dart", TRANSFORMER)
+          ])
+        ]),
+        d.dir("bin", [
+          d.file("script.dart", SCRIPT)
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      var pub = pubRun(args: ["script"],
+          transformers: ["myapp/src/transformer"]);
+
+      // Note that the info log is only displayed here because the test
+      // harness runs pub in verbose mode. By default, only the warning would
+      // be shown.
+      pub.stdout.expect("[Info from Logging]:");
+      pub.stdout.expect("myapp|bin/script.dart.");
+
+      pub.stderr.expect("[Warning from Logging]:");
+      pub.stderr.expect("myapp|bin/script.dart.");
+
+      pub.stdout.expect("[Info from Logging]:");
+      pub.stdout.expect("myapp|lib/lib.dart.");
+
+      pub.stderr.expect("[Warning from Logging]:");
+      pub.stderr.expect("myapp|lib/lib.dart.");
+
+      pub.stdout.expect("lib");
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/does_not_run_on_transformer_error_test.dart b/sdk/lib/_internal/pub/test/run/does_not_run_on_transformer_error_test.dart
new file mode 100644
index 0000000..8634e1e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/does_not_run_on_transformer_error_test.dart
@@ -0,0 +1,64 @@
+// 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 '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const SCRIPT = """
+main() {
+  print("should not get here!");
+}
+""";
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class FailingTransformer extends Transformer {
+  FailingTransformer.asPlugin();
+
+  String get allowedExtensions => '.dart';
+
+  void apply(Transform transform) {
+    // Don't run on the transformer itself.
+    if (transform.primaryInput.id.path.startsWith("lib")) return;
+    transform.logger.error('\${transform.primaryInput.id}.');
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration('does not run if a transformer has an 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("bin", [
+          d.file("script.dart", SCRIPT)
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      var pub = pubRun(args: ["script"],
+          transformers: ["myapp/src/transformer"]);
+
+      pub.stderr.expect("[Error from Failing]:");
+      pub.stderr.expect("myapp|bin/script.dart.");
+
+      // Note: no output from the script.
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart b/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart
new file mode 100644
index 0000000..e92f4c3c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('Errors if the executable does not exist.', () {
+    d.dir(appPath, [
+      d.appPubspec()
+    ]).create();
+
+    schedulePub(args: ["run"],
+        error: """
+Must specify an executable to run.
+
+Usage: pub run <executable> [args...]
+-h, --help    Print usage information for this command.
+""",
+        exitCode: exit_codes.USAGE);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/errors_if_only_transitive_dependency_test.dart b/sdk/lib/_internal/pub/test/run/errors_if_only_transitive_dependency_test.dart
new file mode 100644
index 0000000..ca9493f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/errors_if_only_transitive_dependency_test.dart
@@ -0,0 +1,39 @@
+// 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 '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('Errors if the script is in a non-immediate dependency.', () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("bin", [
+        d.file("bar.dart", "main() => print('foobar');")
+      ])
+    ]).create();
+
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0", deps: {
+        "foo": {"path": "../foo"}
+      })
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "bar": {"path": "../bar"}
+      })
+    ]).create();
+
+    pubGet();
+
+    var pub = pubRun(args: ["foo:script"]);
+    pub.stderr.expect('Package "foo" is not an immediate dependency.');
+    pub.stderr.expect('Cannot run executables in transitive dependencies.');
+    pub.shouldExit(exit_codes.DATA);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart b/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
new file mode 100644
index 0000000..81f3a51
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('Errors if the executable is in a subdirectory in a '
+      'dependency.', () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0")
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "foo": {"path": "../foo"}
+      })
+    ]).create();
+
+    schedulePub(args: ["run", "foo:sub/dir"],
+        error: """
+Can not run an executable in a subdirectory of a dependency.
+
+Usage: pub run <executable> [args...]
+-h, --help    Print usage information for this command.
+""",
+        exitCode: exit_codes.USAGE);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/includes_parent_directories_of_entrypoint_test.dart b/sdk/lib/_internal/pub/test/run/includes_parent_directories_of_entrypoint_test.dart
new file mode 100644
index 0000000..f938d30
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/includes_parent_directories_of_entrypoint_test.dart
@@ -0,0 +1,40 @@
+// 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:path/path.dart' as path;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const SCRIPT = r"""
+import '../../a.dart';
+import '../b.dart';
+main() {
+  print("$a $b");
+}
+""";
+
+main() {
+  initConfig();
+  integration('allows assets in parent directories of the entrypoint to be'
+      'accessed', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("tool", [
+        d.file("a.dart", "var a = 'a';"),
+        d.dir("a", [
+          d.file("b.dart", "var b = 'b';"),
+          d.dir("b", [
+            d.file("app.dart", SCRIPT)
+          ])
+        ])
+      ])
+    ]).create();
+
+    var pub = pubRun(args: [path.join("tool", "a", "b", "app")]);
+    pub.stdout.expect("a b");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/nonexistent_dependency_test.dart b/sdk/lib/_internal/pub/test/run/nonexistent_dependency_test.dart
new file mode 100644
index 0000000..10eb68b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/nonexistent_dependency_test.dart
@@ -0,0 +1,22 @@
+// 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 '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('Errors if the script is in an unknown package.', () {
+    d.dir(appPath, [
+      d.appPubspec()
+    ]).create();
+
+    var pub = pubRun(args: ["foo:script"]);
+    pub.stderr.expect('Could not find package "foo". Did you forget to add a '
+        'dependency?');
+    pub.shouldExit(exit_codes.DATA);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/nonexistent_script_in_dependency_test.dart b/sdk/lib/_internal/pub/test/run/nonexistent_script_in_dependency_test.dart
new file mode 100644
index 0000000..8379a86
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/nonexistent_script_in_dependency_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as p;
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('Errors if the script in a dependency does not exist.', () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0")
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "foo": {"path": "../foo"}
+      })
+    ]).create();
+
+    pubGet();
+
+    var pub = pubRun(args: ["foo:script"]);
+    pub.stderr.expect(
+        "Could not find ${p.join("bin", "script.dart")} in package foo.");
+    pub.shouldExit(exit_codes.NO_INPUT);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/nonexistent_script_test.dart b/sdk/lib/_internal/pub/test/run/nonexistent_script_test.dart
new file mode 100644
index 0000000..03e9d9d
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/nonexistent_script_test.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.
+
+import 'package:path/path.dart' as p;
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('Errors if the script does not exist.', () {
+    d.dir(appPath, [
+      d.appPubspec()
+    ]).create();
+
+    var pub = pubRun(args: ["script"]);
+    pub.stderr.expect("Could not find ${p.join("bin", "script.dart")}.");
+    pub.shouldExit(exit_codes.NO_INPUT);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/passes_along_arguments_test.dart b/sdk/lib/_internal/pub/test/run/passes_along_arguments_test.dart
new file mode 100644
index 0000000..888319e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/passes_along_arguments_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const SCRIPT = """
+main(List<String> args) {
+  print(args.join(" "));
+}
+""";
+
+main() {
+  initConfig();
+  integration('passes arguments to the spawned script', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("bin", [
+        d.file("args.dart", SCRIPT)
+      ])
+    ]).create();
+
+    // Use some args that would trip up pub's arg parser to ensure that it
+    // isn't trying to look at them.
+    var pub = pubRun(args: ["args", "--verbose", "-m", "--", "help"]);
+
+    pub.stdout.expect("--verbose -m -- help");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_a_generated_script_test.dart b/sdk/lib/_internal/pub/test/run/runs_a_generated_script_test.dart
new file mode 100644
index 0000000..daedf25
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_a_generated_script_test.dart
@@ -0,0 +1,51 @@
+// 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 '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class DartTransformer extends Transformer {
+  DartTransformer.asPlugin();
+
+  String get allowedExtensions => '.in';
+
+  void apply(Transform transform) {
+    transform.addOutput(new Asset.fromString(
+        new AssetId("myapp", "bin/script.dart"),
+        "void main() => print('generated');"));
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration('runs a script generated from scratch by a transformer', () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", TRANSFORMER),
+          d.file("primary.in", "")
+        ])])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      var pub = pubRun(args: ["script"],
+          transformers: ["myapp/src/transformer"]);
+
+      pub.stdout.expect("generated");
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_app_in_directory_in_entrypoint_test.dart b/sdk/lib/_internal/pub/test/run/runs_app_in_directory_in_entrypoint_test.dart
new file mode 100644
index 0000000..9eea7b6
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_app_in_directory_in_entrypoint_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as path;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('runs a Dart application in the entrypoint package', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("tool", [
+        d.file("app.dart", "main() => print('tool');"),
+        d.dir("sub", [
+          d.file("app.dart", "main() => print('sub');")
+        ])
+      ])
+    ]).create();
+
+    var pub = pubRun(args: [path.join("tool", "app")]);
+    pub.stdout.expect("tool");
+    pub.shouldExit();
+
+    pub = pubRun(args: [path.join("tool", "sub", "app")]);
+    pub.stdout.expect("sub");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_app_in_entrypoint_test.dart b/sdk/lib/_internal/pub/test/run/runs_app_in_entrypoint_test.dart
new file mode 100644
index 0000000..f9a0209
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_app_in_entrypoint_test.dart
@@ -0,0 +1,34 @@
+// 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 '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const SCRIPT = """
+import 'dart:io';
+
+main() {
+  stdout.writeln("stdout output");
+  stderr.writeln("stderr output");
+  exitCode = 123;
+}
+""";
+
+main() {
+  initConfig();
+  integration('runs a Dart application in the entrypoint package', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("bin", [
+        d.file("script.dart", SCRIPT)
+      ])
+    ]).create();
+
+    var pub = pubRun(args: ["script"]);
+    pub.stdout.expect("stdout output");
+    pub.stderr.expect("stderr output");
+    pub.shouldExit(123);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_named_app_in_dependency_test.dart b/sdk/lib/_internal/pub/test/run/runs_named_app_in_dependency_test.dart
new file mode 100644
index 0000000..d8b3425
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_named_app_in_dependency_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('runs a named Dart application in a dependency', () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("bin", [
+        d.file("bar.dart", "main() => print('foobar');")
+      ])
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "foo": {"path": "../foo"}
+      })
+    ]).create();
+
+    pubGet();
+
+    var pub = pubRun(args: ["foo:bar"]);
+    pub.stdout.expect("foobar");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_named_app_in_dev_dependency_test.dart b/sdk/lib/_internal/pub/test/run/runs_named_app_in_dev_dependency_test.dart
new file mode 100644
index 0000000..65c75b9
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_named_app_in_dev_dependency_test.dart
@@ -0,0 +1,34 @@
+// 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 '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('runs a named Dart application in a dev dependency', () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("bin", [
+        d.file("bar.dart", "main() => print('foobar');")
+      ])
+    ]).create();
+
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dev_dependencies": {
+          "foo": {"path": "../foo"}
+        }
+      })
+    ]).create();
+
+    pubGet();
+
+    var pub = pubRun(args: ["foo:bar"]);
+    pub.stdout.expect("foobar");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_the_script_in_checked_mode_test.dart b/sdk/lib/_internal/pub/test/run/runs_the_script_in_checked_mode_test.dart
new file mode 100644
index 0000000..fd6b27a
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_the_script_in_checked_mode_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.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+const SCRIPT = """
+main() {
+  int a = true;
+}
+""";
+
+main() {
+  initConfig();
+  integration('runs the script in checked mode by default', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("bin", [
+        d.file("script.dart", SCRIPT)
+      ])
+    ]).create();
+
+    schedulePub(args: ["run", "script"],
+        error: contains("'bool' is not a subtype of type 'int' of 'a'"),
+        exitCode: 255);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_transformer_in_entrypoint_test.dart b/sdk/lib/_internal/pub/test/run/runs_transformer_in_entrypoint_test.dart
new file mode 100644
index 0000000..d777d61
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_transformer_in_entrypoint_test.dart
@@ -0,0 +1,43 @@
+// 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 '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+import 'utils.dart';
+
+const SCRIPT = """
+const TOKEN = "hi";
+main() {
+  print(TOKEN);
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration('runs transformers in the entrypoint package', () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", dartTransformer("transformed"))
+        ])]),
+        d.dir("bin", [
+          d.file("hi.dart", SCRIPT)
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      var pub = pubRun(args: ["hi"],
+          transformers: ["myapp/src/transformer"]);
+
+      pub.stdout.expect("(hi, transformed)");
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/utils.dart b/sdk/lib/_internal/pub/test/run/utils.dart
new file mode 100644
index 0000000..6535b33
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/utils.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_process.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../test_pub.dart';
+
+/// Schedules starting the "pub run" process and validates the expected startup
+/// output.
+///
+/// if [transformers] is given, it should contain a list of transformer IDs
+/// (like "myapp/src/transformer") and this will validate that the output for
+/// loading those is shown.
+///
+/// Returns the `pub run` process.
+ScheduledProcess pubRun({Iterable<String> args,
+  Iterable<String> transformers}) {
+  var pub = startPub(args: ["run"]..addAll(args));
+
+  // This isn't normally printed, but the pub test infrastructure runs pub in
+  // verbose mode, which enables this.
+  pub.stdout.expect(startsWith("Loading source assets"));
+
+  if (transformers != null) {
+    for (var transformer in transformers) {
+      pub.stdout.expect(startsWith("Loading $transformer transformers"));
+    }
+  }
+  return pub;
+}
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_in_a_path_dependency_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_in_a_path_dependency_test.dart
new file mode 100644
index 0000000..d92eb26
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_in_a_path_dependency_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("doesn't serve .gitignored assets in a path dependency", () {
+    ensureGit();
+
+    d.dir(appPath, [
+      d.appPubspec({"foo": {"path": "../foo"}}),
+    ]).create();
+
+    d.git("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [
+        d.file("outer.txt", "outer contents"),
+        d.file("visible.txt", "visible"),
+        d.dir("dir", [
+          d.file("inner.txt", "inner contents"),
+        ])
+      ]),
+      d.file(".gitignore", "/lib/outer.txt\n/lib/dir")
+    ]).create();
+
+    pubServe(shouldGetFirst: true);
+    requestShould404("packages/foo/outer.txt");
+    requestShould404("packages/foo/dir/inner.txt");
+    requestShouldSucceed("packages/foo/visible.txt", "visible");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_test.dart
new file mode 100644
index 0000000..598ecf7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("doesn't serve .gitignored assets", () {
+    ensureGit();
+
+    d.git(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("outer.txt", "outer contents"),
+        d.dir("dir", [
+          d.file("inner.txt", "inner contents"),
+        ])
+      ]),
+      d.file(".gitignore", "/web/outer.txt\n/web/dir")
+    ]).create();
+
+    pubServe();
+    requestShould404("outer.txt");
+    requestShould404("dir/inner.txt");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_serve_hidden_assets_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_serve_hidden_assets_test.dart
new file mode 100644
index 0000000..0429e7e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/does_not_serve_hidden_assets_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("doesn't serve hidden assets", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file(".outer.txt", "outer contents"),
+        d.dir(".dir", [
+          d.file("inner.txt", "inner contents"),
+        ])
+      ])
+    ]).create();
+
+    pubServe();
+    requestShould404(".outer.txt");
+    requestShould404(".dir/inner.txt");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/serves_hidden_assets_that_arent_gitignored_test.dart b/sdk/lib/_internal/pub/test/serve/serves_hidden_assets_that_arent_gitignored_test.dart
new file mode 100644
index 0000000..5ef198f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/serves_hidden_assets_that_arent_gitignored_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("serves hidden assets that aren't .gitignored", () {
+    ensureGit();
+
+    d.git(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file(".outer.txt", "outer contents"),
+        d.dir(".dir", [
+          d.file("inner.txt", "inner contents"),
+        ])
+      ])
+    ]).create();
+
+    pubServe();
+    requestShouldSucceed(".outer.txt", "outer contents");
+    requestShouldSucceed(".dir/inner.txt", "inner contents");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/utils.dart b/sdk/lib/_internal/pub/test/serve/utils.dart
index 725c3b4..0e5d021 100644
--- a/sdk/lib/_internal/pub/test/serve/utils.dart
+++ b/sdk/lib/_internal/pub/test/serve/utils.dart
@@ -98,6 +98,9 @@
 /// If [import] is passed, it should be the name of a package that defines its
 /// own TOKEN constant. The primary library of that package will be imported
 /// here and its TOKEN value will be added to this library's.
+///
+/// This transformer takes one configuration field: "addition". This is
+/// concatenated to its TOKEN value before adding it to the output library.
 String dartTransformer(String id, {String import}) {
   if (import != null) {
     id = '$id imports \${$import.TOKEN}';
@@ -112,12 +115,16 @@
 import 'package:barback/barback.dart';
 $import
 
+import 'dart:io';
+
 const TOKEN = "$id";
 
 final _tokenRegExp = new RegExp(r'^const TOKEN = "(.*?)";\$', multiLine: true);
 
 class DartTransformer extends Transformer {
-  DartTransformer.asPlugin();
+  final BarbackSettings _settings;
+
+  DartTransformer.asPlugin(this._settings);
 
   String get allowedExtensions => '.dart';
 
@@ -125,7 +132,10 @@
     return transform.primaryInput.readAsString().then((contents) {
       transform.addOutput(new Asset.fromString(transform.primaryInput.id,
           contents.replaceAllMapped(_tokenRegExp, (match) {
-        return 'const TOKEN = "(\${match[1]}, \$TOKEN)";';
+        var token = TOKEN;
+        var addition = _settings.configuration["addition"];
+        if (addition != null) token += addition;
+        return 'const TOKEN = "(\${match[1]}, \$token)";';
       })));
     });
   }
@@ -144,7 +154,6 @@
   var pubArgs = [
     "serve",
     "--port=0", // Use port 0 to get an ephemeral port.
-    "--hostname=127.0.0.1", // Force IPv4 on bots.
     "--force-poll",
     "--log-admin-url"
   ];
@@ -185,7 +194,10 @@
   });
 
   if (shouldGetFirst) {
-    _pubServer.stdout.expect(consumeThrough("Got dependencies!"));
+    _pubServer.stdout.expect(consumeThrough(anyOf([
+      "Got dependencies!",
+      matches(new RegExp(r"^Changed \d+ dependenc"))
+    ])));
   }
 
   _pubServer.stdout.expect(startsWith("Loading source assets..."));
@@ -206,9 +218,9 @@
 
 /// The regular expression for parsing pub's output line describing the URL for
 /// the server.
-final _parsePortRegExp = new RegExp(r"([^ ]+) +on http://127\.0\.0\.1:(\d+)");
+final _parsePortRegExp = new RegExp(r"([^ ]+) +on http://localhost:(\d+)");
 
-/// Parses the port number from the "Running admin server on 127.0.0.1:1234"
+/// Parses the port number from the "Running admin server on localhost:1234"
 /// line printed by pub serve.
 bool _parseAdminPort(String line) {
   var match = _parsePortRegExp.firstMatch(line);
@@ -217,7 +229,7 @@
   return true;
 }
 
-/// Parses the port number from the "Serving blah on 127.0.0.1:1234" line
+/// Parses the port number from the "Serving blah on localhost:1234" line
 /// printed by pub serve.
 bool _parsePort(String line) {
   var match = _parsePortRegExp.firstMatch(line);
@@ -322,7 +334,7 @@
   expect(_pubServer, isNotNull);
   expect(_adminPort, isNotNull);
 
-  return WebSocket.connect("ws://127.0.0.1:$_adminPort").then((socket) {
+  return WebSocket.connect("ws://localhost:$_adminPort").then((socket) {
     _webSocket = socket;
     // TODO(rnystrom): Works around #13913.
     _webSocketBroadcastStream = _webSocket.map(JSON.decode).asBroadcastStream();
@@ -480,7 +492,7 @@
 String _getServerUrlSync([String root, String path]) {
   if (root == null) root = 'web';
   expect(_ports, contains(root));
-  var url = "http://127.0.0.1:${_ports[root]}";
+  var url = "http://localhost:${_ports[root]}";
   if (path != null) url = "$url/$path";
   return url;
 }
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_unserve_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_unserve_test.dart
index d8f60e4..984a658 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_unserve_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_unserve_test.dart
@@ -42,8 +42,7 @@
         // of the new server and "unserveDirectory" returns the URL of the
         // server that was turned off. We're asserting that the same server was
         // both started and stopped.
-        expect(results[0]["result"]["url"],
-            matches(r"http://127\.0\.0\.1:\d+"));
+        expect(results[0]["result"]["url"], matches(r"http://localhost:\d+"));
         expect(results[0]["result"], equals(results[1]["result"]));
       });
     });
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart
index a3de26a..148f74d 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart
@@ -27,7 +27,7 @@
 
     // Bind the new directory.
     expectWebSocketResult("serveDirectory", {"path": "test"}, {
-      "url": matches(r"http://127\.0\.0\.1:\d+")
+      "url": matches(r"http://localhost:\d+")
     }).then((response) {
       var url = Uri.parse(response["url"]);
       registerServerPort("test", url.port);
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index bdeebe0..1f7d94c 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -2,10 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// Test infrastructure for testing pub. Unlike typical unit tests, most pub
-/// tests are integration tests that stage some stuff on the file system, run
-/// pub, and then validate the results. This library provides an API to build
-/// tests like that.
+/// Test infrastructure for testing pub.
+///
+/// Unlike typical unit tests, most pub tests are integration tests that stage
+/// some stuff on the file system, run pub, and then validate the results. This
+/// library provides an API to build tests like that.
 library test_pub;
 
 import 'dart:async';
@@ -149,10 +150,10 @@
   }, "get previous network requests");
 }
 
-/// Creates an HTTP server to serve [contents] as static files. This server will
-/// exist only for the duration of the pub run.
+/// Creates an HTTP server to serve [contents] as static files.
 ///
-/// Subsequent calls to [serve] will replace the previous server.
+/// This server will exist only for the duration of the pub run. Subsequent
+/// calls to [serve] replace the previous server.
 void serve([List<d.Descriptor> contents]) {
   var baseDir = d.dir("serve-dir", contents);
 
@@ -170,7 +171,7 @@
             .catchError((error) {
           return new shelf.Response.notFound('File "$path" not found.');
         });
-      }, '127.0.0.1', 0).then((server) {
+      }, 'localhost', 0).then((server) {
         _server = server;
         _portCompleter.complete(_server.port);
         currentSchedule.onComplete.schedule(_closeServer);
@@ -179,8 +180,9 @@
   }, 'starting a server serving:\n${baseDir.describe()}');
 }
 
-/// Closes [_server]. Returns a [Future] that will complete after the [_server]
-/// is closed.
+/// Closes [_server].
+///
+/// Returns a [Future] that completes after the [_server] is closed.
 Future _closeServer() {
   if (_server == null) return new Future.value();
   var future = _server.close();
@@ -209,18 +211,21 @@
 /// this test.
 d.DirectoryDescriptor _servedPackageDir;
 
-/// A map from package names to parsed pubspec maps for those packages. This
-/// represents the packages currently being served by [servePackages], and is
-/// `null` if [servePackages] has not yet been called for this test.
+/// A map from package names to parsed pubspec maps for those packages.
+///
+/// This represents the packages currently being served by [servePackages], and
+/// is `null` if [servePackages] has not yet been called for this test.
 Map<String, List<Map>> _servedPackages;
 
 /// Creates an HTTP server that replicates the structure of pub.dartlang.org.
+///
 /// [pubspecs] is a list of unserialized pubspecs representing the packages to
 /// serve.
 ///
-/// Subsequent calls to [servePackages] will add to the set of packages that
-/// are being served. Previous packages will continue to be served.
-void servePackages(List<Map> pubspecs) {
+/// If [replace] is false, subsequent calls to [servePackages] will add to the
+/// set of packages that are being served. Previous packages will continue to be
+/// served. Otherwise, the previous packages will no longer be served.
+void servePackages(List<Map> pubspecs, {bool replace: false}) {
   if (_servedPackages == null || _servedPackageDir == null) {
     _servedPackages = <String, List<Map>>{};
     _servedApiPackageDir = d.dir('packages', []);
@@ -239,6 +244,8 @@
 
   schedule(() {
     return awaitObject(pubspecs).then((resolvedPubspecs) {
+      if (replace) _servedPackages.clear();
+
       for (var spec in resolvedPubspecs) {
         var name = spec['name'];
         var version = spec['version'];
@@ -284,15 +291,20 @@
 String get sandboxDir => _sandboxDir;
 String _sandboxDir;
 
-/// The path of the package cache directory used for tests. Relative to the
+/// The path to the Dart repo's packages.
+final String pkgPath = path.absolute(path.join(
+    path.dirname(Platform.executable),
+    '..', '..', '..', '..', 'pkg'));
+
+/// The path of the package cache directory used for tests, relative to the
 /// sandbox directory.
 final String cachePath = "cache";
 
-/// The path of the mock app directory used for tests. Relative to the sandbox
+/// The path of the mock app directory used for tests, relative to the sandbox
 /// directory.
 final String appPath = "myapp";
 
-/// The path of the packages directory in the mock app used for tests. Relative
+/// The path of the packages directory in the mock app used for tests, relative
 /// to the sandbox directory.
 final String packagesPath = "$appPath/packages";
 
@@ -302,7 +314,8 @@
 /// Enum identifying a pub command that can be run with a well-defined success
 /// output.
 class RunCommand {
-  static final get = new RunCommand('get', new RegExp(r'Got dependencies!$'));
+  static final get = new RunCommand('get', new RegExp(
+      r'Got dependencies!|Changed \d+ dependenc(y|ies)!'));
   static final upgrade = new RunCommand('upgrade', new RegExp(
       r'(No dependencies changed\.|Changed \d+ dependenc(y|ies)!)$'));
 
@@ -311,6 +324,8 @@
   RunCommand(this.name, this.success);
 }
 
+/// Runs the tests defined within [callback] using both pub get and pub upgrade.
+///
 /// Many tests validate behavior that is the same between pub get and
 /// upgrade have the same behavior. Instead of duplicating those tests, this
 /// takes a callback that defines get/upgrade agnostic tests and runs them
@@ -327,10 +342,13 @@
 /// understands the normal output of a successful pub command. If [warning] is
 /// given, it expects the command to complete successfully *and* print
 /// [warning] to stderr. If [error] is given, it expects the command to *only*
-/// print [error] to stderr.
+/// print [error] to stderr. [output], [error], and [warning] may be strings,
+/// [RegExp]s, or [Matcher]s.
+///
+/// If [exitCode] is given, expects the command to exit with that code.
 // TODO(rnystrom): Clean up other tests to call this when possible.
 void pubCommand(RunCommand command,
-    {Iterable<String> args, Pattern output, Pattern error, Pattern warning}) {
+    {Iterable<String> args, output, error, warning, int exitCode}) {
   if (error != null && warning != null) {
     throw new ArgumentError("Cannot pass both 'error' and 'warning'.");
   }
@@ -340,8 +358,7 @@
 
   if (output == null) output = command.success;
 
-  var exitCode = null;
-  if (error != null) exitCode = 1;
+  if (error != null && exitCode == null) exitCode = 1;
 
   // No success output on an error.
   if (error != null) output = null;
@@ -350,19 +367,20 @@
   schedulePub(args: allArgs, output: output, error: error, exitCode: exitCode);
 }
 
-void pubGet({Iterable<String> args, Pattern error,
-    Pattern warning}) {
-  pubCommand(RunCommand.get, args: args, error: error, warning: warning);
+void pubGet({Iterable<String> args, output, error, warning, int exitCode}) {
+  pubCommand(RunCommand.get, args: args, output: output, error: error,
+      warning: warning, exitCode: exitCode);
 }
 
-void pubUpgrade({Iterable<String> args, Pattern output, Pattern error,
-    Pattern warning}) {
+void pubUpgrade({Iterable<String> args, output, error, warning, int exitCode}) {
   pubCommand(RunCommand.upgrade, args: args, output: output, error: error,
-      warning: warning);
+      warning: warning, exitCode: exitCode);
 }
 
-/// Defines an integration test. The [body] should schedule a series of
-/// operations which will be run asynchronously.
+/// Defines an integration test.
+///
+/// The [body] should schedule a series of operations which will be run
+/// asynchronously.
 void integration(String description, void body()) =>
   _integration(description, body, test);
 
@@ -473,6 +491,7 @@
 }
 
 /// Handles the beginning confirmation process for uploading a packages.
+///
 /// Ensures that the right output is shown and then enters "y" to confirm the
 /// upload.
 void confirmPublish(ScheduledProcess pub) {
@@ -535,7 +554,7 @@
     // dependencies will look there.
     if (_hasServer) {
       return port.then((p) {
-        environment['PUB_HOSTED_URL'] = "http://127.0.0.1:$p";
+        environment['PUB_HOSTED_URL'] = "http://localhost:$p";
         return environment;
       });
     }
@@ -646,16 +665,12 @@
     currentSchedule.timeout = new Duration(seconds: 30);
   }
 
-  schedule(() {
-    return gitlib.isInstalled.then((installed) {
-      if (!installed) {
-        throw new Exception("Git must be installed to run this test.");
-      }
-    });
-  }, 'ensuring that Git is installed');
+  if (!gitlib.isInstalled) {
+    throw new Exception("Git must be installed to run this test.");
+  }
 }
 
-/// Create a lock file for [package] without running `pub get`.
+/// Creates a lock file for [package] without running `pub get`.
 ///
 /// [sandbox] is a list of path dependencies to be found in the sandbox
 /// directory. [pkg] is a list of packages in the Dart repo's "pkg" directory;
@@ -675,10 +690,6 @@
   }
 
   if (pkg != null) {
-    var pkgDir = path.absolute(path.join(
-        path.dirname(Platform.executable),
-        '..', '..', '..', '..', 'pkg'));
-
     _addPackage(String package) {
       if (dependencies.containsKey(package)) return;
 
@@ -691,7 +702,7 @@
         }
         packagePath = _barbackDir;
       } else {
-        packagePath = path.join(pkgDir, package);
+        packagePath = path.join(pkgPath, package);
       }
 
       dependencies[package] = packagePath;
@@ -729,7 +740,7 @@
       lockFile.serialize(null, sources)).create();
 }
 
-/// Use [client] as the mock HTTP client for this test.
+/// Uses [client] as the mock HTTP client for this test.
 ///
 /// Note that this will only affect HTTP requests made via http.dart in the
 /// parent process.
@@ -877,8 +888,10 @@
 /// A function that creates a [Validator] subclass.
 typedef Validator ValidatorCreator(Entrypoint entrypoint);
 
-/// Schedules a single [Validator] to run on the [appPath]. Returns a scheduled
-/// Future that contains the errors and warnings produced by that validator.
+/// Schedules a single [Validator] to run on the [appPath].
+///
+/// Returns a scheduled Future that contains the errors and warnings produced
+/// by that validator.
 Future<Pair<List<String>, List<String>>> schedulePackageValidation(
     ValidatorCreator fn) {
   return schedule(() {
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 4b95584..528b9c8 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
@@ -69,9 +69,19 @@
       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."""));
+[Rewrite on myapp|web/foo.txt]:"""));
+
+      // The details of the analyzer's error message change pretty frequently,
+      // so instead of validating the entire line, just look for a couple of
+      // salient bits of information.
+      pub.stderr.expect(allOf([
+        contains("2"),                              // The line number.
+        contains("1"),                              // The column number.
+        contains("http://fake.com/not_real.dart"),  // The library.
+        contains("ERROR"),                          // That it's an error.
+      ]));
+
+      pub.stderr.expect("Build failed.");
 
       pub.shouldExit(exit_codes.DATA);
     });
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
deleted file mode 100644
index df8c0ba..0000000
--- a/sdk/lib/_internal/pub/test/transformer/detects_a_transformer_cycle_test.dart
+++ /dev/null
@@ -1,48 +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();
-  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();
-
-      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"));
-    });
-  });
-}
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
deleted file mode 100644
index fe973e8..0000000
--- a/sdk/lib/_internal/pub/test/transformer/detects_an_ordering_dependency_cycle_test.dart
+++ /dev/null
@@ -1,66 +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();
-  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("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();
-
-      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"));
-    });
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_aggregate_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_aggregate_transformer_test.dart
new file mode 100644
index 0000000..819d30fff
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_aggregate_transformer_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../../serve/utils.dart';
+
+const AGGREGATE_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+
+class ManyToOneTransformer extends AggregateTransformer {
+  ManyToOneTransformer.asPlugin();
+
+  String classifyPrimary(AssetId id) {
+    if (id.extension != '.txt') return null;
+    return p.url.dirname(id.path);
+  }
+
+  Future apply(AggregateTransform transform) {
+    return transform.primaryInputs.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,
+          p.url.join(transform.key, 'out.txt'));
+      transform.addOutput(new Asset.fromString(id, contents.join('\\n')));
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions(">=0.14.1", () {
+    integration("works on an aggregate transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp": {
+                "\$include": ["web/a.txt", "web/b.txt", "web/c.txt"],
+                "\$exclude": "web/a.txt"
+              }
+            }
+          ]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", AGGREGATE_TRANSFORMER),
+        ]),
+        d.dir("web", [
+          d.file("a.txt", "a"),
+          d.file("b.txt", "b"),
+          d.file("c.txt", "c"),
+          d.file("d.txt", "d")
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShouldSucceed("out.txt", "b\nc");
+      endPubServe();
+    });
+  });
+}
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 0f6e950..79f0fcb 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
@@ -4,6 +4,9 @@
 
 library pub_tests;
 
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 import '../serve/utils.dart';
@@ -26,11 +29,9 @@
       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);
+      pub.stderr.expect(contains('Invalid transformer config: Unsupported '
+          'built-in transformer \$nonexistent.'));
+      pub.shouldExit(exit_codes.DATA);
     });
   });
 }
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 64be015..1e649c1 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
@@ -6,6 +6,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
+import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 import '../serve/utils.dart';
@@ -22,11 +23,8 @@
       ]).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);
+      pub.stderr.expect(contains('"foo" is not a dependency.'));
+      pub.shouldExit(exit_codes.DATA);
     });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_a_declaring_aggregate_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_a_declaring_aggregate_transformer_test.dart
new file mode 100644
index 0000000..ff4ba7d7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/loads_a_declaring_aggregate_transformer_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const AGGREGATE_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+
+class ManyToOneTransformer extends AggregateTransformer
+    implements DeclaringAggregateTransformer {
+  ManyToOneTransformer.asPlugin();
+
+  String classifyPrimary(AssetId id) {
+    if (id.extension != '.out') return null;
+    return p.url.dirname(id.path);
+  }
+
+  Future apply(AggregateTransform transform) {
+    return transform.primaryInputs.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,
+          p.url.join(transform.key, 'out.final'));
+      transform.addOutput(new Asset.fromString(id, contents.join('\\n')));
+    });
+  }
+
+  void declareOutputs(DeclaringAggregateTransform transform) {
+    transform.declareOutput(new AssetId(transform.package,
+        p.url.join(transform.key, 'out.final')));
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions(">=0.14.1", () {
+    integration("loads a declaring aggregate transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/lazy", "myapp/aggregate"]
+        }),
+        d.dir("lib", [
+          d.file("lazy.dart", LAZY_TRANSFORMER),
+          d.file("aggregate.dart", AGGREGATE_TRANSFORMER),
+        ]),
+        d.dir("web", [
+          d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar")
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      var server = pubServe();
+      // The transformer should preserve laziness.
+      server.stdout.expect("Build completed successfully");
+
+      requestShouldSucceed("out.final", "bar.out\nfoo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_a_lazy_aggregate_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_a_lazy_aggregate_transformer_test.dart
new file mode 100644
index 0000000..80d1072
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/loads_a_lazy_aggregate_transformer_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const AGGREGATE_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+
+class ManyToOneTransformer extends AggregateTransformer
+    implements LazyAggregateTransformer {
+  ManyToOneTransformer.asPlugin();
+
+  String classifyPrimary(AssetId id) {
+    if (id.extension != '.txt') return null;
+    return p.url.dirname(id.path);
+  }
+
+  Future apply(AggregateTransform transform) {
+    return transform.primaryInputs.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,
+          p.url.join(transform.key, 'out.txt'));
+      transform.addOutput(new Asset.fromString(id, contents.join('\\n')));
+    });
+  }
+
+  void declareOutputs(DeclaringAggregateTransform transform) {
+    transform.declareOutput(new AssetId(transform.package,
+        p.url.join(transform.key, 'out.txt')));
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions(">=0.14.1", () {
+    integration("loads a lazy aggregate transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp"]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", AGGREGATE_TRANSFORMER),
+        ]),
+        d.dir("web", [
+          d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar")
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      var server = pubServe();
+      // The transformer should preserve laziness.
+      server.stdout.expect("Build completed successfully");
+
+      requestShouldSucceed("out.txt", "bar\nfoo");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_an_aggregate_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_an_aggregate_transformer_test.dart
new file mode 100644
index 0000000..1b058f6
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/loads_an_aggregate_transformer_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const AGGREGATE_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+
+class ManyToOneTransformer extends AggregateTransformer {
+  ManyToOneTransformer.asPlugin();
+
+  String classifyPrimary(AssetId id) {
+    if (id.extension != '.txt') return null;
+    return p.url.dirname(id.path);
+  }
+
+  Future apply(AggregateTransform transform) {
+    return transform.primaryInputs.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,
+          p.url.join(transform.key, 'out.txt'));
+      transform.addOutput(new Asset.fromString(id, contents.join('\\n')));
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions(">=0.14.1", () {
+    integration("loads an aggregate transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp"]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", AGGREGATE_TRANSFORMER),
+        ]),
+        d.dir("web", [
+          d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar")
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShouldSucceed("out.txt", "bar\nfoo");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_different_configurations_from_the_same_isolate_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_different_configurations_from_the_same_isolate_test.dart
new file mode 100644
index 0000000..ab2b92b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/loads_different_configurations_from_the_same_isolate_test.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("loads different configurations from the same isolate", () {
+      // If different configurations are loaded from different isolates, a
+      // transformer can end up being loaded twice. It's even possible for the
+      // second load to use code that's transformed by the first, which is
+      // really bad. This tests sets up such a scenario.
+      //
+      // The foo package has two self-transformers: foo/first and foo/second,
+      // loaded in that order. This means that *no instances of foo/first*
+      // should ever have their code transformed by foo/second.
+      //
+      // The myapp package also has a reference to foo/first. This reference has
+      // a different configuration than foo's, which means that if it's loaded
+      // in a separate isolate, it will be loaded after all of foo's
+      // transformers have run. This means that foo/first.dart will have been
+      // transformed by foo/first and foo/second, causing it to have different
+      // code than the previous instance. This tests asserts that that doesn't
+      // happen.
+
+      d.dir("foo", [
+        d.pubspec({
+          "name": "foo",
+          "version": "1.0.0",
+          "transformers": [
+            {"foo/first": {"addition": " in foo"}},
+            "foo/second"
+          ]
+        }),
+        d.dir("lib", [
+          d.file("first.dart", dartTransformer('foo/first')),
+          d.file("second.dart", dartTransformer('foo/second'))
+        ])
+      ]).create();
+
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "foo/first": {
+                "addition": " in myapp",
+                "\$include": "web/first.dart"
+              }
+            },
+            {"foo/second": {"\$include": "web/second.dart"}}
+          ],
+          "dependencies": {'foo': {'path': '../foo'}}
+        }),
+        d.dir("web", [
+          // This is transformed by foo/first. It's used to see which
+          // transformers ran on foo/first.
+          d.file("first.dart", 'const TOKEN = "myapp/first";'),
+
+          // This is transformed by foo/second. It's used to see which
+          // transformers ran on foo/second.
+          d.file("second.dart", 'const TOKEN = "myapp/second";')
+        ])
+      ]).create();
+
+      createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
+
+      pubServe();
+
+      // The version of foo/first used on myapp should have myapp's
+      // configuration and shouldn't be transformed by foo/second.
+      requestShouldSucceed("first.dart",
+          'const TOKEN = "(myapp/first, foo/first in myapp)";');
+
+      // foo/second should be transformed by only foo/first.
+      requestShouldSucceed("second.dart",
+          'const TOKEN = "(myapp/second, (foo/second, foo/first in foo))";');
+
+      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
deleted file mode 100644
index 7689b6a..0000000
--- a/sdk/lib/_internal/pub/test/transformer/loads_ordering_dependencies_in_the_correct_order_test.dart
+++ /dev/null
@@ -1,56 +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();
-  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(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']);
-
-      pubServe();
-      requestShouldSucceed("main.dart",
-          'const TOKEN = "(main.dart, myapp imports (bar, foo))";');
-      endPubServe();
-    });
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/conservative_dependencies_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/conservative_dependencies_test.dart
new file mode 100644
index 0000000..19118a6
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/conservative_dependencies_test.dart
@@ -0,0 +1,466 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+void main() {
+  initConfig();
+
+  integration("reports previous transformers as dependencies if the "
+      "transformer is transformed", () {
+    // The root app just exists so that something is transformed by pkg and qux.
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "version": "1.0.0",
+        "dependencies": {
+          "pkg": {"path": "../pkg"},
+          "qux": {"path": "../qux"}
+        },
+        "transformers": ["pkg", "qux"]
+      })
+    ]).create();
+
+    d.dir("pkg", [
+      d.pubspec({
+        "name": "pkg",
+        "version": "1.0.0",
+        "dependencies": {
+          "foo": {"path": "../foo"},
+          "bar": {"path": "../bar"},
+          "baz": {"path": "../baz"},
+        },
+        "transformers": [
+          {"foo": {"\$include": "lib/pkg.dart"}},
+          {"bar": {"\$exclude": "lib/transformer.dart"}},
+          "baz"
+        ]
+      }),
+      d.dir("lib", [
+        d.file("pkg.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    // Even though foo and bar don't modify pkg/lib/transformer.dart themselves,
+    // it may be modified to import a library that they modify or generate, so
+    // pkg will depend on them.
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0"),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    // baz transforms pkg/lib/transformer.dart, so pkg will obviously
+    // depend on it.
+    d.dir("baz", [
+      d.libPubspec("baz", "1.0.0"),
+      d.dir("lib", [d.file("baz.dart", transformer())])
+    ]).create();
+
+    // qux doesn't transform anything in pkg, so pkg won't depend on it.
+    d.dir("qux", [
+      d.libPubspec("qux", "1.0.0"),
+      d.dir("lib", [d.file("qux.dart", transformer())])
+    ]).create();
+
+    expectDependencies({
+      'pkg': ['foo', 'bar', 'baz'], 'foo': [], 'bar': [], 'baz': [], 'qux': []
+    });
+  });
+
+  integration("reports all transitive package dependencies' transformers as "
+      "dependencies if the transformer is transformed", () {
+    // The root app just exists so that something is transformed by pkg and qux.
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "pkg": {"path": "../pkg"},
+          "qux": {"path": "../qux"}
+        },
+        "transformers": ["pkg"]
+      })
+    ]).create();
+
+    d.dir("pkg", [
+      d.pubspec({
+        "name": "pkg",
+        "version": "1.0.0",
+        "dependencies": {
+          "foo": {"path": "../foo"},
+          "baz": {"path": "../baz"}
+        },
+        "transformers": ["baz"]
+      }),
+      d.dir("lib", [d.file("pkg.dart", transformer())])
+    ]).create();
+
+    // pkg depends on foo. Even though it's not transformed by foo, its
+    // transformed transformer could import foo, so it has to depend on foo.
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "dependencies": {"bar": {"path": "../bar"}},
+        "transformers": ["foo"]
+      }),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    // foo depends on bar, and like pkg's dependency on foo, the transformed
+    // version of foo's transformer could import bar, so foo has to depend on
+    // bar.
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "version": "1.0.0",
+        "transformers": ["bar"]
+      }),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    /// foo is transformed by baz.
+    d.dir("baz", [
+      d.libPubspec("baz", "1.0.0"),
+      d.dir("lib", [d.file("baz.dart", transformer())])
+    ]).create();
+
+    /// qux is not part of pkg's transitive dependency tree, so pkg shouldn't
+    /// depend on it.
+    d.dir("qux", [
+      d.pubspec({
+        "name": "qux",
+        "version": "1.0.0",
+        "transformers": ["qux"]
+      }),
+      d.dir("lib", [d.file("qux.dart", transformer())])
+    ]).create();
+
+    expectDependencies({
+      'pkg': ['foo', 'bar', 'baz'], 'foo': [], 'bar': [], 'baz': [], 'qux': []
+    });
+  });
+
+  integration("reports previous transformers as dependencies if a "
+      "nonexistent local file is imported", () {
+    // The root app just exists so that something is transformed by pkg and bar.
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "pkg": {"path": "../pkg"},
+          "bar": {"path": "../bar"}
+        },
+        "transformers": ["pkg", "bar"]
+      })
+    ]).create();
+
+    d.dir("pkg", [
+      d.pubspec({
+        "name": "pkg",
+        "version": "1.0.0",
+        "dependencies": {
+          "foo": {"path": "../foo"},
+          "bar": {"path": "../bar"}
+        },
+        "transformers": [{"foo": {"\$include": "lib/pkg.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("pkg.dart", ""),
+        d.file("transformer.dart", transformer(["nonexistent.dart"]))
+      ])
+    ]).create();
+
+    // Since pkg's transformer imports a nonexistent file, we assume that file
+    // was generated by foo's transformer. Thus pkg's transformer depends on
+    // foo's even though the latter doesn't transform the former.
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    /// qux is not part of pkg's transitive dependency tree, so pkg shouldn't
+    /// depend on it.
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0"),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    expectDependencies({'pkg': ['foo'], 'foo': [], 'bar': []});
+  });
+
+  integration("reports all that package's dependencies' transformers as "
+      "dependencies if a non-existent file is imported from another package",
+      () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": {"path": "../foo"},
+          "qux": {"path": "../qux"}
+        },
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", transformer(["package:foo/nonexistent.dart"]))
+      ])
+    ]).create();
+
+    // myapp imported a nonexistent file from foo so myapp will depend on every
+    // transformer transitively reachable from foo, since the nonexistent file
+    // could be generated to import anything.
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "dependencies": {
+          "bar": {"path": "../bar"},
+          "baz": {"path": "../baz"}
+        },
+        "transformers": ["foo"]
+      }),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    // bar is a dependency of foo so myapp will depend on it.
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "version": "1.0.0",
+        "transformers": ["bar"]
+      }),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    // baz is a dependency of foo so myapp will depend on it.
+    d.dir("baz", [
+      d.pubspec({
+        "name": "baz",
+        "version": "1.0.0",
+        "transformers": ["baz"]
+      }),
+      d.dir("lib", [d.file("baz.dart", transformer())])
+    ]).create();
+
+    // qux is not transitively reachable from foo so myapp won't depend on it.
+    d.dir("qux", [
+      d.pubspec({
+        "name": "qux",
+        "version": "1.0.0",
+        "transformers": ["qux"]
+      }),
+      d.dir("lib", [d.file("qux.dart", transformer())])
+    ]).create();
+
+    expectDependencies({
+      'myapp': ['foo', 'bar', 'baz'], 'foo': [], 'bar': [], 'baz': [], 'qux': []
+    });
+  });
+
+  integration("reports all that package's dependencies' transformers as "
+      "dependencies if a non-existent transformer is used from another package",
+      () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": {"path": "../foo"},
+          "qux": {"path": "../qux"}
+        },
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", transformer(["package:foo/nonexistent.dart"]))
+      ])
+    ]).create();
+
+    // myapp imported a nonexistent file from foo so myapp will depend on every
+    // transformer transitively reachable from foo, since the nonexistent file
+    // could be generated to import anything.
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "dependencies": {
+          "bar": {"path": "../bar"},
+          "baz": {"path": "../baz"}
+        },
+        "transformers": ["bar"]
+      })
+    ]).create();
+
+    // bar is a dependency of foo so myapp will depend on it.
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0"),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    // baz is a dependency of foo so myapp will depend on it.
+    d.dir("baz", [
+      d.pubspec({
+        "name": "baz",
+        "version": "1.0.0",
+        "transformers": ["baz"]
+      }),
+      d.dir("lib", [d.file("baz.dart", transformer())])
+    ]).create();
+
+    // qux is not transitively reachable from foo so myapp won't depend on it.
+    d.dir("qux", [
+      d.pubspec({
+        "name": "qux",
+        "version": "1.0.0",
+        "transformers": ["qux"]
+      }),
+      d.dir("lib", [d.file("qux.dart", transformer())])
+    ]).create();
+
+    expectDependencies({
+      'myapp': ['bar', 'baz'], 'bar': [], 'baz': [], 'qux': []
+    });
+  });
+
+  test("reports dependencies on transformers in past phases", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": [
+          "myapp/first",
+          "myapp/second",
+          "myapp/third"
+        ]
+      }),
+      d.dir("lib", [
+        d.file("first.dart", transformer()),
+        d.file("second.dart", transformer()),
+        d.file("third.dart", transformer())
+      ])
+    ]).create();
+
+    expectDependencies({
+      'myapp/first': [],
+      'myapp/second': ['myapp/first'],
+      'myapp/third': ['myapp/second', 'myapp/first']
+    });
+  });
+
+  integration("considers the entrypoint package's dev and override "
+      "dependencies", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "dev_dependencies": {"bar": {"path": "../bar"}},
+        "dependency_overrides": {"baz": {"path": "../baz"}},
+        "transformers": ["foo", "myapp"]
+      }),
+      d.dir("lib", [d.file("myapp.dart", transformer())])
+    ]).create();
+
+    // foo transforms myapp's transformer so it could import from bar or baz.
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": ["foo"]
+      }),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    // bar is a dev dependency that myapp could import from, so myapp should
+    // depend on it.
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "version": "1.0.0",
+        "transformers": ["bar"]
+      }),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    // baz is an override dependency that myapp could import from, so myapp
+    // should depend on it.
+    d.dir("baz", [
+      d.pubspec({
+        "name": "baz",
+        "version": "1.0.0",
+        "transformers": ["baz"]
+      }),
+      d.dir("lib", [d.file("baz.dart", transformer())])
+    ]).create();
+
+    expectDependencies({
+      'myapp': ['foo', 'bar', 'baz'], 'foo': [], 'bar': [], 'baz': []
+    });
+  });
+
+  integration("doesn't consider a non-entrypoint package's dev and override "
+      "dependencies", () {
+    // myapp just exists so that pkg isn't the entrypoint.
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"pkg": {"path": "../pkg"}}
+      })
+    ]).create();
+
+    d.dir("pkg", [
+      d.pubspec({
+        "name": "pkg",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "dev_dependencies": {"bar": {"path": "../bar"}},
+        "dependency_overrides": {"baz": {"path": "../baz"}},
+        "transformers": ["foo", "pkg"]
+      }),
+      d.dir("lib", [d.file("pkg.dart", transformer())])
+    ]).create();
+
+    // foo transforms pkg's transformer so it could theoretcially import from
+    // bar or baz. However, since pkg isn't the entrypoint, it doesn't have
+    // access to them.
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": ["foo"]
+      }),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    // bar is a dev dependency that myapp can't import from, so myapp shouldn't
+    // depend on it.
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "version": "1.0.0",
+        "transformers": ["bar"]
+      }),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    // baz is a dev dependency that myapp can't import from, so myapp shouldn't
+    // depend on it.
+    d.dir("baz", [
+      d.pubspec({
+        "name": "baz",
+        "version": "1.0.0",
+        "transformers": ["baz"]
+      }),
+      d.dir("lib", [d.file("baz.dart", transformer())])
+    ]).create();
+
+    expectDependencies({'pkg': ['foo'], 'foo': [], 'bar': [], 'baz': []});
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/cycle_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/cycle_test.dart
new file mode 100644
index 0000000..a8458c1
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/cycle_test.dart
@@ -0,0 +1,212 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+void main() {
+  initConfig();
+
+  integration("allows a package dependency cycle that's unrelated to "
+      "transformers", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp/first", "myapp/second"]
+      }),
+      d.dir('lib', [
+        d.file("first.dart", transformer()),
+        d.file("second.dart", transformer())
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0", deps: {"bar": {"path": "../bar"}})
+    ]).create();
+
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0", deps: {"baz": {"path": "../baz"}})
+    ]).create();
+
+    d.dir("baz", [
+      d.libPubspec("baz", "1.0.0", deps: {"foo": {"path": "../foo"}})
+    ]).create();
+
+    expectDependencies({'myapp/first': [], 'myapp/second': ['myapp/first']});
+  });
+
+  integration("disallows a package dependency cycle that may be related to "
+      "transformers", () {
+    // Two layers of myapp transformers are necessary here because otherwise pub
+    // will figure out that the transformer doesn't import "foo" and thus
+    // doesn't transitively import itself. Import loops are tested below.
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp/first", "myapp/second"]
+      }),
+      d.dir('lib', [
+        d.file("first.dart", transformer()),
+        d.file("second.dart", transformer())
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0", deps: {"bar": {"path": "../bar"}})
+    ]).create();
+
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0", deps: {"myapp": {"path": "../myapp"}})
+    ]).create();
+
+    expectCycleException([
+      "myapp is transformed by myapp/second",
+      "myapp depends on foo",
+      "foo depends on bar",
+      "bar depends on myapp",
+      "myapp is transformed by myapp/first"
+    ]);
+  });
+
+  integration("disallows a transformation dependency cycle", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["foo"]
+      }),
+      d.dir('lib', [d.file("myapp.dart", transformer())])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "dependencies": {"bar": {"path": "../bar"}},
+        "transformers": ["bar"]
+      }),
+      d.dir('lib', [d.file("foo.dart", transformer())])
+    ]).create();
+
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "dependencies": {"myapp": {"path": "../myapp"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [d.file("bar.dart", transformer())])
+    ]).create();
+
+    expectCycleException([
+      "bar is transformed by myapp",
+      "myapp is transformed by foo",
+      "foo is transformed by bar"
+    ]);
+  });
+
+  integration("allows a cross-package import cycle that's unrelated to "
+      "transformers", () {
+     d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [
+        d.file("myapp.dart", transformer(['package:foo/foo.dart']))
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0", deps: {"bar": {"path": "../bar"}}),
+      d.dir('lib', [d.file("foo.dart", "import 'package:bar/bar.dart';")])
+    ]).create();
+
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0", deps: {"baz": {"path": "../baz"}}),
+      d.dir('lib', [d.file("bar.dart", "import 'package:baz/baz.dart';")])
+    ]).create();
+
+    d.dir("baz", [
+      d.libPubspec("baz", "1.0.0", deps: {"foo": {"path": "../foo"}}),
+      d.dir('lib', [d.file("baz.dart", "import 'package:foo/foo.dart';")])
+    ]).create();
+
+    expectDependencies({'myapp': []});
+  });
+
+  integration("disallows a cross-package import cycle that's related to "
+      "transformers", () {
+     d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [
+        d.file("myapp.dart", transformer(['package:foo/foo.dart']))
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0", deps: {"bar": {"path": "../bar"}}),
+      d.dir('lib', [d.file("foo.dart", "import 'package:bar/bar.dart';")])
+    ]).create();
+
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0", deps: {"myapp": {"path": "../myapp"}}),
+      d.dir('lib', [d.file("bar.dart", "import 'package:myapp/myapp.dart';")])
+    ]).create();
+
+    expectCycleException([
+      "myapp is transformed by myapp",
+      "myapp depends on foo",
+      "foo depends on bar",
+      "bar depends on myapp"
+    ]);
+  });
+
+  integration("allows a single-package import cycle that's unrelated to "
+      "transformers", () {
+     d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [
+        d.file("myapp.dart", transformer(['foo.dart'])),
+        d.file("foo.dart", "import 'bar.dart';"),
+        d.file("bar.dart", "import 'baz.dart';"),
+        d.file("baz.dart", "import 'foo.dart';")
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': []});
+  });
+
+  integration("allows a single-package import cycle that's related to "
+      "transformers", () {
+     d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [
+        d.file("myapp.dart", transformer(['foo.dart'])),
+        d.file("foo.dart", "import 'bar.dart';"),
+        d.file("bar.dart", "import 'myapp.dart';"),
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': []});
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/error_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/error_test.dart
new file mode 100644
index 0000000..a06a566
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/error_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exceptions.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+void main() {
+  initConfig();
+
+  integration("fails if an unknown package is imported", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [
+        d.file("myapp.dart", transformer(["package:foo/foo.dart"]))
+      ])
+    ]).create();
+
+    expectException(predicate((error) {
+      expect(error, new isInstanceOf<ApplicationException>());
+      expect(error.message, equals(
+          'A transformer imported unknown package "foo" (in '
+          '"package:foo/foo.dart").'));
+      return true;
+    }));
+  });
+
+  integration("fails on a syntax error", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [
+        d.file("myapp.dart", "library;")
+      ])
+    ]).create();
+
+    expectException(new isInstanceOf<AnalyzerErrorGroup>());
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/import_dependencies_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/import_dependencies_test.dart
new file mode 100644
index 0000000..342425e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/import_dependencies_test.dart
@@ -0,0 +1,195 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+void main() {
+  initConfig();
+
+  integration("reports a dependency if a transformed local file is imported",
+      () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": [
+          {"foo": {"\$include": "lib/lib.dart"}},
+          "myapp"
+        ]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("lib.dart", ""),
+        d.file("transformer.dart", transformer(["lib.dart"]))
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({"name": "foo", "version": "1.0.0"}),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    expectDependencies({'myapp': ['foo'], 'foo': []});
+  });
+
+  integration("reports a dependency if a transformed foreign file is imported",
+      () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer(["package:foo/foo.dart"]))
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": [{"foo": {"\$include": "lib/foo.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("foo.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': ['foo'], 'foo': []});
+  });
+
+  integration("reports a dependency if a transformed external package file is "
+      "imported from an export", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer(["local.dart"])),
+        d.file("local.dart", "export 'package:foo/foo.dart';")
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": [{"foo": {"\$include": "lib/foo.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("foo.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': ['foo'], 'foo': []});
+  });
+
+  integration("reports a dependency if a transformed foreign file is "
+      "transitively imported", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer(["local.dart"])),
+        d.file("local.dart", "import 'package:foo/foreign.dart';")
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": [{"foo": {"\$include": "lib/foo.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("foo.dart", ""),
+        d.file("transformer.dart", transformer()),
+        d.file("foreign.dart", "import 'foo.dart';")
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': ['foo'], 'foo': []});
+  });
+
+  integration("reports a dependency if a transformed foreign file is "
+      "transitively imported across packages", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer(["package:foo/foo.dart"])),
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "dependencies": {"bar": {"path": "../bar"}}
+      }),
+      d.dir("lib", [d.file("foo.dart", "import 'package:bar/bar.dart';")])
+    ]).create();
+
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "version": "1.0.0",
+        "transformers": [{"bar": {"\$include": "lib/bar.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("bar.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': ['bar'], 'bar': []});
+  });
+
+  integration("reports a dependency if an imported file is transformed by a "
+      "different package", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": [
+          {"foo": {'\$include': 'lib/local.dart'}},
+          "myapp"
+        ]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer(["local.dart"])),
+        d.file("local.dart", "")
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({"name": "foo", "version": "1.0.0"}),
+      d.dir("lib", [d.file("transformer.dart", transformer())])
+    ]).create();
+
+    expectDependencies({'myapp': ['foo'], 'foo': []});
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/no_dependencies_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/no_dependencies_test.dart
new file mode 100644
index 0000000..c28e4a0
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/no_dependencies_test.dart
@@ -0,0 +1,161 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+void main() {
+  initConfig();
+
+  integration("reports no dependencies if no transformers are used", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}}
+      })
+    ]).create();
+
+    d.dir("foo", [d.libPubspec("foo", "1.0.0")]).create();
+
+    expectDependencies({});
+  });
+
+  integration("reports no dependencies if a transformer is used in a "
+      "package that doesn't expose a transformer", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["foo"]
+      })
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    expectDependencies({"foo": []});
+  });
+
+  integration("reports no dependencies for non-file/package imports", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", transformer([
+          "dart:async",
+          "http://dartlang.org/nonexistent.dart"
+        ]))
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    expectDependencies({"myapp": []});
+  });
+
+  integration("reports no dependencies for a single self transformer", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [d.file("myapp.dart", transformer())])
+    ]).create();
+
+    expectDependencies({"myapp": []});
+  });
+
+  integration("reports no dependencies if a transformer applies to files that "
+      "aren't used by the exposed transformer", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": [
+          {"foo": {"\$include": "lib/myapp.dart"}},
+          {"foo": {"\$exclude": "lib/transformer.dart"}},
+          "myapp"
+        ]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    expectDependencies({"myapp": [], "foo": []});
+  });
+
+  integration("reports no dependencies if a transformer applies to a "
+      "dependency's files that aren't used by the exposed transformer", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer(["package:foo/foo.dart"]))
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": [{"foo": {"\$exclude": "lib/foo.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("foo.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': [], 'foo': []});
+  });
+
+  test("reports no dependencies on transformers in future phases", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": [
+          {"myapp/first": {"\$include": "lib/myapp.dart"}},
+          {"myapp/second": {"\$include": "lib/first.dart"}},
+          {"myapp/third": {"\$include": "lib/second.dart"}}
+        ]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("first.dart", transformer()),
+        d.file("second.dart", transformer()),
+        d.file("third.dart", transformer())
+      ])
+    ]).create();
+
+    expectDependencies({
+      'myapp/first': [],
+      'myapp/second': [],
+      'myapp/third': []
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart
new file mode 100644
index 0000000..47e1cf7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/barback/cycle_exception.dart';
+import '../../lib/src/barback/transformers_needed_by_transformers.dart';
+import '../../lib/src/entrypoint.dart';
+import '../../lib/src/io.dart';
+import '../../lib/src/package.dart';
+import '../../lib/src/package_graph.dart';
+import '../../lib/src/source/path.dart';
+import '../../lib/src/system_cache.dart';
+import '../../lib/src/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+/// Expects that [computeTransformersNeededByTransformers] will return a graph
+/// matching [expected] when run on the package graph defined by packages in
+/// the sandbox.
+void expectDependencies(Map<String, Iterable<String>> expected) {
+  expected = mapMap(expected, value: (_, ids) => ids.toSet());
+
+  schedule(() {
+    var result = mapMap(
+        computeTransformersNeededByTransformers(_loadPackageGraph()),
+        key: (id, _) => id.toString(),
+        value: (_, ids) => ids.map((id) => id.toString()).toSet());
+    expect(result, equals(expected));
+  }, "expect dependencies to match $expected");
+}
+
+/// Expects that [computeTransformersNeededByTransformers] will throw an
+/// exception matching [matcher] when run on the package graph defiend by
+/// packages in the sandbox.
+void expectException(matcher) {
+  schedule(() {
+    expect(() => computeTransformersNeededByTransformers(_loadPackageGraph()),
+        throwsA(matcher));
+  }, "expect an exception: $matcher");
+}
+
+/// Expects that [computeTransformersNeededByTransformers] will throw a
+/// [CycleException] with the given [steps] when run on the package graph
+/// defiend by packages in the sandbox.
+void expectCycleException(Iterable<String> steps) {
+  expectException(predicate((error) {
+    expect(error, new isInstanceOf<CycleException>());
+    expect(error.steps, equals(steps));
+    return true;
+  }, "cycle exception:\n${steps.map((step) => "  $step").join("\n")}"));
+}
+
+/// Loads a [PackageGraph] from the packages in the sandbox.
+///
+/// This graph will also include barback and its transitive dependencies from
+/// the repo.
+PackageGraph _loadPackageGraph() {
+  // Load the sandbox packages.
+  var packages = {};
+
+  var systemCache = new SystemCache(p.join(sandboxDir, cachePath));
+  systemCache.sources
+      ..register(new PathSource())
+      ..setDefault('path');
+  var entrypoint = new Entrypoint(p.join(sandboxDir, appPath), systemCache);
+
+  for (var package in listDir(sandboxDir)) {
+    if (!fileExists(p.join(package, 'pubspec.yaml'))) continue;
+    var packageName = p.basename(package);
+    packages[packageName] = new Package.load(
+        packageName, package, systemCache.sources);
+  }
+
+  loadPackage(packageName) {
+    if (packages.containsKey(packageName)) return;
+    packages[packageName] = new Package.load(
+        packageName, p.join(pkgPath, packageName), systemCache.sources);
+    for (var dep in packages[packageName].dependencies) {
+      loadPackage(dep.name);
+    }
+  }
+
+  loadPackage('barback');
+
+  return new PackageGraph(entrypoint, null, packages);
+}
+
+/// Returns the contents of a no-op transformer that imports each URL in
+/// [imports].
+String transformer([Iterable<String> imports]) {
+  if (imports == null) imports = [];
+
+  var buffer = new StringBuffer()
+      ..writeln('import "package:barback/barback.dart";');
+  for (var import in imports) {
+    buffer.writeln('import "$import";');
+  }
+
+  buffer.writeln("""
+NoOpTransformer extends Transformer {
+  bool isPrimary(AssetId id) => true;
+  void apply(Transform transform) {}
+}
+""");
+
+  return buffer.toString();
+}
diff --git a/sdk/lib/_internal/pub/test/upgrade/dry_run_does_not_apply_changes_test.dart b/sdk/lib/_internal/pub/test/upgrade/dry_run_does_not_apply_changes_test.dart
new file mode 100644
index 0000000..da950b5
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/upgrade/dry_run_does_not_apply_changes_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/io.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("--dry-run shows report but does not apply changes", () {
+    servePackages([
+      packageMap("foo", "1.0.0"),
+      packageMap("foo", "2.0.0"),
+    ]);
+
+    // Create the first lockfile.
+    d.appDir({
+      "foo": "1.0.0"
+    }).create();
+
+    pubGet();
+
+    // Change the pubspec.
+    d.appDir({
+      "foo": "any"
+    }).create();
+
+    // Also delete the "packages" directory.
+    schedule(() {
+      deleteEntry(path.join(sandboxDir, appPath, "packages"));
+    });
+
+    // Do the dry run.
+    pubUpgrade(args: ["--dry-run"], output: allOf([
+      contains("> foo 2.0.0 (was 1.0.0)"),
+      contains("Would change 1 dependency.")
+    ]));
+
+    d.dir(appPath, [
+      // The lockfile should be unmodified.
+      d.matcherFile("pubspec.lock", contains("1.0.0")),
+      // The "packages" directory should not have been regenerated.
+      d.nothing("packages")
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/upgrade/git/upgrade_to_incompatible_pubspec_test.dart b/sdk/lib/_internal/pub/test/upgrade/git/upgrade_to_incompatible_pubspec_test.dart
index b6440fd..90995ea 100644
--- a/sdk/lib/_internal/pub/test/upgrade/git/upgrade_to_incompatible_pubspec_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/git/upgrade_to_incompatible_pubspec_test.dart
@@ -4,6 +4,9 @@
 
 library pub_tests;
 
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -32,8 +35,8 @@
       d.libPubspec('zoo', '1.0.0')
     ]).commit();
 
-    pubUpgrade(error: new RegExp(r'"name" field "zoo" doesn' "'" r't match '
-        r'expected name "foo"\.'));
+    pubUpgrade(error: contains('"name" field doesn\'t match expected name '
+        '"foo".'), exitCode: exit_codes.DATA);
 
     d.dir(packagesPath, [
       d.dir('foo', [
diff --git a/sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart b/sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart
index 425ad83..38ee284 100644
--- a/sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart
+++ b/sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart
@@ -33,22 +33,73 @@
       ]).create();
       expectNoValidationError(compiledDartdoc);
     });
+
+    integration('contains compiled dartdoc in a hidden directory', () {
+      ensureGit();
+
+      d.dir(appPath, [
+        d.dir(".doc-out", [
+          d.file('nav.json', ''),
+          d.file('index.html', ''),
+          d.file('styles.css', ''),
+          d.file('dart-logo-small.png', ''),
+          d.file('client-live-nav.js', '')
+        ])
+      ]).create();
+      expectNoValidationError(compiledDartdoc);
+    });
+
+    integration('contains compiled dartdoc in a gitignored directory', () {
+      ensureGit();
+
+      d.git(appPath, [
+        d.dir("doc-out", [
+          d.file('nav.json', ''),
+          d.file('index.html', ''),
+          d.file('styles.css', ''),
+          d.file('dart-logo-small.png', ''),
+          d.file('client-live-nav.js', '')
+        ]),
+        d.file(".gitignore", "/doc-out")
+      ]).create();
+      expectNoValidationError(compiledDartdoc);
+    });
   });
 
-  integration('should consider a package invalid if it contains compiled '
-      'dartdoc', () {
-    d.validPackage.create();
+  group("should consider a package invalid if it", () {
+    integration('contains compiled dartdoc', () {
+      d.validPackage.create();
 
-    d.dir(appPath, [
-      d.dir('doc-out', [
-        d.file('nav.json', ''),
-        d.file('index.html', ''),
-        d.file('styles.css', ''),
-        d.file('dart-logo-small.png', ''),
-        d.file('client-live-nav.js', '')
-      ])
-    ]).create();
+      d.dir(appPath, [
+        d.dir('doc-out', [
+          d.file('nav.json', ''),
+          d.file('index.html', ''),
+          d.file('styles.css', ''),
+          d.file('dart-logo-small.png', ''),
+          d.file('client-live-nav.js', '')
+        ])
+      ]).create();
 
-    expectValidationWarning(compiledDartdoc);
+      expectValidationWarning(compiledDartdoc);
+    });
+
+    integration('contains compiled dartdoc in a non-gitignored hidden '
+        'directory', () {
+      ensureGit();
+
+      d.validPackage.create();
+
+      d.git(appPath, [
+        d.dir('.doc-out', [
+          d.file('nav.json', ''),
+          d.file('index.html', ''),
+          d.file('styles.css', ''),
+          d.file('dart-logo-small.png', ''),
+          d.file('client-live-nav.js', '')
+        ])
+      ]).create();
+
+      expectValidationWarning(compiledDartdoc);
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/version_solver_test.dart b/sdk/lib/_internal/pub/test/version_solver_test.dart
index 54c8921..b5302cb 100644
--- a/sdk/lib/_internal/pub/test/version_solver_test.dart
+++ b/sdk/lib/_internal/pub/test/version_solver_test.dart
@@ -27,7 +27,7 @@
   initConfig();
 
   // Uncomment this to debug failing tests.
-  // log.showSolver();
+  // log.verbosity = log.Verbosity.SOLVER;
 
   // Since this test isn't run from the SDK, it can't find the "version" file
   // to load. Instead, just manually inject a version.
@@ -1067,7 +1067,7 @@
 solo_testResolve(String description, Map packages, {
     Map lockfile, Map overrides, Map result, FailMatcherBuilder error,
     int maxTries}) {
-  log.showSolver();
+  log.verbosity = log.Verbosity.SOLVER;
   _testResolve(solo_test, description, packages, lockfile: lockfile,
       overrides: overrides, result: result, error: error, maxTries: maxTries);
 }
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index adf54f1..b244191 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -91,7 +91,8 @@
 library dart.async;
 
 import "dart:collection";
-import "dart:_internal" show deprecated, printToZone, printToConsole;
+import "dart:_internal" show deprecated, printToZone, printToConsole,
+                             IterableElementError;
 
 part 'async_error.dart';
 part 'broadcast_stream_controller.dart';
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index b7a7475..f88305b 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -316,7 +316,7 @@
    * immediately, but will be scheduled in a later microtask.
    *
    * If [onError] is provided, and this future completes with an error,
-   * the `onError` callback is called with that error its stack trace.
+   * the `onError` callback is called with that error and its stack trace.
    * The `onError` callback must accept either one argument or two arguments.
    * If `onError` accepts two arguments,
    * it is called with both the error and the stack trace,
@@ -337,7 +337,7 @@
    *
    * If the callback returns a [Future],
    * the future returned by `then` will be completed with
-   * the same result of the future returned by the callback.
+   * the same result as the future returned by the callback.
    *
    * If [onError] is not given, and this future completes with an error,
    * the error is forwarded directly to the returned future.
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index 5fcbe3d..a1f09a4 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -128,10 +128,10 @@
   // If we store the type of a closure in the state field (where there are
   // still bits left), we can just store two closures instead of using 4
   // fields of which 2 are always null.
-  final _FutureOnValue _onValueCallback;
-  final _FutureErrorTest _errorTestCallback;
-  final Function _onErrorCallback;
-  final _FutureAction _whenCompleteActionCallback;
+  _FutureOnValue _onValueCallback;
+  _FutureErrorTest _errorTestCallback;
+  Function _onErrorCallback;
+  _FutureAction _whenCompleteActionCallback;
 
   _FutureOnValue get _onValue => _isChained ? null : _onValueCallback;
   _FutureErrorTest get _errorTest => _isChained ? null : _errorTestCallback;
@@ -578,6 +578,10 @@
         }
         // If we changed zone, oldZone will not be null.
         if (oldZone != null) Zone._leave(oldZone);
+        listener._onValueCallback = null;
+        listener._errorTestCallback = null;
+        listener._onErrorCallback = null;
+        listener._whenCompleteActionCallback = null;
 
         if (isPropagationAborted) return;
         // If the listener's value is a future we need to chain it. Note that
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index ab50c24..2392739 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -501,7 +501,11 @@
       onError: result._completeError,
       onDone: () {
         if (!seenFirst) {
-          result._completeError(new StateError("No elements"));
+          try {
+            throw IterableElementError.noElement();
+          } catch (e, s) {
+            result._completeError(e, s);
+          }
         } else {
           result._complete(value);
         }
@@ -902,7 +906,11 @@
       },
       onError: future._completeError,
       onDone: () {
-        future._completeError(new StateError("No elements"));
+        try {
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          future._completeError(e, s);
+        }
       },
       cancelOnError: true);
     return future;
@@ -933,7 +941,11 @@
           future._complete(result);
           return;
         }
-        future._completeError(new StateError("No elements"));
+        try {
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          future._completeError(e, s);
+        }
       },
       cancelOnError: true);
     return future;
@@ -956,8 +968,11 @@
       (T value) {
         if (foundResult) {
           // This is the second element we get.
-          Error error = new StateError("More than one element");
-          _cancelAndError(subscription, future, error, null);
+          try {
+            throw IterableElementError.tooMany();
+          } catch (e, s) {
+            _cancelAndError(subscription, future, e, s);
+          }
           return;
         }
         foundResult = true;
@@ -969,7 +984,11 @@
           future._complete(result);
           return;
         }
-        future._completeError(new StateError("No elements"));
+        try {
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          future._completeError(e, s);
+        }
       },
       cancelOnError: true);
     return future;
@@ -1017,7 +1036,11 @@
           _runUserCode(defaultValue, future._complete, future._completeError);
           return;
         }
-        future._completeError(new StateError("firstMatch ended without match"));
+        try {
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          future._completeError(e, s);
+        }
       },
       cancelOnError: true);
     return future;
@@ -1058,7 +1081,11 @@
           _runUserCode(defaultValue, future._complete, future._completeError);
           return;
         }
-        future._completeError(new StateError("lastMatch ended without match"));
+        try {
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          future._completeError(e, s);
+        }
       },
       cancelOnError: true);
     return future;
@@ -1082,11 +1109,11 @@
           (bool isMatch) {
             if (isMatch) {
               if (foundResult) {
-                _cancelAndError(
-                    subscription,
-                    future,
-                    new StateError('Multiple matches for "single"'),
-                    null);
+                try {
+                  throw IterableElementError.tooMany();
+                } catch (e, s) {
+                  _cancelAndError(subscription, future, e, s);
+                }
                 return;
               }
               foundResult = true;
@@ -1102,7 +1129,11 @@
           future._complete(result);
           return;
         }
-        future._completeError(new StateError("single ended without match"));
+        try {
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          future._completeError(e, s);
+        }
       },
       cancelOnError: true);
     return future;
diff --git a/sdk/lib/core/annotations.dart b/sdk/lib/core/annotations.dart
index 97eb11f..5ceed34 100644
--- a/sdk/lib/core/annotations.dart
+++ b/sdk/lib/core/annotations.dart
@@ -81,7 +81,7 @@
  */
 const Deprecated deprecated = const Deprecated("next release");
 
-/*
+/**
  * The annotation `@override` marks an instance member as overriding a
  * superclass member with the same name.
  *
diff --git a/sdk/lib/core/stopwatch.dart b/sdk/lib/core/stopwatch.dart
index 9650a57..e923083 100644
--- a/sdk/lib/core/stopwatch.dart
+++ b/sdk/lib/core/stopwatch.dart
@@ -11,7 +11,7 @@
   /**
    * Frequency of the elapsed counter in Hz.
    */
-  final int frequency = _frequency();
+  int get frequency => _frequency;
 
   // The _start and _stop fields capture the time when [start] and [stop]
   // are called respectively.
@@ -29,7 +29,9 @@
    *
    *     Stopwatch stopwatch = new Stopwatch()..start();
    */
-  Stopwatch();
+  Stopwatch() {
+    _initTicker();
+  }
 
   /**
    * Starts the [Stopwatch].
@@ -127,6 +129,15 @@
    */
   bool get isRunning => _start != null && _stop == null;
 
-  external static int _frequency();
+  /**
+   * Cached frequency of the system. Must be initialized in [_initTicker];
+   */
+  static int _frequency;
+
+  /**
+   * Initializes the time-measuring system. *Must* initialize the [_frequency]
+   * variable.
+   */
+  external static void _initTicker();
   external static int _now();
 }
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 091e1fe..73a97d8 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -116,7 +116,11 @@
   Map<String, String> _queryParameters;
 
   /**
-   * Creates a new URI object by parsing a URI string.
+   * Creates a new `Uri` object by parsing a URI string.
+   *
+   * If the string is not valid as a URI or URI reference,
+   * invalid characters will be percent escaped where possible.
+   * The resulting `Uri` will represent a valid URI or URI reference.
    */
   static Uri parse(String uri) {
     // This parsing will not validate percent-encoding, IPv6, etc. When done
@@ -175,171 +179,231 @@
     bool isRegName(int ch) {
       return ch < 128 && ((_regNameTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
     }
+    const int EOI = -1;
 
-    int ipV6Address(int index) {
-      // IPv6. Skip to ']'.
-      index = uri.indexOf(']', index);
-      if (index == -1) {
-        throw new FormatException("Bad end of IPv6 host");
-      }
-      return index + 1;
-    }
+    String scheme = "";
+    String path;
+    String userinfo = "";
+    String host = "";
+    int port = 0;
+    String query = "";
+    String fragment = "";
 
-    int length = uri.length;
     int index = 0;
+    int pathStart = 0;
+    // End of input-marker.
+    int char = EOI;
 
-    int schemeEndIndex = 0;
-
-    if (length == 0) {
-      return new Uri();
-    }
-
-    if (uri.codeUnitAt(0) != _SLASH) {
-      // Can be scheme.
-      while (index < length) {
-        // Look for ':'. If found, continue from the post of ':'. If not (end
-        // reached or invalid scheme char found) back up one char, and continue
-        // to path.
-        // Note that scheme-chars is contained in path-chars.
-        int codeUnit = uri.codeUnitAt(index++);
-        if (!_isSchemeCharacter(codeUnit)) {
-          if (codeUnit == _COLON) {
-            schemeEndIndex = index;
-          } else {
-            // Back up one char, since we met an invalid scheme char.
-            index--;
-          }
+    void parseAuth() {
+      if (index == uri.length) {
+        char = EOI;
+        return;
+      }
+      int authStart = index;
+      int lastColon = -1;
+      int lastAt = -1;
+      char = uri.codeUnitAt(index);
+      while (index < uri.length) {
+        char = uri.codeUnitAt(index);
+        if (char == _SLASH || char == _QUESTION || char == _NUMBER_SIGN) {
           break;
         }
-      }
-    }
-
-    int userInfoEndIndex = -1;
-    int portIndex = -1;
-    int authorityEndIndex = schemeEndIndex;
-    // If we see '//', there must be an authority.
-    if (authorityEndIndex == index &&
-        authorityEndIndex + 1 < length &&
-        uri.codeUnitAt(authorityEndIndex) == _SLASH &&
-        uri.codeUnitAt(authorityEndIndex + 1) == _SLASH) {
-      // Skip '//'.
-      authorityEndIndex += 2;
-      // It can both be host and userInfo.
-      while (authorityEndIndex < length) {
-        int codeUnit = uri.codeUnitAt(authorityEndIndex++);
-        if (!isRegName(codeUnit)) {
-          if (codeUnit == _LEFT_BRACKET) {
-            authorityEndIndex = ipV6Address(authorityEndIndex);
-          } else if (portIndex == -1 && codeUnit == _COLON) {
-            // First time ':'.
-            portIndex = authorityEndIndex;
-          } else if (codeUnit == _AT_SIGN || codeUnit == _COLON) {
-            // Second time ':' or first '@'. Must be userInfo.
-            userInfoEndIndex = uri.indexOf('@', authorityEndIndex - 1);
-            // Not found. Must be path then.
-            if (userInfoEndIndex == -1) {
-              authorityEndIndex = index;
-              break;
-            }
-            portIndex = -1;
-            authorityEndIndex = userInfoEndIndex + 1;
-            // Now it can only be host:port.
-            while (authorityEndIndex < length) {
-              int codeUnit = uri.codeUnitAt(authorityEndIndex++);
-              if (!isRegName(codeUnit)) {
-                if (codeUnit == _LEFT_BRACKET) {
-                  authorityEndIndex = ipV6Address(authorityEndIndex);
-                } else if (codeUnit == _COLON) {
-                  if (portIndex != -1) {
-                    throw new FormatException("Double port in host");
-                  }
-                  portIndex = authorityEndIndex;
-                } else {
-                  authorityEndIndex--;
-                  break;
-                }
-              }
-            }
+        if (char == _AT_SIGN) {
+          lastAt = index;
+          lastColon = -1;
+        } else if (char == _COLON) {
+          lastColon = index;
+        } else if (char == _LEFT_BRACKET) {
+          lastColon = -1;
+          int endBracket = uri.indexOf(']', index + 1);
+          if (endBracket == -1) {
+            index = uri.length;
+            char = EOI;
             break;
           } else {
-            authorityEndIndex--;
-            break;
+            index = endBracket;
           }
         }
+        index++;
+        char = EOI;
       }
-    } else {
-      authorityEndIndex = schemeEndIndex;
+      int hostStart = authStart;
+      int hostEnd = index;
+      if (lastAt >= 0) {
+        userinfo = _makeUserInfo(uri, authStart, lastAt);
+        hostStart = lastAt + 1;
+      }
+      if (lastColon >= 0) {
+        int portNumber = 0;
+        for (int i = lastColon + 1; i < index; i++) {
+          int digit = uri.codeUnitAt(i);
+          if (_ZERO > digit || _NINE < digit) {
+            _fail(uri, i, "Invalid port number");
+          }
+          portNumber = portNumber * 10 + (digit - _ZERO);
+        }
+        port = _makePort(portNumber, scheme);
+        hostEnd = lastColon;
+      }
+      host = _makeHost(uri, hostStart, hostEnd, true);
+      if (index < uri.length) {
+        char = uri.codeUnitAt(index);
+      }
     }
 
-    // At path now.
-    int pathEndIndex = authorityEndIndex;
-    while (pathEndIndex < length) {
-      int codeUnit = uri.codeUnitAt(pathEndIndex++);
-      if (codeUnit == _QUESTION || codeUnit == _NUMBER_SIGN) {
-        pathEndIndex--;
+    // When reaching path parsing, the current character is known to not
+    // be part of the path.
+    const int NOT_IN_PATH = 0;
+    // When reaching path parsing, the current character is part
+    // of the a non-empty path.
+    const int IN_PATH = 1;
+    // When reaching authority parsing, authority is possible.
+    // This is only true at start or right after scheme.
+    const int ALLOW_AUTH = 2;
+
+    // Current state.
+    // Initialized to the default value that is used when exiting the
+    // scheme loop by reaching the end of input.
+    // All other breaks set their own state.
+    int state = NOT_IN_PATH;
+    int i = index;  // Temporary alias for index to avoid bug 19550 in dart2js.
+    while (i < uri.length) {
+      char = uri.codeUnitAt(i);
+      if (char == _QUESTION || char == _NUMBER_SIGN) {
+        state = NOT_IN_PATH;
         break;
       }
+      if (char == _SLASH) {
+        state = (i == 0) ? ALLOW_AUTH : IN_PATH;
+        break;
+      }
+      if (char == _COLON) {
+        if (i == 0) _fail(uri, 0, "Invalid empty scheme");
+        scheme = _makeScheme(uri, i);
+        i++;
+        pathStart = i;
+        if (i == uri.length) {
+          char = EOI;
+          state = NOT_IN_PATH;
+        } else {
+          char = uri.codeUnitAt(i);
+          if (char == _QUESTION || char == _NUMBER_SIGN) {
+            state = NOT_IN_PATH;
+          } else if (char == _SLASH) {
+            state = ALLOW_AUTH;
+          } else {
+            state = IN_PATH;
+          }
+        }
+        break;
+      }
+      i++;
+      char = EOI;
+    }
+    index = i;  // Remove alias when bug is fixed.
+
+    if (state == ALLOW_AUTH) {
+      assert(char == _SLASH);
+      // Have seen one slash either at start or right after scheme.
+      // If two slashes, it's an authority, otherwise it's just the path.
+      index++;
+      if (index == uri.length) {
+        char = EOI;
+        state = NOT_IN_PATH;
+      } else {
+        char = uri.codeUnitAt(index);
+        if (char == _SLASH) {
+          index++;
+          parseAuth();
+          pathStart = index;
+        }
+        if (char == _QUESTION || char == _NUMBER_SIGN || char == EOI) {
+          state = NOT_IN_PATH;
+        } else {
+          state = IN_PATH;
+        }
+      }
     }
 
-    // Maybe query.
-    int queryEndIndex = pathEndIndex;
-    if (queryEndIndex < length && uri.codeUnitAt(queryEndIndex) == _QUESTION) {
-      while (queryEndIndex < length) {
-        int codeUnit = uri.codeUnitAt(queryEndIndex++);
-        if (codeUnit == _NUMBER_SIGN) {
-          queryEndIndex--;
+    assert(state == IN_PATH || state == NOT_IN_PATH);
+    if (state == IN_PATH) {
+      // Characters from pathStart to index (inclusive) are known
+      // to be part of the path.
+      while (++index < uri.length) {
+        char = uri.codeUnitAt(index);
+        if (char == _QUESTION || char == _NUMBER_SIGN) {
           break;
         }
+        char = EOI;
       }
+      state = NOT_IN_PATH;
     }
 
-    var scheme = null;
-    if (schemeEndIndex > 0) {
-      scheme = uri.substring(0, schemeEndIndex - 1);
-    }
+    assert(state == NOT_IN_PATH);
+    bool ensureLeadingSlash = (host != "" || scheme == "file");
+    path = _makePath(uri, pathStart, index, null, ensureLeadingSlash);
 
-    var host = "";
-    var userInfo = "";
-    var port = 0;
-    if (schemeEndIndex != authorityEndIndex) {
-      int startIndex = schemeEndIndex + 2;
-      if (userInfoEndIndex > 0) {
-        userInfo = uri.substring(startIndex, userInfoEndIndex);
-        startIndex = userInfoEndIndex + 1;
-      }
-      if (portIndex > 0) {
-        var portStr = uri.substring(portIndex, authorityEndIndex);
-        try {
-          port = int.parse(portStr);
-        } catch (_) {
-          throw new FormatException("Invalid port: '$portStr'");
-        }
-        host = uri.substring(startIndex, portIndex - 1);
+    if (char == _QUESTION) {
+      int numberSignIndex = uri.indexOf('#', index + 1);
+      if (numberSignIndex < 0) {
+        query = _makeQuery(uri, index + 1, uri.length, null);
       } else {
-        host = uri.substring(startIndex, authorityEndIndex);
+        query = _makeQuery(uri, index + 1, numberSignIndex, null);
+        fragment = _makeFragment(uri, numberSignIndex + 1, uri.length);
       }
+    } else if (char == _NUMBER_SIGN) {
+      fragment = _makeFragment(uri, index + 1, uri.length);
     }
-
-    var path = uri.substring(authorityEndIndex, pathEndIndex);
-    var query = "";
-    if (pathEndIndex < queryEndIndex) {
-      query = uri.substring(pathEndIndex + 1, queryEndIndex);
-    }
-    var fragment = "";
-    // If queryEndIndex is not at end (length), there is a fragment.
-    if (queryEndIndex < length) {
-      fragment = uri.substring(queryEndIndex + 1, length);
-    }
-
-    return new Uri(scheme: scheme,
-                   userInfo: userInfo,
-                   host: host,
-                   port: port,
-                   path: path,
-                   query: query,
-                   fragment: fragment);
+    return new Uri._internal(scheme,
+                             userinfo,
+                             host,
+                             port,
+                             path,
+                             query,
+                             fragment);
   }
 
+  // Report a parse failure.
+  static void _fail(String uri, int index, String message) {
+    // TODO(lrn): Consider adding this to FormatException.
+    if (index == uri.length) {
+      message += " at end of input.";
+    } else {
+      message += " at position $index.\n";
+      // Pick a slice of uri containing index and, if
+      // necessary, truncate the ends to ensure the entire
+      // slice fits on one line.
+      int min = 0;
+      int max = uri.length;
+      String pre = "";
+      String post = "";
+      if (uri.length > 78) {
+        min = index - 10;
+        if (min < 0) min = 0;
+        int max = min + 72;
+        if (max > uri.length) {
+          max = uri.length;
+          min = max - 72;
+        }
+        if (min != 0) pre = "...";
+        if (max != uri.length) post = "...";
+      }
+      // Combine message, slice and a caret pointing to the error index.
+      message = "$message$pre${uri.substring(min, max)}$post\n"
+                "${' ' * (pre.length + index - min)}^";
+    }
+    throw new FormatException(message);
+  }
+
+  /// Internal non-verifying constructor. Only call with validated arguments.
+  Uri._internal(this.scheme,
+                this.userInfo,
+                this._host,
+                this._port,
+                this._path,
+                this.query,
+                this.fragment);
+
   /**
    * Creates a new URI from its components.
    *
@@ -359,6 +423,7 @@
    * [host]. The host can either be a hostname, an IPv4 address or an
    * IPv6 address, contained in '[' and ']'. If the host contains a
    * ':' character, the '[' and ']' are added if not already provided.
+   * The host is normalized to all lowercase letters.
    *
    * The port part of the authority component is set through
    * [port]. The port is normalized for scheme http and https where
@@ -386,29 +451,27 @@
    *
    * The fragment component is set through [fragment].
    */
-  Uri({String scheme,
-       this.userInfo: "",
+  factory Uri({String scheme,
+       String userInfo: "",
        String host: "",
        port: 0,
        String path,
        Iterable<String> pathSegments,
        String query,
        Map<String, String> queryParameters,
-       fragment: ""}) :
-      scheme = _makeScheme(scheme),
-      _host = _makeHost(host),
-      query = _makeQuery(query, queryParameters),
-      fragment = _makeFragment(fragment) {
-    // Perform scheme specific normalization.
-    if (scheme == "http" && port == 80) {
-      _port = 0;
-    } else if (scheme == "https" && port == 443) {
-      _port = 0;
-    } else {
-      _port = port;
-    }
-    // Fill the path.
-    _path = _makePath(path, pathSegments);
+       fragment: ""}) {
+    scheme = _makeScheme(scheme, _stringOrNullLength(scheme));
+    userInfo = _makeUserInfo(userInfo, 0, _stringOrNullLength(userInfo));
+    host = _makeHost(host, 0, _stringOrNullLength(host), false);
+    query = _makeQuery(query, 0, _stringOrNullLength(query), queryParameters);
+    fragment = _makeFragment(fragment, 0, _stringOrNullLength(fragment));
+    port = _makePort(port, scheme);
+    bool ensureLeadingSlash = (host != "" || scheme == "file");
+    path = _makePath(path, 0, _stringOrNullLength(path), pathSegments,
+                     ensureLeadingSlash);
+
+    return new Uri._internal(scheme, userInfo, host, port,
+                             path, query, fragment);
   }
 
   /**
@@ -416,11 +479,19 @@
    *
    * Examples:
    *
-   *     // Create the URI http://example.org/path?q=abc.
-   *     new Uri.http("google.com", "/search", { "q" : "dart" });http://example.org/path?q=abc.
-   *     new Uri.http("user:pass@localhost:8080, "");  // http://user:pass@localhost:8080/
-   *     new Uri.http("example.org, "a b");  // http://example.org/a%20b
-   *     new Uri.http("example.org, "/a%2F");  // http://example.org/a%25%2F
+   * ```
+   * // http://example.org/path?q=dart.
+   * new Uri.http("google.com", "/search", { "q" : "dart" });
+   *
+   * // http://user:pass@localhost:8080
+   * new Uri.http("user:pass@localhost:8080", "");
+   *
+   * // http://example.org/a%20b
+   * new Uri.http("example.org", "a b");
+   *
+   * // http://example.org/a%252F
+   * new Uri.http("example.org", "/a%2F");
+   * ```
    *
    * The `scheme` is always set to `http`.
    *
@@ -481,7 +552,7 @@
       if (hostEnd == authority.length) {
         throw new FormatException("Invalid IPv6 host entry.");
       }
-      parseIPv6Address(authority.substring(hostStart + 1, hostEnd));
+      parseIPv6Address(authority, hostStart + 1, hostEnd);
       hostEnd++;  // Skip the closing bracket.
       if (hostEnd != authority.length &&
           authority.codeUnitAt(hostEnd) != _COLON) {
@@ -540,26 +611,52 @@
    * a value for [windows]. Passing `true` will use Windows
    * semantics and passing `false` will use non-Windows semantics.
    *
-   * Examples using non-Windows semantics (resulting URI in comment):
+   * Examples using non-Windows semantics:
    *
-   *     new Uri.file("xxx/yyy");  // xxx/yyy
-   *     new Uri.file("xxx/yyy/");  // xxx/yyy/
-   *     new Uri.file("/xxx/yyy");  // file:///xxx/yyy
-   *     new Uri.file("/xxx/yyy/");  // file:///xxx/yyy/
-   *     new Uri.file("C:");  // C:
+   * ```
+   * // xxx/yyy
+   * new Uri.file("xxx/yyy", windows: false);
    *
-   * Examples using Windows semantics (resulting URI in comment):
+   * // xxx/yyy/
+   * new Uri.file("xxx/yyy/", windows: false);
    *
-   *     new Uri.file(r"xxx\yyy");  // xxx/yyy
-   *     new Uri.file(r"xxx\yyy\");  // xxx/yyy/
-   *     new Uri.file(r"\xxx\yyy");  // file:///xxx/yyy
-   *     new Uri.file(r"\xxx\yyy/");  // file:///xxx/yyy/
-   *     new Uri.file(r"C:\xxx\yyy");  // file:///C:/xxx/yyy
-   *     new Uri.file(r"C:xxx\yyy");  // Throws as path with drive letter
-   *                                  // is not absolute.
-   *     new Uri.file(r"\\server\share\file");  // file://server/share/file
-   *     new Uri.file(r"C:");  // Throws as path with drive letter
-   *                           // is not absolute.
+   * // file:///xxx/yyy
+   * new Uri.file("/xxx/yyy", windows: false);
+   *
+   * // file:///xxx/yyy/
+   * new Uri.file("/xxx/yyy/", windows: false);
+   *
+   * // C:
+   * new Uri.file("C:", windows: false);
+   * ```
+   *
+   * Examples using Windows semantics:
+   *
+   * ```
+   * // xxx/yyy
+   * new Uri.file(r"xxx\yyy", windows: true);
+   *
+   * // xxx/yyy/
+   * new Uri.file(r"xxx\yyy\", windows: true);
+   *
+   * file:///xxx/yyy
+   * new Uri.file(r"\xxx\yyy", windows: true);
+   *
+   * file:///xxx/yyy/
+   * new Uri.file(r"\xxx\yyy/", windows: true);
+   *
+   * // file:///C:/xxx/yyy
+   * new Uri.file(r"C:\xxx\yyy", windows: true);
+   *
+   * // This throws an error. A path with a drive letter is not absolute.
+   * new Uri.file(r"C:", windows: true);
+   *
+   * // This throws an error. A path with a drive letter is not absolute.
+   * new Uri.file(r"C:xxx\yyy", windows: true);
+   *
+   * // file://server/share/file
+   * new Uri.file(r"\\server\share\file", windows: true);
+   * ```
    *
    * If the path passed is not a legal file path [ArgumentError] is thrown.
    */
@@ -731,75 +828,193 @@
     return _queryParameters;
   }
 
-  static String _makeHost(String host) {
-    if (host == null || host.isEmpty) return host;
-    if (host.codeUnitAt(0) == _LEFT_BRACKET) {
-      if (host.codeUnitAt(host.length - 1) != _RIGHT_BRACKET) {
-        throw new FormatException('Missing end `]` to match `[` in host');
-      }
-      parseIPv6Address(host.substring(1, host.length - 1));
-      return host;
+  static int _makePort(int port, String scheme) {
+    // Perform scheme specific normalization.
+    if (port == 80 && scheme == "http") {
+      return 0;
     }
-    for (int i = 0; i < host.length; i++) {
-      if (host.codeUnitAt(i) == _COLON) {
-        parseIPv6Address(host);
-        return '[$host]';
-      }
+    if (port == 443 && scheme == "https") {
+      return 0;
     }
-    return host;
+    return port;
   }
 
-  static String _makeScheme(String scheme) {
-    bool isSchemeLowerCharacter(int ch) {
-      return ch < 128 &&
-             ((_schemeLowerTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
-    }
+  /**
+   * Check and normalize a most name.
+   *
+   * If the host name starts and ends with '[' and ']', it is considered an
+   * IPv6 address. If [strictIPv6] is false, the address is also considered
+   * an IPv6 address if it contains any ':' character.
+   *
+   * If it is not an IPv6 address, it is case- and escape-normalized.
+   * This escapes all characters not valid in a reg-name,
+   * and converts all non-escape upper-case letters to lower-case.
+   */
+  static String _makeHost(String host, int start, int end, bool strictIPv6) {
+    // TODO(lrn): Should we normalize IPv6 addresses according to RFC 5952?
 
-    if (scheme == null) return "";
-    bool allLowercase = true;
-    int length = scheme.length;
-    for (int i = 0; i < length; i++) {
-      int codeUnit = scheme.codeUnitAt(i);
-      if (i == 0 && !_isAlphabeticCharacter(codeUnit)) {
-        // First code unit must be an alphabetic character.
-        throw new ArgumentError('Illegal scheme: $scheme');
+    if (host == null) return null;
+    if (start == end) return "";
+    // Host is an IPv6 address if it starts with '[' or contains a colon.
+    if (host.codeUnitAt(start) == _LEFT_BRACKET) {
+      if (host.codeUnitAt(end - 1) != _RIGHT_BRACKET) {
+        _fail(host, start, 'Missing end `]` to match `[` in host');
       }
-      if (!isSchemeLowerCharacter(codeUnit)) {
-        if (_isSchemeCharacter(codeUnit)) {
-          allLowercase = false;
-        } else {
-          throw new ArgumentError('Illegal scheme: $scheme');
+      parseIPv6Address(host, start + 1, end - 1);
+      // RFC 5952 requires hex digits to be lower case.
+      return host.substring(start, end).toLowerCase();
+    }
+    if (!strictIPv6) {
+      // TODO(lrn): skip if too short to be a valid IPv6 address?
+      for (int i = start; i < end; i++) {
+        if (host.codeUnitAt(i) == _COLON) {
+          parseIPv6Address(host, start, end);
+          return '[$host]';
         }
       }
     }
-
-    return allLowercase ? scheme : scheme.toLowerCase();
+    return _normalizeRegName(host, start, end);
   }
 
-  String _makePath(String path, Iterable<String> pathSegments) {
+  static bool _isRegNameChar(int char) {
+    return char < 127 && (_regNameTable[char >> 4] & (1 << (char & 0xf))) != 0;
+  }
+
+  /**
+   * Validates and does case- and percent-encoding normalization.
+   *
+   * The [host] must be an RFC3986 "reg-name". It is converted
+   * to lower case, and percent escapes are converted to either
+   * lower case unreserved characters or upper case escapes.
+   */
+  static String _normalizeRegName(String host, int start, int end) {
+    StringBuffer buffer;
+    int sectionStart = start;
+    int index = start;
+    // Whether all characters between sectionStart and index are normalized,
+    bool isNormalized = true;
+
+    while (index < end) {
+      int char = host.codeUnitAt(index);
+      if (char == _PERCENT) {
+        // The _regNameTable contains "%", so we check that first.
+        String replacement = _normalizeEscape(host, index, true);
+        if (replacement == null && isNormalized) {
+          index += 3;
+          continue;
+        }
+        if (buffer == null) buffer = new StringBuffer();
+        String slice = host.substring(sectionStart, index);
+        if (!isNormalized) slice = slice.toLowerCase();
+        buffer.write(slice);
+        int sourceLength = 3;
+        if (replacement == null) {
+          replacement = host.substring(index, index + 3);
+        } else if (replacement == "%") {
+          replacement = "%25";
+          sourceLength = 1;
+        }
+        buffer.write(replacement);
+        index += sourceLength;
+        sectionStart = index;
+        isNormalized = true;
+      } else if (_isRegNameChar(char)) {
+        if (isNormalized && _UPPER_CASE_A <= char && _UPPER_CASE_Z >= char) {
+          // Put initial slice in buffer and continue in non-normalized mode
+          if (buffer == null) buffer = new StringBuffer();
+          if (sectionStart < index) {
+            buffer.write(host.substring(sectionStart, index));
+            sectionStart = index;
+          }
+          isNormalized = false;
+        }
+        index++;
+      } else if (_isGeneralDelimiter(char)) {
+        _fail(host, index, "Invalid character");
+      } else {
+        int sourceLength = 1;
+        if ((char & 0xFC00) == 0xD800 && (index + 1) < end) {
+          int tail = host.codeUnitAt(index + 1);
+          if ((tail & 0xFC00) == 0xDC00) {
+            char = 0x10000 | ((char & 0x3ff) << 10) | (tail & 0x3ff);
+            sourceLength = 2;
+          }
+        }
+        if (buffer == null) buffer = new StringBuffer();
+        String slice = host.substring(sectionStart, index);
+        if (!isNormalized) slice = slice.toLowerCase();
+        buffer.write(slice);
+        buffer.write(_escapeChar(char));
+        index += sourceLength;
+        sectionStart = index;
+      }
+    }
+    if (buffer == null) return host.substring(start, end);
+    if (sectionStart < end) {
+      String slice = host.substring(sectionStart, end);
+      if (!isNormalized) slice = slice.toLowerCase();
+      buffer.write(slice);
+    }
+    return buffer.toString();
+  }
+
+  /**
+   * Validates scheme characters and does case-normalization.
+   *
+   * Schemes are converted to lower case. They cannot contain escapes.
+   */
+  static String _makeScheme(String scheme, int end) {
+    if (end == 0) return "";
+    int char = scheme.codeUnitAt(0);
+    if (!_isAlphabeticCharacter(char)) {
+      _fail(scheme, 0, "Scheme not starting with alphabetic character");
+    }
+    bool allLowercase = char >= _LOWER_CASE_A;
+    for (int i = 0; i < end; i++) {
+      int codeUnit = scheme.codeUnitAt(i);
+      if (!_isSchemeCharacter(codeUnit)) {
+        _fail(scheme, i, "Illegal scheme character");
+      }
+      if (_LOWER_CASE_A <= char && _LOWER_CASE_Z >= char) {
+        allLowercase = false;
+      }
+    }
+    scheme = scheme.substring(0, end);
+    if (!allLowercase) scheme = scheme.toLowerCase();
+    return scheme;
+  }
+
+  static String _makeUserInfo(String userInfo, int start, int end) {
+    if (userInfo == null) return "null";
+    return _normalize(userInfo, start, end, _userinfoTable);
+  }
+
+  static String _makePath(String path, int start, int end,
+                          Iterable<String> pathSegments,
+                          bool ensureLeadingSlash) {
     if (path == null && pathSegments == null) return "";
     if (path != null && pathSegments != null) {
       throw new ArgumentError('Both path and pathSegments specified');
     }
     var result;
     if (path != null) {
-      result = _normalize(path);
+      result = _normalize(path, start, end, _pathCharOrSlashTable);
     } else {
       result = pathSegments.map((s) => _uriEncode(_pathCharTable, s)).join("/");
     }
-    if ((hasAuthority || (scheme == "file")) &&
-        result.isNotEmpty && !result.startsWith("/")) {
+    if (ensureLeadingSlash && result.isNotEmpty && !result.startsWith("/")) {
       return "/$result";
     }
     return result;
   }
 
-  static String _makeQuery(String query, Map<String, String> queryParameters) {
+  static String _makeQuery(String query, int start, int end,
+                           Map<String, String> queryParameters) {
     if (query == null && queryParameters == null) return "";
     if (query != null && queryParameters != null) {
       throw new ArgumentError('Both query and queryParameters specified');
     }
-    if (query != null) return _normalize(query);
+    if (query != null) return _normalize(query, start, end, _queryCharTable);
 
     var result = new StringBuffer();
     var first = true;
@@ -817,123 +1032,184 @@
     return result.toString();
   }
 
-  static String _makeFragment(String fragment) {
+  static String _makeFragment(String fragment, int start, int end) {
     if (fragment == null) return "";
-    return _normalize(fragment);
+    return _normalize(fragment, start, end, _queryCharTable);
   }
 
-  static String _normalize(String component) {
-    int index = component.indexOf('%');
-    if (index < 0) return component;
+  static int _stringOrNullLength(String s) => (s == null) ? 0 : s.length;
 
-    bool isNormalizedHexDigit(int digit) {
-      return (_ZERO <= digit && digit <= _NINE) ||
-          (_UPPER_CASE_A <= digit && digit <= _UPPER_CASE_F);
+  static bool _isHexDigit(int char) {
+    if (_NINE >= char) return _ZERO <= char;
+    char |= 0x20;
+    return _LOWER_CASE_A <= char && _LOWER_CASE_F >= char;
+  }
+
+  static int _hexValue(int char) {
+    assert(_isHexDigit(char));
+    if (_NINE >= char) return char - _ZERO;
+    char |= 0x20;
+    return char - (_LOWER_CASE_A - 10);
+  }
+
+  /**
+   * Performs RFC 3986 Percent-Encoding Normalization.
+   *
+   * Returns a replacement string that should be replace the original escape.
+   * Returns null if no replacement is necessary because the escape is
+   * not for an unreserved character and is already non-lower-case.
+   *
+   * Returns "%" if the escape is invalid (not two valid hex digits following
+   * the percent sign). The calling code should replace the percent
+   * sign with "%25", but leave the following two characters unmodified.
+   *
+   * If [lowerCase] is true, a single character returned is always lower case,
+   */
+  static String _normalizeEscape(String source, int index, bool lowerCase) {
+    assert(source.codeUnitAt(index) == _PERCENT);
+    if (index + 2 >= source.length) {
+      return "%";  // Marks the escape as invalid.
     }
-
-    bool isLowerCaseHexDigit(int digit) {
-      return _LOWER_CASE_A <= digit && digit <= _LOWER_CASE_F;
+    int firstDigit = source.codeUnitAt(index + 1);
+    int secondDigit = source.codeUnitAt(index + 2);
+    if (!_isHexDigit(firstDigit) || !_isHexDigit(secondDigit)) {
+      return "%";  // Marks the escape as invalid.
     }
-
-    bool isUnreserved(int ch) {
-      return ch < 128 &&
-             ((_unreservedTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
+    int value = _hexValue(firstDigit) * 16 + _hexValue(secondDigit);
+    if (_isUnreservedChar(value)) {
+      if (lowerCase && _UPPER_CASE_A <= value && _UPPER_CASE_Z >= value) {
+        value |= 0x20;
+      }
+      return new String.fromCharCode(value);
     }
+    if (firstDigit >= _LOWER_CASE_A || secondDigit >= _LOWER_CASE_A) {
+      // Either digit is lower case.
+      return source.substring(index, index + 3).toUpperCase();
+    }
+    // Escape is retained, and is already non-lower case, so return null to
+    // represent "no replacement necessary".
+    return null;
+  }
 
-    int normalizeHexDigit(int index) {
-      var codeUnit = component.codeUnitAt(index);
-      if (isLowerCaseHexDigit(codeUnit)) {
-        return codeUnit - 0x20;
-      } else if (!isNormalizedHexDigit(codeUnit)) {
-        throw new ArgumentError("Invalid URI component: $component");
-      } else {
-        return codeUnit;
+  static bool _isUnreservedChar(int ch) {
+    return ch < 127 &&
+           ((_unreservedTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
+  }
+
+  static String _escapeChar(char) {
+    assert(char <= 0x10ffff);  // It's a valid unicode code point.
+    const hexDigits = "0123456789ABCDEF";
+    List codeUnits;
+    if (char < 0x80) {
+      // ASCII, a single percent encoded sequence.
+      codeUnits = new List(3);
+      codeUnits[0] = _PERCENT;
+      codeUnits[1] = hexDigits.codeUnitAt(char >> 4);
+      codeUnits[2] = hexDigits.codeUnitAt(char & 0xf);
+    } else {
+      // Do UTF-8 encoding of character, then percent encode bytes.
+      int flag = 0xc0;  // The high-bit markers on the first byte of UTF-8.
+      int encodedBytes = 2;
+      if (char > 0x7ff) {
+        flag = 0xe0;
+        encodedBytes = 3;
+        if (char > 0xffff) {
+          encodedBytes = 4;
+          flag = 0xf0;
+        }
+      }
+      codeUnits = new List(3 * encodedBytes);
+      int index = 0;
+      while (--encodedBytes >= 0) {
+        int byte = ((char >> (6 * encodedBytes)) & 0x3f) | flag;
+        codeUnits[index] = _PERCENT;
+        codeUnits[index + 1] = hexDigits.codeUnitAt(byte >> 4);
+        codeUnits[index + 2] = hexDigits.codeUnitAt(byte & 0xf);
+        index += 3;
+        flag = 0x80;  // Following bytes have only high bit set.
       }
     }
+    return new String.fromCharCodes(codeUnits);
+  }
 
-    int decodeHexDigitPair(int index) {
-      int byte = 0;
-      for (int i = 0; i < 2; i++) {
-        var codeUnit = component.codeUnitAt(index + i);
-        if (_ZERO <= codeUnit && codeUnit <= _NINE) {
-          byte = byte * 16 + codeUnit - _ZERO;
-        } else {
-          // Check ranges A-F (0x41-0x46) and a-f (0x61-0x66).
-          codeUnit |= 0x20;
-          if (_LOWER_CASE_A <= codeUnit &&
-              codeUnit <= _LOWER_CASE_F) {
-            byte = byte * 16 + codeUnit - _LOWER_CASE_A + 10;
-          } else {
-            throw new ArgumentError(
-                "Invalid percent-encoding in URI component: $component");
+  /**
+   * Runs through component checking that each character is valid and
+   * normalize percent escapes.
+   *
+   * Uses [charTable] to check if a non-`%` character is allowed.
+   * Each `%` character must be followed by two hex digits.
+   * If the hex-digits are lower case letters, they are converted to
+   * upper case.
+   */
+  static String _normalize(String component, int start, int end,
+                           List<int> charTable) {
+    StringBuffer buffer;
+    int sectionStart = start;
+    int index = start;
+    // Loop while characters are valid and escapes correct and upper-case.
+    while (index < end) {
+      int char = component.codeUnitAt(index);
+      if (char < 127 && (charTable[char >> 4] & (1 << (char & 0x0f))) != 0) {
+        index++;
+      } else {
+        String replacement;
+        int sourceLength;
+        if (char == _PERCENT) {
+          replacement = _normalizeEscape(component, index, false);
+          // Returns null if we should keep the existing escape.
+          if (replacement == null) {
+            index += 3;
+            continue;
           }
-        }
-      }
-      return byte;
-    }
-
-    // Start building the normalized component string.
-    StringBuffer result;
-    int length = component.length;
-    int prevIndex = 0;
-
-    // Copy a part of the component string to the result.
-    void fillResult() {
-      if (result == null) {
-        assert(prevIndex == 0);
-        result = new StringBuffer(component.substring(prevIndex, index));
-      } else {
-        result.write(component.substring(prevIndex, index));
-      }
-    }
-
-    while (index < length) {
-      // Normalize percent-encoding to uppercase and don't encode
-      // unreserved characters.
-      assert(component.codeUnitAt(index) == _PERCENT);
-      if (length < index + 2) {
-          throw new ArgumentError(
-              "Invalid percent-encoding in URI component: $component");
-      }
-
-      var codeUnit1 = component.codeUnitAt(index + 1);
-      var codeUnit2 = component.codeUnitAt(index + 2);
-      var decodedCodeUnit = decodeHexDigitPair(index + 1);
-      if (isNormalizedHexDigit(codeUnit1) &&
-          isNormalizedHexDigit(codeUnit2) &&
-          !isUnreserved(decodedCodeUnit)) {
-        index += 3;
-      } else {
-        fillResult();
-        if (isUnreserved(decodedCodeUnit)) {
-          result.writeCharCode(decodedCodeUnit);
+          // Returns "%" if we should escape the existing percent.
+          if ("%" == replacement) {
+            replacement = "%25";
+            sourceLength = 1;
+          } else {
+            sourceLength = 3;
+          }
+        } else if (_isGeneralDelimiter(char)) {
+          _fail(component, index, "Invalid character");
         } else {
-          result.write("%");
-          result.writeCharCode(normalizeHexDigit(index + 1));
-          result.writeCharCode(normalizeHexDigit(index + 2));
+          sourceLength = 1;
+          if ((char & 0xFC00) == 0xD800) {
+            // Possible lead surrogate.
+            if (index + 1 < end) {
+              int tail = component.codeUnitAt(index + 1);
+              if ((tail & 0xFC00) == 0xDC00) {
+                // Tail surrogat.
+                sourceLength = 2;
+                char = 0x10000 | ((char & 0x3ff) << 10) | (tail & 0x3ff);
+              }
+            }
+          }
+          replacement = _escapeChar(char);
         }
-        index += 3;
-        prevIndex = index;
-      }
-      int next = component.indexOf('%', index);
-      if (next >= index) {
-        index = next;
-      } else {
-        index = length;
+        if (buffer == null) buffer = new StringBuffer();
+        buffer.write(component.substring(sectionStart, index));
+        buffer.write(replacement);
+        index += sourceLength;
+        sectionStart = index;
       }
     }
-    if (result == null) return component;
-
-    if (result != null && prevIndex != index) fillResult();
-    assert(index == length);
-
-    return result.toString();
+    if (buffer == null) {
+      // Makes no copy if start == 0 and end == component.length.
+      return component.substring(start, end);
+    }
+    if (sectionStart < end) {
+      buffer.write(component.substring(sectionStart, end));
+    }
+    return buffer.toString();
   }
 
   static bool _isSchemeCharacter(int ch) {
     return ch < 128 && ((_schemeTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
   }
 
+  static bool _isGeneralDelimiter(int ch) {
+    return ch <= _RIGHT_BRACKET &&
+        ((_genDelimitersTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
+  }
 
   /**
    * Returns whether the URI is absolute.
@@ -1206,7 +1482,9 @@
   String toString() {
     StringBuffer sb = new StringBuffer();
     _addIfNonEmpty(sb, scheme, scheme, ':');
-    if (hasAuthority || (scheme == "file")) {
+    if (hasAuthority || path.startsWith("//") || (scheme == "file")) {
+      // File URIS always have the authority, even if it is empty.
+      // The empty URI means "localhost".
       sb.write("//");
       _writeAuthority(sb);
     }
@@ -1431,6 +1709,9 @@
    * Throws a [FormatException] if [host] is not a valid IPv6 address
    * representation.
    *
+   * Acts on the substring from [start] to [end]. If [end] is omitted, it
+   * defaults ot the end of the string.
+   *
    * Some examples of IPv6 addresses:
    *  * ::1
    *  * FEDC:BA98:7654:3210:FEDC:BA98:7654:3210
@@ -1438,7 +1719,8 @@
    *  * ::FFFF:129.144.52.38
    *  * 2010:836B:4179::836B:4179
    */
-  static List<int> parseIPv6Address(String host) {
+  static List<int> parseIPv6Address(String host, [int start = 0, int end]) {
+    if (end == null) end = host.length;
     // An IPv6 address consists of exactly 8 parts of 1-4 hex digits, seperated
     // by `:`'s, with the following exceptions:
     //
@@ -1461,11 +1743,11 @@
     if (host.length < 2) error('address is too short');
     List<int> parts = [];
     bool wildcardSeen = false;
-    int partStart = 0;
+    int partStart = start;
     // Parse all parts, except a potential last one.
-    for (int i = 0; i < host.length; i++) {
+    for (int i = start; i < end; i++) {
       if (host.codeUnitAt(i) == _COLON) {
-        if (i == 0) {
+        if (i == start) {
           // If we see a `:` in the beginning, expect wildcard.
           i++;
           if (host.codeUnitAt(i) != _COLON) {
@@ -1488,18 +1770,18 @@
       }
     }
     if (parts.length == 0) error('too few parts');
-    bool atEnd = partStart == host.length;
-    bool isLastWildcard = parts.last == -1;
+    bool atEnd = (partStart == end);
+    bool isLastWildcard = (parts.last == -1);
     if (atEnd && !isLastWildcard) {
       error('expected a part after last `:`');
     }
     if (!atEnd) {
       try {
-        parts.add(parseHex(partStart, host.length));
+        parts.add(parseHex(partStart, end));
       } catch (e) {
         // Failed to parse the last chunk as hex. Try IPv4.
         try {
-          List<int> last = parseIPv4Address(host.substring(partStart));
+          List<int> last = parseIPv4Address(host.substring(partStart, end));
           parts.add(last[0] << 8 | last[1]);
           parts.add(last[2] << 8 | last[3]);
         } catch (e) {
@@ -1515,15 +1797,23 @@
       error('an address without a wildcard must contain exactly 8 parts');
     }
     // TODO(ajohnsen): Consider using Uint8List.
-    return parts
-        .expand((value) {
-          if (value == -1) {
-            return new List.filled((9 - parts.length) * 2, 0);
-          } else {
-            return [(value >> 8) & 0xFF, value & 0xFF];
-          }
-        })
-        .toList();
+    List bytes = new List<int>(16);
+    for (int i = 0, index = 0; i < parts.length; i++) {
+      int value = parts[i];
+      if (value == -1) {
+        int wildCardLength = 9 - parts.length;
+        for (int j = 0; j < wildCardLength; j++) {
+          bytes[index] = 0;
+          bytes[index + 1] = 0;
+          index += 2;
+        }
+      } else {
+        bytes[index] = value >> 8;
+        bytes[index + 1] = value & 0xff;
+        index += 2;
+      }
+    }
+    return bytes;
   }
 
   // Frequently used character codes.
@@ -1713,7 +2003,7 @@
       0x0000,   // 0x00 - 0x0f  0000000000000000
       0x0000,   // 0x10 - 0x1f  0000000000000000
                 //               ! #$ &'()*+,-./
-      0xf7da,   // 0x20 - 0x2f  0101101111101111
+      0xffda,   // 0x20 - 0x2f  0101101111111111
                 //              0123456789:; = ?
       0xafff,   // 0x30 - 0x3f  1111111111110101
                 //              @ABCDEFGHIJKLMNO
@@ -1786,6 +2076,48 @@
                 //              pqrstuvwxyz   ~
       0x47ff];  // 0x70 - 0x7f  1111111111100010
 
+  // General delimiter characters, RFC 3986 section 2.2.
+  // gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
+  //
+  static const _genDelimitersTable = const [
+                //             LSB            MSB
+                //              |              |
+      0x0000,   // 0x00 - 0x0f  0000000000000000
+      0x0000,   // 0x10 - 0x1f  0000000000000000
+                //                 #           /
+      0x8008,   // 0x20 - 0x2f  0001000000000001
+                //                        :    ?
+      0x8400,   // 0x30 - 0x3f  0000000000100001
+                //              @
+      0x0001,   // 0x40 - 0x4f  1000000000000000
+                //                         [ ]
+      0x2800,   // 0x50 - 0x5f  0000000000010100
+                //
+      0x0000,   // 0x60 - 0x6f  0000000000000000
+                //
+      0x0000];  // 0x70 - 0x7f  0000000000000000
+
+  // Characters allowed in the userinfo as of RFC 3986.
+  // RFC 3986 Apendix A
+  // userinfo = *( unreserved / pct-encoded / sub-delims / ':')
+  static const _userinfoTable = const [
+                //             LSB            MSB
+                //              |              |
+      0x0000,   // 0x00 - 0x0f  0000000000000000
+      0x0000,   // 0x10 - 0x1f  0000000000000000
+                //               !  $ &'()*+,-.
+      0x7fd2,   // 0x20 - 0x2f  0100101111111110
+                //              0123456789:; =
+      0x2fff,   // 0x30 - 0x3f  1111111111110100
+                //               ABCDEFGHIJKLMNO
+      0xfffe,   // 0x40 - 0x4f  0111111111111111
+                //              PQRSTUVWXYZ    _
+      0x87ff,   // 0x50 - 0x5f  1111111111100001
+                //               abcdefghijklmno
+      0xfffe,   // 0x60 - 0x6f  0111111111111111
+                //              pqrstuvwxyz   ~
+      0x47ff];  // 0x70 - 0x7f  1111111111100010
+
   // Characters allowed in the reg-name as of RFC 3986.
   // RFC 3986 Apendix A
   // reg-name = *( unreserved / pct-encoded / sub-delims )
@@ -1828,6 +2160,27 @@
                 //              pqrstuvwxyz   ~
       0x47ff];  // 0x70 - 0x7f  1111111111100010
 
+  // Characters allowed in the path as of RFC 3986.
+  // RFC 3986 section 3.3 *and* slash.
+  static const _pathCharOrSlashTable = const [
+                //             LSB            MSB
+                //              |              |
+      0x0000,   // 0x00 - 0x0f  0000000000000000
+      0x0000,   // 0x10 - 0x1f  0000000000000000
+                //               !  $ &'()*+,-./
+      0xffd2,   // 0x20 - 0x2f  0100101111111111
+                //              0123456789:; =
+      0x2fff,   // 0x30 - 0x3f  1111111111110100
+                //              @ABCDEFGHIJKLMNO
+      0xffff,   // 0x40 - 0x4f  1111111111111111
+
+                //              PQRSTUVWXYZ    _
+      0x87ff,   // 0x50 - 0x5f  1111111111100001
+                //               abcdefghijklmno
+      0xfffe,   // 0x60 - 0x6f  0111111111111111
+                //              pqrstuvwxyz   ~
+      0x47ff];  // 0x70 - 0x7f  1111111111100010
+
   // Characters allowed in the query as of RFC 3986.
   // RFC 3986 section 3.4.
   // query = *( pchar / "/" / "?" )
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index b7ff13b..839930e 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -110,384 +110,384 @@
   return _Utils.spawnDomUri(uri.toString());
 }
 // FIXME: Can we make this private?
-const htmlBlinkMap = const {
-  '_HistoryCrossFrame': _HistoryCrossFrame,
-  '_LocationCrossFrame': _LocationCrossFrame,
-  '_DOMWindowCrossFrame': _DOMWindowCrossFrame,
+final htmlBlinkMap = {
+  '_HistoryCrossFrame': () => _HistoryCrossFrame,
+  '_LocationCrossFrame': () => _LocationCrossFrame,
+  '_DOMWindowCrossFrame': () => _DOMWindowCrossFrame,
   // FIXME: Move these to better locations.
-  'DateTime': DateTime,
-  'JsObject': js.JsObject,
-  'JsFunction': js.JsFunction,
-  'JsArray': js.JsArray,
-  'AbstractWorker': AbstractWorker,
-  'Algorithm': Algorithm,
-  'Animation': Animation,
-  'ApplicationCache': ApplicationCache,
-  'Attr': _Attr,
-  'AutocompleteErrorEvent': AutocompleteErrorEvent,
-  'BarProp': BarProp,
-  'BeforeLoadEvent': BeforeLoadEvent,
-  'BeforeUnloadEvent': BeforeUnloadEvent,
-  'Blob': Blob,
-  'CDATASection': CDataSection,
-  'CSS': Css,
-  'CSSCharsetRule': CssCharsetRule,
-  'CSSFontFaceLoadEvent': CssFontFaceLoadEvent,
-  'CSSFontFaceRule': CssFontFaceRule,
-  'CSSImportRule': CssImportRule,
-  'CSSKeyframeRule': CssKeyframeRule,
-  'CSSKeyframesRule': CssKeyframesRule,
-  'CSSMediaRule': CssMediaRule,
-  'CSSPageRule': CssPageRule,
-  'CSSPrimitiveValue': _CSSPrimitiveValue,
-  'CSSRule': CssRule,
-  'CSSRuleList': _CssRuleList,
-  'CSSStyleDeclaration': CssStyleDeclaration,
-  'CSSStyleRule': CssStyleRule,
-  'CSSStyleSheet': CssStyleSheet,
-  'CSSSupportsRule': CssSupportsRule,
-  'CSSUnknownRule': _CSSUnknownRule,
-  'CSSValue': _CSSValue,
-  'CSSValueList': _CssValueList,
-  'CSSViewportRule': CssViewportRule,
-  'Canvas2DContextAttributes': Canvas2DContextAttributes,
-  'CanvasGradient': CanvasGradient,
-  'CanvasPattern': CanvasPattern,
-  'CanvasRenderingContext': CanvasRenderingContext,
-  'CanvasRenderingContext2D': CanvasRenderingContext2D,
-  'CharacterData': CharacterData,
-  'ChildNode': ChildNode,
-  'ClientRect': _ClientRect,
-  'ClientRectList': _ClientRectList,
-  'Clipboard': DataTransfer,
-  'CloseEvent': CloseEvent,
-  'Comment': Comment,
-  'CompositionEvent': CompositionEvent,
-  'Console': Console,
-  'ConsoleBase': ConsoleBase,
-  'Coordinates': Coordinates,
-  'Counter': _Counter,
-  'Crypto': Crypto,
-  'CustomEvent': CustomEvent,
-  'DOMError': DomError,
-  'DOMException': DomException,
-  'DOMFileSystem': FileSystem,
-  'DOMFileSystemSync': _DOMFileSystemSync,
-  'DOMImplementation': DomImplementation,
-  'DOMParser': DomParser,
-  'DOMSettableTokenList': DomSettableTokenList,
-  'DOMStringList': DomStringList,
-  'DOMStringMap': DomStringMap,
-  'DOMTokenList': DomTokenList,
-  'DataTransferItem': DataTransferItem,
-  'DataTransferItemList': DataTransferItemList,
-  'DatabaseSync': _DatabaseSync,
-  'DedicatedWorkerGlobalScope': DedicatedWorkerGlobalScope,
-  'DeprecatedStorageInfo': DeprecatedStorageInfo,
-  'DeprecatedStorageQuota': DeprecatedStorageQuota,
-  'DeviceAcceleration': DeviceAcceleration,
-  'DeviceMotionEvent': DeviceMotionEvent,
-  'DeviceOrientationEvent': DeviceOrientationEvent,
-  'DeviceRotationRate': DeviceRotationRate,
-  'DirectoryEntry': DirectoryEntry,
-  'DirectoryEntrySync': _DirectoryEntrySync,
-  'DirectoryReader': DirectoryReader,
-  'DirectoryReaderSync': _DirectoryReaderSync,
-  'Document': Document,
-  'DocumentFragment': DocumentFragment,
-  'DocumentType': _DocumentType,
-  'Element': Element,
-  'Entry': Entry,
-  'EntrySync': _EntrySync,
-  'ErrorEvent': ErrorEvent,
-  'Event': Event,
-  'EventSource': EventSource,
-  'EventTarget': EventTarget,
-  'File': File,
-  'FileEntry': FileEntry,
-  'FileEntrySync': _FileEntrySync,
-  'FileError': FileError,
-  'FileList': FileList,
-  'FileReader': FileReader,
-  'FileReaderSync': _FileReaderSync,
-  'FileWriter': FileWriter,
-  'FileWriterSync': _FileWriterSync,
-  'FocusEvent': FocusEvent,
-  'FontFace': FontFace,
-  'FontFaceSet': FontFaceSet,
-  'FormData': FormData,
-  'Gamepad': Gamepad,
-  'GamepadList': _GamepadList,
-  'Geolocation': Geolocation,
-  'Geoposition': Geoposition,
-  'GlobalEventHandlers': GlobalEventHandlers,
-  'HTMLAllCollection': _HTMLAllCollection,
-  'HTMLAnchorElement': AnchorElement,
-  'HTMLAppletElement': _HTMLAppletElement,
-  'HTMLAreaElement': AreaElement,
-  'HTMLAudioElement': AudioElement,
-  'HTMLBRElement': BRElement,
-  'HTMLBaseElement': BaseElement,
-  'HTMLBodyElement': BodyElement,
-  'HTMLButtonElement': ButtonElement,
-  'HTMLCanvasElement': CanvasElement,
-  'HTMLCollection': HtmlCollection,
-  'HTMLContentElement': ContentElement,
-  'HTMLDListElement': DListElement,
-  'HTMLDataListElement': DataListElement,
-  'HTMLDetailsElement': DetailsElement,
-  'HTMLDialogElement': DialogElement,
-  'HTMLDirectoryElement': _HTMLDirectoryElement,
-  'HTMLDivElement': DivElement,
-  'HTMLDocument': HtmlDocument,
-  'HTMLElement': HtmlElement,
-  'HTMLEmbedElement': EmbedElement,
-  'HTMLFieldSetElement': FieldSetElement,
-  'HTMLFontElement': _HTMLFontElement,
-  'HTMLFormControlsCollection': HtmlFormControlsCollection,
-  'HTMLFormElement': FormElement,
-  'HTMLFrameElement': _HTMLFrameElement,
-  'HTMLFrameSetElement': _HTMLFrameSetElement,
-  'HTMLHRElement': HRElement,
-  'HTMLHeadElement': HeadElement,
-  'HTMLHeadingElement': HeadingElement,
-  'HTMLHtmlElement': HtmlHtmlElement,
-  'HTMLIFrameElement': IFrameElement,
-  'HTMLImageElement': ImageElement,
-  'HTMLInputElement': InputElement,
-  'HTMLKeygenElement': KeygenElement,
-  'HTMLLIElement': LIElement,
-  'HTMLLabelElement': LabelElement,
-  'HTMLLegendElement': LegendElement,
-  'HTMLLinkElement': LinkElement,
-  'HTMLMapElement': MapElement,
-  'HTMLMarqueeElement': _HTMLMarqueeElement,
-  'HTMLMediaElement': MediaElement,
-  'HTMLMenuElement': MenuElement,
-  'HTMLMetaElement': MetaElement,
-  'HTMLMeterElement': MeterElement,
-  'HTMLModElement': ModElement,
-  'HTMLOListElement': OListElement,
-  'HTMLObjectElement': ObjectElement,
-  'HTMLOptGroupElement': OptGroupElement,
-  'HTMLOptionElement': OptionElement,
-  'HTMLOptionsCollection': HtmlOptionsCollection,
-  'HTMLOutputElement': OutputElement,
-  'HTMLParagraphElement': ParagraphElement,
-  'HTMLParamElement': ParamElement,
-  'HTMLPreElement': PreElement,
-  'HTMLProgressElement': ProgressElement,
-  'HTMLQuoteElement': QuoteElement,
-  'HTMLScriptElement': ScriptElement,
-  'HTMLSelectElement': SelectElement,
-  'HTMLShadowElement': ShadowElement,
-  'HTMLSourceElement': SourceElement,
-  'HTMLSpanElement': SpanElement,
-  'HTMLStyleElement': StyleElement,
-  'HTMLTableCaptionElement': TableCaptionElement,
-  'HTMLTableCellElement': TableCellElement,
-  'HTMLTableColElement': TableColElement,
-  'HTMLTableElement': TableElement,
-  'HTMLTableRowElement': TableRowElement,
-  'HTMLTableSectionElement': TableSectionElement,
-  'HTMLTemplateElement': TemplateElement,
-  'HTMLTextAreaElement': TextAreaElement,
-  'HTMLTitleElement': TitleElement,
-  'HTMLTrackElement': TrackElement,
-  'HTMLUListElement': UListElement,
-  'HTMLUnknownElement': UnknownElement,
-  'HTMLVideoElement': VideoElement,
-  'HashChangeEvent': HashChangeEvent,
-  'History': History,
-  'ImageBitmap': ImageBitmap,
-  'ImageData': ImageData,
-  'InjectedScriptHost': InjectedScriptHost,
-  'InputMethodContext': InputMethodContext,
-  'InstallEvent': InstallEvent,
-  'InstallPhaseEvent': InstallPhaseEvent,
-  'Key': CryptoKey,
-  'KeyPair': KeyPair,
-  'KeyboardEvent': KeyboardEvent,
-  'Location': Location,
-  'MIDIAccess': MidiAccess,
-  'MIDIAccessPromise': MidiAccessPromise,
-  'MIDIConnectionEvent': MidiConnectionEvent,
-  'MIDIInput': MidiInput,
-  'MIDIMessageEvent': MidiMessageEvent,
-  'MIDIOutput': MidiOutput,
-  'MIDIPort': MidiPort,
-  'MediaController': MediaController,
-  'MediaError': MediaError,
-  'MediaKeyError': MediaKeyError,
-  'MediaKeyEvent': MediaKeyEvent,
-  'MediaKeyMessageEvent': MediaKeyMessageEvent,
-  'MediaKeyNeededEvent': MediaKeyNeededEvent,
-  'MediaKeySession': MediaKeySession,
-  'MediaKeys': MediaKeys,
-  'MediaList': MediaList,
-  'MediaQueryList': MediaQueryList,
-  'MediaSource': MediaSource,
-  'MediaStream': MediaStream,
-  'MediaStreamEvent': MediaStreamEvent,
-  'MediaStreamTrack': MediaStreamTrack,
-  'MediaStreamTrackEvent': MediaStreamTrackEvent,
-  'MemoryInfo': MemoryInfo,
-  'MessageChannel': MessageChannel,
-  'MessageEvent': MessageEvent,
-  'MessagePort': MessagePort,
-  'Metadata': Metadata,
-  'MimeType': MimeType,
-  'MimeTypeArray': MimeTypeArray,
-  'MouseEvent': MouseEvent,
-  'MutationEvent': _MutationEvent,
-  'MutationObserver': MutationObserver,
-  'MutationRecord': MutationRecord,
-  'NamedNodeMap': _NamedNodeMap,
-  'Navigator': Navigator,
-  'NavigatorID': NavigatorID,
-  'NavigatorOnLine': NavigatorOnLine,
-  'NavigatorUserMediaError': NavigatorUserMediaError,
-  'Node': Node,
-  'NodeFilter': NodeFilter,
-  'NodeIterator': NodeIterator,
-  'NodeList': NodeList,
-  'Notation': _Notation,
-  'Notification': Notification,
-  'NotificationCenter': _NotificationCenter,
-  'OverflowEvent': OverflowEvent,
-  'PagePopupController': _PagePopupController,
-  'PageTransitionEvent': PageTransitionEvent,
-  'ParentNode': ParentNode,
-  'Path': Path,
-  'Performance': Performance,
-  'PerformanceEntry': PerformanceEntry,
-  'PerformanceMark': PerformanceMark,
-  'PerformanceMeasure': PerformanceMeasure,
-  'PerformanceNavigation': PerformanceNavigation,
-  'PerformanceResourceTiming': PerformanceResourceTiming,
-  'PerformanceTiming': PerformanceTiming,
-  'Player': Player,
-  'Plugin': Plugin,
-  'PluginArray': PluginArray,
-  'PopStateEvent': PopStateEvent,
-  'PositionError': PositionError,
-  'ProcessingInstruction': ProcessingInstruction,
-  'ProgressEvent': ProgressEvent,
-  'RGBColor': _RGBColor,
-  'RTCDTMFSender': RtcDtmfSender,
-  'RTCDTMFToneChangeEvent': RtcDtmfToneChangeEvent,
-  'RTCDataChannel': RtcDataChannel,
-  'RTCDataChannelEvent': RtcDataChannelEvent,
-  'RTCIceCandidate': RtcIceCandidate,
-  'RTCIceCandidateEvent': RtcIceCandidateEvent,
-  'RTCPeerConnection': RtcPeerConnection,
-  'RTCSessionDescription': RtcSessionDescription,
-  'RTCStatsReport': RtcStatsReport,
-  'RTCStatsResponse': RtcStatsResponse,
-  'RadioNodeList': _RadioNodeList,
-  'Range': Range,
-  'Rect': _Rect,
-  'ResourceProgressEvent': ResourceProgressEvent,
-  'Screen': Screen,
-  'SecurityPolicyViolationEvent': SecurityPolicyViolationEvent,
-  'Selection': Selection,
-  'ServiceWorker': _ServiceWorker,
-  'ServiceWorkerContainer': ServiceWorkerContainer,
-  'ServiceWorkerGlobalScope': ServiceWorkerGlobalScope,
-  'ShadowRoot': ShadowRoot,
-  'SharedWorker': SharedWorker,
-  'SharedWorkerGlobalScope': SharedWorkerGlobalScope,
-  'SourceBuffer': SourceBuffer,
-  'SourceBufferList': SourceBufferList,
-  'SourceInfo': SourceInfo,
-  'SpeechGrammar': SpeechGrammar,
-  'SpeechGrammarList': SpeechGrammarList,
-  'SpeechInputEvent': SpeechInputEvent,
-  'SpeechInputResult': SpeechInputResult,
-  'SpeechInputResultList': _SpeechInputResultList,
-  'SpeechRecognition': SpeechRecognition,
-  'SpeechRecognitionAlternative': SpeechRecognitionAlternative,
-  'SpeechRecognitionError': SpeechRecognitionError,
-  'SpeechRecognitionEvent': SpeechRecognitionEvent,
-  'SpeechRecognitionResult': SpeechRecognitionResult,
-  'SpeechRecognitionResultList': _SpeechRecognitionResultList,
-  'SpeechSynthesis': SpeechSynthesis,
-  'SpeechSynthesisEvent': SpeechSynthesisEvent,
-  'SpeechSynthesisUtterance': SpeechSynthesisUtterance,
-  'SpeechSynthesisVoice': SpeechSynthesisVoice,
-  'Storage': Storage,
-  'StorageEvent': StorageEvent,
-  'StorageInfo': StorageInfo,
-  'StorageQuota': StorageQuota,
-  'Stream': FileStream,
-  'StyleMedia': StyleMedia,
-  'StyleSheet': StyleSheet,
-  'StyleSheetList': _StyleSheetList,
-  'SubtleCrypto': _SubtleCrypto,
-  'Text': Text,
-  'TextEvent': TextEvent,
-  'TextMetrics': TextMetrics,
-  'TextTrack': TextTrack,
-  'TextTrackCue': TextTrackCue,
-  'TextTrackCueList': TextTrackCueList,
-  'TextTrackList': TextTrackList,
-  'TimeRanges': TimeRanges,
-  'TimedItem': TimedItem,
-  'Timeline': Timeline,
-  'Timing': Timing,
-  'Touch': Touch,
-  'TouchEvent': TouchEvent,
-  'TouchList': TouchList,
-  'TrackEvent': TrackEvent,
-  'TransitionEvent': TransitionEvent,
-  'TreeWalker': TreeWalker,
-  'UIEvent': UIEvent,
-  'URL': Url,
-  'URLUtils': UrlUtils,
-  'URLUtilsReadOnly': UrlUtilsReadOnly,
-  'VTTCue': VttCue,
-  'VTTRegion': VttRegion,
-  'VTTRegionList': VttRegionList,
-  'ValidityState': ValidityState,
-  'VideoPlaybackQuality': VideoPlaybackQuality,
-  'WebKitAnimationEvent': AnimationEvent,
-  'WebKitCSSFilterRule': CssFilterRule,
-  'WebKitCSSFilterValue': _WebKitCSSFilterValue,
-  'WebKitCSSMatrix': _WebKitCSSMatrix,
-  'WebKitCSSTransformValue': _WebKitCSSTransformValue,
-  'WebKitMediaSource': _WebKitMediaSource,
-  'WebKitNotification': _WebKitNotification,
-  'WebKitPoint': _DomPoint,
-  'WebKitSourceBuffer': _WebKitSourceBuffer,
-  'WebKitSourceBufferList': _WebKitSourceBufferList,
-  'WebSocket': WebSocket,
-  'WheelEvent': WheelEvent,
-  'Window': Window,
-  'WindowBase64': WindowBase64,
-  'WindowEventHandlers': WindowEventHandlers,
-  'WindowTimers': _WindowTimers,
-  'Worker': Worker,
-  'WorkerConsole': WorkerConsole,
-  'WorkerCrypto': WorkerCrypto,
-  'WorkerGlobalScope': WorkerGlobalScope,
-  'WorkerLocation': _WorkerLocation,
-  'WorkerNavigator': _WorkerNavigator,
-  'WorkerPerformance': WorkerPerformance,
-  'XMLDocument': XmlDocument,
-  'XMLHttpRequest': HttpRequest,
-  'XMLHttpRequestEventTarget': HttpRequestEventTarget,
-  'XMLHttpRequestProgressEvent': _XMLHttpRequestProgressEvent,
-  'XMLHttpRequestUpload': HttpRequestUpload,
-  'XMLSerializer': XmlSerializer,
-  'XPathEvaluator': XPathEvaluator,
-  'XPathExpression': XPathExpression,
-  'XPathNSResolver': XPathNSResolver,
-  'XPathResult': XPathResult,
-  'XSLTProcessor': XsltProcessor,
+  'DateTime': () => DateTime,
+  'JsObject': () => js.JsObject,
+  'JsFunction': () => js.JsFunction,
+  'JsArray': () => js.JsArray,
+  'AbstractWorker': () => AbstractWorker,
+  'Algorithm': () => Algorithm,
+  'Animation': () => Animation,
+  'ApplicationCache': () => ApplicationCache,
+  'Attr': () => _Attr,
+  'AutocompleteErrorEvent': () => AutocompleteErrorEvent,
+  'BarProp': () => BarProp,
+  'BeforeLoadEvent': () => BeforeLoadEvent,
+  'BeforeUnloadEvent': () => BeforeUnloadEvent,
+  'Blob': () => Blob,
+  'CDATASection': () => CDataSection,
+  'CSS': () => Css,
+  'CSSCharsetRule': () => CssCharsetRule,
+  'CSSFontFaceLoadEvent': () => CssFontFaceLoadEvent,
+  'CSSFontFaceRule': () => CssFontFaceRule,
+  'CSSImportRule': () => CssImportRule,
+  'CSSKeyframeRule': () => CssKeyframeRule,
+  'CSSKeyframesRule': () => CssKeyframesRule,
+  'CSSMediaRule': () => CssMediaRule,
+  'CSSPageRule': () => CssPageRule,
+  'CSSPrimitiveValue': () => _CSSPrimitiveValue,
+  'CSSRule': () => CssRule,
+  'CSSRuleList': () => _CssRuleList,
+  'CSSStyleDeclaration': () => CssStyleDeclaration,
+  'CSSStyleRule': () => CssStyleRule,
+  'CSSStyleSheet': () => CssStyleSheet,
+  'CSSSupportsRule': () => CssSupportsRule,
+  'CSSUnknownRule': () => _CSSUnknownRule,
+  'CSSValue': () => _CSSValue,
+  'CSSValueList': () => _CssValueList,
+  'CSSViewportRule': () => CssViewportRule,
+  'Canvas2DContextAttributes': () => Canvas2DContextAttributes,
+  'CanvasGradient': () => CanvasGradient,
+  'CanvasPattern': () => CanvasPattern,
+  'CanvasRenderingContext': () => CanvasRenderingContext,
+  'CanvasRenderingContext2D': () => CanvasRenderingContext2D,
+  'CharacterData': () => CharacterData,
+  'ChildNode': () => ChildNode,
+  'ClientRect': () => _ClientRect,
+  'ClientRectList': () => _ClientRectList,
+  'Clipboard': () => DataTransfer,
+  'CloseEvent': () => CloseEvent,
+  'Comment': () => Comment,
+  'CompositionEvent': () => CompositionEvent,
+  'Console': () => Console,
+  'ConsoleBase': () => ConsoleBase,
+  'Coordinates': () => Coordinates,
+  'Counter': () => _Counter,
+  'Crypto': () => Crypto,
+  'CustomEvent': () => CustomEvent,
+  'DOMError': () => DomError,
+  'DOMException': () => DomException,
+  'DOMFileSystem': () => FileSystem,
+  'DOMFileSystemSync': () => _DOMFileSystemSync,
+  'DOMImplementation': () => DomImplementation,
+  'DOMParser': () => DomParser,
+  'DOMSettableTokenList': () => DomSettableTokenList,
+  'DOMStringList': () => DomStringList,
+  'DOMStringMap': () => DomStringMap,
+  'DOMTokenList': () => DomTokenList,
+  'DataTransferItem': () => DataTransferItem,
+  'DataTransferItemList': () => DataTransferItemList,
+  'DatabaseSync': () => _DatabaseSync,
+  'DedicatedWorkerGlobalScope': () => DedicatedWorkerGlobalScope,
+  'DeprecatedStorageInfo': () => DeprecatedStorageInfo,
+  'DeprecatedStorageQuota': () => DeprecatedStorageQuota,
+  'DeviceAcceleration': () => DeviceAcceleration,
+  'DeviceMotionEvent': () => DeviceMotionEvent,
+  'DeviceOrientationEvent': () => DeviceOrientationEvent,
+  'DeviceRotationRate': () => DeviceRotationRate,
+  'DirectoryEntry': () => DirectoryEntry,
+  'DirectoryEntrySync': () => _DirectoryEntrySync,
+  'DirectoryReader': () => DirectoryReader,
+  'DirectoryReaderSync': () => _DirectoryReaderSync,
+  'Document': () => Document,
+  'DocumentFragment': () => DocumentFragment,
+  'DocumentType': () => _DocumentType,
+  'Element': () => Element,
+  'Entry': () => Entry,
+  'EntrySync': () => _EntrySync,
+  'ErrorEvent': () => ErrorEvent,
+  'Event': () => Event,
+  'EventSource': () => EventSource,
+  'EventTarget': () => EventTarget,
+  'File': () => File,
+  'FileEntry': () => FileEntry,
+  'FileEntrySync': () => _FileEntrySync,
+  'FileError': () => FileError,
+  'FileList': () => FileList,
+  'FileReader': () => FileReader,
+  'FileReaderSync': () => _FileReaderSync,
+  'FileWriter': () => FileWriter,
+  'FileWriterSync': () => _FileWriterSync,
+  'FocusEvent': () => FocusEvent,
+  'FontFace': () => FontFace,
+  'FontFaceSet': () => FontFaceSet,
+  'FormData': () => FormData,
+  'Gamepad': () => Gamepad,
+  'GamepadList': () => _GamepadList,
+  'Geolocation': () => Geolocation,
+  'Geoposition': () => Geoposition,
+  'GlobalEventHandlers': () => GlobalEventHandlers,
+  'HTMLAllCollection': () => _HTMLAllCollection,
+  'HTMLAnchorElement': () => AnchorElement,
+  'HTMLAppletElement': () => _HTMLAppletElement,
+  'HTMLAreaElement': () => AreaElement,
+  'HTMLAudioElement': () => AudioElement,
+  'HTMLBRElement': () => BRElement,
+  'HTMLBaseElement': () => BaseElement,
+  'HTMLBodyElement': () => BodyElement,
+  'HTMLButtonElement': () => ButtonElement,
+  'HTMLCanvasElement': () => CanvasElement,
+  'HTMLCollection': () => HtmlCollection,
+  'HTMLContentElement': () => ContentElement,
+  'HTMLDListElement': () => DListElement,
+  'HTMLDataListElement': () => DataListElement,
+  'HTMLDetailsElement': () => DetailsElement,
+  'HTMLDialogElement': () => DialogElement,
+  'HTMLDirectoryElement': () => _HTMLDirectoryElement,
+  'HTMLDivElement': () => DivElement,
+  'HTMLDocument': () => HtmlDocument,
+  'HTMLElement': () => HtmlElement,
+  'HTMLEmbedElement': () => EmbedElement,
+  'HTMLFieldSetElement': () => FieldSetElement,
+  'HTMLFontElement': () => _HTMLFontElement,
+  'HTMLFormControlsCollection': () => HtmlFormControlsCollection,
+  'HTMLFormElement': () => FormElement,
+  'HTMLFrameElement': () => _HTMLFrameElement,
+  'HTMLFrameSetElement': () => _HTMLFrameSetElement,
+  'HTMLHRElement': () => HRElement,
+  'HTMLHeadElement': () => HeadElement,
+  'HTMLHeadingElement': () => HeadingElement,
+  'HTMLHtmlElement': () => HtmlHtmlElement,
+  'HTMLIFrameElement': () => IFrameElement,
+  'HTMLImageElement': () => ImageElement,
+  'HTMLInputElement': () => InputElement,
+  'HTMLKeygenElement': () => KeygenElement,
+  'HTMLLIElement': () => LIElement,
+  'HTMLLabelElement': () => LabelElement,
+  'HTMLLegendElement': () => LegendElement,
+  'HTMLLinkElement': () => LinkElement,
+  'HTMLMapElement': () => MapElement,
+  'HTMLMarqueeElement': () => _HTMLMarqueeElement,
+  'HTMLMediaElement': () => MediaElement,
+  'HTMLMenuElement': () => MenuElement,
+  'HTMLMetaElement': () => MetaElement,
+  'HTMLMeterElement': () => MeterElement,
+  'HTMLModElement': () => ModElement,
+  'HTMLOListElement': () => OListElement,
+  'HTMLObjectElement': () => ObjectElement,
+  'HTMLOptGroupElement': () => OptGroupElement,
+  'HTMLOptionElement': () => OptionElement,
+  'HTMLOptionsCollection': () => HtmlOptionsCollection,
+  'HTMLOutputElement': () => OutputElement,
+  'HTMLParagraphElement': () => ParagraphElement,
+  'HTMLParamElement': () => ParamElement,
+  'HTMLPreElement': () => PreElement,
+  'HTMLProgressElement': () => ProgressElement,
+  'HTMLQuoteElement': () => QuoteElement,
+  'HTMLScriptElement': () => ScriptElement,
+  'HTMLSelectElement': () => SelectElement,
+  'HTMLShadowElement': () => ShadowElement,
+  'HTMLSourceElement': () => SourceElement,
+  'HTMLSpanElement': () => SpanElement,
+  'HTMLStyleElement': () => StyleElement,
+  'HTMLTableCaptionElement': () => TableCaptionElement,
+  'HTMLTableCellElement': () => TableCellElement,
+  'HTMLTableColElement': () => TableColElement,
+  'HTMLTableElement': () => TableElement,
+  'HTMLTableRowElement': () => TableRowElement,
+  'HTMLTableSectionElement': () => TableSectionElement,
+  'HTMLTemplateElement': () => TemplateElement,
+  'HTMLTextAreaElement': () => TextAreaElement,
+  'HTMLTitleElement': () => TitleElement,
+  'HTMLTrackElement': () => TrackElement,
+  'HTMLUListElement': () => UListElement,
+  'HTMLUnknownElement': () => UnknownElement,
+  'HTMLVideoElement': () => VideoElement,
+  'HashChangeEvent': () => HashChangeEvent,
+  'History': () => History,
+  'ImageBitmap': () => ImageBitmap,
+  'ImageData': () => ImageData,
+  'InjectedScriptHost': () => InjectedScriptHost,
+  'InputMethodContext': () => InputMethodContext,
+  'InstallEvent': () => InstallEvent,
+  'InstallPhaseEvent': () => InstallPhaseEvent,
+  'Key': () => CryptoKey,
+  'KeyPair': () => KeyPair,
+  'KeyboardEvent': () => KeyboardEvent,
+  'Location': () => Location,
+  'MIDIAccess': () => MidiAccess,
+  'MIDIAccessPromise': () => MidiAccessPromise,
+  'MIDIConnectionEvent': () => MidiConnectionEvent,
+  'MIDIInput': () => MidiInput,
+  'MIDIMessageEvent': () => MidiMessageEvent,
+  'MIDIOutput': () => MidiOutput,
+  'MIDIPort': () => MidiPort,
+  'MediaController': () => MediaController,
+  'MediaError': () => MediaError,
+  'MediaKeyError': () => MediaKeyError,
+  'MediaKeyEvent': () => MediaKeyEvent,
+  'MediaKeyMessageEvent': () => MediaKeyMessageEvent,
+  'MediaKeyNeededEvent': () => MediaKeyNeededEvent,
+  'MediaKeySession': () => MediaKeySession,
+  'MediaKeys': () => MediaKeys,
+  'MediaList': () => MediaList,
+  'MediaQueryList': () => MediaQueryList,
+  'MediaSource': () => MediaSource,
+  'MediaStream': () => MediaStream,
+  'MediaStreamEvent': () => MediaStreamEvent,
+  'MediaStreamTrack': () => MediaStreamTrack,
+  'MediaStreamTrackEvent': () => MediaStreamTrackEvent,
+  'MemoryInfo': () => MemoryInfo,
+  'MessageChannel': () => MessageChannel,
+  'MessageEvent': () => MessageEvent,
+  'MessagePort': () => MessagePort,
+  'Metadata': () => Metadata,
+  'MimeType': () => MimeType,
+  'MimeTypeArray': () => MimeTypeArray,
+  'MouseEvent': () => MouseEvent,
+  'MutationEvent': () => _MutationEvent,
+  'MutationObserver': () => MutationObserver,
+  'MutationRecord': () => MutationRecord,
+  'NamedNodeMap': () => _NamedNodeMap,
+  'Navigator': () => Navigator,
+  'NavigatorID': () => NavigatorID,
+  'NavigatorOnLine': () => NavigatorOnLine,
+  'NavigatorUserMediaError': () => NavigatorUserMediaError,
+  'Node': () => Node,
+  'NodeFilter': () => NodeFilter,
+  'NodeIterator': () => NodeIterator,
+  'NodeList': () => NodeList,
+  'Notation': () => _Notation,
+  'Notification': () => Notification,
+  'NotificationCenter': () => _NotificationCenter,
+  'OverflowEvent': () => OverflowEvent,
+  'PagePopupController': () => _PagePopupController,
+  'PageTransitionEvent': () => PageTransitionEvent,
+  'ParentNode': () => ParentNode,
+  'Path': () => Path,
+  'Performance': () => Performance,
+  'PerformanceEntry': () => PerformanceEntry,
+  'PerformanceMark': () => PerformanceMark,
+  'PerformanceMeasure': () => PerformanceMeasure,
+  'PerformanceNavigation': () => PerformanceNavigation,
+  'PerformanceResourceTiming': () => PerformanceResourceTiming,
+  'PerformanceTiming': () => PerformanceTiming,
+  'Player': () => Player,
+  'Plugin': () => Plugin,
+  'PluginArray': () => PluginArray,
+  'PopStateEvent': () => PopStateEvent,
+  'PositionError': () => PositionError,
+  'ProcessingInstruction': () => ProcessingInstruction,
+  'ProgressEvent': () => ProgressEvent,
+  'RGBColor': () => _RGBColor,
+  'RTCDTMFSender': () => RtcDtmfSender,
+  'RTCDTMFToneChangeEvent': () => RtcDtmfToneChangeEvent,
+  'RTCDataChannel': () => RtcDataChannel,
+  'RTCDataChannelEvent': () => RtcDataChannelEvent,
+  'RTCIceCandidate': () => RtcIceCandidate,
+  'RTCIceCandidateEvent': () => RtcIceCandidateEvent,
+  'RTCPeerConnection': () => RtcPeerConnection,
+  'RTCSessionDescription': () => RtcSessionDescription,
+  'RTCStatsReport': () => RtcStatsReport,
+  'RTCStatsResponse': () => RtcStatsResponse,
+  'RadioNodeList': () => _RadioNodeList,
+  'Range': () => Range,
+  'Rect': () => _Rect,
+  'ResourceProgressEvent': () => ResourceProgressEvent,
+  'Screen': () => Screen,
+  'SecurityPolicyViolationEvent': () => SecurityPolicyViolationEvent,
+  'Selection': () => Selection,
+  'ServiceWorker': () => _ServiceWorker,
+  'ServiceWorkerContainer': () => ServiceWorkerContainer,
+  'ServiceWorkerGlobalScope': () => ServiceWorkerGlobalScope,
+  'ShadowRoot': () => ShadowRoot,
+  'SharedWorker': () => SharedWorker,
+  'SharedWorkerGlobalScope': () => SharedWorkerGlobalScope,
+  'SourceBuffer': () => SourceBuffer,
+  'SourceBufferList': () => SourceBufferList,
+  'SourceInfo': () => SourceInfo,
+  'SpeechGrammar': () => SpeechGrammar,
+  'SpeechGrammarList': () => SpeechGrammarList,
+  'SpeechInputEvent': () => SpeechInputEvent,
+  'SpeechInputResult': () => SpeechInputResult,
+  'SpeechInputResultList': () => _SpeechInputResultList,
+  'SpeechRecognition': () => SpeechRecognition,
+  'SpeechRecognitionAlternative': () => SpeechRecognitionAlternative,
+  'SpeechRecognitionError': () => SpeechRecognitionError,
+  'SpeechRecognitionEvent': () => SpeechRecognitionEvent,
+  'SpeechRecognitionResult': () => SpeechRecognitionResult,
+  'SpeechRecognitionResultList': () => _SpeechRecognitionResultList,
+  'SpeechSynthesis': () => SpeechSynthesis,
+  'SpeechSynthesisEvent': () => SpeechSynthesisEvent,
+  'SpeechSynthesisUtterance': () => SpeechSynthesisUtterance,
+  'SpeechSynthesisVoice': () => SpeechSynthesisVoice,
+  'Storage': () => Storage,
+  'StorageEvent': () => StorageEvent,
+  'StorageInfo': () => StorageInfo,
+  'StorageQuota': () => StorageQuota,
+  'Stream': () => FileStream,
+  'StyleMedia': () => StyleMedia,
+  'StyleSheet': () => StyleSheet,
+  'StyleSheetList': () => _StyleSheetList,
+  'SubtleCrypto': () => _SubtleCrypto,
+  'Text': () => Text,
+  'TextEvent': () => TextEvent,
+  'TextMetrics': () => TextMetrics,
+  'TextTrack': () => TextTrack,
+  'TextTrackCue': () => TextTrackCue,
+  'TextTrackCueList': () => TextTrackCueList,
+  'TextTrackList': () => TextTrackList,
+  'TimeRanges': () => TimeRanges,
+  'TimedItem': () => TimedItem,
+  'Timeline': () => Timeline,
+  'Timing': () => Timing,
+  'Touch': () => Touch,
+  'TouchEvent': () => TouchEvent,
+  'TouchList': () => TouchList,
+  'TrackEvent': () => TrackEvent,
+  'TransitionEvent': () => TransitionEvent,
+  'TreeWalker': () => TreeWalker,
+  'UIEvent': () => UIEvent,
+  'URL': () => Url,
+  'URLUtils': () => UrlUtils,
+  'URLUtilsReadOnly': () => UrlUtilsReadOnly,
+  'VTTCue': () => VttCue,
+  'VTTRegion': () => VttRegion,
+  'VTTRegionList': () => VttRegionList,
+  'ValidityState': () => ValidityState,
+  'VideoPlaybackQuality': () => VideoPlaybackQuality,
+  'WebKitAnimationEvent': () => AnimationEvent,
+  'WebKitCSSFilterRule': () => CssFilterRule,
+  'WebKitCSSFilterValue': () => _WebKitCSSFilterValue,
+  'WebKitCSSMatrix': () => _WebKitCSSMatrix,
+  'WebKitCSSTransformValue': () => _WebKitCSSTransformValue,
+  'WebKitMediaSource': () => _WebKitMediaSource,
+  'WebKitNotification': () => _WebKitNotification,
+  'WebKitPoint': () => _DomPoint,
+  'WebKitSourceBuffer': () => _WebKitSourceBuffer,
+  'WebKitSourceBufferList': () => _WebKitSourceBufferList,
+  'WebSocket': () => WebSocket,
+  'WheelEvent': () => WheelEvent,
+  'Window': () => Window,
+  'WindowBase64': () => WindowBase64,
+  'WindowEventHandlers': () => WindowEventHandlers,
+  'WindowTimers': () => _WindowTimers,
+  'Worker': () => Worker,
+  'WorkerConsole': () => WorkerConsole,
+  'WorkerCrypto': () => WorkerCrypto,
+  'WorkerGlobalScope': () => WorkerGlobalScope,
+  'WorkerLocation': () => _WorkerLocation,
+  'WorkerNavigator': () => _WorkerNavigator,
+  'WorkerPerformance': () => WorkerPerformance,
+  'XMLDocument': () => XmlDocument,
+  'XMLHttpRequest': () => HttpRequest,
+  'XMLHttpRequestEventTarget': () => HttpRequestEventTarget,
+  'XMLHttpRequestProgressEvent': () => _XMLHttpRequestProgressEvent,
+  'XMLHttpRequestUpload': () => HttpRequestUpload,
+  'XMLSerializer': () => XmlSerializer,
+  'XPathEvaluator': () => XPathEvaluator,
+  'XPathExpression': () => XPathExpression,
+  'XPathNSResolver': () => XPathNSResolver,
+  '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,
+  '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
@@ -532,7 +532,7 @@
   @DomName('Algorithm.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.Native_Algorithm_name_Getter(this);
+  String get name => _blink.BlinkAlgorithm.$name_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -564,137 +564,137 @@
 
   @DomName('HTMLAnchorElement.download')
   @DocsEditable()
-  String get download => _blink.Native_HTMLAnchorElement_download_Getter(this);
+  String get download => _blink.BlinkHTMLAnchorElement.$download_Getter(this);
 
   @DomName('HTMLAnchorElement.download')
   @DocsEditable()
-  void set download(String value) => _blink.Native_HTMLAnchorElement_download_Setter(this, value);
+  void set download(String value) => _blink.BlinkHTMLAnchorElement.$download_Setter(this, value);
 
   @DomName('HTMLAnchorElement.hreflang')
   @DocsEditable()
-  String get hreflang => _blink.Native_HTMLAnchorElement_hreflang_Getter(this);
+  String get hreflang => _blink.BlinkHTMLAnchorElement.$hreflang_Getter(this);
 
   @DomName('HTMLAnchorElement.hreflang')
   @DocsEditable()
-  void set hreflang(String value) => _blink.Native_HTMLAnchorElement_hreflang_Setter(this, value);
+  void set hreflang(String value) => _blink.BlinkHTMLAnchorElement.$hreflang_Setter(this, value);
 
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
-  String get rel => _blink.Native_HTMLAnchorElement_rel_Getter(this);
+  String get rel => _blink.BlinkHTMLAnchorElement.$rel_Getter(this);
 
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
-  void set rel(String value) => _blink.Native_HTMLAnchorElement_rel_Setter(this, value);
+  void set rel(String value) => _blink.BlinkHTMLAnchorElement.$rel_Setter(this, value);
 
   @DomName('HTMLAnchorElement.target')
   @DocsEditable()
-  String get target => _blink.Native_HTMLAnchorElement_target_Getter(this);
+  String get target => _blink.BlinkHTMLAnchorElement.$target_Getter(this);
 
   @DomName('HTMLAnchorElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.Native_HTMLAnchorElement_target_Setter(this, value);
+  void set target(String value) => _blink.BlinkHTMLAnchorElement.$target_Setter(this, value);
 
   @DomName('HTMLAnchorElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLAnchorElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLAnchorElement.$type_Getter(this);
 
   @DomName('HTMLAnchorElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLAnchorElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLAnchorElement.$type_Setter(this, value);
 
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
-  String get hash => _blink.Native_HTMLAnchorElement_hash_Getter(this);
+  String get hash => _blink.BlinkHTMLAnchorElement.$hash_Getter(this);
 
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
-  void set hash(String value) => _blink.Native_HTMLAnchorElement_hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkHTMLAnchorElement.$hash_Setter(this, value);
 
   @DomName('HTMLAnchorElement.host')
   @DocsEditable()
-  String get host => _blink.Native_HTMLAnchorElement_host_Getter(this);
+  String get host => _blink.BlinkHTMLAnchorElement.$host_Getter(this);
 
   @DomName('HTMLAnchorElement.host')
   @DocsEditable()
-  void set host(String value) => _blink.Native_HTMLAnchorElement_host_Setter(this, value);
+  void set host(String value) => _blink.BlinkHTMLAnchorElement.$host_Setter(this, value);
 
   @DomName('HTMLAnchorElement.hostname')
   @DocsEditable()
-  String get hostname => _blink.Native_HTMLAnchorElement_hostname_Getter(this);
+  String get hostname => _blink.BlinkHTMLAnchorElement.$hostname_Getter(this);
 
   @DomName('HTMLAnchorElement.hostname')
   @DocsEditable()
-  void set hostname(String value) => _blink.Native_HTMLAnchorElement_hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkHTMLAnchorElement.$hostname_Setter(this, value);
 
   @DomName('HTMLAnchorElement.href')
   @DocsEditable()
-  String get href => _blink.Native_HTMLAnchorElement_href_Getter(this);
+  String get href => _blink.BlinkHTMLAnchorElement.$href_Getter(this);
 
   @DomName('HTMLAnchorElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.Native_HTMLAnchorElement_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkHTMLAnchorElement.$href_Setter(this, value);
 
   @DomName('HTMLAnchorElement.origin')
   @DocsEditable()
   // WebKit only
   @Experimental() // non-standard
-  String get origin => _blink.Native_HTMLAnchorElement_origin_Getter(this);
+  String get origin => _blink.BlinkHTMLAnchorElement.$origin_Getter(this);
 
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.Native_HTMLAnchorElement_password_Getter(this);
+  String get password => _blink.BlinkHTMLAnchorElement.$password_Getter(this);
 
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.Native_HTMLAnchorElement_password_Setter(this, value);
+  void set password(String value) => _blink.BlinkHTMLAnchorElement.$password_Setter(this, value);
 
   @DomName('HTMLAnchorElement.pathname')
   @DocsEditable()
-  String get pathname => _blink.Native_HTMLAnchorElement_pathname_Getter(this);
+  String get pathname => _blink.BlinkHTMLAnchorElement.$pathname_Getter(this);
 
   @DomName('HTMLAnchorElement.pathname')
   @DocsEditable()
-  void set pathname(String value) => _blink.Native_HTMLAnchorElement_pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkHTMLAnchorElement.$pathname_Setter(this, value);
 
   @DomName('HTMLAnchorElement.port')
   @DocsEditable()
-  String get port => _blink.Native_HTMLAnchorElement_port_Getter(this);
+  String get port => _blink.BlinkHTMLAnchorElement.$port_Getter(this);
 
   @DomName('HTMLAnchorElement.port')
   @DocsEditable()
-  void set port(String value) => _blink.Native_HTMLAnchorElement_port_Setter(this, value);
+  void set port(String value) => _blink.BlinkHTMLAnchorElement.$port_Setter(this, value);
 
   @DomName('HTMLAnchorElement.protocol')
   @DocsEditable()
-  String get protocol => _blink.Native_HTMLAnchorElement_protocol_Getter(this);
+  String get protocol => _blink.BlinkHTMLAnchorElement.$protocol_Getter(this);
 
   @DomName('HTMLAnchorElement.protocol')
   @DocsEditable()
-  void set protocol(String value) => _blink.Native_HTMLAnchorElement_protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkHTMLAnchorElement.$protocol_Setter(this, value);
 
   @DomName('HTMLAnchorElement.search')
   @DocsEditable()
-  String get search => _blink.Native_HTMLAnchorElement_search_Getter(this);
+  String get search => _blink.BlinkHTMLAnchorElement.$search_Getter(this);
 
   @DomName('HTMLAnchorElement.search')
   @DocsEditable()
-  void set search(String value) => _blink.Native_HTMLAnchorElement_search_Setter(this, value);
+  void set search(String value) => _blink.BlinkHTMLAnchorElement.$search_Setter(this, value);
 
   @DomName('HTMLAnchorElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.Native_HTMLAnchorElement_username_Getter(this);
+  String get username => _blink.BlinkHTMLAnchorElement.$username_Getter(this);
 
   @DomName('HTMLAnchorElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.Native_HTMLAnchorElement_username_Setter(this, value);
+  void set username(String value) => _blink.BlinkHTMLAnchorElement.$username_Setter(this, value);
 
   @DomName('HTMLAnchorElement.toString')
   @DocsEditable()
-  String toString() => _blink.Native_HTMLAnchorElement_toString_Callback(this);
+  String toString() => _blink.BlinkHTMLAnchorElement.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -713,7 +713,7 @@
 
   @DomName('Animation.Animation')
   @DocsEditable()
-  factory Animation(Element target, List<Map> keyframes, [timingInput]) => _blink.Native_Animation_Animation(target, keyframes, timingInput);
+  factory Animation(Element target, List<Map> keyframes, [timingInput]) => _blink.BlinkAnimation.$mkAnimation(target, keyframes, timingInput);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -734,11 +734,11 @@
 
   @DomName('WebKitAnimationEvent.animationName')
   @DocsEditable()
-  String get animationName => _blink.Native_WebKitAnimationEvent_animationName_Getter(this);
+  String get animationName => _blink.BlinkWebKitAnimationEvent.$animationName_Getter(this);
 
   @DomName('WebKitAnimationEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime => _blink.Native_WebKitAnimationEvent_elapsedTime_Getter(this);
+  double get elapsedTime => _blink.BlinkWebKitAnimationEvent.$elapsedTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -869,19 +869,19 @@
 
   @DomName('ApplicationCache.status')
   @DocsEditable()
-  int get status => _blink.Native_ApplicationCache_status_Getter(this);
+  int get status => _blink.BlinkApplicationCache.$status_Getter(this);
 
   @DomName('ApplicationCache.abort')
   @DocsEditable()
-  void abort() => _blink.Native_ApplicationCache_abort_Callback(this);
+  void abort() => _blink.BlinkApplicationCache.$abort_Callback(this);
 
   @DomName('ApplicationCache.swapCache')
   @DocsEditable()
-  void swapCache() => _blink.Native_ApplicationCache_swapCache_Callback(this);
+  void swapCache() => _blink.BlinkApplicationCache.$swapCache_Callback(this);
 
   @DomName('ApplicationCache.update')
   @DocsEditable()
-  void update() => _blink.Native_ApplicationCache_update_Callback(this);
+  void update() => _blink.BlinkApplicationCache.$update_Callback(this);
 
   /// Stream of `cached` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.oncached')
@@ -959,129 +959,129 @@
 
   @DomName('HTMLAreaElement.alt')
   @DocsEditable()
-  String get alt => _blink.Native_HTMLAreaElement_alt_Getter(this);
+  String get alt => _blink.BlinkHTMLAreaElement.$alt_Getter(this);
 
   @DomName('HTMLAreaElement.alt')
   @DocsEditable()
-  void set alt(String value) => _blink.Native_HTMLAreaElement_alt_Setter(this, value);
+  void set alt(String value) => _blink.BlinkHTMLAreaElement.$alt_Setter(this, value);
 
   @DomName('HTMLAreaElement.coords')
   @DocsEditable()
-  String get coords => _blink.Native_HTMLAreaElement_coords_Getter(this);
+  String get coords => _blink.BlinkHTMLAreaElement.$coords_Getter(this);
 
   @DomName('HTMLAreaElement.coords')
   @DocsEditable()
-  void set coords(String value) => _blink.Native_HTMLAreaElement_coords_Setter(this, value);
+  void set coords(String value) => _blink.BlinkHTMLAreaElement.$coords_Setter(this, value);
 
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
-  String get shape => _blink.Native_HTMLAreaElement_shape_Getter(this);
+  String get shape => _blink.BlinkHTMLAreaElement.$shape_Getter(this);
 
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
-  void set shape(String value) => _blink.Native_HTMLAreaElement_shape_Setter(this, value);
+  void set shape(String value) => _blink.BlinkHTMLAreaElement.$shape_Setter(this, value);
 
   @DomName('HTMLAreaElement.target')
   @DocsEditable()
-  String get target => _blink.Native_HTMLAreaElement_target_Getter(this);
+  String get target => _blink.BlinkHTMLAreaElement.$target_Getter(this);
 
   @DomName('HTMLAreaElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.Native_HTMLAreaElement_target_Setter(this, value);
+  void set target(String value) => _blink.BlinkHTMLAreaElement.$target_Setter(this, value);
 
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
-  String get hash => _blink.Native_HTMLAreaElement_hash_Getter(this);
+  String get hash => _blink.BlinkHTMLAreaElement.$hash_Getter(this);
 
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
-  void set hash(String value) => _blink.Native_HTMLAreaElement_hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkHTMLAreaElement.$hash_Setter(this, value);
 
   @DomName('HTMLAreaElement.host')
   @DocsEditable()
-  String get host => _blink.Native_HTMLAreaElement_host_Getter(this);
+  String get host => _blink.BlinkHTMLAreaElement.$host_Getter(this);
 
   @DomName('HTMLAreaElement.host')
   @DocsEditable()
-  void set host(String value) => _blink.Native_HTMLAreaElement_host_Setter(this, value);
+  void set host(String value) => _blink.BlinkHTMLAreaElement.$host_Setter(this, value);
 
   @DomName('HTMLAreaElement.hostname')
   @DocsEditable()
-  String get hostname => _blink.Native_HTMLAreaElement_hostname_Getter(this);
+  String get hostname => _blink.BlinkHTMLAreaElement.$hostname_Getter(this);
 
   @DomName('HTMLAreaElement.hostname')
   @DocsEditable()
-  void set hostname(String value) => _blink.Native_HTMLAreaElement_hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkHTMLAreaElement.$hostname_Setter(this, value);
 
   @DomName('HTMLAreaElement.href')
   @DocsEditable()
-  String get href => _blink.Native_HTMLAreaElement_href_Getter(this);
+  String get href => _blink.BlinkHTMLAreaElement.$href_Getter(this);
 
   @DomName('HTMLAreaElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.Native_HTMLAreaElement_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkHTMLAreaElement.$href_Setter(this, value);
 
   @DomName('HTMLAreaElement.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.Native_HTMLAreaElement_origin_Getter(this);
+  String get origin => _blink.BlinkHTMLAreaElement.$origin_Getter(this);
 
   @DomName('HTMLAreaElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.Native_HTMLAreaElement_password_Getter(this);
+  String get password => _blink.BlinkHTMLAreaElement.$password_Getter(this);
 
   @DomName('HTMLAreaElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.Native_HTMLAreaElement_password_Setter(this, value);
+  void set password(String value) => _blink.BlinkHTMLAreaElement.$password_Setter(this, value);
 
   @DomName('HTMLAreaElement.pathname')
   @DocsEditable()
-  String get pathname => _blink.Native_HTMLAreaElement_pathname_Getter(this);
+  String get pathname => _blink.BlinkHTMLAreaElement.$pathname_Getter(this);
 
   @DomName('HTMLAreaElement.pathname')
   @DocsEditable()
-  void set pathname(String value) => _blink.Native_HTMLAreaElement_pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkHTMLAreaElement.$pathname_Setter(this, value);
 
   @DomName('HTMLAreaElement.port')
   @DocsEditable()
-  String get port => _blink.Native_HTMLAreaElement_port_Getter(this);
+  String get port => _blink.BlinkHTMLAreaElement.$port_Getter(this);
 
   @DomName('HTMLAreaElement.port')
   @DocsEditable()
-  void set port(String value) => _blink.Native_HTMLAreaElement_port_Setter(this, value);
+  void set port(String value) => _blink.BlinkHTMLAreaElement.$port_Setter(this, value);
 
   @DomName('HTMLAreaElement.protocol')
   @DocsEditable()
-  String get protocol => _blink.Native_HTMLAreaElement_protocol_Getter(this);
+  String get protocol => _blink.BlinkHTMLAreaElement.$protocol_Getter(this);
 
   @DomName('HTMLAreaElement.protocol')
   @DocsEditable()
-  void set protocol(String value) => _blink.Native_HTMLAreaElement_protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkHTMLAreaElement.$protocol_Setter(this, value);
 
   @DomName('HTMLAreaElement.search')
   @DocsEditable()
-  String get search => _blink.Native_HTMLAreaElement_search_Getter(this);
+  String get search => _blink.BlinkHTMLAreaElement.$search_Getter(this);
 
   @DomName('HTMLAreaElement.search')
   @DocsEditable()
-  void set search(String value) => _blink.Native_HTMLAreaElement_search_Setter(this, value);
+  void set search(String value) => _blink.BlinkHTMLAreaElement.$search_Setter(this, value);
 
   @DomName('HTMLAreaElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.Native_HTMLAreaElement_username_Getter(this);
+  String get username => _blink.BlinkHTMLAreaElement.$username_Getter(this);
 
   @DomName('HTMLAreaElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.Native_HTMLAreaElement_username_Setter(this, value);
+  void set username(String value) => _blink.BlinkHTMLAreaElement.$username_Setter(this, value);
 
   @DomName('HTMLAreaElement.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.Native_HTMLAreaElement_toString_Callback(this);
+  String toString() => _blink.BlinkHTMLAreaElement.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1099,7 +1099,7 @@
 
   @DomName('HTMLAudioElement.HTMLAudioElement')
   @DocsEditable()
-  factory AudioElement([String src]) => _blink.Native_HTMLAudioElement_AudioElement(src);
+  factory AudioElement([String src]) => _blink.BlinkHTMLAudioElement.$mkAudioElement(src);
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1125,7 +1125,7 @@
 
   @DomName('AutocompleteErrorEvent.reason')
   @DocsEditable()
-  String get reason => _blink.Native_AutocompleteErrorEvent_reason_Getter(this);
+  String get reason => _blink.BlinkAutocompleteErrorEvent.$reason_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1169,7 +1169,7 @@
 
   @DomName('BarProp.visible')
   @DocsEditable()
-  bool get visible => _blink.Native_BarProp_visible_Getter(this);
+  bool get visible => _blink.BlinkBarProp.$visible_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1197,19 +1197,19 @@
 
   @DomName('HTMLBaseElement.href')
   @DocsEditable()
-  String get href => _blink.Native_HTMLBaseElement_href_Getter(this);
+  String get href => _blink.BlinkHTMLBaseElement.$href_Getter(this);
 
   @DomName('HTMLBaseElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.Native_HTMLBaseElement_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkHTMLBaseElement.$href_Setter(this, value);
 
   @DomName('HTMLBaseElement.target')
   @DocsEditable()
-  String get target => _blink.Native_HTMLBaseElement_target_Getter(this);
+  String get target => _blink.BlinkHTMLBaseElement.$target_Getter(this);
 
   @DomName('HTMLBaseElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.Native_HTMLBaseElement_target_Setter(this, value);
+  void set target(String value) => _blink.BlinkHTMLBaseElement.$target_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1242,11 +1242,11 @@
 
   @DomName('BeforeUnloadEvent.returnValue')
   @DocsEditable()
-  String get returnValue => _blink.Native_BeforeUnloadEvent_returnValue_Getter(this);
+  String get returnValue => _blink.BlinkBeforeUnloadEvent.$returnValue_Getter(this);
 
   @DomName('BeforeUnloadEvent.returnValue')
   @DocsEditable()
-  void set returnValue(String value) => _blink.Native_BeforeUnloadEvent_returnValue_Setter(this, value);
+  void set returnValue(String value) => _blink.BlinkBeforeUnloadEvent.$returnValue_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1264,17 +1264,17 @@
   factory Blob(List blobParts, [String type, String endings]) => _create(blobParts, type, endings);
 
   @DocsEditable()
-  static Blob _create(blobParts, type, endings) => _blink.Native_Blob_constructorCallback(blobParts, type, endings);
+  static Blob _create(blobParts, type, endings) => _blink.BlinkBlob.$constructorCallback(blobParts, type, endings);
 
   @DomName('Blob.size')
   @DocsEditable()
-  int get size => _blink.Native_Blob_size_Getter(this);
+  int get size => _blink.BlinkBlob.$size_Getter(this);
 
   @DomName('Blob.type')
   @DocsEditable()
-  String get type => _blink.Native_Blob_type_Getter(this);
+  String get type => _blink.BlinkBlob.$type_Getter(this);
 
-  Blob slice([int start, int end, String contentType]) => _blink.Native_Blob_slice(this, start, end, contentType);
+  Blob slice([int start, int end, String contentType]) => _blink.BlinkBlob.$slice(this, start, end, contentType);
 
 }
 
@@ -1517,112 +1517,112 @@
 
   @DomName('HTMLButtonElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.Native_HTMLButtonElement_autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLButtonElement.$autofocus_Getter(this);
 
   @DomName('HTMLButtonElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.Native_HTMLButtonElement_autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLButtonElement.$autofocus_Setter(this, value);
 
   @DomName('HTMLButtonElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLButtonElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLButtonElement.$disabled_Getter(this);
 
   @DomName('HTMLButtonElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLButtonElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLButtonElement.$disabled_Setter(this, value);
 
   @DomName('HTMLButtonElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLButtonElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLButtonElement.$form_Getter(this);
 
   @DomName('HTMLButtonElement.formAction')
   @DocsEditable()
-  String get formAction => _blink.Native_HTMLButtonElement_formAction_Getter(this);
+  String get formAction => _blink.BlinkHTMLButtonElement.$formAction_Getter(this);
 
   @DomName('HTMLButtonElement.formAction')
   @DocsEditable()
-  void set formAction(String value) => _blink.Native_HTMLButtonElement_formAction_Setter(this, value);
+  void set formAction(String value) => _blink.BlinkHTMLButtonElement.$formAction_Setter(this, value);
 
   @DomName('HTMLButtonElement.formEnctype')
   @DocsEditable()
-  String get formEnctype => _blink.Native_HTMLButtonElement_formEnctype_Getter(this);
+  String get formEnctype => _blink.BlinkHTMLButtonElement.$formEnctype_Getter(this);
 
   @DomName('HTMLButtonElement.formEnctype')
   @DocsEditable()
-  void set formEnctype(String value) => _blink.Native_HTMLButtonElement_formEnctype_Setter(this, value);
+  void set formEnctype(String value) => _blink.BlinkHTMLButtonElement.$formEnctype_Setter(this, value);
 
   @DomName('HTMLButtonElement.formMethod')
   @DocsEditable()
-  String get formMethod => _blink.Native_HTMLButtonElement_formMethod_Getter(this);
+  String get formMethod => _blink.BlinkHTMLButtonElement.$formMethod_Getter(this);
 
   @DomName('HTMLButtonElement.formMethod')
   @DocsEditable()
-  void set formMethod(String value) => _blink.Native_HTMLButtonElement_formMethod_Setter(this, value);
+  void set formMethod(String value) => _blink.BlinkHTMLButtonElement.$formMethod_Setter(this, value);
 
   @DomName('HTMLButtonElement.formNoValidate')
   @DocsEditable()
-  bool get formNoValidate => _blink.Native_HTMLButtonElement_formNoValidate_Getter(this);
+  bool get formNoValidate => _blink.BlinkHTMLButtonElement.$formNoValidate_Getter(this);
 
   @DomName('HTMLButtonElement.formNoValidate')
   @DocsEditable()
-  void set formNoValidate(bool value) => _blink.Native_HTMLButtonElement_formNoValidate_Setter(this, value);
+  void set formNoValidate(bool value) => _blink.BlinkHTMLButtonElement.$formNoValidate_Setter(this, value);
 
   @DomName('HTMLButtonElement.formTarget')
   @DocsEditable()
-  String get formTarget => _blink.Native_HTMLButtonElement_formTarget_Getter(this);
+  String get formTarget => _blink.BlinkHTMLButtonElement.$formTarget_Getter(this);
 
   @DomName('HTMLButtonElement.formTarget')
   @DocsEditable()
-  void set formTarget(String value) => _blink.Native_HTMLButtonElement_formTarget_Setter(this, value);
+  void set formTarget(String value) => _blink.BlinkHTMLButtonElement.$formTarget_Setter(this, value);
 
   @DomName('HTMLButtonElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLButtonElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLButtonElement.$labels_Getter(this);
 
   @DomName('HTMLButtonElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLButtonElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLButtonElement.$name_Getter(this);
 
   @DomName('HTMLButtonElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLButtonElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLButtonElement.$name_Setter(this, value);
 
   @DomName('HTMLButtonElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLButtonElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLButtonElement.$type_Getter(this);
 
   @DomName('HTMLButtonElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLButtonElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLButtonElement.$type_Setter(this, value);
 
   @DomName('HTMLButtonElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLButtonElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLButtonElement.$validationMessage_Getter(this);
 
   @DomName('HTMLButtonElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLButtonElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLButtonElement.$validity_Getter(this);
 
   @DomName('HTMLButtonElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLButtonElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLButtonElement.$value_Getter(this);
 
   @DomName('HTMLButtonElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLButtonElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLButtonElement.$value_Setter(this, value);
 
   @DomName('HTMLButtonElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLButtonElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLButtonElement.$willValidate_Getter(this);
 
   @DomName('HTMLButtonElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLButtonElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLButtonElement.$checkValidity_Callback(this);
 
   @DomName('HTMLButtonElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLButtonElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLButtonElement.$setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1658,11 +1658,11 @@
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable()
-  bool get alpha => _blink.Native_Canvas2DContextAttributes_alpha_Getter(this);
+  bool get alpha => _blink.BlinkCanvas2DContextAttributes.$alpha_Getter(this);
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable()
-  void set alpha(bool value) => _blink.Native_Canvas2DContextAttributes_alpha_Setter(this, value);
+  void set alpha(bool value) => _blink.BlinkCanvas2DContextAttributes.$alpha_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1713,30 +1713,30 @@
   /// The height of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.height')
   @DocsEditable()
-  int get height => _blink.Native_HTMLCanvasElement_height_Getter(this);
+  int get height => _blink.BlinkHTMLCanvasElement.$height_Getter(this);
 
   /// The height of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.Native_HTMLCanvasElement_height_Setter(this, value);
+  void set height(int value) => _blink.BlinkHTMLCanvasElement.$height_Setter(this, value);
 
   /// The width of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.width')
   @DocsEditable()
-  int get width => _blink.Native_HTMLCanvasElement_width_Getter(this);
+  int get width => _blink.BlinkHTMLCanvasElement.$width_Getter(this);
 
   /// The width of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.Native_HTMLCanvasElement_width_Setter(this, value);
+  void set width(int value) => _blink.BlinkHTMLCanvasElement.$width_Setter(this, value);
 
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
-  CanvasRenderingContext getContext(String contextId, [Map attrs]) => _blink.Native_HTMLCanvasElement_getContext_Callback(this, contextId, attrs);
+  CanvasRenderingContext getContext(String contextId, [Map attrs]) => _blink.BlinkHTMLCanvasElement.$getContext_Callback(this, contextId, attrs);
 
   @DomName('HTMLCanvasElement.toDataURL')
   @DocsEditable()
-  String _toDataUrl(String type, [num quality]) => _blink.Native_HTMLCanvasElement_toDataURL_Callback(this, type, quality);
+  String _toDataUrl(String type, [num quality]) => _blink.BlinkHTMLCanvasElement.$toDataURL_Callback(this, type, quality);
 
   /// Stream of `webglcontextlost` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextlost')
@@ -1879,7 +1879,7 @@
    */
   @DomName('CanvasGradient.addColorStop')
   @DocsEditable()
-  void addColorStop(num offset, String color) => _blink.Native_CanvasGradient_addColorStop_Callback(this, offset, color);
+  void addColorStop(num offset, String color) => _blink.BlinkCanvasGradient.$addColorStop_Callback(this, offset, color);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1945,7 +1945,7 @@
   /// Reference to the canvas element to which this context belongs.
   @DomName('CanvasRenderingContext.canvas')
   @DocsEditable()
-  CanvasElement get canvas => _blink.Native_CanvasRenderingContext_canvas_Getter(this);
+  CanvasElement get canvas => _blink.BlinkCanvasRenderingContext.$canvas_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1961,44 +1961,44 @@
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix get currentTransform => _blink.Native_CanvasRenderingContext2D_currentTransform_Getter(this);
+  Matrix get currentTransform => _blink.BlinkCanvasRenderingContext2D.$currentTransform_Getter(this);
 
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void set currentTransform(Matrix value) => _blink.Native_CanvasRenderingContext2D_currentTransform_Setter(this, value);
+  void set currentTransform(Matrix value) => _blink.BlinkCanvasRenderingContext2D.$currentTransform_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.fillStyle')
   @DocsEditable()
-  Object get fillStyle => _blink.Native_CanvasRenderingContext2D_fillStyle_Getter(this);
+  Object get fillStyle => _blink.BlinkCanvasRenderingContext2D.$fillStyle_Getter(this);
 
   @DomName('CanvasRenderingContext2D.fillStyle')
   @DocsEditable()
-  void set fillStyle(Object value) => _blink.Native_CanvasRenderingContext2D_fillStyle_Setter(this, value);
+  void set fillStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.$fillStyle_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
-  String get font => _blink.Native_CanvasRenderingContext2D_font_Getter(this);
+  String get font => _blink.BlinkCanvasRenderingContext2D.$font_Getter(this);
 
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
-  void set font(String value) => _blink.Native_CanvasRenderingContext2D_font_Setter(this, value);
+  void set font(String value) => _blink.BlinkCanvasRenderingContext2D.$font_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.globalAlpha')
   @DocsEditable()
-  num get globalAlpha => _blink.Native_CanvasRenderingContext2D_globalAlpha_Getter(this);
+  num get globalAlpha => _blink.BlinkCanvasRenderingContext2D.$globalAlpha_Getter(this);
 
   @DomName('CanvasRenderingContext2D.globalAlpha')
   @DocsEditable()
-  void set globalAlpha(num value) => _blink.Native_CanvasRenderingContext2D_globalAlpha_Setter(this, value);
+  void set globalAlpha(num value) => _blink.BlinkCanvasRenderingContext2D.$globalAlpha_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   @DocsEditable()
-  String get globalCompositeOperation => _blink.Native_CanvasRenderingContext2D_globalCompositeOperation_Getter(this);
+  String get globalCompositeOperation => _blink.BlinkCanvasRenderingContext2D.$globalCompositeOperation_Getter(this);
 
   @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   @DocsEditable()
-  void set globalCompositeOperation(String value) => _blink.Native_CanvasRenderingContext2D_globalCompositeOperation_Setter(this, value);
+  void set globalCompositeOperation(String value) => _blink.BlinkCanvasRenderingContext2D.$globalCompositeOperation_Setter(this, value);
 
   /**
    * Whether images and patterns on this canvas will be smoothed when this
@@ -2013,7 +2013,7 @@
   @DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get imageSmoothingEnabled => _blink.Native_CanvasRenderingContext2D_imageSmoothingEnabled_Getter(this);
+  bool get imageSmoothingEnabled => _blink.BlinkCanvasRenderingContext2D.$imageSmoothingEnabled_Getter(this);
 
   /**
    * Whether images and patterns on this canvas will be smoothed when this
@@ -2028,262 +2028,262 @@
   @DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  void set imageSmoothingEnabled(bool value) => _blink.Native_CanvasRenderingContext2D_imageSmoothingEnabled_Setter(this, value);
+  void set imageSmoothingEnabled(bool value) => _blink.BlinkCanvasRenderingContext2D.$imageSmoothingEnabled_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.lineCap')
   @DocsEditable()
-  String get lineCap => _blink.Native_CanvasRenderingContext2D_lineCap_Getter(this);
+  String get lineCap => _blink.BlinkCanvasRenderingContext2D.$lineCap_Getter(this);
 
   @DomName('CanvasRenderingContext2D.lineCap')
   @DocsEditable()
-  void set lineCap(String value) => _blink.Native_CanvasRenderingContext2D_lineCap_Setter(this, value);
+  void set lineCap(String value) => _blink.BlinkCanvasRenderingContext2D.$lineCap_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   @DocsEditable()
-  num get lineDashOffset => _blink.Native_CanvasRenderingContext2D_lineDashOffset_Getter(this);
+  num get lineDashOffset => _blink.BlinkCanvasRenderingContext2D.$lineDashOffset_Getter(this);
 
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   @DocsEditable()
-  void set lineDashOffset(num value) => _blink.Native_CanvasRenderingContext2D_lineDashOffset_Setter(this, value);
+  void set lineDashOffset(num value) => _blink.BlinkCanvasRenderingContext2D.$lineDashOffset_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.lineJoin')
   @DocsEditable()
-  String get lineJoin => _blink.Native_CanvasRenderingContext2D_lineJoin_Getter(this);
+  String get lineJoin => _blink.BlinkCanvasRenderingContext2D.$lineJoin_Getter(this);
 
   @DomName('CanvasRenderingContext2D.lineJoin')
   @DocsEditable()
-  void set lineJoin(String value) => _blink.Native_CanvasRenderingContext2D_lineJoin_Setter(this, value);
+  void set lineJoin(String value) => _blink.BlinkCanvasRenderingContext2D.$lineJoin_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.lineWidth')
   @DocsEditable()
-  num get lineWidth => _blink.Native_CanvasRenderingContext2D_lineWidth_Getter(this);
+  num get lineWidth => _blink.BlinkCanvasRenderingContext2D.$lineWidth_Getter(this);
 
   @DomName('CanvasRenderingContext2D.lineWidth')
   @DocsEditable()
-  void set lineWidth(num value) => _blink.Native_CanvasRenderingContext2D_lineWidth_Setter(this, value);
+  void set lineWidth(num value) => _blink.BlinkCanvasRenderingContext2D.$lineWidth_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.miterLimit')
   @DocsEditable()
-  num get miterLimit => _blink.Native_CanvasRenderingContext2D_miterLimit_Getter(this);
+  num get miterLimit => _blink.BlinkCanvasRenderingContext2D.$miterLimit_Getter(this);
 
   @DomName('CanvasRenderingContext2D.miterLimit')
   @DocsEditable()
-  void set miterLimit(num value) => _blink.Native_CanvasRenderingContext2D_miterLimit_Setter(this, value);
+  void set miterLimit(num value) => _blink.BlinkCanvasRenderingContext2D.$miterLimit_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowBlur')
   @DocsEditable()
-  num get shadowBlur => _blink.Native_CanvasRenderingContext2D_shadowBlur_Getter(this);
+  num get shadowBlur => _blink.BlinkCanvasRenderingContext2D.$shadowBlur_Getter(this);
 
   @DomName('CanvasRenderingContext2D.shadowBlur')
   @DocsEditable()
-  void set shadowBlur(num value) => _blink.Native_CanvasRenderingContext2D_shadowBlur_Setter(this, value);
+  void set shadowBlur(num value) => _blink.BlinkCanvasRenderingContext2D.$shadowBlur_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowColor')
   @DocsEditable()
-  String get shadowColor => _blink.Native_CanvasRenderingContext2D_shadowColor_Getter(this);
+  String get shadowColor => _blink.BlinkCanvasRenderingContext2D.$shadowColor_Getter(this);
 
   @DomName('CanvasRenderingContext2D.shadowColor')
   @DocsEditable()
-  void set shadowColor(String value) => _blink.Native_CanvasRenderingContext2D_shadowColor_Setter(this, value);
+  void set shadowColor(String value) => _blink.BlinkCanvasRenderingContext2D.$shadowColor_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetX')
   @DocsEditable()
-  num get shadowOffsetX => _blink.Native_CanvasRenderingContext2D_shadowOffsetX_Getter(this);
+  num get shadowOffsetX => _blink.BlinkCanvasRenderingContext2D.$shadowOffsetX_Getter(this);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetX')
   @DocsEditable()
-  void set shadowOffsetX(num value) => _blink.Native_CanvasRenderingContext2D_shadowOffsetX_Setter(this, value);
+  void set shadowOffsetX(num value) => _blink.BlinkCanvasRenderingContext2D.$shadowOffsetX_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetY')
   @DocsEditable()
-  num get shadowOffsetY => _blink.Native_CanvasRenderingContext2D_shadowOffsetY_Getter(this);
+  num get shadowOffsetY => _blink.BlinkCanvasRenderingContext2D.$shadowOffsetY_Getter(this);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetY')
   @DocsEditable()
-  void set shadowOffsetY(num value) => _blink.Native_CanvasRenderingContext2D_shadowOffsetY_Setter(this, value);
+  void set shadowOffsetY(num value) => _blink.BlinkCanvasRenderingContext2D.$shadowOffsetY_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.strokeStyle')
   @DocsEditable()
-  Object get strokeStyle => _blink.Native_CanvasRenderingContext2D_strokeStyle_Getter(this);
+  Object get strokeStyle => _blink.BlinkCanvasRenderingContext2D.$strokeStyle_Getter(this);
 
   @DomName('CanvasRenderingContext2D.strokeStyle')
   @DocsEditable()
-  void set strokeStyle(Object value) => _blink.Native_CanvasRenderingContext2D_strokeStyle_Setter(this, value);
+  void set strokeStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.$strokeStyle_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.textAlign')
   @DocsEditable()
-  String get textAlign => _blink.Native_CanvasRenderingContext2D_textAlign_Getter(this);
+  String get textAlign => _blink.BlinkCanvasRenderingContext2D.$textAlign_Getter(this);
 
   @DomName('CanvasRenderingContext2D.textAlign')
   @DocsEditable()
-  void set textAlign(String value) => _blink.Native_CanvasRenderingContext2D_textAlign_Setter(this, value);
+  void set textAlign(String value) => _blink.BlinkCanvasRenderingContext2D.$textAlign_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.textBaseline')
   @DocsEditable()
-  String get textBaseline => _blink.Native_CanvasRenderingContext2D_textBaseline_Getter(this);
+  String get textBaseline => _blink.BlinkCanvasRenderingContext2D.$textBaseline_Getter(this);
 
   @DomName('CanvasRenderingContext2D.textBaseline')
   @DocsEditable()
-  void set textBaseline(String value) => _blink.Native_CanvasRenderingContext2D_textBaseline_Setter(this, value);
+  void set textBaseline(String value) => _blink.BlinkCanvasRenderingContext2D.$textBaseline_Setter(this, value);
 
   @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);
+  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.$arc_Callback(this, x, y, radius, startAngle, endAngle, anticlockwise);
 
   @DomName('CanvasRenderingContext2D.arcTo')
   @DocsEditable()
-  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.Native_CanvasRenderingContext2D_arcTo_Callback(this, x1, y1, x2, y2, radius);
+  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkCanvasRenderingContext2D.$arcTo_Callback(this, x1, y1, x2, y2, radius);
 
   @DomName('CanvasRenderingContext2D.beginPath')
   @DocsEditable()
-  void beginPath() => _blink.Native_CanvasRenderingContext2D_beginPath_Callback(this);
+  void beginPath() => _blink.BlinkCanvasRenderingContext2D.$beginPath_Callback(this);
 
   @DomName('CanvasRenderingContext2D.bezierCurveTo')
   @DocsEditable()
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.Native_CanvasRenderingContext2D_bezierCurveTo_Callback(this, cp1x, cp1y, cp2x, cp2y, x, y);
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkCanvasRenderingContext2D.$bezierCurveTo_Callback(this, cp1x, cp1y, cp2x, cp2y, x, y);
 
   @DomName('CanvasRenderingContext2D.clearRect')
   @DocsEditable()
-  void clearRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_clearRect_Callback(this, x, y, width, height);
+  void clearRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.$clearRect_Callback(this, x, y, width, height);
 
-  void clip([String winding]) => _blink.Native_CanvasRenderingContext2D_clip(this, winding);
+  void clip([String winding]) => _blink.BlinkCanvasRenderingContext2D.$clip(this, winding);
 
   @DomName('CanvasRenderingContext2D.closePath')
   @DocsEditable()
-  void closePath() => _blink.Native_CanvasRenderingContext2D_closePath_Callback(this);
+  void closePath() => _blink.BlinkCanvasRenderingContext2D.$closePath_Callback(this);
 
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
-  ImageData createImageData(num sw, num sh) => _blink.Native_CanvasRenderingContext2D_createImageData_Callback(this, sw, sh);
+  ImageData createImageData(num sw, num sh) => _blink.BlinkCanvasRenderingContext2D.$createImageData_Callback(this, sw, sh);
 
   @DomName('CanvasRenderingContext2D.createImageDataFromImageData')
   @DocsEditable()
-  ImageData createImageDataFromImageData(ImageData imagedata) => _blink.Native_CanvasRenderingContext2D_createImageDataFromImageData_Callback(this, imagedata);
+  ImageData createImageDataFromImageData(ImageData imagedata) => _blink.BlinkCanvasRenderingContext2D.$createImageDataFromImageData_Callback(this, imagedata);
 
   @DomName('CanvasRenderingContext2D.createLinearGradient')
   @DocsEditable()
-  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) => _blink.Native_CanvasRenderingContext2D_createLinearGradient_Callback(this, x0, y0, x1, y1);
+  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) => _blink.BlinkCanvasRenderingContext2D.$createLinearGradient_Callback(this, x0, y0, x1, y1);
 
   @DomName('CanvasRenderingContext2D.createPattern')
   @DocsEditable()
-  CanvasPattern createPattern(CanvasElement canvas, String repetitionType) => _blink.Native_CanvasRenderingContext2D_createPattern_Callback(this, canvas, repetitionType);
+  CanvasPattern createPattern(CanvasElement canvas, String repetitionType) => _blink.BlinkCanvasRenderingContext2D.$createPattern_Callback(this, canvas, repetitionType);
 
   @DomName('CanvasRenderingContext2D.createPatternFromImage')
   @DocsEditable()
-  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) => _blink.Native_CanvasRenderingContext2D_createPatternFromImage_Callback(this, image, repetitionType);
+  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) => _blink.BlinkCanvasRenderingContext2D.$createPatternFromImage_Callback(this, image, repetitionType);
 
   @DomName('CanvasRenderingContext2D.createRadialGradient')
   @DocsEditable()
-  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) => _blink.Native_CanvasRenderingContext2D_createRadialGradient_Callback(this, x0, y0, r0, x1, y1, r1);
+  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) => _blink.BlinkCanvasRenderingContext2D.$createRadialGradient_Callback(this, x0, y0, r0, x1, y1, r1);
 
   @DomName('CanvasRenderingContext2D.drawCustomFocusRing')
   @DocsEditable()
   @Experimental() // untriaged
-  bool drawCustomFocusRing(Element element) => _blink.Native_CanvasRenderingContext2D_drawCustomFocusRing_Callback(this, element);
+  bool drawCustomFocusRing(Element element) => _blink.BlinkCanvasRenderingContext2D.$drawCustomFocusRing_Callback(this, element);
 
-  void _drawImage(canvas_OR_image_OR_imageBitmap_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) => _blink.Native_CanvasRenderingContext2D__drawImage(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+  void _drawImage(canvas_OR_image_OR_imageBitmap_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) => _blink.BlinkCanvasRenderingContext2D.$_drawImage(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
 
   @DomName('CanvasRenderingContext2D.ellipse')
   @DocsEditable()
   @Experimental() // untriaged
-  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.Native_CanvasRenderingContext2D_ellipse_Callback(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.$ellipse_Callback(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
 
-  void fill([String winding]) => _blink.Native_CanvasRenderingContext2D_fill(this, winding);
+  void fill([String winding]) => _blink.BlinkCanvasRenderingContext2D.$fill(this, winding);
 
   @DomName('CanvasRenderingContext2D.fillRect')
   @DocsEditable()
-  void fillRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_fillRect_Callback(this, x, y, width, height);
+  void fillRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.$fillRect_Callback(this, x, y, width, height);
 
-  void fillText(String text, num x, num y, [num maxWidth]) => _blink.Native_CanvasRenderingContext2D_fillText(this, text, x, y, maxWidth);
+  void fillText(String text, num x, num y, [num maxWidth]) => _blink.BlinkCanvasRenderingContext2D.$fillText(this, text, x, y, maxWidth);
 
   @DomName('CanvasRenderingContext2D.getContextAttributes')
   @DocsEditable()
   // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
   @Experimental()
-  Canvas2DContextAttributes getContextAttributes() => _blink.Native_CanvasRenderingContext2D_getContextAttributes_Callback(this);
+  Canvas2DContextAttributes getContextAttributes() => _blink.BlinkCanvasRenderingContext2D.$getContextAttributes_Callback(this);
 
   @DomName('CanvasRenderingContext2D.getImageData')
   @DocsEditable()
-  ImageData getImageData(num sx, num sy, num sw, num sh) => _blink.Native_CanvasRenderingContext2D_getImageData_Callback(this, sx, sy, sw, sh);
+  ImageData getImageData(num sx, num sy, num sw, num sh) => _blink.BlinkCanvasRenderingContext2D.$getImageData_Callback(this, sx, sy, sw, sh);
 
   @DomName('CanvasRenderingContext2D.getLineDash')
   @DocsEditable()
-  List<num> _getLineDash() => _blink.Native_CanvasRenderingContext2D_getLineDash_Callback(this);
+  List<num> _getLineDash() => _blink.BlinkCanvasRenderingContext2D.$getLineDash_Callback(this);
 
-  bool isPointInPath(num x, num y, [String winding]) => _blink.Native_CanvasRenderingContext2D_isPointInPath(this, x, y, winding);
+  bool isPointInPath(num x, num y, [String winding]) => _blink.BlinkCanvasRenderingContext2D.$isPointInPath(this, x, y, winding);
 
   @DomName('CanvasRenderingContext2D.isPointInStroke')
   @DocsEditable()
-  bool isPointInStroke(num x, num y) => _blink.Native_CanvasRenderingContext2D_isPointInStroke_Callback(this, x, y);
+  bool isPointInStroke(num x, num y) => _blink.BlinkCanvasRenderingContext2D.$isPointInStroke_Callback(this, x, y);
 
   @DomName('CanvasRenderingContext2D.lineTo')
   @DocsEditable()
-  void lineTo(num x, num y) => _blink.Native_CanvasRenderingContext2D_lineTo_Callback(this, x, y);
+  void lineTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.$lineTo_Callback(this, x, y);
 
   @DomName('CanvasRenderingContext2D.measureText')
   @DocsEditable()
-  TextMetrics measureText(String text) => _blink.Native_CanvasRenderingContext2D_measureText_Callback(this, text);
+  TextMetrics measureText(String text) => _blink.BlinkCanvasRenderingContext2D.$measureText_Callback(this, text);
 
   @DomName('CanvasRenderingContext2D.moveTo')
   @DocsEditable()
-  void moveTo(num x, num y) => _blink.Native_CanvasRenderingContext2D_moveTo_Callback(this, x, y);
+  void moveTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.$moveTo_Callback(this, x, y);
 
-  void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) => _blink.Native_CanvasRenderingContext2D_putImageData(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+  void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) => _blink.BlinkCanvasRenderingContext2D.$putImageData(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
 
   @DomName('CanvasRenderingContext2D.quadraticCurveTo')
   @DocsEditable()
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.Native_CanvasRenderingContext2D_quadraticCurveTo_Callback(this, cpx, cpy, x, y);
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkCanvasRenderingContext2D.$quadraticCurveTo_Callback(this, cpx, cpy, x, y);
 
   @DomName('CanvasRenderingContext2D.rect')
   @DocsEditable()
-  void rect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_rect_Callback(this, x, y, width, height);
+  void rect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.$rect_Callback(this, x, y, width, height);
 
   @DomName('CanvasRenderingContext2D.resetTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void resetTransform() => _blink.Native_CanvasRenderingContext2D_resetTransform_Callback(this);
+  void resetTransform() => _blink.BlinkCanvasRenderingContext2D.$resetTransform_Callback(this);
 
   @DomName('CanvasRenderingContext2D.restore')
   @DocsEditable()
-  void restore() => _blink.Native_CanvasRenderingContext2D_restore_Callback(this);
+  void restore() => _blink.BlinkCanvasRenderingContext2D.$restore_Callback(this);
 
   @DomName('CanvasRenderingContext2D.rotate')
   @DocsEditable()
-  void rotate(num angle) => _blink.Native_CanvasRenderingContext2D_rotate_Callback(this, angle);
+  void rotate(num angle) => _blink.BlinkCanvasRenderingContext2D.$rotate_Callback(this, angle);
 
   @DomName('CanvasRenderingContext2D.save')
   @DocsEditable()
-  void save() => _blink.Native_CanvasRenderingContext2D_save_Callback(this);
+  void save() => _blink.BlinkCanvasRenderingContext2D.$save_Callback(this);
 
   @DomName('CanvasRenderingContext2D.scale')
   @DocsEditable()
-  void scale(num sx, num sy) => _blink.Native_CanvasRenderingContext2D_scale_Callback(this, sx, sy);
+  void scale(num sx, num sy) => _blink.BlinkCanvasRenderingContext2D.$scale_Callback(this, sx, sy);
 
   @DomName('CanvasRenderingContext2D.setLineDash')
   @DocsEditable()
-  void setLineDash(List<num> dash) => _blink.Native_CanvasRenderingContext2D_setLineDash_Callback(this, dash);
+  void setLineDash(List<num> dash) => _blink.BlinkCanvasRenderingContext2D.$setLineDash_Callback(this, dash);
 
   @DomName('CanvasRenderingContext2D.setTransform')
   @DocsEditable()
-  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) => _blink.Native_CanvasRenderingContext2D_setTransform_Callback(this, m11, m12, m21, m22, dx, dy);
+  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) => _blink.BlinkCanvasRenderingContext2D.$setTransform_Callback(this, m11, m12, m21, m22, dx, dy);
 
   @DomName('CanvasRenderingContext2D.stroke')
   @DocsEditable()
-  void stroke() => _blink.Native_CanvasRenderingContext2D_stroke_Callback(this);
+  void stroke() => _blink.BlinkCanvasRenderingContext2D.$stroke_Callback(this);
 
   @DomName('CanvasRenderingContext2D.strokeRect')
   @DocsEditable()
-  void strokeRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_strokeRect_Callback(this, x, y, width, height);
+  void strokeRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.$strokeRect_Callback(this, x, y, width, height);
 
-  void strokeText(String text, num x, num y, [num maxWidth]) => _blink.Native_CanvasRenderingContext2D_strokeText(this, text, x, y, maxWidth);
+  void strokeText(String text, num x, num y, [num maxWidth]) => _blink.BlinkCanvasRenderingContext2D.$strokeText(this, text, x, y, maxWidth);
 
   @DomName('CanvasRenderingContext2D.transform')
   @DocsEditable()
-  void transform(num m11, num m12, num m21, num m22, num dx, num dy) => _blink.Native_CanvasRenderingContext2D_transform_Callback(this, m11, m12, m21, m22, dx, dy);
+  void transform(num m11, num m12, num m21, num m22, num dx, num dy) => _blink.BlinkCanvasRenderingContext2D.$transform_Callback(this, m11, m12, m21, m22, dx, dy);
 
   @DomName('CanvasRenderingContext2D.translate')
   @DocsEditable()
-  void translate(num tx, num ty) => _blink.Native_CanvasRenderingContext2D_translate_Callback(this, tx, ty);
+  void translate(num tx, num ty) => _blink.BlinkCanvasRenderingContext2D.$translate_Callback(this, tx, ty);
 
 
   /**
@@ -2535,43 +2535,43 @@
 
   @DomName('CharacterData.data')
   @DocsEditable()
-  String get data => _blink.Native_CharacterData_data_Getter(this);
+  String get data => _blink.BlinkCharacterData.$data_Getter(this);
 
   @DomName('CharacterData.data')
   @DocsEditable()
-  void set data(String value) => _blink.Native_CharacterData_data_Setter(this, value);
+  void set data(String value) => _blink.BlinkCharacterData.$data_Setter(this, value);
 
   @DomName('CharacterData.length')
   @DocsEditable()
-  int get length => _blink.Native_CharacterData_length_Getter(this);
+  int get length => _blink.BlinkCharacterData.$length_Getter(this);
 
   @DomName('CharacterData.appendData')
   @DocsEditable()
-  void appendData(String data) => _blink.Native_CharacterData_appendData_Callback(this, data);
+  void appendData(String data) => _blink.BlinkCharacterData.$appendData_Callback(this, data);
 
   @DomName('CharacterData.deleteData')
   @DocsEditable()
-  void deleteData(int offset, int length) => _blink.Native_CharacterData_deleteData_Callback(this, offset, length);
+  void deleteData(int offset, int length) => _blink.BlinkCharacterData.$deleteData_Callback(this, offset, length);
 
   @DomName('CharacterData.insertData')
   @DocsEditable()
-  void insertData(int offset, String data) => _blink.Native_CharacterData_insertData_Callback(this, offset, data);
+  void insertData(int offset, String data) => _blink.BlinkCharacterData.$insertData_Callback(this, offset, data);
 
   @DomName('CharacterData.replaceData')
   @DocsEditable()
-  void replaceData(int offset, int length, String data) => _blink.Native_CharacterData_replaceData_Callback(this, offset, length, data);
+  void replaceData(int offset, int length, String data) => _blink.BlinkCharacterData.$replaceData_Callback(this, offset, length, data);
 
   @DomName('CharacterData.substringData')
   @DocsEditable()
-  String substringData(int offset, int length) => _blink.Native_CharacterData_substringData_Callback(this, offset, length);
+  String substringData(int offset, int length) => _blink.BlinkCharacterData.$substringData_Callback(this, offset, length);
 
   @DomName('CharacterData.nextElementSibling')
   @DocsEditable()
-  Element get nextElementSibling => _blink.Native_CharacterData_nextElementSibling_Getter(this);
+  Element get nextElementSibling => _blink.BlinkCharacterData.$nextElementSibling_Getter(this);
 
   @DomName('CharacterData.previousElementSibling')
   @DocsEditable()
-  Element get previousElementSibling => _blink.Native_CharacterData_previousElementSibling_Getter(this);
+  Element get previousElementSibling => _blink.BlinkCharacterData.$previousElementSibling_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2591,17 +2591,17 @@
   @DomName('ChildNode.nextElementSibling')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get nextElementSibling => _blink.Native_ChildNode_nextElementSibling_Getter(this);
+  Element get nextElementSibling => _blink.BlinkChildNode.$nextElementSibling_Getter(this);
 
   @DomName('ChildNode.previousElementSibling')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get previousElementSibling => _blink.Native_ChildNode_previousElementSibling_Getter(this);
+  Element get previousElementSibling => _blink.BlinkChildNode.$previousElementSibling_Getter(this);
 
   @DomName('ChildNode.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove() => _blink.Native_ChildNode_remove_Callback(this);
+  void remove() => _blink.BlinkChildNode.$remove_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2619,15 +2619,15 @@
 
   @DomName('CloseEvent.code')
   @DocsEditable()
-  int get code => _blink.Native_CloseEvent_code_Getter(this);
+  int get code => _blink.BlinkCloseEvent.$code_Getter(this);
 
   @DomName('CloseEvent.reason')
   @DocsEditable()
-  String get reason => _blink.Native_CloseEvent_reason_Getter(this);
+  String get reason => _blink.BlinkCloseEvent.$reason_Getter(this);
 
   @DomName('CloseEvent.wasClean')
   @DocsEditable()
-  bool get wasClean => _blink.Native_CloseEvent_wasClean_Getter(this);
+  bool get wasClean => _blink.BlinkCloseEvent.$wasClean_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2643,7 +2643,7 @@
 
   @DomName('Comment.Comment')
   @DocsEditable()
-  factory Comment([String data]) => _blink.Native_Comment_Comment(data);
+  factory Comment([String data]) => _blink.BlinkComment.$mkComment(data);
 }
 // 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
@@ -2670,20 +2670,20 @@
   @DomName('CompositionEvent.activeSegmentEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  int get activeSegmentEnd => _blink.Native_CompositionEvent_activeSegmentEnd_Getter(this);
+  int get activeSegmentEnd => _blink.BlinkCompositionEvent.$activeSegmentEnd_Getter(this);
 
   @DomName('CompositionEvent.activeSegmentStart')
   @DocsEditable()
   @Experimental() // untriaged
-  int get activeSegmentStart => _blink.Native_CompositionEvent_activeSegmentStart_Getter(this);
+  int get activeSegmentStart => _blink.BlinkCompositionEvent.$activeSegmentStart_Getter(this);
 
   @DomName('CompositionEvent.data')
   @DocsEditable()
-  String get data => _blink.Native_CompositionEvent_data_Getter(this);
+  String get data => _blink.BlinkCompositionEvent.$data_Getter(this);
 
   @DomName('CompositionEvent.initCompositionEvent')
   @DocsEditable()
-  void _initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.Native_CompositionEvent_initCompositionEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
+  void _initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.BlinkCompositionEvent.$initCompositionEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2702,7 +2702,7 @@
   @DomName('Console.memory')
   @DocsEditable()
   @Experimental()
-  MemoryInfo get memory => _blink.Native_Console_memory_Getter(this);
+  MemoryInfo get memory => _blink.BlinkConsole.$memory_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2722,117 +2722,117 @@
   @DomName('ConsoleBase.assertCondition')
   @DocsEditable()
   @Experimental() // untriaged
-  void assertCondition(bool condition, Object arg) => _blink.Native_ConsoleBase_assertCondition_Callback(this, condition, arg);
+  void assertCondition(bool condition, Object arg) => _blink.BlinkConsoleBase.$assertCondition_Callback(this, condition, arg);
 
   @DomName('ConsoleBase.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  void clear(Object arg) => _blink.Native_ConsoleBase_clear_Callback(this, arg);
+  void clear(Object arg) => _blink.BlinkConsoleBase.$clear_Callback(this, arg);
 
   @DomName('ConsoleBase.count')
   @DocsEditable()
   @Experimental() // untriaged
-  void count(Object arg) => _blink.Native_ConsoleBase_count_Callback(this, arg);
+  void count(Object arg) => _blink.BlinkConsoleBase.$count_Callback(this, arg);
 
   @DomName('ConsoleBase.debug')
   @DocsEditable()
   @Experimental() // untriaged
-  void debug(Object arg) => _blink.Native_ConsoleBase_debug_Callback(this, arg);
+  void debug(Object arg) => _blink.BlinkConsoleBase.$debug_Callback(this, arg);
 
   @DomName('ConsoleBase.dir')
   @DocsEditable()
   @Experimental() // untriaged
-  void dir(Object arg) => _blink.Native_ConsoleBase_dir_Callback(this, arg);
+  void dir(Object arg) => _blink.BlinkConsoleBase.$dir_Callback(this, arg);
 
   @DomName('ConsoleBase.dirxml')
   @DocsEditable()
   @Experimental() // untriaged
-  void dirxml(Object arg) => _blink.Native_ConsoleBase_dirxml_Callback(this, arg);
+  void dirxml(Object arg) => _blink.BlinkConsoleBase.$dirxml_Callback(this, arg);
 
   @DomName('ConsoleBase.error')
   @DocsEditable()
   @Experimental() // untriaged
-  void error(Object arg) => _blink.Native_ConsoleBase_error_Callback(this, arg);
+  void error(Object arg) => _blink.BlinkConsoleBase.$error_Callback(this, arg);
 
   @DomName('ConsoleBase.group')
   @DocsEditable()
   @Experimental() // untriaged
-  void group(Object arg) => _blink.Native_ConsoleBase_group_Callback(this, arg);
+  void group(Object arg) => _blink.BlinkConsoleBase.$group_Callback(this, arg);
 
   @DomName('ConsoleBase.groupCollapsed')
   @DocsEditable()
   @Experimental() // untriaged
-  void groupCollapsed(Object arg) => _blink.Native_ConsoleBase_groupCollapsed_Callback(this, arg);
+  void groupCollapsed(Object arg) => _blink.BlinkConsoleBase.$groupCollapsed_Callback(this, arg);
 
   @DomName('ConsoleBase.groupEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void groupEnd() => _blink.Native_ConsoleBase_groupEnd_Callback(this);
+  void groupEnd() => _blink.BlinkConsoleBase.$groupEnd_Callback(this);
 
   @DomName('ConsoleBase.info')
   @DocsEditable()
   @Experimental() // untriaged
-  void info(Object arg) => _blink.Native_ConsoleBase_info_Callback(this, arg);
+  void info(Object arg) => _blink.BlinkConsoleBase.$info_Callback(this, arg);
 
   @DomName('ConsoleBase.log')
   @DocsEditable()
   @Experimental() // untriaged
-  void log(Object arg) => _blink.Native_ConsoleBase_log_Callback(this, arg);
+  void log(Object arg) => _blink.BlinkConsoleBase.$log_Callback(this, arg);
 
   @DomName('ConsoleBase.markTimeline')
   @DocsEditable()
   @Experimental() // untriaged
-  void markTimeline(String title) => _blink.Native_ConsoleBase_markTimeline_Callback(this, title);
+  void markTimeline(String title) => _blink.BlinkConsoleBase.$markTimeline_Callback(this, title);
 
   @DomName('ConsoleBase.profile')
   @DocsEditable()
   @Experimental() // untriaged
-  void profile(String title) => _blink.Native_ConsoleBase_profile_Callback(this, title);
+  void profile(String title) => _blink.BlinkConsoleBase.$profile_Callback(this, title);
 
   @DomName('ConsoleBase.profileEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void profileEnd(String title) => _blink.Native_ConsoleBase_profileEnd_Callback(this, title);
+  void profileEnd(String title) => _blink.BlinkConsoleBase.$profileEnd_Callback(this, title);
 
   @DomName('ConsoleBase.table')
   @DocsEditable()
   @Experimental() // untriaged
-  void table(Object arg) => _blink.Native_ConsoleBase_table_Callback(this, arg);
+  void table(Object arg) => _blink.BlinkConsoleBase.$table_Callback(this, arg);
 
   @DomName('ConsoleBase.time')
   @DocsEditable()
   @Experimental() // untriaged
-  void time(String title) => _blink.Native_ConsoleBase_time_Callback(this, title);
+  void time(String title) => _blink.BlinkConsoleBase.$time_Callback(this, title);
 
   @DomName('ConsoleBase.timeEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeEnd(String title) => _blink.Native_ConsoleBase_timeEnd_Callback(this, title);
+  void timeEnd(String title) => _blink.BlinkConsoleBase.$timeEnd_Callback(this, title);
 
   @DomName('ConsoleBase.timeStamp')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeStamp(String title) => _blink.Native_ConsoleBase_timeStamp_Callback(this, title);
+  void timeStamp(String title) => _blink.BlinkConsoleBase.$timeStamp_Callback(this, title);
 
   @DomName('ConsoleBase.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeline(String title) => _blink.Native_ConsoleBase_timeline_Callback(this, title);
+  void timeline(String title) => _blink.BlinkConsoleBase.$timeline_Callback(this, title);
 
   @DomName('ConsoleBase.timelineEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void timelineEnd(String title) => _blink.Native_ConsoleBase_timelineEnd_Callback(this, title);
+  void timelineEnd(String title) => _blink.BlinkConsoleBase.$timelineEnd_Callback(this, title);
 
   @DomName('ConsoleBase.trace')
   @DocsEditable()
   @Experimental() // untriaged
-  void trace(Object arg) => _blink.Native_ConsoleBase_trace_Callback(this, arg);
+  void trace(Object arg) => _blink.BlinkConsoleBase.$trace_Callback(this, arg);
 
   @DomName('ConsoleBase.warn')
   @DocsEditable()
   @Experimental() // untriaged
-  void warn(Object arg) => _blink.Native_ConsoleBase_warn_Callback(this, arg);
+  void warn(Object arg) => _blink.BlinkConsoleBase.$warn_Callback(this, arg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2866,23 +2866,23 @@
 
   @DomName('HTMLContentElement.resetStyleInheritance')
   @DocsEditable()
-  bool get resetStyleInheritance => _blink.Native_HTMLContentElement_resetStyleInheritance_Getter(this);
+  bool get resetStyleInheritance => _blink.BlinkHTMLContentElement.$resetStyleInheritance_Getter(this);
 
   @DomName('HTMLContentElement.resetStyleInheritance')
   @DocsEditable()
-  void set resetStyleInheritance(bool value) => _blink.Native_HTMLContentElement_resetStyleInheritance_Setter(this, value);
+  void set resetStyleInheritance(bool value) => _blink.BlinkHTMLContentElement.$resetStyleInheritance_Setter(this, value);
 
   @DomName('HTMLContentElement.select')
   @DocsEditable()
-  String get select => _blink.Native_HTMLContentElement_select_Getter(this);
+  String get select => _blink.BlinkHTMLContentElement.$select_Getter(this);
 
   @DomName('HTMLContentElement.select')
   @DocsEditable()
-  void set select(String value) => _blink.Native_HTMLContentElement_select_Setter(this, value);
+  void set select(String value) => _blink.BlinkHTMLContentElement.$select_Setter(this, value);
 
   @DomName('HTMLContentElement.getDistributedNodes')
   @DocsEditable()
-  List<Node> getDistributedNodes() => _blink.Native_HTMLContentElement_getDistributedNodes_Callback(this);
+  List<Node> getDistributedNodes() => _blink.BlinkHTMLContentElement.$getDistributedNodes_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2900,31 +2900,31 @@
 
   @DomName('Coordinates.accuracy')
   @DocsEditable()
-  double get accuracy => _blink.Native_Coordinates_accuracy_Getter(this);
+  double get accuracy => _blink.BlinkCoordinates.$accuracy_Getter(this);
 
   @DomName('Coordinates.altitude')
   @DocsEditable()
-  double get altitude => _blink.Native_Coordinates_altitude_Getter(this);
+  double get altitude => _blink.BlinkCoordinates.$altitude_Getter(this);
 
   @DomName('Coordinates.altitudeAccuracy')
   @DocsEditable()
-  double get altitudeAccuracy => _blink.Native_Coordinates_altitudeAccuracy_Getter(this);
+  double get altitudeAccuracy => _blink.BlinkCoordinates.$altitudeAccuracy_Getter(this);
 
   @DomName('Coordinates.heading')
   @DocsEditable()
-  double get heading => _blink.Native_Coordinates_heading_Getter(this);
+  double get heading => _blink.BlinkCoordinates.$heading_Getter(this);
 
   @DomName('Coordinates.latitude')
   @DocsEditable()
-  double get latitude => _blink.Native_Coordinates_latitude_Getter(this);
+  double get latitude => _blink.BlinkCoordinates.$latitude_Getter(this);
 
   @DomName('Coordinates.longitude')
   @DocsEditable()
-  double get longitude => _blink.Native_Coordinates_longitude_Getter(this);
+  double get longitude => _blink.BlinkCoordinates.$longitude_Getter(this);
 
   @DomName('Coordinates.speed')
   @DocsEditable()
-  double get speed => _blink.Native_Coordinates_speed_Getter(this);
+  double get speed => _blink.BlinkCoordinates.$speed_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2950,11 +2950,11 @@
   @DomName('Crypto.subtle')
   @DocsEditable()
   @Experimental() // untriaged
-  _SubtleCrypto get subtle => _blink.Native_Crypto_subtle_Getter(this);
+  _SubtleCrypto get subtle => _blink.BlinkCrypto.$subtle_Getter(this);
 
   @DomName('Crypto.getRandomValues')
   @DocsEditable()
-  TypedData getRandomValues(TypedData array) => _blink.Native_Crypto_getRandomValues_Callback(this, array);
+  TypedData getRandomValues(TypedData array) => _blink.BlinkCrypto.$getRandomValues_Callback(this, array);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2974,22 +2974,22 @@
   @DomName('Key.algorithm')
   @DocsEditable()
   @Experimental() // untriaged
-  Algorithm get algorithm => _blink.Native_Key_algorithm_Getter(this);
+  Algorithm get algorithm => _blink.BlinkKey.$algorithm_Getter(this);
 
   @DomName('Key.extractable')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get extractable => _blink.Native_Key_extractable_Getter(this);
+  bool get extractable => _blink.BlinkKey.$extractable_Getter(this);
 
   @DomName('Key.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.Native_Key_type_Getter(this);
+  String get type => _blink.BlinkKey.$type_Getter(this);
 
   @DomName('Key.usages')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get usages => _blink.Native_Key_usages_Getter(this);
+  List<String> get usages => _blink.BlinkKey.$usages_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3009,11 +3009,11 @@
 
   @DomName('CSS.supports')
   @DocsEditable()
-  bool supports(String property, String value) => _blink.Native_CSS_supports_Callback(this, property, value);
+  bool supports(String property, String value) => _blink.BlinkCSS.$supports_Callback(this, property, value);
 
   @DomName('CSS.supportsCondition')
   @DocsEditable()
-  bool supportsCondition(String conditionText) => _blink.Native_CSS_supportsCondition_Callback(this, conditionText);
+  bool supportsCondition(String conditionText) => _blink.BlinkCSS.$supportsCondition_Callback(this, conditionText);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3033,11 +3033,11 @@
 
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
-  String get encoding => _blink.Native_CSSCharsetRule_encoding_Getter(this);
+  String get encoding => _blink.BlinkCSSCharsetRule.$encoding_Getter(this);
 
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
-  void set encoding(String value) => _blink.Native_CSSCharsetRule_encoding_Setter(this, value);
+  void set encoding(String value) => _blink.BlinkCSSCharsetRule.$encoding_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3059,7 +3059,7 @@
 
   @DomName('WebKitCSSFilterRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.Native_WebKitCSSFilterRule_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkWebKitCSSFilterRule.$style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3080,7 +3080,7 @@
   @DomName('CSSFontFaceLoadEvent.fontfaces')
   @DocsEditable()
   @Experimental() // untriaged
-  List<FontFace> get fontfaces => _blink.Native_CSSFontFaceLoadEvent_fontfaces_Getter(this);
+  List<FontFace> get fontfaces => _blink.BlinkCSSFontFaceLoadEvent.$fontfaces_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3098,7 +3098,7 @@
 
   @DomName('CSSFontFaceRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.Native_CSSFontFaceRule_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSFontFaceRule.$style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3116,15 +3116,15 @@
 
   @DomName('CSSImportRule.href')
   @DocsEditable()
-  String get href => _blink.Native_CSSImportRule_href_Getter(this);
+  String get href => _blink.BlinkCSSImportRule.$href_Getter(this);
 
   @DomName('CSSImportRule.media')
   @DocsEditable()
-  MediaList get media => _blink.Native_CSSImportRule_media_Getter(this);
+  MediaList get media => _blink.BlinkCSSImportRule.$media_Getter(this);
 
   @DomName('CSSImportRule.styleSheet')
   @DocsEditable()
-  CssStyleSheet get styleSheet => _blink.Native_CSSImportRule_styleSheet_Getter(this);
+  CssStyleSheet get styleSheet => _blink.BlinkCSSImportRule.$styleSheet_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3144,17 +3144,17 @@
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
   @Experimental() // untriaged
-  String get keyText => _blink.Native_CSSKeyframeRule_keyText_Getter(this);
+  String get keyText => _blink.BlinkCSSKeyframeRule.$keyText_Getter(this);
 
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
   @Experimental() // untriaged
-  void set keyText(String value) => _blink.Native_CSSKeyframeRule_keyText_Setter(this, value);
+  void set keyText(String value) => _blink.BlinkCSSKeyframeRule.$keyText_Setter(this, value);
 
   @DomName('CSSKeyframeRule.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => _blink.Native_CSSKeyframeRule_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSKeyframeRule.$style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3174,37 +3174,37 @@
   @DomName('CSSKeyframesRule.cssRules')
   @DocsEditable()
   @Experimental() // untriaged
-  List<CssRule> get cssRules => _blink.Native_CSSKeyframesRule_cssRules_Getter(this);
+  List<CssRule> get cssRules => _blink.BlinkCSSKeyframesRule.$cssRules_Getter(this);
 
   @DomName('CSSKeyframesRule.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.Native_CSSKeyframesRule_name_Getter(this);
+  String get name => _blink.BlinkCSSKeyframesRule.$name_Getter(this);
 
   @DomName('CSSKeyframesRule.name')
   @DocsEditable()
   @Experimental() // untriaged
-  void set name(String value) => _blink.Native_CSSKeyframesRule_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkCSSKeyframesRule.$name_Setter(this, value);
 
   @DomName('CSSKeyframesRule.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule __getter__(int index) => _blink.Native_CSSKeyframesRule___getter___Callback(this, index);
+  CssKeyframeRule __getter__(int index) => _blink.BlinkCSSKeyframesRule.$__getter___Callback(this, index);
 
   @DomName('CSSKeyframesRule.deleteRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteRule(String key) => _blink.Native_CSSKeyframesRule_deleteRule_Callback(this, key);
+  void deleteRule(String key) => _blink.BlinkCSSKeyframesRule.$deleteRule_Callback(this, key);
 
   @DomName('CSSKeyframesRule.findRule')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule findRule(String key) => _blink.Native_CSSKeyframesRule_findRule_Callback(this, key);
+  CssKeyframeRule findRule(String key) => _blink.BlinkCSSKeyframesRule.$findRule_Callback(this, key);
 
   @DomName('CSSKeyframesRule.insertRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendRule(String rule) => _blink.Native_CSSKeyframesRule_insertRule_Callback(this, rule);
+  void appendRule(String rule) => _blink.BlinkCSSKeyframesRule.$insertRule_Callback(this, rule);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3222,19 +3222,19 @@
 
   @DomName('CSSMediaRule.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => _blink.Native_CSSMediaRule_cssRules_Getter(this);
+  List<CssRule> get cssRules => _blink.BlinkCSSMediaRule.$cssRules_Getter(this);
 
   @DomName('CSSMediaRule.media')
   @DocsEditable()
-  MediaList get media => _blink.Native_CSSMediaRule_media_Getter(this);
+  MediaList get media => _blink.BlinkCSSMediaRule.$media_Getter(this);
 
   @DomName('CSSMediaRule.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) => _blink.Native_CSSMediaRule_deleteRule_Callback(this, index);
+  void deleteRule(int index) => _blink.BlinkCSSMediaRule.$deleteRule_Callback(this, index);
 
   @DomName('CSSMediaRule.insertRule')
   @DocsEditable()
-  int insertRule(String rule, int index) => _blink.Native_CSSMediaRule_insertRule_Callback(this, rule, index);
+  int insertRule(String rule, int index) => _blink.BlinkCSSMediaRule.$insertRule_Callback(this, rule, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3252,15 +3252,15 @@
 
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
-  String get selectorText => _blink.Native_CSSPageRule_selectorText_Getter(this);
+  String get selectorText => _blink.BlinkCSSPageRule.$selectorText_Getter(this);
 
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
-  void set selectorText(String value) => _blink.Native_CSSPageRule_selectorText_Setter(this, value);
+  void set selectorText(String value) => _blink.BlinkCSSPageRule.$selectorText_Setter(this, value);
 
   @DomName('CSSPageRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.Native_CSSPageRule_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSPageRule.$style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3339,23 +3339,23 @@
 
   @DomName('CSSRule.cssText')
   @DocsEditable()
-  String get cssText => _blink.Native_CSSRule_cssText_Getter(this);
+  String get cssText => _blink.BlinkCSSRule.$cssText_Getter(this);
 
   @DomName('CSSRule.cssText')
   @DocsEditable()
-  void set cssText(String value) => _blink.Native_CSSRule_cssText_Setter(this, value);
+  void set cssText(String value) => _blink.BlinkCSSRule.$cssText_Setter(this, value);
 
   @DomName('CSSRule.parentRule')
   @DocsEditable()
-  CssRule get parentRule => _blink.Native_CSSRule_parentRule_Getter(this);
+  CssRule get parentRule => _blink.BlinkCSSRule.$parentRule_Getter(this);
 
   @DomName('CSSRule.parentStyleSheet')
   @DocsEditable()
-  CssStyleSheet get parentStyleSheet => _blink.Native_CSSRule_parentStyleSheet_Getter(this);
+  CssStyleSheet get parentStyleSheet => _blink.BlinkCSSRule.$parentStyleSheet_Getter(this);
 
   @DomName('CSSRule.type')
   @DocsEditable()
-  int get type => _blink.Native_CSSRule_type_Getter(this);
+  int get type => _blink.BlinkCSSRule.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3396,43 +3396,43 @@
 
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
-  String get cssText => _blink.Native_CSSStyleDeclaration_cssText_Getter(this);
+  String get cssText => _blink.BlinkCSSStyleDeclaration.$cssText_Getter(this);
 
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
-  void set cssText(String value) => _blink.Native_CSSStyleDeclaration_cssText_Setter(this, value);
+  void set cssText(String value) => _blink.BlinkCSSStyleDeclaration.$cssText_Setter(this, value);
 
   @DomName('CSSStyleDeclaration.length')
   @DocsEditable()
-  int get length => _blink.Native_CSSStyleDeclaration_length_Getter(this);
+  int get length => _blink.BlinkCSSStyleDeclaration.$length_Getter(this);
 
   @DomName('CSSStyleDeclaration.parentRule')
   @DocsEditable()
-  CssRule get parentRule => _blink.Native_CSSStyleDeclaration_parentRule_Getter(this);
+  CssRule get parentRule => _blink.BlinkCSSStyleDeclaration.$parentRule_Getter(this);
 
   @DomName('CSSStyleDeclaration.__setter__')
   @DocsEditable()
-  void __setter__(String propertyName, String propertyValue) => _blink.Native_CSSStyleDeclaration___setter___Callback(this, propertyName, propertyValue);
+  void __setter__(String propertyName, String propertyValue) => _blink.BlinkCSSStyleDeclaration.$__setter___Callback(this, propertyName, propertyValue);
 
   @DomName('CSSStyleDeclaration.getPropertyPriority')
   @DocsEditable()
-  String getPropertyPriority(String propertyName) => _blink.Native_CSSStyleDeclaration_getPropertyPriority_Callback(this, propertyName);
+  String getPropertyPriority(String propertyName) => _blink.BlinkCSSStyleDeclaration.$getPropertyPriority_Callback(this, propertyName);
 
   @DomName('CSSStyleDeclaration.getPropertyValue')
   @DocsEditable()
-  String _getPropertyValue(String propertyName) => _blink.Native_CSSStyleDeclaration_getPropertyValue_Callback(this, propertyName);
+  String _getPropertyValue(String propertyName) => _blink.BlinkCSSStyleDeclaration.$getPropertyValue_Callback(this, propertyName);
 
   @DomName('CSSStyleDeclaration.item')
   @DocsEditable()
-  String item(int index) => _blink.Native_CSSStyleDeclaration_item_Callback(this, index);
+  String item(int index) => _blink.BlinkCSSStyleDeclaration.$item_Callback(this, index);
 
   @DomName('CSSStyleDeclaration.removeProperty')
   @DocsEditable()
-  String removeProperty(String propertyName) => _blink.Native_CSSStyleDeclaration_removeProperty_Callback(this, propertyName);
+  String removeProperty(String propertyName) => _blink.BlinkCSSStyleDeclaration.$removeProperty_Callback(this, propertyName);
 
   @DomName('CSSStyleDeclaration.setProperty')
   @DocsEditable()
-  void _setProperty(String propertyName, String value, String priority) => _blink.Native_CSSStyleDeclaration_setProperty_Callback(this, propertyName, value, priority);
+  void _setProperty(String propertyName, String value, String priority) => _blink.BlinkCSSStyleDeclaration.$setProperty_Callback(this, propertyName, value, priority);
 
 }
 
@@ -6648,15 +6648,15 @@
 
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
-  String get selectorText => _blink.Native_CSSStyleRule_selectorText_Getter(this);
+  String get selectorText => _blink.BlinkCSSStyleRule.$selectorText_Getter(this);
 
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
-  void set selectorText(String value) => _blink.Native_CSSStyleRule_selectorText_Setter(this, value);
+  void set selectorText(String value) => _blink.BlinkCSSStyleRule.$selectorText_Setter(this, value);
 
   @DomName('CSSStyleRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.Native_CSSStyleRule_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSStyleRule.$style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6674,29 +6674,29 @@
 
   @DomName('CSSStyleSheet.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => _blink.Native_CSSStyleSheet_cssRules_Getter(this);
+  List<CssRule> get cssRules => _blink.BlinkCSSStyleSheet.$cssRules_Getter(this);
 
   @DomName('CSSStyleSheet.ownerRule')
   @DocsEditable()
-  CssRule get ownerRule => _blink.Native_CSSStyleSheet_ownerRule_Getter(this);
+  CssRule get ownerRule => _blink.BlinkCSSStyleSheet.$ownerRule_Getter(this);
 
   @DomName('CSSStyleSheet.rules')
   @DocsEditable()
   @Experimental() // non-standard
-  List<CssRule> get rules => _blink.Native_CSSStyleSheet_rules_Getter(this);
+  List<CssRule> get rules => _blink.BlinkCSSStyleSheet.$rules_Getter(this);
 
-  int addRule(String selector, String style, [int index]) => _blink.Native_CSSStyleSheet_addRule(this, selector, style, index);
+  int addRule(String selector, String style, [int index]) => _blink.BlinkCSSStyleSheet.$addRule(this, selector, style, index);
 
   @DomName('CSSStyleSheet.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) => _blink.Native_CSSStyleSheet_deleteRule_Callback(this, index);
+  void deleteRule(int index) => _blink.BlinkCSSStyleSheet.$deleteRule_Callback(this, index);
 
-  int insertRule(String rule, [int index]) => _blink.Native_CSSStyleSheet_insertRule(this, rule, index);
+  int insertRule(String rule, [int index]) => _blink.BlinkCSSStyleSheet.$insertRule(this, rule, index);
 
   @DomName('CSSStyleSheet.removeRule')
   @DocsEditable()
   @Experimental() // non-standard
-  void removeRule(int index) => _blink.Native_CSSStyleSheet_removeRule_Callback(this, index);
+  void removeRule(int index) => _blink.BlinkCSSStyleSheet.$removeRule_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6714,19 +6714,19 @@
 
   @DomName('CSSSupportsRule.conditionText')
   @DocsEditable()
-  String get conditionText => _blink.Native_CSSSupportsRule_conditionText_Getter(this);
+  String get conditionText => _blink.BlinkCSSSupportsRule.$conditionText_Getter(this);
 
   @DomName('CSSSupportsRule.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => _blink.Native_CSSSupportsRule_cssRules_Getter(this);
+  List<CssRule> get cssRules => _blink.BlinkCSSSupportsRule.$cssRules_Getter(this);
 
   @DomName('CSSSupportsRule.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) => _blink.Native_CSSSupportsRule_deleteRule_Callback(this, index);
+  void deleteRule(int index) => _blink.BlinkCSSSupportsRule.$deleteRule_Callback(this, index);
 
   @DomName('CSSSupportsRule.insertRule')
   @DocsEditable()
-  int insertRule(String rule, int index) => _blink.Native_CSSSupportsRule_insertRule_Callback(this, rule, index);
+  int insertRule(String rule, int index) => _blink.BlinkCSSSupportsRule.$insertRule_Callback(this, rule, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6746,7 +6746,7 @@
   @DomName('CSSViewportRule.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => _blink.Native_CSSViewportRule_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSViewportRule.$style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6794,11 +6794,11 @@
 
   @DomName('CustomEvent.detail')
   @DocsEditable()
-  Object get _detail => _blink.Native_CustomEvent_detail_Getter(this);
+  Object get _detail => _blink.BlinkCustomEvent.$detail_Getter(this);
 
   @DomName('CustomEvent.initCustomEvent')
   @DocsEditable()
-  void _initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) => _blink.Native_CustomEvent_initCustomEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, detailArg);
+  void _initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) => _blink.BlinkCustomEvent.$initCustomEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, detailArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6857,7 +6857,7 @@
 
   @DomName('HTMLDataListElement.options')
   @DocsEditable()
-  List<Node> get options => _blink.Native_HTMLDataListElement_options_Getter(this);
+  List<Node> get options => _blink.BlinkHTMLDataListElement.$options_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6875,33 +6875,33 @@
 
   @DomName('Clipboard.dropEffect')
   @DocsEditable()
-  String get dropEffect => _blink.Native_Clipboard_dropEffect_Getter(this);
+  String get dropEffect => _blink.BlinkClipboard.$dropEffect_Getter(this);
 
   @DomName('Clipboard.dropEffect')
   @DocsEditable()
-  void set dropEffect(String value) => _blink.Native_Clipboard_dropEffect_Setter(this, value);
+  void set dropEffect(String value) => _blink.BlinkClipboard.$dropEffect_Setter(this, value);
 
   @DomName('Clipboard.effectAllowed')
   @DocsEditable()
-  String get effectAllowed => _blink.Native_Clipboard_effectAllowed_Getter(this);
+  String get effectAllowed => _blink.BlinkClipboard.$effectAllowed_Getter(this);
 
   @DomName('Clipboard.effectAllowed')
   @DocsEditable()
-  void set effectAllowed(String value) => _blink.Native_Clipboard_effectAllowed_Setter(this, value);
+  void set effectAllowed(String value) => _blink.BlinkClipboard.$effectAllowed_Setter(this, value);
 
   @DomName('Clipboard.files')
   @DocsEditable()
-  List<File> get files => _blink.Native_Clipboard_files_Getter(this);
+  List<File> get files => _blink.BlinkClipboard.$files_Getter(this);
 
   @DomName('Clipboard.items')
   @DocsEditable()
-  DataTransferItemList get items => _blink.Native_Clipboard_items_Getter(this);
+  DataTransferItemList get items => _blink.BlinkClipboard.$items_Getter(this);
 
   @DomName('Clipboard.types')
   @DocsEditable()
-  List<String> get types => _blink.Native_Clipboard_types_Getter(this);
+  List<String> get types => _blink.BlinkClipboard.$types_Getter(this);
 
-  void clearData([String type]) => _blink.Native_Clipboard_clearData(this, type);
+  void clearData([String type]) => _blink.BlinkClipboard.$clearData(this, type);
 
   /**
    * Gets the data for the specified type.
@@ -6921,15 +6921,15 @@
    */
   @DomName('Clipboard.getData')
   @DocsEditable()
-  String getData(String type) => _blink.Native_Clipboard_getData_Callback(this, type);
+  String getData(String type) => _blink.BlinkClipboard.$getData_Callback(this, type);
 
   @DomName('Clipboard.setData')
   @DocsEditable()
-  bool setData(String type, String data) => _blink.Native_Clipboard_setData_Callback(this, type, data);
+  bool setData(String type, String data) => _blink.BlinkClipboard.$setData_Callback(this, type, data);
 
   @DomName('Clipboard.setDragImage')
   @DocsEditable()
-  void setDragImage(Element image, int x, int y) => _blink.Native_Clipboard_setDragImage_Callback(this, image, x, y);
+  void setDragImage(Element image, int x, int y) => _blink.BlinkClipboard.$setDragImage_Callback(this, image, x, y);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6949,19 +6949,19 @@
 
   @DomName('DataTransferItem.kind')
   @DocsEditable()
-  String get kind => _blink.Native_DataTransferItem_kind_Getter(this);
+  String get kind => _blink.BlinkDataTransferItem.$kind_Getter(this);
 
   @DomName('DataTransferItem.type')
   @DocsEditable()
-  String get type => _blink.Native_DataTransferItem_type_Getter(this);
+  String get type => _blink.BlinkDataTransferItem.$type_Getter(this);
 
   @DomName('DataTransferItem.getAsFile')
   @DocsEditable()
-  Blob getAsFile() => _blink.Native_DataTransferItem_getAsFile_Callback(this);
+  Blob getAsFile() => _blink.BlinkDataTransferItem.$getAsFile_Callback(this);
 
   @DomName('DataTransferItem.getAsString')
   @DocsEditable()
-  void _getAsString(_StringCallback callback) => _blink.Native_DataTransferItem_getAsString_Callback(this, callback);
+  void _getAsString(_StringCallback callback) => _blink.BlinkDataTransferItem.$getAsString_Callback(this, callback);
 
   Future<String> getAsString() {
     var completer = new Completer<String>();
@@ -6975,7 +6975,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  Entry getAsEntry() => _blink.Native_DataTransferItem_webkitGetAsEntry_Callback(this);
+  Entry getAsEntry() => _blink.BlinkDataTransferItem.$webkitGetAsEntry_Callback(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -6993,31 +6993,31 @@
 
   @DomName('DataTransferItemList.length')
   @DocsEditable()
-  int get length => _blink.Native_DataTransferItemList_length_Getter(this);
+  int get length => _blink.BlinkDataTransferItemList.$length_Getter(this);
 
   @DomName('DataTransferItemList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  DataTransferItem __getter__(int index) => _blink.Native_DataTransferItemList___getter___Callback(this, index);
+  DataTransferItem __getter__(int index) => _blink.BlinkDataTransferItemList.$__getter___Callback(this, index);
 
-  DataTransferItem add(data_OR_file, [String type]) => _blink.Native_DataTransferItemList_add(this, data_OR_file, type);
+  DataTransferItem add(data_OR_file, [String type]) => _blink.BlinkDataTransferItemList.$add(this, data_OR_file, type);
 
   @DomName('DataTransferItemList.addData')
   @DocsEditable()
-  DataTransferItem addData(String data, String type) => _blink.Native_DataTransferItemList_addData_Callback(this, data, type);
+  DataTransferItem addData(String data, String type) => _blink.BlinkDataTransferItemList.$addData_Callback(this, data, type);
 
   @DomName('DataTransferItemList.addFile')
   @DocsEditable()
-  DataTransferItem addFile(File file) => _blink.Native_DataTransferItemList_addFile_Callback(this, file);
+  DataTransferItem addFile(File file) => _blink.BlinkDataTransferItemList.$addFile_Callback(this, file);
 
   @DomName('DataTransferItemList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_DataTransferItemList_clear_Callback(this);
+  void clear() => _blink.BlinkDataTransferItemList.$clear_Callback(this);
 
   @DomName('DataTransferItemList.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(int index) => _blink.Native_DataTransferItemList_remove_Callback(this, index);
+  void remove(int index) => _blink.BlinkDataTransferItemList.$remove_Callback(this, index);
 
 
   DataTransferItem operator[] (int index) {
@@ -7064,7 +7064,7 @@
   @DomName('DedicatedWorkerGlobalScope.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void postMessage(Object message, [List<MessagePort> messagePorts]) => _blink.Native_DedicatedWorkerGlobalScope_postMessage_Callback(this, message, messagePorts);
+  void postMessage(Object message, [List<MessagePort> messagePorts]) => _blink.BlinkDedicatedWorkerGlobalScope.$postMessage_Callback(this, message, messagePorts);
 
   /// Stream of `message` events handled by this [DedicatedWorkerGlobalScope].
   @DomName('DedicatedWorkerGlobalScope.onmessage')
@@ -7100,12 +7100,12 @@
   @DomName('DeprecatedStorageInfo.queryUsageAndQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void queryUsageAndQuota(int storageType, [StorageUsageCallback usageCallback, StorageErrorCallback errorCallback]) => _blink.Native_DeprecatedStorageInfo_queryUsageAndQuota_Callback(this, storageType, usageCallback, errorCallback);
+  void queryUsageAndQuota(int storageType, [StorageUsageCallback usageCallback, StorageErrorCallback errorCallback]) => _blink.BlinkDeprecatedStorageInfo.$queryUsageAndQuota_Callback(this, storageType, usageCallback, errorCallback);
 
   @DomName('DeprecatedStorageInfo.requestQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestQuota(int storageType, int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) => _blink.Native_DeprecatedStorageInfo_requestQuota_Callback(this, storageType, newQuotaInBytes, quotaCallback, errorCallback);
+  void requestQuota(int storageType, int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) => _blink.BlinkDeprecatedStorageInfo.$requestQuota_Callback(this, storageType, newQuotaInBytes, quotaCallback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7125,12 +7125,12 @@
   @DomName('DeprecatedStorageQuota.queryUsageAndQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void queryUsageAndQuota(StorageUsageCallback usageCallback, [StorageErrorCallback errorCallback]) => _blink.Native_DeprecatedStorageQuota_queryUsageAndQuota_Callback(this, usageCallback, errorCallback);
+  void queryUsageAndQuota(StorageUsageCallback usageCallback, [StorageErrorCallback errorCallback]) => _blink.BlinkDeprecatedStorageQuota.$queryUsageAndQuota_Callback(this, usageCallback, errorCallback);
 
   @DomName('DeprecatedStorageQuota.requestQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestQuota(int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) => _blink.Native_DeprecatedStorageQuota_requestQuota_Callback(this, newQuotaInBytes, quotaCallback, errorCallback);
+  void requestQuota(int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) => _blink.BlinkDeprecatedStorageQuota.$requestQuota_Callback(this, newQuotaInBytes, quotaCallback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7164,11 +7164,11 @@
 
   @DomName('HTMLDetailsElement.open')
   @DocsEditable()
-  bool get open => _blink.Native_HTMLDetailsElement_open_Getter(this);
+  bool get open => _blink.BlinkHTMLDetailsElement.$open_Getter(this);
 
   @DomName('HTMLDetailsElement.open')
   @DocsEditable()
-  void set open(bool value) => _blink.Native_HTMLDetailsElement_open_Setter(this, value);
+  void set open(bool value) => _blink.BlinkHTMLDetailsElement.$open_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7188,15 +7188,15 @@
 
   @DomName('DeviceAcceleration.x')
   @DocsEditable()
-  double get x => _blink.Native_DeviceAcceleration_x_Getter(this);
+  double get x => _blink.BlinkDeviceAcceleration.$x_Getter(this);
 
   @DomName('DeviceAcceleration.y')
   @DocsEditable()
-  double get y => _blink.Native_DeviceAcceleration_y_Getter(this);
+  double get y => _blink.BlinkDeviceAcceleration.$y_Getter(this);
 
   @DomName('DeviceAcceleration.z')
   @DocsEditable()
-  double get z => _blink.Native_DeviceAcceleration_z_Getter(this);
+  double get z => _blink.BlinkDeviceAcceleration.$z_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7216,24 +7216,24 @@
 
   @DomName('DeviceMotionEvent.acceleration')
   @DocsEditable()
-  DeviceAcceleration get acceleration => _blink.Native_DeviceMotionEvent_acceleration_Getter(this);
+  DeviceAcceleration get acceleration => _blink.BlinkDeviceMotionEvent.$acceleration_Getter(this);
 
   @DomName('DeviceMotionEvent.accelerationIncludingGravity')
   @DocsEditable()
-  DeviceAcceleration get accelerationIncludingGravity => _blink.Native_DeviceMotionEvent_accelerationIncludingGravity_Getter(this);
+  DeviceAcceleration get accelerationIncludingGravity => _blink.BlinkDeviceMotionEvent.$accelerationIncludingGravity_Getter(this);
 
   @DomName('DeviceMotionEvent.interval')
   @DocsEditable()
-  double get interval => _blink.Native_DeviceMotionEvent_interval_Getter(this);
+  double get interval => _blink.BlinkDeviceMotionEvent.$interval_Getter(this);
 
   @DomName('DeviceMotionEvent.rotationRate')
   @DocsEditable()
-  DeviceRotationRate get rotationRate => _blink.Native_DeviceMotionEvent_rotationRate_Getter(this);
+  DeviceRotationRate get rotationRate => _blink.BlinkDeviceMotionEvent.$rotationRate_Getter(this);
 
   @DomName('DeviceMotionEvent.initDeviceMotionEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  void initDeviceMotionEvent(String type, bool bubbles, bool cancelable, DeviceAcceleration acceleration, DeviceAcceleration accelerationIncludingGravity, DeviceRotationRate rotationRate, num interval) => _blink.Native_DeviceMotionEvent_initDeviceMotionEvent_Callback(this, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval);
+  void initDeviceMotionEvent(String type, bool bubbles, bool cancelable, DeviceAcceleration acceleration, DeviceAcceleration accelerationIncludingGravity, DeviceRotationRate rotationRate, num interval) => _blink.BlinkDeviceMotionEvent.$initDeviceMotionEvent_Callback(this, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -7259,23 +7259,23 @@
 
   @DomName('DeviceOrientationEvent.absolute')
   @DocsEditable()
-  bool get absolute => _blink.Native_DeviceOrientationEvent_absolute_Getter(this);
+  bool get absolute => _blink.BlinkDeviceOrientationEvent.$absolute_Getter(this);
 
   @DomName('DeviceOrientationEvent.alpha')
   @DocsEditable()
-  double get alpha => _blink.Native_DeviceOrientationEvent_alpha_Getter(this);
+  double get alpha => _blink.BlinkDeviceOrientationEvent.$alpha_Getter(this);
 
   @DomName('DeviceOrientationEvent.beta')
   @DocsEditable()
-  double get beta => _blink.Native_DeviceOrientationEvent_beta_Getter(this);
+  double get beta => _blink.BlinkDeviceOrientationEvent.$beta_Getter(this);
 
   @DomName('DeviceOrientationEvent.gamma')
   @DocsEditable()
-  double get gamma => _blink.Native_DeviceOrientationEvent_gamma_Getter(this);
+  double get gamma => _blink.BlinkDeviceOrientationEvent.$gamma_Getter(this);
 
   @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
   @DocsEditable()
-  void _initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) => _blink.Native_DeviceOrientationEvent_initDeviceOrientationEvent_Callback(this, type, bubbles, cancelable, alpha, beta, gamma, absolute);
+  void _initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) => _blink.BlinkDeviceOrientationEvent.$initDeviceOrientationEvent_Callback(this, type, bubbles, cancelable, alpha, beta, gamma, absolute);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7295,15 +7295,15 @@
 
   @DomName('DeviceRotationRate.alpha')
   @DocsEditable()
-  double get alpha => _blink.Native_DeviceRotationRate_alpha_Getter(this);
+  double get alpha => _blink.BlinkDeviceRotationRate.$alpha_Getter(this);
 
   @DomName('DeviceRotationRate.beta')
   @DocsEditable()
-  double get beta => _blink.Native_DeviceRotationRate_beta_Getter(this);
+  double get beta => _blink.BlinkDeviceRotationRate.$beta_Getter(this);
 
   @DomName('DeviceRotationRate.gamma')
   @DocsEditable()
-  double get gamma => _blink.Native_DeviceRotationRate_gamma_Getter(this);
+  double get gamma => _blink.BlinkDeviceRotationRate.$gamma_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7328,33 +7328,33 @@
 
   @DomName('HTMLDialogElement.open')
   @DocsEditable()
-  bool get open => _blink.Native_HTMLDialogElement_open_Getter(this);
+  bool get open => _blink.BlinkHTMLDialogElement.$open_Getter(this);
 
   @DomName('HTMLDialogElement.open')
   @DocsEditable()
-  void set open(bool value) => _blink.Native_HTMLDialogElement_open_Setter(this, value);
+  void set open(bool value) => _blink.BlinkHTMLDialogElement.$open_Setter(this, value);
 
   @DomName('HTMLDialogElement.returnValue')
   @DocsEditable()
   @Experimental() // untriaged
-  String get returnValue => _blink.Native_HTMLDialogElement_returnValue_Getter(this);
+  String get returnValue => _blink.BlinkHTMLDialogElement.$returnValue_Getter(this);
 
   @DomName('HTMLDialogElement.returnValue')
   @DocsEditable()
   @Experimental() // untriaged
-  void set returnValue(String value) => _blink.Native_HTMLDialogElement_returnValue_Setter(this, value);
+  void set returnValue(String value) => _blink.BlinkHTMLDialogElement.$returnValue_Setter(this, value);
 
   @DomName('HTMLDialogElement.close')
   @DocsEditable()
-  void close(String returnValue) => _blink.Native_HTMLDialogElement_close_Callback(this, returnValue);
+  void close(String returnValue) => _blink.BlinkHTMLDialogElement.$close_Callback(this, returnValue);
 
   @DomName('HTMLDialogElement.show')
   @DocsEditable()
-  void show() => _blink.Native_HTMLDialogElement_show_Callback(this);
+  void show() => _blink.BlinkHTMLDialogElement.$show_Callback(this);
 
   @DomName('HTMLDialogElement.showModal')
   @DocsEditable()
-  void showModal() => _blink.Native_HTMLDialogElement_showModal_Callback(this);
+  void showModal() => _blink.BlinkHTMLDialogElement.$showModal_Callback(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -7408,11 +7408,11 @@
 
   @DomName('DirectoryEntry.createReader')
   @DocsEditable()
-  DirectoryReader createReader() => _blink.Native_DirectoryEntry_createReader_Callback(this);
+  DirectoryReader createReader() => _blink.BlinkDirectoryEntry.$createReader_Callback(this);
 
   @DomName('DirectoryEntry.getDirectory')
   @DocsEditable()
-  void __getDirectory(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_DirectoryEntry_getDirectory_Callback(this, path, options, successCallback, errorCallback);
+  void __getDirectory(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.BlinkDirectoryEntry.$getDirectory_Callback(this, path, options, successCallback, errorCallback);
 
   Future<Entry> _getDirectory(String path, {Map options}) {
     var completer = new Completer<Entry>();
@@ -7424,7 +7424,7 @@
 
   @DomName('DirectoryEntry.getFile')
   @DocsEditable()
-  void __getFile(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_DirectoryEntry_getFile_Callback(this, path, options, successCallback, errorCallback);
+  void __getFile(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.BlinkDirectoryEntry.$getFile_Callback(this, path, options, successCallback, errorCallback);
 
   Future<Entry> _getFile(String path, {Map options}) {
     var completer = new Completer<Entry>();
@@ -7436,7 +7436,7 @@
 
   @DomName('DirectoryEntry.removeRecursively')
   @DocsEditable()
-  void _removeRecursively(VoidCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_DirectoryEntry_removeRecursively_Callback(this, successCallback, errorCallback);
+  void _removeRecursively(VoidCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkDirectoryEntry.$removeRecursively_Callback(this, successCallback, errorCallback);
 
   Future removeRecursively() {
     var completer = new Completer();
@@ -7465,7 +7465,7 @@
 
   @DomName('DirectoryReader.readEntries')
   @DocsEditable()
-  void _readEntries(_EntriesCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_DirectoryReader_readEntries_Callback(this, successCallback, errorCallback);
+  void _readEntries(_EntriesCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkDirectoryReader.$readEntries_Callback(this, successCallback, errorCallback);
 
   Future<List<Entry>> readEntries() {
     var completer = new Completer<List<Entry>>();
@@ -7607,109 +7607,109 @@
   @DomName('Document.activeElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get activeElement => _blink.Native_Document_activeElement_Getter(this);
+  Element get activeElement => _blink.BlinkDocument.$activeElement_Getter(this);
 
   @DomName('Document.body')
   @DocsEditable()
-  HtmlElement get _body => _blink.Native_Document_body_Getter(this);
+  HtmlElement get _body => _blink.BlinkDocument.$body_Getter(this);
 
   @DomName('Document.body')
   @DocsEditable()
-  void set _body(HtmlElement value) => _blink.Native_Document_body_Setter(this, value);
+  void set _body(HtmlElement value) => _blink.BlinkDocument.$body_Setter(this, value);
 
   @DomName('Document.cookie')
   @DocsEditable()
-  String get cookie => _blink.Native_Document_cookie_Getter(this);
+  String get cookie => _blink.BlinkDocument.$cookie_Getter(this);
 
   @DomName('Document.cookie')
   @DocsEditable()
-  void set cookie(String value) => _blink.Native_Document_cookie_Setter(this, value);
+  void set cookie(String value) => _blink.BlinkDocument.$cookie_Setter(this, value);
 
   @DomName('Document.currentScript')
   @DocsEditable()
   @Experimental() // untriaged
-  ScriptElement get currentScript => _blink.Native_Document_currentScript_Getter(this);
+  ScriptElement get currentScript => _blink.BlinkDocument.$currentScript_Getter(this);
 
   @DomName('Document.defaultView')
   @DocsEditable()
-  WindowBase get window => _blink.Native_Document_defaultView_Getter(this);
+  WindowBase get window => _blink.BlinkDocument.$defaultView_Getter(this);
 
   @DomName('Document.documentElement')
   @DocsEditable()
-  Element get documentElement => _blink.Native_Document_documentElement_Getter(this);
+  Element get documentElement => _blink.BlinkDocument.$documentElement_Getter(this);
 
   @DomName('Document.domain')
   @DocsEditable()
-  String get domain => _blink.Native_Document_domain_Getter(this);
+  String get domain => _blink.BlinkDocument.$domain_Getter(this);
 
   @DomName('Document.fonts')
   @DocsEditable()
   @Experimental() // untriaged
-  FontFaceSet get fonts => _blink.Native_Document_fonts_Getter(this);
+  FontFaceSet get fonts => _blink.BlinkDocument.$fonts_Getter(this);
 
   @DomName('Document.head')
   @DocsEditable()
-  HeadElement get _head => _blink.Native_Document_head_Getter(this);
+  HeadElement get _head => _blink.BlinkDocument.$head_Getter(this);
 
   @DomName('Document.hidden')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get hidden => _blink.Native_Document_hidden_Getter(this);
+  bool get hidden => _blink.BlinkDocument.$hidden_Getter(this);
 
   @DomName('Document.implementation')
   @DocsEditable()
-  DomImplementation get implementation => _blink.Native_Document_implementation_Getter(this);
+  DomImplementation get implementation => _blink.BlinkDocument.$implementation_Getter(this);
 
   @DomName('Document.lastModified')
   @DocsEditable()
-  String get _lastModified => _blink.Native_Document_lastModified_Getter(this);
+  String get _lastModified => _blink.BlinkDocument.$lastModified_Getter(this);
 
   @DomName('Document.preferredStylesheetSet')
   @DocsEditable()
-  String get _preferredStylesheetSet => _blink.Native_Document_preferredStylesheetSet_Getter(this);
+  String get _preferredStylesheetSet => _blink.BlinkDocument.$preferredStylesheetSet_Getter(this);
 
   @DomName('Document.readyState')
   @DocsEditable()
-  String get readyState => _blink.Native_Document_readyState_Getter(this);
+  String get readyState => _blink.BlinkDocument.$readyState_Getter(this);
 
   @DomName('Document.referrer')
   @DocsEditable()
-  String get _referrer => _blink.Native_Document_referrer_Getter(this);
+  String get _referrer => _blink.BlinkDocument.$referrer_Getter(this);
 
   @DomName('Document.rootElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgSvgElement get rootElement => _blink.Native_Document_rootElement_Getter(this);
+  SvgSvgElement get rootElement => _blink.BlinkDocument.$rootElement_Getter(this);
 
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
-  String get _selectedStylesheetSet => _blink.Native_Document_selectedStylesheetSet_Getter(this);
+  String get _selectedStylesheetSet => _blink.BlinkDocument.$selectedStylesheetSet_Getter(this);
 
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
-  void set _selectedStylesheetSet(String value) => _blink.Native_Document_selectedStylesheetSet_Setter(this, value);
+  void set _selectedStylesheetSet(String value) => _blink.BlinkDocument.$selectedStylesheetSet_Setter(this, value);
 
   @DomName('Document.styleSheets')
   @DocsEditable()
-  List<StyleSheet> get _styleSheets => _blink.Native_Document_styleSheets_Getter(this);
+  List<StyleSheet> get _styleSheets => _blink.BlinkDocument.$styleSheets_Getter(this);
 
   @DomName('Document.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  Timeline get timeline => _blink.Native_Document_timeline_Getter(this);
+  Timeline get timeline => _blink.BlinkDocument.$timeline_Getter(this);
 
   @DomName('Document.title')
   @DocsEditable()
-  String get _title => _blink.Native_Document_title_Getter(this);
+  String get _title => _blink.BlinkDocument.$title_Getter(this);
 
   @DomName('Document.title')
   @DocsEditable()
-  void set _title(String value) => _blink.Native_Document_title_Setter(this, value);
+  void set _title(String value) => _blink.BlinkDocument.$title_Setter(this, value);
 
   @DomName('Document.visibilityState')
   @DocsEditable()
   @Experimental() // untriaged
-  String get visibilityState => _blink.Native_Document_visibilityState_Getter(this);
+  String get visibilityState => _blink.BlinkDocument.$visibilityState_Getter(this);
 
   @DomName('Document.webkitFullscreenElement')
   @DocsEditable()
@@ -7717,7 +7717,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenelement
-  Element get _webkitFullscreenElement => _blink.Native_Document_webkitFullscreenElement_Getter(this);
+  Element get _webkitFullscreenElement => _blink.BlinkDocument.$webkitFullscreenElement_Getter(this);
 
   @DomName('Document.webkitFullscreenEnabled')
   @DocsEditable()
@@ -7725,7 +7725,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenenabled
-  bool get _webkitFullscreenEnabled => _blink.Native_Document_webkitFullscreenEnabled_Getter(this);
+  bool get _webkitFullscreenEnabled => _blink.BlinkDocument.$webkitFullscreenEnabled_Getter(this);
 
   @DomName('Document.webkitHidden')
   @DocsEditable()
@@ -7733,7 +7733,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#document
-  bool get _webkitHidden => _blink.Native_Document_webkitHidden_Getter(this);
+  bool get _webkitHidden => _blink.BlinkDocument.$webkitHidden_Getter(this);
 
   @DomName('Document.webkitPointerLockElement')
   @DocsEditable()
@@ -7741,7 +7741,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-pointerLockElement
-  Element get _webkitPointerLockElement => _blink.Native_Document_webkitPointerLockElement_Getter(this);
+  Element get _webkitPointerLockElement => _blink.BlinkDocument.$webkitPointerLockElement_Getter(this);
 
   @DomName('Document.webkitVisibilityState')
   @DocsEditable()
@@ -7749,101 +7749,101 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#dom-document-visibilitystate
-  String get _webkitVisibilityState => _blink.Native_Document_webkitVisibilityState_Getter(this);
+  String get _webkitVisibilityState => _blink.BlinkDocument.$webkitVisibilityState_Getter(this);
 
   @DomName('Document.adoptNode')
   @DocsEditable()
-  Node adoptNode(Node node) => _blink.Native_Document_adoptNode_Callback(this, node);
+  Node adoptNode(Node node) => _blink.BlinkDocument.$adoptNode_Callback(this, node);
 
   @DomName('Document.caretRangeFromPoint')
   @DocsEditable()
   // http://www.w3.org/TR/2009/WD-cssom-view-20090804/#dom-documentview-caretrangefrompoint
   @Experimental()
-  Range _caretRangeFromPoint(int x, int y) => _blink.Native_Document_caretRangeFromPoint_Callback(this, x, y);
+  Range _caretRangeFromPoint(int x, int y) => _blink.BlinkDocument.$caretRangeFromPoint_Callback(this, x, y);
 
   @DomName('Document.createDocumentFragment')
   @DocsEditable()
-  DocumentFragment createDocumentFragment() => _blink.Native_Document_createDocumentFragment_Callback(this);
+  DocumentFragment createDocumentFragment() => _blink.BlinkDocument.$createDocumentFragment_Callback(this);
 
   @DomName('Document.createElement')
   @DocsEditable()
-  Element _createElement(String localName_OR_tagName, [String typeExtension]) => _blink.Native_Document_createElement_Callback(this, localName_OR_tagName, typeExtension);
+  Element _createElement(String localName_OR_tagName, [String typeExtension]) => _blink.BlinkDocument.$createElement_Callback(this, localName_OR_tagName, typeExtension);
 
   @DomName('Document.createElementNS')
   @DocsEditable()
-  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => _blink.Native_Document_createElementNS_Callback(this, namespaceURI, qualifiedName, typeExtension);
+  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => _blink.BlinkDocument.$createElementNS_Callback(this, namespaceURI, qualifiedName, typeExtension);
 
-  Event _createEvent([String eventType]) => _blink.Native_Document__createEvent(this, eventType);
+  Event _createEvent([String eventType]) => _blink.BlinkDocument.$_createEvent(this, eventType);
 
-  NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter]) => _blink.Native_Document__createNodeIterator(this, root, whatToShow, filter);
+  NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter]) => _blink.BlinkDocument.$_createNodeIterator(this, root, whatToShow, filter);
 
   @DomName('Document.createRange')
   @DocsEditable()
-  Range createRange() => _blink.Native_Document_createRange_Callback(this);
+  Range createRange() => _blink.BlinkDocument.$createRange_Callback(this);
 
   @DomName('Document.createTextNode')
   @DocsEditable()
-  Text _createTextNode(String data) => _blink.Native_Document_createTextNode_Callback(this, data);
+  Text _createTextNode(String data) => _blink.BlinkDocument.$createTextNode_Callback(this, data);
 
   @DomName('Document.createTouch')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Touch _createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) => _blink.Native_Document_createTouch_Callback(this, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
+  Touch _createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) => _blink.BlinkDocument.$createTouch_Callback(this, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
 
-  TreeWalker _createTreeWalker(Node root, [int whatToShow, NodeFilter filter]) => _blink.Native_Document__createTreeWalker(this, root, whatToShow, filter);
+  TreeWalker _createTreeWalker(Node root, [int whatToShow, NodeFilter filter]) => _blink.BlinkDocument.$_createTreeWalker(this, root, whatToShow, filter);
 
   @DomName('Document.elementFromPoint')
   @DocsEditable()
-  Element _elementFromPoint(int x, int y) => _blink.Native_Document_elementFromPoint_Callback(this, x, y);
+  Element _elementFromPoint(int x, int y) => _blink.BlinkDocument.$elementFromPoint_Callback(this, x, y);
 
   @DomName('Document.execCommand')
   @DocsEditable()
-  bool execCommand(String command, bool userInterface, String value) => _blink.Native_Document_execCommand_Callback(this, command, userInterface, value);
+  bool execCommand(String command, bool userInterface, String value) => _blink.BlinkDocument.$execCommand_Callback(this, command, userInterface, value);
 
   @DomName('Document.getCSSCanvasContext')
   @DocsEditable()
   // https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/Functions.html
   @Experimental() // non-standard
-  CanvasRenderingContext _getCssCanvasContext(String contextId, String name, int width, int height) => _blink.Native_Document_getCSSCanvasContext_Callback(this, contextId, name, width, height);
+  CanvasRenderingContext _getCssCanvasContext(String contextId, String name, int width, int height) => _blink.BlinkDocument.$getCSSCanvasContext_Callback(this, contextId, name, width, height);
 
   @DomName('Document.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) => _blink.Native_Document_getElementById_Callback(this, elementId);
+  Element getElementById(String elementId) => _blink.BlinkDocument.$getElementById_Callback(this, elementId);
 
   @DomName('Document.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String classNames) => _blink.Native_Document_getElementsByClassName_Callback(this, classNames);
+  List<Node> getElementsByClassName(String classNames) => _blink.BlinkDocument.$getElementsByClassName_Callback(this, classNames);
 
   @DomName('Document.getElementsByName')
   @DocsEditable()
-  List<Node> getElementsByName(String elementName) => _blink.Native_Document_getElementsByName_Callback(this, elementName);
+  List<Node> getElementsByName(String elementName) => _blink.BlinkDocument.$getElementsByName_Callback(this, elementName);
 
   @DomName('Document.getElementsByTagName')
   @DocsEditable()
-  List<Node> getElementsByTagName(String localName) => _blink.Native_Document_getElementsByTagName_Callback(this, localName);
+  List<Node> getElementsByTagName(String localName) => _blink.BlinkDocument.$getElementsByTagName_Callback(this, localName);
 
-  Node importNode(Node node, [bool deep]) => _blink.Native_Document_importNode(this, node, deep);
+  Node importNode(Node node, [bool deep]) => _blink.BlinkDocument.$importNode(this, node, deep);
 
   @DomName('Document.queryCommandEnabled')
   @DocsEditable()
-  bool queryCommandEnabled(String command) => _blink.Native_Document_queryCommandEnabled_Callback(this, command);
+  bool queryCommandEnabled(String command) => _blink.BlinkDocument.$queryCommandEnabled_Callback(this, command);
 
   @DomName('Document.queryCommandIndeterm')
   @DocsEditable()
-  bool queryCommandIndeterm(String command) => _blink.Native_Document_queryCommandIndeterm_Callback(this, command);
+  bool queryCommandIndeterm(String command) => _blink.BlinkDocument.$queryCommandIndeterm_Callback(this, command);
 
   @DomName('Document.queryCommandState')
   @DocsEditable()
-  bool queryCommandState(String command) => _blink.Native_Document_queryCommandState_Callback(this, command);
+  bool queryCommandState(String command) => _blink.BlinkDocument.$queryCommandState_Callback(this, command);
 
   @DomName('Document.queryCommandSupported')
   @DocsEditable()
-  bool queryCommandSupported(String command) => _blink.Native_Document_queryCommandSupported_Callback(this, command);
+  bool queryCommandSupported(String command) => _blink.BlinkDocument.$queryCommandSupported_Callback(this, command);
 
   @DomName('Document.queryCommandValue')
   @DocsEditable()
-  String queryCommandValue(String command) => _blink.Native_Document_queryCommandValue_Callback(this, command);
+  String queryCommandValue(String command) => _blink.BlinkDocument.$queryCommandValue_Callback(this, command);
 
   /**
    * Finds the first descendant element of this document that matches the
@@ -7864,11 +7864,11 @@
    */
   @DomName('Document.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) => _blink.Native_Document_querySelector_Callback(this, selectors);
+  Element querySelector(String selectors) => _blink.BlinkDocument.$querySelector_Callback(this, selectors);
 
   @DomName('Document.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => _blink.Native_Document_querySelectorAll_Callback(this, selectors);
+  List<Node> _querySelectorAll(String selectors) => _blink.BlinkDocument.$querySelectorAll_Callback(this, selectors);
 
   @DomName('Document.webkitExitFullscreen')
   @DocsEditable()
@@ -7876,7 +7876,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
-  void _webkitExitFullscreen() => _blink.Native_Document_webkitExitFullscreen_Callback(this);
+  void _webkitExitFullscreen() => _blink.BlinkDocument.$webkitExitFullscreen_Callback(this);
 
   @DomName('Document.webkitExitPointerLock')
   @DocsEditable()
@@ -7884,23 +7884,23 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-exitPointerLock-void
-  void _webkitExitPointerLock() => _blink.Native_Document_webkitExitPointerLock_Callback(this);
+  void _webkitExitPointerLock() => _blink.BlinkDocument.$webkitExitPointerLock_Callback(this);
 
   @DomName('Document.childElementCount')
   @DocsEditable()
-  int get _childElementCount => _blink.Native_Document_childElementCount_Getter(this);
+  int get _childElementCount => _blink.BlinkDocument.$childElementCount_Getter(this);
 
   @DomName('Document.children')
   @DocsEditable()
-  List<Node> get _children => _blink.Native_Document_children_Getter(this);
+  List<Node> get _children => _blink.BlinkDocument.$children_Getter(this);
 
   @DomName('Document.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild => _blink.Native_Document_firstElementChild_Getter(this);
+  Element get _firstElementChild => _blink.BlinkDocument.$firstElementChild_Getter(this);
 
   @DomName('Document.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild => _blink.Native_Document_lastElementChild_Getter(this);
+  Element get _lastElementChild => _blink.BlinkDocument.$lastElementChild_Getter(this);
 
   /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
@@ -8380,23 +8380,23 @@
    */
   @DomName('DocumentFragment.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) => _blink.Native_DocumentFragment_querySelector_Callback(this, selectors);
+  Element querySelector(String selectors) => _blink.BlinkDocumentFragment.$querySelector_Callback(this, selectors);
 
   @DomName('DocumentFragment.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => _blink.Native_DocumentFragment_querySelectorAll_Callback(this, selectors);
+  List<Node> _querySelectorAll(String selectors) => _blink.BlinkDocumentFragment.$querySelectorAll_Callback(this, selectors);
 
   @DomName('DocumentFragment.childElementCount')
   @DocsEditable()
-  int get _childElementCount => _blink.Native_DocumentFragment_childElementCount_Getter(this);
+  int get _childElementCount => _blink.BlinkDocumentFragment.$childElementCount_Getter(this);
 
   @DomName('DocumentFragment.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild => _blink.Native_DocumentFragment_firstElementChild_Getter(this);
+  Element get _firstElementChild => _blink.BlinkDocumentFragment.$firstElementChild_Getter(this);
 
   @DomName('DocumentFragment.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild => _blink.Native_DocumentFragment_lastElementChild_Getter(this);
+  Element get _lastElementChild => _blink.BlinkDocumentFragment.$lastElementChild_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8415,11 +8415,11 @@
   @DomName('DOMError.message')
   @DocsEditable()
   @Experimental() // untriaged
-  String get message => _blink.Native_DOMError_message_Getter(this);
+  String get message => _blink.BlinkDOMError.$message_Getter(this);
 
   @DomName('DOMError.name')
   @DocsEditable()
-  String get name => _blink.Native_DOMError_name_Getter(this);
+  String get name => _blink.BlinkDOMError.$name_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -8458,15 +8458,15 @@
 
   @DomName('DOMException.message')
   @DocsEditable()
-  String get message => _blink.Native_DOMException_message_Getter(this);
+  String get message => _blink.BlinkDOMException.$message_Getter(this);
 
   @DomName('DOMException.name')
   @DocsEditable()
-  String get name => _blink.Native_DOMException_name_Getter(this);
+  String get name => _blink.BlinkDOMException.$name_Getter(this);
 
   @DomName('DOMException.toString')
   @DocsEditable()
-  String toString() => _blink.Native_DOMException_toString_Callback(this);
+  String toString() => _blink.BlinkDOMException.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8484,19 +8484,19 @@
 
   @DomName('DOMImplementation.createDocument')
   @DocsEditable()
-  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) => _blink.Native_DOMImplementation_createDocument_Callback(this, namespaceURI, qualifiedName, doctype);
+  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) => _blink.BlinkDOMImplementation.$createDocument_Callback(this, namespaceURI, qualifiedName, doctype);
 
   @DomName('DOMImplementation.createDocumentType')
   @DocsEditable()
-  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) => _blink.Native_DOMImplementation_createDocumentType_Callback(this, qualifiedName, publicId, systemId);
+  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) => _blink.BlinkDOMImplementation.$createDocumentType_Callback(this, qualifiedName, publicId, systemId);
 
   @DomName('DOMImplementation.createHTMLDocument')
   @DocsEditable()
-  HtmlDocument createHtmlDocument(String title) => _blink.Native_DOMImplementation_createHTMLDocument_Callback(this, title);
+  HtmlDocument createHtmlDocument(String title) => _blink.BlinkDOMImplementation.$createHTMLDocument_Callback(this, title);
 
   @DomName('DOMImplementation.hasFeature')
   @DocsEditable()
-  bool hasFeature(String feature, String version) => _blink.Native_DOMImplementation_hasFeature_Callback(this, feature, version);
+  bool hasFeature(String feature, String version) => _blink.BlinkDOMImplementation.$hasFeature_Callback(this, feature, version);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8514,11 +8514,11 @@
 
   @DomName('DOMParser.DOMParser')
   @DocsEditable()
-  factory DomParser() => _blink.Native_DOMParser_DomParser();
+  factory DomParser() => _blink.BlinkDOMParser.$mkDomParser();
 
   @DomName('DOMParser.parseFromString')
   @DocsEditable()
-  Document parseFromString(String str, String contentType) => _blink.Native_DOMParser_parseFromString_Callback(this, str, contentType);
+  Document parseFromString(String str, String contentType) => _blink.BlinkDOMParser.$parseFromString_Callback(this, str, contentType);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8536,15 +8536,15 @@
 
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
-  String get value => _blink.Native_DOMSettableTokenList_value_Getter(this);
+  String get value => _blink.BlinkDOMSettableTokenList.$value_Getter(this);
 
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_DOMSettableTokenList_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkDOMSettableTokenList.$value_Setter(this, value);
 
   @DomName('DOMSettableTokenList.__getter__')
   @DocsEditable()
-  String __getter__(int index) => _blink.Native_DOMSettableTokenList___getter___Callback(this, index);
+  String __getter__(int index) => _blink.BlinkDOMSettableTokenList.$__getter___Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8562,15 +8562,15 @@
 
   @DomName('DOMStringList.length')
   @DocsEditable()
-  int get length => _blink.Native_DOMStringList_length_Getter(this);
+  int get length => _blink.BlinkDOMStringList.$length_Getter(this);
 
   String operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_DOMStringList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkDOMStringList.$NativeIndexed_Getter(this, index);
   }
 
-  String _nativeIndexedGetter(int index) => _blink.Native_DOMStringList_NativeIndexed_Getter(this, index);
+  String _nativeIndexedGetter(int index) => _blink.BlinkDOMStringList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, String value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -8612,11 +8612,11 @@
 
   @DomName('DOMStringList.contains')
   @DocsEditable()
-  bool contains(String string) => _blink.Native_DOMStringList_contains_Callback(this, string);
+  bool contains(String string) => _blink.BlinkDOMStringList.$contains_Callback(this, string);
 
   @DomName('DOMStringList.item')
   @DocsEditable()
-  String item(int index) => _blink.Native_DOMStringList_item_Callback(this, index);
+  String item(int index) => _blink.BlinkDOMStringList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8632,11 +8632,11 @@
   // To suppress missing implicit constructor warnings.
   factory DomStringMap._() { throw new UnsupportedError("Not supported"); }
 
-  bool __delete__(index_OR_name) => _blink.Native_DOMStringMap___delete__(this, index_OR_name);
+  bool __delete__(index_OR_name) => _blink.BlinkDOMStringMap.$__delete__(this, index_OR_name);
 
-  String __getter__(index_OR_name) => _blink.Native_DOMStringMap___getter__(this, index_OR_name);
+  String __getter__(index_OR_name) => _blink.BlinkDOMStringMap.$__getter__(this, index_OR_name);
 
-  void __setter__(index_OR_name, String value) => _blink.Native_DOMStringMap___setter__(this, index_OR_name, value);
+  void __setter__(index_OR_name, String value) => _blink.BlinkDOMStringMap.$__setter__(this, index_OR_name, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8654,21 +8654,21 @@
 
   @DomName('DOMTokenList.length')
   @DocsEditable()
-  int get length => _blink.Native_DOMTokenList_length_Getter(this);
+  int get length => _blink.BlinkDOMTokenList.$length_Getter(this);
 
   @DomName('DOMTokenList.contains')
   @DocsEditable()
-  bool contains(String token) => _blink.Native_DOMTokenList_contains_Callback(this, token);
+  bool contains(String token) => _blink.BlinkDOMTokenList.$contains_Callback(this, token);
 
   @DomName('DOMTokenList.item')
   @DocsEditable()
-  String item(int index) => _blink.Native_DOMTokenList_item_Callback(this, index);
+  String item(int index) => _blink.BlinkDOMTokenList.$item_Callback(this, index);
 
   @DomName('DOMTokenList.toString')
   @DocsEditable()
-  String toString() => _blink.Native_DOMTokenList_toString_Callback(this);
+  String toString() => _blink.BlinkDOMTokenList.$toString_Callback(this);
 
-  bool toggle(String token, [bool force]) => _blink.Native_DOMTokenList_toggle(this, token, force);
+  bool toggle(String token, [bool force]) => _blink.BlinkDOMTokenList.$toggle(this, token, force);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10548,59 +10548,59 @@
 
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get offsetHeight => _blink.Native_Element_offsetHeight_Getter(this).round();
+  int get offsetHeight => _blink.BlinkElement.$offsetHeight_Getter(this).round();
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get offsetLeft => _blink.Native_Element_offsetLeft_Getter(this).round();
+  int get offsetLeft => _blink.BlinkElement.$offsetLeft_Getter(this).round();
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get offsetTop => _blink.Native_Element_offsetTop_Getter(this).round();
+  int get offsetTop => _blink.BlinkElement.$offsetTop_Getter(this).round();
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get offsetWidth => _blink.Native_Element_offsetWidth_Getter(this).round();
+  int get offsetWidth => _blink.BlinkElement.$offsetWidth_Getter(this).round();
 
   @DomName('Element.clientHeight')
   @DocsEditable()
-  int get clientHeight => _blink.Native_Element_clientHeight_Getter(this).round();
+  int get clientHeight => _blink.BlinkElement.$clientHeight_Getter(this).round();
 
   @DomName('Element.clientLeft')
   @DocsEditable()
-  int get clientLeft => _blink.Native_Element_clientLeft_Getter(this).round();
+  int get clientLeft => _blink.BlinkElement.$clientLeft_Getter(this).round();
 
   @DomName('Element.clientTop')
   @DocsEditable()
-  int get clientTop => _blink.Native_Element_clientTop_Getter(this).round();
+  int get clientTop => _blink.BlinkElement.$clientTop_Getter(this).round();
 
   @DomName('Element.clientWidth')
   @DocsEditable()
-  int get clientWidth => _blink.Native_Element_clientWidth_Getter(this).round();
+  int get clientWidth => _blink.BlinkElement.$clientWidth_Getter(this).round();
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get scrollHeight => _blink.Native_Element_scrollHeight_Getter(this).round();
+  int get scrollHeight => _blink.BlinkElement.$scrollHeight_Getter(this).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int get scrollLeft => _blink.Native_Element_scrollLeft_Getter(this).round();
+  int get scrollLeft => _blink.BlinkElement.$scrollLeft_Getter(this).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set scrollLeft(int value) => _blink.Native_Element_scrollLeft_Setter(this, value.round());
+  void set scrollLeft(int value) => _blink.BlinkElement.$scrollLeft_Setter(this, value.round());
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int get scrollTop => _blink.Native_Element_scrollTop_Getter(this).round();
+  int get scrollTop => _blink.BlinkElement.$scrollTop_Getter(this).round();
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set scrollTop(int value) => _blink.Native_Element_scrollTop_Setter(this, value.round());
+  void set scrollTop(int value) => _blink.BlinkElement.$scrollTop_Setter(this, value.round());
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get scrollWidth => _blink.Native_Element_scrollWidth_Getter(this).round();
+  int get scrollWidth => _blink.BlinkElement.$scrollWidth_Getter(this).round();
 
   // To suppress missing implicit constructor warnings.
   factory Element._() { throw new UnsupportedError("Not supported"); }
@@ -11209,146 +11209,146 @@
 
   @DomName('Element.attributes')
   @DocsEditable()
-  _NamedNodeMap get _attributes => _blink.Native_Element_attributes_Getter(this);
+  _NamedNodeMap get _attributes => _blink.BlinkElement.$attributes_Getter(this);
 
   @DomName('Element.className')
   @DocsEditable()
-  String get className => _blink.Native_Element_className_Getter(this);
+  String get className => _blink.BlinkElement.$className_Getter(this);
 
   @DomName('Element.className')
   @DocsEditable()
-  void set className(String value) => _blink.Native_Element_className_Setter(this, value);
+  void set className(String value) => _blink.BlinkElement.$className_Setter(this, value);
 
   @DomName('Element.clientHeight')
   @DocsEditable()
-  int get _clientHeight => _blink.Native_Element_clientHeight_Getter(this);
+  int get _clientHeight => _blink.BlinkElement.$clientHeight_Getter(this);
 
   @DomName('Element.clientLeft')
   @DocsEditable()
-  int get _clientLeft => _blink.Native_Element_clientLeft_Getter(this);
+  int get _clientLeft => _blink.BlinkElement.$clientLeft_Getter(this);
 
   @DomName('Element.clientTop')
   @DocsEditable()
-  int get _clientTop => _blink.Native_Element_clientTop_Getter(this);
+  int get _clientTop => _blink.BlinkElement.$clientTop_Getter(this);
 
   @DomName('Element.clientWidth')
   @DocsEditable()
-  int get _clientWidth => _blink.Native_Element_clientWidth_Getter(this);
+  int get _clientWidth => _blink.BlinkElement.$clientWidth_Getter(this);
 
   @DomName('Element.id')
   @DocsEditable()
-  String get id => _blink.Native_Element_id_Getter(this);
+  String get id => _blink.BlinkElement.$id_Getter(this);
 
   @DomName('Element.id')
   @DocsEditable()
-  void set id(String value) => _blink.Native_Element_id_Setter(this, value);
+  void set id(String value) => _blink.BlinkElement.$id_Setter(this, value);
 
   @DomName('Element.innerHTML')
   @DocsEditable()
-  String get _innerHtml => _blink.Native_Element_innerHTML_Getter(this);
+  String get _innerHtml => _blink.BlinkElement.$innerHTML_Getter(this);
 
   @DomName('Element.innerHTML')
   @DocsEditable()
-  void set _innerHtml(String value) => _blink.Native_Element_innerHTML_Setter(this, value);
+  void set _innerHtml(String value) => _blink.BlinkElement.$innerHTML_Setter(this, value);
 
   @DomName('Element.localName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _localName => _blink.Native_Element_localName_Getter(this);
+  String get _localName => _blink.BlinkElement.$localName_Getter(this);
 
   @DomName('Element.namespaceURI')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _namespaceUri => _blink.Native_Element_namespaceURI_Getter(this);
+  String get _namespaceUri => _blink.BlinkElement.$namespaceURI_Getter(this);
 
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get _offsetHeight => _blink.Native_Element_offsetHeight_Getter(this);
+  int get _offsetHeight => _blink.BlinkElement.$offsetHeight_Getter(this);
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get _offsetLeft => _blink.Native_Element_offsetLeft_Getter(this);
+  int get _offsetLeft => _blink.BlinkElement.$offsetLeft_Getter(this);
 
   @DomName('Element.offsetParent')
   @DocsEditable()
-  Element get offsetParent => _blink.Native_Element_offsetParent_Getter(this);
+  Element get offsetParent => _blink.BlinkElement.$offsetParent_Getter(this);
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get _offsetTop => _blink.Native_Element_offsetTop_Getter(this);
+  int get _offsetTop => _blink.BlinkElement.$offsetTop_Getter(this);
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get _offsetWidth => _blink.Native_Element_offsetWidth_Getter(this);
+  int get _offsetWidth => _blink.BlinkElement.$offsetWidth_Getter(this);
 
   @DomName('Element.outerHTML')
   @DocsEditable()
-  String get outerHtml => _blink.Native_Element_outerHTML_Getter(this);
+  String get outerHtml => _blink.BlinkElement.$outerHTML_Getter(this);
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get _scrollHeight => _blink.Native_Element_scrollHeight_Getter(this);
+  int get _scrollHeight => _blink.BlinkElement.$scrollHeight_Getter(this);
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int get _scrollLeft => _blink.Native_Element_scrollLeft_Getter(this);
+  int get _scrollLeft => _blink.BlinkElement.$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.BlinkElement.$scrollLeft_Setter(this, value);
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int get _scrollTop => _blink.Native_Element_scrollTop_Getter(this);
+  int get _scrollTop => _blink.BlinkElement.$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.BlinkElement.$scrollTop_Setter(this, value);
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get _scrollWidth => _blink.Native_Element_scrollWidth_Getter(this);
+  int get _scrollWidth => _blink.BlinkElement.$scrollWidth_Getter(this);
 
   @DomName('Element.shadowRoot')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
   @Experimental()
-  ShadowRoot get shadowRoot => _blink.Native_Element_shadowRoot_Getter(this);
+  ShadowRoot get shadowRoot => _blink.BlinkElement.$shadowRoot_Getter(this);
 
   @DomName('Element.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.Native_Element_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkElement.$style_Getter(this);
 
   @DomName('Element.tagName')
   @DocsEditable()
-  String get tagName => _blink.Native_Element_tagName_Getter(this);
+  String get tagName => _blink.BlinkElement.$tagName_Getter(this);
 
-  Animation animate(List<Map> keyframes, [timingInput]) => _blink.Native_Element_animate(this, keyframes, timingInput);
+  Animation animate(List<Map> keyframes, [timingInput]) => _blink.BlinkElement.$animate(this, keyframes, timingInput);
 
   @DomName('Element.blur')
   @DocsEditable()
-  void blur() => _blink.Native_Element_blur_Callback(this);
+  void blur() => _blink.BlinkElement.$blur_Callback(this);
 
   @DomName('Element.createShadowRoot')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
-  ShadowRoot createShadowRoot() => _blink.Native_Element_createShadowRoot_Callback(this);
+  ShadowRoot createShadowRoot() => _blink.BlinkElement.$createShadowRoot_Callback(this);
 
   @DomName('Element.focus')
   @DocsEditable()
-  void focus() => _blink.Native_Element_focus_Callback(this);
+  void focus() => _blink.BlinkElement.$focus_Callback(this);
 
   @DomName('Element.getAttribute')
   @DocsEditable()
   @Experimental() // untriaged
-  String getAttribute(String name) => _blink.Native_Element_getAttribute_Callback(this, name);
+  String getAttribute(String name) => _blink.BlinkElement.$getAttribute_Callback(this, name);
 
   @DomName('Element.getAttributeNS')
   @DocsEditable()
   @Experimental() // untriaged
-  String getAttributeNS(String namespaceURI, String localName) => _blink.Native_Element_getAttributeNS_Callback(this, namespaceURI, localName);
+  String getAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.$getAttributeNS_Callback(this, namespaceURI, localName);
 
   /**
    * Returns the smallest bounding rectangle that encompasses this element's
@@ -11365,7 +11365,7 @@
    */
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
-  Rectangle getBoundingClientRect() => _blink.Native_Element_getBoundingClientRect_Callback(this);
+  Rectangle getBoundingClientRect() => _blink.BlinkElement.$getBoundingClientRect_Callback(this);
 
   /**
    * Returns a list of bounding rectangles for each box associated with this
@@ -11382,7 +11382,7 @@
    */
   @DomName('Element.getClientRects')
   @DocsEditable()
-  List<Rectangle> getClientRects() => _blink.Native_Element_getClientRects_Callback(this);
+  List<Rectangle> getClientRects() => _blink.BlinkElement.$getClientRects_Callback(this);
 
   /**
    * Returns a list of shadow DOM insertion points to which this element is
@@ -11397,7 +11397,7 @@
   @DomName('Element.getDestinationInsertionPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDestinationInsertionPoints() => _blink.Native_Element_getDestinationInsertionPoints_Callback(this);
+  List<Node> getDestinationInsertionPoints() => _blink.BlinkElement.$getDestinationInsertionPoints_Callback(this);
 
   /**
    * Returns a list of nodes with the given class name inside this element.
@@ -11412,39 +11412,39 @@
    */
   @DomName('Element.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String classNames) => _blink.Native_Element_getElementsByClassName_Callback(this, classNames);
+  List<Node> getElementsByClassName(String classNames) => _blink.BlinkElement.$getElementsByClassName_Callback(this, classNames);
 
   @DomName('Element.getElementsByTagName')
   @DocsEditable()
-  List<Node> _getElementsByTagName(String name) => _blink.Native_Element_getElementsByTagName_Callback(this, name);
+  List<Node> _getElementsByTagName(String name) => _blink.BlinkElement.$getElementsByTagName_Callback(this, name);
 
   @DomName('Element.hasAttribute')
   @DocsEditable()
-  bool _hasAttribute(String name) => _blink.Native_Element_hasAttribute_Callback(this, name);
+  bool _hasAttribute(String name) => _blink.BlinkElement.$hasAttribute_Callback(this, name);
 
   @DomName('Element.hasAttributeNS')
   @DocsEditable()
-  bool _hasAttributeNS(String namespaceURI, String localName) => _blink.Native_Element_hasAttributeNS_Callback(this, namespaceURI, localName);
+  bool _hasAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.$hasAttributeNS_Callback(this, namespaceURI, localName);
 
   @DomName('Element.insertAdjacentElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element insertAdjacentElement(String where, Element element) => _blink.Native_Element_insertAdjacentElement_Callback(this, where, element);
+  Element insertAdjacentElement(String where, Element element) => _blink.BlinkElement.$insertAdjacentElement_Callback(this, where, element);
 
   @DomName('Element.insertAdjacentHTML')
   @DocsEditable()
   @Experimental() // untriaged
-  void insertAdjacentHtml(String where, String html) => _blink.Native_Element_insertAdjacentHTML_Callback(this, where, html);
+  void insertAdjacentHtml(String where, String html) => _blink.BlinkElement.$insertAdjacentHTML_Callback(this, where, html);
 
   @DomName('Element.insertAdjacentText')
   @DocsEditable()
   @Experimental() // untriaged
-  void insertAdjacentText(String where, String text) => _blink.Native_Element_insertAdjacentText_Callback(this, where, text);
+  void insertAdjacentText(String where, String text) => _blink.BlinkElement.$insertAdjacentText_Callback(this, where, text);
 
   @DomName('Element.matches')
   @DocsEditable()
   @Experimental() // untriaged
-  bool matches(String selectors) => _blink.Native_Element_matches_Callback(this, selectors);
+  bool matches(String selectors) => _blink.BlinkElement.$matches_Callback(this, selectors);
 
   /**
    * Finds the first descendant element of this element that matches the
@@ -11464,19 +11464,19 @@
    */
   @DomName('Element.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) => _blink.Native_Element_querySelector_Callback(this, selectors);
+  Element querySelector(String selectors) => _blink.BlinkElement.$querySelector_Callback(this, selectors);
 
   @DomName('Element.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => _blink.Native_Element_querySelectorAll_Callback(this, selectors);
+  List<Node> _querySelectorAll(String selectors) => _blink.BlinkElement.$querySelectorAll_Callback(this, selectors);
 
   @DomName('Element.removeAttribute')
   @DocsEditable()
-  void _removeAttribute(String name) => _blink.Native_Element_removeAttribute_Callback(this, name);
+  void _removeAttribute(String name) => _blink.BlinkElement.$removeAttribute_Callback(this, name);
 
   @DomName('Element.removeAttributeNS')
   @DocsEditable()
-  void _removeAttributeNS(String namespaceURI, String localName) => _blink.Native_Element_removeAttributeNS_Callback(this, namespaceURI, localName);
+  void _removeAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.$removeAttributeNS_Callback(this, namespaceURI, localName);
 
   /**
    * Scrolls the element by a number of lines.
@@ -11488,7 +11488,7 @@
    */
   @DomName('Element.scrollByLines')
   @DocsEditable()
-  void scrollByLines(int lines) => _blink.Native_Element_scrollByLines_Callback(this, lines);
+  void scrollByLines(int lines) => _blink.BlinkElement.$scrollByLines_Callback(this, lines);
 
   /**
    * Scrolls the element by a number of pages.
@@ -11500,19 +11500,19 @@
    */
   @DomName('Element.scrollByPages')
   @DocsEditable()
-  void scrollByPages(int pages) => _blink.Native_Element_scrollByPages_Callback(this, pages);
+  void scrollByPages(int pages) => _blink.BlinkElement.$scrollByPages_Callback(this, pages);
 
-  void _scrollIntoView([bool alignWithTop]) => _blink.Native_Element__scrollIntoView(this, alignWithTop);
+  void _scrollIntoView([bool alignWithTop]) => _blink.BlinkElement.$_scrollIntoView(this, alignWithTop);
 
-  void _scrollIntoViewIfNeeded([bool centerIfNeeded]) => _blink.Native_Element__scrollIntoViewIfNeeded(this, centerIfNeeded);
+  void _scrollIntoViewIfNeeded([bool centerIfNeeded]) => _blink.BlinkElement.$_scrollIntoViewIfNeeded(this, centerIfNeeded);
 
   @DomName('Element.setAttribute')
   @DocsEditable()
-  void setAttribute(String name, String value) => _blink.Native_Element_setAttribute_Callback(this, name, value);
+  void setAttribute(String name, String value) => _blink.BlinkElement.$setAttribute_Callback(this, name, value);
 
   @DomName('Element.setAttributeNS')
   @DocsEditable()
-  void setAttributeNS(String namespaceURI, String qualifiedName, String value) => _blink.Native_Element_setAttributeNS_Callback(this, namespaceURI, qualifiedName, value);
+  void setAttributeNS(String namespaceURI, String qualifiedName, String value) => _blink.BlinkElement.$setAttributeNS_Callback(this, namespaceURI, qualifiedName, value);
 
   /**
    * Displays this element fullscreen.
@@ -11531,7 +11531,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
-  void requestFullscreen() => _blink.Native_Element_webkitRequestFullscreen_Callback(this);
+  void requestFullscreen() => _blink.BlinkElement.$webkitRequestFullscreen_Callback(this);
 
   /**
    * Locks the mouse pointer to this element.
@@ -11551,35 +11551,35 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Element-requestPointerLock-void
-  void requestPointerLock() => _blink.Native_Element_webkitRequestPointerLock_Callback(this);
+  void requestPointerLock() => _blink.BlinkElement.$webkitRequestPointerLock_Callback(this);
 
   @DomName('Element.nextElementSibling')
   @DocsEditable()
-  Element get nextElementSibling => _blink.Native_Element_nextElementSibling_Getter(this);
+  Element get nextElementSibling => _blink.BlinkElement.$nextElementSibling_Getter(this);
 
   @DomName('Element.previousElementSibling')
   @DocsEditable()
-  Element get previousElementSibling => _blink.Native_Element_previousElementSibling_Getter(this);
+  Element get previousElementSibling => _blink.BlinkElement.$previousElementSibling_Getter(this);
 
   @DomName('Element.remove')
   @DocsEditable()
-  void remove() => _blink.Native_Element_remove_Callback(this);
+  void remove() => _blink.BlinkElement.$remove_Callback(this);
 
   @DomName('Element.childElementCount')
   @DocsEditable()
-  int get _childElementCount => _blink.Native_Element_childElementCount_Getter(this);
+  int get _childElementCount => _blink.BlinkElement.$childElementCount_Getter(this);
 
   @DomName('Element.children')
   @DocsEditable()
-  List<Node> get _children => _blink.Native_Element_children_Getter(this);
+  List<Node> get _children => _blink.BlinkElement.$children_Getter(this);
 
   @DomName('Element.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild => _blink.Native_Element_firstElementChild_Getter(this);
+  Element get _firstElementChild => _blink.BlinkElement.$firstElementChild_Getter(this);
 
   @DomName('Element.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild => _blink.Native_Element_lastElementChild_Getter(this);
+  Element get _lastElementChild => _blink.BlinkElement.$lastElementChild_Getter(this);
 
   /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
@@ -12015,51 +12015,51 @@
 
   @DomName('HTMLEmbedElement.height')
   @DocsEditable()
-  String get height => _blink.Native_HTMLEmbedElement_height_Getter(this);
+  String get height => _blink.BlinkHTMLEmbedElement.$height_Getter(this);
 
   @DomName('HTMLEmbedElement.height')
   @DocsEditable()
-  void set height(String value) => _blink.Native_HTMLEmbedElement_height_Setter(this, value);
+  void set height(String value) => _blink.BlinkHTMLEmbedElement.$height_Setter(this, value);
 
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLEmbedElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLEmbedElement.$name_Getter(this);
 
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLEmbedElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLEmbedElement.$name_Setter(this, value);
 
   @DomName('HTMLEmbedElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLEmbedElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLEmbedElement.$src_Getter(this);
 
   @DomName('HTMLEmbedElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLEmbedElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLEmbedElement.$src_Setter(this, value);
 
   @DomName('HTMLEmbedElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLEmbedElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLEmbedElement.$type_Getter(this);
 
   @DomName('HTMLEmbedElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLEmbedElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLEmbedElement.$type_Setter(this, value);
 
   @DomName('HTMLEmbedElement.width')
   @DocsEditable()
-  String get width => _blink.Native_HTMLEmbedElement_width_Getter(this);
+  String get width => _blink.BlinkHTMLEmbedElement.$width_Getter(this);
 
   @DomName('HTMLEmbedElement.width')
   @DocsEditable()
-  void set width(String value) => _blink.Native_HTMLEmbedElement_width_Setter(this, value);
+  void set width(String value) => _blink.BlinkHTMLEmbedElement.$width_Setter(this, value);
 
   @DomName('HTMLEmbedElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) => _blink.Native_HTMLEmbedElement___getter___Callback(this, index_OR_name);
+  bool __getter__(index_OR_name) => _blink.BlinkHTMLEmbedElement.$__getter___Callback(this, index_OR_name);
 
   @DomName('HTMLEmbedElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) => _blink.Native_HTMLEmbedElement___setter___Callback(this, index_OR_name, value);
+  void __setter__(index_OR_name, Node value) => _blink.BlinkHTMLEmbedElement.$__setter___Callback(this, index_OR_name, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12090,25 +12090,25 @@
 
   @DomName('Entry.filesystem')
   @DocsEditable()
-  FileSystem get filesystem => _blink.Native_Entry_filesystem_Getter(this);
+  FileSystem get filesystem => _blink.BlinkEntry.$filesystem_Getter(this);
 
   @DomName('Entry.fullPath')
   @DocsEditable()
-  String get fullPath => _blink.Native_Entry_fullPath_Getter(this);
+  String get fullPath => _blink.BlinkEntry.$fullPath_Getter(this);
 
   @DomName('Entry.isDirectory')
   @DocsEditable()
-  bool get isDirectory => _blink.Native_Entry_isDirectory_Getter(this);
+  bool get isDirectory => _blink.BlinkEntry.$isDirectory_Getter(this);
 
   @DomName('Entry.isFile')
   @DocsEditable()
-  bool get isFile => _blink.Native_Entry_isFile_Getter(this);
+  bool get isFile => _blink.BlinkEntry.$isFile_Getter(this);
 
   @DomName('Entry.name')
   @DocsEditable()
-  String get name => _blink.Native_Entry_name_Getter(this);
+  String get name => _blink.BlinkEntry.$name_Getter(this);
 
-  void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_Entry__copyTo(this, parent, name, successCallback, errorCallback);
+  void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.BlinkEntry.$_copyTo(this, parent, name, successCallback, errorCallback);
 
   Future<Entry> copyTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
@@ -12120,7 +12120,7 @@
 
   @DomName('Entry.getMetadata')
   @DocsEditable()
-  void _getMetadata(MetadataCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_Entry_getMetadata_Callback(this, successCallback, errorCallback);
+  void _getMetadata(MetadataCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkEntry.$getMetadata_Callback(this, successCallback, errorCallback);
 
   Future<Metadata> getMetadata() {
     var completer = new Completer<Metadata>();
@@ -12132,7 +12132,7 @@
 
   @DomName('Entry.getParent')
   @DocsEditable()
-  void _getParent([_EntryCallback successCallback, _ErrorCallback errorCallback]) => _blink.Native_Entry_getParent_Callback(this, successCallback, errorCallback);
+  void _getParent([_EntryCallback successCallback, _ErrorCallback errorCallback]) => _blink.BlinkEntry.$getParent_Callback(this, successCallback, errorCallback);
 
   Future<Entry> getParent() {
     var completer = new Completer<Entry>();
@@ -12142,7 +12142,7 @@
     return completer.future;
   }
 
-  void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_Entry__moveTo(this, parent, name, successCallback, errorCallback);
+  void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.BlinkEntry.$_moveTo(this, parent, name, successCallback, errorCallback);
 
   Future<Entry> moveTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
@@ -12154,7 +12154,7 @@
 
   @DomName('Entry.remove')
   @DocsEditable()
-  void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_Entry_remove_Callback(this, successCallback, errorCallback);
+  void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkEntry.$remove_Callback(this, successCallback, errorCallback);
 
   Future remove() {
     var completer = new Completer();
@@ -12166,7 +12166,7 @@
 
   @DomName('Entry.toURL')
   @DocsEditable()
-  String toUrl() => _blink.Native_Entry_toURL_Callback(this);
+  String toUrl() => _blink.BlinkEntry.$toURL_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12208,24 +12208,24 @@
   @DomName('ErrorEvent.colno')
   @DocsEditable()
   @Experimental() // untriaged
-  int get colno => _blink.Native_ErrorEvent_colno_Getter(this);
+  int get colno => _blink.BlinkErrorEvent.$colno_Getter(this);
 
   @DomName('ErrorEvent.error')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get error => _blink.Native_ErrorEvent_error_Getter(this);
+  Object get error => _blink.BlinkErrorEvent.$error_Getter(this);
 
   @DomName('ErrorEvent.filename')
   @DocsEditable()
-  String get filename => _blink.Native_ErrorEvent_filename_Getter(this);
+  String get filename => _blink.BlinkErrorEvent.$filename_Getter(this);
 
   @DomName('ErrorEvent.lineno')
   @DocsEditable()
-  int get lineno => _blink.Native_ErrorEvent_lineno_Getter(this);
+  int get lineno => _blink.BlinkErrorEvent.$lineno_Getter(this);
 
   @DomName('ErrorEvent.message')
   @DocsEditable()
-  String get message => _blink.Native_ErrorEvent_message_Getter(this);
+  String get message => _blink.BlinkErrorEvent.$message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12328,11 +12328,11 @@
 
   @DomName('Event.bubbles')
   @DocsEditable()
-  bool get bubbles => _blink.Native_Event_bubbles_Getter(this);
+  bool get bubbles => _blink.BlinkEvent.$bubbles_Getter(this);
 
   @DomName('Event.cancelable')
   @DocsEditable()
-  bool get cancelable => _blink.Native_Event_cancelable_Getter(this);
+  bool get cancelable => _blink.BlinkEvent.$cancelable_Getter(this);
 
   /**
    * Access to the system's clipboard data during copy, cut, and paste events.
@@ -12349,19 +12349,19 @@
   @Experimental()
   // Part of copy/paste
   @Experimental() // nonstandard
-  DataTransfer get clipboardData => _blink.Native_Event_clipboardData_Getter(this);
+  DataTransfer get clipboardData => _blink.BlinkEvent.$clipboardData_Getter(this);
 
   @DomName('Event.currentTarget')
   @DocsEditable()
-  EventTarget get currentTarget => _blink.Native_Event_currentTarget_Getter(this);
+  EventTarget get currentTarget => _blink.BlinkEvent.$currentTarget_Getter(this);
 
   @DomName('Event.defaultPrevented')
   @DocsEditable()
-  bool get defaultPrevented => _blink.Native_Event_defaultPrevented_Getter(this);
+  bool get defaultPrevented => _blink.BlinkEvent.$defaultPrevented_Getter(this);
 
   @DomName('Event.eventPhase')
   @DocsEditable()
-  int get eventPhase => _blink.Native_Event_eventPhase_Getter(this);
+  int get eventPhase => _blink.BlinkEvent.$eventPhase_Getter(this);
 
   /**
    * This event's path, taking into account shadow DOM.
@@ -12376,35 +12376,35 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
   @Experimental()
-  List<Node> get path => _blink.Native_Event_path_Getter(this);
+  List<Node> get path => _blink.BlinkEvent.$path_Getter(this);
 
   @DomName('Event.target')
   @DocsEditable()
-  EventTarget get target => _blink.Native_Event_target_Getter(this);
+  EventTarget get target => _blink.BlinkEvent.$target_Getter(this);
 
   @DomName('Event.timeStamp')
   @DocsEditable()
-  int get timeStamp => _blink.Native_Event_timeStamp_Getter(this);
+  int get timeStamp => _blink.BlinkEvent.$timeStamp_Getter(this);
 
   @DomName('Event.type')
   @DocsEditable()
-  String get type => _blink.Native_Event_type_Getter(this);
+  String get type => _blink.BlinkEvent.$type_Getter(this);
 
   @DomName('Event.initEvent')
   @DocsEditable()
-  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) => _blink.Native_Event_initEvent_Callback(this, eventTypeArg, canBubbleArg, cancelableArg);
+  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) => _blink.BlinkEvent.$initEvent_Callback(this, eventTypeArg, canBubbleArg, cancelableArg);
 
   @DomName('Event.preventDefault')
   @DocsEditable()
-  void preventDefault() => _blink.Native_Event_preventDefault_Callback(this);
+  void preventDefault() => _blink.BlinkEvent.$preventDefault_Callback(this);
 
   @DomName('Event.stopImmediatePropagation')
   @DocsEditable()
-  void stopImmediatePropagation() => _blink.Native_Event_stopImmediatePropagation_Callback(this);
+  void stopImmediatePropagation() => _blink.BlinkEvent.$stopImmediatePropagation_Callback(this);
 
   @DomName('Event.stopPropagation')
   @DocsEditable()
-  void stopPropagation() => _blink.Native_Event_stopPropagation_Callback(this);
+  void stopPropagation() => _blink.BlinkEvent.$stopPropagation_Callback(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -12457,7 +12457,7 @@
 
   @DomName('EventSource.EventSource')
   @DocsEditable()
-  static EventSource _factoryEventSource(String url, [Map eventSourceInit]) => _blink.Native_EventSource_EventSource(url, eventSourceInit);
+  static EventSource _factoryEventSource(String url, [Map eventSourceInit]) => _blink.BlinkEventSource.$mkEventSource(url, eventSourceInit);
 
   @DomName('EventSource.CLOSED')
   @DocsEditable()
@@ -12473,19 +12473,19 @@
 
   @DomName('EventSource.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_EventSource_readyState_Getter(this);
+  int get readyState => _blink.BlinkEventSource.$readyState_Getter(this);
 
   @DomName('EventSource.url')
   @DocsEditable()
-  String get url => _blink.Native_EventSource_url_Getter(this);
+  String get url => _blink.BlinkEventSource.$url_Getter(this);
 
   @DomName('EventSource.withCredentials')
   @DocsEditable()
-  bool get withCredentials => _blink.Native_EventSource_withCredentials_Getter(this);
+  bool get withCredentials => _blink.BlinkEventSource.$withCredentials_Getter(this);
 
   @DomName('EventSource.close')
   @DocsEditable()
-  void close() => _blink.Native_EventSource_close_Callback(this);
+  void close() => _blink.BlinkEventSource.$close_Callback(this);
 
   /// Stream of `error` events handled by this [EventSource].
   @DomName('EventSource.onerror')
@@ -12610,15 +12610,15 @@
 
   @DomName('EventTarget.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_EventTarget_addEventListener_Callback(this, type, listener, useCapture);
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.BlinkEventTarget.$addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('EventTarget.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_EventTarget_dispatchEvent_Callback(this, event);
+  bool dispatchEvent(Event event) => _blink.BlinkEventTarget.$dispatchEvent_Callback(this, event);
 
   @DomName('EventTarget.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_EventTarget_removeEventListener_Callback(this, type, listener, useCapture);
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.BlinkEventTarget.$removeEventListener_Callback(this, type, listener, useCapture);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12647,51 +12647,51 @@
 
   @DomName('HTMLFieldSetElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLFieldSetElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLFieldSetElement.$disabled_Getter(this);
 
   @DomName('HTMLFieldSetElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLFieldSetElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLFieldSetElement.$disabled_Setter(this, value);
 
   @DomName('HTMLFieldSetElement.elements')
   @DocsEditable()
-  List<Node> get elements => _blink.Native_HTMLFieldSetElement_elements_Getter(this);
+  List<Node> get elements => _blink.BlinkHTMLFieldSetElement.$elements_Getter(this);
 
   @DomName('HTMLFieldSetElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLFieldSetElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLFieldSetElement.$form_Getter(this);
 
   @DomName('HTMLFieldSetElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLFieldSetElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLFieldSetElement.$name_Getter(this);
 
   @DomName('HTMLFieldSetElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLFieldSetElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLFieldSetElement.$name_Setter(this, value);
 
   @DomName('HTMLFieldSetElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLFieldSetElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLFieldSetElement.$type_Getter(this);
 
   @DomName('HTMLFieldSetElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLFieldSetElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLFieldSetElement.$validationMessage_Getter(this);
 
   @DomName('HTMLFieldSetElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLFieldSetElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLFieldSetElement.$validity_Getter(this);
 
   @DomName('HTMLFieldSetElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLFieldSetElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLFieldSetElement.$willValidate_Getter(this);
 
   @DomName('HTMLFieldSetElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLFieldSetElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLFieldSetElement.$checkValidity_Callback(this);
 
   @DomName('HTMLFieldSetElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLFieldSetElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLFieldSetElement.$setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12710,15 +12710,15 @@
   @DomName('File.lastModified')
   @DocsEditable()
   @Experimental() // untriaged
-  int get lastModified => _blink.Native_File_lastModified_Getter(this);
+  int get lastModified => _blink.BlinkFile.$lastModified_Getter(this);
 
   @DomName('File.lastModifiedDate')
   @DocsEditable()
-  DateTime get lastModifiedDate => _blink.Native_File_lastModifiedDate_Getter(this);
+  DateTime get lastModifiedDate => _blink.BlinkFile.$lastModifiedDate_Getter(this);
 
   @DomName('File.name')
   @DocsEditable()
-  String get name => _blink.Native_File_name_Getter(this);
+  String get name => _blink.BlinkFile.$name_Getter(this);
 
   @DomName('File.webkitRelativePath')
   @DocsEditable()
@@ -12726,7 +12726,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  String get relativePath => _blink.Native_File_webkitRelativePath_Getter(this);
+  String get relativePath => _blink.BlinkFile.$webkitRelativePath_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12757,7 +12757,7 @@
 
   @DomName('FileEntry.createWriter')
   @DocsEditable()
-  void _createWriter(_FileWriterCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_FileEntry_createWriter_Callback(this, successCallback, errorCallback);
+  void _createWriter(_FileWriterCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkFileEntry.$createWriter_Callback(this, successCallback, errorCallback);
 
   Future<FileWriter> createWriter() {
     var completer = new Completer<FileWriter>();
@@ -12769,7 +12769,7 @@
 
   @DomName('FileEntry.file')
   @DocsEditable()
-  void _file(_FileCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_FileEntry_file_Callback(this, successCallback, errorCallback);
+  void _file(_FileCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkFileEntry.$file_Callback(this, successCallback, errorCallback);
 
   Future<File> file() {
     var completer = new Completer<File>();
@@ -12845,7 +12845,7 @@
 
   @DomName('FileError.code')
   @DocsEditable()
-  int get code => _blink.Native_FileError_code_Getter(this);
+  int get code => _blink.BlinkFileError.$code_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12863,15 +12863,15 @@
 
   @DomName('FileList.length')
   @DocsEditable()
-  int get length => _blink.Native_FileList_length_Getter(this);
+  int get length => _blink.BlinkFileList.$length_Getter(this);
 
   File operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_FileList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkFileList.$NativeIndexed_Getter(this, index);
   }
 
-  File _nativeIndexedGetter(int index) => _blink.Native_FileList_NativeIndexed_Getter(this, index);
+  File _nativeIndexedGetter(int index) => _blink.BlinkFileList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, File value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -12913,7 +12913,7 @@
 
   @DomName('FileList.item')
   @DocsEditable()
-  File item(int index) => _blink.Native_FileList_item_Callback(this, index);
+  File item(int index) => _blink.BlinkFileList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
@@ -12991,7 +12991,7 @@
 
   @DomName('FileReader.FileReader')
   @DocsEditable()
-  factory FileReader() => _blink.Native_FileReader_FileReader();
+  factory FileReader() => _blink.BlinkFileReader.$mkFileReader();
 
   @DomName('FileReader.DONE')
   @DocsEditable()
@@ -13007,29 +13007,29 @@
 
   @DomName('FileReader.error')
   @DocsEditable()
-  FileError get error => _blink.Native_FileReader_error_Getter(this);
+  FileError get error => _blink.BlinkFileReader.$error_Getter(this);
 
   @DomName('FileReader.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_FileReader_readyState_Getter(this);
+  int get readyState => _blink.BlinkFileReader.$readyState_Getter(this);
 
   @DomName('FileReader.result')
   @DocsEditable()
-  Object get result => _blink.Native_FileReader_result_Getter(this);
+  Object get result => _blink.BlinkFileReader.$result_Getter(this);
 
   @DomName('FileReader.abort')
   @DocsEditable()
-  void abort() => _blink.Native_FileReader_abort_Callback(this);
+  void abort() => _blink.BlinkFileReader.$abort_Callback(this);
 
   @DomName('FileReader.readAsArrayBuffer')
   @DocsEditable()
-  void readAsArrayBuffer(Blob blob) => _blink.Native_FileReader_readAsArrayBuffer_Callback(this, blob);
+  void readAsArrayBuffer(Blob blob) => _blink.BlinkFileReader.$readAsArrayBuffer_Callback(this, blob);
 
   @DomName('FileReader.readAsDataURL')
   @DocsEditable()
-  void readAsDataUrl(Blob blob) => _blink.Native_FileReader_readAsDataURL_Callback(this, blob);
+  void readAsDataUrl(Blob blob) => _blink.BlinkFileReader.$readAsDataURL_Callback(this, blob);
 
-  void readAsText(Blob blob, [String encoding]) => _blink.Native_FileReader_readAsText(this, blob, encoding);
+  void readAsText(Blob blob, [String encoding]) => _blink.BlinkFileReader.$readAsText(this, blob, encoding);
 
   /// Stream of `abort` events handled by this [FileReader].
   @DomName('FileReader.onabort')
@@ -13079,7 +13079,7 @@
   @DomName('Stream.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.Native_Stream_type_Getter(this);
+  String get type => _blink.BlinkStream.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13103,11 +13103,11 @@
 
   @DomName('DOMFileSystem.name')
   @DocsEditable()
-  String get name => _blink.Native_DOMFileSystem_name_Getter(this);
+  String get name => _blink.BlinkDOMFileSystem.$name_Getter(this);
 
   @DomName('DOMFileSystem.root')
   @DocsEditable()
-  DirectoryEntry get root => _blink.Native_DOMFileSystem_root_Getter(this);
+  DirectoryEntry get root => _blink.BlinkDOMFileSystem.$root_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13210,35 +13210,35 @@
 
   @DomName('FileWriter.error')
   @DocsEditable()
-  FileError get error => _blink.Native_FileWriter_error_Getter(this);
+  FileError get error => _blink.BlinkFileWriter.$error_Getter(this);
 
   @DomName('FileWriter.length')
   @DocsEditable()
-  int get length => _blink.Native_FileWriter_length_Getter(this);
+  int get length => _blink.BlinkFileWriter.$length_Getter(this);
 
   @DomName('FileWriter.position')
   @DocsEditable()
-  int get position => _blink.Native_FileWriter_position_Getter(this);
+  int get position => _blink.BlinkFileWriter.$position_Getter(this);
 
   @DomName('FileWriter.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_FileWriter_readyState_Getter(this);
+  int get readyState => _blink.BlinkFileWriter.$readyState_Getter(this);
 
   @DomName('FileWriter.abort')
   @DocsEditable()
-  void abort() => _blink.Native_FileWriter_abort_Callback(this);
+  void abort() => _blink.BlinkFileWriter.$abort_Callback(this);
 
   @DomName('FileWriter.seek')
   @DocsEditable()
-  void seek(int position) => _blink.Native_FileWriter_seek_Callback(this, position);
+  void seek(int position) => _blink.BlinkFileWriter.$seek_Callback(this, position);
 
   @DomName('FileWriter.truncate')
   @DocsEditable()
-  void truncate(int size) => _blink.Native_FileWriter_truncate_Callback(this, size);
+  void truncate(int size) => _blink.BlinkFileWriter.$truncate_Callback(this, size);
 
   @DomName('FileWriter.write')
   @DocsEditable()
-  void write(Blob data) => _blink.Native_FileWriter_write_Callback(this, data);
+  void write(Blob data) => _blink.BlinkFileWriter.$write_Callback(this, data);
 
   /// Stream of `abort` events handled by this [FileWriter].
   @DomName('FileWriter.onabort')
@@ -13297,7 +13297,7 @@
 
   @DomName('FocusEvent.relatedTarget')
   @DocsEditable()
-  EventTarget get relatedTarget => _blink.Native_FocusEvent_relatedTarget_Getter(this);
+  EventTarget get relatedTarget => _blink.BlinkFocusEvent.$relatedTarget_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13316,87 +13316,87 @@
 
   @DomName('FontFace.FontFace')
   @DocsEditable()
-  factory FontFace(String family, String source, Map descriptors) => _blink.Native_FontFace_FontFace(family, source, descriptors);
+  factory FontFace(String family, String source, Map descriptors) => _blink.BlinkFontFace.$mkFontFace(family, source, descriptors);
 
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
-  String get family => _blink.Native_FontFace_family_Getter(this);
+  String get family => _blink.BlinkFontFace.$family_Getter(this);
 
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
-  void set family(String value) => _blink.Native_FontFace_family_Setter(this, value);
+  void set family(String value) => _blink.BlinkFontFace.$family_Setter(this, value);
 
   @DomName('FontFace.featureSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  String get featureSettings => _blink.Native_FontFace_featureSettings_Getter(this);
+  String get featureSettings => _blink.BlinkFontFace.$featureSettings_Getter(this);
 
   @DomName('FontFace.featureSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  void set featureSettings(String value) => _blink.Native_FontFace_featureSettings_Setter(this, value);
+  void set featureSettings(String value) => _blink.BlinkFontFace.$featureSettings_Setter(this, value);
 
   @DomName('FontFace.status')
   @DocsEditable()
   @Experimental() // untriaged
-  String get status => _blink.Native_FontFace_status_Getter(this);
+  String get status => _blink.BlinkFontFace.$status_Getter(this);
 
   @DomName('FontFace.stretch')
   @DocsEditable()
   @Experimental() // untriaged
-  String get stretch => _blink.Native_FontFace_stretch_Getter(this);
+  String get stretch => _blink.BlinkFontFace.$stretch_Getter(this);
 
   @DomName('FontFace.stretch')
   @DocsEditable()
   @Experimental() // untriaged
-  void set stretch(String value) => _blink.Native_FontFace_stretch_Setter(this, value);
+  void set stretch(String value) => _blink.BlinkFontFace.$stretch_Setter(this, value);
 
   @DomName('FontFace.style')
   @DocsEditable()
   @Experimental() // untriaged
-  String get style => _blink.Native_FontFace_style_Getter(this);
+  String get style => _blink.BlinkFontFace.$style_Getter(this);
 
   @DomName('FontFace.style')
   @DocsEditable()
   @Experimental() // untriaged
-  void set style(String value) => _blink.Native_FontFace_style_Setter(this, value);
+  void set style(String value) => _blink.BlinkFontFace.$style_Setter(this, value);
 
   @DomName('FontFace.unicodeRange')
   @DocsEditable()
   @Experimental() // untriaged
-  String get unicodeRange => _blink.Native_FontFace_unicodeRange_Getter(this);
+  String get unicodeRange => _blink.BlinkFontFace.$unicodeRange_Getter(this);
 
   @DomName('FontFace.unicodeRange')
   @DocsEditable()
   @Experimental() // untriaged
-  void set unicodeRange(String value) => _blink.Native_FontFace_unicodeRange_Setter(this, value);
+  void set unicodeRange(String value) => _blink.BlinkFontFace.$unicodeRange_Setter(this, value);
 
   @DomName('FontFace.variant')
   @DocsEditable()
   @Experimental() // untriaged
-  String get variant => _blink.Native_FontFace_variant_Getter(this);
+  String get variant => _blink.BlinkFontFace.$variant_Getter(this);
 
   @DomName('FontFace.variant')
   @DocsEditable()
   @Experimental() // untriaged
-  void set variant(String value) => _blink.Native_FontFace_variant_Setter(this, value);
+  void set variant(String value) => _blink.BlinkFontFace.$variant_Setter(this, value);
 
   @DomName('FontFace.weight')
   @DocsEditable()
   @Experimental() // untriaged
-  String get weight => _blink.Native_FontFace_weight_Getter(this);
+  String get weight => _blink.BlinkFontFace.$weight_Getter(this);
 
   @DomName('FontFace.weight')
   @DocsEditable()
   @Experimental() // untriaged
-  void set weight(String value) => _blink.Native_FontFace_weight_Setter(this, value);
+  void set weight(String value) => _blink.BlinkFontFace.$weight_Setter(this, value);
 
   @DomName('FontFace.load')
   @DocsEditable()
   @Experimental() // untriaged
-  void load() => _blink.Native_FontFace_load_Callback(this);
+  void load() => _blink.BlinkFontFace.$load_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13416,39 +13416,39 @@
   @DomName('FontFaceSet.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size => _blink.Native_FontFaceSet_size_Getter(this);
+  int get size => _blink.BlinkFontFaceSet.$size_Getter(this);
 
   @DomName('FontFaceSet.status')
   @DocsEditable()
   @Experimental() // untriaged
-  String get status => _blink.Native_FontFaceSet_status_Getter(this);
+  String get status => _blink.BlinkFontFaceSet.$status_Getter(this);
 
   @DomName('FontFaceSet.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(FontFace fontFace) => _blink.Native_FontFaceSet_add_Callback(this, fontFace);
+  void add(FontFace fontFace) => _blink.BlinkFontFaceSet.$add_Callback(this, fontFace);
 
   @DomName('FontFaceSet.check')
   @DocsEditable()
   @Experimental() // untriaged
-  bool check(String font, String text) => _blink.Native_FontFaceSet_check_Callback(this, font, text);
+  bool check(String font, String text) => _blink.BlinkFontFaceSet.$check_Callback(this, font, text);
 
   @DomName('FontFaceSet.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  void clear() => _blink.Native_FontFaceSet_clear_Callback(this);
+  void clear() => _blink.BlinkFontFaceSet.$clear_Callback(this);
 
   @DomName('FontFaceSet.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  bool delete(FontFace fontFace) => _blink.Native_FontFaceSet_delete_Callback(this, fontFace);
+  bool delete(FontFace fontFace) => _blink.BlinkFontFaceSet.$delete_Callback(this, fontFace);
 
-  void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) => _blink.Native_FontFaceSet_forEach(this, callback, thisArg);
+  void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) => _blink.BlinkFontFaceSet.$forEach(this, callback, thisArg);
 
   @DomName('FontFaceSet.has')
   @DocsEditable()
   @Experimental() // untriaged
-  bool has(FontFace fontFace) => _blink.Native_FontFaceSet_has_Callback(this, fontFace);
+  bool has(FontFace fontFace) => _blink.BlinkFontFaceSet.$has_Callback(this, fontFace);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13483,18 +13483,18 @@
   factory FormData([FormElement form]) => _create(form);
 
   @DocsEditable()
-  static FormData _create(form) => _blink.Native_FormData_constructorCallback(form);
+  static FormData _create(form) => _blink.BlinkFormData.$constructorCallback(form);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('FormData.append')
   @DocsEditable()
-  void append(String name, String value) => _blink.Native_FormData_append_Callback(this, name, value);
+  void append(String name, String value) => _blink.BlinkFormData.$append_Callback(this, name, value);
 
   @DomName('FormData.appendBlob')
   @DocsEditable()
-  void appendBlob(String name, Blob value, [String filename]) => _blink.Native_FormData_appendBlob_Callback(this, name, value, filename);
+  void appendBlob(String name, Blob value, [String filename]) => _blink.BlinkFormData.$appendBlob_Callback(this, name, value, filename);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13546,105 +13546,105 @@
 
   @DomName('HTMLFormElement.acceptCharset')
   @DocsEditable()
-  String get acceptCharset => _blink.Native_HTMLFormElement_acceptCharset_Getter(this);
+  String get acceptCharset => _blink.BlinkHTMLFormElement.$acceptCharset_Getter(this);
 
   @DomName('HTMLFormElement.acceptCharset')
   @DocsEditable()
-  void set acceptCharset(String value) => _blink.Native_HTMLFormElement_acceptCharset_Setter(this, value);
+  void set acceptCharset(String value) => _blink.BlinkHTMLFormElement.$acceptCharset_Setter(this, value);
 
   @DomName('HTMLFormElement.action')
   @DocsEditable()
-  String get action => _blink.Native_HTMLFormElement_action_Getter(this);
+  String get action => _blink.BlinkHTMLFormElement.$action_Getter(this);
 
   @DomName('HTMLFormElement.action')
   @DocsEditable()
-  void set action(String value) => _blink.Native_HTMLFormElement_action_Setter(this, value);
+  void set action(String value) => _blink.BlinkHTMLFormElement.$action_Setter(this, value);
 
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  String get autocomplete => _blink.Native_HTMLFormElement_autocomplete_Getter(this);
+  String get autocomplete => _blink.BlinkHTMLFormElement.$autocomplete_Getter(this);
 
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  void set autocomplete(String value) => _blink.Native_HTMLFormElement_autocomplete_Setter(this, value);
+  void set autocomplete(String value) => _blink.BlinkHTMLFormElement.$autocomplete_Setter(this, value);
 
   @DomName('HTMLFormElement.encoding')
   @DocsEditable()
-  String get encoding => _blink.Native_HTMLFormElement_encoding_Getter(this);
+  String get encoding => _blink.BlinkHTMLFormElement.$encoding_Getter(this);
 
   @DomName('HTMLFormElement.encoding')
   @DocsEditable()
-  void set encoding(String value) => _blink.Native_HTMLFormElement_encoding_Setter(this, value);
+  void set encoding(String value) => _blink.BlinkHTMLFormElement.$encoding_Setter(this, value);
 
   @DomName('HTMLFormElement.enctype')
   @DocsEditable()
-  String get enctype => _blink.Native_HTMLFormElement_enctype_Getter(this);
+  String get enctype => _blink.BlinkHTMLFormElement.$enctype_Getter(this);
 
   @DomName('HTMLFormElement.enctype')
   @DocsEditable()
-  void set enctype(String value) => _blink.Native_HTMLFormElement_enctype_Setter(this, value);
+  void set enctype(String value) => _blink.BlinkHTMLFormElement.$enctype_Setter(this, value);
 
   @DomName('HTMLFormElement.length')
   @DocsEditable()
-  int get length => _blink.Native_HTMLFormElement_length_Getter(this);
+  int get length => _blink.BlinkHTMLFormElement.$length_Getter(this);
 
   @DomName('HTMLFormElement.method')
   @DocsEditable()
-  String get method => _blink.Native_HTMLFormElement_method_Getter(this);
+  String get method => _blink.BlinkHTMLFormElement.$method_Getter(this);
 
   @DomName('HTMLFormElement.method')
   @DocsEditable()
-  void set method(String value) => _blink.Native_HTMLFormElement_method_Setter(this, value);
+  void set method(String value) => _blink.BlinkHTMLFormElement.$method_Setter(this, value);
 
   @DomName('HTMLFormElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLFormElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLFormElement.$name_Getter(this);
 
   @DomName('HTMLFormElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLFormElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLFormElement.$name_Setter(this, value);
 
   @DomName('HTMLFormElement.noValidate')
   @DocsEditable()
-  bool get noValidate => _blink.Native_HTMLFormElement_noValidate_Getter(this);
+  bool get noValidate => _blink.BlinkHTMLFormElement.$noValidate_Getter(this);
 
   @DomName('HTMLFormElement.noValidate')
   @DocsEditable()
-  void set noValidate(bool value) => _blink.Native_HTMLFormElement_noValidate_Setter(this, value);
+  void set noValidate(bool value) => _blink.BlinkHTMLFormElement.$noValidate_Setter(this, value);
 
   @DomName('HTMLFormElement.target')
   @DocsEditable()
-  String get target => _blink.Native_HTMLFormElement_target_Getter(this);
+  String get target => _blink.BlinkHTMLFormElement.$target_Getter(this);
 
   @DomName('HTMLFormElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.Native_HTMLFormElement_target_Setter(this, value);
+  void set target(String value) => _blink.BlinkHTMLFormElement.$target_Setter(this, value);
 
   @DomName('HTMLFormElement.__getter__')
   @DocsEditable()
-  Element __getter__(int index) => _blink.Native_HTMLFormElement___getter___Callback(this, index);
+  Element __getter__(int index) => _blink.BlinkHTMLFormElement.$__getter___Callback(this, index);
 
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLFormElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLFormElement.$checkValidity_Callback(this);
 
   @DomName('HTMLFormElement.requestAutocomplete')
   @DocsEditable()
   // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
   @Experimental()
-  void requestAutocomplete(Map details) => _blink.Native_HTMLFormElement_requestAutocomplete_Callback(this, details);
+  void requestAutocomplete(Map details) => _blink.BlinkHTMLFormElement.$requestAutocomplete_Callback(this, details);
 
   @DomName('HTMLFormElement.reset')
   @DocsEditable()
-  void reset() => _blink.Native_HTMLFormElement_reset_Callback(this);
+  void reset() => _blink.BlinkHTMLFormElement.$reset_Callback(this);
 
   @DomName('HTMLFormElement.submit')
   @DocsEditable()
-  void submit() => _blink.Native_HTMLFormElement_submit_Callback(this);
+  void submit() => _blink.BlinkHTMLFormElement.$submit_Callback(this);
 
   /// Stream of `autocomplete` events handled by this [FormElement].
   @DomName('HTMLFormElement.onautocomplete')
@@ -13678,23 +13678,23 @@
 
   @DomName('Gamepad.axes')
   @DocsEditable()
-  List<num> get axes => _blink.Native_Gamepad_axes_Getter(this);
+  List<num> get axes => _blink.BlinkGamepad.$axes_Getter(this);
 
   @DomName('Gamepad.buttons')
   @DocsEditable()
-  List<num> get buttons => _blink.Native_Gamepad_buttons_Getter(this);
+  List<num> get buttons => _blink.BlinkGamepad.$buttons_Getter(this);
 
   @DomName('Gamepad.id')
   @DocsEditable()
-  String get id => _blink.Native_Gamepad_id_Getter(this);
+  String get id => _blink.BlinkGamepad.$id_Getter(this);
 
   @DomName('Gamepad.index')
   @DocsEditable()
-  int get index => _blink.Native_Gamepad_index_Getter(this);
+  int get index => _blink.BlinkGamepad.$index_Getter(this);
 
   @DomName('Gamepad.timestamp')
   @DocsEditable()
-  int get timestamp => _blink.Native_Gamepad_timestamp_Getter(this);
+  int get timestamp => _blink.BlinkGamepad.$timestamp_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13782,15 +13782,15 @@
 
   @DomName('Geolocation.clearWatch')
   @DocsEditable()
-  void _clearWatch(int watchID) => _blink.Native_Geolocation_clearWatch_Callback(this, watchID);
+  void _clearWatch(int watchID) => _blink.BlinkGeolocation.$clearWatch_Callback(this, watchID);
 
   @DomName('Geolocation.getCurrentPosition')
   @DocsEditable()
-  void _getCurrentPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) => _blink.Native_Geolocation_getCurrentPosition_Callback(this, successCallback, errorCallback, options);
+  void _getCurrentPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) => _blink.BlinkGeolocation.$getCurrentPosition_Callback(this, successCallback, errorCallback, options);
 
   @DomName('Geolocation.watchPosition')
   @DocsEditable()
-  int _watchPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) => _blink.Native_Geolocation_watchPosition_Callback(this, successCallback, errorCallback, options);
+  int _watchPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) => _blink.BlinkGeolocation.$watchPosition_Callback(this, successCallback, errorCallback, options);
 }
 
 
@@ -13811,11 +13811,11 @@
 
   @DomName('Geoposition.coords')
   @DocsEditable()
-  Coordinates get coords => _blink.Native_Geoposition_coords_Getter(this);
+  Coordinates get coords => _blink.BlinkGeoposition.$coords_Getter(this);
 
   @DomName('Geoposition.timestamp')
   @DocsEditable()
-  int get timestamp => _blink.Native_Geoposition_timestamp_Getter(this);
+  int get timestamp => _blink.BlinkGeoposition.$timestamp_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14199,12 +14199,12 @@
   @DomName('HTMLHRElement.color')
   @DocsEditable()
   @Experimental() // untriaged
-  String get color => _blink.Native_HTMLHRElement_color_Getter(this);
+  String get color => _blink.BlinkHTMLHRElement.$color_Getter(this);
 
   @DomName('HTMLHRElement.color')
   @DocsEditable()
   @Experimental() // untriaged
-  void set color(String value) => _blink.Native_HTMLHRElement_color_Setter(this, value);
+  void set color(String value) => _blink.BlinkHTMLHRElement.$color_Setter(this, value);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -14234,15 +14234,15 @@
 
   @DomName('HashChangeEvent.newURL')
   @DocsEditable()
-  String get newUrl => _blink.Native_HashChangeEvent_newURL_Getter(this);
+  String get newUrl => _blink.BlinkHashChangeEvent.$newURL_Getter(this);
 
   @DomName('HashChangeEvent.oldURL')
   @DocsEditable()
-  String get oldUrl => _blink.Native_HashChangeEvent_oldURL_Getter(this);
+  String get oldUrl => _blink.BlinkHashChangeEvent.$oldURL_Getter(this);
 
   @DomName('HashChangeEvent.initHashChangeEvent')
   @DocsEditable()
-  void _initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) => _blink.Native_HashChangeEvent_initHashChangeEvent_Callback(this, type, canBubble, cancelable, oldURL, newURL);
+  void _initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) => _blink.BlinkHashChangeEvent.$initHashChangeEvent_Callback(this, type, canBubble, cancelable, oldURL, newURL);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14336,23 +14336,23 @@
 
   @DomName('History.length')
   @DocsEditable()
-  int get length => _blink.Native_History_length_Getter(this);
+  int get length => _blink.BlinkHistory.$length_Getter(this);
 
   @DomName('History.state')
   @DocsEditable()
-  dynamic get state => _blink.Native_History_state_Getter(this);
+  dynamic get state => _blink.BlinkHistory.$state_Getter(this);
 
   @DomName('History.back')
   @DocsEditable()
-  void back() => _blink.Native_History_back_Callback(this);
+  void back() => _blink.BlinkHistory.$back_Callback(this);
 
   @DomName('History.forward')
   @DocsEditable()
-  void forward() => _blink.Native_History_forward_Callback(this);
+  void forward() => _blink.BlinkHistory.$forward_Callback(this);
 
   @DomName('History.go')
   @DocsEditable()
-  void go(int distance) => _blink.Native_History_go_Callback(this, distance);
+  void go(int distance) => _blink.BlinkHistory.$go_Callback(this, distance);
 
   @DomName('History.pushState')
   @DocsEditable()
@@ -14360,7 +14360,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void pushState(Object data, String title, [String url]) => _blink.Native_History_pushState_Callback(this, data, title, url);
+  void pushState(Object data, String title, [String url]) => _blink.BlinkHistory.$pushState_Callback(this, data, title, url);
 
   @DomName('History.replaceState')
   @DocsEditable()
@@ -14368,7 +14368,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void replaceState(Object data, String title, [String url]) => _blink.Native_History_replaceState_Callback(this, data, title, url);
+  void replaceState(Object data, String title, [String url]) => _blink.BlinkHistory.$replaceState_Callback(this, data, title, url);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -14385,15 +14385,15 @@
 
   @DomName('HTMLCollection.length')
   @DocsEditable()
-  int get length => _blink.Native_HTMLCollection_length_Getter(this);
+  int get length => _blink.BlinkHTMLCollection.$length_Getter(this);
 
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_HTMLCollection_NativeIndexed_Getter(this, index);
+    return _blink.BlinkHTMLCollection.$NativeIndexed_Getter(this, index);
   }
 
-  Node _nativeIndexedGetter(int index) => _blink.Native_HTMLCollection_NativeIndexed_Getter(this, index);
+  Node _nativeIndexedGetter(int index) => _blink.BlinkHTMLCollection.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -14435,11 +14435,11 @@
 
   @DomName('HTMLCollection.item')
   @DocsEditable()
-  Element item(int index) => _blink.Native_HTMLCollection_item_Callback(this, index);
+  Element item(int index) => _blink.BlinkHTMLCollection.$item_Callback(this, index);
 
   @DomName('HTMLCollection.namedItem')
   @DocsEditable()
-  Element namedItem(String name) => _blink.Native_HTMLCollection_namedItem_Callback(this, name);
+  Element namedItem(String name) => _blink.BlinkHTMLCollection.$namedItem_Callback(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15007,88 +15007,88 @@
 
   @DomName('HTMLElement.contentEditable')
   @DocsEditable()
-  String get contentEditable => _blink.Native_HTMLElement_contentEditable_Getter(this);
+  String get contentEditable => _blink.BlinkHTMLElement.$contentEditable_Getter(this);
 
   @DomName('HTMLElement.contentEditable')
   @DocsEditable()
-  void set contentEditable(String value) => _blink.Native_HTMLElement_contentEditable_Setter(this, value);
+  void set contentEditable(String value) => _blink.BlinkHTMLElement.$contentEditable_Setter(this, value);
 
   @DomName('HTMLElement.dir')
   @DocsEditable()
-  String get dir => _blink.Native_HTMLElement_dir_Getter(this);
+  String get dir => _blink.BlinkHTMLElement.$dir_Getter(this);
 
   @DomName('HTMLElement.dir')
   @DocsEditable()
-  void set dir(String value) => _blink.Native_HTMLElement_dir_Setter(this, value);
+  void set dir(String value) => _blink.BlinkHTMLElement.$dir_Setter(this, value);
 
   @DomName('HTMLElement.draggable')
   @DocsEditable()
-  bool get draggable => _blink.Native_HTMLElement_draggable_Getter(this);
+  bool get draggable => _blink.BlinkHTMLElement.$draggable_Getter(this);
 
   @DomName('HTMLElement.draggable')
   @DocsEditable()
-  void set draggable(bool value) => _blink.Native_HTMLElement_draggable_Setter(this, value);
+  void set draggable(bool value) => _blink.BlinkHTMLElement.$draggable_Setter(this, value);
 
   @DomName('HTMLElement.hidden')
   @DocsEditable()
-  bool get hidden => _blink.Native_HTMLElement_hidden_Getter(this);
+  bool get hidden => _blink.BlinkHTMLElement.$hidden_Getter(this);
 
   @DomName('HTMLElement.hidden')
   @DocsEditable()
-  void set hidden(bool value) => _blink.Native_HTMLElement_hidden_Setter(this, value);
+  void set hidden(bool value) => _blink.BlinkHTMLElement.$hidden_Setter(this, value);
 
   @DomName('HTMLElement.inputMethodContext')
   @DocsEditable()
   @Experimental() // untriaged
-  InputMethodContext get inputMethodContext => _blink.Native_HTMLElement_inputMethodContext_Getter(this);
+  InputMethodContext get inputMethodContext => _blink.BlinkHTMLElement.$inputMethodContext_Getter(this);
 
   @DomName('HTMLElement.isContentEditable')
   @DocsEditable()
-  bool get isContentEditable => _blink.Native_HTMLElement_isContentEditable_Getter(this);
+  bool get isContentEditable => _blink.BlinkHTMLElement.$isContentEditable_Getter(this);
 
   @DomName('HTMLElement.lang')
   @DocsEditable()
-  String get lang => _blink.Native_HTMLElement_lang_Getter(this);
+  String get lang => _blink.BlinkHTMLElement.$lang_Getter(this);
 
   @DomName('HTMLElement.lang')
   @DocsEditable()
-  void set lang(String value) => _blink.Native_HTMLElement_lang_Setter(this, value);
+  void set lang(String value) => _blink.BlinkHTMLElement.$lang_Setter(this, value);
 
   @DomName('HTMLElement.spellcheck')
   @DocsEditable()
   // http://blog.whatwg.org/the-road-to-html-5-spellchecking
   @Experimental() // nonstandard
-  bool get spellcheck => _blink.Native_HTMLElement_spellcheck_Getter(this);
+  bool get spellcheck => _blink.BlinkHTMLElement.$spellcheck_Getter(this);
 
   @DomName('HTMLElement.spellcheck')
   @DocsEditable()
   // http://blog.whatwg.org/the-road-to-html-5-spellchecking
   @Experimental() // nonstandard
-  void set spellcheck(bool value) => _blink.Native_HTMLElement_spellcheck_Setter(this, value);
+  void set spellcheck(bool value) => _blink.BlinkHTMLElement.$spellcheck_Setter(this, value);
 
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
-  int get tabIndex => _blink.Native_HTMLElement_tabIndex_Getter(this);
+  int get tabIndex => _blink.BlinkHTMLElement.$tabIndex_Getter(this);
 
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
-  void set tabIndex(int value) => _blink.Native_HTMLElement_tabIndex_Setter(this, value);
+  void set tabIndex(int value) => _blink.BlinkHTMLElement.$tabIndex_Setter(this, value);
 
   @DomName('HTMLElement.title')
   @DocsEditable()
-  String get title => _blink.Native_HTMLElement_title_Getter(this);
+  String get title => _blink.BlinkHTMLElement.$title_Getter(this);
 
   @DomName('HTMLElement.title')
   @DocsEditable()
-  void set title(String value) => _blink.Native_HTMLElement_title_Setter(this, value);
+  void set title(String value) => _blink.BlinkHTMLElement.$title_Setter(this, value);
 
   @DomName('HTMLElement.translate')
   @DocsEditable()
-  bool get translate => _blink.Native_HTMLElement_translate_Getter(this);
+  bool get translate => _blink.BlinkHTMLElement.$translate_Getter(this);
 
   @DomName('HTMLElement.translate')
   @DocsEditable()
-  void set translate(bool value) => _blink.Native_HTMLElement_translate_Setter(this, value);
+  void set translate(bool value) => _blink.BlinkHTMLElement.$translate_Setter(this, value);
 
   @DomName('HTMLElement.webkitdropzone')
   @DocsEditable()
@@ -15096,7 +15096,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  String get dropzone => _blink.Native_HTMLElement_webkitdropzone_Getter(this);
+  String get dropzone => _blink.BlinkHTMLElement.$webkitdropzone_Getter(this);
 
   @DomName('HTMLElement.webkitdropzone')
   @DocsEditable()
@@ -15104,11 +15104,11 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  void set dropzone(String value) => _blink.Native_HTMLElement_webkitdropzone_Setter(this, value);
+  void set dropzone(String value) => _blink.BlinkHTMLElement.$webkitdropzone_Setter(this, value);
 
   @DomName('HTMLElement.click')
   @DocsEditable()
-  void click() => _blink.Native_HTMLElement_click_Callback(this);
+  void click() => _blink.BlinkHTMLElement.$click_Callback(this);
 
   @DomName('HTMLElement.onabort')
   @DocsEditable()
@@ -15785,7 +15785,7 @@
   factory HttpRequest() => _create();
 
   @DocsEditable()
-  static HttpRequest _create() => _blink.Native_XMLHttpRequest_constructorCallback();
+  static HttpRequest _create() => _blink.BlinkXMLHttpRequest.$constructorCallback();
 
   @DomName('XMLHttpRequest.DONE')
   @DocsEditable()
@@ -15841,7 +15841,7 @@
    */
   @DomName('XMLHttpRequest.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_XMLHttpRequest_readyState_Getter(this);
+  int get readyState => _blink.BlinkXMLHttpRequest.$readyState_Getter(this);
 
   /**
    * The data received as a reponse from the request.
@@ -15856,14 +15856,14 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  Object get response => _blink.Native_XMLHttpRequest_response_Getter(this);
+  Object get response => _blink.BlinkXMLHttpRequest.$response_Getter(this);
 
   /**
    * The response in String form or empty String on failure.
    */
   @DomName('XMLHttpRequest.responseText')
   @DocsEditable()
-  String get responseText => _blink.Native_XMLHttpRequest_responseText_Getter(this);
+  String get responseText => _blink.BlinkXMLHttpRequest.$responseText_Getter(this);
 
   /**
    * [String] telling the server the desired response format.
@@ -15877,7 +15877,7 @@
    */
   @DomName('XMLHttpRequest.responseType')
   @DocsEditable()
-  String get responseType => _blink.Native_XMLHttpRequest_responseType_Getter(this);
+  String get responseType => _blink.BlinkXMLHttpRequest.$responseType_Getter(this);
 
   /**
    * [String] telling the server the desired response format.
@@ -15891,7 +15891,7 @@
    */
   @DomName('XMLHttpRequest.responseType')
   @DocsEditable()
-  void set responseType(String value) => _blink.Native_XMLHttpRequest_responseType_Setter(this, value);
+  void set responseType(String value) => _blink.BlinkXMLHttpRequest.$responseType_Setter(this, value);
 
   /**
    * The request response, or null on failure.
@@ -15902,7 +15902,7 @@
    */
   @DomName('XMLHttpRequest.responseXML')
   @DocsEditable()
-  Document get responseXml => _blink.Native_XMLHttpRequest_responseXML_Getter(this);
+  Document get responseXml => _blink.BlinkXMLHttpRequest.$responseXML_Getter(this);
 
   /**
    * The http result code from the request (200, 404, etc).
@@ -15910,7 +15910,7 @@
    */
   @DomName('XMLHttpRequest.status')
   @DocsEditable()
-  int get status => _blink.Native_XMLHttpRequest_status_Getter(this);
+  int get status => _blink.BlinkXMLHttpRequest.$status_Getter(this);
 
   /**
    * The request response string (such as \"200 OK\").
@@ -15918,7 +15918,7 @@
    */
   @DomName('XMLHttpRequest.statusText')
   @DocsEditable()
-  String get statusText => _blink.Native_XMLHttpRequest_statusText_Getter(this);
+  String get statusText => _blink.BlinkXMLHttpRequest.$statusText_Getter(this);
 
   /**
    * Length of time before a request is automatically terminated.
@@ -15939,7 +15939,7 @@
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int get timeout => _blink.Native_XMLHttpRequest_timeout_Getter(this);
+  int get timeout => _blink.BlinkXMLHttpRequest.$timeout_Getter(this);
 
   /**
    * Length of time before a request is automatically terminated.
@@ -15960,7 +15960,7 @@
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void set timeout(int value) => _blink.Native_XMLHttpRequest_timeout_Setter(this, value);
+  void set timeout(int value) => _blink.BlinkXMLHttpRequest.$timeout_Setter(this, value);
 
   /**
    * [EventTarget] that can hold listeners to track the progress of the request.
@@ -15969,7 +15969,7 @@
   @DomName('XMLHttpRequest.upload')
   @DocsEditable()
   @Unstable()
-  HttpRequestUpload get upload => _blink.Native_XMLHttpRequest_upload_Getter(this);
+  HttpRequestUpload get upload => _blink.BlinkXMLHttpRequest.$upload_Getter(this);
 
   /**
    * True if cross-site requests should use credentials such as cookies
@@ -15979,7 +15979,7 @@
    */
   @DomName('XMLHttpRequest.withCredentials')
   @DocsEditable()
-  bool get withCredentials => _blink.Native_XMLHttpRequest_withCredentials_Getter(this);
+  bool get withCredentials => _blink.BlinkXMLHttpRequest.$withCredentials_Getter(this);
 
   /**
    * True if cross-site requests should use credentials such as cookies
@@ -15989,7 +15989,7 @@
    */
   @DomName('XMLHttpRequest.withCredentials')
   @DocsEditable()
-  void set withCredentials(bool value) => _blink.Native_XMLHttpRequest_withCredentials_Setter(this, value);
+  void set withCredentials(bool value) => _blink.BlinkXMLHttpRequest.$withCredentials_Setter(this, value);
 
   /**
    * Stop the current request.
@@ -16000,7 +16000,7 @@
    */
   @DomName('XMLHttpRequest.abort')
   @DocsEditable()
-  void abort() => _blink.Native_XMLHttpRequest_abort_Callback(this);
+  void abort() => _blink.BlinkXMLHttpRequest.$abort_Callback(this);
 
   /**
    * Retrieve all the response headers from a request.
@@ -16015,7 +16015,7 @@
   @DomName('XMLHttpRequest.getAllResponseHeaders')
   @DocsEditable()
   @Unstable()
-  String getAllResponseHeaders() => _blink.Native_XMLHttpRequest_getAllResponseHeaders_Callback(this);
+  String getAllResponseHeaders() => _blink.BlinkXMLHttpRequest.$getAllResponseHeaders_Callback(this);
 
   /**
    * Return the response header named `header`, or null if not found.
@@ -16026,7 +16026,7 @@
   @DomName('XMLHttpRequest.getResponseHeader')
   @DocsEditable()
   @Unstable()
-  String getResponseHeader(String header) => _blink.Native_XMLHttpRequest_getResponseHeader_Callback(this, header);
+  String getResponseHeader(String header) => _blink.BlinkXMLHttpRequest.$getResponseHeader_Callback(this, header);
 
   /**
    * Specify the desired `url`, and `method` to use in making the request.
@@ -16045,7 +16045,7 @@
    */
   @DomName('XMLHttpRequest.open')
   @DocsEditable()
-  void open(String method, String url, {bool async, String user, String password}) => _blink.Native_XMLHttpRequest_open_Callback(this, method, url, async, user, password);
+  void open(String method, String url, {bool async, String user, String password}) => _blink.BlinkXMLHttpRequest.$open_Callback(this, method, url, async, user, password);
 
   /**
    * Specify a particular MIME type (such as `text/xml`) desired for the
@@ -16059,7 +16059,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void overrideMimeType(String override) => _blink.Native_XMLHttpRequest_overrideMimeType_Callback(this, override);
+  void overrideMimeType(String override) => _blink.BlinkXMLHttpRequest.$overrideMimeType_Callback(this, override);
 
   /**
    * Send the request with any given `data`.
@@ -16077,7 +16077,7 @@
    */
   @DomName('XMLHttpRequest.send')
   @DocsEditable()
-  void send([data]) => _blink.Native_XMLHttpRequest_send_Callback(this, data);
+  void send([data]) => _blink.BlinkXMLHttpRequest.$send_Callback(this, data);
 
   /**
    * Sets the value of an HTTP requst header.
@@ -16099,7 +16099,7 @@
    */
   @DomName('XMLHttpRequest.setRequestHeader')
   @DocsEditable()
-  void setRequestHeader(String header, String value) => _blink.Native_XMLHttpRequest_setRequestHeader_Callback(this, header, value);
+  void setRequestHeader(String header, String value) => _blink.BlinkXMLHttpRequest.$setRequestHeader_Callback(this, header, value);
 
   /// Stream of `readystatechange` events handled by this [HttpRequest].
 /**
@@ -16294,55 +16294,55 @@
 
   @DomName('HTMLIFrameElement.contentWindow')
   @DocsEditable()
-  WindowBase get contentWindow => _blink.Native_HTMLIFrameElement_contentWindow_Getter(this);
+  WindowBase get contentWindow => _blink.BlinkHTMLIFrameElement.$contentWindow_Getter(this);
 
   @DomName('HTMLIFrameElement.height')
   @DocsEditable()
-  String get height => _blink.Native_HTMLIFrameElement_height_Getter(this);
+  String get height => _blink.BlinkHTMLIFrameElement.$height_Getter(this);
 
   @DomName('HTMLIFrameElement.height')
   @DocsEditable()
-  void set height(String value) => _blink.Native_HTMLIFrameElement_height_Setter(this, value);
+  void set height(String value) => _blink.BlinkHTMLIFrameElement.$height_Setter(this, value);
 
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLIFrameElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLIFrameElement.$name_Getter(this);
 
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLIFrameElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLIFrameElement.$name_Setter(this, value);
 
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
-  String get sandbox => _blink.Native_HTMLIFrameElement_sandbox_Getter(this);
+  String get sandbox => _blink.BlinkHTMLIFrameElement.$sandbox_Getter(this);
 
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
-  void set sandbox(String value) => _blink.Native_HTMLIFrameElement_sandbox_Setter(this, value);
+  void set sandbox(String value) => _blink.BlinkHTMLIFrameElement.$sandbox_Setter(this, value);
 
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLIFrameElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLIFrameElement.$src_Getter(this);
 
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLIFrameElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLIFrameElement.$src_Setter(this, value);
 
   @DomName('HTMLIFrameElement.srcdoc')
   @DocsEditable()
-  String get srcdoc => _blink.Native_HTMLIFrameElement_srcdoc_Getter(this);
+  String get srcdoc => _blink.BlinkHTMLIFrameElement.$srcdoc_Getter(this);
 
   @DomName('HTMLIFrameElement.srcdoc')
   @DocsEditable()
-  void set srcdoc(String value) => _blink.Native_HTMLIFrameElement_srcdoc_Setter(this, value);
+  void set srcdoc(String value) => _blink.BlinkHTMLIFrameElement.$srcdoc_Setter(this, value);
 
   @DomName('HTMLIFrameElement.width')
   @DocsEditable()
-  String get width => _blink.Native_HTMLIFrameElement_width_Getter(this);
+  String get width => _blink.BlinkHTMLIFrameElement.$width_Getter(this);
 
   @DomName('HTMLIFrameElement.width')
   @DocsEditable()
-  void set width(String value) => _blink.Native_HTMLIFrameElement_width_Setter(this, value);
+  void set width(String value) => _blink.BlinkHTMLIFrameElement.$width_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16362,12 +16362,12 @@
   @DomName('ImageBitmap.height')
   @DocsEditable()
   @Experimental() // untriaged
-  int get height => _blink.Native_ImageBitmap_height_Getter(this);
+  int get height => _blink.BlinkImageBitmap.$height_Getter(this);
 
   @DomName('ImageBitmap.width')
   @DocsEditable()
   @Experimental() // untriaged
-  int get width => _blink.Native_ImageBitmap_width_Getter(this);
+  int get width => _blink.BlinkImageBitmap.$width_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -16390,15 +16390,15 @@
 
   @DomName('ImageData.data')
   @DocsEditable()
-  List<int> get _data => _blink.Native_ImageData_data_Getter(this);
+  List<int> get _data => _blink.BlinkImageData.$data_Getter(this);
 
   @DomName('ImageData.height')
   @DocsEditable()
-  int get height => _blink.Native_ImageData_height_Getter(this);
+  int get height => _blink.BlinkImageData.$height_Getter(this);
 
   @DomName('ImageData.width')
   @DocsEditable()
-  int get width => _blink.Native_ImageData_width_Getter(this);
+  int get width => _blink.BlinkImageData.$width_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16429,81 +16429,81 @@
 
   @DomName('HTMLImageElement.alt')
   @DocsEditable()
-  String get alt => _blink.Native_HTMLImageElement_alt_Getter(this);
+  String get alt => _blink.BlinkHTMLImageElement.$alt_Getter(this);
 
   @DomName('HTMLImageElement.alt')
   @DocsEditable()
-  void set alt(String value) => _blink.Native_HTMLImageElement_alt_Setter(this, value);
+  void set alt(String value) => _blink.BlinkHTMLImageElement.$alt_Setter(this, value);
 
   @DomName('HTMLImageElement.complete')
   @DocsEditable()
-  bool get complete => _blink.Native_HTMLImageElement_complete_Getter(this);
+  bool get complete => _blink.BlinkHTMLImageElement.$complete_Getter(this);
 
   @DomName('HTMLImageElement.crossOrigin')
   @DocsEditable()
-  String get crossOrigin => _blink.Native_HTMLImageElement_crossOrigin_Getter(this);
+  String get crossOrigin => _blink.BlinkHTMLImageElement.$crossOrigin_Getter(this);
 
   @DomName('HTMLImageElement.crossOrigin')
   @DocsEditable()
-  void set crossOrigin(String value) => _blink.Native_HTMLImageElement_crossOrigin_Setter(this, value);
+  void set crossOrigin(String value) => _blink.BlinkHTMLImageElement.$crossOrigin_Setter(this, value);
 
   @DomName('HTMLImageElement.height')
   @DocsEditable()
-  int get height => _blink.Native_HTMLImageElement_height_Getter(this);
+  int get height => _blink.BlinkHTMLImageElement.$height_Getter(this);
 
   @DomName('HTMLImageElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.Native_HTMLImageElement_height_Setter(this, value);
+  void set height(int value) => _blink.BlinkHTMLImageElement.$height_Setter(this, value);
 
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
-  bool get isMap => _blink.Native_HTMLImageElement_isMap_Getter(this);
+  bool get isMap => _blink.BlinkHTMLImageElement.$isMap_Getter(this);
 
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
-  void set isMap(bool value) => _blink.Native_HTMLImageElement_isMap_Setter(this, value);
+  void set isMap(bool value) => _blink.BlinkHTMLImageElement.$isMap_Setter(this, value);
 
   @DomName('HTMLImageElement.naturalHeight')
   @DocsEditable()
-  int get naturalHeight => _blink.Native_HTMLImageElement_naturalHeight_Getter(this);
+  int get naturalHeight => _blink.BlinkHTMLImageElement.$naturalHeight_Getter(this);
 
   @DomName('HTMLImageElement.naturalWidth')
   @DocsEditable()
-  int get naturalWidth => _blink.Native_HTMLImageElement_naturalWidth_Getter(this);
+  int get naturalWidth => _blink.BlinkHTMLImageElement.$naturalWidth_Getter(this);
 
   @DomName('HTMLImageElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLImageElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLImageElement.$src_Getter(this);
 
   @DomName('HTMLImageElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLImageElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLImageElement.$src_Setter(this, value);
 
   @DomName('HTMLImageElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  String get srcset => _blink.Native_HTMLImageElement_srcset_Getter(this);
+  String get srcset => _blink.BlinkHTMLImageElement.$srcset_Getter(this);
 
   @DomName('HTMLImageElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  void set srcset(String value) => _blink.Native_HTMLImageElement_srcset_Setter(this, value);
+  void set srcset(String value) => _blink.BlinkHTMLImageElement.$srcset_Setter(this, value);
 
   @DomName('HTMLImageElement.useMap')
   @DocsEditable()
-  String get useMap => _blink.Native_HTMLImageElement_useMap_Getter(this);
+  String get useMap => _blink.BlinkHTMLImageElement.$useMap_Getter(this);
 
   @DomName('HTMLImageElement.useMap')
   @DocsEditable()
-  void set useMap(String value) => _blink.Native_HTMLImageElement_useMap_Setter(this, value);
+  void set useMap(String value) => _blink.BlinkHTMLImageElement.$useMap_Setter(this, value);
 
   @DomName('HTMLImageElement.width')
   @DocsEditable()
-  int get width => _blink.Native_HTMLImageElement_width_Getter(this);
+  int get width => _blink.BlinkHTMLImageElement.$width_Getter(this);
 
   @DomName('HTMLImageElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.Native_HTMLImageElement_width_Setter(this, value);
+  void set width(int value) => _blink.BlinkHTMLImageElement.$width_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16523,7 +16523,7 @@
   @DomName('InjectedScriptHost.inspect')
   @DocsEditable()
   @Experimental() // untriaged
-  void inspect(Object objectId, Object hints) => _blink.Native_InjectedScriptHost_inspect_Callback(this, objectId, hints);
+  void inspect(Object objectId, Object hints) => _blink.BlinkInjectedScriptHost.$inspect_Callback(this, objectId, hints);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16592,333 +16592,333 @@
 
   @DomName('HTMLInputElement.accept')
   @DocsEditable()
-  String get accept => _blink.Native_HTMLInputElement_accept_Getter(this);
+  String get accept => _blink.BlinkHTMLInputElement.$accept_Getter(this);
 
   @DomName('HTMLInputElement.accept')
   @DocsEditable()
-  void set accept(String value) => _blink.Native_HTMLInputElement_accept_Setter(this, value);
+  void set accept(String value) => _blink.BlinkHTMLInputElement.$accept_Setter(this, value);
 
   @DomName('HTMLInputElement.alt')
   @DocsEditable()
-  String get alt => _blink.Native_HTMLInputElement_alt_Getter(this);
+  String get alt => _blink.BlinkHTMLInputElement.$alt_Getter(this);
 
   @DomName('HTMLInputElement.alt')
   @DocsEditable()
-  void set alt(String value) => _blink.Native_HTMLInputElement_alt_Setter(this, value);
+  void set alt(String value) => _blink.BlinkHTMLInputElement.$alt_Setter(this, value);
 
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
-  String get autocomplete => _blink.Native_HTMLInputElement_autocomplete_Getter(this);
+  String get autocomplete => _blink.BlinkHTMLInputElement.$autocomplete_Getter(this);
 
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
-  void set autocomplete(String value) => _blink.Native_HTMLInputElement_autocomplete_Setter(this, value);
+  void set autocomplete(String value) => _blink.BlinkHTMLInputElement.$autocomplete_Setter(this, value);
 
   @DomName('HTMLInputElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.Native_HTMLInputElement_autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLInputElement.$autofocus_Getter(this);
 
   @DomName('HTMLInputElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.Native_HTMLInputElement_autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLInputElement.$autofocus_Setter(this, value);
 
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
-  bool get checked => _blink.Native_HTMLInputElement_checked_Getter(this);
+  bool get checked => _blink.BlinkHTMLInputElement.$checked_Getter(this);
 
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
-  void set checked(bool value) => _blink.Native_HTMLInputElement_checked_Setter(this, value);
+  void set checked(bool value) => _blink.BlinkHTMLInputElement.$checked_Setter(this, value);
 
   @DomName('HTMLInputElement.defaultChecked')
   @DocsEditable()
-  bool get defaultChecked => _blink.Native_HTMLInputElement_defaultChecked_Getter(this);
+  bool get defaultChecked => _blink.BlinkHTMLInputElement.$defaultChecked_Getter(this);
 
   @DomName('HTMLInputElement.defaultChecked')
   @DocsEditable()
-  void set defaultChecked(bool value) => _blink.Native_HTMLInputElement_defaultChecked_Setter(this, value);
+  void set defaultChecked(bool value) => _blink.BlinkHTMLInputElement.$defaultChecked_Setter(this, value);
 
   @DomName('HTMLInputElement.defaultValue')
   @DocsEditable()
-  String get defaultValue => _blink.Native_HTMLInputElement_defaultValue_Getter(this);
+  String get defaultValue => _blink.BlinkHTMLInputElement.$defaultValue_Getter(this);
 
   @DomName('HTMLInputElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) => _blink.Native_HTMLInputElement_defaultValue_Setter(this, value);
+  void set defaultValue(String value) => _blink.BlinkHTMLInputElement.$defaultValue_Setter(this, value);
 
   @DomName('HTMLInputElement.dirName')
   @DocsEditable()
-  String get dirName => _blink.Native_HTMLInputElement_dirName_Getter(this);
+  String get dirName => _blink.BlinkHTMLInputElement.$dirName_Getter(this);
 
   @DomName('HTMLInputElement.dirName')
   @DocsEditable()
-  void set dirName(String value) => _blink.Native_HTMLInputElement_dirName_Setter(this, value);
+  void set dirName(String value) => _blink.BlinkHTMLInputElement.$dirName_Setter(this, value);
 
   @DomName('HTMLInputElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLInputElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLInputElement.$disabled_Getter(this);
 
   @DomName('HTMLInputElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLInputElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLInputElement.$disabled_Setter(this, value);
 
   @DomName('HTMLInputElement.files')
   @DocsEditable()
-  List<File> get files => _blink.Native_HTMLInputElement_files_Getter(this);
+  List<File> get files => _blink.BlinkHTMLInputElement.$files_Getter(this);
 
   @DomName('HTMLInputElement.files')
   @DocsEditable()
-  void set files(List<File> value) => _blink.Native_HTMLInputElement_files_Setter(this, value);
+  void set files(List<File> value) => _blink.BlinkHTMLInputElement.$files_Setter(this, value);
 
   @DomName('HTMLInputElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLInputElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLInputElement.$form_Getter(this);
 
   @DomName('HTMLInputElement.formAction')
   @DocsEditable()
-  String get formAction => _blink.Native_HTMLInputElement_formAction_Getter(this);
+  String get formAction => _blink.BlinkHTMLInputElement.$formAction_Getter(this);
 
   @DomName('HTMLInputElement.formAction')
   @DocsEditable()
-  void set formAction(String value) => _blink.Native_HTMLInputElement_formAction_Setter(this, value);
+  void set formAction(String value) => _blink.BlinkHTMLInputElement.$formAction_Setter(this, value);
 
   @DomName('HTMLInputElement.formEnctype')
   @DocsEditable()
-  String get formEnctype => _blink.Native_HTMLInputElement_formEnctype_Getter(this);
+  String get formEnctype => _blink.BlinkHTMLInputElement.$formEnctype_Getter(this);
 
   @DomName('HTMLInputElement.formEnctype')
   @DocsEditable()
-  void set formEnctype(String value) => _blink.Native_HTMLInputElement_formEnctype_Setter(this, value);
+  void set formEnctype(String value) => _blink.BlinkHTMLInputElement.$formEnctype_Setter(this, value);
 
   @DomName('HTMLInputElement.formMethod')
   @DocsEditable()
-  String get formMethod => _blink.Native_HTMLInputElement_formMethod_Getter(this);
+  String get formMethod => _blink.BlinkHTMLInputElement.$formMethod_Getter(this);
 
   @DomName('HTMLInputElement.formMethod')
   @DocsEditable()
-  void set formMethod(String value) => _blink.Native_HTMLInputElement_formMethod_Setter(this, value);
+  void set formMethod(String value) => _blink.BlinkHTMLInputElement.$formMethod_Setter(this, value);
 
   @DomName('HTMLInputElement.formNoValidate')
   @DocsEditable()
-  bool get formNoValidate => _blink.Native_HTMLInputElement_formNoValidate_Getter(this);
+  bool get formNoValidate => _blink.BlinkHTMLInputElement.$formNoValidate_Getter(this);
 
   @DomName('HTMLInputElement.formNoValidate')
   @DocsEditable()
-  void set formNoValidate(bool value) => _blink.Native_HTMLInputElement_formNoValidate_Setter(this, value);
+  void set formNoValidate(bool value) => _blink.BlinkHTMLInputElement.$formNoValidate_Setter(this, value);
 
   @DomName('HTMLInputElement.formTarget')
   @DocsEditable()
-  String get formTarget => _blink.Native_HTMLInputElement_formTarget_Getter(this);
+  String get formTarget => _blink.BlinkHTMLInputElement.$formTarget_Getter(this);
 
   @DomName('HTMLInputElement.formTarget')
   @DocsEditable()
-  void set formTarget(String value) => _blink.Native_HTMLInputElement_formTarget_Setter(this, value);
+  void set formTarget(String value) => _blink.BlinkHTMLInputElement.$formTarget_Setter(this, value);
 
   @DomName('HTMLInputElement.height')
   @DocsEditable()
-  int get height => _blink.Native_HTMLInputElement_height_Getter(this);
+  int get height => _blink.BlinkHTMLInputElement.$height_Getter(this);
 
   @DomName('HTMLInputElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.Native_HTMLInputElement_height_Setter(this, value);
+  void set height(int value) => _blink.BlinkHTMLInputElement.$height_Setter(this, value);
 
   @DomName('HTMLInputElement.incremental')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  bool get incremental => _blink.Native_HTMLInputElement_incremental_Getter(this);
+  bool get incremental => _blink.BlinkHTMLInputElement.$incremental_Getter(this);
 
   @DomName('HTMLInputElement.incremental')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  void set incremental(bool value) => _blink.Native_HTMLInputElement_incremental_Setter(this, value);
+  void set incremental(bool value) => _blink.BlinkHTMLInputElement.$incremental_Setter(this, value);
 
   @DomName('HTMLInputElement.indeterminate')
   @DocsEditable()
-  bool get indeterminate => _blink.Native_HTMLInputElement_indeterminate_Getter(this);
+  bool get indeterminate => _blink.BlinkHTMLInputElement.$indeterminate_Getter(this);
 
   @DomName('HTMLInputElement.indeterminate')
   @DocsEditable()
-  void set indeterminate(bool value) => _blink.Native_HTMLInputElement_indeterminate_Setter(this, value);
+  void set indeterminate(bool value) => _blink.BlinkHTMLInputElement.$indeterminate_Setter(this, value);
 
   @DomName('HTMLInputElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get inputMode => _blink.Native_HTMLInputElement_inputMode_Getter(this);
+  String get inputMode => _blink.BlinkHTMLInputElement.$inputMode_Getter(this);
 
   @DomName('HTMLInputElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set inputMode(String value) => _blink.Native_HTMLInputElement_inputMode_Setter(this, value);
+  void set inputMode(String value) => _blink.BlinkHTMLInputElement.$inputMode_Setter(this, value);
 
   @DomName('HTMLInputElement.labels')
   @DocsEditable()
-  List<Node> get labels => _blink.Native_HTMLInputElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLInputElement.$labels_Getter(this);
 
   @DomName('HTMLInputElement.list')
   @DocsEditable()
-  HtmlElement get list => _blink.Native_HTMLInputElement_list_Getter(this);
+  HtmlElement get list => _blink.BlinkHTMLInputElement.$list_Getter(this);
 
   @DomName('HTMLInputElement.max')
   @DocsEditable()
-  String get max => _blink.Native_HTMLInputElement_max_Getter(this);
+  String get max => _blink.BlinkHTMLInputElement.$max_Getter(this);
 
   @DomName('HTMLInputElement.max')
   @DocsEditable()
-  void set max(String value) => _blink.Native_HTMLInputElement_max_Setter(this, value);
+  void set max(String value) => _blink.BlinkHTMLInputElement.$max_Setter(this, value);
 
   @DomName('HTMLInputElement.maxLength')
   @DocsEditable()
-  int get maxLength => _blink.Native_HTMLInputElement_maxLength_Getter(this);
+  int get maxLength => _blink.BlinkHTMLInputElement.$maxLength_Getter(this);
 
   @DomName('HTMLInputElement.maxLength')
   @DocsEditable()
-  void set maxLength(int value) => _blink.Native_HTMLInputElement_maxLength_Setter(this, value);
+  void set maxLength(int value) => _blink.BlinkHTMLInputElement.$maxLength_Setter(this, value);
 
   @DomName('HTMLInputElement.min')
   @DocsEditable()
-  String get min => _blink.Native_HTMLInputElement_min_Getter(this);
+  String get min => _blink.BlinkHTMLInputElement.$min_Getter(this);
 
   @DomName('HTMLInputElement.min')
   @DocsEditable()
-  void set min(String value) => _blink.Native_HTMLInputElement_min_Setter(this, value);
+  void set min(String value) => _blink.BlinkHTMLInputElement.$min_Setter(this, value);
 
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
-  bool get multiple => _blink.Native_HTMLInputElement_multiple_Getter(this);
+  bool get multiple => _blink.BlinkHTMLInputElement.$multiple_Getter(this);
 
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
-  void set multiple(bool value) => _blink.Native_HTMLInputElement_multiple_Setter(this, value);
+  void set multiple(bool value) => _blink.BlinkHTMLInputElement.$multiple_Setter(this, value);
 
   @DomName('HTMLInputElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLInputElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLInputElement.$name_Getter(this);
 
   @DomName('HTMLInputElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLInputElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLInputElement.$name_Setter(this, value);
 
   @DomName('HTMLInputElement.pattern')
   @DocsEditable()
-  String get pattern => _blink.Native_HTMLInputElement_pattern_Getter(this);
+  String get pattern => _blink.BlinkHTMLInputElement.$pattern_Getter(this);
 
   @DomName('HTMLInputElement.pattern')
   @DocsEditable()
-  void set pattern(String value) => _blink.Native_HTMLInputElement_pattern_Setter(this, value);
+  void set pattern(String value) => _blink.BlinkHTMLInputElement.$pattern_Setter(this, value);
 
   @DomName('HTMLInputElement.placeholder')
   @DocsEditable()
-  String get placeholder => _blink.Native_HTMLInputElement_placeholder_Getter(this);
+  String get placeholder => _blink.BlinkHTMLInputElement.$placeholder_Getter(this);
 
   @DomName('HTMLInputElement.placeholder')
   @DocsEditable()
-  void set placeholder(String value) => _blink.Native_HTMLInputElement_placeholder_Setter(this, value);
+  void set placeholder(String value) => _blink.BlinkHTMLInputElement.$placeholder_Setter(this, value);
 
   @DomName('HTMLInputElement.readOnly')
   @DocsEditable()
-  bool get readOnly => _blink.Native_HTMLInputElement_readOnly_Getter(this);
+  bool get readOnly => _blink.BlinkHTMLInputElement.$readOnly_Getter(this);
 
   @DomName('HTMLInputElement.readOnly')
   @DocsEditable()
-  void set readOnly(bool value) => _blink.Native_HTMLInputElement_readOnly_Setter(this, value);
+  void set readOnly(bool value) => _blink.BlinkHTMLInputElement.$readOnly_Setter(this, value);
 
   @DomName('HTMLInputElement.required')
   @DocsEditable()
-  bool get required => _blink.Native_HTMLInputElement_required_Getter(this);
+  bool get required => _blink.BlinkHTMLInputElement.$required_Getter(this);
 
   @DomName('HTMLInputElement.required')
   @DocsEditable()
-  void set required(bool value) => _blink.Native_HTMLInputElement_required_Setter(this, value);
+  void set required(bool value) => _blink.BlinkHTMLInputElement.$required_Setter(this, value);
 
   @DomName('HTMLInputElement.selectionDirection')
   @DocsEditable()
-  String get selectionDirection => _blink.Native_HTMLInputElement_selectionDirection_Getter(this);
+  String get selectionDirection => _blink.BlinkHTMLInputElement.$selectionDirection_Getter(this);
 
   @DomName('HTMLInputElement.selectionDirection')
   @DocsEditable()
-  void set selectionDirection(String value) => _blink.Native_HTMLInputElement_selectionDirection_Setter(this, value);
+  void set selectionDirection(String value) => _blink.BlinkHTMLInputElement.$selectionDirection_Setter(this, value);
 
   @DomName('HTMLInputElement.selectionEnd')
   @DocsEditable()
-  int get selectionEnd => _blink.Native_HTMLInputElement_selectionEnd_Getter(this);
+  int get selectionEnd => _blink.BlinkHTMLInputElement.$selectionEnd_Getter(this);
 
   @DomName('HTMLInputElement.selectionEnd')
   @DocsEditable()
-  void set selectionEnd(int value) => _blink.Native_HTMLInputElement_selectionEnd_Setter(this, value);
+  void set selectionEnd(int value) => _blink.BlinkHTMLInputElement.$selectionEnd_Setter(this, value);
 
   @DomName('HTMLInputElement.selectionStart')
   @DocsEditable()
-  int get selectionStart => _blink.Native_HTMLInputElement_selectionStart_Getter(this);
+  int get selectionStart => _blink.BlinkHTMLInputElement.$selectionStart_Getter(this);
 
   @DomName('HTMLInputElement.selectionStart')
   @DocsEditable()
-  void set selectionStart(int value) => _blink.Native_HTMLInputElement_selectionStart_Setter(this, value);
+  void set selectionStart(int value) => _blink.BlinkHTMLInputElement.$selectionStart_Setter(this, value);
 
   @DomName('HTMLInputElement.size')
   @DocsEditable()
-  int get size => _blink.Native_HTMLInputElement_size_Getter(this);
+  int get size => _blink.BlinkHTMLInputElement.$size_Getter(this);
 
   @DomName('HTMLInputElement.size')
   @DocsEditable()
-  void set size(int value) => _blink.Native_HTMLInputElement_size_Setter(this, value);
+  void set size(int value) => _blink.BlinkHTMLInputElement.$size_Setter(this, value);
 
   @DomName('HTMLInputElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLInputElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLInputElement.$src_Getter(this);
 
   @DomName('HTMLInputElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLInputElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLInputElement.$src_Setter(this, value);
 
   @DomName('HTMLInputElement.step')
   @DocsEditable()
-  String get step => _blink.Native_HTMLInputElement_step_Getter(this);
+  String get step => _blink.BlinkHTMLInputElement.$step_Getter(this);
 
   @DomName('HTMLInputElement.step')
   @DocsEditable()
-  void set step(String value) => _blink.Native_HTMLInputElement_step_Setter(this, value);
+  void set step(String value) => _blink.BlinkHTMLInputElement.$step_Setter(this, value);
 
   @DomName('HTMLInputElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLInputElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLInputElement.$type_Getter(this);
 
   @DomName('HTMLInputElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLInputElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLInputElement.$type_Setter(this, value);
 
   @DomName('HTMLInputElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLInputElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLInputElement.$validationMessage_Getter(this);
 
   @DomName('HTMLInputElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLInputElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLInputElement.$validity_Getter(this);
 
   @DomName('HTMLInputElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLInputElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLInputElement.$value_Getter(this);
 
   @DomName('HTMLInputElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLInputElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLInputElement.$value_Setter(this, value);
 
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
-  DateTime get valueAsDate => _blink.Native_HTMLInputElement_valueAsDate_Getter(this);
+  DateTime get valueAsDate => _blink.BlinkHTMLInputElement.$valueAsDate_Getter(this);
 
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
-  void set valueAsDate(DateTime value) => _blink.Native_HTMLInputElement_valueAsDate_Setter(this, value);
+  void set valueAsDate(DateTime value) => _blink.BlinkHTMLInputElement.$valueAsDate_Setter(this, value);
 
   @DomName('HTMLInputElement.valueAsNumber')
   @DocsEditable()
-  num get valueAsNumber => _blink.Native_HTMLInputElement_valueAsNumber_Getter(this);
+  num get valueAsNumber => _blink.BlinkHTMLInputElement.$valueAsNumber_Getter(this);
 
   @DomName('HTMLInputElement.valueAsNumber')
   @DocsEditable()
-  void set valueAsNumber(num value) => _blink.Native_HTMLInputElement_valueAsNumber_Setter(this, value);
+  void set valueAsNumber(num value) => _blink.BlinkHTMLInputElement.$valueAsNumber_Setter(this, value);
 
   @DomName('HTMLInputElement.webkitEntries')
   @DocsEditable()
@@ -16926,7 +16926,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#concept-input-type-file-selected
-  List<Entry> get entries => _blink.Native_HTMLInputElement_webkitEntries_Getter(this);
+  List<Entry> get entries => _blink.BlinkHTMLInputElement.$webkitEntries_Getter(this);
 
   @DomName('HTMLInputElement.webkitdirectory')
   @DocsEditable()
@@ -16934,7 +16934,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  bool get directory => _blink.Native_HTMLInputElement_webkitdirectory_Getter(this);
+  bool get directory => _blink.BlinkHTMLInputElement.$webkitdirectory_Getter(this);
 
   @DomName('HTMLInputElement.webkitdirectory')
   @DocsEditable()
@@ -16942,39 +16942,39 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  void set directory(bool value) => _blink.Native_HTMLInputElement_webkitdirectory_Setter(this, value);
+  void set directory(bool value) => _blink.BlinkHTMLInputElement.$webkitdirectory_Setter(this, value);
 
   @DomName('HTMLInputElement.width')
   @DocsEditable()
-  int get width => _blink.Native_HTMLInputElement_width_Getter(this);
+  int get width => _blink.BlinkHTMLInputElement.$width_Getter(this);
 
   @DomName('HTMLInputElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.Native_HTMLInputElement_width_Setter(this, value);
+  void set width(int value) => _blink.BlinkHTMLInputElement.$width_Setter(this, value);
 
   @DomName('HTMLInputElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLInputElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLInputElement.$willValidate_Getter(this);
 
   @DomName('HTMLInputElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLInputElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLInputElement.$checkValidity_Callback(this);
 
   @DomName('HTMLInputElement.select')
   @DocsEditable()
-  void select() => _blink.Native_HTMLInputElement_select_Callback(this);
+  void select() => _blink.BlinkHTMLInputElement.$select_Callback(this);
 
   @DomName('HTMLInputElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLInputElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLInputElement.$setCustomValidity_Callback(this, error);
 
-  void setRangeText(String replacement, {int start, int end, String selectionMode}) => _blink.Native_HTMLInputElement_setRangeText(this, replacement, start, end, selectionMode);
+  void setRangeText(String replacement, {int start, int end, String selectionMode}) => _blink.BlinkHTMLInputElement.$setRangeText(this, replacement, start, end, selectionMode);
 
-  void setSelectionRange(int start, int end, [String direction]) => _blink.Native_HTMLInputElement_setSelectionRange(this, start, end, direction);
+  void setSelectionRange(int start, int end, [String direction]) => _blink.BlinkHTMLInputElement.$setSelectionRange(this, start, end, direction);
 
-  void stepDown([int n]) => _blink.Native_HTMLInputElement_stepDown(this, n);
+  void stepDown([int n]) => _blink.BlinkHTMLInputElement.$stepDown(this, n);
 
-  void stepUp([int n]) => _blink.Native_HTMLInputElement_stepUp(this, n);
+  void stepUp([int n]) => _blink.BlinkHTMLInputElement.$stepUp(this, n);
 
   /// Stream of `speechchange` events handled by this [InputElement].
   @DomName('HTMLInputElement.onwebkitSpeechChange')
@@ -17558,25 +17558,25 @@
   @DomName('InputMethodContext.compositionEndOffset')
   @DocsEditable()
   @Experimental() // untriaged
-  int get compositionEndOffset => _blink.Native_InputMethodContext_compositionEndOffset_Getter(this);
+  int get compositionEndOffset => _blink.BlinkInputMethodContext.$compositionEndOffset_Getter(this);
 
   @DomName('InputMethodContext.compositionStartOffset')
   @DocsEditable()
   @Experimental() // untriaged
-  int get compositionStartOffset => _blink.Native_InputMethodContext_compositionStartOffset_Getter(this);
+  int get compositionStartOffset => _blink.BlinkInputMethodContext.$compositionStartOffset_Getter(this);
 
   @DomName('InputMethodContext.locale')
   @DocsEditable()
-  String get locale => _blink.Native_InputMethodContext_locale_Getter(this);
+  String get locale => _blink.BlinkInputMethodContext.$locale_Getter(this);
 
   @DomName('InputMethodContext.target')
   @DocsEditable()
   @Experimental() // untriaged
-  HtmlElement get target => _blink.Native_InputMethodContext_target_Getter(this);
+  HtmlElement get target => _blink.BlinkInputMethodContext.$target_Getter(this);
 
   @DomName('InputMethodContext.confirmComposition')
   @DocsEditable()
-  void confirmComposition() => _blink.Native_InputMethodContext_confirmComposition_Callback(this);
+  void confirmComposition() => _blink.BlinkInputMethodContext.$confirmComposition_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17596,7 +17596,7 @@
   @DomName('InstallEvent.replace')
   @DocsEditable()
   @Experimental() // untriaged
-  void replace() => _blink.Native_InstallEvent_replace_Callback(this);
+  void replace() => _blink.BlinkInstallEvent.$replace_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17616,7 +17616,7 @@
   @DomName('InstallPhaseEvent.waitUntil')
   @DocsEditable()
   @Experimental() // untriaged
-  void waitUntil(Object value) => _blink.Native_InstallPhaseEvent_waitUntil_Callback(this, value);
+  void waitUntil(Object value) => _blink.BlinkInstallPhaseEvent.$waitUntil_Callback(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17636,12 +17636,12 @@
   @DomName('KeyPair.privateKey')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoKey get privateKey => _blink.Native_KeyPair_privateKey_Getter(this);
+  CryptoKey get privateKey => _blink.BlinkKeyPair.$privateKey_Getter(this);
 
   @DomName('KeyPair.publicKey')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoKey get publicKey => _blink.Native_KeyPair_publicKey_Getter(this);
+  CryptoKey get publicKey => _blink.BlinkKeyPair.$publicKey_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17697,52 +17697,52 @@
   @DomName('KeyboardEvent.altGraphKey')
   @DocsEditable()
   @Experimental() // nonstandard
-  bool get altGraphKey => _blink.Native_KeyboardEvent_altGraphKey_Getter(this);
+  bool get altGraphKey => _blink.BlinkKeyboardEvent.$altGraphKey_Getter(this);
 
   @DomName('KeyboardEvent.altKey')
   @DocsEditable()
-  bool get altKey => _blink.Native_KeyboardEvent_altKey_Getter(this);
+  bool get altKey => _blink.BlinkKeyboardEvent.$altKey_Getter(this);
 
   @DomName('KeyboardEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey => _blink.Native_KeyboardEvent_ctrlKey_Getter(this);
+  bool get ctrlKey => _blink.BlinkKeyboardEvent.$ctrlKey_Getter(this);
 
   @DomName('KeyboardEvent.keyIdentifier')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get _keyIdentifier => _blink.Native_KeyboardEvent_keyIdentifier_Getter(this);
+  String get _keyIdentifier => _blink.BlinkKeyboardEvent.$keyIdentifier_Getter(this);
 
   @DomName('KeyboardEvent.keyLocation')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get keyLocation => _blink.Native_KeyboardEvent_keyLocation_Getter(this);
+  int get keyLocation => _blink.BlinkKeyboardEvent.$keyLocation_Getter(this);
 
   @DomName('KeyboardEvent.location')
   @DocsEditable()
   @Experimental() // untriaged
-  int get location => _blink.Native_KeyboardEvent_location_Getter(this);
+  int get location => _blink.BlinkKeyboardEvent.$location_Getter(this);
 
   @DomName('KeyboardEvent.metaKey')
   @DocsEditable()
-  bool get metaKey => _blink.Native_KeyboardEvent_metaKey_Getter(this);
+  bool get metaKey => _blink.BlinkKeyboardEvent.$metaKey_Getter(this);
 
   @DomName('KeyboardEvent.repeat')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get repeat => _blink.Native_KeyboardEvent_repeat_Getter(this);
+  bool get repeat => _blink.BlinkKeyboardEvent.$repeat_Getter(this);
 
   @DomName('KeyboardEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey => _blink.Native_KeyboardEvent_shiftKey_Getter(this);
+  bool get shiftKey => _blink.BlinkKeyboardEvent.$shiftKey_Getter(this);
 
   @DomName('KeyboardEvent.getModifierState')
   @DocsEditable()
   @Experimental() // untriaged
-  bool getModifierState(String keyArgument) => _blink.Native_KeyboardEvent_getModifierState_Callback(this, keyArgument);
+  bool getModifierState(String keyArgument) => _blink.BlinkKeyboardEvent.$getModifierState_Callback(this, keyArgument);
 
   @DomName('KeyboardEvent.initKeyboardEvent')
   @DocsEditable()
-  void _initKeyboardEvent(String type, bool canBubble, bool cancelable, Window view, String keyIdentifier, int location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) => _blink.Native_KeyboardEvent_initKeyboardEvent_Callback(this, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
+  void _initKeyboardEvent(String type, bool canBubble, bool cancelable, Window view, String keyIdentifier, int location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) => _blink.BlinkKeyboardEvent.$initKeyboardEvent_Callback(this, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17777,76 +17777,76 @@
 
   @DomName('HTMLKeygenElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.Native_HTMLKeygenElement_autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLKeygenElement.$autofocus_Getter(this);
 
   @DomName('HTMLKeygenElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.Native_HTMLKeygenElement_autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLKeygenElement.$autofocus_Setter(this, value);
 
   @DomName('HTMLKeygenElement.challenge')
   @DocsEditable()
-  String get challenge => _blink.Native_HTMLKeygenElement_challenge_Getter(this);
+  String get challenge => _blink.BlinkHTMLKeygenElement.$challenge_Getter(this);
 
   @DomName('HTMLKeygenElement.challenge')
   @DocsEditable()
-  void set challenge(String value) => _blink.Native_HTMLKeygenElement_challenge_Setter(this, value);
+  void set challenge(String value) => _blink.BlinkHTMLKeygenElement.$challenge_Setter(this, value);
 
   @DomName('HTMLKeygenElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLKeygenElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLKeygenElement.$disabled_Getter(this);
 
   @DomName('HTMLKeygenElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLKeygenElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLKeygenElement.$disabled_Setter(this, value);
 
   @DomName('HTMLKeygenElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLKeygenElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLKeygenElement.$form_Getter(this);
 
   @DomName('HTMLKeygenElement.keytype')
   @DocsEditable()
-  String get keytype => _blink.Native_HTMLKeygenElement_keytype_Getter(this);
+  String get keytype => _blink.BlinkHTMLKeygenElement.$keytype_Getter(this);
 
   @DomName('HTMLKeygenElement.keytype')
   @DocsEditable()
-  void set keytype(String value) => _blink.Native_HTMLKeygenElement_keytype_Setter(this, value);
+  void set keytype(String value) => _blink.BlinkHTMLKeygenElement.$keytype_Setter(this, value);
 
   @DomName('HTMLKeygenElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLKeygenElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLKeygenElement.$labels_Getter(this);
 
   @DomName('HTMLKeygenElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLKeygenElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLKeygenElement.$name_Getter(this);
 
   @DomName('HTMLKeygenElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLKeygenElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLKeygenElement.$name_Setter(this, value);
 
   @DomName('HTMLKeygenElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLKeygenElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLKeygenElement.$type_Getter(this);
 
   @DomName('HTMLKeygenElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLKeygenElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLKeygenElement.$validationMessage_Getter(this);
 
   @DomName('HTMLKeygenElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLKeygenElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLKeygenElement.$validity_Getter(this);
 
   @DomName('HTMLKeygenElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLKeygenElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLKeygenElement.$willValidate_Getter(this);
 
   @DomName('HTMLKeygenElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLKeygenElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLKeygenElement.$checkValidity_Callback(this);
 
   @DomName('HTMLKeygenElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLKeygenElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLKeygenElement.$setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17874,11 +17874,11 @@
 
   @DomName('HTMLLIElement.value')
   @DocsEditable()
-  int get value => _blink.Native_HTMLLIElement_value_Getter(this);
+  int get value => _blink.BlinkHTMLLIElement.$value_Getter(this);
 
   @DomName('HTMLLIElement.value')
   @DocsEditable()
-  void set value(int value) => _blink.Native_HTMLLIElement_value_Setter(this, value);
+  void set value(int value) => _blink.BlinkHTMLLIElement.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17906,19 +17906,19 @@
 
   @DomName('HTMLLabelElement.control')
   @DocsEditable()
-  HtmlElement get control => _blink.Native_HTMLLabelElement_control_Getter(this);
+  HtmlElement get control => _blink.BlinkHTMLLabelElement.$control_Getter(this);
 
   @DomName('HTMLLabelElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLLabelElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLLabelElement.$form_Getter(this);
 
   @DomName('HTMLLabelElement.htmlFor')
   @DocsEditable()
-  String get htmlFor => _blink.Native_HTMLLabelElement_htmlFor_Getter(this);
+  String get htmlFor => _blink.BlinkHTMLLabelElement.$htmlFor_Getter(this);
 
   @DomName('HTMLLabelElement.htmlFor')
   @DocsEditable()
-  void set htmlFor(String value) => _blink.Native_HTMLLabelElement_htmlFor_Setter(this, value);
+  void set htmlFor(String value) => _blink.BlinkHTMLLabelElement.$htmlFor_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17946,7 +17946,7 @@
 
   @DomName('HTMLLegendElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLLegendElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLLegendElement.$form_Getter(this);
 
 }
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
@@ -17973,74 +17973,74 @@
   @DomName('HTMLLinkElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get crossOrigin => _blink.Native_HTMLLinkElement_crossOrigin_Getter(this);
+  String get crossOrigin => _blink.BlinkHTMLLinkElement.$crossOrigin_Getter(this);
 
   @DomName('HTMLLinkElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  void set crossOrigin(String value) => _blink.Native_HTMLLinkElement_crossOrigin_Setter(this, value);
+  void set crossOrigin(String value) => _blink.BlinkHTMLLinkElement.$crossOrigin_Setter(this, value);
 
   @DomName('HTMLLinkElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLLinkElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLLinkElement.$disabled_Getter(this);
 
   @DomName('HTMLLinkElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLLinkElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLLinkElement.$disabled_Setter(this, value);
 
   @DomName('HTMLLinkElement.href')
   @DocsEditable()
-  String get href => _blink.Native_HTMLLinkElement_href_Getter(this);
+  String get href => _blink.BlinkHTMLLinkElement.$href_Getter(this);
 
   @DomName('HTMLLinkElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.Native_HTMLLinkElement_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkHTMLLinkElement.$href_Setter(this, value);
 
   @DomName('HTMLLinkElement.hreflang')
   @DocsEditable()
-  String get hreflang => _blink.Native_HTMLLinkElement_hreflang_Getter(this);
+  String get hreflang => _blink.BlinkHTMLLinkElement.$hreflang_Getter(this);
 
   @DomName('HTMLLinkElement.hreflang')
   @DocsEditable()
-  void set hreflang(String value) => _blink.Native_HTMLLinkElement_hreflang_Setter(this, value);
+  void set hreflang(String value) => _blink.BlinkHTMLLinkElement.$hreflang_Setter(this, value);
 
   @DomName('HTMLLinkElement.import')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html#interface-import
   @Experimental()
-  Document get import => _blink.Native_HTMLLinkElement_import_Getter(this);
+  Document get import => _blink.BlinkHTMLLinkElement.$import_Getter(this);
 
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
-  String get media => _blink.Native_HTMLLinkElement_media_Getter(this);
+  String get media => _blink.BlinkHTMLLinkElement.$media_Getter(this);
 
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.Native_HTMLLinkElement_media_Setter(this, value);
+  void set media(String value) => _blink.BlinkHTMLLinkElement.$media_Setter(this, value);
 
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
-  String get rel => _blink.Native_HTMLLinkElement_rel_Getter(this);
+  String get rel => _blink.BlinkHTMLLinkElement.$rel_Getter(this);
 
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
-  void set rel(String value) => _blink.Native_HTMLLinkElement_rel_Setter(this, value);
+  void set rel(String value) => _blink.BlinkHTMLLinkElement.$rel_Setter(this, value);
 
   @DomName('HTMLLinkElement.sheet')
   @DocsEditable()
-  StyleSheet get sheet => _blink.Native_HTMLLinkElement_sheet_Getter(this);
+  StyleSheet get sheet => _blink.BlinkHTMLLinkElement.$sheet_Getter(this);
 
   @DomName('HTMLLinkElement.sizes')
   @DocsEditable()
-  DomSettableTokenList get sizes => _blink.Native_HTMLLinkElement_sizes_Getter(this);
+  DomSettableTokenList get sizes => _blink.BlinkHTMLLinkElement.$sizes_Getter(this);
 
   @DomName('HTMLLinkElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLLinkElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLLinkElement.$type_Getter(this);
 
   @DomName('HTMLLinkElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLLinkElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLLinkElement.$type_Setter(this, value);
 
 
     /// Checks if HTML imports are supported on the current platform.
@@ -18062,93 +18062,93 @@
   @DomName('Location.ancestorOrigins')
   @DocsEditable()
   @Experimental() // nonstandard
-  List<String> get ancestorOrigins => _blink.Native_Location_ancestorOrigins_Getter(this);
+  List<String> get ancestorOrigins => _blink.BlinkLocation.$ancestorOrigins_Getter(this);
 
   @DomName('Location.hash')
   @DocsEditable()
-  String get hash => _blink.Native_Location_hash_Getter(this);
+  String get hash => _blink.BlinkLocation.$hash_Getter(this);
 
   @DomName('Location.hash')
   @DocsEditable()
-  void set hash(String value) => _blink.Native_Location_hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkLocation.$hash_Setter(this, value);
 
   @DomName('Location.host')
   @DocsEditable()
-  String get host => _blink.Native_Location_host_Getter(this);
+  String get host => _blink.BlinkLocation.$host_Getter(this);
 
   @DomName('Location.host')
   @DocsEditable()
-  void set host(String value) => _blink.Native_Location_host_Setter(this, value);
+  void set host(String value) => _blink.BlinkLocation.$host_Setter(this, value);
 
   @DomName('Location.hostname')
   @DocsEditable()
-  String get hostname => _blink.Native_Location_hostname_Getter(this);
+  String get hostname => _blink.BlinkLocation.$hostname_Getter(this);
 
   @DomName('Location.hostname')
   @DocsEditable()
-  void set hostname(String value) => _blink.Native_Location_hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkLocation.$hostname_Setter(this, value);
 
   @DomName('Location.href')
   @DocsEditable()
-  String get href => _blink.Native_Location_href_Getter(this);
+  String get href => _blink.BlinkLocation.$href_Getter(this);
 
   @DomName('Location.href')
   @DocsEditable()
-  void set href(String value) => _blink.Native_Location_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkLocation.$href_Setter(this, value);
 
   @DomName('Location.origin')
   @DocsEditable()
   // http://url.spec.whatwg.org/#urlutils Webkit Only
   @Experimental() // non-standard
-  String get origin => _blink.Native_Location_origin_Getter(this);
+  String get origin => _blink.BlinkLocation.$origin_Getter(this);
 
   @DomName('Location.pathname')
   @DocsEditable()
-  String get pathname => _blink.Native_Location_pathname_Getter(this);
+  String get pathname => _blink.BlinkLocation.$pathname_Getter(this);
 
   @DomName('Location.pathname')
   @DocsEditable()
-  void set pathname(String value) => _blink.Native_Location_pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkLocation.$pathname_Setter(this, value);
 
   @DomName('Location.port')
   @DocsEditable()
-  String get port => _blink.Native_Location_port_Getter(this);
+  String get port => _blink.BlinkLocation.$port_Getter(this);
 
   @DomName('Location.port')
   @DocsEditable()
-  void set port(String value) => _blink.Native_Location_port_Setter(this, value);
+  void set port(String value) => _blink.BlinkLocation.$port_Setter(this, value);
 
   @DomName('Location.protocol')
   @DocsEditable()
-  String get protocol => _blink.Native_Location_protocol_Getter(this);
+  String get protocol => _blink.BlinkLocation.$protocol_Getter(this);
 
   @DomName('Location.protocol')
   @DocsEditable()
-  void set protocol(String value) => _blink.Native_Location_protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkLocation.$protocol_Setter(this, value);
 
   @DomName('Location.search')
   @DocsEditable()
-  String get search => _blink.Native_Location_search_Getter(this);
+  String get search => _blink.BlinkLocation.$search_Getter(this);
 
   @DomName('Location.search')
   @DocsEditable()
-  void set search(String value) => _blink.Native_Location_search_Setter(this, value);
+  void set search(String value) => _blink.BlinkLocation.$search_Setter(this, value);
 
   @DomName('Location.assign')
   @DocsEditable()
-  void assign(String url) => _blink.Native_Location_assign_Callback(this, url);
+  void assign(String url) => _blink.BlinkLocation.$assign_Callback(this, url);
 
   @DomName('Location.reload')
   @DocsEditable()
-  void reload() => _blink.Native_Location_reload_Callback(this);
+  void reload() => _blink.BlinkLocation.$reload_Callback(this);
 
   @DomName('Location.replace')
   @DocsEditable()
-  void replace(String url) => _blink.Native_Location_replace_Callback(this, url);
+  void replace(String url) => _blink.BlinkLocation.$replace_Callback(this, url);
 
   @DomName('Location.toString')
   @DocsEditable()
-  String toString() => _blink.Native_Location_toString_Callback(this);
+  String toString() => _blink.BlinkLocation.$toString_Callback(this);
 
 
 }
@@ -18198,15 +18198,15 @@
 
   @DomName('HTMLMapElement.areas')
   @DocsEditable()
-  List<Node> get areas => _blink.Native_HTMLMapElement_areas_Getter(this);
+  List<Node> get areas => _blink.BlinkHTMLMapElement.$areas_Getter(this);
 
   @DomName('HTMLMapElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLMapElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLMapElement.$name_Getter(this);
 
   @DomName('HTMLMapElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLMapElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLMapElement.$name_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18226,83 +18226,83 @@
 
   @DomName('MediaController.MediaController')
   @DocsEditable()
-  factory MediaController() => _blink.Native_MediaController_MediaController();
+  factory MediaController() => _blink.BlinkMediaController.$mkMediaController();
 
   @DomName('MediaController.buffered')
   @DocsEditable()
-  TimeRanges get buffered => _blink.Native_MediaController_buffered_Getter(this);
+  TimeRanges get buffered => _blink.BlinkMediaController.$buffered_Getter(this);
 
   @DomName('MediaController.currentTime')
   @DocsEditable()
-  num get currentTime => _blink.Native_MediaController_currentTime_Getter(this);
+  num get currentTime => _blink.BlinkMediaController.$currentTime_Getter(this);
 
   @DomName('MediaController.currentTime')
   @DocsEditable()
-  void set currentTime(num value) => _blink.Native_MediaController_currentTime_Setter(this, value);
+  void set currentTime(num value) => _blink.BlinkMediaController.$currentTime_Setter(this, value);
 
   @DomName('MediaController.defaultPlaybackRate')
   @DocsEditable()
-  num get defaultPlaybackRate => _blink.Native_MediaController_defaultPlaybackRate_Getter(this);
+  num get defaultPlaybackRate => _blink.BlinkMediaController.$defaultPlaybackRate_Getter(this);
 
   @DomName('MediaController.defaultPlaybackRate')
   @DocsEditable()
-  void set defaultPlaybackRate(num value) => _blink.Native_MediaController_defaultPlaybackRate_Setter(this, value);
+  void set defaultPlaybackRate(num value) => _blink.BlinkMediaController.$defaultPlaybackRate_Setter(this, value);
 
   @DomName('MediaController.duration')
   @DocsEditable()
-  double get duration => _blink.Native_MediaController_duration_Getter(this);
+  double get duration => _blink.BlinkMediaController.$duration_Getter(this);
 
   @DomName('MediaController.muted')
   @DocsEditable()
-  bool get muted => _blink.Native_MediaController_muted_Getter(this);
+  bool get muted => _blink.BlinkMediaController.$muted_Getter(this);
 
   @DomName('MediaController.muted')
   @DocsEditable()
-  void set muted(bool value) => _blink.Native_MediaController_muted_Setter(this, value);
+  void set muted(bool value) => _blink.BlinkMediaController.$muted_Setter(this, value);
 
   @DomName('MediaController.paused')
   @DocsEditable()
-  bool get paused => _blink.Native_MediaController_paused_Getter(this);
+  bool get paused => _blink.BlinkMediaController.$paused_Getter(this);
 
   @DomName('MediaController.playbackRate')
   @DocsEditable()
-  num get playbackRate => _blink.Native_MediaController_playbackRate_Getter(this);
+  num get playbackRate => _blink.BlinkMediaController.$playbackRate_Getter(this);
 
   @DomName('MediaController.playbackRate')
   @DocsEditable()
-  void set playbackRate(num value) => _blink.Native_MediaController_playbackRate_Setter(this, value);
+  void set playbackRate(num value) => _blink.BlinkMediaController.$playbackRate_Setter(this, value);
 
   @DomName('MediaController.playbackState')
   @DocsEditable()
-  String get playbackState => _blink.Native_MediaController_playbackState_Getter(this);
+  String get playbackState => _blink.BlinkMediaController.$playbackState_Getter(this);
 
   @DomName('MediaController.played')
   @DocsEditable()
-  TimeRanges get played => _blink.Native_MediaController_played_Getter(this);
+  TimeRanges get played => _blink.BlinkMediaController.$played_Getter(this);
 
   @DomName('MediaController.seekable')
   @DocsEditable()
-  TimeRanges get seekable => _blink.Native_MediaController_seekable_Getter(this);
+  TimeRanges get seekable => _blink.BlinkMediaController.$seekable_Getter(this);
 
   @DomName('MediaController.volume')
   @DocsEditable()
-  num get volume => _blink.Native_MediaController_volume_Getter(this);
+  num get volume => _blink.BlinkMediaController.$volume_Getter(this);
 
   @DomName('MediaController.volume')
   @DocsEditable()
-  void set volume(num value) => _blink.Native_MediaController_volume_Setter(this, value);
+  void set volume(num value) => _blink.BlinkMediaController.$volume_Setter(this, value);
 
   @DomName('MediaController.pause')
   @DocsEditable()
-  void pause() => _blink.Native_MediaController_pause_Callback(this);
+  void pause() => _blink.BlinkMediaController.$pause_Callback(this);
 
   @DomName('MediaController.play')
   @DocsEditable()
-  void play() => _blink.Native_MediaController_play_Callback(this);
+  void play() => _blink.BlinkMediaController.$play_Callback(this);
 
   @DomName('MediaController.unpause')
   @DocsEditable()
-  void unpause() => _blink.Native_MediaController_unpause_Callback(this);
+  void unpause() => _blink.BlinkMediaController.$unpause_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18631,173 +18631,173 @@
 
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
-  bool get autoplay => _blink.Native_HTMLMediaElement_autoplay_Getter(this);
+  bool get autoplay => _blink.BlinkHTMLMediaElement.$autoplay_Getter(this);
 
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
-  void set autoplay(bool value) => _blink.Native_HTMLMediaElement_autoplay_Setter(this, value);
+  void set autoplay(bool value) => _blink.BlinkHTMLMediaElement.$autoplay_Setter(this, value);
 
   @DomName('HTMLMediaElement.buffered')
   @DocsEditable()
-  TimeRanges get buffered => _blink.Native_HTMLMediaElement_buffered_Getter(this);
+  TimeRanges get buffered => _blink.BlinkHTMLMediaElement.$buffered_Getter(this);
 
   @DomName('HTMLMediaElement.controller')
   @DocsEditable()
-  MediaController get controller => _blink.Native_HTMLMediaElement_controller_Getter(this);
+  MediaController get controller => _blink.BlinkHTMLMediaElement.$controller_Getter(this);
 
   @DomName('HTMLMediaElement.controller')
   @DocsEditable()
-  void set controller(MediaController value) => _blink.Native_HTMLMediaElement_controller_Setter(this, value);
+  void set controller(MediaController value) => _blink.BlinkHTMLMediaElement.$controller_Setter(this, value);
 
   @DomName('HTMLMediaElement.controls')
   @DocsEditable()
-  bool get controls => _blink.Native_HTMLMediaElement_controls_Getter(this);
+  bool get controls => _blink.BlinkHTMLMediaElement.$controls_Getter(this);
 
   @DomName('HTMLMediaElement.controls')
   @DocsEditable()
-  void set controls(bool value) => _blink.Native_HTMLMediaElement_controls_Setter(this, value);
+  void set controls(bool value) => _blink.BlinkHTMLMediaElement.$controls_Setter(this, value);
 
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get crossOrigin => _blink.Native_HTMLMediaElement_crossOrigin_Getter(this);
+  String get crossOrigin => _blink.BlinkHTMLMediaElement.$crossOrigin_Getter(this);
 
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  void set crossOrigin(String value) => _blink.Native_HTMLMediaElement_crossOrigin_Setter(this, value);
+  void set crossOrigin(String value) => _blink.BlinkHTMLMediaElement.$crossOrigin_Setter(this, value);
 
   @DomName('HTMLMediaElement.currentSrc')
   @DocsEditable()
-  String get currentSrc => _blink.Native_HTMLMediaElement_currentSrc_Getter(this);
+  String get currentSrc => _blink.BlinkHTMLMediaElement.$currentSrc_Getter(this);
 
   @DomName('HTMLMediaElement.currentTime')
   @DocsEditable()
-  num get currentTime => _blink.Native_HTMLMediaElement_currentTime_Getter(this);
+  num get currentTime => _blink.BlinkHTMLMediaElement.$currentTime_Getter(this);
 
   @DomName('HTMLMediaElement.currentTime')
   @DocsEditable()
-  void set currentTime(num value) => _blink.Native_HTMLMediaElement_currentTime_Setter(this, value);
+  void set currentTime(num value) => _blink.BlinkHTMLMediaElement.$currentTime_Setter(this, value);
 
   @DomName('HTMLMediaElement.defaultMuted')
   @DocsEditable()
-  bool get defaultMuted => _blink.Native_HTMLMediaElement_defaultMuted_Getter(this);
+  bool get defaultMuted => _blink.BlinkHTMLMediaElement.$defaultMuted_Getter(this);
 
   @DomName('HTMLMediaElement.defaultMuted')
   @DocsEditable()
-  void set defaultMuted(bool value) => _blink.Native_HTMLMediaElement_defaultMuted_Setter(this, value);
+  void set defaultMuted(bool value) => _blink.BlinkHTMLMediaElement.$defaultMuted_Setter(this, value);
 
   @DomName('HTMLMediaElement.defaultPlaybackRate')
   @DocsEditable()
-  num get defaultPlaybackRate => _blink.Native_HTMLMediaElement_defaultPlaybackRate_Getter(this);
+  num get defaultPlaybackRate => _blink.BlinkHTMLMediaElement.$defaultPlaybackRate_Getter(this);
 
   @DomName('HTMLMediaElement.defaultPlaybackRate')
   @DocsEditable()
-  void set defaultPlaybackRate(num value) => _blink.Native_HTMLMediaElement_defaultPlaybackRate_Setter(this, value);
+  void set defaultPlaybackRate(num value) => _blink.BlinkHTMLMediaElement.$defaultPlaybackRate_Setter(this, value);
 
   @DomName('HTMLMediaElement.duration')
   @DocsEditable()
-  double get duration => _blink.Native_HTMLMediaElement_duration_Getter(this);
+  double get duration => _blink.BlinkHTMLMediaElement.$duration_Getter(this);
 
   @DomName('HTMLMediaElement.ended')
   @DocsEditable()
-  bool get ended => _blink.Native_HTMLMediaElement_ended_Getter(this);
+  bool get ended => _blink.BlinkHTMLMediaElement.$ended_Getter(this);
 
   @DomName('HTMLMediaElement.error')
   @DocsEditable()
-  MediaError get error => _blink.Native_HTMLMediaElement_error_Getter(this);
+  MediaError get error => _blink.BlinkHTMLMediaElement.$error_Getter(this);
 
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
-  bool get loop => _blink.Native_HTMLMediaElement_loop_Getter(this);
+  bool get loop => _blink.BlinkHTMLMediaElement.$loop_Getter(this);
 
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
-  void set loop(bool value) => _blink.Native_HTMLMediaElement_loop_Setter(this, value);
+  void set loop(bool value) => _blink.BlinkHTMLMediaElement.$loop_Setter(this, value);
 
   @DomName('HTMLMediaElement.mediaGroup')
   @DocsEditable()
-  String get mediaGroup => _blink.Native_HTMLMediaElement_mediaGroup_Getter(this);
+  String get mediaGroup => _blink.BlinkHTMLMediaElement.$mediaGroup_Getter(this);
 
   @DomName('HTMLMediaElement.mediaGroup')
   @DocsEditable()
-  void set mediaGroup(String value) => _blink.Native_HTMLMediaElement_mediaGroup_Setter(this, value);
+  void set mediaGroup(String value) => _blink.BlinkHTMLMediaElement.$mediaGroup_Setter(this, value);
 
   @DomName('HTMLMediaElement.mediaKeys')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html
   @Experimental()
-  MediaKeys get mediaKeys => _blink.Native_HTMLMediaElement_mediaKeys_Getter(this);
+  MediaKeys get mediaKeys => _blink.BlinkHTMLMediaElement.$mediaKeys_Getter(this);
 
   @DomName('HTMLMediaElement.muted')
   @DocsEditable()
-  bool get muted => _blink.Native_HTMLMediaElement_muted_Getter(this);
+  bool get muted => _blink.BlinkHTMLMediaElement.$muted_Getter(this);
 
   @DomName('HTMLMediaElement.muted')
   @DocsEditable()
-  void set muted(bool value) => _blink.Native_HTMLMediaElement_muted_Setter(this, value);
+  void set muted(bool value) => _blink.BlinkHTMLMediaElement.$muted_Setter(this, value);
 
   @DomName('HTMLMediaElement.networkState')
   @DocsEditable()
-  int get networkState => _blink.Native_HTMLMediaElement_networkState_Getter(this);
+  int get networkState => _blink.BlinkHTMLMediaElement.$networkState_Getter(this);
 
   @DomName('HTMLMediaElement.paused')
   @DocsEditable()
-  bool get paused => _blink.Native_HTMLMediaElement_paused_Getter(this);
+  bool get paused => _blink.BlinkHTMLMediaElement.$paused_Getter(this);
 
   @DomName('HTMLMediaElement.playbackRate')
   @DocsEditable()
-  num get playbackRate => _blink.Native_HTMLMediaElement_playbackRate_Getter(this);
+  num get playbackRate => _blink.BlinkHTMLMediaElement.$playbackRate_Getter(this);
 
   @DomName('HTMLMediaElement.playbackRate')
   @DocsEditable()
-  void set playbackRate(num value) => _blink.Native_HTMLMediaElement_playbackRate_Setter(this, value);
+  void set playbackRate(num value) => _blink.BlinkHTMLMediaElement.$playbackRate_Setter(this, value);
 
   @DomName('HTMLMediaElement.played')
   @DocsEditable()
-  TimeRanges get played => _blink.Native_HTMLMediaElement_played_Getter(this);
+  TimeRanges get played => _blink.BlinkHTMLMediaElement.$played_Getter(this);
 
   @DomName('HTMLMediaElement.preload')
   @DocsEditable()
-  String get preload => _blink.Native_HTMLMediaElement_preload_Getter(this);
+  String get preload => _blink.BlinkHTMLMediaElement.$preload_Getter(this);
 
   @DomName('HTMLMediaElement.preload')
   @DocsEditable()
-  void set preload(String value) => _blink.Native_HTMLMediaElement_preload_Setter(this, value);
+  void set preload(String value) => _blink.BlinkHTMLMediaElement.$preload_Setter(this, value);
 
   @DomName('HTMLMediaElement.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_HTMLMediaElement_readyState_Getter(this);
+  int get readyState => _blink.BlinkHTMLMediaElement.$readyState_Getter(this);
 
   @DomName('HTMLMediaElement.seekable')
   @DocsEditable()
-  TimeRanges get seekable => _blink.Native_HTMLMediaElement_seekable_Getter(this);
+  TimeRanges get seekable => _blink.BlinkHTMLMediaElement.$seekable_Getter(this);
 
   @DomName('HTMLMediaElement.seeking')
   @DocsEditable()
-  bool get seeking => _blink.Native_HTMLMediaElement_seeking_Getter(this);
+  bool get seeking => _blink.BlinkHTMLMediaElement.$seeking_Getter(this);
 
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLMediaElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLMediaElement.$src_Getter(this);
 
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLMediaElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLMediaElement.$src_Setter(this, value);
 
   @DomName('HTMLMediaElement.textTracks')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-texttracks
   @Experimental()
-  TextTrackList get textTracks => _blink.Native_HTMLMediaElement_textTracks_Getter(this);
+  TextTrackList get textTracks => _blink.BlinkHTMLMediaElement.$textTracks_Getter(this);
 
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
-  num get volume => _blink.Native_HTMLMediaElement_volume_Getter(this);
+  num get volume => _blink.BlinkHTMLMediaElement.$volume_Getter(this);
 
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
-  void set volume(num value) => _blink.Native_HTMLMediaElement_volume_Setter(this, value);
+  void set volume(num value) => _blink.BlinkHTMLMediaElement.$volume_Setter(this, value);
 
   @DomName('HTMLMediaElement.webkitAudioDecodedByteCount')
   @DocsEditable()
@@ -18805,7 +18805,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // nonstandard
-  int get audioDecodedByteCount => _blink.Native_HTMLMediaElement_webkitAudioDecodedByteCount_Getter(this);
+  int get audioDecodedByteCount => _blink.BlinkHTMLMediaElement.$webkitAudioDecodedByteCount_Getter(this);
 
   @DomName('HTMLMediaElement.webkitVideoDecodedByteCount')
   @DocsEditable()
@@ -18813,33 +18813,33 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // nonstandard
-  int get videoDecodedByteCount => _blink.Native_HTMLMediaElement_webkitVideoDecodedByteCount_Getter(this);
+  int get videoDecodedByteCount => _blink.BlinkHTMLMediaElement.$webkitVideoDecodedByteCount_Getter(this);
 
-  TextTrack addTextTrack(String kind, [String label, String language]) => _blink.Native_HTMLMediaElement_addTextTrack(this, kind, label, language);
+  TextTrack addTextTrack(String kind, [String label, String language]) => _blink.BlinkHTMLMediaElement.$addTextTrack(this, kind, label, language);
 
   @DomName('HTMLMediaElement.canPlayType')
   @DocsEditable()
   @Unstable()
-  String canPlayType(String type, [String keySystem]) => _blink.Native_HTMLMediaElement_canPlayType_Callback(this, type, keySystem);
+  String canPlayType(String type, [String keySystem]) => _blink.BlinkHTMLMediaElement.$canPlayType_Callback(this, type, keySystem);
 
   @DomName('HTMLMediaElement.load')
   @DocsEditable()
-  void load() => _blink.Native_HTMLMediaElement_load_Callback(this);
+  void load() => _blink.BlinkHTMLMediaElement.$load_Callback(this);
 
   @DomName('HTMLMediaElement.pause')
   @DocsEditable()
-  void pause() => _blink.Native_HTMLMediaElement_pause_Callback(this);
+  void pause() => _blink.BlinkHTMLMediaElement.$pause_Callback(this);
 
   @DomName('HTMLMediaElement.play')
   @DocsEditable()
-  void play() => _blink.Native_HTMLMediaElement_play_Callback(this);
+  void play() => _blink.BlinkHTMLMediaElement.$play_Callback(this);
 
   @DomName('HTMLMediaElement.setMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  void setMediaKeys(MediaKeys mediaKeys) => _blink.Native_HTMLMediaElement_setMediaKeys_Callback(this, mediaKeys);
+  void setMediaKeys(MediaKeys mediaKeys) => _blink.BlinkHTMLMediaElement.$setMediaKeys_Callback(this, mediaKeys);
 
-  void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) => _blink.Native_HTMLMediaElement_addKey(this, keySystem, key, initData, sessionId);
+  void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) => _blink.BlinkHTMLMediaElement.$addKey(this, keySystem, key, initData, sessionId);
 
   @DomName('HTMLMediaElement.webkitCancelKeyRequest')
   @DocsEditable()
@@ -18847,9 +18847,9 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
-  void cancelKeyRequest(String keySystem, String sessionId) => _blink.Native_HTMLMediaElement_webkitCancelKeyRequest_Callback(this, keySystem, sessionId);
+  void cancelKeyRequest(String keySystem, String sessionId) => _blink.BlinkHTMLMediaElement.$webkitCancelKeyRequest_Callback(this, keySystem, sessionId);
 
-  void generateKeyRequest(String keySystem, [Uint8List initData]) => _blink.Native_HTMLMediaElement_generateKeyRequest(this, keySystem, initData);
+  void generateKeyRequest(String keySystem, [Uint8List initData]) => _blink.BlinkHTMLMediaElement.$generateKeyRequest(this, keySystem, initData);
 
   /// Stream of `canplay` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.oncanplay')
@@ -19025,7 +19025,7 @@
 
   @DomName('MediaError.code')
   @DocsEditable()
-  int get code => _blink.Native_MediaError_code_Getter(this);
+  int get code => _blink.BlinkMediaError.$code_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19069,12 +19069,12 @@
 
   @DomName('MediaKeyError.code')
   @DocsEditable()
-  int get code => _blink.Native_MediaKeyError_code_Getter(this);
+  int get code => _blink.BlinkMediaKeyError.$code_Getter(this);
 
   @DomName('MediaKeyError.systemCode')
   @DocsEditable()
   @Experimental() // non-standard
-  int get systemCode => _blink.Native_MediaKeyError_systemCode_Getter(this);
+  int get systemCode => _blink.BlinkMediaKeyError.$systemCode_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19094,31 +19094,31 @@
 
   @DomName('MediaKeyEvent.defaultURL')
   @DocsEditable()
-  String get defaultUrl => _blink.Native_MediaKeyEvent_defaultURL_Getter(this);
+  String get defaultUrl => _blink.BlinkMediaKeyEvent.$defaultURL_Getter(this);
 
   @DomName('MediaKeyEvent.errorCode')
   @DocsEditable()
-  MediaKeyError get errorCode => _blink.Native_MediaKeyEvent_errorCode_Getter(this);
+  MediaKeyError get errorCode => _blink.BlinkMediaKeyEvent.$errorCode_Getter(this);
 
   @DomName('MediaKeyEvent.initData')
   @DocsEditable()
-  Uint8List get initData => _blink.Native_MediaKeyEvent_initData_Getter(this);
+  Uint8List get initData => _blink.BlinkMediaKeyEvent.$initData_Getter(this);
 
   @DomName('MediaKeyEvent.keySystem')
   @DocsEditable()
-  String get keySystem => _blink.Native_MediaKeyEvent_keySystem_Getter(this);
+  String get keySystem => _blink.BlinkMediaKeyEvent.$keySystem_Getter(this);
 
   @DomName('MediaKeyEvent.message')
   @DocsEditable()
-  Uint8List get message => _blink.Native_MediaKeyEvent_message_Getter(this);
+  Uint8List get message => _blink.BlinkMediaKeyEvent.$message_Getter(this);
 
   @DomName('MediaKeyEvent.sessionId')
   @DocsEditable()
-  String get sessionId => _blink.Native_MediaKeyEvent_sessionId_Getter(this);
+  String get sessionId => _blink.BlinkMediaKeyEvent.$sessionId_Getter(this);
 
   @DomName('MediaKeyEvent.systemCode')
   @DocsEditable()
-  int get systemCode => _blink.Native_MediaKeyEvent_systemCode_Getter(this);
+  int get systemCode => _blink.BlinkMediaKeyEvent.$systemCode_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19138,11 +19138,11 @@
 
   @DomName('MediaKeyMessageEvent.destinationURL')
   @DocsEditable()
-  String get destinationUrl => _blink.Native_MediaKeyMessageEvent_destinationURL_Getter(this);
+  String get destinationUrl => _blink.BlinkMediaKeyMessageEvent.$destinationURL_Getter(this);
 
   @DomName('MediaKeyMessageEvent.message')
   @DocsEditable()
-  Uint8List get message => _blink.Native_MediaKeyMessageEvent_message_Getter(this);
+  Uint8List get message => _blink.BlinkMediaKeyMessageEvent.$message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19163,11 +19163,11 @@
   @DomName('MediaKeyNeededEvent.contentType')
   @DocsEditable()
   @Experimental() // untriaged
-  String get contentType => _blink.Native_MediaKeyNeededEvent_contentType_Getter(this);
+  String get contentType => _blink.BlinkMediaKeyNeededEvent.$contentType_Getter(this);
 
   @DomName('MediaKeyNeededEvent.initData')
   @DocsEditable()
-  Uint8List get initData => _blink.Native_MediaKeyNeededEvent_initData_Getter(this);
+  Uint8List get initData => _blink.BlinkMediaKeyNeededEvent.$initData_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19187,24 +19187,24 @@
 
   @DomName('MediaKeySession.error')
   @DocsEditable()
-  MediaKeyError get error => _blink.Native_MediaKeySession_error_Getter(this);
+  MediaKeyError get error => _blink.BlinkMediaKeySession.$error_Getter(this);
 
   @DomName('MediaKeySession.keySystem')
   @DocsEditable()
-  String get keySystem => _blink.Native_MediaKeySession_keySystem_Getter(this);
+  String get keySystem => _blink.BlinkMediaKeySession.$keySystem_Getter(this);
 
   @DomName('MediaKeySession.sessionId')
   @DocsEditable()
-  String get sessionId => _blink.Native_MediaKeySession_sessionId_Getter(this);
+  String get sessionId => _blink.BlinkMediaKeySession.$sessionId_Getter(this);
 
   @DomName('MediaKeySession.release')
   @DocsEditable()
   @Experimental() // untriaged
-  void release() => _blink.Native_MediaKeySession_release_Callback(this);
+  void release() => _blink.BlinkMediaKeySession.$release_Callback(this);
 
   @DomName('MediaKeySession.update')
   @DocsEditable()
-  void update(Uint8List response) => _blink.Native_MediaKeySession_update_Callback(this, response);
+  void update(Uint8List response) => _blink.BlinkMediaKeySession.$update_Callback(this, response);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19224,15 +19224,15 @@
 
   @DomName('MediaKeys.MediaKeys')
   @DocsEditable()
-  factory MediaKeys(String keySystem) => _blink.Native_MediaKeys_MediaKeys(keySystem);
+  factory MediaKeys(String keySystem) => _blink.BlinkMediaKeys.$mkMediaKeys(keySystem);
 
   @DomName('MediaKeys.keySystem')
   @DocsEditable()
-  String get keySystem => _blink.Native_MediaKeys_keySystem_Getter(this);
+  String get keySystem => _blink.BlinkMediaKeys.$keySystem_Getter(this);
 
   @DomName('MediaKeys.createSession')
   @DocsEditable()
-  MediaKeySession createSession(String type, Uint8List initData) => _blink.Native_MediaKeys_createSession_Callback(this, type, initData);
+  MediaKeySession createSession(String type, Uint8List initData) => _blink.BlinkMediaKeys.$createSession_Callback(this, type, initData);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19251,27 +19251,27 @@
 
   @DomName('MediaList.length')
   @DocsEditable()
-  int get length => _blink.Native_MediaList_length_Getter(this);
+  int get length => _blink.BlinkMediaList.$length_Getter(this);
 
   @DomName('MediaList.mediaText')
   @DocsEditable()
-  String get mediaText => _blink.Native_MediaList_mediaText_Getter(this);
+  String get mediaText => _blink.BlinkMediaList.$mediaText_Getter(this);
 
   @DomName('MediaList.mediaText')
   @DocsEditable()
-  void set mediaText(String value) => _blink.Native_MediaList_mediaText_Setter(this, value);
+  void set mediaText(String value) => _blink.BlinkMediaList.$mediaText_Setter(this, value);
 
   @DomName('MediaList.appendMedium')
   @DocsEditable()
-  void appendMedium(String newMedium) => _blink.Native_MediaList_appendMedium_Callback(this, newMedium);
+  void appendMedium(String newMedium) => _blink.BlinkMediaList.$appendMedium_Callback(this, newMedium);
 
   @DomName('MediaList.deleteMedium')
   @DocsEditable()
-  void deleteMedium(String oldMedium) => _blink.Native_MediaList_deleteMedium_Callback(this, oldMedium);
+  void deleteMedium(String oldMedium) => _blink.BlinkMediaList.$deleteMedium_Callback(this, oldMedium);
 
   @DomName('MediaList.item')
   @DocsEditable()
-  String item(int index) => _blink.Native_MediaList_item_Callback(this, index);
+  String item(int index) => _blink.BlinkMediaList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19290,11 +19290,11 @@
 
   @DomName('MediaQueryList.matches')
   @DocsEditable()
-  bool get matches => _blink.Native_MediaQueryList_matches_Getter(this);
+  bool get matches => _blink.BlinkMediaQueryList.$matches_Getter(this);
 
   @DomName('MediaQueryList.media')
   @DocsEditable()
-  String get media => _blink.Native_MediaQueryList_media_Getter(this);
+  String get media => _blink.BlinkMediaQueryList.$media_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19314,41 +19314,41 @@
 
   @DomName('MediaSource.MediaSource')
   @DocsEditable()
-  factory MediaSource() => _blink.Native_MediaSource_MediaSource();
+  factory MediaSource() => _blink.BlinkMediaSource.$mkMediaSource();
 
   @DomName('MediaSource.activeSourceBuffers')
   @DocsEditable()
-  SourceBufferList get activeSourceBuffers => _blink.Native_MediaSource_activeSourceBuffers_Getter(this);
+  SourceBufferList get activeSourceBuffers => _blink.BlinkMediaSource.$activeSourceBuffers_Getter(this);
 
   @DomName('MediaSource.duration')
   @DocsEditable()
-  num get duration => _blink.Native_MediaSource_duration_Getter(this);
+  num get duration => _blink.BlinkMediaSource.$duration_Getter(this);
 
   @DomName('MediaSource.duration')
   @DocsEditable()
-  void set duration(num value) => _blink.Native_MediaSource_duration_Setter(this, value);
+  void set duration(num value) => _blink.BlinkMediaSource.$duration_Setter(this, value);
 
   @DomName('MediaSource.readyState')
   @DocsEditable()
-  String get readyState => _blink.Native_MediaSource_readyState_Getter(this);
+  String get readyState => _blink.BlinkMediaSource.$readyState_Getter(this);
 
   @DomName('MediaSource.sourceBuffers')
   @DocsEditable()
-  SourceBufferList get sourceBuffers => _blink.Native_MediaSource_sourceBuffers_Getter(this);
+  SourceBufferList get sourceBuffers => _blink.BlinkMediaSource.$sourceBuffers_Getter(this);
 
   @DomName('MediaSource.addSourceBuffer')
   @DocsEditable()
-  SourceBuffer addSourceBuffer(String type) => _blink.Native_MediaSource_addSourceBuffer_Callback(this, type);
+  SourceBuffer addSourceBuffer(String type) => _blink.BlinkMediaSource.$addSourceBuffer_Callback(this, type);
 
-  void endOfStream([String error]) => _blink.Native_MediaSource_endOfStream(this, error);
+  void endOfStream([String error]) => _blink.BlinkMediaSource.$endOfStream(this, error);
 
   @DomName('MediaSource.isTypeSupported')
   @DocsEditable()
-  static bool isTypeSupported(String type) => _blink.Native_MediaSource_isTypeSupported_Callback(type);
+  static bool isTypeSupported(String type) => _blink.BlinkMediaSource.$isTypeSupported_Callback(type);
 
   @DomName('MediaSource.removeSourceBuffer')
   @DocsEditable()
-  void removeSourceBuffer(SourceBuffer buffer) => _blink.Native_MediaSource_removeSourceBuffer_Callback(this, buffer);
+  void removeSourceBuffer(SourceBuffer buffer) => _blink.BlinkMediaSource.$removeSourceBuffer_Callback(this, buffer);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -19396,44 +19396,44 @@
 
   @DomName('MediaStream.MediaStream')
   @DocsEditable()
-  factory MediaStream([stream_OR_tracks]) => _blink.Native_MediaStream_MediaStream(stream_OR_tracks);
+  factory MediaStream([stream_OR_tracks]) => _blink.BlinkMediaStream.$mkMediaStream(stream_OR_tracks);
 
   @DomName('MediaStream.ended')
   @DocsEditable()
-  bool get ended => _blink.Native_MediaStream_ended_Getter(this);
+  bool get ended => _blink.BlinkMediaStream.$ended_Getter(this);
 
   @DomName('MediaStream.id')
   @DocsEditable()
-  String get id => _blink.Native_MediaStream_id_Getter(this);
+  String get id => _blink.BlinkMediaStream.$id_Getter(this);
 
   @DomName('MediaStream.label')
   @DocsEditable()
   @Experimental() // non-standard
-  String get label => _blink.Native_MediaStream_label_Getter(this);
+  String get label => _blink.BlinkMediaStream.$label_Getter(this);
 
   @DomName('MediaStream.addTrack')
   @DocsEditable()
-  void addTrack(MediaStreamTrack track) => _blink.Native_MediaStream_addTrack_Callback(this, track);
+  void addTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.$addTrack_Callback(this, track);
 
   @DomName('MediaStream.getAudioTracks')
   @DocsEditable()
-  List<MediaStreamTrack> getAudioTracks() => _blink.Native_MediaStream_getAudioTracks_Callback(this);
+  List<MediaStreamTrack> getAudioTracks() => _blink.BlinkMediaStream.$getAudioTracks_Callback(this);
 
   @DomName('MediaStream.getTrackById')
   @DocsEditable()
-  MediaStreamTrack getTrackById(String trackId) => _blink.Native_MediaStream_getTrackById_Callback(this, trackId);
+  MediaStreamTrack getTrackById(String trackId) => _blink.BlinkMediaStream.$getTrackById_Callback(this, trackId);
 
   @DomName('MediaStream.getVideoTracks')
   @DocsEditable()
-  List<MediaStreamTrack> getVideoTracks() => _blink.Native_MediaStream_getVideoTracks_Callback(this);
+  List<MediaStreamTrack> getVideoTracks() => _blink.BlinkMediaStream.$getVideoTracks_Callback(this);
 
   @DomName('MediaStream.removeTrack')
   @DocsEditable()
-  void removeTrack(MediaStreamTrack track) => _blink.Native_MediaStream_removeTrack_Callback(this, track);
+  void removeTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.$removeTrack_Callback(this, track);
 
   @DomName('MediaStream.stop')
   @DocsEditable()
-  void stop() => _blink.Native_MediaStream_stop_Callback(this);
+  void stop() => _blink.BlinkMediaStream.$stop_Callback(this);
 
   /// Stream of `addtrack` events handled by this [MediaStream].
   @DomName('MediaStream.onaddtrack')
@@ -19481,7 +19481,7 @@
 
   @DomName('MediaStreamEvent.stream')
   @DocsEditable()
-  MediaStream get stream => _blink.Native_MediaStreamEvent_stream_Getter(this);
+  MediaStream get stream => _blink.BlinkMediaStreamEvent.$stream_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19532,32 +19532,32 @@
 
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
-  bool get enabled => _blink.Native_MediaStreamTrack_enabled_Getter(this);
+  bool get enabled => _blink.BlinkMediaStreamTrack.$enabled_Getter(this);
 
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
-  void set enabled(bool value) => _blink.Native_MediaStreamTrack_enabled_Setter(this, value);
+  void set enabled(bool value) => _blink.BlinkMediaStreamTrack.$enabled_Setter(this, value);
 
   @DomName('MediaStreamTrack.id')
   @DocsEditable()
-  String get id => _blink.Native_MediaStreamTrack_id_Getter(this);
+  String get id => _blink.BlinkMediaStreamTrack.$id_Getter(this);
 
   @DomName('MediaStreamTrack.kind')
   @DocsEditable()
-  String get kind => _blink.Native_MediaStreamTrack_kind_Getter(this);
+  String get kind => _blink.BlinkMediaStreamTrack.$kind_Getter(this);
 
   @DomName('MediaStreamTrack.label')
   @DocsEditable()
-  String get label => _blink.Native_MediaStreamTrack_label_Getter(this);
+  String get label => _blink.BlinkMediaStreamTrack.$label_Getter(this);
 
   @DomName('MediaStreamTrack.readyState')
   @DocsEditable()
-  String get readyState => _blink.Native_MediaStreamTrack_readyState_Getter(this);
+  String get readyState => _blink.BlinkMediaStreamTrack.$readyState_Getter(this);
 
   @DomName('MediaStreamTrack.getSources')
   @DocsEditable()
   @Experimental() // untriaged
-  static void _getSources(MediaStreamTrackSourcesCallback callback) => _blink.Native_MediaStreamTrack_getSources_Callback(callback);
+  static void _getSources(MediaStreamTrackSourcesCallback callback) => _blink.BlinkMediaStreamTrack.$getSources_Callback(callback);
 
   static Future<List<SourceInfo>> getSources() {
     var completer = new Completer<List<SourceInfo>>();
@@ -19569,7 +19569,7 @@
   @DomName('MediaStreamTrack.stop')
   @DocsEditable()
   @Experimental() // untriaged
-  void stop() => _blink.Native_MediaStreamTrack_stop_Callback(this);
+  void stop() => _blink.BlinkMediaStreamTrack.$stop_Callback(this);
 
   /// Stream of `ended` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onended')
@@ -19608,7 +19608,7 @@
 
   @DomName('MediaStreamTrackEvent.track')
   @DocsEditable()
-  MediaStreamTrack get track => _blink.Native_MediaStreamTrackEvent_track_Getter(this);
+  MediaStreamTrack get track => _blink.BlinkMediaStreamTrackEvent.$track_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19637,15 +19637,15 @@
 
   @DomName('MemoryInfo.jsHeapSizeLimit')
   @DocsEditable()
-  int get jsHeapSizeLimit => _blink.Native_MemoryInfo_jsHeapSizeLimit_Getter(this);
+  int get jsHeapSizeLimit => _blink.BlinkMemoryInfo.$jsHeapSizeLimit_Getter(this);
 
   @DomName('MemoryInfo.totalJSHeapSize')
   @DocsEditable()
-  int get totalJSHeapSize => _blink.Native_MemoryInfo_totalJSHeapSize_Getter(this);
+  int get totalJSHeapSize => _blink.BlinkMemoryInfo.$totalJSHeapSize_Getter(this);
 
   @DomName('MemoryInfo.usedJSHeapSize')
   @DocsEditable()
-  int get usedJSHeapSize => _blink.Native_MemoryInfo_usedJSHeapSize_Getter(this);
+  int get usedJSHeapSize => _blink.BlinkMemoryInfo.$usedJSHeapSize_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19698,11 +19698,11 @@
 
   @DomName('MessageChannel.port1')
   @DocsEditable()
-  MessagePort get port1 => _blink.Native_MessageChannel_port1_Getter(this);
+  MessagePort get port1 => _blink.BlinkMessageChannel.$port1_Getter(this);
 
   @DomName('MessageChannel.port2')
   @DocsEditable()
-  MessagePort get port2 => _blink.Native_MessageChannel_port2_Getter(this);
+  MessagePort get port2 => _blink.BlinkMessageChannel.$port2_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -19731,24 +19731,24 @@
 
   @DomName('MessageEvent.data')
   @DocsEditable()
-  Object get data => _blink.Native_MessageEvent_data_Getter(this);
+  Object get data => _blink.BlinkMessageEvent.$data_Getter(this);
 
   @DomName('MessageEvent.lastEventId')
   @DocsEditable()
   @Unstable()
-  String get lastEventId => _blink.Native_MessageEvent_lastEventId_Getter(this);
+  String get lastEventId => _blink.BlinkMessageEvent.$lastEventId_Getter(this);
 
   @DomName('MessageEvent.origin')
   @DocsEditable()
-  String get origin => _blink.Native_MessageEvent_origin_Getter(this);
+  String get origin => _blink.BlinkMessageEvent.$origin_Getter(this);
 
   @DomName('MessageEvent.source')
   @DocsEditable()
-  EventTarget get source => _blink.Native_MessageEvent_source_Getter(this);
+  EventTarget get source => _blink.BlinkMessageEvent.$source_Getter(this);
 
   @DomName('MessageEvent.initMessageEvent')
   @DocsEditable()
-  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> messagePorts) => _blink.Native_MessageEvent_initMessageEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts);
+  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> messagePorts) => _blink.BlinkMessageEvent.$initMessageEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19777,15 +19777,15 @@
 
   @DomName('MessagePort.close')
   @DocsEditable()
-  void close() => _blink.Native_MessagePort_close_Callback(this);
+  void close() => _blink.BlinkMessagePort.$close_Callback(this);
 
   @DomName('MessagePort.postMessage')
   @DocsEditable()
-  void postMessage(Object message, [List<MessagePort> messagePorts]) => _blink.Native_MessagePort_postMessage_Callback(this, message, messagePorts);
+  void postMessage(Object message, [List<MessagePort> messagePorts]) => _blink.BlinkMessagePort.$postMessage_Callback(this, message, messagePorts);
 
   @DomName('MessagePort.start')
   @DocsEditable()
-  void start() => _blink.Native_MessagePort_start_Callback(this);
+  void start() => _blink.BlinkMessagePort.$start_Callback(this);
 
   /// Stream of `message` events handled by this [MessagePort].
   @DomName('MessagePort.onmessage')
@@ -19818,27 +19818,27 @@
 
   @DomName('HTMLMetaElement.content')
   @DocsEditable()
-  String get content => _blink.Native_HTMLMetaElement_content_Getter(this);
+  String get content => _blink.BlinkHTMLMetaElement.$content_Getter(this);
 
   @DomName('HTMLMetaElement.content')
   @DocsEditable()
-  void set content(String value) => _blink.Native_HTMLMetaElement_content_Setter(this, value);
+  void set content(String value) => _blink.BlinkHTMLMetaElement.$content_Setter(this, value);
 
   @DomName('HTMLMetaElement.httpEquiv')
   @DocsEditable()
-  String get httpEquiv => _blink.Native_HTMLMetaElement_httpEquiv_Getter(this);
+  String get httpEquiv => _blink.BlinkHTMLMetaElement.$httpEquiv_Getter(this);
 
   @DomName('HTMLMetaElement.httpEquiv')
   @DocsEditable()
-  void set httpEquiv(String value) => _blink.Native_HTMLMetaElement_httpEquiv_Setter(this, value);
+  void set httpEquiv(String value) => _blink.BlinkHTMLMetaElement.$httpEquiv_Setter(this, value);
 
   @DomName('HTMLMetaElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLMetaElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLMetaElement.$name_Getter(this);
 
   @DomName('HTMLMetaElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLMetaElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLMetaElement.$name_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19858,11 +19858,11 @@
 
   @DomName('Metadata.modificationTime')
   @DocsEditable()
-  DateTime get modificationTime => _blink.Native_Metadata_modificationTime_Getter(this);
+  DateTime get modificationTime => _blink.BlinkMetadata.$modificationTime_Getter(this);
 
   @DomName('Metadata.size')
   @DocsEditable()
-  int get size => _blink.Native_Metadata_size_Getter(this);
+  int get size => _blink.BlinkMetadata.$size_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19908,56 +19908,56 @@
 
   @DomName('HTMLMeterElement.high')
   @DocsEditable()
-  num get high => _blink.Native_HTMLMeterElement_high_Getter(this);
+  num get high => _blink.BlinkHTMLMeterElement.$high_Getter(this);
 
   @DomName('HTMLMeterElement.high')
   @DocsEditable()
-  void set high(num value) => _blink.Native_HTMLMeterElement_high_Setter(this, value);
+  void set high(num value) => _blink.BlinkHTMLMeterElement.$high_Setter(this, value);
 
   @DomName('HTMLMeterElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLMeterElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLMeterElement.$labels_Getter(this);
 
   @DomName('HTMLMeterElement.low')
   @DocsEditable()
-  num get low => _blink.Native_HTMLMeterElement_low_Getter(this);
+  num get low => _blink.BlinkHTMLMeterElement.$low_Getter(this);
 
   @DomName('HTMLMeterElement.low')
   @DocsEditable()
-  void set low(num value) => _blink.Native_HTMLMeterElement_low_Setter(this, value);
+  void set low(num value) => _blink.BlinkHTMLMeterElement.$low_Setter(this, value);
 
   @DomName('HTMLMeterElement.max')
   @DocsEditable()
-  num get max => _blink.Native_HTMLMeterElement_max_Getter(this);
+  num get max => _blink.BlinkHTMLMeterElement.$max_Getter(this);
 
   @DomName('HTMLMeterElement.max')
   @DocsEditable()
-  void set max(num value) => _blink.Native_HTMLMeterElement_max_Setter(this, value);
+  void set max(num value) => _blink.BlinkHTMLMeterElement.$max_Setter(this, value);
 
   @DomName('HTMLMeterElement.min')
   @DocsEditable()
-  num get min => _blink.Native_HTMLMeterElement_min_Getter(this);
+  num get min => _blink.BlinkHTMLMeterElement.$min_Getter(this);
 
   @DomName('HTMLMeterElement.min')
   @DocsEditable()
-  void set min(num value) => _blink.Native_HTMLMeterElement_min_Setter(this, value);
+  void set min(num value) => _blink.BlinkHTMLMeterElement.$min_Setter(this, value);
 
   @DomName('HTMLMeterElement.optimum')
   @DocsEditable()
-  num get optimum => _blink.Native_HTMLMeterElement_optimum_Getter(this);
+  num get optimum => _blink.BlinkHTMLMeterElement.$optimum_Getter(this);
 
   @DomName('HTMLMeterElement.optimum')
   @DocsEditable()
-  void set optimum(num value) => _blink.Native_HTMLMeterElement_optimum_Setter(this, value);
+  void set optimum(num value) => _blink.BlinkHTMLMeterElement.$optimum_Setter(this, value);
 
   @DomName('HTMLMeterElement.value')
   @DocsEditable()
-  num get value => _blink.Native_HTMLMeterElement_value_Getter(this);
+  num get value => _blink.BlinkHTMLMeterElement.$value_Getter(this);
 
   @DomName('HTMLMeterElement.value')
   @DocsEditable()
-  void set value(num value) => _blink.Native_HTMLMeterElement_value_Setter(this, value);
+  void set value(num value) => _blink.BlinkHTMLMeterElement.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19997,11 +19997,11 @@
 
   @DomName('MIDIAccess.inputs')
   @DocsEditable()
-  List<MidiInput> inputs() => _blink.Native_MIDIAccess_inputs_Callback(this);
+  List<MidiInput> inputs() => _blink.BlinkMIDIAccess.$inputs_Callback(this);
 
   @DomName('MIDIAccess.outputs')
   @DocsEditable()
-  List<MidiOutput> outputs() => _blink.Native_MIDIAccess_outputs_Callback(this);
+  List<MidiOutput> outputs() => _blink.BlinkMIDIAccess.$outputs_Callback(this);
 
   /// Stream of `connect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.onconnect')
@@ -20031,7 +20031,7 @@
   @DomName('MIDIAccessPromise.then')
   @DocsEditable()
   @Experimental() // untriaged
-  void then(MidiSuccessCallback successCallback, MidiErrorCallback errorCallback) => _blink.Native_MIDIAccessPromise_then_Callback(this, successCallback, errorCallback);
+  void then(MidiSuccessCallback successCallback, MidiErrorCallback errorCallback) => _blink.BlinkMIDIAccessPromise.$then_Callback(this, successCallback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20051,7 +20051,7 @@
 
   @DomName('MIDIConnectionEvent.port')
   @DocsEditable()
-  MidiPort get port => _blink.Native_MIDIConnectionEvent_port_Getter(this);
+  MidiPort get port => _blink.BlinkMIDIConnectionEvent.$port_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20102,11 +20102,11 @@
 
   @DomName('MIDIMessageEvent.data')
   @DocsEditable()
-  Uint8List get data => _blink.Native_MIDIMessageEvent_data_Getter(this);
+  Uint8List get data => _blink.BlinkMIDIMessageEvent.$data_Getter(this);
 
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable()
-  double get receivedTime => _blink.Native_MIDIMessageEvent_receivedTime_Getter(this);
+  double get receivedTime => _blink.BlinkMIDIMessageEvent.$receivedTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20124,7 +20124,7 @@
   // To suppress missing implicit constructor warnings.
   factory MidiOutput._() { throw new UnsupportedError("Not supported"); }
 
-  void send(Uint8List data, [num timestamp]) => _blink.Native_MIDIOutput_send(this, data, timestamp);
+  void send(Uint8List data, [num timestamp]) => _blink.BlinkMIDIOutput.$send(this, data, timestamp);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20154,23 +20154,23 @@
 
   @DomName('MIDIPort.id')
   @DocsEditable()
-  String get id => _blink.Native_MIDIPort_id_Getter(this);
+  String get id => _blink.BlinkMIDIPort.$id_Getter(this);
 
   @DomName('MIDIPort.manufacturer')
   @DocsEditable()
-  String get manufacturer => _blink.Native_MIDIPort_manufacturer_Getter(this);
+  String get manufacturer => _blink.BlinkMIDIPort.$manufacturer_Getter(this);
 
   @DomName('MIDIPort.name')
   @DocsEditable()
-  String get name => _blink.Native_MIDIPort_name_Getter(this);
+  String get name => _blink.BlinkMIDIPort.$name_Getter(this);
 
   @DomName('MIDIPort.type')
   @DocsEditable()
-  String get type => _blink.Native_MIDIPort_type_Getter(this);
+  String get type => _blink.BlinkMIDIPort.$type_Getter(this);
 
   @DomName('MIDIPort.version')
   @DocsEditable()
-  String get version => _blink.Native_MIDIPort_version_Getter(this);
+  String get version => _blink.BlinkMIDIPort.$version_Getter(this);
 
   /// Stream of `disconnect` events handled by this [MidiPort].
   @DomName('MIDIPort.ondisconnect')
@@ -20194,19 +20194,19 @@
 
   @DomName('MimeType.description')
   @DocsEditable()
-  String get description => _blink.Native_MimeType_description_Getter(this);
+  String get description => _blink.BlinkMimeType.$description_Getter(this);
 
   @DomName('MimeType.enabledPlugin')
   @DocsEditable()
-  Plugin get enabledPlugin => _blink.Native_MimeType_enabledPlugin_Getter(this);
+  Plugin get enabledPlugin => _blink.BlinkMimeType.$enabledPlugin_Getter(this);
 
   @DomName('MimeType.suffixes')
   @DocsEditable()
-  String get suffixes => _blink.Native_MimeType_suffixes_Getter(this);
+  String get suffixes => _blink.BlinkMimeType.$suffixes_Getter(this);
 
   @DomName('MimeType.type')
   @DocsEditable()
-  String get type => _blink.Native_MimeType_type_Getter(this);
+  String get type => _blink.BlinkMimeType.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20225,15 +20225,15 @@
 
   @DomName('MimeTypeArray.length')
   @DocsEditable()
-  int get length => _blink.Native_MimeTypeArray_length_Getter(this);
+  int get length => _blink.BlinkMimeTypeArray.$length_Getter(this);
 
   MimeType operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_MimeTypeArray_NativeIndexed_Getter(this, index);
+    return _blink.BlinkMimeTypeArray.$NativeIndexed_Getter(this, index);
   }
 
-  MimeType _nativeIndexedGetter(int index) => _blink.Native_MimeTypeArray_NativeIndexed_Getter(this, index);
+  MimeType _nativeIndexedGetter(int index) => _blink.BlinkMimeTypeArray.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, MimeType value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -20275,15 +20275,15 @@
 
   @DomName('MimeTypeArray.__getter__')
   @DocsEditable()
-  MimeType __getter__(String name) => _blink.Native_MimeTypeArray___getter___Callback(this, name);
+  MimeType __getter__(String name) => _blink.BlinkMimeTypeArray.$__getter___Callback(this, name);
 
   @DomName('MimeTypeArray.item')
   @DocsEditable()
-  MimeType item(int index) => _blink.Native_MimeTypeArray_item_Callback(this, index);
+  MimeType item(int index) => _blink.BlinkMimeTypeArray.$item_Callback(this, index);
 
   @DomName('MimeTypeArray.namedItem')
   @DocsEditable()
-  MimeType namedItem(String name) => _blink.Native_MimeTypeArray_namedItem_Callback(this, name);
+  MimeType namedItem(String name) => _blink.BlinkMimeTypeArray.$namedItem_Callback(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20308,19 +20308,19 @@
 
   @DomName('HTMLModElement.cite')
   @DocsEditable()
-  String get cite => _blink.Native_HTMLModElement_cite_Getter(this);
+  String get cite => _blink.BlinkHTMLModElement.$cite_Getter(this);
 
   @DomName('HTMLModElement.cite')
   @DocsEditable()
-  void set cite(String value) => _blink.Native_HTMLModElement_cite_Setter(this, value);
+  void set cite(String value) => _blink.BlinkHTMLModElement.$cite_Setter(this, value);
 
   @DomName('HTMLModElement.dateTime')
   @DocsEditable()
-  String get dateTime => _blink.Native_HTMLModElement_dateTime_Getter(this);
+  String get dateTime => _blink.BlinkHTMLModElement.$dateTime_Getter(this);
 
   @DomName('HTMLModElement.dateTime')
   @DocsEditable()
-  void set dateTime(String value) => _blink.Native_HTMLModElement_dateTime_Setter(this, value);
+  void set dateTime(String value) => _blink.BlinkHTMLModElement.$dateTime_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20352,86 +20352,86 @@
 
   @DomName('MouseEvent.altKey')
   @DocsEditable()
-  bool get altKey => _blink.Native_MouseEvent_altKey_Getter(this);
+  bool get altKey => _blink.BlinkMouseEvent.$altKey_Getter(this);
 
   @DomName('MouseEvent.button')
   @DocsEditable()
-  int get button => _blink.Native_MouseEvent_button_Getter(this);
+  int get button => _blink.BlinkMouseEvent.$button_Getter(this);
 
   @DomName('MouseEvent.clientX')
   @DocsEditable()
-  int get _clientX => _blink.Native_MouseEvent_clientX_Getter(this);
+  int get _clientX => _blink.BlinkMouseEvent.$clientX_Getter(this);
 
   @DomName('MouseEvent.clientY')
   @DocsEditable()
-  int get _clientY => _blink.Native_MouseEvent_clientY_Getter(this);
+  int get _clientY => _blink.BlinkMouseEvent.$clientY_Getter(this);
 
   @DomName('MouseEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey => _blink.Native_MouseEvent_ctrlKey_Getter(this);
+  bool get ctrlKey => _blink.BlinkMouseEvent.$ctrlKey_Getter(this);
 
   @DomName('MouseEvent.dataTransfer')
   @DocsEditable()
   @Unstable()
-  DataTransfer get dataTransfer => _blink.Native_MouseEvent_dataTransfer_Getter(this);
+  DataTransfer get dataTransfer => _blink.BlinkMouseEvent.$dataTransfer_Getter(this);
 
   @DomName('MouseEvent.fromElement')
   @DocsEditable()
   @Experimental() // nonstandard
-  Node get fromElement => _blink.Native_MouseEvent_fromElement_Getter(this);
+  Node get fromElement => _blink.BlinkMouseEvent.$fromElement_Getter(this);
 
   @DomName('MouseEvent.metaKey')
   @DocsEditable()
-  bool get metaKey => _blink.Native_MouseEvent_metaKey_Getter(this);
+  bool get metaKey => _blink.BlinkMouseEvent.$metaKey_Getter(this);
 
   @DomName('MouseEvent.offsetX')
   @DocsEditable()
   @Unstable()
-  int get _offsetX => _blink.Native_MouseEvent_offsetX_Getter(this);
+  int get _offsetX => _blink.BlinkMouseEvent.$offsetX_Getter(this);
 
   @DomName('MouseEvent.offsetY')
   @DocsEditable()
   @Unstable()
-  int get _offsetY => _blink.Native_MouseEvent_offsetY_Getter(this);
+  int get _offsetY => _blink.BlinkMouseEvent.$offsetY_Getter(this);
 
   @DomName('MouseEvent.relatedTarget')
   @DocsEditable()
-  EventTarget get relatedTarget => _blink.Native_MouseEvent_relatedTarget_Getter(this);
+  EventTarget get relatedTarget => _blink.BlinkMouseEvent.$relatedTarget_Getter(this);
 
   @DomName('MouseEvent.screenX')
   @DocsEditable()
-  int get _screenX => _blink.Native_MouseEvent_screenX_Getter(this);
+  int get _screenX => _blink.BlinkMouseEvent.$screenX_Getter(this);
 
   @DomName('MouseEvent.screenY')
   @DocsEditable()
-  int get _screenY => _blink.Native_MouseEvent_screenY_Getter(this);
+  int get _screenY => _blink.BlinkMouseEvent.$screenY_Getter(this);
 
   @DomName('MouseEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey => _blink.Native_MouseEvent_shiftKey_Getter(this);
+  bool get shiftKey => _blink.BlinkMouseEvent.$shiftKey_Getter(this);
 
   @DomName('MouseEvent.toElement')
   @DocsEditable()
   @Experimental() // nonstandard
-  Node get toElement => _blink.Native_MouseEvent_toElement_Getter(this);
+  Node get toElement => _blink.BlinkMouseEvent.$toElement_Getter(this);
 
   @DomName('MouseEvent.webkitMovementX')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get _webkitMovementX => _blink.Native_MouseEvent_webkitMovementX_Getter(this);
+  int get _webkitMovementX => _blink.BlinkMouseEvent.$webkitMovementX_Getter(this);
 
   @DomName('MouseEvent.webkitMovementY')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get _webkitMovementY => _blink.Native_MouseEvent_webkitMovementY_Getter(this);
+  int get _webkitMovementY => _blink.BlinkMouseEvent.$webkitMovementY_Getter(this);
 
   @DomName('MouseEvent.initMouseEvent')
   @DocsEditable()
-  void _initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) => _blink.Native_MouseEvent_initMouseEvent_Callback(this, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
+  void _initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) => _blink.BlinkMouseEvent.$initMouseEvent_Callback(this, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
 
 
   @deprecated
@@ -20501,19 +20501,19 @@
   factory MutationObserver._(MutationCallback callback) => _create(callback);
 
   @DocsEditable()
-  static MutationObserver _create(callback) => _blink.Native_MutationObserver_constructorCallback(callback);
+  static MutationObserver _create(callback) => _blink.BlinkMutationObserver.$constructorCallback(callback);
 
   @DomName('MutationObserver.disconnect')
   @DocsEditable()
-  void disconnect() => _blink.Native_MutationObserver_disconnect_Callback(this);
+  void disconnect() => _blink.BlinkMutationObserver.$disconnect_Callback(this);
 
   @DomName('MutationObserver.observe')
   @DocsEditable()
-  void _observe(Node target, Map options) => _blink.Native_MutationObserver_observe_Callback(this, target, options);
+  void _observe(Node target, Map options) => _blink.BlinkMutationObserver.$observe_Callback(this, target, options);
 
   @DomName('MutationObserver.takeRecords')
   @DocsEditable()
-  List<MutationRecord> takeRecords() => _blink.Native_MutationObserver_takeRecords_Callback(this);
+  List<MutationRecord> takeRecords() => _blink.BlinkMutationObserver.$takeRecords_Callback(this);
 
   /**
    * Checks to see if the mutation observer API is supported on the current
@@ -20598,39 +20598,39 @@
 
   @DomName('MutationRecord.addedNodes')
   @DocsEditable()
-  List<Node> get addedNodes => _blink.Native_MutationRecord_addedNodes_Getter(this);
+  List<Node> get addedNodes => _blink.BlinkMutationRecord.$addedNodes_Getter(this);
 
   @DomName('MutationRecord.attributeName')
   @DocsEditable()
-  String get attributeName => _blink.Native_MutationRecord_attributeName_Getter(this);
+  String get attributeName => _blink.BlinkMutationRecord.$attributeName_Getter(this);
 
   @DomName('MutationRecord.attributeNamespace')
   @DocsEditable()
-  String get attributeNamespace => _blink.Native_MutationRecord_attributeNamespace_Getter(this);
+  String get attributeNamespace => _blink.BlinkMutationRecord.$attributeNamespace_Getter(this);
 
   @DomName('MutationRecord.nextSibling')
   @DocsEditable()
-  Node get nextSibling => _blink.Native_MutationRecord_nextSibling_Getter(this);
+  Node get nextSibling => _blink.BlinkMutationRecord.$nextSibling_Getter(this);
 
   @DomName('MutationRecord.oldValue')
   @DocsEditable()
-  String get oldValue => _blink.Native_MutationRecord_oldValue_Getter(this);
+  String get oldValue => _blink.BlinkMutationRecord.$oldValue_Getter(this);
 
   @DomName('MutationRecord.previousSibling')
   @DocsEditable()
-  Node get previousSibling => _blink.Native_MutationRecord_previousSibling_Getter(this);
+  Node get previousSibling => _blink.BlinkMutationRecord.$previousSibling_Getter(this);
 
   @DomName('MutationRecord.removedNodes')
   @DocsEditable()
-  List<Node> get removedNodes => _blink.Native_MutationRecord_removedNodes_Getter(this);
+  List<Node> get removedNodes => _blink.BlinkMutationRecord.$removedNodes_Getter(this);
 
   @DomName('MutationRecord.target')
   @DocsEditable()
-  Node get target => _blink.Native_MutationRecord_target_Getter(this);
+  Node get target => _blink.BlinkMutationRecord.$target_Getter(this);
 
   @DomName('MutationRecord.type')
   @DocsEditable()
-  String get type => _blink.Native_MutationRecord_type_Getter(this);
+  String get type => _blink.BlinkMutationRecord.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20703,57 +20703,57 @@
   @DomName('Navigator.cookieEnabled')
   @DocsEditable()
   @Unstable()
-  bool get cookieEnabled => _blink.Native_Navigator_cookieEnabled_Getter(this);
+  bool get cookieEnabled => _blink.BlinkNavigator.$cookieEnabled_Getter(this);
 
   @DomName('Navigator.doNotTrack')
   @DocsEditable()
   // http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#js-dom
   @Experimental() // experimental
-  String get doNotTrack => _blink.Native_Navigator_doNotTrack_Getter(this);
+  String get doNotTrack => _blink.BlinkNavigator.$doNotTrack_Getter(this);
 
   @DomName('Navigator.geolocation')
   @DocsEditable()
   @Unstable()
-  Geolocation get geolocation => _blink.Native_Navigator_geolocation_Getter(this);
+  Geolocation get geolocation => _blink.BlinkNavigator.$geolocation_Getter(this);
 
   @DomName('Navigator.language')
   @DocsEditable()
-  String get language => _blink.Native_Navigator_language_Getter(this);
+  String get language => _blink.BlinkNavigator.$language_Getter(this);
 
   @DomName('Navigator.maxTouchPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxTouchPoints => _blink.Native_Navigator_maxTouchPoints_Getter(this);
+  int get maxTouchPoints => _blink.BlinkNavigator.$maxTouchPoints_Getter(this);
 
   @DomName('Navigator.mimeTypes')
   @DocsEditable()
   @Experimental() // nonstandard
-  MimeTypeArray get mimeTypes => _blink.Native_Navigator_mimeTypes_Getter(this);
+  MimeTypeArray get mimeTypes => _blink.BlinkNavigator.$mimeTypes_Getter(this);
 
   @DomName('Navigator.productSub')
   @DocsEditable()
   @Unstable()
-  String get productSub => _blink.Native_Navigator_productSub_Getter(this);
+  String get productSub => _blink.BlinkNavigator.$productSub_Getter(this);
 
   @DomName('Navigator.serviceWorker')
   @DocsEditable()
   @Experimental() // untriaged
-  ServiceWorkerContainer get serviceWorker => _blink.Native_Navigator_serviceWorker_Getter(this);
+  ServiceWorkerContainer get serviceWorker => _blink.BlinkNavigator.$serviceWorker_Getter(this);
 
   @DomName('Navigator.storageQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  StorageQuota get storageQuota => _blink.Native_Navigator_storageQuota_Getter(this);
+  StorageQuota get storageQuota => _blink.BlinkNavigator.$storageQuota_Getter(this);
 
   @DomName('Navigator.vendor')
   @DocsEditable()
   @Unstable()
-  String get vendor => _blink.Native_Navigator_vendor_Getter(this);
+  String get vendor => _blink.BlinkNavigator.$vendor_Getter(this);
 
   @DomName('Navigator.vendorSub')
   @DocsEditable()
   @Unstable()
-  String get vendorSub => _blink.Native_Navigator_vendorSub_Getter(this);
+  String get vendorSub => _blink.BlinkNavigator.$vendorSub_Getter(this);
 
   @DomName('Navigator.webkitPersistentStorage')
   @DocsEditable()
@@ -20761,7 +20761,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
-  DeprecatedStorageQuota get persistentStorage => _blink.Native_Navigator_webkitPersistentStorage_Getter(this);
+  DeprecatedStorageQuota get persistentStorage => _blink.BlinkNavigator.$webkitPersistentStorage_Getter(this);
 
   @DomName('Navigator.webkitTemporaryStorage')
   @DocsEditable()
@@ -20769,33 +20769,33 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
-  DeprecatedStorageQuota get temporaryStorage => _blink.Native_Navigator_webkitTemporaryStorage_Getter(this);
+  DeprecatedStorageQuota get temporaryStorage => _blink.BlinkNavigator.$webkitTemporaryStorage_Getter(this);
 
   @DomName('Navigator.getStorageUpdates')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
   @Experimental()
-  void getStorageUpdates() => _blink.Native_Navigator_getStorageUpdates_Callback(this);
+  void getStorageUpdates() => _blink.BlinkNavigator.$getStorageUpdates_Callback(this);
 
   @DomName('Navigator.isProtocolHandlerRegistered')
   @DocsEditable()
   @Experimental() // untriaged
-  String isProtocolHandlerRegistered(String scheme, String url) => _blink.Native_Navigator_isProtocolHandlerRegistered_Callback(this, scheme, url);
+  String isProtocolHandlerRegistered(String scheme, String url) => _blink.BlinkNavigator.$isProtocolHandlerRegistered_Callback(this, scheme, url);
 
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
   @Unstable()
-  void registerProtocolHandler(String scheme, String url, String title) => _blink.Native_Navigator_registerProtocolHandler_Callback(this, scheme, url, title);
+  void registerProtocolHandler(String scheme, String url, String title) => _blink.BlinkNavigator.$registerProtocolHandler_Callback(this, scheme, url, title);
 
   @DomName('Navigator.requestMIDIAccess')
   @DocsEditable()
   @Experimental() // untriaged
-  MidiAccessPromise requestMidiAccess([Map options]) => _blink.Native_Navigator_requestMIDIAccess_Callback(this, options);
+  MidiAccessPromise requestMidiAccess([Map options]) => _blink.BlinkNavigator.$requestMIDIAccess_Callback(this, options);
 
   @DomName('Navigator.unregisterProtocolHandler')
   @DocsEditable()
   @Experimental() // untriaged
-  void unregisterProtocolHandler(String scheme, String url) => _blink.Native_Navigator_unregisterProtocolHandler_Callback(this, scheme, url);
+  void unregisterProtocolHandler(String scheme, String url) => _blink.BlinkNavigator.$unregisterProtocolHandler_Callback(this, scheme, url);
 
   @DomName('Navigator.webkitGetGamepads')
   @DocsEditable()
@@ -20803,44 +20803,44 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#widl-Navigator-getGamepads-Gamepad
-  List<Gamepad> getGamepads() => _blink.Native_Navigator_webkitGetGamepads_Callback(this);
+  List<Gamepad> getGamepads() => _blink.BlinkNavigator.$webkitGetGamepads_Callback(this);
 
   @DomName('Navigator.webkitGetUserMedia')
   @DocsEditable()
   // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermedia
   @Experimental()
-  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, [_NavigatorUserMediaErrorCallback errorCallback]) => _blink.Native_Navigator_webkitGetUserMedia_Callback(this, options, successCallback, errorCallback);
+  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, [_NavigatorUserMediaErrorCallback errorCallback]) => _blink.BlinkNavigator.$webkitGetUserMedia_Callback(this, options, successCallback, errorCallback);
 
   @DomName('Navigator.appCodeName')
   @DocsEditable()
   @Experimental() // non-standard
-  String get appCodeName => _blink.Native_Navigator_appCodeName_Getter(this);
+  String get appCodeName => _blink.BlinkNavigator.$appCodeName_Getter(this);
 
   @DomName('Navigator.appName')
   @DocsEditable()
-  String get appName => _blink.Native_Navigator_appName_Getter(this);
+  String get appName => _blink.BlinkNavigator.$appName_Getter(this);
 
   @DomName('Navigator.appVersion')
   @DocsEditable()
-  String get appVersion => _blink.Native_Navigator_appVersion_Getter(this);
+  String get appVersion => _blink.BlinkNavigator.$appVersion_Getter(this);
 
   @DomName('Navigator.platform')
   @DocsEditable()
-  String get platform => _blink.Native_Navigator_platform_Getter(this);
+  String get platform => _blink.BlinkNavigator.$platform_Getter(this);
 
   @DomName('Navigator.product')
   @DocsEditable()
   @Unstable()
-  String get product => _blink.Native_Navigator_product_Getter(this);
+  String get product => _blink.BlinkNavigator.$product_Getter(this);
 
   @DomName('Navigator.userAgent')
   @DocsEditable()
-  String get userAgent => _blink.Native_Navigator_userAgent_Getter(this);
+  String get userAgent => _blink.BlinkNavigator.$userAgent_Getter(this);
 
   @DomName('Navigator.onLine')
   @DocsEditable()
   @Unstable()
-  bool get onLine => _blink.Native_Navigator_onLine_Getter(this);
+  bool get onLine => _blink.BlinkNavigator.$onLine_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20860,32 +20860,32 @@
   @DomName('NavigatorID.appCodeName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get appCodeName => _blink.Native_NavigatorID_appCodeName_Getter(this);
+  String get appCodeName => _blink.BlinkNavigatorID.$appCodeName_Getter(this);
 
   @DomName('NavigatorID.appName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get appName => _blink.Native_NavigatorID_appName_Getter(this);
+  String get appName => _blink.BlinkNavigatorID.$appName_Getter(this);
 
   @DomName('NavigatorID.appVersion')
   @DocsEditable()
   @Experimental() // untriaged
-  String get appVersion => _blink.Native_NavigatorID_appVersion_Getter(this);
+  String get appVersion => _blink.BlinkNavigatorID.$appVersion_Getter(this);
 
   @DomName('NavigatorID.platform')
   @DocsEditable()
   @Experimental() // untriaged
-  String get platform => _blink.Native_NavigatorID_platform_Getter(this);
+  String get platform => _blink.BlinkNavigatorID.$platform_Getter(this);
 
   @DomName('NavigatorID.product')
   @DocsEditable()
   @Experimental() // untriaged
-  String get product => _blink.Native_NavigatorID_product_Getter(this);
+  String get product => _blink.BlinkNavigatorID.$product_Getter(this);
 
   @DomName('NavigatorID.userAgent')
   @DocsEditable()
   @Experimental() // untriaged
-  String get userAgent => _blink.Native_NavigatorID_userAgent_Getter(this);
+  String get userAgent => _blink.BlinkNavigatorID.$userAgent_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20905,7 +20905,7 @@
   @DomName('NavigatorOnLine.onLine')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get onLine => _blink.Native_NavigatorOnLine_onLine_Getter(this);
+  bool get onLine => _blink.BlinkNavigatorOnLine.$onLine_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20925,15 +20925,15 @@
 
   @DomName('NavigatorUserMediaError.constraintName')
   @DocsEditable()
-  String get constraintName => _blink.Native_NavigatorUserMediaError_constraintName_Getter(this);
+  String get constraintName => _blink.BlinkNavigatorUserMediaError.$constraintName_Getter(this);
 
   @DomName('NavigatorUserMediaError.message')
   @DocsEditable()
-  String get message => _blink.Native_NavigatorUserMediaError_message_Getter(this);
+  String get message => _blink.BlinkNavigatorUserMediaError.$message_Getter(this);
 
   @DomName('NavigatorUserMediaError.name')
   @DocsEditable()
-  String get name => _blink.Native_NavigatorUserMediaError_name_Getter(this);
+  String get name => _blink.BlinkNavigatorUserMediaError.$name_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21263,7 +21263,7 @@
 
   @DomName('Node.baseURI')
   @DocsEditable()
-  String get baseUri => _blink.Native_Node_baseURI_Getter(this);
+  String get baseUri => _blink.BlinkNode.$baseURI_Getter(this);
 
   /**
    * A list of this node's children.
@@ -21276,7 +21276,7 @@
    */
   @DomName('Node.childNodes')
   @DocsEditable()
-  List<Node> get childNodes => _blink.Native_Node_childNodes_Getter(this);
+  List<Node> get childNodes => _blink.BlinkNode.$childNodes_Getter(this);
 
   /**
    * The first child of this node.
@@ -21289,7 +21289,7 @@
    */
   @DomName('Node.firstChild')
   @DocsEditable()
-  Node get firstChild => _blink.Native_Node_firstChild_Getter(this);
+  Node get firstChild => _blink.BlinkNode.$firstChild_Getter(this);
 
   /**
    * The last child of this node.
@@ -21302,15 +21302,15 @@
    */
   @DomName('Node.lastChild')
   @DocsEditable()
-  Node get lastChild => _blink.Native_Node_lastChild_Getter(this);
+  Node get lastChild => _blink.BlinkNode.$lastChild_Getter(this);
 
   @DomName('Node.localName')
   @DocsEditable()
-  String get _localName => _blink.Native_Node_localName_Getter(this);
+  String get _localName => _blink.BlinkNode.$localName_Getter(this);
 
   @DomName('Node.namespaceURI')
   @DocsEditable()
-  String get _namespaceUri => _blink.Native_Node_namespaceURI_Getter(this);
+  String get _namespaceUri => _blink.BlinkNode.$namespaceURI_Getter(this);
 
   /**
    * The next sibling node.
@@ -21323,7 +21323,7 @@
    */
   @DomName('Node.nextSibling')
   @DocsEditable()
-  Node get nextNode => _blink.Native_Node_nextSibling_Getter(this);
+  Node get nextNode => _blink.BlinkNode.$nextSibling_Getter(this);
 
   /**
    * The name of this node.
@@ -21339,7 +21339,7 @@
    */
   @DomName('Node.nodeName')
   @DocsEditable()
-  String get nodeName => _blink.Native_Node_nodeName_Getter(this);
+  String get nodeName => _blink.BlinkNode.$nodeName_Getter(this);
 
   /**
    * The type of node.
@@ -21366,7 +21366,7 @@
    */
   @DomName('Node.nodeType')
   @DocsEditable()
-  int get nodeType => _blink.Native_Node_nodeType_Getter(this);
+  int get nodeType => _blink.BlinkNode.$nodeType_Getter(this);
 
   /**
    * The value of this node.
@@ -21382,7 +21382,7 @@
    */
   @DomName('Node.nodeValue')
   @DocsEditable()
-  String get nodeValue => _blink.Native_Node_nodeValue_Getter(this);
+  String get nodeValue => _blink.BlinkNode.$nodeValue_Getter(this);
 
   /**
    * The document this node belongs to.
@@ -21397,7 +21397,7 @@
    */
   @DomName('Node.ownerDocument')
   @DocsEditable()
-  Document get ownerDocument => _blink.Native_Node_ownerDocument_Getter(this);
+  Document get ownerDocument => _blink.BlinkNode.$ownerDocument_Getter(this);
 
   /**
    * The parent element of this node.
@@ -21413,7 +21413,7 @@
    */
   @DomName('Node.parentElement')
   @DocsEditable()
-  Element get parent => _blink.Native_Node_parentElement_Getter(this);
+  Element get parent => _blink.BlinkNode.$parentElement_Getter(this);
 
   /**
    * The parent node of this node.
@@ -21426,7 +21426,7 @@
    */
   @DomName('Node.parentNode')
   @DocsEditable()
-  Node get parentNode => _blink.Native_Node_parentNode_Getter(this);
+  Node get parentNode => _blink.BlinkNode.$parentNode_Getter(this);
 
   /**
    * The previous sibling node.
@@ -21439,7 +21439,7 @@
    */
   @DomName('Node.previousSibling')
   @DocsEditable()
-  Node get previousNode => _blink.Native_Node_previousSibling_Getter(this);
+  Node get previousNode => _blink.BlinkNode.$previousSibling_Getter(this);
 
   /**
    * All text within this node and its decendents.
@@ -21452,7 +21452,7 @@
    */
   @DomName('Node.textContent')
   @DocsEditable()
-  String get text => _blink.Native_Node_textContent_Getter(this);
+  String get text => _blink.BlinkNode.$textContent_Getter(this);
 
   /**
    * All text within this node and its decendents.
@@ -21465,7 +21465,7 @@
    */
   @DomName('Node.textContent')
   @DocsEditable()
-  void set text(String value) => _blink.Native_Node_textContent_Setter(this, value);
+  void set text(String value) => _blink.BlinkNode.$textContent_Setter(this, value);
 
   /**
    * Adds a node to the end of the child [nodes] list of this node.
@@ -21478,7 +21478,7 @@
    */
   @DomName('Node.appendChild')
   @DocsEditable()
-  Node append(Node newChild) => _blink.Native_Node_appendChild_Callback(this, newChild);
+  Node append(Node newChild) => _blink.BlinkNode.$appendChild_Callback(this, newChild);
 
   /**
    * Returns a copy of this node.
@@ -21494,7 +21494,7 @@
    */
   @DomName('Node.cloneNode')
   @DocsEditable()
-  Node clone(bool deep) => _blink.Native_Node_cloneNode_Callback(this, deep);
+  Node clone(bool deep) => _blink.BlinkNode.$cloneNode_Callback(this, deep);
 
   /**
    * Returns true if this node contains the specified node.
@@ -21506,7 +21506,7 @@
    */
   @DomName('Node.contains')
   @DocsEditable()
-  bool contains(Node other) => _blink.Native_Node_contains_Callback(this, other);
+  bool contains(Node other) => _blink.BlinkNode.$contains_Callback(this, other);
 
   /**
    * Returns true if this node has any children.
@@ -21519,7 +21519,7 @@
    */
   @DomName('Node.hasChildNodes')
   @DocsEditable()
-  bool hasChildNodes() => _blink.Native_Node_hasChildNodes_Callback(this);
+  bool hasChildNodes() => _blink.BlinkNode.$hasChildNodes_Callback(this);
 
   /**
    * Inserts all of the nodes into this node directly before refChild.
@@ -21532,15 +21532,15 @@
    */
   @DomName('Node.insertBefore')
   @DocsEditable()
-  Node insertBefore(Node newChild, Node refChild) => _blink.Native_Node_insertBefore_Callback(this, newChild, refChild);
+  Node insertBefore(Node newChild, Node refChild) => _blink.BlinkNode.$insertBefore_Callback(this, newChild, refChild);
 
   @DomName('Node.removeChild')
   @DocsEditable()
-  Node _removeChild(Node oldChild) => _blink.Native_Node_removeChild_Callback(this, oldChild);
+  Node _removeChild(Node oldChild) => _blink.BlinkNode.$removeChild_Callback(this, oldChild);
 
   @DomName('Node.replaceChild')
   @DocsEditable()
-  Node _replaceChild(Node newChild, Node oldChild) => _blink.Native_Node_replaceChild_Callback(this, newChild, oldChild);
+  Node _replaceChild(Node newChild, Node oldChild) => _blink.BlinkNode.$replaceChild_Callback(this, newChild, oldChild);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21618,31 +21618,31 @@
 
   @DomName('NodeIterator.pointerBeforeReferenceNode')
   @DocsEditable()
-  bool get pointerBeforeReferenceNode => _blink.Native_NodeIterator_pointerBeforeReferenceNode_Getter(this);
+  bool get pointerBeforeReferenceNode => _blink.BlinkNodeIterator.$pointerBeforeReferenceNode_Getter(this);
 
   @DomName('NodeIterator.referenceNode')
   @DocsEditable()
-  Node get referenceNode => _blink.Native_NodeIterator_referenceNode_Getter(this);
+  Node get referenceNode => _blink.BlinkNodeIterator.$referenceNode_Getter(this);
 
   @DomName('NodeIterator.root')
   @DocsEditable()
-  Node get root => _blink.Native_NodeIterator_root_Getter(this);
+  Node get root => _blink.BlinkNodeIterator.$root_Getter(this);
 
   @DomName('NodeIterator.whatToShow')
   @DocsEditable()
-  int get whatToShow => _blink.Native_NodeIterator_whatToShow_Getter(this);
+  int get whatToShow => _blink.BlinkNodeIterator.$whatToShow_Getter(this);
 
   @DomName('NodeIterator.detach')
   @DocsEditable()
-  void detach() => _blink.Native_NodeIterator_detach_Callback(this);
+  void detach() => _blink.BlinkNodeIterator.$detach_Callback(this);
 
   @DomName('NodeIterator.nextNode')
   @DocsEditable()
-  Node nextNode() => _blink.Native_NodeIterator_nextNode_Callback(this);
+  Node nextNode() => _blink.BlinkNodeIterator.$nextNode_Callback(this);
 
   @DomName('NodeIterator.previousNode')
   @DocsEditable()
-  Node previousNode() => _blink.Native_NodeIterator_previousNode_Callback(this);
+  Node previousNode() => _blink.BlinkNodeIterator.$previousNode_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21660,15 +21660,15 @@
 
   @DomName('NodeList.length')
   @DocsEditable()
-  int get length => _blink.Native_NodeList_length_Getter(this);
+  int get length => _blink.BlinkNodeList.$length_Getter(this);
 
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_NodeList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkNodeList.$NativeIndexed_Getter(this, index);
   }
 
-  Node _nativeIndexedGetter(int index) => _blink.Native_NodeList_NativeIndexed_Getter(this, index);
+  Node _nativeIndexedGetter(int index) => _blink.BlinkNodeList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -21710,7 +21710,7 @@
 
   @DomName('NodeList.item')
   @DocsEditable()
-  Node _item(int index) => _blink.Native_NodeList_item_Callback(this, index);
+  Node _item(int index) => _blink.BlinkNodeList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -21780,49 +21780,49 @@
 
   @DomName('Notification.Notification')
   @DocsEditable()
-  static Notification _factoryNotification(String title, [Map options]) => _blink.Native_Notification_Notification(title, options);
+  static Notification _factoryNotification(String title, [Map options]) => _blink.BlinkNotification.$mkNotification(title, options);
 
   @DomName('Notification.body')
   @DocsEditable()
   @Experimental() // untriaged
-  String get body => _blink.Native_Notification_body_Getter(this);
+  String get body => _blink.BlinkNotification.$body_Getter(this);
 
   @DomName('Notification.dir')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get dir => _blink.Native_Notification_dir_Getter(this);
+  String get dir => _blink.BlinkNotification.$dir_Getter(this);
 
   @DomName('Notification.icon')
   @DocsEditable()
   @Experimental() // untriaged
-  String get icon => _blink.Native_Notification_icon_Getter(this);
+  String get icon => _blink.BlinkNotification.$icon_Getter(this);
 
   @DomName('Notification.lang')
   @DocsEditable()
   @Experimental() // untriaged
-  String get lang => _blink.Native_Notification_lang_Getter(this);
+  String get lang => _blink.BlinkNotification.$lang_Getter(this);
 
   @DomName('Notification.permission')
   @DocsEditable()
-  String get permission => _blink.Native_Notification_permission_Getter(this);
+  String get permission => _blink.BlinkNotification.$permission_Getter(this);
 
   @DomName('Notification.tag')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get tag => _blink.Native_Notification_tag_Getter(this);
+  String get tag => _blink.BlinkNotification.$tag_Getter(this);
 
   @DomName('Notification.title')
   @DocsEditable()
   @Experimental() // untriaged
-  String get title => _blink.Native_Notification_title_Getter(this);
+  String get title => _blink.BlinkNotification.$title_Getter(this);
 
   @DomName('Notification.close')
   @DocsEditable()
-  void close() => _blink.Native_Notification_close_Callback(this);
+  void close() => _blink.BlinkNotification.$close_Callback(this);
 
   @DomName('Notification.requestPermission')
   @DocsEditable()
-  static void _requestPermission([_NotificationPermissionCallback callback]) => _blink.Native_Notification_requestPermission_Callback(callback);
+  static void _requestPermission([_NotificationPermissionCallback callback]) => _blink.BlinkNotification.$requestPermission_Callback(callback);
 
   static Future<String> requestPermission() {
     var completer = new Completer<String>();
@@ -21888,27 +21888,27 @@
 
   @DomName('HTMLOListElement.reversed')
   @DocsEditable()
-  bool get reversed => _blink.Native_HTMLOListElement_reversed_Getter(this);
+  bool get reversed => _blink.BlinkHTMLOListElement.$reversed_Getter(this);
 
   @DomName('HTMLOListElement.reversed')
   @DocsEditable()
-  void set reversed(bool value) => _blink.Native_HTMLOListElement_reversed_Setter(this, value);
+  void set reversed(bool value) => _blink.BlinkHTMLOListElement.$reversed_Setter(this, value);
 
   @DomName('HTMLOListElement.start')
   @DocsEditable()
-  int get start => _blink.Native_HTMLOListElement_start_Getter(this);
+  int get start => _blink.BlinkHTMLOListElement.$start_Getter(this);
 
   @DomName('HTMLOListElement.start')
   @DocsEditable()
-  void set start(int value) => _blink.Native_HTMLOListElement_start_Setter(this, value);
+  void set start(int value) => _blink.BlinkHTMLOListElement.$start_Setter(this, value);
 
   @DomName('HTMLOListElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLOListElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLOListElement.$type_Getter(this);
 
   @DomName('HTMLOListElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLOListElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLOListElement.$type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21943,83 +21943,83 @@
 
   @DomName('HTMLObjectElement.data')
   @DocsEditable()
-  String get data => _blink.Native_HTMLObjectElement_data_Getter(this);
+  String get data => _blink.BlinkHTMLObjectElement.$data_Getter(this);
 
   @DomName('HTMLObjectElement.data')
   @DocsEditable()
-  void set data(String value) => _blink.Native_HTMLObjectElement_data_Setter(this, value);
+  void set data(String value) => _blink.BlinkHTMLObjectElement.$data_Setter(this, value);
 
   @DomName('HTMLObjectElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLObjectElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLObjectElement.$form_Getter(this);
 
   @DomName('HTMLObjectElement.height')
   @DocsEditable()
-  String get height => _blink.Native_HTMLObjectElement_height_Getter(this);
+  String get height => _blink.BlinkHTMLObjectElement.$height_Getter(this);
 
   @DomName('HTMLObjectElement.height')
   @DocsEditable()
-  void set height(String value) => _blink.Native_HTMLObjectElement_height_Setter(this, value);
+  void set height(String value) => _blink.BlinkHTMLObjectElement.$height_Setter(this, value);
 
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLObjectElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLObjectElement.$name_Getter(this);
 
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLObjectElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLObjectElement.$name_Setter(this, value);
 
   @DomName('HTMLObjectElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLObjectElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLObjectElement.$type_Getter(this);
 
   @DomName('HTMLObjectElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLObjectElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLObjectElement.$type_Setter(this, value);
 
   @DomName('HTMLObjectElement.useMap')
   @DocsEditable()
-  String get useMap => _blink.Native_HTMLObjectElement_useMap_Getter(this);
+  String get useMap => _blink.BlinkHTMLObjectElement.$useMap_Getter(this);
 
   @DomName('HTMLObjectElement.useMap')
   @DocsEditable()
-  void set useMap(String value) => _blink.Native_HTMLObjectElement_useMap_Setter(this, value);
+  void set useMap(String value) => _blink.BlinkHTMLObjectElement.$useMap_Setter(this, value);
 
   @DomName('HTMLObjectElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLObjectElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLObjectElement.$validationMessage_Getter(this);
 
   @DomName('HTMLObjectElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLObjectElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLObjectElement.$validity_Getter(this);
 
   @DomName('HTMLObjectElement.width')
   @DocsEditable()
-  String get width => _blink.Native_HTMLObjectElement_width_Getter(this);
+  String get width => _blink.BlinkHTMLObjectElement.$width_Getter(this);
 
   @DomName('HTMLObjectElement.width')
   @DocsEditable()
-  void set width(String value) => _blink.Native_HTMLObjectElement_width_Setter(this, value);
+  void set width(String value) => _blink.BlinkHTMLObjectElement.$width_Setter(this, value);
 
   @DomName('HTMLObjectElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLObjectElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLObjectElement.$willValidate_Getter(this);
 
   @DomName('HTMLObjectElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) => _blink.Native_HTMLObjectElement___getter___Callback(this, index_OR_name);
+  bool __getter__(index_OR_name) => _blink.BlinkHTMLObjectElement.$__getter___Callback(this, index_OR_name);
 
   @DomName('HTMLObjectElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) => _blink.Native_HTMLObjectElement___setter___Callback(this, index_OR_name, value);
+  void __setter__(index_OR_name, Node value) => _blink.BlinkHTMLObjectElement.$__setter___Callback(this, index_OR_name, value);
 
   @DomName('HTMLObjectElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLObjectElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLObjectElement.$checkValidity_Callback(this);
 
   @DomName('HTMLObjectElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLObjectElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLObjectElement.$setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22047,19 +22047,19 @@
 
   @DomName('HTMLOptGroupElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLOptGroupElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLOptGroupElement.$disabled_Getter(this);
 
   @DomName('HTMLOptGroupElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLOptGroupElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLOptGroupElement.$disabled_Setter(this, value);
 
   @DomName('HTMLOptGroupElement.label')
   @DocsEditable()
-  String get label => _blink.Native_HTMLOptGroupElement_label_Getter(this);
+  String get label => _blink.BlinkHTMLOptGroupElement.$label_Getter(this);
 
   @DomName('HTMLOptGroupElement.label')
   @DocsEditable()
-  void set label(String value) => _blink.Native_HTMLOptGroupElement_label_Setter(this, value);
+  void set label(String value) => _blink.BlinkHTMLOptGroupElement.$label_Setter(this, value);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -22075,7 +22075,7 @@
 
   @DomName('HTMLOptionElement.HTMLOptionElement')
   @DocsEditable()
-  factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) => _blink.Native_HTMLOptionElement_OptionElement__(data, value, defaultSelected, selected);
+  factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) => _blink.BlinkHTMLOptionElement.$mkOptionElement__(data, value, defaultSelected, selected);
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -22085,51 +22085,51 @@
 
   @DomName('HTMLOptionElement.defaultSelected')
   @DocsEditable()
-  bool get defaultSelected => _blink.Native_HTMLOptionElement_defaultSelected_Getter(this);
+  bool get defaultSelected => _blink.BlinkHTMLOptionElement.$defaultSelected_Getter(this);
 
   @DomName('HTMLOptionElement.defaultSelected')
   @DocsEditable()
-  void set defaultSelected(bool value) => _blink.Native_HTMLOptionElement_defaultSelected_Setter(this, value);
+  void set defaultSelected(bool value) => _blink.BlinkHTMLOptionElement.$defaultSelected_Setter(this, value);
 
   @DomName('HTMLOptionElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLOptionElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLOptionElement.$disabled_Getter(this);
 
   @DomName('HTMLOptionElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLOptionElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLOptionElement.$disabled_Setter(this, value);
 
   @DomName('HTMLOptionElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLOptionElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLOptionElement.$form_Getter(this);
 
   @DomName('HTMLOptionElement.index')
   @DocsEditable()
-  int get index => _blink.Native_HTMLOptionElement_index_Getter(this);
+  int get index => _blink.BlinkHTMLOptionElement.$index_Getter(this);
 
   @DomName('HTMLOptionElement.label')
   @DocsEditable()
-  String get label => _blink.Native_HTMLOptionElement_label_Getter(this);
+  String get label => _blink.BlinkHTMLOptionElement.$label_Getter(this);
 
   @DomName('HTMLOptionElement.label')
   @DocsEditable()
-  void set label(String value) => _blink.Native_HTMLOptionElement_label_Setter(this, value);
+  void set label(String value) => _blink.BlinkHTMLOptionElement.$label_Setter(this, value);
 
   @DomName('HTMLOptionElement.selected')
   @DocsEditable()
-  bool get selected => _blink.Native_HTMLOptionElement_selected_Getter(this);
+  bool get selected => _blink.BlinkHTMLOptionElement.$selected_Getter(this);
 
   @DomName('HTMLOptionElement.selected')
   @DocsEditable()
-  void set selected(bool value) => _blink.Native_HTMLOptionElement_selected_Setter(this, value);
+  void set selected(bool value) => _blink.BlinkHTMLOptionElement.$selected_Setter(this, value);
 
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLOptionElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLOptionElement.$value_Getter(this);
 
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLOptionElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLOptionElement.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22163,64 +22163,64 @@
 
   @DomName('HTMLOutputElement.defaultValue')
   @DocsEditable()
-  String get defaultValue => _blink.Native_HTMLOutputElement_defaultValue_Getter(this);
+  String get defaultValue => _blink.BlinkHTMLOutputElement.$defaultValue_Getter(this);
 
   @DomName('HTMLOutputElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) => _blink.Native_HTMLOutputElement_defaultValue_Setter(this, value);
+  void set defaultValue(String value) => _blink.BlinkHTMLOutputElement.$defaultValue_Setter(this, value);
 
   @DomName('HTMLOutputElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLOutputElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLOutputElement.$form_Getter(this);
 
   @DomName('HTMLOutputElement.htmlFor')
   @DocsEditable()
-  DomSettableTokenList get htmlFor => _blink.Native_HTMLOutputElement_htmlFor_Getter(this);
+  DomSettableTokenList get htmlFor => _blink.BlinkHTMLOutputElement.$htmlFor_Getter(this);
 
   @DomName('HTMLOutputElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLOutputElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLOutputElement.$labels_Getter(this);
 
   @DomName('HTMLOutputElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLOutputElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLOutputElement.$name_Getter(this);
 
   @DomName('HTMLOutputElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLOutputElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLOutputElement.$name_Setter(this, value);
 
   @DomName('HTMLOutputElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLOutputElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLOutputElement.$type_Getter(this);
 
   @DomName('HTMLOutputElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLOutputElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLOutputElement.$validationMessage_Getter(this);
 
   @DomName('HTMLOutputElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLOutputElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLOutputElement.$validity_Getter(this);
 
   @DomName('HTMLOutputElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLOutputElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLOutputElement.$value_Getter(this);
 
   @DomName('HTMLOutputElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLOutputElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLOutputElement.$value_Setter(this, value);
 
   @DomName('HTMLOutputElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLOutputElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLOutputElement.$willValidate_Getter(this);
 
   @DomName('HTMLOutputElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLOutputElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLOutputElement.$checkValidity_Callback(this);
 
   @DomName('HTMLOutputElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLOutputElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLOutputElement.$setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22251,15 +22251,15 @@
 
   @DomName('OverflowEvent.horizontalOverflow')
   @DocsEditable()
-  bool get horizontalOverflow => _blink.Native_OverflowEvent_horizontalOverflow_Getter(this);
+  bool get horizontalOverflow => _blink.BlinkOverflowEvent.$horizontalOverflow_Getter(this);
 
   @DomName('OverflowEvent.orient')
   @DocsEditable()
-  int get orient => _blink.Native_OverflowEvent_orient_Getter(this);
+  int get orient => _blink.BlinkOverflowEvent.$orient_Getter(this);
 
   @DomName('OverflowEvent.verticalOverflow')
   @DocsEditable()
-  bool get verticalOverflow => _blink.Native_OverflowEvent_verticalOverflow_Getter(this);
+  bool get verticalOverflow => _blink.BlinkOverflowEvent.$verticalOverflow_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22279,7 +22279,7 @@
 
   @DomName('PageTransitionEvent.persisted')
   @DocsEditable()
-  bool get persisted => _blink.Native_PageTransitionEvent_persisted_Getter(this);
+  bool get persisted => _blink.BlinkPageTransitionEvent.$persisted_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22332,19 +22332,19 @@
 
   @DomName('HTMLParamElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLParamElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLParamElement.$name_Getter(this);
 
   @DomName('HTMLParamElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLParamElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLParamElement.$name_Setter(this, value);
 
   @DomName('HTMLParamElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLParamElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLParamElement.$value_Getter(this);
 
   @DomName('HTMLParamElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLParamElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLParamElement.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22364,22 +22364,22 @@
   @DomName('ParentNode.childElementCount')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _childElementCount => _blink.Native_ParentNode_childElementCount_Getter(this);
+  int get _childElementCount => _blink.BlinkParentNode.$childElementCount_Getter(this);
 
   @DomName('ParentNode.children')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> get _children => _blink.Native_ParentNode_children_Getter(this);
+  List<Node> get _children => _blink.BlinkParentNode.$children_Getter(this);
 
   @DomName('ParentNode.firstElementChild')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get _firstElementChild => _blink.Native_ParentNode_firstElementChild_Getter(this);
+  Element get _firstElementChild => _blink.BlinkParentNode.$firstElementChild_Getter(this);
 
   @DomName('ParentNode.lastElementChild')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get _lastElementChild => _blink.Native_ParentNode_lastElementChild_Getter(this);
+  Element get _lastElementChild => _blink.BlinkParentNode.$lastElementChild_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22399,39 +22399,39 @@
 
   @DomName('Path.Path')
   @DocsEditable()
-  factory Path([path_OR_text]) => _blink.Native_Path_Path(path_OR_text);
+  factory Path([path_OR_text]) => _blink.BlinkPath.$mkPath(path_OR_text);
 
   @DomName('Path.arc')
   @DocsEditable()
-  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.Native_Path_arc_Callback(this, x, y, radius, startAngle, endAngle, anticlockwise);
+  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath.$arc_Callback(this, x, y, radius, startAngle, endAngle, anticlockwise);
 
   @DomName('Path.arcTo')
   @DocsEditable()
-  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.Native_Path_arcTo_Callback(this, x1, y1, x2, y2, radius);
+  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkPath.$arcTo_Callback(this, x1, y1, x2, y2, radius);
 
   @DomName('Path.bezierCurveTo')
   @DocsEditable()
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.Native_Path_bezierCurveTo_Callback(this, cp1x, cp1y, cp2x, cp2y, x, y);
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkPath.$bezierCurveTo_Callback(this, cp1x, cp1y, cp2x, cp2y, x, y);
 
   @DomName('Path.closePath')
   @DocsEditable()
-  void closePath() => _blink.Native_Path_closePath_Callback(this);
+  void closePath() => _blink.BlinkPath.$closePath_Callback(this);
 
   @DomName('Path.lineTo')
   @DocsEditable()
-  void lineTo(num x, num y) => _blink.Native_Path_lineTo_Callback(this, x, y);
+  void lineTo(num x, num y) => _blink.BlinkPath.$lineTo_Callback(this, x, y);
 
   @DomName('Path.moveTo')
   @DocsEditable()
-  void moveTo(num x, num y) => _blink.Native_Path_moveTo_Callback(this, x, y);
+  void moveTo(num x, num y) => _blink.BlinkPath.$moveTo_Callback(this, x, y);
 
   @DomName('Path.quadraticCurveTo')
   @DocsEditable()
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.Native_Path_quadraticCurveTo_Callback(this, cpx, cpy, x, y);
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkPath.$quadraticCurveTo_Callback(this, cpx, cpy, x, y);
 
   @DomName('Path.rect')
   @DocsEditable()
-  void rect(num x, num y, num width, num height) => _blink.Native_Path_rect_Callback(this, x, y, width, height);
+  void rect(num x, num y, num width, num height) => _blink.BlinkPath.$rect_Callback(this, x, y, width, height);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22470,61 +22470,61 @@
   @DomName('Performance.memory')
   @DocsEditable()
   @Experimental() // nonstandard
-  MemoryInfo get memory => _blink.Native_Performance_memory_Getter(this);
+  MemoryInfo get memory => _blink.BlinkPerformance.$memory_Getter(this);
 
   @DomName('Performance.navigation')
   @DocsEditable()
-  PerformanceNavigation get navigation => _blink.Native_Performance_navigation_Getter(this);
+  PerformanceNavigation get navigation => _blink.BlinkPerformance.$navigation_Getter(this);
 
   @DomName('Performance.timing')
   @DocsEditable()
-  PerformanceTiming get timing => _blink.Native_Performance_timing_Getter(this);
+  PerformanceTiming get timing => _blink.BlinkPerformance.$timing_Getter(this);
 
   @DomName('Performance.clearMarks')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void clearMarks(String markName) => _blink.Native_Performance_clearMarks_Callback(this, markName);
+  void clearMarks(String markName) => _blink.BlinkPerformance.$clearMarks_Callback(this, markName);
 
   @DomName('Performance.clearMeasures')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void clearMeasures(String measureName) => _blink.Native_Performance_clearMeasures_Callback(this, measureName);
+  void clearMeasures(String measureName) => _blink.BlinkPerformance.$clearMeasures_Callback(this, measureName);
 
   @DomName('Performance.getEntries')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntries() => _blink.Native_Performance_getEntries_Callback(this);
+  List<PerformanceEntry> getEntries() => _blink.BlinkPerformance.$getEntries_Callback(this);
 
   @DomName('Performance.getEntriesByName')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntriesByName(String name, String entryType) => _blink.Native_Performance_getEntriesByName_Callback(this, name, entryType);
+  List<PerformanceEntry> getEntriesByName(String name, String entryType) => _blink.BlinkPerformance.$getEntriesByName_Callback(this, name, entryType);
 
   @DomName('Performance.getEntriesByType')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntriesByType(String entryType) => _blink.Native_Performance_getEntriesByType_Callback(this, entryType);
+  List<PerformanceEntry> getEntriesByType(String entryType) => _blink.BlinkPerformance.$getEntriesByType_Callback(this, entryType);
 
   @DomName('Performance.mark')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void mark(String markName) => _blink.Native_Performance_mark_Callback(this, markName);
+  void mark(String markName) => _blink.BlinkPerformance.$mark_Callback(this, markName);
 
   @DomName('Performance.measure')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void measure(String measureName, String startMark, String endMark) => _blink.Native_Performance_measure_Callback(this, measureName, startMark, endMark);
+  void measure(String measureName, String startMark, String endMark) => _blink.BlinkPerformance.$measure_Callback(this, measureName, startMark, endMark);
 
   @DomName('Performance.now')
   @DocsEditable()
-  double now() => _blink.Native_Performance_now_Callback(this);
+  double now() => _blink.BlinkPerformance.$now_Callback(this);
 
   @DomName('Performance.webkitClearResourceTimings')
   @DocsEditable()
@@ -22532,7 +22532,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#extensions-performance-interface
-  void clearResourceTimings() => _blink.Native_Performance_webkitClearResourceTimings_Callback(this);
+  void clearResourceTimings() => _blink.BlinkPerformance.$webkitClearResourceTimings_Callback(this);
 
   @DomName('Performance.webkitSetResourceTimingBufferSize')
   @DocsEditable()
@@ -22540,7 +22540,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
-  void setResourceTimingBufferSize(int maxSize) => _blink.Native_Performance_webkitSetResourceTimingBufferSize_Callback(this, maxSize);
+  void setResourceTimingBufferSize(int maxSize) => _blink.BlinkPerformance.$webkitSetResourceTimingBufferSize_Callback(this, maxSize);
 
   /// Stream of `resourcetimingbufferfull` events handled by this [Performance].
   @DomName('Performance.onwebkitresourcetimingbufferfull')
@@ -22567,19 +22567,19 @@
 
   @DomName('PerformanceEntry.duration')
   @DocsEditable()
-  double get duration => _blink.Native_PerformanceEntry_duration_Getter(this);
+  double get duration => _blink.BlinkPerformanceEntry.$duration_Getter(this);
 
   @DomName('PerformanceEntry.entryType')
   @DocsEditable()
-  String get entryType => _blink.Native_PerformanceEntry_entryType_Getter(this);
+  String get entryType => _blink.BlinkPerformanceEntry.$entryType_Getter(this);
 
   @DomName('PerformanceEntry.name')
   @DocsEditable()
-  String get name => _blink.Native_PerformanceEntry_name_Getter(this);
+  String get name => _blink.BlinkPerformanceEntry.$name_Getter(this);
 
   @DomName('PerformanceEntry.startTime')
   @DocsEditable()
-  double get startTime => _blink.Native_PerformanceEntry_startTime_Getter(this);
+  double get startTime => _blink.BlinkPerformanceEntry.$startTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22646,11 +22646,11 @@
 
   @DomName('PerformanceNavigation.redirectCount')
   @DocsEditable()
-  int get redirectCount => _blink.Native_PerformanceNavigation_redirectCount_Getter(this);
+  int get redirectCount => _blink.BlinkPerformanceNavigation.$redirectCount_Getter(this);
 
   @DomName('PerformanceNavigation.type')
   @DocsEditable()
-  int get type => _blink.Native_PerformanceNavigation_type_Getter(this);
+  int get type => _blink.BlinkPerformanceNavigation.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22670,54 +22670,54 @@
 
   @DomName('PerformanceResourceTiming.connectEnd')
   @DocsEditable()
-  double get connectEnd => _blink.Native_PerformanceResourceTiming_connectEnd_Getter(this);
+  double get connectEnd => _blink.BlinkPerformanceResourceTiming.$connectEnd_Getter(this);
 
   @DomName('PerformanceResourceTiming.connectStart')
   @DocsEditable()
-  double get connectStart => _blink.Native_PerformanceResourceTiming_connectStart_Getter(this);
+  double get connectStart => _blink.BlinkPerformanceResourceTiming.$connectStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.domainLookupEnd')
   @DocsEditable()
-  double get domainLookupEnd => _blink.Native_PerformanceResourceTiming_domainLookupEnd_Getter(this);
+  double get domainLookupEnd => _blink.BlinkPerformanceResourceTiming.$domainLookupEnd_Getter(this);
 
   @DomName('PerformanceResourceTiming.domainLookupStart')
   @DocsEditable()
-  double get domainLookupStart => _blink.Native_PerformanceResourceTiming_domainLookupStart_Getter(this);
+  double get domainLookupStart => _blink.BlinkPerformanceResourceTiming.$domainLookupStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.fetchStart')
   @DocsEditable()
-  double get fetchStart => _blink.Native_PerformanceResourceTiming_fetchStart_Getter(this);
+  double get fetchStart => _blink.BlinkPerformanceResourceTiming.$fetchStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.initiatorType')
   @DocsEditable()
-  String get initiatorType => _blink.Native_PerformanceResourceTiming_initiatorType_Getter(this);
+  String get initiatorType => _blink.BlinkPerformanceResourceTiming.$initiatorType_Getter(this);
 
   @DomName('PerformanceResourceTiming.redirectEnd')
   @DocsEditable()
-  double get redirectEnd => _blink.Native_PerformanceResourceTiming_redirectEnd_Getter(this);
+  double get redirectEnd => _blink.BlinkPerformanceResourceTiming.$redirectEnd_Getter(this);
 
   @DomName('PerformanceResourceTiming.redirectStart')
   @DocsEditable()
-  double get redirectStart => _blink.Native_PerformanceResourceTiming_redirectStart_Getter(this);
+  double get redirectStart => _blink.BlinkPerformanceResourceTiming.$redirectStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.requestStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get requestStart => _blink.Native_PerformanceResourceTiming_requestStart_Getter(this);
+  double get requestStart => _blink.BlinkPerformanceResourceTiming.$requestStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.responseEnd')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get responseEnd => _blink.Native_PerformanceResourceTiming_responseEnd_Getter(this);
+  double get responseEnd => _blink.BlinkPerformanceResourceTiming.$responseEnd_Getter(this);
 
   @DomName('PerformanceResourceTiming.responseStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get responseStart => _blink.Native_PerformanceResourceTiming_responseStart_Getter(this);
+  double get responseStart => _blink.BlinkPerformanceResourceTiming.$responseStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.secureConnectionStart')
   @DocsEditable()
-  double get secureConnectionStart => _blink.Native_PerformanceResourceTiming_secureConnectionStart_Getter(this);
+  double get secureConnectionStart => _blink.BlinkPerformanceResourceTiming.$secureConnectionStart_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22736,87 +22736,87 @@
 
   @DomName('PerformanceTiming.connectEnd')
   @DocsEditable()
-  int get connectEnd => _blink.Native_PerformanceTiming_connectEnd_Getter(this);
+  int get connectEnd => _blink.BlinkPerformanceTiming.$connectEnd_Getter(this);
 
   @DomName('PerformanceTiming.connectStart')
   @DocsEditable()
-  int get connectStart => _blink.Native_PerformanceTiming_connectStart_Getter(this);
+  int get connectStart => _blink.BlinkPerformanceTiming.$connectStart_Getter(this);
 
   @DomName('PerformanceTiming.domComplete')
   @DocsEditable()
-  int get domComplete => _blink.Native_PerformanceTiming_domComplete_Getter(this);
+  int get domComplete => _blink.BlinkPerformanceTiming.$domComplete_Getter(this);
 
   @DomName('PerformanceTiming.domContentLoadedEventEnd')
   @DocsEditable()
-  int get domContentLoadedEventEnd => _blink.Native_PerformanceTiming_domContentLoadedEventEnd_Getter(this);
+  int get domContentLoadedEventEnd => _blink.BlinkPerformanceTiming.$domContentLoadedEventEnd_Getter(this);
 
   @DomName('PerformanceTiming.domContentLoadedEventStart')
   @DocsEditable()
-  int get domContentLoadedEventStart => _blink.Native_PerformanceTiming_domContentLoadedEventStart_Getter(this);
+  int get domContentLoadedEventStart => _blink.BlinkPerformanceTiming.$domContentLoadedEventStart_Getter(this);
 
   @DomName('PerformanceTiming.domInteractive')
   @DocsEditable()
-  int get domInteractive => _blink.Native_PerformanceTiming_domInteractive_Getter(this);
+  int get domInteractive => _blink.BlinkPerformanceTiming.$domInteractive_Getter(this);
 
   @DomName('PerformanceTiming.domLoading')
   @DocsEditable()
-  int get domLoading => _blink.Native_PerformanceTiming_domLoading_Getter(this);
+  int get domLoading => _blink.BlinkPerformanceTiming.$domLoading_Getter(this);
 
   @DomName('PerformanceTiming.domainLookupEnd')
   @DocsEditable()
-  int get domainLookupEnd => _blink.Native_PerformanceTiming_domainLookupEnd_Getter(this);
+  int get domainLookupEnd => _blink.BlinkPerformanceTiming.$domainLookupEnd_Getter(this);
 
   @DomName('PerformanceTiming.domainLookupStart')
   @DocsEditable()
-  int get domainLookupStart => _blink.Native_PerformanceTiming_domainLookupStart_Getter(this);
+  int get domainLookupStart => _blink.BlinkPerformanceTiming.$domainLookupStart_Getter(this);
 
   @DomName('PerformanceTiming.fetchStart')
   @DocsEditable()
-  int get fetchStart => _blink.Native_PerformanceTiming_fetchStart_Getter(this);
+  int get fetchStart => _blink.BlinkPerformanceTiming.$fetchStart_Getter(this);
 
   @DomName('PerformanceTiming.loadEventEnd')
   @DocsEditable()
-  int get loadEventEnd => _blink.Native_PerformanceTiming_loadEventEnd_Getter(this);
+  int get loadEventEnd => _blink.BlinkPerformanceTiming.$loadEventEnd_Getter(this);
 
   @DomName('PerformanceTiming.loadEventStart')
   @DocsEditable()
-  int get loadEventStart => _blink.Native_PerformanceTiming_loadEventStart_Getter(this);
+  int get loadEventStart => _blink.BlinkPerformanceTiming.$loadEventStart_Getter(this);
 
   @DomName('PerformanceTiming.navigationStart')
   @DocsEditable()
-  int get navigationStart => _blink.Native_PerformanceTiming_navigationStart_Getter(this);
+  int get navigationStart => _blink.BlinkPerformanceTiming.$navigationStart_Getter(this);
 
   @DomName('PerformanceTiming.redirectEnd')
   @DocsEditable()
-  int get redirectEnd => _blink.Native_PerformanceTiming_redirectEnd_Getter(this);
+  int get redirectEnd => _blink.BlinkPerformanceTiming.$redirectEnd_Getter(this);
 
   @DomName('PerformanceTiming.redirectStart')
   @DocsEditable()
-  int get redirectStart => _blink.Native_PerformanceTiming_redirectStart_Getter(this);
+  int get redirectStart => _blink.BlinkPerformanceTiming.$redirectStart_Getter(this);
 
   @DomName('PerformanceTiming.requestStart')
   @DocsEditable()
-  int get requestStart => _blink.Native_PerformanceTiming_requestStart_Getter(this);
+  int get requestStart => _blink.BlinkPerformanceTiming.$requestStart_Getter(this);
 
   @DomName('PerformanceTiming.responseEnd')
   @DocsEditable()
-  int get responseEnd => _blink.Native_PerformanceTiming_responseEnd_Getter(this);
+  int get responseEnd => _blink.BlinkPerformanceTiming.$responseEnd_Getter(this);
 
   @DomName('PerformanceTiming.responseStart')
   @DocsEditable()
-  int get responseStart => _blink.Native_PerformanceTiming_responseStart_Getter(this);
+  int get responseStart => _blink.BlinkPerformanceTiming.$responseStart_Getter(this);
 
   @DomName('PerformanceTiming.secureConnectionStart')
   @DocsEditable()
-  int get secureConnectionStart => _blink.Native_PerformanceTiming_secureConnectionStart_Getter(this);
+  int get secureConnectionStart => _blink.BlinkPerformanceTiming.$secureConnectionStart_Getter(this);
 
   @DomName('PerformanceTiming.unloadEventEnd')
   @DocsEditable()
-  int get unloadEventEnd => _blink.Native_PerformanceTiming_unloadEventEnd_Getter(this);
+  int get unloadEventEnd => _blink.BlinkPerformanceTiming.$unloadEventEnd_Getter(this);
 
   @DomName('PerformanceTiming.unloadEventStart')
   @DocsEditable()
-  int get unloadEventStart => _blink.Native_PerformanceTiming_unloadEventStart_Getter(this);
+  int get unloadEventStart => _blink.BlinkPerformanceTiming.$unloadEventStart_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22836,82 +22836,82 @@
   @DomName('Player.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get currentTime => _blink.Native_Player_currentTime_Getter(this);
+  num get currentTime => _blink.BlinkPlayer.$currentTime_Getter(this);
 
   @DomName('Player.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  void set currentTime(num value) => _blink.Native_Player_currentTime_Setter(this, value);
+  void set currentTime(num value) => _blink.BlinkPlayer.$currentTime_Setter(this, value);
 
   @DomName('Player.finished')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get finished => _blink.Native_Player_finished_Getter(this);
+  bool get finished => _blink.BlinkPlayer.$finished_Getter(this);
 
   @DomName('Player.paused')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get paused => _blink.Native_Player_paused_Getter(this);
+  bool get paused => _blink.BlinkPlayer.$paused_Getter(this);
 
   @DomName('Player.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  num get playbackRate => _blink.Native_Player_playbackRate_Getter(this);
+  num get playbackRate => _blink.BlinkPlayer.$playbackRate_Getter(this);
 
   @DomName('Player.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  void set playbackRate(num value) => _blink.Native_Player_playbackRate_Setter(this, value);
+  void set playbackRate(num value) => _blink.BlinkPlayer.$playbackRate_Setter(this, value);
 
   @DomName('Player.source')
   @DocsEditable()
   @Experimental() // untriaged
-  TimedItem get source => _blink.Native_Player_source_Getter(this);
+  TimedItem get source => _blink.BlinkPlayer.$source_Getter(this);
 
   @DomName('Player.source')
   @DocsEditable()
   @Experimental() // untriaged
-  void set source(TimedItem value) => _blink.Native_Player_source_Setter(this, value);
+  void set source(TimedItem value) => _blink.BlinkPlayer.$source_Setter(this, value);
 
   @DomName('Player.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get startTime => _blink.Native_Player_startTime_Getter(this);
+  num get startTime => _blink.BlinkPlayer.$startTime_Getter(this);
 
   @DomName('Player.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  void set startTime(num value) => _blink.Native_Player_startTime_Setter(this, value);
+  void set startTime(num value) => _blink.BlinkPlayer.$startTime_Setter(this, value);
 
   @DomName('Player.timeLag')
   @DocsEditable()
   @Experimental() // untriaged
-  double get timeLag => _blink.Native_Player_timeLag_Getter(this);
+  double get timeLag => _blink.BlinkPlayer.$timeLag_Getter(this);
 
   @DomName('Player.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  void cancel() => _blink.Native_Player_cancel_Callback(this);
+  void cancel() => _blink.BlinkPlayer.$cancel_Callback(this);
 
   @DomName('Player.finish')
   @DocsEditable()
   @Experimental() // untriaged
-  void finish() => _blink.Native_Player_finish_Callback(this);
+  void finish() => _blink.BlinkPlayer.$finish_Callback(this);
 
   @DomName('Player.pause')
   @DocsEditable()
   @Experimental() // untriaged
-  void pause() => _blink.Native_Player_pause_Callback(this);
+  void pause() => _blink.BlinkPlayer.$pause_Callback(this);
 
   @DomName('Player.play')
   @DocsEditable()
   @Experimental() // untriaged
-  void play() => _blink.Native_Player_play_Callback(this);
+  void play() => _blink.BlinkPlayer.$play_Callback(this);
 
   @DomName('Player.reverse')
   @DocsEditable()
   @Experimental() // untriaged
-  void reverse() => _blink.Native_Player_reverse_Callback(this);
+  void reverse() => _blink.BlinkPlayer.$reverse_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22930,31 +22930,31 @@
 
   @DomName('Plugin.description')
   @DocsEditable()
-  String get description => _blink.Native_Plugin_description_Getter(this);
+  String get description => _blink.BlinkPlugin.$description_Getter(this);
 
   @DomName('Plugin.filename')
   @DocsEditable()
-  String get filename => _blink.Native_Plugin_filename_Getter(this);
+  String get filename => _blink.BlinkPlugin.$filename_Getter(this);
 
   @DomName('Plugin.length')
   @DocsEditable()
-  int get length => _blink.Native_Plugin_length_Getter(this);
+  int get length => _blink.BlinkPlugin.$length_Getter(this);
 
   @DomName('Plugin.name')
   @DocsEditable()
-  String get name => _blink.Native_Plugin_name_Getter(this);
+  String get name => _blink.BlinkPlugin.$name_Getter(this);
 
   @DomName('Plugin.__getter__')
   @DocsEditable()
-  MimeType __getter__(String name) => _blink.Native_Plugin___getter___Callback(this, name);
+  MimeType __getter__(String name) => _blink.BlinkPlugin.$__getter___Callback(this, name);
 
   @DomName('Plugin.item')
   @DocsEditable()
-  MimeType item(int index) => _blink.Native_Plugin_item_Callback(this, index);
+  MimeType item(int index) => _blink.BlinkPlugin.$item_Callback(this, index);
 
   @DomName('Plugin.namedItem')
   @DocsEditable()
-  MimeType namedItem(String name) => _blink.Native_Plugin_namedItem_Callback(this, name);
+  MimeType namedItem(String name) => _blink.BlinkPlugin.$namedItem_Callback(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22973,15 +22973,15 @@
 
   @DomName('PluginArray.length')
   @DocsEditable()
-  int get length => _blink.Native_PluginArray_length_Getter(this);
+  int get length => _blink.BlinkPluginArray.$length_Getter(this);
 
   Plugin operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_PluginArray_NativeIndexed_Getter(this, index);
+    return _blink.BlinkPluginArray.$NativeIndexed_Getter(this, index);
   }
 
-  Plugin _nativeIndexedGetter(int index) => _blink.Native_PluginArray_NativeIndexed_Getter(this, index);
+  Plugin _nativeIndexedGetter(int index) => _blink.BlinkPluginArray.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Plugin value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -23023,19 +23023,19 @@
 
   @DomName('PluginArray.__getter__')
   @DocsEditable()
-  Plugin __getter__(String name) => _blink.Native_PluginArray___getter___Callback(this, name);
+  Plugin __getter__(String name) => _blink.BlinkPluginArray.$__getter___Callback(this, name);
 
   @DomName('PluginArray.item')
   @DocsEditable()
-  Plugin item(int index) => _blink.Native_PluginArray_item_Callback(this, index);
+  Plugin item(int index) => _blink.BlinkPluginArray.$item_Callback(this, index);
 
   @DomName('PluginArray.namedItem')
   @DocsEditable()
-  Plugin namedItem(String name) => _blink.Native_PluginArray_namedItem_Callback(this, name);
+  Plugin namedItem(String name) => _blink.BlinkPluginArray.$namedItem_Callback(this, name);
 
   @DomName('PluginArray.refresh')
   @DocsEditable()
-  void refresh(bool reload) => _blink.Native_PluginArray_refresh_Callback(this, reload);
+  void refresh(bool reload) => _blink.BlinkPluginArray.$refresh_Callback(this, reload);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23057,7 +23057,7 @@
 
   @DomName('PopStateEvent.state')
   @DocsEditable()
-  Object get state => _blink.Native_PopStateEvent_state_Getter(this);
+  Object get state => _blink.BlinkPopStateEvent.$state_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23098,11 +23098,11 @@
 
   @DomName('PositionError.code')
   @DocsEditable()
-  int get code => _blink.Native_PositionError_code_Getter(this);
+  int get code => _blink.BlinkPositionError.$code_Getter(this);
 
   @DomName('PositionError.message')
   @DocsEditable()
-  String get message => _blink.Native_PositionError_message_Getter(this);
+  String get message => _blink.BlinkPositionError.$message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23156,11 +23156,11 @@
   @DomName('ProcessingInstruction.sheet')
   @DocsEditable()
   @Experimental() // non-standard
-  StyleSheet get sheet => _blink.Native_ProcessingInstruction_sheet_Getter(this);
+  StyleSheet get sheet => _blink.BlinkProcessingInstruction.$sheet_Getter(this);
 
   @DomName('ProcessingInstruction.target')
   @DocsEditable()
-  String get target => _blink.Native_ProcessingInstruction_target_Getter(this);
+  String get target => _blink.BlinkProcessingInstruction.$target_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23196,27 +23196,27 @@
   @DomName('HTMLProgressElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLProgressElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLProgressElement.$labels_Getter(this);
 
   @DomName('HTMLProgressElement.max')
   @DocsEditable()
-  num get max => _blink.Native_HTMLProgressElement_max_Getter(this);
+  num get max => _blink.BlinkHTMLProgressElement.$max_Getter(this);
 
   @DomName('HTMLProgressElement.max')
   @DocsEditable()
-  void set max(num value) => _blink.Native_HTMLProgressElement_max_Setter(this, value);
+  void set max(num value) => _blink.BlinkHTMLProgressElement.$max_Setter(this, value);
 
   @DomName('HTMLProgressElement.position')
   @DocsEditable()
-  double get position => _blink.Native_HTMLProgressElement_position_Getter(this);
+  double get position => _blink.BlinkHTMLProgressElement.$position_Getter(this);
 
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
-  num get value => _blink.Native_HTMLProgressElement_value_Getter(this);
+  num get value => _blink.BlinkHTMLProgressElement.$value_Getter(this);
 
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
-  void set value(num value) => _blink.Native_HTMLProgressElement_value_Setter(this, value);
+  void set value(num value) => _blink.BlinkHTMLProgressElement.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23234,15 +23234,15 @@
 
   @DomName('ProgressEvent.lengthComputable')
   @DocsEditable()
-  bool get lengthComputable => _blink.Native_ProgressEvent_lengthComputable_Getter(this);
+  bool get lengthComputable => _blink.BlinkProgressEvent.$lengthComputable_Getter(this);
 
   @DomName('ProgressEvent.loaded')
   @DocsEditable()
-  int get loaded => _blink.Native_ProgressEvent_loaded_Getter(this);
+  int get loaded => _blink.BlinkProgressEvent.$loaded_Getter(this);
 
   @DomName('ProgressEvent.total')
   @DocsEditable()
-  int get total => _blink.Native_ProgressEvent_total_Getter(this);
+  int get total => _blink.BlinkProgressEvent.$total_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23270,11 +23270,11 @@
 
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable()
-  String get cite => _blink.Native_HTMLQuoteElement_cite_Getter(this);
+  String get cite => _blink.BlinkHTMLQuoteElement.$cite_Getter(this);
 
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable()
-  void set cite(String value) => _blink.Native_HTMLQuoteElement_cite_Setter(this, value);
+  void set cite(String value) => _blink.BlinkHTMLQuoteElement.$cite_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23365,120 +23365,120 @@
 
   @DomName('Range.collapsed')
   @DocsEditable()
-  bool get collapsed => _blink.Native_Range_collapsed_Getter(this);
+  bool get collapsed => _blink.BlinkRange.$collapsed_Getter(this);
 
   @DomName('Range.commonAncestorContainer')
   @DocsEditable()
-  Node get commonAncestorContainer => _blink.Native_Range_commonAncestorContainer_Getter(this);
+  Node get commonAncestorContainer => _blink.BlinkRange.$commonAncestorContainer_Getter(this);
 
   @DomName('Range.endContainer')
   @DocsEditable()
-  Node get endContainer => _blink.Native_Range_endContainer_Getter(this);
+  Node get endContainer => _blink.BlinkRange.$endContainer_Getter(this);
 
   @DomName('Range.endOffset')
   @DocsEditable()
-  int get endOffset => _blink.Native_Range_endOffset_Getter(this);
+  int get endOffset => _blink.BlinkRange.$endOffset_Getter(this);
 
   @DomName('Range.startContainer')
   @DocsEditable()
-  Node get startContainer => _blink.Native_Range_startContainer_Getter(this);
+  Node get startContainer => _blink.BlinkRange.$startContainer_Getter(this);
 
   @DomName('Range.startOffset')
   @DocsEditable()
-  int get startOffset => _blink.Native_Range_startOffset_Getter(this);
+  int get startOffset => _blink.BlinkRange.$startOffset_Getter(this);
 
   @DomName('Range.cloneContents')
   @DocsEditable()
-  DocumentFragment cloneContents() => _blink.Native_Range_cloneContents_Callback(this);
+  DocumentFragment cloneContents() => _blink.BlinkRange.$cloneContents_Callback(this);
 
   @DomName('Range.cloneRange')
   @DocsEditable()
-  Range cloneRange() => _blink.Native_Range_cloneRange_Callback(this);
+  Range cloneRange() => _blink.BlinkRange.$cloneRange_Callback(this);
 
   @DomName('Range.collapse')
   @DocsEditable()
-  void collapse(bool toStart) => _blink.Native_Range_collapse_Callback(this, toStart);
+  void collapse(bool toStart) => _blink.BlinkRange.$collapse_Callback(this, toStart);
 
   @DomName('Range.comparePoint')
   @DocsEditable()
-  int comparePoint(Node refNode, int offset) => _blink.Native_Range_comparePoint_Callback(this, refNode, offset);
+  int comparePoint(Node refNode, int offset) => _blink.BlinkRange.$comparePoint_Callback(this, refNode, offset);
 
   @DomName('Range.createContextualFragment')
   @DocsEditable()
-  DocumentFragment createContextualFragment(String html) => _blink.Native_Range_createContextualFragment_Callback(this, html);
+  DocumentFragment createContextualFragment(String html) => _blink.BlinkRange.$createContextualFragment_Callback(this, html);
 
   @DomName('Range.deleteContents')
   @DocsEditable()
-  void deleteContents() => _blink.Native_Range_deleteContents_Callback(this);
+  void deleteContents() => _blink.BlinkRange.$deleteContents_Callback(this);
 
   @DomName('Range.detach')
   @DocsEditable()
-  void detach() => _blink.Native_Range_detach_Callback(this);
+  void detach() => _blink.BlinkRange.$detach_Callback(this);
 
   @DomName('Range.expand')
   @DocsEditable()
   @Experimental() // non-standard
-  void expand(String unit) => _blink.Native_Range_expand_Callback(this, unit);
+  void expand(String unit) => _blink.BlinkRange.$expand_Callback(this, unit);
 
   @DomName('Range.extractContents')
   @DocsEditable()
-  DocumentFragment extractContents() => _blink.Native_Range_extractContents_Callback(this);
+  DocumentFragment extractContents() => _blink.BlinkRange.$extractContents_Callback(this);
 
   @DomName('Range.getBoundingClientRect')
   @DocsEditable()
-  Rectangle getBoundingClientRect() => _blink.Native_Range_getBoundingClientRect_Callback(this);
+  Rectangle getBoundingClientRect() => _blink.BlinkRange.$getBoundingClientRect_Callback(this);
 
   @DomName('Range.getClientRects')
   @DocsEditable()
-  List<Rectangle> getClientRects() => _blink.Native_Range_getClientRects_Callback(this);
+  List<Rectangle> getClientRects() => _blink.BlinkRange.$getClientRects_Callback(this);
 
   @DomName('Range.insertNode')
   @DocsEditable()
-  void insertNode(Node newNode) => _blink.Native_Range_insertNode_Callback(this, newNode);
+  void insertNode(Node newNode) => _blink.BlinkRange.$insertNode_Callback(this, newNode);
 
   @DomName('Range.isPointInRange')
   @DocsEditable()
-  bool isPointInRange(Node refNode, int offset) => _blink.Native_Range_isPointInRange_Callback(this, refNode, offset);
+  bool isPointInRange(Node refNode, int offset) => _blink.BlinkRange.$isPointInRange_Callback(this, refNode, offset);
 
   @DomName('Range.selectNode')
   @DocsEditable()
-  void selectNode(Node refNode) => _blink.Native_Range_selectNode_Callback(this, refNode);
+  void selectNode(Node refNode) => _blink.BlinkRange.$selectNode_Callback(this, refNode);
 
   @DomName('Range.selectNodeContents')
   @DocsEditable()
-  void selectNodeContents(Node refNode) => _blink.Native_Range_selectNodeContents_Callback(this, refNode);
+  void selectNodeContents(Node refNode) => _blink.BlinkRange.$selectNodeContents_Callback(this, refNode);
 
   @DomName('Range.setEnd')
   @DocsEditable()
-  void setEnd(Node refNode, int offset) => _blink.Native_Range_setEnd_Callback(this, refNode, offset);
+  void setEnd(Node refNode, int offset) => _blink.BlinkRange.$setEnd_Callback(this, refNode, offset);
 
   @DomName('Range.setEndAfter')
   @DocsEditable()
-  void setEndAfter(Node refNode) => _blink.Native_Range_setEndAfter_Callback(this, refNode);
+  void setEndAfter(Node refNode) => _blink.BlinkRange.$setEndAfter_Callback(this, refNode);
 
   @DomName('Range.setEndBefore')
   @DocsEditable()
-  void setEndBefore(Node refNode) => _blink.Native_Range_setEndBefore_Callback(this, refNode);
+  void setEndBefore(Node refNode) => _blink.BlinkRange.$setEndBefore_Callback(this, refNode);
 
   @DomName('Range.setStart')
   @DocsEditable()
-  void setStart(Node refNode, int offset) => _blink.Native_Range_setStart_Callback(this, refNode, offset);
+  void setStart(Node refNode, int offset) => _blink.BlinkRange.$setStart_Callback(this, refNode, offset);
 
   @DomName('Range.setStartAfter')
   @DocsEditable()
-  void setStartAfter(Node refNode) => _blink.Native_Range_setStartAfter_Callback(this, refNode);
+  void setStartAfter(Node refNode) => _blink.BlinkRange.$setStartAfter_Callback(this, refNode);
 
   @DomName('Range.setStartBefore')
   @DocsEditable()
-  void setStartBefore(Node refNode) => _blink.Native_Range_setStartBefore_Callback(this, refNode);
+  void setStartBefore(Node refNode) => _blink.BlinkRange.$setStartBefore_Callback(this, refNode);
 
   @DomName('Range.surroundContents')
   @DocsEditable()
-  void surroundContents(Node newParent) => _blink.Native_Range_surroundContents_Callback(this, newParent);
+  void surroundContents(Node newParent) => _blink.BlinkRange.$surroundContents_Callback(this, newParent);
 
   @DomName('Range.toString')
   @DocsEditable()
-  String toString() => _blink.Native_Range_toString_Callback(this);
+  String toString() => _blink.BlinkRange.$toString_Callback(this);
 
 
   /**
@@ -23516,7 +23516,7 @@
 
   @DomName('ResourceProgressEvent.url')
   @DocsEditable()
-  String get url => _blink.Native_ResourceProgressEvent_url_Getter(this);
+  String get url => _blink.BlinkResourceProgressEvent.$url_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23576,79 +23576,79 @@
 
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
-  String get binaryType => _blink.Native_RTCDataChannel_binaryType_Getter(this);
+  String get binaryType => _blink.BlinkRTCDataChannel.$binaryType_Getter(this);
 
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
-  void set binaryType(String value) => _blink.Native_RTCDataChannel_binaryType_Setter(this, value);
+  void set binaryType(String value) => _blink.BlinkRTCDataChannel.$binaryType_Setter(this, value);
 
   @DomName('RTCDataChannel.bufferedAmount')
   @DocsEditable()
-  int get bufferedAmount => _blink.Native_RTCDataChannel_bufferedAmount_Getter(this);
+  int get bufferedAmount => _blink.BlinkRTCDataChannel.$bufferedAmount_Getter(this);
 
   @DomName('RTCDataChannel.id')
   @DocsEditable()
   @Experimental() // untriaged
-  int get id => _blink.Native_RTCDataChannel_id_Getter(this);
+  int get id => _blink.BlinkRTCDataChannel.$id_Getter(this);
 
   @DomName('RTCDataChannel.label')
   @DocsEditable()
-  String get label => _blink.Native_RTCDataChannel_label_Getter(this);
+  String get label => _blink.BlinkRTCDataChannel.$label_Getter(this);
 
   @DomName('RTCDataChannel.maxRetransmitTime')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxRetransmitTime => _blink.Native_RTCDataChannel_maxRetransmitTime_Getter(this);
+  int get maxRetransmitTime => _blink.BlinkRTCDataChannel.$maxRetransmitTime_Getter(this);
 
   @DomName('RTCDataChannel.maxRetransmits')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxRetransmits => _blink.Native_RTCDataChannel_maxRetransmits_Getter(this);
+  int get maxRetransmits => _blink.BlinkRTCDataChannel.$maxRetransmits_Getter(this);
 
   @DomName('RTCDataChannel.negotiated')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get negotiated => _blink.Native_RTCDataChannel_negotiated_Getter(this);
+  bool get negotiated => _blink.BlinkRTCDataChannel.$negotiated_Getter(this);
 
   @DomName('RTCDataChannel.ordered')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get ordered => _blink.Native_RTCDataChannel_ordered_Getter(this);
+  bool get ordered => _blink.BlinkRTCDataChannel.$ordered_Getter(this);
 
   @DomName('RTCDataChannel.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.Native_RTCDataChannel_protocol_Getter(this);
+  String get protocol => _blink.BlinkRTCDataChannel.$protocol_Getter(this);
 
   @DomName('RTCDataChannel.readyState')
   @DocsEditable()
-  String get readyState => _blink.Native_RTCDataChannel_readyState_Getter(this);
+  String get readyState => _blink.BlinkRTCDataChannel.$readyState_Getter(this);
 
   @DomName('RTCDataChannel.reliable')
   @DocsEditable()
-  bool get reliable => _blink.Native_RTCDataChannel_reliable_Getter(this);
+  bool get reliable => _blink.BlinkRTCDataChannel.$reliable_Getter(this);
 
   @DomName('RTCDataChannel.close')
   @DocsEditable()
-  void close() => _blink.Native_RTCDataChannel_close_Callback(this);
+  void close() => _blink.BlinkRTCDataChannel.$close_Callback(this);
 
-  void send(data) => _blink.Native_RTCDataChannel_send(this, data);
+  void send(data) => _blink.BlinkRTCDataChannel.$send(this, data);
 
   @DomName('RTCDataChannel.sendBlob')
   @DocsEditable()
-  void sendBlob(Blob data) => _blink.Native_RTCDataChannel_sendBlob_Callback(this, data);
+  void sendBlob(Blob data) => _blink.BlinkRTCDataChannel.$sendBlob_Callback(this, data);
 
   @DomName('RTCDataChannel.sendByteBuffer')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) => _blink.Native_RTCDataChannel_sendByteBuffer_Callback(this, data);
+  void sendByteBuffer(ByteBuffer data) => _blink.BlinkRTCDataChannel.$sendByteBuffer_Callback(this, data);
 
   @DomName('RTCDataChannel.sendString')
   @DocsEditable()
-  void sendString(String data) => _blink.Native_RTCDataChannel_sendString_Callback(this, data);
+  void sendString(String data) => _blink.BlinkRTCDataChannel.$sendString_Callback(this, data);
 
   @DomName('RTCDataChannel.sendTypedData')
   @DocsEditable()
-  void sendTypedData(TypedData data) => _blink.Native_RTCDataChannel_sendTypedData_Callback(this, data);
+  void sendTypedData(TypedData data) => _blink.BlinkRTCDataChannel.$sendTypedData_Callback(this, data);
 
   /// Stream of `close` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onclose')
@@ -23688,7 +23688,7 @@
 
   @DomName('RTCDataChannelEvent.channel')
   @DocsEditable()
-  RtcDataChannel get channel => _blink.Native_RTCDataChannelEvent_channel_Getter(this);
+  RtcDataChannel get channel => _blink.BlinkRTCDataChannelEvent.$channel_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23718,25 +23718,25 @@
 
   @DomName('RTCDTMFSender.canInsertDTMF')
   @DocsEditable()
-  bool get canInsertDtmf => _blink.Native_RTCDTMFSender_canInsertDTMF_Getter(this);
+  bool get canInsertDtmf => _blink.BlinkRTCDTMFSender.$canInsertDTMF_Getter(this);
 
   @DomName('RTCDTMFSender.duration')
   @DocsEditable()
-  int get duration => _blink.Native_RTCDTMFSender_duration_Getter(this);
+  int get duration => _blink.BlinkRTCDTMFSender.$duration_Getter(this);
 
   @DomName('RTCDTMFSender.interToneGap')
   @DocsEditable()
-  int get interToneGap => _blink.Native_RTCDTMFSender_interToneGap_Getter(this);
+  int get interToneGap => _blink.BlinkRTCDTMFSender.$interToneGap_Getter(this);
 
   @DomName('RTCDTMFSender.toneBuffer')
   @DocsEditable()
-  String get toneBuffer => _blink.Native_RTCDTMFSender_toneBuffer_Getter(this);
+  String get toneBuffer => _blink.BlinkRTCDTMFSender.$toneBuffer_Getter(this);
 
   @DomName('RTCDTMFSender.track')
   @DocsEditable()
-  MediaStreamTrack get track => _blink.Native_RTCDTMFSender_track_Getter(this);
+  MediaStreamTrack get track => _blink.BlinkRTCDTMFSender.$track_Getter(this);
 
-  void insertDtmf(String tones, [int duration, int interToneGap]) => _blink.Native_RTCDTMFSender_insertDtmf(this, tones, duration, interToneGap);
+  void insertDtmf(String tones, [int duration, int interToneGap]) => _blink.BlinkRTCDTMFSender.$insertDtmf(this, tones, duration, interToneGap);
 
   /// Stream of `tonechange` events handled by this [RtcDtmfSender].
   @DomName('RTCDTMFSender.ontonechange')
@@ -23761,7 +23761,7 @@
 
   @DomName('RTCDTMFToneChangeEvent.tone')
   @DocsEditable()
-  String get tone => _blink.Native_RTCDTMFToneChangeEvent_tone_Getter(this);
+  String get tone => _blink.BlinkRTCDTMFToneChangeEvent.$tone_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23782,19 +23782,19 @@
 
   @DomName('RTCIceCandidate.RTCIceCandidate')
   @DocsEditable()
-  factory RtcIceCandidate(Map dictionary) => _blink.Native_RTCIceCandidate_RtcIceCandidate(dictionary);
+  factory RtcIceCandidate(Map dictionary) => _blink.BlinkRTCIceCandidate.$mkRtcIceCandidate(dictionary);
 
   @DomName('RTCIceCandidate.candidate')
   @DocsEditable()
-  String get candidate => _blink.Native_RTCIceCandidate_candidate_Getter(this);
+  String get candidate => _blink.BlinkRTCIceCandidate.$candidate_Getter(this);
 
   @DomName('RTCIceCandidate.sdpMLineIndex')
   @DocsEditable()
-  int get sdpMLineIndex => _blink.Native_RTCIceCandidate_sdpMLineIndex_Getter(this);
+  int get sdpMLineIndex => _blink.BlinkRTCIceCandidate.$sdpMLineIndex_Getter(this);
 
   @DomName('RTCIceCandidate.sdpMid')
   @DocsEditable()
-  String get sdpMid => _blink.Native_RTCIceCandidate_sdpMid_Getter(this);
+  String get sdpMid => _blink.BlinkRTCIceCandidate.$sdpMid_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23814,7 +23814,7 @@
 
   @DomName('RTCIceCandidateEvent.candidate')
   @DocsEditable()
-  RtcIceCandidate get candidate => _blink.Native_RTCIceCandidateEvent_candidate_Getter(this);
+  RtcIceCandidate get candidate => _blink.BlinkRTCIceCandidateEvent.$candidate_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -23930,79 +23930,79 @@
 
   @DomName('RTCPeerConnection.RTCPeerConnection')
   @DocsEditable()
-  factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) => _blink.Native_RTCPeerConnection_RtcPeerConnection(rtcIceServers, mediaConstraints);
+  factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) => _blink.BlinkRTCPeerConnection.$mkRtcPeerConnection(rtcIceServers, mediaConstraints);
 
   @DomName('RTCPeerConnection.iceConnectionState')
   @DocsEditable()
-  String get iceConnectionState => _blink.Native_RTCPeerConnection_iceConnectionState_Getter(this);
+  String get iceConnectionState => _blink.BlinkRTCPeerConnection.$iceConnectionState_Getter(this);
 
   @DomName('RTCPeerConnection.iceGatheringState')
   @DocsEditable()
-  String get iceGatheringState => _blink.Native_RTCPeerConnection_iceGatheringState_Getter(this);
+  String get iceGatheringState => _blink.BlinkRTCPeerConnection.$iceGatheringState_Getter(this);
 
   @DomName('RTCPeerConnection.localDescription')
   @DocsEditable()
-  RtcSessionDescription get localDescription => _blink.Native_RTCPeerConnection_localDescription_Getter(this);
+  RtcSessionDescription get localDescription => _blink.BlinkRTCPeerConnection.$localDescription_Getter(this);
 
   @DomName('RTCPeerConnection.remoteDescription')
   @DocsEditable()
-  RtcSessionDescription get remoteDescription => _blink.Native_RTCPeerConnection_remoteDescription_Getter(this);
+  RtcSessionDescription get remoteDescription => _blink.BlinkRTCPeerConnection.$remoteDescription_Getter(this);
 
   @DomName('RTCPeerConnection.signalingState')
   @DocsEditable()
-  String get signalingState => _blink.Native_RTCPeerConnection_signalingState_Getter(this);
+  String get signalingState => _blink.BlinkRTCPeerConnection.$signalingState_Getter(this);
 
   @DomName('RTCPeerConnection.addIceCandidate')
   @DocsEditable()
-  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) => _blink.Native_RTCPeerConnection_addIceCandidate_Callback(this, candidate, successCallback, failureCallback);
+  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) => _blink.BlinkRTCPeerConnection.$addIceCandidate_Callback(this, candidate, successCallback, failureCallback);
 
   @DomName('RTCPeerConnection.addStream')
   @DocsEditable()
-  void addStream(MediaStream stream, [Map mediaConstraints]) => _blink.Native_RTCPeerConnection_addStream_Callback(this, stream, mediaConstraints);
+  void addStream(MediaStream stream, [Map mediaConstraints]) => _blink.BlinkRTCPeerConnection.$addStream_Callback(this, stream, mediaConstraints);
 
   @DomName('RTCPeerConnection.close')
   @DocsEditable()
-  void close() => _blink.Native_RTCPeerConnection_close_Callback(this);
+  void close() => _blink.BlinkRTCPeerConnection.$close_Callback(this);
 
   @DomName('RTCPeerConnection.createAnswer')
   @DocsEditable()
-  void _createAnswer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) => _blink.Native_RTCPeerConnection_createAnswer_Callback(this, successCallback, failureCallback, mediaConstraints);
+  void _createAnswer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) => _blink.BlinkRTCPeerConnection.$createAnswer_Callback(this, successCallback, failureCallback, mediaConstraints);
 
   @DomName('RTCPeerConnection.createDTMFSender')
   @DocsEditable()
-  RtcDtmfSender createDtmfSender(MediaStreamTrack track) => _blink.Native_RTCPeerConnection_createDTMFSender_Callback(this, track);
+  RtcDtmfSender createDtmfSender(MediaStreamTrack track) => _blink.BlinkRTCPeerConnection.$createDTMFSender_Callback(this, track);
 
   @DomName('RTCPeerConnection.createDataChannel')
   @DocsEditable()
-  RtcDataChannel createDataChannel(String label, [Map options]) => _blink.Native_RTCPeerConnection_createDataChannel_Callback(this, label, options);
+  RtcDataChannel createDataChannel(String label, [Map options]) => _blink.BlinkRTCPeerConnection.$createDataChannel_Callback(this, label, options);
 
   @DomName('RTCPeerConnection.createOffer')
   @DocsEditable()
-  void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) => _blink.Native_RTCPeerConnection_createOffer_Callback(this, successCallback, failureCallback, mediaConstraints);
+  void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) => _blink.BlinkRTCPeerConnection.$createOffer_Callback(this, successCallback, failureCallback, mediaConstraints);
 
   @DomName('RTCPeerConnection.getLocalStreams')
   @DocsEditable()
-  List<MediaStream> getLocalStreams() => _blink.Native_RTCPeerConnection_getLocalStreams_Callback(this);
+  List<MediaStream> getLocalStreams() => _blink.BlinkRTCPeerConnection.$getLocalStreams_Callback(this);
 
   @DomName('RTCPeerConnection.getRemoteStreams')
   @DocsEditable()
-  List<MediaStream> getRemoteStreams() => _blink.Native_RTCPeerConnection_getRemoteStreams_Callback(this);
+  List<MediaStream> getRemoteStreams() => _blink.BlinkRTCPeerConnection.$getRemoteStreams_Callback(this);
 
   @DomName('RTCPeerConnection.getStats')
   @DocsEditable()
-  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) => _blink.Native_RTCPeerConnection_getStats_Callback(this, successCallback, selector);
+  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) => _blink.BlinkRTCPeerConnection.$getStats_Callback(this, successCallback, selector);
 
   @DomName('RTCPeerConnection.getStreamById')
   @DocsEditable()
-  MediaStream getStreamById(String streamId) => _blink.Native_RTCPeerConnection_getStreamById_Callback(this, streamId);
+  MediaStream getStreamById(String streamId) => _blink.BlinkRTCPeerConnection.$getStreamById_Callback(this, streamId);
 
   @DomName('RTCPeerConnection.removeStream')
   @DocsEditable()
-  void removeStream(MediaStream stream) => _blink.Native_RTCPeerConnection_removeStream_Callback(this, stream);
+  void removeStream(MediaStream stream) => _blink.BlinkRTCPeerConnection.$removeStream_Callback(this, stream);
 
   @DomName('RTCPeerConnection.setLocalDescription')
   @DocsEditable()
-  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.Native_RTCPeerConnection_setLocalDescription_Callback(this, description, successCallback, failureCallback);
+  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.$setLocalDescription_Callback(this, description, successCallback, failureCallback);
 
   Future setLocalDescription(RtcSessionDescription description) {
     var completer = new Completer();
@@ -24014,7 +24014,7 @@
 
   @DomName('RTCPeerConnection.setRemoteDescription')
   @DocsEditable()
-  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.Native_RTCPeerConnection_setRemoteDescription_Callback(this, description, successCallback, failureCallback);
+  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.$setRemoteDescription_Callback(this, description, successCallback, failureCallback);
 
   Future setRemoteDescription(RtcSessionDescription description) {
     var completer = new Completer();
@@ -24026,7 +24026,7 @@
 
   @DomName('RTCPeerConnection.updateIce')
   @DocsEditable()
-  void updateIce([Map configuration, Map mediaConstraints]) => _blink.Native_RTCPeerConnection_updateIce_Callback(this, configuration, mediaConstraints);
+  void updateIce([Map configuration, Map mediaConstraints]) => _blink.BlinkRTCPeerConnection.$updateIce_Callback(this, configuration, mediaConstraints);
 
   /// Stream of `addstream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onaddstream')
@@ -24082,23 +24082,23 @@
 
   @DomName('RTCSessionDescription.RTCSessionDescription')
   @DocsEditable()
-  factory RtcSessionDescription([Map descriptionInitDict]) => _blink.Native_RTCSessionDescription_RtcSessionDescription(descriptionInitDict);
+  factory RtcSessionDescription([Map descriptionInitDict]) => _blink.BlinkRTCSessionDescription.$mkRtcSessionDescription(descriptionInitDict);
 
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
-  String get sdp => _blink.Native_RTCSessionDescription_sdp_Getter(this);
+  String get sdp => _blink.BlinkRTCSessionDescription.$sdp_Getter(this);
 
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
-  void set sdp(String value) => _blink.Native_RTCSessionDescription_sdp_Setter(this, value);
+  void set sdp(String value) => _blink.BlinkRTCSessionDescription.$sdp_Setter(this, value);
 
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
-  String get type => _blink.Native_RTCSessionDescription_type_Getter(this);
+  String get type => _blink.BlinkRTCSessionDescription.$type_Getter(this);
 
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_RTCSessionDescription_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkRTCSessionDescription.$type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24118,31 +24118,31 @@
 
   @DomName('RTCStatsReport.id')
   @DocsEditable()
-  String get id => _blink.Native_RTCStatsReport_id_Getter(this);
+  String get id => _blink.BlinkRTCStatsReport.$id_Getter(this);
 
   @DomName('RTCStatsReport.local')
   @DocsEditable()
-  RtcStatsReport get local => _blink.Native_RTCStatsReport_local_Getter(this);
+  RtcStatsReport get local => _blink.BlinkRTCStatsReport.$local_Getter(this);
 
   @DomName('RTCStatsReport.remote')
   @DocsEditable()
-  RtcStatsReport get remote => _blink.Native_RTCStatsReport_remote_Getter(this);
+  RtcStatsReport get remote => _blink.BlinkRTCStatsReport.$remote_Getter(this);
 
   @DomName('RTCStatsReport.timestamp')
   @DocsEditable()
-  DateTime get timestamp => _blink.Native_RTCStatsReport_timestamp_Getter(this);
+  DateTime get timestamp => _blink.BlinkRTCStatsReport.$timestamp_Getter(this);
 
   @DomName('RTCStatsReport.type')
   @DocsEditable()
-  String get type => _blink.Native_RTCStatsReport_type_Getter(this);
+  String get type => _blink.BlinkRTCStatsReport.$type_Getter(this);
 
   @DomName('RTCStatsReport.names')
   @DocsEditable()
-  List<String> names() => _blink.Native_RTCStatsReport_names_Callback(this);
+  List<String> names() => _blink.BlinkRTCStatsReport.$names_Callback(this);
 
   @DomName('RTCStatsReport.stat')
   @DocsEditable()
-  String stat(String name) => _blink.Native_RTCStatsReport_stat_Callback(this, name);
+  String stat(String name) => _blink.BlinkRTCStatsReport.$stat_Callback(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24162,15 +24162,15 @@
 
   @DomName('RTCStatsResponse.__getter__')
   @DocsEditable()
-  RtcStatsReport __getter__(String name) => _blink.Native_RTCStatsResponse___getter___Callback(this, name);
+  RtcStatsReport __getter__(String name) => _blink.BlinkRTCStatsResponse.$__getter___Callback(this, name);
 
   @DomName('RTCStatsResponse.namedItem')
   @DocsEditable()
-  RtcStatsReport namedItem(String name) => _blink.Native_RTCStatsResponse_namedItem_Callback(this, name);
+  RtcStatsReport namedItem(String name) => _blink.BlinkRTCStatsResponse.$namedItem_Callback(this, name);
 
   @DomName('RTCStatsResponse.result')
   @DocsEditable()
-  List<RtcStatsReport> result() => _blink.Native_RTCStatsResponse_result_Callback(this);
+  List<RtcStatsReport> result() => _blink.BlinkRTCStatsResponse.$result_Callback(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -24193,52 +24193,52 @@
 
   @DomName('Screen.availHeight')
   @DocsEditable()
-  int get _availHeight => _blink.Native_Screen_availHeight_Getter(this);
+  int get _availHeight => _blink.BlinkScreen.$availHeight_Getter(this);
 
   @DomName('Screen.availLeft')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get _availLeft => _blink.Native_Screen_availLeft_Getter(this);
+  int get _availLeft => _blink.BlinkScreen.$availLeft_Getter(this);
 
   @DomName('Screen.availTop')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get _availTop => _blink.Native_Screen_availTop_Getter(this);
+  int get _availTop => _blink.BlinkScreen.$availTop_Getter(this);
 
   @DomName('Screen.availWidth')
   @DocsEditable()
-  int get _availWidth => _blink.Native_Screen_availWidth_Getter(this);
+  int get _availWidth => _blink.BlinkScreen.$availWidth_Getter(this);
 
   @DomName('Screen.colorDepth')
   @DocsEditable()
-  int get colorDepth => _blink.Native_Screen_colorDepth_Getter(this);
+  int get colorDepth => _blink.BlinkScreen.$colorDepth_Getter(this);
 
   @DomName('Screen.height')
   @DocsEditable()
-  int get height => _blink.Native_Screen_height_Getter(this);
+  int get height => _blink.BlinkScreen.$height_Getter(this);
 
   @DomName('Screen.orientation')
   @DocsEditable()
   @Experimental() // untriaged
-  String get orientation => _blink.Native_Screen_orientation_Getter(this);
+  String get orientation => _blink.BlinkScreen.$orientation_Getter(this);
 
   @DomName('Screen.pixelDepth')
   @DocsEditable()
-  int get pixelDepth => _blink.Native_Screen_pixelDepth_Getter(this);
+  int get pixelDepth => _blink.BlinkScreen.$pixelDepth_Getter(this);
 
   @DomName('Screen.width')
   @DocsEditable()
-  int get width => _blink.Native_Screen_width_Getter(this);
+  int get width => _blink.BlinkScreen.$width_Getter(this);
 
   @DomName('Screen.lockOrientation')
   @DocsEditable()
   @Experimental() // untriaged
-  bool lockOrientation(String orientation) => _blink.Native_Screen_lockOrientation_Callback(this, orientation);
+  bool lockOrientation(String orientation) => _blink.BlinkScreen.$lockOrientation_Callback(this, orientation);
 
   @DomName('Screen.unlockOrientation')
   @DocsEditable()
   @Experimental() // untriaged
-  void unlockOrientation() => _blink.Native_Screen_unlockOrientation_Callback(this);
+  void unlockOrientation() => _blink.BlinkScreen.$unlockOrientation_Callback(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -24265,67 +24265,67 @@
 
   @DomName('HTMLScriptElement.async')
   @DocsEditable()
-  bool get async => _blink.Native_HTMLScriptElement_async_Getter(this);
+  bool get async => _blink.BlinkHTMLScriptElement.$async_Getter(this);
 
   @DomName('HTMLScriptElement.async')
   @DocsEditable()
-  void set async(bool value) => _blink.Native_HTMLScriptElement_async_Setter(this, value);
+  void set async(bool value) => _blink.BlinkHTMLScriptElement.$async_Setter(this, value);
 
   @DomName('HTMLScriptElement.charset')
   @DocsEditable()
-  String get charset => _blink.Native_HTMLScriptElement_charset_Getter(this);
+  String get charset => _blink.BlinkHTMLScriptElement.$charset_Getter(this);
 
   @DomName('HTMLScriptElement.charset')
   @DocsEditable()
-  void set charset(String value) => _blink.Native_HTMLScriptElement_charset_Setter(this, value);
+  void set charset(String value) => _blink.BlinkHTMLScriptElement.$charset_Setter(this, value);
 
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
   @Experimental()
-  String get crossOrigin => _blink.Native_HTMLScriptElement_crossOrigin_Getter(this);
+  String get crossOrigin => _blink.BlinkHTMLScriptElement.$crossOrigin_Getter(this);
 
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
   @Experimental()
-  void set crossOrigin(String value) => _blink.Native_HTMLScriptElement_crossOrigin_Setter(this, value);
+  void set crossOrigin(String value) => _blink.BlinkHTMLScriptElement.$crossOrigin_Setter(this, value);
 
   @DomName('HTMLScriptElement.defer')
   @DocsEditable()
-  bool get defer => _blink.Native_HTMLScriptElement_defer_Getter(this);
+  bool get defer => _blink.BlinkHTMLScriptElement.$defer_Getter(this);
 
   @DomName('HTMLScriptElement.defer')
   @DocsEditable()
-  void set defer(bool value) => _blink.Native_HTMLScriptElement_defer_Setter(this, value);
+  void set defer(bool value) => _blink.BlinkHTMLScriptElement.$defer_Setter(this, value);
 
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
   @Experimental()
-  String get nonce => _blink.Native_HTMLScriptElement_nonce_Getter(this);
+  String get nonce => _blink.BlinkHTMLScriptElement.$nonce_Getter(this);
 
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
   @Experimental()
-  void set nonce(String value) => _blink.Native_HTMLScriptElement_nonce_Setter(this, value);
+  void set nonce(String value) => _blink.BlinkHTMLScriptElement.$nonce_Setter(this, value);
 
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLScriptElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLScriptElement.$src_Getter(this);
 
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLScriptElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLScriptElement.$src_Setter(this, value);
 
   @DomName('HTMLScriptElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLScriptElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLScriptElement.$type_Getter(this);
 
   @DomName('HTMLScriptElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLScriptElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLScriptElement.$type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24345,44 +24345,44 @@
 
   @DomName('SecurityPolicyViolationEvent.blockedURI')
   @DocsEditable()
-  String get blockedUri => _blink.Native_SecurityPolicyViolationEvent_blockedURI_Getter(this);
+  String get blockedUri => _blink.BlinkSecurityPolicyViolationEvent.$blockedURI_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.columnNumber')
   @DocsEditable()
-  int get columnNumber => _blink.Native_SecurityPolicyViolationEvent_columnNumber_Getter(this);
+  int get columnNumber => _blink.BlinkSecurityPolicyViolationEvent.$columnNumber_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.documentURI')
   @DocsEditable()
-  String get documentUri => _blink.Native_SecurityPolicyViolationEvent_documentURI_Getter(this);
+  String get documentUri => _blink.BlinkSecurityPolicyViolationEvent.$documentURI_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.effectiveDirective')
   @DocsEditable()
-  String get effectiveDirective => _blink.Native_SecurityPolicyViolationEvent_effectiveDirective_Getter(this);
+  String get effectiveDirective => _blink.BlinkSecurityPolicyViolationEvent.$effectiveDirective_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.lineNumber')
   @DocsEditable()
-  int get lineNumber => _blink.Native_SecurityPolicyViolationEvent_lineNumber_Getter(this);
+  int get lineNumber => _blink.BlinkSecurityPolicyViolationEvent.$lineNumber_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.originalPolicy')
   @DocsEditable()
-  String get originalPolicy => _blink.Native_SecurityPolicyViolationEvent_originalPolicy_Getter(this);
+  String get originalPolicy => _blink.BlinkSecurityPolicyViolationEvent.$originalPolicy_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.referrer')
   @DocsEditable()
-  String get referrer => _blink.Native_SecurityPolicyViolationEvent_referrer_Getter(this);
+  String get referrer => _blink.BlinkSecurityPolicyViolationEvent.$referrer_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.sourceFile')
   @DocsEditable()
-  String get sourceFile => _blink.Native_SecurityPolicyViolationEvent_sourceFile_Getter(this);
+  String get sourceFile => _blink.BlinkSecurityPolicyViolationEvent.$sourceFile_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.statusCode')
   @DocsEditable()
   @Experimental() // untriaged
-  int get statusCode => _blink.Native_SecurityPolicyViolationEvent_statusCode_Getter(this);
+  int get statusCode => _blink.BlinkSecurityPolicyViolationEvent.$statusCode_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.violatedDirective')
   @DocsEditable()
-  String get violatedDirective => _blink.Native_SecurityPolicyViolationEvent_violatedDirective_Getter(this);
+  String get violatedDirective => _blink.BlinkSecurityPolicyViolationEvent.$violatedDirective_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24407,120 +24407,120 @@
 
   @DomName('HTMLSelectElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.Native_HTMLSelectElement_autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLSelectElement.$autofocus_Getter(this);
 
   @DomName('HTMLSelectElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.Native_HTMLSelectElement_autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLSelectElement.$autofocus_Setter(this, value);
 
   @DomName('HTMLSelectElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLSelectElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLSelectElement.$disabled_Getter(this);
 
   @DomName('HTMLSelectElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLSelectElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLSelectElement.$disabled_Setter(this, value);
 
   @DomName('HTMLSelectElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLSelectElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLSelectElement.$form_Getter(this);
 
   @DomName('HTMLSelectElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLSelectElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLSelectElement.$labels_Getter(this);
 
   @DomName('HTMLSelectElement.length')
   @DocsEditable()
-  int get length => _blink.Native_HTMLSelectElement_length_Getter(this);
+  int get length => _blink.BlinkHTMLSelectElement.$length_Getter(this);
 
   @DomName('HTMLSelectElement.length')
   @DocsEditable()
-  void set length(int value) => _blink.Native_HTMLSelectElement_length_Setter(this, value);
+  void set length(int value) => _blink.BlinkHTMLSelectElement.$length_Setter(this, value);
 
   @DomName('HTMLSelectElement.multiple')
   @DocsEditable()
-  bool get multiple => _blink.Native_HTMLSelectElement_multiple_Getter(this);
+  bool get multiple => _blink.BlinkHTMLSelectElement.$multiple_Getter(this);
 
   @DomName('HTMLSelectElement.multiple')
   @DocsEditable()
-  void set multiple(bool value) => _blink.Native_HTMLSelectElement_multiple_Setter(this, value);
+  void set multiple(bool value) => _blink.BlinkHTMLSelectElement.$multiple_Setter(this, value);
 
   @DomName('HTMLSelectElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLSelectElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLSelectElement.$name_Getter(this);
 
   @DomName('HTMLSelectElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLSelectElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLSelectElement.$name_Setter(this, value);
 
   @DomName('HTMLSelectElement.required')
   @DocsEditable()
-  bool get required => _blink.Native_HTMLSelectElement_required_Getter(this);
+  bool get required => _blink.BlinkHTMLSelectElement.$required_Getter(this);
 
   @DomName('HTMLSelectElement.required')
   @DocsEditable()
-  void set required(bool value) => _blink.Native_HTMLSelectElement_required_Setter(this, value);
+  void set required(bool value) => _blink.BlinkHTMLSelectElement.$required_Setter(this, value);
 
   @DomName('HTMLSelectElement.selectedIndex')
   @DocsEditable()
-  int get selectedIndex => _blink.Native_HTMLSelectElement_selectedIndex_Getter(this);
+  int get selectedIndex => _blink.BlinkHTMLSelectElement.$selectedIndex_Getter(this);
 
   @DomName('HTMLSelectElement.selectedIndex')
   @DocsEditable()
-  void set selectedIndex(int value) => _blink.Native_HTMLSelectElement_selectedIndex_Setter(this, value);
+  void set selectedIndex(int value) => _blink.BlinkHTMLSelectElement.$selectedIndex_Setter(this, value);
 
   @DomName('HTMLSelectElement.size')
   @DocsEditable()
-  int get size => _blink.Native_HTMLSelectElement_size_Getter(this);
+  int get size => _blink.BlinkHTMLSelectElement.$size_Getter(this);
 
   @DomName('HTMLSelectElement.size')
   @DocsEditable()
-  void set size(int value) => _blink.Native_HTMLSelectElement_size_Setter(this, value);
+  void set size(int value) => _blink.BlinkHTMLSelectElement.$size_Setter(this, value);
 
   @DomName('HTMLSelectElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLSelectElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLSelectElement.$type_Getter(this);
 
   @DomName('HTMLSelectElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLSelectElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLSelectElement.$validationMessage_Getter(this);
 
   @DomName('HTMLSelectElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLSelectElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLSelectElement.$validity_Getter(this);
 
   @DomName('HTMLSelectElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLSelectElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLSelectElement.$value_Getter(this);
 
   @DomName('HTMLSelectElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLSelectElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLSelectElement.$value_Setter(this, value);
 
   @DomName('HTMLSelectElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLSelectElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLSelectElement.$willValidate_Getter(this);
 
   @DomName('HTMLSelectElement.__setter__')
   @DocsEditable()
-  void __setter__(int index, OptionElement value) => _blink.Native_HTMLSelectElement___setter___Callback(this, index, value);
+  void __setter__(int index, OptionElement value) => _blink.BlinkHTMLSelectElement.$__setter___Callback(this, index, value);
 
   @DomName('HTMLSelectElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLSelectElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLSelectElement.$checkValidity_Callback(this);
 
   @DomName('HTMLSelectElement.item')
   @DocsEditable()
-  Element item(int index) => _blink.Native_HTMLSelectElement_item_Callback(this, index);
+  Element item(int index) => _blink.BlinkHTMLSelectElement.$item_Callback(this, index);
 
   @DomName('HTMLSelectElement.namedItem')
   @DocsEditable()
-  Element namedItem(String name) => _blink.Native_HTMLSelectElement_namedItem_Callback(this, name);
+  Element namedItem(String name) => _blink.BlinkHTMLSelectElement.$namedItem_Callback(this, name);
 
   @DomName('HTMLSelectElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLSelectElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLSelectElement.$setCustomValidity_Callback(this, error);
 
 
   // Override default options, since IE returns SelectElement itself and it
@@ -24556,117 +24556,117 @@
 
   @DomName('Selection.anchorNode')
   @DocsEditable()
-  Node get anchorNode => _blink.Native_Selection_anchorNode_Getter(this);
+  Node get anchorNode => _blink.BlinkSelection.$anchorNode_Getter(this);
 
   @DomName('Selection.anchorOffset')
   @DocsEditable()
-  int get anchorOffset => _blink.Native_Selection_anchorOffset_Getter(this);
+  int get anchorOffset => _blink.BlinkSelection.$anchorOffset_Getter(this);
 
   @DomName('Selection.baseNode')
   @DocsEditable()
   @Experimental() // non-standard
-  Node get baseNode => _blink.Native_Selection_baseNode_Getter(this);
+  Node get baseNode => _blink.BlinkSelection.$baseNode_Getter(this);
 
   @DomName('Selection.baseOffset')
   @DocsEditable()
   @Experimental() // non-standard
-  int get baseOffset => _blink.Native_Selection_baseOffset_Getter(this);
+  int get baseOffset => _blink.BlinkSelection.$baseOffset_Getter(this);
 
   @DomName('Selection.extentNode')
   @DocsEditable()
   @Experimental() // non-standard
-  Node get extentNode => _blink.Native_Selection_extentNode_Getter(this);
+  Node get extentNode => _blink.BlinkSelection.$extentNode_Getter(this);
 
   @DomName('Selection.extentOffset')
   @DocsEditable()
   @Experimental() // non-standard
-  int get extentOffset => _blink.Native_Selection_extentOffset_Getter(this);
+  int get extentOffset => _blink.BlinkSelection.$extentOffset_Getter(this);
 
   @DomName('Selection.focusNode')
   @DocsEditable()
-  Node get focusNode => _blink.Native_Selection_focusNode_Getter(this);
+  Node get focusNode => _blink.BlinkSelection.$focusNode_Getter(this);
 
   @DomName('Selection.focusOffset')
   @DocsEditable()
-  int get focusOffset => _blink.Native_Selection_focusOffset_Getter(this);
+  int get focusOffset => _blink.BlinkSelection.$focusOffset_Getter(this);
 
   @DomName('Selection.isCollapsed')
   @DocsEditable()
-  bool get isCollapsed => _blink.Native_Selection_isCollapsed_Getter(this);
+  bool get isCollapsed => _blink.BlinkSelection.$isCollapsed_Getter(this);
 
   @DomName('Selection.rangeCount')
   @DocsEditable()
-  int get rangeCount => _blink.Native_Selection_rangeCount_Getter(this);
+  int get rangeCount => _blink.BlinkSelection.$rangeCount_Getter(this);
 
   @DomName('Selection.type')
   @DocsEditable()
   @Experimental() // non-standard
-  String get type => _blink.Native_Selection_type_Getter(this);
+  String get type => _blink.BlinkSelection.$type_Getter(this);
 
   @DomName('Selection.addRange')
   @DocsEditable()
-  void addRange(Range range) => _blink.Native_Selection_addRange_Callback(this, range);
+  void addRange(Range range) => _blink.BlinkSelection.$addRange_Callback(this, range);
 
   @DomName('Selection.collapse')
   @DocsEditable()
-  void collapse(Node node, int index) => _blink.Native_Selection_collapse_Callback(this, node, index);
+  void collapse(Node node, int index) => _blink.BlinkSelection.$collapse_Callback(this, node, index);
 
   @DomName('Selection.collapseToEnd')
   @DocsEditable()
-  void collapseToEnd() => _blink.Native_Selection_collapseToEnd_Callback(this);
+  void collapseToEnd() => _blink.BlinkSelection.$collapseToEnd_Callback(this);
 
   @DomName('Selection.collapseToStart')
   @DocsEditable()
-  void collapseToStart() => _blink.Native_Selection_collapseToStart_Callback(this);
+  void collapseToStart() => _blink.BlinkSelection.$collapseToStart_Callback(this);
 
   @DomName('Selection.containsNode')
   @DocsEditable()
   @Experimental() // non-standard
-  bool containsNode(Node node, bool allowPartial) => _blink.Native_Selection_containsNode_Callback(this, node, allowPartial);
+  bool containsNode(Node node, bool allowPartial) => _blink.BlinkSelection.$containsNode_Callback(this, node, allowPartial);
 
   @DomName('Selection.deleteFromDocument')
   @DocsEditable()
-  void deleteFromDocument() => _blink.Native_Selection_deleteFromDocument_Callback(this);
+  void deleteFromDocument() => _blink.BlinkSelection.$deleteFromDocument_Callback(this);
 
   @DomName('Selection.empty')
   @DocsEditable()
   @Experimental() // non-standard
-  void empty() => _blink.Native_Selection_empty_Callback(this);
+  void empty() => _blink.BlinkSelection.$empty_Callback(this);
 
   @DomName('Selection.extend')
   @DocsEditable()
-  void extend(Node node, int offset) => _blink.Native_Selection_extend_Callback(this, node, offset);
+  void extend(Node node, int offset) => _blink.BlinkSelection.$extend_Callback(this, node, offset);
 
   @DomName('Selection.getRangeAt')
   @DocsEditable()
-  Range getRangeAt(int index) => _blink.Native_Selection_getRangeAt_Callback(this, index);
+  Range getRangeAt(int index) => _blink.BlinkSelection.$getRangeAt_Callback(this, index);
 
   @DomName('Selection.modify')
   @DocsEditable()
   @Experimental() // non-standard
-  void modify(String alter, String direction, String granularity) => _blink.Native_Selection_modify_Callback(this, alter, direction, granularity);
+  void modify(String alter, String direction, String granularity) => _blink.BlinkSelection.$modify_Callback(this, alter, direction, granularity);
 
   @DomName('Selection.removeAllRanges')
   @DocsEditable()
-  void removeAllRanges() => _blink.Native_Selection_removeAllRanges_Callback(this);
+  void removeAllRanges() => _blink.BlinkSelection.$removeAllRanges_Callback(this);
 
   @DomName('Selection.selectAllChildren')
   @DocsEditable()
-  void selectAllChildren(Node node) => _blink.Native_Selection_selectAllChildren_Callback(this, node);
+  void selectAllChildren(Node node) => _blink.BlinkSelection.$selectAllChildren_Callback(this, node);
 
   @DomName('Selection.setBaseAndExtent')
   @DocsEditable()
   @Experimental() // non-standard
-  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) => _blink.Native_Selection_setBaseAndExtent_Callback(this, baseNode, baseOffset, extentNode, extentOffset);
+  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) => _blink.BlinkSelection.$setBaseAndExtent_Callback(this, baseNode, baseOffset, extentNode, extentOffset);
 
   @DomName('Selection.setPosition')
   @DocsEditable()
   @Experimental() // non-standard
-  void setPosition(Node node, int offset) => _blink.Native_Selection_setPosition_Callback(this, node, offset);
+  void setPosition(Node node, int offset) => _blink.BlinkSelection.$setPosition_Callback(this, node, offset);
 
   @DomName('Selection.toString')
   @DocsEditable()
-  String toString() => _blink.Native_Selection_toString_Callback(this);
+  String toString() => _blink.BlinkSelection.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24730,16 +24730,16 @@
 
   @DomName('HTMLShadowElement.resetStyleInheritance')
   @DocsEditable()
-  bool get resetStyleInheritance => _blink.Native_HTMLShadowElement_resetStyleInheritance_Getter(this);
+  bool get resetStyleInheritance => _blink.BlinkHTMLShadowElement.$resetStyleInheritance_Getter(this);
 
   @DomName('HTMLShadowElement.resetStyleInheritance')
   @DocsEditable()
-  void set resetStyleInheritance(bool value) => _blink.Native_HTMLShadowElement_resetStyleInheritance_Setter(this, value);
+  void set resetStyleInheritance(bool value) => _blink.BlinkHTMLShadowElement.$resetStyleInheritance_Setter(this, value);
 
   @DomName('HTMLShadowElement.getDistributedNodes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDistributedNodes() => _blink.Native_HTMLShadowElement_getDistributedNodes_Callback(this);
+  List<Node> getDistributedNodes() => _blink.BlinkHTMLShadowElement.$getDistributedNodes_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24759,62 +24759,62 @@
 
   @DomName('ShadowRoot.activeElement')
   @DocsEditable()
-  Element get activeElement => _blink.Native_ShadowRoot_activeElement_Getter(this);
+  Element get activeElement => _blink.BlinkShadowRoot.$activeElement_Getter(this);
 
   @DomName('ShadowRoot.host')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get host => _blink.Native_ShadowRoot_host_Getter(this);
+  Element get host => _blink.BlinkShadowRoot.$host_Getter(this);
 
   @DomName('ShadowRoot.innerHTML')
   @DocsEditable()
-  String get innerHtml => _blink.Native_ShadowRoot_innerHTML_Getter(this);
+  String get innerHtml => _blink.BlinkShadowRoot.$innerHTML_Getter(this);
 
   @DomName('ShadowRoot.innerHTML')
   @DocsEditable()
-  void set innerHtml(String value) => _blink.Native_ShadowRoot_innerHTML_Setter(this, value);
+  void set innerHtml(String value) => _blink.BlinkShadowRoot.$innerHTML_Setter(this, value);
 
   @DomName('ShadowRoot.olderShadowRoot')
   @DocsEditable()
   @Experimental() // untriaged
-  ShadowRoot get olderShadowRoot => _blink.Native_ShadowRoot_olderShadowRoot_Getter(this);
+  ShadowRoot get olderShadowRoot => _blink.BlinkShadowRoot.$olderShadowRoot_Getter(this);
 
   @DomName('ShadowRoot.resetStyleInheritance')
   @DocsEditable()
-  bool get _resetStyleInheritance => _blink.Native_ShadowRoot_resetStyleInheritance_Getter(this);
+  bool get _resetStyleInheritance => _blink.BlinkShadowRoot.$resetStyleInheritance_Getter(this);
 
   @DomName('ShadowRoot.resetStyleInheritance')
   @DocsEditable()
-  void set _resetStyleInheritance(bool value) => _blink.Native_ShadowRoot_resetStyleInheritance_Setter(this, value);
+  void set _resetStyleInheritance(bool value) => _blink.BlinkShadowRoot.$resetStyleInheritance_Setter(this, value);
 
   @DomName('ShadowRoot.styleSheets')
   @DocsEditable()
   @Experimental() // untriaged
-  List<StyleSheet> get styleSheets => _blink.Native_ShadowRoot_styleSheets_Getter(this);
+  List<StyleSheet> get styleSheets => _blink.BlinkShadowRoot.$styleSheets_Getter(this);
 
   @DomName('ShadowRoot.cloneNode')
   @DocsEditable()
-  Node clone(bool deep) => _blink.Native_ShadowRoot_cloneNode_Callback(this, deep);
+  Node clone(bool deep) => _blink.BlinkShadowRoot.$cloneNode_Callback(this, deep);
 
   @DomName('ShadowRoot.elementFromPoint')
   @DocsEditable()
-  Element elementFromPoint(int x, int y) => _blink.Native_ShadowRoot_elementFromPoint_Callback(this, x, y);
+  Element elementFromPoint(int x, int y) => _blink.BlinkShadowRoot.$elementFromPoint_Callback(this, x, y);
 
   @DomName('ShadowRoot.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) => _blink.Native_ShadowRoot_getElementById_Callback(this, elementId);
+  Element getElementById(String elementId) => _blink.BlinkShadowRoot.$getElementById_Callback(this, elementId);
 
   @DomName('ShadowRoot.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String className) => _blink.Native_ShadowRoot_getElementsByClassName_Callback(this, className);
+  List<Node> getElementsByClassName(String className) => _blink.BlinkShadowRoot.$getElementsByClassName_Callback(this, className);
 
   @DomName('ShadowRoot.getElementsByTagName')
   @DocsEditable()
-  List<Node> getElementsByTagName(String tagName) => _blink.Native_ShadowRoot_getElementsByTagName_Callback(this, tagName);
+  List<Node> getElementsByTagName(String tagName) => _blink.BlinkShadowRoot.$getElementsByTagName_Callback(this, tagName);
 
   @DomName('ShadowRoot.getSelection')
   @DocsEditable()
-  Selection getSelection() => _blink.Native_ShadowRoot_getSelection_Callback(this);
+  Selection getSelection() => _blink.BlinkShadowRoot.$getSelection_Callback(this);
 
   static final bool supported = true;
 
@@ -24875,16 +24875,16 @@
 
   @DomName('SharedWorker.SharedWorker')
   @DocsEditable()
-  factory SharedWorker(String scriptURL, [String name]) => _blink.Native_SharedWorker_SharedWorker(scriptURL, name);
+  factory SharedWorker(String scriptURL, [String name]) => _blink.BlinkSharedWorker.$mkSharedWorker(scriptURL, name);
 
   @DomName('SharedWorker.port')
   @DocsEditable()
-  MessagePort get port => _blink.Native_SharedWorker_port_Getter(this);
+  MessagePort get port => _blink.BlinkSharedWorker.$port_Getter(this);
 
   @DomName('SharedWorker.workerStart')
   @DocsEditable()
   @Experimental() // untriaged
-  double get workerStart => _blink.Native_SharedWorker_workerStart_Getter(this);
+  double get workerStart => _blink.BlinkSharedWorker.$workerStart_Getter(this);
 
   @DomName('SharedWorker.onerror')
   @DocsEditable()
@@ -24920,7 +24920,7 @@
   @DomName('SharedWorkerGlobalScope.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.Native_SharedWorkerGlobalScope_name_Getter(this);
+  String get name => _blink.BlinkSharedWorkerGlobalScope.$name_Getter(this);
 
   /// Stream of `connect` events handled by this [SharedWorkerGlobalScope].
   @DomName('SharedWorkerGlobalScope.onconnect')
@@ -24947,70 +24947,70 @@
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  num get appendWindowEnd => _blink.Native_SourceBuffer_appendWindowEnd_Getter(this);
+  num get appendWindowEnd => _blink.BlinkSourceBuffer.$appendWindowEnd_Getter(this);
 
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void set appendWindowEnd(num value) => _blink.Native_SourceBuffer_appendWindowEnd_Setter(this, value);
+  void set appendWindowEnd(num value) => _blink.BlinkSourceBuffer.$appendWindowEnd_Setter(this, value);
 
   @DomName('SourceBuffer.appendWindowStart')
   @DocsEditable()
   @Experimental() // untriaged
-  num get appendWindowStart => _blink.Native_SourceBuffer_appendWindowStart_Getter(this);
+  num get appendWindowStart => _blink.BlinkSourceBuffer.$appendWindowStart_Getter(this);
 
   @DomName('SourceBuffer.appendWindowStart')
   @DocsEditable()
   @Experimental() // untriaged
-  void set appendWindowStart(num value) => _blink.Native_SourceBuffer_appendWindowStart_Setter(this, value);
+  void set appendWindowStart(num value) => _blink.BlinkSourceBuffer.$appendWindowStart_Setter(this, value);
 
   @DomName('SourceBuffer.buffered')
   @DocsEditable()
-  TimeRanges get buffered => _blink.Native_SourceBuffer_buffered_Getter(this);
+  TimeRanges get buffered => _blink.BlinkSourceBuffer.$buffered_Getter(this);
 
   @DomName('SourceBuffer.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get mode => _blink.Native_SourceBuffer_mode_Getter(this);
+  String get mode => _blink.BlinkSourceBuffer.$mode_Getter(this);
 
   @DomName('SourceBuffer.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set mode(String value) => _blink.Native_SourceBuffer_mode_Setter(this, value);
+  void set mode(String value) => _blink.BlinkSourceBuffer.$mode_Setter(this, value);
 
   @DomName('SourceBuffer.timestampOffset')
   @DocsEditable()
-  num get timestampOffset => _blink.Native_SourceBuffer_timestampOffset_Getter(this);
+  num get timestampOffset => _blink.BlinkSourceBuffer.$timestampOffset_Getter(this);
 
   @DomName('SourceBuffer.timestampOffset')
   @DocsEditable()
-  void set timestampOffset(num value) => _blink.Native_SourceBuffer_timestampOffset_Setter(this, value);
+  void set timestampOffset(num value) => _blink.BlinkSourceBuffer.$timestampOffset_Setter(this, value);
 
   @DomName('SourceBuffer.updating')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get updating => _blink.Native_SourceBuffer_updating_Getter(this);
+  bool get updating => _blink.BlinkSourceBuffer.$updating_Getter(this);
 
   @DomName('SourceBuffer.abort')
   @DocsEditable()
-  void abort() => _blink.Native_SourceBuffer_abort_Callback(this);
+  void abort() => _blink.BlinkSourceBuffer.$abort_Callback(this);
 
   @DomName('SourceBuffer.appendBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendBuffer(ByteBuffer data) => _blink.Native_SourceBuffer_appendBuffer_Callback(this, data);
+  void appendBuffer(ByteBuffer data) => _blink.BlinkSourceBuffer.$appendBuffer_Callback(this, data);
 
-  void appendStream(FileStream stream, [int maxSize]) => _blink.Native_SourceBuffer_appendStream(this, stream, maxSize);
+  void appendStream(FileStream stream, [int maxSize]) => _blink.BlinkSourceBuffer.$appendStream(this, stream, maxSize);
 
   @DomName('SourceBuffer.appendTypedData')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendTypedData(TypedData data) => _blink.Native_SourceBuffer_appendTypedData_Callback(this, data);
+  void appendTypedData(TypedData data) => _blink.BlinkSourceBuffer.$appendTypedData_Callback(this, data);
 
   @DomName('SourceBuffer.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(num start, num end) => _blink.Native_SourceBuffer_remove_Callback(this, start, end);
+  void remove(num start, num end) => _blink.BlinkSourceBuffer.$remove_Callback(this, start, end);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25030,15 +25030,15 @@
 
   @DomName('SourceBufferList.length')
   @DocsEditable()
-  int get length => _blink.Native_SourceBufferList_length_Getter(this);
+  int get length => _blink.BlinkSourceBufferList.$length_Getter(this);
 
   SourceBuffer operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_SourceBufferList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkSourceBufferList.$NativeIndexed_Getter(this, index);
   }
 
-  SourceBuffer _nativeIndexedGetter(int index) => _blink.Native_SourceBufferList_NativeIndexed_Getter(this, index);
+  SourceBuffer _nativeIndexedGetter(int index) => _blink.BlinkSourceBufferList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, SourceBuffer value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -25080,7 +25080,7 @@
 
   @DomName('SourceBufferList.item')
   @DocsEditable()
-  SourceBuffer item(int index) => _blink.Native_SourceBufferList_item_Callback(this, index);
+  SourceBuffer item(int index) => _blink.BlinkSourceBufferList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25108,27 +25108,27 @@
 
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
-  String get media => _blink.Native_HTMLSourceElement_media_Getter(this);
+  String get media => _blink.BlinkHTMLSourceElement.$media_Getter(this);
 
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.Native_HTMLSourceElement_media_Setter(this, value);
+  void set media(String value) => _blink.BlinkHTMLSourceElement.$media_Setter(this, value);
 
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLSourceElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLSourceElement.$src_Getter(this);
 
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLSourceElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLSourceElement.$src_Setter(this, value);
 
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLSourceElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLSourceElement.$type_Getter(this);
 
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLSourceElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLSourceElement.$type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25148,22 +25148,22 @@
   @DomName('SourceInfo.facing')
   @DocsEditable()
   @Experimental() // untriaged
-  String get facing => _blink.Native_SourceInfo_facing_Getter(this);
+  String get facing => _blink.BlinkSourceInfo.$facing_Getter(this);
 
   @DomName('SourceInfo.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.Native_SourceInfo_id_Getter(this);
+  String get id => _blink.BlinkSourceInfo.$id_Getter(this);
 
   @DomName('SourceInfo.kind')
   @DocsEditable()
   @Experimental() // untriaged
-  String get kind => _blink.Native_SourceInfo_kind_Getter(this);
+  String get kind => _blink.BlinkSourceInfo.$kind_Getter(this);
 
   @DomName('SourceInfo.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.Native_SourceInfo_label_Getter(this);
+  String get label => _blink.BlinkSourceInfo.$label_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25207,23 +25207,23 @@
 
   @DomName('SpeechGrammar.SpeechGrammar')
   @DocsEditable()
-  factory SpeechGrammar() => _blink.Native_SpeechGrammar_SpeechGrammar();
+  factory SpeechGrammar() => _blink.BlinkSpeechGrammar.$mkSpeechGrammar();
 
   @DomName('SpeechGrammar.src')
   @DocsEditable()
-  String get src => _blink.Native_SpeechGrammar_src_Getter(this);
+  String get src => _blink.BlinkSpeechGrammar.$src_Getter(this);
 
   @DomName('SpeechGrammar.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_SpeechGrammar_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkSpeechGrammar.$src_Setter(this, value);
 
   @DomName('SpeechGrammar.weight')
   @DocsEditable()
-  num get weight => _blink.Native_SpeechGrammar_weight_Getter(this);
+  num get weight => _blink.BlinkSpeechGrammar.$weight_Getter(this);
 
   @DomName('SpeechGrammar.weight')
   @DocsEditable()
-  void set weight(num value) => _blink.Native_SpeechGrammar_weight_Setter(this, value);
+  void set weight(num value) => _blink.BlinkSpeechGrammar.$weight_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25243,19 +25243,19 @@
 
   @DomName('SpeechGrammarList.SpeechGrammarList')
   @DocsEditable()
-  factory SpeechGrammarList() => _blink.Native_SpeechGrammarList_SpeechGrammarList();
+  factory SpeechGrammarList() => _blink.BlinkSpeechGrammarList.$mkSpeechGrammarList();
 
   @DomName('SpeechGrammarList.length')
   @DocsEditable()
-  int get length => _blink.Native_SpeechGrammarList_length_Getter(this);
+  int get length => _blink.BlinkSpeechGrammarList.$length_Getter(this);
 
   SpeechGrammar operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_SpeechGrammarList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkSpeechGrammarList.$NativeIndexed_Getter(this, index);
   }
 
-  SpeechGrammar _nativeIndexedGetter(int index) => _blink.Native_SpeechGrammarList_NativeIndexed_Getter(this, index);
+  SpeechGrammar _nativeIndexedGetter(int index) => _blink.BlinkSpeechGrammarList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, SpeechGrammar value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -25295,13 +25295,13 @@
   SpeechGrammar elementAt(int index) => this[index];
   // -- end List<SpeechGrammar> mixins.
 
-  void addFromString(String string, [num weight]) => _blink.Native_SpeechGrammarList_addFromString(this, string, weight);
+  void addFromString(String string, [num weight]) => _blink.BlinkSpeechGrammarList.$addFromString(this, string, weight);
 
-  void addFromUri(String src, [num weight]) => _blink.Native_SpeechGrammarList_addFromUri(this, src, weight);
+  void addFromUri(String src, [num weight]) => _blink.BlinkSpeechGrammarList.$addFromUri(this, src, weight);
 
   @DomName('SpeechGrammarList.item')
   @DocsEditable()
-  SpeechGrammar item(int index) => _blink.Native_SpeechGrammarList_item_Callback(this, index);
+  SpeechGrammar item(int index) => _blink.BlinkSpeechGrammarList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25464,62 +25464,62 @@
 
   @DomName('SpeechRecognition.SpeechRecognition')
   @DocsEditable()
-  factory SpeechRecognition() => _blink.Native_SpeechRecognition_SpeechRecognition();
+  factory SpeechRecognition() => _blink.BlinkSpeechRecognition.$mkSpeechRecognition();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
-  bool get continuous => _blink.Native_SpeechRecognition_continuous_Getter(this);
+  bool get continuous => _blink.BlinkSpeechRecognition.$continuous_Getter(this);
 
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
-  void set continuous(bool value) => _blink.Native_SpeechRecognition_continuous_Setter(this, value);
+  void set continuous(bool value) => _blink.BlinkSpeechRecognition.$continuous_Setter(this, value);
 
   @DomName('SpeechRecognition.grammars')
   @DocsEditable()
-  SpeechGrammarList get grammars => _blink.Native_SpeechRecognition_grammars_Getter(this);
+  SpeechGrammarList get grammars => _blink.BlinkSpeechRecognition.$grammars_Getter(this);
 
   @DomName('SpeechRecognition.grammars')
   @DocsEditable()
-  void set grammars(SpeechGrammarList value) => _blink.Native_SpeechRecognition_grammars_Setter(this, value);
+  void set grammars(SpeechGrammarList value) => _blink.BlinkSpeechRecognition.$grammars_Setter(this, value);
 
   @DomName('SpeechRecognition.interimResults')
   @DocsEditable()
-  bool get interimResults => _blink.Native_SpeechRecognition_interimResults_Getter(this);
+  bool get interimResults => _blink.BlinkSpeechRecognition.$interimResults_Getter(this);
 
   @DomName('SpeechRecognition.interimResults')
   @DocsEditable()
-  void set interimResults(bool value) => _blink.Native_SpeechRecognition_interimResults_Setter(this, value);
+  void set interimResults(bool value) => _blink.BlinkSpeechRecognition.$interimResults_Setter(this, value);
 
   @DomName('SpeechRecognition.lang')
   @DocsEditable()
-  String get lang => _blink.Native_SpeechRecognition_lang_Getter(this);
+  String get lang => _blink.BlinkSpeechRecognition.$lang_Getter(this);
 
   @DomName('SpeechRecognition.lang')
   @DocsEditable()
-  void set lang(String value) => _blink.Native_SpeechRecognition_lang_Setter(this, value);
+  void set lang(String value) => _blink.BlinkSpeechRecognition.$lang_Setter(this, value);
 
   @DomName('SpeechRecognition.maxAlternatives')
   @DocsEditable()
-  int get maxAlternatives => _blink.Native_SpeechRecognition_maxAlternatives_Getter(this);
+  int get maxAlternatives => _blink.BlinkSpeechRecognition.$maxAlternatives_Getter(this);
 
   @DomName('SpeechRecognition.maxAlternatives')
   @DocsEditable()
-  void set maxAlternatives(int value) => _blink.Native_SpeechRecognition_maxAlternatives_Setter(this, value);
+  void set maxAlternatives(int value) => _blink.BlinkSpeechRecognition.$maxAlternatives_Setter(this, value);
 
   @DomName('SpeechRecognition.abort')
   @DocsEditable()
-  void abort() => _blink.Native_SpeechRecognition_abort_Callback(this);
+  void abort() => _blink.BlinkSpeechRecognition.$abort_Callback(this);
 
   @DomName('SpeechRecognition.start')
   @DocsEditable()
-  void start() => _blink.Native_SpeechRecognition_start_Callback(this);
+  void start() => _blink.BlinkSpeechRecognition.$start_Callback(this);
 
   @DomName('SpeechRecognition.stop')
   @DocsEditable()
-  void stop() => _blink.Native_SpeechRecognition_stop_Callback(this);
+  void stop() => _blink.BlinkSpeechRecognition.$stop_Callback(this);
 
   /// Stream of `audioend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudioend')
@@ -25595,11 +25595,11 @@
 
   @DomName('SpeechRecognitionAlternative.confidence')
   @DocsEditable()
-  double get confidence => _blink.Native_SpeechRecognitionAlternative_confidence_Getter(this);
+  double get confidence => _blink.BlinkSpeechRecognitionAlternative.$confidence_Getter(this);
 
   @DomName('SpeechRecognitionAlternative.transcript')
   @DocsEditable()
-  String get transcript => _blink.Native_SpeechRecognitionAlternative_transcript_Getter(this);
+  String get transcript => _blink.BlinkSpeechRecognitionAlternative.$transcript_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25620,11 +25620,11 @@
 
   @DomName('SpeechRecognitionError.error')
   @DocsEditable()
-  String get error => _blink.Native_SpeechRecognitionError_error_Getter(this);
+  String get error => _blink.BlinkSpeechRecognitionError.$error_Getter(this);
 
   @DomName('SpeechRecognitionError.message')
   @DocsEditable()
-  String get message => _blink.Native_SpeechRecognitionError_message_Getter(this);
+  String get message => _blink.BlinkSpeechRecognitionError.$message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25645,19 +25645,19 @@
 
   @DomName('SpeechRecognitionEvent.emma')
   @DocsEditable()
-  Document get emma => _blink.Native_SpeechRecognitionEvent_emma_Getter(this);
+  Document get emma => _blink.BlinkSpeechRecognitionEvent.$emma_Getter(this);
 
   @DomName('SpeechRecognitionEvent.interpretation')
   @DocsEditable()
-  Document get interpretation => _blink.Native_SpeechRecognitionEvent_interpretation_Getter(this);
+  Document get interpretation => _blink.BlinkSpeechRecognitionEvent.$interpretation_Getter(this);
 
   @DomName('SpeechRecognitionEvent.resultIndex')
   @DocsEditable()
-  int get resultIndex => _blink.Native_SpeechRecognitionEvent_resultIndex_Getter(this);
+  int get resultIndex => _blink.BlinkSpeechRecognitionEvent.$resultIndex_Getter(this);
 
   @DomName('SpeechRecognitionEvent.results')
   @DocsEditable()
-  List<SpeechRecognitionResult> get results => _blink.Native_SpeechRecognitionEvent_results_Getter(this);
+  List<SpeechRecognitionResult> get results => _blink.BlinkSpeechRecognitionEvent.$results_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25678,15 +25678,15 @@
 
   @DomName('SpeechRecognitionResult.isFinal')
   @DocsEditable()
-  bool get isFinal => _blink.Native_SpeechRecognitionResult_isFinal_Getter(this);
+  bool get isFinal => _blink.BlinkSpeechRecognitionResult.$isFinal_Getter(this);
 
   @DomName('SpeechRecognitionResult.length')
   @DocsEditable()
-  int get length => _blink.Native_SpeechRecognitionResult_length_Getter(this);
+  int get length => _blink.BlinkSpeechRecognitionResult.$length_Getter(this);
 
   @DomName('SpeechRecognitionResult.item')
   @DocsEditable()
-  SpeechRecognitionAlternative item(int index) => _blink.Native_SpeechRecognitionResult_item_Callback(this, index);
+  SpeechRecognitionAlternative item(int index) => _blink.BlinkSpeechRecognitionResult.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25706,35 +25706,35 @@
 
   @DomName('SpeechSynthesis.paused')
   @DocsEditable()
-  bool get paused => _blink.Native_SpeechSynthesis_paused_Getter(this);
+  bool get paused => _blink.BlinkSpeechSynthesis.$paused_Getter(this);
 
   @DomName('SpeechSynthesis.pending')
   @DocsEditable()
-  bool get pending => _blink.Native_SpeechSynthesis_pending_Getter(this);
+  bool get pending => _blink.BlinkSpeechSynthesis.$pending_Getter(this);
 
   @DomName('SpeechSynthesis.speaking')
   @DocsEditable()
-  bool get speaking => _blink.Native_SpeechSynthesis_speaking_Getter(this);
+  bool get speaking => _blink.BlinkSpeechSynthesis.$speaking_Getter(this);
 
   @DomName('SpeechSynthesis.cancel')
   @DocsEditable()
-  void cancel() => _blink.Native_SpeechSynthesis_cancel_Callback(this);
+  void cancel() => _blink.BlinkSpeechSynthesis.$cancel_Callback(this);
 
   @DomName('SpeechSynthesis.getVoices')
   @DocsEditable()
-  List<SpeechSynthesisVoice> getVoices() => _blink.Native_SpeechSynthesis_getVoices_Callback(this);
+  List<SpeechSynthesisVoice> getVoices() => _blink.BlinkSpeechSynthesis.$getVoices_Callback(this);
 
   @DomName('SpeechSynthesis.pause')
   @DocsEditable()
-  void pause() => _blink.Native_SpeechSynthesis_pause_Callback(this);
+  void pause() => _blink.BlinkSpeechSynthesis.$pause_Callback(this);
 
   @DomName('SpeechSynthesis.resume')
   @DocsEditable()
-  void resume() => _blink.Native_SpeechSynthesis_resume_Callback(this);
+  void resume() => _blink.BlinkSpeechSynthesis.$resume_Callback(this);
 
   @DomName('SpeechSynthesis.speak')
   @DocsEditable()
-  void speak(SpeechSynthesisUtterance utterance) => _blink.Native_SpeechSynthesis_speak_Callback(this, utterance);
+  void speak(SpeechSynthesisUtterance utterance) => _blink.BlinkSpeechSynthesis.$speak_Callback(this, utterance);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25754,15 +25754,15 @@
 
   @DomName('SpeechSynthesisEvent.charIndex')
   @DocsEditable()
-  int get charIndex => _blink.Native_SpeechSynthesisEvent_charIndex_Getter(this);
+  int get charIndex => _blink.BlinkSpeechSynthesisEvent.$charIndex_Getter(this);
 
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime => _blink.Native_SpeechSynthesisEvent_elapsedTime_Getter(this);
+  double get elapsedTime => _blink.BlinkSpeechSynthesisEvent.$elapsedTime_Getter(this);
 
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable()
-  String get name => _blink.Native_SpeechSynthesisEvent_name_Getter(this);
+  String get name => _blink.BlinkSpeechSynthesisEvent.$name_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25852,55 +25852,55 @@
 
   @DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
   @DocsEditable()
-  factory SpeechSynthesisUtterance([String text]) => _blink.Native_SpeechSynthesisUtterance_SpeechSynthesisUtterance(text);
+  factory SpeechSynthesisUtterance([String text]) => _blink.BlinkSpeechSynthesisUtterance.$mkSpeechSynthesisUtterance(text);
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
-  String get lang => _blink.Native_SpeechSynthesisUtterance_lang_Getter(this);
+  String get lang => _blink.BlinkSpeechSynthesisUtterance.$lang_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
-  void set lang(String value) => _blink.Native_SpeechSynthesisUtterance_lang_Setter(this, value);
+  void set lang(String value) => _blink.BlinkSpeechSynthesisUtterance.$lang_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable()
-  num get pitch => _blink.Native_SpeechSynthesisUtterance_pitch_Getter(this);
+  num get pitch => _blink.BlinkSpeechSynthesisUtterance.$pitch_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable()
-  void set pitch(num value) => _blink.Native_SpeechSynthesisUtterance_pitch_Setter(this, value);
+  void set pitch(num value) => _blink.BlinkSpeechSynthesisUtterance.$pitch_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable()
-  num get rate => _blink.Native_SpeechSynthesisUtterance_rate_Getter(this);
+  num get rate => _blink.BlinkSpeechSynthesisUtterance.$rate_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable()
-  void set rate(num value) => _blink.Native_SpeechSynthesisUtterance_rate_Setter(this, value);
+  void set rate(num value) => _blink.BlinkSpeechSynthesisUtterance.$rate_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable()
-  String get text => _blink.Native_SpeechSynthesisUtterance_text_Getter(this);
+  String get text => _blink.BlinkSpeechSynthesisUtterance.$text_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable()
-  void set text(String value) => _blink.Native_SpeechSynthesisUtterance_text_Setter(this, value);
+  void set text(String value) => _blink.BlinkSpeechSynthesisUtterance.$text_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable()
-  SpeechSynthesisVoice get voice => _blink.Native_SpeechSynthesisUtterance_voice_Getter(this);
+  SpeechSynthesisVoice get voice => _blink.BlinkSpeechSynthesisUtterance.$voice_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable()
-  void set voice(SpeechSynthesisVoice value) => _blink.Native_SpeechSynthesisUtterance_voice_Setter(this, value);
+  void set voice(SpeechSynthesisVoice value) => _blink.BlinkSpeechSynthesisUtterance.$voice_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable()
-  num get volume => _blink.Native_SpeechSynthesisUtterance_volume_Getter(this);
+  num get volume => _blink.BlinkSpeechSynthesisUtterance.$volume_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable()
-  void set volume(num value) => _blink.Native_SpeechSynthesisUtterance_volume_Setter(this, value);
+  void set volume(num value) => _blink.BlinkSpeechSynthesisUtterance.$volume_Setter(this, value);
 
   /// Stream of `boundary` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onboundary')
@@ -25955,23 +25955,23 @@
 
   @DomName('SpeechSynthesisVoice.default')
   @DocsEditable()
-  bool get defaultValue => _blink.Native_SpeechSynthesisVoice_default_Getter(this);
+  bool get defaultValue => _blink.BlinkSpeechSynthesisVoice.$default_Getter(this);
 
   @DomName('SpeechSynthesisVoice.lang')
   @DocsEditable()
-  String get lang => _blink.Native_SpeechSynthesisVoice_lang_Getter(this);
+  String get lang => _blink.BlinkSpeechSynthesisVoice.$lang_Getter(this);
 
   @DomName('SpeechSynthesisVoice.localService')
   @DocsEditable()
-  bool get localService => _blink.Native_SpeechSynthesisVoice_localService_Getter(this);
+  bool get localService => _blink.BlinkSpeechSynthesisVoice.$localService_Getter(this);
 
   @DomName('SpeechSynthesisVoice.name')
   @DocsEditable()
-  String get name => _blink.Native_SpeechSynthesisVoice_name_Getter(this);
+  String get name => _blink.BlinkSpeechSynthesisVoice.$name_Getter(this);
 
   @DomName('SpeechSynthesisVoice.voiceURI')
   @DocsEditable()
-  String get voiceUri => _blink.Native_SpeechSynthesisVoice_voiceURI_Getter(this);
+  String get voiceUri => _blink.BlinkSpeechSynthesisVoice.$voiceURI_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26066,33 +26066,33 @@
 
   @DomName('Storage.length')
   @DocsEditable()
-  int get _length => _blink.Native_Storage_length_Getter(this);
+  int get _length => _blink.BlinkStorage.$length_Getter(this);
 
-  bool __delete__(index_OR_name) => _blink.Native_Storage___delete__(this, index_OR_name);
+  bool __delete__(index_OR_name) => _blink.BlinkStorage.$__delete__(this, index_OR_name);
 
-  String __getter__(index_OR_name) => _blink.Native_Storage___getter__(this, index_OR_name);
+  String __getter__(index_OR_name) => _blink.BlinkStorage.$__getter__(this, index_OR_name);
 
-  void __setter__(index_OR_name, String value) => _blink.Native_Storage___setter__(this, index_OR_name, value);
+  void __setter__(index_OR_name, String value) => _blink.BlinkStorage.$__setter__(this, index_OR_name, value);
 
   @DomName('Storage.clear')
   @DocsEditable()
-  void _clear() => _blink.Native_Storage_clear_Callback(this);
+  void _clear() => _blink.BlinkStorage.$clear_Callback(this);
 
   @DomName('Storage.getItem')
   @DocsEditable()
-  String _getItem(String key) => _blink.Native_Storage_getItem_Callback(this, key);
+  String _getItem(String key) => _blink.BlinkStorage.$getItem_Callback(this, key);
 
   @DomName('Storage.key')
   @DocsEditable()
-  String _key(int index) => _blink.Native_Storage_key_Callback(this, index);
+  String _key(int index) => _blink.BlinkStorage.$key_Callback(this, index);
 
   @DomName('Storage.removeItem')
   @DocsEditable()
-  void _removeItem(String key) => _blink.Native_Storage_removeItem_Callback(this, key);
+  void _removeItem(String key) => _blink.BlinkStorage.$removeItem_Callback(this, key);
 
   @DomName('Storage.setItem')
   @DocsEditable()
-  void _setItem(String key, String data) => _blink.Native_Storage_setItem_Callback(this, key, data);
+  void _setItem(String key, String data) => _blink.BlinkStorage.$setItem_Callback(this, key, data);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26130,27 +26130,27 @@
 
   @DomName('StorageEvent.key')
   @DocsEditable()
-  String get key => _blink.Native_StorageEvent_key_Getter(this);
+  String get key => _blink.BlinkStorageEvent.$key_Getter(this);
 
   @DomName('StorageEvent.newValue')
   @DocsEditable()
-  String get newValue => _blink.Native_StorageEvent_newValue_Getter(this);
+  String get newValue => _blink.BlinkStorageEvent.$newValue_Getter(this);
 
   @DomName('StorageEvent.oldValue')
   @DocsEditable()
-  String get oldValue => _blink.Native_StorageEvent_oldValue_Getter(this);
+  String get oldValue => _blink.BlinkStorageEvent.$oldValue_Getter(this);
 
   @DomName('StorageEvent.storageArea')
   @DocsEditable()
-  Storage get storageArea => _blink.Native_StorageEvent_storageArea_Getter(this);
+  Storage get storageArea => _blink.BlinkStorageEvent.$storageArea_Getter(this);
 
   @DomName('StorageEvent.url')
   @DocsEditable()
-  String get url => _blink.Native_StorageEvent_url_Getter(this);
+  String get url => _blink.BlinkStorageEvent.$url_Getter(this);
 
   @DomName('StorageEvent.initStorageEvent')
   @DocsEditable()
-  void _initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) => _blink.Native_StorageEvent_initStorageEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg);
+  void _initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) => _blink.BlinkStorageEvent.$initStorageEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26171,12 +26171,12 @@
   @DomName('StorageInfo.quota')
   @DocsEditable()
   @Experimental() // untriaged
-  int get quota => _blink.Native_StorageInfo_quota_Getter(this);
+  int get quota => _blink.BlinkStorageInfo.$quota_Getter(this);
 
   @DomName('StorageInfo.usage')
   @DocsEditable()
   @Experimental() // untriaged
-  int get usage => _blink.Native_StorageInfo_usage_Getter(this);
+  int get usage => _blink.BlinkStorageInfo.$usage_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26197,7 +26197,7 @@
   @DomName('StorageQuota.supportedTypes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get supportedTypes => _blink.Native_StorageQuota_supportedTypes_Getter(this);
+  List<String> get supportedTypes => _blink.BlinkStorageQuota.$supportedTypes_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26258,39 +26258,39 @@
 
   @DomName('HTMLStyleElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLStyleElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLStyleElement.$disabled_Getter(this);
 
   @DomName('HTMLStyleElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLStyleElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLStyleElement.$disabled_Setter(this, value);
 
   @DomName('HTMLStyleElement.media')
   @DocsEditable()
-  String get media => _blink.Native_HTMLStyleElement_media_Getter(this);
+  String get media => _blink.BlinkHTMLStyleElement.$media_Getter(this);
 
   @DomName('HTMLStyleElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.Native_HTMLStyleElement_media_Setter(this, value);
+  void set media(String value) => _blink.BlinkHTMLStyleElement.$media_Setter(this, value);
 
   @DomName('HTMLStyleElement.scoped')
   @DocsEditable()
-  bool get scoped => _blink.Native_HTMLStyleElement_scoped_Getter(this);
+  bool get scoped => _blink.BlinkHTMLStyleElement.$scoped_Getter(this);
 
   @DomName('HTMLStyleElement.scoped')
   @DocsEditable()
-  void set scoped(bool value) => _blink.Native_HTMLStyleElement_scoped_Setter(this, value);
+  void set scoped(bool value) => _blink.BlinkHTMLStyleElement.$scoped_Setter(this, value);
 
   @DomName('HTMLStyleElement.sheet')
   @DocsEditable()
-  StyleSheet get sheet => _blink.Native_HTMLStyleElement_sheet_Getter(this);
+  StyleSheet get sheet => _blink.BlinkHTMLStyleElement.$sheet_Getter(this);
 
   @DomName('HTMLStyleElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLStyleElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLStyleElement.$type_Getter(this);
 
   @DomName('HTMLStyleElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLStyleElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLStyleElement.$type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26310,11 +26310,11 @@
 
   @DomName('StyleMedia.type')
   @DocsEditable()
-  String get type => _blink.Native_StyleMedia_type_Getter(this);
+  String get type => _blink.BlinkStyleMedia.$type_Getter(this);
 
   @DomName('StyleMedia.matchMedium')
   @DocsEditable()
-  bool matchMedium(String mediaquery) => _blink.Native_StyleMedia_matchMedium_Callback(this, mediaquery);
+  bool matchMedium(String mediaquery) => _blink.BlinkStyleMedia.$matchMedium_Callback(this, mediaquery);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26332,35 +26332,35 @@
 
   @DomName('StyleSheet.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_StyleSheet_disabled_Getter(this);
+  bool get disabled => _blink.BlinkStyleSheet.$disabled_Getter(this);
 
   @DomName('StyleSheet.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_StyleSheet_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkStyleSheet.$disabled_Setter(this, value);
 
   @DomName('StyleSheet.href')
   @DocsEditable()
-  String get href => _blink.Native_StyleSheet_href_Getter(this);
+  String get href => _blink.BlinkStyleSheet.$href_Getter(this);
 
   @DomName('StyleSheet.media')
   @DocsEditable()
-  MediaList get media => _blink.Native_StyleSheet_media_Getter(this);
+  MediaList get media => _blink.BlinkStyleSheet.$media_Getter(this);
 
   @DomName('StyleSheet.ownerNode')
   @DocsEditable()
-  Node get ownerNode => _blink.Native_StyleSheet_ownerNode_Getter(this);
+  Node get ownerNode => _blink.BlinkStyleSheet.$ownerNode_Getter(this);
 
   @DomName('StyleSheet.parentStyleSheet')
   @DocsEditable()
-  StyleSheet get parentStyleSheet => _blink.Native_StyleSheet_parentStyleSheet_Getter(this);
+  StyleSheet get parentStyleSheet => _blink.BlinkStyleSheet.$parentStyleSheet_Getter(this);
 
   @DomName('StyleSheet.title')
   @DocsEditable()
-  String get title => _blink.Native_StyleSheet_title_Getter(this);
+  String get title => _blink.BlinkStyleSheet.$title_Getter(this);
 
   @DomName('StyleSheet.type')
   @DocsEditable()
-  String get type => _blink.Native_StyleSheet_type_Getter(this);
+  String get type => _blink.BlinkStyleSheet.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26412,31 +26412,31 @@
 
   @DomName('HTMLTableCellElement.cellIndex')
   @DocsEditable()
-  int get cellIndex => _blink.Native_HTMLTableCellElement_cellIndex_Getter(this);
+  int get cellIndex => _blink.BlinkHTMLTableCellElement.$cellIndex_Getter(this);
 
   @DomName('HTMLTableCellElement.colSpan')
   @DocsEditable()
-  int get colSpan => _blink.Native_HTMLTableCellElement_colSpan_Getter(this);
+  int get colSpan => _blink.BlinkHTMLTableCellElement.$colSpan_Getter(this);
 
   @DomName('HTMLTableCellElement.colSpan')
   @DocsEditable()
-  void set colSpan(int value) => _blink.Native_HTMLTableCellElement_colSpan_Setter(this, value);
+  void set colSpan(int value) => _blink.BlinkHTMLTableCellElement.$colSpan_Setter(this, value);
 
   @DomName('HTMLTableCellElement.headers')
   @DocsEditable()
-  String get headers => _blink.Native_HTMLTableCellElement_headers_Getter(this);
+  String get headers => _blink.BlinkHTMLTableCellElement.$headers_Getter(this);
 
   @DomName('HTMLTableCellElement.headers')
   @DocsEditable()
-  void set headers(String value) => _blink.Native_HTMLTableCellElement_headers_Setter(this, value);
+  void set headers(String value) => _blink.BlinkHTMLTableCellElement.$headers_Setter(this, value);
 
   @DomName('HTMLTableCellElement.rowSpan')
   @DocsEditable()
-  int get rowSpan => _blink.Native_HTMLTableCellElement_rowSpan_Getter(this);
+  int get rowSpan => _blink.BlinkHTMLTableCellElement.$rowSpan_Getter(this);
 
   @DomName('HTMLTableCellElement.rowSpan')
   @DocsEditable()
-  void set rowSpan(int value) => _blink.Native_HTMLTableCellElement_rowSpan_Setter(this, value);
+  void set rowSpan(int value) => _blink.BlinkHTMLTableCellElement.$rowSpan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26464,11 +26464,11 @@
 
   @DomName('HTMLTableColElement.span')
   @DocsEditable()
-  int get span => _blink.Native_HTMLTableColElement_span_Getter(this);
+  int get span => _blink.BlinkHTMLTableColElement.$span_Getter(this);
 
   @DomName('HTMLTableColElement.span')
   @DocsEditable()
-  void set span(int value) => _blink.Native_HTMLTableColElement_span_Setter(this, value);
+  void set span(int value) => _blink.BlinkHTMLTableColElement.$span_Setter(this, value);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -26514,71 +26514,71 @@
 
   @DomName('HTMLTableElement.caption')
   @DocsEditable()
-  TableCaptionElement get caption => _blink.Native_HTMLTableElement_caption_Getter(this);
+  TableCaptionElement get caption => _blink.BlinkHTMLTableElement.$caption_Getter(this);
 
   @DomName('HTMLTableElement.caption')
   @DocsEditable()
-  void set caption(TableCaptionElement value) => _blink.Native_HTMLTableElement_caption_Setter(this, value);
+  void set caption(TableCaptionElement value) => _blink.BlinkHTMLTableElement.$caption_Setter(this, value);
 
   @DomName('HTMLTableElement.rows')
   @DocsEditable()
-  List<Node> get _rows => _blink.Native_HTMLTableElement_rows_Getter(this);
+  List<Node> get _rows => _blink.BlinkHTMLTableElement.$rows_Getter(this);
 
   @DomName('HTMLTableElement.tBodies')
   @DocsEditable()
-  List<Node> get _tBodies => _blink.Native_HTMLTableElement_tBodies_Getter(this);
+  List<Node> get _tBodies => _blink.BlinkHTMLTableElement.$tBodies_Getter(this);
 
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
-  TableSectionElement get tFoot => _blink.Native_HTMLTableElement_tFoot_Getter(this);
+  TableSectionElement get tFoot => _blink.BlinkHTMLTableElement.$tFoot_Getter(this);
 
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
-  void set tFoot(TableSectionElement value) => _blink.Native_HTMLTableElement_tFoot_Setter(this, value);
+  void set tFoot(TableSectionElement value) => _blink.BlinkHTMLTableElement.$tFoot_Setter(this, value);
 
   @DomName('HTMLTableElement.tHead')
   @DocsEditable()
-  TableSectionElement get tHead => _blink.Native_HTMLTableElement_tHead_Getter(this);
+  TableSectionElement get tHead => _blink.BlinkHTMLTableElement.$tHead_Getter(this);
 
   @DomName('HTMLTableElement.tHead')
   @DocsEditable()
-  void set tHead(TableSectionElement value) => _blink.Native_HTMLTableElement_tHead_Setter(this, value);
+  void set tHead(TableSectionElement value) => _blink.BlinkHTMLTableElement.$tHead_Setter(this, value);
 
   @DomName('HTMLTableElement.createCaption')
   @DocsEditable()
-  HtmlElement _createCaption() => _blink.Native_HTMLTableElement_createCaption_Callback(this);
+  HtmlElement _createCaption() => _blink.BlinkHTMLTableElement.$createCaption_Callback(this);
 
   @DomName('HTMLTableElement.createTBody')
   @DocsEditable()
-  HtmlElement _createTBody() => _blink.Native_HTMLTableElement_createTBody_Callback(this);
+  HtmlElement _createTBody() => _blink.BlinkHTMLTableElement.$createTBody_Callback(this);
 
   @DomName('HTMLTableElement.createTFoot')
   @DocsEditable()
-  HtmlElement _createTFoot() => _blink.Native_HTMLTableElement_createTFoot_Callback(this);
+  HtmlElement _createTFoot() => _blink.BlinkHTMLTableElement.$createTFoot_Callback(this);
 
   @DomName('HTMLTableElement.createTHead')
   @DocsEditable()
-  HtmlElement _createTHead() => _blink.Native_HTMLTableElement_createTHead_Callback(this);
+  HtmlElement _createTHead() => _blink.BlinkHTMLTableElement.$createTHead_Callback(this);
 
   @DomName('HTMLTableElement.deleteCaption')
   @DocsEditable()
-  void deleteCaption() => _blink.Native_HTMLTableElement_deleteCaption_Callback(this);
+  void deleteCaption() => _blink.BlinkHTMLTableElement.$deleteCaption_Callback(this);
 
   @DomName('HTMLTableElement.deleteRow')
   @DocsEditable()
-  void deleteRow(int index) => _blink.Native_HTMLTableElement_deleteRow_Callback(this, index);
+  void deleteRow(int index) => _blink.BlinkHTMLTableElement.$deleteRow_Callback(this, index);
 
   @DomName('HTMLTableElement.deleteTFoot')
   @DocsEditable()
-  void deleteTFoot() => _blink.Native_HTMLTableElement_deleteTFoot_Callback(this);
+  void deleteTFoot() => _blink.BlinkHTMLTableElement.$deleteTFoot_Callback(this);
 
   @DomName('HTMLTableElement.deleteTHead')
   @DocsEditable()
-  void deleteTHead() => _blink.Native_HTMLTableElement_deleteTHead_Callback(this);
+  void deleteTHead() => _blink.BlinkHTMLTableElement.$deleteTHead_Callback(this);
 
   @DomName('HTMLTableElement.insertRow')
   @DocsEditable()
-  HtmlElement _insertRow(int index) => _blink.Native_HTMLTableElement_insertRow_Callback(this, index);
+  HtmlElement _insertRow(int index) => _blink.BlinkHTMLTableElement.$insertRow_Callback(this, index);
 }
 // 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
@@ -26615,23 +26615,23 @@
 
   @DomName('HTMLTableRowElement.cells')
   @DocsEditable()
-  List<Node> get _cells => _blink.Native_HTMLTableRowElement_cells_Getter(this);
+  List<Node> get _cells => _blink.BlinkHTMLTableRowElement.$cells_Getter(this);
 
   @DomName('HTMLTableRowElement.rowIndex')
   @DocsEditable()
-  int get rowIndex => _blink.Native_HTMLTableRowElement_rowIndex_Getter(this);
+  int get rowIndex => _blink.BlinkHTMLTableRowElement.$rowIndex_Getter(this);
 
   @DomName('HTMLTableRowElement.sectionRowIndex')
   @DocsEditable()
-  int get sectionRowIndex => _blink.Native_HTMLTableRowElement_sectionRowIndex_Getter(this);
+  int get sectionRowIndex => _blink.BlinkHTMLTableRowElement.$sectionRowIndex_Getter(this);
 
   @DomName('HTMLTableRowElement.deleteCell')
   @DocsEditable()
-  void deleteCell(int index) => _blink.Native_HTMLTableRowElement_deleteCell_Callback(this, index);
+  void deleteCell(int index) => _blink.BlinkHTMLTableRowElement.$deleteCell_Callback(this, index);
 
   @DomName('HTMLTableRowElement.insertCell')
   @DocsEditable()
-  HtmlElement _insertCell(int index) => _blink.Native_HTMLTableRowElement_insertCell_Callback(this, index);
+  HtmlElement _insertCell(int index) => _blink.BlinkHTMLTableRowElement.$insertCell_Callback(this, index);
 }
 // 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
@@ -26664,15 +26664,15 @@
 
   @DomName('HTMLTableSectionElement.rows')
   @DocsEditable()
-  List<Node> get _rows => _blink.Native_HTMLTableSectionElement_rows_Getter(this);
+  List<Node> get _rows => _blink.BlinkHTMLTableSectionElement.$rows_Getter(this);
 
   @DomName('HTMLTableSectionElement.deleteRow')
   @DocsEditable()
-  void deleteRow(int index) => _blink.Native_HTMLTableSectionElement_deleteRow_Callback(this, index);
+  void deleteRow(int index) => _blink.BlinkHTMLTableSectionElement.$deleteRow_Callback(this, index);
 
   @DomName('HTMLTableSectionElement.insertRow')
   @DocsEditable()
-  HtmlElement _insertRow(int index) => _blink.Native_HTMLTableSectionElement_insertRow_Callback(this, index);
+  HtmlElement _insertRow(int index) => _blink.BlinkHTMLTableSectionElement.$insertRow_Callback(this, index);
 }
 // 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
@@ -26705,7 +26705,7 @@
 
   @DomName('HTMLTemplateElement.content')
   @DocsEditable()
-  DocumentFragment get content => _blink.Native_HTMLTemplateElement_content_Getter(this);
+  DocumentFragment get content => _blink.BlinkHTMLTemplateElement.$content_Getter(this);
 
 
   /**
@@ -26739,16 +26739,16 @@
 
   @DomName('Text.wholeText')
   @DocsEditable()
-  String get wholeText => _blink.Native_Text_wholeText_Getter(this);
+  String get wholeText => _blink.BlinkText.$wholeText_Getter(this);
 
   @DomName('Text.getDestinationInsertionPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDestinationInsertionPoints() => _blink.Native_Text_getDestinationInsertionPoints_Callback(this);
+  List<Node> getDestinationInsertionPoints() => _blink.BlinkText.$getDestinationInsertionPoints_Callback(this);
 
   @DomName('Text.splitText')
   @DocsEditable()
-  Text splitText(int offset) => _blink.Native_Text_splitText_Callback(this, offset);
+  Text splitText(int offset) => _blink.BlinkText.$splitText_Callback(this, offset);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26776,190 +26776,190 @@
 
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.Native_HTMLTextAreaElement_autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLTextAreaElement.$autofocus_Getter(this);
 
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.Native_HTMLTextAreaElement_autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLTextAreaElement.$autofocus_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.cols')
   @DocsEditable()
-  int get cols => _blink.Native_HTMLTextAreaElement_cols_Getter(this);
+  int get cols => _blink.BlinkHTMLTextAreaElement.$cols_Getter(this);
 
   @DomName('HTMLTextAreaElement.cols')
   @DocsEditable()
-  void set cols(int value) => _blink.Native_HTMLTextAreaElement_cols_Setter(this, value);
+  void set cols(int value) => _blink.BlinkHTMLTextAreaElement.$cols_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.defaultValue')
   @DocsEditable()
-  String get defaultValue => _blink.Native_HTMLTextAreaElement_defaultValue_Getter(this);
+  String get defaultValue => _blink.BlinkHTMLTextAreaElement.$defaultValue_Getter(this);
 
   @DomName('HTMLTextAreaElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) => _blink.Native_HTMLTextAreaElement_defaultValue_Setter(this, value);
+  void set defaultValue(String value) => _blink.BlinkHTMLTextAreaElement.$defaultValue_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
   @Experimental()
-  String get dirName => _blink.Native_HTMLTextAreaElement_dirName_Getter(this);
+  String get dirName => _blink.BlinkHTMLTextAreaElement.$dirName_Getter(this);
 
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
   @Experimental()
-  void set dirName(String value) => _blink.Native_HTMLTextAreaElement_dirName_Setter(this, value);
+  void set dirName(String value) => _blink.BlinkHTMLTextAreaElement.$dirName_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLTextAreaElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLTextAreaElement.$disabled_Getter(this);
 
   @DomName('HTMLTextAreaElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLTextAreaElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLTextAreaElement.$disabled_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLTextAreaElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLTextAreaElement.$form_Getter(this);
 
   @DomName('HTMLTextAreaElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get inputMode => _blink.Native_HTMLTextAreaElement_inputMode_Getter(this);
+  String get inputMode => _blink.BlinkHTMLTextAreaElement.$inputMode_Getter(this);
 
   @DomName('HTMLTextAreaElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set inputMode(String value) => _blink.Native_HTMLTextAreaElement_inputMode_Setter(this, value);
+  void set inputMode(String value) => _blink.BlinkHTMLTextAreaElement.$inputMode_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLTextAreaElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLTextAreaElement.$labels_Getter(this);
 
   @DomName('HTMLTextAreaElement.maxLength')
   @DocsEditable()
-  int get maxLength => _blink.Native_HTMLTextAreaElement_maxLength_Getter(this);
+  int get maxLength => _blink.BlinkHTMLTextAreaElement.$maxLength_Getter(this);
 
   @DomName('HTMLTextAreaElement.maxLength')
   @DocsEditable()
-  void set maxLength(int value) => _blink.Native_HTMLTextAreaElement_maxLength_Setter(this, value);
+  void set maxLength(int value) => _blink.BlinkHTMLTextAreaElement.$maxLength_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLTextAreaElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLTextAreaElement.$name_Getter(this);
 
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLTextAreaElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLTextAreaElement.$name_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.placeholder')
   @DocsEditable()
-  String get placeholder => _blink.Native_HTMLTextAreaElement_placeholder_Getter(this);
+  String get placeholder => _blink.BlinkHTMLTextAreaElement.$placeholder_Getter(this);
 
   @DomName('HTMLTextAreaElement.placeholder')
   @DocsEditable()
-  void set placeholder(String value) => _blink.Native_HTMLTextAreaElement_placeholder_Setter(this, value);
+  void set placeholder(String value) => _blink.BlinkHTMLTextAreaElement.$placeholder_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.readOnly')
   @DocsEditable()
-  bool get readOnly => _blink.Native_HTMLTextAreaElement_readOnly_Getter(this);
+  bool get readOnly => _blink.BlinkHTMLTextAreaElement.$readOnly_Getter(this);
 
   @DomName('HTMLTextAreaElement.readOnly')
   @DocsEditable()
-  void set readOnly(bool value) => _blink.Native_HTMLTextAreaElement_readOnly_Setter(this, value);
+  void set readOnly(bool value) => _blink.BlinkHTMLTextAreaElement.$readOnly_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.required')
   @DocsEditable()
-  bool get required => _blink.Native_HTMLTextAreaElement_required_Getter(this);
+  bool get required => _blink.BlinkHTMLTextAreaElement.$required_Getter(this);
 
   @DomName('HTMLTextAreaElement.required')
   @DocsEditable()
-  void set required(bool value) => _blink.Native_HTMLTextAreaElement_required_Setter(this, value);
+  void set required(bool value) => _blink.BlinkHTMLTextAreaElement.$required_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.rows')
   @DocsEditable()
-  int get rows => _blink.Native_HTMLTextAreaElement_rows_Getter(this);
+  int get rows => _blink.BlinkHTMLTextAreaElement.$rows_Getter(this);
 
   @DomName('HTMLTextAreaElement.rows')
   @DocsEditable()
-  void set rows(int value) => _blink.Native_HTMLTextAreaElement_rows_Setter(this, value);
+  void set rows(int value) => _blink.BlinkHTMLTextAreaElement.$rows_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.selectionDirection')
   @DocsEditable()
-  String get selectionDirection => _blink.Native_HTMLTextAreaElement_selectionDirection_Getter(this);
+  String get selectionDirection => _blink.BlinkHTMLTextAreaElement.$selectionDirection_Getter(this);
 
   @DomName('HTMLTextAreaElement.selectionDirection')
   @DocsEditable()
-  void set selectionDirection(String value) => _blink.Native_HTMLTextAreaElement_selectionDirection_Setter(this, value);
+  void set selectionDirection(String value) => _blink.BlinkHTMLTextAreaElement.$selectionDirection_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.selectionEnd')
   @DocsEditable()
-  int get selectionEnd => _blink.Native_HTMLTextAreaElement_selectionEnd_Getter(this);
+  int get selectionEnd => _blink.BlinkHTMLTextAreaElement.$selectionEnd_Getter(this);
 
   @DomName('HTMLTextAreaElement.selectionEnd')
   @DocsEditable()
-  void set selectionEnd(int value) => _blink.Native_HTMLTextAreaElement_selectionEnd_Setter(this, value);
+  void set selectionEnd(int value) => _blink.BlinkHTMLTextAreaElement.$selectionEnd_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.selectionStart')
   @DocsEditable()
-  int get selectionStart => _blink.Native_HTMLTextAreaElement_selectionStart_Getter(this);
+  int get selectionStart => _blink.BlinkHTMLTextAreaElement.$selectionStart_Getter(this);
 
   @DomName('HTMLTextAreaElement.selectionStart')
   @DocsEditable()
-  void set selectionStart(int value) => _blink.Native_HTMLTextAreaElement_selectionStart_Setter(this, value);
+  void set selectionStart(int value) => _blink.BlinkHTMLTextAreaElement.$selectionStart_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.textLength')
   @DocsEditable()
-  int get textLength => _blink.Native_HTMLTextAreaElement_textLength_Getter(this);
+  int get textLength => _blink.BlinkHTMLTextAreaElement.$textLength_Getter(this);
 
   @DomName('HTMLTextAreaElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLTextAreaElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLTextAreaElement.$type_Getter(this);
 
   @DomName('HTMLTextAreaElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLTextAreaElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLTextAreaElement.$validationMessage_Getter(this);
 
   @DomName('HTMLTextAreaElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLTextAreaElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLTextAreaElement.$validity_Getter(this);
 
   @DomName('HTMLTextAreaElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLTextAreaElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLTextAreaElement.$value_Getter(this);
 
   @DomName('HTMLTextAreaElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLTextAreaElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLTextAreaElement.$value_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLTextAreaElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLTextAreaElement.$willValidate_Getter(this);
 
   @DomName('HTMLTextAreaElement.wrap')
   @DocsEditable()
-  String get wrap => _blink.Native_HTMLTextAreaElement_wrap_Getter(this);
+  String get wrap => _blink.BlinkHTMLTextAreaElement.$wrap_Getter(this);
 
   @DomName('HTMLTextAreaElement.wrap')
   @DocsEditable()
-  void set wrap(String value) => _blink.Native_HTMLTextAreaElement_wrap_Setter(this, value);
+  void set wrap(String value) => _blink.BlinkHTMLTextAreaElement.$wrap_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLTextAreaElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLTextAreaElement.$checkValidity_Callback(this);
 
   @DomName('HTMLTextAreaElement.select')
   @DocsEditable()
-  void select() => _blink.Native_HTMLTextAreaElement_select_Callback(this);
+  void select() => _blink.BlinkHTMLTextAreaElement.$select_Callback(this);
 
   @DomName('HTMLTextAreaElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLTextAreaElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLTextAreaElement.$setCustomValidity_Callback(this, error);
 
-  void setRangeText(String replacement, {int start, int end, String selectionMode}) => _blink.Native_HTMLTextAreaElement_setRangeText(this, replacement, start, end, selectionMode);
+  void setRangeText(String replacement, {int start, int end, String selectionMode}) => _blink.BlinkHTMLTextAreaElement.$setRangeText(this, replacement, start, end, selectionMode);
 
-  void setSelectionRange(int start, int end, [String direction]) => _blink.Native_HTMLTextAreaElement_setSelectionRange(this, start, end, direction);
+  void setSelectionRange(int start, int end, [String direction]) => _blink.BlinkHTMLTextAreaElement.$setSelectionRange(this, start, end, direction);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -26986,11 +26986,11 @@
 
   @DomName('TextEvent.data')
   @DocsEditable()
-  String get data => _blink.Native_TextEvent_data_Getter(this);
+  String get data => _blink.BlinkTextEvent.$data_Getter(this);
 
   @DomName('TextEvent.initTextEvent')
   @DocsEditable()
-  void _initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.Native_TextEvent_initTextEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
+  void _initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.BlinkTextEvent.$initTextEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27008,7 +27008,7 @@
 
   @DomName('TextMetrics.width')
   @DocsEditable()
-  double get width => _blink.Native_TextMetrics_width_Getter(this);
+  double get width => _blink.BlinkTextMetrics.$width_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27038,59 +27038,59 @@
 
   @DomName('TextTrack.activeCues')
   @DocsEditable()
-  TextTrackCueList get activeCues => _blink.Native_TextTrack_activeCues_Getter(this);
+  TextTrackCueList get activeCues => _blink.BlinkTextTrack.$activeCues_Getter(this);
 
   @DomName('TextTrack.cues')
   @DocsEditable()
-  TextTrackCueList get cues => _blink.Native_TextTrack_cues_Getter(this);
+  TextTrackCueList get cues => _blink.BlinkTextTrack.$cues_Getter(this);
 
   @DomName('TextTrack.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.Native_TextTrack_id_Getter(this);
+  String get id => _blink.BlinkTextTrack.$id_Getter(this);
 
   @DomName('TextTrack.kind')
   @DocsEditable()
-  String get kind => _blink.Native_TextTrack_kind_Getter(this);
+  String get kind => _blink.BlinkTextTrack.$kind_Getter(this);
 
   @DomName('TextTrack.label')
   @DocsEditable()
-  String get label => _blink.Native_TextTrack_label_Getter(this);
+  String get label => _blink.BlinkTextTrack.$label_Getter(this);
 
   @DomName('TextTrack.language')
   @DocsEditable()
-  String get language => _blink.Native_TextTrack_language_Getter(this);
+  String get language => _blink.BlinkTextTrack.$language_Getter(this);
 
   @DomName('TextTrack.mode')
   @DocsEditable()
-  String get mode => _blink.Native_TextTrack_mode_Getter(this);
+  String get mode => _blink.BlinkTextTrack.$mode_Getter(this);
 
   @DomName('TextTrack.mode')
   @DocsEditable()
-  void set mode(String value) => _blink.Native_TextTrack_mode_Setter(this, value);
+  void set mode(String value) => _blink.BlinkTextTrack.$mode_Setter(this, value);
 
   @DomName('TextTrack.regions')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegionList get regions => _blink.Native_TextTrack_regions_Getter(this);
+  VttRegionList get regions => _blink.BlinkTextTrack.$regions_Getter(this);
 
   @DomName('TextTrack.addCue')
   @DocsEditable()
-  void addCue(TextTrackCue cue) => _blink.Native_TextTrack_addCue_Callback(this, cue);
+  void addCue(TextTrackCue cue) => _blink.BlinkTextTrack.$addCue_Callback(this, cue);
 
   @DomName('TextTrack.addRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void addRegion(VttRegion region) => _blink.Native_TextTrack_addRegion_Callback(this, region);
+  void addRegion(VttRegion region) => _blink.BlinkTextTrack.$addRegion_Callback(this, region);
 
   @DomName('TextTrack.removeCue')
   @DocsEditable()
-  void removeCue(TextTrackCue cue) => _blink.Native_TextTrack_removeCue_Callback(this, cue);
+  void removeCue(TextTrackCue cue) => _blink.BlinkTextTrack.$removeCue_Callback(this, cue);
 
   @DomName('TextTrack.removeRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeRegion(VttRegion region) => _blink.Native_TextTrack_removeRegion_Callback(this, region);
+  void removeRegion(VttRegion region) => _blink.BlinkTextTrack.$removeRegion_Callback(this, region);
 
   /// Stream of `cuechange` events handled by this [TextTrack].
   @DomName('TextTrack.oncuechange')
@@ -27135,39 +27135,39 @@
 
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
-  num get endTime => _blink.Native_TextTrackCue_endTime_Getter(this);
+  num get endTime => _blink.BlinkTextTrackCue.$endTime_Getter(this);
 
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
-  void set endTime(num value) => _blink.Native_TextTrackCue_endTime_Setter(this, value);
+  void set endTime(num value) => _blink.BlinkTextTrackCue.$endTime_Setter(this, value);
 
   @DomName('TextTrackCue.id')
   @DocsEditable()
-  String get id => _blink.Native_TextTrackCue_id_Getter(this);
+  String get id => _blink.BlinkTextTrackCue.$id_Getter(this);
 
   @DomName('TextTrackCue.id')
   @DocsEditable()
-  void set id(String value) => _blink.Native_TextTrackCue_id_Setter(this, value);
+  void set id(String value) => _blink.BlinkTextTrackCue.$id_Setter(this, value);
 
   @DomName('TextTrackCue.pauseOnExit')
   @DocsEditable()
-  bool get pauseOnExit => _blink.Native_TextTrackCue_pauseOnExit_Getter(this);
+  bool get pauseOnExit => _blink.BlinkTextTrackCue.$pauseOnExit_Getter(this);
 
   @DomName('TextTrackCue.pauseOnExit')
   @DocsEditable()
-  void set pauseOnExit(bool value) => _blink.Native_TextTrackCue_pauseOnExit_Setter(this, value);
+  void set pauseOnExit(bool value) => _blink.BlinkTextTrackCue.$pauseOnExit_Setter(this, value);
 
   @DomName('TextTrackCue.startTime')
   @DocsEditable()
-  num get startTime => _blink.Native_TextTrackCue_startTime_Getter(this);
+  num get startTime => _blink.BlinkTextTrackCue.$startTime_Getter(this);
 
   @DomName('TextTrackCue.startTime')
   @DocsEditable()
-  void set startTime(num value) => _blink.Native_TextTrackCue_startTime_Setter(this, value);
+  void set startTime(num value) => _blink.BlinkTextTrackCue.$startTime_Setter(this, value);
 
   @DomName('TextTrackCue.track')
   @DocsEditable()
-  TextTrack get track => _blink.Native_TextTrackCue_track_Getter(this);
+  TextTrack get track => _blink.BlinkTextTrackCue.$track_Getter(this);
 
   /// Stream of `enter` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onenter')
@@ -27197,15 +27197,15 @@
 
   @DomName('TextTrackCueList.length')
   @DocsEditable()
-  int get length => _blink.Native_TextTrackCueList_length_Getter(this);
+  int get length => _blink.BlinkTextTrackCueList.$length_Getter(this);
 
   TextTrackCue operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_TextTrackCueList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkTextTrackCueList.$NativeIndexed_Getter(this, index);
   }
 
-  TextTrackCue _nativeIndexedGetter(int index) => _blink.Native_TextTrackCueList_NativeIndexed_Getter(this, index);
+  TextTrackCue _nativeIndexedGetter(int index) => _blink.BlinkTextTrackCueList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, TextTrackCue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -27247,11 +27247,11 @@
 
   @DomName('TextTrackCueList.getCueById')
   @DocsEditable()
-  TextTrackCue getCueById(String id) => _blink.Native_TextTrackCueList_getCueById_Callback(this, id);
+  TextTrackCue getCueById(String id) => _blink.BlinkTextTrackCueList.$getCueById_Callback(this, id);
 
   @DomName('TextTrackCueList.item')
   @DocsEditable()
-  TextTrackCue item(int index) => _blink.Native_TextTrackCueList_item_Callback(this, index);
+  TextTrackCue item(int index) => _blink.BlinkTextTrackCueList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27286,15 +27286,15 @@
 
   @DomName('TextTrackList.length')
   @DocsEditable()
-  int get length => _blink.Native_TextTrackList_length_Getter(this);
+  int get length => _blink.BlinkTextTrackList.$length_Getter(this);
 
   TextTrack operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_TextTrackList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkTextTrackList.$NativeIndexed_Getter(this, index);
   }
 
-  TextTrack _nativeIndexedGetter(int index) => _blink.Native_TextTrackList_NativeIndexed_Getter(this, index);
+  TextTrack _nativeIndexedGetter(int index) => _blink.BlinkTextTrackList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, TextTrack value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -27337,11 +27337,11 @@
   @DomName('TextTrackList.getTrackById')
   @DocsEditable()
   @Experimental() // untriaged
-  TextTrack getTrackById(String id) => _blink.Native_TextTrackList_getTrackById_Callback(this, id);
+  TextTrack getTrackById(String id) => _blink.BlinkTextTrackList.$getTrackById_Callback(this, id);
 
   @DomName('TextTrackList.item')
   @DocsEditable()
-  TextTrack item(int index) => _blink.Native_TextTrackList_item_Callback(this, index);
+  TextTrack item(int index) => _blink.BlinkTextTrackList.$item_Callback(this, index);
 
   /// Stream of `addtrack` events handled by this [TextTrackList].
   @DomName('TextTrackList.onaddtrack')
@@ -27370,15 +27370,15 @@
 
   @DomName('TimeRanges.length')
   @DocsEditable()
-  int get length => _blink.Native_TimeRanges_length_Getter(this);
+  int get length => _blink.BlinkTimeRanges.$length_Getter(this);
 
   @DomName('TimeRanges.end')
   @DocsEditable()
-  double end(int index) => _blink.Native_TimeRanges_end_Callback(this, index);
+  double end(int index) => _blink.BlinkTimeRanges.$end_Callback(this, index);
 
   @DomName('TimeRanges.start')
   @DocsEditable()
-  double start(int index) => _blink.Native_TimeRanges_start_Callback(this, index);
+  double start(int index) => _blink.BlinkTimeRanges.$start_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27398,37 +27398,37 @@
   @DomName('TimedItem.activeDuration')
   @DocsEditable()
   @Experimental() // untriaged
-  double get activeDuration => _blink.Native_TimedItem_activeDuration_Getter(this);
+  double get activeDuration => _blink.BlinkTimedItem.$activeDuration_Getter(this);
 
   @DomName('TimedItem.currentIteration')
   @DocsEditable()
   @Experimental() // untriaged
-  int get currentIteration => _blink.Native_TimedItem_currentIteration_Getter(this);
+  int get currentIteration => _blink.BlinkTimedItem.$currentIteration_Getter(this);
 
   @DomName('TimedItem.duration')
   @DocsEditable()
   @Experimental() // untriaged
-  double get duration => _blink.Native_TimedItem_duration_Getter(this);
+  double get duration => _blink.BlinkTimedItem.$duration_Getter(this);
 
   @DomName('TimedItem.endTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get endTime => _blink.Native_TimedItem_endTime_Getter(this);
+  double get endTime => _blink.BlinkTimedItem.$endTime_Getter(this);
 
   @DomName('TimedItem.localTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get localTime => _blink.Native_TimedItem_localTime_Getter(this);
+  double get localTime => _blink.BlinkTimedItem.$localTime_Getter(this);
 
   @DomName('TimedItem.player')
   @DocsEditable()
   @Experimental() // untriaged
-  Player get player => _blink.Native_TimedItem_player_Getter(this);
+  Player get player => _blink.BlinkTimedItem.$player_Getter(this);
 
   @DomName('TimedItem.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get startTime => _blink.Native_TimedItem_startTime_Getter(this);
+  double get startTime => _blink.BlinkTimedItem.$startTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27448,7 +27448,7 @@
   @DomName('Timeline.play')
   @DocsEditable()
   @Experimental() // untriaged
-  Player play(TimedItem source) => _blink.Native_Timeline_play_Callback(this, source);
+  Player play(TimedItem source) => _blink.BlinkTimeline.$play_Callback(this, source);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27477,87 +27477,87 @@
   @DomName('Timing.delay')
   @DocsEditable()
   @Experimental() // untriaged
-  num get delay => _blink.Native_Timing_delay_Getter(this);
+  num get delay => _blink.BlinkTiming.$delay_Getter(this);
 
   @DomName('Timing.delay')
   @DocsEditable()
   @Experimental() // untriaged
-  void set delay(num value) => _blink.Native_Timing_delay_Setter(this, value);
+  void set delay(num value) => _blink.BlinkTiming.$delay_Setter(this, value);
 
   @DomName('Timing.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  String get direction => _blink.Native_Timing_direction_Getter(this);
+  String get direction => _blink.BlinkTiming.$direction_Getter(this);
 
   @DomName('Timing.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  void set direction(String value) => _blink.Native_Timing_direction_Setter(this, value);
+  void set direction(String value) => _blink.BlinkTiming.$direction_Setter(this, value);
 
   @DomName('Timing.easing')
   @DocsEditable()
   @Experimental() // untriaged
-  String get easing => _blink.Native_Timing_easing_Getter(this);
+  String get easing => _blink.BlinkTiming.$easing_Getter(this);
 
   @DomName('Timing.easing')
   @DocsEditable()
   @Experimental() // untriaged
-  void set easing(String value) => _blink.Native_Timing_easing_Setter(this, value);
+  void set easing(String value) => _blink.BlinkTiming.$easing_Setter(this, value);
 
   @DomName('Timing.endDelay')
   @DocsEditable()
   @Experimental() // untriaged
-  num get endDelay => _blink.Native_Timing_endDelay_Getter(this);
+  num get endDelay => _blink.BlinkTiming.$endDelay_Getter(this);
 
   @DomName('Timing.endDelay')
   @DocsEditable()
   @Experimental() // untriaged
-  void set endDelay(num value) => _blink.Native_Timing_endDelay_Setter(this, value);
+  void set endDelay(num value) => _blink.BlinkTiming.$endDelay_Setter(this, value);
 
   @DomName('Timing.fill')
   @DocsEditable()
   @Experimental() // untriaged
-  String get fill => _blink.Native_Timing_fill_Getter(this);
+  String get fill => _blink.BlinkTiming.$fill_Getter(this);
 
   @DomName('Timing.fill')
   @DocsEditable()
   @Experimental() // untriaged
-  void set fill(String value) => _blink.Native_Timing_fill_Setter(this, value);
+  void set fill(String value) => _blink.BlinkTiming.$fill_Setter(this, value);
 
   @DomName('Timing.iterationStart')
   @DocsEditable()
   @Experimental() // untriaged
-  num get iterationStart => _blink.Native_Timing_iterationStart_Getter(this);
+  num get iterationStart => _blink.BlinkTiming.$iterationStart_Getter(this);
 
   @DomName('Timing.iterationStart')
   @DocsEditable()
   @Experimental() // untriaged
-  void set iterationStart(num value) => _blink.Native_Timing_iterationStart_Setter(this, value);
+  void set iterationStart(num value) => _blink.BlinkTiming.$iterationStart_Setter(this, value);
 
   @DomName('Timing.iterations')
   @DocsEditable()
   @Experimental() // untriaged
-  num get iterations => _blink.Native_Timing_iterations_Getter(this);
+  num get iterations => _blink.BlinkTiming.$iterations_Getter(this);
 
   @DomName('Timing.iterations')
   @DocsEditable()
   @Experimental() // untriaged
-  void set iterations(num value) => _blink.Native_Timing_iterations_Setter(this, value);
+  void set iterations(num value) => _blink.BlinkTiming.$iterations_Setter(this, value);
 
   @DomName('Timing.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  num get playbackRate => _blink.Native_Timing_playbackRate_Getter(this);
+  num get playbackRate => _blink.BlinkTiming.$playbackRate_Getter(this);
 
   @DomName('Timing.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  void set playbackRate(num value) => _blink.Native_Timing_playbackRate_Setter(this, value);
+  void set playbackRate(num value) => _blink.BlinkTiming.$playbackRate_Setter(this, value);
 
   @DomName('Timing.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(String name, num duration) => _blink.Native_Timing___setter___Callback(this, name, duration);
+  void __setter__(String name, num duration) => _blink.BlinkTiming.$__setter___Callback(this, name, duration);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27599,63 +27599,63 @@
 
   @DomName('Touch.clientX')
   @DocsEditable()
-  int get _clientX => _blink.Native_Touch_clientX_Getter(this);
+  int get _clientX => _blink.BlinkTouch.$clientX_Getter(this);
 
   @DomName('Touch.clientY')
   @DocsEditable()
-  int get _clientY => _blink.Native_Touch_clientY_Getter(this);
+  int get _clientY => _blink.BlinkTouch.$clientY_Getter(this);
 
   @DomName('Touch.identifier')
   @DocsEditable()
-  int get identifier => _blink.Native_Touch_identifier_Getter(this);
+  int get identifier => _blink.BlinkTouch.$identifier_Getter(this);
 
   @DomName('Touch.pageX')
   @DocsEditable()
-  int get _pageX => _blink.Native_Touch_pageX_Getter(this);
+  int get _pageX => _blink.BlinkTouch.$pageX_Getter(this);
 
   @DomName('Touch.pageY')
   @DocsEditable()
-  int get _pageY => _blink.Native_Touch_pageY_Getter(this);
+  int get _pageY => _blink.BlinkTouch.$pageY_Getter(this);
 
   @DomName('Touch.screenX')
   @DocsEditable()
-  int get _screenX => _blink.Native_Touch_screenX_Getter(this);
+  int get _screenX => _blink.BlinkTouch.$screenX_Getter(this);
 
   @DomName('Touch.screenY')
   @DocsEditable()
-  int get _screenY => _blink.Native_Touch_screenY_Getter(this);
+  int get _screenY => _blink.BlinkTouch.$screenY_Getter(this);
 
   @DomName('Touch.target')
   @DocsEditable()
-  EventTarget get target => _blink.Native_Touch_target_Getter(this);
+  EventTarget get target => _blink.BlinkTouch.$target_Getter(this);
 
   @DomName('Touch.webkitForce')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  double get force => _blink.Native_Touch_webkitForce_Getter(this);
+  double get force => _blink.BlinkTouch.$webkitForce_Getter(this);
 
   @DomName('Touch.webkitRadiusX')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get radiusX => _blink.Native_Touch_webkitRadiusX_Getter(this);
+  int get radiusX => _blink.BlinkTouch.$webkitRadiusX_Getter(this);
 
   @DomName('Touch.webkitRadiusY')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get radiusY => _blink.Native_Touch_webkitRadiusY_Getter(this);
+  int get radiusY => _blink.BlinkTouch.$webkitRadiusY_Getter(this);
 
   @DomName('Touch.webkitRotationAngle')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  double get rotationAngle => _blink.Native_Touch_webkitRotationAngle_Getter(this);
+  double get rotationAngle => _blink.BlinkTouch.$webkitRotationAngle_Getter(this);
 
 
   @DomName('Touch.clientX')
@@ -27699,35 +27699,35 @@
 
   @DomName('TouchEvent.altKey')
   @DocsEditable()
-  bool get altKey => _blink.Native_TouchEvent_altKey_Getter(this);
+  bool get altKey => _blink.BlinkTouchEvent.$altKey_Getter(this);
 
   @DomName('TouchEvent.changedTouches')
   @DocsEditable()
-  TouchList get changedTouches => _blink.Native_TouchEvent_changedTouches_Getter(this);
+  TouchList get changedTouches => _blink.BlinkTouchEvent.$changedTouches_Getter(this);
 
   @DomName('TouchEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey => _blink.Native_TouchEvent_ctrlKey_Getter(this);
+  bool get ctrlKey => _blink.BlinkTouchEvent.$ctrlKey_Getter(this);
 
   @DomName('TouchEvent.metaKey')
   @DocsEditable()
-  bool get metaKey => _blink.Native_TouchEvent_metaKey_Getter(this);
+  bool get metaKey => _blink.BlinkTouchEvent.$metaKey_Getter(this);
 
   @DomName('TouchEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey => _blink.Native_TouchEvent_shiftKey_Getter(this);
+  bool get shiftKey => _blink.BlinkTouchEvent.$shiftKey_Getter(this);
 
   @DomName('TouchEvent.targetTouches')
   @DocsEditable()
-  TouchList get targetTouches => _blink.Native_TouchEvent_targetTouches_Getter(this);
+  TouchList get targetTouches => _blink.BlinkTouchEvent.$targetTouches_Getter(this);
 
   @DomName('TouchEvent.touches')
   @DocsEditable()
-  TouchList get touches => _blink.Native_TouchEvent_touches_Getter(this);
+  TouchList get touches => _blink.BlinkTouchEvent.$touches_Getter(this);
 
   @DomName('TouchEvent.initTouchEvent')
   @DocsEditable()
-  void _initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.Native_TouchEvent_initTouchEvent_Callback(this, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
+  void _initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkTouchEvent.$initTouchEvent_Callback(this, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
 
 
   /**
@@ -27762,15 +27762,15 @@
 
   @DomName('TouchList.length')
   @DocsEditable()
-  int get length => _blink.Native_TouchList_length_Getter(this);
+  int get length => _blink.BlinkTouchList.$length_Getter(this);
 
   Touch operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_TouchList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkTouchList.$NativeIndexed_Getter(this, index);
   }
 
-  Touch _nativeIndexedGetter(int index) => _blink.Native_TouchList_NativeIndexed_Getter(this, index);
+  Touch _nativeIndexedGetter(int index) => _blink.BlinkTouchList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Touch value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -27812,7 +27812,7 @@
 
   @DomName('TouchList.item')
   @DocsEditable()
-  Touch item(int index) => _blink.Native_TouchList_item_Callback(this, index);
+  Touch item(int index) => _blink.BlinkTouchList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27864,51 +27864,51 @@
 
   @DomName('HTMLTrackElement.default')
   @DocsEditable()
-  bool get defaultValue => _blink.Native_HTMLTrackElement_default_Getter(this);
+  bool get defaultValue => _blink.BlinkHTMLTrackElement.$default_Getter(this);
 
   @DomName('HTMLTrackElement.default')
   @DocsEditable()
-  void set defaultValue(bool value) => _blink.Native_HTMLTrackElement_default_Setter(this, value);
+  void set defaultValue(bool value) => _blink.BlinkHTMLTrackElement.$default_Setter(this, value);
 
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
-  String get kind => _blink.Native_HTMLTrackElement_kind_Getter(this);
+  String get kind => _blink.BlinkHTMLTrackElement.$kind_Getter(this);
 
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
-  void set kind(String value) => _blink.Native_HTMLTrackElement_kind_Setter(this, value);
+  void set kind(String value) => _blink.BlinkHTMLTrackElement.$kind_Setter(this, value);
 
   @DomName('HTMLTrackElement.label')
   @DocsEditable()
-  String get label => _blink.Native_HTMLTrackElement_label_Getter(this);
+  String get label => _blink.BlinkHTMLTrackElement.$label_Getter(this);
 
   @DomName('HTMLTrackElement.label')
   @DocsEditable()
-  void set label(String value) => _blink.Native_HTMLTrackElement_label_Setter(this, value);
+  void set label(String value) => _blink.BlinkHTMLTrackElement.$label_Setter(this, value);
 
   @DomName('HTMLTrackElement.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_HTMLTrackElement_readyState_Getter(this);
+  int get readyState => _blink.BlinkHTMLTrackElement.$readyState_Getter(this);
 
   @DomName('HTMLTrackElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLTrackElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLTrackElement.$src_Getter(this);
 
   @DomName('HTMLTrackElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLTrackElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLTrackElement.$src_Setter(this, value);
 
   @DomName('HTMLTrackElement.srclang')
   @DocsEditable()
-  String get srclang => _blink.Native_HTMLTrackElement_srclang_Getter(this);
+  String get srclang => _blink.BlinkHTMLTrackElement.$srclang_Getter(this);
 
   @DomName('HTMLTrackElement.srclang')
   @DocsEditable()
-  void set srclang(String value) => _blink.Native_HTMLTrackElement_srclang_Setter(this, value);
+  void set srclang(String value) => _blink.BlinkHTMLTrackElement.$srclang_Setter(this, value);
 
   @DomName('HTMLTrackElement.track')
   @DocsEditable()
-  TextTrack get track => _blink.Native_HTMLTrackElement_track_Getter(this);
+  TextTrack get track => _blink.BlinkHTMLTrackElement.$track_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27927,7 +27927,7 @@
 
   @DomName('TrackEvent.track')
   @DocsEditable()
-  Object get track => _blink.Native_TrackEvent_track_Getter(this);
+  Object get track => _blink.BlinkTrackEvent.$track_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27945,15 +27945,15 @@
 
   @DomName('TransitionEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime => _blink.Native_TransitionEvent_elapsedTime_Getter(this);
+  double get elapsedTime => _blink.BlinkTransitionEvent.$elapsedTime_Getter(this);
 
   @DomName('TransitionEvent.propertyName')
   @DocsEditable()
-  String get propertyName => _blink.Native_TransitionEvent_propertyName_Getter(this);
+  String get propertyName => _blink.BlinkTransitionEvent.$propertyName_Getter(this);
 
   @DomName('TransitionEvent.pseudoElement')
   @DocsEditable()
-  String get pseudoElement => _blink.Native_TransitionEvent_pseudoElement_Getter(this);
+  String get pseudoElement => _blink.BlinkTransitionEvent.$pseudoElement_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -27972,51 +27972,51 @@
 
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
-  Node get currentNode => _blink.Native_TreeWalker_currentNode_Getter(this);
+  Node get currentNode => _blink.BlinkTreeWalker.$currentNode_Getter(this);
 
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
-  void set currentNode(Node value) => _blink.Native_TreeWalker_currentNode_Setter(this, value);
+  void set currentNode(Node value) => _blink.BlinkTreeWalker.$currentNode_Setter(this, value);
 
   @DomName('TreeWalker.filter')
   @DocsEditable()
-  NodeFilter get filter => _blink.Native_TreeWalker_filter_Getter(this);
+  NodeFilter get filter => _blink.BlinkTreeWalker.$filter_Getter(this);
 
   @DomName('TreeWalker.root')
   @DocsEditable()
-  Node get root => _blink.Native_TreeWalker_root_Getter(this);
+  Node get root => _blink.BlinkTreeWalker.$root_Getter(this);
 
   @DomName('TreeWalker.whatToShow')
   @DocsEditable()
-  int get whatToShow => _blink.Native_TreeWalker_whatToShow_Getter(this);
+  int get whatToShow => _blink.BlinkTreeWalker.$whatToShow_Getter(this);
 
   @DomName('TreeWalker.firstChild')
   @DocsEditable()
-  Node firstChild() => _blink.Native_TreeWalker_firstChild_Callback(this);
+  Node firstChild() => _blink.BlinkTreeWalker.$firstChild_Callback(this);
 
   @DomName('TreeWalker.lastChild')
   @DocsEditable()
-  Node lastChild() => _blink.Native_TreeWalker_lastChild_Callback(this);
+  Node lastChild() => _blink.BlinkTreeWalker.$lastChild_Callback(this);
 
   @DomName('TreeWalker.nextNode')
   @DocsEditable()
-  Node nextNode() => _blink.Native_TreeWalker_nextNode_Callback(this);
+  Node nextNode() => _blink.BlinkTreeWalker.$nextNode_Callback(this);
 
   @DomName('TreeWalker.nextSibling')
   @DocsEditable()
-  Node nextSibling() => _blink.Native_TreeWalker_nextSibling_Callback(this);
+  Node nextSibling() => _blink.BlinkTreeWalker.$nextSibling_Callback(this);
 
   @DomName('TreeWalker.parentNode')
   @DocsEditable()
-  Node parentNode() => _blink.Native_TreeWalker_parentNode_Callback(this);
+  Node parentNode() => _blink.BlinkTreeWalker.$parentNode_Callback(this);
 
   @DomName('TreeWalker.previousNode')
   @DocsEditable()
-  Node previousNode() => _blink.Native_TreeWalker_previousNode_Callback(this);
+  Node previousNode() => _blink.BlinkTreeWalker.$previousNode_Callback(this);
 
   @DomName('TreeWalker.previousSibling')
   @DocsEditable()
-  Node previousSibling() => _blink.Native_TreeWalker_previousSibling_Callback(this);
+  Node previousSibling() => _blink.BlinkTreeWalker.$previousSibling_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28050,53 +28050,53 @@
   @DomName('UIEvent.charCode')
   @DocsEditable()
   @Unstable()
-  int get _charCode => _blink.Native_UIEvent_charCode_Getter(this);
+  int get _charCode => _blink.BlinkUIEvent.$charCode_Getter(this);
 
   @DomName('UIEvent.detail')
   @DocsEditable()
-  int get detail => _blink.Native_UIEvent_detail_Getter(this);
+  int get detail => _blink.BlinkUIEvent.$detail_Getter(this);
 
   @DomName('UIEvent.keyCode')
   @DocsEditable()
   @Unstable()
-  int get _keyCode => _blink.Native_UIEvent_keyCode_Getter(this);
+  int get _keyCode => _blink.BlinkUIEvent.$keyCode_Getter(this);
 
   @DomName('UIEvent.layerX')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _layerX => _blink.Native_UIEvent_layerX_Getter(this);
+  int get _layerX => _blink.BlinkUIEvent.$layerX_Getter(this);
 
   @DomName('UIEvent.layerY')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _layerY => _blink.Native_UIEvent_layerY_Getter(this);
+  int get _layerY => _blink.BlinkUIEvent.$layerY_Getter(this);
 
   @DomName('UIEvent.pageX')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _pageX => _blink.Native_UIEvent_pageX_Getter(this);
+  int get _pageX => _blink.BlinkUIEvent.$pageX_Getter(this);
 
   @DomName('UIEvent.pageY')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _pageY => _blink.Native_UIEvent_pageY_Getter(this);
+  int get _pageY => _blink.BlinkUIEvent.$pageY_Getter(this);
 
   @DomName('UIEvent.view')
   @DocsEditable()
-  WindowBase get view => _blink.Native_UIEvent_view_Getter(this);
+  WindowBase get view => _blink.BlinkUIEvent.$view_Getter(this);
 
   @DomName('UIEvent.which')
   @DocsEditable()
   @Unstable()
-  int get which => _blink.Native_UIEvent_which_Getter(this);
+  int get which => _blink.BlinkUIEvent.$which_Getter(this);
 
   @DomName('UIEvent.initUIEvent')
   @DocsEditable()
-  void _initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) => _blink.Native_UIEvent_initUIEvent_Callback(this, type, canBubble, cancelable, view, detail);
+  void _initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) => _blink.BlinkUIEvent.$initUIEvent_Callback(this, type, canBubble, cancelable, view, detail);
 
 
   @DomName('UIEvent.layerX')
@@ -28164,133 +28164,133 @@
   // To suppress missing implicit constructor warnings.
   factory Url._() { throw new UnsupportedError("Not supported"); }
 
-  static String createObjectUrl(blob_OR_source_OR_stream) => _blink.Native_URL_createObjectUrl(blob_OR_source_OR_stream);
+  static String createObjectUrl(blob_OR_source_OR_stream) => _blink.BlinkURL.$createObjectUrl(blob_OR_source_OR_stream);
 
   @DomName('URL.createObjectUrlFromBlob')
   @DocsEditable()
-  static String createObjectUrlFromBlob(Blob blob) => _blink.Native_URL_createObjectUrlFromBlob_Callback(blob);
+  static String createObjectUrlFromBlob(Blob blob) => _blink.BlinkURL.$createObjectUrlFromBlob_Callback(blob);
 
   @DomName('URL.createObjectUrlFromSource')
   @DocsEditable()
-  static String createObjectUrlFromSource(MediaSource source) => _blink.Native_URL_createObjectUrlFromSource_Callback(source);
+  static String createObjectUrlFromSource(MediaSource source) => _blink.BlinkURL.$createObjectUrlFromSource_Callback(source);
 
   @DomName('URL.createObjectUrlFromStream')
   @DocsEditable()
-  static String createObjectUrlFromStream(MediaStream stream) => _blink.Native_URL_createObjectUrlFromStream_Callback(stream);
+  static String createObjectUrlFromStream(MediaStream stream) => _blink.BlinkURL.$createObjectUrlFromStream_Callback(stream);
 
   @DomName('URL.revokeObjectURL')
   @DocsEditable()
-  static void revokeObjectUrl(String url) => _blink.Native_URL_revokeObjectURL_Callback(url);
+  static void revokeObjectUrl(String url) => _blink.BlinkURL.$revokeObjectURL_Callback(url);
 
   @DomName('URL.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash => _blink.Native_URL_hash_Getter(this);
+  String get hash => _blink.BlinkURL.$hash_Getter(this);
 
   @DomName('URL.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hash(String value) => _blink.Native_URL_hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkURL.$hash_Setter(this, value);
 
   @DomName('URL.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host => _blink.Native_URL_host_Getter(this);
+  String get host => _blink.BlinkURL.$host_Getter(this);
 
   @DomName('URL.host')
   @DocsEditable()
   @Experimental() // untriaged
-  void set host(String value) => _blink.Native_URL_host_Setter(this, value);
+  void set host(String value) => _blink.BlinkURL.$host_Setter(this, value);
 
   @DomName('URL.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname => _blink.Native_URL_hostname_Getter(this);
+  String get hostname => _blink.BlinkURL.$hostname_Getter(this);
 
   @DomName('URL.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hostname(String value) => _blink.Native_URL_hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkURL.$hostname_Setter(this, value);
 
   @DomName('URL.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href => _blink.Native_URL_href_Getter(this);
+  String get href => _blink.BlinkURL.$href_Getter(this);
 
   @DomName('URL.href')
   @DocsEditable()
   @Experimental() // untriaged
-  void set href(String value) => _blink.Native_URL_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkURL.$href_Setter(this, value);
 
   @DomName('URL.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.Native_URL_origin_Getter(this);
+  String get origin => _blink.BlinkURL.$origin_Getter(this);
 
   @DomName('URL.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.Native_URL_password_Getter(this);
+  String get password => _blink.BlinkURL.$password_Getter(this);
 
   @DomName('URL.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.Native_URL_password_Setter(this, value);
+  void set password(String value) => _blink.BlinkURL.$password_Setter(this, value);
 
   @DomName('URL.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname => _blink.Native_URL_pathname_Getter(this);
+  String get pathname => _blink.BlinkURL.$pathname_Getter(this);
 
   @DomName('URL.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set pathname(String value) => _blink.Native_URL_pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkURL.$pathname_Setter(this, value);
 
   @DomName('URL.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port => _blink.Native_URL_port_Getter(this);
+  String get port => _blink.BlinkURL.$port_Getter(this);
 
   @DomName('URL.port')
   @DocsEditable()
   @Experimental() // untriaged
-  void set port(String value) => _blink.Native_URL_port_Setter(this, value);
+  void set port(String value) => _blink.BlinkURL.$port_Setter(this, value);
 
   @DomName('URL.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.Native_URL_protocol_Getter(this);
+  String get protocol => _blink.BlinkURL.$protocol_Getter(this);
 
   @DomName('URL.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  void set protocol(String value) => _blink.Native_URL_protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkURL.$protocol_Setter(this, value);
 
   @DomName('URL.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search => _blink.Native_URL_search_Getter(this);
+  String get search => _blink.BlinkURL.$search_Getter(this);
 
   @DomName('URL.search')
   @DocsEditable()
   @Experimental() // untriaged
-  void set search(String value) => _blink.Native_URL_search_Setter(this, value);
+  void set search(String value) => _blink.BlinkURL.$search_Setter(this, value);
 
   @DomName('URL.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.Native_URL_username_Getter(this);
+  String get username => _blink.BlinkURL.$username_Getter(this);
 
   @DomName('URL.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.Native_URL_username_Setter(this, value);
+  void set username(String value) => _blink.BlinkURL.$username_Setter(this, value);
 
   @DomName('URL.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.Native_URL_toString_Callback(this);
+  String toString() => _blink.BlinkURL.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28310,112 +28310,112 @@
   @DomName('URLUtils.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash => _blink.Native_URLUtils_hash_Getter(this);
+  String get hash => _blink.BlinkURLUtils.$hash_Getter(this);
 
   @DomName('URLUtils.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hash(String value) => _blink.Native_URLUtils_hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkURLUtils.$hash_Setter(this, value);
 
   @DomName('URLUtils.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host => _blink.Native_URLUtils_host_Getter(this);
+  String get host => _blink.BlinkURLUtils.$host_Getter(this);
 
   @DomName('URLUtils.host')
   @DocsEditable()
   @Experimental() // untriaged
-  void set host(String value) => _blink.Native_URLUtils_host_Setter(this, value);
+  void set host(String value) => _blink.BlinkURLUtils.$host_Setter(this, value);
 
   @DomName('URLUtils.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname => _blink.Native_URLUtils_hostname_Getter(this);
+  String get hostname => _blink.BlinkURLUtils.$hostname_Getter(this);
 
   @DomName('URLUtils.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hostname(String value) => _blink.Native_URLUtils_hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkURLUtils.$hostname_Setter(this, value);
 
   @DomName('URLUtils.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href => _blink.Native_URLUtils_href_Getter(this);
+  String get href => _blink.BlinkURLUtils.$href_Getter(this);
 
   @DomName('URLUtils.href')
   @DocsEditable()
   @Experimental() // untriaged
-  void set href(String value) => _blink.Native_URLUtils_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkURLUtils.$href_Setter(this, value);
 
   @DomName('URLUtils.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.Native_URLUtils_origin_Getter(this);
+  String get origin => _blink.BlinkURLUtils.$origin_Getter(this);
 
   @DomName('URLUtils.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.Native_URLUtils_password_Getter(this);
+  String get password => _blink.BlinkURLUtils.$password_Getter(this);
 
   @DomName('URLUtils.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.Native_URLUtils_password_Setter(this, value);
+  void set password(String value) => _blink.BlinkURLUtils.$password_Setter(this, value);
 
   @DomName('URLUtils.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname => _blink.Native_URLUtils_pathname_Getter(this);
+  String get pathname => _blink.BlinkURLUtils.$pathname_Getter(this);
 
   @DomName('URLUtils.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set pathname(String value) => _blink.Native_URLUtils_pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkURLUtils.$pathname_Setter(this, value);
 
   @DomName('URLUtils.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port => _blink.Native_URLUtils_port_Getter(this);
+  String get port => _blink.BlinkURLUtils.$port_Getter(this);
 
   @DomName('URLUtils.port')
   @DocsEditable()
   @Experimental() // untriaged
-  void set port(String value) => _blink.Native_URLUtils_port_Setter(this, value);
+  void set port(String value) => _blink.BlinkURLUtils.$port_Setter(this, value);
 
   @DomName('URLUtils.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.Native_URLUtils_protocol_Getter(this);
+  String get protocol => _blink.BlinkURLUtils.$protocol_Getter(this);
 
   @DomName('URLUtils.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  void set protocol(String value) => _blink.Native_URLUtils_protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkURLUtils.$protocol_Setter(this, value);
 
   @DomName('URLUtils.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search => _blink.Native_URLUtils_search_Getter(this);
+  String get search => _blink.BlinkURLUtils.$search_Getter(this);
 
   @DomName('URLUtils.search')
   @DocsEditable()
   @Experimental() // untriaged
-  void set search(String value) => _blink.Native_URLUtils_search_Setter(this, value);
+  void set search(String value) => _blink.BlinkURLUtils.$search_Setter(this, value);
 
   @DomName('URLUtils.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.Native_URLUtils_username_Getter(this);
+  String get username => _blink.BlinkURLUtils.$username_Getter(this);
 
   @DomName('URLUtils.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.Native_URLUtils_username_Setter(this, value);
+  void set username(String value) => _blink.BlinkURLUtils.$username_Setter(this, value);
 
   @DomName('URLUtils.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.Native_URLUtils_toString_Callback(this);
+  String toString() => _blink.BlinkURLUtils.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28435,47 +28435,47 @@
   @DomName('URLUtilsReadOnly.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash => _blink.Native_URLUtilsReadOnly_hash_Getter(this);
+  String get hash => _blink.BlinkURLUtilsReadOnly.$hash_Getter(this);
 
   @DomName('URLUtilsReadOnly.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host => _blink.Native_URLUtilsReadOnly_host_Getter(this);
+  String get host => _blink.BlinkURLUtilsReadOnly.$host_Getter(this);
 
   @DomName('URLUtilsReadOnly.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname => _blink.Native_URLUtilsReadOnly_hostname_Getter(this);
+  String get hostname => _blink.BlinkURLUtilsReadOnly.$hostname_Getter(this);
 
   @DomName('URLUtilsReadOnly.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href => _blink.Native_URLUtilsReadOnly_href_Getter(this);
+  String get href => _blink.BlinkURLUtilsReadOnly.$href_Getter(this);
 
   @DomName('URLUtilsReadOnly.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname => _blink.Native_URLUtilsReadOnly_pathname_Getter(this);
+  String get pathname => _blink.BlinkURLUtilsReadOnly.$pathname_Getter(this);
 
   @DomName('URLUtilsReadOnly.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port => _blink.Native_URLUtilsReadOnly_port_Getter(this);
+  String get port => _blink.BlinkURLUtilsReadOnly.$port_Getter(this);
 
   @DomName('URLUtilsReadOnly.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.Native_URLUtilsReadOnly_protocol_Getter(this);
+  String get protocol => _blink.BlinkURLUtilsReadOnly.$protocol_Getter(this);
 
   @DomName('URLUtilsReadOnly.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search => _blink.Native_URLUtilsReadOnly_search_Getter(this);
+  String get search => _blink.BlinkURLUtilsReadOnly.$search_Getter(this);
 
   @DomName('URLUtilsReadOnly.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.Native_URLUtilsReadOnly_toString_Callback(this);
+  String toString() => _blink.BlinkURLUtilsReadOnly.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28493,43 +28493,43 @@
 
   @DomName('ValidityState.badInput')
   @DocsEditable()
-  bool get badInput => _blink.Native_ValidityState_badInput_Getter(this);
+  bool get badInput => _blink.BlinkValidityState.$badInput_Getter(this);
 
   @DomName('ValidityState.customError')
   @DocsEditable()
-  bool get customError => _blink.Native_ValidityState_customError_Getter(this);
+  bool get customError => _blink.BlinkValidityState.$customError_Getter(this);
 
   @DomName('ValidityState.patternMismatch')
   @DocsEditable()
-  bool get patternMismatch => _blink.Native_ValidityState_patternMismatch_Getter(this);
+  bool get patternMismatch => _blink.BlinkValidityState.$patternMismatch_Getter(this);
 
   @DomName('ValidityState.rangeOverflow')
   @DocsEditable()
-  bool get rangeOverflow => _blink.Native_ValidityState_rangeOverflow_Getter(this);
+  bool get rangeOverflow => _blink.BlinkValidityState.$rangeOverflow_Getter(this);
 
   @DomName('ValidityState.rangeUnderflow')
   @DocsEditable()
-  bool get rangeUnderflow => _blink.Native_ValidityState_rangeUnderflow_Getter(this);
+  bool get rangeUnderflow => _blink.BlinkValidityState.$rangeUnderflow_Getter(this);
 
   @DomName('ValidityState.stepMismatch')
   @DocsEditable()
-  bool get stepMismatch => _blink.Native_ValidityState_stepMismatch_Getter(this);
+  bool get stepMismatch => _blink.BlinkValidityState.$stepMismatch_Getter(this);
 
   @DomName('ValidityState.tooLong')
   @DocsEditable()
-  bool get tooLong => _blink.Native_ValidityState_tooLong_Getter(this);
+  bool get tooLong => _blink.BlinkValidityState.$tooLong_Getter(this);
 
   @DomName('ValidityState.typeMismatch')
   @DocsEditable()
-  bool get typeMismatch => _blink.Native_ValidityState_typeMismatch_Getter(this);
+  bool get typeMismatch => _blink.BlinkValidityState.$typeMismatch_Getter(this);
 
   @DomName('ValidityState.valid')
   @DocsEditable()
-  bool get valid => _blink.Native_ValidityState_valid_Getter(this);
+  bool get valid => _blink.BlinkValidityState.$valid_Getter(this);
 
   @DomName('ValidityState.valueMissing')
   @DocsEditable()
-  bool get valueMissing => _blink.Native_ValidityState_valueMissing_Getter(this);
+  bool get valueMissing => _blink.BlinkValidityState.$valueMissing_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28554,54 +28554,54 @@
 
   @DomName('HTMLVideoElement.height')
   @DocsEditable()
-  int get height => _blink.Native_HTMLVideoElement_height_Getter(this);
+  int get height => _blink.BlinkHTMLVideoElement.$height_Getter(this);
 
   @DomName('HTMLVideoElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.Native_HTMLVideoElement_height_Setter(this, value);
+  void set height(int value) => _blink.BlinkHTMLVideoElement.$height_Setter(this, value);
 
   @DomName('HTMLVideoElement.poster')
   @DocsEditable()
-  String get poster => _blink.Native_HTMLVideoElement_poster_Getter(this);
+  String get poster => _blink.BlinkHTMLVideoElement.$poster_Getter(this);
 
   @DomName('HTMLVideoElement.poster')
   @DocsEditable()
-  void set poster(String value) => _blink.Native_HTMLVideoElement_poster_Setter(this, value);
+  void set poster(String value) => _blink.BlinkHTMLVideoElement.$poster_Setter(this, value);
 
   @DomName('HTMLVideoElement.videoHeight')
   @DocsEditable()
-  int get videoHeight => _blink.Native_HTMLVideoElement_videoHeight_Getter(this);
+  int get videoHeight => _blink.BlinkHTMLVideoElement.$videoHeight_Getter(this);
 
   @DomName('HTMLVideoElement.videoWidth')
   @DocsEditable()
-  int get videoWidth => _blink.Native_HTMLVideoElement_videoWidth_Getter(this);
+  int get videoWidth => _blink.BlinkHTMLVideoElement.$videoWidth_Getter(this);
 
   @DomName('HTMLVideoElement.webkitDecodedFrameCount')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get decodedFrameCount => _blink.Native_HTMLVideoElement_webkitDecodedFrameCount_Getter(this);
+  int get decodedFrameCount => _blink.BlinkHTMLVideoElement.$webkitDecodedFrameCount_Getter(this);
 
   @DomName('HTMLVideoElement.webkitDroppedFrameCount')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get droppedFrameCount => _blink.Native_HTMLVideoElement_webkitDroppedFrameCount_Getter(this);
+  int get droppedFrameCount => _blink.BlinkHTMLVideoElement.$webkitDroppedFrameCount_Getter(this);
 
   @DomName('HTMLVideoElement.width')
   @DocsEditable()
-  int get width => _blink.Native_HTMLVideoElement_width_Getter(this);
+  int get width => _blink.BlinkHTMLVideoElement.$width_Getter(this);
 
   @DomName('HTMLVideoElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.Native_HTMLVideoElement_width_Setter(this, value);
+  void set width(int value) => _blink.BlinkHTMLVideoElement.$width_Setter(this, value);
 
   @DomName('HTMLVideoElement.getVideoPlaybackQuality')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoPlaybackQuality getVideoPlaybackQuality() => _blink.Native_HTMLVideoElement_getVideoPlaybackQuality_Callback(this);
+  VideoPlaybackQuality getVideoPlaybackQuality() => _blink.BlinkHTMLVideoElement.$getVideoPlaybackQuality_Callback(this);
 
   @DomName('HTMLVideoElement.webkitEnterFullscreen')
   @DocsEditable()
@@ -28609,7 +28609,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  void enterFullscreen() => _blink.Native_HTMLVideoElement_webkitEnterFullscreen_Callback(this);
+  void enterFullscreen() => _blink.BlinkHTMLVideoElement.$webkitEnterFullscreen_Callback(this);
 
   @DomName('HTMLVideoElement.webkitExitFullscreen')
   @DocsEditable()
@@ -28617,7 +28617,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
-  void exitFullscreen() => _blink.Native_HTMLVideoElement_webkitExitFullscreen_Callback(this);
+  void exitFullscreen() => _blink.BlinkHTMLVideoElement.$webkitExitFullscreen_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28637,22 +28637,22 @@
   @DomName('VideoPlaybackQuality.corruptedVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get corruptedVideoFrames => _blink.Native_VideoPlaybackQuality_corruptedVideoFrames_Getter(this);
+  int get corruptedVideoFrames => _blink.BlinkVideoPlaybackQuality.$corruptedVideoFrames_Getter(this);
 
   @DomName('VideoPlaybackQuality.creationTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get creationTime => _blink.Native_VideoPlaybackQuality_creationTime_Getter(this);
+  double get creationTime => _blink.BlinkVideoPlaybackQuality.$creationTime_Getter(this);
 
   @DomName('VideoPlaybackQuality.droppedVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get droppedVideoFrames => _blink.Native_VideoPlaybackQuality_droppedVideoFrames_Getter(this);
+  int get droppedVideoFrames => _blink.BlinkVideoPlaybackQuality.$droppedVideoFrames_Getter(this);
 
   @DomName('VideoPlaybackQuality.totalVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get totalVideoFrames => _blink.Native_VideoPlaybackQuality_totalVideoFrames_Getter(this);
+  int get totalVideoFrames => _blink.BlinkVideoPlaybackQuality.$totalVideoFrames_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28682,92 +28682,92 @@
 
   @DomName('VTTCue.VTTCue')
   @DocsEditable()
-  factory VttCue(num startTime, num endTime, String text) => _blink.Native_VTTCue_VttCue(startTime, endTime, text);
+  factory VttCue(num startTime, num endTime, String text) => _blink.BlinkVTTCue.$mkVttCue(startTime, endTime, text);
 
   @DomName('VTTCue.align')
   @DocsEditable()
   @Experimental() // untriaged
-  String get align => _blink.Native_VTTCue_align_Getter(this);
+  String get align => _blink.BlinkVTTCue.$align_Getter(this);
 
   @DomName('VTTCue.align')
   @DocsEditable()
   @Experimental() // untriaged
-  void set align(String value) => _blink.Native_VTTCue_align_Setter(this, value);
+  void set align(String value) => _blink.BlinkVTTCue.$align_Setter(this, value);
 
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  int get line => _blink.Native_VTTCue_line_Getter(this);
+  int get line => _blink.BlinkVTTCue.$line_Getter(this);
 
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  void set line(int value) => _blink.Native_VTTCue_line_Setter(this, value);
+  void set line(int value) => _blink.BlinkVTTCue.$line_Setter(this, value);
 
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  int get position => _blink.Native_VTTCue_position_Getter(this);
+  int get position => _blink.BlinkVTTCue.$position_Getter(this);
 
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  void set position(int value) => _blink.Native_VTTCue_position_Setter(this, value);
+  void set position(int value) => _blink.BlinkVTTCue.$position_Setter(this, value);
 
   @DomName('VTTCue.regionId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get regionId => _blink.Native_VTTCue_regionId_Getter(this);
+  String get regionId => _blink.BlinkVTTCue.$regionId_Getter(this);
 
   @DomName('VTTCue.regionId')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionId(String value) => _blink.Native_VTTCue_regionId_Setter(this, value);
+  void set regionId(String value) => _blink.BlinkVTTCue.$regionId_Setter(this, value);
 
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size => _blink.Native_VTTCue_size_Getter(this);
+  int get size => _blink.BlinkVTTCue.$size_Getter(this);
 
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  void set size(int value) => _blink.Native_VTTCue_size_Setter(this, value);
+  void set size(int value) => _blink.BlinkVTTCue.$size_Setter(this, value);
 
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get snapToLines => _blink.Native_VTTCue_snapToLines_Getter(this);
+  bool get snapToLines => _blink.BlinkVTTCue.$snapToLines_Getter(this);
 
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
   @Experimental() // untriaged
-  void set snapToLines(bool value) => _blink.Native_VTTCue_snapToLines_Setter(this, value);
+  void set snapToLines(bool value) => _blink.BlinkVTTCue.$snapToLines_Setter(this, value);
 
   @DomName('VTTCue.text')
   @DocsEditable()
   @Experimental() // untriaged
-  String get text => _blink.Native_VTTCue_text_Getter(this);
+  String get text => _blink.BlinkVTTCue.$text_Getter(this);
 
   @DomName('VTTCue.text')
   @DocsEditable()
   @Experimental() // untriaged
-  void set text(String value) => _blink.Native_VTTCue_text_Setter(this, value);
+  void set text(String value) => _blink.BlinkVTTCue.$text_Setter(this, value);
 
   @DomName('VTTCue.vertical')
   @DocsEditable()
   @Experimental() // untriaged
-  String get vertical => _blink.Native_VTTCue_vertical_Getter(this);
+  String get vertical => _blink.BlinkVTTCue.$vertical_Getter(this);
 
   @DomName('VTTCue.vertical')
   @DocsEditable()
   @Experimental() // untriaged
-  void set vertical(String value) => _blink.Native_VTTCue_vertical_Setter(this, value);
+  void set vertical(String value) => _blink.BlinkVTTCue.$vertical_Setter(this, value);
 
   @DomName('VTTCue.getCueAsHTML')
   @DocsEditable()
   @Experimental() // untriaged
-  DocumentFragment getCueAsHtml() => _blink.Native_VTTCue_getCueAsHTML_Callback(this);
+  DocumentFragment getCueAsHtml() => _blink.BlinkVTTCue.$getCueAsHTML_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28786,92 +28786,92 @@
 
   @DomName('VTTRegion.VTTRegion')
   @DocsEditable()
-  factory VttRegion() => _blink.Native_VTTRegion_VttRegion();
+  factory VttRegion() => _blink.BlinkVTTRegion.$mkVttRegion();
 
   @DomName('VTTRegion.height')
   @DocsEditable()
   @Experimental() // untriaged
-  int get height => _blink.Native_VTTRegion_height_Getter(this);
+  int get height => _blink.BlinkVTTRegion.$height_Getter(this);
 
   @DomName('VTTRegion.height')
   @DocsEditable()
   @Experimental() // untriaged
-  void set height(int value) => _blink.Native_VTTRegion_height_Setter(this, value);
+  void set height(int value) => _blink.BlinkVTTRegion.$height_Setter(this, value);
 
   @DomName('VTTRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.Native_VTTRegion_id_Getter(this);
+  String get id => _blink.BlinkVTTRegion.$id_Getter(this);
 
   @DomName('VTTRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  void set id(String value) => _blink.Native_VTTRegion_id_Setter(this, value);
+  void set id(String value) => _blink.BlinkVTTRegion.$id_Setter(this, value);
 
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get regionAnchorX => _blink.Native_VTTRegion_regionAnchorX_Getter(this);
+  num get regionAnchorX => _blink.BlinkVTTRegion.$regionAnchorX_Getter(this);
 
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionAnchorX(num value) => _blink.Native_VTTRegion_regionAnchorX_Setter(this, value);
+  void set regionAnchorX(num value) => _blink.BlinkVTTRegion.$regionAnchorX_Setter(this, value);
 
   @DomName('VTTRegion.regionAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get regionAnchorY => _blink.Native_VTTRegion_regionAnchorY_Getter(this);
+  num get regionAnchorY => _blink.BlinkVTTRegion.$regionAnchorY_Getter(this);
 
   @DomName('VTTRegion.regionAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionAnchorY(num value) => _blink.Native_VTTRegion_regionAnchorY_Setter(this, value);
+  void set regionAnchorY(num value) => _blink.BlinkVTTRegion.$regionAnchorY_Setter(this, value);
 
   @DomName('VTTRegion.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  String get scroll => _blink.Native_VTTRegion_scroll_Getter(this);
+  String get scroll => _blink.BlinkVTTRegion.$scroll_Getter(this);
 
   @DomName('VTTRegion.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  void set scroll(String value) => _blink.Native_VTTRegion_scroll_Setter(this, value);
+  void set scroll(String value) => _blink.BlinkVTTRegion.$scroll_Setter(this, value);
 
   @DomName('VTTRegion.track')
   @DocsEditable()
   @Experimental() // untriaged
-  TextTrack get track => _blink.Native_VTTRegion_track_Getter(this);
+  TextTrack get track => _blink.BlinkVTTRegion.$track_Getter(this);
 
   @DomName('VTTRegion.viewportAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get viewportAnchorX => _blink.Native_VTTRegion_viewportAnchorX_Getter(this);
+  num get viewportAnchorX => _blink.BlinkVTTRegion.$viewportAnchorX_Getter(this);
 
   @DomName('VTTRegion.viewportAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  void set viewportAnchorX(num value) => _blink.Native_VTTRegion_viewportAnchorX_Setter(this, value);
+  void set viewportAnchorX(num value) => _blink.BlinkVTTRegion.$viewportAnchorX_Setter(this, value);
 
   @DomName('VTTRegion.viewportAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get viewportAnchorY => _blink.Native_VTTRegion_viewportAnchorY_Getter(this);
+  num get viewportAnchorY => _blink.BlinkVTTRegion.$viewportAnchorY_Getter(this);
 
   @DomName('VTTRegion.viewportAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  void set viewportAnchorY(num value) => _blink.Native_VTTRegion_viewportAnchorY_Setter(this, value);
+  void set viewportAnchorY(num value) => _blink.BlinkVTTRegion.$viewportAnchorY_Setter(this, value);
 
   @DomName('VTTRegion.width')
   @DocsEditable()
   @Experimental() // untriaged
-  num get width => _blink.Native_VTTRegion_width_Getter(this);
+  num get width => _blink.BlinkVTTRegion.$width_Getter(this);
 
   @DomName('VTTRegion.width')
   @DocsEditable()
   @Experimental() // untriaged
-  void set width(num value) => _blink.Native_VTTRegion_width_Setter(this, value);
+  void set width(num value) => _blink.BlinkVTTRegion.$width_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28891,17 +28891,17 @@
   @DomName('VTTRegionList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.Native_VTTRegionList_length_Getter(this);
+  int get length => _blink.BlinkVTTRegionList.$length_Getter(this);
 
   @DomName('VTTRegionList.getRegionById')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion getRegionById(String id) => _blink.Native_VTTRegionList_getRegionById_Callback(this, id);
+  VttRegion getRegionById(String id) => _blink.BlinkVTTRegionList.$getRegionById_Callback(this, id);
 
   @DomName('VTTRegionList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion item(int index) => _blink.Native_VTTRegionList_item_Callback(this, index);
+  VttRegion item(int index) => _blink.BlinkVTTRegionList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28998,7 +28998,7 @@
 
   @DomName('WebSocket.WebSocket')
   @DocsEditable()
-  factory WebSocket(String url, [protocol_OR_protocols]) => _blink.Native_WebSocket_WebSocket(url, protocol_OR_protocols);
+  factory WebSocket(String url, [protocol_OR_protocols]) => _blink.BlinkWebSocket.$mkWebSocket(url, protocol_OR_protocols);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
@@ -29021,51 +29021,51 @@
 
   @DomName('WebSocket.binaryType')
   @DocsEditable()
-  String get binaryType => _blink.Native_WebSocket_binaryType_Getter(this);
+  String get binaryType => _blink.BlinkWebSocket.$binaryType_Getter(this);
 
   @DomName('WebSocket.binaryType')
   @DocsEditable()
-  void set binaryType(String value) => _blink.Native_WebSocket_binaryType_Setter(this, value);
+  void set binaryType(String value) => _blink.BlinkWebSocket.$binaryType_Setter(this, value);
 
   @DomName('WebSocket.bufferedAmount')
   @DocsEditable()
-  int get bufferedAmount => _blink.Native_WebSocket_bufferedAmount_Getter(this);
+  int get bufferedAmount => _blink.BlinkWebSocket.$bufferedAmount_Getter(this);
 
   @DomName('WebSocket.extensions')
   @DocsEditable()
-  String get extensions => _blink.Native_WebSocket_extensions_Getter(this);
+  String get extensions => _blink.BlinkWebSocket.$extensions_Getter(this);
 
   @DomName('WebSocket.protocol')
   @DocsEditable()
-  String get protocol => _blink.Native_WebSocket_protocol_Getter(this);
+  String get protocol => _blink.BlinkWebSocket.$protocol_Getter(this);
 
   @DomName('WebSocket.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_WebSocket_readyState_Getter(this);
+  int get readyState => _blink.BlinkWebSocket.$readyState_Getter(this);
 
   @DomName('WebSocket.url')
   @DocsEditable()
-  String get url => _blink.Native_WebSocket_url_Getter(this);
+  String get url => _blink.BlinkWebSocket.$url_Getter(this);
 
-  void close([int code, String reason]) => _blink.Native_WebSocket_close(this, code, reason);
+  void close([int code, String reason]) => _blink.BlinkWebSocket.$close(this, code, reason);
 
-  void send(data) => _blink.Native_WebSocket_send(this, data);
+  void send(data) => _blink.BlinkWebSocket.$send(this, data);
 
   @DomName('WebSocket.sendBlob')
   @DocsEditable()
-  void sendBlob(Blob data) => _blink.Native_WebSocket_sendBlob_Callback(this, data);
+  void sendBlob(Blob data) => _blink.BlinkWebSocket.$sendBlob_Callback(this, data);
 
   @DomName('WebSocket.sendByteBuffer')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) => _blink.Native_WebSocket_sendByteBuffer_Callback(this, data);
+  void sendByteBuffer(ByteBuffer data) => _blink.BlinkWebSocket.$sendByteBuffer_Callback(this, data);
 
   @DomName('WebSocket.sendString')
   @DocsEditable()
-  void sendString(String data) => _blink.Native_WebSocket_sendString_Callback(this, data);
+  void sendString(String data) => _blink.BlinkWebSocket.$sendString_Callback(this, data);
 
   @DomName('WebSocket.sendTypedData')
   @DocsEditable()
-  void sendTypedData(TypedData data) => _blink.Native_WebSocket_sendTypedData_Callback(this, data);
+  void sendTypedData(TypedData data) => _blink.BlinkWebSocket.$sendTypedData_Callback(this, data);
 
   /// Stream of `close` events handled by this [WebSocket].
   @DomName('WebSocket.onclose')
@@ -29144,44 +29144,44 @@
 
   @DomName('WheelEvent.deltaMode')
   @DocsEditable()
-  int get deltaMode => _blink.Native_WheelEvent_deltaMode_Getter(this);
+  int get deltaMode => _blink.BlinkWheelEvent.$deltaMode_Getter(this);
 
   @DomName('WheelEvent.deltaX')
   @DocsEditable()
   @Experimental() // untriaged
-  double get _deltaX => _blink.Native_WheelEvent_deltaX_Getter(this);
+  double get _deltaX => _blink.BlinkWheelEvent.$deltaX_Getter(this);
 
   @DomName('WheelEvent.deltaY')
   @DocsEditable()
   @Experimental() // untriaged
-  double get _deltaY => _blink.Native_WheelEvent_deltaY_Getter(this);
+  double get _deltaY => _blink.BlinkWheelEvent.$deltaY_Getter(this);
 
   @DomName('WheelEvent.deltaZ')
   @DocsEditable()
   @Experimental() // untriaged
-  double get deltaZ => _blink.Native_WheelEvent_deltaZ_Getter(this);
+  double get deltaZ => _blink.BlinkWheelEvent.$deltaZ_Getter(this);
 
   @DomName('WheelEvent.webkitDirectionInvertedFromDevice')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  bool get directionInvertedFromDevice => _blink.Native_WheelEvent_webkitDirectionInvertedFromDevice_Getter(this);
+  bool get directionInvertedFromDevice => _blink.BlinkWheelEvent.$webkitDirectionInvertedFromDevice_Getter(this);
 
   @DomName('WheelEvent.wheelDeltaX')
   @DocsEditable()
   @Experimental() // non-standard
-  int get wheelDeltaX => _blink.Native_WheelEvent_wheelDeltaX_Getter(this);
+  int get wheelDeltaX => _blink.BlinkWheelEvent.$wheelDeltaX_Getter(this);
 
   @DomName('WheelEvent.wheelDeltaY')
   @DocsEditable()
   @Experimental() // non-standard
-  int get wheelDeltaY => _blink.Native_WheelEvent_wheelDeltaY_Getter(this);
+  int get wheelDeltaY => _blink.BlinkWheelEvent.$wheelDeltaY_Getter(this);
 
   @DomName('WheelEvent.initWebKitWheelEvent')
   @DocsEditable()
   @Experimental()
-  void _initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.Native_WheelEvent_initWebKitWheelEvent_Callback(this, wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
+  void _initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkWheelEvent.$initWebKitWheelEvent_Callback(this, wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
 
 
   /**
@@ -29555,7 +29555,7 @@
    */
   @DomName('Window.CSS')
   @DocsEditable()
-  Css get css => _blink.Native_Window_CSS_Getter(this);
+  Css get css => _blink.BlinkWindow.$CSS_Getter(this);
 
   /**
    * The application cache for this window.
@@ -29570,15 +29570,15 @@
    */
   @DomName('Window.applicationCache')
   @DocsEditable()
-  ApplicationCache get applicationCache => _blink.Native_Window_applicationCache_Getter(this);
+  ApplicationCache get applicationCache => _blink.BlinkWindow.$applicationCache_Getter(this);
 
   @DomName('Window.closed')
   @DocsEditable()
-  bool get closed => _blink.Native_Window_closed_Getter(this);
+  bool get closed => _blink.BlinkWindow.$closed_Getter(this);
 
   @DomName('Window.console')
   @DocsEditable()
-  Console get console => _blink.Native_Window_console_Getter(this);
+  Console get console => _blink.BlinkWindow.$console_Getter(this);
 
   /**
    * Entrypoint for the browser's cryptographic functions.
@@ -29591,31 +29591,31 @@
   @DocsEditable()
   // http://www.w3.org/TR/WebCryptoAPI/
   @Experimental()
-  Crypto get crypto => _blink.Native_Window_crypto_Getter(this);
+  Crypto get crypto => _blink.BlinkWindow.$crypto_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
   @Experimental() // non-standard
-  String get defaultStatus => _blink.Native_Window_defaultStatus_Getter(this);
+  String get defaultStatus => _blink.BlinkWindow.$defaultStatus_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
   @Experimental() // non-standard
-  void set defaultStatus(String value) => _blink.Native_Window_defaultStatus_Setter(this, value);
+  void set defaultStatus(String value) => _blink.BlinkWindow.$defaultStatus_Setter(this, value);
 
   /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
-  String get defaultstatus => _blink.Native_Window_defaultstatus_Getter(this);
+  String get defaultstatus => _blink.BlinkWindow.$defaultstatus_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
-  void set defaultstatus(String value) => _blink.Native_Window_defaultstatus_Setter(this, value);
+  void set defaultstatus(String value) => _blink.BlinkWindow.$defaultstatus_Setter(this, value);
 
   /**
    * The ratio between physical pixels and logical CSS pixels.
@@ -29633,11 +29633,11 @@
   @DocsEditable()
   // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
   @Experimental() // non-standard
-  double get devicePixelRatio => _blink.Native_Window_devicePixelRatio_Getter(this);
+  double get devicePixelRatio => _blink.BlinkWindow.$devicePixelRatio_Getter(this);
 
   @DomName('Window.document')
   @DocsEditable()
-  Document get document => _blink.Native_Window_document_Getter(this);
+  Document get document => _blink.BlinkWindow.$document_Getter(this);
 
   /**
    * The current session history for this window's newest document.
@@ -29650,7 +29650,7 @@
    */
   @DomName('Window.history')
   @DocsEditable()
-  History get history => _blink.Native_Window_history_Getter(this);
+  History get history => _blink.BlinkWindow.$history_Getter(this);
 
   @DomName('Window.indexedDB')
   @DocsEditable()
@@ -29658,7 +29658,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @Experimental()
-  IdbFactory get indexedDB => _blink.Native_Window_indexedDB_Getter(this);
+  IdbFactory get indexedDB => _blink.BlinkWindow.$indexedDB_Getter(this);
 
   /**
    * The height of the viewport including scrollbars.
@@ -29671,7 +29671,7 @@
    */
   @DomName('Window.innerHeight')
   @DocsEditable()
-  int get innerHeight => _blink.Native_Window_innerHeight_Getter(this);
+  int get innerHeight => _blink.BlinkWindow.$innerHeight_Getter(this);
 
   /**
    * The width of the viewport including scrollbars.
@@ -29684,7 +29684,7 @@
    */
   @DomName('Window.innerWidth')
   @DocsEditable()
-  int get innerWidth => _blink.Native_Window_innerWidth_Getter(this);
+  int get innerWidth => _blink.BlinkWindow.$innerWidth_Getter(this);
 
   /**
    * Storage for this window that persists across sessions.
@@ -29701,11 +29701,11 @@
    */
   @DomName('Window.localStorage')
   @DocsEditable()
-  Storage get localStorage => _blink.Native_Window_localStorage_Getter(this);
+  Storage get localStorage => _blink.BlinkWindow.$localStorage_Getter(this);
 
   @DomName('Window.location')
   @DocsEditable()
-  Location get location => _blink.Native_Window_location_Getter(this);
+  Location get location => _blink.BlinkWindow.$location_Getter(this);
 
   /**
    * This window's location bar, which displays the URL.
@@ -29718,7 +29718,7 @@
    */
   @DomName('Window.locationbar')
   @DocsEditable()
-  BarProp get locationbar => _blink.Native_Window_locationbar_Getter(this);
+  BarProp get locationbar => _blink.BlinkWindow.$locationbar_Getter(this);
 
   /**
    * This window's menu bar, which displays menu commands.
@@ -29731,7 +29731,7 @@
    */
   @DomName('Window.menubar')
   @DocsEditable()
-  BarProp get menubar => _blink.Native_Window_menubar_Getter(this);
+  BarProp get menubar => _blink.BlinkWindow.$menubar_Getter(this);
 
   /**
    * The name of this window.
@@ -29744,7 +29744,7 @@
    */
   @DomName('Window.name')
   @DocsEditable()
-  String get name => _blink.Native_Window_name_Getter(this);
+  String get name => _blink.BlinkWindow.$name_Getter(this);
 
   /**
    * The name of this window.
@@ -29757,7 +29757,7 @@
    */
   @DomName('Window.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_Window_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkWindow.$name_Setter(this, value);
 
   /**
    * The user agent accessing this window.
@@ -29770,7 +29770,7 @@
    */
   @DomName('Window.navigator')
   @DocsEditable()
-  Navigator get navigator => _blink.Native_Window_navigator_Getter(this);
+  Navigator get navigator => _blink.BlinkWindow.$navigator_Getter(this);
 
   /**
    * Whether objects are drawn offscreen before being displayed.
@@ -29784,20 +29784,20 @@
   @DomName('Window.offscreenBuffering')
   @DocsEditable()
   @Experimental() // non-standard
-  bool get offscreenBuffering => _blink.Native_Window_offscreenBuffering_Getter(this);
+  bool get offscreenBuffering => _blink.BlinkWindow.$offscreenBuffering_Getter(this);
 
   @DomName('Window.opener')
   @DocsEditable()
-  WindowBase get opener => _blink.Native_Window_opener_Getter(this);
+  WindowBase get opener => _blink.BlinkWindow.$opener_Getter(this);
 
   @DomName('Window.opener')
   @DocsEditable()
-  void set opener(Window value) => _blink.Native_Window_opener_Setter(this, value);
+  void set opener(Window value) => _blink.BlinkWindow.$opener_Setter(this, value);
 
   @DomName('Window.orientation')
   @DocsEditable()
   @Experimental() // untriaged
-  int get orientation => _blink.Native_Window_orientation_Getter(this);
+  int get orientation => _blink.BlinkWindow.$orientation_Getter(this);
 
   /**
    * The height of this window including all user interface elements.
@@ -29810,7 +29810,7 @@
    */
   @DomName('Window.outerHeight')
   @DocsEditable()
-  int get outerHeight => _blink.Native_Window_outerHeight_Getter(this);
+  int get outerHeight => _blink.BlinkWindow.$outerHeight_Getter(this);
 
   /**
    * The width of the window including all user interface elements.
@@ -29823,7 +29823,7 @@
    */
   @DomName('Window.outerWidth')
   @DocsEditable()
-  int get outerWidth => _blink.Native_Window_outerWidth_Getter(this);
+  int get outerWidth => _blink.BlinkWindow.$outerWidth_Getter(this);
 
   /**
    * The distance this window has been scrolled horizontally.
@@ -29839,7 +29839,7 @@
    */
   @DomName('Window.pageXOffset')
   @DocsEditable()
-  int get pageXOffset => _blink.Native_Window_pageXOffset_Getter(this);
+  int get pageXOffset => _blink.BlinkWindow.$pageXOffset_Getter(this);
 
   /**
    * The distance this window has been scrolled vertically.
@@ -29855,11 +29855,11 @@
    */
   @DomName('Window.pageYOffset')
   @DocsEditable()
-  int get pageYOffset => _blink.Native_Window_pageYOffset_Getter(this);
+  int get pageYOffset => _blink.BlinkWindow.$pageYOffset_Getter(this);
 
   @DomName('Window.parent')
   @DocsEditable()
-  WindowBase get parent => _blink.Native_Window_parent_Getter(this);
+  WindowBase get parent => _blink.BlinkWindow.$parent_Getter(this);
 
   /**
    * Timing and navigation data for this window.
@@ -29877,7 +29877,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE)
-  Performance get performance => _blink.Native_Window_performance_Getter(this);
+  Performance get performance => _blink.BlinkWindow.$performance_Getter(this);
 
   /**
    * Information about the screen displaying this window.
@@ -29889,7 +29889,7 @@
    */
   @DomName('Window.screen')
   @DocsEditable()
-  Screen get screen => _blink.Native_Window_screen_Getter(this);
+  Screen get screen => _blink.BlinkWindow.$screen_Getter(this);
 
   /**
    * The distance from the left side of the screen to the left side of this
@@ -29902,7 +29902,7 @@
    */
   @DomName('Window.screenLeft')
   @DocsEditable()
-  int get screenLeft => _blink.Native_Window_screenLeft_Getter(this);
+  int get screenLeft => _blink.BlinkWindow.$screenLeft_Getter(this);
 
   /**
    * The distance from the top of the screen to the top of this window.
@@ -29914,7 +29914,7 @@
    */
   @DomName('Window.screenTop')
   @DocsEditable()
-  int get screenTop => _blink.Native_Window_screenTop_Getter(this);
+  int get screenTop => _blink.BlinkWindow.$screenTop_Getter(this);
 
   /**
    * The distance from the left side of the screen to the mouse pointer.
@@ -29926,7 +29926,7 @@
    */
   @DomName('Window.screenX')
   @DocsEditable()
-  int get screenX => _blink.Native_Window_screenX_Getter(this);
+  int get screenX => _blink.BlinkWindow.$screenX_Getter(this);
 
   /**
    * The distance from the top of the screen to the mouse pointer.
@@ -29938,15 +29938,15 @@
    */
   @DomName('Window.screenY')
   @DocsEditable()
-  int get screenY => _blink.Native_Window_screenY_Getter(this);
+  int get screenY => _blink.BlinkWindow.$screenY_Getter(this);
 
   @DomName('Window.scrollX')
   @DocsEditable()
-  int get scrollX => _blink.Native_Window_scrollX_Getter(this);
+  int get scrollX => _blink.BlinkWindow.$scrollX_Getter(this);
 
   @DomName('Window.scrollY')
   @DocsEditable()
-  int get scrollY => _blink.Native_Window_scrollY_Getter(this);
+  int get scrollY => _blink.BlinkWindow.$scrollY_Getter(this);
 
   /**
    * This window's scroll bars.
@@ -29959,7 +29959,7 @@
    */
   @DomName('Window.scrollbars')
   @DocsEditable()
-  BarProp get scrollbars => _blink.Native_Window_scrollbars_Getter(this);
+  BarProp get scrollbars => _blink.BlinkWindow.$scrollbars_Getter(this);
 
   /**
    * The current window.
@@ -29971,7 +29971,7 @@
    */
   @DomName('Window.self')
   @DocsEditable()
-  WindowBase get self => _blink.Native_Window_self_Getter(this);
+  WindowBase get self => _blink.BlinkWindow.$self_Getter(this);
 
   /**
    * Storage for this window that is cleared when this session ends.
@@ -29988,7 +29988,7 @@
    */
   @DomName('Window.sessionStorage')
   @DocsEditable()
-  Storage get sessionStorage => _blink.Native_Window_sessionStorage_Getter(this);
+  Storage get sessionStorage => _blink.BlinkWindow.$sessionStorage_Getter(this);
 
   /**
    * Access to speech synthesis in the browser.
@@ -30003,17 +30003,17 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
   @Experimental()
-  SpeechSynthesis get speechSynthesis => _blink.Native_Window_speechSynthesis_Getter(this);
+  SpeechSynthesis get speechSynthesis => _blink.BlinkWindow.$speechSynthesis_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
-  String get status => _blink.Native_Window_status_Getter(this);
+  String get status => _blink.BlinkWindow.$status_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
-  void set status(String value) => _blink.Native_Window_status_Setter(this, value);
+  void set status(String value) => _blink.BlinkWindow.$status_Setter(this, value);
 
   /**
    * This window's status bar.
@@ -30026,7 +30026,7 @@
    */
   @DomName('Window.statusbar')
   @DocsEditable()
-  BarProp get statusbar => _blink.Native_Window_statusbar_Getter(this);
+  BarProp get statusbar => _blink.BlinkWindow.$statusbar_Getter(this);
 
   /**
    * Access to CSS media queries.
@@ -30041,7 +30041,7 @@
   @DocsEditable()
   // http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
   @Experimental() // nonstandard
-  StyleMedia get styleMedia => _blink.Native_Window_styleMedia_Getter(this);
+  StyleMedia get styleMedia => _blink.BlinkWindow.$styleMedia_Getter(this);
 
   /**
    * This window's tool bar.
@@ -30054,11 +30054,11 @@
    */
   @DomName('Window.toolbar')
   @DocsEditable()
-  BarProp get toolbar => _blink.Native_Window_toolbar_Getter(this);
+  BarProp get toolbar => _blink.BlinkWindow.$toolbar_Getter(this);
 
   @DomName('Window.top')
   @DocsEditable()
-  WindowBase get top => _blink.Native_Window_top_Getter(this);
+  WindowBase get top => _blink.BlinkWindow.$top_Getter(this);
 
   /**
    * The current window.
@@ -30070,9 +30070,9 @@
    */
   @DomName('Window.window')
   @DocsEditable()
-  WindowBase get window => _blink.Native_Window_window_Getter(this);
+  WindowBase get window => _blink.BlinkWindow.$window_Getter(this);
 
-  WindowBase __getter__(index_OR_name) => _blink.Native_Window___getter__(this, index_OR_name);
+  WindowBase __getter__(index_OR_name) => _blink.BlinkWindow.$__getter__(this, index_OR_name);
 
   /**
    * Displays a modal alert to the user.
@@ -30085,15 +30085,15 @@
    */
   @DomName('Window.alert')
   @DocsEditable()
-  void alert(String message) => _blink.Native_Window_alert_Callback(this, message);
+  void alert(String message) => _blink.BlinkWindow.$alert_Callback(this, message);
 
   @DomName('Window.cancelAnimationFrame')
   @DocsEditable()
-  void cancelAnimationFrame(int id) => _blink.Native_Window_cancelAnimationFrame_Callback(this, id);
+  void cancelAnimationFrame(int id) => _blink.BlinkWindow.$cancelAnimationFrame_Callback(this, id);
 
   @DomName('Window.close')
   @DocsEditable()
-  void close() => _blink.Native_Window_close_Callback(this);
+  void close() => _blink.BlinkWindow.$close_Callback(this);
 
   /**
    * Displays a modal OK/Cancel prompt to the user.
@@ -30106,7 +30106,7 @@
    */
   @DomName('Window.confirm')
   @DocsEditable()
-  bool confirm(String message) => _blink.Native_Window_confirm_Callback(this, message);
+  bool confirm(String message) => _blink.BlinkWindow.$confirm_Callback(this, message);
 
   /**
    * Finds text in this window.
@@ -30119,11 +30119,11 @@
   @DomName('Window.find')
   @DocsEditable()
   @Experimental() // non-standard
-  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) => _blink.Native_Window_find_Callback(this, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog);
+  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) => _blink.BlinkWindow.$find_Callback(this, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog);
 
   @DomName('Window.getComputedStyle')
   @DocsEditable()
-  CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) => _blink.Native_Window_getComputedStyle_Callback(this, element, pseudoElement);
+  CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) => _blink.BlinkWindow.$getComputedStyle_Callback(this, element, pseudoElement);
 
   /**
    * Returns all CSS rules that apply to the element's pseudo-element.
@@ -30131,7 +30131,7 @@
   @DomName('Window.getMatchedCSSRules')
   @DocsEditable()
   @Experimental() // non-standard
-  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) => _blink.Native_Window_getMatchedCSSRules_Callback(this, element, pseudoElement);
+  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) => _blink.BlinkWindow.$getMatchedCSSRules_Callback(this, element, pseudoElement);
 
   /**
    * Returns the currently selected text.
@@ -30144,7 +30144,7 @@
    */
   @DomName('Window.getSelection')
   @DocsEditable()
-  Selection getSelection() => _blink.Native_Window_getSelection_Callback(this);
+  Selection getSelection() => _blink.BlinkWindow.$getSelection_Callback(this);
 
   /**
    * Returns a list of media queries for the given query string.
@@ -30159,7 +30159,7 @@
    */
   @DomName('Window.matchMedia')
   @DocsEditable()
-  MediaQueryList matchMedia(String query) => _blink.Native_Window_matchMedia_Callback(this, query);
+  MediaQueryList matchMedia(String query) => _blink.BlinkWindow.$matchMedia_Callback(this, query);
 
   /**
    * Moves this window.
@@ -30175,15 +30175,15 @@
    */
   @DomName('Window.moveBy')
   @DocsEditable()
-  void moveBy(num x, num y) => _blink.Native_Window_moveBy_Callback(this, x, y);
+  void moveBy(num x, num y) => _blink.BlinkWindow.$moveBy_Callback(this, x, y);
 
   @DomName('Window.moveTo')
   @DocsEditable()
-  void _moveTo(num x, num y) => _blink.Native_Window_moveTo_Callback(this, x, y);
+  void _moveTo(num x, num y) => _blink.BlinkWindow.$moveTo_Callback(this, x, y);
 
   @DomName('Window.open')
   @DocsEditable()
-  WindowBase open(String url, String name, [String options]) => _blink.Native_Window_open_Callback(this, url, name, options);
+  WindowBase open(String url, String name, [String options]) => _blink.BlinkWindow.$open_Callback(this, url, name, options);
 
   /// *Deprecated.*
   @DomName('Window.openDatabase')
@@ -30193,11 +30193,11 @@
   @Experimental()
   // http://www.w3.org/TR/webdatabase/
   @Experimental() // deprecated
-  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.Native_Window_openDatabase_Callback(this, name, version, displayName, estimatedSize, creationCallback);
+  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.BlinkWindow.$openDatabase_Callback(this, name, version, displayName, estimatedSize, creationCallback);
 
   @DomName('Window.postMessage')
   @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List<MessagePort> messagePorts]) => _blink.Native_Window_postMessage_Callback(this, message, targetOrigin, messagePorts);
+  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List<MessagePort> messagePorts]) => _blink.BlinkWindow.$postMessage_Callback(this, message, targetOrigin, messagePorts);
 
   /**
    * Opens the print dialog for this window.
@@ -30209,11 +30209,11 @@
    */
   @DomName('Window.print')
   @DocsEditable()
-  void print() => _blink.Native_Window_print_Callback(this);
+  void print() => _blink.BlinkWindow.$print_Callback(this);
 
   @DomName('Window.requestAnimationFrame')
   @DocsEditable()
-  int _requestAnimationFrame(RequestAnimationFrameCallback callback) => _blink.Native_Window_requestAnimationFrame_Callback(this, callback);
+  int _requestAnimationFrame(RequestAnimationFrameCallback callback) => _blink.BlinkWindow.$requestAnimationFrame_Callback(this, callback);
 
   /**
    * Resizes this window by an offset.
@@ -30225,7 +30225,7 @@
    */
   @DomName('Window.resizeBy')
   @DocsEditable()
-  void resizeBy(num x, num y) => _blink.Native_Window_resizeBy_Callback(this, x, y);
+  void resizeBy(num x, num y) => _blink.BlinkWindow.$resizeBy_Callback(this, x, y);
 
   /**
    * Resizes this window to a specific width and height.
@@ -30237,7 +30237,7 @@
    */
   @DomName('Window.resizeTo')
   @DocsEditable()
-  void resizeTo(num width, num height) => _blink.Native_Window_resizeTo_Callback(this, width, height);
+  void resizeTo(num width, num height) => _blink.BlinkWindow.$resizeTo_Callback(this, width, height);
 
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -30251,7 +30251,7 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void scroll(int x, int y, [Map scrollOptions]) => _blink.Native_Window_scroll_Callback(this, x, y, scrollOptions);
+  void scroll(int x, int y, [Map scrollOptions]) => _blink.BlinkWindow.$scroll_Callback(this, x, y, scrollOptions);
 
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -30263,7 +30263,7 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void scrollBy(int x, int y, [Map scrollOptions]) => _blink.Native_Window_scrollBy_Callback(this, x, y, scrollOptions);
+  void scrollBy(int x, int y, [Map scrollOptions]) => _blink.BlinkWindow.$scrollBy_Callback(this, x, y, scrollOptions);
 
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -30277,7 +30277,7 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void scrollTo(int x, int y, [Map scrollOptions]) => _blink.Native_Window_scrollTo_Callback(this, x, y, scrollOptions);
+  void scrollTo(int x, int y, [Map scrollOptions]) => _blink.BlinkWindow.$scrollTo_Callback(this, x, y, scrollOptions);
 
   /**
    * Opens a new page as a modal dialog.
@@ -30290,7 +30290,7 @@
    */
   @DomName('Window.showModalDialog')
   @DocsEditable()
-  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) => _blink.Native_Window_showModalDialog_Callback(this, url, dialogArgs, featureArgs);
+  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) => _blink.BlinkWindow.$showModalDialog_Callback(this, url, dialogArgs, featureArgs);
 
   /**
    * Stops the window from loading.
@@ -30303,11 +30303,11 @@
    */
   @DomName('Window.stop')
   @DocsEditable()
-  void stop() => _blink.Native_Window_stop_Callback(this);
+  void stop() => _blink.BlinkWindow.$stop_Callback(this);
 
   @DomName('Window.toString')
   @DocsEditable()
-  String toString() => _blink.Native_Window_toString_Callback(this);
+  String toString() => _blink.BlinkWindow.$toString_Callback(this);
 
   @DomName('Window.webkitConvertPointFromNodeToPage')
   @DocsEditable()
@@ -30315,7 +30315,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html
-  _DomPoint _convertPointFromNodeToPage(Node node, _DomPoint p) => _blink.Native_Window_webkitConvertPointFromNodeToPage_Callback(this, node, p);
+  _DomPoint _convertPointFromNodeToPage(Node node, _DomPoint p) => _blink.BlinkWindow.$webkitConvertPointFromNodeToPage_Callback(this, node, p);
 
   @DomName('Window.webkitConvertPointFromPageToNode')
   @DocsEditable()
@@ -30323,14 +30323,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html
-  _DomPoint _convertPointFromPageToNode(Node node, _DomPoint p) => _blink.Native_Window_webkitConvertPointFromPageToNode_Callback(this, node, p);
+  _DomPoint _convertPointFromPageToNode(Node node, _DomPoint p) => _blink.BlinkWindow.$webkitConvertPointFromPageToNode_Callback(this, node, p);
 
   @DomName('Window.webkitRequestFileSystem')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
-  void __requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_Window_webkitRequestFileSystem_Callback(this, type, size, successCallback, errorCallback);
+  void __requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkWindow.$webkitRequestFileSystem_Callback(this, type, size, successCallback, errorCallback);
 
   Future<FileSystem> _requestFileSystem(int type, int size) {
     var completer = new Completer<FileSystem>();
@@ -30354,7 +30354,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
-  void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_Window_webkitResolveLocalFileSystemURL_Callback(this, url, successCallback, errorCallback);
+  void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkWindow.$webkitResolveLocalFileSystemURL_Callback(this, url, successCallback, errorCallback);
 
   Future<Entry> resolveLocalFileSystemUrl(String url) {
     var completer = new Completer<Entry>();
@@ -30366,27 +30366,27 @@
 
   @DomName('Window.atob')
   @DocsEditable()
-  String atob(String string) => _blink.Native_Window_atob_Callback(this, string);
+  String atob(String string) => _blink.BlinkWindow.$atob_Callback(this, string);
 
   @DomName('Window.btoa')
   @DocsEditable()
-  String btoa(String string) => _blink.Native_Window_btoa_Callback(this, string);
+  String btoa(String string) => _blink.BlinkWindow.$btoa_Callback(this, string);
 
   @DomName('Window.clearInterval')
   @DocsEditable()
-  void _clearInterval(int handle) => _blink.Native_Window_clearInterval_Callback(this, handle);
+  void _clearInterval(int handle) => _blink.BlinkWindow.$clearInterval_Callback(this, handle);
 
   @DomName('Window.clearTimeout')
   @DocsEditable()
-  void _clearTimeout(int handle) => _blink.Native_Window_clearTimeout_Callback(this, handle);
+  void _clearTimeout(int handle) => _blink.BlinkWindow.$clearTimeout_Callback(this, handle);
 
   @DomName('Window.setInterval')
   @DocsEditable()
-  int _setInterval(Object handler, int timeout) => _blink.Native_Window_setInterval_Callback(this, handler, timeout);
+  int _setInterval(Object handler, int timeout) => _blink.BlinkWindow.$setInterval_Callback(this, handler, timeout);
 
   @DomName('Window.setTimeout')
   @DocsEditable()
-  int _setTimeout(Object handler, int timeout) => _blink.Native_Window_setTimeout_Callback(this, handler, timeout);
+  int _setTimeout(Object handler, int timeout) => _blink.BlinkWindow.$setTimeout_Callback(this, handler, timeout);
 
   /// Stream of `contentloaded` events handled by this [Window].
   @DomName('Window.onDOMContentLoaded')
@@ -30757,12 +30757,12 @@
   @DomName('WindowBase64.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String string) => _blink.Native_WindowBase64_atob_Callback(this, string);
+  String atob(String string) => _blink.BlinkWindowBase64.$atob_Callback(this, string);
 
   @DomName('WindowBase64.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String string) => _blink.Native_WindowBase64_btoa_Callback(this, string);
+  String btoa(String string) => _blink.BlinkWindowBase64.$btoa_Callback(this, string);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30889,18 +30889,18 @@
 
   @DomName('Worker.Worker')
   @DocsEditable()
-  factory Worker(String scriptUrl) => _blink.Native_Worker_Worker(scriptUrl);
+  factory Worker(String scriptUrl) => _blink.BlinkWorker.$mkWorker(scriptUrl);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('Worker.postMessage')
   @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> messagePorts]) => _blink.Native_Worker_postMessage_Callback(this, message, messagePorts);
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> messagePorts]) => _blink.BlinkWorker.$postMessage_Callback(this, message, messagePorts);
 
   @DomName('Worker.terminate')
   @DocsEditable()
-  void terminate() => _blink.Native_Worker_terminate_Callback(this);
+  void terminate() => _blink.BlinkWorker.$terminate_Callback(this);
 
   /// Stream of `error` events handled by this [Worker].
   @DomName('Worker.onerror')
@@ -30982,57 +30982,57 @@
   @DomName('WorkerGlobalScope.console')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerConsole get console => _blink.Native_WorkerGlobalScope_console_Getter(this);
+  WorkerConsole get console => _blink.BlinkWorkerGlobalScope.$console_Getter(this);
 
   @DomName('WorkerGlobalScope.crypto')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerCrypto get crypto => _blink.Native_WorkerGlobalScope_crypto_Getter(this);
+  WorkerCrypto get crypto => _blink.BlinkWorkerGlobalScope.$crypto_Getter(this);
 
   @DomName('WorkerGlobalScope.indexedDB')
   @DocsEditable()
   @Experimental() // untriaged
-  IdbFactory get indexedDB => _blink.Native_WorkerGlobalScope_indexedDB_Getter(this);
+  IdbFactory get indexedDB => _blink.BlinkWorkerGlobalScope.$indexedDB_Getter(this);
 
   @DomName('WorkerGlobalScope.location')
   @DocsEditable()
   @Experimental() // untriaged
-  _WorkerLocation get location => _blink.Native_WorkerGlobalScope_location_Getter(this);
+  _WorkerLocation get location => _blink.BlinkWorkerGlobalScope.$location_Getter(this);
 
   @DomName('WorkerGlobalScope.navigator')
   @DocsEditable()
   @Experimental() // untriaged
-  _WorkerNavigator get navigator => _blink.Native_WorkerGlobalScope_navigator_Getter(this);
+  _WorkerNavigator get navigator => _blink.BlinkWorkerGlobalScope.$navigator_Getter(this);
 
   @DomName('WorkerGlobalScope.performance')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerPerformance get performance => _blink.Native_WorkerGlobalScope_performance_Getter(this);
+  WorkerPerformance get performance => _blink.BlinkWorkerGlobalScope.$performance_Getter(this);
 
   @DomName('WorkerGlobalScope.self')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerGlobalScope get self => _blink.Native_WorkerGlobalScope_self_Getter(this);
+  WorkerGlobalScope get self => _blink.BlinkWorkerGlobalScope.$self_Getter(this);
 
   @DomName('WorkerGlobalScope.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() => _blink.Native_WorkerGlobalScope_close_Callback(this);
+  void close() => _blink.BlinkWorkerGlobalScope.$close_Callback(this);
 
   @DomName('WorkerGlobalScope.openDatabase')
   @DocsEditable()
   @Experimental() // untriaged
-  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.Native_WorkerGlobalScope_openDatabase_Callback(this, name, version, displayName, estimatedSize, creationCallback);
+  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.BlinkWorkerGlobalScope.$openDatabase_Callback(this, name, version, displayName, estimatedSize, creationCallback);
 
   @DomName('WorkerGlobalScope.openDatabaseSync')
   @DocsEditable()
   @Experimental() // untriaged
-  _DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.Native_WorkerGlobalScope_openDatabaseSync_Callback(this, name, version, displayName, estimatedSize, creationCallback);
+  _DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.BlinkWorkerGlobalScope.$openDatabaseSync_Callback(this, name, version, displayName, estimatedSize, creationCallback);
 
   @DomName('WorkerGlobalScope.webkitRequestFileSystem')
   @DocsEditable()
   @Experimental() // untriaged
-  void _webkitRequestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) => _blink.Native_WorkerGlobalScope_webkitRequestFileSystem_Callback(this, type, size, successCallback, errorCallback);
+  void _webkitRequestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) => _blink.BlinkWorkerGlobalScope.$webkitRequestFileSystem_Callback(this, type, size, successCallback, errorCallback);
 
   Future<FileSystem> webkitRequestFileSystem(int type, int size) {
     var completer = new Completer<FileSystem>();
@@ -31048,7 +31048,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _DOMFileSystemSync requestFileSystemSync(int type, int size) => _blink.Native_WorkerGlobalScope_webkitRequestFileSystemSync_Callback(this, type, size);
+  _DOMFileSystemSync requestFileSystemSync(int type, int size) => _blink.BlinkWorkerGlobalScope.$webkitRequestFileSystemSync_Callback(this, type, size);
 
   @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemSyncURL')
   @DocsEditable()
@@ -31056,12 +31056,12 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _EntrySync resolveLocalFileSystemSyncUrl(String url) => _blink.Native_WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback(this, url);
+  _EntrySync resolveLocalFileSystemSyncUrl(String url) => _blink.BlinkWorkerGlobalScope.$webkitResolveLocalFileSystemSyncURL_Callback(this, url);
 
   @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemURL')
   @DocsEditable()
   @Experimental() // untriaged
-  void _webkitResolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback(this, url, successCallback, errorCallback);
+  void _webkitResolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkWorkerGlobalScope.$webkitResolveLocalFileSystemURL_Callback(this, url, successCallback, errorCallback);
 
   Future<Entry> webkitResolveLocalFileSystemUrl(String url) {
     var completer = new Completer<Entry>();
@@ -31074,32 +31074,32 @@
   @DomName('WorkerGlobalScope.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String string) => _blink.Native_WorkerGlobalScope_atob_Callback(this, string);
+  String atob(String string) => _blink.BlinkWorkerGlobalScope.$atob_Callback(this, string);
 
   @DomName('WorkerGlobalScope.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String string) => _blink.Native_WorkerGlobalScope_btoa_Callback(this, string);
+  String btoa(String string) => _blink.BlinkWorkerGlobalScope.$btoa_Callback(this, string);
 
   @DomName('WorkerGlobalScope.clearInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearInterval(int handle) => _blink.Native_WorkerGlobalScope_clearInterval_Callback(this, handle);
+  void _clearInterval(int handle) => _blink.BlinkWorkerGlobalScope.$clearInterval_Callback(this, handle);
 
   @DomName('WorkerGlobalScope.clearTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearTimeout(int handle) => _blink.Native_WorkerGlobalScope_clearTimeout_Callback(this, handle);
+  void _clearTimeout(int handle) => _blink.BlinkWorkerGlobalScope.$clearTimeout_Callback(this, handle);
 
   @DomName('WorkerGlobalScope.setInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setInterval(Object handler, int timeout) => _blink.Native_WorkerGlobalScope_setInterval_Callback(this, handler, timeout);
+  int _setInterval(Object handler, int timeout) => _blink.BlinkWorkerGlobalScope.$setInterval_Callback(this, handler, timeout);
 
   @DomName('WorkerGlobalScope.setTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setTimeout(Object handler, int timeout) => _blink.Native_WorkerGlobalScope_setTimeout_Callback(this, handler, timeout);
+  int _setTimeout(Object handler, int timeout) => _blink.BlinkWorkerGlobalScope.$setTimeout_Callback(this, handler, timeout);
 
   /// Stream of `error` events handled by this [WorkerGlobalScope].
   @DomName('WorkerGlobalScope.onerror')
@@ -31125,7 +31125,7 @@
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
-  double now() => _blink.Native_WorkerPerformance_now_Callback(this);
+  double now() => _blink.BlinkWorkerPerformance.$now_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31145,19 +31145,19 @@
 
   @DomName('XPathEvaluator.XPathEvaluator')
   @DocsEditable()
-  factory XPathEvaluator() => _blink.Native_XPathEvaluator_XPathEvaluator();
+  factory XPathEvaluator() => _blink.BlinkXPathEvaluator.$mkXPathEvaluator();
 
   @DomName('XPathEvaluator.createExpression')
   @DocsEditable()
-  XPathExpression createExpression(String expression, XPathNSResolver resolver) => _blink.Native_XPathEvaluator_createExpression_Callback(this, expression, resolver);
+  XPathExpression createExpression(String expression, XPathNSResolver resolver) => _blink.BlinkXPathEvaluator.$createExpression_Callback(this, expression, resolver);
 
   @DomName('XPathEvaluator.createNSResolver')
   @DocsEditable()
-  XPathNSResolver createNSResolver(Node nodeResolver) => _blink.Native_XPathEvaluator_createNSResolver_Callback(this, nodeResolver);
+  XPathNSResolver createNSResolver(Node nodeResolver) => _blink.BlinkXPathEvaluator.$createNSResolver_Callback(this, nodeResolver);
 
   @DomName('XPathEvaluator.evaluate')
   @DocsEditable()
-  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) => _blink.Native_XPathEvaluator_evaluate_Callback(this, expression, contextNode, resolver, type, inResult);
+  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) => _blink.BlinkXPathEvaluator.$evaluate_Callback(this, expression, contextNode, resolver, type, inResult);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31177,7 +31177,7 @@
 
   @DomName('XPathExpression.evaluate')
   @DocsEditable()
-  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) => _blink.Native_XPathExpression_evaluate_Callback(this, contextNode, type, inResult);
+  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) => _blink.BlinkXPathExpression.$evaluate_Callback(this, contextNode, type, inResult);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31197,7 +31197,7 @@
 
   @DomName('XPathNSResolver.lookupNamespaceURI')
   @DocsEditable()
-  String lookupNamespaceUri(String prefix) => _blink.Native_XPathNSResolver_lookupNamespaceURI_Callback(this, prefix);
+  String lookupNamespaceUri(String prefix) => _blink.BlinkXPathNSResolver.$lookupNamespaceURI_Callback(this, prefix);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31257,39 +31257,39 @@
 
   @DomName('XPathResult.booleanValue')
   @DocsEditable()
-  bool get booleanValue => _blink.Native_XPathResult_booleanValue_Getter(this);
+  bool get booleanValue => _blink.BlinkXPathResult.$booleanValue_Getter(this);
 
   @DomName('XPathResult.invalidIteratorState')
   @DocsEditable()
-  bool get invalidIteratorState => _blink.Native_XPathResult_invalidIteratorState_Getter(this);
+  bool get invalidIteratorState => _blink.BlinkXPathResult.$invalidIteratorState_Getter(this);
 
   @DomName('XPathResult.numberValue')
   @DocsEditable()
-  double get numberValue => _blink.Native_XPathResult_numberValue_Getter(this);
+  double get numberValue => _blink.BlinkXPathResult.$numberValue_Getter(this);
 
   @DomName('XPathResult.resultType')
   @DocsEditable()
-  int get resultType => _blink.Native_XPathResult_resultType_Getter(this);
+  int get resultType => _blink.BlinkXPathResult.$resultType_Getter(this);
 
   @DomName('XPathResult.singleNodeValue')
   @DocsEditable()
-  Node get singleNodeValue => _blink.Native_XPathResult_singleNodeValue_Getter(this);
+  Node get singleNodeValue => _blink.BlinkXPathResult.$singleNodeValue_Getter(this);
 
   @DomName('XPathResult.snapshotLength')
   @DocsEditable()
-  int get snapshotLength => _blink.Native_XPathResult_snapshotLength_Getter(this);
+  int get snapshotLength => _blink.BlinkXPathResult.$snapshotLength_Getter(this);
 
   @DomName('XPathResult.stringValue')
   @DocsEditable()
-  String get stringValue => _blink.Native_XPathResult_stringValue_Getter(this);
+  String get stringValue => _blink.BlinkXPathResult.$stringValue_Getter(this);
 
   @DomName('XPathResult.iterateNext')
   @DocsEditable()
-  Node iterateNext() => _blink.Native_XPathResult_iterateNext_Callback(this);
+  Node iterateNext() => _blink.BlinkXPathResult.$iterateNext_Callback(this);
 
   @DomName('XPathResult.snapshotItem')
   @DocsEditable()
-  Node snapshotItem(int index) => _blink.Native_XPathResult_snapshotItem_Callback(this, index);
+  Node snapshotItem(int index) => _blink.BlinkXPathResult.$snapshotItem_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31324,11 +31324,11 @@
 
   @DomName('XMLSerializer.XMLSerializer')
   @DocsEditable()
-  factory XmlSerializer() => _blink.Native_XMLSerializer_XmlSerializer();
+  factory XmlSerializer() => _blink.BlinkXMLSerializer.$mkXmlSerializer();
 
   @DomName('XMLSerializer.serializeToString')
   @DocsEditable()
-  String serializeToString(Node node) => _blink.Native_XMLSerializer_serializeToString_Callback(this, node);
+  String serializeToString(Node node) => _blink.BlinkXMLSerializer.$serializeToString_Callback(this, node);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31350,42 +31350,42 @@
 
   @DomName('XSLTProcessor.XSLTProcessor')
   @DocsEditable()
-  factory XsltProcessor() => _blink.Native_XSLTProcessor_XsltProcessor();
+  factory XsltProcessor() => _blink.BlinkXSLTProcessor.$mkXsltProcessor();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('XSLTProcessor.clearParameters')
   @DocsEditable()
-  void clearParameters() => _blink.Native_XSLTProcessor_clearParameters_Callback(this);
+  void clearParameters() => _blink.BlinkXSLTProcessor.$clearParameters_Callback(this);
 
   @DomName('XSLTProcessor.getParameter')
   @DocsEditable()
-  String getParameter(String namespaceURI, String localName) => _blink.Native_XSLTProcessor_getParameter_Callback(this, namespaceURI, localName);
+  String getParameter(String namespaceURI, String localName) => _blink.BlinkXSLTProcessor.$getParameter_Callback(this, namespaceURI, localName);
 
   @DomName('XSLTProcessor.importStylesheet')
   @DocsEditable()
-  void importStylesheet(Node stylesheet) => _blink.Native_XSLTProcessor_importStylesheet_Callback(this, stylesheet);
+  void importStylesheet(Node stylesheet) => _blink.BlinkXSLTProcessor.$importStylesheet_Callback(this, stylesheet);
 
   @DomName('XSLTProcessor.removeParameter')
   @DocsEditable()
-  void removeParameter(String namespaceURI, String localName) => _blink.Native_XSLTProcessor_removeParameter_Callback(this, namespaceURI, localName);
+  void removeParameter(String namespaceURI, String localName) => _blink.BlinkXSLTProcessor.$removeParameter_Callback(this, namespaceURI, localName);
 
   @DomName('XSLTProcessor.reset')
   @DocsEditable()
-  void reset() => _blink.Native_XSLTProcessor_reset_Callback(this);
+  void reset() => _blink.BlinkXSLTProcessor.$reset_Callback(this);
 
   @DomName('XSLTProcessor.setParameter')
   @DocsEditable()
-  void setParameter(String namespaceURI, String localName, String value) => _blink.Native_XSLTProcessor_setParameter_Callback(this, namespaceURI, localName, value);
+  void setParameter(String namespaceURI, String localName, String value) => _blink.BlinkXSLTProcessor.$setParameter_Callback(this, namespaceURI, localName, value);
 
   @DomName('XSLTProcessor.transformToDocument')
   @DocsEditable()
-  Document transformToDocument(Node source) => _blink.Native_XSLTProcessor_transformToDocument_Callback(this, source);
+  Document transformToDocument(Node source) => _blink.BlinkXSLTProcessor.$transformToDocument_Callback(this, source);
 
   @DomName('XSLTProcessor.transformToFragment')
   @DocsEditable()
-  DocumentFragment transformToFragment(Node source, Document docVal) => _blink.Native_XSLTProcessor_transformToFragment_Callback(this, source, docVal);
+  DocumentFragment transformToFragment(Node source, Document docVal) => _blink.BlinkXSLTProcessor.$transformToFragment_Callback(this, source, docVal);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31404,24 +31404,24 @@
   @DomName('Attr.localName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _localName => _blink.Native_Attr_localName_Getter(this);
+  String get _localName => _blink.BlinkAttr.$localName_Getter(this);
 
   @DomName('Attr.name')
   @DocsEditable()
-  String get name => _blink.Native_Attr_name_Getter(this);
+  String get name => _blink.BlinkAttr.$name_Getter(this);
 
   @DomName('Attr.namespaceURI')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _namespaceUri => _blink.Native_Attr_namespaceURI_Getter(this);
+  String get _namespaceUri => _blink.BlinkAttr.$namespaceURI_Getter(this);
 
   @DomName('Attr.value')
   @DocsEditable()
-  String get value => _blink.Native_Attr_value_Getter(this);
+  String get value => _blink.BlinkAttr.$value_Getter(this);
 
   @DomName('Attr.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_Attr_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkAttr.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31575,27 +31575,27 @@
 
   @DomName('ClientRect.bottom')
   @DocsEditable()
-  double get bottom => _blink.Native_ClientRect_bottom_Getter(this);
+  double get bottom => _blink.BlinkClientRect.$bottom_Getter(this);
 
   @DomName('ClientRect.height')
   @DocsEditable()
-  double get height => _blink.Native_ClientRect_height_Getter(this);
+  double get height => _blink.BlinkClientRect.$height_Getter(this);
 
   @DomName('ClientRect.left')
   @DocsEditable()
-  double get left => _blink.Native_ClientRect_left_Getter(this);
+  double get left => _blink.BlinkClientRect.$left_Getter(this);
 
   @DomName('ClientRect.right')
   @DocsEditable()
-  double get right => _blink.Native_ClientRect_right_Getter(this);
+  double get right => _blink.BlinkClientRect.$right_Getter(this);
 
   @DomName('ClientRect.top')
   @DocsEditable()
-  double get top => _blink.Native_ClientRect_top_Getter(this);
+  double get top => _blink.BlinkClientRect.$top_Getter(this);
 
   @DomName('ClientRect.width')
   @DocsEditable()
-  double get width => _blink.Native_ClientRect_width_Getter(this);
+  double get width => _blink.BlinkClientRect.$width_Getter(this);
 }
 
 /**
@@ -31649,15 +31649,15 @@
 
   @DomName('ClientRectList.length')
   @DocsEditable()
-  int get length => _blink.Native_ClientRectList_length_Getter(this);
+  int get length => _blink.BlinkClientRectList.$length_Getter(this);
 
   Rectangle operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_ClientRectList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkClientRectList.$NativeIndexed_Getter(this, index);
   }
 
-  Rectangle _nativeIndexedGetter(int index) => _blink.Native_ClientRectList_NativeIndexed_Getter(this, index);
+  Rectangle _nativeIndexedGetter(int index) => _blink.BlinkClientRectList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Rectangle value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -31699,7 +31699,7 @@
 
   @DomName('ClientRectList.item')
   @DocsEditable()
-  Rectangle item(int index) => _blink.Native_ClientRectList_item_Callback(this, index);
+  Rectangle item(int index) => _blink.BlinkClientRectList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31733,15 +31733,15 @@
 
   @DomName('CSSRuleList.length')
   @DocsEditable()
-  int get length => _blink.Native_CSSRuleList_length_Getter(this);
+  int get length => _blink.BlinkCSSRuleList.$length_Getter(this);
 
   CssRule operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_CSSRuleList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkCSSRuleList.$NativeIndexed_Getter(this, index);
   }
 
-  CssRule _nativeIndexedGetter(int index) => _blink.Native_CSSRuleList_NativeIndexed_Getter(this, index);
+  CssRule _nativeIndexedGetter(int index) => _blink.BlinkCSSRuleList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, CssRule value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -31783,7 +31783,7 @@
 
   @DomName('CSSRuleList.item')
   @DocsEditable()
-  CssRule item(int index) => _blink.Native_CSSRuleList_item_Callback(this, index);
+  CssRule item(int index) => _blink.BlinkCSSRuleList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31803,15 +31803,15 @@
 
   @DomName('CSSValueList.length')
   @DocsEditable()
-  int get length => _blink.Native_CSSValueList_length_Getter(this);
+  int get length => _blink.BlinkCSSValueList.$length_Getter(this);
 
   _CSSValue operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_CSSValueList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkCSSValueList.$NativeIndexed_Getter(this, index);
   }
 
-  _CSSValue _nativeIndexedGetter(int index) => _blink.Native_CSSValueList_NativeIndexed_Getter(this, index);
+  _CSSValue _nativeIndexedGetter(int index) => _blink.BlinkCSSValueList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, _CSSValue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -31853,7 +31853,7 @@
 
   @DomName('CSSValueList.item')
   @DocsEditable()
-  _CSSValue item(int index) => _blink.Native_CSSValueList_item_Callback(this, index);
+  _CSSValue item(int index) => _blink.BlinkCSSValueList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31963,26 +31963,26 @@
   factory _DomPoint(num x, num y) => _create(x, y);
 
   @DocsEditable()
-  static _DomPoint _create(x, y) => _blink.Native_WebKitPoint_constructorCallback(x, y);
+  static _DomPoint _create(x, y) => _blink.BlinkWebKitPoint.$constructorCallback(x, y);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('WebKitPoint.x')
   @DocsEditable()
-  num get x => _blink.Native_WebKitPoint_x_Getter(this);
+  num get x => _blink.BlinkWebKitPoint.$x_Getter(this);
 
   @DomName('WebKitPoint.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_WebKitPoint_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkWebKitPoint.$x_Setter(this, value);
 
   @DomName('WebKitPoint.y')
   @DocsEditable()
-  num get y => _blink.Native_WebKitPoint_y_Getter(this);
+  num get y => _blink.BlinkWebKitPoint.$y_Getter(this);
 
   @DomName('WebKitPoint.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_WebKitPoint_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkWebKitPoint.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32034,7 +32034,7 @@
 
   @DomName('FileReaderSync.FileReaderSync')
   @DocsEditable()
-  factory _FileReaderSync() => _blink.Native_FileReaderSync__FileReaderSync();
+  factory _FileReaderSync() => _blink.BlinkFileReaderSync.$mk_FileReaderSync();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32070,15 +32070,15 @@
 
   @DomName('GamepadList.length')
   @DocsEditable()
-  int get length => _blink.Native_GamepadList_length_Getter(this);
+  int get length => _blink.BlinkGamepadList.$length_Getter(this);
 
   Gamepad operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_GamepadList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkGamepadList.$NativeIndexed_Getter(this, index);
   }
 
-  Gamepad _nativeIndexedGetter(int index) => _blink.Native_GamepadList_NativeIndexed_Getter(this, index);
+  Gamepad _nativeIndexedGetter(int index) => _blink.BlinkGamepadList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Gamepad value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32120,7 +32120,7 @@
 
   @DomName('GamepadList.item')
   @DocsEditable()
-  Gamepad item(int index) => _blink.Native_GamepadList_item_Callback(this, index);
+  Gamepad item(int index) => _blink.BlinkGamepadList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32140,7 +32140,7 @@
 
   @DomName('HTMLAllCollection.item')
   @DocsEditable()
-  Element _item(int index) => _blink.Native_HTMLAllCollection_item_Callback(this, index);
+  Element _item(int index) => _blink.BlinkHTMLAllCollection.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32317,15 +32317,15 @@
 
   @DomName('NamedNodeMap.length')
   @DocsEditable()
-  int get length => _blink.Native_NamedNodeMap_length_Getter(this);
+  int get length => _blink.BlinkNamedNodeMap.$length_Getter(this);
 
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_NamedNodeMap_NativeIndexed_Getter(this, index);
+    return _blink.BlinkNamedNodeMap.$NativeIndexed_Getter(this, index);
   }
 
-  Node _nativeIndexedGetter(int index) => _blink.Native_NamedNodeMap_NativeIndexed_Getter(this, index);
+  Node _nativeIndexedGetter(int index) => _blink.BlinkNamedNodeMap.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32367,35 +32367,35 @@
 
   @DomName('NamedNodeMap.__getter__')
   @DocsEditable()
-  Node __getter__(String name) => _blink.Native_NamedNodeMap___getter___Callback(this, name);
+  Node __getter__(String name) => _blink.BlinkNamedNodeMap.$__getter___Callback(this, name);
 
   @DomName('NamedNodeMap.getNamedItem')
   @DocsEditable()
-  Node getNamedItem(String name) => _blink.Native_NamedNodeMap_getNamedItem_Callback(this, name);
+  Node getNamedItem(String name) => _blink.BlinkNamedNodeMap.$getNamedItem_Callback(this, name);
 
   @DomName('NamedNodeMap.getNamedItemNS')
   @DocsEditable()
-  Node getNamedItemNS(String namespaceURI, String localName) => _blink.Native_NamedNodeMap_getNamedItemNS_Callback(this, namespaceURI, localName);
+  Node getNamedItemNS(String namespaceURI, String localName) => _blink.BlinkNamedNodeMap.$getNamedItemNS_Callback(this, namespaceURI, localName);
 
   @DomName('NamedNodeMap.item')
   @DocsEditable()
-  Node item(int index) => _blink.Native_NamedNodeMap_item_Callback(this, index);
+  Node item(int index) => _blink.BlinkNamedNodeMap.$item_Callback(this, index);
 
   @DomName('NamedNodeMap.removeNamedItem')
   @DocsEditable()
-  Node removeNamedItem(String name) => _blink.Native_NamedNodeMap_removeNamedItem_Callback(this, name);
+  Node removeNamedItem(String name) => _blink.BlinkNamedNodeMap.$removeNamedItem_Callback(this, name);
 
   @DomName('NamedNodeMap.removeNamedItemNS')
   @DocsEditable()
-  Node removeNamedItemNS(String namespaceURI, String localName) => _blink.Native_NamedNodeMap_removeNamedItemNS_Callback(this, namespaceURI, localName);
+  Node removeNamedItemNS(String namespaceURI, String localName) => _blink.BlinkNamedNodeMap.$removeNamedItemNS_Callback(this, namespaceURI, localName);
 
   @DomName('NamedNodeMap.setNamedItem')
   @DocsEditable()
-  Node setNamedItem(Node node) => _blink.Native_NamedNodeMap_setNamedItem_Callback(this, node);
+  Node setNamedItem(Node node) => _blink.BlinkNamedNodeMap.$setNamedItem_Callback(this, node);
 
   @DomName('NamedNodeMap.setNamedItemNS')
   @DocsEditable()
-  Node setNamedItemNS(Node node) => _blink.Native_NamedNodeMap_setNamedItemNS_Callback(this, node);
+  Node setNamedItemNS(Node node) => _blink.BlinkNamedNodeMap.$setNamedItemNS_Callback(this, node);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32526,15 +32526,15 @@
 
   @DomName('SpeechInputResultList.length')
   @DocsEditable()
-  int get length => _blink.Native_SpeechInputResultList_length_Getter(this);
+  int get length => _blink.BlinkSpeechInputResultList.$length_Getter(this);
 
   SpeechInputResult operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_SpeechInputResultList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkSpeechInputResultList.$NativeIndexed_Getter(this, index);
   }
 
-  SpeechInputResult _nativeIndexedGetter(int index) => _blink.Native_SpeechInputResultList_NativeIndexed_Getter(this, index);
+  SpeechInputResult _nativeIndexedGetter(int index) => _blink.BlinkSpeechInputResultList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, SpeechInputResult value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32576,7 +32576,7 @@
 
   @DomName('SpeechInputResultList.item')
   @DocsEditable()
-  SpeechInputResult item(int index) => _blink.Native_SpeechInputResultList_item_Callback(this, index);
+  SpeechInputResult item(int index) => _blink.BlinkSpeechInputResultList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32596,15 +32596,15 @@
 
   @DomName('SpeechRecognitionResultList.length')
   @DocsEditable()
-  int get length => _blink.Native_SpeechRecognitionResultList_length_Getter(this);
+  int get length => _blink.BlinkSpeechRecognitionResultList.$length_Getter(this);
 
   SpeechRecognitionResult operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_SpeechRecognitionResultList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkSpeechRecognitionResultList.$NativeIndexed_Getter(this, index);
   }
 
-  SpeechRecognitionResult _nativeIndexedGetter(int index) => _blink.Native_SpeechRecognitionResultList_NativeIndexed_Getter(this, index);
+  SpeechRecognitionResult _nativeIndexedGetter(int index) => _blink.BlinkSpeechRecognitionResultList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, SpeechRecognitionResult value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32646,7 +32646,7 @@
 
   @DomName('SpeechRecognitionResultList.item')
   @DocsEditable()
-  SpeechRecognitionResult item(int index) => _blink.Native_SpeechRecognitionResultList_item_Callback(this, index);
+  SpeechRecognitionResult item(int index) => _blink.BlinkSpeechRecognitionResultList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32664,15 +32664,15 @@
 
   @DomName('StyleSheetList.length')
   @DocsEditable()
-  int get length => _blink.Native_StyleSheetList_length_Getter(this);
+  int get length => _blink.BlinkStyleSheetList.$length_Getter(this);
 
   StyleSheet operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_StyleSheetList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkStyleSheetList.$NativeIndexed_Getter(this, index);
   }
 
-  StyleSheet _nativeIndexedGetter(int index) => _blink.Native_StyleSheetList_NativeIndexed_Getter(this, index);
+  StyleSheet _nativeIndexedGetter(int index) => _blink.BlinkStyleSheetList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, StyleSheet value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32714,11 +32714,11 @@
 
   @DomName('StyleSheetList.__getter__')
   @DocsEditable()
-  CssStyleSheet __getter__(String name) => _blink.Native_StyleSheetList___getter___Callback(this, name);
+  CssStyleSheet __getter__(String name) => _blink.BlinkStyleSheetList.$__getter___Callback(this, name);
 
   @DomName('StyleSheetList.item')
   @DocsEditable()
-  StyleSheet item(int index) => _blink.Native_StyleSheetList_item_Callback(this, index);
+  StyleSheet item(int index) => _blink.BlinkStyleSheetList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32772,7 +32772,7 @@
 
   @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
   @DocsEditable()
-  factory _WebKitCSSMatrix([String cssValue]) => _blink.Native_WebKitCSSMatrix__WebKitCSSMatrix(cssValue);
+  factory _WebKitCSSMatrix([String cssValue]) => _blink.BlinkWebKitCSSMatrix.$mk_WebKitCSSMatrix(cssValue);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32807,7 +32807,7 @@
 
   @DomName('WebKitMediaSource.WebKitMediaSource')
   @DocsEditable()
-  factory _WebKitMediaSource() => _blink.Native_WebKitMediaSource__WebKitMediaSource();
+  factory _WebKitMediaSource() => _blink.BlinkWebKitMediaSource.$mk_WebKitMediaSource();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32857,7 +32857,7 @@
   @DomName('WebKitSourceBufferList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  _WebKitSourceBuffer _item(int index) => _blink.Native_WebKitSourceBufferList_item_Callback(this, index);
+  _WebKitSourceBuffer _item(int index) => _blink.BlinkWebKitSourceBufferList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32877,22 +32877,22 @@
   @DomName('WindowTimers.clearInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearInterval(int handle) => _blink.Native_WindowTimers_clearInterval_Callback(this, handle);
+  void _clearInterval(int handle) => _blink.BlinkWindowTimers.$clearInterval_Callback(this, handle);
 
   @DomName('WindowTimers.clearTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearTimeout(int handle) => _blink.Native_WindowTimers_clearTimeout_Callback(this, handle);
+  void _clearTimeout(int handle) => _blink.BlinkWindowTimers.$clearTimeout_Callback(this, handle);
 
   @DomName('WindowTimers.setInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setInterval(Object handler, int timeout) => _blink.Native_WindowTimers_setInterval_Callback(this, handler, timeout);
+  int _setInterval(Object handler, int timeout) => _blink.BlinkWindowTimers.$setInterval_Callback(this, handler, timeout);
 
   @DomName('WindowTimers.setTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setTimeout(Object handler, int timeout) => _blink.Native_WindowTimers_setTimeout_Callback(this, handler, timeout);
+  int _setTimeout(Object handler, int timeout) => _blink.BlinkWindowTimers.$setTimeout_Callback(this, handler, timeout);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37558,11 +37558,11 @@
     return element;
   }
 
-  static window() => _blink.Native_Utils_window();
-  static forwardingPrint(String message) => _blink.Native_Utils_forwardingPrint(message);
+  static window() => _blink.Blink_Utils.window();
+  static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message);
   // TODO(vsm): Make this API compatible with spawnUri.  It should also
   // return a Future<Isolate>.
-  static spawnDomUri(String uri) => _blink.Native_Utils_spawnDomUri(uri);
+  static spawnDomUri(String uri) => _blink.Blink_Utils.spawnDomUri(uri);
 
   // The following methods were added for debugger integration to make working
   // with the Dart C mirrors API simpler.
@@ -38166,16 +38166,16 @@
   }
 
   static void _register(Document document, String tag, Type customType,
-    String extendsTagName) => _blink.Native_Utils_register(document, tag, customType, extendsTagName);
+    String extendsTagName) => _blink.Blink_Utils.register(document, tag, customType, extendsTagName);
 
   static Element createElement(Document document, String tagName) =>
-    _blink.Native_Utils_createElement(document, tagName);
+    _blink.Blink_Utils.createElement(document, tagName);
 
   static void initializeCustomElement(HtmlElement element) =>
-    _blink.Native_Utils_initializeCustomElement(element);
+    _blink.Blink_Utils.initializeCustomElement(element);
 
   static Element changeElementWrapper(HtmlElement element, Type type) =>
-    _blink.Native_Utils_changeElementWrapper(element, type);
+    _blink.Blink_Utils.changeElementWrapper(element, type);
 }
 
 class _DOMWindowCrossFrame extends NativeFieldWrapperClass2 implements
@@ -38183,17 +38183,17 @@
   _DOMWindowCrossFrame.internal();
 
   // Fields.
-  HistoryBase get history => _blink.Native_DOMWindowCrossFrame_get_history(this);
-  LocationBase get location => _blink.Native_DOMWindowCrossFrame_get_location(this);
-  bool get closed => _blink.Native_DOMWindowCrossFrame_get_closed(this);
-  WindowBase get opener => _blink.Native_DOMWindowCrossFrame_get_opener(this);
-  WindowBase get parent => _blink.Native_DOMWindowCrossFrame_get_parent(this);
-  WindowBase get top => _blink.Native_DOMWindowCrossFrame_get_top(this);
+  HistoryBase get history => _blink.Blink_DOMWindowCrossFrame.get_history(this);
+  LocationBase get location => _blink.Blink_DOMWindowCrossFrame.get_location(this);
+  bool get closed => _blink.Blink_DOMWindowCrossFrame.get_closed(this);
+  WindowBase get opener => _blink.Blink_DOMWindowCrossFrame.get_opener(this);
+  WindowBase get parent => _blink.Blink_DOMWindowCrossFrame.get_parent(this);
+  WindowBase get top => _blink.Blink_DOMWindowCrossFrame.get_top(this);
 
   // Methods.
-  void close() => _blink.Native_DOMWindowCrossFrame_close(this);
+  void close() => _blink.Blink_DOMWindowCrossFrame.close(this);
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
-    _blink.Native_DOMWindowCrossFrame_postMessage(this, message, targetOrigin, messagePorts);
+    _blink.Blink_DOMWindowCrossFrame.postMessage(this, message, targetOrigin, messagePorts);
 
   // Implementation support.
   String get typeName => "Window";
@@ -38218,9 +38218,9 @@
   _HistoryCrossFrame.internal();
 
   // Methods.
-  void back() => _blink.Native_HistoryCrossFrame_back(this);
-  void forward() => _blink.Native_HistoryCrossFrame_forward(this);
-  void go(int distance) => _blink.Native_HistoryCrossFrame_go(this, distance);
+  void back() => _blink.Blink_HistoryCrossFrame.back(this);
+  void forward() => _blink.Blink_HistoryCrossFrame.forward(this);
+  void go(int distance) => _blink.Blink_HistoryCrossFrame.go(this, distance);
 
   // Implementation support.
   String get typeName => "History";
@@ -38230,7 +38230,7 @@
   _LocationCrossFrame.internal();
 
   // Fields.
-  void set href(String h) => _blink.Native_LocationCrossFrame_set_href(this, h);
+  void set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
 
   // Implementation support.
   String get typeName => "Location";
@@ -38240,14 +38240,14 @@
   _DOMStringMap.internal();
 
   bool containsValue(String value) => Maps.containsValue(this, value);
-  bool containsKey(String key) => _blink.Native_DOMStringMap_containsKey(this, key);
-  String operator [](String key) => _blink.Native_DOMStringMap_item(this, key);
-  void operator []=(String key, String value) => _blink.Native_DOMStringMap_setItem(this, key, value);
+  bool containsKey(String key) => _blink.Blink_DOMStringMap.containsKey(this, key);
+  String operator [](String key) => _blink.Blink_DOMStringMap.item(this, key);
+  void operator []=(String key, String value) => _blink.Blink_DOMStringMap.setItem(this, key, value);
   String putIfAbsent(String key, String ifAbsent()) => Maps.putIfAbsent(this, key, ifAbsent);
-  String remove(String key) => _blink.Native_DOMStringMap_remove(this, key);
+  String remove(String key) => _blink.Blink_DOMStringMap.remove(this, key);
   void clear() => Maps.clear(this);
   void forEach(void f(String key, String value)) => Maps.forEach(this, f);
-  Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this);
+  Iterable<String> get keys => _blink.Blink_DOMStringMap.get_keys(this);
   Iterable<String> get values => Maps.getValues(this);
   int get length => Maps.length(this);
   bool get isEmpty => Maps.isEmpty(this);
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index c39811e..f49e256 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -35,18 +35,18 @@
       KeyRange.bound_(lower, upper, lowerOpen, upperOpen);
 }
 // FIXME: Can we make this private?
-const indexed_dbBlinkMap = const {
-  'IDBCursor': Cursor,
-  'IDBCursorWithValue': CursorWithValue,
-  'IDBDatabase': Database,
-  'IDBFactory': IdbFactory,
-  'IDBIndex': Index,
-  'IDBKeyRange': KeyRange,
-  'IDBObjectStore': ObjectStore,
-  'IDBOpenDBRequest': OpenDBRequest,
-  'IDBRequest': Request,
-  'IDBTransaction': Transaction,
-  'IDBVersionChangeEvent': VersionChangeEvent,
+final indexed_dbBlinkMap = {
+  'IDBCursor': () => Cursor,
+  'IDBCursorWithValue': () => CursorWithValue,
+  'IDBDatabase': () => Database,
+  'IDBFactory': () => IdbFactory,
+  'IDBIndex': () => Index,
+  'IDBKeyRange': () => KeyRange,
+  'IDBObjectStore': () => ObjectStore,
+  'IDBOpenDBRequest': () => OpenDBRequest,
+  'IDBRequest': () => Request,
+  'IDBTransaction': () => Transaction,
+  'IDBVersionChangeEvent': () => VersionChangeEvent,
 
 };
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -80,41 +80,41 @@
 
   @DomName('IDBCursor.direction')
   @DocsEditable()
-  String get direction => _blink.Native_IDBCursor_direction_Getter(this);
+  String get direction => _blink.BlinkIDBCursor.$direction_Getter(this);
 
   @DomName('IDBCursor.key')
   @DocsEditable()
-  Object get key => _blink.Native_IDBCursor_key_Getter(this);
+  Object get key => _blink.BlinkIDBCursor.$key_Getter(this);
 
   @DomName('IDBCursor.primaryKey')
   @DocsEditable()
-  Object get primaryKey => _blink.Native_IDBCursor_primaryKey_Getter(this);
+  Object get primaryKey => _blink.BlinkIDBCursor.$primaryKey_Getter(this);
 
   @DomName('IDBCursor.source')
   @DocsEditable()
-  Object get source => _blink.Native_IDBCursor_source_Getter(this);
+  Object get source => _blink.BlinkIDBCursor.$source_Getter(this);
 
   @DomName('IDBCursor.advance')
   @DocsEditable()
-  void advance(int count) => _blink.Native_IDBCursor_advance_Callback(this, count);
+  void advance(int count) => _blink.BlinkIDBCursor.$advance_Callback(this, count);
 
   @DomName('IDBCursor.continuePrimaryKey')
   @DocsEditable()
   @Experimental() // untriaged
-  void continuePrimaryKey(Object key, Object primaryKey) => _blink.Native_IDBCursor_continuePrimaryKey_Callback(this, key, primaryKey);
+  void continuePrimaryKey(Object key, Object primaryKey) => _blink.BlinkIDBCursor.$continuePrimaryKey_Callback(this, key, primaryKey);
 
   @DomName('IDBCursor.delete')
   @DocsEditable()
-  Request _delete() => _blink.Native_IDBCursor_delete_Callback(this);
+  Request _delete() => _blink.BlinkIDBCursor.$delete_Callback(this);
 
   @DomName('IDBCursor.next')
   @DocsEditable()
   @Experimental() // non-standard
-  void next([Object key]) => _blink.Native_IDBCursor_next_Callback(this, key);
+  void next([Object key]) => _blink.BlinkIDBCursor.$next_Callback(this, key);
 
   @DomName('IDBCursor.update')
   @DocsEditable()
-  Request _update(Object value) => _blink.Native_IDBCursor_update_Callback(this, value);
+  Request _update(Object value) => _blink.BlinkIDBCursor.$update_Callback(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -133,7 +133,7 @@
 
   @DomName('IDBCursorWithValue.value')
   @DocsEditable()
-  Object get value => _blink.Native_IDBCursorWithValue_value_Getter(this);
+  Object get value => _blink.BlinkIDBCursorWithValue.$value_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -216,41 +216,41 @@
 
   @DomName('IDBDatabase.name')
   @DocsEditable()
-  String get name => _blink.Native_IDBDatabase_name_Getter(this);
+  String get name => _blink.BlinkIDBDatabase.$name_Getter(this);
 
   @DomName('IDBDatabase.objectStoreNames')
   @DocsEditable()
-  List<String> get objectStoreNames => _blink.Native_IDBDatabase_objectStoreNames_Getter(this);
+  List<String> get objectStoreNames => _blink.BlinkIDBDatabase.$objectStoreNames_Getter(this);
 
   @DomName('IDBDatabase.version')
   @DocsEditable()
-  Object get version => _blink.Native_IDBDatabase_version_Getter(this);
+  Object get version => _blink.BlinkIDBDatabase.$version_Getter(this);
 
   @DomName('IDBDatabase.close')
   @DocsEditable()
-  void close() => _blink.Native_IDBDatabase_close_Callback(this);
+  void close() => _blink.BlinkIDBDatabase.$close_Callback(this);
 
   @DomName('IDBDatabase.createObjectStore')
   @DocsEditable()
-  ObjectStore _createObjectStore(String name, [Map options]) => _blink.Native_IDBDatabase_createObjectStore_Callback(this, name, options);
+  ObjectStore _createObjectStore(String name, [Map options]) => _blink.BlinkIDBDatabase.$createObjectStore_Callback(this, name, options);
 
   @DomName('IDBDatabase.deleteObjectStore')
   @DocsEditable()
-  void deleteObjectStore(String name) => _blink.Native_IDBDatabase_deleteObjectStore_Callback(this, name);
+  void deleteObjectStore(String name) => _blink.BlinkIDBDatabase.$deleteObjectStore_Callback(this, name);
 
-  Transaction transaction(storeName_OR_storeNames, String mode) => _blink.Native_IDBDatabase_transaction(this, storeName_OR_storeNames, mode);
+  Transaction transaction(storeName_OR_storeNames, String mode) => _blink.BlinkIDBDatabase.$transaction(this, storeName_OR_storeNames, mode);
 
   @DomName('IDBDatabase.transactionList')
   @DocsEditable()
-  Transaction transactionList(List<String> storeNames, String mode) => _blink.Native_IDBDatabase_transactionList_Callback(this, storeNames, mode);
+  Transaction transactionList(List<String> storeNames, String mode) => _blink.BlinkIDBDatabase.$transactionList_Callback(this, storeNames, mode);
 
   @DomName('IDBDatabase.transactionStore')
   @DocsEditable()
-  Transaction transactionStore(String storeName, String mode) => _blink.Native_IDBDatabase_transactionStore_Callback(this, storeName, mode);
+  Transaction transactionStore(String storeName, String mode) => _blink.BlinkIDBDatabase.$transactionStore_Callback(this, storeName, mode);
 
   @DomName('IDBDatabase.transactionStores')
   @DocsEditable()
-  Transaction transactionStores(List<String> storeNames, String mode) => _blink.Native_IDBDatabase_transactionStores_Callback(this, storeNames, mode);
+  Transaction transactionStores(List<String> storeNames, String mode) => _blink.BlinkIDBDatabase.$transactionStores_Callback(this, storeNames, mode);
 
   /// Stream of `abort` events handled by this [Database].
   @DomName('IDBDatabase.onabort')
@@ -366,20 +366,20 @@
 
   @DomName('IDBFactory.cmp')
   @DocsEditable()
-  int cmp(Object first, Object second) => _blink.Native_IDBFactory_cmp_Callback(this, first, second);
+  int cmp(Object first, Object second) => _blink.BlinkIDBFactory.$cmp_Callback(this, first, second);
 
   @DomName('IDBFactory.deleteDatabase')
   @DocsEditable()
-  OpenDBRequest _deleteDatabase(String name) => _blink.Native_IDBFactory_deleteDatabase_Callback(this, name);
+  OpenDBRequest _deleteDatabase(String name) => _blink.BlinkIDBFactory.$deleteDatabase_Callback(this, name);
 
-  OpenDBRequest _open(String name, [int version]) => _blink.Native_IDBFactory__open(this, name, version);
+  OpenDBRequest _open(String name, [int version]) => _blink.BlinkIDBFactory.$_open(this, name, version);
 
   @DomName('IDBFactory.webkitGetDatabaseNames')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  Request _webkitGetDatabaseNames() => _blink.Native_IDBFactory_webkitGetDatabaseNames_Callback(this);
+  Request _webkitGetDatabaseNames() => _blink.BlinkIDBFactory.$webkitGetDatabaseNames_Callback(this);
 
 }
 
@@ -497,43 +497,43 @@
 
   @DomName('IDBIndex.keyPath')
   @DocsEditable()
-  Object get keyPath => _blink.Native_IDBIndex_keyPath_Getter(this);
+  Object get keyPath => _blink.BlinkIDBIndex.$keyPath_Getter(this);
 
   @DomName('IDBIndex.multiEntry')
   @DocsEditable()
-  bool get multiEntry => _blink.Native_IDBIndex_multiEntry_Getter(this);
+  bool get multiEntry => _blink.BlinkIDBIndex.$multiEntry_Getter(this);
 
   @DomName('IDBIndex.name')
   @DocsEditable()
-  String get name => _blink.Native_IDBIndex_name_Getter(this);
+  String get name => _blink.BlinkIDBIndex.$name_Getter(this);
 
   @DomName('IDBIndex.objectStore')
   @DocsEditable()
-  ObjectStore get objectStore => _blink.Native_IDBIndex_objectStore_Getter(this);
+  ObjectStore get objectStore => _blink.BlinkIDBIndex.$objectStore_Getter(this);
 
   @DomName('IDBIndex.unique')
   @DocsEditable()
-  bool get unique => _blink.Native_IDBIndex_unique_Getter(this);
+  bool get unique => _blink.BlinkIDBIndex.$unique_Getter(this);
 
   @DomName('IDBIndex.count')
   @DocsEditable()
-  Request _count(Object key) => _blink.Native_IDBIndex_count_Callback(this, key);
+  Request _count(Object key) => _blink.BlinkIDBIndex.$count_Callback(this, key);
 
   @DomName('IDBIndex.get')
   @DocsEditable()
-  Request _get(Object key) => _blink.Native_IDBIndex_get_Callback(this, key);
+  Request _get(Object key) => _blink.BlinkIDBIndex.$get_Callback(this, key);
 
   @DomName('IDBIndex.getKey')
   @DocsEditable()
-  Request _getKey(Object key) => _blink.Native_IDBIndex_getKey_Callback(this, key);
+  Request _getKey(Object key) => _blink.BlinkIDBIndex.$getKey_Callback(this, key);
 
   @DomName('IDBIndex.openCursor')
   @DocsEditable()
-  Request _openCursor(Object key, [String direction]) => _blink.Native_IDBIndex_openCursor_Callback(this, key, direction);
+  Request _openCursor(Object key, [String direction]) => _blink.BlinkIDBIndex.$openCursor_Callback(this, key, direction);
 
   @DomName('IDBIndex.openKeyCursor')
   @DocsEditable()
-  Request _openKeyCursor(Object key, [String direction]) => _blink.Native_IDBIndex_openKeyCursor_Callback(this, key, direction);
+  Request _openKeyCursor(Object key, [String direction]) => _blink.BlinkIDBIndex.$openKeyCursor_Callback(this, key, direction);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -567,39 +567,39 @@
 
   @DomName('IDBKeyRange.lower')
   @DocsEditable()
-  Object get lower => _blink.Native_IDBKeyRange_lower_Getter(this);
+  Object get lower => _blink.BlinkIDBKeyRange.$lower_Getter(this);
 
   @DomName('IDBKeyRange.lowerOpen')
   @DocsEditable()
-  bool get lowerOpen => _blink.Native_IDBKeyRange_lowerOpen_Getter(this);
+  bool get lowerOpen => _blink.BlinkIDBKeyRange.$lowerOpen_Getter(this);
 
   @DomName('IDBKeyRange.upper')
   @DocsEditable()
-  Object get upper => _blink.Native_IDBKeyRange_upper_Getter(this);
+  Object get upper => _blink.BlinkIDBKeyRange.$upper_Getter(this);
 
   @DomName('IDBKeyRange.upperOpen')
   @DocsEditable()
-  bool get upperOpen => _blink.Native_IDBKeyRange_upperOpen_Getter(this);
+  bool get upperOpen => _blink.BlinkIDBKeyRange.$upperOpen_Getter(this);
 
   @DomName('IDBKeyRange.bound_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange bound_(Object lower, Object upper, [bool lowerOpen, bool upperOpen]) => _blink.Native_IDBKeyRange_bound__Callback(lower, upper, lowerOpen, upperOpen);
+  static KeyRange bound_(Object lower, Object upper, [bool lowerOpen, bool upperOpen]) => _blink.BlinkIDBKeyRange.$bound__Callback(lower, upper, lowerOpen, upperOpen);
 
   @DomName('IDBKeyRange.lowerBound_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange lowerBound_(Object bound, [bool open]) => _blink.Native_IDBKeyRange_lowerBound__Callback(bound, open);
+  static KeyRange lowerBound_(Object bound, [bool open]) => _blink.BlinkIDBKeyRange.$lowerBound__Callback(bound, open);
 
   @DomName('IDBKeyRange.only_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange only_(Object value) => _blink.Native_IDBKeyRange_only__Callback(value);
+  static KeyRange only_(Object value) => _blink.BlinkIDBKeyRange.$only__Callback(value);
 
   @DomName('IDBKeyRange.upperBound_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange upperBound_(Object bound, [bool open]) => _blink.Native_IDBKeyRange_upperBound__Callback(bound, open);
+  static KeyRange upperBound_(Object bound, [bool open]) => _blink.BlinkIDBKeyRange.$upperBound__Callback(bound, open);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -742,66 +742,66 @@
 
   @DomName('IDBObjectStore.autoIncrement')
   @DocsEditable()
-  bool get autoIncrement => _blink.Native_IDBObjectStore_autoIncrement_Getter(this);
+  bool get autoIncrement => _blink.BlinkIDBObjectStore.$autoIncrement_Getter(this);
 
   @DomName('IDBObjectStore.indexNames')
   @DocsEditable()
-  List<String> get indexNames => _blink.Native_IDBObjectStore_indexNames_Getter(this);
+  List<String> get indexNames => _blink.BlinkIDBObjectStore.$indexNames_Getter(this);
 
   @DomName('IDBObjectStore.keyPath')
   @DocsEditable()
-  Object get keyPath => _blink.Native_IDBObjectStore_keyPath_Getter(this);
+  Object get keyPath => _blink.BlinkIDBObjectStore.$keyPath_Getter(this);
 
   @DomName('IDBObjectStore.name')
   @DocsEditable()
-  String get name => _blink.Native_IDBObjectStore_name_Getter(this);
+  String get name => _blink.BlinkIDBObjectStore.$name_Getter(this);
 
   @DomName('IDBObjectStore.transaction')
   @DocsEditable()
-  Transaction get transaction => _blink.Native_IDBObjectStore_transaction_Getter(this);
+  Transaction get transaction => _blink.BlinkIDBObjectStore.$transaction_Getter(this);
 
   @DomName('IDBObjectStore.add')
   @DocsEditable()
-  Request _add(Object value, [Object key]) => _blink.Native_IDBObjectStore_add_Callback(this, value, key);
+  Request _add(Object value, [Object key]) => _blink.BlinkIDBObjectStore.$add_Callback(this, value, key);
 
   @DomName('IDBObjectStore.clear')
   @DocsEditable()
-  Request _clear() => _blink.Native_IDBObjectStore_clear_Callback(this);
+  Request _clear() => _blink.BlinkIDBObjectStore.$clear_Callback(this);
 
   @DomName('IDBObjectStore.count')
   @DocsEditable()
-  Request _count(Object key) => _blink.Native_IDBObjectStore_count_Callback(this, key);
+  Request _count(Object key) => _blink.BlinkIDBObjectStore.$count_Callback(this, key);
 
-  Index _createIndex(String name, keyPath, [Map options]) => _blink.Native_IDBObjectStore__createIndex(this, name, keyPath, options);
+  Index _createIndex(String name, keyPath, [Map options]) => _blink.BlinkIDBObjectStore.$_createIndex(this, name, keyPath, options);
 
   @DomName('IDBObjectStore.delete')
   @DocsEditable()
-  Request _delete(Object key) => _blink.Native_IDBObjectStore_delete_Callback(this, key);
+  Request _delete(Object key) => _blink.BlinkIDBObjectStore.$delete_Callback(this, key);
 
   @DomName('IDBObjectStore.deleteIndex')
   @DocsEditable()
-  void deleteIndex(String name) => _blink.Native_IDBObjectStore_deleteIndex_Callback(this, name);
+  void deleteIndex(String name) => _blink.BlinkIDBObjectStore.$deleteIndex_Callback(this, name);
 
   @DomName('IDBObjectStore.get')
   @DocsEditable()
-  Request _get(Object key) => _blink.Native_IDBObjectStore_get_Callback(this, key);
+  Request _get(Object key) => _blink.BlinkIDBObjectStore.$get_Callback(this, key);
 
   @DomName('IDBObjectStore.index')
   @DocsEditable()
-  Index index(String name) => _blink.Native_IDBObjectStore_index_Callback(this, name);
+  Index index(String name) => _blink.BlinkIDBObjectStore.$index_Callback(this, name);
 
   @DomName('IDBObjectStore.openCursor')
   @DocsEditable()
-  Request _openCursor(Object key, [String direction]) => _blink.Native_IDBObjectStore_openCursor_Callback(this, key, direction);
+  Request _openCursor(Object key, [String direction]) => _blink.BlinkIDBObjectStore.$openCursor_Callback(this, key, direction);
 
   @DomName('IDBObjectStore.openKeyCursor')
   @DocsEditable()
   @Experimental() // untriaged
-  Request openKeyCursor(Object range, String direction) => _blink.Native_IDBObjectStore_openKeyCursor_Callback(this, range, direction);
+  Request openKeyCursor(Object range, String direction) => _blink.BlinkIDBObjectStore.$openKeyCursor_Callback(this, range, direction);
 
   @DomName('IDBObjectStore.put')
   @DocsEditable()
-  Request _put(Object value, [Object key]) => _blink.Native_IDBObjectStore_put_Callback(this, value, key);
+  Request _put(Object value, [Object key]) => _blink.BlinkIDBObjectStore.$put_Callback(this, value, key);
 
 
   /**
@@ -912,23 +912,23 @@
 
   @DomName('IDBRequest.error')
   @DocsEditable()
-  DomError get error => _blink.Native_IDBRequest_error_Getter(this);
+  DomError get error => _blink.BlinkIDBRequest.$error_Getter(this);
 
   @DomName('IDBRequest.readyState')
   @DocsEditable()
-  String get readyState => _blink.Native_IDBRequest_readyState_Getter(this);
+  String get readyState => _blink.BlinkIDBRequest.$readyState_Getter(this);
 
   @DomName('IDBRequest.result')
   @DocsEditable()
-  Object get result => _blink.Native_IDBRequest_result_Getter(this);
+  Object get result => _blink.BlinkIDBRequest.$result_Getter(this);
 
   @DomName('IDBRequest.source')
   @DocsEditable()
-  Object get source => _blink.Native_IDBRequest_source_Getter(this);
+  Object get source => _blink.BlinkIDBRequest.$source_Getter(this);
 
   @DomName('IDBRequest.transaction')
   @DocsEditable()
-  Transaction get transaction => _blink.Native_IDBRequest_transaction_Getter(this);
+  Transaction get transaction => _blink.BlinkIDBRequest.$transaction_Getter(this);
 
   /// Stream of `error` events handled by this [Request].
   @DomName('IDBRequest.onerror')
@@ -1013,23 +1013,23 @@
 
   @DomName('IDBTransaction.db')
   @DocsEditable()
-  Database get db => _blink.Native_IDBTransaction_db_Getter(this);
+  Database get db => _blink.BlinkIDBTransaction.$db_Getter(this);
 
   @DomName('IDBTransaction.error')
   @DocsEditable()
-  DomError get error => _blink.Native_IDBTransaction_error_Getter(this);
+  DomError get error => _blink.BlinkIDBTransaction.$error_Getter(this);
 
   @DomName('IDBTransaction.mode')
   @DocsEditable()
-  String get mode => _blink.Native_IDBTransaction_mode_Getter(this);
+  String get mode => _blink.BlinkIDBTransaction.$mode_Getter(this);
 
   @DomName('IDBTransaction.abort')
   @DocsEditable()
-  void abort() => _blink.Native_IDBTransaction_abort_Callback(this);
+  void abort() => _blink.BlinkIDBTransaction.$abort_Callback(this);
 
   @DomName('IDBTransaction.objectStore')
   @DocsEditable()
-  ObjectStore objectStore(String name) => _blink.Native_IDBTransaction_objectStore_Callback(this, name);
+  ObjectStore objectStore(String name) => _blink.BlinkIDBTransaction.$objectStore_Callback(this, name);
 
   /// Stream of `abort` events handled by this [Transaction].
   @DomName('IDBTransaction.onabort')
@@ -1064,19 +1064,19 @@
   @DomName('IDBVersionChangeEvent.dataLoss')
   @DocsEditable()
   @Experimental() // untriaged
-  String get dataLoss => _blink.Native_IDBVersionChangeEvent_dataLoss_Getter(this);
+  String get dataLoss => _blink.BlinkIDBVersionChangeEvent.$dataLoss_Getter(this);
 
   @DomName('IDBVersionChangeEvent.dataLossMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  String get dataLossMessage => _blink.Native_IDBVersionChangeEvent_dataLossMessage_Getter(this);
+  String get dataLossMessage => _blink.BlinkIDBVersionChangeEvent.$dataLossMessage_Getter(this);
 
   @DomName('IDBVersionChangeEvent.newVersion')
   @DocsEditable()
-  Object get newVersion => _blink.Native_IDBVersionChangeEvent_newVersion_Getter(this);
+  Object get newVersion => _blink.BlinkIDBVersionChangeEvent.$newVersion_Getter(this);
 
   @DomName('IDBVersionChangeEvent.oldVersion')
   @DocsEditable()
-  Object get oldVersion => _blink.Native_IDBVersionChangeEvent_oldVersion_Getter(this);
+  Object get oldVersion => _blink.BlinkIDBVersionChangeEvent.$oldVersion_Getter(this);
 
 }
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index 2d41870..d838dc5 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -13,6 +13,7 @@
 part 'iterable.dart';
 part 'list.dart';
 part 'lists.dart';
+part 'lru.dart';
 part 'print.dart';
 part 'sort.dart';
 part 'symbol.dart';
diff --git a/sdk/lib/internal/internal_sources.gypi b/sdk/lib/internal/internal_sources.gypi
index 17cc287..acdf220 100644
--- a/sdk/lib/internal/internal_sources.gypi
+++ b/sdk/lib/internal/internal_sources.gypi
@@ -10,6 +10,7 @@
     'iterable.dart',
     'list.dart',
     'lists.dart',
+    'lru.dart',
     'print.dart',
     'sort.dart',
     'symbol.dart',
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 5d1d535..b0a1d8f 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -1674,10 +1674,10 @@
                                  String host,
                                  int port,
                                  String path) {
+    Uri uri = new Uri(scheme: "http", host: host, port: port).resolve(path);
     // TODO(sgjesse): The path set here can contain both query and
     // fragment. They should be cracked and set correctly.
-    return _openUrl(method, new Uri(
-        scheme: "http", host: host, port: port, path: path));
+    return _openUrl(method, uri);
   }
 
   Future<HttpClientRequest> openUrl(String method, Uri url) {
@@ -1992,13 +1992,18 @@
 }
 
 
-class _HttpConnection extends LinkedListEntry<_HttpConnection> {
+class _HttpConnection
+    extends LinkedListEntry<_HttpConnection> with _ServiceObject {
   static const _ACTIVE = 0;
   static const _IDLE = 1;
   static const _CLOSING = 2;
   static const _DETACHED = 3;
 
-  final Socket _socket;
+  // Use HashMap, as we don't need to keep order.
+  static Map<int, _HttpConnection> _connections =
+      new HashMap<int, _HttpConnection>();
+
+  final _socket;
   final _HttpServer _httpServer;
   final _HttpParser _httpParser;
   int _state = _IDLE;
@@ -2009,6 +2014,8 @@
 
   _HttpConnection(this._socket, this._httpServer)
       : _httpParser = new _HttpParser.requestParser() {
+    try { _socket._owner = this; } catch (_) { print(_); }
+    _connections[_serviceId] = this;
     _httpParser.listenToStream(_socket);
     _subscription = _httpParser.listen(
         (incoming) {
@@ -2074,6 +2081,7 @@
     _state = _CLOSING;
     _socket.destroy();
     _httpServer._connectionClosed(this);
+    _connections.remove(_serviceId);
   }
 
   Future<Socket> detachSocket() {
@@ -2084,6 +2092,7 @@
     _HttpDetachedIncoming detachedIncoming = _httpParser.detachIncoming();
 
     return _streamFuture.then((_) {
+      _connections.remove(_serviceId);
       return new _DetachedSocket(_socket, detachedIncoming);
     });
   }
@@ -2094,6 +2103,42 @@
   bool get _isIdle => _state == _IDLE;
   bool get _isClosing => _state == _CLOSING;
   bool get _isDetached => _state == _DETACHED;
+
+  String get _serviceTypePath => 'io/http/serverconnections';
+  String get _serviceTypeName => 'HttpServerConnection';
+
+  Map _toJSON(bool ref) {
+    var name = "${_socket.address.host}:${_socket.port} <-> "
+        "${_socket.remoteAddress.host}:${_socket.remotePort}";
+    var r = {
+      'id': _servicePath,
+      'type': _serviceType(ref),
+      'name': name,
+      'user_name': name,
+    };
+    if (ref) {
+      return r;
+    }
+    r['server'] = _httpServer._toJSON(true);
+    try {
+      r['socket'] = _socket._toJSON(true);
+    } catch (_) {
+      r['socket'] = {
+        'id': _servicePath,
+        'type': '@Socket',
+        'name': 'UserSocket',
+        'user_name': 'UserSocket',
+      };
+    }
+    switch (_state) {
+      case _ACTIVE: r['state'] = "Active"; break;
+      case _IDLE: r['state'] = "Idle"; break;
+      case _CLOSING: r['state'] = "Closing"; break;
+      case _DETACHED: r['state'] = "Detached"; break;
+      default: r['state'] = 'Unknown'; break;
+    }
+    return r;
+  }
 }
 
 
@@ -2323,8 +2368,8 @@
     }
     r['port'] = port;
     r['address'] = address.host;
-    r['active'] = _activeConnections.length;
-    r['idle'] = _idleConnections.length;
+    r['active'] = _activeConnections.map((c) => c._toJSON(true)).toList();
+    r['idle'] = _idleConnections.map((c) => c._toJSON(true)).toList();
     r['closed'] = closed;
     return r;
   }
diff --git a/sdk/lib/io/platform_impl.dart b/sdk/lib/io/platform_impl.dart
index c6063a8..91bb7a7 100644
--- a/sdk/lib/io/platform_impl.dart
+++ b/sdk/lib/io/platform_impl.dart
@@ -71,7 +71,7 @@
           result[str.substring(0, equalsIndex)] =
               str.substring(equalsIndex + 1);
         }
-        _environmentCache = new UnmodifiableMapView(result);
+        _environmentCache = new UnmodifiableMapView<String, String>(result);
       } else {
         _environmentCache = env;
       }
@@ -90,16 +90,7 @@
 // Environment variables are case-insensitive on Windows. In order
 // to reflect that we use a case-insensitive string map on Windows.
 class _CaseInsensitiveStringMap<V> implements Map<String, V> {
-  Map<String, V> _map;
-
-  _CaseInsensitiveStringMap() : _map = new Map<String, V>();
-
-  _CaseInsensitiveStringMap.from(Map<String, V> other)
-      : _map = new Map<String, V>() {
-    other.forEach((String key, V value) {
-      _map[key.toUpperCase()] = value;
-    });
-  }
+  final Map<String, V> _map = new Map<String, V>();
 
   bool containsKey(String key) => _map.containsKey(key.toUpperCase());
   bool containsValue(Object value) => _map.containsValue(value);
@@ -121,4 +112,5 @@
   int get length => _map.length;
   bool get isEmpty => _map.isEmpty;
   bool get isNotEmpty => _map.isNotEmpty;
+  String toString() => _map.toString();
 }
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 680acb6..6261cf8 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -609,6 +609,10 @@
 
   int get remotePort => _socket.remotePort;
 
+  void set _owner(owner) {
+    (_socket as dynamic)._owner = owner;
+  }
+
   int available() {
     return _status != CONNECTED ? 0
                                 : _secureFilter.buffers[READ_PLAINTEXT].length;
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 4683218..96c55b8 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -7,10 +7,6 @@
  * independent workers that are similar to threads
  * but don't share memory,
  * communicating only via messages.
- *
- * See also:
- * [dart:isolate - Concurrency with Isolates](https://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html#ch03-dartisolate---concurrency-with-isolates)
- * in the library tour.
  */
 library dart.isolate;
 
diff --git a/sdk/lib/js/dart2js/js_dart2js.dart b/sdk/lib/js/dart2js/js_dart2js.dart
index 84ec8f3..27fac2e 100644
--- a/sdk/lib/js/dart2js/js_dart2js.dart
+++ b/sdk/lib/js/dart2js/js_dart2js.dart
@@ -97,7 +97,7 @@
 import 'dart:_js_helper' show Primitives, convertDartClosureToJS,
     getIsolateAffinityTag;
 
-final JsObject context = _wrapToDart(Primitives.computeGlobalThis());
+final JsObject context = _wrapToDart(JS('', 'self'));
 
 _convertDartFunction(Function f, {bool captureThis: false}) {
   return JS('',
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index ebfc7e4..c2bf722 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -15,151 +15,151 @@
 
 
 // FIXME: Can we make this private?
-const svgBlinkMap = const {
-  'SVGAElement': AElement,
-  'SVGAltGlyphDefElement': _SVGAltGlyphDefElement,
-  'SVGAltGlyphElement': AltGlyphElement,
-  'SVGAltGlyphItemElement': _SVGAltGlyphItemElement,
-  'SVGAngle': Angle,
-  'SVGAnimateElement': AnimateElement,
-  'SVGAnimateMotionElement': AnimateMotionElement,
-  'SVGAnimateTransformElement': AnimateTransformElement,
-  'SVGAnimatedAngle': AnimatedAngle,
-  'SVGAnimatedBoolean': AnimatedBoolean,
-  'SVGAnimatedEnumeration': AnimatedEnumeration,
-  'SVGAnimatedInteger': AnimatedInteger,
-  'SVGAnimatedLength': AnimatedLength,
-  'SVGAnimatedLengthList': AnimatedLengthList,
-  'SVGAnimatedNumber': AnimatedNumber,
-  'SVGAnimatedNumberList': AnimatedNumberList,
-  'SVGAnimatedPreserveAspectRatio': AnimatedPreserveAspectRatio,
-  'SVGAnimatedRect': AnimatedRect,
-  'SVGAnimatedString': AnimatedString,
-  'SVGAnimatedTransformList': AnimatedTransformList,
-  'SVGAnimationElement': AnimationElement,
-  'SVGCircleElement': CircleElement,
-  'SVGClipPathElement': ClipPathElement,
-  'SVGComponentTransferFunctionElement': _SVGComponentTransferFunctionElement,
-  'SVGCursorElement': _SVGCursorElement,
-  'SVGDefsElement': DefsElement,
-  'SVGDescElement': DescElement,
-  'SVGDiscardElement': DiscardElement,
-  'SVGElement': SvgElement,
-  'SVGElementInstance': ElementInstance,
-  'SVGElementInstanceList': _ElementInstanceList,
-  'SVGEllipseElement': EllipseElement,
-  'SVGFEBlendElement': FEBlendElement,
-  'SVGFEColorMatrixElement': FEColorMatrixElement,
-  'SVGFEComponentTransferElement': FEComponentTransferElement,
-  'SVGFECompositeElement': FECompositeElement,
-  'SVGFEConvolveMatrixElement': FEConvolveMatrixElement,
-  'SVGFEDiffuseLightingElement': FEDiffuseLightingElement,
-  'SVGFEDisplacementMapElement': FEDisplacementMapElement,
-  'SVGFEDistantLightElement': FEDistantLightElement,
-  'SVGFEDropShadowElement': _SVGFEDropShadowElement,
-  'SVGFEFloodElement': FEFloodElement,
-  'SVGFEFuncAElement': FEFuncAElement,
-  'SVGFEFuncBElement': FEFuncBElement,
-  'SVGFEFuncGElement': FEFuncGElement,
-  'SVGFEFuncRElement': FEFuncRElement,
-  'SVGFEGaussianBlurElement': FEGaussianBlurElement,
-  'SVGFEImageElement': FEImageElement,
-  'SVGFEMergeElement': FEMergeElement,
-  'SVGFEMergeNodeElement': FEMergeNodeElement,
-  'SVGFEMorphologyElement': FEMorphologyElement,
-  'SVGFEOffsetElement': FEOffsetElement,
-  'SVGFEPointLightElement': FEPointLightElement,
-  'SVGFESpecularLightingElement': FESpecularLightingElement,
-  'SVGFESpotLightElement': FESpotLightElement,
-  'SVGFETileElement': FETileElement,
-  'SVGFETurbulenceElement': FETurbulenceElement,
-  'SVGFilterElement': FilterElement,
-  'SVGFilterPrimitiveStandardAttributes': FilterPrimitiveStandardAttributes,
-  'SVGFitToViewBox': FitToViewBox,
-  'SVGFontElement': _SVGFontElement,
-  'SVGFontFaceElement': _SVGFontFaceElement,
-  'SVGFontFaceFormatElement': _SVGFontFaceFormatElement,
-  'SVGFontFaceNameElement': _SVGFontFaceNameElement,
-  'SVGFontFaceSrcElement': _SVGFontFaceSrcElement,
-  'SVGFontFaceUriElement': _SVGFontFaceUriElement,
-  'SVGForeignObjectElement': ForeignObjectElement,
-  'SVGGElement': GElement,
-  'SVGGeometryElement': GeometryElement,
-  'SVGGlyphElement': _SVGGlyphElement,
-  'SVGGlyphRefElement': _SVGGlyphRefElement,
-  'SVGGradientElement': _GradientElement,
-  'SVGGraphicsElement': GraphicsElement,
-  'SVGHKernElement': _SVGHKernElement,
-  'SVGImageElement': ImageElement,
-  'SVGLength': Length,
-  'SVGLengthList': LengthList,
-  'SVGLineElement': LineElement,
-  'SVGLinearGradientElement': LinearGradientElement,
-  'SVGMPathElement': _SVGMPathElement,
-  'SVGMarkerElement': MarkerElement,
-  'SVGMaskElement': MaskElement,
-  'SVGMatrix': Matrix,
-  'SVGMetadataElement': MetadataElement,
-  'SVGMissingGlyphElement': _SVGMissingGlyphElement,
-  'SVGNumber': Number,
-  'SVGNumberList': NumberList,
-  'SVGPathElement': PathElement,
-  'SVGPathSeg': PathSeg,
-  'SVGPathSegArcAbs': PathSegArcAbs,
-  'SVGPathSegArcRel': PathSegArcRel,
-  'SVGPathSegClosePath': PathSegClosePath,
-  'SVGPathSegCurvetoCubicAbs': PathSegCurvetoCubicAbs,
-  'SVGPathSegCurvetoCubicRel': PathSegCurvetoCubicRel,
-  'SVGPathSegCurvetoCubicSmoothAbs': PathSegCurvetoCubicSmoothAbs,
-  'SVGPathSegCurvetoCubicSmoothRel': PathSegCurvetoCubicSmoothRel,
-  'SVGPathSegCurvetoQuadraticAbs': PathSegCurvetoQuadraticAbs,
-  'SVGPathSegCurvetoQuadraticRel': PathSegCurvetoQuadraticRel,
-  'SVGPathSegCurvetoQuadraticSmoothAbs': PathSegCurvetoQuadraticSmoothAbs,
-  'SVGPathSegCurvetoQuadraticSmoothRel': PathSegCurvetoQuadraticSmoothRel,
-  'SVGPathSegLinetoAbs': PathSegLinetoAbs,
-  'SVGPathSegLinetoHorizontalAbs': PathSegLinetoHorizontalAbs,
-  'SVGPathSegLinetoHorizontalRel': PathSegLinetoHorizontalRel,
-  'SVGPathSegLinetoRel': PathSegLinetoRel,
-  'SVGPathSegLinetoVerticalAbs': PathSegLinetoVerticalAbs,
-  'SVGPathSegLinetoVerticalRel': PathSegLinetoVerticalRel,
-  'SVGPathSegList': PathSegList,
-  'SVGPathSegMovetoAbs': PathSegMovetoAbs,
-  'SVGPathSegMovetoRel': PathSegMovetoRel,
-  'SVGPatternElement': PatternElement,
-  'SVGPoint': Point,
-  'SVGPointList': PointList,
-  'SVGPolygonElement': PolygonElement,
-  'SVGPolylineElement': PolylineElement,
-  'SVGPreserveAspectRatio': PreserveAspectRatio,
-  'SVGRadialGradientElement': RadialGradientElement,
-  'SVGRect': Rect,
-  'SVGRectElement': RectElement,
-  'SVGRenderingIntent': RenderingIntent,
-  'SVGSVGElement': SvgSvgElement,
-  'SVGScriptElement': ScriptElement,
-  'SVGSetElement': SetElement,
-  'SVGStopElement': StopElement,
-  'SVGStringList': StringList,
-  'SVGStyleElement': StyleElement,
-  'SVGSwitchElement': SwitchElement,
-  'SVGSymbolElement': SymbolElement,
-  'SVGTSpanElement': TSpanElement,
-  'SVGTests': Tests,
-  'SVGTextContentElement': TextContentElement,
-  'SVGTextElement': TextElement,
-  'SVGTextPathElement': TextPathElement,
-  'SVGTextPositioningElement': TextPositioningElement,
-  'SVGTitleElement': TitleElement,
-  'SVGTransform': Transform,
-  'SVGTransformList': TransformList,
-  'SVGURIReference': UriReference,
-  'SVGUnitTypes': UnitTypes,
-  'SVGUseElement': UseElement,
-  'SVGVKernElement': _SVGVKernElement,
-  'SVGViewElement': ViewElement,
-  'SVGViewSpec': ViewSpec,
-  'SVGZoomAndPan': ZoomAndPan,
-  'SVGZoomEvent': ZoomEvent,
+final svgBlinkMap = {
+  'SVGAElement': () => AElement,
+  'SVGAltGlyphDefElement': () => _SVGAltGlyphDefElement,
+  'SVGAltGlyphElement': () => AltGlyphElement,
+  'SVGAltGlyphItemElement': () => _SVGAltGlyphItemElement,
+  'SVGAngle': () => Angle,
+  'SVGAnimateElement': () => AnimateElement,
+  'SVGAnimateMotionElement': () => AnimateMotionElement,
+  'SVGAnimateTransformElement': () => AnimateTransformElement,
+  'SVGAnimatedAngle': () => AnimatedAngle,
+  'SVGAnimatedBoolean': () => AnimatedBoolean,
+  'SVGAnimatedEnumeration': () => AnimatedEnumeration,
+  'SVGAnimatedInteger': () => AnimatedInteger,
+  'SVGAnimatedLength': () => AnimatedLength,
+  'SVGAnimatedLengthList': () => AnimatedLengthList,
+  'SVGAnimatedNumber': () => AnimatedNumber,
+  'SVGAnimatedNumberList': () => AnimatedNumberList,
+  'SVGAnimatedPreserveAspectRatio': () => AnimatedPreserveAspectRatio,
+  'SVGAnimatedRect': () => AnimatedRect,
+  'SVGAnimatedString': () => AnimatedString,
+  'SVGAnimatedTransformList': () => AnimatedTransformList,
+  'SVGAnimationElement': () => AnimationElement,
+  'SVGCircleElement': () => CircleElement,
+  'SVGClipPathElement': () => ClipPathElement,
+  'SVGComponentTransferFunctionElement': () => _SVGComponentTransferFunctionElement,
+  'SVGCursorElement': () => _SVGCursorElement,
+  'SVGDefsElement': () => DefsElement,
+  'SVGDescElement': () => DescElement,
+  'SVGDiscardElement': () => DiscardElement,
+  'SVGElement': () => SvgElement,
+  'SVGElementInstance': () => ElementInstance,
+  'SVGElementInstanceList': () => _ElementInstanceList,
+  'SVGEllipseElement': () => EllipseElement,
+  'SVGFEBlendElement': () => FEBlendElement,
+  'SVGFEColorMatrixElement': () => FEColorMatrixElement,
+  'SVGFEComponentTransferElement': () => FEComponentTransferElement,
+  'SVGFECompositeElement': () => FECompositeElement,
+  'SVGFEConvolveMatrixElement': () => FEConvolveMatrixElement,
+  'SVGFEDiffuseLightingElement': () => FEDiffuseLightingElement,
+  'SVGFEDisplacementMapElement': () => FEDisplacementMapElement,
+  'SVGFEDistantLightElement': () => FEDistantLightElement,
+  'SVGFEDropShadowElement': () => _SVGFEDropShadowElement,
+  'SVGFEFloodElement': () => FEFloodElement,
+  'SVGFEFuncAElement': () => FEFuncAElement,
+  'SVGFEFuncBElement': () => FEFuncBElement,
+  'SVGFEFuncGElement': () => FEFuncGElement,
+  'SVGFEFuncRElement': () => FEFuncRElement,
+  'SVGFEGaussianBlurElement': () => FEGaussianBlurElement,
+  'SVGFEImageElement': () => FEImageElement,
+  'SVGFEMergeElement': () => FEMergeElement,
+  'SVGFEMergeNodeElement': () => FEMergeNodeElement,
+  'SVGFEMorphologyElement': () => FEMorphologyElement,
+  'SVGFEOffsetElement': () => FEOffsetElement,
+  'SVGFEPointLightElement': () => FEPointLightElement,
+  'SVGFESpecularLightingElement': () => FESpecularLightingElement,
+  'SVGFESpotLightElement': () => FESpotLightElement,
+  'SVGFETileElement': () => FETileElement,
+  'SVGFETurbulenceElement': () => FETurbulenceElement,
+  'SVGFilterElement': () => FilterElement,
+  'SVGFilterPrimitiveStandardAttributes': () => FilterPrimitiveStandardAttributes,
+  'SVGFitToViewBox': () => FitToViewBox,
+  'SVGFontElement': () => _SVGFontElement,
+  'SVGFontFaceElement': () => _SVGFontFaceElement,
+  'SVGFontFaceFormatElement': () => _SVGFontFaceFormatElement,
+  'SVGFontFaceNameElement': () => _SVGFontFaceNameElement,
+  'SVGFontFaceSrcElement': () => _SVGFontFaceSrcElement,
+  'SVGFontFaceUriElement': () => _SVGFontFaceUriElement,
+  'SVGForeignObjectElement': () => ForeignObjectElement,
+  'SVGGElement': () => GElement,
+  'SVGGeometryElement': () => GeometryElement,
+  'SVGGlyphElement': () => _SVGGlyphElement,
+  'SVGGlyphRefElement': () => _SVGGlyphRefElement,
+  'SVGGradientElement': () => _GradientElement,
+  'SVGGraphicsElement': () => GraphicsElement,
+  'SVGHKernElement': () => _SVGHKernElement,
+  'SVGImageElement': () => ImageElement,
+  'SVGLength': () => Length,
+  'SVGLengthList': () => LengthList,
+  'SVGLineElement': () => LineElement,
+  'SVGLinearGradientElement': () => LinearGradientElement,
+  'SVGMPathElement': () => _SVGMPathElement,
+  'SVGMarkerElement': () => MarkerElement,
+  'SVGMaskElement': () => MaskElement,
+  'SVGMatrix': () => Matrix,
+  'SVGMetadataElement': () => MetadataElement,
+  'SVGMissingGlyphElement': () => _SVGMissingGlyphElement,
+  'SVGNumber': () => Number,
+  'SVGNumberList': () => NumberList,
+  'SVGPathElement': () => PathElement,
+  'SVGPathSeg': () => PathSeg,
+  'SVGPathSegArcAbs': () => PathSegArcAbs,
+  'SVGPathSegArcRel': () => PathSegArcRel,
+  'SVGPathSegClosePath': () => PathSegClosePath,
+  'SVGPathSegCurvetoCubicAbs': () => PathSegCurvetoCubicAbs,
+  'SVGPathSegCurvetoCubicRel': () => PathSegCurvetoCubicRel,
+  'SVGPathSegCurvetoCubicSmoothAbs': () => PathSegCurvetoCubicSmoothAbs,
+  'SVGPathSegCurvetoCubicSmoothRel': () => PathSegCurvetoCubicSmoothRel,
+  'SVGPathSegCurvetoQuadraticAbs': () => PathSegCurvetoQuadraticAbs,
+  'SVGPathSegCurvetoQuadraticRel': () => PathSegCurvetoQuadraticRel,
+  'SVGPathSegCurvetoQuadraticSmoothAbs': () => PathSegCurvetoQuadraticSmoothAbs,
+  'SVGPathSegCurvetoQuadraticSmoothRel': () => PathSegCurvetoQuadraticSmoothRel,
+  'SVGPathSegLinetoAbs': () => PathSegLinetoAbs,
+  'SVGPathSegLinetoHorizontalAbs': () => PathSegLinetoHorizontalAbs,
+  'SVGPathSegLinetoHorizontalRel': () => PathSegLinetoHorizontalRel,
+  'SVGPathSegLinetoRel': () => PathSegLinetoRel,
+  'SVGPathSegLinetoVerticalAbs': () => PathSegLinetoVerticalAbs,
+  'SVGPathSegLinetoVerticalRel': () => PathSegLinetoVerticalRel,
+  'SVGPathSegList': () => PathSegList,
+  'SVGPathSegMovetoAbs': () => PathSegMovetoAbs,
+  'SVGPathSegMovetoRel': () => PathSegMovetoRel,
+  'SVGPatternElement': () => PatternElement,
+  'SVGPoint': () => Point,
+  'SVGPointList': () => PointList,
+  'SVGPolygonElement': () => PolygonElement,
+  'SVGPolylineElement': () => PolylineElement,
+  'SVGPreserveAspectRatio': () => PreserveAspectRatio,
+  'SVGRadialGradientElement': () => RadialGradientElement,
+  'SVGRect': () => Rect,
+  'SVGRectElement': () => RectElement,
+  'SVGRenderingIntent': () => RenderingIntent,
+  'SVGSVGElement': () => SvgSvgElement,
+  'SVGScriptElement': () => ScriptElement,
+  'SVGSetElement': () => SetElement,
+  'SVGStopElement': () => StopElement,
+  'SVGStringList': () => StringList,
+  'SVGStyleElement': () => StyleElement,
+  'SVGSwitchElement': () => SwitchElement,
+  'SVGSymbolElement': () => SymbolElement,
+  'SVGTSpanElement': () => TSpanElement,
+  'SVGTests': () => Tests,
+  'SVGTextContentElement': () => TextContentElement,
+  'SVGTextElement': () => TextElement,
+  'SVGTextPathElement': () => TextPathElement,
+  'SVGTextPositioningElement': () => TextPositioningElement,
+  'SVGTitleElement': () => TitleElement,
+  'SVGTransform': () => Transform,
+  'SVGTransformList': () => TransformList,
+  'SVGURIReference': () => UriReference,
+  'SVGUnitTypes': () => UnitTypes,
+  'SVGUseElement': () => UseElement,
+  'SVGVKernElement': () => _SVGVKernElement,
+  'SVGViewElement': () => ViewElement,
+  'SVGViewSpec': () => ViewSpec,
+  'SVGZoomAndPan': () => ZoomAndPan,
+  'SVGZoomEvent': () => ZoomEvent,
 
 };
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -200,11 +200,11 @@
 
   @DomName('SVGAElement.target')
   @DocsEditable()
-  AnimatedString get target => _blink.Native_SVGAElement_target_Getter(this);
+  AnimatedString get target => _blink.BlinkSVGAElement.$target_Getter(this);
 
   @DomName('SVGAElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGAElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGAElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -239,23 +239,23 @@
 
   @DomName('SVGAltGlyphElement.format')
   @DocsEditable()
-  String get format => _blink.Native_SVGAltGlyphElement_format_Getter(this);
+  String get format => _blink.BlinkSVGAltGlyphElement.$format_Getter(this);
 
   @DomName('SVGAltGlyphElement.format')
   @DocsEditable()
-  void set format(String value) => _blink.Native_SVGAltGlyphElement_format_Setter(this, value);
+  void set format(String value) => _blink.BlinkSVGAltGlyphElement.$format_Setter(this, value);
 
   @DomName('SVGAltGlyphElement.glyphRef')
   @DocsEditable()
-  String get glyphRef => _blink.Native_SVGAltGlyphElement_glyphRef_Getter(this);
+  String get glyphRef => _blink.BlinkSVGAltGlyphElement.$glyphRef_Getter(this);
 
   @DomName('SVGAltGlyphElement.glyphRef')
   @DocsEditable()
-  void set glyphRef(String value) => _blink.Native_SVGAltGlyphElement_glyphRef_Setter(this, value);
+  void set glyphRef(String value) => _blink.BlinkSVGAltGlyphElement.$glyphRef_Setter(this, value);
 
   @DomName('SVGAltGlyphElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGAltGlyphElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGAltGlyphElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -294,39 +294,39 @@
 
   @DomName('SVGAngle.unitType')
   @DocsEditable()
-  int get unitType => _blink.Native_SVGAngle_unitType_Getter(this);
+  int get unitType => _blink.BlinkSVGAngle.$unitType_Getter(this);
 
   @DomName('SVGAngle.value')
   @DocsEditable()
-  num get value => _blink.Native_SVGAngle_value_Getter(this);
+  num get value => _blink.BlinkSVGAngle.$value_Getter(this);
 
   @DomName('SVGAngle.value')
   @DocsEditable()
-  void set value(num value) => _blink.Native_SVGAngle_value_Setter(this, value);
+  void set value(num value) => _blink.BlinkSVGAngle.$value_Setter(this, value);
 
   @DomName('SVGAngle.valueAsString')
   @DocsEditable()
-  String get valueAsString => _blink.Native_SVGAngle_valueAsString_Getter(this);
+  String get valueAsString => _blink.BlinkSVGAngle.$valueAsString_Getter(this);
 
   @DomName('SVGAngle.valueAsString')
   @DocsEditable()
-  void set valueAsString(String value) => _blink.Native_SVGAngle_valueAsString_Setter(this, value);
+  void set valueAsString(String value) => _blink.BlinkSVGAngle.$valueAsString_Setter(this, value);
 
   @DomName('SVGAngle.valueInSpecifiedUnits')
   @DocsEditable()
-  num get valueInSpecifiedUnits => _blink.Native_SVGAngle_valueInSpecifiedUnits_Getter(this);
+  num get valueInSpecifiedUnits => _blink.BlinkSVGAngle.$valueInSpecifiedUnits_Getter(this);
 
   @DomName('SVGAngle.valueInSpecifiedUnits')
   @DocsEditable()
-  void set valueInSpecifiedUnits(num value) => _blink.Native_SVGAngle_valueInSpecifiedUnits_Setter(this, value);
+  void set valueInSpecifiedUnits(num value) => _blink.BlinkSVGAngle.$valueInSpecifiedUnits_Setter(this, value);
 
   @DomName('SVGAngle.convertToSpecifiedUnits')
   @DocsEditable()
-  void convertToSpecifiedUnits(int unitType) => _blink.Native_SVGAngle_convertToSpecifiedUnits_Callback(this, unitType);
+  void convertToSpecifiedUnits(int unitType) => _blink.BlinkSVGAngle.$convertToSpecifiedUnits_Callback(this, unitType);
 
   @DomName('SVGAngle.newValueSpecifiedUnits')
   @DocsEditable()
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.Native_SVGAngle_newValueSpecifiedUnits_Callback(this, unitType, valueInSpecifiedUnits);
+  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.BlinkSVGAngle.$newValueSpecifiedUnits_Callback(this, unitType, valueInSpecifiedUnits);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -438,11 +438,11 @@
 
   @DomName('SVGAnimatedAngle.animVal')
   @DocsEditable()
-  Angle get animVal => _blink.Native_SVGAnimatedAngle_animVal_Getter(this);
+  Angle get animVal => _blink.BlinkSVGAnimatedAngle.$animVal_Getter(this);
 
   @DomName('SVGAnimatedAngle.baseVal')
   @DocsEditable()
-  Angle get baseVal => _blink.Native_SVGAnimatedAngle_baseVal_Getter(this);
+  Angle get baseVal => _blink.BlinkSVGAnimatedAngle.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -461,15 +461,15 @@
 
   @DomName('SVGAnimatedBoolean.animVal')
   @DocsEditable()
-  bool get animVal => _blink.Native_SVGAnimatedBoolean_animVal_Getter(this);
+  bool get animVal => _blink.BlinkSVGAnimatedBoolean.$animVal_Getter(this);
 
   @DomName('SVGAnimatedBoolean.baseVal')
   @DocsEditable()
-  bool get baseVal => _blink.Native_SVGAnimatedBoolean_baseVal_Getter(this);
+  bool get baseVal => _blink.BlinkSVGAnimatedBoolean.$baseVal_Getter(this);
 
   @DomName('SVGAnimatedBoolean.baseVal')
   @DocsEditable()
-  void set baseVal(bool value) => _blink.Native_SVGAnimatedBoolean_baseVal_Setter(this, value);
+  void set baseVal(bool value) => _blink.BlinkSVGAnimatedBoolean.$baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -488,15 +488,15 @@
 
   @DomName('SVGAnimatedEnumeration.animVal')
   @DocsEditable()
-  int get animVal => _blink.Native_SVGAnimatedEnumeration_animVal_Getter(this);
+  int get animVal => _blink.BlinkSVGAnimatedEnumeration.$animVal_Getter(this);
 
   @DomName('SVGAnimatedEnumeration.baseVal')
   @DocsEditable()
-  int get baseVal => _blink.Native_SVGAnimatedEnumeration_baseVal_Getter(this);
+  int get baseVal => _blink.BlinkSVGAnimatedEnumeration.$baseVal_Getter(this);
 
   @DomName('SVGAnimatedEnumeration.baseVal')
   @DocsEditable()
-  void set baseVal(int value) => _blink.Native_SVGAnimatedEnumeration_baseVal_Setter(this, value);
+  void set baseVal(int value) => _blink.BlinkSVGAnimatedEnumeration.$baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -515,15 +515,15 @@
 
   @DomName('SVGAnimatedInteger.animVal')
   @DocsEditable()
-  int get animVal => _blink.Native_SVGAnimatedInteger_animVal_Getter(this);
+  int get animVal => _blink.BlinkSVGAnimatedInteger.$animVal_Getter(this);
 
   @DomName('SVGAnimatedInteger.baseVal')
   @DocsEditable()
-  int get baseVal => _blink.Native_SVGAnimatedInteger_baseVal_Getter(this);
+  int get baseVal => _blink.BlinkSVGAnimatedInteger.$baseVal_Getter(this);
 
   @DomName('SVGAnimatedInteger.baseVal')
   @DocsEditable()
-  void set baseVal(int value) => _blink.Native_SVGAnimatedInteger_baseVal_Setter(this, value);
+  void set baseVal(int value) => _blink.BlinkSVGAnimatedInteger.$baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -542,11 +542,11 @@
 
   @DomName('SVGAnimatedLength.animVal')
   @DocsEditable()
-  Length get animVal => _blink.Native_SVGAnimatedLength_animVal_Getter(this);
+  Length get animVal => _blink.BlinkSVGAnimatedLength.$animVal_Getter(this);
 
   @DomName('SVGAnimatedLength.baseVal')
   @DocsEditable()
-  Length get baseVal => _blink.Native_SVGAnimatedLength_baseVal_Getter(this);
+  Length get baseVal => _blink.BlinkSVGAnimatedLength.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -565,11 +565,11 @@
 
   @DomName('SVGAnimatedLengthList.animVal')
   @DocsEditable()
-  LengthList get animVal => _blink.Native_SVGAnimatedLengthList_animVal_Getter(this);
+  LengthList get animVal => _blink.BlinkSVGAnimatedLengthList.$animVal_Getter(this);
 
   @DomName('SVGAnimatedLengthList.baseVal')
   @DocsEditable()
-  LengthList get baseVal => _blink.Native_SVGAnimatedLengthList_baseVal_Getter(this);
+  LengthList get baseVal => _blink.BlinkSVGAnimatedLengthList.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -588,15 +588,15 @@
 
   @DomName('SVGAnimatedNumber.animVal')
   @DocsEditable()
-  double get animVal => _blink.Native_SVGAnimatedNumber_animVal_Getter(this);
+  double get animVal => _blink.BlinkSVGAnimatedNumber.$animVal_Getter(this);
 
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
-  num get baseVal => _blink.Native_SVGAnimatedNumber_baseVal_Getter(this);
+  num get baseVal => _blink.BlinkSVGAnimatedNumber.$baseVal_Getter(this);
 
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
-  void set baseVal(num value) => _blink.Native_SVGAnimatedNumber_baseVal_Setter(this, value);
+  void set baseVal(num value) => _blink.BlinkSVGAnimatedNumber.$baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -615,11 +615,11 @@
 
   @DomName('SVGAnimatedNumberList.animVal')
   @DocsEditable()
-  NumberList get animVal => _blink.Native_SVGAnimatedNumberList_animVal_Getter(this);
+  NumberList get animVal => _blink.BlinkSVGAnimatedNumberList.$animVal_Getter(this);
 
   @DomName('SVGAnimatedNumberList.baseVal')
   @DocsEditable()
-  NumberList get baseVal => _blink.Native_SVGAnimatedNumberList_baseVal_Getter(this);
+  NumberList get baseVal => _blink.BlinkSVGAnimatedNumberList.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -638,11 +638,11 @@
 
   @DomName('SVGAnimatedPreserveAspectRatio.animVal')
   @DocsEditable()
-  PreserveAspectRatio get animVal => _blink.Native_SVGAnimatedPreserveAspectRatio_animVal_Getter(this);
+  PreserveAspectRatio get animVal => _blink.BlinkSVGAnimatedPreserveAspectRatio.$animVal_Getter(this);
 
   @DomName('SVGAnimatedPreserveAspectRatio.baseVal')
   @DocsEditable()
-  PreserveAspectRatio get baseVal => _blink.Native_SVGAnimatedPreserveAspectRatio_baseVal_Getter(this);
+  PreserveAspectRatio get baseVal => _blink.BlinkSVGAnimatedPreserveAspectRatio.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -661,11 +661,11 @@
 
   @DomName('SVGAnimatedRect.animVal')
   @DocsEditable()
-  Rect get animVal => _blink.Native_SVGAnimatedRect_animVal_Getter(this);
+  Rect get animVal => _blink.BlinkSVGAnimatedRect.$animVal_Getter(this);
 
   @DomName('SVGAnimatedRect.baseVal')
   @DocsEditable()
-  Rect get baseVal => _blink.Native_SVGAnimatedRect_baseVal_Getter(this);
+  Rect get baseVal => _blink.BlinkSVGAnimatedRect.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -684,15 +684,15 @@
 
   @DomName('SVGAnimatedString.animVal')
   @DocsEditable()
-  String get animVal => _blink.Native_SVGAnimatedString_animVal_Getter(this);
+  String get animVal => _blink.BlinkSVGAnimatedString.$animVal_Getter(this);
 
   @DomName('SVGAnimatedString.baseVal')
   @DocsEditable()
-  String get baseVal => _blink.Native_SVGAnimatedString_baseVal_Getter(this);
+  String get baseVal => _blink.BlinkSVGAnimatedString.$baseVal_Getter(this);
 
   @DomName('SVGAnimatedString.baseVal')
   @DocsEditable()
-  void set baseVal(String value) => _blink.Native_SVGAnimatedString_baseVal_Setter(this, value);
+  void set baseVal(String value) => _blink.BlinkSVGAnimatedString.$baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -711,11 +711,11 @@
 
   @DomName('SVGAnimatedTransformList.animVal')
   @DocsEditable()
-  TransformList get animVal => _blink.Native_SVGAnimatedTransformList_animVal_Getter(this);
+  TransformList get animVal => _blink.BlinkSVGAnimatedTransformList.$animVal_Getter(this);
 
   @DomName('SVGAnimatedTransformList.baseVal')
   @DocsEditable()
-  TransformList get baseVal => _blink.Native_SVGAnimatedTransformList_baseVal_Getter(this);
+  TransformList get baseVal => _blink.BlinkSVGAnimatedTransformList.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -744,51 +744,51 @@
 
   @DomName('SVGAnimationElement.targetElement')
   @DocsEditable()
-  SvgElement get targetElement => _blink.Native_SVGAnimationElement_targetElement_Getter(this);
+  SvgElement get targetElement => _blink.BlinkSVGAnimationElement.$targetElement_Getter(this);
 
   @DomName('SVGAnimationElement.beginElement')
   @DocsEditable()
-  void beginElement() => _blink.Native_SVGAnimationElement_beginElement_Callback(this);
+  void beginElement() => _blink.BlinkSVGAnimationElement.$beginElement_Callback(this);
 
   @DomName('SVGAnimationElement.beginElementAt')
   @DocsEditable()
-  void beginElementAt(num offset) => _blink.Native_SVGAnimationElement_beginElementAt_Callback(this, offset);
+  void beginElementAt(num offset) => _blink.BlinkSVGAnimationElement.$beginElementAt_Callback(this, offset);
 
   @DomName('SVGAnimationElement.endElement')
   @DocsEditable()
-  void endElement() => _blink.Native_SVGAnimationElement_endElement_Callback(this);
+  void endElement() => _blink.BlinkSVGAnimationElement.$endElement_Callback(this);
 
   @DomName('SVGAnimationElement.endElementAt')
   @DocsEditable()
-  void endElementAt(num offset) => _blink.Native_SVGAnimationElement_endElementAt_Callback(this, offset);
+  void endElementAt(num offset) => _blink.BlinkSVGAnimationElement.$endElementAt_Callback(this, offset);
 
   @DomName('SVGAnimationElement.getCurrentTime')
   @DocsEditable()
-  double getCurrentTime() => _blink.Native_SVGAnimationElement_getCurrentTime_Callback(this);
+  double getCurrentTime() => _blink.BlinkSVGAnimationElement.$getCurrentTime_Callback(this);
 
   @DomName('SVGAnimationElement.getSimpleDuration')
   @DocsEditable()
-  double getSimpleDuration() => _blink.Native_SVGAnimationElement_getSimpleDuration_Callback(this);
+  double getSimpleDuration() => _blink.BlinkSVGAnimationElement.$getSimpleDuration_Callback(this);
 
   @DomName('SVGAnimationElement.getStartTime')
   @DocsEditable()
-  double getStartTime() => _blink.Native_SVGAnimationElement_getStartTime_Callback(this);
+  double getStartTime() => _blink.BlinkSVGAnimationElement.$getStartTime_Callback(this);
 
   @DomName('SVGAnimationElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.Native_SVGAnimationElement_requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGAnimationElement.$requiredExtensions_Getter(this);
 
   @DomName('SVGAnimationElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.Native_SVGAnimationElement_requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGAnimationElement.$requiredFeatures_Getter(this);
 
   @DomName('SVGAnimationElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.Native_SVGAnimationElement_systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGAnimationElement.$systemLanguage_Getter(this);
 
   @DomName('SVGAnimationElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.Native_SVGAnimationElement_hasExtension_Callback(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGAnimationElement.$hasExtension_Callback(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -817,15 +817,15 @@
 
   @DomName('SVGCircleElement.cx')
   @DocsEditable()
-  AnimatedLength get cx => _blink.Native_SVGCircleElement_cx_Getter(this);
+  AnimatedLength get cx => _blink.BlinkSVGCircleElement.$cx_Getter(this);
 
   @DomName('SVGCircleElement.cy')
   @DocsEditable()
-  AnimatedLength get cy => _blink.Native_SVGCircleElement_cy_Getter(this);
+  AnimatedLength get cy => _blink.BlinkSVGCircleElement.$cy_Getter(this);
 
   @DomName('SVGCircleElement.r')
   @DocsEditable()
-  AnimatedLength get r => _blink.Native_SVGCircleElement_r_Getter(this);
+  AnimatedLength get r => _blink.BlinkSVGCircleElement.$r_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -854,7 +854,7 @@
 
   @DomName('SVGClipPathElement.clipPathUnits')
   @DocsEditable()
-  AnimatedEnumeration get clipPathUnits => _blink.Native_SVGClipPathElement_clipPathUnits_Getter(this);
+  AnimatedEnumeration get clipPathUnits => _blink.BlinkSVGClipPathElement.$clipPathUnits_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1368,31 +1368,31 @@
 
   @DomName('SVGElementInstance.correspondingElement')
   @DocsEditable()
-  SvgElement get correspondingElement => _blink.Native_SVGElementInstance_correspondingElement_Getter(this);
+  SvgElement get correspondingElement => _blink.BlinkSVGElementInstance.$correspondingElement_Getter(this);
 
   @DomName('SVGElementInstance.correspondingUseElement')
   @DocsEditable()
-  UseElement get correspondingUseElement => _blink.Native_SVGElementInstance_correspondingUseElement_Getter(this);
+  UseElement get correspondingUseElement => _blink.BlinkSVGElementInstance.$correspondingUseElement_Getter(this);
 
   @DomName('SVGElementInstance.firstChild')
   @DocsEditable()
-  ElementInstance get firstChild => _blink.Native_SVGElementInstance_firstChild_Getter(this);
+  ElementInstance get firstChild => _blink.BlinkSVGElementInstance.$firstChild_Getter(this);
 
   @DomName('SVGElementInstance.lastChild')
   @DocsEditable()
-  ElementInstance get lastChild => _blink.Native_SVGElementInstance_lastChild_Getter(this);
+  ElementInstance get lastChild => _blink.BlinkSVGElementInstance.$lastChild_Getter(this);
 
   @DomName('SVGElementInstance.nextSibling')
   @DocsEditable()
-  ElementInstance get nextSibling => _blink.Native_SVGElementInstance_nextSibling_Getter(this);
+  ElementInstance get nextSibling => _blink.BlinkSVGElementInstance.$nextSibling_Getter(this);
 
   @DomName('SVGElementInstance.parentNode')
   @DocsEditable()
-  ElementInstance get parentNode => _blink.Native_SVGElementInstance_parentNode_Getter(this);
+  ElementInstance get parentNode => _blink.BlinkSVGElementInstance.$parentNode_Getter(this);
 
   @DomName('SVGElementInstance.previousSibling')
   @DocsEditable()
-  ElementInstance get previousSibling => _blink.Native_SVGElementInstance_previousSibling_Getter(this);
+  ElementInstance get previousSibling => _blink.BlinkSVGElementInstance.$previousSibling_Getter(this);
 
   /// Stream of `abort` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onabort')
@@ -1635,19 +1635,19 @@
 
   @DomName('SVGEllipseElement.cx')
   @DocsEditable()
-  AnimatedLength get cx => _blink.Native_SVGEllipseElement_cx_Getter(this);
+  AnimatedLength get cx => _blink.BlinkSVGEllipseElement.$cx_Getter(this);
 
   @DomName('SVGEllipseElement.cy')
   @DocsEditable()
-  AnimatedLength get cy => _blink.Native_SVGEllipseElement_cy_Getter(this);
+  AnimatedLength get cy => _blink.BlinkSVGEllipseElement.$cy_Getter(this);
 
   @DomName('SVGEllipseElement.rx')
   @DocsEditable()
-  AnimatedLength get rx => _blink.Native_SVGEllipseElement_rx_Getter(this);
+  AnimatedLength get rx => _blink.BlinkSVGEllipseElement.$rx_Getter(this);
 
   @DomName('SVGEllipseElement.ry')
   @DocsEditable()
-  AnimatedLength get ry => _blink.Native_SVGEllipseElement_ry_Getter(this);
+  AnimatedLength get ry => _blink.BlinkSVGEllipseElement.$ry_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1707,35 +1707,35 @@
 
   @DomName('SVGFEBlendElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEBlendElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEBlendElement.$in1_Getter(this);
 
   @DomName('SVGFEBlendElement.in2')
   @DocsEditable()
-  AnimatedString get in2 => _blink.Native_SVGFEBlendElement_in2_Getter(this);
+  AnimatedString get in2 => _blink.BlinkSVGFEBlendElement.$in2_Getter(this);
 
   @DomName('SVGFEBlendElement.mode')
   @DocsEditable()
-  AnimatedEnumeration get mode => _blink.Native_SVGFEBlendElement_mode_Getter(this);
+  AnimatedEnumeration get mode => _blink.BlinkSVGFEBlendElement.$mode_Getter(this);
 
   @DomName('SVGFEBlendElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEBlendElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEBlendElement.$height_Getter(this);
 
   @DomName('SVGFEBlendElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEBlendElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEBlendElement.$result_Getter(this);
 
   @DomName('SVGFEBlendElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEBlendElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEBlendElement.$width_Getter(this);
 
   @DomName('SVGFEBlendElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEBlendElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEBlendElement.$x_Getter(this);
 
   @DomName('SVGFEBlendElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEBlendElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEBlendElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1791,35 +1791,35 @@
 
   @DomName('SVGFEColorMatrixElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEColorMatrixElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEColorMatrixElement.$in1_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.type')
   @DocsEditable()
-  AnimatedEnumeration get type => _blink.Native_SVGFEColorMatrixElement_type_Getter(this);
+  AnimatedEnumeration get type => _blink.BlinkSVGFEColorMatrixElement.$type_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.values')
   @DocsEditable()
-  AnimatedNumberList get values => _blink.Native_SVGFEColorMatrixElement_values_Getter(this);
+  AnimatedNumberList get values => _blink.BlinkSVGFEColorMatrixElement.$values_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEColorMatrixElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEColorMatrixElement.$height_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEColorMatrixElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEColorMatrixElement.$result_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEColorMatrixElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEColorMatrixElement.$width_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEColorMatrixElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEColorMatrixElement.$x_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEColorMatrixElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEColorMatrixElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1855,27 +1855,27 @@
 
   @DomName('SVGFEComponentTransferElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEComponentTransferElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEComponentTransferElement.$in1_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEComponentTransferElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEComponentTransferElement.$height_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEComponentTransferElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEComponentTransferElement.$result_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEComponentTransferElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEComponentTransferElement.$width_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEComponentTransferElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEComponentTransferElement.$x_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEComponentTransferElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEComponentTransferElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1928,51 +1928,51 @@
 
   @DomName('SVGFECompositeElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFECompositeElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFECompositeElement.$in1_Getter(this);
 
   @DomName('SVGFECompositeElement.in2')
   @DocsEditable()
-  AnimatedString get in2 => _blink.Native_SVGFECompositeElement_in2_Getter(this);
+  AnimatedString get in2 => _blink.BlinkSVGFECompositeElement.$in2_Getter(this);
 
   @DomName('SVGFECompositeElement.k1')
   @DocsEditable()
-  AnimatedNumber get k1 => _blink.Native_SVGFECompositeElement_k1_Getter(this);
+  AnimatedNumber get k1 => _blink.BlinkSVGFECompositeElement.$k1_Getter(this);
 
   @DomName('SVGFECompositeElement.k2')
   @DocsEditable()
-  AnimatedNumber get k2 => _blink.Native_SVGFECompositeElement_k2_Getter(this);
+  AnimatedNumber get k2 => _blink.BlinkSVGFECompositeElement.$k2_Getter(this);
 
   @DomName('SVGFECompositeElement.k3')
   @DocsEditable()
-  AnimatedNumber get k3 => _blink.Native_SVGFECompositeElement_k3_Getter(this);
+  AnimatedNumber get k3 => _blink.BlinkSVGFECompositeElement.$k3_Getter(this);
 
   @DomName('SVGFECompositeElement.k4')
   @DocsEditable()
-  AnimatedNumber get k4 => _blink.Native_SVGFECompositeElement_k4_Getter(this);
+  AnimatedNumber get k4 => _blink.BlinkSVGFECompositeElement.$k4_Getter(this);
 
   @DomName('SVGFECompositeElement.operator')
   @DocsEditable()
-  AnimatedEnumeration get operator => _blink.Native_SVGFECompositeElement_operator_Getter(this);
+  AnimatedEnumeration get operator => _blink.BlinkSVGFECompositeElement.$operator_Getter(this);
 
   @DomName('SVGFECompositeElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFECompositeElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFECompositeElement.$height_Getter(this);
 
   @DomName('SVGFECompositeElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFECompositeElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFECompositeElement.$result_Getter(this);
 
   @DomName('SVGFECompositeElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFECompositeElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFECompositeElement.$width_Getter(this);
 
   @DomName('SVGFECompositeElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFECompositeElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFECompositeElement.$x_Getter(this);
 
   @DomName('SVGFECompositeElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFECompositeElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFECompositeElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2024,71 +2024,71 @@
 
   @DomName('SVGFEConvolveMatrixElement.bias')
   @DocsEditable()
-  AnimatedNumber get bias => _blink.Native_SVGFEConvolveMatrixElement_bias_Getter(this);
+  AnimatedNumber get bias => _blink.BlinkSVGFEConvolveMatrixElement.$bias_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.divisor')
   @DocsEditable()
-  AnimatedNumber get divisor => _blink.Native_SVGFEConvolveMatrixElement_divisor_Getter(this);
+  AnimatedNumber get divisor => _blink.BlinkSVGFEConvolveMatrixElement.$divisor_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.edgeMode')
   @DocsEditable()
-  AnimatedEnumeration get edgeMode => _blink.Native_SVGFEConvolveMatrixElement_edgeMode_Getter(this);
+  AnimatedEnumeration get edgeMode => _blink.BlinkSVGFEConvolveMatrixElement.$edgeMode_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEConvolveMatrixElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEConvolveMatrixElement.$in1_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.kernelMatrix')
   @DocsEditable()
-  AnimatedNumberList get kernelMatrix => _blink.Native_SVGFEConvolveMatrixElement_kernelMatrix_Getter(this);
+  AnimatedNumberList get kernelMatrix => _blink.BlinkSVGFEConvolveMatrixElement.$kernelMatrix_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthX')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthX => _blink.Native_SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter(this);
+  AnimatedNumber get kernelUnitLengthX => _blink.BlinkSVGFEConvolveMatrixElement.$kernelUnitLengthX_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthY')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthY => _blink.Native_SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter(this);
+  AnimatedNumber get kernelUnitLengthY => _blink.BlinkSVGFEConvolveMatrixElement.$kernelUnitLengthY_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.orderX')
   @DocsEditable()
-  AnimatedInteger get orderX => _blink.Native_SVGFEConvolveMatrixElement_orderX_Getter(this);
+  AnimatedInteger get orderX => _blink.BlinkSVGFEConvolveMatrixElement.$orderX_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.orderY')
   @DocsEditable()
-  AnimatedInteger get orderY => _blink.Native_SVGFEConvolveMatrixElement_orderY_Getter(this);
+  AnimatedInteger get orderY => _blink.BlinkSVGFEConvolveMatrixElement.$orderY_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.preserveAlpha')
   @DocsEditable()
-  AnimatedBoolean get preserveAlpha => _blink.Native_SVGFEConvolveMatrixElement_preserveAlpha_Getter(this);
+  AnimatedBoolean get preserveAlpha => _blink.BlinkSVGFEConvolveMatrixElement.$preserveAlpha_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.targetX')
   @DocsEditable()
-  AnimatedInteger get targetX => _blink.Native_SVGFEConvolveMatrixElement_targetX_Getter(this);
+  AnimatedInteger get targetX => _blink.BlinkSVGFEConvolveMatrixElement.$targetX_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.targetY')
   @DocsEditable()
-  AnimatedInteger get targetY => _blink.Native_SVGFEConvolveMatrixElement_targetY_Getter(this);
+  AnimatedInteger get targetY => _blink.BlinkSVGFEConvolveMatrixElement.$targetY_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEConvolveMatrixElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEConvolveMatrixElement.$height_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEConvolveMatrixElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEConvolveMatrixElement.$result_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEConvolveMatrixElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEConvolveMatrixElement.$width_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEConvolveMatrixElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEConvolveMatrixElement.$x_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEConvolveMatrixElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEConvolveMatrixElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2124,43 +2124,43 @@
 
   @DomName('SVGFEDiffuseLightingElement.diffuseConstant')
   @DocsEditable()
-  AnimatedNumber get diffuseConstant => _blink.Native_SVGFEDiffuseLightingElement_diffuseConstant_Getter(this);
+  AnimatedNumber get diffuseConstant => _blink.BlinkSVGFEDiffuseLightingElement.$diffuseConstant_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEDiffuseLightingElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEDiffuseLightingElement.$in1_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthX')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthX => _blink.Native_SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter(this);
+  AnimatedNumber get kernelUnitLengthX => _blink.BlinkSVGFEDiffuseLightingElement.$kernelUnitLengthX_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthY')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthY => _blink.Native_SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter(this);
+  AnimatedNumber get kernelUnitLengthY => _blink.BlinkSVGFEDiffuseLightingElement.$kernelUnitLengthY_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.surfaceScale')
   @DocsEditable()
-  AnimatedNumber get surfaceScale => _blink.Native_SVGFEDiffuseLightingElement_surfaceScale_Getter(this);
+  AnimatedNumber get surfaceScale => _blink.BlinkSVGFEDiffuseLightingElement.$surfaceScale_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEDiffuseLightingElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEDiffuseLightingElement.$height_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEDiffuseLightingElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEDiffuseLightingElement.$result_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEDiffuseLightingElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEDiffuseLightingElement.$width_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEDiffuseLightingElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEDiffuseLightingElement.$x_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEDiffuseLightingElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEDiffuseLightingElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2216,43 +2216,43 @@
 
   @DomName('SVGFEDisplacementMapElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEDisplacementMapElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEDisplacementMapElement.$in1_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.in2')
   @DocsEditable()
-  AnimatedString get in2 => _blink.Native_SVGFEDisplacementMapElement_in2_Getter(this);
+  AnimatedString get in2 => _blink.BlinkSVGFEDisplacementMapElement.$in2_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.scale')
   @DocsEditable()
-  AnimatedNumber get scale => _blink.Native_SVGFEDisplacementMapElement_scale_Getter(this);
+  AnimatedNumber get scale => _blink.BlinkSVGFEDisplacementMapElement.$scale_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.xChannelSelector')
   @DocsEditable()
-  AnimatedEnumeration get xChannelSelector => _blink.Native_SVGFEDisplacementMapElement_xChannelSelector_Getter(this);
+  AnimatedEnumeration get xChannelSelector => _blink.BlinkSVGFEDisplacementMapElement.$xChannelSelector_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.yChannelSelector')
   @DocsEditable()
-  AnimatedEnumeration get yChannelSelector => _blink.Native_SVGFEDisplacementMapElement_yChannelSelector_Getter(this);
+  AnimatedEnumeration get yChannelSelector => _blink.BlinkSVGFEDisplacementMapElement.$yChannelSelector_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEDisplacementMapElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEDisplacementMapElement.$height_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEDisplacementMapElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEDisplacementMapElement.$result_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEDisplacementMapElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEDisplacementMapElement.$width_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEDisplacementMapElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEDisplacementMapElement.$x_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEDisplacementMapElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEDisplacementMapElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2288,11 +2288,11 @@
 
   @DomName('SVGFEDistantLightElement.azimuth')
   @DocsEditable()
-  AnimatedNumber get azimuth => _blink.Native_SVGFEDistantLightElement_azimuth_Getter(this);
+  AnimatedNumber get azimuth => _blink.BlinkSVGFEDistantLightElement.$azimuth_Getter(this);
 
   @DomName('SVGFEDistantLightElement.elevation')
   @DocsEditable()
-  AnimatedNumber get elevation => _blink.Native_SVGFEDistantLightElement_elevation_Getter(this);
+  AnimatedNumber get elevation => _blink.BlinkSVGFEDistantLightElement.$elevation_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2328,23 +2328,23 @@
 
   @DomName('SVGFEFloodElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEFloodElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEFloodElement.$height_Getter(this);
 
   @DomName('SVGFEFloodElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEFloodElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEFloodElement.$result_Getter(this);
 
   @DomName('SVGFEFloodElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEFloodElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEFloodElement.$width_Getter(this);
 
   @DomName('SVGFEFloodElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEFloodElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEFloodElement.$x_Getter(this);
 
   @DomName('SVGFEFloodElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEFloodElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEFloodElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2508,39 +2508,39 @@
 
   @DomName('SVGFEGaussianBlurElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEGaussianBlurElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEGaussianBlurElement.$in1_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.stdDeviationX')
   @DocsEditable()
-  AnimatedNumber get stdDeviationX => _blink.Native_SVGFEGaussianBlurElement_stdDeviationX_Getter(this);
+  AnimatedNumber get stdDeviationX => _blink.BlinkSVGFEGaussianBlurElement.$stdDeviationX_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.stdDeviationY')
   @DocsEditable()
-  AnimatedNumber get stdDeviationY => _blink.Native_SVGFEGaussianBlurElement_stdDeviationY_Getter(this);
+  AnimatedNumber get stdDeviationY => _blink.BlinkSVGFEGaussianBlurElement.$stdDeviationY_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.setStdDeviation')
   @DocsEditable()
-  void setStdDeviation(num stdDeviationX, num stdDeviationY) => _blink.Native_SVGFEGaussianBlurElement_setStdDeviation_Callback(this, stdDeviationX, stdDeviationY);
+  void setStdDeviation(num stdDeviationX, num stdDeviationY) => _blink.BlinkSVGFEGaussianBlurElement.$setStdDeviation_Callback(this, stdDeviationX, stdDeviationY);
 
   @DomName('SVGFEGaussianBlurElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEGaussianBlurElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEGaussianBlurElement.$height_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEGaussianBlurElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEGaussianBlurElement.$result_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEGaussianBlurElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEGaussianBlurElement.$width_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEGaussianBlurElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEGaussianBlurElement.$x_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEGaussianBlurElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEGaussianBlurElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2576,31 +2576,31 @@
 
   @DomName('SVGFEImageElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGFEImageElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGFEImageElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGFEImageElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEImageElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEImageElement.$height_Getter(this);
 
   @DomName('SVGFEImageElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEImageElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEImageElement.$result_Getter(this);
 
   @DomName('SVGFEImageElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEImageElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEImageElement.$width_Getter(this);
 
   @DomName('SVGFEImageElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEImageElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEImageElement.$x_Getter(this);
 
   @DomName('SVGFEImageElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEImageElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEImageElement.$y_Getter(this);
 
   @DomName('SVGFEImageElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGFEImageElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGFEImageElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2636,23 +2636,23 @@
 
   @DomName('SVGFEMergeElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEMergeElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEMergeElement.$height_Getter(this);
 
   @DomName('SVGFEMergeElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEMergeElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEMergeElement.$result_Getter(this);
 
   @DomName('SVGFEMergeElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEMergeElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEMergeElement.$width_Getter(this);
 
   @DomName('SVGFEMergeElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEMergeElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEMergeElement.$x_Getter(this);
 
   @DomName('SVGFEMergeElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEMergeElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEMergeElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2688,7 +2688,7 @@
 
   @DomName('SVGFEMergeNodeElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEMergeNodeElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEMergeNodeElement.$in1_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2729,43 +2729,43 @@
 
   @DomName('SVGFEMorphologyElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEMorphologyElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEMorphologyElement.$in1_Getter(this);
 
   @DomName('SVGFEMorphologyElement.operator')
   @DocsEditable()
-  AnimatedEnumeration get operator => _blink.Native_SVGFEMorphologyElement_operator_Getter(this);
+  AnimatedEnumeration get operator => _blink.BlinkSVGFEMorphologyElement.$operator_Getter(this);
 
   @DomName('SVGFEMorphologyElement.radiusX')
   @DocsEditable()
-  AnimatedNumber get radiusX => _blink.Native_SVGFEMorphologyElement_radiusX_Getter(this);
+  AnimatedNumber get radiusX => _blink.BlinkSVGFEMorphologyElement.$radiusX_Getter(this);
 
   @DomName('SVGFEMorphologyElement.radiusY')
   @DocsEditable()
-  AnimatedNumber get radiusY => _blink.Native_SVGFEMorphologyElement_radiusY_Getter(this);
+  AnimatedNumber get radiusY => _blink.BlinkSVGFEMorphologyElement.$radiusY_Getter(this);
 
   @DomName('SVGFEMorphologyElement.setRadius')
   @DocsEditable()
-  void setRadius(num radiusX, num radiusY) => _blink.Native_SVGFEMorphologyElement_setRadius_Callback(this, radiusX, radiusY);
+  void setRadius(num radiusX, num radiusY) => _blink.BlinkSVGFEMorphologyElement.$setRadius_Callback(this, radiusX, radiusY);
 
   @DomName('SVGFEMorphologyElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEMorphologyElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEMorphologyElement.$height_Getter(this);
 
   @DomName('SVGFEMorphologyElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEMorphologyElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEMorphologyElement.$result_Getter(this);
 
   @DomName('SVGFEMorphologyElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEMorphologyElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEMorphologyElement.$width_Getter(this);
 
   @DomName('SVGFEMorphologyElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEMorphologyElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEMorphologyElement.$x_Getter(this);
 
   @DomName('SVGFEMorphologyElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEMorphologyElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEMorphologyElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2801,35 +2801,35 @@
 
   @DomName('SVGFEOffsetElement.dx')
   @DocsEditable()
-  AnimatedNumber get dx => _blink.Native_SVGFEOffsetElement_dx_Getter(this);
+  AnimatedNumber get dx => _blink.BlinkSVGFEOffsetElement.$dx_Getter(this);
 
   @DomName('SVGFEOffsetElement.dy')
   @DocsEditable()
-  AnimatedNumber get dy => _blink.Native_SVGFEOffsetElement_dy_Getter(this);
+  AnimatedNumber get dy => _blink.BlinkSVGFEOffsetElement.$dy_Getter(this);
 
   @DomName('SVGFEOffsetElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEOffsetElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEOffsetElement.$in1_Getter(this);
 
   @DomName('SVGFEOffsetElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEOffsetElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEOffsetElement.$height_Getter(this);
 
   @DomName('SVGFEOffsetElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEOffsetElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEOffsetElement.$result_Getter(this);
 
   @DomName('SVGFEOffsetElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEOffsetElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEOffsetElement.$width_Getter(this);
 
   @DomName('SVGFEOffsetElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEOffsetElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEOffsetElement.$x_Getter(this);
 
   @DomName('SVGFEOffsetElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEOffsetElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEOffsetElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2865,15 +2865,15 @@
 
   @DomName('SVGFEPointLightElement.x')
   @DocsEditable()
-  AnimatedNumber get x => _blink.Native_SVGFEPointLightElement_x_Getter(this);
+  AnimatedNumber get x => _blink.BlinkSVGFEPointLightElement.$x_Getter(this);
 
   @DomName('SVGFEPointLightElement.y')
   @DocsEditable()
-  AnimatedNumber get y => _blink.Native_SVGFEPointLightElement_y_Getter(this);
+  AnimatedNumber get y => _blink.BlinkSVGFEPointLightElement.$y_Getter(this);
 
   @DomName('SVGFEPointLightElement.z')
   @DocsEditable()
-  AnimatedNumber get z => _blink.Native_SVGFEPointLightElement_z_Getter(this);
+  AnimatedNumber get z => _blink.BlinkSVGFEPointLightElement.$z_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2909,39 +2909,39 @@
 
   @DomName('SVGFESpecularLightingElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFESpecularLightingElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFESpecularLightingElement.$in1_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.specularConstant')
   @DocsEditable()
-  AnimatedNumber get specularConstant => _blink.Native_SVGFESpecularLightingElement_specularConstant_Getter(this);
+  AnimatedNumber get specularConstant => _blink.BlinkSVGFESpecularLightingElement.$specularConstant_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.specularExponent')
   @DocsEditable()
-  AnimatedNumber get specularExponent => _blink.Native_SVGFESpecularLightingElement_specularExponent_Getter(this);
+  AnimatedNumber get specularExponent => _blink.BlinkSVGFESpecularLightingElement.$specularExponent_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.surfaceScale')
   @DocsEditable()
-  AnimatedNumber get surfaceScale => _blink.Native_SVGFESpecularLightingElement_surfaceScale_Getter(this);
+  AnimatedNumber get surfaceScale => _blink.BlinkSVGFESpecularLightingElement.$surfaceScale_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFESpecularLightingElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFESpecularLightingElement.$height_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFESpecularLightingElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFESpecularLightingElement.$result_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFESpecularLightingElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFESpecularLightingElement.$width_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFESpecularLightingElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFESpecularLightingElement.$x_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFESpecularLightingElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFESpecularLightingElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2977,35 +2977,35 @@
 
   @DomName('SVGFESpotLightElement.limitingConeAngle')
   @DocsEditable()
-  AnimatedNumber get limitingConeAngle => _blink.Native_SVGFESpotLightElement_limitingConeAngle_Getter(this);
+  AnimatedNumber get limitingConeAngle => _blink.BlinkSVGFESpotLightElement.$limitingConeAngle_Getter(this);
 
   @DomName('SVGFESpotLightElement.pointsAtX')
   @DocsEditable()
-  AnimatedNumber get pointsAtX => _blink.Native_SVGFESpotLightElement_pointsAtX_Getter(this);
+  AnimatedNumber get pointsAtX => _blink.BlinkSVGFESpotLightElement.$pointsAtX_Getter(this);
 
   @DomName('SVGFESpotLightElement.pointsAtY')
   @DocsEditable()
-  AnimatedNumber get pointsAtY => _blink.Native_SVGFESpotLightElement_pointsAtY_Getter(this);
+  AnimatedNumber get pointsAtY => _blink.BlinkSVGFESpotLightElement.$pointsAtY_Getter(this);
 
   @DomName('SVGFESpotLightElement.pointsAtZ')
   @DocsEditable()
-  AnimatedNumber get pointsAtZ => _blink.Native_SVGFESpotLightElement_pointsAtZ_Getter(this);
+  AnimatedNumber get pointsAtZ => _blink.BlinkSVGFESpotLightElement.$pointsAtZ_Getter(this);
 
   @DomName('SVGFESpotLightElement.specularExponent')
   @DocsEditable()
-  AnimatedNumber get specularExponent => _blink.Native_SVGFESpotLightElement_specularExponent_Getter(this);
+  AnimatedNumber get specularExponent => _blink.BlinkSVGFESpotLightElement.$specularExponent_Getter(this);
 
   @DomName('SVGFESpotLightElement.x')
   @DocsEditable()
-  AnimatedNumber get x => _blink.Native_SVGFESpotLightElement_x_Getter(this);
+  AnimatedNumber get x => _blink.BlinkSVGFESpotLightElement.$x_Getter(this);
 
   @DomName('SVGFESpotLightElement.y')
   @DocsEditable()
-  AnimatedNumber get y => _blink.Native_SVGFESpotLightElement_y_Getter(this);
+  AnimatedNumber get y => _blink.BlinkSVGFESpotLightElement.$y_Getter(this);
 
   @DomName('SVGFESpotLightElement.z')
   @DocsEditable()
-  AnimatedNumber get z => _blink.Native_SVGFESpotLightElement_z_Getter(this);
+  AnimatedNumber get z => _blink.BlinkSVGFESpotLightElement.$z_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3041,27 +3041,27 @@
 
   @DomName('SVGFETileElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFETileElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFETileElement.$in1_Getter(this);
 
   @DomName('SVGFETileElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFETileElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFETileElement.$height_Getter(this);
 
   @DomName('SVGFETileElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFETileElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFETileElement.$result_Getter(this);
 
   @DomName('SVGFETileElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFETileElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFETileElement.$width_Getter(this);
 
   @DomName('SVGFETileElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFETileElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFETileElement.$x_Getter(this);
 
   @DomName('SVGFETileElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFETileElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFETileElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3121,47 +3121,47 @@
 
   @DomName('SVGFETurbulenceElement.baseFrequencyX')
   @DocsEditable()
-  AnimatedNumber get baseFrequencyX => _blink.Native_SVGFETurbulenceElement_baseFrequencyX_Getter(this);
+  AnimatedNumber get baseFrequencyX => _blink.BlinkSVGFETurbulenceElement.$baseFrequencyX_Getter(this);
 
   @DomName('SVGFETurbulenceElement.baseFrequencyY')
   @DocsEditable()
-  AnimatedNumber get baseFrequencyY => _blink.Native_SVGFETurbulenceElement_baseFrequencyY_Getter(this);
+  AnimatedNumber get baseFrequencyY => _blink.BlinkSVGFETurbulenceElement.$baseFrequencyY_Getter(this);
 
   @DomName('SVGFETurbulenceElement.numOctaves')
   @DocsEditable()
-  AnimatedInteger get numOctaves => _blink.Native_SVGFETurbulenceElement_numOctaves_Getter(this);
+  AnimatedInteger get numOctaves => _blink.BlinkSVGFETurbulenceElement.$numOctaves_Getter(this);
 
   @DomName('SVGFETurbulenceElement.seed')
   @DocsEditable()
-  AnimatedNumber get seed => _blink.Native_SVGFETurbulenceElement_seed_Getter(this);
+  AnimatedNumber get seed => _blink.BlinkSVGFETurbulenceElement.$seed_Getter(this);
 
   @DomName('SVGFETurbulenceElement.stitchTiles')
   @DocsEditable()
-  AnimatedEnumeration get stitchTiles => _blink.Native_SVGFETurbulenceElement_stitchTiles_Getter(this);
+  AnimatedEnumeration get stitchTiles => _blink.BlinkSVGFETurbulenceElement.$stitchTiles_Getter(this);
 
   @DomName('SVGFETurbulenceElement.type')
   @DocsEditable()
-  AnimatedEnumeration get type => _blink.Native_SVGFETurbulenceElement_type_Getter(this);
+  AnimatedEnumeration get type => _blink.BlinkSVGFETurbulenceElement.$type_Getter(this);
 
   @DomName('SVGFETurbulenceElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFETurbulenceElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFETurbulenceElement.$height_Getter(this);
 
   @DomName('SVGFETurbulenceElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFETurbulenceElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFETurbulenceElement.$result_Getter(this);
 
   @DomName('SVGFETurbulenceElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFETurbulenceElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFETurbulenceElement.$width_Getter(this);
 
   @DomName('SVGFETurbulenceElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFETurbulenceElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFETurbulenceElement.$x_Getter(this);
 
   @DomName('SVGFETurbulenceElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFETurbulenceElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFETurbulenceElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3197,43 +3197,43 @@
 
   @DomName('SVGFilterElement.filterResX')
   @DocsEditable()
-  AnimatedInteger get filterResX => _blink.Native_SVGFilterElement_filterResX_Getter(this);
+  AnimatedInteger get filterResX => _blink.BlinkSVGFilterElement.$filterResX_Getter(this);
 
   @DomName('SVGFilterElement.filterResY')
   @DocsEditable()
-  AnimatedInteger get filterResY => _blink.Native_SVGFilterElement_filterResY_Getter(this);
+  AnimatedInteger get filterResY => _blink.BlinkSVGFilterElement.$filterResY_Getter(this);
 
   @DomName('SVGFilterElement.filterUnits')
   @DocsEditable()
-  AnimatedEnumeration get filterUnits => _blink.Native_SVGFilterElement_filterUnits_Getter(this);
+  AnimatedEnumeration get filterUnits => _blink.BlinkSVGFilterElement.$filterUnits_Getter(this);
 
   @DomName('SVGFilterElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFilterElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFilterElement.$height_Getter(this);
 
   @DomName('SVGFilterElement.primitiveUnits')
   @DocsEditable()
-  AnimatedEnumeration get primitiveUnits => _blink.Native_SVGFilterElement_primitiveUnits_Getter(this);
+  AnimatedEnumeration get primitiveUnits => _blink.BlinkSVGFilterElement.$primitiveUnits_Getter(this);
 
   @DomName('SVGFilterElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFilterElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFilterElement.$width_Getter(this);
 
   @DomName('SVGFilterElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFilterElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFilterElement.$x_Getter(this);
 
   @DomName('SVGFilterElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFilterElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFilterElement.$y_Getter(this);
 
   @DomName('SVGFilterElement.setFilterRes')
   @DocsEditable()
-  void setFilterRes(int filterResX, int filterResY) => _blink.Native_SVGFilterElement_setFilterRes_Callback(this, filterResX, filterResY);
+  void setFilterRes(int filterResX, int filterResY) => _blink.BlinkSVGFilterElement.$setFilterRes_Callback(this, filterResX, filterResY);
 
   @DomName('SVGFilterElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGFilterElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGFilterElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3252,23 +3252,23 @@
 
   @DomName('SVGFilterPrimitiveStandardAttributes.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFilterPrimitiveStandardAttributes_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFilterPrimitiveStandardAttributes.$height_Getter(this);
 
   @DomName('SVGFilterPrimitiveStandardAttributes.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFilterPrimitiveStandardAttributes_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFilterPrimitiveStandardAttributes.$result_Getter(this);
 
   @DomName('SVGFilterPrimitiveStandardAttributes.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFilterPrimitiveStandardAttributes_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFilterPrimitiveStandardAttributes.$width_Getter(this);
 
   @DomName('SVGFilterPrimitiveStandardAttributes.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFilterPrimitiveStandardAttributes_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFilterPrimitiveStandardAttributes.$x_Getter(this);
 
   @DomName('SVGFilterPrimitiveStandardAttributes.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFilterPrimitiveStandardAttributes_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFilterPrimitiveStandardAttributes.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3287,11 +3287,11 @@
 
   @DomName('SVGFitToViewBox.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGFitToViewBox_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGFitToViewBox.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGFitToViewBox.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.Native_SVGFitToViewBox_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGFitToViewBox.$viewBox_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3326,19 +3326,19 @@
 
   @DomName('SVGForeignObjectElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGForeignObjectElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGForeignObjectElement.$height_Getter(this);
 
   @DomName('SVGForeignObjectElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGForeignObjectElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGForeignObjectElement.$width_Getter(this);
 
   @DomName('SVGForeignObjectElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGForeignObjectElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGForeignObjectElement.$x_Getter(this);
 
   @DomName('SVGForeignObjectElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGForeignObjectElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGForeignObjectElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3389,12 +3389,12 @@
   @DomName('SVGGeometryElement.isPointInFill')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isPointInFill(Point point) => _blink.Native_SVGGeometryElement_isPointInFill_Callback(this, point);
+  bool isPointInFill(Point point) => _blink.BlinkSVGGeometryElement.$isPointInFill_Callback(this, point);
 
   @DomName('SVGGeometryElement.isPointInStroke')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isPointInStroke(Point point) => _blink.Native_SVGGeometryElement_isPointInStroke_Callback(this, point);
+  bool isPointInStroke(Point point) => _blink.BlinkSVGGeometryElement.$isPointInStroke_Callback(this, point);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3420,57 +3420,57 @@
   @DomName('SVGGraphicsElement.farthestViewportElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgElement get farthestViewportElement => _blink.Native_SVGGraphicsElement_farthestViewportElement_Getter(this);
+  SvgElement get farthestViewportElement => _blink.BlinkSVGGraphicsElement.$farthestViewportElement_Getter(this);
 
   @DomName('SVGGraphicsElement.nearestViewportElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgElement get nearestViewportElement => _blink.Native_SVGGraphicsElement_nearestViewportElement_Getter(this);
+  SvgElement get nearestViewportElement => _blink.BlinkSVGGraphicsElement.$nearestViewportElement_Getter(this);
 
   @DomName('SVGGraphicsElement.transform')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimatedTransformList get transform => _blink.Native_SVGGraphicsElement_transform_Getter(this);
+  AnimatedTransformList get transform => _blink.BlinkSVGGraphicsElement.$transform_Getter(this);
 
   @DomName('SVGGraphicsElement.getBBox')
   @DocsEditable()
   @Experimental() // untriaged
-  Rect getBBox() => _blink.Native_SVGGraphicsElement_getBBox_Callback(this);
+  Rect getBBox() => _blink.BlinkSVGGraphicsElement.$getBBox_Callback(this);
 
   @DomName('SVGGraphicsElement.getCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getCtm() => _blink.Native_SVGGraphicsElement_getCTM_Callback(this);
+  Matrix getCtm() => _blink.BlinkSVGGraphicsElement.$getCTM_Callback(this);
 
   @DomName('SVGGraphicsElement.getScreenCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getScreenCtm() => _blink.Native_SVGGraphicsElement_getScreenCTM_Callback(this);
+  Matrix getScreenCtm() => _blink.BlinkSVGGraphicsElement.$getScreenCTM_Callback(this);
 
   @DomName('SVGGraphicsElement.getTransformToElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getTransformToElement(SvgElement element) => _blink.Native_SVGGraphicsElement_getTransformToElement_Callback(this, element);
+  Matrix getTransformToElement(SvgElement element) => _blink.BlinkSVGGraphicsElement.$getTransformToElement_Callback(this, element);
 
   @DomName('SVGGraphicsElement.requiredExtensions')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get requiredExtensions => _blink.Native_SVGGraphicsElement_requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGGraphicsElement.$requiredExtensions_Getter(this);
 
   @DomName('SVGGraphicsElement.requiredFeatures')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get requiredFeatures => _blink.Native_SVGGraphicsElement_requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGGraphicsElement.$requiredFeatures_Getter(this);
 
   @DomName('SVGGraphicsElement.systemLanguage')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get systemLanguage => _blink.Native_SVGGraphicsElement_systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGGraphicsElement.$systemLanguage_Getter(this);
 
   @DomName('SVGGraphicsElement.hasExtension')
   @DocsEditable()
   @Experimental() // untriaged
-  bool hasExtension(String extension) => _blink.Native_SVGGraphicsElement_hasExtension_Callback(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGGraphicsElement.$hasExtension_Callback(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3499,27 +3499,27 @@
 
   @DomName('SVGImageElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGImageElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGImageElement.$height_Getter(this);
 
   @DomName('SVGImageElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGImageElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGImageElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGImageElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGImageElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGImageElement.$width_Getter(this);
 
   @DomName('SVGImageElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGImageElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGImageElement.$x_Getter(this);
 
   @DomName('SVGImageElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGImageElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGImageElement.$y_Getter(this);
 
   @DomName('SVGImageElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGImageElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGImageElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3582,39 +3582,39 @@
 
   @DomName('SVGLength.unitType')
   @DocsEditable()
-  int get unitType => _blink.Native_SVGLength_unitType_Getter(this);
+  int get unitType => _blink.BlinkSVGLength.$unitType_Getter(this);
 
   @DomName('SVGLength.value')
   @DocsEditable()
-  num get value => _blink.Native_SVGLength_value_Getter(this);
+  num get value => _blink.BlinkSVGLength.$value_Getter(this);
 
   @DomName('SVGLength.value')
   @DocsEditable()
-  void set value(num value) => _blink.Native_SVGLength_value_Setter(this, value);
+  void set value(num value) => _blink.BlinkSVGLength.$value_Setter(this, value);
 
   @DomName('SVGLength.valueAsString')
   @DocsEditable()
-  String get valueAsString => _blink.Native_SVGLength_valueAsString_Getter(this);
+  String get valueAsString => _blink.BlinkSVGLength.$valueAsString_Getter(this);
 
   @DomName('SVGLength.valueAsString')
   @DocsEditable()
-  void set valueAsString(String value) => _blink.Native_SVGLength_valueAsString_Setter(this, value);
+  void set valueAsString(String value) => _blink.BlinkSVGLength.$valueAsString_Setter(this, value);
 
   @DomName('SVGLength.valueInSpecifiedUnits')
   @DocsEditable()
-  num get valueInSpecifiedUnits => _blink.Native_SVGLength_valueInSpecifiedUnits_Getter(this);
+  num get valueInSpecifiedUnits => _blink.BlinkSVGLength.$valueInSpecifiedUnits_Getter(this);
 
   @DomName('SVGLength.valueInSpecifiedUnits')
   @DocsEditable()
-  void set valueInSpecifiedUnits(num value) => _blink.Native_SVGLength_valueInSpecifiedUnits_Setter(this, value);
+  void set valueInSpecifiedUnits(num value) => _blink.BlinkSVGLength.$valueInSpecifiedUnits_Setter(this, value);
 
   @DomName('SVGLength.convertToSpecifiedUnits')
   @DocsEditable()
-  void convertToSpecifiedUnits(int unitType) => _blink.Native_SVGLength_convertToSpecifiedUnits_Callback(this, unitType);
+  void convertToSpecifiedUnits(int unitType) => _blink.BlinkSVGLength.$convertToSpecifiedUnits_Callback(this, unitType);
 
   @DomName('SVGLength.newValueSpecifiedUnits')
   @DocsEditable()
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.Native_SVGLength_newValueSpecifiedUnits_Callback(this, unitType, valueInSpecifiedUnits);
+  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.BlinkSVGLength.$newValueSpecifiedUnits_Callback(this, unitType, valueInSpecifiedUnits);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3633,7 +3633,7 @@
 
   @DomName('SVGLengthList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.Native_SVGLengthList_numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGLengthList.$numberOfItems_Getter(this);
 
   Length operator[](int index) {
     if (index < 0 || index >= length)
@@ -3683,31 +3683,31 @@
 
   @DomName('SVGLengthList.appendItem')
   @DocsEditable()
-  Length appendItem(Length item) => _blink.Native_SVGLengthList_appendItem_Callback(this, item);
+  Length appendItem(Length item) => _blink.BlinkSVGLengthList.$appendItem_Callback(this, item);
 
   @DomName('SVGLengthList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_SVGLengthList_clear_Callback(this);
+  void clear() => _blink.BlinkSVGLengthList.$clear_Callback(this);
 
   @DomName('SVGLengthList.getItem')
   @DocsEditable()
-  Length getItem(int index) => _blink.Native_SVGLengthList_getItem_Callback(this, index);
+  Length getItem(int index) => _blink.BlinkSVGLengthList.$getItem_Callback(this, index);
 
   @DomName('SVGLengthList.initialize')
   @DocsEditable()
-  Length initialize(Length item) => _blink.Native_SVGLengthList_initialize_Callback(this, item);
+  Length initialize(Length item) => _blink.BlinkSVGLengthList.$initialize_Callback(this, item);
 
   @DomName('SVGLengthList.insertItemBefore')
   @DocsEditable()
-  Length insertItemBefore(Length item, int index) => _blink.Native_SVGLengthList_insertItemBefore_Callback(this, item, index);
+  Length insertItemBefore(Length item, int index) => _blink.BlinkSVGLengthList.$insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGLengthList.removeItem')
   @DocsEditable()
-  Length removeItem(int index) => _blink.Native_SVGLengthList_removeItem_Callback(this, index);
+  Length removeItem(int index) => _blink.BlinkSVGLengthList.$removeItem_Callback(this, index);
 
   @DomName('SVGLengthList.replaceItem')
   @DocsEditable()
-  Length replaceItem(Length item, int index) => _blink.Native_SVGLengthList_replaceItem_Callback(this, item, index);
+  Length replaceItem(Length item, int index) => _blink.BlinkSVGLengthList.$replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3736,19 +3736,19 @@
 
   @DomName('SVGLineElement.x1')
   @DocsEditable()
-  AnimatedLength get x1 => _blink.Native_SVGLineElement_x1_Getter(this);
+  AnimatedLength get x1 => _blink.BlinkSVGLineElement.$x1_Getter(this);
 
   @DomName('SVGLineElement.x2')
   @DocsEditable()
-  AnimatedLength get x2 => _blink.Native_SVGLineElement_x2_Getter(this);
+  AnimatedLength get x2 => _blink.BlinkSVGLineElement.$x2_Getter(this);
 
   @DomName('SVGLineElement.y1')
   @DocsEditable()
-  AnimatedLength get y1 => _blink.Native_SVGLineElement_y1_Getter(this);
+  AnimatedLength get y1 => _blink.BlinkSVGLineElement.$y1_Getter(this);
 
   @DomName('SVGLineElement.y2')
   @DocsEditable()
-  AnimatedLength get y2 => _blink.Native_SVGLineElement_y2_Getter(this);
+  AnimatedLength get y2 => _blink.BlinkSVGLineElement.$y2_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3777,19 +3777,19 @@
 
   @DomName('SVGLinearGradientElement.x1')
   @DocsEditable()
-  AnimatedLength get x1 => _blink.Native_SVGLinearGradientElement_x1_Getter(this);
+  AnimatedLength get x1 => _blink.BlinkSVGLinearGradientElement.$x1_Getter(this);
 
   @DomName('SVGLinearGradientElement.x2')
   @DocsEditable()
-  AnimatedLength get x2 => _blink.Native_SVGLinearGradientElement_x2_Getter(this);
+  AnimatedLength get x2 => _blink.BlinkSVGLinearGradientElement.$x2_Getter(this);
 
   @DomName('SVGLinearGradientElement.y1')
   @DocsEditable()
-  AnimatedLength get y1 => _blink.Native_SVGLinearGradientElement_y1_Getter(this);
+  AnimatedLength get y1 => _blink.BlinkSVGLinearGradientElement.$y1_Getter(this);
 
   @DomName('SVGLinearGradientElement.y2')
   @DocsEditable()
-  AnimatedLength get y2 => _blink.Native_SVGLinearGradientElement_y2_Getter(this);
+  AnimatedLength get y2 => _blink.BlinkSVGLinearGradientElement.$y2_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3842,47 +3842,47 @@
 
   @DomName('SVGMarkerElement.markerHeight')
   @DocsEditable()
-  AnimatedLength get markerHeight => _blink.Native_SVGMarkerElement_markerHeight_Getter(this);
+  AnimatedLength get markerHeight => _blink.BlinkSVGMarkerElement.$markerHeight_Getter(this);
 
   @DomName('SVGMarkerElement.markerUnits')
   @DocsEditable()
-  AnimatedEnumeration get markerUnits => _blink.Native_SVGMarkerElement_markerUnits_Getter(this);
+  AnimatedEnumeration get markerUnits => _blink.BlinkSVGMarkerElement.$markerUnits_Getter(this);
 
   @DomName('SVGMarkerElement.markerWidth')
   @DocsEditable()
-  AnimatedLength get markerWidth => _blink.Native_SVGMarkerElement_markerWidth_Getter(this);
+  AnimatedLength get markerWidth => _blink.BlinkSVGMarkerElement.$markerWidth_Getter(this);
 
   @DomName('SVGMarkerElement.orientAngle')
   @DocsEditable()
-  AnimatedAngle get orientAngle => _blink.Native_SVGMarkerElement_orientAngle_Getter(this);
+  AnimatedAngle get orientAngle => _blink.BlinkSVGMarkerElement.$orientAngle_Getter(this);
 
   @DomName('SVGMarkerElement.orientType')
   @DocsEditable()
-  AnimatedEnumeration get orientType => _blink.Native_SVGMarkerElement_orientType_Getter(this);
+  AnimatedEnumeration get orientType => _blink.BlinkSVGMarkerElement.$orientType_Getter(this);
 
   @DomName('SVGMarkerElement.refX')
   @DocsEditable()
-  AnimatedLength get refX => _blink.Native_SVGMarkerElement_refX_Getter(this);
+  AnimatedLength get refX => _blink.BlinkSVGMarkerElement.$refX_Getter(this);
 
   @DomName('SVGMarkerElement.refY')
   @DocsEditable()
-  AnimatedLength get refY => _blink.Native_SVGMarkerElement_refY_Getter(this);
+  AnimatedLength get refY => _blink.BlinkSVGMarkerElement.$refY_Getter(this);
 
   @DomName('SVGMarkerElement.setOrientToAngle')
   @DocsEditable()
-  void setOrientToAngle(Angle angle) => _blink.Native_SVGMarkerElement_setOrientToAngle_Callback(this, angle);
+  void setOrientToAngle(Angle angle) => _blink.BlinkSVGMarkerElement.$setOrientToAngle_Callback(this, angle);
 
   @DomName('SVGMarkerElement.setOrientToAuto')
   @DocsEditable()
-  void setOrientToAuto() => _blink.Native_SVGMarkerElement_setOrientToAuto_Callback(this);
+  void setOrientToAuto() => _blink.BlinkSVGMarkerElement.$setOrientToAuto_Callback(this);
 
   @DomName('SVGMarkerElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGMarkerElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGMarkerElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGMarkerElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.Native_SVGMarkerElement_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGMarkerElement.$viewBox_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3911,43 +3911,43 @@
 
   @DomName('SVGMaskElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGMaskElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGMaskElement.$height_Getter(this);
 
   @DomName('SVGMaskElement.maskContentUnits')
   @DocsEditable()
-  AnimatedEnumeration get maskContentUnits => _blink.Native_SVGMaskElement_maskContentUnits_Getter(this);
+  AnimatedEnumeration get maskContentUnits => _blink.BlinkSVGMaskElement.$maskContentUnits_Getter(this);
 
   @DomName('SVGMaskElement.maskUnits')
   @DocsEditable()
-  AnimatedEnumeration get maskUnits => _blink.Native_SVGMaskElement_maskUnits_Getter(this);
+  AnimatedEnumeration get maskUnits => _blink.BlinkSVGMaskElement.$maskUnits_Getter(this);
 
   @DomName('SVGMaskElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGMaskElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGMaskElement.$width_Getter(this);
 
   @DomName('SVGMaskElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGMaskElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGMaskElement.$x_Getter(this);
 
   @DomName('SVGMaskElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGMaskElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGMaskElement.$y_Getter(this);
 
   @DomName('SVGMaskElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.Native_SVGMaskElement_requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGMaskElement.$requiredExtensions_Getter(this);
 
   @DomName('SVGMaskElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.Native_SVGMaskElement_requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGMaskElement.$requiredFeatures_Getter(this);
 
   @DomName('SVGMaskElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.Native_SVGMaskElement_systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGMaskElement.$systemLanguage_Getter(this);
 
   @DomName('SVGMaskElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.Native_SVGMaskElement_hasExtension_Callback(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGMaskElement.$hasExtension_Callback(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3966,95 +3966,95 @@
 
   @DomName('SVGMatrix.a')
   @DocsEditable()
-  num get a => _blink.Native_SVGMatrix_a_Getter(this);
+  num get a => _blink.BlinkSVGMatrix.$a_Getter(this);
 
   @DomName('SVGMatrix.a')
   @DocsEditable()
-  void set a(num value) => _blink.Native_SVGMatrix_a_Setter(this, value);
+  void set a(num value) => _blink.BlinkSVGMatrix.$a_Setter(this, value);
 
   @DomName('SVGMatrix.b')
   @DocsEditable()
-  num get b => _blink.Native_SVGMatrix_b_Getter(this);
+  num get b => _blink.BlinkSVGMatrix.$b_Getter(this);
 
   @DomName('SVGMatrix.b')
   @DocsEditable()
-  void set b(num value) => _blink.Native_SVGMatrix_b_Setter(this, value);
+  void set b(num value) => _blink.BlinkSVGMatrix.$b_Setter(this, value);
 
   @DomName('SVGMatrix.c')
   @DocsEditable()
-  num get c => _blink.Native_SVGMatrix_c_Getter(this);
+  num get c => _blink.BlinkSVGMatrix.$c_Getter(this);
 
   @DomName('SVGMatrix.c')
   @DocsEditable()
-  void set c(num value) => _blink.Native_SVGMatrix_c_Setter(this, value);
+  void set c(num value) => _blink.BlinkSVGMatrix.$c_Setter(this, value);
 
   @DomName('SVGMatrix.d')
   @DocsEditable()
-  num get d => _blink.Native_SVGMatrix_d_Getter(this);
+  num get d => _blink.BlinkSVGMatrix.$d_Getter(this);
 
   @DomName('SVGMatrix.d')
   @DocsEditable()
-  void set d(num value) => _blink.Native_SVGMatrix_d_Setter(this, value);
+  void set d(num value) => _blink.BlinkSVGMatrix.$d_Setter(this, value);
 
   @DomName('SVGMatrix.e')
   @DocsEditable()
-  num get e => _blink.Native_SVGMatrix_e_Getter(this);
+  num get e => _blink.BlinkSVGMatrix.$e_Getter(this);
 
   @DomName('SVGMatrix.e')
   @DocsEditable()
-  void set e(num value) => _blink.Native_SVGMatrix_e_Setter(this, value);
+  void set e(num value) => _blink.BlinkSVGMatrix.$e_Setter(this, value);
 
   @DomName('SVGMatrix.f')
   @DocsEditable()
-  num get f => _blink.Native_SVGMatrix_f_Getter(this);
+  num get f => _blink.BlinkSVGMatrix.$f_Getter(this);
 
   @DomName('SVGMatrix.f')
   @DocsEditable()
-  void set f(num value) => _blink.Native_SVGMatrix_f_Setter(this, value);
+  void set f(num value) => _blink.BlinkSVGMatrix.$f_Setter(this, value);
 
   @DomName('SVGMatrix.flipX')
   @DocsEditable()
-  Matrix flipX() => _blink.Native_SVGMatrix_flipX_Callback(this);
+  Matrix flipX() => _blink.BlinkSVGMatrix.$flipX_Callback(this);
 
   @DomName('SVGMatrix.flipY')
   @DocsEditable()
-  Matrix flipY() => _blink.Native_SVGMatrix_flipY_Callback(this);
+  Matrix flipY() => _blink.BlinkSVGMatrix.$flipY_Callback(this);
 
   @DomName('SVGMatrix.inverse')
   @DocsEditable()
-  Matrix inverse() => _blink.Native_SVGMatrix_inverse_Callback(this);
+  Matrix inverse() => _blink.BlinkSVGMatrix.$inverse_Callback(this);
 
   @DomName('SVGMatrix.multiply')
   @DocsEditable()
-  Matrix multiply(Matrix secondMatrix) => _blink.Native_SVGMatrix_multiply_Callback(this, secondMatrix);
+  Matrix multiply(Matrix secondMatrix) => _blink.BlinkSVGMatrix.$multiply_Callback(this, secondMatrix);
 
   @DomName('SVGMatrix.rotate')
   @DocsEditable()
-  Matrix rotate(num angle) => _blink.Native_SVGMatrix_rotate_Callback(this, angle);
+  Matrix rotate(num angle) => _blink.BlinkSVGMatrix.$rotate_Callback(this, angle);
 
   @DomName('SVGMatrix.rotateFromVector')
   @DocsEditable()
-  Matrix rotateFromVector(num x, num y) => _blink.Native_SVGMatrix_rotateFromVector_Callback(this, x, y);
+  Matrix rotateFromVector(num x, num y) => _blink.BlinkSVGMatrix.$rotateFromVector_Callback(this, x, y);
 
   @DomName('SVGMatrix.scale')
   @DocsEditable()
-  Matrix scale(num scaleFactor) => _blink.Native_SVGMatrix_scale_Callback(this, scaleFactor);
+  Matrix scale(num scaleFactor) => _blink.BlinkSVGMatrix.$scale_Callback(this, scaleFactor);
 
   @DomName('SVGMatrix.scaleNonUniform')
   @DocsEditable()
-  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) => _blink.Native_SVGMatrix_scaleNonUniform_Callback(this, scaleFactorX, scaleFactorY);
+  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) => _blink.BlinkSVGMatrix.$scaleNonUniform_Callback(this, scaleFactorX, scaleFactorY);
 
   @DomName('SVGMatrix.skewX')
   @DocsEditable()
-  Matrix skewX(num angle) => _blink.Native_SVGMatrix_skewX_Callback(this, angle);
+  Matrix skewX(num angle) => _blink.BlinkSVGMatrix.$skewX_Callback(this, angle);
 
   @DomName('SVGMatrix.skewY')
   @DocsEditable()
-  Matrix skewY(num angle) => _blink.Native_SVGMatrix_skewY_Callback(this, angle);
+  Matrix skewY(num angle) => _blink.BlinkSVGMatrix.$skewY_Callback(this, angle);
 
   @DomName('SVGMatrix.translate')
   @DocsEditable()
-  Matrix translate(num x, num y) => _blink.Native_SVGMatrix_translate_Callback(this, x, y);
+  Matrix translate(num x, num y) => _blink.BlinkSVGMatrix.$translate_Callback(this, x, y);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4094,11 +4094,11 @@
 
   @DomName('SVGNumber.value')
   @DocsEditable()
-  num get value => _blink.Native_SVGNumber_value_Getter(this);
+  num get value => _blink.BlinkSVGNumber.$value_Getter(this);
 
   @DomName('SVGNumber.value')
   @DocsEditable()
-  void set value(num value) => _blink.Native_SVGNumber_value_Setter(this, value);
+  void set value(num value) => _blink.BlinkSVGNumber.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4117,7 +4117,7 @@
 
   @DomName('SVGNumberList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.Native_SVGNumberList_numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGNumberList.$numberOfItems_Getter(this);
 
   Number operator[](int index) {
     if (index < 0 || index >= length)
@@ -4167,31 +4167,31 @@
 
   @DomName('SVGNumberList.appendItem')
   @DocsEditable()
-  Number appendItem(Number item) => _blink.Native_SVGNumberList_appendItem_Callback(this, item);
+  Number appendItem(Number item) => _blink.BlinkSVGNumberList.$appendItem_Callback(this, item);
 
   @DomName('SVGNumberList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_SVGNumberList_clear_Callback(this);
+  void clear() => _blink.BlinkSVGNumberList.$clear_Callback(this);
 
   @DomName('SVGNumberList.getItem')
   @DocsEditable()
-  Number getItem(int index) => _blink.Native_SVGNumberList_getItem_Callback(this, index);
+  Number getItem(int index) => _blink.BlinkSVGNumberList.$getItem_Callback(this, index);
 
   @DomName('SVGNumberList.initialize')
   @DocsEditable()
-  Number initialize(Number item) => _blink.Native_SVGNumberList_initialize_Callback(this, item);
+  Number initialize(Number item) => _blink.BlinkSVGNumberList.$initialize_Callback(this, item);
 
   @DomName('SVGNumberList.insertItemBefore')
   @DocsEditable()
-  Number insertItemBefore(Number item, int index) => _blink.Native_SVGNumberList_insertItemBefore_Callback(this, item, index);
+  Number insertItemBefore(Number item, int index) => _blink.BlinkSVGNumberList.$insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGNumberList.removeItem')
   @DocsEditable()
-  Number removeItem(int index) => _blink.Native_SVGNumberList_removeItem_Callback(this, index);
+  Number removeItem(int index) => _blink.BlinkSVGNumberList.$removeItem_Callback(this, index);
 
   @DomName('SVGNumberList.replaceItem')
   @DocsEditable()
-  Number replaceItem(Number item, int index) => _blink.Native_SVGNumberList_replaceItem_Callback(this, item, index);
+  Number replaceItem(Number item, int index) => _blink.BlinkSVGNumberList.$replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4220,111 +4220,111 @@
 
   @DomName('SVGPathElement.animatedNormalizedPathSegList')
   @DocsEditable()
-  PathSegList get animatedNormalizedPathSegList => _blink.Native_SVGPathElement_animatedNormalizedPathSegList_Getter(this);
+  PathSegList get animatedNormalizedPathSegList => _blink.BlinkSVGPathElement.$animatedNormalizedPathSegList_Getter(this);
 
   @DomName('SVGPathElement.animatedPathSegList')
   @DocsEditable()
-  PathSegList get animatedPathSegList => _blink.Native_SVGPathElement_animatedPathSegList_Getter(this);
+  PathSegList get animatedPathSegList => _blink.BlinkSVGPathElement.$animatedPathSegList_Getter(this);
 
   @DomName('SVGPathElement.normalizedPathSegList')
   @DocsEditable()
-  PathSegList get normalizedPathSegList => _blink.Native_SVGPathElement_normalizedPathSegList_Getter(this);
+  PathSegList get normalizedPathSegList => _blink.BlinkSVGPathElement.$normalizedPathSegList_Getter(this);
 
   @DomName('SVGPathElement.pathLength')
   @DocsEditable()
-  AnimatedNumber get pathLength => _blink.Native_SVGPathElement_pathLength_Getter(this);
+  AnimatedNumber get pathLength => _blink.BlinkSVGPathElement.$pathLength_Getter(this);
 
   @DomName('SVGPathElement.pathSegList')
   @DocsEditable()
-  PathSegList get pathSegList => _blink.Native_SVGPathElement_pathSegList_Getter(this);
+  PathSegList get pathSegList => _blink.BlinkSVGPathElement.$pathSegList_Getter(this);
 
   @DomName('SVGPathElement.createSVGPathSegArcAbs')
   @DocsEditable()
-  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.Native_SVGPathElement_createSVGPathSegArcAbs_Callback(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.BlinkSVGPathElement.$createSVGPathSegArcAbs_Callback(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
 
   @DomName('SVGPathElement.createSVGPathSegArcRel')
   @DocsEditable()
-  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.Native_SVGPathElement_createSVGPathSegArcRel_Callback(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.BlinkSVGPathElement.$createSVGPathSegArcRel_Callback(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
 
   @DomName('SVGPathElement.createSVGPathSegClosePath')
   @DocsEditable()
-  PathSegClosePath createSvgPathSegClosePath() => _blink.Native_SVGPathElement_createSVGPathSegClosePath_Callback(this);
+  PathSegClosePath createSvgPathSegClosePath() => _blink.BlinkSVGPathElement.$createSVGPathSegClosePath_Callback(this);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicAbs')
   @DocsEditable()
-  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback(this, x, y, x1, y1, x2, y2);
+  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoCubicAbs_Callback(this, x, y, x1, y1, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicRel')
   @DocsEditable()
-  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback(this, x, y, x1, y1, x2, y2);
+  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoCubicRel_Callback(this, x, y, x1, y1, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback(this, x, y, x2, y2);
+  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoCubicSmoothAbs_Callback(this, x, y, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback(this, x, y, x2, y2);
+  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoCubicSmoothRel_Callback(this, x, y, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback(this, x, y, x1, y1);
+  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoQuadraticAbs_Callback(this, x, y, x1, y1);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback(this, x, y, x1, y1);
+  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoQuadraticRel_Callback(this, x, y, x1, y1);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback(this, x, y);
+  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoQuadraticSmoothAbs_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback(this, x, y);
+  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoQuadraticSmoothRel_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoAbs')
   @DocsEditable()
-  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegLinetoAbs_Callback(this, x, y);
+  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) => _blink.BlinkSVGPathElement.$createSVGPathSegLinetoAbs_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalAbs')
   @DocsEditable()
-  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) => _blink.Native_SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback(this, x);
+  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) => _blink.BlinkSVGPathElement.$createSVGPathSegLinetoHorizontalAbs_Callback(this, x);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalRel')
   @DocsEditable()
-  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) => _blink.Native_SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback(this, x);
+  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) => _blink.BlinkSVGPathElement.$createSVGPathSegLinetoHorizontalRel_Callback(this, x);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoRel')
   @DocsEditable()
-  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegLinetoRel_Callback(this, x, y);
+  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) => _blink.BlinkSVGPathElement.$createSVGPathSegLinetoRel_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalAbs')
   @DocsEditable()
-  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) => _blink.Native_SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback(this, y);
+  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) => _blink.BlinkSVGPathElement.$createSVGPathSegLinetoVerticalAbs_Callback(this, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalRel')
   @DocsEditable()
-  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) => _blink.Native_SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback(this, y);
+  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) => _blink.BlinkSVGPathElement.$createSVGPathSegLinetoVerticalRel_Callback(this, y);
 
   @DomName('SVGPathElement.createSVGPathSegMovetoAbs')
   @DocsEditable()
-  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegMovetoAbs_Callback(this, x, y);
+  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) => _blink.BlinkSVGPathElement.$createSVGPathSegMovetoAbs_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegMovetoRel')
   @DocsEditable()
-  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegMovetoRel_Callback(this, x, y);
+  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) => _blink.BlinkSVGPathElement.$createSVGPathSegMovetoRel_Callback(this, x, y);
 
   @DomName('SVGPathElement.getPathSegAtLength')
   @DocsEditable()
-  int getPathSegAtLength(num distance) => _blink.Native_SVGPathElement_getPathSegAtLength_Callback(this, distance);
+  int getPathSegAtLength(num distance) => _blink.BlinkSVGPathElement.$getPathSegAtLength_Callback(this, distance);
 
   @DomName('SVGPathElement.getPointAtLength')
   @DocsEditable()
-  Point getPointAtLength(num distance) => _blink.Native_SVGPathElement_getPointAtLength_Callback(this, distance);
+  Point getPointAtLength(num distance) => _blink.BlinkSVGPathElement.$getPointAtLength_Callback(this, distance);
 
   @DomName('SVGPathElement.getTotalLength')
   @DocsEditable()
-  double getTotalLength() => _blink.Native_SVGPathElement_getTotalLength_Callback(this);
+  double getTotalLength() => _blink.BlinkSVGPathElement.$getTotalLength_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4423,11 +4423,11 @@
 
   @DomName('SVGPathSeg.pathSegType')
   @DocsEditable()
-  int get pathSegType => _blink.Native_SVGPathSeg_pathSegType_Getter(this);
+  int get pathSegType => _blink.BlinkSVGPathSeg.$pathSegType_Getter(this);
 
   @DomName('SVGPathSeg.pathSegTypeAsLetter')
   @DocsEditable()
-  String get pathSegTypeAsLetter => _blink.Native_SVGPathSeg_pathSegTypeAsLetter_Getter(this);
+  String get pathSegTypeAsLetter => _blink.BlinkSVGPathSeg.$pathSegTypeAsLetter_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4446,59 +4446,59 @@
 
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
-  num get angle => _blink.Native_SVGPathSegArcAbs_angle_Getter(this);
+  num get angle => _blink.BlinkSVGPathSegArcAbs.$angle_Getter(this);
 
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
-  void set angle(num value) => _blink.Native_SVGPathSegArcAbs_angle_Setter(this, value);
+  void set angle(num value) => _blink.BlinkSVGPathSegArcAbs.$angle_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.largeArcFlag')
   @DocsEditable()
-  bool get largeArcFlag => _blink.Native_SVGPathSegArcAbs_largeArcFlag_Getter(this);
+  bool get largeArcFlag => _blink.BlinkSVGPathSegArcAbs.$largeArcFlag_Getter(this);
 
   @DomName('SVGPathSegArcAbs.largeArcFlag')
   @DocsEditable()
-  void set largeArcFlag(bool value) => _blink.Native_SVGPathSegArcAbs_largeArcFlag_Setter(this, value);
+  void set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.$largeArcFlag_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.r1')
   @DocsEditable()
-  num get r1 => _blink.Native_SVGPathSegArcAbs_r1_Getter(this);
+  num get r1 => _blink.BlinkSVGPathSegArcAbs.$r1_Getter(this);
 
   @DomName('SVGPathSegArcAbs.r1')
   @DocsEditable()
-  void set r1(num value) => _blink.Native_SVGPathSegArcAbs_r1_Setter(this, value);
+  void set r1(num value) => _blink.BlinkSVGPathSegArcAbs.$r1_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.r2')
   @DocsEditable()
-  num get r2 => _blink.Native_SVGPathSegArcAbs_r2_Getter(this);
+  num get r2 => _blink.BlinkSVGPathSegArcAbs.$r2_Getter(this);
 
   @DomName('SVGPathSegArcAbs.r2')
   @DocsEditable()
-  void set r2(num value) => _blink.Native_SVGPathSegArcAbs_r2_Setter(this, value);
+  void set r2(num value) => _blink.BlinkSVGPathSegArcAbs.$r2_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.sweepFlag')
   @DocsEditable()
-  bool get sweepFlag => _blink.Native_SVGPathSegArcAbs_sweepFlag_Getter(this);
+  bool get sweepFlag => _blink.BlinkSVGPathSegArcAbs.$sweepFlag_Getter(this);
 
   @DomName('SVGPathSegArcAbs.sweepFlag')
   @DocsEditable()
-  void set sweepFlag(bool value) => _blink.Native_SVGPathSegArcAbs_sweepFlag_Setter(this, value);
+  void set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.$sweepFlag_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegArcAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegArcAbs.$x_Getter(this);
 
   @DomName('SVGPathSegArcAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegArcAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegArcAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegArcAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegArcAbs.$y_Getter(this);
 
   @DomName('SVGPathSegArcAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegArcAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegArcAbs.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4517,59 +4517,59 @@
 
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
-  num get angle => _blink.Native_SVGPathSegArcRel_angle_Getter(this);
+  num get angle => _blink.BlinkSVGPathSegArcRel.$angle_Getter(this);
 
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
-  void set angle(num value) => _blink.Native_SVGPathSegArcRel_angle_Setter(this, value);
+  void set angle(num value) => _blink.BlinkSVGPathSegArcRel.$angle_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.largeArcFlag')
   @DocsEditable()
-  bool get largeArcFlag => _blink.Native_SVGPathSegArcRel_largeArcFlag_Getter(this);
+  bool get largeArcFlag => _blink.BlinkSVGPathSegArcRel.$largeArcFlag_Getter(this);
 
   @DomName('SVGPathSegArcRel.largeArcFlag')
   @DocsEditable()
-  void set largeArcFlag(bool value) => _blink.Native_SVGPathSegArcRel_largeArcFlag_Setter(this, value);
+  void set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcRel.$largeArcFlag_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.r1')
   @DocsEditable()
-  num get r1 => _blink.Native_SVGPathSegArcRel_r1_Getter(this);
+  num get r1 => _blink.BlinkSVGPathSegArcRel.$r1_Getter(this);
 
   @DomName('SVGPathSegArcRel.r1')
   @DocsEditable()
-  void set r1(num value) => _blink.Native_SVGPathSegArcRel_r1_Setter(this, value);
+  void set r1(num value) => _blink.BlinkSVGPathSegArcRel.$r1_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.r2')
   @DocsEditable()
-  num get r2 => _blink.Native_SVGPathSegArcRel_r2_Getter(this);
+  num get r2 => _blink.BlinkSVGPathSegArcRel.$r2_Getter(this);
 
   @DomName('SVGPathSegArcRel.r2')
   @DocsEditable()
-  void set r2(num value) => _blink.Native_SVGPathSegArcRel_r2_Setter(this, value);
+  void set r2(num value) => _blink.BlinkSVGPathSegArcRel.$r2_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.sweepFlag')
   @DocsEditable()
-  bool get sweepFlag => _blink.Native_SVGPathSegArcRel_sweepFlag_Getter(this);
+  bool get sweepFlag => _blink.BlinkSVGPathSegArcRel.$sweepFlag_Getter(this);
 
   @DomName('SVGPathSegArcRel.sweepFlag')
   @DocsEditable()
-  void set sweepFlag(bool value) => _blink.Native_SVGPathSegArcRel_sweepFlag_Setter(this, value);
+  void set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcRel.$sweepFlag_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegArcRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegArcRel.$x_Getter(this);
 
   @DomName('SVGPathSegArcRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegArcRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegArcRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegArcRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegArcRel.$y_Getter(this);
 
   @DomName('SVGPathSegArcRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegArcRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegArcRel.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4603,51 +4603,51 @@
 
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoCubicAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicAbs.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x1')
   @DocsEditable()
-  num get x1 => _blink.Native_SVGPathSegCurvetoCubicAbs_x1_Getter(this);
+  num get x1 => _blink.BlinkSVGPathSegCurvetoCubicAbs.$x1_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_x1_Setter(this, value);
+  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.$x1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x2')
   @DocsEditable()
-  num get x2 => _blink.Native_SVGPathSegCurvetoCubicAbs_x2_Getter(this);
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicAbs.$x2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_x2_Setter(this, value);
+  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.$x2_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoCubicAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicAbs.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.$y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y1')
   @DocsEditable()
-  num get y1 => _blink.Native_SVGPathSegCurvetoCubicAbs_y1_Getter(this);
+  num get y1 => _blink.BlinkSVGPathSegCurvetoCubicAbs.$y1_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_y1_Setter(this, value);
+  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.$y1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y2')
   @DocsEditable()
-  num get y2 => _blink.Native_SVGPathSegCurvetoCubicAbs_y2_Getter(this);
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicAbs.$y2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_y2_Setter(this, value);
+  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.$y2_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4666,51 +4666,51 @@
 
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoCubicRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicRel.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.x1')
   @DocsEditable()
-  num get x1 => _blink.Native_SVGPathSegCurvetoCubicRel_x1_Getter(this);
+  num get x1 => _blink.BlinkSVGPathSegCurvetoCubicRel.$x1_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_x1_Setter(this, value);
+  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.$x1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.x2')
   @DocsEditable()
-  num get x2 => _blink.Native_SVGPathSegCurvetoCubicRel_x2_Getter(this);
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicRel.$x2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_x2_Setter(this, value);
+  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.$x2_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoCubicRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicRel.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.$y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.y1')
   @DocsEditable()
-  num get y1 => _blink.Native_SVGPathSegCurvetoCubicRel_y1_Getter(this);
+  num get y1 => _blink.BlinkSVGPathSegCurvetoCubicRel.$y1_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_y1_Setter(this, value);
+  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.$y1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.y2')
   @DocsEditable()
-  num get y2 => _blink.Native_SVGPathSegCurvetoCubicRel_y2_Getter(this);
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicRel.$y2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_y2_Setter(this, value);
+  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.$y2_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4729,35 +4729,35 @@
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   @DocsEditable()
-  num get x2 => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_x2_Getter(this);
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$x2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_x2_Setter(this, value);
+  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$x2_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   @DocsEditable()
-  num get y2 => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_y2_Getter(this);
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$y2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_y2_Setter(this, value);
+  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$y2_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4776,35 +4776,35 @@
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   @DocsEditable()
-  num get x2 => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_x2_Getter(this);
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$x2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_x2_Setter(this, value);
+  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$x2_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   @DocsEditable()
-  num get y2 => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_y2_Getter(this);
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$y2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_y2_Setter(this, value);
+  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$y2_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4823,35 +4823,35 @@
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoQuadraticAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoQuadraticAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   @DocsEditable()
-  num get x1 => _blink.Native_SVGPathSegCurvetoQuadraticAbs_x1_Getter(this);
+  num get x1 => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$x1_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.Native_SVGPathSegCurvetoQuadraticAbs_x1_Setter(this, value);
+  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$x1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoQuadraticAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoQuadraticAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   @DocsEditable()
-  num get y1 => _blink.Native_SVGPathSegCurvetoQuadraticAbs_y1_Getter(this);
+  num get y1 => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$y1_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.Native_SVGPathSegCurvetoQuadraticAbs_y1_Setter(this, value);
+  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$y1_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4870,35 +4870,35 @@
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoQuadraticRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoQuadraticRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   @DocsEditable()
-  num get x1 => _blink.Native_SVGPathSegCurvetoQuadraticRel_x1_Getter(this);
+  num get x1 => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$x1_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.Native_SVGPathSegCurvetoQuadraticRel_x1_Setter(this, value);
+  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$x1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoQuadraticRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoQuadraticRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   @DocsEditable()
-  num get y1 => _blink.Native_SVGPathSegCurvetoQuadraticRel_y1_Getter(this);
+  num get y1 => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$y1_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.Native_SVGPathSegCurvetoQuadraticRel_y1_Setter(this, value);
+  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$y1_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4917,19 +4917,19 @@
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4948,19 +4948,19 @@
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoQuadraticSmoothRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoQuadraticSmoothRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoQuadraticSmoothRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoQuadraticSmoothRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4979,19 +4979,19 @@
 
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegLinetoAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegLinetoAbs.$x_Getter(this);
 
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegLinetoAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegLinetoAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegLinetoAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegLinetoAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegLinetoAbs.$y_Getter(this);
 
   @DomName('SVGPathSegLinetoAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegLinetoAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegLinetoAbs.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5010,11 +5010,11 @@
 
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegLinetoHorizontalAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegLinetoHorizontalAbs.$x_Getter(this);
 
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegLinetoHorizontalAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalAbs.$x_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5033,11 +5033,11 @@
 
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegLinetoHorizontalRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegLinetoHorizontalRel.$x_Getter(this);
 
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegLinetoHorizontalRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalRel.$x_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5056,19 +5056,19 @@
 
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegLinetoRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegLinetoRel.$x_Getter(this);
 
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegLinetoRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegLinetoRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegLinetoRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegLinetoRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegLinetoRel.$y_Getter(this);
 
   @DomName('SVGPathSegLinetoRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegLinetoRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegLinetoRel.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5087,11 +5087,11 @@
 
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegLinetoVerticalAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegLinetoVerticalAbs.$y_Getter(this);
 
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegLinetoVerticalAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalAbs.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5110,11 +5110,11 @@
 
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegLinetoVerticalRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegLinetoVerticalRel.$y_Getter(this);
 
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegLinetoVerticalRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalRel.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5133,7 +5133,7 @@
 
   @DomName('SVGPathSegList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.Native_SVGPathSegList_numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGPathSegList.$numberOfItems_Getter(this);
 
   PathSeg operator[](int index) {
     if (index < 0 || index >= length)
@@ -5183,31 +5183,31 @@
 
   @DomName('SVGPathSegList.appendItem')
   @DocsEditable()
-  PathSeg appendItem(PathSeg newItem) => _blink.Native_SVGPathSegList_appendItem_Callback(this, newItem);
+  PathSeg appendItem(PathSeg newItem) => _blink.BlinkSVGPathSegList.$appendItem_Callback(this, newItem);
 
   @DomName('SVGPathSegList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_SVGPathSegList_clear_Callback(this);
+  void clear() => _blink.BlinkSVGPathSegList.$clear_Callback(this);
 
   @DomName('SVGPathSegList.getItem')
   @DocsEditable()
-  PathSeg getItem(int index) => _blink.Native_SVGPathSegList_getItem_Callback(this, index);
+  PathSeg getItem(int index) => _blink.BlinkSVGPathSegList.$getItem_Callback(this, index);
 
   @DomName('SVGPathSegList.initialize')
   @DocsEditable()
-  PathSeg initialize(PathSeg newItem) => _blink.Native_SVGPathSegList_initialize_Callback(this, newItem);
+  PathSeg initialize(PathSeg newItem) => _blink.BlinkSVGPathSegList.$initialize_Callback(this, newItem);
 
   @DomName('SVGPathSegList.insertItemBefore')
   @DocsEditable()
-  PathSeg insertItemBefore(PathSeg newItem, int index) => _blink.Native_SVGPathSegList_insertItemBefore_Callback(this, newItem, index);
+  PathSeg insertItemBefore(PathSeg newItem, int index) => _blink.BlinkSVGPathSegList.$insertItemBefore_Callback(this, newItem, index);
 
   @DomName('SVGPathSegList.removeItem')
   @DocsEditable()
-  PathSeg removeItem(int index) => _blink.Native_SVGPathSegList_removeItem_Callback(this, index);
+  PathSeg removeItem(int index) => _blink.BlinkSVGPathSegList.$removeItem_Callback(this, index);
 
   @DomName('SVGPathSegList.replaceItem')
   @DocsEditable()
-  PathSeg replaceItem(PathSeg newItem, int index) => _blink.Native_SVGPathSegList_replaceItem_Callback(this, newItem, index);
+  PathSeg replaceItem(PathSeg newItem, int index) => _blink.BlinkSVGPathSegList.$replaceItem_Callback(this, newItem, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5226,19 +5226,19 @@
 
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegMovetoAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegMovetoAbs.$x_Getter(this);
 
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegMovetoAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegMovetoAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegMovetoAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegMovetoAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegMovetoAbs.$y_Getter(this);
 
   @DomName('SVGPathSegMovetoAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegMovetoAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegMovetoAbs.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5257,19 +5257,19 @@
 
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegMovetoRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegMovetoRel.$x_Getter(this);
 
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegMovetoRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegMovetoRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegMovetoRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegMovetoRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegMovetoRel.$y_Getter(this);
 
   @DomName('SVGPathSegMovetoRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegMovetoRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegMovetoRel.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5298,59 +5298,59 @@
 
   @DomName('SVGPatternElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGPatternElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGPatternElement.$height_Getter(this);
 
   @DomName('SVGPatternElement.patternContentUnits')
   @DocsEditable()
-  AnimatedEnumeration get patternContentUnits => _blink.Native_SVGPatternElement_patternContentUnits_Getter(this);
+  AnimatedEnumeration get patternContentUnits => _blink.BlinkSVGPatternElement.$patternContentUnits_Getter(this);
 
   @DomName('SVGPatternElement.patternTransform')
   @DocsEditable()
-  AnimatedTransformList get patternTransform => _blink.Native_SVGPatternElement_patternTransform_Getter(this);
+  AnimatedTransformList get patternTransform => _blink.BlinkSVGPatternElement.$patternTransform_Getter(this);
 
   @DomName('SVGPatternElement.patternUnits')
   @DocsEditable()
-  AnimatedEnumeration get patternUnits => _blink.Native_SVGPatternElement_patternUnits_Getter(this);
+  AnimatedEnumeration get patternUnits => _blink.BlinkSVGPatternElement.$patternUnits_Getter(this);
 
   @DomName('SVGPatternElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGPatternElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGPatternElement.$width_Getter(this);
 
   @DomName('SVGPatternElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGPatternElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGPatternElement.$x_Getter(this);
 
   @DomName('SVGPatternElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGPatternElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGPatternElement.$y_Getter(this);
 
   @DomName('SVGPatternElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGPatternElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGPatternElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGPatternElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.Native_SVGPatternElement_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGPatternElement.$viewBox_Getter(this);
 
   @DomName('SVGPatternElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.Native_SVGPatternElement_requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGPatternElement.$requiredExtensions_Getter(this);
 
   @DomName('SVGPatternElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.Native_SVGPatternElement_requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGPatternElement.$requiredFeatures_Getter(this);
 
   @DomName('SVGPatternElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.Native_SVGPatternElement_systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGPatternElement.$systemLanguage_Getter(this);
 
   @DomName('SVGPatternElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.Native_SVGPatternElement_hasExtension_Callback(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGPatternElement.$hasExtension_Callback(this, extension);
 
   @DomName('SVGPatternElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGPatternElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGPatternElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5369,23 +5369,23 @@
 
   @DomName('SVGPoint.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPoint_x_Getter(this);
+  num get x => _blink.BlinkSVGPoint.$x_Getter(this);
 
   @DomName('SVGPoint.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPoint_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPoint.$x_Setter(this, value);
 
   @DomName('SVGPoint.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPoint_y_Getter(this);
+  num get y => _blink.BlinkSVGPoint.$y_Getter(this);
 
   @DomName('SVGPoint.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPoint_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPoint.$y_Setter(this, value);
 
   @DomName('SVGPoint.matrixTransform')
   @DocsEditable()
-  Point matrixTransform(Matrix matrix) => _blink.Native_SVGPoint_matrixTransform_Callback(this, matrix);
+  Point matrixTransform(Matrix matrix) => _blink.BlinkSVGPoint.$matrixTransform_Callback(this, matrix);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5404,35 +5404,35 @@
 
   @DomName('SVGPointList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.Native_SVGPointList_numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGPointList.$numberOfItems_Getter(this);
 
   @DomName('SVGPointList.appendItem')
   @DocsEditable()
-  Point appendItem(Point item) => _blink.Native_SVGPointList_appendItem_Callback(this, item);
+  Point appendItem(Point item) => _blink.BlinkSVGPointList.$appendItem_Callback(this, item);
 
   @DomName('SVGPointList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_SVGPointList_clear_Callback(this);
+  void clear() => _blink.BlinkSVGPointList.$clear_Callback(this);
 
   @DomName('SVGPointList.getItem')
   @DocsEditable()
-  Point getItem(int index) => _blink.Native_SVGPointList_getItem_Callback(this, index);
+  Point getItem(int index) => _blink.BlinkSVGPointList.$getItem_Callback(this, index);
 
   @DomName('SVGPointList.initialize')
   @DocsEditable()
-  Point initialize(Point item) => _blink.Native_SVGPointList_initialize_Callback(this, item);
+  Point initialize(Point item) => _blink.BlinkSVGPointList.$initialize_Callback(this, item);
 
   @DomName('SVGPointList.insertItemBefore')
   @DocsEditable()
-  Point insertItemBefore(Point item, int index) => _blink.Native_SVGPointList_insertItemBefore_Callback(this, item, index);
+  Point insertItemBefore(Point item, int index) => _blink.BlinkSVGPointList.$insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGPointList.removeItem')
   @DocsEditable()
-  Point removeItem(int index) => _blink.Native_SVGPointList_removeItem_Callback(this, index);
+  Point removeItem(int index) => _blink.BlinkSVGPointList.$removeItem_Callback(this, index);
 
   @DomName('SVGPointList.replaceItem')
   @DocsEditable()
-  Point replaceItem(Point item, int index) => _blink.Native_SVGPointList_replaceItem_Callback(this, item, index);
+  Point replaceItem(Point item, int index) => _blink.BlinkSVGPointList.$replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5461,11 +5461,11 @@
 
   @DomName('SVGPolygonElement.animatedPoints')
   @DocsEditable()
-  PointList get animatedPoints => _blink.Native_SVGPolygonElement_animatedPoints_Getter(this);
+  PointList get animatedPoints => _blink.BlinkSVGPolygonElement.$animatedPoints_Getter(this);
 
   @DomName('SVGPolygonElement.points')
   @DocsEditable()
-  PointList get points => _blink.Native_SVGPolygonElement_points_Getter(this);
+  PointList get points => _blink.BlinkSVGPolygonElement.$points_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5494,11 +5494,11 @@
 
   @DomName('SVGPolylineElement.animatedPoints')
   @DocsEditable()
-  PointList get animatedPoints => _blink.Native_SVGPolylineElement_animatedPoints_Getter(this);
+  PointList get animatedPoints => _blink.BlinkSVGPolylineElement.$animatedPoints_Getter(this);
 
   @DomName('SVGPolylineElement.points')
   @DocsEditable()
-  PointList get points => _blink.Native_SVGPolylineElement_points_Getter(this);
+  PointList get points => _blink.BlinkSVGPolylineElement.$points_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5573,19 +5573,19 @@
 
   @DomName('SVGPreserveAspectRatio.align')
   @DocsEditable()
-  int get align => _blink.Native_SVGPreserveAspectRatio_align_Getter(this);
+  int get align => _blink.BlinkSVGPreserveAspectRatio.$align_Getter(this);
 
   @DomName('SVGPreserveAspectRatio.align')
   @DocsEditable()
-  void set align(int value) => _blink.Native_SVGPreserveAspectRatio_align_Setter(this, value);
+  void set align(int value) => _blink.BlinkSVGPreserveAspectRatio.$align_Setter(this, value);
 
   @DomName('SVGPreserveAspectRatio.meetOrSlice')
   @DocsEditable()
-  int get meetOrSlice => _blink.Native_SVGPreserveAspectRatio_meetOrSlice_Getter(this);
+  int get meetOrSlice => _blink.BlinkSVGPreserveAspectRatio.$meetOrSlice_Getter(this);
 
   @DomName('SVGPreserveAspectRatio.meetOrSlice')
   @DocsEditable()
-  void set meetOrSlice(int value) => _blink.Native_SVGPreserveAspectRatio_meetOrSlice_Setter(this, value);
+  void set meetOrSlice(int value) => _blink.BlinkSVGPreserveAspectRatio.$meetOrSlice_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5614,27 +5614,27 @@
 
   @DomName('SVGRadialGradientElement.cx')
   @DocsEditable()
-  AnimatedLength get cx => _blink.Native_SVGRadialGradientElement_cx_Getter(this);
+  AnimatedLength get cx => _blink.BlinkSVGRadialGradientElement.$cx_Getter(this);
 
   @DomName('SVGRadialGradientElement.cy')
   @DocsEditable()
-  AnimatedLength get cy => _blink.Native_SVGRadialGradientElement_cy_Getter(this);
+  AnimatedLength get cy => _blink.BlinkSVGRadialGradientElement.$cy_Getter(this);
 
   @DomName('SVGRadialGradientElement.fr')
   @DocsEditable()
-  AnimatedLength get fr => _blink.Native_SVGRadialGradientElement_fr_Getter(this);
+  AnimatedLength get fr => _blink.BlinkSVGRadialGradientElement.$fr_Getter(this);
 
   @DomName('SVGRadialGradientElement.fx')
   @DocsEditable()
-  AnimatedLength get fx => _blink.Native_SVGRadialGradientElement_fx_Getter(this);
+  AnimatedLength get fx => _blink.BlinkSVGRadialGradientElement.$fx_Getter(this);
 
   @DomName('SVGRadialGradientElement.fy')
   @DocsEditable()
-  AnimatedLength get fy => _blink.Native_SVGRadialGradientElement_fy_Getter(this);
+  AnimatedLength get fy => _blink.BlinkSVGRadialGradientElement.$fy_Getter(this);
 
   @DomName('SVGRadialGradientElement.r')
   @DocsEditable()
-  AnimatedLength get r => _blink.Native_SVGRadialGradientElement_r_Getter(this);
+  AnimatedLength get r => _blink.BlinkSVGRadialGradientElement.$r_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5653,35 +5653,35 @@
 
   @DomName('SVGRect.height')
   @DocsEditable()
-  num get height => _blink.Native_SVGRect_height_Getter(this);
+  num get height => _blink.BlinkSVGRect.$height_Getter(this);
 
   @DomName('SVGRect.height')
   @DocsEditable()
-  void set height(num value) => _blink.Native_SVGRect_height_Setter(this, value);
+  void set height(num value) => _blink.BlinkSVGRect.$height_Setter(this, value);
 
   @DomName('SVGRect.width')
   @DocsEditable()
-  num get width => _blink.Native_SVGRect_width_Getter(this);
+  num get width => _blink.BlinkSVGRect.$width_Getter(this);
 
   @DomName('SVGRect.width')
   @DocsEditable()
-  void set width(num value) => _blink.Native_SVGRect_width_Setter(this, value);
+  void set width(num value) => _blink.BlinkSVGRect.$width_Setter(this, value);
 
   @DomName('SVGRect.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGRect_x_Getter(this);
+  num get x => _blink.BlinkSVGRect.$x_Getter(this);
 
   @DomName('SVGRect.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGRect_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGRect.$x_Setter(this, value);
 
   @DomName('SVGRect.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGRect_y_Getter(this);
+  num get y => _blink.BlinkSVGRect.$y_Getter(this);
 
   @DomName('SVGRect.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGRect_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGRect.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5710,27 +5710,27 @@
 
   @DomName('SVGRectElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGRectElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGRectElement.$height_Getter(this);
 
   @DomName('SVGRectElement.rx')
   @DocsEditable()
-  AnimatedLength get rx => _blink.Native_SVGRectElement_rx_Getter(this);
+  AnimatedLength get rx => _blink.BlinkSVGRectElement.$rx_Getter(this);
 
   @DomName('SVGRectElement.ry')
   @DocsEditable()
-  AnimatedLength get ry => _blink.Native_SVGRectElement_ry_Getter(this);
+  AnimatedLength get ry => _blink.BlinkSVGRectElement.$ry_Getter(this);
 
   @DomName('SVGRectElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGRectElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGRectElement.$width_Getter(this);
 
   @DomName('SVGRectElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGRectElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGRectElement.$x_Getter(this);
 
   @DomName('SVGRectElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGRectElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGRectElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5798,15 +5798,15 @@
 
   @DomName('SVGScriptElement.type')
   @DocsEditable()
-  String get type => _blink.Native_SVGScriptElement_type_Getter(this);
+  String get type => _blink.BlinkSVGScriptElement.$type_Getter(this);
 
   @DomName('SVGScriptElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_SVGScriptElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkSVGScriptElement.$type_Setter(this, value);
 
   @DomName('SVGScriptElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGScriptElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGScriptElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5866,7 +5866,7 @@
 
   @DomName('SVGStopElement.offset')
   @DocsEditable()
-  AnimatedNumber get gradientOffset => _blink.Native_SVGStopElement_offset_Getter(this);
+  AnimatedNumber get gradientOffset => _blink.BlinkSVGStopElement.$offset_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5885,7 +5885,7 @@
 
   @DomName('SVGStringList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.Native_SVGStringList_numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGStringList.$numberOfItems_Getter(this);
 
   String operator[](int index) {
     if (index < 0 || index >= length)
@@ -5935,31 +5935,31 @@
 
   @DomName('SVGStringList.appendItem')
   @DocsEditable()
-  String appendItem(String item) => _blink.Native_SVGStringList_appendItem_Callback(this, item);
+  String appendItem(String item) => _blink.BlinkSVGStringList.$appendItem_Callback(this, item);
 
   @DomName('SVGStringList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_SVGStringList_clear_Callback(this);
+  void clear() => _blink.BlinkSVGStringList.$clear_Callback(this);
 
   @DomName('SVGStringList.getItem')
   @DocsEditable()
-  String getItem(int index) => _blink.Native_SVGStringList_getItem_Callback(this, index);
+  String getItem(int index) => _blink.BlinkSVGStringList.$getItem_Callback(this, index);
 
   @DomName('SVGStringList.initialize')
   @DocsEditable()
-  String initialize(String item) => _blink.Native_SVGStringList_initialize_Callback(this, item);
+  String initialize(String item) => _blink.BlinkSVGStringList.$initialize_Callback(this, item);
 
   @DomName('SVGStringList.insertItemBefore')
   @DocsEditable()
-  String insertItemBefore(String item, int index) => _blink.Native_SVGStringList_insertItemBefore_Callback(this, item, index);
+  String insertItemBefore(String item, int index) => _blink.BlinkSVGStringList.$insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGStringList.removeItem')
   @DocsEditable()
-  String removeItem(int index) => _blink.Native_SVGStringList_removeItem_Callback(this, index);
+  String removeItem(int index) => _blink.BlinkSVGStringList.$removeItem_Callback(this, index);
 
   @DomName('SVGStringList.replaceItem')
   @DocsEditable()
-  String replaceItem(String item, int index) => _blink.Native_SVGStringList_replaceItem_Callback(this, item, index);
+  String replaceItem(String item, int index) => _blink.BlinkSVGStringList.$replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5989,35 +5989,35 @@
 
   @DomName('SVGStyleElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_SVGStyleElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkSVGStyleElement.$disabled_Getter(this);
 
   @DomName('SVGStyleElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_SVGStyleElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkSVGStyleElement.$disabled_Setter(this, value);
 
   @DomName('SVGStyleElement.media')
   @DocsEditable()
-  String get media => _blink.Native_SVGStyleElement_media_Getter(this);
+  String get media => _blink.BlinkSVGStyleElement.$media_Getter(this);
 
   @DomName('SVGStyleElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.Native_SVGStyleElement_media_Setter(this, value);
+  void set media(String value) => _blink.BlinkSVGStyleElement.$media_Setter(this, value);
 
   @DomName('SVGStyleElement.title')
   @DocsEditable()
-  String get title => _blink.Native_SVGStyleElement_title_Getter(this);
+  String get title => _blink.BlinkSVGStyleElement.$title_Getter(this);
 
   @DomName('SVGStyleElement.title')
   @DocsEditable()
-  void set title(String value) => _blink.Native_SVGStyleElement_title_Setter(this, value);
+  void set title(String value) => _blink.BlinkSVGStyleElement.$title_Setter(this, value);
 
   @DomName('SVGStyleElement.type')
   @DocsEditable()
-  String get type => _blink.Native_SVGStyleElement_type_Getter(this);
+  String get type => _blink.BlinkSVGStyleElement.$type_Getter(this);
 
   @DomName('SVGStyleElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_SVGStyleElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkSVGStyleElement.$type_Setter(this, value);
 
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
@@ -6443,48 +6443,48 @@
   @DomName('SVGElement.className')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimatedString get _svgClassName => _blink.Native_SVGElement_className_Getter(this);
+  AnimatedString get _svgClassName => _blink.BlinkSVGElement.$className_Getter(this);
 
   @DomName('SVGElement.ownerSVGElement')
   @DocsEditable()
-  SvgSvgElement get ownerSvgElement => _blink.Native_SVGElement_ownerSVGElement_Getter(this);
+  SvgSvgElement get ownerSvgElement => _blink.BlinkSVGElement.$ownerSVGElement_Getter(this);
 
   @DomName('SVGElement.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => _blink.Native_SVGElement_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkSVGElement.$style_Getter(this);
 
   @DomName('SVGElement.viewportElement')
   @DocsEditable()
-  SvgElement get viewportElement => _blink.Native_SVGElement_viewportElement_Getter(this);
+  SvgElement get viewportElement => _blink.BlinkSVGElement.$viewportElement_Getter(this);
 
   @DomName('SVGElement.xmlbase')
   @DocsEditable()
-  String get xmlbase => _blink.Native_SVGElement_xmlbase_Getter(this);
+  String get xmlbase => _blink.BlinkSVGElement.$xmlbase_Getter(this);
 
   @DomName('SVGElement.xmlbase')
   @DocsEditable()
-  void set xmlbase(String value) => _blink.Native_SVGElement_xmlbase_Setter(this, value);
+  void set xmlbase(String value) => _blink.BlinkSVGElement.$xmlbase_Setter(this, value);
 
   @DomName('SVGElement.xmllang')
   @DocsEditable()
   @Experimental() // untriaged
-  String get xmllang => _blink.Native_SVGElement_xmllang_Getter(this);
+  String get xmllang => _blink.BlinkSVGElement.$xmllang_Getter(this);
 
   @DomName('SVGElement.xmllang')
   @DocsEditable()
   @Experimental() // untriaged
-  void set xmllang(String value) => _blink.Native_SVGElement_xmllang_Setter(this, value);
+  void set xmllang(String value) => _blink.BlinkSVGElement.$xmllang_Setter(this, value);
 
   @DomName('SVGElement.xmlspace')
   @DocsEditable()
   @Experimental() // untriaged
-  String get xmlspace => _blink.Native_SVGElement_xmlspace_Getter(this);
+  String get xmlspace => _blink.BlinkSVGElement.$xmlspace_Getter(this);
 
   @DomName('SVGElement.xmlspace')
   @DocsEditable()
   @Experimental() // untriaged
-  void set xmlspace(String value) => _blink.Native_SVGElement_xmlspace_Setter(this, value);
+  void set xmlspace(String value) => _blink.BlinkSVGElement.$xmlspace_Setter(this, value);
 
   @DomName('SVGElement.onabort')
   @DocsEditable()
@@ -6773,167 +6773,167 @@
 
   @DomName('SVGSVGElement.currentScale')
   @DocsEditable()
-  num get currentScale => _blink.Native_SVGSVGElement_currentScale_Getter(this);
+  num get currentScale => _blink.BlinkSVGSVGElement.$currentScale_Getter(this);
 
   @DomName('SVGSVGElement.currentScale')
   @DocsEditable()
-  void set currentScale(num value) => _blink.Native_SVGSVGElement_currentScale_Setter(this, value);
+  void set currentScale(num value) => _blink.BlinkSVGSVGElement.$currentScale_Setter(this, value);
 
   @DomName('SVGSVGElement.currentTranslate')
   @DocsEditable()
-  Point get currentTranslate => _blink.Native_SVGSVGElement_currentTranslate_Getter(this);
+  Point get currentTranslate => _blink.BlinkSVGSVGElement.$currentTranslate_Getter(this);
 
   @DomName('SVGSVGElement.currentView')
   @DocsEditable()
-  ViewSpec get currentView => _blink.Native_SVGSVGElement_currentView_Getter(this);
+  ViewSpec get currentView => _blink.BlinkSVGSVGElement.$currentView_Getter(this);
 
   @DomName('SVGSVGElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGSVGElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGSVGElement.$height_Getter(this);
 
   @DomName('SVGSVGElement.pixelUnitToMillimeterX')
   @DocsEditable()
-  double get pixelUnitToMillimeterX => _blink.Native_SVGSVGElement_pixelUnitToMillimeterX_Getter(this);
+  double get pixelUnitToMillimeterX => _blink.BlinkSVGSVGElement.$pixelUnitToMillimeterX_Getter(this);
 
   @DomName('SVGSVGElement.pixelUnitToMillimeterY')
   @DocsEditable()
-  double get pixelUnitToMillimeterY => _blink.Native_SVGSVGElement_pixelUnitToMillimeterY_Getter(this);
+  double get pixelUnitToMillimeterY => _blink.BlinkSVGSVGElement.$pixelUnitToMillimeterY_Getter(this);
 
   @DomName('SVGSVGElement.screenPixelToMillimeterX')
   @DocsEditable()
-  double get screenPixelToMillimeterX => _blink.Native_SVGSVGElement_screenPixelToMillimeterX_Getter(this);
+  double get screenPixelToMillimeterX => _blink.BlinkSVGSVGElement.$screenPixelToMillimeterX_Getter(this);
 
   @DomName('SVGSVGElement.screenPixelToMillimeterY')
   @DocsEditable()
-  double get screenPixelToMillimeterY => _blink.Native_SVGSVGElement_screenPixelToMillimeterY_Getter(this);
+  double get screenPixelToMillimeterY => _blink.BlinkSVGSVGElement.$screenPixelToMillimeterY_Getter(this);
 
   @DomName('SVGSVGElement.useCurrentView')
   @DocsEditable()
-  bool get useCurrentView => _blink.Native_SVGSVGElement_useCurrentView_Getter(this);
+  bool get useCurrentView => _blink.BlinkSVGSVGElement.$useCurrentView_Getter(this);
 
   @DomName('SVGSVGElement.viewport')
   @DocsEditable()
-  Rect get viewport => _blink.Native_SVGSVGElement_viewport_Getter(this);
+  Rect get viewport => _blink.BlinkSVGSVGElement.$viewport_Getter(this);
 
   @DomName('SVGSVGElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGSVGElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGSVGElement.$width_Getter(this);
 
   @DomName('SVGSVGElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGSVGElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGSVGElement.$x_Getter(this);
 
   @DomName('SVGSVGElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGSVGElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGSVGElement.$y_Getter(this);
 
   @DomName('SVGSVGElement.animationsPaused')
   @DocsEditable()
-  bool animationsPaused() => _blink.Native_SVGSVGElement_animationsPaused_Callback(this);
+  bool animationsPaused() => _blink.BlinkSVGSVGElement.$animationsPaused_Callback(this);
 
   @DomName('SVGSVGElement.checkEnclosure')
   @DocsEditable()
-  bool checkEnclosure(SvgElement element, Rect rect) => _blink.Native_SVGSVGElement_checkEnclosure_Callback(this, element, rect);
+  bool checkEnclosure(SvgElement element, Rect rect) => _blink.BlinkSVGSVGElement.$checkEnclosure_Callback(this, element, rect);
 
   @DomName('SVGSVGElement.checkIntersection')
   @DocsEditable()
-  bool checkIntersection(SvgElement element, Rect rect) => _blink.Native_SVGSVGElement_checkIntersection_Callback(this, element, rect);
+  bool checkIntersection(SvgElement element, Rect rect) => _blink.BlinkSVGSVGElement.$checkIntersection_Callback(this, element, rect);
 
   @DomName('SVGSVGElement.createSVGAngle')
   @DocsEditable()
-  Angle createSvgAngle() => _blink.Native_SVGSVGElement_createSVGAngle_Callback(this);
+  Angle createSvgAngle() => _blink.BlinkSVGSVGElement.$createSVGAngle_Callback(this);
 
   @DomName('SVGSVGElement.createSVGLength')
   @DocsEditable()
-  Length createSvgLength() => _blink.Native_SVGSVGElement_createSVGLength_Callback(this);
+  Length createSvgLength() => _blink.BlinkSVGSVGElement.$createSVGLength_Callback(this);
 
   @DomName('SVGSVGElement.createSVGMatrix')
   @DocsEditable()
-  Matrix createSvgMatrix() => _blink.Native_SVGSVGElement_createSVGMatrix_Callback(this);
+  Matrix createSvgMatrix() => _blink.BlinkSVGSVGElement.$createSVGMatrix_Callback(this);
 
   @DomName('SVGSVGElement.createSVGNumber')
   @DocsEditable()
-  Number createSvgNumber() => _blink.Native_SVGSVGElement_createSVGNumber_Callback(this);
+  Number createSvgNumber() => _blink.BlinkSVGSVGElement.$createSVGNumber_Callback(this);
 
   @DomName('SVGSVGElement.createSVGPoint')
   @DocsEditable()
-  Point createSvgPoint() => _blink.Native_SVGSVGElement_createSVGPoint_Callback(this);
+  Point createSvgPoint() => _blink.BlinkSVGSVGElement.$createSVGPoint_Callback(this);
 
   @DomName('SVGSVGElement.createSVGRect')
   @DocsEditable()
-  Rect createSvgRect() => _blink.Native_SVGSVGElement_createSVGRect_Callback(this);
+  Rect createSvgRect() => _blink.BlinkSVGSVGElement.$createSVGRect_Callback(this);
 
   @DomName('SVGSVGElement.createSVGTransform')
   @DocsEditable()
-  Transform createSvgTransform() => _blink.Native_SVGSVGElement_createSVGTransform_Callback(this);
+  Transform createSvgTransform() => _blink.BlinkSVGSVGElement.$createSVGTransform_Callback(this);
 
   @DomName('SVGSVGElement.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.Native_SVGSVGElement_createSVGTransformFromMatrix_Callback(this, matrix);
+  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.BlinkSVGSVGElement.$createSVGTransformFromMatrix_Callback(this, matrix);
 
   @DomName('SVGSVGElement.deselectAll')
   @DocsEditable()
-  void deselectAll() => _blink.Native_SVGSVGElement_deselectAll_Callback(this);
+  void deselectAll() => _blink.BlinkSVGSVGElement.$deselectAll_Callback(this);
 
   @DomName('SVGSVGElement.forceRedraw')
   @DocsEditable()
-  void forceRedraw() => _blink.Native_SVGSVGElement_forceRedraw_Callback(this);
+  void forceRedraw() => _blink.BlinkSVGSVGElement.$forceRedraw_Callback(this);
 
   @DomName('SVGSVGElement.getCurrentTime')
   @DocsEditable()
-  double getCurrentTime() => _blink.Native_SVGSVGElement_getCurrentTime_Callback(this);
+  double getCurrentTime() => _blink.BlinkSVGSVGElement.$getCurrentTime_Callback(this);
 
   @DomName('SVGSVGElement.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) => _blink.Native_SVGSVGElement_getElementById_Callback(this, elementId);
+  Element getElementById(String elementId) => _blink.BlinkSVGSVGElement.$getElementById_Callback(this, elementId);
 
   @DomName('SVGSVGElement.getEnclosureList')
   @DocsEditable()
-  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) => _blink.Native_SVGSVGElement_getEnclosureList_Callback(this, rect, referenceElement);
+  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) => _blink.BlinkSVGSVGElement.$getEnclosureList_Callback(this, rect, referenceElement);
 
   @DomName('SVGSVGElement.getIntersectionList')
   @DocsEditable()
-  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) => _blink.Native_SVGSVGElement_getIntersectionList_Callback(this, rect, referenceElement);
+  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) => _blink.BlinkSVGSVGElement.$getIntersectionList_Callback(this, rect, referenceElement);
 
   @DomName('SVGSVGElement.pauseAnimations')
   @DocsEditable()
-  void pauseAnimations() => _blink.Native_SVGSVGElement_pauseAnimations_Callback(this);
+  void pauseAnimations() => _blink.BlinkSVGSVGElement.$pauseAnimations_Callback(this);
 
   @DomName('SVGSVGElement.setCurrentTime')
   @DocsEditable()
-  void setCurrentTime(num seconds) => _blink.Native_SVGSVGElement_setCurrentTime_Callback(this, seconds);
+  void setCurrentTime(num seconds) => _blink.BlinkSVGSVGElement.$setCurrentTime_Callback(this, seconds);
 
   @DomName('SVGSVGElement.suspendRedraw')
   @DocsEditable()
-  int suspendRedraw(int maxWaitMilliseconds) => _blink.Native_SVGSVGElement_suspendRedraw_Callback(this, maxWaitMilliseconds);
+  int suspendRedraw(int maxWaitMilliseconds) => _blink.BlinkSVGSVGElement.$suspendRedraw_Callback(this, maxWaitMilliseconds);
 
   @DomName('SVGSVGElement.unpauseAnimations')
   @DocsEditable()
-  void unpauseAnimations() => _blink.Native_SVGSVGElement_unpauseAnimations_Callback(this);
+  void unpauseAnimations() => _blink.BlinkSVGSVGElement.$unpauseAnimations_Callback(this);
 
   @DomName('SVGSVGElement.unsuspendRedraw')
   @DocsEditable()
-  void unsuspendRedraw(int suspendHandleId) => _blink.Native_SVGSVGElement_unsuspendRedraw_Callback(this, suspendHandleId);
+  void unsuspendRedraw(int suspendHandleId) => _blink.BlinkSVGSVGElement.$unsuspendRedraw_Callback(this, suspendHandleId);
 
   @DomName('SVGSVGElement.unsuspendRedrawAll')
   @DocsEditable()
-  void unsuspendRedrawAll() => _blink.Native_SVGSVGElement_unsuspendRedrawAll_Callback(this);
+  void unsuspendRedrawAll() => _blink.BlinkSVGSVGElement.$unsuspendRedrawAll_Callback(this);
 
   @DomName('SVGSVGElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGSVGElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGSVGElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGSVGElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.Native_SVGSVGElement_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGSVGElement.$viewBox_Getter(this);
 
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan => _blink.Native_SVGSVGElement_zoomAndPan_Getter(this);
+  int get zoomAndPan => _blink.BlinkSVGSVGElement.$zoomAndPan_Getter(this);
 
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) => _blink.Native_SVGSVGElement_zoomAndPan_Setter(this, value);
+  void set zoomAndPan(int value) => _blink.BlinkSVGSVGElement.$zoomAndPan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6987,11 +6987,11 @@
 
   @DomName('SVGSymbolElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGSymbolElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGSymbolElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGSymbolElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.Native_SVGSymbolElement_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGSymbolElement.$viewBox_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7035,19 +7035,19 @@
 
   @DomName('SVGTests.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.Native_SVGTests_requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGTests.$requiredExtensions_Getter(this);
 
   @DomName('SVGTests.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.Native_SVGTests_requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGTests.$requiredFeatures_Getter(this);
 
   @DomName('SVGTests.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.Native_SVGTests_systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGTests.$systemLanguage_Getter(this);
 
   @DomName('SVGTests.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.Native_SVGTests_hasExtension_Callback(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGTests.$hasExtension_Callback(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7084,47 +7084,47 @@
 
   @DomName('SVGTextContentElement.lengthAdjust')
   @DocsEditable()
-  AnimatedEnumeration get lengthAdjust => _blink.Native_SVGTextContentElement_lengthAdjust_Getter(this);
+  AnimatedEnumeration get lengthAdjust => _blink.BlinkSVGTextContentElement.$lengthAdjust_Getter(this);
 
   @DomName('SVGTextContentElement.textLength')
   @DocsEditable()
-  AnimatedLength get textLength => _blink.Native_SVGTextContentElement_textLength_Getter(this);
+  AnimatedLength get textLength => _blink.BlinkSVGTextContentElement.$textLength_Getter(this);
 
   @DomName('SVGTextContentElement.getCharNumAtPosition')
   @DocsEditable()
-  int getCharNumAtPosition(Point point) => _blink.Native_SVGTextContentElement_getCharNumAtPosition_Callback(this, point);
+  int getCharNumAtPosition(Point point) => _blink.BlinkSVGTextContentElement.$getCharNumAtPosition_Callback(this, point);
 
   @DomName('SVGTextContentElement.getComputedTextLength')
   @DocsEditable()
-  double getComputedTextLength() => _blink.Native_SVGTextContentElement_getComputedTextLength_Callback(this);
+  double getComputedTextLength() => _blink.BlinkSVGTextContentElement.$getComputedTextLength_Callback(this);
 
   @DomName('SVGTextContentElement.getEndPositionOfChar')
   @DocsEditable()
-  Point getEndPositionOfChar(int offset) => _blink.Native_SVGTextContentElement_getEndPositionOfChar_Callback(this, offset);
+  Point getEndPositionOfChar(int offset) => _blink.BlinkSVGTextContentElement.$getEndPositionOfChar_Callback(this, offset);
 
   @DomName('SVGTextContentElement.getExtentOfChar')
   @DocsEditable()
-  Rect getExtentOfChar(int offset) => _blink.Native_SVGTextContentElement_getExtentOfChar_Callback(this, offset);
+  Rect getExtentOfChar(int offset) => _blink.BlinkSVGTextContentElement.$getExtentOfChar_Callback(this, offset);
 
   @DomName('SVGTextContentElement.getNumberOfChars')
   @DocsEditable()
-  int getNumberOfChars() => _blink.Native_SVGTextContentElement_getNumberOfChars_Callback(this);
+  int getNumberOfChars() => _blink.BlinkSVGTextContentElement.$getNumberOfChars_Callback(this);
 
   @DomName('SVGTextContentElement.getRotationOfChar')
   @DocsEditable()
-  double getRotationOfChar(int offset) => _blink.Native_SVGTextContentElement_getRotationOfChar_Callback(this, offset);
+  double getRotationOfChar(int offset) => _blink.BlinkSVGTextContentElement.$getRotationOfChar_Callback(this, offset);
 
   @DomName('SVGTextContentElement.getStartPositionOfChar')
   @DocsEditable()
-  Point getStartPositionOfChar(int offset) => _blink.Native_SVGTextContentElement_getStartPositionOfChar_Callback(this, offset);
+  Point getStartPositionOfChar(int offset) => _blink.BlinkSVGTextContentElement.$getStartPositionOfChar_Callback(this, offset);
 
   @DomName('SVGTextContentElement.getSubStringLength')
   @DocsEditable()
-  double getSubStringLength(int offset, int length) => _blink.Native_SVGTextContentElement_getSubStringLength_Callback(this, offset, length);
+  double getSubStringLength(int offset, int length) => _blink.BlinkSVGTextContentElement.$getSubStringLength_Callback(this, offset, length);
 
   @DomName('SVGTextContentElement.selectSubString')
   @DocsEditable()
-  void selectSubString(int offset, int length) => _blink.Native_SVGTextContentElement_selectSubString_Callback(this, offset, length);
+  void selectSubString(int offset, int length) => _blink.BlinkSVGTextContentElement.$selectSubString_Callback(this, offset, length);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7198,19 +7198,19 @@
 
   @DomName('SVGTextPathElement.method')
   @DocsEditable()
-  AnimatedEnumeration get method => _blink.Native_SVGTextPathElement_method_Getter(this);
+  AnimatedEnumeration get method => _blink.BlinkSVGTextPathElement.$method_Getter(this);
 
   @DomName('SVGTextPathElement.spacing')
   @DocsEditable()
-  AnimatedEnumeration get spacing => _blink.Native_SVGTextPathElement_spacing_Getter(this);
+  AnimatedEnumeration get spacing => _blink.BlinkSVGTextPathElement.$spacing_Getter(this);
 
   @DomName('SVGTextPathElement.startOffset')
   @DocsEditable()
-  AnimatedLength get startOffset => _blink.Native_SVGTextPathElement_startOffset_Getter(this);
+  AnimatedLength get startOffset => _blink.BlinkSVGTextPathElement.$startOffset_Getter(this);
 
   @DomName('SVGTextPathElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGTextPathElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGTextPathElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7235,23 +7235,23 @@
 
   @DomName('SVGTextPositioningElement.dx')
   @DocsEditable()
-  AnimatedLengthList get dx => _blink.Native_SVGTextPositioningElement_dx_Getter(this);
+  AnimatedLengthList get dx => _blink.BlinkSVGTextPositioningElement.$dx_Getter(this);
 
   @DomName('SVGTextPositioningElement.dy')
   @DocsEditable()
-  AnimatedLengthList get dy => _blink.Native_SVGTextPositioningElement_dy_Getter(this);
+  AnimatedLengthList get dy => _blink.BlinkSVGTextPositioningElement.$dy_Getter(this);
 
   @DomName('SVGTextPositioningElement.rotate')
   @DocsEditable()
-  AnimatedNumberList get rotate => _blink.Native_SVGTextPositioningElement_rotate_Getter(this);
+  AnimatedNumberList get rotate => _blink.BlinkSVGTextPositioningElement.$rotate_Getter(this);
 
   @DomName('SVGTextPositioningElement.x')
   @DocsEditable()
-  AnimatedLengthList get x => _blink.Native_SVGTextPositioningElement_x_Getter(this);
+  AnimatedLengthList get x => _blink.BlinkSVGTextPositioningElement.$x_Getter(this);
 
   @DomName('SVGTextPositioningElement.y')
   @DocsEditable()
-  AnimatedLengthList get y => _blink.Native_SVGTextPositioningElement_y_Getter(this);
+  AnimatedLengthList get y => _blink.BlinkSVGTextPositioningElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7323,39 +7323,39 @@
 
   @DomName('SVGTransform.angle')
   @DocsEditable()
-  double get angle => _blink.Native_SVGTransform_angle_Getter(this);
+  double get angle => _blink.BlinkSVGTransform.$angle_Getter(this);
 
   @DomName('SVGTransform.matrix')
   @DocsEditable()
-  Matrix get matrix => _blink.Native_SVGTransform_matrix_Getter(this);
+  Matrix get matrix => _blink.BlinkSVGTransform.$matrix_Getter(this);
 
   @DomName('SVGTransform.type')
   @DocsEditable()
-  int get type => _blink.Native_SVGTransform_type_Getter(this);
+  int get type => _blink.BlinkSVGTransform.$type_Getter(this);
 
   @DomName('SVGTransform.setMatrix')
   @DocsEditable()
-  void setMatrix(Matrix matrix) => _blink.Native_SVGTransform_setMatrix_Callback(this, matrix);
+  void setMatrix(Matrix matrix) => _blink.BlinkSVGTransform.$setMatrix_Callback(this, matrix);
 
   @DomName('SVGTransform.setRotate')
   @DocsEditable()
-  void setRotate(num angle, num cx, num cy) => _blink.Native_SVGTransform_setRotate_Callback(this, angle, cx, cy);
+  void setRotate(num angle, num cx, num cy) => _blink.BlinkSVGTransform.$setRotate_Callback(this, angle, cx, cy);
 
   @DomName('SVGTransform.setScale')
   @DocsEditable()
-  void setScale(num sx, num sy) => _blink.Native_SVGTransform_setScale_Callback(this, sx, sy);
+  void setScale(num sx, num sy) => _blink.BlinkSVGTransform.$setScale_Callback(this, sx, sy);
 
   @DomName('SVGTransform.setSkewX')
   @DocsEditable()
-  void setSkewX(num angle) => _blink.Native_SVGTransform_setSkewX_Callback(this, angle);
+  void setSkewX(num angle) => _blink.BlinkSVGTransform.$setSkewX_Callback(this, angle);
 
   @DomName('SVGTransform.setSkewY')
   @DocsEditable()
-  void setSkewY(num angle) => _blink.Native_SVGTransform_setSkewY_Callback(this, angle);
+  void setSkewY(num angle) => _blink.BlinkSVGTransform.$setSkewY_Callback(this, angle);
 
   @DomName('SVGTransform.setTranslate')
   @DocsEditable()
-  void setTranslate(num tx, num ty) => _blink.Native_SVGTransform_setTranslate_Callback(this, tx, ty);
+  void setTranslate(num tx, num ty) => _blink.BlinkSVGTransform.$setTranslate_Callback(this, tx, ty);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7374,7 +7374,7 @@
 
   @DomName('SVGTransformList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.Native_SVGTransformList_numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGTransformList.$numberOfItems_Getter(this);
 
   Transform operator[](int index) {
     if (index < 0 || index >= length)
@@ -7424,39 +7424,39 @@
 
   @DomName('SVGTransformList.appendItem')
   @DocsEditable()
-  Transform appendItem(Transform item) => _blink.Native_SVGTransformList_appendItem_Callback(this, item);
+  Transform appendItem(Transform item) => _blink.BlinkSVGTransformList.$appendItem_Callback(this, item);
 
   @DomName('SVGTransformList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_SVGTransformList_clear_Callback(this);
+  void clear() => _blink.BlinkSVGTransformList.$clear_Callback(this);
 
   @DomName('SVGTransformList.consolidate')
   @DocsEditable()
-  Transform consolidate() => _blink.Native_SVGTransformList_consolidate_Callback(this);
+  Transform consolidate() => _blink.BlinkSVGTransformList.$consolidate_Callback(this);
 
   @DomName('SVGTransformList.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.Native_SVGTransformList_createSVGTransformFromMatrix_Callback(this, matrix);
+  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.BlinkSVGTransformList.$createSVGTransformFromMatrix_Callback(this, matrix);
 
   @DomName('SVGTransformList.getItem')
   @DocsEditable()
-  Transform getItem(int index) => _blink.Native_SVGTransformList_getItem_Callback(this, index);
+  Transform getItem(int index) => _blink.BlinkSVGTransformList.$getItem_Callback(this, index);
 
   @DomName('SVGTransformList.initialize')
   @DocsEditable()
-  Transform initialize(Transform item) => _blink.Native_SVGTransformList_initialize_Callback(this, item);
+  Transform initialize(Transform item) => _blink.BlinkSVGTransformList.$initialize_Callback(this, item);
 
   @DomName('SVGTransformList.insertItemBefore')
   @DocsEditable()
-  Transform insertItemBefore(Transform item, int index) => _blink.Native_SVGTransformList_insertItemBefore_Callback(this, item, index);
+  Transform insertItemBefore(Transform item, int index) => _blink.BlinkSVGTransformList.$insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGTransformList.removeItem')
   @DocsEditable()
-  Transform removeItem(int index) => _blink.Native_SVGTransformList_removeItem_Callback(this, index);
+  Transform removeItem(int index) => _blink.BlinkSVGTransformList.$removeItem_Callback(this, index);
 
   @DomName('SVGTransformList.replaceItem')
   @DocsEditable()
-  Transform replaceItem(Transform item, int index) => _blink.Native_SVGTransformList_replaceItem_Callback(this, item, index);
+  Transform replaceItem(Transform item, int index) => _blink.BlinkSVGTransformList.$replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7502,7 +7502,7 @@
 
   @DomName('SVGURIReference.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGURIReference_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGURIReference.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7531,47 +7531,47 @@
 
   @DomName('SVGUseElement.animatedInstanceRoot')
   @DocsEditable()
-  ElementInstance get animatedInstanceRoot => _blink.Native_SVGUseElement_animatedInstanceRoot_Getter(this);
+  ElementInstance get animatedInstanceRoot => _blink.BlinkSVGUseElement.$animatedInstanceRoot_Getter(this);
 
   @DomName('SVGUseElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGUseElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGUseElement.$height_Getter(this);
 
   @DomName('SVGUseElement.instanceRoot')
   @DocsEditable()
-  ElementInstance get instanceRoot => _blink.Native_SVGUseElement_instanceRoot_Getter(this);
+  ElementInstance get instanceRoot => _blink.BlinkSVGUseElement.$instanceRoot_Getter(this);
 
   @DomName('SVGUseElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGUseElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGUseElement.$width_Getter(this);
 
   @DomName('SVGUseElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGUseElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGUseElement.$x_Getter(this);
 
   @DomName('SVGUseElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGUseElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGUseElement.$y_Getter(this);
 
   @DomName('SVGUseElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.Native_SVGUseElement_requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGUseElement.$requiredExtensions_Getter(this);
 
   @DomName('SVGUseElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.Native_SVGUseElement_requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGUseElement.$requiredFeatures_Getter(this);
 
   @DomName('SVGUseElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.Native_SVGUseElement_systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGUseElement.$systemLanguage_Getter(this);
 
   @DomName('SVGUseElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.Native_SVGUseElement_hasExtension_Callback(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGUseElement.$hasExtension_Callback(this, extension);
 
   @DomName('SVGUseElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGUseElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGUseElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7600,23 +7600,23 @@
 
   @DomName('SVGViewElement.viewTarget')
   @DocsEditable()
-  StringList get viewTarget => _blink.Native_SVGViewElement_viewTarget_Getter(this);
+  StringList get viewTarget => _blink.BlinkSVGViewElement.$viewTarget_Getter(this);
 
   @DomName('SVGViewElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGViewElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGViewElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGViewElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.Native_SVGViewElement_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGViewElement.$viewBox_Getter(this);
 
   @DomName('SVGViewElement.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan => _blink.Native_SVGViewElement_zoomAndPan_Getter(this);
+  int get zoomAndPan => _blink.BlinkSVGViewElement.$zoomAndPan_Getter(this);
 
   @DomName('SVGViewElement.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) => _blink.Native_SVGViewElement_zoomAndPan_Setter(this, value);
+  void set zoomAndPan(int value) => _blink.BlinkSVGViewElement.$zoomAndPan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7635,47 +7635,47 @@
 
   @DomName('SVGViewSpec.preserveAspectRatioString')
   @DocsEditable()
-  String get preserveAspectRatioString => _blink.Native_SVGViewSpec_preserveAspectRatioString_Getter(this);
+  String get preserveAspectRatioString => _blink.BlinkSVGViewSpec.$preserveAspectRatioString_Getter(this);
 
   @DomName('SVGViewSpec.transform')
   @DocsEditable()
-  TransformList get transform => _blink.Native_SVGViewSpec_transform_Getter(this);
+  TransformList get transform => _blink.BlinkSVGViewSpec.$transform_Getter(this);
 
   @DomName('SVGViewSpec.transformString')
   @DocsEditable()
-  String get transformString => _blink.Native_SVGViewSpec_transformString_Getter(this);
+  String get transformString => _blink.BlinkSVGViewSpec.$transformString_Getter(this);
 
   @DomName('SVGViewSpec.viewBoxString')
   @DocsEditable()
-  String get viewBoxString => _blink.Native_SVGViewSpec_viewBoxString_Getter(this);
+  String get viewBoxString => _blink.BlinkSVGViewSpec.$viewBoxString_Getter(this);
 
   @DomName('SVGViewSpec.viewTarget')
   @DocsEditable()
-  SvgElement get viewTarget => _blink.Native_SVGViewSpec_viewTarget_Getter(this);
+  SvgElement get viewTarget => _blink.BlinkSVGViewSpec.$viewTarget_Getter(this);
 
   @DomName('SVGViewSpec.viewTargetString')
   @DocsEditable()
-  String get viewTargetString => _blink.Native_SVGViewSpec_viewTargetString_Getter(this);
+  String get viewTargetString => _blink.BlinkSVGViewSpec.$viewTargetString_Getter(this);
 
   @DomName('SVGViewSpec.preserveAspectRatio')
   @DocsEditable()
   @Experimental() // nonstandard
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGViewSpec_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGViewSpec.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGViewSpec.viewBox')
   @DocsEditable()
   @Experimental() // nonstandard
-  AnimatedRect get viewBox => _blink.Native_SVGViewSpec_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGViewSpec.$viewBox_Getter(this);
 
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get zoomAndPan => _blink.Native_SVGViewSpec_zoomAndPan_Getter(this);
+  int get zoomAndPan => _blink.BlinkSVGViewSpec.$zoomAndPan_Getter(this);
 
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable()
   @Experimental() // nonstandard
-  void set zoomAndPan(int value) => _blink.Native_SVGViewSpec_zoomAndPan_Setter(this, value);
+  void set zoomAndPan(int value) => _blink.BlinkSVGViewSpec.$zoomAndPan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7706,11 +7706,11 @@
 
   @DomName('SVGZoomAndPan.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan => _blink.Native_SVGZoomAndPan_zoomAndPan_Getter(this);
+  int get zoomAndPan => _blink.BlinkSVGZoomAndPan.$zoomAndPan_Getter(this);
 
   @DomName('SVGZoomAndPan.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) => _blink.Native_SVGZoomAndPan_zoomAndPan_Setter(this, value);
+  void set zoomAndPan(int value) => _blink.BlinkSVGZoomAndPan.$zoomAndPan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7729,23 +7729,23 @@
 
   @DomName('SVGZoomEvent.newScale')
   @DocsEditable()
-  double get newScale => _blink.Native_SVGZoomEvent_newScale_Getter(this);
+  double get newScale => _blink.BlinkSVGZoomEvent.$newScale_Getter(this);
 
   @DomName('SVGZoomEvent.newTranslate')
   @DocsEditable()
-  Point get newTranslate => _blink.Native_SVGZoomEvent_newTranslate_Getter(this);
+  Point get newTranslate => _blink.BlinkSVGZoomEvent.$newTranslate_Getter(this);
 
   @DomName('SVGZoomEvent.previousScale')
   @DocsEditable()
-  double get previousScale => _blink.Native_SVGZoomEvent_previousScale_Getter(this);
+  double get previousScale => _blink.BlinkSVGZoomEvent.$previousScale_Getter(this);
 
   @DomName('SVGZoomEvent.previousTranslate')
   @DocsEditable()
-  Point get previousTranslate => _blink.Native_SVGZoomEvent_previousTranslate_Getter(this);
+  Point get previousTranslate => _blink.BlinkSVGZoomEvent.$previousTranslate_Getter(this);
 
   @DomName('SVGZoomEvent.zoomRectScreen')
   @DocsEditable()
-  Rect get zoomRectScreen => _blink.Native_SVGZoomEvent_zoomRectScreen_Getter(this);
+  Rect get zoomRectScreen => _blink.BlinkSVGZoomEvent.$zoomRectScreen_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7764,15 +7764,15 @@
 
   @DomName('SVGElementInstanceList.length')
   @DocsEditable()
-  int get length => _blink.Native_SVGElementInstanceList_length_Getter(this);
+  int get length => _blink.BlinkSVGElementInstanceList.$length_Getter(this);
 
   ElementInstance operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_SVGElementInstanceList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkSVGElementInstanceList.$NativeIndexed_Getter(this, index);
   }
 
-  ElementInstance _nativeIndexedGetter(int index) => _blink.Native_SVGElementInstanceList_NativeIndexed_Getter(this, index);
+  ElementInstance _nativeIndexedGetter(int index) => _blink.BlinkSVGElementInstanceList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, ElementInstance value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -7814,7 +7814,7 @@
 
   @DomName('SVGElementInstanceList.item')
   @DocsEditable()
-  ElementInstance item(int index) => _blink.Native_SVGElementInstanceList_item_Callback(this, index);
+  ElementInstance item(int index) => _blink.BlinkSVGElementInstanceList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7855,19 +7855,19 @@
 
   @DomName('SVGGradientElement.gradientTransform')
   @DocsEditable()
-  AnimatedTransformList get gradientTransform => _blink.Native_SVGGradientElement_gradientTransform_Getter(this);
+  AnimatedTransformList get gradientTransform => _blink.BlinkSVGGradientElement.$gradientTransform_Getter(this);
 
   @DomName('SVGGradientElement.gradientUnits')
   @DocsEditable()
-  AnimatedEnumeration get gradientUnits => _blink.Native_SVGGradientElement_gradientUnits_Getter(this);
+  AnimatedEnumeration get gradientUnits => _blink.BlinkSVGGradientElement.$gradientUnits_Getter(this);
 
   @DomName('SVGGradientElement.spreadMethod')
   @DocsEditable()
-  AnimatedEnumeration get spreadMethod => _blink.Native_SVGGradientElement_spreadMethod_Getter(this);
+  AnimatedEnumeration get spreadMethod => _blink.BlinkSVGGradientElement.$spreadMethod_Getter(this);
 
   @DomName('SVGGradientElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGGradientElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGGradientElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart b/sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart
index efc4957..c9c0257 100644
--- a/sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart
+++ b/sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart
@@ -242,7 +242,7 @@
    * `byteOffset + 8` is greater than the length of this object.
    */
   int getInt64(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) {
-    throw new UnsupportedError("Int64 accessor not supported by dart2js.");
+    throw new UnsupportedError('Int64 accessor not supported by dart2js.');
   }
 
   /**
@@ -297,7 +297,7 @@
    * `byteOffset + 8` is greater than the length of this object.
    */
   int getUint64(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) {
-    throw new UnsupportedError("Uint64 accessor not supported by dart2js.");
+    throw new UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
 
   /**
@@ -392,7 +392,7 @@
    */
   void setInt64(int byteOffset, int value,
                 [Endianness endian=Endianness.BIG_ENDIAN]) {
-    throw new UnsupportedError("Int64 accessor not supported by dart2js.");
+    throw new UnsupportedError('Int64 accessor not supported by dart2js.');
   }
 
   /**
@@ -449,7 +449,7 @@
    */
   void setUint64(int byteOffset, int value,
                  [Endianness endian=Endianness.BIG_ENDIAN]) {
-    throw new UnsupportedError("Uint64 accessor not supported by dart2js.");
+    throw new UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
 
   /**
@@ -474,12 +474,9 @@
 }
 
 
-// TODO(sra): Move this type to a public name in a private library so that other
-// platform libraries like dart:html and dart:webaudio can tell a native array
-// from a list that implements the implicit interface.
 abstract class NativeTypedArray extends NativeTypedData
     implements JavaScriptIndexingBehavior {
-  int get length => JS("JSUInt32", '#.length', this);
+  int get length => JS('JSUInt32', '#.length', this);
 
   bool _setRangeFast(int start, int end,
       NativeTypedArray source, int skipCount) {
@@ -493,7 +490,7 @@
 
     int sourceLength = source.length;
     if (sourceLength - skipCount < count)  {
-      throw new StateError("Not enough elements");
+      throw new StateError('Not enough elements');
     }
 
     if (skipCount != 0 || sourceLength != count) {
@@ -505,12 +502,21 @@
   }
 }
 
-// TODO(sra): Move to private library, like [NativeTypedArray].
 abstract class NativeTypedArrayOfDouble
     extends NativeTypedArray
         with ListMixin<double>, FixedLengthListMixin<double>
     implements List<double> {
 
+  num operator[](int index) {
+    _checkIndex(index, length);
+    return JS('num', '#[#]', this, index);
+  }
+
+  void operator[]=(int index, num value) {
+    _checkIndex(index, length);
+    JS('void', '#[#] = #', this, index, value);
+  }
+
   void setRange(int start, int end, Iterable<double> iterable,
                 [int skipCount = 0]) {
     if (iterable is NativeTypedArrayOfDouble) {
@@ -521,12 +527,19 @@
   }
 }
 
-// TODO(sra): Move to private library, like [NativeTypedArray].
 abstract class NativeTypedArrayOfInt
     extends NativeTypedArray
         with ListMixin<int>, FixedLengthListMixin<int>
     implements List<int> {
 
+  // operator[]() is not here since different versions have different return
+  // types
+
+  void operator[]=(int index, int value) {
+    _checkIndex(index, length);
+    JS('void', '#[#] = #', this, index, value);
+  }
+
   void setRange(int start, int end, Iterable<int> iterable,
                 [int skipCount = 0]) {
     if (iterable is NativeTypedArrayOfInt) {
@@ -558,16 +571,6 @@
 
   Type get runtimeType => Float32List;
 
-  num operator[](int index) {
-    _checkIndex(index, length);
-    return JS("num", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, num value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
-  }
-
   List<double> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
     var source = JS('NativeFloat32List', '#.subarray(#, #)', this, start, end);
@@ -605,16 +608,6 @@
 
   Type get runtimeType => Float64List;
 
-  num operator[](int index) {
-    _checkIndex(index, length);
-    return JS("num", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, num value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
-  }
-
   List<double> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
     var source = JS('NativeFloat64List', '#.subarray(#, #)', this, start, end);
@@ -654,12 +647,7 @@
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("int", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('int', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
@@ -701,12 +689,7 @@
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("int", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('int', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
@@ -748,12 +731,7 @@
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("int", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('int', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
@@ -795,12 +773,7 @@
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("JSUInt31", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('JSUInt31', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
@@ -842,12 +815,7 @@
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("JSUInt32", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('JSUInt32', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
@@ -887,16 +855,11 @@
 
   Type get runtimeType => Uint8ClampedList;
 
-  int get length => JS("JSUInt32", '#.length', this);
+  int get length => JS('JSUInt32', '#.length', this);
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("JSUInt31", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('JSUInt31', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
@@ -942,16 +905,11 @@
 
   Type get runtimeType => Uint8List;
 
-  int get length => JS("JSUInt32", '#.length', this);
+  int get length => JS('JSUInt32', '#.length', this);
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("JSUInt31", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('JSUInt31', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 7719807..8cdf0ea 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -15,34 +15,34 @@
 
 
 // FIXME: Can we make this private?
-const web_audioBlinkMap = const {
-  'AnalyserNode': AnalyserNode,
-  'AudioBuffer': AudioBuffer,
-  'AudioBufferSourceNode': AudioBufferSourceNode,
-  'AudioContext': AudioContext,
-  'AudioDestinationNode': AudioDestinationNode,
-  'AudioListener': AudioListener,
-  'AudioNode': AudioNode,
-  'AudioParam': AudioParam,
-  'AudioProcessingEvent': AudioProcessingEvent,
-  'AudioSourceNode': AudioSourceNode,
-  'BiquadFilterNode': BiquadFilterNode,
-  'ChannelMergerNode': ChannelMergerNode,
-  'ChannelSplitterNode': ChannelSplitterNode,
-  'ConvolverNode': ConvolverNode,
-  'DelayNode': DelayNode,
-  'DynamicsCompressorNode': DynamicsCompressorNode,
-  'GainNode': GainNode,
-  'MediaElementAudioSourceNode': MediaElementAudioSourceNode,
-  'MediaStreamAudioDestinationNode': MediaStreamAudioDestinationNode,
-  'MediaStreamAudioSourceNode': MediaStreamAudioSourceNode,
-  'OfflineAudioCompletionEvent': OfflineAudioCompletionEvent,
-  'OfflineAudioContext': OfflineAudioContext,
-  'OscillatorNode': OscillatorNode,
-  'PannerNode': PannerNode,
-  'PeriodicWave': PeriodicWave,
-  'ScriptProcessorNode': ScriptProcessorNode,
-  'WaveShaperNode': WaveShaperNode,
+final web_audioBlinkMap = {
+  'AnalyserNode': () => AnalyserNode,
+  'AudioBuffer': () => AudioBuffer,
+  'AudioBufferSourceNode': () => AudioBufferSourceNode,
+  'AudioContext': () => AudioContext,
+  'AudioDestinationNode': () => AudioDestinationNode,
+  'AudioListener': () => AudioListener,
+  'AudioNode': () => AudioNode,
+  'AudioParam': () => AudioParam,
+  'AudioProcessingEvent': () => AudioProcessingEvent,
+  'AudioSourceNode': () => AudioSourceNode,
+  'BiquadFilterNode': () => BiquadFilterNode,
+  'ChannelMergerNode': () => ChannelMergerNode,
+  'ChannelSplitterNode': () => ChannelSplitterNode,
+  'ConvolverNode': () => ConvolverNode,
+  'DelayNode': () => DelayNode,
+  'DynamicsCompressorNode': () => DynamicsCompressorNode,
+  'GainNode': () => GainNode,
+  'MediaElementAudioSourceNode': () => MediaElementAudioSourceNode,
+  'MediaStreamAudioDestinationNode': () => MediaStreamAudioDestinationNode,
+  'MediaStreamAudioSourceNode': () => MediaStreamAudioSourceNode,
+  'OfflineAudioCompletionEvent': () => OfflineAudioCompletionEvent,
+  'OfflineAudioContext': () => OfflineAudioContext,
+  'OscillatorNode': () => OscillatorNode,
+  'PannerNode': () => PannerNode,
+  'PeriodicWave': () => PeriodicWave,
+  'ScriptProcessorNode': () => ScriptProcessorNode,
+  'WaveShaperNode': () => WaveShaperNode,
 
 };
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -62,51 +62,51 @@
 
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
-  int get fftSize => _blink.Native_AnalyserNode_fftSize_Getter(this);
+  int get fftSize => _blink.BlinkAnalyserNode.$fftSize_Getter(this);
 
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
-  void set fftSize(int value) => _blink.Native_AnalyserNode_fftSize_Setter(this, value);
+  void set fftSize(int value) => _blink.BlinkAnalyserNode.$fftSize_Setter(this, value);
 
   @DomName('AnalyserNode.frequencyBinCount')
   @DocsEditable()
-  int get frequencyBinCount => _blink.Native_AnalyserNode_frequencyBinCount_Getter(this);
+  int get frequencyBinCount => _blink.BlinkAnalyserNode.$frequencyBinCount_Getter(this);
 
   @DomName('AnalyserNode.maxDecibels')
   @DocsEditable()
-  num get maxDecibels => _blink.Native_AnalyserNode_maxDecibels_Getter(this);
+  num get maxDecibels => _blink.BlinkAnalyserNode.$maxDecibels_Getter(this);
 
   @DomName('AnalyserNode.maxDecibels')
   @DocsEditable()
-  void set maxDecibels(num value) => _blink.Native_AnalyserNode_maxDecibels_Setter(this, value);
+  void set maxDecibels(num value) => _blink.BlinkAnalyserNode.$maxDecibels_Setter(this, value);
 
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
-  num get minDecibels => _blink.Native_AnalyserNode_minDecibels_Getter(this);
+  num get minDecibels => _blink.BlinkAnalyserNode.$minDecibels_Getter(this);
 
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
-  void set minDecibels(num value) => _blink.Native_AnalyserNode_minDecibels_Setter(this, value);
+  void set minDecibels(num value) => _blink.BlinkAnalyserNode.$minDecibels_Setter(this, value);
 
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
-  num get smoothingTimeConstant => _blink.Native_AnalyserNode_smoothingTimeConstant_Getter(this);
+  num get smoothingTimeConstant => _blink.BlinkAnalyserNode.$smoothingTimeConstant_Getter(this);
 
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
-  void set smoothingTimeConstant(num value) => _blink.Native_AnalyserNode_smoothingTimeConstant_Setter(this, value);
+  void set smoothingTimeConstant(num value) => _blink.BlinkAnalyserNode.$smoothingTimeConstant_Setter(this, value);
 
   @DomName('AnalyserNode.getByteFrequencyData')
   @DocsEditable()
-  void getByteFrequencyData(Uint8List array) => _blink.Native_AnalyserNode_getByteFrequencyData_Callback(this, array);
+  void getByteFrequencyData(Uint8List array) => _blink.BlinkAnalyserNode.$getByteFrequencyData_Callback(this, array);
 
   @DomName('AnalyserNode.getByteTimeDomainData')
   @DocsEditable()
-  void getByteTimeDomainData(Uint8List array) => _blink.Native_AnalyserNode_getByteTimeDomainData_Callback(this, array);
+  void getByteTimeDomainData(Uint8List array) => _blink.BlinkAnalyserNode.$getByteTimeDomainData_Callback(this, array);
 
   @DomName('AnalyserNode.getFloatFrequencyData')
   @DocsEditable()
-  void getFloatFrequencyData(Float32List array) => _blink.Native_AnalyserNode_getFloatFrequencyData_Callback(this, array);
+  void getFloatFrequencyData(Float32List array) => _blink.BlinkAnalyserNode.$getFloatFrequencyData_Callback(this, array);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -126,23 +126,23 @@
 
   @DomName('AudioBuffer.duration')
   @DocsEditable()
-  double get duration => _blink.Native_AudioBuffer_duration_Getter(this);
+  double get duration => _blink.BlinkAudioBuffer.$duration_Getter(this);
 
   @DomName('AudioBuffer.length')
   @DocsEditable()
-  int get length => _blink.Native_AudioBuffer_length_Getter(this);
+  int get length => _blink.BlinkAudioBuffer.$length_Getter(this);
 
   @DomName('AudioBuffer.numberOfChannels')
   @DocsEditable()
-  int get numberOfChannels => _blink.Native_AudioBuffer_numberOfChannels_Getter(this);
+  int get numberOfChannels => _blink.BlinkAudioBuffer.$numberOfChannels_Getter(this);
 
   @DomName('AudioBuffer.sampleRate')
   @DocsEditable()
-  double get sampleRate => _blink.Native_AudioBuffer_sampleRate_Getter(this);
+  double get sampleRate => _blink.BlinkAudioBuffer.$sampleRate_Getter(this);
 
   @DomName('AudioBuffer.getChannelData')
   @DocsEditable()
-  Float32List getChannelData(int channelIndex) => _blink.Native_AudioBuffer_getChannelData_Callback(this, channelIndex);
+  Float32List getChannelData(int channelIndex) => _blink.BlinkAudioBuffer.$getChannelData_Callback(this, channelIndex);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -200,55 +200,55 @@
 
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
-  AudioBuffer get buffer => _blink.Native_AudioBufferSourceNode_buffer_Getter(this);
+  AudioBuffer get buffer => _blink.BlinkAudioBufferSourceNode.$buffer_Getter(this);
 
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
-  void set buffer(AudioBuffer value) => _blink.Native_AudioBufferSourceNode_buffer_Setter(this, value);
+  void set buffer(AudioBuffer value) => _blink.BlinkAudioBufferSourceNode.$buffer_Setter(this, value);
 
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
-  bool get loop => _blink.Native_AudioBufferSourceNode_loop_Getter(this);
+  bool get loop => _blink.BlinkAudioBufferSourceNode.$loop_Getter(this);
 
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
-  void set loop(bool value) => _blink.Native_AudioBufferSourceNode_loop_Setter(this, value);
+  void set loop(bool value) => _blink.BlinkAudioBufferSourceNode.$loop_Setter(this, value);
 
   @DomName('AudioBufferSourceNode.loopEnd')
   @DocsEditable()
-  num get loopEnd => _blink.Native_AudioBufferSourceNode_loopEnd_Getter(this);
+  num get loopEnd => _blink.BlinkAudioBufferSourceNode.$loopEnd_Getter(this);
 
   @DomName('AudioBufferSourceNode.loopEnd')
   @DocsEditable()
-  void set loopEnd(num value) => _blink.Native_AudioBufferSourceNode_loopEnd_Setter(this, value);
+  void set loopEnd(num value) => _blink.BlinkAudioBufferSourceNode.$loopEnd_Setter(this, value);
 
   @DomName('AudioBufferSourceNode.loopStart')
   @DocsEditable()
-  num get loopStart => _blink.Native_AudioBufferSourceNode_loopStart_Getter(this);
+  num get loopStart => _blink.BlinkAudioBufferSourceNode.$loopStart_Getter(this);
 
   @DomName('AudioBufferSourceNode.loopStart')
   @DocsEditable()
-  void set loopStart(num value) => _blink.Native_AudioBufferSourceNode_loopStart_Setter(this, value);
+  void set loopStart(num value) => _blink.BlinkAudioBufferSourceNode.$loopStart_Setter(this, value);
 
   @DomName('AudioBufferSourceNode.playbackRate')
   @DocsEditable()
-  AudioParam get playbackRate => _blink.Native_AudioBufferSourceNode_playbackRate_Getter(this);
+  AudioParam get playbackRate => _blink.BlinkAudioBufferSourceNode.$playbackRate_Getter(this);
 
   @DomName('AudioBufferSourceNode.noteGrainOn')
   @DocsEditable()
-  void noteGrainOn(num when, num grainOffset, num grainDuration) => _blink.Native_AudioBufferSourceNode_noteGrainOn_Callback(this, when, grainOffset, grainDuration);
+  void noteGrainOn(num when, num grainOffset, num grainDuration) => _blink.BlinkAudioBufferSourceNode.$noteGrainOn_Callback(this, when, grainOffset, grainDuration);
 
   @DomName('AudioBufferSourceNode.noteOff')
   @DocsEditable()
-  void noteOff(num when) => _blink.Native_AudioBufferSourceNode_noteOff_Callback(this, when);
+  void noteOff(num when) => _blink.BlinkAudioBufferSourceNode.$noteOff_Callback(this, when);
 
   @DomName('AudioBufferSourceNode.noteOn')
   @DocsEditable()
-  void noteOn(num when) => _blink.Native_AudioBufferSourceNode_noteOn_Callback(this, when);
+  void noteOn(num when) => _blink.BlinkAudioBufferSourceNode.$noteOn_Callback(this, when);
 
-  void start([num when, num grainOffset, num grainDuration]) => _blink.Native_AudioBufferSourceNode_start(this, when, grainOffset, grainDuration);
+  void start([num when, num grainOffset, num grainDuration]) => _blink.BlinkAudioBufferSourceNode.$start(this, when, grainOffset, grainDuration);
 
-  void stop([num when]) => _blink.Native_AudioBufferSourceNode_stop(this, when);
+  void stop([num when]) => _blink.BlinkAudioBufferSourceNode.$stop(this, when);
 
   /// Stream of `ended` events handled by this [AudioBufferSourceNode].
   @DomName('AudioBufferSourceNode.onended')
@@ -281,99 +281,99 @@
 
   @DomName('AudioContext.AudioContext')
   @DocsEditable()
-  factory AudioContext() => _blink.Native_AudioContext_AudioContext();
+  factory AudioContext() => _blink.BlinkAudioContext.$mkAudioContext();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('AudioContext.currentTime')
   @DocsEditable()
-  double get currentTime => _blink.Native_AudioContext_currentTime_Getter(this);
+  double get currentTime => _blink.BlinkAudioContext.$currentTime_Getter(this);
 
   @DomName('AudioContext.destination')
   @DocsEditable()
-  AudioDestinationNode get destination => _blink.Native_AudioContext_destination_Getter(this);
+  AudioDestinationNode get destination => _blink.BlinkAudioContext.$destination_Getter(this);
 
   @DomName('AudioContext.listener')
   @DocsEditable()
-  AudioListener get listener => _blink.Native_AudioContext_listener_Getter(this);
+  AudioListener get listener => _blink.BlinkAudioContext.$listener_Getter(this);
 
   @DomName('AudioContext.sampleRate')
   @DocsEditable()
-  double get sampleRate => _blink.Native_AudioContext_sampleRate_Getter(this);
+  double get sampleRate => _blink.BlinkAudioContext.$sampleRate_Getter(this);
 
   @DomName('AudioContext.createAnalyser')
   @DocsEditable()
-  AnalyserNode createAnalyser() => _blink.Native_AudioContext_createAnalyser_Callback(this);
+  AnalyserNode createAnalyser() => _blink.BlinkAudioContext.$createAnalyser_Callback(this);
 
   @DomName('AudioContext.createBiquadFilter')
   @DocsEditable()
-  BiquadFilterNode createBiquadFilter() => _blink.Native_AudioContext_createBiquadFilter_Callback(this);
+  BiquadFilterNode createBiquadFilter() => _blink.BlinkAudioContext.$createBiquadFilter_Callback(this);
 
   @DomName('AudioContext.createBuffer')
   @DocsEditable()
-  AudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.Native_AudioContext_createBuffer_Callback(this, numberOfChannels, numberOfFrames, sampleRate);
+  AudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.BlinkAudioContext.$createBuffer_Callback(this, numberOfChannels, numberOfFrames, sampleRate);
 
   @DomName('AudioContext.createBufferSource')
   @DocsEditable()
-  AudioBufferSourceNode createBufferSource() => _blink.Native_AudioContext_createBufferSource_Callback(this);
+  AudioBufferSourceNode createBufferSource() => _blink.BlinkAudioContext.$createBufferSource_Callback(this);
 
-  ChannelMergerNode createChannelMerger([int numberOfInputs]) => _blink.Native_AudioContext_createChannelMerger(this, numberOfInputs);
+  ChannelMergerNode createChannelMerger([int numberOfInputs]) => _blink.BlinkAudioContext.$createChannelMerger(this, numberOfInputs);
 
-  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) => _blink.Native_AudioContext_createChannelSplitter(this, numberOfOutputs);
+  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) => _blink.BlinkAudioContext.$createChannelSplitter(this, numberOfOutputs);
 
   @DomName('AudioContext.createConvolver')
   @DocsEditable()
-  ConvolverNode createConvolver() => _blink.Native_AudioContext_createConvolver_Callback(this);
+  ConvolverNode createConvolver() => _blink.BlinkAudioContext.$createConvolver_Callback(this);
 
-  DelayNode createDelay([num maxDelayTime]) => _blink.Native_AudioContext_createDelay(this, maxDelayTime);
+  DelayNode createDelay([num maxDelayTime]) => _blink.BlinkAudioContext.$createDelay(this, maxDelayTime);
 
   @DomName('AudioContext.createDynamicsCompressor')
   @DocsEditable()
-  DynamicsCompressorNode createDynamicsCompressor() => _blink.Native_AudioContext_createDynamicsCompressor_Callback(this);
+  DynamicsCompressorNode createDynamicsCompressor() => _blink.BlinkAudioContext.$createDynamicsCompressor_Callback(this);
 
   @DomName('AudioContext.createGain')
   @DocsEditable()
-  GainNode createGain() => _blink.Native_AudioContext_createGain_Callback(this);
+  GainNode createGain() => _blink.BlinkAudioContext.$createGain_Callback(this);
 
   @DomName('AudioContext.createMediaElementSource')
   @DocsEditable()
-  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) => _blink.Native_AudioContext_createMediaElementSource_Callback(this, mediaElement);
+  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) => _blink.BlinkAudioContext.$createMediaElementSource_Callback(this, mediaElement);
 
   @DomName('AudioContext.createMediaStreamDestination')
   @DocsEditable()
-  MediaStreamAudioDestinationNode createMediaStreamDestination() => _blink.Native_AudioContext_createMediaStreamDestination_Callback(this);
+  MediaStreamAudioDestinationNode createMediaStreamDestination() => _blink.BlinkAudioContext.$createMediaStreamDestination_Callback(this);
 
   @DomName('AudioContext.createMediaStreamSource')
   @DocsEditable()
-  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) => _blink.Native_AudioContext_createMediaStreamSource_Callback(this, mediaStream);
+  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) => _blink.BlinkAudioContext.$createMediaStreamSource_Callback(this, mediaStream);
 
   @DomName('AudioContext.createOscillator')
   @DocsEditable()
-  OscillatorNode createOscillator() => _blink.Native_AudioContext_createOscillator_Callback(this);
+  OscillatorNode createOscillator() => _blink.BlinkAudioContext.$createOscillator_Callback(this);
 
   @DomName('AudioContext.createPanner')
   @DocsEditable()
-  PannerNode createPanner() => _blink.Native_AudioContext_createPanner_Callback(this);
+  PannerNode createPanner() => _blink.BlinkAudioContext.$createPanner_Callback(this);
 
   @DomName('AudioContext.createPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => _blink.Native_AudioContext_createPeriodicWave_Callback(this, real, imag);
+  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => _blink.BlinkAudioContext.$createPeriodicWave_Callback(this, real, imag);
 
-  ScriptProcessorNode createScriptProcessor([int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) => _blink.Native_AudioContext_createScriptProcessor(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
+  ScriptProcessorNode createScriptProcessor([int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) => _blink.BlinkAudioContext.$createScriptProcessor(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
 
   @DomName('AudioContext.createWaveShaper')
   @DocsEditable()
-  WaveShaperNode createWaveShaper() => _blink.Native_AudioContext_createWaveShaper_Callback(this);
+  WaveShaperNode createWaveShaper() => _blink.BlinkAudioContext.$createWaveShaper_Callback(this);
 
   @DomName('AudioContext.decodeAudioData')
   @DocsEditable()
-  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) => _blink.Native_AudioContext_decodeAudioData_Callback(this, audioData, successCallback, errorCallback);
+  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) => _blink.BlinkAudioContext.$decodeAudioData_Callback(this, audioData, successCallback, errorCallback);
 
   @DomName('AudioContext.startRendering')
   @DocsEditable()
-  void startRendering() => _blink.Native_AudioContext_startRendering_Callback(this);
+  void startRendering() => _blink.BlinkAudioContext.$startRendering_Callback(this);
 
   /// Stream of `complete` events handled by this [AudioContext].
   @DomName('AudioContext.oncomplete')
@@ -412,7 +412,7 @@
 
   @DomName('AudioDestinationNode.maxChannelCount')
   @DocsEditable()
-  int get maxChannelCount => _blink.Native_AudioDestinationNode_maxChannelCount_Getter(this);
+  int get maxChannelCount => _blink.BlinkAudioDestinationNode.$maxChannelCount_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -432,31 +432,31 @@
 
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
-  num get dopplerFactor => _blink.Native_AudioListener_dopplerFactor_Getter(this);
+  num get dopplerFactor => _blink.BlinkAudioListener.$dopplerFactor_Getter(this);
 
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
-  void set dopplerFactor(num value) => _blink.Native_AudioListener_dopplerFactor_Setter(this, value);
+  void set dopplerFactor(num value) => _blink.BlinkAudioListener.$dopplerFactor_Setter(this, value);
 
   @DomName('AudioListener.speedOfSound')
   @DocsEditable()
-  num get speedOfSound => _blink.Native_AudioListener_speedOfSound_Getter(this);
+  num get speedOfSound => _blink.BlinkAudioListener.$speedOfSound_Getter(this);
 
   @DomName('AudioListener.speedOfSound')
   @DocsEditable()
-  void set speedOfSound(num value) => _blink.Native_AudioListener_speedOfSound_Setter(this, value);
+  void set speedOfSound(num value) => _blink.BlinkAudioListener.$speedOfSound_Setter(this, value);
 
   @DomName('AudioListener.setOrientation')
   @DocsEditable()
-  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) => _blink.Native_AudioListener_setOrientation_Callback(this, x, y, z, xUp, yUp, zUp);
+  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) => _blink.BlinkAudioListener.$setOrientation_Callback(this, x, y, z, xUp, yUp, zUp);
 
   @DomName('AudioListener.setPosition')
   @DocsEditable()
-  void setPosition(num x, num y, num z) => _blink.Native_AudioListener_setPosition_Callback(this, x, y, z);
+  void setPosition(num x, num y, num z) => _blink.BlinkAudioListener.$setPosition_Callback(this, x, y, z);
 
   @DomName('AudioListener.setVelocity')
   @DocsEditable()
-  void setVelocity(num x, num y, num z) => _blink.Native_AudioListener_setVelocity_Callback(this, x, y, z);
+  void setVelocity(num x, num y, num z) => _blink.BlinkAudioListener.$setVelocity_Callback(this, x, y, z);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -473,45 +473,45 @@
 
   @DomName('AudioNode.channelCount')
   @DocsEditable()
-  int get channelCount => _blink.Native_AudioNode_channelCount_Getter(this);
+  int get channelCount => _blink.BlinkAudioNode.$channelCount_Getter(this);
 
   @DomName('AudioNode.channelCount')
   @DocsEditable()
-  void set channelCount(int value) => _blink.Native_AudioNode_channelCount_Setter(this, value);
+  void set channelCount(int value) => _blink.BlinkAudioNode.$channelCount_Setter(this, value);
 
   @DomName('AudioNode.channelCountMode')
   @DocsEditable()
-  String get channelCountMode => _blink.Native_AudioNode_channelCountMode_Getter(this);
+  String get channelCountMode => _blink.BlinkAudioNode.$channelCountMode_Getter(this);
 
   @DomName('AudioNode.channelCountMode')
   @DocsEditable()
-  void set channelCountMode(String value) => _blink.Native_AudioNode_channelCountMode_Setter(this, value);
+  void set channelCountMode(String value) => _blink.BlinkAudioNode.$channelCountMode_Setter(this, value);
 
   @DomName('AudioNode.channelInterpretation')
   @DocsEditable()
-  String get channelInterpretation => _blink.Native_AudioNode_channelInterpretation_Getter(this);
+  String get channelInterpretation => _blink.BlinkAudioNode.$channelInterpretation_Getter(this);
 
   @DomName('AudioNode.channelInterpretation')
   @DocsEditable()
-  void set channelInterpretation(String value) => _blink.Native_AudioNode_channelInterpretation_Setter(this, value);
+  void set channelInterpretation(String value) => _blink.BlinkAudioNode.$channelInterpretation_Setter(this, value);
 
   @DomName('AudioNode.context')
   @DocsEditable()
-  AudioContext get context => _blink.Native_AudioNode_context_Getter(this);
+  AudioContext get context => _blink.BlinkAudioNode.$context_Getter(this);
 
   @DomName('AudioNode.numberOfInputs')
   @DocsEditable()
-  int get numberOfInputs => _blink.Native_AudioNode_numberOfInputs_Getter(this);
+  int get numberOfInputs => _blink.BlinkAudioNode.$numberOfInputs_Getter(this);
 
   @DomName('AudioNode.numberOfOutputs')
   @DocsEditable()
-  int get numberOfOutputs => _blink.Native_AudioNode_numberOfOutputs_Getter(this);
+  int get numberOfOutputs => _blink.BlinkAudioNode.$numberOfOutputs_Getter(this);
 
-  void _connect(destination, int output, [int input]) => _blink.Native_AudioNode__connect(this, destination, output, input);
+  void _connect(destination, int output, [int input]) => _blink.BlinkAudioNode.$_connect(this, destination, output, input);
 
   @DomName('AudioNode.disconnect')
   @DocsEditable()
-  void disconnect(int output) => _blink.Native_AudioNode_disconnect_Callback(this, output);
+  void disconnect(int output) => _blink.BlinkAudioNode.$disconnect_Callback(this, output);
 
   @DomName('AudioNode.connect')
   void connectNode(AudioNode destination, [int output = 0, int input = 0]) =>
@@ -538,55 +538,55 @@
 
   @DomName('AudioParam.defaultValue')
   @DocsEditable()
-  double get defaultValue => _blink.Native_AudioParam_defaultValue_Getter(this);
+  double get defaultValue => _blink.BlinkAudioParam.$defaultValue_Getter(this);
 
   @DomName('AudioParam.maxValue')
   @DocsEditable()
-  double get maxValue => _blink.Native_AudioParam_maxValue_Getter(this);
+  double get maxValue => _blink.BlinkAudioParam.$maxValue_Getter(this);
 
   @DomName('AudioParam.minValue')
   @DocsEditable()
-  double get minValue => _blink.Native_AudioParam_minValue_Getter(this);
+  double get minValue => _blink.BlinkAudioParam.$minValue_Getter(this);
 
   @DomName('AudioParam.name')
   @DocsEditable()
-  String get name => _blink.Native_AudioParam_name_Getter(this);
+  String get name => _blink.BlinkAudioParam.$name_Getter(this);
 
   @DomName('AudioParam.units')
   @DocsEditable()
-  int get units => _blink.Native_AudioParam_units_Getter(this);
+  int get units => _blink.BlinkAudioParam.$units_Getter(this);
 
   @DomName('AudioParam.value')
   @DocsEditable()
-  num get value => _blink.Native_AudioParam_value_Getter(this);
+  num get value => _blink.BlinkAudioParam.$value_Getter(this);
 
   @DomName('AudioParam.value')
   @DocsEditable()
-  void set value(num value) => _blink.Native_AudioParam_value_Setter(this, value);
+  void set value(num value) => _blink.BlinkAudioParam.$value_Setter(this, value);
 
   @DomName('AudioParam.cancelScheduledValues')
   @DocsEditable()
-  void cancelScheduledValues(num startTime) => _blink.Native_AudioParam_cancelScheduledValues_Callback(this, startTime);
+  void cancelScheduledValues(num startTime) => _blink.BlinkAudioParam.$cancelScheduledValues_Callback(this, startTime);
 
   @DomName('AudioParam.exponentialRampToValueAtTime')
   @DocsEditable()
-  void exponentialRampToValueAtTime(num value, num time) => _blink.Native_AudioParam_exponentialRampToValueAtTime_Callback(this, value, time);
+  void exponentialRampToValueAtTime(num value, num time) => _blink.BlinkAudioParam.$exponentialRampToValueAtTime_Callback(this, value, time);
 
   @DomName('AudioParam.linearRampToValueAtTime')
   @DocsEditable()
-  void linearRampToValueAtTime(num value, num time) => _blink.Native_AudioParam_linearRampToValueAtTime_Callback(this, value, time);
+  void linearRampToValueAtTime(num value, num time) => _blink.BlinkAudioParam.$linearRampToValueAtTime_Callback(this, value, time);
 
   @DomName('AudioParam.setTargetAtTime')
   @DocsEditable()
-  void setTargetAtTime(num target, num time, num timeConstant) => _blink.Native_AudioParam_setTargetAtTime_Callback(this, target, time, timeConstant);
+  void setTargetAtTime(num target, num time, num timeConstant) => _blink.BlinkAudioParam.$setTargetAtTime_Callback(this, target, time, timeConstant);
 
   @DomName('AudioParam.setValueAtTime')
   @DocsEditable()
-  void setValueAtTime(num value, num time) => _blink.Native_AudioParam_setValueAtTime_Callback(this, value, time);
+  void setValueAtTime(num value, num time) => _blink.BlinkAudioParam.$setValueAtTime_Callback(this, value, time);
 
   @DomName('AudioParam.setValueCurveAtTime')
   @DocsEditable()
-  void setValueCurveAtTime(Float32List values, num time, num duration) => _blink.Native_AudioParam_setValueCurveAtTime_Callback(this, values, time, duration);
+  void setValueCurveAtTime(Float32List values, num time, num duration) => _blink.BlinkAudioParam.$setValueCurveAtTime_Callback(this, values, time, duration);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -606,11 +606,11 @@
 
   @DomName('AudioProcessingEvent.inputBuffer')
   @DocsEditable()
-  AudioBuffer get inputBuffer => _blink.Native_AudioProcessingEvent_inputBuffer_Getter(this);
+  AudioBuffer get inputBuffer => _blink.BlinkAudioProcessingEvent.$inputBuffer_Getter(this);
 
   @DomName('AudioProcessingEvent.outputBuffer')
   @DocsEditable()
-  AudioBuffer get outputBuffer => _blink.Native_AudioProcessingEvent_outputBuffer_Getter(this);
+  AudioBuffer get outputBuffer => _blink.BlinkAudioProcessingEvent.$outputBuffer_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -678,31 +678,31 @@
 
   @DomName('BiquadFilterNode.Q')
   @DocsEditable()
-  AudioParam get Q => _blink.Native_BiquadFilterNode_Q_Getter(this);
+  AudioParam get Q => _blink.BlinkBiquadFilterNode.$Q_Getter(this);
 
   @DomName('BiquadFilterNode.detune')
   @DocsEditable()
-  AudioParam get detune => _blink.Native_BiquadFilterNode_detune_Getter(this);
+  AudioParam get detune => _blink.BlinkBiquadFilterNode.$detune_Getter(this);
 
   @DomName('BiquadFilterNode.frequency')
   @DocsEditable()
-  AudioParam get frequency => _blink.Native_BiquadFilterNode_frequency_Getter(this);
+  AudioParam get frequency => _blink.BlinkBiquadFilterNode.$frequency_Getter(this);
 
   @DomName('BiquadFilterNode.gain')
   @DocsEditable()
-  AudioParam get gain => _blink.Native_BiquadFilterNode_gain_Getter(this);
+  AudioParam get gain => _blink.BlinkBiquadFilterNode.$gain_Getter(this);
 
   @DomName('BiquadFilterNode.type')
   @DocsEditable()
-  String get type => _blink.Native_BiquadFilterNode_type_Getter(this);
+  String get type => _blink.BlinkBiquadFilterNode.$type_Getter(this);
 
   @DomName('BiquadFilterNode.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_BiquadFilterNode_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkBiquadFilterNode.$type_Setter(this, value);
 
   @DomName('BiquadFilterNode.getFrequencyResponse')
   @DocsEditable()
-  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) => _blink.Native_BiquadFilterNode_getFrequencyResponse_Callback(this, frequencyHz, magResponse, phaseResponse);
+  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) => _blink.BlinkBiquadFilterNode.$getFrequencyResponse_Callback(this, frequencyHz, magResponse, phaseResponse);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -754,19 +754,19 @@
 
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
-  AudioBuffer get buffer => _blink.Native_ConvolverNode_buffer_Getter(this);
+  AudioBuffer get buffer => _blink.BlinkConvolverNode.$buffer_Getter(this);
 
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
-  void set buffer(AudioBuffer value) => _blink.Native_ConvolverNode_buffer_Setter(this, value);
+  void set buffer(AudioBuffer value) => _blink.BlinkConvolverNode.$buffer_Setter(this, value);
 
   @DomName('ConvolverNode.normalize')
   @DocsEditable()
-  bool get normalize => _blink.Native_ConvolverNode_normalize_Getter(this);
+  bool get normalize => _blink.BlinkConvolverNode.$normalize_Getter(this);
 
   @DomName('ConvolverNode.normalize')
   @DocsEditable()
-  void set normalize(bool value) => _blink.Native_ConvolverNode_normalize_Setter(this, value);
+  void set normalize(bool value) => _blink.BlinkConvolverNode.$normalize_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -786,7 +786,7 @@
 
   @DomName('DelayNode.delayTime')
   @DocsEditable()
-  AudioParam get delayTime => _blink.Native_DelayNode_delayTime_Getter(this);
+  AudioParam get delayTime => _blink.BlinkDelayNode.$delayTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -806,27 +806,27 @@
 
   @DomName('DynamicsCompressorNode.attack')
   @DocsEditable()
-  AudioParam get attack => _blink.Native_DynamicsCompressorNode_attack_Getter(this);
+  AudioParam get attack => _blink.BlinkDynamicsCompressorNode.$attack_Getter(this);
 
   @DomName('DynamicsCompressorNode.knee')
   @DocsEditable()
-  AudioParam get knee => _blink.Native_DynamicsCompressorNode_knee_Getter(this);
+  AudioParam get knee => _blink.BlinkDynamicsCompressorNode.$knee_Getter(this);
 
   @DomName('DynamicsCompressorNode.ratio')
   @DocsEditable()
-  AudioParam get ratio => _blink.Native_DynamicsCompressorNode_ratio_Getter(this);
+  AudioParam get ratio => _blink.BlinkDynamicsCompressorNode.$ratio_Getter(this);
 
   @DomName('DynamicsCompressorNode.reduction')
   @DocsEditable()
-  AudioParam get reduction => _blink.Native_DynamicsCompressorNode_reduction_Getter(this);
+  AudioParam get reduction => _blink.BlinkDynamicsCompressorNode.$reduction_Getter(this);
 
   @DomName('DynamicsCompressorNode.release')
   @DocsEditable()
-  AudioParam get release => _blink.Native_DynamicsCompressorNode_release_Getter(this);
+  AudioParam get release => _blink.BlinkDynamicsCompressorNode.$release_Getter(this);
 
   @DomName('DynamicsCompressorNode.threshold')
   @DocsEditable()
-  AudioParam get threshold => _blink.Native_DynamicsCompressorNode_threshold_Getter(this);
+  AudioParam get threshold => _blink.BlinkDynamicsCompressorNode.$threshold_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -846,7 +846,7 @@
 
   @DomName('GainNode.gain')
   @DocsEditable()
-  AudioParam get gain => _blink.Native_GainNode_gain_Getter(this);
+  AudioParam get gain => _blink.BlinkGainNode.$gain_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -867,7 +867,7 @@
   @DomName('MediaElementAudioSourceNode.mediaElement')
   @DocsEditable()
   @Experimental() // non-standard
-  MediaElement get mediaElement => _blink.Native_MediaElementAudioSourceNode_mediaElement_Getter(this);
+  MediaElement get mediaElement => _blink.BlinkMediaElementAudioSourceNode.$mediaElement_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -887,7 +887,7 @@
 
   @DomName('MediaStreamAudioDestinationNode.stream')
   @DocsEditable()
-  MediaStream get stream => _blink.Native_MediaStreamAudioDestinationNode_stream_Getter(this);
+  MediaStream get stream => _blink.BlinkMediaStreamAudioDestinationNode.$stream_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -907,7 +907,7 @@
 
   @DomName('MediaStreamAudioSourceNode.mediaStream')
   @DocsEditable()
-  MediaStream get mediaStream => _blink.Native_MediaStreamAudioSourceNode_mediaStream_Getter(this);
+  MediaStream get mediaStream => _blink.BlinkMediaStreamAudioSourceNode.$mediaStream_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -927,7 +927,7 @@
 
   @DomName('OfflineAudioCompletionEvent.renderedBuffer')
   @DocsEditable()
-  AudioBuffer get renderedBuffer => _blink.Native_OfflineAudioCompletionEvent_renderedBuffer_Getter(this);
+  AudioBuffer get renderedBuffer => _blink.BlinkOfflineAudioCompletionEvent.$renderedBuffer_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -947,7 +947,7 @@
 
   @DomName('OfflineAudioContext.OfflineAudioContext')
   @DocsEditable()
-  factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.Native_OfflineAudioContext_OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate);
+  factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.BlinkOfflineAudioContext.$mkOfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -994,36 +994,36 @@
 
   @DomName('OscillatorNode.detune')
   @DocsEditable()
-  AudioParam get detune => _blink.Native_OscillatorNode_detune_Getter(this);
+  AudioParam get detune => _blink.BlinkOscillatorNode.$detune_Getter(this);
 
   @DomName('OscillatorNode.frequency')
   @DocsEditable()
-  AudioParam get frequency => _blink.Native_OscillatorNode_frequency_Getter(this);
+  AudioParam get frequency => _blink.BlinkOscillatorNode.$frequency_Getter(this);
 
   @DomName('OscillatorNode.type')
   @DocsEditable()
-  String get type => _blink.Native_OscillatorNode_type_Getter(this);
+  String get type => _blink.BlinkOscillatorNode.$type_Getter(this);
 
   @DomName('OscillatorNode.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_OscillatorNode_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkOscillatorNode.$type_Setter(this, value);
 
   @DomName('OscillatorNode.noteOff')
   @DocsEditable()
-  void noteOff(num when) => _blink.Native_OscillatorNode_noteOff_Callback(this, when);
+  void noteOff(num when) => _blink.BlinkOscillatorNode.$noteOff_Callback(this, when);
 
   @DomName('OscillatorNode.noteOn')
   @DocsEditable()
-  void noteOn(num when) => _blink.Native_OscillatorNode_noteOn_Callback(this, when);
+  void noteOn(num when) => _blink.BlinkOscillatorNode.$noteOn_Callback(this, when);
 
   @DomName('OscillatorNode.setPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  void setPeriodicWave(PeriodicWave periodicWave) => _blink.Native_OscillatorNode_setPeriodicWave_Callback(this, periodicWave);
+  void setPeriodicWave(PeriodicWave periodicWave) => _blink.BlinkOscillatorNode.$setPeriodicWave_Callback(this, periodicWave);
 
-  void start([num when]) => _blink.Native_OscillatorNode_start(this, when);
+  void start([num when]) => _blink.BlinkOscillatorNode.$start(this, when);
 
-  void stop([num when]) => _blink.Native_OscillatorNode_stop(this, when);
+  void stop([num when]) => _blink.BlinkOscillatorNode.$stop(this, when);
 
   /// Stream of `ended` events handled by this [OscillatorNode].
   @DomName('OscillatorNode.onended')
@@ -1049,79 +1049,79 @@
 
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
-  num get coneInnerAngle => _blink.Native_PannerNode_coneInnerAngle_Getter(this);
+  num get coneInnerAngle => _blink.BlinkPannerNode.$coneInnerAngle_Getter(this);
 
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
-  void set coneInnerAngle(num value) => _blink.Native_PannerNode_coneInnerAngle_Setter(this, value);
+  void set coneInnerAngle(num value) => _blink.BlinkPannerNode.$coneInnerAngle_Setter(this, value);
 
   @DomName('PannerNode.coneOuterAngle')
   @DocsEditable()
-  num get coneOuterAngle => _blink.Native_PannerNode_coneOuterAngle_Getter(this);
+  num get coneOuterAngle => _blink.BlinkPannerNode.$coneOuterAngle_Getter(this);
 
   @DomName('PannerNode.coneOuterAngle')
   @DocsEditable()
-  void set coneOuterAngle(num value) => _blink.Native_PannerNode_coneOuterAngle_Setter(this, value);
+  void set coneOuterAngle(num value) => _blink.BlinkPannerNode.$coneOuterAngle_Setter(this, value);
 
   @DomName('PannerNode.coneOuterGain')
   @DocsEditable()
-  num get coneOuterGain => _blink.Native_PannerNode_coneOuterGain_Getter(this);
+  num get coneOuterGain => _blink.BlinkPannerNode.$coneOuterGain_Getter(this);
 
   @DomName('PannerNode.coneOuterGain')
   @DocsEditable()
-  void set coneOuterGain(num value) => _blink.Native_PannerNode_coneOuterGain_Setter(this, value);
+  void set coneOuterGain(num value) => _blink.BlinkPannerNode.$coneOuterGain_Setter(this, value);
 
   @DomName('PannerNode.distanceModel')
   @DocsEditable()
-  String get distanceModel => _blink.Native_PannerNode_distanceModel_Getter(this);
+  String get distanceModel => _blink.BlinkPannerNode.$distanceModel_Getter(this);
 
   @DomName('PannerNode.distanceModel')
   @DocsEditable()
-  void set distanceModel(String value) => _blink.Native_PannerNode_distanceModel_Setter(this, value);
+  void set distanceModel(String value) => _blink.BlinkPannerNode.$distanceModel_Setter(this, value);
 
   @DomName('PannerNode.maxDistance')
   @DocsEditable()
-  num get maxDistance => _blink.Native_PannerNode_maxDistance_Getter(this);
+  num get maxDistance => _blink.BlinkPannerNode.$maxDistance_Getter(this);
 
   @DomName('PannerNode.maxDistance')
   @DocsEditable()
-  void set maxDistance(num value) => _blink.Native_PannerNode_maxDistance_Setter(this, value);
+  void set maxDistance(num value) => _blink.BlinkPannerNode.$maxDistance_Setter(this, value);
 
   @DomName('PannerNode.panningModel')
   @DocsEditable()
-  String get panningModel => _blink.Native_PannerNode_panningModel_Getter(this);
+  String get panningModel => _blink.BlinkPannerNode.$panningModel_Getter(this);
 
   @DomName('PannerNode.panningModel')
   @DocsEditable()
-  void set panningModel(String value) => _blink.Native_PannerNode_panningModel_Setter(this, value);
+  void set panningModel(String value) => _blink.BlinkPannerNode.$panningModel_Setter(this, value);
 
   @DomName('PannerNode.refDistance')
   @DocsEditable()
-  num get refDistance => _blink.Native_PannerNode_refDistance_Getter(this);
+  num get refDistance => _blink.BlinkPannerNode.$refDistance_Getter(this);
 
   @DomName('PannerNode.refDistance')
   @DocsEditable()
-  void set refDistance(num value) => _blink.Native_PannerNode_refDistance_Setter(this, value);
+  void set refDistance(num value) => _blink.BlinkPannerNode.$refDistance_Setter(this, value);
 
   @DomName('PannerNode.rolloffFactor')
   @DocsEditable()
-  num get rolloffFactor => _blink.Native_PannerNode_rolloffFactor_Getter(this);
+  num get rolloffFactor => _blink.BlinkPannerNode.$rolloffFactor_Getter(this);
 
   @DomName('PannerNode.rolloffFactor')
   @DocsEditable()
-  void set rolloffFactor(num value) => _blink.Native_PannerNode_rolloffFactor_Setter(this, value);
+  void set rolloffFactor(num value) => _blink.BlinkPannerNode.$rolloffFactor_Setter(this, value);
 
   @DomName('PannerNode.setOrientation')
   @DocsEditable()
-  void setOrientation(num x, num y, num z) => _blink.Native_PannerNode_setOrientation_Callback(this, x, y, z);
+  void setOrientation(num x, num y, num z) => _blink.BlinkPannerNode.$setOrientation_Callback(this, x, y, z);
 
   @DomName('PannerNode.setPosition')
   @DocsEditable()
-  void setPosition(num x, num y, num z) => _blink.Native_PannerNode_setPosition_Callback(this, x, y, z);
+  void setPosition(num x, num y, num z) => _blink.BlinkPannerNode.$setPosition_Callback(this, x, y, z);
 
   @DomName('PannerNode.setVelocity')
   @DocsEditable()
-  void setVelocity(num x, num y, num z) => _blink.Native_PannerNode_setVelocity_Callback(this, x, y, z);
+  void setVelocity(num x, num y, num z) => _blink.BlinkPannerNode.$setVelocity_Callback(this, x, y, z);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1167,12 +1167,12 @@
 
   @DomName('ScriptProcessorNode.bufferSize')
   @DocsEditable()
-  int get bufferSize => _blink.Native_ScriptProcessorNode_bufferSize_Getter(this);
+  int get bufferSize => _blink.BlinkScriptProcessorNode.$bufferSize_Getter(this);
 
   @DomName('ScriptProcessorNode._setEventListener')
   @DocsEditable()
   @Experimental() // non-standard
-  void _setEventListener(EventListener eventListener) => _blink.Native_ScriptProcessorNode__setEventListener_Callback(this, eventListener);
+  void _setEventListener(EventListener eventListener) => _blink.BlinkScriptProcessorNode.$_setEventListener_Callback(this, eventListener);
 
   /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
 /**
@@ -1205,18 +1205,18 @@
 
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  Float32List get curve => _blink.Native_WaveShaperNode_curve_Getter(this);
+  Float32List get curve => _blink.BlinkWaveShaperNode.$curve_Getter(this);
 
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  void set curve(Float32List value) => _blink.Native_WaveShaperNode_curve_Setter(this, value);
+  void set curve(Float32List value) => _blink.BlinkWaveShaperNode.$curve_Setter(this, value);
 
   @DomName('WaveShaperNode.oversample')
   @DocsEditable()
-  String get oversample => _blink.Native_WaveShaperNode_oversample_Getter(this);
+  String get oversample => _blink.BlinkWaveShaperNode.$oversample_Getter(this);
 
   @DomName('WaveShaperNode.oversample')
   @DocsEditable()
-  void set oversample(String value) => _blink.Native_WaveShaperNode_oversample_Setter(this, value);
+  void set oversample(String value) => _blink.BlinkWaveShaperNode.$oversample_Setter(this, value);
 
 }
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index 2c2de6c..f1ed131 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -16,38 +16,38 @@
 
 
 // FIXME: Can we make this private?
-const web_glBlinkMap = const {
-  'ANGLEInstancedArrays': AngleInstancedArrays,
-  'EXTFragDepth': ExtFragDepth,
-  'EXTTextureFilterAnisotropic': ExtTextureFilterAnisotropic,
-  'OESElementIndexUint': OesElementIndexUint,
-  'OESStandardDerivatives': OesStandardDerivatives,
-  'OESTextureFloat': OesTextureFloat,
-  'OESTextureFloatLinear': OesTextureFloatLinear,
-  'OESTextureHalfFloat': OesTextureHalfFloat,
-  'OESTextureHalfFloatLinear': OesTextureHalfFloatLinear,
-  'OESVertexArrayObject': OesVertexArrayObject,
-  'WebGLActiveInfo': ActiveInfo,
-  'WebGLBuffer': Buffer,
-  'WebGLCompressedTextureATC': CompressedTextureAtc,
-  'WebGLCompressedTexturePVRTC': CompressedTexturePvrtc,
-  'WebGLCompressedTextureS3TC': CompressedTextureS3TC,
-  'WebGLContextAttributes': ContextAttributes,
-  'WebGLContextEvent': ContextEvent,
-  'WebGLDebugRendererInfo': DebugRendererInfo,
-  'WebGLDebugShaders': DebugShaders,
-  'WebGLDepthTexture': DepthTexture,
-  'WebGLDrawBuffers': DrawBuffers,
-  'WebGLFramebuffer': Framebuffer,
-  'WebGLLoseContext': LoseContext,
-  'WebGLProgram': Program,
-  'WebGLRenderbuffer': Renderbuffer,
-  'WebGLRenderingContext': RenderingContext,
-  'WebGLShader': Shader,
-  'WebGLShaderPrecisionFormat': ShaderPrecisionFormat,
-  'WebGLTexture': Texture,
-  'WebGLUniformLocation': UniformLocation,
-  'WebGLVertexArrayObjectOES': VertexArrayObject,
+final web_glBlinkMap = {
+  'ANGLEInstancedArrays': () => AngleInstancedArrays,
+  'EXTFragDepth': () => ExtFragDepth,
+  'EXTTextureFilterAnisotropic': () => ExtTextureFilterAnisotropic,
+  'OESElementIndexUint': () => OesElementIndexUint,
+  'OESStandardDerivatives': () => OesStandardDerivatives,
+  'OESTextureFloat': () => OesTextureFloat,
+  'OESTextureFloatLinear': () => OesTextureFloatLinear,
+  'OESTextureHalfFloat': () => OesTextureHalfFloat,
+  'OESTextureHalfFloatLinear': () => OesTextureHalfFloatLinear,
+  'OESVertexArrayObject': () => OesVertexArrayObject,
+  'WebGLActiveInfo': () => ActiveInfo,
+  'WebGLBuffer': () => Buffer,
+  'WebGLCompressedTextureATC': () => CompressedTextureAtc,
+  'WebGLCompressedTexturePVRTC': () => CompressedTexturePvrtc,
+  'WebGLCompressedTextureS3TC': () => CompressedTextureS3TC,
+  'WebGLContextAttributes': () => ContextAttributes,
+  'WebGLContextEvent': () => ContextEvent,
+  'WebGLDebugRendererInfo': () => DebugRendererInfo,
+  'WebGLDebugShaders': () => DebugShaders,
+  'WebGLDepthTexture': () => DepthTexture,
+  'WebGLDrawBuffers': () => DrawBuffers,
+  'WebGLFramebuffer': () => Framebuffer,
+  'WebGLLoseContext': () => LoseContext,
+  'WebGLProgram': () => Program,
+  'WebGLRenderbuffer': () => Renderbuffer,
+  'WebGLRenderingContext': () => RenderingContext,
+  'WebGLShader': () => Shader,
+  'WebGLShaderPrecisionFormat': () => ShaderPrecisionFormat,
+  'WebGLTexture': () => Texture,
+  'WebGLUniformLocation': () => UniformLocation,
+  'WebGLVertexArrayObjectOES': () => VertexArrayObject,
 
 };
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -367,15 +367,15 @@
 
   @DomName('WebGLActiveInfo.name')
   @DocsEditable()
-  String get name => _blink.Native_WebGLActiveInfo_name_Getter(this);
+  String get name => _blink.BlinkWebGLActiveInfo.$name_Getter(this);
 
   @DomName('WebGLActiveInfo.size')
   @DocsEditable()
-  int get size => _blink.Native_WebGLActiveInfo_size_Getter(this);
+  int get size => _blink.BlinkWebGLActiveInfo.$size_Getter(this);
 
   @DomName('WebGLActiveInfo.type')
   @DocsEditable()
-  int get type => _blink.Native_WebGLActiveInfo_type_Getter(this);
+  int get type => _blink.BlinkWebGLActiveInfo.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -400,17 +400,17 @@
   @DomName('ANGLEInstancedArrays.drawArraysInstancedANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawArraysInstancedAngle(int mode, int first, int count, int primcount) => _blink.Native_ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback(this, mode, first, count, primcount);
+  void drawArraysInstancedAngle(int mode, int first, int count, int primcount) => _blink.BlinkANGLEInstancedArrays.$drawArraysInstancedANGLE_Callback(this, mode, first, count, primcount);
 
   @DomName('ANGLEInstancedArrays.drawElementsInstancedANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawElementsInstancedAngle(int mode, int count, int type, int offset, int primcount) => _blink.Native_ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback(this, mode, count, type, offset, primcount);
+  void drawElementsInstancedAngle(int mode, int count, int type, int offset, int primcount) => _blink.BlinkANGLEInstancedArrays.$drawElementsInstancedANGLE_Callback(this, mode, count, type, offset, primcount);
 
   @DomName('ANGLEInstancedArrays.vertexAttribDivisorANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribDivisorAngle(int index, int divisor) => _blink.Native_ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback(this, index, divisor);
+  void vertexAttribDivisorAngle(int index, int divisor) => _blink.BlinkANGLEInstancedArrays.$vertexAttribDivisorANGLE_Callback(this, index, divisor);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -558,61 +558,61 @@
 
   @DomName('WebGLContextAttributes.alpha')
   @DocsEditable()
-  bool get alpha => _blink.Native_WebGLContextAttributes_alpha_Getter(this);
+  bool get alpha => _blink.BlinkWebGLContextAttributes.$alpha_Getter(this);
 
   @DomName('WebGLContextAttributes.alpha')
   @DocsEditable()
-  void set alpha(bool value) => _blink.Native_WebGLContextAttributes_alpha_Setter(this, value);
+  void set alpha(bool value) => _blink.BlinkWebGLContextAttributes.$alpha_Setter(this, value);
 
   @DomName('WebGLContextAttributes.antialias')
   @DocsEditable()
-  bool get antialias => _blink.Native_WebGLContextAttributes_antialias_Getter(this);
+  bool get antialias => _blink.BlinkWebGLContextAttributes.$antialias_Getter(this);
 
   @DomName('WebGLContextAttributes.antialias')
   @DocsEditable()
-  void set antialias(bool value) => _blink.Native_WebGLContextAttributes_antialias_Setter(this, value);
+  void set antialias(bool value) => _blink.BlinkWebGLContextAttributes.$antialias_Setter(this, value);
 
   @DomName('WebGLContextAttributes.depth')
   @DocsEditable()
-  bool get depth => _blink.Native_WebGLContextAttributes_depth_Getter(this);
+  bool get depth => _blink.BlinkWebGLContextAttributes.$depth_Getter(this);
 
   @DomName('WebGLContextAttributes.depth')
   @DocsEditable()
-  void set depth(bool value) => _blink.Native_WebGLContextAttributes_depth_Setter(this, value);
+  void set depth(bool value) => _blink.BlinkWebGLContextAttributes.$depth_Setter(this, value);
 
   @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get failIfMajorPerformanceCaveat => _blink.Native_WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter(this);
+  bool get failIfMajorPerformanceCaveat => _blink.BlinkWebGLContextAttributes.$failIfMajorPerformanceCaveat_Getter(this);
 
   @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
   @DocsEditable()
   @Experimental() // untriaged
-  void set failIfMajorPerformanceCaveat(bool value) => _blink.Native_WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter(this, value);
+  void set failIfMajorPerformanceCaveat(bool value) => _blink.BlinkWebGLContextAttributes.$failIfMajorPerformanceCaveat_Setter(this, value);
 
   @DomName('WebGLContextAttributes.premultipliedAlpha')
   @DocsEditable()
-  bool get premultipliedAlpha => _blink.Native_WebGLContextAttributes_premultipliedAlpha_Getter(this);
+  bool get premultipliedAlpha => _blink.BlinkWebGLContextAttributes.$premultipliedAlpha_Getter(this);
 
   @DomName('WebGLContextAttributes.premultipliedAlpha')
   @DocsEditable()
-  void set premultipliedAlpha(bool value) => _blink.Native_WebGLContextAttributes_premultipliedAlpha_Setter(this, value);
+  void set premultipliedAlpha(bool value) => _blink.BlinkWebGLContextAttributes.$premultipliedAlpha_Setter(this, value);
 
   @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   @DocsEditable()
-  bool get preserveDrawingBuffer => _blink.Native_WebGLContextAttributes_preserveDrawingBuffer_Getter(this);
+  bool get preserveDrawingBuffer => _blink.BlinkWebGLContextAttributes.$preserveDrawingBuffer_Getter(this);
 
   @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   @DocsEditable()
-  void set preserveDrawingBuffer(bool value) => _blink.Native_WebGLContextAttributes_preserveDrawingBuffer_Setter(this, value);
+  void set preserveDrawingBuffer(bool value) => _blink.BlinkWebGLContextAttributes.$preserveDrawingBuffer_Setter(this, value);
 
   @DomName('WebGLContextAttributes.stencil')
   @DocsEditable()
-  bool get stencil => _blink.Native_WebGLContextAttributes_stencil_Getter(this);
+  bool get stencil => _blink.BlinkWebGLContextAttributes.$stencil_Getter(this);
 
   @DomName('WebGLContextAttributes.stencil')
   @DocsEditable()
-  void set stencil(bool value) => _blink.Native_WebGLContextAttributes_stencil_Setter(this, value);
+  void set stencil(bool value) => _blink.BlinkWebGLContextAttributes.$stencil_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -631,7 +631,7 @@
 
   @DomName('WebGLContextEvent.statusMessage')
   @DocsEditable()
-  String get statusMessage => _blink.Native_WebGLContextEvent_statusMessage_Getter(this);
+  String get statusMessage => _blink.BlinkWebGLContextEvent.$statusMessage_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -675,7 +675,7 @@
 
   @DomName('WebGLDebugShaders.getTranslatedShaderSource')
   @DocsEditable()
-  String getTranslatedShaderSource(Shader shader) => _blink.Native_WebGLDebugShaders_getTranslatedShaderSource_Callback(this, shader);
+  String getTranslatedShaderSource(Shader shader) => _blink.BlinkWebGLDebugShaders.$getTranslatedShaderSource_Callback(this, shader);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -851,7 +851,7 @@
 
   @DomName('WebGLDrawBuffers.drawBuffersWEBGL')
   @DocsEditable()
-  void drawBuffersWebgl(List<int> buffers) => _blink.Native_WebGLDrawBuffers_drawBuffersWEBGL_Callback(this, buffers);
+  void drawBuffersWebgl(List<int> buffers) => _blink.BlinkWebGLDrawBuffers.$drawBuffersWEBGL_Callback(this, buffers);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -926,11 +926,11 @@
 
   @DomName('WebGLLoseContext.loseContext')
   @DocsEditable()
-  void loseContext() => _blink.Native_WebGLLoseContext_loseContext_Callback(this);
+  void loseContext() => _blink.BlinkWebGLLoseContext.$loseContext_Callback(this);
 
   @DomName('WebGLLoseContext.restoreContext')
   @DocsEditable()
-  void restoreContext() => _blink.Native_WebGLLoseContext_restoreContext_Callback(this);
+  void restoreContext() => _blink.BlinkWebGLLoseContext.$restoreContext_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1058,19 +1058,19 @@
 
   @DomName('OESVertexArrayObject.bindVertexArrayOES')
   @DocsEditable()
-  void bindVertexArray(VertexArrayObject arrayObject) => _blink.Native_OESVertexArrayObject_bindVertexArrayOES_Callback(this, arrayObject);
+  void bindVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.$bindVertexArrayOES_Callback(this, arrayObject);
 
   @DomName('OESVertexArrayObject.createVertexArrayOES')
   @DocsEditable()
-  VertexArrayObject createVertexArray() => _blink.Native_OESVertexArrayObject_createVertexArrayOES_Callback(this);
+  VertexArrayObject createVertexArray() => _blink.BlinkOESVertexArrayObject.$createVertexArrayOES_Callback(this);
 
   @DomName('OESVertexArrayObject.deleteVertexArrayOES')
   @DocsEditable()
-  void deleteVertexArray(VertexArrayObject arrayObject) => _blink.Native_OESVertexArrayObject_deleteVertexArrayOES_Callback(this, arrayObject);
+  void deleteVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.$deleteVertexArrayOES_Callback(this, arrayObject);
 
   @DomName('OESVertexArrayObject.isVertexArrayOES')
   @DocsEditable()
-  bool isVertexArray(VertexArrayObject arrayObject) => _blink.Native_OESVertexArrayObject_isVertexArrayOES_Callback(this, arrayObject);
+  bool isVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.$isVertexArrayOES_Callback(this, arrayObject);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2302,595 +2302,595 @@
 
   @DomName('WebGLRenderingContext.drawingBufferHeight')
   @DocsEditable()
-  int get drawingBufferHeight => _blink.Native_WebGLRenderingContext_drawingBufferHeight_Getter(this);
+  int get drawingBufferHeight => _blink.BlinkWebGLRenderingContext.$drawingBufferHeight_Getter(this);
 
   @DomName('WebGLRenderingContext.drawingBufferWidth')
   @DocsEditable()
-  int get drawingBufferWidth => _blink.Native_WebGLRenderingContext_drawingBufferWidth_Getter(this);
+  int get drawingBufferWidth => _blink.BlinkWebGLRenderingContext.$drawingBufferWidth_Getter(this);
 
   @DomName('WebGLRenderingContext.activeTexture')
   @DocsEditable()
-  void activeTexture(int texture) => _blink.Native_WebGLRenderingContext_activeTexture_Callback(this, texture);
+  void activeTexture(int texture) => _blink.BlinkWebGLRenderingContext.$activeTexture_Callback(this, texture);
 
   @DomName('WebGLRenderingContext.attachShader')
   @DocsEditable()
-  void attachShader(Program program, Shader shader) => _blink.Native_WebGLRenderingContext_attachShader_Callback(this, program, shader);
+  void attachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContext.$attachShader_Callback(this, program, shader);
 
   @DomName('WebGLRenderingContext.bindAttribLocation')
   @DocsEditable()
-  void bindAttribLocation(Program program, int index, String name) => _blink.Native_WebGLRenderingContext_bindAttribLocation_Callback(this, program, index, name);
+  void bindAttribLocation(Program program, int index, String name) => _blink.BlinkWebGLRenderingContext.$bindAttribLocation_Callback(this, program, index, name);
 
   @DomName('WebGLRenderingContext.bindBuffer')
   @DocsEditable()
-  void bindBuffer(int target, Buffer buffer) => _blink.Native_WebGLRenderingContext_bindBuffer_Callback(this, target, buffer);
+  void bindBuffer(int target, Buffer buffer) => _blink.BlinkWebGLRenderingContext.$bindBuffer_Callback(this, target, buffer);
 
   @DomName('WebGLRenderingContext.bindFramebuffer')
   @DocsEditable()
-  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.Native_WebGLRenderingContext_bindFramebuffer_Callback(this, target, framebuffer);
+  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.$bindFramebuffer_Callback(this, target, framebuffer);
 
   @DomName('WebGLRenderingContext.bindRenderbuffer')
   @DocsEditable()
-  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.Native_WebGLRenderingContext_bindRenderbuffer_Callback(this, target, renderbuffer);
+  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.$bindRenderbuffer_Callback(this, target, renderbuffer);
 
   @DomName('WebGLRenderingContext.bindTexture')
   @DocsEditable()
-  void bindTexture(int target, Texture texture) => _blink.Native_WebGLRenderingContext_bindTexture_Callback(this, target, texture);
+  void bindTexture(int target, Texture texture) => _blink.BlinkWebGLRenderingContext.$bindTexture_Callback(this, target, texture);
 
   @DomName('WebGLRenderingContext.blendColor')
   @DocsEditable()
-  void blendColor(num red, num green, num blue, num alpha) => _blink.Native_WebGLRenderingContext_blendColor_Callback(this, red, green, blue, alpha);
+  void blendColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContext.$blendColor_Callback(this, red, green, blue, alpha);
 
   @DomName('WebGLRenderingContext.blendEquation')
   @DocsEditable()
-  void blendEquation(int mode) => _blink.Native_WebGLRenderingContext_blendEquation_Callback(this, mode);
+  void blendEquation(int mode) => _blink.BlinkWebGLRenderingContext.$blendEquation_Callback(this, mode);
 
   @DomName('WebGLRenderingContext.blendEquationSeparate')
   @DocsEditable()
-  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.Native_WebGLRenderingContext_blendEquationSeparate_Callback(this, modeRGB, modeAlpha);
+  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.BlinkWebGLRenderingContext.$blendEquationSeparate_Callback(this, modeRGB, modeAlpha);
 
   @DomName('WebGLRenderingContext.blendFunc')
   @DocsEditable()
-  void blendFunc(int sfactor, int dfactor) => _blink.Native_WebGLRenderingContext_blendFunc_Callback(this, sfactor, dfactor);
+  void blendFunc(int sfactor, int dfactor) => _blink.BlinkWebGLRenderingContext.$blendFunc_Callback(this, sfactor, dfactor);
 
   @DomName('WebGLRenderingContext.blendFuncSeparate')
   @DocsEditable()
-  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.Native_WebGLRenderingContext_blendFuncSeparate_Callback(this, srcRGB, dstRGB, srcAlpha, dstAlpha);
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.BlinkWebGLRenderingContext.$blendFuncSeparate_Callback(this, srcRGB, dstRGB, srcAlpha, dstAlpha);
 
   @DomName('WebGLRenderingContext.bufferByteData')
   @DocsEditable()
-  void bufferByteData(int target, ByteBuffer data, int usage) => _blink.Native_WebGLRenderingContext_bufferByteData_Callback(this, target, data, usage);
+  void bufferByteData(int target, ByteBuffer data, int usage) => _blink.BlinkWebGLRenderingContext.$bufferByteData_Callback(this, target, data, usage);
 
-  void bufferData(int target, data_OR_size, int usage) => _blink.Native_WebGLRenderingContext_bufferData(this, target, data_OR_size, usage);
+  void bufferData(int target, data_OR_size, int usage) => _blink.BlinkWebGLRenderingContext.$bufferData(this, target, data_OR_size, usage);
 
   @DomName('WebGLRenderingContext.bufferDataTyped')
   @DocsEditable()
-  void bufferDataTyped(int target, TypedData data, int usage) => _blink.Native_WebGLRenderingContext_bufferDataTyped_Callback(this, target, data, usage);
+  void bufferDataTyped(int target, TypedData data, int usage) => _blink.BlinkWebGLRenderingContext.$bufferDataTyped_Callback(this, target, data, usage);
 
   @DomName('WebGLRenderingContext.bufferSubByteData')
   @DocsEditable()
-  void bufferSubByteData(int target, int offset, ByteBuffer data) => _blink.Native_WebGLRenderingContext_bufferSubByteData_Callback(this, target, offset, data);
+  void bufferSubByteData(int target, int offset, ByteBuffer data) => _blink.BlinkWebGLRenderingContext.$bufferSubByteData_Callback(this, target, offset, data);
 
-  void bufferSubData(int target, int offset, data) => _blink.Native_WebGLRenderingContext_bufferSubData(this, target, offset, data);
+  void bufferSubData(int target, int offset, data) => _blink.BlinkWebGLRenderingContext.$bufferSubData(this, target, offset, data);
 
   @DomName('WebGLRenderingContext.bufferSubDataTyped')
   @DocsEditable()
-  void bufferSubDataTyped(int target, int offset, TypedData data) => _blink.Native_WebGLRenderingContext_bufferSubDataTyped_Callback(this, target, offset, data);
+  void bufferSubDataTyped(int target, int offset, TypedData data) => _blink.BlinkWebGLRenderingContext.$bufferSubDataTyped_Callback(this, target, offset, data);
 
   @DomName('WebGLRenderingContext.checkFramebufferStatus')
   @DocsEditable()
-  int checkFramebufferStatus(int target) => _blink.Native_WebGLRenderingContext_checkFramebufferStatus_Callback(this, target);
+  int checkFramebufferStatus(int target) => _blink.BlinkWebGLRenderingContext.$checkFramebufferStatus_Callback(this, target);
 
   @DomName('WebGLRenderingContext.clear')
   @DocsEditable()
-  void clear(int mask) => _blink.Native_WebGLRenderingContext_clear_Callback(this, mask);
+  void clear(int mask) => _blink.BlinkWebGLRenderingContext.$clear_Callback(this, mask);
 
   @DomName('WebGLRenderingContext.clearColor')
   @DocsEditable()
-  void clearColor(num red, num green, num blue, num alpha) => _blink.Native_WebGLRenderingContext_clearColor_Callback(this, red, green, blue, alpha);
+  void clearColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContext.$clearColor_Callback(this, red, green, blue, alpha);
 
   @DomName('WebGLRenderingContext.clearDepth')
   @DocsEditable()
-  void clearDepth(num depth) => _blink.Native_WebGLRenderingContext_clearDepth_Callback(this, depth);
+  void clearDepth(num depth) => _blink.BlinkWebGLRenderingContext.$clearDepth_Callback(this, depth);
 
   @DomName('WebGLRenderingContext.clearStencil')
   @DocsEditable()
-  void clearStencil(int s) => _blink.Native_WebGLRenderingContext_clearStencil_Callback(this, s);
+  void clearStencil(int s) => _blink.BlinkWebGLRenderingContext.$clearStencil_Callback(this, s);
 
   @DomName('WebGLRenderingContext.colorMask')
   @DocsEditable()
-  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.Native_WebGLRenderingContext_colorMask_Callback(this, red, green, blue, alpha);
+  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.BlinkWebGLRenderingContext.$colorMask_Callback(this, red, green, blue, alpha);
 
   @DomName('WebGLRenderingContext.compileShader')
   @DocsEditable()
-  void compileShader(Shader shader) => _blink.Native_WebGLRenderingContext_compileShader_Callback(this, shader);
+  void compileShader(Shader shader) => _blink.BlinkWebGLRenderingContext.$compileShader_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.compressedTexImage2D')
   @DocsEditable()
-  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.Native_WebGLRenderingContext_compressedTexImage2D_Callback(this, target, level, internalformat, width, height, border, data);
+  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.BlinkWebGLRenderingContext.$compressedTexImage2D_Callback(this, target, level, internalformat, width, height, border, data);
 
   @DomName('WebGLRenderingContext.compressedTexSubImage2D')
   @DocsEditable()
-  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.Native_WebGLRenderingContext_compressedTexSubImage2D_Callback(this, target, level, xoffset, yoffset, width, height, format, data);
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.BlinkWebGLRenderingContext.$compressedTexSubImage2D_Callback(this, target, level, xoffset, yoffset, width, height, format, data);
 
   @DomName('WebGLRenderingContext.copyTexImage2D')
   @DocsEditable()
-  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.Native_WebGLRenderingContext_copyTexImage2D_Callback(this, target, level, internalformat, x, y, width, height, border);
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.BlinkWebGLRenderingContext.$copyTexImage2D_Callback(this, target, level, internalformat, x, y, width, height, border);
 
   @DomName('WebGLRenderingContext.copyTexSubImage2D')
   @DocsEditable()
-  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.Native_WebGLRenderingContext_copyTexSubImage2D_Callback(this, target, level, xoffset, yoffset, x, y, width, height);
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.$copyTexSubImage2D_Callback(this, target, level, xoffset, yoffset, x, y, width, height);
 
   @DomName('WebGLRenderingContext.createBuffer')
   @DocsEditable()
-  Buffer createBuffer() => _blink.Native_WebGLRenderingContext_createBuffer_Callback(this);
+  Buffer createBuffer() => _blink.BlinkWebGLRenderingContext.$createBuffer_Callback(this);
 
   @DomName('WebGLRenderingContext.createFramebuffer')
   @DocsEditable()
-  Framebuffer createFramebuffer() => _blink.Native_WebGLRenderingContext_createFramebuffer_Callback(this);
+  Framebuffer createFramebuffer() => _blink.BlinkWebGLRenderingContext.$createFramebuffer_Callback(this);
 
   @DomName('WebGLRenderingContext.createProgram')
   @DocsEditable()
-  Program createProgram() => _blink.Native_WebGLRenderingContext_createProgram_Callback(this);
+  Program createProgram() => _blink.BlinkWebGLRenderingContext.$createProgram_Callback(this);
 
   @DomName('WebGLRenderingContext.createRenderbuffer')
   @DocsEditable()
-  Renderbuffer createRenderbuffer() => _blink.Native_WebGLRenderingContext_createRenderbuffer_Callback(this);
+  Renderbuffer createRenderbuffer() => _blink.BlinkWebGLRenderingContext.$createRenderbuffer_Callback(this);
 
   @DomName('WebGLRenderingContext.createShader')
   @DocsEditable()
-  Shader createShader(int type) => _blink.Native_WebGLRenderingContext_createShader_Callback(this, type);
+  Shader createShader(int type) => _blink.BlinkWebGLRenderingContext.$createShader_Callback(this, type);
 
   @DomName('WebGLRenderingContext.createTexture')
   @DocsEditable()
-  Texture createTexture() => _blink.Native_WebGLRenderingContext_createTexture_Callback(this);
+  Texture createTexture() => _blink.BlinkWebGLRenderingContext.$createTexture_Callback(this);
 
   @DomName('WebGLRenderingContext.cullFace')
   @DocsEditable()
-  void cullFace(int mode) => _blink.Native_WebGLRenderingContext_cullFace_Callback(this, mode);
+  void cullFace(int mode) => _blink.BlinkWebGLRenderingContext.$cullFace_Callback(this, mode);
 
   @DomName('WebGLRenderingContext.deleteBuffer')
   @DocsEditable()
-  void deleteBuffer(Buffer buffer) => _blink.Native_WebGLRenderingContext_deleteBuffer_Callback(this, buffer);
+  void deleteBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContext.$deleteBuffer_Callback(this, buffer);
 
   @DomName('WebGLRenderingContext.deleteFramebuffer')
   @DocsEditable()
-  void deleteFramebuffer(Framebuffer framebuffer) => _blink.Native_WebGLRenderingContext_deleteFramebuffer_Callback(this, framebuffer);
+  void deleteFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.$deleteFramebuffer_Callback(this, framebuffer);
 
   @DomName('WebGLRenderingContext.deleteProgram')
   @DocsEditable()
-  void deleteProgram(Program program) => _blink.Native_WebGLRenderingContext_deleteProgram_Callback(this, program);
+  void deleteProgram(Program program) => _blink.BlinkWebGLRenderingContext.$deleteProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.deleteRenderbuffer')
   @DocsEditable()
-  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.Native_WebGLRenderingContext_deleteRenderbuffer_Callback(this, renderbuffer);
+  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.$deleteRenderbuffer_Callback(this, renderbuffer);
 
   @DomName('WebGLRenderingContext.deleteShader')
   @DocsEditable()
-  void deleteShader(Shader shader) => _blink.Native_WebGLRenderingContext_deleteShader_Callback(this, shader);
+  void deleteShader(Shader shader) => _blink.BlinkWebGLRenderingContext.$deleteShader_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.deleteTexture')
   @DocsEditable()
-  void deleteTexture(Texture texture) => _blink.Native_WebGLRenderingContext_deleteTexture_Callback(this, texture);
+  void deleteTexture(Texture texture) => _blink.BlinkWebGLRenderingContext.$deleteTexture_Callback(this, texture);
 
   @DomName('WebGLRenderingContext.depthFunc')
   @DocsEditable()
-  void depthFunc(int func) => _blink.Native_WebGLRenderingContext_depthFunc_Callback(this, func);
+  void depthFunc(int func) => _blink.BlinkWebGLRenderingContext.$depthFunc_Callback(this, func);
 
   @DomName('WebGLRenderingContext.depthMask')
   @DocsEditable()
-  void depthMask(bool flag) => _blink.Native_WebGLRenderingContext_depthMask_Callback(this, flag);
+  void depthMask(bool flag) => _blink.BlinkWebGLRenderingContext.$depthMask_Callback(this, flag);
 
   @DomName('WebGLRenderingContext.depthRange')
   @DocsEditable()
-  void depthRange(num zNear, num zFar) => _blink.Native_WebGLRenderingContext_depthRange_Callback(this, zNear, zFar);
+  void depthRange(num zNear, num zFar) => _blink.BlinkWebGLRenderingContext.$depthRange_Callback(this, zNear, zFar);
 
   @DomName('WebGLRenderingContext.detachShader')
   @DocsEditable()
-  void detachShader(Program program, Shader shader) => _blink.Native_WebGLRenderingContext_detachShader_Callback(this, program, shader);
+  void detachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContext.$detachShader_Callback(this, program, shader);
 
   @DomName('WebGLRenderingContext.disable')
   @DocsEditable()
-  void disable(int cap) => _blink.Native_WebGLRenderingContext_disable_Callback(this, cap);
+  void disable(int cap) => _blink.BlinkWebGLRenderingContext.$disable_Callback(this, cap);
 
   @DomName('WebGLRenderingContext.disableVertexAttribArray')
   @DocsEditable()
-  void disableVertexAttribArray(int index) => _blink.Native_WebGLRenderingContext_disableVertexAttribArray_Callback(this, index);
+  void disableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContext.$disableVertexAttribArray_Callback(this, index);
 
   @DomName('WebGLRenderingContext.drawArrays')
   @DocsEditable()
-  void drawArrays(int mode, int first, int count) => _blink.Native_WebGLRenderingContext_drawArrays_Callback(this, mode, first, count);
+  void drawArrays(int mode, int first, int count) => _blink.BlinkWebGLRenderingContext.$drawArrays_Callback(this, mode, first, count);
 
   @DomName('WebGLRenderingContext.drawElements')
   @DocsEditable()
-  void drawElements(int mode, int count, int type, int offset) => _blink.Native_WebGLRenderingContext_drawElements_Callback(this, mode, count, type, offset);
+  void drawElements(int mode, int count, int type, int offset) => _blink.BlinkWebGLRenderingContext.$drawElements_Callback(this, mode, count, type, offset);
 
   @DomName('WebGLRenderingContext.enable')
   @DocsEditable()
-  void enable(int cap) => _blink.Native_WebGLRenderingContext_enable_Callback(this, cap);
+  void enable(int cap) => _blink.BlinkWebGLRenderingContext.$enable_Callback(this, cap);
 
   @DomName('WebGLRenderingContext.enableVertexAttribArray')
   @DocsEditable()
-  void enableVertexAttribArray(int index) => _blink.Native_WebGLRenderingContext_enableVertexAttribArray_Callback(this, index);
+  void enableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContext.$enableVertexAttribArray_Callback(this, index);
 
   @DomName('WebGLRenderingContext.finish')
   @DocsEditable()
-  void finish() => _blink.Native_WebGLRenderingContext_finish_Callback(this);
+  void finish() => _blink.BlinkWebGLRenderingContext.$finish_Callback(this);
 
   @DomName('WebGLRenderingContext.flush')
   @DocsEditable()
-  void flush() => _blink.Native_WebGLRenderingContext_flush_Callback(this);
+  void flush() => _blink.BlinkWebGLRenderingContext.$flush_Callback(this);
 
   @DomName('WebGLRenderingContext.framebufferRenderbuffer')
   @DocsEditable()
-  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.Native_WebGLRenderingContext_framebufferRenderbuffer_Callback(this, target, attachment, renderbuffertarget, renderbuffer);
+  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.$framebufferRenderbuffer_Callback(this, target, attachment, renderbuffertarget, renderbuffer);
 
   @DomName('WebGLRenderingContext.framebufferTexture2D')
   @DocsEditable()
-  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.Native_WebGLRenderingContext_framebufferTexture2D_Callback(this, target, attachment, textarget, texture, level);
+  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.BlinkWebGLRenderingContext.$framebufferTexture2D_Callback(this, target, attachment, textarget, texture, level);
 
   @DomName('WebGLRenderingContext.frontFace')
   @DocsEditable()
-  void frontFace(int mode) => _blink.Native_WebGLRenderingContext_frontFace_Callback(this, mode);
+  void frontFace(int mode) => _blink.BlinkWebGLRenderingContext.$frontFace_Callback(this, mode);
 
   @DomName('WebGLRenderingContext.generateMipmap')
   @DocsEditable()
-  void generateMipmap(int target) => _blink.Native_WebGLRenderingContext_generateMipmap_Callback(this, target);
+  void generateMipmap(int target) => _blink.BlinkWebGLRenderingContext.$generateMipmap_Callback(this, target);
 
   @DomName('WebGLRenderingContext.getActiveAttrib')
   @DocsEditable()
-  ActiveInfo getActiveAttrib(Program program, int index) => _blink.Native_WebGLRenderingContext_getActiveAttrib_Callback(this, program, index);
+  ActiveInfo getActiveAttrib(Program program, int index) => _blink.BlinkWebGLRenderingContext.$getActiveAttrib_Callback(this, program, index);
 
   @DomName('WebGLRenderingContext.getActiveUniform')
   @DocsEditable()
-  ActiveInfo getActiveUniform(Program program, int index) => _blink.Native_WebGLRenderingContext_getActiveUniform_Callback(this, program, index);
+  ActiveInfo getActiveUniform(Program program, int index) => _blink.BlinkWebGLRenderingContext.$getActiveUniform_Callback(this, program, index);
 
   @DomName('WebGLRenderingContext.getAttachedShaders')
   @DocsEditable()
-  void getAttachedShaders(Program program) => _blink.Native_WebGLRenderingContext_getAttachedShaders_Callback(this, program);
+  void getAttachedShaders(Program program) => _blink.BlinkWebGLRenderingContext.$getAttachedShaders_Callback(this, program);
 
   @DomName('WebGLRenderingContext.getAttribLocation')
   @DocsEditable()
-  int getAttribLocation(Program program, String name) => _blink.Native_WebGLRenderingContext_getAttribLocation_Callback(this, program, name);
+  int getAttribLocation(Program program, String name) => _blink.BlinkWebGLRenderingContext.$getAttribLocation_Callback(this, program, name);
 
   @DomName('WebGLRenderingContext.getBufferParameter')
   @DocsEditable()
-  Object getBufferParameter(int target, int pname) => _blink.Native_WebGLRenderingContext_getBufferParameter_Callback(this, target, pname);
+  Object getBufferParameter(int target, int pname) => _blink.BlinkWebGLRenderingContext.$getBufferParameter_Callback(this, target, pname);
 
   @DomName('WebGLRenderingContext.getContextAttributes')
   @DocsEditable()
-  ContextAttributes getContextAttributes() => _blink.Native_WebGLRenderingContext_getContextAttributes_Callback(this);
+  ContextAttributes getContextAttributes() => _blink.BlinkWebGLRenderingContext.$getContextAttributes_Callback(this);
 
   @DomName('WebGLRenderingContext.getError')
   @DocsEditable()
-  int getError() => _blink.Native_WebGLRenderingContext_getError_Callback(this);
+  int getError() => _blink.BlinkWebGLRenderingContext.$getError_Callback(this);
 
   @DomName('WebGLRenderingContext.getExtension')
   @DocsEditable()
-  Object getExtension(String name) => _blink.Native_WebGLRenderingContext_getExtension_Callback(this, name);
+  Object getExtension(String name) => _blink.BlinkWebGLRenderingContext.$getExtension_Callback(this, name);
 
   @DomName('WebGLRenderingContext.getFramebufferAttachmentParameter')
   @DocsEditable()
-  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => _blink.Native_WebGLRenderingContext_getFramebufferAttachmentParameter_Callback(this, target, attachment, pname);
+  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => _blink.BlinkWebGLRenderingContext.$getFramebufferAttachmentParameter_Callback(this, target, attachment, pname);
 
   @DomName('WebGLRenderingContext.getParameter')
   @DocsEditable()
-  Object getParameter(int pname) => _blink.Native_WebGLRenderingContext_getParameter_Callback(this, pname);
+  Object getParameter(int pname) => _blink.BlinkWebGLRenderingContext.$getParameter_Callback(this, pname);
 
   @DomName('WebGLRenderingContext.getProgramInfoLog')
   @DocsEditable()
-  String getProgramInfoLog(Program program) => _blink.Native_WebGLRenderingContext_getProgramInfoLog_Callback(this, program);
+  String getProgramInfoLog(Program program) => _blink.BlinkWebGLRenderingContext.$getProgramInfoLog_Callback(this, program);
 
   @DomName('WebGLRenderingContext.getProgramParameter')
   @DocsEditable()
-  Object getProgramParameter(Program program, int pname) => _blink.Native_WebGLRenderingContext_getProgramParameter_Callback(this, program, pname);
+  Object getProgramParameter(Program program, int pname) => _blink.BlinkWebGLRenderingContext.$getProgramParameter_Callback(this, program, pname);
 
   @DomName('WebGLRenderingContext.getRenderbufferParameter')
   @DocsEditable()
-  Object getRenderbufferParameter(int target, int pname) => _blink.Native_WebGLRenderingContext_getRenderbufferParameter_Callback(this, target, pname);
+  Object getRenderbufferParameter(int target, int pname) => _blink.BlinkWebGLRenderingContext.$getRenderbufferParameter_Callback(this, target, pname);
 
   @DomName('WebGLRenderingContext.getShaderInfoLog')
   @DocsEditable()
-  String getShaderInfoLog(Shader shader) => _blink.Native_WebGLRenderingContext_getShaderInfoLog_Callback(this, shader);
+  String getShaderInfoLog(Shader shader) => _blink.BlinkWebGLRenderingContext.$getShaderInfoLog_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.getShaderParameter')
   @DocsEditable()
-  Object getShaderParameter(Shader shader, int pname) => _blink.Native_WebGLRenderingContext_getShaderParameter_Callback(this, shader, pname);
+  Object getShaderParameter(Shader shader, int pname) => _blink.BlinkWebGLRenderingContext.$getShaderParameter_Callback(this, shader, pname);
 
   @DomName('WebGLRenderingContext.getShaderPrecisionFormat')
   @DocsEditable()
-  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => _blink.Native_WebGLRenderingContext_getShaderPrecisionFormat_Callback(this, shadertype, precisiontype);
+  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => _blink.BlinkWebGLRenderingContext.$getShaderPrecisionFormat_Callback(this, shadertype, precisiontype);
 
   @DomName('WebGLRenderingContext.getShaderSource')
   @DocsEditable()
-  String getShaderSource(Shader shader) => _blink.Native_WebGLRenderingContext_getShaderSource_Callback(this, shader);
+  String getShaderSource(Shader shader) => _blink.BlinkWebGLRenderingContext.$getShaderSource_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.getSupportedExtensions')
   @DocsEditable()
-  List<String> getSupportedExtensions() => _blink.Native_WebGLRenderingContext_getSupportedExtensions_Callback(this);
+  List<String> getSupportedExtensions() => _blink.BlinkWebGLRenderingContext.$getSupportedExtensions_Callback(this);
 
   @DomName('WebGLRenderingContext.getTexParameter')
   @DocsEditable()
-  Object getTexParameter(int target, int pname) => _blink.Native_WebGLRenderingContext_getTexParameter_Callback(this, target, pname);
+  Object getTexParameter(int target, int pname) => _blink.BlinkWebGLRenderingContext.$getTexParameter_Callback(this, target, pname);
 
   @DomName('WebGLRenderingContext.getUniform')
   @DocsEditable()
-  Object getUniform(Program program, UniformLocation location) => _blink.Native_WebGLRenderingContext_getUniform_Callback(this, program, location);
+  Object getUniform(Program program, UniformLocation location) => _blink.BlinkWebGLRenderingContext.$getUniform_Callback(this, program, location);
 
   @DomName('WebGLRenderingContext.getUniformLocation')
   @DocsEditable()
-  UniformLocation getUniformLocation(Program program, String name) => _blink.Native_WebGLRenderingContext_getUniformLocation_Callback(this, program, name);
+  UniformLocation getUniformLocation(Program program, String name) => _blink.BlinkWebGLRenderingContext.$getUniformLocation_Callback(this, program, name);
 
   @DomName('WebGLRenderingContext.getVertexAttrib')
   @DocsEditable()
-  Object getVertexAttrib(int index, int pname) => _blink.Native_WebGLRenderingContext_getVertexAttrib_Callback(this, index, pname);
+  Object getVertexAttrib(int index, int pname) => _blink.BlinkWebGLRenderingContext.$getVertexAttrib_Callback(this, index, pname);
 
   @DomName('WebGLRenderingContext.getVertexAttribOffset')
   @DocsEditable()
-  int getVertexAttribOffset(int index, int pname) => _blink.Native_WebGLRenderingContext_getVertexAttribOffset_Callback(this, index, pname);
+  int getVertexAttribOffset(int index, int pname) => _blink.BlinkWebGLRenderingContext.$getVertexAttribOffset_Callback(this, index, pname);
 
   @DomName('WebGLRenderingContext.hint')
   @DocsEditable()
-  void hint(int target, int mode) => _blink.Native_WebGLRenderingContext_hint_Callback(this, target, mode);
+  void hint(int target, int mode) => _blink.BlinkWebGLRenderingContext.$hint_Callback(this, target, mode);
 
   @DomName('WebGLRenderingContext.isBuffer')
   @DocsEditable()
-  bool isBuffer(Buffer buffer) => _blink.Native_WebGLRenderingContext_isBuffer_Callback(this, buffer);
+  bool isBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContext.$isBuffer_Callback(this, buffer);
 
   @DomName('WebGLRenderingContext.isContextLost')
   @DocsEditable()
-  bool isContextLost() => _blink.Native_WebGLRenderingContext_isContextLost_Callback(this);
+  bool isContextLost() => _blink.BlinkWebGLRenderingContext.$isContextLost_Callback(this);
 
   @DomName('WebGLRenderingContext.isEnabled')
   @DocsEditable()
-  bool isEnabled(int cap) => _blink.Native_WebGLRenderingContext_isEnabled_Callback(this, cap);
+  bool isEnabled(int cap) => _blink.BlinkWebGLRenderingContext.$isEnabled_Callback(this, cap);
 
   @DomName('WebGLRenderingContext.isFramebuffer')
   @DocsEditable()
-  bool isFramebuffer(Framebuffer framebuffer) => _blink.Native_WebGLRenderingContext_isFramebuffer_Callback(this, framebuffer);
+  bool isFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.$isFramebuffer_Callback(this, framebuffer);
 
   @DomName('WebGLRenderingContext.isProgram')
   @DocsEditable()
-  bool isProgram(Program program) => _blink.Native_WebGLRenderingContext_isProgram_Callback(this, program);
+  bool isProgram(Program program) => _blink.BlinkWebGLRenderingContext.$isProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.isRenderbuffer')
   @DocsEditable()
-  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.Native_WebGLRenderingContext_isRenderbuffer_Callback(this, renderbuffer);
+  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.$isRenderbuffer_Callback(this, renderbuffer);
 
   @DomName('WebGLRenderingContext.isShader')
   @DocsEditable()
-  bool isShader(Shader shader) => _blink.Native_WebGLRenderingContext_isShader_Callback(this, shader);
+  bool isShader(Shader shader) => _blink.BlinkWebGLRenderingContext.$isShader_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.isTexture')
   @DocsEditable()
-  bool isTexture(Texture texture) => _blink.Native_WebGLRenderingContext_isTexture_Callback(this, texture);
+  bool isTexture(Texture texture) => _blink.BlinkWebGLRenderingContext.$isTexture_Callback(this, texture);
 
   @DomName('WebGLRenderingContext.lineWidth')
   @DocsEditable()
-  void lineWidth(num width) => _blink.Native_WebGLRenderingContext_lineWidth_Callback(this, width);
+  void lineWidth(num width) => _blink.BlinkWebGLRenderingContext.$lineWidth_Callback(this, width);
 
   @DomName('WebGLRenderingContext.linkProgram')
   @DocsEditable()
-  void linkProgram(Program program) => _blink.Native_WebGLRenderingContext_linkProgram_Callback(this, program);
+  void linkProgram(Program program) => _blink.BlinkWebGLRenderingContext.$linkProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.pixelStorei')
   @DocsEditable()
-  void pixelStorei(int pname, int param) => _blink.Native_WebGLRenderingContext_pixelStorei_Callback(this, pname, param);
+  void pixelStorei(int pname, int param) => _blink.BlinkWebGLRenderingContext.$pixelStorei_Callback(this, pname, param);
 
   @DomName('WebGLRenderingContext.polygonOffset')
   @DocsEditable()
-  void polygonOffset(num factor, num units) => _blink.Native_WebGLRenderingContext_polygonOffset_Callback(this, factor, units);
+  void polygonOffset(num factor, num units) => _blink.BlinkWebGLRenderingContext.$polygonOffset_Callback(this, factor, units);
 
   @DomName('WebGLRenderingContext.readPixels')
   @DocsEditable()
-  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.Native_WebGLRenderingContext_readPixels_Callback(this, x, y, width, height, format, type, pixels);
+  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.BlinkWebGLRenderingContext.$readPixels_Callback(this, x, y, width, height, format, type, pixels);
 
   @DomName('WebGLRenderingContext.renderbufferStorage')
   @DocsEditable()
-  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.Native_WebGLRenderingContext_renderbufferStorage_Callback(this, target, internalformat, width, height);
+  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.BlinkWebGLRenderingContext.$renderbufferStorage_Callback(this, target, internalformat, width, height);
 
   @DomName('WebGLRenderingContext.sampleCoverage')
   @DocsEditable()
-  void sampleCoverage(num value, bool invert) => _blink.Native_WebGLRenderingContext_sampleCoverage_Callback(this, value, invert);
+  void sampleCoverage(num value, bool invert) => _blink.BlinkWebGLRenderingContext.$sampleCoverage_Callback(this, value, invert);
 
   @DomName('WebGLRenderingContext.scissor')
   @DocsEditable()
-  void scissor(int x, int y, int width, int height) => _blink.Native_WebGLRenderingContext_scissor_Callback(this, x, y, width, height);
+  void scissor(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.$scissor_Callback(this, x, y, width, height);
 
   @DomName('WebGLRenderingContext.shaderSource')
   @DocsEditable()
-  void shaderSource(Shader shader, String string) => _blink.Native_WebGLRenderingContext_shaderSource_Callback(this, shader, string);
+  void shaderSource(Shader shader, String string) => _blink.BlinkWebGLRenderingContext.$shaderSource_Callback(this, shader, string);
 
   @DomName('WebGLRenderingContext.stencilFunc')
   @DocsEditable()
-  void stencilFunc(int func, int ref, int mask) => _blink.Native_WebGLRenderingContext_stencilFunc_Callback(this, func, ref, mask);
+  void stencilFunc(int func, int ref, int mask) => _blink.BlinkWebGLRenderingContext.$stencilFunc_Callback(this, func, ref, mask);
 
   @DomName('WebGLRenderingContext.stencilFuncSeparate')
   @DocsEditable()
-  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.Native_WebGLRenderingContext_stencilFuncSeparate_Callback(this, face, func, ref, mask);
+  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.BlinkWebGLRenderingContext.$stencilFuncSeparate_Callback(this, face, func, ref, mask);
 
   @DomName('WebGLRenderingContext.stencilMask')
   @DocsEditable()
-  void stencilMask(int mask) => _blink.Native_WebGLRenderingContext_stencilMask_Callback(this, mask);
+  void stencilMask(int mask) => _blink.BlinkWebGLRenderingContext.$stencilMask_Callback(this, mask);
 
   @DomName('WebGLRenderingContext.stencilMaskSeparate')
   @DocsEditable()
-  void stencilMaskSeparate(int face, int mask) => _blink.Native_WebGLRenderingContext_stencilMaskSeparate_Callback(this, face, mask);
+  void stencilMaskSeparate(int face, int mask) => _blink.BlinkWebGLRenderingContext.$stencilMaskSeparate_Callback(this, face, mask);
 
   @DomName('WebGLRenderingContext.stencilOp')
   @DocsEditable()
-  void stencilOp(int fail, int zfail, int zpass) => _blink.Native_WebGLRenderingContext_stencilOp_Callback(this, fail, zfail, zpass);
+  void stencilOp(int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.$stencilOp_Callback(this, fail, zfail, zpass);
 
   @DomName('WebGLRenderingContext.stencilOpSeparate')
   @DocsEditable()
-  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.Native_WebGLRenderingContext_stencilOpSeparate_Callback(this, face, fail, zfail, zpass);
+  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.$stencilOpSeparate_Callback(this, face, fail, zfail, zpass);
 
-  void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) => _blink.Native_WebGLRenderingContext_texImage2D(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
+  void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) => _blink.BlinkWebGLRenderingContext.$texImage2D(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
 
   @DomName('WebGLRenderingContext.texImage2DCanvas')
   @DocsEditable()
-  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas) => _blink.Native_WebGLRenderingContext_texImage2DCanvas_Callback(this, target, level, internalformat, format, type, canvas);
+  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas) => _blink.BlinkWebGLRenderingContext.$texImage2DCanvas_Callback(this, target, level, internalformat, format, type, canvas);
 
   @DomName('WebGLRenderingContext.texImage2DImage')
   @DocsEditable()
-  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image) => _blink.Native_WebGLRenderingContext_texImage2DImage_Callback(this, target, level, internalformat, format, type, image);
+  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image) => _blink.BlinkWebGLRenderingContext.$texImage2DImage_Callback(this, target, level, internalformat, format, type, image);
 
   @DomName('WebGLRenderingContext.texImage2DImageData')
   @DocsEditable()
-  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels) => _blink.Native_WebGLRenderingContext_texImage2DImageData_Callback(this, target, level, internalformat, format, type, pixels);
+  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels) => _blink.BlinkWebGLRenderingContext.$texImage2DImageData_Callback(this, target, level, internalformat, format, type, pixels);
 
   @DomName('WebGLRenderingContext.texImage2DVideo')
   @DocsEditable()
-  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video) => _blink.Native_WebGLRenderingContext_texImage2DVideo_Callback(this, target, level, internalformat, format, type, video);
+  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video) => _blink.BlinkWebGLRenderingContext.$texImage2DVideo_Callback(this, target, level, internalformat, format, type, video);
 
   @DomName('WebGLRenderingContext.texParameterf')
   @DocsEditable()
-  void texParameterf(int target, int pname, num param) => _blink.Native_WebGLRenderingContext_texParameterf_Callback(this, target, pname, param);
+  void texParameterf(int target, int pname, num param) => _blink.BlinkWebGLRenderingContext.$texParameterf_Callback(this, target, pname, param);
 
   @DomName('WebGLRenderingContext.texParameteri')
   @DocsEditable()
-  void texParameteri(int target, int pname, int param) => _blink.Native_WebGLRenderingContext_texParameteri_Callback(this, target, pname, param);
+  void texParameteri(int target, int pname, int param) => _blink.BlinkWebGLRenderingContext.$texParameteri_Callback(this, target, pname, param);
 
-  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) => _blink.Native_WebGLRenderingContext_texSubImage2D(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
+  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) => _blink.BlinkWebGLRenderingContext.$texSubImage2D(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
 
   @DomName('WebGLRenderingContext.texSubImage2DCanvas')
   @DocsEditable()
-  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) => _blink.Native_WebGLRenderingContext_texSubImage2DCanvas_Callback(this, target, level, xoffset, yoffset, format, type, canvas);
+  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) => _blink.BlinkWebGLRenderingContext.$texSubImage2DCanvas_Callback(this, target, level, xoffset, yoffset, format, type, canvas);
 
   @DomName('WebGLRenderingContext.texSubImage2DImage')
   @DocsEditable()
-  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) => _blink.Native_WebGLRenderingContext_texSubImage2DImage_Callback(this, target, level, xoffset, yoffset, format, type, image);
+  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) => _blink.BlinkWebGLRenderingContext.$texSubImage2DImage_Callback(this, target, level, xoffset, yoffset, format, type, image);
 
   @DomName('WebGLRenderingContext.texSubImage2DImageData')
   @DocsEditable()
-  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) => _blink.Native_WebGLRenderingContext_texSubImage2DImageData_Callback(this, target, level, xoffset, yoffset, format, type, pixels);
+  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) => _blink.BlinkWebGLRenderingContext.$texSubImage2DImageData_Callback(this, target, level, xoffset, yoffset, format, type, pixels);
 
   @DomName('WebGLRenderingContext.texSubImage2DVideo')
   @DocsEditable()
-  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) => _blink.Native_WebGLRenderingContext_texSubImage2DVideo_Callback(this, target, level, xoffset, yoffset, format, type, video);
+  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) => _blink.BlinkWebGLRenderingContext.$texSubImage2DVideo_Callback(this, target, level, xoffset, yoffset, format, type, video);
 
   @DomName('WebGLRenderingContext.uniform1f')
   @DocsEditable()
-  void uniform1f(UniformLocation location, num x) => _blink.Native_WebGLRenderingContext_uniform1f_Callback(this, location, x);
+  void uniform1f(UniformLocation location, num x) => _blink.BlinkWebGLRenderingContext.$uniform1f_Callback(this, location, x);
 
   @DomName('WebGLRenderingContext.uniform1fv')
   @DocsEditable()
-  void uniform1fv(UniformLocation location, Float32List v) => _blink.Native_WebGLRenderingContext_uniform1fv_Callback(this, location, v);
+  void uniform1fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.$uniform1fv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform1i')
   @DocsEditable()
-  void uniform1i(UniformLocation location, int x) => _blink.Native_WebGLRenderingContext_uniform1i_Callback(this, location, x);
+  void uniform1i(UniformLocation location, int x) => _blink.BlinkWebGLRenderingContext.$uniform1i_Callback(this, location, x);
 
   @DomName('WebGLRenderingContext.uniform1iv')
   @DocsEditable()
-  void uniform1iv(UniformLocation location, Int32List v) => _blink.Native_WebGLRenderingContext_uniform1iv_Callback(this, location, v);
+  void uniform1iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.$uniform1iv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform2f')
   @DocsEditable()
-  void uniform2f(UniformLocation location, num x, num y) => _blink.Native_WebGLRenderingContext_uniform2f_Callback(this, location, x, y);
+  void uniform2f(UniformLocation location, num x, num y) => _blink.BlinkWebGLRenderingContext.$uniform2f_Callback(this, location, x, y);
 
   @DomName('WebGLRenderingContext.uniform2fv')
   @DocsEditable()
-  void uniform2fv(UniformLocation location, Float32List v) => _blink.Native_WebGLRenderingContext_uniform2fv_Callback(this, location, v);
+  void uniform2fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.$uniform2fv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform2i')
   @DocsEditable()
-  void uniform2i(UniformLocation location, int x, int y) => _blink.Native_WebGLRenderingContext_uniform2i_Callback(this, location, x, y);
+  void uniform2i(UniformLocation location, int x, int y) => _blink.BlinkWebGLRenderingContext.$uniform2i_Callback(this, location, x, y);
 
   @DomName('WebGLRenderingContext.uniform2iv')
   @DocsEditable()
-  void uniform2iv(UniformLocation location, Int32List v) => _blink.Native_WebGLRenderingContext_uniform2iv_Callback(this, location, v);
+  void uniform2iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.$uniform2iv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform3f')
   @DocsEditable()
-  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.Native_WebGLRenderingContext_uniform3f_Callback(this, location, x, y, z);
+  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.$uniform3f_Callback(this, location, x, y, z);
 
   @DomName('WebGLRenderingContext.uniform3fv')
   @DocsEditable()
-  void uniform3fv(UniformLocation location, Float32List v) => _blink.Native_WebGLRenderingContext_uniform3fv_Callback(this, location, v);
+  void uniform3fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.$uniform3fv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform3i')
   @DocsEditable()
-  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.Native_WebGLRenderingContext_uniform3i_Callback(this, location, x, y, z);
+  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.BlinkWebGLRenderingContext.$uniform3i_Callback(this, location, x, y, z);
 
   @DomName('WebGLRenderingContext.uniform3iv')
   @DocsEditable()
-  void uniform3iv(UniformLocation location, Int32List v) => _blink.Native_WebGLRenderingContext_uniform3iv_Callback(this, location, v);
+  void uniform3iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.$uniform3iv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform4f')
   @DocsEditable()
-  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.Native_WebGLRenderingContext_uniform4f_Callback(this, location, x, y, z, w);
+  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.$uniform4f_Callback(this, location, x, y, z, w);
 
   @DomName('WebGLRenderingContext.uniform4fv')
   @DocsEditable()
-  void uniform4fv(UniformLocation location, Float32List v) => _blink.Native_WebGLRenderingContext_uniform4fv_Callback(this, location, v);
+  void uniform4fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.$uniform4fv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform4i')
   @DocsEditable()
-  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.Native_WebGLRenderingContext_uniform4i_Callback(this, location, x, y, z, w);
+  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.BlinkWebGLRenderingContext.$uniform4i_Callback(this, location, x, y, z, w);
 
   @DomName('WebGLRenderingContext.uniform4iv')
   @DocsEditable()
-  void uniform4iv(UniformLocation location, Int32List v) => _blink.Native_WebGLRenderingContext_uniform4iv_Callback(this, location, v);
+  void uniform4iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.$uniform4iv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniformMatrix2fv')
   @DocsEditable()
-  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array) => _blink.Native_WebGLRenderingContext_uniformMatrix2fv_Callback(this, location, transpose, array);
+  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.$uniformMatrix2fv_Callback(this, location, transpose, array);
 
   @DomName('WebGLRenderingContext.uniformMatrix3fv')
   @DocsEditable()
-  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array) => _blink.Native_WebGLRenderingContext_uniformMatrix3fv_Callback(this, location, transpose, array);
+  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.$uniformMatrix3fv_Callback(this, location, transpose, array);
 
   @DomName('WebGLRenderingContext.uniformMatrix4fv')
   @DocsEditable()
-  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array) => _blink.Native_WebGLRenderingContext_uniformMatrix4fv_Callback(this, location, transpose, array);
+  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.$uniformMatrix4fv_Callback(this, location, transpose, array);
 
   @DomName('WebGLRenderingContext.useProgram')
   @DocsEditable()
-  void useProgram(Program program) => _blink.Native_WebGLRenderingContext_useProgram_Callback(this, program);
+  void useProgram(Program program) => _blink.BlinkWebGLRenderingContext.$useProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.validateProgram')
   @DocsEditable()
-  void validateProgram(Program program) => _blink.Native_WebGLRenderingContext_validateProgram_Callback(this, program);
+  void validateProgram(Program program) => _blink.BlinkWebGLRenderingContext.$validateProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.vertexAttrib1f')
   @DocsEditable()
-  void vertexAttrib1f(int indx, num x) => _blink.Native_WebGLRenderingContext_vertexAttrib1f_Callback(this, indx, x);
+  void vertexAttrib1f(int indx, num x) => _blink.BlinkWebGLRenderingContext.$vertexAttrib1f_Callback(this, indx, x);
 
   @DomName('WebGLRenderingContext.vertexAttrib1fv')
   @DocsEditable()
-  void vertexAttrib1fv(int indx, Float32List values) => _blink.Native_WebGLRenderingContext_vertexAttrib1fv_Callback(this, indx, values);
+  void vertexAttrib1fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.$vertexAttrib1fv_Callback(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttrib2f')
   @DocsEditable()
-  void vertexAttrib2f(int indx, num x, num y) => _blink.Native_WebGLRenderingContext_vertexAttrib2f_Callback(this, indx, x, y);
+  void vertexAttrib2f(int indx, num x, num y) => _blink.BlinkWebGLRenderingContext.$vertexAttrib2f_Callback(this, indx, x, y);
 
   @DomName('WebGLRenderingContext.vertexAttrib2fv')
   @DocsEditable()
-  void vertexAttrib2fv(int indx, Float32List values) => _blink.Native_WebGLRenderingContext_vertexAttrib2fv_Callback(this, indx, values);
+  void vertexAttrib2fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.$vertexAttrib2fv_Callback(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttrib3f')
   @DocsEditable()
-  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.Native_WebGLRenderingContext_vertexAttrib3f_Callback(this, indx, x, y, z);
+  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.$vertexAttrib3f_Callback(this, indx, x, y, z);
 
   @DomName('WebGLRenderingContext.vertexAttrib3fv')
   @DocsEditable()
-  void vertexAttrib3fv(int indx, Float32List values) => _blink.Native_WebGLRenderingContext_vertexAttrib3fv_Callback(this, indx, values);
+  void vertexAttrib3fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.$vertexAttrib3fv_Callback(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttrib4f')
   @DocsEditable()
-  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.Native_WebGLRenderingContext_vertexAttrib4f_Callback(this, indx, x, y, z, w);
+  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.$vertexAttrib4f_Callback(this, indx, x, y, z, w);
 
   @DomName('WebGLRenderingContext.vertexAttrib4fv')
   @DocsEditable()
-  void vertexAttrib4fv(int indx, Float32List values) => _blink.Native_WebGLRenderingContext_vertexAttrib4fv_Callback(this, indx, values);
+  void vertexAttrib4fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.$vertexAttrib4fv_Callback(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttribPointer')
   @DocsEditable()
-  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.Native_WebGLRenderingContext_vertexAttribPointer_Callback(this, indx, size, type, normalized, stride, offset);
+  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.BlinkWebGLRenderingContext.$vertexAttribPointer_Callback(this, indx, size, type, normalized, stride, offset);
 
   @DomName('WebGLRenderingContext.viewport')
   @DocsEditable()
-  void viewport(int x, int y, int width, int height) => _blink.Native_WebGLRenderingContext_viewport_Callback(this, x, y, width, height);
+  void viewport(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.$viewport_Callback(this, x, y, width, height);
 
 
   /**
@@ -2982,15 +2982,15 @@
 
   @DomName('WebGLShaderPrecisionFormat.precision')
   @DocsEditable()
-  int get precision => _blink.Native_WebGLShaderPrecisionFormat_precision_Getter(this);
+  int get precision => _blink.BlinkWebGLShaderPrecisionFormat.$precision_Getter(this);
 
   @DomName('WebGLShaderPrecisionFormat.rangeMax')
   @DocsEditable()
-  int get rangeMax => _blink.Native_WebGLShaderPrecisionFormat_rangeMax_Getter(this);
+  int get rangeMax => _blink.BlinkWebGLShaderPrecisionFormat.$rangeMax_Getter(this);
 
   @DomName('WebGLShaderPrecisionFormat.rangeMin')
   @DocsEditable()
-  int get rangeMin => _blink.Native_WebGLShaderPrecisionFormat_rangeMin_Getter(this);
+  int get rangeMin => _blink.BlinkWebGLShaderPrecisionFormat.$rangeMin_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/web_sql/dartium/web_sql_dartium.dart b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
index 968b7c7..dd4d696 100644
--- a/sdk/lib/web_sql/dartium/web_sql_dartium.dart
+++ b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
@@ -25,13 +25,13 @@
 
 
 // FIXME: Can we make this private?
-const web_sqlBlinkMap = const {
-  'Database': SqlDatabase,
-  'SQLError': SqlError,
-  'SQLResultSet': SqlResultSet,
-  'SQLResultSetRowList': SqlResultSetRowList,
-  'SQLTransaction': SqlTransaction,
-  'SQLTransactionSync': _SQLTransactionSync,
+final web_sqlBlinkMap = {
+  'Database': () => SqlDatabase,
+  'SQLError': () => SqlError,
+  'SQLResultSet': () => SqlResultSet,
+  'SQLResultSetRowList': () => SqlResultSetRowList,
+  'SQLTransaction': () => SqlTransaction,
+  'SQLTransactionSync': () => _SQLTransactionSync,
 
 };
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -101,7 +101,7 @@
 
   @DomName('Database.version')
   @DocsEditable()
-  String get version => _blink.Native_Database_version_Getter(this);
+  String get version => _blink.BlinkDatabase.$version_Getter(this);
 
   /**
    * Atomically update the database version to [newVersion], asynchronously
@@ -117,15 +117,15 @@
    */
   @DomName('Database.changeVersion')
   @DocsEditable()
-  void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.Native_Database_changeVersion_Callback(this, oldVersion, newVersion, callback, errorCallback, successCallback);
+  void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.BlinkDatabase.$changeVersion_Callback(this, oldVersion, newVersion, callback, errorCallback, successCallback);
 
   @DomName('Database.readTransaction')
   @DocsEditable()
-  void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.Native_Database_readTransaction_Callback(this, callback, errorCallback, successCallback);
+  void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.BlinkDatabase.$readTransaction_Callback(this, callback, errorCallback, successCallback);
 
   @DomName('Database.transaction')
   @DocsEditable()
-  void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.Native_Database_transaction_Callback(this, callback, errorCallback, successCallback);
+  void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.BlinkDatabase.$transaction_Callback(this, callback, errorCallback, successCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -177,11 +177,11 @@
 
   @DomName('SQLError.code')
   @DocsEditable()
-  int get code => _blink.Native_SQLError_code_Getter(this);
+  int get code => _blink.BlinkSQLError.$code_Getter(this);
 
   @DomName('SQLError.message')
   @DocsEditable()
-  String get message => _blink.Native_SQLError_message_Getter(this);
+  String get message => _blink.BlinkSQLError.$message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -201,15 +201,15 @@
 
   @DomName('SQLResultSet.insertId')
   @DocsEditable()
-  int get insertId => _blink.Native_SQLResultSet_insertId_Getter(this);
+  int get insertId => _blink.BlinkSQLResultSet.$insertId_Getter(this);
 
   @DomName('SQLResultSet.rows')
   @DocsEditable()
-  SqlResultSetRowList get rows => _blink.Native_SQLResultSet_rows_Getter(this);
+  SqlResultSetRowList get rows => _blink.BlinkSQLResultSet.$rows_Getter(this);
 
   @DomName('SQLResultSet.rowsAffected')
   @DocsEditable()
-  int get rowsAffected => _blink.Native_SQLResultSet_rowsAffected_Getter(this);
+  int get rowsAffected => _blink.BlinkSQLResultSet.$rowsAffected_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -229,15 +229,15 @@
 
   @DomName('SQLResultSetRowList.length')
   @DocsEditable()
-  int get length => _blink.Native_SQLResultSetRowList_length_Getter(this);
+  int get length => _blink.BlinkSQLResultSetRowList.$length_Getter(this);
 
   Map operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_SQLResultSetRowList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkSQLResultSetRowList.$NativeIndexed_Getter(this, index);
   }
 
-  Map _nativeIndexedGetter(int index) => _blink.Native_SQLResultSetRowList_NativeIndexed_Getter(this, index);
+  Map _nativeIndexedGetter(int index) => _blink.BlinkSQLResultSetRowList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Map value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -279,7 +279,7 @@
 
   @DomName('SQLResultSetRowList.item')
   @DocsEditable()
-  Map item(int index) => _blink.Native_SQLResultSetRowList_item_Callback(this, index);
+  Map item(int index) => _blink.BlinkSQLResultSetRowList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -302,7 +302,7 @@
 
   @DomName('SQLTransaction.executeSql')
   @DocsEditable()
-  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) => _blink.Native_SQLTransaction_executeSql_Callback(this, sqlStatement, arguments, callback, errorCallback);
+  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) => _blink.BlinkSQLTransaction.$executeSql_Callback(this, sqlStatement, arguments, callback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/site/try/app.yaml b/site/try/app.yaml
index 24ae310..dd447c0 100644
--- a/site/try/app.yaml
+++ b/site/try/app.yaml
@@ -28,6 +28,53 @@
 default_expiration: 1s
 
 handlers:
+- url: /packages/analyzer
+  static_dir: packages/analyzer
+
+- url: /packages/args
+  static_dir: packages/args
+
+- url: /packages/collection
+  static_dir: packages/collection
+
+- url: /packages/crypto
+  static_dir: packages/crypto
+
+- url: /packages/http
+  static_dir: packages/http
+
+- url: /packages/http_parser
+  static_dir: packages/http_parser
+
+- url: /packages/intl
+  static_dir: packages/intl
+
+- url: /packages/logging
+  static_dir: packages/logging
+
+- url: /packages/matcher
+  static_dir: packages/matcher
+
+- url: /packages/math
+  static_dir: packages/math
+
+- url: /packages/path
+  static_dir: packages/path
+
+- url: /packages/serialization
+  static_dir: packages/serialization
+
+- url: /packages/stack_trace
+  static_dir: packages/stack_trace
+
+- url: /packages/string_scanner
+  static_dir: packages/string_scanner
+
+- url: /packages/unittest
+  static_dir: packages/unittest
+
+- url: /packages/yaml
+  static_dir: packages/yaml
 
 - url: /favicon\.ico
   static_files: favicon.ico
diff --git a/site/try/build_try.gyp b/site/try/build_try.gyp
index 654fce0..b22d0df 100644
--- a/site/try/build_try.gyp
+++ b/site/try/build_try.gyp
@@ -20,6 +20,7 @@
       'dependencies': [
         '../../runtime/dart-runtime.gyp:dart',
         '../../create_sdk.gyp:create_sdk_internal',
+        '../../pkg/pkg.gyp:pkg_packages',
       ],
       'variables': {
         'try_dart_static_files': [
@@ -39,8 +40,29 @@
           'favicon.ico',
 
           '<(SHARED_INTERMEDIATE_DIR)/leap.dart.js',
+          '<(SHARED_INTERMEDIATE_DIR)/compiler_isolate.dart.js',
           '<(SHARED_INTERMEDIATE_DIR)/sdk.json',
         ],
+        'try_dart_hosted_package_directories': [
+          # These packages are uploaded to Try Dart and can be used in code
+          # there.
+          '../../pkg/analyzer/lib',
+          '../../pkg/args/lib',
+          '../../pkg/collection/lib',
+          '../../pkg/crypto/lib',
+          '../../pkg/http/lib',
+          '../../pkg/http_parser/lib',
+          '../../pkg/intl/lib',
+          '../../pkg/logging/lib',
+          '../../pkg/matcher/lib',
+          '../../pkg/math/lib',
+          '../../pkg/path/lib',
+          '../../pkg/serialization/lib',
+          '../../pkg/stack_trace/lib',
+          '../../pkg/string_scanner/lib',
+          '../../pkg/unittest/lib',
+          '../../pkg/yaml/lib',
+        ],
       },
       'actions': [
         {
@@ -79,6 +101,9 @@
             # action is executed.
             '<(PRODUCT_DIR)/dart-sdk/README',
 
+            # Ensure the packages directory is built first.
+            '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
+
             '<!@(["python", "../../tools/list_files.py", "\\.dart$", "src"])',
           ],
           'outputs': [
@@ -86,13 +111,40 @@
           ],
           'action': [
             '<(PRODUCT_DIR)/dart-sdk/bin/dart2js<(script_suffix)',
-            '-p../../sdk/lib/_internal/',
+            '-p<(PRODUCT_DIR)/packages/',
             '-Denable_ir=false',
+            '--show-package-warnings',
             'src/leap.dart',
             '-o<(SHARED_INTERMEDIATE_DIR)/leap.dart.js',
           ],
         },
         {
+          'action_name': 'compile_isolate',
+          'message': 'Creating compiler_isolate.dart.js',
+          'inputs': [
+            # Depending on this file ensures that the SDK is built before this
+            # action is executed.
+            '<(PRODUCT_DIR)/dart-sdk/README',
+
+            # Ensure the packages directory is built first.
+            '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
+
+            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "src"])',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/compiler_isolate.dart.js',
+          ],
+          'action': [
+            '<(PRODUCT_DIR)/dart-sdk/bin/dart2js<(script_suffix)',
+            '-p<(PRODUCT_DIR)/packages/',
+            '-Denable_ir=false',
+            '--show-package-warnings',
+            '--trust-type-annotations',
+            'src/compiler_isolate.dart',
+            '-o<(SHARED_INTERMEDIATE_DIR)/compiler_isolate.dart.js',
+          ],
+        },
+        {
           'action_name': 'nossl_appcache',
           'message': 'Creating nossl.appcache',
           'inputs': [
@@ -113,6 +165,24 @@
             '<(SHARED_INTERMEDIATE_DIR)/nossl.appcache',
           ],
         },
+        {
+          'action_name': 'make_pkg_packages',
+          'inputs': [
+            '../../tools/make_links.py',
+            '<@(try_dart_hosted_package_directories)',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/try_dartlang_org_packages.stamp',
+            '<(PRODUCT_DIR)/try_dartlang_org/packages'
+          ],
+          'action': [
+            'python', '../../tools/make_links.py',
+            '--timestamp_file=<(SHARED_INTERMEDIATE_DIR)'
+            '/try_dartlang_org_packages.stamp',
+            '<(PRODUCT_DIR)/try_dartlang_org/packages',
+            '<@(_inputs)',
+          ],
+        },
       ],
       'copies': [
         {
diff --git a/site/try/index.html b/site/try/index.html
index 6d6fecb..969e2f1 100644
--- a/site/try/index.html
+++ b/site/try/index.html
@@ -28,13 +28,14 @@
 }
 a.diagnostic>span {
   display: none;
+  max-width: 70%;
 }
 a:hover.diagnostic>span {
   display: block;
   position: absolute;
   /* left: 1em; */
   /* top: 2em; */
-  right: 19px;
+  right: 1%;
 }
 
 .offline {
diff --git a/site/try/src/Makefile b/site/try/src/Makefile
index a7f64a6..d114353 100644
--- a/site/try/src/Makefile
+++ b/site/try/src/Makefile
@@ -3,9 +3,16 @@
 # BSD-style license that can be found in the LICENSE file.
 
 SDK_DIR=../../../xcodebuild/ReleaseIA32/dart-sdk
-PACKAGE_ROOT=../../../sdk/lib/_internal/
+PACKAGE_ROOT=../../../xcodebuild/ReleaseIA32/packages/
 
 all:
-	$(SDK_DIR)/bin/dartanalyzer -p $(PACKAGE_ROOT) leap.dart --machine 2>&1\
+	$(SDK_DIR)/bin/dartanalyzer -p $(PACKAGE_ROOT) \
+	--package-warnings --machine leap.dart 2>&1 \
+	| grep -v DEPRECATED_MEMBER_USE \
 	| sed -e "s,$(PWD)/,," \
-	| awk -F'|' '{print $$4 ":" $$5 ":" $$6 ": " $$8}'
+	| awk -F'|' '{print $$4 ":" $$5 ":" $$6 ": [" $$3 "] " $$8 }'
+	$(SDK_DIR)/bin/dartanalyzer -p $(PACKAGE_ROOT) \
+	--package-warnings --machine compiler_isolate.dart 2>&1 \
+	| grep -v DEPRECATED_MEMBER_USE \
+	| sed -e "s,$(PWD)/,," \
+	| awk -F'|' '{print $$4 ":" $$5 ":" $$6 ": [" $$3 "] " $$8 }'
diff --git a/site/try/src/caching_compiler.dart b/site/try/src/caching_compiler.dart
deleted file mode 100644
index 0fdd619..0000000
--- a/site/try/src/caching_compiler.dart
+++ /dev/null
@@ -1,139 +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 trydart.caching_compiler;
-
-import 'dart:async' show EventSink;
-
-import 'package:compiler/compiler.dart' show
-    CompilerOutputProvider,
-    Diagnostic,
-    DiagnosticHandler;
-
-import 'package:compiler/implementation/apiimpl.dart' show
-    Compiler;
-
-// This file is copied from a dart2js test which uses dart:io. For now, mock up
-// a bunch of interfaces to silence the analyzer. This file will serve as basis
-// for incremental analysis.
-abstract class SourceFileProvider {}
-class FormattingDiagnosticHandler {
-  FormattingDiagnosticHandler(a);
-}
-abstract class Platform {
-  static var script;
-  static var packageRoot;
-}
-class MemorySourceFileProvider extends SourceFileProvider {
-  var readStringFromUri;
-  var memorySourceFiles;
-  MemorySourceFileProvider(a);
-}
-class NullSink extends EventSink<String> {
-  NullSink(a);
-  add(a) {}
-  addError(a, [b]) {}
-  close() {}
-}
-var expando;
-
-DiagnosticHandler createDiagnosticHandler(DiagnosticHandler diagnosticHandler,
-                                          SourceFileProvider provider,
-                                          bool showDiagnostics) {
-  var handler = diagnosticHandler;
-  if (showDiagnostics) {
-    if (diagnosticHandler == null) {
-      handler = new FormattingDiagnosticHandler(provider);
-    } else {
-      var formattingHandler = new FormattingDiagnosticHandler(provider);
-      handler = (Uri uri, int begin, int end, String message, Diagnostic kind) {
-        diagnosticHandler(uri, begin, end, message, kind);
-        formattingHandler(uri, begin, end, message, kind);
-      };
-    }
-  } else if (diagnosticHandler == null) {
-    handler = (Uri uri, int begin, int end, String message, Diagnostic kind) {};
-  }
-  return handler;
-}
-
-Compiler compilerFor(Map<String,String> memorySourceFiles,
-                     {DiagnosticHandler diagnosticHandler,
-                      CompilerOutputProvider outputProvider,
-                      List<String> options: const [],
-                      Compiler cachedCompiler,
-                      bool showDiagnostics: true,
-                      Uri packageRoot}) {
-  Uri libraryRoot = Uri.base.resolve('sdk/');
-  Uri script = Uri.base.resolveUri(Platform.script);
-  if (packageRoot == null) {
-    packageRoot = Uri.base.resolve('${Platform.packageRoot}/');
-  }
-
-  MemorySourceFileProvider provider;
-  var readStringFromUri;
-  if (cachedCompiler == null) {
-    provider = new MemorySourceFileProvider(memorySourceFiles);
-    readStringFromUri = provider.readStringFromUri;
-    // Saving the provider in case we need it later for a cached compiler.
-    expando[readStringFromUri] = provider;
-  } else {
-    // When using a cached compiler, it has read a number of files from disk
-    // already (and will not attemp to read them again due to caching). These
-    // files must be available to the new diagnostic handler.
-    provider = expando[cachedCompiler.provider];
-    readStringFromUri = cachedCompiler.provider;
-    provider.memorySourceFiles = memorySourceFiles;
-  }
-  var handler =
-      createDiagnosticHandler(diagnosticHandler, provider, showDiagnostics);
-
-  EventSink<String> noOutputProvider(String name, String extension) {
-    if (name != '') throw 'Attempt to output file "$name.$extension"';
-    return new NullSink('$name.$extension');
-  }
-  if (outputProvider == null) {
-    outputProvider = noOutputProvider;
-  }
-
-  Compiler compiler = new Compiler(readStringFromUri,
-                                   outputProvider,
-                                   handler,
-                                   libraryRoot,
-                                   packageRoot,
-                                   options,
-                                   {});
-  if (cachedCompiler != null) {
-    compiler.coreLibrary = cachedCompiler.libraries['dart:core'];
-    compiler.types = cachedCompiler.types;
-    cachedCompiler.libraries.forEach((String uri, library) {
-      if (library.isPlatformLibrary) {
-        compiler.libraries[uri] = library;
-        compiler.onLibraryLoaded(library, library.canonicalUri);
-      }
-    });
-
-    compiler.symbolConstructor = cachedCompiler.symbolConstructor;
-    compiler.mirrorSystemClass = cachedCompiler.mirrorSystemClass;
-    compiler.mirrorsUsedClass = cachedCompiler.mirrorsUsedClass;
-    compiler.mirrorSystemGetNameFunction =
-        cachedCompiler.mirrorSystemGetNameFunction;
-    compiler.symbolImplementationClass =
-        cachedCompiler.symbolImplementationClass;
-    compiler.symbolValidatedConstructor =
-        cachedCompiler.symbolValidatedConstructor;
-    compiler.mirrorsUsedConstructor = cachedCompiler.mirrorsUsedConstructor;
-    compiler.deferredLibraryClass = cachedCompiler.deferredLibraryClass;
-
-    Map cachedTreeElements =
-        cachedCompiler.enqueuer.resolution.resolvedElements;
-    cachedTreeElements.forEach((element, treeElements) {
-      if (element.getLibrary().isPlatformLibrary) {
-        compiler.enqueuer.resolution.resolvedElements[element] =
-            treeElements;
-      }
-    });
-  }
-  return compiler;
-}
diff --git a/site/try/src/compilation.dart b/site/try/src/compilation.dart
index d2cdbc6..d9b28af 100644
--- a/site/try/src/compilation.dart
+++ b/site/try/src/compilation.dart
@@ -14,9 +14,6 @@
     Worker,
     window;
 
-import 'dart:async' show
-    Timer;
-
 import 'dart:isolate' show
     ReceivePort,
     SendPort;
@@ -30,21 +27,19 @@
 
 import 'ui.dart' show
     buildButton,
+    interaction,
     outputDiv,
     outputFrame;
 
 import 'settings.dart' show
     alwaysRunInWorker,
+    incrementalCompilation,
     minified,
     onlyAnalyze,
     verboseCompiler;
 
-@lazy import 'caching_compiler.dart' as cacheCompiler;
-
-@lazy import 'compiler_isolate.dart';
-
-// const lazy = const DeferredLibrary('compiler_isolate');
-const lazy = null;
+import 'iframe_error_handler.dart' show
+    errorStream;
 
 /**
  * Scheme for recognizing files stored in memory.
@@ -78,7 +73,7 @@
   final String source;
   final Element console;
   final ReceivePort receivePort = new ReceivePort();
-  bool isCleared = false;
+  final Set<String> seenMessages = new Set<String>();
   bool isDone = false;
   bool usesDartHtml = false;
   Worker worker;
@@ -95,12 +90,6 @@
     return true;
   }
 
-  void clear() {
-    if (verboseCompiler) return;
-    if (!isCleared) console.nodes.clear();
-    isCleared = true;
-  }
-
   void start() {
     if (!shouldStartCompilation()) {
       receivePort.close();
@@ -108,15 +97,18 @@
     }
     if (current != null) current.dispose();
     current = this;
-    console.nodes.clear();
-    var options = ['--disable-type-inference'];
+    var options = [
+        '--analyze-main',
+        '--no-source-maps',
+    ];
     if (verboseCompiler) options.add('--verbose');
     if (minified) options.add('--minify');
     if (onlyAnalyze) options.add('--analyze-only');
+    if (incrementalCompilation.value) {
+      options.addAll(['--incremental-support', '--disable-type-inference']);
+    }
+    interaction.compilationStarting();
     compilerPort.send([['options', options], receivePort.sendPort]);
-    console.appendHtml('<i class="icon-spinner icon-spin"></i>');
-    console.appendText(' Compiling Dart program...\n');
-    outputFrame.style.display = 'none';
     receivePort.listen(onMessage);
     compilerPort.send([source, receivePort.sendPort]);
   }
@@ -147,11 +139,12 @@
   }
 
   onFail(_) {
-    clear();
-    consolePrint('Compilation failed');
+    // TODO(ahe): Call interaction.onCompilationFailed().
+    interaction.consolePrintLine('Compilation failed');
   }
 
   onDone(_) {
+    interaction.onCompilationDone();
     isDone = true;
     receivePort.close();
   }
@@ -160,7 +153,6 @@
   // web worker.  For example, Chrome and Firefox 21.
   onUrl(String url) {
     objectUrls.add(url);
-    clear();
     String wrapper = '''
 // Fool isolate_helper.dart so it does not think this is an isolate.
 var window = self;
@@ -172,50 +164,25 @@
     var wrapperUrl =
         Url.createObjectUrl(new Blob([wrapper], 'application/javascript'));
     objectUrls.add(wrapperUrl);
-    void retryInIframe(_) {
-      var frame = makeOutputFrame(url);
-      outputFrame.replaceWith(frame);
-      outputFrame = frame;
-      console.append(buildButton('Try in iframe', retryInIframe));
-    }
-    void onError(String errorMessage) {
-      console.appendText(errorMessage);
-      console.appendText(' ');
-      console.append(buildButton('Try in iframe', retryInIframe));
-      console.appendText('\n');
-    }
-    if (usesDartHtml && !alwaysRunInWorker) {
-      retryInIframe(null);
-    } else {
-      runInWorker(wrapperUrl, onError);
-    }
+
+    run(wrapperUrl, () => makeOutputFrame(url));
   }
 
   // This is called in browsers that do not support creating Object
   // URLs in a web worker.  For example, Safari and Firefox < 21.
   onCode(String code) {
-    clear();
-
-    void retryInIframe(_) {
+    IFrameElement makeIframe() {
       // The obvious thing would be to call [makeOutputFrame], but
       // Safari doesn't support access to Object URLs in an iframe.
 
-      var frame = new IFrameElement()
+      IFrameElement frame = new IFrameElement()
           ..src = 'iframe.html'
           ..style.width = '100%'
           ..style.height = '0px';
       frame.onLoad.listen((_) {
         frame.contentWindow.postMessage(['source', code], '*');
       });
-      outputFrame.replaceWith(frame);
-      outputFrame = frame;
-    }
-
-    void onError(String errorMessage) {
-      console.appendText(errorMessage);
-      console.appendText(' ');
-      console.append(buildButton('Try in iframe', retryInIframe));
-      console.appendText('\n');
+      return frame;
     }
 
     String codeWithPrint =
@@ -226,8 +193,29 @@
             new Blob([codeWithPrint], 'application/javascript'));
     objectUrls.add(url);
 
+    run(url, makeIframe);
+  }
+
+  void run(String url, IFrameElement makeIframe()) {
+    void retryInIframe() {
+      var frame = makeIframe();
+      frame.style
+          ..visibility = 'hidden'
+          ..position = 'absolute';
+      outputFrame.parent.insertBefore(frame, outputFrame);
+      outputFrame = frame;
+      errorStream(frame).listen(interaction.onIframeError);
+    }
+    void onError(String errorMessage) {
+      console
+          ..appendText(errorMessage)
+          ..appendText(' ')
+          ..append(buildButton('Try in iframe', (_) => retryInIframe()))
+          ..appendText('\n');
+    }
+    interaction.aboutToRun();
     if (usesDartHtml && !alwaysRunInWorker) {
-      retryInIframe(null);
+      retryInIframe();
     } else {
       runInWorker(url, onError);
     }
@@ -236,7 +224,7 @@
   void runInWorker(String url, void onError(String errorMessage)) {
     worker = new Worker(url)
         ..onMessage.listen((MessageEvent event) {
-          consolePrint(event.data);
+          interaction.consolePrintLine(event.data);
         })
         ..onError.listen((ErrorEvent event) {
           worker.terminate();
@@ -246,61 +234,28 @@
   }
 
   onDiagnostic(Map<String, dynamic> diagnostic) {
+    if (currentSource != source) return;
     String kind = diagnostic['kind'];
     String message = diagnostic['message'];
     if (kind == 'verbose info') {
-      if (verboseCompiler) {
-        consolePrint(message);
-      } else {
-        console.appendText('.');
-      }
+      interaction.verboseCompilerMessage(message);
       return;
     }
     String uri = diagnostic['uri'];
-    if (uri == null) {
-      clear();
-      consolePrint(message);
+    if (uri != '${PRIVATE_SCHEME}:/main.dart') {
+      interaction.consolePrintLine('$uri: [$kind] $message');
       return;
     }
-    if (uri != '${PRIVATE_SCHEME}:/main.dart') return;
-    if (currentSource != source) return;
     int begin = diagnostic['begin'];
     int end = diagnostic['end'];
     if (begin == null) return;
-    addDiagnostic(kind, message, begin, end);
+    if (seenMessages.add('$begin:$end: [$kind] $message')) {
+      // Guard against duplicated messages.
+      addDiagnostic(kind, message, begin, end);
+    }
   }
 
   onCrash(data) {
-    consolePrint(data);
-  }
-
-  void consolePrint(message) {
-    if (window.parent != window) {
-      // Test support.
-      // TODO(ahe): Use '/' instead of '*' when Firefox is upgraded to version
-      // 30 across build bots.  Support for '/' was added in version 29, and we
-      // support the two most recent versions.
-      window.parent.postMessage('$message\n', '*');
-    }
-    console.appendText('$message\n');
-  }
-}
-
-void compilerIsolate(SendPort port) {
-  // TODO(ahe): Restore when restoring deferred loading.
-  // lazy.load().then((_) => port.listen(compile));
-  ReceivePort replyTo = new ReceivePort();
-  port.send(replyTo.sendPort);
-  replyTo.listen((message) {
-    List list = message as List;
-    try {
-      compile(list[0], list[1]);
-    } catch (exception, stack) {
-      port.send('$exception\n$stack');
-    }
-  });
-  var notTrue = false; // Confuse the analyzer.
-  if (notTrue) {
-    cacheCompiler.compilerFor(null);
+    interaction.consolePrintLine(data);
   }
 }
diff --git a/site/try/src/compiler_isolate.dart b/site/try/src/compiler_isolate.dart
index d9981b3..844aaa9 100644
--- a/site/try/src/compiler_isolate.dart
+++ b/site/try/src/compiler_isolate.dart
@@ -13,13 +13,25 @@
 
 import 'package:compiler/compiler.dart' as compiler;
 
+import 'package:dart2js_incremental/dart2js_incremental.dart' show
+    reuseCompiler;
+
 const bool THROW_ON_ERROR = false;
 
-final cachedSources = new Map<Uri, String>();
+final cachedSources = new Map<Uri, Future<String>>();
 
 Uri sdkLocation;
 List options = [];
 
+var cachedCompiler;
+
+void notifyDartHtml(SendPort port) {
+  // Notify the controlling isolate (Try Dart UI) that the program imports
+  // dart:html. This is used to determine how to run the program: in an iframe
+  // or in a worker.
+  port.send('dart:html');
+}
+
 compile(source, SendPort replyTo) {
   if (sdkLocation == null) {
     // The first message received gives us the URI of this web app.
@@ -32,7 +44,7 @@
       }
       sdkLocation = Uri.parse('sdk:/sdk/');
       JSON.decode(request.responseText).forEach((file, content) {
-        cachedSources[Uri.parse(file)] = content;
+        cachedSources[Uri.parse(file)] = new Future<String>.value(content);
       });
     } else {
       sdkLocation = Uri.parse(source);
@@ -50,29 +62,34 @@
   }
   int charactersRead = 0;
   Future<String> inputProvider(Uri uri) {
-    if (uri.path.endsWith('/lib/html/dart2js/html_dart2js.dart')) {
-      replyTo.send('dart:html');
-    }
+    Future<String> future;
     if (uri.scheme == 'sdk') {
-      var value = cachedSources[uri];
-      charactersRead += value.length;
-      return new Future.value(value);
+      if (uri.path.endsWith('/lib/html/dart2js/html_dart2js.dart')) {
+        notifyDartHtml(replyTo);
+      }
+      future = cachedSources[uri];
     } else if (uri.scheme == 'http' || uri.scheme == 'https') {
-      var value = cachedSources.putIfAbsent(uri, () {
-        var request = new HttpRequest();
-        request.open('GET', '$uri', async: false);
-        request.send(null);
-        return request.responseText;
-      });
-      charactersRead += value.length;
-      return new Future.value(value);
+      future =
+          cachedSources.putIfAbsent(uri, () => HttpRequest.getString('$uri'));
     } else if ('$uri' == '$PRIVATE_SCHEME:/main.dart') {
-      charactersRead += source.length;
-      return new Future.value(source);
+      future = new Future<String>.value(source);
     } else if (uri.scheme == PRIVATE_SCHEME) {
-      return HttpRequest.getString('project${uri.path}');
+      future = HttpRequest.getString('project${uri.path}');
     }
-    throw new Exception('Error: Cannot read: $uri');
+    if (future == null) {
+      future = new Future<String>.error('$uri: Not found');
+    }
+    return future.then((String value) {
+      charactersRead += value.length;
+      return value;
+    }).catchError((Event event) {
+      var target = event.target;
+      if (target is HttpRequest) {
+        throw '$uri: ${target.statusText}';
+      } else {
+        throw event;
+      }
+    }, test: (error) => error is Event);
   }
   void handler(Uri uri, int begin, int end,
                String message, compiler.Diagnostic kind) {
@@ -85,40 +102,61 @@
       throw new Exception('Throw on error');
     }
   }
-  compiler.compile(Uri.parse('$PRIVATE_SCHEME:/main.dart'),
-                   sdkLocation,
-                   Uri.parse('packages/'),
-                   inputProvider,
-                   handler,
-                   options).then((js) {
-    try {
-      if (js == null) {
-        if (!options.contains('--analyze-only')) replyTo.send('failed');
-      } else {
-        var url;
-        if (options.contains('--verbose')) {
-          handler(null, 0, 0,
-                  'Compiled ${source.length}/${charactersRead} characters Dart'
-                  ' -> ${js.length} characters.',
-                  compiler.Diagnostic.VERBOSE_INFO);
-        }
-        try {
-          // At least Safari and Firefox do not support creating an
-          // object URL from a web worker.  MDN claims that it will be
-          // supported in Firefox 21.
-          url = Url.createObjectUrl(new Blob([js], 'application/javascript'));
-        } catch (_) {
-          // Ignored.
-        }
-        if (url != null) {
-          replyTo.send(['url', url]);
-        } else {
-          replyTo.send(['code', js]);
-        }
-      }
-    } catch (e, trace) {
-      replyTo.send(['crash', '$e, $trace']);
+  Stopwatch compilationTimer = new Stopwatch()..start();
+  cachedCompiler = reuseCompiler(
+      diagnosticHandler: handler,
+      inputProvider: inputProvider,
+      options: options,
+      cachedCompiler: cachedCompiler,
+      libraryRoot: sdkLocation,
+      packageRoot: Uri.base.resolve('/packages/'),
+      packagesAreImmutable: true);
+
+  cachedCompiler.run(Uri.parse('$PRIVATE_SCHEME:/main.dart')).then((success) {
+    compilationTimer.stop();
+    print('Compilation took ${compilationTimer.elapsed}');
+    if (cachedCompiler.libraries.containsKey('dart:html')) {
+      notifyDartHtml(replyTo);
     }
+    String js = cachedCompiler.assembledCode;
+    if (js == null) {
+      if (!options.contains('--analyze-only')) replyTo.send('failed');
+    } else {
+      var url;
+      handler(null, 0, 0,
+              'Compiled ${source.length}/${charactersRead} characters Dart'
+              ' -> ${js.length} characters.',
+              compiler.Diagnostic.VERBOSE_INFO);
+      try {
+        // At least Safari and Firefox do not support creating an
+        // object URL from a web worker.  MDN claims that it will be
+        // supported in Firefox 21.
+        url = Url.createObjectUrl(new Blob([js], 'application/javascript'));
+      } catch (_) {
+        // Ignored.
+      }
+      if (url != null) {
+        replyTo.send(['url', url]);
+      } else {
+        replyTo.send(['code', js]);
+      }
+    }
+  }).catchError((e, trace) {
+    replyTo.send(['crash', '$e, $trace']);
+  }).whenComplete(() {
     replyTo.send('done');
   });
 }
+
+void main(List<String> arguments, SendPort port) {
+  ReceivePort replyTo = new ReceivePort();
+  port.send(replyTo.sendPort);
+  replyTo.listen((message) {
+    try {
+      List list = message as List;
+      compile(list[0], list[1]);
+    } catch (exception, stack) {
+      port.send('$exception\n$stack');
+    }
+  });
+}
diff --git a/site/try/src/decoration.dart b/site/try/src/decoration.dart
index 930cbcb..663aeea 100644
--- a/site/try/src/decoration.dart
+++ b/site/try/src/decoration.dart
@@ -80,7 +80,7 @@
   }
   SpanElement result = new SpanElement()
       ..classes.addAll(classes)
-      ..style.opacity = '0.75';
+      ..style.fontWeight = 'normal';
   setShadowRoot(result, text);
   return result;
 }
diff --git a/site/try/src/editor.dart b/site/try/src/editor.dart
index db21ef9..615a853 100644
--- a/site/try/src/editor.dart
+++ b/site/try/src/editor.dart
@@ -15,6 +15,7 @@
 import 'ui.dart' show
     currentTheme,
     hackDiv,
+    interaction,
     mainEditorPane,
     observer,
     outputDiv;
@@ -33,6 +34,8 @@
 import 'shadow_root.dart' show
     getShadowRoot;
 
+import 'settings.dart' as settings;
+
 const String INDENT = '\u{a0}\u{a0}';
 
 Set<String> seenIdentifiers;
@@ -150,20 +153,54 @@
       if (offset <= begin && begin < newOffset) {
         hasSelection = node == anchorNode;
         anchorOffset = selection.anchorOffset;
-        Node marker = new Text("");
-        node.replaceWith(marker);
-        // TODO(ahe): Don't highlight everything in the node.  Find the
-        // relevant token (works for now as we create a node for each token,
-        // which is probably not great for performance).
+        var alert;
         if (kind == 'error') {
-          marker.replaceWith(diagnostic(node, error(message)));
+          alert = error(message);
         } else if (kind == 'warning') {
-          marker.replaceWith(diagnostic(node, warning(message)));
+          alert = warning(message);
         } else {
-          marker.replaceWith(diagnostic(node, info(message)));
+          alert = info(message);
         }
-        if (hasSelection) {
-          selection.collapse(node, anchorOffset);
+        Element parent = node.parent;
+        if (parent.classes.contains("diagnostic") &&
+            !interaction.oldDiagnostics.contains(parent)) {
+          Element other = parent.lastChild;
+          other.remove();
+          SpanElement wrapper = new SpanElement();
+          wrapper.style
+              ..fontWeight = 'normal';
+          var root = getShadowRoot(wrapper);
+          if (root is ShadowRoot) {
+            // When https://code.google.com/p/chromium/issues/detail?id=313458
+            // is fixed:
+            // var link = new LinkElement()
+            //     ..rel = "stylesheet"
+            //     ..type = "text/css"
+            //     ..href = "dartlang-style.css";
+            // root.append(link);
+            root.append(
+                new StyleElement()..text = '@import url(dartlang-style.css)');
+          }
+          root
+              ..append(other)
+              ..append(alert);
+          other.style.display = 'block';
+          alert.style.display = 'block';
+          parent.append(wrapper);
+        } else {
+          if (interaction.oldDiagnostics.contains(parent)) {
+            node.remove();
+            parent.replaceWith(node);
+          }
+          Node marker = new Text("");
+          node.replaceWith(marker);
+          // TODO(ahe): Don't highlight everything in the node.  Find the
+          // relevant token (works for now as we create a node for each token,
+          // which is probably not great for performance).
+          marker.replaceWith(diagnostic(node, alert));
+          if (hasSelection) {
+            selection.collapse(node, anchorOffset);
+          }
         }
         foundNode = true;
         return;
@@ -216,7 +253,11 @@
   if (tokenInfo == 'string') return currentTheme.string;
   if (tokenInfo == 'identifier') {
     seenIdentifiers.add(tokenValue);
-    return CodeCompletionDecoration.from(currentTheme.foreground);
+    Decoration decoration = currentTheme.foreground;
+    if (settings.enableCodeCompletion.value) {
+      decoration = CodeCompletionDecoration.from(decoration);
+    }
+    return decoration;
   }
   if (tokenInfo == 'keyword') return currentTheme.keyword;
   if (tokenInfo == 'comment') return currentTheme.singleLineComment;
diff --git a/site/try/src/iframe_error_handler.dart b/site/try/src/iframe_error_handler.dart
new file mode 100644
index 0000000..a1077be
--- /dev/null
+++ b/site/try/src/iframe_error_handler.dart
@@ -0,0 +1,96 @@
+// 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 trydart.iframe_error_handler;
+
+// TODO(ahe): Remove this import if issue 17936 is fixed.
+import 'dart:js' as hack;
+
+import 'dart:html' show
+    Event,
+    IFrameElement,
+    window;
+
+import 'dart:async' show
+    Stream,
+    StreamController;
+
+class ErrorMessage {
+  final String message;
+  final String filename;
+  final num lineno;
+  final num colno;
+  final String stack;
+
+  ErrorMessage(
+      this.message, this.filename, this.lineno, this.colno, this.stack);
+
+  String toString() {
+    String result = filename == null ? '' : filename;
+    if (lineno != null && lineno != 0 && !lineno.isNaN) {
+      result += ':$lineno';
+    }
+    if (colno != null && colno != 0 && !colno.isNaN) {
+      result += ':$colno';
+    }
+    if (message != null && !message.isEmpty) {
+      if (!result.isEmpty) {
+        result += ': ';
+      }
+      result += message;
+    }
+    if (stack != null && !stack.isEmpty) {
+      if (!result.isEmpty) {
+        result += '\n';
+      }
+      result += stack;
+    }
+    return result;
+  }
+}
+
+Stream<ErrorMessage> errorStream(IFrameElement iframe) {
+  StreamController<ErrorMessage> controller =
+      new StreamController<ErrorMessage>();
+  void onError(
+      String message,
+      String filename,
+      int lineno,
+      [int colno,
+       error]) {
+    // See:
+    // https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror
+    String stack;
+    if (error != null) {
+      var jsStack = error['stack'];
+      if (jsStack != null) {
+        stack = hack.context.callMethod('String', [jsStack]);
+      }
+    }
+    controller.add(new ErrorMessage(message, filename, lineno, colno, stack));
+  }
+
+  void installErrorHandler() {
+    // This method uses dart:js to install an error event handler on the content
+    // window of [iframe]. This is a workaround for http://dartbug.com/17936.
+    var iframeProxy = new hack.JsObject.fromBrowserObject(iframe);
+    var contentWindowProxy = iframeProxy['contentWindow'];
+    if (contentWindowProxy == null) {
+      String message =
+          'No contentWindow, call this method *after* adding iframe to'
+          ' document.';
+      window.console.error(message);
+      throw message;
+    }
+
+    // Note: we have two options, use "iframe.contentWindow.onerror = ..." or
+    // "iframe.contentWindow.addEventListener('error', ...)".  The former seems
+    // to provide more details on both Chrome and Firefox (which provides no
+    // information at all in error events).
+    contentWindowProxy['onerror'] = onError;
+  }
+  iframe.onLoad.listen((Event event) => installErrorHandler());
+  installErrorHandler();
+  return controller.stream;
+}
diff --git a/site/try/src/interaction_manager.dart b/site/try/src/interaction_manager.dart
index 4e1d454..dba6d55 100644
--- a/site/try/src/interaction_manager.dart
+++ b/site/try/src/interaction_manager.dart
@@ -43,6 +43,7 @@
     mainEditorPane,
     observer,
     outputDiv,
+    outputFrame,
     statusDiv;
 
 import 'decoration.dart' show
@@ -75,16 +76,34 @@
     removeShadowRootPolyfill,
     setShadowRoot;
 
+import 'iframe_error_handler.dart' show
+    ErrorMessage;
+
 const String TRY_DART_NEW_DEFECT =
     'https://code.google.com/p/dart/issues/entry'
     '?template=Try+Dart+Internal+Error';
 
-const Duration HEARTBEAT_INTERVAL = const Duration(milliseconds: 500);
+/// How frequently [InteractionManager.onHeartbeat] is called.
+const Duration HEARTBEAT_INTERVAL = const Duration(milliseconds: 50);
 
+/// Determines how frequently "project" files are saved.  The time is measured
+/// from the time of last modification.
 const Duration SAVE_INTERVAL = const Duration(seconds: 5);
 
+/// Determines how frequently the compiler is invoked.  The time is measured
+/// from the time of last modification.
 const Duration COMPILE_INTERVAL = const Duration(seconds: 1);
 
+/// Determines how frequently the compiler is invoked in "live" mode.  The time
+/// is measured from the time of last modification.
+const Duration LIVE_COMPILE_INTERVAL = const Duration(seconds: 0);
+
+/// Determines if a compilation is slow.  The time is measured from the last
+/// compilation started.  If a compilation is slow, progress information is
+/// displayed to the user, but the console is untouched if the compilation
+/// finished quickly.  The purpose is to reduce flicker in the UI.
+const Duration SLOW_COMPILE = const Duration(seconds: 1);
+
 /**
  * UI interaction manager for the entire application.
  */
@@ -107,6 +126,9 @@
 
   InteractionManager.internal();
 
+  // TODO(ahe): Remove this.
+  Set<AnchorElement> get oldDiagnostics;
+
   void onInput(Event event);
 
   // TODO(ahe): Rename to onKeyDown (as it is called in response to keydown
@@ -128,8 +150,30 @@
   /// Called when notified about a project file changed (on the server).
   void onProjectFileFsEvent(MessageEvent e);
 
-  /// Called every 500ms.
+  /// Called every [HEARTBEAT_INTERVAL].
   void onHeartbeat(Timer timer);
+
+  /// Called by [:window.onMessage.listen:].
+  void onWindowMessage(MessageEvent event);
+
+  void onCompilationFailed();
+
+  void onCompilationDone();
+
+  /// Called when a compilation is starting, but just before sending the
+  /// initiating message to the compiler isolate.
+  void compilationStarting();
+
+  // TODO(ahe): Remove this from InteractionManager, but not from InitialState.
+  void consolePrintLine(line);
+
+  /// Called just before running a freshly compiled program.
+  void aboutToRun();
+
+  /// Called when an error occurs when running user code in an iframe.
+  void onIframeError(ErrorMessage message);
+
+  void verboseCompilerMessage(String message);
 }
 
 /**
@@ -144,10 +188,15 @@
 
   final Queue<CompilationUnit> unitsToSave = new Queue<CompilationUnit>();
 
+  /// Tracks time since last modification of a "project" file.
   final Stopwatch saveTimer = new Stopwatch();
 
+  /// Tracks time since last modification.
   final Stopwatch compileTimer = new Stopwatch();
 
+  /// Tracks elapsed time of current compilation.
+  final Stopwatch elapsedCompilationTime = new Stopwatch();
+
   CompilationUnit currentCompilationUnit =
       // TODO(ahe): Don't use a fake unit.
       new CompilationUnit('fake', '');
@@ -156,6 +205,18 @@
 
   Completer<String> completeSaveOperation;
 
+  bool shouldClearConsole = false;
+
+  Element compilerConsole;
+
+  bool isFirstCompile = true;
+
+  final Set<AnchorElement> oldDiagnostics = new Set<AnchorElement>();
+
+  final Duration compileInterval = settings.live.value
+      ? LIVE_COMPILE_INTERVAL
+      : COMPILE_INTERVAL;
+
   InteractionContext()
       : super.internal() {
     state = new InitialState(this);
@@ -213,11 +274,34 @@
   }
 
   void onHeartbeat(Timer timer) => state.onHeartbeat(timer);
+
+  void onWindowMessage(MessageEvent event) => state.onWindowMessage(event);
+
+  void onCompilationFailed() => state.onCompilationFailed();
+
+  void onCompilationDone() => state.onCompilationDone();
+
+  void compilationStarting() => state.compilationStarting();
+
+  void consolePrintLine(line) => state.consolePrintLine(line);
+
+  void aboutToRun() => state.aboutToRun();
+
+  void onIframeError(ErrorMessage message) => state.onIframeError(message);
+
+  void verboseCompilerMessage(String message) {
+    return state.verboseCompilerMessage(message);
+  }
 }
 
 abstract class InteractionState implements InteractionManager {
   InteractionContext get context;
 
+  // TODO(ahe): Remove this.
+  Set<AnchorElement> get oldDiagnostics {
+    throw 'Use context.oldDiagnostics instead';
+  }
+
   void set state(InteractionState newState);
 
   void onStateChanged(InteractionState previous) {
@@ -493,13 +577,19 @@
       saveUnits();
     }
     if (!settings.compilationPaused &&
-        context.compileTimer.elapsed > COMPILE_INTERVAL) {
+        context.compileTimer.elapsed > context.compileInterval) {
       if (startCompilation()) {
         context.compileTimer
             ..stop()
             ..reset();
       }
     }
+
+    if (context.elapsedCompilationTime.elapsed > SLOW_COMPILE) {
+      if (context.compilerConsole.parent == null) {
+        outputDiv.append(context.compilerConsole);
+      }
+    }
   }
 
   void saveUnits() {
@@ -527,6 +617,132 @@
     }
     setupCompleter();
   }
+
+  void onWindowMessage(MessageEvent event) {
+    if (event.source is! WindowBase || event.source == window) {
+      return onBadMessage(event);
+    }
+    if (event.data is List) {
+      List message = event.data;
+      if (message.length > 0) {
+        switch (message[0]) {
+          case 'scrollHeight':
+            return onScrollHeightMessage(message[1]);
+        }
+      }
+      return onBadMessage(event);
+    } else {
+      return consolePrintLine(event.data);
+    }
+  }
+
+  /// Called when an exception occurs in an iframe.
+  void onErrorMessage(ErrorMessage message) {
+    outputDiv.appendText('$message\n');
+  }
+
+  /// Called when an iframe is modified.
+  void onScrollHeightMessage(int scrollHeight) {
+    window.console.log('scrollHeight = $scrollHeight');
+    if (scrollHeight > 8) {
+      outputFrame.style
+          ..height = '${scrollHeight}px'
+          ..visibility = ''
+          ..position = '';
+      while (outputFrame.nextNode is IFrameElement) {
+        outputFrame.nextNode.remove();
+      }
+    }
+  }
+
+  void onBadMessage(MessageEvent event) {
+    window.console
+        ..groupCollapsed('Bad message')
+        ..dir(event)
+        ..log(event.source.runtimeType)
+        ..groupEnd();
+  }
+
+  void consolePrintLine(line) {
+    if (context.shouldClearConsole) {
+      context.shouldClearConsole = false;
+      outputDiv.nodes.clear();
+    }
+    if (window.parent != window) {
+      // Test support.
+      // TODO(ahe): Use '/' instead of '*' when Firefox is upgraded to version
+      // 30 across build bots.  Support for '/' was added in version 29, and we
+      // support the two most recent versions.
+      window.parent.postMessage('$line\n', '*');
+    }
+    outputDiv.appendText('$line\n');
+  }
+
+  void onCompilationFailed() {
+  }
+
+  void onCompilationDone() {
+    context.isFirstCompile = false;
+    context.elapsedCompilationTime.stop();
+    Duration compilationDuration = context.elapsedCompilationTime.elapsed;
+    context.elapsedCompilationTime.reset();
+    print('Compilation took $compilationDuration.');
+    if (context.compilerConsole.parent != null) {
+      context.compilerConsole.remove();
+    }
+    for (AnchorElement diagnostic in context.oldDiagnostics) {
+      if (diagnostic.parent != null) {
+        // Problem fixed, remove the diagnostic.
+        diagnostic.replaceWith(new Text(getText(diagnostic)));
+      }
+    }
+    context.oldDiagnostics.clear();
+    observer.takeRecords(); // Discard mutations.
+  }
+
+  void compilationStarting() {
+    var progress = new SpanElement()
+        ..appendHtml('<i class="icon-spinner icon-spin"></i>')
+        ..appendText(' Compiling Dart program.');
+    if (settings.verboseCompiler) {
+      progress.appendText('..');
+    }
+    context.compilerConsole = new SpanElement()
+        ..append(progress)
+        ..appendText('\n');
+    context.shouldClearConsole = true;
+    context.elapsedCompilationTime
+        ..start()
+        ..reset();
+    if (context.isFirstCompile) {
+      outputDiv.append(context.compilerConsole);
+    }
+    context.oldDiagnostics
+        ..clear()
+        ..addAll(mainEditorPane.querySelectorAll('a.diagnostic'));
+  }
+
+  void aboutToRun() {
+    context.shouldClearConsole = true;
+  }
+
+  void onIframeError(ErrorMessage message) {
+    // TODO(ahe): Consider replacing object URLs with something like <a
+    // href='...'>out.js</a>.
+    // TODO(ahe): Use source maps to translate stack traces.
+    consolePrintLine(message);
+  }
+
+  void verboseCompilerMessage(String message) {
+    if (settings.verboseCompiler) {
+      context.compilerConsole.appendText('$message\n');
+    } else {
+      if (isCompilerStageMarker(message)) {
+        Element progress = context.compilerConsole.firstChild;
+        progress.appendText('.');
+      }
+    }
+  }
 }
 
 Future<String> getString(uri) {
@@ -976,3 +1192,14 @@
     element.remove();
   }
 }
+
+bool isCompilerStageMarker(String message) {
+  return
+      message.startsWith('Package root is ') ||
+      message.startsWith('Compiling ') ||
+      message == "Resolving..." ||
+      message.startsWith('Resolved ') ||
+      message == "Inferring types..." ||
+      message == "Compiling..." ||
+      message.startsWith('Compiled ');
+}
diff --git a/site/try/src/isolate_legacy.dart b/site/try/src/isolate_legacy.dart
deleted file mode 100644
index 4b2dd6e..0000000
--- a/site/try/src/isolate_legacy.dart
+++ /dev/null
@@ -1,17 +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 trydart.isolate_legacy;
-
-import 'dart:isolate';
-
-ReceivePort spawnFunction(void function(SendPort port)) {
-  ReceivePort port = new ReceivePort();
-  Isolate.spawn(function, port.sendPort);
-  return port;
-}
-
-ReceivePort spawnDomFunction(void function(SendPort port)) {
-  throw 'spawnDomFunction is no more';
-}
diff --git a/site/try/src/leap.dart b/site/try/src/leap.dart
index 1504c6e..4a9d0c6 100644
--- a/site/try/src/leap.dart
+++ b/site/try/src/leap.dart
@@ -11,6 +11,7 @@
     window;
 
 import 'dart:isolate' show
+    Isolate,
     ReceivePort,
     SendPort;
 
@@ -19,10 +20,6 @@
     compilerPort,
     currentSource;
 
-import 'isolate_legacy.dart' show
-    spawnDomFunction,
-    spawnFunction;
-
 import 'samples.dart' show
     EXAMPLE_HELLO;
 
@@ -36,19 +33,6 @@
 
 int count = 0;
 
-const String HAS_NON_DOM_HTTP_REQUEST = 'spawnFunction supports HttpRequest';
-const String NO_NON_DOM_HTTP_REQUEST =
-    'spawnFunction does not support HttpRequest';
-
-checkHttpRequest(SendPort replyTo) {
-  try {
-    new HttpRequest();
-    replyTo.send(HAS_NON_DOM_HTTP_REQUEST);
-  } catch (e, trace) {
-    replyTo.send(NO_NON_DOM_HTTP_REQUEST);
-  }
-}
-
 main() {
   UserOption.storage = window.localStorage;
   if (currentSource == null) {
@@ -56,13 +40,10 @@
   }
 
   buildUI();
-  spawnFunction(checkHttpRequest).first.then((reply) {
-    ReceivePort port;
-    if (reply == HAS_NON_DOM_HTTP_REQUEST) {
-      port = spawnFunction(compilerIsolate);
-    } else {
-      port = spawnDomFunction(compilerIsolate);
-    }
+  ReceivePort port = new ReceivePort();
+  Isolate.spawnUri(
+      Uri.base.resolve('compiler_isolate.dart.js'),
+      const <String>[], port.sendPort).then((Isolate isolate) {
     LinkElement link = querySelector('link[rel="dart-sdk"]');
     String sdk = link.href;
     print('Using Dart SDK: $sdk');
diff --git a/site/try/src/messages.dart b/site/try/src/messages.dart
index 830f19f..62f4fb4 100644
--- a/site/try/src/messages.dart
+++ b/site/try/src/messages.dart
@@ -32,4 +32,7 @@
 
   'theme':
     'Theme:',
+
+  'incrementalCompilation':
+    'Enable incremental compilation (EXPERIMENTAL)',
 };
diff --git a/site/try/src/run.dart b/site/try/src/run.dart
index 3eae698..e453a70 100644
--- a/site/try/src/run.dart
+++ b/site/try/src/run.dart
@@ -35,37 +35,37 @@
 
 const String OUTPUT_HELPER = r'''
 function dartPrint(msg) {
+  // Send a message to the main Try Dart window.
   window.parent.postMessage(String(msg), "*");
 }
 
 function dartMainRunner(main) {
+  // Store the current height (of an empty document).  This implies that the
+  // main Try Dart application is only notified if the document is actually
+  // changed.
+  var previousScrollHeight = document.documentElement.scrollHeight;
+
+  function postScrollHeight(mutations, observer) {
+    var scrollHeight = document.documentElement.scrollHeight;
+    if (scrollHeight !== previousScrollHeight) {
+      previousScrollHeight = scrollHeight;
+      window.parent.postMessage(["scrollHeight", scrollHeight], "*");
+    }
+  }
+
+  var MutationObserver =
+      window.MutationObserver ||
+      window.WebKitMutationObserver ||
+      window.MozMutationObserver;
+
+  // Listen to any changes to the DOM.
+  new MutationObserver(postScrollHeight).observe(
+      document.documentElement,
+      { attributes: true,
+        childList: true,
+        characterData: true,
+        subtree: true });
+
   main();
 }
-
-window.onerror = function (message, url, lineNumber) {
-  window.parent.postMessage(
-      ["error", {message: message, url: url, lineNumber: lineNumber}], "*");
-};
-
-(function () {
-
-function postScrollHeight() {
-  window.parent.postMessage(
-      ["scrollHeight", document.documentElement.scrollHeight], "*");
-}
-
-var observer = new (window.MutationObserver ||
-                    window.WebKitMutationObserver ||
-                    window.MozMutationObserver)(function(mutations) {
-  postScrollHeight()
-  window.setTimeout(postScrollHeight, 500);
-});
-
-observer.observe(
-    document.body,
-    { attributes: true,
-      childList: true,
-      characterData: true,
-      subtree: true });
-})();
 ''';
diff --git a/site/try/src/settings.dart b/site/try/src/settings.dart
index 58b306e74..9778206 100644
--- a/site/try/src/settings.dart
+++ b/site/try/src/settings.dart
@@ -90,6 +90,11 @@
 const BooleanUserOption enableCodeCompletion =
     const BooleanUserOption('enableCodeCompletion', isHidden: true);
 
+const BooleanUserOption incrementalCompilation =
+    const BooleanUserOption('incrementalCompilation');
+
+const BooleanUserOption live = const BooleanUserOption('live', isHidden: true);
+
 const List<UserOption> options = const <UserOption>[
     _alwaysRunInWorker,
     _verboseCompiler,
@@ -97,8 +102,10 @@
     _onlyAnalyze,
     _enableDartMind,
     _compilationPaused,
+    incrementalCompilation,
+    live,
+    enableCodeCompletion,
     _codeFont,
     _theme,
     _currentSample,
-    enableCodeCompletion,
   ];
diff --git a/site/try/src/ui.dart b/site/try/src/ui.dart
index 2909888..e678f38 100644
--- a/site/try/src/ui.dart
+++ b/site/try/src/ui.dart
@@ -92,6 +92,7 @@
   Function action = codeCallbacks[id];
   if (action != null) action(event);
   outputFrame.style.display = 'none';
+  outputDiv.nodes.clear();
 }
 
 buildUI() {
@@ -198,27 +199,7 @@
   var settingsElement = document.getElementById('settings');
   settingsElement.onClick.listen(openSettings);
 
-  window.onMessage.listen((MessageEvent event) {
-    if (event.data is List) {
-      List message = event.data;
-      if (message.length > 0) {
-        switch (message[0]) {
-        case 'error':
-          Map diagnostics = message[1];
-          String url = diagnostics['url'];
-          outputDiv.appendText('${diagnostics["message"]}\n');
-          return;
-        case 'scrollHeight':
-          int scrollHeight = message[1];
-          if (scrollHeight > 0) {
-            outputFrame.style.height = '${scrollHeight}px';
-          }
-          return;
-        }
-      }
-    }
-    outputDiv.appendText('${event.data}\n');
-  });
+  window.onMessage.listen(interaction.onWindowMessage);
 
   observer = new MutationObserver(interaction.onMutation)
       ..observe(
diff --git a/site/try/src/user_option.dart b/site/try/src/user_option.dart
index ce802a4..25c0f0f 100644
--- a/site/try/src/user_option.dart
+++ b/site/try/src/user_option.dart
@@ -4,6 +4,23 @@
 
 library trydart.userOption;
 
+/// Persistent user-configurable option.
+///
+/// Options included in [options] in settings.dart will automatically be
+/// included in the settings UI unless [isHidden] is true.
+///
+/// The value of an option is persisted in [storage] which is normally the
+/// browser's "localStorage", and [name] is a key in "localStorage".  This
+/// means that hidden options can be controlled by opening the JavaScript
+/// console and evaluate:
+///
+///   localStorage['name'] = value // or
+///   localStorage.name = value
+///
+/// An option can be reset to the default value using:
+///
+///   delete localStorage['name'] // or
+///   delete localStorage.name
 class UserOption {
   final String name;
 
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index 1baf670..076b009 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -39,17 +39,6 @@
 # co19 issue #615: Expect import missing
 LibTest/collection/LinkedList/LinkedList_A01_t01: Fail, OK
 
-# co19 issue #685: Non-bool operand of && and || produces a static type warning
-Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t02: Fail, OK
-
-# co19 issue #686: Abstract methods are allowed in concrete classes if they override a concrete method
-Language/07_Classes/07_Classes_A03_t06: Fail, OK
-Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A03_t04: Fail, OK
-Language/12_Expressions/16_Getter_Lookup_A02_t05: Fail, OK
-Language/12_Expressions/16_Getter_Lookup_A02_t06: Fail, OK
-
-Language/07_Classes/4_Abstract_Instance_Members_A07_t02: Fail # Issue 18914
-
 LibTest/isolate/IsolateStream/any_A01_t01: Fail # co19-roll r706: Please triage this failure.
 LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail # co19-roll r706: Please triage this failure.
 LibTest/isolate/IsolateStream/contains_A01_t01: Fail # co19-roll r706: Please triage this failure.
@@ -166,6 +155,7 @@
 LibTest/math/Point/operator_subtraction_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
 WebPlatformTest/dom/events/event_constants/constants_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
 
+# co19-roll r722
 LayoutTests/fast/dom/HTMLAnchorElement/anchor-ismap-crash_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-rebase_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLBaseElement/href-attribute-resolves-with-respect-to-document_t01: StaticWarning # co19-roll r722: Please triage this failure.
@@ -225,3 +215,58 @@
 WebPlatformTest/dom/nodes/Node-isEqualNode_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-parentNode_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-replaceChild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+
+# co19-roll r738
+Language/07_Classes/4_Abstract_Instance_Members_A07_t02: MissingStaticWarning # co19-roll r738: Please triage this failure.
+Language/07_Classes/07_Classes_A03_t06: MissingStaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/atob-btoa_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/replaceable_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-scroll-arguments_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/characterdata-api-arguments_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-cached-import-rule_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-insert-import-rule-twice_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-insert-import-rule_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-deleteRule-update_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-functions_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-insertRule-update_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-rule-functions_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/destroy-selected-radio-button-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-url-change_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-url-list_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/implementation-api-args_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/javascript-backslash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/location-missing-arguments_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/option-properties_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/remove-named-attribute-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/Event.bubbles.false_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.head_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/the-audio-element/audio_constructor_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: StaticWarning # co19-roll r738: Please triage this failure.
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 2561cc9..b9f6ace 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -3,6 +3,8 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2analyzer ]
+LayoutTests/fast/dom/Range/range-comparePoint_t01: Crash # co19 issue 692
+LayoutTests/fast/dom/Range/range-isPointInRange_t01: Crash # co19 issue 692
 
 LibTest/core/RegExp/firstMatch_A01_t01: Fail
 
@@ -39,14 +41,8 @@
 # co19 issue #615: Expect import missing
 LibTest/collection/LinkedList/LinkedList_A01_t01: Fail, OK
 
-# co19 issue #685: Non-bool operand of && and || produces a static type warning
-Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t02: Fail, OK
-
 # co19 issue #686: Abstract methods are allowed in concrete classes if they override a concrete method
 Language/07_Classes/07_Classes_A03_t06: Fail, OK
-Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A03_t04: Fail, OK
-Language/12_Expressions/16_Getter_Lookup_A02_t05: Fail, OK
-Language/12_Expressions/16_Getter_Lookup_A02_t06: Fail, OK
 
 Language/07_Classes/4_Abstract_Instance_Members_A07_t02: Fail # Issue 18914
 
@@ -226,5 +222,56 @@
 WebPlatformTest/dom/nodes/Node-parentNode_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-replaceChild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 
-LayoutTests/fast/dom/Range/range-comparePoint_t01: Crash
-LayoutTests/fast/dom/Range/range-isPointInRange_t01: Crash
+# co19-roll r738.
+LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/atob-btoa_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/replaceable_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-scroll-arguments_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/characterdata-api-arguments_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-cached-import-rule_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-insert-import-rule-twice_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-insert-import-rule_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-deleteRule-update_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-functions_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-insertRule-update_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-rule-functions_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/destroy-selected-radio-button-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-url-change_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-url-list_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/implementation-api-args_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/javascript-backslash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/location-missing-arguments_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/option-properties_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/remove-named-attribute-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LibTest/typed_data/ByteData/buffer_A01_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/Event.bubbles.false_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.head_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/the-audio-element/audio_constructor_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: StaticWarning # co19-roll r738: Please triage this failure.
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index a421a89..0d87424 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -14,6 +14,9 @@
 # Tests that fail everywhere, including the analyzer.
 
 LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19 issue 668
+LibTest/typed_data/ByteData/buffer_A01_t01: Fail # co19 r736 bug - sent comment.
+
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A01_t06: Fail, Pass, OK # co19 issue 695
 
 # These tests are obsolete and need updating.
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-002_t01: Skip # Issue 19019
@@ -21,6 +24,9 @@
 
 [ $compiler != dartanalyzer && $compiler != dart2analyzer ]
 # Tests that fail on every runtime, but not on the analyzer.
+
+LibTest/core/Uri/fragment_A01_t01: Fail # assumes space valid in fragment.
+
 LibTest/isolate/ReceivePort/asBroadcastStream_A02_t01: Fail # co19 issue 687
 LibTest/async/Stream/asBroadcastStream_A02_t01: Fail # co19 issue 687
 
@@ -41,9 +47,6 @@
 LibTest/math/cos_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/tan_A01_t01: PASS, FAIL, OK  # co19 issue 44
 
-LibTest/math/MutableRectangle/MutableRectangle_A01_t01: RuntimeError # co19 issue 674
-LibTest/math/Rectangle/Rectangle_A01_t01: RuntimeError # co19 issue 674
-
 LibTest/core/Expando/Expando_A03_t01: RuntimeError # Issue 17735
 LibTest/core/Expando/Expando_A03_t03: RuntimeError # Issue 17735
 LibTest/core/Expando/Expando_A03_t04: RuntimeError # Issue 17735
@@ -87,9 +90,3 @@
 [ $compiler != dartanalyzer && $compiler != dart2analyzer && $checked ]
 LibTest/collection/DoubleLinkedQueue/removeFirst_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
-LibTest/math/MutableRectangle/boundingBox_A01_t01: RuntimeError # co19 issue 675
-LibTest/math/MutableRectangle/boundingBox_A01_t02: RuntimeError # co19 issue 675
-LibTest/math/MutableRectangle/intersection_A01_t01: RuntimeError # co19 issue 675
-
-[ $compiler == dart2js ]
-LibTest/isolate/Isolate/spawn_A01_t04: RuntimeError # co19 issue 688
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index be3eb8d..e832dee 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -12,8 +12,6 @@
 
 Language/13_Statements/04_Local_Function_Declaration_A04_t01: Fail, MissingCompileTimeError # co19-roll r607: Please triage this failure
 
-LibTest/core/Symbol/Symbol_A01_t02: CompileTimeError # co19-roll r607: Please triage this failure
-
 Language/12_Expressions/12_Instance_Creation/1_New_A04_t02: RuntimeError # co19-roll r607: Please triage this failure
 Language/12_Expressions/17_Getter_Invocation_A07_t02: Pass, RuntimeError # co19-roll r607: Please triage this failure
 LibTest/core/Invocation/memberName_A01_t01: Pass, RuntimeError # co18-roll r607: Please triage this failure
@@ -63,6 +61,7 @@
 LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Int64List/buffer_A01_t01: Fail # co19 issue 694
 
 [ $compiler == dart2dart && $system == windows ]
 LibTest/core/double/operator_remainder_A01_t04: Fail # Result is NaN
@@ -75,7 +74,6 @@
 LibTest/math/asin_A01_t01: Fail, OK # co19 issue 44
 LibTest/math/atan_A01_t01: Fail, OK # co19 issue 44
 
-
 [ $compiler == dart2dart ]
 Language/03_Overview/1_Scoping_A02_t28: Fail # co19-roll r559: Please triage this failure
 Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
@@ -108,9 +106,6 @@
 Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t11: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t01: crash # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t02: crash # co19-roll r546: Please triage this failure
 Language/15_Types/5_Function_Types_A06_t01: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 8de3045..d79cff9 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -10,6 +10,8 @@
 LibTest/core/Uri/encodeFull_A01_t02: Skip
 LibTest/core/Uri/encodeQueryComponent_A01_t02: Skip
 LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-enumeration_t01: RuntimeError # co19-roll r738: Please triage this failure.
 
 # Crashes first, please. Then untriaged bugs. There is a section below
 # for co19 bugs.
@@ -730,6 +732,284 @@
 WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttribute_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
 
+LayoutTests/fast/dom/52776_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/allowed-children_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/anchor-origin_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/assertion-on-node-removal_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/blur-contenteditable_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/boolean-attribute-reflection_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/click-method-on-html-element_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/comment-not-documentElement_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/computed-style-set-property_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/containerNode_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/createDocumentType2_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/createDocumentType-ownerDocument_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/createElementNS-namespace-errors_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/createElementNS_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/createElement_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-delete-doc_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-innerHTML_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-functions_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-selectorText_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-set-property-exception_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-shorthand-common-value_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/constructor-calls-created-synchronously_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/document-register-basic_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/document-register-namespace_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/document-register-on-create-callback_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/document-register-type-extensions_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/element-names_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/element-type_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/element-upgrade_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/invalid-type-extension-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/lifecycle-created-createElement-recursion_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/unresolved-pseudoclass_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dataset_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/delete-contents_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/document-importNode-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/document-set-title-mutations_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/document-set-title-no-child-on-empty_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/document-set-title-no-reuse_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dom-parse-serialize-display_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dom-parse-serialize_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dom-parse-serialize-xmldecl_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/fragment-activation-focuses-target_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementById-consistency2_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementById-consistency3_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementById-consistency4_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementById-consistency5_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementById-consistency_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getelementbyname-invalidation_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementsByClassName/010_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementsByClassName/011_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementsByClassName/014_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getelementsbyname-invalidation-cache_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-size-property_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/image-object_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/implementation-api-args_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/importNodeHTML_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/importNodeXML_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/jsDevicePixelRatio_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/length-attribute-mapping_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/location-hash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/navigator-userAgent_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/navigator-vendorSub_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/node-iterator-with-doctype-root_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/offset-position-writing-modes_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/option-properties_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/partial-layout-non-overlay-scrollbars_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/script-innerHTML_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/caseID-almost-strict_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/caseID_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/caseTagX_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/id-fastpath-almost-strict_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/id-fastpath-strict_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/serialize-attribute_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/setAttributeNS-namespace-errors_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/base-in-shadow-tree_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-element-api_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-element-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-element-includer_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-element-outside-shadow-style_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/custom-pseudo-in-selector-api_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/distribution-for-event-path_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/form-in-shadow_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/getComputedStyle-composed-parent-dirty_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/get-element-by-id-in-shadow-mutation_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-wrapper-reclaimed_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/offsetWidth-host-style-change_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/reinsert-insertion-point_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/remove-and-insert-style_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash-2_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-aware-shadow-root_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowdom-dynamic-styling_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowdom-for-input-spellcheck_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowdom-for-unknown-with-form_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-element-inactive_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-element_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowroot-clonenode_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowroot-keyframes_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-root-node-list_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-root-text-child_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-ul-li_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/sibling-rules-dynamic-changes_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/style-insertion-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/style-sharing-sibling-shadow_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/style-sharing-styles-in-older-shadow-roots_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/title-element-in-shadow_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Text/next-element-sibling_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Text/normalize-crash-in-spell-checker_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Text/previous-element-sibling_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/atob-btoa_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/getMatchedCSSRules-null-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-invalid-pseudo-elements_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements-complex_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/invalid-protocol_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/XMLSerializer-attribute-entities_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/XMLSerializer-attribute-namespaces_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/XMLSerializer-element-ns-no-reemit_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/dom/ranges/Range-attributes_t02: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/dom/ranges/Range-comparePoint_t02: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/dom/ranges/Range-comparePoint_t03: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/dom/ranges/Range-detach_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-case_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-id_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-newelements_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-param_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t05: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t02: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t04: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t05: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t06: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/disabled-elements/disabledElement_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/addTextTrack_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/textTracks_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/kind_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/label_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/readyState_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/srclang_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/src_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/track_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/kind_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formaction_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/selection-not-application-textarea_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-fieldset-element/HTMLFieldSetElement_t01: RuntimeError # co19-roll r738: Please triage this failure.
+
+
+
+LayoutTests/fast/dom/gc-image-element-2_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/background-shorthand-csstext_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/client-width-height-quirks_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/clone-node-form-elements_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/clone-node-form-elements-with-attr_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-cached-import-rule_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-insert-import-rule_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-insert-import-rule-twice_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-deleteRule-update_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-insertRule-update_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dom-instanceof_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/domtimestamp-is-number_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/empty-hash-and-search_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementsByClassName/dumpNodeList_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-url-change_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-url-list_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/id-attribute-with-namespace-crash_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/insert-span-into-long-text-bug-28245_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/javascript-backslash_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/left-overflow-in-ltr_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/remove-body-during-body-replacement_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/bug-17313_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/not-supported-namespace-in-selector_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/setAttribute-using-initial-input-value_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/access-document-of-detached-stylesheetlist-crash_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-overridden_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-with-host-pseudo-class_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/distribution-crash_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/distribution-update-recalcs-style_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/elementfrompoint_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/event-path_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/get-distributed-nodes-orphan_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/getelementbyid-in-orphan_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/getelementbyid-shadow_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/insertion-point-list-menu-crash_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/nested-reprojection-inconsistent_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-disable_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-root-append_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/style-of-distributed-node_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-style-2_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-style_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/discarded-sheet-owner-null_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/getMatchedCSSRules-nested-rules_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/getMatchedCSSRules-parent-stylesheets_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Skip # Times out or fails, co19-roll r738: Please triage this failure.
+
 [ $compiler == dart2js && $runtime == jsshell ]
 LibTest/core/Map/Map_class_A01_t04: Pass, Slow # Issue 8096
 LibTest/core/double/round_A01_t01: RuntimeError # co19-roll r706: Please triage this failure
@@ -793,8 +1073,6 @@
 # can understand so he can file a bug later.
 #
 [ $compiler == dart2js ]
-LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: fail # Call to deferred non-loaded functions does not throw NoSuchMethodError.
-
 Language/03_Overview/2_Privacy_A01_t09: RuntimeError, OK # co19 issue 198
 Language/03_Overview/2_Privacy_A01_t11: Pass, OK # co19 issue 316
 Language/06_Functions/4_External_Functions_A01_t01: CompileTimeError, OK # http://dartbug.com/5021
@@ -908,9 +1186,7 @@
 LibTest/typed_data/Float32x4List/Float32x4List.view_A01_t02: RuntimeError # TODO(dart2js-team): Please triage this failure.
 LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: RuntimeError # TODO(dart2js-team): Please triage this failure.
 
-
 LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # TODO(dart2js-team): Please triage this failure.
-LibTest/isolate/Isolate/spawn_A01_t04: RuntimeError # TODO(dart2js-team): Please triage this failure.
 
 # These tests are marked failing on all platforms, but they timeout here instead
 LibTest/isolate/Isolate/spawnUri_A01_t01: Skip # TODO(dart2js-team): Please triage this failure.
@@ -993,7 +1269,7 @@
 LibTest/typed_data/ByteBuffer/runtimeType_A01_t01: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteBuffer/runtimeType_A01_t02: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteBuffer/toString_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/buffer_A01_t01: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/buffer_A01_t01: fail # co19 issue 694
 LibTest/typed_data/ByteData/buffer_A01_t02: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/ByteData_A01_t02: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/ByteData.view_A01_t01: fail # co19-roll r569: Please triage this failure
@@ -1072,7 +1348,6 @@
 Language/12_Expressions/00_Object_Identity/1_Object_Identity_A06_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/03_Numbers_A01_t06: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/03_Numbers_A01_t09: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/05_Strings_A20_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t06: fail # co19-roll r546: Please triage this failure
@@ -1095,9 +1370,6 @@
 Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t11: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t01: crash # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t02: crash # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A12_t10: fail # co19-roll r546: Please triage this failure
@@ -1258,12 +1530,10 @@
 Language/07_Classes/6_Constructors/2_Factories_A10_t02: fail # co19-roll r587: Please triage this failure
 Language/07_Classes/6_Constructors/2_Factories_A10_t03: fail # co19-roll r587: Please triage this failure
 Language/10_Generics/09_Generics_A01_t17: fail # co19-roll r587: Please triage this failure
-Language/12_Expressions/06_Symbols_A01_t02: CompileTimeError # co19-roll r623: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A06_t15: CompileTimeError # co19-roll r651: Please triage this failure
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t17: MissingCompileTimeError # co19-roll r651: Please triage this failure
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t18: MissingCompileTimeError # co19-roll r651: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t04: fail # Issue 14654
-LibTest/core/Symbol/Symbol_A01_t02: CompileTimeError # co19-roll r607: Please triage this failure
 LibTest/isolate/Isolate/spawnUri_A01_t01: Fail # co19-roll r672: Please triage this failure
 LibTest/isolate/Isolate/spawnUri_A01_t02: Fail # co19-roll r672: Please triage this failure
 LibTest/isolate/Isolate/spawnUri_A01_t03: Fail # co19-roll r672: Please triage this failure
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 49bbb13..8498895 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -6,14 +6,23 @@
 *: Skip # running co19 tests on content_shell would make our dartium cycle-times very long
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
-# Something is breaking browser_test.dart in the test infrastructure in these tests. Issue 18558.
-LayoutTests/fast/dom/HTMLB*: Skip # Issue 18558
+# Temporarily skip tests, to narrow down new breakage to a particular test by binary search:
+LayoutTests/fast/dom: Skip # Unknown tests are breaking the test infrastructure. Issue 18558
+
+LayoutTests/fast/dom/HTMLButtonElement/change-type_t01: Skip # Breaks the test infrastructure. Issue 18558
+LayoutTests/fast/dom/shadow/form-in-shadow_t01: Skip # Breaks the test infrastructure. Issue 18558.
+# Only one of the next two causes the problem - not sure which.
+LayoutTests/fast/dom/Range/create-contextual-fragment-script-not-ran_t01: Skip # Breaks the test infrastructure. Issue 18558.
+LayoutTests/fast/dom/Range/bug-19527_t01: Skip # Breaks the test infrastructure. Issue 18558.
+LayoutTests/fast/dom/MutationObserver/database-callback-delivery_t01: Skip # Breaks the test infrastructure. Issue 18558.
 
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail # Issue 13719: Please triage this failure.
 Language/14_Libraries_and_Scripts/3_Parts_A02_t02: Skip # Issue 13719: Please triage this failure.
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: Pass # Issue 14478: This should break.
 LibTest/async/Completer/completeError_A02_t01: Pass, Fail # Issue 13719: Please triage this failure.
 LibTest/core/int/operator_left_shift_A01_t02: Pass, Fail # Issue 13719: Please triage this failure.
+LibTest/typed_data/Int64List/buffer_A01_t01: Fail # Issue co19 694
+LibTest/typed_data/Int64List/buffer_A01_t01: Fail # co19 issue 694
 LibTest/isolate/SendPort/send_A02_t01: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t04: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t05: Fail # Issue 13921
@@ -285,7 +294,6 @@
 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.
@@ -296,7 +304,6 @@
 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.
@@ -308,7 +315,7 @@
 LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError, Pass # 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/selected-index-preserved-when-option-text-changes_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -319,11 +326,8 @@
 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.
@@ -369,8 +373,69 @@
 WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # Issue 18931
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Issue 18931
 
+# co19-roll r738.
+WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Skip # Times out. co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Skip # Times out and fails. # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: Skip # Times out and fails. # co19-roll r738: Please triage this failure.LayoutTests/fast/dom/Window/window-resize-contents_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-resize-contents_t01: Pass, RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/anchor-without-content_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/blur-contenteditable_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-functions_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dataset_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/importNode-null_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/location-hash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/option-properties_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/EventObject.after.dispatchEvenr_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/EventObject.multiple.dispatchEvent_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t05: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t02: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/addTextTrack_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/src_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formaction_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.  Pass on macos.
+WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: RuntimeError # co19-roll r738: Please triage this failure.
+
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid ) && $checked ]
-LibTest/core/List/removeAt_A02_t01: Fail # co19-roll r641: Please triage this failure
 # New Dartium checked failures on new co19 browser tests in co19 revision 706.
 LayoutTests/fast/html/article-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/html/aside-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
@@ -389,6 +454,16 @@
 WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
 
+# co19-roll r738
+WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-enumeration_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $mode == debug ]
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: Skip # Issue 19495.
+
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
 LibTest/math/log_A01_t01: Pass, Fail # co19 issue 44.
 LibTest/html/Element/getBoundingClientRect_A01_t02: RuntimeError # Issue 19127.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-beforeload_t01: Pass, Fail # Issue 19274.
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 151ebc9..47e138d 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -46,6 +46,7 @@
 LibTest/core/Symbol/Symbol_A01_t05: RuntimeError # Issue 13596
 
 [ $compiler == none && $runtime == vm ]
+LibTest/typed_data/Int64List/buffer_A01_t01: Fail # co19 issue 694
 LibTest/typed_data/Float32x4/reciprocalSqrt_A01_t01: Pass, Fail # co19 issue 599
 LibTest/typed_data/Float32x4/reciprocal_A01_t01: Pass, Fail # co19 issue 599
 
@@ -58,13 +59,8 @@
 # These flaky tests also fail with dart2dart.
 LibTest/math/MutableRectangle/MutableRectangle.fromPoints_A01_t01: Pass, RuntimeError # co19-roll r607: Please triage this failure
 
-[ $compiler == none && $runtime == vm && $checked ]
-LibTest/core/List/removeAt_A02_t01: Fail # co19 issue 670
-
-#end [ $compiler == none && $runtime == vm && $checked ]
-
 [ $compiler == none && $runtime == vm && $mode == debug ]
-LibTest/core/List/List_class_A01_t01: Pass, Slow
+LibTest/core/List/List_class_A01_t02: Pass, Slow
 
 [ $compiler == none && $runtime == vm && ($arch != x64 && $arch != simarm64) ]
 LibTest/core/int/operator_left_shift_A01_t02: Fail # co19 issue 129
@@ -73,9 +69,9 @@
 LibTest/core/double/toInt_A01_t01: Fail
 # These tests take too much memory (300 MB) for our 1 GB test machine.
 # co19 issue 673. http://code.google.com/p/co19/issues/detail?id=673
-LibTest/core/List/List_class_A01_t01: Skip # co19 issue 673
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # co19 issue 673
-LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # co19 issue 673
+LibTest/core/List/List_class_A01_t02: Skip # co19 issue 673
+LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip # co19 issue 673
+LibTest/collection/ListBase/ListBase_class_A01_t02: Skip # co19 issue 673
 
 [ $compiler == none && $runtime == vm && $arch == mips && $mode == debug ]
 LibTest/isolate/Isolate/spawnUri_A01_t04: Crash, Pass # dartbug.com/17440
@@ -85,6 +81,8 @@
 LibTest/core/Uri/Uri_A06_t03: Skip  # Timeout
 LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip  # Timeout
 LibTest/collection/ListBase/ListBase_class_A01_t01: Skip  # Timeout
+LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip  # Timeout
+LibTest/collection/ListBase/ListBase_class_A01_t02: Skip  # Timeout
 
 [ $runtime == vm ]
 LibTest/isolate/Isolate/spawn_A02_t01: Skip # co19 issue 667
diff --git a/tests/compiler/dart2js/analyze_dart2js_test.dart b/tests/compiler/dart2js/analyze_dart2js_test.dart
index ccd379e..d17f15e 100644
--- a/tests/compiler/dart2js/analyze_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_dart2js_test.dart
@@ -5,7 +5,7 @@
 library analyze_dart2js;
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
+import 'package:compiler/implementation/filenames.dart';
 import 'analyze_helper.dart';
 import "package:async_helper/async_helper.dart";
 
diff --git a/tests/compiler/dart2js/analyze_helper.dart b/tests/compiler/dart2js/analyze_helper.dart
index c9a80ee..89f00c6 100644
--- a/tests/compiler/dart2js/analyze_helper.dart
+++ b/tests/compiler/dart2js/analyze_helper.dart
@@ -6,13 +6,13 @@
 
 import 'dart:async';
 import 'dart:io';
-import '../../../sdk/lib/_internal/compiler/compiler.dart' as api;
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/compiler.dart' as api;
+import 'package:compiler/implementation/apiimpl.dart';
+import 'package:compiler/implementation/dart2jslib.dart'
     hide Compiler;
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/util/uri_extras.dart';
+import 'package:compiler/implementation/filenames.dart';
+import 'package:compiler/implementation/source_file_provider.dart';
+import 'package:compiler/implementation/util/uri_extras.dart';
 
 /**
  * Map of whitelisted warnings and errors.
diff --git a/tests/compiler/dart2js/analyze_only_test.dart b/tests/compiler/dart2js/analyze_only_test.dart
index a49cd42..ce0ce69 100644
--- a/tests/compiler/dart2js/analyze_only_test.dart
+++ b/tests/compiler/dart2js/analyze_only_test.dart
@@ -10,7 +10,7 @@
 import "package:async_helper/async_helper.dart";
 
 import '../../utils/dummy_compiler_test.dart' as dummy;
-import '../../../sdk/lib/_internal/compiler/compiler.dart';
+import 'package:compiler/compiler.dart';
 
 runCompiler(String main, List<String> options,
             onValue(String code, List errors, List warnings)) {
@@ -44,7 +44,7 @@
   result.then((String code) {
     onValue(code, errors, warnings);
   }, onError: (e) {
-      throw 'Compilation failed';
+    throw 'Compilation failed: ${Error.safeToString(e)}';
   }).then(asyncSuccess);
 }
 
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index a9b9b5a..4e04726 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -6,8 +6,8 @@
 
 import 'package:async_helper/async_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
+import 'package:compiler/implementation/dart2jslib.dart';
+import 'package:compiler/implementation/filenames.dart';
 
 import 'analyze_helper.dart';
 
diff --git a/tests/compiler/dart2js/arithmetic_simplification_test.dart b/tests/compiler/dart2js/arithmetic_simplification_test.dart
index 5350a33..8b69d50 100644
--- a/tests/compiler/dart2js/arithmetic_simplification_test.dart
+++ b/tests/compiler/dart2js/arithmetic_simplification_test.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test constant folding on numbers.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String INT_PLUS_ZERO = """
@@ -74,15 +75,17 @@
 main() {
   var plusZero = new RegExp(r"\+ 0");
   var zeroPlus = new RegExp(r"0 \+");
-  compileAndDoNotMatch(INT_PLUS_ZERO, 'main', plusZero);
-  compileAndDoNotMatch(ZERO_PLUS_INT, 'main', zeroPlus);
-  compileAndMatch(NUM_PLUS_ZERO, 'main', plusZero);
-  compileAndMatch(ZERO_PLUS_NUM, 'main', zeroPlus);
-
   var timesOne = new RegExp(r"\* 1");
   var oneTimes = new RegExp(r"1 \*");
-  compileAndDoNotMatch(INT_TIMES_ONE, 'main', timesOne);
-  compileAndDoNotMatch(ONE_TIMES_INT, 'main', oneTimes);
-  compileAndDoNotMatch(NUM_TIMES_ONE, 'main', timesOne);
-  compileAndDoNotMatch(ONE_TIMES_NUM, 'main', oneTimes);
+
+  asyncTest(() => Future.wait([
+    compileAndDoNotMatch(INT_PLUS_ZERO, 'main', plusZero),
+    compileAndDoNotMatch(ZERO_PLUS_INT, 'main', zeroPlus),
+    compileAndMatch(NUM_PLUS_ZERO, 'main', plusZero),
+    compileAndMatch(ZERO_PLUS_NUM, 'main', zeroPlus),
+    compileAndDoNotMatch(INT_TIMES_ONE, 'main', timesOne),
+    compileAndDoNotMatch(ONE_TIMES_INT, 'main', oneTimes),
+    compileAndDoNotMatch(NUM_TIMES_ONE, 'main', timesOne),
+    compileAndDoNotMatch(ONE_TIMES_NUM, 'main', oneTimes),
+  ]));
 }
diff --git a/tests/compiler/dart2js/array_static_intercept_test.dart b/tests/compiler/dart2js/array_static_intercept_test.dart
index 23e88eb..d53e10b1 100644
--- a/tests/compiler/dart2js/array_static_intercept_test.dart
+++ b/tests/compiler/dart2js/array_static_intercept_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -14,8 +15,9 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(generated.contains(r'.add$1('));
-  Expect.isTrue(generated.contains(r'.removeLast$0('));
-  Expect.isTrue(generated.contains(r'.length'));
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
+    Expect.isTrue(generated.contains(r'.add$1('));
+    Expect.isTrue(generated.contains(r'.removeLast$0('));
+    Expect.isTrue(generated.contains(r'.length'));
+  }));
 }
diff --git a/tests/compiler/dart2js/async_compiler_input_provider_test.dart b/tests/compiler/dart2js/async_compiler_input_provider_test.dart
index 7f370c3..4ebe2ab 100644
--- a/tests/compiler/dart2js/async_compiler_input_provider_test.dart
+++ b/tests/compiler/dart2js/async_compiler_input_provider_test.dart
@@ -8,8 +8,8 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart' as compiler;
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
+import 'package:compiler/compiler.dart' as compiler;
+import 'package:compiler/implementation/filenames.dart';
 
 const SOURCES = const {
   "/main.dart": """
diff --git a/tests/compiler/dart2js/bad_loop_test.dart b/tests/compiler/dart2js/bad_loop_test.dart
index e8c2848..fd9291b7 100644
--- a/tests/compiler/dart2js/bad_loop_test.dart
+++ b/tests/compiler/dart2js/bad_loop_test.dart
@@ -6,7 +6,7 @@
 import 'memory_source_file_helper.dart';
 import "package:async_helper/async_helper.dart";
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show Diagnostic;
 
 main() {
diff --git a/tests/compiler/dart2js/bad_output_io_test.dart b/tests/compiler/dart2js/bad_output_io_test.dart
index ebc3a6d..fc2cf34 100644
--- a/tests/compiler/dart2js/bad_output_io_test.dart
+++ b/tests/compiler/dart2js/bad_output_io_test.dart
@@ -9,11 +9,11 @@
 import 'dart:io' show exit;
 import 'package:expect/expect.dart';
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show Diagnostic;
-import '../../../sdk/lib/_internal/compiler/implementation/dart2js.dart'
+import 'package:compiler/implementation/dart2js.dart'
        show exitFunc, compileFunc, compile, diagnosticHandler;
-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart'
+import 'package:compiler/implementation/source_file_provider.dart'
        show FormattingDiagnosticHandler;
 
 class CollectingFormattingDiagnosticHandler
diff --git a/tests/compiler/dart2js/begin_end_token_test.dart b/tests/compiler/dart2js/begin_end_token_test.dart
index 355bbb5..d4cad6e 100644
--- a/tests/compiler/dart2js/begin_end_token_test.dart
+++ b/tests/compiler/dart2js/begin_end_token_test.dart
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 import 'parser_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import 'package:compiler/implementation/tree/tree.dart';
 
 void testNode(Node node, String expected, String text, [bool hard = true]) {
   var debug = 'text=$text,expected=$expected,node:${node}';
diff --git a/tests/compiler/dart2js/boolified_operator_test.dart b/tests/compiler/dart2js/boolified_operator_test.dart
index 5ec4c83..6a8bd9f 100644
--- a/tests/compiler/dart2js/boolified_operator_test.dart
+++ b/tests/compiler/dart2js/boolified_operator_test.dart
@@ -3,7 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library boolified_operator_test;
-import "package:expect/expect.dart";
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_EQUAL = r"""
@@ -50,27 +53,30 @@
 main() {
   RegExp regexp = new RegExp('=== true');
 
-  String generated = compile(TEST_EQUAL, entry: 'foo');
-  Expect.isFalse(generated.contains('=== true'));
-  Expect.isTrue(generated.contains('eqB'));
-
-  generated = compile(TEST_EQUAL_NULL, entry: 'foo');
-  Expect.isFalse(generated.contains('=== true'));
-  Expect.isTrue(generated.contains('== null'));
-
-  generated = compile(TEST_LESS, entry: 'foo');
-  Expect.isFalse(generated.contains('=== true'));
-  Expect.isTrue(generated.contains('ltB'));
-
-  generated = compile(TEST_LESS_EQUAL, entry: 'foo');
-  Expect.isFalse(generated.contains('=== true'));
-  Expect.isTrue(generated.contains('leB'));
-  
-  generated = compile(TEST_GREATER, entry: 'foo');
-  Expect.isFalse(generated.contains('=== true'));
-  Expect.isTrue(generated.contains('gtB'));
-  
-  generated = compile(TEST_GREATER_EQUAL, entry: 'foo');
-  Expect.isFalse(generated.contains('=== true'));
-  Expect.isTrue(generated.contains('geB'));
+  asyncTest(() => Future.wait([
+    compile(TEST_EQUAL, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('=== true'));
+      Expect.isTrue(generated.contains('eqB'));
+    }),
+    compile(TEST_EQUAL_NULL, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('=== true'));
+      Expect.isTrue(generated.contains('== null'));
+    }),
+    compile(TEST_LESS, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('=== true'));
+      Expect.isTrue(generated.contains('ltB'));
+    }),
+    compile(TEST_LESS_EQUAL, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('=== true'));
+      Expect.isTrue(generated.contains('leB'));
+    }),
+    compile(TEST_GREATER, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('=== true'));
+      Expect.isTrue(generated.contains('gtB'));
+    }),
+    compile(TEST_GREATER_EQUAL, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('=== true'));
+      Expect.isTrue(generated.contains('geB'));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/boolify_test.dart b/tests/compiler/dart2js/boolify_test.dart
index d029379..6536386 100644
--- a/tests/compiler/dart2js/boolify_test.dart
+++ b/tests/compiler/dart2js/boolify_test.dart
@@ -3,7 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library boolified_operator_test;
-import "package:expect/expect.dart";
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST = r"""
@@ -15,6 +17,7 @@
 """;
 
 main() {
-  String generated = compile(TEST, entry: 'foo');
-  Expect.isTrue(generated.contains('foo() !== true)'));
+  asyncTest(() => compile(TEST, entry: 'foo', check: (String generated) {
+    Expect.isTrue(generated.contains('foo() !== true)'));
+  }));
 }
diff --git a/tests/compiler/dart2js/builtin_equals_test.dart b/tests/compiler/dart2js/builtin_equals_test.dart
index 3b1807a..57656c0 100644
--- a/tests/compiler/dart2js/builtin_equals_test.dart
+++ b/tests/compiler/dart2js/builtin_equals_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST = r"""
@@ -17,10 +18,12 @@
 """;
 
 main() {
-  String generated = compile(TEST, entry: 'foo', enableTypeAssertions: true);
-  Expect.isTrue(!generated.contains('eqB'));
+  asyncTest(() => compile(TEST, entry: 'foo', enableTypeAssertions: true,
+      check: (String generated) {
+    Expect.isTrue(!generated.contains('eqB'));
 
-  RegExp regexp = new RegExp('==');
-  Iterator<Match> matches = regexp.allMatches(generated).iterator;
-  checkNumberOfMatches(matches, 4);
+    RegExp regexp = new RegExp('==');
+    Iterator<Match> matches = regexp.allMatches(generated).iterator;
+    checkNumberOfMatches(matches, 4);
+  }));
 }
diff --git a/tests/compiler/dart2js/builtin_interceptor_test.dart b/tests/compiler/dart2js/builtin_interceptor_test.dart
index 00aead3..24e3a2c 100644
--- a/tests/compiler/dart2js/builtin_interceptor_test.dart
+++ b/tests/compiler/dart2js/builtin_interceptor_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -24,12 +26,15 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(generated.contains("return 3;"));
-
-  generated = compile(TEST_TWO, entry: 'foo');
-  Expect.isTrue(generated.contains("return 3;"));
-
-  generated = compile(TEST_THREE, entry: 'foo');
-  Expect.isTrue(generated.contains("push(2);"));
+  asyncTest(() => Future.wait([
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains("return 3;"));
+    }),
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains("return 3;"));
+    }),
+    compile(TEST_THREE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains("push(2);"));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart b/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
index 16eee71..cd127f2 100644
--- a/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
+++ b/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/closure_codegen_test.dart b/tests/compiler/dart2js/closure_codegen_test.dart
index e3f9f4a..d9d05d6 100644
--- a/tests/compiler/dart2js/closure_codegen_test.dart
+++ b/tests/compiler/dart2js/closure_codegen_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
-import 'parser_helper.dart';
 
 const String TEST_INVOCATION0 = r"""
 main() {
@@ -41,29 +41,35 @@
 main() { new A().foo(1); }
 """;
 
-closureInvocation(bool minify, String prefix) {
-  String generated = compile(TEST_INVOCATION0, minify: minify);
-  Expect.isTrue(generated.contains(".$prefix\$0()"));
-  generated = compile(TEST_INVOCATION1, minify: minify);
-  Expect.isTrue(generated.contains(".$prefix\$1(1)"));
-  generated = compile(TEST_INVOCATION2, minify: minify);
-  Expect.isTrue(generated.contains(".$prefix\$2(1,${minify ? "" : " "}2)"));
+Future closureInvocation(bool minify, String prefix) {
+  return Future.wait([
+    compile(TEST_INVOCATION0, minify: minify, check: (String generated) {
+      Expect.isTrue(generated.contains(".$prefix\$0()"));
+    }),
+    compile(TEST_INVOCATION1, minify: minify, check: (String generated) {
+      Expect.isTrue(generated.contains(".$prefix\$1(1)"));
+    }),
+    compile(TEST_INVOCATION2, minify: minify, check: (String generated) {
+      Expect.isTrue(generated.contains(".$prefix\$2(1,${minify ? "" : " "}2)"));
+    })
+  ]);
 }
 
 // Make sure that the bailout version does not introduce a second version of
 // the closure.
-closureBailout(bool minify, String prefix) {
-  asyncTest(() => compileAll(TEST_BAILOUT, minify: minify)
-      .then((generated) {
+Future closureBailout(bool minify, String prefix) {
+  return compileAll(TEST_BAILOUT, minify: minify).then((generated) {
     RegExp regexp = new RegExp("$prefix\\\$0:${minify ? "" : " "}function");
     Iterator<Match> matches = regexp.allMatches(generated).iterator;
     checkNumberOfMatches(matches, 1);
-  }));
+  });
 }
 
 main() {
-  closureInvocation(false, "call");
-  closureInvocation(true, "");
-  closureBailout(false, "call");
-  closureBailout(true, "");
+  asyncTest(() => Future.wait([
+    closureInvocation(false, "call"),
+    closureInvocation(true, ""),
+    closureBailout(false, "call"),
+    closureBailout(true, ""),
+  ]));
 }
diff --git a/tests/compiler/dart2js/code_motion_test.dart b/tests/compiler/dart2js/code_motion_test.dart
index e45095a..ea4036b 100644
--- a/tests/compiler/dart2js/code_motion_test.dart
+++ b/tests/compiler/dart2js/code_motion_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -21,9 +22,10 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  RegExp regexp = new RegExp('a \\+ b');
-  Iterator matches = regexp.allMatches(generated).iterator;
-  Expect.isTrue(matches.moveNext());
-  Expect.isFalse(matches.moveNext());
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
+    RegExp regexp = new RegExp('a \\+ b');
+    Iterator matches = regexp.allMatches(generated).iterator;
+    Expect.isTrue(matches.moveNext());
+    Expect.isFalse(matches.moveNext());
+  }));
 }
diff --git a/tests/compiler/dart2js/command_line_split_test.dart b/tests/compiler/dart2js/command_line_split_test.dart
index 8e21815..d54a351 100644
--- a/tests/compiler/dart2js/command_line_split_test.dart
+++ b/tests/compiler/dart2js/command_line_split_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/util/command_line.dart';
+import 'package:compiler/implementation/util/command_line.dart';
 
 main() {
   Expect.listEquals(["foo", "bar"], splitLine("foo bar"));
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index 5353bcf..bfd45b9 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -8,16 +8,16 @@
 import 'dart:async';
 import "package:expect/expect.dart";
 
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
+import 'package:compiler/implementation/elements/elements.dart'
        as lego;
-export '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
+export 'package:compiler/implementation/elements/elements.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart'
+import 'package:compiler/implementation/js_backend/js_backend.dart'
        as js;
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as leg;
-export '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+export 'package:compiler/implementation/dart2jslib.dart'
        show Constant,
             Message,
             MessageKind,
@@ -25,62 +25,68 @@
             TypedSelector,
             SourceSpan;
 
-import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart' as ssa;
+import 'package:compiler/implementation/ssa/ssa.dart' as ssa;
 
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
        as types;
-export '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+export 'package:compiler/implementation/types/types.dart'
        show TypeMask;
 
-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
-export '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
+import 'package:compiler/implementation/util/util.dart';
+export 'package:compiler/implementation/util/util.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
+import 'package:compiler/implementation/source_file.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        show Compiler;
 
-export '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+export 'package:compiler/implementation/tree/tree.dart';
 
 import 'mock_compiler.dart';
 export 'mock_compiler.dart';
 
-import 'parser_helper.dart';
-
-String compile(String code, {String entry: 'main',
-                             String coreSource: DEFAULT_CORELIB,
-                             String interceptorsSource: DEFAULT_INTERCEPTORSLIB,
-                             bool enableTypeAssertions: false,
-                             bool minify: false,
-                             bool analyzeAll: false,
-                             bool disableInlining: true}) {
-  MockCompiler compiler =
-      new MockCompiler(enableTypeAssertions: enableTypeAssertions,
-                       coreSource: coreSource,
-                       // Type inference does not run when manually
-                       // compiling a method.
-                       disableTypeInference: true,
-                       interceptorsSource: interceptorsSource,
-                       enableMinification: minify,
-                       disableInlining: disableInlining);
-  compiler.parseScript(code);
-  lego.Element element = compiler.mainApp.find(entry);
-  if (element == null) return null;
-  compiler.phase = Compiler.PHASE_RESOLVING;
-  compiler.backend.enqueueHelpers(compiler.enqueuer.resolution,
-                                  compiler.globalDependencies);
-  compiler.processQueue(compiler.enqueuer.resolution, element);
-  compiler.world.populate();
-  var context = new js.JavaScriptItemCompilationContext();
-  leg.ResolutionWorkItem resolutionWork =
-      new leg.ResolutionWorkItem(element, context);
-  resolutionWork.run(compiler, compiler.enqueuer.resolution);
-  leg.CodegenWorkItem work =
-      new leg.CodegenWorkItem(element, context);
-  compiler.phase = Compiler.PHASE_COMPILING;
-  work.run(compiler, compiler.enqueuer.codegen);
-  js.JavaScriptBackend backend = compiler.backend;
-  return backend.assembleCode(element);
+Future<String> compile(String code,
+                       {String entry: 'main',
+                        String coreSource: DEFAULT_CORELIB,
+                        String interceptorsSource: DEFAULT_INTERCEPTORSLIB,
+                        bool enableTypeAssertions: false,
+                        bool minify: false,
+                        bool analyzeAll: false,
+                        bool disableInlining: true,
+                        void check(String generated)}) {
+  MockCompiler compiler = new MockCompiler.internal(
+      enableTypeAssertions: enableTypeAssertions,
+      coreSource: coreSource,
+      // Type inference does not run when manually
+      // compiling a method.
+      disableTypeInference: true,
+      interceptorsSource: interceptorsSource,
+      enableMinification: minify,
+      disableInlining: disableInlining);
+  return compiler.init().then((_) {
+    compiler.parseScript(code);
+    lego.Element element = compiler.mainApp.find(entry);
+    if (element == null) return null;
+    compiler.phase = Compiler.PHASE_RESOLVING;
+    compiler.backend.enqueueHelpers(compiler.enqueuer.resolution,
+                                    compiler.globalDependencies);
+    compiler.processQueue(compiler.enqueuer.resolution, element);
+    compiler.world.populate();
+    var context = new js.JavaScriptItemCompilationContext();
+    leg.ResolutionWorkItem resolutionWork =
+        new leg.ResolutionWorkItem(element, context);
+    resolutionWork.run(compiler, compiler.enqueuer.resolution);
+    leg.CodegenWorkItem work =
+        new leg.CodegenWorkItem(element, context);
+    compiler.phase = Compiler.PHASE_COMPILING;
+    work.run(compiler, compiler.enqueuer.codegen);
+    js.JavaScriptBackend backend = compiler.backend;
+    String generated = backend.assembleCode(element);
+    if (check != null) {
+      check(generated);
+    }
+    return generated;
+  });
 }
 
 // TODO(herhut): Disallow warnings and errors during compilation by default.
@@ -92,7 +98,7 @@
                           bool minify: false,
                           int expectedErrors,
                           int expectedWarnings}) {
-  MockCompiler compiler = new MockCompiler(
+  MockCompiler compiler = new MockCompiler.internal(
       analyzeAll: analyzeAll,
       analyzeOnly: analyzeOnly,
       coreSource: coreSource,
@@ -100,8 +106,7 @@
       enableMinification: minify,
       expectedErrors: expectedErrors,
       expectedWarnings: expectedWarnings);
-  compiler.sourceFiles[uri.toString()] =
-      new StringSourceFile(uri.toString(), code);
+  compiler.registerSource(uri, code);
   return compiler;
 }
 
@@ -118,7 +123,7 @@
       expectedWarnings: expectedWarnings);
   return compiler.runCompiler(uri).then((_) {
     Expect.isFalse(compiler.compilationFailed,
-                   'Unexpected compilation error');
+                   'Unexpected compilation error(s): ${compiler.errors}');
     return compiler.assembledCode;
   });
 }
@@ -193,7 +198,7 @@
   return """\\(typeof $variable ?!== ?"number"\\)""";
 }
 
-bool checkNumberOfMatches(Iterator it, int nb) {
+void checkNumberOfMatches(Iterator it, int nb) {
   bool hasNext = it.moveNext();
   for (int i = 0; i < nb; i++) {
     Expect.isTrue(hasNext, "Found less than $nb matches");
@@ -202,40 +207,43 @@
   Expect.isFalse(hasNext, "Found more than $nb matches");
 }
 
-void compileAndMatch(String code, String entry, RegExp regexp) {
-  String generated = compile(code, entry: entry);
-  Expect.isTrue(regexp.hasMatch(generated),
-                '"$generated" does not match /$regexp/');
+Future compileAndMatch(String code, String entry, RegExp regexp) {
+  return compile(code, entry: entry, check: (String generated) {
+    Expect.isTrue(regexp.hasMatch(generated),
+                  '"$generated" does not match /$regexp/');
+  });
 }
 
-void compileAndDoNotMatch(String code, String entry, RegExp regexp) {
-  String generated = compile(code, entry: entry);
-  Expect.isFalse(regexp.hasMatch(generated),
-                 '"$generated" has a match in /$regexp/');
+Future compileAndDoNotMatch(String code, String entry, RegExp regexp) {
+  return compile(code, entry: entry, check: (String generated) {
+    Expect.isFalse(regexp.hasMatch(generated),
+                   '"$generated" has a match in /$regexp/');
+  });
 }
 
 int length(Link link) => link.isEmpty ? 0 : length(link.tail) + 1;
 
 // Does a compile and then a match where every 'x' is replaced by something
 // that matches any variable, and every space is optional.
-void compileAndMatchFuzzy(String code, String entry, String regexp) {
-  compileAndMatchFuzzyHelper(code, entry, regexp, true);
+Future compileAndMatchFuzzy(String code, String entry, String regexp) {
+  return compileAndMatchFuzzyHelper(code, entry, regexp, true);
 }
 
-void compileAndDoNotMatchFuzzy(String code, String entry, String regexp) {
-  compileAndMatchFuzzyHelper(code, entry, regexp, false);
+Future compileAndDoNotMatchFuzzy(String code, String entry, String regexp) {
+  return compileAndMatchFuzzyHelper(code, entry, regexp, false);
 }
 
-void compileAndMatchFuzzyHelper(
+Future compileAndMatchFuzzyHelper(
     String code, String entry, String regexp, bool shouldMatch) {
-  String generated = compile(code, entry: entry);
-  final xRe = new RegExp('\\bx\\b');
-  regexp = regexp.replaceAll(xRe, '(?:$anyIdentifier)');
-  final spaceRe = new RegExp('\\s+');
-  regexp = regexp.replaceAll(spaceRe, '(?:\\s*)');
-  if (shouldMatch) {
-    Expect.isTrue(new RegExp(regexp).hasMatch(generated));
-  } else {
-    Expect.isFalse(new RegExp(regexp).hasMatch(generated));
-  }
+  return compile(code, entry: entry, check: (String generated) {
+    final xRe = new RegExp('\\bx\\b');
+    regexp = regexp.replaceAll(xRe, '(?:$anyIdentifier)');
+    final spaceRe = new RegExp('\\s+');
+    regexp = regexp.replaceAll(spaceRe, '(?:\\s*)');
+    if (shouldMatch) {
+      Expect.isTrue(new RegExp(regexp).hasMatch(generated));
+    } else {
+      Expect.isFalse(new RegExp(regexp).hasMatch(generated));
+    }
+  });
 }
diff --git a/tests/compiler/dart2js/compiler_test.dart b/tests/compiler/dart2js/compiler_test.dart
index 8415ee8..8235686 100644
--- a/tests/compiler/dart2js/compiler_test.dart
+++ b/tests/compiler/dart2js/compiler_test.dart
@@ -2,17 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import "dart:async";
 import "package:expect/expect.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
+import "package:async_helper/async_helper.dart";
+import "package:compiler/implementation/dart2jslib.dart";
+import "package:compiler/implementation/elements/elements.dart";
+import "package:compiler/implementation/resolution/resolution.dart";
+import "package:compiler/implementation/util/util.dart";
 import "mock_compiler.dart";
-import "parser_helper.dart";
+
 
 class CallbackMockCompiler extends MockCompiler {
-  CallbackMockCompiler();
+  CallbackMockCompiler() : super.internal();
 
   var onError;
   var onWarning;
@@ -39,19 +40,21 @@
   }
 }
 
-testErrorHandling() {
+Future testErrorHandling() {
   // Test that compiler.currentElement is set correctly when
   // reporting errors/warnings.
   CallbackMockCompiler compiler = new CallbackMockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  compiler.parseScript('NoSuchPrefix.NoSuchType foo() {}');
-  FunctionElement foo = compiler.mainApp.find('foo');
-  compiler.setOnWarning(
-      (c, n, m) => Expect.equals(foo, compiler.currentElement));
-  foo.computeType(compiler);
-  Expect.equals(1, compiler.warnings.length);
+  return compiler.init().then((_) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    compiler.parseScript('NoSuchPrefix.NoSuchType foo() {}');
+    FunctionElement foo = compiler.mainApp.find('foo');
+    compiler.setOnWarning(
+        (c, n, m) => Expect.equals(foo, compiler.currentElement));
+    foo.computeType(compiler);
+    Expect.equals(1, compiler.warnings.length);
+  });
 }
 
 main() {
-  testErrorHandling();
+  asyncTest(() => testErrorHandling());
 }
diff --git a/tests/compiler/dart2js/constant_folding_test.dart b/tests/compiler/dart2js/constant_folding_test.dart
index cdf4c1d..82100cb 100644
--- a/tests/compiler/dart2js/constant_folding_test.dart
+++ b/tests/compiler/dart2js/constant_folding_test.dart
@@ -3,7 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test constant folding on numbers.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String NUMBER_FOLDING = """
@@ -56,36 +58,39 @@
 """;
 
 main() {
-  compileAndMatch(
-      NUMBER_FOLDING, 'main', new RegExp(r"print\(7\)"));
-  compileAndMatch(
-      NEGATIVE_NUMBER_FOLDING, 'main', new RegExp(r"print\(1\)"));
+  asyncTest(() => Future.wait([
+    compileAndMatch(
+        NUMBER_FOLDING, 'main', new RegExp(r"print\(7\)")),
+    compileAndMatch(
+        NEGATIVE_NUMBER_FOLDING, 'main', new RegExp(r"print\(1\)")),
 
-  String generated = compile(NULL_EQUALS_FOLDING, entry: 'foo');
-  RegExp regexp = new RegExp(r'a == null');
-  Expect.isTrue(regexp.hasMatch(generated));
+    compile(NULL_EQUALS_FOLDING, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp(r'a == null');
+      Expect.isTrue(regexp.hasMatch(generated));
 
-  regexp = new RegExp(r'null == b');
-  Expect.isTrue(regexp.hasMatch(generated));
+      regexp = new RegExp(r'null == b');
+      Expect.isTrue(regexp.hasMatch(generated));
 
-  regexp = new RegExp(r'4 === c');
-  Expect.isTrue(regexp.hasMatch(generated));
+      regexp = new RegExp(r'4 === c');
+      Expect.isTrue(regexp.hasMatch(generated));
 
-  regexp = new RegExp('"foo" === d');
-  Expect.isTrue(regexp.hasMatch(generated));
+      regexp = new RegExp('"foo" === d');
+      Expect.isTrue(regexp.hasMatch(generated));
+    }),
 
-  compileAndMatch(
-      LIST_LENGTH_FOLDING, 'foo', new RegExp(r"return 3"));
+    compileAndMatch(
+        LIST_LENGTH_FOLDING, 'foo', new RegExp(r"return 3")),
 
-  compileAndMatch(
-      LIST_INDEX_FOLDING, 'foo', new RegExp(r"return 1"));
+    compileAndMatch(
+        LIST_INDEX_FOLDING, 'foo', new RegExp(r"return 1")),
 
-  compileAndDoNotMatch(
-      LIST_INDEX_FOLDING, 'foo', new RegExp(r"ioore"));
+    compileAndDoNotMatch(
+        LIST_INDEX_FOLDING, 'foo', new RegExp(r"ioore")),
 
-  compileAndMatch(
-      STRING_LENGTH_FOLDING, 'foo', new RegExp(r"return 3"));
+    compileAndMatch(
+        STRING_LENGTH_FOLDING, 'foo', new RegExp(r"return 3")),
 
-  compileAndMatch(
-      RANGE_ERROR_INDEX_FOLDING, 'foo', new RegExp(r"ioore"));
+    compileAndMatch(
+        RANGE_ERROR_INDEX_FOLDING, 'foo', new RegExp(r"ioore")),
+  ]));
 }
diff --git a/tests/compiler/dart2js/constant_namer_test.dart b/tests/compiler/dart2js/constant_namer_test.dart
index dd78c63..3e779ad 100644
--- a/tests/compiler/dart2js/constant_namer_test.dart
+++ b/tests/compiler/dart2js/constant_namer_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 
@@ -26,11 +27,11 @@
     Expect.isTrue(generated.contains(text), text);
   }
 
-  var generated = compile(TEST_ONE, entry: 'test');
-
-  check(generated, '.List_12_53.');
-  check(generated, '.Token_start_null.');
-  check(generated, '.Token_end_null.');
-  check(generated, '.Token_yes_12.');
-  check(generated, '.Token_true_false.');
+  asyncTest(() => compile(TEST_ONE, entry: 'test').then((String generated) {
+    check(generated, '.List_12_53.');
+    check(generated, '.Token_start_null.');
+    check(generated, '.Token_end_null.');
+    check(generated, '.Token_yes_12.');
+    check(generated, '.Token_true_false.');
+  }));
 }
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index 8f7ab3c..87c39ea 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -5,9 +5,9 @@
 import 'dart:async';
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart';
+import 'package:compiler/implementation/source_file.dart';
+import 'package:compiler/implementation/types/types.dart';
+import 'package:compiler/implementation/inferrer/concrete_types_inferrer.dart';
 
 import "parser_helper.dart";
 import "compiler_helper.dart";
@@ -154,46 +154,12 @@
 
 const String DYNAMIC = '"__dynamic_for_test"';
 
-const String CORELIB = r'''
-  print(var obj) {}
-  abstract class num {
-    num operator +(num x);
-    num operator *(num x);
-    num operator -(num x);
-    operator ==(x);
-    num floor();
-  }
-  abstract class int extends num {
-    bool get isEven;
-  }
-  abstract class double extends num {
-    bool get isNaN;
-  }
-  class bool {}
-  class String {}
-  class Object {
-    Object();
-  }
-  class Function {}
-  abstract class List<E> {
-    factory List([int length]) {}
-  }
-  abstract class Map<K, V> {}
-  class Closure {}
-  class Type {}
-  class StackTrace {}
-  class Dynamic_ {}
-  bool identical(Object a, Object b) {}
-  const proxy = 0;''';
-
 Future<AnalysisResult> analyze(String code, {int maxConcreteTypeSize: 1000}) {
-  Uri uri = new Uri(scheme: 'source');
-  MockCompiler compiler = new MockCompiler(
-      coreSource: CORELIB,
+  Uri uri = new Uri(scheme: 'dart', path: 'test');
+  MockCompiler compiler = new MockCompiler.internal(
       enableConcreteTypeInference: true,
       maxConcreteTypeSize: maxConcreteTypeSize);
-  compiler.sourceFiles[uri.toString()] =
-      new StringSourceFile(uri.toString(), code);
+  compiler.registerSource(uri, code);
   compiler.typesTask.concreteTypesInferrer.testMode = true;
   return compiler.runCompiler(uri).then((_) {
     return new AnalysisResult(compiler);
@@ -1435,9 +1401,8 @@
 
 testJsCall() {
   final String source = r"""
-    import 'dart:foreign';
-    import 'dart:helper' show Null;
-    import 'dart:interceptors';
+    import 'dart:_foreign_helper';
+    import 'dart:_interceptors';
 
     abstract class AbstractA {}
     class A extends AbstractA {}
@@ -1517,7 +1482,7 @@
   }).whenComplete(() {
 
     final String source2 = """
-      import 'dart:foreign';
+      import 'dart:_foreign_helper';
 
       main () {
         var x = $DYNAMIC.truncate();
@@ -1686,16 +1651,16 @@
         new TypeMask.unionOf([a, b, c]
             .map((cls) => new TypeMask.nonNullExact(cls)), result.compiler));
     result.checkSelectorHasType(
-        new TypedSelector.subclass(x, foo),
+        new TypedSelector.subclass(x, foo, result.compiler),
         new TypeMask.nonNullExact(b));
     result.checkSelectorHasType(
-        new TypedSelector.subclass(y, foo),
+        new TypedSelector.subclass(y, foo, result.compiler),
         new TypeMask.nonNullExact(c));
     result.checkSelectorHasType(
-        new TypedSelector.subclass(z, foo),
+        new TypedSelector.subclass(z, foo, result.compiler),
         new TypeMask.nonNullExact(a));
     result.checkSelectorHasType(
-        new TypedSelector.subclass(xy, foo),
+        new TypedSelector.subclass(xy, foo, result.compiler),
         new TypeMask.unionOf([b, c].map((cls) =>
             new TypeMask.nonNullExact(cls)), result.compiler));
 
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/dart_backend_test.dart
index cb3a5e4..40feb8c 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/dart_backend_test.dart
@@ -6,11 +6,11 @@
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
 import 'mock_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' as leg;
-import '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import 'package:compiler/compiler.dart';
+import 'package:compiler/implementation/dart2jslib.dart' as leg;
+import 'package:compiler/implementation/dart_backend/dart_backend.dart';
+import 'package:compiler/implementation/elements/elements.dart';
+import 'package:compiler/implementation/tree/tree.dart';
 
 const coreLib = r'''
 library corelib;
@@ -44,6 +44,13 @@
 const proxy = 0;
 ''';
 
+const corePatch = r'''
+import 'dart:_js_helper';
+import 'dart:_interceptors';
+import 'dart:_isolate_helper';
+import 'dart:_foreign_helper';
+''';
+
 const ioLib = r'''
 library io;
 class Platform {
@@ -67,6 +74,9 @@
 library js_helper;
 class JSInvocationMirror {}
 assertHelper(a) {}
+class Closure {}
+class BoundClosure {}
+const patch = 0;
 ''';
 
 const foreignLib = r'''
@@ -107,7 +117,9 @@
     }
     if (uri.path.endsWith('/core.dart')) {
       return new Future.value(coreLib);
-    } else  if (uri.path.endsWith('/io.dart')) {
+    } else if (uri.path.endsWith('/core_patch.dart')) {
+      return new Future.value(corePatch);
+    } else if (uri.path.endsWith('/io.dart')) {
       return new Future.value(ioLib);
     } else if (uri.path.endsWith('/js_helper.dart')) {
       return new Future.value(helperLib);
@@ -208,7 +220,7 @@
 }
 
 testAbstractClass() {
-  testDart2Dart('main(){A.foo;}abstract class A{final static num foo=0;}');
+  testDart2Dart('main(){A.foo;}abstract class A{static final num foo=0;}');
 }
 
 testConflictSendsRename() {
@@ -445,9 +457,7 @@
   final compiler;
   DynoMap(this.compiler);
 
-  get resolvedElements => compiler.enqueuer.resolution.resolvedElements;
-  ElementAst operator[](Element element) =>
-      new ElementAst(element.parseNode(compiler), resolvedElements[element]);
+  ElementAst operator[](Element element) => new ElementAst(element);
 
   noSuchMethod(Invocation invocation) => throw 'unimplemented method';
 }
@@ -463,19 +473,21 @@
   localfoo();
 }
 ''';
-  MockCompiler compiler = new MockCompiler(emitJavaScript: false);
-  assert(compiler.backend is DartBackend);
-  compiler.parseScript(src);
-  FunctionElement mainElement = compiler.mainApp.find(leg.Compiler.MAIN);
-  compiler.processQueue(compiler.enqueuer.resolution, mainElement);
-  PlaceholderCollector collector = collectPlaceholders(compiler, mainElement);
-  FunctionExpression mainNode = mainElement.parseNode(compiler);
-  Block body = mainNode.body;
-  FunctionDeclaration functionDeclaration = body.statements.nodes.head;
-  FunctionExpression fooNode = functionDeclaration.function;
-  LocalPlaceholder fooPlaceholder =
-      collector.functionScopes[mainElement].localPlaceholders.first;
-  Expect.isTrue(fooPlaceholder.nodes.contains(fooNode.name));
+  MockCompiler compiler = new MockCompiler.internal(emitJavaScript: false);
+  asyncTest(() => compiler.init().then((_) {
+    assert(compiler.backend is DartBackend);
+    compiler.parseScript(src);
+    FunctionElement mainElement = compiler.mainApp.find(leg.Compiler.MAIN);
+    compiler.processQueue(compiler.enqueuer.resolution, mainElement);
+    PlaceholderCollector collector = collectPlaceholders(compiler, mainElement);
+    FunctionExpression mainNode = mainElement.parseNode(compiler);
+    Block body = mainNode.body;
+    FunctionDeclaration functionDeclaration = body.statements.nodes.head;
+    FunctionExpression fooNode = functionDeclaration.function;
+    LocalPlaceholder fooPlaceholder =
+        collector.functionScopes[mainElement].localPlaceholders.first;
+    Expect.isTrue(fooPlaceholder.nodes.contains(fooNode.name));
+  }));
 }
 
 testTypeVariablesAreRenamed() {
diff --git a/tests/compiler/dart2js/dart_printer_test.dart b/tests/compiler/dart2js/dart_printer_test.dart
index 3321202..857da91 100644
--- a/tests/compiler/dart2js/dart_printer_test.dart
+++ b/tests/compiler/dart2js/dart_printer_test.dart
@@ -5,15 +5,15 @@
 library dart_printer_test;
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart' show DartString;
+import 'package:compiler/implementation/dart_backend/dart_printer.dart';
+import 'package:compiler/implementation/scanner/scannerlib.dart';
+import 'package:compiler/implementation/source_file.dart';
+import 'package:compiler/implementation/dart2jslib.dart';
+import 'package:compiler/implementation/tree/tree.dart' show DartString;
 import 'dart:mirrors';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart' as tree;
-import '../../../sdk/lib/_internal/compiler/implementation/string_validator.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart' show TreePrinter;
+import 'package:compiler/implementation/tree/tree.dart' as tree;
+import 'package:compiler/implementation/string_validator.dart';
+import 'package:compiler/implementation/dart_backend/dart_tree_printer.dart' show TreePrinter;
 
 /// For debugging the [AstBuilder] stack. Prints information about [x].
 void show(x) {
diff --git a/tests/compiler/dart2js/dead_phi_eliminator_test.dart b/tests/compiler/dart2js/dead_phi_eliminator_test.dart
index 4551e34..a7088d5 100644
--- a/tests/compiler/dart2js/dead_phi_eliminator_test.dart
+++ b/tests/compiler/dart2js/dead_phi_eliminator_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -17,7 +18,8 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  RegExp regexp = new RegExp("toBeRemoved");
-  Expect.isTrue(!regexp.hasMatch(generated));
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
+    RegExp regexp = new RegExp("toBeRemoved");
+    Expect.isTrue(!regexp.hasMatch(generated));
+  }));
 }
diff --git a/tests/compiler/dart2js/declare_once_test.dart b/tests/compiler/dart2js/declare_once_test.dart
index 01fb13e..729a5ab 100644
--- a/tests/compiler/dart2js/declare_once_test.dart
+++ b/tests/compiler/dart2js/declare_once_test.dart
@@ -3,23 +3,25 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
-import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 
 main() {
   // For a function with only one variable we declare it inline for more
   // compactness.  Test that we don't also declare it at the start of the
   // method.
-  var generated = compile(
+  asyncTest(() => compile(
       'final List a = const ["bar", "baz"];'
       'int foo() {'
       '  for (int i = 0; i < a.length; i++) {'
       '    print(a[i]);'
       '  }'
       '}',
-      entry: 'foo', minify: false);
-  RegExp re = new RegExp(r"var ");
-  Expect.isTrue(re.hasMatch(generated));
-  print(generated);
-  Expect.equals(1, re.allMatches(generated).length);
+      entry: 'foo', minify: false).then((String generated) {
+    RegExp re = new RegExp(r"var ");
+    Expect.isTrue(re.hasMatch(generated));
+    print(generated);
+    Expect.equals(1, re.allMatches(generated).length);
+  }));
 }
diff --git a/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart b/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart
index 487b733..55cc05c 100644
--- a/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart
+++ b/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart
@@ -10,7 +10,7 @@
 import 'memory_source_file_helper.dart';
 import "dart:async";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 class MemoryOutputSink extends EventSink<String> {
diff --git a/tests/compiler/dart2js/deferred_emit_type_checks_test.dart b/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
index 45291da..ecf6ffb 100644
--- a/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
+++ b/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
@@ -10,7 +10,7 @@
 import 'memory_source_file_helper.dart';
 import "dart:async";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 class MemoryOutputSink<T> extends EventSink<T> {
@@ -52,7 +52,7 @@
   asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
     String mainOutput = outputs['main.js'].mem[0];
     String deferredOutput = outputs['out_deferred.part.js'].mem[0];
-    RegExp re = new RegExp(r"\n.\.A\.\$isA = true;");
+    RegExp re = new RegExp(r"\n  _ = .\.A;\n  _.\$isA = TRUE;");
     print(deferredOutput);
     Expect.isTrue(re.hasMatch(deferredOutput));
     Expect.isFalse(re.hasMatch(mainOutput));
diff --git a/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart b/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart
index cbd5447..1d6d60a 100644
--- a/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart
+++ b/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart
@@ -8,7 +8,7 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 import "dart:async";
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
   hide Compiler;
 
 
diff --git a/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart b/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart
index 0d47ce1..8ac7838 100644
--- a/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart
+++ b/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart
@@ -8,7 +8,7 @@
 import "memory_compiler.dart";
 import "dart:async";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 runTest(String mainScript, test) {
diff --git a/tests/compiler/dart2js/deferred_load_graph_segmentation2_test.dart b/tests/compiler/dart2js/deferred_load_graph_segmentation2_test.dart
index 3de5634..2be733f 100644
--- a/tests/compiler/dart2js/deferred_load_graph_segmentation2_test.dart
+++ b/tests/compiler/dart2js/deferred_load_graph_segmentation2_test.dart
@@ -11,7 +11,7 @@
 import 'memory_source_file_helper.dart';
 import "dart:async";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 class FakeOutputStream<T> extends EventSink<T> {
diff --git a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart b/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
index 582bcf0..9e3f8af 100644
--- a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
+++ b/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
@@ -11,7 +11,7 @@
 import 'memory_source_file_helper.dart';
 import "dart:async";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 class FakeOutputStream<T> extends EventSink<T> {
diff --git a/tests/compiler/dart2js/deferred_mirrors_test.dart b/tests/compiler/dart2js/deferred_mirrors_test.dart
index 5f7eea1..f7b4fb7 100644
--- a/tests/compiler/dart2js/deferred_mirrors_test.dart
+++ b/tests/compiler/dart2js/deferred_mirrors_test.dart
@@ -11,7 +11,7 @@
 import 'memory_source_file_helper.dart';
 import "memory_compiler.dart";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 runTest(String mainScript, test) {
diff --git a/tests/compiler/dart2js/deferred_not_in_main_test.dart b/tests/compiler/dart2js/deferred_not_in_main_test.dart
index 5c1bf87..636525d 100644
--- a/tests/compiler/dart2js/deferred_not_in_main_test.dart
+++ b/tests/compiler/dart2js/deferred_not_in_main_test.dart
@@ -11,7 +11,7 @@
 import 'memory_source_file_helper.dart';
 import "dart:async";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 class FakeOutputStream<T> extends EventSink<T> {
diff --git a/tests/compiler/dart2js/diagnose_ambiguous_test.dart b/tests/compiler/dart2js/diagnose_ambiguous_test.dart
index f9a41a4..f73c43f 100644
--- a/tests/compiler/dart2js/diagnose_ambiguous_test.dart
+++ b/tests/compiler/dart2js/diagnose_ambiguous_test.dart
@@ -6,7 +6,7 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show Diagnostic;
 
 main() {
diff --git a/tests/compiler/dart2js/dump_info_test.dart b/tests/compiler/dart2js/dump_info_test.dart
index 374b862..678e6a8 100644
--- a/tests/compiler/dart2js/dump_info_test.dart
+++ b/tests/compiler/dart2js/dump_info_test.dart
@@ -6,7 +6,7 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'memory_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dump_info.dart';
+import 'package:compiler/implementation/dump_info.dart';
 
 const String TEST_ONE = r"""
 library main;
diff --git a/tests/compiler/dart2js/erroneous_element_test.dart b/tests/compiler/dart2js/erroneous_element_test.dart
index 893dc3c..f4f21e8 100644
--- a/tests/compiler/dart2js/erroneous_element_test.dart
+++ b/tests/compiler/dart2js/erroneous_element_test.dart
@@ -3,13 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
+import 'package:compiler/implementation/elements/elements.dart';
 import 'parser_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart'
+import 'package:compiler/implementation/elements/modelx.dart'
     show ErroneousElementX;
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
     show MessageKind;
 
 void main() {
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index 074e33d..c81b99f 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -12,14 +12,15 @@
 import 'package:async_helper/async_helper.dart';

 import 'package:expect/expect.dart';

 

-import '../../../sdk/lib/_internal/compiler/compiler.dart' as api;

-import '../../../sdk/lib/_internal/compiler/implementation/dart2js.dart' as entry;

-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart' as apiimpl;

-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';

+import 'package:compiler/compiler.dart' as api;

+import 'package:compiler/implementation/dart2js.dart' as entry;

+import 'package:compiler/implementation/dart2jslib.dart';

+import 'package:compiler/implementation/apiimpl.dart' as apiimpl;

+import 'package:compiler/implementation/elements/elements.dart';

+import 'package:compiler/implementation/library_loader.dart';

+import 'package:compiler/implementation/resolution/resolution.dart';

+import 'package:compiler/implementation/scanner/scannerlib.dart';

+import 'package:compiler/implementation/util/util.dart';

 

 class TestCompiler extends apiimpl.Compiler {

   final String testMarker;

@@ -48,14 +49,14 @@
     return super.run(uri);

   }

 

-  Future scanBuiltinLibraries() {

-    test('Compiler.scanBuiltinLibraries');

-    return super.scanBuiltinLibraries();

+  Future onLibraryScanned(LibraryElement element, LibraryLoader loader) {

+    test('Compiler.onLibraryScanned');

+    return super.onLibraryScanned(element, loader);

   }

 

-  void initializeSpecialClasses() {

-    test('Compiler.initializeSpecialClasses');

-    super.initializeSpecialClasses();

+  Future onLibrariesLoaded(Map<Uri, LibraryElement> loadedLibraries) {

+    test('Compiler.onLibrariesLoaded');

+    return super.onLibrariesLoaded(loadedLibraries);

   }

 

   TreeElements analyzeElement(Element element) {

@@ -248,8 +249,8 @@
   final tests = {

     'Compiler': beforeRun,

     'Compiler.run': beforeRun,

-    'Compiler.scanBuiltinLibraries': beforeRun,

-    'Compiler.initializeSpecialClasses': beforeRun,

+    'Compiler.onLibraryScanned': beforeRun,

+    'Compiler.onLibrariesLoaded': beforeRun,

     'ScannerTask.scanElements': duringRun,

     'Compiler.withCurrentElement': duringRun,

     'Compiler.analyzeElement': duringRun,

diff --git a/tests/compiler/dart2js/field_type_simple_inferer_test.dart b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
index 9f0d498..82a6613 100644
--- a/tests/compiler/dart2js/field_type_simple_inferer_test.dart
+++ b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/find_my_name_test.dart b/tests/compiler/dart2js/find_my_name_test.dart
index 4de23ca..4fbdfb0 100644
--- a/tests/compiler/dart2js/find_my_name_test.dart
+++ b/tests/compiler/dart2js/find_my_name_test.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
+import "package:async_helper/async_helper.dart";
+import "package:compiler/implementation/elements/elements.dart";
 import "mock_compiler.dart";
 import "parser_helper.dart";
 
@@ -25,9 +26,10 @@
 ''';
 
 main() {
-  MockCompiler compiler = new MockCompiler();
-  testClass(TEST_0, compiler);
-  testClass(TEST_1, compiler);
+  asyncTest(() => MockCompiler.create((MockCompiler compiler) {
+    testClass(TEST_0, compiler);
+    testClass(TEST_1, compiler);
+  }));
 }
 
 testClass(String code, MockCompiler compiler) {
diff --git a/tests/compiler/dart2js/for_in_test.dart b/tests/compiler/dart2js/for_in_test.dart
index 4ded809..23db24a 100644
--- a/tests/compiler/dart2js/for_in_test.dart
+++ b/tests/compiler/dart2js/for_in_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -27,8 +29,12 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(!generated.contains(r'break'));
-  generated = compile(TEST_TWO, entry: 'foo');
-  Expect.isTrue(generated.contains(r'continue'));
+  asyncTest(() => Future.wait([
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(!generated.contains(r'break'));
+    }),
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains(r'continue'));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/generate_at_use_site_test.dart b/tests/compiler/dart2js/generate_at_use_site_test.dart
index 573b302..4e9e100 100644
--- a/tests/compiler/dart2js/generate_at_use_site_test.dart
+++ b/tests/compiler/dart2js/generate_at_use_site_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String FIB = r"""
@@ -49,16 +51,17 @@
 """;
 
 main() {
-  // Make sure we don't introduce a new variable.
-  RegExp regexp = new RegExp("var $anyIdentifier =");
-  compileAndDoNotMatch(FIB, 'fib', regexp);
+  asyncTest(() => Future.wait([
+    // Make sure we don't introduce a new variable.
+    compileAndDoNotMatch(FIB, 'fib', new RegExp("var $anyIdentifier =")),
 
-  regexp = new RegExp("isLeaf");
-  compileAndDoNotMatch(BAR, 'bar', regexp);
+    compileAndDoNotMatch(BAR, 'bar', new RegExp("isLeaf")),
 
-  String generated = compile(TEST, entry: 'foo');
-  Expect.isFalse(generated.contains('else'));
-  // Regression check to ensure that there is no floating variable
-  // expression.
-  Expect.isFalse(new RegExp('^[ ]*a;').hasMatch(generated));
+    compile(TEST, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('else'));
+      // Regression check to ensure that there is no floating variable
+      // expression.
+      Expect.isFalse(new RegExp('^[ ]*a;').hasMatch(generated));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/gvn_test.dart b/tests/compiler/dart2js/gvn_test.dart
index 150237d..4050222 100644
--- a/tests/compiler/dart2js/gvn_test.dart
+++ b/tests/compiler/dart2js/gvn_test.dart
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -106,33 +107,41 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  RegExp regexp = new RegExp(r"1 \+ [a-z]+");
-  checkNumberOfMatches(regexp.allMatches(generated).iterator, 1);
+  asyncTest(() => Future.wait([
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp(r"1 \+ [a-z]+");
+      checkNumberOfMatches(regexp.allMatches(generated).iterator, 1);
+    }),
 
-  generated = compile(TEST_TWO, entry: 'foo');
-  checkNumberOfMatches(new RegExp("length").allMatches(generated).iterator, 1);
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      checkNumberOfMatches(
+          new RegExp("length").allMatches(generated).iterator, 1);
+    }),
 
-  generated = compile(TEST_THREE, entry: 'foo');
-  checkNumberOfMatches(new RegExp("number").allMatches(generated).iterator, 1);
+    compile(TEST_THREE, entry: 'foo', check: (String generated) {
+      checkNumberOfMatches(
+          new RegExp("number").allMatches(generated).iterator, 1);
+    }),
 
-  generated = compile(TEST_FOUR, entry: 'foo');
-  checkNumberOfMatches(new RegExp("shr").allMatches(generated).iterator, 1);
+    compile(TEST_FOUR, entry: 'foo', check: (String generated) {
+      checkNumberOfMatches(new RegExp("shr").allMatches(generated).iterator, 1);
+    }),
 
-  asyncTest(() => compileAll(TEST_FIVE).then((generated) {
-    checkNumberOfMatches(
-        new RegExp("get\\\$foo").allMatches(generated).iterator, 1);
-  }));
+    compileAll(TEST_FIVE).then((generated) {
+      checkNumberOfMatches(
+          new RegExp("get\\\$foo").allMatches(generated).iterator, 1);
+    }),
 
-  asyncTest(() => compileAll(TEST_SIX).then((generated) {
-    Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
-  }));
+    compileAll(TEST_SIX).then((generated) {
+      Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
+    }),
 
-  asyncTest(() => compileAll(TEST_SEVEN).then((generated) {
-    Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
-  }));
+    compileAll(TEST_SEVEN).then((generated) {
+      Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
+    }),
 
-  asyncTest(() => compileAll(TEST_EIGHT).then((generated) {
-    Expect.isTrue(generated.contains('for (; i < t1; ++i)'));
-  }));
+    compileAll(TEST_EIGHT).then((generated) {
+      Expect.isTrue(generated.contains('for (; i < t1; ++i)'));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/identity_test.dart b/tests/compiler/dart2js/identity_test.dart
index eec4136..6e25ea4 100644
--- a/tests/compiler/dart2js/identity_test.dart
+++ b/tests/compiler/dart2js/identity_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -15,15 +16,16 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
 
-  // Check that no boolify code is generated.
-  RegExp regexp = new RegExp("=== true");
-  Iterator matches = regexp.allMatches(generated).iterator;
-  Expect.isFalse(matches.moveNext());
+    // Check that no boolify code is generated.
+    RegExp regexp = new RegExp("=== true");
+    Iterator matches = regexp.allMatches(generated).iterator;
+    Expect.isFalse(matches.moveNext());
 
-  regexp = new RegExp("===");
-  matches = regexp.allMatches(generated).iterator;
-  Expect.isTrue(matches.moveNext());
-  Expect.isFalse(matches.moveNext());
+    regexp = new RegExp("===");
+    matches = regexp.allMatches(generated).iterator;
+    Expect.isTrue(matches.moveNext());
+    Expect.isFalse(matches.moveNext());
+  }));
 }
diff --git a/tests/compiler/dart2js/import_test.dart b/tests/compiler/dart2js/import_test.dart
index aeaa469..2fce82d 100644
--- a/tests/compiler/dart2js/import_test.dart
+++ b/tests/compiler/dart2js/import_test.dart
@@ -33,7 +33,9 @@
   var compiler = compilerFor(MEMORY_SOURCE_FILES, diagnosticHandler: collector);
   asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
     Expect.equals(4, collector.errors.length);
-    Expect.equals(1, collector.warnings.length);
+    // TODO(johnniwinther): Expect 1 warning when analysis of programs with load
+    // failures is reenabled.
+    Expect.equals(0, collector.warnings.length);
   }));
 }
 
diff --git a/tests/compiler/dart2js/incremental/compile_all.dart b/tests/compiler/dart2js/incremental/compile_all.dart
new file mode 100644
index 0000000..0579f51
--- /dev/null
+++ b/tests/compiler/dart2js/incremental/compile_all.dart
@@ -0,0 +1,178 @@
+// 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.
+
+// Helper file that can be used to manually test the stability of incremental
+// compilation.  Currently this test is not run automatically.
+
+import 'dart:async';
+
+import 'dart:io';
+
+import 'dart:profiler' show
+    UserTag;
+
+import 'package:dart2js_incremental/dart2js_incremental.dart' show
+    IncrementalCompiler;
+
+import '../memory_source_file_helper.dart' show
+    Compiler;
+
+import '../memory_compiler.dart' show
+    compilerFor;
+
+const bool verbose = false;
+
+main(List<String> arguments) {
+  Stopwatch sw = new Stopwatch()..start();
+  Map<String, String> sources = <String, String>{};
+  for (String argument in arguments) {
+    Uri uri = new Uri(scheme: 'memory', path: argument);
+    String source =
+        new File.fromUri(Uri.base.resolve(argument)).readAsStringSync();
+    sources['${uri.path}'] = source;
+  }
+  sw.stop();
+  print(sw.elapsedMilliseconds);
+  compileTests(sources);
+}
+
+void compileTests(Map<String, String> sources) {
+  int cancellations = 0;
+  int testCount = 0;
+  int skipCount = 0;
+  Set<String> crashes = new Set<String>();
+  Compiler memoryCompiler = compilerFor(sources);
+  memoryCompiler.handler.verbose = verbose;
+  var options = ['--analyze-main'];
+  if (true || verbose) options.add('--verbose');
+  IncrementalCompiler compiler = new IncrementalCompiler(
+      libraryRoot: memoryCompiler.libraryRoot,
+      inputProvider: memoryCompiler.provider,
+      outputProvider: memoryCompiler.outputProvider,
+      diagnosticHandler: memoryCompiler.handler,
+      packageRoot: memoryCompiler.packageRoot,
+      options: options);
+  Future.forEach(sources.keys, (String path) {
+    UserTag.defaultTag.makeCurrent();
+    if (!path.endsWith('_test.dart')) return new Future.value(null);
+    testCount++;
+    for (String brokenTest in brokenTests) {
+      if (path.endsWith(brokenTest)) {
+        print('Skipped broken test $path');
+        skipCount++;
+        return new Future.value(null);
+      }
+    }
+    Stopwatch sw = new Stopwatch()..start();
+    return compiler.compile(Uri.parse('memory:$path')).then((bool success) {
+      UserTag.defaultTag.makeCurrent();
+      sw.stop();
+      print('Compiled $path in ${sw.elapsedMilliseconds}');
+      if (compiler.compilerWasCancelled) cancellations++;
+      sw..reset()..start();
+    }).catchError((error, trace) {
+      sw.stop();
+      print('$error\n$trace');
+      print('Crash when compiling $path after ${sw.elapsedMilliseconds}');
+      sw..reset()..start();
+      crashes.add(path);
+    });
+  }).then((_) {
+    percent(i) => '${(i/testCount*100).toStringAsFixed(3)}%';
+    print('''
+
+Total: $testCount tests
+ * $cancellations tests (${percent(cancellations)}) cancelled the compiler
+ * ${crashes.length} tests (${percent(crashes.length)}) crashed the compiler
+ * $skipCount tests (${percent(skipCount)}) were skipped
+''');
+    for (String crash in crashes) {
+      print('Crashed: $crash');
+    }
+    if (!crashes.isEmpty) {
+      throw 'Test had crashes';
+    }
+  });
+}
+
+Set<String> brokenTests = new Set<String>.from([
+    // TODO(ahe): Fix the outputProvider to not throw an error.
+    "/dart2js_extra/deferred/deferred_class_library.dart",
+    "/dart2js_extra/deferred/deferred_class_library2.dart",
+    "/dart2js_extra/deferred/deferred_class_test.dart",
+    "/dart2js_extra/deferred/deferred_constant2_test.dart",
+    "/dart2js_extra/deferred/deferred_constant3_test.dart",
+    "/dart2js_extra/deferred/deferred_constant4_test.dart",
+    "/dart2js_extra/deferred/deferred_constant_test.dart",
+    "/dart2js_extra/deferred/deferred_function_library.dart",
+    "/dart2js_extra/deferred/deferred_function_test.dart",
+    "/dart2js_extra/deferred/deferred_overlapping_lib1.dart",
+    "/dart2js_extra/deferred/deferred_overlapping_lib2.dart",
+    "/dart2js_extra/deferred/deferred_overlapping_lib3.dart",
+    "/dart2js_extra/deferred/deferred_overlapping_test.dart",
+    "/dart2js_extra/deferred/deferred_unused_classes_test.dart",
+    "/language/deferred_closurize_load_library_lib.dart",
+    "/language/deferred_closurize_load_library_test.dart",
+    "/language/deferred_constraints_constants_lib.dart",
+    "/language/deferred_constraints_constants_old_syntax_lib.dart",
+    "/language/deferred_constraints_constants_old_syntax_test.dart",
+    "/language/deferred_constraints_constants_test.dart",
+    "/language/deferred_constraints_lib.dart",
+    "/language/deferred_constraints_lib2.dart",
+    "/language/deferred_constraints_old_syntax_lib.dart",
+    "/language/deferred_constraints_type_annotation_old_syntax_test.dart",
+    "/language/deferred_constraints_type_annotation_test.dart",
+    "/language/deferred_duplicate_prefix1_test.dart",
+    "/language/deferred_duplicate_prefix2_test.dart",
+    "/language/deferred_duplicate_prefix3_test.dart",
+    "/language/deferred_load_inval_code_lib.dart",
+    "/language/deferred_load_inval_code_test.dart",
+    "/language/deferred_load_library_wrong_args_lib.dart",
+    "/language/deferred_load_library_wrong_args_test.dart",
+    "/language/deferred_no_prefix_test.dart",
+    "/language/deferred_no_such_method_lib.dart",
+    "/language/deferred_no_such_method_test.dart",
+    "/language/deferred_not_loaded_check_lib.dart",
+    "/language/deferred_not_loaded_check_test.dart",
+    "/language/deferred_prefix_constraints_lib.dart",
+    "/language/deferred_prefix_constraints_lib2.dart",
+    "/language/deferred_shadow_load_library_lib.dart",
+    "/language/deferred_shadow_load_library_test.dart",
+
+    "/language/bad_constructor_test.dart",
+    "/language/black_listed_test.dart",
+    "/language/built_in_identifier_illegal_test.dart",
+    "/language/built_in_identifier_prefix_test.dart",
+    "/language/built_in_identifier_test.dart",
+    "/language/class_cycle2_test.dart",
+    "/language/class_syntax_test.dart",
+    "/language/cyclic_typedef_test.dart",
+    "/language/external_test.dart",
+    "/language/factory3_negative_test.dart",
+    "/language/generic_field_mixin4_test.dart",
+    "/language/generic_field_mixin5_test.dart",
+    "/language/interface_cycle_test.dart",
+    "/language/interface_injection1_negative_test.dart",
+    "/language/interface_injection2_negative_test.dart",
+    "/language/internal_library_test.dart",
+    "/language/malformed_inheritance_test.dart",
+    "/language/metadata_test.dart",
+    "/language/method_override2_test.dart",
+    "/language/mixin_illegal_syntax_test.dart",
+    "/language/mixin_invalid_inheritance1_test.dart",
+    "/language/null_test.dart",
+    "/language/override_inheritance_generic_test.dart",
+    "/language/prefix18_negative_test.dart",
+    "/language/prefix3_negative_test.dart",
+    "/language/script2_negative_test.dart",
+    "/language/setter_declaration2_negative_test.dart",
+    "/language/source_self_negative_test.dart",
+    "/language/syntax_test.dart",
+    "/language/type_variable_bounds2_test.dart",
+    "/language/type_variable_conflict2_test.dart",
+    "/language/type_variable_field_initializer_test.dart",
+    "/language/type_variable_nested_test.dart",
+    "/language/vm/reflect_core_vm_test.dart",
+    "/language/vm/regress_14903_test.dart",
+]);
diff --git a/tests/compiler/dart2js/incremental/hello_test.dart b/tests/compiler/dart2js/incremental/hello_test.dart
new file mode 100644
index 0000000..026ce57
--- /dev/null
+++ b/tests/compiler/dart2js/incremental/hello_test.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test a sequence of modifications to hello-world which used to cause problems
+// on Try Dart.
+
+import 'dart:io' show
+    Platform;
+
+import 'dart:async' show
+    Future;
+
+import 'package:dart2js_incremental/dart2js_incremental.dart' show
+    IncrementalCompiler;
+
+import 'package:compiler/compiler.dart' show
+    Diagnostic;
+
+import 'package:async_helper/async_helper.dart' show
+    asyncTest;
+
+import 'package:expect/expect.dart' show
+    Expect;
+
+import '../memory_source_file_helper.dart' show
+    MemorySourceFileProvider;
+
+var tests = {
+'/test1.dart':
+'''
+var greeting = "Hello, World!";
+
+void main() {
+  print(greeting);
+}
+''',
+'/test2.dart':
+'''
+va greeting = "Hello, World!";
+
+void main() {
+  print(greeting);
+}
+''',
+'/test3.dart':
+'''
+ greeting = "Hello, World!";
+
+void main() {
+  print(greeting);
+}
+''',
+'/test4.dart':
+'''
+in greeting = "Hello, World!";
+
+void main() {
+  print(greeting);
+}
+''',
+'/test5.dart':
+'''
+int greeting = "Hello, World!";
+
+void main() {
+  print(greeting);
+}
+''',
+};
+
+var testResults = {
+  '/test1.dart': true,
+  '/test2.dart': true,
+  '/test3.dart': false,
+  '/test4.dart': false,
+  '/test5.dart': true,
+};
+
+main() {
+  Uri libraryRoot = Uri.base.resolve('sdk/');
+  Uri packageRoot = Uri.base.resolveUri(
+      new Uri.file('${Platform.packageRoot}/'));
+  MemorySourceFileProvider provider =
+      new MemorySourceFileProvider(tests);
+  asyncTest(() => runTests(libraryRoot, packageRoot, provider));
+}
+
+Future runTests(
+    Uri libraryRoot,
+    Uri packageRoot,
+    MemorySourceFileProvider provider) {
+  IncrementalCompiler compiler = new IncrementalCompiler(
+      diagnosticHandler: handler,
+      inputProvider: provider,
+      options: ['--analyze-main'],
+      libraryRoot: libraryRoot,
+      packageRoot: packageRoot);
+
+  return Future.forEach(tests.keys, (String testName) {
+    Uri testUri = Uri.parse('memory:$testName');
+    return compiler.compile(testUri).then((bool success) {
+      Expect.equals(
+          testResults[testName], success,
+          'Compilation unexpectedly ${success ? "succeed" : "failed"}.');
+    });
+  });
+}
+
+void handler(Uri uri,
+             int begin,
+             int end,
+             String message,
+             Diagnostic kind) {
+  if (kind != Diagnostic.VERBOSE_INFO) {
+    print('$uri:$begin:$end:$message:$kind');
+  }
+}
diff --git a/tests/compiler/dart2js/interceptor_test.dart b/tests/compiler/dart2js/interceptor_test.dart
index 53a3ef5..619d018 100644
--- a/tests/compiler/dart2js/interceptor_test.dart
+++ b/tests/compiler/dart2js/interceptor_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -24,18 +26,23 @@
 """;
 
 main() {
-  // Check that one-shot interceptors preserve variable names, see
-  // https://code.google.com/p/dart/issues/detail?id=8106.
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(generated.contains(new RegExp(r'[$A-Z]+\.toString\$0\(a\)')));
-  Expect.isTrue(generated.contains('myVariableName'));
-
-  // Check that an intercepted getter that does not need to be
-  // intercepted, is turned into a regular getter call or field
-  // access.
-  generated = compile(TEST_TWO, entry: 'foo');
-  Expect.isFalse(generated.contains(r'a.get$length()'));
-  Expect.isTrue(generated.contains(new RegExp(r'[$A-Z]+\.A\$\(\)\.length')));
-  Expect.isTrue(
-      generated.contains(new RegExp(r'[$A-Z]+\.get\$length\$as\(a\)')));
+  asyncTest(() => Future.wait([
+    // Check that one-shot interceptors preserve variable names, see
+    // https://code.google.com/p/dart/issues/detail?id=8106.
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(
+          generated.contains(new RegExp(r'[$A-Z]+\.toString\$0\(a\)')));
+      Expect.isTrue(generated.contains('myVariableName'));
+    }),
+    // Check that an intercepted getter that does not need to be
+    // intercepted, is turned into a regular getter call or field
+    // access.
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains(r'a.get$length()'));
+      Expect.isTrue(
+          generated.contains(new RegExp(r'[$A-Z]+\.A\$\(\)\.length')));
+      Expect.isTrue(
+          generated.contains(new RegExp(r'[$A-Z]+\.get\$length\$as\(a\)')));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/interpolation_folding_test.dart b/tests/compiler/dart2js/interpolation_folding_test.dart
index 1cfc4af..673a85c 100644
--- a/tests/compiler/dart2js/interpolation_folding_test.dart
+++ b/tests/compiler/dart2js/interpolation_folding_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 
@@ -37,22 +39,25 @@
 """;
 
 main() {
-  void check(String test, String contained) {
-    var generated = compile(test, entry: 'foo');
-    Expect.isTrue(generated.contains(contained), contained);
+  Future check(String test, String contained) {
+    return compile(test, entry: 'foo').then((String generated) {
+      Expect.isTrue(generated.contains(contained), contained);
+    });
   }
 
-  // Full substitution.
-  check(TEST_1, r'"u120vhellow"');
+  asyncTest(() => Future.wait([
+    // Full substitution.
+    check(TEST_1, r'"u120vhellow"'),
 
-  // Adjacent string fragments get merged.
-  check(TEST_2, r'"xxxxxyyyyy"');
+    // Adjacent string fragments get merged.
+    check(TEST_2, r'"xxxxxyyyyy"'),
 
-  // 1. No merging of fragments that are multi-use.  Prevents exponential code
-  //    and keeps author's manual CSE.
-  // 2. Know string values require no stringification.
-  check(TEST_3, r'return b + "x" + b');
+    // 1. No merging of fragments that are multi-use.  Prevents exponential code
+    //    and keeps author's manual CSE.
+    // 2. Know string values require no stringification.
+    check(TEST_3, r'return b + "x" + b'),
 
-  // Known int value can be formatted directly.
-  check(TEST_4, r'return "" + b.length');
+    // Known int value can be formatted directly.
+    check(TEST_4, r'return "" + b.length'),
+  ]));
 }
diff --git a/tests/compiler/dart2js/inverse_operator_test.dart b/tests/compiler/dart2js/inverse_operator_test.dart
index e6c7cd5..44c10de 100644
--- a/tests/compiler/dart2js/inverse_operator_test.dart
+++ b/tests/compiler/dart2js/inverse_operator_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String MAIN = r"""
@@ -17,5 +18,5 @@
 
 main() {
   // Make sure we don't introduce a new variable.
-  compileAndMatchFuzzy(MAIN, 'main', "1 >= x");
+  asyncTest(() => compileAndMatchFuzzy(MAIN, 'main', "1 >= x"));
 }
diff --git a/tests/compiler/dart2js/is_inference2_test.dart b/tests/compiler/dart2js/is_inference2_test.dart
index 2ce07d5..3e3e6ea 100644
--- a/tests/compiler/dart2js/is_inference2_test.dart
+++ b/tests/compiler/dart2js/is_inference2_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_IF_BOOL_FIRST_INSTRUCTION = r"""
@@ -13,9 +14,11 @@
 """;
 
 main() {
-  String generated = compile(TEST_IF_BOOL_FIRST_INSTRUCTION, entry: 'negate');
-  Expect.isTrue(generated.contains("!"));  // We want to see !x.
-  Expect.isFalse(generated.contains("!="));  // And not !== true.
-  Expect.isFalse(generated.contains("true"));
-  Expect.isFalse(generated.contains("false"));
+  asyncTest(() => compile(TEST_IF_BOOL_FIRST_INSTRUCTION, entry: 'negate',
+      check: (String generated) {
+    Expect.isTrue(generated.contains("!"));  // We want to see !x.
+    Expect.isFalse(generated.contains("!="));  // And not !== true.
+    Expect.isFalse(generated.contains("true"));
+    Expect.isFalse(generated.contains("false"));
+  }));
 }
diff --git a/tests/compiler/dart2js/is_inference_test.dart b/tests/compiler/dart2js/is_inference_test.dart
index d648913..6f0a3b8 100644
--- a/tests/compiler/dart2js/is_inference_test.dart
+++ b/tests/compiler/dart2js/is_inference_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_IF = r"""
@@ -69,20 +71,23 @@
 }
 """;
 
-compileAndTest(String code) {
-  String generated = compile(code, entry: 'test');
-  RegExp validAdd =
-      new RegExp("($anyIdentifier \\+ 42)|($anyIdentifier \\+= 42)");
-  RegExp invalidAdd = new RegExp("$anyIdentifier \\+ 53");
-  Expect.isTrue(validAdd.hasMatch(generated));
-  Expect.isFalse(invalidAdd.hasMatch(generated));
+Future compileAndTest(String code) {
+  return compile(code, entry: 'test', check: (String generated) {
+    RegExp validAdd =
+        new RegExp("($anyIdentifier \\+ 42)|($anyIdentifier \\+= 42)");
+    RegExp invalidAdd = new RegExp("$anyIdentifier \\+ 53");
+    Expect.isTrue(validAdd.hasMatch(generated));
+    Expect.isFalse(invalidAdd.hasMatch(generated));
+  });
 }
 
 main() {
-  compileAndTest(TEST_IF);
-  compileAndTest(TEST_IF_ELSE);
-  compileAndTest(TEST_IF_RETURN);
-  compileAndTest(TEST_IF_NOT_ELSE);
-  compileAndTest(TEST_IF_NOT_RETURN);
-  compileAndTest(TEST_IF_NOT_ELSE_RETURN);
+  asyncTest(() => Future.wait([
+    compileAndTest(TEST_IF),
+    compileAndTest(TEST_IF_ELSE),
+    compileAndTest(TEST_IF_RETURN),
+    compileAndTest(TEST_IF_NOT_ELSE),
+    compileAndTest(TEST_IF_NOT_RETURN),
+    compileAndTest(TEST_IF_NOT_ELSE_RETURN),
+  ]));
 }
diff --git a/tests/compiler/dart2js/js_parser_statements_test.dart b/tests/compiler/dart2js/js_parser_statements_test.dart
index 733e4ac..e2dcdbe 100644
--- a/tests/compiler/dart2js/js_parser_statements_test.dart
+++ b/tests/compiler/dart2js/js_parser_statements_test.dart
@@ -2,32 +2,37 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
 import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'mock_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/js/js.dart' as jsAst;
-import '../../../sdk/lib/_internal/compiler/implementation/js/js.dart' show js;
+import 'package:compiler/implementation/js/js.dart' as jsAst;
+import 'package:compiler/implementation/js/js.dart' show js;
 
 
-void testStatement(String statement, List arguments, String expect) {
+Future testStatement(String statement, List arguments, String expect) {
   jsAst.Node node = js.statement(statement, arguments);
-  MockCompiler compiler = new MockCompiler();
-  String jsText =
-      jsAst.prettyPrint(node, compiler, allowVariableMinification: false)
-      .getText();
+  return MockCompiler.create((MockCompiler compiler) {
+    String jsText =
+        jsAst.prettyPrint(node, compiler, allowVariableMinification: false)
+        .getText();
 
-  Expect.stringEquals(expect.trim(), jsText.trim());
+    Expect.stringEquals(expect.trim(), jsText.trim());
+  });
 }
 
-void testError(String statement, List arguments, [String expect = ""]) {
-  bool doCheck(exception) {
-    String message = '$exception';
-    Expect.isTrue(message.contains(expect), '"$message" contains "$expect"');
-    return true;
-  }
-  void action() {
-    jsAst.Node node = js.statement(statement, arguments);
-  }
-  Expect.throws(action, doCheck);
+Future testError(String statement, List arguments, [String expect = ""]) {
+  return new Future.sync(() {
+    bool doCheck(exception) {
+      String message = '$exception';
+      Expect.isTrue(message.contains(expect), '"$message" contains "$expect"');
+      return true;
+    }
+    void action() {
+      jsAst.Node node = js.statement(statement, arguments);
+    }
+    Expect.throws(action, doCheck);
+  });
 }
 
 // Function declaration and named function.
@@ -64,91 +69,93 @@
   var eTrue = js('true');
   var eVar = js('x');
   var block12 = js.statement('{ 1; 2; }');
+  var seq1 = js('1, 2, 3');
 
   Expect.isTrue(eOne is jsAst.LiteralNumber);
   Expect.isTrue(eTrue is jsAst.LiteralBool);
   Expect.isTrue(block12 is jsAst.Block);
 
-  // Interpolated Expressions are upgraded to ExpressionStatements.
-  testStatement('{ #; #; }', [eOne, eOne], '{\n  1;\n  1;\n}');
+  asyncTest(() => Future.wait([
+    // Interpolated Expressions are upgraded to ExpressionStatements.
+    testStatement('{ #; #; }', [eOne, eOne], '{\n  1;\n  1;\n}'),
 
-  // Interpolated sub-blocks are spliced.
-  testStatement('{ #; #; }', [block12, block12],
-      '{\n  1;\n  2;\n  1;\n  2;\n}\n');
+    // Interpolated sub-blocks are spliced.
+    testStatement('{ #; #; }', [block12, block12],
+        '{\n  1;\n  2;\n  1;\n  2;\n}\n'),
 
-  // If-condition.  Dart booleans are evaluated, JS Expression booleans are
-  // substituted.
-  testStatement('if (#) #', [eOne, block12], 'if (1) {\n  1;\n  2;\n}');
-  testStatement('if (#) #;', [eTrue, block12], 'if (true) {\n  1;\n  2;\n}');
-  testStatement('if (#) #;', [eVar, block12], 'if (x) {\n  1;\n  2;\n}');
-  testStatement('if (#) #;', ['a', block12], 'if (a) {\n  1;\n  2;\n}');
-  testStatement('if (#) #;', [true, block12], '{\n  1;\n  2;\n}');
-  testStatement('if (#) #;', [false, block12], ';');
-  testStatement('if (#) 3; else #;', [true, block12], '3;');
-  testStatement('if (#) 3; else #;', [false, block12], '{\n  1;\n  2;\n}');
+    // If-condition.  Dart booleans are evaluated, JS Expression booleans are
+    // substituted.
+    testStatement('if (#) #', [eOne, block12], 'if (1) {\n  1;\n  2;\n}'),
+    testStatement('if (#) #;', [eTrue, block12], 'if (true) {\n  1;\n  2;\n}'),
+    testStatement('if (#) #;', [eVar, block12], 'if (x) {\n  1;\n  2;\n}'),
+    testStatement('if (#) #;', ['a', block12], 'if (a) {\n  1;\n  2;\n}'),
+    testStatement('if (#) #;', [true, block12], '{\n  1;\n  2;\n}'),
+    testStatement('if (#) #;', [false, block12], ';'),
+    testStatement('if (#) 3; else #;', [true, block12], '3;'),
+    testStatement('if (#) 3; else #;', [false, block12], '{\n  1;\n  2;\n}'),
 
 
-  testStatement(NAMED_FUNCTION_1, [eOne], NAMED_FUNCTION_1_ONE);
+    testStatement(NAMED_FUNCTION_1, [eOne], NAMED_FUNCTION_1_ONE),
 
-  testStatement(MISC_1, [block12], MISC_1_1);
+    testStatement(MISC_1, [block12], MISC_1_1),
 
-  // Argument list splicing.
-  testStatement('foo(#)', [[]], 'foo();');
-  testStatement('foo(#)', [[eOne]], 'foo(1);');
-  testStatement('foo(#)', [eOne], 'foo(1);');
-  testStatement('foo(#)', [[eTrue,eOne]], 'foo(true, 1);');
+    // Argument list splicing.
+    testStatement('foo(#)', [[]], 'foo();'),
+    testStatement('foo(#)', [[eOne]], 'foo(1);'),
+    testStatement('foo(#)', [eOne], 'foo(1);'),
+    testStatement('foo(#)', [[eTrue,eOne]], 'foo(true, 1);'),
 
-  testStatement('foo(2,#)', [[]], 'foo(2);');
-  testStatement('foo(2,#)', [[eOne]], 'foo(2, 1);');
-  testStatement('foo(2,#)', [eOne], 'foo(2, 1);');
-  testStatement('foo(2,#)', [[eTrue,eOne]], 'foo(2, true, 1);');
+    testStatement('foo(2,#)', [[]], 'foo(2);'),
+    testStatement('foo(2,#)', [[eOne]], 'foo(2, 1);'),
+    testStatement('foo(2,#)', [eOne], 'foo(2, 1);'),
+    testStatement('foo(2,#)', [[eTrue,eOne]], 'foo(2, true, 1);'),
 
-  testStatement('foo(#,3)', [[]], 'foo(3);');
-  testStatement('foo(#,3)', [[eOne]], 'foo(1, 3);');
-  testStatement('foo(#,3)', [eOne], 'foo(1, 3);');
-  testStatement('foo(#,3)', [[eTrue,eOne]], 'foo(true, 1, 3);');
+    testStatement('foo(#,3)', [[]], 'foo(3);'),
+    testStatement('foo(#,3)', [[eOne]], 'foo(1, 3);'),
+    testStatement('foo(#,3)', [eOne], 'foo(1, 3);'),
+    testStatement('foo(#,3)', [[eTrue,eOne]], 'foo(true, 1, 3);'),
 
-  testStatement('foo(2,#,3)', [[]], 'foo(2, 3);');
-  testStatement('foo(2,#,3)', [[eOne]], 'foo(2, 1, 3);');
-  testStatement('foo(2,#,3)', [eOne], 'foo(2, 1, 3);');
-  testStatement('foo(2,#,3)', [[eTrue,eOne]], 'foo(2, true, 1, 3);');
+    testStatement('foo(2,#,3)', [[]], 'foo(2, 3);'),
+    testStatement('foo(2,#,3)', [[eOne]], 'foo(2, 1, 3);'),
+    testStatement('foo(2,#,3)', [eOne], 'foo(2, 1, 3);'),
+    testStatement('foo(2,#,3)', [[eTrue,eOne]], 'foo(2, true, 1, 3);'),
 
-  // Interpolated Literals
-  testStatement('a = {#: 1}', [eOne], 'a = {1: 1};');
-  // Maybe we should make this work?
-  testError('a = {#: 1}', [1], 'is not a Literal: 1');
+    // Interpolated Literals
+    testStatement('a = {#: 1}', [eOne], 'a = {1: 1};'),
+    // Maybe we should make this work?
+    testError('a = {#: 1}', [1], 'is not a Literal: 1'),
 
-  // Interpolated parameter splicing.
-  testStatement('function foo(#){}', [new jsAst.Parameter('x')],
-      'function foo(x) {\n}');
-  testStatement('function foo(#){}', ['x'], 'function foo(x) {\n}');
-  testStatement('function foo(#){}', [[]], 'function foo() {\n}');
-  testStatement('function foo(#){}', [['x']], 'function foo(x) {\n}');
-  testStatement('function foo(#){}', [['x', 'y']], 'function foo(x, y) {\n}');
+    // Interpolated parameter splicing.
+    testStatement('function foo(#){}', [new jsAst.Parameter('x')],
+        'function foo(x) {\n}'),
+    testStatement('function foo(#){}', ['x'], 'function foo(x) {\n}'),
+    testStatement('function foo(#){}', [[]], 'function foo() {\n}'),
+    testStatement('function foo(#){}', [['x']], 'function foo(x) {\n}'),
+    testStatement('function foo(#){}', [['x', 'y']], 'function foo(x, y) {\n}'),
 
 
-  testStatement('a = #.#', [eVar,eOne], 'a = x[1];');
-  testStatement('a = #.#', [eVar,'foo'], 'a = x.foo;');
+    testStatement('a = #.#', [eVar,eOne], 'a = x[1];'),
+    testStatement('a = #.#', [eVar,'foo'], 'a = x.foo;'),
 
-  testStatement('function f(#) { return #.#; }', ['x', eVar,'foo'],
-      'function f(x) {\n  return x.foo;\n}');
+    testStatement('function f(#) { return #.#; }', ['x', eVar,'foo'],
+        'function f(x) {\n  return x.foo;\n}'),
 
-  testStatement('#.prototype.# = function(#) { return #.# };',
-      ['className', 'getterName', ['r', 'y'], 'r', 'fieldName'],
-      'className.prototype.getterName = function(r, y) {\n'
-      '  return r.fieldName;\n'
-      '};');
+    testStatement('#.prototype.# = function(#) { return #.# };',
+        ['className', 'getterName', ['r', 'y'], 'r', 'fieldName'],
+        'className.prototype.getterName = function(r, y) {\n'
+        '  return r.fieldName;\n'
+        '};'),
 
-  testStatement('function foo(r, #) { return #[r](#) }',
-      [['a', 'b'], 'g', ['b', 'a']],
-      'function foo(r, a, b) {\n  return g[r](b, a);\n}');
+    testStatement('function foo(r, #) { return #[r](#) }',
+        [['a', 'b'], 'g', ['b', 'a']],
+        'function foo(r, a, b) {\n  return g[r](b, a);\n}'),
 
-  // Sequence is printed flattened
-  var seq1 = js('1, 2, 3');
-  testStatement('x = #', [seq1], 'x = (1, 2, 3);');
-  testStatement('x = (#, #)', [seq1, seq1], 'x = (1, 2, 3, 1, 2, 3);');
-  testStatement('x = #, #', [seq1, seq1], 'x = (1, 2, 3), 1, 2, 3;');
-  testStatement(
-      'for (i = 0, j = #, k = 0; ; ++i, ++j, ++k){}', [seq1],
-      'for (i = 0, j = (1, 2, 3), k = 0;; ++i, ++j, ++k) {\n}');
+    // Sequence is printed flattened
+    testStatement('x = #', [seq1], 'x = (1, 2, 3);'),
+    testStatement('x = (#, #)', [seq1, seq1], 'x = (1, 2, 3, 1, 2, 3);'),
+    testStatement('x = #, #', [seq1, seq1], 'x = (1, 2, 3), 1, 2, 3;'),
+    testStatement(
+        'for (i = 0, j = #, k = 0; ; ++i, ++j, ++k){}', [seq1],
+        'for (i = 0, j = (1, 2, 3), k = 0;; ++i, ++j, ++k) {\n}'),
+  ]));
 }
diff --git a/tests/compiler/dart2js/js_parser_test.dart b/tests/compiler/dart2js/js_parser_test.dart
index db6f43a..54fe2ad 100644
--- a/tests/compiler/dart2js/js_parser_test.dart
+++ b/tests/compiler/dart2js/js_parser_test.dart
@@ -2,188 +2,193 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
 import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'mock_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/js/js.dart' as jsAst;
-import '../../../sdk/lib/_internal/compiler/implementation/js/js.dart' show js;
+import 'package:compiler/implementation/js/js.dart' as jsAst;
+import 'package:compiler/implementation/js/js.dart' show js;
 
-void testExpression(String expression, [String expect = ""]) {
+Future testExpression(String expression, [String expect = ""]) {
   jsAst.Node node = js(expression);
-  MockCompiler compiler = new MockCompiler();
-  String jsText =
-      jsAst.prettyPrint(node,
-                        compiler,
-                        allowVariableMinification: false).getText();
-  if (expect == "") {
-    Expect.stringEquals(expression, jsText);
-  } else {
-    Expect.stringEquals(expect, jsText);
-  }
+  return MockCompiler.create((MockCompiler compiler) {
+    String jsText =
+        jsAst.prettyPrint(node,
+                          compiler,
+                          allowVariableMinification: false).getText();
+    if (expect == "") {
+      Expect.stringEquals(expression, jsText);
+    } else {
+      Expect.stringEquals(expect, jsText);
+    }
+  });
 }
 
-void testError(String expression, [String expect = ""]) {
-  bool doCheck(exception) {
-    Expect.isTrue(exception.toString().contains(expect));
-    return true;
-  }
-  Expect.throws(() => js(expression), doCheck);
+Future testError(String expression, [String expect = ""]) {
+  return new Future.sync(() {
+    bool doCheck(exception) {
+      Expect.isTrue(exception.toString().contains(expect));
+      return true;
+    }
+    Expect.throws(() => js(expression), doCheck);
+  });
 }
-    
-
 
 void main() {
-  // Asterisk indicates deviations from real JS.
-  // Simple var test.
-  testExpression('var a = ""');
-  // Parse and print will normalize whitespace.
-  testExpression(' var  a  =  "" ', 'var a = ""');
-  // Operator precedence.
-  testExpression('x = a + b * c');
-  testExpression('x = a * b + c');
-  testExpression('x = a + b * c + d');
-  testExpression('x = a * b + c * d');
-  testExpression('remaining = (remaining / 88) | 0',
-                 'remaining = remaining / 88 | 0');
-  // Binary operators have left associativity.
-  testExpression('x = a + b + c');
-  // We can cope with relational operators and non-relational.
-  testExpression('a + b == c + d');
-  // The prettyprinter will insert braces where needed.
-  testExpression('a + (b == c) + d');
-  // We can handle () for calls.
-  testExpression('foo(bar)');
-  testExpression('foo(bar, baz)');
-  // Chained calls without parentheses.
-  testExpression('foo(bar)(baz)');
-  // Chaned calls with and without new.
-  testExpression('new foo(bar)(baz)');
-  testExpression('new foo.bar(bar)(baz)');
-  testExpression('foo.bar(bar)(baz)');
-  testExpression('constructor = new Function(str)()');
-  // The prettyprinter understands chained calls without extra parentheses.
-  testExpression('(foo(bar))(baz)', 'foo(bar)(baz)');
-  // Chains of dotting and calls.
-  testExpression('foo.bar(baz)');
-  // String literal.
-  testExpression('var x = "fisk"');
-  // String literal with \n.
-  testExpression(r'var x = "\n"');
-  // String literal with escaped quote.
-  testExpression(r'var x = "\""');
-  // *No clever escapes.
-  testError(r'var x = "\x42"', 'escapes are not allowed in literals');
-  // Operator new.
-  testExpression('new Foo()');
-  // New with dotted access.
-  testExpression('new Frobinator.frobinate()');
-  testExpression('new Frobinator().frobinate()');
-  // The prettyprinter strips some superfluous parentheses.
-  testExpression('(new Frobinator()).frobinate()',
-                 'new Frobinator().frobinate()');
-  // *We want a bracket on 'new'.
-  testError('new Foo', 'Parentheses are required');
-  testError('(new Foo)', 'Parentheses are required');
-  // Bogus operators.
-  testError('a +++ b', 'Unknown operator');
-  // This isn't perl.  There are rules.
-  testError('a <=> b', 'Unknown operator');
-  // Typeof.
-  testExpression('typeof foo == "number"');
-  // Strange relation.
-  testExpression('a < b < c');
-  // Chained var.
-  testExpression('var x = 0, y = 1.2, z = 42');
-  // Empty object literal.
-  testExpression('foo({}, {})');
-  // *Can't handle non-empty object literals
-  testExpression('foo({meaning: 42})');
-  // Literals.
-  testExpression('x(false, true, null)');
-  // *We should really throw here.
-  testExpression('var false = 42');
-  testExpression('var new = 42');
-  // Bad keyword.
-  testError('var typeof = 42', "Expected ALPHA");
-  // Malformed decimal/hex.
-  testError('var x = 1.1.1', "Unparseable number");
-  testError('var x = 0xabcdefga', "Unparseable number");
-  testError('var x = 0xabcdef\$a', "Unparseable number");
-  testError('var x = 0x ', "Unparseable number");
-  // Good hex constants.
-  testExpression('var x = 0xff');
-  testExpression('var x = 0xff + 0xff');
-  testExpression('var x = 0xaF + 0x0123456789abcdefABCDEF');
-  // All sorts of keywords are allowed as property names in ES5.
-  testExpression('x.new = 0');
-  testExpression('x.delete = 0');
-  testExpression('x.for = 0');
-  testExpression('x.instanceof = 0');
-  testExpression('x.in = 0');
-  testExpression('x.void = 0');
-  testExpression('x.continue = 0');
-  // More unary.
-  testExpression('x = !x');
-  testExpression('!x == false');
-  testExpression('var foo = void 0');
-  testExpression('delete foo.bar');
-  testExpression('delete foo');
-  testExpression('x in y');
-  testExpression('x instanceof y');
-  testExpression('a * b in c * d');
-  testExpression('a * b instanceof c * d');
-  testError('x typeof y', 'Unparsed junk');
-  testExpression('x &= ~mask');
-  // Adjacent tokens.
-  testExpression('foo[x[bar]]');
-  testExpression('foo[[bar]]');
-  // Prefix ++ etc.
-  testExpression("++x");
-  testExpression("++foo.bar");
-  testExpression("+x");
-  testExpression("+foo.bar");
-  testExpression("-x");
-  testExpression("-foo.bar");
-  testExpression("--x");
-  testExpression("--foo.bar");
-  // Postfix ++ etc.
-  testExpression("x++");
-  testExpression("foo.bar++");
-  testExpression("x--");
-  testExpression("foo.bar--");
-  // Both!
-  testExpression("++x++");
-  testExpression("++foo.bar++");
-  testExpression("--x--");
-  testExpression("--foo.bar--");
-  // *We can't handle stacked unary operators (apart from !).
-  testError("x++ ++");
-  testError("++ typeof x");
-  testExpression(r"var $supportsProtoName = !!{}.__proto__");
-  // ++ used as a binary operator.
-  testError("x++ ++ 42");
-  // Shift operators.
-  testExpression("x << 5");
-  testExpression("x << y + 1");
-  testExpression("x <<= y + 1");
-  // Array initializers.
-  testExpression("x = ['foo', 'bar', x[4]]");
-  testExpression("[]");
-  testError("[42 42]");
-  testExpression('beebop([1, 2, 3])');
-  // *We can't parse array literals with holes in them.
-  testError("[1,, 2]");
-  testError("[1,]");
-  testError("[,]");
-  testError("[, 42]");
-  // Ternary operator.
-  testExpression("x = a ? b : c");
-  testExpression("y = a == null ? b : a");
-  testExpression("y = a == null ? b + c : a + c");
-  testExpression("foo = a ? b : c ? d : e");
-  testExpression("foo = a ? b ? c : d : e");
-  testExpression("foo = (a = v) ? b = w : c = x ? d = y : e = z");
-  testExpression("foo = (a = v) ? b = w ? c = x : d = y : e = z");
-  // Stacked assignment.
-  testExpression("a = b = c");
-  testExpression("var a = b = c");
+  asyncTest(() => Future.wait([
+    // Asterisk indicates deviations from real JS.
+    // Simple var test.
+    testExpression('var a = ""'),
+    // Parse and print will normalize whitespace.
+    testExpression(' var  a  =  "" ', 'var a = ""'),
+    // Operator precedence.
+    testExpression('x = a + b * c'),
+    testExpression('x = a * b + c'),
+    testExpression('x = a + b * c + d'),
+    testExpression('x = a * b + c * d'),
+    testExpression('remaining = (remaining / 88) | 0',
+                   'remaining = remaining / 88 | 0'),
+    // Binary operators have left associativity.
+    testExpression('x = a + b + c'),
+    // We can cope with relational operators and non-relational.
+    testExpression('a + b == c + d'),
+    // The prettyprinter will insert braces where needed.
+    testExpression('a + (b == c) + d'),
+    // We can handle () for calls.
+    testExpression('foo(bar)'),
+    testExpression('foo(bar, baz)'),
+    // Chained calls without parentheses.
+    testExpression('foo(bar)(baz)'),
+    // Chaned calls with and without new.
+    testExpression('new foo(bar)(baz)'),
+    testExpression('new foo.bar(bar)(baz)'),
+    testExpression('foo.bar(bar)(baz)'),
+    testExpression('constructor = new Function(str)()'),
+    // The prettyprinter understands chained calls without extra parentheses.
+    testExpression('(foo(bar))(baz)', 'foo(bar)(baz)'),
+    // Chains of dotting and calls.
+    testExpression('foo.bar(baz)'),
+    // String literal.
+    testExpression('var x = "fisk"'),
+    // String literal with \n.
+    testExpression(r'var x = "\n"'),
+    // String literal with escaped quote.
+    testExpression(r'var x = "\""'),
+    // *No clever escapes.
+    testError(r'var x = "\x42"', 'escapes are not allowed in literals'),
+    // Operator new.
+    testExpression('new Foo()'),
+    // New with dotted access.
+    testExpression('new Frobinator.frobinate()'),
+    testExpression('new Frobinator().frobinate()'),
+    // The prettyprinter strips some superfluous parentheses.
+    testExpression('(new Frobinator()).frobinate()',
+                   'new Frobinator().frobinate()'),
+    // *We want a bracket on 'new'.
+    testError('new Foo', 'Parentheses are required'),
+    testError('(new Foo)', 'Parentheses are required'),
+    // Bogus operators.
+    testError('a +++ b', 'Unknown operator'),
+    // This isn't perl.  There are rules.
+    testError('a <=> b', 'Unknown operator'),
+    // Typeof.
+    testExpression('typeof foo == "number"'),
+    // Strange relation.
+    testExpression('a < b < c'),
+    // Chained var.
+    testExpression('var x = 0, y = 1.2, z = 42'),
+    // Empty object literal.
+    testExpression('foo({}, {})'),
+    // *Can't handle non-empty object literals
+    testExpression('foo({meaning: 42})'),
+    // Literals.
+    testExpression('x(false, true, null)'),
+    // *We should really throw here.
+    testExpression('var false = 42'),
+    testExpression('var new = 42'),
+    // Bad keyword.
+    testError('var typeof = 42', "Expected ALPHA"),
+    // Malformed decimal/hex.
+    testError('var x = 1.1.1', "Unparseable number"),
+    testError('var x = 0xabcdefga', "Unparseable number"),
+    testError('var x = 0xabcdef\$a', "Unparseable number"),
+    testError('var x = 0x ', "Unparseable number"),
+    // Good hex constants.
+    testExpression('var x = 0xff'),
+    testExpression('var x = 0xff + 0xff'),
+    testExpression('var x = 0xaF + 0x0123456789abcdefABCDEF'),
+    // All sorts of keywords are allowed as property names in ES5.
+    testExpression('x.new = 0'),
+    testExpression('x.delete = 0'),
+    testExpression('x.for = 0'),
+    testExpression('x.instanceof = 0'),
+    testExpression('x.in = 0'),
+    testExpression('x.void = 0'),
+    testExpression('x.continue = 0'),
+    // More unary.
+    testExpression('x = !x'),
+    testExpression('!x == false'),
+    testExpression('var foo = void 0'),
+    testExpression('delete foo.bar'),
+    testExpression('delete foo'),
+    testExpression('x in y'),
+    testExpression('x instanceof y'),
+    testExpression('a * b in c * d'),
+    testExpression('a * b instanceof c * d'),
+    testError('x typeof y', 'Unparsed junk'),
+    testExpression('x &= ~mask'),
+    // Adjacent tokens.
+    testExpression('foo[x[bar]]'),
+    testExpression('foo[[bar]]'),
+    // Prefix ++ etc.
+    testExpression("++x"),
+    testExpression("++foo.bar"),
+    testExpression("+x"),
+    testExpression("+foo.bar"),
+    testExpression("-x"),
+    testExpression("-foo.bar"),
+    testExpression("--x"),
+    testExpression("--foo.bar"),
+    // Postfix ++ etc.
+    testExpression("x++"),
+    testExpression("foo.bar++"),
+    testExpression("x--"),
+    testExpression("foo.bar--"),
+    // Both!
+    testExpression("++x++"),
+    testExpression("++foo.bar++"),
+    testExpression("--x--"),
+    testExpression("--foo.bar--"),
+    // *We can't handle stacked unary operators (apart from !).
+    testError("x++ ++"),
+    testError("++ typeof x"),
+    testExpression(r"var $supportsProtoName = !!{}.__proto__"),
+    // ++ used as a binary operator.
+    testError("x++ ++ 42"),
+    // Shift operators.
+    testExpression("x << 5"),
+    testExpression("x << y + 1"),
+    testExpression("x <<= y + 1"),
+    // Array initializers.
+    testExpression("x = ['foo', 'bar', x[4]]"),
+    testExpression("[]"),
+    testError("[42 42]"),
+    testExpression('beebop([1, 2, 3])'),
+    // *We can't parse array literals with holes in them.
+    testError("[1,, 2]"),
+    testError("[1,]"),
+    testError("[,]"),
+    testError("[, 42]"),
+    // Ternary operator.
+    testExpression("x = a ? b : c"),
+    testExpression("y = a == null ? b : a"),
+    testExpression("y = a == null ? b + c : a + c"),
+    testExpression("foo = a ? b : c ? d : e"),
+    testExpression("foo = a ? b ? c : d : e"),
+    testExpression("foo = (a = v) ? b = w : c = x ? d = y : e = z"),
+    testExpression("foo = (a = v) ? b = w ? c = x : d = y : e = z"),
+    // Stacked assignment.
+    testExpression("a = b = c"),
+    testExpression("var a = b = c"),
+  ]));
 }
diff --git a/tests/compiler/dart2js/least_upper_bound_test.dart b/tests/compiler/dart2js/least_upper_bound_test.dart
index f263f3b..3be823a 100644
--- a/tests/compiler/dart2js/least_upper_bound_test.dart
+++ b/tests/compiler/dart2js/least_upper_bound_test.dart
@@ -7,10 +7,10 @@
 import 'package:expect/expect.dart';

 import 'package:async_helper/async_helper.dart';

 import 'type_test_helper.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';

-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"

+import 'package:compiler/implementation/dart_types.dart';

+import "package:compiler/implementation/elements/elements.dart"

        show Element, ClassElement;

-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart'

+import 'package:compiler/implementation/util/util.dart'

        show Link;

 

 void main() {

diff --git a/tests/compiler/dart2js/licm_test.dart b/tests/compiler/dart2js/licm_test.dart
index 3e1a98a..438d174 100644
--- a/tests/compiler/dart2js/licm_test.dart
+++ b/tests/compiler/dart2js/licm_test.dart
@@ -5,8 +5,7 @@
 // Check that we hoist instructions in a loop condition, even if that
 // condition involves control flow.
 
-import 'package:expect/expect.dart';
-
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST = '''
@@ -25,6 +24,6 @@
 ''';
 
 main() {
-  compileAndMatch(TEST, 'main',
-      new RegExp('if \\(typeof count !== "number"\\)(.|\\n)*while'));
+  asyncTest(() => compileAndMatch(TEST, 'main',
+      new RegExp('if \\(typeof count !== "number"\\)(.|\\n)*while')));
 }
diff --git a/tests/compiler/dart2js/link_test.dart b/tests/compiler/dart2js/link_test.dart
index 55d6ae3..681c5ef 100644
--- a/tests/compiler/dart2js/link_test.dart
+++ b/tests/compiler/dart2js/link_test.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/util/util_implementation.dart';
+import 'package:compiler/implementation/util/util.dart';
+import 'package:compiler/implementation/util/util_implementation.dart';
 
 main() {
   test(const Link<Comparable>().prepend('three').prepend(2).prepend('one'),
diff --git a/tests/compiler/dart2js/list_tracer2_test.dart b/tests/compiler/dart2js/list_tracer2_test.dart
index 4f2d7b2..f92525f 100644
--- a/tests/compiler/dart2js/list_tracer2_test.dart
+++ b/tests/compiler/dart2js/list_tracer2_test.dart
@@ -7,8 +7,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show ContainerTypeMask, TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/list_tracer3_test.dart b/tests/compiler/dart2js/list_tracer3_test.dart
index 4cf3a8f..9c188b3 100644
--- a/tests/compiler/dart2js/list_tracer3_test.dart
+++ b/tests/compiler/dart2js/list_tracer3_test.dart
@@ -7,8 +7,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show ContainerTypeMask, TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/list_tracer_test.dart b/tests/compiler/dart2js/list_tracer_test.dart
index 9a3bfda..198f7e4 100644
--- a/tests/compiler/dart2js/list_tracer_test.dart
+++ b/tests/compiler/dart2js/list_tracer_test.dart
@@ -4,8 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show ContainerTypeMask, TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/literal_list_test.dart b/tests/compiler/dart2js/literal_list_test.dart
index efb146d..7544f90 100644
--- a/tests/compiler/dart2js/literal_list_test.dart
+++ b/tests/compiler/dart2js/literal_list_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -15,8 +16,9 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(generated.contains('print([1, 2]);'));
-  Expect.isTrue(generated.contains('print([3]);'));
-  Expect.isTrue(generated.contains('print([4, 5]);'));
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
+    Expect.isTrue(generated.contains('print([1, 2]);'));
+    Expect.isTrue(generated.contains('print([3]);'));
+    Expect.isTrue(generated.contains('print([4, 5]);'));
+  }));
 }
diff --git a/tests/compiler/dart2js/literal_map_test.dart b/tests/compiler/dart2js/literal_map_test.dart
index 1b51336..b2862ea 100644
--- a/tests/compiler/dart2js/literal_map_test.dart
+++ b/tests/compiler/dart2js/literal_map_test.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import "compiler_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'compiler_helper.dart';
 
 const String TEST = """
 foo() {
@@ -14,12 +15,13 @@
 """;
 
 main() {
-  String generated = compile(TEST, entry: 'foo');
-  // Make sure we have all the type information we need.
-  Expect.isFalse(generated.contains('bailout'));
-  Expect.isFalse(generated.contains('interceptor'));
-  // Make sure we don't go through an interceptor.
-  Expect.isTrue(
-      generated.contains(r'a.$indexSet(a') ||
-      generated.contains(r'.$indexSet(0'));
+  asyncTest(() => compile(TEST, entry: 'foo', check: (String generated) {
+    // Make sure we have all the type information we need.
+    Expect.isFalse(generated.contains('bailout'));
+    Expect.isFalse(generated.contains('interceptor'));
+    // Make sure we don't go through an interceptor.
+    Expect.isTrue(
+        generated.contains(r'a.$indexSet(a') ||
+        generated.contains(r'.$indexSet(0'));
+  }));
 }
diff --git a/tests/compiler/dart2js/logical_expression_test.dart b/tests/compiler/dart2js/logical_expression_test.dart
index 75d69e9..5e9056a 100644
--- a/tests/compiler/dart2js/logical_expression_test.dart
+++ b/tests/compiler/dart2js/logical_expression_test.dart
@@ -4,7 +4,8 @@
 
 // Test that logical or-expressions don't introduce unnecessary nots.
 
-import "package:async_helper/async_helper.dart";
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -24,24 +25,26 @@
 """;
 
 main() {
-  // We want something like:
-  //     var t1 = bar.call$0() === true;
-  //     if (t1 || gee.call$0() === true) gee.call$0();
-  //     if (t1 || gee.call$0() === true) gee.call$0();
-  compileAndDoNotMatchFuzzy(TEST_ONE, 'foo',
-                       r"""var x = [a-zA-Z0-9$.]+\(\) == true;
-                           if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
-                           if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;""");
+  asyncTest(() => Future.wait([
+    // We want something like:
+    //     var t1 = bar.call$0() === true;
+    //     if (t1 || gee.call$0() === true) gee.call$0();
+    //     if (t1 || gee.call$0() === true) gee.call$0();
+    compileAndDoNotMatchFuzzy(TEST_ONE, 'foo',
+        r"""var x = [a-zA-Z0-9$.]+\(\) == true;
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;"""),
 
 
-  // We want something like:
-  //     var t1 = list == null;
-  //     if (t1) bar.call$0();
-  //     if (t1 || bar.call$0() === true) bar.call$0();
-  //     if (t1 || bar.call$0() === true) bar.call$0();
-  compileAndMatchFuzzy(TEST_TWO, 'foo',
-                       r"""var x = x == null;
-                           if \(x\) [^;]+;
-                           if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
-                           if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;""");
+    // We want something like:
+    //     var t1 = list == null;
+    //     if (t1) bar.call$0();
+    //     if (t1 || bar.call$0() === true) bar.call$0();
+    //     if (t1 || bar.call$0() === true) bar.call$0();
+    compileAndMatchFuzzy(TEST_TWO, 'foo',
+        r"""var x = x == null;
+            if \(x\) [^;]+;
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;"""),
+  ]));
 }
diff --git a/tests/compiler/dart2js/lookup_member_test.dart b/tests/compiler/dart2js/lookup_member_test.dart
index bc8bf85..2b3ed47 100644
--- a/tests/compiler/dart2js/lookup_member_test.dart
+++ b/tests/compiler/dart2js/lookup_member_test.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import 'package:compiler/implementation/dart_types.dart';
+import "package:compiler/implementation/elements/elements.dart"
        show Element, ClassElement, MemberSignature, PublicName;
 
 void main() {
diff --git a/tests/compiler/dart2js/loop_test.dart b/tests/compiler/dart2js/loop_test.dart
index 9be7195..fbb092a 100644
--- a/tests/compiler/dart2js/loop_test.dart
+++ b/tests/compiler/dart2js/loop_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -52,12 +54,18 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(generated.contains(r'for ('));
-  generated = compile(TEST_TWO, entry: 'foo');
-  Expect.isTrue(!generated.contains(r'break'));
-  generated = compile(TEST_THREE, entry: 'foo');
-  Expect.isTrue(generated.contains(r'continue'));
-  generated = compile(TEST_FOUR, entry: 'foo');
-  Expect.isTrue(generated.contains(r'continue'));
+  asyncTest(() => Future.wait([
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains(r'for ('));
+    }),
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      Expect.isTrue(!generated.contains(r'break'));
+    }),
+    compile(TEST_THREE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains(r'continue'));
+    }),
+    compile(TEST_FOUR, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains(r'continue'));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/map_tracer_keys_test.dart b/tests/compiler/dart2js/map_tracer_keys_test.dart
index cec1c29..89904e2 100644
--- a/tests/compiler/dart2js/map_tracer_keys_test.dart
+++ b/tests/compiler/dart2js/map_tracer_keys_test.dart
@@ -4,8 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show ContainerTypeMask, TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/map_tracer_test.dart b/tests/compiler/dart2js/map_tracer_test.dart
index a3f10a1..cf0ae97 100644
--- a/tests/compiler/dart2js/map_tracer_test.dart
+++ b/tests/compiler/dart2js/map_tracer_test.dart
@@ -4,8 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show MapTypeMask, TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/members_test.dart b/tests/compiler/dart2js/members_test.dart
index 6b1679c..d650fdd 100644
--- a/tests/compiler/dart2js/members_test.dart
+++ b/tests/compiler/dart2js/members_test.dart
@@ -7,11 +7,11 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import 'package:compiler/implementation/dart_types.dart';
+import "package:compiler/implementation/elements/elements.dart"
        show Element, ClassElement, MemberSignature, Name, PublicName,
             DeclaredMember, Member;
-import "../../../sdk/lib/_internal/compiler/implementation/resolution/class_members.dart"
+import "package:compiler/implementation/resolution/class_members.dart"
   show DeclaredMember, ErroneousMember, SyntheticMember;
 
 void main() {
@@ -19,6 +19,7 @@
   testInterfaceMembers();
   testClassVsInterfaceMembers();
   testMixinMembers();
+  testMixinMembersWithoutImplements();
 }
 
 MemberSignature getMember(InterfaceType cls, String name,
@@ -680,4 +681,29 @@
     checkMember(C_this, 'method4', checkType: ALSO_CLASS_MEMBER,
                 inheritedFrom: A_U);
   }));
+}
+
+void testMixinMembersWithoutImplements() {
+  asyncTest(() => TypeEnvironment.create(r"""
+    abstract class A {
+      m();
+    }
+    abstract class B implements A {
+    }
+    abstract class C extends Object with B {}
+    """).then((env) {
+
+    DynamicType dynamic_ = env['dynamic'];
+    VoidType void_ = env['void'];
+    InterfaceType num_ = env['num'];
+    InterfaceType int_ = env['int'];
+
+    InterfaceType A = env['A'];
+    InterfaceType B = env['B'];
+    InterfaceType C = env['C'];
+
+    checkMember(C, 'm', checkType: NO_CLASS_MEMBER,
+                inheritedFrom: A,
+                functionType: env.functionType(dynamic_ , []));
+  }));
 }
\ No newline at end of file
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index 5d0431c..938ac9e 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -6,16 +6,16 @@
 
 import 'memory_source_file_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        show NullSink;
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show Diagnostic, DiagnosticHandler, CompilerOutputProvider;
 
 import 'dart:async';
 
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart';
+import 'package:compiler/implementation/mirrors/source_mirrors.dart';
+import 'package:compiler/implementation/mirrors/analyze.dart';
 
 class DiagnosticMessage {
   final Uri uri;
@@ -127,7 +127,7 @@
   Uri libraryRoot = Uri.base.resolve('sdk/');
   Uri script = Uri.base.resolveUri(Platform.script);
   if (packageRoot == null) {
-    packageRoot = Uri.base.resolve('${Platform.packageRoot}/');
+    packageRoot = Uri.base.resolveUri(new Uri.file('${Platform.packageRoot}/'));
   }
 
   MemorySourceFileProvider provider;
@@ -166,12 +166,27 @@
   if (cachedCompiler != null) {
     compiler.coreLibrary = cachedCompiler.libraries['dart:core'];
     compiler.types = cachedCompiler.types.copy(compiler);
+    Map copiedLibraries = {};
     cachedCompiler.libraries.forEach((String uri, library) {
       if (library.isPlatformLibrary) {
+        compiler.onLibraryCreated(library);
         compiler.libraries[uri] = library;
-        compiler.onLibraryLoaded(library, library.canonicalUri);
+        // TODO(johnniwinther): Assert that no libraries are created lazily from
+        // this call.
+        compiler.onLibraryScanned(library, null);
+        if (library.isPatched) {
+          var patchLibrary = library.patch;
+          compiler.onLibraryCreated(patchLibrary);
+          // TODO(johnniwinther): Assert that no libraries are created lazily
+          // from this call.
+          compiler.onLibraryScanned(patchLibrary, null);
+        }
+        copiedLibraries[library.canonicalUri] = library;
       }
     });
+    // TODO(johnniwinther): Assert that no libraries are loaded lazily from
+    // this call.
+    compiler.onLibrariesLoaded(copiedLibraries);
 
     compiler.symbolConstructor = cachedCompiler.symbolConstructor;
     compiler.mirrorSystemClass = cachedCompiler.mirrorSystemClass;
@@ -185,12 +200,11 @@
     compiler.mirrorsUsedConstructor = cachedCompiler.mirrorsUsedConstructor;
     compiler.deferredLibraryClass = cachedCompiler.deferredLibraryClass;
 
-    Map cachedTreeElements =
+    Iterable cachedTreeElements =
         cachedCompiler.enqueuer.resolution.resolvedElements;
-    cachedTreeElements.forEach((element, treeElements) {
+    cachedTreeElements.forEach((element) {
       if (element.library.isPlatformLibrary) {
-        compiler.enqueuer.resolution.resolvedElements[element] =
-            treeElements;
+        compiler.enqueuer.resolution.registerResolvedElement(element);
       }
     });
 
@@ -224,7 +238,8 @@
                                       List<String> options: const [],
                                       bool showDiagnostics: true}) {
   Uri libraryRoot = Uri.base.resolve('sdk/');
-  Uri packageRoot = Uri.base.resolve('${Platform.packageRoot}/');
+  Uri packageRoot = Uri.base.resolveUri(
+      new Uri.file('${Platform.packageRoot}/'));
   Uri script = Uri.base.resolveUri(Platform.script);
 
   var provider = new MemorySourceFileProvider(memorySourceFiles);
diff --git a/tests/compiler/dart2js/memory_source_file_helper.dart b/tests/compiler/dart2js/memory_source_file_helper.dart
index db8010d..09d2d86 100644
--- a/tests/compiler/dart2js/memory_source_file_helper.dart
+++ b/tests/compiler/dart2js/memory_source_file_helper.dart
@@ -7,19 +7,19 @@
 import 'dart:async' show Future;
 export 'dart:io' show Platform;
 
-export '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart'
+export 'package:compiler/implementation/apiimpl.dart'
        show Compiler;
 
-export '../../../sdk/lib/_internal/compiler/implementation/filenames.dart'
+export 'package:compiler/implementation/filenames.dart'
        show currentDirectory;
 
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart'
+import 'package:compiler/implementation/source_file.dart'
        show StringSourceFile;
 
-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart'
+import 'package:compiler/implementation/source_file_provider.dart'
        show SourceFileProvider;
 
-export '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart'
+export 'package:compiler/implementation/source_file_provider.dart'
        show SourceFileProvider, FormattingDiagnosticHandler;
 
 class MemorySourceFileProvider extends SourceFileProvider {
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/message_kind_helper.dart
index 5a16e56..81b6824 100644
--- a/tests/compiler/dart2js/message_kind_helper.dart
+++ b/tests/compiler/dart2js/message_kind_helper.dart
@@ -7,7 +7,7 @@
 import 'package:expect/expect.dart';
 import 'dart:async';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' show
+import 'package:compiler/implementation/dart2jslib.dart' show
     Compiler,
     MessageKind;
 
diff --git a/tests/compiler/dart2js/message_kind_test.dart b/tests/compiler/dart2js/message_kind_test.dart
index b3cca95..6482f53 100644
--- a/tests/compiler/dart2js/message_kind_test.dart
+++ b/tests/compiler/dart2js/message_kind_test.dart
@@ -5,7 +5,7 @@
 import 'package:expect/expect.dart';
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' show
+import 'package:compiler/implementation/dart2jslib.dart' show
     DualKind,
     MessageKind;
 
diff --git a/tests/compiler/dart2js/metadata_test.dart b/tests/compiler/dart2js/metadata_test.dart
index 1c7f596..a5f648b 100644
--- a/tests/compiler/dart2js/metadata_test.dart
+++ b/tests/compiler/dart2js/metadata_test.dart
@@ -6,7 +6,7 @@
 import "package:async_helper/async_helper.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
     show PrimitiveConstant;
 
 void checkPosition(Spannable spannable, Node node, String source, compiler) {
diff --git a/tests/compiler/dart2js/minify_many_locals_test.dart b/tests/compiler/dart2js/minify_many_locals_test.dart
index 1d62fa4..b1379ae 100644
--- a/tests/compiler/dart2js/minify_many_locals_test.dart
+++ b/tests/compiler/dart2js/minify_many_locals_test.dart
@@ -3,12 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
-import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 
 main() {
   var buffer = new StringBuffer();
-  buffer.write("var foo(");
+  buffer.write("foo(");
   for (int i = 0; i < 2000; i++) {
     buffer.write("x$i, ");
   }
@@ -17,25 +18,29 @@
     buffer.write("x$i+");
   }
   buffer.write("2000; return i; }");
-  var generated = compile(buffer.toString(), entry: 'foo', minify: true);
-  RegExp re = new RegExp(r"\(a,b,c");
-  Expect.isTrue(re.hasMatch(generated));
+  String code = buffer.toString();
 
-  re = new RegExp(r"x,y,z,a0,a1,a2");
-  Expect.isTrue(re.hasMatch(generated));
+  asyncTest(() => compile(code, entry: 'foo', minify: true)
+      .then((String generated) {
+    RegExp re = new RegExp(r"\(a,b,c");
+    Expect.isTrue(re.hasMatch(generated));
 
-  re = new RegExp(r"y,z,a0,a1,a2,a3,a4,a5,a6");
-  Expect.isTrue(re.hasMatch(generated));
+    re = new RegExp(r"x,y,z,a0,a1,a2");
+    Expect.isTrue(re.hasMatch(generated));
 
-  re = new RegExp(r"g8,g9,h0,h1");
-  Expect.isTrue(re.hasMatch(generated));
+    re = new RegExp(r"y,z,a0,a1,a2,a3,a4,a5,a6");
+    Expect.isTrue(re.hasMatch(generated));
 
-  re = new RegExp(r"z8,z9,aa0,aa1,aa2");
-  Expect.isTrue(re.hasMatch(generated));
+    re = new RegExp(r"g8,g9,h0,h1");
+    Expect.isTrue(re.hasMatch(generated));
 
-  re = new RegExp(r"aa9,ab0,ab1");
-  Expect.isTrue(re.hasMatch(generated));
+    re = new RegExp(r"z8,z9,aa0,aa1,aa2");
+    Expect.isTrue(re.hasMatch(generated));
 
-  re = new RegExp(r"az9,ba0,ba1");
-  Expect.isTrue(re.hasMatch(generated));
+    re = new RegExp(r"aa9,ab0,ab1");
+    Expect.isTrue(re.hasMatch(generated));
+
+    re = new RegExp(r"az9,ba0,ba1");
+    Expect.isTrue(re.hasMatch(generated));
+  }));
 }
diff --git a/tests/compiler/dart2js/mirror_helper_rename_test.dart b/tests/compiler/dart2js/mirror_helper_rename_test.dart
index 10a1e22..13cfc98 100644
--- a/tests/compiler/dart2js/mirror_helper_rename_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_rename_test.dart
@@ -6,16 +6,12 @@
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
 import 'memory_compiler.dart' show compilerFor;
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart' show
+import 'package:compiler/implementation/apiimpl.dart' show
     Compiler;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart'
-show
+import 'package:compiler/implementation/tree/tree.dart' show
     Node;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart';
-import
-    '../../../sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart';
+import 'package:compiler/implementation/dart_backend/dart_backend.dart';
+import 'package:compiler/implementation/mirror_renamer/mirror_renamer.dart';
 
 main() {
   testWithMirrorHelperLibrary(minify: true);
diff --git a/tests/compiler/dart2js/mirror_helper_test.dart b/tests/compiler/dart2js/mirror_helper_test.dart
index 1f3b7ae..80888b8 100644
--- a/tests/compiler/dart2js/mirror_helper_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_test.dart
@@ -6,26 +6,17 @@
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
 import 'memory_compiler.dart' show compilerFor;
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart' show
+import 'package:compiler/implementation/apiimpl.dart' show
     Compiler;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
-show
+import 'package:compiler/implementation/elements/elements.dart' show
     Element, LibraryElement, ClassElement;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart'
-show
+import 'package:compiler/implementation/tree/tree.dart' show
     Block, ExpressionStatement, FunctionExpression, Node, Send;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart'
-show
+import 'package:compiler/implementation/dart_backend/dart_backend.dart' show
     DartBackend, ElementAst;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart'
-show
+import 'package:compiler/implementation/mirror_renamer/mirror_renamer.dart' show
     MirrorRenamer;
 
-
 main() {
   testWithMirrorRenaming(minify: true);
   testWithMirrorRenaming(minify: false);
diff --git a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
index 13d9194..9d1c314 100644
--- a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
@@ -6,18 +6,13 @@
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
 import 'memory_compiler.dart' show compilerFor;
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart' show
+import 'package:compiler/implementation/apiimpl.dart' show
     Compiler;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart'
-show
+import 'package:compiler/implementation/dart_backend/dart_backend.dart' show
     DartBackend;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart'
-show Identifier, Node, Send;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart'
-show
+import 'package:compiler/implementation/tree/tree.dart' show
+    Identifier, Node, Send;
+import 'package:compiler/implementation/mirror_renamer/mirror_renamer.dart' show
     MirrorRenamer;
 
 main() {
diff --git a/tests/compiler/dart2js/mirror_system_helper.dart b/tests/compiler/dart2js/mirror_system_helper.dart
index 3faf23d..c592214 100644
--- a/tests/compiler/dart2js/mirror_system_helper.dart
+++ b/tests/compiler/dart2js/mirror_system_helper.dart
@@ -5,19 +5,19 @@
 library mirror_system_helper;

 

 import 'dart:async';

-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart';

+import 'package:compiler/implementation/mirrors/source_mirrors.dart';

+import 'package:compiler/implementation/mirrors/dart2js_mirrors.dart';

 import 'mock_compiler.dart';

 

-export '../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';

-export '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';

+export 'package:compiler/implementation/mirrors/source_mirrors.dart';

+export 'package:compiler/implementation/mirrors/mirrors_util.dart';

 

 const String SOURCE = 'source';

 final Uri SOURCE_URI = new Uri(scheme: SOURCE, path: SOURCE);

 

 // TODO(johnniwinther): Move this to a mirrors helper library.

 Future<MirrorSystem> createMirrorSystem(String source) {

-  MockCompiler compiler = new MockCompiler(

+  MockCompiler compiler = new MockCompiler.internal(

       analyzeOnly: true,

       analyzeAll: true,

       preserveComments: true);

diff --git a/tests/compiler/dart2js/mirror_tree_shaking_test.dart b/tests/compiler/dart2js/mirror_tree_shaking_test.dart
index 68bc816..ddbcd77 100644
--- a/tests/compiler/dart2js/mirror_tree_shaking_test.dart
+++ b/tests/compiler/dart2js/mirror_tree_shaking_test.dart
@@ -8,14 +8,14 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        show NullSink;
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show Diagnostic;
 
 import 'dart:async';
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart'
+import 'package:compiler/implementation/js_backend/js_backend.dart'
        show JavaScriptBackend;
 
 main() {
diff --git a/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart b/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart
index 53c9ceb..83529ca 100644
--- a/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart
+++ b/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart
@@ -12,9 +12,9 @@
 

 import "mirrors_test_helper.dart";

 import "../../../lib/mirrors/mirrors_reader.dart";

-import "../../../../sdk/lib/_internal/compiler/implementation/util/util.dart";

-import "../../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart";

-import "../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart";

+import "package:compiler/implementation/util/util.dart";

+import "package:compiler/implementation/mirrors/dart2js_mirrors.dart";

+import "package:compiler/implementation/mirrors/source_mirrors.dart";

 

 class SourceMirrorsReader extends MirrorsReader {

   final Dart2JsMirrorSystem mirrorSystem;

diff --git a/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart b/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart
index b6a954a..61766cc 100644
--- a/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart
+++ b/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart
@@ -5,9 +5,9 @@
 import 'dart:io';

 import 'dart:async';

 

-import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';

-import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart' as source_mirrors;

-import '../../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';

+import 'package:compiler/implementation/mirrors/source_mirrors.dart';

+import 'package:compiler/implementation/mirrors/analyze.dart' as source_mirrors;

+import 'package:compiler/implementation/source_file_provider.dart';

 

 TypeMirror createInstantiation(TypeSourceMirror type,

                                List<TypeMirror> typeArguments) {

@@ -24,7 +24,8 @@
 Future<MirrorSystem> analyzeUri(Uri testUri) {

   Uri repository = Platform.script.resolve('../../../../');

   Uri libraryRoot = repository.resolve('sdk/');

-  Uri packageRoot = Uri.base.resolve('${Platform.packageRoot}/');

+  Uri packageRoot = Uri.base.resolveUri(

+      new Uri.file('${Platform.packageRoot}/'));

   var provider = new CompilerSourceFileProvider();

   var handler = new FormattingDiagnosticHandler(provider);

   return source_mirrors.analyze(

diff --git a/tests/compiler/dart2js/mirrors_exports_test.dart b/tests/compiler/dart2js/mirrors_exports_test.dart
index 51da7c1..0ab74cc 100644
--- a/tests/compiler/dart2js/mirrors_exports_test.dart
+++ b/tests/compiler/dart2js/mirrors_exports_test.dart
@@ -6,7 +6,7 @@
 import 'package:async_helper/async_helper.dart';

 import 'dart:async';

 import 'memory_compiler.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';

+import 'package:compiler/implementation/mirrors/source_mirrors.dart';

 

 const SOURCE_FILES = const {

 'main.dart': '''

diff --git a/tests/compiler/dart2js/mirrors_lookup_test.dart b/tests/compiler/dart2js/mirrors_lookup_test.dart
index 4ef9b70..42b44ad 100644
--- a/tests/compiler/dart2js/mirrors_lookup_test.dart
+++ b/tests/compiler/dart2js/mirrors_lookup_test.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'memory_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
+import 'package:compiler/implementation/mirrors/source_mirrors.dart';
+import 'package:compiler/implementation/mirrors/mirrors_util.dart';
 
 const Map MEMORY_SOURCE_FILES = const {
   'main.dart': r"""
diff --git a/tests/compiler/dart2js/mirrors_metadata_test.dart b/tests/compiler/dart2js/mirrors_metadata_test.dart
index c430997..4097da7 100644
--- a/tests/compiler/dart2js/mirrors_metadata_test.dart
+++ b/tests/compiler/dart2js/mirrors_metadata_test.dart
@@ -7,12 +7,12 @@
 import 'dart:async';
 import 'mirror_system_helper.dart';
 
-void validateDeclarationComment(String code,
+Future validateDeclarationComment(String code,
                                 String text,
                                 String trimmedText,
                                 bool isDocComment,
                                 List<Symbol> declarationNames) {
-  asyncTest(() => createMirrorSystem(code).then((mirrors) {
+  return createMirrorSystem(code).then((mirrors) {
     LibraryMirror library = mirrors.libraries[SOURCE_URI];
     Expect.isNotNull(library);
     for (Symbol declarationName in declarationNames) {
@@ -27,42 +27,60 @@
       Expect.equals(trimmedText, commentMetadata.trimmedText);
       Expect.equals(isDocComment, commentMetadata.isDocComment);
     }
-  }));
+  });
 }
 
-void testDeclarationComment(String declaration, List<Symbol> declarationNames) {
-  String text = 'Single line comment';
-  String comment = '// $text';
-  String code = '$comment\n$declaration';
-  validateDeclarationComment(code, comment, text, false, declarationNames);
-
-  comment = '/// $text';
-  code = '$comment\n$declaration';
-  validateDeclarationComment(code, comment, text, true, declarationNames);
-
-  text = 'Multiline comment';
-  comment = '/* $text*/';
-  code = '$comment$declaration';
-  validateDeclarationComment(code, comment, text, false, declarationNames);
-
-  comment = '/** $text*/';
-  code = '$comment$declaration';
-  validateDeclarationComment(code, comment, text, true, declarationNames);
+Future testDeclarationComment(String declaration,
+                              List<Symbol> declarationNames) {
+  return Future.forEach([
+    () {
+      String text = 'Single line comment';
+      String comment = '// $text';
+      String code = '$comment\n$declaration';
+      return validateDeclarationComment(
+          code, comment, text, false, declarationNames);
+    },
+    () {
+      String text = 'Single line comment';
+      String comment = '/// $text';
+      String code = '$comment\n$declaration';
+      return validateDeclarationComment(
+          code, comment, text, true, declarationNames);
+    },
+    () {
+      String text = 'Multiline comment';
+      String comment = '/* $text*/';
+      String code = '$comment$declaration';
+      return validateDeclarationComment(
+          code, comment, text, false, declarationNames);
+    },
+    () {
+      String text = 'Multiline comment';
+      String comment = '/** $text*/';
+      String code = '$comment$declaration';
+      return validateDeclarationComment(
+          code, comment, text, true, declarationNames);
+    },
+  ], (f) => f());
 }
 
 void main() {
-  testDeclarationComment('var field;', [#field]);
-  testDeclarationComment('int field;', [#field]);
-  testDeclarationComment('int field = 0;', [#field]);
-  testDeclarationComment('int field1, field2;', [#field1, #field2]);
-  testDeclarationComment('final field = 0;', [#field]);
-  testDeclarationComment('final int field = 0;', [#field]);
-  testDeclarationComment('final field1 = 0, field2 = 0;', [#field1, #field2]);
-  testDeclarationComment('final int field1 = 0, field2 = 0;',
-                         [#field1, #field2]);
-  testDeclarationComment('const field = 0;', [#field]);
-  testDeclarationComment('const int field = 0;', [#field]);
-  testDeclarationComment('const field1 = 0, field2 = 0;', [#field1, #field2]);
-  testDeclarationComment('const int field1 = 0, field2 = 0;',
-                         [#field1, #field2]);
+  asyncTest(() => Future.forEach([
+    () => testDeclarationComment('var field;', [#field]),
+    () => testDeclarationComment('int field;', [#field]),
+    () => testDeclarationComment('int field = 0;', [#field]),
+    () => testDeclarationComment('int field1, field2;', [#field1, #field2]),
+    () => testDeclarationComment('final field = 0;', [#field]),
+    () => testDeclarationComment('final int field = 0;', [#field]),
+    () => testDeclarationComment('final field1 = 0, field2 = 0;',
+                                 [#field1, #field2]),
+    () => testDeclarationComment('final int field1 = 0, field2 = 0;',
+                                 [#field1, #field2]),
+    () => testDeclarationComment('const field = 0;', [#field]),
+    () => testDeclarationComment('const int field = 0;', [#field]),
+    () => testDeclarationComment('const field1 = 0, field2 = 0;',
+                                 [#field1, #field2]),
+    () => testDeclarationComment('const int field1 = 0, field2 = 0;',
+                                 [#field1, #field2]),
+  ], (f) => f()));
 }
diff --git a/tests/compiler/dart2js/mirrors_test.dart b/tests/compiler/dart2js/mirrors_test.dart
index 0f618b4..6e3a6db 100644
--- a/tests/compiler/dart2js/mirrors_test.dart
+++ b/tests/compiler/dart2js/mirrors_test.dart
@@ -4,12 +4,12 @@
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart'
+import 'package:compiler/implementation/mirrors/source_mirrors.dart';
+import 'package:compiler/implementation/mirrors/mirrors_util.dart';
+import 'package:compiler/implementation/mirrors/analyze.dart';
+import 'package:compiler/implementation/filenames.dart'
        show currentDirectory;
-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
+import 'package:compiler/implementation/source_file_provider.dart';
 
 import 'dart:io';
 
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index 4f78840..ad5d5bb 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -12,18 +12,19 @@
 import 'memory_compiler.dart' show
     compilerFor;
 
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart' show
+import 'package:compiler/implementation/apiimpl.dart' show
     Compiler;
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' show
+import 'package:compiler/implementation/dart2jslib.dart' show
     Constant,
     TypeConstant;
 
-import
-    '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
-show Element, Elements;
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart'
-    show JavaScriptBackend;
+import 'package:compiler/implementation/elements/elements.dart' show
+    Element,
+    Elements;
+
+import 'package:compiler/implementation/js_backend/js_backend.dart' show
+    JavaScriptBackend;
 
 void expectOnlyVerboseInfo(Uri uri, int begin, int end, String message, kind) {
   if (kind.name == 'verbose info') {
diff --git a/tests/compiler/dart2js/missing_file_test.dart b/tests/compiler/dart2js/missing_file_test.dart
index 323ab25..6a335a6 100644
--- a/tests/compiler/dart2js/missing_file_test.dart
+++ b/tests/compiler/dart2js/missing_file_test.dart
@@ -10,10 +10,10 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        show NullSink;
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show DiagnosticHandler, Diagnostic;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/mixin_typevariable_test.dart b/tests/compiler/dart2js/mixin_typevariable_test.dart
index 9e9f8fb..47bca49 100644
--- a/tests/compiler/dart2js/mixin_typevariable_test.dart
+++ b/tests/compiler/dart2js/mixin_typevariable_test.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';

 import "package:async_helper/async_helper.dart";

 import 'type_test_helper.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';

-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"

+import 'package:compiler/implementation/dart_types.dart';

+import "package:compiler/implementation/elements/elements.dart"

        show Element, ClassElement;

 

 void main() {

diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index af82c4a..4345d13 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -8,24 +8,24 @@
 import 'dart:async';
 import 'dart:collection';
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart' as api;
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
+import 'package:compiler/compiler.dart' as api;
+import 'package:compiler/implementation/elements/elements.dart';
+import 'package:compiler/implementation/resolution/resolution.dart';
+import 'package:compiler/implementation/source_file.dart';
+import 'package:compiler/implementation/tree/tree.dart';
+import 'package:compiler/implementation/util/util.dart';
 import 'parser_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart'
+import 'package:compiler/implementation/elements/modelx.dart'
     show ElementX,
          LibraryElementX,
          ErroneousElementX,
          FunctionElementX;
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
     hide TreeElementMapping;
 
-import '../../../sdk/lib/_internal/compiler/implementation/deferred_load.dart'
+import 'package:compiler/implementation/deferred_load.dart'
     show DeferredLoadTask,
          OutputUnit;
 
@@ -38,6 +38,7 @@
 }
 
 const String DEFAULT_HELPERLIB = r'''
+  const patch = 0;
   wrapException(x) { return x; }
   iae(x) { throw x; } ioore(x) { throw x; }
   guard$array(x) { return x; }
@@ -59,12 +60,6 @@
     var receiver;
   }
   class Closure implements Function {}
-  class Null {}
-  class Dynamic_ {}
-  class LinkedHashMap {
-    factory LinkedHashMap._empty() => null;
-    factory LinkedHashMap._literal(elements) => null;
-  }
   class ConstantMap {}
   class ConstantStringMap {}
   class TypeImpl {}
@@ -218,6 +213,7 @@
     String toString() { return null; }
     noSuchMethod(im) { throw im; }
   }
+  class Null {}
   abstract class StackTrace {}
   class Type {}
   class Function {}
@@ -234,6 +230,10 @@
     E singleWhere(f) => null;
   }
   abstract class Map<K,V> {}
+  class LinkedHashMap {
+    factory LinkedHashMap._empty() => null;
+    factory LinkedHashMap._literal(elements) => null;
+  }
   class DateTime {
     DateTime(year);
     DateTime.utc(year);
@@ -242,12 +242,26 @@
   bool identical(Object a, Object b) { return true; }
   const proxy = 0;''';
 
+final Uri PATCH_CORE = new Uri(scheme: 'patch', path: 'core');
+
+const String PATCH_CORE_SOURCE = r'''
+import 'dart:_js_helper';
+import 'dart:_interceptors';
+import 'dart:_isolate_helper';
+''';
+
 const String DEFAULT_ISOLATE_HELPERLIB = r'''
   var startRootIsolate;
   var _currentIsolate;
   var _callInIsolate;
   class _WorkerBase {}''';
 
+const String DEFAULT_MIRRORS = r'''
+class Comment {}
+class MirrorSystem {}
+class MirrorsUsed {}
+''';
+
 class MockCompiler extends Compiler {
   api.DiagnosticHandler diagnosticHandler;
   List<WarningMessage> warnings;
@@ -263,24 +277,23 @@
   final Map<String, SourceFile> sourceFiles;
   Node parsedTree;
 
-  MockCompiler({String coreSource: DEFAULT_CORELIB,
-                String helperSource: DEFAULT_HELPERLIB,
-                String interceptorsSource: DEFAULT_INTERCEPTORSLIB,
-                String isolateHelperSource: DEFAULT_ISOLATE_HELPERLIB,
-                bool enableTypeAssertions: false,
-                bool enableMinification: false,
-                bool enableConcreteTypeInference: false,
-                int maxConcreteTypeSize: 5,
-                bool disableTypeInference: false,
-                bool analyzeAll: false,
-                bool analyzeOnly: false,
-                bool emitJavaScript: true,
-                bool preserveComments: false,
-                // Our unit tests check code generation output that is
-                // affected by inlining support.
-                bool disableInlining: true,
-                int this.expectedWarnings,
-                int this.expectedErrors})
+  MockCompiler.internal(
+      {String coreSource: DEFAULT_CORELIB,
+       String interceptorsSource: DEFAULT_INTERCEPTORSLIB,
+       bool enableTypeAssertions: false,
+       bool enableMinification: false,
+       bool enableConcreteTypeInference: false,
+       int maxConcreteTypeSize: 5,
+       bool disableTypeInference: false,
+       bool analyzeAll: false,
+       bool analyzeOnly: false,
+       bool emitJavaScript: true,
+       bool preserveComments: false,
+       // Our unit tests check code generation output that is
+       // affected by inlining support.
+       bool disableInlining: true,
+       int this.expectedWarnings,
+       int this.expectedErrors})
       : sourceFiles = new Map<String, SourceFile>(),
         super(enableTypeAssertions: enableTypeAssertions,
               enableMinification: enableMinification,
@@ -292,41 +305,41 @@
               emitJavaScript: emitJavaScript,
               preserveComments: preserveComments,
               showPackageWarnings: true) {
-    clearMessages();
-    coreLibrary = createLibrary("core", coreSource);
-
-    // We need to set the assert method to avoid calls with a 'null'
-    // target being interpreted as a call to assert.
-    jsHelperLibrary = createLibrary("helper", helperSource);
-    foreignLibrary = createLibrary("foreign", FOREIGN_LIBRARY);
-    interceptorsLibrary = createLibrary("interceptors", interceptorsSource);
-    isolateHelperLibrary = createLibrary("isolate_helper", isolateHelperSource);
-
-    // Set up the library imports.
-    importHelperLibrary(coreLibrary);
-    libraryLoader.importLibrary(jsHelperLibrary, coreLibrary, null);
-    libraryLoader.importLibrary(foreignLibrary, coreLibrary, null);
-    libraryLoader.importLibrary(interceptorsLibrary, coreLibrary, null);
-    libraryLoader.importLibrary(isolateHelperLibrary, coreLibrary, null);
-
-    assertMethod = jsHelperLibrary.find('assertHelper');
-    identicalFunction = coreLibrary.find('identical');
-
-    mainApp = mockLibrary(this, "");
-    initializeSpecialClasses();
-    // We need to make sure the Object class is resolved. When registering a
-    // dynamic invocation the ArgumentTypesRegistry eventually iterates over
-    // the interfaces of the Object class which would be 'null' if the class
-    // wasn't resolved.
-    objectClass.ensureResolved(this);
-
     this.disableInlining = disableInlining;
 
     deferredLoadTask = new MockDeferredLoadTask(this);
+
+    clearMessages();
+
+    registerSource(Compiler.DART_CORE, coreSource);
+    registerSource(PATCH_CORE, PATCH_CORE_SOURCE);
+
+    registerSource(Compiler.DART_JS_HELPER, DEFAULT_HELPERLIB);
+    registerSource(Compiler.DART_FOREIGN_HELPER, FOREIGN_LIBRARY);
+    registerSource(Compiler.DART_INTERCEPTORS, interceptorsSource);
+    registerSource(Compiler.DART_ISOLATE_HELPER, DEFAULT_ISOLATE_HELPERLIB);
+    registerSource(Compiler.DART_MIRRORS, DEFAULT_MIRRORS);
+  }
+
+  /// Initialize the mock compiler with an empty main library.
+  Future init([String mainSource = ""]) {
+    Uri uri = new Uri(scheme: "mock");
+    registerSource(uri, mainSource);
+    return libraryLoader.loadLibrary(uri)
+        .then((LibraryElement library) {
+      mainApp = library;
+      // We need to make sure the Object class is resolved. When registering a
+      // dynamic invocation the ArgumentTypesRegistry eventually iterates over
+      // the interfaces of the Object class which would be 'null' if the class
+      // wasn't resolved.
+      objectClass.ensureResolved(this);
+    });
   }
 
   Future runCompiler(Uri uri) {
-    return super.runCompiler(uri).then((result) {
+    return init().then((_) {
+      return super.runCompiler(uri);
+    }).then((result) {
       if (expectedErrors != null &&
           expectedErrors != errors.length) {
         throw "unexpected error during compilation ${errors}";
@@ -347,22 +360,6 @@
     sourceFiles[uri.toString()] = new MockFile(source);
   }
 
-  /**
-   * Used internally to create a library from a source text. The created library
-   * is fixed to export its top-level declarations.
-   */
-  LibraryElement createLibrary(String name, String source) {
-    Uri uri = new Uri(scheme: "dart", path: name);
-    var script = new Script(uri, uri, new MockFile(source));
-    var library = new LibraryElementX(script);
-    library.libraryTag = new LibraryName(null, null, null);
-    parseScript(source, library);
-    library.setExports(library.localScope.values.toList());
-    registerSource(uri, source);
-    libraries.putIfAbsent(uri.toString(), () => library);
-    return library;
-  }
-
   // TODO(johnniwinther): Remove this when we don't filter certain type checker
   // warnings.
   void reportWarning(Spannable node, MessageKind messageKind,
@@ -460,7 +457,12 @@
                            Uri resolvedUri, Node node) => resolvedUri;
 
   // The mock library doesn't need any patches.
-  Uri resolvePatchUri(String dartLibraryName) => null;
+  Uri resolvePatchUri(String dartLibraryName) {
+    if (dartLibraryName == 'core') {
+      return PATCH_CORE;
+    }
+    return null;
+  }
 
   Future<Script> readScript(Spannable node, Uri uri) {
     SourceFile sourceFile = sourceFiles[uri.toString()];
@@ -474,6 +476,12 @@
         ? element
         : new ErroneousElementX(null, null, name, container);
   }
+
+  /// Create a new [MockCompiler] and apply it asynchronously to [f].
+  static Future create(f(MockCompiler compiler)) {
+    MockCompiler compiler = new MockCompiler.internal();
+    return compiler.init().then((_) => f(compiler));
+  }
 }
 
 /// A function the checks [message]. If the check fails or if [message] is
@@ -543,23 +551,6 @@
   }
 }
 
-void importLibrary(LibraryElement target, LibraryElementX imported,
-                   Compiler compiler) {
-  for (var element in imported.localMembers) {
-    compiler.withCurrentElement(element, () {
-      target.addToScope(element, compiler);
-    });
-  }
-}
-
-LibraryElement mockLibrary(Compiler compiler, String source) {
-  Uri uri = new Uri(scheme: "source");
-  var library = new LibraryElementX(new Script(uri, uri, new MockFile(source)));
-  importLibrary(library, compiler.coreLibrary, compiler);
-  library.setExports(<Element>[]);
-  return library;
-}
-
 class CollectingTreeElements extends TreeElementMapping {
   final Map<Node, Element> map = new LinkedHashMap<Node, Element>();
 
diff --git a/tests/compiler/dart2js/null_type_test.dart b/tests/compiler/dart2js/null_type_test.dart
index a413027..c4f7606 100644
--- a/tests/compiler/dart2js/null_type_test.dart
+++ b/tests/compiler/dart2js/null_type_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -13,6 +14,7 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isFalse(generated.contains('typeof (void 0)'));
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
+    Expect.isFalse(generated.contains('typeof (void 0)'));
+  }));
 }
diff --git a/tests/compiler/dart2js/override_inheritance_test.dart b/tests/compiler/dart2js/override_inheritance_test.dart
index a114417..2513ef1 100644
--- a/tests/compiler/dart2js/override_inheritance_test.dart
+++ b/tests/compiler/dart2js/override_inheritance_test.dart
@@ -2,660 +2,676 @@
 // for details. All rights reserved. Use of this source code is governed by a

 // BSD-style license that can be found in the LICENSE file.

 

-import "package:expect/expect.dart";

-

-import "compiler_helper.dart";

-import "../../../sdk/lib/_internal/compiler/implementation/resolution/class_members.dart"

+import 'dart:async';

+import 'package:async_helper/async_helper.dart';

+import 'compiler_helper.dart';

+import 'package:compiler/implementation/resolution/class_members.dart'

     show MembersCreator;

 

 main() {

-  testRequiredParameters();

-  testPositionalParameters();

-  testNamedParameters();

-  testNotSubtype();

-  testGetterNotSubtype();

-  testSetterNotSubtype();

-  testGenericNotSubtype();

-  testFieldNotSubtype();

-  testMixedOverride();

-  testAbstractMethods();

-  testNoSuchMethod();

+  asyncTest(() => Future.wait([

+    testRequiredParameters(),

+    testPositionalParameters(),

+    testNamedParameters(),

+    testNotSubtype(),

+    testGetterNotSubtype(),

+    testSetterNotSubtype(),

+    testGenericNotSubtype(),

+    testFieldNotSubtype(),

+    testMixedOverride(),

+    testAbstractMethods(),

+    testNoSuchMethod(),

+  ]));

 }

 

-check(String source, {errors, warnings, hints, infos}) {

-  MockCompiler compiler = new MockCompiler();

-  compiler.diagnosticHandler = createHandler(compiler, source);

-  compiler.parseScript(source);

-  var cls = compiler.mainApp.find('Class');

-  cls.ensureResolved(compiler);

-  MembersCreator.computeAllClassMembers(compiler, cls);

+Future check(String source, {errors, warnings, hints, infos}) {

+  return MockCompiler.create((MockCompiler compiler) {

+    compiler.diagnosticHandler = createHandler(compiler, source);

+    compiler.parseScript(source);

+    var cls = compiler.mainApp.find('Class');

+    cls.ensureResolved(compiler);

+    MembersCreator.computeAllClassMembers(compiler, cls);

 

-  toList(o) => o == null ? [] : o is List ? o : [o];

+    toList(o) => o == null ? [] : o is List ? o : [o];

 

-  compareMessageKinds(source, toList(errors), compiler.errors, 'error');

+    compareMessageKinds(source, toList(errors), compiler.errors, 'error');

 

-  compareMessageKinds(source, toList(warnings), compiler.warnings, 'warning');

+    compareMessageKinds(source, toList(warnings), compiler.warnings, 'warning');

 

-  if (infos != null) {

-    compareMessageKinds(source, toList(infos), compiler.infos, 'info');

-  }

+    if (infos != null) {

+      compareMessageKinds(source, toList(infos), compiler.infos, 'info');

+    }

 

-  if (hints != null) {

-    compareMessageKinds(source, toList(hints), compiler.hints, 'hint');

-  }

+    if (hints != null) {

+      compareMessageKinds(source, toList(hints), compiler.hints, 'hint');

+    }

+  });

 }

 

-testRequiredParameters() {

-  check("""

-        class A {

-          method() => null; // testRequiredParameters:0

-        }

-        class Class extends A {

-          method() => null; // testRequiredParameters:1

-        }

-        """);

+Future testRequiredParameters() {

+  return Future.wait([

+    check("""

+          class A {

+            method() => null; // testRequiredParameters:0

+          }

+          class Class extends A {

+            method() => null; // testRequiredParameters:1

+          }

+          """),

 

-  check("""

-        class A {

-          method(a) => null; // testRequiredParameters:2

-        }

-        class Class extends A {

-          method(b) => null; // testRequiredParameters:3

-        }

-        """);

+    check("""

+          class A {

+            method(a) => null; // testRequiredParameters:2

+          }

+          class Class extends A {

+            method(b) => null; // testRequiredParameters:3

+          }

+          """),

 

-  check("""

-        class A {

-          method(a, b, c, d) => null; // testRequiredParameters:3

-        }

-        class Class extends A {

-          method(b, a, d, c) => null; // testRequiredParameters:4

-        }

-        """);

+    check("""

+          class A {

+            method(a, b, c, d) => null; // testRequiredParameters:3

+          }

+          class Class extends A {

+            method(b, a, d, c) => null; // testRequiredParameters:4

+          }

+          """),

 

-  check("""

-        class A {

-          method() => null; // testRequiredParameters:5

-        }

-        class Class extends A {

-          method(a) => null; // testRequiredParameters:6

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            method() => null; // testRequiredParameters:5

+          }

+          class Class extends A {

+            method(a) => null; // testRequiredParameters:6

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A {

-          method() => null; // testRequiredParameters:7

-        }

-        class Class implements A {

-          method(a) => null; // testRequiredParameters:8

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            method() => null; // testRequiredParameters:7

+          }

+          class Class implements A {

+            method(a) => null; // testRequiredParameters:8

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A {

-          method(a, b, c) => null; // testRequiredParameters:9

-        }

-        class Class extends A {

-          method(a, b, c, d) => null; // testRequiredParameters:10

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            method(a, b, c) => null; // testRequiredParameters:9

+          }

+          class Class extends A {

+            method(a, b, c, d) => null; // testRequiredParameters:10

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

+  ]);

 }

 

-testPositionalParameters() {

-  check("""

-        class A {

-          method([a]) => null; // testPositionalParameters:1

-        }

-        class Class extends A {

-          method([a]) => null; // testPositionalParameters:2

-        }

-        """);

+Future testPositionalParameters() {

+  return Future.wait([

+    check("""

+          class A {

+            method([a]) => null; // testPositionalParameters:1

+          }

+          class Class extends A {

+            method([a]) => null; // testPositionalParameters:2

+          }

+          """),

 

-  check("""

-        class A {

-          method([a, b]) => null; // testPositionalParameters:3

-        }

-        class Class extends A {

-          method([b, a]) => null; // testPositionalParameters:4

-        }

-        """);

+    check("""

+          class A {

+            method([a, b]) => null; // testPositionalParameters:3

+          }

+          class Class extends A {

+            method([b, a]) => null; // testPositionalParameters:4

+          }

+          """),

 

-  check("""

-        class A {

-          method([a, b, c]) => null; // testPositionalParameters:5

-        }

-        class Class extends A {

-          method([b, d, a, c]) => null; // testPositionalParameters:6

-        }

-        """);

+    check("""

+          class A {

+            method([a, b, c]) => null; // testPositionalParameters:5

+          }

+          class Class extends A {

+            method([b, d, a, c]) => null; // testPositionalParameters:6

+          }

+          """),

 

-  check("""

-        class A {

-          method([a]) => null; // testPositionalParameters:7

-        }

-        class Class extends A {

-          method([a]) => null; // testPositionalParameters:8

-        }

-        """);

+    check("""

+          class A {

+            method([a]) => null; // testPositionalParameters:7

+          }

+          class Class extends A {

+            method([a]) => null; // testPositionalParameters:8

+          }

+          """),

 

-  check("""

-        class A {

-          method(a) => null; // testPositionalParameters:9

-        }

-        class Class extends A {

-          method() => null; // testPositionalParameters:10

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            method(a) => null; // testPositionalParameters:9

+          }

+          class Class extends A {

+            method() => null; // testPositionalParameters:10

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A {

-          method(a, [b]) => null; // testPositionalParameters:11

-        }

-        class Class extends A {

-          method(a) => null; // testPositionalParameters:12

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            method(a, [b]) => null; // testPositionalParameters:11

+          }

+          class Class extends A {

+            method(a) => null; // testPositionalParameters:12

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A {

-          method(a, [b]) => null; // testPositionalParameters:13

-        }

-        class Class extends A {

-          method([a]) => null; // testPositionalParameters:14

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            method(a, [b]) => null; // testPositionalParameters:13

+          }

+          class Class extends A {

+            method([a]) => null; // testPositionalParameters:14

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A {

-          method(a, b, [c, d, e]) => null; // testPositionalParameters:15

-        }

-        class Class extends A {

-          method([a, b, c, d]) => null; // testPositionalParameters:16

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            method(a, b, [c, d, e]) => null; // testPositionalParameters:15

+          }

+          class Class extends A {

+            method([a, b, c, d]) => null; // testPositionalParameters:16

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

+  ]);

 }

 

-testNamedParameters() {

-  check("""

-        class A {

-          method({a}) => null; // testNamedParameters:1

-        }

-        class Class extends A {

-          method({a}) => null; // testNamedParameters:2

-        }

-        """);

+Future testNamedParameters() {

+  return Future.wait([

+    check("""

+          class A {

+            method({a}) => null; // testNamedParameters:1

+          }

+          class Class extends A {

+            method({a}) => null; // testNamedParameters:2

+          }

+          """),

 

-  check("""

-        class A {

-          method({a, b}) => null; // testNamedParameters:3

-        }

-        class Class extends A {

-          method({b, a}) => null; // testNamedParameters:4

-        }

-        """);

+    check("""

+          class A {

+            method({a, b}) => null; // testNamedParameters:3

+          }

+          class Class extends A {

+            method({b, a}) => null; // testNamedParameters:4

+          }

+          """),

 

-  check("""

-        class A {

-          method({a, b, c}) => null; // testNamedParameters:5

-        }

-        class Class extends A {

-          method({b, c, a, d}) => null; // testNamedParameters:6

-        }

-        """);

+    check("""

+          class A {

+            method({a, b, c}) => null; // testNamedParameters:5

+          }

+          class Class extends A {

+            method({b, c, a, d}) => null; // testNamedParameters:6

+          }

+          """),

 

-  check("""

-        class A {

-          method(d, {a, b, c}) => null; // testNamedParameters:7

-        }

-        class Class extends A {

-          method(e, {b, c, a, d}) => null; // testNamedParameters:8

-        }

-        """);

+    check("""

+          class A {

+            method(d, {a, b, c}) => null; // testNamedParameters:7

+          }

+          class Class extends A {

+            method(e, {b, c, a, d}) => null; // testNamedParameters:8

+          }

+          """),

 

-  check("""

-        class A {

-          method({a}) => null; // testNamedParameters:9

-        }

-        class Class extends A {

-          method() => null; // testNamedParameters:10

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            method({a}) => null; // testNamedParameters:9

+          }

+          class Class extends A {

+            method() => null; // testNamedParameters:10

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A {

-          method({a, b}) => null; // testNamedParameters:11

-        }

-        class Class extends A {

-          method({b}) => null; // testNamedParameters:12

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            method({a, b}) => null; // testNamedParameters:11

+          }

+          class Class extends A {

+            method({b}) => null; // testNamedParameters:12

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A {

-          method({a, b, c, d}) => null; // testNamedParameters:13

-        }

-        class Class extends A {

-          method({a, e, d, c}) => null; // testNamedParameters:14

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            method({a, b, c, d}) => null; // testNamedParameters:13

+          }

+          class Class extends A {

+            method({a, e, d, c}) => null; // testNamedParameters:14

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

+  ]);

 }

 

-testNotSubtype() {

-  check("""

-        class A {

-          method(int a) => null; // testNotSubtype:1

-        }

-        class Class extends A {

-          method(int a) => null; // testNotSubtype:2

-        }

-        """);

+Future testNotSubtype() {

+  return Future.wait([

+    check("""

+          class A {

+            method(int a) => null; // testNotSubtype:1

+          }

+          class Class extends A {

+            method(int a) => null; // testNotSubtype:2

+          }

+          """),

 

-  check("""

-        class A {

-          method(int a) => null; // testNotSubtype:3

-        }

-        class Class extends A {

-          method(num a) => null; // testNotSubtype:4

-        }

-        """);

+    check("""

+          class A {

+            method(int a) => null; // testNotSubtype:3

+          }

+          class Class extends A {

+            method(num a) => null; // testNotSubtype:4

+          }

+          """),

 

-  check("""

-        class A {

-          void method() {} // testNotSubtype:5

-        }

-        class Class extends A {

-          method() => null; // testNotSubtype:6

-        }

-        """);

+    check("""

+          class A {

+            void method() {} // testNotSubtype:5

+          }

+          class Class extends A {

+            method() => null; // testNotSubtype:6

+          }

+          """),

 

-  check("""

-        class A {

-          method() => null; // testNotSubtype:7

-        }

-        class Class extends A {

-          void method() {} // testNotSubtype:8

-        }

-        """);

+    check("""

+          class A {

+            method() => null; // testNotSubtype:7

+          }

+          class Class extends A {

+            void method() {} // testNotSubtype:8

+          }

+          """),

 

-  check("""

-        class A {

-          void method() {} // testNotSubtype:9

-        }

-        class Class extends A {

-          int method() => null; // testNotSubtype:10

-        }

-        """);

+    check("""

+          class A {

+            void method() {} // testNotSubtype:9

+          }

+          class Class extends A {

+            int method() => null; // testNotSubtype:10

+          }

+          """),

 

-  check("""

-        class A {

-          int method() => null; // testNotSubtype:11

-        }

-        class Class extends A {

-          void method() {} // testNotSubtype:12

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            int method() => null; // testNotSubtype:11

+          }

+          class Class extends A {

+            void method() {} // testNotSubtype:12

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A {

-          method(int a) => null; // testNotSubtype:13

-        }

-        class B extends A {

-          method(num a) => null; // testNotSubtype:14

-        }

-        class Class extends B {

-          method(double a) => null; // testNotSubtype:15

-        }

-        """);

+    check("""

+          class A {

+            method(int a) => null; // testNotSubtype:13

+          }

+          class B extends A {

+            method(num a) => null; // testNotSubtype:14

+          }

+          class Class extends B {

+            method(double a) => null; // testNotSubtype:15

+          }

+          """),

 

-  check("""

-        class A {

-          method(int a) => null; // testNotSubtype:16

-        }

-        class B extends A {

-          method(a) => null; // testNotSubtype:17

-        }

-        class Class extends B {

-          method(String a) => null; // testNotSubtype:18

-        }

-        """);

+    check("""

+          class A {

+            method(int a) => null; // testNotSubtype:16

+          }

+          class B extends A {

+            method(a) => null; // testNotSubtype:17

+          }

+          class Class extends B {

+            method(String a) => null; // testNotSubtype:18

+          }

+          """),

 

-  check("""

-        class A {

-          method(int a) => null; // testNotSubtype:19

-        }

-        class Class extends A {

-          method(String a) => null; // testNotSubtype:20

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            method(int a) => null; // testNotSubtype:19

+          }

+          class Class extends A {

+            method(String a) => null; // testNotSubtype:20

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.

-  check("""

-        class A {

-          method(int a) => null; // testNotSubtype:23

-        }

-        class B {

-          method(num a) => null; // testNotSubtype:24

-        }

-        abstract class C implements A, B {

-        }

-        class Class implements C {

-          method(double a) => null; // testNotSubtype:25

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.

+    check("""

+          class A {

+            method(int a) => null; // testNotSubtype:23

+          }

+          class B {

+            method(num a) => null; // testNotSubtype:24

+          }

+          abstract class C implements A, B {

+          }

+          class Class implements C {

+            method(double a) => null; // testNotSubtype:25

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A {

-          method(num a) => null; // testNotSubtype:29

-        }

-        class B {

-          method(int a) => null; // testNotSubtype:30

-        }

-        abstract class C implements A, B {

-        }

-        class Class implements C {

-          method(double a) => null; // testNotSubtype:31

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A {

+            method(num a) => null; // testNotSubtype:29

+          }

+          class B {

+            method(int a) => null; // testNotSubtype:30

+          }

+          abstract class C implements A, B {

+          }

+          class Class implements C {

+            method(double a) => null; // testNotSubtype:31

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A {

-          method(int a) => null; // testNotSubtype:26

-        }

-        class B {

-          method(num a) => null; // testNotSubtype:27

-        }

-        abstract class C implements A, B {

-        }

-        class Class implements C {

-          method(String a) => null; // testNotSubtype:28

-        }

-        """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,

-                        MessageKind.INVALID_OVERRIDE_METHOD],

-             infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,

-                     MessageKind.INVALID_OVERRIDDEN_METHOD]);

+    check("""

+          class A {

+            method(int a) => null; // testNotSubtype:26

+          }

+          class B {

+            method(num a) => null; // testNotSubtype:27

+          }

+          abstract class C implements A, B {

+          }

+          class Class implements C {

+            method(String a) => null; // testNotSubtype:28

+          }

+          """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,

+                          MessageKind.INVALID_OVERRIDE_METHOD],

+               infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,

+                       MessageKind.INVALID_OVERRIDDEN_METHOD]),

+  ]);

 }

 

-testGetterNotSubtype() {

-  check("""

-        class A {

-          get getter => null; // testGetterNotSubtype:1

-        }

-        class Class extends A {

-          get getter => null; // testGetterNotSubtype:2

-        }

-        """);

+Future testGetterNotSubtype() {

+  return Future.wait([

+    check("""

+          class A {

+            get getter => null; // testGetterNotSubtype:1

+          }

+          class Class extends A {

+            get getter => null; // testGetterNotSubtype:2

+          }

+          """),

 

-  check("""

-        class A {

-          num get getter => null; // testGetterNotSubtype:3

-        }

-        class Class extends A {

-          num get getter => null; // testGetterNotSubtype:4

-        }

-        """);

+    check("""

+          class A {

+            num get getter => null; // testGetterNotSubtype:3

+          }

+          class Class extends A {

+            num get getter => null; // testGetterNotSubtype:4

+          }

+          """),

 

-  check("""

-        class A {

-          num get getter => null; // testGetterNotSubtype:5

-        }

-        class Class extends A {

-          int get getter => null; // testGetterNotSubtype:6

-        }

-        """);

+    check("""

+          class A {

+            num get getter => null; // testGetterNotSubtype:5

+          }

+          class Class extends A {

+            int get getter => null; // testGetterNotSubtype:6

+          }

+          """),

 

-  check("""

-        class A {

-          int get getter => null; // testGetterNotSubtype:7

-        }

-        class Class extends A {

-          num get getter => null; // testGetterNotSubtype:8

-        }

-        """);

+    check("""

+          class A {

+            int get getter => null; // testGetterNotSubtype:7

+          }

+          class Class extends A {

+            num get getter => null; // testGetterNotSubtype:8

+          }

+          """),

 

-  check("""

-        class A {

-          int get getter => null; // testGetterNotSubtype:9

-        }

-        class Class extends A {

-          double get getter => null; // testGetterNotSubtype:10

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,

-             infos: MessageKind.INVALID_OVERRIDDEN_GETTER);

+    check("""

+          class A {

+            int get getter => null; // testGetterNotSubtype:9

+          }

+          class Class extends A {

+            double get getter => null; // testGetterNotSubtype:10

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,

+               infos: MessageKind.INVALID_OVERRIDDEN_GETTER),

 

-  check("""

-        class A {

-          int get getter => null; // testGetterNotSubtype:11

-        }

-        class B extends A {

-          num get getter => null; // testGetterNotSubtype:12

-        }

-        class Class extends B {

-          double get getter => null; // testGetterNotSubtype:13

-        }

-        """);

+    check("""

+          class A {

+            int get getter => null; // testGetterNotSubtype:11

+          }

+          class B extends A {

+            num get getter => null; // testGetterNotSubtype:12

+          }

+          class Class extends B {

+            double get getter => null; // testGetterNotSubtype:13

+          }

+          """),

 

-  check("""

-        class A {

-          int get getter => null; // testGetterNotSubtype:14

-        }

-        class B {

-          num get getter => null; // testGetterNotSubtype:15

-        }

-        class Class extends A implements B {

-          double get getter => null; // testGetterNotSubtype:16

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,

-             infos: MessageKind.INVALID_OVERRIDDEN_GETTER);

+    check("""

+          class A {

+            int get getter => null; // testGetterNotSubtype:14

+          }

+          class B {

+            num get getter => null; // testGetterNotSubtype:15

+          }

+          class Class extends A implements B {

+            double get getter => null; // testGetterNotSubtype:16

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,

+               infos: MessageKind.INVALID_OVERRIDDEN_GETTER),

 

-  check("""

-        class A {

-          int get getter => null; // testGetterNotSubtype:17

-        }

-        class B {

-          String get getter => null; // testGetterNotSubtype:18

-        }

-        class Class extends A implements B {

-          double get getter => null; // testGetterNotSubtype:19

-        }

-        """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,

-                        MessageKind.INVALID_OVERRIDE_GETTER],

-             infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,

-                     MessageKind.INVALID_OVERRIDDEN_GETTER]);

+    check("""

+          class A {

+            int get getter => null; // testGetterNotSubtype:17

+          }

+          class B {

+            String get getter => null; // testGetterNotSubtype:18

+          }

+          class Class extends A implements B {

+            double get getter => null; // testGetterNotSubtype:19

+          }

+          """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,

+                          MessageKind.INVALID_OVERRIDE_GETTER],

+               infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,

+                       MessageKind.INVALID_OVERRIDDEN_GETTER]),

 

-  check("""

-        class A {

-          int get getter => null; // testGetterNotSubtype:20

-        }

-        class B {

-          String get getter => null; // testGetterNotSubtype:21

-        }

-        class Class implements A, B {

-          double get getter => null; // testGetterNotSubtype:22

-        }

-        """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,

-                        MessageKind.INVALID_OVERRIDE_GETTER],

-             infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,

-                     MessageKind.INVALID_OVERRIDDEN_GETTER]);

+    check("""

+          class A {

+            int get getter => null; // testGetterNotSubtype:20

+          }

+          class B {

+            String get getter => null; // testGetterNotSubtype:21

+          }

+          class Class implements A, B {

+            double get getter => null; // testGetterNotSubtype:22

+          }

+          """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,

+                          MessageKind.INVALID_OVERRIDE_GETTER],

+               infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,

+                       MessageKind.INVALID_OVERRIDDEN_GETTER]),

 

-  // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.

-  check("""

-        class A {

-          int get getter => null; // testGetterNotSubtype:23

-        }

-        class B {

-          num get getter => null; // testGetterNotSubtype:24

-        }

-        abstract class C implements A, B {

-        }

-        class Class implements C {

-          double get getter => null; // testGetterNotSubtype:25

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,

-             infos: MessageKind.INVALID_OVERRIDDEN_GETTER);

+    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.

+    check("""

+          class A {

+            int get getter => null; // testGetterNotSubtype:23

+          }

+          class B {

+            num get getter => null; // testGetterNotSubtype:24

+          }

+          abstract class C implements A, B {

+          }

+          class Class implements C {

+            double get getter => null; // testGetterNotSubtype:25

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,

+               infos: MessageKind.INVALID_OVERRIDDEN_GETTER),

 

-  check("""

-        class A {

-          int get getter => null; // testGetterNotSubtype:26

-        }

-        class B {

-          num get getter => null; // testGetterNotSubtype:27

-        }

-        abstract class C implements A, B {

-        }

-        class Class implements C {

-          String get getter => null; // testGetterNotSubtype:28

-        }

-        """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,

-                        MessageKind.INVALID_OVERRIDE_GETTER],

-             infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,

-                     MessageKind.INVALID_OVERRIDDEN_GETTER]);

+    check("""

+          class A {

+            int get getter => null; // testGetterNotSubtype:26

+          }

+          class B {

+            num get getter => null; // testGetterNotSubtype:27

+          }

+          abstract class C implements A, B {

+          }

+          class Class implements C {

+            String get getter => null; // testGetterNotSubtype:28

+          }

+          """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,

+                          MessageKind.INVALID_OVERRIDE_GETTER],

+               infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,

+                       MessageKind.INVALID_OVERRIDDEN_GETTER]),

+  ]);

 }

 

-testGenericNotSubtype() {

-  check("""

-        class A<T> {

-          method(T t) => null; // testGenericNotSubtype:1

-        }

-        class Class<S> extends A<S> {

-          method(S s) => null; // testGenericNotSubtype:2

-        }

-        """);

+Future testGenericNotSubtype() {

+  return Future.wait([

+    check("""

+          class A<T> {

+            method(T t) => null; // testGenericNotSubtype:1

+          }

+          class Class<S> extends A<S> {

+            method(S s) => null; // testGenericNotSubtype:2

+          }

+          """),

 

-  check("""

-        class A<T> {

-          method(T t) => null; // testGenericNotSubtype:3

-        }

-        class Class extends A<num> {

-          method(int i) => null; // testGenericNotSubtype:4

-        }

-        """);

+    check("""

+          class A<T> {

+            method(T t) => null; // testGenericNotSubtype:3

+          }

+          class Class extends A<num> {

+            method(int i) => null; // testGenericNotSubtype:4

+          }

+          """),

 

-  check("""

-        class A<T> {

-          method(T t) => null; // testGenericNotSubtype:5

-        }

-        class B<S> {

-          method(S s) => null; // testGenericNotSubtype:6

-        }

-        class Class extends A<double> implements B<int> {

-          method(num i) => null; // testGenericNotSubtype:7

-        }

-        """);

+    check("""

+          class A<T> {

+            method(T t) => null; // testGenericNotSubtype:5

+          }

+          class B<S> {

+            method(S s) => null; // testGenericNotSubtype:6

+          }

+          class Class extends A<double> implements B<int> {

+            method(num i) => null; // testGenericNotSubtype:7

+          }

+          """),

 

-  check("""

-        class A<T> {

-          method(T t) => null; // testGenericNotSubtype:8

-        }

-        class Class<S> extends A<S> {

-          method(int i) => null; // testGenericNotSubtype:9

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A<T> {

+            method(T t) => null; // testGenericNotSubtype:8

+          }

+          class Class<S> extends A<S> {

+            method(int i) => null; // testGenericNotSubtype:9

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A<T> {

-          method(T t) => null; // testGenericNotSubtype:10

-        }

-        class B<S> extends A<S> {

+    check("""

+          class A<T> {

+            method(T t) => null; // testGenericNotSubtype:10

+          }

+          class B<S> extends A<S> {

 

-        }

-        class Class<U> extends B<U> {

-          method(U u) => null; // testGenericNotSubtype:11

-        }

-        """);

+          }

+          class Class<U> extends B<U> {

+            method(U u) => null; // testGenericNotSubtype:11

+          }

+          """),

 

-  check("""

-        class A<T> {

-          method(T t) => null; // testGenericNotSubtype:12

-        }

-        class B<S> {

-          method(S s) => null; // testGenericNotSubtype:13

-        }

-        class Class<U> extends A<U> implements B<num> {

-          method(int i) => null; // testGenericNotSubtype:14

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    check("""

+          class A<T> {

+            method(T t) => null; // testGenericNotSubtype:12

+          }

+          class B<S> {

+            method(S s) => null; // testGenericNotSubtype:13

+          }

+          class Class<U> extends A<U> implements B<num> {

+            method(int i) => null; // testGenericNotSubtype:14

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A<T> {

-          method(T t) => null; // testGenericNotSubtype:15

-        }

-        class B<S> {

-          method(S s) => null; // testGenericNotSubtype:16

-        }

-        class Class extends A<int> implements B<String> {

-          method(double d) => null; // testGenericNotSubtype:17

-        }

-        """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,

-                        MessageKind.INVALID_OVERRIDE_METHOD],

-             infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,

-                     MessageKind.INVALID_OVERRIDDEN_METHOD]);

+    check("""

+          class A<T> {

+            method(T t) => null; // testGenericNotSubtype:15

+          }

+          class B<S> {

+            method(S s) => null; // testGenericNotSubtype:16

+          }

+          class Class extends A<int> implements B<String> {

+            method(double d) => null; // testGenericNotSubtype:17

+          }

+          """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,

+                          MessageKind.INVALID_OVERRIDE_METHOD],

+               infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,

+                       MessageKind.INVALID_OVERRIDDEN_METHOD]),

 

-  check("""

-        class A<T> {

-          method(T t) => null; // testGenericNotSubtype:18

-        }

-        class B<S> {

-          method(S s) => null; // testGenericNotSubtype:19

-        }

-        class Class implements A<int>, B<String> {

-          method(double d) => null; // testGenericNotSubtype:20

-        }

-        """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,

-                        MessageKind.INVALID_OVERRIDE_METHOD],

-             infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,

-                     MessageKind.INVALID_OVERRIDDEN_METHOD]);

+    check("""

+          class A<T> {

+            method(T t) => null; // testGenericNotSubtype:18

+          }

+          class B<S> {

+            method(S s) => null; // testGenericNotSubtype:19

+          }

+          class Class implements A<int>, B<String> {

+            method(double d) => null; // testGenericNotSubtype:20

+          }

+          """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,

+                          MessageKind.INVALID_OVERRIDE_METHOD],

+               infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,

+                       MessageKind.INVALID_OVERRIDDEN_METHOD]),

 

-  // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.

-  check("""

-        class A<T> {

-          method(T t) => null; // testGenericNotSubtype:21

-        }

-        class B<S> {

-          method(S s) => null; // testGenericNotSubtype:22

-        }

-        abstract class C implements A<int>, B<num> {

-        }

-        class Class implements C {

-          method(double d) => null; // testGenericNotSubtype:23

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);

+    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.

+    check("""

+          class A<T> {

+            method(T t) => null; // testGenericNotSubtype:21

+          }

+          class B<S> {

+            method(S s) => null; // testGenericNotSubtype:22

+          }

+          abstract class C implements A<int>, B<num> {

+          }

+          class Class implements C {

+            method(double d) => null; // testGenericNotSubtype:23

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,

+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

 

-  check("""

-        class A<T> {

-          method(T t) => null; // testGenericNotSubtype:24

-        }

-        class B<S> {

-          method(S s) => null; // testGenericNotSubtype:25

-        }

-        abstract class C implements A<int>, B<num> {

-        }

-        class Class implements C {

-          method(String s) => null; // testGenericNotSubtype:26

-        }

-        """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,

-                        MessageKind.INVALID_OVERRIDE_METHOD],

-             infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,

-                     MessageKind.INVALID_OVERRIDDEN_METHOD]);

+    check("""

+          class A<T> {

+            method(T t) => null; // testGenericNotSubtype:24

+          }

+          class B<S> {

+            method(S s) => null; // testGenericNotSubtype:25

+          }

+          abstract class C implements A<int>, B<num> {

+          }

+          class Class implements C {

+            method(String s) => null; // testGenericNotSubtype:26

+          }

+          """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,

+                          MessageKind.INVALID_OVERRIDE_METHOD],

+               infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,

+                       MessageKind.INVALID_OVERRIDDEN_METHOD]),

+  ]);

 }

 

-testSetterNotSubtype() {

+Future testSetterNotSubtype() {

+  return Future.wait([

   check("""

         class A {

           set setter(_) => null; // testSetterNotSubtype:1

@@ -663,7 +679,7 @@
         class Class extends A {

           set setter(_) => null; // testSetterNotSubtype:2

         }

-        """);

+        """),

 

   check("""

         class A {

@@ -672,7 +688,7 @@
         class Class extends A {

           set setter(_) => null; // testSetterNotSubtype:4

         }

-        """);

+        """),

 

   check("""

         class A {

@@ -681,7 +697,7 @@
         class Class extends A {

           void set setter(_) {} // testSetterNotSubtype:6

         }

-        """);

+        """),

 

   check("""

         class A {

@@ -690,7 +706,7 @@
         class Class extends A {

           void set setter(_) {} // testSetterNotSubtype:8

         }

-        """);

+        """),

 

   check("""

         class A {

@@ -699,7 +715,7 @@
         class Class extends A {

           set setter(num _) => null; // testSetterNotSubtype:10

         }

-        """);

+        """),

 

   check("""

         class A {

@@ -708,7 +724,7 @@
         class Class extends A {

           set setter(int _) => null; // testSetterNotSubtype:12

         }

-        """);

+        """),

 

   check("""

         class A {

@@ -717,7 +733,7 @@
         class Class extends A {

           set setter(num _) => null; // testSetterNotSubtype:14

         }

-        """);

+        """),

 

   check("""

         class A {

@@ -727,7 +743,7 @@
           set setter(double _) => null; // testSetterNotSubtype:16

         }

         """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,

-             infos: MessageKind.INVALID_OVERRIDDEN_SETTER);

+             infos: MessageKind.INVALID_OVERRIDDEN_SETTER),

 

   check("""

         class A {

@@ -739,7 +755,7 @@
         class Class extends B {

           set setter(double _) => null; // testSetterNotSubtype:19

         }

-        """);

+        """),

 

   check("""

         class A {

@@ -752,7 +768,7 @@
           set setter(double _) => null; // testSetterNotSubtype:22

         }

         """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,

-             infos: MessageKind.INVALID_OVERRIDDEN_SETTER);

+             infos: MessageKind.INVALID_OVERRIDDEN_SETTER),

 

   check("""

         class A {

@@ -767,7 +783,7 @@
         """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,

                         MessageKind.INVALID_OVERRIDE_SETTER],

              infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,

-                     MessageKind.INVALID_OVERRIDDEN_SETTER]);

+                     MessageKind.INVALID_OVERRIDDEN_SETTER]),

 

   check("""

         class A {

@@ -782,7 +798,7 @@
         """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,

                         MessageKind.INVALID_OVERRIDE_SETTER],

              infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,

-                     MessageKind.INVALID_OVERRIDDEN_SETTER]);

+                     MessageKind.INVALID_OVERRIDDEN_SETTER]),

 

   // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.

   check("""

@@ -798,7 +814,7 @@
           set setter(double _) => null; // testSetterNotSubtype:31

         }

         """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,

-             infos: MessageKind.INVALID_OVERRIDDEN_SETTER);

+             infos: MessageKind.INVALID_OVERRIDDEN_SETTER),

 

   check("""

         class A {

@@ -815,701 +831,710 @@
         """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,

                         MessageKind.INVALID_OVERRIDE_SETTER],

              infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,

-                     MessageKind.INVALID_OVERRIDDEN_SETTER]);

+                     MessageKind.INVALID_OVERRIDDEN_SETTER]),

+  ]);

 }

 

-testFieldNotSubtype() {

-  check("""

-        class A {

-          int field; // testFieldNotSubtype:1

-        }

-        class Class extends A {

-          int field; // testFieldNotSubtype:2

-        }

-        """);

+Future testFieldNotSubtype() {

+  return Future.wait([

+    check("""

+          class A {

+            int field; // testFieldNotSubtype:1

+          }

+          class Class extends A {

+            int field; // testFieldNotSubtype:2

+          }

+          """),

 

-  check("""

-        class A {

-          num field; // testFieldNotSubtype:3

-        }

-        class Class extends A {

-          int field; // testFieldNotSubtype:4

-        }

-        """);

+    check("""

+          class A {

+            num field; // testFieldNotSubtype:3

+          }

+          class Class extends A {

+            int field; // testFieldNotSubtype:4

+          }

+          """),

 

-  check("""

-        class A {

-          int field; // testFieldNotSubtype:5

-        }

-        class Class extends A {

-          num field; // testFieldNotSubtype:6

-        }

-        """);

+    check("""

+          class A {

+            int field; // testFieldNotSubtype:5

+          }

+          class Class extends A {

+            num field; // testFieldNotSubtype:6

+          }

+          """),

 

-  check("""

-        class A {

-          int field; // testFieldNotSubtype:7

-        }

-        class Class extends A {

-          double field; // testFieldNotSubtype:8

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_FIELD,

-             infos: MessageKind.INVALID_OVERRIDDEN_FIELD);

+    check("""

+          class A {

+            int field; // testFieldNotSubtype:7

+          }

+          class Class extends A {

+            double field; // testFieldNotSubtype:8

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_FIELD,

+               infos: MessageKind.INVALID_OVERRIDDEN_FIELD),

 

-  check("""

-        class A {

-          int field; // testFieldNotSubtype:9

-        }

-        class B extends A {

-          num field; // testFieldNotSubtype:10

-        }

-        class Class extends B {

-          double field; // testFieldNotSubtype:11

-        }

-        """);

+    check("""

+          class A {

+            int field; // testFieldNotSubtype:9

+          }

+          class B extends A {

+            num field; // testFieldNotSubtype:10

+          }

+          class Class extends B {

+            double field; // testFieldNotSubtype:11

+          }

+          """),

 

-  check("""

-        class A {

-          num field; // testFieldNotSubtype:12

-        }

-        class Class extends A {

-          int get field => null; // testFieldNotSubtype:13

-        }

-        """);

+    check("""

+          class A {

+            num field; // testFieldNotSubtype:12

+          }

+          class Class extends A {

+            int get field => null; // testFieldNotSubtype:13

+          }

+          """),

 

-  check("""

-        class A {

-          num field; // testFieldNotSubtype:14

-        }

-        class Class extends A {

-          String get field => null; // testFieldNotSubtype:15

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,

-             infos: MessageKind.INVALID_OVERRIDDEN_FIELD);

+    check("""

+          class A {

+            num field; // testFieldNotSubtype:14

+          }

+          class Class extends A {

+            String get field => null; // testFieldNotSubtype:15

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,

+               infos: MessageKind.INVALID_OVERRIDDEN_FIELD),

 

-  check("""

-        class A {

-          num get field => null; // testFieldNotSubtype:16

-        }

-        class Class extends A {

-          String field; // testFieldNotSubtype:17

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,

-             infos: MessageKind.INVALID_OVERRIDDEN_GETTER);

+    check("""

+          class A {

+            num get field => null; // testFieldNotSubtype:16

+          }

+          class Class extends A {

+            String field; // testFieldNotSubtype:17

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,

+               infos: MessageKind.INVALID_OVERRIDDEN_GETTER),

 

-  check("""

-        class A {

-          num field; // testFieldNotSubtype:18

-        }

-        class Class extends A {

-          set field(int _) {} // testFieldNotSubtype:19

-        }

-        """);

+    check("""

+          class A {

+            num field; // testFieldNotSubtype:18

+          }

+          class Class extends A {

+            set field(int _) {} // testFieldNotSubtype:19

+          }

+          """),

 

-  check("""

-        class A {

-          num field; // testFieldNotSubtype:19

-        }

-        class Class extends A {

-          void set field(int _) {} // testFieldNotSubtype:20

-        }

-        """);

+    check("""

+          class A {

+            num field; // testFieldNotSubtype:19

+          }

+          class Class extends A {

+            void set field(int _) {} // testFieldNotSubtype:20

+          }

+          """),

 

-  check("""

-        class A {

-          set field(int _) {} // testFieldNotSubtype:21

-        }

-        class Class extends A {

-          num field; // testFieldNotSubtype:22

-        }

-        """);

+    check("""

+          class A {

+            set field(int _) {} // testFieldNotSubtype:21

+          }

+          class Class extends A {

+            num field; // testFieldNotSubtype:22

+          }

+          """),

 

-  check("""

-        class A {

-          void set field(int _) {} // testFieldNotSubtype:23

-        }

-        class Class extends A {

-          num field; // testFieldNotSubtype:24

-        }

-        """);

+    check("""

+          class A {

+            void set field(int _) {} // testFieldNotSubtype:23

+          }

+          class Class extends A {

+            num field; // testFieldNotSubtype:24

+          }

+          """),

 

-  check("""

-        class A {

-          num field; // testFieldNotSubtype:25

-        }

-        class Class extends A {

-          set field(String _) {} // testFieldNotSubtype:26

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,

-             infos: MessageKind.INVALID_OVERRIDDEN_FIELD);

+    check("""

+          class A {

+            num field; // testFieldNotSubtype:25

+          }

+          class Class extends A {

+            set field(String _) {} // testFieldNotSubtype:26

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,

+               infos: MessageKind.INVALID_OVERRIDDEN_FIELD),

 

-  check("""

-        class A {

-          set field(num _) {} // testFieldNotSubtype:27

-        }

-        class Class extends A {

-          String field; // testFieldNotSubtype:28

-        }

-        """, warnings: MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,

-             infos: MessageKind.INVALID_OVERRIDDEN_SETTER);

+    check("""

+          class A {

+            set field(num _) {} // testFieldNotSubtype:27

+          }

+          class Class extends A {

+            String field; // testFieldNotSubtype:28

+          }

+          """, warnings: MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,

+               infos: MessageKind.INVALID_OVERRIDDEN_SETTER),

 

-  check("""

-        class A {

-          int field; // testFieldNotSubtype:29

-        }

-        class Class implements A {

-          String get field => null; // testFieldNotSubtype:30

-          void set field(String s) {} // testFieldNotSubtype:31

-        }

-        """, warnings: [MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,

-                        MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER],

-             infos: [MessageKind.INVALID_OVERRIDDEN_FIELD,

-                     MessageKind.INVALID_OVERRIDDEN_FIELD]);

+    check("""

+          class A {

+            int field; // testFieldNotSubtype:29

+          }

+          class Class implements A {

+            String get field => null; // testFieldNotSubtype:30

+            void set field(String s) {} // testFieldNotSubtype:31

+          }

+          """, warnings: [MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,

+                          MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER],

+               infos: [MessageKind.INVALID_OVERRIDDEN_FIELD,

+                       MessageKind.INVALID_OVERRIDDEN_FIELD]),

 

 

-  check("""

-        class A {

-          String get field => null; // testFieldNotSubtype:32

-          void set field(String s) {} // testFieldNotSubtype:33

-        }

-        class Class implements A {

-          int field; // testFieldNotSubtype:34

-        }

-        """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,

-                        MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD],

-             infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,

-                     MessageKind.INVALID_OVERRIDDEN_SETTER]);

+    check("""

+          class A {

+            String get field => null; // testFieldNotSubtype:32

+            void set field(String s) {} // testFieldNotSubtype:33

+          }

+          class Class implements A {

+            int field; // testFieldNotSubtype:34

+          }

+          """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,

+                          MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD],

+               infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,

+                       MessageKind.INVALID_OVERRIDDEN_SETTER]),

+  ]);

 }

 

-testMixedOverride() {

-  check("""

-        class A {

-          var member; // testMixedOverride:1

-        }

-        class Class extends A {

-          member() {} // testMixedOverride:2

-        }

-        """, errors: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,

-             infos: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT);

+Future testMixedOverride() {

+  return Future.wait([

+    check("""

+          class A {

+            var member; // testMixedOverride:1

+          }

+          class Class extends A {

+            member() {} // testMixedOverride:2

+          }

+          """, errors: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,

+               infos: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT),

 

-  check("""

-        class A {

-          member() {} // testMixedOverride:3

-        }

-        class Class extends A {

-          var member; // testMixedOverride:4

-        }

-        """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD,

-             infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT);

+    check("""

+          class A {

+            member() {} // testMixedOverride:3

+          }

+          class Class extends A {

+            var member; // testMixedOverride:4

+          }

+          """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD,

+               infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT),

 

-  check("""

-        class A {

-          get member => null; // testMixedOverride:5

-        }

-        class Class extends A {

-          member() {} // testMixedOverride:6

-        }

-        """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,

-             infos: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT);

+    check("""

+          class A {

+            get member => null; // testMixedOverride:5

+          }

+          class Class extends A {

+            member() {} // testMixedOverride:6

+          }

+          """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,

+               infos: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT),

 

-  check("""

-        class A {

-          member() {} // testMixedOverride:7

-        }

-        class Class extends A {

-          get member => null; // testMixedOverride:8

-        }

-        """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,

-             infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT);

+    check("""

+          class A {

+            member() {} // testMixedOverride:7

+          }

+          class Class extends A {

+            get member => null; // testMixedOverride:8

+          }

+          """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,

+               infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT),

 

-  check("""

-        abstract class A {

-          var member; // testMixedOverride:9

-        }

-        abstract class B {

-          get member; // testMixedOverride:10

-        }

-        abstract class Class implements A, B {

-        }

-        """);

+    check("""

+          abstract class A {

+            var member; // testMixedOverride:9

+          }

+          abstract class B {

+            get member; // testMixedOverride:10

+          }

+          abstract class Class implements A, B {

+          }

+          """),

 

-  check("""

-        abstract class A {

-          var member; // testMixedOverride:11

-        }

-        abstract class B {

-          member() {} // testMixedOverride:12

-        }

-        abstract class Class implements A, B {

-        }

-        """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,

-             infos: [MessageKind.INHERITED_METHOD,

-                     MessageKind.INHERITED_IMPLICIT_GETTER]);

+    check("""

+          abstract class A {

+            var member; // testMixedOverride:11

+          }

+          abstract class B {

+            member() {} // testMixedOverride:12

+          }

+          abstract class Class implements A, B {

+          }

+          """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,

+               infos: [MessageKind.INHERITED_METHOD,

+                       MessageKind.INHERITED_IMPLICIT_GETTER]),

 

-  check("""

-        abstract class A {

-          get member; // testMixedOverride:13

-        }

-        abstract class B {

-          member() {} // testMixedOverride:14

-        }

-        abstract class Class implements A, B {

-        }

-        """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,

-             infos: [MessageKind.INHERITED_METHOD,

-                     MessageKind.INHERITED_EXPLICIT_GETTER]);

+    check("""

+          abstract class A {

+            get member; // testMixedOverride:13

+          }

+          abstract class B {

+            member() {} // testMixedOverride:14

+          }

+          abstract class Class implements A, B {

+          }

+          """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,

+               infos: [MessageKind.INHERITED_METHOD,

+                       MessageKind.INHERITED_EXPLICIT_GETTER]),

 

-  check("""

-        abstract class A {

-          get member; // testMixedOverride:15

-        }

-        abstract class B {

-          member() {} // testMixedOverride:16

-        }

-        abstract class C {

-          var member; // testMixedOverride:17

-        }

-        abstract class D {

-          member() {} // testMixedOverride:18

-        }

-        abstract class E {

-          get member; // testMixedOverride:19

-        }

-        abstract class Class implements A, B, C, D, E {

-        }

-        """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,

-             infos: [MessageKind.INHERITED_EXPLICIT_GETTER,

-                     MessageKind.INHERITED_METHOD,

-                     MessageKind.INHERITED_IMPLICIT_GETTER,

-                     MessageKind.INHERITED_METHOD,

-                     MessageKind.INHERITED_EXPLICIT_GETTER]);

+    check("""

+          abstract class A {

+            get member; // testMixedOverride:15

+          }

+          abstract class B {

+            member() {} // testMixedOverride:16

+          }

+          abstract class C {

+            var member; // testMixedOverride:17

+          }

+          abstract class D {

+            member() {} // testMixedOverride:18

+          }

+          abstract class E {

+            get member; // testMixedOverride:19

+          }

+          abstract class Class implements A, B, C, D, E {

+          }

+          """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,

+               infos: [MessageKind.INHERITED_EXPLICIT_GETTER,

+                       MessageKind.INHERITED_METHOD,

+                       MessageKind.INHERITED_IMPLICIT_GETTER,

+                       MessageKind.INHERITED_METHOD,

+                       MessageKind.INHERITED_EXPLICIT_GETTER]),

 

-  check("""

-        abstract class A {

-          get member; // testMixedOverride:20

-        }

-        abstract class B {

-          member() {} // testMixedOverride:21

-        }

-        abstract class C implements A, B {

-        }

-        class Class extends C {

-          member() {} // testMixedOverride:22

-        }

-        """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,

-             warnings: MessageKind.INHERIT_GETTER_AND_METHOD,

-             infos: [MessageKind.INHERITED_METHOD,

-                     MessageKind.INHERITED_EXPLICIT_GETTER,

-                     MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT]);

+    check("""

+          abstract class A {

+            get member; // testMixedOverride:20

+          }

+          abstract class B {

+            member() {} // testMixedOverride:21

+          }

+          abstract class C implements A, B {

+          }

+          class Class extends C {

+            member() {} // testMixedOverride:22

+          }

+          """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,

+               warnings: MessageKind.INHERIT_GETTER_AND_METHOD,

+               infos: [MessageKind.INHERITED_METHOD,

+                       MessageKind.INHERITED_EXPLICIT_GETTER,

+                       MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT]),

 

-  check("""

-        abstract class A {

-          get member; // testMixedOverride:23

-        }

-        abstract class B {

-          member() {} // testMixedOverride:24

-        }

-        abstract class C implements A, B {

-        }

-        class Class extends C {

-          get member => null; // testMixedOverride:25

-        }

-        """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,

-             warnings: MessageKind.INHERIT_GETTER_AND_METHOD,

-             infos: [MessageKind.INHERITED_METHOD,

-                     MessageKind.INHERITED_EXPLICIT_GETTER,

-                     MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT]);

+    check("""

+          abstract class A {

+            get member; // testMixedOverride:23

+          }

+          abstract class B {

+            member() {} // testMixedOverride:24

+          }

+          abstract class C implements A, B {

+          }

+          class Class extends C {

+            get member => null; // testMixedOverride:25

+          }

+          """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,

+               warnings: MessageKind.INHERIT_GETTER_AND_METHOD,

+               infos: [MessageKind.INHERITED_METHOD,

+                       MessageKind.INHERITED_EXPLICIT_GETTER,

+                       MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT]),

+  ]);

 }

 

-testAbstractMethods() {

-  check("""

-        abstract class Class {

-          method(); // testAbstractMethod:1

-        }

-        """);

+Future testAbstractMethods() {

+  return Future.wait([

+    check("""

+          abstract class Class {

+            method(); // testAbstractMethod:1

+          }

+          """),

 

-  check("""

-        class Class {

-          method(); // testAbstractMethod:2

-        }

-        """, warnings: MessageKind.ABSTRACT_METHOD,

-             infos: []);

+    check("""

+          class Class {

+            method(); // testAbstractMethod:2

+          }

+          """, warnings: MessageKind.ABSTRACT_METHOD,

+               infos: []),

 

-  check("""

-        class Class {

-          get getter; // testAbstractMethod:3

-        }

-        """, warnings: MessageKind.ABSTRACT_GETTER,

-             infos: []);

+    check("""

+          class Class {

+            get getter; // testAbstractMethod:3

+          }

+          """, warnings: MessageKind.ABSTRACT_GETTER,

+               infos: []),

 

-  check("""

-        class Class {

-          set setter(_); // testAbstractMethod:4

-        }

-        """, warnings: MessageKind.ABSTRACT_SETTER,

-             infos: []);

+    check("""

+          class Class {

+            set setter(_); // testAbstractMethod:4

+          }

+          """, warnings: MessageKind.ABSTRACT_SETTER,

+               infos: []),

 

-  check("""

-        abstract class A {

-          method(); // testAbstractMethod:5

-        }

-        class Class extends A {

-          method() {} // testAbstractMethod:6

-        }

-        """);

+    check("""

+          abstract class A {

+            method(); // testAbstractMethod:5

+          }

+          class Class extends A {

+            method() {} // testAbstractMethod:6

+          }

+          """),

 

-  check("""

-        abstract class A {

-          method(); // testAbstractMethod:7

-        }

-        class Class extends A {

-          method([a]) {} // testAbstractMethod:8

-        }

-        """);

+    check("""

+          abstract class A {

+            method(); // testAbstractMethod:7

+          }

+          class Class extends A {

+            method([a]) {} // testAbstractMethod:8

+          }

+          """),

 

-  check("""

-        abstract class A {

-          method(); // testAbstractMethod:9

-        }

-        class Class extends A {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);

+    check("""

+          abstract class A {

+            method(); // testAbstractMethod:9

+          }

+          class Class extends A {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

 

-  check("""

-        abstract class A {

-          get getter; // testAbstractMethod:10

-        }

-        class Class extends A {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,

-             infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER);

+    check("""

+          abstract class A {

+            get getter; // testAbstractMethod:10

+          }

+          class Class extends A {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,

+               infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER),

 

-  check("""

-        abstract class A {

-          set setter(_); // testAbstractMethod:11

-        }

-        class Class extends A {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,

-             infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER);

+    check("""

+          abstract class A {

+            set setter(_); // testAbstractMethod:11

+          }

+          class Class extends A {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,

+               infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER),

 

-  check("""

-        abstract class A {

-          method(); // testAbstractMethod:12

-        }

-        class B {

-          method() {} // testAbstractMethod:13

-        }

-        class Class extends A implements B {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD,

-             infos: [MessageKind.UNIMPLEMENTED_METHOD_CONT,

-                     MessageKind.UNIMPLEMENTED_METHOD_CONT]);

+    check("""

+          abstract class A {

+            method(); // testAbstractMethod:12

+          }

+          class B {

+            method() {} // testAbstractMethod:13

+          }

+          class Class extends A implements B {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD,

+               infos: [MessageKind.UNIMPLEMENTED_METHOD_CONT,

+                       MessageKind.UNIMPLEMENTED_METHOD_CONT]),

 

-  check("""

-        abstract class A {

-          get getter; // testAbstractMethod:14

-        }

-        class B {

-          get getter => 0; // testAbstractMethod:15

-        }

-        class Class extends A implements B {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_GETTER,

-             infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,

-                     MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER]);

+    check("""

+          abstract class A {

+            get getter; // testAbstractMethod:14

+          }

+          class B {

+            get getter => 0; // testAbstractMethod:15

+          }

+          class Class extends A implements B {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_GETTER,

+               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,

+                       MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER]),

 

-  check("""

-        abstract class A {

-          set setter(_); // testAbstractMethod:16

-        }

-        class B {

-          set setter(_) {} // testAbstractMethod:17

-        }

-        class Class extends A implements B {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_SETTER,

-             infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,

-                     MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER]);

+    check("""

+          abstract class A {

+            set setter(_); // testAbstractMethod:16

+          }

+          class B {

+            set setter(_) {} // testAbstractMethod:17

+          }

+          class Class extends A implements B {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_SETTER,

+               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,

+                       MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER]),

 

-  check("""

-        abstract class A {

-          get field; // testAbstractMethod:18

-        }

-        class B {

-          var field; // testAbstractMethod:19

-        }

-        class Class extends A implements B {

-          set field(_) {} // testAbstractMethod:20

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_GETTER,

-             infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,

-                     MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER]);

+    check("""

+          abstract class A {

+            get field; // testAbstractMethod:18

+          }

+          class B {

+            var field; // testAbstractMethod:19

+          }

+          class Class extends A implements B {

+            set field(_) {} // testAbstractMethod:20

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_GETTER,

+               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,

+                       MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER]),

 

-  check("""

-        abstract class A {

-          set field(_); // testAbstractMethod:21

-        }

-        class B {

-          var field; // testAbstractMethod:22

-        }

-        class Class extends A implements B {

-          get field => 0; // testAbstractMethod:23

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_SETTER,

-             infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,

-                     MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]);

+    check("""

+          abstract class A {

+            set field(_); // testAbstractMethod:21

+          }

+          class B {

+            var field; // testAbstractMethod:22

+          }

+          class Class extends A implements B {

+            get field => 0; // testAbstractMethod:23

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_SETTER,

+               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,

+                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),

 

-  check("""

-        class A {

-          method() {} // testAbstractMethod:24

-        }

-        class Class implements A {

-          method() {} // testAbstractMethod:25

-        }

-        """);

+    check("""

+          class A {

+            method() {} // testAbstractMethod:24

+          }

+          class Class implements A {

+            method() {} // testAbstractMethod:25

+          }

+          """),

 

-  check("""

-        class A {

-          method() {} // testAbstractMethod:26

-        }

-        class Class implements A {

-          method([a]) {} // testAbstractMethod:27

-        }

-        """);

+    check("""

+          class A {

+            method() {} // testAbstractMethod:26

+          }

+          class Class implements A {

+            method([a]) {} // testAbstractMethod:27

+          }

+          """),

 

-  check("""

-        class A {

-          method() {} // testAbstractMethod:28

-        }

-        class Class implements A {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);

+    check("""

+          class A {

+            method() {} // testAbstractMethod:28

+          }

+          class Class implements A {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

 

-  check("""

-        class A {

-          method() {} // testAbstractMethod:29

-        }

-        class B {

-          method() {} // testAbstractMethod:30

-        }

-        class Class extends A implements B {

-        }

-        """);

+    check("""

+          class A {

+            method() {} // testAbstractMethod:29

+          }

+          class B {

+            method() {} // testAbstractMethod:30

+          }

+          class Class extends A implements B {

+          }

+          """),

 

-  check("""

-        class A {

-          var member; // testAbstractMethod:31

-        }

-        class Class implements A {

-        }

-        """, warnings: [MessageKind.UNIMPLEMENTED_GETTER_ONE,

-                        MessageKind.UNIMPLEMENTED_SETTER_ONE],

-             infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,

-                     MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]);

+    check("""

+          class A {

+            var member; // testAbstractMethod:31

+          }

+          class Class implements A {

+          }

+          """, warnings: [MessageKind.UNIMPLEMENTED_GETTER_ONE,

+                          MessageKind.UNIMPLEMENTED_SETTER_ONE],

+               infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,

+                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),

 

-  check("""

-        class A {

-          var member; // testAbstractMethod:32

-        }

-        class B {

-          get member => null; // testAbstractMethod:33

-          set member(_) {} // testAbstractMethod:34

-        }

-        class Class implements A, B {

-        }

-        """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,

-                        MessageKind.UNIMPLEMENTED_SETTER],

-             infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,

-                     MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,

-                     MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,

-                     MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]);

+    check("""

+          class A {

+            var member; // testAbstractMethod:32

+          }

+          class B {

+            get member => null; // testAbstractMethod:33

+            set member(_) {} // testAbstractMethod:34

+          }

+          class Class implements A, B {

+          }

+          """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,

+                          MessageKind.UNIMPLEMENTED_SETTER],

+               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,

+                       MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,

+                       MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,

+                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),

 

-  check("""

-        class A {

-          var member; // testAbstractMethod:35

-        }

-        class B {

-          var member; // testAbstractMethod:36

-        }

-        class Class implements A, B {

-        }

-        """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,

-                        MessageKind.UNIMPLEMENTED_SETTER],

-             infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,

-                     MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,

-                     MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER,

-                     MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]);

+    check("""

+          class A {

+            var member; // testAbstractMethod:35

+          }

+          class B {

+            var member; // testAbstractMethod:36

+          }

+          class Class implements A, B {

+          }

+          """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,

+                          MessageKind.UNIMPLEMENTED_SETTER],

+               infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,

+                       MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,

+                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER,

+                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),

 

-  check("""

-        class A {

-          get member => 0; // testAbstractMethod:37

-        }

-        class Class implements A {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,

-             infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER);

+    check("""

+          class A {

+            get member => 0; // testAbstractMethod:37

+          }

+          class Class implements A {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,

+               infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER),

 

-  check("""

-        class A {

-          set member(_) {} // testAbstractMethod:38

-        }

-        class Class implements A {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,

-             infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER);

+    check("""

+          class A {

+            set member(_) {} // testAbstractMethod:38

+          }

+          class Class implements A {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,

+               infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER),

 

-  check("""

-        class A {

-          var member; // testAbstractMethod:39

-        }

-        class Class implements A {

-          get member => 0;

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,

-             infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER);

+    check("""

+          class A {

+            var member; // testAbstractMethod:39

+          }

+          class Class implements A {

+            get member => 0;

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,

+               infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER),

 

-  check("""

-        class A {

-          var field; // testAbstractMethod:40

-        }

-        class Class implements A {

-          final field = 0; // testAbstractMethod:41

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,

-             infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER);

+    check("""

+          class A {

+            var field; // testAbstractMethod:40

+          }

+          class Class implements A {

+            final field = 0; // testAbstractMethod:41

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,

+               infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER),

 

-  check("""

-        class A {

-          var member; // testAbstractMethod:42

-        }

-        class Class implements A {

-          set member(_) {}

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,

-             infos: MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER);

+    check("""

+          class A {

+            var member; // testAbstractMethod:42

+          }

+          class Class implements A {

+            set member(_) {}

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,

+               infos: MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER),

 

-  check("""

-        abstract class A {

-          method() {} // testAbstractMethod:43

-        }

-        class Class extends A {

-          method();

-        }

-        """);

+    check("""

+          abstract class A {

+            method() {} // testAbstractMethod:43

+          }

+          class Class extends A {

+            method();

+          }

+          """),

+  ]);

 }

 

-testNoSuchMethod() {

-  check("""

-        class Class {

-          method(); // testNoSuchMethod:1

-        }

-        """, warnings: MessageKind.ABSTRACT_METHOD,

-             infos: []);

+Future testNoSuchMethod() {

+  return Future.wait([

+    check("""

+          class Class {

+            method(); // testNoSuchMethod:1

+          }

+          """, warnings: MessageKind.ABSTRACT_METHOD,

+               infos: []),

 

-  check("""

-        @proxy

-        class Class {

-          method(); // testNoSuchMethod:2

-        }

-        """, warnings: MessageKind.ABSTRACT_METHOD,

-             infos: []);

+    check("""

+          @proxy

+          class Class {

+            method(); // testNoSuchMethod:2

+          }

+          """, warnings: MessageKind.ABSTRACT_METHOD,

+               infos: []),

 

-  check("""

-        class Class {

-          noSuchMethod(_) => null;

-          method(); // testNoSuchMethod:3

-        }

-        """);

+    check("""

+          class Class {

+            noSuchMethod(_) => null;

+            method(); // testNoSuchMethod:3

+          }

+          """),

 

-  check("""

-        class Class {

-          noSuchMethod(_, [__]) => null;

-          method(); // testNoSuchMethod:4

-        }

-        """);

+    check("""

+          class Class {

+            noSuchMethod(_, [__]) => null;

+            method(); // testNoSuchMethod:4

+          }

+          """),

 

-  check("""

-        class Class {

-          noSuchMethod(_);

-          method(); // testNoSuchMethod:5

-        }

-        """);

+    check("""

+          class Class {

+            noSuchMethod(_);

+            method(); // testNoSuchMethod:5

+          }

+          """),

 

-  check("""

-        abstract class A {

-          method(); // testNoSuchMethod:6

-        }

-        class Class extends A {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);

+    check("""

+          abstract class A {

+            method(); // testNoSuchMethod:6

+          }

+          class Class extends A {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

 

-  check("""

-        abstract class A {

-          method(); // testNoSuchMethod:7

-        }

-        @proxy

-        class Class extends A {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);

+    check("""

+          abstract class A {

+            method(); // testNoSuchMethod:7

+          }

+          @proxy

+          class Class extends A {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

 

-  check("""

-        abstract class A {

-          method(); // testNoSuchMethod:8

-        }

-        class Class extends A {

-          noSuchMethod(_) => null;

-        }

-        """);

+    check("""

+          abstract class A {

+            method(); // testNoSuchMethod:8

+          }

+          class Class extends A {

+            noSuchMethod(_) => null;

+          }

+          """),

 

-  check("""

-        class A {

-          method() {} // testNoSuchMethod:9

-        }

-        class Class implements A {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);

+    check("""

+          class A {

+            method() {} // testNoSuchMethod:9

+          }

+          class Class implements A {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

 

-  check("""

-        class A {

-          method() {} // testNoSuchMethod:10

-        }

-        class Class implements A {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);

+    check("""

+          class A {

+            method() {} // testNoSuchMethod:10

+          }

+          class Class implements A {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

 

-  check("""

-        class A {

-          method() {} // testNoSuchMethod:11

-        }

-        @proxy

-        class Class implements A {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);

+    check("""

+          class A {

+            method() {} // testNoSuchMethod:11

+          }

+          @proxy

+          class Class implements A {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

 

-  check("""

-        class A {

-          method() {} // testNoSuchMethod:12

-        }

-        class Class implements A {

-          noSuchMethod(_) => null;

-        }

-        """);

+    check("""

+          class A {

+            method() {} // testNoSuchMethod:12

+          }

+          class Class implements A {

+            noSuchMethod(_) => null;

+          }

+          """),

 

-  check("""

-        class A {

-          noSuchMethod(_) => null;

-          method(); // testNoSuchMethod:13

-        }

-        class Class extends A {

-        }

-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);

+    check("""

+          class A {

+            noSuchMethod(_) => null;

+            method(); // testNoSuchMethod:13

+          }

+          class Class extends A {

+          }

+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,

+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

+  ]);

 }
\ No newline at end of file
diff --git a/tests/compiler/dart2js/package_root_test.dart b/tests/compiler/dart2js/package_root_test.dart
index 704e6b2..18c6f84 100644
--- a/tests/compiler/dart2js/package_root_test.dart
+++ b/tests/compiler/dart2js/package_root_test.dart
@@ -10,10 +10,10 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        show NullSink;
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show DiagnosticHandler, Diagnostic;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/parser_helper.dart
index a948f7d..27abe72 100644
--- a/tests/compiler/dart2js/parser_helper.dart
+++ b/tests/compiler/dart2js/parser_helper.dart
@@ -6,22 +6,22 @@
 
 import "package:expect/expect.dart";
 
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/source_file.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
+import "package:compiler/implementation/elements/elements.dart";
+import "package:compiler/implementation/tree/tree.dart";
+import "package:compiler/implementation/scanner/scannerlib.dart";
+import "package:compiler/implementation/source_file.dart";
+import "package:compiler/implementation/util/util.dart";
 
-import "../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart"
+import "package:compiler/implementation/elements/modelx.dart"
     show CompilationUnitElementX,
          LibraryElementX;
 
-import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
+import "package:compiler/implementation/dart2jslib.dart";
 
-export "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart"
+export "package:compiler/implementation/dart2jslib.dart"
     show DiagnosticListener;
 // TODO(ahe): We should have token library to export instead.
-export "../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart";
+export "package:compiler/implementation/scanner/scannerlib.dart";
 
 class LoggerCanceler implements DiagnosticListener {
   void cancel(String reason, {node, token, instruction, element}) {
diff --git a/tests/compiler/dart2js/parser_test.dart b/tests/compiler/dart2js/parser_test.dart
index 9b47f8d..9582575 100644
--- a/tests/compiler/dart2js/parser_test.dart
+++ b/tests/compiler/dart2js/parser_test.dart
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 import 'parser_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import 'package:compiler/implementation/tree/tree.dart';
 
 void testStatement(String statement) {
   Node node = parseStatement(statement);
diff --git a/tests/compiler/dart2js/part_of_test.dart b/tests/compiler/dart2js/part_of_test.dart
index 79eebf2..4cf2e12 100644
--- a/tests/compiler/dart2js/part_of_test.dart
+++ b/tests/compiler/dart2js/part_of_test.dart
@@ -7,7 +7,7 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'mock_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
     show MessageKind;
 
 final libraryUri = Uri.parse('test:library.dart');
@@ -22,13 +22,11 @@
 ''';
 
 void main() {
-  var compiler = new MockCompiler();
+  MockCompiler compiler = new MockCompiler.internal();
   compiler.registerSource(libraryUri, LIBRARY_SOURCE);
   compiler.registerSource(partUri, PART_SOURCE);
 
-  asyncTest(() =>
-      compiler.libraryLoader.loadLibrary(libraryUri, null, libraryUri).
-      then((_) {
+  asyncTest(() => compiler.libraryLoader.loadLibrary(libraryUri).then((_) {
     print('errors: ${compiler.errors}');
     print('warnings: ${compiler.warnings}');
     Expect.isTrue(compiler.errors.isEmpty);
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index 1ae7f8d..a016613 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_test.dart
@@ -5,27 +5,22 @@
 import 'dart:async';
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
+import "package:compiler/implementation/dart2jslib.dart";
+import "package:compiler/implementation/elements/elements.dart";
+import "package:compiler/implementation/tree/tree.dart";
+import "package:compiler/implementation/util/util.dart";
 import "mock_compiler.dart";
 import "parser_helper.dart";
 
 Future<Compiler> applyPatch(String script, String patch,
                             {bool analyzeAll: false, bool analyzeOnly: false}) {
   String core = "$DEFAULT_CORELIB\n$script";
-  MockCompiler compiler = new MockCompiler(coreSource: core,
-                                           analyzeAll: analyzeAll,
-                                           analyzeOnly: analyzeOnly);
-  var uri = Uri.parse("core.dartp");
-  compiler.sourceFiles[uri.toString()] = new MockFile(patch);
-  var handler = new LibraryDependencyHandler(compiler);
-  return compiler.patchParser.patchLibrary(handler, uri, compiler.coreLibrary)
-      .then((_) {
-    handler.computeExports();
-    return compiler;
-  });
+  MockCompiler compiler = new MockCompiler.internal(coreSource: core,
+                                                    analyzeAll: analyzeAll,
+                                                    analyzeOnly: analyzeOnly);
+  var uri = Uri.parse("patch:core");
+  compiler.registerSource(uri, "$PATCH_CORE_SOURCE\n$patch");
+  return compiler.init().then((_) => compiler);
 }
 
 void expectHasBody(compiler, Element element) {
@@ -112,7 +107,7 @@
 testPatchFunction() {
   asyncTest(() => applyPatch(
       "external test();",
-      "patch test() { return 'string'; } ").then((compiler) {
+      "@patch test() { return 'string'; } ").then((compiler) {
     ensure(compiler, "test", compiler.coreLibrary.find,
            expectIsPatched: true, checkHasBody: true);
     ensure(compiler, "test", compiler.coreLibrary.patch.find,
@@ -133,8 +128,8 @@
       }
       """,
       """
-      patch class Class {
-        patch Class();
+      @patch class Class {
+        @patch Class();
       }
       """).then((compiler) {
     var classOrigin = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -173,8 +168,8 @@
       }
       """,
       r"""
-      patch class Class {
-        patch Class._(x, y) { print('$x,$y'); }
+      @patch class Class {
+        @patch Class._(x, y) { print('$x,$y'); }
       }
       """).then((compiler) {
     var classOrigin = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -218,8 +213,8 @@
       }
       """,
       """
-      patch class Class {
-        patch String toString() => 'string';
+      @patch class Class {
+        @patch String toString() => 'string';
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -248,8 +243,8 @@
       }
       """,
       """
-      patch class Class {
-        patch int get field => 5;
+      @patch class Class {
+        @patch int get field => 5;
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -283,7 +278,7 @@
       }
       """,
       """
-      patch class Class {
+      @patch class Class {
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -311,7 +306,7 @@
       }
       """,
       """
-      patch class Class {
+      @patch class Class {
         void ghost() {}
       }
       """).then((compiler) {
@@ -371,18 +366,18 @@
       }
       """,
       """
-      patch class Class {
-        patch int method1() => 0;
-        patch void method2() {}
-        patch void method3(String s2) {}
-        patch void method4([String str, int i]) {}
-        patch void method5() {}
-        patch void method6([String str]) {}
-        patch void method7([String s2]) {}
-        patch void method8({String s2}) {}
-        patch void method9(int str) {}
-        patch void method10([int str]) {}
-        patch void method11({int str}) {}
+      @patch class Class {
+        @patch int method1() => 0;
+        @patch void method2() {}
+        @patch void method3(String s2) {}
+        @patch void method4([String str, int i]) {}
+        @patch void method5() {}
+        @patch void method6([String str]) {}
+        @patch void method7([String s2]) {}
+        @patch void method8({String s2}) {}
+        @patch void method9(int str) {}
+        @patch void method10([int str]) {}
+        @patch void method11({int str}) {}
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -438,7 +433,7 @@
       external void foo();
       """,
       """
-      // patch void foo() {}
+      // @patch void foo() {}
       """).then((compiler) {
     var function = ensure(compiler, "foo", compiler.coreLibrary.find);
     compiler.resolver.resolve(function);
@@ -462,8 +457,8 @@
       }
       """,
       """
-      patch class Class {
-        // patch void foo() {}
+      @patch class Class {
+        // @patch void foo() {}
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -492,7 +487,7 @@
       class A {}
       """,
       """
-      patch class A {}
+      @patch class A {}
       """).then((compiler) {
     ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find,
                               expectIsPatched: true);
@@ -509,7 +504,7 @@
       // class Class {}
       """,
       """
-      patch class Class {}
+      @patch class Class {}
       """).then((compiler) {
     Expect.isTrue(compiler.warnings.isEmpty,
                   "Unexpected warnings: ${compiler.warnings}");
@@ -526,8 +521,8 @@
       class Class {}
       """,
       """
-      patch class Class {
-        patch void foo() {}
+      @patch class Class {
+        @patch void foo() {}
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -549,7 +544,7 @@
       external get foo;
       """,
       """
-      patch var foo;
+      @patch var foo;
       """).then((compiler) {
     ensure(compiler, "foo", compiler.coreLibrary.find);
 
@@ -568,7 +563,7 @@
       external var foo;
       """,
       """
-      patch get foo => 0;
+      @patch get foo => 0;
       """).then((compiler) {
     ensure(compiler, "foo", compiler.coreLibrary.find);
 
@@ -591,7 +586,7 @@
       void foo() {}
       """,
       """
-      patch void foo() {}
+      @patch void foo() {}
       """).then((compiler) {
     print('testPatchNonExternalTopLevel.errors:${compiler.errors}');
     print('testPatchNonExternalTopLevel.warnings:${compiler.warnings}');
@@ -613,8 +608,8 @@
       }
       """,
       """
-      patch class Class {
-        patch void foo() {}
+      @patch class Class {
+        @patch void foo() {}
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -639,7 +634,7 @@
       external void Class() {}
       """,
       """
-      patch class Class {}
+      @patch class Class {}
       """).then((compiler) {
     print('testPatchNonClass.errors:${compiler.errors}');
     print('testPatchNonClass.warnings:${compiler.warnings}');
@@ -659,7 +654,7 @@
       external void foo() {}
       """,
       """
-      patch get foo => 0;
+      @patch get foo => 0;
       """).then((compiler) {
     print('testPatchNonClass.errors:${compiler.errors}');
     print('testPatchNonClass.warnings:${compiler.warnings}');
@@ -679,7 +674,7 @@
       external set foo(var value) {}
       """,
       """
-      patch get foo => 0;
+      @patch get foo => 0;
       """).then((compiler) {
     print('testPatchNonClass.errors:${compiler.errors}');
     print('testPatchNonClass.warnings:${compiler.warnings}');
@@ -699,7 +694,7 @@
       external void foo() {}
       """,
       """
-      patch set foo(var value) {}
+      @patch set foo(var value) {}
       """).then((compiler) {
     print('testPatchNonClass.errors:${compiler.errors}');
     print('testPatchNonClass.warnings:${compiler.warnings}');
@@ -719,7 +714,7 @@
       external get foo;
       """,
       """
-      patch set foo(var value) {}
+      @patch set foo(var value) {}
       """).then((compiler) {
     print('testPatchNonClass.errors:${compiler.errors}');
     print('testPatchNonClass.warnings:${compiler.warnings}');
@@ -739,7 +734,7 @@
       external get foo;
       """,
       """
-      patch void foo() {}
+      @patch void foo() {}
       """).then((compiler) {
     print('testPatchNonClass.errors:${compiler.errors}');
     print('testPatchNonClass.warnings:${compiler.warnings}');
@@ -764,9 +759,9 @@
       }
       """,
       """
-      patch class A {
+      @patch class A {
         int method() => 0;
-        patch void clear() {}
+        @patch void clear() {}
       }
       """).then((compiler) {
     ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find,
@@ -784,7 +779,7 @@
     // Check that a method just in the patch class is a target for a
     // typed selector.
     var selector = new Selector.call('method', compiler.coreLibrary, 0);
-    var typedSelector = new TypedSelector.exact(cls, selector);
+    var typedSelector = new TypedSelector.exact(cls, selector, compiler);
     Element method = cls.implementation.lookupLocalMember('method');
     Expect.isTrue(selector.applies(method, compiler));
     Expect.isTrue(typedSelector.applies(method, compiler));
@@ -792,7 +787,7 @@
     // Check that the declaration method in the declaration class is a target
     // for a typed selector.
     selector = new Selector.call('clear', compiler.coreLibrary, 0);
-    typedSelector = new TypedSelector.exact(cls, selector);
+    typedSelector = new TypedSelector.exact(cls, selector, compiler);
     method = cls.lookupLocalMember('clear');
     Expect.isTrue(selector.applies(method, compiler));
     Expect.isTrue(typedSelector.applies(method, compiler));
@@ -801,7 +796,7 @@
     // for a typed selector on a subclass.
     cls = ensure(compiler, "B", compiler.coreLibrary.find);
     cls.ensureResolved(compiler);
-    typedSelector = new TypedSelector.exact(cls, selector);
+    typedSelector = new TypedSelector.exact(cls, selector, compiler);
     Expect.isTrue(selector.applies(method, compiler));
     Expect.isTrue(typedSelector.applies(method, compiler));
   }));
@@ -844,7 +839,7 @@
 void testTypecheckPatchedMembers() {
   String originText = "external void method();";
   String patchText = """
-                     patch void method() {
+                     @patch void method() {
                        String s = 0;
                      }
                      """;
diff --git a/tests/compiler/dart2js/pretty_parameter_test.dart b/tests/compiler/dart2js/pretty_parameter_test.dart
index 91f00fd..723683b 100644
--- a/tests/compiler/dart2js/pretty_parameter_test.dart
+++ b/tests/compiler/dart2js/pretty_parameter_test.dart
@@ -3,7 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String FOO = r"""
@@ -71,26 +73,34 @@
 """;
 
 main() {
-  String generated = compile(FOO, entry: 'foo');
-  Expect.isTrue(generated.contains(r"function(a, b) {"));
+  asyncTest(() => Future.wait([
+    compile(FOO, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains(r"function(a, b) {"));
+    }),
 
-  generated = compile(BAR, entry: 'bar');
-  Expect.isTrue(generated.contains(r"function($eval, $$eval) {"));
+    compile(BAR, entry: 'bar', check: (String generated) {
+      Expect.isTrue(generated.contains(r"function($eval, $$eval) {"));
+    }),
 
-  generated = compile(PARAMETER_AND_TEMP, entry: 'bar');
-  Expect.isTrue(generated.contains(r"print(t00)"));
-  // Check that the second 't0' got another name.
-  Expect.isTrue(generated.contains(r"print(t01)"));
+    compile(PARAMETER_AND_TEMP, entry: 'bar', check: (String generated) {
+      Expect.isTrue(generated.contains(r"print(t00)"));
+      // Check that the second 't0' got another name.
+      Expect.isTrue(generated.contains(r"print(t01)"));
+    }),
 
-  generated = compile(MULTIPLE_PHIS_ONE_LOCAL, entry: 'foo');
-  Expect.isTrue(generated.contains("var a;"));
-  // Check that there is only one var declaration.
-  checkNumberOfMatches(new RegExp("var").allMatches(generated).iterator, 1);
+    compile(MULTIPLE_PHIS_ONE_LOCAL, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains("var a;"));
+      // Check that there is only one var declaration.
+      checkNumberOfMatches(new RegExp("var").allMatches(generated).iterator, 1);
+    }),
 
-  generated = compile(NO_LOCAL, entry: 'foo');
-  Expect.isFalse(generated.contains('var'));
+    compile(NO_LOCAL, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('var'));
+    }),
 
-  generated = compile(PARAMETER_INIT, entry: 'foo');
-  // Check that there is only one var declaration.
-  checkNumberOfMatches(new RegExp("var").allMatches(generated).iterator, 1);
+    compile(PARAMETER_INIT, entry: 'foo', check: (String generated) {
+      // Check that there is only one var declaration.
+      checkNumberOfMatches(new RegExp("var").allMatches(generated).iterator, 1);
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/private_test.dart b/tests/compiler/dart2js/private_test.dart
index 45c41dd..568fb14 100644
--- a/tests/compiler/dart2js/private_test.dart
+++ b/tests/compiler/dart2js/private_test.dart
@@ -6,8 +6,8 @@
 import "package:async_helper/async_helper.dart";
 import 'mock_compiler.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';
+import 'package:compiler/implementation/source_file.dart';
+import 'package:compiler/implementation/dart2jslib.dart';
 
 const String PRIVATE_SOURCE_URI = 'src:private';
 const String PRIVATE_SOURCE = '''
@@ -45,7 +45,7 @@
   if (expectedWarnings == null) expectedWarnings = [];
   if (expectedWarnings is !List) expectedWarnings = [expectedWarnings];
 
-  MockCompiler compiler = new MockCompiler(analyzeOnly: true);
+  MockCompiler compiler = new MockCompiler.internal(analyzeOnly: true);
   compiler.registerSource(Uri.parse(PRIVATE_SOURCE_URI), PRIVATE_SOURCE);
   compiler.diagnosticHandler = (uri, int begin, int end, String message, kind) {
     SourceFile sourceFile = compiler.sourceFiles[uri.toString()];
diff --git a/tests/compiler/dart2js/redundant_phi_eliminator_test.dart b/tests/compiler/dart2js/redundant_phi_eliminator_test.dart
index de35f7e..d7f2b72 100644
--- a/tests/compiler/dart2js/redundant_phi_eliminator_test.dart
+++ b/tests/compiler/dart2js/redundant_phi_eliminator_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -28,13 +30,17 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  RegExp regexp = new RegExp("toBeRemoved");
-  Expect.isTrue(!regexp.hasMatch(generated));
+  asyncTest(() => Future.wait([
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp("toBeRemoved");
+      Expect.isTrue(!regexp.hasMatch(generated));
+    }),
 
-  generated = compile(TEST_TWO, entry: 'foo');
-  regexp = new RegExp("toBeRemoved");
-  Expect.isTrue(!regexp.hasMatch(generated));
-  regexp = new RegExp("temp");
-  Expect.isTrue(!regexp.hasMatch(generated));
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp("toBeRemoved");
+      Expect.isTrue(!regexp.hasMatch(generated));
+      regexp = new RegExp("temp");
+      Expect.isTrue(!regexp.hasMatch(generated));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/reexport_handled_test.dart b/tests/compiler/dart2js/reexport_handled_test.dart
index f2982ed..353e0a5 100644
--- a/tests/compiler/dart2js/reexport_handled_test.dart
+++ b/tests/compiler/dart2js/reexport_handled_test.dart
@@ -7,7 +7,7 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'mock_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
+import 'package:compiler/implementation/elements/elements.dart'
     show Element,
          LibraryElement;
 
@@ -24,21 +24,20 @@
 ''';
 
 void main() {
-  var compiler = new MockCompiler();
-  compiler.registerSource(exportingLibraryUri, EXPORTING_LIBRARY_SOURCE);
-  compiler.registerSource(reexportingLibraryUri, REEXPORTING_LIBRARY_SOURCE);
-
-  // Load exporting library before the reexporting library.
-  asyncTest(() => compiler.libraryLoader.loadLibrary(
-      exportingLibraryUri, null, exportingLibraryUri).then((exportingLibrary) {
+  MockCompiler compiler;
+  asyncTest(() => MockCompiler.create((MockCompiler c) {
+    compiler = c;
+    compiler.registerSource(exportingLibraryUri, EXPORTING_LIBRARY_SOURCE);
+    compiler.registerSource(reexportingLibraryUri, REEXPORTING_LIBRARY_SOURCE);
+    return compiler.libraryLoader.loadLibrary(exportingLibraryUri);
+  }).then((exportingLibrary) {
     Expect.isTrue(exportingLibrary.exportsHandled);
     var foo = findInExports(exportingLibrary, 'foo');
     Expect.isNotNull(foo);
     Expect.isTrue(foo.isField);
 
     // Load reexporting library when exports are handled on the exporting library.
-    return compiler.libraryLoader.loadLibrary(
-        reexportingLibraryUri, null, reexportingLibraryUri);
+    return compiler.libraryLoader.loadLibrary(reexportingLibraryUri);
   }).then((reexportingLibrary) {
     var foo = findInExports(reexportingLibrary, 'foo');
     Expect.isNotNull(foo);
diff --git a/tests/compiler/dart2js/resolution_test.dart b/tests/compiler/dart2js/resolution_test.dart
index 3480144..2e8714b 100644
--- a/tests/compiler/dart2js/resolution_test.dart
+++ b/tests/compiler/dart2js/resolution_test.dart
@@ -9,7 +9,7 @@
 import "package:async_helper/async_helper.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart';
+import 'package:compiler/implementation/apiimpl.dart';
 
 const String NO_RUNTIME_TYPE = r"""
 import 'dart:core' as prefix;
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 4e88fb0..3107d36 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -7,12 +7,12 @@
 import "package:async_helper/async_helper.dart";
 import 'dart:collection';
 
-import "../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart";
+import "package:compiler/implementation/resolution/resolution.dart";
 import "compiler_helper.dart";
 import "parser_helper.dart";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart';
+import 'package:compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/elements/modelx.dart';
 
 Node buildIdentifier(String name) => new Identifier(scan(name));
 
@@ -35,58 +35,61 @@
   return new VariableDefinitions(null, Modifiers.EMPTY, definitions);
 }
 
-testLocals(List variables) {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  Element element = visitor.visit(createLocals(variables));
-  // A VariableDefinitions does not have an element.
-  Expect.equals(null, element);
-  Expect.equals(variables.length, map(visitor).length);
+Future testLocals(List variables) {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    Element element = visitor.visit(createLocals(variables));
+    // A VariableDefinitions does not have an element.
+    Expect.equals(null, element);
+    Expect.equals(variables.length, map(visitor).length);
 
-  for (final variable in variables) {
-    final name = variable[0];
-    Identifier id = buildIdentifier(name);
-    final VariableElement variableElement = visitor.visit(id);
-    MethodScope scope = visitor.scope;
-    Expect.equals(variableElement, scope.elements[name]);
-  }
-  return compiler;
+    for (final variable in variables) {
+      final name = variable[0];
+      Identifier id = buildIdentifier(name);
+      final VariableElement variableElement = visitor.visit(id);
+      MethodScope scope = visitor.scope;
+      Expect.equals(variableElement, scope.elements[name]);
+    }
+    return compiler;
+  });
 }
 
 main() {
-  testLocalsOne();
-  testLocalsTwo();
-  testLocalsThree();
-  testLocalsFour();
-  testLocalsFive();
-  testParametersOne();
-  testFor();
-  testTypeAnnotation();
-  testSuperclass();
-  // testVarSuperclass(); // The parser crashes with 'class Foo extends var'.
-  // testOneInterface(); // Generates unexpected error message.
-  // testTwoInterfaces(); // Generates unexpected error message.
-  testFunctionExpression();
-  testNewExpression();
-  testTopLevelFields();
-  testClassHierarchy();
-  testInitializers();
-  testThis();
-  testSuperCalls();
-  testSwitch();
-  testTypeVariables();
-  testToString();
-  testIndexedOperator();
-  testIncrementsAndDecrements();
-  testOverrideHashCodeCheck();
-  testSupertypeOrder();
-  testConstructorArgumentMismatch();
-  testConstConstructorAndNonFinalFields();
+  asyncTest(() => Future.forEach([
+    testLocalsOne,
+    testLocalsTwo,
+    testLocalsThree,
+    testLocalsFour,
+    testLocalsFive,
+    testParametersOne,
+    testFor,
+    testTypeAnnotation,
+    testSuperclass,
+    // testVarSuperclass, // The parser crashes with 'class Foo extends var'.
+    // testOneInterface, // Generates unexpected error message.
+    // testTwoInterfaces, // Generates unexpected error message.
+    testFunctionExpression,
+    testNewExpression,
+    testTopLevelFields,
+    testClassHierarchy,
+    testInitializers,
+    testThis,
+    testSuperCalls,
+    testSwitch,
+    testTypeVariables,
+    testToString,
+    testIndexedOperator,
+    testIncrementsAndDecrements,
+    testOverrideHashCodeCheck,
+    testSupertypeOrder,
+    testConstConstructorAndNonFinalFields,
+  ], (f) => f()));
 }
 
-testSupertypeOrder() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("""
+Future testSupertypeOrder() {
+  return Future.wait([
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""
 class I1 {}
 class I2 {}
 class J1 extends K1 {}
@@ -98,32 +101,34 @@
 class B extends A implements J1, J2 {}
 class C extends B implements L1 {}
 """);
-  compiler.resolveStatement("C c;");
-  ClassElement classA = compiler.mainApp.find("A");
-  ClassElement classB = compiler.mainApp.find("B");
-  ClassElement classC = compiler.mainApp.find("C");
-  Expect.equals('[ I2, I1, Object ]', classA.allSupertypes.toString());
-  Expect.equals('[ A, J2, J1, I2, I1, K2, K1, Object ]',
-                classB.allSupertypes.toString());
-  Expect.equals('[ B, L1, A, J2, J1, I2, I1, K2, K1, Object ]',
-                classC.allSupertypes.toString());
-
- compiler = new MockCompiler();
-  compiler.parseScript("""
+      compiler.resolveStatement("C c;");
+      ClassElement classA = compiler.mainApp.find("A");
+      ClassElement classB = compiler.mainApp.find("B");
+      ClassElement classC = compiler.mainApp.find("C");
+      Expect.equals('[ I2, I1, Object ]', classA.allSupertypes.toString());
+      Expect.equals('[ A, J2, J1, I2, I1, K2, K1, Object ]',
+                    classB.allSupertypes.toString());
+      Expect.equals('[ B, L1, A, J2, J1, I2, I1, K2, K1, Object ]',
+                    classC.allSupertypes.toString());
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""
 class X<T> {}
 class Foo extends X<Foo> {}
 class Bar extends Foo implements X<Bar> {}
 """);
-  compiler.resolveStatement("Bar bar;");
-  ClassElement classBar = compiler.mainApp.find("Bar");
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.MULTI_INHERITANCE,
-                compiler.errors[0].message.kind);
-  Expect.equals(0, compiler.crashes.length);
+      compiler.resolveStatement("Bar bar;");
+      ClassElement classBar = compiler.mainApp.find("Bar");
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(MessageKind.MULTI_INHERITANCE,
+                    compiler.errors[0].message.kind);
+      Expect.equals(0, compiler.crashes.length);
+    }),
+  ]);
 }
 
-testTypeVariables() {
+Future testTypeVariables() {
   matchResolvedTypes(visitor, text, name, expectedElements) {
     VariableDefinitions definition = parseStatement(text);
     visitor.visit(definition.type);
@@ -141,300 +146,324 @@
     Expect.equals(index, expectedElements.length);
   }
 
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  compiler.parseScript('class Foo<T, U> {}');
-  ClassElement foo = compiler.mainApp.find('Foo');
-  matchResolvedTypes(visitor, 'Foo<int, String> x;', 'Foo',
-                     [compiler.intClass, compiler.stringClass]);
-  matchResolvedTypes(visitor, 'Foo<Foo, Foo> x;', 'Foo',
-                     [foo, foo]);
+  return Future.wait([
+    MockCompiler.create((MockCompiler compiler) {
+      ResolverVisitor visitor = compiler.resolverVisitor();
+      compiler.parseScript('class Foo<T, U> {}');
+      ClassElement foo = compiler.mainApp.find('Foo');
+      matchResolvedTypes(visitor, 'Foo<int, String> x;', 'Foo',
+                         [compiler.intClass, compiler.stringClass]);
+      matchResolvedTypes(visitor, 'Foo<Foo, Foo> x;', 'Foo',
+                         [foo, foo]);
+    }),
 
-  compiler = new MockCompiler();
-  compiler.parseScript('class Foo<T, U> {}');
-  compiler.resolveStatement('Foo<notype, int> x;');
-  Expect.equals(1, compiler.warnings.length);
-  Expect.equals(MessageKind.CANNOT_RESOLVE_TYPE,
-                compiler.warnings[0].message.kind);
-  Expect.equals(0, compiler.errors.length);
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript('class Foo<T, U> {}');
+      compiler.resolveStatement('Foo<notype, int> x;');
+      Expect.equals(1, compiler.warnings.length);
+      Expect.equals(MessageKind.CANNOT_RESOLVE_TYPE,
+                    compiler.warnings[0].message.kind);
+      Expect.equals(0, compiler.errors.length);
+    }),
 
-  compiler = new MockCompiler();
-  compiler.parseScript('class Foo<T, U> {}');
-  compiler.resolveStatement('var x = new Foo<notype, int>();');
-  Expect.equals(1, compiler.warnings.length);
-  Expect.equals(0, compiler.errors.length);
-  Expect.equals(MessageKind.CANNOT_RESOLVE_TYPE,
-                compiler.warnings[0].message.kind);
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript('class Foo<T, U> {}');
+      compiler.resolveStatement('var x = new Foo<notype, int>();');
+      Expect.equals(1, compiler.warnings.length);
+      Expect.equals(0, compiler.errors.length);
+      Expect.equals(MessageKind.CANNOT_RESOLVE_TYPE,
+                    compiler.warnings[0].message.kind);
+    }),
 
-  compiler = new MockCompiler();
-  compiler.parseScript('class Foo<T> {'
-                       '  Foo<T> t;'
-                       '  foo(Foo<T> f) {}'
-                       '  bar() { g(Foo<T> f) {}; g(); }'
-                       '}');
-  foo = compiler.mainApp.find('Foo');
-  foo.ensureResolved(compiler);
-  foo.lookupLocalMember('t').computeType(compiler);;
-  foo.lookupLocalMember('foo').computeType(compiler);;
-  compiler.resolver.resolve(foo.lookupLocalMember('bar'));
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(0, compiler.errors.length);
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript('class Foo<T> {'
+                           '  Foo<T> t;'
+                           '  foo(Foo<T> f) {}'
+                           '  bar() { g(Foo<T> f) {}; g(); }'
+                           '}');
+      ClassElement foo = compiler.mainApp.find('Foo');
+      foo.ensureResolved(compiler);
+      foo.lookupLocalMember('t').computeType(compiler);;
+      foo.lookupLocalMember('foo').computeType(compiler);;
+      compiler.resolver.resolve(foo.lookupLocalMember('bar'));
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(0, compiler.errors.length);
+    }),
+  ]);
 }
 
-testSuperCalls() {
-  MockCompiler compiler = new MockCompiler();
-  String script = """class A { foo() {} }
-                     class B extends A { foo() => super.foo(); }""";
-  compiler.parseScript(script);
-  compiler.resolveStatement("B b;");
+Future testSuperCalls() {
+  return MockCompiler.create((MockCompiler compiler) {
+    String script = """class A { foo() {} }
+                       class B extends A { foo() => super.foo(); }""";
+    compiler.parseScript(script);
+    compiler.resolveStatement("B b;");
 
-  ClassElement classB = compiler.mainApp.find("B");
-  FunctionElement fooB = classB.lookupLocalMember("foo");
-  ClassElement classA = compiler.mainApp.find("A");
-  FunctionElement fooA = classA.lookupLocalMember("foo");
+    ClassElement classB = compiler.mainApp.find("B");
+    FunctionElement fooB = classB.lookupLocalMember("foo");
+    ClassElement classA = compiler.mainApp.find("A");
+    FunctionElement fooA = classA.lookupLocalMember("foo");
 
-  ResolverVisitor visitor =
-      new ResolverVisitor(compiler, fooB,
-          new ResolutionRegistry.internal(compiler,
-              new CollectingTreeElements(fooB)));
-  FunctionExpression node = fooB.parseNode(compiler);
-  visitor.visit(node.body);
-  Map mapping = map(visitor);
+    ResolverVisitor visitor =
+        new ResolverVisitor(compiler, fooB,
+            new ResolutionRegistry.internal(compiler,
+                new CollectingTreeElements(fooB)));
+    FunctionExpression node = fooB.parseNode(compiler);
+    visitor.visit(node.body);
+    Map mapping = map(visitor);
 
-  Send superCall = node.body.asReturn().expression;
-  FunctionElement called = mapping[superCall];
-  Expect.isNotNull(called);
-  Expect.equals(fooA, called);
+    Send superCall = node.body.asReturn().expression;
+    FunctionElement called = mapping[superCall];
+    Expect.isNotNull(called);
+    Expect.equals(fooA, called);
+  });
 }
 
-testSwitch() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("class Foo { foo() {"
-      "switch (null) { case '': break; case 2: break; } } }");
-  compiler.resolveStatement("Foo foo;");
-  ClassElement fooElement = compiler.mainApp.find("Foo");
-  FunctionElement funElement = fooElement.lookupLocalMember("foo");
-  compiler.processQueue(compiler.enqueuer.resolution, funElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL,
-                compiler.errors[0].message.kind);
-  Expect.equals(2, compiler.infos.length);
-  Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
-                compiler.infos[0].message.kind);
-  Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
-                compiler.infos[1].message.kind);
+Future testSwitch() {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.parseScript("class Foo { foo() {"
+        "switch (null) { case '': break; case 2: break; } } }");
+    compiler.resolveStatement("Foo foo;");
+    ClassElement fooElement = compiler.mainApp.find("Foo");
+    FunctionElement funElement = fooElement.lookupLocalMember("foo");
+    compiler.processQueue(compiler.enqueuer.resolution, funElement);
+    Expect.equals(0, compiler.warnings.length);
+    Expect.equals(1, compiler.errors.length);
+    Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL,
+                  compiler.errors[0].message.kind);
+    Expect.equals(2, compiler.infos.length);
+    Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
+                  compiler.infos[0].message.kind);
+    Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
+                  compiler.infos[1].message.kind);
+  });
 }
 
-testThis() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("class Foo { foo() { return this; } }");
-  compiler.resolveStatement("Foo foo;");
-  ClassElement fooElement = compiler.mainApp.find("Foo");
-  FunctionElement funElement = fooElement.lookupLocalMember("foo");
-  ResolverVisitor visitor =
-      new ResolverVisitor(compiler, funElement,
+Future testThis() {
+  return Future.wait([
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("class Foo { foo() { return this; } }");
+      compiler.resolveStatement("Foo foo;");
+      ClassElement fooElement = compiler.mainApp.find("Foo");
+      FunctionElement funElement = fooElement.lookupLocalMember("foo");
+      ResolverVisitor visitor =
+          new ResolverVisitor(compiler, funElement,
+              new ResolutionRegistry.internal(compiler,
+                  new CollectingTreeElements(funElement)));
+      FunctionExpression function = funElement.parseNode(compiler);
+      visitor.visit(function.body);
+      Map mapping = map(visitor);
+      List<Element> values = mapping.values.toList();
+      Expect.equals(0, mapping.length);
+      Expect.equals(0, compiler.warnings.length);
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.resolveStatement("main() { return this; }");
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(MessageKind.NO_INSTANCE_AVAILABLE,
+                    compiler.errors[0].message.kind);
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("class Foo { static foo() { return this; } }");
+      compiler.resolveStatement("Foo foo;");
+      ClassElement fooElement = compiler.mainApp.find("Foo");
+      FunctionElement funElement = fooElement.lookupLocalMember("foo");
+      ResolverVisitor visitor = new ResolverVisitor(compiler, funElement,
           new ResolutionRegistry.internal(compiler,
               new CollectingTreeElements(funElement)));
-  FunctionExpression function = funElement.parseNode(compiler);
-  visitor.visit(function.body);
-  Map mapping = map(visitor);
-  List<Element> values = mapping.values.toList();
-  Expect.equals(0, mapping.length);
-  Expect.equals(0, compiler.warnings.length);
-
-  compiler = new MockCompiler();
-  compiler.resolveStatement("main() { return this; }");
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.NO_INSTANCE_AVAILABLE,
-                compiler.errors[0].message.kind);
-
-  compiler = new MockCompiler();
-  compiler.parseScript("class Foo { static foo() { return this; } }");
-  compiler.resolveStatement("Foo foo;");
-  fooElement = compiler.mainApp.find("Foo");
-  funElement = fooElement.lookupLocalMember("foo");
-  visitor = new ResolverVisitor(compiler, funElement,
-      new ResolutionRegistry.internal(compiler,
-          new CollectingTreeElements(funElement)));
-  function = funElement.parseNode(compiler);
-  visitor.visit(function.body);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.NO_INSTANCE_AVAILABLE,
-                compiler.errors[0].message.kind);
+      FunctionExpression function = funElement.parseNode(compiler);
+      visitor.visit(function.body);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(MessageKind.NO_INSTANCE_AVAILABLE,
+                    compiler.errors[0].message.kind);
+    }),
+  ]);
 }
 
-testLocalsOne() {
-  testLocals([["foo", false]]);
-  testLocals([["foo", false], ["bar", false]]);
-  testLocals([["foo", false], ["bar", false], ["foobar", false]]);
+Future testLocalsOne() {
+  return Future.forEach([
+      () => testLocals([["foo", false]]),
+      () => testLocals([["foo", false], ["bar", false]]),
+      () => testLocals([["foo", false], ["bar", false], ["foobar", false]]),
 
-  testLocals([["foo", true]]);
-  testLocals([["foo", false], ["bar", true]]);
-  testLocals([["foo", true], ["bar", true]]);
+      () => testLocals([["foo", true]]),
+      () => testLocals([["foo", false], ["bar", true]]),
+      () => testLocals([["foo", true], ["bar", true]]),
 
-  testLocals([["foo", false], ["bar", false], ["foobar", true]]);
-  testLocals([["foo", false], ["bar", true], ["foobar", true]]);
-  testLocals([["foo", true], ["bar", true], ["foobar", true]]);
+      () => testLocals([["foo", false], ["bar", false], ["foobar", true]]),
+      () => testLocals([["foo", false], ["bar", true], ["foobar", true]]),
+      () => testLocals([["foo", true], ["bar", true], ["foobar", true]]),
 
-  MockCompiler compiler = testLocals([["foo", false], ["foo", false]]);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(
-      new Message(MessageKind.DUPLICATE_DEFINITION, {'name': 'foo'}, false),
-      compiler.errors[0].message);
+      () => testLocals([["foo", false], ["foo", false]])
+          .then((MockCompiler compiler) {
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(
+          new Message(MessageKind.DUPLICATE_DEFINITION, {'name': 'foo'}, false),
+          compiler.errors[0].message);
+    })], (f) => f());
 }
 
 
-testLocalsTwo() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  Node tree = parseStatement("if (true) { var a = 1; var b = 2; }");
-  Element element = visitor.visit(tree);
-  Expect.equals(null, element);
-  MethodScope scope = visitor.scope;
-  Expect.equals(0, scope.elements.length);
-  Expect.equals(2, map(visitor).length);
+Future testLocalsTwo() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    Node tree = parseStatement("if (true) { var a = 1; var b = 2; }");
+    Element element = visitor.visit(tree);
+    Expect.equals(null, element);
+    MethodScope scope = visitor.scope;
+    Expect.equals(0, scope.elements.length);
+    Expect.equals(2, map(visitor).length);
 
-  List<Element> elements = new List<Element>.from(map(visitor).values);
-  Expect.notEquals(elements[0], elements[1]);
+    List<Element> elements = new List<Element>.from(map(visitor).values);
+    Expect.notEquals(elements[0], elements[1]);
+  });
 }
 
-testLocalsThree() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  Node tree = parseStatement("{ var a = 1; if (true) { a; } }");
-  Element element = visitor.visit(tree);
-  Expect.equals(null, element);
-  MethodScope scope = visitor.scope;
-  Expect.equals(0, scope.elements.length);
-  Expect.equals(3, map(visitor).length);
-  List<Element> elements = map(visitor).values.toList();
-  Expect.equals(elements[0], elements[1]);
+Future testLocalsThree() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    Node tree = parseStatement("{ var a = 1; if (true) { a; } }");
+    Element element = visitor.visit(tree);
+    Expect.equals(null, element);
+    MethodScope scope = visitor.scope;
+    Expect.equals(0, scope.elements.length);
+    Expect.equals(3, map(visitor).length);
+    List<Element> elements = map(visitor).values.toList();
+    Expect.equals(elements[0], elements[1]);
+  });
 }
 
-testLocalsFour() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  Node tree = parseStatement("{ var a = 1; if (true) { var a = 1; } }");
-  Element element = visitor.visit(tree);
-  Expect.equals(null, element);
-  MethodScope scope = visitor.scope;
-  Expect.equals(0, scope.elements.length);
-  Expect.equals(2, map(visitor).length);
-  List<Element> elements = map(visitor).values.toList();
-  Expect.notEquals(elements[0], elements[1]);
+Future testLocalsFour() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    Node tree = parseStatement("{ var a = 1; if (true) { var a = 1; } }");
+    Element element = visitor.visit(tree);
+    Expect.equals(null, element);
+    MethodScope scope = visitor.scope;
+    Expect.equals(0, scope.elements.length);
+    Expect.equals(2, map(visitor).length);
+    List<Element> elements = map(visitor).values.toList();
+    Expect.notEquals(elements[0], elements[1]);
+  });
 }
 
-testLocalsFive() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  If tree = parseStatement("if (true) { var a = 1; a; } else { var a = 2; a;}");
-  Element element = visitor.visit(tree);
-  Expect.equals(null, element);
-  MethodScope scope = visitor.scope;
-  Expect.equals(0, scope.elements.length);
-  Expect.equals(6, map(visitor).length);
+Future testLocalsFive() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    If tree =
+        parseStatement("if (true) { var a = 1; a; } else { var a = 2; a;}");
+    Element element = visitor.visit(tree);
+    Expect.equals(null, element);
+    MethodScope scope = visitor.scope;
+    Expect.equals(0, scope.elements.length);
+    Expect.equals(6, map(visitor).length);
 
-  Block thenPart = tree.thenPart;
-  List statements1 = thenPart.statements.nodes.toList();
-  Node def1 = statements1[0].definitions.nodes.head;
-  Node id1 = statements1[1].expression;
-  Expect.equals(visitor.registry.mapping[def1], visitor.registry.mapping[id1]);
+    Block thenPart = tree.thenPart;
+    List statements1 = thenPart.statements.nodes.toList();
+    Node def1 = statements1[0].definitions.nodes.head;
+    Node id1 = statements1[1].expression;
+    Expect.equals(visitor.registry.mapping[def1],
+                  visitor.registry.mapping[id1]);
 
-  Block elsePart = tree.elsePart;
-  List statements2 = elsePart.statements.nodes.toList();
-  Node def2 = statements2[0].definitions.nodes.head;
-  Node id2 = statements2[1].expression;
-  Expect.equals(visitor.registry.mapping[def2], visitor.registry.mapping[id2]);
+    Block elsePart = tree.elsePart;
+    List statements2 = elsePart.statements.nodes.toList();
+    Node def2 = statements2[0].definitions.nodes.head;
+    Node id2 = statements2[1].expression;
+    Expect.equals(visitor.registry.mapping[def2],
+                  visitor.registry.mapping[id2]);
 
-  Expect.notEquals(visitor.registry.mapping[def1],
-                   visitor.registry.mapping[def2]);
-  Expect.notEquals(visitor.registry.mapping[id1],
-                   visitor.registry.mapping[id2]);
+    Expect.notEquals(visitor.registry.mapping[def1],
+                     visitor.registry.mapping[def2]);
+    Expect.notEquals(visitor.registry.mapping[id1],
+                     visitor.registry.mapping[id2]);
+  });
 }
 
-testParametersOne() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  FunctionExpression tree =
-      parseFunction("void foo(int a) { return a; }", compiler);
-  visitor.visit(tree);
+Future testParametersOne() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    FunctionExpression tree =
+        parseFunction("void foo(int a) { return a; }", compiler);
+    visitor.visit(tree);
 
-  // Check that an element has been created for the parameter.
-  VariableDefinitions vardef = tree.parameters.nodes.head;
-  Node param = vardef.definitions.nodes.head;
-  Expect.equals(ElementKind.PARAMETER, visitor.registry.mapping[param].kind);
+    // Check that an element has been created for the parameter.
+    VariableDefinitions vardef = tree.parameters.nodes.head;
+    Node param = vardef.definitions.nodes.head;
+    Expect.equals(ElementKind.PARAMETER, visitor.registry.mapping[param].kind);
 
-  // Check that 'a' in 'return a' is resolved to the parameter.
-  Block body = tree.body;
-  Return ret = body.statements.nodes.head;
-  Send use = ret.expression;
-  Expect.equals(ElementKind.PARAMETER, visitor.registry.mapping[use].kind);
-  Expect.equals(visitor.registry.mapping[param], visitor.registry.mapping[use]);
+    // Check that 'a' in 'return a' is resolved to the parameter.
+    Block body = tree.body;
+    Return ret = body.statements.nodes.head;
+    Send use = ret.expression;
+    Expect.equals(ElementKind.PARAMETER, visitor.registry.mapping[use].kind);
+    Expect.equals(visitor.registry.mapping[param],
+                  visitor.registry.mapping[use]);
+  });
 }
 
-testFor() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  For tree = parseStatement("for (int i = 0; i < 10; i = i + 1) { i = 5; }");
-  visitor.visit(tree);
+Future testFor() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    For tree = parseStatement("for (int i = 0; i < 10; i = i + 1) { i = 5; }");
+    visitor.visit(tree);
 
-  MethodScope scope = visitor.scope;
-  Expect.equals(0, scope.elements.length);
-  Expect.equals(10, map(visitor).length);
+    MethodScope scope = visitor.scope;
+    Expect.equals(0, scope.elements.length);
+    Expect.equals(10, map(visitor).length);
 
-  VariableDefinitions initializer = tree.initializer;
-  Node iNode = initializer.definitions.nodes.head;
-  Element iElement = visitor.registry.mapping[iNode];
+    VariableDefinitions initializer = tree.initializer;
+    Node iNode = initializer.definitions.nodes.head;
+    Element iElement = visitor.registry.mapping[iNode];
 
-  // Check that we have the expected nodes. This test relies on the mapping
-  // field to be a linked hash map (preserving insertion order).
-  Expect.isTrue(map(visitor) is LinkedHashMap);
-  List<Node> nodes = map(visitor).keys.toList();
-  List<Element> elements = map(visitor).values.toList();
+    // Check that we have the expected nodes. This test relies on the mapping
+    // field to be a linked hash map (preserving insertion order).
+    Expect.isTrue(map(visitor) is LinkedHashMap);
+    List<Node> nodes = map(visitor).keys.toList();
+    List<Element> elements = map(visitor).values.toList();
 
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //      ^^^
-  Expect.isTrue(nodes[0] is TypeAnnotation);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //      ^^^
+    Expect.isTrue(nodes[0] is TypeAnnotation);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //          ^^^^^
-  checkSendSet(iElement, nodes[1], elements[1]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //          ^^^^^
+    checkSendSet(iElement, nodes[1], elements[1]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                 ^
-  checkIdentifier(iElement, nodes[2], elements[2]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                 ^
+    checkIdentifier(iElement, nodes[2], elements[2]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                 ^
-  checkSend(iElement, nodes[3], elements[3]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                 ^
+    checkSend(iElement, nodes[3], elements[3]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                         ^
-  checkIdentifier(iElement, nodes[4], elements[4]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                         ^
+    checkIdentifier(iElement, nodes[4], elements[4]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                             ^
-  checkIdentifier(iElement, nodes[5], elements[5]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                             ^
+    checkIdentifier(iElement, nodes[5], elements[5]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                             ^
-  checkSend(iElement, nodes[6], elements[6]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                             ^
+    checkSend(iElement, nodes[6], elements[6]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                         ^^^^^^^^^
-  checkSendSet(iElement, nodes[7], elements[7]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                         ^^^^^^^^^
+    checkSendSet(iElement, nodes[7], elements[7]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                                      ^
-  checkIdentifier(iElement, nodes[8], elements[8]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                                      ^
+    checkIdentifier(iElement, nodes[8], elements[8]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                                      ^^^^^
-  checkSendSet(iElement, nodes[9], elements[9]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                                      ^^^^^
+    checkSendSet(iElement, nodes[9], elements[9]);
+  });
 }
 
 checkIdentifier(Element expected, Node node, Element actual) {
@@ -453,431 +482,459 @@
   Expect.equals(expected, actual);
 }
 
-testTypeAnnotation() {
-  MockCompiler compiler = new MockCompiler();
-  String statement = "Foo bar;";
+Future testTypeAnnotation() {
+  return MockCompiler.create((MockCompiler compiler) {
+    String statement = "Foo bar;";
 
-  // Test that we get a warning when Foo is not defined.
-  Map mapping = compiler.resolveStatement(statement).map;
+    // Test that we get a warning when Foo is not defined.
+    Map mapping = compiler.resolveStatement(statement).map;
 
-  Expect.equals(2, mapping.length); // Both Foo and bar have an element.
-  Expect.equals(1, compiler.warnings.length);
+    Expect.equals(2, mapping.length); // Both Foo and bar have an element.
+    Expect.equals(1, compiler.warnings.length);
 
-  Node warningNode = compiler.warnings[0].node;
+    Node warningNode = compiler.warnings[0].node;
 
-  Expect.equals(
-      new Message(
-          MessageKind.CANNOT_RESOLVE_TYPE,  {'typeName': 'Foo'}, false),
-      compiler.warnings[0].message);
-  VariableDefinitions definition = compiler.parsedTree;
-  Expect.equals(warningNode, definition.type);
-  compiler.clearMessages();
+    Expect.equals(
+        new Message(
+            MessageKind.CANNOT_RESOLVE_TYPE,  {'typeName': 'Foo'}, false),
+        compiler.warnings[0].message);
+    VariableDefinitions definition = compiler.parsedTree;
+    Expect.equals(warningNode, definition.type);
+    compiler.clearMessages();
 
-  // Test that there is no warning after defining Foo.
-  compiler.parseScript("class Foo {}");
-  mapping = compiler.resolveStatement(statement).map;
-  Expect.equals(2, mapping.length);
-  Expect.equals(0, compiler.warnings.length);
+    // Test that there is no warning after defining Foo.
+    compiler.parseScript("class Foo {}");
+    mapping = compiler.resolveStatement(statement).map;
+    Expect.equals(2, mapping.length);
+    Expect.equals(0, compiler.warnings.length);
 
-  // Test that 'var' does not create a warning.
-  mapping = compiler.resolveStatement("var foo;").map;
-  Expect.equals(1, mapping.length);
-  Expect.equals(0, compiler.warnings.length);
-}
-
-testSuperclass() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("class Foo extends Bar {}");
-  compiler.resolveStatement("Foo bar;");
-  Expect.equals(1, compiler.errors.length);
-  var cannotResolveBar = new Message(MessageKind.CANNOT_EXTEND_MALFORMED,
-                                     {'typeName': 'Bar'}, false);
-  Expect.equals(cannotResolveBar, compiler.errors[0].message);
-  compiler.clearMessages();
-
-  compiler = new MockCompiler();
-  compiler.parseScript("class Foo extends Bar {}");
-  compiler.parseScript("class Bar {}");
-  Map mapping = compiler.resolveStatement("Foo bar;").map;
-  Expect.equals(2, mapping.length);
-
-  ClassElement fooElement = compiler.mainApp.find('Foo');
-  ClassElement barElement = compiler.mainApp.find('Bar');
-  Expect.equals(barElement.computeType(compiler),
-                fooElement.supertype);
-  Expect.isTrue(fooElement.interfaces.isEmpty);
-  Expect.isTrue(barElement.interfaces.isEmpty);
-}
-
-testVarSuperclass() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("class Foo extends var {}");
-  compiler.resolveStatement("Foo bar;");
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(
-      new Message(
-          MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': 'var'}, false),
-      compiler.errors[0].message);
-  compiler.clearMessages();
-}
-
-testOneInterface() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("class Foo implements Bar {}");
-  compiler.resolveStatement("Foo bar;");
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(
-      new Message(
-          MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': 'bar'}, false),
-      compiler.errors[0].message);
-  compiler.clearMessages();
-
-  // Add the abstract class to the world and make sure everything is setup
-  // correctly.
-  compiler.parseScript("abstract class Bar {}");
-
-  ResolverVisitor visitor =
-      new ResolverVisitor(compiler, null,
-          new ResolutionRegistry.internal(compiler,
-              new CollectingTreeElements(null)));
-  compiler.resolveStatement("Foo bar;");
-
-  ClassElement fooElement = compiler.mainApp.find('Foo');
-  ClassElement barElement = compiler.mainApp.find('Bar');
-
-  Expect.equals(null, barElement.supertype);
-  Expect.isTrue(barElement.interfaces.isEmpty);
-
-  Expect.equals(barElement.computeType(compiler),
-                fooElement.interfaces.head);
-  Expect.equals(1, length(fooElement.interfaces));
-}
-
-testTwoInterfaces() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript(
-      "abstract class I1 {} abstract class I2 {} class C implements I1, I2 {}");
-  compiler.resolveStatement("Foo bar;");
-
-  ClassElement c = compiler.mainApp.find('C');
-  Element i1 = compiler.mainApp.find('I1');
-  Element i2 = compiler.mainApp.find('I2');
-
-  Expect.equals(2, length(c.interfaces));
-  Expect.equals(i1.computeType(compiler), at(c.interfaces, 0));
-  Expect.equals(i2.computeType(compiler), at(c.interfaces, 1));
-}
-
-testFunctionExpression() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  Map mapping = compiler.resolveStatement("int f() {}").map;
-  Expect.equals(3, mapping.length);
-  Element element;
-  Node node;
-  mapping.forEach((Node n, Element e) {
-    if (n is FunctionExpression) {
-      element = e;
-      node = n;
-    }
+    // Test that 'var' does not create a warning.
+    mapping = compiler.resolveStatement("var foo;").map;
+    Expect.equals(1, mapping.length);
+    Expect.equals(0, compiler.warnings.length);
   });
-  Expect.equals(ElementKind.FUNCTION, element.kind);
-  Expect.equals('f', element.name);
-  Expect.equals(element.parseNode(compiler), node);
 }
 
-testNewExpression() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("class A {} foo() { print(new A()); }");
-  ClassElement aElement = compiler.mainApp.find('A');
-  FunctionElement fooElement = compiler.mainApp.find('foo');
-  Expect.isNotNull(aElement);
-  Expect.isNotNull(fooElement);
+Future testSuperclass() {
+  return Future.wait([
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("class Foo extends Bar {}");
+      compiler.resolveStatement("Foo bar;");
+      Expect.equals(1, compiler.errors.length);
+      var cannotResolveBar = new Message(MessageKind.CANNOT_EXTEND_MALFORMED,
+          {'className': 'Foo', 'malformedType': 'Bar'}, false);
+      Expect.equals(cannotResolveBar, compiler.errors[0].message);
+      compiler.clearMessages();
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("class Foo extends Bar {}");
+      compiler.parseScript("class Bar {}");
+      Map mapping = compiler.resolveStatement("Foo bar;").map;
+      Expect.equals(2, mapping.length);
 
-  fooElement.parseNode(compiler);
-  compiler.resolver.resolve(fooElement);
-
-  TreeElements elements = compiler.resolveStatement("new A();");
-  NewExpression expression =
-      compiler.parsedTree.asExpressionStatement().expression;
-  Element element = elements[expression.send];
-  Expect.equals(ElementKind.GENERATIVE_CONSTRUCTOR, element.kind);
-  Expect.isTrue(element.isSynthesized);
+      ClassElement fooElement = compiler.mainApp.find('Foo');
+      ClassElement barElement = compiler.mainApp.find('Bar');
+      Expect.equals(barElement.computeType(compiler),
+                    fooElement.supertype);
+      Expect.isTrue(fooElement.interfaces.isEmpty);
+      Expect.isTrue(barElement.interfaces.isEmpty);
+    }),
+  ]);
 }
 
-testConstructorArgumentMismatch() {
-  String script = "class A {} foo() { print(new A(42)); }";
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript(script);
-  FunctionElement fooElement = compiler.mainApp.find('foo');
-  Expect.isNotNull(fooElement);
-  fooElement.parseNode(compiler);
-  compiler.resolver.resolve(fooElement);
-
-  compareWarningKinds(
-      script, [MessageKind.INVALID_ARGUMENTS], compiler.warnings);
-  compareWarningKinds(script, [], compiler.errors);
+Future testVarSuperclass() {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.parseScript("class Foo extends var {}");
+    compiler.resolveStatement("Foo bar;");
+    Expect.equals(1, compiler.errors.length);
+    Expect.equals(
+        new Message(
+            MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': 'var'}, false),
+        compiler.errors[0].message);
+    compiler.clearMessages();
+  });
 }
 
-testTopLevelFields() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("int a;");
-  VariableElementX element = compiler.mainApp.find("a");
-  Expect.equals(ElementKind.FIELD, element.kind);
-  VariableDefinitions node = element.variables.parseNode(element, compiler);
-  Identifier typeName = node.type.typeName;
-  Expect.equals(typeName.source, 'int');
+Future testOneInterface() {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.parseScript("class Foo implements Bar {}");
+    compiler.resolveStatement("Foo bar;");
+    Expect.equals(1, compiler.errors.length);
+    Expect.equals(
+        new Message(
+            MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': 'bar'}, false),
+        compiler.errors[0].message);
+    compiler.clearMessages();
 
-  compiler.parseScript("var b, c;");
-  VariableElementX bElement = compiler.mainApp.find("b");
-  VariableElementX cElement = compiler.mainApp.find("c");
-  Expect.equals(ElementKind.FIELD, bElement.kind);
-  Expect.equals(ElementKind.FIELD, cElement.kind);
-  Expect.isTrue(bElement != cElement);
+    // Add the abstract class to the world and make sure everything is setup
+    // correctly.
+    compiler.parseScript("abstract class Bar {}");
 
-  VariableDefinitions bNode = bElement.variables.parseNode(bElement, compiler);
-  VariableDefinitions cNode = cElement.variables.parseNode(cElement, compiler);
-  Expect.equals(bNode, cNode);
-  Expect.isNull(bNode.type);
-  Expect.isTrue(bNode.modifiers.isVar);
+    ResolverVisitor visitor =
+        new ResolverVisitor(compiler, null,
+            new ResolutionRegistry.internal(compiler,
+                new CollectingTreeElements(null)));
+    compiler.resolveStatement("Foo bar;");
+
+    ClassElement fooElement = compiler.mainApp.find('Foo');
+    ClassElement barElement = compiler.mainApp.find('Bar');
+
+    Expect.equals(null, barElement.supertype);
+    Expect.isTrue(barElement.interfaces.isEmpty);
+
+    Expect.equals(barElement.computeType(compiler),
+                  fooElement.interfaces.head);
+    Expect.equals(1, length(fooElement.interfaces));
+  });
 }
 
-resolveConstructor(String script, String statement, String className,
-                   String constructor, int expectedElementCount,
-                   {List expectedWarnings: const [],
-                    List expectedErrors: const [],
-                    List expectedInfos: const [],
-                    String corelib: DEFAULT_CORELIB}) {
-  MockCompiler compiler = new MockCompiler(coreSource: corelib);
-  compiler.parseScript(script);
-  compiler.resolveStatement(statement);
-  ClassElement classElement = compiler.mainApp.find(className);
-  Element element;
-  if (constructor != '') {
-    element = classElement.lookupConstructor(
-        new Selector.callConstructor(constructor, classElement.library));
-  } else {
-    element = classElement.lookupConstructor(
-        new Selector.callDefaultConstructor(classElement.library));
-  }
+Future testTwoInterfaces() {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.parseScript(
+        """abstract class I1 {} 
+           abstract class I2 {} 
+           class C implements I1, I2 {}""");
+    compiler.resolveStatement("Foo bar;");
 
-  FunctionExpression tree = element.parseNode(compiler);
-  ResolverVisitor visitor =
-      new ResolverVisitor(compiler, element,
-          new ResolutionRegistry.internal(compiler,
-              new CollectingTreeElements(element)));
-  new InitializerResolver(visitor).resolveInitializers(element, tree);
-  visitor.visit(tree.body);
-  Expect.equals(expectedElementCount, map(visitor).length);
+    ClassElement c = compiler.mainApp.find('C');
+    Element i1 = compiler.mainApp.find('I1');
+    Element i2 = compiler.mainApp.find('I2');
 
-  compareWarningKinds(script, expectedWarnings, compiler.warnings);
-  compareWarningKinds(script, expectedErrors, compiler.errors);
-  compareWarningKinds(script, expectedInfos, compiler.infos);
+    Expect.equals(2, length(c.interfaces));
+    Expect.equals(i1.computeType(compiler), at(c.interfaces, 0));
+    Expect.equals(i2.computeType(compiler), at(c.interfaces, 1));
+  });
 }
 
-testClassHierarchy() {
+Future testFunctionExpression() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    Map mapping = compiler.resolveStatement("int f() {}").map;
+    Expect.equals(3, mapping.length);
+    Element element;
+    Node node;
+    mapping.forEach((Node n, Element e) {
+      if (n is FunctionExpression) {
+        element = e;
+        node = n;
+      }
+    });
+    Expect.equals(ElementKind.FUNCTION, element.kind);
+    Expect.equals('f', element.name);
+    Expect.equals(element.parseNode(compiler), node);
+  });
+}
+
+Future testNewExpression() {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.parseScript("class A {} foo() { print(new A()); }");
+    ClassElement aElement = compiler.mainApp.find('A');
+    FunctionElement fooElement = compiler.mainApp.find('foo');
+    Expect.isNotNull(aElement);
+    Expect.isNotNull(fooElement);
+
+    fooElement.parseNode(compiler);
+    compiler.resolver.resolve(fooElement);
+
+    TreeElements elements = compiler.resolveStatement("new A();");
+    NewExpression expression =
+        compiler.parsedTree.asExpressionStatement().expression;
+    Element element = elements[expression.send];
+    Expect.equals(ElementKind.GENERATIVE_CONSTRUCTOR, element.kind);
+    Expect.isTrue(element.isSynthesized);
+  });
+}
+
+Future testTopLevelFields() {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.parseScript("int a;");
+    VariableElementX element = compiler.mainApp.find("a");
+    Expect.equals(ElementKind.FIELD, element.kind);
+    VariableDefinitions node = element.variables.parseNode(element, compiler);
+    Identifier typeName = node.type.typeName;
+    Expect.equals(typeName.source, 'int');
+
+    compiler.parseScript("var b, c;");
+    VariableElementX bElement = compiler.mainApp.find("b");
+    VariableElementX cElement = compiler.mainApp.find("c");
+    Expect.equals(ElementKind.FIELD, bElement.kind);
+    Expect.equals(ElementKind.FIELD, cElement.kind);
+    Expect.isTrue(bElement != cElement);
+
+    VariableDefinitions bNode = bElement.variables.parseNode(bElement, compiler);
+    VariableDefinitions cNode = cElement.variables.parseNode(cElement, compiler);
+    Expect.equals(bNode, cNode);
+    Expect.isNull(bNode.type);
+    Expect.isTrue(bNode.modifiers.isVar);
+  });
+}
+
+Future resolveConstructor(
+    String script, String statement, String className,
+    String constructor, int expectedElementCount,
+    {List expectedWarnings: const [],
+     List expectedErrors: const [],
+     List expectedInfos: const [],
+     String corelib: DEFAULT_CORELIB}) {
+  MockCompiler compiler = new MockCompiler.internal(coreSource: corelib);
+  return compiler.init().then((_) {
+    compiler.parseScript(script);
+    compiler.resolveStatement(statement);
+    ClassElement classElement = compiler.mainApp.find(className);
+    Element element;
+    if (constructor != '') {
+      element = classElement.lookupConstructor(
+          new Selector.callConstructor(constructor, classElement.library));
+    } else {
+      element = classElement.lookupConstructor(
+          new Selector.callDefaultConstructor(classElement.library));
+    }
+
+    FunctionExpression tree = element.parseNode(compiler);
+    ResolverVisitor visitor =
+        new ResolverVisitor(compiler, element,
+            new ResolutionRegistry.internal(compiler,
+                new CollectingTreeElements(element)));
+    new InitializerResolver(visitor).resolveInitializers(element, tree);
+    visitor.visit(tree.body);
+    Expect.equals(expectedElementCount, map(visitor).length);
+
+    compareWarningKinds(script, expectedWarnings, compiler.warnings);
+    compareWarningKinds(script, expectedErrors, compiler.errors);
+    compareWarningKinds(script, expectedInfos, compiler.infos);
+  });
+}
+
+Future testClassHierarchy() {
   final MAIN = "main";
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("""class A extends A {}
-                          main() { return new A(); }""");
-  FunctionElement mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
-                compiler.errors[0].message.kind);
-
-  compiler = new MockCompiler();
-  compiler.parseScript("""class A extends B {}
-                          class B extends A {}
-                          main() { return new A(); }""");
-  mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(2, compiler.errors.length);
-  Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
-                compiler.errors[0].message.kind);
-  Expect.equals(MessageKind.CANNOT_FIND_CONSTRUCTOR,
-                compiler.errors[1].message.kind);
-
-  compiler = new MockCompiler();
-  compiler.parseScript("""abstract class A extends B {}
-                          abstract class B extends A {}
-                          class C implements A {}
-                          main() { return new C(); }""");
-  mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
-                compiler.errors[0].message.kind);
-
-  compiler = new MockCompiler();
-  compiler.parseScript("""class A extends B {}
-                          class B extends C {}
-                          class C {}
-                          main() { return new A(); }""");
-  mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(0, compiler.errors.length);
-  ClassElement aElement = compiler.mainApp.find("A");
-  Link<DartType> supertypes = aElement.allSupertypes;
-  Expect.equals(<String>['B', 'C', 'Object'].toString(),
-                asSortedStrings(supertypes).toString());
-
-  compiler = new MockCompiler();
-  compiler.parseScript("""class A<T> {}
-                          class B<Z,W> extends A<int> implements I<Z,List<W>> {}
-                          class I<X,Y> {}
-                          class C extends B<bool,String> {}
-                          main() { return new C(); }""");
-  mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(0, compiler.errors.length);
-  aElement = compiler.mainApp.find("C");
-  supertypes = aElement.allSupertypes;
-  // Object is once per inheritance path, that is from both A and I.
-  Expect.equals(<String>['A<int>', 'B<bool, String>', 'I<bool, List<String>>',
-                         'Object'].toString(),
-                asSortedStrings(supertypes).toString());
-
-  compiler = new MockCompiler();
-  compiler.parseScript("""class A<T> {}
-                          class D extends A<E> {}
-                          class E extends D {}
-                          main() { return new E(); }""");
-  mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(0, compiler.errors.length);
-  aElement = compiler.mainApp.find("E");
-  supertypes = aElement.allSupertypes;
-  Expect.equals(<String>['A<E>', 'D', 'Object'].toString(),
-                asSortedStrings(supertypes).toString());
-
-  compiler = new MockCompiler();
-  compiler.parseScript("""class A<T> {}
-                          class D extends A<int> implements A<double> {}
-                          main() { return new D(); }""");
-  mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.MULTI_INHERITANCE,
-                compiler.errors[0].message.kind);
-  Expect.equals(0, compiler.crashes.length);
+  return Future.wait([
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""class A extends A {}
+                              main() { return new A(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
+                    compiler.errors[0].message.kind);
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""class A extends B {}
+                              class B extends A {}
+                              main() { return new A(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(2, compiler.errors.length);
+      Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
+                    compiler.errors[0].message.kind);
+      Expect.equals(MessageKind.CANNOT_FIND_CONSTRUCTOR,
+                    compiler.errors[1].message.kind);
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""abstract class A extends B {}
+                              abstract class B extends A {}
+                              class C implements A {}
+                              main() { return new C(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
+                    compiler.errors[0].message.kind);
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""class A extends B {}
+                              class B extends C {}
+                              class C {}
+                              main() { return new A(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(0, compiler.errors.length);
+      ClassElement aElement = compiler.mainApp.find("A");
+      Link<DartType> supertypes = aElement.allSupertypes;
+      Expect.equals(<String>['B', 'C', 'Object'].toString(),
+                    asSortedStrings(supertypes).toString());
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""class A<T> {}
+                              class B<Z,W> extends A<int> 
+                                  implements I<Z,List<W>> {}
+                              class I<X,Y> {}
+                              class C extends B<bool,String> {}
+                              main() { return new C(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(0, compiler.errors.length);
+      ClassElement aElement = compiler.mainApp.find("C");
+      Link<DartType> supertypes = aElement.allSupertypes;
+      // Object is once per inheritance path, that is from both A and I.
+      Expect.equals(<String>['A<int>', 'B<bool, String>',
+                             'I<bool, List<String>>', 'Object'].toString(),
+                    asSortedStrings(supertypes).toString());
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""class A<T> {}
+                              class D extends A<E> {}
+                              class E extends D {}
+                              main() { return new E(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(0, compiler.errors.length);
+      ClassElement aElement = compiler.mainApp.find("E");
+      Link<DartType> supertypes = aElement.allSupertypes;
+      Expect.equals(<String>['A<E>', 'D', 'Object'].toString(),
+                    asSortedStrings(supertypes).toString());
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""class A<T> {}
+                              class D extends A<int> implements A<double> {}
+                              main() { return new D(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(MessageKind.MULTI_INHERITANCE,
+                    compiler.errors[0].message.kind);
+      Expect.equals(0, compiler.crashes.length);
+    }),
+  ]);
 }
 
-testInitializers() {
-  String script;
-  script = """class A {
-                int foo; int bar;
-                A() : this.foo = 1, bar = 2;
-              }""";
-  resolveConstructor(script, "A a = new A();", "A", "", 2);
-
-  script = """class A {
-                int foo; A a;
-                A() : a.foo = 1;
-                }""";
-  resolveConstructor(script, "A a = new A();", "A", "", 0,
-                     expectedWarnings: [],
-                     expectedErrors:
-                         [MessageKind.INVALID_RECEIVER_IN_INITIALIZER]);
-
-  script = """class A {
-                int foo;
-                A() : this.foo = 1, this.foo = 2;
-              }""";
-  resolveConstructor(script, "A a = new A();", "A", "", 2,
-                     expectedInfos: [MessageKind.ALREADY_INITIALIZED],
-                     expectedErrors: [MessageKind.DUPLICATE_INITIALIZER]);
-
-  script = """class A {
-                A() : this.foo = 1;
-              }""";
-  resolveConstructor(script, "A a = new A();", "A", "", 0,
-                     expectedWarnings: [],
-                     expectedErrors: [MessageKind.CANNOT_RESOLVE]);
-
-  script = """class A {
-                int foo;
-                int bar;
-                A() : this.foo = bar;
-              }""";
-  resolveConstructor(script, "A a = new A();", "A", "", 3,
-                     expectedWarnings: [],
-                     expectedErrors: [MessageKind.NO_INSTANCE_AVAILABLE]);
-
-  script = """class A {
-                int foo() => 42;
-                A() : foo();
-              }""";
-  resolveConstructor(script, "A a = new A();", "A", "", 0,
-                     expectedWarnings: [],
-                     expectedErrors: [MessageKind.CONSTRUCTOR_CALL_EXPECTED]);
-
-  script = """class A {
-                int i;
-                A.a() : this.b(0);
-                A.b(int i);
-              }""";
-  resolveConstructor(script, "A a = new A.a();", "A", "a", 1);
-
-  script = """class A {
-                int i;
-                A.a() : i = 42, this(0);
-                A(int i);
-              }""";
-  resolveConstructor(script, "A a = new A.a();", "A", "a", 2,
-                     expectedWarnings: [],
-                     expectedErrors:
-                         [MessageKind.REDIRECTING_CONSTRUCTOR_HAS_INITIALIZER]);
-
-  script = """class A {
-                int i;
-                A(i);
-              }
-              class B extends A {
-                B() : super(0);
-              }""";
-  resolveConstructor(script, "B a = new B();", "B", "", 1);
-
-  script = """class A {
-                int i;
-                A(i);
-              }
-              class B extends A {
-                B() : super(0), super(1);
-              }""";
-  resolveConstructor(script, "B b = new B();", "B", "", 2,
-                     expectedWarnings: [],
-                     expectedErrors: [MessageKind.DUPLICATE_SUPER_INITIALIZER]);
-
-  script = "";
-  final String CORELIB_WITH_INVALID_OBJECT =
-      '''print(var obj) {}
-         class int {}
-         class double {}
-         class bool {}
-         class String {}
-         class num {}
-         class Function {}
-         class List<E> {}
-         class Map {}
-         class Closure {}
-         class Null {}
-         class StackTrace {}
-         class Dynamic_ {}
-         class Type {}
-         class Object { Object() : super(); }
-         const proxy = 0;''';
-  resolveConstructor(script, "Object o = new Object();", "Object", "", 1,
-                     expectedWarnings: [],
-                     expectedErrors: [MessageKind.SUPER_INITIALIZER_IN_OBJECT],
-                     corelib: CORELIB_WITH_INVALID_OBJECT);
+Future testInitializers() {
+  return Future.forEach([
+    () {
+      String script =
+          """class A {
+                    int foo; int bar;
+                    A() : this.foo = 1, bar = 2;
+                  }""";
+      return resolveConstructor(script, "A a = new A();", "A", "", 2);
+    },
+    () {
+      String script =
+          """class A {
+               int foo; A a;
+               A() : a.foo = 1;
+             }""";
+      return resolveConstructor(script, "A a = new A();", "A", "", 0,
+          expectedWarnings: [],
+          expectedErrors: [MessageKind.INVALID_RECEIVER_IN_INITIALIZER]);
+    },
+    () {
+      String script =
+          """class A {
+               int foo;
+               A() : this.foo = 1, this.foo = 2;
+             }""";
+      return resolveConstructor(script, "A a = new A();", "A", "", 2,
+          expectedInfos: [MessageKind.ALREADY_INITIALIZED],
+          expectedErrors: [MessageKind.DUPLICATE_INITIALIZER]);
+    },
+    () {
+      String script =
+          """class A {
+               A() : this.foo = 1;
+             }""";
+      return resolveConstructor(script, "A a = new A();", "A", "", 0,
+          expectedWarnings: [],
+          expectedErrors: [MessageKind.CANNOT_RESOLVE]);
+    },
+    () {
+      String script =
+          """class A {
+               int foo;
+               int bar;
+               A() : this.foo = bar;
+             }""";
+      return resolveConstructor(script, "A a = new A();", "A", "", 3,
+          expectedWarnings: [],
+          expectedErrors: [MessageKind.NO_INSTANCE_AVAILABLE]);
+    },
+    () {
+      String script =
+          """class A {
+               int foo() => 42;
+               A() : foo();
+             }""";
+      return resolveConstructor(script, "A a = new A();", "A", "", 0,
+          expectedWarnings: [],
+          expectedErrors: [MessageKind.CONSTRUCTOR_CALL_EXPECTED]);
+    },
+    () {
+      String script =
+          """class A {
+               int i;
+               A.a() : this.b(0);
+               A.b(int i);
+             }""";
+      return resolveConstructor(script, "A a = new A.a();", "A", "a", 1);
+    },
+    () {
+      String script =
+          """class A {
+               int i;
+               A.a() : i = 42, this(0);
+               A(int i);
+             }""";
+      return resolveConstructor(script, "A a = new A.a();", "A", "a", 2,
+          expectedWarnings: [],
+          expectedErrors:
+              [MessageKind.REDIRECTING_CONSTRUCTOR_HAS_INITIALIZER]);
+    },
+    () {
+      String script =
+          """class A {
+               int i;
+               A(i);
+             }
+             class B extends A {
+               B() : super(0);
+             }""";
+      return resolveConstructor(script, "B a = new B();", "B", "", 1);
+    },
+    () {
+      String script =
+          """class A {
+               int i;
+               A(i);
+             }
+             class B extends A {
+               B() : super(0), super(1);
+             }""";
+      return resolveConstructor(script, "B b = new B();", "B", "", 2,
+          expectedWarnings: [],
+          expectedErrors: [MessageKind.DUPLICATE_SUPER_INITIALIZER]);
+    },
+    () {
+      String script = "";
+      final String CORELIB_WITH_INVALID_OBJECT =
+          '''print(var obj) {}
+             class int {}
+             class double {}
+             class bool {}
+             class String {}
+             class num {}
+             class Function {}
+             class List<E> {}
+             class Map {}
+             class Closure {}
+             class Null {}
+             class StackTrace {}
+             class Dynamic_ {}
+             class Type {}
+             class Object { Object() : super(); }
+             const proxy = 0;''';
+      return resolveConstructor(script,
+          "Object o = new Object();", "Object", "", 1,
+          expectedWarnings: [],
+          expectedErrors: [MessageKind.SUPER_INITIALIZER_IN_OBJECT],
+          corelib: CORELIB_WITH_INVALID_OBJECT);
+    },
+  ], (f) => f());
 }
 
 map(ResolverVisitor visitor) {
@@ -907,8 +964,8 @@
   ClassElement cls = findElement(compiler, className);
   Element memberElement = cls.lookupLocalMember(memberName);
   Expect.isNotNull(memberElement);
-  Expect.isNotNull(
-      compiler.enqueuer.resolution.getCachedElements(memberElement));
+  Expect.isTrue(
+      compiler.enqueuer.resolution.hasBeenResolved(memberElement));
 }
 
 testToString() {
diff --git a/tests/compiler/dart2js/scanner_offset_length_test.dart b/tests/compiler/dart2js/scanner_offset_length_test.dart
index 798057d..531be7b 100644
--- a/tests/compiler/dart2js/scanner_offset_length_test.dart
+++ b/tests/compiler/dart2js/scanner_offset_length_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
+import 'package:compiler/implementation/scanner/scannerlib.dart';
 
 Token scan(String text) =>
     new StringScanner.fromString(text, includeComments: true).tokenize();
diff --git a/tests/compiler/dart2js/scanner_test.dart b/tests/compiler/dart2js/scanner_test.dart
index 2945bd5..11d5133 100644
--- a/tests/compiler/dart2js/scanner_test.dart
+++ b/tests/compiler/dart2js/scanner_test.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/util/characters.dart';
+import 'package:compiler/implementation/scanner/scannerlib.dart';
+import 'package:compiler/implementation/util/characters.dart';
 import 'dart:typed_data';
 
 Token scan(List<int> bytes) => new Utf8BytesScanner.fromBytes(bytes).tokenize();
diff --git a/tests/compiler/dart2js/setlet_test.dart b/tests/compiler/dart2js/setlet_test.dart
index d57d64a..c4dc493 100644
--- a/tests/compiler/dart2js/setlet_test.dart
+++ b/tests/compiler/dart2js/setlet_test.dart
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 import 'dart:collection';
-import '../../../sdk/lib/_internal/compiler/implementation/util/setlet.dart';
+import 'package:compiler/implementation/util/setlet.dart';
 
 main() {
   for (int i = 1; i <= 32; i++) {
diff --git a/tests/compiler/dart2js/simple_function_subtype_test.dart b/tests/compiler/dart2js/simple_function_subtype_test.dart
index 7329598..3997dea 100644
--- a/tests/compiler/dart2js/simple_function_subtype_test.dart
+++ b/tests/compiler/dart2js/simple_function_subtype_test.dart
@@ -5,7 +5,9 @@
 // Test that simple function subtype checks use predicates.
 
 library simple_function_subtype_test;
-import "package:expect/expect.dart";
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST = r"""
@@ -49,12 +51,13 @@
 """;
 
 main() {
-  String generated = compile(TEST, entry: 'foo');
-  for (int i = 0 ; i <= 15  ; i++) {
-    String predicateCheck = '.\$is_args$i';
-    Expect.isTrue(generated.contains(predicateCheck),
-      'Expected predicate check $predicateCheck');
-  }
-  Expect.isFalse(generated.contains('checkFunctionSubtype'),
-    'Unexpected use of checkFunctionSubtype');
+  asyncTest(() => compile(TEST, entry: 'foo', check: (String generated) {
+    for (int i = 0 ; i <= 15  ; i++) {
+      String predicateCheck = '.\$is_args$i';
+      Expect.isTrue(generated.contains(predicateCheck),
+        'Expected predicate check $predicateCheck');
+    }
+    Expect.isFalse(generated.contains('checkFunctionSubtype'),
+      'Unexpected use of checkFunctionSubtype');
+  }));
 }
\ No newline at end of file
diff --git a/tests/compiler/dart2js/simple_inferrer_callers_test.dart b/tests/compiler/dart2js/simple_inferrer_callers_test.dart
index 165dc18..115ccc5 100644
--- a/tests/compiler/dart2js/simple_inferrer_callers_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_callers_test.dart
@@ -7,8 +7,8 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart';
+import 'package:compiler/implementation/types/types.dart';
+import 'package:compiler/implementation/inferrer/type_graph_inferrer.dart';
 
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
diff --git a/tests/compiler/dart2js/simple_inferrer_relations_test.dart b/tests/compiler/dart2js/simple_inferrer_relations_test.dart
index 313154a..70706e2 100644
--- a/tests/compiler/dart2js/simple_inferrer_relations_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_relations_test.dart
@@ -4,9 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
-    show TypeMask;
+import 'package:compiler/implementation/types/types.dart' show TypeMask;
 
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
diff --git a/tests/compiler/dart2js/simple_inferrer_test.dart b/tests/compiler/dart2js/simple_inferrer_test.dart
index 10d4d66..18409d8 100644
--- a/tests/compiler/dart2js/simple_inferrer_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_test.dart
@@ -4,9 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
-    show TypeMask;
+import 'package:compiler/implementation/types/types.dart' show TypeMask;
 import 'type_mask_test_helper.dart';
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart b/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
index 10aedf9..bf7f0fe 100644
--- a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/size_test.dart b/tests/compiler/dart2js/size_test.dart
index d15f924..e6f7b25 100644
--- a/tests/compiler/dart2js/size_test.dart
+++ b/tests/compiler/dart2js/size_test.dart
@@ -19,6 +19,7 @@
   class double {}
   class String {}
   class Function {}
+  class Null {}
   class Type {}
   class Map {}
   class StackTrace {}
@@ -29,10 +30,11 @@
 main() {
   asyncTest(() => compileAll(TEST, coreSource: DEFAULT_CORELIB_WITH_LIST).
       then((generated) {
-    MockCompiler compiler = new MockCompiler();
-    var backend = compiler.backend;
+    return MockCompiler.create((MockCompiler compiler) {
+      var backend = compiler.backend;
 
-    // Make sure no class is emitted.
-    Expect.isFalse(generated.contains(backend.emitter.finishClassesName));
+      // Make sure no class is emitted.
+      Expect.isFalse(generated.contains(backend.emitter.finishClassesName));
+    });
   }));
 }
diff --git a/tests/compiler/dart2js/source_map_d2js_validity_test.dart b/tests/compiler/dart2js/source_map_d2js_validity_test.dart
index cbc5ed8..94e4814 100644
--- a/tests/compiler/dart2js/source_map_d2js_validity_test.dart
+++ b/tests/compiler/dart2js/source_map_d2js_validity_test.dart
@@ -8,7 +8,7 @@
 import 'package:async_helper/async_helper.dart';
 
 import 'source_map_validator_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2js.dart' as entry;
+import 'package:compiler/implementation/dart2js.dart' as entry;
 
 void main() {
   asyncTest(() => createTempDir().then((Directory tmpDir) {
@@ -26,4 +26,4 @@
         tmpDir.deleteSync(recursive: true);
       });
   }));
-}
\ No newline at end of file
+}
diff --git a/tests/compiler/dart2js/source_mapping_test.dart b/tests/compiler/dart2js/source_mapping_test.dart
index 35c633b..3118cd3 100644
--- a/tests/compiler/dart2js/source_mapping_test.dart
+++ b/tests/compiler/dart2js/source_mapping_test.dart
@@ -5,13 +5,13 @@
 import 'dart:async';
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
+import "package:compiler/implementation/dart2jslib.dart";
+import 'package:compiler/implementation/source_file.dart';
 import "mock_compiler.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
+import 'package:compiler/implementation/js_backend/js_backend.dart';
 
 Future<CodeBuffer> compileAll(SourceFile sourceFile) {
-  MockCompiler compiler = new MockCompiler();
+  MockCompiler compiler = new MockCompiler.internal();
   Uri uri = new Uri(path: sourceFile.filename);
   compiler.sourceFiles[uri.toString()] = sourceFile;
   JavaScriptBackend backend = compiler.backend;
diff --git a/tests/compiler/dart2js/space_test.dart b/tests/compiler/dart2js/space_test.dart
index 6eeafcd..59c5f04 100644
--- a/tests/compiler/dart2js/space_test.dart
+++ b/tests/compiler/dart2js/space_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2js.dart'
+import 'package:compiler/implementation/dart2js.dart'
   as dart2js;
 
 main() {
diff --git a/tests/compiler/dart2js/ssa_phi_codegen_test.dart b/tests/compiler/dart2js/ssa_phi_codegen_test.dart
index 9a1a0ed..2189e49 100644
--- a/tests/compiler/dart2js/ssa_phi_codegen_test.dart
+++ b/tests/compiler/dart2js/ssa_phi_codegen_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -68,20 +70,22 @@
 """;
 
 main() {
-  compileAndMatchFuzzy(TEST_ONE, 'foo', "var x = x === true \\? 2 : 3;");
-  compileAndMatchFuzzy(TEST_ONE, 'foo', "print\\(x\\);");
+  asyncTest(() => Future.wait([
+    compileAndMatchFuzzy(TEST_ONE, 'foo', "var x = x === true \\? 2 : 3;"),
+    compileAndMatchFuzzy(TEST_ONE, 'foo', "print\\(x\\);"),
 
-  compileAndMatchFuzzy(TEST_TWO, 'main', "x \\+= 10");
-  compileAndMatchFuzzy(TEST_TWO, 'main', "\\+\\+x");
+    compileAndMatchFuzzy(TEST_TWO, 'main', "x \\+= 10"),
+    compileAndMatchFuzzy(TEST_TWO, 'main', "\\+\\+x"),
 
-  // Check that we don't have 'd = d' (using regexp back references).
-  compileAndDoNotMatchFuzzy(TEST_THREE, 'foo', '(x) = \1');
-  compileAndMatchFuzzy(TEST_THREE, 'foo', 'return x');
-  // Check that a store just after the declaration of the local
-  // only generates one instruction.
-  compileAndMatchFuzzy(TEST_THREE, 'foo', 'x = 42');
+    // Check that we don't have 'd = d' (using regexp back references).
+    compileAndDoNotMatchFuzzy(TEST_THREE, 'foo', '(x) = \1'),
+    compileAndMatchFuzzy(TEST_THREE, 'foo', 'return x'),
+    // Check that a store just after the declaration of the local
+    // only generates one instruction.
+    compileAndMatchFuzzy(TEST_THREE, 'foo', 'x = 42'),
 
-  compileAndDoNotMatchFuzzy(TEST_FOUR, 'foo', '(x) = \1;');
+    compileAndDoNotMatchFuzzy(TEST_FOUR, 'foo', '(x) = \1;'),
 
-  compileAndDoNotMatch(TEST_FIVE, 'main', new RegExp('hash0'));
+    compileAndDoNotMatch(TEST_FIVE, 'main', new RegExp('hash0')),
+  ]));
 }
diff --git a/tests/compiler/dart2js/stats_test.dart b/tests/compiler/dart2js/stats_test.dart
index fd1796b..c13335a 100644
--- a/tests/compiler/dart2js/stats_test.dart
+++ b/tests/compiler/dart2js/stats_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/helpers/helpers.dart';
+import 'package:compiler/implementation/helpers/helpers.dart';
 
 class CollectingOutput implements StatsOutput {
   final StringBuffer sb = new StringBuffer();
diff --git a/tests/compiler/dart2js/strength_eq_test.dart b/tests/compiler/dart2js/strength_eq_test.dart
index bddafaa..ffc082e 100644
--- a/tests/compiler/dart2js/strength_eq_test.dart
+++ b/tests/compiler/dart2js/strength_eq_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test constant folding on numbers.
 
-import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String CODE = """
@@ -27,5 +27,5 @@
   // The `==` is strengthened to a HIdentity instruction.  The HIdentity follows
   // `x.link`, so x cannot be `null`.
   var compare = new RegExp(r'x === x\.get\$link\(\)');
-  compileAndMatch(CODE, 'main', compare);
+  asyncTest(() => compileAndMatch(CODE, 'main', compare));
 }
diff --git a/tests/compiler/dart2js/string_escapes_test.dart b/tests/compiler/dart2js/string_escapes_test.dart
index d47f7f1..1c62a25 100644
--- a/tests/compiler/dart2js/string_escapes_test.dart
+++ b/tests/compiler/dart2js/string_escapes_test.dart
@@ -2,23 +2,68 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 
 // Test that the compiler handles string literals containing line terminators.
 
-String compileExpression(String expression) {
+Future<String> compileExpression(String expression) {
   var source = "foo() { return $expression; }";
   return compile(source, entry: "foo");
 }
 
 main() {
-  String generated = compileExpression("''' \n\r\u2028\u2029'''");
-  Expect.isTrue(generated.contains(r"\n\r\u2028\u2029"));
-
-  generated = compileExpression("r''' \n\r\u2028\u2029'''");
-  Expect.isTrue(generated.contains(r"\n\r\u2028\u2029"));
-
-  generated = compileExpression("'\u2028\u2029'");
-  Expect.isTrue(generated.contains(r"\u2028\u2029"));
+  asyncTest(() => Future.wait([
+    compileExpression("''' \n\r\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+                    generated.contains(r"'\r\u2028\u2029'"));
+    }),
+    compileExpression("r''' \n\r\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+                    generated.contains(r"'\r\u2028\u2029'"));
+    }),
+    compileExpression("r''' \r\n\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+                    generated.contains(r"'\u2028\u2029'"));
+    }),
+    compileExpression("r''' \r\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+                    generated.contains(r"'\u2028\u2029'"));
+    }),
+    compileExpression("r''' \n\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+                    generated.contains(r"'\u2028\u2029'"));
+    }),
+    compileExpression("r'''\t\t      \t\t  \t\t  \t \t \n\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+                    generated.contains(r"'\r\u2028\u2029'"));
+    }),
+    compileExpression("r'''\\\t\\\t \\   \\  \t\\\t  \t \\\n\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+                    generated.contains(r"'\r\u2028\u2029'"));
+    }),
+    compileExpression("r'''\t\t      \t\t  \t\t  \t \t \\\n\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+                    generated.contains(r"'\r\u2028\u2029'"));
+    }),
+    compileExpression("r'''\\\t\\\t \\   \\  \t\\\t   \\\r\n\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+                    generated.contains(r"'\u2028\u2029'"));
+    }),
+    compileExpression("r'''\\\t\\\t \\   \\  \t\\\t   \\\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+                    generated.contains(r"'\u2028\u2029'"));
+    }),
+    compileExpression("'\u2028\u2029'").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+                    generated.contains(r"'\u2028\u2029'"));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/strip_comment_test.dart b/tests/compiler/dart2js/strip_comment_test.dart
index 3808ad8..04e8fb3 100644
--- a/tests/compiler/dart2js/strip_comment_test.dart
+++ b/tests/compiler/dart2js/strip_comment_test.dart
@@ -5,7 +5,7 @@
 library strip_comment_test;
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
+import 'package:compiler/implementation/mirrors/mirrors_util.dart';
 
 testComment(String strippedText, String commentText) {
   Expect.stringEquals(strippedText, stripComment(commentText));
diff --git a/tests/compiler/dart2js/subtype_test.dart b/tests/compiler/dart2js/subtype_test.dart
index 2cc9827..054df32 100644
--- a/tests/compiler/dart2js/subtype_test.dart
+++ b/tests/compiler/dart2js/subtype_test.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import 'package:compiler/implementation/dart_types.dart';
+import "package:compiler/implementation/elements/elements.dart"
        show Element, ClassElement;
 
 void main() {
diff --git a/tests/compiler/dart2js/switch_empty_default_test.dart b/tests/compiler/dart2js/switch_empty_default_test.dart
index 8e89fad..d0d2f88 100644
--- a/tests/compiler/dart2js/switch_empty_default_test.dart
+++ b/tests/compiler/dart2js/switch_empty_default_test.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test constant folding on numbers.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String SIMPLY_EMPTY = """
@@ -119,10 +120,12 @@
   var defOrCase3 = new RegExp(r"(default:|case 3):");
   var case3 = new RegExp(r"case 3:");
 
-  compileAndDoNotMatch(SIMPLY_EMPTY, 'main', def);
-  compileAndDoNotMatch(TOTAL, 'main', defOrCase3);
-  compileAndDoNotMatch(OPTIMIZED, 'main', def);
-  compileAndMatch(LABEL, 'main', case3);
-  compileAndMatch(DEFLABEL, 'main', def);
-  compileAndMatch(EMPTYDEFLABEL, 'main', def);
+  asyncTest(() => Future.wait([
+    compileAndDoNotMatch(SIMPLY_EMPTY, 'main', def),
+    compileAndDoNotMatch(TOTAL, 'main', defOrCase3),
+    compileAndDoNotMatch(OPTIMIZED, 'main', def),
+    compileAndMatch(LABEL, 'main', case3),
+    compileAndMatch(DEFLABEL, 'main', def),
+    compileAndMatch(EMPTYDEFLABEL, 'main', def),
+  ]));
 }
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index 02868b7..55b31ba 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -2,31 +2,26 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import 'package:compiler/implementation/elements/elements.dart';
+import 'package:compiler/implementation/tree/tree.dart';
+import 'package:compiler/implementation/util/util.dart';
+import 'package:compiler/implementation/source_file.dart';
 import 'mock_compiler.dart';
 import 'parser_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart'
+import 'package:compiler/implementation/elements/modelx.dart'
   show ElementX, CompilationUnitElementX, FunctionElementX;
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';
+import 'package:compiler/implementation/dart2jslib.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/dart_types.dart';
 
 final MessageKind NOT_ASSIGNABLE = MessageKind.NOT_ASSIGNABLE;
 final MessageKind MEMBER_NOT_FOUND = MessageKind.MEMBER_NOT_FOUND;
 
-DartType voidType;
-DartType intType;
-DartType boolType;
-DartType stringType;
-DartType doubleType;
-DartType objectType;
-
 main() {
   List tests = [testSimpleTypes,
                 testReturn,
@@ -60,166 +55,196 @@
                 testTypePromotionHints,
                 testFunctionCall,
                 testCascade];
-  for (Function test in tests) {
-    setup();
-    test();
+  asyncTest(() => Future.forEach(tests, (test) => setup(test)));
+}
+
+testSimpleTypes(MockCompiler compiler) {
+  checkType(DartType type, String code) {
+    Expect.equals(type, analyzeType(compiler, code));
   }
+
+  checkType(compiler.intClass.computeType(compiler), "3");
+  checkType(compiler.boolClass.computeType(compiler), "false");
+  checkType(compiler.boolClass.computeType(compiler), "true");
+  checkType(compiler.stringClass.computeType(compiler), "'hestfisk'");
 }
 
-testSimpleTypes() {
-  Expect.equals(intType, analyzeType("3"));
-  Expect.equals(boolType, analyzeType("false"));
-  Expect.equals(boolType, analyzeType("true"));
-  Expect.equals(stringType, analyzeType("'hestfisk'"));
+Future testReturn(MockCompiler compiler) {
+  Future check(String code, [expectedWarnings]) {
+    return analyzeTopLevel(code, expectedWarnings);
+  }
+
+  return Future.wait([
+    check("void foo() { return 3; }", MessageKind.RETURN_VALUE_IN_VOID),
+    check("int bar() { return 'hest'; }", NOT_ASSIGNABLE),
+    check("void baz() { var x; return x; }"),
+    check(returnWithType("int", "'string'"), NOT_ASSIGNABLE),
+    check(returnWithType("", "'string'")),
+    check(returnWithType("Object", "'string'")),
+    check(returnWithType("String", "'string'")),
+    check(returnWithType("String", null)),
+    check(returnWithType("int", null)),
+    check(returnWithType("void", "")),
+    check(returnWithType("void", 1), MessageKind.RETURN_VALUE_IN_VOID),
+    check(returnWithType("void", null)),
+    check(returnWithType("String", ""), MessageKind.RETURN_NOTHING),
+    // check("String foo() {};"), // Should probably fail.
+  ]);
 }
 
-testReturn() {
-  analyzeTopLevel("void foo() { return 3; }", MessageKind.RETURN_VALUE_IN_VOID);
-  analyzeTopLevel("int bar() { return 'hest'; }",
-                  NOT_ASSIGNABLE);
-  analyzeTopLevel("void baz() { var x; return x; }");
-  analyzeTopLevel(returnWithType("int", "'string'"),
-                  NOT_ASSIGNABLE);
-  analyzeTopLevel(returnWithType("", "'string'"));
-  analyzeTopLevel(returnWithType("Object", "'string'"));
-  analyzeTopLevel(returnWithType("String", "'string'"));
-  analyzeTopLevel(returnWithType("String", null));
-  analyzeTopLevel(returnWithType("int", null));
-  analyzeTopLevel(returnWithType("void", ""));
-  analyzeTopLevel(returnWithType("void", 1), MessageKind.RETURN_VALUE_IN_VOID);
-  analyzeTopLevel(returnWithType("void", null));
-  analyzeTopLevel(returnWithType("String", ""), MessageKind.RETURN_NOTHING);
-  // analyzeTopLevel("String foo() {};"); // Should probably fail.
-}
+testFor(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
 
-testFor() {
-  analyze("for (var x;true;x = x + 1) {}");
-  analyze("for (var x;null;x = x + 1) {}");
-  analyze("for (var x;0;x = x + 1) {}", warnings: NOT_ASSIGNABLE);
-  analyze("for (var x;'';x = x + 1) {}", warnings: NOT_ASSIGNABLE);
+  check("for (var x;true;x = x + 1) {}");
+  check("for (var x;null;x = x + 1) {}");
+  check("for (var x;0;x = x + 1) {}", warnings: NOT_ASSIGNABLE);
+  check("for (var x;'';x = x + 1) {}", warnings: NOT_ASSIGNABLE);
 
-   analyze("for (;true;) {}");
-   analyze("for (;null;) {}");
-   analyze("for (;0;) {}", warnings: NOT_ASSIGNABLE);
-   analyze("for (;'';) {}", warnings: NOT_ASSIGNABLE);
+  check("for (;true;) {}");
+  check("for (;null;) {}");
+  check("for (;0;) {}", warnings: NOT_ASSIGNABLE);
+  check("for (;'';) {}", warnings: NOT_ASSIGNABLE);
 
   // Foreach tests
 //  TODO(karlklose): for each is not yet implemented.
-//  analyze("{ List<String> strings = ['1','2','3']; " +
-//          "for (String s in strings) {} }");
-//  analyze("{ List<int> ints = [1,2,3]; for (String s in ints) {} }",
-//          NOT_ASSIGNABLE);
-//  analyze("for (String s in true) {}", MessageKind.METHOD_NOT_FOUND);
+//  check("{ List<String> strings = ['1','2','3']; " +
+//        "for (String s in strings) {} }");
+//  check("{ List<int> ints = [1,2,3]; for (String s in ints) {} }",
+//        NOT_ASSIGNABLE);
+//  check("for (String s in true) {}", MessageKind.METHOD_NOT_FOUND);
 }
 
-testWhile() {
-  analyze("while (true) {}");
-  analyze("while (null) {}");
-  analyze("while (0) {}", warnings: NOT_ASSIGNABLE);
-  analyze("while ('') {}", warnings: NOT_ASSIGNABLE);
+testWhile(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
 
-  analyze("do {} while (true);");
-  analyze("do {} while (null);");
-  analyze("do {} while (0);", warnings: NOT_ASSIGNABLE);
-  analyze("do {} while ('');", warnings: NOT_ASSIGNABLE);
-  analyze("do { int i = 0.5; } while (true);", warnings: NOT_ASSIGNABLE);
-  analyze("do { int i = 0.5; } while (null);", warnings: NOT_ASSIGNABLE);
+  check("while (true) {}");
+  check("while (null) {}");
+  check("while (0) {}", warnings: NOT_ASSIGNABLE);
+  check("while ('') {}", warnings: NOT_ASSIGNABLE);
+
+  check("do {} while (true);");
+  check("do {} while (null);");
+  check("do {} while (0);", warnings: NOT_ASSIGNABLE);
+  check("do {} while ('');", warnings: NOT_ASSIGNABLE);
+  check("do { int i = 0.5; } while (true);", warnings: NOT_ASSIGNABLE);
+  check("do { int i = 0.5; } while (null);", warnings: NOT_ASSIGNABLE);
 }
 
-testTry() {
-  analyze("try {} finally {}");
-  analyze("try {} catch (e) { int i = e;} finally {}");
-  analyze("try {} catch (e, s) { int i = e; StackTrace j = s; } finally {}");
-  analyze("try {} on String catch (e) {} finally {}");
-  analyze("try { int i = ''; } finally {}", warnings: NOT_ASSIGNABLE);
-  analyze("try {} finally { int i = ''; }", warnings: NOT_ASSIGNABLE);
-  analyze("try {} on String catch (e) { int i = e; } finally {}",
-          warnings: NOT_ASSIGNABLE);
-  analyze("try {} catch (e, s) { int i = e; int j = s; } finally {}",
-          warnings: NOT_ASSIGNABLE);
-  analyze("try {} on String catch (e, s) { int i = e; int j = s; } finally {}",
-          warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+testTry(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
+  check("try {} finally {}");
+  check("try {} catch (e) { int i = e;} finally {}");
+  check("try {} catch (e, s) { int i = e; StackTrace j = s; } finally {}");
+  check("try {} on String catch (e) {} finally {}");
+  check("try { int i = ''; } finally {}", warnings: NOT_ASSIGNABLE);
+  check("try {} finally { int i = ''; }", warnings: NOT_ASSIGNABLE);
+  check("try {} on String catch (e) { int i = e; } finally {}",
+        warnings: NOT_ASSIGNABLE);
+  check("try {} catch (e, s) { int i = e; int j = s; } finally {}",
+        warnings: NOT_ASSIGNABLE);
+  check("try {} on String catch (e, s) { int i = e; int j = s; } finally {}",
+        warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 }
 
 
-testSwitch() {
-  analyze("switch (0) { case 1: break; case 2: break; }");
-  analyze("switch (0) { case 1: int i = ''; break; case 2: break; }",
-          warnings: NOT_ASSIGNABLE);
-  analyze("switch (0) { case '': break; }",
-          warnings: NOT_ASSIGNABLE);
-  analyze("switch ('') { case 1: break; case 2: break; }",
-          warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-  analyze("switch (1.5) { case 1: break; case 2: break; }",
-          warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+testSwitch(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
+  check("switch (0) { case 1: break; case 2: break; }");
+  check("switch (0) { case 1: int i = ''; break; case 2: break; }",
+        warnings: NOT_ASSIGNABLE);
+  check("switch (0) { case '': break; }",
+        warnings: NOT_ASSIGNABLE);
+  check("switch ('') { case 1: break; case 2: break; }",
+        warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+  check("switch (1.5) { case 1: break; case 2: break; }",
+        warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 }
 
-testOperators() {
+testOperators(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
   // TODO(karlklose): add the DartC tests for operators when we can parse
   // classes with operators.
   for (final op in ['+', '-', '*', '/', '%', '~/', '|', '&']) {
-    analyze("{ var i = 1 ${op} 2; }");
-    analyze("{ var i = 1; i ${op}= 2; }");
-    analyze("{ int i; var j = (i = true) ${op} 2; }",
-            warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
-    analyze("{ int i; var j = 1 ${op} (i = true); }",
-            warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check("{ var i = 1 ${op} 2; }");
+    check("{ var i = 1; i ${op}= 2; }");
+    check("{ int i; var j = (i = true) ${op} 2; }",
+          warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
+    check("{ int i; var j = 1 ${op} (i = true); }",
+          warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
   }
   for (final op in ['-', '~']) {
-    analyze("{ var i = ${op}1; }");
-    analyze("{ int i; var j = ${op}(i = true); }",
-            warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
+    check("{ var i = ${op}1; }");
+    check("{ int i; var j = ${op}(i = true); }",
+          warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
   }
   for (final op in ['++', '--']) {
-    analyze("{ int i = 1; int j = i${op}; }");
-    analyze("{ int i = 1; bool j = i${op}; }", warnings: NOT_ASSIGNABLE);
-    analyze("{ bool b = true; bool j = b${op}; }",
-            warnings: MessageKind.OPERATOR_NOT_FOUND);
-    analyze("{ bool b = true; int j = ${op}b; }",
-            warnings: MessageKind.OPERATOR_NOT_FOUND);
+    check("{ int i = 1; int j = i${op}; }");
+    check("{ int i = 1; bool j = i${op}; }", warnings: NOT_ASSIGNABLE);
+    check("{ bool b = true; bool j = b${op}; }",
+          warnings: MessageKind.OPERATOR_NOT_FOUND);
+    check("{ bool b = true; int j = ${op}b; }",
+          warnings: MessageKind.OPERATOR_NOT_FOUND);
   }
   for (final op in ['||', '&&']) {
-    analyze("{ bool b = (true ${op} false); }");
-    analyze("{ int b = true ${op} false; }", warnings: NOT_ASSIGNABLE);
-    analyze("{ bool b = (1 ${op} false); }", warnings: NOT_ASSIGNABLE);
-    analyze("{ bool b = (true ${op} 2); }", warnings: NOT_ASSIGNABLE);
+    check("{ bool b = (true ${op} false); }");
+    check("{ int b = true ${op} false; }", warnings: NOT_ASSIGNABLE);
+    check("{ bool b = (1 ${op} false); }", warnings: NOT_ASSIGNABLE);
+    check("{ bool b = (true ${op} 2); }", warnings: NOT_ASSIGNABLE);
   }
   for (final op in ['>', '<', '<=', '>=']) {
-    analyze("{ bool b = 1 ${op} 2; }");
-    analyze("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
-    analyze("{ int i; bool b = (i = true) ${op} 2; }",
-            warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
-    analyze("{ int i; bool b = 1 ${op} (i = true); }",
-            warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check("{ bool b = 1 ${op} 2; }");
+    check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
+    check("{ int i; bool b = (i = true) ${op} 2; }",
+          warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
+    check("{ int i; bool b = 1 ${op} (i = true); }",
+          warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
   }
   for (final op in ['==', '!=']) {
-    analyze("{ bool b = 1 ${op} 2; }");
-    analyze("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
-    analyze("{ int i; bool b = (i = true) ${op} 2; }",
-            warnings: NOT_ASSIGNABLE);
-    analyze("{ int i; bool b = 1 ${op} (i = true); }",
-            warnings: NOT_ASSIGNABLE);
+    check("{ bool b = 1 ${op} 2; }");
+    check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
+    check("{ int i; bool b = (i = true) ${op} 2; }",
+          warnings: NOT_ASSIGNABLE);
+    check("{ int i; bool b = 1 ${op} (i = true); }",
+          warnings: NOT_ASSIGNABLE);
   }
 }
 
-void testConstructorInvocationArgumentCount() {
+void testConstructorInvocationArgumentCount(MockCompiler compiler) {
   compiler.parseScript("""
      class C1 { C1(x, y); }
      class C2 { C2(int x, int y); }
   """);
+
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
   // calls to untyped constructor C1
-  analyze("new C1(1, 2);");
-  analyze("new C1();", warnings: MessageKind.MISSING_ARGUMENT);
-  analyze("new C1(1);", warnings: MessageKind.MISSING_ARGUMENT);
-  analyze("new C1(1, 2, 3);", warnings: MessageKind.ADDITIONAL_ARGUMENT);
+  check("new C1(1, 2);");
+  check("new C1();", warnings: MessageKind.MISSING_ARGUMENT);
+  check("new C1(1);", warnings: MessageKind.MISSING_ARGUMENT);
+  check("new C1(1, 2, 3);", warnings: MessageKind.ADDITIONAL_ARGUMENT);
   // calls to typed constructor C2
-  analyze("new C2(1, 2);");
-  analyze("new C2();", warnings: MessageKind.MISSING_ARGUMENT);
-  analyze("new C2(1);", warnings: MessageKind.MISSING_ARGUMENT);
-  analyze("new C2(1, 2, 3);", warnings: MessageKind.ADDITIONAL_ARGUMENT);
+  check("new C2(1, 2);");
+  check("new C2();", warnings: MessageKind.MISSING_ARGUMENT);
+  check("new C2(1);", warnings: MessageKind.MISSING_ARGUMENT);
+  check("new C2(1, 2, 3);", warnings: MessageKind.ADDITIONAL_ARGUMENT);
 }
 
-void testConstructorInvocationArgumentTypes() {
+void testConstructorInvocationArgumentTypes(MockCompiler compiler) {
   compiler.parseScript("""
     class C1 { C1(x); }
     class C2 { C2(int x); }
@@ -229,24 +254,31 @@
       C3.named(this.field);
     }
   """);
-  analyze("new C1(42);");
-  analyze("new C1('string');");
-  analyze("new C2(42);");
-  analyze("new C2('string');",
-          warnings: NOT_ASSIGNABLE);
-  analyze("new C3(42);");
-  analyze("new C3('string');",
-          warnings: NOT_ASSIGNABLE);
-  analyze("new C3.named(42);");
-  analyze("new C3.named('string');",
-          warnings: NOT_ASSIGNABLE);
+
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
+  check("new C1(42);");
+  check("new C1('string');");
+  check("new C2(42);");
+  check("new C2('string');",
+        warnings: NOT_ASSIGNABLE);
+  check("new C3(42);");
+  check("new C3('string');",
+        warnings: NOT_ASSIGNABLE);
+  check("new C3.named(42);");
+  check("new C3.named('string');",
+        warnings: NOT_ASSIGNABLE);
 }
 
-void testMethodInvocationArgumentCount() {
+void testMethodInvocationArgumentCount(MockCompiler compiler) {
   compiler.parseScript(CLASS_WITH_METHODS);
 
   check(String text, [expectedWarnings]) {
-    analyze("{ ClassWithMethods c; $text }", warnings: expectedWarnings);
+    analyze(compiler,
+            "{ ClassWithMethods c; $text }",
+            warnings: expectedWarnings);
   }
 
   check("c.untypedNoArgumentMethod(1);", MessageKind.ADDITIONAL_ARGUMENT);
@@ -323,11 +355,12 @@
          MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
 }
 
-void testMethodInvocations() {
+void testMethodInvocations(MockCompiler compiler) {
   compiler.parseScript(CLASS_WITH_METHODS);
 
   check(String text, [expectedWarnings]){
-    analyze("""{
+    analyze(compiler,
+            """{
                ClassWithMethods c;
                SubClass d;
                var e;
@@ -464,208 +497,214 @@
   check("foo(a: localMethod(1));", NOT_ASSIGNABLE);
 }
 
-testMethodInvocationsInClass() {
-  LibraryElement library = mockLibrary(compiler, CLASS_WITH_METHODS);
-  compiler.parseScript(CLASS_WITH_METHODS, library);
-  ClassElement ClassWithMethods = library.find("ClassWithMethods");
-  ClassWithMethods.ensureResolved(compiler);
-  Element c = ClassWithMethods.lookupLocalMember('method');
-  assert(c != null);
-  ClassElement SubClass = library.find("SubClass");
-  SubClass.ensureResolved(compiler);
-  Element d = SubClass.lookupLocalMember('method');
-  assert(d != null);
+Future testMethodInvocationsInClass(MockCompiler compiler) {
+  MockCompiler compiler = new MockCompiler.internal();
+  return compiler.init(CLASS_WITH_METHODS).then((_) {
+    LibraryElement library = compiler.mainApp;
+    compiler.parseScript(CLASS_WITH_METHODS, library);
+    ClassElement ClassWithMethods = library.find("ClassWithMethods");
+    ClassWithMethods.ensureResolved(compiler);
+    Element c = ClassWithMethods.lookupLocalMember('method');
+    assert(c != null);
+    ClassElement SubClass = library.find("SubClass");
+    SubClass.ensureResolved(compiler);
+    Element d = SubClass.lookupLocalMember('method');
+    assert(d != null);
 
-  check(Element element, String text, [expectedWarnings]){
-    analyzeIn(element,
-              """{
-                   var e;
-                   int i;
-                   int j;
-                   int localMethod(String str) { return 0; }
-                   $text
-                 }""",
-              expectedWarnings);
-  }
+    check(Element element, String text, [expectedWarnings]){
+      analyzeIn(compiler,
+                element,
+                """{
+                     var e;
+                     int i;
+                     int j;
+                     int localMethod(String str) { return 0; }
+                     $text
+                   }""",
+                expectedWarnings);
+    }
 
 
-  check(c, "int k = untypedNoArgumentMethod();");
-  check(c, "ClassWithMethods x = untypedNoArgumentMethod();");
-  check(d, "ClassWithMethods x = untypedNoArgumentMethod();");
-  check(d, "int k = intMethod();");
-  check(c, "int k = untypedOneArgumentMethod(this);");
-  check(c, "ClassWithMethods x = untypedOneArgumentMethod(1);");
-  check(c, "int k = untypedOneArgumentMethod('string');");
-  check(c, "int k = untypedOneArgumentMethod(i);");
-  check(d, "int k = untypedOneArgumentMethod(this);");
-  check(d, "ClassWithMethods x = untypedOneArgumentMethod(1);");
-  check(d, "int k = untypedOneArgumentMethod('string');");
-  check(d, "int k = untypedOneArgumentMethod(i);");
+    check(c, "int k = untypedNoArgumentMethod();");
+    check(c, "ClassWithMethods x = untypedNoArgumentMethod();");
+    check(d, "ClassWithMethods x = untypedNoArgumentMethod();");
+    check(d, "int k = intMethod();");
+    check(c, "int k = untypedOneArgumentMethod(this);");
+    check(c, "ClassWithMethods x = untypedOneArgumentMethod(1);");
+    check(c, "int k = untypedOneArgumentMethod('string');");
+    check(c, "int k = untypedOneArgumentMethod(i);");
+    check(d, "int k = untypedOneArgumentMethod(this);");
+    check(d, "ClassWithMethods x = untypedOneArgumentMethod(1);");
+    check(d, "int k = untypedOneArgumentMethod('string');");
+    check(d, "int k = untypedOneArgumentMethod(i);");
 
-  check(c, "int k = untypedTwoArgumentMethod(1, 'string');");
-  check(c, "int k = untypedTwoArgumentMethod(i, j);");
-  check(c, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
-  check(d, "int k = untypedTwoArgumentMethod(1, 'string');");
-  check(d, "int k = untypedTwoArgumentMethod(i, j);");
-  check(d, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
+    check(c, "int k = untypedTwoArgumentMethod(1, 'string');");
+    check(c, "int k = untypedTwoArgumentMethod(i, j);");
+    check(c, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
+    check(d, "int k = untypedTwoArgumentMethod(1, 'string');");
+    check(d, "int k = untypedTwoArgumentMethod(i, j);");
+    check(d, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
 
-  check(c, "int k = intNoArgumentMethod();");
-  check(c, "ClassWithMethods x = intNoArgumentMethod();",
-        NOT_ASSIGNABLE);
+    check(c, "int k = intNoArgumentMethod();");
+    check(c, "ClassWithMethods x = intNoArgumentMethod();",
+          NOT_ASSIGNABLE);
 
-  check(c, "int k = intOneArgumentMethod('');", NOT_ASSIGNABLE);
-  check(c, "ClassWithMethods x = intOneArgumentMethod(1);",
-        NOT_ASSIGNABLE);
-  check(c, "int k = intOneArgumentMethod('string');",
-        NOT_ASSIGNABLE);
-  check(c, "int k = intOneArgumentMethod(i);");
+    check(c, "int k = intOneArgumentMethod('');", NOT_ASSIGNABLE);
+    check(c, "ClassWithMethods x = intOneArgumentMethod(1);",
+          NOT_ASSIGNABLE);
+    check(c, "int k = intOneArgumentMethod('string');",
+          NOT_ASSIGNABLE);
+    check(c, "int k = intOneArgumentMethod(i);");
 
-  check(c, "int k = intTwoArgumentMethod(1, 'string');",
-        NOT_ASSIGNABLE);
-  check(c, "int k = intTwoArgumentMethod(i, j);");
-  check(c, "ClassWithMethods x = intTwoArgumentMethod(i, j);",
-        NOT_ASSIGNABLE);
+    check(c, "int k = intTwoArgumentMethod(1, 'string');",
+          NOT_ASSIGNABLE);
+    check(c, "int k = intTwoArgumentMethod(i, j);");
+    check(c, "ClassWithMethods x = intTwoArgumentMethod(i, j);",
+          NOT_ASSIGNABLE);
 
-  check(c, "functionField();");
-  check(d, "functionField();");
-  check(c, "functionField(1);");
-  check(d, "functionField('string');");
+    check(c, "functionField();");
+    check(d, "functionField();");
+    check(c, "functionField(1);");
+    check(d, "functionField('string');");
 
-  check(c, "intField();", MessageKind.NOT_CALLABLE);
-  check(d, "intField();", MessageKind.NOT_CALLABLE);
+    check(c, "intField();", MessageKind.NOT_CALLABLE);
+    check(d, "intField();", MessageKind.NOT_CALLABLE);
 
-  check(c, "untypedField();");
-  check(d, "untypedField();");
-  check(c, "untypedField(1);");
-  check(d, "untypedField('string');");
+    check(c, "untypedField();");
+    check(d, "untypedField();");
+    check(c, "untypedField(1);");
+    check(d, "untypedField('string');");
 
 
-  check(c, "intOneArgumentOneOptionalMethod('');",
-        NOT_ASSIGNABLE);
-  check(c, "intOneArgumentOneOptionalMethod('', '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check(c, "intOneArgumentOneOptionalMethod('');",
+          NOT_ASSIGNABLE);
+    check(c, "intOneArgumentOneOptionalMethod('', '');",
+          [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 
-  check(c, "intTwoOptionalMethod('');", NOT_ASSIGNABLE);
-  check(c, "intTwoOptionalMethod('', '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check(c, "intTwoOptionalMethod('');", NOT_ASSIGNABLE);
+    check(c, "intTwoOptionalMethod('', '');",
+          [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 
-  check(c, "intOneArgumentOneNamedMethod('');",
-        NOT_ASSIGNABLE);
-  check(c, "intOneArgumentOneNamedMethod('', b: '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check(c, "intOneArgumentOneNamedMethod('');",
+          NOT_ASSIGNABLE);
+    check(c, "intOneArgumentOneNamedMethod('', b: '');",
+          [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 
-  check(c, "intTwoNamedMethod(a: '');", NOT_ASSIGNABLE);
-  check(c, "intTwoNamedMethod(b: '');", NOT_ASSIGNABLE);
-  check(c, "intTwoNamedMethod(a: '', b: '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-  check(c, "intTwoNamedMethod(b: '', a: '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check(c, "intTwoNamedMethod(a: '');", NOT_ASSIGNABLE);
+    check(c, "intTwoNamedMethod(b: '');", NOT_ASSIGNABLE);
+    check(c, "intTwoNamedMethod(a: '', b: '');",
+          [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check(c, "intTwoNamedMethod(b: '', a: '');",
+          [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 
-  // Invocation of dynamic variable.
-  check(c, "e();");
-  check(c, "e(1);");
-  check(c, "e('string');");
+    // Invocation of dynamic variable.
+    check(c, "e();");
+    check(c, "e(1);");
+    check(c, "e('string');");
 
-  // Invocation on local method.
-  check(c, "localMethod();", MessageKind.MISSING_ARGUMENT);
-  check(c, "localMethod(1);", NOT_ASSIGNABLE);
-  check(c, "localMethod('string');");
-  check(c, "int k = localMethod('string');");
-  check(c, "String k = localMethod('string');", NOT_ASSIGNABLE);
+    // Invocation on local method.
+    check(c, "localMethod();", MessageKind.MISSING_ARGUMENT);
+    check(c, "localMethod(1);", NOT_ASSIGNABLE);
+    check(c, "localMethod('string');");
+    check(c, "int k = localMethod('string');");
+    check(c, "String k = localMethod('string');", NOT_ASSIGNABLE);
 
-  // Invocation on parenthesized expressions.
-  check(c, "(e)();");
-  check(c, "(e)(1);");
-  check(c, "(e)('string');");
-  check(c, "(foo)();", MEMBER_NOT_FOUND);
-  check(c, "(foo)(1);", MEMBER_NOT_FOUND);
-  check(c, "(foo)('string');", MEMBER_NOT_FOUND);
+    // Invocation on parenthesized expressions.
+    check(c, "(e)();");
+    check(c, "(e)(1);");
+    check(c, "(e)('string');");
+    check(c, "(foo)();", MEMBER_NOT_FOUND);
+    check(c, "(foo)(1);", MEMBER_NOT_FOUND);
+    check(c, "(foo)('string');", MEMBER_NOT_FOUND);
 
-  // Invocations on function expressions.
-  check(c, "(foo){}();", MessageKind.MISSING_ARGUMENT);
-  check(c, "(foo){}(1);");
-  check(c, "(foo){}('string');");
-  check(c, "(int foo){}('string');", NOT_ASSIGNABLE);
-  check(c, "(String foo){}('string');");
-  check(c, "int k = int bar(String foo){ return 0; }('string');");
-  check(c, "int k = String bar(String foo){ return foo; }('string');",
-        NOT_ASSIGNABLE);
+    // Invocations on function expressions.
+    check(c, "(foo){}();", MessageKind.MISSING_ARGUMENT);
+    check(c, "(foo){}(1);");
+    check(c, "(foo){}('string');");
+    check(c, "(int foo){}('string');", NOT_ASSIGNABLE);
+    check(c, "(String foo){}('string');");
+    check(c, "int k = int bar(String foo){ return 0; }('string');");
+    check(c, "int k = String bar(String foo){ return foo; }('string');",
+          NOT_ASSIGNABLE);
 
-  // Static invocations.
-  check(c, "staticMethod();",
-        MessageKind.MISSING_ARGUMENT);
-  check(c, "staticMethod(1);",
-        NOT_ASSIGNABLE);
-  check(c, "staticMethod('string');");
-  check(c, "int k = staticMethod('string');");
-  check(c, "String k = staticMethod('string');",
-        NOT_ASSIGNABLE);
-  check(d, "staticMethod();", MessageKind.METHOD_NOT_FOUND);
-  check(d, "staticMethod(1);", MessageKind.METHOD_NOT_FOUND);
-  check(d, "staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
-  check(d, "int k = staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
-  check(d, "String k = staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
+    // Static invocations.
+    check(c, "staticMethod();",
+          MessageKind.MISSING_ARGUMENT);
+    check(c, "staticMethod(1);",
+          NOT_ASSIGNABLE);
+    check(c, "staticMethod('string');");
+    check(c, "int k = staticMethod('string');");
+    check(c, "String k = staticMethod('string');",
+          NOT_ASSIGNABLE);
+    check(d, "staticMethod();", MessageKind.METHOD_NOT_FOUND);
+    check(d, "staticMethod(1);", MessageKind.METHOD_NOT_FOUND);
+    check(d, "staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
+    check(d, "int k = staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
+    check(d, "String k = staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
 
-  // Invocation on dynamic variable.
-  check(c, "e.foo();");
-  check(c, "e.foo(1);");
-  check(c, "e.foo('string');");
+    // Invocation on dynamic variable.
+    check(c, "e.foo();");
+    check(c, "e.foo(1);");
+    check(c, "e.foo('string');");
 
-  // Invocation on unresolved variable.
-  check(c, "foo();", MessageKind.METHOD_NOT_FOUND);
-  check(c, "foo(1);", MessageKind.METHOD_NOT_FOUND);
-  check(c, "foo('string');", MessageKind.METHOD_NOT_FOUND);
-  check(c, "foo(a: 'string');", MessageKind.METHOD_NOT_FOUND);
-  check(c, "foo(a: localMethod(1));",
-      [MessageKind.METHOD_NOT_FOUND, NOT_ASSIGNABLE]);
+    // Invocation on unresolved variable.
+    check(c, "foo();", MessageKind.METHOD_NOT_FOUND);
+    check(c, "foo(1);", MessageKind.METHOD_NOT_FOUND);
+    check(c, "foo('string');", MessageKind.METHOD_NOT_FOUND);
+    check(c, "foo(a: 'string');", MessageKind.METHOD_NOT_FOUND);
+    check(c, "foo(a: localMethod(1));",
+          [MessageKind.METHOD_NOT_FOUND, NOT_ASSIGNABLE]);
+  });
 }
 
 /** Tests analysis of returns (not required by the specification). */
-void testControlFlow() {
-  analyzeTopLevel("void foo() { if (true) { return; } }");
-  analyzeTopLevel("foo() { if (true) { return; } }");
-  analyzeTopLevel("int foo() { if (true) { return 1; } }",
-                  MessageKind.MAYBE_MISSING_RETURN);
-  final bar =
-      """void bar() {
-        if (true) {
-          if (true) { return; } else { return; }
-        } else { return; }
-      }""";
-  analyzeTopLevel(bar);
-  analyzeTopLevel("void baz() { return; int i = 1; }",
-                  MessageKind.UNREACHABLE_CODE);
-  final qux =
-      """void qux() {
-        if (true) {
-          return;
-        } else if (true) {
-          if (true) {
-            return;
-          }
-          throw 'hest';
-        }
-        throw 'fisk';
-      }""";
-  analyzeTopLevel(qux);
-  analyzeTopLevel("int hest() {}", MessageKind.MISSING_RETURN);
-  final fisk = """int fisk() {
-                    if (true) {
-                      if (true) { return 1; } else {}
-                    } else { return 1; }
-                  }""";
-  analyzeTopLevel(fisk, MessageKind.MAYBE_MISSING_RETURN);
-  analyzeTopLevel("int foo() { while(true) { return 1; } }");
-  analyzeTopLevel("int foo() { while(true) { return 1; } return 2; }",
-                  MessageKind.UNREACHABLE_CODE);
+Future testControlFlow(MockCompiler compiler) {
+  Future check(String code, [expectedWarnings]) {
+    return analyzeTopLevel(code, expectedWarnings);
+  }
+
+  return Future.wait([
+    check("void foo() { if (true) { return; } }"),
+    check("foo() { if (true) { return; } }"),
+    check("int foo() { if (true) { return 1; } }",
+          MessageKind.MAYBE_MISSING_RETURN),
+    check("""void bar() {
+               if (true) {
+                 if (true) { return; } else { return; }
+               } else { return; }
+             }"""),
+    check("void baz() { return; int i = 1; }",
+          MessageKind.UNREACHABLE_CODE),
+    check("""void qux() {
+               if (true) {
+                 return;
+               } else if (true) {
+                 if (true) {
+                   return;
+                 }
+                 throw 'hest';
+               }
+               throw 'fisk';
+             }"""),
+    check("int hest() {}", MessageKind.MISSING_RETURN),
+    check("""int fisk() {
+               if (true) {
+                 if (true) { return 1; } else {}
+               } else { return 1; }
+             }""", MessageKind.MAYBE_MISSING_RETURN),
+    check("int foo() { while(true) { return 1; } }"),
+    check("int foo() { while(true) { return 1; } return 2; }",
+          MessageKind.UNREACHABLE_CODE),
+  ]);
 }
 
 
-void testFunctionCall() {
+void testFunctionCall(MockCompiler compiler) {
   compiler.parseScript(CLASS_WITH_METHODS);
 
   check(String text, [expectedWarnings]){
-    analyze("""{
+    analyze(compiler,
+            """{
                ClassWithMethods x;
                int localMethod(String str) { return 0; }
                String2Int string2int;
@@ -716,10 +755,10 @@
   check("int k = subFunction.call(0);");
 }
 
-testNewExpression() {
+testNewExpression(MockCompiler compiler) {
   compiler.parseScript("class A {}");
-  analyze("A a = new A();");
-  analyze("int i = new A();", warnings: NOT_ASSIGNABLE);
+  analyze(compiler, "A a = new A();");
+  analyze(compiler, "int i = new A();", warnings: NOT_ASSIGNABLE);
 
 // TODO(karlklose): constructors are not yet implemented.
 //  compiler.parseScript(
@@ -752,51 +791,58 @@
 //  analyze("Bar<String> x = new Bar<String>.make('');");
 }
 
-testConditionalExpression() {
-  analyze("int i = true ? 2 : 1;");
-  analyze("int i = true ? 'hest' : 1;");
-  analyze("int i = true ? 'hest' : 'fisk';", warnings: NOT_ASSIGNABLE);
-  analyze("String s = true ? 'hest' : 'fisk';");
+testConditionalExpression(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
 
-  analyze("true ? 1 : 2;");
-  analyze("null ? 1 : 2;");
-  analyze("0 ? 1 : 2;", warnings: NOT_ASSIGNABLE);
-  analyze("'' ? 1 : 2;", warnings: NOT_ASSIGNABLE);
-  analyze("{ int i; true ? i = 2.7 : 2; }",
+  check("int i = true ? 2 : 1;");
+  check("int i = true ? 'hest' : 1;");
+  check("int i = true ? 'hest' : 'fisk';", warnings: NOT_ASSIGNABLE);
+  check("String s = true ? 'hest' : 'fisk';");
+
+  check("true ? 1 : 2;");
+  check("null ? 1 : 2;");
+  check("0 ? 1 : 2;", warnings: NOT_ASSIGNABLE);
+  check("'' ? 1 : 2;", warnings: NOT_ASSIGNABLE);
+  check("{ int i; true ? i = 2.7 : 2; }",
           warnings: NOT_ASSIGNABLE);
-  analyze("{ int i; true ? 2 : i = 2.7; }",
+  check("{ int i; true ? 2 : i = 2.7; }",
           warnings: NOT_ASSIGNABLE);
-  analyze("{ int i; i = true ? 2.7 : 2; }");
+  check("{ int i; i = true ? 2.7 : 2; }");
 }
 
-testIfStatement() {
-  analyze("if (true) {}");
-  analyze("if (null) {}");
-  analyze("if (0) {}",
+testIfStatement(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
+  check("if (true) {}");
+  check("if (null) {}");
+  check("if (0) {}",
           warnings: NOT_ASSIGNABLE);
-  analyze("if ('') {}",
+  check("if ('') {}",
           warnings: NOT_ASSIGNABLE);
-  analyze("{ int i = 27; if (true) { i = 2.7; } else {} }",
+  check("{ int i = 27; if (true) { i = 2.7; } else {} }",
           warnings: NOT_ASSIGNABLE);
-  analyze("{ int i = 27; if (true) {} else { i = 2.7; } }",
+  check("{ int i = 27; if (true) {} else { i = 2.7; } }",
           warnings: NOT_ASSIGNABLE);
 }
 
-testThis() {
+testThis(MockCompiler compiler) {
   String script = """class Foo {
                        void method() {}
                      }""";
-  LibraryElement library = mockLibrary(compiler, script);
-  compiler.parseScript(script, library);
-  ClassElement foo = library.find("Foo");
+  compiler.parseScript(script);
+  ClassElement foo = compiler.mainApp.find("Foo");
   foo.ensureResolved(compiler);
   Element method = foo.lookupLocalMember('method');
-  analyzeIn(method, "{ int i = this; }", NOT_ASSIGNABLE);
-  analyzeIn(method, "{ Object o = this; }");
-  analyzeIn(method, "{ Foo f = this; }");
+  analyzeIn(compiler, method, "{ int i = this; }", NOT_ASSIGNABLE);
+  analyzeIn(compiler, method, "{ Object o = this; }");
+  analyzeIn(compiler, method, "{ Foo f = this; }");
 }
 
-testSuper() {
+testSuper(MockCompiler compiler) {
   String script = r'''
     class A {
       String field = "42";
@@ -807,14 +853,13 @@
       void method() {}
     }
     ''';
-  LibraryElement library = mockLibrary(compiler, script);
-  compiler.parseScript(script, library);
-  ClassElement B = library.find("B");
+  compiler.parseScript(script);
+  ClassElement B = compiler.mainApp.find("B");
   B.ensureResolved(compiler);
   Element method = B.lookupLocalMember('method');
-  analyzeIn(method, "{ int i = super.field; }", NOT_ASSIGNABLE);
-  analyzeIn(method, "{ Object o = super.field; }");
-  analyzeIn(method, "{ String s = super.field; }");
+  analyzeIn(compiler, method, "{ int i = super.field; }", NOT_ASSIGNABLE);
+  analyzeIn(compiler, method, "{ Object o = super.field; }");
+  analyzeIn(compiler, method, "{ String s = super.field; }");
 }
 
 const String CLASSES_WITH_OPERATORS = '''
@@ -870,7 +915,7 @@
 }
 ''';
 
-testOperatorsAssignability() {
+testOperatorsAssignability(MockCompiler compiler) {
   compiler.parseScript(CLASSES_WITH_OPERATORS);
 
   // Tests against Operators.
@@ -883,7 +928,7 @@
       """;
 
   check(String text, [expectedWarnings]) {
-    analyze('$header $text }', warnings: expectedWarnings);
+    analyze(compiler, '$header $text }', warnings: expectedWarnings);
   }
 
   // Positive tests on operators.
@@ -1092,40 +1137,45 @@
       [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 }
 
-void testFieldInitializers() {
-  analyzeTopLevel("""int i = 0;""");
-  analyzeTopLevel("""int i = '';""", NOT_ASSIGNABLE);
+Future testFieldInitializers(MockCompiler compiler) {
+  Future check(String code, [expectedWarnings]) {
+    return analyzeTopLevel(code, expectedWarnings);
+  }
 
-  analyzeTopLevel("""class Class {
-                       int i = 0;
-                     }""");
-  analyzeTopLevel("""class Class {
-                       int i = '';
-                     }""", NOT_ASSIGNABLE);
+  return Future.wait([
+    check("""int i = 0;"""),
+    check("""int i = '';""", NOT_ASSIGNABLE),
+
+    check("""class Class {
+               int i = 0;
+             }"""),
+    check("""class Class {
+               int i = '';
+             }""", NOT_ASSIGNABLE),
+  ]);
 }
 
-void testTypeVariableExpressions() {
+void testTypeVariableExpressions(MockCompiler compiler) {
   String script = """class Foo<T> {
                        void method() {}
                      }""";
-  LibraryElement library = mockLibrary(compiler, script);
-  compiler.parseScript(script, library);
-  ClassElement foo = library.find("Foo");
+  compiler.parseScript(script);
+  ClassElement foo = compiler.mainApp.find("Foo");
   foo.ensureResolved(compiler);
   Element method = foo.lookupLocalMember('method');
 
-  analyzeIn(method, "{ Type type = T; }");
-  analyzeIn(method, "{ T type = T; }", NOT_ASSIGNABLE);
-  analyzeIn(method, "{ int type = T; }", NOT_ASSIGNABLE);
+  analyzeIn(compiler, method, "{ Type type = T; }");
+  analyzeIn(compiler, method, "{ T type = T; }", NOT_ASSIGNABLE);
+  analyzeIn(compiler, method, "{ int type = T; }", NOT_ASSIGNABLE);
 
-  analyzeIn(method, "{ String typeName = T.toString(); }");
-  analyzeIn(method, "{ T.foo; }", MEMBER_NOT_FOUND);
-  analyzeIn(method, "{ T.foo = 0; }", MessageKind.SETTER_NOT_FOUND);
-  analyzeIn(method, "{ T.foo(); }", MessageKind.METHOD_NOT_FOUND);
-  analyzeIn(method, "{ T + 1; }", MessageKind.OPERATOR_NOT_FOUND);
+  analyzeIn(compiler, method, "{ String typeName = T.toString(); }");
+  analyzeIn(compiler, method, "{ T.foo; }", MEMBER_NOT_FOUND);
+  analyzeIn(compiler, method, "{ T.foo = 0; }", MessageKind.SETTER_NOT_FOUND);
+  analyzeIn(compiler, method, "{ T.foo(); }", MessageKind.METHOD_NOT_FOUND);
+  analyzeIn(compiler, method, "{ T + 1; }", MessageKind.OPERATOR_NOT_FOUND);
 }
 
-void testTypeVariableLookup1() {
+void testTypeVariableLookup1(MockCompiler compiler) {
   String script = """
 class Foo {
   int field;
@@ -1141,14 +1191,13 @@
 }
 """;
 
-  LibraryElement library = mockLibrary(compiler, script);
-  compiler.parseScript(script, library);
-  ClassElement classTest = library.find("Test");
+  compiler.parseScript(script);
+  ClassElement classTest = compiler.mainApp.find("Test");
   classTest.ensureResolved(compiler);
   FunctionElement methodTest = classTest.lookupLocalMember("test");
 
   test(String expression, [message]) {
-    analyzeIn(methodTest, "{ $expression; }", message);
+    analyzeIn(compiler, methodTest, "{ $expression; }", message);
   }
 
   test('s.field');
@@ -1168,7 +1217,7 @@
   test('String v = s.getter', NOT_ASSIGNABLE);
 }
 
-void testTypeVariableLookup2() {
+void testTypeVariableLookup2(MockCompiler compiler) {
   String script = """
 class Foo {
   int field;
@@ -1182,14 +1231,13 @@
   test() {}
 }""";
 
-  LibraryElement library = mockLibrary(compiler, script);
-  compiler.parseScript(script, library);
-  ClassElement classTest = library.find("Test");
+  compiler.parseScript(script);
+  ClassElement classTest = compiler.mainApp.find("Test");
   classTest.ensureResolved(compiler);
   FunctionElement methodTest = classTest.lookupLocalMember("test");
 
   test(String expression, [message]) {
-    analyzeIn(methodTest, "{ $expression; }", message);
+    analyzeIn(compiler, methodTest, "{ $expression; }", message);
   }
 
   test('s.field');
@@ -1198,21 +1246,20 @@
   test('s.getter');
 }
 
-void testTypeVariableLookup3() {
+void testTypeVariableLookup3(MockCompiler compiler) {
   String script = """
 class Test<S extends T, T extends S> {
   S s;
   test() {}
 }""";
 
-  LibraryElement library = mockLibrary(compiler, script);
-  compiler.parseScript(script, library);
-  ClassElement classTest = library.find("Test");
+  compiler.parseScript(script);
+  ClassElement classTest = compiler.mainApp.find("Test");
   classTest.ensureResolved(compiler);
   FunctionElement methodTest = classTest.lookupLocalMember("test");
 
   test(String expression, [message]) {
-    analyzeIn(methodTest, "{ $expression; }", message);
+    analyzeIn(compiler, methodTest, "{ $expression; }", message);
   }
 
   test('s.toString');
@@ -1222,22 +1269,34 @@
   test('s.getter', MEMBER_NOT_FOUND);
 }
 
-void testFunctionTypeLookup() {
-  analyze('(int f(int)) => f.toString;');
-  analyze('(int f(int)) => f.toString();');
-  analyze('(int f(int)) => f.foo;', warnings: MEMBER_NOT_FOUND);
-  analyze('(int f(int)) => f.foo();', warnings: MessageKind.METHOD_NOT_FOUND);
+void testFunctionTypeLookup(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
+  check('(int f(int)) => f.toString;');
+  check('(int f(int)) => f.toString();');
+  check('(int f(int)) => f.foo;', warnings: MEMBER_NOT_FOUND);
+  check('(int f(int)) => f.foo();', warnings: MessageKind.METHOD_NOT_FOUND);
 }
 
-void testTypedefLookup() {
+void testTypedefLookup(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
   compiler.parseScript("typedef int F(int);");
-  analyze('(F f) => f.toString;');
-  analyze('(F f) => f.toString();');
-  analyze('(F f) => f.foo;', warnings: MEMBER_NOT_FOUND);
-  analyze('(F f) => f.foo();', warnings: MessageKind.METHOD_NOT_FOUND);
+  check('(F f) => f.toString;');
+  check('(F f) => f.toString();');
+  check('(F f) => f.foo;', warnings: MEMBER_NOT_FOUND);
+  check('(F f) => f.foo();', warnings: MessageKind.METHOD_NOT_FOUND);
 }
 
-void testTypeLiteral() {
+void testTypeLiteral(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
   final String source = r"""class Class {
                               static var field = null;
                               static method() {}
@@ -1245,215 +1304,217 @@
   compiler.parseScript(source);
 
   // Check direct access.
-  analyze('Type m() => int;');
-  analyze('int m() => int;', warnings: NOT_ASSIGNABLE);
+  check('Type m() => int;');
+  check('int m() => int;', warnings: NOT_ASSIGNABLE);
 
   // Check access in assignment.
-  analyze('m(Type val) => val = Class;');
-  analyze('m(int val) => val = Class;', warnings: NOT_ASSIGNABLE);
+  check('m(Type val) => val = Class;');
+  check('m(int val) => val = Class;', warnings: NOT_ASSIGNABLE);
 
   // Check access as argument.
-  analyze('m(Type val) => m(int);');
-  analyze('m(int val) => m(int);', warnings: NOT_ASSIGNABLE);
+  check('m(Type val) => m(int);');
+  check('m(int val) => m(int);', warnings: NOT_ASSIGNABLE);
 
   // Check access as argument in member access.
-  analyze('m(Type val) => m(int).foo;');
-  analyze('m(int val) => m(int).foo;', warnings: NOT_ASSIGNABLE);
+  check('m(Type val) => m(int).foo;');
+  check('m(int val) => m(int).foo;', warnings: NOT_ASSIGNABLE);
 
   // Check static property access.
-  analyze('m() => Class.field;');
-  analyze('m() => (Class).field;', warnings: MEMBER_NOT_FOUND);
+  check('m() => Class.field;');
+  check('m() => (Class).field;', warnings: MEMBER_NOT_FOUND);
 
   // Check static method access.
-  analyze('m() => Class.method();');
-  analyze('m() => (Class).method();', warnings: MessageKind.METHOD_NOT_FOUND);
+  check('m() => Class.method();');
+  check('m() => (Class).method();', warnings: MessageKind.METHOD_NOT_FOUND);
 }
 
-void testInitializers() {
-  check(String text, [expectedWarnings]) {
-    analyzeTopLevel(text, expectedWarnings);
+Future testInitializers(MockCompiler compiler) {
+  Future check(String text, [expectedWarnings]) {
+    return analyzeTopLevel(text, expectedWarnings);
   }
 
-  // Check initializers.
-  check(r'''class Class {
-              var a;
-              Class(this.a);
-            }
-            ''');
-  check(r'''class Class {
-              int a;
-              Class(this.a);
-            }
-            ''');
-  check(r'''class Class {
-              var a;
-              Class(int this.a);
-            }
-            ''');
-  check(r'''class Class {
-              String a;
-              Class(int this.a);
-            }
-            ''', NOT_ASSIGNABLE);
-  check(r'''class Class {
-              var a;
-              Class(int a) : this.a = a;
-            }
-            ''');
-  check(r'''class Class {
-              String a;
-              Class(int a) : this.a = a;
-            }
-            ''', NOT_ASSIGNABLE);
+  return Future.wait([
+    // Check initializers.
+    check(r'''class Class {
+                var a;
+                Class(this.a);
+              }
+              '''),
+    check(r'''class Class {
+                int a;
+                Class(this.a);
+              }
+              '''),
+    check(r'''class Class {
+                var a;
+                Class(int this.a);
+              }
+              '''),
+    check(r'''class Class {
+                String a;
+                Class(int this.a);
+              }
+              ''', NOT_ASSIGNABLE),
+    check(r'''class Class {
+                var a;
+                Class(int a) : this.a = a;
+              }
+              '''),
+    check(r'''class Class {
+                String a;
+                Class(int a) : this.a = a;
+              }
+              ''', NOT_ASSIGNABLE),
 
-  // Check this-calls.
-  check(r'''class Class {
-              var a;
-              Class(this.a);
-              Class.named(int a) : this(a);
-            }
-            ''');
-  check(r'''class Class {
-              String a;
-              Class(this.a);
-              Class.named(int a) : this(a);
-            }
-            ''', NOT_ASSIGNABLE);
-  check(r'''class Class {
-              String a;
-              Class(var a) : this.a = a;
-              Class.named(int a) : this(a);
-            }
-            ''');
-  check(r'''class Class {
-              String a;
-              Class(String a) : this.a = a;
-              Class.named(int a) : this(a);
-            }
-            ''', NOT_ASSIGNABLE);
+    // Check this-calls.
+    check(r'''class Class {
+                var a;
+                Class(this.a);
+                Class.named(int a) : this(a);
+              }
+              '''),
+    check(r'''class Class {
+                String a;
+                Class(this.a);
+                Class.named(int a) : this(a);
+              }
+              ''', NOT_ASSIGNABLE),
+    check(r'''class Class {
+                String a;
+                Class(var a) : this.a = a;
+                Class.named(int a) : this(a);
+              }
+              '''),
+    check(r'''class Class {
+                String a;
+                Class(String a) : this.a = a;
+                Class.named(int a) : this(a);
+              }
+              ''', NOT_ASSIGNABLE),
 
-  // Check super-calls.
-  check(r'''class Super {
-              var a;
-              Super(this.a);
-            }
-            class Class extends Super {
-              Class.named(int a) : super(a);
-            }
-            ''');
-  check(r'''class Super {
-              String a;
-              Super(this.a);
-            }
-            class Class extends Super {
-              Class.named(int a) : super(a);
-            }
-            ''', NOT_ASSIGNABLE);
-  check(r'''class Super {
-              String a;
-              Super(var a) : this.a = a;
-            }
-            class Class extends Super {
-              Class.named(int a) : super(a);
-            }
-            ''');
-  check(r'''class Super {
-              String a;
-              Super(String a) : this.a = a;
-            }
-            class Class extends Super {
-              Class.named(int a) : super(a);
-            }
-            ''', NOT_ASSIGNABLE);
+    // Check super-calls.
+    check(r'''class Super {
+                var a;
+                Super(this.a);
+              }
+              class Class extends Super {
+                Class.named(int a) : super(a);
+              }
+              '''),
+    check(r'''class Super {
+                String a;
+                Super(this.a);
+              }
+              class Class extends Super {
+                Class.named(int a) : super(a);
+              }
+              ''', NOT_ASSIGNABLE),
+    check(r'''class Super {
+                String a;
+                Super(var a) : this.a = a;
+              }
+              class Class extends Super {
+                Class.named(int a) : super(a);
+              }
+              '''),
+    check(r'''class Super {
+                String a;
+                Super(String a) : this.a = a;
+              }
+              class Class extends Super {
+                Class.named(int a) : super(a);
+              }
+              ''', NOT_ASSIGNABLE),
 
-  // Check super-calls involving generics.
-  check(r'''class Super<T> {
-              var a;
-              Super(this.a);
-            }
-            class Class extends Super<String> {
-              Class.named(int a) : super(a);
-            }
-            ''');
-  check(r'''class Super<T> {
-              T a;
-              Super(this.a);
-            }
-            class Class extends Super<String> {
-              Class.named(int a) : super(a);
-            }
-            ''', NOT_ASSIGNABLE);
-  check(r'''class Super<T> {
-              T a;
-              Super(var a) : this.a = a;
-            }
-            class Class extends Super<String> {
-              Class.named(int a) : super(a);
-            }
-            ''');
-  check(r'''class Super<T> {
-              T a;
-              Super(T a) : this.a = a;
-            }
-            class Class extends Super<String> {
-              Class.named(int a) : super(a);
-            }
-            ''', NOT_ASSIGNABLE);
+    // Check super-calls involving generics.
+    check(r'''class Super<T> {
+                var a;
+                Super(this.a);
+              }
+              class Class extends Super<String> {
+                Class.named(int a) : super(a);
+              }
+              '''),
+    check(r'''class Super<T> {
+                T a;
+                Super(this.a);
+              }
+              class Class extends Super<String> {
+                Class.named(int a) : super(a);
+              }
+              ''', NOT_ASSIGNABLE),
+    check(r'''class Super<T> {
+                T a;
+                Super(var a) : this.a = a;
+              }
+              class Class extends Super<String> {
+                Class.named(int a) : super(a);
+              }
+              '''),
+    check(r'''class Super<T> {
+                T a;
+                Super(T a) : this.a = a;
+              }
+              class Class extends Super<String> {
+                Class.named(int a) : super(a);
+              }
+              ''', NOT_ASSIGNABLE),
 
-  // Check instance creations.
-  check(r'''class Class {
-              var a;
-              Class(this.a);
-            }
-            method(int a) => new Class(a);
-            ''');
-  check(r'''class Class {
-              String a;
-              Class(this.a);
-            }
-            method(int a) => new Class(a);
-            ''', NOT_ASSIGNABLE);
-  check(r'''class Class {
-              String a;
-              Class(var a) : this.a = a;
-            }
-            method(int a) => new Class(a);
-            ''');
-  check(r'''class Class {
-              String a;
-              Class(String a) : this.a = a;
-            }
-            method(int a) => new Class(a);
-            ''', NOT_ASSIGNABLE);
+    // Check instance creations.
+    check(r'''class Class {
+                var a;
+                Class(this.a);
+              }
+              method(int a) => new Class(a);
+              '''),
+    check(r'''class Class {
+                String a;
+                Class(this.a);
+              }
+              method(int a) => new Class(a);
+              ''', NOT_ASSIGNABLE),
+    check(r'''class Class {
+                String a;
+                Class(var a) : this.a = a;
+              }
+              method(int a) => new Class(a);
+              '''),
+    check(r'''class Class {
+                String a;
+                Class(String a) : this.a = a;
+              }
+              method(int a) => new Class(a);
+              ''', NOT_ASSIGNABLE),
 
-  // Check instance creations involving generics.
-  check(r'''class Class<T> {
-              var a;
-              Class(this.a);
-            }
-            method(int a) => new Class<String>(a);
-            ''');
-  check(r'''class Class<T> {
-              T a;
-              Class(this.a);
-            }
-            method(int a) => new Class<String>(a);
-            ''', NOT_ASSIGNABLE);
-  check(r'''class Class<T> {
-              T a;
-              Class(var a) : this.a = a;
-            }
-            method(int a) => new Class<String>(a);
-            ''');
-  check(r'''class Class<T> {
-              T a;
-              Class(String a) : this.a = a;
-            }
-            method(int a) => new Class<String>(a);
-            ''', NOT_ASSIGNABLE);
+    // Check instance creations involving generics.
+    check(r'''class Class<T> {
+                var a;
+                Class(this.a);
+              }
+              method(int a) => new Class<String>(a);
+              '''),
+    check(r'''class Class<T> {
+                T a;
+                Class(this.a);
+              }
+              method(int a) => new Class<String>(a);
+              ''', NOT_ASSIGNABLE),
+    check(r'''class Class<T> {
+                T a;
+                Class(var a) : this.a = a;
+              }
+              method(int a) => new Class<String>(a);
+              '''),
+    check(r'''class Class<T> {
+                T a;
+                Class(String a) : this.a = a;
+              }
+              method(int a) => new Class<String>(a);
+              ''', NOT_ASSIGNABLE),
+  ]);
 }
 
-void testGetterSetterInvocation() {
+void testGetterSetterInvocation(MockCompiler compiler) {
   compiler.parseScript(r'''int get variable => 0;
                            void set variable(String s) {}
 
@@ -1485,7 +1546,7 @@
                            ''');
 
   check(String text, [expectedWarnings]) {
-    analyze('{ $text }', warnings: expectedWarnings);
+    analyze(compiler, '{ $text }', warnings: expectedWarnings);
   }
 
   check("variable = '';");
@@ -1548,7 +1609,7 @@
   check("sc.setterField = 0;");
 }
 
-testTypePromotionHints() {
+testTypePromotionHints(MockCompiler compiler) {
   compiler.parseScript(r'''class A {
                              var a = "a";
                            }
@@ -1573,7 +1634,11 @@
                            ''');
 
   check(String text, {warnings, hints, infos}) {
-    analyze('{ $text }', warnings: warnings, hints: hints, infos: infos);
+    analyze(compiler,
+            '{ $text }',
+            warnings: warnings,
+            hints: hints,
+            infos: infos);
   }
 
   check(r'''
@@ -1717,7 +1782,7 @@
       infos: []);
 }
 
-void testCascade() {
+void testCascade(MockCompiler compiler) {
   compiler.parseScript(r'''typedef A AFunc();
                            typedef Function FuncFunc();
                            class A {
@@ -1740,7 +1805,11 @@
                            ''');
 
   check(String text, {warnings, hints, infos}) {
-    analyze('{ $text }', warnings: warnings, hints: hints, infos: infos);
+    analyze(compiler,
+            '{ $text }',
+            warnings: warnings,
+            hints: hints,
+            infos: infos);
   }
 
   check('A a = new A()..a;');
@@ -1921,9 +1990,6 @@
 }
 class SubFunction implements Function {}''';
 
-Types types;
-MockCompiler compiler;
-
 String returnWithType(String type, expression) {
   return "$type foo() { return $expression; }";
 }
@@ -1965,7 +2031,7 @@
 }
 ''';
 
-void setup() {
+Future setup(test(MockCompiler compiler)) {
   RegExp classNum = new RegExp(r'abstract class num {}');
   Expect.isTrue(DEFAULT_CORELIB.contains(classNum));
   RegExp classInt = new RegExp(r'abstract class int extends num { }');
@@ -1978,20 +2044,14 @@
       .replaceAll(classInt, INT_SOURCE)
       .replaceAll(classString, STRING_SOURCE);
 
-  compiler = new MockCompiler(coreSource: CORE_SOURCE);
-  types = compiler.types;
-  voidType = const VoidType();
-  intType = compiler.intClass.computeType(compiler);
-  doubleType = compiler.doubleClass.computeType(compiler);
-  boolType = compiler.boolClass.computeType(compiler);
-  stringType = compiler.stringClass.computeType(compiler);
-  objectType = compiler.objectClass.computeType(compiler);
+  MockCompiler compiler = new MockCompiler.internal(coreSource: CORE_SOURCE);
+  return compiler.init().then((_) => test(compiler));
 }
 
-DartType analyzeType(String text) {
+DartType analyzeType(MockCompiler compiler, String text) {
   var node = parseExpression(text);
-  TypeCheckerVisitor visitor =
-      new TypeCheckerVisitor(compiler, new TreeElementMapping(null), types);
+  TypeCheckerVisitor visitor = new TypeCheckerVisitor(
+      compiler, new TreeElementMapping(null), compiler.types);
   return visitor.analyze(node);
 }
 
@@ -1999,43 +2059,47 @@
   if (expectedWarnings == null) expectedWarnings = [];
   if (expectedWarnings is !List) expectedWarnings = [expectedWarnings];
 
+  MockCompiler compiler = new MockCompiler.internal();
   compiler.diagnosticHandler = createHandler(compiler, text);
 
-  LibraryElement library = mockLibrary(compiler, text);
+  return compiler.init().then((_) {
+    LibraryElement library = compiler.mainApp;
 
-  Link<Element> topLevelElements = parseUnit(text, compiler, library).reverse();
+    Link<Element> topLevelElements =
+        parseUnit(text, compiler, library).reverse();
 
-  Element element = null;
-  Node node;
-  TreeElements mapping;
-  // Resolve all declarations and members.
-  for (Link<Element> elements = topLevelElements;
-       !elements.isEmpty;
-       elements = elements.tail) {
-    element = elements.head;
-    if (element.isClass) {
-      ClassElement classElement = element;
-      classElement.ensureResolved(compiler);
-      classElement.forEachLocalMember((Element e) {
-        if (!e.isSynthesized) {
-          element = e;
-          node = element.parseNode(compiler);
-          mapping = compiler.resolver.resolve(element);
-        }
-      });
-    } else {
-      node = element.parseNode(compiler);
-      mapping = compiler.resolver.resolve(element);
+    Element element = null;
+    Node node;
+    TreeElements mapping;
+    // Resolve all declarations and members.
+    for (Link<Element> elements = topLevelElements;
+         !elements.isEmpty;
+         elements = elements.tail) {
+      element = elements.head;
+      if (element.isClass) {
+        ClassElement classElement = element;
+        classElement.ensureResolved(compiler);
+        classElement.forEachLocalMember((Element e) {
+          if (!e.isSynthesized) {
+            element = e;
+            node = element.parseNode(compiler);
+            mapping = compiler.resolver.resolve(element);
+          }
+        });
+      } else {
+        node = element.parseNode(compiler);
+        mapping = compiler.resolver.resolve(element);
+      }
     }
-  }
-  // Type check last class declaration or member.
-  TypeCheckerVisitor checker =
-      new TypeCheckerVisitor(compiler, mapping, types);
-  compiler.clearMessages();
-  checker.analyze(node);
-  compareWarningKinds(text, expectedWarnings, compiler.warnings);
+    // Type check last class declaration or member.
+    TypeCheckerVisitor checker =
+        new TypeCheckerVisitor(compiler, mapping, compiler.types);
+    compiler.clearMessages();
+    checker.analyze(node);
+    compareWarningKinds(text, expectedWarnings, compiler.warnings);
 
-  compiler.diagnosticHandler = null;
+    compiler.diagnosticHandler = null;
+  });
 }
 
 /**
@@ -2044,7 +2108,9 @@
  * a list of [MessageKind]s. If [hints] and [infos] are [:null:] the
  * corresponding message kinds are ignored.
  */
-analyze(String text, {errors, warnings, List hints, List infos}) {
+analyze(MockCompiler compiler,
+        String text,
+        {errors, warnings, List hints, List infos}) {
   if (warnings == null) warnings = [];
   if (warnings is !List) warnings = [warnings];
   if (errors == null) errors = [];
@@ -2061,8 +2127,8 @@
     new CompilationUnitElementX(new Script(null, null, null), compiler.mainApp);
   Element function = new MockElement(compilationUnit);
   TreeElements elements = compiler.resolveNodeStatement(node, function);
-  TypeCheckerVisitor checker = new TypeCheckerVisitor(compiler, elements,
-                                                                types);
+  TypeCheckerVisitor checker = new TypeCheckerVisitor(
+      compiler, elements, compiler.types);
   compiler.clearMessages();
   checker.analyze(node);
   compareWarningKinds(text, warnings, compiler.warnings);
@@ -2072,7 +2138,7 @@
   compiler.diagnosticHandler = null;
 }
 
-void generateOutput(String text) {
+void generateOutput(MockCompiler compiler, String text) {
   for (WarningMessage message in compiler.warnings) {
     Node node = message.node;
     var beginToken = node.getBeginToken();
@@ -2085,7 +2151,10 @@
   }
 }
 
-analyzeIn(Element element, String text, [expectedWarnings]) {
+analyzeIn(MockCompiler compiler,
+          Element element,
+          String text,
+          [expectedWarnings]) {
   if (expectedWarnings == null) expectedWarnings = [];
   if (expectedWarnings is !List) expectedWarnings = [expectedWarnings];
 
@@ -2095,10 +2164,10 @@
   parser.parseStatement(tokens);
   Node node = listener.popNode();
   TreeElements elements = compiler.resolveNodeStatement(node, element);
-  TypeCheckerVisitor checker = new TypeCheckerVisitor(compiler, elements,
-                                                                types);
+  TypeCheckerVisitor checker = new TypeCheckerVisitor(
+      compiler, elements, compiler.types);
   compiler.clearMessages();
   checker.analyze(node);
-  generateOutput(text);
+  generateOutput(compiler, text);
   compareWarningKinds(text, expectedWarnings, compiler.warnings);
 }
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index b063bf5..dfd0bbd 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_test.dart
@@ -2,11 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 import "compiler_helper.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/types/types.dart";
+import "package:compiler/implementation/types/types.dart";
 import "type_mask_test_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
+import 'package:compiler/implementation/js_backend/js_backend.dart';
 
 TypeMask nullType;
 TypeMask objectType;
@@ -676,59 +677,60 @@
 }
 
 void main() {
-  MockCompiler compiler = new MockCompiler();
-  JavaScriptBackend backend = compiler.backend;
-  compiler.interceptorsLibrary.forEachLocalMember((element) {
-    if (element.isClass) {
-      compiler.enqueuer.resolution.registerInstantiatedClass(
-          element, compiler.globalDependencies);
-    }
-  });
-  compiler.enqueuer.resolution.registerInstantiatedClass(
-      compiler.mapClass, compiler.globalDependencies);
-  compiler.world.populate();
+  asyncTest(() => MockCompiler.create((MockCompiler compiler) {
+    JavaScriptBackend backend = compiler.backend;
+    compiler.interceptorsLibrary.forEachLocalMember((element) {
+      if (element.isClass) {
+        compiler.enqueuer.resolution.registerInstantiatedClass(
+            element, compiler.globalDependencies);
+      }
+    });
+    compiler.enqueuer.resolution.registerInstantiatedClass(
+        compiler.mapClass, compiler.globalDependencies);
+    compiler.world.populate();
 
-  // Grab hold of a supertype for String so we can produce potential
-  // string types.
-  patternClass = compiler.coreLibrary.find('Pattern');
+    // Grab hold of a supertype for String so we can produce potential
+    // string types.
+    patternClass = compiler.coreLibrary.find('Pattern');
 
-  nonPrimitive1 = new TypeMask.nonNullSubtype(
-      compiler.mapClass);
-  nonPrimitive2 = new TypeMask.nonNullSubtype(
-      compiler.functionClass);
-  potentialArray = new TypeMask.subtype(
-      compiler.listClass);
-  potentialString = new TypeMask.subtype(patternClass);
-  jsInterceptor = new TypeMask.nonNullSubclass(backend.jsInterceptorClass);
-  jsArrayOrNull = new TypeMask.subclass(backend.jsArrayClass);
-  jsReadableArray = new TypeMask.nonNullSubclass(backend.jsArrayClass);
-  jsMutableArrayOrNull = new TypeMask.subclass(backend.jsMutableArrayClass);
-  jsMutableArray = new TypeMask.nonNullSubclass(backend.jsMutableArrayClass);
-  jsFixedArrayOrNull = new TypeMask.exact(backend.jsFixedArrayClass);
-  jsFixedArray = new TypeMask.nonNullExact(backend.jsFixedArrayClass);
-  jsExtendableArrayOrNull = new TypeMask.exact(backend.jsExtendableArrayClass);
-  jsExtendableArray = new TypeMask.nonNullExact(backend.jsExtendableArrayClass);
-  jsIndexableOrNull = new TypeMask.subtype(backend.jsIndexableClass);
-  jsIndexable = new TypeMask.nonNullSubtype(backend.jsIndexableClass);
-  jsInterceptorOrNull = new TypeMask.subclass(backend.jsInterceptorClass);
-  jsStringOrNull = new TypeMask.exact(backend.jsStringClass);
-  jsString = new TypeMask.nonNullExact(backend.jsStringClass);
-  jsBoolean = new TypeMask.nonNullExact(backend.jsBoolClass);
-  jsNumber = new TypeMask.nonNullSubclass(backend.jsNumberClass);
-  jsInteger = new TypeMask.nonNullExact(backend.jsIntClass);
-  jsDouble = new TypeMask.nonNullExact(backend.jsDoubleClass);
-  jsBooleanOrNull = new TypeMask.exact(backend.jsBoolClass);
-  jsNumberOrNull = new TypeMask.subclass(backend.jsNumberClass);
-  jsIntegerOrNull = new TypeMask.exact(backend.jsIntClass);
-  jsDoubleOrNull = new TypeMask.exact(backend.jsDoubleClass);
-  nullType = const TypeMask.empty();
-  objectType = new TypeMask.nonNullSubclass(
-      compiler.objectClass);
-  emptyType = const TypeMask.nonNullEmpty();
-  dynamicType = new TypeMask.subclass(
-      compiler.objectClass);
+    nonPrimitive1 = new TypeMask.nonNullSubtype(
+        compiler.mapClass);
+    nonPrimitive2 = new TypeMask.nonNullSubtype(
+        compiler.functionClass);
+    potentialArray = new TypeMask.subtype(
+        compiler.listClass);
+    potentialString = new TypeMask.subtype(patternClass);
+    jsInterceptor = new TypeMask.nonNullSubclass(backend.jsInterceptorClass);
+    jsArrayOrNull = new TypeMask.subclass(backend.jsArrayClass);
+    jsReadableArray = new TypeMask.nonNullSubclass(backend.jsArrayClass);
+    jsMutableArrayOrNull = new TypeMask.subclass(backend.jsMutableArrayClass);
+    jsMutableArray = new TypeMask.nonNullSubclass(backend.jsMutableArrayClass);
+    jsFixedArrayOrNull = new TypeMask.exact(backend.jsFixedArrayClass);
+    jsFixedArray = new TypeMask.nonNullExact(backend.jsFixedArrayClass);
+    jsExtendableArrayOrNull = new TypeMask.exact(backend.jsExtendableArrayClass);
+    jsExtendableArray = new TypeMask.nonNullExact(backend.jsExtendableArrayClass);
+    jsIndexableOrNull = new TypeMask.subtype(backend.jsIndexableClass);
+    jsIndexable = new TypeMask.nonNullSubtype(backend.jsIndexableClass);
+    jsInterceptorOrNull = new TypeMask.subclass(backend.jsInterceptorClass);
+    jsStringOrNull = new TypeMask.exact(backend.jsStringClass);
+    jsString = new TypeMask.nonNullExact(backend.jsStringClass);
+    jsBoolean = new TypeMask.nonNullExact(backend.jsBoolClass);
+    jsNumber = new TypeMask.nonNullSubclass(backend.jsNumberClass);
+    jsInteger = new TypeMask.nonNullExact(backend.jsIntClass);
+    jsDouble = new TypeMask.nonNullExact(backend.jsDoubleClass);
+    jsBooleanOrNull = new TypeMask.exact(backend.jsBoolClass);
+    jsNumberOrNull = new TypeMask.subclass(backend.jsNumberClass);
+    jsIntegerOrNull = new TypeMask.exact(backend.jsIntClass);
+    jsDoubleOrNull = new TypeMask.exact(backend.jsDoubleClass);
+    nullType = const TypeMask.empty();
+    objectType = new TypeMask.nonNullSubclass(
+        compiler.objectClass);
+    emptyType = const TypeMask.nonNullEmpty();
+    dynamicType = new TypeMask.subclass(
+        compiler.objectClass);
 
-  testUnion(compiler);
-  testIntersection(compiler);
-  testRegressions(compiler);
+    testUnion(compiler);
+    testIntersection(compiler);
+    testRegressions(compiler);
+  }));
 }
diff --git a/tests/compiler/dart2js/type_equals_test.dart b/tests/compiler/dart2js/type_equals_test.dart
index 11a6004..4831015 100644
--- a/tests/compiler/dart2js/type_equals_test.dart
+++ b/tests/compiler/dart2js/type_equals_test.dart
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/dart_types.dart';
 import "compiler_helper.dart";
 import "parser_helper.dart";
 
diff --git a/tests/compiler/dart2js/type_guard_unuser_test.dart b/tests/compiler/dart2js/type_guard_unuser_test.dart
index 7df302b..a6703b9 100644
--- a/tests/compiler/dart2js/type_guard_unuser_test.dart
+++ b/tests/compiler/dart2js/type_guard_unuser_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -41,28 +43,31 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  RegExp regexp = new RegExp(getIntTypeCheck(anyIdentifier));
-  Iterator<Match> matches = regexp.allMatches(generated).iterator;
-  checkNumberOfMatches(matches, 0);
-  Expect.isTrue(
-      generated.contains(
-          new RegExp(r'return a === true \? [$A-Z]+\.foo\(2\) : b;')));
-
-  generated = compile(TEST_TWO, entry: 'foo');
-  regexp = new RegExp("foo\\(1\\)");
-  matches = regexp.allMatches(generated).iterator;
-  checkNumberOfMatches(matches, 1);
-
-  generated = compile(TEST_THREE, entry: 'foo');
-  regexp = new RegExp(getNumberTypeCheck('a'));
-  Expect.isTrue(regexp.hasMatch(generated));
-  regexp = new RegExp(getNumberTypeCheck('b'));
-  Expect.isTrue(regexp.hasMatch(generated));
-
-  generated = compile(TEST_THREE_WITH_BAILOUT, entry: 'foo');
-  regexp = new RegExp(getNumberTypeCheck('a'));
-  Expect.isTrue(regexp.hasMatch(generated));
-  regexp = new RegExp(getNumberTypeCheck('b'));
-  Expect.isTrue(regexp.hasMatch(generated));
+  asyncTest(() => Future.wait([
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp(getIntTypeCheck(anyIdentifier));
+      Iterator<Match> matches = regexp.allMatches(generated).iterator;
+      checkNumberOfMatches(matches, 0);
+      Expect.isTrue(
+          generated.contains(
+              new RegExp(r'return a === true \? [$A-Z]+\.foo\(2\) : b;')));
+    }),
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp("foo\\(1\\)");
+      Iterator<Match> matches = regexp.allMatches(generated).iterator;
+      checkNumberOfMatches(matches, 1);
+    }),
+    compile(TEST_THREE, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp(getNumberTypeCheck('a'));
+      Expect.isTrue(regexp.hasMatch(generated));
+      regexp = new RegExp(getNumberTypeCheck('b'));
+      Expect.isTrue(regexp.hasMatch(generated));
+    }),
+    compile(TEST_THREE_WITH_BAILOUT, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp(getNumberTypeCheck('a'));
+      Expect.isTrue(regexp.hasMatch(generated));
+      regexp = new RegExp(getNumberTypeCheck('b'));
+      Expect.isTrue(regexp.hasMatch(generated));
+    })
+  ]));
 }
diff --git a/tests/compiler/dart2js/type_inference2_test.dart b/tests/compiler/dart2js/type_inference2_test.dart
index a1613ac..5e5f224 100644
--- a/tests/compiler/dart2js/type_inference2_test.dart
+++ b/tests/compiler/dart2js/type_inference2_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -13,5 +14,5 @@
 """;
 
 main() {
-  compileAndMatchFuzzy(TEST_ONE, 'sum', r"\+\+x");
+  asyncTest(() => compileAndMatchFuzzy(TEST_ONE, 'sum', r"\+\+x"));
 }
diff --git a/tests/compiler/dart2js/type_inference3_test.dart b/tests/compiler/dart2js/type_inference3_test.dart
index 17aa7be..baefe2c 100644
--- a/tests/compiler/dart2js/type_inference3_test.dart
+++ b/tests/compiler/dart2js/type_inference3_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -14,7 +15,8 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'sum');
-  RegExp regexp = new RegExp(getNumberTypeCheck('(param1|b)'));
-  Expect.isTrue(regexp.hasMatch(generated));
+  asyncTest(() => compile(TEST_ONE, entry: 'sum', check: (String generated) {
+    RegExp regexp = new RegExp(getNumberTypeCheck('(param1|b)'));
+    Expect.isTrue(regexp.hasMatch(generated));
+  }));
 }
diff --git a/tests/compiler/dart2js/type_inference4_test.dart b/tests/compiler/dart2js/type_inference4_test.dart
index ace9eee..e8c4180 100644
--- a/tests/compiler/dart2js/type_inference4_test.dart
+++ b/tests/compiler/dart2js/type_inference4_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -16,13 +17,14 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
 
-  // Test for absence of an illegal argument exception. This means that the
-  // arguments are known to be integers.
-  Expect.isFalse(generated.contains('iae'));
-  // Also make sure that we are not just in bailout mode without speculative
-  // types by grepping for the integer-bailout check on argument j.
-  RegExp regexp = new RegExp(getIntTypeCheck('[aji]'));
-  Expect.isTrue(regexp.hasMatch(generated));
+    // Test for absence of an illegal argument exception. This means that the
+    // arguments are known to be integers.
+    Expect.isFalse(generated.contains('iae'));
+    // Also make sure that we are not just in bailout mode without speculative
+    // types by grepping for the integer-bailout check on argument j.
+    RegExp regexp = new RegExp(getIntTypeCheck('[aji]'));
+    Expect.isTrue(regexp.hasMatch(generated));
+  }));
 }
diff --git a/tests/compiler/dart2js/type_inference5_test.dart b/tests/compiler/dart2js/type_inference5_test.dart
index ba46456..4bf5caa 100644
--- a/tests/compiler/dart2js/type_inference5_test.dart
+++ b/tests/compiler/dart2js/type_inference5_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -15,16 +16,18 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
 
-  // Test for absence of an illegal argument exception. This means that the
-  // arguments are known to be integers.
-  Expect.isFalse(generated.contains('iae'));
-  // Also make sure that we are not just in bailout mode without speculative
-  // types by grepping for the integer-bailout check on argument j.
-  var argname =
-      new RegExp(r'function(?: [a-z]+)?\(([a-zA-Z0-9_]+)\)').firstMatch(generated)[1];
-  print(argname);
-  RegExp regexp = new RegExp(getIntTypeCheck("(i|$argname)"));
-  Expect.isTrue(regexp.hasMatch(generated));
+    // Test for absence of an illegal argument exception. This means that the
+    // arguments are known to be integers.
+    Expect.isFalse(generated.contains('iae'));
+    // Also make sure that we are not just in bailout mode without speculative
+    // types by grepping for the integer-bailout check on argument j.
+    var argname =
+        new RegExp(r'function(?: [a-z]+)?\(([a-zA-Z0-9_]+)\)')
+            .firstMatch(generated)[1];
+    print(argname);
+    RegExp regexp = new RegExp(getIntTypeCheck("(i|$argname)"));
+    Expect.isTrue(regexp.hasMatch(generated));
+  }));
 }
diff --git a/tests/compiler/dart2js/type_mask_test.dart b/tests/compiler/dart2js/type_mask_test.dart
index b0a190b..c1cc2fa 100644
--- a/tests/compiler/dart2js/type_mask_test.dart
+++ b/tests/compiler/dart2js/type_mask_test.dart
@@ -6,7 +6,7 @@
 import "package:async_helper/async_helper.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/types/types.dart";
+import "package:compiler/implementation/types/types.dart";
 
 const String CODE = """
 class A {}
diff --git a/tests/compiler/dart2js/type_mask_test_helper.dart b/tests/compiler/dart2js/type_mask_test_helper.dart
index 88f234d..129ec7a 100644
--- a/tests/compiler/dart2js/type_mask_test_helper.dart
+++ b/tests/compiler/dart2js/type_mask_test_helper.dart
@@ -4,8 +4,8 @@
 
 library type_mask_test_helper;
 
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/types/types.dart';
+import 'package:compiler/implementation/dart2jslib.dart'
     show Compiler;
 
 TypeMask simplify(TypeMask mask, Compiler compiler) {
diff --git a/tests/compiler/dart2js/type_order_test.dart b/tests/compiler/dart2js/type_order_test.dart
index eb6a7c5..9eacf78 100644
--- a/tests/compiler/dart2js/type_order_test.dart
+++ b/tests/compiler/dart2js/type_order_test.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';

 import 'package:async_helper/async_helper.dart';

 import 'type_test_helper.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';

-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"

+import 'package:compiler/implementation/dart_types.dart';

+import "package:compiler/implementation/elements/elements.dart"

        show Element, ClassElement, TypedefElement;

 

 void main() {

diff --git a/tests/compiler/dart2js/type_representation_test.dart b/tests/compiler/dart2js/type_representation_test.dart
index 482c03a..51df26a 100644
--- a/tests/compiler/dart2js/type_representation_test.dart
+++ b/tests/compiler/dart2js/type_representation_test.dart
@@ -7,11 +7,11 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/js/js.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
+import 'package:compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/js/js.dart';
+import 'package:compiler/implementation/elements/elements.dart'
        show Element, ClassElement;
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart'
+import 'package:compiler/implementation/js_backend/js_backend.dart'
        show JavaScriptBackend, TypeRepresentationGenerator;
 
 void main() {
diff --git a/tests/compiler/dart2js/type_substitution_test.dart b/tests/compiler/dart2js/type_substitution_test.dart
index 42aa623..2559a44 100644
--- a/tests/compiler/dart2js/type_substitution_test.dart
+++ b/tests/compiler/dart2js/type_substitution_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/dart_types.dart';
 import "compiler_helper.dart";
 import "parser_helper.dart";
 import "type_test_helper.dart";
diff --git a/tests/compiler/dart2js/type_test_helper.dart b/tests/compiler/dart2js/type_test_helper.dart
index dd7c322..a790262 100644
--- a/tests/compiler/dart2js/type_test_helper.dart
+++ b/tests/compiler/dart2js/type_test_helper.dart
@@ -8,14 +8,14 @@
 import 'package:expect/expect.dart';
 import 'compiler_helper.dart' as mock;
 import 'memory_compiler.dart' as memory;
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/dart2jslib.dart'
     show Compiler;
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
+import 'package:compiler/implementation/elements/elements.dart'
     show Element,
          TypeDeclarationElement,
          ClassElement;
-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart'
+import 'package:compiler/implementation/util/util.dart'
     show Link, LinkBuilder;
 
 GenericType instantiate(TypeDeclarationElement element,
diff --git a/tests/compiler/dart2js/type_variable_occurrence_test.dart b/tests/compiler/dart2js/type_variable_occurrence_test.dart
index 5c71028..7e69860 100644
--- a/tests/compiler/dart2js/type_variable_occurrence_test.dart
+++ b/tests/compiler/dart2js/type_variable_occurrence_test.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import 'package:compiler/implementation/dart_types.dart';
+import "package:compiler/implementation/elements/elements.dart"
        show Element, ClassElement;
 
 void main() {
diff --git a/tests/compiler/dart2js/union_type_test.dart b/tests/compiler/dart2js/union_type_test.dart
index 984880f..966d4c5 100644
--- a/tests/compiler/dart2js/union_type_test.dart
+++ b/tests/compiler/dart2js/union_type_test.dart
@@ -3,22 +3,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
 import "compiler_helper.dart";
 import "parser_helper.dart";
 
-import "../../../sdk/lib/_internal/compiler/implementation/types/types.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/dart_types.dart";
+import "package:compiler/implementation/types/types.dart";
+import "package:compiler/implementation/dart_types.dart";
 
 main() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.intClass.ensureResolved(compiler);
-  compiler.stringClass.ensureResolved(compiler);
+  asyncTest(() => MockCompiler.create((MockCompiler compiler) {
+    compiler.intClass.ensureResolved(compiler);
+    compiler.stringClass.ensureResolved(compiler);
 
-  FlatTypeMask mask1 =
-      new FlatTypeMask.exact(compiler.intClass);
-  FlatTypeMask mask2 =
-      new FlatTypeMask.exact(compiler.stringClass);
-  UnionTypeMask union1 = mask1.nonNullable().union(mask2, compiler);
-  UnionTypeMask union2 = mask2.nonNullable().union(mask1, compiler);
-  Expect.equals(union1, union2);
+    FlatTypeMask mask1 =
+        new FlatTypeMask.exact(compiler.intClass);
+    FlatTypeMask mask2 =
+        new FlatTypeMask.exact(compiler.stringClass);
+    UnionTypeMask union1 = mask1.nonNullable().union(mask2, compiler);
+    UnionTypeMask union2 = mask2.nonNullable().union(mask1, compiler);
+    Expect.equals(union1, union2);
+  }));
 }
diff --git a/tests/compiler/dart2js/unneeded_part_js_test.dart b/tests/compiler/dart2js/unneeded_part_js_test.dart
index abbd674..dadcb60 100644
--- a/tests/compiler/dart2js/unneeded_part_js_test.dart
+++ b/tests/compiler/dart2js/unneeded_part_js_test.dart
@@ -8,10 +8,10 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        show NullSink;
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show Diagnostic;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/unparser2_test.dart b/tests/compiler/dart2js/unparser2_test.dart
index ced1c31..bbf3e3d 100644
--- a/tests/compiler/dart2js/unparser2_test.dart
+++ b/tests/compiler/dart2js/unparser2_test.dart
@@ -3,18 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
+import "package:compiler/implementation/scanner/scannerlib.dart";
+import "package:compiler/implementation/tree/tree.dart";
 
-import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart"
+import "package:compiler/implementation/dart2jslib.dart"
     show DiagnosticListener,
          Script;
 
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import "package:compiler/implementation/elements/elements.dart"
     show CompilationUnitElement,
          LibraryElement;
 
-import "../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart"
+import "package:compiler/implementation/elements/modelx.dart"
     show CompilationUnitElementX,
          LibraryElementX;
 
diff --git a/tests/compiler/dart2js/unparser_test.dart b/tests/compiler/dart2js/unparser_test.dart
index 21fe65d..a14f676 100644
--- a/tests/compiler/dart2js/unparser_test.dart
+++ b/tests/compiler/dart2js/unparser_test.dart
@@ -5,7 +5,7 @@
 import "package:expect/expect.dart";
 import 'parser_helper.dart';
 import 'mock_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import 'package:compiler/implementation/tree/tree.dart';
 
 testUnparse(String statement) {
   Node node = parseStatement(statement);
diff --git a/tests/compiler/dart2js/uri_extras_test.dart b/tests/compiler/dart2js/uri_extras_test.dart
index 477b84c..fcbc49c 100644
--- a/tests/compiler/dart2js/uri_extras_test.dart
+++ b/tests/compiler/dart2js/uri_extras_test.dart
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 
-import '../../../sdk/lib/_internal/compiler/implementation/util/uri_extras.dart';
+import 'package:compiler/implementation/util/uri_extras.dart';
 
 
 void testRelativize() {
diff --git a/tests/compiler/dart2js/value_range2_test.dart b/tests/compiler/dart2js/value_range2_test.dart
index df274a8..5bebf99 100644
--- a/tests/compiler/dart2js/value_range2_test.dart
+++ b/tests/compiler/dart2js/value_range2_test.dart
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart";
+import "package:compiler/implementation/ssa/ssa.dart";
+import "package:compiler/implementation/dart2jslib.dart";
+import "package:compiler/implementation/js_backend/js_backend.dart";
 
 ValueRangeInfo info = new ValueRangeInfo(const JavaScriptConstantSystem());
 
diff --git a/tests/compiler/dart2js/value_range_test.dart b/tests/compiler/dart2js/value_range_test.dart
index 5ea7ee6..c77437b 100644
--- a/tests/compiler/dart2js/value_range_test.dart
+++ b/tests/compiler/dart2js/value_range_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const int REMOVED = 0;
@@ -345,53 +347,61 @@
   class JSUInt31 extends JSUInt32 {}
   getInterceptor(x) {}''';
 
-expect(String code, int kind) {
-  String generated = compile(
+Future expect(String code, int kind) {
+  return compile(
       code,
       coreSource: DEFAULT_CORELIB_WITH_LIST_INTERFACE,
-      interceptorsSource: INTERCEPTORSLIB_WITH_MEMBERS);
-  switch (kind) {
-    case REMOVED:
-      Expect.isTrue(!generated.contains('ioore'));
-      break;
+      interceptorsSource: INTERCEPTORSLIB_WITH_MEMBERS,
+      check: (String generated) {
+    switch (kind) {
+      case REMOVED:
+        Expect.isTrue(!generated.contains('ioore'));
+        break;
 
-    case ABOVE_ZERO:
-      Expect.isTrue(!generated.contains('< 0'));
-      Expect.isTrue(generated.contains('ioore'));
-      break;
+      case ABOVE_ZERO:
+        Expect.isTrue(!generated.contains('< 0'));
+        Expect.isTrue(generated.contains('ioore'));
+        break;
 
-    case BELOW_ZERO_CHECK:
-      Expect.isTrue(generated.contains('< 0'));
-      Expect.isTrue(!generated.contains('||'));
-      Expect.isTrue(generated.contains('ioore'));
-      break;
+      case BELOW_ZERO_CHECK:
+        Expect.isTrue(generated.contains('< 0'));
+        Expect.isTrue(!generated.contains('||'));
+        Expect.isTrue(generated.contains('ioore'));
+        break;
 
-    case BELOW_LENGTH:
-      Expect.isTrue(!generated.contains('||'));
-      Expect.isTrue(generated.contains('ioore'));
-      break;
+      case BELOW_LENGTH:
+        Expect.isTrue(!generated.contains('||'));
+        Expect.isTrue(generated.contains('ioore'));
+        break;
 
-    case KEPT:
-      Expect.isTrue(generated.contains('ioore'));
-      break;
+      case KEPT:
+        Expect.isTrue(generated.contains('ioore'));
+        break;
 
-    case ONE_CHECK:
-      RegExp regexp = new RegExp('ioore');
-      Iterator matches = regexp.allMatches(generated).iterator;
-      checkNumberOfMatches(matches, 1);
-      break;
+      case ONE_CHECK:
+        RegExp regexp = new RegExp('ioore');
+        Iterator matches = regexp.allMatches(generated).iterator;
+        checkNumberOfMatches(matches, 1);
+        break;
 
-    case ONE_ZERO_CHECK:
-      RegExp regexp = new RegExp('< 0|>>> 0 !==');
-      Iterator matches = regexp.allMatches(generated).iterator;
-      checkNumberOfMatches(matches, 1);
-      break;
-  }
+      case ONE_ZERO_CHECK:
+        RegExp regexp = new RegExp('< 0|>>> 0 !==');
+        Iterator matches = regexp.allMatches(generated).iterator;
+        checkNumberOfMatches(matches, 1);
+        break;
+    }
+  });
 }
 
 
 main() {
-  for (int i = 0; i < TESTS.length;  i += 2) {
-    expect(TESTS[i], TESTS[i + 1]);
+  int i = 0;
+  Future testNext() {
+    return expect(TESTS[i], TESTS[i + 1]).then((_) {
+      i += 2;
+      if (i < TESTS.length) return testNext();
+    });
   }
+
+  asyncTest(() => testNext());
 }
diff --git a/tests/compiler/dart2js/warnings_checker.dart b/tests/compiler/dart2js/warnings_checker.dart
index fc70bef..9a3474a 100644
--- a/tests/compiler/dart2js/warnings_checker.dart
+++ b/tests/compiler/dart2js/warnings_checker.dart
@@ -10,10 +10,10 @@
 import 'package:expect/expect.dart';

 import 'package:async_helper/async_helper.dart';

 import 'memory_compiler.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';

-import '../../../sdk/lib/_internal/compiler/implementation/util/uri_extras.dart';

+import 'package:compiler/implementation/filenames.dart';

+import 'package:compiler/implementation/source_file.dart';

+import 'package:compiler/implementation/source_file_provider.dart';

+import 'package:compiler/implementation/util/uri_extras.dart';

 import 'dart:convert';

 

 void checkWarnings(Map<String, dynamic> tests, [List<String> arguments]) {

diff --git a/tests/compiler/dart2js_native/lru_test.dart b/tests/compiler/dart2js_native/lru_test.dart
new file mode 100644
index 0000000..f5c5200
--- /dev/null
+++ b/tests/compiler/dart2js_native/lru_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:_internal" show LRUMap;
+import "../../lib/mirrors/lru_expect.dart";
+
+main() {
+  expect((shift) => new LRUMap.withShift(shift));
+}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 373b67b..35e97c4 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -88,10 +88,6 @@
 string_base_vm_test: RuntimeError, OK # VM specific test.
 nan_infinity_test/01: Fail # Issue 11551
 
-[ $compiler == dart2js || $compiler == dart2dart]
-symbol_operator_test/01: CompileTimeError # Issue 15653.
-symbol_operator_test/02: CompileTimeError # Issue 15653.
-
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
@@ -105,11 +101,8 @@
 
 [ $compiler == dart2js && ($runtime == firefox || $runtime == safari || $runtime == chrome || $runtime == drt) ]
 
-[ $compiler == dart2js && ($runtime == drt || $runtime == safari || $runtime == safarimobilesim) ]
-string_trimlr_test/none: Fail # Bug in v8. Fixed in v8 r19222, 2014-02-10.
-
-[ $compiler == dart2js && ( $runtime == drt) ]
-string_case_test/02: Fail, OK  # Bug in our version of V8.
+[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim) ]
+string_trimlr_test/none: Fail
 
 [ $compiler == dart2js && ($runtime == ie9 || $runtime == ie10) ]
 string_case_test/01: Fail, OK  # Bug in IE.
@@ -163,3 +156,7 @@
 [ $runtime == ie9 || $runtime == ie10 ]
 num_parse_test: RuntimeError  # Issue 15316
 num_parse_test/01: RuntimeError  # Issue 15316
+
+[ $system == windows && $arch == x64 ]
+stopwatch_test: Skip  # Flaky test due to expected performance behaviour.
+
diff --git a/tests/corelib/symbol_operator_test.dart b/tests/corelib/symbol_operator_test.dart
index 13cd8bc..981f44b 100644
--- a/tests/corelib/symbol_operator_test.dart
+++ b/tests/corelib/symbol_operator_test.dart
@@ -24,8 +24,8 @@
   testSymbol(#>, $>$, ">");
   testSymbol(#>=, $>=$, ">=");
   testSymbol(#==, new Symbol("=="), "==");  // Can't hit noSuchMethod.
-  testSymbol(#[], $[$], "[]");                      /// 01: ok
-  testSymbol(#[]=, ($[$]=$).lastMember, "[]=");     /// 02: ok
+  testSymbol(#[], $[$], "[]");
+  testSymbol(#[]=, ($[$]=$).lastMember, "[]=");
   testSymbol(const Symbol("unary-"), -$, "unary-");
 
   testSymbolThrows(">>>");  /// 03: ok
diff --git a/tests/corelib/uri_ipv6_test.dart b/tests/corelib/uri_ipv6_test.dart
index 0f3ba03..65014da 100644
--- a/tests/corelib/uri_ipv6_test.dart
+++ b/tests/corelib/uri_ipv6_test.dart
@@ -19,36 +19,36 @@
   path = 'http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:8080/index.html';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('FEDC:BA98:7654:3210:FEDC:BA98:7654:3210', uri.host);
+  Expect.equals('fedc:ba98:7654:3210:fedc:ba98:7654:3210', uri.host);
   Expect.equals(8080, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals(path, uri.toString());
+  Expect.equals(path.toLowerCase(), uri.toString());
 
   path = 'http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('FEDC:BA98:7654:3210:FEDC:BA98:7654:3210', uri.host);
+  Expect.equals('fedc:ba98:7654:3210:fedc:ba98:7654:3210', uri.host);
   Expect.equals(80, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals('http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]/index.html',
+  Expect.equals('http://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/index.html',
                 uri.toString());
 
   path = 'https://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:443/index.html';
   uri = Uri.parse(path);
   Expect.equals('https', uri.scheme);
-  Expect.equals('FEDC:BA98:7654:3210:FEDC:BA98:7654:3210', uri.host);
+  Expect.equals('fedc:ba98:7654:3210:fedc:ba98:7654:3210', uri.host);
   Expect.equals(443, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals('https://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]/index.html',
+  Expect.equals('https://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/index.html',
                 uri.toString());
 
   path = 'http://[1080:0:0:0:8:800:200C:417A]/index.html';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('1080:0:0:0:8:800:200C:417A', uri.host);
+  Expect.equals('1080:0:0:0:8:800:200c:417a', uri.host);
   Expect.equals(80, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals(path, uri.toString());
+  Expect.equals(path.toLowerCase(), uri.toString());
 
   path = 'http://[3ffe:2a00:100:7031::1]';
   uri = Uri.parse(path);
@@ -61,10 +61,10 @@
   path = 'http://[1080::8:800:200C:417A]/foo';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('1080::8:800:200C:417A', uri.host);
+  Expect.equals('1080::8:800:200c:417a', uri.host);
   Expect.equals(80, uri.port);
   Expect.equals('/foo', uri.path);
-  Expect.equals(path, uri.toString());
+  Expect.equals(path.toLowerCase(), uri.toString());
 
   path = 'http://[::192.9.5.5]/ipng';
   uri = Uri.parse(path);
@@ -77,34 +77,34 @@
   path = 'http://[::FFFF:129.144.52.38]:8080/index.html';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('::FFFF:129.144.52.38', uri.host);
+  Expect.equals('::ffff:129.144.52.38', uri.host);
   Expect.equals(8080, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals(path, uri.toString());
+  Expect.equals(path.toLowerCase(), uri.toString());
 
   path = 'http://[::FFFF:129.144.52.38]:80/index.html';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('::FFFF:129.144.52.38', uri.host);
+  Expect.equals('::ffff:129.144.52.38', uri.host);
   Expect.equals(80, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals('http://[::FFFF:129.144.52.38]/index.html', uri.toString());
+  Expect.equals('http://[::ffff:129.144.52.38]/index.html', uri.toString());
 
   path = 'https://[::FFFF:129.144.52.38]:443/index.html';
   uri = Uri.parse(path);
   Expect.equals('https', uri.scheme);
-  Expect.equals('::FFFF:129.144.52.38', uri.host);
+  Expect.equals('::ffff:129.144.52.38', uri.host);
   Expect.equals(443, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals('https://[::FFFF:129.144.52.38]/index.html', uri.toString());
+  Expect.equals('https://[::ffff:129.144.52.38]/index.html', uri.toString());
 
   path = 'http://[2010:836B:4179::836B:4179]';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('2010:836B:4179::836B:4179', uri.host);
+  Expect.equals('2010:836b:4179::836b:4179', uri.host);
   Expect.equals(80, uri.port);
   Expect.equals('', uri.path);
-  Expect.equals(path, uri.toString());
+  Expect.equals(path.toLowerCase(), uri.toString());
 }
 
 
diff --git a/tests/corelib/uri_scheme_test.dart b/tests/corelib/uri_scheme_test.dart
index 2565e70..f816624 100644
--- a/tests/corelib/uri_scheme_test.dart
+++ b/tests/corelib/uri_scheme_test.dart
@@ -5,10 +5,10 @@
 import "package:expect/expect.dart";
 
 void testInvalidArguments() {
-  Expect.throws(() => new Uri(scheme: "_"), (e) => e is ArgumentError);
-  Expect.throws(() => new Uri(scheme: "http_s"), (e) => e is ArgumentError);
+  Expect.throws(() => new Uri(scheme: "_"), (e) => e is FormatException);
+  Expect.throws(() => new Uri(scheme: "http_s"), (e) => e is FormatException);
   Expect.throws(() => new Uri(scheme: "127.0.0.1:80"),
-                (e) => e is ArgumentError);
+                (e) => e is FormatException);
 }
 
 void testScheme() {
diff --git a/tests/corelib/uri_test.dart b/tests/corelib/uri_test.dart
index 19d4019..703515d 100644
--- a/tests/corelib/uri_test.dart
+++ b/tests/corelib/uri_test.dart
@@ -124,6 +124,236 @@
       Uri.parse("http://localhost").resolveUri(new Uri(path: path)).toString());
 }
 
+const ALPHA = r"abcdefghijklmnopqrstuvwxuzABCDEFGHIJKLMNOPQRSTUVWXUZ";
+const DIGIT = r"0123456789";
+const PERCENT_ENCODED = "%00%ff";
+const SUBDELIM = r"!$&'()*+,;=";
+
+const SCHEMECHAR = "$ALPHA$DIGIT+-.";
+const UNRESERVED = "$ALPHA$DIGIT-._~";
+const REGNAMECHAR = "$UNRESERVED$SUBDELIM$PERCENT_ENCODED";
+const USERINFOCHAR = "$REGNAMECHAR:";
+
+const PCHAR_NC = "$UNRESERVED$SUBDELIM$PERCENT_ENCODED@";
+const PCHAR = "$PCHAR_NC:";
+const QUERYCHAR = "$PCHAR/?";
+
+void testValidCharacters() {
+  // test that all valid characters are accepted.
+
+  for (var scheme in ["", "$SCHEMECHAR$SCHEMECHAR:"]) {
+    for (var userinfo in ["", "@", "$USERINFOCHAR$USERINFOCHAR@",
+                          "$USERINFOCHAR:$DIGIT@"]) {
+      for (var host in ["", "$REGNAMECHAR$REGNAMECHAR",
+                        "255.255.255.256",  // valid reg-name.
+                        "[ffff::ffff:ffff]", "[ffff::255.255.255.255]"]) {
+        for (var port in ["", ":", ":$DIGIT$DIGIT"]) {
+          var auth = "$userinfo$host$port";
+          if (auth.isNotEmpty) auth = "//$auth";
+          var paths = ["", "/", "/$PCHAR", "/$PCHAR/"];  // Absolute or empty.
+          if (auth.isNotEmpty) {
+            // Initial segment may be empty.
+            paths..add("//$PCHAR");
+          } else {
+            // Path may begin with non-slash.
+            if (scheme.isEmpty) {
+              // Initial segment must not contain colon.
+              paths..add(PCHAR_NC)
+                   ..add("$PCHAR_NC/$PCHAR")
+                   ..add("$PCHAR_NC/$PCHAR/");
+            } else {
+              paths..add(PCHAR)
+                   ..add("$PCHAR/$PCHAR")
+                   ..add("$PCHAR/$PCHAR/");
+            }
+          }
+          for (var path in paths) {
+            for (var query in ["", "?", "?$QUERYCHAR"]) {
+              for (var fragment in ["", "#", "#$QUERYCHAR"]) {
+                var uri = "$scheme$auth$path$query$fragment";
+                // Should not throw.
+                var result = Uri.parse(uri);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+void testInvalidUrls() {
+  void checkInvalid(uri) {
+    try {
+      var result = Uri.parse(uri);
+      Expect.fail("Invalid URI `$uri` parsed to $result\n" + dump(result));
+    } on FormatException {
+      // Success.
+    }
+  }
+  checkInvalid("s%41://x.x/");      // No escapes in scheme,
+                                    // and no colon before slash in path.
+  checkInvalid("1a://x.x/");        // Scheme must start with letter,
+                                    // and no colon before slash in path.
+  checkInvalid(".a://x.x/");        // Scheme must start with letter,
+                                    // and no colon before slash in path.
+  checkInvalid("_:");               // Character not valid in scheme,
+                                    // and no colon before slash in path.
+  checkInvalid(":");                // Scheme must start with letter,
+                                    // and no colon before slash in path.
+
+  void checkInvalidReplaced(uri, invalid, replacement) {
+    var source = uri.replaceAll('{}', invalid);
+    var expected = uri.replaceAll('{}', replacement);
+    var result = Uri.parse(source);
+    Expect.equals(expected, "$result", "Source: $source\n${dump(result)}");
+  }
+
+  // Regression test for http://dartbug.com/16081
+  checkInvalidReplaced("http://www.example.org/red%09ros{}#red)",
+                       "\u00e9", "%C3%A9");
+  checkInvalidReplaced("http://r{}sum\{}.example.org", "\u00E9", "%C3%A9");
+
+  // Invalid characters. The characters must be rejected, even if normalizing
+  // the input would cause them to be valid (normalization happens after
+  // validation).
+  var invalidCharsAndReplacements = [
+    "\xe7",      "%C3%A7",       // Arbitrary non-ASCII letter
+    " ",         "%20",          // Space, not allowed anywhere.
+    '"',         "%22",          // Quote, not allowed anywhere
+    "<>",        "%3C%3E",       // Less/greater-than, not allowed anywhere.
+    "\x7f",      "%7F",          // DEL, not allowed anywhere
+    "\xdf",      "%C3%9F",       // German lower-case scharf-S.
+                                 // Becomes ASCII when upper-cased.
+    "\u0130",    "%C4%B0",       // Latin capital dotted I,
+                                 // becomes ASCII lower-case in Turkish.
+    "%\uFB03",   "%25%EF%AC%83", // % + Ligature ffi,
+                                 // becomes ASCII when upper-cased,
+                                 // should not be read as "%FFI".
+    "\u212a",    "%E2%84%AA",    // Kelvin sign. Becomes ASCII when lower-cased.
+    "%1g",       "%251g",        // Invalid escape.
+    "\u{10000}", "%F0%90%80%80", // Non-BMP character as surrogate pair.
+  ];
+  for (int i = 0; i < invalidCharsAndReplacements.length; i += 2) {
+    var invalid = invalidCharsAndReplacements[i];
+    var valid = invalidCharsAndReplacements[i + 1];
+    checkInvalid("A{}b:///".replaceAll('{}', invalid));
+    checkInvalid("{}b:///".replaceAll('{}', invalid));
+    checkInvalidReplaced("s://user{}info@x.x/", invalid, valid);
+    checkInvalidReplaced("s://reg{}name/", invalid, valid);
+    checkInvalid("s://regname:12{}45/".replaceAll("{}", invalid));
+    checkInvalidReplaced("s://regname/p{}ath/", invalid, valid);
+    checkInvalidReplaced("/p{}ath/", invalid, valid);
+    checkInvalidReplaced("p{}ath/", invalid, valid);
+    checkInvalidReplaced("s://regname/path/?x{}x", invalid, valid);
+    checkInvalidReplaced("s://regname/path/#x{}x", invalid, valid);
+    checkInvalidReplaced("s://regname/path/??#x{}x", invalid, valid);
+  }
+
+  // At most one @ in userinfo.
+  checkInvalid("s://x@x@x.x/");
+  // No colon in host except before a port.
+  checkInvalid("s://x@x:x/");
+  // At most one port.
+  checkInvalid("s://x@x:9:9/");
+  // At most one #.
+  checkInvalid("s://x/x#foo#bar");
+  // @ not allowed in scheme.
+  checkInvalid("s@://x:9/x?x#x");
+  // ] not allowed alone in host.
+  checkInvalid("s://xx]/");
+  // ] not allowed anywhere except in host.
+  checkInvalid("s://xx/]");
+  checkInvalid("s://xx/?]");
+  checkInvalid("s://xx/#]");
+  checkInvalid("s:/]");
+  checkInvalid("s:/?]");
+  checkInvalid("s:/#]");
+  // IPv6 must be enclosed in [ and ] for Uri.parse.
+  // It is allowed un-enclosed as argument to `Uri(host:...)` because we don't
+  // need to delimit.
+  checkInvalid("s://ffff::ffff:1234/");
+}
+
+void testNormalization() {
+  // The Uri constructor and the Uri.parse function performs RFC-3986
+  // syntax based normalization.
+
+  var uri;
+
+  // Scheme: Only case normalization. Schemes cannot contain escapes.
+  uri = Uri.parse("A:");
+  Expect.equals("a", uri.scheme);
+  uri = Uri.parse("Z:");
+  Expect.equals("z", uri.scheme);
+  uri = Uri.parse("$SCHEMECHAR:");
+  Expect.equals(SCHEMECHAR.toLowerCase(), uri.scheme);
+
+  // Percent escape normalization.
+  // Escapes of unreserved characters are converted to the character,
+  // subject to case normalization in reg-name.
+  for (var i = 0; i < UNRESERVED.length; i++) {
+    var char = UNRESERVED[i];
+    var escape = "%" + char.codeUnitAt(0).toRadixString(16);  // all > 0xf.
+
+    uri = Uri.parse("s://xX${escape}xX@yY${escape}yY/zZ${escape}zZ"
+                    "?vV${escape}vV#wW${escape}wW");
+    Expect.equals("xX${char}xX", uri.userInfo);
+    Expect.equals("yY${char}yY".toLowerCase(), uri.host);
+    Expect.equals("/zZ${char}zZ", uri.path);
+    Expect.equals("vV${char}vV", uri.query);
+    Expect.equals("wW${char}wW", uri.fragment);
+  }
+
+  // Escapes of reserved characters are kept, but upper-cased.
+  for (var escape in ["%00", "%1f", "%7F", "%fF"]) {
+    uri = Uri.parse("s://xX${escape}xX@yY${escape}yY/zZ${escape}zZ"
+                    "?vV${escape}vV#wW${escape}wW");
+    var normalizedEscape = escape.toUpperCase();
+    Expect.equals("xX${normalizedEscape}xX", uri.userInfo);
+    Expect.equals("yy${normalizedEscape}yy", uri.host);
+    Expect.equals("/zZ${normalizedEscape}zZ", uri.path);
+    Expect.equals("vV${normalizedEscape}vV", uri.query);
+    Expect.equals("wW${normalizedEscape}wW", uri.fragment);
+  }
+
+  // Some host normalization edge cases.
+  uri = Uri.parse("x://x%61X%41x%41X%61x/");
+  Expect.equals("xaxaxaxax", uri.host);
+
+  uri = Uri.parse("x://Xxxxxxxx/");
+  Expect.equals("xxxxxxxx", uri.host);
+
+  uri = Uri.parse("x://xxxxxxxX/");
+  Expect.equals("xxxxxxxx", uri.host);
+
+  uri = Uri.parse("x://xxxxxxxx%61/");
+  Expect.equals("xxxxxxxxa", uri.host);
+
+  uri = Uri.parse("x://%61xxxxxxxx/");
+  Expect.equals("axxxxxxxx", uri.host);
+
+  uri = Uri.parse("x://X/");
+  Expect.equals("x", uri.host);
+
+  uri = Uri.parse("x://%61/");
+  Expect.equals("a", uri.host);
+
+  uri = new Uri(scheme: "x", path: "//y");
+  Expect.equals("//y", uri.path);
+  Expect.equals("x:////y", uri.toString());
+
+  uri = new Uri(scheme: "file", path: "//y");
+  Expect.equals("//y", uri.path);
+  Expect.equals("file:////y", uri.toString());
+
+  // File scheme noralizes to always showing authority, even if empty.
+  uri = new Uri(scheme: "file", path: "/y");
+  Expect.equals("file:///y", uri.toString());
+  uri = new Uri(scheme: "file", path: "y");
+  Expect.equals("file:///y", uri.toString());
+}
+
 main() {
   testUri("http:", true);
   testUri("file://", true);
@@ -233,7 +463,7 @@
 
   Expect.stringEquals("\u{10000}", s);
 
-  testEncodeDecode("A + B", "A%20%2B%20B");
+  testEncodeDecode("A + B", "A%20+%20B");
   testEncodeDecode("\uFFFE", "%EF%BF%BE");
   testEncodeDecode("\uFFFF", "%EF%BF%BF");
   testEncodeDecode("\uFFFE", "%EF%BF%BE");
@@ -241,7 +471,29 @@
   testEncodeDecode("\x7f", "%7F");
   testEncodeDecode("\x80", "%C2%80");
   testEncodeDecode("\u0800", "%E0%A0%80");
-  testEncodeDecode(":/@',;?&=+\$", ":/@',;?&=%2B\$");
+  // All characters not escaped by encodeFull.
+  var unescapedFull =
+      r"abcdefghijklmnopqrstuvwxyz"
+      r"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+      r"0123456789!#$&'()*+,-./:;=?@_~";
+  // ASCII characters escaped by encodeFull:
+  var escapedFull =
+      "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+      "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+      r' "%<>[\]^`{|}'
+      "\x7f";
+  var escapedTo =
+      "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F"
+      "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F"
+      "%20%22%25%3C%3E%5B%5C%5D%5E%60%7B%7C%7D%7F";
+  testEncodeDecode(unescapedFull, unescapedFull);
+  testEncodeDecode(escapedFull, escapedTo);
+  var nonAscii =
+      "\x80-\xff-\u{100}-\u{7ff}-\u{800}-\u{ffff}-\u{10000}-\u{10ffff}";
+  var nonAsciiEncoding =
+      "%C2%80-%C3%BF-%C4%80-%DF%BF-%E0%A0%80-%EF%BF%BF-"
+      "%F0%90%80%80-%F4%8F%BF%BF";
+  testEncodeDecode(nonAscii, nonAsciiEncoding);
   testEncodeDecode(s, "%F0%90%80%80");
   testEncodeDecodeComponent("A + B", "A%20%2B%20B");
   testEncodeDecodeComponent("\uFFFE", "%EF%BF%BE");
@@ -256,9 +508,25 @@
   testEncodeDecodeQueryComponent("A + B", "A+%2B+B", "A+%2B+B", "A+%2B+B");
   testEncodeDecodeQueryComponent(
       "æ ø å", "%C3%A6+%C3%B8+%C3%A5", "%E6+%F8+%E5", null);
+  testEncodeDecodeComponent(nonAscii, nonAsciiEncoding);
 
   // Invalid URI - : and @ is swapped, port ("host") should be numeric.
   Expect.throws(
       () => Uri.parse("file://user@password:host/path"),
       (e) => e is FormatException);
+
+  testValidCharacters();
+  testInvalidUrls();
+  testNormalization();
+}
+
+String dump(Uri uri) {
+  return "URI: $uri\n"
+      "  Scheme:    ${uri.scheme} #${uri.scheme.length}\n"
+      "  User-info: ${uri.userInfo} #${uri.userInfo.length}\n"
+      "  Host:      ${uri.host} #${uri.host.length}\n"
+      "  Port:      ${uri.port}\n"
+      "  Path:      ${uri.path} #${uri.path.length}\n"
+      "  Query:     ${uri.query} #${uri.query.length}\n"
+      "  Fragment:  ${uri.fragment} #${uri.fragment.length}\n";
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index 782d633..bbb4ec6 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -10,6 +10,10 @@
 form_data_test/functional: Fail # Issue 18931 (Disabled for Chrome 35 roll)
 indexeddb_5_test: Fail # Issue 18931 (Disabled for Chrome 35 roll)
 custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Issue 18931 (Disabled for Chrome 35 roll)
+blob_constructor_test: Fail # Issue 19500
+transferables_test: Fail # Issue 19500
+indexeddb_1_test/functional: Skip # Issue 19512 (timing out)
+xhr_test/xhr: RuntimeError # Issue 18049
 
 [ $compiler == dart2js && $csp ]
 custom/js_custom_test: Fail # Issue 14643
@@ -18,16 +22,15 @@
 [ $compiler == dart2js && $browser ]
 custom/created_callback_test: Fail # Support for created constructor.
 
-[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim || $runtime == ff  || $ie) ]
+[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim || $runtime == ff  || $ie || $runtime == chrome) ]
 custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
-custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Polyfill does not support
+
+[ $compiler == dart2js && $runtime == chrome ]
+custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Issue 18931 (Disabled for Chrome 35 roll
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) && $mode == debug && $system == macos]
 audiobuffersourcenode_test: Pass, Fail, Crash # http://crbug.com/256601
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium) && $checked ]
-xhr_test/xhr: Pass, RuntimeError # Issue 18049
-
 [ $compiler == none && $runtime == dartium && $system == macos]
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Pass,Fail # Issue 11834
 
@@ -38,18 +41,23 @@
 async_test: Fail # Background timers not implemented.
 keyboard_event_test: Fail # Issue 13902
 isolates_test: Fail # Issue 13921
-custom/element_upgrade_test: Skip # Issue 17298
+indexeddb_3_test: Skip # Issue 19578.  Timeouts and RuntimeError
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) && $mode == debug ]
 websocket_test/websocket: Skip # Issue 17666
-canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Skip #Issue 17666
+canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Skip # Issue 17666
 
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
-element_offset_test/offset: Pass, Fail # Issue 17550
-mouse_event_test: Skip # Times out. Issue 19127
-css_test/supportsPointConversions: Skip # Times out. Issue 19127
+audiobuffersourcenode_test/functional: Skip # Causes the following (next) test to time out.  Issue 19127
+audiocontext_test/functional: Skip # Causes the following (next) test to time out.  Issue 19127
 canvasrenderingcontext2d_test/drawImage_video_element: RuntimeError # Issue 19127
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: RuntimeError # Issue 19127
+css_test/supportsPointConversions: Skip # Times out. Issue 19127
+element_offset_test/offset: Skip # Issue 17550
+indexeddb_1_test/functional: RuntimeError # Issue 19127. Actually a timeout, but do not skip.
+mouse_event_test: Skip # Times out. Issue 19127
+request_animation_frame_test: Timeout # Issue 19127. Do not skip, for stability.
+xhr_test/xhr: RuntimeError # Issue 19127
 
 [ $compiler == none && $runtime == drt && $system == windows ]
 worker_test/functional: Pass, Crash # Issue 9929.
@@ -100,6 +108,11 @@
 websql_test: Fail, Pass # Issue 4941: stderr contains a backtrace.
 native_gc_test: Pass, Slow
 
+[ $compiler == dart2js && $runtime == drt ]
+shadow_dom_test/ShadowDOM_tests: Fail # Issue 19426
+shadow_dom_test/supported: Fail # Issue 19426
+shadowroot_test: Fail # Issue 19426
+
 [ $compiler == dart2js && $runtime == drt && $system == macos]
 audiobuffersourcenode_test: Pass, Fail
 
@@ -314,6 +327,9 @@
 xhr_test/supported_overrideMimeType: Fail
 xsltprocessor_test/supported: Fail
 
+[ $compiler == dart2js && $runtime == drt && $unchecked ]
+audiocontext_test/functional: Fail
+
 [ $runtime == safari || $runtime == safarimobilesim ]
 worker_test: Skip # Issue 13221
 worker_api_test: Skip # Issue 13221
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index fae13ca..96060d7 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -79,6 +79,9 @@
 [ $jscl || $runtime == ie9 ]
 spawn_uri_multi_test/none: RuntimeError # http://dartbug.com/13544
 
+[ $compiler == none && $runtime == ContentShellOnAndroid ]
+nested_spawn2_test: Skip # Issue 19127: This test is timing out.
+
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 spawn_uri_nested_vm_test: Skip # Issue 14479: This test is timing out.
 
diff --git a/tests/language/closure_self_reference_test.dart b/tests/language/closure_self_reference_test.dart
new file mode 100644
index 0000000..9ffc951
--- /dev/null
+++ b/tests/language/closure_self_reference_test.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.
+
+import 'package:expect/expect.dart';
+
+// Tests a self-reference of a closure inside a try/catch.
+// Dart2js must not try to box the closure-reference.
+
+main() {
+  var counter = 0;
+  inner(value) {
+    if (value == 0) return 0;
+    try {
+      return inner(value - 1);
+    } finally {
+      counter++;
+    }
+  }
+
+  Expect.equals(0, inner(499));
+  Expect.equals(499, counter);
+}
diff --git a/tests/language/const_global_test.dart b/tests/language/const_global_test.dart
new file mode 100644
index 0000000..20d8a58
--- /dev/null
+++ b/tests/language/const_global_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+const a = 1;
+
+main() {
+    Expect.equals(1, a);
+    Expect.equals(1, const A(a).a);
+    Expect.equals(1, const [const A(a)][0].a);
+}
+
+class A {
+    final a;
+    const A(this.a);
+}
diff --git a/tests/language/const_list_test.dart b/tests/language/const_list_test.dart
index dd7c183..57fc509 100644
--- a/tests/language/const_list_test.dart
+++ b/tests/language/const_list_test.dart
@@ -6,7 +6,7 @@
 
 class ConstListTest {
 
-  static testMain() {
+  static testConstructors() {
     List fixedList = new List(4);
     List fixedList2 = new List(4);
     List growableList = new List();
@@ -28,6 +28,9 @@
     Expect.equals(false, fixedList == growableList);
     fixedList[3] = 0;
     Expect.equals(false, fixedList == growableList);
+  }
+
+  static testLiterals() {
     var a = [1, 2, 3.1];
     var b = [1, 2, 3.1];
     Expect.equals(false, a == b);
@@ -44,5 +47,6 @@
 }
 
 main() {
-  ConstListTest.testMain();
+  ConstListTest.testConstructors();
+  ConstListTest.testLiterals();
 }
diff --git a/tests/language/const_local_test.dart b/tests/language/const_local_test.dart
new file mode 100644
index 0000000..bc5b71b
--- /dev/null
+++ b/tests/language/const_local_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+main() {
+    const a = 1;
+    Expect.equals(1, a);
+    Expect.equals(1, const A(a).a);
+    Expect.equals(1, const [const A(a)][0].a);
+}
+
+class A {
+    final a;
+    const A(this.a);
+}
diff --git a/tests/language/const_map4_test.dart b/tests/language/const_map4_test.dart
new file mode 100644
index 0000000..b263a2c
--- /dev/null
+++ b/tests/language/const_map4_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+main() {
+    var a = {1: 'a', 2: 'b', 3: 'c'};
+    var b = {1: 'a', 2: 'b', 3: 'c'};
+    Expect.equals(false, a == b);
+
+    a = const {1: 'a', 2: 'b', 3: 'c'};
+    b = const {1: 'a', 2: 'b', 3: 'c'};
+    Expect.equals(true, a == b);
+
+    a = const <num,String>{1: 'a', 2: 'b', 3: 'c'};
+    b = const {1: 'a', 2: 'b', 3: 'c'};
+    Expect.equals(false, a == b);
+
+    a = const <dynamic,dynamic>{1: 'a', 2: 'b', 3: 'c'};
+    b = const {1: 'a', 2: 'b', 3: 'c'};
+    Expect.equals(true, a == b);
+}
diff --git a/tests/language/critical_edge2_test.dart b/tests/language/critical_edge2_test.dart
new file mode 100644
index 0000000..75e3f13
--- /dev/null
+++ b/tests/language/critical_edge2_test.dart
@@ -0,0 +1,38 @@
+// 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 test broke dart2js.
+// A compiler must not construct a critical edge on this program.
+//
+// See critical_edge_test.dart for a description of the problem.
+
+import "package:expect/expect.dart";
+
+String parse(String uri) {
+  int index = 0;
+  int char = -1;
+
+  void parseAuth() {
+    index;
+    char;
+  }
+
+  while (index < 1000) {
+    char = uri.codeUnitAt(index);
+    if (char == 1234) {
+      break;
+    }
+    if (char == 0x3A) {
+      return "good";
+    }
+    index++;
+  }
+
+  print(char);
+  return "bad";
+}
+
+main() {
+  Expect.equals("good", parse("dart:_foreign_helper"));
+}
diff --git a/tests/language/critical_edge_test.dart b/tests/language/critical_edge_test.dart
new file mode 100644
index 0000000..28c7fd4
--- /dev/null
+++ b/tests/language/critical_edge_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test broke dart2js.
+// A compiler must not construct a critical edge on this program.
+//
+// In particular we have to watch out for:
+//  - the while-loop branch going to the body-block and to the exit-block, and
+//  - the exit-block having as incoming the condition-block and the
+//    break-blocks.
+//
+// Triggering the bug is relatively hard, since pushing instructions back the
+// exit-block to the incoming blocks is not guaranteed to trigger an error.
+// Dart2js frequently ended up with update-assignments just before the
+// condition:
+//    for (int i = 0; state = state0, i < 10; i++) {
+//      if (..) { state = 1; }
+//      ...
+//    }
+//    use(state);
+//
+// In this case the "state" variable was assigned before the loop and then
+// reassigned before the break. The exit-block pushed the assignment back
+// to its incoming blocks and that's why the "state = state0" assignment ended
+// up just before the condition.
+// Note that the assignment was executed at every iteration instead of just
+// when exiting the loop.
+// This repeated assignments don't have any negative effect unless the state
+// variable is also assigned and used inside the loop-body. It turns out that
+// this is very rare and needs some tricks to make happen.
+
+import "package:expect/expect.dart";
+
+String parse(String uri) {
+  int index = 0;
+  int char = -1;
+
+  void parseAuth() {
+    index;
+    char;
+  }
+
+  int state = 0;
+  while (true) {
+    char = uri.codeUnitAt(index);
+    if (char == 1234) {
+      state = (index == 0) ? 1 : 2;
+      break;
+    }
+    if (char == 0x3A) {
+      return "good";
+    }
+    index++;
+  }
+
+  if (state == 1) {
+    print(char == 1234);
+    print(index == uri.length);
+  }
+  return "bad";
+}
+
+main() {
+  Expect.equals("good", parse("dart:_foreign_helper"));
+}
diff --git a/tests/language/external_test.dart b/tests/language/external_test.dart
index 06ccb36..6fb32df 100644
--- a/tests/language/external_test.dart
+++ b/tests/language/external_test.dart
@@ -2,10 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+class Bar {
+  Bar(val);
+}
+
 class Foo {
   var x;
   f() {}
 
+  Foo() : x = 0;
+
   external var x01;  /// 01: compile-time error
   external int x02;  /// 02: compile-time error
 
@@ -16,10 +22,12 @@
   static external f14();  /// 14: compile-time error
   int external f16();  /// 16: compile-time error
 
-  external Foo.n20();  /// 20: runtime error
-  external Foo.n21() : x(1);  /// 21: compile-time error
-  external Foo.n22() { x = 1; }  /// 22: compile-time error
-  external factory Foo.n23() => new Foo();  /// 23: compile-time error
+  external Foo.n20(val);  /// 20: runtime error
+  external Foo.n21(val) : x = 1;  /// 21: compile-time error
+  external Foo.n22(val) { x = 1; }  /// 22: compile-time error
+  external factory Foo.n23(val) => new Foo();  /// 23: compile-time error
+  external Foo.n24(this.x);  /// 24: compile-time error
+  external factory Foo.n25(val) = Bar;  /// 25: compile-time error
 }
 
 external int t06(int i) { }  /// 30: compile-time error
@@ -27,39 +35,24 @@
 
 main() {
 
-  // Try calling an unpatched external function.
+  // Ensure Foo class is compiled.
   var foo = new Foo();
-  try {                                               /// 10: continued
-    foo.f05();                                        /// 10: continued
-  } on String catch (exc) {                           /// 10: continued
-    if (exc == "External implementation missing.") {  /// 10: continued
-      throw exc;                                      /// 10: continued
-    }                                                 /// 10: continued
-  }                                                   /// 10: continued
 
+  // Try calling an unpatched external function.
+  new Foo().f10();                                    /// 10: continued
   new Foo().f11();                                    /// 11: continued
   new Foo().f12();                                    /// 12: continued
-
-  try {                                               /// 13: continued
-    Foo.f13();                                        /// 13: continued
-  } on String catch (exc) {                           /// 13: continued
-    if (exc == "External implementation missing.") {  /// 13: continued
-      throw exc;                                      /// 13: continued
-    }                                                 /// 13: continued
-  }                                                   /// 13: continued
+  Foo.f13();                                          /// 13: continued
+  Foo.f14();                                          /// 14: continued
+  new Foo().f16();                                    /// 16: continued
 
   // Try calling an unpatched external constructor.
-  try {                                               /// 20: continued
-    var foo = new Foo.n09();                          /// 20: continued
-  } on String catch (exc) {                           /// 20: continued
-    if (exc == "External implementation missing.") {  /// 20: continued
-      throw exc;                                      /// 20: continued
-    }                                                 /// 20: continued
-  }                                                   /// 20: continued
-
-  new Foo.n21();                                      /// 21: continued
-  new Foo.n22();                                      /// 22: continued
-  new Foo.n23();                                      /// 23: continued
+  new Foo.n20(1);                                      /// 20: continued
+  new Foo.n21(1);                                      /// 21: continued
+  new Foo.n22(1);                                      /// 22: continued
+  new Foo.n23(1);                                      /// 23: continued
+  new Foo.n24(1);                                      /// 24: continued
+  new Foo.n25(1);                                      /// 25: continued
 
   t06(1);                                             /// 30: continued
   t07(1);                                             /// 31: continued
diff --git a/tests/language/keyword_type_expression_test.dart b/tests/language/keyword_type_expression_test.dart
new file mode 100644
index 0000000..66755b9
--- /dev/null
+++ b/tests/language/keyword_type_expression_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 keyword can't be used as type.  Serves as regression test for
+// crashes in dart2js.
+
+in greeting = "fisk";  /// 01: compile-time error
+
+main(
+in greeting  /// 02: compile-time error
+) {
+  in greeting = "fisk";  /// 03: compile-time error
+  print(greeting);  /// 01: continued
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index bdf580a..482b4ba 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -112,6 +112,7 @@
 first_class_types_literals_test: Pass, Fail # Issue 13719: Please triage this failure.
 
 [ $compiler == none && ( $runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
+deferred_*: Skip # Lazy deferred loading not yet implemented in Dartium
 issue13474_test: Pass, Fail # Issue 14651.
 typed_message_test: Crash, Fail # Issue 13921, 14400
 vm/optimized_guarded_field_isolates_test: Fail # Issue 13921.
@@ -119,6 +120,12 @@
 [ $compiler == none && $runtime == drt ]
 disassemble_test: Pass, Fail # Issue 18122
 
+[ $compiler == none && $runtime == ContentShellOnAndroid ]
+closure7_test: Skip # Times out. Issue 19127
+abstract_exact_selector_test/01: Skip # Times out. Issue 19127
+function_subtype_local1_test: Skip # Times out. Issue 19127
+mixin_type_parameters_errors_test/02: Timeout # Times out. Do not skip, or more tests fail. Issue 19127
+
 [ $compiler == none && $runtime == vm && $arch == mips && $checked ]
 generic_instanceof3_test: Pass, Crash # Issue 17440.
 
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 12f99e6..4c9dad1 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -15,6 +15,10 @@
 
 type_check_const_function_typedef2_test/00: MissingCompileTimeError, Ok # Compile-time error in checked mode, because of constants.
 
+external_test/21: Fail
+external_test/24: Fail
+external_test/25: Fail
+
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
 #
@@ -170,7 +174,6 @@
 body_less_constructor_wrong_arg_negative_test: CompileTimeError # Test Issue 18695
 empty_block_case_test: StaticWarning # Test Issue 18701
 error_stacktrace_test: StaticWarning # Test Issue 18702
-external_test/20: StaticWarning # Test Issue 18703
 
 const_counter_negative_test: CompileTimeError
 const_optional_args_negative_test: CompileTimeError
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 695c6bc..ca4a746 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -15,6 +15,10 @@
 
 type_check_const_function_typedef2_test/00: MissingCompileTimeError, Ok # Compile-time error in checked mode, because of constants.
 
+external_test/21: Fail
+external_test/24: Fail
+external_test/25: Fail
+
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
 #
@@ -159,20 +163,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
-override_inheritance_generic_test/09: MissingStaticWarning # Issue 16135
-
-# flaky override tests
-override_inheritance_field_test/33: MissingStaticWarning, Pass # Issue 16498
-override_inheritance_field_test/33a: MissingStaticWarning, Pass # Issue 16498
-override_inheritance_generic_test/09: MissingStaticWarning, Pass # Issue 16498
-
 regress_19413_test/01: MissingStaticWarning # Issue 19424
 
 # The following tests are currently assumed to be failing because the test is wrong.
@@ -184,7 +174,6 @@
 body_less_constructor_wrong_arg_negative_test: CompileTimeError # Test Issue 18695
 empty_block_case_test: StaticWarning # Test Issue 18701
 error_stacktrace_test: StaticWarning # Test Issue 18702
-external_test/20: StaticWarning # Test Issue 18703
 
 const_counter_negative_test: CompileTimeError
 const_optional_args_negative_test: CompileTimeError
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index c46b8eb..7e9de2c 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -6,12 +6,12 @@
 override_inheritance_mixed_test/08: Fail # Issue 18124
 override_inheritance_mixed_test/09: Fail # Issue 18124
 bad_constructor_test/05: CompileTimeError # Issue 13669
-malformed_test/05: MissingCompileTimeError # Issue 12695
-malformed_test/06: MissingCompileTimeError # Issue 12695
 full_stacktrace1_test: Pass, RuntimeError # Issue 12698
 full_stacktrace2_test: Pass, RuntimeError # Issue 12698
 full_stacktrace3_test: Pass, RuntimeError # Issue 12698
 stacktrace_test: Pass, RuntimeError # # Issue 12698
+stacktrace_rethrow_nonerror_test: Pass, RuntimeError # Issue 12698
+stacktrace_rethrow_error_test: Pass, RuntimeError # Issue 12698
 illegal_invocation_test/01: CompileTimeError # Issue 13630
 instantiate_type_variable_test/01: CompileTimeError # Issue 13631
 library_ambiguous_test/00: CompileTimeError # Issue 13632
@@ -33,6 +33,9 @@
 ref_before_declaration_test/05: MissingCompileTimeError
 ref_before_declaration_test/06: MissingCompileTimeError
 
+external_test/10: Fail
+external_test/20: Fail
+
 setter_declaration2_negative_test: Crash # Issue 17139
 
 # VM specific tests that should not be run by dart2js.
@@ -89,6 +92,7 @@
 mixin_mixin_bound2_test: RuntimeError # Issue 12605
 
 [ $compiler == dart2js ]
+malformed_test/none: Fail # Expect failure in lib/_internal/lib/preambles/d8.js
 generic_field_mixin4_test: Crash # Issue 18651
 generic_field_mixin5_test: Crash # Issue 18651
 
@@ -97,7 +101,7 @@
 type_variable_conflict2_test/06: Crash # Issue 16180
 type_variable_conflict2_test/08: Crash # Issue 16180
 type_variable_conflict2_test/10: Crash # Issue 16180
-malformed_test/none: RuntimeError # Issue 12695
+
 branch_canonicalization_test: RuntimeError # Issue 638.
 identical_closure2_test: RuntimeError # Issue 1533, Issue 12596
 integer_division_by_zero_test: RuntimeError # Issue 8301
diff --git a/tests/language/large_class_declaration_test.dart b/tests/language/large_class_declaration_test.dart
new file mode 100644
index 0000000..2408cca
--- /dev/null
+++ b/tests/language/large_class_declaration_test.dart
@@ -0,0 +1,20018 @@
+// 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.
+
+// Dart test program for testing compilation of classes with a large number
+// of fields.
+
+import "package:expect/expect.dart";
+
+class A {
+  var a0;
+  var a1;
+  var a2;
+  var a3;
+  var a4;
+  var a5;
+  var a6;
+  var a7;
+  var a8;
+  var a9;
+  var a10;
+  var a11;
+  var a12;
+  var a13;
+  var a14;
+  var a15;
+  var a16;
+  var a17;
+  var a18;
+  var a19;
+  var a20;
+  var a21;
+  var a22;
+  var a23;
+  var a24;
+  var a25;
+  var a26;
+  var a27;
+  var a28;
+  var a29;
+  var a30;
+  var a31;
+  var a32;
+  var a33;
+  var a34;
+  var a35;
+  var a36;
+  var a37;
+  var a38;
+  var a39;
+  var a40;
+  var a41;
+  var a42;
+  var a43;
+  var a44;
+  var a45;
+  var a46;
+  var a47;
+  var a48;
+  var a49;
+  var a50;
+  var a51;
+  var a52;
+  var a53;
+  var a54;
+  var a55;
+  var a56;
+  var a57;
+  var a58;
+  var a59;
+  var a60;
+  var a61;
+  var a62;
+  var a63;
+  var a64;
+  var a65;
+  var a66;
+  var a67;
+  var a68;
+  var a69;
+  var a70;
+  var a71;
+  var a72;
+  var a73;
+  var a74;
+  var a75;
+  var a76;
+  var a77;
+  var a78;
+  var a79;
+  var a80;
+  var a81;
+  var a82;
+  var a83;
+  var a84;
+  var a85;
+  var a86;
+  var a87;
+  var a88;
+  var a89;
+  var a90;
+  var a91;
+  var a92;
+  var a93;
+  var a94;
+  var a95;
+  var a96;
+  var a97;
+  var a98;
+  var a99;
+  var a100;
+  var a101;
+  var a102;
+  var a103;
+  var a104;
+  var a105;
+  var a106;
+  var a107;
+  var a108;
+  var a109;
+  var a110;
+  var a111;
+  var a112;
+  var a113;
+  var a114;
+  var a115;
+  var a116;
+  var a117;
+  var a118;
+  var a119;
+  var a120;
+  var a121;
+  var a122;
+  var a123;
+  var a124;
+  var a125;
+  var a126;
+  var a127;
+  var a128;
+  var a129;
+  var a130;
+  var a131;
+  var a132;
+  var a133;
+  var a134;
+  var a135;
+  var a136;
+  var a137;
+  var a138;
+  var a139;
+  var a140;
+  var a141;
+  var a142;
+  var a143;
+  var a144;
+  var a145;
+  var a146;
+  var a147;
+  var a148;
+  var a149;
+  var a150;
+  var a151;
+  var a152;
+  var a153;
+  var a154;
+  var a155;
+  var a156;
+  var a157;
+  var a158;
+  var a159;
+  var a160;
+  var a161;
+  var a162;
+  var a163;
+  var a164;
+  var a165;
+  var a166;
+  var a167;
+  var a168;
+  var a169;
+  var a170;
+  var a171;
+  var a172;
+  var a173;
+  var a174;
+  var a175;
+  var a176;
+  var a177;
+  var a178;
+  var a179;
+  var a180;
+  var a181;
+  var a182;
+  var a183;
+  var a184;
+  var a185;
+  var a186;
+  var a187;
+  var a188;
+  var a189;
+  var a190;
+  var a191;
+  var a192;
+  var a193;
+  var a194;
+  var a195;
+  var a196;
+  var a197;
+  var a198;
+  var a199;
+  var a200;
+  var a201;
+  var a202;
+  var a203;
+  var a204;
+  var a205;
+  var a206;
+  var a207;
+  var a208;
+  var a209;
+  var a210;
+  var a211;
+  var a212;
+  var a213;
+  var a214;
+  var a215;
+  var a216;
+  var a217;
+  var a218;
+  var a219;
+  var a220;
+  var a221;
+  var a222;
+  var a223;
+  var a224;
+  var a225;
+  var a226;
+  var a227;
+  var a228;
+  var a229;
+  var a230;
+  var a231;
+  var a232;
+  var a233;
+  var a234;
+  var a235;
+  var a236;
+  var a237;
+  var a238;
+  var a239;
+  var a240;
+  var a241;
+  var a242;
+  var a243;
+  var a244;
+  var a245;
+  var a246;
+  var a247;
+  var a248;
+  var a249;
+  var a250;
+  var a251;
+  var a252;
+  var a253;
+  var a254;
+  var a255;
+  var a256;
+  var a257;
+  var a258;
+  var a259;
+  var a260;
+  var a261;
+  var a262;
+  var a263;
+  var a264;
+  var a265;
+  var a266;
+  var a267;
+  var a268;
+  var a269;
+  var a270;
+  var a271;
+  var a272;
+  var a273;
+  var a274;
+  var a275;
+  var a276;
+  var a277;
+  var a278;
+  var a279;
+  var a280;
+  var a281;
+  var a282;
+  var a283;
+  var a284;
+  var a285;
+  var a286;
+  var a287;
+  var a288;
+  var a289;
+  var a290;
+  var a291;
+  var a292;
+  var a293;
+  var a294;
+  var a295;
+  var a296;
+  var a297;
+  var a298;
+  var a299;
+  var a300;
+  var a301;
+  var a302;
+  var a303;
+  var a304;
+  var a305;
+  var a306;
+  var a307;
+  var a308;
+  var a309;
+  var a310;
+  var a311;
+  var a312;
+  var a313;
+  var a314;
+  var a315;
+  var a316;
+  var a317;
+  var a318;
+  var a319;
+  var a320;
+  var a321;
+  var a322;
+  var a323;
+  var a324;
+  var a325;
+  var a326;
+  var a327;
+  var a328;
+  var a329;
+  var a330;
+  var a331;
+  var a332;
+  var a333;
+  var a334;
+  var a335;
+  var a336;
+  var a337;
+  var a338;
+  var a339;
+  var a340;
+  var a341;
+  var a342;
+  var a343;
+  var a344;
+  var a345;
+  var a346;
+  var a347;
+  var a348;
+  var a349;
+  var a350;
+  var a351;
+  var a352;
+  var a353;
+  var a354;
+  var a355;
+  var a356;
+  var a357;
+  var a358;
+  var a359;
+  var a360;
+  var a361;
+  var a362;
+  var a363;
+  var a364;
+  var a365;
+  var a366;
+  var a367;
+  var a368;
+  var a369;
+  var a370;
+  var a371;
+  var a372;
+  var a373;
+  var a374;
+  var a375;
+  var a376;
+  var a377;
+  var a378;
+  var a379;
+  var a380;
+  var a381;
+  var a382;
+  var a383;
+  var a384;
+  var a385;
+  var a386;
+  var a387;
+  var a388;
+  var a389;
+  var a390;
+  var a391;
+  var a392;
+  var a393;
+  var a394;
+  var a395;
+  var a396;
+  var a397;
+  var a398;
+  var a399;
+  var a400;
+  var a401;
+  var a402;
+  var a403;
+  var a404;
+  var a405;
+  var a406;
+  var a407;
+  var a408;
+  var a409;
+  var a410;
+  var a411;
+  var a412;
+  var a413;
+  var a414;
+  var a415;
+  var a416;
+  var a417;
+  var a418;
+  var a419;
+  var a420;
+  var a421;
+  var a422;
+  var a423;
+  var a424;
+  var a425;
+  var a426;
+  var a427;
+  var a428;
+  var a429;
+  var a430;
+  var a431;
+  var a432;
+  var a433;
+  var a434;
+  var a435;
+  var a436;
+  var a437;
+  var a438;
+  var a439;
+  var a440;
+  var a441;
+  var a442;
+  var a443;
+  var a444;
+  var a445;
+  var a446;
+  var a447;
+  var a448;
+  var a449;
+  var a450;
+  var a451;
+  var a452;
+  var a453;
+  var a454;
+  var a455;
+  var a456;
+  var a457;
+  var a458;
+  var a459;
+  var a460;
+  var a461;
+  var a462;
+  var a463;
+  var a464;
+  var a465;
+  var a466;
+  var a467;
+  var a468;
+  var a469;
+  var a470;
+  var a471;
+  var a472;
+  var a473;
+  var a474;
+  var a475;
+  var a476;
+  var a477;
+  var a478;
+  var a479;
+  var a480;
+  var a481;
+  var a482;
+  var a483;
+  var a484;
+  var a485;
+  var a486;
+  var a487;
+  var a488;
+  var a489;
+  var a490;
+  var a491;
+  var a492;
+  var a493;
+  var a494;
+  var a495;
+  var a496;
+  var a497;
+  var a498;
+  var a499;
+  var a500;
+  var a501;
+  var a502;
+  var a503;
+  var a504;
+  var a505;
+  var a506;
+  var a507;
+  var a508;
+  var a509;
+  var a510;
+  var a511;
+  var a512;
+  var a513;
+  var a514;
+  var a515;
+  var a516;
+  var a517;
+  var a518;
+  var a519;
+  var a520;
+  var a521;
+  var a522;
+  var a523;
+  var a524;
+  var a525;
+  var a526;
+  var a527;
+  var a528;
+  var a529;
+  var a530;
+  var a531;
+  var a532;
+  var a533;
+  var a534;
+  var a535;
+  var a536;
+  var a537;
+  var a538;
+  var a539;
+  var a540;
+  var a541;
+  var a542;
+  var a543;
+  var a544;
+  var a545;
+  var a546;
+  var a547;
+  var a548;
+  var a549;
+  var a550;
+  var a551;
+  var a552;
+  var a553;
+  var a554;
+  var a555;
+  var a556;
+  var a557;
+  var a558;
+  var a559;
+  var a560;
+  var a561;
+  var a562;
+  var a563;
+  var a564;
+  var a565;
+  var a566;
+  var a567;
+  var a568;
+  var a569;
+  var a570;
+  var a571;
+  var a572;
+  var a573;
+  var a574;
+  var a575;
+  var a576;
+  var a577;
+  var a578;
+  var a579;
+  var a580;
+  var a581;
+  var a582;
+  var a583;
+  var a584;
+  var a585;
+  var a586;
+  var a587;
+  var a588;
+  var a589;
+  var a590;
+  var a591;
+  var a592;
+  var a593;
+  var a594;
+  var a595;
+  var a596;
+  var a597;
+  var a598;
+  var a599;
+  var a600;
+  var a601;
+  var a602;
+  var a603;
+  var a604;
+  var a605;
+  var a606;
+  var a607;
+  var a608;
+  var a609;
+  var a610;
+  var a611;
+  var a612;
+  var a613;
+  var a614;
+  var a615;
+  var a616;
+  var a617;
+  var a618;
+  var a619;
+  var a620;
+  var a621;
+  var a622;
+  var a623;
+  var a624;
+  var a625;
+  var a626;
+  var a627;
+  var a628;
+  var a629;
+  var a630;
+  var a631;
+  var a632;
+  var a633;
+  var a634;
+  var a635;
+  var a636;
+  var a637;
+  var a638;
+  var a639;
+  var a640;
+  var a641;
+  var a642;
+  var a643;
+  var a644;
+  var a645;
+  var a646;
+  var a647;
+  var a648;
+  var a649;
+  var a650;
+  var a651;
+  var a652;
+  var a653;
+  var a654;
+  var a655;
+  var a656;
+  var a657;
+  var a658;
+  var a659;
+  var a660;
+  var a661;
+  var a662;
+  var a663;
+  var a664;
+  var a665;
+  var a666;
+  var a667;
+  var a668;
+  var a669;
+  var a670;
+  var a671;
+  var a672;
+  var a673;
+  var a674;
+  var a675;
+  var a676;
+  var a677;
+  var a678;
+  var a679;
+  var a680;
+  var a681;
+  var a682;
+  var a683;
+  var a684;
+  var a685;
+  var a686;
+  var a687;
+  var a688;
+  var a689;
+  var a690;
+  var a691;
+  var a692;
+  var a693;
+  var a694;
+  var a695;
+  var a696;
+  var a697;
+  var a698;
+  var a699;
+  var a700;
+  var a701;
+  var a702;
+  var a703;
+  var a704;
+  var a705;
+  var a706;
+  var a707;
+  var a708;
+  var a709;
+  var a710;
+  var a711;
+  var a712;
+  var a713;
+  var a714;
+  var a715;
+  var a716;
+  var a717;
+  var a718;
+  var a719;
+  var a720;
+  var a721;
+  var a722;
+  var a723;
+  var a724;
+  var a725;
+  var a726;
+  var a727;
+  var a728;
+  var a729;
+  var a730;
+  var a731;
+  var a732;
+  var a733;
+  var a734;
+  var a735;
+  var a736;
+  var a737;
+  var a738;
+  var a739;
+  var a740;
+  var a741;
+  var a742;
+  var a743;
+  var a744;
+  var a745;
+  var a746;
+  var a747;
+  var a748;
+  var a749;
+  var a750;
+  var a751;
+  var a752;
+  var a753;
+  var a754;
+  var a755;
+  var a756;
+  var a757;
+  var a758;
+  var a759;
+  var a760;
+  var a761;
+  var a762;
+  var a763;
+  var a764;
+  var a765;
+  var a766;
+  var a767;
+  var a768;
+  var a769;
+  var a770;
+  var a771;
+  var a772;
+  var a773;
+  var a774;
+  var a775;
+  var a776;
+  var a777;
+  var a778;
+  var a779;
+  var a780;
+  var a781;
+  var a782;
+  var a783;
+  var a784;
+  var a785;
+  var a786;
+  var a787;
+  var a788;
+  var a789;
+  var a790;
+  var a791;
+  var a792;
+  var a793;
+  var a794;
+  var a795;
+  var a796;
+  var a797;
+  var a798;
+  var a799;
+  var a800;
+  var a801;
+  var a802;
+  var a803;
+  var a804;
+  var a805;
+  var a806;
+  var a807;
+  var a808;
+  var a809;
+  var a810;
+  var a811;
+  var a812;
+  var a813;
+  var a814;
+  var a815;
+  var a816;
+  var a817;
+  var a818;
+  var a819;
+  var a820;
+  var a821;
+  var a822;
+  var a823;
+  var a824;
+  var a825;
+  var a826;
+  var a827;
+  var a828;
+  var a829;
+  var a830;
+  var a831;
+  var a832;
+  var a833;
+  var a834;
+  var a835;
+  var a836;
+  var a837;
+  var a838;
+  var a839;
+  var a840;
+  var a841;
+  var a842;
+  var a843;
+  var a844;
+  var a845;
+  var a846;
+  var a847;
+  var a848;
+  var a849;
+  var a850;
+  var a851;
+  var a852;
+  var a853;
+  var a854;
+  var a855;
+  var a856;
+  var a857;
+  var a858;
+  var a859;
+  var a860;
+  var a861;
+  var a862;
+  var a863;
+  var a864;
+  var a865;
+  var a866;
+  var a867;
+  var a868;
+  var a869;
+  var a870;
+  var a871;
+  var a872;
+  var a873;
+  var a874;
+  var a875;
+  var a876;
+  var a877;
+  var a878;
+  var a879;
+  var a880;
+  var a881;
+  var a882;
+  var a883;
+  var a884;
+  var a885;
+  var a886;
+  var a887;
+  var a888;
+  var a889;
+  var a890;
+  var a891;
+  var a892;
+  var a893;
+  var a894;
+  var a895;
+  var a896;
+  var a897;
+  var a898;
+  var a899;
+  var a900;
+  var a901;
+  var a902;
+  var a903;
+  var a904;
+  var a905;
+  var a906;
+  var a907;
+  var a908;
+  var a909;
+  var a910;
+  var a911;
+  var a912;
+  var a913;
+  var a914;
+  var a915;
+  var a916;
+  var a917;
+  var a918;
+  var a919;
+  var a920;
+  var a921;
+  var a922;
+  var a923;
+  var a924;
+  var a925;
+  var a926;
+  var a927;
+  var a928;
+  var a929;
+  var a930;
+  var a931;
+  var a932;
+  var a933;
+  var a934;
+  var a935;
+  var a936;
+  var a937;
+  var a938;
+  var a939;
+  var a940;
+  var a941;
+  var a942;
+  var a943;
+  var a944;
+  var a945;
+  var a946;
+  var a947;
+  var a948;
+  var a949;
+  var a950;
+  var a951;
+  var a952;
+  var a953;
+  var a954;
+  var a955;
+  var a956;
+  var a957;
+  var a958;
+  var a959;
+  var a960;
+  var a961;
+  var a962;
+  var a963;
+  var a964;
+  var a965;
+  var a966;
+  var a967;
+  var a968;
+  var a969;
+  var a970;
+  var a971;
+  var a972;
+  var a973;
+  var a974;
+  var a975;
+  var a976;
+  var a977;
+  var a978;
+  var a979;
+  var a980;
+  var a981;
+  var a982;
+  var a983;
+  var a984;
+  var a985;
+  var a986;
+  var a987;
+  var a988;
+  var a989;
+  var a990;
+  var a991;
+  var a992;
+  var a993;
+  var a994;
+  var a995;
+  var a996;
+  var a997;
+  var a998;
+  var a999;
+  var a1000;
+  var a1001;
+  var a1002;
+  var a1003;
+  var a1004;
+  var a1005;
+  var a1006;
+  var a1007;
+  var a1008;
+  var a1009;
+  var a1010;
+  var a1011;
+  var a1012;
+  var a1013;
+  var a1014;
+  var a1015;
+  var a1016;
+  var a1017;
+  var a1018;
+  var a1019;
+  var a1020;
+  var a1021;
+  var a1022;
+  var a1023;
+  var a1024;
+  var a1025;
+  var a1026;
+  var a1027;
+  var a1028;
+  var a1029;
+  var a1030;
+  var a1031;
+  var a1032;
+  var a1033;
+  var a1034;
+  var a1035;
+  var a1036;
+  var a1037;
+  var a1038;
+  var a1039;
+  var a1040;
+  var a1041;
+  var a1042;
+  var a1043;
+  var a1044;
+  var a1045;
+  var a1046;
+  var a1047;
+  var a1048;
+  var a1049;
+  var a1050;
+  var a1051;
+  var a1052;
+  var a1053;
+  var a1054;
+  var a1055;
+  var a1056;
+  var a1057;
+  var a1058;
+  var a1059;
+  var a1060;
+  var a1061;
+  var a1062;
+  var a1063;
+  var a1064;
+  var a1065;
+  var a1066;
+  var a1067;
+  var a1068;
+  var a1069;
+  var a1070;
+  var a1071;
+  var a1072;
+  var a1073;
+  var a1074;
+  var a1075;
+  var a1076;
+  var a1077;
+  var a1078;
+  var a1079;
+  var a1080;
+  var a1081;
+  var a1082;
+  var a1083;
+  var a1084;
+  var a1085;
+  var a1086;
+  var a1087;
+  var a1088;
+  var a1089;
+  var a1090;
+  var a1091;
+  var a1092;
+  var a1093;
+  var a1094;
+  var a1095;
+  var a1096;
+  var a1097;
+  var a1098;
+  var a1099;
+  var a1100;
+  var a1101;
+  var a1102;
+  var a1103;
+  var a1104;
+  var a1105;
+  var a1106;
+  var a1107;
+  var a1108;
+  var a1109;
+  var a1110;
+  var a1111;
+  var a1112;
+  var a1113;
+  var a1114;
+  var a1115;
+  var a1116;
+  var a1117;
+  var a1118;
+  var a1119;
+  var a1120;
+  var a1121;
+  var a1122;
+  var a1123;
+  var a1124;
+  var a1125;
+  var a1126;
+  var a1127;
+  var a1128;
+  var a1129;
+  var a1130;
+  var a1131;
+  var a1132;
+  var a1133;
+  var a1134;
+  var a1135;
+  var a1136;
+  var a1137;
+  var a1138;
+  var a1139;
+  var a1140;
+  var a1141;
+  var a1142;
+  var a1143;
+  var a1144;
+  var a1145;
+  var a1146;
+  var a1147;
+  var a1148;
+  var a1149;
+  var a1150;
+  var a1151;
+  var a1152;
+  var a1153;
+  var a1154;
+  var a1155;
+  var a1156;
+  var a1157;
+  var a1158;
+  var a1159;
+  var a1160;
+  var a1161;
+  var a1162;
+  var a1163;
+  var a1164;
+  var a1165;
+  var a1166;
+  var a1167;
+  var a1168;
+  var a1169;
+  var a1170;
+  var a1171;
+  var a1172;
+  var a1173;
+  var a1174;
+  var a1175;
+  var a1176;
+  var a1177;
+  var a1178;
+  var a1179;
+  var a1180;
+  var a1181;
+  var a1182;
+  var a1183;
+  var a1184;
+  var a1185;
+  var a1186;
+  var a1187;
+  var a1188;
+  var a1189;
+  var a1190;
+  var a1191;
+  var a1192;
+  var a1193;
+  var a1194;
+  var a1195;
+  var a1196;
+  var a1197;
+  var a1198;
+  var a1199;
+  var a1200;
+  var a1201;
+  var a1202;
+  var a1203;
+  var a1204;
+  var a1205;
+  var a1206;
+  var a1207;
+  var a1208;
+  var a1209;
+  var a1210;
+  var a1211;
+  var a1212;
+  var a1213;
+  var a1214;
+  var a1215;
+  var a1216;
+  var a1217;
+  var a1218;
+  var a1219;
+  var a1220;
+  var a1221;
+  var a1222;
+  var a1223;
+  var a1224;
+  var a1225;
+  var a1226;
+  var a1227;
+  var a1228;
+  var a1229;
+  var a1230;
+  var a1231;
+  var a1232;
+  var a1233;
+  var a1234;
+  var a1235;
+  var a1236;
+  var a1237;
+  var a1238;
+  var a1239;
+  var a1240;
+  var a1241;
+  var a1242;
+  var a1243;
+  var a1244;
+  var a1245;
+  var a1246;
+  var a1247;
+  var a1248;
+  var a1249;
+  var a1250;
+  var a1251;
+  var a1252;
+  var a1253;
+  var a1254;
+  var a1255;
+  var a1256;
+  var a1257;
+  var a1258;
+  var a1259;
+  var a1260;
+  var a1261;
+  var a1262;
+  var a1263;
+  var a1264;
+  var a1265;
+  var a1266;
+  var a1267;
+  var a1268;
+  var a1269;
+  var a1270;
+  var a1271;
+  var a1272;
+  var a1273;
+  var a1274;
+  var a1275;
+  var a1276;
+  var a1277;
+  var a1278;
+  var a1279;
+  var a1280;
+  var a1281;
+  var a1282;
+  var a1283;
+  var a1284;
+  var a1285;
+  var a1286;
+  var a1287;
+  var a1288;
+  var a1289;
+  var a1290;
+  var a1291;
+  var a1292;
+  var a1293;
+  var a1294;
+  var a1295;
+  var a1296;
+  var a1297;
+  var a1298;
+  var a1299;
+  var a1300;
+  var a1301;
+  var a1302;
+  var a1303;
+  var a1304;
+  var a1305;
+  var a1306;
+  var a1307;
+  var a1308;
+  var a1309;
+  var a1310;
+  var a1311;
+  var a1312;
+  var a1313;
+  var a1314;
+  var a1315;
+  var a1316;
+  var a1317;
+  var a1318;
+  var a1319;
+  var a1320;
+  var a1321;
+  var a1322;
+  var a1323;
+  var a1324;
+  var a1325;
+  var a1326;
+  var a1327;
+  var a1328;
+  var a1329;
+  var a1330;
+  var a1331;
+  var a1332;
+  var a1333;
+  var a1334;
+  var a1335;
+  var a1336;
+  var a1337;
+  var a1338;
+  var a1339;
+  var a1340;
+  var a1341;
+  var a1342;
+  var a1343;
+  var a1344;
+  var a1345;
+  var a1346;
+  var a1347;
+  var a1348;
+  var a1349;
+  var a1350;
+  var a1351;
+  var a1352;
+  var a1353;
+  var a1354;
+  var a1355;
+  var a1356;
+  var a1357;
+  var a1358;
+  var a1359;
+  var a1360;
+  var a1361;
+  var a1362;
+  var a1363;
+  var a1364;
+  var a1365;
+  var a1366;
+  var a1367;
+  var a1368;
+  var a1369;
+  var a1370;
+  var a1371;
+  var a1372;
+  var a1373;
+  var a1374;
+  var a1375;
+  var a1376;
+  var a1377;
+  var a1378;
+  var a1379;
+  var a1380;
+  var a1381;
+  var a1382;
+  var a1383;
+  var a1384;
+  var a1385;
+  var a1386;
+  var a1387;
+  var a1388;
+  var a1389;
+  var a1390;
+  var a1391;
+  var a1392;
+  var a1393;
+  var a1394;
+  var a1395;
+  var a1396;
+  var a1397;
+  var a1398;
+  var a1399;
+  var a1400;
+  var a1401;
+  var a1402;
+  var a1403;
+  var a1404;
+  var a1405;
+  var a1406;
+  var a1407;
+  var a1408;
+  var a1409;
+  var a1410;
+  var a1411;
+  var a1412;
+  var a1413;
+  var a1414;
+  var a1415;
+  var a1416;
+  var a1417;
+  var a1418;
+  var a1419;
+  var a1420;
+  var a1421;
+  var a1422;
+  var a1423;
+  var a1424;
+  var a1425;
+  var a1426;
+  var a1427;
+  var a1428;
+  var a1429;
+  var a1430;
+  var a1431;
+  var a1432;
+  var a1433;
+  var a1434;
+  var a1435;
+  var a1436;
+  var a1437;
+  var a1438;
+  var a1439;
+  var a1440;
+  var a1441;
+  var a1442;
+  var a1443;
+  var a1444;
+  var a1445;
+  var a1446;
+  var a1447;
+  var a1448;
+  var a1449;
+  var a1450;
+  var a1451;
+  var a1452;
+  var a1453;
+  var a1454;
+  var a1455;
+  var a1456;
+  var a1457;
+  var a1458;
+  var a1459;
+  var a1460;
+  var a1461;
+  var a1462;
+  var a1463;
+  var a1464;
+  var a1465;
+  var a1466;
+  var a1467;
+  var a1468;
+  var a1469;
+  var a1470;
+  var a1471;
+  var a1472;
+  var a1473;
+  var a1474;
+  var a1475;
+  var a1476;
+  var a1477;
+  var a1478;
+  var a1479;
+  var a1480;
+  var a1481;
+  var a1482;
+  var a1483;
+  var a1484;
+  var a1485;
+  var a1486;
+  var a1487;
+  var a1488;
+  var a1489;
+  var a1490;
+  var a1491;
+  var a1492;
+  var a1493;
+  var a1494;
+  var a1495;
+  var a1496;
+  var a1497;
+  var a1498;
+  var a1499;
+  var a1500;
+  var a1501;
+  var a1502;
+  var a1503;
+  var a1504;
+  var a1505;
+  var a1506;
+  var a1507;
+  var a1508;
+  var a1509;
+  var a1510;
+  var a1511;
+  var a1512;
+  var a1513;
+  var a1514;
+  var a1515;
+  var a1516;
+  var a1517;
+  var a1518;
+  var a1519;
+  var a1520;
+  var a1521;
+  var a1522;
+  var a1523;
+  var a1524;
+  var a1525;
+  var a1526;
+  var a1527;
+  var a1528;
+  var a1529;
+  var a1530;
+  var a1531;
+  var a1532;
+  var a1533;
+  var a1534;
+  var a1535;
+  var a1536;
+  var a1537;
+  var a1538;
+  var a1539;
+  var a1540;
+  var a1541;
+  var a1542;
+  var a1543;
+  var a1544;
+  var a1545;
+  var a1546;
+  var a1547;
+  var a1548;
+  var a1549;
+  var a1550;
+  var a1551;
+  var a1552;
+  var a1553;
+  var a1554;
+  var a1555;
+  var a1556;
+  var a1557;
+  var a1558;
+  var a1559;
+  var a1560;
+  var a1561;
+  var a1562;
+  var a1563;
+  var a1564;
+  var a1565;
+  var a1566;
+  var a1567;
+  var a1568;
+  var a1569;
+  var a1570;
+  var a1571;
+  var a1572;
+  var a1573;
+  var a1574;
+  var a1575;
+  var a1576;
+  var a1577;
+  var a1578;
+  var a1579;
+  var a1580;
+  var a1581;
+  var a1582;
+  var a1583;
+  var a1584;
+  var a1585;
+  var a1586;
+  var a1587;
+  var a1588;
+  var a1589;
+  var a1590;
+  var a1591;
+  var a1592;
+  var a1593;
+  var a1594;
+  var a1595;
+  var a1596;
+  var a1597;
+  var a1598;
+  var a1599;
+  var a1600;
+  var a1601;
+  var a1602;
+  var a1603;
+  var a1604;
+  var a1605;
+  var a1606;
+  var a1607;
+  var a1608;
+  var a1609;
+  var a1610;
+  var a1611;
+  var a1612;
+  var a1613;
+  var a1614;
+  var a1615;
+  var a1616;
+  var a1617;
+  var a1618;
+  var a1619;
+  var a1620;
+  var a1621;
+  var a1622;
+  var a1623;
+  var a1624;
+  var a1625;
+  var a1626;
+  var a1627;
+  var a1628;
+  var a1629;
+  var a1630;
+  var a1631;
+  var a1632;
+  var a1633;
+  var a1634;
+  var a1635;
+  var a1636;
+  var a1637;
+  var a1638;
+  var a1639;
+  var a1640;
+  var a1641;
+  var a1642;
+  var a1643;
+  var a1644;
+  var a1645;
+  var a1646;
+  var a1647;
+  var a1648;
+  var a1649;
+  var a1650;
+  var a1651;
+  var a1652;
+  var a1653;
+  var a1654;
+  var a1655;
+  var a1656;
+  var a1657;
+  var a1658;
+  var a1659;
+  var a1660;
+  var a1661;
+  var a1662;
+  var a1663;
+  var a1664;
+  var a1665;
+  var a1666;
+  var a1667;
+  var a1668;
+  var a1669;
+  var a1670;
+  var a1671;
+  var a1672;
+  var a1673;
+  var a1674;
+  var a1675;
+  var a1676;
+  var a1677;
+  var a1678;
+  var a1679;
+  var a1680;
+  var a1681;
+  var a1682;
+  var a1683;
+  var a1684;
+  var a1685;
+  var a1686;
+  var a1687;
+  var a1688;
+  var a1689;
+  var a1690;
+  var a1691;
+  var a1692;
+  var a1693;
+  var a1694;
+  var a1695;
+  var a1696;
+  var a1697;
+  var a1698;
+  var a1699;
+  var a1700;
+  var a1701;
+  var a1702;
+  var a1703;
+  var a1704;
+  var a1705;
+  var a1706;
+  var a1707;
+  var a1708;
+  var a1709;
+  var a1710;
+  var a1711;
+  var a1712;
+  var a1713;
+  var a1714;
+  var a1715;
+  var a1716;
+  var a1717;
+  var a1718;
+  var a1719;
+  var a1720;
+  var a1721;
+  var a1722;
+  var a1723;
+  var a1724;
+  var a1725;
+  var a1726;
+  var a1727;
+  var a1728;
+  var a1729;
+  var a1730;
+  var a1731;
+  var a1732;
+  var a1733;
+  var a1734;
+  var a1735;
+  var a1736;
+  var a1737;
+  var a1738;
+  var a1739;
+  var a1740;
+  var a1741;
+  var a1742;
+  var a1743;
+  var a1744;
+  var a1745;
+  var a1746;
+  var a1747;
+  var a1748;
+  var a1749;
+  var a1750;
+  var a1751;
+  var a1752;
+  var a1753;
+  var a1754;
+  var a1755;
+  var a1756;
+  var a1757;
+  var a1758;
+  var a1759;
+  var a1760;
+  var a1761;
+  var a1762;
+  var a1763;
+  var a1764;
+  var a1765;
+  var a1766;
+  var a1767;
+  var a1768;
+  var a1769;
+  var a1770;
+  var a1771;
+  var a1772;
+  var a1773;
+  var a1774;
+  var a1775;
+  var a1776;
+  var a1777;
+  var a1778;
+  var a1779;
+  var a1780;
+  var a1781;
+  var a1782;
+  var a1783;
+  var a1784;
+  var a1785;
+  var a1786;
+  var a1787;
+  var a1788;
+  var a1789;
+  var a1790;
+  var a1791;
+  var a1792;
+  var a1793;
+  var a1794;
+  var a1795;
+  var a1796;
+  var a1797;
+  var a1798;
+  var a1799;
+  var a1800;
+  var a1801;
+  var a1802;
+  var a1803;
+  var a1804;
+  var a1805;
+  var a1806;
+  var a1807;
+  var a1808;
+  var a1809;
+  var a1810;
+  var a1811;
+  var a1812;
+  var a1813;
+  var a1814;
+  var a1815;
+  var a1816;
+  var a1817;
+  var a1818;
+  var a1819;
+  var a1820;
+  var a1821;
+  var a1822;
+  var a1823;
+  var a1824;
+  var a1825;
+  var a1826;
+  var a1827;
+  var a1828;
+  var a1829;
+  var a1830;
+  var a1831;
+  var a1832;
+  var a1833;
+  var a1834;
+  var a1835;
+  var a1836;
+  var a1837;
+  var a1838;
+  var a1839;
+  var a1840;
+  var a1841;
+  var a1842;
+  var a1843;
+  var a1844;
+  var a1845;
+  var a1846;
+  var a1847;
+  var a1848;
+  var a1849;
+  var a1850;
+  var a1851;
+  var a1852;
+  var a1853;
+  var a1854;
+  var a1855;
+  var a1856;
+  var a1857;
+  var a1858;
+  var a1859;
+  var a1860;
+  var a1861;
+  var a1862;
+  var a1863;
+  var a1864;
+  var a1865;
+  var a1866;
+  var a1867;
+  var a1868;
+  var a1869;
+  var a1870;
+  var a1871;
+  var a1872;
+  var a1873;
+  var a1874;
+  var a1875;
+  var a1876;
+  var a1877;
+  var a1878;
+  var a1879;
+  var a1880;
+  var a1881;
+  var a1882;
+  var a1883;
+  var a1884;
+  var a1885;
+  var a1886;
+  var a1887;
+  var a1888;
+  var a1889;
+  var a1890;
+  var a1891;
+  var a1892;
+  var a1893;
+  var a1894;
+  var a1895;
+  var a1896;
+  var a1897;
+  var a1898;
+  var a1899;
+  var a1900;
+  var a1901;
+  var a1902;
+  var a1903;
+  var a1904;
+  var a1905;
+  var a1906;
+  var a1907;
+  var a1908;
+  var a1909;
+  var a1910;
+  var a1911;
+  var a1912;
+  var a1913;
+  var a1914;
+  var a1915;
+  var a1916;
+  var a1917;
+  var a1918;
+  var a1919;
+  var a1920;
+  var a1921;
+  var a1922;
+  var a1923;
+  var a1924;
+  var a1925;
+  var a1926;
+  var a1927;
+  var a1928;
+  var a1929;
+  var a1930;
+  var a1931;
+  var a1932;
+  var a1933;
+  var a1934;
+  var a1935;
+  var a1936;
+  var a1937;
+  var a1938;
+  var a1939;
+  var a1940;
+  var a1941;
+  var a1942;
+  var a1943;
+  var a1944;
+  var a1945;
+  var a1946;
+  var a1947;
+  var a1948;
+  var a1949;
+  var a1950;
+  var a1951;
+  var a1952;
+  var a1953;
+  var a1954;
+  var a1955;
+  var a1956;
+  var a1957;
+  var a1958;
+  var a1959;
+  var a1960;
+  var a1961;
+  var a1962;
+  var a1963;
+  var a1964;
+  var a1965;
+  var a1966;
+  var a1967;
+  var a1968;
+  var a1969;
+  var a1970;
+  var a1971;
+  var a1972;
+  var a1973;
+  var a1974;
+  var a1975;
+  var a1976;
+  var a1977;
+  var a1978;
+  var a1979;
+  var a1980;
+  var a1981;
+  var a1982;
+  var a1983;
+  var a1984;
+  var a1985;
+  var a1986;
+  var a1987;
+  var a1988;
+  var a1989;
+  var a1990;
+  var a1991;
+  var a1992;
+  var a1993;
+  var a1994;
+  var a1995;
+  var a1996;
+  var a1997;
+  var a1998;
+  var a1999;
+  var a2000;
+  var a2001;
+  var a2002;
+  var a2003;
+  var a2004;
+  var a2005;
+  var a2006;
+  var a2007;
+  var a2008;
+  var a2009;
+  var a2010;
+  var a2011;
+  var a2012;
+  var a2013;
+  var a2014;
+  var a2015;
+  var a2016;
+  var a2017;
+  var a2018;
+  var a2019;
+  var a2020;
+  var a2021;
+  var a2022;
+  var a2023;
+  var a2024;
+  var a2025;
+  var a2026;
+  var a2027;
+  var a2028;
+  var a2029;
+  var a2030;
+  var a2031;
+  var a2032;
+  var a2033;
+  var a2034;
+  var a2035;
+  var a2036;
+  var a2037;
+  var a2038;
+  var a2039;
+  var a2040;
+  var a2041;
+  var a2042;
+  var a2043;
+  var a2044;
+  var a2045;
+  var a2046;
+  var a2047;
+  var a2048;
+  var a2049;
+  var a2050;
+  var a2051;
+  var a2052;
+  var a2053;
+  var a2054;
+  var a2055;
+  var a2056;
+  var a2057;
+  var a2058;
+  var a2059;
+  var a2060;
+  var a2061;
+  var a2062;
+  var a2063;
+  var a2064;
+  var a2065;
+  var a2066;
+  var a2067;
+  var a2068;
+  var a2069;
+  var a2070;
+  var a2071;
+  var a2072;
+  var a2073;
+  var a2074;
+  var a2075;
+  var a2076;
+  var a2077;
+  var a2078;
+  var a2079;
+  var a2080;
+  var a2081;
+  var a2082;
+  var a2083;
+  var a2084;
+  var a2085;
+  var a2086;
+  var a2087;
+  var a2088;
+  var a2089;
+  var a2090;
+  var a2091;
+  var a2092;
+  var a2093;
+  var a2094;
+  var a2095;
+  var a2096;
+  var a2097;
+  var a2098;
+  var a2099;
+  var a2100;
+  var a2101;
+  var a2102;
+  var a2103;
+  var a2104;
+  var a2105;
+  var a2106;
+  var a2107;
+  var a2108;
+  var a2109;
+  var a2110;
+  var a2111;
+  var a2112;
+  var a2113;
+  var a2114;
+  var a2115;
+  var a2116;
+  var a2117;
+  var a2118;
+  var a2119;
+  var a2120;
+  var a2121;
+  var a2122;
+  var a2123;
+  var a2124;
+  var a2125;
+  var a2126;
+  var a2127;
+  var a2128;
+  var a2129;
+  var a2130;
+  var a2131;
+  var a2132;
+  var a2133;
+  var a2134;
+  var a2135;
+  var a2136;
+  var a2137;
+  var a2138;
+  var a2139;
+  var a2140;
+  var a2141;
+  var a2142;
+  var a2143;
+  var a2144;
+  var a2145;
+  var a2146;
+  var a2147;
+  var a2148;
+  var a2149;
+  var a2150;
+  var a2151;
+  var a2152;
+  var a2153;
+  var a2154;
+  var a2155;
+  var a2156;
+  var a2157;
+  var a2158;
+  var a2159;
+  var a2160;
+  var a2161;
+  var a2162;
+  var a2163;
+  var a2164;
+  var a2165;
+  var a2166;
+  var a2167;
+  var a2168;
+  var a2169;
+  var a2170;
+  var a2171;
+  var a2172;
+  var a2173;
+  var a2174;
+  var a2175;
+  var a2176;
+  var a2177;
+  var a2178;
+  var a2179;
+  var a2180;
+  var a2181;
+  var a2182;
+  var a2183;
+  var a2184;
+  var a2185;
+  var a2186;
+  var a2187;
+  var a2188;
+  var a2189;
+  var a2190;
+  var a2191;
+  var a2192;
+  var a2193;
+  var a2194;
+  var a2195;
+  var a2196;
+  var a2197;
+  var a2198;
+  var a2199;
+  var a2200;
+  var a2201;
+  var a2202;
+  var a2203;
+  var a2204;
+  var a2205;
+  var a2206;
+  var a2207;
+  var a2208;
+  var a2209;
+  var a2210;
+  var a2211;
+  var a2212;
+  var a2213;
+  var a2214;
+  var a2215;
+  var a2216;
+  var a2217;
+  var a2218;
+  var a2219;
+  var a2220;
+  var a2221;
+  var a2222;
+  var a2223;
+  var a2224;
+  var a2225;
+  var a2226;
+  var a2227;
+  var a2228;
+  var a2229;
+  var a2230;
+  var a2231;
+  var a2232;
+  var a2233;
+  var a2234;
+  var a2235;
+  var a2236;
+  var a2237;
+  var a2238;
+  var a2239;
+  var a2240;
+  var a2241;
+  var a2242;
+  var a2243;
+  var a2244;
+  var a2245;
+  var a2246;
+  var a2247;
+  var a2248;
+  var a2249;
+  var a2250;
+  var a2251;
+  var a2252;
+  var a2253;
+  var a2254;
+  var a2255;
+  var a2256;
+  var a2257;
+  var a2258;
+  var a2259;
+  var a2260;
+  var a2261;
+  var a2262;
+  var a2263;
+  var a2264;
+  var a2265;
+  var a2266;
+  var a2267;
+  var a2268;
+  var a2269;
+  var a2270;
+  var a2271;
+  var a2272;
+  var a2273;
+  var a2274;
+  var a2275;
+  var a2276;
+  var a2277;
+  var a2278;
+  var a2279;
+  var a2280;
+  var a2281;
+  var a2282;
+  var a2283;
+  var a2284;
+  var a2285;
+  var a2286;
+  var a2287;
+  var a2288;
+  var a2289;
+  var a2290;
+  var a2291;
+  var a2292;
+  var a2293;
+  var a2294;
+  var a2295;
+  var a2296;
+  var a2297;
+  var a2298;
+  var a2299;
+  var a2300;
+  var a2301;
+  var a2302;
+  var a2303;
+  var a2304;
+  var a2305;
+  var a2306;
+  var a2307;
+  var a2308;
+  var a2309;
+  var a2310;
+  var a2311;
+  var a2312;
+  var a2313;
+  var a2314;
+  var a2315;
+  var a2316;
+  var a2317;
+  var a2318;
+  var a2319;
+  var a2320;
+  var a2321;
+  var a2322;
+  var a2323;
+  var a2324;
+  var a2325;
+  var a2326;
+  var a2327;
+  var a2328;
+  var a2329;
+  var a2330;
+  var a2331;
+  var a2332;
+  var a2333;
+  var a2334;
+  var a2335;
+  var a2336;
+  var a2337;
+  var a2338;
+  var a2339;
+  var a2340;
+  var a2341;
+  var a2342;
+  var a2343;
+  var a2344;
+  var a2345;
+  var a2346;
+  var a2347;
+  var a2348;
+  var a2349;
+  var a2350;
+  var a2351;
+  var a2352;
+  var a2353;
+  var a2354;
+  var a2355;
+  var a2356;
+  var a2357;
+  var a2358;
+  var a2359;
+  var a2360;
+  var a2361;
+  var a2362;
+  var a2363;
+  var a2364;
+  var a2365;
+  var a2366;
+  var a2367;
+  var a2368;
+  var a2369;
+  var a2370;
+  var a2371;
+  var a2372;
+  var a2373;
+  var a2374;
+  var a2375;
+  var a2376;
+  var a2377;
+  var a2378;
+  var a2379;
+  var a2380;
+  var a2381;
+  var a2382;
+  var a2383;
+  var a2384;
+  var a2385;
+  var a2386;
+  var a2387;
+  var a2388;
+  var a2389;
+  var a2390;
+  var a2391;
+  var a2392;
+  var a2393;
+  var a2394;
+  var a2395;
+  var a2396;
+  var a2397;
+  var a2398;
+  var a2399;
+  var a2400;
+  var a2401;
+  var a2402;
+  var a2403;
+  var a2404;
+  var a2405;
+  var a2406;
+  var a2407;
+  var a2408;
+  var a2409;
+  var a2410;
+  var a2411;
+  var a2412;
+  var a2413;
+  var a2414;
+  var a2415;
+  var a2416;
+  var a2417;
+  var a2418;
+  var a2419;
+  var a2420;
+  var a2421;
+  var a2422;
+  var a2423;
+  var a2424;
+  var a2425;
+  var a2426;
+  var a2427;
+  var a2428;
+  var a2429;
+  var a2430;
+  var a2431;
+  var a2432;
+  var a2433;
+  var a2434;
+  var a2435;
+  var a2436;
+  var a2437;
+  var a2438;
+  var a2439;
+  var a2440;
+  var a2441;
+  var a2442;
+  var a2443;
+  var a2444;
+  var a2445;
+  var a2446;
+  var a2447;
+  var a2448;
+  var a2449;
+  var a2450;
+  var a2451;
+  var a2452;
+  var a2453;
+  var a2454;
+  var a2455;
+  var a2456;
+  var a2457;
+  var a2458;
+  var a2459;
+  var a2460;
+  var a2461;
+  var a2462;
+  var a2463;
+  var a2464;
+  var a2465;
+  var a2466;
+  var a2467;
+  var a2468;
+  var a2469;
+  var a2470;
+  var a2471;
+  var a2472;
+  var a2473;
+  var a2474;
+  var a2475;
+  var a2476;
+  var a2477;
+  var a2478;
+  var a2479;
+  var a2480;
+  var a2481;
+  var a2482;
+  var a2483;
+  var a2484;
+  var a2485;
+  var a2486;
+  var a2487;
+  var a2488;
+  var a2489;
+  var a2490;
+  var a2491;
+  var a2492;
+  var a2493;
+  var a2494;
+  var a2495;
+  var a2496;
+  var a2497;
+  var a2498;
+  var a2499;
+  var a2500;
+  var a2501;
+  var a2502;
+  var a2503;
+  var a2504;
+  var a2505;
+  var a2506;
+  var a2507;
+  var a2508;
+  var a2509;
+  var a2510;
+  var a2511;
+  var a2512;
+  var a2513;
+  var a2514;
+  var a2515;
+  var a2516;
+  var a2517;
+  var a2518;
+  var a2519;
+  var a2520;
+  var a2521;
+  var a2522;
+  var a2523;
+  var a2524;
+  var a2525;
+  var a2526;
+  var a2527;
+  var a2528;
+  var a2529;
+  var a2530;
+  var a2531;
+  var a2532;
+  var a2533;
+  var a2534;
+  var a2535;
+  var a2536;
+  var a2537;
+  var a2538;
+  var a2539;
+  var a2540;
+  var a2541;
+  var a2542;
+  var a2543;
+  var a2544;
+  var a2545;
+  var a2546;
+  var a2547;
+  var a2548;
+  var a2549;
+  var a2550;
+  var a2551;
+  var a2552;
+  var a2553;
+  var a2554;
+  var a2555;
+  var a2556;
+  var a2557;
+  var a2558;
+  var a2559;
+  var a2560;
+  var a2561;
+  var a2562;
+  var a2563;
+  var a2564;
+  var a2565;
+  var a2566;
+  var a2567;
+  var a2568;
+  var a2569;
+  var a2570;
+  var a2571;
+  var a2572;
+  var a2573;
+  var a2574;
+  var a2575;
+  var a2576;
+  var a2577;
+  var a2578;
+  var a2579;
+  var a2580;
+  var a2581;
+  var a2582;
+  var a2583;
+  var a2584;
+  var a2585;
+  var a2586;
+  var a2587;
+  var a2588;
+  var a2589;
+  var a2590;
+  var a2591;
+  var a2592;
+  var a2593;
+  var a2594;
+  var a2595;
+  var a2596;
+  var a2597;
+  var a2598;
+  var a2599;
+  var a2600;
+  var a2601;
+  var a2602;
+  var a2603;
+  var a2604;
+  var a2605;
+  var a2606;
+  var a2607;
+  var a2608;
+  var a2609;
+  var a2610;
+  var a2611;
+  var a2612;
+  var a2613;
+  var a2614;
+  var a2615;
+  var a2616;
+  var a2617;
+  var a2618;
+  var a2619;
+  var a2620;
+  var a2621;
+  var a2622;
+  var a2623;
+  var a2624;
+  var a2625;
+  var a2626;
+  var a2627;
+  var a2628;
+  var a2629;
+  var a2630;
+  var a2631;
+  var a2632;
+  var a2633;
+  var a2634;
+  var a2635;
+  var a2636;
+  var a2637;
+  var a2638;
+  var a2639;
+  var a2640;
+  var a2641;
+  var a2642;
+  var a2643;
+  var a2644;
+  var a2645;
+  var a2646;
+  var a2647;
+  var a2648;
+  var a2649;
+  var a2650;
+  var a2651;
+  var a2652;
+  var a2653;
+  var a2654;
+  var a2655;
+  var a2656;
+  var a2657;
+  var a2658;
+  var a2659;
+  var a2660;
+  var a2661;
+  var a2662;
+  var a2663;
+  var a2664;
+  var a2665;
+  var a2666;
+  var a2667;
+  var a2668;
+  var a2669;
+  var a2670;
+  var a2671;
+  var a2672;
+  var a2673;
+  var a2674;
+  var a2675;
+  var a2676;
+  var a2677;
+  var a2678;
+  var a2679;
+  var a2680;
+  var a2681;
+  var a2682;
+  var a2683;
+  var a2684;
+  var a2685;
+  var a2686;
+  var a2687;
+  var a2688;
+  var a2689;
+  var a2690;
+  var a2691;
+  var a2692;
+  var a2693;
+  var a2694;
+  var a2695;
+  var a2696;
+  var a2697;
+  var a2698;
+  var a2699;
+  var a2700;
+  var a2701;
+  var a2702;
+  var a2703;
+  var a2704;
+  var a2705;
+  var a2706;
+  var a2707;
+  var a2708;
+  var a2709;
+  var a2710;
+  var a2711;
+  var a2712;
+  var a2713;
+  var a2714;
+  var a2715;
+  var a2716;
+  var a2717;
+  var a2718;
+  var a2719;
+  var a2720;
+  var a2721;
+  var a2722;
+  var a2723;
+  var a2724;
+  var a2725;
+  var a2726;
+  var a2727;
+  var a2728;
+  var a2729;
+  var a2730;
+  var a2731;
+  var a2732;
+  var a2733;
+  var a2734;
+  var a2735;
+  var a2736;
+  var a2737;
+  var a2738;
+  var a2739;
+  var a2740;
+  var a2741;
+  var a2742;
+  var a2743;
+  var a2744;
+  var a2745;
+  var a2746;
+  var a2747;
+  var a2748;
+  var a2749;
+  var a2750;
+  var a2751;
+  var a2752;
+  var a2753;
+  var a2754;
+  var a2755;
+  var a2756;
+  var a2757;
+  var a2758;
+  var a2759;
+  var a2760;
+  var a2761;
+  var a2762;
+  var a2763;
+  var a2764;
+  var a2765;
+  var a2766;
+  var a2767;
+  var a2768;
+  var a2769;
+  var a2770;
+  var a2771;
+  var a2772;
+  var a2773;
+  var a2774;
+  var a2775;
+  var a2776;
+  var a2777;
+  var a2778;
+  var a2779;
+  var a2780;
+  var a2781;
+  var a2782;
+  var a2783;
+  var a2784;
+  var a2785;
+  var a2786;
+  var a2787;
+  var a2788;
+  var a2789;
+  var a2790;
+  var a2791;
+  var a2792;
+  var a2793;
+  var a2794;
+  var a2795;
+  var a2796;
+  var a2797;
+  var a2798;
+  var a2799;
+  var a2800;
+  var a2801;
+  var a2802;
+  var a2803;
+  var a2804;
+  var a2805;
+  var a2806;
+  var a2807;
+  var a2808;
+  var a2809;
+  var a2810;
+  var a2811;
+  var a2812;
+  var a2813;
+  var a2814;
+  var a2815;
+  var a2816;
+  var a2817;
+  var a2818;
+  var a2819;
+  var a2820;
+  var a2821;
+  var a2822;
+  var a2823;
+  var a2824;
+  var a2825;
+  var a2826;
+  var a2827;
+  var a2828;
+  var a2829;
+  var a2830;
+  var a2831;
+  var a2832;
+  var a2833;
+  var a2834;
+  var a2835;
+  var a2836;
+  var a2837;
+  var a2838;
+  var a2839;
+  var a2840;
+  var a2841;
+  var a2842;
+  var a2843;
+  var a2844;
+  var a2845;
+  var a2846;
+  var a2847;
+  var a2848;
+  var a2849;
+  var a2850;
+  var a2851;
+  var a2852;
+  var a2853;
+  var a2854;
+  var a2855;
+  var a2856;
+  var a2857;
+  var a2858;
+  var a2859;
+  var a2860;
+  var a2861;
+  var a2862;
+  var a2863;
+  var a2864;
+  var a2865;
+  var a2866;
+  var a2867;
+  var a2868;
+  var a2869;
+  var a2870;
+  var a2871;
+  var a2872;
+  var a2873;
+  var a2874;
+  var a2875;
+  var a2876;
+  var a2877;
+  var a2878;
+  var a2879;
+  var a2880;
+  var a2881;
+  var a2882;
+  var a2883;
+  var a2884;
+  var a2885;
+  var a2886;
+  var a2887;
+  var a2888;
+  var a2889;
+  var a2890;
+  var a2891;
+  var a2892;
+  var a2893;
+  var a2894;
+  var a2895;
+  var a2896;
+  var a2897;
+  var a2898;
+  var a2899;
+  var a2900;
+  var a2901;
+  var a2902;
+  var a2903;
+  var a2904;
+  var a2905;
+  var a2906;
+  var a2907;
+  var a2908;
+  var a2909;
+  var a2910;
+  var a2911;
+  var a2912;
+  var a2913;
+  var a2914;
+  var a2915;
+  var a2916;
+  var a2917;
+  var a2918;
+  var a2919;
+  var a2920;
+  var a2921;
+  var a2922;
+  var a2923;
+  var a2924;
+  var a2925;
+  var a2926;
+  var a2927;
+  var a2928;
+  var a2929;
+  var a2930;
+  var a2931;
+  var a2932;
+  var a2933;
+  var a2934;
+  var a2935;
+  var a2936;
+  var a2937;
+  var a2938;
+  var a2939;
+  var a2940;
+  var a2941;
+  var a2942;
+  var a2943;
+  var a2944;
+  var a2945;
+  var a2946;
+  var a2947;
+  var a2948;
+  var a2949;
+  var a2950;
+  var a2951;
+  var a2952;
+  var a2953;
+  var a2954;
+  var a2955;
+  var a2956;
+  var a2957;
+  var a2958;
+  var a2959;
+  var a2960;
+  var a2961;
+  var a2962;
+  var a2963;
+  var a2964;
+  var a2965;
+  var a2966;
+  var a2967;
+  var a2968;
+  var a2969;
+  var a2970;
+  var a2971;
+  var a2972;
+  var a2973;
+  var a2974;
+  var a2975;
+  var a2976;
+  var a2977;
+  var a2978;
+  var a2979;
+  var a2980;
+  var a2981;
+  var a2982;
+  var a2983;
+  var a2984;
+  var a2985;
+  var a2986;
+  var a2987;
+  var a2988;
+  var a2989;
+  var a2990;
+  var a2991;
+  var a2992;
+  var a2993;
+  var a2994;
+  var a2995;
+  var a2996;
+  var a2997;
+  var a2998;
+  var a2999;
+  var a3000;
+  var a3001;
+  var a3002;
+  var a3003;
+  var a3004;
+  var a3005;
+  var a3006;
+  var a3007;
+  var a3008;
+  var a3009;
+  var a3010;
+  var a3011;
+  var a3012;
+  var a3013;
+  var a3014;
+  var a3015;
+  var a3016;
+  var a3017;
+  var a3018;
+  var a3019;
+  var a3020;
+  var a3021;
+  var a3022;
+  var a3023;
+  var a3024;
+  var a3025;
+  var a3026;
+  var a3027;
+  var a3028;
+  var a3029;
+  var a3030;
+  var a3031;
+  var a3032;
+  var a3033;
+  var a3034;
+  var a3035;
+  var a3036;
+  var a3037;
+  var a3038;
+  var a3039;
+  var a3040;
+  var a3041;
+  var a3042;
+  var a3043;
+  var a3044;
+  var a3045;
+  var a3046;
+  var a3047;
+  var a3048;
+  var a3049;
+  var a3050;
+  var a3051;
+  var a3052;
+  var a3053;
+  var a3054;
+  var a3055;
+  var a3056;
+  var a3057;
+  var a3058;
+  var a3059;
+  var a3060;
+  var a3061;
+  var a3062;
+  var a3063;
+  var a3064;
+  var a3065;
+  var a3066;
+  var a3067;
+  var a3068;
+  var a3069;
+  var a3070;
+  var a3071;
+  var a3072;
+  var a3073;
+  var a3074;
+  var a3075;
+  var a3076;
+  var a3077;
+  var a3078;
+  var a3079;
+  var a3080;
+  var a3081;
+  var a3082;
+  var a3083;
+  var a3084;
+  var a3085;
+  var a3086;
+  var a3087;
+  var a3088;
+  var a3089;
+  var a3090;
+  var a3091;
+  var a3092;
+  var a3093;
+  var a3094;
+  var a3095;
+  var a3096;
+  var a3097;
+  var a3098;
+  var a3099;
+  var a3100;
+  var a3101;
+  var a3102;
+  var a3103;
+  var a3104;
+  var a3105;
+  var a3106;
+  var a3107;
+  var a3108;
+  var a3109;
+  var a3110;
+  var a3111;
+  var a3112;
+  var a3113;
+  var a3114;
+  var a3115;
+  var a3116;
+  var a3117;
+  var a3118;
+  var a3119;
+  var a3120;
+  var a3121;
+  var a3122;
+  var a3123;
+  var a3124;
+  var a3125;
+  var a3126;
+  var a3127;
+  var a3128;
+  var a3129;
+  var a3130;
+  var a3131;
+  var a3132;
+  var a3133;
+  var a3134;
+  var a3135;
+  var a3136;
+  var a3137;
+  var a3138;
+  var a3139;
+  var a3140;
+  var a3141;
+  var a3142;
+  var a3143;
+  var a3144;
+  var a3145;
+  var a3146;
+  var a3147;
+  var a3148;
+  var a3149;
+  var a3150;
+  var a3151;
+  var a3152;
+  var a3153;
+  var a3154;
+  var a3155;
+  var a3156;
+  var a3157;
+  var a3158;
+  var a3159;
+  var a3160;
+  var a3161;
+  var a3162;
+  var a3163;
+  var a3164;
+  var a3165;
+  var a3166;
+  var a3167;
+  var a3168;
+  var a3169;
+  var a3170;
+  var a3171;
+  var a3172;
+  var a3173;
+  var a3174;
+  var a3175;
+  var a3176;
+  var a3177;
+  var a3178;
+  var a3179;
+  var a3180;
+  var a3181;
+  var a3182;
+  var a3183;
+  var a3184;
+  var a3185;
+  var a3186;
+  var a3187;
+  var a3188;
+  var a3189;
+  var a3190;
+  var a3191;
+  var a3192;
+  var a3193;
+  var a3194;
+  var a3195;
+  var a3196;
+  var a3197;
+  var a3198;
+  var a3199;
+  var a3200;
+  var a3201;
+  var a3202;
+  var a3203;
+  var a3204;
+  var a3205;
+  var a3206;
+  var a3207;
+  var a3208;
+  var a3209;
+  var a3210;
+  var a3211;
+  var a3212;
+  var a3213;
+  var a3214;
+  var a3215;
+  var a3216;
+  var a3217;
+  var a3218;
+  var a3219;
+  var a3220;
+  var a3221;
+  var a3222;
+  var a3223;
+  var a3224;
+  var a3225;
+  var a3226;
+  var a3227;
+  var a3228;
+  var a3229;
+  var a3230;
+  var a3231;
+  var a3232;
+  var a3233;
+  var a3234;
+  var a3235;
+  var a3236;
+  var a3237;
+  var a3238;
+  var a3239;
+  var a3240;
+  var a3241;
+  var a3242;
+  var a3243;
+  var a3244;
+  var a3245;
+  var a3246;
+  var a3247;
+  var a3248;
+  var a3249;
+  var a3250;
+  var a3251;
+  var a3252;
+  var a3253;
+  var a3254;
+  var a3255;
+  var a3256;
+  var a3257;
+  var a3258;
+  var a3259;
+  var a3260;
+  var a3261;
+  var a3262;
+  var a3263;
+  var a3264;
+  var a3265;
+  var a3266;
+  var a3267;
+  var a3268;
+  var a3269;
+  var a3270;
+  var a3271;
+  var a3272;
+  var a3273;
+  var a3274;
+  var a3275;
+  var a3276;
+  var a3277;
+  var a3278;
+  var a3279;
+  var a3280;
+  var a3281;
+  var a3282;
+  var a3283;
+  var a3284;
+  var a3285;
+  var a3286;
+  var a3287;
+  var a3288;
+  var a3289;
+  var a3290;
+  var a3291;
+  var a3292;
+  var a3293;
+  var a3294;
+  var a3295;
+  var a3296;
+  var a3297;
+  var a3298;
+  var a3299;
+  var a3300;
+  var a3301;
+  var a3302;
+  var a3303;
+  var a3304;
+  var a3305;
+  var a3306;
+  var a3307;
+  var a3308;
+  var a3309;
+  var a3310;
+  var a3311;
+  var a3312;
+  var a3313;
+  var a3314;
+  var a3315;
+  var a3316;
+  var a3317;
+  var a3318;
+  var a3319;
+  var a3320;
+  var a3321;
+  var a3322;
+  var a3323;
+  var a3324;
+  var a3325;
+  var a3326;
+  var a3327;
+  var a3328;
+  var a3329;
+  var a3330;
+  var a3331;
+  var a3332;
+  var a3333;
+  var a3334;
+  var a3335;
+  var a3336;
+  var a3337;
+  var a3338;
+  var a3339;
+  var a3340;
+  var a3341;
+  var a3342;
+  var a3343;
+  var a3344;
+  var a3345;
+  var a3346;
+  var a3347;
+  var a3348;
+  var a3349;
+  var a3350;
+  var a3351;
+  var a3352;
+  var a3353;
+  var a3354;
+  var a3355;
+  var a3356;
+  var a3357;
+  var a3358;
+  var a3359;
+  var a3360;
+  var a3361;
+  var a3362;
+  var a3363;
+  var a3364;
+  var a3365;
+  var a3366;
+  var a3367;
+  var a3368;
+  var a3369;
+  var a3370;
+  var a3371;
+  var a3372;
+  var a3373;
+  var a3374;
+  var a3375;
+  var a3376;
+  var a3377;
+  var a3378;
+  var a3379;
+  var a3380;
+  var a3381;
+  var a3382;
+  var a3383;
+  var a3384;
+  var a3385;
+  var a3386;
+  var a3387;
+  var a3388;
+  var a3389;
+  var a3390;
+  var a3391;
+  var a3392;
+  var a3393;
+  var a3394;
+  var a3395;
+  var a3396;
+  var a3397;
+  var a3398;
+  var a3399;
+  var a3400;
+  var a3401;
+  var a3402;
+  var a3403;
+  var a3404;
+  var a3405;
+  var a3406;
+  var a3407;
+  var a3408;
+  var a3409;
+  var a3410;
+  var a3411;
+  var a3412;
+  var a3413;
+  var a3414;
+  var a3415;
+  var a3416;
+  var a3417;
+  var a3418;
+  var a3419;
+  var a3420;
+  var a3421;
+  var a3422;
+  var a3423;
+  var a3424;
+  var a3425;
+  var a3426;
+  var a3427;
+  var a3428;
+  var a3429;
+  var a3430;
+  var a3431;
+  var a3432;
+  var a3433;
+  var a3434;
+  var a3435;
+  var a3436;
+  var a3437;
+  var a3438;
+  var a3439;
+  var a3440;
+  var a3441;
+  var a3442;
+  var a3443;
+  var a3444;
+  var a3445;
+  var a3446;
+  var a3447;
+  var a3448;
+  var a3449;
+  var a3450;
+  var a3451;
+  var a3452;
+  var a3453;
+  var a3454;
+  var a3455;
+  var a3456;
+  var a3457;
+  var a3458;
+  var a3459;
+  var a3460;
+  var a3461;
+  var a3462;
+  var a3463;
+  var a3464;
+  var a3465;
+  var a3466;
+  var a3467;
+  var a3468;
+  var a3469;
+  var a3470;
+  var a3471;
+  var a3472;
+  var a3473;
+  var a3474;
+  var a3475;
+  var a3476;
+  var a3477;
+  var a3478;
+  var a3479;
+  var a3480;
+  var a3481;
+  var a3482;
+  var a3483;
+  var a3484;
+  var a3485;
+  var a3486;
+  var a3487;
+  var a3488;
+  var a3489;
+  var a3490;
+  var a3491;
+  var a3492;
+  var a3493;
+  var a3494;
+  var a3495;
+  var a3496;
+  var a3497;
+  var a3498;
+  var a3499;
+  var a3500;
+  var a3501;
+  var a3502;
+  var a3503;
+  var a3504;
+  var a3505;
+  var a3506;
+  var a3507;
+  var a3508;
+  var a3509;
+  var a3510;
+  var a3511;
+  var a3512;
+  var a3513;
+  var a3514;
+  var a3515;
+  var a3516;
+  var a3517;
+  var a3518;
+  var a3519;
+  var a3520;
+  var a3521;
+  var a3522;
+  var a3523;
+  var a3524;
+  var a3525;
+  var a3526;
+  var a3527;
+  var a3528;
+  var a3529;
+  var a3530;
+  var a3531;
+  var a3532;
+  var a3533;
+  var a3534;
+  var a3535;
+  var a3536;
+  var a3537;
+  var a3538;
+  var a3539;
+  var a3540;
+  var a3541;
+  var a3542;
+  var a3543;
+  var a3544;
+  var a3545;
+  var a3546;
+  var a3547;
+  var a3548;
+  var a3549;
+  var a3550;
+  var a3551;
+  var a3552;
+  var a3553;
+  var a3554;
+  var a3555;
+  var a3556;
+  var a3557;
+  var a3558;
+  var a3559;
+  var a3560;
+  var a3561;
+  var a3562;
+  var a3563;
+  var a3564;
+  var a3565;
+  var a3566;
+  var a3567;
+  var a3568;
+  var a3569;
+  var a3570;
+  var a3571;
+  var a3572;
+  var a3573;
+  var a3574;
+  var a3575;
+  var a3576;
+  var a3577;
+  var a3578;
+  var a3579;
+  var a3580;
+  var a3581;
+  var a3582;
+  var a3583;
+  var a3584;
+  var a3585;
+  var a3586;
+  var a3587;
+  var a3588;
+  var a3589;
+  var a3590;
+  var a3591;
+  var a3592;
+  var a3593;
+  var a3594;
+  var a3595;
+  var a3596;
+  var a3597;
+  var a3598;
+  var a3599;
+  var a3600;
+  var a3601;
+  var a3602;
+  var a3603;
+  var a3604;
+  var a3605;
+  var a3606;
+  var a3607;
+  var a3608;
+  var a3609;
+  var a3610;
+  var a3611;
+  var a3612;
+  var a3613;
+  var a3614;
+  var a3615;
+  var a3616;
+  var a3617;
+  var a3618;
+  var a3619;
+  var a3620;
+  var a3621;
+  var a3622;
+  var a3623;
+  var a3624;
+  var a3625;
+  var a3626;
+  var a3627;
+  var a3628;
+  var a3629;
+  var a3630;
+  var a3631;
+  var a3632;
+  var a3633;
+  var a3634;
+  var a3635;
+  var a3636;
+  var a3637;
+  var a3638;
+  var a3639;
+  var a3640;
+  var a3641;
+  var a3642;
+  var a3643;
+  var a3644;
+  var a3645;
+  var a3646;
+  var a3647;
+  var a3648;
+  var a3649;
+  var a3650;
+  var a3651;
+  var a3652;
+  var a3653;
+  var a3654;
+  var a3655;
+  var a3656;
+  var a3657;
+  var a3658;
+  var a3659;
+  var a3660;
+  var a3661;
+  var a3662;
+  var a3663;
+  var a3664;
+  var a3665;
+  var a3666;
+  var a3667;
+  var a3668;
+  var a3669;
+  var a3670;
+  var a3671;
+  var a3672;
+  var a3673;
+  var a3674;
+  var a3675;
+  var a3676;
+  var a3677;
+  var a3678;
+  var a3679;
+  var a3680;
+  var a3681;
+  var a3682;
+  var a3683;
+  var a3684;
+  var a3685;
+  var a3686;
+  var a3687;
+  var a3688;
+  var a3689;
+  var a3690;
+  var a3691;
+  var a3692;
+  var a3693;
+  var a3694;
+  var a3695;
+  var a3696;
+  var a3697;
+  var a3698;
+  var a3699;
+  var a3700;
+  var a3701;
+  var a3702;
+  var a3703;
+  var a3704;
+  var a3705;
+  var a3706;
+  var a3707;
+  var a3708;
+  var a3709;
+  var a3710;
+  var a3711;
+  var a3712;
+  var a3713;
+  var a3714;
+  var a3715;
+  var a3716;
+  var a3717;
+  var a3718;
+  var a3719;
+  var a3720;
+  var a3721;
+  var a3722;
+  var a3723;
+  var a3724;
+  var a3725;
+  var a3726;
+  var a3727;
+  var a3728;
+  var a3729;
+  var a3730;
+  var a3731;
+  var a3732;
+  var a3733;
+  var a3734;
+  var a3735;
+  var a3736;
+  var a3737;
+  var a3738;
+  var a3739;
+  var a3740;
+  var a3741;
+  var a3742;
+  var a3743;
+  var a3744;
+  var a3745;
+  var a3746;
+  var a3747;
+  var a3748;
+  var a3749;
+  var a3750;
+  var a3751;
+  var a3752;
+  var a3753;
+  var a3754;
+  var a3755;
+  var a3756;
+  var a3757;
+  var a3758;
+  var a3759;
+  var a3760;
+  var a3761;
+  var a3762;
+  var a3763;
+  var a3764;
+  var a3765;
+  var a3766;
+  var a3767;
+  var a3768;
+  var a3769;
+  var a3770;
+  var a3771;
+  var a3772;
+  var a3773;
+  var a3774;
+  var a3775;
+  var a3776;
+  var a3777;
+  var a3778;
+  var a3779;
+  var a3780;
+  var a3781;
+  var a3782;
+  var a3783;
+  var a3784;
+  var a3785;
+  var a3786;
+  var a3787;
+  var a3788;
+  var a3789;
+  var a3790;
+  var a3791;
+  var a3792;
+  var a3793;
+  var a3794;
+  var a3795;
+  var a3796;
+  var a3797;
+  var a3798;
+  var a3799;
+  var a3800;
+  var a3801;
+  var a3802;
+  var a3803;
+  var a3804;
+  var a3805;
+  var a3806;
+  var a3807;
+  var a3808;
+  var a3809;
+  var a3810;
+  var a3811;
+  var a3812;
+  var a3813;
+  var a3814;
+  var a3815;
+  var a3816;
+  var a3817;
+  var a3818;
+  var a3819;
+  var a3820;
+  var a3821;
+  var a3822;
+  var a3823;
+  var a3824;
+  var a3825;
+  var a3826;
+  var a3827;
+  var a3828;
+  var a3829;
+  var a3830;
+  var a3831;
+  var a3832;
+  var a3833;
+  var a3834;
+  var a3835;
+  var a3836;
+  var a3837;
+  var a3838;
+  var a3839;
+  var a3840;
+  var a3841;
+  var a3842;
+  var a3843;
+  var a3844;
+  var a3845;
+  var a3846;
+  var a3847;
+  var a3848;
+  var a3849;
+  var a3850;
+  var a3851;
+  var a3852;
+  var a3853;
+  var a3854;
+  var a3855;
+  var a3856;
+  var a3857;
+  var a3858;
+  var a3859;
+  var a3860;
+  var a3861;
+  var a3862;
+  var a3863;
+  var a3864;
+  var a3865;
+  var a3866;
+  var a3867;
+  var a3868;
+  var a3869;
+  var a3870;
+  var a3871;
+  var a3872;
+  var a3873;
+  var a3874;
+  var a3875;
+  var a3876;
+  var a3877;
+  var a3878;
+  var a3879;
+  var a3880;
+  var a3881;
+  var a3882;
+  var a3883;
+  var a3884;
+  var a3885;
+  var a3886;
+  var a3887;
+  var a3888;
+  var a3889;
+  var a3890;
+  var a3891;
+  var a3892;
+  var a3893;
+  var a3894;
+  var a3895;
+  var a3896;
+  var a3897;
+  var a3898;
+  var a3899;
+  var a3900;
+  var a3901;
+  var a3902;
+  var a3903;
+  var a3904;
+  var a3905;
+  var a3906;
+  var a3907;
+  var a3908;
+  var a3909;
+  var a3910;
+  var a3911;
+  var a3912;
+  var a3913;
+  var a3914;
+  var a3915;
+  var a3916;
+  var a3917;
+  var a3918;
+  var a3919;
+  var a3920;
+  var a3921;
+  var a3922;
+  var a3923;
+  var a3924;
+  var a3925;
+  var a3926;
+  var a3927;
+  var a3928;
+  var a3929;
+  var a3930;
+  var a3931;
+  var a3932;
+  var a3933;
+  var a3934;
+  var a3935;
+  var a3936;
+  var a3937;
+  var a3938;
+  var a3939;
+  var a3940;
+  var a3941;
+  var a3942;
+  var a3943;
+  var a3944;
+  var a3945;
+  var a3946;
+  var a3947;
+  var a3948;
+  var a3949;
+  var a3950;
+  var a3951;
+  var a3952;
+  var a3953;
+  var a3954;
+  var a3955;
+  var a3956;
+  var a3957;
+  var a3958;
+  var a3959;
+  var a3960;
+  var a3961;
+  var a3962;
+  var a3963;
+  var a3964;
+  var a3965;
+  var a3966;
+  var a3967;
+  var a3968;
+  var a3969;
+  var a3970;
+  var a3971;
+  var a3972;
+  var a3973;
+  var a3974;
+  var a3975;
+  var a3976;
+  var a3977;
+  var a3978;
+  var a3979;
+  var a3980;
+  var a3981;
+  var a3982;
+  var a3983;
+  var a3984;
+  var a3985;
+  var a3986;
+  var a3987;
+  var a3988;
+  var a3989;
+  var a3990;
+  var a3991;
+  var a3992;
+  var a3993;
+  var a3994;
+  var a3995;
+  var a3996;
+  var a3997;
+  var a3998;
+  var a3999;
+  var a4000;
+  var a4001;
+  var a4002;
+  var a4003;
+  var a4004;
+  var a4005;
+  var a4006;
+  var a4007;
+  var a4008;
+  var a4009;
+  var a4010;
+  var a4011;
+  var a4012;
+  var a4013;
+  var a4014;
+  var a4015;
+  var a4016;
+  var a4017;
+  var a4018;
+  var a4019;
+  var a4020;
+  var a4021;
+  var a4022;
+  var a4023;
+  var a4024;
+  var a4025;
+  var a4026;
+  var a4027;
+  var a4028;
+  var a4029;
+  var a4030;
+  var a4031;
+  var a4032;
+  var a4033;
+  var a4034;
+  var a4035;
+  var a4036;
+  var a4037;
+  var a4038;
+  var a4039;
+  var a4040;
+  var a4041;
+  var a4042;
+  var a4043;
+  var a4044;
+  var a4045;
+  var a4046;
+  var a4047;
+  var a4048;
+  var a4049;
+  var a4050;
+  var a4051;
+  var a4052;
+  var a4053;
+  var a4054;
+  var a4055;
+  var a4056;
+  var a4057;
+  var a4058;
+  var a4059;
+  var a4060;
+  var a4061;
+  var a4062;
+  var a4063;
+  var a4064;
+  var a4065;
+  var a4066;
+  var a4067;
+  var a4068;
+  var a4069;
+  var a4070;
+  var a4071;
+  var a4072;
+  var a4073;
+  var a4074;
+  var a4075;
+  var a4076;
+  var a4077;
+  var a4078;
+  var a4079;
+  var a4080;
+  var a4081;
+  var a4082;
+  var a4083;
+  var a4084;
+  var a4085;
+  var a4086;
+  var a4087;
+  var a4088;
+  var a4089;
+  var a4090;
+  var a4091;
+  var a4092;
+  var a4093;
+  var a4094;
+  var a4095;
+  var a4096;
+  var a4097;
+  var a4098;
+  var a4099;
+  var a4100;
+  var a4101;
+  var a4102;
+  var a4103;
+  var a4104;
+  var a4105;
+  var a4106;
+  var a4107;
+  var a4108;
+  var a4109;
+  var a4110;
+  var a4111;
+  var a4112;
+  var a4113;
+  var a4114;
+  var a4115;
+  var a4116;
+  var a4117;
+  var a4118;
+  var a4119;
+  var a4120;
+  var a4121;
+  var a4122;
+  var a4123;
+  var a4124;
+  var a4125;
+  var a4126;
+  var a4127;
+  var a4128;
+  var a4129;
+  var a4130;
+  var a4131;
+  var a4132;
+  var a4133;
+  var a4134;
+  var a4135;
+  var a4136;
+  var a4137;
+  var a4138;
+  var a4139;
+  var a4140;
+  var a4141;
+  var a4142;
+  var a4143;
+  var a4144;
+  var a4145;
+  var a4146;
+  var a4147;
+  var a4148;
+  var a4149;
+  var a4150;
+  var a4151;
+  var a4152;
+  var a4153;
+  var a4154;
+  var a4155;
+  var a4156;
+  var a4157;
+  var a4158;
+  var a4159;
+  var a4160;
+  var a4161;
+  var a4162;
+  var a4163;
+  var a4164;
+  var a4165;
+  var a4166;
+  var a4167;
+  var a4168;
+  var a4169;
+  var a4170;
+  var a4171;
+  var a4172;
+  var a4173;
+  var a4174;
+  var a4175;
+  var a4176;
+  var a4177;
+  var a4178;
+  var a4179;
+  var a4180;
+  var a4181;
+  var a4182;
+  var a4183;
+  var a4184;
+  var a4185;
+  var a4186;
+  var a4187;
+  var a4188;
+  var a4189;
+  var a4190;
+  var a4191;
+  var a4192;
+  var a4193;
+  var a4194;
+  var a4195;
+  var a4196;
+  var a4197;
+  var a4198;
+  var a4199;
+  var a4200;
+  var a4201;
+  var a4202;
+  var a4203;
+  var a4204;
+  var a4205;
+  var a4206;
+  var a4207;
+  var a4208;
+  var a4209;
+  var a4210;
+  var a4211;
+  var a4212;
+  var a4213;
+  var a4214;
+  var a4215;
+  var a4216;
+  var a4217;
+  var a4218;
+  var a4219;
+  var a4220;
+  var a4221;
+  var a4222;
+  var a4223;
+  var a4224;
+  var a4225;
+  var a4226;
+  var a4227;
+  var a4228;
+  var a4229;
+  var a4230;
+  var a4231;
+  var a4232;
+  var a4233;
+  var a4234;
+  var a4235;
+  var a4236;
+  var a4237;
+  var a4238;
+  var a4239;
+  var a4240;
+  var a4241;
+  var a4242;
+  var a4243;
+  var a4244;
+  var a4245;
+  var a4246;
+  var a4247;
+  var a4248;
+  var a4249;
+  var a4250;
+  var a4251;
+  var a4252;
+  var a4253;
+  var a4254;
+  var a4255;
+  var a4256;
+  var a4257;
+  var a4258;
+  var a4259;
+  var a4260;
+  var a4261;
+  var a4262;
+  var a4263;
+  var a4264;
+  var a4265;
+  var a4266;
+  var a4267;
+  var a4268;
+  var a4269;
+  var a4270;
+  var a4271;
+  var a4272;
+  var a4273;
+  var a4274;
+  var a4275;
+  var a4276;
+  var a4277;
+  var a4278;
+  var a4279;
+  var a4280;
+  var a4281;
+  var a4282;
+  var a4283;
+  var a4284;
+  var a4285;
+  var a4286;
+  var a4287;
+  var a4288;
+  var a4289;
+  var a4290;
+  var a4291;
+  var a4292;
+  var a4293;
+  var a4294;
+  var a4295;
+  var a4296;
+  var a4297;
+  var a4298;
+  var a4299;
+  var a4300;
+  var a4301;
+  var a4302;
+  var a4303;
+  var a4304;
+  var a4305;
+  var a4306;
+  var a4307;
+  var a4308;
+  var a4309;
+  var a4310;
+  var a4311;
+  var a4312;
+  var a4313;
+  var a4314;
+  var a4315;
+  var a4316;
+  var a4317;
+  var a4318;
+  var a4319;
+  var a4320;
+  var a4321;
+  var a4322;
+  var a4323;
+  var a4324;
+  var a4325;
+  var a4326;
+  var a4327;
+  var a4328;
+  var a4329;
+  var a4330;
+  var a4331;
+  var a4332;
+  var a4333;
+  var a4334;
+  var a4335;
+  var a4336;
+  var a4337;
+  var a4338;
+  var a4339;
+  var a4340;
+  var a4341;
+  var a4342;
+  var a4343;
+  var a4344;
+  var a4345;
+  var a4346;
+  var a4347;
+  var a4348;
+  var a4349;
+  var a4350;
+  var a4351;
+  var a4352;
+  var a4353;
+  var a4354;
+  var a4355;
+  var a4356;
+  var a4357;
+  var a4358;
+  var a4359;
+  var a4360;
+  var a4361;
+  var a4362;
+  var a4363;
+  var a4364;
+  var a4365;
+  var a4366;
+  var a4367;
+  var a4368;
+  var a4369;
+  var a4370;
+  var a4371;
+  var a4372;
+  var a4373;
+  var a4374;
+  var a4375;
+  var a4376;
+  var a4377;
+  var a4378;
+  var a4379;
+  var a4380;
+  var a4381;
+  var a4382;
+  var a4383;
+  var a4384;
+  var a4385;
+  var a4386;
+  var a4387;
+  var a4388;
+  var a4389;
+  var a4390;
+  var a4391;
+  var a4392;
+  var a4393;
+  var a4394;
+  var a4395;
+  var a4396;
+  var a4397;
+  var a4398;
+  var a4399;
+  var a4400;
+  var a4401;
+  var a4402;
+  var a4403;
+  var a4404;
+  var a4405;
+  var a4406;
+  var a4407;
+  var a4408;
+  var a4409;
+  var a4410;
+  var a4411;
+  var a4412;
+  var a4413;
+  var a4414;
+  var a4415;
+  var a4416;
+  var a4417;
+  var a4418;
+  var a4419;
+  var a4420;
+  var a4421;
+  var a4422;
+  var a4423;
+  var a4424;
+  var a4425;
+  var a4426;
+  var a4427;
+  var a4428;
+  var a4429;
+  var a4430;
+  var a4431;
+  var a4432;
+  var a4433;
+  var a4434;
+  var a4435;
+  var a4436;
+  var a4437;
+  var a4438;
+  var a4439;
+  var a4440;
+  var a4441;
+  var a4442;
+  var a4443;
+  var a4444;
+  var a4445;
+  var a4446;
+  var a4447;
+  var a4448;
+  var a4449;
+  var a4450;
+  var a4451;
+  var a4452;
+  var a4453;
+  var a4454;
+  var a4455;
+  var a4456;
+  var a4457;
+  var a4458;
+  var a4459;
+  var a4460;
+  var a4461;
+  var a4462;
+  var a4463;
+  var a4464;
+  var a4465;
+  var a4466;
+  var a4467;
+  var a4468;
+  var a4469;
+  var a4470;
+  var a4471;
+  var a4472;
+  var a4473;
+  var a4474;
+  var a4475;
+  var a4476;
+  var a4477;
+  var a4478;
+  var a4479;
+  var a4480;
+  var a4481;
+  var a4482;
+  var a4483;
+  var a4484;
+  var a4485;
+  var a4486;
+  var a4487;
+  var a4488;
+  var a4489;
+  var a4490;
+  var a4491;
+  var a4492;
+  var a4493;
+  var a4494;
+  var a4495;
+  var a4496;
+  var a4497;
+  var a4498;
+  var a4499;
+  var a4500;
+  var a4501;
+  var a4502;
+  var a4503;
+  var a4504;
+  var a4505;
+  var a4506;
+  var a4507;
+  var a4508;
+  var a4509;
+  var a4510;
+  var a4511;
+  var a4512;
+  var a4513;
+  var a4514;
+  var a4515;
+  var a4516;
+  var a4517;
+  var a4518;
+  var a4519;
+  var a4520;
+  var a4521;
+  var a4522;
+  var a4523;
+  var a4524;
+  var a4525;
+  var a4526;
+  var a4527;
+  var a4528;
+  var a4529;
+  var a4530;
+  var a4531;
+  var a4532;
+  var a4533;
+  var a4534;
+  var a4535;
+  var a4536;
+  var a4537;
+  var a4538;
+  var a4539;
+  var a4540;
+  var a4541;
+  var a4542;
+  var a4543;
+  var a4544;
+  var a4545;
+  var a4546;
+  var a4547;
+  var a4548;
+  var a4549;
+  var a4550;
+  var a4551;
+  var a4552;
+  var a4553;
+  var a4554;
+  var a4555;
+  var a4556;
+  var a4557;
+  var a4558;
+  var a4559;
+  var a4560;
+  var a4561;
+  var a4562;
+  var a4563;
+  var a4564;
+  var a4565;
+  var a4566;
+  var a4567;
+  var a4568;
+  var a4569;
+  var a4570;
+  var a4571;
+  var a4572;
+  var a4573;
+  var a4574;
+  var a4575;
+  var a4576;
+  var a4577;
+  var a4578;
+  var a4579;
+  var a4580;
+  var a4581;
+  var a4582;
+  var a4583;
+  var a4584;
+  var a4585;
+  var a4586;
+  var a4587;
+  var a4588;
+  var a4589;
+  var a4590;
+  var a4591;
+  var a4592;
+  var a4593;
+  var a4594;
+  var a4595;
+  var a4596;
+  var a4597;
+  var a4598;
+  var a4599;
+  var a4600;
+  var a4601;
+  var a4602;
+  var a4603;
+  var a4604;
+  var a4605;
+  var a4606;
+  var a4607;
+  var a4608;
+  var a4609;
+  var a4610;
+  var a4611;
+  var a4612;
+  var a4613;
+  var a4614;
+  var a4615;
+  var a4616;
+  var a4617;
+  var a4618;
+  var a4619;
+  var a4620;
+  var a4621;
+  var a4622;
+  var a4623;
+  var a4624;
+  var a4625;
+  var a4626;
+  var a4627;
+  var a4628;
+  var a4629;
+  var a4630;
+  var a4631;
+  var a4632;
+  var a4633;
+  var a4634;
+  var a4635;
+  var a4636;
+  var a4637;
+  var a4638;
+  var a4639;
+  var a4640;
+  var a4641;
+  var a4642;
+  var a4643;
+  var a4644;
+  var a4645;
+  var a4646;
+  var a4647;
+  var a4648;
+  var a4649;
+  var a4650;
+  var a4651;
+  var a4652;
+  var a4653;
+  var a4654;
+  var a4655;
+  var a4656;
+  var a4657;
+  var a4658;
+  var a4659;
+  var a4660;
+  var a4661;
+  var a4662;
+  var a4663;
+  var a4664;
+  var a4665;
+  var a4666;
+  var a4667;
+  var a4668;
+  var a4669;
+  var a4670;
+  var a4671;
+  var a4672;
+  var a4673;
+  var a4674;
+  var a4675;
+  var a4676;
+  var a4677;
+  var a4678;
+  var a4679;
+  var a4680;
+  var a4681;
+  var a4682;
+  var a4683;
+  var a4684;
+  var a4685;
+  var a4686;
+  var a4687;
+  var a4688;
+  var a4689;
+  var a4690;
+  var a4691;
+  var a4692;
+  var a4693;
+  var a4694;
+  var a4695;
+  var a4696;
+  var a4697;
+  var a4698;
+  var a4699;
+  var a4700;
+  var a4701;
+  var a4702;
+  var a4703;
+  var a4704;
+  var a4705;
+  var a4706;
+  var a4707;
+  var a4708;
+  var a4709;
+  var a4710;
+  var a4711;
+  var a4712;
+  var a4713;
+  var a4714;
+  var a4715;
+  var a4716;
+  var a4717;
+  var a4718;
+  var a4719;
+  var a4720;
+  var a4721;
+  var a4722;
+  var a4723;
+  var a4724;
+  var a4725;
+  var a4726;
+  var a4727;
+  var a4728;
+  var a4729;
+  var a4730;
+  var a4731;
+  var a4732;
+  var a4733;
+  var a4734;
+  var a4735;
+  var a4736;
+  var a4737;
+  var a4738;
+  var a4739;
+  var a4740;
+  var a4741;
+  var a4742;
+  var a4743;
+  var a4744;
+  var a4745;
+  var a4746;
+  var a4747;
+  var a4748;
+  var a4749;
+  var a4750;
+  var a4751;
+  var a4752;
+  var a4753;
+  var a4754;
+  var a4755;
+  var a4756;
+  var a4757;
+  var a4758;
+  var a4759;
+  var a4760;
+  var a4761;
+  var a4762;
+  var a4763;
+  var a4764;
+  var a4765;
+  var a4766;
+  var a4767;
+  var a4768;
+  var a4769;
+  var a4770;
+  var a4771;
+  var a4772;
+  var a4773;
+  var a4774;
+  var a4775;
+  var a4776;
+  var a4777;
+  var a4778;
+  var a4779;
+  var a4780;
+  var a4781;
+  var a4782;
+  var a4783;
+  var a4784;
+  var a4785;
+  var a4786;
+  var a4787;
+  var a4788;
+  var a4789;
+  var a4790;
+  var a4791;
+  var a4792;
+  var a4793;
+  var a4794;
+  var a4795;
+  var a4796;
+  var a4797;
+  var a4798;
+  var a4799;
+  var a4800;
+  var a4801;
+  var a4802;
+  var a4803;
+  var a4804;
+  var a4805;
+  var a4806;
+  var a4807;
+  var a4808;
+  var a4809;
+  var a4810;
+  var a4811;
+  var a4812;
+  var a4813;
+  var a4814;
+  var a4815;
+  var a4816;
+  var a4817;
+  var a4818;
+  var a4819;
+  var a4820;
+  var a4821;
+  var a4822;
+  var a4823;
+  var a4824;
+  var a4825;
+  var a4826;
+  var a4827;
+  var a4828;
+  var a4829;
+  var a4830;
+  var a4831;
+  var a4832;
+  var a4833;
+  var a4834;
+  var a4835;
+  var a4836;
+  var a4837;
+  var a4838;
+  var a4839;
+  var a4840;
+  var a4841;
+  var a4842;
+  var a4843;
+  var a4844;
+  var a4845;
+  var a4846;
+  var a4847;
+  var a4848;
+  var a4849;
+  var a4850;
+  var a4851;
+  var a4852;
+  var a4853;
+  var a4854;
+  var a4855;
+  var a4856;
+  var a4857;
+  var a4858;
+  var a4859;
+  var a4860;
+  var a4861;
+  var a4862;
+  var a4863;
+  var a4864;
+  var a4865;
+  var a4866;
+  var a4867;
+  var a4868;
+  var a4869;
+  var a4870;
+  var a4871;
+  var a4872;
+  var a4873;
+  var a4874;
+  var a4875;
+  var a4876;
+  var a4877;
+  var a4878;
+  var a4879;
+  var a4880;
+  var a4881;
+  var a4882;
+  var a4883;
+  var a4884;
+  var a4885;
+  var a4886;
+  var a4887;
+  var a4888;
+  var a4889;
+  var a4890;
+  var a4891;
+  var a4892;
+  var a4893;
+  var a4894;
+  var a4895;
+  var a4896;
+  var a4897;
+  var a4898;
+  var a4899;
+  var a4900;
+  var a4901;
+  var a4902;
+  var a4903;
+  var a4904;
+  var a4905;
+  var a4906;
+  var a4907;
+  var a4908;
+  var a4909;
+  var a4910;
+  var a4911;
+  var a4912;
+  var a4913;
+  var a4914;
+  var a4915;
+  var a4916;
+  var a4917;
+  var a4918;
+  var a4919;
+  var a4920;
+  var a4921;
+  var a4922;
+  var a4923;
+  var a4924;
+  var a4925;
+  var a4926;
+  var a4927;
+  var a4928;
+  var a4929;
+  var a4930;
+  var a4931;
+  var a4932;
+  var a4933;
+  var a4934;
+  var a4935;
+  var a4936;
+  var a4937;
+  var a4938;
+  var a4939;
+  var a4940;
+  var a4941;
+  var a4942;
+  var a4943;
+  var a4944;
+  var a4945;
+  var a4946;
+  var a4947;
+  var a4948;
+  var a4949;
+  var a4950;
+  var a4951;
+  var a4952;
+  var a4953;
+  var a4954;
+  var a4955;
+  var a4956;
+  var a4957;
+  var a4958;
+  var a4959;
+  var a4960;
+  var a4961;
+  var a4962;
+  var a4963;
+  var a4964;
+  var a4965;
+  var a4966;
+  var a4967;
+  var a4968;
+  var a4969;
+  var a4970;
+  var a4971;
+  var a4972;
+  var a4973;
+  var a4974;
+  var a4975;
+  var a4976;
+  var a4977;
+  var a4978;
+  var a4979;
+  var a4980;
+  var a4981;
+  var a4982;
+  var a4983;
+  var a4984;
+  var a4985;
+  var a4986;
+  var a4987;
+  var a4988;
+  var a4989;
+  var a4990;
+  var a4991;
+  var a4992;
+  var a4993;
+  var a4994;
+  var a4995;
+  var a4996;
+  var a4997;
+  var a4998;
+  var a4999;
+  var a5000;
+  var a5001;
+  var a5002;
+  var a5003;
+  var a5004;
+  var a5005;
+  var a5006;
+  var a5007;
+  var a5008;
+  var a5009;
+  var a5010;
+  var a5011;
+  var a5012;
+  var a5013;
+  var a5014;
+  var a5015;
+  var a5016;
+  var a5017;
+  var a5018;
+  var a5019;
+  var a5020;
+  var a5021;
+  var a5022;
+  var a5023;
+  var a5024;
+  var a5025;
+  var a5026;
+  var a5027;
+  var a5028;
+  var a5029;
+  var a5030;
+  var a5031;
+  var a5032;
+  var a5033;
+  var a5034;
+  var a5035;
+  var a5036;
+  var a5037;
+  var a5038;
+  var a5039;
+  var a5040;
+  var a5041;
+  var a5042;
+  var a5043;
+  var a5044;
+  var a5045;
+  var a5046;
+  var a5047;
+  var a5048;
+  var a5049;
+  var a5050;
+  var a5051;
+  var a5052;
+  var a5053;
+  var a5054;
+  var a5055;
+  var a5056;
+  var a5057;
+  var a5058;
+  var a5059;
+  var a5060;
+  var a5061;
+  var a5062;
+  var a5063;
+  var a5064;
+  var a5065;
+  var a5066;
+  var a5067;
+  var a5068;
+  var a5069;
+  var a5070;
+  var a5071;
+  var a5072;
+  var a5073;
+  var a5074;
+  var a5075;
+  var a5076;
+  var a5077;
+  var a5078;
+  var a5079;
+  var a5080;
+  var a5081;
+  var a5082;
+  var a5083;
+  var a5084;
+  var a5085;
+  var a5086;
+  var a5087;
+  var a5088;
+  var a5089;
+  var a5090;
+  var a5091;
+  var a5092;
+  var a5093;
+  var a5094;
+  var a5095;
+  var a5096;
+  var a5097;
+  var a5098;
+  var a5099;
+  var a5100;
+  var a5101;
+  var a5102;
+  var a5103;
+  var a5104;
+  var a5105;
+  var a5106;
+  var a5107;
+  var a5108;
+  var a5109;
+  var a5110;
+  var a5111;
+  var a5112;
+  var a5113;
+  var a5114;
+  var a5115;
+  var a5116;
+  var a5117;
+  var a5118;
+  var a5119;
+  var a5120;
+  var a5121;
+  var a5122;
+  var a5123;
+  var a5124;
+  var a5125;
+  var a5126;
+  var a5127;
+  var a5128;
+  var a5129;
+  var a5130;
+  var a5131;
+  var a5132;
+  var a5133;
+  var a5134;
+  var a5135;
+  var a5136;
+  var a5137;
+  var a5138;
+  var a5139;
+  var a5140;
+  var a5141;
+  var a5142;
+  var a5143;
+  var a5144;
+  var a5145;
+  var a5146;
+  var a5147;
+  var a5148;
+  var a5149;
+  var a5150;
+  var a5151;
+  var a5152;
+  var a5153;
+  var a5154;
+  var a5155;
+  var a5156;
+  var a5157;
+  var a5158;
+  var a5159;
+  var a5160;
+  var a5161;
+  var a5162;
+  var a5163;
+  var a5164;
+  var a5165;
+  var a5166;
+  var a5167;
+  var a5168;
+  var a5169;
+  var a5170;
+  var a5171;
+  var a5172;
+  var a5173;
+  var a5174;
+  var a5175;
+  var a5176;
+  var a5177;
+  var a5178;
+  var a5179;
+  var a5180;
+  var a5181;
+  var a5182;
+  var a5183;
+  var a5184;
+  var a5185;
+  var a5186;
+  var a5187;
+  var a5188;
+  var a5189;
+  var a5190;
+  var a5191;
+  var a5192;
+  var a5193;
+  var a5194;
+  var a5195;
+  var a5196;
+  var a5197;
+  var a5198;
+  var a5199;
+  var a5200;
+  var a5201;
+  var a5202;
+  var a5203;
+  var a5204;
+  var a5205;
+  var a5206;
+  var a5207;
+  var a5208;
+  var a5209;
+  var a5210;
+  var a5211;
+  var a5212;
+  var a5213;
+  var a5214;
+  var a5215;
+  var a5216;
+  var a5217;
+  var a5218;
+  var a5219;
+  var a5220;
+  var a5221;
+  var a5222;
+  var a5223;
+  var a5224;
+  var a5225;
+  var a5226;
+  var a5227;
+  var a5228;
+  var a5229;
+  var a5230;
+  var a5231;
+  var a5232;
+  var a5233;
+  var a5234;
+  var a5235;
+  var a5236;
+  var a5237;
+  var a5238;
+  var a5239;
+  var a5240;
+  var a5241;
+  var a5242;
+  var a5243;
+  var a5244;
+  var a5245;
+  var a5246;
+  var a5247;
+  var a5248;
+  var a5249;
+  var a5250;
+  var a5251;
+  var a5252;
+  var a5253;
+  var a5254;
+  var a5255;
+  var a5256;
+  var a5257;
+  var a5258;
+  var a5259;
+  var a5260;
+  var a5261;
+  var a5262;
+  var a5263;
+  var a5264;
+  var a5265;
+  var a5266;
+  var a5267;
+  var a5268;
+  var a5269;
+  var a5270;
+  var a5271;
+  var a5272;
+  var a5273;
+  var a5274;
+  var a5275;
+  var a5276;
+  var a5277;
+  var a5278;
+  var a5279;
+  var a5280;
+  var a5281;
+  var a5282;
+  var a5283;
+  var a5284;
+  var a5285;
+  var a5286;
+  var a5287;
+  var a5288;
+  var a5289;
+  var a5290;
+  var a5291;
+  var a5292;
+  var a5293;
+  var a5294;
+  var a5295;
+  var a5296;
+  var a5297;
+  var a5298;
+  var a5299;
+  var a5300;
+  var a5301;
+  var a5302;
+  var a5303;
+  var a5304;
+  var a5305;
+  var a5306;
+  var a5307;
+  var a5308;
+  var a5309;
+  var a5310;
+  var a5311;
+  var a5312;
+  var a5313;
+  var a5314;
+  var a5315;
+  var a5316;
+  var a5317;
+  var a5318;
+  var a5319;
+  var a5320;
+  var a5321;
+  var a5322;
+  var a5323;
+  var a5324;
+  var a5325;
+  var a5326;
+  var a5327;
+  var a5328;
+  var a5329;
+  var a5330;
+  var a5331;
+  var a5332;
+  var a5333;
+  var a5334;
+  var a5335;
+  var a5336;
+  var a5337;
+  var a5338;
+  var a5339;
+  var a5340;
+  var a5341;
+  var a5342;
+  var a5343;
+  var a5344;
+  var a5345;
+  var a5346;
+  var a5347;
+  var a5348;
+  var a5349;
+  var a5350;
+  var a5351;
+  var a5352;
+  var a5353;
+  var a5354;
+  var a5355;
+  var a5356;
+  var a5357;
+  var a5358;
+  var a5359;
+  var a5360;
+  var a5361;
+  var a5362;
+  var a5363;
+  var a5364;
+  var a5365;
+  var a5366;
+  var a5367;
+  var a5368;
+  var a5369;
+  var a5370;
+  var a5371;
+  var a5372;
+  var a5373;
+  var a5374;
+  var a5375;
+  var a5376;
+  var a5377;
+  var a5378;
+  var a5379;
+  var a5380;
+  var a5381;
+  var a5382;
+  var a5383;
+  var a5384;
+  var a5385;
+  var a5386;
+  var a5387;
+  var a5388;
+  var a5389;
+  var a5390;
+  var a5391;
+  var a5392;
+  var a5393;
+  var a5394;
+  var a5395;
+  var a5396;
+  var a5397;
+  var a5398;
+  var a5399;
+  var a5400;
+  var a5401;
+  var a5402;
+  var a5403;
+  var a5404;
+  var a5405;
+  var a5406;
+  var a5407;
+  var a5408;
+  var a5409;
+  var a5410;
+  var a5411;
+  var a5412;
+  var a5413;
+  var a5414;
+  var a5415;
+  var a5416;
+  var a5417;
+  var a5418;
+  var a5419;
+  var a5420;
+  var a5421;
+  var a5422;
+  var a5423;
+  var a5424;
+  var a5425;
+  var a5426;
+  var a5427;
+  var a5428;
+  var a5429;
+  var a5430;
+  var a5431;
+  var a5432;
+  var a5433;
+  var a5434;
+  var a5435;
+  var a5436;
+  var a5437;
+  var a5438;
+  var a5439;
+  var a5440;
+  var a5441;
+  var a5442;
+  var a5443;
+  var a5444;
+  var a5445;
+  var a5446;
+  var a5447;
+  var a5448;
+  var a5449;
+  var a5450;
+  var a5451;
+  var a5452;
+  var a5453;
+  var a5454;
+  var a5455;
+  var a5456;
+  var a5457;
+  var a5458;
+  var a5459;
+  var a5460;
+  var a5461;
+  var a5462;
+  var a5463;
+  var a5464;
+  var a5465;
+  var a5466;
+  var a5467;
+  var a5468;
+  var a5469;
+  var a5470;
+  var a5471;
+  var a5472;
+  var a5473;
+  var a5474;
+  var a5475;
+  var a5476;
+  var a5477;
+  var a5478;
+  var a5479;
+  var a5480;
+  var a5481;
+  var a5482;
+  var a5483;
+  var a5484;
+  var a5485;
+  var a5486;
+  var a5487;
+  var a5488;
+  var a5489;
+  var a5490;
+  var a5491;
+  var a5492;
+  var a5493;
+  var a5494;
+  var a5495;
+  var a5496;
+  var a5497;
+  var a5498;
+  var a5499;
+  var a5500;
+  var a5501;
+  var a5502;
+  var a5503;
+  var a5504;
+  var a5505;
+  var a5506;
+  var a5507;
+  var a5508;
+  var a5509;
+  var a5510;
+  var a5511;
+  var a5512;
+  var a5513;
+  var a5514;
+  var a5515;
+  var a5516;
+  var a5517;
+  var a5518;
+  var a5519;
+  var a5520;
+  var a5521;
+  var a5522;
+  var a5523;
+  var a5524;
+  var a5525;
+  var a5526;
+  var a5527;
+  var a5528;
+  var a5529;
+  var a5530;
+  var a5531;
+  var a5532;
+  var a5533;
+  var a5534;
+  var a5535;
+  var a5536;
+  var a5537;
+  var a5538;
+  var a5539;
+  var a5540;
+  var a5541;
+  var a5542;
+  var a5543;
+  var a5544;
+  var a5545;
+  var a5546;
+  var a5547;
+  var a5548;
+  var a5549;
+  var a5550;
+  var a5551;
+  var a5552;
+  var a5553;
+  var a5554;
+  var a5555;
+  var a5556;
+  var a5557;
+  var a5558;
+  var a5559;
+  var a5560;
+  var a5561;
+  var a5562;
+  var a5563;
+  var a5564;
+  var a5565;
+  var a5566;
+  var a5567;
+  var a5568;
+  var a5569;
+  var a5570;
+  var a5571;
+  var a5572;
+  var a5573;
+  var a5574;
+  var a5575;
+  var a5576;
+  var a5577;
+  var a5578;
+  var a5579;
+  var a5580;
+  var a5581;
+  var a5582;
+  var a5583;
+  var a5584;
+  var a5585;
+  var a5586;
+  var a5587;
+  var a5588;
+  var a5589;
+  var a5590;
+  var a5591;
+  var a5592;
+  var a5593;
+  var a5594;
+  var a5595;
+  var a5596;
+  var a5597;
+  var a5598;
+  var a5599;
+  var a5600;
+  var a5601;
+  var a5602;
+  var a5603;
+  var a5604;
+  var a5605;
+  var a5606;
+  var a5607;
+  var a5608;
+  var a5609;
+  var a5610;
+  var a5611;
+  var a5612;
+  var a5613;
+  var a5614;
+  var a5615;
+  var a5616;
+  var a5617;
+  var a5618;
+  var a5619;
+  var a5620;
+  var a5621;
+  var a5622;
+  var a5623;
+  var a5624;
+  var a5625;
+  var a5626;
+  var a5627;
+  var a5628;
+  var a5629;
+  var a5630;
+  var a5631;
+  var a5632;
+  var a5633;
+  var a5634;
+  var a5635;
+  var a5636;
+  var a5637;
+  var a5638;
+  var a5639;
+  var a5640;
+  var a5641;
+  var a5642;
+  var a5643;
+  var a5644;
+  var a5645;
+  var a5646;
+  var a5647;
+  var a5648;
+  var a5649;
+  var a5650;
+  var a5651;
+  var a5652;
+  var a5653;
+  var a5654;
+  var a5655;
+  var a5656;
+  var a5657;
+  var a5658;
+  var a5659;
+  var a5660;
+  var a5661;
+  var a5662;
+  var a5663;
+  var a5664;
+  var a5665;
+  var a5666;
+  var a5667;
+  var a5668;
+  var a5669;
+  var a5670;
+  var a5671;
+  var a5672;
+  var a5673;
+  var a5674;
+  var a5675;
+  var a5676;
+  var a5677;
+  var a5678;
+  var a5679;
+  var a5680;
+  var a5681;
+  var a5682;
+  var a5683;
+  var a5684;
+  var a5685;
+  var a5686;
+  var a5687;
+  var a5688;
+  var a5689;
+  var a5690;
+  var a5691;
+  var a5692;
+  var a5693;
+  var a5694;
+  var a5695;
+  var a5696;
+  var a5697;
+  var a5698;
+  var a5699;
+  var a5700;
+  var a5701;
+  var a5702;
+  var a5703;
+  var a5704;
+  var a5705;
+  var a5706;
+  var a5707;
+  var a5708;
+  var a5709;
+  var a5710;
+  var a5711;
+  var a5712;
+  var a5713;
+  var a5714;
+  var a5715;
+  var a5716;
+  var a5717;
+  var a5718;
+  var a5719;
+  var a5720;
+  var a5721;
+  var a5722;
+  var a5723;
+  var a5724;
+  var a5725;
+  var a5726;
+  var a5727;
+  var a5728;
+  var a5729;
+  var a5730;
+  var a5731;
+  var a5732;
+  var a5733;
+  var a5734;
+  var a5735;
+  var a5736;
+  var a5737;
+  var a5738;
+  var a5739;
+  var a5740;
+  var a5741;
+  var a5742;
+  var a5743;
+  var a5744;
+  var a5745;
+  var a5746;
+  var a5747;
+  var a5748;
+  var a5749;
+  var a5750;
+  var a5751;
+  var a5752;
+  var a5753;
+  var a5754;
+  var a5755;
+  var a5756;
+  var a5757;
+  var a5758;
+  var a5759;
+  var a5760;
+  var a5761;
+  var a5762;
+  var a5763;
+  var a5764;
+  var a5765;
+  var a5766;
+  var a5767;
+  var a5768;
+  var a5769;
+  var a5770;
+  var a5771;
+  var a5772;
+  var a5773;
+  var a5774;
+  var a5775;
+  var a5776;
+  var a5777;
+  var a5778;
+  var a5779;
+  var a5780;
+  var a5781;
+  var a5782;
+  var a5783;
+  var a5784;
+  var a5785;
+  var a5786;
+  var a5787;
+  var a5788;
+  var a5789;
+  var a5790;
+  var a5791;
+  var a5792;
+  var a5793;
+  var a5794;
+  var a5795;
+  var a5796;
+  var a5797;
+  var a5798;
+  var a5799;
+  var a5800;
+  var a5801;
+  var a5802;
+  var a5803;
+  var a5804;
+  var a5805;
+  var a5806;
+  var a5807;
+  var a5808;
+  var a5809;
+  var a5810;
+  var a5811;
+  var a5812;
+  var a5813;
+  var a5814;
+  var a5815;
+  var a5816;
+  var a5817;
+  var a5818;
+  var a5819;
+  var a5820;
+  var a5821;
+  var a5822;
+  var a5823;
+  var a5824;
+  var a5825;
+  var a5826;
+  var a5827;
+  var a5828;
+  var a5829;
+  var a5830;
+  var a5831;
+  var a5832;
+  var a5833;
+  var a5834;
+  var a5835;
+  var a5836;
+  var a5837;
+  var a5838;
+  var a5839;
+  var a5840;
+  var a5841;
+  var a5842;
+  var a5843;
+  var a5844;
+  var a5845;
+  var a5846;
+  var a5847;
+  var a5848;
+  var a5849;
+  var a5850;
+  var a5851;
+  var a5852;
+  var a5853;
+  var a5854;
+  var a5855;
+  var a5856;
+  var a5857;
+  var a5858;
+  var a5859;
+  var a5860;
+  var a5861;
+  var a5862;
+  var a5863;
+  var a5864;
+  var a5865;
+  var a5866;
+  var a5867;
+  var a5868;
+  var a5869;
+  var a5870;
+  var a5871;
+  var a5872;
+  var a5873;
+  var a5874;
+  var a5875;
+  var a5876;
+  var a5877;
+  var a5878;
+  var a5879;
+  var a5880;
+  var a5881;
+  var a5882;
+  var a5883;
+  var a5884;
+  var a5885;
+  var a5886;
+  var a5887;
+  var a5888;
+  var a5889;
+  var a5890;
+  var a5891;
+  var a5892;
+  var a5893;
+  var a5894;
+  var a5895;
+  var a5896;
+  var a5897;
+  var a5898;
+  var a5899;
+  var a5900;
+  var a5901;
+  var a5902;
+  var a5903;
+  var a5904;
+  var a5905;
+  var a5906;
+  var a5907;
+  var a5908;
+  var a5909;
+  var a5910;
+  var a5911;
+  var a5912;
+  var a5913;
+  var a5914;
+  var a5915;
+  var a5916;
+  var a5917;
+  var a5918;
+  var a5919;
+  var a5920;
+  var a5921;
+  var a5922;
+  var a5923;
+  var a5924;
+  var a5925;
+  var a5926;
+  var a5927;
+  var a5928;
+  var a5929;
+  var a5930;
+  var a5931;
+  var a5932;
+  var a5933;
+  var a5934;
+  var a5935;
+  var a5936;
+  var a5937;
+  var a5938;
+  var a5939;
+  var a5940;
+  var a5941;
+  var a5942;
+  var a5943;
+  var a5944;
+  var a5945;
+  var a5946;
+  var a5947;
+  var a5948;
+  var a5949;
+  var a5950;
+  var a5951;
+  var a5952;
+  var a5953;
+  var a5954;
+  var a5955;
+  var a5956;
+  var a5957;
+  var a5958;
+  var a5959;
+  var a5960;
+  var a5961;
+  var a5962;
+  var a5963;
+  var a5964;
+  var a5965;
+  var a5966;
+  var a5967;
+  var a5968;
+  var a5969;
+  var a5970;
+  var a5971;
+  var a5972;
+  var a5973;
+  var a5974;
+  var a5975;
+  var a5976;
+  var a5977;
+  var a5978;
+  var a5979;
+  var a5980;
+  var a5981;
+  var a5982;
+  var a5983;
+  var a5984;
+  var a5985;
+  var a5986;
+  var a5987;
+  var a5988;
+  var a5989;
+  var a5990;
+  var a5991;
+  var a5992;
+  var a5993;
+  var a5994;
+  var a5995;
+  var a5996;
+  var a5997;
+  var a5998;
+  var a5999;
+  var a6000;
+  var a6001;
+  var a6002;
+  var a6003;
+  var a6004;
+  var a6005;
+  var a6006;
+  var a6007;
+  var a6008;
+  var a6009;
+  var a6010;
+  var a6011;
+  var a6012;
+  var a6013;
+  var a6014;
+  var a6015;
+  var a6016;
+  var a6017;
+  var a6018;
+  var a6019;
+  var a6020;
+  var a6021;
+  var a6022;
+  var a6023;
+  var a6024;
+  var a6025;
+  var a6026;
+  var a6027;
+  var a6028;
+  var a6029;
+  var a6030;
+  var a6031;
+  var a6032;
+  var a6033;
+  var a6034;
+  var a6035;
+  var a6036;
+  var a6037;
+  var a6038;
+  var a6039;
+  var a6040;
+  var a6041;
+  var a6042;
+  var a6043;
+  var a6044;
+  var a6045;
+  var a6046;
+  var a6047;
+  var a6048;
+  var a6049;
+  var a6050;
+  var a6051;
+  var a6052;
+  var a6053;
+  var a6054;
+  var a6055;
+  var a6056;
+  var a6057;
+  var a6058;
+  var a6059;
+  var a6060;
+  var a6061;
+  var a6062;
+  var a6063;
+  var a6064;
+  var a6065;
+  var a6066;
+  var a6067;
+  var a6068;
+  var a6069;
+  var a6070;
+  var a6071;
+  var a6072;
+  var a6073;
+  var a6074;
+  var a6075;
+  var a6076;
+  var a6077;
+  var a6078;
+  var a6079;
+  var a6080;
+  var a6081;
+  var a6082;
+  var a6083;
+  var a6084;
+  var a6085;
+  var a6086;
+  var a6087;
+  var a6088;
+  var a6089;
+  var a6090;
+  var a6091;
+  var a6092;
+  var a6093;
+  var a6094;
+  var a6095;
+  var a6096;
+  var a6097;
+  var a6098;
+  var a6099;
+  var a6100;
+  var a6101;
+  var a6102;
+  var a6103;
+  var a6104;
+  var a6105;
+  var a6106;
+  var a6107;
+  var a6108;
+  var a6109;
+  var a6110;
+  var a6111;
+  var a6112;
+  var a6113;
+  var a6114;
+  var a6115;
+  var a6116;
+  var a6117;
+  var a6118;
+  var a6119;
+  var a6120;
+  var a6121;
+  var a6122;
+  var a6123;
+  var a6124;
+  var a6125;
+  var a6126;
+  var a6127;
+  var a6128;
+  var a6129;
+  var a6130;
+  var a6131;
+  var a6132;
+  var a6133;
+  var a6134;
+  var a6135;
+  var a6136;
+  var a6137;
+  var a6138;
+  var a6139;
+  var a6140;
+  var a6141;
+  var a6142;
+  var a6143;
+  var a6144;
+  var a6145;
+  var a6146;
+  var a6147;
+  var a6148;
+  var a6149;
+  var a6150;
+  var a6151;
+  var a6152;
+  var a6153;
+  var a6154;
+  var a6155;
+  var a6156;
+  var a6157;
+  var a6158;
+  var a6159;
+  var a6160;
+  var a6161;
+  var a6162;
+  var a6163;
+  var a6164;
+  var a6165;
+  var a6166;
+  var a6167;
+  var a6168;
+  var a6169;
+  var a6170;
+  var a6171;
+  var a6172;
+  var a6173;
+  var a6174;
+  var a6175;
+  var a6176;
+  var a6177;
+  var a6178;
+  var a6179;
+  var a6180;
+  var a6181;
+  var a6182;
+  var a6183;
+  var a6184;
+  var a6185;
+  var a6186;
+  var a6187;
+  var a6188;
+  var a6189;
+  var a6190;
+  var a6191;
+  var a6192;
+  var a6193;
+  var a6194;
+  var a6195;
+  var a6196;
+  var a6197;
+  var a6198;
+  var a6199;
+  var a6200;
+  var a6201;
+  var a6202;
+  var a6203;
+  var a6204;
+  var a6205;
+  var a6206;
+  var a6207;
+  var a6208;
+  var a6209;
+  var a6210;
+  var a6211;
+  var a6212;
+  var a6213;
+  var a6214;
+  var a6215;
+  var a6216;
+  var a6217;
+  var a6218;
+  var a6219;
+  var a6220;
+  var a6221;
+  var a6222;
+  var a6223;
+  var a6224;
+  var a6225;
+  var a6226;
+  var a6227;
+  var a6228;
+  var a6229;
+  var a6230;
+  var a6231;
+  var a6232;
+  var a6233;
+  var a6234;
+  var a6235;
+  var a6236;
+  var a6237;
+  var a6238;
+  var a6239;
+  var a6240;
+  var a6241;
+  var a6242;
+  var a6243;
+  var a6244;
+  var a6245;
+  var a6246;
+  var a6247;
+  var a6248;
+  var a6249;
+  var a6250;
+  var a6251;
+  var a6252;
+  var a6253;
+  var a6254;
+  var a6255;
+  var a6256;
+  var a6257;
+  var a6258;
+  var a6259;
+  var a6260;
+  var a6261;
+  var a6262;
+  var a6263;
+  var a6264;
+  var a6265;
+  var a6266;
+  var a6267;
+  var a6268;
+  var a6269;
+  var a6270;
+  var a6271;
+  var a6272;
+  var a6273;
+  var a6274;
+  var a6275;
+  var a6276;
+  var a6277;
+  var a6278;
+  var a6279;
+  var a6280;
+  var a6281;
+  var a6282;
+  var a6283;
+  var a6284;
+  var a6285;
+  var a6286;
+  var a6287;
+  var a6288;
+  var a6289;
+  var a6290;
+  var a6291;
+  var a6292;
+  var a6293;
+  var a6294;
+  var a6295;
+  var a6296;
+  var a6297;
+  var a6298;
+  var a6299;
+  var a6300;
+  var a6301;
+  var a6302;
+  var a6303;
+  var a6304;
+  var a6305;
+  var a6306;
+  var a6307;
+  var a6308;
+  var a6309;
+  var a6310;
+  var a6311;
+  var a6312;
+  var a6313;
+  var a6314;
+  var a6315;
+  var a6316;
+  var a6317;
+  var a6318;
+  var a6319;
+  var a6320;
+  var a6321;
+  var a6322;
+  var a6323;
+  var a6324;
+  var a6325;
+  var a6326;
+  var a6327;
+  var a6328;
+  var a6329;
+  var a6330;
+  var a6331;
+  var a6332;
+  var a6333;
+  var a6334;
+  var a6335;
+  var a6336;
+  var a6337;
+  var a6338;
+  var a6339;
+  var a6340;
+  var a6341;
+  var a6342;
+  var a6343;
+  var a6344;
+  var a6345;
+  var a6346;
+  var a6347;
+  var a6348;
+  var a6349;
+  var a6350;
+  var a6351;
+  var a6352;
+  var a6353;
+  var a6354;
+  var a6355;
+  var a6356;
+  var a6357;
+  var a6358;
+  var a6359;
+  var a6360;
+  var a6361;
+  var a6362;
+  var a6363;
+  var a6364;
+  var a6365;
+  var a6366;
+  var a6367;
+  var a6368;
+  var a6369;
+  var a6370;
+  var a6371;
+  var a6372;
+  var a6373;
+  var a6374;
+  var a6375;
+  var a6376;
+  var a6377;
+  var a6378;
+  var a6379;
+  var a6380;
+  var a6381;
+  var a6382;
+  var a6383;
+  var a6384;
+  var a6385;
+  var a6386;
+  var a6387;
+  var a6388;
+  var a6389;
+  var a6390;
+  var a6391;
+  var a6392;
+  var a6393;
+  var a6394;
+  var a6395;
+  var a6396;
+  var a6397;
+  var a6398;
+  var a6399;
+  var a6400;
+  var a6401;
+  var a6402;
+  var a6403;
+  var a6404;
+  var a6405;
+  var a6406;
+  var a6407;
+  var a6408;
+  var a6409;
+  var a6410;
+  var a6411;
+  var a6412;
+  var a6413;
+  var a6414;
+  var a6415;
+  var a6416;
+  var a6417;
+  var a6418;
+  var a6419;
+  var a6420;
+  var a6421;
+  var a6422;
+  var a6423;
+  var a6424;
+  var a6425;
+  var a6426;
+  var a6427;
+  var a6428;
+  var a6429;
+  var a6430;
+  var a6431;
+  var a6432;
+  var a6433;
+  var a6434;
+  var a6435;
+  var a6436;
+  var a6437;
+  var a6438;
+  var a6439;
+  var a6440;
+  var a6441;
+  var a6442;
+  var a6443;
+  var a6444;
+  var a6445;
+  var a6446;
+  var a6447;
+  var a6448;
+  var a6449;
+  var a6450;
+  var a6451;
+  var a6452;
+  var a6453;
+  var a6454;
+  var a6455;
+  var a6456;
+  var a6457;
+  var a6458;
+  var a6459;
+  var a6460;
+  var a6461;
+  var a6462;
+  var a6463;
+  var a6464;
+  var a6465;
+  var a6466;
+  var a6467;
+  var a6468;
+  var a6469;
+  var a6470;
+  var a6471;
+  var a6472;
+  var a6473;
+  var a6474;
+  var a6475;
+  var a6476;
+  var a6477;
+  var a6478;
+  var a6479;
+  var a6480;
+  var a6481;
+  var a6482;
+  var a6483;
+  var a6484;
+  var a6485;
+  var a6486;
+  var a6487;
+  var a6488;
+  var a6489;
+  var a6490;
+  var a6491;
+  var a6492;
+  var a6493;
+  var a6494;
+  var a6495;
+  var a6496;
+  var a6497;
+  var a6498;
+  var a6499;
+  var a6500;
+  var a6501;
+  var a6502;
+  var a6503;
+  var a6504;
+  var a6505;
+  var a6506;
+  var a6507;
+  var a6508;
+  var a6509;
+  var a6510;
+  var a6511;
+  var a6512;
+  var a6513;
+  var a6514;
+  var a6515;
+  var a6516;
+  var a6517;
+  var a6518;
+  var a6519;
+  var a6520;
+  var a6521;
+  var a6522;
+  var a6523;
+  var a6524;
+  var a6525;
+  var a6526;
+  var a6527;
+  var a6528;
+  var a6529;
+  var a6530;
+  var a6531;
+  var a6532;
+  var a6533;
+  var a6534;
+  var a6535;
+  var a6536;
+  var a6537;
+  var a6538;
+  var a6539;
+  var a6540;
+  var a6541;
+  var a6542;
+  var a6543;
+  var a6544;
+  var a6545;
+  var a6546;
+  var a6547;
+  var a6548;
+  var a6549;
+  var a6550;
+  var a6551;
+  var a6552;
+  var a6553;
+  var a6554;
+  var a6555;
+  var a6556;
+  var a6557;
+  var a6558;
+  var a6559;
+  var a6560;
+  var a6561;
+  var a6562;
+  var a6563;
+  var a6564;
+  var a6565;
+  var a6566;
+  var a6567;
+  var a6568;
+  var a6569;
+  var a6570;
+  var a6571;
+  var a6572;
+  var a6573;
+  var a6574;
+  var a6575;
+  var a6576;
+  var a6577;
+  var a6578;
+  var a6579;
+  var a6580;
+  var a6581;
+  var a6582;
+  var a6583;
+  var a6584;
+  var a6585;
+  var a6586;
+  var a6587;
+  var a6588;
+  var a6589;
+  var a6590;
+  var a6591;
+  var a6592;
+  var a6593;
+  var a6594;
+  var a6595;
+  var a6596;
+  var a6597;
+  var a6598;
+  var a6599;
+  var a6600;
+  var a6601;
+  var a6602;
+  var a6603;
+  var a6604;
+  var a6605;
+  var a6606;
+  var a6607;
+  var a6608;
+  var a6609;
+  var a6610;
+  var a6611;
+  var a6612;
+  var a6613;
+  var a6614;
+  var a6615;
+  var a6616;
+  var a6617;
+  var a6618;
+  var a6619;
+  var a6620;
+  var a6621;
+  var a6622;
+  var a6623;
+  var a6624;
+  var a6625;
+  var a6626;
+  var a6627;
+  var a6628;
+  var a6629;
+  var a6630;
+  var a6631;
+  var a6632;
+  var a6633;
+  var a6634;
+  var a6635;
+  var a6636;
+  var a6637;
+  var a6638;
+  var a6639;
+  var a6640;
+  var a6641;
+  var a6642;
+  var a6643;
+  var a6644;
+  var a6645;
+  var a6646;
+  var a6647;
+  var a6648;
+  var a6649;
+  var a6650;
+  var a6651;
+  var a6652;
+  var a6653;
+  var a6654;
+  var a6655;
+  var a6656;
+  var a6657;
+  var a6658;
+  var a6659;
+  var a6660;
+  var a6661;
+  var a6662;
+  var a6663;
+  var a6664;
+  var a6665;
+  var a6666;
+  var a6667;
+  var a6668;
+  var a6669;
+  var a6670;
+  var a6671;
+  var a6672;
+  var a6673;
+  var a6674;
+  var a6675;
+  var a6676;
+  var a6677;
+  var a6678;
+  var a6679;
+  var a6680;
+  var a6681;
+  var a6682;
+  var a6683;
+  var a6684;
+  var a6685;
+  var a6686;
+  var a6687;
+  var a6688;
+  var a6689;
+  var a6690;
+  var a6691;
+  var a6692;
+  var a6693;
+  var a6694;
+  var a6695;
+  var a6696;
+  var a6697;
+  var a6698;
+  var a6699;
+  var a6700;
+  var a6701;
+  var a6702;
+  var a6703;
+  var a6704;
+  var a6705;
+  var a6706;
+  var a6707;
+  var a6708;
+  var a6709;
+  var a6710;
+  var a6711;
+  var a6712;
+  var a6713;
+  var a6714;
+  var a6715;
+  var a6716;
+  var a6717;
+  var a6718;
+  var a6719;
+  var a6720;
+  var a6721;
+  var a6722;
+  var a6723;
+  var a6724;
+  var a6725;
+  var a6726;
+  var a6727;
+  var a6728;
+  var a6729;
+  var a6730;
+  var a6731;
+  var a6732;
+  var a6733;
+  var a6734;
+  var a6735;
+  var a6736;
+  var a6737;
+  var a6738;
+  var a6739;
+  var a6740;
+  var a6741;
+  var a6742;
+  var a6743;
+  var a6744;
+  var a6745;
+  var a6746;
+  var a6747;
+  var a6748;
+  var a6749;
+  var a6750;
+  var a6751;
+  var a6752;
+  var a6753;
+  var a6754;
+  var a6755;
+  var a6756;
+  var a6757;
+  var a6758;
+  var a6759;
+  var a6760;
+  var a6761;
+  var a6762;
+  var a6763;
+  var a6764;
+  var a6765;
+  var a6766;
+  var a6767;
+  var a6768;
+  var a6769;
+  var a6770;
+  var a6771;
+  var a6772;
+  var a6773;
+  var a6774;
+  var a6775;
+  var a6776;
+  var a6777;
+  var a6778;
+  var a6779;
+  var a6780;
+  var a6781;
+  var a6782;
+  var a6783;
+  var a6784;
+  var a6785;
+  var a6786;
+  var a6787;
+  var a6788;
+  var a6789;
+  var a6790;
+  var a6791;
+  var a6792;
+  var a6793;
+  var a6794;
+  var a6795;
+  var a6796;
+  var a6797;
+  var a6798;
+  var a6799;
+  var a6800;
+  var a6801;
+  var a6802;
+  var a6803;
+  var a6804;
+  var a6805;
+  var a6806;
+  var a6807;
+  var a6808;
+  var a6809;
+  var a6810;
+  var a6811;
+  var a6812;
+  var a6813;
+  var a6814;
+  var a6815;
+  var a6816;
+  var a6817;
+  var a6818;
+  var a6819;
+  var a6820;
+  var a6821;
+  var a6822;
+  var a6823;
+  var a6824;
+  var a6825;
+  var a6826;
+  var a6827;
+  var a6828;
+  var a6829;
+  var a6830;
+  var a6831;
+  var a6832;
+  var a6833;
+  var a6834;
+  var a6835;
+  var a6836;
+  var a6837;
+  var a6838;
+  var a6839;
+  var a6840;
+  var a6841;
+  var a6842;
+  var a6843;
+  var a6844;
+  var a6845;
+  var a6846;
+  var a6847;
+  var a6848;
+  var a6849;
+  var a6850;
+  var a6851;
+  var a6852;
+  var a6853;
+  var a6854;
+  var a6855;
+  var a6856;
+  var a6857;
+  var a6858;
+  var a6859;
+  var a6860;
+  var a6861;
+  var a6862;
+  var a6863;
+  var a6864;
+  var a6865;
+  var a6866;
+  var a6867;
+  var a6868;
+  var a6869;
+  var a6870;
+  var a6871;
+  var a6872;
+  var a6873;
+  var a6874;
+  var a6875;
+  var a6876;
+  var a6877;
+  var a6878;
+  var a6879;
+  var a6880;
+  var a6881;
+  var a6882;
+  var a6883;
+  var a6884;
+  var a6885;
+  var a6886;
+  var a6887;
+  var a6888;
+  var a6889;
+  var a6890;
+  var a6891;
+  var a6892;
+  var a6893;
+  var a6894;
+  var a6895;
+  var a6896;
+  var a6897;
+  var a6898;
+  var a6899;
+  var a6900;
+  var a6901;
+  var a6902;
+  var a6903;
+  var a6904;
+  var a6905;
+  var a6906;
+  var a6907;
+  var a6908;
+  var a6909;
+  var a6910;
+  var a6911;
+  var a6912;
+  var a6913;
+  var a6914;
+  var a6915;
+  var a6916;
+  var a6917;
+  var a6918;
+  var a6919;
+  var a6920;
+  var a6921;
+  var a6922;
+  var a6923;
+  var a6924;
+  var a6925;
+  var a6926;
+  var a6927;
+  var a6928;
+  var a6929;
+  var a6930;
+  var a6931;
+  var a6932;
+  var a6933;
+  var a6934;
+  var a6935;
+  var a6936;
+  var a6937;
+  var a6938;
+  var a6939;
+  var a6940;
+  var a6941;
+  var a6942;
+  var a6943;
+  var a6944;
+  var a6945;
+  var a6946;
+  var a6947;
+  var a6948;
+  var a6949;
+  var a6950;
+  var a6951;
+  var a6952;
+  var a6953;
+  var a6954;
+  var a6955;
+  var a6956;
+  var a6957;
+  var a6958;
+  var a6959;
+  var a6960;
+  var a6961;
+  var a6962;
+  var a6963;
+  var a6964;
+  var a6965;
+  var a6966;
+  var a6967;
+  var a6968;
+  var a6969;
+  var a6970;
+  var a6971;
+  var a6972;
+  var a6973;
+  var a6974;
+  var a6975;
+  var a6976;
+  var a6977;
+  var a6978;
+  var a6979;
+  var a6980;
+  var a6981;
+  var a6982;
+  var a6983;
+  var a6984;
+  var a6985;
+  var a6986;
+  var a6987;
+  var a6988;
+  var a6989;
+  var a6990;
+  var a6991;
+  var a6992;
+  var a6993;
+  var a6994;
+  var a6995;
+  var a6996;
+  var a6997;
+  var a6998;
+  var a6999;
+  var a7000;
+  var a7001;
+  var a7002;
+  var a7003;
+  var a7004;
+  var a7005;
+  var a7006;
+  var a7007;
+  var a7008;
+  var a7009;
+  var a7010;
+  var a7011;
+  var a7012;
+  var a7013;
+  var a7014;
+  var a7015;
+  var a7016;
+  var a7017;
+  var a7018;
+  var a7019;
+  var a7020;
+  var a7021;
+  var a7022;
+  var a7023;
+  var a7024;
+  var a7025;
+  var a7026;
+  var a7027;
+  var a7028;
+  var a7029;
+  var a7030;
+  var a7031;
+  var a7032;
+  var a7033;
+  var a7034;
+  var a7035;
+  var a7036;
+  var a7037;
+  var a7038;
+  var a7039;
+  var a7040;
+  var a7041;
+  var a7042;
+  var a7043;
+  var a7044;
+  var a7045;
+  var a7046;
+  var a7047;
+  var a7048;
+  var a7049;
+  var a7050;
+  var a7051;
+  var a7052;
+  var a7053;
+  var a7054;
+  var a7055;
+  var a7056;
+  var a7057;
+  var a7058;
+  var a7059;
+  var a7060;
+  var a7061;
+  var a7062;
+  var a7063;
+  var a7064;
+  var a7065;
+  var a7066;
+  var a7067;
+  var a7068;
+  var a7069;
+  var a7070;
+  var a7071;
+  var a7072;
+  var a7073;
+  var a7074;
+  var a7075;
+  var a7076;
+  var a7077;
+  var a7078;
+  var a7079;
+  var a7080;
+  var a7081;
+  var a7082;
+  var a7083;
+  var a7084;
+  var a7085;
+  var a7086;
+  var a7087;
+  var a7088;
+  var a7089;
+  var a7090;
+  var a7091;
+  var a7092;
+  var a7093;
+  var a7094;
+  var a7095;
+  var a7096;
+  var a7097;
+  var a7098;
+  var a7099;
+  var a7100;
+  var a7101;
+  var a7102;
+  var a7103;
+  var a7104;
+  var a7105;
+  var a7106;
+  var a7107;
+  var a7108;
+  var a7109;
+  var a7110;
+  var a7111;
+  var a7112;
+  var a7113;
+  var a7114;
+  var a7115;
+  var a7116;
+  var a7117;
+  var a7118;
+  var a7119;
+  var a7120;
+  var a7121;
+  var a7122;
+  var a7123;
+  var a7124;
+  var a7125;
+  var a7126;
+  var a7127;
+  var a7128;
+  var a7129;
+  var a7130;
+  var a7131;
+  var a7132;
+  var a7133;
+  var a7134;
+  var a7135;
+  var a7136;
+  var a7137;
+  var a7138;
+  var a7139;
+  var a7140;
+  var a7141;
+  var a7142;
+  var a7143;
+  var a7144;
+  var a7145;
+  var a7146;
+  var a7147;
+  var a7148;
+  var a7149;
+  var a7150;
+  var a7151;
+  var a7152;
+  var a7153;
+  var a7154;
+  var a7155;
+  var a7156;
+  var a7157;
+  var a7158;
+  var a7159;
+  var a7160;
+  var a7161;
+  var a7162;
+  var a7163;
+  var a7164;
+  var a7165;
+  var a7166;
+  var a7167;
+  var a7168;
+  var a7169;
+  var a7170;
+  var a7171;
+  var a7172;
+  var a7173;
+  var a7174;
+  var a7175;
+  var a7176;
+  var a7177;
+  var a7178;
+  var a7179;
+  var a7180;
+  var a7181;
+  var a7182;
+  var a7183;
+  var a7184;
+  var a7185;
+  var a7186;
+  var a7187;
+  var a7188;
+  var a7189;
+  var a7190;
+  var a7191;
+  var a7192;
+  var a7193;
+  var a7194;
+  var a7195;
+  var a7196;
+  var a7197;
+  var a7198;
+  var a7199;
+  var a7200;
+  var a7201;
+  var a7202;
+  var a7203;
+  var a7204;
+  var a7205;
+  var a7206;
+  var a7207;
+  var a7208;
+  var a7209;
+  var a7210;
+  var a7211;
+  var a7212;
+  var a7213;
+  var a7214;
+  var a7215;
+  var a7216;
+  var a7217;
+  var a7218;
+  var a7219;
+  var a7220;
+  var a7221;
+  var a7222;
+  var a7223;
+  var a7224;
+  var a7225;
+  var a7226;
+  var a7227;
+  var a7228;
+  var a7229;
+  var a7230;
+  var a7231;
+  var a7232;
+  var a7233;
+  var a7234;
+  var a7235;
+  var a7236;
+  var a7237;
+  var a7238;
+  var a7239;
+  var a7240;
+  var a7241;
+  var a7242;
+  var a7243;
+  var a7244;
+  var a7245;
+  var a7246;
+  var a7247;
+  var a7248;
+  var a7249;
+  var a7250;
+  var a7251;
+  var a7252;
+  var a7253;
+  var a7254;
+  var a7255;
+  var a7256;
+  var a7257;
+  var a7258;
+  var a7259;
+  var a7260;
+  var a7261;
+  var a7262;
+  var a7263;
+  var a7264;
+  var a7265;
+  var a7266;
+  var a7267;
+  var a7268;
+  var a7269;
+  var a7270;
+  var a7271;
+  var a7272;
+  var a7273;
+  var a7274;
+  var a7275;
+  var a7276;
+  var a7277;
+  var a7278;
+  var a7279;
+  var a7280;
+  var a7281;
+  var a7282;
+  var a7283;
+  var a7284;
+  var a7285;
+  var a7286;
+  var a7287;
+  var a7288;
+  var a7289;
+  var a7290;
+  var a7291;
+  var a7292;
+  var a7293;
+  var a7294;
+  var a7295;
+  var a7296;
+  var a7297;
+  var a7298;
+  var a7299;
+  var a7300;
+  var a7301;
+  var a7302;
+  var a7303;
+  var a7304;
+  var a7305;
+  var a7306;
+  var a7307;
+  var a7308;
+  var a7309;
+  var a7310;
+  var a7311;
+  var a7312;
+  var a7313;
+  var a7314;
+  var a7315;
+  var a7316;
+  var a7317;
+  var a7318;
+  var a7319;
+  var a7320;
+  var a7321;
+  var a7322;
+  var a7323;
+  var a7324;
+  var a7325;
+  var a7326;
+  var a7327;
+  var a7328;
+  var a7329;
+  var a7330;
+  var a7331;
+  var a7332;
+  var a7333;
+  var a7334;
+  var a7335;
+  var a7336;
+  var a7337;
+  var a7338;
+  var a7339;
+  var a7340;
+  var a7341;
+  var a7342;
+  var a7343;
+  var a7344;
+  var a7345;
+  var a7346;
+  var a7347;
+  var a7348;
+  var a7349;
+  var a7350;
+  var a7351;
+  var a7352;
+  var a7353;
+  var a7354;
+  var a7355;
+  var a7356;
+  var a7357;
+  var a7358;
+  var a7359;
+  var a7360;
+  var a7361;
+  var a7362;
+  var a7363;
+  var a7364;
+  var a7365;
+  var a7366;
+  var a7367;
+  var a7368;
+  var a7369;
+  var a7370;
+  var a7371;
+  var a7372;
+  var a7373;
+  var a7374;
+  var a7375;
+  var a7376;
+  var a7377;
+  var a7378;
+  var a7379;
+  var a7380;
+  var a7381;
+  var a7382;
+  var a7383;
+  var a7384;
+  var a7385;
+  var a7386;
+  var a7387;
+  var a7388;
+  var a7389;
+  var a7390;
+  var a7391;
+  var a7392;
+  var a7393;
+  var a7394;
+  var a7395;
+  var a7396;
+  var a7397;
+  var a7398;
+  var a7399;
+  var a7400;
+  var a7401;
+  var a7402;
+  var a7403;
+  var a7404;
+  var a7405;
+  var a7406;
+  var a7407;
+  var a7408;
+  var a7409;
+  var a7410;
+  var a7411;
+  var a7412;
+  var a7413;
+  var a7414;
+  var a7415;
+  var a7416;
+  var a7417;
+  var a7418;
+  var a7419;
+  var a7420;
+  var a7421;
+  var a7422;
+  var a7423;
+  var a7424;
+  var a7425;
+  var a7426;
+  var a7427;
+  var a7428;
+  var a7429;
+  var a7430;
+  var a7431;
+  var a7432;
+  var a7433;
+  var a7434;
+  var a7435;
+  var a7436;
+  var a7437;
+  var a7438;
+  var a7439;
+  var a7440;
+  var a7441;
+  var a7442;
+  var a7443;
+  var a7444;
+  var a7445;
+  var a7446;
+  var a7447;
+  var a7448;
+  var a7449;
+  var a7450;
+  var a7451;
+  var a7452;
+  var a7453;
+  var a7454;
+  var a7455;
+  var a7456;
+  var a7457;
+  var a7458;
+  var a7459;
+  var a7460;
+  var a7461;
+  var a7462;
+  var a7463;
+  var a7464;
+  var a7465;
+  var a7466;
+  var a7467;
+  var a7468;
+  var a7469;
+  var a7470;
+  var a7471;
+  var a7472;
+  var a7473;
+  var a7474;
+  var a7475;
+  var a7476;
+  var a7477;
+  var a7478;
+  var a7479;
+  var a7480;
+  var a7481;
+  var a7482;
+  var a7483;
+  var a7484;
+  var a7485;
+  var a7486;
+  var a7487;
+  var a7488;
+  var a7489;
+  var a7490;
+  var a7491;
+  var a7492;
+  var a7493;
+  var a7494;
+  var a7495;
+  var a7496;
+  var a7497;
+  var a7498;
+  var a7499;
+  var a7500;
+  var a7501;
+  var a7502;
+  var a7503;
+  var a7504;
+  var a7505;
+  var a7506;
+  var a7507;
+  var a7508;
+  var a7509;
+  var a7510;
+  var a7511;
+  var a7512;
+  var a7513;
+  var a7514;
+  var a7515;
+  var a7516;
+  var a7517;
+  var a7518;
+  var a7519;
+  var a7520;
+  var a7521;
+  var a7522;
+  var a7523;
+  var a7524;
+  var a7525;
+  var a7526;
+  var a7527;
+  var a7528;
+  var a7529;
+  var a7530;
+  var a7531;
+  var a7532;
+  var a7533;
+  var a7534;
+  var a7535;
+  var a7536;
+  var a7537;
+  var a7538;
+  var a7539;
+  var a7540;
+  var a7541;
+  var a7542;
+  var a7543;
+  var a7544;
+  var a7545;
+  var a7546;
+  var a7547;
+  var a7548;
+  var a7549;
+  var a7550;
+  var a7551;
+  var a7552;
+  var a7553;
+  var a7554;
+  var a7555;
+  var a7556;
+  var a7557;
+  var a7558;
+  var a7559;
+  var a7560;
+  var a7561;
+  var a7562;
+  var a7563;
+  var a7564;
+  var a7565;
+  var a7566;
+  var a7567;
+  var a7568;
+  var a7569;
+  var a7570;
+  var a7571;
+  var a7572;
+  var a7573;
+  var a7574;
+  var a7575;
+  var a7576;
+  var a7577;
+  var a7578;
+  var a7579;
+  var a7580;
+  var a7581;
+  var a7582;
+  var a7583;
+  var a7584;
+  var a7585;
+  var a7586;
+  var a7587;
+  var a7588;
+  var a7589;
+  var a7590;
+  var a7591;
+  var a7592;
+  var a7593;
+  var a7594;
+  var a7595;
+  var a7596;
+  var a7597;
+  var a7598;
+  var a7599;
+  var a7600;
+  var a7601;
+  var a7602;
+  var a7603;
+  var a7604;
+  var a7605;
+  var a7606;
+  var a7607;
+  var a7608;
+  var a7609;
+  var a7610;
+  var a7611;
+  var a7612;
+  var a7613;
+  var a7614;
+  var a7615;
+  var a7616;
+  var a7617;
+  var a7618;
+  var a7619;
+  var a7620;
+  var a7621;
+  var a7622;
+  var a7623;
+  var a7624;
+  var a7625;
+  var a7626;
+  var a7627;
+  var a7628;
+  var a7629;
+  var a7630;
+  var a7631;
+  var a7632;
+  var a7633;
+  var a7634;
+  var a7635;
+  var a7636;
+  var a7637;
+  var a7638;
+  var a7639;
+  var a7640;
+  var a7641;
+  var a7642;
+  var a7643;
+  var a7644;
+  var a7645;
+  var a7646;
+  var a7647;
+  var a7648;
+  var a7649;
+  var a7650;
+  var a7651;
+  var a7652;
+  var a7653;
+  var a7654;
+  var a7655;
+  var a7656;
+  var a7657;
+  var a7658;
+  var a7659;
+  var a7660;
+  var a7661;
+  var a7662;
+  var a7663;
+  var a7664;
+  var a7665;
+  var a7666;
+  var a7667;
+  var a7668;
+  var a7669;
+  var a7670;
+  var a7671;
+  var a7672;
+  var a7673;
+  var a7674;
+  var a7675;
+  var a7676;
+  var a7677;
+  var a7678;
+  var a7679;
+  var a7680;
+  var a7681;
+  var a7682;
+  var a7683;
+  var a7684;
+  var a7685;
+  var a7686;
+  var a7687;
+  var a7688;
+  var a7689;
+  var a7690;
+  var a7691;
+  var a7692;
+  var a7693;
+  var a7694;
+  var a7695;
+  var a7696;
+  var a7697;
+  var a7698;
+  var a7699;
+  var a7700;
+  var a7701;
+  var a7702;
+  var a7703;
+  var a7704;
+  var a7705;
+  var a7706;
+  var a7707;
+  var a7708;
+  var a7709;
+  var a7710;
+  var a7711;
+  var a7712;
+  var a7713;
+  var a7714;
+  var a7715;
+  var a7716;
+  var a7717;
+  var a7718;
+  var a7719;
+  var a7720;
+  var a7721;
+  var a7722;
+  var a7723;
+  var a7724;
+  var a7725;
+  var a7726;
+  var a7727;
+  var a7728;
+  var a7729;
+  var a7730;
+  var a7731;
+  var a7732;
+  var a7733;
+  var a7734;
+  var a7735;
+  var a7736;
+  var a7737;
+  var a7738;
+  var a7739;
+  var a7740;
+  var a7741;
+  var a7742;
+  var a7743;
+  var a7744;
+  var a7745;
+  var a7746;
+  var a7747;
+  var a7748;
+  var a7749;
+  var a7750;
+  var a7751;
+  var a7752;
+  var a7753;
+  var a7754;
+  var a7755;
+  var a7756;
+  var a7757;
+  var a7758;
+  var a7759;
+  var a7760;
+  var a7761;
+  var a7762;
+  var a7763;
+  var a7764;
+  var a7765;
+  var a7766;
+  var a7767;
+  var a7768;
+  var a7769;
+  var a7770;
+  var a7771;
+  var a7772;
+  var a7773;
+  var a7774;
+  var a7775;
+  var a7776;
+  var a7777;
+  var a7778;
+  var a7779;
+  var a7780;
+  var a7781;
+  var a7782;
+  var a7783;
+  var a7784;
+  var a7785;
+  var a7786;
+  var a7787;
+  var a7788;
+  var a7789;
+  var a7790;
+  var a7791;
+  var a7792;
+  var a7793;
+  var a7794;
+  var a7795;
+  var a7796;
+  var a7797;
+  var a7798;
+  var a7799;
+  var a7800;
+  var a7801;
+  var a7802;
+  var a7803;
+  var a7804;
+  var a7805;
+  var a7806;
+  var a7807;
+  var a7808;
+  var a7809;
+  var a7810;
+  var a7811;
+  var a7812;
+  var a7813;
+  var a7814;
+  var a7815;
+  var a7816;
+  var a7817;
+  var a7818;
+  var a7819;
+  var a7820;
+  var a7821;
+  var a7822;
+  var a7823;
+  var a7824;
+  var a7825;
+  var a7826;
+  var a7827;
+  var a7828;
+  var a7829;
+  var a7830;
+  var a7831;
+  var a7832;
+  var a7833;
+  var a7834;
+  var a7835;
+  var a7836;
+  var a7837;
+  var a7838;
+  var a7839;
+  var a7840;
+  var a7841;
+  var a7842;
+  var a7843;
+  var a7844;
+  var a7845;
+  var a7846;
+  var a7847;
+  var a7848;
+  var a7849;
+  var a7850;
+  var a7851;
+  var a7852;
+  var a7853;
+  var a7854;
+  var a7855;
+  var a7856;
+  var a7857;
+  var a7858;
+  var a7859;
+  var a7860;
+  var a7861;
+  var a7862;
+  var a7863;
+  var a7864;
+  var a7865;
+  var a7866;
+  var a7867;
+  var a7868;
+  var a7869;
+  var a7870;
+  var a7871;
+  var a7872;
+  var a7873;
+  var a7874;
+  var a7875;
+  var a7876;
+  var a7877;
+  var a7878;
+  var a7879;
+  var a7880;
+  var a7881;
+  var a7882;
+  var a7883;
+  var a7884;
+  var a7885;
+  var a7886;
+  var a7887;
+  var a7888;
+  var a7889;
+  var a7890;
+  var a7891;
+  var a7892;
+  var a7893;
+  var a7894;
+  var a7895;
+  var a7896;
+  var a7897;
+  var a7898;
+  var a7899;
+  var a7900;
+  var a7901;
+  var a7902;
+  var a7903;
+  var a7904;
+  var a7905;
+  var a7906;
+  var a7907;
+  var a7908;
+  var a7909;
+  var a7910;
+  var a7911;
+  var a7912;
+  var a7913;
+  var a7914;
+  var a7915;
+  var a7916;
+  var a7917;
+  var a7918;
+  var a7919;
+  var a7920;
+  var a7921;
+  var a7922;
+  var a7923;
+  var a7924;
+  var a7925;
+  var a7926;
+  var a7927;
+  var a7928;
+  var a7929;
+  var a7930;
+  var a7931;
+  var a7932;
+  var a7933;
+  var a7934;
+  var a7935;
+  var a7936;
+  var a7937;
+  var a7938;
+  var a7939;
+  var a7940;
+  var a7941;
+  var a7942;
+  var a7943;
+  var a7944;
+  var a7945;
+  var a7946;
+  var a7947;
+  var a7948;
+  var a7949;
+  var a7950;
+  var a7951;
+  var a7952;
+  var a7953;
+  var a7954;
+  var a7955;
+  var a7956;
+  var a7957;
+  var a7958;
+  var a7959;
+  var a7960;
+  var a7961;
+  var a7962;
+  var a7963;
+  var a7964;
+  var a7965;
+  var a7966;
+  var a7967;
+  var a7968;
+  var a7969;
+  var a7970;
+  var a7971;
+  var a7972;
+  var a7973;
+  var a7974;
+  var a7975;
+  var a7976;
+  var a7977;
+  var a7978;
+  var a7979;
+  var a7980;
+  var a7981;
+  var a7982;
+  var a7983;
+  var a7984;
+  var a7985;
+  var a7986;
+  var a7987;
+  var a7988;
+  var a7989;
+  var a7990;
+  var a7991;
+  var a7992;
+  var a7993;
+  var a7994;
+  var a7995;
+  var a7996;
+  var a7997;
+  var a7998;
+  var a7999;
+  var a8000;
+  var a8001;
+  var a8002;
+  var a8003;
+  var a8004;
+  var a8005;
+  var a8006;
+  var a8007;
+  var a8008;
+  var a8009;
+  var a8010;
+  var a8011;
+  var a8012;
+  var a8013;
+  var a8014;
+  var a8015;
+  var a8016;
+  var a8017;
+  var a8018;
+  var a8019;
+  var a8020;
+  var a8021;
+  var a8022;
+  var a8023;
+  var a8024;
+  var a8025;
+  var a8026;
+  var a8027;
+  var a8028;
+  var a8029;
+  var a8030;
+  var a8031;
+  var a8032;
+  var a8033;
+  var a8034;
+  var a8035;
+  var a8036;
+  var a8037;
+  var a8038;
+  var a8039;
+  var a8040;
+  var a8041;
+  var a8042;
+  var a8043;
+  var a8044;
+  var a8045;
+  var a8046;
+  var a8047;
+  var a8048;
+  var a8049;
+  var a8050;
+  var a8051;
+  var a8052;
+  var a8053;
+  var a8054;
+  var a8055;
+  var a8056;
+  var a8057;
+  var a8058;
+  var a8059;
+  var a8060;
+  var a8061;
+  var a8062;
+  var a8063;
+  var a8064;
+  var a8065;
+  var a8066;
+  var a8067;
+  var a8068;
+  var a8069;
+  var a8070;
+  var a8071;
+  var a8072;
+  var a8073;
+  var a8074;
+  var a8075;
+  var a8076;
+  var a8077;
+  var a8078;
+  var a8079;
+  var a8080;
+  var a8081;
+  var a8082;
+  var a8083;
+  var a8084;
+  var a8085;
+  var a8086;
+  var a8087;
+  var a8088;
+  var a8089;
+  var a8090;
+  var a8091;
+  var a8092;
+  var a8093;
+  var a8094;
+  var a8095;
+  var a8096;
+  var a8097;
+  var a8098;
+  var a8099;
+  var a8100;
+  var a8101;
+  var a8102;
+  var a8103;
+  var a8104;
+  var a8105;
+  var a8106;
+  var a8107;
+  var a8108;
+  var a8109;
+  var a8110;
+  var a8111;
+  var a8112;
+  var a8113;
+  var a8114;
+  var a8115;
+  var a8116;
+  var a8117;
+  var a8118;
+  var a8119;
+  var a8120;
+  var a8121;
+  var a8122;
+  var a8123;
+  var a8124;
+  var a8125;
+  var a8126;
+  var a8127;
+  var a8128;
+  var a8129;
+  var a8130;
+  var a8131;
+  var a8132;
+  var a8133;
+  var a8134;
+  var a8135;
+  var a8136;
+  var a8137;
+  var a8138;
+  var a8139;
+  var a8140;
+  var a8141;
+  var a8142;
+  var a8143;
+  var a8144;
+  var a8145;
+  var a8146;
+  var a8147;
+  var a8148;
+  var a8149;
+  var a8150;
+  var a8151;
+  var a8152;
+  var a8153;
+  var a8154;
+  var a8155;
+  var a8156;
+  var a8157;
+  var a8158;
+  var a8159;
+  var a8160;
+  var a8161;
+  var a8162;
+  var a8163;
+  var a8164;
+  var a8165;
+  var a8166;
+  var a8167;
+  var a8168;
+  var a8169;
+  var a8170;
+  var a8171;
+  var a8172;
+  var a8173;
+  var a8174;
+  var a8175;
+  var a8176;
+  var a8177;
+  var a8178;
+  var a8179;
+  var a8180;
+  var a8181;
+  var a8182;
+  var a8183;
+  var a8184;
+  var a8185;
+  var a8186;
+  var a8187;
+  var a8188;
+  var a8189;
+  var a8190;
+  var a8191;
+  var a8192;
+  var a8193;
+  var a8194;
+  var a8195;
+  var a8196;
+  var a8197;
+  var a8198;
+  var a8199;
+  var a8200;
+  var a8201;
+  var a8202;
+  var a8203;
+  var a8204;
+  var a8205;
+  var a8206;
+  var a8207;
+  var a8208;
+  var a8209;
+  var a8210;
+  var a8211;
+  var a8212;
+  var a8213;
+  var a8214;
+  var a8215;
+  var a8216;
+  var a8217;
+  var a8218;
+  var a8219;
+  var a8220;
+  var a8221;
+  var a8222;
+  var a8223;
+  var a8224;
+  var a8225;
+  var a8226;
+  var a8227;
+  var a8228;
+  var a8229;
+  var a8230;
+  var a8231;
+  var a8232;
+  var a8233;
+  var a8234;
+  var a8235;
+  var a8236;
+  var a8237;
+  var a8238;
+  var a8239;
+  var a8240;
+  var a8241;
+  var a8242;
+  var a8243;
+  var a8244;
+  var a8245;
+  var a8246;
+  var a8247;
+  var a8248;
+  var a8249;
+  var a8250;
+  var a8251;
+  var a8252;
+  var a8253;
+  var a8254;
+  var a8255;
+  var a8256;
+  var a8257;
+  var a8258;
+  var a8259;
+  var a8260;
+  var a8261;
+  var a8262;
+  var a8263;
+  var a8264;
+  var a8265;
+  var a8266;
+  var a8267;
+  var a8268;
+  var a8269;
+  var a8270;
+  var a8271;
+  var a8272;
+  var a8273;
+  var a8274;
+  var a8275;
+  var a8276;
+  var a8277;
+  var a8278;
+  var a8279;
+  var a8280;
+  var a8281;
+  var a8282;
+  var a8283;
+  var a8284;
+  var a8285;
+  var a8286;
+  var a8287;
+  var a8288;
+  var a8289;
+  var a8290;
+  var a8291;
+  var a8292;
+  var a8293;
+  var a8294;
+  var a8295;
+  var a8296;
+  var a8297;
+  var a8298;
+  var a8299;
+  var a8300;
+  var a8301;
+  var a8302;
+  var a8303;
+  var a8304;
+  var a8305;
+  var a8306;
+  var a8307;
+  var a8308;
+  var a8309;
+  var a8310;
+  var a8311;
+  var a8312;
+  var a8313;
+  var a8314;
+  var a8315;
+  var a8316;
+  var a8317;
+  var a8318;
+  var a8319;
+  var a8320;
+  var a8321;
+  var a8322;
+  var a8323;
+  var a8324;
+  var a8325;
+  var a8326;
+  var a8327;
+  var a8328;
+  var a8329;
+  var a8330;
+  var a8331;
+  var a8332;
+  var a8333;
+  var a8334;
+  var a8335;
+  var a8336;
+  var a8337;
+  var a8338;
+  var a8339;
+  var a8340;
+  var a8341;
+  var a8342;
+  var a8343;
+  var a8344;
+  var a8345;
+  var a8346;
+  var a8347;
+  var a8348;
+  var a8349;
+  var a8350;
+  var a8351;
+  var a8352;
+  var a8353;
+  var a8354;
+  var a8355;
+  var a8356;
+  var a8357;
+  var a8358;
+  var a8359;
+  var a8360;
+  var a8361;
+  var a8362;
+  var a8363;
+  var a8364;
+  var a8365;
+  var a8366;
+  var a8367;
+  var a8368;
+  var a8369;
+  var a8370;
+  var a8371;
+  var a8372;
+  var a8373;
+  var a8374;
+  var a8375;
+  var a8376;
+  var a8377;
+  var a8378;
+  var a8379;
+  var a8380;
+  var a8381;
+  var a8382;
+  var a8383;
+  var a8384;
+  var a8385;
+  var a8386;
+  var a8387;
+  var a8388;
+  var a8389;
+  var a8390;
+  var a8391;
+  var a8392;
+  var a8393;
+  var a8394;
+  var a8395;
+  var a8396;
+  var a8397;
+  var a8398;
+  var a8399;
+  var a8400;
+  var a8401;
+  var a8402;
+  var a8403;
+  var a8404;
+  var a8405;
+  var a8406;
+  var a8407;
+  var a8408;
+  var a8409;
+  var a8410;
+  var a8411;
+  var a8412;
+  var a8413;
+  var a8414;
+  var a8415;
+  var a8416;
+  var a8417;
+  var a8418;
+  var a8419;
+  var a8420;
+  var a8421;
+  var a8422;
+  var a8423;
+  var a8424;
+  var a8425;
+  var a8426;
+  var a8427;
+  var a8428;
+  var a8429;
+  var a8430;
+  var a8431;
+  var a8432;
+  var a8433;
+  var a8434;
+  var a8435;
+  var a8436;
+  var a8437;
+  var a8438;
+  var a8439;
+  var a8440;
+  var a8441;
+  var a8442;
+  var a8443;
+  var a8444;
+  var a8445;
+  var a8446;
+  var a8447;
+  var a8448;
+  var a8449;
+  var a8450;
+  var a8451;
+  var a8452;
+  var a8453;
+  var a8454;
+  var a8455;
+  var a8456;
+  var a8457;
+  var a8458;
+  var a8459;
+  var a8460;
+  var a8461;
+  var a8462;
+  var a8463;
+  var a8464;
+  var a8465;
+  var a8466;
+  var a8467;
+  var a8468;
+  var a8469;
+  var a8470;
+  var a8471;
+  var a8472;
+  var a8473;
+  var a8474;
+  var a8475;
+  var a8476;
+  var a8477;
+  var a8478;
+  var a8479;
+  var a8480;
+  var a8481;
+  var a8482;
+  var a8483;
+  var a8484;
+  var a8485;
+  var a8486;
+  var a8487;
+  var a8488;
+  var a8489;
+  var a8490;
+  var a8491;
+  var a8492;
+  var a8493;
+  var a8494;
+  var a8495;
+  var a8496;
+  var a8497;
+  var a8498;
+  var a8499;
+  var a8500;
+  var a8501;
+  var a8502;
+  var a8503;
+  var a8504;
+  var a8505;
+  var a8506;
+  var a8507;
+  var a8508;
+  var a8509;
+  var a8510;
+  var a8511;
+  var a8512;
+  var a8513;
+  var a8514;
+  var a8515;
+  var a8516;
+  var a8517;
+  var a8518;
+  var a8519;
+  var a8520;
+  var a8521;
+  var a8522;
+  var a8523;
+  var a8524;
+  var a8525;
+  var a8526;
+  var a8527;
+  var a8528;
+  var a8529;
+  var a8530;
+  var a8531;
+  var a8532;
+  var a8533;
+  var a8534;
+  var a8535;
+  var a8536;
+  var a8537;
+  var a8538;
+  var a8539;
+  var a8540;
+  var a8541;
+  var a8542;
+  var a8543;
+  var a8544;
+  var a8545;
+  var a8546;
+  var a8547;
+  var a8548;
+  var a8549;
+  var a8550;
+  var a8551;
+  var a8552;
+  var a8553;
+  var a8554;
+  var a8555;
+  var a8556;
+  var a8557;
+  var a8558;
+  var a8559;
+  var a8560;
+  var a8561;
+  var a8562;
+  var a8563;
+  var a8564;
+  var a8565;
+  var a8566;
+  var a8567;
+  var a8568;
+  var a8569;
+  var a8570;
+  var a8571;
+  var a8572;
+  var a8573;
+  var a8574;
+  var a8575;
+  var a8576;
+  var a8577;
+  var a8578;
+  var a8579;
+  var a8580;
+  var a8581;
+  var a8582;
+  var a8583;
+  var a8584;
+  var a8585;
+  var a8586;
+  var a8587;
+  var a8588;
+  var a8589;
+  var a8590;
+  var a8591;
+  var a8592;
+  var a8593;
+  var a8594;
+  var a8595;
+  var a8596;
+  var a8597;
+  var a8598;
+  var a8599;
+  var a8600;
+  var a8601;
+  var a8602;
+  var a8603;
+  var a8604;
+  var a8605;
+  var a8606;
+  var a8607;
+  var a8608;
+  var a8609;
+  var a8610;
+  var a8611;
+  var a8612;
+  var a8613;
+  var a8614;
+  var a8615;
+  var a8616;
+  var a8617;
+  var a8618;
+  var a8619;
+  var a8620;
+  var a8621;
+  var a8622;
+  var a8623;
+  var a8624;
+  var a8625;
+  var a8626;
+  var a8627;
+  var a8628;
+  var a8629;
+  var a8630;
+  var a8631;
+  var a8632;
+  var a8633;
+  var a8634;
+  var a8635;
+  var a8636;
+  var a8637;
+  var a8638;
+  var a8639;
+  var a8640;
+  var a8641;
+  var a8642;
+  var a8643;
+  var a8644;
+  var a8645;
+  var a8646;
+  var a8647;
+  var a8648;
+  var a8649;
+  var a8650;
+  var a8651;
+  var a8652;
+  var a8653;
+  var a8654;
+  var a8655;
+  var a8656;
+  var a8657;
+  var a8658;
+  var a8659;
+  var a8660;
+  var a8661;
+  var a8662;
+  var a8663;
+  var a8664;
+  var a8665;
+  var a8666;
+  var a8667;
+  var a8668;
+  var a8669;
+  var a8670;
+  var a8671;
+  var a8672;
+  var a8673;
+  var a8674;
+  var a8675;
+  var a8676;
+  var a8677;
+  var a8678;
+  var a8679;
+  var a8680;
+  var a8681;
+  var a8682;
+  var a8683;
+  var a8684;
+  var a8685;
+  var a8686;
+  var a8687;
+  var a8688;
+  var a8689;
+  var a8690;
+  var a8691;
+  var a8692;
+  var a8693;
+  var a8694;
+  var a8695;
+  var a8696;
+  var a8697;
+  var a8698;
+  var a8699;
+  var a8700;
+  var a8701;
+  var a8702;
+  var a8703;
+  var a8704;
+  var a8705;
+  var a8706;
+  var a8707;
+  var a8708;
+  var a8709;
+  var a8710;
+  var a8711;
+  var a8712;
+  var a8713;
+  var a8714;
+  var a8715;
+  var a8716;
+  var a8717;
+  var a8718;
+  var a8719;
+  var a8720;
+  var a8721;
+  var a8722;
+  var a8723;
+  var a8724;
+  var a8725;
+  var a8726;
+  var a8727;
+  var a8728;
+  var a8729;
+  var a8730;
+  var a8731;
+  var a8732;
+  var a8733;
+  var a8734;
+  var a8735;
+  var a8736;
+  var a8737;
+  var a8738;
+  var a8739;
+  var a8740;
+  var a8741;
+  var a8742;
+  var a8743;
+  var a8744;
+  var a8745;
+  var a8746;
+  var a8747;
+  var a8748;
+  var a8749;
+  var a8750;
+  var a8751;
+  var a8752;
+  var a8753;
+  var a8754;
+  var a8755;
+  var a8756;
+  var a8757;
+  var a8758;
+  var a8759;
+  var a8760;
+  var a8761;
+  var a8762;
+  var a8763;
+  var a8764;
+  var a8765;
+  var a8766;
+  var a8767;
+  var a8768;
+  var a8769;
+  var a8770;
+  var a8771;
+  var a8772;
+  var a8773;
+  var a8774;
+  var a8775;
+  var a8776;
+  var a8777;
+  var a8778;
+  var a8779;
+  var a8780;
+  var a8781;
+  var a8782;
+  var a8783;
+  var a8784;
+  var a8785;
+  var a8786;
+  var a8787;
+  var a8788;
+  var a8789;
+  var a8790;
+  var a8791;
+  var a8792;
+  var a8793;
+  var a8794;
+  var a8795;
+  var a8796;
+  var a8797;
+  var a8798;
+  var a8799;
+  var a8800;
+  var a8801;
+  var a8802;
+  var a8803;
+  var a8804;
+  var a8805;
+  var a8806;
+  var a8807;
+  var a8808;
+  var a8809;
+  var a8810;
+  var a8811;
+  var a8812;
+  var a8813;
+  var a8814;
+  var a8815;
+  var a8816;
+  var a8817;
+  var a8818;
+  var a8819;
+  var a8820;
+  var a8821;
+  var a8822;
+  var a8823;
+  var a8824;
+  var a8825;
+  var a8826;
+  var a8827;
+  var a8828;
+  var a8829;
+  var a8830;
+  var a8831;
+  var a8832;
+  var a8833;
+  var a8834;
+  var a8835;
+  var a8836;
+  var a8837;
+  var a8838;
+  var a8839;
+  var a8840;
+  var a8841;
+  var a8842;
+  var a8843;
+  var a8844;
+  var a8845;
+  var a8846;
+  var a8847;
+  var a8848;
+  var a8849;
+  var a8850;
+  var a8851;
+  var a8852;
+  var a8853;
+  var a8854;
+  var a8855;
+  var a8856;
+  var a8857;
+  var a8858;
+  var a8859;
+  var a8860;
+  var a8861;
+  var a8862;
+  var a8863;
+  var a8864;
+  var a8865;
+  var a8866;
+  var a8867;
+  var a8868;
+  var a8869;
+  var a8870;
+  var a8871;
+  var a8872;
+  var a8873;
+  var a8874;
+  var a8875;
+  var a8876;
+  var a8877;
+  var a8878;
+  var a8879;
+  var a8880;
+  var a8881;
+  var a8882;
+  var a8883;
+  var a8884;
+  var a8885;
+  var a8886;
+  var a8887;
+  var a8888;
+  var a8889;
+  var a8890;
+  var a8891;
+  var a8892;
+  var a8893;
+  var a8894;
+  var a8895;
+  var a8896;
+  var a8897;
+  var a8898;
+  var a8899;
+  var a8900;
+  var a8901;
+  var a8902;
+  var a8903;
+  var a8904;
+  var a8905;
+  var a8906;
+  var a8907;
+  var a8908;
+  var a8909;
+  var a8910;
+  var a8911;
+  var a8912;
+  var a8913;
+  var a8914;
+  var a8915;
+  var a8916;
+  var a8917;
+  var a8918;
+  var a8919;
+  var a8920;
+  var a8921;
+  var a8922;
+  var a8923;
+  var a8924;
+  var a8925;
+  var a8926;
+  var a8927;
+  var a8928;
+  var a8929;
+  var a8930;
+  var a8931;
+  var a8932;
+  var a8933;
+  var a8934;
+  var a8935;
+  var a8936;
+  var a8937;
+  var a8938;
+  var a8939;
+  var a8940;
+  var a8941;
+  var a8942;
+  var a8943;
+  var a8944;
+  var a8945;
+  var a8946;
+  var a8947;
+  var a8948;
+  var a8949;
+  var a8950;
+  var a8951;
+  var a8952;
+  var a8953;
+  var a8954;
+  var a8955;
+  var a8956;
+  var a8957;
+  var a8958;
+  var a8959;
+  var a8960;
+  var a8961;
+  var a8962;
+  var a8963;
+  var a8964;
+  var a8965;
+  var a8966;
+  var a8967;
+  var a8968;
+  var a8969;
+  var a8970;
+  var a8971;
+  var a8972;
+  var a8973;
+  var a8974;
+  var a8975;
+  var a8976;
+  var a8977;
+  var a8978;
+  var a8979;
+  var a8980;
+  var a8981;
+  var a8982;
+  var a8983;
+  var a8984;
+  var a8985;
+  var a8986;
+  var a8987;
+  var a8988;
+  var a8989;
+  var a8990;
+  var a8991;
+  var a8992;
+  var a8993;
+  var a8994;
+  var a8995;
+  var a8996;
+  var a8997;
+  var a8998;
+  var a8999;
+  var a9000;
+  var a9001;
+  var a9002;
+  var a9003;
+  var a9004;
+  var a9005;
+  var a9006;
+  var a9007;
+  var a9008;
+  var a9009;
+  var a9010;
+  var a9011;
+  var a9012;
+  var a9013;
+  var a9014;
+  var a9015;
+  var a9016;
+  var a9017;
+  var a9018;
+  var a9019;
+  var a9020;
+  var a9021;
+  var a9022;
+  var a9023;
+  var a9024;
+  var a9025;
+  var a9026;
+  var a9027;
+  var a9028;
+  var a9029;
+  var a9030;
+  var a9031;
+  var a9032;
+  var a9033;
+  var a9034;
+  var a9035;
+  var a9036;
+  var a9037;
+  var a9038;
+  var a9039;
+  var a9040;
+  var a9041;
+  var a9042;
+  var a9043;
+  var a9044;
+  var a9045;
+  var a9046;
+  var a9047;
+  var a9048;
+  var a9049;
+  var a9050;
+  var a9051;
+  var a9052;
+  var a9053;
+  var a9054;
+  var a9055;
+  var a9056;
+  var a9057;
+  var a9058;
+  var a9059;
+  var a9060;
+  var a9061;
+  var a9062;
+  var a9063;
+  var a9064;
+  var a9065;
+  var a9066;
+  var a9067;
+  var a9068;
+  var a9069;
+  var a9070;
+  var a9071;
+  var a9072;
+  var a9073;
+  var a9074;
+  var a9075;
+  var a9076;
+  var a9077;
+  var a9078;
+  var a9079;
+  var a9080;
+  var a9081;
+  var a9082;
+  var a9083;
+  var a9084;
+  var a9085;
+  var a9086;
+  var a9087;
+  var a9088;
+  var a9089;
+  var a9090;
+  var a9091;
+  var a9092;
+  var a9093;
+  var a9094;
+  var a9095;
+  var a9096;
+  var a9097;
+  var a9098;
+  var a9099;
+  var a9100;
+  var a9101;
+  var a9102;
+  var a9103;
+  var a9104;
+  var a9105;
+  var a9106;
+  var a9107;
+  var a9108;
+  var a9109;
+  var a9110;
+  var a9111;
+  var a9112;
+  var a9113;
+  var a9114;
+  var a9115;
+  var a9116;
+  var a9117;
+  var a9118;
+  var a9119;
+  var a9120;
+  var a9121;
+  var a9122;
+  var a9123;
+  var a9124;
+  var a9125;
+  var a9126;
+  var a9127;
+  var a9128;
+  var a9129;
+  var a9130;
+  var a9131;
+  var a9132;
+  var a9133;
+  var a9134;
+  var a9135;
+  var a9136;
+  var a9137;
+  var a9138;
+  var a9139;
+  var a9140;
+  var a9141;
+  var a9142;
+  var a9143;
+  var a9144;
+  var a9145;
+  var a9146;
+  var a9147;
+  var a9148;
+  var a9149;
+  var a9150;
+  var a9151;
+  var a9152;
+  var a9153;
+  var a9154;
+  var a9155;
+  var a9156;
+  var a9157;
+  var a9158;
+  var a9159;
+  var a9160;
+  var a9161;
+  var a9162;
+  var a9163;
+  var a9164;
+  var a9165;
+  var a9166;
+  var a9167;
+  var a9168;
+  var a9169;
+  var a9170;
+  var a9171;
+  var a9172;
+  var a9173;
+  var a9174;
+  var a9175;
+  var a9176;
+  var a9177;
+  var a9178;
+  var a9179;
+  var a9180;
+  var a9181;
+  var a9182;
+  var a9183;
+  var a9184;
+  var a9185;
+  var a9186;
+  var a9187;
+  var a9188;
+  var a9189;
+  var a9190;
+  var a9191;
+  var a9192;
+  var a9193;
+  var a9194;
+  var a9195;
+  var a9196;
+  var a9197;
+  var a9198;
+  var a9199;
+  var a9200;
+  var a9201;
+  var a9202;
+  var a9203;
+  var a9204;
+  var a9205;
+  var a9206;
+  var a9207;
+  var a9208;
+  var a9209;
+  var a9210;
+  var a9211;
+  var a9212;
+  var a9213;
+  var a9214;
+  var a9215;
+  var a9216;
+  var a9217;
+  var a9218;
+  var a9219;
+  var a9220;
+  var a9221;
+  var a9222;
+  var a9223;
+  var a9224;
+  var a9225;
+  var a9226;
+  var a9227;
+  var a9228;
+  var a9229;
+  var a9230;
+  var a9231;
+  var a9232;
+  var a9233;
+  var a9234;
+  var a9235;
+  var a9236;
+  var a9237;
+  var a9238;
+  var a9239;
+  var a9240;
+  var a9241;
+  var a9242;
+  var a9243;
+  var a9244;
+  var a9245;
+  var a9246;
+  var a9247;
+  var a9248;
+  var a9249;
+  var a9250;
+  var a9251;
+  var a9252;
+  var a9253;
+  var a9254;
+  var a9255;
+  var a9256;
+  var a9257;
+  var a9258;
+  var a9259;
+  var a9260;
+  var a9261;
+  var a9262;
+  var a9263;
+  var a9264;
+  var a9265;
+  var a9266;
+  var a9267;
+  var a9268;
+  var a9269;
+  var a9270;
+  var a9271;
+  var a9272;
+  var a9273;
+  var a9274;
+  var a9275;
+  var a9276;
+  var a9277;
+  var a9278;
+  var a9279;
+  var a9280;
+  var a9281;
+  var a9282;
+  var a9283;
+  var a9284;
+  var a9285;
+  var a9286;
+  var a9287;
+  var a9288;
+  var a9289;
+  var a9290;
+  var a9291;
+  var a9292;
+  var a9293;
+  var a9294;
+  var a9295;
+  var a9296;
+  var a9297;
+  var a9298;
+  var a9299;
+  var a9300;
+  var a9301;
+  var a9302;
+  var a9303;
+  var a9304;
+  var a9305;
+  var a9306;
+  var a9307;
+  var a9308;
+  var a9309;
+  var a9310;
+  var a9311;
+  var a9312;
+  var a9313;
+  var a9314;
+  var a9315;
+  var a9316;
+  var a9317;
+  var a9318;
+  var a9319;
+  var a9320;
+  var a9321;
+  var a9322;
+  var a9323;
+  var a9324;
+  var a9325;
+  var a9326;
+  var a9327;
+  var a9328;
+  var a9329;
+  var a9330;
+  var a9331;
+  var a9332;
+  var a9333;
+  var a9334;
+  var a9335;
+  var a9336;
+  var a9337;
+  var a9338;
+  var a9339;
+  var a9340;
+  var a9341;
+  var a9342;
+  var a9343;
+  var a9344;
+  var a9345;
+  var a9346;
+  var a9347;
+  var a9348;
+  var a9349;
+  var a9350;
+  var a9351;
+  var a9352;
+  var a9353;
+  var a9354;
+  var a9355;
+  var a9356;
+  var a9357;
+  var a9358;
+  var a9359;
+  var a9360;
+  var a9361;
+  var a9362;
+  var a9363;
+  var a9364;
+  var a9365;
+  var a9366;
+  var a9367;
+  var a9368;
+  var a9369;
+  var a9370;
+  var a9371;
+  var a9372;
+  var a9373;
+  var a9374;
+  var a9375;
+  var a9376;
+  var a9377;
+  var a9378;
+  var a9379;
+  var a9380;
+  var a9381;
+  var a9382;
+  var a9383;
+  var a9384;
+  var a9385;
+  var a9386;
+  var a9387;
+  var a9388;
+  var a9389;
+  var a9390;
+  var a9391;
+  var a9392;
+  var a9393;
+  var a9394;
+  var a9395;
+  var a9396;
+  var a9397;
+  var a9398;
+  var a9399;
+  var a9400;
+  var a9401;
+  var a9402;
+  var a9403;
+  var a9404;
+  var a9405;
+  var a9406;
+  var a9407;
+  var a9408;
+  var a9409;
+  var a9410;
+  var a9411;
+  var a9412;
+  var a9413;
+  var a9414;
+  var a9415;
+  var a9416;
+  var a9417;
+  var a9418;
+  var a9419;
+  var a9420;
+  var a9421;
+  var a9422;
+  var a9423;
+  var a9424;
+  var a9425;
+  var a9426;
+  var a9427;
+  var a9428;
+  var a9429;
+  var a9430;
+  var a9431;
+  var a9432;
+  var a9433;
+  var a9434;
+  var a9435;
+  var a9436;
+  var a9437;
+  var a9438;
+  var a9439;
+  var a9440;
+  var a9441;
+  var a9442;
+  var a9443;
+  var a9444;
+  var a9445;
+  var a9446;
+  var a9447;
+  var a9448;
+  var a9449;
+  var a9450;
+  var a9451;
+  var a9452;
+  var a9453;
+  var a9454;
+  var a9455;
+  var a9456;
+  var a9457;
+  var a9458;
+  var a9459;
+  var a9460;
+  var a9461;
+  var a9462;
+  var a9463;
+  var a9464;
+  var a9465;
+  var a9466;
+  var a9467;
+  var a9468;
+  var a9469;
+  var a9470;
+  var a9471;
+  var a9472;
+  var a9473;
+  var a9474;
+  var a9475;
+  var a9476;
+  var a9477;
+  var a9478;
+  var a9479;
+  var a9480;
+  var a9481;
+  var a9482;
+  var a9483;
+  var a9484;
+  var a9485;
+  var a9486;
+  var a9487;
+  var a9488;
+  var a9489;
+  var a9490;
+  var a9491;
+  var a9492;
+  var a9493;
+  var a9494;
+  var a9495;
+  var a9496;
+  var a9497;
+  var a9498;
+  var a9499;
+  var a9500;
+  var a9501;
+  var a9502;
+  var a9503;
+  var a9504;
+  var a9505;
+  var a9506;
+  var a9507;
+  var a9508;
+  var a9509;
+  var a9510;
+  var a9511;
+  var a9512;
+  var a9513;
+  var a9514;
+  var a9515;
+  var a9516;
+  var a9517;
+  var a9518;
+  var a9519;
+  var a9520;
+  var a9521;
+  var a9522;
+  var a9523;
+  var a9524;
+  var a9525;
+  var a9526;
+  var a9527;
+  var a9528;
+  var a9529;
+  var a9530;
+  var a9531;
+  var a9532;
+  var a9533;
+  var a9534;
+  var a9535;
+  var a9536;
+  var a9537;
+  var a9538;
+  var a9539;
+  var a9540;
+  var a9541;
+  var a9542;
+  var a9543;
+  var a9544;
+  var a9545;
+  var a9546;
+  var a9547;
+  var a9548;
+  var a9549;
+  var a9550;
+  var a9551;
+  var a9552;
+  var a9553;
+  var a9554;
+  var a9555;
+  var a9556;
+  var a9557;
+  var a9558;
+  var a9559;
+  var a9560;
+  var a9561;
+  var a9562;
+  var a9563;
+  var a9564;
+  var a9565;
+  var a9566;
+  var a9567;
+  var a9568;
+  var a9569;
+  var a9570;
+  var a9571;
+  var a9572;
+  var a9573;
+  var a9574;
+  var a9575;
+  var a9576;
+  var a9577;
+  var a9578;
+  var a9579;
+  var a9580;
+  var a9581;
+  var a9582;
+  var a9583;
+  var a9584;
+  var a9585;
+  var a9586;
+  var a9587;
+  var a9588;
+  var a9589;
+  var a9590;
+  var a9591;
+  var a9592;
+  var a9593;
+  var a9594;
+  var a9595;
+  var a9596;
+  var a9597;
+  var a9598;
+  var a9599;
+  var a9600;
+  var a9601;
+  var a9602;
+  var a9603;
+  var a9604;
+  var a9605;
+  var a9606;
+  var a9607;
+  var a9608;
+  var a9609;
+  var a9610;
+  var a9611;
+  var a9612;
+  var a9613;
+  var a9614;
+  var a9615;
+  var a9616;
+  var a9617;
+  var a9618;
+  var a9619;
+  var a9620;
+  var a9621;
+  var a9622;
+  var a9623;
+  var a9624;
+  var a9625;
+  var a9626;
+  var a9627;
+  var a9628;
+  var a9629;
+  var a9630;
+  var a9631;
+  var a9632;
+  var a9633;
+  var a9634;
+  var a9635;
+  var a9636;
+  var a9637;
+  var a9638;
+  var a9639;
+  var a9640;
+  var a9641;
+  var a9642;
+  var a9643;
+  var a9644;
+  var a9645;
+  var a9646;
+  var a9647;
+  var a9648;
+  var a9649;
+  var a9650;
+  var a9651;
+  var a9652;
+  var a9653;
+  var a9654;
+  var a9655;
+  var a9656;
+  var a9657;
+  var a9658;
+  var a9659;
+  var a9660;
+  var a9661;
+  var a9662;
+  var a9663;
+  var a9664;
+  var a9665;
+  var a9666;
+  var a9667;
+  var a9668;
+  var a9669;
+  var a9670;
+  var a9671;
+  var a9672;
+  var a9673;
+  var a9674;
+  var a9675;
+  var a9676;
+  var a9677;
+  var a9678;
+  var a9679;
+  var a9680;
+  var a9681;
+  var a9682;
+  var a9683;
+  var a9684;
+  var a9685;
+  var a9686;
+  var a9687;
+  var a9688;
+  var a9689;
+  var a9690;
+  var a9691;
+  var a9692;
+  var a9693;
+  var a9694;
+  var a9695;
+  var a9696;
+  var a9697;
+  var a9698;
+  var a9699;
+  var a9700;
+  var a9701;
+  var a9702;
+  var a9703;
+  var a9704;
+  var a9705;
+  var a9706;
+  var a9707;
+  var a9708;
+  var a9709;
+  var a9710;
+  var a9711;
+  var a9712;
+  var a9713;
+  var a9714;
+  var a9715;
+  var a9716;
+  var a9717;
+  var a9718;
+  var a9719;
+  var a9720;
+  var a9721;
+  var a9722;
+  var a9723;
+  var a9724;
+  var a9725;
+  var a9726;
+  var a9727;
+  var a9728;
+  var a9729;
+  var a9730;
+  var a9731;
+  var a9732;
+  var a9733;
+  var a9734;
+  var a9735;
+  var a9736;
+  var a9737;
+  var a9738;
+  var a9739;
+  var a9740;
+  var a9741;
+  var a9742;
+  var a9743;
+  var a9744;
+  var a9745;
+  var a9746;
+  var a9747;
+  var a9748;
+  var a9749;
+  var a9750;
+  var a9751;
+  var a9752;
+  var a9753;
+  var a9754;
+  var a9755;
+  var a9756;
+  var a9757;
+  var a9758;
+  var a9759;
+  var a9760;
+  var a9761;
+  var a9762;
+  var a9763;
+  var a9764;
+  var a9765;
+  var a9766;
+  var a9767;
+  var a9768;
+  var a9769;
+  var a9770;
+  var a9771;
+  var a9772;
+  var a9773;
+  var a9774;
+  var a9775;
+  var a9776;
+  var a9777;
+  var a9778;
+  var a9779;
+  var a9780;
+  var a9781;
+  var a9782;
+  var a9783;
+  var a9784;
+  var a9785;
+  var a9786;
+  var a9787;
+  var a9788;
+  var a9789;
+  var a9790;
+  var a9791;
+  var a9792;
+  var a9793;
+  var a9794;
+  var a9795;
+  var a9796;
+  var a9797;
+  var a9798;
+  var a9799;
+  var a9800;
+  var a9801;
+  var a9802;
+  var a9803;
+  var a9804;
+  var a9805;
+  var a9806;
+  var a9807;
+  var a9808;
+  var a9809;
+  var a9810;
+  var a9811;
+  var a9812;
+  var a9813;
+  var a9814;
+  var a9815;
+  var a9816;
+  var a9817;
+  var a9818;
+  var a9819;
+  var a9820;
+  var a9821;
+  var a9822;
+  var a9823;
+  var a9824;
+  var a9825;
+  var a9826;
+  var a9827;
+  var a9828;
+  var a9829;
+  var a9830;
+  var a9831;
+  var a9832;
+  var a9833;
+  var a9834;
+  var a9835;
+  var a9836;
+  var a9837;
+  var a9838;
+  var a9839;
+  var a9840;
+  var a9841;
+  var a9842;
+  var a9843;
+  var a9844;
+  var a9845;
+  var a9846;
+  var a9847;
+  var a9848;
+  var a9849;
+  var a9850;
+  var a9851;
+  var a9852;
+  var a9853;
+  var a9854;
+  var a9855;
+  var a9856;
+  var a9857;
+  var a9858;
+  var a9859;
+  var a9860;
+  var a9861;
+  var a9862;
+  var a9863;
+  var a9864;
+  var a9865;
+  var a9866;
+  var a9867;
+  var a9868;
+  var a9869;
+  var a9870;
+  var a9871;
+  var a9872;
+  var a9873;
+  var a9874;
+  var a9875;
+  var a9876;
+  var a9877;
+  var a9878;
+  var a9879;
+  var a9880;
+  var a9881;
+  var a9882;
+  var a9883;
+  var a9884;
+  var a9885;
+  var a9886;
+  var a9887;
+  var a9888;
+  var a9889;
+  var a9890;
+  var a9891;
+  var a9892;
+  var a9893;
+  var a9894;
+  var a9895;
+  var a9896;
+  var a9897;
+  var a9898;
+  var a9899;
+  var a9900;
+  var a9901;
+  var a9902;
+  var a9903;
+  var a9904;
+  var a9905;
+  var a9906;
+  var a9907;
+  var a9908;
+  var a9909;
+  var a9910;
+  var a9911;
+  var a9912;
+  var a9913;
+  var a9914;
+  var a9915;
+  var a9916;
+  var a9917;
+  var a9918;
+  var a9919;
+  var a9920;
+  var a9921;
+  var a9922;
+  var a9923;
+  var a9924;
+  var a9925;
+  var a9926;
+  var a9927;
+  var a9928;
+  var a9929;
+  var a9930;
+  var a9931;
+  var a9932;
+  var a9933;
+  var a9934;
+  var a9935;
+  var a9936;
+  var a9937;
+  var a9938;
+  var a9939;
+  var a9940;
+  var a9941;
+  var a9942;
+  var a9943;
+  var a9944;
+  var a9945;
+  var a9946;
+  var a9947;
+  var a9948;
+  var a9949;
+  var a9950;
+  var a9951;
+  var a9952;
+  var a9953;
+  var a9954;
+  var a9955;
+  var a9956;
+  var a9957;
+  var a9958;
+  var a9959;
+  var a9960;
+  var a9961;
+  var a9962;
+  var a9963;
+  var a9964;
+  var a9965;
+  var a9966;
+  var a9967;
+  var a9968;
+  var a9969;
+  var a9970;
+  var a9971;
+  var a9972;
+  var a9973;
+  var a9974;
+  var a9975;
+  var a9976;
+  var a9977;
+  var a9978;
+  var a9979;
+  var a9980;
+  var a9981;
+  var a9982;
+  var a9983;
+  var a9984;
+  var a9985;
+  var a9986;
+  var a9987;
+  var a9988;
+  var a9989;
+  var a9990;
+  var a9991;
+  var a9992;
+  var a9993;
+  var a9994;
+  var a9995;
+  var a9996;
+  var a9997;
+  var a9998;
+  var a9999;
+  var a10000;
+  var a10001;
+  var a10002;
+  var a10003;
+  var a10004;
+  var a10005;
+  var a10006;
+  var a10007;
+  var a10008;
+  var a10009;
+  var a10010;
+  var a10011;
+  var a10012;
+  var a10013;
+  var a10014;
+  var a10015;
+  var a10016;
+  var a10017;
+  var a10018;
+  var a10019;
+  var a10020;
+  var a10021;
+  var a10022;
+  var a10023;
+  var a10024;
+  var a10025;
+  var a10026;
+  var a10027;
+  var a10028;
+  var a10029;
+  var a10030;
+  var a10031;
+  var a10032;
+  var a10033;
+  var a10034;
+  var a10035;
+  var a10036;
+  var a10037;
+  var a10038;
+  var a10039;
+  var a10040;
+  var a10041;
+  var a10042;
+  var a10043;
+  var a10044;
+  var a10045;
+  var a10046;
+  var a10047;
+  var a10048;
+  var a10049;
+  var a10050;
+  var a10051;
+  var a10052;
+  var a10053;
+  var a10054;
+  var a10055;
+  var a10056;
+  var a10057;
+  var a10058;
+  var a10059;
+  var a10060;
+  var a10061;
+  var a10062;
+  var a10063;
+  var a10064;
+  var a10065;
+  var a10066;
+  var a10067;
+  var a10068;
+  var a10069;
+  var a10070;
+  var a10071;
+  var a10072;
+  var a10073;
+  var a10074;
+  var a10075;
+  var a10076;
+  var a10077;
+  var a10078;
+  var a10079;
+  var a10080;
+  var a10081;
+  var a10082;
+  var a10083;
+  var a10084;
+  var a10085;
+  var a10086;
+  var a10087;
+  var a10088;
+  var a10089;
+  var a10090;
+  var a10091;
+  var a10092;
+  var a10093;
+  var a10094;
+  var a10095;
+  var a10096;
+  var a10097;
+  var a10098;
+  var a10099;
+  var a10100;
+  var a10101;
+  var a10102;
+  var a10103;
+  var a10104;
+  var a10105;
+  var a10106;
+  var a10107;
+  var a10108;
+  var a10109;
+  var a10110;
+  var a10111;
+  var a10112;
+  var a10113;
+  var a10114;
+  var a10115;
+  var a10116;
+  var a10117;
+  var a10118;
+  var a10119;
+  var a10120;
+  var a10121;
+  var a10122;
+  var a10123;
+  var a10124;
+  var a10125;
+  var a10126;
+  var a10127;
+  var a10128;
+  var a10129;
+  var a10130;
+  var a10131;
+  var a10132;
+  var a10133;
+  var a10134;
+  var a10135;
+  var a10136;
+  var a10137;
+  var a10138;
+  var a10139;
+  var a10140;
+  var a10141;
+  var a10142;
+  var a10143;
+  var a10144;
+  var a10145;
+  var a10146;
+  var a10147;
+  var a10148;
+  var a10149;
+  var a10150;
+  var a10151;
+  var a10152;
+  var a10153;
+  var a10154;
+  var a10155;
+  var a10156;
+  var a10157;
+  var a10158;
+  var a10159;
+  var a10160;
+  var a10161;
+  var a10162;
+  var a10163;
+  var a10164;
+  var a10165;
+  var a10166;
+  var a10167;
+  var a10168;
+  var a10169;
+  var a10170;
+  var a10171;
+  var a10172;
+  var a10173;
+  var a10174;
+  var a10175;
+  var a10176;
+  var a10177;
+  var a10178;
+  var a10179;
+  var a10180;
+  var a10181;
+  var a10182;
+  var a10183;
+  var a10184;
+  var a10185;
+  var a10186;
+  var a10187;
+  var a10188;
+  var a10189;
+  var a10190;
+  var a10191;
+  var a10192;
+  var a10193;
+  var a10194;
+  var a10195;
+  var a10196;
+  var a10197;
+  var a10198;
+  var a10199;
+  var a10200;
+  var a10201;
+  var a10202;
+  var a10203;
+  var a10204;
+  var a10205;
+  var a10206;
+  var a10207;
+  var a10208;
+  var a10209;
+  var a10210;
+  var a10211;
+  var a10212;
+  var a10213;
+  var a10214;
+  var a10215;
+  var a10216;
+  var a10217;
+  var a10218;
+  var a10219;
+  var a10220;
+  var a10221;
+  var a10222;
+  var a10223;
+  var a10224;
+  var a10225;
+  var a10226;
+  var a10227;
+  var a10228;
+  var a10229;
+  var a10230;
+  var a10231;
+  var a10232;
+  var a10233;
+  var a10234;
+  var a10235;
+  var a10236;
+  var a10237;
+  var a10238;
+  var a10239;
+  var a10240;
+  var a10241;
+  var a10242;
+  var a10243;
+  var a10244;
+  var a10245;
+  var a10246;
+  var a10247;
+  var a10248;
+  var a10249;
+  var a10250;
+  var a10251;
+  var a10252;
+  var a10253;
+  var a10254;
+  var a10255;
+  var a10256;
+  var a10257;
+  var a10258;
+  var a10259;
+  var a10260;
+  var a10261;
+  var a10262;
+  var a10263;
+  var a10264;
+  var a10265;
+  var a10266;
+  var a10267;
+  var a10268;
+  var a10269;
+  var a10270;
+  var a10271;
+  var a10272;
+  var a10273;
+  var a10274;
+  var a10275;
+  var a10276;
+  var a10277;
+  var a10278;
+  var a10279;
+  var a10280;
+  var a10281;
+  var a10282;
+  var a10283;
+  var a10284;
+  var a10285;
+  var a10286;
+  var a10287;
+  var a10288;
+  var a10289;
+  var a10290;
+  var a10291;
+  var a10292;
+  var a10293;
+  var a10294;
+  var a10295;
+  var a10296;
+  var a10297;
+  var a10298;
+  var a10299;
+  var a10300;
+  var a10301;
+  var a10302;
+  var a10303;
+  var a10304;
+  var a10305;
+  var a10306;
+  var a10307;
+  var a10308;
+  var a10309;
+  var a10310;
+  var a10311;
+  var a10312;
+  var a10313;
+  var a10314;
+  var a10315;
+  var a10316;
+  var a10317;
+  var a10318;
+  var a10319;
+  var a10320;
+  var a10321;
+  var a10322;
+  var a10323;
+  var a10324;
+  var a10325;
+  var a10326;
+  var a10327;
+  var a10328;
+  var a10329;
+  var a10330;
+  var a10331;
+  var a10332;
+  var a10333;
+  var a10334;
+  var a10335;
+  var a10336;
+  var a10337;
+  var a10338;
+  var a10339;
+  var a10340;
+  var a10341;
+  var a10342;
+  var a10343;
+  var a10344;
+  var a10345;
+  var a10346;
+  var a10347;
+  var a10348;
+  var a10349;
+  var a10350;
+  var a10351;
+  var a10352;
+  var a10353;
+  var a10354;
+  var a10355;
+  var a10356;
+  var a10357;
+  var a10358;
+  var a10359;
+  var a10360;
+  var a10361;
+  var a10362;
+  var a10363;
+  var a10364;
+  var a10365;
+  var a10366;
+  var a10367;
+  var a10368;
+  var a10369;
+  var a10370;
+  var a10371;
+  var a10372;
+  var a10373;
+  var a10374;
+  var a10375;
+  var a10376;
+  var a10377;
+  var a10378;
+  var a10379;
+  var a10380;
+  var a10381;
+  var a10382;
+  var a10383;
+  var a10384;
+  var a10385;
+  var a10386;
+  var a10387;
+  var a10388;
+  var a10389;
+  var a10390;
+  var a10391;
+  var a10392;
+  var a10393;
+  var a10394;
+  var a10395;
+  var a10396;
+  var a10397;
+  var a10398;
+  var a10399;
+  var a10400;
+  var a10401;
+  var a10402;
+  var a10403;
+  var a10404;
+  var a10405;
+  var a10406;
+  var a10407;
+  var a10408;
+  var a10409;
+  var a10410;
+  var a10411;
+  var a10412;
+  var a10413;
+  var a10414;
+  var a10415;
+  var a10416;
+  var a10417;
+  var a10418;
+  var a10419;
+  var a10420;
+  var a10421;
+  var a10422;
+  var a10423;
+  var a10424;
+  var a10425;
+  var a10426;
+  var a10427;
+  var a10428;
+  var a10429;
+  var a10430;
+  var a10431;
+  var a10432;
+  var a10433;
+  var a10434;
+  var a10435;
+  var a10436;
+  var a10437;
+  var a10438;
+  var a10439;
+  var a10440;
+  var a10441;
+  var a10442;
+  var a10443;
+  var a10444;
+  var a10445;
+  var a10446;
+  var a10447;
+  var a10448;
+  var a10449;
+  var a10450;
+  var a10451;
+  var a10452;
+  var a10453;
+  var a10454;
+  var a10455;
+  var a10456;
+  var a10457;
+  var a10458;
+  var a10459;
+  var a10460;
+  var a10461;
+  var a10462;
+  var a10463;
+  var a10464;
+  var a10465;
+  var a10466;
+  var a10467;
+  var a10468;
+  var a10469;
+  var a10470;
+  var a10471;
+  var a10472;
+  var a10473;
+  var a10474;
+  var a10475;
+  var a10476;
+  var a10477;
+  var a10478;
+  var a10479;
+  var a10480;
+  var a10481;
+  var a10482;
+  var a10483;
+  var a10484;
+  var a10485;
+  var a10486;
+  var a10487;
+  var a10488;
+  var a10489;
+  var a10490;
+  var a10491;
+  var a10492;
+  var a10493;
+  var a10494;
+  var a10495;
+  var a10496;
+  var a10497;
+  var a10498;
+  var a10499;
+  var a10500;
+  var a10501;
+  var a10502;
+  var a10503;
+  var a10504;
+  var a10505;
+  var a10506;
+  var a10507;
+  var a10508;
+  var a10509;
+  var a10510;
+  var a10511;
+  var a10512;
+  var a10513;
+  var a10514;
+  var a10515;
+  var a10516;
+  var a10517;
+  var a10518;
+  var a10519;
+  var a10520;
+  var a10521;
+  var a10522;
+  var a10523;
+  var a10524;
+  var a10525;
+  var a10526;
+  var a10527;
+  var a10528;
+  var a10529;
+  var a10530;
+  var a10531;
+  var a10532;
+  var a10533;
+  var a10534;
+  var a10535;
+  var a10536;
+  var a10537;
+  var a10538;
+  var a10539;
+  var a10540;
+  var a10541;
+  var a10542;
+  var a10543;
+  var a10544;
+  var a10545;
+  var a10546;
+  var a10547;
+  var a10548;
+  var a10549;
+  var a10550;
+  var a10551;
+  var a10552;
+  var a10553;
+  var a10554;
+  var a10555;
+  var a10556;
+  var a10557;
+  var a10558;
+  var a10559;
+  var a10560;
+  var a10561;
+  var a10562;
+  var a10563;
+  var a10564;
+  var a10565;
+  var a10566;
+  var a10567;
+  var a10568;
+  var a10569;
+  var a10570;
+  var a10571;
+  var a10572;
+  var a10573;
+  var a10574;
+  var a10575;
+  var a10576;
+  var a10577;
+  var a10578;
+  var a10579;
+  var a10580;
+  var a10581;
+  var a10582;
+  var a10583;
+  var a10584;
+  var a10585;
+  var a10586;
+  var a10587;
+  var a10588;
+  var a10589;
+  var a10590;
+  var a10591;
+  var a10592;
+  var a10593;
+  var a10594;
+  var a10595;
+  var a10596;
+  var a10597;
+  var a10598;
+  var a10599;
+  var a10600;
+  var a10601;
+  var a10602;
+  var a10603;
+  var a10604;
+  var a10605;
+  var a10606;
+  var a10607;
+  var a10608;
+  var a10609;
+  var a10610;
+  var a10611;
+  var a10612;
+  var a10613;
+  var a10614;
+  var a10615;
+  var a10616;
+  var a10617;
+  var a10618;
+  var a10619;
+  var a10620;
+  var a10621;
+  var a10622;
+  var a10623;
+  var a10624;
+  var a10625;
+  var a10626;
+  var a10627;
+  var a10628;
+  var a10629;
+  var a10630;
+  var a10631;
+  var a10632;
+  var a10633;
+  var a10634;
+  var a10635;
+  var a10636;
+  var a10637;
+  var a10638;
+  var a10639;
+  var a10640;
+  var a10641;
+  var a10642;
+  var a10643;
+  var a10644;
+  var a10645;
+  var a10646;
+  var a10647;
+  var a10648;
+  var a10649;
+  var a10650;
+  var a10651;
+  var a10652;
+  var a10653;
+  var a10654;
+  var a10655;
+  var a10656;
+  var a10657;
+  var a10658;
+  var a10659;
+  var a10660;
+  var a10661;
+  var a10662;
+  var a10663;
+  var a10664;
+  var a10665;
+  var a10666;
+  var a10667;
+  var a10668;
+  var a10669;
+  var a10670;
+  var a10671;
+  var a10672;
+  var a10673;
+  var a10674;
+  var a10675;
+  var a10676;
+  var a10677;
+  var a10678;
+  var a10679;
+  var a10680;
+  var a10681;
+  var a10682;
+  var a10683;
+  var a10684;
+  var a10685;
+  var a10686;
+  var a10687;
+  var a10688;
+  var a10689;
+  var a10690;
+  var a10691;
+  var a10692;
+  var a10693;
+  var a10694;
+  var a10695;
+  var a10696;
+  var a10697;
+  var a10698;
+  var a10699;
+  var a10700;
+  var a10701;
+  var a10702;
+  var a10703;
+  var a10704;
+  var a10705;
+  var a10706;
+  var a10707;
+  var a10708;
+  var a10709;
+  var a10710;
+  var a10711;
+  var a10712;
+  var a10713;
+  var a10714;
+  var a10715;
+  var a10716;
+  var a10717;
+  var a10718;
+  var a10719;
+  var a10720;
+  var a10721;
+  var a10722;
+  var a10723;
+  var a10724;
+  var a10725;
+  var a10726;
+  var a10727;
+  var a10728;
+  var a10729;
+  var a10730;
+  var a10731;
+  var a10732;
+  var a10733;
+  var a10734;
+  var a10735;
+  var a10736;
+  var a10737;
+  var a10738;
+  var a10739;
+  var a10740;
+  var a10741;
+  var a10742;
+  var a10743;
+  var a10744;
+  var a10745;
+  var a10746;
+  var a10747;
+  var a10748;
+  var a10749;
+  var a10750;
+  var a10751;
+  var a10752;
+  var a10753;
+  var a10754;
+  var a10755;
+  var a10756;
+  var a10757;
+  var a10758;
+  var a10759;
+  var a10760;
+  var a10761;
+  var a10762;
+  var a10763;
+  var a10764;
+  var a10765;
+  var a10766;
+  var a10767;
+  var a10768;
+  var a10769;
+  var a10770;
+  var a10771;
+  var a10772;
+  var a10773;
+  var a10774;
+  var a10775;
+  var a10776;
+  var a10777;
+  var a10778;
+  var a10779;
+  var a10780;
+  var a10781;
+  var a10782;
+  var a10783;
+  var a10784;
+  var a10785;
+  var a10786;
+  var a10787;
+  var a10788;
+  var a10789;
+  var a10790;
+  var a10791;
+  var a10792;
+  var a10793;
+  var a10794;
+  var a10795;
+  var a10796;
+  var a10797;
+  var a10798;
+  var a10799;
+  var a10800;
+  var a10801;
+  var a10802;
+  var a10803;
+  var a10804;
+  var a10805;
+  var a10806;
+  var a10807;
+  var a10808;
+  var a10809;
+  var a10810;
+  var a10811;
+  var a10812;
+  var a10813;
+  var a10814;
+  var a10815;
+  var a10816;
+  var a10817;
+  var a10818;
+  var a10819;
+  var a10820;
+  var a10821;
+  var a10822;
+  var a10823;
+  var a10824;
+  var a10825;
+  var a10826;
+  var a10827;
+  var a10828;
+  var a10829;
+  var a10830;
+  var a10831;
+  var a10832;
+  var a10833;
+  var a10834;
+  var a10835;
+  var a10836;
+  var a10837;
+  var a10838;
+  var a10839;
+  var a10840;
+  var a10841;
+  var a10842;
+  var a10843;
+  var a10844;
+  var a10845;
+  var a10846;
+  var a10847;
+  var a10848;
+  var a10849;
+  var a10850;
+  var a10851;
+  var a10852;
+  var a10853;
+  var a10854;
+  var a10855;
+  var a10856;
+  var a10857;
+  var a10858;
+  var a10859;
+  var a10860;
+  var a10861;
+  var a10862;
+  var a10863;
+  var a10864;
+  var a10865;
+  var a10866;
+  var a10867;
+  var a10868;
+  var a10869;
+  var a10870;
+  var a10871;
+  var a10872;
+  var a10873;
+  var a10874;
+  var a10875;
+  var a10876;
+  var a10877;
+  var a10878;
+  var a10879;
+  var a10880;
+  var a10881;
+  var a10882;
+  var a10883;
+  var a10884;
+  var a10885;
+  var a10886;
+  var a10887;
+  var a10888;
+  var a10889;
+  var a10890;
+  var a10891;
+  var a10892;
+  var a10893;
+  var a10894;
+  var a10895;
+  var a10896;
+  var a10897;
+  var a10898;
+  var a10899;
+  var a10900;
+  var a10901;
+  var a10902;
+  var a10903;
+  var a10904;
+  var a10905;
+  var a10906;
+  var a10907;
+  var a10908;
+  var a10909;
+  var a10910;
+  var a10911;
+  var a10912;
+  var a10913;
+  var a10914;
+  var a10915;
+  var a10916;
+  var a10917;
+  var a10918;
+  var a10919;
+  var a10920;
+  var a10921;
+  var a10922;
+  var a10923;
+  var a10924;
+  var a10925;
+  var a10926;
+  var a10927;
+  var a10928;
+  var a10929;
+  var a10930;
+  var a10931;
+  var a10932;
+  var a10933;
+  var a10934;
+  var a10935;
+  var a10936;
+  var a10937;
+  var a10938;
+  var a10939;
+  var a10940;
+  var a10941;
+  var a10942;
+  var a10943;
+  var a10944;
+  var a10945;
+  var a10946;
+  var a10947;
+  var a10948;
+  var a10949;
+  var a10950;
+  var a10951;
+  var a10952;
+  var a10953;
+  var a10954;
+  var a10955;
+  var a10956;
+  var a10957;
+  var a10958;
+  var a10959;
+  var a10960;
+  var a10961;
+  var a10962;
+  var a10963;
+  var a10964;
+  var a10965;
+  var a10966;
+  var a10967;
+  var a10968;
+  var a10969;
+  var a10970;
+  var a10971;
+  var a10972;
+  var a10973;
+  var a10974;
+  var a10975;
+  var a10976;
+  var a10977;
+  var a10978;
+  var a10979;
+  var a10980;
+  var a10981;
+  var a10982;
+  var a10983;
+  var a10984;
+  var a10985;
+  var a10986;
+  var a10987;
+  var a10988;
+  var a10989;
+  var a10990;
+  var a10991;
+  var a10992;
+  var a10993;
+  var a10994;
+  var a10995;
+  var a10996;
+  var a10997;
+  var a10998;
+  var a10999;
+  var a11000;
+  var a11001;
+  var a11002;
+  var a11003;
+  var a11004;
+  var a11005;
+  var a11006;
+  var a11007;
+  var a11008;
+  var a11009;
+  var a11010;
+  var a11011;
+  var a11012;
+  var a11013;
+  var a11014;
+  var a11015;
+  var a11016;
+  var a11017;
+  var a11018;
+  var a11019;
+  var a11020;
+  var a11021;
+  var a11022;
+  var a11023;
+  var a11024;
+  var a11025;
+  var a11026;
+  var a11027;
+  var a11028;
+  var a11029;
+  var a11030;
+  var a11031;
+  var a11032;
+  var a11033;
+  var a11034;
+  var a11035;
+  var a11036;
+  var a11037;
+  var a11038;
+  var a11039;
+  var a11040;
+  var a11041;
+  var a11042;
+  var a11043;
+  var a11044;
+  var a11045;
+  var a11046;
+  var a11047;
+  var a11048;
+  var a11049;
+  var a11050;
+  var a11051;
+  var a11052;
+  var a11053;
+  var a11054;
+  var a11055;
+  var a11056;
+  var a11057;
+  var a11058;
+  var a11059;
+  var a11060;
+  var a11061;
+  var a11062;
+  var a11063;
+  var a11064;
+  var a11065;
+  var a11066;
+  var a11067;
+  var a11068;
+  var a11069;
+  var a11070;
+  var a11071;
+  var a11072;
+  var a11073;
+  var a11074;
+  var a11075;
+  var a11076;
+  var a11077;
+  var a11078;
+  var a11079;
+  var a11080;
+  var a11081;
+  var a11082;
+  var a11083;
+  var a11084;
+  var a11085;
+  var a11086;
+  var a11087;
+  var a11088;
+  var a11089;
+  var a11090;
+  var a11091;
+  var a11092;
+  var a11093;
+  var a11094;
+  var a11095;
+  var a11096;
+  var a11097;
+  var a11098;
+  var a11099;
+  var a11100;
+  var a11101;
+  var a11102;
+  var a11103;
+  var a11104;
+  var a11105;
+  var a11106;
+  var a11107;
+  var a11108;
+  var a11109;
+  var a11110;
+  var a11111;
+  var a11112;
+  var a11113;
+  var a11114;
+  var a11115;
+  var a11116;
+  var a11117;
+  var a11118;
+  var a11119;
+  var a11120;
+  var a11121;
+  var a11122;
+  var a11123;
+  var a11124;
+  var a11125;
+  var a11126;
+  var a11127;
+  var a11128;
+  var a11129;
+  var a11130;
+  var a11131;
+  var a11132;
+  var a11133;
+  var a11134;
+  var a11135;
+  var a11136;
+  var a11137;
+  var a11138;
+  var a11139;
+  var a11140;
+  var a11141;
+  var a11142;
+  var a11143;
+  var a11144;
+  var a11145;
+  var a11146;
+  var a11147;
+  var a11148;
+  var a11149;
+  var a11150;
+  var a11151;
+  var a11152;
+  var a11153;
+  var a11154;
+  var a11155;
+  var a11156;
+  var a11157;
+  var a11158;
+  var a11159;
+  var a11160;
+  var a11161;
+  var a11162;
+  var a11163;
+  var a11164;
+  var a11165;
+  var a11166;
+  var a11167;
+  var a11168;
+  var a11169;
+  var a11170;
+  var a11171;
+  var a11172;
+  var a11173;
+  var a11174;
+  var a11175;
+  var a11176;
+  var a11177;
+  var a11178;
+  var a11179;
+  var a11180;
+  var a11181;
+  var a11182;
+  var a11183;
+  var a11184;
+  var a11185;
+  var a11186;
+  var a11187;
+  var a11188;
+  var a11189;
+  var a11190;
+  var a11191;
+  var a11192;
+  var a11193;
+  var a11194;
+  var a11195;
+  var a11196;
+  var a11197;
+  var a11198;
+  var a11199;
+  var a11200;
+  var a11201;
+  var a11202;
+  var a11203;
+  var a11204;
+  var a11205;
+  var a11206;
+  var a11207;
+  var a11208;
+  var a11209;
+  var a11210;
+  var a11211;
+  var a11212;
+  var a11213;
+  var a11214;
+  var a11215;
+  var a11216;
+  var a11217;
+  var a11218;
+  var a11219;
+  var a11220;
+  var a11221;
+  var a11222;
+  var a11223;
+  var a11224;
+  var a11225;
+  var a11226;
+  var a11227;
+  var a11228;
+  var a11229;
+  var a11230;
+  var a11231;
+  var a11232;
+  var a11233;
+  var a11234;
+  var a11235;
+  var a11236;
+  var a11237;
+  var a11238;
+  var a11239;
+  var a11240;
+  var a11241;
+  var a11242;
+  var a11243;
+  var a11244;
+  var a11245;
+  var a11246;
+  var a11247;
+  var a11248;
+  var a11249;
+  var a11250;
+  var a11251;
+  var a11252;
+  var a11253;
+  var a11254;
+  var a11255;
+  var a11256;
+  var a11257;
+  var a11258;
+  var a11259;
+  var a11260;
+  var a11261;
+  var a11262;
+  var a11263;
+  var a11264;
+  var a11265;
+  var a11266;
+  var a11267;
+  var a11268;
+  var a11269;
+  var a11270;
+  var a11271;
+  var a11272;
+  var a11273;
+  var a11274;
+  var a11275;
+  var a11276;
+  var a11277;
+  var a11278;
+  var a11279;
+  var a11280;
+  var a11281;
+  var a11282;
+  var a11283;
+  var a11284;
+  var a11285;
+  var a11286;
+  var a11287;
+  var a11288;
+  var a11289;
+  var a11290;
+  var a11291;
+  var a11292;
+  var a11293;
+  var a11294;
+  var a11295;
+  var a11296;
+  var a11297;
+  var a11298;
+  var a11299;
+  var a11300;
+  var a11301;
+  var a11302;
+  var a11303;
+  var a11304;
+  var a11305;
+  var a11306;
+  var a11307;
+  var a11308;
+  var a11309;
+  var a11310;
+  var a11311;
+  var a11312;
+  var a11313;
+  var a11314;
+  var a11315;
+  var a11316;
+  var a11317;
+  var a11318;
+  var a11319;
+  var a11320;
+  var a11321;
+  var a11322;
+  var a11323;
+  var a11324;
+  var a11325;
+  var a11326;
+  var a11327;
+  var a11328;
+  var a11329;
+  var a11330;
+  var a11331;
+  var a11332;
+  var a11333;
+  var a11334;
+  var a11335;
+  var a11336;
+  var a11337;
+  var a11338;
+  var a11339;
+  var a11340;
+  var a11341;
+  var a11342;
+  var a11343;
+  var a11344;
+  var a11345;
+  var a11346;
+  var a11347;
+  var a11348;
+  var a11349;
+  var a11350;
+  var a11351;
+  var a11352;
+  var a11353;
+  var a11354;
+  var a11355;
+  var a11356;
+  var a11357;
+  var a11358;
+  var a11359;
+  var a11360;
+  var a11361;
+  var a11362;
+  var a11363;
+  var a11364;
+  var a11365;
+  var a11366;
+  var a11367;
+  var a11368;
+  var a11369;
+  var a11370;
+  var a11371;
+  var a11372;
+  var a11373;
+  var a11374;
+  var a11375;
+  var a11376;
+  var a11377;
+  var a11378;
+  var a11379;
+  var a11380;
+  var a11381;
+  var a11382;
+  var a11383;
+  var a11384;
+  var a11385;
+  var a11386;
+  var a11387;
+  var a11388;
+  var a11389;
+  var a11390;
+  var a11391;
+  var a11392;
+  var a11393;
+  var a11394;
+  var a11395;
+  var a11396;
+  var a11397;
+  var a11398;
+  var a11399;
+  var a11400;
+  var a11401;
+  var a11402;
+  var a11403;
+  var a11404;
+  var a11405;
+  var a11406;
+  var a11407;
+  var a11408;
+  var a11409;
+  var a11410;
+  var a11411;
+  var a11412;
+  var a11413;
+  var a11414;
+  var a11415;
+  var a11416;
+  var a11417;
+  var a11418;
+  var a11419;
+  var a11420;
+  var a11421;
+  var a11422;
+  var a11423;
+  var a11424;
+  var a11425;
+  var a11426;
+  var a11427;
+  var a11428;
+  var a11429;
+  var a11430;
+  var a11431;
+  var a11432;
+  var a11433;
+  var a11434;
+  var a11435;
+  var a11436;
+  var a11437;
+  var a11438;
+  var a11439;
+  var a11440;
+  var a11441;
+  var a11442;
+  var a11443;
+  var a11444;
+  var a11445;
+  var a11446;
+  var a11447;
+  var a11448;
+  var a11449;
+  var a11450;
+  var a11451;
+  var a11452;
+  var a11453;
+  var a11454;
+  var a11455;
+  var a11456;
+  var a11457;
+  var a11458;
+  var a11459;
+  var a11460;
+  var a11461;
+  var a11462;
+  var a11463;
+  var a11464;
+  var a11465;
+  var a11466;
+  var a11467;
+  var a11468;
+  var a11469;
+  var a11470;
+  var a11471;
+  var a11472;
+  var a11473;
+  var a11474;
+  var a11475;
+  var a11476;
+  var a11477;
+  var a11478;
+  var a11479;
+  var a11480;
+  var a11481;
+  var a11482;
+  var a11483;
+  var a11484;
+  var a11485;
+  var a11486;
+  var a11487;
+  var a11488;
+  var a11489;
+  var a11490;
+  var a11491;
+  var a11492;
+  var a11493;
+  var a11494;
+  var a11495;
+  var a11496;
+  var a11497;
+  var a11498;
+  var a11499;
+  var a11500;
+  var a11501;
+  var a11502;
+  var a11503;
+  var a11504;
+  var a11505;
+  var a11506;
+  var a11507;
+  var a11508;
+  var a11509;
+  var a11510;
+  var a11511;
+  var a11512;
+  var a11513;
+  var a11514;
+  var a11515;
+  var a11516;
+  var a11517;
+  var a11518;
+  var a11519;
+  var a11520;
+  var a11521;
+  var a11522;
+  var a11523;
+  var a11524;
+  var a11525;
+  var a11526;
+  var a11527;
+  var a11528;
+  var a11529;
+  var a11530;
+  var a11531;
+  var a11532;
+  var a11533;
+  var a11534;
+  var a11535;
+  var a11536;
+  var a11537;
+  var a11538;
+  var a11539;
+  var a11540;
+  var a11541;
+  var a11542;
+  var a11543;
+  var a11544;
+  var a11545;
+  var a11546;
+  var a11547;
+  var a11548;
+  var a11549;
+  var a11550;
+  var a11551;
+  var a11552;
+  var a11553;
+  var a11554;
+  var a11555;
+  var a11556;
+  var a11557;
+  var a11558;
+  var a11559;
+  var a11560;
+  var a11561;
+  var a11562;
+  var a11563;
+  var a11564;
+  var a11565;
+  var a11566;
+  var a11567;
+  var a11568;
+  var a11569;
+  var a11570;
+  var a11571;
+  var a11572;
+  var a11573;
+  var a11574;
+  var a11575;
+  var a11576;
+  var a11577;
+  var a11578;
+  var a11579;
+  var a11580;
+  var a11581;
+  var a11582;
+  var a11583;
+  var a11584;
+  var a11585;
+  var a11586;
+  var a11587;
+  var a11588;
+  var a11589;
+  var a11590;
+  var a11591;
+  var a11592;
+  var a11593;
+  var a11594;
+  var a11595;
+  var a11596;
+  var a11597;
+  var a11598;
+  var a11599;
+  var a11600;
+  var a11601;
+  var a11602;
+  var a11603;
+  var a11604;
+  var a11605;
+  var a11606;
+  var a11607;
+  var a11608;
+  var a11609;
+  var a11610;
+  var a11611;
+  var a11612;
+  var a11613;
+  var a11614;
+  var a11615;
+  var a11616;
+  var a11617;
+  var a11618;
+  var a11619;
+  var a11620;
+  var a11621;
+  var a11622;
+  var a11623;
+  var a11624;
+  var a11625;
+  var a11626;
+  var a11627;
+  var a11628;
+  var a11629;
+  var a11630;
+  var a11631;
+  var a11632;
+  var a11633;
+  var a11634;
+  var a11635;
+  var a11636;
+  var a11637;
+  var a11638;
+  var a11639;
+  var a11640;
+  var a11641;
+  var a11642;
+  var a11643;
+  var a11644;
+  var a11645;
+  var a11646;
+  var a11647;
+  var a11648;
+  var a11649;
+  var a11650;
+  var a11651;
+  var a11652;
+  var a11653;
+  var a11654;
+  var a11655;
+  var a11656;
+  var a11657;
+  var a11658;
+  var a11659;
+  var a11660;
+  var a11661;
+  var a11662;
+  var a11663;
+  var a11664;
+  var a11665;
+  var a11666;
+  var a11667;
+  var a11668;
+  var a11669;
+  var a11670;
+  var a11671;
+  var a11672;
+  var a11673;
+  var a11674;
+  var a11675;
+  var a11676;
+  var a11677;
+  var a11678;
+  var a11679;
+  var a11680;
+  var a11681;
+  var a11682;
+  var a11683;
+  var a11684;
+  var a11685;
+  var a11686;
+  var a11687;
+  var a11688;
+  var a11689;
+  var a11690;
+  var a11691;
+  var a11692;
+  var a11693;
+  var a11694;
+  var a11695;
+  var a11696;
+  var a11697;
+  var a11698;
+  var a11699;
+  var a11700;
+  var a11701;
+  var a11702;
+  var a11703;
+  var a11704;
+  var a11705;
+  var a11706;
+  var a11707;
+  var a11708;
+  var a11709;
+  var a11710;
+  var a11711;
+  var a11712;
+  var a11713;
+  var a11714;
+  var a11715;
+  var a11716;
+  var a11717;
+  var a11718;
+  var a11719;
+  var a11720;
+  var a11721;
+  var a11722;
+  var a11723;
+  var a11724;
+  var a11725;
+  var a11726;
+  var a11727;
+  var a11728;
+  var a11729;
+  var a11730;
+  var a11731;
+  var a11732;
+  var a11733;
+  var a11734;
+  var a11735;
+  var a11736;
+  var a11737;
+  var a11738;
+  var a11739;
+  var a11740;
+  var a11741;
+  var a11742;
+  var a11743;
+  var a11744;
+  var a11745;
+  var a11746;
+  var a11747;
+  var a11748;
+  var a11749;
+  var a11750;
+  var a11751;
+  var a11752;
+  var a11753;
+  var a11754;
+  var a11755;
+  var a11756;
+  var a11757;
+  var a11758;
+  var a11759;
+  var a11760;
+  var a11761;
+  var a11762;
+  var a11763;
+  var a11764;
+  var a11765;
+  var a11766;
+  var a11767;
+  var a11768;
+  var a11769;
+  var a11770;
+  var a11771;
+  var a11772;
+  var a11773;
+  var a11774;
+  var a11775;
+  var a11776;
+  var a11777;
+  var a11778;
+  var a11779;
+  var a11780;
+  var a11781;
+  var a11782;
+  var a11783;
+  var a11784;
+  var a11785;
+  var a11786;
+  var a11787;
+  var a11788;
+  var a11789;
+  var a11790;
+  var a11791;
+  var a11792;
+  var a11793;
+  var a11794;
+  var a11795;
+  var a11796;
+  var a11797;
+  var a11798;
+  var a11799;
+  var a11800;
+  var a11801;
+  var a11802;
+  var a11803;
+  var a11804;
+  var a11805;
+  var a11806;
+  var a11807;
+  var a11808;
+  var a11809;
+  var a11810;
+  var a11811;
+  var a11812;
+  var a11813;
+  var a11814;
+  var a11815;
+  var a11816;
+  var a11817;
+  var a11818;
+  var a11819;
+  var a11820;
+  var a11821;
+  var a11822;
+  var a11823;
+  var a11824;
+  var a11825;
+  var a11826;
+  var a11827;
+  var a11828;
+  var a11829;
+  var a11830;
+  var a11831;
+  var a11832;
+  var a11833;
+  var a11834;
+  var a11835;
+  var a11836;
+  var a11837;
+  var a11838;
+  var a11839;
+  var a11840;
+  var a11841;
+  var a11842;
+  var a11843;
+  var a11844;
+  var a11845;
+  var a11846;
+  var a11847;
+  var a11848;
+  var a11849;
+  var a11850;
+  var a11851;
+  var a11852;
+  var a11853;
+  var a11854;
+  var a11855;
+  var a11856;
+  var a11857;
+  var a11858;
+  var a11859;
+  var a11860;
+  var a11861;
+  var a11862;
+  var a11863;
+  var a11864;
+  var a11865;
+  var a11866;
+  var a11867;
+  var a11868;
+  var a11869;
+  var a11870;
+  var a11871;
+  var a11872;
+  var a11873;
+  var a11874;
+  var a11875;
+  var a11876;
+  var a11877;
+  var a11878;
+  var a11879;
+  var a11880;
+  var a11881;
+  var a11882;
+  var a11883;
+  var a11884;
+  var a11885;
+  var a11886;
+  var a11887;
+  var a11888;
+  var a11889;
+  var a11890;
+  var a11891;
+  var a11892;
+  var a11893;
+  var a11894;
+  var a11895;
+  var a11896;
+  var a11897;
+  var a11898;
+  var a11899;
+  var a11900;
+  var a11901;
+  var a11902;
+  var a11903;
+  var a11904;
+  var a11905;
+  var a11906;
+  var a11907;
+  var a11908;
+  var a11909;
+  var a11910;
+  var a11911;
+  var a11912;
+  var a11913;
+  var a11914;
+  var a11915;
+  var a11916;
+  var a11917;
+  var a11918;
+  var a11919;
+  var a11920;
+  var a11921;
+  var a11922;
+  var a11923;
+  var a11924;
+  var a11925;
+  var a11926;
+  var a11927;
+  var a11928;
+  var a11929;
+  var a11930;
+  var a11931;
+  var a11932;
+  var a11933;
+  var a11934;
+  var a11935;
+  var a11936;
+  var a11937;
+  var a11938;
+  var a11939;
+  var a11940;
+  var a11941;
+  var a11942;
+  var a11943;
+  var a11944;
+  var a11945;
+  var a11946;
+  var a11947;
+  var a11948;
+  var a11949;
+  var a11950;
+  var a11951;
+  var a11952;
+  var a11953;
+  var a11954;
+  var a11955;
+  var a11956;
+  var a11957;
+  var a11958;
+  var a11959;
+  var a11960;
+  var a11961;
+  var a11962;
+  var a11963;
+  var a11964;
+  var a11965;
+  var a11966;
+  var a11967;
+  var a11968;
+  var a11969;
+  var a11970;
+  var a11971;
+  var a11972;
+  var a11973;
+  var a11974;
+  var a11975;
+  var a11976;
+  var a11977;
+  var a11978;
+  var a11979;
+  var a11980;
+  var a11981;
+  var a11982;
+  var a11983;
+  var a11984;
+  var a11985;
+  var a11986;
+  var a11987;
+  var a11988;
+  var a11989;
+  var a11990;
+  var a11991;
+  var a11992;
+  var a11993;
+  var a11994;
+  var a11995;
+  var a11996;
+  var a11997;
+  var a11998;
+  var a11999;
+  var a12000;
+  var a12001;
+  var a12002;
+  var a12003;
+  var a12004;
+  var a12005;
+  var a12006;
+  var a12007;
+  var a12008;
+  var a12009;
+  var a12010;
+  var a12011;
+  var a12012;
+  var a12013;
+  var a12014;
+  var a12015;
+  var a12016;
+  var a12017;
+  var a12018;
+  var a12019;
+  var a12020;
+  var a12021;
+  var a12022;
+  var a12023;
+  var a12024;
+  var a12025;
+  var a12026;
+  var a12027;
+  var a12028;
+  var a12029;
+  var a12030;
+  var a12031;
+  var a12032;
+  var a12033;
+  var a12034;
+  var a12035;
+  var a12036;
+  var a12037;
+  var a12038;
+  var a12039;
+  var a12040;
+  var a12041;
+  var a12042;
+  var a12043;
+  var a12044;
+  var a12045;
+  var a12046;
+  var a12047;
+  var a12048;
+  var a12049;
+  var a12050;
+  var a12051;
+  var a12052;
+  var a12053;
+  var a12054;
+  var a12055;
+  var a12056;
+  var a12057;
+  var a12058;
+  var a12059;
+  var a12060;
+  var a12061;
+  var a12062;
+  var a12063;
+  var a12064;
+  var a12065;
+  var a12066;
+  var a12067;
+  var a12068;
+  var a12069;
+  var a12070;
+  var a12071;
+  var a12072;
+  var a12073;
+  var a12074;
+  var a12075;
+  var a12076;
+  var a12077;
+  var a12078;
+  var a12079;
+  var a12080;
+  var a12081;
+  var a12082;
+  var a12083;
+  var a12084;
+  var a12085;
+  var a12086;
+  var a12087;
+  var a12088;
+  var a12089;
+  var a12090;
+  var a12091;
+  var a12092;
+  var a12093;
+  var a12094;
+  var a12095;
+  var a12096;
+  var a12097;
+  var a12098;
+  var a12099;
+  var a12100;
+  var a12101;
+  var a12102;
+  var a12103;
+  var a12104;
+  var a12105;
+  var a12106;
+  var a12107;
+  var a12108;
+  var a12109;
+  var a12110;
+  var a12111;
+  var a12112;
+  var a12113;
+  var a12114;
+  var a12115;
+  var a12116;
+  var a12117;
+  var a12118;
+  var a12119;
+  var a12120;
+  var a12121;
+  var a12122;
+  var a12123;
+  var a12124;
+  var a12125;
+  var a12126;
+  var a12127;
+  var a12128;
+  var a12129;
+  var a12130;
+  var a12131;
+  var a12132;
+  var a12133;
+  var a12134;
+  var a12135;
+  var a12136;
+  var a12137;
+  var a12138;
+  var a12139;
+  var a12140;
+  var a12141;
+  var a12142;
+  var a12143;
+  var a12144;
+  var a12145;
+  var a12146;
+  var a12147;
+  var a12148;
+  var a12149;
+  var a12150;
+  var a12151;
+  var a12152;
+  var a12153;
+  var a12154;
+  var a12155;
+  var a12156;
+  var a12157;
+  var a12158;
+  var a12159;
+  var a12160;
+  var a12161;
+  var a12162;
+  var a12163;
+  var a12164;
+  var a12165;
+  var a12166;
+  var a12167;
+  var a12168;
+  var a12169;
+  var a12170;
+  var a12171;
+  var a12172;
+  var a12173;
+  var a12174;
+  var a12175;
+  var a12176;
+  var a12177;
+  var a12178;
+  var a12179;
+  var a12180;
+  var a12181;
+  var a12182;
+  var a12183;
+  var a12184;
+  var a12185;
+  var a12186;
+  var a12187;
+  var a12188;
+  var a12189;
+  var a12190;
+  var a12191;
+  var a12192;
+  var a12193;
+  var a12194;
+  var a12195;
+  var a12196;
+  var a12197;
+  var a12198;
+  var a12199;
+  var a12200;
+  var a12201;
+  var a12202;
+  var a12203;
+  var a12204;
+  var a12205;
+  var a12206;
+  var a12207;
+  var a12208;
+  var a12209;
+  var a12210;
+  var a12211;
+  var a12212;
+  var a12213;
+  var a12214;
+  var a12215;
+  var a12216;
+  var a12217;
+  var a12218;
+  var a12219;
+  var a12220;
+  var a12221;
+  var a12222;
+  var a12223;
+  var a12224;
+  var a12225;
+  var a12226;
+  var a12227;
+  var a12228;
+  var a12229;
+  var a12230;
+  var a12231;
+  var a12232;
+  var a12233;
+  var a12234;
+  var a12235;
+  var a12236;
+  var a12237;
+  var a12238;
+  var a12239;
+  var a12240;
+  var a12241;
+  var a12242;
+  var a12243;
+  var a12244;
+  var a12245;
+  var a12246;
+  var a12247;
+  var a12248;
+  var a12249;
+  var a12250;
+  var a12251;
+  var a12252;
+  var a12253;
+  var a12254;
+  var a12255;
+  var a12256;
+  var a12257;
+  var a12258;
+  var a12259;
+  var a12260;
+  var a12261;
+  var a12262;
+  var a12263;
+  var a12264;
+  var a12265;
+  var a12266;
+  var a12267;
+  var a12268;
+  var a12269;
+  var a12270;
+  var a12271;
+  var a12272;
+  var a12273;
+  var a12274;
+  var a12275;
+  var a12276;
+  var a12277;
+  var a12278;
+  var a12279;
+  var a12280;
+  var a12281;
+  var a12282;
+  var a12283;
+  var a12284;
+  var a12285;
+  var a12286;
+  var a12287;
+  var a12288;
+  var a12289;
+  var a12290;
+  var a12291;
+  var a12292;
+  var a12293;
+  var a12294;
+  var a12295;
+  var a12296;
+  var a12297;
+  var a12298;
+  var a12299;
+  var a12300;
+  var a12301;
+  var a12302;
+  var a12303;
+  var a12304;
+  var a12305;
+  var a12306;
+  var a12307;
+  var a12308;
+  var a12309;
+  var a12310;
+  var a12311;
+  var a12312;
+  var a12313;
+  var a12314;
+  var a12315;
+  var a12316;
+  var a12317;
+  var a12318;
+  var a12319;
+  var a12320;
+  var a12321;
+  var a12322;
+  var a12323;
+  var a12324;
+  var a12325;
+  var a12326;
+  var a12327;
+  var a12328;
+  var a12329;
+  var a12330;
+  var a12331;
+  var a12332;
+  var a12333;
+  var a12334;
+  var a12335;
+  var a12336;
+  var a12337;
+  var a12338;
+  var a12339;
+  var a12340;
+  var a12341;
+  var a12342;
+  var a12343;
+  var a12344;
+  var a12345;
+  var a12346;
+  var a12347;
+  var a12348;
+  var a12349;
+  var a12350;
+  var a12351;
+  var a12352;
+  var a12353;
+  var a12354;
+  var a12355;
+  var a12356;
+  var a12357;
+  var a12358;
+  var a12359;
+  var a12360;
+  var a12361;
+  var a12362;
+  var a12363;
+  var a12364;
+  var a12365;
+  var a12366;
+  var a12367;
+  var a12368;
+  var a12369;
+  var a12370;
+  var a12371;
+  var a12372;
+  var a12373;
+  var a12374;
+  var a12375;
+  var a12376;
+  var a12377;
+  var a12378;
+  var a12379;
+  var a12380;
+  var a12381;
+  var a12382;
+  var a12383;
+  var a12384;
+  var a12385;
+  var a12386;
+  var a12387;
+  var a12388;
+  var a12389;
+  var a12390;
+  var a12391;
+  var a12392;
+  var a12393;
+  var a12394;
+  var a12395;
+  var a12396;
+  var a12397;
+  var a12398;
+  var a12399;
+  var a12400;
+  var a12401;
+  var a12402;
+  var a12403;
+  var a12404;
+  var a12405;
+  var a12406;
+  var a12407;
+  var a12408;
+  var a12409;
+  var a12410;
+  var a12411;
+  var a12412;
+  var a12413;
+  var a12414;
+  var a12415;
+  var a12416;
+  var a12417;
+  var a12418;
+  var a12419;
+  var a12420;
+  var a12421;
+  var a12422;
+  var a12423;
+  var a12424;
+  var a12425;
+  var a12426;
+  var a12427;
+  var a12428;
+  var a12429;
+  var a12430;
+  var a12431;
+  var a12432;
+  var a12433;
+  var a12434;
+  var a12435;
+  var a12436;
+  var a12437;
+  var a12438;
+  var a12439;
+  var a12440;
+  var a12441;
+  var a12442;
+  var a12443;
+  var a12444;
+  var a12445;
+  var a12446;
+  var a12447;
+  var a12448;
+  var a12449;
+  var a12450;
+  var a12451;
+  var a12452;
+  var a12453;
+  var a12454;
+  var a12455;
+  var a12456;
+  var a12457;
+  var a12458;
+  var a12459;
+  var a12460;
+  var a12461;
+  var a12462;
+  var a12463;
+  var a12464;
+  var a12465;
+  var a12466;
+  var a12467;
+  var a12468;
+  var a12469;
+  var a12470;
+  var a12471;
+  var a12472;
+  var a12473;
+  var a12474;
+  var a12475;
+  var a12476;
+  var a12477;
+  var a12478;
+  var a12479;
+  var a12480;
+  var a12481;
+  var a12482;
+  var a12483;
+  var a12484;
+  var a12485;
+  var a12486;
+  var a12487;
+  var a12488;
+  var a12489;
+  var a12490;
+  var a12491;
+  var a12492;
+  var a12493;
+  var a12494;
+  var a12495;
+  var a12496;
+  var a12497;
+  var a12498;
+  var a12499;
+  var a12500;
+  var a12501;
+  var a12502;
+  var a12503;
+  var a12504;
+  var a12505;
+  var a12506;
+  var a12507;
+  var a12508;
+  var a12509;
+  var a12510;
+  var a12511;
+  var a12512;
+  var a12513;
+  var a12514;
+  var a12515;
+  var a12516;
+  var a12517;
+  var a12518;
+  var a12519;
+  var a12520;
+  var a12521;
+  var a12522;
+  var a12523;
+  var a12524;
+  var a12525;
+  var a12526;
+  var a12527;
+  var a12528;
+  var a12529;
+  var a12530;
+  var a12531;
+  var a12532;
+  var a12533;
+  var a12534;
+  var a12535;
+  var a12536;
+  var a12537;
+  var a12538;
+  var a12539;
+  var a12540;
+  var a12541;
+  var a12542;
+  var a12543;
+  var a12544;
+  var a12545;
+  var a12546;
+  var a12547;
+  var a12548;
+  var a12549;
+  var a12550;
+  var a12551;
+  var a12552;
+  var a12553;
+  var a12554;
+  var a12555;
+  var a12556;
+  var a12557;
+  var a12558;
+  var a12559;
+  var a12560;
+  var a12561;
+  var a12562;
+  var a12563;
+  var a12564;
+  var a12565;
+  var a12566;
+  var a12567;
+  var a12568;
+  var a12569;
+  var a12570;
+  var a12571;
+  var a12572;
+  var a12573;
+  var a12574;
+  var a12575;
+  var a12576;
+  var a12577;
+  var a12578;
+  var a12579;
+  var a12580;
+  var a12581;
+  var a12582;
+  var a12583;
+  var a12584;
+  var a12585;
+  var a12586;
+  var a12587;
+  var a12588;
+  var a12589;
+  var a12590;
+  var a12591;
+  var a12592;
+  var a12593;
+  var a12594;
+  var a12595;
+  var a12596;
+  var a12597;
+  var a12598;
+  var a12599;
+  var a12600;
+  var a12601;
+  var a12602;
+  var a12603;
+  var a12604;
+  var a12605;
+  var a12606;
+  var a12607;
+  var a12608;
+  var a12609;
+  var a12610;
+  var a12611;
+  var a12612;
+  var a12613;
+  var a12614;
+  var a12615;
+  var a12616;
+  var a12617;
+  var a12618;
+  var a12619;
+  var a12620;
+  var a12621;
+  var a12622;
+  var a12623;
+  var a12624;
+  var a12625;
+  var a12626;
+  var a12627;
+  var a12628;
+  var a12629;
+  var a12630;
+  var a12631;
+  var a12632;
+  var a12633;
+  var a12634;
+  var a12635;
+  var a12636;
+  var a12637;
+  var a12638;
+  var a12639;
+  var a12640;
+  var a12641;
+  var a12642;
+  var a12643;
+  var a12644;
+  var a12645;
+  var a12646;
+  var a12647;
+  var a12648;
+  var a12649;
+  var a12650;
+  var a12651;
+  var a12652;
+  var a12653;
+  var a12654;
+  var a12655;
+  var a12656;
+  var a12657;
+  var a12658;
+  var a12659;
+  var a12660;
+  var a12661;
+  var a12662;
+  var a12663;
+  var a12664;
+  var a12665;
+  var a12666;
+  var a12667;
+  var a12668;
+  var a12669;
+  var a12670;
+  var a12671;
+  var a12672;
+  var a12673;
+  var a12674;
+  var a12675;
+  var a12676;
+  var a12677;
+  var a12678;
+  var a12679;
+  var a12680;
+  var a12681;
+  var a12682;
+  var a12683;
+  var a12684;
+  var a12685;
+  var a12686;
+  var a12687;
+  var a12688;
+  var a12689;
+  var a12690;
+  var a12691;
+  var a12692;
+  var a12693;
+  var a12694;
+  var a12695;
+  var a12696;
+  var a12697;
+  var a12698;
+  var a12699;
+  var a12700;
+  var a12701;
+  var a12702;
+  var a12703;
+  var a12704;
+  var a12705;
+  var a12706;
+  var a12707;
+  var a12708;
+  var a12709;
+  var a12710;
+  var a12711;
+  var a12712;
+  var a12713;
+  var a12714;
+  var a12715;
+  var a12716;
+  var a12717;
+  var a12718;
+  var a12719;
+  var a12720;
+  var a12721;
+  var a12722;
+  var a12723;
+  var a12724;
+  var a12725;
+  var a12726;
+  var a12727;
+  var a12728;
+  var a12729;
+  var a12730;
+  var a12731;
+  var a12732;
+  var a12733;
+  var a12734;
+  var a12735;
+  var a12736;
+  var a12737;
+  var a12738;
+  var a12739;
+  var a12740;
+  var a12741;
+  var a12742;
+  var a12743;
+  var a12744;
+  var a12745;
+  var a12746;
+  var a12747;
+  var a12748;
+  var a12749;
+  var a12750;
+  var a12751;
+  var a12752;
+  var a12753;
+  var a12754;
+  var a12755;
+  var a12756;
+  var a12757;
+  var a12758;
+  var a12759;
+  var a12760;
+  var a12761;
+  var a12762;
+  var a12763;
+  var a12764;
+  var a12765;
+  var a12766;
+  var a12767;
+  var a12768;
+  var a12769;
+  var a12770;
+  var a12771;
+  var a12772;
+  var a12773;
+  var a12774;
+  var a12775;
+  var a12776;
+  var a12777;
+  var a12778;
+  var a12779;
+  var a12780;
+  var a12781;
+  var a12782;
+  var a12783;
+  var a12784;
+  var a12785;
+  var a12786;
+  var a12787;
+  var a12788;
+  var a12789;
+  var a12790;
+  var a12791;
+  var a12792;
+  var a12793;
+  var a12794;
+  var a12795;
+  var a12796;
+  var a12797;
+  var a12798;
+  var a12799;
+  var a12800;
+  var a12801;
+  var a12802;
+  var a12803;
+  var a12804;
+  var a12805;
+  var a12806;
+  var a12807;
+  var a12808;
+  var a12809;
+  var a12810;
+  var a12811;
+  var a12812;
+  var a12813;
+  var a12814;
+  var a12815;
+  var a12816;
+  var a12817;
+  var a12818;
+  var a12819;
+  var a12820;
+  var a12821;
+  var a12822;
+  var a12823;
+  var a12824;
+  var a12825;
+  var a12826;
+  var a12827;
+  var a12828;
+  var a12829;
+  var a12830;
+  var a12831;
+  var a12832;
+  var a12833;
+  var a12834;
+  var a12835;
+  var a12836;
+  var a12837;
+  var a12838;
+  var a12839;
+  var a12840;
+  var a12841;
+  var a12842;
+  var a12843;
+  var a12844;
+  var a12845;
+  var a12846;
+  var a12847;
+  var a12848;
+  var a12849;
+  var a12850;
+  var a12851;
+  var a12852;
+  var a12853;
+  var a12854;
+  var a12855;
+  var a12856;
+  var a12857;
+  var a12858;
+  var a12859;
+  var a12860;
+  var a12861;
+  var a12862;
+  var a12863;
+  var a12864;
+  var a12865;
+  var a12866;
+  var a12867;
+  var a12868;
+  var a12869;
+  var a12870;
+  var a12871;
+  var a12872;
+  var a12873;
+  var a12874;
+  var a12875;
+  var a12876;
+  var a12877;
+  var a12878;
+  var a12879;
+  var a12880;
+  var a12881;
+  var a12882;
+  var a12883;
+  var a12884;
+  var a12885;
+  var a12886;
+  var a12887;
+  var a12888;
+  var a12889;
+  var a12890;
+  var a12891;
+  var a12892;
+  var a12893;
+  var a12894;
+  var a12895;
+  var a12896;
+  var a12897;
+  var a12898;
+  var a12899;
+  var a12900;
+  var a12901;
+  var a12902;
+  var a12903;
+  var a12904;
+  var a12905;
+  var a12906;
+  var a12907;
+  var a12908;
+  var a12909;
+  var a12910;
+  var a12911;
+  var a12912;
+  var a12913;
+  var a12914;
+  var a12915;
+  var a12916;
+  var a12917;
+  var a12918;
+  var a12919;
+  var a12920;
+  var a12921;
+  var a12922;
+  var a12923;
+  var a12924;
+  var a12925;
+  var a12926;
+  var a12927;
+  var a12928;
+  var a12929;
+  var a12930;
+  var a12931;
+  var a12932;
+  var a12933;
+  var a12934;
+  var a12935;
+  var a12936;
+  var a12937;
+  var a12938;
+  var a12939;
+  var a12940;
+  var a12941;
+  var a12942;
+  var a12943;
+  var a12944;
+  var a12945;
+  var a12946;
+  var a12947;
+  var a12948;
+  var a12949;
+  var a12950;
+  var a12951;
+  var a12952;
+  var a12953;
+  var a12954;
+  var a12955;
+  var a12956;
+  var a12957;
+  var a12958;
+  var a12959;
+  var a12960;
+  var a12961;
+  var a12962;
+  var a12963;
+  var a12964;
+  var a12965;
+  var a12966;
+  var a12967;
+  var a12968;
+  var a12969;
+  var a12970;
+  var a12971;
+  var a12972;
+  var a12973;
+  var a12974;
+  var a12975;
+  var a12976;
+  var a12977;
+  var a12978;
+  var a12979;
+  var a12980;
+  var a12981;
+  var a12982;
+  var a12983;
+  var a12984;
+  var a12985;
+  var a12986;
+  var a12987;
+  var a12988;
+  var a12989;
+  var a12990;
+  var a12991;
+  var a12992;
+  var a12993;
+  var a12994;
+  var a12995;
+  var a12996;
+  var a12997;
+  var a12998;
+  var a12999;
+  var a13000;
+  var a13001;
+  var a13002;
+  var a13003;
+  var a13004;
+  var a13005;
+  var a13006;
+  var a13007;
+  var a13008;
+  var a13009;
+  var a13010;
+  var a13011;
+  var a13012;
+  var a13013;
+  var a13014;
+  var a13015;
+  var a13016;
+  var a13017;
+  var a13018;
+  var a13019;
+  var a13020;
+  var a13021;
+  var a13022;
+  var a13023;
+  var a13024;
+  var a13025;
+  var a13026;
+  var a13027;
+  var a13028;
+  var a13029;
+  var a13030;
+  var a13031;
+  var a13032;
+  var a13033;
+  var a13034;
+  var a13035;
+  var a13036;
+  var a13037;
+  var a13038;
+  var a13039;
+  var a13040;
+  var a13041;
+  var a13042;
+  var a13043;
+  var a13044;
+  var a13045;
+  var a13046;
+  var a13047;
+  var a13048;
+  var a13049;
+  var a13050;
+  var a13051;
+  var a13052;
+  var a13053;
+  var a13054;
+  var a13055;
+  var a13056;
+  var a13057;
+  var a13058;
+  var a13059;
+  var a13060;
+  var a13061;
+  var a13062;
+  var a13063;
+  var a13064;
+  var a13065;
+  var a13066;
+  var a13067;
+  var a13068;
+  var a13069;
+  var a13070;
+  var a13071;
+  var a13072;
+  var a13073;
+  var a13074;
+  var a13075;
+  var a13076;
+  var a13077;
+  var a13078;
+  var a13079;
+  var a13080;
+  var a13081;
+  var a13082;
+  var a13083;
+  var a13084;
+  var a13085;
+  var a13086;
+  var a13087;
+  var a13088;
+  var a13089;
+  var a13090;
+  var a13091;
+  var a13092;
+  var a13093;
+  var a13094;
+  var a13095;
+  var a13096;
+  var a13097;
+  var a13098;
+  var a13099;
+  var a13100;
+  var a13101;
+  var a13102;
+  var a13103;
+  var a13104;
+  var a13105;
+  var a13106;
+  var a13107;
+  var a13108;
+  var a13109;
+  var a13110;
+  var a13111;
+  var a13112;
+  var a13113;
+  var a13114;
+  var a13115;
+  var a13116;
+  var a13117;
+  var a13118;
+  var a13119;
+  var a13120;
+  var a13121;
+  var a13122;
+  var a13123;
+  var a13124;
+  var a13125;
+  var a13126;
+  var a13127;
+  var a13128;
+  var a13129;
+  var a13130;
+  var a13131;
+  var a13132;
+  var a13133;
+  var a13134;
+  var a13135;
+  var a13136;
+  var a13137;
+  var a13138;
+  var a13139;
+  var a13140;
+  var a13141;
+  var a13142;
+  var a13143;
+  var a13144;
+  var a13145;
+  var a13146;
+  var a13147;
+  var a13148;
+  var a13149;
+  var a13150;
+  var a13151;
+  var a13152;
+  var a13153;
+  var a13154;
+  var a13155;
+  var a13156;
+  var a13157;
+  var a13158;
+  var a13159;
+  var a13160;
+  var a13161;
+  var a13162;
+  var a13163;
+  var a13164;
+  var a13165;
+  var a13166;
+  var a13167;
+  var a13168;
+  var a13169;
+  var a13170;
+  var a13171;
+  var a13172;
+  var a13173;
+  var a13174;
+  var a13175;
+  var a13176;
+  var a13177;
+  var a13178;
+  var a13179;
+  var a13180;
+  var a13181;
+  var a13182;
+  var a13183;
+  var a13184;
+  var a13185;
+  var a13186;
+  var a13187;
+  var a13188;
+  var a13189;
+  var a13190;
+  var a13191;
+  var a13192;
+  var a13193;
+  var a13194;
+  var a13195;
+  var a13196;
+  var a13197;
+  var a13198;
+  var a13199;
+  var a13200;
+  var a13201;
+  var a13202;
+  var a13203;
+  var a13204;
+  var a13205;
+  var a13206;
+  var a13207;
+  var a13208;
+  var a13209;
+  var a13210;
+  var a13211;
+  var a13212;
+  var a13213;
+  var a13214;
+  var a13215;
+  var a13216;
+  var a13217;
+  var a13218;
+  var a13219;
+  var a13220;
+  var a13221;
+  var a13222;
+  var a13223;
+  var a13224;
+  var a13225;
+  var a13226;
+  var a13227;
+  var a13228;
+  var a13229;
+  var a13230;
+  var a13231;
+  var a13232;
+  var a13233;
+  var a13234;
+  var a13235;
+  var a13236;
+  var a13237;
+  var a13238;
+  var a13239;
+  var a13240;
+  var a13241;
+  var a13242;
+  var a13243;
+  var a13244;
+  var a13245;
+  var a13246;
+  var a13247;
+  var a13248;
+  var a13249;
+  var a13250;
+  var a13251;
+  var a13252;
+  var a13253;
+  var a13254;
+  var a13255;
+  var a13256;
+  var a13257;
+  var a13258;
+  var a13259;
+  var a13260;
+  var a13261;
+  var a13262;
+  var a13263;
+  var a13264;
+  var a13265;
+  var a13266;
+  var a13267;
+  var a13268;
+  var a13269;
+  var a13270;
+  var a13271;
+  var a13272;
+  var a13273;
+  var a13274;
+  var a13275;
+  var a13276;
+  var a13277;
+  var a13278;
+  var a13279;
+  var a13280;
+  var a13281;
+  var a13282;
+  var a13283;
+  var a13284;
+  var a13285;
+  var a13286;
+  var a13287;
+  var a13288;
+  var a13289;
+  var a13290;
+  var a13291;
+  var a13292;
+  var a13293;
+  var a13294;
+  var a13295;
+  var a13296;
+  var a13297;
+  var a13298;
+  var a13299;
+  var a13300;
+  var a13301;
+  var a13302;
+  var a13303;
+  var a13304;
+  var a13305;
+  var a13306;
+  var a13307;
+  var a13308;
+  var a13309;
+  var a13310;
+  var a13311;
+  var a13312;
+  var a13313;
+  var a13314;
+  var a13315;
+  var a13316;
+  var a13317;
+  var a13318;
+  var a13319;
+  var a13320;
+  var a13321;
+  var a13322;
+  var a13323;
+  var a13324;
+  var a13325;
+  var a13326;
+  var a13327;
+  var a13328;
+  var a13329;
+  var a13330;
+  var a13331;
+  var a13332;
+  var a13333;
+  var a13334;
+  var a13335;
+  var a13336;
+  var a13337;
+  var a13338;
+  var a13339;
+  var a13340;
+  var a13341;
+  var a13342;
+  var a13343;
+  var a13344;
+  var a13345;
+  var a13346;
+  var a13347;
+  var a13348;
+  var a13349;
+  var a13350;
+  var a13351;
+  var a13352;
+  var a13353;
+  var a13354;
+  var a13355;
+  var a13356;
+  var a13357;
+  var a13358;
+  var a13359;
+  var a13360;
+  var a13361;
+  var a13362;
+  var a13363;
+  var a13364;
+  var a13365;
+  var a13366;
+  var a13367;
+  var a13368;
+  var a13369;
+  var a13370;
+  var a13371;
+  var a13372;
+  var a13373;
+  var a13374;
+  var a13375;
+  var a13376;
+  var a13377;
+  var a13378;
+  var a13379;
+  var a13380;
+  var a13381;
+  var a13382;
+  var a13383;
+  var a13384;
+  var a13385;
+  var a13386;
+  var a13387;
+  var a13388;
+  var a13389;
+  var a13390;
+  var a13391;
+  var a13392;
+  var a13393;
+  var a13394;
+  var a13395;
+  var a13396;
+  var a13397;
+  var a13398;
+  var a13399;
+  var a13400;
+  var a13401;
+  var a13402;
+  var a13403;
+  var a13404;
+  var a13405;
+  var a13406;
+  var a13407;
+  var a13408;
+  var a13409;
+  var a13410;
+  var a13411;
+  var a13412;
+  var a13413;
+  var a13414;
+  var a13415;
+  var a13416;
+  var a13417;
+  var a13418;
+  var a13419;
+  var a13420;
+  var a13421;
+  var a13422;
+  var a13423;
+  var a13424;
+  var a13425;
+  var a13426;
+  var a13427;
+  var a13428;
+  var a13429;
+  var a13430;
+  var a13431;
+  var a13432;
+  var a13433;
+  var a13434;
+  var a13435;
+  var a13436;
+  var a13437;
+  var a13438;
+  var a13439;
+  var a13440;
+  var a13441;
+  var a13442;
+  var a13443;
+  var a13444;
+  var a13445;
+  var a13446;
+  var a13447;
+  var a13448;
+  var a13449;
+  var a13450;
+  var a13451;
+  var a13452;
+  var a13453;
+  var a13454;
+  var a13455;
+  var a13456;
+  var a13457;
+  var a13458;
+  var a13459;
+  var a13460;
+  var a13461;
+  var a13462;
+  var a13463;
+  var a13464;
+  var a13465;
+  var a13466;
+  var a13467;
+  var a13468;
+  var a13469;
+  var a13470;
+  var a13471;
+  var a13472;
+  var a13473;
+  var a13474;
+  var a13475;
+  var a13476;
+  var a13477;
+  var a13478;
+  var a13479;
+  var a13480;
+  var a13481;
+  var a13482;
+  var a13483;
+  var a13484;
+  var a13485;
+  var a13486;
+  var a13487;
+  var a13488;
+  var a13489;
+  var a13490;
+  var a13491;
+  var a13492;
+  var a13493;
+  var a13494;
+  var a13495;
+  var a13496;
+  var a13497;
+  var a13498;
+  var a13499;
+  var a13500;
+  var a13501;
+  var a13502;
+  var a13503;
+  var a13504;
+  var a13505;
+  var a13506;
+  var a13507;
+  var a13508;
+  var a13509;
+  var a13510;
+  var a13511;
+  var a13512;
+  var a13513;
+  var a13514;
+  var a13515;
+  var a13516;
+  var a13517;
+  var a13518;
+  var a13519;
+  var a13520;
+  var a13521;
+  var a13522;
+  var a13523;
+  var a13524;
+  var a13525;
+  var a13526;
+  var a13527;
+  var a13528;
+  var a13529;
+  var a13530;
+  var a13531;
+  var a13532;
+  var a13533;
+  var a13534;
+  var a13535;
+  var a13536;
+  var a13537;
+  var a13538;
+  var a13539;
+  var a13540;
+  var a13541;
+  var a13542;
+  var a13543;
+  var a13544;
+  var a13545;
+  var a13546;
+  var a13547;
+  var a13548;
+  var a13549;
+  var a13550;
+  var a13551;
+  var a13552;
+  var a13553;
+  var a13554;
+  var a13555;
+  var a13556;
+  var a13557;
+  var a13558;
+  var a13559;
+  var a13560;
+  var a13561;
+  var a13562;
+  var a13563;
+  var a13564;
+  var a13565;
+  var a13566;
+  var a13567;
+  var a13568;
+  var a13569;
+  var a13570;
+  var a13571;
+  var a13572;
+  var a13573;
+  var a13574;
+  var a13575;
+  var a13576;
+  var a13577;
+  var a13578;
+  var a13579;
+  var a13580;
+  var a13581;
+  var a13582;
+  var a13583;
+  var a13584;
+  var a13585;
+  var a13586;
+  var a13587;
+  var a13588;
+  var a13589;
+  var a13590;
+  var a13591;
+  var a13592;
+  var a13593;
+  var a13594;
+  var a13595;
+  var a13596;
+  var a13597;
+  var a13598;
+  var a13599;
+  var a13600;
+  var a13601;
+  var a13602;
+  var a13603;
+  var a13604;
+  var a13605;
+  var a13606;
+  var a13607;
+  var a13608;
+  var a13609;
+  var a13610;
+  var a13611;
+  var a13612;
+  var a13613;
+  var a13614;
+  var a13615;
+  var a13616;
+  var a13617;
+  var a13618;
+  var a13619;
+  var a13620;
+  var a13621;
+  var a13622;
+  var a13623;
+  var a13624;
+  var a13625;
+  var a13626;
+  var a13627;
+  var a13628;
+  var a13629;
+  var a13630;
+  var a13631;
+  var a13632;
+  var a13633;
+  var a13634;
+  var a13635;
+  var a13636;
+  var a13637;
+  var a13638;
+  var a13639;
+  var a13640;
+  var a13641;
+  var a13642;
+  var a13643;
+  var a13644;
+  var a13645;
+  var a13646;
+  var a13647;
+  var a13648;
+  var a13649;
+  var a13650;
+  var a13651;
+  var a13652;
+  var a13653;
+  var a13654;
+  var a13655;
+  var a13656;
+  var a13657;
+  var a13658;
+  var a13659;
+  var a13660;
+  var a13661;
+  var a13662;
+  var a13663;
+  var a13664;
+  var a13665;
+  var a13666;
+  var a13667;
+  var a13668;
+  var a13669;
+  var a13670;
+  var a13671;
+  var a13672;
+  var a13673;
+  var a13674;
+  var a13675;
+  var a13676;
+  var a13677;
+  var a13678;
+  var a13679;
+  var a13680;
+  var a13681;
+  var a13682;
+  var a13683;
+  var a13684;
+  var a13685;
+  var a13686;
+  var a13687;
+  var a13688;
+  var a13689;
+  var a13690;
+  var a13691;
+  var a13692;
+  var a13693;
+  var a13694;
+  var a13695;
+  var a13696;
+  var a13697;
+  var a13698;
+  var a13699;
+  var a13700;
+  var a13701;
+  var a13702;
+  var a13703;
+  var a13704;
+  var a13705;
+  var a13706;
+  var a13707;
+  var a13708;
+  var a13709;
+  var a13710;
+  var a13711;
+  var a13712;
+  var a13713;
+  var a13714;
+  var a13715;
+  var a13716;
+  var a13717;
+  var a13718;
+  var a13719;
+  var a13720;
+  var a13721;
+  var a13722;
+  var a13723;
+  var a13724;
+  var a13725;
+  var a13726;
+  var a13727;
+  var a13728;
+  var a13729;
+  var a13730;
+  var a13731;
+  var a13732;
+  var a13733;
+  var a13734;
+  var a13735;
+  var a13736;
+  var a13737;
+  var a13738;
+  var a13739;
+  var a13740;
+  var a13741;
+  var a13742;
+  var a13743;
+  var a13744;
+  var a13745;
+  var a13746;
+  var a13747;
+  var a13748;
+  var a13749;
+  var a13750;
+  var a13751;
+  var a13752;
+  var a13753;
+  var a13754;
+  var a13755;
+  var a13756;
+  var a13757;
+  var a13758;
+  var a13759;
+  var a13760;
+  var a13761;
+  var a13762;
+  var a13763;
+  var a13764;
+  var a13765;
+  var a13766;
+  var a13767;
+  var a13768;
+  var a13769;
+  var a13770;
+  var a13771;
+  var a13772;
+  var a13773;
+  var a13774;
+  var a13775;
+  var a13776;
+  var a13777;
+  var a13778;
+  var a13779;
+  var a13780;
+  var a13781;
+  var a13782;
+  var a13783;
+  var a13784;
+  var a13785;
+  var a13786;
+  var a13787;
+  var a13788;
+  var a13789;
+  var a13790;
+  var a13791;
+  var a13792;
+  var a13793;
+  var a13794;
+  var a13795;
+  var a13796;
+  var a13797;
+  var a13798;
+  var a13799;
+  var a13800;
+  var a13801;
+  var a13802;
+  var a13803;
+  var a13804;
+  var a13805;
+  var a13806;
+  var a13807;
+  var a13808;
+  var a13809;
+  var a13810;
+  var a13811;
+  var a13812;
+  var a13813;
+  var a13814;
+  var a13815;
+  var a13816;
+  var a13817;
+  var a13818;
+  var a13819;
+  var a13820;
+  var a13821;
+  var a13822;
+  var a13823;
+  var a13824;
+  var a13825;
+  var a13826;
+  var a13827;
+  var a13828;
+  var a13829;
+  var a13830;
+  var a13831;
+  var a13832;
+  var a13833;
+  var a13834;
+  var a13835;
+  var a13836;
+  var a13837;
+  var a13838;
+  var a13839;
+  var a13840;
+  var a13841;
+  var a13842;
+  var a13843;
+  var a13844;
+  var a13845;
+  var a13846;
+  var a13847;
+  var a13848;
+  var a13849;
+  var a13850;
+  var a13851;
+  var a13852;
+  var a13853;
+  var a13854;
+  var a13855;
+  var a13856;
+  var a13857;
+  var a13858;
+  var a13859;
+  var a13860;
+  var a13861;
+  var a13862;
+  var a13863;
+  var a13864;
+  var a13865;
+  var a13866;
+  var a13867;
+  var a13868;
+  var a13869;
+  var a13870;
+  var a13871;
+  var a13872;
+  var a13873;
+  var a13874;
+  var a13875;
+  var a13876;
+  var a13877;
+  var a13878;
+  var a13879;
+  var a13880;
+  var a13881;
+  var a13882;
+  var a13883;
+  var a13884;
+  var a13885;
+  var a13886;
+  var a13887;
+  var a13888;
+  var a13889;
+  var a13890;
+  var a13891;
+  var a13892;
+  var a13893;
+  var a13894;
+  var a13895;
+  var a13896;
+  var a13897;
+  var a13898;
+  var a13899;
+  var a13900;
+  var a13901;
+  var a13902;
+  var a13903;
+  var a13904;
+  var a13905;
+  var a13906;
+  var a13907;
+  var a13908;
+  var a13909;
+  var a13910;
+  var a13911;
+  var a13912;
+  var a13913;
+  var a13914;
+  var a13915;
+  var a13916;
+  var a13917;
+  var a13918;
+  var a13919;
+  var a13920;
+  var a13921;
+  var a13922;
+  var a13923;
+  var a13924;
+  var a13925;
+  var a13926;
+  var a13927;
+  var a13928;
+  var a13929;
+  var a13930;
+  var a13931;
+  var a13932;
+  var a13933;
+  var a13934;
+  var a13935;
+  var a13936;
+  var a13937;
+  var a13938;
+  var a13939;
+  var a13940;
+  var a13941;
+  var a13942;
+  var a13943;
+  var a13944;
+  var a13945;
+  var a13946;
+  var a13947;
+  var a13948;
+  var a13949;
+  var a13950;
+  var a13951;
+  var a13952;
+  var a13953;
+  var a13954;
+  var a13955;
+  var a13956;
+  var a13957;
+  var a13958;
+  var a13959;
+  var a13960;
+  var a13961;
+  var a13962;
+  var a13963;
+  var a13964;
+  var a13965;
+  var a13966;
+  var a13967;
+  var a13968;
+  var a13969;
+  var a13970;
+  var a13971;
+  var a13972;
+  var a13973;
+  var a13974;
+  var a13975;
+  var a13976;
+  var a13977;
+  var a13978;
+  var a13979;
+  var a13980;
+  var a13981;
+  var a13982;
+  var a13983;
+  var a13984;
+  var a13985;
+  var a13986;
+  var a13987;
+  var a13988;
+  var a13989;
+  var a13990;
+  var a13991;
+  var a13992;
+  var a13993;
+  var a13994;
+  var a13995;
+  var a13996;
+  var a13997;
+  var a13998;
+  var a13999;
+  var a14000;
+  var a14001;
+  var a14002;
+  var a14003;
+  var a14004;
+  var a14005;
+  var a14006;
+  var a14007;
+  var a14008;
+  var a14009;
+  var a14010;
+  var a14011;
+  var a14012;
+  var a14013;
+  var a14014;
+  var a14015;
+  var a14016;
+  var a14017;
+  var a14018;
+  var a14019;
+  var a14020;
+  var a14021;
+  var a14022;
+  var a14023;
+  var a14024;
+  var a14025;
+  var a14026;
+  var a14027;
+  var a14028;
+  var a14029;
+  var a14030;
+  var a14031;
+  var a14032;
+  var a14033;
+  var a14034;
+  var a14035;
+  var a14036;
+  var a14037;
+  var a14038;
+  var a14039;
+  var a14040;
+  var a14041;
+  var a14042;
+  var a14043;
+  var a14044;
+  var a14045;
+  var a14046;
+  var a14047;
+  var a14048;
+  var a14049;
+  var a14050;
+  var a14051;
+  var a14052;
+  var a14053;
+  var a14054;
+  var a14055;
+  var a14056;
+  var a14057;
+  var a14058;
+  var a14059;
+  var a14060;
+  var a14061;
+  var a14062;
+  var a14063;
+  var a14064;
+  var a14065;
+  var a14066;
+  var a14067;
+  var a14068;
+  var a14069;
+  var a14070;
+  var a14071;
+  var a14072;
+  var a14073;
+  var a14074;
+  var a14075;
+  var a14076;
+  var a14077;
+  var a14078;
+  var a14079;
+  var a14080;
+  var a14081;
+  var a14082;
+  var a14083;
+  var a14084;
+  var a14085;
+  var a14086;
+  var a14087;
+  var a14088;
+  var a14089;
+  var a14090;
+  var a14091;
+  var a14092;
+  var a14093;
+  var a14094;
+  var a14095;
+  var a14096;
+  var a14097;
+  var a14098;
+  var a14099;
+  var a14100;
+  var a14101;
+  var a14102;
+  var a14103;
+  var a14104;
+  var a14105;
+  var a14106;
+  var a14107;
+  var a14108;
+  var a14109;
+  var a14110;
+  var a14111;
+  var a14112;
+  var a14113;
+  var a14114;
+  var a14115;
+  var a14116;
+  var a14117;
+  var a14118;
+  var a14119;
+  var a14120;
+  var a14121;
+  var a14122;
+  var a14123;
+  var a14124;
+  var a14125;
+  var a14126;
+  var a14127;
+  var a14128;
+  var a14129;
+  var a14130;
+  var a14131;
+  var a14132;
+  var a14133;
+  var a14134;
+  var a14135;
+  var a14136;
+  var a14137;
+  var a14138;
+  var a14139;
+  var a14140;
+  var a14141;
+  var a14142;
+  var a14143;
+  var a14144;
+  var a14145;
+  var a14146;
+  var a14147;
+  var a14148;
+  var a14149;
+  var a14150;
+  var a14151;
+  var a14152;
+  var a14153;
+  var a14154;
+  var a14155;
+  var a14156;
+  var a14157;
+  var a14158;
+  var a14159;
+  var a14160;
+  var a14161;
+  var a14162;
+  var a14163;
+  var a14164;
+  var a14165;
+  var a14166;
+  var a14167;
+  var a14168;
+  var a14169;
+  var a14170;
+  var a14171;
+  var a14172;
+  var a14173;
+  var a14174;
+  var a14175;
+  var a14176;
+  var a14177;
+  var a14178;
+  var a14179;
+  var a14180;
+  var a14181;
+  var a14182;
+  var a14183;
+  var a14184;
+  var a14185;
+  var a14186;
+  var a14187;
+  var a14188;
+  var a14189;
+  var a14190;
+  var a14191;
+  var a14192;
+  var a14193;
+  var a14194;
+  var a14195;
+  var a14196;
+  var a14197;
+  var a14198;
+  var a14199;
+  var a14200;
+  var a14201;
+  var a14202;
+  var a14203;
+  var a14204;
+  var a14205;
+  var a14206;
+  var a14207;
+  var a14208;
+  var a14209;
+  var a14210;
+  var a14211;
+  var a14212;
+  var a14213;
+  var a14214;
+  var a14215;
+  var a14216;
+  var a14217;
+  var a14218;
+  var a14219;
+  var a14220;
+  var a14221;
+  var a14222;
+  var a14223;
+  var a14224;
+  var a14225;
+  var a14226;
+  var a14227;
+  var a14228;
+  var a14229;
+  var a14230;
+  var a14231;
+  var a14232;
+  var a14233;
+  var a14234;
+  var a14235;
+  var a14236;
+  var a14237;
+  var a14238;
+  var a14239;
+  var a14240;
+  var a14241;
+  var a14242;
+  var a14243;
+  var a14244;
+  var a14245;
+  var a14246;
+  var a14247;
+  var a14248;
+  var a14249;
+  var a14250;
+  var a14251;
+  var a14252;
+  var a14253;
+  var a14254;
+  var a14255;
+  var a14256;
+  var a14257;
+  var a14258;
+  var a14259;
+  var a14260;
+  var a14261;
+  var a14262;
+  var a14263;
+  var a14264;
+  var a14265;
+  var a14266;
+  var a14267;
+  var a14268;
+  var a14269;
+  var a14270;
+  var a14271;
+  var a14272;
+  var a14273;
+  var a14274;
+  var a14275;
+  var a14276;
+  var a14277;
+  var a14278;
+  var a14279;
+  var a14280;
+  var a14281;
+  var a14282;
+  var a14283;
+  var a14284;
+  var a14285;
+  var a14286;
+  var a14287;
+  var a14288;
+  var a14289;
+  var a14290;
+  var a14291;
+  var a14292;
+  var a14293;
+  var a14294;
+  var a14295;
+  var a14296;
+  var a14297;
+  var a14298;
+  var a14299;
+  var a14300;
+  var a14301;
+  var a14302;
+  var a14303;
+  var a14304;
+  var a14305;
+  var a14306;
+  var a14307;
+  var a14308;
+  var a14309;
+  var a14310;
+  var a14311;
+  var a14312;
+  var a14313;
+  var a14314;
+  var a14315;
+  var a14316;
+  var a14317;
+  var a14318;
+  var a14319;
+  var a14320;
+  var a14321;
+  var a14322;
+  var a14323;
+  var a14324;
+  var a14325;
+  var a14326;
+  var a14327;
+  var a14328;
+  var a14329;
+  var a14330;
+  var a14331;
+  var a14332;
+  var a14333;
+  var a14334;
+  var a14335;
+  var a14336;
+  var a14337;
+  var a14338;
+  var a14339;
+  var a14340;
+  var a14341;
+  var a14342;
+  var a14343;
+  var a14344;
+  var a14345;
+  var a14346;
+  var a14347;
+  var a14348;
+  var a14349;
+  var a14350;
+  var a14351;
+  var a14352;
+  var a14353;
+  var a14354;
+  var a14355;
+  var a14356;
+  var a14357;
+  var a14358;
+  var a14359;
+  var a14360;
+  var a14361;
+  var a14362;
+  var a14363;
+  var a14364;
+  var a14365;
+  var a14366;
+  var a14367;
+  var a14368;
+  var a14369;
+  var a14370;
+  var a14371;
+  var a14372;
+  var a14373;
+  var a14374;
+  var a14375;
+  var a14376;
+  var a14377;
+  var a14378;
+  var a14379;
+  var a14380;
+  var a14381;
+  var a14382;
+  var a14383;
+  var a14384;
+  var a14385;
+  var a14386;
+  var a14387;
+  var a14388;
+  var a14389;
+  var a14390;
+  var a14391;
+  var a14392;
+  var a14393;
+  var a14394;
+  var a14395;
+  var a14396;
+  var a14397;
+  var a14398;
+  var a14399;
+  var a14400;
+  var a14401;
+  var a14402;
+  var a14403;
+  var a14404;
+  var a14405;
+  var a14406;
+  var a14407;
+  var a14408;
+  var a14409;
+  var a14410;
+  var a14411;
+  var a14412;
+  var a14413;
+  var a14414;
+  var a14415;
+  var a14416;
+  var a14417;
+  var a14418;
+  var a14419;
+  var a14420;
+  var a14421;
+  var a14422;
+  var a14423;
+  var a14424;
+  var a14425;
+  var a14426;
+  var a14427;
+  var a14428;
+  var a14429;
+  var a14430;
+  var a14431;
+  var a14432;
+  var a14433;
+  var a14434;
+  var a14435;
+  var a14436;
+  var a14437;
+  var a14438;
+  var a14439;
+  var a14440;
+  var a14441;
+  var a14442;
+  var a14443;
+  var a14444;
+  var a14445;
+  var a14446;
+  var a14447;
+  var a14448;
+  var a14449;
+  var a14450;
+  var a14451;
+  var a14452;
+  var a14453;
+  var a14454;
+  var a14455;
+  var a14456;
+  var a14457;
+  var a14458;
+  var a14459;
+  var a14460;
+  var a14461;
+  var a14462;
+  var a14463;
+  var a14464;
+  var a14465;
+  var a14466;
+  var a14467;
+  var a14468;
+  var a14469;
+  var a14470;
+  var a14471;
+  var a14472;
+  var a14473;
+  var a14474;
+  var a14475;
+  var a14476;
+  var a14477;
+  var a14478;
+  var a14479;
+  var a14480;
+  var a14481;
+  var a14482;
+  var a14483;
+  var a14484;
+  var a14485;
+  var a14486;
+  var a14487;
+  var a14488;
+  var a14489;
+  var a14490;
+  var a14491;
+  var a14492;
+  var a14493;
+  var a14494;
+  var a14495;
+  var a14496;
+  var a14497;
+  var a14498;
+  var a14499;
+  var a14500;
+  var a14501;
+  var a14502;
+  var a14503;
+  var a14504;
+  var a14505;
+  var a14506;
+  var a14507;
+  var a14508;
+  var a14509;
+  var a14510;
+  var a14511;
+  var a14512;
+  var a14513;
+  var a14514;
+  var a14515;
+  var a14516;
+  var a14517;
+  var a14518;
+  var a14519;
+  var a14520;
+  var a14521;
+  var a14522;
+  var a14523;
+  var a14524;
+  var a14525;
+  var a14526;
+  var a14527;
+  var a14528;
+  var a14529;
+  var a14530;
+  var a14531;
+  var a14532;
+  var a14533;
+  var a14534;
+  var a14535;
+  var a14536;
+  var a14537;
+  var a14538;
+  var a14539;
+  var a14540;
+  var a14541;
+  var a14542;
+  var a14543;
+  var a14544;
+  var a14545;
+  var a14546;
+  var a14547;
+  var a14548;
+  var a14549;
+  var a14550;
+  var a14551;
+  var a14552;
+  var a14553;
+  var a14554;
+  var a14555;
+  var a14556;
+  var a14557;
+  var a14558;
+  var a14559;
+  var a14560;
+  var a14561;
+  var a14562;
+  var a14563;
+  var a14564;
+  var a14565;
+  var a14566;
+  var a14567;
+  var a14568;
+  var a14569;
+  var a14570;
+  var a14571;
+  var a14572;
+  var a14573;
+  var a14574;
+  var a14575;
+  var a14576;
+  var a14577;
+  var a14578;
+  var a14579;
+  var a14580;
+  var a14581;
+  var a14582;
+  var a14583;
+  var a14584;
+  var a14585;
+  var a14586;
+  var a14587;
+  var a14588;
+  var a14589;
+  var a14590;
+  var a14591;
+  var a14592;
+  var a14593;
+  var a14594;
+  var a14595;
+  var a14596;
+  var a14597;
+  var a14598;
+  var a14599;
+  var a14600;
+  var a14601;
+  var a14602;
+  var a14603;
+  var a14604;
+  var a14605;
+  var a14606;
+  var a14607;
+  var a14608;
+  var a14609;
+  var a14610;
+  var a14611;
+  var a14612;
+  var a14613;
+  var a14614;
+  var a14615;
+  var a14616;
+  var a14617;
+  var a14618;
+  var a14619;
+  var a14620;
+  var a14621;
+  var a14622;
+  var a14623;
+  var a14624;
+  var a14625;
+  var a14626;
+  var a14627;
+  var a14628;
+  var a14629;
+  var a14630;
+  var a14631;
+  var a14632;
+  var a14633;
+  var a14634;
+  var a14635;
+  var a14636;
+  var a14637;
+  var a14638;
+  var a14639;
+  var a14640;
+  var a14641;
+  var a14642;
+  var a14643;
+  var a14644;
+  var a14645;
+  var a14646;
+  var a14647;
+  var a14648;
+  var a14649;
+  var a14650;
+  var a14651;
+  var a14652;
+  var a14653;
+  var a14654;
+  var a14655;
+  var a14656;
+  var a14657;
+  var a14658;
+  var a14659;
+  var a14660;
+  var a14661;
+  var a14662;
+  var a14663;
+  var a14664;
+  var a14665;
+  var a14666;
+  var a14667;
+  var a14668;
+  var a14669;
+  var a14670;
+  var a14671;
+  var a14672;
+  var a14673;
+  var a14674;
+  var a14675;
+  var a14676;
+  var a14677;
+  var a14678;
+  var a14679;
+  var a14680;
+  var a14681;
+  var a14682;
+  var a14683;
+  var a14684;
+  var a14685;
+  var a14686;
+  var a14687;
+  var a14688;
+  var a14689;
+  var a14690;
+  var a14691;
+  var a14692;
+  var a14693;
+  var a14694;
+  var a14695;
+  var a14696;
+  var a14697;
+  var a14698;
+  var a14699;
+  var a14700;
+  var a14701;
+  var a14702;
+  var a14703;
+  var a14704;
+  var a14705;
+  var a14706;
+  var a14707;
+  var a14708;
+  var a14709;
+  var a14710;
+  var a14711;
+  var a14712;
+  var a14713;
+  var a14714;
+  var a14715;
+  var a14716;
+  var a14717;
+  var a14718;
+  var a14719;
+  var a14720;
+  var a14721;
+  var a14722;
+  var a14723;
+  var a14724;
+  var a14725;
+  var a14726;
+  var a14727;
+  var a14728;
+  var a14729;
+  var a14730;
+  var a14731;
+  var a14732;
+  var a14733;
+  var a14734;
+  var a14735;
+  var a14736;
+  var a14737;
+  var a14738;
+  var a14739;
+  var a14740;
+  var a14741;
+  var a14742;
+  var a14743;
+  var a14744;
+  var a14745;
+  var a14746;
+  var a14747;
+  var a14748;
+  var a14749;
+  var a14750;
+  var a14751;
+  var a14752;
+  var a14753;
+  var a14754;
+  var a14755;
+  var a14756;
+  var a14757;
+  var a14758;
+  var a14759;
+  var a14760;
+  var a14761;
+  var a14762;
+  var a14763;
+  var a14764;
+  var a14765;
+  var a14766;
+  var a14767;
+  var a14768;
+  var a14769;
+  var a14770;
+  var a14771;
+  var a14772;
+  var a14773;
+  var a14774;
+  var a14775;
+  var a14776;
+  var a14777;
+  var a14778;
+  var a14779;
+  var a14780;
+  var a14781;
+  var a14782;
+  var a14783;
+  var a14784;
+  var a14785;
+  var a14786;
+  var a14787;
+  var a14788;
+  var a14789;
+  var a14790;
+  var a14791;
+  var a14792;
+  var a14793;
+  var a14794;
+  var a14795;
+  var a14796;
+  var a14797;
+  var a14798;
+  var a14799;
+  var a14800;
+  var a14801;
+  var a14802;
+  var a14803;
+  var a14804;
+  var a14805;
+  var a14806;
+  var a14807;
+  var a14808;
+  var a14809;
+  var a14810;
+  var a14811;
+  var a14812;
+  var a14813;
+  var a14814;
+  var a14815;
+  var a14816;
+  var a14817;
+  var a14818;
+  var a14819;
+  var a14820;
+  var a14821;
+  var a14822;
+  var a14823;
+  var a14824;
+  var a14825;
+  var a14826;
+  var a14827;
+  var a14828;
+  var a14829;
+  var a14830;
+  var a14831;
+  var a14832;
+  var a14833;
+  var a14834;
+  var a14835;
+  var a14836;
+  var a14837;
+  var a14838;
+  var a14839;
+  var a14840;
+  var a14841;
+  var a14842;
+  var a14843;
+  var a14844;
+  var a14845;
+  var a14846;
+  var a14847;
+  var a14848;
+  var a14849;
+  var a14850;
+  var a14851;
+  var a14852;
+  var a14853;
+  var a14854;
+  var a14855;
+  var a14856;
+  var a14857;
+  var a14858;
+  var a14859;
+  var a14860;
+  var a14861;
+  var a14862;
+  var a14863;
+  var a14864;
+  var a14865;
+  var a14866;
+  var a14867;
+  var a14868;
+  var a14869;
+  var a14870;
+  var a14871;
+  var a14872;
+  var a14873;
+  var a14874;
+  var a14875;
+  var a14876;
+  var a14877;
+  var a14878;
+  var a14879;
+  var a14880;
+  var a14881;
+  var a14882;
+  var a14883;
+  var a14884;
+  var a14885;
+  var a14886;
+  var a14887;
+  var a14888;
+  var a14889;
+  var a14890;
+  var a14891;
+  var a14892;
+  var a14893;
+  var a14894;
+  var a14895;
+  var a14896;
+  var a14897;
+  var a14898;
+  var a14899;
+  var a14900;
+  var a14901;
+  var a14902;
+  var a14903;
+  var a14904;
+  var a14905;
+  var a14906;
+  var a14907;
+  var a14908;
+  var a14909;
+  var a14910;
+  var a14911;
+  var a14912;
+  var a14913;
+  var a14914;
+  var a14915;
+  var a14916;
+  var a14917;
+  var a14918;
+  var a14919;
+  var a14920;
+  var a14921;
+  var a14922;
+  var a14923;
+  var a14924;
+  var a14925;
+  var a14926;
+  var a14927;
+  var a14928;
+  var a14929;
+  var a14930;
+  var a14931;
+  var a14932;
+  var a14933;
+  var a14934;
+  var a14935;
+  var a14936;
+  var a14937;
+  var a14938;
+  var a14939;
+  var a14940;
+  var a14941;
+  var a14942;
+  var a14943;
+  var a14944;
+  var a14945;
+  var a14946;
+  var a14947;
+  var a14948;
+  var a14949;
+  var a14950;
+  var a14951;
+  var a14952;
+  var a14953;
+  var a14954;
+  var a14955;
+  var a14956;
+  var a14957;
+  var a14958;
+  var a14959;
+  var a14960;
+  var a14961;
+  var a14962;
+  var a14963;
+  var a14964;
+  var a14965;
+  var a14966;
+  var a14967;
+  var a14968;
+  var a14969;
+  var a14970;
+  var a14971;
+  var a14972;
+  var a14973;
+  var a14974;
+  var a14975;
+  var a14976;
+  var a14977;
+  var a14978;
+  var a14979;
+  var a14980;
+  var a14981;
+  var a14982;
+  var a14983;
+  var a14984;
+  var a14985;
+  var a14986;
+  var a14987;
+  var a14988;
+  var a14989;
+  var a14990;
+  var a14991;
+  var a14992;
+  var a14993;
+  var a14994;
+  var a14995;
+  var a14996;
+  var a14997;
+  var a14998;
+  var a14999;
+  var a15000;
+  var a15001;
+  var a15002;
+  var a15003;
+  var a15004;
+  var a15005;
+  var a15006;
+  var a15007;
+  var a15008;
+  var a15009;
+  var a15010;
+  var a15011;
+  var a15012;
+  var a15013;
+  var a15014;
+  var a15015;
+  var a15016;
+  var a15017;
+  var a15018;
+  var a15019;
+  var a15020;
+  var a15021;
+  var a15022;
+  var a15023;
+  var a15024;
+  var a15025;
+  var a15026;
+  var a15027;
+  var a15028;
+  var a15029;
+  var a15030;
+  var a15031;
+  var a15032;
+  var a15033;
+  var a15034;
+  var a15035;
+  var a15036;
+  var a15037;
+  var a15038;
+  var a15039;
+  var a15040;
+  var a15041;
+  var a15042;
+  var a15043;
+  var a15044;
+  var a15045;
+  var a15046;
+  var a15047;
+  var a15048;
+  var a15049;
+  var a15050;
+  var a15051;
+  var a15052;
+  var a15053;
+  var a15054;
+  var a15055;
+  var a15056;
+  var a15057;
+  var a15058;
+  var a15059;
+  var a15060;
+  var a15061;
+  var a15062;
+  var a15063;
+  var a15064;
+  var a15065;
+  var a15066;
+  var a15067;
+  var a15068;
+  var a15069;
+  var a15070;
+  var a15071;
+  var a15072;
+  var a15073;
+  var a15074;
+  var a15075;
+  var a15076;
+  var a15077;
+  var a15078;
+  var a15079;
+  var a15080;
+  var a15081;
+  var a15082;
+  var a15083;
+  var a15084;
+  var a15085;
+  var a15086;
+  var a15087;
+  var a15088;
+  var a15089;
+  var a15090;
+  var a15091;
+  var a15092;
+  var a15093;
+  var a15094;
+  var a15095;
+  var a15096;
+  var a15097;
+  var a15098;
+  var a15099;
+  var a15100;
+  var a15101;
+  var a15102;
+  var a15103;
+  var a15104;
+  var a15105;
+  var a15106;
+  var a15107;
+  var a15108;
+  var a15109;
+  var a15110;
+  var a15111;
+  var a15112;
+  var a15113;
+  var a15114;
+  var a15115;
+  var a15116;
+  var a15117;
+  var a15118;
+  var a15119;
+  var a15120;
+  var a15121;
+  var a15122;
+  var a15123;
+  var a15124;
+  var a15125;
+  var a15126;
+  var a15127;
+  var a15128;
+  var a15129;
+  var a15130;
+  var a15131;
+  var a15132;
+  var a15133;
+  var a15134;
+  var a15135;
+  var a15136;
+  var a15137;
+  var a15138;
+  var a15139;
+  var a15140;
+  var a15141;
+  var a15142;
+  var a15143;
+  var a15144;
+  var a15145;
+  var a15146;
+  var a15147;
+  var a15148;
+  var a15149;
+  var a15150;
+  var a15151;
+  var a15152;
+  var a15153;
+  var a15154;
+  var a15155;
+  var a15156;
+  var a15157;
+  var a15158;
+  var a15159;
+  var a15160;
+  var a15161;
+  var a15162;
+  var a15163;
+  var a15164;
+  var a15165;
+  var a15166;
+  var a15167;
+  var a15168;
+  var a15169;
+  var a15170;
+  var a15171;
+  var a15172;
+  var a15173;
+  var a15174;
+  var a15175;
+  var a15176;
+  var a15177;
+  var a15178;
+  var a15179;
+  var a15180;
+  var a15181;
+  var a15182;
+  var a15183;
+  var a15184;
+  var a15185;
+  var a15186;
+  var a15187;
+  var a15188;
+  var a15189;
+  var a15190;
+  var a15191;
+  var a15192;
+  var a15193;
+  var a15194;
+  var a15195;
+  var a15196;
+  var a15197;
+  var a15198;
+  var a15199;
+  var a15200;
+  var a15201;
+  var a15202;
+  var a15203;
+  var a15204;
+  var a15205;
+  var a15206;
+  var a15207;
+  var a15208;
+  var a15209;
+  var a15210;
+  var a15211;
+  var a15212;
+  var a15213;
+  var a15214;
+  var a15215;
+  var a15216;
+  var a15217;
+  var a15218;
+  var a15219;
+  var a15220;
+  var a15221;
+  var a15222;
+  var a15223;
+  var a15224;
+  var a15225;
+  var a15226;
+  var a15227;
+  var a15228;
+  var a15229;
+  var a15230;
+  var a15231;
+  var a15232;
+  var a15233;
+  var a15234;
+  var a15235;
+  var a15236;
+  var a15237;
+  var a15238;
+  var a15239;
+  var a15240;
+  var a15241;
+  var a15242;
+  var a15243;
+  var a15244;
+  var a15245;
+  var a15246;
+  var a15247;
+  var a15248;
+  var a15249;
+  var a15250;
+  var a15251;
+  var a15252;
+  var a15253;
+  var a15254;
+  var a15255;
+  var a15256;
+  var a15257;
+  var a15258;
+  var a15259;
+  var a15260;
+  var a15261;
+  var a15262;
+  var a15263;
+  var a15264;
+  var a15265;
+  var a15266;
+  var a15267;
+  var a15268;
+  var a15269;
+  var a15270;
+  var a15271;
+  var a15272;
+  var a15273;
+  var a15274;
+  var a15275;
+  var a15276;
+  var a15277;
+  var a15278;
+  var a15279;
+  var a15280;
+  var a15281;
+  var a15282;
+  var a15283;
+  var a15284;
+  var a15285;
+  var a15286;
+  var a15287;
+  var a15288;
+  var a15289;
+  var a15290;
+  var a15291;
+  var a15292;
+  var a15293;
+  var a15294;
+  var a15295;
+  var a15296;
+  var a15297;
+  var a15298;
+  var a15299;
+  var a15300;
+  var a15301;
+  var a15302;
+  var a15303;
+  var a15304;
+  var a15305;
+  var a15306;
+  var a15307;
+  var a15308;
+  var a15309;
+  var a15310;
+  var a15311;
+  var a15312;
+  var a15313;
+  var a15314;
+  var a15315;
+  var a15316;
+  var a15317;
+  var a15318;
+  var a15319;
+  var a15320;
+  var a15321;
+  var a15322;
+  var a15323;
+  var a15324;
+  var a15325;
+  var a15326;
+  var a15327;
+  var a15328;
+  var a15329;
+  var a15330;
+  var a15331;
+  var a15332;
+  var a15333;
+  var a15334;
+  var a15335;
+  var a15336;
+  var a15337;
+  var a15338;
+  var a15339;
+  var a15340;
+  var a15341;
+  var a15342;
+  var a15343;
+  var a15344;
+  var a15345;
+  var a15346;
+  var a15347;
+  var a15348;
+  var a15349;
+  var a15350;
+  var a15351;
+  var a15352;
+  var a15353;
+  var a15354;
+  var a15355;
+  var a15356;
+  var a15357;
+  var a15358;
+  var a15359;
+  var a15360;
+  var a15361;
+  var a15362;
+  var a15363;
+  var a15364;
+  var a15365;
+  var a15366;
+  var a15367;
+  var a15368;
+  var a15369;
+  var a15370;
+  var a15371;
+  var a15372;
+  var a15373;
+  var a15374;
+  var a15375;
+  var a15376;
+  var a15377;
+  var a15378;
+  var a15379;
+  var a15380;
+  var a15381;
+  var a15382;
+  var a15383;
+  var a15384;
+  var a15385;
+  var a15386;
+  var a15387;
+  var a15388;
+  var a15389;
+  var a15390;
+  var a15391;
+  var a15392;
+  var a15393;
+  var a15394;
+  var a15395;
+  var a15396;
+  var a15397;
+  var a15398;
+  var a15399;
+  var a15400;
+  var a15401;
+  var a15402;
+  var a15403;
+  var a15404;
+  var a15405;
+  var a15406;
+  var a15407;
+  var a15408;
+  var a15409;
+  var a15410;
+  var a15411;
+  var a15412;
+  var a15413;
+  var a15414;
+  var a15415;
+  var a15416;
+  var a15417;
+  var a15418;
+  var a15419;
+  var a15420;
+  var a15421;
+  var a15422;
+  var a15423;
+  var a15424;
+  var a15425;
+  var a15426;
+  var a15427;
+  var a15428;
+  var a15429;
+  var a15430;
+  var a15431;
+  var a15432;
+  var a15433;
+  var a15434;
+  var a15435;
+  var a15436;
+  var a15437;
+  var a15438;
+  var a15439;
+  var a15440;
+  var a15441;
+  var a15442;
+  var a15443;
+  var a15444;
+  var a15445;
+  var a15446;
+  var a15447;
+  var a15448;
+  var a15449;
+  var a15450;
+  var a15451;
+  var a15452;
+  var a15453;
+  var a15454;
+  var a15455;
+  var a15456;
+  var a15457;
+  var a15458;
+  var a15459;
+  var a15460;
+  var a15461;
+  var a15462;
+  var a15463;
+  var a15464;
+  var a15465;
+  var a15466;
+  var a15467;
+  var a15468;
+  var a15469;
+  var a15470;
+  var a15471;
+  var a15472;
+  var a15473;
+  var a15474;
+  var a15475;
+  var a15476;
+  var a15477;
+  var a15478;
+  var a15479;
+  var a15480;
+  var a15481;
+  var a15482;
+  var a15483;
+  var a15484;
+  var a15485;
+  var a15486;
+  var a15487;
+  var a15488;
+  var a15489;
+  var a15490;
+  var a15491;
+  var a15492;
+  var a15493;
+  var a15494;
+  var a15495;
+  var a15496;
+  var a15497;
+  var a15498;
+  var a15499;
+  var a15500;
+  var a15501;
+  var a15502;
+  var a15503;
+  var a15504;
+  var a15505;
+  var a15506;
+  var a15507;
+  var a15508;
+  var a15509;
+  var a15510;
+  var a15511;
+  var a15512;
+  var a15513;
+  var a15514;
+  var a15515;
+  var a15516;
+  var a15517;
+  var a15518;
+  var a15519;
+  var a15520;
+  var a15521;
+  var a15522;
+  var a15523;
+  var a15524;
+  var a15525;
+  var a15526;
+  var a15527;
+  var a15528;
+  var a15529;
+  var a15530;
+  var a15531;
+  var a15532;
+  var a15533;
+  var a15534;
+  var a15535;
+  var a15536;
+  var a15537;
+  var a15538;
+  var a15539;
+  var a15540;
+  var a15541;
+  var a15542;
+  var a15543;
+  var a15544;
+  var a15545;
+  var a15546;
+  var a15547;
+  var a15548;
+  var a15549;
+  var a15550;
+  var a15551;
+  var a15552;
+  var a15553;
+  var a15554;
+  var a15555;
+  var a15556;
+  var a15557;
+  var a15558;
+  var a15559;
+  var a15560;
+  var a15561;
+  var a15562;
+  var a15563;
+  var a15564;
+  var a15565;
+  var a15566;
+  var a15567;
+  var a15568;
+  var a15569;
+  var a15570;
+  var a15571;
+  var a15572;
+  var a15573;
+  var a15574;
+  var a15575;
+  var a15576;
+  var a15577;
+  var a15578;
+  var a15579;
+  var a15580;
+  var a15581;
+  var a15582;
+  var a15583;
+  var a15584;
+  var a15585;
+  var a15586;
+  var a15587;
+  var a15588;
+  var a15589;
+  var a15590;
+  var a15591;
+  var a15592;
+  var a15593;
+  var a15594;
+  var a15595;
+  var a15596;
+  var a15597;
+  var a15598;
+  var a15599;
+  var a15600;
+  var a15601;
+  var a15602;
+  var a15603;
+  var a15604;
+  var a15605;
+  var a15606;
+  var a15607;
+  var a15608;
+  var a15609;
+  var a15610;
+  var a15611;
+  var a15612;
+  var a15613;
+  var a15614;
+  var a15615;
+  var a15616;
+  var a15617;
+  var a15618;
+  var a15619;
+  var a15620;
+  var a15621;
+  var a15622;
+  var a15623;
+  var a15624;
+  var a15625;
+  var a15626;
+  var a15627;
+  var a15628;
+  var a15629;
+  var a15630;
+  var a15631;
+  var a15632;
+  var a15633;
+  var a15634;
+  var a15635;
+  var a15636;
+  var a15637;
+  var a15638;
+  var a15639;
+  var a15640;
+  var a15641;
+  var a15642;
+  var a15643;
+  var a15644;
+  var a15645;
+  var a15646;
+  var a15647;
+  var a15648;
+  var a15649;
+  var a15650;
+  var a15651;
+  var a15652;
+  var a15653;
+  var a15654;
+  var a15655;
+  var a15656;
+  var a15657;
+  var a15658;
+  var a15659;
+  var a15660;
+  var a15661;
+  var a15662;
+  var a15663;
+  var a15664;
+  var a15665;
+  var a15666;
+  var a15667;
+  var a15668;
+  var a15669;
+  var a15670;
+  var a15671;
+  var a15672;
+  var a15673;
+  var a15674;
+  var a15675;
+  var a15676;
+  var a15677;
+  var a15678;
+  var a15679;
+  var a15680;
+  var a15681;
+  var a15682;
+  var a15683;
+  var a15684;
+  var a15685;
+  var a15686;
+  var a15687;
+  var a15688;
+  var a15689;
+  var a15690;
+  var a15691;
+  var a15692;
+  var a15693;
+  var a15694;
+  var a15695;
+  var a15696;
+  var a15697;
+  var a15698;
+  var a15699;
+  var a15700;
+  var a15701;
+  var a15702;
+  var a15703;
+  var a15704;
+  var a15705;
+  var a15706;
+  var a15707;
+  var a15708;
+  var a15709;
+  var a15710;
+  var a15711;
+  var a15712;
+  var a15713;
+  var a15714;
+  var a15715;
+  var a15716;
+  var a15717;
+  var a15718;
+  var a15719;
+  var a15720;
+  var a15721;
+  var a15722;
+  var a15723;
+  var a15724;
+  var a15725;
+  var a15726;
+  var a15727;
+  var a15728;
+  var a15729;
+  var a15730;
+  var a15731;
+  var a15732;
+  var a15733;
+  var a15734;
+  var a15735;
+  var a15736;
+  var a15737;
+  var a15738;
+  var a15739;
+  var a15740;
+  var a15741;
+  var a15742;
+  var a15743;
+  var a15744;
+  var a15745;
+  var a15746;
+  var a15747;
+  var a15748;
+  var a15749;
+  var a15750;
+  var a15751;
+  var a15752;
+  var a15753;
+  var a15754;
+  var a15755;
+  var a15756;
+  var a15757;
+  var a15758;
+  var a15759;
+  var a15760;
+  var a15761;
+  var a15762;
+  var a15763;
+  var a15764;
+  var a15765;
+  var a15766;
+  var a15767;
+  var a15768;
+  var a15769;
+  var a15770;
+  var a15771;
+  var a15772;
+  var a15773;
+  var a15774;
+  var a15775;
+  var a15776;
+  var a15777;
+  var a15778;
+  var a15779;
+  var a15780;
+  var a15781;
+  var a15782;
+  var a15783;
+  var a15784;
+  var a15785;
+  var a15786;
+  var a15787;
+  var a15788;
+  var a15789;
+  var a15790;
+  var a15791;
+  var a15792;
+  var a15793;
+  var a15794;
+  var a15795;
+  var a15796;
+  var a15797;
+  var a15798;
+  var a15799;
+  var a15800;
+  var a15801;
+  var a15802;
+  var a15803;
+  var a15804;
+  var a15805;
+  var a15806;
+  var a15807;
+  var a15808;
+  var a15809;
+  var a15810;
+  var a15811;
+  var a15812;
+  var a15813;
+  var a15814;
+  var a15815;
+  var a15816;
+  var a15817;
+  var a15818;
+  var a15819;
+  var a15820;
+  var a15821;
+  var a15822;
+  var a15823;
+  var a15824;
+  var a15825;
+  var a15826;
+  var a15827;
+  var a15828;
+  var a15829;
+  var a15830;
+  var a15831;
+  var a15832;
+  var a15833;
+  var a15834;
+  var a15835;
+  var a15836;
+  var a15837;
+  var a15838;
+  var a15839;
+  var a15840;
+  var a15841;
+  var a15842;
+  var a15843;
+  var a15844;
+  var a15845;
+  var a15846;
+  var a15847;
+  var a15848;
+  var a15849;
+  var a15850;
+  var a15851;
+  var a15852;
+  var a15853;
+  var a15854;
+  var a15855;
+  var a15856;
+  var a15857;
+  var a15858;
+  var a15859;
+  var a15860;
+  var a15861;
+  var a15862;
+  var a15863;
+  var a15864;
+  var a15865;
+  var a15866;
+  var a15867;
+  var a15868;
+  var a15869;
+  var a15870;
+  var a15871;
+  var a15872;
+  var a15873;
+  var a15874;
+  var a15875;
+  var a15876;
+  var a15877;
+  var a15878;
+  var a15879;
+  var a15880;
+  var a15881;
+  var a15882;
+  var a15883;
+  var a15884;
+  var a15885;
+  var a15886;
+  var a15887;
+  var a15888;
+  var a15889;
+  var a15890;
+  var a15891;
+  var a15892;
+  var a15893;
+  var a15894;
+  var a15895;
+  var a15896;
+  var a15897;
+  var a15898;
+  var a15899;
+  var a15900;
+  var a15901;
+  var a15902;
+  var a15903;
+  var a15904;
+  var a15905;
+  var a15906;
+  var a15907;
+  var a15908;
+  var a15909;
+  var a15910;
+  var a15911;
+  var a15912;
+  var a15913;
+  var a15914;
+  var a15915;
+  var a15916;
+  var a15917;
+  var a15918;
+  var a15919;
+  var a15920;
+  var a15921;
+  var a15922;
+  var a15923;
+  var a15924;
+  var a15925;
+  var a15926;
+  var a15927;
+  var a15928;
+  var a15929;
+  var a15930;
+  var a15931;
+  var a15932;
+  var a15933;
+  var a15934;
+  var a15935;
+  var a15936;
+  var a15937;
+  var a15938;
+  var a15939;
+  var a15940;
+  var a15941;
+  var a15942;
+  var a15943;
+  var a15944;
+  var a15945;
+  var a15946;
+  var a15947;
+  var a15948;
+  var a15949;
+  var a15950;
+  var a15951;
+  var a15952;
+  var a15953;
+  var a15954;
+  var a15955;
+  var a15956;
+  var a15957;
+  var a15958;
+  var a15959;
+  var a15960;
+  var a15961;
+  var a15962;
+  var a15963;
+  var a15964;
+  var a15965;
+  var a15966;
+  var a15967;
+  var a15968;
+  var a15969;
+  var a15970;
+  var a15971;
+  var a15972;
+  var a15973;
+  var a15974;
+  var a15975;
+  var a15976;
+  var a15977;
+  var a15978;
+  var a15979;
+  var a15980;
+  var a15981;
+  var a15982;
+  var a15983;
+  var a15984;
+  var a15985;
+  var a15986;
+  var a15987;
+  var a15988;
+  var a15989;
+  var a15990;
+  var a15991;
+  var a15992;
+  var a15993;
+  var a15994;
+  var a15995;
+  var a15996;
+  var a15997;
+  var a15998;
+  var a15999;
+  var a16000;
+  var a16001;
+  var a16002;
+  var a16003;
+  var a16004;
+  var a16005;
+  var a16006;
+  var a16007;
+  var a16008;
+  var a16009;
+  var a16010;
+  var a16011;
+  var a16012;
+  var a16013;
+  var a16014;
+  var a16015;
+  var a16016;
+  var a16017;
+  var a16018;
+  var a16019;
+  var a16020;
+  var a16021;
+  var a16022;
+  var a16023;
+  var a16024;
+  var a16025;
+  var a16026;
+  var a16027;
+  var a16028;
+  var a16029;
+  var a16030;
+  var a16031;
+  var a16032;
+  var a16033;
+  var a16034;
+  var a16035;
+  var a16036;
+  var a16037;
+  var a16038;
+  var a16039;
+  var a16040;
+  var a16041;
+  var a16042;
+  var a16043;
+  var a16044;
+  var a16045;
+  var a16046;
+  var a16047;
+  var a16048;
+  var a16049;
+  var a16050;
+  var a16051;
+  var a16052;
+  var a16053;
+  var a16054;
+  var a16055;
+  var a16056;
+  var a16057;
+  var a16058;
+  var a16059;
+  var a16060;
+  var a16061;
+  var a16062;
+  var a16063;
+  var a16064;
+  var a16065;
+  var a16066;
+  var a16067;
+  var a16068;
+  var a16069;
+  var a16070;
+  var a16071;
+  var a16072;
+  var a16073;
+  var a16074;
+  var a16075;
+  var a16076;
+  var a16077;
+  var a16078;
+  var a16079;
+  var a16080;
+  var a16081;
+  var a16082;
+  var a16083;
+  var a16084;
+  var a16085;
+  var a16086;
+  var a16087;
+  var a16088;
+  var a16089;
+  var a16090;
+  var a16091;
+  var a16092;
+  var a16093;
+  var a16094;
+  var a16095;
+  var a16096;
+  var a16097;
+  var a16098;
+  var a16099;
+  var a16100;
+  var a16101;
+  var a16102;
+  var a16103;
+  var a16104;
+  var a16105;
+  var a16106;
+  var a16107;
+  var a16108;
+  var a16109;
+  var a16110;
+  var a16111;
+  var a16112;
+  var a16113;
+  var a16114;
+  var a16115;
+  var a16116;
+  var a16117;
+  var a16118;
+  var a16119;
+  var a16120;
+  var a16121;
+  var a16122;
+  var a16123;
+  var a16124;
+  var a16125;
+  var a16126;
+  var a16127;
+  var a16128;
+  var a16129;
+  var a16130;
+  var a16131;
+  var a16132;
+  var a16133;
+  var a16134;
+  var a16135;
+  var a16136;
+  var a16137;
+  var a16138;
+  var a16139;
+  var a16140;
+  var a16141;
+  var a16142;
+  var a16143;
+  var a16144;
+  var a16145;
+  var a16146;
+  var a16147;
+  var a16148;
+  var a16149;
+  var a16150;
+  var a16151;
+  var a16152;
+  var a16153;
+  var a16154;
+  var a16155;
+  var a16156;
+  var a16157;
+  var a16158;
+  var a16159;
+  var a16160;
+  var a16161;
+  var a16162;
+  var a16163;
+  var a16164;
+  var a16165;
+  var a16166;
+  var a16167;
+  var a16168;
+  var a16169;
+  var a16170;
+  var a16171;
+  var a16172;
+  var a16173;
+  var a16174;
+  var a16175;
+  var a16176;
+  var a16177;
+  var a16178;
+  var a16179;
+  var a16180;
+  var a16181;
+  var a16182;
+  var a16183;
+  var a16184;
+  var a16185;
+  var a16186;
+  var a16187;
+  var a16188;
+  var a16189;
+  var a16190;
+  var a16191;
+  var a16192;
+  var a16193;
+  var a16194;
+  var a16195;
+  var a16196;
+  var a16197;
+  var a16198;
+  var a16199;
+  var a16200;
+  var a16201;
+  var a16202;
+  var a16203;
+  var a16204;
+  var a16205;
+  var a16206;
+  var a16207;
+  var a16208;
+  var a16209;
+  var a16210;
+  var a16211;
+  var a16212;
+  var a16213;
+  var a16214;
+  var a16215;
+  var a16216;
+  var a16217;
+  var a16218;
+  var a16219;
+  var a16220;
+  var a16221;
+  var a16222;
+  var a16223;
+  var a16224;
+  var a16225;
+  var a16226;
+  var a16227;
+  var a16228;
+  var a16229;
+  var a16230;
+  var a16231;
+  var a16232;
+  var a16233;
+  var a16234;
+  var a16235;
+  var a16236;
+  var a16237;
+  var a16238;
+  var a16239;
+  var a16240;
+  var a16241;
+  var a16242;
+  var a16243;
+  var a16244;
+  var a16245;
+  var a16246;
+  var a16247;
+  var a16248;
+  var a16249;
+  var a16250;
+  var a16251;
+  var a16252;
+  var a16253;
+  var a16254;
+  var a16255;
+  var a16256;
+  var a16257;
+  var a16258;
+  var a16259;
+  var a16260;
+  var a16261;
+  var a16262;
+  var a16263;
+  var a16264;
+  var a16265;
+  var a16266;
+  var a16267;
+  var a16268;
+  var a16269;
+  var a16270;
+  var a16271;
+  var a16272;
+  var a16273;
+  var a16274;
+  var a16275;
+  var a16276;
+  var a16277;
+  var a16278;
+  var a16279;
+  var a16280;
+  var a16281;
+  var a16282;
+  var a16283;
+  var a16284;
+  var a16285;
+  var a16286;
+  var a16287;
+  var a16288;
+  var a16289;
+  var a16290;
+  var a16291;
+  var a16292;
+  var a16293;
+  var a16294;
+  var a16295;
+  var a16296;
+  var a16297;
+  var a16298;
+  var a16299;
+  var a16300;
+  var a16301;
+  var a16302;
+  var a16303;
+  var a16304;
+  var a16305;
+  var a16306;
+  var a16307;
+  var a16308;
+  var a16309;
+  var a16310;
+  var a16311;
+  var a16312;
+  var a16313;
+  var a16314;
+  var a16315;
+  var a16316;
+  var a16317;
+  var a16318;
+  var a16319;
+  var a16320;
+  var a16321;
+  var a16322;
+  var a16323;
+  var a16324;
+  var a16325;
+  var a16326;
+  var a16327;
+  var a16328;
+  var a16329;
+  var a16330;
+  var a16331;
+  var a16332;
+  var a16333;
+  var a16334;
+  var a16335;
+  var a16336;
+  var a16337;
+  var a16338;
+  var a16339;
+  var a16340;
+  var a16341;
+  var a16342;
+  var a16343;
+  var a16344;
+  var a16345;
+  var a16346;
+  var a16347;
+  var a16348;
+  var a16349;
+  var a16350;
+  var a16351;
+  var a16352;
+  var a16353;
+  var a16354;
+  var a16355;
+  var a16356;
+  var a16357;
+  var a16358;
+  var a16359;
+  var a16360;
+  var a16361;
+  var a16362;
+  var a16363;
+  var a16364;
+  var a16365;
+  var a16366;
+  var a16367;
+  var a16368;
+  var a16369;
+  var a16370;
+  var a16371;
+  var a16372;
+  var a16373;
+  var a16374;
+  var a16375;
+  var a16376;
+  var a16377;
+  var a16378;
+  var a16379;
+  var a16380;
+  var a16381;
+  var a16382;
+  var a16383;
+  var a16384;
+  var a16385;
+  var a16386;
+  var a16387;
+  var a16388;
+  var a16389;
+  var a16390;
+  var a16391;
+  var a16392;
+  var a16393;
+  var a16394;
+  var a16395;
+  var a16396;
+  var a16397;
+  var a16398;
+  var a16399;
+  var a16400;
+  var a16401;
+  var a16402;
+  var a16403;
+  var a16404;
+  var a16405;
+  var a16406;
+  var a16407;
+  var a16408;
+  var a16409;
+  var a16410;
+  var a16411;
+  var a16412;
+  var a16413;
+  var a16414;
+  var a16415;
+  var a16416;
+  var a16417;
+  var a16418;
+  var a16419;
+  var a16420;
+  var a16421;
+  var a16422;
+  var a16423;
+  var a16424;
+  var a16425;
+  var a16426;
+  var a16427;
+  var a16428;
+  var a16429;
+  var a16430;
+  var a16431;
+  var a16432;
+  var a16433;
+  var a16434;
+  var a16435;
+  var a16436;
+  var a16437;
+  var a16438;
+  var a16439;
+  var a16440;
+  var a16441;
+  var a16442;
+  var a16443;
+  var a16444;
+  var a16445;
+  var a16446;
+  var a16447;
+  var a16448;
+  var a16449;
+  var a16450;
+  var a16451;
+  var a16452;
+  var a16453;
+  var a16454;
+  var a16455;
+  var a16456;
+  var a16457;
+  var a16458;
+  var a16459;
+  var a16460;
+  var a16461;
+  var a16462;
+  var a16463;
+  var a16464;
+  var a16465;
+  var a16466;
+  var a16467;
+  var a16468;
+  var a16469;
+  var a16470;
+  var a16471;
+  var a16472;
+  var a16473;
+  var a16474;
+  var a16475;
+  var a16476;
+  var a16477;
+  var a16478;
+  var a16479;
+  var a16480;
+  var a16481;
+  var a16482;
+  var a16483;
+  var a16484;
+  var a16485;
+  var a16486;
+  var a16487;
+  var a16488;
+  var a16489;
+  var a16490;
+  var a16491;
+  var a16492;
+  var a16493;
+  var a16494;
+  var a16495;
+  var a16496;
+  var a16497;
+  var a16498;
+  var a16499;
+  var a16500;
+  var a16501;
+  var a16502;
+  var a16503;
+  var a16504;
+  var a16505;
+  var a16506;
+  var a16507;
+  var a16508;
+  var a16509;
+  var a16510;
+  var a16511;
+  var a16512;
+  var a16513;
+  var a16514;
+  var a16515;
+  var a16516;
+  var a16517;
+  var a16518;
+  var a16519;
+  var a16520;
+  var a16521;
+  var a16522;
+  var a16523;
+  var a16524;
+  var a16525;
+  var a16526;
+  var a16527;
+  var a16528;
+  var a16529;
+  var a16530;
+  var a16531;
+  var a16532;
+  var a16533;
+  var a16534;
+  var a16535;
+  var a16536;
+  var a16537;
+  var a16538;
+  var a16539;
+  var a16540;
+  var a16541;
+  var a16542;
+  var a16543;
+  var a16544;
+  var a16545;
+  var a16546;
+  var a16547;
+  var a16548;
+  var a16549;
+  var a16550;
+  var a16551;
+  var a16552;
+  var a16553;
+  var a16554;
+  var a16555;
+  var a16556;
+  var a16557;
+  var a16558;
+  var a16559;
+  var a16560;
+  var a16561;
+  var a16562;
+  var a16563;
+  var a16564;
+  var a16565;
+  var a16566;
+  var a16567;
+  var a16568;
+  var a16569;
+  var a16570;
+  var a16571;
+  var a16572;
+  var a16573;
+  var a16574;
+  var a16575;
+  var a16576;
+  var a16577;
+  var a16578;
+  var a16579;
+  var a16580;
+  var a16581;
+  var a16582;
+  var a16583;
+  var a16584;
+  var a16585;
+  var a16586;
+  var a16587;
+  var a16588;
+  var a16589;
+  var a16590;
+  var a16591;
+  var a16592;
+  var a16593;
+  var a16594;
+  var a16595;
+  var a16596;
+  var a16597;
+  var a16598;
+  var a16599;
+  var a16600;
+  var a16601;
+  var a16602;
+  var a16603;
+  var a16604;
+  var a16605;
+  var a16606;
+  var a16607;
+  var a16608;
+  var a16609;
+  var a16610;
+  var a16611;
+  var a16612;
+  var a16613;
+  var a16614;
+  var a16615;
+  var a16616;
+  var a16617;
+  var a16618;
+  var a16619;
+  var a16620;
+  var a16621;
+  var a16622;
+  var a16623;
+  var a16624;
+  var a16625;
+  var a16626;
+  var a16627;
+  var a16628;
+  var a16629;
+  var a16630;
+  var a16631;
+  var a16632;
+  var a16633;
+  var a16634;
+  var a16635;
+  var a16636;
+  var a16637;
+  var a16638;
+  var a16639;
+  var a16640;
+  var a16641;
+  var a16642;
+  var a16643;
+  var a16644;
+  var a16645;
+  var a16646;
+  var a16647;
+  var a16648;
+  var a16649;
+  var a16650;
+  var a16651;
+  var a16652;
+  var a16653;
+  var a16654;
+  var a16655;
+  var a16656;
+  var a16657;
+  var a16658;
+  var a16659;
+  var a16660;
+  var a16661;
+  var a16662;
+  var a16663;
+  var a16664;
+  var a16665;
+  var a16666;
+  var a16667;
+  var a16668;
+  var a16669;
+  var a16670;
+  var a16671;
+  var a16672;
+  var a16673;
+  var a16674;
+  var a16675;
+  var a16676;
+  var a16677;
+  var a16678;
+  var a16679;
+  var a16680;
+  var a16681;
+  var a16682;
+  var a16683;
+  var a16684;
+  var a16685;
+  var a16686;
+  var a16687;
+  var a16688;
+  var a16689;
+  var a16690;
+  var a16691;
+  var a16692;
+  var a16693;
+  var a16694;
+  var a16695;
+  var a16696;
+  var a16697;
+  var a16698;
+  var a16699;
+  var a16700;
+  var a16701;
+  var a16702;
+  var a16703;
+  var a16704;
+  var a16705;
+  var a16706;
+  var a16707;
+  var a16708;
+  var a16709;
+  var a16710;
+  var a16711;
+  var a16712;
+  var a16713;
+  var a16714;
+  var a16715;
+  var a16716;
+  var a16717;
+  var a16718;
+  var a16719;
+  var a16720;
+  var a16721;
+  var a16722;
+  var a16723;
+  var a16724;
+  var a16725;
+  var a16726;
+  var a16727;
+  var a16728;
+  var a16729;
+  var a16730;
+  var a16731;
+  var a16732;
+  var a16733;
+  var a16734;
+  var a16735;
+  var a16736;
+  var a16737;
+  var a16738;
+  var a16739;
+  var a16740;
+  var a16741;
+  var a16742;
+  var a16743;
+  var a16744;
+  var a16745;
+  var a16746;
+  var a16747;
+  var a16748;
+  var a16749;
+  var a16750;
+  var a16751;
+  var a16752;
+  var a16753;
+  var a16754;
+  var a16755;
+  var a16756;
+  var a16757;
+  var a16758;
+  var a16759;
+  var a16760;
+  var a16761;
+  var a16762;
+  var a16763;
+  var a16764;
+  var a16765;
+  var a16766;
+  var a16767;
+  var a16768;
+  var a16769;
+  var a16770;
+  var a16771;
+  var a16772;
+  var a16773;
+  var a16774;
+  var a16775;
+  var a16776;
+  var a16777;
+  var a16778;
+  var a16779;
+  var a16780;
+  var a16781;
+  var a16782;
+  var a16783;
+  var a16784;
+  var a16785;
+  var a16786;
+  var a16787;
+  var a16788;
+  var a16789;
+  var a16790;
+  var a16791;
+  var a16792;
+  var a16793;
+  var a16794;
+  var a16795;
+  var a16796;
+  var a16797;
+  var a16798;
+  var a16799;
+  var a16800;
+  var a16801;
+  var a16802;
+  var a16803;
+  var a16804;
+  var a16805;
+  var a16806;
+  var a16807;
+  var a16808;
+  var a16809;
+  var a16810;
+  var a16811;
+  var a16812;
+  var a16813;
+  var a16814;
+  var a16815;
+  var a16816;
+  var a16817;
+  var a16818;
+  var a16819;
+  var a16820;
+  var a16821;
+  var a16822;
+  var a16823;
+  var a16824;
+  var a16825;
+  var a16826;
+  var a16827;
+  var a16828;
+  var a16829;
+  var a16830;
+  var a16831;
+  var a16832;
+  var a16833;
+  var a16834;
+  var a16835;
+  var a16836;
+  var a16837;
+  var a16838;
+  var a16839;
+  var a16840;
+  var a16841;
+  var a16842;
+  var a16843;
+  var a16844;
+  var a16845;
+  var a16846;
+  var a16847;
+  var a16848;
+  var a16849;
+  var a16850;
+  var a16851;
+  var a16852;
+  var a16853;
+  var a16854;
+  var a16855;
+  var a16856;
+  var a16857;
+  var a16858;
+  var a16859;
+  var a16860;
+  var a16861;
+  var a16862;
+  var a16863;
+  var a16864;
+  var a16865;
+  var a16866;
+  var a16867;
+  var a16868;
+  var a16869;
+  var a16870;
+  var a16871;
+  var a16872;
+  var a16873;
+  var a16874;
+  var a16875;
+  var a16876;
+  var a16877;
+  var a16878;
+  var a16879;
+  var a16880;
+  var a16881;
+  var a16882;
+  var a16883;
+  var a16884;
+  var a16885;
+  var a16886;
+  var a16887;
+  var a16888;
+  var a16889;
+  var a16890;
+  var a16891;
+  var a16892;
+  var a16893;
+  var a16894;
+  var a16895;
+  var a16896;
+  var a16897;
+  var a16898;
+  var a16899;
+  var a16900;
+  var a16901;
+  var a16902;
+  var a16903;
+  var a16904;
+  var a16905;
+  var a16906;
+  var a16907;
+  var a16908;
+  var a16909;
+  var a16910;
+  var a16911;
+  var a16912;
+  var a16913;
+  var a16914;
+  var a16915;
+  var a16916;
+  var a16917;
+  var a16918;
+  var a16919;
+  var a16920;
+  var a16921;
+  var a16922;
+  var a16923;
+  var a16924;
+  var a16925;
+  var a16926;
+  var a16927;
+  var a16928;
+  var a16929;
+  var a16930;
+  var a16931;
+  var a16932;
+  var a16933;
+  var a16934;
+  var a16935;
+  var a16936;
+  var a16937;
+  var a16938;
+  var a16939;
+  var a16940;
+  var a16941;
+  var a16942;
+  var a16943;
+  var a16944;
+  var a16945;
+  var a16946;
+  var a16947;
+  var a16948;
+  var a16949;
+  var a16950;
+  var a16951;
+  var a16952;
+  var a16953;
+  var a16954;
+  var a16955;
+  var a16956;
+  var a16957;
+  var a16958;
+  var a16959;
+  var a16960;
+  var a16961;
+  var a16962;
+  var a16963;
+  var a16964;
+  var a16965;
+  var a16966;
+  var a16967;
+  var a16968;
+  var a16969;
+  var a16970;
+  var a16971;
+  var a16972;
+  var a16973;
+  var a16974;
+  var a16975;
+  var a16976;
+  var a16977;
+  var a16978;
+  var a16979;
+  var a16980;
+  var a16981;
+  var a16982;
+  var a16983;
+  var a16984;
+  var a16985;
+  var a16986;
+  var a16987;
+  var a16988;
+  var a16989;
+  var a16990;
+  var a16991;
+  var a16992;
+  var a16993;
+  var a16994;
+  var a16995;
+  var a16996;
+  var a16997;
+  var a16998;
+  var a16999;
+  var a17000;
+  var a17001;
+  var a17002;
+  var a17003;
+  var a17004;
+  var a17005;
+  var a17006;
+  var a17007;
+  var a17008;
+  var a17009;
+  var a17010;
+  var a17011;
+  var a17012;
+  var a17013;
+  var a17014;
+  var a17015;
+  var a17016;
+  var a17017;
+  var a17018;
+  var a17019;
+  var a17020;
+  var a17021;
+  var a17022;
+  var a17023;
+  var a17024;
+  var a17025;
+  var a17026;
+  var a17027;
+  var a17028;
+  var a17029;
+  var a17030;
+  var a17031;
+  var a17032;
+  var a17033;
+  var a17034;
+  var a17035;
+  var a17036;
+  var a17037;
+  var a17038;
+  var a17039;
+  var a17040;
+  var a17041;
+  var a17042;
+  var a17043;
+  var a17044;
+  var a17045;
+  var a17046;
+  var a17047;
+  var a17048;
+  var a17049;
+  var a17050;
+  var a17051;
+  var a17052;
+  var a17053;
+  var a17054;
+  var a17055;
+  var a17056;
+  var a17057;
+  var a17058;
+  var a17059;
+  var a17060;
+  var a17061;
+  var a17062;
+  var a17063;
+  var a17064;
+  var a17065;
+  var a17066;
+  var a17067;
+  var a17068;
+  var a17069;
+  var a17070;
+  var a17071;
+  var a17072;
+  var a17073;
+  var a17074;
+  var a17075;
+  var a17076;
+  var a17077;
+  var a17078;
+  var a17079;
+  var a17080;
+  var a17081;
+  var a17082;
+  var a17083;
+  var a17084;
+  var a17085;
+  var a17086;
+  var a17087;
+  var a17088;
+  var a17089;
+  var a17090;
+  var a17091;
+  var a17092;
+  var a17093;
+  var a17094;
+  var a17095;
+  var a17096;
+  var a17097;
+  var a17098;
+  var a17099;
+  var a17100;
+  var a17101;
+  var a17102;
+  var a17103;
+  var a17104;
+  var a17105;
+  var a17106;
+  var a17107;
+  var a17108;
+  var a17109;
+  var a17110;
+  var a17111;
+  var a17112;
+  var a17113;
+  var a17114;
+  var a17115;
+  var a17116;
+  var a17117;
+  var a17118;
+  var a17119;
+  var a17120;
+  var a17121;
+  var a17122;
+  var a17123;
+  var a17124;
+  var a17125;
+  var a17126;
+  var a17127;
+  var a17128;
+  var a17129;
+  var a17130;
+  var a17131;
+  var a17132;
+  var a17133;
+  var a17134;
+  var a17135;
+  var a17136;
+  var a17137;
+  var a17138;
+  var a17139;
+  var a17140;
+  var a17141;
+  var a17142;
+  var a17143;
+  var a17144;
+  var a17145;
+  var a17146;
+  var a17147;
+  var a17148;
+  var a17149;
+  var a17150;
+  var a17151;
+  var a17152;
+  var a17153;
+  var a17154;
+  var a17155;
+  var a17156;
+  var a17157;
+  var a17158;
+  var a17159;
+  var a17160;
+  var a17161;
+  var a17162;
+  var a17163;
+  var a17164;
+  var a17165;
+  var a17166;
+  var a17167;
+  var a17168;
+  var a17169;
+  var a17170;
+  var a17171;
+  var a17172;
+  var a17173;
+  var a17174;
+  var a17175;
+  var a17176;
+  var a17177;
+  var a17178;
+  var a17179;
+  var a17180;
+  var a17181;
+  var a17182;
+  var a17183;
+  var a17184;
+  var a17185;
+  var a17186;
+  var a17187;
+  var a17188;
+  var a17189;
+  var a17190;
+  var a17191;
+  var a17192;
+  var a17193;
+  var a17194;
+  var a17195;
+  var a17196;
+  var a17197;
+  var a17198;
+  var a17199;
+  var a17200;
+  var a17201;
+  var a17202;
+  var a17203;
+  var a17204;
+  var a17205;
+  var a17206;
+  var a17207;
+  var a17208;
+  var a17209;
+  var a17210;
+  var a17211;
+  var a17212;
+  var a17213;
+  var a17214;
+  var a17215;
+  var a17216;
+  var a17217;
+  var a17218;
+  var a17219;
+  var a17220;
+  var a17221;
+  var a17222;
+  var a17223;
+  var a17224;
+  var a17225;
+  var a17226;
+  var a17227;
+  var a17228;
+  var a17229;
+  var a17230;
+  var a17231;
+  var a17232;
+  var a17233;
+  var a17234;
+  var a17235;
+  var a17236;
+  var a17237;
+  var a17238;
+  var a17239;
+  var a17240;
+  var a17241;
+  var a17242;
+  var a17243;
+  var a17244;
+  var a17245;
+  var a17246;
+  var a17247;
+  var a17248;
+  var a17249;
+  var a17250;
+  var a17251;
+  var a17252;
+  var a17253;
+  var a17254;
+  var a17255;
+  var a17256;
+  var a17257;
+  var a17258;
+  var a17259;
+  var a17260;
+  var a17261;
+  var a17262;
+  var a17263;
+  var a17264;
+  var a17265;
+  var a17266;
+  var a17267;
+  var a17268;
+  var a17269;
+  var a17270;
+  var a17271;
+  var a17272;
+  var a17273;
+  var a17274;
+  var a17275;
+  var a17276;
+  var a17277;
+  var a17278;
+  var a17279;
+  var a17280;
+  var a17281;
+  var a17282;
+  var a17283;
+  var a17284;
+  var a17285;
+  var a17286;
+  var a17287;
+  var a17288;
+  var a17289;
+  var a17290;
+  var a17291;
+  var a17292;
+  var a17293;
+  var a17294;
+  var a17295;
+  var a17296;
+  var a17297;
+  var a17298;
+  var a17299;
+  var a17300;
+  var a17301;
+  var a17302;
+  var a17303;
+  var a17304;
+  var a17305;
+  var a17306;
+  var a17307;
+  var a17308;
+  var a17309;
+  var a17310;
+  var a17311;
+  var a17312;
+  var a17313;
+  var a17314;
+  var a17315;
+  var a17316;
+  var a17317;
+  var a17318;
+  var a17319;
+  var a17320;
+  var a17321;
+  var a17322;
+  var a17323;
+  var a17324;
+  var a17325;
+  var a17326;
+  var a17327;
+  var a17328;
+  var a17329;
+  var a17330;
+  var a17331;
+  var a17332;
+  var a17333;
+  var a17334;
+  var a17335;
+  var a17336;
+  var a17337;
+  var a17338;
+  var a17339;
+  var a17340;
+  var a17341;
+  var a17342;
+  var a17343;
+  var a17344;
+  var a17345;
+  var a17346;
+  var a17347;
+  var a17348;
+  var a17349;
+  var a17350;
+  var a17351;
+  var a17352;
+  var a17353;
+  var a17354;
+  var a17355;
+  var a17356;
+  var a17357;
+  var a17358;
+  var a17359;
+  var a17360;
+  var a17361;
+  var a17362;
+  var a17363;
+  var a17364;
+  var a17365;
+  var a17366;
+  var a17367;
+  var a17368;
+  var a17369;
+  var a17370;
+  var a17371;
+  var a17372;
+  var a17373;
+  var a17374;
+  var a17375;
+  var a17376;
+  var a17377;
+  var a17378;
+  var a17379;
+  var a17380;
+  var a17381;
+  var a17382;
+  var a17383;
+  var a17384;
+  var a17385;
+  var a17386;
+  var a17387;
+  var a17388;
+  var a17389;
+  var a17390;
+  var a17391;
+  var a17392;
+  var a17393;
+  var a17394;
+  var a17395;
+  var a17396;
+  var a17397;
+  var a17398;
+  var a17399;
+  var a17400;
+  var a17401;
+  var a17402;
+  var a17403;
+  var a17404;
+  var a17405;
+  var a17406;
+  var a17407;
+  var a17408;
+  var a17409;
+  var a17410;
+  var a17411;
+  var a17412;
+  var a17413;
+  var a17414;
+  var a17415;
+  var a17416;
+  var a17417;
+  var a17418;
+  var a17419;
+  var a17420;
+  var a17421;
+  var a17422;
+  var a17423;
+  var a17424;
+  var a17425;
+  var a17426;
+  var a17427;
+  var a17428;
+  var a17429;
+  var a17430;
+  var a17431;
+  var a17432;
+  var a17433;
+  var a17434;
+  var a17435;
+  var a17436;
+  var a17437;
+  var a17438;
+  var a17439;
+  var a17440;
+  var a17441;
+  var a17442;
+  var a17443;
+  var a17444;
+  var a17445;
+  var a17446;
+  var a17447;
+  var a17448;
+  var a17449;
+  var a17450;
+  var a17451;
+  var a17452;
+  var a17453;
+  var a17454;
+  var a17455;
+  var a17456;
+  var a17457;
+  var a17458;
+  var a17459;
+  var a17460;
+  var a17461;
+  var a17462;
+  var a17463;
+  var a17464;
+  var a17465;
+  var a17466;
+  var a17467;
+  var a17468;
+  var a17469;
+  var a17470;
+  var a17471;
+  var a17472;
+  var a17473;
+  var a17474;
+  var a17475;
+  var a17476;
+  var a17477;
+  var a17478;
+  var a17479;
+  var a17480;
+  var a17481;
+  var a17482;
+  var a17483;
+  var a17484;
+  var a17485;
+  var a17486;
+  var a17487;
+  var a17488;
+  var a17489;
+  var a17490;
+  var a17491;
+  var a17492;
+  var a17493;
+  var a17494;
+  var a17495;
+  var a17496;
+  var a17497;
+  var a17498;
+  var a17499;
+  var a17500;
+  var a17501;
+  var a17502;
+  var a17503;
+  var a17504;
+  var a17505;
+  var a17506;
+  var a17507;
+  var a17508;
+  var a17509;
+  var a17510;
+  var a17511;
+  var a17512;
+  var a17513;
+  var a17514;
+  var a17515;
+  var a17516;
+  var a17517;
+  var a17518;
+  var a17519;
+  var a17520;
+  var a17521;
+  var a17522;
+  var a17523;
+  var a17524;
+  var a17525;
+  var a17526;
+  var a17527;
+  var a17528;
+  var a17529;
+  var a17530;
+  var a17531;
+  var a17532;
+  var a17533;
+  var a17534;
+  var a17535;
+  var a17536;
+  var a17537;
+  var a17538;
+  var a17539;
+  var a17540;
+  var a17541;
+  var a17542;
+  var a17543;
+  var a17544;
+  var a17545;
+  var a17546;
+  var a17547;
+  var a17548;
+  var a17549;
+  var a17550;
+  var a17551;
+  var a17552;
+  var a17553;
+  var a17554;
+  var a17555;
+  var a17556;
+  var a17557;
+  var a17558;
+  var a17559;
+  var a17560;
+  var a17561;
+  var a17562;
+  var a17563;
+  var a17564;
+  var a17565;
+  var a17566;
+  var a17567;
+  var a17568;
+  var a17569;
+  var a17570;
+  var a17571;
+  var a17572;
+  var a17573;
+  var a17574;
+  var a17575;
+  var a17576;
+  var a17577;
+  var a17578;
+  var a17579;
+  var a17580;
+  var a17581;
+  var a17582;
+  var a17583;
+  var a17584;
+  var a17585;
+  var a17586;
+  var a17587;
+  var a17588;
+  var a17589;
+  var a17590;
+  var a17591;
+  var a17592;
+  var a17593;
+  var a17594;
+  var a17595;
+  var a17596;
+  var a17597;
+  var a17598;
+  var a17599;
+  var a17600;
+  var a17601;
+  var a17602;
+  var a17603;
+  var a17604;
+  var a17605;
+  var a17606;
+  var a17607;
+  var a17608;
+  var a17609;
+  var a17610;
+  var a17611;
+  var a17612;
+  var a17613;
+  var a17614;
+  var a17615;
+  var a17616;
+  var a17617;
+  var a17618;
+  var a17619;
+  var a17620;
+  var a17621;
+  var a17622;
+  var a17623;
+  var a17624;
+  var a17625;
+  var a17626;
+  var a17627;
+  var a17628;
+  var a17629;
+  var a17630;
+  var a17631;
+  var a17632;
+  var a17633;
+  var a17634;
+  var a17635;
+  var a17636;
+  var a17637;
+  var a17638;
+  var a17639;
+  var a17640;
+  var a17641;
+  var a17642;
+  var a17643;
+  var a17644;
+  var a17645;
+  var a17646;
+  var a17647;
+  var a17648;
+  var a17649;
+  var a17650;
+  var a17651;
+  var a17652;
+  var a17653;
+  var a17654;
+  var a17655;
+  var a17656;
+  var a17657;
+  var a17658;
+  var a17659;
+  var a17660;
+  var a17661;
+  var a17662;
+  var a17663;
+  var a17664;
+  var a17665;
+  var a17666;
+  var a17667;
+  var a17668;
+  var a17669;
+  var a17670;
+  var a17671;
+  var a17672;
+  var a17673;
+  var a17674;
+  var a17675;
+  var a17676;
+  var a17677;
+  var a17678;
+  var a17679;
+  var a17680;
+  var a17681;
+  var a17682;
+  var a17683;
+  var a17684;
+  var a17685;
+  var a17686;
+  var a17687;
+  var a17688;
+  var a17689;
+  var a17690;
+  var a17691;
+  var a17692;
+  var a17693;
+  var a17694;
+  var a17695;
+  var a17696;
+  var a17697;
+  var a17698;
+  var a17699;
+  var a17700;
+  var a17701;
+  var a17702;
+  var a17703;
+  var a17704;
+  var a17705;
+  var a17706;
+  var a17707;
+  var a17708;
+  var a17709;
+  var a17710;
+  var a17711;
+  var a17712;
+  var a17713;
+  var a17714;
+  var a17715;
+  var a17716;
+  var a17717;
+  var a17718;
+  var a17719;
+  var a17720;
+  var a17721;
+  var a17722;
+  var a17723;
+  var a17724;
+  var a17725;
+  var a17726;
+  var a17727;
+  var a17728;
+  var a17729;
+  var a17730;
+  var a17731;
+  var a17732;
+  var a17733;
+  var a17734;
+  var a17735;
+  var a17736;
+  var a17737;
+  var a17738;
+  var a17739;
+  var a17740;
+  var a17741;
+  var a17742;
+  var a17743;
+  var a17744;
+  var a17745;
+  var a17746;
+  var a17747;
+  var a17748;
+  var a17749;
+  var a17750;
+  var a17751;
+  var a17752;
+  var a17753;
+  var a17754;
+  var a17755;
+  var a17756;
+  var a17757;
+  var a17758;
+  var a17759;
+  var a17760;
+  var a17761;
+  var a17762;
+  var a17763;
+  var a17764;
+  var a17765;
+  var a17766;
+  var a17767;
+  var a17768;
+  var a17769;
+  var a17770;
+  var a17771;
+  var a17772;
+  var a17773;
+  var a17774;
+  var a17775;
+  var a17776;
+  var a17777;
+  var a17778;
+  var a17779;
+  var a17780;
+  var a17781;
+  var a17782;
+  var a17783;
+  var a17784;
+  var a17785;
+  var a17786;
+  var a17787;
+  var a17788;
+  var a17789;
+  var a17790;
+  var a17791;
+  var a17792;
+  var a17793;
+  var a17794;
+  var a17795;
+  var a17796;
+  var a17797;
+  var a17798;
+  var a17799;
+  var a17800;
+  var a17801;
+  var a17802;
+  var a17803;
+  var a17804;
+  var a17805;
+  var a17806;
+  var a17807;
+  var a17808;
+  var a17809;
+  var a17810;
+  var a17811;
+  var a17812;
+  var a17813;
+  var a17814;
+  var a17815;
+  var a17816;
+  var a17817;
+  var a17818;
+  var a17819;
+  var a17820;
+  var a17821;
+  var a17822;
+  var a17823;
+  var a17824;
+  var a17825;
+  var a17826;
+  var a17827;
+  var a17828;
+  var a17829;
+  var a17830;
+  var a17831;
+  var a17832;
+  var a17833;
+  var a17834;
+  var a17835;
+  var a17836;
+  var a17837;
+  var a17838;
+  var a17839;
+  var a17840;
+  var a17841;
+  var a17842;
+  var a17843;
+  var a17844;
+  var a17845;
+  var a17846;
+  var a17847;
+  var a17848;
+  var a17849;
+  var a17850;
+  var a17851;
+  var a17852;
+  var a17853;
+  var a17854;
+  var a17855;
+  var a17856;
+  var a17857;
+  var a17858;
+  var a17859;
+  var a17860;
+  var a17861;
+  var a17862;
+  var a17863;
+  var a17864;
+  var a17865;
+  var a17866;
+  var a17867;
+  var a17868;
+  var a17869;
+  var a17870;
+  var a17871;
+  var a17872;
+  var a17873;
+  var a17874;
+  var a17875;
+  var a17876;
+  var a17877;
+  var a17878;
+  var a17879;
+  var a17880;
+  var a17881;
+  var a17882;
+  var a17883;
+  var a17884;
+  var a17885;
+  var a17886;
+  var a17887;
+  var a17888;
+  var a17889;
+  var a17890;
+  var a17891;
+  var a17892;
+  var a17893;
+  var a17894;
+  var a17895;
+  var a17896;
+  var a17897;
+  var a17898;
+  var a17899;
+  var a17900;
+  var a17901;
+  var a17902;
+  var a17903;
+  var a17904;
+  var a17905;
+  var a17906;
+  var a17907;
+  var a17908;
+  var a17909;
+  var a17910;
+  var a17911;
+  var a17912;
+  var a17913;
+  var a17914;
+  var a17915;
+  var a17916;
+  var a17917;
+  var a17918;
+  var a17919;
+  var a17920;
+  var a17921;
+  var a17922;
+  var a17923;
+  var a17924;
+  var a17925;
+  var a17926;
+  var a17927;
+  var a17928;
+  var a17929;
+  var a17930;
+  var a17931;
+  var a17932;
+  var a17933;
+  var a17934;
+  var a17935;
+  var a17936;
+  var a17937;
+  var a17938;
+  var a17939;
+  var a17940;
+  var a17941;
+  var a17942;
+  var a17943;
+  var a17944;
+  var a17945;
+  var a17946;
+  var a17947;
+  var a17948;
+  var a17949;
+  var a17950;
+  var a17951;
+  var a17952;
+  var a17953;
+  var a17954;
+  var a17955;
+  var a17956;
+  var a17957;
+  var a17958;
+  var a17959;
+  var a17960;
+  var a17961;
+  var a17962;
+  var a17963;
+  var a17964;
+  var a17965;
+  var a17966;
+  var a17967;
+  var a17968;
+  var a17969;
+  var a17970;
+  var a17971;
+  var a17972;
+  var a17973;
+  var a17974;
+  var a17975;
+  var a17976;
+  var a17977;
+  var a17978;
+  var a17979;
+  var a17980;
+  var a17981;
+  var a17982;
+  var a17983;
+  var a17984;
+  var a17985;
+  var a17986;
+  var a17987;
+  var a17988;
+  var a17989;
+  var a17990;
+  var a17991;
+  var a17992;
+  var a17993;
+  var a17994;
+  var a17995;
+  var a17996;
+  var a17997;
+  var a17998;
+  var a17999;
+  var a18000;
+  var a18001;
+  var a18002;
+  var a18003;
+  var a18004;
+  var a18005;
+  var a18006;
+  var a18007;
+  var a18008;
+  var a18009;
+  var a18010;
+  var a18011;
+  var a18012;
+  var a18013;
+  var a18014;
+  var a18015;
+  var a18016;
+  var a18017;
+  var a18018;
+  var a18019;
+  var a18020;
+  var a18021;
+  var a18022;
+  var a18023;
+  var a18024;
+  var a18025;
+  var a18026;
+  var a18027;
+  var a18028;
+  var a18029;
+  var a18030;
+  var a18031;
+  var a18032;
+  var a18033;
+  var a18034;
+  var a18035;
+  var a18036;
+  var a18037;
+  var a18038;
+  var a18039;
+  var a18040;
+  var a18041;
+  var a18042;
+  var a18043;
+  var a18044;
+  var a18045;
+  var a18046;
+  var a18047;
+  var a18048;
+  var a18049;
+  var a18050;
+  var a18051;
+  var a18052;
+  var a18053;
+  var a18054;
+  var a18055;
+  var a18056;
+  var a18057;
+  var a18058;
+  var a18059;
+  var a18060;
+  var a18061;
+  var a18062;
+  var a18063;
+  var a18064;
+  var a18065;
+  var a18066;
+  var a18067;
+  var a18068;
+  var a18069;
+  var a18070;
+  var a18071;
+  var a18072;
+  var a18073;
+  var a18074;
+  var a18075;
+  var a18076;
+  var a18077;
+  var a18078;
+  var a18079;
+  var a18080;
+  var a18081;
+  var a18082;
+  var a18083;
+  var a18084;
+  var a18085;
+  var a18086;
+  var a18087;
+  var a18088;
+  var a18089;
+  var a18090;
+  var a18091;
+  var a18092;
+  var a18093;
+  var a18094;
+  var a18095;
+  var a18096;
+  var a18097;
+  var a18098;
+  var a18099;
+  var a18100;
+  var a18101;
+  var a18102;
+  var a18103;
+  var a18104;
+  var a18105;
+  var a18106;
+  var a18107;
+  var a18108;
+  var a18109;
+  var a18110;
+  var a18111;
+  var a18112;
+  var a18113;
+  var a18114;
+  var a18115;
+  var a18116;
+  var a18117;
+  var a18118;
+  var a18119;
+  var a18120;
+  var a18121;
+  var a18122;
+  var a18123;
+  var a18124;
+  var a18125;
+  var a18126;
+  var a18127;
+  var a18128;
+  var a18129;
+  var a18130;
+  var a18131;
+  var a18132;
+  var a18133;
+  var a18134;
+  var a18135;
+  var a18136;
+  var a18137;
+  var a18138;
+  var a18139;
+  var a18140;
+  var a18141;
+  var a18142;
+  var a18143;
+  var a18144;
+  var a18145;
+  var a18146;
+  var a18147;
+  var a18148;
+  var a18149;
+  var a18150;
+  var a18151;
+  var a18152;
+  var a18153;
+  var a18154;
+  var a18155;
+  var a18156;
+  var a18157;
+  var a18158;
+  var a18159;
+  var a18160;
+  var a18161;
+  var a18162;
+  var a18163;
+  var a18164;
+  var a18165;
+  var a18166;
+  var a18167;
+  var a18168;
+  var a18169;
+  var a18170;
+  var a18171;
+  var a18172;
+  var a18173;
+  var a18174;
+  var a18175;
+  var a18176;
+  var a18177;
+  var a18178;
+  var a18179;
+  var a18180;
+  var a18181;
+  var a18182;
+  var a18183;
+  var a18184;
+  var a18185;
+  var a18186;
+  var a18187;
+  var a18188;
+  var a18189;
+  var a18190;
+  var a18191;
+  var a18192;
+  var a18193;
+  var a18194;
+  var a18195;
+  var a18196;
+  var a18197;
+  var a18198;
+  var a18199;
+  var a18200;
+  var a18201;
+  var a18202;
+  var a18203;
+  var a18204;
+  var a18205;
+  var a18206;
+  var a18207;
+  var a18208;
+  var a18209;
+  var a18210;
+  var a18211;
+  var a18212;
+  var a18213;
+  var a18214;
+  var a18215;
+  var a18216;
+  var a18217;
+  var a18218;
+  var a18219;
+  var a18220;
+  var a18221;
+  var a18222;
+  var a18223;
+  var a18224;
+  var a18225;
+  var a18226;
+  var a18227;
+  var a18228;
+  var a18229;
+  var a18230;
+  var a18231;
+  var a18232;
+  var a18233;
+  var a18234;
+  var a18235;
+  var a18236;
+  var a18237;
+  var a18238;
+  var a18239;
+  var a18240;
+  var a18241;
+  var a18242;
+  var a18243;
+  var a18244;
+  var a18245;
+  var a18246;
+  var a18247;
+  var a18248;
+  var a18249;
+  var a18250;
+  var a18251;
+  var a18252;
+  var a18253;
+  var a18254;
+  var a18255;
+  var a18256;
+  var a18257;
+  var a18258;
+  var a18259;
+  var a18260;
+  var a18261;
+  var a18262;
+  var a18263;
+  var a18264;
+  var a18265;
+  var a18266;
+  var a18267;
+  var a18268;
+  var a18269;
+  var a18270;
+  var a18271;
+  var a18272;
+  var a18273;
+  var a18274;
+  var a18275;
+  var a18276;
+  var a18277;
+  var a18278;
+  var a18279;
+  var a18280;
+  var a18281;
+  var a18282;
+  var a18283;
+  var a18284;
+  var a18285;
+  var a18286;
+  var a18287;
+  var a18288;
+  var a18289;
+  var a18290;
+  var a18291;
+  var a18292;
+  var a18293;
+  var a18294;
+  var a18295;
+  var a18296;
+  var a18297;
+  var a18298;
+  var a18299;
+  var a18300;
+  var a18301;
+  var a18302;
+  var a18303;
+  var a18304;
+  var a18305;
+  var a18306;
+  var a18307;
+  var a18308;
+  var a18309;
+  var a18310;
+  var a18311;
+  var a18312;
+  var a18313;
+  var a18314;
+  var a18315;
+  var a18316;
+  var a18317;
+  var a18318;
+  var a18319;
+  var a18320;
+  var a18321;
+  var a18322;
+  var a18323;
+  var a18324;
+  var a18325;
+  var a18326;
+  var a18327;
+  var a18328;
+  var a18329;
+  var a18330;
+  var a18331;
+  var a18332;
+  var a18333;
+  var a18334;
+  var a18335;
+  var a18336;
+  var a18337;
+  var a18338;
+  var a18339;
+  var a18340;
+  var a18341;
+  var a18342;
+  var a18343;
+  var a18344;
+  var a18345;
+  var a18346;
+  var a18347;
+  var a18348;
+  var a18349;
+  var a18350;
+  var a18351;
+  var a18352;
+  var a18353;
+  var a18354;
+  var a18355;
+  var a18356;
+  var a18357;
+  var a18358;
+  var a18359;
+  var a18360;
+  var a18361;
+  var a18362;
+  var a18363;
+  var a18364;
+  var a18365;
+  var a18366;
+  var a18367;
+  var a18368;
+  var a18369;
+  var a18370;
+  var a18371;
+  var a18372;
+  var a18373;
+  var a18374;
+  var a18375;
+  var a18376;
+  var a18377;
+  var a18378;
+  var a18379;
+  var a18380;
+  var a18381;
+  var a18382;
+  var a18383;
+  var a18384;
+  var a18385;
+  var a18386;
+  var a18387;
+  var a18388;
+  var a18389;
+  var a18390;
+  var a18391;
+  var a18392;
+  var a18393;
+  var a18394;
+  var a18395;
+  var a18396;
+  var a18397;
+  var a18398;
+  var a18399;
+  var a18400;
+  var a18401;
+  var a18402;
+  var a18403;
+  var a18404;
+  var a18405;
+  var a18406;
+  var a18407;
+  var a18408;
+  var a18409;
+  var a18410;
+  var a18411;
+  var a18412;
+  var a18413;
+  var a18414;
+  var a18415;
+  var a18416;
+  var a18417;
+  var a18418;
+  var a18419;
+  var a18420;
+  var a18421;
+  var a18422;
+  var a18423;
+  var a18424;
+  var a18425;
+  var a18426;
+  var a18427;
+  var a18428;
+  var a18429;
+  var a18430;
+  var a18431;
+  var a18432;
+  var a18433;
+  var a18434;
+  var a18435;
+  var a18436;
+  var a18437;
+  var a18438;
+  var a18439;
+  var a18440;
+  var a18441;
+  var a18442;
+  var a18443;
+  var a18444;
+  var a18445;
+  var a18446;
+  var a18447;
+  var a18448;
+  var a18449;
+  var a18450;
+  var a18451;
+  var a18452;
+  var a18453;
+  var a18454;
+  var a18455;
+  var a18456;
+  var a18457;
+  var a18458;
+  var a18459;
+  var a18460;
+  var a18461;
+  var a18462;
+  var a18463;
+  var a18464;
+  var a18465;
+  var a18466;
+  var a18467;
+  var a18468;
+  var a18469;
+  var a18470;
+  var a18471;
+  var a18472;
+  var a18473;
+  var a18474;
+  var a18475;
+  var a18476;
+  var a18477;
+  var a18478;
+  var a18479;
+  var a18480;
+  var a18481;
+  var a18482;
+  var a18483;
+  var a18484;
+  var a18485;
+  var a18486;
+  var a18487;
+  var a18488;
+  var a18489;
+  var a18490;
+  var a18491;
+  var a18492;
+  var a18493;
+  var a18494;
+  var a18495;
+  var a18496;
+  var a18497;
+  var a18498;
+  var a18499;
+  var a18500;
+  var a18501;
+  var a18502;
+  var a18503;
+  var a18504;
+  var a18505;
+  var a18506;
+  var a18507;
+  var a18508;
+  var a18509;
+  var a18510;
+  var a18511;
+  var a18512;
+  var a18513;
+  var a18514;
+  var a18515;
+  var a18516;
+  var a18517;
+  var a18518;
+  var a18519;
+  var a18520;
+  var a18521;
+  var a18522;
+  var a18523;
+  var a18524;
+  var a18525;
+  var a18526;
+  var a18527;
+  var a18528;
+  var a18529;
+  var a18530;
+  var a18531;
+  var a18532;
+  var a18533;
+  var a18534;
+  var a18535;
+  var a18536;
+  var a18537;
+  var a18538;
+  var a18539;
+  var a18540;
+  var a18541;
+  var a18542;
+  var a18543;
+  var a18544;
+  var a18545;
+  var a18546;
+  var a18547;
+  var a18548;
+  var a18549;
+  var a18550;
+  var a18551;
+  var a18552;
+  var a18553;
+  var a18554;
+  var a18555;
+  var a18556;
+  var a18557;
+  var a18558;
+  var a18559;
+  var a18560;
+  var a18561;
+  var a18562;
+  var a18563;
+  var a18564;
+  var a18565;
+  var a18566;
+  var a18567;
+  var a18568;
+  var a18569;
+  var a18570;
+  var a18571;
+  var a18572;
+  var a18573;
+  var a18574;
+  var a18575;
+  var a18576;
+  var a18577;
+  var a18578;
+  var a18579;
+  var a18580;
+  var a18581;
+  var a18582;
+  var a18583;
+  var a18584;
+  var a18585;
+  var a18586;
+  var a18587;
+  var a18588;
+  var a18589;
+  var a18590;
+  var a18591;
+  var a18592;
+  var a18593;
+  var a18594;
+  var a18595;
+  var a18596;
+  var a18597;
+  var a18598;
+  var a18599;
+  var a18600;
+  var a18601;
+  var a18602;
+  var a18603;
+  var a18604;
+  var a18605;
+  var a18606;
+  var a18607;
+  var a18608;
+  var a18609;
+  var a18610;
+  var a18611;
+  var a18612;
+  var a18613;
+  var a18614;
+  var a18615;
+  var a18616;
+  var a18617;
+  var a18618;
+  var a18619;
+  var a18620;
+  var a18621;
+  var a18622;
+  var a18623;
+  var a18624;
+  var a18625;
+  var a18626;
+  var a18627;
+  var a18628;
+  var a18629;
+  var a18630;
+  var a18631;
+  var a18632;
+  var a18633;
+  var a18634;
+  var a18635;
+  var a18636;
+  var a18637;
+  var a18638;
+  var a18639;
+  var a18640;
+  var a18641;
+  var a18642;
+  var a18643;
+  var a18644;
+  var a18645;
+  var a18646;
+  var a18647;
+  var a18648;
+  var a18649;
+  var a18650;
+  var a18651;
+  var a18652;
+  var a18653;
+  var a18654;
+  var a18655;
+  var a18656;
+  var a18657;
+  var a18658;
+  var a18659;
+  var a18660;
+  var a18661;
+  var a18662;
+  var a18663;
+  var a18664;
+  var a18665;
+  var a18666;
+  var a18667;
+  var a18668;
+  var a18669;
+  var a18670;
+  var a18671;
+  var a18672;
+  var a18673;
+  var a18674;
+  var a18675;
+  var a18676;
+  var a18677;
+  var a18678;
+  var a18679;
+  var a18680;
+  var a18681;
+  var a18682;
+  var a18683;
+  var a18684;
+  var a18685;
+  var a18686;
+  var a18687;
+  var a18688;
+  var a18689;
+  var a18690;
+  var a18691;
+  var a18692;
+  var a18693;
+  var a18694;
+  var a18695;
+  var a18696;
+  var a18697;
+  var a18698;
+  var a18699;
+  var a18700;
+  var a18701;
+  var a18702;
+  var a18703;
+  var a18704;
+  var a18705;
+  var a18706;
+  var a18707;
+  var a18708;
+  var a18709;
+  var a18710;
+  var a18711;
+  var a18712;
+  var a18713;
+  var a18714;
+  var a18715;
+  var a18716;
+  var a18717;
+  var a18718;
+  var a18719;
+  var a18720;
+  var a18721;
+  var a18722;
+  var a18723;
+  var a18724;
+  var a18725;
+  var a18726;
+  var a18727;
+  var a18728;
+  var a18729;
+  var a18730;
+  var a18731;
+  var a18732;
+  var a18733;
+  var a18734;
+  var a18735;
+  var a18736;
+  var a18737;
+  var a18738;
+  var a18739;
+  var a18740;
+  var a18741;
+  var a18742;
+  var a18743;
+  var a18744;
+  var a18745;
+  var a18746;
+  var a18747;
+  var a18748;
+  var a18749;
+  var a18750;
+  var a18751;
+  var a18752;
+  var a18753;
+  var a18754;
+  var a18755;
+  var a18756;
+  var a18757;
+  var a18758;
+  var a18759;
+  var a18760;
+  var a18761;
+  var a18762;
+  var a18763;
+  var a18764;
+  var a18765;
+  var a18766;
+  var a18767;
+  var a18768;
+  var a18769;
+  var a18770;
+  var a18771;
+  var a18772;
+  var a18773;
+  var a18774;
+  var a18775;
+  var a18776;
+  var a18777;
+  var a18778;
+  var a18779;
+  var a18780;
+  var a18781;
+  var a18782;
+  var a18783;
+  var a18784;
+  var a18785;
+  var a18786;
+  var a18787;
+  var a18788;
+  var a18789;
+  var a18790;
+  var a18791;
+  var a18792;
+  var a18793;
+  var a18794;
+  var a18795;
+  var a18796;
+  var a18797;
+  var a18798;
+  var a18799;
+  var a18800;
+  var a18801;
+  var a18802;
+  var a18803;
+  var a18804;
+  var a18805;
+  var a18806;
+  var a18807;
+  var a18808;
+  var a18809;
+  var a18810;
+  var a18811;
+  var a18812;
+  var a18813;
+  var a18814;
+  var a18815;
+  var a18816;
+  var a18817;
+  var a18818;
+  var a18819;
+  var a18820;
+  var a18821;
+  var a18822;
+  var a18823;
+  var a18824;
+  var a18825;
+  var a18826;
+  var a18827;
+  var a18828;
+  var a18829;
+  var a18830;
+  var a18831;
+  var a18832;
+  var a18833;
+  var a18834;
+  var a18835;
+  var a18836;
+  var a18837;
+  var a18838;
+  var a18839;
+  var a18840;
+  var a18841;
+  var a18842;
+  var a18843;
+  var a18844;
+  var a18845;
+  var a18846;
+  var a18847;
+  var a18848;
+  var a18849;
+  var a18850;
+  var a18851;
+  var a18852;
+  var a18853;
+  var a18854;
+  var a18855;
+  var a18856;
+  var a18857;
+  var a18858;
+  var a18859;
+  var a18860;
+  var a18861;
+  var a18862;
+  var a18863;
+  var a18864;
+  var a18865;
+  var a18866;
+  var a18867;
+  var a18868;
+  var a18869;
+  var a18870;
+  var a18871;
+  var a18872;
+  var a18873;
+  var a18874;
+  var a18875;
+  var a18876;
+  var a18877;
+  var a18878;
+  var a18879;
+  var a18880;
+  var a18881;
+  var a18882;
+  var a18883;
+  var a18884;
+  var a18885;
+  var a18886;
+  var a18887;
+  var a18888;
+  var a18889;
+  var a18890;
+  var a18891;
+  var a18892;
+  var a18893;
+  var a18894;
+  var a18895;
+  var a18896;
+  var a18897;
+  var a18898;
+  var a18899;
+  var a18900;
+  var a18901;
+  var a18902;
+  var a18903;
+  var a18904;
+  var a18905;
+  var a18906;
+  var a18907;
+  var a18908;
+  var a18909;
+  var a18910;
+  var a18911;
+  var a18912;
+  var a18913;
+  var a18914;
+  var a18915;
+  var a18916;
+  var a18917;
+  var a18918;
+  var a18919;
+  var a18920;
+  var a18921;
+  var a18922;
+  var a18923;
+  var a18924;
+  var a18925;
+  var a18926;
+  var a18927;
+  var a18928;
+  var a18929;
+  var a18930;
+  var a18931;
+  var a18932;
+  var a18933;
+  var a18934;
+  var a18935;
+  var a18936;
+  var a18937;
+  var a18938;
+  var a18939;
+  var a18940;
+  var a18941;
+  var a18942;
+  var a18943;
+  var a18944;
+  var a18945;
+  var a18946;
+  var a18947;
+  var a18948;
+  var a18949;
+  var a18950;
+  var a18951;
+  var a18952;
+  var a18953;
+  var a18954;
+  var a18955;
+  var a18956;
+  var a18957;
+  var a18958;
+  var a18959;
+  var a18960;
+  var a18961;
+  var a18962;
+  var a18963;
+  var a18964;
+  var a18965;
+  var a18966;
+  var a18967;
+  var a18968;
+  var a18969;
+  var a18970;
+  var a18971;
+  var a18972;
+  var a18973;
+  var a18974;
+  var a18975;
+  var a18976;
+  var a18977;
+  var a18978;
+  var a18979;
+  var a18980;
+  var a18981;
+  var a18982;
+  var a18983;
+  var a18984;
+  var a18985;
+  var a18986;
+  var a18987;
+  var a18988;
+  var a18989;
+  var a18990;
+  var a18991;
+  var a18992;
+  var a18993;
+  var a18994;
+  var a18995;
+  var a18996;
+  var a18997;
+  var a18998;
+  var a18999;
+  var a19000;
+  var a19001;
+  var a19002;
+  var a19003;
+  var a19004;
+  var a19005;
+  var a19006;
+  var a19007;
+  var a19008;
+  var a19009;
+  var a19010;
+  var a19011;
+  var a19012;
+  var a19013;
+  var a19014;
+  var a19015;
+  var a19016;
+  var a19017;
+  var a19018;
+  var a19019;
+  var a19020;
+  var a19021;
+  var a19022;
+  var a19023;
+  var a19024;
+  var a19025;
+  var a19026;
+  var a19027;
+  var a19028;
+  var a19029;
+  var a19030;
+  var a19031;
+  var a19032;
+  var a19033;
+  var a19034;
+  var a19035;
+  var a19036;
+  var a19037;
+  var a19038;
+  var a19039;
+  var a19040;
+  var a19041;
+  var a19042;
+  var a19043;
+  var a19044;
+  var a19045;
+  var a19046;
+  var a19047;
+  var a19048;
+  var a19049;
+  var a19050;
+  var a19051;
+  var a19052;
+  var a19053;
+  var a19054;
+  var a19055;
+  var a19056;
+  var a19057;
+  var a19058;
+  var a19059;
+  var a19060;
+  var a19061;
+  var a19062;
+  var a19063;
+  var a19064;
+  var a19065;
+  var a19066;
+  var a19067;
+  var a19068;
+  var a19069;
+  var a19070;
+  var a19071;
+  var a19072;
+  var a19073;
+  var a19074;
+  var a19075;
+  var a19076;
+  var a19077;
+  var a19078;
+  var a19079;
+  var a19080;
+  var a19081;
+  var a19082;
+  var a19083;
+  var a19084;
+  var a19085;
+  var a19086;
+  var a19087;
+  var a19088;
+  var a19089;
+  var a19090;
+  var a19091;
+  var a19092;
+  var a19093;
+  var a19094;
+  var a19095;
+  var a19096;
+  var a19097;
+  var a19098;
+  var a19099;
+  var a19100;
+  var a19101;
+  var a19102;
+  var a19103;
+  var a19104;
+  var a19105;
+  var a19106;
+  var a19107;
+  var a19108;
+  var a19109;
+  var a19110;
+  var a19111;
+  var a19112;
+  var a19113;
+  var a19114;
+  var a19115;
+  var a19116;
+  var a19117;
+  var a19118;
+  var a19119;
+  var a19120;
+  var a19121;
+  var a19122;
+  var a19123;
+  var a19124;
+  var a19125;
+  var a19126;
+  var a19127;
+  var a19128;
+  var a19129;
+  var a19130;
+  var a19131;
+  var a19132;
+  var a19133;
+  var a19134;
+  var a19135;
+  var a19136;
+  var a19137;
+  var a19138;
+  var a19139;
+  var a19140;
+  var a19141;
+  var a19142;
+  var a19143;
+  var a19144;
+  var a19145;
+  var a19146;
+  var a19147;
+  var a19148;
+  var a19149;
+  var a19150;
+  var a19151;
+  var a19152;
+  var a19153;
+  var a19154;
+  var a19155;
+  var a19156;
+  var a19157;
+  var a19158;
+  var a19159;
+  var a19160;
+  var a19161;
+  var a19162;
+  var a19163;
+  var a19164;
+  var a19165;
+  var a19166;
+  var a19167;
+  var a19168;
+  var a19169;
+  var a19170;
+  var a19171;
+  var a19172;
+  var a19173;
+  var a19174;
+  var a19175;
+  var a19176;
+  var a19177;
+  var a19178;
+  var a19179;
+  var a19180;
+  var a19181;
+  var a19182;
+  var a19183;
+  var a19184;
+  var a19185;
+  var a19186;
+  var a19187;
+  var a19188;
+  var a19189;
+  var a19190;
+  var a19191;
+  var a19192;
+  var a19193;
+  var a19194;
+  var a19195;
+  var a19196;
+  var a19197;
+  var a19198;
+  var a19199;
+  var a19200;
+  var a19201;
+  var a19202;
+  var a19203;
+  var a19204;
+  var a19205;
+  var a19206;
+  var a19207;
+  var a19208;
+  var a19209;
+  var a19210;
+  var a19211;
+  var a19212;
+  var a19213;
+  var a19214;
+  var a19215;
+  var a19216;
+  var a19217;
+  var a19218;
+  var a19219;
+  var a19220;
+  var a19221;
+  var a19222;
+  var a19223;
+  var a19224;
+  var a19225;
+  var a19226;
+  var a19227;
+  var a19228;
+  var a19229;
+  var a19230;
+  var a19231;
+  var a19232;
+  var a19233;
+  var a19234;
+  var a19235;
+  var a19236;
+  var a19237;
+  var a19238;
+  var a19239;
+  var a19240;
+  var a19241;
+  var a19242;
+  var a19243;
+  var a19244;
+  var a19245;
+  var a19246;
+  var a19247;
+  var a19248;
+  var a19249;
+  var a19250;
+  var a19251;
+  var a19252;
+  var a19253;
+  var a19254;
+  var a19255;
+  var a19256;
+  var a19257;
+  var a19258;
+  var a19259;
+  var a19260;
+  var a19261;
+  var a19262;
+  var a19263;
+  var a19264;
+  var a19265;
+  var a19266;
+  var a19267;
+  var a19268;
+  var a19269;
+  var a19270;
+  var a19271;
+  var a19272;
+  var a19273;
+  var a19274;
+  var a19275;
+  var a19276;
+  var a19277;
+  var a19278;
+  var a19279;
+  var a19280;
+  var a19281;
+  var a19282;
+  var a19283;
+  var a19284;
+  var a19285;
+  var a19286;
+  var a19287;
+  var a19288;
+  var a19289;
+  var a19290;
+  var a19291;
+  var a19292;
+  var a19293;
+  var a19294;
+  var a19295;
+  var a19296;
+  var a19297;
+  var a19298;
+  var a19299;
+  var a19300;
+  var a19301;
+  var a19302;
+  var a19303;
+  var a19304;
+  var a19305;
+  var a19306;
+  var a19307;
+  var a19308;
+  var a19309;
+  var a19310;
+  var a19311;
+  var a19312;
+  var a19313;
+  var a19314;
+  var a19315;
+  var a19316;
+  var a19317;
+  var a19318;
+  var a19319;
+  var a19320;
+  var a19321;
+  var a19322;
+  var a19323;
+  var a19324;
+  var a19325;
+  var a19326;
+  var a19327;
+  var a19328;
+  var a19329;
+  var a19330;
+  var a19331;
+  var a19332;
+  var a19333;
+  var a19334;
+  var a19335;
+  var a19336;
+  var a19337;
+  var a19338;
+  var a19339;
+  var a19340;
+  var a19341;
+  var a19342;
+  var a19343;
+  var a19344;
+  var a19345;
+  var a19346;
+  var a19347;
+  var a19348;
+  var a19349;
+  var a19350;
+  var a19351;
+  var a19352;
+  var a19353;
+  var a19354;
+  var a19355;
+  var a19356;
+  var a19357;
+  var a19358;
+  var a19359;
+  var a19360;
+  var a19361;
+  var a19362;
+  var a19363;
+  var a19364;
+  var a19365;
+  var a19366;
+  var a19367;
+  var a19368;
+  var a19369;
+  var a19370;
+  var a19371;
+  var a19372;
+  var a19373;
+  var a19374;
+  var a19375;
+  var a19376;
+  var a19377;
+  var a19378;
+  var a19379;
+  var a19380;
+  var a19381;
+  var a19382;
+  var a19383;
+  var a19384;
+  var a19385;
+  var a19386;
+  var a19387;
+  var a19388;
+  var a19389;
+  var a19390;
+  var a19391;
+  var a19392;
+  var a19393;
+  var a19394;
+  var a19395;
+  var a19396;
+  var a19397;
+  var a19398;
+  var a19399;
+  var a19400;
+  var a19401;
+  var a19402;
+  var a19403;
+  var a19404;
+  var a19405;
+  var a19406;
+  var a19407;
+  var a19408;
+  var a19409;
+  var a19410;
+  var a19411;
+  var a19412;
+  var a19413;
+  var a19414;
+  var a19415;
+  var a19416;
+  var a19417;
+  var a19418;
+  var a19419;
+  var a19420;
+  var a19421;
+  var a19422;
+  var a19423;
+  var a19424;
+  var a19425;
+  var a19426;
+  var a19427;
+  var a19428;
+  var a19429;
+  var a19430;
+  var a19431;
+  var a19432;
+  var a19433;
+  var a19434;
+  var a19435;
+  var a19436;
+  var a19437;
+  var a19438;
+  var a19439;
+  var a19440;
+  var a19441;
+  var a19442;
+  var a19443;
+  var a19444;
+  var a19445;
+  var a19446;
+  var a19447;
+  var a19448;
+  var a19449;
+  var a19450;
+  var a19451;
+  var a19452;
+  var a19453;
+  var a19454;
+  var a19455;
+  var a19456;
+  var a19457;
+  var a19458;
+  var a19459;
+  var a19460;
+  var a19461;
+  var a19462;
+  var a19463;
+  var a19464;
+  var a19465;
+  var a19466;
+  var a19467;
+  var a19468;
+  var a19469;
+  var a19470;
+  var a19471;
+  var a19472;
+  var a19473;
+  var a19474;
+  var a19475;
+  var a19476;
+  var a19477;
+  var a19478;
+  var a19479;
+  var a19480;
+  var a19481;
+  var a19482;
+  var a19483;
+  var a19484;
+  var a19485;
+  var a19486;
+  var a19487;
+  var a19488;
+  var a19489;
+  var a19490;
+  var a19491;
+  var a19492;
+  var a19493;
+  var a19494;
+  var a19495;
+  var a19496;
+  var a19497;
+  var a19498;
+  var a19499;
+  var a19500;
+  var a19501;
+  var a19502;
+  var a19503;
+  var a19504;
+  var a19505;
+  var a19506;
+  var a19507;
+  var a19508;
+  var a19509;
+  var a19510;
+  var a19511;
+  var a19512;
+  var a19513;
+  var a19514;
+  var a19515;
+  var a19516;
+  var a19517;
+  var a19518;
+  var a19519;
+  var a19520;
+  var a19521;
+  var a19522;
+  var a19523;
+  var a19524;
+  var a19525;
+  var a19526;
+  var a19527;
+  var a19528;
+  var a19529;
+  var a19530;
+  var a19531;
+  var a19532;
+  var a19533;
+  var a19534;
+  var a19535;
+  var a19536;
+  var a19537;
+  var a19538;
+  var a19539;
+  var a19540;
+  var a19541;
+  var a19542;
+  var a19543;
+  var a19544;
+  var a19545;
+  var a19546;
+  var a19547;
+  var a19548;
+  var a19549;
+  var a19550;
+  var a19551;
+  var a19552;
+  var a19553;
+  var a19554;
+  var a19555;
+  var a19556;
+  var a19557;
+  var a19558;
+  var a19559;
+  var a19560;
+  var a19561;
+  var a19562;
+  var a19563;
+  var a19564;
+  var a19565;
+  var a19566;
+  var a19567;
+  var a19568;
+  var a19569;
+  var a19570;
+  var a19571;
+  var a19572;
+  var a19573;
+  var a19574;
+  var a19575;
+  var a19576;
+  var a19577;
+  var a19578;
+  var a19579;
+  var a19580;
+  var a19581;
+  var a19582;
+  var a19583;
+  var a19584;
+  var a19585;
+  var a19586;
+  var a19587;
+  var a19588;
+  var a19589;
+  var a19590;
+  var a19591;
+  var a19592;
+  var a19593;
+  var a19594;
+  var a19595;
+  var a19596;
+  var a19597;
+  var a19598;
+  var a19599;
+  var a19600;
+  var a19601;
+  var a19602;
+  var a19603;
+  var a19604;
+  var a19605;
+  var a19606;
+  var a19607;
+  var a19608;
+  var a19609;
+  var a19610;
+  var a19611;
+  var a19612;
+  var a19613;
+  var a19614;
+  var a19615;
+  var a19616;
+  var a19617;
+  var a19618;
+  var a19619;
+  var a19620;
+  var a19621;
+  var a19622;
+  var a19623;
+  var a19624;
+  var a19625;
+  var a19626;
+  var a19627;
+  var a19628;
+  var a19629;
+  var a19630;
+  var a19631;
+  var a19632;
+  var a19633;
+  var a19634;
+  var a19635;
+  var a19636;
+  var a19637;
+  var a19638;
+  var a19639;
+  var a19640;
+  var a19641;
+  var a19642;
+  var a19643;
+  var a19644;
+  var a19645;
+  var a19646;
+  var a19647;
+  var a19648;
+  var a19649;
+  var a19650;
+  var a19651;
+  var a19652;
+  var a19653;
+  var a19654;
+  var a19655;
+  var a19656;
+  var a19657;
+  var a19658;
+  var a19659;
+  var a19660;
+  var a19661;
+  var a19662;
+  var a19663;
+  var a19664;
+  var a19665;
+  var a19666;
+  var a19667;
+  var a19668;
+  var a19669;
+  var a19670;
+  var a19671;
+  var a19672;
+  var a19673;
+  var a19674;
+  var a19675;
+  var a19676;
+  var a19677;
+  var a19678;
+  var a19679;
+  var a19680;
+  var a19681;
+  var a19682;
+  var a19683;
+  var a19684;
+  var a19685;
+  var a19686;
+  var a19687;
+  var a19688;
+  var a19689;
+  var a19690;
+  var a19691;
+  var a19692;
+  var a19693;
+  var a19694;
+  var a19695;
+  var a19696;
+  var a19697;
+  var a19698;
+  var a19699;
+  var a19700;
+  var a19701;
+  var a19702;
+  var a19703;
+  var a19704;
+  var a19705;
+  var a19706;
+  var a19707;
+  var a19708;
+  var a19709;
+  var a19710;
+  var a19711;
+  var a19712;
+  var a19713;
+  var a19714;
+  var a19715;
+  var a19716;
+  var a19717;
+  var a19718;
+  var a19719;
+  var a19720;
+  var a19721;
+  var a19722;
+  var a19723;
+  var a19724;
+  var a19725;
+  var a19726;
+  var a19727;
+  var a19728;
+  var a19729;
+  var a19730;
+  var a19731;
+  var a19732;
+  var a19733;
+  var a19734;
+  var a19735;
+  var a19736;
+  var a19737;
+  var a19738;
+  var a19739;
+  var a19740;
+  var a19741;
+  var a19742;
+  var a19743;
+  var a19744;
+  var a19745;
+  var a19746;
+  var a19747;
+  var a19748;
+  var a19749;
+  var a19750;
+  var a19751;
+  var a19752;
+  var a19753;
+  var a19754;
+  var a19755;
+  var a19756;
+  var a19757;
+  var a19758;
+  var a19759;
+  var a19760;
+  var a19761;
+  var a19762;
+  var a19763;
+  var a19764;
+  var a19765;
+  var a19766;
+  var a19767;
+  var a19768;
+  var a19769;
+  var a19770;
+  var a19771;
+  var a19772;
+  var a19773;
+  var a19774;
+  var a19775;
+  var a19776;
+  var a19777;
+  var a19778;
+  var a19779;
+  var a19780;
+  var a19781;
+  var a19782;
+  var a19783;
+  var a19784;
+  var a19785;
+  var a19786;
+  var a19787;
+  var a19788;
+  var a19789;
+  var a19790;
+  var a19791;
+  var a19792;
+  var a19793;
+  var a19794;
+  var a19795;
+  var a19796;
+  var a19797;
+  var a19798;
+  var a19799;
+  var a19800;
+  var a19801;
+  var a19802;
+  var a19803;
+  var a19804;
+  var a19805;
+  var a19806;
+  var a19807;
+  var a19808;
+  var a19809;
+  var a19810;
+  var a19811;
+  var a19812;
+  var a19813;
+  var a19814;
+  var a19815;
+  var a19816;
+  var a19817;
+  var a19818;
+  var a19819;
+  var a19820;
+  var a19821;
+  var a19822;
+  var a19823;
+  var a19824;
+  var a19825;
+  var a19826;
+  var a19827;
+  var a19828;
+  var a19829;
+  var a19830;
+  var a19831;
+  var a19832;
+  var a19833;
+  var a19834;
+  var a19835;
+  var a19836;
+  var a19837;
+  var a19838;
+  var a19839;
+  var a19840;
+  var a19841;
+  var a19842;
+  var a19843;
+  var a19844;
+  var a19845;
+  var a19846;
+  var a19847;
+  var a19848;
+  var a19849;
+  var a19850;
+  var a19851;
+  var a19852;
+  var a19853;
+  var a19854;
+  var a19855;
+  var a19856;
+  var a19857;
+  var a19858;
+  var a19859;
+  var a19860;
+  var a19861;
+  var a19862;
+  var a19863;
+  var a19864;
+  var a19865;
+  var a19866;
+  var a19867;
+  var a19868;
+  var a19869;
+  var a19870;
+  var a19871;
+  var a19872;
+  var a19873;
+  var a19874;
+  var a19875;
+  var a19876;
+  var a19877;
+  var a19878;
+  var a19879;
+  var a19880;
+  var a19881;
+  var a19882;
+  var a19883;
+  var a19884;
+  var a19885;
+  var a19886;
+  var a19887;
+  var a19888;
+  var a19889;
+  var a19890;
+  var a19891;
+  var a19892;
+  var a19893;
+  var a19894;
+  var a19895;
+  var a19896;
+  var a19897;
+  var a19898;
+  var a19899;
+  var a19900;
+  var a19901;
+  var a19902;
+  var a19903;
+  var a19904;
+  var a19905;
+  var a19906;
+  var a19907;
+  var a19908;
+  var a19909;
+  var a19910;
+  var a19911;
+  var a19912;
+  var a19913;
+  var a19914;
+  var a19915;
+  var a19916;
+  var a19917;
+  var a19918;
+  var a19919;
+  var a19920;
+  var a19921;
+  var a19922;
+  var a19923;
+  var a19924;
+  var a19925;
+  var a19926;
+  var a19927;
+  var a19928;
+  var a19929;
+  var a19930;
+  var a19931;
+  var a19932;
+  var a19933;
+  var a19934;
+  var a19935;
+  var a19936;
+  var a19937;
+  var a19938;
+  var a19939;
+  var a19940;
+  var a19941;
+  var a19942;
+  var a19943;
+  var a19944;
+  var a19945;
+  var a19946;
+  var a19947;
+  var a19948;
+  var a19949;
+  var a19950;
+  var a19951;
+  var a19952;
+  var a19953;
+  var a19954;
+  var a19955;
+  var a19956;
+  var a19957;
+  var a19958;
+  var a19959;
+  var a19960;
+  var a19961;
+  var a19962;
+  var a19963;
+  var a19964;
+  var a19965;
+  var a19966;
+  var a19967;
+  var a19968;
+  var a19969;
+  var a19970;
+  var a19971;
+  var a19972;
+  var a19973;
+  var a19974;
+  var a19975;
+  var a19976;
+  var a19977;
+  var a19978;
+  var a19979;
+  var a19980;
+  var a19981;
+  var a19982;
+  var a19983;
+  var a19984;
+  var a19985;
+  var a19986;
+  var a19987;
+  var a19988;
+  var a19989;
+  var a19990;
+  var a19991;
+  var a19992;
+  var a19993;
+  var a19994;
+  var a19995;
+  var a19996;
+  var a19997;
+  var a19998;
+  var a19999;
+  var a20000;
+}
+
+main() {
+  var a = new A();
+  a.a20000 = 42;
+  Expect.equals(42, a.a20000);
+}
\ No newline at end of file
diff --git a/tests/language/malformed_test.dart b/tests/language/malformed_test.dart
index 2364696..e43ee7a 100644
--- a/tests/language/malformed_test.dart
+++ b/tests/language/malformed_test.dart
@@ -121,8 +121,8 @@
   // The expression 'undeclared_prefix.Unresolved()' is parsed as the invocation
   // of the named constructor 'Unresolved' on the type 'undeclared_prefix'.
   Expect.throws(() => new undeclared_prefix.Unresolved(), (e) => true);
-  // The expression 'undeclared_prefix.Unresolved<int>' cannot be parsed.
-  Expect.throws(() => new undeclared_prefix.Unresolved<int>(), (e) => true);  /// 05: compile-time error
+  // The expression 'undeclared_prefix.Unresolved<int>' is a malformed type.
+  Expect.throws(() => new undeclared_prefix.Unresolved<int>(), (e) => true);
 
   try {
     try {
@@ -163,7 +163,7 @@
   try {
     throw 'foo';
   }
-    on undeclared_prefix.Unresolved<int>  /// 06: compile-time error
+    on undeclared_prefix.Unresolved<int>  /// 06: runtime error
     catch (e) {
   }
 }
\ No newline at end of file
diff --git a/tests/language/memory_swap_test.dart b/tests/language/memory_swap_test.dart
new file mode 100644
index 0000000..53fd4b4
--- /dev/null
+++ b/tests/language/memory_swap_test.dart
@@ -0,0 +1,70 @@
+// 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 the ParalleMoveResolver in the VM uses valid registers
+// when requiring scratch registers.
+
+main() {
+  // Iterate enough to ensure optimizing `spillingMethod`.
+  for (int i = 0; i < 100000; i++) {
+    spillingMethod(i, () => 0);
+  }
+}
+
+spillingMethod(what, obfuscate) {
+  // Define lots of variables to get a few in stack.
+  var a = obfuscate();
+  var b = obfuscate();
+  var c = obfuscate();
+  var d = obfuscate();
+  var e = obfuscate();
+  var f = obfuscate();
+  var g = obfuscate();
+  var h = obfuscate();
+  var i = obfuscate();
+  var j = obfuscate();
+  var k = obfuscate();
+  var l = obfuscate();
+  var m = obfuscate();
+  var n = obfuscate();
+  var o = obfuscate();
+  var p = obfuscate();
+  var q = obfuscate();
+  var r = obfuscate();
+  var s = obfuscate();
+  var t = obfuscate();
+  var u = obfuscate();
+  var v = obfuscate();
+
+  // Swap all variables, in the hope of a memory <-> memory swap operation.
+  while (what == 42) {
+    a = b;
+    b = a;
+    c = d;
+    d = c;
+    e = f;
+    f = e;
+    g = h;
+    h = g;
+    i = j;
+    j = i;
+    k = l;
+    l = k;
+    m = n;
+    n = m;
+    o = p;
+    p = o;
+    q = r;
+    r = q;
+    s = t;
+    t = s;
+    u = v;
+    v = u;
+    what++;
+  }
+
+  // Keep all variables alive.
+  return a + b + c + d + e + f + g + h + i + j + k + l + m + n + o
+       + p + q + r + s + t + u + v;
+}
diff --git a/tests/language/number_identity2_test.dart b/tests/language/number_identity2_test.dart
index 1a4c90d..655ac51 100644
--- a/tests/language/number_identity2_test.dart
+++ b/tests/language/number_identity2_test.dart
@@ -8,14 +8,31 @@
 // VMOptions=--optimization-counter-threshold=10
 
 import "package:expect/expect.dart";
+import 'dart:typed_data';
 
-main() {
-  for (int i = 0; i < 20; i++) testNumberIdentity();
+double uint64toDouble(int i) {
+  var buffer = new Uint8List(8).buffer;
+  var bdata = new ByteData.view(buffer);
+  bdata.setUint64(0, i);
+  return bdata.getFloat64(0);
 }
 
-
 testNumberIdentity () {
   var a = double.NAN;
   var b = a + 0.0;
   Expect.isTrue(identical(a, b));
+
+  a = uint64toDouble((1 << 64) - 1);
+  b = uint64toDouble((1 << 64) - 2);
+  Expect.isFalse(identical(a, b));
+
+  a = 0.0/0.0;
+  b = 1.0/0.0;
+  Expect.isFalse(identical(a, b));
+}
+
+main() {
+  for (int i = 0; i < 20; i++) {
+    testNumberIdentity();
+  }
 }
diff --git a/tests/language/reify_typevar_test.dart b/tests/language/reify_typevar_test.dart
new file mode 100644
index 0000000..874efd6
--- /dev/null
+++ b/tests/language/reify_typevar_test.dart
@@ -0,0 +1,16 @@
+// 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";
+
+class Foo<T> {
+    reify() {
+        return T;
+    }
+}
+
+main() {
+    Expect.equals(int, new Foo<int>().reify());
+    Expect.equals(Foo, new Foo().runtimeType);
+}
diff --git a/tests/language/rewrite_for_update_order_test.dart b/tests/language/rewrite_for_update_order_test.dart
new file mode 100644
index 0000000..80ed9de
--- /dev/null
+++ b/tests/language/rewrite_for_update_order_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+var counter = 0;
+var global = 0;
+
+test() {
+    ++counter;
+    return counter <= 2;
+}
+
+first() {
+    global = global + 1;
+}
+second() {
+    global = global * 2;
+}
+
+foo() {
+    while (test()) {
+        first();
+        second();
+    }
+}
+
+main() {
+    foo();
+    Expect.equals(6, global);
+}
diff --git a/tests/language/rewrite_swap_test.dart b/tests/language/rewrite_swap_test.dart
new file mode 100644
index 0000000..acb4e8f
--- /dev/null
+++ b/tests/language/rewrite_swap_test.dart
@@ -0,0 +1,90 @@
+// 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";
+
+swap1(x,y,b) {
+    if (b) {
+        var t = x;
+        x = y;
+        y = t;
+    }
+    Expect.equals(2, x);
+    Expect.equals(1, y);
+}
+
+swap2(x,y,z,w,b) {
+    if (b) {
+        var t = x;
+        x = y;
+        y = t;
+
+        var q = z;
+        z = w;
+        w = q;
+    }
+    Expect.equals(2, x);
+    Expect.equals(1, y);
+    Expect.equals(4, z);
+    Expect.equals(3, w);
+}
+
+swap3(x,y,z,b) {
+    if (b) {
+        var t = x;
+        x = y;
+        y = z;
+        z = t;
+    }
+    Expect.equals(2, x);
+    Expect.equals(3, y);
+    Expect.equals(1, z);
+}
+
+swap4(x,y,z,b) {
+    if (b) {
+        var t = x;
+        x = y;
+        y = z; // swap cycle involves unused variable 'y'
+        z = t;
+    }
+    Expect.equals(2, x);
+    Expect.equals(1, z);
+}
+
+swap5(x,y,z,w,b,b2) {
+    if (b) {
+        var t = x;
+        x = y;
+        y = t;
+    }
+    if (b2) {
+        var q = z;
+        z = w;
+        w = q;
+    }
+    Expect.equals(2, x);
+    Expect.equals(1, y);
+    Expect.equals(4, z);
+    Expect.equals(3, w);
+}
+
+main() {
+    swap1(1,2,true);
+    swap1(2,1,false);
+
+    swap2(1,2,3,4,true);
+    swap2(2,1,4,3,false);
+
+    swap3(1,2,3,true);
+    swap3(2,3,1,false);
+
+    swap4(1,2,3,true);
+    swap4(2,3,1,false);
+
+    swap5(1,2,3,4,true, true);
+    swap5(1,2,4,3,true, false);
+    swap5(2,1,3,4,false, true);
+    swap5(2,1,4,3,false, false);
+}
diff --git a/tests/language/rewrite_variable_initializer_test.dart b/tests/language/rewrite_variable_initializer_test.dart
new file mode 100644
index 0000000..7909ead
--- /dev/null
+++ b/tests/language/rewrite_variable_initializer_test.dart
@@ -0,0 +1,40 @@
+// 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";
+
+class Foo {
+    var field = 0;
+}
+
+bar(x,y) {
+    return x * 100 + y;
+}
+
+foo(z) {
+    var x = 0, y = x;
+    if (z > 0) {
+        x = 10;
+    }
+    if (z > 10) {
+        y = 20;
+    }
+    return bar(x,y);
+}
+
+baz(z) {
+    var f = new Foo()
+            ..field = 10
+            ..field = z;
+    return f;
+}
+
+main() {
+    Expect.equals(0, foo(0));
+    Expect.equals(1000, foo(5));
+    Expect.equals(1020, foo(15));
+
+    Expect.equals(20, baz(20).field);
+    Expect.equals(30, baz(30).field);
+}
diff --git a/tests/language/rewrite_while_many_exits_test.dart b/tests/language/rewrite_while_many_exits_test.dart
new file mode 100644
index 0000000..a3a3c0c
--- /dev/null
+++ b/tests/language/rewrite_while_many_exits_test.dart
@@ -0,0 +1,48 @@
+// 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 baz_clicks = 0;
+
+baz() {
+    return ++baz_clicks;
+}
+
+var global = 0;
+
+increment_global() {
+    ++global;
+    return global <= 10;
+}
+
+foo(x, y) {
+    var n = 0;
+    while (true) {
+        baz();
+        if (n >= x) {
+            return n;
+        }
+        baz();
+        if (n >= y) {
+            return n;
+        }
+        n = n + 1;
+    }
+}
+
+bar() {
+    while (increment_global()) {
+        baz();
+    }
+    return baz();
+}
+
+main() {
+    Expect.equals(10, foo(10, 20));
+    Expect.equals(10, foo(20, 10));
+
+    baz_clicks = 0;
+    Expect.equals(11, bar());
+}
diff --git a/tests/language/rewrite_while_test.dart b/tests/language/rewrite_while_test.dart
index 44e72ed..e7375ef 100644
--- a/tests/language/rewrite_while_test.dart
+++ b/tests/language/rewrite_while_test.dart
@@ -26,6 +26,30 @@
     return n;
 }
 
+loop3(x) {
+    var n = 0;
+    if (x < 100) {
+        while (n < x) {
+            n = n + 1;
+            baz();
+        }
+    }
+    baz();
+    return n;
+}
+
+loop4(x) {
+    var n = 0;
+    if (x < 100) {
+        while (n < x) {
+            baz();
+            n = n + 1;
+        }
+    }
+    baz();
+    return n;
+}
+
 f1(b) {
   while (b)
     return 1;
@@ -48,6 +72,14 @@
     Expect.equals(10, loop2(10));
     Expect.equals(0,  loop2(200));
 
+    Expect.equals(0,  loop3(-10));
+    Expect.equals(10, loop3(10));
+    Expect.equals(0,  loop3(200));
+
+    Expect.equals(0,  loop4(-10));
+    Expect.equals(10, loop4(10));
+    Expect.equals(0,  loop4(200));
+
     Expect.equals(1, f1(true));
     Expect.equals(2, f1(false));
     Expect.equals(1, f2(true));
diff --git a/tests/language/stacktrace_rethrow_error_test.dart b/tests/language/stacktrace_rethrow_error_test.dart
new file mode 100644
index 0000000..64ca5e9
--- /dev/null
+++ b/tests/language/stacktrace_rethrow_error_test.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class SubclassOfError extends Error {}
+
+fail() => throw "Fail";
+
+// == Rethrow, skipping through typed handlers. ==
+
+aa1() {
+  try {
+    bb1();
+    fail();
+  } catch(error
+          , stacktrace  /// withtraceparameter: ok
+          ) {
+    expectTrace(['gg1', 'ff1', 'ee1', 'dd1', 'cc1', 'bb1', 'aa1'], error.stackTrace);
+    expectTrace(['gg1', 'ff1', 'ee1', 'dd1', 'cc1', 'bb1', 'aa1'], stacktrace);  /// withtraceparameter: continued
+  }
+}
+
+bb1() => cc1();
+
+cc1() {
+  try {
+    dd1();
+  } on String catch(e) {
+    fail();
+  } on int catch(e) {
+    fail();
+  }
+}
+
+dd1() => ee1();
+
+ee1() {
+  try {
+    ff1();
+  } catch(e) {
+    rethrow;
+  }
+}
+
+ff1() => gg1();
+
+gg1() => throw new SubclassOfError();
+
+// == Rethrow, rethrow again in typed handler. ==
+
+aa2() {
+  try {
+    bb2();
+    fail();
+  } catch(error
+          , stacktrace  /// withtraceparameter: continued
+          ) {
+    expectTrace(['gg2', 'ff2', 'ee2', 'dd2', 'cc2', 'bb2', 'aa2'], error.stackTrace);
+    expectTrace(['gg2', 'ff2', 'ee2', 'dd2', 'cc2', 'bb2', 'aa2'], stacktrace);  /// withtraceparameter: continued
+  }
+}
+
+bb2() => cc2();
+
+cc2() {
+  try {
+    dd2();
+  } on SubclassOfError catch(e) {
+    rethrow;
+  } on int catch(e) {
+    fail();
+  }
+}
+
+dd2() => ee2();
+
+ee2() {
+  try {
+    ff2();
+  } catch(e) {
+    rethrow;
+  }
+}
+
+ff2() => gg2();
+
+gg2() => throw new SubclassOfError();
+
+// == Rethrow, with intervening catch without a trace parameter.
+
+aa3() {
+  try {
+    bb3();
+    fail();
+  } catch(error
+          , stacktrace  /// withtraceparameter: continued
+         ) {
+    expectTrace(['gg3', 'ff3', 'ee3', 'dd3', 'cc3', 'bb3', 'aa3'], error.stackTrace);
+    expectTrace(['cc3', 'bb3', 'aa3'], stacktrace);  /// withtraceparameter: continued
+  }
+}
+
+bb3() => cc3();
+
+cc3() {
+  try {
+    dd3();
+  } catch(e) {
+    throw e;
+  }
+}
+
+dd3() => ee3();
+
+ee3() {
+  try {
+    ff3();
+  } catch(e) {
+    rethrow;
+  }
+}
+
+ff3() => gg3();
+
+gg3() => throw new SubclassOfError();
+
+expectTrace(functionNames, stacktrace) {
+  // Note we don't expect functionNames to cover the whole trace, only the
+  // top portion, because the frames below main are an implementation detail.
+  var traceLines = stacktrace.toString().split('\n');
+  var expectedIndex = 0;
+  var actualIndex = 0;
+  print(stacktrace);
+  print(functionNames);
+  while (expectedIndex < functionNames.length) {
+    var expected = functionNames[expectedIndex];
+    var actual = traceLines[actualIndex];
+    if (actual.indexOf(expected) == -1) {
+      if (expectedIndex == 0) {
+        actualIndex++; // Skip over some helper frames at the top
+      } else {
+        throw "Expected: $expected actual: $actual";
+      }
+    } else {
+      actualIndex++;
+      expectedIndex++;
+    }
+  }
+}
+
+main() {
+  aa1();
+  aa2();
+  aa3();
+}
\ No newline at end of file
diff --git a/tests/language/stacktrace_rethrow_nonerror_test.dart b/tests/language/stacktrace_rethrow_nonerror_test.dart
new file mode 100644
index 0000000..5707a24
--- /dev/null
+++ b/tests/language/stacktrace_rethrow_nonerror_test.dart
@@ -0,0 +1,148 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class NotASubclassOfError {}
+
+fail() => throw "Fail";
+
+// == Rethrow, skipping through typed handlers. ==
+
+aa1() {
+  try {
+    bb1();
+    fail();
+  } catch(exception, stacktrace) {
+    expectTrace(['gg1', 'ff1', 'ee1', 'dd1', 'cc1', 'bb1', 'aa1'],
+                stacktrace);
+  }
+}
+
+bb1() => cc1();
+
+cc1() {
+  try {
+    dd1();
+  } on String catch(e) {
+    fail();
+  } on int catch(e) {
+    fail();
+  }
+}
+
+dd1() => ee1();
+
+ee1() {
+  try {
+    ff1();
+  } catch(e) {
+    rethrow;
+  }
+}
+
+ff1() => gg1();
+
+gg1() => throw new NotASubclassOfError();
+
+// == Rethrow, rethrow again in typed handler. ==
+
+aa2() {
+  try {
+    bb2();
+    fail();
+  } catch(exception, stacktrace) {
+    expectTrace(['gg2', 'ff2', 'ee2', 'dd2', 'cc2', 'bb2', 'aa2'],
+                stacktrace);
+  }
+}
+
+bb2() => cc2();
+
+cc2() {
+  try {
+    dd2();
+  } on NotASubclassOfError catch(e) {
+    rethrow;
+  } on int catch(e) {
+    fail();
+  }
+}
+
+dd2() => ee2();
+
+ee2() {
+  try {
+    ff2();
+  } catch(e) {
+    rethrow;
+  }
+}
+
+ff2() => gg2();
+
+gg2() => throw new NotASubclassOfError();
+
+// == Rethrow, with intervening catch without a trace parameter.
+
+aa3() {
+  try {
+    bb3();
+    fail();
+  } catch(exception, stacktrace) {
+    expectTrace(['cc3', 'bb3', 'aa3'], stacktrace);
+  }
+}
+
+bb3() => cc3();
+
+cc3() {
+  try {
+    dd3();
+  } catch(e) {
+    throw e;
+  }
+}
+
+dd3() => ee3();
+
+ee3() {
+  try {
+    ff3();
+  } catch(e) {
+    rethrow;
+  }
+}
+
+ff3() => gg3();
+
+gg3() => throw new NotASubclassOfError();
+
+expectTrace(functionNames, stacktrace) {
+  // Note we don't expect functionNames to cover the whole trace, only the
+  // top portion, because the frames below main are an implementation detail.
+  var traceLines = stacktrace.toString().split('\n');
+  var expectedIndex = 0;
+  var actualIndex = 0;
+  print(stacktrace);
+  print(functionNames);
+  while (expectedIndex < functionNames.length) {
+    var expected = functionNames[expectedIndex];
+    var actual = traceLines[actualIndex];
+    if (actual.indexOf(expected) == -1) {
+      if (expectedIndex == 0) {
+        actualIndex++; // Skip over some helper frames at the top
+      } else {
+        throw "Expected: $expected actual: $actual";
+      }
+    } else {
+      actualIndex++;
+      expectedIndex++;
+    }
+  }
+}
+
+main() {
+  aa1();
+  aa2();
+  aa3();
+}
\ No newline at end of file
diff --git a/tests/language/try_catch_optimized1_test.dart b/tests/language/try_catch_optimized1_test.dart
index 380e451..d1be3da 100644
--- a/tests/language/try_catch_optimized1_test.dart
+++ b/tests/language/try_catch_optimized1_test.dart
@@ -1,7 +1,7 @@
 // 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=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/try_catch_optimized2_test.dart b/tests/language/try_catch_optimized2_test.dart
index d383a7f..aa7a9f3 100644
--- a/tests/language/try_catch_optimized2_test.dart
+++ b/tests/language/try_catch_optimized2_test.dart
@@ -1,7 +1,7 @@
 // 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=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/try_catch_optimized3_test.dart b/tests/language/try_catch_optimized3_test.dart
index 18ca114..e0e8437 100644
--- a/tests/language/try_catch_optimized3_test.dart
+++ b/tests/language/try_catch_optimized3_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10
 
 import "package:expect/expect.dart";
 
@@ -22,7 +22,7 @@
 }
 
 main() {
-  for (var i=0; i<100; i++) test_double(1.0, false);
+  for (var i = 0; i < 100; i++) test_double(1.0, false);
   test_double(1.0, false);
   Expect.equals(1.0, test_double(1.0, true));
 }
diff --git a/tests/language/try_catch_optimized4_test.dart b/tests/language/try_catch_optimized4_test.dart
new file mode 100644
index 0000000..7cad947
--- /dev/null
+++ b/tests/language/try_catch_optimized4_test.dart
@@ -0,0 +1,41 @@
+// 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.
+// VMOptions=--optimization-counter-threshold=10
+
+import "package:expect/expect.dart";
+
+// Test correct dead phi elimination with try catch.
+
+List<Object> a = [1,2,3,4,5];
+
+class MyError { }
+
+class M {
+  maythrow(i) {
+    try {
+      if (i <= 5) throw new MyError();
+    } catch(e) { throw e; }
+  }
+}
+
+loop_test() {
+  bool failed = false;
+  M m = new M();
+  for (Object i in a) {
+    try {
+      String res = m.maythrow(i);
+      failed = true;
+    } on MyError catch(e) { }
+    if (!identical(failed, false)) {
+      Expect.fail("");
+    }
+  }
+}
+
+main() {
+  for (var i = 0; i < 20; i++) loop_test();
+}
+
+
+
diff --git a/tests/language/try_catch_osr_test.dart b/tests/language/try_catch_osr_test.dart
new file mode 100644
index 0000000..7533ba0
--- /dev/null
+++ b/tests/language/try_catch_osr_test.dart
@@ -0,0 +1,102 @@
+// 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=--optimization-counter-threshold=10
+
+// Test OSR in different places of a try-catch.
+
+import "package:expect/expect.dart";
+
+maythrow(x) {
+  try {
+    if (x == null) throw 42;
+    return 99;
+  } finally { }
+}
+
+f1() {
+  var s = 0, t = "abc";
+  for (var i = 0; i < 21; ++i) {
+    s += i;
+  }
+  try {
+    maythrow(null);
+  } catch (e) {
+    Expect.equals("abc", t);
+    Expect.equals(42, e);
+    s++;
+  }
+  return s;
+}
+
+f2([x = 1]) {
+  var s = 0, t = "abc";
+  try {
+    try {
+      for (var i = 0; i < 20; ++i) {
+        if (i == 18) maythrow(null);
+        s += x;
+      }
+    } catch (e) {
+      Expect.equals(1, x);
+      Expect.equals("abc", t);
+      Expect.equals(42, e);
+      s++;
+    }
+  } catch (e) { }
+  return s;
+}
+
+f3() {
+  var s = 0, t = "abc";
+  try {
+    maythrow(null);
+  } catch (e) {
+    Expect.equals("abc", t);
+    for (var i = 0; i < 21; ++i) {
+      s += i;
+    }
+    Expect.equals("abc", t);
+    Expect.equals(42, e);
+    return s;
+  }
+}
+
+f4() {
+  var s = 0, t = "abc";
+  try {
+    for (var i = 0; i < 21; ++i) {
+      if (i == 18) maythrow(null);
+      s += i;
+    }
+  } catch (e) {
+    Expect.equals("abc", t);
+    Expect.equals(42, e);
+    s++;
+  }
+  return s;
+}
+
+f5() {
+  var s, t = "abc";
+  try {
+    maythrow(null);
+  } catch (e) {
+    Expect.equals("abc", t);
+    Expect.equals(42, e);
+    s = 0;
+  }
+  for (var i = 0; i < 21; ++i) {
+    s += i;
+  }
+  Expect.equals("abc", t);
+  return s;
+}
+
+main() {
+  Expect.equals(211, f1());
+  Expect.equals(19, f2());
+  Expect.equals(210, f3());
+  Expect.equals(9 * 17 + 1, f4());
+  Expect.equals(210, f5());
+}
diff --git a/tests/language/vm/optimized_shl_test.dart b/tests/language/vm/optimized_shl_test.dart
new file mode 100644
index 0000000..559506c
--- /dev/null
+++ b/tests/language/vm/optimized_shl_test.dart
@@ -0,0 +1,21 @@
+
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--optimization-counter-threshold=10
+
+import "package:expect/expect.dart";
+
+// Test truncating left-shift that can deoptimize.
+// Regression test for issue 19330.
+
+test_shl(w, x) {
+  x += 1;
+  return w << x & 0xff ;
+}
+
+main() {
+  for (var i = 0; i < 20; i++) test_shl(i, i % 10);
+  Expect.equals(4, test_shl(1, 1));
+}
+
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 5176cbf..bc764ba 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -20,9 +20,6 @@
 mirrors/deferred_mirrors_metadata_test: Fail # Issue 16898
 mirrors/deferred_mirrors_metatarget_test: Fail # Issue 16898
 
-[ $compiler == dart2js && $checked && $runtime == drt && $nocsp ]
-async/stream_transform_test: RuntimeError # Issue 16719
-
 [ $compiler == dart2js ]
 async/schedule_microtask6_test: RuntimeError # global error handling is not supported. http://dartbug.com/5958
 
@@ -72,6 +69,7 @@
 mirrors/library_imports_prefixed_test: RuntimeError # Issue 6490
 mirrors/library_imports_prefixed_show_hide_test: RuntimeError # Issue 6490
 mirrors/library_uri_io_test: Skip # Not intended for dart2js as it uses dart:io.
+mirrors/lru_test: Skip # dart2js_native/lru_test is used instead
 mirrors/metadata_allowed_values_test/01: MissingCompileTimeError # Issue 14548
 mirrors/metadata_allowed_values_test/05: MissingCompileTimeError # Issue 14548
 mirrors/metadata_allowed_values_test/10: MissingCompileTimeError # Issue 14548
@@ -85,6 +83,7 @@
 mirrors/method_mirror_source_line_ending_test : RuntimeError # Issue 6490
 mirrors/method_mirror_location_test: RuntimeError # Issue 6490
 mirrors/mirrors_test: RuntimeError # TODO(ahe): I'm working on fixing this. When removing this line please change the "endsWith" to "/mirrors_test.dart".
+mirrors/mirrors_nsm_test/dart2js: RuntimeError # Issue 19353
 mirrors/mixin_test: RuntimeError # Issue 12464
 mirrors/mixin_application_test/none: RuntimeError # Issue 12464
 mirrors/parameter_test/none: RuntimeError # Issue 6490
@@ -249,40 +248,29 @@
 
 async/timer_not_available_test: SkipByDesign # only meant to test when there is no way to implement timer (currently only in d8)
 
-mirrors/mirrors_nsm_test/vm: Fail # Issue 18042
-
 [ $compiler == none && ( $runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 async/schedule_microtask6_test: Fail # Issue 10910
+async/timer_test: Fail, Pass # Issue 15487
+async/multiple_timer_test: Fail, Pass # Issue 15487
+async/stream_periodic3_test: Fail, Pass # Issue 15487
+async/timer_isolate_test: Fail, Pass # Issue 15487. Issue 13921: spawnFunction is not allowed on Dartium's DOM thread.
 mirrors/immutable_collections_test: Pass, Slow # Dartium debug uses -O0
 mirrors/mirrors_reader_test: Pass, Slow # Dartium debug uses -O0
 mirrors/library_uri_io_test: Skip # Not intended for drt as it uses dart:io.
 mirrors/local_isolate_test: Skip # http://dartbug.com/12188
-
-[ $compiler == none && ( $runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
-async/timer_test: Fail, Pass # Issue 15487
-async/multiple_timer_test: Fail, Pass # Issue 15487
-async/stream_periodic3_test: Fail, Pass # Issue 15487
-async/timer_isolate_test: Fail, Pass # Issue 15487
+mirrors/deferred*: Skip # Lazy deferred loading not yet implemented. Issue 19449. Crashes drt in checked mode.
 
 [ $compiler == none && $runtime == drt && $system == windows ]
 async/multiple_timer_test: Fail, Pass # See Issue 10982
 async/timer_test: Fail, Pass # See Issue 10982
 
-[ $arch == simmips || $arch == mips ]
-convert/chunked_conversion_utf88_test: Skip  # Pass, Slow Issue 12025.
-convert/streamed_conversion_json_utf8_decode_test: Skip  # Pass, Slow
-
-[ $arch == simarm ]
-convert/chunked_conversion_utf88_test: Skip  # Pass, Slow Issue 12644.
-convert/utf85_test: Skip  # Pass, Slow Issue 12644.
-
 [ $compiler == none && $runtime == dartium ]
 async/schedule_microtask5_test: Pass, Timeout # Issue 13719: Please triage this failure.
 async/timer_cancel2_test: Pass, Timeout # Issue 13719: Please triage this failure.
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
-# Issue 13921: spawnFunction is not allowed on Dartium's DOM thread.
-async/timer_isolate_test: Fail
+[$compiler == none && $runtime == ContentShellOnAndroid ]
+mirrors/lazy_static_test: Skip # Times out. Issue 19127
+mirrors/mirrors_reader_test: Skip # Times out. Issue 19127
 
 [ $compiler == dart2dart || ($compiler == none && ($runtime == drt || $runtime == dartium || $runtime == vm || $runtime == ContentShellOnAndroid)) ]
 # Deferred loading is not implemented in the VM so the error-handling will never be triggered.
@@ -302,6 +290,8 @@
 
 mirrors/immutable_collections_test: StaticWarning, OK # Expect failure for any type of Iterable.
 mirrors/inference_and_no_such_method_test: StaticWarning, OK # Expect to trigger noSuchMethod.
+mirrors/mirrors_nsm_test: StaticWarning, OK # Expect to trigger noSuchMethod.
+
 mirrors/repeated_private_anon_mixin_app_test: StaticWarning, OK # Intentional library name conflict.
 mirrors/removed_api_test: StaticWarning, OK # Deliberately refers to undeclared members.
 
@@ -313,3 +303,11 @@
 
 [ $compiler == dart2js && $mode == debug ]
 mirrors/native_class_test: Pass, Slow
+
+[ $arch == simmips || $arch == mips ]
+convert/chunked_conversion_utf88_test: Skip  # Pass, Slow Issue 12025.
+convert/streamed_conversion_json_utf8_decode_test: Skip  # Pass, Slow
+
+[ $arch == simarm ]
+convert/chunked_conversion_utf88_test: Skip  # Pass, Slow Issue 12644.
+convert/utf85_test: Skip  # Pass, Slow Issue 12644.
diff --git a/tests/lib/mirrors/lru_expect.dart b/tests/lib/mirrors/lru_expect.dart
new file mode 100644
index 0000000..a048fcb
--- /dev/null
+++ b/tests/lib/mirrors/lru_expect.dart
@@ -0,0 +1,27 @@
+// 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";
+
+expect(lruMapFactory) {
+  Expect.throws(() => lruMapFactory(0), (e) => e is Exception);
+
+  for (int shift = 1; shift < 5; shift++) {
+    var map = lruMapFactory(shift);
+    var capacity = (1 << shift) * 3 ~/ 4;
+    for (int value = 0; value < 100; value++) {
+      var key = "$value";
+      map[key] = value;
+      Expect.equals(value, map[key]);
+    }
+    for (int value = 0; value < 100 - capacity - 1; value++) {
+      var key = "$value";
+      Expect.equals(null, map[key]);
+    }
+    for (int value = 100 - capacity; value < 100; value++) {
+      var key = "$value";
+      Expect.equals(value, map[key]);
+    }
+  }
+}
diff --git a/tests/lib/mirrors/lru_test.dart b/tests/lib/mirrors/lru_test.dart
index 141fc98..1a0c8fd 100644
--- a/tests/lib/mirrors/lru_test.dart
+++ b/tests/lib/mirrors/lru_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:mirrors";
-import "package:expect/expect.dart";
+import "lru_expect.dart";
 
 newLRUMapWithShift(int shift) {
   var lib = currentMirrorSystem().libraries[Uri.parse("dart:_internal")];
@@ -12,23 +12,5 @@
 }
 
 main() {
-  Expect.throws(() => newLRUMapWithShift(0), (e) => e is Exception);
-
-  for (int shift = 1; shift < 5; shift++) {
-    var map = newLRUMapWithShift(shift);
-    var capacity = (1 << shift) * 3 ~/ 4;
-    for (int value = 0; value < 100; value++) {
-      var key = "$value";
-      map[key] = value;
-      Expect.equals(value, map[key]);
-    }
-    for (int value = 0; value < 100 - capacity - 1; value++) {
-      var key = "$value";
-      Expect.equals(null, map[key]);
-    }
-    for (int value = 100 - capacity; value < 100; value++) {
-      var key = "$value";
-      Expect.equals(value, map[key]);
-    }
-  }
-}
\ No newline at end of file
+  expect(newLRUMapWithShift);
+}
diff --git a/tests/lib/mirrors/mirrors_nsm_test.dart b/tests/lib/mirrors/mirrors_nsm_test.dart
index 88ad27c..f1abaa7 100644
--- a/tests/lib/mirrors/mirrors_nsm_test.dart
+++ b/tests/lib/mirrors/mirrors_nsm_test.dart
@@ -15,25 +15,33 @@
   return "$e".contains(needle) && ! "$e".contains(needle + "=");
 }
 
-class A {}
+final finalTopLevel = 0;
+class A {
+  final finalInstance = 0;
+  static final finalStatic = 0;
+}
 
-main() {
+testMessageContents() {
   var mirrors = currentMirrorSystem();
   var libMirror = mirrors.findLibrary(#MirrorsTest);
   Expect.throws(() => libMirror.invoke(#foo, []),
                 (e) => isNSMContainingFieldName(e, "foo", false));
   Expect.throws(() => libMirror.getField(#foo),
                 (e) => isNSMContainingFieldName(e, "foo", false));
-  Expect.throws(() => libMirror.setField(#foo, null),             /// vm: ok
-                (e) => isNSMContainingFieldName(e, "foo", true)); /// vm: continued
+  Expect.throws(() => libMirror.setField(#foo, null),
+                (e) => isNSMContainingFieldName(e, "foo", true));
+  Expect.throws(() => libMirror.setField(#finalTopLevel, null),
+                (e) => isNSMContainingFieldName(e, "finalTopLevel", true));
 
-  var classMirror = reflect(A);
+  var classMirror = reflectClass(A);
   Expect.throws(() => classMirror.invoke(#foo, []),
                 (e) => isNSMContainingFieldName(e, "foo", false));
   Expect.throws(() => classMirror.getField(#foo),
                 (e) => isNSMContainingFieldName(e, "foo", false));
   Expect.throws(() => classMirror.setField(#foo, null),
                 (e) => isNSMContainingFieldName(e, "foo", true));
+  Expect.throws(() => classMirror.setField(#finalStatic, null),
+                (e) => isNSMContainingFieldName(e, "finalStatic", true));
 
   var instanceMirror = reflect(new A());
   Expect.throws(() => instanceMirror.invoke(#foo, []),
@@ -42,5 +50,61 @@
                 (e) => isNSMContainingFieldName(e, "foo", false));
   Expect.throws(() => instanceMirror.setField(#foo, null),
                 (e) => isNSMContainingFieldName(e, "foo", true));
-
+  Expect.throws(() => instanceMirror.setField(#finalInstance, null),
+                (e) => isNSMContainingFieldName(e, "finalInstance", true));
 }
+
+expectMatchingErrors(reflectiveAction, baseAction) {
+  var reflectiveError, baseError;
+  try {
+    reflectiveAction();
+  } catch(e) {
+    reflectiveError = e;
+  }
+  try {
+    baseAction();
+  } catch(e) {
+    baseError = e;
+  }
+  print("\n==Base==\n $baseError");
+  print("\n==Reflective==\n $reflectiveError");
+  Expect.stringEquals(baseError.toString(), reflectiveError.toString());
+}
+
+testMatchingMessages() {
+  var mirrors = currentMirrorSystem();
+  var libMirror = mirrors.findLibrary(#MirrorsTest);
+  expectMatchingErrors(() => libMirror.invoke(#foo, []),
+                       () => foo());
+  expectMatchingErrors(() => libMirror.getField(#foo),
+                       () => foo);
+  expectMatchingErrors(() => libMirror.setField(#foo, null),
+                       () => foo= null);
+  expectMatchingErrors(() => libMirror.setField(#finalTopLevel, null),
+                       () => finalTopLevel= null);
+
+  var classMirror = reflectClass(A);
+  expectMatchingErrors(() => classMirror.invoke(#foo, []),
+                       () => A.foo());
+  expectMatchingErrors(() => classMirror.getField(#foo),
+                       () => A.foo);
+  expectMatchingErrors(() => classMirror.setField(#foo, null),
+                       () => A.foo= null);
+  expectMatchingErrors(() => classMirror.setField(#finalStatic, null),
+                       () => A.finalStatic= null);
+
+  var instanceMirror = reflect(new A());
+  expectMatchingErrors(() => instanceMirror.invoke(#foo, []),
+                       () => new A().foo());
+  expectMatchingErrors(() => instanceMirror.getField(#foo),
+                       () => new A().foo);
+  expectMatchingErrors(() => instanceMirror.setField(#foo, null),
+                       () => new A().foo= null);
+  expectMatchingErrors(() => instanceMirror.setField(#finalInstance, null),
+                       () => new A().finalInstance= null);
+}
+
+main() {
+  testMessageContents();
+  testMatchingMessages(); /// dart2js: ok
+}
\ No newline at end of file
diff --git a/tests/standalone/full_coverage_test.dart b/tests/standalone/full_coverage_test.dart
new file mode 100644
index 0000000..7bba623
--- /dev/null
+++ b/tests/standalone/full_coverage_test.dart
@@ -0,0 +1,231 @@
+// 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.
+
+// These tests fork a second VM process that runs the script
+// ``tools/full-coverage.dart'' and verifies that the tool
+// produces the expeced output.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:unittest/unittest.dart';
+
+final String coverageScript = "tools/full-coverage.dart";
+final String packageRoot = Platform.packageRoot;
+final List dartBaseArgs = ['--package-root=${packageRoot}', '--checked',];
+
+// With line numbers starting at 0, the list of hits can be understood as
+// follows:
+// * -1: No coverage data on this line.
+// *  0: No hits on this line.
+// *  1: ``Some'' hits on this line.
+final coverageTests = [
+  {
+    'name': 'faculty',
+    'program': '''
+dummy () {
+  for (int i = 0; i < 100; i++) {
+    print(i);
+  }
+}
+
+int fac(int n) {
+  int f = 1;
+  for (int i = 1; i <= n; i++) {
+    f *= i;
+  }
+  return f;
+}
+
+main() {
+  if (false) {
+    dummy(11);
+  } else {
+    fac(10);
+  }
+}
+''',
+    'expectedHits': [-1, 0, 0, -1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1, -1, -1,
+                     0, -1, 1, -1, -1]
+  },{
+    'name': 'closures',
+    'program': '''
+main() {
+  foo(bar) {
+    bar();
+  }
+
+  foo(() {
+    print("in closure");
+  });
+}
+''',
+    'expectedHits': [-1, -1, 1, -1, -1, 1, 1, -1, -1]
+  }
+];
+
+
+String prepareEnv() {
+  Directory testDir = Directory.systemTemp.createTempSync("coverage-");
+  for (var coverageProg in coverageTests) {
+    var coverageProgDir = new Directory(
+        path.join(testDir.path, coverageProg["name"]))
+      ..createSync();
+    var f = new File(path.join(coverageProgDir.path,
+        "${coverageProg['name']}.dart"));
+    f.writeAsStringSync(coverageProg["program"], mode: FileMode.WRITE);
+  }
+  return testDir.path;
+}
+
+
+destroyEnv(base) => new Directory(base).deleteSync(recursive: true);
+
+
+generateCoverage(String workingDirectory) {
+  for (var coverageProg in coverageTests) {
+    var progPath = path.join(workingDirectory, coverageProg['name']);
+    var script = path.join(progPath, "${coverageProg['name']}.dart");
+    var dartArgs = new List.from(dartBaseArgs)
+      ..addAll(['--coverage-dir=${progPath}', '${script}']);
+    var result = Process.runSync(Platform.executable, dartArgs);
+    expect(result.exitCode, 0);
+  }
+}
+
+
+Future<Process> convertCoverage(String programDir, String format) {
+  var dartArgs = new List.from(dartBaseArgs)
+      ..addAll([
+        coverageScript,
+        '--package-root=${packageRoot}',
+        '--in=${programDir}',
+        format
+      ]);
+  return Process.start(Platform.executable, dartArgs);
+}
+
+
+class PrettyPrintDescriptor {
+  var _programPath;
+  var _validFormat = new RegExp(r"^\s*\d*\|.*$", multiLine: true);
+  var _pattern = new RegExp(r"^\s*(\d+)\|", multiLine: true);
+
+  PrettyPrintDescriptor(this._programPath);
+
+  get sectionStart => _programPath;
+  get sectionEnd => '/';
+  get coverageParameter => '--pretty-print';
+
+  hitData(line) {
+    expect(_validFormat.hasMatch(line), isTrue);
+    var match = _pattern.firstMatch(line);
+    var result = -1;
+    if (match != null) {
+      result = (int.parse(match.group(1)) != 0) ? 1 : 0;
+    }
+    return [result];
+  }
+}
+
+
+class LcovDescriptor {
+  var _pattern = new RegExp(r"^DA:(\d+),(\d+)$", multiLine: true);
+  var _programPath;
+  var _line_nr = 0;
+
+  LcovDescriptor(this._programPath);
+
+  get sectionStart => 'SF:${_programPath}';
+  get sectionEnd => 'end_of_record';
+  get coverageParameter => '--lcov';
+
+  hitData(line) {
+    expect(_pattern.hasMatch(line), isTrue);
+    var match = _pattern.firstMatch(line);
+    // Lcov data starts at line 1, we start at 0.
+    var out_line = int.parse(match[1]) - 1;
+    var hitCount = int.parse(match[2]);
+    var result = [];
+    for ( ; _line_nr < out_line; _line_nr++) {
+      result.add(-1);
+    }
+    result.add((hitCount != 0) ? 1 : 0);
+    _line_nr++;
+    return result;
+  }
+}
+
+
+Stream filterHitData(input, descriptor) {
+  bool in_program_section = false;
+  return input.where((line) {
+    if (in_program_section) {
+      if (line.startsWith(descriptor.sectionEnd)) {
+        in_program_section = false;
+        return false;
+      }
+      return true;
+    }
+    if (line.startsWith(descriptor.sectionStart)) {
+      in_program_section = true;
+    }
+    return false;
+  }).map((line) {
+    return descriptor.hitData(line);
+  });
+}
+
+
+testCoverage(String programDir, String programPath, descriptor,
+             List expectedHitMap) {
+  var p = convertCoverage(programDir, descriptor.coverageParameter);
+  expect(p.then((process) {
+    var hitStream = filterHitData(
+        process.stdout.transform(UTF8.decoder)
+                      .transform(const LineSplitter()),
+        descriptor);
+    var hitMap = [];
+    var subscription = hitStream.listen((data) {
+      // Flatten results.
+      data.forEach((e) => hitMap.add(e));
+    });
+    expect(subscription.asFuture().then((_) {
+      hitMap.forEach((e) {
+        expect(e, expectedHitMap.removeAt(0));
+      });
+      // Make sure that there are only lines left that do not contain coverage
+      // data.
+      expectedHitMap.forEach((e) => expect(e, -1));
+    }), completes);
+  }), completes);
+}
+
+
+main() {
+  String testingDirectory;
+
+  setUp(() {
+    testingDirectory = prepareEnv();
+  });
+
+  tearDown(() => destroyEnv(testingDirectory));
+
+  test('CoverageTests', () {
+    generateCoverage(testingDirectory);
+
+    coverageTests.forEach((cTest) {
+      String programDir = path.join(testingDirectory, cTest['name']);
+      String programPath = path.join(programDir, "${cTest['name']}.dart");
+      testCoverage(programDir, programPath,
+                   new LcovDescriptor(programPath),
+                   new List.from(cTest['expectedHits']));
+      testCoverage(programDir, programPath,
+                   new PrettyPrintDescriptor(programPath),
+                   new List.from(cTest['expectedHits']));
+    });
+  });
+}
diff --git a/tests/standalone/io/file_typed_data_test.dart b/tests/standalone/io/file_typed_data_test.dart
index 882ed54..7c0cfa0 100644
--- a/tests/standalone/io/file_typed_data_test.dart
+++ b/tests/standalone/io/file_typed_data_test.dart
@@ -143,7 +143,8 @@
       for (int i = 0; i < content.length; i++) {
         typed_data_content[i] = content[i];
       }
-      Expect.listEquals(expected, new Int16List.view(typed_data_content));
+      Expect.listEquals(expected,
+                        new Int16List.view(typed_data_content.buffer));
       temp.deleteSync(recursive: true);
       asyncEnd();
     });
@@ -187,7 +188,8 @@
       for (int i = 0; i < content.length; i++) {
         typed_data_content[i] = content[i];
       }
-      Expect.listEquals(expected, new Uint16List.view(typed_data_content));
+      Expect.listEquals(expected,
+                        new Uint16List.view(typed_data_content.buffer));
       temp.deleteSync(recursive: true);
       asyncEnd();
     });
@@ -231,7 +233,8 @@
       for (int i = 0; i < content.length; i++) {
         typed_data_content[i] = content[i];
       }
-      Expect.listEquals(expected, new Int32List.view(typed_data_content));
+      Expect.listEquals(expected,
+                        new Int32List.view(typed_data_content.buffer));
       temp.deleteSync(recursive: true);
       asyncEnd();
     });
@@ -275,7 +278,8 @@
       for (int i = 0; i < content.length; i++) {
         typed_data_content[i] = content[i];
       }
-      Expect.listEquals(expected, new Uint32List.view(typed_data_content));
+      Expect.listEquals(expected,
+                        new Uint32List.view(typed_data_content.buffer));
       temp.deleteSync(recursive: true);
       asyncEnd();
     });
@@ -319,7 +323,8 @@
       for (int i = 0; i < content.length; i++) {
         typed_data_content[i] = content[i];
       }
-      Expect.listEquals(expected, new Int64List.view(typed_data_content));
+      Expect.listEquals(expected,
+                        new Int64List.view(typed_data_content.buffer));
       temp.deleteSync(recursive: true);
       asyncEnd();
     });
@@ -363,7 +368,8 @@
       for (int i = 0; i < content.length; i++) {
         typed_data_content[i] = content[i];
       }
-      Expect.listEquals(expected, new Uint64List.view(typed_data_content));
+      Expect.listEquals(expected,
+                        new Uint64List.view(typed_data_content.buffer));
       temp.deleteSync(recursive: true);
       asyncEnd();
     });
diff --git a/tests/standalone/io/http_client_exception_test.dart b/tests/standalone/io/http_client_exception_test.dart
index 4a5ab98..a2bb7a8 100644
--- a/tests/standalone/io/http_client_exception_test.dart
+++ b/tests/standalone/io/http_client_exception_test.dart
@@ -18,7 +18,7 @@
       (e) => e.toString().contains("Unsupported scheme"));
   Expect.throws(
       () => client.getUrl(Uri.parse('http://::1')),
-      (e) => e.toString().contains("No host specified"));
+      (e) => e is FormatException);
   Expect.throws(
       () => client.getUrl(Uri.parse('http://user@:1')),
       (e) => e.toString().contains("No host specified"));
diff --git a/tests/standalone/io/http_proxy_configuration_test.dart b/tests/standalone/io/http_proxy_configuration_test.dart
index 64aa3b0..0d1f57d 100644
--- a/tests/standalone/io/http_proxy_configuration_test.dart
+++ b/tests/standalone/io/http_proxy_configuration_test.dart
@@ -43,26 +43,26 @@
          {"http_proxy": "www.proxy.com:8080",
           "https_proxy": "www.proxys.com:8080"});
 
-  expect("PROXY [::FFFF:1]:1080",
+  expect("PROXY [::ffff:1]:1080",
          "http://www.google.com",
-         {"http_proxy": "[::FFFF:1]"});
-  expect("PROXY [::FFFF:2]:1080",
+         {"http_proxy": "[::ffff:1]"});
+  expect("PROXY [::ffff:2]:1080",
          "https://www.google.com",
-         {"https_proxy": "[::FFFF:2]"});
-  expect("PROXY [::FFFF:1]:8080",
+         {"https_proxy": "[::ffff:2]"});
+  expect("PROXY [::ffff:1]:8080",
          "http://www.google.com",
-         {"http_proxy": "[::FFFF:1]:8080"});
-  expect("PROXY [::FFFF:2]:8080",
+         {"http_proxy": "[::ffff:1]:8080"});
+  expect("PROXY [::ffff:2]:8080",
          "https://www.google.com",
-         {"https_proxy": "[::FFFF:2]:8080"});
-  expect("PROXY [::FFFF:1]:8080",
+         {"https_proxy": "[::ffff:2]:8080"});
+  expect("PROXY [::ffff:1]:8080",
          "http://www.google.com",
-         {"http_proxy": "[::FFFF:1]:8080",
-          "https_proxy": "[::FFFF:2]:8080"});
-  expect("PROXY [::FFFF:2]:8080",
+         {"http_proxy": "[::ffff:1]:8080",
+          "https_proxy": "[::ffff:2]:8080"});
+  expect("PROXY [::ffff:2]:8080",
          "https://www.google.com",
-         {"http_proxy": "[::FFFF:1]:8080",
-          "https_proxy": "[::FFFF:2]:8080"});
+         {"http_proxy": "[::ffff:1]:8080",
+          "https_proxy": "[::ffff:2]:8080"});
 
   expect("PROXY www.proxy.com:1080",
          "http://www.google.com",
@@ -93,34 +93,34 @@
          {"http_proxy": "http://www.proxy.com:8080/",
           "https_proxy": "http://www.proxys.com:8080/index.html"});
 
-  expect("PROXY [::FFFF:1]:1080",
+  expect("PROXY [::ffff:1]:1080",
          "http://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]"});
-  expect("PROXY [::FFFF:1]:1080",
+         {"http_proxy": "http://[::ffff:1]"});
+  expect("PROXY [::ffff:1]:1080",
          "http://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]/"});
-  expect("PROXY [::FFFF:1]:8080",
+         {"http_proxy": "http://[::ffff:1]/"});
+  expect("PROXY [::ffff:1]:8080",
          "http://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]:8080/"});
-  expect("PROXY [::FFFF:1]:8080",
+         {"http_proxy": "http://[::ffff:1]:8080/"});
+  expect("PROXY [::ffff:1]:8080",
          "http://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]:8080/index.html"});
-  expect("PROXY [::FFFF:1]:8080",
+         {"http_proxy": "http://[::ffff:1]:8080/index.html"});
+  expect("PROXY [::ffff:1]:8080",
          "http://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]:8080/",
-          "https_proxy": "http://[::FFFF:1]:8080/"});
-  expect("PROXY [::FFFF:2]:8080",
+         {"http_proxy": "http://[::ffff:1]:8080/",
+          "https_proxy": "http://[::ffff:1]:8080/"});
+  expect("PROXY [::ffff:2]:8080",
          "https://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]:8080/",
-          "https_proxy": "http://[::FFFF:2]:8080/"});
-  expect("PROXY [::FFFF:1]:8080",
+         {"http_proxy": "http://[::ffff:1]:8080/",
+          "https_proxy": "http://[::ffff:2]:8080/"});
+  expect("PROXY [::ffff:1]:8080",
          "http://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]:8080/",
-          "https_proxy": "http://[::FFFF:1]:8080/index.html"});
-  expect("PROXY [::FFFF:2]:8080",
+         {"http_proxy": "http://[::ffff:1]:8080/",
+          "https_proxy": "http://[::ffff:1]:8080/index.html"});
+  expect("PROXY [::ffff:2]:8080",
          "https://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]:8080/",
-          "https_proxy": "http://[::FFFF:2]:8080/index.html"});
+         {"http_proxy": "http://[::ffff:1]:8080/",
+          "https_proxy": "http://[::ffff:2]:8080/index.html"});
 
   expectDirect("http://www.google.com",
                {"http_proxy": "www.proxy.com:8080",
@@ -141,18 +141,18 @@
                {"https_proxy": "www.proxy.com:8080"});
 
   expect("PROXY www.proxy.com:8080",
-         "http://[::FFFF:1]",
+         "http://[::ffff:1]",
          {"http_proxy": "www.proxy.com:8080",
           "no_proxy": "["});
   expect("PROXY www.proxy.com:8080",
-         "http://[::FFFF:1]",
+         "http://[::ffff:1]",
          {"http_proxy": "www.proxy.com:8080",
           "no_proxy": "[]"});
 
-  expectDirect("http://[::FFFF:1]",
+  expectDirect("http://[::ffff:1]",
                {"http_proxy": "www.proxy.com:8080",
-                "no_proxy": "[::FFFF:1]"});
-  expectDirect("http://[::FFFF:1]",
+                "no_proxy": "[::ffff:1]"});
+  expectDirect("http://[::ffff:1]",
                {"http_proxy": "www.proxy.com:8080",
-                "no_proxy": ",,  , www.google.edu,,[::FFFF:1]    "});
+                "no_proxy": ",,  , www.google.edu,,[::ffff:1]    "});
 }
diff --git a/tests/standalone/io/observatory_test.dart b/tests/standalone/io/observatory_test.dart
new file mode 100644
index 0000000..b9a656e
--- /dev/null
+++ b/tests/standalone/io/observatory_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 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+Map lookupServiceObject(String path) {
+  var io = currentMirrorSystem().findLibrary(const Symbol('dart.io'));
+  var m = MirrorSystem.getSymbol('_serviceObjectHandler', io);
+  var paths = Uri.parse(path).pathSegments;
+  Expect.equals('io', paths.first);
+  return JSON.decode(
+      io.invoke(m, [paths.sublist(1), [], []]).reflectee);
+}
+
+
+String getServicePath(obj) {
+  var io = currentMirrorSystem().findLibrary(const Symbol('dart.io'));
+  var m = MirrorSystem.getSymbol('_getServicePath', io);
+  return io.invoke(m, [obj]).reflectee;
+}
+
+
+Future testHttpServer1() {
+  return HttpServer.bind('localhost', 0).then((server) {
+    var path = getServicePath(server);
+    var map = lookupServiceObject(path);
+    Expect.equals(map['type'], 'HttpServer');
+    Expect.equals(map['id'], path);
+    Expect.equals(map['address'], 'localhost');
+    Expect.equals(map['port'], server.port);
+    Expect.equals(map['closed'], false);
+    Expect.listEquals(map['idle'], []);
+    Expect.listEquals(map['active'], []);
+    var socket = map['socket'];
+    Expect.equals(socket['type'], '@Socket');
+    Expect.equals(socket['kind'], 'Listening');
+    // Validate owner back-ref.
+    socket = lookupServiceObject(socket['id']);
+    Expect.equals(socket['owner']['id'], path);
+    return server.close();
+  });
+}
+
+
+Future testHttpServerConnection1() {
+  return HttpServer.bind('localhost', 0).then((server) {
+    server.listen((request) {
+      var map = lookupServiceObject(getServicePath(server));
+      Expect.listEquals(map['idle'], []);
+      Expect.equals(map['active'].length, 1);
+      var active = map['active'].first;
+      Expect.equals(active['type'], '@HttpServerConnection');
+      var path = active['id'];
+      map = lookupServiceObject(path);
+      Expect.equals(map['type'], 'HttpServerConnection');
+      var socket = map['socket'];
+      Expect.equals(socket['type'], '@Socket');
+      Expect.equals(socket['kind'], 'Normal');
+      // Validate owner back-ref.
+      socket = lookupServiceObject(socket['id']);
+      Expect.equals(socket['owner']['id'], path);
+      request.response.close();
+    });
+    var client = new HttpClient();
+    return client.get('localhost', server.port, '/')
+        .then((request) => request.close())
+        .then((response) => response.drain())
+        .then((_) {
+          // The connection should be idle now.
+          var map = lookupServiceObject(getServicePath(server));
+          Expect.equals(map['idle'].length, 1);
+          Expect.listEquals(map['active'], []);
+          return server.close();
+        });
+
+  });
+}
+
+
+void main() {
+  final tests = [
+    testHttpServer1(),
+    testHttpServerConnection1(),
+  ];
+
+  asyncStart();
+  // Run one test at a time.
+  Future.forEach(tests, (f) => f)
+      .then((_) {
+        asyncEnd();
+      });
+}
diff --git a/tests/standalone/io/raw_socket_test.dart b/tests/standalone/io/raw_socket_test.dart
index bc537f5..4acc6ee 100644
--- a/tests/standalone/io/raw_socket_test.dart
+++ b/tests/standalone/io/raw_socket_test.dart
@@ -23,6 +23,7 @@
   asyncStart();
   RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((s) {
     Expect.isTrue(s.port > 0);
+    s.close();
     asyncEnd();
   });
 }
@@ -56,6 +57,7 @@
             })
             .catchError((error) {
               Expect.isTrue(error is SocketException);
+              s.close();
               asyncEnd();
             });
       });
diff --git a/tests/standalone/io/socket_exception_test.dart b/tests/standalone/io/socket_exception_test.dart
index 58abb85..40a5851 100644
--- a/tests/standalone/io/socket_exception_test.dart
+++ b/tests/standalone/io/socket_exception_test.dart
@@ -207,9 +207,11 @@
         int errors = 0;
         client.add(new List.filled(SIZE, 0));
         client.close();
-        client.done.catchError((error) {
-          server.close();
-        });
+        client.done
+            .catchError((_) {})
+            .whenComplete(() {
+              server.close();
+            });
         // Destroy other socket now.
         completer.complete(null);
       });
diff --git a/tests/standalone/io/socket_test.dart b/tests/standalone/io/socket_test.dart
index 3ebadf8..0cca8e4 100644
--- a/tests/standalone/io/socket_test.dart
+++ b/tests/standalone/io/socket_test.dart
@@ -23,6 +23,7 @@
   asyncStart();
   ServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((s) {
     Expect.isTrue(s.port > 0);
+    s.close();
     asyncEnd();
   });
 }
diff --git a/tests/standalone/io/test_runner_test.dart b/tests/standalone/io/test_runner_test.dart
index 61e762b..d3f80e0 100644
--- a/tests/standalone/io/test_runner_test.dart
+++ b/tests/standalone/io/test_runner_test.dart
@@ -30,7 +30,8 @@
             new String.fromCharCodes(testCase.lastCommandOutput.stderr);
         print("stdout = [$stdout]");
         print("stderr = [$stderr]");
-        throw "Expected fail-unexpected: ${testCase.result}";
+        throw "Test case ${testCase.displayName} passed unexpectedly, "
+              "result == ${testCase.result}";
       }
     } else {
       if (testCase.unexpectedOutput) {
@@ -40,7 +41,8 @@
             new String.fromCharCodes(testCase.lastCommandOutput.stderr);
         print("stdout = [$stdout]");
         print("stderr = [$stderr]");
-        throw "Unexpected fail";
+        throw "Test case ${testCase.displayName} failed, "
+              "result == ${testCase.result}";
       }
     }
   }
diff --git a/tests/standalone/issue14236_source.dart b/tests/standalone/issue14236_source.dart
index 4a55aa9..65becdf 100644
--- a/tests/standalone/issue14236_source.dart
+++ b/tests/standalone/issue14236_source.dart
@@ -14,6 +14,8 @@
 // Steps for regenerating:
 // 1) Swap the test functions below.
 // 2) $ ./xcodebuild/DebugIA32/dart --package-root=./xcodebuild/DebugIA32/packages --snapshot=tests/standalone/issue14236_test.dart tests/standalone/issue14236_source.dart
+// OR:
+// 2) $ ./out/DebugIA32/dart --package-root=./out/DebugIA32/packages --snapshot=tests/standalone/issue14236_test.dart tests/standalone/issue14236_source.dart
 // 3) Undo changes in 1.
 
 library test.issue14236;
diff --git a/tests/standalone/issue14236_test.dart b/tests/standalone/issue14236_test.dart
index f103ca2..8fa1ddd 100644
--- a/tests/standalone/issue14236_test.dart
+++ b/tests/standalone/issue14236_test.dart
Binary files differ
diff --git a/tests/standalone/javascript_compatibility_errors_test.dart b/tests/standalone/javascript_compatibility_errors_test.dart
index 888ff20..6404a2e 100644
--- a/tests/standalone/javascript_compatibility_errors_test.dart
+++ b/tests/standalone/javascript_compatibility_errors_test.dart
@@ -7,15 +7,15 @@
 import "package:expect/expect.dart";
 
 f(x, y) {
-  // Unoptimized code.
-  1 is double;  /// 00: compile-time error
-  if (1 is double) { x++; }  /// 01: compile-time error
-  try { 1 as double; } on CastError catch (e) { }  /// 02: compile-time error
-  try { var y = 1 as double; } on CastError catch (e) { }  /// 03: compile-time error
-  1.0 is int;  /// 04: compile-time error
-  if (1.0 is int) { x++; }  /// 05: compile-time error
-  try { 1.0 as int; } on CastError catch (e) { }  /// 06: compile-time error
-  try { var z = 1.0 as int; } on CastError catch (e) { }  /// 07: compile-time error
+  // Unoptimized and optimized code.
+  1 is double;  /// 00: ok
+  if (1 is double) { x++; }  /// 01: ok
+  try { 1 as double; } on CastError catch (e) { }  /// 02: ok
+  try { var y = 1 as double; } on CastError catch (e) { }  /// 03: ok
+  1.0 is int;  /// 04: ok
+  if (1.0 is int) { x++; }  /// 05: ok
+  try { 1.0 as int; } on CastError catch (e) { }  /// 06: ok
+  try { var z = 1.0 as int; } on CastError catch (e) { }  /// 07: ok
 
   x is double;  /// 10: ok
   if (x is double) { }  /// 11: ok
@@ -26,8 +26,11 @@
   try { y as int; } on CastError catch (e) { }  /// 16: ok
   try { var z = y as int; } on CastError catch (e) { }  /// 17: ok
 
+  // It is a compile-time error if evaluation of a constant object results in
+  // an uncaught exception being thrown, a JavascriptCompatibilityError here.
   "${1.0}";  /// 20: compile-time error
   var z = "${1.0}";  /// 21: compile-time error
+
   (1.0).toString();  /// 22: ok
   var z = (1.0).toString();  /// 23: ok
   "$y";  /// 24: ok
@@ -35,30 +38,47 @@
   y.toString();  /// 26: ok
   var z = y.toString();  /// 27: ok
 
+  var a = "yz";
+  var b = "xyz";
+  b = b.substring(1);
+  if (identical(a, b)) { }  /// 28: ok
+
+  if (identical(x, y)) { }  /// 29: ok
+  if (identical(y, x)) { }  /// 30: ok
+
   if (x > 10) {
     // Optimized code.
-    x is double;  /// 30: ok
-    if (x is double) { }  /// 31: ok
-    try { x as double; } on CastError catch (e) { }  /// 32: ok
-    try { var z = x as double; } on CastError catch (e) { }  /// 33: ok
-    y is int;  /// 34: ok
-    if (y is int) { }  /// 35: ok
-    try { y as int; } on CastError catch (e) { }  /// 36: ok
-    try { var z = y as int; } on CastError catch (e) { }  /// 37: ok
+    x is double;  /// 40: ok
+    if (x is double) { }  /// 41: ok
+    try { x as double; } on CastError catch (e) { }  /// 42: ok
+    try { var z = x as double; } on CastError catch (e) { }  /// 43: ok
+    y is int;  /// 44: ok
+    if (y is int) { }  /// 45: ok
+    try { y as int; } on CastError catch (e) { }  /// 46: ok
+    try { var z = y as int; } on CastError catch (e) { }  /// 47: ok
 
-    "${1.0}";  /// 40: compile-time error
-    var z = "${1.0}";  /// 41: compile-time error
-    (1.0).toString();  /// 42: ok
-    var z = (1.0).toString();  /// 43: ok
-    "$y";  /// 44: ok
-    var z = "$y";  /// 45: ok
-    y.toString();  /// 46: ok
-    var z = y.toString();  /// 47: ok
+    "${1.0}";  /// 50: compile-time error
+    var z = "${1.0}";  /// 51: compile-time error
+
+    (1.0).toString();  /// 52: ok
+    var z = (1.0).toString();  /// 53: ok
+    "$y";  /// 54: ok
+    var z = "$y";  /// 55: ok
+    y.toString();  /// 56: ok
+    var z = y.toString();  /// 57: ok
+
+    var a = "yz";
+    var b = "xyz";
+    b = b.substring(1);
+    if (identical(a, b)) { }  /// 58: ok
+
+    if (identical(x, y)) { }  /// 59: ok
+    if (identical(y, x)) { }  /// 60: ok
   }
 }
 
 k(x, y) {
-  // Unoptimized code.
+  // Unoptimized and optimized code.
   1.5 is double;
   if (1.5 is double) { x++; }
   try { 1.5 as double; } on CastError catch (e) { }
@@ -95,6 +115,14 @@
   y.toString();
   z = y.toString();
 
+  var a = "xyz";
+  var b = "xyz";
+  b = b.substring(1);
+  if (identical(a, b)) { }
+
+  if (identical(x, y)) { }
+  if (identical(y, x)) { }
+
   if (x > 10) {
     // Optimized code.
     x is double;
@@ -114,6 +142,14 @@
     z = "$y";
     y.toString();
     z = y.toString();
+
+    var a = "xyz";
+    var b = "xyz";
+    b = b.substring(1);
+    if (identical(a, b)) { }
+
+    if (identical(x, y)) { }
+    if (identical(y, x)) { }
   }
 }
 
@@ -126,16 +162,18 @@
     e is Error && "$e".contains("Javascript Compatibility Error");
 
 main() {
-  // Since the warning (or error in case of --warning_as_error) is issued at
-  // most once per location, the Expect.throw must guard the whole loop.
-  Expect.throws(
-      () {
-        for (var i = 0; i < 20; i++) {
-          h(i, i * 1.0);
-        }
-      },
-      isJavascriptCompatibilityError);
-
+  // The warning (or error in case of --warning_as_error) is issued at
+  // most once per location.
+  var numWarnings = 0;
+  for (var i = 0; i < 20; i++) {
+    try {
+      h(i, i * 1.0);
+    } catch(e) {
+      Expect.isTrue(isJavascriptCompatibilityError(e));
+      numWarnings++;
+    }
+  }
+  Expect.equals(1, numWarnings);
   // No warnings (errors) should be issued after this point.
   for (var i = 0; i < 20; i++) {
     k(i * 1.0, i);
diff --git a/tests/standalone/javascript_compatibility_warnings_test.dart b/tests/standalone/javascript_compatibility_warnings_test.dart
index 9d44700..bb744b1 100644
--- a/tests/standalone/javascript_compatibility_warnings_test.dart
+++ b/tests/standalone/javascript_compatibility_warnings_test.dart
@@ -7,7 +7,7 @@
 import "package:expect/expect.dart";
 
 f(x, y) {
-  // Unoptimized code.
+  // Unoptimized and optimized code.
   1 is double;  /// 00: ok
   if (1 is double) { x++; }  /// 01: ok
   try { 1 as double; } on CastError catch (e) { }  /// 02: ok
@@ -35,25 +35,41 @@
   y.toString();  /// 26: ok
   var z = y.toString();  /// 27: ok
 
+  var a = "yz";
+  var b = "xyz";
+  b = b.substring(1);
+  if (identical(a, b)) { }  /// 28: ok
+
+  if (identical(x, y)) { }  /// 29: ok
+  if (identical(y, x)) { }  /// 30: ok
+
   if (x > 10) {
     // Optimized code.
-    x is double;  /// 30: ok
-    if (x is double) { }  /// 31: ok
-    try { x as double; } on CastError catch (e) { }  /// 32: ok
-    try { var z = x as double; } on CastError catch (e) { }  /// 33: ok
-    y is int;  /// 34: ok
-    if (y is int) { }  /// 35: ok
-    try { y as int; } on CastError catch (e) { }  /// 36: ok
-    try { var z = y as int; } on CastError catch (e) { }  /// 37: ok
+    x is double;  /// 40: ok
+    if (x is double) { }  /// 41: ok
+    try { x as double; } on CastError catch (e) { }  /// 42: ok
+    try { var z = x as double; } on CastError catch (e) { }  /// 43: ok
+    y is int;  /// 44: ok
+    if (y is int) { }  /// 45: ok
+    try { y as int; } on CastError catch (e) { }  /// 46: ok
+    try { var z = y as int; } on CastError catch (e) { }  /// 47: ok
 
-    "${1.0}";  /// 40: ok
-    var z = "${1.0}";  /// 41: ok
-    (1.0).toString();  /// 42: ok
-    var z = (1.0).toString();  /// 43: ok
-    "$y";  /// 44: ok
-    var z = "$y";  /// 45: ok
-    y.toString();  /// 46: ok
-    var z = y.toString();  /// 47: ok
+    "${1.0}";  /// 50: ok
+    var z = "${1.0}";  /// 51: ok
+    (1.0).toString();  /// 52: ok
+    var z = (1.0).toString();  /// 53: ok
+    "$y";  /// 54: ok
+    var z = "$y";  /// 55: ok
+    y.toString();  /// 56: ok
+    var z = y.toString();  /// 57: ok
+
+    var a = "yz";
+    var b = "xyz";
+    b = b.substring(1);
+    if (identical(a, b)) { }  /// 58: ok
+
+    if (identical(x, y)) { }  /// 59: ok
+    if (identical(y, x)) { }  /// 60: ok
   }
 }
 
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 90ed933..3e81112 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -43,6 +43,7 @@
 package/*: Skip # Do not run those in Dartium.
 debugger/*: Skip # Do not run standalone debugger tests in browser.
 coverage_test: Skip
+full_coverage_test: Skip
 http_launch_test: Skip
 vmservice/*: Skip # Do not run standalone vm service tests in browser.
 issue14236_test: Skip # Issue 14236 Script snapshots do not work in the browser.
@@ -74,6 +75,7 @@
 io/process_exit_negative_test: Fail, OK # relies on a static error that is a warning now.
 package/package_isolate_test: Skip # spawnUri does not work in dart2js. See issue 3051
 debugger/*: Skip # Do not run standalone vm debugger tests with dart2js.
+full_coverage_test: Skip
 left_shift_bit_and_op_test: Skip # Integers exceed dart2js precision.
 pow_test: Skip # Precision > 53 bits.
 double_smi_comparison_test: Skip # Precision > 53 bits.
@@ -143,3 +145,5 @@
 javascript_compatibility_errors_test: Skip
 javascript_compatibility_warnings_test: Skip
 
+[ $system == windows ]
+io/skipping_dart2js_compilations_test: Fail # Issue 19551.
diff --git a/tests/standalone/typed_data_test.dart b/tests/standalone/typed_data_test.dart
index 4429765..669bee0 100644
--- a/tests/standalone/typed_data_test.dart
+++ b/tests/standalone/typed_data_test.dart
@@ -175,7 +175,7 @@
 
   Expect.throws(() {
     var size = typed_data.elementSizeInBytes;
-    var i = (typed_data.length - 1) * size + 1; 
+    var i = (typed_data.length - 1) * size + 1;
     typed_data[new C(i)] = value;
   });
 
@@ -302,7 +302,7 @@
 }
 
 testViewCreation() {
-  var bytes = new Uint8List(1024);
+  var bytes = new Uint8List(1024).buffer;
   var view = new ByteData.view(bytes, 24);
   Expect.equals(1000, view.lengthInBytes);
   view = new Uint8List.view(bytes, 24);
diff --git a/tests/try/cursor_position_test.dart b/tests/try/cursor_position_test.dart
index f791796..36ff990 100644
--- a/tests/try/cursor_position_test.dart
+++ b/tests/try/cursor_position_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--package-root=sdk/lib/_internal/
-
 // Test that cursor positions are correctly updated after adding new content.
 
 import 'test_try.dart';
@@ -82,7 +80,15 @@
   Expect.equals(4, text.length);
   Text newline = secondLine.firstChild.nextNode;
   Expect.equals(newline, secondLine.lastChild);
-  checkSelectionIsCollapsed(newline, 0);
+  /// Chrome and Firefox cannot agree on where to put the cursor.  At the end
+  /// of [text] or at the beginning of [newline].  It's the same position.
+  if (window.getSelection().anchorOffset == 0) {
+    // Firefox.
+    checkSelectionIsCollapsed(newline, 0);
+  } else {
+    // Chrome.
+    checkSelectionIsCollapsed(text, 4);
+  }
 }
 
 class MockKeyboardEvent extends KeyEvent {
diff --git a/tests/try/internal_error_test.dart b/tests/try/internal_error_test.dart
index 8cbac3a..9cad55e 100644
--- a/tests/try/internal_error_test.dart
+++ b/tests/try/internal_error_test.dart
@@ -2,23 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--package-root=sdk/lib/_internal/
-
 library trydart.internal_error_test;
 
 import 'dart:html';
 import 'dart:async';
 
-import '../../site/try/src/interaction_manager.dart' show
+import 'package:try/src/interaction_manager.dart' show
     InteractionManager,
     TRY_DART_NEW_DEFECT;
 
-import '../../site/try/src/ui.dart' show
+import 'package:try/src/ui.dart' show
     mainEditorPane,
     observer,
     outputDiv;
 
-import '../../site/try/src/user_option.dart' show
+import 'package:try/src/user_option.dart' show
     UserOption;
 
 import '../../pkg/expect/lib/expect.dart';
diff --git a/tests/try/mock_try.dart b/tests/try/mock_try.dart
index 1e2e3e50..745bb71 100644
--- a/tests/try/mock_try.dart
+++ b/tests/try/mock_try.dart
@@ -7,15 +7,15 @@
     MutationObserver,
     document;
 
-import '../../site/try/src/interaction_manager.dart' show
+import 'package:try/src/interaction_manager.dart' show
     InteractionManager;
 
-import '../../site/try/src/ui.dart' show
+import 'package:try/src/ui.dart' show
     hackDiv,
     mainEditorPane,
     observer;
 
-import '../../site/try/src/user_option.dart' show
+import 'package:try/src/user_option.dart' show
     UserOption;
 
 InteractionManager mockTryDartInteraction() {
diff --git a/tests/try/paste_content_rewriting_test.dart b/tests/try/paste_content_rewriting_test.dart
index f16c3d8..d04e7ac 100644
--- a/tests/try/paste_content_rewriting_test.dart
+++ b/tests/try/paste_content_rewriting_test.dart
@@ -2,21 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--package-root=sdk/lib/_internal/
-
 library trydart.paste_test;
 
 import 'dart:html';
 import 'dart:async';
 
-import '../../site/try/src/interaction_manager.dart' show
+import 'package:try/src/interaction_manager.dart' show
     InteractionManager;
 
-import '../../site/try/src/ui.dart' show
+import 'package:try/src/ui.dart' show
     mainEditorPane,
     observer;
 
-import '../../site/try/src/user_option.dart' show
+import 'package:try/src/user_option.dart' show
     UserOption;
 
 import '../../pkg/expect/lib/expect.dart';
diff --git a/tests/try/source_update_test.dart b/tests/try/source_update_test.dart
index 1ea94ca..b40159a 100644
--- a/tests/try/source_update_test.dart
+++ b/tests/try/source_update_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--package-root=sdk/lib/_internal/
-
 import 'test_try.dart';
 
 InteractionContext interaction;
diff --git a/tests/try/test_try.dart b/tests/try/test_try.dart
index 6a09719..743f929 100644
--- a/tests/try/test_try.dart
+++ b/tests/try/test_try.dart
@@ -6,11 +6,11 @@
 
 export 'dart:html';
 
-export '../../site/try/src/interaction_manager.dart' show
+export 'package:try/src/interaction_manager.dart' show
     InteractionContext,
     InteractionManager;
 
-export '../../site/try/src/ui.dart' show
+export 'package:try/src/ui.dart' show
     mainEditorPane;
 
 export '../../pkg/expect/lib/expect.dart';
diff --git a/tests/try/try.status b/tests/try/try.status
index 59a5f7c..5a32cc2 100644
--- a/tests/try/try.status
+++ b/tests/try/try.status
@@ -9,5 +9,8 @@
 [ $compiler != dart2js || ($runtime != drt && $runtime != chrome && $runtime != ff) ]
 *: Skip
 
+[ $compiler == dart2js && $runtime == drt ]
+end_to_end_test: Skip # dartbug.com/19658
+
 [ $csp ]
 end_to_end_test: Fail, OK # http://dartbug.com/17935
diff --git a/tests/utils/dart2js_test.dart b/tests/utils/dart2js_test.dart
index 74d890cd..84f5a3f 100644
--- a/tests/utils/dart2js_test.dart
+++ b/tests/utils/dart2js_test.dart
@@ -4,7 +4,7 @@
 
 // Test to ensure that dart2js is free of warnings.
 
-import '../../sdk/lib/_internal/compiler/implementation/dart2js.dart'
+import 'package:compiler/implementation/dart2js.dart'
     as dart2js;
 
 void main() {
diff --git a/tests/utils/dummy_compiler_test.dart b/tests/utils/dummy_compiler_test.dart
index 1743615..60a5ed74 100644
--- a/tests/utils/dummy_compiler_test.dart
+++ b/tests/utils/dummy_compiler_test.dart
@@ -10,15 +10,11 @@
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
 
-import '../../sdk/lib/_internal/compiler/compiler.dart';
+import 'package:compiler/compiler.dart';
 
-Future<String> provider(Uri uri) {
-  String source;
-  if (uri.scheme == "main") {
-    source = "main() {}";
-  } else if (uri.scheme == "lib") {
-    if (uri.path.endsWith("/core.dart")) {
-      source = """
+String libProvider(Uri uri) {
+  if (uri.path.endsWith("/core.dart")) {
+    return """
 library core;
 class Object {
   Object();
@@ -50,10 +46,13 @@
 eqNull(a) {}
 eqNullB(a) {}
 const proxy = 0;""";
-    } else if (uri.path.endsWith('_patch.dart')) {
-      source = '';
-    } else if (uri.path.endsWith('interceptors.dart')) {
-      source = """
+  } else if (uri.path.endsWith('_patch.dart')) {
+    return """
+import 'dart:_js_helper';
+import 'dart:_interceptors';
+import 'dart:_isolate_helper';""";
+  } else if (uri.path.endsWith('interceptors.dart')) {
+    return """
 class Interceptor {
   operator==(other) {}
   get hashCode => throw 'Interceptor.hashCode not implemented.';
@@ -94,15 +93,28 @@
 getDispatchProperty(o) {}
 setDispatchProperty(o, v) {}
 var mapTypeToInterceptor;""";
-    } else if (uri.path.endsWith('js_helper.dart')) {
-      source = 'library jshelper; class JSInvocationMirror {} '
-               'class ConstantMap {} class TypeImpl {} '
-               'createRuntimeType(String name) => null;';
-    } else if (uri.path.endsWith('isolate_helper.dart')) {
-      source = 'library isolatehelper; class _WorkerStub {}';
-    } else {
-      source = "library lib${uri.path.replaceAll('/', '.')};";
-    }
+  } else if (uri.path.endsWith('js_helper.dart')) {
+    return """
+library jshelper; class JSInvocationMirror {}
+class ConstantMap {} class TypeImpl {}
+createRuntimeType(String name) => null;
+class Closure {}
+class BoundClosure extends Closure {}
+const patch = 0;
+""";
+  } else if (uri.path.endsWith('isolate_helper.dart')) {
+    return 'library isolatehelper; class _WorkerStub {}';
+  } else {
+    return "library lib${uri.path.replaceAll('/', '.')};";
+  }
+}
+
+Future<String> provider(Uri uri) {
+  String source;
+  if (uri.scheme == "main") {
+    source = "main() {}";
+  } else if (uri.scheme == "lib") {
+    source = libProvider(uri);
   } else {
    throw "unexpected URI $uri";
   }
diff --git a/tests/utils/recursive_import_test.dart b/tests/utils/recursive_import_test.dart
index b343200..c1815e8 100644
--- a/tests/utils/recursive_import_test.dart
+++ b/tests/utils/recursive_import_test.dart
@@ -7,66 +7,8 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'dart:async';
-import '../../sdk/lib/_internal/compiler/compiler.dart';
-
-const CORE_LIB = """
-library core;
-class Object {
-  const Object();
-  operator==(other) {}
-}
-class bool {}
-class num {}
-class int {}
-class double{}
-class String{}
-class Function{}
-class List {}
-class Map {}
-class BoundClosure {}
-class Closure {}
-class Dynamic_ {}
-class Type {}
-class Null {}
-class StackTrace {}
-class LinkedHashMap {}
-getRuntimeTypeInfo(o) {}
-setRuntimeTypeInfo(o, i) {}
-eqNull(a) {}
-eqNullB(a) {}
-class JSInvocationMirror {}  // Should be in helper.
-class _Proxy { const _Proxy(); }
-const proxy = const _Proxy();
-""";
-
-const INTERCEPTORS_LIB = """
-library interceptors;
-class JSIndexable {
-  get length {}
-}
-class JSMutableIndexable {}
-class JSArray {
-  JSArray() {}
-  factory JSArray.typed(a) => a;
-  removeLast() => null;
-  add(x) { }
-}
-class JSMutableArray extends JSArray {}
-class JSExtendableArray extends JSMutableArray {}
-class JSFixedArray extends JSMutableArray {}
-class JSString {
-  split(x) => null;
-  concat(x) => null;
-  toString() => null;
-  operator+(other) => null;
-}
-class JSNull {
-  bool operator ==(other) => identical(null, other);
-  int get hashCode => 0;
-}
-class JSBool {
-}
-""";
+import 'dummy_compiler_test.dart';
+import 'package:compiler/compiler.dart';
 
 const String RECURSIVE_MAIN = """
 library fisk;
@@ -86,17 +28,7 @@
       count++;
       source = RECURSIVE_MAIN;
     } else if (uri.scheme == "lib") {
-      if (uri.path.endsWith("/core.dart")) {
-        source = CORE_LIB;
-      } else if (uri.path.endsWith('_patch.dart')) {
-        source = '';
-      } else if (uri.path.endsWith('isolate_helper.dart')) {
-        source = 'class _WorkerStub {}';
-      } else if (uri.path.endsWith('interceptors.dart')) {
-        source = INTERCEPTORS_LIB;
-      } else {
-        source = "library lib${uri.path.replaceAll('/', '.')};";
-      }
+      source = libProvider(uri);
     } else {
      return new Future.error("unexpected URI $uri");
     }
diff --git a/tests/utils/source_mirrors_test.dart b/tests/utils/source_mirrors_test.dart
index f587560..c61fafb 100644
--- a/tests/utils/source_mirrors_test.dart
+++ b/tests/utils/source_mirrors_test.dart
@@ -10,7 +10,7 @@
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
 
-import '../../sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart';
+import 'package:compiler/implementation/mirrors/analyze.dart';
 import 'dummy_compiler_test.dart';
 
 main() {
diff --git a/tools/VERSION b/tools/VERSION
index 57df64f..1873f13 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -25,7 +25,7 @@
 #
 CHANNEL dev
 MAJOR 1
-MINOR 5
+MINOR 6
 PATCH 0
-PRERELEASE 4
-PRERELEASE_PATCH 23
+PRERELEASE 0
+PRERELEASE_PATCH 0
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index a1e2f5d..b2bf9a7 100644
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -107,6 +107,10 @@
     return '/'.join([self.editor_directory(revision),
       self.editor_installer_filename(system, arch, extension)])
 
+  def editor_android_zipfilepath(self, revision):
+    return '/'.join([self.editor_directory(revision),
+      self.editor_android_zipfilename()])
+
   def sdk_zipfilepath(self, revision, system, arch, mode):
     return '/'.join([self.sdk_directory(revision),
       self.sdk_zipfilename(system, arch, mode)])
@@ -169,6 +173,9 @@
     return 'darteditor-%s-%s.zip' % (
         SYSTEM_RENAMES[system], ARCH_RENAMES[arch])
 
+  def editor_android_zipfilename(self):
+    return 'android.zip'
+
   def editor_installer_filename(self, system, arch, extension):
     assert extension in ['dmg', 'msi']
     return 'darteditor-installer-%s-%s.%s' % (
@@ -333,7 +340,7 @@
   return checksum_filename
 
 def GetChannelFromName(name):
-  """Get the channel from the name. Bleeding edge builders don't 
+  """Get the channel from the name. Bleeding edge builders don't
       have a suffix."""
   channel_name = string.split(name, '-').pop()
   if channel_name in Channel.ALL_CHANNELS:
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index 5ea8d34..5c02fb9 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -157,7 +157,7 @@
   with bot.BuildStep(step_name, swallow_error=True):
     sys.stdout.flush()
     if NeedsXterm(compiler, runtime) and system == 'linux':
-      cmd = ['xvfb-run', '-a']
+      cmd = ['xvfb-run', '-a', '--server-args=-screen 0 1024x768x24']
     else:
       cmd = []
 
diff --git a/tools/bots/cross-vm.py b/tools/bots/cross-vm.py
index cb53e2f..9c81275 100644
--- a/tools/bots/cross-vm.py
+++ b/tools/bots/cross-vm.py
@@ -91,6 +91,8 @@
     for path in temporary_files:
       if os.path.exists(path):
         os.remove(path)
+    # We always clobber this to save disk on the arm board.
+    bot.Clobber(force=True)
 
 def main():
   name, is_buildbot = bot.GetBotName()
diff --git a/tools/bots/dartium_android.py b/tools/bots/dartium_android.py
index e10afd5..18bc171 100644
--- a/tools/bots/dartium_android.py
+++ b/tools/bots/dartium_android.py
@@ -40,7 +40,9 @@
 def UploadAPKs(options):
   with bot.BuildStep('Upload apk'):
     revision = utils.GetSVNRevision()
-    namer = bot_utils.GCSNamer()
+    bot_name = os.environ.get("BUILDBOT_BUILDERNAME")
+    channel = bot_utils.GetChannelFromName(bot_name)
+    namer = bot_utils.GCSNamer(channel=channel)
     gsutil = bot_utils.GSUtil()
 
     web_link_prefix = 'https://storage.cloud.google.com/'
diff --git a/tools/bots/run_android_tests.sh b/tools/bots/run_android_tests.sh
index c728f3a..a4a3ca5 100755
--- a/tools/bots/run_android_tests.sh
+++ b/tools/bots/run_android_tests.sh
@@ -21,7 +21,7 @@
 adb install -r $1
 ./build/android/adb_reverse_forwarder.py 8081 8081 8082 8082 \
                                          8083 8083 8084 8084 &
-FORWARDER_PID = $!
+FORWARDER_PID=$!
 sleep 15
 ./dart/tools/test.py -m release -a arm --progress=line --report --time \
     --failure-summary --write-debug-log --local_ip=localhost \
diff --git a/tools/build.py b/tools/build.py
index e0205ba..4dfb024 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -401,16 +401,25 @@
             project_file = 'dart.sln'
             if os.path.exists('dart-%s.gyp' % CurrentDirectoryBaseName()):
               project_file = 'dart-%s.sln' % CurrentDirectoryBaseName()
+            # Select a platform suffix to pass to devenv.
+            if arch == 'ia32':
+              platform_suffix = 'Win32'
+            elif arch == 'x64':
+              platform_suffix = 'x64'
+            else:
+              print 'Unsupported arch for MSVC build: %s' % arch
+              return 1
+            config_name = '%s|%s' % (build_config, platform_suffix)
             if target == 'all':
               args = [options.devenv + os.sep + options.executable,
                       '/build',
-                      build_config,
+                      config_name,
                       project_file
                      ]
             else:
               args = [options.devenv + os.sep + options.executable,
                       '/build',
-                      build_config,
+                      config_name,
                       '/project',
                       target,
                       project_file
diff --git a/tools/create_editor.py b/tools/create_editor.py
index 3957260..f5c890a 100644
--- a/tools/create_editor.py
+++ b/tools/create_editor.py
@@ -208,7 +208,7 @@
   # (dart-editor-macosx.cocoa.x86.zip). It contains the editor application in a
   # dart/ subdirectory. We unzip the contents of the archive into OUTPUT. It
   # will use the ../dart-sdk directory as its SDK.
-  archives = glob.glob(join(OUTPUT, '*.zip'))
+  archives = glob.glob(join(OUTPUT, 'd*.zip'))
 
   if archives:
     ProcessEditorArchive(arch, archives[0], OUTPUT)
diff --git a/tools/dart2js/sourceMapViewer/README.TXT b/tools/dart2js/sourceMapViewer/README.TXT
index aa8cab5..cd84fbb 100644
--- a/tools/dart2js/sourceMapViewer/README.TXT
+++ b/tools/dart2js/sourceMapViewer/README.TXT
@@ -1,7 +1,9 @@
-This program serves a visualization of a JavaScript source map file generated 
+This program serves a visualization of a JavaScript source map file generated
 by dart2js or pub.
 
-Usage: dart bin/source_map_viewer.dart <path to map file>.
+Run 'pub build' to build the application.
+
+Usage: dart --package-root=packages/ bin/source_map_viewer.dart <path to map file>.
 
 The default system browser is started and pointed to the viewer if available.
 
diff --git a/tools/dart2js/sourceMapViewer/bin/source_map_viewer.dart b/tools/dart2js/sourceMapViewer/bin/source_map_viewer.dart
index 8981862..2c8533d 100644
--- a/tools/dart2js/sourceMapViewer/bin/source_map_viewer.dart
+++ b/tools/dart2js/sourceMapViewer/bin/source_map_viewer.dart
@@ -18,8 +18,7 @@
  * available.
  */
 
-Directory rootDir = null;
-String sourceMapFile;
+Uri sourceMapFile;
 
 void main(List<String> args) {
   if (args.length != 1) {
@@ -35,9 +34,8 @@
     return;
   }
 
-  sourceMapFile = basename(mapFile.path);
-  rootDir = mapFile.parent;
-  startServer(rootDir);
+  sourceMapFile = toUri(mapFile.path);
+  startServer();
 }
 
 // Sends the content of the file requested in the path parameter.
@@ -48,17 +46,16 @@
     return;
   }
 
-  path = rootDir.path + '/' + path;
-  new File(Uri.parse(path).toFilePath()).openRead()
-    .pipe(request.response).catchError((e) {
-  print("Error: $e");
+  Uri uri = sourceMapFile.resolve(path);
+  new File.fromUri(uri).openRead().pipe(request.response).catchError((e) {
+    print("Error: $e");
     request.response.close();
   });
 }
 
 // Sends back the name of the source map file.
 void handleSourceMapFile(HttpRequest request) {
-  request.response.write(sourceMapFile);
+  request.response.write(basename(sourceMapFile.path));
   request.response.close();
 }
 
@@ -69,8 +66,15 @@
 //
 // /map serves the name of the map file such that its content can be requested
 // with a /file request as above.
-void startServer(Directory dir) {
-  rootDir = dir;
+void startServer() {
+  String root = fromUri(Platform.script.resolve('../build/web/'));
+  Directory directory = new Directory(root);
+  if (!directory.existsSync()) {
+    print("Directory '$root' does not exist. "
+          "Run 'pub build' to generate the output.");
+    exit(-1);
+  }
+
   // Use port 0 to get an ephemeral port.
   int port = 0;
   HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, port).then((server) {
@@ -83,7 +87,7 @@
 
     // Set up default handler. This will serve files from our 'build'
     // directory. Disable jail root, as packages are local symlinks.
-    VirtualDirectory virDir = new http_server.VirtualDirectory(dir.path)
+    VirtualDirectory virDir = new http_server.VirtualDirectory(root)
       ..jailRoot = false
       ..allowDirectoryListing = true;
 
diff --git a/tools/dart2js/sourceMapViewer/web/display.html b/tools/dart2js/sourceMapViewer/web/display.html
index f6d6758..834cf64 100644
--- a/tools/dart2js/sourceMapViewer/web/display.html
+++ b/tools/dart2js/sourceMapViewer/web/display.html
@@ -38,22 +38,22 @@
     <tr><td>
       <h2>Generated Output</h2>
       <div id="target_filename"></div>
-      <div id="generated_output" style="border:2px solid;overflow:scroll;width:550px;height:50px;"></div>
+      <div id="generated_output" style="border:2px solid;overflow:auto;width:550px;height:50px;"></div>
     </td><td>
       <h2>Selected Source Code</h2>
       <div id="source_filename"></div>
-      <div id="selected_source" style="border:2px solid;overflow:scroll;width:550px;height:50px;"></div>
+      <div id="selected_source" style="border:2px solid;overflow:auto;width:550px;height:50px;"></div>
     </td><td>
-      <div id="current_span" style="background-color: #99ff99;visibility:hidden;border:green 1px dashed;overflow:scroll;width:250px;height:50px;font-size:12pt;position:absolute;"></div>
+      <div id="current_span" style="background-color: #99ff99;visibility:hidden;border:green 1px dashed;overflow:auto;width:250px;height:50px;font-size:12pt;position:absolute;"></div>
     </td>
     <tr><td>
      <h2>Decoded Map</h2>
      <small><i>(&lt;generated column&gt;,&lt;src url id&gt;,&lt;src line&gt;,&lt;src col&gt;)</i></small>
-     <div id="decoded_map" style="border: 2px solid;overflow:scroll;width:550px;height:50px;"></div>
+     <div id="decoded_map" style="border: 2px solid;overflow:auto;width:550px;height:50px;"></div>
      </td><td>
      <h2>Original Map</h2>
      <small><i>The encoded mapping data.</i></small>
-     <div id="original_map" style="border: 2px solid;overflow:scroll;width:550px;height:50px;"></div>
+     <div id="original_map" style="border: 2px solid;overflow:auto;width:550px;height:50px;"></div>
      </td>
     </tr>
     </table></div>
diff --git a/tools/dartium/download_multivm.py b/tools/dartium/download_multivm.py
index 0a31bce..a97c84f 100755
--- a/tools/dartium/download_multivm.py
+++ b/tools/dartium/download_multivm.py
@@ -23,6 +23,8 @@
 GS_BUCKET = 'gs://dartium-archive'
 if platform.system() == 'Windows':
   GSUTIL = 'e:\\b\\build\\scripts\\slave\\gsutil.bat'
+  if not os.path.exists(GSUTIL):
+    GSUTIL = 'c:\\b\\build\\scripts\\slave\\gsutil.bat'
 else:
   GSUTIL = '/b/build/scripts/slave/gsutil'
 if not os.path.exists(GSUTIL):
diff --git a/tools/dartium/update_deps.py b/tools/dartium/update_deps.py
index ed91c16..e2ea7d6 100755
--- a/tools/dartium/update_deps.py
+++ b/tools/dartium/update_deps.py
@@ -40,7 +40,7 @@
 # Repositories to auto-update
 ########################################################################
 
-BRANCH_CURRENT="dart/1916"
+BRANCH_CURRENT="dart/1985"
 BRANCH_NEXT="dart/1985"
 BRANCH_MULTIVM="dart/multivm"
 
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index c81be53..76be905 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -438,7 +438,7 @@
       return is_optional(operations[signature_index], argument)
 
     emitter = \
-        self._native_library_emitter if self._dart_use_blink \
+        self._native_class_emitter if self._dart_use_blink \
         else self._members_emitter
 
     self._GenerateOverloadDispatcher(
@@ -548,9 +548,7 @@
           version, signature_index, argument_count):
         name = emitter.Format('_create_$VERSION', VERSION=version)
         if self._dart_use_blink:
-            qualified_name = \
-                "_".join(["Native",self._interface.id,
-                          name + 'constructorCallback'])
+            qualified_name = self.DeriveNativeName(name + 'constructorCallback')
         else:
             qualified_name = emitter.Format(
                 '$FACTORY.$NAME',
@@ -577,11 +575,11 @@
           PARAMS=constructor_info.ParametersAsDeclaration(self._DartType))
 
       if self._dart_use_blink:
-          overload_emitter = self._native_library_emitter
+          overload_emitter = self._native_class_emitter
           mname = constructor_full_name.replace(".", "_")
-          blink_name = \
-              "_".join(["Native",self._interface.id, mname])
-          qual_name = self._native_library_name + "." + blink_name
+          blink_name = "$mk" + mname
+          qual_name = self.DeriveQualifiedBlinkName(
+              self._interface.id, blink_name)
           actuals_s = constructor_info.ParametersAsStringOfVariables()
           self._members_emitter.Emit(
             '\n'
@@ -591,7 +589,7 @@
             ACTUALS=actuals_s)
           overload_declaration = emitter.Format(
               '// Generated overload resolver\n'
-              '$CTOR($PARAMS)',
+              '  static $CTOR($PARAMS)',
               CTOR=blink_name,
               PARAMS=actuals_s)
 
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 42d252e..d1090b6 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -1256,7 +1256,7 @@
       items.sort()
       for (idl_name, dart_name) in items:
         map_emitter.Emit(
-          "  '$IDL_NAME': $DART_NAME,\n",
+          "  '$IDL_NAME': () => $DART_NAME,\n",
           IDL_NAME=idl_name,
           DART_NAME=dart_name)
       
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index a513aa7..1a7571f 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -375,11 +375,8 @@
 def DeriveQualifiedName(library_name, name):
     return library_name + "." + name
 
-def DeriveNativeName(interface_name, name, suffix):
-    fields = ["Native", interface_name, name]
-    if suffix != "":
-        fields.append(suffix)
-    return "_".join(fields)
+def DeriveBlinkClassName(name):
+    return "Blink" + name
 
 def DeriveResolverString(interface_id, operation_id, native_suffix, type_ids, database, is_custom):
     type_string = \
@@ -429,7 +426,6 @@
     self._type_registry = options.type_registry
     self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
     self._metadata = options.metadata
-    self._native_library_name = "_blink"
     # These get initialized by StartInterface
     self._cpp_header_emitter = None
     self._cpp_impl_emitter = None
@@ -438,6 +434,7 @@
     self._cpp_impl_includes = None
     self._cpp_definitions_emitter = None
     self._cpp_resolver_emitter = None
+    self._native_class_emitter = None
 
   def ImplementsMergedMembers(self):
     # We could not add merged functions to implementation class because
@@ -569,6 +566,17 @@
   def RootClassName(self):
     return 'NativeFieldWrapperClass2'
 
+  def DeriveNativeName(self, name, suffix=""):
+      fields = ['$' + name]
+      if suffix != "":
+          fields.append(suffix)
+      return "_".join(fields)
+
+  def DeriveQualifiedBlinkName(self, interface_name, name):
+      return DeriveQualifiedName(
+          "_blink", DeriveQualifiedName(DeriveBlinkClassName(interface_name),
+                                        name))
+
   def NativeSpec(self):
     return ''
 
@@ -618,6 +626,13 @@
         '    WebCore::DartArrayBufferViewInternal::constructWebGLArray<Dart$(INTERFACE_NAME)>(args);\n'
         '}\n',
         INTERFACE_NAME=self._interface.id);
+    if self._dart_use_blink:
+        self._native_class_emitter = self._native_library_emitter.Emit(
+          '\n'
+          'class $INTERFACE_NAME {'
+          '$!METHODS'
+          '}\n',
+          INTERFACE_NAME=DeriveBlinkClassName(self._interface.id))
 
   def _EmitConstructorInfrastructure(self,
       constructor_info, cpp_prefix, cpp_suffix, factory_method_name,
@@ -648,13 +663,13 @@
     if self._dart_use_blink:
         # First we emit the toplevel function
         dart_native_name = \
-            DeriveNativeName(self._interface.id, constructor_callback_cpp_name, "")
+            self.DeriveNativeName(constructor_callback_cpp_name)
         if constructor_callback_id in _cpp_resolver_string_map:
             constructor_callback_id = \
                 _cpp_resolver_string_map[constructor_callback_id]
-        self._native_library_emitter.Emit(
+        self._native_class_emitter.Emit(
             '\n'
-            '$FACTORY_METHOD_NAME($PARAMETERS) native "$ID";\n',
+            '  static $FACTORY_METHOD_NAME($PARAMETERS) native "$ID";\n',
             FACTORY_METHOD_NAME=dart_native_name,
             PARAMETERS=parameters,
             ID=constructor_callback_id)
@@ -662,6 +677,9 @@
         # Then we emit the impedance matching wrapper to call out to the
         # toplevel wrapper
         if not emit_to_native:
+            toplevel_name = \
+                self.DeriveQualifiedBlinkName(self._interface.id,
+                                              dart_native_name)
             self._members_emitter.Emit(
                 '\n  @DocsEditable()\n'
                 '  static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
@@ -669,8 +687,7 @@
                 INTERFACE_NAME=self._interface_type_info.interface_name(),
                 FACTORY_METHOD_NAME=factory_method_name,
                 PARAMETERS=typed_formals,
-                TOPLEVEL_NAME=DeriveQualifiedName(self._native_library_name,
-                                                  dart_native_name),
+                TOPLEVEL_NAME=toplevel_name,
                 OUTPARAMETERS=parameters)
     else:
         self._members_emitter.Emit(
@@ -1068,7 +1085,7 @@
       if self._dart_use_blink:
           is_custom = any((op.id == 'item' and 'Custom' in op.ext_attrs) for op in self._interface.operations)
           dart_native_name = \
-              DeriveNativeName(self._interface.id, "NativeIndexed", "Getter")
+              self.DeriveNativeName("NativeIndexed", "Getter")
           # First emit a toplevel function to do the native call
           # Calls to this are emitted elsewhere,
           resolver_string = \
@@ -1077,15 +1094,18 @@
           if resolver_string in _cpp_resolver_string_map:
               resolver_string = \
                   _cpp_resolver_string_map[resolver_string]
-          self._native_library_emitter.Emit(
+          self._native_class_emitter.Emit(
               '\n'
-              '$(DART_NATIVE_NAME)(mthis, index) '
+              '  static $(DART_NATIVE_NAME)(mthis, index) '
               'native "$(RESOLVER_STRING)";\n',
               DART_NATIVE_NAME = dart_native_name,
               RESOLVER_STRING=resolver_string)
 
           # Emit the method which calls the toplevel function, along with
           # the [] operator.
+          dart_qualified_name = \
+              self.DeriveQualifiedBlinkName(self._interface.id,
+                                            dart_native_name)
           self._members_emitter.Emit(
               '\n'
               '  $TYPE operator[](int index) {\n'
@@ -1095,8 +1115,7 @@
               '  }\n\n'
               '  $TYPE _nativeIndexedGetter(int index) =>'
               ' $(DART_NATIVE_NAME)(this, index);\n',
-              DART_NATIVE_NAME=DeriveQualifiedName(self._native_library_name,
-                                                   dart_native_name),
+              DART_NATIVE_NAME=dart_qualified_name,
               TYPE=self.SecureOutputType(element_type),
               INTERFACE=self._interface.id)
       else:
@@ -1237,7 +1256,7 @@
       if self._dart_use_blink:
           base_name = '_%s_%s' % (operation.id, version)
           overload_name = \
-              DeriveNativeName(self._interface.id, base_name, native_suffix)
+              self.DeriveNativeName(base_name, native_suffix)
           static = True
           if not operation.is_static:
             actuals = ['mthis'] + actuals
@@ -1275,9 +1294,9 @@
 
 
     if self._dart_use_blink:
-        name = DeriveNativeName(self._interface.id, html_name, "")
-        qual_name = DeriveQualifiedName(self._native_library_name,
-                                        name)
+        name = self.DeriveNativeName(html_name)
+        qual_name = self.DeriveQualifiedBlinkName(self._interface.id,
+                                                  name)
         actuals = info.ParametersAsListOfVariables()
         formals = info.ParametersAsListOfVariables()
         if not info.IsStatic():
@@ -1294,7 +1313,7 @@
 
         dart_declaration = \
             '// Generated overload resolver\n' \
-            '%s(%s)' % (name, formals_s)
+            '  static %s(%s)' % (name, formals_s)
 
     self._GenerateDispatcherBody(
         info,
@@ -1703,7 +1722,7 @@
           self._renamer.GetLibraryName(self._interface),
           self._interface, idl_name, '  ')
     dart_native_name = \
-        DeriveNativeName(self._interface.id, idl_name, native_suffix)
+        self.DeriveNativeName(idl_name, native_suffix)
 
     if (resolver_string):
         native_binding = resolver_string
@@ -1724,17 +1743,18 @@
         if native_binding in _cpp_resolver_string_map:
             native_binding = \
                 _cpp_resolver_string_map[native_binding]
-        self._native_library_emitter.Emit(
+        self._native_class_emitter.Emit(
             '\n'
-            '$DART_NAME($FORMALS) native "$NATIVE_BINDING";\n',
+            '  static $DART_NAME($FORMALS) native "$NATIVE_BINDING";\n',
             DART_NAME=dart_native_name,
             FORMALS=formals,
             NATIVE_BINDING=native_binding)
 
         if not emit_to_native:
             caller_emitter = self._members_emitter
-            full_dart_name = DeriveQualifiedName(self._native_library_name,
-                                                 dart_native_name)
+            full_dart_name = \
+                self.DeriveQualifiedBlinkName(self._interface.id,
+                                              dart_native_name)
             caller_emitter.Emit(
                 '\n'
                 '  $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);\n',
diff --git a/tools/dom/src/blink_native_DOMImplementation.dart b/tools/dom/src/blink_native_DOMImplementation.dart
index 8e7582a..3c0031c 100644
--- a/tools/dom/src/blink_native_DOMImplementation.dart
+++ b/tools/dom/src/blink_native_DOMImplementation.dart
@@ -5,54 +5,64 @@
 part of _blink;
 
 // _Utils native entry points
-Native_Utils_window() native "Utils_window";
+class Blink_Utils {
+  static window() native "Utils_window";
 
-Native_Utils_forwardingPrint(message) native "Utils_forwardingPrint";
+  static forwardingPrint(message) native "Utils_forwardingPrint";
 
-Native_Utils_spawnDomUri(uri) native "Utils_spawnDomUri";
+  static spawnDomUri(uri) native "Utils_spawnDomUri";
 
-Native_Utils_register(document, tag, customType, extendsTagName) native "Utils_register";
+  static register(document, tag, customType, extendsTagName) native "Utils_register";
 
-Native_Utils_createElement(document, tagName) native "Utils_createElement";
+  static createElement(document, tagName) native "Utils_createElement";
 
-Native_Utils_initializeCustomElement(element) native "Utils_initializeCustomElement";
+  static initializeCustomElement(element) native "Utils_initializeCustomElement";
 
-Native_Utils_changeElementWrapper(element, type) native "Utils_changeElementWrapper";
+  static changeElementWrapper(element, type) native "Utils_changeElementWrapper";
+}
 
-// FIXME: Return to using explicit cross frame entry points after roll to M35
-Native_DOMWindowCrossFrame_get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
+class Blink_DOMWindowCrossFrame {
+  // FIXME: Return to using explicit cross frame entry points after roll to M35
+  static get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
 
-Native_DOMWindowCrossFrame_get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
+  static get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
 
-Native_DOMWindowCrossFrame_get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
+  static get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
 
-Native_DOMWindowCrossFrame_get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
+  static get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
 
-Native_DOMWindowCrossFrame_get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
+  static get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
 
-Native_DOMWindowCrossFrame_get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
+  static get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
 
-Native_DOMWindowCrossFrame_close(_DOMWindowCrossFrame) native "Window_close_Callback_RESOLVER_STRING_0_";
+  static close(_DOMWindowCrossFrame) native "Window_close_Callback_RESOLVER_STRING_0_";
 
-Native_DOMWindowCrossFrame_postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
+  static postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
+}
 
-// _HistoryCrossFrame native entry points
-Native_HistoryCrossFrame_back(_HistoryCrossFrame) native "History_back_Callback_RESOLVER_STRING_0_";
+class Blink_HistoryCrossFrame {
+  // _HistoryCrossFrame native entry points
+  static back(_HistoryCrossFrame) native "History_back_Callback_RESOLVER_STRING_0_";
 
-Native_HistoryCrossFrame_forward(_HistoryCrossFrame) native "History_forward_Callback_RESOLVER_STRING_0_";
+  static forward(_HistoryCrossFrame) native "History_forward_Callback_RESOLVER_STRING_0_";
 
-Native_HistoryCrossFrame_go(_HistoryCrossFrame, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
+  static go(_HistoryCrossFrame, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
+}
 
-// _LocationCrossFrame native entry points
-Native_LocationCrossFrame_set_href(_LocationCrossFrame, h) native "Location_href_Setter";
+class Blink_LocationCrossFrame {
+  // _LocationCrossFrame native entry points
+  static set_href(_LocationCrossFrame, h) native "Location_href_Setter";
+}
 
-// _DOMStringMap native entry  points
-Native_DOMStringMap_containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
+class Blink_DOMStringMap {
+  // _DOMStringMap native entry  points
+  static containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
 
-Native_DOMStringMap_item(_DOMStringMap, key) native "DOMStringMap_item_Callback";
+  static item(_DOMStringMap, key) native "DOMStringMap_item_Callback";
 
-Native_DOMStringMap_setItem(_DOMStringMap, key, value) native "DOMStringMap_setItem_Callback";
+  static setItem(_DOMStringMap, key, value) native "DOMStringMap_setItem_Callback";
 
-Native_DOMStringMap_remove(_DOMStringMap, key) native "DOMStringMap_remove_Callback";
+  static remove(_DOMStringMap, key) native "DOMStringMap_remove_Callback";
 
-Native_DOMStringMap_get_keys(_DOMStringMap) native "DOMStringMap_getKeys_Callback";
+  static get_keys(_DOMStringMap) native "DOMStringMap_getKeys_Callback";
+}
\ No newline at end of file
diff --git a/tools/dom/src/html_native_DOMImplementation.dart b/tools/dom/src/html_native_DOMImplementation.dart
index 4ac5eff..75ba90f 100644
--- a/tools/dom/src/html_native_DOMImplementation.dart
+++ b/tools/dom/src/html_native_DOMImplementation.dart
@@ -185,11 +185,11 @@
     return element;
   }
 
-  static window() => _blink.Native_Utils_window();
-  static forwardingPrint(String message) => _blink.Native_Utils_forwardingPrint(message);
+  static window() => _blink.Blink_Utils.window();
+  static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message);
   // TODO(vsm): Make this API compatible with spawnUri.  It should also
   // return a Future<Isolate>.
-  static spawnDomUri(String uri) => _blink.Native_Utils_spawnDomUri(uri);
+  static spawnDomUri(String uri) => _blink.Blink_Utils.spawnDomUri(uri);
 
   // The following methods were added for debugger integration to make working
   // with the Dart C mirrors API simpler.
@@ -793,16 +793,16 @@
   }
 
   static void _register(Document document, String tag, Type customType,
-    String extendsTagName) => _blink.Native_Utils_register(document, tag, customType, extendsTagName);
+    String extendsTagName) => _blink.Blink_Utils.register(document, tag, customType, extendsTagName);
 
   static Element createElement(Document document, String tagName) =>
-    _blink.Native_Utils_createElement(document, tagName);
+    _blink.Blink_Utils.createElement(document, tagName);
 
   static void initializeCustomElement(HtmlElement element) =>
-    _blink.Native_Utils_initializeCustomElement(element);
+    _blink.Blink_Utils.initializeCustomElement(element);
 
   static Element changeElementWrapper(HtmlElement element, Type type) =>
-    _blink.Native_Utils_changeElementWrapper(element, type);
+    _blink.Blink_Utils.changeElementWrapper(element, type);
 }
 
 class _DOMWindowCrossFrame extends NativeFieldWrapperClass2 implements
@@ -810,17 +810,17 @@
   _DOMWindowCrossFrame.internal();
 
   // Fields.
-  HistoryBase get history => _blink.Native_DOMWindowCrossFrame_get_history(this);
-  LocationBase get location => _blink.Native_DOMWindowCrossFrame_get_location(this);
-  bool get closed => _blink.Native_DOMWindowCrossFrame_get_closed(this);
-  WindowBase get opener => _blink.Native_DOMWindowCrossFrame_get_opener(this);
-  WindowBase get parent => _blink.Native_DOMWindowCrossFrame_get_parent(this);
-  WindowBase get top => _blink.Native_DOMWindowCrossFrame_get_top(this);
+  HistoryBase get history => _blink.Blink_DOMWindowCrossFrame.get_history(this);
+  LocationBase get location => _blink.Blink_DOMWindowCrossFrame.get_location(this);
+  bool get closed => _blink.Blink_DOMWindowCrossFrame.get_closed(this);
+  WindowBase get opener => _blink.Blink_DOMWindowCrossFrame.get_opener(this);
+  WindowBase get parent => _blink.Blink_DOMWindowCrossFrame.get_parent(this);
+  WindowBase get top => _blink.Blink_DOMWindowCrossFrame.get_top(this);
 
   // Methods.
-  void close() => _blink.Native_DOMWindowCrossFrame_close(this);
+  void close() => _blink.Blink_DOMWindowCrossFrame.close(this);
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
-    _blink.Native_DOMWindowCrossFrame_postMessage(this, message, targetOrigin, messagePorts);
+    _blink.Blink_DOMWindowCrossFrame.postMessage(this, message, targetOrigin, messagePorts);
 
   // Implementation support.
   String get typeName => "Window";
@@ -845,9 +845,9 @@
   _HistoryCrossFrame.internal();
 
   // Methods.
-  void back() => _blink.Native_HistoryCrossFrame_back(this);
-  void forward() => _blink.Native_HistoryCrossFrame_forward(this);
-  void go(int distance) => _blink.Native_HistoryCrossFrame_go(this, distance);
+  void back() => _blink.Blink_HistoryCrossFrame.back(this);
+  void forward() => _blink.Blink_HistoryCrossFrame.forward(this);
+  void go(int distance) => _blink.Blink_HistoryCrossFrame.go(this, distance);
 
   // Implementation support.
   String get typeName => "History";
@@ -857,7 +857,7 @@
   _LocationCrossFrame.internal();
 
   // Fields.
-  void set href(String h) => _blink.Native_LocationCrossFrame_set_href(this, h);
+  void set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
 
   // Implementation support.
   String get typeName => "Location";
@@ -867,14 +867,14 @@
   _DOMStringMap.internal();
 
   bool containsValue(String value) => Maps.containsValue(this, value);
-  bool containsKey(String key) => _blink.Native_DOMStringMap_containsKey(this, key);
-  String operator [](String key) => _blink.Native_DOMStringMap_item(this, key);
-  void operator []=(String key, String value) => _blink.Native_DOMStringMap_setItem(this, key, value);
+  bool containsKey(String key) => _blink.Blink_DOMStringMap.containsKey(this, key);
+  String operator [](String key) => _blink.Blink_DOMStringMap.item(this, key);
+  void operator []=(String key, String value) => _blink.Blink_DOMStringMap.setItem(this, key, value);
   String putIfAbsent(String key, String ifAbsent()) => Maps.putIfAbsent(this, key, ifAbsent);
-  String remove(String key) => _blink.Native_DOMStringMap_remove(this, key);
+  String remove(String key) => _blink.Blink_DOMStringMap.remove(this, key);
   void clear() => Maps.clear(this);
   void forEach(void f(String key, String value)) => Maps.forEach(this, f);
-  Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this);
+  Iterable<String> get keys => _blink.Blink_DOMStringMap.get_keys(this);
   Iterable<String> get values => Maps.getValues(this);
   int get length => Maps.length(this);
   bool get isEmpty => Maps.isEmpty(this);
diff --git a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
index 36c722b..04c4317 100644
--- a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
@@ -43,18 +43,88 @@
 
 // TODO(vsm): This should be moved out of this library.  Into dart:html?
 Type _getType(String key) {
+  var result;
+
   // TODO(vsm): Add Cross Frame and JS types here as well.
-  if (htmlBlinkMap.containsKey(key))
-    return htmlBlinkMap[key];
-  if (indexed_dbBlinkMap.containsKey(key))
-    return indexed_dbBlinkMap[key];
-  if (web_audioBlinkMap.containsKey(key))
-    return web_audioBlinkMap[key];
-  if (web_glBlinkMap.containsKey(key))
-    return web_glBlinkMap[key];
-  if (web_sqlBlinkMap.containsKey(key))
-    return web_sqlBlinkMap[key];
-  if (svgBlinkMap.containsKey(key))
-    return svgBlinkMap[key];
+
+  // Check the html library.
+  result = _getHtmlType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web gl library.
+  result = _getWebGlType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the indexed db library.
+  result = _getIndexDbType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web audio library.
+  result = _getWebAudioType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web sql library.
+  result = _getWebSqlType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the svg library.
+  result = _getSvgType(key);
+  if (result != null) {
+    return result;
+  }
+
   return null;
-}
\ No newline at end of file
+}
+
+Type _getHtmlType(String key) {
+  if (htmlBlinkMap.containsKey(key)) {
+    return htmlBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getWebGlType(String key) {
+  if (web_glBlinkMap.containsKey(key)) {
+    return web_glBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getIndexDbType(String key) {
+  if (indexed_dbBlinkMap.containsKey(key)) {
+    return indexed_dbBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getWebAudioType(String key) {
+  if (web_audioBlinkMap.containsKey(key)) {
+    return web_audioBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getWebSqlType(String key) {
+  if (web_sqlBlinkMap.containsKey(key)) {
+    return web_sqlBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getSvgType(String key) {
+  if (svgBlinkMap.containsKey(key)) {
+    return svgBlinkMap[key]();
+  }
+  return null;
+}
+
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index aef8e8b..7e7453e 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -142,18 +142,18 @@
 }
 $if DART_USE_BLINK
 // FIXME: Can we make this private?
-const htmlBlinkMap = const {
-  '_HistoryCrossFrame': _HistoryCrossFrame,
-  '_LocationCrossFrame': _LocationCrossFrame,
-  '_DOMWindowCrossFrame': _DOMWindowCrossFrame,
+final htmlBlinkMap = {
+  '_HistoryCrossFrame': () => _HistoryCrossFrame,
+  '_LocationCrossFrame': () => _LocationCrossFrame,
+  '_DOMWindowCrossFrame': () => _DOMWindowCrossFrame,
   // FIXME: Move these to better locations.
-  'DateTime': DateTime,
-  'JsObject': js.JsObject,
-  'JsFunction': js.JsFunction,
-  'JsArray': js.JsArray,
+  'DateTime': () => DateTime,
+  'JsObject': () => js.JsObject,
+  '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,
+  'DataTransfer': () => DataTransfer,
 };
 $endif
diff --git a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
index 340bbec..a0f1d1b 100644
--- a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
@@ -37,7 +37,7 @@
 }
 $if DART_USE_BLINK
 // FIXME: Can we make this private?
-const indexed_dbBlinkMap = const {
+final indexed_dbBlinkMap = {
 $!TYPE_MAP
 };
 $endif
diff --git a/tools/dom/templates/html/dartium/svg_dartium.darttemplate b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
index e0cca26..3e3d2f3 100644
--- a/tools/dom/templates/html/dartium/svg_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
@@ -18,7 +18,7 @@
 $!GENERATED_DART_FILES
 $if DART_USE_BLINK
 // FIXME: Can we make this private?
-const svgBlinkMap = const {
+final svgBlinkMap = {
 $!TYPE_MAP
 };
 $endif
diff --git a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
index ea6c581..997d187 100644
--- a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
@@ -17,7 +17,7 @@
 $!GENERATED_DART_FILES
 $if DART_USE_BLINK
 // FIXME: Can we make this private?
-const web_audioBlinkMap = const {
+final web_audioBlinkMap = {
 $!TYPE_MAP
 };
 $endif
diff --git a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
index f3d8c40..333001d 100644
--- a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
@@ -19,7 +19,7 @@
 $!GENERATED_DART_FILES
 $if DART_USE_BLINK
 // FIXME: Can we make this private?
-const web_glBlinkMap = const {
+final web_glBlinkMap = {
 $!TYPE_MAP
 };
 $endif
diff --git a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
index 1af98eb..dae37f1 100644
--- a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
@@ -27,7 +27,7 @@
 $!GENERATED_DART_FILES
 $if DART_USE_BLINK
 // FIXME: Can we make this private?
-const web_sqlBlinkMap = const {
+final web_sqlBlinkMap = {
 $!TYPE_MAP
 };
 $endif
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 3266c6c..a676fa0 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -1385,59 +1385,59 @@
 $else
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get offsetHeight => _blink.Native_Element_offsetHeight_Getter(this).round();
+  int get offsetHeight => _blink.BlinkElement.$offsetHeight_Getter(this).round();
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get offsetLeft => _blink.Native_Element_offsetLeft_Getter(this).round();
+  int get offsetLeft => _blink.BlinkElement.$offsetLeft_Getter(this).round();
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get offsetTop => _blink.Native_Element_offsetTop_Getter(this).round();
+  int get offsetTop => _blink.BlinkElement.$offsetTop_Getter(this).round();
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get offsetWidth => _blink.Native_Element_offsetWidth_Getter(this).round();
+  int get offsetWidth => _blink.BlinkElement.$offsetWidth_Getter(this).round();
 
   @DomName('Element.clientHeight')
   @DocsEditable()
-  int get clientHeight => _blink.Native_Element_clientHeight_Getter(this).round();
+  int get clientHeight => _blink.BlinkElement.$clientHeight_Getter(this).round();
 
   @DomName('Element.clientLeft')
   @DocsEditable()
-  int get clientLeft => _blink.Native_Element_clientLeft_Getter(this).round();
+  int get clientLeft => _blink.BlinkElement.$clientLeft_Getter(this).round();
 
   @DomName('Element.clientTop')
   @DocsEditable()
-  int get clientTop => _blink.Native_Element_clientTop_Getter(this).round();
+  int get clientTop => _blink.BlinkElement.$clientTop_Getter(this).round();
 
   @DomName('Element.clientWidth')
   @DocsEditable()
-  int get clientWidth => _blink.Native_Element_clientWidth_Getter(this).round();
+  int get clientWidth => _blink.BlinkElement.$clientWidth_Getter(this).round();
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get scrollHeight => _blink.Native_Element_scrollHeight_Getter(this).round();
+  int get scrollHeight => _blink.BlinkElement.$scrollHeight_Getter(this).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int get scrollLeft => _blink.Native_Element_scrollLeft_Getter(this).round();
+  int get scrollLeft => _blink.BlinkElement.$scrollLeft_Getter(this).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set scrollLeft(int value) => _blink.Native_Element_scrollLeft_Setter(this, value.round());
+  void set scrollLeft(int value) => _blink.BlinkElement.$scrollLeft_Setter(this, value.round());
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int get scrollTop => _blink.Native_Element_scrollTop_Getter(this).round();
+  int get scrollTop => _blink.BlinkElement.$scrollTop_Getter(this).round();
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set scrollTop(int value) => _blink.Native_Element_scrollTop_Setter(this, value.round());
+  void set scrollTop(int value) => _blink.BlinkElement.$scrollTop_Setter(this, value.round());
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get scrollWidth => _blink.Native_Element_scrollWidth_Getter(this).round();
+  int get scrollWidth => _blink.BlinkElement.$scrollWidth_Getter(this).round();
 $endif
 
 $!MEMBERS
diff --git a/tools/full-coverage.dart b/tools/full-coverage.dart
index bafc0d1..2963574 100644
--- a/tools/full-coverage.dart
+++ b/tools/full-coverage.dart
@@ -17,8 +17,8 @@
   var input;
   var output;
   int workers;
-  bool prettyPrint;
-  bool lcov;
+  bool prettyPrint = false;
+  bool lcov = false;
   bool expectMarkers;
   bool verbose;
 }
@@ -405,7 +405,8 @@
   parser.addOption("sdk-root", abbr: "s",
                    help: "path to the SDK root");
   parser.addOption("package-root", abbr: "p",
-                   help: "path to the package root");
+                   help: "override path to the package root "
+                         "(default: inherited from dart)");
   parser.addOption("in", abbr: "i",
                    help: "input(s): may be file or directory");
   parser.addOption("out", abbr: "o",
@@ -465,6 +466,8 @@
     if (!FileSystemEntity.isDirectorySync(env.pkgRoot)) {
       fail("Provided package root '${args["package-root"]}' is not directory.");
     }
+  } else {
+    env.pkgRoot = Platform.packageRoot;
   }
 
   if (args["in"] == null) {
diff --git a/tools/gyp/configurations.gypi b/tools/gyp/configurations.gypi
index ddbe770..45a5850 100644
--- a/tools/gyp/configurations.gypi
+++ b/tools/gyp/configurations.gypi
@@ -368,6 +368,21 @@
       'Release': {
         'inherit_from': ['Release<(chrome_target_os)<(dart_target_arch)']
       },
+
+      'conditions': [
+        # On Windows ninja generator has hardcorded configuration naming
+        # patterns and it expects that x64 configurations are named smth_x64.
+        # This is a workaround for the crash that these expectations cause.
+        [ 'OS=="win" and GENERATOR=="ninja"', {
+          'DebugX64_x64': {
+            'inherit_from': [ 'DebugX64' ]
+          },
+
+          'ReleaseX64_x64': {
+            'inherit_from': [ 'ReleaseX64' ]
+          },
+        }],
+      ],
     },
   },
 }
diff --git a/tools/gyp/configurations_msvs.gypi b/tools/gyp/configurations_msvs.gypi
index 970c1ae..20d69be 100644
--- a/tools/gyp/configurations_msvs.gypi
+++ b/tools/gyp/configurations_msvs.gypi
@@ -19,6 +19,7 @@
       },
       'Dart_Win_x64_Base': {
         'abstract': 1,
+        'msvs_configuration_platform': 'x64',
       },
       'Dart_Win_simarm_Base': {
         'abstract': 1,
diff --git a/tools/make_links.py b/tools/make_links.py
index 1893f2d..0874ca8 100644
--- a/tools/make_links.py
+++ b/tools/make_links.py
@@ -32,7 +32,7 @@
       default='')
   return result.parse_args()
 
-def make_link(source, target):
+def make_link(source, target, orig_source):
   if os.path.islink(target):
     print 'Removing %s' % target
     sys.stdout.flush()
@@ -43,13 +43,19 @@
     sys.stdout.flush()
     os.rmdir(target)
 
-  print 'Creating link from %s to %s' % (source, target)
-  sys.stdout.flush()
-
-  if utils.GuessOS() == 'win32':
-    return subprocess.call(['mklink', '/j', target, source], shell=True)
+  if os.path.isfile(orig_source):
+    print 'Copying file from %s to %s' % (orig_source, target)
+    sys.stdout.flush()
+    shutil.copyfile(orig_source, target)
+    return 0
   else:
-    return subprocess.call(['ln', '-s', source, target])
+    print 'Creating link from %s to %s' % (source, target)
+    sys.stdout.flush()
+
+    if utils.GuessOS() == 'win32':
+      return subprocess.call(['mklink', '/j', target, source], shell=True)
+    else:
+      return subprocess.call(['ln', '-s', source, target])
 
 def create_timestamp_file(options):
   if options.timestamp_file != '':
@@ -67,12 +73,13 @@
     # it. This is necessary, otherwise we can end up having links in there
     # pointing to directories which no longer exist (on incremental builds).
     for link in os.listdir(target):
-      if utils.GuessOS() == 'win32':
-        # It seems like python on windows is treating pseudo symlinks to
+      full_link = os.path.join(target, link)
+      if os.path.isdir(full_link) and utils.IsWindows():
+        # It seems like python on Windows is treating pseudo symlinks to
         # directories as directories.
-        os.rmdir(os.path.join(target, link))
+        os.rmdir(full_link)
       else:
-        os.remove(os.path.join(target, link))
+        os.remove(full_link)
   else:
     os.makedirs(target)
   for source in args[1:]:
@@ -82,11 +89,12 @@
       name = source
     # Remove any addtional path components preceding NAME.
     (path, name) = os.path.split(name)
+    orig_source = source
     if utils.GuessOS() == 'win32':
       source = os.path.relpath(source)
     else:
       source = os.path.relpath(source, start=target)
-    exit_code = make_link(source, os.path.join(target, name))
+    exit_code = make_link(source, os.path.join(target, name), orig_source)
     if exit_code != 0:
       return exit_code
   create_timestamp_file(options)
diff --git a/tools/task_kill.py b/tools/task_kill.py
index b13dba5..9b905ee 100755
--- a/tools/task_kill.py
+++ b/tools/task_kill.py
@@ -38,6 +38,7 @@
     'content_shell': 'content_shell',
     'dart': 'dart',
     'editor': 'DartEditor',
+    'java': 'java',
     'eggplant': 'Eggplant',
     'firefox': 'firefox.exe',
     'git': 'git',
@@ -196,6 +197,8 @@
 def KillEditor():
   status = Kill("editor")
   if os_name == "linux":
+    # it is important to kill java after editor on linux
+    status += Kill("java")
     status += Kill("eggplant")
   return status
 
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 718588d..abaf1fe 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -1016,6 +1016,7 @@
           status.browser.testBrowserOutput,
           didTimeout: true);
       status.currentTest.doneCallback(browserTestOutput);
+      status.lastTest = status.currentTest;
       status.currentTest = null;
 
       // We don't want to start a new browser if we are terminating.
@@ -1088,9 +1089,10 @@
       status.currentTest.lastKnownMessage = '';
     } else {
       // TODO(ricow): Handle this better.
-      print("This is bad, should never happen, getNextTest all full");
+      print("Browser requested next test before reporting previous result");
       print("This happened for browser $browserId");
       print("Old test was: ${status.currentTest.url}");
+      print("The test before that was: ${status.lastTest.url}");
       print("Timed out tests:");
       for (var v in timedOut) {
         print("  $v");
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index b880a72..b41edfa 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -107,7 +107,7 @@
               'arch',
               'The architecture to run tests for',
               ['-a', '--arch'],
-              ['all', 'ia32', 'x64', 'arm', 'mips',
+              ['all', 'ia32', 'x64', 'arm', 'arm64', 'mips',
                'simarm', 'simarm64', 'simmips'],
               'ia32'),
           new _TestOptionSpecification(
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index a0a3f73..25fbe3d 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -2117,10 +2117,33 @@
 
   static String getShortName(String path) {
     final PATH_REPLACEMENTS = const {
-      "tests_co19_src_WebPlatformTest_shadow-dom_shadow-trees_":
-          "co19_shadow-trees_",
-      "tests_co19_src_WebPlatformTest_shadow-dom_elements-and-dom-objects_":
-          "co19_shadowdom_",
+      "pkg_polymer_e2e_test_bad_import_test": "polymer_bi",
+      "pkg_polymer_e2e_test_canonicalization_test": "polymer_c16n",
+      "pkg_polymer_e2e_test_experimental_boot_test": "polymer_boot",
+      "pkg_polymer_e2e_test_good_import_test": "polymer_gi",
+      "tests_co19_src_Language_12_Expressions_14_Function_Invocation_":
+          "co19_fn_invoke_",
+      "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_"
+          "caretRangeFromPoint-": "co19_caretrangefrompoint_",
+      "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_"
+          "hittest-relative-to-viewport_": "co19_caretrange_hittest_",
+      "tests_co19_src_LayoutTests_fast_dom_HTMLLinkElement_link-onerror-"
+          "stylesheet-with-": "co19_dom_link-",
+      "tests_co19_src_LayoutTests_fast_dom_": "co19_dom",
+      "tests_co19_src_LibTest_core_AbstractClassInstantiationError_"
+          "AbstractClassInstantiationError_": "co19_abstract_class_",
+      "tests_co19_src_LibTest_core_IntegerDivisionByZeroException_"
+          "IntegerDivisionByZeroException_": "co19_division_by_zero",
+      "tests_co19_src_WebPlatformTest_html_dom_documents_dom-tree-accessors_":
+          "co19_dom_accessors_",
+      "tests_co19_src_WebPlatformTest_html_semantics_embedded-content_"
+          "media-elements_": "co19_media_elements",
+      "tests_co19_src_WebPlatformTest_html_semantics_": "co19_semantics_",
+
+      "tests_co19_src_WebPlatformTest_html-templates_additions-to-"
+          "the-steps-to-clone-a-node_": "co19_htmltemplates_clone_",
+      "tests_co19_src_WebPlatformTest_html-templates_definitions_"
+          "template-contents-owner": "co19_htmltemplates_contents",
       "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
           "templates_additions-to-": "co19_htmltemplates_add_",
       "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
@@ -2131,14 +2154,17 @@
       "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
           "templates_creating-an-element-for-the-token_":
           "co19_htmltemplates_create_",
-      "tests_co19_src_WebPlatformTest_html-templates_additions-to-"
-          "the-steps-to-clone-a-node_": "co19_htmltemplates_clone_",
-      "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_"
-      "caretRangeFromPoint-": "co19_caretrangefrompoint_",
-      "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",
+      "tests_co19_src_WebPlatformTest_html-templates_template-element"
+          "_template-": "co19_htmltemplates_element-",
+      "tests_co19_src_WebPlatformTest_html-templates_": "co19_htmltemplate_",
+
+      "tests_co19_src_WebPlatformTest_shadow-dom_shadow-trees_":
+          "co19_shadow-trees_",
+      "tests_co19_src_WebPlatformTest_shadow-dom_elements-and-dom-objects_":
+          "co19_shadowdom_",
+      "tests_co19_src_WebPlatformTest_shadow-dom_html-elements-in-"
+          "shadow-trees_": "co19_shadow_html_",
+      "tests_co19_src_WebPlatformTest_DOMEvents_approved_": "co19_dom_approved_"
     };
 
     // Some tests are already in [build_dir]/generated_tests.
diff --git a/tools/utils.py b/tools/utils.py
index 43947b5..f8fe68c 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -50,6 +50,8 @@
   id = platform.machine()
   if id.startswith('arm'):
     return 'arm'
+  elif id.startswith('aarch64'):
+    return 'arm64'
   elif id.startswith('mips'):
     return 'mips'
   elif (not id) or (not re.match('(x|i[3-6])86', id) is None):
@@ -364,7 +366,18 @@
   if revision:
     return revision
 
-  # maybe the builder is using git-svn, try that
+  # Check for revision using git (Note: we can't use git-svn because in a
+  # pure-git checkout, "git-svn anyCommand" just hangs!). We look an arbitrary
+  # number of commits backwards (100) to get past any local commits.
+  p = subprocess.Popen(['git', 'log', '-100'], stdout = subprocess.PIPE,
+      stderr = subprocess.STDOUT, shell=IsWindows(), cwd = DART_DIR)
+  output, _ = p.communicate()
+  revision = ParseGitInfoOutput(output)
+  if revision:
+    return revision
+
+  # In the rare off-chance that git log -100 doesn't have a svn repo number,
+  # attempt to use "git svn info."
   p = subprocess.Popen(['git', 'svn', 'info'], stdout = subprocess.PIPE,
       stderr = subprocess.STDOUT, shell=IsWindows(), cwd = DART_DIR)
   output, _ = p.communicate()
@@ -379,6 +392,14 @@
 
   return None
 
+def ParseGitInfoOutput(output):
+  """Given a git log, determine the latest corresponding svn revision."""
+  for line in output.split('\n'):
+    tokens = line.split()
+    if len(tokens) > 0 and tokens[0] == 'git-svn-id:':
+      return tokens[1].split('@')[1]
+  return None
+
 def ParseSvnInfoOutput(output):
   revision_match = re.search('Last Changed Rev: (\d+)', output)
   if revision_match:
@@ -528,6 +549,8 @@
     system = GuessOS()
     if arch == 'arm':
       return os.path.join(dart_binary_prefix, system, 'dart-arm')
+    elif arch == 'arm64':
+      return os.path.join(dart_binary_prefix, system, 'dart-arm64')
     elif arch == 'mips':
       return os.path.join(dart_binary_prefix, system, 'dart-mips')
     else:
diff --git a/utils/apidoc/docgen.gyp b/utils/apidoc/docgen.gyp
index 69bb64a..ee33b15 100644
--- a/utils/apidoc/docgen.gyp
+++ b/utils/apidoc/docgen.gyp
@@ -82,8 +82,11 @@
             '--no-include-dependent-packages',
             '--package-root=<(PRODUCT_DIR)/packages',
             '--exclude-lib=async_helper',
-            '--exclude-lib=expect',
+            '--exclude-lib=compiler',
+            '--exclude-lib=dart2js_incremental',
             '--exclude-lib=docgen',
+            '--exclude-lib=expect',
+            '--exclude-lib=try',
             '../../pkg'
           ],
           'message': 'Running docgen: <(_action)',